From aacdde41ef02392949aee16b2e428a8913d27efe Mon Sep 17 00:00:00 2001 From: Hans Hagen Date: Tue, 7 Aug 2007 01:37:00 +0200 Subject: stable 2007.08.07 01:37 --- context/data/context.properties | 59 +- metapost/context/base/mp-base.mp | 5 +- scripts/context/lua/luatools.cmd | 5 + scripts/context/lua/luatools.lua | 5155 ++++++++++ scripts/context/lua/mtx-cache.lua | 92 + scripts/context/lua/mtx-fonts.lua | 90 + scripts/context/lua/mtxrun.cmd | 5 + scripts/context/lua/mtxrun.lua | 4625 +++++++++ scripts/context/lua/x-ldx.lua | 310 + scripts/context/ruby/base/merge.rb | 2 +- scripts/context/ruby/ctxtools.rb | 17 +- scripts/context/ruby/mtxtools.rb | 475 + scripts/context/ruby/texmfstart.rb | 502 +- tex/context/base/attr-ini.lua | 669 ++ tex/context/base/attr-ini.tex | 199 + tex/context/base/char-cmp.lua | 260 + tex/context/base/char-def.lua | 17736 +++++++++++++++++++++++++++++++++++ tex/context/base/char-def.tex | 47 + tex/context/base/char-ini.lua | 280 + tex/context/base/char-ini.tex | 20 + tex/context/base/char-utf.lua | 298 + tex/context/base/char-utf.tex | 54 + tex/context/base/colo-ini.tex | 20 +- tex/context/base/colo-run.tex | 29 +- tex/context/base/cont-mtx.tex | 25 + tex/context/base/cont-new.mkiv | 93 + tex/context/base/context-debug.lmx | 108 + tex/context/base/context-error.lmx | 55 + tex/context/base/context.css | 226 + tex/context/base/context.tex | 11 +- tex/context/base/core-buf.lua | 377 + tex/context/base/core-buf.mkiv | 107 + tex/context/base/core-con.lua | 164 + tex/context/base/core-con.mkiv | 90 + tex/context/base/core-des.tex | 19 +- tex/context/base/core-itm.tex | 38 +- tex/context/base/core-lst.tex | 2 + tex/context/base/core-ntb.tex | 8 +- tex/context/base/core-obj.lua | 36 + tex/context/base/core-obj.mkiv | 55 + tex/context/base/core-pos.lua | 95 + tex/context/base/core-pos.mkiv | 65 + tex/context/base/core-reg.lua | 237 + tex/context/base/core-reg.mkiv | 57 + tex/context/base/core-sec.tex | 3 + tex/context/base/core-spa.lua | 526 ++ tex/context/base/core-spa.mkiv | 126 + tex/context/base/core-syn.lua | 116 + tex/context/base/core-syn.mkiv | 51 + tex/context/base/core-sys.mkiv | 23 + tex/context/base/core-two.lua | 83 + tex/context/base/core-two.mkiv | 74 + tex/context/base/core-uti.lua | 29 + tex/context/base/core-uti.mkiv | 103 + tex/context/base/core-ver.mkiv | 207 + tex/context/base/core-ver.tex | 4 +- tex/context/base/enco-def.tex | 16 + tex/context/base/enco-ini.mkiv | 69 + tex/context/base/enco-pfr.mkiv | 20 + tex/context/base/font-afm.lua | 574 ++ tex/context/base/font-def.lua | 477 + tex/context/base/font-enc.lua | 98 + tex/context/base/font-fbk.lua | 219 + tex/context/base/font-ini.lua | 57 + tex/context/base/font-ini.mkii | 57 - tex/context/base/font-ini.mkiv | 72 + tex/context/base/font-ini.tex | 818 +- tex/context/base/font-map.lua | 172 + tex/context/base/font-otf.lua | 3416 +++++++ tex/context/base/font-syn.lua | 285 + tex/context/base/font-tfm.lua | 479 + tex/context/base/font-vf.lua | 213 + tex/context/base/l-aux.lua | 39 + tex/context/base/l-boolean.lua | 41 + tex/context/base/l-dir.lua | 94 + tex/context/base/l-file.lua | 101 + tex/context/base/l-io.lua | 173 + tex/context/base/l-math.lua | 25 + tex/context/base/l-md5.lua | 18 + tex/context/base/l-number.lua | 10 + tex/context/base/l-os.lua | 27 + tex/context/base/l-string.lua | 307 + tex/context/base/l-table.lua | 492 + tex/context/base/l-tex.lua | 110 + tex/context/base/l-unicode.lua | 148 + tex/context/base/l-utils.lua | 121 + tex/context/base/lang-ini.lua | 327 + tex/context/base/lang-ini.mkiv | 23 + tex/context/base/lang-ini.tex | 4 +- tex/context/base/lang-sla.mkiv | 17 + tex/context/base/luat-cbk.lua | 150 + tex/context/base/luat-crl.lua | 53 + tex/context/base/luat-deb.lua | 154 + tex/context/base/luat-deb.tex | 49 + tex/context/base/luat-env.lua | 172 + tex/context/base/luat-env.tex | 169 + tex/context/base/luat-exe.lua | 68 + tex/context/base/luat-ini.lua | 11 + tex/context/base/luat-ini.tex | 104 + tex/context/base/luat-inp.lua | 1865 ++++ tex/context/base/luat-iop.lua | 157 + tex/context/base/luat-kps.lua | 102 + tex/context/base/luat-lib.lua | 144 + tex/context/base/luat-lib.tex | 86 + tex/context/base/luat-lmx.lua | 139 + tex/context/base/luat-lmx.tex | 16 + tex/context/base/luat-log.lua | 123 + tex/context/base/luat-tex.lua | 389 + tex/context/base/luat-tmp.lua | 457 + tex/context/base/luat-tra.lua | 82 + tex/context/base/luat-uni.lua | 23 + tex/context/base/luat-uni.tex | 33 + tex/context/base/luat-zip.lua | 221 + tex/context/base/meta-pdf.lua | 585 ++ tex/context/base/meta-pdf.mkiv | 155 + tex/context/base/mult-sys.tex | 1 + tex/context/base/node-ini.lua | 905 ++ tex/context/base/node-ini.tex | 46 + tex/context/base/page-imp.tex | 4 +- tex/context/base/regi-8859-1.lua | 26 + tex/context/base/regi-8859-10.lua | 26 + tex/context/base/regi-8859-11.lua | 26 + tex/context/base/regi-8859-13.lua | 26 + tex/context/base/regi-8859-14.lua | 26 + tex/context/base/regi-8859-15.lua | 26 + tex/context/base/regi-8859-16.lua | 26 + tex/context/base/regi-8859-2.lua | 26 + tex/context/base/regi-8859-3.lua | 26 + tex/context/base/regi-8859-4.lua | 26 + tex/context/base/regi-8859-5.lua | 26 + tex/context/base/regi-8859-6.lua | 26 + tex/context/base/regi-8859-7.lua | 26 + tex/context/base/regi-8859-8.lua | 26 + tex/context/base/regi-8859-9.lua | 26 + tex/context/base/regi-cp1250.lua | 26 + tex/context/base/regi-cp1251.lua | 26 + tex/context/base/regi-cp1252.lua | 26 + tex/context/base/regi-cp1253.lua | 26 + tex/context/base/regi-cp1254.lua | 26 + tex/context/base/regi-cp1255.lua | 26 + tex/context/base/regi-cp1256.lua | 26 + tex/context/base/regi-cp1257.lua | 26 + tex/context/base/regi-cp1258.lua | 26 + tex/context/base/regi-ini.lua | 107 + tex/context/base/regi-ini.mkiv | 39 + tex/context/base/regi-utf.tex | 4 +- tex/context/base/s-abr-01.tex | 140 +- tex/context/base/s-mag-01.tex | 7 + tex/context/base/sort-def.mkiv | 16 + tex/context/base/sort-ini.lua | 176 + tex/context/base/sort-ini.mkiv | 21 + tex/context/base/sort-lan.lua | 193 + tex/context/base/sort-lan.mkiv | 16 + tex/context/base/spec-def.mkiv | 19 + tex/context/base/spec-fdf.mkiv | 19 + tex/context/base/spec-fdf.tex | 4 +- tex/context/base/spec-pdf.lua | 28 + tex/context/base/supp-fil.lua | 78 + tex/context/base/supp-fil.mkiv | 32 + tex/context/base/syst-cat.mkiv | 116 + tex/context/base/syst-con.lua | 30 + tex/context/base/syst-con.mkiv | 27 + tex/context/base/syst-new.tex | 15 + tex/context/base/syst-prm.tex | 44 +- tex/context/base/syst-rtp.mkiv | 18 + tex/context/base/syst-str.mkiv | 27 + tex/context/base/toks-ini.lua | 232 + tex/context/base/toks-ini.tex | 25 + tex/context/base/type-buy.tex | 1082 +-- tex/context/base/type-cbg.tex | 145 +- tex/context/base/type-def.tex | 122 +- tex/context/base/type-exa.tex | 241 +- tex/context/base/type-fsf.tex | 130 +- tex/context/base/type-ghz.tex | 50 +- tex/context/base/type-gyr.tex | 189 +- tex/context/base/type-ini.tex | 51 +- tex/context/base/type-map.tex | 146 +- tex/context/base/type-msw.tex | 50 +- tex/context/base/type-one.tex | 1154 +++ tex/context/base/type-otf.tex | 720 ++ tex/context/base/type-siz.tex | 21 +- tex/context/base/type-syn.tex | 38 - tex/context/base/type-tmf.tex | 1073 +++ tex/context/base/type-xtx.tex | 2 +- tex/context/base/verb-lua.lua | 212 + tex/context/base/verb-mp.lua | 234 + tex/context/base/verb-tex.lua | 122 + tex/context/base/x-ldx.ctx | 23 + tex/context/base/x-ldx.tex | 133 + tex/context/interface/keys-cz.xml | 2 +- tex/context/interface/keys-de.xml | 2 +- tex/context/interface/keys-en.xml | 2 +- tex/context/interface/keys-fr.xml | 2 +- tex/context/interface/keys-it.xml | 2 +- tex/context/interface/keys-nl.xml | 2 +- tex/context/interface/keys-ro.xml | 2 +- 196 files changed, 55421 insertions(+), 2337 deletions(-) create mode 100644 scripts/context/lua/luatools.cmd create mode 100644 scripts/context/lua/luatools.lua create mode 100644 scripts/context/lua/mtx-cache.lua create mode 100644 scripts/context/lua/mtx-fonts.lua create mode 100644 scripts/context/lua/mtxrun.cmd create mode 100644 scripts/context/lua/mtxrun.lua create mode 100644 scripts/context/lua/x-ldx.lua create mode 100644 scripts/context/ruby/mtxtools.rb create mode 100644 tex/context/base/attr-ini.lua create mode 100644 tex/context/base/attr-ini.tex create mode 100644 tex/context/base/char-cmp.lua create mode 100644 tex/context/base/char-def.lua create mode 100644 tex/context/base/char-def.tex create mode 100644 tex/context/base/char-ini.lua create mode 100644 tex/context/base/char-ini.tex create mode 100644 tex/context/base/char-utf.lua create mode 100644 tex/context/base/char-utf.tex create mode 100644 tex/context/base/cont-mtx.tex create mode 100644 tex/context/base/cont-new.mkiv create mode 100644 tex/context/base/context-debug.lmx create mode 100644 tex/context/base/context-error.lmx create mode 100644 tex/context/base/context.css create mode 100644 tex/context/base/core-buf.lua create mode 100644 tex/context/base/core-buf.mkiv create mode 100644 tex/context/base/core-con.lua create mode 100644 tex/context/base/core-con.mkiv create mode 100644 tex/context/base/core-obj.lua create mode 100644 tex/context/base/core-obj.mkiv create mode 100644 tex/context/base/core-pos.lua create mode 100644 tex/context/base/core-pos.mkiv create mode 100644 tex/context/base/core-reg.lua create mode 100644 tex/context/base/core-reg.mkiv create mode 100644 tex/context/base/core-spa.lua create mode 100644 tex/context/base/core-spa.mkiv create mode 100644 tex/context/base/core-syn.lua create mode 100644 tex/context/base/core-syn.mkiv create mode 100644 tex/context/base/core-sys.mkiv create mode 100644 tex/context/base/core-two.lua create mode 100644 tex/context/base/core-two.mkiv create mode 100644 tex/context/base/core-uti.lua create mode 100644 tex/context/base/core-uti.mkiv create mode 100644 tex/context/base/core-ver.mkiv create mode 100644 tex/context/base/enco-ini.mkiv create mode 100644 tex/context/base/enco-pfr.mkiv create mode 100644 tex/context/base/font-afm.lua create mode 100644 tex/context/base/font-def.lua create mode 100644 tex/context/base/font-enc.lua create mode 100644 tex/context/base/font-fbk.lua create mode 100644 tex/context/base/font-ini.lua create mode 100644 tex/context/base/font-ini.mkiv create mode 100644 tex/context/base/font-map.lua create mode 100644 tex/context/base/font-otf.lua create mode 100644 tex/context/base/font-syn.lua create mode 100644 tex/context/base/font-tfm.lua create mode 100644 tex/context/base/font-vf.lua create mode 100644 tex/context/base/l-aux.lua create mode 100644 tex/context/base/l-boolean.lua create mode 100644 tex/context/base/l-dir.lua create mode 100644 tex/context/base/l-file.lua create mode 100644 tex/context/base/l-io.lua create mode 100644 tex/context/base/l-math.lua create mode 100644 tex/context/base/l-md5.lua create mode 100644 tex/context/base/l-number.lua create mode 100644 tex/context/base/l-os.lua create mode 100644 tex/context/base/l-string.lua create mode 100644 tex/context/base/l-table.lua create mode 100644 tex/context/base/l-tex.lua create mode 100644 tex/context/base/l-unicode.lua create mode 100644 tex/context/base/l-utils.lua create mode 100644 tex/context/base/lang-ini.lua create mode 100644 tex/context/base/lang-ini.mkiv create mode 100644 tex/context/base/lang-sla.mkiv create mode 100644 tex/context/base/luat-cbk.lua create mode 100644 tex/context/base/luat-crl.lua create mode 100644 tex/context/base/luat-deb.lua create mode 100644 tex/context/base/luat-deb.tex create mode 100644 tex/context/base/luat-env.lua create mode 100644 tex/context/base/luat-env.tex create mode 100644 tex/context/base/luat-exe.lua create mode 100644 tex/context/base/luat-ini.lua create mode 100644 tex/context/base/luat-ini.tex create mode 100644 tex/context/base/luat-inp.lua create mode 100644 tex/context/base/luat-iop.lua create mode 100644 tex/context/base/luat-kps.lua create mode 100644 tex/context/base/luat-lib.lua create mode 100644 tex/context/base/luat-lib.tex create mode 100644 tex/context/base/luat-lmx.lua create mode 100644 tex/context/base/luat-lmx.tex create mode 100644 tex/context/base/luat-log.lua create mode 100644 tex/context/base/luat-tex.lua create mode 100644 tex/context/base/luat-tmp.lua create mode 100644 tex/context/base/luat-tra.lua create mode 100644 tex/context/base/luat-uni.lua create mode 100644 tex/context/base/luat-uni.tex create mode 100644 tex/context/base/luat-zip.lua create mode 100644 tex/context/base/meta-pdf.lua create mode 100644 tex/context/base/meta-pdf.mkiv create mode 100644 tex/context/base/node-ini.lua create mode 100644 tex/context/base/node-ini.tex create mode 100644 tex/context/base/regi-8859-1.lua create mode 100644 tex/context/base/regi-8859-10.lua create mode 100644 tex/context/base/regi-8859-11.lua create mode 100644 tex/context/base/regi-8859-13.lua create mode 100644 tex/context/base/regi-8859-14.lua create mode 100644 tex/context/base/regi-8859-15.lua create mode 100644 tex/context/base/regi-8859-16.lua create mode 100644 tex/context/base/regi-8859-2.lua create mode 100644 tex/context/base/regi-8859-3.lua create mode 100644 tex/context/base/regi-8859-4.lua create mode 100644 tex/context/base/regi-8859-5.lua create mode 100644 tex/context/base/regi-8859-6.lua create mode 100644 tex/context/base/regi-8859-7.lua create mode 100644 tex/context/base/regi-8859-8.lua create mode 100644 tex/context/base/regi-8859-9.lua create mode 100644 tex/context/base/regi-cp1250.lua create mode 100644 tex/context/base/regi-cp1251.lua create mode 100644 tex/context/base/regi-cp1252.lua create mode 100644 tex/context/base/regi-cp1253.lua create mode 100644 tex/context/base/regi-cp1254.lua create mode 100644 tex/context/base/regi-cp1255.lua create mode 100644 tex/context/base/regi-cp1256.lua create mode 100644 tex/context/base/regi-cp1257.lua create mode 100644 tex/context/base/regi-cp1258.lua create mode 100644 tex/context/base/regi-ini.lua create mode 100644 tex/context/base/regi-ini.mkiv create mode 100644 tex/context/base/sort-def.mkiv create mode 100644 tex/context/base/sort-ini.lua create mode 100644 tex/context/base/sort-ini.mkiv create mode 100644 tex/context/base/sort-lan.lua create mode 100644 tex/context/base/sort-lan.mkiv create mode 100644 tex/context/base/spec-def.mkiv create mode 100644 tex/context/base/spec-fdf.mkiv create mode 100644 tex/context/base/spec-pdf.lua create mode 100644 tex/context/base/supp-fil.lua create mode 100644 tex/context/base/supp-fil.mkiv create mode 100644 tex/context/base/syst-cat.mkiv create mode 100644 tex/context/base/syst-con.lua create mode 100644 tex/context/base/syst-con.mkiv create mode 100644 tex/context/base/syst-rtp.mkiv create mode 100644 tex/context/base/syst-str.mkiv create mode 100644 tex/context/base/toks-ini.lua create mode 100644 tex/context/base/toks-ini.tex create mode 100644 tex/context/base/type-one.tex create mode 100644 tex/context/base/type-otf.tex create mode 100644 tex/context/base/type-tmf.tex create mode 100644 tex/context/base/verb-lua.lua create mode 100644 tex/context/base/verb-mp.lua create mode 100644 tex/context/base/verb-tex.lua create mode 100644 tex/context/base/x-ldx.ctx create mode 100644 tex/context/base/x-ldx.tex diff --git a/context/data/context.properties b/context/data/context.properties index 7668e1320..1f46de94a 100644 --- a/context/data/context.properties +++ b/context/data/context.properties @@ -306,40 +306,51 @@ command.10.subsystem.$(file.patterns.example)=1 # 11: make -command.name.11.$(file.patterns.context)=Generate Formats +command.name.11.$(file.patterns.context)=Generate Formats (pdfTeX) command.name.11.$(file.patterns.metafun)=Generate Formats command.name.11.$(file.patterns.example)=Generate Formats -command.11.$(file.patterns.context)=$(name.context.texexec) --make --all +command.11.$(file.patterns.context)=$(name.context.texexec) --make --all --pdftex command.11.$(file.patterns.metafun)=$(name.context.texexec) --make --all command.11.$(file.patterns.example)=$(name.context.texexec) --make --all command.11.subsystem.$(file.patterns.context)=1 command.11.subsystem.$(file.patterns.metafun)=1 command.11.subsystem.$(file.patterns.example)=1 -# 12: update +# 12: make -command.name.12=Update ConTeXt -command.name.12.$(file.patterns.context)=Update ConTeXt -command.name.12.$(file.patterns.metafun)=Update ConTeXt -command.name.12.$(file.patterns.example)=Update ConTeXt +command.name.12.$(file.patterns.context)=Generate Formats (luaTeX) +command.12.$(file.patterns.context)=$(name.context.texexec) --make --all --luatex +command.12.subsystem.$(file.patterns.context)=1 -command.12=$(name.context.update) -command.12.$(file.patterns.context)=$(name.context.update) -command.12.$(file.patterns.metafun)=$(name.context.update) -command.12.$(file.patterns.example)=$(name.context.update) +# 13: make +command.name.13.$(file.patterns.context)=Generate Formats (XeTeX) +command.13.$(file.patterns.context)=$(name.context.texexec) --make --all --xetex +command.13.subsystem.$(file.patterns.context)=1 -# 12: example +# 14: update -command.name.13=Example Service -command.name.13.$(file.patterns.context)=Example Service -command.name.13.$(file.patterns.metafun)=Example Service -command.name.13.$(file.patterns.example)=Example Service +command.name.14=Update ConTeXt +command.name.14.$(file.patterns.context)=Update ConTeXt +command.name.14.$(file.patterns.metafun)=Update ConTeXt +command.name.14.$(file.patterns.example)=Update ConTeXt -command.13=$(name.context.wwwserver) -command.13.$(file.patterns.context)=$(name.context.wwwserver) -command.13.$(file.patterns.metafun)=$(name.context.wwwserver) -command.13.$(file.patterns.example)=$(name.context.wwwserver) +command.14=$(name.context.update) +command.14.$(file.patterns.context)=$(name.context.update) +command.14.$(file.patterns.metafun)=$(name.context.update) +command.14.$(file.patterns.example)=$(name.context.update) + +# 15: example + +command.name.15=Example Service +command.name.15.$(file.patterns.context)=Example Service +command.name.15.$(file.patterns.metafun)=Example Service +command.name.15.$(file.patterns.example)=Example Service + +command.15=$(name.context.wwwserver) +command.15.$(file.patterns.context)=$(name.context.wwwserver) +command.15.$(file.patterns.metafun)=$(name.context.wwwserver) +command.15.$(file.patterns.example)=$(name.context.wwwserver) # Editor: syntax highlighting @@ -359,12 +370,8 @@ Alt+F12|IDM_STOPEXECUTE|\ # install: fonts/truetype/hoekwater/lm/LMTypewriter10-Regular.ttf if PLAT_WIN - font.monospace=font:LMTypewriter10,size:16 - font.errorfont=font:LMTypewriter10,size:12 - -if PLAT_WIN - font.monospace=font:lmtypewriter10 regular,size:16 - font.errorfont=font:lmtypewriter10 regular,size:12 + font.monospace=font:LMTypewriter10-Regular,size:16 + font.errorfont=font:LMTypewriter10-Regular,size:12 if PLAT_GTK font.monospace=font:!lmtypewriter10 regular,size:16 diff --git a/metapost/context/base/mp-base.mp b/metapost/context/base/mp-base.mp index 87f3fd2f7..41eb7aa96 100644 --- a/metapost/context/base/mp-base.mp +++ b/metapost/context/base/mp-base.mp @@ -477,10 +477,11 @@ enddef; def label = draw thelabel enddef; newinternal dotlabeldiam; dotlabeldiam:=3bp; -vardef dotlabel@#(expr s,z) = +vardef dotlabel@#(expr s,z) text t_ = + label@#(s,z) t_; label@#(s,z); interim linecap:=rounded; - draw z withpen pencircle scaled dotlabeldiam; + draw z withpen pencircle scaled dotlabeldiam t_; enddef; def makelabel = dotlabel enddef; diff --git a/scripts/context/lua/luatools.cmd b/scripts/context/lua/luatools.cmd new file mode 100644 index 000000000..4bc998d65 --- /dev/null +++ b/scripts/context/lua/luatools.cmd @@ -0,0 +1,5 @@ +@echo off +setlocal +set ownpath=%~dp0% +texlua "%ownpath%luatools.lua" %* +endlocal diff --git a/scripts/context/lua/luatools.lua b/scripts/context/lua/luatools.lua new file mode 100644 index 000000000..0eb63c873 --- /dev/null +++ b/scripts/context/lua/luatools.lua @@ -0,0 +1,5155 @@ +#!/usr/bin/env texlua + +-- one can make a stub: +-- +-- #!/bin/sh +-- env LUATEXDIR=/....../texmf/scripts/context/lua luatex --luaonly=luatools.lua "$@" +-- filename : luatools.lua +-- comment : companion to context.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files +-- Although this script is part of the ConTeXt distribution it is +-- relatively indepent of ConTeXt. The same is true for some of +-- the luat files. We may may make them even less dependent in +-- the future. As long as Luatex is under development the +-- interfaces and names of functions may change. + +banner = "version 1.1.1 - 2006+ - PRAGMA ADE / CONTEXT" +texlua = true + +-- For the sake of independence we optionally can merge the library +-- code here. It's too much code, but that does not harm. Much of the +-- library code is used elsewhere. We don't want dependencies on +-- Lua library paths simply because these scripts are located in the +-- texmf tree and not in some Lua path. Normally this merge is not +-- needed when texmfstart is used, or when the proper stub is used or +-- when (windows) suffix binding is active. + +-- begin library merge + +-- filename : l-string.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-string'] = 1.001 + +--~ function string.split(str, pat) -- taken from the lua wiki +--~ local t = {n = 0} -- so this table has a length field, traverse with ipairs then! +--~ local fpat = "(.-)"..pat +--~ local last_end = 1 +--~ local s, e, cap = string.find(str, fpat, 1) +--~ while s ~= nil do +--~ if s~=1 or cap~="" then +--~ table.insert(t,cap) +--~ end +--~ last_end = e+1 +--~ s, e, cap = string.find(str, fpat, last_end) +--~ end +--~ if last_end<=string.len(str) then +--~ table.insert(t,(string.sub(str,last_end))) +--~ end +--~ return t +--~ end + +--~ function string:split(pat) -- taken from the lua wiki but adapted +--~ local t = { } -- self and colon usage (faster) +--~ local fpat = "(.-)"..pat +--~ local last_end = 1 +--~ local s, e, cap = self:find(fpat, 1) +--~ while s ~= nil do +--~ if s~=1 or cap~="" then +--~ t[#t+1] = cap +--~ end +--~ last_end = e+1 +--~ s, e, cap = self:find(fpat, last_end) +--~ end +--~ if last_end <= #self then +--~ t[#t+1] = self:sub(last_end) +--~ end +--~ return t +--~ end + +--~ a piece of brilliant code by Rici Lake (posted on lua list) -- only names changed +--~ +--~ function string:splitter(pat) +--~ local st, g = 1, self:gmatch("()"..pat.."()") +--~ local function splitter(self) +--~ if st then +--~ local s, f = g() +--~ local rv = self:sub(st, (s or 0)-1) +--~ st = f +--~ return rv +--~ end +--~ end +--~ return splitter, self +--~ end + +function string:splitter(pat) + -- by Rici Lake (posted on lua list) -- only names changed + -- p 79 ref man: () returns position of match + local st, g = 1, self:gmatch("()("..pat..")") + local function strgetter(self, segs, seps, sep, cap1, ...) + st = sep and seps + #sep + return self:sub(segs, (seps or 0) - 1), cap1 or sep, ... + end + local function strsplitter(self) + if st then return strgetter(self, st, g()) end + end + return strsplitter, self +end + +function string:split(separator) + local t = {} + for k in self:splitter(separator) do t[#t+1] = k end + return t +end + +-- faster than a string:split: + +function string:splitchr(chr) + if #self > 0 then + local t = { } + for s in string.gmatch(self..chr,"(.-)"..chr) do + t[#t+1] = s + end + return t + else + return { } + end +end + +--~ function string.piecewise(str, pat, fnc) -- variant of split +--~ local fpat = "(.-)"..pat +--~ local last_end = 1 +--~ local s, e, cap = string.find(str, fpat, 1) +--~ while s ~= nil do +--~ if s~=1 or cap~="" then +--~ fnc(cap) +--~ end +--~ last_end = e+1 +--~ s, e, cap = string.find(str, fpat, last_end) +--~ end +--~ if last_end <= #str then +--~ fnc((string.sub(str,last_end))) +--~ end +--~ end + +function string.piecewise(str, pat, fnc) -- variant of split + for k in string.splitter(str,pat) do fnc(k) end +end + +--~ do if lpeg then + +--~ -- this alternative is 30% faster esp when we cache them +--~ -- problem: no expressions + +--~ splitters = { } + +--~ function string:split(separator) +--~ if #self > 0 then +--~ local split = splitters[separator] +--~ if not split then +--~ -- based on code by Roberto +--~ local p = lpeg.P(separator) +--~ local c = lpeg.C((1-p)^0) +--~ split = lpeg.Ct(c*(p*c)^0) +--~ splitters[separator] = split +--~ end +--~ return lpeg.match(split,self) +--~ else +--~ return { } +--~ end +--~ end + +--~ string.splitchr = string.split + +--~ function string:piecewise(separator,fnc) +--~ for _,v in pairs(self:split(separator)) do +--~ fnc(v) +--~ end +--~ end + +--~ end end + +string.chr_to_esc = { + ["%"] = "%%", + ["."] = "%.", + ["+"] = "%+", ["-"] = "%-", ["*"] = "%*", + ["^"] = "%^", ["$"] = "%$", + ["["] = "%[", ["]"] = "%]", + ["("] = "%(", [")"] = "%)", + ["{"] = "%{", ["}"] = "%}" +} + +function string:esc() -- variant 2 + return (self:gsub("(.)",string.chr_to_esc)) +end + +function string.unquote(str) + return (str:gsub("^([\"\'])(.*)%1$","%2")) +end + +function string.quote(str) + return '"' .. str:unquote() .. '"' +end + +function string:count(pattern) -- variant 3 + local n = 0 + for _ in self:gmatch(pattern) do + n = n + 1 + end + return n +end + +function string:limit(n,sentinel) + if #self > n then + sentinel = sentinel or " ..." + return self:sub(1,(n-#sentinel)) .. sentinel + else + return self + end +end + +function string:strip() + return (self:gsub("^%s*(.-)%s*$", "%1")) +end + +--~ function string.strip(str) -- slightly different +--~ return (string.gsub(string.gsub(str,"^%s*(.-)%s*$","%1"),"%s+"," ")) +--~ end + +function string:is_empty() + return not self:find("%S") +end + +function string:enhance(pattern,action) + local ok, n = true, 0 + while ok do + ok = false + self = self:gsub(pattern, function(...) + ok, n = true, n + 1 + return action(...) + end) + end + return self, n +end + +--~ function string:enhance(pattern,action) +--~ local ok, n = 0, 0 +--~ repeat +--~ self, ok = self:gsub(pattern, function(...) +--~ n = n + 1 +--~ return action(...) +--~ end) +--~ until ok == 0 +--~ return self, n +--~ end + +--~ function string:to_hex() +--~ if self then +--~ return (self:gsub("(.)",function(c) +--~ return string.format("%02X",c:byte()) +--~ end)) +--~ else +--~ return "" +--~ end +--~ end + +--~ function string:from_hex() +--~ if self then +--~ return (self:gsub("(..)",function(c) +--~ return string.char(tonumber(c,16)) +--~ end)) +--~ else +--~ return "" +--~ end +--~ end + +string.chr_to_hex = { } +string.hex_to_chr = { } + +for i=0,255 do + local c, h = string.char(i), string.format("%02X",i) + string.chr_to_hex[c], string.hex_to_chr[h] = h, c +end + +--~ function string:to_hex() +--~ if self then return (self:gsub("(.)",string.chr_to_hex)) else return "" end +--~ end + +--~ function string:from_hex() +--~ if self then return (self:gsub("(..)",string.hex_to_chr)) else return "" end +--~ end + +function string:to_hex() + return ((self or ""):gsub("(.)",string.chr_to_hex)) +end + +function string:from_hex() + return ((self or ""):gsub("(..)",string.hex_to_chr)) +end + +if not string.characters then + + local function nextchar(str, index) + index = index + 1 + return (index <= #str) and index or nil, str:sub(index,index) + end + function string:characters() + return nextchar, self, 0 + end + local function nextbyte(str, index) + index = index + 1 + return (index <= #str) and index or nil, string.byte(str:sub(index,index)) + end + function string:bytes() + return nextbyte, self, 0 + end + +end + +--~ function string:padd(n,chr) +--~ return self .. self.rep(chr or " ",n-#self) +--~ end + +function string:padd(n,chr) + local m = n-#self + if m > 0 then + return self .. self.rep(chr or " ",m) + else + return self + end +end + +function is_number(str) + return str:find("^[%-%+]?[%d]-%.?[%d+]$") == 1 +end + +--~ print(is_number("1")) +--~ print(is_number("1.1")) +--~ print(is_number(".1")) +--~ print(is_number("-0.1")) +--~ print(is_number("+0.1")) +--~ print(is_number("-.1")) +--~ print(is_number("+.1")) + + +-- filename : l-table.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-table'] = 1.001 + +table.join = table.concat + +function table.strip(tab) + local lst = { } + for k, v in ipairs(tab) do + -- s = string.gsub(v, "^%s*(.-)%s*$", "%1") + s = v:gsub("^%s*(.-)%s*$", "%1") + if s == "" then + -- skip this one + else + lst[#lst+1] = s + end + end + return lst +end + +--~ function table.sortedkeys(tab) +--~ local srt = { } +--~ for key,_ in pairs(tab) do +--~ srt[#srt+1] = key +--~ end +--~ table.sort(srt) +--~ return srt +--~ end + +function table.sortedkeys(tab) + local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed + for key,_ in pairs(tab) do + srt[#srt+1] = key + if kind == 3 then + -- no further check + elseif type(key) == "string" then + if kind == 2 then kind = 3 else kind = 1 end + elseif type(key) == "number" then + if kind == 1 then kind = 3 else kind = 2 end + else + kind = 3 + end + end + if kind == 0 or kind == 3 then + table.sort(srt,function(a,b) return (tostring(a) < tostring(b)) end) + else + table.sort(srt) + end + return srt +end + +function table.append(t, list) + for _,v in pairs(list) do + table.insert(t,v) + end +end + +function table.prepend(t, list) + for k,v in pairs(list) do + table.insert(t,k,v) + end +end + +if not table.fastcopy then + + function table.fastcopy(old) -- fast one + if old then + local new = { } + for k,v in pairs(old) do + if type(v) == "table" then + new[k] = table.copy(v) + else + new[k] = v + end + end + return new + else + return { } + end + end + +end + +if not table.copy then + + function table.copy(t, _lookup_table) -- taken from lua wiki + _lookup_table = _lookup_table or { } + local tcopy = {} + if not _lookup_table[t] then + _lookup_table[t] = tcopy + end + for i,v in pairs(t) do + if type(i) == "table" then + if _lookup_table[i] then + i = _lookup_table[i] + else + i = table.copy(i, _lookup_table) + end + end + if type(v) ~= "table" then + tcopy[i] = v + else + if _lookup_table[v] then + tcopy[i] = _lookup_table[v] + else + tcopy[i] = table.copy(v, _lookup_table) + end + end + end + return tcopy + end + +end + +-- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack) + +function table.sub(t,i,j) + return { unpack(t,i,j) } +end + +function table.replace(a,b) + for k,v in pairs(b) do + a[k] = v + end +end + +-- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice) + +function table.is_empty(t) + return not t or not next(t) +end + +function table.one_entry(t) + local n = next(t) + return n and not next(t,n) +end + +function table.starts_at(t) + return ipairs(t,1)(t,0) +end + +do + + -- 34.055.092 32.403.326 arabtype.tma + -- 1.620.614 1.513.863 lmroman10-italic.tma + -- 1.325.585 1.233.044 lmroman10-regular.tma + -- 1.248.157 1.158.903 lmsans10-regular.tma + -- 194.646 153.120 lmtypewriter10-regular.tma + -- 1.771.678 1.658.461 palatinosanscom-bold.tma + -- 1.695.251 1.584.491 palatinosanscom-regular.tma + -- 13.736.534 13.409.446 zapfinoextraltpro.tma + + -- 13.679.038 11.774.106 arabtype.tmc + -- 886.248 754.944 lmroman10-italic.tmc + -- 729.828 466.864 lmroman10-regular.tmc + -- 688.482 441.962 lmsans10-regular.tmc + -- 128.685 95.853 lmtypewriter10-regular.tmc + -- 715.929 582.985 palatinosanscom-bold.tmc + -- 669.942 540.126 palatinosanscom-regular.tmc + -- 1.560.588 1.317.000 zapfinoextraltpro.tmc + + table.serialize_functions = true + table.serialize_compact = true + table.serialize_inline = true + + local function key(k) + if type(k) == "number" then -- or k:find("^%d+$") then + return "["..k.."]" + elseif noquotes and k:find("^%a[%a%d%_]*$") then + return k + else + return '["'..k..'"]' + end + end + + local function simple_table(t) + if #t > 0 then + local n = 0 + for _,v in pairs(t) do + n = n + 1 + end + if n == #t then + local tt = { } + for _,v in ipairs(t) do + local tv = type(v) + if tv == "number" or tv == "boolean" then + tt[#tt+1] = tostring(v) + elseif tv == "string" then + tt[#tt+1] = ("%q"):format(v) + else + tt = nil + break + end + end + return tt + end + end + return nil + end + + local function serialize(root,name,handle,depth,level,reduce,noquotes,indexed) + handle = handle or print + reduce = reduce or false + if depth then + depth = depth .. " " + if indexed then + handle(("%s{"):format(depth)) + else + handle(("%s%s={"):format(depth,key(name))) + end + else + depth = "" + if type(name) == "string" then + if name == "return" then + handle("return {") + else + handle(name .. "={") + end + elseif type(name) == "number" then + handle("[" .. name .. "]={") + elseif type(name) == "boolean" then + if name then + handle("return {") + else + handle("{") + end + else + handle("t={") + end + end + if root and next(root) then + local compact = table.serialize_compact + local inline = compact and table.serialize_inline + local first, last = nil, 0 -- #root cannot be trusted here + if compact then + for k,v in ipairs(root) do + if not first then first = k end + last = last + 1 + end + end + for _,k in pairs(table.sortedkeys(root)) do + local v = root[k] + local t = type(v) + if compact and first and type(k) == "number" and k >= first and k <= last then + if t == "number" then + handle(("%s %s,"):format(depth,v)) + elseif t == "string" then + if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then + handle(("%s %s,"):format(depth,v)) + else + handle(("%s %q,"):format(depth,v)) + end + elseif t == "table" then + if not next(v) then + handle(("%s {},"):format(depth)) + elseif inline then + local st = simple_table(v) + if st then + handle(("%s { %s },"):format(depth,table.concat(st,", "))) + else + serialize(v,k,handle,depth,level+1,reduce,noquotes,true) + end + else + serialize(v,k,handle,depth,level+1,reduce,noquotes,true) + end + elseif t == "boolean" then + handle(("%s %s,"):format(depth,tostring(v))) + elseif t == "function" then + if table.serialize_functions then + handle(('%s loadstring(%q),'):format(depth,string.dump(v))) + else + handle(('%s "function",'):format(depth)) + end + else + handle(("%s %q,"):format(depth,tostring(v))) + end + elseif k == "__p__" then -- parent + if false then + handle(("%s __p__=nil,"):format(depth)) + end + elseif t == "number" then + handle(("%s %s=%s,"):format(depth,key(k),v)) + elseif t == "string" then + if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then + handle(("%s %s=%s,"):format(depth,key(k),v)) + else + handle(("%s %s=%q,"):format(depth,key(k),v)) + end + elseif t == "table" then + if not next(v) then + handle(("%s %s={},"):format(depth,key(k))) + elseif inline then + local st = simple_table(v) + if st then + handle(("%s %s={ %s },"):format(depth,key(k),table.concat(st,", "))) + else + serialize(v,k,handle,depth,level+1,reduce,noquotes) + end + else + serialize(v,k,handle,depth,level+1,reduce,noquotes) + end + elseif t == "boolean" then + handle(("%s %s=%s,"):format(depth,key(k),tostring(v))) + elseif t == "function" then + if table.serialize_functions then + handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(v))) + else + handle(('%s %s="function",'):format(depth,key(k))) + end + else + handle(("%s %s=%q,"):format(depth,key(k),tostring(v))) + -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end))) + end + end + if level > 0 then + handle(("%s},"):format(depth)) + else + handle(("%s}"):format(depth)) + end + else + handle(("%s}"):format(depth)) + end + end + + --~ name: + --~ + --~ true : return { } + --~ false : { } + --~ nil : t = { } + --~ string : string = { } + --~ 'return' : return { } + --~ number : [number] = { } + + function table.serialize(root,name,reduce,noquotes) + local t = { } + local function flush(s) + t[#t+1] = s + end + serialize(root, name, flush, nil, 0, reduce, noquotes) + return table.concat(t,"\n") + end + + function table.tohandle(handle,root,name,reduce,noquotes) + serialize(root, name, handle, nil, 0, reduce, noquotes) + end + + -- sometimes tables are real use (zapfino extra pro is some 85M) in which + -- case a stepwise serialization is nice; actually, we could consider: + -- + -- for line in table.serializer(root,name,reduce,noquotes) do + -- ...(line) + -- end + -- + -- so this is on the todo list + + table.tofile_maxtab = 2*1024 + + function table.tofile(filename,root,name,reduce,noquotes) + local f = io.open(filename,'w') + if f then + local concat = table.concat + local maxtab = table.tofile_maxtab + if maxtab > 1 then + local t = { } + local function flush(s) + t[#t+1] = s + if #t > maxtab then + f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice + t = { } + end + end + serialize(root, name, flush, nil, 0, reduce, noquotes) + f:write(concat(t,"\n"),"\n") + else + local function flush(s) + f:write(s,"\n") + end + serialize(root, name, flush, nil, 0, reduce, noquotes) + end + f:close() + end + end + +end + +--~ t = { +--~ b = "123", +--~ a = "x", +--~ c = 1.23, +--~ d = "1.23", +--~ e = true, +--~ f = { +--~ d = "1.23", +--~ a = "x", +--~ b = "123", +--~ c = 1.23, +--~ e = true, +--~ f = { +--~ e = true, +--~ f = { +--~ e = true +--~ }, +--~ }, +--~ }, +--~ g = function() end +--~ } + +--~ print(table.serialize(t), "\n") +--~ print(table.serialize(t,"name"), "\n") +--~ print(table.serialize(t,false), "\n") +--~ print(table.serialize(t,true), "\n") +--~ print(table.serialize(t,"name",true), "\n") +--~ print(table.serialize(t,"name",true,true), "\n") + +do + + local function flatten(t,f,complete) + for _,v in ipairs(t) do + if type(v) == "table" then + if complete or type(v[1]) == "table" then + flatten(v,f,complete) + else + f[#f+1] = v + end + else + f[#f+1] = v + end + end + end + + function table.flatten(t) + local f = { } + flatten(t,f,true) + return f + end + + function table.unnest(t) -- bad name + local f = { } + flatten(t,f,false) + return f + end + + table.flatten_one_level = table.unnest + +end + +function table.insert_before_value(t,value,str) + for i=1,#t do + if t[i] == value then + table.insert(t,i,str) + return + end + end + table.insert(t,1,str) +end + +function table.insert_after_value(t,value,str) + for i=1,#t do + if t[i] == value then + table.insert(t,i+1,str) + return + end + end + t[#t+1] = str +end + +function table.are_equal(a,b,n,m) + if #a == #b then + n = n or 1 + m = m or #a + for i=n,m do + local ai, bi = a[i], b[i] + if (ai==bi) or (type(ai)=="table" and type(bi)=="table" and table.are_equal(ai,bi)) then + -- continue + else + return false + end + end + return true + else + return false + end +end + +--~ function table.are_equal(a,b) +--~ return table.serialize(a) == table.serialize(b) +--~ end + + + +-- filename : l-io.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-io'] = 1.001 + +if string.find(os.getenv("PATH"),";") then + io.fileseparator, io.pathseparator = "\\", ";" +else + io.fileseparator, io.pathseparator = "/" , ":" +end + +function io.loaddata(filename) + local f = io.open(filename) + if f then + local data = f:read('*all') + f:close() + return data + else + return nil + end +end + +function io.savedata(filename,data,joiner) + local f = io.open(filename, "wb") + if f then + if type(data) == "table" then + f:write(table.join(data,joiner or "")) + elseif type(data) == "function" then + data(f) + else + f:write(data) + end + f:close() + end +end + +function io.exists(filename) + local f = io.open(filename) + if f == nil then + return false + else + assert(f:close()) + return true + end +end + +function io.size(filename) + local f = io.open(filename) + if f == nil then + return 0 + else + local s = f:seek("end") + assert(f:close()) + return s + end +end + +function io.noflines(f) + local n = 0 + for _ in f:lines() do + n = n + 1 + end + f:seek('set',0) + return n +end + +--~ t, f, n = os.clock(), io.open("testbed/sample-utf16-bigendian-big.txt",'rb'), 0 +--~ for a in io.characters(f) do n = n + 1 end +--~ print(string.format("characters: %s, time: %s", n, os.clock()-t)) + +do + + local nextchar = { + [ 4] = function(f) + return f:read(1), f:read(1), f:read(1), f:read(1) + end, + [ 2] = function(f) + return f:read(1), f:read(1) + end, + [ 1] = function(f) + return f:read(1) + end, + [-2] = function(f) + local a = f:read(1) + local b = f:read(1) + return b, a + end, + [-4] = function(f) + local a = f:read(1) + local b = f:read(1) + local c = f:read(1) + local c = f:read(1) + return d, c, b, a + end + } + + function io.characters(f,n) + local sb = string.byte + if f then + return nextchar[n or 1], f + else + return nil, nil + end + end + +end + +do + + local nextbyte = { + [4] = function(f) + local a = f:read(1) + local b = f:read(1) + local c = f:read(1) + local d = f:read(1) + if d then + return sb(a), sb(b), sb(c), sb(d) + else + return nil, nil, nil, nil + end + end, + [2] = function(f) + local a = f:read(1) + local b = f:read(1) + if b then + return sb(a), sb(b) + else + return nil, nil + end + end, + [1] = function (f) + local a = f:read(1) + if a then + return sb(a) + else + return nil + end + end, + [-2] = function (f) + local a = f:read(1) + local b = f:read(1) + if b then + return sb(b), sb(a) + else + return nil, nil + end + end, + [-4] = function(f) + local a = f:read(1) + local b = f:read(1) + local c = f:read(1) + local d = f:read(1) + if d then + return sb(d), sb(c), sb(b), sb(a) + else + return nil, nil, nil, nil + end + end + } + + function io.bytes(f,n) + local sb = string.byte + if f then + return nextbyte[n or 1], f + else + return nil, nil + end + end + +end + + +-- filename : l-number.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-number'] = 1.001 + +if not number then number = { } end + + + +-- filename : l-os.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-os'] = 1.001 + +function os.resultof(command) + return io.popen(command,"r"):read("*all") +end + +--~ if not os.exec then -- still not ok + os.exec = os.execute +--~ end + +function os.launch(str) + if os.platform == "windows" then + os.execute("start " .. str) + else + os.execute(str .. " &") + end +end + +if not os.setenv then + function os.setenv() return false end +end + + +-- filename : l-md5.lua +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-md5'] = 1.001 + +if md5 then do + + local function convert(str,fmt) + return (string.gsub(md5.sum(str),".",function(chr) return string.format(fmt,string.byte(chr)) end)) + end + + if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end + if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end + if not md5.dec then function md5.dec(str) return convert(stt,"%03i") end end + +end end + + +-- filename : l-file.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-file'] = 1.001 + +if not file then file = { } end + +function file.removesuffix(filename) + return filename:gsub("%.%a+$", "") +end + +function file.addsuffix(filename, suffix) + if not filename:find("%.%a-$") then + return filename .. "." .. suffix + else + return filename + end +end + +function file.replacesuffix(filename, suffix) + return filename:gsub("%.%a+$", "." .. suffix) +end + +function file.dirname(name) + return name:match("^(.+)[/\\].-$") or "" +end + +function file.basename(name) + return name:match("^.+[/\\](.-)$") or name +end + +function file.extname(name) + return name:match("^.+%.(.-)$") or "" +end + +function file.join(...) -- args + return (string.gsub(table.concat({...},"/"),"\\","/")) +end + +function file.is_writable(name) + local f = io.open(name, 'w') + if f then + f:close() + return true + else + return false + end +end + +function file.is_readable(name) + local f = io.open(name,'r') + if f then + f:close() + return true + else + return false + end +end + +function file.split_path(str) + if str:find(';') then + return str:splitchr(";") + else + return str:splitchr(io.pathseparator) + end +end + +function file.join_path(tab) + return table.concat(tab,io.pathseparator) +end + +--~ print('test' .. " == " .. file.collapse_path("test")) +--~ print("test/test" .. " == " .. file.collapse_path("test/test")) +--~ print("test/test/test" .. " == " .. file.collapse_path("test/test/test")) +--~ print("test/test" .. " == " .. file.collapse_path("test/../test/test")) +--~ print("test" .. " == " .. file.collapse_path("test/../test")) +--~ print("../test" .. " == " .. file.collapse_path("../test")) +--~ print("../test/" .. " == " .. file.collapse_path("../test/")) +--~ print("a/a" .. " == " .. file.collapse_path("a/b/c/../../a")) + +function file.collapse_path(str) + local ok = false + while not ok do + ok = true + str, n = str:gsub("[^%./]+/%.%./", function(s) + ok = false + return "" + end) + end + return (str:gsub("/%./","/")) +end + +function file.robustname(str) + return (str:gsub("[^%a%d%/%-%.\\]+","-")) +end + +file.readdata = io.loaddata +file.savedata = io.savedata + + +-- filename : l-dir.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-dir'] = 1.001 + +dir = { } + +-- optimizing for no string.find (*) does not save time + +if lfs then + + function dir.glob_pattern(path,patt,recurse,action) + for name in lfs.dir(path) do + local full = path .. '/' .. name + local mode = lfs.attributes(full,'mode') + if mode == 'file' then + if name:find(patt) then + action(full) + end + elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then + dir.glob_pattern(full,patt,recurse,action) + end + end + end + + function dir.glob(pattern, action) + local t = { } + local action = action or function(name) table.insert(t,name) end + local path, patt = pattern:match("^(.*)/*%*%*/*(.-)$") + local recurse = path and patt + if not recurse then + path, patt = pattern:match("^(.*)/(.-)$") + if not (path and patt) then + path, patt = '.', pattern + end + end + patt = patt:gsub("([%.%-%+])", "%%%1") + patt = patt:gsub("%*", ".*") + patt = patt:gsub("%?", ".") + patt = "^" .. patt .. "$" + -- print('path: ' .. path .. ' | pattern: ' .. patt .. ' | recurse: ' .. tostring(recurse)) + dir.glob_pattern(path,patt,recurse,action) + return t + end + + -- t = dir.glob("c:/data/develop/context/sources/**/????-*.tex") + -- t = dir.glob("c:/data/develop/tex/texmf/**/*.tex") + -- t = dir.glob("c:/data/develop/context/texmf/**/*.tex") + -- t = dir.glob("f:/minimal/tex/**/*") + -- print(dir.ls("f:/minimal/tex/**/*")) + -- print(dir.ls("*.tex")) + + function dir.ls(pattern) + return table.concat(dir.glob(pattern),"\n") + end + + --~ mkdirs("temp") + --~ mkdirs("a/b/c") + --~ mkdirs(".","/a/b/c") + --~ mkdirs("a","b","c") + + function dir.mkdirs(...) -- root,... or ... ; root is not split + local pth, err = "", false + for k,v in pairs({...}) do + if k == 1 then + if not lfs.isdir(v) then + -- print("no root path " .. v) + err = true + else + pth = v + end + elseif lfs.isdir(pth .. "/" .. v) then + pth = pth .. "/" .. v + else + for _,s in pairs(v:split("/")) do + pth = pth .. "/" .. s + if not lfs.isdir(pth) then + ok = lfs.mkdir(pth) + if not lfs.isdir(pth) then + err = true + end + end + if err then break end + end + end + if err then break end + end + return pth, not err + end + +end + + +-- filename : l-boolean.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-boolean'] = 1.001 +if not boolean then boolean = { } end + +function boolean.tonumber(b) + if b then return 1 else return 0 end +end + +function toboolean(str) + if type(str) == "string" then + return str == "true" or str == "yes" or str == "on" or str == "1" + elseif type(str) == "number" then + return tonumber(str) ~= 0 + else + return str + end +end + +function string.is_boolean(str) + if type(str) == "string" then + if str == "true" or str == "yes" or str == "on" then + return true + elseif str == "false" or str == "no" or str == "off" then + return false + end + end + return nil +end + +function boolean.alwaystrue() + return true +end + +function boolean.falsetrue() + return false +end + + +-- filename : l-unicode.lua +-- comment : split off from luat-inp +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-unicode'] = 1.001 +if not unicode then unicode = { } end + +if not garbagecollector then + garbagecollector = { + push = function() collectgarbage("stop") end, + pop = function() collectgarbage("restart") end, + } +end + +-- 0 EF BB BF UTF-8 +-- 1 FF FE UTF-16-little-endian +-- 2 FE FF UTF-16-big-endian +-- 3 FF FE 00 00 UTF-32-little-endian +-- 4 00 00 FE FF UTF-32-big-endian + +unicode.utfname = { + [0] = 'utf-8', + [1] = 'utf-16-le', + [2] = 'utf-16-be', + [3] = 'utf-32-le', + [4] = 'utf-32-be' +} + +function unicode.utftype(f) -- \000 fails ! + local str = f:read(4) + if not str then + f:seek('set') + return 0 + elseif str:find("^%z%z\254\255") then + return 4 + elseif str:find("^\255\254%z%z") then + return 3 + elseif str:find("^\254\255") then + f:seek('set',2) + return 2 + elseif str:find("^\255\254") then + f:seek('set',2) + return 1 + elseif str:find("^\239\187\191") then + f:seek('set',3) + return 0 + else + f:seek('set') + return 0 + end +end + +function unicode.utf16_to_utf8(str, endian) + garbagecollector.push() + local result = { } + local tc, uc = table.concat, unicode.utf8.char + local tmp, n, m, p = { }, 0, 0, 0 + -- lf | cr | crlf / (cr:13, lf:10) + local function doit() + if n == 10 then + if p ~= 13 then + result[#result+1] = tc(tmp,"") + tmp = { } + p = 0 + end + elseif n == 13 then + result[#result+1] = tc(tmp,"") + tmp = { } + p = n + else + tmp[#tmp+1] = uc(n) + p = 0 + end + end + for l,r in str:bytepairs() do + if endian then + n = l*256 + r + else + n = r*256 + l + end + if m > 0 then + n = (m-0xD800)*0x400 + (n-0xDC00) + 0x10000 + m = 0 + doit() + elseif n >= 0xD800 and n <= 0xDBFF then + m = n + else + doit() + end + end + if #tmp > 0 then + result[#result+1] = tc(tmp,"") + end + garbagecollector.pop() + return result +end + +function unicode.utf32_to_utf8(str, endian) + garbagecollector.push() + local result = { } + local tc, uc = table.concat, unicode.utf8.char + local tmp, n, m, p = { }, 0, -1, 0 + -- lf | cr | crlf / (cr:13, lf:10) + local function doit() + if n == 10 then + if p ~= 13 then + result[#result+1] = tc(tmp,"") + tmp = { } + p = 0 + end + elseif n == 13 then + result[#result+1] = tc(tmp,"") + tmp = { } + p = n + else + tmp[#tmp+1] = uc(n) + p = 0 + end + end + for a,b in str:bytepairs() do + if a and b then + if m < 0 then + if endian then + m = a*256*256*256 + b*256*256 + else + m = b*256 + a + end + else + if endian then + n = m + a*256 + b + else + n = m + b*256*256*256 + a*256*256 + end + m = -1 + doit() + end + else + break + end + end + if #tmp > 0 then + result[#result+1] = tc(tmp,"") + end + garbagecollector.pop() + return result +end + + +-- filename : l-utils.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-utils'] = 1.001 + +if not utils then utils = { } end +if not utils.merger then utils.merger = { } end +if not utils.lua then utils.lua = { } end + +utils.merger.m_begin = "begin library merge" +utils.merger.m_end = "end library merge" +utils.merger.pattern = + "%c+" .. + "%-%-%s+" .. utils.merger.m_begin .. + "%c+(.-)%c+" .. + "%-%-%s+" .. utils.merger.m_end .. + "%c+" + +function utils.merger._self_fake_() + return + "-- " .. "created merged file" .. "\n\n" .. + "-- " .. utils.merger.m_begin .. "\n\n" .. + "-- " .. utils.merger.m_end .. "\n\n" +end + +function utils.report(...) + print(...) +end + +function utils.merger._self_load_(name) + local f, data = io.open(name), "" + if f then + data = f:read("*all") + f:close() + end + return data or "" +end + +function utils.merger._self_save_(name, data) + if data ~= "" then + local f = io.open(name,'w') + if f then + f:write(data) + f:close() + end + end +end + +function utils.merger._self_swap_(data,code) + if data ~= "" then + return (data:gsub(utils.merger.pattern, function(s) + return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n" + end, 1)) + else + return "" + end +end + +function utils.merger._self_libs_(libs,list) + local result, f = "", nil + if type(libs) == 'string' then libs = { libs } end + if type(list) == 'string' then list = { list } end + for _, lib in ipairs(libs) do + for _, pth in ipairs(list) do + local name = string.gsub(pth .. "/" .. lib,"\\","/") + f = io.open(name) + if f then + -- utils.report("merging library",name) + result = result .. "\n" .. f:read("*all") .. "\n" + f:close() + list = { pth } -- speed up the search + break + else + -- utils.report("no library",name) + end + end + end + return result or "" +end + +function utils.merger.selfcreate(libs,list,target) + if target then + utils.merger._self_save_( + target, + utils.merger._self_swap_( + utils.merger._self_fake_(), + utils.merger._self_libs_(libs,list) + ) + ) + end +end + +function utils.merger.selfmerge(name,libs,list,target) + utils.merger._self_save_( + target or name, + utils.merger._self_swap_( + utils.merger._self_load_(name), + utils.merger._self_libs_(libs,list) + ) + ) +end + +function utils.merger.selfclean(name) + utils.merger._self_save_( + name, + utils.merger._self_swap_( + utils.merger._self_load_(name), + "" + ) + ) +end + +function utils.lua.compile(luafile, lucfile) + -- utils.report("compiling",luafile,"into",lucfile) + os.remove(lucfile) + return (os.execute("luac -s -o " .. string.quote(lucfile) .. " " .. string.quote(luafile)) == 0) +end + + + +-- filename : luat-lib.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-lib'] = 1.001 + +-- mostcode moved to the l-*.lua and other luat-*.lua files + +-- os / io + +os.setlocale(nil,nil) -- useless feature and even dangerous in luatex + +-- os.platform + +-- mswin|bccwin|mingw|cygwin windows +-- darwin|rhapsody|nextstep macosx +-- netbsd|unix unix +-- linux linux + +if not io.fileseparator then + if string.find(os.getenv("PATH"),";") then + io.fileseparator, io.pathseparator, os.platform = "\\", ";", "windows" + else + io.fileseparator, io.pathseparator, os.platform = "/" , ":", "unix" + end +end + +if not os.platform then + if io.pathseparator == ";" then + os.platform = "windows" + else + os.platform = "unix" + end +end + +-- arg normalization +-- +-- for k,v in pairs(arg) do print(k,v) end + +if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then + arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil +end + +-- environment + +if not environment then environment = { } end + +environment.arguments = { } +environment.files = { } +environment.sorted_argument_keys = nil + +environment.platform = os.platform + +function environment.initialize_arguments(arg) + environment.arguments = { } + environment.files = { } + environment.sorted_argument_keys = nil + for index, argument in pairs(arg) do + if index > 0 then + local flag, value = argument:match("^%-+(.+)=(.-)$") + if flag then + environment.arguments[flag] = string.unquote(value or "") + else + flag = argument:match("^%-+(.+)") + if flag then + environment.arguments[flag] = true + else + environment.files[#environment.files+1] = argument + end + end + end + end + environment.ownname = environment.ownname or arg[0] or 'unknown.lua' +end + +function environment.showarguments() + for k,v in pairs(environment.arguments) do + print(k .. " : " .. tostring(v)) + end + if #environment.files > 0 then + print("files : " .. table.concat(environment.files, " ")) + end +end + +function environment.argument(name) + if environment.arguments[name] then + return environment.arguments[name] + else + if not environment.sorted_argument_keys then + environment.sorted_argument_keys = { } + for _,v in pairs(table.sortedkeys(environment.arguments)) do + table.insert(environment.sorted_argument_keys, "^" .. v) + end + end + for _,v in pairs(environment.sorted_argument_keys) do + if name:find(v) then + return environment.arguments[v:sub(2,#v)] + end + end + end + return nil +end + +function environment.split_arguments(separator) -- rather special, cut-off before separator + local done, before, after = false, { }, { } + for _,v in ipairs(environment.original_arguments) do + if not done and v == separator then + done = true + elseif done then + after[#after+1] = v + else + before[#before+1] = v + end + end + return before, after +end + +function environment.reconstruct_commandline(arg) + if not arg then arg = environment.original_arguments end + local result = { } + for _,a in ipairs(arg) do -- ipairs 1 .. #n + local kk, vv = a:match("^(%-+.-)=(.+)$") + if kk and vv then + if vv:find(" ") then + result[#result+1] = kk .. "=" .. string.quote(vv) + else + result[#result+1] = a + end + elseif a:find(" ") then + result[#result+1] = string.quote(a) + else + result[#result+1] = a + end + end + return table.join(result," ") +end + +if arg then + environment.initialize_arguments(arg) + environment.original_arguments = arg + arg = { } -- prevent duplicate handling +end + + +-- filename : luat-inp.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- This lib is multi-purpose and can be loaded again later on so that +-- additional functionality becomes available. We will split this +-- module in components when we're done with prototyping. + +-- This is the first code I wrote for LuaTeX, so it needs some cleanup. + +-- To be considered: hash key lowercase, first entry in table filename +-- (any case), rest paths (so no need for optimization). Or maybe a +-- separate table that matches lowercase names to mixed case when +-- present. In that case the lower() cases can go away. I will do that +-- only when we run into problems with names. + +if not versions then versions = { } end versions['luat-inp'] = 1.001 +if not environment then environment = { } end +if not file then file = { } end + +if environment.aleph_mode == nil then environment.aleph_mode = true end -- temp hack + +if not input then input = { } end +if not input.suffixes then input.suffixes = { } end +if not input.formats then input.formats = { } end +if not input.aux then input.aux = { } end + +if not input.suffixmap then input.suffixmap = { } end + +if not input.locators then input.locators = { } end -- locate databases +if not input.hashers then input.hashers = { } end -- load databases +if not input.generators then input.generators = { } end -- generate databases +if not input.filters then input.filters = { } end -- conversion filters + +input.locators.notfound = { nil } +input.hashers.notfound = { nil } +input.generators.notfound = { nil } + +input.cacheversion = '1.0.1' +input.banner = nil +input.verbose = false +input.debug = false +input.cnfname = 'texmf.cnf' +input.lsrname = 'ls-R' +input.luasuffix = '.tma' +input.lucsuffix = '.tmc' + +-- we use a cleaned up list / format=any is a wildcard, as is *name + +input.formats['afm'] = 'AFMFONTS' input.suffixes['afm'] = { 'afm' } +input.formats['enc'] = 'ENCFONTS' input.suffixes['enc'] = { 'enc' } +input.formats['fmt'] = 'TEXFORMATS' input.suffixes['fmt'] = { 'fmt' } +input.formats['map'] = 'TEXFONTMAPS' input.suffixes['map'] = { 'map' } +input.formats['mp'] = 'MPINPUTS' input.suffixes['mp'] = { 'mp' } +input.formats['ocp'] = 'OCPINPUTS' input.suffixes['ocp'] = { 'ocp' } +input.formats['ofm'] = 'OFMFONTS' input.suffixes['ofm'] = { 'ofm', 'tfm' } +input.formats['otf'] = 'OPENTYPEFONTS' input.suffixes['otf'] = { 'otf' } -- 'ttf' +input.formats['opl'] = 'OPLFONTS' input.suffixes['opl'] = { 'opl' } +input.formats['otp'] = 'OTPINPUTS' input.suffixes['otp'] = { 'otp' } +input.formats['ovf'] = 'OVFFONTS' input.suffixes['ovf'] = { 'ovf', 'vf' } +input.formats['ovp'] = 'OVPFONTS' input.suffixes['ovp'] = { 'ovp' } +input.formats['tex'] = 'TEXINPUTS' input.suffixes['tex'] = { 'tex' } +input.formats['tfm'] = 'TFMFONTS' input.suffixes['tfm'] = { 'tfm' } +input.formats['ttf'] = 'TTFONTS' input.suffixes['ttf'] = { 'ttf', 'ttc' } +input.formats['pfb'] = 'T1FONTS' input.suffixes['pfb'] = { 'pfb', 'pfa' } +input.formats['vf'] = 'VFFONTS' input.suffixes['vf'] = { 'vf' } + +input.formats['fea'] = 'FONTFEATURES' input.suffixes['fea'] = { 'fea' } + +input.formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new +input.suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua' + +input.formats ['lua'] = 'LUAINPUTS' -- new +input.suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' } + +-- here we catch a few new thingies + +function input.checkconfigdata(instance) + if input.env(instance,"LUAINPUTS") == "" then + instance.environment["LUAINPUTS"] = ".;$TEXINPUTS;$TEXMFSCRIPTS" + end + if input.env(instance,"FONTFEATURES") == "" then + instance.environment["FONTFEATURES"] = ".;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS" + end +end + +-- backward compatible ones + +input.alternatives = { } + +input.alternatives['map files'] = 'map' +input.alternatives['enc files'] = 'enc' +input.alternatives['opentype fonts'] = 'otf' +input.alternatives['truetype fonts'] = 'ttf' +input.alternatives['truetype collections'] = 'ttc' +input.alternatives['type1 fonts'] = 'pfb' + +-- obscure ones + +input.formats ['misc fonts'] = '' +input.suffixes['misc fonts'] = { } + +input.formats ['sfd'] = 'SFDFONTS' +input.suffixes ['sfd'] = { 'sfd' } +input.alternatives['subfont definition files'] = 'sfd' + +function input.reset() + + local instance = { } + + instance.rootpath = '' + instance.treepath = '' + instance.progname = environment.progname or 'context' + instance.engine = environment.engine or 'luatex' + instance.format = '' + instance.environment = { } + instance.variables = { } + instance.expansions = { } + instance.files = { } + instance.configuration = { } + instance.found = { } + instance.foundintrees = { } + instance.kpsevars = { } + instance.hashes = { } + instance.cnffiles = { } + instance.lists = { } + instance.remember = true + instance.diskcache = true + instance.renewcache = false + instance.scandisk = true + instance.cachepath = nil + instance.loaderror = false + instance.smallcache = false + instance.savelists = true + instance.cleanuppaths = true + instance.allresults = false + instance.pattern = nil -- lists + instance.kpseonly = false -- lists + instance.cachefile = 'tmftools' + instance.loadtime = 0 + instance.starttime = 0 + instance.stoptime = 0 + instance.validfile = function(path,name) return true end + instance.data = { } -- only for loading + instance.sortdata = false + instance.force_suffixes = true + instance.dummy_path_expr = "^!*unset/*$" + instance.fakepaths = { } + instance.lsrmode = false + + if os.env then + -- store once, freeze and faster + for k,v in pairs(os.env) do + instance.environment[k] = input.bare_variable(v) + end + else + -- we will access os.env frequently + for k,v in pairs({'HOME','TEXMF','TEXMFCNF','SELFAUTOPARENT'}) do + local e = os.getenv(v) + if e then + -- input.report("setting",v,"to",input.bare_variable(e)) + instance.environment[v] = input.bare_variable(e) + end + end + end + + -- cross referencing + + for k, v in pairs(input.suffixes) do + for _, vv in pairs(v) do + if vv then + input.suffixmap[vv] = k + end + end + end + + return instance + +end + +function input.bare_variable(str) + -- return string.gsub(string.gsub(string.gsub(str,"%s+$",""),'^"(.+)"$',"%1"),"^'(.+)'$","%1") + return str:gsub("\s*([\"\']?)(.+)%1\s*", "%2") +end + +if texio then + input.log = texio.write_nl +else + input.log = print +end + +function input.simple_logger(kind, name) + if name and name ~= "" then + if input.banner then + input.log(input.banner..kind..": "..name) + else + input.log("<<"..kind..": "..name..">>") + end + else + if input.banner then + input.log(input.banner..kind..": no name") + else + input.log("<<"..kind..": no name>>") + end + end +end + +function input.dummy_logger() +end + +function input.settrace(n) + input.trace = tonumber(n or 0) + if input.trace > 0 then + input.logger = input.simple_logger + input.verbose = true + else + input.logger = function() end + end +end + +function input.report(...) -- inefficient + if input.verbose then + if input.banner then + input.log(input.banner .. table.concat({...},' ')) + elseif input.logmode() == 'xml' then + input.log(""..table.concat({...},' ').."") + else + input.log("<<"..table.concat({...},' ')..">>") + end + end +end + +function input.reportlines(str) + if type(str) == "string" then + str = str:split("\n") + end + for _,v in pairs(str) do input.report(v) end +end + +input.settrace(os.getenv("MTX.INPUT.TRACE") or os.getenv("MTX_INPUT_TRACE") or input.trace or 0) + +-- These functions can be used to test the performance, especially +-- loading the database files. + +function input.start_timing(instance) + if instance then + instance.starttime = os.clock() + if not instance.loadtime then + instance.loadtime = 0 + end + end +end + +function input.stop_timing(instance, report) + if instance and instance.starttime then + instance.stoptime = os.clock() + local loadtime = instance.stoptime - instance.starttime + instance.loadtime = instance.loadtime + loadtime + if report then + input.report('load time', string.format("%0.3f",loadtime)) + end + return loadtime + else + return 0 + end +end + +input.stoptiming = input.stop_timing +input.starttiming = input.start_timing + +function input.elapsedtime(instance) + return string.format("%0.3f",instance.loadtime or 0) +end + +function input.report_loadtime(instance) + if instance then + input.report('total load time', input.elapsedtime(instance)) + end +end + +function input.loadtime(instance) + tex.print(input.elapsedtime(instance)) +end + +function input.env(instance,key) + return instance.environment[key] or input.osenv(instance,key) +end + +function input.osenv(instance,key) + if instance.environment[key] == nil then + local e = os.getenv(key) + if e == nil then + instance.environment[key] = "" -- false + else + instance.environment[key] = input.bare_variable(e) + end + end + return instance.environment[key] or "" +end + +-- we follow a rather traditional approach: +-- +-- (1) texmf.cnf given in TEXMFCNF +-- (2) texmf.cnf searched in TEXMF/web2c +-- +-- for the moment we don't expect a configuration file in a zip + +function input.identify_cnf(instance) + if #instance.cnffiles == 0 then + if instance.treepath ~= "" then + if instance.rootpath ~= "" then + local t = instance.treepath:splitchr(',') + for k,v in ipairs(t) do + t[k] = file.join(instance.rootpath,v) + end + instance.treepath = table.concat(t,',') + end + local t = instance.treepath:splitchr(',') + instance.environment['TEXMF'] = input.bare_variable(instance.treepath) + instance.environment['TEXMFCNF'] = file.join(t[1] or '.','texmf/web2c') + end + if instance.rootpath ~= "" then + instance.environment['TEXMFCNF'] = file.join(instance.rootpath,'texmf/web2c') + instance.environment['SELFAUTOPARENT'] = instance.rootpath + end + if input.env(instance,'TEXMFCNF') ~= "" then + local t = input.split_path(input.env(instance,'TEXMFCNF')) + t = input.aux.expanded_path(instance,t) + input.aux.expand_vars(instance,t) + for _,v in ipairs(t) do + table.insert(instance.cnffiles,file.join(v,input.cnfname)) + end + elseif input.env(instance,'SELFAUTOPARENT') == '.' then + table.insert(instance.cnffiles,file.join('.',input.cnfname)) + else + for _,v in ipairs({'texmf-local','texmf'}) do + table.insert(instance.cnffiles,file.join(input.env(instance,'SELFAUTOPARENT'),v,'web2c',input.cnfname)) + end + end + end +end + +function input.load_cnf(instance) + -- instance.cnffiles contain complete names now ! + if #instance.cnffiles == 0 then + input.report("no cnf files found (TEXMFCNF may not be set/known)") + else + instance.rootpath = instance.cnffiles[1] + for k,fname in ipairs(instance.cnffiles) do + instance.cnffiles[k] = fname:gsub("\\",'/') + end + for i = 1, 3 do + instance.rootpath = file.dirname(instance.rootpath) + end + if instance.lsrmode then + input.loadconfigdata(instance,instance.cnffiles) + elseif instance.diskcache and not instance.renewcache then + input.loadconfig(instance,instance.cnffiles) + if instance.loaderror then + input.loadconfigdata(instance,instance.cnffiles) + input.saveconfig(instance) + end + else + input.loadconfigdata(instance,instance.cnffiles) + if instance.renewcache then + input.saveconfig(instance) + end + end + input.aux.collapse_cnf_data(instance) + end + input.checkconfigdata(instance) +end + +function input.loadconfigdata(instance) + for _, fname in pairs(instance.cnffiles) do + input.aux.load_cnf(instance,fname) + end +end + +if os.env then + function input.aux.collapse_cnf_data(instance) + for _,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if not instance.variables[k] then + if instance.environment[k] then + instance.variables[k] = instance.environment[k] + else + instance.kpsevars[k] = true + instance.variables[k] = input.bare_variable(v) + end + end + end + end + end +else + function input.aux.collapse_cnf_data(instance) + for _,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if not instance.variables[k] then + local e = os.getenv(k) + if e then + instance.environment[k] = input.bare_variable(e) + instance.variables[k] = instance.environment[k] + else + instance.variables[k] = input.bare_variable(v) + instance.kpsevars[k] = true + end + end + end + end + end +end + +function input.aux.load_cnf(instance,fname) + fname = input.clean_path(fname) + local lname = fname:gsub("%.%a+$",input.luasuffix) + local f = io.open(lname) + if f then + f:close() + input.aux.load_data(instance,file.dirname(lname),'configuration',file.basename(lname)) + else + f = io.open(fname) + if f then + input.report("loading", fname) + local line, data, n, k, v + local dname = file.dirname(fname) + if not instance.configuration[dname] then + instance.configuration[dname] = { } + end + local data = instance.configuration[dname] + while true do + line = f:read() + if line then + while true do -- join lines + line, n = line:gsub("\\%s*$", "") + if n > 0 then + line = line .. f:read() + else + break + end + end + if not line:find("^[%%#]") then + k, v = (line:gsub("%s*%%.*$","")):match("%s*(.-)%s*=%s*(.-)%s*$") + if k and v and not data[k] then + data[k] = (v:gsub("[%%#].*",'')):gsub("~", "$HOME") + instance.kpsevars[k] = true + end + end + else + break + end + end + f:close() + else + input.report("skipping", fname) + end + end +end + +-- database loading + +function input.load_hash(instance) + input.locatelists(instance) + if instance.lsrmode then + input.loadlists(instance) + elseif instance.diskcache and not instance.renewcache then + input.loadfiles(instance) + if instance.loaderror then + input.loadlists(instance) + input.savefiles(instance) + end + else + input.loadlists(instance) + if instance.renewcache then + input.savefiles(instance) + end + end +end + +function input.aux.append_hash(instance,type,tag,name) + input.logger("= hash append",tag) + table.insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } ) +end + +function input.aux.prepend_hash(instance,type,tag,name) + input.logger("= hash prepend",tag) + table.insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } ) +end + +function input.aux.extend_texmf_var(instance,specification) -- crap + if instance.environment['TEXMF'] then + input.report("extending environment variable TEXMF with", specification) + instance.environment['TEXMF'] = instance.environment['TEXMF']:gsub("^%{", function() + return "{" .. specification .. "," + end) + elseif instance.variables['TEXMF'] then + input.report("extending configuration variable TEXMF with", specification) + instance.variables['TEXMF'] = instance.variables['TEXMF']:gsub("^%{", function() + return "{" .. specification .. "," + end) + else + input.report("setting configuration variable TEXMF to", specification) + instance.variables['TEXMF'] = "{" .. specification .. "}" + end + if instance.variables['TEXMF']:find("%,") and not instance.variables['TEXMF']:find("^%{") then + input.report("adding {} to complex TEXMF variable, best do that yourself") + instance.variables['TEXMF'] = "{" .. instance.variables['TEXMF'] .. "}" + end + input.expand_variables(instance) +end + +-- locators + +function input.locatelists(instance) + for _, path in pairs(input.simplified_list(input.expansion(instance,'TEXMF'))) do + input.report("locating list of",path) + input.locatedatabase(instance,input.normalize_name(path)) + end +end + +function input.locatedatabase(instance,specification) + return input.methodhandler('locators', instance, specification) +end + +function input.locators.tex(instance,specification) + if specification and specification ~= '' then + local files = { + file.join(specification,'files'..input.lucsuffix), + file.join(specification,'files'..input.luasuffix), + file.join(specification,input.lsrname) + } + for _, filename in pairs(files) do + local f = io.open(filename) + if f then + input.logger('! tex locator', specification..' found') + input.aux.append_hash(instance,'file',specification,filename) + f:close() + return + end + end + input.logger('? tex locator', specification..' not found') + end +end + +-- hashers + +function input.hashdatabase(instance,tag,name) + return input.methodhandler('hashers',instance,tag,name) +end + +function input.loadfiles(instance) + instance.loaderror = false + instance.files = { } + if not instance.renewcache then + for _, hash in ipairs(instance.hashes) do + input.hashdatabase(instance,hash.tag,hash.name) + if instance.loaderror then break end + end + end +end + +function input.hashers.tex(instance,tag,name) + input.aux.load_data(instance,tag,'files') +end + +-- generators: + +function input.loadlists(instance) + for _, hash in ipairs(instance.hashes) do + input.generatedatabase(instance,hash.tag) + end +end + +function input.generatedatabase(instance,specification) + return input.methodhandler('generators', instance, specification) +end + +function input.generators.tex(instance,specification) + local tag = specification + if not instance.lsrmode and lfs and lfs.dir then + input.report("scanning path",specification) + instance.files[tag] = { } + local files = instance.files[tag] + local n, m = 0, 0 + local spec = specification .. '/' + local attributes = lfs.attributes + local directory = lfs.dir + local small = instance.smallcache + local function action(path) + local mode, full + if path then + full = spec .. path .. '/' + else + full = spec + end + for name in directory(full) do + if name == '.' or name == ".." then + -- skip + else + mode = attributes(full..name,'mode') + if mode == "directory" then + m = m + 1 + if path then + action(path..'/'..name) + else + action(name) + end + elseif path and mode == 'file' then + n = n + 1 + local f = files[name] + if f then + if not small then + if type(f) == 'string' then + files[name] = { f, path } + else + f[#f+1] = path + end + end + else + files[name] = path + end + end + end + end + end + action() + input.report(n,"files found on",m,"directories") + else + local fullname = file.join(specification,input.lsrname) + local path = '.' + local f = io.open(fullname) + if f then + instance.files[tag] = { } + local files = instance.files[tag] + local small = instance.smallcache + input.report("loading lsr file",fullname) + -- for line in f:lines() do -- much slower then the next one + for line in (f:read("*a")):gmatch("(.-)\n") do + if line:find("^[%a%d]") then + local fl = files[line] + if fl then + if not small then + if type(fl) == 'string' then + files[line] = { fl, path } -- table + else + fl[#fl+1] = path + end + end + else + files[line] = path -- string + end + else + path = line:match("%.%/(.-)%:$") or path -- match could be nil due to empty line + end + end + f:close() + end + end +end + +-- savers, todo + +function input.savefiles(instance) + input.aux.save_data(instance, 'files', function(k,v) + return instance.validfile(k,v) -- path, name + end) +end + +-- A config (optionally) has the paths split in tables. Internally +-- we join them and split them after the expansion has taken place. This +-- is more convenient. + +function input.splitconfig(instance) + for i,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if type(v) == 'string' then + local t = file.split_path(v) + if #t > 1 then + c[k] = t + end + end + end + end +end +function input.joinconfig(instance) + for i,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if type(v) == 'table' then + c[k] = file.join_path(v) + end + end + end +end +function input.split_path(str) + if type(str) == 'table' then + return str + else + return file.split_path(str) + end +end +function input.join_path(str) + if type(str) == 'table' then + return file.join_path(str) + else + return str + end +end +function input.splitexpansions(instance) + for k,v in pairs(instance.expansions) do + local t = file.split_path(v) + if #t > 1 then + instance.expansions[k] = t + end + end +end +function input.splitexpansions(instance) + for k,v in pairs(instance.expansions) do + local t, h = { }, { } + for _,vv in pairs(file.split_path(v)) do + if vv ~= "" and not h[vv] then + t[#t+1] = vv + h[vv] = true + end + end + if #t > 1 then + instance.expansions[k] = t + else + instance.expansions[k] = t[1] + end + end +end + +-- end of split/join code + +function input.saveconfig(instance) + input.splitconfig(instance) + input.aux.save_data(instance, 'configuration', nil) + input.joinconfig(instance) +end + +input.configbanner = [[ +-- This is a Luatex configuration file created by 'luatools.lua' or +-- 'luatex.exe' directly. For comment, suggestions and questions you can +-- contact the ConTeXt Development Team. This configuration file is +-- not copyrighted. [HH & TH] +]] + +function input.aux.save_data(instance, dataname, check) + for cachename, files in pairs(instance[dataname]) do + local name = file.join(cachename,dataname) + local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix + local f = io.open(luaname,'w') + if f then + input.report("saving " .. dataname .. " in", luaname) + f:write(input.configbanner) + f:write("\n") + f:write("if not texmf then texmf = { } end\n") + f:write("if not texmf.data then texmf.data = { } end\n") + f:write("\n") + f:write("texmf.data.type = '" .. dataname .. "'\n") + f:write("texmf.data.version = '" .. input.cacheversion .. "'\n") + f:write("texmf.data.date = '" .. os.date("%Y-%m-%d") .. "'\n") + f:write("texmf.data.time = '" .. os.date("%H:%M:%S") .. "'\n") + f:write('texmf.data.content = {\n') + local function dump(k,v) + if not check or check(v,k) then -- path, name + if type(v) == 'string' then + f:write("\t['" .. k .. "'] = '" .. v .. "',\n") + elseif #v == 1 then + f:write("\t['" .. k .. "'] = '" .. v[1] .. "',\n") + else + f:write("\t['" .. k .. "'] = {'" .. table.concat(v,"','").. "'},\n") + end + end + end + if instance.sortdata then + for _, k in pairs(table.sortedkeys(files)) do + dump(k,files[k]) + end + else + for k, v in pairs(files) do + dump(k,v) + end + end + f:write('}\n') + f:close() + input.report("compiling " .. dataname .. " to", lucname) + if not utils.lua.compile(luaname,lucname) then + input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname) + os.remove(lucname) + end + else + input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix) + end + end +end + +function input.loadconfig(instance) + instance.configuration, instance.loaderror = { }, false + if not instance.renewcache then + for _, cnf in pairs(instance.cnffiles) do + input.aux.load_data(instance,file.dirname(cnf),'configuration') + if instance.loaderror then break end + end + end + input.joinconfig(instance) +end + +if not texmf then texmf = {} end +if not texmf.data then texmf.data = {} end + +function input.aux.load_data(instance,pathname,dataname,filename) + if not filename or (filename == "") then + filename = dataname .. input.lucsuffix + end + local blob = loadfile(file.join(pathname,filename)) + if not blob then + filename = dataname .. input.luasuffix + blob = loadfile(file.join(pathname,filename)) + end + if blob then + blob() + if (texmf.data.type == dataname) and (texmf.data.version == input.cacheversion) and texmf.data.content then + input.report("loading",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = texmf.data.content + else + input.report("skipping",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = { } + instance.loaderror = true + end + end + texmf.data.content = { } +end + +function input.expand_variables(instance) + instance.expansions = { } + if instance.engine ~= "" then instance.environment['engine'] = instance.engine end + if instance.progname ~= "" then instance.environment['progname'] = instance.engine end + for k,v in pairs(instance.environment) do + local a, b = k:match("^(%a+)%_(.*)%s*$") + if a and b then + instance.expansions[a..'.'..b] = v + else + instance.expansions[k] = v + end + end + for k,v in pairs(instance.environment) do -- move environment to expansions + if not instance.expansions[k] then instance.expansions[k] = v end + end + for k,v in pairs(instance.variables) do -- move variables to expansions + if not instance.expansions[k] then instance.expansions[k] = v end + end + while true do + local busy = false + for k,v in pairs(instance.expansions) do + local s, n = v:gsub("%$([%a%d%_%-]+)", function(a) + busy = true + return instance.expansions[a] or input.env(instance,a) + end) + local s, m = s:gsub("%$%{([%a%d%_%-]+)%}", function(a) + busy = true + return instance.expansions[a] or input.env(instance,a) + end) + if n > 0 or m > 0 then + instance.expansions[k]= s + end + end + if not busy then break end + end + for k,v in pairs(instance.expansions) do + instance.expansions[k] = v:gsub("\\", '/') + end + input.splitexpansions(instance) +end + +function input.aux.expand_vars(instance,lst) -- simple vars + for k,v in pairs(lst) do + lst[k] = v:gsub("%$([%a%d%_%-]+)", function(a) + return instance.variables[a] or input.env(instance,a) + end) + end +end + +function input.aux.expanded_var(instance,var) -- simple vars + return var:gsub("%$([%a%d%_%-]+)", function(a) + return instance.variables[a] or input.env(instance,a) + end) +end + +function input.aux.entry(instance,entries,name) + if name and (name ~= "") then + name = name:gsub('%$','') + local result = entries[name..'.'..instance.progname] or entries[name] + if result then + return result + else + result = input.env(instance,name) + if result then + instance.variables[name] = result + input.expand_variables(instance) + return instance.expansions[name] or "" + end + end + end + return "" +end +function input.variable(instance,name) + return input.aux.entry(instance,instance.variables,name) +end +function input.expansion(instance,name) + return input.aux.entry(instance,instance.expansions,name) +end + +function input.aux.is_entry(instance,entries,name) + if name and name ~= "" then + name = name:gsub('%$','') + return (entries[name..'.'..instance.progname] or entries[name]) ~= nil + else + return false + end +end + +function input.is_variable(instance,name) + return input.aux.is_entry(instance,instance.variables,name) +end +function input.is_expansion(instance,name) + return input.aux.is_entry(instance,instance.expansions,name) +end + +function input.aux.list(instance,list) + local pat = string.upper(instance.pattern or "","") + for _,key in pairs(table.sortedkeys(list)) do + if (instance.pattern=="") or string.find(key:upper(),pat) then + if instance.kpseonly then + if instance.kpsevars[key] then + print(key .. "=" .. input.aux.tabstr(list[key])) + end + elseif instance.kpsevars[key] then + print('K ' .. key .. "=" .. input.aux.tabstr(list[key])) + else + print('E ' .. key .. "=" .. input.aux.tabstr(list[key])) + end + end + end +end + +function input.list_variables(instance) + input.aux.list(instance,instance.variables) +end +function input.list_expansions(instance) + input.aux.list(instance,instance.expansions) +end + +function input.list_configurations(instance) + for _,key in pairs(table.sortedkeys(instance.kpsevars)) do + if not instance.pattern or (instance.pattern=="") or key:find(instance.pattern) then + print(key.."\n") + for i,c in pairs(instance.configuration) do + local str = c[key] + if str then + print("\t" .. i .. "\t\t" .. input.aux.tabstr(str)) + end + end + print() + end + end +end + +function input.aux.tabstr(str) + if type(str) == 'table' then + return table.concat(str," | ") + else + return str + end +end + +function input.simplified_list(str) + if type(str) == 'table' then + return str -- troubles ; ipv , in texmf + elseif str == '' then + return { } + else + local t = { } + for _,v in ipairs(string.splitchr(str:gsub("^\{(.+)\}$","%1"),",")) do + t[#t+1] = (v:gsub("^[%!]*(.+)[%/\\]*$","%1")) + end + return t + end +end + +function input.unexpanded_path_list(instance,str) + local pth = input.variable(instance,str) + local lst = input.split_path(pth) + return input.aux.expanded_path(instance,lst) +end +function input.unexpanded_path(instance,str) + return file.join_path(input.unexpanded_path_list(instance,str)) +end + +function input.expanded_path_list(instance,str) + if not str then + return { } + elseif instance.savelists then + -- engine+progname hash + str = str:gsub("%$","") + if not instance.lists[str] then -- cached + local lst = input.split_path(input.expansion(instance,str)) + instance.lists[str] = input.aux.expanded_path(instance,lst) + end + return instance.lists[str] + else + local lst = input.split_path(input.expansion(instance,str)) + return input.aux.expanded_path(instance,lst) + end +end +function input.expand_path(instance,str) + return file.join_path(input.expanded_path_list(instance,str)) +end + +--~ function input.first_writable_path(instance,name) +--~ for _,v in pairs(input.expanded_path_list(instance,name)) do +--~ if file.is_writable(file.join(v,'luatex-cache.tmp')) then +--~ return v +--~ end +--~ end +--~ return "." +--~ end + +function input.expanded_path_list_from_var(instance,str) -- brrr + local tmp = input.var_of_format_or_suffix(str:gsub("%$","")) + if tmp ~= "" then + return input.expanded_path_list(instance,str) + else + return input.expanded_path_list(instance,tmp) + end +end +function input.expand_path_from_var(instance,str) + return file.join_path(input.expanded_path_list_from_var(instance,str)) +end + +function input.format_of_var(str) + return input.formats[str] or input.formats[input.alternatives[str]] or '' +end +function input.format_of_suffix(str) + return input.suffixmap[file.extname(str)] or 'tex' +end + +function input.variable_of_format(str) + return input.formats[str] or input.formats[input.alternatives[str]] or '' +end + +function input.var_of_format_or_suffix(str) + local v = input.formats[str] + if v then + return v + end + v = input.formats[input.alternatives[str]] + if v then + return v + end + v = input.suffixmap[file.extname(str)] + if v then + return input.formats[isf] + end + return '' +end + +function input.expand_braces(instance,str) -- output variable and brace expansion of STRING + local ori = input.variable(instance,str) + local pth = input.aux.expanded_path(instance,input.split_path(ori)) + return file.join_path(pth) +end + +-- {a,b,c,d} +-- a,b,c/{p,q,r},d +-- a,b,c/{p,q,r}/d/{x,y,z}// +-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r} +-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r} + +function input.aux.expanded_path(instance,pathlist) + -- a previous version fed back into pathlist + local i, n, oldlist, newlist, ok = 0, 0, { }, { }, false + for _,v in ipairs(pathlist) do + if v:find("[{}]") then + ok = true + break + end + end + if ok then + for _,v in ipairs(pathlist) do + oldlist[#oldlist+1] = (v:gsub("([\{\}])", function(p) + if p == "{" then + i = i + 1 + if i > n then n = i end + return "<" .. (i-1) .. ">" + else + i = i - 1 + return "" + end + end)) + end + for i=1,n do + while true do + local more = false + local pattern = "^(.-)<"..(n-i)..">(.-)(.-)$" + local t = { } + for _,v in ipairs(oldlist) do + local pre, mid, post = v:match(pattern) + if pre and mid and post then + more = true + -- for _,vv in ipairs(mid:splitchr(',')) do + for vv in string.gmatch(mid..',',"(.-),") do + if vv == '.' then + t[#t+1] = pre..post + else + t[#t+1] = pre..vv..post + end + end + else + t[#t+1] = v + end + end + oldlist = t + if not more then break end + end + end + for _,v in pairs(oldlist) do + v = file.collapse_path(v) + if v ~= "" and not v:find(instance.dummy_path_expr) then newlist[#newlist+1] = v end + end + else + for _,v in pairs(pathlist) do + -- for _,vv in pairs(v:split(",")) do + for vv in string.gmatch(v..',',"(.-),") do + vv = file.collapse_path(v) + if vv ~= "" then newlist[#newlist+1] = vv end + end + end + end + return newlist +end + +--~ function input.is_readable(name) -- brrr, get rid of this +--~ return name:find("^zip##") or file.is_readable(name) +--~ end + +input.is_readable = { } + +function input.aux.is_readable(readable, name) + if input.trace > 2 then + if readable then + input.logger("+ readable", name) + else + input.logger("- readable", name) + end + end + return readable +end + +function input.is_readable.file(name) + -- return input.aux.is_readable(file.is_readable(name), name) + return input.aux.is_readable(input.aux.is_file(name), name) +end + +input.is_readable.tex = input.is_readable.file + +-- name +-- name/name + +function input.aux.collect_files(instance,names) + local filelist = nil + for _, fname in pairs(names) do + if fname then + if input.trace > 2 then + input.logger("? blobpath asked",fname) + end + local bname = file.basename(fname) + local dname = file.dirname(fname) + if dname == "" or dname:find("^%.") then + dname = false + else + dname = "/" .. dname .. "$" + end + for _, hash in pairs(instance.hashes) do + local blobpath = hash.tag + if blobpath and instance.files[blobpath] then + if input.trace > 2 then + input.logger('? blobpath do',blobpath .. " (" .. bname ..")") + end + local blobfile = instance.files[blobpath][bname] + if blobfile then + if type(blobfile) == 'string' then + if not dname or blobfile:find(dname) then + if not filelist then filelist = { } end + -- input.logger('= collected', blobpath.." | "..blobfile.." | "..bname) + filelist[#filelist+1] = file.join(blobpath,blobfile,bname) + end + else + for _, vv in pairs(blobfile) do + if not dname or vv:find(dname) then + if not filelist then filelist = { } end + filelist[#filelist+1] = file.join(blobpath,vv,bname) + end + end + end + end + elseif input.trace > 1 then + input.logger('! blobpath no',blobpath .. " (" .. bname ..")" ) + end + end + end + end + return filelist +end + +function input.suffix_of_format(str) + if input.suffixes[str] then + return input.suffixes[str][1] + else + return "" + end +end + +function input.suffixes_of_format(str) + if input.suffixes[str] then + return input.suffixes[str] + else + return {} + end +end + +function input.aux.qualified_path(filename) -- make platform dependent / not good yet + return + filename:find("^%.+/") or + filename:find("^/") or + filename:find("^%a+%:") or + filename:find("^%a+##") +end + +function input.normalize_name(original) + -- internally we use type##spec##subspec ; this hackery slightly slows down searching + local str = original or "" + str = str:gsub("::", "##") -- :: -> ## + str = str:gsub("^(%a+)://" ,"%1##") -- zip:// -> zip## + str = str:gsub("(.+)##(.+)##/(.+)","%1##%2##%3") -- ##/spec -> ##spec + if (input.trace>1) and (original ~= str) then + input.logger('= normalizer',original.." -> "..str) + end + return str +end + +-- split the next one up, better for jit + +function input.aux.register_in_trees(instance,name) + if not name:find("^%.") then + instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one + end +end + +function input.aux.find_file(instance,filename) -- todo : plugin (scanners, checkers etc) + local result = { } + local stamp = nil + filename = input.normalize_name(filename) + filename = file.collapse_path(filename:gsub("\\","/")) + -- speed up / beware: format problem + if instance.remember then + stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format + if instance.found[stamp] then + input.logger('! remembered', filename) + return instance.found[stamp] + end + end + if filename:find('%*') then + input.logger('! wildcard', filename) + result = input.find_wildcard_files(instance,filename) + elseif input.aux.qualified_path(filename) then + if input.is_readable.file(filename) then + input.logger('! qualified', filename) + result = { filename } + else + local forcedname, ok = "", false + if file.extname(filename) == "" then + if instance.format == "" then + forcedname = filename .. ".tex" + if input.is_readable.file(forcedname) then + input.logger('! no suffix, forcing standard filetype tex') + result, ok = { forcedname }, true + end + else + for _, s in pairs(input.suffixes_of_format(instance.format)) do + forcedname = filename .. "." .. s + if input.is_readable.file(forcedname) then + input.logger('! no suffix, forcing format filetype', s) + result, ok = { forcedname }, true + break + end + end + end + end + if not ok then + input.logger('? qualified', filename) + end + end + else + -- search spec + local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename) + if ext == "" then + if not instance.force_suffixes then + table.insert(wantedfiles, filename) + end + else + table.insert(wantedfiles, filename) + end + if instance.format == "" then + if ext == "" then + local forcedname = filename .. '.tex' + table.insert(wantedfiles, forcedname) + filetype = input.format_of_suffix(forcedname) + input.logger('! forcing filetype',filetype) + else + filetype = input.format_of_suffix(filename) + input.logger('! using suffix based filetype',filetype) + end + else + if ext == "" then + for _, s in pairs(input.suffixes_of_format(instance.format)) do + table.insert(wantedfiles, filename .. "." .. s) + end + end + filetype = instance.format + input.logger('! using given filetype',filetype) + end + local typespec = input.variable_of_format(filetype) + local pathlist = input.expanded_path_list(instance,typespec) + if not pathlist or #pathlist == 0 then + -- no pathlist, access check only + if input.trace > 2 then + input.logger('? filename',filename) + input.logger('? filetype',filetype or '?') + input.logger('? wanted files',table.concat(wantedfiles," | ")) + end + for _, fname in pairs(wantedfiles) do + if fname and input.is_readable.file(fname) then + filename, done = fname, true + table.insert(result, file.join('.',fname)) + break + end + end + -- this is actually 'other text files' or 'any' or 'whatever' + local filelist = input.aux.collect_files(instance,wantedfiles) + filename = filelist and filelist[1] + if filename then + table.insert(result, filename) + done = true + end + else + -- list search + local filelist = input.aux.collect_files(instance,wantedfiles) + local doscan, recurse + if input.trace > 2 then + input.logger('? filename',filename) + if pathlist then input.logger('? path list',table.concat(pathlist," | ")) end + if filelist then input.logger('? file list',table.concat(filelist," | ")) end + end + -- a bit messy ... esp the doscan setting here + for _, path in pairs(pathlist) do + if path:find("^!!") then doscan = false else doscan = true end + if path:find("//$") then recurse = true else recurse = false end + local pathname = path:gsub("^!+", '') + done = false + -- using file list + if filelist and not (done and not instance.allresults) and recurse then + -- compare list entries with permitted pattern + pathname = pathname:gsub("([%-%.])","%%%1") -- this also influences + pathname = pathname:gsub("/+$", '/.*') -- later usage of pathname + pathname = pathname:gsub("//", '/.-/') + expr = "^" .. pathname + -- input.debug('?',expr) + for _, f in pairs(filelist) do + if f:find(expr) then + -- input.debug('T',' '..f) + if input.trace > 2 then + input.logger('= found in hash',f) + end + table.insert(result,f) + input.aux.register_in_trees(instance,f) -- for tracing used files + done = true + if not instance.allresults then break end + else + -- input.debug('F',' '..f) + end + end + end + if not done and doscan then + -- check if on disk / unchecked / does not work at all + if input.method_is_file(pathname) then -- ? + local pname = pathname:gsub("%.%*$",'') + if not pname:find("%*") then + local ppname = pname:gsub("/+$","") + if input.aux.can_be_dir(instance,ppname) then + for _, w in pairs(wantedfiles) do + local fname = file.join(ppname,w) + if input.is_readable.file(fname) then + if input.trace > 2 then + input.logger('= found by scanning',fname) + end + table.insert(result,fname) + done = true + if not instance.allresults then break end + end + end + else + -- no access needed for non existing path, speedup (esp in large tree with lots of fake) + end + end + end + end + if not done and doscan then + -- todo: slow path scanning + end + if done and not instance.allresults then break end + end + end + end + for k,v in pairs(result) do + result[k] = file.collapse_path(v) + end + if instance.remember then + instance.found[stamp] = result + end + return result +end + +input.aux._find_file_ = input.aux.find_file + +function input.aux.find_file(instance,filename) -- maybe make a lowres cache too + local result = input.aux._find_file_(instance,filename) + if #result == 0 then + local lowered = filename:lower() + if filename ~= lowered then + return input.aux._find_file_(instance,lowered) + end + end + return result +end + +if lfs and lfs.isfile then + input.aux.is_file = lfs.isfile -- to be done: use this +else + input.aux.is_file = file.is_readable +end + +if lfs and lfs.isdir then + function input.aux.can_be_dir(instance,name) + if not instance.fakepaths[name] then + if lfs.isdir(name) then + instance.fakepaths[name] = 1 -- directory + else + instance.fakepaths[name] = 2 -- no directory + end + end + return (instance.fakepaths[name] == 1) + end +else + function input.aux.can_be_dir() + return true + end +end + +if not input.concatinators then input.concatinators = { } end + +function input.concatinators.tex(tag,path,name) + return tag .. '/' .. path .. '/' .. name +end + +input.concatinators.file = input.concatinators.tex + +function input.find_files(instance,filename,filetype,mustexist) + if type(mustexist) == boolean then + -- all set + elseif type(filetype) == 'boolean' then + filetype, mustexist = nil, false + elseif type(filetype) ~= 'string' then + filetype, mustexist = nil, false + end + instance.format = filetype or '' + local t = input.aux.find_file(instance,filename,true) + instance.format = '' + return t +end + +function input.find_file(instance,filename,filetype,mustexist) + return (input.find_files(instance,filename,filetype,mustexist)[1] or "") +end + +function input.find_given_files(instance,filename) + local bname, result = file.basename(filename), { } + for k, hash in pairs(instance.hashes) do + local blist = instance.files[hash.tag][bname] + if blist then + if type(blist) == 'string' then + table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "") + if not instance.allresults then break end + else + for kk,vv in pairs(blist) do + table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "") + if not instance.allresults then break end + end + end + end + end + return result +end + +function input.find_given_file(instance,filename) + return (input.find_given_files(instance,filename)[1] or "") +end + +--~ function input.find_wildcard_files(instance,filename) +--~ local result = { } +--~ local bname, dname = file.basename(filename), file.dirname(filename) +--~ local expr = dname:gsub("^*/","") +--~ expr = expr:gsub("*",".*") +--~ expr = expr:gsub("-","%-") +--~ for k, hash in pairs(instance.hashes) do +--~ local blist = instance.files[hash.tag][bname] +--~ if blist then +--~ if type(blist) == 'string' then +--~ -- make function and share code +--~ if blist:find(expr) then +--~ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "") +--~ if not instance.allresults then break end +--~ end +--~ else +--~ for kk,vv in pairs(blist) do +--~ if vv:find(expr) then +--~ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "") +--~ if not instance.allresults then break end +--~ end +--~ end +--~ end +--~ end +--~ end +--~ return result +--~ end + +function input.find_wildcard_files(instance,filename) + local result = { } + local bname, dname = file.basename(filename), file.dirname(filename) + local path = dname:gsub("^*/","") + path = path:gsub("*",".*") + path = path:gsub("-","%%-") + if dname == "" then + path = ".*" + end + local name = bname + name = name:gsub("*",".*") + name = name:gsub("-","%%-") + path = path:lower() + name = name:lower() + local function doit(blist,bname,hash,allresults) + local done = false + if blist then + if type(blist) == 'string' then + -- make function and share code + if (blist:lower()):find(path) then + table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "") + done = true + end + else + for kk,vv in pairs(blist) do + if (vv:lower()):find(path) then + table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "") + done = true + if not allresults then break end + end + end + end + end + return done + end + local files, allresults, done = instance.files, instance.allresults, false + if name:find("%*") then + for k, hash in pairs(instance.hashes) do + for kk, hh in pairs(files[hash.tag]) do + if (kk:lower()):find(name) then + if doit(hh,kk,hash,allresults) then done = true end + if done and not allresults then break end + end + end + end + else + for k, hash in pairs(instance.hashes) do + if doit(files[hash.tag][bname],bname,hash,allresults) then done = true end + if done and not allresults then break end + end + end + return result +end + +function input.find_wildcard_file(instance,filename) + return (input.find_wildcard_files(instance,filename)[1] or "") +end + +-- main user functions + +function input.save_used_files_in_trees(instance, filename,jobname) + if not filename then filename = 'luatex.jlg' end + local f = io.open(filename,'w') + if f then + f:write("\n") + f:write("\n") + if jobname then + f:write("\t" .. jobname .. "\n") + end + f:write("\t\n") + for _,v in pairs(table.sortedkeys(instance.foundintrees)) do + f:write("\t\t" .. v .. "\n") + end + f:write("\t\n") + f:write("\n") + f:close() + end +end + +function input.automount(instance) + -- implemented later +end + +function input.load(instance) + input.start_timing(instance) + input.identify_cnf(instance) + input.load_cnf(instance) + input.expand_variables(instance) + input.load_hash(instance) + input.automount(instance) + input.stop_timing(instance) +end + +function input.for_files(instance, command, files, filetype, mustexist) + if files and #files > 0 then + local function report(str) + if input.verbose then + input.report(str) -- has already verbose + else + print(str) + end + end + if input.verbose then + report('') + end + for _, file in pairs(files) do + local result = command(instance,file,filetype,mustexist) + if type(result) == 'string' then + report(result) + else + for _,v in pairs(result) do + report(v) + end + end + end + end +end + +-- strtab + +function input.var_value(instance,str) -- output the value of variable $STRING. + return input.variable(instance,str) +end +function input.expand_var(instance,str) -- output variable expansion of STRING. + return input.expansion(instance,str) +end +function input.show_path(instance,str) -- output search path for file type NAME + return file.join_path(input.expanded_path_list(instance,input.format_of_var(str))) +end + +-- input.find_file(filename) +-- input.find_file(filename, filetype, mustexist) +-- input.find_file(filename, mustexist) +-- input.find_file(filename, filetype) + +function input.aux.register_file(files, name, path) + if files[name] then + if type(files[name]) == 'string' then + files[name] = { files[name], path } + else + files[name] = path + end + else + files[name] = path + end +end + +-- zip:: zip## zip:// +-- zip::pathtozipfile::pathinzipfile (also: pathtozipfile/pathinzipfile) +-- file::name +-- tex::name +-- kpse::name +-- kpse::format::name +-- parent::n::name +-- parent::name (default 2) + +if not input.finders then input.finders = { } end +if not input.openers then input.openers = { } end +if not input.loaders then input.loaders = { } end + +input.finders.notfound = { nil } +input.openers.notfound = { nil } +input.loaders.notfound = { false, nil, 0 } + +function input.splitmethod(filename) + local method, specification = filename:match("^(.-)##(.+)$") + if method and specification then + return method, specification + else + return 'tex', filename + end +end + +function input.method_is_file(filename) + local method, specification = input.splitmethod(filename) + return method == 'tex' or method == 'file' +end + +function input.methodhandler(what, instance, filename, filetype) -- ... + local method, specification = input.splitmethod(filename) + if method and specification then -- redundant + if input[what][method] then + input.logger('= handler',filename.." -> "..what.." | "..method.." | "..specification) + return input[what][method](instance,specification,filetype) + else + return nil + end + else + return input[what].tex(instance,filename,filetype) + end +end + +-- also inside next test? + +function input.findtexfile(instance, filename, filetype) + return input.methodhandler('finders',instance, input.normalize_name(filename), filetype) +end +function input.opentexfile(instance,filename) + return input.methodhandler('openers',instance, input.normalize_name(filename)) +end + +function input.findbinfile(instance, filename, filetype) + return input.methodhandler('finders',instance, input.normalize_name(filename), filetype) +end +function input.openbinfile(instance,filename) + return input.methodhandler('loaders',instance, input.normalize_name(filename)) +end + +function input.loadbinfile(instance, filename, filetype) + local fname = input.findbinfile(instance, input.normalize_name(filename), filetype) + if fname and fname ~= "" then + return input.openbinfile(instance,fname) + else + return unpack(input.loaders.notfound) + end +end + +function input.texdatablob(instance, filename, filetype) + local ok, data, size = input.loadbinfile(instance, filename, filetype) + return data or "" +end + +function input.openfile(filename) -- brrr texmf.instance here / todo ! ! ! ! ! + local fullname = input.findtexfile(texmf.instance, filename) + if fullname and (fullname ~= "") then + return input.opentexfile(texmf.instance, fullname) + else + return nil + end +end + +function input.logmode() + return (os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"):lower() +end + +-- this is a prelude to engine/progname specific configuration files +-- in which case we can omit files meant for other programs and +-- packages + +--- ctx + +-- maybe texinputs + font paths +-- maybe positive selection tex/context fonts/tfm|afm|vf|opentype|type1|map|enc + +input.validators = { } +input.validators.visibility = { } + +function input.validators.visibility.default(path, name) + return true +end + +function input.validators.visibility.context(path, name) + path = path[1] or path -- some day a loop + return not ( + path:find("latex") or + path:find("doc") or + path:find("tex4ht") or + path:find("source") or +-- path:find("config") or +-- path:find("metafont") or + path:find("lists$") or + name:find("%.tpm$") or + name:find("%.bak$") + ) +end + +-- todo: describe which functions are public (maybe input.private. ... ) + +-- beware: i need to check where we still need a / on windows: + +function input.clean_path(str) + -- return string.gsub(string.gsub(string.gsub(str,"\\","/"),"^!+",""),"//$","/") + return (string.gsub(string.gsub(str,"\\","/"),"^!+","")) +end +function input.do_with_path(name,func) + for _, v in pairs(input.expanded_path_list(instance,name)) do + func("^"..input.clean_path(v)) + end +end +function input.do_with_var(name,func) + func(input.aux.expanded_var(name)) +end + +function input.with_files(instance,pattern,handle) + for _, hash in pairs(instance.hashes) do + local blobpath = hash.tag + local blobtype = hash.type + if blobpath and instance.files[blobpath] then -- sort them? + for k,v in pairs(instance.files[blobpath]) do + if k:find(pattern) then + if type(v) == "string" then + handle(blobtype,blobpath,v,k) + else + for _,vv in pairs(v) do + handle(blobtype,blobpath,vv,k) + end + end + end + end + end + end +end + +function input.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix + newname = file.addsuffix(newname,"lua") + newscript = input.clean_path(input.find_file(instance, newname)) + oldscript = input.clean_path(oldname) + input.report("old script", oldscript) + input.report("new script", newscript) + if oldscript ~= newscript and (oldscript:find(file.removesuffix(newname).."$") or oldscript:find(newname.."$")) then + newdata = io.loaddata(newscript) + if newdata then + input.report("old script content replaced by new content") + io.savedata(oldscript,newdata) + end + end +end + + +if not modules then modules = { } end modules ['luat-tmp'] = { + version = 1.001, + comment = "companion to luat-lib.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

This module deals with caching data. It sets up the paths and +implements loaders and savers for tables. Best is to set the +following variable. When not set, the usual paths will be +checked. Personally I prefer the (users) temporary path.

+ + +TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;. + + +

Currently we do no locking when we write files. This is no real +problem because most caching involves fonts and the chance of them +being written at the same time is small. We also need to extend +luatools with a recache feature.

+--ldx]]-- + +cache = cache or { } +dir = dir or { } +texmf = texmf or { } + +cache.path = nil +cache.base = cache.base or "luatex-cache" +cache.more = cache.more or "context" +cache.direct = false -- true is faster but may need huge amounts of memory +cache.trace = false +cache.tree = false +cache.temp = os.getenv("TEXMFCACHE") or os.getenv("HOME") or os.getenv("HOMEPATH") or os.getenv("VARTEXMF") or os.getenv("TEXMFVAR") or os.getenv("TMP") or os.getenv("TEMP") or os.getenv("TMPDIR") or nil +cache.paths = { cache.temp } + +if not cache.temp then + print("\nFATAL ERROR: NO VALID TEMPORARY PATH\n") + os.exit() +end + +function cache.configpath(instance) + return input.expand_var(instance,"TEXMFCNF") +end + +function cache.treehash(instance) + local tree = cache.configpath(instance) + if not tree or tree == "" then + return false + else + return md5.hex(tree) + end +end + +function cache.setpath(instance,...) + if not cache.path then + if lfs and instance then + for _,v in pairs(cache.paths) do + for _,vv in pairs(input.expanded_path_list(instance,v)) do + if lfs.isdir(vv) then + cache.path = vv + break + end + end + if cache.path then break end + end + end + if not cache.path then + cache.path = cache.temp + end + if lfs then + cache.tree = cache.tree or cache.treehash(instance) + if cache.tree then + cache.path = dir.mkdirs(cache.path,cache.base,cache.more,cache.tree) + else + cache.path = dir.mkdirs(cache.path,cache.base,cache.more) + end + end + end + if not cache.path then + cache.path = '.' + end + cache.path = input.clean_path(cache.path) + if lfs and not table.is_empty({...}) then + local pth = dir.mkdirs(cache.path,...) + return pth + end + return cache.path +end + +function cache.setluanames(path,name) + return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc" +end + +function cache.loaddata(path,name) + local tmaname, tmcname = cache.setluanames(path,name) + local loader = loadfile(tmcname) or loadfile(tmaname) + if loader then + return loader() + else + return false + end +end + +function cache.is_writable(filepath,filename) + local tmaname, tmcname = cache.setluanames(filepath,filename) + return file.is_writable(tmaname) +end + +function cache.savedata(filepath,filename,data,raw) -- raw needed for file cache + local tmaname, tmcname = cache.setluanames(filepath,filename) + local reduce, simplify = true, true + if raw then + reduce, simplify = false, false + end + if cache.direct then + file.savedata(tmaname, table.serialize(data,'return',true,true)) + else + table.tofile (tmaname, data,'return',true,true) -- maybe not the last true + end + utils.lua.compile(tmaname, tmcname) +end + +-- here we use the cache for format loading (texconfig.[formatname|jobname]) + +if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then + if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end + texconfig.formatname = cache.setpath(instance,"format") .. "/" .. texconfig.luaname:gsub("%.lu.$",".fmt") +end + +--[[ldx-- +

Once we found ourselves defining similar cache constructs +several times, containers were introduced. Containers are used +to collect tables in memory and reuse them when possible based +on (unique) hashes (to be provided by the calling function).

+ +

Caching to disk is disabled by default. Version numbers are +stored in the saved table which makes it possible to change the +table structures without bothering about the disk cache.

+ +

Examples of usage can be found in the font related code.

+--ldx]]-- + +containers = { } +containers.trace = false + +do -- local report + + local function report(container,tag,name) + if cache.trace or containers.trace or container.trace then + logs.report(string.format("%s cache",container.subcategory),string.format("%s: %s",tag,name or 'invalid')) + end + end + + function containers.define(category, subcategory, version, enabled) + if category and subcategory then + return { + category = category, + subcategory = subcategory, + storage = { }, + enabled = enabled, + version = version or 1.000, + trace = false, + path = cache.setpath(texmf.instance,category,subcategory), + } + else + return nil + end + end + + function containers.is_usable(container, name) + return container.enabled and cache.is_writable(container.path, name) + end + + function containers.is_valid(container, name) + if name and name ~= "" then + local cs = container.storage[name] + return cs and not table.is_empty(cs) and cs.cache_version == container.version + else + return false + end + end + + function containers.read(container,name) + if container.enabled and not container.storage[name] then + container.storage[name] = cache.loaddata(container.path,name) + if containers.is_valid(container,name) then + report(container,"loaded",name) + else + container.storage[name] = nil + end + end + if container.storage[name] then + report(container,"reusing",name) + end + return container.storage[name] + end + + function containers.write(container, name, data) + if data then + data.cache_version = container.version + if container.enabled then + local unique, shared = data.unique, data.shared + data.unique, data.shared = nil, nil + cache.savedata(container.path, name, data) + report(container,"saved",name) + data.unique, data.shared = unique, shared + end + report(container,"stored",name) + container.storage[name] = data + end + return data + end + + function containers.content(container,name) + return container.storage[name] + end + +end + +-- since we want to use the cache instead of the tree, we will now +-- reimplement the saver. + +input.usecache = true + +function input.aux.save_data(instance, dataname, check) + for cachename, files in pairs(instance[dataname]) do + local name + if input.usecache then + name = file.join(cache.setpath(instance,"trees"),md5.hex(cachename)) + else + name = file.join(cachename,dataname) + end + local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix + input.report("preparing " .. dataname .. " in", luaname) + for k, v in pairs(files) do + if not check or check(v,k) then -- path, name + if #v == 1 then + files[k] = v[1] + end + else + files[k] = nil -- false + end + end + local data = { + type = dataname, + root = cachename, + version = input.cacheversion, + date = os.date("%Y-%m-%d"), + time = os.date("%H:%M:%S"), + content = files, + } + local f = io.open(luaname,'w') + if f then + input.report("saving " .. dataname .. " in", luaname) + -- f:write(table.serialize(data,'return')) + f:write(input.serialize(data)) + f:close() + input.report("compiling " .. dataname .. " to", lucname) + if not utils.lua.compile(luaname,lucname) then + input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname) + os.remove(lucname) + end + else + input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix) + end + end +end + +function input.serialize(files) + -- This version is somewhat optimized for the kind of + -- tables that we deal with, so it's much faster than + -- the generic serializer. This makes sense because + -- luatools and mtxtools are called frequently. Okay, + -- we pay a small price for properly tabbed tables. + local t = { } + local concat = table.concat + local sorted = table.sortedkeys + local function dump(k,v,m) + if type(v) == 'string' then + return m .. "['" .. k .. "']='" .. v .. "'," + elseif #v == 1 then + return m .. "['" .. k .. "']='" .. v[1] .. "'," + else + return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'}," + end + end + t[#t+1] = "return {" + if instance.sortdata then + for _, k in pairs(sorted(files)) do + local fk = files[k] + if type(fk) == 'table' then + t[#t+1] = "\t['" .. k .. "']={" + for _, kk in pairs(sorted(fk)) do + t[#t+1] = dump(kk,fk[kk],"\t\t") + end + t[#t+1] = "\t}," + else + t[#t+1] = dump(k,fk,"\t") + end + end + else + for k, v in pairs(files) do + if type(v) == 'table' then + t[#t+1] = "\t['" .. k .. "']={" + for kk,vv in pairs(v) do + t[#t+1] = dump(kk,vv,"\t\t") + end + t[#t+1] = "\t}," + else + t[#t+1] = dump(k,v,"\t") + end + end + end + t[#t+1] = "}" + return concat(t,"\n") +end + +function input.aux.load_data(instance,pathname,dataname,filename) + local luaname, lucname, pname, fname + if input.usecache then + pname, fname = cache.setpath(instance,"trees"), md5.hex(pathname) + filename = file.join(pname,fname) + else + if not filename or (filename == "") then + filename = dataname + end + pname, fname = pathname, filename + end + luaname = file.join(pname,fname) .. input.luasuffix + lucname = file.join(pname,fname) .. input.lucsuffix + local blob = loadfile(lucname) + if not blob then + blob = loadfile(luaname) + end + if blob then + local data = blob() + if data and data.content and data.type == dataname and data.version == input.cacheversion then + input.report("loading",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = data.content + else + input.report("skipping",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = { } + instance.loaderror = true + end + else + input.report("skipping",dataname,"for",pathname,"from",filename) + end +end + +-- we will make a better format, maybe something xml or just text + +input.automounted = input.automounted or { } + +function input.automount(instance,usecache) + local mountpaths = input.simplified_list(input.expansion(instance,'TEXMFMOUNT')) + if table.is_empty(mountpaths) and usecache then + mountpaths = { cache.setpath(instance,"mount") } + end + if not table.is_empty(mountpaths) then + input.starttiming(instance) + for k, root in pairs(mountpaths) do + local f = io.open(root.."/url.tmi") + if f then + for line in f:lines() do + if line then + if line:find("^[%%#%-]") then -- or %W + -- skip + elseif line:find("^zip://") then + input.report("mounting",line) + table.insert(input.automounted,line) + input.usezipfile(instance,line) + end + end + end + f:close() + end + end + input.stoptiming(instance) + end +end + +-- store info in format + +input.storage = { } +input.storage.data = { } +input.storage.min = 0 -- 500 +input.storage.max = input.storage.min - 1 +input.storage.trace = false -- true +input.storage.done = 0 +input.storage.evaluators = { } +-- (evaluate,message,names) + +function input.storage.register(...) + input.storage.data[#input.storage.data+1] = { ... } +end + +function input.storage.evaluate(name) + input.storage.evaluators[#input.storage.evaluators+1] = name +end + +function input.storage.finalize() -- we can prepend the string with "evaluate:" + for _, t in ipairs(input.storage.evaluators) do + for i, v in pairs(t) do + if type(v) == "string" then + t[i] = loadstring(v)() + elseif type(v) == "table" then + for _, vv in pairs(v) do + if type(vv) == "string" then + t[i] = loadstring(vv)() + end + end + end + end + end +end + +function input.storage.dump() + for name, data in ipairs(input.storage.data) do + local evaluate, message, original, target = data[1], data[2], data[3] ,data[4] + local name, initialize, finalize = nil, "", "" + for str in string.gmatch(target,"([^%.]+)") do + if name then + name = name .. "." .. str + else + name = str + end + initialize = string.format("%s %s = %s or {} ", initialize, name, name) + end + if evaluate then + finalize = "input.storage.evaluate(" .. name .. ")" + end + input.storage.max = input.storage.max + 1 + if input.storage.trace then + logs.report('storage',string.format('saving %s in slot %s',message,input.storage.max)) + lua.bytecode[input.storage.max] = loadstring( + initialize .. + string.format("logs.report('storage','restoring %s from slot %s') ",message,input.storage.max) .. + table.serialize(original,name) .. + finalize + ) + else + lua.bytecode[input.storage.max] = loadstring(initialize .. table.serialize(original,name) .. finalize) + end + end +end + +if lua.bytecode then -- from 0 upwards + local i = input.storage.min + while lua.bytecode[i] do + lua.bytecode[i]() + lua.bytecode[i] = nil + i = i + 1 + end + input.storage.done = i +end + + +-- filename : luat-zip.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-zip'] = 1.001 + +if zip and input then + zip.supported = true +else + zip = { } + zip.supported = false +end + +if not zip.supported then + + if not input then input = { } end -- will go away + + function zip.openarchive (...) return nil end -- needed ? + function zip.closenarchive (...) end -- needed ? + function input.registerzipfile (...) end -- needed ? + function input.usezipfile (...) end -- needed ? + +else + + function input.locators.zip(instance,specification) + local name, spec = specification:match("^(.-)##(.-)$") + local f = io.open(name or specification) + if f then -- todo: reuse code + input.logger('! zip locator', specification..' found') + if name and spec then + input.aux.append_hash(instance,'zip',"zip##"..specification,name) + input.aux.extend_texmf_var(instance, "zip##"..specification) + else + input.aux.append_hash(instance,'zip',"zip##"..specification.."##",specification) + input.aux.extend_texmf_var(instance, "zip##"..specification.."##") + end + f:close() + else + input.logger('? zip locator', specification..' not found') + end + end + + function input.hashers.zip(instance,tag,name) + input.report("loading zip file",name,"as",tag) + input.registerzipfile(instance,name,tag) + end + + function input.concatinators.zip(tag,path,name) + return tag .. path .. '/' .. name + end + + function input.is_readable.zip(name) + return true + end + + function input.finders.zip(instance,filename,filetype) + local archive, dataname = filename:match("^(.+)##/*(.+)$") + if archive and dataname then + local zfile = zip.openarchive(archive) + if not zfile then + archive = input.find_file(instance,archive,filetype) + zfile = zip.openarchive(archive) + end + if zfile then + input.logger('! zip finder',archive) + local dfile = zfile:open(dataname) + if dfile then + dfile = zfile:close() + input.logger('+ zip finder',filename) + return 'zip##' .. filename + end + else + input.logger('? zip finder',archive) + end + end + input.logger('- zip finder',filename) + return unpack(input.finders.notfound) + end + + function input.openers.zip(instance,filename) + if filename and filename ~= "" then + local archive, dataname = filename:match("^(.-)##/*(.+)$") + if archive and dataname then + local zfile= zip.openarchive(archive) + if zfile then + input.logger('+ zip starter',archive) + local dfile = zfile:open(dataname) + if dfile then + input.show_open(filename) + return input.openers.text_opener(filename,dfile,'zip') + end + else + input.logger('- zip starter',archive) + end + end + end + input.logger('- zip opener',filename) + return unpack(input.openers.notfound) + end + + function input.loaders.zip(instance, filename) -- we could use input.openers.zip + if filename and filename ~= "" then + input.logger('= zip loader',filename) + local archive, dataname = filename:match("^(.+)##/*(.+)$") + if archive and dataname then + local zfile = zip.openarchive(archive) + if zfile then + input.logger('= zip starter',archive) + local dfile = zfile:open(dataname) + if dfile then + input.show_load(filename) + input.logger('+ zip loader',filename) + local s = dfile:read("*all") + dfile:close() + return true, s, #s + end + else + input.logger('- zip starter',archive) + end + end + end + input.logger('- zip loader',filename) + return unpack(input.loaders.notfound) + end + + zip.archives = { } + zip.registeredfiles = { } + + function zip.openarchive(name) + if name and name ~= "" and not zip.archives[name] then + zip.archives[name] = zip.open(name) + end + return zip.archives[name] + end + + function zip.closearchive(name) + if zip.archives[name] then + zip.close(archives[name]) + zip.archives[name] = nil + end + end + + -- aparte register maken voor user (register tex / zip), runtime tree register + -- todo: alleen url syntax toestaan + -- user function: also handle zip::name::path + + function input.usezipfile(instance,zipname) -- todo zip:// + zipname = input.normalize_name(zipname) + if not zipname:find("^zip##") then + zipname = "zip##"..zipname + end + input.logger('! zip user','file '..zipname) + if not zipname:find("^zip##(.+)##(.-)$") then + zipname = zipname .. "##" -- dummy spec + end + local tag = zipname + local name = zipname:match("zip##(.+)##.-") + input.aux.prepend_hash(instance,'zip',tag,name) + input.aux.extend_texmf_var(instance, tag) + input.registerzipfile(instance,name,tag) + end + + function input.registerzipfile(instance,zipname,tag) + if not zip.registeredfiles[zipname] then + input.start_timing(instance) + local z = zip.open(zipname) + if not z then + zipname = input.find_file(instance,zipname) + z = zip.open(zipname) + end + if z then + input.logger("= zipfile","registering "..zipname) + zip.registeredfiles[zipname] = z + input.aux.register_zip_file(instance,zipname,tag) + else + input.logger("? zipfile","unknown "..zipname) + end + input.stop_timing(instance) + end + end + + function input.aux.register_zip_file(instance,zipname,tagname) + if zip.registeredfiles[zipname] then + if not tagname:find("^zip##") then + tagname = "zip##" .. tagname + end + local path, name, n = nil, nil, 0 + if not instance.files[tagname] then + instance.files[tagname] = { } + end + local files, filter = instance.files[tagname], "" + local subtree = tagname:match("^zip##.+##(.+)$") + if subtree then + filter = "^"..subtree.."/(.+)/(.-)$" + else + filter = "^(.+)/(.-)$" + end + input.logger('= zip filter',filter) + -- we can consider putting a files.luc in the file + local register = input.aux.register_file + for i, _ in zip.registeredfiles[zipname]:files() do + path, name = i.filename:match(filter) + if path then + if name and name ~= '' then + register(files, name, path) + n = n + 1 + else + -- directory + end + else + register(files, i.filename, '') + n = n + 1 + end + end + input.report(n, 'entries in', zipname) + end + end + +end + + +-- filename : luat-zip.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-tex'] = 1.001 + +-- special functions that deal with io + +if texconfig and not texlua then + + input.level = input.level or 0 + + if input.logmode() == 'xml' then + function input.show_open(name) + input.level = input.level + 1 + texio.write_nl("") + end + function input.show_close(name) + texio.write(" ") + input.level = input.level - 1 + end + function input.show_load(name) + texio.write_nl("") -- level? + end + else + function input.show_open () end + function input.show_close() end + function input.show_load () end + end + + function input.finders.generic(instance,tag,filename,filetype) + local foundname = input.find_file(instance,filename,filetype) + if foundname and foundname ~= "" then + input.logger('+ ' .. tag .. ' finder',filename,'filetype') + return foundname + else + input.logger('- ' .. tag .. ' finder',filename,'filetype') + return unpack(input.finders.notfound) + end + end + + input.filters.dynamic_translator = nil + input.filters.frozen_translator = nil + input.filters.utf_translator = nil + + function input.openers.text_opener(filename,file_handle,tag) + local u = unicode.utftype(file_handle) + local t = { } + if u > 0 then + input.logger('+ ' .. tag .. ' opener (' .. unicode.utfname[u] .. ')',filename) + local l + if u > 2 then + l = unicode.utf32_to_utf8(file_handle:read("*a"),u==4) + else + l = unicode.utf16_to_utf8(file_handle:read("*a"),u==2) + end + file_handle:close() + t = { + utftype = u, -- may go away + lines = l, + current = 0, + handle = nil, + noflines = #l, + close = function() + input.logger('= ' .. tag .. ' closer (' .. unicode.utfname[u] .. ')',filename) + input.show_close(filename) + end, + reader = function(self) + if not self then self = t end + if self.current >= #self.lines then + return nil + else + self.current = self.current + 1 + if input.filters.utf_translator then + return input.filters.utf_translator(self.lines[t.current]) + else + return self.lines[self.current] + end + end + end + } + else + input.logger('+ ' .. tag .. ' opener',filename) + -- todo: file;name -> freeze / eerste regel scannen -> freeze + t = { + reader = function(self) + if not self then self = t end -- not used + if input.filters.dynamic_translator then + return input.filters.dynamic_translator(file_handle:read()) + elseif input.filters.utf_translator then + return input.filters.utf_translator(file_handle:read()) + else + return file_handle:read() + end + end, + close = function() + input.logger('= ' .. tag .. ' closer',filename) + input.show_close(filename) + file_handle:close() + end, + handle = function() + return file_handle + end, + noflines = function() + t.noflines = io.noflines(file_handle) + return t.noflines + end + } + end + return t + end + + function input.openers.generic(instance,tag,filename) + if filename and filename ~= "" then + local f = io.open(filename,"r") + if f then + input.show_open(filename) + return input.openers.text_opener(filename,f,tag) + end + end + input.logger('- ' .. tag .. ' opener',filename) + return unpack(input.openers.notfound) + end + + function input.loaders.generic(instance,tag,filename) + if filename and filename ~= "" then + local f = io.open(filename,"rb") + if f then + input.show_load(filename) + input.logger('+ ' .. tag .. ' loader',filename) + local s = f:read("*a") + f:close() + if s then + return true, s, #s + end + end + end + input.logger('- ' .. tag .. ' loader',filename) + return unpack(input.loaders.notfound) + end + + function input.finders.tex(instance,filename,filetype) + return input.finders.generic(instance,'tex',filename,filetype) + end + function input.openers.tex(instance,filename) + return input.openers.generic(instance,'tex',filename) + end + function input.loaders.tex(instance,filename) + return input.loaders.generic(instance,'tex',filename) + end + +end + +-- callback into the file io and related things; disabling kpse + +if texconfig and not texlua then + + texconfig.kpse_init = false + texconfig.trace_file_names = input.logmode() == 'tex' + texconfig.max_print_line = 100000 + + -- if still present, we overload kpse (put it off-line so to say) + + if not texmf then texmf = { } end + + if not texmf.instance then + + if not texmf.instance then -- prevent a second loading + + texmf.instance = input.reset() + texmf.instance.progname = environment.progname or 'context' + texmf.instance.engine = environment.engine or 'luatex' + texmf.instance.validfile = input.validctxfile + + input.load(texmf.instance) + + end + + if callback then + callback.register('find_read_file' , function(id,name) return input.findtexfile(texmf.instance,name) end) + callback.register('open_read_file' , function( name) return input.opentexfile(texmf.instance,name) end) + end + + if callback then + callback.register('find_data_file' , function(name) return input.findbinfile(texmf.instance,name,"tex") end) + callback.register('find_enc_file' , function(name) return input.findbinfile(texmf.instance,name,"enc") end) + callback.register('find_font_file' , function(name) return input.findbinfile(texmf.instance,name,"tfm") end) + callback.register('find_format_file' , function(name) return input.findbinfile(texmf.instance,name,"fmt") end) + callback.register('find_image_file' , function(name) return input.findbinfile(texmf.instance,name,"tex") end) + callback.register('find_map_file' , function(name) return input.findbinfile(texmf.instance,name,"map") end) + callback.register('find_ocp_file' , function(name) return input.findbinfile(texmf.instance,name,"ocp") end) + callback.register('find_opentype_file' , function(name) return input.findbinfile(texmf.instance,name,"otf") end) + callback.register('find_output_file' , function(name) return name end) + callback.register('find_pk_file' , function(name) return input.findbinfile(texmf.instance,name,"pk") end) + callback.register('find_sfd_file' , function(name) return input.findbinfile(texmf.instance,name,"sfd") end) + callback.register('find_truetype_file' , function(name) return input.findbinfile(texmf.instance,name,"ttf") end) + callback.register('find_type1_file' , function(name) return input.findbinfile(texmf.instance,name,"pfb") end) + callback.register('find_vf_file' , function(name) return input.findbinfile(texmf.instance,name,"vf") end) + + callback.register('read_data_file' , function(file) return input.loadbinfile(texmf.instance,file,"tex") end) + callback.register('read_enc_file' , function(file) return input.loadbinfile(texmf.instance,file,"enc") end) + callback.register('read_font_file' , function(file) return input.loadbinfile(texmf.instance,file,"tfm") end) + -- format + -- image + callback.register('read_map_file' , function(file) return input.loadbinfile(texmf.instance,file,"map") end) + callback.register('read_ocp_file' , function(file) return input.loadbinfile(texmf.instance,file,"ocp") end) + callback.register('read_opentype_file' , function(file) return input.loadbinfile(texmf.instance,file,"otf") end) + -- output + callback.register('read_pk_file' , function(file) return input.loadbinfile(texmf.instance,file,"pk") end) + callback.register('read_sfd_file' , function(file) return input.loadbinfile(texmf.instance,file,"sfd") end) + callback.register('read_truetype_file' , function(file) return input.loadbinfile(texmf.instance,file,"ttf") end) + callback.register('read_type1_file' , function(file) return input.loadbinfile(texmf.instance,file,"pfb") end) + callback.register('read_vf_file' , function(file) return input.loadbinfile(texmf.instance,file,"vf" ) end) + end + + if callback and environment.aleph_mode then + callback.register('find_font_file' , function(name) return input.findbinfile(texmf.instance,name,"ofm") end) + callback.register('read_font_file' , function(file) return input.loadbinfile(texmf.instance,file,"ofm") end) + callback.register('find_vf_file' , function(name) return input.findbinfile(texmf.instance,name,"ovf") end) + callback.register('read_vf_file' , function(file) return input.loadbinfile(texmf.instance,file,"ovf") end) + end + + if callback then + callback.register('find_write_file' , function(id,name) return name end) + end + + if callback and (not config or (#config == 0)) then + callback.register('find_format_file' , function(name) return name end) + end + + if callback and false then + for k, v in pairs(callback.list()) do + if not v then texio.write_nl("callback "..k.." is not set") end + end + end + + if callback then + + input.start_actions = { } + input.stop_actions = { } + + function input.register_start_actions(f) table.insert(input.start_actions, f) end + function input.register_stop_actions (f) table.insert(input.stop_actions, f) end + +--~ callback.register('start_run', function() for _, a in pairs(input.start_actions) do a() end end) +--~ callback.register('stop_run' , function() for _, a in pairs(input.stop_actions ) do a() end end) + + end + + if callback and (input.logmode() == 'xml') then + + function input.start_page_number() + texio.write_nl("

") + texio.write_nl("") + end + + callback.register('start_page_number' , input.start_page_number) + callback.register('stop_page_number' , input.stop_page_number ) + + function input.report_output_pages(p,b) + texio.write_nl(""..p.."") + texio.write_nl(""..b.."") + texio.write_nl("") + end + function input.report_output_log() + end + + callback.register('report_output_pages', input.report_output_pages) + callback.register('report_output_log' , input.report_output_log ) + + function input.start_run() + texio.write_nl("") + texio.write_nl("") + texio.write_nl("") + end + function input.stop_run() + texio.write_nl("") + end + function input.show_statistics() + for k,v in pairs(status.list()) do + texio.write_nl("log",""..tostring(v).."") + end + end + + table.insert(input.start_actions, input.start_run) + + table.insert(input.stop_actions, input.show_statistics) + table.insert(input.stop_actions, input.stop_run) + + function input.start_run() for _, a in pairs(input.start_actions) do a() end end + function input.stop_run () for _, a in pairs(input.stop_actions ) do a() end end + + callback.register('start_run', input.start_run) + callback.register('stop_run' , input.stop_run ) + + end + + end + + if kpse then + + function kpse.find_file(filename,filetype,mustexist) + return input.find_file(texmf.instance,filename,filetype,mustexist) + end + function kpse.expand_path(variable) + return input.expand_path(texmf.instance,variable) + end + function kpse.expand_var(variable) + return input.expand_var(texmf.instance,variable) + end + function kpse.expand_braces(variable) + return input.expand_braces(texmf.instance,variable) + end + + end + +end + +-- program specific configuration (memory settings and alike) + +if texconfig and not texlua then + + if not luatex then luatex = { } end + + luatex.variablenames = { + 'main_memory', 'extra_mem_bot', 'extra_mem_top', + 'buf_size', + 'font_max', 'font_mem_size', + 'hash_extra', 'max_strings', 'pool_free', 'pool_size', 'string_vacancies', + 'obj_tab_size', 'pdf_mem_size', 'dest_names_size', + 'nest_size', 'param_size', 'save_size', 'stack_size', + 'trie_size', 'hyph_size', + 'ocp_stack_size', 'ocp_list_size', 'ocp_buf_size' + } + + function luatex.variables() + local t, x = { }, nil + for _,v in pairs(luatex.variablenames) do + x = input.var_value(texmf.instance,v) + if x and x:find("^%d+$") then + t[v] = tonumber(x) + end + end + return t + end + + function luatex.setvariables(tab) + for k,v in pairs(luatex.variables()) do + tab[k] = v + end + end + + if not luatex.variables_set then + luatex.setvariables(texconfig) + luatex.variables_set = true + end + + texconfig.max_print_line = 100000 + +end + +-- some tex basics + +if not cs then cs = { } end + +function cs.def(k,v) + tex.sprint(tex.texcatcodes, "\\def\\" .. k .. "{" .. v .. "}") +end + +function cs.chardef(k,v) + tex.sprint(tex.texcatcodes, "\\chardef\\" .. k .. "=" .. v .. "\\relax") +end + +function cs.boolcase(b) + if b then tex.write(1) else tex.write(0) end +end + +function cs.testcase(b) + if b then + tex.sprint(tex.texcatcodes, "\\firstoftwoarguments") + else + tex.sprint(tex.texcatcodes, "\\secondoftwoarguments") + end +end + + +if not modules then modules = { } end modules ['luat-kps'] = { + version = 1.001, + comment = "companion to luatools.lua", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

This file is used when we want the input handlers to behave like +kpsewhich. What to do with the following:

+ + +{$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c} +$SELFAUTOLOC : /usr/tex/bin/platform +$SELFAUTODIR : /usr/tex/bin +$SELFAUTOPARENT : /usr/tex + + +

How about just forgetting abou them?

+--ldx]]-- + +input = input or { } +input.suffixes = input.suffixes or { } +input.formats = input.formats or { } + +input.suffixes['gf'] = { 'gf' } +input.suffixes['pk'] = { 'pk' } +input.suffixes['base'] = { 'base' } +input.suffixes['bib'] = { 'bib' } +input.suffixes['bst'] = { 'bst' } +input.suffixes['cnf'] = { 'cnf' } +input.suffixes['mem'] = { 'mem' } +input.suffixes['mf'] = { 'mf' } +input.suffixes['mfpool'] = { 'pool' } +input.suffixes['mft'] = { 'mft' } +input.suffixes['mppool'] = { 'pool' } +input.suffixes['graphic/figure'] = { 'eps', 'epsi' } +input.suffixes['texpool'] = { 'pool' } +input.suffixes['PostScript header'] = { 'pro' } +input.suffixes['ist'] = { 'ist' } +input.suffixes['web'] = { 'web', 'ch' } +input.suffixes['cweb'] = { 'w', 'web', 'ch' } +input.suffixes['cmap files'] = { 'cmap' } +input.suffixes['lig files'] = { 'lig' } +input.suffixes['bitmap font'] = { } +input.suffixes['MetaPost support'] = { } +input.suffixes['TeX system documentation'] = { } +input.suffixes['TeX system sources'] = { } +input.suffixes['dvips config'] = { } +input.suffixes['type42 fonts'] = { } +input.suffixes['web2c files'] = { } +input.suffixes['other text files'] = { } +input.suffixes['other binary files'] = { } +input.suffixes['opentype fonts'] = { 'otf' } + +input.suffixes['fmt'] = { 'fmt' } +input.suffixes['texmfscripts'] = { 'rb','lua','py','pl' } + +input.suffixes['pdftex config'] = { } +input.suffixes['Troff fonts'] = { } + +input.suffixes['ls-R'] = { } + +--[[ldx-- +

If you wondered abou tsome of the previous mappings, how about +the next bunch:

+--ldx]]-- + +input.formats['bib'] = '' +input.formats['bst'] = '' +input.formats['mft'] = '' +input.formats['ist'] = '' +input.formats['web'] = '' +input.formats['cweb'] = '' +input.formats['MetaPost support'] = '' +input.formats['TeX system documentation'] = '' +input.formats['TeX system sources'] = '' +input.formats['Troff fonts'] = '' +input.formats['dvips config'] = '' +input.formats['graphic/figure'] = '' +input.formats['ls-R'] = '' +input.formats['other text files'] = '' +input.formats['other binary files'] = '' + +input.formats['gf'] = '' +input.formats['pk'] = '' +input.formats['base'] = 'MFBASES' +input.formats['cnf'] = '' +input.formats['mem'] = 'MPMEMS' +input.formats['mf'] = 'MFINPUTS' +input.formats['mfpool'] = 'MFPOOL' +input.formats['mppool'] = 'MPPOOL' +input.formats['texpool'] = 'TEXPOOL' +input.formats['PostScript header'] = 'TEXPSHEADERS' +input.formats['cmap files'] = 'CMAPFONTS' +input.formats['type42 fonts'] = 'T42FONTS' +input.formats['web2c files'] = 'WEB2C' +input.formats['pdftex config'] = 'PDFTEXCONFIG' +input.formats['texmfscripts'] = 'TEXMFSCRIPTS' +input.formats['bitmap font'] = '' +input.formats['lig files'] = 'LIGFONTS' + + +-- end library merge + +-- We initialize some characteristics of this program. We need to +-- do this before we load the libraries, else own.name will not be +-- properly set (handy for selfcleaning the file). It's an ugly +-- looking piece of code. + +own = { } + +own.libs = { -- todo: check which ones are really needed + 'l-string.lua', + 'l-table.lua', + 'l-io.lua', + 'l-number.lua', + 'l-os.lua', + 'l-md5.lua', + 'l-file.lua', + 'l-dir.lua', + 'l-boolean.lua', + 'l-unicode.lua', + 'l-utils.lua', + 'luat-lib.lua', + 'luat-inp.lua', + 'luat-tmp.lua', + 'luat-zip.lua', + 'luat-tex.lua', + 'luat-kps.lua', +} + +-- We need this hack till luatex is fixed. + +if arg and arg[0] == 'luatex' and arg[1] == "--luaonly" then + arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil +end + +-- End of hack. + +own.name = (environment and environment.ownname) or arg[0] or 'luatools.lua' +own.path = string.match(own.name,"^(.+)[\\/].-$") or "." +own.list = { '.' } + +if own.path ~= '.' then + table.insert(own.list,own.path) +end + +table.insert(own.list,own.path.."/../../../tex/context/base") +table.insert(own.list,own.path.."/mtx") +table.insert(own.list,own.path.."/../sources") + +function locate_libs() + for _, lib in pairs(own.libs) do + for _, pth in pairs(own.list) do + local filename = string.gsub(pth .. "/" .. lib,"\\","/") + local codeblob = loadfile(filename) + if codeblob then + codeblob() + own.list = { pth } -- speed up te search + break + end + end + end +end + +if not input then + locate_libs() +end + +if not input then + print("") + print("Luatools is unable to start up due to lack of libraries. You may") + print("try to run 'lua luatools.lua --selfmerge' in the path where this") + print("script is located (normally under ..../scripts/context/lua) which") + print("will make luatools library independent.") + os.exit() +end + +instance = input.reset() +input.verbose = environment.arguments["verbose"] or false +input.banner = 'LuaTools | ' +utils.report = input.report + +input.defaultlibs = { -- not all are needed + 'l-string.lua', 'l-table.lua', 'l-boolean.lua', 'l-number.lua', 'l-unicode.lua', + 'l-md5.lua', 'l-os.lua', 'l-io.lua', 'l-file.lua', 'l-dir.lua', 'l-utils.lua', 'l-tex.lua', + 'luat-lib.lua', 'luat-inp.lua', 'luat-tmp.lua', 'luat-zip.lua', 'luat-tex.lua' +} + +-- todo: use environment.argument() instead of environment.arguments[] + +instance.engine = environment.arguments["engine"] or 'luatex' +instance.progname = environment.arguments["progname"] or 'context' +instance.luaname = environment.arguments["luafile"] or "" -- environment.ownname or "" +instance.lualibs = environment.arguments["lualibs"] or table.concat(input.defaultlibs,",") +instance.allresults = environment.arguments["all"] or false +instance.pattern = environment.arguments["pattern"] or nil +instance.sortdata = environment.arguments["sort"] or false +instance.kpseonly = not environment.arguments["all"] or false +instance.my_format = environment.arguments["format"] or instance.format +instance.lsrmode = environment.arguments["lsr"] or false + +if environment.arguments["trace"] then input.settrace(environment.arguments["trace"]) end + +if environment.arguments["minimize"] then + if input.validators.visibility[instance.progname] then + instance.validfile = input.validators.visibility[instance.progname] + end +end + +function input.my_prepare_a(instance) + input.identify_cnf(instance) + input.load_cnf(instance) + input.expand_variables(instance) +end + +function input.my_prepare_b(instance) + input.my_prepare_a(instance) + input.load_hash(instance) + input.automount(instance) +end + +-- barename + +if not messages then messages = { } end + +messages.no_ini_file = [[ +There is no lua initialization file found. This file can be forced by the +"--progname" directive, or specified with "--luaname", or it is derived +automatically from the formatname (aka jobname). It may be that you have +to regenerate the file database using "luatools --generate". +]] + +messages.help = [[ +--generate generate file database +--variables show configuration variables +--expansions show expanded variables +--configurations show configuration order +--expand-braces expand complex variable +--expand-path expand variable (resolve paths) +--expand-var expand variable (resolve references) +--show-path show path expansion of ... +--var-value report value of variable +--find-file report file location +--make or --ini make luatex format +--run or --fmt= run luatex format +--luafile=str lua inifile (default is .lua) +--lualibs=list libraries to assemble (optional when --compile) +--compile assemble and compile lua inifile +--mkii force context mkii mode (only for testing, not usable!) +--verbose give a bit more info +--minimize optimize lists for format +--all show all found files +--sort sort cached data +--engine=str target engine +--progname=str format or backend +--pattern=str filter variables +--lsr use lsr and cnf directly +]] + +function input.my_make_format(instance,texname) + if texname and texname ~= "" then + if input.usecache then + local path = file.join(cache.setpath(instance,"formats")) -- maybe platform + if path and lfs then + lfs.chdir(path) + end + end + local barename = texname:gsub("%.%a+$","") + if barename == texname then + texname = texname .. ".tex" + end + local fullname = input.find_files(instance,texname)[1] or "" + if fullname == "" then + input.report("no tex file with name",texname) + else + local luaname, lucname, luapath, lualibs = "", "", "", { } + -- the following is optional, since context.lua can also + -- handle this collect and compile business + if environment.arguments["compile"] then + if luaname == "" then luaname = barename end + input.report("creating initialization file " .. luaname) + luapath = file.dirname(luaname) + if luapath == "" then + luapath = file.dirname(texname) + end + if luapath == "" then + luapath = file.dirname(input.find_files(instance,texname)[1] or "") + end + lualibs = string.split(instance.lualibs,",") + luaname = file.basename(barename .. ".lua") + lucname = file.basename(barename .. ".luc") + -- todo: when this fails, we can just copy the merged libraries from + -- luatools since they are normally the same, at least for context + if lualibs[1] then + local firstlib = file.join(luapath,lualibs[1]) + if not lfs.isfile(firstlib) then + local foundname = input.find_files(instance,lualibs[1])[1] + if foundname then + input.report("located library path : " .. luapath) + luapath = file.dirname(foundname) + end + end + end + input.report("using library path : " .. luapath) + input.report("using lua libraries: " .. table.join(lualibs," ")) + utils.merger.selfcreate(lualibs,luapath,luaname) + if utils.lua.compile(luaname, lucname) and io.exists(lucname) then + luaname = lucname + input.report("using compiled initialization file " .. lucname) + else + input.report("using uncompiled initialization file " .. luaname) + end + else + for _, v in pairs({instance.luaname, instance.progname, barename}) do + v = string.gsub(v..".lua","%.lua%.lua$",".lua") + if v and (v ~= "") then + luaname = input.find_files(instance,v)[1] or "" + if luaname ~= "" then + break + end + end + end + end + if luaname == "" then + input.reportlines(messages.no_ini_file) + input.report("texname : " .. texname) + input.report("luaname : " .. instance.luaname) + input.report("progname : " .. instance.progname) + input.report("barename : " .. barename) + else + input.report("using lua initialization file " .. luaname) + local flags = { "--ini" } + if environment.arguments["mkii"] then + -- flags[#flags+1] = "--mkii" -- web2c error + flags[#flags+1] = "--progname=" .. instance.progname + else + flags[#flags+1] = "--lua=" .. string.quote(luaname) + -- flags[#flags+1] = "--progname=" .. instance.progname -- potential fallback + end + local command = "luatex ".. table.concat(flags," ") .. " " .. string.quote(fullname) .. " \\dump" + input.report("running command: " .. command .. "\n") + os.exec(command) + end + end + else + input.report("no tex file given") + end +end + +function input.my_run_format(instance,name,data) + if name and (name ~= "") then + local barename = name:gsub("%.%a+$","") + local fmtname = "" + if input.usecache then + local path = file.join(cache.setpath(instance,"formats")) -- maybe platform + fmtname = file.join(path,barename..".fmt") or "" + end + if fmtname == "" then + fmtname = input.find_files(instance,barename..".fmt")[1] or "" + end + fmtname = input.clean_path(fmtname) + local barename = fmtname:gsub("%.%a+$","") + if fmtname == "" then + input.report("no format with name",name) + else + local luaname = barename .. ".luc" + local f = io.open(luaname) + if not f then + luaname = barename .. ".lua" + f = io.open(luaname) + end + if f then + f:close() + -- bug, no .fmt ! + local command = "luatex --fmt=" .. string.quote(barename) .. " --lua=" .. string.quote(luaname) .. " " .. string.quote(data) + input.report("running command: " .. command) + os.exec(command) + else + input.report("using format name",fmtname) + input.report("no luc/lua with name",barename) + end + end + end +end + +input.report(banner,"\n") + +local ok = true + +if environment.arguments["selfmerge"] then + utils.merger.selfmerge(own.name,own.libs,own.list) +elseif environment.arguments["selfclean"] then + utils.merger.selfclean(own.name) +elseif environment.arguments["selfupdate"] then + input.my_prepare_b(instance) + input.verbose = true + input.update_script(own.name,"luatools") +elseif environment.arguments["generate"] then + instance.renewcache = true + input.verbose = true + input.my_prepare_b(instance) +elseif environment.arguments["make"] or environment.arguments["ini"] or environment.arguments["compile"] then + input.my_prepare_b(instance) + input.verbose = true + input.my_make_format(instance,environment.files[1] or "") +elseif environment.arguments["run"] then + input.my_prepare_a(instance) -- ! no need for loading databases + input.verbose = true + input.my_run_format(instance,environment.files[1] or "",environment.files[2] or "") +elseif environment.arguments["fmt"] then + input.my_prepare_a(instance) -- ! no need for loading databases + input.verbose = true + input.my_run_format(instance,environment.arguments["fmt"], environment.files[1] or "") +elseif environment.arguments["variables"] or environment.arguments["show-variables"] then + input.my_prepare_a(instance) + input.list_variables(instance) +elseif environment.arguments["expansions"] or environment.arguments["show-expansions"] then + input.my_prepare_a(instance) + input.list_expansions(instance) +elseif environment.arguments["configurations"] or environment.arguments["show-configurations"] then + input.my_prepare_a(instance) + input.list_configurations(instance) +elseif environment.arguments["expand-braces"] then + input.my_prepare_a(instance) + input.for_files(instance, input.expand_braces, environment.files) +elseif environment.arguments["expand-path"] then + input.my_prepare_a(instance) + input.for_files(instance, input.expand_path, environment.files) +elseif environment.arguments["expand-var"] or environment.arguments["expand-variable"] then + input.my_prepare_a(instance) + input.for_files(instance, input.expand_var, environment.files) +elseif environment.arguments["show-path"] or environment.arguments["path-value"] then + input.my_prepare_a(instance) + input.for_files(instance, input.show_path, environment.files) +elseif environment.arguments["var-value"] or environment.arguments["show-value"] then + input.my_prepare_a(instance) + input.for_files(instance, input.var_value, environment.files) +elseif environment.arguments["find-file"] then + input.my_prepare_b(instance) + instance.format = environment.arguments["format"] or instance.format + if environment.arguments["pattern"] then + instance.allresults = true + input.for_files(instance, input.find_files, { environment.arguments["pattern"] }, instance.my_format) + else + input.for_files(instance, input.find_files, environment.files, instance.my_format) + end +--~ elseif environment.arguments["first-writable-path"] then +--~ input.my_prepare_b(instance) +--~ input.report(input.first_writable_path(instance,environment.files[1] or ".")) +elseif environment.arguments["format-path"] then + input.my_prepare_b(instance) + input.report(cache.setpath(instance,"format")) +elseif environment.arguments["pattern"] then + input.my_prepare_b(instance) + instance.format = environment.arguments["format"] or instance.format + instance.allresults = true + input.for_files(instance, input.find_files, { environment.arguments["pattern"] }, instance.my_format) +elseif environment.arguments["help"] or (environment.files[1]=='help') or (#environment.files==0) then + if not input.verbose then + input.verbose = true + input.report(banner,"\n") + end + input.reportlines(messages.help) +else + input.my_prepare_b(instance) + input.for_files(instance, input.find_files, environment.files, instance.my_format) +end + +if input.verbose then + input.report("") + input.report("runtime: " .. os.clock() .. " seconds") +end + +--~ if ok then +--~ input.report("exit code: 0") os.exit(0) +--~ else +--~ input.report("exit code: 1") os.exit(1) +--~ end + +if environment.platform == "unix" then + io.write("\n") +end diff --git a/scripts/context/lua/mtx-cache.lua b/scripts/context/lua/mtx-cache.lua new file mode 100644 index 000000000..0b0983d1b --- /dev/null +++ b/scripts/context/lua/mtx-cache.lua @@ -0,0 +1,92 @@ +dofile(input.find_file(instance,"luat-log.lua")) + +texmf.instance = instance -- we need to get rid of this / maybe current instance in global table + +scripts = scripts or { } +scripts.cache = scripts.cache or { } + +function scripts.cache.collect_one(...) + local path = cache.setpath(instance,...) + local tmas = dir.glob(path .. "/*tma") + local tmcs = dir.glob(path .. "/*tmc") + return path, tmas, tmcs +end + +function scripts.cache.collect_two(...) + local path = cache.setpath(instance,...) + local rest = dir.glob(path .. "/**/*") + return path, rest +end + +function scripts.cache.process_one(action) + action("fonts", "afm") + action("fonts", "tfm") + action("fonts", "def") + action("fonts", "enc") + action("fonts", "otf") + action("fonts", "data") +end + +function scripts.cache.process_two(action) + action("curl") +end + +-- todo: recursive delete of paths + +function scripts.cache.remove(list,keep) + local keepsuffixes = { } + for _, v in ipairs(keep or {}) do + keepsuffixes[v] = true + end + local n = 0 + for _,filename in ipairs(list) do + if filename:find("luatex%-cache") then -- safeguard + if not keepsuffixes[file.extname(filename) or ""] then + os.remove(filename) + n = n + 1 + end + end + end + return n +end + +function scripts.cache.delete(all,keep) + local function action(...) + local path, rest = scripts.cache.collect_two(...) + local n = scripts.cache.remove(rest,keep) + logs.report("cache path",string.format("%4i files out of %4i deleted on %s",n,#rest,path)) + end + scripts.cache.process_one(action) + scripts.cache.process_two(action) +end + +function scripts.cache.list(all) + scripts.cache.process_one(function(...) + local path, tmas, tmcs = scripts.cache.collect_one(...) + logs.report("cache path",string.format("tma:%4i tmc:%4i %s",#tmas,#tmcs,path)) + end) + scripts.cache.process_two(function(...) + local path, rest = scripts.cache.collect_two("curl") + logs.report("cache path",string.format("all:%4i %s",#rest,path)) + end) +end + +banner = banner .. " | cache tools " + +messages.help = [[ +--purge remove not used files +--erase completely remove cache +--list show cache + +--all all (not yet implemented) +]] + +if environment.argument("purge") then + scripts.cache.delete(environment.argument("all"),{"tmc"}) +elseif environment.argument("erase") then + scripts.cache.delete(environment.argument("all")) +elseif environment.argument("list") then + scripts.cache.list(environment.argument("all")) +else + input.help(banner,messages.help) +end diff --git a/scripts/context/lua/mtx-fonts.lua b/scripts/context/lua/mtx-fonts.lua new file mode 100644 index 000000000..10211fe22 --- /dev/null +++ b/scripts/context/lua/mtx-fonts.lua @@ -0,0 +1,90 @@ +dofile(input.find_file(instance,"luat-log.lua")) +dofile(input.find_file(instance,"font-syn.lua")) + +texmf.instance = instance -- we need to get rid of this / maybe current instance in global table + +scripts = scripts or { } +scripts.fonts = scripts.fonts or { } + +function scripts.fonts.list(pattern,reload,all) + if reload then + logs.report("fontnames","reloading font database") + end + local t = fonts.names.list(pattern,reload) + if reload then + logs.report("fontnames","done\n\n") + end + if t then + local s, w = table.sortedkeys(t), { 0, 0, 0 } + local function action(f) + for k,v in pairs(s) do + if all or v == t[v][2]:lower() then + local type, name, file, sub = unpack(t[v]) + f(v,name,file,sub) + end + end + end + action(function(v,n,f,s) + if #v > w[1] then w[1] = #v end + if #n > w[2] then w[2] = #n end + if #f > w[3] then w[3] = #f end + end) + action(function(v,n,f,s) + if s then s = "(sub)" else s = "" end + print(string.format("%s %s %s %s",v:padd(w[1]," "),n:padd(w[2]," "),f:padd(w[3]," "), s)) + end) + end +end + +function scripts.fonts.save(name,sub) + local function save(savename,fontblob) + if fontblob then + savename = savename:lower() .. ".lua" + logs.report("fontsave","saving data in " .. savename) + table.tofile(savename,fontforge.to_table(fontblob),"return") + fontforge.close(fontblob) + end + end + if name and name ~= "" then + local filename = input.find_file(texmf.instance,name) -- maybe also search for opentype + if filename and filename ~= "" then + local suffix = file.extname(filename) + if suffix == 'ttf' or suffix == 'otf' or suffix == 'ttc' then + local fontinfo = fontforge.info(filename) + if fontinfo then + if fontinfo[1] then + for _, v in ipairs(fontinfo) do + save(v.fontname,fontforge.open(filename,v.fullname)) + end + else + save(fontinfo.fullname,fontforge.open(filename)) + end + end + end + end + end +end + +banner = banner .. " | font tools " + +messages.help = [[ +--list list installed fonts +--save save open type font in raw table + +--pattern=str filter files +--reload generate new font database +--all provide alternatives +]] + +if environment.argument("list") then + local pattern = environment.argument("pattern") or environment.files[1] or "" + local all = environment.argument("all") + local reload = environment.argument("reload") + scripts.fonts.list(pattern,reload,all) +elseif environment.argument("save") then + local name = environment.files[1] or "" + local sub = environment.files[2] or "" + scripts.fonts.save(name,sub) +else + input.help(banner,messages.help) +end diff --git a/scripts/context/lua/mtxrun.cmd b/scripts/context/lua/mtxrun.cmd new file mode 100644 index 000000000..f30148ddb --- /dev/null +++ b/scripts/context/lua/mtxrun.cmd @@ -0,0 +1,5 @@ +@echo off +setlocal +set ownpath=%~dp0% +texlua "%ownpath%mtxrun.lua" %* +endlocal diff --git a/scripts/context/lua/mtxrun.lua b/scripts/context/lua/mtxrun.lua new file mode 100644 index 000000000..d5a0701c9 --- /dev/null +++ b/scripts/context/lua/mtxrun.lua @@ -0,0 +1,4625 @@ +#!/usr/bin/env texlua + +-- one can make a stub: +-- +-- #!/bin/sh +-- env LUATEXDIR=/....../texmf/scripts/context/lua luatex --luaonly mtxrun.lua "$@" + +-- filename : mtxrun.lua +-- comment : companion to context.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- This script is based on texmfstart.rb but does not use kpsewhich to +-- locate files. Although kpse is a library it never came to opening up +-- its interface to other programs (esp scripting languages) and so we +-- do it ourselves. The lua variant evolved out of an experimental ruby +-- one. Interesting is that using a scripting language instead of c does +-- not have a speed penalty. Actually the lua variant is more efficient, +-- especially when multiple calls to kpsewhich are involved. The lua +-- library also gives way more ocntrol. + +-- to be done / considered +-- +-- support for --exec or make it default +-- support for jar files (or maybe not, never used, too messy) +-- support for $RUBYINPUTS cum suis (if still needed) +-- remember for subruns: _CTX_K_V_#{original}_ +-- remember for subruns: _CTX_K_S_#{original}_ +-- remember for subruns: TEXMFSTART.#{original} [tex.rb texmfstart.rb] + +banner = "version 1.0.1 - 2007+ - PRAGMA ADE / CONTEXT" +texlua = true + +-- begin library merge + +-- filename : l-string.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-string'] = 1.001 + +--~ function string.split(str, pat) -- taken from the lua wiki +--~ local t = {n = 0} -- so this table has a length field, traverse with ipairs then! +--~ local fpat = "(.-)"..pat +--~ local last_end = 1 +--~ local s, e, cap = string.find(str, fpat, 1) +--~ while s ~= nil do +--~ if s~=1 or cap~="" then +--~ table.insert(t,cap) +--~ end +--~ last_end = e+1 +--~ s, e, cap = string.find(str, fpat, last_end) +--~ end +--~ if last_end<=string.len(str) then +--~ table.insert(t,(string.sub(str,last_end))) +--~ end +--~ return t +--~ end + +--~ function string:split(pat) -- taken from the lua wiki but adapted +--~ local t = { } -- self and colon usage (faster) +--~ local fpat = "(.-)"..pat +--~ local last_end = 1 +--~ local s, e, cap = self:find(fpat, 1) +--~ while s ~= nil do +--~ if s~=1 or cap~="" then +--~ t[#t+1] = cap +--~ end +--~ last_end = e+1 +--~ s, e, cap = self:find(fpat, last_end) +--~ end +--~ if last_end <= #self then +--~ t[#t+1] = self:sub(last_end) +--~ end +--~ return t +--~ end + +--~ a piece of brilliant code by Rici Lake (posted on lua list) -- only names changed +--~ +--~ function string:splitter(pat) +--~ local st, g = 1, self:gmatch("()"..pat.."()") +--~ local function splitter(self) +--~ if st then +--~ local s, f = g() +--~ local rv = self:sub(st, (s or 0)-1) +--~ st = f +--~ return rv +--~ end +--~ end +--~ return splitter, self +--~ end + +function string:splitter(pat) + -- by Rici Lake (posted on lua list) -- only names changed + -- p 79 ref man: () returns position of match + local st, g = 1, self:gmatch("()("..pat..")") + local function strgetter(self, segs, seps, sep, cap1, ...) + st = sep and seps + #sep + return self:sub(segs, (seps or 0) - 1), cap1 or sep, ... + end + local function strsplitter(self) + if st then return strgetter(self, st, g()) end + end + return strsplitter, self +end + +function string:split(separator) + local t = {} + for k in self:splitter(separator) do t[#t+1] = k end + return t +end + +-- faster than a string:split: + +function string:splitchr(chr) + if #self > 0 then + local t = { } + for s in string.gmatch(self..chr,"(.-)"..chr) do + t[#t+1] = s + end + return t + else + return { } + end +end + +--~ function string.piecewise(str, pat, fnc) -- variant of split +--~ local fpat = "(.-)"..pat +--~ local last_end = 1 +--~ local s, e, cap = string.find(str, fpat, 1) +--~ while s ~= nil do +--~ if s~=1 or cap~="" then +--~ fnc(cap) +--~ end +--~ last_end = e+1 +--~ s, e, cap = string.find(str, fpat, last_end) +--~ end +--~ if last_end <= #str then +--~ fnc((string.sub(str,last_end))) +--~ end +--~ end + +function string.piecewise(str, pat, fnc) -- variant of split + for k in string.splitter(str,pat) do fnc(k) end +end + +--~ do if lpeg then + +--~ -- this alternative is 30% faster esp when we cache them +--~ -- problem: no expressions + +--~ splitters = { } + +--~ function string:split(separator) +--~ if #self > 0 then +--~ local split = splitters[separator] +--~ if not split then +--~ -- based on code by Roberto +--~ local p = lpeg.P(separator) +--~ local c = lpeg.C((1-p)^0) +--~ split = lpeg.Ct(c*(p*c)^0) +--~ splitters[separator] = split +--~ end +--~ return lpeg.match(split,self) +--~ else +--~ return { } +--~ end +--~ end + +--~ string.splitchr = string.split + +--~ function string:piecewise(separator,fnc) +--~ for _,v in pairs(self:split(separator)) do +--~ fnc(v) +--~ end +--~ end + +--~ end end + +string.chr_to_esc = { + ["%"] = "%%", + ["."] = "%.", + ["+"] = "%+", ["-"] = "%-", ["*"] = "%*", + ["^"] = "%^", ["$"] = "%$", + ["["] = "%[", ["]"] = "%]", + ["("] = "%(", [")"] = "%)", + ["{"] = "%{", ["}"] = "%}" +} + +function string:esc() -- variant 2 + return (self:gsub("(.)",string.chr_to_esc)) +end + +function string.unquote(str) + return (str:gsub("^([\"\'])(.*)%1$","%2")) +end + +function string.quote(str) + return '"' .. str:unquote() .. '"' +end + +function string:count(pattern) -- variant 3 + local n = 0 + for _ in self:gmatch(pattern) do + n = n + 1 + end + return n +end + +function string:limit(n,sentinel) + if #self > n then + sentinel = sentinel or " ..." + return self:sub(1,(n-#sentinel)) .. sentinel + else + return self + end +end + +function string:strip() + return (self:gsub("^%s*(.-)%s*$", "%1")) +end + +--~ function string.strip(str) -- slightly different +--~ return (string.gsub(string.gsub(str,"^%s*(.-)%s*$","%1"),"%s+"," ")) +--~ end + +function string:is_empty() + return not self:find("%S") +end + +function string:enhance(pattern,action) + local ok, n = true, 0 + while ok do + ok = false + self = self:gsub(pattern, function(...) + ok, n = true, n + 1 + return action(...) + end) + end + return self, n +end + +--~ function string:enhance(pattern,action) +--~ local ok, n = 0, 0 +--~ repeat +--~ self, ok = self:gsub(pattern, function(...) +--~ n = n + 1 +--~ return action(...) +--~ end) +--~ until ok == 0 +--~ return self, n +--~ end + +--~ function string:to_hex() +--~ if self then +--~ return (self:gsub("(.)",function(c) +--~ return string.format("%02X",c:byte()) +--~ end)) +--~ else +--~ return "" +--~ end +--~ end + +--~ function string:from_hex() +--~ if self then +--~ return (self:gsub("(..)",function(c) +--~ return string.char(tonumber(c,16)) +--~ end)) +--~ else +--~ return "" +--~ end +--~ end + +string.chr_to_hex = { } +string.hex_to_chr = { } + +for i=0,255 do + local c, h = string.char(i), string.format("%02X",i) + string.chr_to_hex[c], string.hex_to_chr[h] = h, c +end + +--~ function string:to_hex() +--~ if self then return (self:gsub("(.)",string.chr_to_hex)) else return "" end +--~ end + +--~ function string:from_hex() +--~ if self then return (self:gsub("(..)",string.hex_to_chr)) else return "" end +--~ end + +function string:to_hex() + return ((self or ""):gsub("(.)",string.chr_to_hex)) +end + +function string:from_hex() + return ((self or ""):gsub("(..)",string.hex_to_chr)) +end + +if not string.characters then + + local function nextchar(str, index) + index = index + 1 + return (index <= #str) and index or nil, str:sub(index,index) + end + function string:characters() + return nextchar, self, 0 + end + local function nextbyte(str, index) + index = index + 1 + return (index <= #str) and index or nil, string.byte(str:sub(index,index)) + end + function string:bytes() + return nextbyte, self, 0 + end + +end + +--~ function string:padd(n,chr) +--~ return self .. self.rep(chr or " ",n-#self) +--~ end + +function string:padd(n,chr) + local m = n-#self + if m > 0 then + return self .. self.rep(chr or " ",m) + else + return self + end +end + +function is_number(str) + return str:find("^[%-%+]?[%d]-%.?[%d+]$") == 1 +end + +--~ print(is_number("1")) +--~ print(is_number("1.1")) +--~ print(is_number(".1")) +--~ print(is_number("-0.1")) +--~ print(is_number("+0.1")) +--~ print(is_number("-.1")) +--~ print(is_number("+.1")) + + +-- filename : l-table.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-table'] = 1.001 + +table.join = table.concat + +function table.strip(tab) + local lst = { } + for k, v in ipairs(tab) do + -- s = string.gsub(v, "^%s*(.-)%s*$", "%1") + s = v:gsub("^%s*(.-)%s*$", "%1") + if s == "" then + -- skip this one + else + lst[#lst+1] = s + end + end + return lst +end + +--~ function table.sortedkeys(tab) +--~ local srt = { } +--~ for key,_ in pairs(tab) do +--~ srt[#srt+1] = key +--~ end +--~ table.sort(srt) +--~ return srt +--~ end + +function table.sortedkeys(tab) + local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed + for key,_ in pairs(tab) do + srt[#srt+1] = key + if kind == 3 then + -- no further check + elseif type(key) == "string" then + if kind == 2 then kind = 3 else kind = 1 end + elseif type(key) == "number" then + if kind == 1 then kind = 3 else kind = 2 end + else + kind = 3 + end + end + if kind == 0 or kind == 3 then + table.sort(srt,function(a,b) return (tostring(a) < tostring(b)) end) + else + table.sort(srt) + end + return srt +end + +function table.append(t, list) + for _,v in pairs(list) do + table.insert(t,v) + end +end + +function table.prepend(t, list) + for k,v in pairs(list) do + table.insert(t,k,v) + end +end + +if not table.fastcopy then + + function table.fastcopy(old) -- fast one + if old then + local new = { } + for k,v in pairs(old) do + if type(v) == "table" then + new[k] = table.copy(v) + else + new[k] = v + end + end + return new + else + return { } + end + end + +end + +if not table.copy then + + function table.copy(t, _lookup_table) -- taken from lua wiki + _lookup_table = _lookup_table or { } + local tcopy = {} + if not _lookup_table[t] then + _lookup_table[t] = tcopy + end + for i,v in pairs(t) do + if type(i) == "table" then + if _lookup_table[i] then + i = _lookup_table[i] + else + i = table.copy(i, _lookup_table) + end + end + if type(v) ~= "table" then + tcopy[i] = v + else + if _lookup_table[v] then + tcopy[i] = _lookup_table[v] + else + tcopy[i] = table.copy(v, _lookup_table) + end + end + end + return tcopy + end + +end + +-- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack) + +function table.sub(t,i,j) + return { unpack(t,i,j) } +end + +function table.replace(a,b) + for k,v in pairs(b) do + a[k] = v + end +end + +-- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice) + +function table.is_empty(t) + return not t or not next(t) +end + +function table.one_entry(t) + local n = next(t) + return n and not next(t,n) +end + +function table.starts_at(t) + return ipairs(t,1)(t,0) +end + +do + + -- 34.055.092 32.403.326 arabtype.tma + -- 1.620.614 1.513.863 lmroman10-italic.tma + -- 1.325.585 1.233.044 lmroman10-regular.tma + -- 1.248.157 1.158.903 lmsans10-regular.tma + -- 194.646 153.120 lmtypewriter10-regular.tma + -- 1.771.678 1.658.461 palatinosanscom-bold.tma + -- 1.695.251 1.584.491 palatinosanscom-regular.tma + -- 13.736.534 13.409.446 zapfinoextraltpro.tma + + -- 13.679.038 11.774.106 arabtype.tmc + -- 886.248 754.944 lmroman10-italic.tmc + -- 729.828 466.864 lmroman10-regular.tmc + -- 688.482 441.962 lmsans10-regular.tmc + -- 128.685 95.853 lmtypewriter10-regular.tmc + -- 715.929 582.985 palatinosanscom-bold.tmc + -- 669.942 540.126 palatinosanscom-regular.tmc + -- 1.560.588 1.317.000 zapfinoextraltpro.tmc + + table.serialize_functions = true + table.serialize_compact = true + table.serialize_inline = true + + local function key(k) + if type(k) == "number" then -- or k:find("^%d+$") then + return "["..k.."]" + elseif noquotes and k:find("^%a[%a%d%_]*$") then + return k + else + return '["'..k..'"]' + end + end + + local function simple_table(t) + if #t > 0 then + local n = 0 + for _,v in pairs(t) do + n = n + 1 + end + if n == #t then + local tt = { } + for _,v in ipairs(t) do + local tv = type(v) + if tv == "number" or tv == "boolean" then + tt[#tt+1] = tostring(v) + elseif tv == "string" then + tt[#tt+1] = ("%q"):format(v) + else + tt = nil + break + end + end + return tt + end + end + return nil + end + + local function serialize(root,name,handle,depth,level,reduce,noquotes,indexed) + handle = handle or print + reduce = reduce or false + if depth then + depth = depth .. " " + if indexed then + handle(("%s{"):format(depth)) + else + handle(("%s%s={"):format(depth,key(name))) + end + else + depth = "" + if type(name) == "string" then + if name == "return" then + handle("return {") + else + handle(name .. "={") + end + elseif type(name) == "number" then + handle("[" .. name .. "]={") + elseif type(name) == "boolean" then + if name then + handle("return {") + else + handle("{") + end + else + handle("t={") + end + end + if root and next(root) then + local compact = table.serialize_compact + local inline = compact and table.serialize_inline + local first, last = nil, 0 -- #root cannot be trusted here + if compact then + for k,v in ipairs(root) do + if not first then first = k end + last = last + 1 + end + end + for _,k in pairs(table.sortedkeys(root)) do + local v = root[k] + local t = type(v) + if compact and first and type(k) == "number" and k >= first and k <= last then + if t == "number" then + handle(("%s %s,"):format(depth,v)) + elseif t == "string" then + if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then + handle(("%s %s,"):format(depth,v)) + else + handle(("%s %q,"):format(depth,v)) + end + elseif t == "table" then + if not next(v) then + handle(("%s {},"):format(depth)) + elseif inline then + local st = simple_table(v) + if st then + handle(("%s { %s },"):format(depth,table.concat(st,", "))) + else + serialize(v,k,handle,depth,level+1,reduce,noquotes,true) + end + else + serialize(v,k,handle,depth,level+1,reduce,noquotes,true) + end + elseif t == "boolean" then + handle(("%s %s,"):format(depth,tostring(v))) + elseif t == "function" then + if table.serialize_functions then + handle(('%s loadstring(%q),'):format(depth,string.dump(v))) + else + handle(('%s "function",'):format(depth)) + end + else + handle(("%s %q,"):format(depth,tostring(v))) + end + elseif k == "__p__" then -- parent + if false then + handle(("%s __p__=nil,"):format(depth)) + end + elseif t == "number" then + handle(("%s %s=%s,"):format(depth,key(k),v)) + elseif t == "string" then + if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then + handle(("%s %s=%s,"):format(depth,key(k),v)) + else + handle(("%s %s=%q,"):format(depth,key(k),v)) + end + elseif t == "table" then + if not next(v) then + handle(("%s %s={},"):format(depth,key(k))) + elseif inline then + local st = simple_table(v) + if st then + handle(("%s %s={ %s },"):format(depth,key(k),table.concat(st,", "))) + else + serialize(v,k,handle,depth,level+1,reduce,noquotes) + end + else + serialize(v,k,handle,depth,level+1,reduce,noquotes) + end + elseif t == "boolean" then + handle(("%s %s=%s,"):format(depth,key(k),tostring(v))) + elseif t == "function" then + if table.serialize_functions then + handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(v))) + else + handle(('%s %s="function",'):format(depth,key(k))) + end + else + handle(("%s %s=%q,"):format(depth,key(k),tostring(v))) + -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end))) + end + end + if level > 0 then + handle(("%s},"):format(depth)) + else + handle(("%s}"):format(depth)) + end + else + handle(("%s}"):format(depth)) + end + end + + --~ name: + --~ + --~ true : return { } + --~ false : { } + --~ nil : t = { } + --~ string : string = { } + --~ 'return' : return { } + --~ number : [number] = { } + + function table.serialize(root,name,reduce,noquotes) + local t = { } + local function flush(s) + t[#t+1] = s + end + serialize(root, name, flush, nil, 0, reduce, noquotes) + return table.concat(t,"\n") + end + + function table.tohandle(handle,root,name,reduce,noquotes) + serialize(root, name, handle, nil, 0, reduce, noquotes) + end + + -- sometimes tables are real use (zapfino extra pro is some 85M) in which + -- case a stepwise serialization is nice; actually, we could consider: + -- + -- for line in table.serializer(root,name,reduce,noquotes) do + -- ...(line) + -- end + -- + -- so this is on the todo list + + table.tofile_maxtab = 2*1024 + + function table.tofile(filename,root,name,reduce,noquotes) + local f = io.open(filename,'w') + if f then + local concat = table.concat + local maxtab = table.tofile_maxtab + if maxtab > 1 then + local t = { } + local function flush(s) + t[#t+1] = s + if #t > maxtab then + f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice + t = { } + end + end + serialize(root, name, flush, nil, 0, reduce, noquotes) + f:write(concat(t,"\n"),"\n") + else + local function flush(s) + f:write(s,"\n") + end + serialize(root, name, flush, nil, 0, reduce, noquotes) + end + f:close() + end + end + +end + +--~ t = { +--~ b = "123", +--~ a = "x", +--~ c = 1.23, +--~ d = "1.23", +--~ e = true, +--~ f = { +--~ d = "1.23", +--~ a = "x", +--~ b = "123", +--~ c = 1.23, +--~ e = true, +--~ f = { +--~ e = true, +--~ f = { +--~ e = true +--~ }, +--~ }, +--~ }, +--~ g = function() end +--~ } + +--~ print(table.serialize(t), "\n") +--~ print(table.serialize(t,"name"), "\n") +--~ print(table.serialize(t,false), "\n") +--~ print(table.serialize(t,true), "\n") +--~ print(table.serialize(t,"name",true), "\n") +--~ print(table.serialize(t,"name",true,true), "\n") + +do + + local function flatten(t,f,complete) + for _,v in ipairs(t) do + if type(v) == "table" then + if complete or type(v[1]) == "table" then + flatten(v,f,complete) + else + f[#f+1] = v + end + else + f[#f+1] = v + end + end + end + + function table.flatten(t) + local f = { } + flatten(t,f,true) + return f + end + + function table.unnest(t) -- bad name + local f = { } + flatten(t,f,false) + return f + end + + table.flatten_one_level = table.unnest + +end + +function table.insert_before_value(t,value,str) + for i=1,#t do + if t[i] == value then + table.insert(t,i,str) + return + end + end + table.insert(t,1,str) +end + +function table.insert_after_value(t,value,str) + for i=1,#t do + if t[i] == value then + table.insert(t,i+1,str) + return + end + end + t[#t+1] = str +end + +function table.are_equal(a,b,n,m) + if #a == #b then + n = n or 1 + m = m or #a + for i=n,m do + local ai, bi = a[i], b[i] + if (ai==bi) or (type(ai)=="table" and type(bi)=="table" and table.are_equal(ai,bi)) then + -- continue + else + return false + end + end + return true + else + return false + end +end + +--~ function table.are_equal(a,b) +--~ return table.serialize(a) == table.serialize(b) +--~ end + + + +-- filename : l-io.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-io'] = 1.001 + +if string.find(os.getenv("PATH"),";") then + io.fileseparator, io.pathseparator = "\\", ";" +else + io.fileseparator, io.pathseparator = "/" , ":" +end + +function io.loaddata(filename) + local f = io.open(filename) + if f then + local data = f:read('*all') + f:close() + return data + else + return nil + end +end + +function io.savedata(filename,data,joiner) + local f = io.open(filename, "wb") + if f then + if type(data) == "table" then + f:write(table.join(data,joiner or "")) + elseif type(data) == "function" then + data(f) + else + f:write(data) + end + f:close() + end +end + +function io.exists(filename) + local f = io.open(filename) + if f == nil then + return false + else + assert(f:close()) + return true + end +end + +function io.size(filename) + local f = io.open(filename) + if f == nil then + return 0 + else + local s = f:seek("end") + assert(f:close()) + return s + end +end + +function io.noflines(f) + local n = 0 + for _ in f:lines() do + n = n + 1 + end + f:seek('set',0) + return n +end + +--~ t, f, n = os.clock(), io.open("testbed/sample-utf16-bigendian-big.txt",'rb'), 0 +--~ for a in io.characters(f) do n = n + 1 end +--~ print(string.format("characters: %s, time: %s", n, os.clock()-t)) + +do + + local nextchar = { + [ 4] = function(f) + return f:read(1), f:read(1), f:read(1), f:read(1) + end, + [ 2] = function(f) + return f:read(1), f:read(1) + end, + [ 1] = function(f) + return f:read(1) + end, + [-2] = function(f) + local a = f:read(1) + local b = f:read(1) + return b, a + end, + [-4] = function(f) + local a = f:read(1) + local b = f:read(1) + local c = f:read(1) + local c = f:read(1) + return d, c, b, a + end + } + + function io.characters(f,n) + local sb = string.byte + if f then + return nextchar[n or 1], f + else + return nil, nil + end + end + +end + +do + + local nextbyte = { + [4] = function(f) + local a = f:read(1) + local b = f:read(1) + local c = f:read(1) + local d = f:read(1) + if d then + return sb(a), sb(b), sb(c), sb(d) + else + return nil, nil, nil, nil + end + end, + [2] = function(f) + local a = f:read(1) + local b = f:read(1) + if b then + return sb(a), sb(b) + else + return nil, nil + end + end, + [1] = function (f) + local a = f:read(1) + if a then + return sb(a) + else + return nil + end + end, + [-2] = function (f) + local a = f:read(1) + local b = f:read(1) + if b then + return sb(b), sb(a) + else + return nil, nil + end + end, + [-4] = function(f) + local a = f:read(1) + local b = f:read(1) + local c = f:read(1) + local d = f:read(1) + if d then + return sb(d), sb(c), sb(b), sb(a) + else + return nil, nil, nil, nil + end + end + } + + function io.bytes(f,n) + local sb = string.byte + if f then + return nextbyte[n or 1], f + else + return nil, nil + end + end + +end + + +-- filename : l-md5.lua +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-md5'] = 1.001 + +if md5 then do + + local function convert(str,fmt) + return (string.gsub(md5.sum(str),".",function(chr) return string.format(fmt,string.byte(chr)) end)) + end + + if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end + if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end + if not md5.dec then function md5.dec(str) return convert(stt,"%03i") end end + +end end + + +-- filename : l-number.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-number'] = 1.001 + +if not number then number = { } end + + + +-- filename : l-os.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-os'] = 1.001 + +function os.resultof(command) + return io.popen(command,"r"):read("*all") +end + +--~ if not os.exec then -- still not ok + os.exec = os.execute +--~ end + +function os.launch(str) + if os.platform == "windows" then + os.execute("start " .. str) + else + os.execute(str .. " &") + end +end + +if not os.setenv then + function os.setenv() return false end +end + + +-- filename : l-file.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-file'] = 1.001 + +if not file then file = { } end + +function file.removesuffix(filename) + return filename:gsub("%.%a+$", "") +end + +function file.addsuffix(filename, suffix) + if not filename:find("%.%a-$") then + return filename .. "." .. suffix + else + return filename + end +end + +function file.replacesuffix(filename, suffix) + return filename:gsub("%.%a+$", "." .. suffix) +end + +function file.dirname(name) + return name:match("^(.+)[/\\].-$") or "" +end + +function file.basename(name) + return name:match("^.+[/\\](.-)$") or name +end + +function file.extname(name) + return name:match("^.+%.(.-)$") or "" +end + +function file.join(...) -- args + return (string.gsub(table.concat({...},"/"),"\\","/")) +end + +function file.is_writable(name) + local f = io.open(name, 'w') + if f then + f:close() + return true + else + return false + end +end + +function file.is_readable(name) + local f = io.open(name,'r') + if f then + f:close() + return true + else + return false + end +end + +function file.split_path(str) + if str:find(';') then + return str:splitchr(";") + else + return str:splitchr(io.pathseparator) + end +end + +function file.join_path(tab) + return table.concat(tab,io.pathseparator) +end + +--~ print('test' .. " == " .. file.collapse_path("test")) +--~ print("test/test" .. " == " .. file.collapse_path("test/test")) +--~ print("test/test/test" .. " == " .. file.collapse_path("test/test/test")) +--~ print("test/test" .. " == " .. file.collapse_path("test/../test/test")) +--~ print("test" .. " == " .. file.collapse_path("test/../test")) +--~ print("../test" .. " == " .. file.collapse_path("../test")) +--~ print("../test/" .. " == " .. file.collapse_path("../test/")) +--~ print("a/a" .. " == " .. file.collapse_path("a/b/c/../../a")) + +function file.collapse_path(str) + local ok = false + while not ok do + ok = true + str, n = str:gsub("[^%./]+/%.%./", function(s) + ok = false + return "" + end) + end + return (str:gsub("/%./","/")) +end + +function file.robustname(str) + return (str:gsub("[^%a%d%/%-%.\\]+","-")) +end + +file.readdata = io.loaddata +file.savedata = io.savedata + + +-- filename : l-dir.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-dir'] = 1.001 + +dir = { } + +-- optimizing for no string.find (*) does not save time + +if lfs then + + function dir.glob_pattern(path,patt,recurse,action) + for name in lfs.dir(path) do + local full = path .. '/' .. name + local mode = lfs.attributes(full,'mode') + if mode == 'file' then + if name:find(patt) then + action(full) + end + elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then + dir.glob_pattern(full,patt,recurse,action) + end + end + end + + function dir.glob(pattern, action) + local t = { } + local action = action or function(name) table.insert(t,name) end + local path, patt = pattern:match("^(.*)/*%*%*/*(.-)$") + local recurse = path and patt + if not recurse then + path, patt = pattern:match("^(.*)/(.-)$") + if not (path and patt) then + path, patt = '.', pattern + end + end + patt = patt:gsub("([%.%-%+])", "%%%1") + patt = patt:gsub("%*", ".*") + patt = patt:gsub("%?", ".") + patt = "^" .. patt .. "$" + -- print('path: ' .. path .. ' | pattern: ' .. patt .. ' | recurse: ' .. tostring(recurse)) + dir.glob_pattern(path,patt,recurse,action) + return t + end + + -- t = dir.glob("c:/data/develop/context/sources/**/????-*.tex") + -- t = dir.glob("c:/data/develop/tex/texmf/**/*.tex") + -- t = dir.glob("c:/data/develop/context/texmf/**/*.tex") + -- t = dir.glob("f:/minimal/tex/**/*") + -- print(dir.ls("f:/minimal/tex/**/*")) + -- print(dir.ls("*.tex")) + + function dir.ls(pattern) + return table.concat(dir.glob(pattern),"\n") + end + + --~ mkdirs("temp") + --~ mkdirs("a/b/c") + --~ mkdirs(".","/a/b/c") + --~ mkdirs("a","b","c") + + function dir.mkdirs(...) -- root,... or ... ; root is not split + local pth, err = "", false + for k,v in pairs({...}) do + if k == 1 then + if not lfs.isdir(v) then + -- print("no root path " .. v) + err = true + else + pth = v + end + elseif lfs.isdir(pth .. "/" .. v) then + pth = pth .. "/" .. v + else + for _,s in pairs(v:split("/")) do + pth = pth .. "/" .. s + if not lfs.isdir(pth) then + ok = lfs.mkdir(pth) + if not lfs.isdir(pth) then + err = true + end + end + if err then break end + end + end + if err then break end + end + return pth, not err + end + +end + + +-- filename : l-boolean.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-boolean'] = 1.001 +if not boolean then boolean = { } end + +function boolean.tonumber(b) + if b then return 1 else return 0 end +end + +function toboolean(str) + if type(str) == "string" then + return str == "true" or str == "yes" or str == "on" or str == "1" + elseif type(str) == "number" then + return tonumber(str) ~= 0 + else + return str + end +end + +function string.is_boolean(str) + if type(str) == "string" then + if str == "true" or str == "yes" or str == "on" then + return true + elseif str == "false" or str == "no" or str == "off" then + return false + end + end + return nil +end + +function boolean.alwaystrue() + return true +end + +function boolean.falsetrue() + return false +end + + +-- filename : l-utils.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-utils'] = 1.001 + +if not utils then utils = { } end +if not utils.merger then utils.merger = { } end +if not utils.lua then utils.lua = { } end + +utils.merger.m_begin = "begin library merge" +utils.merger.m_end = "end library merge" +utils.merger.pattern = + "%c+" .. + "%-%-%s+" .. utils.merger.m_begin .. + "%c+(.-)%c+" .. + "%-%-%s+" .. utils.merger.m_end .. + "%c+" + +function utils.merger._self_fake_() + return + "-- " .. "created merged file" .. "\n\n" .. + "-- " .. utils.merger.m_begin .. "\n\n" .. + "-- " .. utils.merger.m_end .. "\n\n" +end + +function utils.report(...) + print(...) +end + +function utils.merger._self_load_(name) + local f, data = io.open(name), "" + if f then + data = f:read("*all") + f:close() + end + return data or "" +end + +function utils.merger._self_save_(name, data) + if data ~= "" then + local f = io.open(name,'w') + if f then + f:write(data) + f:close() + end + end +end + +function utils.merger._self_swap_(data,code) + if data ~= "" then + return (data:gsub(utils.merger.pattern, function(s) + return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n" + end, 1)) + else + return "" + end +end + +function utils.merger._self_libs_(libs,list) + local result, f = "", nil + if type(libs) == 'string' then libs = { libs } end + if type(list) == 'string' then list = { list } end + for _, lib in ipairs(libs) do + for _, pth in ipairs(list) do + local name = string.gsub(pth .. "/" .. lib,"\\","/") + f = io.open(name) + if f then + -- utils.report("merging library",name) + result = result .. "\n" .. f:read("*all") .. "\n" + f:close() + list = { pth } -- speed up the search + break + else + -- utils.report("no library",name) + end + end + end + return result or "" +end + +function utils.merger.selfcreate(libs,list,target) + if target then + utils.merger._self_save_( + target, + utils.merger._self_swap_( + utils.merger._self_fake_(), + utils.merger._self_libs_(libs,list) + ) + ) + end +end + +function utils.merger.selfmerge(name,libs,list,target) + utils.merger._self_save_( + target or name, + utils.merger._self_swap_( + utils.merger._self_load_(name), + utils.merger._self_libs_(libs,list) + ) + ) +end + +function utils.merger.selfclean(name) + utils.merger._self_save_( + name, + utils.merger._self_swap_( + utils.merger._self_load_(name), + "" + ) + ) +end + +function utils.lua.compile(luafile, lucfile) + -- utils.report("compiling",luafile,"into",lucfile) + os.remove(lucfile) + return (os.execute("luac -s -o " .. string.quote(lucfile) .. " " .. string.quote(luafile)) == 0) +end + + + +-- filename : luat-lib.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-lib'] = 1.001 + +-- mostcode moved to the l-*.lua and other luat-*.lua files + +-- os / io + +os.setlocale(nil,nil) -- useless feature and even dangerous in luatex + +-- os.platform + +-- mswin|bccwin|mingw|cygwin windows +-- darwin|rhapsody|nextstep macosx +-- netbsd|unix unix +-- linux linux + +if not io.fileseparator then + if string.find(os.getenv("PATH"),";") then + io.fileseparator, io.pathseparator, os.platform = "\\", ";", "windows" + else + io.fileseparator, io.pathseparator, os.platform = "/" , ":", "unix" + end +end + +if not os.platform then + if io.pathseparator == ";" then + os.platform = "windows" + else + os.platform = "unix" + end +end + +-- arg normalization +-- +-- for k,v in pairs(arg) do print(k,v) end + +if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then + arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil +end + +-- environment + +if not environment then environment = { } end + +environment.arguments = { } +environment.files = { } +environment.sorted_argument_keys = nil + +environment.platform = os.platform + +function environment.initialize_arguments(arg) + environment.arguments = { } + environment.files = { } + environment.sorted_argument_keys = nil + for index, argument in pairs(arg) do + if index > 0 then + local flag, value = argument:match("^%-+(.+)=(.-)$") + if flag then + environment.arguments[flag] = string.unquote(value or "") + else + flag = argument:match("^%-+(.+)") + if flag then + environment.arguments[flag] = true + else + environment.files[#environment.files+1] = argument + end + end + end + end + environment.ownname = environment.ownname or arg[0] or 'unknown.lua' +end + +function environment.showarguments() + for k,v in pairs(environment.arguments) do + print(k .. " : " .. tostring(v)) + end + if #environment.files > 0 then + print("files : " .. table.concat(environment.files, " ")) + end +end + +function environment.argument(name) + if environment.arguments[name] then + return environment.arguments[name] + else + if not environment.sorted_argument_keys then + environment.sorted_argument_keys = { } + for _,v in pairs(table.sortedkeys(environment.arguments)) do + table.insert(environment.sorted_argument_keys, "^" .. v) + end + end + for _,v in pairs(environment.sorted_argument_keys) do + if name:find(v) then + return environment.arguments[v:sub(2,#v)] + end + end + end + return nil +end + +function environment.split_arguments(separator) -- rather special, cut-off before separator + local done, before, after = false, { }, { } + for _,v in ipairs(environment.original_arguments) do + if not done and v == separator then + done = true + elseif done then + after[#after+1] = v + else + before[#before+1] = v + end + end + return before, after +end + +function environment.reconstruct_commandline(arg) + if not arg then arg = environment.original_arguments end + local result = { } + for _,a in ipairs(arg) do -- ipairs 1 .. #n + local kk, vv = a:match("^(%-+.-)=(.+)$") + if kk and vv then + if vv:find(" ") then + result[#result+1] = kk .. "=" .. string.quote(vv) + else + result[#result+1] = a + end + elseif a:find(" ") then + result[#result+1] = string.quote(a) + else + result[#result+1] = a + end + end + return table.join(result," ") +end + +if arg then + environment.initialize_arguments(arg) + environment.original_arguments = arg + arg = { } -- prevent duplicate handling +end + + +-- filename : luat-inp.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- This lib is multi-purpose and can be loaded again later on so that +-- additional functionality becomes available. We will split this +-- module in components when we're done with prototyping. + +-- This is the first code I wrote for LuaTeX, so it needs some cleanup. + +-- To be considered: hash key lowercase, first entry in table filename +-- (any case), rest paths (so no need for optimization). Or maybe a +-- separate table that matches lowercase names to mixed case when +-- present. In that case the lower() cases can go away. I will do that +-- only when we run into problems with names. + +if not versions then versions = { } end versions['luat-inp'] = 1.001 +if not environment then environment = { } end +if not file then file = { } end + +if environment.aleph_mode == nil then environment.aleph_mode = true end -- temp hack + +if not input then input = { } end +if not input.suffixes then input.suffixes = { } end +if not input.formats then input.formats = { } end +if not input.aux then input.aux = { } end + +if not input.suffixmap then input.suffixmap = { } end + +if not input.locators then input.locators = { } end -- locate databases +if not input.hashers then input.hashers = { } end -- load databases +if not input.generators then input.generators = { } end -- generate databases +if not input.filters then input.filters = { } end -- conversion filters + +input.locators.notfound = { nil } +input.hashers.notfound = { nil } +input.generators.notfound = { nil } + +input.cacheversion = '1.0.1' +input.banner = nil +input.verbose = false +input.debug = false +input.cnfname = 'texmf.cnf' +input.lsrname = 'ls-R' +input.luasuffix = '.tma' +input.lucsuffix = '.tmc' + +-- we use a cleaned up list / format=any is a wildcard, as is *name + +input.formats['afm'] = 'AFMFONTS' input.suffixes['afm'] = { 'afm' } +input.formats['enc'] = 'ENCFONTS' input.suffixes['enc'] = { 'enc' } +input.formats['fmt'] = 'TEXFORMATS' input.suffixes['fmt'] = { 'fmt' } +input.formats['map'] = 'TEXFONTMAPS' input.suffixes['map'] = { 'map' } +input.formats['mp'] = 'MPINPUTS' input.suffixes['mp'] = { 'mp' } +input.formats['ocp'] = 'OCPINPUTS' input.suffixes['ocp'] = { 'ocp' } +input.formats['ofm'] = 'OFMFONTS' input.suffixes['ofm'] = { 'ofm', 'tfm' } +input.formats['otf'] = 'OPENTYPEFONTS' input.suffixes['otf'] = { 'otf' } -- 'ttf' +input.formats['opl'] = 'OPLFONTS' input.suffixes['opl'] = { 'opl' } +input.formats['otp'] = 'OTPINPUTS' input.suffixes['otp'] = { 'otp' } +input.formats['ovf'] = 'OVFFONTS' input.suffixes['ovf'] = { 'ovf', 'vf' } +input.formats['ovp'] = 'OVPFONTS' input.suffixes['ovp'] = { 'ovp' } +input.formats['tex'] = 'TEXINPUTS' input.suffixes['tex'] = { 'tex' } +input.formats['tfm'] = 'TFMFONTS' input.suffixes['tfm'] = { 'tfm' } +input.formats['ttf'] = 'TTFONTS' input.suffixes['ttf'] = { 'ttf', 'ttc' } +input.formats['pfb'] = 'T1FONTS' input.suffixes['pfb'] = { 'pfb', 'pfa' } +input.formats['vf'] = 'VFFONTS' input.suffixes['vf'] = { 'vf' } + +input.formats['fea'] = 'FONTFEATURES' input.suffixes['fea'] = { 'fea' } + +input.formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new +input.suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua' + +input.formats ['lua'] = 'LUAINPUTS' -- new +input.suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' } + +-- here we catch a few new thingies + +function input.checkconfigdata(instance) + if input.env(instance,"LUAINPUTS") == "" then + instance.environment["LUAINPUTS"] = ".;$TEXINPUTS;$TEXMFSCRIPTS" + end + if input.env(instance,"FONTFEATURES") == "" then + instance.environment["FONTFEATURES"] = ".;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS" + end +end + +-- backward compatible ones + +input.alternatives = { } + +input.alternatives['map files'] = 'map' +input.alternatives['enc files'] = 'enc' +input.alternatives['opentype fonts'] = 'otf' +input.alternatives['truetype fonts'] = 'ttf' +input.alternatives['truetype collections'] = 'ttc' +input.alternatives['type1 fonts'] = 'pfb' + +-- obscure ones + +input.formats ['misc fonts'] = '' +input.suffixes['misc fonts'] = { } + +input.formats ['sfd'] = 'SFDFONTS' +input.suffixes ['sfd'] = { 'sfd' } +input.alternatives['subfont definition files'] = 'sfd' + +function input.reset() + + local instance = { } + + instance.rootpath = '' + instance.treepath = '' + instance.progname = environment.progname or 'context' + instance.engine = environment.engine or 'luatex' + instance.format = '' + instance.environment = { } + instance.variables = { } + instance.expansions = { } + instance.files = { } + instance.configuration = { } + instance.found = { } + instance.foundintrees = { } + instance.kpsevars = { } + instance.hashes = { } + instance.cnffiles = { } + instance.lists = { } + instance.remember = true + instance.diskcache = true + instance.renewcache = false + instance.scandisk = true + instance.cachepath = nil + instance.loaderror = false + instance.smallcache = false + instance.savelists = true + instance.cleanuppaths = true + instance.allresults = false + instance.pattern = nil -- lists + instance.kpseonly = false -- lists + instance.cachefile = 'tmftools' + instance.loadtime = 0 + instance.starttime = 0 + instance.stoptime = 0 + instance.validfile = function(path,name) return true end + instance.data = { } -- only for loading + instance.sortdata = false + instance.force_suffixes = true + instance.dummy_path_expr = "^!*unset/*$" + instance.fakepaths = { } + instance.lsrmode = false + + if os.env then + -- store once, freeze and faster + for k,v in pairs(os.env) do + instance.environment[k] = input.bare_variable(v) + end + else + -- we will access os.env frequently + for k,v in pairs({'HOME','TEXMF','TEXMFCNF','SELFAUTOPARENT'}) do + local e = os.getenv(v) + if e then + -- input.report("setting",v,"to",input.bare_variable(e)) + instance.environment[v] = input.bare_variable(e) + end + end + end + + -- cross referencing + + for k, v in pairs(input.suffixes) do + for _, vv in pairs(v) do + if vv then + input.suffixmap[vv] = k + end + end + end + + return instance + +end + +function input.bare_variable(str) + -- return string.gsub(string.gsub(string.gsub(str,"%s+$",""),'^"(.+)"$',"%1"),"^'(.+)'$","%1") + return str:gsub("\s*([\"\']?)(.+)%1\s*", "%2") +end + +if texio then + input.log = texio.write_nl +else + input.log = print +end + +function input.simple_logger(kind, name) + if name and name ~= "" then + if input.banner then + input.log(input.banner..kind..": "..name) + else + input.log("<<"..kind..": "..name..">>") + end + else + if input.banner then + input.log(input.banner..kind..": no name") + else + input.log("<<"..kind..": no name>>") + end + end +end + +function input.dummy_logger() +end + +function input.settrace(n) + input.trace = tonumber(n or 0) + if input.trace > 0 then + input.logger = input.simple_logger + input.verbose = true + else + input.logger = function() end + end +end + +function input.report(...) -- inefficient + if input.verbose then + if input.banner then + input.log(input.banner .. table.concat({...},' ')) + elseif input.logmode() == 'xml' then + input.log(""..table.concat({...},' ').."") + else + input.log("<<"..table.concat({...},' ')..">>") + end + end +end + +function input.reportlines(str) + if type(str) == "string" then + str = str:split("\n") + end + for _,v in pairs(str) do input.report(v) end +end + +input.settrace(os.getenv("MTX.INPUT.TRACE") or os.getenv("MTX_INPUT_TRACE") or input.trace or 0) + +-- These functions can be used to test the performance, especially +-- loading the database files. + +function input.start_timing(instance) + if instance then + instance.starttime = os.clock() + if not instance.loadtime then + instance.loadtime = 0 + end + end +end + +function input.stop_timing(instance, report) + if instance and instance.starttime then + instance.stoptime = os.clock() + local loadtime = instance.stoptime - instance.starttime + instance.loadtime = instance.loadtime + loadtime + if report then + input.report('load time', string.format("%0.3f",loadtime)) + end + return loadtime + else + return 0 + end +end + +input.stoptiming = input.stop_timing +input.starttiming = input.start_timing + +function input.elapsedtime(instance) + return string.format("%0.3f",instance.loadtime or 0) +end + +function input.report_loadtime(instance) + if instance then + input.report('total load time', input.elapsedtime(instance)) + end +end + +function input.loadtime(instance) + tex.print(input.elapsedtime(instance)) +end + +function input.env(instance,key) + return instance.environment[key] or input.osenv(instance,key) +end + +function input.osenv(instance,key) + if instance.environment[key] == nil then + local e = os.getenv(key) + if e == nil then + instance.environment[key] = "" -- false + else + instance.environment[key] = input.bare_variable(e) + end + end + return instance.environment[key] or "" +end + +-- we follow a rather traditional approach: +-- +-- (1) texmf.cnf given in TEXMFCNF +-- (2) texmf.cnf searched in TEXMF/web2c +-- +-- for the moment we don't expect a configuration file in a zip + +function input.identify_cnf(instance) + if #instance.cnffiles == 0 then + if instance.treepath ~= "" then + if instance.rootpath ~= "" then + local t = instance.treepath:splitchr(',') + for k,v in ipairs(t) do + t[k] = file.join(instance.rootpath,v) + end + instance.treepath = table.concat(t,',') + end + local t = instance.treepath:splitchr(',') + instance.environment['TEXMF'] = input.bare_variable(instance.treepath) + instance.environment['TEXMFCNF'] = file.join(t[1] or '.','texmf/web2c') + end + if instance.rootpath ~= "" then + instance.environment['TEXMFCNF'] = file.join(instance.rootpath,'texmf/web2c') + instance.environment['SELFAUTOPARENT'] = instance.rootpath + end + if input.env(instance,'TEXMFCNF') ~= "" then + local t = input.split_path(input.env(instance,'TEXMFCNF')) + t = input.aux.expanded_path(instance,t) + input.aux.expand_vars(instance,t) + for _,v in ipairs(t) do + table.insert(instance.cnffiles,file.join(v,input.cnfname)) + end + elseif input.env(instance,'SELFAUTOPARENT') == '.' then + table.insert(instance.cnffiles,file.join('.',input.cnfname)) + else + for _,v in ipairs({'texmf-local','texmf'}) do + table.insert(instance.cnffiles,file.join(input.env(instance,'SELFAUTOPARENT'),v,'web2c',input.cnfname)) + end + end + end +end + +function input.load_cnf(instance) + -- instance.cnffiles contain complete names now ! + if #instance.cnffiles == 0 then + input.report("no cnf files found (TEXMFCNF may not be set/known)") + else + instance.rootpath = instance.cnffiles[1] + for k,fname in ipairs(instance.cnffiles) do + instance.cnffiles[k] = fname:gsub("\\",'/') + end + for i = 1, 3 do + instance.rootpath = file.dirname(instance.rootpath) + end + if instance.lsrmode then + input.loadconfigdata(instance,instance.cnffiles) + elseif instance.diskcache and not instance.renewcache then + input.loadconfig(instance,instance.cnffiles) + if instance.loaderror then + input.loadconfigdata(instance,instance.cnffiles) + input.saveconfig(instance) + end + else + input.loadconfigdata(instance,instance.cnffiles) + if instance.renewcache then + input.saveconfig(instance) + end + end + input.aux.collapse_cnf_data(instance) + end + input.checkconfigdata(instance) +end + +function input.loadconfigdata(instance) + for _, fname in pairs(instance.cnffiles) do + input.aux.load_cnf(instance,fname) + end +end + +if os.env then + function input.aux.collapse_cnf_data(instance) + for _,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if not instance.variables[k] then + if instance.environment[k] then + instance.variables[k] = instance.environment[k] + else + instance.kpsevars[k] = true + instance.variables[k] = input.bare_variable(v) + end + end + end + end + end +else + function input.aux.collapse_cnf_data(instance) + for _,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if not instance.variables[k] then + local e = os.getenv(k) + if e then + instance.environment[k] = input.bare_variable(e) + instance.variables[k] = instance.environment[k] + else + instance.variables[k] = input.bare_variable(v) + instance.kpsevars[k] = true + end + end + end + end + end +end + +function input.aux.load_cnf(instance,fname) + fname = input.clean_path(fname) + local lname = fname:gsub("%.%a+$",input.luasuffix) + local f = io.open(lname) + if f then + f:close() + input.aux.load_data(instance,file.dirname(lname),'configuration',file.basename(lname)) + else + f = io.open(fname) + if f then + input.report("loading", fname) + local line, data, n, k, v + local dname = file.dirname(fname) + if not instance.configuration[dname] then + instance.configuration[dname] = { } + end + local data = instance.configuration[dname] + while true do + line = f:read() + if line then + while true do -- join lines + line, n = line:gsub("\\%s*$", "") + if n > 0 then + line = line .. f:read() + else + break + end + end + if not line:find("^[%%#]") then + k, v = (line:gsub("%s*%%.*$","")):match("%s*(.-)%s*=%s*(.-)%s*$") + if k and v and not data[k] then + data[k] = (v:gsub("[%%#].*",'')):gsub("~", "$HOME") + instance.kpsevars[k] = true + end + end + else + break + end + end + f:close() + else + input.report("skipping", fname) + end + end +end + +-- database loading + +function input.load_hash(instance) + input.locatelists(instance) + if instance.lsrmode then + input.loadlists(instance) + elseif instance.diskcache and not instance.renewcache then + input.loadfiles(instance) + if instance.loaderror then + input.loadlists(instance) + input.savefiles(instance) + end + else + input.loadlists(instance) + if instance.renewcache then + input.savefiles(instance) + end + end +end + +function input.aux.append_hash(instance,type,tag,name) + input.logger("= hash append",tag) + table.insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } ) +end + +function input.aux.prepend_hash(instance,type,tag,name) + input.logger("= hash prepend",tag) + table.insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } ) +end + +function input.aux.extend_texmf_var(instance,specification) -- crap + if instance.environment['TEXMF'] then + input.report("extending environment variable TEXMF with", specification) + instance.environment['TEXMF'] = instance.environment['TEXMF']:gsub("^%{", function() + return "{" .. specification .. "," + end) + elseif instance.variables['TEXMF'] then + input.report("extending configuration variable TEXMF with", specification) + instance.variables['TEXMF'] = instance.variables['TEXMF']:gsub("^%{", function() + return "{" .. specification .. "," + end) + else + input.report("setting configuration variable TEXMF to", specification) + instance.variables['TEXMF'] = "{" .. specification .. "}" + end + if instance.variables['TEXMF']:find("%,") and not instance.variables['TEXMF']:find("^%{") then + input.report("adding {} to complex TEXMF variable, best do that yourself") + instance.variables['TEXMF'] = "{" .. instance.variables['TEXMF'] .. "}" + end + input.expand_variables(instance) +end + +-- locators + +function input.locatelists(instance) + for _, path in pairs(input.simplified_list(input.expansion(instance,'TEXMF'))) do + input.report("locating list of",path) + input.locatedatabase(instance,input.normalize_name(path)) + end +end + +function input.locatedatabase(instance,specification) + return input.methodhandler('locators', instance, specification) +end + +function input.locators.tex(instance,specification) + if specification and specification ~= '' then + local files = { + file.join(specification,'files'..input.lucsuffix), + file.join(specification,'files'..input.luasuffix), + file.join(specification,input.lsrname) + } + for _, filename in pairs(files) do + local f = io.open(filename) + if f then + input.logger('! tex locator', specification..' found') + input.aux.append_hash(instance,'file',specification,filename) + f:close() + return + end + end + input.logger('? tex locator', specification..' not found') + end +end + +-- hashers + +function input.hashdatabase(instance,tag,name) + return input.methodhandler('hashers',instance,tag,name) +end + +function input.loadfiles(instance) + instance.loaderror = false + instance.files = { } + if not instance.renewcache then + for _, hash in ipairs(instance.hashes) do + input.hashdatabase(instance,hash.tag,hash.name) + if instance.loaderror then break end + end + end +end + +function input.hashers.tex(instance,tag,name) + input.aux.load_data(instance,tag,'files') +end + +-- generators: + +function input.loadlists(instance) + for _, hash in ipairs(instance.hashes) do + input.generatedatabase(instance,hash.tag) + end +end + +function input.generatedatabase(instance,specification) + return input.methodhandler('generators', instance, specification) +end + +function input.generators.tex(instance,specification) + local tag = specification + if not instance.lsrmode and lfs and lfs.dir then + input.report("scanning path",specification) + instance.files[tag] = { } + local files = instance.files[tag] + local n, m = 0, 0 + local spec = specification .. '/' + local attributes = lfs.attributes + local directory = lfs.dir + local small = instance.smallcache + local function action(path) + local mode, full + if path then + full = spec .. path .. '/' + else + full = spec + end + for name in directory(full) do + if name == '.' or name == ".." then + -- skip + else + mode = attributes(full..name,'mode') + if mode == "directory" then + m = m + 1 + if path then + action(path..'/'..name) + else + action(name) + end + elseif path and mode == 'file' then + n = n + 1 + local f = files[name] + if f then + if not small then + if type(f) == 'string' then + files[name] = { f, path } + else + f[#f+1] = path + end + end + else + files[name] = path + end + end + end + end + end + action() + input.report(n,"files found on",m,"directories") + else + local fullname = file.join(specification,input.lsrname) + local path = '.' + local f = io.open(fullname) + if f then + instance.files[tag] = { } + local files = instance.files[tag] + local small = instance.smallcache + input.report("loading lsr file",fullname) + -- for line in f:lines() do -- much slower then the next one + for line in (f:read("*a")):gmatch("(.-)\n") do + if line:find("^[%a%d]") then + local fl = files[line] + if fl then + if not small then + if type(fl) == 'string' then + files[line] = { fl, path } -- table + else + fl[#fl+1] = path + end + end + else + files[line] = path -- string + end + else + path = line:match("%.%/(.-)%:$") or path -- match could be nil due to empty line + end + end + f:close() + end + end +end + +-- savers, todo + +function input.savefiles(instance) + input.aux.save_data(instance, 'files', function(k,v) + return instance.validfile(k,v) -- path, name + end) +end + +-- A config (optionally) has the paths split in tables. Internally +-- we join them and split them after the expansion has taken place. This +-- is more convenient. + +function input.splitconfig(instance) + for i,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if type(v) == 'string' then + local t = file.split_path(v) + if #t > 1 then + c[k] = t + end + end + end + end +end +function input.joinconfig(instance) + for i,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if type(v) == 'table' then + c[k] = file.join_path(v) + end + end + end +end +function input.split_path(str) + if type(str) == 'table' then + return str + else + return file.split_path(str) + end +end +function input.join_path(str) + if type(str) == 'table' then + return file.join_path(str) + else + return str + end +end +function input.splitexpansions(instance) + for k,v in pairs(instance.expansions) do + local t = file.split_path(v) + if #t > 1 then + instance.expansions[k] = t + end + end +end +function input.splitexpansions(instance) + for k,v in pairs(instance.expansions) do + local t, h = { }, { } + for _,vv in pairs(file.split_path(v)) do + if vv ~= "" and not h[vv] then + t[#t+1] = vv + h[vv] = true + end + end + if #t > 1 then + instance.expansions[k] = t + else + instance.expansions[k] = t[1] + end + end +end + +-- end of split/join code + +function input.saveconfig(instance) + input.splitconfig(instance) + input.aux.save_data(instance, 'configuration', nil) + input.joinconfig(instance) +end + +input.configbanner = [[ +-- This is a Luatex configuration file created by 'luatools.lua' or +-- 'luatex.exe' directly. For comment, suggestions and questions you can +-- contact the ConTeXt Development Team. This configuration file is +-- not copyrighted. [HH & TH] +]] + +function input.aux.save_data(instance, dataname, check) + for cachename, files in pairs(instance[dataname]) do + local name = file.join(cachename,dataname) + local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix + local f = io.open(luaname,'w') + if f then + input.report("saving " .. dataname .. " in", luaname) + f:write(input.configbanner) + f:write("\n") + f:write("if not texmf then texmf = { } end\n") + f:write("if not texmf.data then texmf.data = { } end\n") + f:write("\n") + f:write("texmf.data.type = '" .. dataname .. "'\n") + f:write("texmf.data.version = '" .. input.cacheversion .. "'\n") + f:write("texmf.data.date = '" .. os.date("%Y-%m-%d") .. "'\n") + f:write("texmf.data.time = '" .. os.date("%H:%M:%S") .. "'\n") + f:write('texmf.data.content = {\n') + local function dump(k,v) + if not check or check(v,k) then -- path, name + if type(v) == 'string' then + f:write("\t['" .. k .. "'] = '" .. v .. "',\n") + elseif #v == 1 then + f:write("\t['" .. k .. "'] = '" .. v[1] .. "',\n") + else + f:write("\t['" .. k .. "'] = {'" .. table.concat(v,"','").. "'},\n") + end + end + end + if instance.sortdata then + for _, k in pairs(table.sortedkeys(files)) do + dump(k,files[k]) + end + else + for k, v in pairs(files) do + dump(k,v) + end + end + f:write('}\n') + f:close() + input.report("compiling " .. dataname .. " to", lucname) + if not utils.lua.compile(luaname,lucname) then + input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname) + os.remove(lucname) + end + else + input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix) + end + end +end + +function input.loadconfig(instance) + instance.configuration, instance.loaderror = { }, false + if not instance.renewcache then + for _, cnf in pairs(instance.cnffiles) do + input.aux.load_data(instance,file.dirname(cnf),'configuration') + if instance.loaderror then break end + end + end + input.joinconfig(instance) +end + +if not texmf then texmf = {} end +if not texmf.data then texmf.data = {} end + +function input.aux.load_data(instance,pathname,dataname,filename) + if not filename or (filename == "") then + filename = dataname .. input.lucsuffix + end + local blob = loadfile(file.join(pathname,filename)) + if not blob then + filename = dataname .. input.luasuffix + blob = loadfile(file.join(pathname,filename)) + end + if blob then + blob() + if (texmf.data.type == dataname) and (texmf.data.version == input.cacheversion) and texmf.data.content then + input.report("loading",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = texmf.data.content + else + input.report("skipping",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = { } + instance.loaderror = true + end + end + texmf.data.content = { } +end + +function input.expand_variables(instance) + instance.expansions = { } + if instance.engine ~= "" then instance.environment['engine'] = instance.engine end + if instance.progname ~= "" then instance.environment['progname'] = instance.engine end + for k,v in pairs(instance.environment) do + local a, b = k:match("^(%a+)%_(.*)%s*$") + if a and b then + instance.expansions[a..'.'..b] = v + else + instance.expansions[k] = v + end + end + for k,v in pairs(instance.environment) do -- move environment to expansions + if not instance.expansions[k] then instance.expansions[k] = v end + end + for k,v in pairs(instance.variables) do -- move variables to expansions + if not instance.expansions[k] then instance.expansions[k] = v end + end + while true do + local busy = false + for k,v in pairs(instance.expansions) do + local s, n = v:gsub("%$([%a%d%_%-]+)", function(a) + busy = true + return instance.expansions[a] or input.env(instance,a) + end) + local s, m = s:gsub("%$%{([%a%d%_%-]+)%}", function(a) + busy = true + return instance.expansions[a] or input.env(instance,a) + end) + if n > 0 or m > 0 then + instance.expansions[k]= s + end + end + if not busy then break end + end + for k,v in pairs(instance.expansions) do + instance.expansions[k] = v:gsub("\\", '/') + end + input.splitexpansions(instance) +end + +function input.aux.expand_vars(instance,lst) -- simple vars + for k,v in pairs(lst) do + lst[k] = v:gsub("%$([%a%d%_%-]+)", function(a) + return instance.variables[a] or input.env(instance,a) + end) + end +end + +function input.aux.expanded_var(instance,var) -- simple vars + return var:gsub("%$([%a%d%_%-]+)", function(a) + return instance.variables[a] or input.env(instance,a) + end) +end + +function input.aux.entry(instance,entries,name) + if name and (name ~= "") then + name = name:gsub('%$','') + local result = entries[name..'.'..instance.progname] or entries[name] + if result then + return result + else + result = input.env(instance,name) + if result then + instance.variables[name] = result + input.expand_variables(instance) + return instance.expansions[name] or "" + end + end + end + return "" +end +function input.variable(instance,name) + return input.aux.entry(instance,instance.variables,name) +end +function input.expansion(instance,name) + return input.aux.entry(instance,instance.expansions,name) +end + +function input.aux.is_entry(instance,entries,name) + if name and name ~= "" then + name = name:gsub('%$','') + return (entries[name..'.'..instance.progname] or entries[name]) ~= nil + else + return false + end +end + +function input.is_variable(instance,name) + return input.aux.is_entry(instance,instance.variables,name) +end +function input.is_expansion(instance,name) + return input.aux.is_entry(instance,instance.expansions,name) +end + +function input.aux.list(instance,list) + local pat = string.upper(instance.pattern or "","") + for _,key in pairs(table.sortedkeys(list)) do + if (instance.pattern=="") or string.find(key:upper(),pat) then + if instance.kpseonly then + if instance.kpsevars[key] then + print(key .. "=" .. input.aux.tabstr(list[key])) + end + elseif instance.kpsevars[key] then + print('K ' .. key .. "=" .. input.aux.tabstr(list[key])) + else + print('E ' .. key .. "=" .. input.aux.tabstr(list[key])) + end + end + end +end + +function input.list_variables(instance) + input.aux.list(instance,instance.variables) +end +function input.list_expansions(instance) + input.aux.list(instance,instance.expansions) +end + +function input.list_configurations(instance) + for _,key in pairs(table.sortedkeys(instance.kpsevars)) do + if not instance.pattern or (instance.pattern=="") or key:find(instance.pattern) then + print(key.."\n") + for i,c in pairs(instance.configuration) do + local str = c[key] + if str then + print("\t" .. i .. "\t\t" .. input.aux.tabstr(str)) + end + end + print() + end + end +end + +function input.aux.tabstr(str) + if type(str) == 'table' then + return table.concat(str," | ") + else + return str + end +end + +function input.simplified_list(str) + if type(str) == 'table' then + return str -- troubles ; ipv , in texmf + elseif str == '' then + return { } + else + local t = { } + for _,v in ipairs(string.splitchr(str:gsub("^\{(.+)\}$","%1"),",")) do + t[#t+1] = (v:gsub("^[%!]*(.+)[%/\\]*$","%1")) + end + return t + end +end + +function input.unexpanded_path_list(instance,str) + local pth = input.variable(instance,str) + local lst = input.split_path(pth) + return input.aux.expanded_path(instance,lst) +end +function input.unexpanded_path(instance,str) + return file.join_path(input.unexpanded_path_list(instance,str)) +end + +function input.expanded_path_list(instance,str) + if not str then + return { } + elseif instance.savelists then + -- engine+progname hash + str = str:gsub("%$","") + if not instance.lists[str] then -- cached + local lst = input.split_path(input.expansion(instance,str)) + instance.lists[str] = input.aux.expanded_path(instance,lst) + end + return instance.lists[str] + else + local lst = input.split_path(input.expansion(instance,str)) + return input.aux.expanded_path(instance,lst) + end +end +function input.expand_path(instance,str) + return file.join_path(input.expanded_path_list(instance,str)) +end + +--~ function input.first_writable_path(instance,name) +--~ for _,v in pairs(input.expanded_path_list(instance,name)) do +--~ if file.is_writable(file.join(v,'luatex-cache.tmp')) then +--~ return v +--~ end +--~ end +--~ return "." +--~ end + +function input.expanded_path_list_from_var(instance,str) -- brrr + local tmp = input.var_of_format_or_suffix(str:gsub("%$","")) + if tmp ~= "" then + return input.expanded_path_list(instance,str) + else + return input.expanded_path_list(instance,tmp) + end +end +function input.expand_path_from_var(instance,str) + return file.join_path(input.expanded_path_list_from_var(instance,str)) +end + +function input.format_of_var(str) + return input.formats[str] or input.formats[input.alternatives[str]] or '' +end +function input.format_of_suffix(str) + return input.suffixmap[file.extname(str)] or 'tex' +end + +function input.variable_of_format(str) + return input.formats[str] or input.formats[input.alternatives[str]] or '' +end + +function input.var_of_format_or_suffix(str) + local v = input.formats[str] + if v then + return v + end + v = input.formats[input.alternatives[str]] + if v then + return v + end + v = input.suffixmap[file.extname(str)] + if v then + return input.formats[isf] + end + return '' +end + +function input.expand_braces(instance,str) -- output variable and brace expansion of STRING + local ori = input.variable(instance,str) + local pth = input.aux.expanded_path(instance,input.split_path(ori)) + return file.join_path(pth) +end + +-- {a,b,c,d} +-- a,b,c/{p,q,r},d +-- a,b,c/{p,q,r}/d/{x,y,z}// +-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r} +-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r} + +function input.aux.expanded_path(instance,pathlist) + -- a previous version fed back into pathlist + local i, n, oldlist, newlist, ok = 0, 0, { }, { }, false + for _,v in ipairs(pathlist) do + if v:find("[{}]") then + ok = true + break + end + end + if ok then + for _,v in ipairs(pathlist) do + oldlist[#oldlist+1] = (v:gsub("([\{\}])", function(p) + if p == "{" then + i = i + 1 + if i > n then n = i end + return "<" .. (i-1) .. ">" + else + i = i - 1 + return "" + end + end)) + end + for i=1,n do + while true do + local more = false + local pattern = "^(.-)<"..(n-i)..">(.-)(.-)$" + local t = { } + for _,v in ipairs(oldlist) do + local pre, mid, post = v:match(pattern) + if pre and mid and post then + more = true + -- for _,vv in ipairs(mid:splitchr(',')) do + for vv in string.gmatch(mid..',',"(.-),") do + if vv == '.' then + t[#t+1] = pre..post + else + t[#t+1] = pre..vv..post + end + end + else + t[#t+1] = v + end + end + oldlist = t + if not more then break end + end + end + for _,v in pairs(oldlist) do + v = file.collapse_path(v) + if v ~= "" and not v:find(instance.dummy_path_expr) then newlist[#newlist+1] = v end + end + else + for _,v in pairs(pathlist) do + -- for _,vv in pairs(v:split(",")) do + for vv in string.gmatch(v..',',"(.-),") do + vv = file.collapse_path(v) + if vv ~= "" then newlist[#newlist+1] = vv end + end + end + end + return newlist +end + +--~ function input.is_readable(name) -- brrr, get rid of this +--~ return name:find("^zip##") or file.is_readable(name) +--~ end + +input.is_readable = { } + +function input.aux.is_readable(readable, name) + if input.trace > 2 then + if readable then + input.logger("+ readable", name) + else + input.logger("- readable", name) + end + end + return readable +end + +function input.is_readable.file(name) + -- return input.aux.is_readable(file.is_readable(name), name) + return input.aux.is_readable(input.aux.is_file(name), name) +end + +input.is_readable.tex = input.is_readable.file + +-- name +-- name/name + +function input.aux.collect_files(instance,names) + local filelist = nil + for _, fname in pairs(names) do + if fname then + if input.trace > 2 then + input.logger("? blobpath asked",fname) + end + local bname = file.basename(fname) + local dname = file.dirname(fname) + if dname == "" or dname:find("^%.") then + dname = false + else + dname = "/" .. dname .. "$" + end + for _, hash in pairs(instance.hashes) do + local blobpath = hash.tag + if blobpath and instance.files[blobpath] then + if input.trace > 2 then + input.logger('? blobpath do',blobpath .. " (" .. bname ..")") + end + local blobfile = instance.files[blobpath][bname] + if blobfile then + if type(blobfile) == 'string' then + if not dname or blobfile:find(dname) then + if not filelist then filelist = { } end + -- input.logger('= collected', blobpath.." | "..blobfile.." | "..bname) + filelist[#filelist+1] = file.join(blobpath,blobfile,bname) + end + else + for _, vv in pairs(blobfile) do + if not dname or vv:find(dname) then + if not filelist then filelist = { } end + filelist[#filelist+1] = file.join(blobpath,vv,bname) + end + end + end + end + elseif input.trace > 1 then + input.logger('! blobpath no',blobpath .. " (" .. bname ..")" ) + end + end + end + end + return filelist +end + +function input.suffix_of_format(str) + if input.suffixes[str] then + return input.suffixes[str][1] + else + return "" + end +end + +function input.suffixes_of_format(str) + if input.suffixes[str] then + return input.suffixes[str] + else + return {} + end +end + +function input.aux.qualified_path(filename) -- make platform dependent / not good yet + return + filename:find("^%.+/") or + filename:find("^/") or + filename:find("^%a+%:") or + filename:find("^%a+##") +end + +function input.normalize_name(original) + -- internally we use type##spec##subspec ; this hackery slightly slows down searching + local str = original or "" + str = str:gsub("::", "##") -- :: -> ## + str = str:gsub("^(%a+)://" ,"%1##") -- zip:// -> zip## + str = str:gsub("(.+)##(.+)##/(.+)","%1##%2##%3") -- ##/spec -> ##spec + if (input.trace>1) and (original ~= str) then + input.logger('= normalizer',original.." -> "..str) + end + return str +end + +-- split the next one up, better for jit + +function input.aux.register_in_trees(instance,name) + if not name:find("^%.") then + instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one + end +end + +function input.aux.find_file(instance,filename) -- todo : plugin (scanners, checkers etc) + local result = { } + local stamp = nil + filename = input.normalize_name(filename) + filename = file.collapse_path(filename:gsub("\\","/")) + -- speed up / beware: format problem + if instance.remember then + stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format + if instance.found[stamp] then + input.logger('! remembered', filename) + return instance.found[stamp] + end + end + if filename:find('%*') then + input.logger('! wildcard', filename) + result = input.find_wildcard_files(instance,filename) + elseif input.aux.qualified_path(filename) then + if input.is_readable.file(filename) then + input.logger('! qualified', filename) + result = { filename } + else + local forcedname, ok = "", false + if file.extname(filename) == "" then + if instance.format == "" then + forcedname = filename .. ".tex" + if input.is_readable.file(forcedname) then + input.logger('! no suffix, forcing standard filetype tex') + result, ok = { forcedname }, true + end + else + for _, s in pairs(input.suffixes_of_format(instance.format)) do + forcedname = filename .. "." .. s + if input.is_readable.file(forcedname) then + input.logger('! no suffix, forcing format filetype', s) + result, ok = { forcedname }, true + break + end + end + end + end + if not ok then + input.logger('? qualified', filename) + end + end + else + -- search spec + local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename) + if ext == "" then + if not instance.force_suffixes then + table.insert(wantedfiles, filename) + end + else + table.insert(wantedfiles, filename) + end + if instance.format == "" then + if ext == "" then + local forcedname = filename .. '.tex' + table.insert(wantedfiles, forcedname) + filetype = input.format_of_suffix(forcedname) + input.logger('! forcing filetype',filetype) + else + filetype = input.format_of_suffix(filename) + input.logger('! using suffix based filetype',filetype) + end + else + if ext == "" then + for _, s in pairs(input.suffixes_of_format(instance.format)) do + table.insert(wantedfiles, filename .. "." .. s) + end + end + filetype = instance.format + input.logger('! using given filetype',filetype) + end + local typespec = input.variable_of_format(filetype) + local pathlist = input.expanded_path_list(instance,typespec) + if not pathlist or #pathlist == 0 then + -- no pathlist, access check only + if input.trace > 2 then + input.logger('? filename',filename) + input.logger('? filetype',filetype or '?') + input.logger('? wanted files',table.concat(wantedfiles," | ")) + end + for _, fname in pairs(wantedfiles) do + if fname and input.is_readable.file(fname) then + filename, done = fname, true + table.insert(result, file.join('.',fname)) + break + end + end + -- this is actually 'other text files' or 'any' or 'whatever' + local filelist = input.aux.collect_files(instance,wantedfiles) + filename = filelist and filelist[1] + if filename then + table.insert(result, filename) + done = true + end + else + -- list search + local filelist = input.aux.collect_files(instance,wantedfiles) + local doscan, recurse + if input.trace > 2 then + input.logger('? filename',filename) + if pathlist then input.logger('? path list',table.concat(pathlist," | ")) end + if filelist then input.logger('? file list',table.concat(filelist," | ")) end + end + -- a bit messy ... esp the doscan setting here + for _, path in pairs(pathlist) do + if path:find("^!!") then doscan = false else doscan = true end + if path:find("//$") then recurse = true else recurse = false end + local pathname = path:gsub("^!+", '') + done = false + -- using file list + if filelist and not (done and not instance.allresults) and recurse then + -- compare list entries with permitted pattern + pathname = pathname:gsub("([%-%.])","%%%1") -- this also influences + pathname = pathname:gsub("/+$", '/.*') -- later usage of pathname + pathname = pathname:gsub("//", '/.-/') + expr = "^" .. pathname + -- input.debug('?',expr) + for _, f in pairs(filelist) do + if f:find(expr) then + -- input.debug('T',' '..f) + if input.trace > 2 then + input.logger('= found in hash',f) + end + table.insert(result,f) + input.aux.register_in_trees(instance,f) -- for tracing used files + done = true + if not instance.allresults then break end + else + -- input.debug('F',' '..f) + end + end + end + if not done and doscan then + -- check if on disk / unchecked / does not work at all + if input.method_is_file(pathname) then -- ? + local pname = pathname:gsub("%.%*$",'') + if not pname:find("%*") then + local ppname = pname:gsub("/+$","") + if input.aux.can_be_dir(instance,ppname) then + for _, w in pairs(wantedfiles) do + local fname = file.join(ppname,w) + if input.is_readable.file(fname) then + if input.trace > 2 then + input.logger('= found by scanning',fname) + end + table.insert(result,fname) + done = true + if not instance.allresults then break end + end + end + else + -- no access needed for non existing path, speedup (esp in large tree with lots of fake) + end + end + end + end + if not done and doscan then + -- todo: slow path scanning + end + if done and not instance.allresults then break end + end + end + end + for k,v in pairs(result) do + result[k] = file.collapse_path(v) + end + if instance.remember then + instance.found[stamp] = result + end + return result +end + +input.aux._find_file_ = input.aux.find_file + +function input.aux.find_file(instance,filename) -- maybe make a lowres cache too + local result = input.aux._find_file_(instance,filename) + if #result == 0 then + local lowered = filename:lower() + if filename ~= lowered then + return input.aux._find_file_(instance,lowered) + end + end + return result +end + +if lfs and lfs.isfile then + input.aux.is_file = lfs.isfile -- to be done: use this +else + input.aux.is_file = file.is_readable +end + +if lfs and lfs.isdir then + function input.aux.can_be_dir(instance,name) + if not instance.fakepaths[name] then + if lfs.isdir(name) then + instance.fakepaths[name] = 1 -- directory + else + instance.fakepaths[name] = 2 -- no directory + end + end + return (instance.fakepaths[name] == 1) + end +else + function input.aux.can_be_dir() + return true + end +end + +if not input.concatinators then input.concatinators = { } end + +function input.concatinators.tex(tag,path,name) + return tag .. '/' .. path .. '/' .. name +end + +input.concatinators.file = input.concatinators.tex + +function input.find_files(instance,filename,filetype,mustexist) + if type(mustexist) == boolean then + -- all set + elseif type(filetype) == 'boolean' then + filetype, mustexist = nil, false + elseif type(filetype) ~= 'string' then + filetype, mustexist = nil, false + end + instance.format = filetype or '' + local t = input.aux.find_file(instance,filename,true) + instance.format = '' + return t +end + +function input.find_file(instance,filename,filetype,mustexist) + return (input.find_files(instance,filename,filetype,mustexist)[1] or "") +end + +function input.find_given_files(instance,filename) + local bname, result = file.basename(filename), { } + for k, hash in pairs(instance.hashes) do + local blist = instance.files[hash.tag][bname] + if blist then + if type(blist) == 'string' then + table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "") + if not instance.allresults then break end + else + for kk,vv in pairs(blist) do + table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "") + if not instance.allresults then break end + end + end + end + end + return result +end + +function input.find_given_file(instance,filename) + return (input.find_given_files(instance,filename)[1] or "") +end + +--~ function input.find_wildcard_files(instance,filename) +--~ local result = { } +--~ local bname, dname = file.basename(filename), file.dirname(filename) +--~ local expr = dname:gsub("^*/","") +--~ expr = expr:gsub("*",".*") +--~ expr = expr:gsub("-","%-") +--~ for k, hash in pairs(instance.hashes) do +--~ local blist = instance.files[hash.tag][bname] +--~ if blist then +--~ if type(blist) == 'string' then +--~ -- make function and share code +--~ if blist:find(expr) then +--~ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "") +--~ if not instance.allresults then break end +--~ end +--~ else +--~ for kk,vv in pairs(blist) do +--~ if vv:find(expr) then +--~ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "") +--~ if not instance.allresults then break end +--~ end +--~ end +--~ end +--~ end +--~ end +--~ return result +--~ end + +function input.find_wildcard_files(instance,filename) + local result = { } + local bname, dname = file.basename(filename), file.dirname(filename) + local path = dname:gsub("^*/","") + path = path:gsub("*",".*") + path = path:gsub("-","%%-") + if dname == "" then + path = ".*" + end + local name = bname + name = name:gsub("*",".*") + name = name:gsub("-","%%-") + path = path:lower() + name = name:lower() + local function doit(blist,bname,hash,allresults) + local done = false + if blist then + if type(blist) == 'string' then + -- make function and share code + if (blist:lower()):find(path) then + table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "") + done = true + end + else + for kk,vv in pairs(blist) do + if (vv:lower()):find(path) then + table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "") + done = true + if not allresults then break end + end + end + end + end + return done + end + local files, allresults, done = instance.files, instance.allresults, false + if name:find("%*") then + for k, hash in pairs(instance.hashes) do + for kk, hh in pairs(files[hash.tag]) do + if (kk:lower()):find(name) then + if doit(hh,kk,hash,allresults) then done = true end + if done and not allresults then break end + end + end + end + else + for k, hash in pairs(instance.hashes) do + if doit(files[hash.tag][bname],bname,hash,allresults) then done = true end + if done and not allresults then break end + end + end + return result +end + +function input.find_wildcard_file(instance,filename) + return (input.find_wildcard_files(instance,filename)[1] or "") +end + +-- main user functions + +function input.save_used_files_in_trees(instance, filename,jobname) + if not filename then filename = 'luatex.jlg' end + local f = io.open(filename,'w') + if f then + f:write("\n") + f:write("\n") + if jobname then + f:write("\t" .. jobname .. "\n") + end + f:write("\t\n") + for _,v in pairs(table.sortedkeys(instance.foundintrees)) do + f:write("\t\t" .. v .. "\n") + end + f:write("\t\n") + f:write("\n") + f:close() + end +end + +function input.automount(instance) + -- implemented later +end + +function input.load(instance) + input.start_timing(instance) + input.identify_cnf(instance) + input.load_cnf(instance) + input.expand_variables(instance) + input.load_hash(instance) + input.automount(instance) + input.stop_timing(instance) +end + +function input.for_files(instance, command, files, filetype, mustexist) + if files and #files > 0 then + local function report(str) + if input.verbose then + input.report(str) -- has already verbose + else + print(str) + end + end + if input.verbose then + report('') + end + for _, file in pairs(files) do + local result = command(instance,file,filetype,mustexist) + if type(result) == 'string' then + report(result) + else + for _,v in pairs(result) do + report(v) + end + end + end + end +end + +-- strtab + +function input.var_value(instance,str) -- output the value of variable $STRING. + return input.variable(instance,str) +end +function input.expand_var(instance,str) -- output variable expansion of STRING. + return input.expansion(instance,str) +end +function input.show_path(instance,str) -- output search path for file type NAME + return file.join_path(input.expanded_path_list(instance,input.format_of_var(str))) +end + +-- input.find_file(filename) +-- input.find_file(filename, filetype, mustexist) +-- input.find_file(filename, mustexist) +-- input.find_file(filename, filetype) + +function input.aux.register_file(files, name, path) + if files[name] then + if type(files[name]) == 'string' then + files[name] = { files[name], path } + else + files[name] = path + end + else + files[name] = path + end +end + +-- zip:: zip## zip:// +-- zip::pathtozipfile::pathinzipfile (also: pathtozipfile/pathinzipfile) +-- file::name +-- tex::name +-- kpse::name +-- kpse::format::name +-- parent::n::name +-- parent::name (default 2) + +if not input.finders then input.finders = { } end +if not input.openers then input.openers = { } end +if not input.loaders then input.loaders = { } end + +input.finders.notfound = { nil } +input.openers.notfound = { nil } +input.loaders.notfound = { false, nil, 0 } + +function input.splitmethod(filename) + local method, specification = filename:match("^(.-)##(.+)$") + if method and specification then + return method, specification + else + return 'tex', filename + end +end + +function input.method_is_file(filename) + local method, specification = input.splitmethod(filename) + return method == 'tex' or method == 'file' +end + +function input.methodhandler(what, instance, filename, filetype) -- ... + local method, specification = input.splitmethod(filename) + if method and specification then -- redundant + if input[what][method] then + input.logger('= handler',filename.." -> "..what.." | "..method.." | "..specification) + return input[what][method](instance,specification,filetype) + else + return nil + end + else + return input[what].tex(instance,filename,filetype) + end +end + +-- also inside next test? + +function input.findtexfile(instance, filename, filetype) + return input.methodhandler('finders',instance, input.normalize_name(filename), filetype) +end +function input.opentexfile(instance,filename) + return input.methodhandler('openers',instance, input.normalize_name(filename)) +end + +function input.findbinfile(instance, filename, filetype) + return input.methodhandler('finders',instance, input.normalize_name(filename), filetype) +end +function input.openbinfile(instance,filename) + return input.methodhandler('loaders',instance, input.normalize_name(filename)) +end + +function input.loadbinfile(instance, filename, filetype) + local fname = input.findbinfile(instance, input.normalize_name(filename), filetype) + if fname and fname ~= "" then + return input.openbinfile(instance,fname) + else + return unpack(input.loaders.notfound) + end +end + +function input.texdatablob(instance, filename, filetype) + local ok, data, size = input.loadbinfile(instance, filename, filetype) + return data or "" +end + +function input.openfile(filename) -- brrr texmf.instance here / todo ! ! ! ! ! + local fullname = input.findtexfile(texmf.instance, filename) + if fullname and (fullname ~= "") then + return input.opentexfile(texmf.instance, fullname) + else + return nil + end +end + +function input.logmode() + return (os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"):lower() +end + +-- this is a prelude to engine/progname specific configuration files +-- in which case we can omit files meant for other programs and +-- packages + +--- ctx + +-- maybe texinputs + font paths +-- maybe positive selection tex/context fonts/tfm|afm|vf|opentype|type1|map|enc + +input.validators = { } +input.validators.visibility = { } + +function input.validators.visibility.default(path, name) + return true +end + +function input.validators.visibility.context(path, name) + path = path[1] or path -- some day a loop + return not ( + path:find("latex") or + path:find("doc") or + path:find("tex4ht") or + path:find("source") or +-- path:find("config") or +-- path:find("metafont") or + path:find("lists$") or + name:find("%.tpm$") or + name:find("%.bak$") + ) +end + +-- todo: describe which functions are public (maybe input.private. ... ) + +-- beware: i need to check where we still need a / on windows: + +function input.clean_path(str) + -- return string.gsub(string.gsub(string.gsub(str,"\\","/"),"^!+",""),"//$","/") + return (string.gsub(string.gsub(str,"\\","/"),"^!+","")) +end +function input.do_with_path(name,func) + for _, v in pairs(input.expanded_path_list(instance,name)) do + func("^"..input.clean_path(v)) + end +end +function input.do_with_var(name,func) + func(input.aux.expanded_var(name)) +end + +function input.with_files(instance,pattern,handle) + for _, hash in pairs(instance.hashes) do + local blobpath = hash.tag + local blobtype = hash.type + if blobpath and instance.files[blobpath] then -- sort them? + for k,v in pairs(instance.files[blobpath]) do + if k:find(pattern) then + if type(v) == "string" then + handle(blobtype,blobpath,v,k) + else + for _,vv in pairs(v) do + handle(blobtype,blobpath,vv,k) + end + end + end + end + end + end +end + +function input.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix + newname = file.addsuffix(newname,"lua") + newscript = input.clean_path(input.find_file(instance, newname)) + oldscript = input.clean_path(oldname) + input.report("old script", oldscript) + input.report("new script", newscript) + if oldscript ~= newscript and (oldscript:find(file.removesuffix(newname).."$") or oldscript:find(newname.."$")) then + newdata = io.loaddata(newscript) + if newdata then + input.report("old script content replaced by new content") + io.savedata(oldscript,newdata) + end + end +end + + +if not modules then modules = { } end modules ['luat-tmp'] = { + version = 1.001, + comment = "companion to luat-lib.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

This module deals with caching data. It sets up the paths and +implements loaders and savers for tables. Best is to set the +following variable. When not set, the usual paths will be +checked. Personally I prefer the (users) temporary path.

+ + +TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;. + + +

Currently we do no locking when we write files. This is no real +problem because most caching involves fonts and the chance of them +being written at the same time is small. We also need to extend +luatools with a recache feature.

+--ldx]]-- + +cache = cache or { } +dir = dir or { } +texmf = texmf or { } + +cache.path = nil +cache.base = cache.base or "luatex-cache" +cache.more = cache.more or "context" +cache.direct = false -- true is faster but may need huge amounts of memory +cache.trace = false +cache.tree = false +cache.temp = os.getenv("TEXMFCACHE") or os.getenv("HOME") or os.getenv("HOMEPATH") or os.getenv("VARTEXMF") or os.getenv("TEXMFVAR") or os.getenv("TMP") or os.getenv("TEMP") or os.getenv("TMPDIR") or nil +cache.paths = { cache.temp } + +if not cache.temp then + print("\nFATAL ERROR: NO VALID TEMPORARY PATH\n") + os.exit() +end + +function cache.configpath(instance) + return input.expand_var(instance,"TEXMFCNF") +end + +function cache.treehash(instance) + local tree = cache.configpath(instance) + if not tree or tree == "" then + return false + else + return md5.hex(tree) + end +end + +function cache.setpath(instance,...) + if not cache.path then + if lfs and instance then + for _,v in pairs(cache.paths) do + for _,vv in pairs(input.expanded_path_list(instance,v)) do + if lfs.isdir(vv) then + cache.path = vv + break + end + end + if cache.path then break end + end + end + if not cache.path then + cache.path = cache.temp + end + if lfs then + cache.tree = cache.tree or cache.treehash(instance) + if cache.tree then + cache.path = dir.mkdirs(cache.path,cache.base,cache.more,cache.tree) + else + cache.path = dir.mkdirs(cache.path,cache.base,cache.more) + end + end + end + if not cache.path then + cache.path = '.' + end + cache.path = input.clean_path(cache.path) + if lfs and not table.is_empty({...}) then + local pth = dir.mkdirs(cache.path,...) + return pth + end + return cache.path +end + +function cache.setluanames(path,name) + return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc" +end + +function cache.loaddata(path,name) + local tmaname, tmcname = cache.setluanames(path,name) + local loader = loadfile(tmcname) or loadfile(tmaname) + if loader then + return loader() + else + return false + end +end + +function cache.is_writable(filepath,filename) + local tmaname, tmcname = cache.setluanames(filepath,filename) + return file.is_writable(tmaname) +end + +function cache.savedata(filepath,filename,data,raw) -- raw needed for file cache + local tmaname, tmcname = cache.setluanames(filepath,filename) + local reduce, simplify = true, true + if raw then + reduce, simplify = false, false + end + if cache.direct then + file.savedata(tmaname, table.serialize(data,'return',true,true)) + else + table.tofile (tmaname, data,'return',true,true) -- maybe not the last true + end + utils.lua.compile(tmaname, tmcname) +end + +-- here we use the cache for format loading (texconfig.[formatname|jobname]) + +if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then + if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end + texconfig.formatname = cache.setpath(instance,"format") .. "/" .. texconfig.luaname:gsub("%.lu.$",".fmt") +end + +--[[ldx-- +

Once we found ourselves defining similar cache constructs +several times, containers were introduced. Containers are used +to collect tables in memory and reuse them when possible based +on (unique) hashes (to be provided by the calling function).

+ +

Caching to disk is disabled by default. Version numbers are +stored in the saved table which makes it possible to change the +table structures without bothering about the disk cache.

+ +

Examples of usage can be found in the font related code.

+--ldx]]-- + +containers = { } +containers.trace = false + +do -- local report + + local function report(container,tag,name) + if cache.trace or containers.trace or container.trace then + logs.report(string.format("%s cache",container.subcategory),string.format("%s: %s",tag,name or 'invalid')) + end + end + + function containers.define(category, subcategory, version, enabled) + if category and subcategory then + return { + category = category, + subcategory = subcategory, + storage = { }, + enabled = enabled, + version = version or 1.000, + trace = false, + path = cache.setpath(texmf.instance,category,subcategory), + } + else + return nil + end + end + + function containers.is_usable(container, name) + return container.enabled and cache.is_writable(container.path, name) + end + + function containers.is_valid(container, name) + if name and name ~= "" then + local cs = container.storage[name] + return cs and not table.is_empty(cs) and cs.cache_version == container.version + else + return false + end + end + + function containers.read(container,name) + if container.enabled and not container.storage[name] then + container.storage[name] = cache.loaddata(container.path,name) + if containers.is_valid(container,name) then + report(container,"loaded",name) + else + container.storage[name] = nil + end + end + if container.storage[name] then + report(container,"reusing",name) + end + return container.storage[name] + end + + function containers.write(container, name, data) + if data then + data.cache_version = container.version + if container.enabled then + local unique, shared = data.unique, data.shared + data.unique, data.shared = nil, nil + cache.savedata(container.path, name, data) + report(container,"saved",name) + data.unique, data.shared = unique, shared + end + report(container,"stored",name) + container.storage[name] = data + end + return data + end + + function containers.content(container,name) + return container.storage[name] + end + +end + +-- since we want to use the cache instead of the tree, we will now +-- reimplement the saver. + +input.usecache = true + +function input.aux.save_data(instance, dataname, check) + for cachename, files in pairs(instance[dataname]) do + local name + if input.usecache then + name = file.join(cache.setpath(instance,"trees"),md5.hex(cachename)) + else + name = file.join(cachename,dataname) + end + local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix + input.report("preparing " .. dataname .. " in", luaname) + for k, v in pairs(files) do + if not check or check(v,k) then -- path, name + if #v == 1 then + files[k] = v[1] + end + else + files[k] = nil -- false + end + end + local data = { + type = dataname, + root = cachename, + version = input.cacheversion, + date = os.date("%Y-%m-%d"), + time = os.date("%H:%M:%S"), + content = files, + } + local f = io.open(luaname,'w') + if f then + input.report("saving " .. dataname .. " in", luaname) + -- f:write(table.serialize(data,'return')) + f:write(input.serialize(data)) + f:close() + input.report("compiling " .. dataname .. " to", lucname) + if not utils.lua.compile(luaname,lucname) then + input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname) + os.remove(lucname) + end + else + input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix) + end + end +end + +function input.serialize(files) + -- This version is somewhat optimized for the kind of + -- tables that we deal with, so it's much faster than + -- the generic serializer. This makes sense because + -- luatools and mtxtools are called frequently. Okay, + -- we pay a small price for properly tabbed tables. + local t = { } + local concat = table.concat + local sorted = table.sortedkeys + local function dump(k,v,m) + if type(v) == 'string' then + return m .. "['" .. k .. "']='" .. v .. "'," + elseif #v == 1 then + return m .. "['" .. k .. "']='" .. v[1] .. "'," + else + return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'}," + end + end + t[#t+1] = "return {" + if instance.sortdata then + for _, k in pairs(sorted(files)) do + local fk = files[k] + if type(fk) == 'table' then + t[#t+1] = "\t['" .. k .. "']={" + for _, kk in pairs(sorted(fk)) do + t[#t+1] = dump(kk,fk[kk],"\t\t") + end + t[#t+1] = "\t}," + else + t[#t+1] = dump(k,fk,"\t") + end + end + else + for k, v in pairs(files) do + if type(v) == 'table' then + t[#t+1] = "\t['" .. k .. "']={" + for kk,vv in pairs(v) do + t[#t+1] = dump(kk,vv,"\t\t") + end + t[#t+1] = "\t}," + else + t[#t+1] = dump(k,v,"\t") + end + end + end + t[#t+1] = "}" + return concat(t,"\n") +end + +function input.aux.load_data(instance,pathname,dataname,filename) + local luaname, lucname, pname, fname + if input.usecache then + pname, fname = cache.setpath(instance,"trees"), md5.hex(pathname) + filename = file.join(pname,fname) + else + if not filename or (filename == "") then + filename = dataname + end + pname, fname = pathname, filename + end + luaname = file.join(pname,fname) .. input.luasuffix + lucname = file.join(pname,fname) .. input.lucsuffix + local blob = loadfile(lucname) + if not blob then + blob = loadfile(luaname) + end + if blob then + local data = blob() + if data and data.content and data.type == dataname and data.version == input.cacheversion then + input.report("loading",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = data.content + else + input.report("skipping",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = { } + instance.loaderror = true + end + else + input.report("skipping",dataname,"for",pathname,"from",filename) + end +end + +-- we will make a better format, maybe something xml or just text + +input.automounted = input.automounted or { } + +function input.automount(instance,usecache) + local mountpaths = input.simplified_list(input.expansion(instance,'TEXMFMOUNT')) + if table.is_empty(mountpaths) and usecache then + mountpaths = { cache.setpath(instance,"mount") } + end + if not table.is_empty(mountpaths) then + input.starttiming(instance) + for k, root in pairs(mountpaths) do + local f = io.open(root.."/url.tmi") + if f then + for line in f:lines() do + if line then + if line:find("^[%%#%-]") then -- or %W + -- skip + elseif line:find("^zip://") then + input.report("mounting",line) + table.insert(input.automounted,line) + input.usezipfile(instance,line) + end + end + end + f:close() + end + end + input.stoptiming(instance) + end +end + +-- store info in format + +input.storage = { } +input.storage.data = { } +input.storage.min = 0 -- 500 +input.storage.max = input.storage.min - 1 +input.storage.trace = false -- true +input.storage.done = 0 +input.storage.evaluators = { } +-- (evaluate,message,names) + +function input.storage.register(...) + input.storage.data[#input.storage.data+1] = { ... } +end + +function input.storage.evaluate(name) + input.storage.evaluators[#input.storage.evaluators+1] = name +end + +function input.storage.finalize() -- we can prepend the string with "evaluate:" + for _, t in ipairs(input.storage.evaluators) do + for i, v in pairs(t) do + if type(v) == "string" then + t[i] = loadstring(v)() + elseif type(v) == "table" then + for _, vv in pairs(v) do + if type(vv) == "string" then + t[i] = loadstring(vv)() + end + end + end + end + end +end + +function input.storage.dump() + for name, data in ipairs(input.storage.data) do + local evaluate, message, original, target = data[1], data[2], data[3] ,data[4] + local name, initialize, finalize = nil, "", "" + for str in string.gmatch(target,"([^%.]+)") do + if name then + name = name .. "." .. str + else + name = str + end + initialize = string.format("%s %s = %s or {} ", initialize, name, name) + end + if evaluate then + finalize = "input.storage.evaluate(" .. name .. ")" + end + input.storage.max = input.storage.max + 1 + if input.storage.trace then + logs.report('storage',string.format('saving %s in slot %s',message,input.storage.max)) + lua.bytecode[input.storage.max] = loadstring( + initialize .. + string.format("logs.report('storage','restoring %s from slot %s') ",message,input.storage.max) .. + table.serialize(original,name) .. + finalize + ) + else + lua.bytecode[input.storage.max] = loadstring(initialize .. table.serialize(original,name) .. finalize) + end + end +end + +if lua.bytecode then -- from 0 upwards + local i = input.storage.min + while lua.bytecode[i] do + lua.bytecode[i]() + lua.bytecode[i] = nil + i = i + 1 + end + input.storage.done = i +end + + +-- end library merge + +own = { } + +own.libs = { -- todo: check which ones are really needed + 'l-string.lua', + 'l-table.lua', + 'l-io.lua', + 'l-md5.lua', + 'l-number.lua', + 'l-os.lua', + 'l-file.lua', + 'l-dir.lua', + 'l-boolean.lua', +-- 'l-unicode.lua', + 'l-utils.lua', +-- 'l-tex.lua', + 'luat-lib.lua', + 'luat-inp.lua', +-- 'luat-zip.lua', +-- 'luat-tex.lua', +-- 'luat-kps.lua', + 'luat-tmp.lua', +} + +-- We need this hack till luatex is fixed. +-- +-- for k,v in pairs(arg) do print(k,v) end + +if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then + arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil +end + +-- End of hack. + +own.name = (environment and environment.ownname) or arg[0] or 'luatools.lua' + +own.path = string.match(own.name,"^(.+)[\\/].-$") or "." +own.list = { '.' } +if own.path ~= '.' then + table.insert(own.list,own.path) +end +table.insert(own.list,own.path.."/../../../tex/context/base") +table.insert(own.list,own.path.."/mtx") +table.insert(own.list,own.path.."/../sources") + +function locate_libs() + for _, lib in pairs(own.libs) do + for _, pth in pairs(own.list) do + local filename = string.gsub(pth .. "/" .. lib,"\\","/") + local codeblob = loadfile(filename) + if codeblob then + codeblob() + own.list = { pth } -- speed up te search + break + end + end + end +end + +if not input then + locate_libs() +end + +if not input then + print("") + print("Mtxrun is unable to start up due to lack of libraries. You may") + print("try to run 'lua mtxrun.lua --selfmerge' in the path where this") + print("script is located (normally under ..../scripts/context/lua) which") + print("will make this script library independent.") + os.exit() +end + +instance = input.reset() +input.verbose = environment.argument("verbose") or false +input.banner = 'MtxRun | ' +utils.report = input.report + +instance.engine = environment.argument("engine") or 'luatex' +instance.progname = environment.argument("progname") or 'context' +instance.lsrmode = environment.argument("lsr") or false + +-- use os.env or environment when available + +function os.setenv(key,value) + -- todo +end + +function input.check_environment(tree) + input.report('') + os.setenv('TMP', os.getenv('TMP') or os.getenv('TEMP') or os.getenv('TMPDIR') or os.getenv('HOME')) + if os.platform == 'linux' then + os.setenv('TEXOS', os.getenv('TEXOS') or 'texmf-linux') + elseif os.platform == 'windows' then + os.setenv('TEXOS', os.getenv('TEXOS') or 'texmf-windows') + elseif os.platform == 'macosx' then + os.setenv('TEXOS', os.getenv('TEXOS') or 'texmf-macosx') + end + os.setenv('TEXOS', string.gsub(string.gsub(os.getenv('TEXOS'),"^[\\\/]*", ''),"[\\\/]*$", '')) + os.setenv('TEXPATH', string.gsub(tree,"\/+$",'')) + os.setenv('TEXMFOS', os.getenv('TEXPATH') .. "/" .. os.getenv('TEXOS')) + input.report('') + input.report("preset : TEXPATH => " .. os.getenv('TEXPATH')) + input.report("preset : TEXOS => " .. os.getenv('TEXOS')) + input.report("preset : TEXMFOS => " .. os.getenv('TEXMFOS')) + input.report("preset : TMP => " .. os.getenv('TMP')) + input.report('') +end + +function input.load_environment(name) -- todo: key=value as well as lua + local f = io.open(name) + if f then + for line in f:lines() do + if line:find("^[%%%#]") then + -- skip comment + else + local key, how, value = line:match("^(.-)%s*([%<%=%>%?]+)%s*(.*)%s*$") + value = value:gsub("^%%(.+)%%$", function(v) return os.getenv(v) or "" end) + if how == "=" or how == "<<" then + os.setenv(key,value) + elseif how == "?" or how == "??" then + os.setenv(key,os.getenv(key) or value) + elseif how == "<" or how == "+=" then + if os.getenv(key) then + os.setenv(key,os.getenv(key) .. io.fileseparator .. value) + else + os.setenv(key,value) + end + elseif how == ">" or how == "=+" then + if os.getenv(key) then + os.setenv(key,value .. io.pathseparator .. os.getenv(key)) + else + os.setenv(key,value) + end + end + end + end + f:close() + end +end + +function input.load_tree(tree) + if tree and tree ~= "" then + local setuptex = 'setuptex.tmf' + if lfs.attributes(tree, mode) == "directory" then -- check if not nil + setuptex = tree .. "/" .. setuptex + else + setuptex = tree + end + if io.exists(setuptex) then + input.check_environment(tree) + input.load_environment(setuptex) + end + end +end + +-- md5 extensions + +-- maybe md.md5 md.md5hex md.md5HEX + +if not md5 then md5 = { } end + +if not md5.sum then + function md5.sum(k) + return string.rep("x",16) + end +end + +function md5.hexsum(k) + return (string.gsub(md5.sum(k), ".", function(c) return string.format("%02x", string.byte(c)) end)) +end + +function md5.HEXsum(k) + return (string.gsub(md5.sum(k), ".", function(c) return string.format("%02X", string.byte(c)) end)) +end + +-- file extensions + +file.needs_updating_threshold = 1 + +function file.needs_updating(oldname,newname) -- size modification access change + local oldtime = lfs.attributes(oldname, modification) + local newtime = lfs.attributes(newname, modification) + if newtime >= oldtime then + return false + elseif oldtime - newtime < file.needs_updating_threshold then + return false + else + return true + end +end + +function file.mdchecksum(name) + if md5 then + local data = io.loadall(name) + if data then + return md5.HEXsum(data) + end + end + return nil +end + +function file.loadchecksum(name) + if md then + local data = io.loadall(name .. ".md5") + if data then + return string.gsub(md5.HEXsum(data),"%s$","") + end + end + return nil +end + +function file.savechecksum(name, checksum) + if not checksum then checksum = file.mdchecksum(name) end + if checksum then + local f = io.open(name .. ".md5","w") + if f then + f:write(checksum) + f:close() + return checksum + end + end + return nil +end + +-- it starts here + +input.runners = { } +input.runners.applications = { } + +input.runners.applications.lua = "luatex --luaonly" +input.runners.applications.pl = "perl" +input.runners.applications.py = "python" +input.runners.applications.rb = "ruby" + +input.runners.suffixes = { + 'rb', 'lua', 'py', 'pl' +} + +input.runners.registered = { + texexec = { 'texexec.rb', true }, + texutil = { 'texutil.rb', true }, + texfont = { 'texfont.pl', true }, + texshow = { 'texshow.pl', false }, + + makempy = { 'makempy.pl', true }, + mptopdf = { 'mptopdf.pl', true }, + pstopdf = { 'pstopdf.rb', true }, + + examplex = { 'examplex.rb', false }, + concheck = { 'concheck.rb', false }, + + runtools = { 'runtools.rb', true }, + textools = { 'textools.rb', true }, + tmftools = { 'tmftools.rb', true }, + ctxtools = { 'ctxtools.rb', true }, + rlxtools = { 'rlxtools.rb', true }, + pdftools = { 'pdftools.rb', true }, + mpstools = { 'mpstools.rb', true }, + exatools = { 'exatools.rb', true }, + xmltools = { 'xmltools.rb', true }, + luatools = { 'luatools.lua', true }, + mtxtools = { 'mtxtools.rb', true }, + + pdftrimwhite = { 'pdftrimwhite.pl', false } +} + +if not messages then messages = { } end + +messages.help = [[ +--execute run a script or program +--resolve resolve prefixed arguments +--ctxlua run internally (using preloaded libs) +--locate locate given filename + +--autotree use texmf tree cf. env 'texmfstart_tree' or 'texmfstarttree' +--tree=pathtotree use given texmf tree (default file: 'setuptex.tmf') +--environment=name use given (tmf) environment file +--path=runpath go to given path before execution +--ifchanged=filename only execute when given file has changed (md checksum) +--iftouched=old,new only execute when given file has changed (time stamp) + +--make create stubs for (context related) scripts +--remove remove stubs (context related) scripts +--stubpath=binpath paths where stubs wil be written +--windows create windows (mswin) stubs +--unix create unix (linux) stubs + +--verbose give a bit more info +--engine=str target engine +--progname=str format or backend + +--edit launch editor with found file +--launch (--all) launch files (assume os support) + +--intern run script using built in libraries +]] + +function input.runners.my_prepare_a(instance) + input.identify_cnf(instance) + input.load_cnf(instance) + input.expand_variables(instance) +end + +function input.runners.my_prepare_b(instance) + input.runners.my_prepare_a(instance) + input.load_hash(instance) +end + +function input.runners.prepare(instance) + local checkname = environment.argument("ifchanged") + if checkname and checkname ~= "" then + local oldchecksum = file.loadchecksum(checkname) + local newchecksum = file.checksum(checkname) + if oldchecksum == newchecksum then + report("file '" .. checkname .. "' is unchanged") + return "skip" + else + report("file '" .. checkname .. "' is changed, processing started") + end + file.savechecksum(checkname) + end + local oldname, newname = string.split(environment.argument("iftouched") or "", ",") + if oldname and newname and oldname ~= "" and newname ~= "" then + if not file.needs_updating(oldname,newname) then + report("file '" .. oldname .. "' and '" .. newname .. "'have same age") + return "skip" + else + report("file '" .. newname .. "' is older than '" .. oldname .. "'") + end + end + local tree = environment.argument('tree') or "" + if environment.argument('autotree') then + tree = os.getenv('TEXMFSTART_TREE') or os.getenv('TEXMFSTARTTREE') or tree + end + if tree and tree ~= "" then + input.load_tree(tree) + end + local env = environment.argument('environment') or "" + if env and env ~= "" then + for _,e in pairs(string.split(env)) do + -- maybe force suffix when not given + input.load_tree(e) + end + end + local runpath = environment.argument("path") + if runpath and not dir.chdir(runpath) then + input.report("unable to change to path '" .. runpath .. "'") + return "error" + end + return "run" +end + +function input.runners.execute_script(instance,fullname,internal) + if fullname and fullname ~= "" then + local state = input.runners.prepare(instance) + if state == 'error' then + return false + elseif state == 'skip' then + return true + elseif state == "run" then + instance.progname = environment.argument("progname") or instance.progname + instance.format = environment.argument("format") or instance.format + local path, name, suffix, result = file.dirname(fullname), file.basename(fullname), file.extname(fullname), "" + if path ~= "" then + result = fullname + elseif name then + name = name:gsub("^int[%a]*:",function() + internal = true + return "" + end ) + name = name:gsub("^script:","") + if suffix == "" and input.runners.registered[name] and input.runners.registered[name][1] then + name = input.runners.registered[name][1] + suffix = file.extname(name) + end + if suffix == "" then + -- loop over known suffixes + for _,s in pairs(input.runners.suffixes) do + result = input.find_file(instance, name .. "." .. s, 'texmfscripts') + if result ~= "" then + break + end + end + elseif input.runners.applications[suffix] then + result = input.find_file(instance, name, 'texmfscripts') + else + -- maybe look on path + result = input.find_file(instance, name, 'other text files') + end + end + if result and result ~= "" then + if internal then + local before, after = environment.split_arguments(fullname) + arg = { } for _,v in pairs(after) do arg[#arg+1] = v end + dofile(result) + else + local binary = input.runners.applications[file.extname(result)] + if binary and binary ~= "" then + result = binary .. " " .. result + end + local before, after = environment.split_arguments(fullname) + -- environment.initialize_arguments(after) + -- local command = result .. " " .. environment.reconstruct_commandline(environment.original_arguments) -- bugged + local command = result .. " " .. environment.reconstruct_commandline(after) + input.report("") + input.report("executing: " .. command) + input.report("\n \n") + local code = os.exec(command) + return code == 0 + end + end + end + end + return false +end + +function input.runners.execute_program(instance,fullname) + if fullname and fullname ~= "" then + local state = input.runners.prepare(instance) + if state == 'error' then + return false + elseif state == 'skip' then + return true + elseif state == "run" then + local before, after = environment.split_arguments(fullname) + environment.initialize_arguments(after) + fullname = fullname:gsub("^bin:","") + local command = fullname .. " " .. environment.reconstruct_commandline(environment.original_arguments) + input.report("") + input.report("executing: " .. command) + input.report("\n \n") + local code = os.exec(command) + return code == 0 + end + end + return false +end + +function input.runners.handle_stubs(instance,create) + local stubpath = environment.argument('stubpath') or '.' -- 'auto' no longer supported + local windows = environment.argument('windows') or environment.argument('mswin') or false + local unix = environment.argument('unix') or environment.argument('linux') or false + if not windows and not unix then + if environment.platform == "unix" then + unix = true + else + windows = true + end + end + for _,v in pairs(input.runners.registered) do + local name, doit = v[1], v[2] + if doit then + local base = string.gsub(file.basename(name), "%.(.-)$", "") + if create then + -- direct local command = input.runners.applications[file.extname(name)] .. " " .. name + local command = "luatex --luaonly mtxrun.lua " .. name + if windows then + io.savedata(base..".bat", {"@echo off", command.." %*"}, "\013\010") + input.report("windows stub for '" .. base .. "' created") + end + if unix then + io.savedata(base, {"#!/bin/sh", command..' "$@"'}, "\010") + input.report("unix stub for '" .. base .. "' created") + end + else + if windows and (os.remove(base..'.bat') or os.remove(base..'.cmd')) then + input.report("windows stub for '" .. base .. "' removed") + end + if unix and (os.remove(base) or os.remove(base..'.sh')) then + input.report("unix stub for '" .. base .. "' removed") + end + end + end + end +end + +function input.resolve_prefixes(instance,str) + -- [env|environment|rel|relative|loc|locate|kpse|path|file]: + return (str:gsub("(%a+)%:(%S+)", function(k,v) + if k == "env" or k == "environment" then + v = os.getenv(k) or "" + elseif k == "rel" or k == "relative" then + for _,p in pairs({".","..","../.."}) do + local f = p .. "/" .. v + if file.exist(v) then break end + end + elseif k == "kpse" or k == "loc" or k == "locate" or k == "file" or k == "path" then +instance.progname = environment.argument("progname") or instance.progname +instance.format = environment.argument("format") or instance.format + v = input.find_given_file(instance, v) + if k == "path" then v = file.dirname(v) end + else + v = "" + end + return v + end)) +end + +function input.runners.resolve_string(instance) + instance.progname = environment.argument("progname") or environment.argument("program") or instance.progname + instance.format = environment.argument("format") or instance.format + input.runners.report_location(instance,input.resolve_prefixes(instance,table.join(environment.files, " "))) +end + +function input.runners.locate_file(instance) + instance.progname = environment.argument("progname") or instance.progname + instance.format = environment.argument("format") or instance.format + input.runners.report_location(instance,input.find_given_file(instance, environment.files[1] or "")) +end + +function input.runners.report_location(instance,result) + if input.verbose then + input.report("") + if result and result ~= "" then + input.report(result) + else + input.report("not found") + end + else + io.write(result) + end +end + +function input.runners.edit_script(instance,filename) + local editor = os.getenv("MTXRUN_EDITOR") or os.getenv("TEXMFSTART_EDITOR") or os.getenv("EDITOR") or 'scite' + local rest = input.resolve_prefixes(instance,filename) + if rest ~= "" then + os.launch(editor .. " " .. rest) + end +end + +input.runners.launchers = { + windows = { }, + unix = { } +} + +function input.launch(str) + -- maybe we also need to test on mtxrun.launcher.suffix environment + -- variable or on windows consult the assoc and ftype vars and such + local launchers = input.runners.launchers[os.platform] if launchers then + local suffix = file.extname(str) if suffix then + local runner = launchers[suffix] if runner then + str = runner .. " " .. str + end + end + end + os.launch(str) +end + +function input.runners.launch_file(instance,filename) + instance.allresults = true + input.verbose = true + local pattern = environment.arguments["pattern"] + if not pattern or pattern == "" then + pattern = filename + end + if not pattern or pattern == "" then + input.report("provide name or --pattern=") + else + local t = input.find_files(instance,environment.arguments["pattern"]) + -- local t = input.aux.find_file(instance,"*/" .. pattern,true) + if t and #t > 0 then + if environment.arguments["all"] then + for _, v in pairs(t) do + input.report("launching", v) + input.launch(v) + end + else + input.report("launching", t[1]) + input.launch(t[1]) + end + else + input.report("no match for", pattern) + end + end +end + +function input.runners.execute_ctx_script(instance,filename) + local before, after = environment.split_arguments(filename) + local suffix = "" + if not filename:find("%.lua$") then suffix = ".lua" end + local fullname = filename + -- just + fullname = filename .. suffix + fullname = input.find_file(instance,fullname) + -- mtx- + if not fullname or fullname == "" then + fullname = "mtx-" .. filename .. suffix + fullname = input.find_file(instance,fullname) + end + -- mtx-s + if not fullname or fullname == "" then + fullname = "mtx-" .. filename .. "s" .. suffix + fullname = input.find_file(instance,fullname) + end + -- mtx- + if not fullname or fullname == "" then + fullname = "mtx-" .. filename:gsub("s$","") .. suffix + fullname = input.find_file(instance,fullname) + end + -- that should do it + if fullname and fullname ~= "" then + local state = input.runners.prepare(instance) + if state == 'error' then + return false + elseif state == 'skip' then + return true + elseif state == "run" then + arg = { } for _,v in pairs(after) do arg[#arg+1] = v end + environment.initialize_arguments(arg) + filename = environment.files[1] + dofile(fullname) + return true + end + else + return false + end +end + +input.report(banner,"\n") + +function input.help(banner,message) + if not input.verbose then + input.verbose = true + input.report(banner,"\n") + end + input.reportlines(message) +end + +-- this is a bit dirty ... first we store the first filename and next we +-- split the arguments so that we only see the ones meant for this script +-- ... later we will use the second half + +local filename = environment.files[1] or "" +local ok = true + +local before, after = environment.split_arguments(filename) +environment.initialize_arguments(before) + +if environment.argument("selfmerge") then + -- embed used libraries + utils.merger.selfmerge(own.name,own.libs,own.list) +elseif environment.argument("selfclean") then + -- remove embedded libraries + utils.merger.selfclean(own.name) +elseif environment.arguments["selfupdate"] then + input.my_prepare_b(instance) + input.verbose = true + input.update_script(own.name,"mtxrun") +elseif environment.argument("ctxlua") or environment.argument("internal") then + -- run a script by loading it (using libs) + input.runners.my_prepare_b(instance) + ok = input.runners.execute_script(instance,filename,true) +elseif environment.argument("script") then + -- run a script by loading it (using libs), pass args + input.runners.my_prepare_b(instance) + ok = input.runners.execute_ctx_script(instance,filename) +elseif environment.argument("execute") then + -- execute script + input.runners.my_prepare_b(instance) + ok = input.runners.execute_script(instance,filename) +elseif environment.argument("direct") then + -- equals bin: + input.runners.my_prepare_b(instance) + ok = input.runners.execute_program(instance,filename) +elseif environment.argument("edit") then + -- edit file + input.runners.my_prepare_b(instance) + input.runners.edit_script(instance,filename) +elseif environment.argument("launch") then + input.runners.my_prepare_b(instance) + input.runners.launch_file(instance,filename) +elseif environment.argument("make") then + -- make stubs + input.runners.handle_stubs(instance,true) +elseif environment.argument("remove") then + -- remove stub + input.runners.handle_stubs(instance,false) +elseif environment.argument("resolve") then + -- resolve string + input.runners.my_prepare_b(instance) + input.runners.resolve_string(instance) +elseif environment.argument("locate") then + -- locate file + input.runners.my_prepare_b(instance) + input.runners.locate_file(instance) +elseif environment.argument("help") or filename=='help' or filename == "" then + input.help(banner,messages.help) +else + -- execute script + input.runners.my_prepare_b(instance) + if filename:find("^bin:") then + ok = input.runners.execute_program(instance,filename) + else + ok = input.runners.execute_script(instance,filename) + end +end + +--~ if input.verbose then +--~ input.report("") +--~ input.report("runtime: " .. os.clock() .. " seconds") +--~ end + +--~ if ok then +--~ input.report("exit code: 0") os.exit(0) +--~ else +--~ input.report("exit code: 1") os.exit(1) +--~ end + +if environment.platform == "unix" then + io.write("\n") +end diff --git a/scripts/context/lua/x-ldx.lua b/scripts/context/lua/x-ldx.lua new file mode 100644 index 000000000..3914b2907 --- /dev/null +++ b/scripts/context/lua/x-ldx.lua @@ -0,0 +1,310 @@ +--[[ldx-- +Lua Documentation Module + +This file is part of the documentation suite and +itself serves as an example of using in combination +with . + +I will rewrite this using lpeg once I have the time to study that nice new +subsystem. +--ldx]]-- + +banner = "version 1.0.1 - 2007+ - PRAGMA ADE / CONTEXT" + +--[[ +This script needs a few libraries. Instead of merging the code here +we can use + + +mtxrun --internal x-ldx.lua + + +That way, the libraries included in the runner will be used. +]]-- + +-- libraries l-string.lua l-table.lua l-io.lua l-file.lua + +-- begin library merge +-- end library merge + +--[[ +Just a demo comment line. We will handle such multiline comments but +only when they start and end at the beginning of a line. More rich +comments are tagged differently. +]]-- + +--[[ldx-- +First we define a proper namespace for this module. The l stands for +, the d for documentation and the x for +. +--ldx]]-- + +if not ldx then ldx = { } end + +--[[ldx-- +We load the lua file into a table. The entries in this table themselves are +tables and have keys like code and comment. +--ldx]]-- + +function ldx.load(filename) + local data = file.readdata(filename) + local expr = "%s*%-%-%[%[ldx%-*%s*(.-)%s*%-%-ldx%]%]%-*%s*" + local i, j, t = 0, 0, { } + while true do + local comment, ni + ni, j, comment = data:find(expr, j) + if not ni then break end + t[#t+1] = { code = data:sub(i, ni-1) } + t[#t+1] = { comment = comment } + i = j + 1 + end + local str = data:sub(i, #data) + str = str:gsub("^%s*(.-)%s*$", "%1") + if #str > 0 then + t[#t+1] = { code = str } + end + return t +end + +--[[ldx-- +We will tag keywords so that we can higlight them using a special font +or color. Users can extend this list when needed. +--ldx]]-- + +ldx.keywords = { } + +--[[ldx-- +Here come the reserved words: +--ldx]]-- + +ldx.keywords.reserved = { + ["and"] = 1, + ["break"] = 1, + ["do"] = 1, + ["else"] = 1, + ["elseif"] = 1, + ["end"] = 1, + ["false"] = 1, + ["for"] = 1, + ["function"] = 1, + ["if"] = 1, + ["in"] = 1, + ["local"] = 1, + ["nil"] = 1, + ["not"] = 1, + ["or"] = 1, + ["repeat"] = 1, + ["return"] = 1, + ["then"] = 1, + ["true"] = 1, + ["until"] = 1, + ["while"] = 1 +} + +--[[ldx-- +We need to escape a few tokens. We keep the hash local to the +definition but set it up only once, hence the do +construction. +--ldx]]-- + +do + local e = { [">"] = ">", ["<"] = "<", ["&"] = "&" } + function ldx.escape(str) + return str:gsub("([><&])",e) + end +end + +--[[ldx-- +Enhancing the code is a bit tricky due to the fact that we have to +deal with strings and escaped quotes within these strings. Before we +mess around with the code, we hide the strings, and after that we +insert them again. Single and double quoted strings are tagged so +that we can use a different font to highlight them. +--ldx]]-- + +ldx.make_index = true + +function ldx.enhance(data) + local e = ldx.escape + for _,v in pairs(data) do + if v.code then + local dqs, sqs, com, cmt, cod = { }, { }, { }, { }, e(v.code) + cod = cod:gsub("%-%-%[%[.-%]%]%-%-", function(s) + cmt[#cmt+1] = s + return "[[[[".. #cmt .."]]]]" + end) + cod = cod:gsub("%-%-([^\n]*)", function(s) + com[#com+1] = s + return "[[".. #com .."]]" + end) +--~ cod = cod:gsub('\\"', "<<>>") +--~ cod = cod:gsub("\\'", "<>") + cod = cod:gsub("(%b\"\")", function(s) + dqs[#dqs+1] = s:sub(2,-2) + return "<<<<".. #dqs ..">>>>" + end) + cod = cod:gsub("(%b\'\')", function(s) + sqs[#sqs+1] = s:sub(2,-2) + return "<<".. #sqs ..">>" + end) + cod = cod:gsub("(%a+)",function(key) + local class = ldx.keywords.reserved[key] + if class then + return "" .. key .. "" + else + return key + end + end) + cod = cod:gsub("%[%[%[%[(%d+)%]%]%]%]", function(s) + return cmt[tonumber(s)] + end) + cod = cod:gsub("%[%[(%d+)%]%]", function(s) + return "" .. com[tonumber(s)] .. "" + end) + cod = cod:gsub("<<<<(%d+)>>>>", function(s) + return "" .. dqs[tonumber(s)] .. "" + end) + cod = cod:gsub("<<(%d+)>>", function(s) + return "" .. sqs[tonumber(s)] .. "" + end) +--~ cod = cod:gsub("<<>>", "\\\"") +--~ cod = cod:gsub("<>" , "\\\'") + if ldx.make_index then + local lines = cod:split("\n") + local f = "(function)%s+([%w%.]+)%s*%(" + for k,v in pairs(lines) do + -- functies + v = v:gsub(f,function(key, str) + return "" .. str .. "(" + end) + -- variables + v = v:gsub("^([%w][%w%,%s]-)(=[^=])",function(str, rest) + local t = string.split(str, ",%s*") + for k,v in pairs(t) do + t[k] = "" .. v .. "" + end + return table.join(t,", ") .. rest + end) + -- so far + lines[k] = v + end + v.code = table.concat(lines,"\n") + else + v.code = cod + end + end + end +end + +--[[ldx-- +We're now ready to save the file in format. This boils +down to wrapping the code and comment as well as the whole document. We tag +lines in the code as such so that we don't need messy CDATA constructs +and by calculating the indentation we also avoid space troubles. It also makes +it possible to change the indentation afterwards. +--ldx]]-- + +function ldx.as_xml(data) + local t, cmode = { }, false + t[#t+1] = "\n" + t[#t+1] = "\n\n" + for _,v in pairs(data) do + if v.code and not v.code:is_empty() then + t[#t+1] = "\n\n" + for k,v in pairs(v.code:split("\n")) do -- make this faster + local a, b = v:find("^(%s+)") + if a and b then + if cmode then + t[#t+1] = "" .. v:sub(b+1,#v) .. "\n" + else + t[#t+1] = "" .. v:sub(b+1,#v) .. "\n" + end + elseif v:is_empty() then + if cmode then + t[#t+1] = "\n" + else + t[#t+1] = "\n" + end + elseif v:find("^%-%-%[%[") then + t[#t+1] = "" .. v .. "\n" + cmode= true + elseif v:find("^%]%]%-%-") then + t[#t+1] = "" .. v .. "\n" + cmode= false + elseif cmode then + t[#t+1] = "" .. v .. "\n" + else + t[#t+1] = "" .. v .. "\n" + end + end + t[#t+1] = "\n" + elseif v.comment then + t[#t+1] = "\n\n" .. v.comment .. "\n\n" + else + -- cannot happen + end + end + t[#t+1] = "\n\n" + return table.concat(t,"") +end + +--[[ldx-- +Saving the result is a trivial effort. +--ldx]]-- + +function ldx.save(filename,data) + file.savedata(filename,ldx.as_xml(data)) +end + +--[[ldx-- +The next function wraps it all in one call: +--ldx]]-- + +function ldx.convert(luaname,ldxname) + if not file.is_readable(luaname) then + luaname = luaname .. ".lua" + end + if file.is_readable(luaname) then + if not ldxname then + ldxname = file.replacesuffix(luaname,"ldx") + end + local data = ldx.load(luaname) + if data then + ldx.enhance(data) + if ldxname ~= luaname then + ldx.save(ldxname,data) + end + end + end +end + +--[[ldx-- +This module can be used directly: + + +mtxrun --internal x-ldx somefile.lua + + +will produce an ldx file that can be processed with +by running: + + +texexec --use=x-ldx --forcexml somefile.ldx + + +You can do this in one step by saying: + + +texmfstart texexec --ctx=x-ldx somefile.lua + + +This will trigger into loading the mentioned + file. That file describes the conversion as well +as the module to be used. + +The main conversion call is: +--ldx]]-- + +if arg and arg[1] then + ldx.convert(arg[1],arg[2]) +end diff --git a/scripts/context/ruby/base/merge.rb b/scripts/context/ruby/base/merge.rb index ad4b9c9e6..a66b97e91 100644 --- a/scripts/context/ruby/base/merge.rb +++ b/scripts/context/ruby/base/merge.rb @@ -38,7 +38,7 @@ module SelfMerge @@modules = $".collect do |file| File.expand_path(file) end @@modules.delete_if do |file| - file !~ /^#{@@ownpath}\/#{@@modroot}.*$/ + file !~ /^#{@@ownpath}\/#{@@modroot}.*$/i end def SelfMerge::ok? diff --git a/scripts/context/ruby/ctxtools.rb b/scripts/context/ruby/ctxtools.rb index 85b079ee1..724f5593f 100644 --- a/scripts/context/ruby/ctxtools.rb +++ b/scripts/context/ruby/ctxtools.rb @@ -334,7 +334,7 @@ class Commands report("generating #{keyfile}") begin - one = "texexec --make --alone --all #{interface}" + one = "texexec --make --all #{interface}" two = "texexec --batch --silent --interface=#{interface} x-set-01" if @commandline.option("force") then system(one) @@ -1639,23 +1639,22 @@ class Commands def dpxmapfiles - force = @commandline.option("force") + force = @commandline.option("force") texmfroot = @commandline.argument('first') texmfroot = '.' if texmfroot.empty? - if @commandline.option('maproot') then + if @commandline.option('maproot') != "" then maproot = @commandline.option('maproot') else maproot = "#{texmfroot.gsub(/\\/,'/')}/fonts/map/pdftex/context" end - if File.directory?(maproot) then files = Dir.glob("#{maproot}/*.map") if files.size > 0 then files.each do |pdffile| next if File.basename(pdffile) == 'pdftex.map' pdffile = File.expand_path(pdffile) - dpxfile = File.expand_path(pdffile.sub(/pdftex/i,'dvipdfm')) + dpxfile = File.expand_path(pdffile.sub(/(dvips|pdftex)/i,'dvipdfm')) unless pdffile == dpxfile then begin if data = File.read(pdffile) then @@ -2654,7 +2653,13 @@ class Commands end def remakeformats - return system("texmfstart texexec --make --all") + return system("mktexlsr") + return system("luatools --selfupdate") + return system("mtxrun --selfupdate") + return system("luatools --generate") + return system("texmfstart texexec --make --all --fast --pdftex") + return system("texmfstart texexec --make --all --fast --luatex") + return system("texmfstart texexec --make --all --fast --xetex") end if localtree = locatedlocaltree then diff --git a/scripts/context/ruby/mtxtools.rb b/scripts/context/ruby/mtxtools.rb new file mode 100644 index 000000000..41d0f7085 --- /dev/null +++ b/scripts/context/ruby/mtxtools.rb @@ -0,0 +1,475 @@ +#!/usr/bin/env ruby + +# program : mtxtools +# copyright : PRAGMA Advanced Document Engineering +# version : 2004-2005 +# author : Hans Hagen +# +# info : j.hagen@xs4all.nl +# www : www.pragma-ade.com + +# This script hosts MetaTeX related features. + +banner = ['MtxTools', 'version 1.0.0', '2006', 'PRAGMA ADE/POD'] + +$: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.uniq! + +require 'base/switch' +require 'base/logger' +require 'base/system' +require 'base/kpse' + +class Reporter + def report(str) + puts(str) + end +end + +module ConTeXt + + def ConTeXt::banner(filename,companionname,compact=false) + "-- filename : #{File.basename(filename)}\n" + + "-- comment : companion to #{File.basename(companionname)} (in ConTeXt)\n" + + "-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL\n" + + "-- copyright: PRAGMA ADE / ConTeXt Development Team\n" + + "-- license : see context related readme files\n" + + if compact then "\n-- remark : compact version\n" else "" end + end + +end + +class UnicodeTables + + @@version = "1.001" + + @@shape_a = /^((GREEK|LATIN|HEBREW)\s*(SMALL|CAPITAL|)\s*LETTER\s*[A-Z]+)$/ + @@shape_b = /^((GREEK|LATIN|HEBREW)\s*(SMALL|CAPITAL|)\s*LETTER\s*[A-Z]+)\s*(.+)$/ + + @@shape_a = /^(.*\s*LETTER\s*[A-Z]+)$/ + @@shape_b = /^(.*\s*LETTER\s*[A-Z]+)\s+WITH\s+(.+)$/ + + attr_accessor :context, :comment + + def initialize(logger=Reporter.new) + @data = Array.new + @logger = logger + @error = false + @context = true + @comment = true + @shapes = Hash.new + end + + def load_unicode_data(filename='unicodedata.txt') + # beware, the unicodedata table is bugged, sometimes ending + @logger.report("reading base data from #{filename}") if @logger + begin + IO.readlines(filename).each do |line| + if line =~ /^[0-9A-F]{4,4}/ then + d = line.chomp.sub(/\;$/, '').split(';') + if d then + while d.size < 15 do d << '' end + n = d[0].hex + @data[n] = d + if d[1] =~ @@shape_a then + @shapes[$1] = d[0] + end + end + end + end + rescue + @error = true + @logger.report("error while reading base data from #{filename}") if @logger + end + end + + def load_context_data(filename='contextnames.txt') + @logger.report("reading data from #{filename}") if @logger + begin + IO.readlines(filename).each do |line| + if line =~ /^[0-9A-F]{4,4}/ then + d = line.chomp.split(';') + if d then + n = d[0].hex + if @data[n] then + @data[d[0].hex] << d[1] # adobename == 15 + @data[d[0].hex] << d[2] # contextname == 16 + else + @logger.report("missing information about #{d} in #{filename}") if @logger + end + end + end + end + rescue + @error = true + @logger.report("error while reading context data from #{filename}") if @logger + end + end + + def save_metatex_data(filename='char-def.lua',compact=false) + if not @error then + begin + File.open(filename,'w') do |f| + @logger.report("saving data in #{filename}") if @logger + f << ConTeXt::banner(filename,'char-def.tex',compact) + f << "\n" + f << "\nif not versions then versions = { } end versions['#{filename.gsub(/\..*?$/,'')}'] = #{@@version}\n" + f << "\n" + f << "if not characters then characters = { } end\n" + f << "if not characters.data then characters.data = { } end\n" + f << "\n" + f << "characters.data = {\n" if compact + @data.each do |d| + if d then + r = metatex_data(d) + if compact then + f << "\t" << "[0x#{d[0]}]".rjust(8,' ') << " = { #{r.join(", ").gsub(/\t/,'')} }, \n" + else + f << "characters.define { -- #{d[0].hex}" << "\n" + f << r.join(",\n") << "\n" + f << "}" << "\n" + end + end + end + f << "}\n" if compact + end + rescue + @logger.report("error while saving data in #{filename}") if @logger + else + @logger.report("#{@data.size} (#{sprintf('%X',@data.size)}) entries saved in #{filename}") if @logger + end + else + @logger.report("not saving data in #{filename} due to previous error") if @logger + end + end + + def metatex_data(d) + r = Array.new + r << "\tunicodeslot=0x#{d[0]}" + if d[2] && ! d[2].empty? then + r << "\tcategory='#{d[2].downcase}'" + end + if @context then + if d[15] && ! d[15].empty? then + r << "\tadobename='#{d[15]}'" + end + if d[16] && ! d[16].empty? then + r << "\tcontextname='#{d[16]}'" + end + end + if @comment then + if d[1] == "" then + r << "\tdescription='#{d[10]}'" unless d[10].empty? + else + r << "\tdescription='#{d[1]}'" unless d[1].empty? + end + end + if d[1] =~ @@shape_b then + r << "\tshcode=0x#{@shapes[$1]}" if @shapes[$1] + end + if d[12] && ! d[12].empty? then + r << "\tuccode=0x#{d[12]}" + elsif d[14] && ! d[14].empty? then + r << "\tuccode=0x#{d[14]}" + end + if d[13] && ! d[13].empty? then + r << "\tlccode=0x#{d[13]}" + end + if d[5] && ! d[5].empty? then + special, specials = '', Array.new + c = d[5].split(/\s+/).collect do |cc| + if cc =~ /^\<(.*)\>$/io then + special = $1.downcase + else + specials << "0x#{cc}" + end + end + if specials.size > 0 then + special = 'char' if special.empty? + r << "\tspecials={'#{special}',#{specials.join(',')}}" + end + end + return r + end + + def save_xetex_data(filename='enco-utf.tex') + if not @error then + begin + minnumber, maxnumber, n = 0x001F, 0xFFFF, 0 + File.open(filename,'w') do |f| + @logger.report("saving data in #{filename}") if @logger + f << "% filename : #{filename}\n" + f << "% comment : poor man's alternative for a proper enco file\n" + f << "% this file is generated by mtxtools and can be\n" + f << "% used in xetex and luatex mkii mode\n" + f << "% author : Hans Hagen, PRAGMA-ADE, Hasselt NL\n" + f << "% copyright: PRAGMA ADE / ConTeXt Development Team\n" + f << "% license : see context related readme files\n" + f << "\n" + f << "\\ifx\\setcclcucx\\undefined\n" + f << "\n" + f << " \\def\\setcclcucx #1 #2 #3 %\n" + f << " {\\global\\catcode\"#1=11 \n" + f << " \\global\\lccode \"#1=\"#2 \n" + f << " \\global\\uccode \"#1=\"#3 }\n" + f << "\n" + f << "\\fi\n" + f << "\n" + @data.each do |d| + if d then + number, type = d[0], d[2].downcase + if number.hex >= minnumber && number.hex <= maxnumber && type =~ /^l(l|u|t)$/o then + if d[13] && ! d[13].empty? then + lc = d[13] + else + lc = number + end + if d[12] && ! d[12].empty? then + uc = d[12] + elsif d[14] && ! d[14].empty? then + uc = d[14] + else + uc = number + end + if @comment then + f << "\\setcclcuc #{number} #{lc} #{uc} % #{d[1]}\n" + else + f << "\\setcclcuc #{number} #{lc} #{uc} \n" + end + n += 1 + end + end + end + f << "\n" + f << "\\endinput\n" + end + rescue + @logger.report("error while saving data in #{filename}") if @logger + else + @logger.report("#{n} entries saved in #{filename}") if @logger + end + else + @logger.report("not saving data in #{filename} due to previous error") if @logger + end + end + +end + +class RegimeTables + + @@version = "1.001" + + def initialize(logger=Reporter.new) + @logger = logger + reset + end + + def reset + @code, @regime, @filename, @loaded = Array.new(256), '', '', false + (32..127).each do |i| + @code[i] = [sprintf('%04X',i), i.chr] + end + end + + def load(filename) + begin + reset + if filename =~ /regi\-(ini|run|uni|utf|syn)/ then + report("skipping #{filename}") + else + report("loading file #{filename}") + @regime, unicodeset = File.basename(filename).sub(/\..*?$/,''), false + IO.readlines(filename).each do |line| + case line + when /^\#/ then + # skip + when /^(0x[0-9A-F]+)\s+(0x[0-9A-F]+)\s+\#\s+(.*)$/ then + @code[$1.hex], unicodeset = [$2, $3], true + when /^(0x[0-9A-F]+)\s+(0x[0-9A-F]+)\s+/ then + @code[$1.hex], unicodeset = [$2, ''], true + end + end + reset if not unicodeset + end + rescue + report("problem in loading file #{filename}") + reset + else + if ! @regime.empty? then + @loaded = true + else + reset + end + end + end + + def save(filename,compact=false) + begin + if @loaded && ! @regime.empty? then + if File.expand_path(filename) == File.expand_path(@filename) then + report("saving in #{filename} is blocked") + else + report("saving file #{filename}") + File.open(filename,'w') do |f| + f << ConTeXt::banner(filename,'regi-ini.tex',compact) + f << "\n" + f << "\nif not versions then versions = { } end versions['#{filename.gsub(/\..*?$/,'')}'] = #{@@version}\n" + f << "\n" + f << "if not regimes then regimes = { } end\n" + f << "if not regimes.data then regimes.data = { } end\n" + f << "\n" + if compact then + f << "regimes.data[\"#{@regime}\"] = { [0] = \n\t" + i = 17 + @code.each_index do |c| + if (i-=1) == 0 then + i = 16 + f << "\n\t" + end + if @code[c] then + f << @code[c][0].rjust(6,' ') + else + f << "0x0000".rjust(6,' ') + end + f << ', ' if c<@code.length-1 + end + f << "\n}\n" + else + @code.each_index do |c| + if @code[c] then + f << someregimeslot(@regime,c,@code[c][0],@code[c][1]) + else + f << someregimeslot(@regime,c,'','') + end + end + end + end + end + end + rescue + report("problem in saving file #{filename} #{$!}") + end + end + + def report(str) + @logger.report(str) + end + + private + + def someregimeslot(regime,slot,unicodeslot,comment) + "regimes.define { #{if comment.empty? then '' else '-- ' end} #{comment}\n" + + "\tregime='#{regime}',\n" + + "\tslot='#{sprintf('0x%02X',slot)}',\n" + + "\tunicodeslot='#{if unicodeslot.empty? then '0x0000' else unicodeslot end}'\n" + + "}\n" + end + + public + + def RegimeTables::convert(filenames,compact=false) + filenames.each do |filename| + txtfile = File.expand_path(filename) + luafile = File.join(File.dirname(txtfile),'regi-'+File.basename(txtfile.sub(/\..*?$/, '.lua'))) + unless txtfile == luafile then + regime = RegimeTables.new + regime.load(txtfile) + regime.save(luafile,compact) + end + end + end + +end + +class Commands + + include CommandBase + + def unicodetable + unicode = UnicodeTables.new(logger) + unicode.load_unicode_data + unicode.load_context_data + unicode.save_metatex_data('char-def.lua',@commandline.option('compact')) + end + + def xetextable + unicode = UnicodeTables.new(logger) + unicode.load_unicode_data + unicode.load_context_data + # unicode.comment = false + unicode.save_xetex_data + end + + def regimetable + if @commandline.arguments.length > 0 then + RegimeTables::convert(@commandline.arguments, @commandline.option('compact')) + else + RegimeTables::convert(Dir.glob("cp*.txt") , @commandline.option('compact')) + RegimeTables::convert(Dir.glob("8859*.txt") , @commandline.option('compact')) + end + end + + def pdftextable + # instead of directly saving the data, we use luatex (kind of test) + pdfrdef = 'pdfr-def.tex' + tmpfile = 'mtxtools.tmp' + File.delete(pdfrdef) rescue false + if f = File.open(tmpfile,'w') then + f << "\\starttext\n" + f << "\\ctxlua{characters.pdftex.make_pdf_to_unicodetable('#{pdfrdef}')}\n" + f << "\\stoptext\n" + f.close() + system("texmfstart texexec --luatex --once --purge mtxtools.tmp") + report("vecor saved in #{pdfrdef}") + end + File.delete(tmpfile) rescue false + end + + def xmlmapfile + # instead of directly saving the data, we use luatex (kind of test) + tmpfile = 'mtxtools.tmp' + xmlsuffix = 'frx' + @commandline.arguments.each do |mapname| + if f = File.open(tmpfile,'w') then + xmlname = mapname.gsub(/\.map$/,".#{xmlsuffix}") + File.delete(xmlname) rescue false + f << "\\starttext\n" + f << "\\ctxlua{\n" + f << " mapname = input.find_file(texmf.instance,'#{mapname}') or ''\n" + f << " xmlname = '#{xmlname}'\n" + f << " if mapname and not mapname:is_empty() then\n" + f << " ctx.fonts.map.convert_file(mapname,xmlname)\n" + f << " end\n" + f << "}\n" + f << "\\stoptext\n" + f.close() + system("texmfstart texexec --luatex --once --purge mtxtools.tmp") + if FileTest.file?(xmlname) then + report("map file #{mapname} converted to #{xmlname}") + else + report("no valid map file #{mapname}") + end + end + end + File.delete(tmpfile) rescue false + end + +end + +logger = Logger.new(banner.shift) +commandline = CommandLine.new + +commandline.registeraction('unicodetable', 'create unicode table for metatex/luatex') +commandline.registeraction('regimetable' , 'create regime table(s) for metatex/luatex [--compact]') +commandline.registeraction('xetextable' , 'create unicode table for xetex') +commandline.registeraction('pdftextable' , 'create unicode table for xetex') +commandline.registeraction('xmlmapfile' , 'convert traditional mapfile to xml font resourse') + +# general + +commandline.registeraction('help') +commandline.registeraction('version') +commandline.registerflag('compact') + +commandline.expand + +Commands.new(commandline,logger,banner).send(commandline.action || 'help') diff --git a/scripts/context/ruby/texmfstart.rb b/scripts/context/ruby/texmfstart.rb index 4273de7bc..02d17d8f8 100644 --- a/scripts/context/ruby/texmfstart.rb +++ b/scripts/context/ruby/texmfstart.rb @@ -36,6 +36,8 @@ $: << File.expand_path(File.dirname($0)) ; $: << File.join($:.last,'lib') ; $:.u require "rbconfig" require "md5" +# funny, selfmergs was suddenly broken to case problems + # kpse_merge_done: require 'base/kpseremote' # kpse_merge_done: require 'base/kpsedirect' # kpse_merge_done: require 'base/kpsefast' @@ -43,127 +45,7 @@ require "md5" # kpse_merge_start -# kpse_merge_file: 'c:/data/develop/context/ruby/base/kpseremote.rb' - -# kpse_merge_done: require 'base/kpsefast' - -case ENV['KPSEMETHOD'] - when /soap/o then # kpse_merge_done: require 'base/kpse/soap' - when /drb/o then # kpse_merge_done: require 'base/kpse/drb' - else # kpse_merge_done: require 'base/kpse/drb' -end - -class KpseRemote - - @@port = ENV['KPSEPORT'] || 7000 - @@method = ENV['KPSEMETHOD'] || 'drb' - - def KpseRemote::available? - @@method && @@port - end - - def KpseRemote::start_server(port=nil) - kpse = KpseServer.new(port || @@port) - kpse.start - end - - def KpseRemote::start_client(port=nil) # keeps object in server - kpseclient = KpseClient.new(port || @@port) - kpseclient.start - kpse = kpseclient.object - tree = kpse.choose(KpseUtil::identify, KpseUtil::environment) - [kpse, tree] - end - - def KpseRemote::fetch(port=nil) # no need for defining methods but slower, send whole object - kpseclient = KpseClient.new(port || @@port) - kpseclient.start - kpseclient.object.fetch(KpseUtil::identify, KpseUtil::environment) rescue nil - end - - def initialize(port=nil) - if KpseRemote::available? then - begin - @kpse, @tree = KpseRemote::start_client(port) - rescue - @kpse, @tree = nil, nil - end - else - @kpse, @tree = nil, nil - end - end - - def progname=(value) - @kpse.set(@tree,'progname',value) - end - def format=(value) - @kpse.set(@tree,'format',value) - end - def engine=(value) - @kpse.set(@tree,'engine',value) - end - - def progname - @kpse.get(@tree,'progname') - end - def format - @kpse.get(@tree,'format') - end - def engine - @kpse.get(@tree,'engine') - end - - def load - @kpse.load(KpseUtil::identify, KpseUtil::environment) - end - def okay? - @kpse && @tree - end - def set(key,value) - @kpse.set(@tree,key,value) - end - def load_cnf - @kpse.load_cnf(@tree) - end - def load_lsr - @kpse.load_lsr(@tree) - end - def expand_variables - @kpse.expand_variables(@tree) - end - def expand_braces(str) - clean_name(@kpse.expand_braces(@tree,str)) - end - def expand_path(str) - clean_name(@kpse.expand_path(@tree,str)) - end - def expand_var(str) - clean_name(@kpse.expand_var(@tree,str)) - end - def show_path(str) - clean_name(@kpse.show_path(@tree,str)) - end - def var_value(str) - clean_name(@kpse.var_value(@tree,str)) - end - def find_file(filename) - clean_name(@kpse.find_file(@tree,filename)) - end - def find_files(filename,first=false) - # dodo: each filename - @kpse.find_files(@tree,filename,first) - end - - private - - def clean_name(str) - str.gsub(/\\/,'/') - end - -end - - -# kpse_merge_file: 'c:/data/develop/context/ruby/base/kpsefast.rb' +# kpse_merge_file: 't:/ruby/base/kpsefast.rb' # module : base/kpsefast # copyright : PRAGMA Advanced Document Engineering @@ -1097,67 +979,7 @@ end -# kpse_merge_file: 'c:/data/develop/context/ruby/base/kpse/drb.rb' - -require 'drb' -# kpse_merge_done: require 'base/kpse/trees' - -class KpseServer - - attr_accessor :port - - def initialize(port=7000) - @port = port - end - - def start - puts "starting drb service at port #{@port}" - DRb.start_service("druby://localhost:#{@port}", KpseTrees.new) - trap(:INT) do - DRb.stop_service - end - DRb.thread.join - end - - def stop - # todo - end - -end - -class KpseClient - - attr_accessor :port - - def initialize(port=7000) - @port = port - @kpse = nil - end - - def start - # only needed when callbacks are used / slow, due to Socket::getaddrinfo - # DRb.start_service - end - - def object - @kpse = DRbObject.new(nil,"druby://localhost:#{@port}") - end - -end - - -# SERVER_URI="druby://localhost:8787" -# -# # Start a local DRbServer to handle callbacks. -# # -# # Not necessary for this small example, but will be required -# # as soon as we pass a non-marshallable object as an argument -# # to a dRuby call. -# DRb.start_service -# - - -# kpse_merge_file: 'c:/data/develop/context/ruby/base/kpse/trees.rb' +# kpse_merge_file: 't:/ruby/base/kpse/trees.rb' require 'monitor' # kpse_merge_done: require 'base/kpsefast' @@ -1245,179 +1067,219 @@ class KpseTrees < Monitor end -# kpse_merge_file: 'c:/data/develop/context/ruby/base/kpsedirect.rb' +# kpse_merge_file: 't:/ruby/base/kpse/drb.rb' -class KpseDirect +require 'drb' +# kpse_merge_done: require 'base/kpse/trees' - attr_accessor :progname, :format, :engine +class KpseServer - def initialize - @progname, @format, @engine = '', '', '' - end + attr_accessor :port - def expand_path(str) - clean_name(`kpsewhich -expand-path=#{str}`.chomp) + def initialize(port=7000) + @port = port end - def expand_var(str) - clean_name(`kpsewhich -expand-var=#{str}`.chomp) + def start + puts "starting drb service at port #{@port}" + DRb.start_service("druby://localhost:#{@port}", KpseTrees.new) + trap(:INT) do + DRb.stop_service + end + DRb.thread.join end - def find_file(str) - clean_name(`kpsewhich #{_progname_} #{_format_} #{str}`.chomp) + def stop + # todo end - def _progname_ - if @progname.empty? then '' else "-progname=#{@progname}" end - end - def _format_ - if @format.empty? then '' else "-format=\"#{@format}\"" end +end + +class KpseClient + + attr_accessor :port + + def initialize(port=7000) + @port = port + @kpse = nil end - private + def start + # only needed when callbacks are used / slow, due to Socket::getaddrinfo + # DRb.start_service + end - def clean_name(str) - str.gsub(/\\/,'/') + def object + @kpse = DRbObject.new(nil,"druby://localhost:#{@port}") end end -# kpse_merge_file: 'c:/data/develop/context/ruby/base/merge.rb' - -# module : base/merge -# copyright : PRAGMA Advanced Document Engineering -# version : 2006 -# author : Hans Hagen +# SERVER_URI="druby://localhost:8787" +# +# # Start a local DRbServer to handle callbacks. +# # +# # Not necessary for this small example, but will be required +# # as soon as we pass a non-marshallable object as an argument +# # to a dRuby call. +# DRb.start_service # -# project : ConTeXt / eXaMpLe -# concept : Hans Hagen -# info : j.hagen@xs4all.nl -# this module will package all the used modules in the file itself -# so that we can relocate the file at wish, usage: -# -# merge: -# -# unless SelfMerge::ok? && SelfMerge::merge then -# puts("merging should happen on the path were the base inserts reside") -# end -# -# cleanup: -# -# unless SelfMerge::cleanup then -# puts("merging should happen on the path were the base inserts reside") +# kpse_merge_file: 't:/ruby/base/kpseremote.rb' -module SelfMerge +# kpse_merge_done: require 'base/kpsefast' - @@kpsemergestart = "\# kpse_merge_start" - @@kpsemergestop = "\# kpse_merge_stop" - @@kpsemergefile = "\# kpse_merge_file: " - @@kpsemergedone = "\# kpse_merge_done: " +case ENV['KPSEMETHOD'] + when /soap/o then # kpse_merge_done: require 'base/kpse/soap' + when /drb/o then # kpse_merge_done: require 'base/kpse/drb' + else # kpse_merge_done: require 'base/kpse/drb' +end - @@filename = File.basename($0) - @@ownpath = File.expand_path(File.dirname($0)) - @@modroot = '(base|graphics|rslb|www)' # needed in regex in order not to mess up SelfMerge - @@modules = $".collect do |file| File.expand_path(file) end +class KpseRemote - @@modules.delete_if do |file| - file !~ /^#{@@ownpath}\/#{@@modroot}.*$/ + @@port = ENV['KPSEPORT'] || 7000 + @@method = ENV['KPSEMETHOD'] || 'drb' + + def KpseRemote::available? + @@method && @@port end - def SelfMerge::ok? - begin - @@modules.each do |file| - return false unless FileTest.file?(file) - end - rescue - return false - else - return true - end + def KpseRemote::start_server(port=nil) + kpse = KpseServer.new(port || @@port) + kpse.start end - def SelfMerge::merge - begin - if SelfMerge::ok? && rbfile = IO.read(@@filename) then - begin - inserts = "#{@@kpsemergestart}\n\n" - @@modules.each do |file| - inserts << "#{@@kpsemergefile}'#{file}'\n\n" - inserts << IO.read(file).gsub(/^#.*?\n$/,'') - inserts << "\n\n" - end - inserts << "#{@@kpsemergestop}\n\n" - # no gsub! else we end up in SelfMerge - rbfile.sub!(/#{@@kpsemergestart}\s*#{@@kpsemergestop}/moi) do - inserts - end - rbfile.gsub!(/^(.*)(require [\"\'].*?#{@@modroot}.*)$/) do - pre, post = $1, $2 - if pre =~ /#{@@kpsemergedone}/ then - "#{pre}#{post}" - else - "#{pre}#{@@kpsemergedone}#{post}" - end - end - rescue - return false - else - begin - File.open(@@filename,'w') do |f| - f << rbfile - end - rescue - return false - end - end - end - rescue - return false - else - return true - end + def KpseRemote::start_client(port=nil) # keeps object in server + kpseclient = KpseClient.new(port || @@port) + kpseclient.start + kpse = kpseclient.object + tree = kpse.choose(KpseUtil::identify, KpseUtil::environment) + [kpse, tree] end - def SelfMerge::cleanup - begin - if rbfile = IO.read(@@filename) then - begin - rbfile.sub!(/#{@@kpsemergestart}(.*)#{@@kpsemergestop}\s*/moi) do - "#{@@kpsemergestart}\n\n#{@@kpsemergestop}\n\n" - end - rbfile.gsub!(/^(.*#{@@kpsemergedone}.*)$/) do - str = $1 - if str =~ /require [\"\']/ then - str.gsub(/#{@@kpsemergedone}/, '') - else - str - end - end - rescue - return false - else - begin - File.open(@@filename,'w') do |f| - f << rbfile - end - rescue - return false - end - end + def KpseRemote::fetch(port=nil) # no need for defining methods but slower, send whole object + kpseclient = KpseClient.new(port || @@port) + kpseclient.start + kpseclient.object.fetch(KpseUtil::identify, KpseUtil::environment) rescue nil + end + + def initialize(port=nil) + if KpseRemote::available? then + begin + @kpse, @tree = KpseRemote::start_client(port) + rescue + @kpse, @tree = nil, nil end - rescue - return false else - return true + @kpse, @tree = nil, nil end end - def SelfMerge::replace - if SelfMerge::ok? then - SelfMerge::cleanup - SelfMerge::merge - end + def progname=(value) + @kpse.set(@tree,'progname',value) + end + def format=(value) + @kpse.set(@tree,'format',value) + end + def engine=(value) + @kpse.set(@tree,'engine',value) + end + + def progname + @kpse.get(@tree,'progname') + end + def format + @kpse.get(@tree,'format') + end + def engine + @kpse.get(@tree,'engine') + end + + def load + @kpse.load(KpseUtil::identify, KpseUtil::environment) + end + def okay? + @kpse && @tree + end + def set(key,value) + @kpse.set(@tree,key,value) + end + def load_cnf + @kpse.load_cnf(@tree) + end + def load_lsr + @kpse.load_lsr(@tree) + end + def expand_variables + @kpse.expand_variables(@tree) + end + def expand_braces(str) + clean_name(@kpse.expand_braces(@tree,str)) + end + def expand_path(str) + clean_name(@kpse.expand_path(@tree,str)) + end + def expand_var(str) + clean_name(@kpse.expand_var(@tree,str)) + end + def show_path(str) + clean_name(@kpse.show_path(@tree,str)) + end + def var_value(str) + clean_name(@kpse.var_value(@tree,str)) + end + def find_file(filename) + clean_name(@kpse.find_file(@tree,filename)) + end + def find_files(filename,first=false) + # dodo: each filename + @kpse.find_files(@tree,filename,first) + end + + private + + def clean_name(str) + str.gsub(/\\/,'/') + end + +end + + +# kpse_merge_file: 't:/ruby/base/kpsedirect.rb' + +class KpseDirect + + attr_accessor :progname, :format, :engine + + def initialize + @progname, @format, @engine = '', '', '' + end + + def expand_path(str) + clean_name(`kpsewhich -expand-path=#{str}`.chomp) + end + + def expand_var(str) + clean_name(`kpsewhich -expand-var=#{str}`.chomp) + end + + def find_file(str) + clean_name(`kpsewhich #{_progname_} #{_format_} #{str}`.chomp) + end + + def _progname_ + if @progname.empty? then '' else "-progname=#{@progname}" end + end + def _format_ + if @format.empty? then '' else "-format=\"#{@format}\"" end + end + + private + + def clean_name(str) + str.gsub(/\\/,'/') end end @@ -2468,7 +2330,7 @@ def show_environment end end -def execute(arguments) +def execute(arguments) # br global arguments = arguments.split(/\s+/) if arguments.class == String $directives = hashed(arguments) diff --git a/tex/context/base/attr-ini.lua b/tex/context/base/attr-ini.lua new file mode 100644 index 000000000..4469608c4 --- /dev/null +++ b/tex/context/base/attr-ini.lua @@ -0,0 +1,669 @@ +if not modules then modules = { } end modules ['attr-ini'] = { + version = 1.001, + comment = "companion to attr-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- +-- attributes +-- + +nodes = nodes or { } + +-- We can distinguish between rules and glyphs but it's not worth the trouble. A +-- first implementation did that and while it saves a bit for glyphs and rules, it +-- costs more resourses for transparencies. So why bother. + +-- namespace for all those features / plural becomes singular + +-- i will do the resource stuff later, when we have an interface to pdf (ok, i can +-- fake it with tokens but it will take some coding + +function totokens(str) + local t = { } + for c in string.bytes(str) do + t[#t+1] = { 12, c } + end + return t +end + +function pdfliteral(str) + local t = node.new('whatsit',8) + t.mode = 1 -- direct + t.data = str -- totokens(str) + return t +end + +-- shipouts + +shipouts = shipouts or { } +shipouts.plugins = shipouts.plugins or { } + +do + + local hlist, vlist = node.id('hlist'), node.id('vlist') + + local function do_process_page(attribute,processor,head) -- maybe work with ranges + local previous, stack = nil, head + while stack do + local id = stack.id + if id == hlist or id == vlist then + local content = stack.list + if content then + stack.list = do_process_page(attribute,processor,content) + end + else + stack, previous, head = processor(attribute,stack,previous,head) + end + previous = stack + stack = stack.next + end + return head + end + + function nodes.process_page(head) + if head then + input.start_timing(nodes) + local done, used = false, { } + for name, plugin in pairs(shipouts.plugins) do + local attribute = attributes.numbers[name] + if attribute then + local initializer = plugin.initializer + local processor = plugin.processor + local finalizer = plugin.finalizer + if initializer then + initializer(attribute,head) + end + if processor then + head = do_process_page(attribute,processor,head) + end + if finalizer then + local ok + ok, head, used[attribute] = finalizer(attribute,head) + done = done or ok + end + else + texio.write_nl(string.format("undefined attribute %s",name)) + end + end + if done then + for name, plugin in pairs(shipouts.plugins) do + local attribute = attributes.numbers[name] + if used[attribute] then + local flusher = plugin.flusher + if flusher then + head = flusher(attribute,head,used[attribute]) + end + end + end + end + input.stop_timing(nodes) + end + return head + end + +end + +-- +-- attributes +-- + +attributes = attributes or { } + +attributes.names = attributes.names or { } +attributes.numbers = attributes.numbers or { } +attributes.list = attributes.list or { } + +input.storage.register(false,"attributes/names", attributes.names, "attributes.names") +input.storage.register(false,"attributes/numbers", attributes.numbers, "attributes.numbers") +input.storage.register(false,"attributes/list", attributes.list, "attributes.list") + +function attributes.define(name,number) + attributes.numbers[name], attributes.names[number], attributes.list[number] = number, name, { } +end + +-- +-- generic handlers +-- + +states = { } + +do + + local glyph, rule, whatsit = node.id('glyph'), node.id('rule'), node.id('whatsit') + + local current, used, done = 0, { }, false + + function states.initialize(what, attribute, stack) + current, used, done = 0, { }, false + end + + local contains = node.has_attribute + + function insert(n,stack,previous,head) + if n then + n = node.copy(n) + n.next = stack + if previous then + previous.next = n + else + head = n + end + previous = n + end + return stack, previous, head + end + + function states.finalize(what,attribute,head) + if what.enabled and what.none and current > 0 and head.list then + local head = head.list + stack, previous, head = insert(what.none,list,nil,list) + end + return done, head, used + end + +--~ function states.process(what,attribute,stack,previous,head) -- one attribute +--~ if what.enabled then +--~ local c = contains(stack,attribute) +--~ if c then +--~ if current ~= c then +--~ local id = stack.id +--~ if id == glyph or id == rule or id == whatsit then +--~ stack, previous, head = insert(what.data[c],stack,previous,head) +--~ current, done, used[c] = c, true, true +--~ end +--~ end +--~ elseif current > 0 then +--~ stack, previous, head = insert(what.none,stack,previous,head) +--~ current, done, used[0] = 0, true, true +--~ end +--~ end +--~ return stack, previous, head +--~ end + + function states.process(what,attribute,stack,previous,head) -- one attribute + if what.enabled then + local id = stack.id + if id == glyph or id == rule then -- or id == whatsit then + local c = contains(stack,attribute) + if c then + if current ~= c then + stack, previous, head = insert(what.data[c],stack,previous,head) + current, done, used[c] = c, true, true + end + elseif current > 0 then + stack, previous, head = insert(what.none,stack,previous,head) + current, done, used[0] = 0, true, true + end + end + end + return stack, previous, head + end + +--~ function states.selective(what,attribute,stack,previous,head) -- two attributes +--~ if what.enabled then +--~ local c = contains(stack,attribute) +--~ if c then +--~ if current ~= c then +--~ local id = stack.id +--~ if id == glyph or id == rule then -- or id == whatsit then +--~ stack, previous, head = insert(what.data[c][contains(stack,what.selector) or what.default],stack,previous,head) +--~ current, done, used[c] = c, true, true +--~ end +--~ end +--~ elseif current > 0 then +--~ local id = stack.id +--~ if id == glyph or id == rule then -- or id == whatsit then +--~ stack, previous, head = insert(what.none,stack,previous,head) +--~ current, done, used[0] = 0, true, true +--~ end +--~ end +--~ end +--~ return stack, previous, head +--~ end + + function states.selective(what,attribute,stack,previous,head) -- two attributes + if what.enabled then + local id = stack.id + if id == glyph or id == rule then -- or id == whatsit then + local c = contains(stack,attribute) + if c then + if current ~= c then + stack, previous, head = insert(what.data[c][contains(stack,what.selector) or what.default],stack,previous,head) + current, done, used[c] = c, true, true + end + elseif current > 0 then + stack, previous, head = insert(what.none,stack,previous,head) + current, done, used[0] = 0, true, true + end + end + end + return stack, previous, head + end + + collected = { } + + function states.collect(str) + collected[#collected+1] = str + end + + function states.flush() + for _, c in ipairs(collected) do + tex.sprint(tex.ctxcatcodes,c) + end + collected = { } + end + +end + +-- +-- colors +-- + +-- we can also collapse the two attributes: n, n+1, n+2 and then +-- at the tex end add 0, 1, 2, but this is not faster and less +-- flexible (since sometimes we freeze color attribute values at +-- the lua end of the game + +-- we also need to store the colorvalues because we need then in mp + +colors = colors or { } +colors.enabled = true +colors.data = colors.data or { } +colors.strings = colors.strings or { } +colors.registered = colors.registered or { } +colors.weightgray = true +colors.attribute = 0 +colors.selector = 0 +colors.default = 1 + +input.storage.register(true,"colors/data", colors.strings, "colors.data") +input.storage.register(false,"colors/registered", colors.registered, "colors.registered") + +colors.stamps = { + rgb = "r:%s:%s:%s", + cmyk = "c:%s:%s:%s:%s", + gray = "s:%s", + spot = "p:%s:%s" +} + +colors.models = { + all = 1, + gray = 2, + rgb = 3, + cmyk = 4 +} + +do + + local min = math.min + local max = math.max + local format = string.format + local concat = table.concat + + local function rgbdata(r,g,b) + return pdfliteral(format("%s %s %s rg %s %s %s RG",r,g,b,r,g,b)) + end + + local function cmykdata(c,m,y,k) + return pdfliteral(format("%s %s %s %s k %s %s %s %s K",c,m,y,k,c,m,y,k)) + end + + local function graydata(s) + return pdfliteral(format("%s g %s G",s,s)) + end + + local function spotdata(n,p) -- name, parent, ratio + if type(p) == "string" then + p = p:gsub(","," ") -- brr misuse of spot + end + return pdfliteral(format("/%s cs /%s CS %s SCN %s scn",n,n,p,p)) + end + + local function rgbtocmyk(r,g,b) + return 1-r, 1-g, 1-b, 0 + end + + local function cmyktorgb(c,m,y,k) + return 1.0 - min(1.0,c+k), 1.0 - min(1.0,m+k), 1.0 - min(1.0,y+k) + end + + local function rgbtogray(r,g,b) + if colors.weightgray then + return .30*r+.59*g+.11*b + else + return r/3+g/3+b/3 + end + end + + local function cmyktogray(c,m,y,k) + return rgbtogray(cmyktorgb(c,m,y,k)) + end + + -- we can share some *data by using s, rgb and cmyk hashes, but + -- normally the amount of colors is not that large; storing the + -- components costs a bit of extra runtime, but we expect to gain + -- some back because we have them at hand; the number indicates the + -- default color space + + function colors.gray(s) + local gray = graydata(s) + return { gray, gray, gray, gray, 2, s, 0, 0, 0, 0, 0, 0, 1 } + end + + function colors.rgb(r,g,b) + local s = rgbtogray(r,g,b) + local c, m, y, k = rgbtocmyk(r,g,b) + local gray, rgb, cmyk = graydata(s), rgbdata(r,g,b), cmykdata(c,m,y,k) + return { rgb, gray, rgb, cmyk, 3, s, r, g, b, c, m, y, k } + end + + function colors.cmyk(c,m,y,k) + local s = cmyktogray(c,m,y,k) + local r, g, b = cmyktorgb(c,m,y,k) + local gray, rgb, cmyk = graydata(s), rgbdata(r,g,b), cmykdata(c,m,y,k) + return { cmyk, gray, rgb, cmyk, 4, s, r, g, b, c, m, y, k } + end + + function colors.spot(parent,p) -- parent, ratio + local spot = spotdata(parent,p) + if type(p) == "string" and p:find(",") then + -- use converted replacement (combination color) + else + -- todo: map gray, rgb, cmyk onto fraction*parent + end + local gray, rgb, cmyk = graydata(.5), rgbdata(.5,.5,.5), cmykdata(0,0,0,.5) + return { spot, gray, rgb, cmyk, 5 } + end + + function colors.filter(n) + return concat(colors.data[n],":",5) + end + + colors.none = graydata(0) + +end + +-- conversion models + +function colors.setmodel(attribute,name) + colors.selector = attributes.numbers[attribute] + colors.default = colors.models[name] or 1 + return colors.default +end + +function colors.register(attribute, name, colorspace, ...) + local stamp = string.format(colors.stamps[colorspace], ...) + local color = colors.registered[stamp] + if not color then + local cd = colors.data + color = #cd+1 + cd[color] = colors[colorspace](...) + if environment.initex then + colors.strings[color] = "return colors." .. colorspace .. "(" .. table.concat({...},",") .. ")" + end + colors.registered[stamp] = color + end + attributes.list[attributes.numbers[attribute]][name] = color + return colors.registered[stamp] +end + +shipouts.plugins.color = { + initializer = function(...) return states.initialize(colors,...) end, + finalizer = function(...) return states.finalize (colors,...) end, + processor = function(...) return states.selective (colors,...) end, +} + +--- overprint / knockout + +overprints = { enabled = true , data = { } } + +overprints.none = pdfliteral(string.format("/GSoverprint gs")) +overprints.data[1] = pdfliteral(string.format("/GSknockout gs")) + +overprints.registered = { + overprint = 0, + knockout = 1, +} + +function overprints.register(stamp) + return overprints.registered[stamp] or overprints.registered.overprint +end + +shipouts.plugins.overprint = { + initializer = function(...) return states.initialize(overprints,...) end, + finalizer = function(...) return states.finalize (overprints,...) end, + processor = function(...) return states.process (overprints,...) end, +} + +--- negative / positive + +negatives = { enabled = true, data = { } } + +negatives.none = pdfliteral(string.format("/GSpositive gs")) +negatives.data[1] = pdfliteral(string.format("/GSnegative gs")) + +negatives.registered = { + positive = 0, + negative = 1, +} + +function negatives.register(stamp) + return negatives.registered[stamp] or negatives.registered.positive +end + +shipouts.plugins.negative = { + initializer = function(...) return states.initialize(negatives,...) end, + finalizer = function(...) return states.finalize (negatives,...) end, + processor = function(...) return states.process (negatives,...) end, +} + +-- effects + +effects = { enabled = true, data = { } } + +effects.none = pdfliteral(string.format("0 Tr")) +effects.data[1] = pdfliteral(string.format("1 Tr")) +effects.data[2] = pdfliteral(string.format("2 Tr")) +effects.data[3] = pdfliteral(string.format("3 Tr")) + +effects.registered = { + normal = 0, + inner = 0, + outer = 1, + both = 2, + hidden = 3, +} + +function effects.register(stamp) + return effects.registered[stamp] or effects.registered.normal +end + +shipouts.plugins.effect = { + initializer = function(...) return states.initialize(effects,...) end, + finalizer = function(...) return states.finalize (effects,...) end, + processor = function(...) return states.process (effects,...) end, +} + +-- layers + +--~ /OC /somename BDC +--~ EMC + +-- transparencies + +-- for the moment we manage transparencies in the pdf driver because +-- first we need a nice interface to some pdf things + +transparencies = { + enabled = true, + data = { }, + registered = { }, + hack = { } +} + +input.storage.register(false, "transparencies/registed", transparencies.registered, "transparencies.registered") +input.storage.register(false, "transparencies/data", transparencies.data, "transparencies.data") +input.storage.register(false, "transparencies/hack", transparencies.hack, "transparencies.hack") + +function transparencies.reference(n) + return pdfliteral(string.format("/Tr%s gs",n)) +end + +transparencies.none = transparencies.reference(0) + +transparencies.stamp = "%s:%s" + +function transparencies.register(...) + local stamp = string.format(transparencies.stamp, ...) + if not transparencies.registered[stamp] then + local n = #transparencies.data+1 + transparencies.data[n] = transparencies.reference(n) + transparencies.registered[stamp] = n + states.collect(string.format("\\presetPDFtransparency{%s}{%s}",...)) -- too many, but experimental anyway + end + return transparencies.registered[stamp] +end + +shipouts.plugins.transparency = { + initializer = function(...) return states.initialize(transparencies,...) end, + finalizer = function(...) return states.finalize (transparencies,...) end, + processor = function(...) return states.process (transparencies,...) end, +} + +--~ shipouts.plugins.transparency.flusher = function(attribute,head,used) +--~ local max = 0 +--~ for k,v in pairs(used) do +--~ end +--~ return head +--~ end + +--~ from the time that node lists were tables and not userdata ... +--~ +--~ local function do_collapse_page(stack,existing_t) +--~ if stack then +--~ local t = existing_t or { } +--~ for _, node in ipairs(stack) do +--~ if node then +--~ local kind = node[1] +--~ node[3] = nil +--~ if kind == 'hlist' or kind == 'vlist' then +--~ node[8] = do_collapse_page(node[8]) -- maybe here check for nil +--~ t[#t+1] = node +--~ elseif kind == 'inline' then -- appending literals cost too much time +--~ local nodes = node[4] +--~ if #nodes == 1 then +--~ t[#t+1] = nodes[1] +--~ else +--~ do_collapse_page(nodes,t) +--~ end +--~ else +--~ t[#t+1] = node +--~ end +--~ end +--~ end +--~ return t +--~ else +--~ return nil +--~ end +--~ end +--~ +--~ local function do_process_page(attribute,processor,stack) +--~ if stack then +--~ for i, node in ipairs(stack) do +--~ if node then +--~ local kind = node[1] +--~ if kind == 'hlist' or kind == "vlist" then +--~ local content = node[8] +--~ if not content then +--~ -- nil node +--~ elseif type(content) == "table" then +--~ node[8] = do_process_page(attribute,processor,content) +--~ else +--~ node[8] = do_process_page(attribute,processor,tex.get_node_list(content)) +--~ end +--~ elseif kind == 'inline' then +--~ node[4] = do_process_page(attribute,processor,node[4]) +--~ else +--~ processor(attribute,stack,i,node,kind) +--~ end +--~ end +--~ end +--~ end +--~ return stack +--~ end +--~ +--~ function nodes.process_page(stack,...) +--~ if stack then +--~ input.start_timing(nodes) +--~ local done, used = false, { } +--~ for name, plugin in pairs(shipouts.plugins) do +--~ local attribute = attributes.numbers[name] +--~ if attribute then +--~ local initializer = plugin.initializer +--~ local processor = plugin.processor +--~ local finalizer = plugin.finalizer +--~ if initializer then +--~ initializer(attribute,stack) +--~ end +--~ if processor then +--~ do_process_page(attribute,processor,stack) +--~ end +--~ if finalizer then +--~ local ok +--~ ok, used[attribute] = finalizer(attribute,stack) +--~ done = done or ok +--~ end +--~ else +--~ texio.write_nl(string.format("undefined attribute %s",name)) +--~ end +--~ end +--~ if done then +--~ stack = do_collapse_page(stack) +--~ for name, plugin in pairs(shipouts.plugins) do +--~ local attribute = attributes.numbers[name] +--~ if used[attribute] then +--~ local flusher = plugin.flusher +--~ if flusher then +--~ flusher(attribute,stack,used[attribute]) +--~ end +--~ end +--~ end +--~ else +--~ stack = true +--~ end +--~ input.stop_timing(nodes) +--~ end +--~ return stack +--~ end +--~ +--~ function states.finalize(what,attribute,stack) +--~ if what.enabled then +--~ if current > 0 then +--~ local list = stack +--~ if #stack == 1 then +--~ list = stack[#stack][8] +--~ end +--~ list[#list+1], current, done, used[0] = what.none, 0, true, true +--~ end +--~ end +--~ return done, used +--~ end +--~ +--~ function states.process(what,attribute,stack,i,node,kind) +--~ if what.enabled then +--~ local a = node[3] +--~ if a then +--~ local c = a[attribute] +--~ if c then +--~ if current ~= c and (kind == 'glyph' or kind == 'rule') then +--~ stack[i], current, done, used[c] = nodes.inline(what.data[c], node), c, true, true +--~ end +--~ elseif current > 0 then +--~ stack[i], current, done, used[0] = nodes.inline(what.none, node), 0, true, true +--~ end +--~ end +--~ end +--~ end diff --git a/tex/context/base/attr-ini.tex b/tex/context/base/attr-ini.tex new file mode 100644 index 000000000..60746d560 --- /dev/null +++ b/tex/context/base/attr-ini.tex @@ -0,0 +1,199 @@ +%D \module +%D [ file=attr-ini, +%D version=2007.06.06, +%D title=\CONTEXT\ Attribute Macros, +%D subtitle=Initialization, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA-ADE] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Context Attribute Macros / initialization} + +%D Although it's still somewhat experimental, here we introduce code +%D related to attributes. + +\unprotect + +\registerctxluafile{attr-ini}{1.001} + +\newcount\attdefcounter + +% \def\newattribute#1% +% {\global\advance\attdefcounter\plusone +% \global\attributedef#1\attdefcounter +% \ctxlua{attributes.define("\strippedcsname#1",\number\attdefcounter)}} + +% \newattribute\statusattribute +% \newattribute\colorattribute +% \newattribute\skipattribute +% \newattribute\penaltyattribute + +\newtoks \attributesresetlist + +\def\defineattribute[#1]% alternatively we can let lua do the housekeeping + {\global\advance\attdefcounter\plusone + \expandafter \xdef\csname :attr:#1\endcsname{\number\attdefcounter}% + \global\expandafter\attributedef\csname @attr@#1\endcsname \attdefcounter + \writestatus\m!systems{defining attribute #1 with number \the\attdefcounter}% + \appendetoks\csname @attr@#1\endcsname\minusone\to\attributesresetlist + \ctxlua{attributes.define("#1",\number\attdefcounter)}} + +\def\dosetattribute#1#2{\csname @attr@#1\endcsname#2\relax} +\def\doresetattribute#1{\csname @attr@#1\endcsname\minusone} +\def\dogetattribute #1{\number\csname @attr@#1\endcsname} +\def\dogetattributeid#1{\csname :attr:#1\endcsname} + +\let\dompattribute\gobbletwoarguments + +\defineattribute[mark] +\defineattribute[status] +% \defineattribute[language] +\defineattribute[skip] +\defineattribute[penalty] + +% \dosetattribute{status}{1} + +% temp here / will be indirect ! just for testing + +\defineattribute[colormodel] +\defineattribute[color] + +% todo: no need for 'color' argument, we can set that once at startup; currently +% a bit inconsistent + +% 1=off 2=gray 3=spot 4=rgb 5=cmyk 6=cmy % only 1/2/4/5 are supported +% +% we could combine this in one attribute but this is not faster and also +% less flexible because sometimes we want to freeze the attribute bit + +\newcount\currentcolormodel + +\def\setcolormodel#1% + {\currentcolormodel\ctxlua{tex.print(colors.setmodel('colormodel','#1'))}% + \dosetattribute{colormodel}{\the\currentcolormodel}} + +\setcolormodel{all} % when no color, reset ! ! + +\def\registerrgbcolor#1#2#3#4% r g b -- print or sprint + {\scratchcounter\ctxlua{tex.print(colors.register('color','#1','rgb',#2,#3,#4))}% + \setevalue{(ca:#1)}{\number\scratchcounter}% + \setevalue{(cv:#1)}{\ctxlua{tex.print(colors.filter(\number\scratchcounter))}}% + \setevalue{(cs:#1)}{\dosetattribute{color}{\the\scratchcounter}}} + +\def\registercmykcolor#1#2#3#4#5% c m y k + {\scratchcounter\ctxlua{tex.print(colors.register('color','#1','cmyk',#2,#3,#4,#5))}% + \setevalue{(ca:#1)}{\number\scratchcounter}% + \setevalue{(cv:#1)}{\ctxlua{tex.print(colors.filter(\number\scratchcounter))}}% + \setevalue{(cs:#1)}{\dosetattribute{color}{\the\scratchcounter}}} + +\def\registergraycolor#1#2% s + {\scratchcounter\ctxlua{tex.print(colors.register('color','#1','gray',#2))}% + \setevalue{(ca:#1)}{\number\scratchcounter}% + \setevalue{(cv:#1)}{\ctxlua{tex.print(colors.filter(\number\scratchcounter))}}% + \setevalue{(cs:#1)}{\dosetattribute{color}{\the\scratchcounter}}} + +\def\registerspotcolor#1#2#3% p name + {\scratchcounter\ctxlua{tex.print(colors.register('color','#1','spot',#2,#3))}% + \setevalue{(ca:#1)}{\number\scratchcounter}% + \setevalue{(cv:#1)}{\ctxlua{tex.print(colors.filter(\number\scratchcounter))}}% + \setevalue{(cs:#1)}{\dosetattribute{color}{\the\scratchcounter}}} + +\def\somecolorvalue #1{\csname(cv:#1)\endcsname} +\def\somecolorswitch #1{\csname(cs:#1)\endcsname} +\def\somecolorattribute#1{\csname(ca:#1)\endcsname} + +\def\getMPcolorspec#1% + {\expandafter\expandafter\expandafter\dogetMPcolorspec\csname (cv:#1)\endcsname\relax} + +\def\dogetMPcolorspec#1:#2:#3:#4:#5:#6:#7:#8:#9\relax % some day we will just pass a attribute number in pre/post + {\ifcase\currentcolormodel\or + \ifcase#1\or#2\or(#3,#4,#5)\or(#6,#7,#8,#9)\fi\or#2\or(#3,#4,#5)\or(#6,#7,#8,#9)% + \fi} + +% \registerrgbcolor {red} {1}{0}{0} +% \registerrgbcolor {green} {0}{1}{0} +% \registerrgbcolor {blue} {0}{0}{1} +% \registercmykcolor {cyan} {1}{0}{0}{0} +% \registercmykcolor {magenta} {0}{1}{0}{0} +% \registercmykcolor {yellow} {0}{0}{1}{0} +% \registergraycolor {black} {0} + +% transparency + +\defineattribute[transparency] + +\def\registertransparency#1#2#3% we need to fake a name in the current setup, same as color + {\setevalue{(ts:#1)}{\dosetattribute{transparency}{\ctxlua{tex.print(transparencies.register(#2,#3))}}}} + +\def\sometransparencyswitch#1{\csname(ts:#1)\endcsname} + +% \registertransparency {one} {1} {.5} +% \registertransparency {two} {1} {.6} + +% overprint + +\defineattribute[overprint] + +\def\registeroverprint#1#2% + {\initializePDFoverprint % temp here + \setvalue{(os:#1)}{\dosetattribute{overprint}{\ctxlua{tex.print(overprints.register('#2'))}}}} + +% \registeroverprint{knockout} {knockout} +% \registeroverprint{overprint}{overprint} + +% negative + +\defineattribute[negative] + +\def\registernegative#1#2% + {\initializePDFnegative % temp here + \setvalue{(ns:#1)}{\dosetattribute{negative}{\ctxlua{tex.print(negatives.register('#2'))}}}} + +% \registernegative{positive}{positive} +% \registernegative{negative}{negative} + +% effect + +\defineattribute[effect] + +\def\registereffect#1% + {\setevalue{(es:#1)}{\dosetattribute{effect}{\ctxlua{tex.print(effects.register('#1'))}}}} + +% \registereffect{normal} +% \registereffect{inner} +% \registereffect{outer} +% \registereffect{both} +% \registereffect{hidden} + +% ugly solution +% +% \def\shipout +% {%\writestatus{SHIPOUT}{CALLED AT PAGE \realfolio}% +% \dowithnextbox +% {\ctxlua{callbacks.push('hpack_filter',nodes.process_page)}% +% %\writestatus{SHIPOUT}{START PACKAGING}% +% \setbox\nextbox\hbox{\box\nextbox}% +% %\writestatus{SHIPOUT}{STOP PACKAGING}% +% \ctxlua{callbacks.pop('hpack_filter')}% +% \primitive\shipout\box\nextbox}} + +% \def\shipout +% {\dowithnextbox +% {\ctxlua{nodes.process_page(tex.box[\number\nextbox])}% +% \primitive\shipout\box\nextbox}} + +\def\processshipoutbox#1% % hack till we have access to pdf backend + {\setbox\nextbox\hbox{#1}% + \ctxlua{nodes.process_page(tex.box[\number\nextbox])}% + \hbox{\ctxlua{states.flush()}\box\nextbox}} + +% \def\shipout +% {\dowithnextbox{\ctxlua{tex.primitive('shipout', nodes.process_page(tex.nextbox)}}} + +\let\normalshipout\shipout + +\protect \endinput diff --git a/tex/context/base/char-cmp.lua b/tex/context/base/char-cmp.lua new file mode 100644 index 000000000..42f66143c --- /dev/null +++ b/tex/context/base/char-cmp.lua @@ -0,0 +1,260 @@ +if not modules then modules = { } end modules ['char-cmp'] = { + version = 1.001, + comment = "companion to char-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +characters = characters or { } +characters.uncomposed = characters.uncomposed or { } + +--[[ldx-- +

The code defined here may move to the big character table.

+--ldx]]-- + +characters.basedigits = { + ['zero'] = 48, ['one'] = 49, + ['two'] = 50, ['three'] = 51, + ['four'] = 52, ['five'] = 53, + ['six'] = 54, ['seven'] = 55, + ['eight'] = 56, ['nine'] = 57 +} + +--[[ldx-- +

The next three tables can for instance be be used to enhance +kerning tables that lack kerning pairs for these special characters. +Of course they may come in handy elsewhere too

+--ldx]]-- + +-- we can use shcodes, but then we also need slcode and srcode +-- +-- AEligature +-- => slcode == ub('A') +-- => srcode == ub('E') +-- or +-- => shcode == { ub('A'), ub('E') } +-- => reduction = "AE" +-- +-- eacute +-- => shcode == ub('A') +-- or +-- => shcode == { ub('a') } +-- => reduction = "a" + +characters.uncomposed.left = { + AEligature = "A", aeligature = "a", + OEligature = "O", oeligature = "o", + IJligature = "I", ijligature = "i", + AE = "A", ae = "a", + OE = "O", oe = "o", + IJ = "I", ij = "i", + Ssharp = "S", ssharp = "s", +} + +characters.uncomposed.right = { + AEligature = "E", aeligature = "e", + OEligature = "E", oeligature = "e", + IJligature = "J", ijligature = "j", + AE = "E", ae = "e", + OE = "E", oe = "e", + IJ = "J", ij = "j", + Ssharp = "S", ssharp = "s", +} + +characters.uncomposed.both = { + Acircumflex = "A", acircumflex = "a", + Ccircumflex = "C", ccircumflex = "c", + Ecircumflex = "E", ecircumflex = "e", + Gcircumflex = "G", gcircumflex = "g", + Hcircumflex = "H", hcircumflex = "h", + Icircumflex = "I", icircumflex = "i", + Jcircumflex = "J", jcircumflex = "j", + Ocircumflex = "O", ocircumflex = "o", + Scircumflex = "S", scircumflex = "s", + Ucircumflex = "U", ucircumflex = "u", + Wcircumflex = "W", wcircumflex = "w", + Ycircumflex = "Y", ycircumflex = "y", + + Agrave = "A", agrave = "a", + Egrave = "E", egrave = "e", + Igrave = "I", igrave = "i", + Ograve = "O", ograve = "o", + Ugrave = "U", ugrave = "u", + Ygrave = "Y", ygrave = "y", + + Atilde = "A", atilde = "a", + Itilde = "I", itilde = "i", + Otilde = "O", otilde = "o", + Utilde = "U", utilde = "u", + Ntilde = "N", ntilde = "n", + + Adiaeresis = "A", adiaeresis = "a", Adieresis = "A", adieresis = "a", + Ediaeresis = "E", ediaeresis = "e", Edieresis = "E", edieresis = "e", + Idiaeresis = "I", idiaeresis = "i", Idieresis = "I", idieresis = "i", + Odiaeresis = "O", odiaeresis = "o", Odieresis = "O", odieresis = "o", + Udiaeresis = "U", udiaeresis = "u", Udieresis = "U", udieresis = "u", + Ydiaeresis = "Y", ydiaeresis = "y", Ydieresis = "Y", ydieresis = "y", + + Aacute = "A", aacute = "a", + Cacute = "C", cacute = "c", + Eacute = "E", eacute = "e", + Iacute = "I", iacute = "i", + Lacute = "L", lacute = "l", + Nacute = "N", nacute = "n", + Oacute = "O", oacute = "o", + Racute = "R", racute = "r", + Sacute = "S", sacute = "s", + Uacute = "U", uacute = "u", + Yacute = "Y", yacute = "y", + Zacute = "Z", zacute = "z", + + Dstroke = "D", dstroke = "d", + Hstroke = "H", hstroke = "h", + Tstroke = "T", tstroke = "t", + + Cdotaccent = "C", cdotaccent = "c", + Edotaccent = "E", edotaccent = "e", + Gdotaccent = "G", gdotaccent = "g", + Idotaccent = "I", idotaccent = "i", + Zdotaccent = "Z", zdotaccent = "z", + + Amacron = "A", amacron = "a", + Emacron = "E", emacron = "e", + Imacron = "I", imacron = "i", + Omacron = "O", omacron = "o", + Umacron = "U", umacron = "u", + + Ccedilla = "C", ccedilla = "c", + Kcedilla = "K", kcedilla = "k", + Lcedilla = "L", lcedilla = "l", + Ncedilla = "N", ncedilla = "n", + Rcedilla = "R", rcedilla = "r", + Scedilla = "S", scedilla = "s", + Tcedilla = "T", tcedilla = "t", + + Ohungarumlaut = "O", ohungarumlaut = "o", + Uhungarumlaut = "U", uhungarumlaut = "u", + + Aogonek = "A", aogonek = "a", + Eogonek = "E", eogonek = "e", + Iogonek = "I", iogonek = "i", + Uogonek = "U", uogonek = "u", + + Aring = "A", aring = "a", + Uring = "U", uring = "u", + + Abreve = "A", abreve = "a", + Ebreve = "E", ebreve = "e", + Gbreve = "G", gbreve = "g", + Ibreve = "I", ibreve = "i", + Obreve = "O", obreve = "o", + Ubreve = "U", ubreve = "u", + + Ccaron = "C", ccaron = "c", + Dcaron = "D", dcaron = "d", + Ecaron = "E", ecaron = "e", + Lcaron = "L", lcaron = "l", + Ncaron = "N", ncaron = "n", + Rcaron = "R", rcaron = "r", + Scaron = "S", scaron = "s", + Tcaron = "T", tcaron = "t", + Zcaron = "Z", zcaron = "z", + + dotlessI = "I", dotlessi = "i", + dotlessJ = "J", dotlessj = "j", + + AEligature = "AE", aeligature = "ae", AE = "AE", ae = "ae", + OEligature = "OE", oeligature = "oe", OE = "OE", oe = "oe", + IJligature = "IJ", ijligature = "ij", IJ = "IJ", ij = "ij", + + Lstroke = "L", lstroke = "l", Lslash = "L", lslash = "l", + Ostroke = "O", ostroke = "o", Oslash = "O", oslash = "o", + + Ssharp = "SS", ssharp = "ss", + + Aumlaut = "A", aumlaut = "a", + Eumlaut = "E", eumlaut = "e", + Iumlaut = "I", iumlaut = "i", + Oumlaut = "O", oumlaut = "o", + Uumlaut = "U", uumlaut = "u", + +} + +--[[ldx-- +

The following function is used in the indexing code, where +we need some sort of default fallback mapping.

+--ldx]]-- + +function characters.uncompose(n) -- n == string|number, returns string + local cdn + if type(n) == "string" then + cdn = characters.data[utf.byte(n)] + else + cdn = characters.data[n] + end + -- return characters.shape(n) + if cdn then + if cdn.shcode then + return utf.char(cdn.shcode) + else + return characters.uncomposed.both[cdn.contextname] or n + end + end + return n +end + +--[[ldx-- +

Only characters with a code smaller than 128 make sense, +anything larger is encoding dependent. An interesting complication +is that a character can be in an encoding twice but is hashed +once.

+--ldx]]-- + +characters.ligatures = { + ['f'] = { + { 'f', 'ff' }, + { 'i', 'fi' }, + { 'l', 'fl' }, + }, + ['ff'] = { + { 'i', 'ffi' } + }, + ['fi'] = { + { 'i', 'fii' } + }, + ['fl'] = { + { 'i', 'fli' } + }, + ['s'] = { + { 't', 'st' } + }, + ['i'] = { + { 'j', 'ij' } + }, +} + +characters.texligatures = { + -- ['space'] = { + -- { 'L', 'Lslash' }, + -- { 'l', 'lslash' } + -- }, + -- ['question'] = { + -- { 'quoteleft', 'questiondown' } + -- }, + -- ['exclam'] = { + -- { 'quoteleft', 'exclamdown' } + -- }, + ['quoteleft'] = { + { 'quoteleft', 'quotedblleft' } + }, + ['quoteright'] = { + { 'quoteright', 'quotedblright' } + }, + ['hyphen'] = { + { 'hyphen', 'endash' } + }, + ['endash'] = { + { 'hyphen', 'emdash' } + } +} diff --git a/tex/context/base/char-def.lua b/tex/context/base/char-def.lua new file mode 100644 index 000000000..fe42f5622 --- /dev/null +++ b/tex/context/base/char-def.lua @@ -0,0 +1,17736 @@ +-- filename : char-def.lua +-- comment : companion to char-def.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + + +if not versions then versions = { } end versions['char-def'] = 1.001 + +if not characters then characters = { } end +if not characters.data then characters.data = { } end + +characters.data = { + [0x0000] = { unicodeslot=0x0000, category='cc', description='NULL' }, + [0x0001] = { unicodeslot=0x0001, category='cc', description='START OF HEADING' }, + [0x0002] = { unicodeslot=0x0002, category='cc', description='START OF TEXT' }, + [0x0003] = { unicodeslot=0x0003, category='cc', description='END OF TEXT' }, + [0x0004] = { unicodeslot=0x0004, category='cc', description='END OF TRANSMISSION' }, + [0x0005] = { unicodeslot=0x0005, category='cc', description='ENQUIRY' }, + [0x0006] = { unicodeslot=0x0006, category='cc', description='ACKNOWLEDGE' }, + [0x0007] = { unicodeslot=0x0007, category='cc', description='BELL' }, + [0x0008] = { unicodeslot=0x0008, category='cc', description='BACKSPACE' }, + [0x0009] = { unicodeslot=0x0009, category='cc', description='CHARACTER TABULATION' }, + [0x000A] = { unicodeslot=0x000A, category='cc', description='LINE FEED (LF)' }, + [0x000B] = { unicodeslot=0x000B, category='cc', description='LINE TABULATION' }, + [0x000C] = { unicodeslot=0x000C, category='cc', description='FORM FEED (FF)' }, + [0x000D] = { unicodeslot=0x000D, category='cc', description='CARRIAGE RETURN (CR)' }, + [0x000E] = { unicodeslot=0x000E, category='cc', description='SHIFT OUT' }, + [0x000F] = { unicodeslot=0x000F, category='cc', description='SHIFT IN' }, + [0x0010] = { unicodeslot=0x0010, category='cc', description='DATA LINK ESCAPE' }, + [0x0011] = { unicodeslot=0x0011, category='cc', description='DEVICE CONTROL ONE' }, + [0x0012] = { unicodeslot=0x0012, category='cc', description='DEVICE CONTROL TWO' }, + [0x0013] = { unicodeslot=0x0013, category='cc', description='DEVICE CONTROL THREE' }, + [0x0014] = { unicodeslot=0x0014, category='cc', description='DEVICE CONTROL FOUR' }, + [0x0015] = { unicodeslot=0x0015, category='cc', description='NEGATIVE ACKNOWLEDGE' }, + [0x0016] = { unicodeslot=0x0016, category='cc', description='SYNCHRONOUS IDLE' }, + [0x0017] = { unicodeslot=0x0017, category='cc', description='END OF TRANSMISSION BLOCK' }, + [0x0018] = { unicodeslot=0x0018, category='cc', description='CANCEL' }, + [0x0019] = { unicodeslot=0x0019, category='cc', description='END OF MEDIUM' }, + [0x001A] = { unicodeslot=0x001A, category='cc', description='SUBSTITUTE' }, + [0x001B] = { unicodeslot=0x001B, category='cc', description='ESCAPE' }, + [0x001C] = { unicodeslot=0x001C, category='cc', description='INFORMATION SEPARATOR FOUR' }, + [0x001D] = { unicodeslot=0x001D, category='cc', description='INFORMATION SEPARATOR THREE' }, + [0x001E] = { unicodeslot=0x001E, category='cc', description='INFORMATION SEPARATOR TWO' }, + [0x001F] = { unicodeslot=0x001F, category='cc', description='INFORMATION SEPARATOR ONE' }, + [0x0020] = { unicodeslot=0x0020, category='zs', adobename='space', description='SPACE' }, + [0x0021] = { unicodeslot=0x0021, category='po', adobename='exclam', description='EXCLAMATION MARK' }, + [0x0022] = { unicodeslot=0x0022, category='po', adobename='quotedbl', description='QUOTATION MARK' }, + [0x0023] = { unicodeslot=0x0023, category='po', adobename='numbersign', description='NUMBER SIGN' }, + [0x0024] = { unicodeslot=0x0024, category='sc', adobename='dollar', description='DOLLAR SIGN' }, + [0x0025] = { unicodeslot=0x0025, category='po', adobename='percent', contextname='percent', description='PERCENT SIGN' }, + [0x0026] = { unicodeslot=0x0026, category='po', adobename='ampersand', description='AMPERSAND' }, + [0x0027] = { unicodeslot=0x0027, category='po', adobename='quotesingle', description='APOSTROPHE' }, + [0x0028] = { unicodeslot=0x0028, category='ps', adobename='parenleft', description='LEFT PARENTHESIS' }, + [0x0029] = { unicodeslot=0x0029, category='pe', adobename='parenright', description='RIGHT PARENTHESIS' }, + [0x002A] = { unicodeslot=0x002A, category='po', adobename='asterisk', description='ASTERISK' }, + [0x002B] = { unicodeslot=0x002B, category='sm', adobename='plus', description='PLUS SIGN' }, + [0x002C] = { unicodeslot=0x002C, category='po', adobename='comma', description='COMMA' }, + [0x002D] = { unicodeslot=0x002D, category='pd', adobename='hyphen', description='HYPHEN-MINUS' }, + [0x002E] = { unicodeslot=0x002E, category='po', adobename='period', description='FULL STOP' }, + [0x002F] = { unicodeslot=0x002F, category='po', adobename='slash', description='SOLIDUS' }, + [0x0030] = { unicodeslot=0x0030, category='nd', adobename='zero', description='DIGIT ZERO' }, + [0x0031] = { unicodeslot=0x0031, category='nd', adobename='one', description='DIGIT ONE' }, + [0x0032] = { unicodeslot=0x0032, category='nd', adobename='two', description='DIGIT TWO' }, + [0x0033] = { unicodeslot=0x0033, category='nd', adobename='three', description='DIGIT THREE' }, + [0x0034] = { unicodeslot=0x0034, category='nd', adobename='four', description='DIGIT FOUR' }, + [0x0035] = { unicodeslot=0x0035, category='nd', adobename='five', description='DIGIT FIVE' }, + [0x0036] = { unicodeslot=0x0036, category='nd', adobename='six', description='DIGIT SIX' }, + [0x0037] = { unicodeslot=0x0037, category='nd', adobename='seven', description='DIGIT SEVEN' }, + [0x0038] = { unicodeslot=0x0038, category='nd', adobename='eight', description='DIGIT EIGHT' }, + [0x0039] = { unicodeslot=0x0039, category='nd', adobename='nine', description='DIGIT NINE' }, + [0x003A] = { unicodeslot=0x003A, category='po', adobename='colon', description='COLON' }, + [0x003B] = { unicodeslot=0x003B, category='po', adobename='semicolon', description='SEMICOLON' }, + [0x003C] = { unicodeslot=0x003C, category='sm', adobename='less', description='LESS-THAN SIGN' }, + [0x003D] = { unicodeslot=0x003D, category='sm', adobename='equal', description='EQUALS SIGN' }, + [0x003E] = { unicodeslot=0x003E, category='sm', adobename='greater', description='GREATER-THAN SIGN' }, + [0x003F] = { unicodeslot=0x003F, category='po', adobename='question', description='QUESTION MARK' }, + [0x0040] = { unicodeslot=0x0040, category='po', adobename='at', description='COMMERCIAL AT' }, + [0x0041] = { unicodeslot=0x0041, category='lu', adobename='A', description='LATIN CAPITAL LETTER A', lccode=0x0061 }, + [0x0042] = { unicodeslot=0x0042, category='lu', adobename='B', description='LATIN CAPITAL LETTER B', lccode=0x0062 }, + [0x0043] = { unicodeslot=0x0043, category='lu', adobename='C', description='LATIN CAPITAL LETTER C', lccode=0x0063 }, + [0x0044] = { unicodeslot=0x0044, category='lu', adobename='D', description='LATIN CAPITAL LETTER D', lccode=0x0064 }, + [0x0045] = { unicodeslot=0x0045, category='lu', adobename='E', description='LATIN CAPITAL LETTER E', lccode=0x0065 }, + [0x0046] = { unicodeslot=0x0046, category='lu', adobename='F', description='LATIN CAPITAL LETTER F', lccode=0x0066 }, + [0x0047] = { unicodeslot=0x0047, category='lu', adobename='G', description='LATIN CAPITAL LETTER G', lccode=0x0067 }, + [0x0048] = { unicodeslot=0x0048, category='lu', adobename='H', description='LATIN CAPITAL LETTER H', lccode=0x0068 }, + [0x0049] = { unicodeslot=0x0049, category='lu', adobename='I', description='LATIN CAPITAL LETTER I', lccode=0x0069 }, + [0x004A] = { unicodeslot=0x004A, category='lu', adobename='J', description='LATIN CAPITAL LETTER J', lccode=0x006A }, + [0x004B] = { unicodeslot=0x004B, category='lu', adobename='K', description='LATIN CAPITAL LETTER K', lccode=0x006B }, + [0x004C] = { unicodeslot=0x004C, category='lu', adobename='L', description='LATIN CAPITAL LETTER L', lccode=0x006C }, + [0x004D] = { unicodeslot=0x004D, category='lu', adobename='M', description='LATIN CAPITAL LETTER M', lccode=0x006D }, + [0x004E] = { unicodeslot=0x004E, category='lu', adobename='N', description='LATIN CAPITAL LETTER N', lccode=0x006E }, + [0x004F] = { unicodeslot=0x004F, category='lu', adobename='O', description='LATIN CAPITAL LETTER O', lccode=0x006F }, + [0x0050] = { unicodeslot=0x0050, category='lu', adobename='P', description='LATIN CAPITAL LETTER P', lccode=0x0070 }, + [0x0051] = { unicodeslot=0x0051, category='lu', adobename='Q', description='LATIN CAPITAL LETTER Q', lccode=0x0071 }, + [0x0052] = { unicodeslot=0x0052, category='lu', adobename='R', description='LATIN CAPITAL LETTER R', lccode=0x0072 }, + [0x0053] = { unicodeslot=0x0053, category='lu', adobename='S', description='LATIN CAPITAL LETTER S', lccode=0x0073 }, + [0x0054] = { unicodeslot=0x0054, category='lu', adobename='T', description='LATIN CAPITAL LETTER T', lccode=0x0074 }, + [0x0055] = { unicodeslot=0x0055, category='lu', adobename='U', description='LATIN CAPITAL LETTER U', lccode=0x0075 }, + [0x0056] = { unicodeslot=0x0056, category='lu', adobename='V', description='LATIN CAPITAL LETTER V', lccode=0x0076 }, + [0x0057] = { unicodeslot=0x0057, category='lu', adobename='W', description='LATIN CAPITAL LETTER W', lccode=0x0077 }, + [0x0058] = { unicodeslot=0x0058, category='lu', adobename='X', description='LATIN CAPITAL LETTER X', lccode=0x0078 }, + [0x0059] = { unicodeslot=0x0059, category='lu', adobename='Y', description='LATIN CAPITAL LETTER Y', lccode=0x0079 }, + [0x005A] = { unicodeslot=0x005A, category='lu', adobename='Z', description='LATIN CAPITAL LETTER Z', lccode=0x007A }, + [0x005B] = { unicodeslot=0x005B, category='ps', adobename='bracketleft', description='LEFT SQUARE BRACKET' }, + [0x005C] = { unicodeslot=0x005C, category='po', adobename='backslash', contextname='textbackslash', description='REVERSE SOLIDUS' }, + [0x005D] = { unicodeslot=0x005D, category='pe', adobename='bracketright', description='RIGHT SQUARE BRACKET' }, + [0x005E] = { unicodeslot=0x005E, category='sk', adobename='asciicircum', contextname='textasciicircum', description='CIRCUMFLEX ACCENT' }, + [0x005F] = { unicodeslot=0x005F, category='pc', adobename='underscore', contextname='textunderscore', description='LOW LINE' }, + [0x0060] = { unicodeslot=0x0060, category='sk', adobename='grave', contextname='textgrave', description='GRAVE ACCENT' }, + [0x0061] = { unicodeslot=0x0061, category='ll', adobename='a', description='LATIN SMALL LETTER A', uccode=0x0041 }, + [0x0062] = { unicodeslot=0x0062, category='ll', adobename='b', description='LATIN SMALL LETTER B', uccode=0x0042 }, + [0x0063] = { unicodeslot=0x0063, category='ll', adobename='c', description='LATIN SMALL LETTER C', uccode=0x0043 }, + [0x0064] = { unicodeslot=0x0064, category='ll', adobename='d', description='LATIN SMALL LETTER D', uccode=0x0044 }, + [0x0065] = { unicodeslot=0x0065, category='ll', adobename='e', description='LATIN SMALL LETTER E', uccode=0x0045 }, + [0x0066] = { unicodeslot=0x0066, category='ll', adobename='f', description='LATIN SMALL LETTER F', uccode=0x0046 }, + [0x0067] = { unicodeslot=0x0067, category='ll', adobename='g', description='LATIN SMALL LETTER G', uccode=0x0047 }, + [0x0068] = { unicodeslot=0x0068, category='ll', adobename='h', description='LATIN SMALL LETTER H', uccode=0x0048 }, + [0x0069] = { unicodeslot=0x0069, category='ll', adobename='i', description='LATIN SMALL LETTER I', uccode=0x0049 }, + [0x006A] = { unicodeslot=0x006A, category='ll', adobename='j', description='LATIN SMALL LETTER J', uccode=0x004A }, + [0x006B] = { unicodeslot=0x006B, category='ll', adobename='k', description='LATIN SMALL LETTER K', uccode=0x004B }, + [0x006C] = { unicodeslot=0x006C, category='ll', adobename='l', description='LATIN SMALL LETTER L', uccode=0x004C }, + [0x006D] = { unicodeslot=0x006D, category='ll', adobename='m', description='LATIN SMALL LETTER M', uccode=0x004D }, + [0x006E] = { unicodeslot=0x006E, category='ll', adobename='n', description='LATIN SMALL LETTER N', uccode=0x004E }, + [0x006F] = { unicodeslot=0x006F, category='ll', adobename='o', description='LATIN SMALL LETTER O', uccode=0x004F }, + [0x0070] = { unicodeslot=0x0070, category='ll', adobename='p', description='LATIN SMALL LETTER P', uccode=0x0050 }, + [0x0071] = { unicodeslot=0x0071, category='ll', adobename='q', description='LATIN SMALL LETTER Q', uccode=0x0051 }, + [0x0072] = { unicodeslot=0x0072, category='ll', adobename='r', description='LATIN SMALL LETTER R', uccode=0x0052 }, + [0x0073] = { unicodeslot=0x0073, category='ll', adobename='s', description='LATIN SMALL LETTER S', uccode=0x0053 }, + [0x0074] = { unicodeslot=0x0074, category='ll', adobename='t', description='LATIN SMALL LETTER T', uccode=0x0054 }, + [0x0075] = { unicodeslot=0x0075, category='ll', adobename='u', description='LATIN SMALL LETTER U', uccode=0x0055 }, + [0x0076] = { unicodeslot=0x0076, category='ll', adobename='v', description='LATIN SMALL LETTER V', uccode=0x0056 }, + [0x0077] = { unicodeslot=0x0077, category='ll', adobename='w', description='LATIN SMALL LETTER W', uccode=0x0057 }, + [0x0078] = { unicodeslot=0x0078, category='ll', adobename='x', description='LATIN SMALL LETTER X', uccode=0x0058 }, + [0x0079] = { unicodeslot=0x0079, category='ll', adobename='y', description='LATIN SMALL LETTER Y', uccode=0x0059 }, + [0x007A] = { unicodeslot=0x007A, category='ll', adobename='z', description='LATIN SMALL LETTER Z', uccode=0x005A }, + [0x007B] = { unicodeslot=0x007B, category='ps', adobename='braceleft', contextname='textbraceleft', description='LEFT CURLY BRACKET' }, + [0x007C] = { unicodeslot=0x007C, category='sm', adobename='bar', description='VERTICAL LINE' }, + [0x007D] = { unicodeslot=0x007D, category='pe', adobename='braceright', contextname='textbraceright', description='RIGHT CURLY BRACKET' }, + [0x007E] = { unicodeslot=0x007E, category='sm', adobename='asciitilde', contextname='textasciitilde', description='TILDE' }, + [0x007F] = { unicodeslot=0x007F, category='cc', description='DELETE' }, + [0x0080] = { unicodeslot=0x0080, category='cc' }, + [0x0081] = { unicodeslot=0x0081, category='cc' }, + [0x0082] = { unicodeslot=0x0082, category='cc', description='BREAK PERMITTED HERE' }, + [0x0083] = { unicodeslot=0x0083, category='cc', description='NO BREAK HERE' }, + [0x0084] = { unicodeslot=0x0084, category='cc' }, + [0x0085] = { unicodeslot=0x0085, category='cc', description='NEXT LINE (NEL)' }, + [0x0086] = { unicodeslot=0x0086, category='cc', description='START OF SELECTED AREA' }, + [0x0087] = { unicodeslot=0x0087, category='cc', description='END OF SELECTED AREA' }, + [0x0088] = { unicodeslot=0x0088, category='cc', description='CHARACTER TABULATION SET' }, + [0x0089] = { unicodeslot=0x0089, category='cc', description='CHARACTER TABULATION WITH JUSTIFICATION' }, + [0x008A] = { unicodeslot=0x008A, category='cc', description='LINE TABULATION SET' }, + [0x008B] = { unicodeslot=0x008B, category='cc', description='PARTIAL LINE FORWARD' }, + [0x008C] = { unicodeslot=0x008C, category='cc', description='PARTIAL LINE BACKWARD' }, + [0x008D] = { unicodeslot=0x008D, category='cc', description='REVERSE LINE FEED' }, + [0x008E] = { unicodeslot=0x008E, category='cc', description='SINGLE SHIFT TWO' }, + [0x008F] = { unicodeslot=0x008F, category='cc', description='SINGLE SHIFT THREE' }, + [0x0090] = { unicodeslot=0x0090, category='cc', description='DEVICE CONTROL STRING' }, + [0x0091] = { unicodeslot=0x0091, category='cc', description='PRIVATE USE ONE' }, + [0x0092] = { unicodeslot=0x0092, category='cc', description='PRIVATE USE TWO' }, + [0x0093] = { unicodeslot=0x0093, category='cc', description='SET TRANSMIT STATE' }, + [0x0094] = { unicodeslot=0x0094, category='cc', description='CANCEL CHARACTER' }, + [0x0095] = { unicodeslot=0x0095, category='cc', description='MESSAGE WAITING' }, + [0x0096] = { unicodeslot=0x0096, category='cc', description='START OF GUARDED AREA' }, + [0x0097] = { unicodeslot=0x0097, category='cc', description='END OF GUARDED AREA' }, + [0x0098] = { unicodeslot=0x0098, category='cc', description='START OF STRING' }, + [0x0099] = { unicodeslot=0x0099, category='cc' }, + [0x009A] = { unicodeslot=0x009A, category='cc', description='SINGLE CHARACTER INTRODUCER' }, + [0x009B] = { unicodeslot=0x009B, category='cc', description='CONTROL SEQUENCE INTRODUCER' }, + [0x009C] = { unicodeslot=0x009C, category='cc', description='STRING TERMINATOR' }, + [0x009D] = { unicodeslot=0x009D, category='cc', description='OPERATING SYSTEM COMMAND' }, + [0x009E] = { unicodeslot=0x009E, category='cc', description='PRIVACY MESSAGE' }, + [0x009F] = { unicodeslot=0x009F, category='cc', description='APPLICATION PROGRAM COMMAND' }, + [0x00A0] = { unicodeslot=0x00A0, category='zs', contextname='nonbreakablespace', description='NO-BREAK SPACE', specials={'nobreak',0x0020} }, + [0x00A1] = { unicodeslot=0x00A1, category='po', adobename='exclamdown', contextname='exclamdown', description='INVERTED EXCLAMATION MARK' }, + [0x00A2] = { unicodeslot=0x00A2, category='sc', adobename='cent', contextname='textcent', description='CENT SIGN' }, + [0x00A3] = { unicodeslot=0x00A3, category='sc', adobename='sterling', contextname='textsterling', description='POUND SIGN' }, + [0x00A4] = { unicodeslot=0x00A4, category='sc', adobename='currency', contextname='textcurrency', description='CURRENCY SIGN' }, + [0x00A5] = { unicodeslot=0x00A5, category='sc', adobename='yen', contextname='textyen', description='YEN SIGN' }, + [0x00A6] = { unicodeslot=0x00A6, category='so', adobename='brokenbar', contextname='textbrokenbar', description='BROKEN BAR' }, + [0x00A7] = { unicodeslot=0x00A7, category='so', adobename='section', contextname='sectionmark', description='SECTION SIGN' }, + [0x00A8] = { unicodeslot=0x00A8, category='sk', adobename='dieresis', contextname='textdiaeresis', description='DIAERESIS', specials={'compat',0x0020,0x0308} }, + [0x00A9] = { unicodeslot=0x00A9, category='so', adobename='copyright', contextname='copyright', description='COPYRIGHT SIGN' }, + [0x00AA] = { unicodeslot=0x00AA, category='ll', adobename='ordfeminine', contextname='ordfeminine', description='FEMININE ORDINAL INDICATOR', specials={'super',0x0061} }, + [0x00AB] = { unicodeslot=0x00AB, category='pi', adobename='guillemotleft', contextname='leftguillemot', description='LEFT-POINTING DOUBLE ANGLE QUOTATION MARK' }, + [0x00AC] = { unicodeslot=0x00AC, category='sm', adobename='logicalnot', contextname='textlognot', description='NOT SIGN' }, + [0x00AD] = { unicodeslot=0x00AD, category='cf', contextname='softhyphen', description='SOFT HYPHEN' }, + [0x00AE] = { unicodeslot=0x00AE, category='so', adobename='registered', contextname='registered', description='REGISTERED SIGN' }, + [0x00AF] = { unicodeslot=0x00AF, category='sk', adobename='macron', contextname='textmacron', description='MACRON', specials={'compat',0x0020,0x0304} }, + [0x00B0] = { unicodeslot=0x00B0, category='so', adobename='degree', contextname='textdegree', description='DEGREE SIGN' }, + [0x00B1] = { unicodeslot=0x00B1, category='sm', adobename='plusminus', contextname='textpm', description='PLUS-MINUS SIGN' }, + [0x00B2] = { unicodeslot=0x00B2, category='no', contextname='twosuperior', description='SUPERSCRIPT TWO', specials={'super',0x0032} }, + [0x00B3] = { unicodeslot=0x00B3, category='no', contextname='threesuperior', description='SUPERSCRIPT THREE', specials={'super',0x0033} }, + [0x00B4] = { unicodeslot=0x00B4, category='sk', adobename='acute', contextname='textacute', description='ACUTE ACCENT', specials={'compat',0x0020,0x0301} }, + [0x00B5] = { unicodeslot=0x00B5, category='ll', adobename='mu', contextname='textmu', description='MICRO SIGN', uccode=0x039C, specials={'compat',0x03BC} }, + [0x00B6] = { unicodeslot=0x00B6, category='so', adobename='paragraph', contextname='paragraphmark', description='PILCROW SIGN' }, + [0x00B7] = { unicodeslot=0x00B7, category='po', adobename='periodcentered', contextname='periodcentered', description='MIDDLE DOT' }, + [0x00B8] = { unicodeslot=0x00B8, category='sk', adobename='cedilla', contextname='textcedilla', description='CEDILLA', specials={'compat',0x0020,0x0327} }, + [0x00B9] = { unicodeslot=0x00B9, category='no', contextname='onesuperior', description='SUPERSCRIPT ONE', specials={'super',0x0031} }, + [0x00BA] = { unicodeslot=0x00BA, category='ll', adobename='ordmasculine', contextname='ordmasculine', description='MASCULINE ORDINAL INDICATOR', specials={'super',0x006F} }, + [0x00BB] = { unicodeslot=0x00BB, category='pf', adobename='guillemotright', contextname='rightguillemot', description='RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK' }, + [0x00BC] = { unicodeslot=0x00BC, category='no', adobename='onequarter', contextname='onequarter', description='VULGAR FRACTION ONE QUARTER', specials={'fraction',0x0031,0x2044,0x0034} }, + [0x00BD] = { unicodeslot=0x00BD, category='no', adobename='onehalf', contextname='onehalf', description='VULGAR FRACTION ONE HALF', specials={'fraction',0x0031,0x2044,0x0032} }, + [0x00BE] = { unicodeslot=0x00BE, category='no', adobename='threequarters', contextname='threequarter', description='VULGAR FRACTION THREE QUARTERS', specials={'fraction',0x0033,0x2044,0x0034} }, + [0x00BF] = { unicodeslot=0x00BF, category='po', adobename='questiondown', contextname='questiondown', description='INVERTED QUESTION MARK' }, + [0x00C0] = { unicodeslot=0x00C0, category='lu', adobename='Agrave', contextname='Agrave', description='LATIN CAPITAL LETTER A WITH GRAVE', shcode=0x0041, lccode=0x00E0, specials={'char',0x0041,0x0300} }, + [0x00C1] = { unicodeslot=0x00C1, category='lu', adobename='Aacute', contextname='Aacute', description='LATIN CAPITAL LETTER A WITH ACUTE', shcode=0x0041, lccode=0x00E1, specials={'char',0x0041,0x0301} }, + [0x00C2] = { unicodeslot=0x00C2, category='lu', adobename='Acircumflex', contextname='Acircumflex', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX', shcode=0x0041, lccode=0x00E2, specials={'char',0x0041,0x0302} }, + [0x00C3] = { unicodeslot=0x00C3, category='lu', adobename='Atilde', contextname='Atilde', description='LATIN CAPITAL LETTER A WITH TILDE', shcode=0x0041, lccode=0x00E3, specials={'char',0x0041,0x0303} }, + [0x00C4] = { unicodeslot=0x00C4, category='lu', adobename='Adieresis', contextname='Adiaeresis', description='LATIN CAPITAL LETTER A WITH DIAERESIS', shcode=0x0041, lccode=0x00E4, specials={'char',0x0041,0x0308} }, + [0x00C5] = { unicodeslot=0x00C5, category='lu', adobename='Aring', contextname='Aring', description='LATIN CAPITAL LETTER A WITH RING ABOVE', shcode=0x0041, lccode=0x00E5, specials={'char',0x0041,0x030A} }, + [0x00C6] = { unicodeslot=0x00C6, category='lu', adobename='AE', contextname='AEligature', description='LATIN CAPITAL LETTER AE', lccode=0x00E6 }, + [0x00C7] = { unicodeslot=0x00C7, category='lu', adobename='Ccedilla', contextname='Ccedilla', description='LATIN CAPITAL LETTER C WITH CEDILLA', shcode=0x0043, lccode=0x00E7, specials={'char',0x0043,0x0327} }, + [0x00C8] = { unicodeslot=0x00C8, category='lu', adobename='Egrave', contextname='Egrave', description='LATIN CAPITAL LETTER E WITH GRAVE', shcode=0x0045, lccode=0x00E8, specials={'char',0x0045,0x0300} }, + [0x00C9] = { unicodeslot=0x00C9, category='lu', adobename='Eacute', contextname='Eacute', description='LATIN CAPITAL LETTER E WITH ACUTE', shcode=0x0045, lccode=0x00E9, specials={'char',0x0045,0x0301} }, + [0x00CA] = { unicodeslot=0x00CA, category='lu', adobename='Ecircumflex', contextname='Ecircumflex', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX', shcode=0x0045, lccode=0x00EA, specials={'char',0x0045,0x0302} }, + [0x00CB] = { unicodeslot=0x00CB, category='lu', adobename='Edieresis', contextname='Ediaeresis', description='LATIN CAPITAL LETTER E WITH DIAERESIS', shcode=0x0045, lccode=0x00EB, specials={'char',0x0045,0x0308} }, + [0x00CC] = { unicodeslot=0x00CC, category='lu', adobename='Igrave', contextname='Igrave', description='LATIN CAPITAL LETTER I WITH GRAVE', shcode=0x0049, lccode=0x00EC, specials={'char',0x0049,0x0300} }, + [0x00CD] = { unicodeslot=0x00CD, category='lu', adobename='Iacute', contextname='Iacute', description='LATIN CAPITAL LETTER I WITH ACUTE', shcode=0x0049, lccode=0x00ED, specials={'char',0x0049,0x0301} }, + [0x00CE] = { unicodeslot=0x00CE, category='lu', adobename='Icircumflex', contextname='Icircumflex', description='LATIN CAPITAL LETTER I WITH CIRCUMFLEX', shcode=0x0049, lccode=0x00EE, specials={'char',0x0049,0x0302} }, + [0x00CF] = { unicodeslot=0x00CF, category='lu', adobename='Idieresis', contextname='Idiaeresis', description='LATIN CAPITAL LETTER I WITH DIAERESIS', shcode=0x0049, lccode=0x00EF, specials={'char',0x0049,0x0308} }, + [0x00D0] = { unicodeslot=0x00D0, category='lu', adobename='Eth', contextname='Eth', description='LATIN CAPITAL LETTER ETH', lccode=0x00F0 }, + [0x00D1] = { unicodeslot=0x00D1, category='lu', adobename='Ntilde', contextname='Ntilde', description='LATIN CAPITAL LETTER N WITH TILDE', shcode=0x004E, lccode=0x00F1, specials={'char',0x004E,0x0303} }, + [0x00D2] = { unicodeslot=0x00D2, category='lu', adobename='Ograve', contextname='Ograve', description='LATIN CAPITAL LETTER O WITH GRAVE', shcode=0x004F, lccode=0x00F2, specials={'char',0x004F,0x0300} }, + [0x00D3] = { unicodeslot=0x00D3, category='lu', adobename='Oacute', contextname='Oacute', description='LATIN CAPITAL LETTER O WITH ACUTE', shcode=0x004F, lccode=0x00F3, specials={'char',0x004F,0x0301} }, + [0x00D4] = { unicodeslot=0x00D4, category='lu', adobename='Ocircumflex', contextname='Ocircumflex', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX', shcode=0x004F, lccode=0x00F4, specials={'char',0x004F,0x0302} }, + [0x00D5] = { unicodeslot=0x00D5, category='lu', adobename='Otilde', contextname='Otilde', description='LATIN CAPITAL LETTER O WITH TILDE', shcode=0x004F, lccode=0x00F5, specials={'char',0x004F,0x0303} }, + [0x00D6] = { unicodeslot=0x00D6, category='lu', adobename='Odieresis', contextname='Odiaeresis', description='LATIN CAPITAL LETTER O WITH DIAERESIS', shcode=0x004F, lccode=0x00F6, specials={'char',0x004F,0x0308} }, + [0x00D7] = { unicodeslot=0x00D7, category='sm', adobename='multiply', contextname='textmultiply', description='MULTIPLICATION SIGN' }, + [0x00D8] = { unicodeslot=0x00D8, category='lu', adobename='Oslash', contextname='Ostroke', description='LATIN CAPITAL LETTER O WITH STROKE', shcode=0x004F, lccode=0x00F8 }, + [0x00D9] = { unicodeslot=0x00D9, category='lu', adobename='Ugrave', contextname='Ugrave', description='LATIN CAPITAL LETTER U WITH GRAVE', shcode=0x0055, lccode=0x00F9, specials={'char',0x0055,0x0300} }, + [0x00DA] = { unicodeslot=0x00DA, category='lu', adobename='Uacute', contextname='Uacute', description='LATIN CAPITAL LETTER U WITH ACUTE', shcode=0x0055, lccode=0x00FA, specials={'char',0x0055,0x0301} }, + [0x00DB] = { unicodeslot=0x00DB, category='lu', adobename='Ucircumflex', contextname='Ucircumflex', description='LATIN CAPITAL LETTER U WITH CIRCUMFLEX', shcode=0x0055, lccode=0x00FB, specials={'char',0x0055,0x0302} }, + [0x00DC] = { unicodeslot=0x00DC, category='lu', adobename='Udieresis', contextname='Udiaeresis', description='LATIN CAPITAL LETTER U WITH DIAERESIS', shcode=0x0055, lccode=0x00FC, specials={'char',0x0055,0x0308} }, + [0x00DD] = { unicodeslot=0x00DD, category='lu', adobename='Yacute', contextname='Yacute', description='LATIN CAPITAL LETTER Y WITH ACUTE', shcode=0x0059, lccode=0x00FD, specials={'char',0x0059,0x0301} }, + [0x00DE] = { unicodeslot=0x00DE, category='lu', adobename='Thorn', contextname='Thorn', description='LATIN CAPITAL LETTER THORN', lccode=0x00FE }, + [0x00DF] = { unicodeslot=0x00DF, category='ll', adobename='germandbls', contextname='ssharp', description='LATIN SMALL LETTER SHARP S' }, + [0x00E0] = { unicodeslot=0x00E0, category='ll', adobename='agrave', contextname='agrave', description='LATIN SMALL LETTER A WITH GRAVE', shcode=0x0061, uccode=0x00C0, specials={'char',0x0061,0x0300} }, + [0x00E1] = { unicodeslot=0x00E1, category='ll', adobename='aacute', contextname='aacute', description='LATIN SMALL LETTER A WITH ACUTE', shcode=0x0061, uccode=0x00C1, specials={'char',0x0061,0x0301} }, + [0x00E2] = { unicodeslot=0x00E2, category='ll', adobename='acircumflex', contextname='acircumflex', description='LATIN SMALL LETTER A WITH CIRCUMFLEX', shcode=0x0061, uccode=0x00C2, specials={'char',0x0061,0x0302} }, + [0x00E3] = { unicodeslot=0x00E3, category='ll', adobename='atilde', contextname='atilde', description='LATIN SMALL LETTER A WITH TILDE', shcode=0x0061, uccode=0x00C3, specials={'char',0x0061,0x0303} }, + [0x00E4] = { unicodeslot=0x00E4, category='ll', adobename='adieresis', contextname='adiaeresis', description='LATIN SMALL LETTER A WITH DIAERESIS', shcode=0x0061, uccode=0x00C4, specials={'char',0x0061,0x0308} }, + [0x00E5] = { unicodeslot=0x00E5, category='ll', adobename='aring', contextname='aring', description='LATIN SMALL LETTER A WITH RING ABOVE', shcode=0x0061, uccode=0x00C5, specials={'char',0x0061,0x030A} }, + [0x00E6] = { unicodeslot=0x00E6, category='ll', adobename='ae', contextname='aeligature', description='LATIN SMALL LETTER AE', uccode=0x00C6 }, + [0x00E7] = { unicodeslot=0x00E7, category='ll', adobename='ccedilla', contextname='ccedilla', description='LATIN SMALL LETTER C WITH CEDILLA', shcode=0x0063, uccode=0x00C7, specials={'char',0x0063,0x0327} }, + [0x00E8] = { unicodeslot=0x00E8, category='ll', adobename='egrave', contextname='egrave', description='LATIN SMALL LETTER E WITH GRAVE', shcode=0x0065, uccode=0x00C8, specials={'char',0x0065,0x0300} }, + [0x00E9] = { unicodeslot=0x00E9, category='ll', adobename='eacute', contextname='eacute', description='LATIN SMALL LETTER E WITH ACUTE', shcode=0x0065, uccode=0x00C9, specials={'char',0x0065,0x0301} }, + [0x00EA] = { unicodeslot=0x00EA, category='ll', adobename='ecircumflex', contextname='ecircumflex', description='LATIN SMALL LETTER E WITH CIRCUMFLEX', shcode=0x0065, uccode=0x00CA, specials={'char',0x0065,0x0302} }, + [0x00EB] = { unicodeslot=0x00EB, category='ll', adobename='edieresis', contextname='ediaeresis', description='LATIN SMALL LETTER E WITH DIAERESIS', shcode=0x0065, uccode=0x00CB, specials={'char',0x0065,0x0308} }, + [0x00EC] = { unicodeslot=0x00EC, category='ll', adobename='igrave', contextname='igrave', description='LATIN SMALL LETTER I WITH GRAVE', shcode=0x0069, uccode=0x00CC, specials={'char',0x0069,0x0300} }, + [0x00ED] = { unicodeslot=0x00ED, category='ll', adobename='iacute', contextname='iacute', description='LATIN SMALL LETTER I WITH ACUTE', shcode=0x0069, uccode=0x00CD, specials={'char',0x0069,0x0301} }, + [0x00EE] = { unicodeslot=0x00EE, category='ll', adobename='icircumflex', contextname='icircumflex', description='LATIN SMALL LETTER I WITH CIRCUMFLEX', shcode=0x0069, uccode=0x00CE, specials={'char',0x0069,0x0302} }, + [0x00EF] = { unicodeslot=0x00EF, category='ll', adobename='idieresis', contextname='idiaeresis', description='LATIN SMALL LETTER I WITH DIAERESIS', shcode=0x0069, uccode=0x00CF, specials={'char',0x0069,0x0308} }, + [0x00F0] = { unicodeslot=0x00F0, category='ll', adobename='eth', contextname='eth', description='LATIN SMALL LETTER ETH', uccode=0x00D0 }, + [0x00F1] = { unicodeslot=0x00F1, category='ll', adobename='ntilde', contextname='ntilde', description='LATIN SMALL LETTER N WITH TILDE', shcode=0x006E, uccode=0x00D1, specials={'char',0x006E,0x0303} }, + [0x00F2] = { unicodeslot=0x00F2, category='ll', adobename='ograve', contextname='ograve', description='LATIN SMALL LETTER O WITH GRAVE', shcode=0x006F, uccode=0x00D2, specials={'char',0x006F,0x0300} }, + [0x00F3] = { unicodeslot=0x00F3, category='ll', adobename='oacute', contextname='oacute', description='LATIN SMALL LETTER O WITH ACUTE', shcode=0x006F, uccode=0x00D3, specials={'char',0x006F,0x0301} }, + [0x00F4] = { unicodeslot=0x00F4, category='ll', adobename='ocircumflex', contextname='ocircumflex', description='LATIN SMALL LETTER O WITH CIRCUMFLEX', shcode=0x006F, uccode=0x00D4, specials={'char',0x006F,0x0302} }, + [0x00F5] = { unicodeslot=0x00F5, category='ll', adobename='otilde', contextname='otilde', description='LATIN SMALL LETTER O WITH TILDE', shcode=0x006F, uccode=0x00D5, specials={'char',0x006F,0x0303} }, + [0x00F6] = { unicodeslot=0x00F6, category='ll', adobename='odieresis', contextname='odiaeresis', description='LATIN SMALL LETTER O WITH DIAERESIS', shcode=0x006F, uccode=0x00D6, specials={'char',0x006F,0x0308} }, + [0x00F7] = { unicodeslot=0x00F7, category='sm', adobename='divide', contextname='textdiv', description='DIVISION SIGN' }, + [0x00F8] = { unicodeslot=0x00F8, category='ll', adobename='oslash', contextname='ostroke', description='LATIN SMALL LETTER O WITH STROKE', shcode=0x006F, uccode=0x00D8 }, + [0x00F9] = { unicodeslot=0x00F9, category='ll', adobename='ugrave', contextname='ugrave', description='LATIN SMALL LETTER U WITH GRAVE', shcode=0x0075, uccode=0x00D9, specials={'char',0x0075,0x0300} }, + [0x00FA] = { unicodeslot=0x00FA, category='ll', adobename='uacute', contextname='uacute', description='LATIN SMALL LETTER U WITH ACUTE', shcode=0x0075, uccode=0x00DA, specials={'char',0x0075,0x0301} }, + [0x00FB] = { unicodeslot=0x00FB, category='ll', adobename='ucircumflex', contextname='ucircumflex', description='LATIN SMALL LETTER U WITH CIRCUMFLEX', shcode=0x0075, uccode=0x00DB, specials={'char',0x0075,0x0302} }, + [0x00FC] = { unicodeslot=0x00FC, category='ll', adobename='udieresis', contextname='udiaeresis', description='LATIN SMALL LETTER U WITH DIAERESIS', shcode=0x0075, uccode=0x00DC, specials={'char',0x0075,0x0308} }, + [0x00FD] = { unicodeslot=0x00FD, category='ll', adobename='yacute', contextname='yacute', description='LATIN SMALL LETTER Y WITH ACUTE', shcode=0x0079, uccode=0x00DD, specials={'char',0x0079,0x0301} }, + [0x00FE] = { unicodeslot=0x00FE, category='ll', adobename='thorn', contextname='thorn', description='LATIN SMALL LETTER THORN', uccode=0x00DE }, + [0x00FF] = { unicodeslot=0x00FF, category='ll', adobename='ydieresis', contextname='ydiaeresis', description='LATIN SMALL LETTER Y WITH DIAERESIS', shcode=0x0079, uccode=0x0178, specials={'char',0x0079,0x0308} }, + [0x0100] = { unicodeslot=0x0100, category='lu', adobename='Amacron', contextname='Amacron', description='LATIN CAPITAL LETTER A WITH MACRON', shcode=0x0041, lccode=0x0101, specials={'char',0x0041,0x0304} }, + [0x0101] = { unicodeslot=0x0101, category='ll', adobename='amacron', contextname='amacron', description='LATIN SMALL LETTER A WITH MACRON', shcode=0x0061, uccode=0x0100, specials={'char',0x0061,0x0304} }, + [0x0102] = { unicodeslot=0x0102, category='lu', adobename='Abreve', contextname='Abreve', description='LATIN CAPITAL LETTER A WITH BREVE', shcode=0x0041, lccode=0x0103, specials={'char',0x0041,0x0306} }, + [0x0103] = { unicodeslot=0x0103, category='ll', adobename='abreve', contextname='abreve', description='LATIN SMALL LETTER A WITH BREVE', shcode=0x0061, uccode=0x0102, specials={'char',0x0061,0x0306} }, + [0x0104] = { unicodeslot=0x0104, category='lu', adobename='Aogonek', contextname='Aogonek', description='LATIN CAPITAL LETTER A WITH OGONEK', shcode=0x0041, lccode=0x0105, specials={'char',0x0041,0x0328} }, + [0x0105] = { unicodeslot=0x0105, category='ll', adobename='aogonek', contextname='aogonek', description='LATIN SMALL LETTER A WITH OGONEK', shcode=0x0061, uccode=0x0104, specials={'char',0x0061,0x0328} }, + [0x0106] = { unicodeslot=0x0106, category='lu', adobename='Cacute', contextname='Cacute', description='LATIN CAPITAL LETTER C WITH ACUTE', shcode=0x0043, lccode=0x0107, specials={'char',0x0043,0x0301} }, + [0x0107] = { unicodeslot=0x0107, category='ll', adobename='cacute', contextname='cacute', description='LATIN SMALL LETTER C WITH ACUTE', shcode=0x0063, uccode=0x0106, specials={'char',0x0063,0x0301} }, + [0x0108] = { unicodeslot=0x0108, category='lu', adobename='Ccircumflex', contextname='Ccircumflex', description='LATIN CAPITAL LETTER C WITH CIRCUMFLEX', shcode=0x0043, lccode=0x0109, specials={'char',0x0043,0x0302} }, + [0x0109] = { unicodeslot=0x0109, category='ll', adobename='ccircumflex', contextname='ccircumflex', description='LATIN SMALL LETTER C WITH CIRCUMFLEX', shcode=0x0063, uccode=0x0108, specials={'char',0x0063,0x0302} }, + [0x010A] = { unicodeslot=0x010A, category='lu', adobename='Cdotaccent', contextname='Cdotaccent', description='LATIN CAPITAL LETTER C WITH DOT ABOVE', shcode=0x0043, lccode=0x010B, specials={'char',0x0043,0x0307} }, + [0x010B] = { unicodeslot=0x010B, category='ll', adobename='cdotaccent', contextname='cdotaccent', description='LATIN SMALL LETTER C WITH DOT ABOVE', shcode=0x0063, uccode=0x010A, specials={'char',0x0063,0x0307} }, + [0x010C] = { unicodeslot=0x010C, category='lu', adobename='Ccaron', contextname='Ccaron', description='LATIN CAPITAL LETTER C WITH CARON', shcode=0x0043, lccode=0x010D, specials={'char',0x0043,0x030C} }, + [0x010D] = { unicodeslot=0x010D, category='ll', adobename='ccaron', contextname='ccaron', description='LATIN SMALL LETTER C WITH CARON', shcode=0x0063, uccode=0x010C, specials={'char',0x0063,0x030C} }, + [0x010E] = { unicodeslot=0x010E, category='lu', adobename='Dcaron', contextname='Dcaron', description='LATIN CAPITAL LETTER D WITH CARON', shcode=0x0044, lccode=0x010F, specials={'char',0x0044,0x030C} }, + [0x010F] = { unicodeslot=0x010F, category='ll', adobename='dcaron', contextname='dcaron', description='LATIN SMALL LETTER D WITH CARON', shcode=0x0064, uccode=0x010E, specials={'char',0x0064,0x030C} }, + [0x0110] = { unicodeslot=0x0110, category='lu', adobename='Dcroat', contextname='Dstroke', description='LATIN CAPITAL LETTER D WITH STROKE', shcode=0x0044, lccode=0x0111 }, + [0x0111] = { unicodeslot=0x0111, category='ll', adobename='dcroat', contextname='dstroke', description='LATIN SMALL LETTER D WITH STROKE', shcode=0x0064, uccode=0x0110 }, + [0x0112] = { unicodeslot=0x0112, category='lu', adobename='Emacron', contextname='Emacron', description='LATIN CAPITAL LETTER E WITH MACRON', shcode=0x0045, lccode=0x0113, specials={'char',0x0045,0x0304} }, + [0x0113] = { unicodeslot=0x0113, category='ll', adobename='emacron', contextname='emacron', description='LATIN SMALL LETTER E WITH MACRON', shcode=0x0065, uccode=0x0112, specials={'char',0x0065,0x0304} }, + [0x0114] = { unicodeslot=0x0114, category='lu', adobename='Ebreve', contextname='Ebreve', description='LATIN CAPITAL LETTER E WITH BREVE', shcode=0x0045, lccode=0x0115, specials={'char',0x0045,0x0306} }, + [0x0115] = { unicodeslot=0x0115, category='ll', adobename='ebreve', contextname='ebreve', description='LATIN SMALL LETTER E WITH BREVE', shcode=0x0065, uccode=0x0114, specials={'char',0x0065,0x0306} }, + [0x0116] = { unicodeslot=0x0116, category='lu', adobename='Edotaccent', contextname='Edotaccent', description='LATIN CAPITAL LETTER E WITH DOT ABOVE', shcode=0x0045, lccode=0x0117, specials={'char',0x0045,0x0307} }, + [0x0117] = { unicodeslot=0x0117, category='ll', adobename='edotaccent', contextname='edotaccent', description='LATIN SMALL LETTER E WITH DOT ABOVE', shcode=0x0065, uccode=0x0116, specials={'char',0x0065,0x0307} }, + [0x0118] = { unicodeslot=0x0118, category='lu', adobename='Eogonek', contextname='Eogonek', description='LATIN CAPITAL LETTER E WITH OGONEK', shcode=0x0045, lccode=0x0119, specials={'char',0x0045,0x0328} }, + [0x0119] = { unicodeslot=0x0119, category='ll', adobename='eogonek', contextname='eogonek', description='LATIN SMALL LETTER E WITH OGONEK', shcode=0x0065, uccode=0x0118, specials={'char',0x0065,0x0328} }, + [0x011A] = { unicodeslot=0x011A, category='lu', adobename='Ecaron', contextname='Ecaron', description='LATIN CAPITAL LETTER E WITH CARON', shcode=0x0045, lccode=0x011B, specials={'char',0x0045,0x030C} }, + [0x011B] = { unicodeslot=0x011B, category='ll', adobename='ecaron', contextname='ecaron', description='LATIN SMALL LETTER E WITH CARON', shcode=0x0065, uccode=0x011A, specials={'char',0x0065,0x030C} }, + [0x011C] = { unicodeslot=0x011C, category='lu', adobename='Gcircumflex', contextname='Gcircumflex', description='LATIN CAPITAL LETTER G WITH CIRCUMFLEX', shcode=0x0047, lccode=0x011D, specials={'char',0x0047,0x0302} }, + [0x011D] = { unicodeslot=0x011D, category='ll', adobename='gcircumflex', contextname='gcircumflex', description='LATIN SMALL LETTER G WITH CIRCUMFLEX', shcode=0x0067, uccode=0x011C, specials={'char',0x0067,0x0302} }, + [0x011E] = { unicodeslot=0x011E, category='lu', adobename='Gbreve', contextname='Gbreve', description='LATIN CAPITAL LETTER G WITH BREVE', shcode=0x0047, lccode=0x011F, specials={'char',0x0047,0x0306} }, + [0x011F] = { unicodeslot=0x011F, category='ll', adobename='gbreve', contextname='gbreve', description='LATIN SMALL LETTER G WITH BREVE', shcode=0x0067, uccode=0x011E, specials={'char',0x0067,0x0306} }, + [0x0120] = { unicodeslot=0x0120, category='lu', adobename='Gdotaccent', contextname='Gdotaccent', description='LATIN CAPITAL LETTER G WITH DOT ABOVE', shcode=0x0047, lccode=0x0121, specials={'char',0x0047,0x0307} }, + [0x0121] = { unicodeslot=0x0121, category='ll', adobename='gdotaccent', contextname='gdotaccent', description='LATIN SMALL LETTER G WITH DOT ABOVE', shcode=0x0067, uccode=0x0120, specials={'char',0x0067,0x0307} }, + [0x0122] = { unicodeslot=0x0122, category='lu', adobename='Gcommaaccent', contextname='Gcommaaccent', description='LATIN CAPITAL LETTER G WITH CEDILLA', shcode=0x0047, lccode=0x0123, specials={'char',0x0047,0x0327} }, + [0x0123] = { unicodeslot=0x0123, category='ll', adobename='gcommaaccent', contextname='gcommaaccent', description='LATIN SMALL LETTER G WITH CEDILLA', shcode=0x0067, uccode=0x0122, specials={'char',0x0067,0x0327} }, + [0x0124] = { unicodeslot=0x0124, category='lu', adobename='Hcircumflex', contextname='Hcircumflex', description='LATIN CAPITAL LETTER H WITH CIRCUMFLEX', shcode=0x0048, lccode=0x0125, specials={'char',0x0048,0x0302} }, + [0x0125] = { unicodeslot=0x0125, category='ll', adobename='hcircumflex', contextname='hcircumflex', description='LATIN SMALL LETTER H WITH CIRCUMFLEX', shcode=0x0068, uccode=0x0124, specials={'char',0x0068,0x0302} }, + [0x0126] = { unicodeslot=0x0126, category='lu', adobename='Hbar', contextname='Hstroke', description='LATIN CAPITAL LETTER H WITH STROKE', shcode=0x0048, lccode=0x0127 }, + [0x0127] = { unicodeslot=0x0127, category='ll', adobename='hbar', contextname='hstroke', description='LATIN SMALL LETTER H WITH STROKE', shcode=0x0068, uccode=0x0126 }, + [0x0128] = { unicodeslot=0x0128, category='lu', adobename='Itilde', contextname='Itilde', description='LATIN CAPITAL LETTER I WITH TILDE', shcode=0x0049, lccode=0x0129, specials={'char',0x0049,0x0303} }, + [0x0129] = { unicodeslot=0x0129, category='ll', adobename='itilde', contextname='itilde', description='LATIN SMALL LETTER I WITH TILDE', shcode=0x0069, uccode=0x0128, specials={'char',0x0069,0x0303} }, + [0x012A] = { unicodeslot=0x012A, category='lu', adobename='Imacron', contextname='Imacron', description='LATIN CAPITAL LETTER I WITH MACRON', shcode=0x0049, lccode=0x012B, specials={'char',0x0049,0x0304} }, + [0x012B] = { unicodeslot=0x012B, category='ll', adobename='imacron', contextname='imacron', description='LATIN SMALL LETTER I WITH MACRON', shcode=0x0069, uccode=0x012A, specials={'char',0x0069,0x0304} }, + [0x012C] = { unicodeslot=0x012C, category='lu', adobename='Ibreve', contextname='Ibreve', description='LATIN CAPITAL LETTER I WITH BREVE', shcode=0x0049, lccode=0x012D, specials={'char',0x0049,0x0306} }, + [0x012D] = { unicodeslot=0x012D, category='ll', adobename='ibreve', contextname='ibreve', description='LATIN SMALL LETTER I WITH BREVE', shcode=0x0069, uccode=0x012C, specials={'char',0x0069,0x0306} }, + [0x012E] = { unicodeslot=0x012E, category='lu', adobename='Iogonek', contextname='Iogonek', description='LATIN CAPITAL LETTER I WITH OGONEK', shcode=0x0049, lccode=0x012F, specials={'char',0x0049,0x0328} }, + [0x012F] = { unicodeslot=0x012F, category='ll', adobename='iogonek', contextname='iogonek', description='LATIN SMALL LETTER I WITH OGONEK', shcode=0x0069, uccode=0x012E, specials={'char',0x0069,0x0328} }, + [0x0130] = { unicodeslot=0x0130, category='lu', adobename='Idotaccent', contextname='Idotaccent', description='LATIN CAPITAL LETTER I WITH DOT ABOVE', shcode=0x0049, lccode=0x0069, specials={'char',0x0049,0x0307} }, + [0x0131] = { unicodeslot=0x0131, category='ll', adobename='dotlessi', contextname='dotlessi', description='LATIN SMALL LETTER DOTLESS I', uccode=0x0049 }, + [0x0132] = { unicodeslot=0x0132, category='lu', adobename='IJ', contextname='IJligature', description='LATIN CAPITAL LIGATURE IJ', lccode=0x0133, specials={'compat',0x0049,0x004A} }, + [0x0133] = { unicodeslot=0x0133, category='ll', adobename='ij', contextname='ijligature', description='LATIN SMALL LIGATURE IJ', uccode=0x0132, specials={'compat',0x0069,0x006A} }, + [0x0134] = { unicodeslot=0x0134, category='lu', adobename='Jcircumflex', contextname='Jcircumflex', description='LATIN CAPITAL LETTER J WITH CIRCUMFLEX', shcode=0x004A, lccode=0x0135, specials={'char',0x004A,0x0302} }, + [0x0135] = { unicodeslot=0x0135, category='ll', adobename='jcircumflex', contextname='jcircumflex', description='LATIN SMALL LETTER J WITH CIRCUMFLEX', shcode=0x006A, uccode=0x0134, specials={'char',0x006A,0x0302} }, + [0x0136] = { unicodeslot=0x0136, category='lu', adobename='Kcommaaccent', contextname='Kcommaaccent', description='LATIN CAPITAL LETTER K WITH CEDILLA', shcode=0x004B, lccode=0x0137, specials={'char',0x004B,0x0327} }, + [0x0137] = { unicodeslot=0x0137, category='ll', adobename='kcommaaccent', contextname='kcommaaccent', description='LATIN SMALL LETTER K WITH CEDILLA', shcode=0x006B, uccode=0x0136, specials={'char',0x006B,0x0327} }, + [0x0138] = { unicodeslot=0x0138, category='ll', adobename='kgreenlandic', contextname='kkra', description='LATIN SMALL LETTER KRA' }, + [0x0139] = { unicodeslot=0x0139, category='lu', adobename='Lacute', contextname='Lacute', description='LATIN CAPITAL LETTER L WITH ACUTE', shcode=0x004C, lccode=0x013A, specials={'char',0x004C,0x0301} }, + [0x013A] = { unicodeslot=0x013A, category='ll', adobename='lacute', contextname='lacute', description='LATIN SMALL LETTER L WITH ACUTE', shcode=0x006C, uccode=0x0139, specials={'char',0x006C,0x0301} }, + [0x013B] = { unicodeslot=0x013B, category='lu', adobename='Lcommaaccent', contextname='Lcommaaccent', description='LATIN CAPITAL LETTER L WITH CEDILLA', shcode=0x004C, lccode=0x013C, specials={'char',0x004C,0x0327} }, + [0x013C] = { unicodeslot=0x013C, category='ll', adobename='lcommaaccent', contextname='lcommaaccent', description='LATIN SMALL LETTER L WITH CEDILLA', shcode=0x006C, uccode=0x013B, specials={'char',0x006C,0x0327} }, + [0x013D] = { unicodeslot=0x013D, category='lu', adobename='Lcaron', contextname='Lcaron', description='LATIN CAPITAL LETTER L WITH CARON', shcode=0x004C, lccode=0x013E, specials={'char',0x004C,0x030C} }, + [0x013E] = { unicodeslot=0x013E, category='ll', adobename='lcaron', contextname='lcaron', description='LATIN SMALL LETTER L WITH CARON', shcode=0x006C, uccode=0x013D, specials={'char',0x006C,0x030C} }, + [0x013F] = { unicodeslot=0x013F, category='lu', adobename='Ldot', contextname='Ldotmiddle', description='LATIN CAPITAL LETTER L WITH MIDDLE DOT', shcode=0x004C, lccode=0x0140, specials={'compat',0x004C,0x00B7} }, + [0x0140] = { unicodeslot=0x0140, category='ll', adobename='ldot', contextname='ldotmiddle', description='LATIN SMALL LETTER L WITH MIDDLE DOT', shcode=0x006C, uccode=0x013F, specials={'compat',0x006C,0x00B7} }, + [0x0141] = { unicodeslot=0x0141, category='lu', adobename='Lslash', contextname='Lstroke', description='LATIN CAPITAL LETTER L WITH STROKE', shcode=0x004C, lccode=0x0142 }, + [0x0142] = { unicodeslot=0x0142, category='ll', adobename='lslash', contextname='lstroke', description='LATIN SMALL LETTER L WITH STROKE', shcode=0x006C, uccode=0x0141 }, + [0x0143] = { unicodeslot=0x0143, category='lu', adobename='Nacute', contextname='Nacute', description='LATIN CAPITAL LETTER N WITH ACUTE', shcode=0x004E, lccode=0x0144, specials={'char',0x004E,0x0301} }, + [0x0144] = { unicodeslot=0x0144, category='ll', adobename='nacute', contextname='nacute', description='LATIN SMALL LETTER N WITH ACUTE', shcode=0x006E, uccode=0x0143, specials={'char',0x006E,0x0301} }, + [0x0145] = { unicodeslot=0x0145, category='lu', adobename='Ncommaaccent', contextname='Ncommaaccent', description='LATIN CAPITAL LETTER N WITH CEDILLA', shcode=0x004E, lccode=0x0146, specials={'char',0x004E,0x0327} }, + [0x0146] = { unicodeslot=0x0146, category='ll', adobename='ncommaaccent', contextname='ncommaaccent', description='LATIN SMALL LETTER N WITH CEDILLA', shcode=0x006E, uccode=0x0145, specials={'char',0x006E,0x0327} }, + [0x0147] = { unicodeslot=0x0147, category='lu', adobename='Ncaron', contextname='Ncaron', description='LATIN CAPITAL LETTER N WITH CARON', shcode=0x004E, lccode=0x0148, specials={'char',0x004E,0x030C} }, + [0x0148] = { unicodeslot=0x0148, category='ll', adobename='ncaron', contextname='ncaron', description='LATIN SMALL LETTER N WITH CARON', shcode=0x006E, uccode=0x0147, specials={'char',0x006E,0x030C} }, + [0x0149] = { unicodeslot=0x0149, category='ll', adobename='napostrophe', contextname='napostrophe', description='LATIN SMALL LETTER N PRECEDED BY APOSTROPHE', specials={'compat',0x02BC,0x006E} }, + [0x014A] = { unicodeslot=0x014A, category='lu', adobename='Eng', contextname='Neng', description='LATIN CAPITAL LETTER ENG', lccode=0x014B }, + [0x014B] = { unicodeslot=0x014B, category='ll', adobename='eng', contextname='neng', description='LATIN SMALL LETTER ENG', uccode=0x014A }, + [0x014C] = { unicodeslot=0x014C, category='lu', adobename='Omacron', contextname='Omacron', description='LATIN CAPITAL LETTER O WITH MACRON', shcode=0x004F, lccode=0x014D, specials={'char',0x004F,0x0304} }, + [0x014D] = { unicodeslot=0x014D, category='ll', adobename='omacron', contextname='omacron', description='LATIN SMALL LETTER O WITH MACRON', shcode=0x006F, uccode=0x014C, specials={'char',0x006F,0x0304} }, + [0x014E] = { unicodeslot=0x014E, category='lu', adobename='Obreve', contextname='Obreve', description='LATIN CAPITAL LETTER O WITH BREVE', shcode=0x004F, lccode=0x014F, specials={'char',0x004F,0x0306} }, + [0x014F] = { unicodeslot=0x014F, category='ll', adobename='obreve', contextname='obreve', description='LATIN SMALL LETTER O WITH BREVE', shcode=0x006F, uccode=0x014E, specials={'char',0x006F,0x0306} }, + [0x0150] = { unicodeslot=0x0150, category='lu', adobename='Ohungarumlaut', contextname='Ohungarumlaut', description='LATIN CAPITAL LETTER O WITH DOUBLE ACUTE', shcode=0x004F, lccode=0x0151, specials={'char',0x004F,0x030B} }, + [0x0151] = { unicodeslot=0x0151, category='ll', adobename='ohungarumlaut', contextname='ohungarumlaut', description='LATIN SMALL LETTER O WITH DOUBLE ACUTE', shcode=0x006F, uccode=0x0150, specials={'char',0x006F,0x030B} }, + [0x0152] = { unicodeslot=0x0152, category='lu', adobename='OE', contextname='OEligature', description='LATIN CAPITAL LIGATURE OE', lccode=0x0153 }, + [0x0153] = { unicodeslot=0x0153, category='ll', adobename='oe', contextname='oeligature', description='LATIN SMALL LIGATURE OE', uccode=0x0152 }, + [0x0154] = { unicodeslot=0x0154, category='lu', adobename='Racute', contextname='Racute', description='LATIN CAPITAL LETTER R WITH ACUTE', shcode=0x0052, lccode=0x0155, specials={'char',0x0052,0x0301} }, + [0x0155] = { unicodeslot=0x0155, category='ll', adobename='racute', contextname='racute', description='LATIN SMALL LETTER R WITH ACUTE', shcode=0x0072, uccode=0x0154, specials={'char',0x0072,0x0301} }, + [0x0156] = { unicodeslot=0x0156, category='lu', adobename='Rcommaaccent', contextname='Rcommaaccent', description='LATIN CAPITAL LETTER R WITH CEDILLA', shcode=0x0052, lccode=0x0157, specials={'char',0x0052,0x0327} }, + [0x0157] = { unicodeslot=0x0157, category='ll', adobename='rcommaaccent', contextname='rcommaaccent', description='LATIN SMALL LETTER R WITH CEDILLA', shcode=0x0072, uccode=0x0156, specials={'char',0x0072,0x0327} }, + [0x0158] = { unicodeslot=0x0158, category='lu', adobename='Rcaron', contextname='Rcaron', description='LATIN CAPITAL LETTER R WITH CARON', shcode=0x0052, lccode=0x0159, specials={'char',0x0052,0x030C} }, + [0x0159] = { unicodeslot=0x0159, category='ll', adobename='rcaron', contextname='rcaron', description='LATIN SMALL LETTER R WITH CARON', shcode=0x0072, uccode=0x0158, specials={'char',0x0072,0x030C} }, + [0x015A] = { unicodeslot=0x015A, category='lu', adobename='Sacute', contextname='Sacute', description='LATIN CAPITAL LETTER S WITH ACUTE', shcode=0x0053, lccode=0x015B, specials={'char',0x0053,0x0301} }, + [0x015B] = { unicodeslot=0x015B, category='ll', adobename='sacute', contextname='sacute', description='LATIN SMALL LETTER S WITH ACUTE', shcode=0x0073, uccode=0x015A, specials={'char',0x0073,0x0301} }, + [0x015C] = { unicodeslot=0x015C, category='lu', adobename='Scircumflex', contextname='Scircumflex', description='LATIN CAPITAL LETTER S WITH CIRCUMFLEX', shcode=0x0053, lccode=0x015D, specials={'char',0x0053,0x0302} }, + [0x015D] = { unicodeslot=0x015D, category='ll', adobename='scircumflex', contextname='scircumflex', description='LATIN SMALL LETTER S WITH CIRCUMFLEX', shcode=0x0073, uccode=0x015C, specials={'char',0x0073,0x0302} }, + [0x015E] = { unicodeslot=0x015E, category='lu', adobename='Scedilla', contextname='Scedilla', description='LATIN CAPITAL LETTER S WITH CEDILLA', shcode=0x0053, lccode=0x015F, specials={'char',0x0053,0x0327} }, + [0x015F] = { unicodeslot=0x015F, category='ll', adobename='scedilla', contextname='scedilla', description='LATIN SMALL LETTER S WITH CEDILLA', shcode=0x0073, uccode=0x015E, specials={'char',0x0073,0x0327} }, + [0x0160] = { unicodeslot=0x0160, category='lu', adobename='Scaron', contextname='Scaron', description='LATIN CAPITAL LETTER S WITH CARON', shcode=0x0053, lccode=0x0161, specials={'char',0x0053,0x030C} }, + [0x0161] = { unicodeslot=0x0161, category='ll', adobename='scaron', contextname='scaron', description='LATIN SMALL LETTER S WITH CARON', shcode=0x0073, uccode=0x0160, specials={'char',0x0073,0x030C} }, + [0x0162] = { unicodeslot=0x0162, category='lu', adobename='Tcommaaccent', contextname='Tcedilla', description='LATIN CAPITAL LETTER T WITH CEDILLA', shcode=0x0054, lccode=0x0163, specials={'char',0x0054,0x0327} }, + [0x0163] = { unicodeslot=0x0163, category='ll', adobename='tcommaaccent', contextname='tcedilla', description='LATIN SMALL LETTER T WITH CEDILLA', shcode=0x0074, uccode=0x0162, specials={'char',0x0074,0x0327} }, + [0x0164] = { unicodeslot=0x0164, category='lu', adobename='Tcaron', contextname='Tcaron', description='LATIN CAPITAL LETTER T WITH CARON', shcode=0x0054, lccode=0x0165, specials={'char',0x0054,0x030C} }, + [0x0165] = { unicodeslot=0x0165, category='ll', adobename='tcaron', contextname='tcaron', description='LATIN SMALL LETTER T WITH CARON', shcode=0x0074, uccode=0x0164, specials={'char',0x0074,0x030C} }, + [0x0166] = { unicodeslot=0x0166, category='lu', adobename='Tbar', contextname='Tstroke', description='LATIN CAPITAL LETTER T WITH STROKE', shcode=0x0054, lccode=0x0167 }, + [0x0167] = { unicodeslot=0x0167, category='ll', adobename='tbar', contextname='tstroke', description='LATIN SMALL LETTER T WITH STROKE', shcode=0x0074, uccode=0x0166 }, + [0x0168] = { unicodeslot=0x0168, category='lu', adobename='Utilde', contextname='Utilde', description='LATIN CAPITAL LETTER U WITH TILDE', shcode=0x0055, lccode=0x0169, specials={'char',0x0055,0x0303} }, + [0x0169] = { unicodeslot=0x0169, category='ll', adobename='utilde', contextname='utilde', description='LATIN SMALL LETTER U WITH TILDE', shcode=0x0075, uccode=0x0168, specials={'char',0x0075,0x0303} }, + [0x016A] = { unicodeslot=0x016A, category='lu', adobename='Umacron', contextname='Umacron', description='LATIN CAPITAL LETTER U WITH MACRON', shcode=0x0055, lccode=0x016B, specials={'char',0x0055,0x0304} }, + [0x016B] = { unicodeslot=0x016B, category='ll', adobename='umacron', contextname='umacron', description='LATIN SMALL LETTER U WITH MACRON', shcode=0x0075, uccode=0x016A, specials={'char',0x0075,0x0304} }, + [0x016C] = { unicodeslot=0x016C, category='lu', adobename='Ubreve', contextname='Ubreve', description='LATIN CAPITAL LETTER U WITH BREVE', shcode=0x0055, lccode=0x016D, specials={'char',0x0055,0x0306} }, + [0x016D] = { unicodeslot=0x016D, category='ll', adobename='ubreve', contextname='ubreve', description='LATIN SMALL LETTER U WITH BREVE', shcode=0x0075, uccode=0x016C, specials={'char',0x0075,0x0306} }, + [0x016E] = { unicodeslot=0x016E, category='lu', adobename='Uring', contextname='Uring', description='LATIN CAPITAL LETTER U WITH RING ABOVE', shcode=0x0055, lccode=0x016F, specials={'char',0x0055,0x030A} }, + [0x016F] = { unicodeslot=0x016F, category='ll', adobename='uring', contextname='uring', description='LATIN SMALL LETTER U WITH RING ABOVE', shcode=0x0075, uccode=0x016E, specials={'char',0x0075,0x030A} }, + [0x0170] = { unicodeslot=0x0170, category='lu', adobename='Uhungarumlaut', contextname='Uhungarumlaut', description='LATIN CAPITAL LETTER U WITH DOUBLE ACUTE', shcode=0x0055, lccode=0x0171, specials={'char',0x0055,0x030B} }, + [0x0171] = { unicodeslot=0x0171, category='ll', adobename='uhungarumlaut', contextname='uhungarumlaut', description='LATIN SMALL LETTER U WITH DOUBLE ACUTE', shcode=0x0075, uccode=0x0170, specials={'char',0x0075,0x030B} }, + [0x0172] = { unicodeslot=0x0172, category='lu', adobename='Uogonek', contextname='Uogonek', description='LATIN CAPITAL LETTER U WITH OGONEK', shcode=0x0055, lccode=0x0173, specials={'char',0x0055,0x0328} }, + [0x0173] = { unicodeslot=0x0173, category='ll', adobename='uogonek', contextname='uogonek', description='LATIN SMALL LETTER U WITH OGONEK', shcode=0x0075, uccode=0x0172, specials={'char',0x0075,0x0328} }, + [0x0174] = { unicodeslot=0x0174, category='lu', adobename='Wcircumflex', contextname='Wcircumflex', description='LATIN CAPITAL LETTER W WITH CIRCUMFLEX', shcode=0x0057, lccode=0x0175, specials={'char',0x0057,0x0302} }, + [0x0175] = { unicodeslot=0x0175, category='ll', adobename='wcircumflex', contextname='wcircumflex', description='LATIN SMALL LETTER W WITH CIRCUMFLEX', shcode=0x0077, uccode=0x0174, specials={'char',0x0077,0x0302} }, + [0x0176] = { unicodeslot=0x0176, category='lu', adobename='Ycircumflex', contextname='Ycircumflex', description='LATIN CAPITAL LETTER Y WITH CIRCUMFLEX', shcode=0x0059, lccode=0x0177, specials={'char',0x0059,0x0302} }, + [0x0177] = { unicodeslot=0x0177, category='ll', adobename='ycircumflex', contextname='ycircumflex', description='LATIN SMALL LETTER Y WITH CIRCUMFLEX', shcode=0x0079, uccode=0x0176, specials={'char',0x0079,0x0302} }, + [0x0178] = { unicodeslot=0x0178, category='lu', adobename='Ydieresis', contextname='Ydiaeresis', description='LATIN CAPITAL LETTER Y WITH DIAERESIS', shcode=0x0059, lccode=0x00FF, specials={'char',0x0059,0x0308} }, + [0x0179] = { unicodeslot=0x0179, category='lu', adobename='Zacute', contextname='Zacute', description='LATIN CAPITAL LETTER Z WITH ACUTE', shcode=0x005A, lccode=0x017A, specials={'char',0x005A,0x0301} }, + [0x017A] = { unicodeslot=0x017A, category='ll', adobename='zacute', contextname='zacute', description='LATIN SMALL LETTER Z WITH ACUTE', shcode=0x007A, uccode=0x0179, specials={'char',0x007A,0x0301} }, + [0x017B] = { unicodeslot=0x017B, category='lu', adobename='Zdotaccent', contextname='Zdotaccent', description='LATIN CAPITAL LETTER Z WITH DOT ABOVE', shcode=0x005A, lccode=0x017C, specials={'char',0x005A,0x0307} }, + [0x017C] = { unicodeslot=0x017C, category='ll', adobename='zdotaccent', contextname='zdotaccent', description='LATIN SMALL LETTER Z WITH DOT ABOVE', shcode=0x007A, uccode=0x017B, specials={'char',0x007A,0x0307} }, + [0x017D] = { unicodeslot=0x017D, category='lu', adobename='Zcaron', contextname='Zcaron', description='LATIN CAPITAL LETTER Z WITH CARON', shcode=0x005A, lccode=0x017E, specials={'char',0x005A,0x030C} }, + [0x017E] = { unicodeslot=0x017E, category='ll', adobename='zcaron', contextname='zcaron', description='LATIN SMALL LETTER Z WITH CARON', shcode=0x007A, uccode=0x017D, specials={'char',0x007A,0x030C} }, + [0x017F] = { unicodeslot=0x017F, category='ll', adobename='longs', contextname='slong', description='LATIN SMALL LETTER LONG S', uccode=0x0053, specials={'compat',0x0073} }, + [0x0180] = { unicodeslot=0x0180, category='ll', contextname='bstroke', description='LATIN SMALL LETTER B WITH STROKE', shcode=0x0062, uccode=0x0243 }, + [0x0181] = { unicodeslot=0x0181, category='lu', contextname='Bhook', description='LATIN CAPITAL LETTER B WITH HOOK', shcode=0x0042, lccode=0x0253 }, + [0x0182] = { unicodeslot=0x0182, category='lu', description='LATIN CAPITAL LETTER B WITH TOPBAR', shcode=0x0042, lccode=0x0183 }, + [0x0183] = { unicodeslot=0x0183, category='ll', description='LATIN SMALL LETTER B WITH TOPBAR', shcode=0x0062, uccode=0x0182 }, + [0x0184] = { unicodeslot=0x0184, category='lu', description='LATIN CAPITAL LETTER TONE SIX', lccode=0x0185 }, + [0x0185] = { unicodeslot=0x0185, category='ll', description='LATIN SMALL LETTER TONE SIX', uccode=0x0184 }, + [0x0186] = { unicodeslot=0x0186, category='lu', description='LATIN CAPITAL LETTER OPEN O', lccode=0x0254 }, + [0x0187] = { unicodeslot=0x0187, category='lu', contextname='Chook', description='LATIN CAPITAL LETTER C WITH HOOK', shcode=0x0043, lccode=0x0188 }, + [0x0188] = { unicodeslot=0x0188, category='ll', contextname='chook', description='LATIN SMALL LETTER C WITH HOOK', shcode=0x0063, uccode=0x0187 }, + [0x0189] = { unicodeslot=0x0189, category='lu', contextname='Dafrican', description='LATIN CAPITAL LETTER AFRICAN D', lccode=0x0256 }, + [0x018A] = { unicodeslot=0x018A, category='lu', contextname='Dhook', description='LATIN CAPITAL LETTER D WITH HOOK', shcode=0x0044, lccode=0x0257 }, + [0x018B] = { unicodeslot=0x018B, category='lu', description='LATIN CAPITAL LETTER D WITH TOPBAR', shcode=0x0044, lccode=0x018C }, + [0x018C] = { unicodeslot=0x018C, category='ll', description='LATIN SMALL LETTER D WITH TOPBAR', shcode=0x0064, uccode=0x018B }, + [0x018D] = { unicodeslot=0x018D, category='ll', description='LATIN SMALL LETTER TURNED DELTA' }, + [0x018E] = { unicodeslot=0x018E, category='lu', description='LATIN CAPITAL LETTER REVERSED E', lccode=0x01DD }, + [0x018F] = { unicodeslot=0x018F, category='lu', contextname='Schwa', description='LATIN CAPITAL LETTER SCHWA', lccode=0x0259 }, + [0x0190] = { unicodeslot=0x0190, category='lu', description='LATIN CAPITAL LETTER OPEN E', lccode=0x025B }, + [0x0191] = { unicodeslot=0x0191, category='lu', contextname='Fhook', description='LATIN CAPITAL LETTER F WITH HOOK', shcode=0x0046, lccode=0x0192 }, + [0x0192] = { unicodeslot=0x0192, category='ll', adobename='florin', contextname='fhook', description='LATIN SMALL LETTER F WITH HOOK', shcode=0x0066, uccode=0x0191 }, + [0x0193] = { unicodeslot=0x0193, category='lu', contextname='Ghook', description='LATIN CAPITAL LETTER G WITH HOOK', shcode=0x0047, lccode=0x0260 }, + [0x0194] = { unicodeslot=0x0194, category='lu', description='LATIN CAPITAL LETTER GAMMA', lccode=0x0263 }, + [0x0195] = { unicodeslot=0x0195, category='ll', description='LATIN SMALL LETTER HV', uccode=0x01F6 }, + [0x0196] = { unicodeslot=0x0196, category='lu', description='LATIN CAPITAL LETTER IOTA', lccode=0x0269 }, + [0x0197] = { unicodeslot=0x0197, category='lu', contextname='Istroke', description='LATIN CAPITAL LETTER I WITH STROKE', shcode=0x0049, lccode=0x0268 }, + [0x0198] = { unicodeslot=0x0198, category='lu', contextname='Khook', description='LATIN CAPITAL LETTER K WITH HOOK', shcode=0x004B, lccode=0x0199 }, + [0x0199] = { unicodeslot=0x0199, category='ll', contextname='khook', description='LATIN SMALL LETTER K WITH HOOK', shcode=0x006B, uccode=0x0198 }, + [0x019A] = { unicodeslot=0x019A, category='ll', contextname='lbar', description='LATIN SMALL LETTER L WITH BAR', shcode=0x006C, uccode=0x023D }, + [0x019B] = { unicodeslot=0x019B, category='ll', description='LATIN SMALL LETTER LAMBDA WITH STROKE' }, + [0x019C] = { unicodeslot=0x019C, category='lu', description='LATIN CAPITAL LETTER TURNED M', lccode=0x026F }, + [0x019D] = { unicodeslot=0x019D, category='lu', description='LATIN CAPITAL LETTER N WITH LEFT HOOK', shcode=0x004E, lccode=0x0272 }, + [0x019E] = { unicodeslot=0x019E, category='ll', description='LATIN SMALL LETTER N WITH LONG RIGHT LEG', shcode=0x006E, uccode=0x0220 }, + [0x019F] = { unicodeslot=0x019F, category='lu', description='LATIN CAPITAL LETTER O WITH MIDDLE TILDE', shcode=0x004F, lccode=0x0275 }, + [0x01A0] = { unicodeslot=0x01A0, category='lu', adobename='Ohorn', contextname='Ohorn', description='LATIN CAPITAL LETTER O WITH HORN', shcode=0x004F, lccode=0x01A1, specials={'char',0x004F,0x031B} }, + [0x01A1] = { unicodeslot=0x01A1, category='ll', adobename='ohorn', contextname='ohorn', description='LATIN SMALL LETTER O WITH HORN', shcode=0x006F, uccode=0x01A0, specials={'char',0x006F,0x031B} }, + [0x01A2] = { unicodeslot=0x01A2, category='lu', description='LATIN CAPITAL LETTER OI', lccode=0x01A3 }, + [0x01A3] = { unicodeslot=0x01A3, category='ll', description='LATIN SMALL LETTER OI', uccode=0x01A2 }, + [0x01A4] = { unicodeslot=0x01A4, category='lu', contextname='Phook', description='LATIN CAPITAL LETTER P WITH HOOK', shcode=0x0050, lccode=0x01A5 }, + [0x01A5] = { unicodeslot=0x01A5, category='ll', contextname='phook', description='LATIN SMALL LETTER P WITH HOOK', shcode=0x0070, uccode=0x01A4 }, + [0x01A6] = { unicodeslot=0x01A6, category='lu', description='LATIN LETTER YR', lccode=0x0280 }, + [0x01A7] = { unicodeslot=0x01A7, category='lu', description='LATIN CAPITAL LETTER TONE TWO', lccode=0x01A8 }, + [0x01A8] = { unicodeslot=0x01A8, category='ll', description='LATIN SMALL LETTER TONE TWO', uccode=0x01A7 }, + [0x01A9] = { unicodeslot=0x01A9, category='lu', description='LATIN CAPITAL LETTER ESH', lccode=0x0283 }, + [0x01AA] = { unicodeslot=0x01AA, category='ll', description='LATIN LETTER REVERSED ESH LOOP' }, + [0x01AB] = { unicodeslot=0x01AB, category='ll', description='LATIN SMALL LETTER T WITH PALATAL HOOK', shcode=0x0074 }, + [0x01AC] = { unicodeslot=0x01AC, category='lu', contextname='Thook', description='LATIN CAPITAL LETTER T WITH HOOK', shcode=0x0054, lccode=0x01AD }, + [0x01AD] = { unicodeslot=0x01AD, category='ll', contextname='thook', description='LATIN SMALL LETTER T WITH HOOK', shcode=0x0074, uccode=0x01AC }, + [0x01AE] = { unicodeslot=0x01AE, category='lu', description='LATIN CAPITAL LETTER T WITH RETROFLEX HOOK', shcode=0x0054, lccode=0x0288 }, + [0x01AF] = { unicodeslot=0x01AF, category='lu', adobename='Uhorn', contextname='Uhorn', description='LATIN CAPITAL LETTER U WITH HORN', shcode=0x0055, lccode=0x01B0, specials={'char',0x0055,0x031B} }, + [0x01B0] = { unicodeslot=0x01B0, category='ll', adobename='uhorn', contextname='uhorn', description='LATIN SMALL LETTER U WITH HORN', shcode=0x0075, uccode=0x01AF, specials={'char',0x0075,0x031B} }, + [0x01B1] = { unicodeslot=0x01B1, category='lu', description='LATIN CAPITAL LETTER UPSILON', lccode=0x028A }, + [0x01B2] = { unicodeslot=0x01B2, category='lu', contextname='Uhook', description='LATIN CAPITAL LETTER V WITH HOOK', shcode=0x0056, lccode=0x028B }, + [0x01B3] = { unicodeslot=0x01B3, category='lu', contextname='Yhook', description='LATIN CAPITAL LETTER Y WITH HOOK', shcode=0x0059, lccode=0x01B4 }, + [0x01B4] = { unicodeslot=0x01B4, category='ll', contextname='yhook', description='LATIN SMALL LETTER Y WITH HOOK', shcode=0x0079, uccode=0x01B3 }, + [0x01B5] = { unicodeslot=0x01B5, category='lu', contextname='Zstroke', description='LATIN CAPITAL LETTER Z WITH STROKE', shcode=0x005A, lccode=0x01B6 }, + [0x01B6] = { unicodeslot=0x01B6, category='ll', contextname='zstroke', description='LATIN SMALL LETTER Z WITH STROKE', shcode=0x007A, uccode=0x01B5 }, + [0x01B7] = { unicodeslot=0x01B7, category='lu', description='LATIN CAPITAL LETTER EZH', lccode=0x0292 }, + [0x01B8] = { unicodeslot=0x01B8, category='lu', description='LATIN CAPITAL LETTER EZH REVERSED', lccode=0x01B9 }, + [0x01B9] = { unicodeslot=0x01B9, category='ll', description='LATIN SMALL LETTER EZH REVERSED', uccode=0x01B8 }, + [0x01BA] = { unicodeslot=0x01BA, category='ll', description='LATIN SMALL LETTER EZH WITH TAIL', shcode=0x0292 }, + [0x01BB] = { unicodeslot=0x01BB, category='lo', description='LATIN LETTER TWO WITH STROKE' }, + [0x01BC] = { unicodeslot=0x01BC, category='lu', description='LATIN CAPITAL LETTER TONE FIVE', lccode=0x01BD }, + [0x01BD] = { unicodeslot=0x01BD, category='ll', description='LATIN SMALL LETTER TONE FIVE', uccode=0x01BC }, + [0x01BE] = { unicodeslot=0x01BE, category='ll', description='LATIN LETTER INVERTED GLOTTAL STOP WITH STROKE' }, + [0x01BF] = { unicodeslot=0x01BF, category='ll', description='LATIN LETTER WYNN', uccode=0x01F7 }, + [0x01C0] = { unicodeslot=0x01C0, category='lo', description='LATIN LETTER DENTAL CLICK' }, + [0x01C1] = { unicodeslot=0x01C1, category='lo', description='LATIN LETTER LATERAL CLICK' }, + [0x01C2] = { unicodeslot=0x01C2, category='lo', description='LATIN LETTER ALVEOLAR CLICK' }, + [0x01C3] = { unicodeslot=0x01C3, category='lo', description='LATIN LETTER RETROFLEX CLICK' }, + [0x01C4] = { unicodeslot=0x01C4, category='lu', contextname='DZcaronligature', description='LATIN CAPITAL LETTER DZ WITH CARON', shcode=0x01F1, uccode=0x01C5, lccode=0x01C6, specials={'compat',0x0044,0x017D} }, + [0x01C5] = { unicodeslot=0x01C5, category='lt', contextname='Dzcaronligature', description='LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON', shcode=0x01F2, uccode=0x01C4, lccode=0x01C6, specials={'compat',0x0044,0x017E} }, + [0x01C6] = { unicodeslot=0x01C6, category='ll', contextname='dzcaronligature', description='LATIN SMALL LETTER DZ WITH CARON', shcode=0x01F3, uccode=0x01C4, specials={'compat',0x0064,0x017E} }, + [0x01C7] = { unicodeslot=0x01C7, category='lu', contextname='LJligature', description='LATIN CAPITAL LETTER LJ', uccode=0x01C8, lccode=0x01C9, specials={'compat',0x004C,0x004A} }, + [0x01C8] = { unicodeslot=0x01C8, category='lt', contextname='Ljligature', description='LATIN CAPITAL LETTER L WITH SMALL LETTER J', shcode=0x004C, uccode=0x01C7, lccode=0x01C9, specials={'compat',0x004C,0x006A} }, + [0x01C9] = { unicodeslot=0x01C9, category='ll', contextname='ljligature', description='LATIN SMALL LETTER LJ', uccode=0x01C7, specials={'compat',0x006C,0x006A} }, + [0x01CA] = { unicodeslot=0x01CA, category='lu', contextname='NJligature', description='LATIN CAPITAL LETTER NJ', uccode=0x01CB, lccode=0x01CC, specials={'compat',0x004E,0x004A} }, + [0x01CB] = { unicodeslot=0x01CB, category='lt', contextname='Njligature', description='LATIN CAPITAL LETTER N WITH SMALL LETTER J', shcode=0x004E, uccode=0x01CA, lccode=0x01CC, specials={'compat',0x004E,0x006A} }, + [0x01CC] = { unicodeslot=0x01CC, category='ll', contextname='njligature', description='LATIN SMALL LETTER NJ', uccode=0x01CA, specials={'compat',0x006E,0x006A} }, + [0x01CD] = { unicodeslot=0x01CD, category='lu', contextname='Acaron', description='LATIN CAPITAL LETTER A WITH CARON', shcode=0x0041, lccode=0x01CE, specials={'char',0x0041,0x030C} }, + [0x01CE] = { unicodeslot=0x01CE, category='ll', contextname='acaron', description='LATIN SMALL LETTER A WITH CARON', shcode=0x0061, uccode=0x01CD, specials={'char',0x0061,0x030C} }, + [0x01CF] = { unicodeslot=0x01CF, category='lu', contextname='Icaron', description='LATIN CAPITAL LETTER I WITH CARON', shcode=0x0049, lccode=0x01D0, specials={'char',0x0049,0x030C} }, + [0x01D0] = { unicodeslot=0x01D0, category='ll', contextname='icaron', description='LATIN SMALL LETTER I WITH CARON', shcode=0x0069, uccode=0x01CF, specials={'char',0x0069,0x030C} }, + [0x01D1] = { unicodeslot=0x01D1, category='lu', contextname='Ocaron', description='LATIN CAPITAL LETTER O WITH CARON', shcode=0x004F, lccode=0x01D2, specials={'char',0x004F,0x030C} }, + [0x01D2] = { unicodeslot=0x01D2, category='ll', contextname='ocaron', description='LATIN SMALL LETTER O WITH CARON', shcode=0x006F, uccode=0x01D1, specials={'char',0x006F,0x030C} }, + [0x01D3] = { unicodeslot=0x01D3, category='lu', contextname='Ucaron', description='LATIN CAPITAL LETTER U WITH CARON', shcode=0x0055, lccode=0x01D4, specials={'char',0x0055,0x030C} }, + [0x01D4] = { unicodeslot=0x01D4, category='ll', contextname='ucaron', description='LATIN SMALL LETTER U WITH CARON', shcode=0x0075, uccode=0x01D3, specials={'char',0x0075,0x030C} }, + [0x01D5] = { unicodeslot=0x01D5, category='lu', contextname='Udiaeresismacron', description='LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON', shcode=0x0055, lccode=0x01D6, specials={'char',0x00DC,0x0304} }, + [0x01D6] = { unicodeslot=0x01D6, category='ll', contextname='udiaeresismacron', description='LATIN SMALL LETTER U WITH DIAERESIS AND MACRON', shcode=0x0075, uccode=0x01D5, specials={'char',0x00FC,0x0304} }, + [0x01D7] = { unicodeslot=0x01D7, category='lu', contextname='Udiaeresisacute', description='LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE', shcode=0x0055, lccode=0x01D8, specials={'char',0x00DC,0x0301} }, + [0x01D8] = { unicodeslot=0x01D8, category='ll', contextname='udiaeresisacute', description='LATIN SMALL LETTER U WITH DIAERESIS AND ACUTE', shcode=0x0075, uccode=0x01D7, specials={'char',0x00FC,0x0301} }, + [0x01D9] = { unicodeslot=0x01D9, category='lu', contextname='Udiaeresiscaron', description='LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON', shcode=0x0055, lccode=0x01DA, specials={'char',0x00DC,0x030C} }, + [0x01DA] = { unicodeslot=0x01DA, category='ll', contextname='udiaeresiscaron', description='LATIN SMALL LETTER U WITH DIAERESIS AND CARON', shcode=0x0075, uccode=0x01D9, specials={'char',0x00FC,0x030C} }, + [0x01DB] = { unicodeslot=0x01DB, category='lu', contextname='Udiaeresisgrave', description='LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE', shcode=0x0055, lccode=0x01DC, specials={'char',0x00DC,0x0300} }, + [0x01DC] = { unicodeslot=0x01DC, category='ll', contextname='udiaeresisgrave', description='LATIN SMALL LETTER U WITH DIAERESIS AND GRAVE', shcode=0x0075, uccode=0x01DB, specials={'char',0x00FC,0x0300} }, + [0x01DD] = { unicodeslot=0x01DD, category='ll', description='LATIN SMALL LETTER TURNED E', uccode=0x018E }, + [0x01DE] = { unicodeslot=0x01DE, category='lu', contextname='Adiaeresismacron', description='LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON', shcode=0x0041, lccode=0x01DF, specials={'char',0x00C4,0x0304} }, + [0x01DF] = { unicodeslot=0x01DF, category='ll', contextname='adiaeresismacron', description='LATIN SMALL LETTER A WITH DIAERESIS AND MACRON', shcode=0x0061, uccode=0x01DE, specials={'char',0x00E4,0x0304} }, + [0x01E0] = { unicodeslot=0x01E0, category='lu', contextname='Adotaccentmacron', description='LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON', shcode=0x0041, lccode=0x01E1, specials={'char',0x0226,0x0304} }, + [0x01E1] = { unicodeslot=0x01E1, category='ll', contextname='adotaccentmacron', description='LATIN SMALL LETTER A WITH DOT ABOVE AND MACRON', shcode=0x0061, uccode=0x01E0, specials={'char',0x0227,0x0304} }, + [0x01E2] = { unicodeslot=0x01E2, category='lu', contextname='AEmacron', description='LATIN CAPITAL LETTER AE WITH MACRON', shcode=0x00C6, lccode=0x01E3, specials={'char',0x00C6,0x0304} }, + [0x01E3] = { unicodeslot=0x01E3, category='ll', contextname='aemacron', description='LATIN SMALL LETTER AE WITH MACRON', shcode=0x00E6, uccode=0x01E2, specials={'char',0x00E6,0x0304} }, + [0x01E4] = { unicodeslot=0x01E4, category='lu', contextname='Gstroke', description='LATIN CAPITAL LETTER G WITH STROKE', shcode=0x0047, lccode=0x01E5 }, + [0x01E5] = { unicodeslot=0x01E5, category='ll', contextname='gstroke', description='LATIN SMALL LETTER G WITH STROKE', shcode=0x0067, uccode=0x01E4 }, + [0x01E6] = { unicodeslot=0x01E6, category='lu', adobename='Gcaron', contextname='Gcaron', description='LATIN CAPITAL LETTER G WITH CARON', shcode=0x0047, lccode=0x01E7, specials={'char',0x0047,0x030C} }, + [0x01E7] = { unicodeslot=0x01E7, category='ll', adobename='gcaron', contextname='gcaron', description='LATIN SMALL LETTER G WITH CARON', shcode=0x0067, uccode=0x01E6, specials={'char',0x0067,0x030C} }, + [0x01E8] = { unicodeslot=0x01E8, category='lu', contextname='Kcaron', description='LATIN CAPITAL LETTER K WITH CARON', shcode=0x004B, lccode=0x01E9, specials={'char',0x004B,0x030C} }, + [0x01E9] = { unicodeslot=0x01E9, category='ll', contextname='kcaron', description='LATIN SMALL LETTER K WITH CARON', shcode=0x006B, uccode=0x01E8, specials={'char',0x006B,0x030C} }, + [0x01EA] = { unicodeslot=0x01EA, category='lu', contextname='Oogonek', description='LATIN CAPITAL LETTER O WITH OGONEK', shcode=0x004F, lccode=0x01EB, specials={'char',0x004F,0x0328} }, + [0x01EB] = { unicodeslot=0x01EB, category='ll', contextname='oogonek', description='LATIN SMALL LETTER O WITH OGONEK', shcode=0x006F, uccode=0x01EA, specials={'char',0x006F,0x0328} }, + [0x01EC] = { unicodeslot=0x01EC, category='lu', contextname='Oogonekmacron', description='LATIN CAPITAL LETTER O WITH OGONEK AND MACRON', shcode=0x004F, lccode=0x01ED, specials={'char',0x01EA,0x0304} }, + [0x01ED] = { unicodeslot=0x01ED, category='ll', contextname='oogonekmacron', description='LATIN SMALL LETTER O WITH OGONEK AND MACRON', shcode=0x006F, uccode=0x01EC, specials={'char',0x01EB,0x0304} }, + [0x01EE] = { unicodeslot=0x01EE, category='lu', description='LATIN CAPITAL LETTER EZH WITH CARON', shcode=0x01B7, lccode=0x01EF, specials={'char',0x01B7,0x030C} }, + [0x01EF] = { unicodeslot=0x01EF, category='ll', description='LATIN SMALL LETTER EZH WITH CARON', shcode=0x0292, uccode=0x01EE, specials={'char',0x0292,0x030C} }, + [0x01F0] = { unicodeslot=0x01F0, category='ll', contextname='jcaron', description='LATIN SMALL LETTER J WITH CARON', shcode=0x006A, specials={'char',0x006A,0x030C} }, + [0x01F1] = { unicodeslot=0x01F1, category='lu', contextname='DZligature', description='LATIN CAPITAL LETTER DZ', uccode=0x01F2, lccode=0x01F3, specials={'compat',0x0044,0x005A} }, + [0x01F2] = { unicodeslot=0x01F2, category='lt', contextname='Dzligature', description='LATIN CAPITAL LETTER D WITH SMALL LETTER Z', shcode=0x0044, uccode=0x01F1, lccode=0x01F3, specials={'compat',0x0044,0x007A} }, + [0x01F3] = { unicodeslot=0x01F3, category='ll', contextname='dzligature', description='LATIN SMALL LETTER DZ', uccode=0x01F1, specials={'compat',0x0064,0x007A} }, + [0x01F4] = { unicodeslot=0x01F4, category='lu', contextname='Gacute', description='LATIN CAPITAL LETTER G WITH ACUTE', shcode=0x0047, lccode=0x01F5, specials={'char',0x0047,0x0301} }, + [0x01F5] = { unicodeslot=0x01F5, category='ll', contextname='gacute', description='LATIN SMALL LETTER G WITH ACUTE', shcode=0x0067, uccode=0x01F4, specials={'char',0x0067,0x0301} }, + [0x01F6] = { unicodeslot=0x01F6, category='lu', description='LATIN CAPITAL LETTER HWAIR', lccode=0x0195 }, + [0x01F7] = { unicodeslot=0x01F7, category='lu', description='LATIN CAPITAL LETTER WYNN', lccode=0x01BF }, + [0x01F8] = { unicodeslot=0x01F8, category='lu', contextname='Ngrave', description='LATIN CAPITAL LETTER N WITH GRAVE', shcode=0x004E, lccode=0x01F9, specials={'char',0x004E,0x0300} }, + [0x01F9] = { unicodeslot=0x01F9, category='ll', contextname='ngrave', description='LATIN SMALL LETTER N WITH GRAVE', shcode=0x006E, uccode=0x01F8, specials={'char',0x006E,0x0300} }, + [0x01FA] = { unicodeslot=0x01FA, category='lu', adobename='Aringacute', contextname='Aringacute', description='LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE', shcode=0x0041, lccode=0x01FB, specials={'char',0x00C5,0x0301} }, + [0x01FB] = { unicodeslot=0x01FB, category='ll', adobename='aringacute', contextname='aringacute', description='LATIN SMALL LETTER A WITH RING ABOVE AND ACUTE', shcode=0x0061, uccode=0x01FA, specials={'char',0x00E5,0x0301} }, + [0x01FC] = { unicodeslot=0x01FC, category='lu', adobename='AEacute', contextname='AEacute', description='LATIN CAPITAL LETTER AE WITH ACUTE', shcode=0x00C6, lccode=0x01FD, specials={'char',0x00C6,0x0301} }, + [0x01FD] = { unicodeslot=0x01FD, category='ll', adobename='aeacute', contextname='aeacute', description='LATIN SMALL LETTER AE WITH ACUTE', shcode=0x00E6, uccode=0x01FC, specials={'char',0x00E6,0x0301} }, + [0x01FE] = { unicodeslot=0x01FE, category='lu', adobename='Oslashacute', contextname='Ostrokeacute', description='LATIN CAPITAL LETTER O WITH STROKE AND ACUTE', shcode=0x004F, lccode=0x01FF, specials={'char',0x00D8,0x0301} }, + [0x01FF] = { unicodeslot=0x01FF, category='ll', adobename='oslashacute', contextname='ostrokeacute', description='LATIN SMALL LETTER O WITH STROKE AND ACUTE', shcode=0x006F, uccode=0x01FE, specials={'char',0x00F8,0x0301} }, + [0x0200] = { unicodeslot=0x0200, category='lu', contextname='Adoublegrave', description='LATIN CAPITAL LETTER A WITH DOUBLE GRAVE', shcode=0x0041, lccode=0x0201, specials={'char',0x0041,0x030F} }, + [0x0201] = { unicodeslot=0x0201, category='ll', contextname='adoublegrave', description='LATIN SMALL LETTER A WITH DOUBLE GRAVE', shcode=0x0061, uccode=0x0200, specials={'char',0x0061,0x030F} }, + [0x0202] = { unicodeslot=0x0202, category='lu', contextname='Ainvertedbreve', description='LATIN CAPITAL LETTER A WITH INVERTED BREVE', shcode=0x0041, lccode=0x0203, specials={'char',0x0041,0x0311} }, + [0x0203] = { unicodeslot=0x0203, category='ll', contextname='ainvertedbreve', description='LATIN SMALL LETTER A WITH INVERTED BREVE', shcode=0x0061, uccode=0x0202, specials={'char',0x0061,0x0311} }, + [0x0204] = { unicodeslot=0x0204, category='lu', contextname='Edoublegrave', description='LATIN CAPITAL LETTER E WITH DOUBLE GRAVE', shcode=0x0045, lccode=0x0205, specials={'char',0x0045,0x030F} }, + [0x0205] = { unicodeslot=0x0205, category='ll', contextname='edoublegrave', description='LATIN SMALL LETTER E WITH DOUBLE GRAVE', shcode=0x0065, uccode=0x0204, specials={'char',0x0065,0x030F} }, + [0x0206] = { unicodeslot=0x0206, category='lu', contextname='Einvertedbreve', description='LATIN CAPITAL LETTER E WITH INVERTED BREVE', shcode=0x0045, lccode=0x0207, specials={'char',0x0045,0x0311} }, + [0x0207] = { unicodeslot=0x0207, category='ll', contextname='einvertedbreve', description='LATIN SMALL LETTER E WITH INVERTED BREVE', shcode=0x0065, uccode=0x0206, specials={'char',0x0065,0x0311} }, + [0x0208] = { unicodeslot=0x0208, category='lu', contextname='Idoublegrave', description='LATIN CAPITAL LETTER I WITH DOUBLE GRAVE', shcode=0x0049, lccode=0x0209, specials={'char',0x0049,0x030F} }, + [0x0209] = { unicodeslot=0x0209, category='ll', contextname='idoublegrave', description='LATIN SMALL LETTER I WITH DOUBLE GRAVE', shcode=0x0069, uccode=0x0208, specials={'char',0x0069,0x030F} }, + [0x020A] = { unicodeslot=0x020A, category='lu', contextname='Iinvertedbreve', description='LATIN CAPITAL LETTER I WITH INVERTED BREVE', shcode=0x0049, lccode=0x020B, specials={'char',0x0049,0x0311} }, + [0x020B] = { unicodeslot=0x020B, category='ll', contextname='iinvertedbreve', description='LATIN SMALL LETTER I WITH INVERTED BREVE', shcode=0x0069, uccode=0x020A, specials={'char',0x0069,0x0311} }, + [0x020C] = { unicodeslot=0x020C, category='lu', contextname='Odoublegrave', description='LATIN CAPITAL LETTER O WITH DOUBLE GRAVE', shcode=0x004F, lccode=0x020D, specials={'char',0x004F,0x030F} }, + [0x020D] = { unicodeslot=0x020D, category='ll', contextname='odoublegrave', description='LATIN SMALL LETTER O WITH DOUBLE GRAVE', shcode=0x006F, uccode=0x020C, specials={'char',0x006F,0x030F} }, + [0x020E] = { unicodeslot=0x020E, category='lu', contextname='Oinvertedbreve', description='LATIN CAPITAL LETTER O WITH INVERTED BREVE', shcode=0x004F, lccode=0x020F, specials={'char',0x004F,0x0311} }, + [0x020F] = { unicodeslot=0x020F, category='ll', contextname='oinvertedbreve', description='LATIN SMALL LETTER O WITH INVERTED BREVE', shcode=0x006F, uccode=0x020E, specials={'char',0x006F,0x0311} }, + [0x0210] = { unicodeslot=0x0210, category='lu', contextname='Rdoublegrave', description='LATIN CAPITAL LETTER R WITH DOUBLE GRAVE', shcode=0x0052, lccode=0x0211, specials={'char',0x0052,0x030F} }, + [0x0211] = { unicodeslot=0x0211, category='ll', contextname='rdoublegrave', description='LATIN SMALL LETTER R WITH DOUBLE GRAVE', shcode=0x0072, uccode=0x0210, specials={'char',0x0072,0x030F} }, + [0x0212] = { unicodeslot=0x0212, category='lu', contextname='Rinvertedbreve', description='LATIN CAPITAL LETTER R WITH INVERTED BREVE', shcode=0x0052, lccode=0x0213, specials={'char',0x0052,0x0311} }, + [0x0213] = { unicodeslot=0x0213, category='ll', contextname='rinvertedbreve', description='LATIN SMALL LETTER R WITH INVERTED BREVE', shcode=0x0072, uccode=0x0212, specials={'char',0x0072,0x0311} }, + [0x0214] = { unicodeslot=0x0214, category='lu', contextname='Udoublegrave', description='LATIN CAPITAL LETTER U WITH DOUBLE GRAVE', shcode=0x0055, lccode=0x0215, specials={'char',0x0055,0x030F} }, + [0x0215] = { unicodeslot=0x0215, category='ll', contextname='udoublegrave', description='LATIN SMALL LETTER U WITH DOUBLE GRAVE', shcode=0x0075, uccode=0x0214, specials={'char',0x0075,0x030F} }, + [0x0216] = { unicodeslot=0x0216, category='lu', contextname='Uinvertedbreve', description='LATIN CAPITAL LETTER U WITH INVERTED BREVE', shcode=0x0055, lccode=0x0217, specials={'char',0x0055,0x0311} }, + [0x0217] = { unicodeslot=0x0217, category='ll', contextname='uinvertedbreve', description='LATIN SMALL LETTER U WITH INVERTED BREVE', shcode=0x0075, uccode=0x0216, specials={'char',0x0075,0x0311} }, + [0x0218] = { unicodeslot=0x0218, category='lu', adobename='Scommaaccent', contextname='Scommaaccent', description='LATIN CAPITAL LETTER S WITH COMMA BELOW', shcode=0x0053, lccode=0x0219, specials={'char',0x0053,0x0326} }, + [0x0219] = { unicodeslot=0x0219, category='ll', adobename='scommaaccent', contextname='scommaaccent', description='LATIN SMALL LETTER S WITH COMMA BELOW', shcode=0x0073, uccode=0x0218, specials={'char',0x0073,0x0326} }, + [0x021A] = { unicodeslot=0x021A, category='lu', contextname='Tcommaaccent', description='LATIN CAPITAL LETTER T WITH COMMA BELOW', shcode=0x0054, lccode=0x021B, specials={'char',0x0054,0x0326} }, + [0x021B] = { unicodeslot=0x021B, category='ll', contextname='tcommaaccent', description='LATIN SMALL LETTER T WITH COMMA BELOW', shcode=0x0074, uccode=0x021A, specials={'char',0x0074,0x0326} }, + [0x021C] = { unicodeslot=0x021C, category='lu', description='LATIN CAPITAL LETTER YOGH', lccode=0x021D }, + [0x021D] = { unicodeslot=0x021D, category='ll', description='LATIN SMALL LETTER YOGH', uccode=0x021C }, + [0x021E] = { unicodeslot=0x021E, category='lu', contextname='Hcaron', description='LATIN CAPITAL LETTER H WITH CARON', shcode=0x0048, lccode=0x021F, specials={'char',0x0048,0x030C} }, + [0x021F] = { unicodeslot=0x021F, category='ll', contextname='hcaron', description='LATIN SMALL LETTER H WITH CARON', shcode=0x0068, uccode=0x021E, specials={'char',0x0068,0x030C} }, + [0x0220] = { unicodeslot=0x0220, category='lu', description='LATIN CAPITAL LETTER N WITH LONG RIGHT LEG', shcode=0x004E, lccode=0x019E }, + [0x0221] = { unicodeslot=0x0221, category='ll', contextname='dcurl', description='LATIN SMALL LETTER D WITH CURL', shcode=0x0064 }, + [0x0222] = { unicodeslot=0x0222, category='lu', description='LATIN CAPITAL LETTER OU', lccode=0x0223 }, + [0x0223] = { unicodeslot=0x0223, category='ll', description='LATIN SMALL LETTER OU', uccode=0x0222 }, + [0x0224] = { unicodeslot=0x0224, category='lu', contextname='Zhook', description='LATIN CAPITAL LETTER Z WITH HOOK', shcode=0x005A, lccode=0x0225 }, + [0x0225] = { unicodeslot=0x0225, category='ll', contextname='zhook', description='LATIN SMALL LETTER Z WITH HOOK', shcode=0x007A, uccode=0x0224 }, + [0x0226] = { unicodeslot=0x0226, category='lu', contextname='Adotaccent', description='LATIN CAPITAL LETTER A WITH DOT ABOVE', shcode=0x0041, lccode=0x0227, specials={'char',0x0041,0x0307} }, + [0x0227] = { unicodeslot=0x0227, category='ll', contextname='adotaccent', description='LATIN SMALL LETTER A WITH DOT ABOVE', shcode=0x0061, uccode=0x0226, specials={'char',0x0061,0x0307} }, + [0x0228] = { unicodeslot=0x0228, category='lu', contextname='Ecedilla', description='LATIN CAPITAL LETTER E WITH CEDILLA', shcode=0x0045, lccode=0x0229, specials={'char',0x0045,0x0327} }, + [0x0229] = { unicodeslot=0x0229, category='ll', contextname='ecedilla', description='LATIN SMALL LETTER E WITH CEDILLA', shcode=0x0065, uccode=0x0228, specials={'char',0x0065,0x0327} }, + [0x022A] = { unicodeslot=0x022A, category='lu', contextname='Odiaeresismacron', description='LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON', shcode=0x004F, lccode=0x022B, specials={'char',0x00D6,0x0304} }, + [0x022B] = { unicodeslot=0x022B, category='ll', contextname='odiaeresismacron', description='LATIN SMALL LETTER O WITH DIAERESIS AND MACRON', shcode=0x006F, uccode=0x022A, specials={'char',0x00F6,0x0304} }, + [0x022C] = { unicodeslot=0x022C, category='lu', contextname='Otildemacron', description='LATIN CAPITAL LETTER O WITH TILDE AND MACRON', shcode=0x004F, lccode=0x022D, specials={'char',0x00D5,0x0304} }, + [0x022D] = { unicodeslot=0x022D, category='ll', contextname='otildemacron', description='LATIN SMALL LETTER O WITH TILDE AND MACRON', shcode=0x006F, uccode=0x022C, specials={'char',0x00F5,0x0304} }, + [0x022E] = { unicodeslot=0x022E, category='lu', contextname='Odotaccent', description='LATIN CAPITAL LETTER O WITH DOT ABOVE', shcode=0x004F, lccode=0x022F, specials={'char',0x004F,0x0307} }, + [0x022F] = { unicodeslot=0x022F, category='ll', contextname='odotaccent', description='LATIN SMALL LETTER O WITH DOT ABOVE', shcode=0x006F, uccode=0x022E, specials={'char',0x006F,0x0307} }, + [0x0230] = { unicodeslot=0x0230, category='lu', contextname='Odotaccentmacron', description='LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON', shcode=0x004F, lccode=0x0231, specials={'char',0x022E,0x0304} }, + [0x0231] = { unicodeslot=0x0231, category='ll', contextname='odotaccentmacron', description='LATIN SMALL LETTER O WITH DOT ABOVE AND MACRON', shcode=0x006F, uccode=0x0230, specials={'char',0x022F,0x0304} }, + [0x0232] = { unicodeslot=0x0232, category='lu', contextname='Ymacron', description='LATIN CAPITAL LETTER Y WITH MACRON', shcode=0x0059, lccode=0x0233, specials={'char',0x0059,0x0304} }, + [0x0233] = { unicodeslot=0x0233, category='ll', contextname='ymacron', description='LATIN SMALL LETTER Y WITH MACRON', shcode=0x0079, uccode=0x0232, specials={'char',0x0079,0x0304} }, + [0x0234] = { unicodeslot=0x0234, category='ll', contextname='lcurl', description='LATIN SMALL LETTER L WITH CURL', shcode=0x006C }, + [0x0235] = { unicodeslot=0x0235, category='ll', contextname='ncurl', description='LATIN SMALL LETTER N WITH CURL', shcode=0x006E }, + [0x0236] = { unicodeslot=0x0236, category='ll', contextname='tcurl', description='LATIN SMALL LETTER T WITH CURL', shcode=0x0074 }, + [0x0237] = { unicodeslot=0x0237, category='ll', contextname='dotlessj', description='LATIN SMALL LETTER DOTLESS J' }, + [0x0238] = { unicodeslot=0x0238, category='ll', description='LATIN SMALL LETTER DB DIGRAPH' }, + [0x0239] = { unicodeslot=0x0239, category='ll', description='LATIN SMALL LETTER QP DIGRAPH' }, + [0x023A] = { unicodeslot=0x023A, category='lu', contextname='Astroke', description='LATIN CAPITAL LETTER A WITH STROKE', shcode=0x0041, lccode=0x2C65 }, + [0x023B] = { unicodeslot=0x023B, category='lu', contextname='Cstroke', description='LATIN CAPITAL LETTER C WITH STROKE', shcode=0x0043, lccode=0x023C }, + [0x023C] = { unicodeslot=0x023C, category='ll', contextname='cstroke', description='LATIN SMALL LETTER C WITH STROKE', shcode=0x0063, uccode=0x023B }, + [0x023D] = { unicodeslot=0x023D, category='lu', contextname='Lbar', description='LATIN CAPITAL LETTER L WITH BAR', shcode=0x004C, lccode=0x019A }, + [0x023E] = { unicodeslot=0x023E, category='lu', description='LATIN CAPITAL LETTER T WITH DIAGONAL STROKE', shcode=0x0054, lccode=0x2C66 }, + [0x023F] = { unicodeslot=0x023F, category='ll', description='LATIN SMALL LETTER S WITH SWASH TAIL', shcode=0x0073 }, + [0x0240] = { unicodeslot=0x0240, category='ll', description='LATIN SMALL LETTER Z WITH SWASH TAIL', shcode=0x007A }, + [0x0241] = { unicodeslot=0x0241, category='lu', description='LATIN CAPITAL LETTER GLOTTAL STOP', lccode=0x0242 }, + [0x0242] = { unicodeslot=0x0242, category='ll', description='LATIN SMALL LETTER GLOTTAL STOP', uccode=0x0241 }, + [0x0243] = { unicodeslot=0x0243, category='lu', description='LATIN CAPITAL LETTER B WITH STROKE', shcode=0x0042, lccode=0x0180 }, + [0x0244] = { unicodeslot=0x0244, category='lu', description='LATIN CAPITAL LETTER U BAR', lccode=0x0289 }, + [0x0245] = { unicodeslot=0x0245, category='lu', description='LATIN CAPITAL LETTER TURNED V', lccode=0x028C }, + [0x0246] = { unicodeslot=0x0246, category='lu', description='LATIN CAPITAL LETTER E WITH STROKE', shcode=0x0045, lccode=0x0247 }, + [0x0247] = { unicodeslot=0x0247, category='ll', description='LATIN SMALL LETTER E WITH STROKE', shcode=0x0065, uccode=0x0246 }, + [0x0248] = { unicodeslot=0x0248, category='lu', description='LATIN CAPITAL LETTER J WITH STROKE', shcode=0x004A, lccode=0x0249 }, + [0x0249] = { unicodeslot=0x0249, category='ll', description='LATIN SMALL LETTER J WITH STROKE', shcode=0x006A, uccode=0x0248 }, + [0x024A] = { unicodeslot=0x024A, category='lu', description='LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL', lccode=0x024B }, + [0x024B] = { unicodeslot=0x024B, category='ll', description='LATIN SMALL LETTER Q WITH HOOK TAIL', shcode=0x0071, uccode=0x024A }, + [0x024C] = { unicodeslot=0x024C, category='lu', description='LATIN CAPITAL LETTER R WITH STROKE', shcode=0x0052, lccode=0x024D }, + [0x024D] = { unicodeslot=0x024D, category='ll', description='LATIN SMALL LETTER R WITH STROKE', shcode=0x0072, uccode=0x024C }, + [0x024E] = { unicodeslot=0x024E, category='lu', description='LATIN CAPITAL LETTER Y WITH STROKE', shcode=0x0059, lccode=0x024F }, + [0x024F] = { unicodeslot=0x024F, category='ll', description='LATIN SMALL LETTER Y WITH STROKE', shcode=0x0079, uccode=0x024E }, + [0x0250] = { unicodeslot=0x0250, category='ll', description='LATIN SMALL LETTER TURNED A' }, + [0x0251] = { unicodeslot=0x0251, category='ll', description='LATIN SMALL LETTER ALPHA' }, + [0x0252] = { unicodeslot=0x0252, category='ll', description='LATIN SMALL LETTER TURNED ALPHA' }, + [0x0253] = { unicodeslot=0x0253, category='ll', contextname='bhook', description='LATIN SMALL LETTER B WITH HOOK', shcode=0x0062, uccode=0x0181 }, + [0x0254] = { unicodeslot=0x0254, category='ll', description='LATIN SMALL LETTER OPEN O', uccode=0x0186 }, + [0x0255] = { unicodeslot=0x0255, category='ll', contextname='ccurl', description='LATIN SMALL LETTER C WITH CURL', shcode=0x0063 }, + [0x0256] = { unicodeslot=0x0256, category='ll', contextname='dtail', description='LATIN SMALL LETTER D WITH TAIL', shcode=0x0064, uccode=0x0189 }, + [0x0257] = { unicodeslot=0x0257, category='ll', contextname='dhook', description='LATIN SMALL LETTER D WITH HOOK', shcode=0x0064, uccode=0x018A }, + [0x0258] = { unicodeslot=0x0258, category='ll', description='LATIN SMALL LETTER REVERSED E' }, + [0x0259] = { unicodeslot=0x0259, category='ll', contextname='schwa', description='LATIN SMALL LETTER SCHWA', uccode=0x018F }, + [0x025A] = { unicodeslot=0x025A, category='ll', contextname='schwahook', description='LATIN SMALL LETTER SCHWA WITH HOOK', shcode=0x0259 }, + [0x025B] = { unicodeslot=0x025B, category='ll', description='LATIN SMALL LETTER OPEN E', uccode=0x0190 }, + [0x025C] = { unicodeslot=0x025C, category='ll', description='LATIN SMALL LETTER REVERSED OPEN E' }, + [0x025D] = { unicodeslot=0x025D, category='ll', description='LATIN SMALL LETTER REVERSED OPEN E WITH HOOK' }, + [0x025E] = { unicodeslot=0x025E, category='ll', description='LATIN SMALL LETTER CLOSED REVERSED OPEN E' }, + [0x025F] = { unicodeslot=0x025F, category='ll', contextname='dotlessjstroke', description='LATIN SMALL LETTER DOTLESS J WITH STROKE' }, + [0x0260] = { unicodeslot=0x0260, category='ll', description='LATIN SMALL LETTER G WITH HOOK', shcode=0x0067, uccode=0x0193 }, + [0x0261] = { unicodeslot=0x0261, category='ll', description='LATIN SMALL LETTER SCRIPT G' }, + [0x0262] = { unicodeslot=0x0262, category='ll', description='LATIN LETTER SMALL CAPITAL G' }, + [0x0263] = { unicodeslot=0x0263, category='ll', description='LATIN SMALL LETTER GAMMA', uccode=0x0194 }, + [0x0264] = { unicodeslot=0x0264, category='ll', description='LATIN SMALL LETTER RAMS HORN' }, + [0x0265] = { unicodeslot=0x0265, category='ll', description='LATIN SMALL LETTER TURNED H' }, + [0x0266] = { unicodeslot=0x0266, category='ll', description='LATIN SMALL LETTER H WITH HOOK', shcode=0x0068 }, + [0x0267] = { unicodeslot=0x0267, category='ll', description='LATIN SMALL LETTER HENG WITH HOOK' }, + [0x0268] = { unicodeslot=0x0268, category='ll', description='LATIN SMALL LETTER I WITH STROKE', shcode=0x0069, uccode=0x0197 }, + [0x0269] = { unicodeslot=0x0269, category='ll', description='LATIN SMALL LETTER IOTA', uccode=0x0196 }, + [0x026A] = { unicodeslot=0x026A, category='ll', description='LATIN LETTER SMALL CAPITAL I' }, + [0x026B] = { unicodeslot=0x026B, category='ll', description='LATIN SMALL LETTER L WITH MIDDLE TILDE', shcode=0x006C, uccode=0x2C62 }, + [0x026C] = { unicodeslot=0x026C, category='ll', description='LATIN SMALL LETTER L WITH BELT', shcode=0x006C }, + [0x026D] = { unicodeslot=0x026D, category='ll', description='LATIN SMALL LETTER L WITH RETROFLEX HOOK', shcode=0x006C }, + [0x026E] = { unicodeslot=0x026E, category='ll', description='LATIN SMALL LETTER LEZH' }, + [0x026F] = { unicodeslot=0x026F, category='ll', description='LATIN SMALL LETTER TURNED M', uccode=0x019C }, + [0x0270] = { unicodeslot=0x0270, category='ll', description='LATIN SMALL LETTER TURNED M WITH LONG LEG' }, + [0x0271] = { unicodeslot=0x0271, category='ll', description='LATIN SMALL LETTER M WITH HOOK', shcode=0x006D }, + [0x0272] = { unicodeslot=0x0272, category='ll', description='LATIN SMALL LETTER N WITH LEFT HOOK', shcode=0x006E, uccode=0x019D }, + [0x0273] = { unicodeslot=0x0273, category='ll', description='LATIN SMALL LETTER N WITH RETROFLEX HOOK', shcode=0x006E }, + [0x0274] = { unicodeslot=0x0274, category='ll', description='LATIN LETTER SMALL CAPITAL N' }, + [0x0275] = { unicodeslot=0x0275, category='ll', description='LATIN SMALL LETTER BARRED O', uccode=0x019F }, + [0x0276] = { unicodeslot=0x0276, category='ll', description='LATIN LETTER SMALL CAPITAL OE' }, + [0x0277] = { unicodeslot=0x0277, category='ll', description='LATIN SMALL LETTER CLOSED OMEGA' }, + [0x0278] = { unicodeslot=0x0278, category='ll', description='LATIN SMALL LETTER PHI' }, + [0x0279] = { unicodeslot=0x0279, category='ll', description='LATIN SMALL LETTER TURNED R' }, + [0x027A] = { unicodeslot=0x027A, category='ll', description='LATIN SMALL LETTER TURNED R WITH LONG LEG' }, + [0x027B] = { unicodeslot=0x027B, category='ll', description='LATIN SMALL LETTER TURNED R WITH HOOK' }, + [0x027C] = { unicodeslot=0x027C, category='ll', description='LATIN SMALL LETTER R WITH LONG LEG', shcode=0x0072 }, + [0x027D] = { unicodeslot=0x027D, category='ll', description='LATIN SMALL LETTER R WITH TAIL', shcode=0x0072, uccode=0x2C64 }, + [0x027E] = { unicodeslot=0x027E, category='ll', description='LATIN SMALL LETTER R WITH FISHHOOK', shcode=0x0072 }, + [0x027F] = { unicodeslot=0x027F, category='ll', description='LATIN SMALL LETTER REVERSED R WITH FISHHOOK' }, + [0x0280] = { unicodeslot=0x0280, category='ll', description='LATIN LETTER SMALL CAPITAL R', uccode=0x01A6 }, + [0x0281] = { unicodeslot=0x0281, category='ll', description='LATIN LETTER SMALL CAPITAL INVERTED R' }, + [0x0282] = { unicodeslot=0x0282, category='ll', description='LATIN SMALL LETTER S WITH HOOK', shcode=0x0073 }, + [0x0283] = { unicodeslot=0x0283, category='ll', description='LATIN SMALL LETTER ESH', uccode=0x01A9 }, + [0x0284] = { unicodeslot=0x0284, category='ll', description='LATIN SMALL LETTER DOTLESS J WITH STROKE AND HOOK' }, + [0x0285] = { unicodeslot=0x0285, category='ll', description='LATIN SMALL LETTER SQUAT REVERSED ESH' }, + [0x0286] = { unicodeslot=0x0286, category='ll', description='LATIN SMALL LETTER ESH WITH CURL', shcode=0x0283 }, + [0x0287] = { unicodeslot=0x0287, category='ll', description='LATIN SMALL LETTER TURNED T' }, + [0x0288] = { unicodeslot=0x0288, category='ll', description='LATIN SMALL LETTER T WITH RETROFLEX HOOK', shcode=0x0074, uccode=0x01AE }, + [0x0289] = { unicodeslot=0x0289, category='ll', description='LATIN SMALL LETTER U BAR', uccode=0x0244 }, + [0x028A] = { unicodeslot=0x028A, category='ll', description='LATIN SMALL LETTER UPSILON', uccode=0x01B1 }, + [0x028B] = { unicodeslot=0x028B, category='ll', description='LATIN SMALL LETTER V WITH HOOK', shcode=0x0076, uccode=0x01B2 }, + [0x028C] = { unicodeslot=0x028C, category='ll', description='LATIN SMALL LETTER TURNED V', uccode=0x0245 }, + [0x028D] = { unicodeslot=0x028D, category='ll', description='LATIN SMALL LETTER TURNED W' }, + [0x028E] = { unicodeslot=0x028E, category='ll', description='LATIN SMALL LETTER TURNED Y' }, + [0x028F] = { unicodeslot=0x028F, category='ll', description='LATIN LETTER SMALL CAPITAL Y' }, + [0x0290] = { unicodeslot=0x0290, category='ll', description='LATIN SMALL LETTER Z WITH RETROFLEX HOOK', shcode=0x007A }, + [0x0291] = { unicodeslot=0x0291, category='ll', description='LATIN SMALL LETTER Z WITH CURL', shcode=0x007A }, + [0x0292] = { unicodeslot=0x0292, category='ll', description='LATIN SMALL LETTER EZH', uccode=0x01B7 }, + [0x0293] = { unicodeslot=0x0293, category='ll', description='LATIN SMALL LETTER EZH WITH CURL', shcode=0x0292 }, + [0x0294] = { unicodeslot=0x0294, category='lo', description='LATIN LETTER GLOTTAL STOP' }, + [0x0295] = { unicodeslot=0x0295, category='ll', description='LATIN LETTER PHARYNGEAL VOICED FRICATIVE' }, + [0x0296] = { unicodeslot=0x0296, category='ll', description='LATIN LETTER INVERTED GLOTTAL STOP' }, + [0x0297] = { unicodeslot=0x0297, category='ll', description='LATIN LETTER STRETCHED C' }, + [0x0298] = { unicodeslot=0x0298, category='ll', description='LATIN LETTER BILABIAL CLICK' }, + [0x0299] = { unicodeslot=0x0299, category='ll', description='LATIN LETTER SMALL CAPITAL B' }, + [0x029A] = { unicodeslot=0x029A, category='ll', description='LATIN SMALL LETTER CLOSED OPEN E' }, + [0x029B] = { unicodeslot=0x029B, category='ll', description='LATIN LETTER SMALL CAPITAL G WITH HOOK' }, + [0x029C] = { unicodeslot=0x029C, category='ll', description='LATIN LETTER SMALL CAPITAL H' }, + [0x029D] = { unicodeslot=0x029D, category='ll', description='LATIN SMALL LETTER J WITH CROSSED-TAIL', shcode=0x006A }, + [0x029E] = { unicodeslot=0x029E, category='ll', description='LATIN SMALL LETTER TURNED K' }, + [0x029F] = { unicodeslot=0x029F, category='ll', description='LATIN LETTER SMALL CAPITAL L' }, + [0x02A0] = { unicodeslot=0x02A0, category='ll', description='LATIN SMALL LETTER Q WITH HOOK', shcode=0x0071 }, + [0x02A1] = { unicodeslot=0x02A1, category='ll', description='LATIN LETTER GLOTTAL STOP WITH STROKE' }, + [0x02A2] = { unicodeslot=0x02A2, category='ll', description='LATIN LETTER REVERSED GLOTTAL STOP WITH STROKE' }, + [0x02A3] = { unicodeslot=0x02A3, category='ll', description='LATIN SMALL LETTER DZ DIGRAPH' }, + [0x02A4] = { unicodeslot=0x02A4, category='ll', description='LATIN SMALL LETTER DEZH DIGRAPH' }, + [0x02A5] = { unicodeslot=0x02A5, category='ll', description='LATIN SMALL LETTER DZ DIGRAPH WITH CURL' }, + [0x02A6] = { unicodeslot=0x02A6, category='ll', description='LATIN SMALL LETTER TS DIGRAPH' }, + [0x02A7] = { unicodeslot=0x02A7, category='ll', description='LATIN SMALL LETTER TESH DIGRAPH' }, + [0x02A8] = { unicodeslot=0x02A8, category='ll', description='LATIN SMALL LETTER TC DIGRAPH WITH CURL' }, + [0x02A9] = { unicodeslot=0x02A9, category='ll', description='LATIN SMALL LETTER FENG DIGRAPH' }, + [0x02AA] = { unicodeslot=0x02AA, category='ll', description='LATIN SMALL LETTER LS DIGRAPH' }, + [0x02AB] = { unicodeslot=0x02AB, category='ll', description='LATIN SMALL LETTER LZ DIGRAPH' }, + [0x02AC] = { unicodeslot=0x02AC, category='ll', description='LATIN LETTER BILABIAL PERCUSSIVE' }, + [0x02AD] = { unicodeslot=0x02AD, category='ll', description='LATIN LETTER BIDENTAL PERCUSSIVE' }, + [0x02AE] = { unicodeslot=0x02AE, category='ll', description='LATIN SMALL LETTER TURNED H WITH FISHHOOK' }, + [0x02AF] = { unicodeslot=0x02AF, category='ll', description='LATIN SMALL LETTER TURNED H WITH FISHHOOK AND TAIL' }, + [0x02B0] = { unicodeslot=0x02B0, category='lm', description='MODIFIER LETTER SMALL H', specials={'super',0x0068} }, + [0x02B1] = { unicodeslot=0x02B1, category='lm', description='MODIFIER LETTER SMALL H WITH HOOK', specials={'super',0x0266} }, + [0x02B2] = { unicodeslot=0x02B2, category='lm', description='MODIFIER LETTER SMALL J', specials={'super',0x006A} }, + [0x02B3] = { unicodeslot=0x02B3, category='lm', description='MODIFIER LETTER SMALL R', specials={'super',0x0072} }, + [0x02B4] = { unicodeslot=0x02B4, category='lm', description='MODIFIER LETTER SMALL TURNED R', specials={'super',0x0279} }, + [0x02B5] = { unicodeslot=0x02B5, category='lm', description='MODIFIER LETTER SMALL TURNED R WITH HOOK', specials={'super',0x027B} }, + [0x02B6] = { unicodeslot=0x02B6, category='lm', description='MODIFIER LETTER SMALL CAPITAL INVERTED R', specials={'super',0x0281} }, + [0x02B7] = { unicodeslot=0x02B7, category='lm', description='MODIFIER LETTER SMALL W', specials={'super',0x0077} }, + [0x02B8] = { unicodeslot=0x02B8, category='lm', description='MODIFIER LETTER SMALL Y', specials={'super',0x0079} }, + [0x02B9] = { unicodeslot=0x02B9, category='lm', description='MODIFIER LETTER PRIME' }, + [0x02BA] = { unicodeslot=0x02BA, category='lm', description='MODIFIER LETTER DOUBLE PRIME' }, + [0x02BB] = { unicodeslot=0x02BB, category='lm', description='MODIFIER LETTER TURNED COMMA' }, + [0x02BC] = { unicodeslot=0x02BC, category='lm', adobename='afii57929', description='MODIFIER LETTER APOSTROPHE' }, + [0x02BD] = { unicodeslot=0x02BD, category='lm', adobename='afii64937', description='MODIFIER LETTER REVERSED COMMA' }, + [0x02BE] = { unicodeslot=0x02BE, category='lm', description='MODIFIER LETTER RIGHT HALF RING' }, + [0x02BF] = { unicodeslot=0x02BF, category='lm', description='MODIFIER LETTER LEFT HALF RING' }, + [0x02C0] = { unicodeslot=0x02C0, category='lm', description='MODIFIER LETTER GLOTTAL STOP' }, + [0x02C1] = { unicodeslot=0x02C1, category='lm', description='MODIFIER LETTER REVERSED GLOTTAL STOP' }, + [0x02C2] = { unicodeslot=0x02C2, category='sk', description='MODIFIER LETTER LEFT ARROWHEAD' }, + [0x02C3] = { unicodeslot=0x02C3, category='sk', description='MODIFIER LETTER RIGHT ARROWHEAD' }, + [0x02C4] = { unicodeslot=0x02C4, category='sk', description='MODIFIER LETTER UP ARROWHEAD' }, + [0x02C5] = { unicodeslot=0x02C5, category='sk', description='MODIFIER LETTER DOWN ARROWHEAD' }, + [0x02C6] = { unicodeslot=0x02C6, category='lm', adobename='circumflex', contextname='textcircumflex', description='MODIFIER LETTER CIRCUMFLEX ACCENT' }, + [0x02C7] = { unicodeslot=0x02C7, category='lm', adobename='caron', contextname='textcaron', description='CARON' }, + [0x02C8] = { unicodeslot=0x02C8, category='lm', description='MODIFIER LETTER VERTICAL LINE' }, + [0x02C9] = { unicodeslot=0x02C9, category='lm', description='MODIFIER LETTER MACRON' }, + [0x02CA] = { unicodeslot=0x02CA, category='lm', description='MODIFIER LETTER ACUTE ACCENT' }, + [0x02CB] = { unicodeslot=0x02CB, category='lm', description='MODIFIER LETTER GRAVE ACCENT' }, + [0x02CC] = { unicodeslot=0x02CC, category='lm', description='MODIFIER LETTER LOW VERTICAL LINE' }, + [0x02CD] = { unicodeslot=0x02CD, category='lm', description='MODIFIER LETTER LOW MACRON' }, + [0x02CE] = { unicodeslot=0x02CE, category='lm', description='MODIFIER LETTER LOW GRAVE ACCENT' }, + [0x02CF] = { unicodeslot=0x02CF, category='lm', description='MODIFIER LETTER LOW ACUTE ACCENT' }, + [0x02D0] = { unicodeslot=0x02D0, category='lm', description='MODIFIER LETTER TRIANGULAR COLON' }, + [0x02D1] = { unicodeslot=0x02D1, category='lm', description='MODIFIER LETTER HALF TRIANGULAR COLON' }, + [0x02D2] = { unicodeslot=0x02D2, category='sk', description='MODIFIER LETTER CENTRED RIGHT HALF RING' }, + [0x02D3] = { unicodeslot=0x02D3, category='sk', description='MODIFIER LETTER CENTRED LEFT HALF RING' }, + [0x02D4] = { unicodeslot=0x02D4, category='sk', description='MODIFIER LETTER UP TACK' }, + [0x02D5] = { unicodeslot=0x02D5, category='sk', description='MODIFIER LETTER DOWN TACK' }, + [0x02D6] = { unicodeslot=0x02D6, category='sk', description='MODIFIER LETTER PLUS SIGN' }, + [0x02D7] = { unicodeslot=0x02D7, category='sk', description='MODIFIER LETTER MINUS SIGN' }, + [0x02D8] = { unicodeslot=0x02D8, category='sk', adobename='breve', contextname='textbreve', description='BREVE', specials={'compat',0x0020,0x0306} }, + [0x02D9] = { unicodeslot=0x02D9, category='sk', adobename='dotaccent', contextname='textdotaccent', description='DOT ABOVE', specials={'compat',0x0020,0x0307} }, + [0x02DA] = { unicodeslot=0x02DA, category='sk', adobename='ring', contextname='textring', description='RING ABOVE', specials={'compat',0x0020,0x030A} }, + [0x02DB] = { unicodeslot=0x02DB, category='sk', adobename='ogonek', contextname='textogonek', description='OGONEK', specials={'compat',0x0020,0x0328} }, + [0x02DC] = { unicodeslot=0x02DC, category='sk', adobename='tilde', contextname='texttilde', description='SMALL TILDE', specials={'compat',0x0020,0x0303} }, + [0x02DD] = { unicodeslot=0x02DD, category='sk', adobename='hungarumlaut', contextname='texthungarumlaut', description='DOUBLE ACUTE ACCENT', specials={'compat',0x0020,0x030B} }, + [0x02DE] = { unicodeslot=0x02DE, category='sk', description='MODIFIER LETTER RHOTIC HOOK' }, + [0x02DF] = { unicodeslot=0x02DF, category='sk', description='MODIFIER LETTER CROSS ACCENT' }, + [0x02E0] = { unicodeslot=0x02E0, category='lm', description='MODIFIER LETTER SMALL GAMMA', specials={'super',0x0263} }, + [0x02E1] = { unicodeslot=0x02E1, category='lm', description='MODIFIER LETTER SMALL L', specials={'super',0x006C} }, + [0x02E2] = { unicodeslot=0x02E2, category='lm', description='MODIFIER LETTER SMALL S', specials={'super',0x0073} }, + [0x02E3] = { unicodeslot=0x02E3, category='lm', description='MODIFIER LETTER SMALL X', specials={'super',0x0078} }, + [0x02E4] = { unicodeslot=0x02E4, category='lm', description='MODIFIER LETTER SMALL REVERSED GLOTTAL STOP', specials={'super',0x0295} }, + [0x02E5] = { unicodeslot=0x02E5, category='sk', description='MODIFIER LETTER EXTRA-HIGH TONE BAR' }, + [0x02E6] = { unicodeslot=0x02E6, category='sk', description='MODIFIER LETTER HIGH TONE BAR' }, + [0x02E7] = { unicodeslot=0x02E7, category='sk', description='MODIFIER LETTER MID TONE BAR' }, + [0x02E8] = { unicodeslot=0x02E8, category='sk', description='MODIFIER LETTER LOW TONE BAR' }, + [0x02E9] = { unicodeslot=0x02E9, category='sk', description='MODIFIER LETTER EXTRA-LOW TONE BAR' }, + [0x02EA] = { unicodeslot=0x02EA, category='sk', description='MODIFIER LETTER YIN DEPARTING TONE MARK' }, + [0x02EB] = { unicodeslot=0x02EB, category='sk', description='MODIFIER LETTER YANG DEPARTING TONE MARK' }, + [0x02EC] = { unicodeslot=0x02EC, category='sk', description='MODIFIER LETTER VOICING' }, + [0x02ED] = { unicodeslot=0x02ED, category='sk', description='MODIFIER LETTER UNASPIRATED' }, + [0x02EE] = { unicodeslot=0x02EE, category='lm', description='MODIFIER LETTER DOUBLE APOSTROPHE' }, + [0x02EF] = { unicodeslot=0x02EF, category='sk', description='MODIFIER LETTER LOW DOWN ARROWHEAD' }, + [0x02F0] = { unicodeslot=0x02F0, category='sk', description='MODIFIER LETTER LOW UP ARROWHEAD' }, + [0x02F1] = { unicodeslot=0x02F1, category='sk', description='MODIFIER LETTER LOW LEFT ARROWHEAD' }, + [0x02F2] = { unicodeslot=0x02F2, category='sk', description='MODIFIER LETTER LOW RIGHT ARROWHEAD' }, + [0x02F3] = { unicodeslot=0x02F3, category='sk', description='MODIFIER LETTER LOW RING' }, + [0x02F4] = { unicodeslot=0x02F4, category='sk', description='MODIFIER LETTER MIDDLE GRAVE ACCENT' }, + [0x02F5] = { unicodeslot=0x02F5, category='sk', description='MODIFIER LETTER MIDDLE DOUBLE GRAVE ACCENT' }, + [0x02F6] = { unicodeslot=0x02F6, category='sk', description='MODIFIER LETTER MIDDLE DOUBLE ACUTE ACCENT' }, + [0x02F7] = { unicodeslot=0x02F7, category='sk', description='MODIFIER LETTER LOW TILDE' }, + [0x02F8] = { unicodeslot=0x02F8, category='sk', description='MODIFIER LETTER RAISED COLON' }, + [0x02F9] = { unicodeslot=0x02F9, category='sk', description='MODIFIER LETTER BEGIN HIGH TONE' }, + [0x02FA] = { unicodeslot=0x02FA, category='sk', description='MODIFIER LETTER END HIGH TONE' }, + [0x02FB] = { unicodeslot=0x02FB, category='sk', description='MODIFIER LETTER BEGIN LOW TONE' }, + [0x02FC] = { unicodeslot=0x02FC, category='sk', description='MODIFIER LETTER END LOW TONE' }, + [0x02FD] = { unicodeslot=0x02FD, category='sk', description='MODIFIER LETTER SHELF' }, + [0x02FE] = { unicodeslot=0x02FE, category='sk', description='MODIFIER LETTER OPEN SHELF' }, + [0x02FF] = { unicodeslot=0x02FF, category='sk', description='MODIFIER LETTER LOW LEFT ARROW' }, + [0x0300] = { unicodeslot=0x0300, category='mn', adobename='gravecomb', description='COMBINING GRAVE ACCENT' }, + [0x0301] = { unicodeslot=0x0301, category='mn', adobename='acutecomb', description='COMBINING ACUTE ACCENT' }, + [0x0302] = { unicodeslot=0x0302, category='mn', description='COMBINING CIRCUMFLEX ACCENT' }, + [0x0303] = { unicodeslot=0x0303, category='mn', adobename='tildecomb', description='COMBINING TILDE' }, + [0x0304] = { unicodeslot=0x0304, category='mn', description='COMBINING MACRON' }, + [0x0305] = { unicodeslot=0x0305, category='mn', description='COMBINING OVERLINE' }, + [0x0306] = { unicodeslot=0x0306, category='mn', description='COMBINING BREVE' }, + [0x0307] = { unicodeslot=0x0307, category='mn', description='COMBINING DOT ABOVE' }, + [0x0308] = { unicodeslot=0x0308, category='mn', description='COMBINING DIAERESIS' }, + [0x0309] = { unicodeslot=0x0309, category='mn', adobename='hookabovecomb', description='COMBINING HOOK ABOVE' }, + [0x030A] = { unicodeslot=0x030A, category='mn', description='COMBINING RING ABOVE' }, + [0x030B] = { unicodeslot=0x030B, category='mn', description='COMBINING DOUBLE ACUTE ACCENT' }, + [0x030C] = { unicodeslot=0x030C, category='mn', description='COMBINING CARON' }, + [0x030D] = { unicodeslot=0x030D, category='mn', description='COMBINING VERTICAL LINE ABOVE' }, + [0x030E] = { unicodeslot=0x030E, category='mn', description='COMBINING DOUBLE VERTICAL LINE ABOVE' }, + [0x030F] = { unicodeslot=0x030F, category='mn', description='COMBINING DOUBLE GRAVE ACCENT' }, + [0x0310] = { unicodeslot=0x0310, category='mn', description='COMBINING CANDRABINDU' }, + [0x0311] = { unicodeslot=0x0311, category='mn', description='COMBINING INVERTED BREVE' }, + [0x0312] = { unicodeslot=0x0312, category='mn', description='COMBINING TURNED COMMA ABOVE' }, + [0x0313] = { unicodeslot=0x0313, category='mn', description='COMBINING COMMA ABOVE' }, + [0x0314] = { unicodeslot=0x0314, category='mn', description='COMBINING REVERSED COMMA ABOVE' }, + [0x0315] = { unicodeslot=0x0315, category='mn', description='COMBINING COMMA ABOVE RIGHT' }, + [0x0316] = { unicodeslot=0x0316, category='mn', description='COMBINING GRAVE ACCENT BELOW' }, + [0x0317] = { unicodeslot=0x0317, category='mn', description='COMBINING ACUTE ACCENT BELOW' }, + [0x0318] = { unicodeslot=0x0318, category='mn', description='COMBINING LEFT TACK BELOW' }, + [0x0319] = { unicodeslot=0x0319, category='mn', description='COMBINING RIGHT TACK BELOW' }, + [0x031A] = { unicodeslot=0x031A, category='mn', description='COMBINING LEFT ANGLE ABOVE' }, + [0x031B] = { unicodeslot=0x031B, category='mn', description='COMBINING HORN' }, + [0x031C] = { unicodeslot=0x031C, category='mn', description='COMBINING LEFT HALF RING BELOW' }, + [0x031D] = { unicodeslot=0x031D, category='mn', description='COMBINING UP TACK BELOW' }, + [0x031E] = { unicodeslot=0x031E, category='mn', description='COMBINING DOWN TACK BELOW' }, + [0x031F] = { unicodeslot=0x031F, category='mn', description='COMBINING PLUS SIGN BELOW' }, + [0x0320] = { unicodeslot=0x0320, category='mn', description='COMBINING MINUS SIGN BELOW' }, + [0x0321] = { unicodeslot=0x0321, category='mn', description='COMBINING PALATALIZED HOOK BELOW' }, + [0x0322] = { unicodeslot=0x0322, category='mn', description='COMBINING RETROFLEX HOOK BELOW' }, + [0x0323] = { unicodeslot=0x0323, category='mn', adobename='dotbelowcomb', description='COMBINING DOT BELOW' }, + [0x0324] = { unicodeslot=0x0324, category='mn', description='COMBINING DIAERESIS BELOW' }, + [0x0325] = { unicodeslot=0x0325, category='mn', description='COMBINING RING BELOW' }, + [0x0326] = { unicodeslot=0x0326, category='mn', description='COMBINING COMMA BELOW' }, + [0x0327] = { unicodeslot=0x0327, category='mn', description='COMBINING CEDILLA' }, + [0x0328] = { unicodeslot=0x0328, category='mn', description='COMBINING OGONEK' }, + [0x0329] = { unicodeslot=0x0329, category='mn', description='COMBINING VERTICAL LINE BELOW' }, + [0x032A] = { unicodeslot=0x032A, category='mn', description='COMBINING BRIDGE BELOW' }, + [0x032B] = { unicodeslot=0x032B, category='mn', description='COMBINING INVERTED DOUBLE ARCH BELOW' }, + [0x032C] = { unicodeslot=0x032C, category='mn', description='COMBINING CARON BELOW' }, + [0x032D] = { unicodeslot=0x032D, category='mn', description='COMBINING CIRCUMFLEX ACCENT BELOW' }, + [0x032E] = { unicodeslot=0x032E, category='mn', description='COMBINING BREVE BELOW' }, + [0x032F] = { unicodeslot=0x032F, category='mn', description='COMBINING INVERTED BREVE BELOW' }, + [0x0330] = { unicodeslot=0x0330, category='mn', description='COMBINING TILDE BELOW' }, + [0x0331] = { unicodeslot=0x0331, category='mn', description='COMBINING MACRON BELOW' }, + [0x0332] = { unicodeslot=0x0332, category='mn', description='COMBINING LOW LINE' }, + [0x0333] = { unicodeslot=0x0333, category='mn', description='COMBINING DOUBLE LOW LINE' }, + [0x0334] = { unicodeslot=0x0334, category='mn', description='COMBINING TILDE OVERLAY' }, + [0x0335] = { unicodeslot=0x0335, category='mn', description='COMBINING SHORT STROKE OVERLAY' }, + [0x0336] = { unicodeslot=0x0336, category='mn', description='COMBINING LONG STROKE OVERLAY' }, + [0x0337] = { unicodeslot=0x0337, category='mn', description='COMBINING SHORT SOLIDUS OVERLAY' }, + [0x0338] = { unicodeslot=0x0338, category='mn', description='COMBINING LONG SOLIDUS OVERLAY' }, + [0x0339] = { unicodeslot=0x0339, category='mn', description='COMBINING RIGHT HALF RING BELOW' }, + [0x033A] = { unicodeslot=0x033A, category='mn', description='COMBINING INVERTED BRIDGE BELOW' }, + [0x033B] = { unicodeslot=0x033B, category='mn', description='COMBINING SQUARE BELOW' }, + [0x033C] = { unicodeslot=0x033C, category='mn', description='COMBINING SEAGULL BELOW' }, + [0x033D] = { unicodeslot=0x033D, category='mn', description='COMBINING X ABOVE' }, + [0x033E] = { unicodeslot=0x033E, category='mn', description='COMBINING VERTICAL TILDE' }, + [0x033F] = { unicodeslot=0x033F, category='mn', description='COMBINING DOUBLE OVERLINE' }, + [0x0340] = { unicodeslot=0x0340, category='mn', description='COMBINING GRAVE TONE MARK', specials={'char',0x0300} }, + [0x0341] = { unicodeslot=0x0341, category='mn', description='COMBINING ACUTE TONE MARK', specials={'char',0x0301} }, + [0x0342] = { unicodeslot=0x0342, category='mn', description='COMBINING GREEK PERISPOMENI' }, + [0x0343] = { unicodeslot=0x0343, category='mn', description='COMBINING GREEK KORONIS', specials={'char',0x0313} }, + [0x0344] = { unicodeslot=0x0344, category='mn', description='COMBINING GREEK DIALYTIKA TONOS', specials={'char',0x0308,0x0301} }, + [0x0345] = { unicodeslot=0x0345, category='mn', description='COMBINING GREEK YPOGEGRAMMENI', uccode=0x0399 }, + [0x0346] = { unicodeslot=0x0346, category='mn', description='COMBINING BRIDGE ABOVE' }, + [0x0347] = { unicodeslot=0x0347, category='mn', description='COMBINING EQUALS SIGN BELOW' }, + [0x0348] = { unicodeslot=0x0348, category='mn', description='COMBINING DOUBLE VERTICAL LINE BELOW' }, + [0x0349] = { unicodeslot=0x0349, category='mn', description='COMBINING LEFT ANGLE BELOW' }, + [0x034A] = { unicodeslot=0x034A, category='mn', description='COMBINING NOT TILDE ABOVE' }, + [0x034B] = { unicodeslot=0x034B, category='mn', description='COMBINING HOMOTHETIC ABOVE' }, + [0x034C] = { unicodeslot=0x034C, category='mn', description='COMBINING ALMOST EQUAL TO ABOVE' }, + [0x034D] = { unicodeslot=0x034D, category='mn', description='COMBINING LEFT RIGHT ARROW BELOW' }, + [0x034E] = { unicodeslot=0x034E, category='mn', description='COMBINING UPWARDS ARROW BELOW' }, + [0x034F] = { unicodeslot=0x034F, category='mn', description='COMBINING GRAPHEME JOINER' }, + [0x0350] = { unicodeslot=0x0350, category='mn', description='COMBINING RIGHT ARROWHEAD ABOVE' }, + [0x0351] = { unicodeslot=0x0351, category='mn', description='COMBINING LEFT HALF RING ABOVE' }, + [0x0352] = { unicodeslot=0x0352, category='mn', description='COMBINING FERMATA' }, + [0x0353] = { unicodeslot=0x0353, category='mn', description='COMBINING X BELOW' }, + [0x0354] = { unicodeslot=0x0354, category='mn', description='COMBINING LEFT ARROWHEAD BELOW' }, + [0x0355] = { unicodeslot=0x0355, category='mn', description='COMBINING RIGHT ARROWHEAD BELOW' }, + [0x0356] = { unicodeslot=0x0356, category='mn', description='COMBINING RIGHT ARROWHEAD AND UP ARROWHEAD BELOW' }, + [0x0357] = { unicodeslot=0x0357, category='mn', description='COMBINING RIGHT HALF RING ABOVE' }, + [0x0358] = { unicodeslot=0x0358, category='mn', description='COMBINING DOT ABOVE RIGHT' }, + [0x0359] = { unicodeslot=0x0359, category='mn', description='COMBINING ASTERISK BELOW' }, + [0x035A] = { unicodeslot=0x035A, category='mn', description='COMBINING DOUBLE RING BELOW' }, + [0x035B] = { unicodeslot=0x035B, category='mn', description='COMBINING ZIGZAG ABOVE' }, + [0x035C] = { unicodeslot=0x035C, category='mn', description='COMBINING DOUBLE BREVE BELOW' }, + [0x035D] = { unicodeslot=0x035D, category='mn', description='COMBINING DOUBLE BREVE' }, + [0x035E] = { unicodeslot=0x035E, category='mn', description='COMBINING DOUBLE MACRON' }, + [0x035F] = { unicodeslot=0x035F, category='mn', description='COMBINING DOUBLE MACRON BELOW' }, + [0x0360] = { unicodeslot=0x0360, category='mn', description='COMBINING DOUBLE TILDE' }, + [0x0361] = { unicodeslot=0x0361, category='mn', description='COMBINING DOUBLE INVERTED BREVE' }, + [0x0362] = { unicodeslot=0x0362, category='mn', description='COMBINING DOUBLE RIGHTWARDS ARROW BELOW' }, + [0x0363] = { unicodeslot=0x0363, category='mn', description='COMBINING LATIN SMALL LETTER A' }, + [0x0364] = { unicodeslot=0x0364, category='mn', description='COMBINING LATIN SMALL LETTER E' }, + [0x0365] = { unicodeslot=0x0365, category='mn', description='COMBINING LATIN SMALL LETTER I' }, + [0x0366] = { unicodeslot=0x0366, category='mn', description='COMBINING LATIN SMALL LETTER O' }, + [0x0367] = { unicodeslot=0x0367, category='mn', description='COMBINING LATIN SMALL LETTER U' }, + [0x0368] = { unicodeslot=0x0368, category='mn', description='COMBINING LATIN SMALL LETTER C' }, + [0x0369] = { unicodeslot=0x0369, category='mn', description='COMBINING LATIN SMALL LETTER D' }, + [0x036A] = { unicodeslot=0x036A, category='mn', description='COMBINING LATIN SMALL LETTER H' }, + [0x036B] = { unicodeslot=0x036B, category='mn', description='COMBINING LATIN SMALL LETTER M' }, + [0x036C] = { unicodeslot=0x036C, category='mn', description='COMBINING LATIN SMALL LETTER R' }, + [0x036D] = { unicodeslot=0x036D, category='mn', description='COMBINING LATIN SMALL LETTER T' }, + [0x036E] = { unicodeslot=0x036E, category='mn', description='COMBINING LATIN SMALL LETTER V' }, + [0x036F] = { unicodeslot=0x036F, category='mn', description='COMBINING LATIN SMALL LETTER X' }, + [0x0374] = { unicodeslot=0x0374, category='sk', description='GREEK NUMERAL SIGN', specials={'char',0x02B9} }, + [0x0375] = { unicodeslot=0x0375, category='sk', description='GREEK LOWER NUMERAL SIGN' }, + [0x037A] = { unicodeslot=0x037A, category='lm', description='GREEK YPOGEGRAMMENI', specials={'compat',0x0020,0x0345} }, + [0x037B] = { unicodeslot=0x037B, category='ll', description='GREEK SMALL REVERSED LUNATE SIGMA SYMBOL', uccode=0x03FD }, + [0x037C] = { unicodeslot=0x037C, category='ll', description='GREEK SMALL DOTTED LUNATE SIGMA SYMBOL', uccode=0x03FE }, + [0x037D] = { unicodeslot=0x037D, category='ll', description='GREEK SMALL REVERSED DOTTED LUNATE SIGMA SYMBOL', uccode=0x03FF }, + [0x037E] = { unicodeslot=0x037E, category='po', description='GREEK QUESTION MARK', specials={'char',0x003B} }, + [0x0384] = { unicodeslot=0x0384, category='sk', adobename='tonos', contextname='greektonos', description='GREEK TONOS', specials={'compat',0x0020,0x0301} }, + [0x0385] = { unicodeslot=0x0385, category='sk', adobename='dieresistonos', contextname='greekdialytikatonos', description='GREEK DIALYTIKA TONOS', specials={'char',0x00A8,0x0301} }, + [0x0386] = { unicodeslot=0x0386, category='lu', adobename='Alphatonos', contextname='greekAlphatonos', description='GREEK CAPITAL LETTER ALPHA WITH TONOS', shcode=0x0391, lccode=0x03AC, specials={'char',0x0391,0x0301} }, + [0x0387] = { unicodeslot=0x0387, category='po', adobename='anoteleia', description='GREEK ANO TELEIA', specials={'char',0x00B7} }, + [0x0388] = { unicodeslot=0x0388, category='lu', adobename='Epsilontonos', contextname='greekEpsilontonos', description='GREEK CAPITAL LETTER EPSILON WITH TONOS', shcode=0x0395, lccode=0x03AD, specials={'char',0x0395,0x0301} }, + [0x0389] = { unicodeslot=0x0389, category='lu', adobename='Etatonos', contextname='greekEtatonos', description='GREEK CAPITAL LETTER ETA WITH TONOS', shcode=0x0397, lccode=0x03AE, specials={'char',0x0397,0x0301} }, + [0x038A] = { unicodeslot=0x038A, category='lu', adobename='Iotatonos', contextname='greekIotatonos', description='GREEK CAPITAL LETTER IOTA WITH TONOS', shcode=0x0399, lccode=0x03AF, specials={'char',0x0399,0x0301} }, + [0x038C] = { unicodeslot=0x038C, category='lu', adobename='Omicrontonos', contextname='greekOmicrontonos', description='GREEK CAPITAL LETTER OMICRON WITH TONOS', shcode=0x039F, lccode=0x03CC, specials={'char',0x039F,0x0301} }, + [0x038E] = { unicodeslot=0x038E, category='lu', adobename='Upsilontonos', contextname='greekUpsilontonos', description='GREEK CAPITAL LETTER UPSILON WITH TONOS', shcode=0x03A5, lccode=0x03CD, specials={'char',0x03A5,0x0301} }, + [0x038F] = { unicodeslot=0x038F, category='lu', adobename='Omegatonos', contextname='greekOmegatonos', description='GREEK CAPITAL LETTER OMEGA WITH TONOS', shcode=0x03A9, lccode=0x03CE, specials={'char',0x03A9,0x0301} }, + [0x0390] = { unicodeslot=0x0390, category='ll', adobename='iotadieresistonos', contextname='greekiotadialytikatonos', description='GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS', shcode=0x03B9, specials={'char',0x03CA,0x0301} }, + [0x0391] = { unicodeslot=0x0391, category='lu', adobename='Alpha', contextname='greekAlpha', description='GREEK CAPITAL LETTER ALPHA', lccode=0x03B1 }, + [0x0392] = { unicodeslot=0x0392, category='lu', adobename='Beta', contextname='greekBeta', description='GREEK CAPITAL LETTER BETA', lccode=0x03B2 }, + [0x0393] = { unicodeslot=0x0393, category='lu', adobename='Gamma', contextname='greekGamma', description='GREEK CAPITAL LETTER GAMMA', lccode=0x03B3 }, + [0x0394] = { unicodeslot=0x0394, category='lu', contextname='greekDelta', description='GREEK CAPITAL LETTER DELTA', lccode=0x03B4 }, + [0x0395] = { unicodeslot=0x0395, category='lu', adobename='Epsilon', contextname='greekEpsilon', description='GREEK CAPITAL LETTER EPSILON', lccode=0x03B5 }, + [0x0396] = { unicodeslot=0x0396, category='lu', adobename='Zeta', contextname='greekZeta', description='GREEK CAPITAL LETTER ZETA', lccode=0x03B6 }, + [0x0397] = { unicodeslot=0x0397, category='lu', adobename='Eta', contextname='greekEta', description='GREEK CAPITAL LETTER ETA', lccode=0x03B7 }, + [0x0398] = { unicodeslot=0x0398, category='lu', adobename='Theta', contextname='greekTheta', description='GREEK CAPITAL LETTER THETA', lccode=0x03B8 }, + [0x0399] = { unicodeslot=0x0399, category='lu', adobename='Iota', contextname='greekIota', description='GREEK CAPITAL LETTER IOTA', lccode=0x03B9 }, + [0x039A] = { unicodeslot=0x039A, category='lu', adobename='Kappa', contextname='greekKappa', description='GREEK CAPITAL LETTER KAPPA', lccode=0x03BA }, + [0x039B] = { unicodeslot=0x039B, category='lu', adobename='Lambda', contextname='greekLambda', description='GREEK CAPITAL LETTER LAMDA', lccode=0x03BB }, + [0x039C] = { unicodeslot=0x039C, category='lu', adobename='Mu', contextname='greekMu', description='GREEK CAPITAL LETTER MU', lccode=0x03BC }, + [0x039D] = { unicodeslot=0x039D, category='lu', adobename='Nu', contextname='greekNu', description='GREEK CAPITAL LETTER NU', lccode=0x03BD }, + [0x039E] = { unicodeslot=0x039E, category='lu', adobename='Xi', contextname='greekXi', description='GREEK CAPITAL LETTER XI', lccode=0x03BE }, + [0x039F] = { unicodeslot=0x039F, category='lu', adobename='Omicron', contextname='greekOmicron', description='GREEK CAPITAL LETTER OMICRON', lccode=0x03BF }, + [0x03A0] = { unicodeslot=0x03A0, category='lu', adobename='Pi', contextname='greekPi', description='GREEK CAPITAL LETTER PI', lccode=0x03C0 }, + [0x03A1] = { unicodeslot=0x03A1, category='lu', adobename='Rho', contextname='greekRho', description='GREEK CAPITAL LETTER RHO', lccode=0x03C1 }, + [0x03A3] = { unicodeslot=0x03A3, category='lu', adobename='Sigma', contextname='greekSigma', description='GREEK CAPITAL LETTER SIGMA', lccode=0x03C3 }, + [0x03A4] = { unicodeslot=0x03A4, category='lu', adobename='Tau', contextname='greekTau', description='GREEK CAPITAL LETTER TAU', lccode=0x03C4 }, + [0x03A5] = { unicodeslot=0x03A5, category='lu', adobename='Upsilon', contextname='greekUpsilon', description='GREEK CAPITAL LETTER UPSILON', lccode=0x03C5 }, + [0x03A6] = { unicodeslot=0x03A6, category='lu', adobename='Phi', contextname='greekPhi', description='GREEK CAPITAL LETTER PHI', lccode=0x03C6 }, + [0x03A7] = { unicodeslot=0x03A7, category='lu', adobename='Chi', contextname='greekChi', description='GREEK CAPITAL LETTER CHI', lccode=0x03C7 }, + [0x03A8] = { unicodeslot=0x03A8, category='lu', adobename='Psi', contextname='greekPsi', description='GREEK CAPITAL LETTER PSI', lccode=0x03C8 }, + [0x03A9] = { unicodeslot=0x03A9, category='lu', contextname='greekOmega', description='GREEK CAPITAL LETTER OMEGA', lccode=0x03C9 }, + [0x03AA] = { unicodeslot=0x03AA, category='lu', adobename='Iotadieresis', contextname='greekIotadialytika', description='GREEK CAPITAL LETTER IOTA WITH DIALYTIKA', shcode=0x0399, lccode=0x03CA, specials={'char',0x0399,0x0308} }, + [0x03AB] = { unicodeslot=0x03AB, category='lu', adobename='Upsilondieresis', contextname='greekUpsilondialytika', description='GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA', shcode=0x03A5, lccode=0x03CB, specials={'char',0x03A5,0x0308} }, + [0x03AC] = { unicodeslot=0x03AC, category='ll', adobename='alphatonos', contextname='greekalphatonos', description='GREEK SMALL LETTER ALPHA WITH TONOS', shcode=0x03B1, uccode=0x0386, specials={'char',0x03B1,0x0301} }, + [0x03AD] = { unicodeslot=0x03AD, category='ll', adobename='epsilontonos', contextname='greekepsilontonos', description='GREEK SMALL LETTER EPSILON WITH TONOS', shcode=0x03B5, uccode=0x0388, specials={'char',0x03B5,0x0301} }, + [0x03AE] = { unicodeslot=0x03AE, category='ll', adobename='etatonos', contextname='greeketatonos', description='GREEK SMALL LETTER ETA WITH TONOS', shcode=0x03B7, uccode=0x0389, specials={'char',0x03B7,0x0301} }, + [0x03AF] = { unicodeslot=0x03AF, category='ll', adobename='iotatonos', contextname='greekiotatonos', description='GREEK SMALL LETTER IOTA WITH TONOS', shcode=0x03B9, uccode=0x038A, specials={'char',0x03B9,0x0301} }, + [0x03B0] = { unicodeslot=0x03B0, category='ll', adobename='upsilondieresistonos', contextname='greekupsilondialytikatonos', description='GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS', shcode=0x03C5, specials={'char',0x03CB,0x0301} }, + [0x03B1] = { unicodeslot=0x03B1, category='ll', adobename='alpha', contextname='greekalpha', description='GREEK SMALL LETTER ALPHA', uccode=0x0391 }, + [0x03B2] = { unicodeslot=0x03B2, category='ll', adobename='beta', contextname='greekbeta', description='GREEK SMALL LETTER BETA', uccode=0x0392 }, + [0x03B3] = { unicodeslot=0x03B3, category='ll', adobename='gamma', contextname='greekgamma', description='GREEK SMALL LETTER GAMMA', uccode=0x0393 }, + [0x03B4] = { unicodeslot=0x03B4, category='ll', adobename='delta', contextname='greekdelta', description='GREEK SMALL LETTER DELTA', uccode=0x0394 }, + [0x03B5] = { unicodeslot=0x03B5, category='ll', adobename='epsilon', contextname='greekepsilon', description='GREEK SMALL LETTER EPSILON', uccode=0x0395 }, + [0x03B6] = { unicodeslot=0x03B6, category='ll', adobename='zeta', contextname='greekzeta', description='GREEK SMALL LETTER ZETA', uccode=0x0396 }, + [0x03B7] = { unicodeslot=0x03B7, category='ll', adobename='eta', contextname='greeketa', description='GREEK SMALL LETTER ETA', uccode=0x0397 }, + [0x03B8] = { unicodeslot=0x03B8, category='ll', adobename='theta', contextname='greektheta', description='GREEK SMALL LETTER THETA', uccode=0x0398 }, + [0x03B9] = { unicodeslot=0x03B9, category='ll', adobename='iota', contextname='greekiota', description='GREEK SMALL LETTER IOTA', uccode=0x0399 }, + [0x03BA] = { unicodeslot=0x03BA, category='ll', adobename='kappa', contextname='greekkappa', description='GREEK SMALL LETTER KAPPA', uccode=0x039A }, + [0x03BB] = { unicodeslot=0x03BB, category='ll', adobename='lambda', contextname='greeklambda', description='GREEK SMALL LETTER LAMDA', uccode=0x039B }, + [0x03BC] = { unicodeslot=0x03BC, category='ll', contextname='greekmu', description='GREEK SMALL LETTER MU', uccode=0x039C }, + [0x03BD] = { unicodeslot=0x03BD, category='ll', adobename='nu', contextname='greeknu', description='GREEK SMALL LETTER NU', uccode=0x039D }, + [0x03BE] = { unicodeslot=0x03BE, category='ll', adobename='xi', contextname='greekxi', description='GREEK SMALL LETTER XI', uccode=0x039E }, + [0x03BF] = { unicodeslot=0x03BF, category='ll', adobename='omicron', contextname='greekomicron', description='GREEK SMALL LETTER OMICRON', uccode=0x039F }, + [0x03C0] = { unicodeslot=0x03C0, category='ll', adobename='pi', contextname='greekpi', description='GREEK SMALL LETTER PI', uccode=0x03A0 }, + [0x03C1] = { unicodeslot=0x03C1, category='ll', adobename='rho', contextname='greekrho', description='GREEK SMALL LETTER RHO', uccode=0x03A1 }, + [0x03C2] = { unicodeslot=0x03C2, category='ll', adobename='sigma1', contextname='greekfinalsigma', description='GREEK SMALL LETTER FINAL SIGMA', uccode=0x03A3 }, + [0x03C3] = { unicodeslot=0x03C3, category='ll', adobename='sigma', contextname='greeksigma', description='GREEK SMALL LETTER SIGMA', uccode=0x03A3 }, + [0x03C4] = { unicodeslot=0x03C4, category='ll', adobename='tau', contextname='greektau', description='GREEK SMALL LETTER TAU', uccode=0x03A4 }, + [0x03C5] = { unicodeslot=0x03C5, category='ll', adobename='upsilon', contextname='greekupsilon', description='GREEK SMALL LETTER UPSILON', uccode=0x03A5 }, + [0x03C6] = { unicodeslot=0x03C6, category='ll', adobename='phi', contextname='greekphi', description='GREEK SMALL LETTER PHI', uccode=0x03A6 }, + [0x03C7] = { unicodeslot=0x03C7, category='ll', adobename='chi', contextname='greekchi', description='GREEK SMALL LETTER CHI', uccode=0x03A7 }, + [0x03C8] = { unicodeslot=0x03C8, category='ll', adobename='psi', contextname='greekpsi', description='GREEK SMALL LETTER PSI', uccode=0x03A8 }, + [0x03C9] = { unicodeslot=0x03C9, category='ll', adobename='omega', contextname='greekomega', description='GREEK SMALL LETTER OMEGA', uccode=0x03A9 }, + [0x03CA] = { unicodeslot=0x03CA, category='ll', adobename='iotadieresis', contextname='greekiotadialytika', description='GREEK SMALL LETTER IOTA WITH DIALYTIKA', shcode=0x03B9, uccode=0x03AA, specials={'char',0x03B9,0x0308} }, + [0x03CB] = { unicodeslot=0x03CB, category='ll', adobename='upsilondieresis', contextname='greekupsilondiaeresis', description='GREEK SMALL LETTER UPSILON WITH DIALYTIKA', shcode=0x03C5, uccode=0x03AB, specials={'char',0x03C5,0x0308} }, + [0x03CC] = { unicodeslot=0x03CC, category='ll', adobename='omicrontonos', contextname='greekomicrontonos', description='GREEK SMALL LETTER OMICRON WITH TONOS', shcode=0x03BF, uccode=0x038C, specials={'char',0x03BF,0x0301} }, + [0x03CD] = { unicodeslot=0x03CD, category='ll', adobename='upsilontonos', contextname='greekupsilontonos', description='GREEK SMALL LETTER UPSILON WITH TONOS', shcode=0x03C5, uccode=0x038E, specials={'char',0x03C5,0x0301} }, + [0x03CE] = { unicodeslot=0x03CE, category='ll', adobename='omegatonos', contextname='greekomegatonos', description='GREEK SMALL LETTER OMEGA WITH TONOS', shcode=0x03C9, uccode=0x038F, specials={'char',0x03C9,0x0301} }, + [0x03D0] = { unicodeslot=0x03D0, category='ll', description='GREEK BETA SYMBOL', uccode=0x0392, specials={'compat',0x03B2} }, + [0x03D1] = { unicodeslot=0x03D1, category='ll', adobename='theta1', contextname='greekthetaalt', description='GREEK THETA SYMBOL', uccode=0x0398, specials={'compat',0x03B8} }, + [0x03D2] = { unicodeslot=0x03D2, category='lu', adobename='Upsilon1', description='GREEK UPSILON WITH HOOK SYMBOL', specials={'compat',0x03A5} }, + [0x03D3] = { unicodeslot=0x03D3, category='lu', description='GREEK UPSILON WITH ACUTE AND HOOK SYMBOL', specials={'char',0x03D2,0x0301} }, + [0x03D4] = { unicodeslot=0x03D4, category='lu', description='GREEK UPSILON WITH DIAERESIS AND HOOK SYMBOL', specials={'char',0x03D2,0x0308} }, + [0x03D5] = { unicodeslot=0x03D5, category='ll', adobename='phi1', contextname='greekphialt', description='GREEK PHI SYMBOL', uccode=0x03A6, specials={'compat',0x03C6} }, + [0x03D6] = { unicodeslot=0x03D6, category='ll', adobename='omega1', contextname='greekpialt', description='GREEK PI SYMBOL', uccode=0x03A0, specials={'compat',0x03C0} }, + [0x03D7] = { unicodeslot=0x03D7, category='ll', description='GREEK KAI SYMBOL' }, + [0x03D8] = { unicodeslot=0x03D8, category='lu', description='GREEK LETTER ARCHAIC KOPPA', lccode=0x03D9 }, + [0x03D9] = { unicodeslot=0x03D9, category='ll', contextname='greekkoppa', description='GREEK SMALL LETTER ARCHAIC KOPPA', uccode=0x03D8 }, + [0x03DA] = { unicodeslot=0x03DA, category='lu', description='GREEK LETTER STIGMA', lccode=0x03DB }, + [0x03DB] = { unicodeslot=0x03DB, category='ll', contextname='greekstigma', description='GREEK SMALL LETTER STIGMA', uccode=0x03DA }, + [0x03DC] = { unicodeslot=0x03DC, category='lu', description='GREEK LETTER DIGAMMA', lccode=0x03DD }, + [0x03DD] = { unicodeslot=0x03DD, category='ll', contextname='greekdigamma', description='GREEK SMALL LETTER DIGAMMA', uccode=0x03DC }, + [0x03DE] = { unicodeslot=0x03DE, category='lu', description='GREEK LETTER KOPPA', lccode=0x03DF }, + [0x03DF] = { unicodeslot=0x03DF, category='ll', contextname='greeknumkoppa', description='GREEK SMALL LETTER KOPPA', uccode=0x03DE }, + [0x03E0] = { unicodeslot=0x03E0, category='lu', description='GREEK LETTER SAMPI', lccode=0x03E1 }, + [0x03E1] = { unicodeslot=0x03E1, category='ll', contextname='greeksampi', description='GREEK SMALL LETTER SAMPI', uccode=0x03E0 }, + [0x03E2] = { unicodeslot=0x03E2, category='lu', description='COPTIC CAPITAL LETTER SHEI', lccode=0x03E3 }, + [0x03E3] = { unicodeslot=0x03E3, category='ll', description='COPTIC SMALL LETTER SHEI', uccode=0x03E2 }, + [0x03E4] = { unicodeslot=0x03E4, category='lu', description='COPTIC CAPITAL LETTER FEI', lccode=0x03E5 }, + [0x03E5] = { unicodeslot=0x03E5, category='ll', description='COPTIC SMALL LETTER FEI', uccode=0x03E4 }, + [0x03E6] = { unicodeslot=0x03E6, category='lu', description='COPTIC CAPITAL LETTER KHEI', lccode=0x03E7 }, + [0x03E7] = { unicodeslot=0x03E7, category='ll', description='COPTIC SMALL LETTER KHEI', uccode=0x03E6 }, + [0x03E8] = { unicodeslot=0x03E8, category='lu', description='COPTIC CAPITAL LETTER HORI', lccode=0x03E9 }, + [0x03E9] = { unicodeslot=0x03E9, category='ll', description='COPTIC SMALL LETTER HORI', uccode=0x03E8 }, + [0x03EA] = { unicodeslot=0x03EA, category='lu', description='COPTIC CAPITAL LETTER GANGIA', lccode=0x03EB }, + [0x03EB] = { unicodeslot=0x03EB, category='ll', description='COPTIC SMALL LETTER GANGIA', uccode=0x03EA }, + [0x03EC] = { unicodeslot=0x03EC, category='lu', description='COPTIC CAPITAL LETTER SHIMA', lccode=0x03ED }, + [0x03ED] = { unicodeslot=0x03ED, category='ll', description='COPTIC SMALL LETTER SHIMA', uccode=0x03EC }, + [0x03EE] = { unicodeslot=0x03EE, category='lu', description='COPTIC CAPITAL LETTER DEI', lccode=0x03EF }, + [0x03EF] = { unicodeslot=0x03EF, category='ll', description='COPTIC SMALL LETTER DEI', uccode=0x03EE }, + [0x03F0] = { unicodeslot=0x03F0, category='ll', description='GREEK KAPPA SYMBOL', uccode=0x039A, specials={'compat',0x03BA} }, + [0x03F1] = { unicodeslot=0x03F1, category='ll', contextname='greekrhoalt', description='GREEK RHO SYMBOL', uccode=0x03A1, specials={'compat',0x03C1} }, + [0x03F2] = { unicodeslot=0x03F2, category='ll', contextname='greeksigmalunate', description='GREEK LUNATE SIGMA SYMBOL', uccode=0x03F9, specials={'compat',0x03C2} }, + [0x03F3] = { unicodeslot=0x03F3, category='ll', description='GREEK LETTER YOT' }, + [0x03F4] = { unicodeslot=0x03F4, category='lu', description='GREEK CAPITAL THETA SYMBOL', lccode=0x03B8, specials={'compat',0x0398} }, + [0x03F5] = { unicodeslot=0x03F5, category='ll', contextname='greekepsilonalt', description='GREEK LUNATE EPSILON SYMBOL', uccode=0x0395, specials={'compat',0x03B5} }, + [0x03F6] = { unicodeslot=0x03F6, category='sm', description='GREEK REVERSED LUNATE EPSILON SYMBOL' }, + [0x03F7] = { unicodeslot=0x03F7, category='lu', description='GREEK CAPITAL LETTER SHO', lccode=0x03F8 }, + [0x03F8] = { unicodeslot=0x03F8, category='ll', description='GREEK SMALL LETTER SHO', uccode=0x03F7 }, + [0x03F9] = { unicodeslot=0x03F9, category='lu', contextname='greekSigmalunate', description='GREEK CAPITAL LUNATE SIGMA SYMBOL', lccode=0x03F2, specials={'compat',0x03A3} }, + [0x03FA] = { unicodeslot=0x03FA, category='lu', description='GREEK CAPITAL LETTER SAN', lccode=0x03FB }, + [0x03FB] = { unicodeslot=0x03FB, category='ll', description='GREEK SMALL LETTER SAN', uccode=0x03FA }, + [0x03FC] = { unicodeslot=0x03FC, category='ll', description='GREEK RHO WITH STROKE SYMBOL' }, + [0x03FD] = { unicodeslot=0x03FD, category='lu', description='GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL', lccode=0x037B }, + [0x03FE] = { unicodeslot=0x03FE, category='lu', description='GREEK CAPITAL DOTTED LUNATE SIGMA SYMBOL', lccode=0x037C }, + [0x03FF] = { unicodeslot=0x03FF, category='lu', description='GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL', lccode=0x037D }, + [0x0400] = { unicodeslot=0x0400, category='lu', contextname='cyrillicEgrave', description='CYRILLIC CAPITAL LETTER IE WITH GRAVE', shcode=0x0415, lccode=0x0450, specials={'char',0x0415,0x0300} }, + [0x0401] = { unicodeslot=0x0401, category='lu', adobename='afii10023', contextname='cyrillicYO', description='CYRILLIC CAPITAL LETTER IO', lccode=0x0451, specials={'char',0x0415,0x0308} }, + [0x0402] = { unicodeslot=0x0402, category='lu', adobename='afii10051', contextname='cyrillicDJE', description='CYRILLIC CAPITAL LETTER DJE', lccode=0x0452 }, + [0x0403] = { unicodeslot=0x0403, category='lu', adobename='afii10052', contextname='cyrillicGJE', description='CYRILLIC CAPITAL LETTER GJE', lccode=0x0453, specials={'char',0x0413,0x0301} }, + [0x0404] = { unicodeslot=0x0404, category='lu', adobename='afii10053', contextname='cyrillicIE', description='CYRILLIC CAPITAL LETTER UKRAINIAN IE', lccode=0x0454 }, + [0x0405] = { unicodeslot=0x0405, category='lu', adobename='afii10054', contextname='cyrillicDZE', description='CYRILLIC CAPITAL LETTER DZE', lccode=0x0455 }, + [0x0406] = { unicodeslot=0x0406, category='lu', adobename='afii10055', contextname='cyrillicII', description='CYRILLIC CAPITAL LETTER BYELORUSSIAN-UKRAINIAN I', lccode=0x0456 }, + [0x0407] = { unicodeslot=0x0407, category='lu', adobename='afii10056', contextname='cyrillicYI', description='CYRILLIC CAPITAL LETTER YI', lccode=0x0457, specials={'char',0x0406,0x0308} }, + [0x0408] = { unicodeslot=0x0408, category='lu', adobename='afii10057', contextname='cyrillicJE', description='CYRILLIC CAPITAL LETTER JE', lccode=0x0458 }, + [0x0409] = { unicodeslot=0x0409, category='lu', adobename='afii10058', contextname='cyrillicLJE', description='CYRILLIC CAPITAL LETTER LJE', lccode=0x0459 }, + [0x040A] = { unicodeslot=0x040A, category='lu', adobename='afii10059', contextname='cyrillicNJE', description='CYRILLIC CAPITAL LETTER NJE', lccode=0x045A }, + [0x040B] = { unicodeslot=0x040B, category='lu', adobename='afii10060', contextname='cyrillicTSHE', description='CYRILLIC CAPITAL LETTER TSHE', lccode=0x045B }, + [0x040C] = { unicodeslot=0x040C, category='lu', adobename='afii10061', contextname='cyrillicKJE', description='CYRILLIC CAPITAL LETTER KJE', lccode=0x045C, specials={'char',0x041A,0x0301} }, + [0x040D] = { unicodeslot=0x040D, category='lu', contextname='cyrillicIgrave', description='CYRILLIC CAPITAL LETTER I WITH GRAVE', shcode=0x0418, lccode=0x045D, specials={'char',0x0418,0x0300} }, + [0x040E] = { unicodeslot=0x040E, category='lu', adobename='afii10062', contextname='cyrillicUSHRT', description='CYRILLIC CAPITAL LETTER SHORT U', lccode=0x045E, specials={'char',0x0423,0x0306} }, + [0x040F] = { unicodeslot=0x040F, category='lu', adobename='afii10145', contextname='cyrillicDZHE', description='CYRILLIC CAPITAL LETTER DZHE', lccode=0x045F }, + [0x0410] = { unicodeslot=0x0410, category='lu', adobename='afii10017', contextname='cyrillicA', description='CYRILLIC CAPITAL LETTER A', lccode=0x0430 }, + [0x0411] = { unicodeslot=0x0411, category='lu', adobename='afii10018', contextname='cyrillicB', description='CYRILLIC CAPITAL LETTER BE', lccode=0x0431 }, + [0x0412] = { unicodeslot=0x0412, category='lu', adobename='afii10019', contextname='cyrillicV', description='CYRILLIC CAPITAL LETTER VE', lccode=0x0432 }, + [0x0413] = { unicodeslot=0x0413, category='lu', adobename='afii10020', contextname='cyrillicG', description='CYRILLIC CAPITAL LETTER GHE', lccode=0x0433 }, + [0x0414] = { unicodeslot=0x0414, category='lu', adobename='afii10021', contextname='cyrillicD', description='CYRILLIC CAPITAL LETTER DE', lccode=0x0434 }, + [0x0415] = { unicodeslot=0x0415, category='lu', adobename='afii10022', contextname='cyrillicE', description='CYRILLIC CAPITAL LETTER IE', lccode=0x0435 }, + [0x0416] = { unicodeslot=0x0416, category='lu', adobename='afii10024', contextname='cyrillicZH', description='CYRILLIC CAPITAL LETTER ZHE', lccode=0x0436 }, + [0x0417] = { unicodeslot=0x0417, category='lu', adobename='afii10025', contextname='cyrillicZ', description='CYRILLIC CAPITAL LETTER ZE', lccode=0x0437 }, + [0x0418] = { unicodeslot=0x0418, category='lu', adobename='afii10026', contextname='cyrillicI', description='CYRILLIC CAPITAL LETTER I', lccode=0x0438 }, + [0x0419] = { unicodeslot=0x0419, category='lu', adobename='afii10027', contextname='cyrillicISHRT', description='CYRILLIC CAPITAL LETTER SHORT I', lccode=0x0439, specials={'char',0x0418,0x0306} }, + [0x041A] = { unicodeslot=0x041A, category='lu', adobename='afii10028', contextname='cyrillicK', description='CYRILLIC CAPITAL LETTER KA', lccode=0x043A }, + [0x041B] = { unicodeslot=0x041B, category='lu', adobename='afii10029', contextname='cyrillicL', description='CYRILLIC CAPITAL LETTER EL', lccode=0x043B }, + [0x041C] = { unicodeslot=0x041C, category='lu', adobename='afii10030', contextname='cyrillicM', description='CYRILLIC CAPITAL LETTER EM', lccode=0x043C }, + [0x041D] = { unicodeslot=0x041D, category='lu', adobename='afii10031', contextname='cyrillicN', description='CYRILLIC CAPITAL LETTER EN', lccode=0x043D }, + [0x041E] = { unicodeslot=0x041E, category='lu', adobename='afii10032', contextname='cyrillicO', description='CYRILLIC CAPITAL LETTER O', lccode=0x043E }, + [0x041F] = { unicodeslot=0x041F, category='lu', adobename='afii10033', contextname='cyrillicP', description='CYRILLIC CAPITAL LETTER PE', lccode=0x043F }, + [0x0420] = { unicodeslot=0x0420, category='lu', adobename='afii10034', contextname='cyrillicR', description='CYRILLIC CAPITAL LETTER ER', lccode=0x0440 }, + [0x0421] = { unicodeslot=0x0421, category='lu', adobename='afii10035', contextname='cyrillicS', description='CYRILLIC CAPITAL LETTER ES', lccode=0x0441 }, + [0x0422] = { unicodeslot=0x0422, category='lu', adobename='afii10036', contextname='cyrillicT', description='CYRILLIC CAPITAL LETTER TE', lccode=0x0442 }, + [0x0423] = { unicodeslot=0x0423, category='lu', adobename='afii10037', contextname='cyrillicU', description='CYRILLIC CAPITAL LETTER U', lccode=0x0443 }, + [0x0424] = { unicodeslot=0x0424, category='lu', adobename='afii10038', contextname='cyrillicF', description='CYRILLIC CAPITAL LETTER EF', lccode=0x0444 }, + [0x0425] = { unicodeslot=0x0425, category='lu', adobename='afii10039', contextname='cyrillicH', description='CYRILLIC CAPITAL LETTER HA', lccode=0x0445 }, + [0x0426] = { unicodeslot=0x0426, category='lu', adobename='afii10040', contextname='cyrillicC', description='CYRILLIC CAPITAL LETTER TSE', lccode=0x0446 }, + [0x0427] = { unicodeslot=0x0427, category='lu', adobename='afii10041', contextname='cyrillicCH', description='CYRILLIC CAPITAL LETTER CHE', lccode=0x0447 }, + [0x0428] = { unicodeslot=0x0428, category='lu', adobename='afii10042', contextname='cyrillicSH', description='CYRILLIC CAPITAL LETTER SHA', lccode=0x0448 }, + [0x0429] = { unicodeslot=0x0429, category='lu', adobename='afii10043', contextname='cyrillicSHCH', description='CYRILLIC CAPITAL LETTER SHCHA', lccode=0x0449 }, + [0x042A] = { unicodeslot=0x042A, category='lu', adobename='afii10044', contextname='cyrillicHRDSN', description='CYRILLIC CAPITAL LETTER HARD SIGN', lccode=0x044A }, + [0x042B] = { unicodeslot=0x042B, category='lu', adobename='afii10045', contextname='cyrillicERY', description='CYRILLIC CAPITAL LETTER YERU', lccode=0x044B }, + [0x042C] = { unicodeslot=0x042C, category='lu', adobename='afii10046', contextname='cyrillicSFTSN', description='CYRILLIC CAPITAL LETTER SOFT SIGN', lccode=0x044C }, + [0x042D] = { unicodeslot=0x042D, category='lu', adobename='afii10047', contextname='cyrillicEREV', description='CYRILLIC CAPITAL LETTER E', lccode=0x044D }, + [0x042E] = { unicodeslot=0x042E, category='lu', adobename='afii10048', contextname='cyrillicYU', description='CYRILLIC CAPITAL LETTER YU', lccode=0x044E }, + [0x042F] = { unicodeslot=0x042F, category='lu', adobename='afii10049', contextname='cyrillicYA', description='CYRILLIC CAPITAL LETTER YA', lccode=0x044F }, + [0x0430] = { unicodeslot=0x0430, category='ll', adobename='afii10065', contextname='cyrillica', description='CYRILLIC SMALL LETTER A', uccode=0x0410 }, + [0x0431] = { unicodeslot=0x0431, category='ll', adobename='afii10066', contextname='cyrillicb', description='CYRILLIC SMALL LETTER BE', uccode=0x0411 }, + [0x0432] = { unicodeslot=0x0432, category='ll', adobename='afii10067', contextname='cyrillicv', description='CYRILLIC SMALL LETTER VE', uccode=0x0412 }, + [0x0433] = { unicodeslot=0x0433, category='ll', adobename='afii10068', contextname='cyrillicg', description='CYRILLIC SMALL LETTER GHE', uccode=0x0413 }, + [0x0434] = { unicodeslot=0x0434, category='ll', adobename='afii10069', contextname='cyrillicd', description='CYRILLIC SMALL LETTER DE', uccode=0x0414 }, + [0x0435] = { unicodeslot=0x0435, category='ll', adobename='afii10070', contextname='cyrillice', description='CYRILLIC SMALL LETTER IE', uccode=0x0415 }, + [0x0436] = { unicodeslot=0x0436, category='ll', adobename='afii10072', contextname='cyrilliczh', description='CYRILLIC SMALL LETTER ZHE', uccode=0x0416 }, + [0x0437] = { unicodeslot=0x0437, category='ll', adobename='afii10073', contextname='cyrillicz', description='CYRILLIC SMALL LETTER ZE', uccode=0x0417 }, + [0x0438] = { unicodeslot=0x0438, category='ll', adobename='afii10074', contextname='cyrillici', description='CYRILLIC SMALL LETTER I', uccode=0x0418 }, + [0x0439] = { unicodeslot=0x0439, category='ll', adobename='afii10075', contextname='cyrillicishrt', description='CYRILLIC SMALL LETTER SHORT I', uccode=0x0419, specials={'char',0x0438,0x0306} }, + [0x043A] = { unicodeslot=0x043A, category='ll', adobename='afii10076', contextname='cyrillick', description='CYRILLIC SMALL LETTER KA', uccode=0x041A }, + [0x043B] = { unicodeslot=0x043B, category='ll', adobename='afii10077', contextname='cyrillicl', description='CYRILLIC SMALL LETTER EL', uccode=0x041B }, + [0x043C] = { unicodeslot=0x043C, category='ll', adobename='afii10078', contextname='cyrillicm', description='CYRILLIC SMALL LETTER EM', uccode=0x041C }, + [0x043D] = { unicodeslot=0x043D, category='ll', adobename='afii10079', contextname='cyrillicn', description='CYRILLIC SMALL LETTER EN', uccode=0x041D }, + [0x043E] = { unicodeslot=0x043E, category='ll', adobename='afii10080', contextname='cyrillico', description='CYRILLIC SMALL LETTER O', uccode=0x041E }, + [0x043F] = { unicodeslot=0x043F, category='ll', adobename='afii10081', contextname='cyrillicp', description='CYRILLIC SMALL LETTER PE', uccode=0x041F }, + [0x0440] = { unicodeslot=0x0440, category='ll', adobename='afii10082', contextname='cyrillicr', description='CYRILLIC SMALL LETTER ER', uccode=0x0420 }, + [0x0441] = { unicodeslot=0x0441, category='ll', adobename='afii10083', contextname='cyrillics', description='CYRILLIC SMALL LETTER ES', uccode=0x0421 }, + [0x0442] = { unicodeslot=0x0442, category='ll', adobename='afii10084', contextname='cyrillict', description='CYRILLIC SMALL LETTER TE', uccode=0x0422 }, + [0x0443] = { unicodeslot=0x0443, category='ll', adobename='afii10085', contextname='cyrillicu', description='CYRILLIC SMALL LETTER U', uccode=0x0423 }, + [0x0444] = { unicodeslot=0x0444, category='ll', adobename='afii10086', contextname='cyrillicf', description='CYRILLIC SMALL LETTER EF', uccode=0x0424 }, + [0x0445] = { unicodeslot=0x0445, category='ll', adobename='afii10087', contextname='cyrillich', description='CYRILLIC SMALL LETTER HA', uccode=0x0425 }, + [0x0446] = { unicodeslot=0x0446, category='ll', adobename='afii10088', contextname='cyrillicc', description='CYRILLIC SMALL LETTER TSE', uccode=0x0426 }, + [0x0447] = { unicodeslot=0x0447, category='ll', adobename='afii10089', contextname='cyrillicch', description='CYRILLIC SMALL LETTER CHE', uccode=0x0427 }, + [0x0448] = { unicodeslot=0x0448, category='ll', adobename='afii10090', contextname='cyrillicsh', description='CYRILLIC SMALL LETTER SHA', uccode=0x0428 }, + [0x0449] = { unicodeslot=0x0449, category='ll', adobename='afii10091', contextname='cyrillicshch', description='CYRILLIC SMALL LETTER SHCHA', uccode=0x0429 }, + [0x044A] = { unicodeslot=0x044A, category='ll', adobename='afii10092', contextname='cyrillichrdsn', description='CYRILLIC SMALL LETTER HARD SIGN', uccode=0x042A }, + [0x044B] = { unicodeslot=0x044B, category='ll', adobename='afii10093', contextname='cyrillicery', description='CYRILLIC SMALL LETTER YERU', uccode=0x042B }, + [0x044C] = { unicodeslot=0x044C, category='ll', adobename='afii10094', contextname='cyrillicsftsn', description='CYRILLIC SMALL LETTER SOFT SIGN', uccode=0x042C }, + [0x044D] = { unicodeslot=0x044D, category='ll', adobename='afii10095', contextname='cyrillicerev', description='CYRILLIC SMALL LETTER E', uccode=0x042D }, + [0x044E] = { unicodeslot=0x044E, category='ll', adobename='afii10096', contextname='cyrillicyu', description='CYRILLIC SMALL LETTER YU', uccode=0x042E }, + [0x044F] = { unicodeslot=0x044F, category='ll', adobename='afii10097', contextname='cyrillicya', description='CYRILLIC SMALL LETTER YA', uccode=0x042F }, + [0x0450] = { unicodeslot=0x0450, category='ll', contextname='cyrillicegrave', description='CYRILLIC SMALL LETTER IE WITH GRAVE', shcode=0x0435, uccode=0x0400, specials={'char',0x0435,0x0300} }, + [0x0451] = { unicodeslot=0x0451, category='ll', adobename='afii10071', contextname='cyrillicyo', description='CYRILLIC SMALL LETTER IO', uccode=0x0401, specials={'char',0x0435,0x0308} }, + [0x0452] = { unicodeslot=0x0452, category='ll', adobename='afii10099', contextname='cyrillicdje', description='CYRILLIC SMALL LETTER DJE', uccode=0x0402 }, + [0x0453] = { unicodeslot=0x0453, category='ll', adobename='afii10100', contextname='cyrillicgje', description='CYRILLIC SMALL LETTER GJE', uccode=0x0403, specials={'char',0x0433,0x0301} }, + [0x0454] = { unicodeslot=0x0454, category='ll', adobename='afii10101', contextname='cyrillicie', description='CYRILLIC SMALL LETTER UKRAINIAN IE', uccode=0x0404 }, + [0x0455] = { unicodeslot=0x0455, category='ll', adobename='afii10102', contextname='cyrillicdze', description='CYRILLIC SMALL LETTER DZE', uccode=0x0405 }, + [0x0456] = { unicodeslot=0x0456, category='ll', adobename='afii10103', contextname='cyrillicii', description='CYRILLIC SMALL LETTER BYELORUSSIAN-UKRAINIAN I', uccode=0x0406 }, + [0x0457] = { unicodeslot=0x0457, category='ll', adobename='afii10104', contextname='cyrillicyi', description='CYRILLIC SMALL LETTER YI', uccode=0x0407, specials={'char',0x0456,0x0308} }, + [0x0458] = { unicodeslot=0x0458, category='ll', adobename='afii10105', contextname='cyrillicje', description='CYRILLIC SMALL LETTER JE', uccode=0x0408 }, + [0x0459] = { unicodeslot=0x0459, category='ll', adobename='afii10106', contextname='cyrilliclje', description='CYRILLIC SMALL LETTER LJE', uccode=0x0409 }, + [0x045A] = { unicodeslot=0x045A, category='ll', adobename='afii10107', contextname='cyrillicnje', description='CYRILLIC SMALL LETTER NJE', uccode=0x040A }, + [0x045B] = { unicodeslot=0x045B, category='ll', adobename='afii10108', contextname='cyrillictshe', description='CYRILLIC SMALL LETTER TSHE', uccode=0x040B }, + [0x045C] = { unicodeslot=0x045C, category='ll', adobename='afii10109', contextname='cyrillickje', description='CYRILLIC SMALL LETTER KJE', uccode=0x040C, specials={'char',0x043A,0x0301} }, + [0x045D] = { unicodeslot=0x045D, category='ll', contextname='cyrillicigrave', description='CYRILLIC SMALL LETTER I WITH GRAVE', shcode=0x0438, uccode=0x040D, specials={'char',0x0438,0x0300} }, + [0x045E] = { unicodeslot=0x045E, category='ll', adobename='afii10110', contextname='cyrillicushrt', description='CYRILLIC SMALL LETTER SHORT U', uccode=0x040E, specials={'char',0x0443,0x0306} }, + [0x045F] = { unicodeslot=0x045F, category='ll', adobename='afii10193', contextname='cyrillicdzhe', description='CYRILLIC SMALL LETTER DZHE', uccode=0x040F }, + [0x0460] = { unicodeslot=0x0460, category='lu', contextname='cyrillicOMEGA', description='CYRILLIC CAPITAL LETTER OMEGA', lccode=0x0461 }, + [0x0461] = { unicodeslot=0x0461, category='ll', contextname='cyrillicomega', description='CYRILLIC SMALL LETTER OMEGA', uccode=0x0460 }, + [0x0462] = { unicodeslot=0x0462, category='lu', adobename='afii10146', contextname='cyrillicYAT', description='CYRILLIC CAPITAL LETTER YAT', lccode=0x0463 }, + [0x0463] = { unicodeslot=0x0463, category='ll', adobename='afii10194', contextname='cyrillicyat', description='CYRILLIC SMALL LETTER YAT', uccode=0x0462 }, + [0x0464] = { unicodeslot=0x0464, category='lu', contextname='cyrillicEiotified', description='CYRILLIC CAPITAL LETTER IOTIFIED E', lccode=0x0465 }, + [0x0465] = { unicodeslot=0x0465, category='ll', contextname='cyrilliceiotified', description='CYRILLIC SMALL LETTER IOTIFIED E', uccode=0x0464 }, + [0x0466] = { unicodeslot=0x0466, category='lu', contextname='cyrillicLITTLEYUS', description='CYRILLIC CAPITAL LETTER LITTLE YUS', lccode=0x0467 }, + [0x0467] = { unicodeslot=0x0467, category='ll', contextname='cyrilliclittleyus', description='CYRILLIC SMALL LETTER LITTLE YUS', uccode=0x0466 }, + [0x0468] = { unicodeslot=0x0468, category='lu', contextname='cyrillicLITTLEYUSiotified', description='CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS', lccode=0x0469 }, + [0x0469] = { unicodeslot=0x0469, category='ll', contextname='cyrilliclittleyusiotified', description='CYRILLIC SMALL LETTER IOTIFIED LITTLE YUS', uccode=0x0468 }, + [0x046A] = { unicodeslot=0x046A, category='lu', contextname='cyrillicBIGYUS', description='CYRILLIC CAPITAL LETTER BIG YUS', lccode=0x046B }, + [0x046B] = { unicodeslot=0x046B, category='ll', contextname='cyrillicbigyus', description='CYRILLIC SMALL LETTER BIG YUS', uccode=0x046A }, + [0x046C] = { unicodeslot=0x046C, category='lu', contextname='cyrillicBIGYUSiotified', description='CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS', lccode=0x046D }, + [0x046D] = { unicodeslot=0x046D, category='ll', contextname='cyrillicbigyusiotified', description='CYRILLIC SMALL LETTER IOTIFIED BIG YUS', uccode=0x046C }, + [0x046E] = { unicodeslot=0x046E, category='lu', contextname='cyrillicKSI', description='CYRILLIC CAPITAL LETTER KSI', lccode=0x046F }, + [0x046F] = { unicodeslot=0x046F, category='ll', contextname='cyrillicksi', description='CYRILLIC SMALL LETTER KSI', uccode=0x046E }, + [0x0470] = { unicodeslot=0x0470, category='lu', contextname='cyrillicPSI', description='CYRILLIC CAPITAL LETTER PSI', lccode=0x0471 }, + [0x0471] = { unicodeslot=0x0471, category='ll', contextname='cyrillicpsi', description='CYRILLIC SMALL LETTER PSI', uccode=0x0470 }, + [0x0472] = { unicodeslot=0x0472, category='lu', adobename='afii10147', contextname='cyrillicFITA', description='CYRILLIC CAPITAL LETTER FITA', lccode=0x0473 }, + [0x0473] = { unicodeslot=0x0473, category='ll', adobename='afii10195', contextname='cyrillicfita', description='CYRILLIC SMALL LETTER FITA', uccode=0x0472 }, + [0x0474] = { unicodeslot=0x0474, category='lu', adobename='afii10148', contextname='cyrillicIZHITSA', description='CYRILLIC CAPITAL LETTER IZHITSA', lccode=0x0475 }, + [0x0475] = { unicodeslot=0x0475, category='ll', adobename='afii10196', contextname='cyrillicizhitsa', description='CYRILLIC SMALL LETTER IZHITSA', uccode=0x0474 }, + [0x0476] = { unicodeslot=0x0476, category='lu', contextname='cyrillicIZHITSAdoublegrave', description='CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT', shcode=0x0474, lccode=0x0477, specials={'char',0x0474,0x030F} }, + [0x0477] = { unicodeslot=0x0477, category='ll', contextname='cyrillicizhitsadoublegrave', description='CYRILLIC SMALL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT', shcode=0x0475, uccode=0x0476, specials={'char',0x0475,0x030F} }, + [0x0478] = { unicodeslot=0x0478, category='lu', contextname='cyrillicUK', description='CYRILLIC CAPITAL LETTER UK', lccode=0x0479 }, + [0x0479] = { unicodeslot=0x0479, category='ll', contextname='cyrillicuk', description='CYRILLIC SMALL LETTER UK', uccode=0x0478 }, + [0x047A] = { unicodeslot=0x047A, category='lu', contextname='cyrillicOMEGAround', description='CYRILLIC CAPITAL LETTER ROUND OMEGA', lccode=0x047B }, + [0x047B] = { unicodeslot=0x047B, category='ll', contextname='cyrillicomegaround', description='CYRILLIC SMALL LETTER ROUND OMEGA', uccode=0x047A }, + [0x047C] = { unicodeslot=0x047C, category='lu', contextname='cyrillicOMEGAtitlo', description='CYRILLIC CAPITAL LETTER OMEGA WITH TITLO', shcode=0x0460, lccode=0x047D }, + [0x047D] = { unicodeslot=0x047D, category='ll', contextname='cyrillicomegatitlo', description='CYRILLIC SMALL LETTER OMEGA WITH TITLO', shcode=0x0461, uccode=0x047C }, + [0x047E] = { unicodeslot=0x047E, category='lu', contextname='cyrillicOT', description='CYRILLIC CAPITAL LETTER OT', lccode=0x047F }, + [0x047F] = { unicodeslot=0x047F, category='ll', contextname='cyrillicot', description='CYRILLIC SMALL LETTER OT', uccode=0x047E }, + [0x0480] = { unicodeslot=0x0480, category='lu', contextname='cyrillicKOPPA', description='CYRILLIC CAPITAL LETTER KOPPA', lccode=0x0481 }, + [0x0481] = { unicodeslot=0x0481, category='ll', contextname='cyrillickoppa', description='CYRILLIC SMALL LETTER KOPPA', uccode=0x0480 }, + [0x0482] = { unicodeslot=0x0482, category='so', description='CYRILLIC THOUSANDS SIGN' }, + [0x0483] = { unicodeslot=0x0483, category='mn', contextname='cyrillicTITLO', description='COMBINING CYRILLIC TITLO' }, + [0x0484] = { unicodeslot=0x0484, category='mn', contextname='cyrillicPALATALIZATION', description='COMBINING CYRILLIC PALATALIZATION' }, + [0x0485] = { unicodeslot=0x0485, category='mn', contextname='cyrillicDASIAPNEUMATA', description='COMBINING CYRILLIC DASIA PNEUMATA' }, + [0x0486] = { unicodeslot=0x0486, category='mn', contextname='cyrillicPSILIPNEUMATA', description='COMBINING CYRILLIC PSILI PNEUMATA' }, + [0x0488] = { unicodeslot=0x0488, category='me', description='COMBINING CYRILLIC HUNDRED THOUSANDS SIGN' }, + [0x0489] = { unicodeslot=0x0489, category='me', description='COMBINING CYRILLIC MILLIONS SIGN' }, + [0x048A] = { unicodeslot=0x048A, category='lu', contextname='cyrillicISHRTtail', description='CYRILLIC CAPITAL LETTER SHORT I WITH TAIL', lccode=0x048B }, + [0x048B] = { unicodeslot=0x048B, category='ll', contextname='cyrillicishrttail', description='CYRILLIC SMALL LETTER SHORT I WITH TAIL', uccode=0x048A }, + [0x048C] = { unicodeslot=0x048C, category='lu', contextname='cyrillicSEMISOFT', description='CYRILLIC CAPITAL LETTER SEMISOFT SIGN', lccode=0x048D }, + [0x048D] = { unicodeslot=0x048D, category='ll', contextname='cyrillicsemisoft', description='CYRILLIC SMALL LETTER SEMISOFT SIGN', uccode=0x048C }, + [0x048E] = { unicodeslot=0x048E, category='lu', contextname='cyrillicERtick', description='CYRILLIC CAPITAL LETTER ER WITH TICK', shcode=0x0420, lccode=0x048F }, + [0x048F] = { unicodeslot=0x048F, category='ll', contextname='cyrillicertick', description='CYRILLIC SMALL LETTER ER WITH TICK', shcode=0x0440, uccode=0x048E }, + [0x0490] = { unicodeslot=0x0490, category='lu', adobename='afii10050', contextname='cyrillicGHEupturn', description='CYRILLIC CAPITAL LETTER GHE WITH UPTURN', shcode=0x0413, lccode=0x0491 }, + [0x0491] = { unicodeslot=0x0491, category='ll', adobename='afii10098', contextname='cyrillicgheupturn', description='CYRILLIC SMALL LETTER GHE WITH UPTURN', shcode=0x0433, uccode=0x0490 }, + [0x0492] = { unicodeslot=0x0492, category='lu', contextname='cyrillicGHEstroke', description='CYRILLIC CAPITAL LETTER GHE WITH STROKE', shcode=0x0413, lccode=0x0493 }, + [0x0493] = { unicodeslot=0x0493, category='ll', contextname='cyrillicghestroke', description='CYRILLIC SMALL LETTER GHE WITH STROKE', shcode=0x0433, uccode=0x0492 }, + [0x0494] = { unicodeslot=0x0494, category='lu', contextname='cyrillicGHEmidhook', description='CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK', shcode=0x0413, lccode=0x0495 }, + [0x0495] = { unicodeslot=0x0495, category='ll', contextname='cyrillicghemidhook', description='CYRILLIC SMALL LETTER GHE WITH MIDDLE HOOK', shcode=0x0433, uccode=0x0494 }, + [0x0496] = { unicodeslot=0x0496, category='lu', contextname='cyrillicZHEdescender', description='CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER', shcode=0x0416, lccode=0x0497 }, + [0x0497] = { unicodeslot=0x0497, category='ll', contextname='cyrilliczhedescender', description='CYRILLIC SMALL LETTER ZHE WITH DESCENDER', shcode=0x0436, uccode=0x0496 }, + [0x0498] = { unicodeslot=0x0498, category='lu', contextname='cyrillicZDSC', description='CYRILLIC CAPITAL LETTER ZE WITH DESCENDER', shcode=0x0417, lccode=0x0499 }, + [0x0499] = { unicodeslot=0x0499, category='ll', contextname='cyrilliczdsc', description='CYRILLIC SMALL LETTER ZE WITH DESCENDER', shcode=0x0437, uccode=0x0498 }, + [0x049A] = { unicodeslot=0x049A, category='lu', contextname='cyrillicKADC', description='CYRILLIC CAPITAL LETTER KA WITH DESCENDER', shcode=0x041A, lccode=0x049B }, + [0x049B] = { unicodeslot=0x049B, category='ll', contextname='cyrillickadc', description='CYRILLIC SMALL LETTER KA WITH DESCENDER', shcode=0x043A, uccode=0x049A }, + [0x049C] = { unicodeslot=0x049C, category='lu', contextname='cyrillicKAvertstroke', description='CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE', shcode=0x041A, lccode=0x049D }, + [0x049D] = { unicodeslot=0x049D, category='ll', contextname='cyrillickavertstroke', description='CYRILLIC SMALL LETTER KA WITH VERTICAL STROKE', shcode=0x043A, uccode=0x049C }, + [0x049E] = { unicodeslot=0x049E, category='lu', contextname='cyrillicKAstroke', description='CYRILLIC CAPITAL LETTER KA WITH STROKE', shcode=0x041A, lccode=0x049F }, + [0x049F] = { unicodeslot=0x049F, category='ll', contextname='cyrillickastroke', description='CYRILLIC SMALL LETTER KA WITH STROKE', shcode=0x043A, uccode=0x049E }, + [0x04A0] = { unicodeslot=0x04A0, category='lu', contextname='cyrillicKAbashkir', description='CYRILLIC CAPITAL LETTER BASHKIR KA', lccode=0x04A1 }, + [0x04A1] = { unicodeslot=0x04A1, category='ll', contextname='cyrillickabashkir', description='CYRILLIC SMALL LETTER BASHKIR KA', uccode=0x04A0 }, + [0x04A2] = { unicodeslot=0x04A2, category='lu', contextname='cyrillicENDC', description='CYRILLIC CAPITAL LETTER EN WITH DESCENDER', shcode=0x041D, lccode=0x04A3 }, + [0x04A3] = { unicodeslot=0x04A3, category='ll', contextname='cyrillicendc', description='CYRILLIC SMALL LETTER EN WITH DESCENDER', shcode=0x043D, uccode=0x04A2 }, + [0x04A4] = { unicodeslot=0x04A4, category='lu', contextname='cyrillicENGHE', description='CYRILLIC CAPITAL LIGATURE EN GHE', lccode=0x04A5 }, + [0x04A5] = { unicodeslot=0x04A5, category='ll', contextname='cyrillicenghe', description='CYRILLIC SMALL LIGATURE EN GHE', uccode=0x04A4 }, + [0x04A6] = { unicodeslot=0x04A6, category='lu', contextname='cyrillicPEmidhook', description='CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK', shcode=0x041F, lccode=0x04A7 }, + [0x04A7] = { unicodeslot=0x04A7, category='ll', contextname='cyrillicpemidhook', description='CYRILLIC SMALL LETTER PE WITH MIDDLE HOOK', shcode=0x043F, uccode=0x04A6 }, + [0x04A8] = { unicodeslot=0x04A8, category='lu', contextname='cyrillicHA', description='CYRILLIC CAPITAL LETTER ABKHASIAN HA', lccode=0x04A9 }, + [0x04A9] = { unicodeslot=0x04A9, category='ll', contextname='cyrillicha', description='CYRILLIC SMALL LETTER ABKHASIAN HA', uccode=0x04A8 }, + [0x04AA] = { unicodeslot=0x04AA, category='lu', contextname='cyrillicSDSC', description='CYRILLIC CAPITAL LETTER ES WITH DESCENDER', shcode=0x0421, lccode=0x04AB }, + [0x04AB] = { unicodeslot=0x04AB, category='ll', contextname='cyrillicsdsc', description='CYRILLIC SMALL LETTER ES WITH DESCENDER', shcode=0x0441, uccode=0x04AA }, + [0x04AC] = { unicodeslot=0x04AC, category='lu', contextname='cyrillicTEDC', description='CYRILLIC CAPITAL LETTER TE WITH DESCENDER', shcode=0x0422, lccode=0x04AD }, + [0x04AD] = { unicodeslot=0x04AD, category='ll', contextname='cyrillictedc', description='CYRILLIC SMALL LETTER TE WITH DESCENDER', shcode=0x0442, uccode=0x04AC }, + [0x04AE] = { unicodeslot=0x04AE, category='lu', contextname='cyrillicYstr', description='CYRILLIC CAPITAL LETTER STRAIGHT U', lccode=0x04AF }, + [0x04AF] = { unicodeslot=0x04AF, category='ll', contextname='cyrillicystr', description='CYRILLIC SMALL LETTER STRAIGHT U', uccode=0x04AE }, + [0x04B0] = { unicodeslot=0x04B0, category='lu', contextname='cyrillicYstrstroke', description='CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE', lccode=0x04B1 }, + [0x04B1] = { unicodeslot=0x04B1, category='ll', contextname='cyrillicystrstroke', description='CYRILLIC SMALL LETTER STRAIGHT U WITH STROKE', uccode=0x04B0 }, + [0x04B2] = { unicodeslot=0x04B2, category='lu', contextname='cyrillicHADC', description='CYRILLIC CAPITAL LETTER HA WITH DESCENDER', shcode=0x0425, lccode=0x04B3 }, + [0x04B3] = { unicodeslot=0x04B3, category='ll', contextname='cyrillichadc', description='CYRILLIC SMALL LETTER HA WITH DESCENDER', shcode=0x0445, uccode=0x04B2 }, + [0x04B4] = { unicodeslot=0x04B4, category='lu', contextname='cyrillicTETSE', description='CYRILLIC CAPITAL LIGATURE TE TSE', lccode=0x04B5 }, + [0x04B5] = { unicodeslot=0x04B5, category='ll', contextname='cyrillictetse', description='CYRILLIC SMALL LIGATURE TE TSE', uccode=0x04B4 }, + [0x04B6] = { unicodeslot=0x04B6, category='lu', contextname='cyrillicCHEDC', description='CYRILLIC CAPITAL LETTER CHE WITH DESCENDER', shcode=0x0427, lccode=0x04B7 }, + [0x04B7] = { unicodeslot=0x04B7, category='ll', contextname='cyrillicchedc', description='CYRILLIC SMALL LETTER CHE WITH DESCENDER', shcode=0x0447, uccode=0x04B6 }, + [0x04B8] = { unicodeslot=0x04B8, category='lu', contextname='cyrillicCHEvertstroke', description='CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE', shcode=0x0427, lccode=0x04B9 }, + [0x04B9] = { unicodeslot=0x04B9, category='ll', contextname='cyrillicchevertstroke', description='CYRILLIC SMALL LETTER CHE WITH VERTICAL STROKE', shcode=0x0447, uccode=0x04B8 }, + [0x04BA] = { unicodeslot=0x04BA, category='lu', contextname='cyrillicSHHA', description='CYRILLIC CAPITAL LETTER SHHA', lccode=0x04BB }, + [0x04BB] = { unicodeslot=0x04BB, category='ll', contextname='cyrillicshha', description='CYRILLIC SMALL LETTER SHHA', uccode=0x04BA }, + [0x04BC] = { unicodeslot=0x04BC, category='lu', contextname='cyrillicCHEabkhasian', description='CYRILLIC CAPITAL LETTER ABKHASIAN CHE', lccode=0x04BD }, + [0x04BD] = { unicodeslot=0x04BD, category='ll', contextname='cyrilliccheabkhasian', description='CYRILLIC SMALL LETTER ABKHASIAN CHE', uccode=0x04BC }, + [0x04BE] = { unicodeslot=0x04BE, category='lu', contextname='cyrillicCHEDCabkhasian', description='CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER', lccode=0x04BF }, + [0x04BF] = { unicodeslot=0x04BF, category='ll', contextname='cyrillicchedcabkhasian', description='CYRILLIC SMALL LETTER ABKHASIAN CHE WITH DESCENDER', uccode=0x04BE }, + [0x04C0] = { unicodeslot=0x04C0, category='lu', contextname='cyrillicPALOCHKA', description='CYRILLIC LETTER PALOCHKA', lccode=0x04CF }, + [0x04C1] = { unicodeslot=0x04C1, category='lu', contextname='cyrillicZHEbreve', description='CYRILLIC CAPITAL LETTER ZHE WITH BREVE', shcode=0x0416, lccode=0x04C2, specials={'char',0x0416,0x0306} }, + [0x04C2] = { unicodeslot=0x04C2, category='ll', contextname='cyrilliczhebreve', description='CYRILLIC SMALL LETTER ZHE WITH BREVE', shcode=0x0436, uccode=0x04C1, specials={'char',0x0436,0x0306} }, + [0x04C3] = { unicodeslot=0x04C3, category='lu', contextname='cyrillicKAhook', description='CYRILLIC CAPITAL LETTER KA WITH HOOK', shcode=0x041A, lccode=0x04C4 }, + [0x04C4] = { unicodeslot=0x04C4, category='ll', contextname='cyrillickahook', description='CYRILLIC SMALL LETTER KA WITH HOOK', shcode=0x043A, uccode=0x04C3 }, + [0x04C5] = { unicodeslot=0x04C5, category='lu', contextname='cyrillicELtail', description='CYRILLIC CAPITAL LETTER EL WITH TAIL', shcode=0x041B, lccode=0x04C6 }, + [0x04C6] = { unicodeslot=0x04C6, category='ll', contextname='cyrilliceltail', description='CYRILLIC SMALL LETTER EL WITH TAIL', shcode=0x043B, uccode=0x04C5 }, + [0x04C7] = { unicodeslot=0x04C7, category='lu', contextname='cyrillicENhook', description='CYRILLIC CAPITAL LETTER EN WITH HOOK', shcode=0x041D, lccode=0x04C8 }, + [0x04C8] = { unicodeslot=0x04C8, category='ll', contextname='cyrillicenhook', description='CYRILLIC SMALL LETTER EN WITH HOOK', shcode=0x043D, uccode=0x04C7 }, + [0x04C9] = { unicodeslot=0x04C9, category='lu', contextname='cyrillicENtail', description='CYRILLIC CAPITAL LETTER EN WITH TAIL', shcode=0x041D, lccode=0x04CA }, + [0x04CA] = { unicodeslot=0x04CA, category='ll', contextname='cyrillicentail', description='CYRILLIC SMALL LETTER EN WITH TAIL', shcode=0x043D, uccode=0x04C9 }, + [0x04CB] = { unicodeslot=0x04CB, category='lu', contextname='cyrillicCHEkhakassian', description='CYRILLIC CAPITAL LETTER KHAKASSIAN CHE', lccode=0x04CC }, + [0x04CC] = { unicodeslot=0x04CC, category='ll', contextname='cyrillicchekhakassian', description='CYRILLIC SMALL LETTER KHAKASSIAN CHE', uccode=0x04CB }, + [0x04CD] = { unicodeslot=0x04CD, category='lu', contextname='cyrillicEMtail', description='CYRILLIC CAPITAL LETTER EM WITH TAIL', shcode=0x041C, lccode=0x04CE }, + [0x04CE] = { unicodeslot=0x04CE, category='ll', contextname='cyrillicemtail', description='CYRILLIC SMALL LETTER EM WITH TAIL', shcode=0x043C, uccode=0x04CD }, + [0x04CF] = { unicodeslot=0x04CF, category='ll', description='CYRILLIC SMALL LETTER PALOCHKA', uccode=0x04C0 }, + [0x04D0] = { unicodeslot=0x04D0, category='lu', contextname='cyrillicAbreve', description='CYRILLIC CAPITAL LETTER A WITH BREVE', shcode=0x0410, lccode=0x04D1, specials={'char',0x0410,0x0306} }, + [0x04D1] = { unicodeslot=0x04D1, category='ll', contextname='cyrillicabreve', description='CYRILLIC SMALL LETTER A WITH BREVE', shcode=0x0430, uccode=0x04D0, specials={'char',0x0430,0x0306} }, + [0x04D2] = { unicodeslot=0x04D2, category='lu', contextname='cyrillicAdiaeresis', description='CYRILLIC CAPITAL LETTER A WITH DIAERESIS', shcode=0x0410, lccode=0x04D3, specials={'char',0x0410,0x0308} }, + [0x04D3] = { unicodeslot=0x04D3, category='ll', contextname='cyrillicadiaeresis', description='CYRILLIC SMALL LETTER A WITH DIAERESIS', shcode=0x0430, uccode=0x04D2, specials={'char',0x0430,0x0308} }, + [0x04D4] = { unicodeslot=0x04D4, category='lu', contextname='cyrillicAE', description='CYRILLIC CAPITAL LIGATURE A IE', lccode=0x04D5 }, + [0x04D5] = { unicodeslot=0x04D5, category='ll', contextname='cyrillicae', description='CYRILLIC SMALL LIGATURE A IE', uccode=0x04D4 }, + [0x04D6] = { unicodeslot=0x04D6, category='lu', contextname='cyrillicEbreve', description='CYRILLIC CAPITAL LETTER IE WITH BREVE', shcode=0x0415, lccode=0x04D7, specials={'char',0x0415,0x0306} }, + [0x04D7] = { unicodeslot=0x04D7, category='ll', contextname='cyrillicebreve', description='CYRILLIC SMALL LETTER IE WITH BREVE', shcode=0x0435, uccode=0x04D6, specials={'char',0x0435,0x0306} }, + [0x04D8] = { unicodeslot=0x04D8, category='lu', contextname='cyrillicSCHWA', description='CYRILLIC CAPITAL LETTER SCHWA', lccode=0x04D9 }, + [0x04D9] = { unicodeslot=0x04D9, category='ll', adobename='afii10846', contextname='cyrillicschwa', description='CYRILLIC SMALL LETTER SCHWA', uccode=0x04D8 }, + [0x04DA] = { unicodeslot=0x04DA, category='lu', contextname='cyrillicSCHWAdiaeresis', description='CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS', shcode=0x04D8, lccode=0x04DB, specials={'char',0x04D8,0x0308} }, + [0x04DB] = { unicodeslot=0x04DB, category='ll', contextname='cyrillicschwadiaeresis', description='CYRILLIC SMALL LETTER SCHWA WITH DIAERESIS', shcode=0x04D9, uccode=0x04DA, specials={'char',0x04D9,0x0308} }, + [0x04DC] = { unicodeslot=0x04DC, category='lu', contextname='cyrillicZHEdiaeresis', description='CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS', shcode=0x0416, lccode=0x04DD, specials={'char',0x0416,0x0308} }, + [0x04DD] = { unicodeslot=0x04DD, category='ll', contextname='cyrilliczhediaeresis', description='CYRILLIC SMALL LETTER ZHE WITH DIAERESIS', shcode=0x0436, uccode=0x04DC, specials={'char',0x0436,0x0308} }, + [0x04DE] = { unicodeslot=0x04DE, category='lu', contextname='cyrillicZEdiaeresis', description='CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS', shcode=0x0417, lccode=0x04DF, specials={'char',0x0417,0x0308} }, + [0x04DF] = { unicodeslot=0x04DF, category='ll', contextname='cyrilliczediaeresis', description='CYRILLIC SMALL LETTER ZE WITH DIAERESIS', shcode=0x0437, uccode=0x04DE, specials={'char',0x0437,0x0308} }, + [0x04E0] = { unicodeslot=0x04E0, category='lu', contextname='cyrillicDZEabkhasian', description='CYRILLIC CAPITAL LETTER ABKHASIAN DZE', lccode=0x04E1 }, + [0x04E1] = { unicodeslot=0x04E1, category='ll', contextname='cyrillicdzeabkhasian', description='CYRILLIC SMALL LETTER ABKHASIAN DZE', uccode=0x04E0 }, + [0x04E2] = { unicodeslot=0x04E2, category='lu', contextname='cyrillicImacron', description='CYRILLIC CAPITAL LETTER I WITH MACRON', shcode=0x0418, lccode=0x04E3, specials={'char',0x0418,0x0304} }, + [0x04E3] = { unicodeslot=0x04E3, category='ll', contextname='cyrillicimacron', description='CYRILLIC SMALL LETTER I WITH MACRON', shcode=0x0438, uccode=0x04E2, specials={'char',0x0438,0x0304} }, + [0x04E4] = { unicodeslot=0x04E4, category='lu', contextname='cyrillicIdiaeresis', description='CYRILLIC CAPITAL LETTER I WITH DIAERESIS', shcode=0x0418, lccode=0x04E5, specials={'char',0x0418,0x0308} }, + [0x04E5] = { unicodeslot=0x04E5, category='ll', contextname='cyrillicidiaeresis', description='CYRILLIC SMALL LETTER I WITH DIAERESIS', shcode=0x0438, uccode=0x04E4, specials={'char',0x0438,0x0308} }, + [0x04E6] = { unicodeslot=0x04E6, category='lu', contextname='cyrillicOdiaeresis', description='CYRILLIC CAPITAL LETTER O WITH DIAERESIS', shcode=0x041E, lccode=0x04E7, specials={'char',0x041E,0x0308} }, + [0x04E7] = { unicodeslot=0x04E7, category='ll', contextname='cyrillicodiaeresis', description='CYRILLIC SMALL LETTER O WITH DIAERESIS', shcode=0x043E, uccode=0x04E6, specials={'char',0x043E,0x0308} }, + [0x04E8] = { unicodeslot=0x04E8, category='lu', contextname='cyrillicObarred', description='CYRILLIC CAPITAL LETTER BARRED O', lccode=0x04E9 }, + [0x04E9] = { unicodeslot=0x04E9, category='ll', contextname='cyrillicobarred', description='CYRILLIC SMALL LETTER BARRED O', uccode=0x04E8 }, + [0x04EA] = { unicodeslot=0x04EA, category='lu', contextname='cyrillicObarreddiaeresis', description='CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS', lccode=0x04EB, specials={'char',0x04E8,0x0308} }, + [0x04EB] = { unicodeslot=0x04EB, category='ll', contextname='cyrillicobarreddiaeresis', description='CYRILLIC SMALL LETTER BARRED O WITH DIAERESIS', uccode=0x04EA, specials={'char',0x04E9,0x0308} }, + [0x04EC] = { unicodeslot=0x04EC, category='lu', contextname='cyrillicEdiaeresis', description='CYRILLIC CAPITAL LETTER E WITH DIAERESIS', shcode=0x042D, lccode=0x04ED, specials={'char',0x042D,0x0308} }, + [0x04ED] = { unicodeslot=0x04ED, category='ll', contextname='cyrillicediaeresis', description='CYRILLIC SMALL LETTER E WITH DIAERESIS', shcode=0x044D, uccode=0x04EC, specials={'char',0x044D,0x0308} }, + [0x04EE] = { unicodeslot=0x04EE, category='lu', contextname='cyrillicUmacron', description='CYRILLIC CAPITAL LETTER U WITH MACRON', shcode=0x0423, lccode=0x04EF, specials={'char',0x0423,0x0304} }, + [0x04EF] = { unicodeslot=0x04EF, category='ll', contextname='cyrillicumacron', description='CYRILLIC SMALL LETTER U WITH MACRON', shcode=0x0443, uccode=0x04EE, specials={'char',0x0443,0x0304} }, + [0x04F0] = { unicodeslot=0x04F0, category='lu', contextname='cyrillicUdiaeresis', description='CYRILLIC CAPITAL LETTER U WITH DIAERESIS', shcode=0x0423, lccode=0x04F1, specials={'char',0x0423,0x0308} }, + [0x04F1] = { unicodeslot=0x04F1, category='ll', contextname='cyrillicudiaeresis', description='CYRILLIC SMALL LETTER U WITH DIAERESIS', shcode=0x0443, uccode=0x04F0, specials={'char',0x0443,0x0308} }, + [0x04F2] = { unicodeslot=0x04F2, category='lu', contextname='cyrillicUdoubleacute', description='CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE', shcode=0x0423, lccode=0x04F3, specials={'char',0x0423,0x030B} }, + [0x04F3] = { unicodeslot=0x04F3, category='ll', contextname='cyrillicudoubleacute', description='CYRILLIC SMALL LETTER U WITH DOUBLE ACUTE', shcode=0x0443, uccode=0x04F2, specials={'char',0x0443,0x030B} }, + [0x04F4] = { unicodeslot=0x04F4, category='lu', contextname='cyrillicCHEdiaeresis', description='CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS', shcode=0x0427, lccode=0x04F5, specials={'char',0x0427,0x0308} }, + [0x04F5] = { unicodeslot=0x04F5, category='ll', contextname='cyrillicchediaeresis', description='CYRILLIC SMALL LETTER CHE WITH DIAERESIS', shcode=0x0447, uccode=0x04F4, specials={'char',0x0447,0x0308} }, + [0x04F6] = { unicodeslot=0x04F6, category='lu', description='CYRILLIC CAPITAL LETTER GHE WITH DESCENDER', shcode=0x0413, lccode=0x04F7 }, + [0x04F7] = { unicodeslot=0x04F7, category='ll', description='CYRILLIC SMALL LETTER GHE WITH DESCENDER', shcode=0x0433, uccode=0x04F6 }, + [0x04F8] = { unicodeslot=0x04F8, category='lu', contextname='cyrillicYERUdiaeresis', description='CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS', shcode=0x042B, lccode=0x04F9, specials={'char',0x042B,0x0308} }, + [0x04F9] = { unicodeslot=0x04F9, category='ll', contextname='cyrillicyerudiaeresis', description='CYRILLIC SMALL LETTER YERU WITH DIAERESIS', shcode=0x044B, uccode=0x04F8, specials={'char',0x044B,0x0308} }, + [0x04FA] = { unicodeslot=0x04FA, category='lu', description='CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK', shcode=0x0413, lccode=0x04FB }, + [0x04FB] = { unicodeslot=0x04FB, category='ll', description='CYRILLIC SMALL LETTER GHE WITH STROKE AND HOOK', shcode=0x0433, uccode=0x04FA }, + [0x04FC] = { unicodeslot=0x04FC, category='lu', description='CYRILLIC CAPITAL LETTER HA WITH HOOK', shcode=0x0425, lccode=0x04FD }, + [0x04FD] = { unicodeslot=0x04FD, category='ll', description='CYRILLIC SMALL LETTER HA WITH HOOK', shcode=0x0445, uccode=0x04FC }, + [0x04FE] = { unicodeslot=0x04FE, category='lu', description='CYRILLIC CAPITAL LETTER HA WITH STROKE', shcode=0x0425, lccode=0x04FF }, + [0x04FF] = { unicodeslot=0x04FF, category='ll', description='CYRILLIC SMALL LETTER HA WITH STROKE', shcode=0x0445, uccode=0x04FE }, + [0x0500] = { unicodeslot=0x0500, category='lu', description='CYRILLIC CAPITAL LETTER KOMI DE', lccode=0x0501 }, + [0x0501] = { unicodeslot=0x0501, category='ll', description='CYRILLIC SMALL LETTER KOMI DE', uccode=0x0500 }, + [0x0502] = { unicodeslot=0x0502, category='lu', description='CYRILLIC CAPITAL LETTER KOMI DJE', lccode=0x0503 }, + [0x0503] = { unicodeslot=0x0503, category='ll', description='CYRILLIC SMALL LETTER KOMI DJE', uccode=0x0502 }, + [0x0504] = { unicodeslot=0x0504, category='lu', description='CYRILLIC CAPITAL LETTER KOMI ZJE', lccode=0x0505 }, + [0x0505] = { unicodeslot=0x0505, category='ll', description='CYRILLIC SMALL LETTER KOMI ZJE', uccode=0x0504 }, + [0x0506] = { unicodeslot=0x0506, category='lu', description='CYRILLIC CAPITAL LETTER KOMI DZJE', lccode=0x0507 }, + [0x0507] = { unicodeslot=0x0507, category='ll', description='CYRILLIC SMALL LETTER KOMI DZJE', uccode=0x0506 }, + [0x0508] = { unicodeslot=0x0508, category='lu', description='CYRILLIC CAPITAL LETTER KOMI LJE', lccode=0x0509 }, + [0x0509] = { unicodeslot=0x0509, category='ll', description='CYRILLIC SMALL LETTER KOMI LJE', uccode=0x0508 }, + [0x050A] = { unicodeslot=0x050A, category='lu', description='CYRILLIC CAPITAL LETTER KOMI NJE', lccode=0x050B }, + [0x050B] = { unicodeslot=0x050B, category='ll', description='CYRILLIC SMALL LETTER KOMI NJE', uccode=0x050A }, + [0x050C] = { unicodeslot=0x050C, category='lu', description='CYRILLIC CAPITAL LETTER KOMI SJE', lccode=0x050D }, + [0x050D] = { unicodeslot=0x050D, category='ll', description='CYRILLIC SMALL LETTER KOMI SJE', uccode=0x050C }, + [0x050E] = { unicodeslot=0x050E, category='lu', description='CYRILLIC CAPITAL LETTER KOMI TJE', lccode=0x050F }, + [0x050F] = { unicodeslot=0x050F, category='ll', description='CYRILLIC SMALL LETTER KOMI TJE', uccode=0x050E }, + [0x0510] = { unicodeslot=0x0510, category='lu', description='CYRILLIC CAPITAL LETTER REVERSED ZE', lccode=0x0511 }, + [0x0511] = { unicodeslot=0x0511, category='ll', description='CYRILLIC SMALL LETTER REVERSED ZE', uccode=0x0510 }, + [0x0512] = { unicodeslot=0x0512, category='lu', description='CYRILLIC CAPITAL LETTER EL WITH HOOK', shcode=0x041B, lccode=0x0513 }, + [0x0513] = { unicodeslot=0x0513, category='ll', description='CYRILLIC SMALL LETTER EL WITH HOOK', shcode=0x043B, uccode=0x0512 }, + [0x0531] = { unicodeslot=0x0531, category='lu', description='ARMENIAN CAPITAL LETTER AYB', lccode=0x0561 }, + [0x0532] = { unicodeslot=0x0532, category='lu', description='ARMENIAN CAPITAL LETTER BEN', lccode=0x0562 }, + [0x0533] = { unicodeslot=0x0533, category='lu', description='ARMENIAN CAPITAL LETTER GIM', lccode=0x0563 }, + [0x0534] = { unicodeslot=0x0534, category='lu', description='ARMENIAN CAPITAL LETTER DA', lccode=0x0564 }, + [0x0535] = { unicodeslot=0x0535, category='lu', description='ARMENIAN CAPITAL LETTER ECH', lccode=0x0565 }, + [0x0536] = { unicodeslot=0x0536, category='lu', description='ARMENIAN CAPITAL LETTER ZA', lccode=0x0566 }, + [0x0537] = { unicodeslot=0x0537, category='lu', description='ARMENIAN CAPITAL LETTER EH', lccode=0x0567 }, + [0x0538] = { unicodeslot=0x0538, category='lu', description='ARMENIAN CAPITAL LETTER ET', lccode=0x0568 }, + [0x0539] = { unicodeslot=0x0539, category='lu', description='ARMENIAN CAPITAL LETTER TO', lccode=0x0569 }, + [0x053A] = { unicodeslot=0x053A, category='lu', description='ARMENIAN CAPITAL LETTER ZHE', lccode=0x056A }, + [0x053B] = { unicodeslot=0x053B, category='lu', description='ARMENIAN CAPITAL LETTER INI', lccode=0x056B }, + [0x053C] = { unicodeslot=0x053C, category='lu', description='ARMENIAN CAPITAL LETTER LIWN', lccode=0x056C }, + [0x053D] = { unicodeslot=0x053D, category='lu', description='ARMENIAN CAPITAL LETTER XEH', lccode=0x056D }, + [0x053E] = { unicodeslot=0x053E, category='lu', description='ARMENIAN CAPITAL LETTER CA', lccode=0x056E }, + [0x053F] = { unicodeslot=0x053F, category='lu', description='ARMENIAN CAPITAL LETTER KEN', lccode=0x056F }, + [0x0540] = { unicodeslot=0x0540, category='lu', description='ARMENIAN CAPITAL LETTER HO', lccode=0x0570 }, + [0x0541] = { unicodeslot=0x0541, category='lu', description='ARMENIAN CAPITAL LETTER JA', lccode=0x0571 }, + [0x0542] = { unicodeslot=0x0542, category='lu', description='ARMENIAN CAPITAL LETTER GHAD', lccode=0x0572 }, + [0x0543] = { unicodeslot=0x0543, category='lu', description='ARMENIAN CAPITAL LETTER CHEH', lccode=0x0573 }, + [0x0544] = { unicodeslot=0x0544, category='lu', description='ARMENIAN CAPITAL LETTER MEN', lccode=0x0574 }, + [0x0545] = { unicodeslot=0x0545, category='lu', description='ARMENIAN CAPITAL LETTER YI', lccode=0x0575 }, + [0x0546] = { unicodeslot=0x0546, category='lu', description='ARMENIAN CAPITAL LETTER NOW', lccode=0x0576 }, + [0x0547] = { unicodeslot=0x0547, category='lu', description='ARMENIAN CAPITAL LETTER SHA', lccode=0x0577 }, + [0x0548] = { unicodeslot=0x0548, category='lu', description='ARMENIAN CAPITAL LETTER VO', lccode=0x0578 }, + [0x0549] = { unicodeslot=0x0549, category='lu', description='ARMENIAN CAPITAL LETTER CHA', lccode=0x0579 }, + [0x054A] = { unicodeslot=0x054A, category='lu', description='ARMENIAN CAPITAL LETTER PEH', lccode=0x057A }, + [0x054B] = { unicodeslot=0x054B, category='lu', description='ARMENIAN CAPITAL LETTER JHEH', lccode=0x057B }, + [0x054C] = { unicodeslot=0x054C, category='lu', description='ARMENIAN CAPITAL LETTER RA', lccode=0x057C }, + [0x054D] = { unicodeslot=0x054D, category='lu', description='ARMENIAN CAPITAL LETTER SEH', lccode=0x057D }, + [0x054E] = { unicodeslot=0x054E, category='lu', description='ARMENIAN CAPITAL LETTER VEW', lccode=0x057E }, + [0x054F] = { unicodeslot=0x054F, category='lu', description='ARMENIAN CAPITAL LETTER TIWN', lccode=0x057F }, + [0x0550] = { unicodeslot=0x0550, category='lu', description='ARMENIAN CAPITAL LETTER REH', lccode=0x0580 }, + [0x0551] = { unicodeslot=0x0551, category='lu', description='ARMENIAN CAPITAL LETTER CO', lccode=0x0581 }, + [0x0552] = { unicodeslot=0x0552, category='lu', description='ARMENIAN CAPITAL LETTER YIWN', lccode=0x0582 }, + [0x0553] = { unicodeslot=0x0553, category='lu', description='ARMENIAN CAPITAL LETTER PIWR', lccode=0x0583 }, + [0x0554] = { unicodeslot=0x0554, category='lu', description='ARMENIAN CAPITAL LETTER KEH', lccode=0x0584 }, + [0x0555] = { unicodeslot=0x0555, category='lu', description='ARMENIAN CAPITAL LETTER OH', lccode=0x0585 }, + [0x0556] = { unicodeslot=0x0556, category='lu', description='ARMENIAN CAPITAL LETTER FEH', lccode=0x0586 }, + [0x0559] = { unicodeslot=0x0559, category='lm', description='ARMENIAN MODIFIER LETTER LEFT HALF RING' }, + [0x055A] = { unicodeslot=0x055A, category='po', description='ARMENIAN APOSTROPHE' }, + [0x055B] = { unicodeslot=0x055B, category='po', description='ARMENIAN EMPHASIS MARK' }, + [0x055C] = { unicodeslot=0x055C, category='po', description='ARMENIAN EXCLAMATION MARK' }, + [0x055D] = { unicodeslot=0x055D, category='po', description='ARMENIAN COMMA' }, + [0x055E] = { unicodeslot=0x055E, category='po', description='ARMENIAN QUESTION MARK' }, + [0x055F] = { unicodeslot=0x055F, category='po', description='ARMENIAN ABBREVIATION MARK' }, + [0x0561] = { unicodeslot=0x0561, category='ll', description='ARMENIAN SMALL LETTER AYB', uccode=0x0531 }, + [0x0562] = { unicodeslot=0x0562, category='ll', description='ARMENIAN SMALL LETTER BEN', uccode=0x0532 }, + [0x0563] = { unicodeslot=0x0563, category='ll', description='ARMENIAN SMALL LETTER GIM', uccode=0x0533 }, + [0x0564] = { unicodeslot=0x0564, category='ll', description='ARMENIAN SMALL LETTER DA', uccode=0x0534 }, + [0x0565] = { unicodeslot=0x0565, category='ll', description='ARMENIAN SMALL LETTER ECH', uccode=0x0535 }, + [0x0566] = { unicodeslot=0x0566, category='ll', description='ARMENIAN SMALL LETTER ZA', uccode=0x0536 }, + [0x0567] = { unicodeslot=0x0567, category='ll', description='ARMENIAN SMALL LETTER EH', uccode=0x0537 }, + [0x0568] = { unicodeslot=0x0568, category='ll', description='ARMENIAN SMALL LETTER ET', uccode=0x0538 }, + [0x0569] = { unicodeslot=0x0569, category='ll', description='ARMENIAN SMALL LETTER TO', uccode=0x0539 }, + [0x056A] = { unicodeslot=0x056A, category='ll', description='ARMENIAN SMALL LETTER ZHE', uccode=0x053A }, + [0x056B] = { unicodeslot=0x056B, category='ll', description='ARMENIAN SMALL LETTER INI', uccode=0x053B }, + [0x056C] = { unicodeslot=0x056C, category='ll', description='ARMENIAN SMALL LETTER LIWN', uccode=0x053C }, + [0x056D] = { unicodeslot=0x056D, category='ll', description='ARMENIAN SMALL LETTER XEH', uccode=0x053D }, + [0x056E] = { unicodeslot=0x056E, category='ll', description='ARMENIAN SMALL LETTER CA', uccode=0x053E }, + [0x056F] = { unicodeslot=0x056F, category='ll', description='ARMENIAN SMALL LETTER KEN', uccode=0x053F }, + [0x0570] = { unicodeslot=0x0570, category='ll', description='ARMENIAN SMALL LETTER HO', uccode=0x0540 }, + [0x0571] = { unicodeslot=0x0571, category='ll', description='ARMENIAN SMALL LETTER JA', uccode=0x0541 }, + [0x0572] = { unicodeslot=0x0572, category='ll', description='ARMENIAN SMALL LETTER GHAD', uccode=0x0542 }, + [0x0573] = { unicodeslot=0x0573, category='ll', description='ARMENIAN SMALL LETTER CHEH', uccode=0x0543 }, + [0x0574] = { unicodeslot=0x0574, category='ll', description='ARMENIAN SMALL LETTER MEN', uccode=0x0544 }, + [0x0575] = { unicodeslot=0x0575, category='ll', description='ARMENIAN SMALL LETTER YI', uccode=0x0545 }, + [0x0576] = { unicodeslot=0x0576, category='ll', description='ARMENIAN SMALL LETTER NOW', uccode=0x0546 }, + [0x0577] = { unicodeslot=0x0577, category='ll', description='ARMENIAN SMALL LETTER SHA', uccode=0x0547 }, + [0x0578] = { unicodeslot=0x0578, category='ll', description='ARMENIAN SMALL LETTER VO', uccode=0x0548 }, + [0x0579] = { unicodeslot=0x0579, category='ll', description='ARMENIAN SMALL LETTER CHA', uccode=0x0549 }, + [0x057A] = { unicodeslot=0x057A, category='ll', description='ARMENIAN SMALL LETTER PEH', uccode=0x054A }, + [0x057B] = { unicodeslot=0x057B, category='ll', description='ARMENIAN SMALL LETTER JHEH', uccode=0x054B }, + [0x057C] = { unicodeslot=0x057C, category='ll', description='ARMENIAN SMALL LETTER RA', uccode=0x054C }, + [0x057D] = { unicodeslot=0x057D, category='ll', description='ARMENIAN SMALL LETTER SEH', uccode=0x054D }, + [0x057E] = { unicodeslot=0x057E, category='ll', description='ARMENIAN SMALL LETTER VEW', uccode=0x054E }, + [0x057F] = { unicodeslot=0x057F, category='ll', description='ARMENIAN SMALL LETTER TIWN', uccode=0x054F }, + [0x0580] = { unicodeslot=0x0580, category='ll', description='ARMENIAN SMALL LETTER REH', uccode=0x0550 }, + [0x0581] = { unicodeslot=0x0581, category='ll', description='ARMENIAN SMALL LETTER CO', uccode=0x0551 }, + [0x0582] = { unicodeslot=0x0582, category='ll', description='ARMENIAN SMALL LETTER YIWN', uccode=0x0552 }, + [0x0583] = { unicodeslot=0x0583, category='ll', description='ARMENIAN SMALL LETTER PIWR', uccode=0x0553 }, + [0x0584] = { unicodeslot=0x0584, category='ll', description='ARMENIAN SMALL LETTER KEH', uccode=0x0554 }, + [0x0585] = { unicodeslot=0x0585, category='ll', description='ARMENIAN SMALL LETTER OH', uccode=0x0555 }, + [0x0586] = { unicodeslot=0x0586, category='ll', description='ARMENIAN SMALL LETTER FEH', uccode=0x0556 }, + [0x0587] = { unicodeslot=0x0587, category='ll', description='ARMENIAN SMALL LIGATURE ECH YIWN', specials={'compat',0x0565,0x0582} }, + [0x0589] = { unicodeslot=0x0589, category='po', description='ARMENIAN FULL STOP' }, + [0x058A] = { unicodeslot=0x058A, category='pd', description='ARMENIAN HYPHEN' }, + [0x0591] = { unicodeslot=0x0591, category='mn', description='HEBREW ACCENT ETNAHTA' }, + [0x0592] = { unicodeslot=0x0592, category='mn', description='HEBREW ACCENT SEGOL' }, + [0x0593] = { unicodeslot=0x0593, category='mn', description='HEBREW ACCENT SHALSHELET' }, + [0x0594] = { unicodeslot=0x0594, category='mn', description='HEBREW ACCENT ZAQEF QATAN' }, + [0x0595] = { unicodeslot=0x0595, category='mn', description='HEBREW ACCENT ZAQEF GADOL' }, + [0x0596] = { unicodeslot=0x0596, category='mn', description='HEBREW ACCENT TIPEHA' }, + [0x0597] = { unicodeslot=0x0597, category='mn', description='HEBREW ACCENT REVIA' }, + [0x0598] = { unicodeslot=0x0598, category='mn', description='HEBREW ACCENT ZARQA' }, + [0x0599] = { unicodeslot=0x0599, category='mn', description='HEBREW ACCENT PASHTA' }, + [0x059A] = { unicodeslot=0x059A, category='mn', description='HEBREW ACCENT YETIV' }, + [0x059B] = { unicodeslot=0x059B, category='mn', description='HEBREW ACCENT TEVIR' }, + [0x059C] = { unicodeslot=0x059C, category='mn', description='HEBREW ACCENT GERESH' }, + [0x059D] = { unicodeslot=0x059D, category='mn', description='HEBREW ACCENT GERESH MUQDAM' }, + [0x059E] = { unicodeslot=0x059E, category='mn', description='HEBREW ACCENT GERSHAYIM' }, + [0x059F] = { unicodeslot=0x059F, category='mn', description='HEBREW ACCENT QARNEY PARA' }, + [0x05A0] = { unicodeslot=0x05A0, category='mn', description='HEBREW ACCENT TELISHA GEDOLA' }, + [0x05A1] = { unicodeslot=0x05A1, category='mn', description='HEBREW ACCENT PAZER' }, + [0x05A2] = { unicodeslot=0x05A2, category='mn', description='HEBREW ACCENT ATNAH HAFUKH' }, + [0x05A3] = { unicodeslot=0x05A3, category='mn', description='HEBREW ACCENT MUNAH' }, + [0x05A4] = { unicodeslot=0x05A4, category='mn', description='HEBREW ACCENT MAHAPAKH' }, + [0x05A5] = { unicodeslot=0x05A5, category='mn', description='HEBREW ACCENT MERKHA' }, + [0x05A6] = { unicodeslot=0x05A6, category='mn', description='HEBREW ACCENT MERKHA KEFULA' }, + [0x05A7] = { unicodeslot=0x05A7, category='mn', description='HEBREW ACCENT DARGA' }, + [0x05A8] = { unicodeslot=0x05A8, category='mn', description='HEBREW ACCENT QADMA' }, + [0x05A9] = { unicodeslot=0x05A9, category='mn', description='HEBREW ACCENT TELISHA QETANA' }, + [0x05AA] = { unicodeslot=0x05AA, category='mn', description='HEBREW ACCENT YERAH BEN YOMO' }, + [0x05AB] = { unicodeslot=0x05AB, category='mn', description='HEBREW ACCENT OLE' }, + [0x05AC] = { unicodeslot=0x05AC, category='mn', description='HEBREW ACCENT ILUY' }, + [0x05AD] = { unicodeslot=0x05AD, category='mn', description='HEBREW ACCENT DEHI' }, + [0x05AE] = { unicodeslot=0x05AE, category='mn', description='HEBREW ACCENT ZINOR' }, + [0x05AF] = { unicodeslot=0x05AF, category='mn', description='HEBREW MARK MASORA CIRCLE' }, + [0x05B0] = { unicodeslot=0x05B0, category='mn', adobename='afii57799', description='HEBREW POINT SHEVA' }, + [0x05B1] = { unicodeslot=0x05B1, category='mn', adobename='afii57801', description='HEBREW POINT HATAF SEGOL' }, + [0x05B2] = { unicodeslot=0x05B2, category='mn', adobename='afii57800', description='HEBREW POINT HATAF PATAH' }, + [0x05B3] = { unicodeslot=0x05B3, category='mn', adobename='afii57802', description='HEBREW POINT HATAF QAMATS' }, + [0x05B4] = { unicodeslot=0x05B4, category='mn', adobename='afii57793', description='HEBREW POINT HIRIQ' }, + [0x05B5] = { unicodeslot=0x05B5, category='mn', adobename='afii57794', description='HEBREW POINT TSERE' }, + [0x05B6] = { unicodeslot=0x05B6, category='mn', adobename='afii57795', description='HEBREW POINT SEGOL' }, + [0x05B7] = { unicodeslot=0x05B7, category='mn', adobename='afii57798', description='HEBREW POINT PATAH' }, + [0x05B8] = { unicodeslot=0x05B8, category='mn', adobename='afii57797', description='HEBREW POINT QAMATS' }, + [0x05B9] = { unicodeslot=0x05B9, category='mn', adobename='afii57806', description='HEBREW POINT HOLAM' }, + [0x05BA] = { unicodeslot=0x05BA, category='mn', description='HEBREW POINT HOLAM HASER FOR VAV' }, + [0x05BB] = { unicodeslot=0x05BB, category='mn', adobename='afii57796', description='HEBREW POINT QUBUTS' }, + [0x05BC] = { unicodeslot=0x05BC, category='mn', adobename='afii57807', description='HEBREW POINT DAGESH OR MAPIQ' }, + [0x05BD] = { unicodeslot=0x05BD, category='mn', adobename='afii57839', description='HEBREW POINT METEG' }, + [0x05BE] = { unicodeslot=0x05BE, category='po', adobename='afii57645', description='HEBREW PUNCTUATION MAQAF' }, + [0x05BF] = { unicodeslot=0x05BF, category='mn', adobename='afii57841', description='HEBREW POINT RAFE' }, + [0x05C0] = { unicodeslot=0x05C0, category='po', adobename='afii57842', description='HEBREW PUNCTUATION PASEQ' }, + [0x05C1] = { unicodeslot=0x05C1, category='mn', adobename='afii57804', description='HEBREW POINT SHIN DOT' }, + [0x05C2] = { unicodeslot=0x05C2, category='mn', adobename='afii57803', description='HEBREW POINT SIN DOT' }, + [0x05C3] = { unicodeslot=0x05C3, category='po', adobename='afii57658', description='HEBREW PUNCTUATION SOF PASUQ' }, + [0x05C4] = { unicodeslot=0x05C4, category='mn', description='HEBREW MARK UPPER DOT' }, + [0x05C5] = { unicodeslot=0x05C5, category='mn', description='HEBREW MARK LOWER DOT' }, + [0x05C6] = { unicodeslot=0x05C6, category='po', description='HEBREW PUNCTUATION NUN HAFUKHA' }, + [0x05C7] = { unicodeslot=0x05C7, category='mn', description='HEBREW POINT QAMATS QATAN' }, + [0x05D0] = { unicodeslot=0x05D0, category='lo', adobename='afii57664', contextname='hebrewAlef', description='HEBREW LETTER ALEF' }, + [0x05D1] = { unicodeslot=0x05D1, category='lo', adobename='afii57665', contextname='hebrewBet', description='HEBREW LETTER BET' }, + [0x05D2] = { unicodeslot=0x05D2, category='lo', adobename='afii57666', contextname='hebrewGimel', description='HEBREW LETTER GIMEL' }, + [0x05D3] = { unicodeslot=0x05D3, category='lo', adobename='afii57667', contextname='hebrewDalet', description='HEBREW LETTER DALET' }, + [0x05D4] = { unicodeslot=0x05D4, category='lo', adobename='afii57668', contextname='hebrewHe', description='HEBREW LETTER HE' }, + [0x05D5] = { unicodeslot=0x05D5, category='lo', adobename='afii57669', contextname='hebrewVav', description='HEBREW LETTER VAV' }, + [0x05D6] = { unicodeslot=0x05D6, category='lo', adobename='afii57670', contextname='hebrewZayin', description='HEBREW LETTER ZAYIN' }, + [0x05D7] = { unicodeslot=0x05D7, category='lo', adobename='afii57671', contextname='hebrewHet', description='HEBREW LETTER HET' }, + [0x05D8] = { unicodeslot=0x05D8, category='lo', adobename='afii57672', contextname='hebrewTet', description='HEBREW LETTER TET' }, + [0x05D9] = { unicodeslot=0x05D9, category='lo', adobename='afii57673', contextname='hebrewYod', description='HEBREW LETTER YOD' }, + [0x05DA] = { unicodeslot=0x05DA, category='lo', adobename='afii57674', contextname='hebrewKaffinal', description='HEBREW LETTER FINAL KAF' }, + [0x05DB] = { unicodeslot=0x05DB, category='lo', adobename='afii57675', contextname='hebrewKaf', description='HEBREW LETTER KAF' }, + [0x05DC] = { unicodeslot=0x05DC, category='lo', adobename='afii57676', contextname='hebrewLamed', description='HEBREW LETTER LAMED' }, + [0x05DD] = { unicodeslot=0x05DD, category='lo', adobename='afii57677', contextname='hebrewMemfinal', description='HEBREW LETTER FINAL MEM' }, + [0x05DE] = { unicodeslot=0x05DE, category='lo', adobename='afii57678', contextname='hebrewMem', description='HEBREW LETTER MEM' }, + [0x05DF] = { unicodeslot=0x05DF, category='lo', adobename='afii57679', contextname='hebrewNunfinal', description='HEBREW LETTER FINAL NUN' }, + [0x05E0] = { unicodeslot=0x05E0, category='lo', adobename='afii57680', contextname='hebrewNun', description='HEBREW LETTER NUN' }, + [0x05E1] = { unicodeslot=0x05E1, category='lo', adobename='afii57681', contextname='hebrewSamekh', description='HEBREW LETTER SAMEKH' }, + [0x05E2] = { unicodeslot=0x05E2, category='lo', adobename='afii57682', contextname='hebrewAyin', description='HEBREW LETTER AYIN' }, + [0x05E3] = { unicodeslot=0x05E3, category='lo', adobename='afii57683', contextname='hebrewPefinal', description='HEBREW LETTER FINAL PE' }, + [0x05E4] = { unicodeslot=0x05E4, category='lo', adobename='afii57684', contextname='hebrewPe', description='HEBREW LETTER PE' }, + [0x05E5] = { unicodeslot=0x05E5, category='lo', adobename='afii57685', contextname='hebrewTsadifinal', description='HEBREW LETTER FINAL TSADI' }, + [0x05E6] = { unicodeslot=0x05E6, category='lo', adobename='afii57686', contextname='hebrewTsadi', description='HEBREW LETTER TSADI' }, + [0x05E7] = { unicodeslot=0x05E7, category='lo', adobename='afii57687', contextname='hebrewQof', description='HEBREW LETTER QOF' }, + [0x05E8] = { unicodeslot=0x05E8, category='lo', adobename='afii57688', contextname='hebrewResh', description='HEBREW LETTER RESH' }, + [0x05E9] = { unicodeslot=0x05E9, category='lo', adobename='afii57689', contextname='hebrewShin', description='HEBREW LETTER SHIN' }, + [0x05EA] = { unicodeslot=0x05EA, category='lo', adobename='afii57690', contextname='hebrewTav', description='HEBREW LETTER TAV' }, + [0x05F0] = { unicodeslot=0x05F0, category='lo', adobename='afii57716', description='HEBREW LIGATURE YIDDISH DOUBLE VAV' }, + [0x05F1] = { unicodeslot=0x05F1, category='lo', adobename='afii57717', description='HEBREW LIGATURE YIDDISH VAV YOD' }, + [0x05F2] = { unicodeslot=0x05F2, category='lo', adobename='afii57718', description='HEBREW LIGATURE YIDDISH DOUBLE YOD' }, + [0x05F3] = { unicodeslot=0x05F3, category='po', description='HEBREW PUNCTUATION GERESH' }, + [0x05F4] = { unicodeslot=0x05F4, category='po', description='HEBREW PUNCTUATION GERSHAYIM' }, + [0x0600] = { unicodeslot=0x0600, category='cf', description='ARABIC NUMBER SIGN' }, + [0x0601] = { unicodeslot=0x0601, category='cf', description='ARABIC SIGN SANAH' }, + [0x0602] = { unicodeslot=0x0602, category='cf', description='ARABIC FOOTNOTE MARKER' }, + [0x0603] = { unicodeslot=0x0603, category='cf', description='ARABIC SIGN SAFHA' }, + [0x060B] = { unicodeslot=0x060B, category='sc', description='AFGHANI SIGN' }, + [0x060C] = { unicodeslot=0x060C, category='po', adobename='afii57388', description='ARABIC COMMA' }, + [0x060D] = { unicodeslot=0x060D, category='po', description='ARABIC DATE SEPARATOR' }, + [0x060E] = { unicodeslot=0x060E, category='so', description='ARABIC POETIC VERSE SIGN' }, + [0x060F] = { unicodeslot=0x060F, category='so', description='ARABIC SIGN MISRA' }, + [0x0610] = { unicodeslot=0x0610, category='mn', description='ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM' }, + [0x0611] = { unicodeslot=0x0611, category='mn', description='ARABIC SIGN ALAYHE ASSALLAM' }, + [0x0612] = { unicodeslot=0x0612, category='mn', description='ARABIC SIGN RAHMATULLAH ALAYHE' }, + [0x0613] = { unicodeslot=0x0613, category='mn', description='ARABIC SIGN RADI ALLAHOU ANHU' }, + [0x0614] = { unicodeslot=0x0614, category='mn', description='ARABIC SIGN TAKHALLUS' }, + [0x0615] = { unicodeslot=0x0615, category='mn', description='ARABIC SMALL HIGH TAH' }, + [0x061B] = { unicodeslot=0x061B, category='po', adobename='afii57403', description='ARABIC SEMICOLON' }, + [0x061E] = { unicodeslot=0x061E, category='po', description='ARABIC TRIPLE DOT PUNCTUATION MARK' }, + [0x061F] = { unicodeslot=0x061F, category='po', adobename='afii57407', description='ARABIC QUESTION MARK' }, + [0x0621] = { unicodeslot=0x0621, category='lo', adobename='afii57409', description='ARABIC LETTER HAMZA' }, + [0x0622] = { unicodeslot=0x0622, category='lo', adobename='afii57410', description='ARABIC LETTER ALEF WITH MADDA ABOVE', shcode=0x0627, specials={'char',0x0627,0x0653} }, + [0x0623] = { unicodeslot=0x0623, category='lo', adobename='afii57411', description='ARABIC LETTER ALEF WITH HAMZA ABOVE', shcode=0x0627, specials={'char',0x0627,0x0654} }, + [0x0624] = { unicodeslot=0x0624, category='lo', adobename='afii57412', description='ARABIC LETTER WAW WITH HAMZA ABOVE', shcode=0x0648, specials={'char',0x0648,0x0654} }, + [0x0625] = { unicodeslot=0x0625, category='lo', adobename='afii57413', description='ARABIC LETTER ALEF WITH HAMZA BELOW', shcode=0x0627, specials={'char',0x0627,0x0655} }, + [0x0626] = { unicodeslot=0x0626, category='lo', adobename='afii57414', description='ARABIC LETTER YEH WITH HAMZA ABOVE', shcode=0x064A, specials={'char',0x064A,0x0654} }, + [0x0627] = { unicodeslot=0x0627, category='lo', adobename='afii57415', description='ARABIC LETTER ALEF' }, + [0x0628] = { unicodeslot=0x0628, category='lo', adobename='afii57416', description='ARABIC LETTER BEH' }, + [0x0629] = { unicodeslot=0x0629, category='lo', adobename='afii57417', description='ARABIC LETTER TEH MARBUTA' }, + [0x062A] = { unicodeslot=0x062A, category='lo', adobename='afii57418', description='ARABIC LETTER TEH' }, + [0x062B] = { unicodeslot=0x062B, category='lo', adobename='afii57419', description='ARABIC LETTER THEH' }, + [0x062C] = { unicodeslot=0x062C, category='lo', adobename='afii57420', description='ARABIC LETTER JEEM' }, + [0x062D] = { unicodeslot=0x062D, category='lo', adobename='afii57421', description='ARABIC LETTER HAH' }, + [0x062E] = { unicodeslot=0x062E, category='lo', adobename='afii57422', description='ARABIC LETTER KHAH' }, + [0x062F] = { unicodeslot=0x062F, category='lo', adobename='afii57423', description='ARABIC LETTER DAL' }, + [0x0630] = { unicodeslot=0x0630, category='lo', adobename='afii57424', description='ARABIC LETTER THAL' }, + [0x0631] = { unicodeslot=0x0631, category='lo', adobename='afii57425', description='ARABIC LETTER REH' }, + [0x0632] = { unicodeslot=0x0632, category='lo', adobename='afii57426', description='ARABIC LETTER ZAIN' }, + [0x0633] = { unicodeslot=0x0633, category='lo', adobename='afii57427', description='ARABIC LETTER SEEN' }, + [0x0634] = { unicodeslot=0x0634, category='lo', adobename='afii57428', description='ARABIC LETTER SHEEN' }, + [0x0635] = { unicodeslot=0x0635, category='lo', adobename='afii57429', description='ARABIC LETTER SAD' }, + [0x0636] = { unicodeslot=0x0636, category='lo', adobename='afii57430', description='ARABIC LETTER DAD' }, + [0x0637] = { unicodeslot=0x0637, category='lo', adobename='afii57431', description='ARABIC LETTER TAH' }, + [0x0638] = { unicodeslot=0x0638, category='lo', adobename='afii57432', description='ARABIC LETTER ZAH' }, + [0x0639] = { unicodeslot=0x0639, category='lo', adobename='afii57433', description='ARABIC LETTER AIN' }, + [0x063A] = { unicodeslot=0x063A, category='lo', adobename='afii57434', description='ARABIC LETTER GHAIN' }, + [0x0640] = { unicodeslot=0x0640, category='lm', adobename='afii57440', description='ARABIC TATWEEL' }, + [0x0641] = { unicodeslot=0x0641, category='lo', adobename='afii57441', description='ARABIC LETTER FEH' }, + [0x0642] = { unicodeslot=0x0642, category='lo', adobename='afii57442', description='ARABIC LETTER QAF' }, + [0x0643] = { unicodeslot=0x0643, category='lo', adobename='afii57443', description='ARABIC LETTER KAF' }, + [0x0644] = { unicodeslot=0x0644, category='lo', adobename='afii57444', description='ARABIC LETTER LAM' }, + [0x0645] = { unicodeslot=0x0645, category='lo', adobename='afii57445', description='ARABIC LETTER MEEM' }, + [0x0646] = { unicodeslot=0x0646, category='lo', adobename='afii57446', description='ARABIC LETTER NOON' }, + [0x0647] = { unicodeslot=0x0647, category='lo', adobename='afii57470', description='ARABIC LETTER HEH' }, + [0x0648] = { unicodeslot=0x0648, category='lo', adobename='afii57448', description='ARABIC LETTER WAW' }, + [0x0649] = { unicodeslot=0x0649, category='lo', adobename='afii57449', description='ARABIC LETTER ALEF MAKSURA' }, + [0x064A] = { unicodeslot=0x064A, category='lo', adobename='afii57450', description='ARABIC LETTER YEH' }, + [0x064B] = { unicodeslot=0x064B, category='mn', adobename='afii57451', description='ARABIC FATHATAN' }, + [0x064C] = { unicodeslot=0x064C, category='mn', adobename='afii57452', description='ARABIC DAMMATAN' }, + [0x064D] = { unicodeslot=0x064D, category='mn', adobename='afii57453', description='ARABIC KASRATAN' }, + [0x064E] = { unicodeslot=0x064E, category='mn', adobename='afii57454', description='ARABIC FATHA' }, + [0x064F] = { unicodeslot=0x064F, category='mn', adobename='afii57455', description='ARABIC DAMMA' }, + [0x0650] = { unicodeslot=0x0650, category='mn', adobename='afii57456', description='ARABIC KASRA' }, + [0x0651] = { unicodeslot=0x0651, category='mn', adobename='afii57457', description='ARABIC SHADDA' }, + [0x0652] = { unicodeslot=0x0652, category='mn', adobename='afii57458', description='ARABIC SUKUN' }, + [0x0653] = { unicodeslot=0x0653, category='mn', description='ARABIC MADDAH ABOVE' }, + [0x0654] = { unicodeslot=0x0654, category='mn', description='ARABIC HAMZA ABOVE' }, + [0x0655] = { unicodeslot=0x0655, category='mn', description='ARABIC HAMZA BELOW' }, + [0x0656] = { unicodeslot=0x0656, category='mn', description='ARABIC SUBSCRIPT ALEF' }, + [0x0657] = { unicodeslot=0x0657, category='mn', description='ARABIC INVERTED DAMMA' }, + [0x0658] = { unicodeslot=0x0658, category='mn', description='ARABIC MARK NOON GHUNNA' }, + [0x0659] = { unicodeslot=0x0659, category='mn', description='ARABIC ZWARAKAY' }, + [0x065A] = { unicodeslot=0x065A, category='mn', description='ARABIC VOWEL SIGN SMALL V ABOVE' }, + [0x065B] = { unicodeslot=0x065B, category='mn', description='ARABIC VOWEL SIGN INVERTED SMALL V ABOVE' }, + [0x065C] = { unicodeslot=0x065C, category='mn', description='ARABIC VOWEL SIGN DOT BELOW' }, + [0x065D] = { unicodeslot=0x065D, category='mn', description='ARABIC REVERSED DAMMA' }, + [0x065E] = { unicodeslot=0x065E, category='mn', description='ARABIC FATHA WITH TWO DOTS' }, + [0x0660] = { unicodeslot=0x0660, category='nd', adobename='afii57392', description='ARABIC-INDIC DIGIT ZERO' }, + [0x0661] = { unicodeslot=0x0661, category='nd', adobename='afii57393', description='ARABIC-INDIC DIGIT ONE' }, + [0x0662] = { unicodeslot=0x0662, category='nd', adobename='afii57394', description='ARABIC-INDIC DIGIT TWO' }, + [0x0663] = { unicodeslot=0x0663, category='nd', adobename='afii57395', description='ARABIC-INDIC DIGIT THREE' }, + [0x0664] = { unicodeslot=0x0664, category='nd', adobename='afii57396', description='ARABIC-INDIC DIGIT FOUR' }, + [0x0665] = { unicodeslot=0x0665, category='nd', adobename='afii57397', description='ARABIC-INDIC DIGIT FIVE' }, + [0x0666] = { unicodeslot=0x0666, category='nd', adobename='afii57398', description='ARABIC-INDIC DIGIT SIX' }, + [0x0667] = { unicodeslot=0x0667, category='nd', adobename='afii57399', description='ARABIC-INDIC DIGIT SEVEN' }, + [0x0668] = { unicodeslot=0x0668, category='nd', adobename='afii57400', description='ARABIC-INDIC DIGIT EIGHT' }, + [0x0669] = { unicodeslot=0x0669, category='nd', adobename='afii57401', description='ARABIC-INDIC DIGIT NINE' }, + [0x066A] = { unicodeslot=0x066A, category='po', adobename='afii57381', description='ARABIC PERCENT SIGN' }, + [0x066B] = { unicodeslot=0x066B, category='po', description='ARABIC DECIMAL SEPARATOR' }, + [0x066C] = { unicodeslot=0x066C, category='po', description='ARABIC THOUSANDS SEPARATOR' }, + [0x066D] = { unicodeslot=0x066D, category='po', adobename='afii63167', description='ARABIC FIVE POINTED STAR' }, + [0x066E] = { unicodeslot=0x066E, category='lo', description='ARABIC LETTER DOTLESS BEH' }, + [0x066F] = { unicodeslot=0x066F, category='lo', description='ARABIC LETTER DOTLESS QAF' }, + [0x0670] = { unicodeslot=0x0670, category='mn', description='ARABIC LETTER SUPERSCRIPT ALEF' }, + [0x0671] = { unicodeslot=0x0671, category='lo', description='ARABIC LETTER ALEF WASLA' }, + [0x0672] = { unicodeslot=0x0672, category='lo', description='ARABIC LETTER ALEF WITH WAVY HAMZA ABOVE', shcode=0x0627 }, + [0x0673] = { unicodeslot=0x0673, category='lo', description='ARABIC LETTER ALEF WITH WAVY HAMZA BELOW', shcode=0x0627 }, + [0x0674] = { unicodeslot=0x0674, category='lo', description='ARABIC LETTER HIGH HAMZA' }, + [0x0675] = { unicodeslot=0x0675, category='lo', description='ARABIC LETTER HIGH HAMZA ALEF', specials={'compat',0x0627,0x0674} }, + [0x0676] = { unicodeslot=0x0676, category='lo', description='ARABIC LETTER HIGH HAMZA WAW', specials={'compat',0x0648,0x0674} }, + [0x0677] = { unicodeslot=0x0677, category='lo', description='ARABIC LETTER U WITH HAMZA ABOVE', shcode=0x06C7, specials={'compat',0x06C7,0x0674} }, + [0x0678] = { unicodeslot=0x0678, category='lo', description='ARABIC LETTER HIGH HAMZA YEH', specials={'compat',0x064A,0x0674} }, + [0x0679] = { unicodeslot=0x0679, category='lo', adobename='afii57511', description='ARABIC LETTER TTEH' }, + [0x067A] = { unicodeslot=0x067A, category='lo', description='ARABIC LETTER TTEHEH' }, + [0x067B] = { unicodeslot=0x067B, category='lo', description='ARABIC LETTER BEEH' }, + [0x067C] = { unicodeslot=0x067C, category='lo', description='ARABIC LETTER TEH WITH RING', shcode=0x062A }, + [0x067D] = { unicodeslot=0x067D, category='lo', description='ARABIC LETTER TEH WITH THREE DOTS ABOVE DOWNWARDS', shcode=0x062A }, + [0x067E] = { unicodeslot=0x067E, category='lo', adobename='afii57506', description='ARABIC LETTER PEH' }, + [0x067F] = { unicodeslot=0x067F, category='lo', description='ARABIC LETTER TEHEH' }, + [0x0680] = { unicodeslot=0x0680, category='lo', description='ARABIC LETTER BEHEH' }, + [0x0681] = { unicodeslot=0x0681, category='lo', description='ARABIC LETTER HAH WITH HAMZA ABOVE', shcode=0x062D }, + [0x0682] = { unicodeslot=0x0682, category='lo', description='ARABIC LETTER HAH WITH TWO DOTS VERTICAL ABOVE', shcode=0x062D }, + [0x0683] = { unicodeslot=0x0683, category='lo', description='ARABIC LETTER NYEH' }, + [0x0684] = { unicodeslot=0x0684, category='lo', description='ARABIC LETTER DYEH' }, + [0x0685] = { unicodeslot=0x0685, category='lo', description='ARABIC LETTER HAH WITH THREE DOTS ABOVE', shcode=0x062D }, + [0x0686] = { unicodeslot=0x0686, category='lo', adobename='afii57507', description='ARABIC LETTER TCHEH' }, + [0x0687] = { unicodeslot=0x0687, category='lo', description='ARABIC LETTER TCHEHEH' }, + [0x0688] = { unicodeslot=0x0688, category='lo', adobename='afii57512', description='ARABIC LETTER DDAL' }, + [0x0689] = { unicodeslot=0x0689, category='lo', description='ARABIC LETTER DAL WITH RING', shcode=0x062F }, + [0x068A] = { unicodeslot=0x068A, category='lo', description='ARABIC LETTER DAL WITH DOT BELOW', shcode=0x062F }, + [0x068B] = { unicodeslot=0x068B, category='lo', description='ARABIC LETTER DAL WITH DOT BELOW AND SMALL TAH', shcode=0x062F }, + [0x068C] = { unicodeslot=0x068C, category='lo', description='ARABIC LETTER DAHAL' }, + [0x068D] = { unicodeslot=0x068D, category='lo', description='ARABIC LETTER DDAHAL' }, + [0x068E] = { unicodeslot=0x068E, category='lo', description='ARABIC LETTER DUL' }, + [0x068F] = { unicodeslot=0x068F, category='lo', description='ARABIC LETTER DAL WITH THREE DOTS ABOVE DOWNWARDS', shcode=0x062F }, + [0x0690] = { unicodeslot=0x0690, category='lo', description='ARABIC LETTER DAL WITH FOUR DOTS ABOVE', shcode=0x062F }, + [0x0691] = { unicodeslot=0x0691, category='lo', adobename='afii57513', description='ARABIC LETTER RREH' }, + [0x0692] = { unicodeslot=0x0692, category='lo', description='ARABIC LETTER REH WITH SMALL V', shcode=0x0631 }, + [0x0693] = { unicodeslot=0x0693, category='lo', description='ARABIC LETTER REH WITH RING', shcode=0x0631 }, + [0x0694] = { unicodeslot=0x0694, category='lo', description='ARABIC LETTER REH WITH DOT BELOW', shcode=0x0631 }, + [0x0695] = { unicodeslot=0x0695, category='lo', description='ARABIC LETTER REH WITH SMALL V BELOW', shcode=0x0631 }, + [0x0696] = { unicodeslot=0x0696, category='lo', description='ARABIC LETTER REH WITH DOT BELOW AND DOT ABOVE', shcode=0x0631 }, + [0x0697] = { unicodeslot=0x0697, category='lo', description='ARABIC LETTER REH WITH TWO DOTS ABOVE', shcode=0x0631 }, + [0x0698] = { unicodeslot=0x0698, category='lo', adobename='afii57508', description='ARABIC LETTER JEH' }, + [0x0699] = { unicodeslot=0x0699, category='lo', description='ARABIC LETTER REH WITH FOUR DOTS ABOVE', shcode=0x0631 }, + [0x069A] = { unicodeslot=0x069A, category='lo', description='ARABIC LETTER SEEN WITH DOT BELOW AND DOT ABOVE', shcode=0x0633 }, + [0x069B] = { unicodeslot=0x069B, category='lo', description='ARABIC LETTER SEEN WITH THREE DOTS BELOW', shcode=0x0633 }, + [0x069C] = { unicodeslot=0x069C, category='lo', description='ARABIC LETTER SEEN WITH THREE DOTS BELOW AND THREE DOTS ABOVE', shcode=0x0633 }, + [0x069D] = { unicodeslot=0x069D, category='lo', description='ARABIC LETTER SAD WITH TWO DOTS BELOW', shcode=0x0635 }, + [0x069E] = { unicodeslot=0x069E, category='lo', description='ARABIC LETTER SAD WITH THREE DOTS ABOVE', shcode=0x0635 }, + [0x069F] = { unicodeslot=0x069F, category='lo', description='ARABIC LETTER TAH WITH THREE DOTS ABOVE', shcode=0x0637 }, + [0x06A0] = { unicodeslot=0x06A0, category='lo', description='ARABIC LETTER AIN WITH THREE DOTS ABOVE', shcode=0x0639 }, + [0x06A1] = { unicodeslot=0x06A1, category='lo', description='ARABIC LETTER DOTLESS FEH' }, + [0x06A2] = { unicodeslot=0x06A2, category='lo', description='ARABIC LETTER FEH WITH DOT MOVED BELOW', shcode=0x0641 }, + [0x06A3] = { unicodeslot=0x06A3, category='lo', description='ARABIC LETTER FEH WITH DOT BELOW', shcode=0x0641 }, + [0x06A4] = { unicodeslot=0x06A4, category='lo', adobename='afii57505', description='ARABIC LETTER VEH' }, + [0x06A5] = { unicodeslot=0x06A5, category='lo', description='ARABIC LETTER FEH WITH THREE DOTS BELOW', shcode=0x0641 }, + [0x06A6] = { unicodeslot=0x06A6, category='lo', description='ARABIC LETTER PEHEH' }, + [0x06A7] = { unicodeslot=0x06A7, category='lo', description='ARABIC LETTER QAF WITH DOT ABOVE', shcode=0x0642 }, + [0x06A8] = { unicodeslot=0x06A8, category='lo', description='ARABIC LETTER QAF WITH THREE DOTS ABOVE', shcode=0x0642 }, + [0x06A9] = { unicodeslot=0x06A9, category='lo', description='ARABIC LETTER KEHEH' }, + [0x06AA] = { unicodeslot=0x06AA, category='lo', description='ARABIC LETTER SWASH KAF' }, + [0x06AB] = { unicodeslot=0x06AB, category='lo', description='ARABIC LETTER KAF WITH RING', shcode=0x0643 }, + [0x06AC] = { unicodeslot=0x06AC, category='lo', description='ARABIC LETTER KAF WITH DOT ABOVE', shcode=0x0643 }, + [0x06AD] = { unicodeslot=0x06AD, category='lo', description='ARABIC LETTER NG' }, + [0x06AE] = { unicodeslot=0x06AE, category='lo', description='ARABIC LETTER KAF WITH THREE DOTS BELOW', shcode=0x0643 }, + [0x06AF] = { unicodeslot=0x06AF, category='lo', adobename='afii57509', description='ARABIC LETTER GAF' }, + [0x06B0] = { unicodeslot=0x06B0, category='lo', description='ARABIC LETTER GAF WITH RING', shcode=0x06AF }, + [0x06B1] = { unicodeslot=0x06B1, category='lo', description='ARABIC LETTER NGOEH' }, + [0x06B2] = { unicodeslot=0x06B2, category='lo', description='ARABIC LETTER GAF WITH TWO DOTS BELOW', shcode=0x06AF }, + [0x06B3] = { unicodeslot=0x06B3, category='lo', description='ARABIC LETTER GUEH' }, + [0x06B4] = { unicodeslot=0x06B4, category='lo', description='ARABIC LETTER GAF WITH THREE DOTS ABOVE', shcode=0x06AF }, + [0x06B5] = { unicodeslot=0x06B5, category='lo', description='ARABIC LETTER LAM WITH SMALL V', shcode=0x0644 }, + [0x06B6] = { unicodeslot=0x06B6, category='lo', description='ARABIC LETTER LAM WITH DOT ABOVE', shcode=0x0644 }, + [0x06B7] = { unicodeslot=0x06B7, category='lo', description='ARABIC LETTER LAM WITH THREE DOTS ABOVE', shcode=0x0644 }, + [0x06B8] = { unicodeslot=0x06B8, category='lo', description='ARABIC LETTER LAM WITH THREE DOTS BELOW', shcode=0x0644 }, + [0x06B9] = { unicodeslot=0x06B9, category='lo', description='ARABIC LETTER NOON WITH DOT BELOW', shcode=0x0646 }, + [0x06BA] = { unicodeslot=0x06BA, category='lo', adobename='afii57514', description='ARABIC LETTER NOON GHUNNA' }, + [0x06BB] = { unicodeslot=0x06BB, category='lo', description='ARABIC LETTER RNOON' }, + [0x06BC] = { unicodeslot=0x06BC, category='lo', description='ARABIC LETTER NOON WITH RING', shcode=0x0646 }, + [0x06BD] = { unicodeslot=0x06BD, category='lo', description='ARABIC LETTER NOON WITH THREE DOTS ABOVE', shcode=0x0646 }, + [0x06BE] = { unicodeslot=0x06BE, category='lo', description='ARABIC LETTER HEH DOACHASHMEE' }, + [0x06BF] = { unicodeslot=0x06BF, category='lo', description='ARABIC LETTER TCHEH WITH DOT ABOVE', shcode=0x0686 }, + [0x06C0] = { unicodeslot=0x06C0, category='lo', description='ARABIC LETTER HEH WITH YEH ABOVE', shcode=0x0647, specials={'char',0x06D5,0x0654} }, + [0x06C1] = { unicodeslot=0x06C1, category='lo', description='ARABIC LETTER HEH GOAL' }, + [0x06C2] = { unicodeslot=0x06C2, category='lo', description='ARABIC LETTER HEH GOAL WITH HAMZA ABOVE', specials={'char',0x06C1,0x0654} }, + [0x06C3] = { unicodeslot=0x06C3, category='lo', description='ARABIC LETTER TEH MARBUTA GOAL' }, + [0x06C4] = { unicodeslot=0x06C4, category='lo', description='ARABIC LETTER WAW WITH RING', shcode=0x0648 }, + [0x06C5] = { unicodeslot=0x06C5, category='lo', description='ARABIC LETTER KIRGHIZ OE' }, + [0x06C6] = { unicodeslot=0x06C6, category='lo', description='ARABIC LETTER OE' }, + [0x06C7] = { unicodeslot=0x06C7, category='lo', description='ARABIC LETTER U' }, + [0x06C8] = { unicodeslot=0x06C8, category='lo', description='ARABIC LETTER YU' }, + [0x06C9] = { unicodeslot=0x06C9, category='lo', description='ARABIC LETTER KIRGHIZ YU' }, + [0x06CA] = { unicodeslot=0x06CA, category='lo', description='ARABIC LETTER WAW WITH TWO DOTS ABOVE', shcode=0x0648 }, + [0x06CB] = { unicodeslot=0x06CB, category='lo', description='ARABIC LETTER VE' }, + [0x06CC] = { unicodeslot=0x06CC, category='lo', description='ARABIC LETTER FARSI YEH' }, + [0x06CD] = { unicodeslot=0x06CD, category='lo', description='ARABIC LETTER YEH WITH TAIL', shcode=0x064A }, + [0x06CE] = { unicodeslot=0x06CE, category='lo', description='ARABIC LETTER YEH WITH SMALL V', shcode=0x064A }, + [0x06CF] = { unicodeslot=0x06CF, category='lo', description='ARABIC LETTER WAW WITH DOT ABOVE', shcode=0x0648 }, + [0x06D0] = { unicodeslot=0x06D0, category='lo', description='ARABIC LETTER E' }, + [0x06D1] = { unicodeslot=0x06D1, category='lo', description='ARABIC LETTER YEH WITH THREE DOTS BELOW', shcode=0x064A }, + [0x06D2] = { unicodeslot=0x06D2, category='lo', adobename='afii57519', description='ARABIC LETTER YEH BARREE' }, + [0x06D3] = { unicodeslot=0x06D3, category='lo', description='ARABIC LETTER YEH BARREE WITH HAMZA ABOVE', specials={'char',0x06D2,0x0654} }, + [0x06D4] = { unicodeslot=0x06D4, category='po', description='ARABIC FULL STOP' }, + [0x06D5] = { unicodeslot=0x06D5, category='lo', adobename='afii57534', description='ARABIC LETTER AE' }, + [0x06D6] = { unicodeslot=0x06D6, category='mn', description='ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA' }, + [0x06D7] = { unicodeslot=0x06D7, category='mn', description='ARABIC SMALL HIGH LIGATURE QAF WITH LAM WITH ALEF MAKSURA' }, + [0x06D8] = { unicodeslot=0x06D8, category='mn', description='ARABIC SMALL HIGH MEEM INITIAL FORM' }, + [0x06D9] = { unicodeslot=0x06D9, category='mn', description='ARABIC SMALL HIGH LAM ALEF' }, + [0x06DA] = { unicodeslot=0x06DA, category='mn', description='ARABIC SMALL HIGH JEEM' }, + [0x06DB] = { unicodeslot=0x06DB, category='mn', description='ARABIC SMALL HIGH THREE DOTS' }, + [0x06DC] = { unicodeslot=0x06DC, category='mn', description='ARABIC SMALL HIGH SEEN' }, + [0x06DD] = { unicodeslot=0x06DD, category='cf', description='ARABIC END OF AYAH' }, + [0x06DE] = { unicodeslot=0x06DE, category='me', description='ARABIC START OF RUB EL HIZB' }, + [0x06DF] = { unicodeslot=0x06DF, category='mn', description='ARABIC SMALL HIGH ROUNDED ZERO' }, + [0x06E0] = { unicodeslot=0x06E0, category='mn', description='ARABIC SMALL HIGH UPRIGHT RECTANGULAR ZERO' }, + [0x06E1] = { unicodeslot=0x06E1, category='mn', description='ARABIC SMALL HIGH DOTLESS HEAD OF KHAH' }, + [0x06E2] = { unicodeslot=0x06E2, category='mn', description='ARABIC SMALL HIGH MEEM ISOLATED FORM' }, + [0x06E3] = { unicodeslot=0x06E3, category='mn', description='ARABIC SMALL LOW SEEN' }, + [0x06E4] = { unicodeslot=0x06E4, category='mn', description='ARABIC SMALL HIGH MADDA' }, + [0x06E5] = { unicodeslot=0x06E5, category='lm', description='ARABIC SMALL WAW' }, + [0x06E6] = { unicodeslot=0x06E6, category='lm', description='ARABIC SMALL YEH' }, + [0x06E7] = { unicodeslot=0x06E7, category='mn', description='ARABIC SMALL HIGH YEH' }, + [0x06E8] = { unicodeslot=0x06E8, category='mn', description='ARABIC SMALL HIGH NOON' }, + [0x06E9] = { unicodeslot=0x06E9, category='so', description='ARABIC PLACE OF SAJDAH' }, + [0x06EA] = { unicodeslot=0x06EA, category='mn', description='ARABIC EMPTY CENTRE LOW STOP' }, + [0x06EB] = { unicodeslot=0x06EB, category='mn', description='ARABIC EMPTY CENTRE HIGH STOP' }, + [0x06EC] = { unicodeslot=0x06EC, category='mn', description='ARABIC ROUNDED HIGH STOP WITH FILLED CENTRE' }, + [0x06ED] = { unicodeslot=0x06ED, category='mn', description='ARABIC SMALL LOW MEEM' }, + [0x06EE] = { unicodeslot=0x06EE, category='lo', description='ARABIC LETTER DAL WITH INVERTED V', shcode=0x062F }, + [0x06EF] = { unicodeslot=0x06EF, category='lo', description='ARABIC LETTER REH WITH INVERTED V', shcode=0x0631 }, + [0x06F0] = { unicodeslot=0x06F0, category='nd', description='EXTENDED ARABIC-INDIC DIGIT ZERO' }, + [0x06F1] = { unicodeslot=0x06F1, category='nd', description='EXTENDED ARABIC-INDIC DIGIT ONE' }, + [0x06F2] = { unicodeslot=0x06F2, category='nd', description='EXTENDED ARABIC-INDIC DIGIT TWO' }, + [0x06F3] = { unicodeslot=0x06F3, category='nd', description='EXTENDED ARABIC-INDIC DIGIT THREE' }, + [0x06F4] = { unicodeslot=0x06F4, category='nd', description='EXTENDED ARABIC-INDIC DIGIT FOUR' }, + [0x06F5] = { unicodeslot=0x06F5, category='nd', description='EXTENDED ARABIC-INDIC DIGIT FIVE' }, + [0x06F6] = { unicodeslot=0x06F6, category='nd', description='EXTENDED ARABIC-INDIC DIGIT SIX' }, + [0x06F7] = { unicodeslot=0x06F7, category='nd', description='EXTENDED ARABIC-INDIC DIGIT SEVEN' }, + [0x06F8] = { unicodeslot=0x06F8, category='nd', description='EXTENDED ARABIC-INDIC DIGIT EIGHT' }, + [0x06F9] = { unicodeslot=0x06F9, category='nd', description='EXTENDED ARABIC-INDIC DIGIT NINE' }, + [0x06FA] = { unicodeslot=0x06FA, category='lo', description='ARABIC LETTER SHEEN WITH DOT BELOW', shcode=0x0634 }, + [0x06FB] = { unicodeslot=0x06FB, category='lo', description='ARABIC LETTER DAD WITH DOT BELOW', shcode=0x0636 }, + [0x06FC] = { unicodeslot=0x06FC, category='lo', description='ARABIC LETTER GHAIN WITH DOT BELOW', shcode=0x063A }, + [0x06FD] = { unicodeslot=0x06FD, category='so', description='ARABIC SIGN SINDHI AMPERSAND' }, + [0x06FE] = { unicodeslot=0x06FE, category='so', description='ARABIC SIGN SINDHI POSTPOSITION MEN' }, + [0x06FF] = { unicodeslot=0x06FF, category='lo', description='ARABIC LETTER HEH WITH INVERTED V', shcode=0x0647 }, + [0x0700] = { unicodeslot=0x0700, category='po', description='SYRIAC END OF PARAGRAPH' }, + [0x0701] = { unicodeslot=0x0701, category='po', description='SYRIAC SUPRALINEAR FULL STOP' }, + [0x0702] = { unicodeslot=0x0702, category='po', description='SYRIAC SUBLINEAR FULL STOP' }, + [0x0703] = { unicodeslot=0x0703, category='po', description='SYRIAC SUPRALINEAR COLON' }, + [0x0704] = { unicodeslot=0x0704, category='po', description='SYRIAC SUBLINEAR COLON' }, + [0x0705] = { unicodeslot=0x0705, category='po', description='SYRIAC HORIZONTAL COLON' }, + [0x0706] = { unicodeslot=0x0706, category='po', description='SYRIAC COLON SKEWED LEFT' }, + [0x0707] = { unicodeslot=0x0707, category='po', description='SYRIAC COLON SKEWED RIGHT' }, + [0x0708] = { unicodeslot=0x0708, category='po', description='SYRIAC SUPRALINEAR COLON SKEWED LEFT' }, + [0x0709] = { unicodeslot=0x0709, category='po', description='SYRIAC SUBLINEAR COLON SKEWED RIGHT' }, + [0x070A] = { unicodeslot=0x070A, category='po', description='SYRIAC CONTRACTION' }, + [0x070B] = { unicodeslot=0x070B, category='po', description='SYRIAC HARKLEAN OBELUS' }, + [0x070C] = { unicodeslot=0x070C, category='po', description='SYRIAC HARKLEAN METOBELUS' }, + [0x070D] = { unicodeslot=0x070D, category='po', description='SYRIAC HARKLEAN ASTERISCUS' }, + [0x070F] = { unicodeslot=0x070F, category='cf', description='SYRIAC ABBREVIATION MARK' }, + [0x0710] = { unicodeslot=0x0710, category='lo', description='SYRIAC LETTER ALAPH' }, + [0x0711] = { unicodeslot=0x0711, category='mn', description='SYRIAC LETTER SUPERSCRIPT ALAPH' }, + [0x0712] = { unicodeslot=0x0712, category='lo', description='SYRIAC LETTER BETH' }, + [0x0713] = { unicodeslot=0x0713, category='lo', description='SYRIAC LETTER GAMAL' }, + [0x0714] = { unicodeslot=0x0714, category='lo', description='SYRIAC LETTER GAMAL GARSHUNI' }, + [0x0715] = { unicodeslot=0x0715, category='lo', description='SYRIAC LETTER DALATH' }, + [0x0716] = { unicodeslot=0x0716, category='lo', description='SYRIAC LETTER DOTLESS DALATH RISH' }, + [0x0717] = { unicodeslot=0x0717, category='lo', description='SYRIAC LETTER HE' }, + [0x0718] = { unicodeslot=0x0718, category='lo', description='SYRIAC LETTER WAW' }, + [0x0719] = { unicodeslot=0x0719, category='lo', description='SYRIAC LETTER ZAIN' }, + [0x071A] = { unicodeslot=0x071A, category='lo', description='SYRIAC LETTER HETH' }, + [0x071B] = { unicodeslot=0x071B, category='lo', description='SYRIAC LETTER TETH' }, + [0x071C] = { unicodeslot=0x071C, category='lo', description='SYRIAC LETTER TETH GARSHUNI' }, + [0x071D] = { unicodeslot=0x071D, category='lo', description='SYRIAC LETTER YUDH' }, + [0x071E] = { unicodeslot=0x071E, category='lo', description='SYRIAC LETTER YUDH HE' }, + [0x071F] = { unicodeslot=0x071F, category='lo', description='SYRIAC LETTER KAPH' }, + [0x0720] = { unicodeslot=0x0720, category='lo', description='SYRIAC LETTER LAMADH' }, + [0x0721] = { unicodeslot=0x0721, category='lo', description='SYRIAC LETTER MIM' }, + [0x0722] = { unicodeslot=0x0722, category='lo', description='SYRIAC LETTER NUN' }, + [0x0723] = { unicodeslot=0x0723, category='lo', description='SYRIAC LETTER SEMKATH' }, + [0x0724] = { unicodeslot=0x0724, category='lo', description='SYRIAC LETTER FINAL SEMKATH' }, + [0x0725] = { unicodeslot=0x0725, category='lo', description='SYRIAC LETTER E' }, + [0x0726] = { unicodeslot=0x0726, category='lo', description='SYRIAC LETTER PE' }, + [0x0727] = { unicodeslot=0x0727, category='lo', description='SYRIAC LETTER REVERSED PE' }, + [0x0728] = { unicodeslot=0x0728, category='lo', description='SYRIAC LETTER SADHE' }, + [0x0729] = { unicodeslot=0x0729, category='lo', description='SYRIAC LETTER QAPH' }, + [0x072A] = { unicodeslot=0x072A, category='lo', description='SYRIAC LETTER RISH' }, + [0x072B] = { unicodeslot=0x072B, category='lo', description='SYRIAC LETTER SHIN' }, + [0x072C] = { unicodeslot=0x072C, category='lo', description='SYRIAC LETTER TAW' }, + [0x072D] = { unicodeslot=0x072D, category='lo', description='SYRIAC LETTER PERSIAN BHETH' }, + [0x072E] = { unicodeslot=0x072E, category='lo', description='SYRIAC LETTER PERSIAN GHAMAL' }, + [0x072F] = { unicodeslot=0x072F, category='lo', description='SYRIAC LETTER PERSIAN DHALATH' }, + [0x0730] = { unicodeslot=0x0730, category='mn', description='SYRIAC PTHAHA ABOVE' }, + [0x0731] = { unicodeslot=0x0731, category='mn', description='SYRIAC PTHAHA BELOW' }, + [0x0732] = { unicodeslot=0x0732, category='mn', description='SYRIAC PTHAHA DOTTED' }, + [0x0733] = { unicodeslot=0x0733, category='mn', description='SYRIAC ZQAPHA ABOVE' }, + [0x0734] = { unicodeslot=0x0734, category='mn', description='SYRIAC ZQAPHA BELOW' }, + [0x0735] = { unicodeslot=0x0735, category='mn', description='SYRIAC ZQAPHA DOTTED' }, + [0x0736] = { unicodeslot=0x0736, category='mn', description='SYRIAC RBASA ABOVE' }, + [0x0737] = { unicodeslot=0x0737, category='mn', description='SYRIAC RBASA BELOW' }, + [0x0738] = { unicodeslot=0x0738, category='mn', description='SYRIAC DOTTED ZLAMA HORIZONTAL' }, + [0x0739] = { unicodeslot=0x0739, category='mn', description='SYRIAC DOTTED ZLAMA ANGULAR' }, + [0x073A] = { unicodeslot=0x073A, category='mn', description='SYRIAC HBASA ABOVE' }, + [0x073B] = { unicodeslot=0x073B, category='mn', description='SYRIAC HBASA BELOW' }, + [0x073C] = { unicodeslot=0x073C, category='mn', description='SYRIAC HBASA-ESASA DOTTED' }, + [0x073D] = { unicodeslot=0x073D, category='mn', description='SYRIAC ESASA ABOVE' }, + [0x073E] = { unicodeslot=0x073E, category='mn', description='SYRIAC ESASA BELOW' }, + [0x073F] = { unicodeslot=0x073F, category='mn', description='SYRIAC RWAHA' }, + [0x0740] = { unicodeslot=0x0740, category='mn', description='SYRIAC FEMININE DOT' }, + [0x0741] = { unicodeslot=0x0741, category='mn', description='SYRIAC QUSHSHAYA' }, + [0x0742] = { unicodeslot=0x0742, category='mn', description='SYRIAC RUKKAKHA' }, + [0x0743] = { unicodeslot=0x0743, category='mn', description='SYRIAC TWO VERTICAL DOTS ABOVE' }, + [0x0744] = { unicodeslot=0x0744, category='mn', description='SYRIAC TWO VERTICAL DOTS BELOW' }, + [0x0745] = { unicodeslot=0x0745, category='mn', description='SYRIAC THREE DOTS ABOVE' }, + [0x0746] = { unicodeslot=0x0746, category='mn', description='SYRIAC THREE DOTS BELOW' }, + [0x0747] = { unicodeslot=0x0747, category='mn', description='SYRIAC OBLIQUE LINE ABOVE' }, + [0x0748] = { unicodeslot=0x0748, category='mn', description='SYRIAC OBLIQUE LINE BELOW' }, + [0x0749] = { unicodeslot=0x0749, category='mn', description='SYRIAC MUSIC' }, + [0x074A] = { unicodeslot=0x074A, category='mn', description='SYRIAC BARREKH' }, + [0x074D] = { unicodeslot=0x074D, category='lo', description='SYRIAC LETTER SOGDIAN ZHAIN' }, + [0x074E] = { unicodeslot=0x074E, category='lo', description='SYRIAC LETTER SOGDIAN KHAPH' }, + [0x074F] = { unicodeslot=0x074F, category='lo', description='SYRIAC LETTER SOGDIAN FE' }, + [0x0750] = { unicodeslot=0x0750, category='lo', description='ARABIC LETTER BEH WITH THREE DOTS HORIZONTALLY BELOW', shcode=0x0628 }, + [0x0751] = { unicodeslot=0x0751, category='lo', description='ARABIC LETTER BEH WITH DOT BELOW AND THREE DOTS ABOVE', shcode=0x0628 }, + [0x0752] = { unicodeslot=0x0752, category='lo', description='ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW', shcode=0x0628 }, + [0x0753] = { unicodeslot=0x0753, category='lo', description='ARABIC LETTER BEH WITH THREE DOTS POINTING UPWARDS BELOW AND TWO DOTS ABOVE', shcode=0x0628 }, + [0x0754] = { unicodeslot=0x0754, category='lo', description='ARABIC LETTER BEH WITH TWO DOTS BELOW AND DOT ABOVE', shcode=0x0628 }, + [0x0755] = { unicodeslot=0x0755, category='lo', description='ARABIC LETTER BEH WITH INVERTED SMALL V BELOW', shcode=0x0628 }, + [0x0756] = { unicodeslot=0x0756, category='lo', description='ARABIC LETTER BEH WITH SMALL V', shcode=0x0628 }, + [0x0757] = { unicodeslot=0x0757, category='lo', description='ARABIC LETTER HAH WITH TWO DOTS ABOVE', shcode=0x062D }, + [0x0758] = { unicodeslot=0x0758, category='lo', description='ARABIC LETTER HAH WITH THREE DOTS POINTING UPWARDS BELOW', shcode=0x062D }, + [0x0759] = { unicodeslot=0x0759, category='lo', description='ARABIC LETTER DAL WITH TWO DOTS VERTICALLY BELOW AND SMALL TAH', shcode=0x062F }, + [0x075A] = { unicodeslot=0x075A, category='lo', description='ARABIC LETTER DAL WITH INVERTED SMALL V BELOW', shcode=0x062F }, + [0x075B] = { unicodeslot=0x075B, category='lo', description='ARABIC LETTER REH WITH STROKE', shcode=0x0631 }, + [0x075C] = { unicodeslot=0x075C, category='lo', description='ARABIC LETTER SEEN WITH FOUR DOTS ABOVE', shcode=0x0633 }, + [0x075D] = { unicodeslot=0x075D, category='lo', description='ARABIC LETTER AIN WITH TWO DOTS ABOVE', shcode=0x0639 }, + [0x075E] = { unicodeslot=0x075E, category='lo', description='ARABIC LETTER AIN WITH THREE DOTS POINTING DOWNWARDS ABOVE', shcode=0x0639 }, + [0x075F] = { unicodeslot=0x075F, category='lo', description='ARABIC LETTER AIN WITH TWO DOTS VERTICALLY ABOVE', shcode=0x0639 }, + [0x0760] = { unicodeslot=0x0760, category='lo', description='ARABIC LETTER FEH WITH TWO DOTS BELOW', shcode=0x0641 }, + [0x0761] = { unicodeslot=0x0761, category='lo', description='ARABIC LETTER FEH WITH THREE DOTS POINTING UPWARDS BELOW', shcode=0x0641 }, + [0x0762] = { unicodeslot=0x0762, category='lo', description='ARABIC LETTER KEHEH WITH DOT ABOVE', shcode=0x06A9 }, + [0x0763] = { unicodeslot=0x0763, category='lo', description='ARABIC LETTER KEHEH WITH THREE DOTS ABOVE', shcode=0x06A9 }, + [0x0764] = { unicodeslot=0x0764, category='lo', description='ARABIC LETTER KEHEH WITH THREE DOTS POINTING UPWARDS BELOW', shcode=0x06A9 }, + [0x0765] = { unicodeslot=0x0765, category='lo', description='ARABIC LETTER MEEM WITH DOT ABOVE', shcode=0x0645 }, + [0x0766] = { unicodeslot=0x0766, category='lo', description='ARABIC LETTER MEEM WITH DOT BELOW', shcode=0x0645 }, + [0x0767] = { unicodeslot=0x0767, category='lo', description='ARABIC LETTER NOON WITH TWO DOTS BELOW', shcode=0x0646 }, + [0x0768] = { unicodeslot=0x0768, category='lo', description='ARABIC LETTER NOON WITH SMALL TAH', shcode=0x0646 }, + [0x0769] = { unicodeslot=0x0769, category='lo', description='ARABIC LETTER NOON WITH SMALL V', shcode=0x0646 }, + [0x076A] = { unicodeslot=0x076A, category='lo', description='ARABIC LETTER LAM WITH BAR', shcode=0x0644 }, + [0x076B] = { unicodeslot=0x076B, category='lo', description='ARABIC LETTER REH WITH TWO DOTS VERTICALLY ABOVE', shcode=0x0631 }, + [0x076C] = { unicodeslot=0x076C, category='lo', description='ARABIC LETTER REH WITH HAMZA ABOVE', shcode=0x0631 }, + [0x076D] = { unicodeslot=0x076D, category='lo', description='ARABIC LETTER SEEN WITH TWO DOTS VERTICALLY ABOVE', shcode=0x0633 }, + [0x0780] = { unicodeslot=0x0780, category='lo', description='THAANA LETTER HAA' }, + [0x0781] = { unicodeslot=0x0781, category='lo', description='THAANA LETTER SHAVIYANI' }, + [0x0782] = { unicodeslot=0x0782, category='lo', description='THAANA LETTER NOONU' }, + [0x0783] = { unicodeslot=0x0783, category='lo', description='THAANA LETTER RAA' }, + [0x0784] = { unicodeslot=0x0784, category='lo', description='THAANA LETTER BAA' }, + [0x0785] = { unicodeslot=0x0785, category='lo', description='THAANA LETTER LHAVIYANI' }, + [0x0786] = { unicodeslot=0x0786, category='lo', description='THAANA LETTER KAAFU' }, + [0x0787] = { unicodeslot=0x0787, category='lo', description='THAANA LETTER ALIFU' }, + [0x0788] = { unicodeslot=0x0788, category='lo', description='THAANA LETTER VAAVU' }, + [0x0789] = { unicodeslot=0x0789, category='lo', description='THAANA LETTER MEEMU' }, + [0x078A] = { unicodeslot=0x078A, category='lo', description='THAANA LETTER FAAFU' }, + [0x078B] = { unicodeslot=0x078B, category='lo', description='THAANA LETTER DHAALU' }, + [0x078C] = { unicodeslot=0x078C, category='lo', description='THAANA LETTER THAA' }, + [0x078D] = { unicodeslot=0x078D, category='lo', description='THAANA LETTER LAAMU' }, + [0x078E] = { unicodeslot=0x078E, category='lo', description='THAANA LETTER GAAFU' }, + [0x078F] = { unicodeslot=0x078F, category='lo', description='THAANA LETTER GNAVIYANI' }, + [0x0790] = { unicodeslot=0x0790, category='lo', description='THAANA LETTER SEENU' }, + [0x0791] = { unicodeslot=0x0791, category='lo', description='THAANA LETTER DAVIYANI' }, + [0x0792] = { unicodeslot=0x0792, category='lo', description='THAANA LETTER ZAVIYANI' }, + [0x0793] = { unicodeslot=0x0793, category='lo', description='THAANA LETTER TAVIYANI' }, + [0x0794] = { unicodeslot=0x0794, category='lo', description='THAANA LETTER YAA' }, + [0x0795] = { unicodeslot=0x0795, category='lo', description='THAANA LETTER PAVIYANI' }, + [0x0796] = { unicodeslot=0x0796, category='lo', description='THAANA LETTER JAVIYANI' }, + [0x0797] = { unicodeslot=0x0797, category='lo', description='THAANA LETTER CHAVIYANI' }, + [0x0798] = { unicodeslot=0x0798, category='lo', description='THAANA LETTER TTAA' }, + [0x0799] = { unicodeslot=0x0799, category='lo', description='THAANA LETTER HHAA' }, + [0x079A] = { unicodeslot=0x079A, category='lo', description='THAANA LETTER KHAA' }, + [0x079B] = { unicodeslot=0x079B, category='lo', description='THAANA LETTER THAALU' }, + [0x079C] = { unicodeslot=0x079C, category='lo', description='THAANA LETTER ZAA' }, + [0x079D] = { unicodeslot=0x079D, category='lo', description='THAANA LETTER SHEENU' }, + [0x079E] = { unicodeslot=0x079E, category='lo', description='THAANA LETTER SAADHU' }, + [0x079F] = { unicodeslot=0x079F, category='lo', description='THAANA LETTER DAADHU' }, + [0x07A0] = { unicodeslot=0x07A0, category='lo', description='THAANA LETTER TO' }, + [0x07A1] = { unicodeslot=0x07A1, category='lo', description='THAANA LETTER ZO' }, + [0x07A2] = { unicodeslot=0x07A2, category='lo', description='THAANA LETTER AINU' }, + [0x07A3] = { unicodeslot=0x07A3, category='lo', description='THAANA LETTER GHAINU' }, + [0x07A4] = { unicodeslot=0x07A4, category='lo', description='THAANA LETTER QAAFU' }, + [0x07A5] = { unicodeslot=0x07A5, category='lo', description='THAANA LETTER WAAVU' }, + [0x07A6] = { unicodeslot=0x07A6, category='mn', description='THAANA ABAFILI' }, + [0x07A7] = { unicodeslot=0x07A7, category='mn', description='THAANA AABAAFILI' }, + [0x07A8] = { unicodeslot=0x07A8, category='mn', description='THAANA IBIFILI' }, + [0x07A9] = { unicodeslot=0x07A9, category='mn', description='THAANA EEBEEFILI' }, + [0x07AA] = { unicodeslot=0x07AA, category='mn', description='THAANA UBUFILI' }, + [0x07AB] = { unicodeslot=0x07AB, category='mn', description='THAANA OOBOOFILI' }, + [0x07AC] = { unicodeslot=0x07AC, category='mn', description='THAANA EBEFILI' }, + [0x07AD] = { unicodeslot=0x07AD, category='mn', description='THAANA EYBEYFILI' }, + [0x07AE] = { unicodeslot=0x07AE, category='mn', description='THAANA OBOFILI' }, + [0x07AF] = { unicodeslot=0x07AF, category='mn', description='THAANA OABOAFILI' }, + [0x07B0] = { unicodeslot=0x07B0, category='mn', description='THAANA SUKUN' }, + [0x07B1] = { unicodeslot=0x07B1, category='lo', description='THAANA LETTER NAA' }, + [0x07C0] = { unicodeslot=0x07C0, category='nd', description='NKO DIGIT ZERO' }, + [0x07C1] = { unicodeslot=0x07C1, category='nd', description='NKO DIGIT ONE' }, + [0x07C2] = { unicodeslot=0x07C2, category='nd', description='NKO DIGIT TWO' }, + [0x07C3] = { unicodeslot=0x07C3, category='nd', description='NKO DIGIT THREE' }, + [0x07C4] = { unicodeslot=0x07C4, category='nd', description='NKO DIGIT FOUR' }, + [0x07C5] = { unicodeslot=0x07C5, category='nd', description='NKO DIGIT FIVE' }, + [0x07C6] = { unicodeslot=0x07C6, category='nd', description='NKO DIGIT SIX' }, + [0x07C7] = { unicodeslot=0x07C7, category='nd', description='NKO DIGIT SEVEN' }, + [0x07C8] = { unicodeslot=0x07C8, category='nd', description='NKO DIGIT EIGHT' }, + [0x07C9] = { unicodeslot=0x07C9, category='nd', description='NKO DIGIT NINE' }, + [0x07CA] = { unicodeslot=0x07CA, category='lo', description='NKO LETTER A' }, + [0x07CB] = { unicodeslot=0x07CB, category='lo', description='NKO LETTER EE' }, + [0x07CC] = { unicodeslot=0x07CC, category='lo', description='NKO LETTER I' }, + [0x07CD] = { unicodeslot=0x07CD, category='lo', description='NKO LETTER E' }, + [0x07CE] = { unicodeslot=0x07CE, category='lo', description='NKO LETTER U' }, + [0x07CF] = { unicodeslot=0x07CF, category='lo', description='NKO LETTER OO' }, + [0x07D0] = { unicodeslot=0x07D0, category='lo', description='NKO LETTER O' }, + [0x07D1] = { unicodeslot=0x07D1, category='lo', description='NKO LETTER DAGBASINNA' }, + [0x07D2] = { unicodeslot=0x07D2, category='lo', description='NKO LETTER N' }, + [0x07D3] = { unicodeslot=0x07D3, category='lo', description='NKO LETTER BA' }, + [0x07D4] = { unicodeslot=0x07D4, category='lo', description='NKO LETTER PA' }, + [0x07D5] = { unicodeslot=0x07D5, category='lo', description='NKO LETTER TA' }, + [0x07D6] = { unicodeslot=0x07D6, category='lo', description='NKO LETTER JA' }, + [0x07D7] = { unicodeslot=0x07D7, category='lo', description='NKO LETTER CHA' }, + [0x07D8] = { unicodeslot=0x07D8, category='lo', description='NKO LETTER DA' }, + [0x07D9] = { unicodeslot=0x07D9, category='lo', description='NKO LETTER RA' }, + [0x07DA] = { unicodeslot=0x07DA, category='lo', description='NKO LETTER RRA' }, + [0x07DB] = { unicodeslot=0x07DB, category='lo', description='NKO LETTER SA' }, + [0x07DC] = { unicodeslot=0x07DC, category='lo', description='NKO LETTER GBA' }, + [0x07DD] = { unicodeslot=0x07DD, category='lo', description='NKO LETTER FA' }, + [0x07DE] = { unicodeslot=0x07DE, category='lo', description='NKO LETTER KA' }, + [0x07DF] = { unicodeslot=0x07DF, category='lo', description='NKO LETTER LA' }, + [0x07E0] = { unicodeslot=0x07E0, category='lo', description='NKO LETTER NA WOLOSO' }, + [0x07E1] = { unicodeslot=0x07E1, category='lo', description='NKO LETTER MA' }, + [0x07E2] = { unicodeslot=0x07E2, category='lo', description='NKO LETTER NYA' }, + [0x07E3] = { unicodeslot=0x07E3, category='lo', description='NKO LETTER NA' }, + [0x07E4] = { unicodeslot=0x07E4, category='lo', description='NKO LETTER HA' }, + [0x07E5] = { unicodeslot=0x07E5, category='lo', description='NKO LETTER WA' }, + [0x07E6] = { unicodeslot=0x07E6, category='lo', description='NKO LETTER YA' }, + [0x07E7] = { unicodeslot=0x07E7, category='lo', description='NKO LETTER NYA WOLOSO' }, + [0x07E8] = { unicodeslot=0x07E8, category='lo', description='NKO LETTER JONA JA' }, + [0x07E9] = { unicodeslot=0x07E9, category='lo', description='NKO LETTER JONA CHA' }, + [0x07EA] = { unicodeslot=0x07EA, category='lo', description='NKO LETTER JONA RA' }, + [0x07EB] = { unicodeslot=0x07EB, category='mn', description='NKO COMBINING SHORT HIGH TONE' }, + [0x07EC] = { unicodeslot=0x07EC, category='mn', description='NKO COMBINING SHORT LOW TONE' }, + [0x07ED] = { unicodeslot=0x07ED, category='mn', description='NKO COMBINING SHORT RISING TONE' }, + [0x07EE] = { unicodeslot=0x07EE, category='mn', description='NKO COMBINING LONG DESCENDING TONE' }, + [0x07EF] = { unicodeslot=0x07EF, category='mn', description='NKO COMBINING LONG HIGH TONE' }, + [0x07F0] = { unicodeslot=0x07F0, category='mn', description='NKO COMBINING LONG LOW TONE' }, + [0x07F1] = { unicodeslot=0x07F1, category='mn', description='NKO COMBINING LONG RISING TONE' }, + [0x07F2] = { unicodeslot=0x07F2, category='mn', description='NKO COMBINING NASALIZATION MARK' }, + [0x07F3] = { unicodeslot=0x07F3, category='mn', description='NKO COMBINING DOUBLE DOT ABOVE' }, + [0x07F4] = { unicodeslot=0x07F4, category='lm', description='NKO HIGH TONE APOSTROPHE' }, + [0x07F5] = { unicodeslot=0x07F5, category='lm', description='NKO LOW TONE APOSTROPHE' }, + [0x07F6] = { unicodeslot=0x07F6, category='so', description='NKO SYMBOL OO DENNEN' }, + [0x07F7] = { unicodeslot=0x07F7, category='po', description='NKO SYMBOL GBAKURUNEN' }, + [0x07F8] = { unicodeslot=0x07F8, category='po', description='NKO COMMA' }, + [0x07F9] = { unicodeslot=0x07F9, category='po', description='NKO EXCLAMATION MARK' }, + [0x07FA] = { unicodeslot=0x07FA, category='lm', description='NKO LAJANYALAN' }, + [0x0901] = { unicodeslot=0x0901, category='mn', description='DEVANAGARI SIGN CANDRABINDU' }, + [0x0902] = { unicodeslot=0x0902, category='mn', description='DEVANAGARI SIGN ANUSVARA' }, + [0x0903] = { unicodeslot=0x0903, category='mc', description='DEVANAGARI SIGN VISARGA' }, + [0x0904] = { unicodeslot=0x0904, category='lo', description='DEVANAGARI LETTER SHORT A' }, + [0x0905] = { unicodeslot=0x0905, category='lo', description='DEVANAGARI LETTER A' }, + [0x0906] = { unicodeslot=0x0906, category='lo', description='DEVANAGARI LETTER AA' }, + [0x0907] = { unicodeslot=0x0907, category='lo', description='DEVANAGARI LETTER I' }, + [0x0908] = { unicodeslot=0x0908, category='lo', description='DEVANAGARI LETTER II' }, + [0x0909] = { unicodeslot=0x0909, category='lo', description='DEVANAGARI LETTER U' }, + [0x090A] = { unicodeslot=0x090A, category='lo', description='DEVANAGARI LETTER UU' }, + [0x090B] = { unicodeslot=0x090B, category='lo', description='DEVANAGARI LETTER VOCALIC R' }, + [0x090C] = { unicodeslot=0x090C, category='lo', description='DEVANAGARI LETTER VOCALIC L' }, + [0x090D] = { unicodeslot=0x090D, category='lo', description='DEVANAGARI LETTER CANDRA E' }, + [0x090E] = { unicodeslot=0x090E, category='lo', description='DEVANAGARI LETTER SHORT E' }, + [0x090F] = { unicodeslot=0x090F, category='lo', description='DEVANAGARI LETTER E' }, + [0x0910] = { unicodeslot=0x0910, category='lo', description='DEVANAGARI LETTER AI' }, + [0x0911] = { unicodeslot=0x0911, category='lo', description='DEVANAGARI LETTER CANDRA O' }, + [0x0912] = { unicodeslot=0x0912, category='lo', description='DEVANAGARI LETTER SHORT O' }, + [0x0913] = { unicodeslot=0x0913, category='lo', description='DEVANAGARI LETTER O' }, + [0x0914] = { unicodeslot=0x0914, category='lo', description='DEVANAGARI LETTER AU' }, + [0x0915] = { unicodeslot=0x0915, category='lo', description='DEVANAGARI LETTER KA' }, + [0x0916] = { unicodeslot=0x0916, category='lo', description='DEVANAGARI LETTER KHA' }, + [0x0917] = { unicodeslot=0x0917, category='lo', description='DEVANAGARI LETTER GA' }, + [0x0918] = { unicodeslot=0x0918, category='lo', description='DEVANAGARI LETTER GHA' }, + [0x0919] = { unicodeslot=0x0919, category='lo', description='DEVANAGARI LETTER NGA' }, + [0x091A] = { unicodeslot=0x091A, category='lo', description='DEVANAGARI LETTER CA' }, + [0x091B] = { unicodeslot=0x091B, category='lo', description='DEVANAGARI LETTER CHA' }, + [0x091C] = { unicodeslot=0x091C, category='lo', description='DEVANAGARI LETTER JA' }, + [0x091D] = { unicodeslot=0x091D, category='lo', description='DEVANAGARI LETTER JHA' }, + [0x091E] = { unicodeslot=0x091E, category='lo', description='DEVANAGARI LETTER NYA' }, + [0x091F] = { unicodeslot=0x091F, category='lo', description='DEVANAGARI LETTER TTA' }, + [0x0920] = { unicodeslot=0x0920, category='lo', description='DEVANAGARI LETTER TTHA' }, + [0x0921] = { unicodeslot=0x0921, category='lo', description='DEVANAGARI LETTER DDA' }, + [0x0922] = { unicodeslot=0x0922, category='lo', description='DEVANAGARI LETTER DDHA' }, + [0x0923] = { unicodeslot=0x0923, category='lo', description='DEVANAGARI LETTER NNA' }, + [0x0924] = { unicodeslot=0x0924, category='lo', description='DEVANAGARI LETTER TA' }, + [0x0925] = { unicodeslot=0x0925, category='lo', description='DEVANAGARI LETTER THA' }, + [0x0926] = { unicodeslot=0x0926, category='lo', description='DEVANAGARI LETTER DA' }, + [0x0927] = { unicodeslot=0x0927, category='lo', description='DEVANAGARI LETTER DHA' }, + [0x0928] = { unicodeslot=0x0928, category='lo', description='DEVANAGARI LETTER NA' }, + [0x0929] = { unicodeslot=0x0929, category='lo', description='DEVANAGARI LETTER NNNA', specials={'char',0x0928,0x093C} }, + [0x092A] = { unicodeslot=0x092A, category='lo', description='DEVANAGARI LETTER PA' }, + [0x092B] = { unicodeslot=0x092B, category='lo', description='DEVANAGARI LETTER PHA' }, + [0x092C] = { unicodeslot=0x092C, category='lo', description='DEVANAGARI LETTER BA' }, + [0x092D] = { unicodeslot=0x092D, category='lo', description='DEVANAGARI LETTER BHA' }, + [0x092E] = { unicodeslot=0x092E, category='lo', description='DEVANAGARI LETTER MA' }, + [0x092F] = { unicodeslot=0x092F, category='lo', description='DEVANAGARI LETTER YA' }, + [0x0930] = { unicodeslot=0x0930, category='lo', description='DEVANAGARI LETTER RA' }, + [0x0931] = { unicodeslot=0x0931, category='lo', description='DEVANAGARI LETTER RRA', specials={'char',0x0930,0x093C} }, + [0x0932] = { unicodeslot=0x0932, category='lo', description='DEVANAGARI LETTER LA' }, + [0x0933] = { unicodeslot=0x0933, category='lo', description='DEVANAGARI LETTER LLA' }, + [0x0934] = { unicodeslot=0x0934, category='lo', description='DEVANAGARI LETTER LLLA', specials={'char',0x0933,0x093C} }, + [0x0935] = { unicodeslot=0x0935, category='lo', description='DEVANAGARI LETTER VA' }, + [0x0936] = { unicodeslot=0x0936, category='lo', description='DEVANAGARI LETTER SHA' }, + [0x0937] = { unicodeslot=0x0937, category='lo', description='DEVANAGARI LETTER SSA' }, + [0x0938] = { unicodeslot=0x0938, category='lo', description='DEVANAGARI LETTER SA' }, + [0x0939] = { unicodeslot=0x0939, category='lo', description='DEVANAGARI LETTER HA' }, + [0x093C] = { unicodeslot=0x093C, category='mn', description='DEVANAGARI SIGN NUKTA' }, + [0x093D] = { unicodeslot=0x093D, category='lo', description='DEVANAGARI SIGN AVAGRAHA' }, + [0x093E] = { unicodeslot=0x093E, category='mc', description='DEVANAGARI VOWEL SIGN AA' }, + [0x093F] = { unicodeslot=0x093F, category='mc', description='DEVANAGARI VOWEL SIGN I' }, + [0x0940] = { unicodeslot=0x0940, category='mc', description='DEVANAGARI VOWEL SIGN II' }, + [0x0941] = { unicodeslot=0x0941, category='mn', description='DEVANAGARI VOWEL SIGN U' }, + [0x0942] = { unicodeslot=0x0942, category='mn', description='DEVANAGARI VOWEL SIGN UU' }, + [0x0943] = { unicodeslot=0x0943, category='mn', description='DEVANAGARI VOWEL SIGN VOCALIC R' }, + [0x0944] = { unicodeslot=0x0944, category='mn', description='DEVANAGARI VOWEL SIGN VOCALIC RR' }, + [0x0945] = { unicodeslot=0x0945, category='mn', description='DEVANAGARI VOWEL SIGN CANDRA E' }, + [0x0946] = { unicodeslot=0x0946, category='mn', description='DEVANAGARI VOWEL SIGN SHORT E' }, + [0x0947] = { unicodeslot=0x0947, category='mn', description='DEVANAGARI VOWEL SIGN E' }, + [0x0948] = { unicodeslot=0x0948, category='mn', description='DEVANAGARI VOWEL SIGN AI' }, + [0x0949] = { unicodeslot=0x0949, category='mc', description='DEVANAGARI VOWEL SIGN CANDRA O' }, + [0x094A] = { unicodeslot=0x094A, category='mc', description='DEVANAGARI VOWEL SIGN SHORT O' }, + [0x094B] = { unicodeslot=0x094B, category='mc', description='DEVANAGARI VOWEL SIGN O' }, + [0x094C] = { unicodeslot=0x094C, category='mc', description='DEVANAGARI VOWEL SIGN AU' }, + [0x094D] = { unicodeslot=0x094D, category='mn', description='DEVANAGARI SIGN VIRAMA' }, + [0x0950] = { unicodeslot=0x0950, category='lo', description='DEVANAGARI OM' }, + [0x0951] = { unicodeslot=0x0951, category='mn', description='DEVANAGARI STRESS SIGN UDATTA' }, + [0x0952] = { unicodeslot=0x0952, category='mn', description='DEVANAGARI STRESS SIGN ANUDATTA' }, + [0x0953] = { unicodeslot=0x0953, category='mn', description='DEVANAGARI GRAVE ACCENT' }, + [0x0954] = { unicodeslot=0x0954, category='mn', description='DEVANAGARI ACUTE ACCENT' }, + [0x0958] = { unicodeslot=0x0958, category='lo', description='DEVANAGARI LETTER QA', specials={'char',0x0915,0x093C} }, + [0x0959] = { unicodeslot=0x0959, category='lo', description='DEVANAGARI LETTER KHHA', specials={'char',0x0916,0x093C} }, + [0x095A] = { unicodeslot=0x095A, category='lo', description='DEVANAGARI LETTER GHHA', specials={'char',0x0917,0x093C} }, + [0x095B] = { unicodeslot=0x095B, category='lo', description='DEVANAGARI LETTER ZA', specials={'char',0x091C,0x093C} }, + [0x095C] = { unicodeslot=0x095C, category='lo', description='DEVANAGARI LETTER DDDHA', specials={'char',0x0921,0x093C} }, + [0x095D] = { unicodeslot=0x095D, category='lo', description='DEVANAGARI LETTER RHA', specials={'char',0x0922,0x093C} }, + [0x095E] = { unicodeslot=0x095E, category='lo', description='DEVANAGARI LETTER FA', specials={'char',0x092B,0x093C} }, + [0x095F] = { unicodeslot=0x095F, category='lo', description='DEVANAGARI LETTER YYA', specials={'char',0x092F,0x093C} }, + [0x0960] = { unicodeslot=0x0960, category='lo', description='DEVANAGARI LETTER VOCALIC RR' }, + [0x0961] = { unicodeslot=0x0961, category='lo', description='DEVANAGARI LETTER VOCALIC LL' }, + [0x0962] = { unicodeslot=0x0962, category='mn', description='DEVANAGARI VOWEL SIGN VOCALIC L' }, + [0x0963] = { unicodeslot=0x0963, category='mn', description='DEVANAGARI VOWEL SIGN VOCALIC LL' }, + [0x0964] = { unicodeslot=0x0964, category='po', description='DEVANAGARI DANDA' }, + [0x0965] = { unicodeslot=0x0965, category='po', description='DEVANAGARI DOUBLE DANDA' }, + [0x0966] = { unicodeslot=0x0966, category='nd', description='DEVANAGARI DIGIT ZERO' }, + [0x0967] = { unicodeslot=0x0967, category='nd', description='DEVANAGARI DIGIT ONE' }, + [0x0968] = { unicodeslot=0x0968, category='nd', description='DEVANAGARI DIGIT TWO' }, + [0x0969] = { unicodeslot=0x0969, category='nd', description='DEVANAGARI DIGIT THREE' }, + [0x096A] = { unicodeslot=0x096A, category='nd', description='DEVANAGARI DIGIT FOUR' }, + [0x096B] = { unicodeslot=0x096B, category='nd', description='DEVANAGARI DIGIT FIVE' }, + [0x096C] = { unicodeslot=0x096C, category='nd', description='DEVANAGARI DIGIT SIX' }, + [0x096D] = { unicodeslot=0x096D, category='nd', description='DEVANAGARI DIGIT SEVEN' }, + [0x096E] = { unicodeslot=0x096E, category='nd', description='DEVANAGARI DIGIT EIGHT' }, + [0x096F] = { unicodeslot=0x096F, category='nd', description='DEVANAGARI DIGIT NINE' }, + [0x0970] = { unicodeslot=0x0970, category='po', description='DEVANAGARI ABBREVIATION SIGN' }, + [0x097B] = { unicodeslot=0x097B, category='lo', description='DEVANAGARI LETTER GGA' }, + [0x097C] = { unicodeslot=0x097C, category='lo', description='DEVANAGARI LETTER JJA' }, + [0x097D] = { unicodeslot=0x097D, category='lo', description='DEVANAGARI LETTER GLOTTAL STOP' }, + [0x097E] = { unicodeslot=0x097E, category='lo', description='DEVANAGARI LETTER DDDA' }, + [0x097F] = { unicodeslot=0x097F, category='lo', description='DEVANAGARI LETTER BBA' }, + [0x0981] = { unicodeslot=0x0981, category='mn', description='BENGALI SIGN CANDRABINDU' }, + [0x0982] = { unicodeslot=0x0982, category='mc', description='BENGALI SIGN ANUSVARA' }, + [0x0983] = { unicodeslot=0x0983, category='mc', description='BENGALI SIGN VISARGA' }, + [0x0985] = { unicodeslot=0x0985, category='lo', description='BENGALI LETTER A' }, + [0x0986] = { unicodeslot=0x0986, category='lo', description='BENGALI LETTER AA' }, + [0x0987] = { unicodeslot=0x0987, category='lo', description='BENGALI LETTER I' }, + [0x0988] = { unicodeslot=0x0988, category='lo', description='BENGALI LETTER II' }, + [0x0989] = { unicodeslot=0x0989, category='lo', description='BENGALI LETTER U' }, + [0x098A] = { unicodeslot=0x098A, category='lo', description='BENGALI LETTER UU' }, + [0x098B] = { unicodeslot=0x098B, category='lo', description='BENGALI LETTER VOCALIC R' }, + [0x098C] = { unicodeslot=0x098C, category='lo', description='BENGALI LETTER VOCALIC L' }, + [0x098F] = { unicodeslot=0x098F, category='lo', description='BENGALI LETTER E' }, + [0x0990] = { unicodeslot=0x0990, category='lo', description='BENGALI LETTER AI' }, + [0x0993] = { unicodeslot=0x0993, category='lo', description='BENGALI LETTER O' }, + [0x0994] = { unicodeslot=0x0994, category='lo', description='BENGALI LETTER AU' }, + [0x0995] = { unicodeslot=0x0995, category='lo', description='BENGALI LETTER KA' }, + [0x0996] = { unicodeslot=0x0996, category='lo', description='BENGALI LETTER KHA' }, + [0x0997] = { unicodeslot=0x0997, category='lo', description='BENGALI LETTER GA' }, + [0x0998] = { unicodeslot=0x0998, category='lo', description='BENGALI LETTER GHA' }, + [0x0999] = { unicodeslot=0x0999, category='lo', description='BENGALI LETTER NGA' }, + [0x099A] = { unicodeslot=0x099A, category='lo', description='BENGALI LETTER CA' }, + [0x099B] = { unicodeslot=0x099B, category='lo', description='BENGALI LETTER CHA' }, + [0x099C] = { unicodeslot=0x099C, category='lo', description='BENGALI LETTER JA' }, + [0x099D] = { unicodeslot=0x099D, category='lo', description='BENGALI LETTER JHA' }, + [0x099E] = { unicodeslot=0x099E, category='lo', description='BENGALI LETTER NYA' }, + [0x099F] = { unicodeslot=0x099F, category='lo', description='BENGALI LETTER TTA' }, + [0x09A0] = { unicodeslot=0x09A0, category='lo', description='BENGALI LETTER TTHA' }, + [0x09A1] = { unicodeslot=0x09A1, category='lo', description='BENGALI LETTER DDA' }, + [0x09A2] = { unicodeslot=0x09A2, category='lo', description='BENGALI LETTER DDHA' }, + [0x09A3] = { unicodeslot=0x09A3, category='lo', description='BENGALI LETTER NNA' }, + [0x09A4] = { unicodeslot=0x09A4, category='lo', description='BENGALI LETTER TA' }, + [0x09A5] = { unicodeslot=0x09A5, category='lo', description='BENGALI LETTER THA' }, + [0x09A6] = { unicodeslot=0x09A6, category='lo', description='BENGALI LETTER DA' }, + [0x09A7] = { unicodeslot=0x09A7, category='lo', description='BENGALI LETTER DHA' }, + [0x09A8] = { unicodeslot=0x09A8, category='lo', description='BENGALI LETTER NA' }, + [0x09AA] = { unicodeslot=0x09AA, category='lo', description='BENGALI LETTER PA' }, + [0x09AB] = { unicodeslot=0x09AB, category='lo', description='BENGALI LETTER PHA' }, + [0x09AC] = { unicodeslot=0x09AC, category='lo', description='BENGALI LETTER BA' }, + [0x09AD] = { unicodeslot=0x09AD, category='lo', description='BENGALI LETTER BHA' }, + [0x09AE] = { unicodeslot=0x09AE, category='lo', description='BENGALI LETTER MA' }, + [0x09AF] = { unicodeslot=0x09AF, category='lo', description='BENGALI LETTER YA' }, + [0x09B0] = { unicodeslot=0x09B0, category='lo', description='BENGALI LETTER RA' }, + [0x09B2] = { unicodeslot=0x09B2, category='lo', description='BENGALI LETTER LA' }, + [0x09B6] = { unicodeslot=0x09B6, category='lo', description='BENGALI LETTER SHA' }, + [0x09B7] = { unicodeslot=0x09B7, category='lo', description='BENGALI LETTER SSA' }, + [0x09B8] = { unicodeslot=0x09B8, category='lo', description='BENGALI LETTER SA' }, + [0x09B9] = { unicodeslot=0x09B9, category='lo', description='BENGALI LETTER HA' }, + [0x09BC] = { unicodeslot=0x09BC, category='mn', description='BENGALI SIGN NUKTA' }, + [0x09BD] = { unicodeslot=0x09BD, category='lo', description='BENGALI SIGN AVAGRAHA' }, + [0x09BE] = { unicodeslot=0x09BE, category='mc', description='BENGALI VOWEL SIGN AA' }, + [0x09BF] = { unicodeslot=0x09BF, category='mc', description='BENGALI VOWEL SIGN I' }, + [0x09C0] = { unicodeslot=0x09C0, category='mc', description='BENGALI VOWEL SIGN II' }, + [0x09C1] = { unicodeslot=0x09C1, category='mn', description='BENGALI VOWEL SIGN U' }, + [0x09C2] = { unicodeslot=0x09C2, category='mn', description='BENGALI VOWEL SIGN UU' }, + [0x09C3] = { unicodeslot=0x09C3, category='mn', description='BENGALI VOWEL SIGN VOCALIC R' }, + [0x09C4] = { unicodeslot=0x09C4, category='mn', description='BENGALI VOWEL SIGN VOCALIC RR' }, + [0x09C7] = { unicodeslot=0x09C7, category='mc', description='BENGALI VOWEL SIGN E' }, + [0x09C8] = { unicodeslot=0x09C8, category='mc', description='BENGALI VOWEL SIGN AI' }, + [0x09CB] = { unicodeslot=0x09CB, category='mc', description='BENGALI VOWEL SIGN O', specials={'char',0x09C7,0x09BE} }, + [0x09CC] = { unicodeslot=0x09CC, category='mc', description='BENGALI VOWEL SIGN AU', specials={'char',0x09C7,0x09D7} }, + [0x09CD] = { unicodeslot=0x09CD, category='mn', description='BENGALI SIGN VIRAMA' }, + [0x09CE] = { unicodeslot=0x09CE, category='lo', description='BENGALI LETTER KHANDA TA' }, + [0x09D7] = { unicodeslot=0x09D7, category='mc', description='BENGALI AU LENGTH MARK' }, + [0x09DC] = { unicodeslot=0x09DC, category='lo', description='BENGALI LETTER RRA', specials={'char',0x09A1,0x09BC} }, + [0x09DD] = { unicodeslot=0x09DD, category='lo', description='BENGALI LETTER RHA', specials={'char',0x09A2,0x09BC} }, + [0x09DF] = { unicodeslot=0x09DF, category='lo', description='BENGALI LETTER YYA', specials={'char',0x09AF,0x09BC} }, + [0x09E0] = { unicodeslot=0x09E0, category='lo', description='BENGALI LETTER VOCALIC RR' }, + [0x09E1] = { unicodeslot=0x09E1, category='lo', description='BENGALI LETTER VOCALIC LL' }, + [0x09E2] = { unicodeslot=0x09E2, category='mn', description='BENGALI VOWEL SIGN VOCALIC L' }, + [0x09E3] = { unicodeslot=0x09E3, category='mn', description='BENGALI VOWEL SIGN VOCALIC LL' }, + [0x09E6] = { unicodeslot=0x09E6, category='nd', description='BENGALI DIGIT ZERO' }, + [0x09E7] = { unicodeslot=0x09E7, category='nd', description='BENGALI DIGIT ONE' }, + [0x09E8] = { unicodeslot=0x09E8, category='nd', description='BENGALI DIGIT TWO' }, + [0x09E9] = { unicodeslot=0x09E9, category='nd', description='BENGALI DIGIT THREE' }, + [0x09EA] = { unicodeslot=0x09EA, category='nd', description='BENGALI DIGIT FOUR' }, + [0x09EB] = { unicodeslot=0x09EB, category='nd', description='BENGALI DIGIT FIVE' }, + [0x09EC] = { unicodeslot=0x09EC, category='nd', description='BENGALI DIGIT SIX' }, + [0x09ED] = { unicodeslot=0x09ED, category='nd', description='BENGALI DIGIT SEVEN' }, + [0x09EE] = { unicodeslot=0x09EE, category='nd', description='BENGALI DIGIT EIGHT' }, + [0x09EF] = { unicodeslot=0x09EF, category='nd', description='BENGALI DIGIT NINE' }, + [0x09F0] = { unicodeslot=0x09F0, category='lo', description='BENGALI LETTER RA WITH MIDDLE DIAGONAL', shcode=0x09B0 }, + [0x09F1] = { unicodeslot=0x09F1, category='lo', description='BENGALI LETTER RA WITH LOWER DIAGONAL', shcode=0x09B0 }, + [0x09F2] = { unicodeslot=0x09F2, category='sc', description='BENGALI RUPEE MARK' }, + [0x09F3] = { unicodeslot=0x09F3, category='sc', description='BENGALI RUPEE SIGN' }, + [0x09F4] = { unicodeslot=0x09F4, category='no', description='BENGALI CURRENCY NUMERATOR ONE' }, + [0x09F5] = { unicodeslot=0x09F5, category='no', description='BENGALI CURRENCY NUMERATOR TWO' }, + [0x09F6] = { unicodeslot=0x09F6, category='no', description='BENGALI CURRENCY NUMERATOR THREE' }, + [0x09F7] = { unicodeslot=0x09F7, category='no', description='BENGALI CURRENCY NUMERATOR FOUR' }, + [0x09F8] = { unicodeslot=0x09F8, category='no', description='BENGALI CURRENCY NUMERATOR ONE LESS THAN THE DENOMINATOR' }, + [0x09F9] = { unicodeslot=0x09F9, category='no', description='BENGALI CURRENCY DENOMINATOR SIXTEEN' }, + [0x09FA] = { unicodeslot=0x09FA, category='so', description='BENGALI ISSHAR' }, + [0x0A01] = { unicodeslot=0x0A01, category='mn', description='GURMUKHI SIGN ADAK BINDI' }, + [0x0A02] = { unicodeslot=0x0A02, category='mn', description='GURMUKHI SIGN BINDI' }, + [0x0A03] = { unicodeslot=0x0A03, category='mc', description='GURMUKHI SIGN VISARGA' }, + [0x0A05] = { unicodeslot=0x0A05, category='lo', description='GURMUKHI LETTER A' }, + [0x0A06] = { unicodeslot=0x0A06, category='lo', description='GURMUKHI LETTER AA' }, + [0x0A07] = { unicodeslot=0x0A07, category='lo', description='GURMUKHI LETTER I' }, + [0x0A08] = { unicodeslot=0x0A08, category='lo', description='GURMUKHI LETTER II' }, + [0x0A09] = { unicodeslot=0x0A09, category='lo', description='GURMUKHI LETTER U' }, + [0x0A0A] = { unicodeslot=0x0A0A, category='lo', description='GURMUKHI LETTER UU' }, + [0x0A0F] = { unicodeslot=0x0A0F, category='lo', description='GURMUKHI LETTER EE' }, + [0x0A10] = { unicodeslot=0x0A10, category='lo', description='GURMUKHI LETTER AI' }, + [0x0A13] = { unicodeslot=0x0A13, category='lo', description='GURMUKHI LETTER OO' }, + [0x0A14] = { unicodeslot=0x0A14, category='lo', description='GURMUKHI LETTER AU' }, + [0x0A15] = { unicodeslot=0x0A15, category='lo', description='GURMUKHI LETTER KA' }, + [0x0A16] = { unicodeslot=0x0A16, category='lo', description='GURMUKHI LETTER KHA' }, + [0x0A17] = { unicodeslot=0x0A17, category='lo', description='GURMUKHI LETTER GA' }, + [0x0A18] = { unicodeslot=0x0A18, category='lo', description='GURMUKHI LETTER GHA' }, + [0x0A19] = { unicodeslot=0x0A19, category='lo', description='GURMUKHI LETTER NGA' }, + [0x0A1A] = { unicodeslot=0x0A1A, category='lo', description='GURMUKHI LETTER CA' }, + [0x0A1B] = { unicodeslot=0x0A1B, category='lo', description='GURMUKHI LETTER CHA' }, + [0x0A1C] = { unicodeslot=0x0A1C, category='lo', description='GURMUKHI LETTER JA' }, + [0x0A1D] = { unicodeslot=0x0A1D, category='lo', description='GURMUKHI LETTER JHA' }, + [0x0A1E] = { unicodeslot=0x0A1E, category='lo', description='GURMUKHI LETTER NYA' }, + [0x0A1F] = { unicodeslot=0x0A1F, category='lo', description='GURMUKHI LETTER TTA' }, + [0x0A20] = { unicodeslot=0x0A20, category='lo', description='GURMUKHI LETTER TTHA' }, + [0x0A21] = { unicodeslot=0x0A21, category='lo', description='GURMUKHI LETTER DDA' }, + [0x0A22] = { unicodeslot=0x0A22, category='lo', description='GURMUKHI LETTER DDHA' }, + [0x0A23] = { unicodeslot=0x0A23, category='lo', description='GURMUKHI LETTER NNA' }, + [0x0A24] = { unicodeslot=0x0A24, category='lo', description='GURMUKHI LETTER TA' }, + [0x0A25] = { unicodeslot=0x0A25, category='lo', description='GURMUKHI LETTER THA' }, + [0x0A26] = { unicodeslot=0x0A26, category='lo', description='GURMUKHI LETTER DA' }, + [0x0A27] = { unicodeslot=0x0A27, category='lo', description='GURMUKHI LETTER DHA' }, + [0x0A28] = { unicodeslot=0x0A28, category='lo', description='GURMUKHI LETTER NA' }, + [0x0A2A] = { unicodeslot=0x0A2A, category='lo', description='GURMUKHI LETTER PA' }, + [0x0A2B] = { unicodeslot=0x0A2B, category='lo', description='GURMUKHI LETTER PHA' }, + [0x0A2C] = { unicodeslot=0x0A2C, category='lo', description='GURMUKHI LETTER BA' }, + [0x0A2D] = { unicodeslot=0x0A2D, category='lo', description='GURMUKHI LETTER BHA' }, + [0x0A2E] = { unicodeslot=0x0A2E, category='lo', description='GURMUKHI LETTER MA' }, + [0x0A2F] = { unicodeslot=0x0A2F, category='lo', description='GURMUKHI LETTER YA' }, + [0x0A30] = { unicodeslot=0x0A30, category='lo', description='GURMUKHI LETTER RA' }, + [0x0A32] = { unicodeslot=0x0A32, category='lo', description='GURMUKHI LETTER LA' }, + [0x0A33] = { unicodeslot=0x0A33, category='lo', description='GURMUKHI LETTER LLA', specials={'char',0x0A32,0x0A3C} }, + [0x0A35] = { unicodeslot=0x0A35, category='lo', description='GURMUKHI LETTER VA' }, + [0x0A36] = { unicodeslot=0x0A36, category='lo', description='GURMUKHI LETTER SHA', specials={'char',0x0A38,0x0A3C} }, + [0x0A38] = { unicodeslot=0x0A38, category='lo', description='GURMUKHI LETTER SA' }, + [0x0A39] = { unicodeslot=0x0A39, category='lo', description='GURMUKHI LETTER HA' }, + [0x0A3C] = { unicodeslot=0x0A3C, category='mn', description='GURMUKHI SIGN NUKTA' }, + [0x0A3E] = { unicodeslot=0x0A3E, category='mc', description='GURMUKHI VOWEL SIGN AA' }, + [0x0A3F] = { unicodeslot=0x0A3F, category='mc', description='GURMUKHI VOWEL SIGN I' }, + [0x0A40] = { unicodeslot=0x0A40, category='mc', description='GURMUKHI VOWEL SIGN II' }, + [0x0A41] = { unicodeslot=0x0A41, category='mn', description='GURMUKHI VOWEL SIGN U' }, + [0x0A42] = { unicodeslot=0x0A42, category='mn', description='GURMUKHI VOWEL SIGN UU' }, + [0x0A47] = { unicodeslot=0x0A47, category='mn', description='GURMUKHI VOWEL SIGN EE' }, + [0x0A48] = { unicodeslot=0x0A48, category='mn', description='GURMUKHI VOWEL SIGN AI' }, + [0x0A4B] = { unicodeslot=0x0A4B, category='mn', description='GURMUKHI VOWEL SIGN OO' }, + [0x0A4C] = { unicodeslot=0x0A4C, category='mn', description='GURMUKHI VOWEL SIGN AU' }, + [0x0A4D] = { unicodeslot=0x0A4D, category='mn', description='GURMUKHI SIGN VIRAMA' }, + [0x0A59] = { unicodeslot=0x0A59, category='lo', description='GURMUKHI LETTER KHHA', specials={'char',0x0A16,0x0A3C} }, + [0x0A5A] = { unicodeslot=0x0A5A, category='lo', description='GURMUKHI LETTER GHHA', specials={'char',0x0A17,0x0A3C} }, + [0x0A5B] = { unicodeslot=0x0A5B, category='lo', description='GURMUKHI LETTER ZA', specials={'char',0x0A1C,0x0A3C} }, + [0x0A5C] = { unicodeslot=0x0A5C, category='lo', description='GURMUKHI LETTER RRA' }, + [0x0A5E] = { unicodeslot=0x0A5E, category='lo', description='GURMUKHI LETTER FA', specials={'char',0x0A2B,0x0A3C} }, + [0x0A66] = { unicodeslot=0x0A66, category='nd', description='GURMUKHI DIGIT ZERO' }, + [0x0A67] = { unicodeslot=0x0A67, category='nd', description='GURMUKHI DIGIT ONE' }, + [0x0A68] = { unicodeslot=0x0A68, category='nd', description='GURMUKHI DIGIT TWO' }, + [0x0A69] = { unicodeslot=0x0A69, category='nd', description='GURMUKHI DIGIT THREE' }, + [0x0A6A] = { unicodeslot=0x0A6A, category='nd', description='GURMUKHI DIGIT FOUR' }, + [0x0A6B] = { unicodeslot=0x0A6B, category='nd', description='GURMUKHI DIGIT FIVE' }, + [0x0A6C] = { unicodeslot=0x0A6C, category='nd', description='GURMUKHI DIGIT SIX' }, + [0x0A6D] = { unicodeslot=0x0A6D, category='nd', description='GURMUKHI DIGIT SEVEN' }, + [0x0A6E] = { unicodeslot=0x0A6E, category='nd', description='GURMUKHI DIGIT EIGHT' }, + [0x0A6F] = { unicodeslot=0x0A6F, category='nd', description='GURMUKHI DIGIT NINE' }, + [0x0A70] = { unicodeslot=0x0A70, category='mn', description='GURMUKHI TIPPI' }, + [0x0A71] = { unicodeslot=0x0A71, category='mn', description='GURMUKHI ADDAK' }, + [0x0A72] = { unicodeslot=0x0A72, category='lo', description='GURMUKHI IRI' }, + [0x0A73] = { unicodeslot=0x0A73, category='lo', description='GURMUKHI URA' }, + [0x0A74] = { unicodeslot=0x0A74, category='lo', description='GURMUKHI EK ONKAR' }, + [0x0A81] = { unicodeslot=0x0A81, category='mn', description='GUJARATI SIGN CANDRABINDU' }, + [0x0A82] = { unicodeslot=0x0A82, category='mn', description='GUJARATI SIGN ANUSVARA' }, + [0x0A83] = { unicodeslot=0x0A83, category='mc', description='GUJARATI SIGN VISARGA' }, + [0x0A85] = { unicodeslot=0x0A85, category='lo', description='GUJARATI LETTER A' }, + [0x0A86] = { unicodeslot=0x0A86, category='lo', description='GUJARATI LETTER AA' }, + [0x0A87] = { unicodeslot=0x0A87, category='lo', description='GUJARATI LETTER I' }, + [0x0A88] = { unicodeslot=0x0A88, category='lo', description='GUJARATI LETTER II' }, + [0x0A89] = { unicodeslot=0x0A89, category='lo', description='GUJARATI LETTER U' }, + [0x0A8A] = { unicodeslot=0x0A8A, category='lo', description='GUJARATI LETTER UU' }, + [0x0A8B] = { unicodeslot=0x0A8B, category='lo', description='GUJARATI LETTER VOCALIC R' }, + [0x0A8C] = { unicodeslot=0x0A8C, category='lo', description='GUJARATI LETTER VOCALIC L' }, + [0x0A8D] = { unicodeslot=0x0A8D, category='lo', description='GUJARATI VOWEL CANDRA E' }, + [0x0A8F] = { unicodeslot=0x0A8F, category='lo', description='GUJARATI LETTER E' }, + [0x0A90] = { unicodeslot=0x0A90, category='lo', description='GUJARATI LETTER AI' }, + [0x0A91] = { unicodeslot=0x0A91, category='lo', description='GUJARATI VOWEL CANDRA O' }, + [0x0A93] = { unicodeslot=0x0A93, category='lo', description='GUJARATI LETTER O' }, + [0x0A94] = { unicodeslot=0x0A94, category='lo', description='GUJARATI LETTER AU' }, + [0x0A95] = { unicodeslot=0x0A95, category='lo', description='GUJARATI LETTER KA' }, + [0x0A96] = { unicodeslot=0x0A96, category='lo', description='GUJARATI LETTER KHA' }, + [0x0A97] = { unicodeslot=0x0A97, category='lo', description='GUJARATI LETTER GA' }, + [0x0A98] = { unicodeslot=0x0A98, category='lo', description='GUJARATI LETTER GHA' }, + [0x0A99] = { unicodeslot=0x0A99, category='lo', description='GUJARATI LETTER NGA' }, + [0x0A9A] = { unicodeslot=0x0A9A, category='lo', description='GUJARATI LETTER CA' }, + [0x0A9B] = { unicodeslot=0x0A9B, category='lo', description='GUJARATI LETTER CHA' }, + [0x0A9C] = { unicodeslot=0x0A9C, category='lo', description='GUJARATI LETTER JA' }, + [0x0A9D] = { unicodeslot=0x0A9D, category='lo', description='GUJARATI LETTER JHA' }, + [0x0A9E] = { unicodeslot=0x0A9E, category='lo', description='GUJARATI LETTER NYA' }, + [0x0A9F] = { unicodeslot=0x0A9F, category='lo', description='GUJARATI LETTER TTA' }, + [0x0AA0] = { unicodeslot=0x0AA0, category='lo', description='GUJARATI LETTER TTHA' }, + [0x0AA1] = { unicodeslot=0x0AA1, category='lo', description='GUJARATI LETTER DDA' }, + [0x0AA2] = { unicodeslot=0x0AA2, category='lo', description='GUJARATI LETTER DDHA' }, + [0x0AA3] = { unicodeslot=0x0AA3, category='lo', description='GUJARATI LETTER NNA' }, + [0x0AA4] = { unicodeslot=0x0AA4, category='lo', description='GUJARATI LETTER TA' }, + [0x0AA5] = { unicodeslot=0x0AA5, category='lo', description='GUJARATI LETTER THA' }, + [0x0AA6] = { unicodeslot=0x0AA6, category='lo', description='GUJARATI LETTER DA' }, + [0x0AA7] = { unicodeslot=0x0AA7, category='lo', description='GUJARATI LETTER DHA' }, + [0x0AA8] = { unicodeslot=0x0AA8, category='lo', description='GUJARATI LETTER NA' }, + [0x0AAA] = { unicodeslot=0x0AAA, category='lo', description='GUJARATI LETTER PA' }, + [0x0AAB] = { unicodeslot=0x0AAB, category='lo', description='GUJARATI LETTER PHA' }, + [0x0AAC] = { unicodeslot=0x0AAC, category='lo', description='GUJARATI LETTER BA' }, + [0x0AAD] = { unicodeslot=0x0AAD, category='lo', description='GUJARATI LETTER BHA' }, + [0x0AAE] = { unicodeslot=0x0AAE, category='lo', description='GUJARATI LETTER MA' }, + [0x0AAF] = { unicodeslot=0x0AAF, category='lo', description='GUJARATI LETTER YA' }, + [0x0AB0] = { unicodeslot=0x0AB0, category='lo', description='GUJARATI LETTER RA' }, + [0x0AB2] = { unicodeslot=0x0AB2, category='lo', description='GUJARATI LETTER LA' }, + [0x0AB3] = { unicodeslot=0x0AB3, category='lo', description='GUJARATI LETTER LLA' }, + [0x0AB5] = { unicodeslot=0x0AB5, category='lo', description='GUJARATI LETTER VA' }, + [0x0AB6] = { unicodeslot=0x0AB6, category='lo', description='GUJARATI LETTER SHA' }, + [0x0AB7] = { unicodeslot=0x0AB7, category='lo', description='GUJARATI LETTER SSA' }, + [0x0AB8] = { unicodeslot=0x0AB8, category='lo', description='GUJARATI LETTER SA' }, + [0x0AB9] = { unicodeslot=0x0AB9, category='lo', description='GUJARATI LETTER HA' }, + [0x0ABC] = { unicodeslot=0x0ABC, category='mn', description='GUJARATI SIGN NUKTA' }, + [0x0ABD] = { unicodeslot=0x0ABD, category='lo', description='GUJARATI SIGN AVAGRAHA' }, + [0x0ABE] = { unicodeslot=0x0ABE, category='mc', description='GUJARATI VOWEL SIGN AA' }, + [0x0ABF] = { unicodeslot=0x0ABF, category='mc', description='GUJARATI VOWEL SIGN I' }, + [0x0AC0] = { unicodeslot=0x0AC0, category='mc', description='GUJARATI VOWEL SIGN II' }, + [0x0AC1] = { unicodeslot=0x0AC1, category='mn', description='GUJARATI VOWEL SIGN U' }, + [0x0AC2] = { unicodeslot=0x0AC2, category='mn', description='GUJARATI VOWEL SIGN UU' }, + [0x0AC3] = { unicodeslot=0x0AC3, category='mn', description='GUJARATI VOWEL SIGN VOCALIC R' }, + [0x0AC4] = { unicodeslot=0x0AC4, category='mn', description='GUJARATI VOWEL SIGN VOCALIC RR' }, + [0x0AC5] = { unicodeslot=0x0AC5, category='mn', description='GUJARATI VOWEL SIGN CANDRA E' }, + [0x0AC7] = { unicodeslot=0x0AC7, category='mn', description='GUJARATI VOWEL SIGN E' }, + [0x0AC8] = { unicodeslot=0x0AC8, category='mn', description='GUJARATI VOWEL SIGN AI' }, + [0x0AC9] = { unicodeslot=0x0AC9, category='mc', description='GUJARATI VOWEL SIGN CANDRA O' }, + [0x0ACB] = { unicodeslot=0x0ACB, category='mc', description='GUJARATI VOWEL SIGN O' }, + [0x0ACC] = { unicodeslot=0x0ACC, category='mc', description='GUJARATI VOWEL SIGN AU' }, + [0x0ACD] = { unicodeslot=0x0ACD, category='mn', description='GUJARATI SIGN VIRAMA' }, + [0x0AD0] = { unicodeslot=0x0AD0, category='lo', description='GUJARATI OM' }, + [0x0AE0] = { unicodeslot=0x0AE0, category='lo', description='GUJARATI LETTER VOCALIC RR' }, + [0x0AE1] = { unicodeslot=0x0AE1, category='lo', description='GUJARATI LETTER VOCALIC LL' }, + [0x0AE2] = { unicodeslot=0x0AE2, category='mn', description='GUJARATI VOWEL SIGN VOCALIC L' }, + [0x0AE3] = { unicodeslot=0x0AE3, category='mn', description='GUJARATI VOWEL SIGN VOCALIC LL' }, + [0x0AE6] = { unicodeslot=0x0AE6, category='nd', description='GUJARATI DIGIT ZERO' }, + [0x0AE7] = { unicodeslot=0x0AE7, category='nd', description='GUJARATI DIGIT ONE' }, + [0x0AE8] = { unicodeslot=0x0AE8, category='nd', description='GUJARATI DIGIT TWO' }, + [0x0AE9] = { unicodeslot=0x0AE9, category='nd', description='GUJARATI DIGIT THREE' }, + [0x0AEA] = { unicodeslot=0x0AEA, category='nd', description='GUJARATI DIGIT FOUR' }, + [0x0AEB] = { unicodeslot=0x0AEB, category='nd', description='GUJARATI DIGIT FIVE' }, + [0x0AEC] = { unicodeslot=0x0AEC, category='nd', description='GUJARATI DIGIT SIX' }, + [0x0AED] = { unicodeslot=0x0AED, category='nd', description='GUJARATI DIGIT SEVEN' }, + [0x0AEE] = { unicodeslot=0x0AEE, category='nd', description='GUJARATI DIGIT EIGHT' }, + [0x0AEF] = { unicodeslot=0x0AEF, category='nd', description='GUJARATI DIGIT NINE' }, + [0x0AF1] = { unicodeslot=0x0AF1, category='sc', description='GUJARATI RUPEE SIGN' }, + [0x0B01] = { unicodeslot=0x0B01, category='mn', description='ORIYA SIGN CANDRABINDU' }, + [0x0B02] = { unicodeslot=0x0B02, category='mc', description='ORIYA SIGN ANUSVARA' }, + [0x0B03] = { unicodeslot=0x0B03, category='mc', description='ORIYA SIGN VISARGA' }, + [0x0B05] = { unicodeslot=0x0B05, category='lo', description='ORIYA LETTER A' }, + [0x0B06] = { unicodeslot=0x0B06, category='lo', description='ORIYA LETTER AA' }, + [0x0B07] = { unicodeslot=0x0B07, category='lo', description='ORIYA LETTER I' }, + [0x0B08] = { unicodeslot=0x0B08, category='lo', description='ORIYA LETTER II' }, + [0x0B09] = { unicodeslot=0x0B09, category='lo', description='ORIYA LETTER U' }, + [0x0B0A] = { unicodeslot=0x0B0A, category='lo', description='ORIYA LETTER UU' }, + [0x0B0B] = { unicodeslot=0x0B0B, category='lo', description='ORIYA LETTER VOCALIC R' }, + [0x0B0C] = { unicodeslot=0x0B0C, category='lo', description='ORIYA LETTER VOCALIC L' }, + [0x0B0F] = { unicodeslot=0x0B0F, category='lo', description='ORIYA LETTER E' }, + [0x0B10] = { unicodeslot=0x0B10, category='lo', description='ORIYA LETTER AI' }, + [0x0B13] = { unicodeslot=0x0B13, category='lo', description='ORIYA LETTER O' }, + [0x0B14] = { unicodeslot=0x0B14, category='lo', description='ORIYA LETTER AU' }, + [0x0B15] = { unicodeslot=0x0B15, category='lo', description='ORIYA LETTER KA' }, + [0x0B16] = { unicodeslot=0x0B16, category='lo', description='ORIYA LETTER KHA' }, + [0x0B17] = { unicodeslot=0x0B17, category='lo', description='ORIYA LETTER GA' }, + [0x0B18] = { unicodeslot=0x0B18, category='lo', description='ORIYA LETTER GHA' }, + [0x0B19] = { unicodeslot=0x0B19, category='lo', description='ORIYA LETTER NGA' }, + [0x0B1A] = { unicodeslot=0x0B1A, category='lo', description='ORIYA LETTER CA' }, + [0x0B1B] = { unicodeslot=0x0B1B, category='lo', description='ORIYA LETTER CHA' }, + [0x0B1C] = { unicodeslot=0x0B1C, category='lo', description='ORIYA LETTER JA' }, + [0x0B1D] = { unicodeslot=0x0B1D, category='lo', description='ORIYA LETTER JHA' }, + [0x0B1E] = { unicodeslot=0x0B1E, category='lo', description='ORIYA LETTER NYA' }, + [0x0B1F] = { unicodeslot=0x0B1F, category='lo', description='ORIYA LETTER TTA' }, + [0x0B20] = { unicodeslot=0x0B20, category='lo', description='ORIYA LETTER TTHA' }, + [0x0B21] = { unicodeslot=0x0B21, category='lo', description='ORIYA LETTER DDA' }, + [0x0B22] = { unicodeslot=0x0B22, category='lo', description='ORIYA LETTER DDHA' }, + [0x0B23] = { unicodeslot=0x0B23, category='lo', description='ORIYA LETTER NNA' }, + [0x0B24] = { unicodeslot=0x0B24, category='lo', description='ORIYA LETTER TA' }, + [0x0B25] = { unicodeslot=0x0B25, category='lo', description='ORIYA LETTER THA' }, + [0x0B26] = { unicodeslot=0x0B26, category='lo', description='ORIYA LETTER DA' }, + [0x0B27] = { unicodeslot=0x0B27, category='lo', description='ORIYA LETTER DHA' }, + [0x0B28] = { unicodeslot=0x0B28, category='lo', description='ORIYA LETTER NA' }, + [0x0B2A] = { unicodeslot=0x0B2A, category='lo', description='ORIYA LETTER PA' }, + [0x0B2B] = { unicodeslot=0x0B2B, category='lo', description='ORIYA LETTER PHA' }, + [0x0B2C] = { unicodeslot=0x0B2C, category='lo', description='ORIYA LETTER BA' }, + [0x0B2D] = { unicodeslot=0x0B2D, category='lo', description='ORIYA LETTER BHA' }, + [0x0B2E] = { unicodeslot=0x0B2E, category='lo', description='ORIYA LETTER MA' }, + [0x0B2F] = { unicodeslot=0x0B2F, category='lo', description='ORIYA LETTER YA' }, + [0x0B30] = { unicodeslot=0x0B30, category='lo', description='ORIYA LETTER RA' }, + [0x0B32] = { unicodeslot=0x0B32, category='lo', description='ORIYA LETTER LA' }, + [0x0B33] = { unicodeslot=0x0B33, category='lo', description='ORIYA LETTER LLA' }, + [0x0B35] = { unicodeslot=0x0B35, category='lo', description='ORIYA LETTER VA' }, + [0x0B36] = { unicodeslot=0x0B36, category='lo', description='ORIYA LETTER SHA' }, + [0x0B37] = { unicodeslot=0x0B37, category='lo', description='ORIYA LETTER SSA' }, + [0x0B38] = { unicodeslot=0x0B38, category='lo', description='ORIYA LETTER SA' }, + [0x0B39] = { unicodeslot=0x0B39, category='lo', description='ORIYA LETTER HA' }, + [0x0B3C] = { unicodeslot=0x0B3C, category='mn', description='ORIYA SIGN NUKTA' }, + [0x0B3D] = { unicodeslot=0x0B3D, category='lo', description='ORIYA SIGN AVAGRAHA' }, + [0x0B3E] = { unicodeslot=0x0B3E, category='mc', description='ORIYA VOWEL SIGN AA' }, + [0x0B3F] = { unicodeslot=0x0B3F, category='mn', description='ORIYA VOWEL SIGN I' }, + [0x0B40] = { unicodeslot=0x0B40, category='mc', description='ORIYA VOWEL SIGN II' }, + [0x0B41] = { unicodeslot=0x0B41, category='mn', description='ORIYA VOWEL SIGN U' }, + [0x0B42] = { unicodeslot=0x0B42, category='mn', description='ORIYA VOWEL SIGN UU' }, + [0x0B43] = { unicodeslot=0x0B43, category='mn', description='ORIYA VOWEL SIGN VOCALIC R' }, + [0x0B47] = { unicodeslot=0x0B47, category='mc', description='ORIYA VOWEL SIGN E' }, + [0x0B48] = { unicodeslot=0x0B48, category='mc', description='ORIYA VOWEL SIGN AI', specials={'char',0x0B47,0x0B56} }, + [0x0B4B] = { unicodeslot=0x0B4B, category='mc', description='ORIYA VOWEL SIGN O', specials={'char',0x0B47,0x0B3E} }, + [0x0B4C] = { unicodeslot=0x0B4C, category='mc', description='ORIYA VOWEL SIGN AU', specials={'char',0x0B47,0x0B57} }, + [0x0B4D] = { unicodeslot=0x0B4D, category='mn', description='ORIYA SIGN VIRAMA' }, + [0x0B56] = { unicodeslot=0x0B56, category='mn', description='ORIYA AI LENGTH MARK' }, + [0x0B57] = { unicodeslot=0x0B57, category='mc', description='ORIYA AU LENGTH MARK' }, + [0x0B5C] = { unicodeslot=0x0B5C, category='lo', description='ORIYA LETTER RRA', specials={'char',0x0B21,0x0B3C} }, + [0x0B5D] = { unicodeslot=0x0B5D, category='lo', description='ORIYA LETTER RHA', specials={'char',0x0B22,0x0B3C} }, + [0x0B5F] = { unicodeslot=0x0B5F, category='lo', description='ORIYA LETTER YYA' }, + [0x0B60] = { unicodeslot=0x0B60, category='lo', description='ORIYA LETTER VOCALIC RR' }, + [0x0B61] = { unicodeslot=0x0B61, category='lo', description='ORIYA LETTER VOCALIC LL' }, + [0x0B66] = { unicodeslot=0x0B66, category='nd', description='ORIYA DIGIT ZERO' }, + [0x0B67] = { unicodeslot=0x0B67, category='nd', description='ORIYA DIGIT ONE' }, + [0x0B68] = { unicodeslot=0x0B68, category='nd', description='ORIYA DIGIT TWO' }, + [0x0B69] = { unicodeslot=0x0B69, category='nd', description='ORIYA DIGIT THREE' }, + [0x0B6A] = { unicodeslot=0x0B6A, category='nd', description='ORIYA DIGIT FOUR' }, + [0x0B6B] = { unicodeslot=0x0B6B, category='nd', description='ORIYA DIGIT FIVE' }, + [0x0B6C] = { unicodeslot=0x0B6C, category='nd', description='ORIYA DIGIT SIX' }, + [0x0B6D] = { unicodeslot=0x0B6D, category='nd', description='ORIYA DIGIT SEVEN' }, + [0x0B6E] = { unicodeslot=0x0B6E, category='nd', description='ORIYA DIGIT EIGHT' }, + [0x0B6F] = { unicodeslot=0x0B6F, category='nd', description='ORIYA DIGIT NINE' }, + [0x0B70] = { unicodeslot=0x0B70, category='so', description='ORIYA ISSHAR' }, + [0x0B71] = { unicodeslot=0x0B71, category='lo', description='ORIYA LETTER WA' }, + [0x0B82] = { unicodeslot=0x0B82, category='mn', description='TAMIL SIGN ANUSVARA' }, + [0x0B83] = { unicodeslot=0x0B83, category='lo', description='TAMIL SIGN VISARGA' }, + [0x0B85] = { unicodeslot=0x0B85, category='lo', description='TAMIL LETTER A' }, + [0x0B86] = { unicodeslot=0x0B86, category='lo', description='TAMIL LETTER AA' }, + [0x0B87] = { unicodeslot=0x0B87, category='lo', description='TAMIL LETTER I' }, + [0x0B88] = { unicodeslot=0x0B88, category='lo', description='TAMIL LETTER II' }, + [0x0B89] = { unicodeslot=0x0B89, category='lo', description='TAMIL LETTER U' }, + [0x0B8A] = { unicodeslot=0x0B8A, category='lo', description='TAMIL LETTER UU' }, + [0x0B8E] = { unicodeslot=0x0B8E, category='lo', description='TAMIL LETTER E' }, + [0x0B8F] = { unicodeslot=0x0B8F, category='lo', description='TAMIL LETTER EE' }, + [0x0B90] = { unicodeslot=0x0B90, category='lo', description='TAMIL LETTER AI' }, + [0x0B92] = { unicodeslot=0x0B92, category='lo', description='TAMIL LETTER O' }, + [0x0B93] = { unicodeslot=0x0B93, category='lo', description='TAMIL LETTER OO' }, + [0x0B94] = { unicodeslot=0x0B94, category='lo', description='TAMIL LETTER AU', specials={'char',0x0B92,0x0BD7} }, + [0x0B95] = { unicodeslot=0x0B95, category='lo', description='TAMIL LETTER KA' }, + [0x0B99] = { unicodeslot=0x0B99, category='lo', description='TAMIL LETTER NGA' }, + [0x0B9A] = { unicodeslot=0x0B9A, category='lo', description='TAMIL LETTER CA' }, + [0x0B9C] = { unicodeslot=0x0B9C, category='lo', description='TAMIL LETTER JA' }, + [0x0B9E] = { unicodeslot=0x0B9E, category='lo', description='TAMIL LETTER NYA' }, + [0x0B9F] = { unicodeslot=0x0B9F, category='lo', description='TAMIL LETTER TTA' }, + [0x0BA3] = { unicodeslot=0x0BA3, category='lo', description='TAMIL LETTER NNA' }, + [0x0BA4] = { unicodeslot=0x0BA4, category='lo', description='TAMIL LETTER TA' }, + [0x0BA8] = { unicodeslot=0x0BA8, category='lo', description='TAMIL LETTER NA' }, + [0x0BA9] = { unicodeslot=0x0BA9, category='lo', description='TAMIL LETTER NNNA' }, + [0x0BAA] = { unicodeslot=0x0BAA, category='lo', description='TAMIL LETTER PA' }, + [0x0BAE] = { unicodeslot=0x0BAE, category='lo', description='TAMIL LETTER MA' }, + [0x0BAF] = { unicodeslot=0x0BAF, category='lo', description='TAMIL LETTER YA' }, + [0x0BB0] = { unicodeslot=0x0BB0, category='lo', description='TAMIL LETTER RA' }, + [0x0BB1] = { unicodeslot=0x0BB1, category='lo', description='TAMIL LETTER RRA' }, + [0x0BB2] = { unicodeslot=0x0BB2, category='lo', description='TAMIL LETTER LA' }, + [0x0BB3] = { unicodeslot=0x0BB3, category='lo', description='TAMIL LETTER LLA' }, + [0x0BB4] = { unicodeslot=0x0BB4, category='lo', description='TAMIL LETTER LLLA' }, + [0x0BB5] = { unicodeslot=0x0BB5, category='lo', description='TAMIL LETTER VA' }, + [0x0BB6] = { unicodeslot=0x0BB6, category='lo', description='TAMIL LETTER SHA' }, + [0x0BB7] = { unicodeslot=0x0BB7, category='lo', description='TAMIL LETTER SSA' }, + [0x0BB8] = { unicodeslot=0x0BB8, category='lo', description='TAMIL LETTER SA' }, + [0x0BB9] = { unicodeslot=0x0BB9, category='lo', description='TAMIL LETTER HA' }, + [0x0BBE] = { unicodeslot=0x0BBE, category='mc', description='TAMIL VOWEL SIGN AA' }, + [0x0BBF] = { unicodeslot=0x0BBF, category='mc', description='TAMIL VOWEL SIGN I' }, + [0x0BC0] = { unicodeslot=0x0BC0, category='mn', description='TAMIL VOWEL SIGN II' }, + [0x0BC1] = { unicodeslot=0x0BC1, category='mc', description='TAMIL VOWEL SIGN U' }, + [0x0BC2] = { unicodeslot=0x0BC2, category='mc', description='TAMIL VOWEL SIGN UU' }, + [0x0BC6] = { unicodeslot=0x0BC6, category='mc', description='TAMIL VOWEL SIGN E' }, + [0x0BC7] = { unicodeslot=0x0BC7, category='mc', description='TAMIL VOWEL SIGN EE' }, + [0x0BC8] = { unicodeslot=0x0BC8, category='mc', description='TAMIL VOWEL SIGN AI' }, + [0x0BCA] = { unicodeslot=0x0BCA, category='mc', description='TAMIL VOWEL SIGN O', specials={'char',0x0BC6,0x0BBE} }, + [0x0BCB] = { unicodeslot=0x0BCB, category='mc', description='TAMIL VOWEL SIGN OO', specials={'char',0x0BC7,0x0BBE} }, + [0x0BCC] = { unicodeslot=0x0BCC, category='mc', description='TAMIL VOWEL SIGN AU', specials={'char',0x0BC6,0x0BD7} }, + [0x0BCD] = { unicodeslot=0x0BCD, category='mn', description='TAMIL SIGN VIRAMA' }, + [0x0BD7] = { unicodeslot=0x0BD7, category='mc', description='TAMIL AU LENGTH MARK' }, + [0x0BE6] = { unicodeslot=0x0BE6, category='nd', description='TAMIL DIGIT ZERO' }, + [0x0BE7] = { unicodeslot=0x0BE7, category='nd', description='TAMIL DIGIT ONE' }, + [0x0BE8] = { unicodeslot=0x0BE8, category='nd', description='TAMIL DIGIT TWO' }, + [0x0BE9] = { unicodeslot=0x0BE9, category='nd', description='TAMIL DIGIT THREE' }, + [0x0BEA] = { unicodeslot=0x0BEA, category='nd', description='TAMIL DIGIT FOUR' }, + [0x0BEB] = { unicodeslot=0x0BEB, category='nd', description='TAMIL DIGIT FIVE' }, + [0x0BEC] = { unicodeslot=0x0BEC, category='nd', description='TAMIL DIGIT SIX' }, + [0x0BED] = { unicodeslot=0x0BED, category='nd', description='TAMIL DIGIT SEVEN' }, + [0x0BEE] = { unicodeslot=0x0BEE, category='nd', description='TAMIL DIGIT EIGHT' }, + [0x0BEF] = { unicodeslot=0x0BEF, category='nd', description='TAMIL DIGIT NINE' }, + [0x0BF0] = { unicodeslot=0x0BF0, category='no', description='TAMIL NUMBER TEN' }, + [0x0BF1] = { unicodeslot=0x0BF1, category='no', description='TAMIL NUMBER ONE HUNDRED' }, + [0x0BF2] = { unicodeslot=0x0BF2, category='no', description='TAMIL NUMBER ONE THOUSAND' }, + [0x0BF3] = { unicodeslot=0x0BF3, category='so', description='TAMIL DAY SIGN' }, + [0x0BF4] = { unicodeslot=0x0BF4, category='so', description='TAMIL MONTH SIGN' }, + [0x0BF5] = { unicodeslot=0x0BF5, category='so', description='TAMIL YEAR SIGN' }, + [0x0BF6] = { unicodeslot=0x0BF6, category='so', description='TAMIL DEBIT SIGN' }, + [0x0BF7] = { unicodeslot=0x0BF7, category='so', description='TAMIL CREDIT SIGN' }, + [0x0BF8] = { unicodeslot=0x0BF8, category='so', description='TAMIL AS ABOVE SIGN' }, + [0x0BF9] = { unicodeslot=0x0BF9, category='sc', description='TAMIL RUPEE SIGN' }, + [0x0BFA] = { unicodeslot=0x0BFA, category='so', description='TAMIL NUMBER SIGN' }, + [0x0C01] = { unicodeslot=0x0C01, category='mc', description='TELUGU SIGN CANDRABINDU' }, + [0x0C02] = { unicodeslot=0x0C02, category='mc', description='TELUGU SIGN ANUSVARA' }, + [0x0C03] = { unicodeslot=0x0C03, category='mc', description='TELUGU SIGN VISARGA' }, + [0x0C05] = { unicodeslot=0x0C05, category='lo', description='TELUGU LETTER A' }, + [0x0C06] = { unicodeslot=0x0C06, category='lo', description='TELUGU LETTER AA' }, + [0x0C07] = { unicodeslot=0x0C07, category='lo', description='TELUGU LETTER I' }, + [0x0C08] = { unicodeslot=0x0C08, category='lo', description='TELUGU LETTER II' }, + [0x0C09] = { unicodeslot=0x0C09, category='lo', description='TELUGU LETTER U' }, + [0x0C0A] = { unicodeslot=0x0C0A, category='lo', description='TELUGU LETTER UU' }, + [0x0C0B] = { unicodeslot=0x0C0B, category='lo', description='TELUGU LETTER VOCALIC R' }, + [0x0C0C] = { unicodeslot=0x0C0C, category='lo', description='TELUGU LETTER VOCALIC L' }, + [0x0C0E] = { unicodeslot=0x0C0E, category='lo', description='TELUGU LETTER E' }, + [0x0C0F] = { unicodeslot=0x0C0F, category='lo', description='TELUGU LETTER EE' }, + [0x0C10] = { unicodeslot=0x0C10, category='lo', description='TELUGU LETTER AI' }, + [0x0C12] = { unicodeslot=0x0C12, category='lo', description='TELUGU LETTER O' }, + [0x0C13] = { unicodeslot=0x0C13, category='lo', description='TELUGU LETTER OO' }, + [0x0C14] = { unicodeslot=0x0C14, category='lo', description='TELUGU LETTER AU' }, + [0x0C15] = { unicodeslot=0x0C15, category='lo', description='TELUGU LETTER KA' }, + [0x0C16] = { unicodeslot=0x0C16, category='lo', description='TELUGU LETTER KHA' }, + [0x0C17] = { unicodeslot=0x0C17, category='lo', description='TELUGU LETTER GA' }, + [0x0C18] = { unicodeslot=0x0C18, category='lo', description='TELUGU LETTER GHA' }, + [0x0C19] = { unicodeslot=0x0C19, category='lo', description='TELUGU LETTER NGA' }, + [0x0C1A] = { unicodeslot=0x0C1A, category='lo', description='TELUGU LETTER CA' }, + [0x0C1B] = { unicodeslot=0x0C1B, category='lo', description='TELUGU LETTER CHA' }, + [0x0C1C] = { unicodeslot=0x0C1C, category='lo', description='TELUGU LETTER JA' }, + [0x0C1D] = { unicodeslot=0x0C1D, category='lo', description='TELUGU LETTER JHA' }, + [0x0C1E] = { unicodeslot=0x0C1E, category='lo', description='TELUGU LETTER NYA' }, + [0x0C1F] = { unicodeslot=0x0C1F, category='lo', description='TELUGU LETTER TTA' }, + [0x0C20] = { unicodeslot=0x0C20, category='lo', description='TELUGU LETTER TTHA' }, + [0x0C21] = { unicodeslot=0x0C21, category='lo', description='TELUGU LETTER DDA' }, + [0x0C22] = { unicodeslot=0x0C22, category='lo', description='TELUGU LETTER DDHA' }, + [0x0C23] = { unicodeslot=0x0C23, category='lo', description='TELUGU LETTER NNA' }, + [0x0C24] = { unicodeslot=0x0C24, category='lo', description='TELUGU LETTER TA' }, + [0x0C25] = { unicodeslot=0x0C25, category='lo', description='TELUGU LETTER THA' }, + [0x0C26] = { unicodeslot=0x0C26, category='lo', description='TELUGU LETTER DA' }, + [0x0C27] = { unicodeslot=0x0C27, category='lo', description='TELUGU LETTER DHA' }, + [0x0C28] = { unicodeslot=0x0C28, category='lo', description='TELUGU LETTER NA' }, + [0x0C2A] = { unicodeslot=0x0C2A, category='lo', description='TELUGU LETTER PA' }, + [0x0C2B] = { unicodeslot=0x0C2B, category='lo', description='TELUGU LETTER PHA' }, + [0x0C2C] = { unicodeslot=0x0C2C, category='lo', description='TELUGU LETTER BA' }, + [0x0C2D] = { unicodeslot=0x0C2D, category='lo', description='TELUGU LETTER BHA' }, + [0x0C2E] = { unicodeslot=0x0C2E, category='lo', description='TELUGU LETTER MA' }, + [0x0C2F] = { unicodeslot=0x0C2F, category='lo', description='TELUGU LETTER YA' }, + [0x0C30] = { unicodeslot=0x0C30, category='lo', description='TELUGU LETTER RA' }, + [0x0C31] = { unicodeslot=0x0C31, category='lo', description='TELUGU LETTER RRA' }, + [0x0C32] = { unicodeslot=0x0C32, category='lo', description='TELUGU LETTER LA' }, + [0x0C33] = { unicodeslot=0x0C33, category='lo', description='TELUGU LETTER LLA' }, + [0x0C35] = { unicodeslot=0x0C35, category='lo', description='TELUGU LETTER VA' }, + [0x0C36] = { unicodeslot=0x0C36, category='lo', description='TELUGU LETTER SHA' }, + [0x0C37] = { unicodeslot=0x0C37, category='lo', description='TELUGU LETTER SSA' }, + [0x0C38] = { unicodeslot=0x0C38, category='lo', description='TELUGU LETTER SA' }, + [0x0C39] = { unicodeslot=0x0C39, category='lo', description='TELUGU LETTER HA' }, + [0x0C3E] = { unicodeslot=0x0C3E, category='mn', description='TELUGU VOWEL SIGN AA' }, + [0x0C3F] = { unicodeslot=0x0C3F, category='mn', description='TELUGU VOWEL SIGN I' }, + [0x0C40] = { unicodeslot=0x0C40, category='mn', description='TELUGU VOWEL SIGN II' }, + [0x0C41] = { unicodeslot=0x0C41, category='mc', description='TELUGU VOWEL SIGN U' }, + [0x0C42] = { unicodeslot=0x0C42, category='mc', description='TELUGU VOWEL SIGN UU' }, + [0x0C43] = { unicodeslot=0x0C43, category='mc', description='TELUGU VOWEL SIGN VOCALIC R' }, + [0x0C44] = { unicodeslot=0x0C44, category='mc', description='TELUGU VOWEL SIGN VOCALIC RR' }, + [0x0C46] = { unicodeslot=0x0C46, category='mn', description='TELUGU VOWEL SIGN E' }, + [0x0C47] = { unicodeslot=0x0C47, category='mn', description='TELUGU VOWEL SIGN EE' }, + [0x0C48] = { unicodeslot=0x0C48, category='mn', description='TELUGU VOWEL SIGN AI', specials={'char',0x0C46,0x0C56} }, + [0x0C4A] = { unicodeslot=0x0C4A, category='mn', description='TELUGU VOWEL SIGN O' }, + [0x0C4B] = { unicodeslot=0x0C4B, category='mn', description='TELUGU VOWEL SIGN OO' }, + [0x0C4C] = { unicodeslot=0x0C4C, category='mn', description='TELUGU VOWEL SIGN AU' }, + [0x0C4D] = { unicodeslot=0x0C4D, category='mn', description='TELUGU SIGN VIRAMA' }, + [0x0C55] = { unicodeslot=0x0C55, category='mn', description='TELUGU LENGTH MARK' }, + [0x0C56] = { unicodeslot=0x0C56, category='mn', description='TELUGU AI LENGTH MARK' }, + [0x0C60] = { unicodeslot=0x0C60, category='lo', description='TELUGU LETTER VOCALIC RR' }, + [0x0C61] = { unicodeslot=0x0C61, category='lo', description='TELUGU LETTER VOCALIC LL' }, + [0x0C66] = { unicodeslot=0x0C66, category='nd', description='TELUGU DIGIT ZERO' }, + [0x0C67] = { unicodeslot=0x0C67, category='nd', description='TELUGU DIGIT ONE' }, + [0x0C68] = { unicodeslot=0x0C68, category='nd', description='TELUGU DIGIT TWO' }, + [0x0C69] = { unicodeslot=0x0C69, category='nd', description='TELUGU DIGIT THREE' }, + [0x0C6A] = { unicodeslot=0x0C6A, category='nd', description='TELUGU DIGIT FOUR' }, + [0x0C6B] = { unicodeslot=0x0C6B, category='nd', description='TELUGU DIGIT FIVE' }, + [0x0C6C] = { unicodeslot=0x0C6C, category='nd', description='TELUGU DIGIT SIX' }, + [0x0C6D] = { unicodeslot=0x0C6D, category='nd', description='TELUGU DIGIT SEVEN' }, + [0x0C6E] = { unicodeslot=0x0C6E, category='nd', description='TELUGU DIGIT EIGHT' }, + [0x0C6F] = { unicodeslot=0x0C6F, category='nd', description='TELUGU DIGIT NINE' }, + [0x0C82] = { unicodeslot=0x0C82, category='mc', description='KANNADA SIGN ANUSVARA' }, + [0x0C83] = { unicodeslot=0x0C83, category='mc', description='KANNADA SIGN VISARGA' }, + [0x0C85] = { unicodeslot=0x0C85, category='lo', description='KANNADA LETTER A' }, + [0x0C86] = { unicodeslot=0x0C86, category='lo', description='KANNADA LETTER AA' }, + [0x0C87] = { unicodeslot=0x0C87, category='lo', description='KANNADA LETTER I' }, + [0x0C88] = { unicodeslot=0x0C88, category='lo', description='KANNADA LETTER II' }, + [0x0C89] = { unicodeslot=0x0C89, category='lo', description='KANNADA LETTER U' }, + [0x0C8A] = { unicodeslot=0x0C8A, category='lo', description='KANNADA LETTER UU' }, + [0x0C8B] = { unicodeslot=0x0C8B, category='lo', description='KANNADA LETTER VOCALIC R' }, + [0x0C8C] = { unicodeslot=0x0C8C, category='lo', description='KANNADA LETTER VOCALIC L' }, + [0x0C8E] = { unicodeslot=0x0C8E, category='lo', description='KANNADA LETTER E' }, + [0x0C8F] = { unicodeslot=0x0C8F, category='lo', description='KANNADA LETTER EE' }, + [0x0C90] = { unicodeslot=0x0C90, category='lo', description='KANNADA LETTER AI' }, + [0x0C92] = { unicodeslot=0x0C92, category='lo', description='KANNADA LETTER O' }, + [0x0C93] = { unicodeslot=0x0C93, category='lo', description='KANNADA LETTER OO' }, + [0x0C94] = { unicodeslot=0x0C94, category='lo', description='KANNADA LETTER AU' }, + [0x0C95] = { unicodeslot=0x0C95, category='lo', description='KANNADA LETTER KA' }, + [0x0C96] = { unicodeslot=0x0C96, category='lo', description='KANNADA LETTER KHA' }, + [0x0C97] = { unicodeslot=0x0C97, category='lo', description='KANNADA LETTER GA' }, + [0x0C98] = { unicodeslot=0x0C98, category='lo', description='KANNADA LETTER GHA' }, + [0x0C99] = { unicodeslot=0x0C99, category='lo', description='KANNADA LETTER NGA' }, + [0x0C9A] = { unicodeslot=0x0C9A, category='lo', description='KANNADA LETTER CA' }, + [0x0C9B] = { unicodeslot=0x0C9B, category='lo', description='KANNADA LETTER CHA' }, + [0x0C9C] = { unicodeslot=0x0C9C, category='lo', description='KANNADA LETTER JA' }, + [0x0C9D] = { unicodeslot=0x0C9D, category='lo', description='KANNADA LETTER JHA' }, + [0x0C9E] = { unicodeslot=0x0C9E, category='lo', description='KANNADA LETTER NYA' }, + [0x0C9F] = { unicodeslot=0x0C9F, category='lo', description='KANNADA LETTER TTA' }, + [0x0CA0] = { unicodeslot=0x0CA0, category='lo', description='KANNADA LETTER TTHA' }, + [0x0CA1] = { unicodeslot=0x0CA1, category='lo', description='KANNADA LETTER DDA' }, + [0x0CA2] = { unicodeslot=0x0CA2, category='lo', description='KANNADA LETTER DDHA' }, + [0x0CA3] = { unicodeslot=0x0CA3, category='lo', description='KANNADA LETTER NNA' }, + [0x0CA4] = { unicodeslot=0x0CA4, category='lo', description='KANNADA LETTER TA' }, + [0x0CA5] = { unicodeslot=0x0CA5, category='lo', description='KANNADA LETTER THA' }, + [0x0CA6] = { unicodeslot=0x0CA6, category='lo', description='KANNADA LETTER DA' }, + [0x0CA7] = { unicodeslot=0x0CA7, category='lo', description='KANNADA LETTER DHA' }, + [0x0CA8] = { unicodeslot=0x0CA8, category='lo', description='KANNADA LETTER NA' }, + [0x0CAA] = { unicodeslot=0x0CAA, category='lo', description='KANNADA LETTER PA' }, + [0x0CAB] = { unicodeslot=0x0CAB, category='lo', description='KANNADA LETTER PHA' }, + [0x0CAC] = { unicodeslot=0x0CAC, category='lo', description='KANNADA LETTER BA' }, + [0x0CAD] = { unicodeslot=0x0CAD, category='lo', description='KANNADA LETTER BHA' }, + [0x0CAE] = { unicodeslot=0x0CAE, category='lo', description='KANNADA LETTER MA' }, + [0x0CAF] = { unicodeslot=0x0CAF, category='lo', description='KANNADA LETTER YA' }, + [0x0CB0] = { unicodeslot=0x0CB0, category='lo', description='KANNADA LETTER RA' }, + [0x0CB1] = { unicodeslot=0x0CB1, category='lo', description='KANNADA LETTER RRA' }, + [0x0CB2] = { unicodeslot=0x0CB2, category='lo', description='KANNADA LETTER LA' }, + [0x0CB3] = { unicodeslot=0x0CB3, category='lo', description='KANNADA LETTER LLA' }, + [0x0CB5] = { unicodeslot=0x0CB5, category='lo', description='KANNADA LETTER VA' }, + [0x0CB6] = { unicodeslot=0x0CB6, category='lo', description='KANNADA LETTER SHA' }, + [0x0CB7] = { unicodeslot=0x0CB7, category='lo', description='KANNADA LETTER SSA' }, + [0x0CB8] = { unicodeslot=0x0CB8, category='lo', description='KANNADA LETTER SA' }, + [0x0CB9] = { unicodeslot=0x0CB9, category='lo', description='KANNADA LETTER HA' }, + [0x0CBC] = { unicodeslot=0x0CBC, category='mn', description='KANNADA SIGN NUKTA' }, + [0x0CBD] = { unicodeslot=0x0CBD, category='lo', description='KANNADA SIGN AVAGRAHA' }, + [0x0CBE] = { unicodeslot=0x0CBE, category='mc', description='KANNADA VOWEL SIGN AA' }, + [0x0CBF] = { unicodeslot=0x0CBF, category='mn', description='KANNADA VOWEL SIGN I' }, + [0x0CC0] = { unicodeslot=0x0CC0, category='mc', description='KANNADA VOWEL SIGN II', specials={'char',0x0CBF,0x0CD5} }, + [0x0CC1] = { unicodeslot=0x0CC1, category='mc', description='KANNADA VOWEL SIGN U' }, + [0x0CC2] = { unicodeslot=0x0CC2, category='mc', description='KANNADA VOWEL SIGN UU' }, + [0x0CC3] = { unicodeslot=0x0CC3, category='mc', description='KANNADA VOWEL SIGN VOCALIC R' }, + [0x0CC4] = { unicodeslot=0x0CC4, category='mc', description='KANNADA VOWEL SIGN VOCALIC RR' }, + [0x0CC6] = { unicodeslot=0x0CC6, category='mn', description='KANNADA VOWEL SIGN E' }, + [0x0CC7] = { unicodeslot=0x0CC7, category='mc', description='KANNADA VOWEL SIGN EE', specials={'char',0x0CC6,0x0CD5} }, + [0x0CC8] = { unicodeslot=0x0CC8, category='mc', description='KANNADA VOWEL SIGN AI', specials={'char',0x0CC6,0x0CD6} }, + [0x0CCA] = { unicodeslot=0x0CCA, category='mc', description='KANNADA VOWEL SIGN O', specials={'char',0x0CC6,0x0CC2} }, + [0x0CCB] = { unicodeslot=0x0CCB, category='mc', description='KANNADA VOWEL SIGN OO', specials={'char',0x0CCA,0x0CD5} }, + [0x0CCC] = { unicodeslot=0x0CCC, category='mn', description='KANNADA VOWEL SIGN AU' }, + [0x0CCD] = { unicodeslot=0x0CCD, category='mn', description='KANNADA SIGN VIRAMA' }, + [0x0CD5] = { unicodeslot=0x0CD5, category='mc', description='KANNADA LENGTH MARK' }, + [0x0CD6] = { unicodeslot=0x0CD6, category='mc', description='KANNADA AI LENGTH MARK' }, + [0x0CDE] = { unicodeslot=0x0CDE, category='lo', description='KANNADA LETTER FA' }, + [0x0CE0] = { unicodeslot=0x0CE0, category='lo', description='KANNADA LETTER VOCALIC RR' }, + [0x0CE1] = { unicodeslot=0x0CE1, category='lo', description='KANNADA LETTER VOCALIC LL' }, + [0x0CE2] = { unicodeslot=0x0CE2, category='mn', description='KANNADA VOWEL SIGN VOCALIC L' }, + [0x0CE3] = { unicodeslot=0x0CE3, category='mn', description='KANNADA VOWEL SIGN VOCALIC LL' }, + [0x0CE6] = { unicodeslot=0x0CE6, category='nd', description='KANNADA DIGIT ZERO' }, + [0x0CE7] = { unicodeslot=0x0CE7, category='nd', description='KANNADA DIGIT ONE' }, + [0x0CE8] = { unicodeslot=0x0CE8, category='nd', description='KANNADA DIGIT TWO' }, + [0x0CE9] = { unicodeslot=0x0CE9, category='nd', description='KANNADA DIGIT THREE' }, + [0x0CEA] = { unicodeslot=0x0CEA, category='nd', description='KANNADA DIGIT FOUR' }, + [0x0CEB] = { unicodeslot=0x0CEB, category='nd', description='KANNADA DIGIT FIVE' }, + [0x0CEC] = { unicodeslot=0x0CEC, category='nd', description='KANNADA DIGIT SIX' }, + [0x0CED] = { unicodeslot=0x0CED, category='nd', description='KANNADA DIGIT SEVEN' }, + [0x0CEE] = { unicodeslot=0x0CEE, category='nd', description='KANNADA DIGIT EIGHT' }, + [0x0CEF] = { unicodeslot=0x0CEF, category='nd', description='KANNADA DIGIT NINE' }, + [0x0CF1] = { unicodeslot=0x0CF1, category='so', description='KANNADA SIGN JIHVAMULIYA' }, + [0x0CF2] = { unicodeslot=0x0CF2, category='so', description='KANNADA SIGN UPADHMANIYA' }, + [0x0D02] = { unicodeslot=0x0D02, category='mc', description='MALAYALAM SIGN ANUSVARA' }, + [0x0D03] = { unicodeslot=0x0D03, category='mc', description='MALAYALAM SIGN VISARGA' }, + [0x0D05] = { unicodeslot=0x0D05, category='lo', description='MALAYALAM LETTER A' }, + [0x0D06] = { unicodeslot=0x0D06, category='lo', description='MALAYALAM LETTER AA' }, + [0x0D07] = { unicodeslot=0x0D07, category='lo', description='MALAYALAM LETTER I' }, + [0x0D08] = { unicodeslot=0x0D08, category='lo', description='MALAYALAM LETTER II' }, + [0x0D09] = { unicodeslot=0x0D09, category='lo', description='MALAYALAM LETTER U' }, + [0x0D0A] = { unicodeslot=0x0D0A, category='lo', description='MALAYALAM LETTER UU' }, + [0x0D0B] = { unicodeslot=0x0D0B, category='lo', description='MALAYALAM LETTER VOCALIC R' }, + [0x0D0C] = { unicodeslot=0x0D0C, category='lo', description='MALAYALAM LETTER VOCALIC L' }, + [0x0D0E] = { unicodeslot=0x0D0E, category='lo', description='MALAYALAM LETTER E' }, + [0x0D0F] = { unicodeslot=0x0D0F, category='lo', description='MALAYALAM LETTER EE' }, + [0x0D10] = { unicodeslot=0x0D10, category='lo', description='MALAYALAM LETTER AI' }, + [0x0D12] = { unicodeslot=0x0D12, category='lo', description='MALAYALAM LETTER O' }, + [0x0D13] = { unicodeslot=0x0D13, category='lo', description='MALAYALAM LETTER OO' }, + [0x0D14] = { unicodeslot=0x0D14, category='lo', description='MALAYALAM LETTER AU' }, + [0x0D15] = { unicodeslot=0x0D15, category='lo', description='MALAYALAM LETTER KA' }, + [0x0D16] = { unicodeslot=0x0D16, category='lo', description='MALAYALAM LETTER KHA' }, + [0x0D17] = { unicodeslot=0x0D17, category='lo', description='MALAYALAM LETTER GA' }, + [0x0D18] = { unicodeslot=0x0D18, category='lo', description='MALAYALAM LETTER GHA' }, + [0x0D19] = { unicodeslot=0x0D19, category='lo', description='MALAYALAM LETTER NGA' }, + [0x0D1A] = { unicodeslot=0x0D1A, category='lo', description='MALAYALAM LETTER CA' }, + [0x0D1B] = { unicodeslot=0x0D1B, category='lo', description='MALAYALAM LETTER CHA' }, + [0x0D1C] = { unicodeslot=0x0D1C, category='lo', description='MALAYALAM LETTER JA' }, + [0x0D1D] = { unicodeslot=0x0D1D, category='lo', description='MALAYALAM LETTER JHA' }, + [0x0D1E] = { unicodeslot=0x0D1E, category='lo', description='MALAYALAM LETTER NYA' }, + [0x0D1F] = { unicodeslot=0x0D1F, category='lo', description='MALAYALAM LETTER TTA' }, + [0x0D20] = { unicodeslot=0x0D20, category='lo', description='MALAYALAM LETTER TTHA' }, + [0x0D21] = { unicodeslot=0x0D21, category='lo', description='MALAYALAM LETTER DDA' }, + [0x0D22] = { unicodeslot=0x0D22, category='lo', description='MALAYALAM LETTER DDHA' }, + [0x0D23] = { unicodeslot=0x0D23, category='lo', description='MALAYALAM LETTER NNA' }, + [0x0D24] = { unicodeslot=0x0D24, category='lo', description='MALAYALAM LETTER TA' }, + [0x0D25] = { unicodeslot=0x0D25, category='lo', description='MALAYALAM LETTER THA' }, + [0x0D26] = { unicodeslot=0x0D26, category='lo', description='MALAYALAM LETTER DA' }, + [0x0D27] = { unicodeslot=0x0D27, category='lo', description='MALAYALAM LETTER DHA' }, + [0x0D28] = { unicodeslot=0x0D28, category='lo', description='MALAYALAM LETTER NA' }, + [0x0D2A] = { unicodeslot=0x0D2A, category='lo', description='MALAYALAM LETTER PA' }, + [0x0D2B] = { unicodeslot=0x0D2B, category='lo', description='MALAYALAM LETTER PHA' }, + [0x0D2C] = { unicodeslot=0x0D2C, category='lo', description='MALAYALAM LETTER BA' }, + [0x0D2D] = { unicodeslot=0x0D2D, category='lo', description='MALAYALAM LETTER BHA' }, + [0x0D2E] = { unicodeslot=0x0D2E, category='lo', description='MALAYALAM LETTER MA' }, + [0x0D2F] = { unicodeslot=0x0D2F, category='lo', description='MALAYALAM LETTER YA' }, + [0x0D30] = { unicodeslot=0x0D30, category='lo', description='MALAYALAM LETTER RA' }, + [0x0D31] = { unicodeslot=0x0D31, category='lo', description='MALAYALAM LETTER RRA' }, + [0x0D32] = { unicodeslot=0x0D32, category='lo', description='MALAYALAM LETTER LA' }, + [0x0D33] = { unicodeslot=0x0D33, category='lo', description='MALAYALAM LETTER LLA' }, + [0x0D34] = { unicodeslot=0x0D34, category='lo', description='MALAYALAM LETTER LLLA' }, + [0x0D35] = { unicodeslot=0x0D35, category='lo', description='MALAYALAM LETTER VA' }, + [0x0D36] = { unicodeslot=0x0D36, category='lo', description='MALAYALAM LETTER SHA' }, + [0x0D37] = { unicodeslot=0x0D37, category='lo', description='MALAYALAM LETTER SSA' }, + [0x0D38] = { unicodeslot=0x0D38, category='lo', description='MALAYALAM LETTER SA' }, + [0x0D39] = { unicodeslot=0x0D39, category='lo', description='MALAYALAM LETTER HA' }, + [0x0D3E] = { unicodeslot=0x0D3E, category='mc', description='MALAYALAM VOWEL SIGN AA' }, + [0x0D3F] = { unicodeslot=0x0D3F, category='mc', description='MALAYALAM VOWEL SIGN I' }, + [0x0D40] = { unicodeslot=0x0D40, category='mc', description='MALAYALAM VOWEL SIGN II' }, + [0x0D41] = { unicodeslot=0x0D41, category='mn', description='MALAYALAM VOWEL SIGN U' }, + [0x0D42] = { unicodeslot=0x0D42, category='mn', description='MALAYALAM VOWEL SIGN UU' }, + [0x0D43] = { unicodeslot=0x0D43, category='mn', description='MALAYALAM VOWEL SIGN VOCALIC R' }, + [0x0D46] = { unicodeslot=0x0D46, category='mc', description='MALAYALAM VOWEL SIGN E' }, + [0x0D47] = { unicodeslot=0x0D47, category='mc', description='MALAYALAM VOWEL SIGN EE' }, + [0x0D48] = { unicodeslot=0x0D48, category='mc', description='MALAYALAM VOWEL SIGN AI' }, + [0x0D4A] = { unicodeslot=0x0D4A, category='mc', description='MALAYALAM VOWEL SIGN O', specials={'char',0x0D46,0x0D3E} }, + [0x0D4B] = { unicodeslot=0x0D4B, category='mc', description='MALAYALAM VOWEL SIGN OO', specials={'char',0x0D47,0x0D3E} }, + [0x0D4C] = { unicodeslot=0x0D4C, category='mc', description='MALAYALAM VOWEL SIGN AU', specials={'char',0x0D46,0x0D57} }, + [0x0D4D] = { unicodeslot=0x0D4D, category='mn', description='MALAYALAM SIGN VIRAMA' }, + [0x0D57] = { unicodeslot=0x0D57, category='mc', description='MALAYALAM AU LENGTH MARK' }, + [0x0D60] = { unicodeslot=0x0D60, category='lo', description='MALAYALAM LETTER VOCALIC RR' }, + [0x0D61] = { unicodeslot=0x0D61, category='lo', description='MALAYALAM LETTER VOCALIC LL' }, + [0x0D66] = { unicodeslot=0x0D66, category='nd', description='MALAYALAM DIGIT ZERO' }, + [0x0D67] = { unicodeslot=0x0D67, category='nd', description='MALAYALAM DIGIT ONE' }, + [0x0D68] = { unicodeslot=0x0D68, category='nd', description='MALAYALAM DIGIT TWO' }, + [0x0D69] = { unicodeslot=0x0D69, category='nd', description='MALAYALAM DIGIT THREE' }, + [0x0D6A] = { unicodeslot=0x0D6A, category='nd', description='MALAYALAM DIGIT FOUR' }, + [0x0D6B] = { unicodeslot=0x0D6B, category='nd', description='MALAYALAM DIGIT FIVE' }, + [0x0D6C] = { unicodeslot=0x0D6C, category='nd', description='MALAYALAM DIGIT SIX' }, + [0x0D6D] = { unicodeslot=0x0D6D, category='nd', description='MALAYALAM DIGIT SEVEN' }, + [0x0D6E] = { unicodeslot=0x0D6E, category='nd', description='MALAYALAM DIGIT EIGHT' }, + [0x0D6F] = { unicodeslot=0x0D6F, category='nd', description='MALAYALAM DIGIT NINE' }, + [0x0D82] = { unicodeslot=0x0D82, category='mc', description='SINHALA SIGN ANUSVARAYA' }, + [0x0D83] = { unicodeslot=0x0D83, category='mc', description='SINHALA SIGN VISARGAYA' }, + [0x0D85] = { unicodeslot=0x0D85, category='lo', description='SINHALA LETTER AYANNA' }, + [0x0D86] = { unicodeslot=0x0D86, category='lo', description='SINHALA LETTER AAYANNA' }, + [0x0D87] = { unicodeslot=0x0D87, category='lo', description='SINHALA LETTER AEYANNA' }, + [0x0D88] = { unicodeslot=0x0D88, category='lo', description='SINHALA LETTER AEEYANNA' }, + [0x0D89] = { unicodeslot=0x0D89, category='lo', description='SINHALA LETTER IYANNA' }, + [0x0D8A] = { unicodeslot=0x0D8A, category='lo', description='SINHALA LETTER IIYANNA' }, + [0x0D8B] = { unicodeslot=0x0D8B, category='lo', description='SINHALA LETTER UYANNA' }, + [0x0D8C] = { unicodeslot=0x0D8C, category='lo', description='SINHALA LETTER UUYANNA' }, + [0x0D8D] = { unicodeslot=0x0D8D, category='lo', description='SINHALA LETTER IRUYANNA' }, + [0x0D8E] = { unicodeslot=0x0D8E, category='lo', description='SINHALA LETTER IRUUYANNA' }, + [0x0D8F] = { unicodeslot=0x0D8F, category='lo', description='SINHALA LETTER ILUYANNA' }, + [0x0D90] = { unicodeslot=0x0D90, category='lo', description='SINHALA LETTER ILUUYANNA' }, + [0x0D91] = { unicodeslot=0x0D91, category='lo', description='SINHALA LETTER EYANNA' }, + [0x0D92] = { unicodeslot=0x0D92, category='lo', description='SINHALA LETTER EEYANNA' }, + [0x0D93] = { unicodeslot=0x0D93, category='lo', description='SINHALA LETTER AIYANNA' }, + [0x0D94] = { unicodeslot=0x0D94, category='lo', description='SINHALA LETTER OYANNA' }, + [0x0D95] = { unicodeslot=0x0D95, category='lo', description='SINHALA LETTER OOYANNA' }, + [0x0D96] = { unicodeslot=0x0D96, category='lo', description='SINHALA LETTER AUYANNA' }, + [0x0D9A] = { unicodeslot=0x0D9A, category='lo', description='SINHALA LETTER ALPAPRAANA KAYANNA' }, + [0x0D9B] = { unicodeslot=0x0D9B, category='lo', description='SINHALA LETTER MAHAAPRAANA KAYANNA' }, + [0x0D9C] = { unicodeslot=0x0D9C, category='lo', description='SINHALA LETTER ALPAPRAANA GAYANNA' }, + [0x0D9D] = { unicodeslot=0x0D9D, category='lo', description='SINHALA LETTER MAHAAPRAANA GAYANNA' }, + [0x0D9E] = { unicodeslot=0x0D9E, category='lo', description='SINHALA LETTER KANTAJA NAASIKYAYA' }, + [0x0D9F] = { unicodeslot=0x0D9F, category='lo', description='SINHALA LETTER SANYAKA GAYANNA' }, + [0x0DA0] = { unicodeslot=0x0DA0, category='lo', description='SINHALA LETTER ALPAPRAANA CAYANNA' }, + [0x0DA1] = { unicodeslot=0x0DA1, category='lo', description='SINHALA LETTER MAHAAPRAANA CAYANNA' }, + [0x0DA2] = { unicodeslot=0x0DA2, category='lo', description='SINHALA LETTER ALPAPRAANA JAYANNA' }, + [0x0DA3] = { unicodeslot=0x0DA3, category='lo', description='SINHALA LETTER MAHAAPRAANA JAYANNA' }, + [0x0DA4] = { unicodeslot=0x0DA4, category='lo', description='SINHALA LETTER TAALUJA NAASIKYAYA' }, + [0x0DA5] = { unicodeslot=0x0DA5, category='lo', description='SINHALA LETTER TAALUJA SANYOOGA NAAKSIKYAYA' }, + [0x0DA6] = { unicodeslot=0x0DA6, category='lo', description='SINHALA LETTER SANYAKA JAYANNA' }, + [0x0DA7] = { unicodeslot=0x0DA7, category='lo', description='SINHALA LETTER ALPAPRAANA TTAYANNA' }, + [0x0DA8] = { unicodeslot=0x0DA8, category='lo', description='SINHALA LETTER MAHAAPRAANA TTAYANNA' }, + [0x0DA9] = { unicodeslot=0x0DA9, category='lo', description='SINHALA LETTER ALPAPRAANA DDAYANNA' }, + [0x0DAA] = { unicodeslot=0x0DAA, category='lo', description='SINHALA LETTER MAHAAPRAANA DDAYANNA' }, + [0x0DAB] = { unicodeslot=0x0DAB, category='lo', description='SINHALA LETTER MUURDHAJA NAYANNA' }, + [0x0DAC] = { unicodeslot=0x0DAC, category='lo', description='SINHALA LETTER SANYAKA DDAYANNA' }, + [0x0DAD] = { unicodeslot=0x0DAD, category='lo', description='SINHALA LETTER ALPAPRAANA TAYANNA' }, + [0x0DAE] = { unicodeslot=0x0DAE, category='lo', description='SINHALA LETTER MAHAAPRAANA TAYANNA' }, + [0x0DAF] = { unicodeslot=0x0DAF, category='lo', description='SINHALA LETTER ALPAPRAANA DAYANNA' }, + [0x0DB0] = { unicodeslot=0x0DB0, category='lo', description='SINHALA LETTER MAHAAPRAANA DAYANNA' }, + [0x0DB1] = { unicodeslot=0x0DB1, category='lo', description='SINHALA LETTER DANTAJA NAYANNA' }, + [0x0DB3] = { unicodeslot=0x0DB3, category='lo', description='SINHALA LETTER SANYAKA DAYANNA' }, + [0x0DB4] = { unicodeslot=0x0DB4, category='lo', description='SINHALA LETTER ALPAPRAANA PAYANNA' }, + [0x0DB5] = { unicodeslot=0x0DB5, category='lo', description='SINHALA LETTER MAHAAPRAANA PAYANNA' }, + [0x0DB6] = { unicodeslot=0x0DB6, category='lo', description='SINHALA LETTER ALPAPRAANA BAYANNA' }, + [0x0DB7] = { unicodeslot=0x0DB7, category='lo', description='SINHALA LETTER MAHAAPRAANA BAYANNA' }, + [0x0DB8] = { unicodeslot=0x0DB8, category='lo', description='SINHALA LETTER MAYANNA' }, + [0x0DB9] = { unicodeslot=0x0DB9, category='lo', description='SINHALA LETTER AMBA BAYANNA' }, + [0x0DBA] = { unicodeslot=0x0DBA, category='lo', description='SINHALA LETTER YAYANNA' }, + [0x0DBB] = { unicodeslot=0x0DBB, category='lo', description='SINHALA LETTER RAYANNA' }, + [0x0DBD] = { unicodeslot=0x0DBD, category='lo', description='SINHALA LETTER DANTAJA LAYANNA' }, + [0x0DC0] = { unicodeslot=0x0DC0, category='lo', description='SINHALA LETTER VAYANNA' }, + [0x0DC1] = { unicodeslot=0x0DC1, category='lo', description='SINHALA LETTER TAALUJA SAYANNA' }, + [0x0DC2] = { unicodeslot=0x0DC2, category='lo', description='SINHALA LETTER MUURDHAJA SAYANNA' }, + [0x0DC3] = { unicodeslot=0x0DC3, category='lo', description='SINHALA LETTER DANTAJA SAYANNA' }, + [0x0DC4] = { unicodeslot=0x0DC4, category='lo', description='SINHALA LETTER HAYANNA' }, + [0x0DC5] = { unicodeslot=0x0DC5, category='lo', description='SINHALA LETTER MUURDHAJA LAYANNA' }, + [0x0DC6] = { unicodeslot=0x0DC6, category='lo', description='SINHALA LETTER FAYANNA' }, + [0x0DCA] = { unicodeslot=0x0DCA, category='mn', description='SINHALA SIGN AL-LAKUNA' }, + [0x0DCF] = { unicodeslot=0x0DCF, category='mc', description='SINHALA VOWEL SIGN AELA-PILLA' }, + [0x0DD0] = { unicodeslot=0x0DD0, category='mc', description='SINHALA VOWEL SIGN KETTI AEDA-PILLA' }, + [0x0DD1] = { unicodeslot=0x0DD1, category='mc', description='SINHALA VOWEL SIGN DIGA AEDA-PILLA' }, + [0x0DD2] = { unicodeslot=0x0DD2, category='mn', description='SINHALA VOWEL SIGN KETTI IS-PILLA' }, + [0x0DD3] = { unicodeslot=0x0DD3, category='mn', description='SINHALA VOWEL SIGN DIGA IS-PILLA' }, + [0x0DD4] = { unicodeslot=0x0DD4, category='mn', description='SINHALA VOWEL SIGN KETTI PAA-PILLA' }, + [0x0DD6] = { unicodeslot=0x0DD6, category='mn', description='SINHALA VOWEL SIGN DIGA PAA-PILLA' }, + [0x0DD8] = { unicodeslot=0x0DD8, category='mc', description='SINHALA VOWEL SIGN GAETTA-PILLA' }, + [0x0DD9] = { unicodeslot=0x0DD9, category='mc', description='SINHALA VOWEL SIGN KOMBUVA' }, + [0x0DDA] = { unicodeslot=0x0DDA, category='mc', description='SINHALA VOWEL SIGN DIGA KOMBUVA', specials={'char',0x0DD9,0x0DCA} }, + [0x0DDB] = { unicodeslot=0x0DDB, category='mc', description='SINHALA VOWEL SIGN KOMBU DEKA' }, + [0x0DDC] = { unicodeslot=0x0DDC, category='mc', description='SINHALA VOWEL SIGN KOMBUVA HAA AELA-PILLA', specials={'char',0x0DD9,0x0DCF} }, + [0x0DDD] = { unicodeslot=0x0DDD, category='mc', description='SINHALA VOWEL SIGN KOMBUVA HAA DIGA AELA-PILLA', specials={'char',0x0DDC,0x0DCA} }, + [0x0DDE] = { unicodeslot=0x0DDE, category='mc', description='SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA', specials={'char',0x0DD9,0x0DDF} }, + [0x0DDF] = { unicodeslot=0x0DDF, category='mc', description='SINHALA VOWEL SIGN GAYANUKITTA' }, + [0x0DF2] = { unicodeslot=0x0DF2, category='mc', description='SINHALA VOWEL SIGN DIGA GAETTA-PILLA' }, + [0x0DF3] = { unicodeslot=0x0DF3, category='mc', description='SINHALA VOWEL SIGN DIGA GAYANUKITTA' }, + [0x0DF4] = { unicodeslot=0x0DF4, category='po', description='SINHALA PUNCTUATION KUNDDALIYA' }, + [0x0E01] = { unicodeslot=0x0E01, category='lo', description='THAI CHARACTER KO KAI' }, + [0x0E02] = { unicodeslot=0x0E02, category='lo', description='THAI CHARACTER KHO KHAI' }, + [0x0E03] = { unicodeslot=0x0E03, category='lo', description='THAI CHARACTER KHO KHUAT' }, + [0x0E04] = { unicodeslot=0x0E04, category='lo', description='THAI CHARACTER KHO KHWAI' }, + [0x0E05] = { unicodeslot=0x0E05, category='lo', description='THAI CHARACTER KHO KHON' }, + [0x0E06] = { unicodeslot=0x0E06, category='lo', description='THAI CHARACTER KHO RAKHANG' }, + [0x0E07] = { unicodeslot=0x0E07, category='lo', description='THAI CHARACTER NGO NGU' }, + [0x0E08] = { unicodeslot=0x0E08, category='lo', description='THAI CHARACTER CHO CHAN' }, + [0x0E09] = { unicodeslot=0x0E09, category='lo', description='THAI CHARACTER CHO CHING' }, + [0x0E0A] = { unicodeslot=0x0E0A, category='lo', description='THAI CHARACTER CHO CHANG' }, + [0x0E0B] = { unicodeslot=0x0E0B, category='lo', description='THAI CHARACTER SO SO' }, + [0x0E0C] = { unicodeslot=0x0E0C, category='lo', description='THAI CHARACTER CHO CHOE' }, + [0x0E0D] = { unicodeslot=0x0E0D, category='lo', description='THAI CHARACTER YO YING' }, + [0x0E0E] = { unicodeslot=0x0E0E, category='lo', description='THAI CHARACTER DO CHADA' }, + [0x0E0F] = { unicodeslot=0x0E0F, category='lo', description='THAI CHARACTER TO PATAK' }, + [0x0E10] = { unicodeslot=0x0E10, category='lo', description='THAI CHARACTER THO THAN' }, + [0x0E11] = { unicodeslot=0x0E11, category='lo', description='THAI CHARACTER THO NANGMONTHO' }, + [0x0E12] = { unicodeslot=0x0E12, category='lo', description='THAI CHARACTER THO PHUTHAO' }, + [0x0E13] = { unicodeslot=0x0E13, category='lo', description='THAI CHARACTER NO NEN' }, + [0x0E14] = { unicodeslot=0x0E14, category='lo', description='THAI CHARACTER DO DEK' }, + [0x0E15] = { unicodeslot=0x0E15, category='lo', description='THAI CHARACTER TO TAO' }, + [0x0E16] = { unicodeslot=0x0E16, category='lo', description='THAI CHARACTER THO THUNG' }, + [0x0E17] = { unicodeslot=0x0E17, category='lo', description='THAI CHARACTER THO THAHAN' }, + [0x0E18] = { unicodeslot=0x0E18, category='lo', description='THAI CHARACTER THO THONG' }, + [0x0E19] = { unicodeslot=0x0E19, category='lo', description='THAI CHARACTER NO NU' }, + [0x0E1A] = { unicodeslot=0x0E1A, category='lo', description='THAI CHARACTER BO BAIMAI' }, + [0x0E1B] = { unicodeslot=0x0E1B, category='lo', description='THAI CHARACTER PO PLA' }, + [0x0E1C] = { unicodeslot=0x0E1C, category='lo', description='THAI CHARACTER PHO PHUNG' }, + [0x0E1D] = { unicodeslot=0x0E1D, category='lo', description='THAI CHARACTER FO FA' }, + [0x0E1E] = { unicodeslot=0x0E1E, category='lo', description='THAI CHARACTER PHO PHAN' }, + [0x0E1F] = { unicodeslot=0x0E1F, category='lo', description='THAI CHARACTER FO FAN' }, + [0x0E20] = { unicodeslot=0x0E20, category='lo', description='THAI CHARACTER PHO SAMPHAO' }, + [0x0E21] = { unicodeslot=0x0E21, category='lo', description='THAI CHARACTER MO MA' }, + [0x0E22] = { unicodeslot=0x0E22, category='lo', description='THAI CHARACTER YO YAK' }, + [0x0E23] = { unicodeslot=0x0E23, category='lo', description='THAI CHARACTER RO RUA' }, + [0x0E24] = { unicodeslot=0x0E24, category='lo', description='THAI CHARACTER RU' }, + [0x0E25] = { unicodeslot=0x0E25, category='lo', description='THAI CHARACTER LO LING' }, + [0x0E26] = { unicodeslot=0x0E26, category='lo', description='THAI CHARACTER LU' }, + [0x0E27] = { unicodeslot=0x0E27, category='lo', description='THAI CHARACTER WO WAEN' }, + [0x0E28] = { unicodeslot=0x0E28, category='lo', description='THAI CHARACTER SO SALA' }, + [0x0E29] = { unicodeslot=0x0E29, category='lo', description='THAI CHARACTER SO RUSI' }, + [0x0E2A] = { unicodeslot=0x0E2A, category='lo', description='THAI CHARACTER SO SUA' }, + [0x0E2B] = { unicodeslot=0x0E2B, category='lo', description='THAI CHARACTER HO HIP' }, + [0x0E2C] = { unicodeslot=0x0E2C, category='lo', description='THAI CHARACTER LO CHULA' }, + [0x0E2D] = { unicodeslot=0x0E2D, category='lo', description='THAI CHARACTER O ANG' }, + [0x0E2E] = { unicodeslot=0x0E2E, category='lo', description='THAI CHARACTER HO NOKHUK' }, + [0x0E2F] = { unicodeslot=0x0E2F, category='lo', description='THAI CHARACTER PAIYANNOI' }, + [0x0E30] = { unicodeslot=0x0E30, category='lo', description='THAI CHARACTER SARA A' }, + [0x0E31] = { unicodeslot=0x0E31, category='mn', description='THAI CHARACTER MAI HAN-AKAT' }, + [0x0E32] = { unicodeslot=0x0E32, category='lo', description='THAI CHARACTER SARA AA' }, + [0x0E33] = { unicodeslot=0x0E33, category='lo', description='THAI CHARACTER SARA AM', specials={'compat',0x0E4D,0x0E32} }, + [0x0E34] = { unicodeslot=0x0E34, category='mn', description='THAI CHARACTER SARA I' }, + [0x0E35] = { unicodeslot=0x0E35, category='mn', description='THAI CHARACTER SARA II' }, + [0x0E36] = { unicodeslot=0x0E36, category='mn', description='THAI CHARACTER SARA UE' }, + [0x0E37] = { unicodeslot=0x0E37, category='mn', description='THAI CHARACTER SARA UEE' }, + [0x0E38] = { unicodeslot=0x0E38, category='mn', description='THAI CHARACTER SARA U' }, + [0x0E39] = { unicodeslot=0x0E39, category='mn', description='THAI CHARACTER SARA UU' }, + [0x0E3A] = { unicodeslot=0x0E3A, category='mn', description='THAI CHARACTER PHINTHU' }, + [0x0E3F] = { unicodeslot=0x0E3F, category='sc', description='THAI CURRENCY SYMBOL BAHT' }, + [0x0E40] = { unicodeslot=0x0E40, category='lo', description='THAI CHARACTER SARA E' }, + [0x0E41] = { unicodeslot=0x0E41, category='lo', description='THAI CHARACTER SARA AE' }, + [0x0E42] = { unicodeslot=0x0E42, category='lo', description='THAI CHARACTER SARA O' }, + [0x0E43] = { unicodeslot=0x0E43, category='lo', description='THAI CHARACTER SARA AI MAIMUAN' }, + [0x0E44] = { unicodeslot=0x0E44, category='lo', description='THAI CHARACTER SARA AI MAIMALAI' }, + [0x0E45] = { unicodeslot=0x0E45, category='lo', description='THAI CHARACTER LAKKHANGYAO' }, + [0x0E46] = { unicodeslot=0x0E46, category='lm', description='THAI CHARACTER MAIYAMOK' }, + [0x0E47] = { unicodeslot=0x0E47, category='mn', description='THAI CHARACTER MAITAIKHU' }, + [0x0E48] = { unicodeslot=0x0E48, category='mn', description='THAI CHARACTER MAI EK' }, + [0x0E49] = { unicodeslot=0x0E49, category='mn', description='THAI CHARACTER MAI THO' }, + [0x0E4A] = { unicodeslot=0x0E4A, category='mn', description='THAI CHARACTER MAI TRI' }, + [0x0E4B] = { unicodeslot=0x0E4B, category='mn', description='THAI CHARACTER MAI CHATTAWA' }, + [0x0E4C] = { unicodeslot=0x0E4C, category='mn', description='THAI CHARACTER THANTHAKHAT' }, + [0x0E4D] = { unicodeslot=0x0E4D, category='mn', description='THAI CHARACTER NIKHAHIT' }, + [0x0E4E] = { unicodeslot=0x0E4E, category='mn', description='THAI CHARACTER YAMAKKAN' }, + [0x0E4F] = { unicodeslot=0x0E4F, category='po', description='THAI CHARACTER FONGMAN' }, + [0x0E50] = { unicodeslot=0x0E50, category='nd', description='THAI DIGIT ZERO' }, + [0x0E51] = { unicodeslot=0x0E51, category='nd', description='THAI DIGIT ONE' }, + [0x0E52] = { unicodeslot=0x0E52, category='nd', description='THAI DIGIT TWO' }, + [0x0E53] = { unicodeslot=0x0E53, category='nd', description='THAI DIGIT THREE' }, + [0x0E54] = { unicodeslot=0x0E54, category='nd', description='THAI DIGIT FOUR' }, + [0x0E55] = { unicodeslot=0x0E55, category='nd', description='THAI DIGIT FIVE' }, + [0x0E56] = { unicodeslot=0x0E56, category='nd', description='THAI DIGIT SIX' }, + [0x0E57] = { unicodeslot=0x0E57, category='nd', description='THAI DIGIT SEVEN' }, + [0x0E58] = { unicodeslot=0x0E58, category='nd', description='THAI DIGIT EIGHT' }, + [0x0E59] = { unicodeslot=0x0E59, category='nd', description='THAI DIGIT NINE' }, + [0x0E5A] = { unicodeslot=0x0E5A, category='po', description='THAI CHARACTER ANGKHANKHU' }, + [0x0E5B] = { unicodeslot=0x0E5B, category='po', description='THAI CHARACTER KHOMUT' }, + [0x0E81] = { unicodeslot=0x0E81, category='lo', description='LAO LETTER KO' }, + [0x0E82] = { unicodeslot=0x0E82, category='lo', description='LAO LETTER KHO SUNG' }, + [0x0E84] = { unicodeslot=0x0E84, category='lo', description='LAO LETTER KHO TAM' }, + [0x0E87] = { unicodeslot=0x0E87, category='lo', description='LAO LETTER NGO' }, + [0x0E88] = { unicodeslot=0x0E88, category='lo', description='LAO LETTER CO' }, + [0x0E8A] = { unicodeslot=0x0E8A, category='lo', description='LAO LETTER SO TAM' }, + [0x0E8D] = { unicodeslot=0x0E8D, category='lo', description='LAO LETTER NYO' }, + [0x0E94] = { unicodeslot=0x0E94, category='lo', description='LAO LETTER DO' }, + [0x0E95] = { unicodeslot=0x0E95, category='lo', description='LAO LETTER TO' }, + [0x0E96] = { unicodeslot=0x0E96, category='lo', description='LAO LETTER THO SUNG' }, + [0x0E97] = { unicodeslot=0x0E97, category='lo', description='LAO LETTER THO TAM' }, + [0x0E99] = { unicodeslot=0x0E99, category='lo', description='LAO LETTER NO' }, + [0x0E9A] = { unicodeslot=0x0E9A, category='lo', description='LAO LETTER BO' }, + [0x0E9B] = { unicodeslot=0x0E9B, category='lo', description='LAO LETTER PO' }, + [0x0E9C] = { unicodeslot=0x0E9C, category='lo', description='LAO LETTER PHO SUNG' }, + [0x0E9D] = { unicodeslot=0x0E9D, category='lo', description='LAO LETTER FO TAM' }, + [0x0E9E] = { unicodeslot=0x0E9E, category='lo', description='LAO LETTER PHO TAM' }, + [0x0E9F] = { unicodeslot=0x0E9F, category='lo', description='LAO LETTER FO SUNG' }, + [0x0EA1] = { unicodeslot=0x0EA1, category='lo', description='LAO LETTER MO' }, + [0x0EA2] = { unicodeslot=0x0EA2, category='lo', description='LAO LETTER YO' }, + [0x0EA3] = { unicodeslot=0x0EA3, category='lo', description='LAO LETTER LO LING' }, + [0x0EA5] = { unicodeslot=0x0EA5, category='lo', description='LAO LETTER LO LOOT' }, + [0x0EA7] = { unicodeslot=0x0EA7, category='lo', description='LAO LETTER WO' }, + [0x0EAA] = { unicodeslot=0x0EAA, category='lo', description='LAO LETTER SO SUNG' }, + [0x0EAB] = { unicodeslot=0x0EAB, category='lo', description='LAO LETTER HO SUNG' }, + [0x0EAD] = { unicodeslot=0x0EAD, category='lo', description='LAO LETTER O' }, + [0x0EAE] = { unicodeslot=0x0EAE, category='lo', description='LAO LETTER HO TAM' }, + [0x0EAF] = { unicodeslot=0x0EAF, category='lo', description='LAO ELLIPSIS' }, + [0x0EB0] = { unicodeslot=0x0EB0, category='lo', description='LAO VOWEL SIGN A' }, + [0x0EB1] = { unicodeslot=0x0EB1, category='mn', description='LAO VOWEL SIGN MAI KAN' }, + [0x0EB2] = { unicodeslot=0x0EB2, category='lo', description='LAO VOWEL SIGN AA' }, + [0x0EB3] = { unicodeslot=0x0EB3, category='lo', description='LAO VOWEL SIGN AM', specials={'compat',0x0ECD,0x0EB2} }, + [0x0EB4] = { unicodeslot=0x0EB4, category='mn', description='LAO VOWEL SIGN I' }, + [0x0EB5] = { unicodeslot=0x0EB5, category='mn', description='LAO VOWEL SIGN II' }, + [0x0EB6] = { unicodeslot=0x0EB6, category='mn', description='LAO VOWEL SIGN Y' }, + [0x0EB7] = { unicodeslot=0x0EB7, category='mn', description='LAO VOWEL SIGN YY' }, + [0x0EB8] = { unicodeslot=0x0EB8, category='mn', description='LAO VOWEL SIGN U' }, + [0x0EB9] = { unicodeslot=0x0EB9, category='mn', description='LAO VOWEL SIGN UU' }, + [0x0EBB] = { unicodeslot=0x0EBB, category='mn', description='LAO VOWEL SIGN MAI KON' }, + [0x0EBC] = { unicodeslot=0x0EBC, category='mn', description='LAO SEMIVOWEL SIGN LO' }, + [0x0EBD] = { unicodeslot=0x0EBD, category='lo', description='LAO SEMIVOWEL SIGN NYO' }, + [0x0EC0] = { unicodeslot=0x0EC0, category='lo', description='LAO VOWEL SIGN E' }, + [0x0EC1] = { unicodeslot=0x0EC1, category='lo', description='LAO VOWEL SIGN EI' }, + [0x0EC2] = { unicodeslot=0x0EC2, category='lo', description='LAO VOWEL SIGN O' }, + [0x0EC3] = { unicodeslot=0x0EC3, category='lo', description='LAO VOWEL SIGN AY' }, + [0x0EC4] = { unicodeslot=0x0EC4, category='lo', description='LAO VOWEL SIGN AI' }, + [0x0EC6] = { unicodeslot=0x0EC6, category='lm', description='LAO KO LA' }, + [0x0EC8] = { unicodeslot=0x0EC8, category='mn', description='LAO TONE MAI EK' }, + [0x0EC9] = { unicodeslot=0x0EC9, category='mn', description='LAO TONE MAI THO' }, + [0x0ECA] = { unicodeslot=0x0ECA, category='mn', description='LAO TONE MAI TI' }, + [0x0ECB] = { unicodeslot=0x0ECB, category='mn', description='LAO TONE MAI CATAWA' }, + [0x0ECC] = { unicodeslot=0x0ECC, category='mn', description='LAO CANCELLATION MARK' }, + [0x0ECD] = { unicodeslot=0x0ECD, category='mn', description='LAO NIGGAHITA' }, + [0x0ED0] = { unicodeslot=0x0ED0, category='nd', description='LAO DIGIT ZERO' }, + [0x0ED1] = { unicodeslot=0x0ED1, category='nd', description='LAO DIGIT ONE' }, + [0x0ED2] = { unicodeslot=0x0ED2, category='nd', description='LAO DIGIT TWO' }, + [0x0ED3] = { unicodeslot=0x0ED3, category='nd', description='LAO DIGIT THREE' }, + [0x0ED4] = { unicodeslot=0x0ED4, category='nd', description='LAO DIGIT FOUR' }, + [0x0ED5] = { unicodeslot=0x0ED5, category='nd', description='LAO DIGIT FIVE' }, + [0x0ED6] = { unicodeslot=0x0ED6, category='nd', description='LAO DIGIT SIX' }, + [0x0ED7] = { unicodeslot=0x0ED7, category='nd', description='LAO DIGIT SEVEN' }, + [0x0ED8] = { unicodeslot=0x0ED8, category='nd', description='LAO DIGIT EIGHT' }, + [0x0ED9] = { unicodeslot=0x0ED9, category='nd', description='LAO DIGIT NINE' }, + [0x0EDC] = { unicodeslot=0x0EDC, category='lo', description='LAO HO NO', specials={'compat',0x0EAB,0x0E99} }, + [0x0EDD] = { unicodeslot=0x0EDD, category='lo', description='LAO HO MO', specials={'compat',0x0EAB,0x0EA1} }, + [0x0F00] = { unicodeslot=0x0F00, category='lo', description='TIBETAN SYLLABLE OM' }, + [0x0F01] = { unicodeslot=0x0F01, category='so', description='TIBETAN MARK GTER YIG MGO TRUNCATED A' }, + [0x0F02] = { unicodeslot=0x0F02, category='so', description='TIBETAN MARK GTER YIG MGO -UM RNAM BCAD MA' }, + [0x0F03] = { unicodeslot=0x0F03, category='so', description='TIBETAN MARK GTER YIG MGO -UM GTER TSHEG MA' }, + [0x0F04] = { unicodeslot=0x0F04, category='po', description='TIBETAN MARK INITIAL YIG MGO MDUN MA' }, + [0x0F05] = { unicodeslot=0x0F05, category='po', description='TIBETAN MARK CLOSING YIG MGO SGAB MA' }, + [0x0F06] = { unicodeslot=0x0F06, category='po', description='TIBETAN MARK CARET YIG MGO PHUR SHAD MA' }, + [0x0F07] = { unicodeslot=0x0F07, category='po', description='TIBETAN MARK YIG MGO TSHEG SHAD MA' }, + [0x0F08] = { unicodeslot=0x0F08, category='po', description='TIBETAN MARK SBRUL SHAD' }, + [0x0F09] = { unicodeslot=0x0F09, category='po', description='TIBETAN MARK BSKUR YIG MGO' }, + [0x0F0A] = { unicodeslot=0x0F0A, category='po', description='TIBETAN MARK BKA- SHOG YIG MGO' }, + [0x0F0B] = { unicodeslot=0x0F0B, category='po', description='TIBETAN MARK INTERSYLLABIC TSHEG' }, + [0x0F0C] = { unicodeslot=0x0F0C, category='po', description='TIBETAN MARK DELIMITER TSHEG BSTAR', specials={'nobreak',0x0F0B} }, + [0x0F0D] = { unicodeslot=0x0F0D, category='po', description='TIBETAN MARK SHAD' }, + [0x0F0E] = { unicodeslot=0x0F0E, category='po', description='TIBETAN MARK NYIS SHAD' }, + [0x0F0F] = { unicodeslot=0x0F0F, category='po', description='TIBETAN MARK TSHEG SHAD' }, + [0x0F10] = { unicodeslot=0x0F10, category='po', description='TIBETAN MARK NYIS TSHEG SHAD' }, + [0x0F11] = { unicodeslot=0x0F11, category='po', description='TIBETAN MARK RIN CHEN SPUNGS SHAD' }, + [0x0F12] = { unicodeslot=0x0F12, category='po', description='TIBETAN MARK RGYA GRAM SHAD' }, + [0x0F13] = { unicodeslot=0x0F13, category='so', description='TIBETAN MARK CARET -DZUD RTAGS ME LONG CAN' }, + [0x0F14] = { unicodeslot=0x0F14, category='so', description='TIBETAN MARK GTER TSHEG' }, + [0x0F15] = { unicodeslot=0x0F15, category='so', description='TIBETAN LOGOTYPE SIGN CHAD RTAGS' }, + [0x0F16] = { unicodeslot=0x0F16, category='so', description='TIBETAN LOGOTYPE SIGN LHAG RTAGS' }, + [0x0F17] = { unicodeslot=0x0F17, category='so', description='TIBETAN ASTROLOGICAL SIGN SGRA GCAN -CHAR RTAGS' }, + [0x0F18] = { unicodeslot=0x0F18, category='mn', description='TIBETAN ASTROLOGICAL SIGN -KHYUD PA' }, + [0x0F19] = { unicodeslot=0x0F19, category='mn', description='TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS' }, + [0x0F1A] = { unicodeslot=0x0F1A, category='so', description='TIBETAN SIGN RDEL DKAR GCIG' }, + [0x0F1B] = { unicodeslot=0x0F1B, category='so', description='TIBETAN SIGN RDEL DKAR GNYIS' }, + [0x0F1C] = { unicodeslot=0x0F1C, category='so', description='TIBETAN SIGN RDEL DKAR GSUM' }, + [0x0F1D] = { unicodeslot=0x0F1D, category='so', description='TIBETAN SIGN RDEL NAG GCIG' }, + [0x0F1E] = { unicodeslot=0x0F1E, category='so', description='TIBETAN SIGN RDEL NAG GNYIS' }, + [0x0F1F] = { unicodeslot=0x0F1F, category='so', description='TIBETAN SIGN RDEL DKAR RDEL NAG' }, + [0x0F20] = { unicodeslot=0x0F20, category='nd', description='TIBETAN DIGIT ZERO' }, + [0x0F21] = { unicodeslot=0x0F21, category='nd', description='TIBETAN DIGIT ONE' }, + [0x0F22] = { unicodeslot=0x0F22, category='nd', description='TIBETAN DIGIT TWO' }, + [0x0F23] = { unicodeslot=0x0F23, category='nd', description='TIBETAN DIGIT THREE' }, + [0x0F24] = { unicodeslot=0x0F24, category='nd', description='TIBETAN DIGIT FOUR' }, + [0x0F25] = { unicodeslot=0x0F25, category='nd', description='TIBETAN DIGIT FIVE' }, + [0x0F26] = { unicodeslot=0x0F26, category='nd', description='TIBETAN DIGIT SIX' }, + [0x0F27] = { unicodeslot=0x0F27, category='nd', description='TIBETAN DIGIT SEVEN' }, + [0x0F28] = { unicodeslot=0x0F28, category='nd', description='TIBETAN DIGIT EIGHT' }, + [0x0F29] = { unicodeslot=0x0F29, category='nd', description='TIBETAN DIGIT NINE' }, + [0x0F2A] = { unicodeslot=0x0F2A, category='no', description='TIBETAN DIGIT HALF ONE' }, + [0x0F2B] = { unicodeslot=0x0F2B, category='no', description='TIBETAN DIGIT HALF TWO' }, + [0x0F2C] = { unicodeslot=0x0F2C, category='no', description='TIBETAN DIGIT HALF THREE' }, + [0x0F2D] = { unicodeslot=0x0F2D, category='no', description='TIBETAN DIGIT HALF FOUR' }, + [0x0F2E] = { unicodeslot=0x0F2E, category='no', description='TIBETAN DIGIT HALF FIVE' }, + [0x0F2F] = { unicodeslot=0x0F2F, category='no', description='TIBETAN DIGIT HALF SIX' }, + [0x0F30] = { unicodeslot=0x0F30, category='no', description='TIBETAN DIGIT HALF SEVEN' }, + [0x0F31] = { unicodeslot=0x0F31, category='no', description='TIBETAN DIGIT HALF EIGHT' }, + [0x0F32] = { unicodeslot=0x0F32, category='no', description='TIBETAN DIGIT HALF NINE' }, + [0x0F33] = { unicodeslot=0x0F33, category='no', description='TIBETAN DIGIT HALF ZERO' }, + [0x0F34] = { unicodeslot=0x0F34, category='so', description='TIBETAN MARK BSDUS RTAGS' }, + [0x0F35] = { unicodeslot=0x0F35, category='mn', description='TIBETAN MARK NGAS BZUNG NYI ZLA' }, + [0x0F36] = { unicodeslot=0x0F36, category='so', description='TIBETAN MARK CARET -DZUD RTAGS BZHI MIG CAN' }, + [0x0F37] = { unicodeslot=0x0F37, category='mn', description='TIBETAN MARK NGAS BZUNG SGOR RTAGS' }, + [0x0F38] = { unicodeslot=0x0F38, category='so', description='TIBETAN MARK CHE MGO' }, + [0x0F39] = { unicodeslot=0x0F39, category='mn', description='TIBETAN MARK TSA -PHRU' }, + [0x0F3A] = { unicodeslot=0x0F3A, category='ps', description='TIBETAN MARK GUG RTAGS GYON' }, + [0x0F3B] = { unicodeslot=0x0F3B, category='pe', description='TIBETAN MARK GUG RTAGS GYAS' }, + [0x0F3C] = { unicodeslot=0x0F3C, category='ps', description='TIBETAN MARK ANG KHANG GYON' }, + [0x0F3D] = { unicodeslot=0x0F3D, category='pe', description='TIBETAN MARK ANG KHANG GYAS' }, + [0x0F3E] = { unicodeslot=0x0F3E, category='mc', description='TIBETAN SIGN YAR TSHES' }, + [0x0F3F] = { unicodeslot=0x0F3F, category='mc', description='TIBETAN SIGN MAR TSHES' }, + [0x0F40] = { unicodeslot=0x0F40, category='lo', description='TIBETAN LETTER KA' }, + [0x0F41] = { unicodeslot=0x0F41, category='lo', description='TIBETAN LETTER KHA' }, + [0x0F42] = { unicodeslot=0x0F42, category='lo', description='TIBETAN LETTER GA' }, + [0x0F43] = { unicodeslot=0x0F43, category='lo', description='TIBETAN LETTER GHA', specials={'char',0x0F42,0x0FB7} }, + [0x0F44] = { unicodeslot=0x0F44, category='lo', description='TIBETAN LETTER NGA' }, + [0x0F45] = { unicodeslot=0x0F45, category='lo', description='TIBETAN LETTER CA' }, + [0x0F46] = { unicodeslot=0x0F46, category='lo', description='TIBETAN LETTER CHA' }, + [0x0F47] = { unicodeslot=0x0F47, category='lo', description='TIBETAN LETTER JA' }, + [0x0F49] = { unicodeslot=0x0F49, category='lo', description='TIBETAN LETTER NYA' }, + [0x0F4A] = { unicodeslot=0x0F4A, category='lo', description='TIBETAN LETTER TTA' }, + [0x0F4B] = { unicodeslot=0x0F4B, category='lo', description='TIBETAN LETTER TTHA' }, + [0x0F4C] = { unicodeslot=0x0F4C, category='lo', description='TIBETAN LETTER DDA' }, + [0x0F4D] = { unicodeslot=0x0F4D, category='lo', description='TIBETAN LETTER DDHA', specials={'char',0x0F4C,0x0FB7} }, + [0x0F4E] = { unicodeslot=0x0F4E, category='lo', description='TIBETAN LETTER NNA' }, + [0x0F4F] = { unicodeslot=0x0F4F, category='lo', description='TIBETAN LETTER TA' }, + [0x0F50] = { unicodeslot=0x0F50, category='lo', description='TIBETAN LETTER THA' }, + [0x0F51] = { unicodeslot=0x0F51, category='lo', description='TIBETAN LETTER DA' }, + [0x0F52] = { unicodeslot=0x0F52, category='lo', description='TIBETAN LETTER DHA', specials={'char',0x0F51,0x0FB7} }, + [0x0F53] = { unicodeslot=0x0F53, category='lo', description='TIBETAN LETTER NA' }, + [0x0F54] = { unicodeslot=0x0F54, category='lo', description='TIBETAN LETTER PA' }, + [0x0F55] = { unicodeslot=0x0F55, category='lo', description='TIBETAN LETTER PHA' }, + [0x0F56] = { unicodeslot=0x0F56, category='lo', description='TIBETAN LETTER BA' }, + [0x0F57] = { unicodeslot=0x0F57, category='lo', description='TIBETAN LETTER BHA', specials={'char',0x0F56,0x0FB7} }, + [0x0F58] = { unicodeslot=0x0F58, category='lo', description='TIBETAN LETTER MA' }, + [0x0F59] = { unicodeslot=0x0F59, category='lo', description='TIBETAN LETTER TSA' }, + [0x0F5A] = { unicodeslot=0x0F5A, category='lo', description='TIBETAN LETTER TSHA' }, + [0x0F5B] = { unicodeslot=0x0F5B, category='lo', description='TIBETAN LETTER DZA' }, + [0x0F5C] = { unicodeslot=0x0F5C, category='lo', description='TIBETAN LETTER DZHA', specials={'char',0x0F5B,0x0FB7} }, + [0x0F5D] = { unicodeslot=0x0F5D, category='lo', description='TIBETAN LETTER WA' }, + [0x0F5E] = { unicodeslot=0x0F5E, category='lo', description='TIBETAN LETTER ZHA' }, + [0x0F5F] = { unicodeslot=0x0F5F, category='lo', description='TIBETAN LETTER ZA' }, + [0x0F60] = { unicodeslot=0x0F60, category='lo', description='TIBETAN LETTER -A' }, + [0x0F61] = { unicodeslot=0x0F61, category='lo', description='TIBETAN LETTER YA' }, + [0x0F62] = { unicodeslot=0x0F62, category='lo', description='TIBETAN LETTER RA' }, + [0x0F63] = { unicodeslot=0x0F63, category='lo', description='TIBETAN LETTER LA' }, + [0x0F64] = { unicodeslot=0x0F64, category='lo', description='TIBETAN LETTER SHA' }, + [0x0F65] = { unicodeslot=0x0F65, category='lo', description='TIBETAN LETTER SSA' }, + [0x0F66] = { unicodeslot=0x0F66, category='lo', description='TIBETAN LETTER SA' }, + [0x0F67] = { unicodeslot=0x0F67, category='lo', description='TIBETAN LETTER HA' }, + [0x0F68] = { unicodeslot=0x0F68, category='lo', description='TIBETAN LETTER A' }, + [0x0F69] = { unicodeslot=0x0F69, category='lo', description='TIBETAN LETTER KSSA', specials={'char',0x0F40,0x0FB5} }, + [0x0F6A] = { unicodeslot=0x0F6A, category='lo', description='TIBETAN LETTER FIXED-FORM RA' }, + [0x0F71] = { unicodeslot=0x0F71, category='mn', description='TIBETAN VOWEL SIGN AA' }, + [0x0F72] = { unicodeslot=0x0F72, category='mn', description='TIBETAN VOWEL SIGN I' }, + [0x0F73] = { unicodeslot=0x0F73, category='mn', description='TIBETAN VOWEL SIGN II', specials={'char',0x0F71,0x0F72} }, + [0x0F74] = { unicodeslot=0x0F74, category='mn', description='TIBETAN VOWEL SIGN U' }, + [0x0F75] = { unicodeslot=0x0F75, category='mn', description='TIBETAN VOWEL SIGN UU', specials={'char',0x0F71,0x0F74} }, + [0x0F76] = { unicodeslot=0x0F76, category='mn', description='TIBETAN VOWEL SIGN VOCALIC R', specials={'char',0x0FB2,0x0F80} }, + [0x0F77] = { unicodeslot=0x0F77, category='mn', description='TIBETAN VOWEL SIGN VOCALIC RR', specials={'compat',0x0FB2,0x0F81} }, + [0x0F78] = { unicodeslot=0x0F78, category='mn', description='TIBETAN VOWEL SIGN VOCALIC L', specials={'char',0x0FB3,0x0F80} }, + [0x0F79] = { unicodeslot=0x0F79, category='mn', description='TIBETAN VOWEL SIGN VOCALIC LL', specials={'compat',0x0FB3,0x0F81} }, + [0x0F7A] = { unicodeslot=0x0F7A, category='mn', description='TIBETAN VOWEL SIGN E' }, + [0x0F7B] = { unicodeslot=0x0F7B, category='mn', description='TIBETAN VOWEL SIGN EE' }, + [0x0F7C] = { unicodeslot=0x0F7C, category='mn', description='TIBETAN VOWEL SIGN O' }, + [0x0F7D] = { unicodeslot=0x0F7D, category='mn', description='TIBETAN VOWEL SIGN OO' }, + [0x0F7E] = { unicodeslot=0x0F7E, category='mn', description='TIBETAN SIGN RJES SU NGA RO' }, + [0x0F7F] = { unicodeslot=0x0F7F, category='mc', description='TIBETAN SIGN RNAM BCAD' }, + [0x0F80] = { unicodeslot=0x0F80, category='mn', description='TIBETAN VOWEL SIGN REVERSED I' }, + [0x0F81] = { unicodeslot=0x0F81, category='mn', description='TIBETAN VOWEL SIGN REVERSED II', specials={'char',0x0F71,0x0F80} }, + [0x0F82] = { unicodeslot=0x0F82, category='mn', description='TIBETAN SIGN NYI ZLA NAA DA' }, + [0x0F83] = { unicodeslot=0x0F83, category='mn', description='TIBETAN SIGN SNA LDAN' }, + [0x0F84] = { unicodeslot=0x0F84, category='mn', description='TIBETAN MARK HALANTA' }, + [0x0F85] = { unicodeslot=0x0F85, category='po', description='TIBETAN MARK PALUTA' }, + [0x0F86] = { unicodeslot=0x0F86, category='mn', description='TIBETAN SIGN LCI RTAGS' }, + [0x0F87] = { unicodeslot=0x0F87, category='mn', description='TIBETAN SIGN YANG RTAGS' }, + [0x0F88] = { unicodeslot=0x0F88, category='lo', description='TIBETAN SIGN LCE TSA CAN' }, + [0x0F89] = { unicodeslot=0x0F89, category='lo', description='TIBETAN SIGN MCHU CAN' }, + [0x0F8A] = { unicodeslot=0x0F8A, category='lo', description='TIBETAN SIGN GRU CAN RGYINGS' }, + [0x0F8B] = { unicodeslot=0x0F8B, category='lo', description='TIBETAN SIGN GRU MED RGYINGS' }, + [0x0F90] = { unicodeslot=0x0F90, category='mn', description='TIBETAN SUBJOINED LETTER KA' }, + [0x0F91] = { unicodeslot=0x0F91, category='mn', description='TIBETAN SUBJOINED LETTER KHA' }, + [0x0F92] = { unicodeslot=0x0F92, category='mn', description='TIBETAN SUBJOINED LETTER GA' }, + [0x0F93] = { unicodeslot=0x0F93, category='mn', description='TIBETAN SUBJOINED LETTER GHA', specials={'char',0x0F92,0x0FB7} }, + [0x0F94] = { unicodeslot=0x0F94, category='mn', description='TIBETAN SUBJOINED LETTER NGA' }, + [0x0F95] = { unicodeslot=0x0F95, category='mn', description='TIBETAN SUBJOINED LETTER CA' }, + [0x0F96] = { unicodeslot=0x0F96, category='mn', description='TIBETAN SUBJOINED LETTER CHA' }, + [0x0F97] = { unicodeslot=0x0F97, category='mn', description='TIBETAN SUBJOINED LETTER JA' }, + [0x0F99] = { unicodeslot=0x0F99, category='mn', description='TIBETAN SUBJOINED LETTER NYA' }, + [0x0F9A] = { unicodeslot=0x0F9A, category='mn', description='TIBETAN SUBJOINED LETTER TTA' }, + [0x0F9B] = { unicodeslot=0x0F9B, category='mn', description='TIBETAN SUBJOINED LETTER TTHA' }, + [0x0F9C] = { unicodeslot=0x0F9C, category='mn', description='TIBETAN SUBJOINED LETTER DDA' }, + [0x0F9D] = { unicodeslot=0x0F9D, category='mn', description='TIBETAN SUBJOINED LETTER DDHA', specials={'char',0x0F9C,0x0FB7} }, + [0x0F9E] = { unicodeslot=0x0F9E, category='mn', description='TIBETAN SUBJOINED LETTER NNA' }, + [0x0F9F] = { unicodeslot=0x0F9F, category='mn', description='TIBETAN SUBJOINED LETTER TA' }, + [0x0FA0] = { unicodeslot=0x0FA0, category='mn', description='TIBETAN SUBJOINED LETTER THA' }, + [0x0FA1] = { unicodeslot=0x0FA1, category='mn', description='TIBETAN SUBJOINED LETTER DA' }, + [0x0FA2] = { unicodeslot=0x0FA2, category='mn', description='TIBETAN SUBJOINED LETTER DHA', specials={'char',0x0FA1,0x0FB7} }, + [0x0FA3] = { unicodeslot=0x0FA3, category='mn', description='TIBETAN SUBJOINED LETTER NA' }, + [0x0FA4] = { unicodeslot=0x0FA4, category='mn', description='TIBETAN SUBJOINED LETTER PA' }, + [0x0FA5] = { unicodeslot=0x0FA5, category='mn', description='TIBETAN SUBJOINED LETTER PHA' }, + [0x0FA6] = { unicodeslot=0x0FA6, category='mn', description='TIBETAN SUBJOINED LETTER BA' }, + [0x0FA7] = { unicodeslot=0x0FA7, category='mn', description='TIBETAN SUBJOINED LETTER BHA', specials={'char',0x0FA6,0x0FB7} }, + [0x0FA8] = { unicodeslot=0x0FA8, category='mn', description='TIBETAN SUBJOINED LETTER MA' }, + [0x0FA9] = { unicodeslot=0x0FA9, category='mn', description='TIBETAN SUBJOINED LETTER TSA' }, + [0x0FAA] = { unicodeslot=0x0FAA, category='mn', description='TIBETAN SUBJOINED LETTER TSHA' }, + [0x0FAB] = { unicodeslot=0x0FAB, category='mn', description='TIBETAN SUBJOINED LETTER DZA' }, + [0x0FAC] = { unicodeslot=0x0FAC, category='mn', description='TIBETAN SUBJOINED LETTER DZHA', specials={'char',0x0FAB,0x0FB7} }, + [0x0FAD] = { unicodeslot=0x0FAD, category='mn', description='TIBETAN SUBJOINED LETTER WA' }, + [0x0FAE] = { unicodeslot=0x0FAE, category='mn', description='TIBETAN SUBJOINED LETTER ZHA' }, + [0x0FAF] = { unicodeslot=0x0FAF, category='mn', description='TIBETAN SUBJOINED LETTER ZA' }, + [0x0FB0] = { unicodeslot=0x0FB0, category='mn', description='TIBETAN SUBJOINED LETTER -A' }, + [0x0FB1] = { unicodeslot=0x0FB1, category='mn', description='TIBETAN SUBJOINED LETTER YA' }, + [0x0FB2] = { unicodeslot=0x0FB2, category='mn', description='TIBETAN SUBJOINED LETTER RA' }, + [0x0FB3] = { unicodeslot=0x0FB3, category='mn', description='TIBETAN SUBJOINED LETTER LA' }, + [0x0FB4] = { unicodeslot=0x0FB4, category='mn', description='TIBETAN SUBJOINED LETTER SHA' }, + [0x0FB5] = { unicodeslot=0x0FB5, category='mn', description='TIBETAN SUBJOINED LETTER SSA' }, + [0x0FB6] = { unicodeslot=0x0FB6, category='mn', description='TIBETAN SUBJOINED LETTER SA' }, + [0x0FB7] = { unicodeslot=0x0FB7, category='mn', description='TIBETAN SUBJOINED LETTER HA' }, + [0x0FB8] = { unicodeslot=0x0FB8, category='mn', description='TIBETAN SUBJOINED LETTER A' }, + [0x0FB9] = { unicodeslot=0x0FB9, category='mn', description='TIBETAN SUBJOINED LETTER KSSA', specials={'char',0x0F90,0x0FB5} }, + [0x0FBA] = { unicodeslot=0x0FBA, category='mn', description='TIBETAN SUBJOINED LETTER FIXED-FORM WA' }, + [0x0FBB] = { unicodeslot=0x0FBB, category='mn', description='TIBETAN SUBJOINED LETTER FIXED-FORM YA' }, + [0x0FBC] = { unicodeslot=0x0FBC, category='mn', description='TIBETAN SUBJOINED LETTER FIXED-FORM RA' }, + [0x0FBE] = { unicodeslot=0x0FBE, category='so', description='TIBETAN KU RU KHA' }, + [0x0FBF] = { unicodeslot=0x0FBF, category='so', description='TIBETAN KU RU KHA BZHI MIG CAN' }, + [0x0FC0] = { unicodeslot=0x0FC0, category='so', description='TIBETAN CANTILLATION SIGN HEAVY BEAT' }, + [0x0FC1] = { unicodeslot=0x0FC1, category='so', description='TIBETAN CANTILLATION SIGN LIGHT BEAT' }, + [0x0FC2] = { unicodeslot=0x0FC2, category='so', description='TIBETAN CANTILLATION SIGN CANG TE-U' }, + [0x0FC3] = { unicodeslot=0x0FC3, category='so', description='TIBETAN CANTILLATION SIGN SBUB -CHAL' }, + [0x0FC4] = { unicodeslot=0x0FC4, category='so', description='TIBETAN SYMBOL DRIL BU' }, + [0x0FC5] = { unicodeslot=0x0FC5, category='so', description='TIBETAN SYMBOL RDO RJE' }, + [0x0FC6] = { unicodeslot=0x0FC6, category='mn', description='TIBETAN SYMBOL PADMA GDAN' }, + [0x0FC7] = { unicodeslot=0x0FC7, category='so', description='TIBETAN SYMBOL RDO RJE RGYA GRAM' }, + [0x0FC8] = { unicodeslot=0x0FC8, category='so', description='TIBETAN SYMBOL PHUR PA' }, + [0x0FC9] = { unicodeslot=0x0FC9, category='so', description='TIBETAN SYMBOL NOR BU' }, + [0x0FCA] = { unicodeslot=0x0FCA, category='so', description='TIBETAN SYMBOL NOR BU NYIS -KHYIL' }, + [0x0FCB] = { unicodeslot=0x0FCB, category='so', description='TIBETAN SYMBOL NOR BU GSUM -KHYIL' }, + [0x0FCC] = { unicodeslot=0x0FCC, category='so', description='TIBETAN SYMBOL NOR BU BZHI -KHYIL' }, + [0x0FCF] = { unicodeslot=0x0FCF, category='so', description='TIBETAN SIGN RDEL NAG GSUM' }, + [0x0FD0] = { unicodeslot=0x0FD0, category='po', description='TIBETAN MARK BSKA- SHOG GI MGO RGYAN' }, + [0x0FD1] = { unicodeslot=0x0FD1, category='po', description='TIBETAN MARK MNYAM YIG GI MGO RGYAN' }, + [0x1000] = { unicodeslot=0x1000, category='lo', description='MYANMAR LETTER KA' }, + [0x1001] = { unicodeslot=0x1001, category='lo', description='MYANMAR LETTER KHA' }, + [0x1002] = { unicodeslot=0x1002, category='lo', description='MYANMAR LETTER GA' }, + [0x1003] = { unicodeslot=0x1003, category='lo', description='MYANMAR LETTER GHA' }, + [0x1004] = { unicodeslot=0x1004, category='lo', description='MYANMAR LETTER NGA' }, + [0x1005] = { unicodeslot=0x1005, category='lo', description='MYANMAR LETTER CA' }, + [0x1006] = { unicodeslot=0x1006, category='lo', description='MYANMAR LETTER CHA' }, + [0x1007] = { unicodeslot=0x1007, category='lo', description='MYANMAR LETTER JA' }, + [0x1008] = { unicodeslot=0x1008, category='lo', description='MYANMAR LETTER JHA' }, + [0x1009] = { unicodeslot=0x1009, category='lo', description='MYANMAR LETTER NYA' }, + [0x100A] = { unicodeslot=0x100A, category='lo', description='MYANMAR LETTER NNYA' }, + [0x100B] = { unicodeslot=0x100B, category='lo', description='MYANMAR LETTER TTA' }, + [0x100C] = { unicodeslot=0x100C, category='lo', description='MYANMAR LETTER TTHA' }, + [0x100D] = { unicodeslot=0x100D, category='lo', description='MYANMAR LETTER DDA' }, + [0x100E] = { unicodeslot=0x100E, category='lo', description='MYANMAR LETTER DDHA' }, + [0x100F] = { unicodeslot=0x100F, category='lo', description='MYANMAR LETTER NNA' }, + [0x1010] = { unicodeslot=0x1010, category='lo', description='MYANMAR LETTER TA' }, + [0x1011] = { unicodeslot=0x1011, category='lo', description='MYANMAR LETTER THA' }, + [0x1012] = { unicodeslot=0x1012, category='lo', description='MYANMAR LETTER DA' }, + [0x1013] = { unicodeslot=0x1013, category='lo', description='MYANMAR LETTER DHA' }, + [0x1014] = { unicodeslot=0x1014, category='lo', description='MYANMAR LETTER NA' }, + [0x1015] = { unicodeslot=0x1015, category='lo', description='MYANMAR LETTER PA' }, + [0x1016] = { unicodeslot=0x1016, category='lo', description='MYANMAR LETTER PHA' }, + [0x1017] = { unicodeslot=0x1017, category='lo', description='MYANMAR LETTER BA' }, + [0x1018] = { unicodeslot=0x1018, category='lo', description='MYANMAR LETTER BHA' }, + [0x1019] = { unicodeslot=0x1019, category='lo', description='MYANMAR LETTER MA' }, + [0x101A] = { unicodeslot=0x101A, category='lo', description='MYANMAR LETTER YA' }, + [0x101B] = { unicodeslot=0x101B, category='lo', description='MYANMAR LETTER RA' }, + [0x101C] = { unicodeslot=0x101C, category='lo', description='MYANMAR LETTER LA' }, + [0x101D] = { unicodeslot=0x101D, category='lo', description='MYANMAR LETTER WA' }, + [0x101E] = { unicodeslot=0x101E, category='lo', description='MYANMAR LETTER SA' }, + [0x101F] = { unicodeslot=0x101F, category='lo', description='MYANMAR LETTER HA' }, + [0x1020] = { unicodeslot=0x1020, category='lo', description='MYANMAR LETTER LLA' }, + [0x1021] = { unicodeslot=0x1021, category='lo', description='MYANMAR LETTER A' }, + [0x1023] = { unicodeslot=0x1023, category='lo', description='MYANMAR LETTER I' }, + [0x1024] = { unicodeslot=0x1024, category='lo', description='MYANMAR LETTER II' }, + [0x1025] = { unicodeslot=0x1025, category='lo', description='MYANMAR LETTER U' }, + [0x1026] = { unicodeslot=0x1026, category='lo', description='MYANMAR LETTER UU', specials={'char',0x1025,0x102E} }, + [0x1027] = { unicodeslot=0x1027, category='lo', description='MYANMAR LETTER E' }, + [0x1029] = { unicodeslot=0x1029, category='lo', description='MYANMAR LETTER O' }, + [0x102A] = { unicodeslot=0x102A, category='lo', description='MYANMAR LETTER AU' }, + [0x102C] = { unicodeslot=0x102C, category='mc', description='MYANMAR VOWEL SIGN AA' }, + [0x102D] = { unicodeslot=0x102D, category='mn', description='MYANMAR VOWEL SIGN I' }, + [0x102E] = { unicodeslot=0x102E, category='mn', description='MYANMAR VOWEL SIGN II' }, + [0x102F] = { unicodeslot=0x102F, category='mn', description='MYANMAR VOWEL SIGN U' }, + [0x1030] = { unicodeslot=0x1030, category='mn', description='MYANMAR VOWEL SIGN UU' }, + [0x1031] = { unicodeslot=0x1031, category='mc', description='MYANMAR VOWEL SIGN E' }, + [0x1032] = { unicodeslot=0x1032, category='mn', description='MYANMAR VOWEL SIGN AI' }, + [0x1036] = { unicodeslot=0x1036, category='mn', description='MYANMAR SIGN ANUSVARA' }, + [0x1037] = { unicodeslot=0x1037, category='mn', description='MYANMAR SIGN DOT BELOW' }, + [0x1038] = { unicodeslot=0x1038, category='mc', description='MYANMAR SIGN VISARGA' }, + [0x1039] = { unicodeslot=0x1039, category='mn', description='MYANMAR SIGN VIRAMA' }, + [0x1040] = { unicodeslot=0x1040, category='nd', description='MYANMAR DIGIT ZERO' }, + [0x1041] = { unicodeslot=0x1041, category='nd', description='MYANMAR DIGIT ONE' }, + [0x1042] = { unicodeslot=0x1042, category='nd', description='MYANMAR DIGIT TWO' }, + [0x1043] = { unicodeslot=0x1043, category='nd', description='MYANMAR DIGIT THREE' }, + [0x1044] = { unicodeslot=0x1044, category='nd', description='MYANMAR DIGIT FOUR' }, + [0x1045] = { unicodeslot=0x1045, category='nd', description='MYANMAR DIGIT FIVE' }, + [0x1046] = { unicodeslot=0x1046, category='nd', description='MYANMAR DIGIT SIX' }, + [0x1047] = { unicodeslot=0x1047, category='nd', description='MYANMAR DIGIT SEVEN' }, + [0x1048] = { unicodeslot=0x1048, category='nd', description='MYANMAR DIGIT EIGHT' }, + [0x1049] = { unicodeslot=0x1049, category='nd', description='MYANMAR DIGIT NINE' }, + [0x104A] = { unicodeslot=0x104A, category='po', description='MYANMAR SIGN LITTLE SECTION' }, + [0x104B] = { unicodeslot=0x104B, category='po', description='MYANMAR SIGN SECTION' }, + [0x104C] = { unicodeslot=0x104C, category='po', description='MYANMAR SYMBOL LOCATIVE' }, + [0x104D] = { unicodeslot=0x104D, category='po', description='MYANMAR SYMBOL COMPLETED' }, + [0x104E] = { unicodeslot=0x104E, category='po', description='MYANMAR SYMBOL AFOREMENTIONED' }, + [0x104F] = { unicodeslot=0x104F, category='po', description='MYANMAR SYMBOL GENITIVE' }, + [0x1050] = { unicodeslot=0x1050, category='lo', description='MYANMAR LETTER SHA' }, + [0x1051] = { unicodeslot=0x1051, category='lo', description='MYANMAR LETTER SSA' }, + [0x1052] = { unicodeslot=0x1052, category='lo', description='MYANMAR LETTER VOCALIC R' }, + [0x1053] = { unicodeslot=0x1053, category='lo', description='MYANMAR LETTER VOCALIC RR' }, + [0x1054] = { unicodeslot=0x1054, category='lo', description='MYANMAR LETTER VOCALIC L' }, + [0x1055] = { unicodeslot=0x1055, category='lo', description='MYANMAR LETTER VOCALIC LL' }, + [0x1056] = { unicodeslot=0x1056, category='mc', description='MYANMAR VOWEL SIGN VOCALIC R' }, + [0x1057] = { unicodeslot=0x1057, category='mc', description='MYANMAR VOWEL SIGN VOCALIC RR' }, + [0x1058] = { unicodeslot=0x1058, category='mn', description='MYANMAR VOWEL SIGN VOCALIC L' }, + [0x1059] = { unicodeslot=0x1059, category='mn', description='MYANMAR VOWEL SIGN VOCALIC LL' }, + [0x10A0] = { unicodeslot=0x10A0, category='lu', description='GEORGIAN CAPITAL LETTER AN', lccode=0x2D00 }, + [0x10A1] = { unicodeslot=0x10A1, category='lu', description='GEORGIAN CAPITAL LETTER BAN', lccode=0x2D01 }, + [0x10A2] = { unicodeslot=0x10A2, category='lu', description='GEORGIAN CAPITAL LETTER GAN', lccode=0x2D02 }, + [0x10A3] = { unicodeslot=0x10A3, category='lu', description='GEORGIAN CAPITAL LETTER DON', lccode=0x2D03 }, + [0x10A4] = { unicodeslot=0x10A4, category='lu', description='GEORGIAN CAPITAL LETTER EN', lccode=0x2D04 }, + [0x10A5] = { unicodeslot=0x10A5, category='lu', description='GEORGIAN CAPITAL LETTER VIN', lccode=0x2D05 }, + [0x10A6] = { unicodeslot=0x10A6, category='lu', description='GEORGIAN CAPITAL LETTER ZEN', lccode=0x2D06 }, + [0x10A7] = { unicodeslot=0x10A7, category='lu', description='GEORGIAN CAPITAL LETTER TAN', lccode=0x2D07 }, + [0x10A8] = { unicodeslot=0x10A8, category='lu', description='GEORGIAN CAPITAL LETTER IN', lccode=0x2D08 }, + [0x10A9] = { unicodeslot=0x10A9, category='lu', description='GEORGIAN CAPITAL LETTER KAN', lccode=0x2D09 }, + [0x10AA] = { unicodeslot=0x10AA, category='lu', description='GEORGIAN CAPITAL LETTER LAS', lccode=0x2D0A }, + [0x10AB] = { unicodeslot=0x10AB, category='lu', description='GEORGIAN CAPITAL LETTER MAN', lccode=0x2D0B }, + [0x10AC] = { unicodeslot=0x10AC, category='lu', description='GEORGIAN CAPITAL LETTER NAR', lccode=0x2D0C }, + [0x10AD] = { unicodeslot=0x10AD, category='lu', description='GEORGIAN CAPITAL LETTER ON', lccode=0x2D0D }, + [0x10AE] = { unicodeslot=0x10AE, category='lu', description='GEORGIAN CAPITAL LETTER PAR', lccode=0x2D0E }, + [0x10AF] = { unicodeslot=0x10AF, category='lu', description='GEORGIAN CAPITAL LETTER ZHAR', lccode=0x2D0F }, + [0x10B0] = { unicodeslot=0x10B0, category='lu', description='GEORGIAN CAPITAL LETTER RAE', lccode=0x2D10 }, + [0x10B1] = { unicodeslot=0x10B1, category='lu', description='GEORGIAN CAPITAL LETTER SAN', lccode=0x2D11 }, + [0x10B2] = { unicodeslot=0x10B2, category='lu', description='GEORGIAN CAPITAL LETTER TAR', lccode=0x2D12 }, + [0x10B3] = { unicodeslot=0x10B3, category='lu', description='GEORGIAN CAPITAL LETTER UN', lccode=0x2D13 }, + [0x10B4] = { unicodeslot=0x10B4, category='lu', description='GEORGIAN CAPITAL LETTER PHAR', lccode=0x2D14 }, + [0x10B5] = { unicodeslot=0x10B5, category='lu', description='GEORGIAN CAPITAL LETTER KHAR', lccode=0x2D15 }, + [0x10B6] = { unicodeslot=0x10B6, category='lu', description='GEORGIAN CAPITAL LETTER GHAN', lccode=0x2D16 }, + [0x10B7] = { unicodeslot=0x10B7, category='lu', description='GEORGIAN CAPITAL LETTER QAR', lccode=0x2D17 }, + [0x10B8] = { unicodeslot=0x10B8, category='lu', description='GEORGIAN CAPITAL LETTER SHIN', lccode=0x2D18 }, + [0x10B9] = { unicodeslot=0x10B9, category='lu', description='GEORGIAN CAPITAL LETTER CHIN', lccode=0x2D19 }, + [0x10BA] = { unicodeslot=0x10BA, category='lu', description='GEORGIAN CAPITAL LETTER CAN', lccode=0x2D1A }, + [0x10BB] = { unicodeslot=0x10BB, category='lu', description='GEORGIAN CAPITAL LETTER JIL', lccode=0x2D1B }, + [0x10BC] = { unicodeslot=0x10BC, category='lu', description='GEORGIAN CAPITAL LETTER CIL', lccode=0x2D1C }, + [0x10BD] = { unicodeslot=0x10BD, category='lu', description='GEORGIAN CAPITAL LETTER CHAR', lccode=0x2D1D }, + [0x10BE] = { unicodeslot=0x10BE, category='lu', description='GEORGIAN CAPITAL LETTER XAN', lccode=0x2D1E }, + [0x10BF] = { unicodeslot=0x10BF, category='lu', description='GEORGIAN CAPITAL LETTER JHAN', lccode=0x2D1F }, + [0x10C0] = { unicodeslot=0x10C0, category='lu', description='GEORGIAN CAPITAL LETTER HAE', lccode=0x2D20 }, + [0x10C1] = { unicodeslot=0x10C1, category='lu', description='GEORGIAN CAPITAL LETTER HE', lccode=0x2D21 }, + [0x10C2] = { unicodeslot=0x10C2, category='lu', description='GEORGIAN CAPITAL LETTER HIE', lccode=0x2D22 }, + [0x10C3] = { unicodeslot=0x10C3, category='lu', description='GEORGIAN CAPITAL LETTER WE', lccode=0x2D23 }, + [0x10C4] = { unicodeslot=0x10C4, category='lu', description='GEORGIAN CAPITAL LETTER HAR', lccode=0x2D24 }, + [0x10C5] = { unicodeslot=0x10C5, category='lu', description='GEORGIAN CAPITAL LETTER HOE', lccode=0x2D25 }, + [0x10D0] = { unicodeslot=0x10D0, category='lo', description='GEORGIAN LETTER AN' }, + [0x10D1] = { unicodeslot=0x10D1, category='lo', description='GEORGIAN LETTER BAN' }, + [0x10D2] = { unicodeslot=0x10D2, category='lo', description='GEORGIAN LETTER GAN' }, + [0x10D3] = { unicodeslot=0x10D3, category='lo', description='GEORGIAN LETTER DON' }, + [0x10D4] = { unicodeslot=0x10D4, category='lo', description='GEORGIAN LETTER EN' }, + [0x10D5] = { unicodeslot=0x10D5, category='lo', description='GEORGIAN LETTER VIN' }, + [0x10D6] = { unicodeslot=0x10D6, category='lo', description='GEORGIAN LETTER ZEN' }, + [0x10D7] = { unicodeslot=0x10D7, category='lo', description='GEORGIAN LETTER TAN' }, + [0x10D8] = { unicodeslot=0x10D8, category='lo', description='GEORGIAN LETTER IN' }, + [0x10D9] = { unicodeslot=0x10D9, category='lo', description='GEORGIAN LETTER KAN' }, + [0x10DA] = { unicodeslot=0x10DA, category='lo', description='GEORGIAN LETTER LAS' }, + [0x10DB] = { unicodeslot=0x10DB, category='lo', description='GEORGIAN LETTER MAN' }, + [0x10DC] = { unicodeslot=0x10DC, category='lo', description='GEORGIAN LETTER NAR' }, + [0x10DD] = { unicodeslot=0x10DD, category='lo', description='GEORGIAN LETTER ON' }, + [0x10DE] = { unicodeslot=0x10DE, category='lo', description='GEORGIAN LETTER PAR' }, + [0x10DF] = { unicodeslot=0x10DF, category='lo', description='GEORGIAN LETTER ZHAR' }, + [0x10E0] = { unicodeslot=0x10E0, category='lo', description='GEORGIAN LETTER RAE' }, + [0x10E1] = { unicodeslot=0x10E1, category='lo', description='GEORGIAN LETTER SAN' }, + [0x10E2] = { unicodeslot=0x10E2, category='lo', description='GEORGIAN LETTER TAR' }, + [0x10E3] = { unicodeslot=0x10E3, category='lo', description='GEORGIAN LETTER UN' }, + [0x10E4] = { unicodeslot=0x10E4, category='lo', description='GEORGIAN LETTER PHAR' }, + [0x10E5] = { unicodeslot=0x10E5, category='lo', description='GEORGIAN LETTER KHAR' }, + [0x10E6] = { unicodeslot=0x10E6, category='lo', description='GEORGIAN LETTER GHAN' }, + [0x10E7] = { unicodeslot=0x10E7, category='lo', description='GEORGIAN LETTER QAR' }, + [0x10E8] = { unicodeslot=0x10E8, category='lo', description='GEORGIAN LETTER SHIN' }, + [0x10E9] = { unicodeslot=0x10E9, category='lo', description='GEORGIAN LETTER CHIN' }, + [0x10EA] = { unicodeslot=0x10EA, category='lo', description='GEORGIAN LETTER CAN' }, + [0x10EB] = { unicodeslot=0x10EB, category='lo', description='GEORGIAN LETTER JIL' }, + [0x10EC] = { unicodeslot=0x10EC, category='lo', description='GEORGIAN LETTER CIL' }, + [0x10ED] = { unicodeslot=0x10ED, category='lo', description='GEORGIAN LETTER CHAR' }, + [0x10EE] = { unicodeslot=0x10EE, category='lo', description='GEORGIAN LETTER XAN' }, + [0x10EF] = { unicodeslot=0x10EF, category='lo', description='GEORGIAN LETTER JHAN' }, + [0x10F0] = { unicodeslot=0x10F0, category='lo', description='GEORGIAN LETTER HAE' }, + [0x10F1] = { unicodeslot=0x10F1, category='lo', description='GEORGIAN LETTER HE' }, + [0x10F2] = { unicodeslot=0x10F2, category='lo', description='GEORGIAN LETTER HIE' }, + [0x10F3] = { unicodeslot=0x10F3, category='lo', description='GEORGIAN LETTER WE' }, + [0x10F4] = { unicodeslot=0x10F4, category='lo', description='GEORGIAN LETTER HAR' }, + [0x10F5] = { unicodeslot=0x10F5, category='lo', description='GEORGIAN LETTER HOE' }, + [0x10F6] = { unicodeslot=0x10F6, category='lo', description='GEORGIAN LETTER FI' }, + [0x10F7] = { unicodeslot=0x10F7, category='lo', description='GEORGIAN LETTER YN' }, + [0x10F8] = { unicodeslot=0x10F8, category='lo', description='GEORGIAN LETTER ELIFI' }, + [0x10F9] = { unicodeslot=0x10F9, category='lo', description='GEORGIAN LETTER TURNED GAN' }, + [0x10FA] = { unicodeslot=0x10FA, category='lo', description='GEORGIAN LETTER AIN' }, + [0x10FB] = { unicodeslot=0x10FB, category='po', description='GEORGIAN PARAGRAPH SEPARATOR' }, + [0x10FC] = { unicodeslot=0x10FC, category='lm', description='MODIFIER LETTER GEORGIAN NAR', specials={'super',0x10DC} }, + [0x1100] = { unicodeslot=0x1100, category='lo', description='HANGUL CHOSEONG KIYEOK' }, + [0x1101] = { unicodeslot=0x1101, category='lo', description='HANGUL CHOSEONG SSANGKIYEOK' }, + [0x1102] = { unicodeslot=0x1102, category='lo', description='HANGUL CHOSEONG NIEUN' }, + [0x1103] = { unicodeslot=0x1103, category='lo', description='HANGUL CHOSEONG TIKEUT' }, + [0x1104] = { unicodeslot=0x1104, category='lo', description='HANGUL CHOSEONG SSANGTIKEUT' }, + [0x1105] = { unicodeslot=0x1105, category='lo', description='HANGUL CHOSEONG RIEUL' }, + [0x1106] = { unicodeslot=0x1106, category='lo', description='HANGUL CHOSEONG MIEUM' }, + [0x1107] = { unicodeslot=0x1107, category='lo', description='HANGUL CHOSEONG PIEUP' }, + [0x1108] = { unicodeslot=0x1108, category='lo', description='HANGUL CHOSEONG SSANGPIEUP' }, + [0x1109] = { unicodeslot=0x1109, category='lo', description='HANGUL CHOSEONG SIOS' }, + [0x110A] = { unicodeslot=0x110A, category='lo', description='HANGUL CHOSEONG SSANGSIOS' }, + [0x110B] = { unicodeslot=0x110B, category='lo', description='HANGUL CHOSEONG IEUNG' }, + [0x110C] = { unicodeslot=0x110C, category='lo', description='HANGUL CHOSEONG CIEUC' }, + [0x110D] = { unicodeslot=0x110D, category='lo', description='HANGUL CHOSEONG SSANGCIEUC' }, + [0x110E] = { unicodeslot=0x110E, category='lo', description='HANGUL CHOSEONG CHIEUCH' }, + [0x110F] = { unicodeslot=0x110F, category='lo', description='HANGUL CHOSEONG KHIEUKH' }, + [0x1110] = { unicodeslot=0x1110, category='lo', description='HANGUL CHOSEONG THIEUTH' }, + [0x1111] = { unicodeslot=0x1111, category='lo', description='HANGUL CHOSEONG PHIEUPH' }, + [0x1112] = { unicodeslot=0x1112, category='lo', description='HANGUL CHOSEONG HIEUH' }, + [0x1113] = { unicodeslot=0x1113, category='lo', description='HANGUL CHOSEONG NIEUN-KIYEOK' }, + [0x1114] = { unicodeslot=0x1114, category='lo', description='HANGUL CHOSEONG SSANGNIEUN' }, + [0x1115] = { unicodeslot=0x1115, category='lo', description='HANGUL CHOSEONG NIEUN-TIKEUT' }, + [0x1116] = { unicodeslot=0x1116, category='lo', description='HANGUL CHOSEONG NIEUN-PIEUP' }, + [0x1117] = { unicodeslot=0x1117, category='lo', description='HANGUL CHOSEONG TIKEUT-KIYEOK' }, + [0x1118] = { unicodeslot=0x1118, category='lo', description='HANGUL CHOSEONG RIEUL-NIEUN' }, + [0x1119] = { unicodeslot=0x1119, category='lo', description='HANGUL CHOSEONG SSANGRIEUL' }, + [0x111A] = { unicodeslot=0x111A, category='lo', description='HANGUL CHOSEONG RIEUL-HIEUH' }, + [0x111B] = { unicodeslot=0x111B, category='lo', description='HANGUL CHOSEONG KAPYEOUNRIEUL' }, + [0x111C] = { unicodeslot=0x111C, category='lo', description='HANGUL CHOSEONG MIEUM-PIEUP' }, + [0x111D] = { unicodeslot=0x111D, category='lo', description='HANGUL CHOSEONG KAPYEOUNMIEUM' }, + [0x111E] = { unicodeslot=0x111E, category='lo', description='HANGUL CHOSEONG PIEUP-KIYEOK' }, + [0x111F] = { unicodeslot=0x111F, category='lo', description='HANGUL CHOSEONG PIEUP-NIEUN' }, + [0x1120] = { unicodeslot=0x1120, category='lo', description='HANGUL CHOSEONG PIEUP-TIKEUT' }, + [0x1121] = { unicodeslot=0x1121, category='lo', description='HANGUL CHOSEONG PIEUP-SIOS' }, + [0x1122] = { unicodeslot=0x1122, category='lo', description='HANGUL CHOSEONG PIEUP-SIOS-KIYEOK' }, + [0x1123] = { unicodeslot=0x1123, category='lo', description='HANGUL CHOSEONG PIEUP-SIOS-TIKEUT' }, + [0x1124] = { unicodeslot=0x1124, category='lo', description='HANGUL CHOSEONG PIEUP-SIOS-PIEUP' }, + [0x1125] = { unicodeslot=0x1125, category='lo', description='HANGUL CHOSEONG PIEUP-SSANGSIOS' }, + [0x1126] = { unicodeslot=0x1126, category='lo', description='HANGUL CHOSEONG PIEUP-SIOS-CIEUC' }, + [0x1127] = { unicodeslot=0x1127, category='lo', description='HANGUL CHOSEONG PIEUP-CIEUC' }, + [0x1128] = { unicodeslot=0x1128, category='lo', description='HANGUL CHOSEONG PIEUP-CHIEUCH' }, + [0x1129] = { unicodeslot=0x1129, category='lo', description='HANGUL CHOSEONG PIEUP-THIEUTH' }, + [0x112A] = { unicodeslot=0x112A, category='lo', description='HANGUL CHOSEONG PIEUP-PHIEUPH' }, + [0x112B] = { unicodeslot=0x112B, category='lo', description='HANGUL CHOSEONG KAPYEOUNPIEUP' }, + [0x112C] = { unicodeslot=0x112C, category='lo', description='HANGUL CHOSEONG KAPYEOUNSSANGPIEUP' }, + [0x112D] = { unicodeslot=0x112D, category='lo', description='HANGUL CHOSEONG SIOS-KIYEOK' }, + [0x112E] = { unicodeslot=0x112E, category='lo', description='HANGUL CHOSEONG SIOS-NIEUN' }, + [0x112F] = { unicodeslot=0x112F, category='lo', description='HANGUL CHOSEONG SIOS-TIKEUT' }, + [0x1130] = { unicodeslot=0x1130, category='lo', description='HANGUL CHOSEONG SIOS-RIEUL' }, + [0x1131] = { unicodeslot=0x1131, category='lo', description='HANGUL CHOSEONG SIOS-MIEUM' }, + [0x1132] = { unicodeslot=0x1132, category='lo', description='HANGUL CHOSEONG SIOS-PIEUP' }, + [0x1133] = { unicodeslot=0x1133, category='lo', description='HANGUL CHOSEONG SIOS-PIEUP-KIYEOK' }, + [0x1134] = { unicodeslot=0x1134, category='lo', description='HANGUL CHOSEONG SIOS-SSANGSIOS' }, + [0x1135] = { unicodeslot=0x1135, category='lo', description='HANGUL CHOSEONG SIOS-IEUNG' }, + [0x1136] = { unicodeslot=0x1136, category='lo', description='HANGUL CHOSEONG SIOS-CIEUC' }, + [0x1137] = { unicodeslot=0x1137, category='lo', description='HANGUL CHOSEONG SIOS-CHIEUCH' }, + [0x1138] = { unicodeslot=0x1138, category='lo', description='HANGUL CHOSEONG SIOS-KHIEUKH' }, + [0x1139] = { unicodeslot=0x1139, category='lo', description='HANGUL CHOSEONG SIOS-THIEUTH' }, + [0x113A] = { unicodeslot=0x113A, category='lo', description='HANGUL CHOSEONG SIOS-PHIEUPH' }, + [0x113B] = { unicodeslot=0x113B, category='lo', description='HANGUL CHOSEONG SIOS-HIEUH' }, + [0x113C] = { unicodeslot=0x113C, category='lo', description='HANGUL CHOSEONG CHITUEUMSIOS' }, + [0x113D] = { unicodeslot=0x113D, category='lo', description='HANGUL CHOSEONG CHITUEUMSSANGSIOS' }, + [0x113E] = { unicodeslot=0x113E, category='lo', description='HANGUL CHOSEONG CEONGCHIEUMSIOS' }, + [0x113F] = { unicodeslot=0x113F, category='lo', description='HANGUL CHOSEONG CEONGCHIEUMSSANGSIOS' }, + [0x1140] = { unicodeslot=0x1140, category='lo', description='HANGUL CHOSEONG PANSIOS' }, + [0x1141] = { unicodeslot=0x1141, category='lo', description='HANGUL CHOSEONG IEUNG-KIYEOK' }, + [0x1142] = { unicodeslot=0x1142, category='lo', description='HANGUL CHOSEONG IEUNG-TIKEUT' }, + [0x1143] = { unicodeslot=0x1143, category='lo', description='HANGUL CHOSEONG IEUNG-MIEUM' }, + [0x1144] = { unicodeslot=0x1144, category='lo', description='HANGUL CHOSEONG IEUNG-PIEUP' }, + [0x1145] = { unicodeslot=0x1145, category='lo', description='HANGUL CHOSEONG IEUNG-SIOS' }, + [0x1146] = { unicodeslot=0x1146, category='lo', description='HANGUL CHOSEONG IEUNG-PANSIOS' }, + [0x1147] = { unicodeslot=0x1147, category='lo', description='HANGUL CHOSEONG SSANGIEUNG' }, + [0x1148] = { unicodeslot=0x1148, category='lo', description='HANGUL CHOSEONG IEUNG-CIEUC' }, + [0x1149] = { unicodeslot=0x1149, category='lo', description='HANGUL CHOSEONG IEUNG-CHIEUCH' }, + [0x114A] = { unicodeslot=0x114A, category='lo', description='HANGUL CHOSEONG IEUNG-THIEUTH' }, + [0x114B] = { unicodeslot=0x114B, category='lo', description='HANGUL CHOSEONG IEUNG-PHIEUPH' }, + [0x114C] = { unicodeslot=0x114C, category='lo', description='HANGUL CHOSEONG YESIEUNG' }, + [0x114D] = { unicodeslot=0x114D, category='lo', description='HANGUL CHOSEONG CIEUC-IEUNG' }, + [0x114E] = { unicodeslot=0x114E, category='lo', description='HANGUL CHOSEONG CHITUEUMCIEUC' }, + [0x114F] = { unicodeslot=0x114F, category='lo', description='HANGUL CHOSEONG CHITUEUMSSANGCIEUC' }, + [0x1150] = { unicodeslot=0x1150, category='lo', description='HANGUL CHOSEONG CEONGCHIEUMCIEUC' }, + [0x1151] = { unicodeslot=0x1151, category='lo', description='HANGUL CHOSEONG CEONGCHIEUMSSANGCIEUC' }, + [0x1152] = { unicodeslot=0x1152, category='lo', description='HANGUL CHOSEONG CHIEUCH-KHIEUKH' }, + [0x1153] = { unicodeslot=0x1153, category='lo', description='HANGUL CHOSEONG CHIEUCH-HIEUH' }, + [0x1154] = { unicodeslot=0x1154, category='lo', description='HANGUL CHOSEONG CHITUEUMCHIEUCH' }, + [0x1155] = { unicodeslot=0x1155, category='lo', description='HANGUL CHOSEONG CEONGCHIEUMCHIEUCH' }, + [0x1156] = { unicodeslot=0x1156, category='lo', description='HANGUL CHOSEONG PHIEUPH-PIEUP' }, + [0x1157] = { unicodeslot=0x1157, category='lo', description='HANGUL CHOSEONG KAPYEOUNPHIEUPH' }, + [0x1158] = { unicodeslot=0x1158, category='lo', description='HANGUL CHOSEONG SSANGHIEUH' }, + [0x1159] = { unicodeslot=0x1159, category='lo', description='HANGUL CHOSEONG YEORINHIEUH' }, + [0x115F] = { unicodeslot=0x115F, category='lo', description='HANGUL CHOSEONG FILLER' }, + [0x1160] = { unicodeslot=0x1160, category='lo', description='HANGUL JUNGSEONG FILLER' }, + [0x1161] = { unicodeslot=0x1161, category='lo', description='HANGUL JUNGSEONG A' }, + [0x1162] = { unicodeslot=0x1162, category='lo', description='HANGUL JUNGSEONG AE' }, + [0x1163] = { unicodeslot=0x1163, category='lo', description='HANGUL JUNGSEONG YA' }, + [0x1164] = { unicodeslot=0x1164, category='lo', description='HANGUL JUNGSEONG YAE' }, + [0x1165] = { unicodeslot=0x1165, category='lo', description='HANGUL JUNGSEONG EO' }, + [0x1166] = { unicodeslot=0x1166, category='lo', description='HANGUL JUNGSEONG E' }, + [0x1167] = { unicodeslot=0x1167, category='lo', description='HANGUL JUNGSEONG YEO' }, + [0x1168] = { unicodeslot=0x1168, category='lo', description='HANGUL JUNGSEONG YE' }, + [0x1169] = { unicodeslot=0x1169, category='lo', description='HANGUL JUNGSEONG O' }, + [0x116A] = { unicodeslot=0x116A, category='lo', description='HANGUL JUNGSEONG WA' }, + [0x116B] = { unicodeslot=0x116B, category='lo', description='HANGUL JUNGSEONG WAE' }, + [0x116C] = { unicodeslot=0x116C, category='lo', description='HANGUL JUNGSEONG OE' }, + [0x116D] = { unicodeslot=0x116D, category='lo', description='HANGUL JUNGSEONG YO' }, + [0x116E] = { unicodeslot=0x116E, category='lo', description='HANGUL JUNGSEONG U' }, + [0x116F] = { unicodeslot=0x116F, category='lo', description='HANGUL JUNGSEONG WEO' }, + [0x1170] = { unicodeslot=0x1170, category='lo', description='HANGUL JUNGSEONG WE' }, + [0x1171] = { unicodeslot=0x1171, category='lo', description='HANGUL JUNGSEONG WI' }, + [0x1172] = { unicodeslot=0x1172, category='lo', description='HANGUL JUNGSEONG YU' }, + [0x1173] = { unicodeslot=0x1173, category='lo', description='HANGUL JUNGSEONG EU' }, + [0x1174] = { unicodeslot=0x1174, category='lo', description='HANGUL JUNGSEONG YI' }, + [0x1175] = { unicodeslot=0x1175, category='lo', description='HANGUL JUNGSEONG I' }, + [0x1176] = { unicodeslot=0x1176, category='lo', description='HANGUL JUNGSEONG A-O' }, + [0x1177] = { unicodeslot=0x1177, category='lo', description='HANGUL JUNGSEONG A-U' }, + [0x1178] = { unicodeslot=0x1178, category='lo', description='HANGUL JUNGSEONG YA-O' }, + [0x1179] = { unicodeslot=0x1179, category='lo', description='HANGUL JUNGSEONG YA-YO' }, + [0x117A] = { unicodeslot=0x117A, category='lo', description='HANGUL JUNGSEONG EO-O' }, + [0x117B] = { unicodeslot=0x117B, category='lo', description='HANGUL JUNGSEONG EO-U' }, + [0x117C] = { unicodeslot=0x117C, category='lo', description='HANGUL JUNGSEONG EO-EU' }, + [0x117D] = { unicodeslot=0x117D, category='lo', description='HANGUL JUNGSEONG YEO-O' }, + [0x117E] = { unicodeslot=0x117E, category='lo', description='HANGUL JUNGSEONG YEO-U' }, + [0x117F] = { unicodeslot=0x117F, category='lo', description='HANGUL JUNGSEONG O-EO' }, + [0x1180] = { unicodeslot=0x1180, category='lo', description='HANGUL JUNGSEONG O-E' }, + [0x1181] = { unicodeslot=0x1181, category='lo', description='HANGUL JUNGSEONG O-YE' }, + [0x1182] = { unicodeslot=0x1182, category='lo', description='HANGUL JUNGSEONG O-O' }, + [0x1183] = { unicodeslot=0x1183, category='lo', description='HANGUL JUNGSEONG O-U' }, + [0x1184] = { unicodeslot=0x1184, category='lo', description='HANGUL JUNGSEONG YO-YA' }, + [0x1185] = { unicodeslot=0x1185, category='lo', description='HANGUL JUNGSEONG YO-YAE' }, + [0x1186] = { unicodeslot=0x1186, category='lo', description='HANGUL JUNGSEONG YO-YEO' }, + [0x1187] = { unicodeslot=0x1187, category='lo', description='HANGUL JUNGSEONG YO-O' }, + [0x1188] = { unicodeslot=0x1188, category='lo', description='HANGUL JUNGSEONG YO-I' }, + [0x1189] = { unicodeslot=0x1189, category='lo', description='HANGUL JUNGSEONG U-A' }, + [0x118A] = { unicodeslot=0x118A, category='lo', description='HANGUL JUNGSEONG U-AE' }, + [0x118B] = { unicodeslot=0x118B, category='lo', description='HANGUL JUNGSEONG U-EO-EU' }, + [0x118C] = { unicodeslot=0x118C, category='lo', description='HANGUL JUNGSEONG U-YE' }, + [0x118D] = { unicodeslot=0x118D, category='lo', description='HANGUL JUNGSEONG U-U' }, + [0x118E] = { unicodeslot=0x118E, category='lo', description='HANGUL JUNGSEONG YU-A' }, + [0x118F] = { unicodeslot=0x118F, category='lo', description='HANGUL JUNGSEONG YU-EO' }, + [0x1190] = { unicodeslot=0x1190, category='lo', description='HANGUL JUNGSEONG YU-E' }, + [0x1191] = { unicodeslot=0x1191, category='lo', description='HANGUL JUNGSEONG YU-YEO' }, + [0x1192] = { unicodeslot=0x1192, category='lo', description='HANGUL JUNGSEONG YU-YE' }, + [0x1193] = { unicodeslot=0x1193, category='lo', description='HANGUL JUNGSEONG YU-U' }, + [0x1194] = { unicodeslot=0x1194, category='lo', description='HANGUL JUNGSEONG YU-I' }, + [0x1195] = { unicodeslot=0x1195, category='lo', description='HANGUL JUNGSEONG EU-U' }, + [0x1196] = { unicodeslot=0x1196, category='lo', description='HANGUL JUNGSEONG EU-EU' }, + [0x1197] = { unicodeslot=0x1197, category='lo', description='HANGUL JUNGSEONG YI-U' }, + [0x1198] = { unicodeslot=0x1198, category='lo', description='HANGUL JUNGSEONG I-A' }, + [0x1199] = { unicodeslot=0x1199, category='lo', description='HANGUL JUNGSEONG I-YA' }, + [0x119A] = { unicodeslot=0x119A, category='lo', description='HANGUL JUNGSEONG I-O' }, + [0x119B] = { unicodeslot=0x119B, category='lo', description='HANGUL JUNGSEONG I-U' }, + [0x119C] = { unicodeslot=0x119C, category='lo', description='HANGUL JUNGSEONG I-EU' }, + [0x119D] = { unicodeslot=0x119D, category='lo', description='HANGUL JUNGSEONG I-ARAEA' }, + [0x119E] = { unicodeslot=0x119E, category='lo', description='HANGUL JUNGSEONG ARAEA' }, + [0x119F] = { unicodeslot=0x119F, category='lo', description='HANGUL JUNGSEONG ARAEA-EO' }, + [0x11A0] = { unicodeslot=0x11A0, category='lo', description='HANGUL JUNGSEONG ARAEA-U' }, + [0x11A1] = { unicodeslot=0x11A1, category='lo', description='HANGUL JUNGSEONG ARAEA-I' }, + [0x11A2] = { unicodeslot=0x11A2, category='lo', description='HANGUL JUNGSEONG SSANGARAEA' }, + [0x11A8] = { unicodeslot=0x11A8, category='lo', description='HANGUL JONGSEONG KIYEOK' }, + [0x11A9] = { unicodeslot=0x11A9, category='lo', description='HANGUL JONGSEONG SSANGKIYEOK' }, + [0x11AA] = { unicodeslot=0x11AA, category='lo', description='HANGUL JONGSEONG KIYEOK-SIOS' }, + [0x11AB] = { unicodeslot=0x11AB, category='lo', description='HANGUL JONGSEONG NIEUN' }, + [0x11AC] = { unicodeslot=0x11AC, category='lo', description='HANGUL JONGSEONG NIEUN-CIEUC' }, + [0x11AD] = { unicodeslot=0x11AD, category='lo', description='HANGUL JONGSEONG NIEUN-HIEUH' }, + [0x11AE] = { unicodeslot=0x11AE, category='lo', description='HANGUL JONGSEONG TIKEUT' }, + [0x11AF] = { unicodeslot=0x11AF, category='lo', description='HANGUL JONGSEONG RIEUL' }, + [0x11B0] = { unicodeslot=0x11B0, category='lo', description='HANGUL JONGSEONG RIEUL-KIYEOK' }, + [0x11B1] = { unicodeslot=0x11B1, category='lo', description='HANGUL JONGSEONG RIEUL-MIEUM' }, + [0x11B2] = { unicodeslot=0x11B2, category='lo', description='HANGUL JONGSEONG RIEUL-PIEUP' }, + [0x11B3] = { unicodeslot=0x11B3, category='lo', description='HANGUL JONGSEONG RIEUL-SIOS' }, + [0x11B4] = { unicodeslot=0x11B4, category='lo', description='HANGUL JONGSEONG RIEUL-THIEUTH' }, + [0x11B5] = { unicodeslot=0x11B5, category='lo', description='HANGUL JONGSEONG RIEUL-PHIEUPH' }, + [0x11B6] = { unicodeslot=0x11B6, category='lo', description='HANGUL JONGSEONG RIEUL-HIEUH' }, + [0x11B7] = { unicodeslot=0x11B7, category='lo', description='HANGUL JONGSEONG MIEUM' }, + [0x11B8] = { unicodeslot=0x11B8, category='lo', description='HANGUL JONGSEONG PIEUP' }, + [0x11B9] = { unicodeslot=0x11B9, category='lo', description='HANGUL JONGSEONG PIEUP-SIOS' }, + [0x11BA] = { unicodeslot=0x11BA, category='lo', description='HANGUL JONGSEONG SIOS' }, + [0x11BB] = { unicodeslot=0x11BB, category='lo', description='HANGUL JONGSEONG SSANGSIOS' }, + [0x11BC] = { unicodeslot=0x11BC, category='lo', description='HANGUL JONGSEONG IEUNG' }, + [0x11BD] = { unicodeslot=0x11BD, category='lo', description='HANGUL JONGSEONG CIEUC' }, + [0x11BE] = { unicodeslot=0x11BE, category='lo', description='HANGUL JONGSEONG CHIEUCH' }, + [0x11BF] = { unicodeslot=0x11BF, category='lo', description='HANGUL JONGSEONG KHIEUKH' }, + [0x11C0] = { unicodeslot=0x11C0, category='lo', description='HANGUL JONGSEONG THIEUTH' }, + [0x11C1] = { unicodeslot=0x11C1, category='lo', description='HANGUL JONGSEONG PHIEUPH' }, + [0x11C2] = { unicodeslot=0x11C2, category='lo', description='HANGUL JONGSEONG HIEUH' }, + [0x11C3] = { unicodeslot=0x11C3, category='lo', description='HANGUL JONGSEONG KIYEOK-RIEUL' }, + [0x11C4] = { unicodeslot=0x11C4, category='lo', description='HANGUL JONGSEONG KIYEOK-SIOS-KIYEOK' }, + [0x11C5] = { unicodeslot=0x11C5, category='lo', description='HANGUL JONGSEONG NIEUN-KIYEOK' }, + [0x11C6] = { unicodeslot=0x11C6, category='lo', description='HANGUL JONGSEONG NIEUN-TIKEUT' }, + [0x11C7] = { unicodeslot=0x11C7, category='lo', description='HANGUL JONGSEONG NIEUN-SIOS' }, + [0x11C8] = { unicodeslot=0x11C8, category='lo', description='HANGUL JONGSEONG NIEUN-PANSIOS' }, + [0x11C9] = { unicodeslot=0x11C9, category='lo', description='HANGUL JONGSEONG NIEUN-THIEUTH' }, + [0x11CA] = { unicodeslot=0x11CA, category='lo', description='HANGUL JONGSEONG TIKEUT-KIYEOK' }, + [0x11CB] = { unicodeslot=0x11CB, category='lo', description='HANGUL JONGSEONG TIKEUT-RIEUL' }, + [0x11CC] = { unicodeslot=0x11CC, category='lo', description='HANGUL JONGSEONG RIEUL-KIYEOK-SIOS' }, + [0x11CD] = { unicodeslot=0x11CD, category='lo', description='HANGUL JONGSEONG RIEUL-NIEUN' }, + [0x11CE] = { unicodeslot=0x11CE, category='lo', description='HANGUL JONGSEONG RIEUL-TIKEUT' }, + [0x11CF] = { unicodeslot=0x11CF, category='lo', description='HANGUL JONGSEONG RIEUL-TIKEUT-HIEUH' }, + [0x11D0] = { unicodeslot=0x11D0, category='lo', description='HANGUL JONGSEONG SSANGRIEUL' }, + [0x11D1] = { unicodeslot=0x11D1, category='lo', description='HANGUL JONGSEONG RIEUL-MIEUM-KIYEOK' }, + [0x11D2] = { unicodeslot=0x11D2, category='lo', description='HANGUL JONGSEONG RIEUL-MIEUM-SIOS' }, + [0x11D3] = { unicodeslot=0x11D3, category='lo', description='HANGUL JONGSEONG RIEUL-PIEUP-SIOS' }, + [0x11D4] = { unicodeslot=0x11D4, category='lo', description='HANGUL JONGSEONG RIEUL-PIEUP-HIEUH' }, + [0x11D5] = { unicodeslot=0x11D5, category='lo', description='HANGUL JONGSEONG RIEUL-KAPYEOUNPIEUP' }, + [0x11D6] = { unicodeslot=0x11D6, category='lo', description='HANGUL JONGSEONG RIEUL-SSANGSIOS' }, + [0x11D7] = { unicodeslot=0x11D7, category='lo', description='HANGUL JONGSEONG RIEUL-PANSIOS' }, + [0x11D8] = { unicodeslot=0x11D8, category='lo', description='HANGUL JONGSEONG RIEUL-KHIEUKH' }, + [0x11D9] = { unicodeslot=0x11D9, category='lo', description='HANGUL JONGSEONG RIEUL-YEORINHIEUH' }, + [0x11DA] = { unicodeslot=0x11DA, category='lo', description='HANGUL JONGSEONG MIEUM-KIYEOK' }, + [0x11DB] = { unicodeslot=0x11DB, category='lo', description='HANGUL JONGSEONG MIEUM-RIEUL' }, + [0x11DC] = { unicodeslot=0x11DC, category='lo', description='HANGUL JONGSEONG MIEUM-PIEUP' }, + [0x11DD] = { unicodeslot=0x11DD, category='lo', description='HANGUL JONGSEONG MIEUM-SIOS' }, + [0x11DE] = { unicodeslot=0x11DE, category='lo', description='HANGUL JONGSEONG MIEUM-SSANGSIOS' }, + [0x11DF] = { unicodeslot=0x11DF, category='lo', description='HANGUL JONGSEONG MIEUM-PANSIOS' }, + [0x11E0] = { unicodeslot=0x11E0, category='lo', description='HANGUL JONGSEONG MIEUM-CHIEUCH' }, + [0x11E1] = { unicodeslot=0x11E1, category='lo', description='HANGUL JONGSEONG MIEUM-HIEUH' }, + [0x11E2] = { unicodeslot=0x11E2, category='lo', description='HANGUL JONGSEONG KAPYEOUNMIEUM' }, + [0x11E3] = { unicodeslot=0x11E3, category='lo', description='HANGUL JONGSEONG PIEUP-RIEUL' }, + [0x11E4] = { unicodeslot=0x11E4, category='lo', description='HANGUL JONGSEONG PIEUP-PHIEUPH' }, + [0x11E5] = { unicodeslot=0x11E5, category='lo', description='HANGUL JONGSEONG PIEUP-HIEUH' }, + [0x11E6] = { unicodeslot=0x11E6, category='lo', description='HANGUL JONGSEONG KAPYEOUNPIEUP' }, + [0x11E7] = { unicodeslot=0x11E7, category='lo', description='HANGUL JONGSEONG SIOS-KIYEOK' }, + [0x11E8] = { unicodeslot=0x11E8, category='lo', description='HANGUL JONGSEONG SIOS-TIKEUT' }, + [0x11E9] = { unicodeslot=0x11E9, category='lo', description='HANGUL JONGSEONG SIOS-RIEUL' }, + [0x11EA] = { unicodeslot=0x11EA, category='lo', description='HANGUL JONGSEONG SIOS-PIEUP' }, + [0x11EB] = { unicodeslot=0x11EB, category='lo', description='HANGUL JONGSEONG PANSIOS' }, + [0x11EC] = { unicodeslot=0x11EC, category='lo', description='HANGUL JONGSEONG IEUNG-KIYEOK' }, + [0x11ED] = { unicodeslot=0x11ED, category='lo', description='HANGUL JONGSEONG IEUNG-SSANGKIYEOK' }, + [0x11EE] = { unicodeslot=0x11EE, category='lo', description='HANGUL JONGSEONG SSANGIEUNG' }, + [0x11EF] = { unicodeslot=0x11EF, category='lo', description='HANGUL JONGSEONG IEUNG-KHIEUKH' }, + [0x11F0] = { unicodeslot=0x11F0, category='lo', description='HANGUL JONGSEONG YESIEUNG' }, + [0x11F1] = { unicodeslot=0x11F1, category='lo', description='HANGUL JONGSEONG YESIEUNG-SIOS' }, + [0x11F2] = { unicodeslot=0x11F2, category='lo', description='HANGUL JONGSEONG YESIEUNG-PANSIOS' }, + [0x11F3] = { unicodeslot=0x11F3, category='lo', description='HANGUL JONGSEONG PHIEUPH-PIEUP' }, + [0x11F4] = { unicodeslot=0x11F4, category='lo', description='HANGUL JONGSEONG KAPYEOUNPHIEUPH' }, + [0x11F5] = { unicodeslot=0x11F5, category='lo', description='HANGUL JONGSEONG HIEUH-NIEUN' }, + [0x11F6] = { unicodeslot=0x11F6, category='lo', description='HANGUL JONGSEONG HIEUH-RIEUL' }, + [0x11F7] = { unicodeslot=0x11F7, category='lo', description='HANGUL JONGSEONG HIEUH-MIEUM' }, + [0x11F8] = { unicodeslot=0x11F8, category='lo', description='HANGUL JONGSEONG HIEUH-PIEUP' }, + [0x11F9] = { unicodeslot=0x11F9, category='lo', description='HANGUL JONGSEONG YEORINHIEUH' }, + [0x1200] = { unicodeslot=0x1200, category='lo', description='ETHIOPIC SYLLABLE HA' }, + [0x1201] = { unicodeslot=0x1201, category='lo', description='ETHIOPIC SYLLABLE HU' }, + [0x1202] = { unicodeslot=0x1202, category='lo', description='ETHIOPIC SYLLABLE HI' }, + [0x1203] = { unicodeslot=0x1203, category='lo', description='ETHIOPIC SYLLABLE HAA' }, + [0x1204] = { unicodeslot=0x1204, category='lo', description='ETHIOPIC SYLLABLE HEE' }, + [0x1205] = { unicodeslot=0x1205, category='lo', description='ETHIOPIC SYLLABLE HE' }, + [0x1206] = { unicodeslot=0x1206, category='lo', description='ETHIOPIC SYLLABLE HO' }, + [0x1207] = { unicodeslot=0x1207, category='lo', description='ETHIOPIC SYLLABLE HOA' }, + [0x1208] = { unicodeslot=0x1208, category='lo', description='ETHIOPIC SYLLABLE LA' }, + [0x1209] = { unicodeslot=0x1209, category='lo', description='ETHIOPIC SYLLABLE LU' }, + [0x120A] = { unicodeslot=0x120A, category='lo', description='ETHIOPIC SYLLABLE LI' }, + [0x120B] = { unicodeslot=0x120B, category='lo', description='ETHIOPIC SYLLABLE LAA' }, + [0x120C] = { unicodeslot=0x120C, category='lo', description='ETHIOPIC SYLLABLE LEE' }, + [0x120D] = { unicodeslot=0x120D, category='lo', description='ETHIOPIC SYLLABLE LE' }, + [0x120E] = { unicodeslot=0x120E, category='lo', description='ETHIOPIC SYLLABLE LO' }, + [0x120F] = { unicodeslot=0x120F, category='lo', description='ETHIOPIC SYLLABLE LWA' }, + [0x1210] = { unicodeslot=0x1210, category='lo', description='ETHIOPIC SYLLABLE HHA' }, + [0x1211] = { unicodeslot=0x1211, category='lo', description='ETHIOPIC SYLLABLE HHU' }, + [0x1212] = { unicodeslot=0x1212, category='lo', description='ETHIOPIC SYLLABLE HHI' }, + [0x1213] = { unicodeslot=0x1213, category='lo', description='ETHIOPIC SYLLABLE HHAA' }, + [0x1214] = { unicodeslot=0x1214, category='lo', description='ETHIOPIC SYLLABLE HHEE' }, + [0x1215] = { unicodeslot=0x1215, category='lo', description='ETHIOPIC SYLLABLE HHE' }, + [0x1216] = { unicodeslot=0x1216, category='lo', description='ETHIOPIC SYLLABLE HHO' }, + [0x1217] = { unicodeslot=0x1217, category='lo', description='ETHIOPIC SYLLABLE HHWA' }, + [0x1218] = { unicodeslot=0x1218, category='lo', description='ETHIOPIC SYLLABLE MA' }, + [0x1219] = { unicodeslot=0x1219, category='lo', description='ETHIOPIC SYLLABLE MU' }, + [0x121A] = { unicodeslot=0x121A, category='lo', description='ETHIOPIC SYLLABLE MI' }, + [0x121B] = { unicodeslot=0x121B, category='lo', description='ETHIOPIC SYLLABLE MAA' }, + [0x121C] = { unicodeslot=0x121C, category='lo', description='ETHIOPIC SYLLABLE MEE' }, + [0x121D] = { unicodeslot=0x121D, category='lo', description='ETHIOPIC SYLLABLE ME' }, + [0x121E] = { unicodeslot=0x121E, category='lo', description='ETHIOPIC SYLLABLE MO' }, + [0x121F] = { unicodeslot=0x121F, category='lo', description='ETHIOPIC SYLLABLE MWA' }, + [0x1220] = { unicodeslot=0x1220, category='lo', description='ETHIOPIC SYLLABLE SZA' }, + [0x1221] = { unicodeslot=0x1221, category='lo', description='ETHIOPIC SYLLABLE SZU' }, + [0x1222] = { unicodeslot=0x1222, category='lo', description='ETHIOPIC SYLLABLE SZI' }, + [0x1223] = { unicodeslot=0x1223, category='lo', description='ETHIOPIC SYLLABLE SZAA' }, + [0x1224] = { unicodeslot=0x1224, category='lo', description='ETHIOPIC SYLLABLE SZEE' }, + [0x1225] = { unicodeslot=0x1225, category='lo', description='ETHIOPIC SYLLABLE SZE' }, + [0x1226] = { unicodeslot=0x1226, category='lo', description='ETHIOPIC SYLLABLE SZO' }, + [0x1227] = { unicodeslot=0x1227, category='lo', description='ETHIOPIC SYLLABLE SZWA' }, + [0x1228] = { unicodeslot=0x1228, category='lo', description='ETHIOPIC SYLLABLE RA' }, + [0x1229] = { unicodeslot=0x1229, category='lo', description='ETHIOPIC SYLLABLE RU' }, + [0x122A] = { unicodeslot=0x122A, category='lo', description='ETHIOPIC SYLLABLE RI' }, + [0x122B] = { unicodeslot=0x122B, category='lo', description='ETHIOPIC SYLLABLE RAA' }, + [0x122C] = { unicodeslot=0x122C, category='lo', description='ETHIOPIC SYLLABLE REE' }, + [0x122D] = { unicodeslot=0x122D, category='lo', description='ETHIOPIC SYLLABLE RE' }, + [0x122E] = { unicodeslot=0x122E, category='lo', description='ETHIOPIC SYLLABLE RO' }, + [0x122F] = { unicodeslot=0x122F, category='lo', description='ETHIOPIC SYLLABLE RWA' }, + [0x1230] = { unicodeslot=0x1230, category='lo', description='ETHIOPIC SYLLABLE SA' }, + [0x1231] = { unicodeslot=0x1231, category='lo', description='ETHIOPIC SYLLABLE SU' }, + [0x1232] = { unicodeslot=0x1232, category='lo', description='ETHIOPIC SYLLABLE SI' }, + [0x1233] = { unicodeslot=0x1233, category='lo', description='ETHIOPIC SYLLABLE SAA' }, + [0x1234] = { unicodeslot=0x1234, category='lo', description='ETHIOPIC SYLLABLE SEE' }, + [0x1235] = { unicodeslot=0x1235, category='lo', description='ETHIOPIC SYLLABLE SE' }, + [0x1236] = { unicodeslot=0x1236, category='lo', description='ETHIOPIC SYLLABLE SO' }, + [0x1237] = { unicodeslot=0x1237, category='lo', description='ETHIOPIC SYLLABLE SWA' }, + [0x1238] = { unicodeslot=0x1238, category='lo', description='ETHIOPIC SYLLABLE SHA' }, + [0x1239] = { unicodeslot=0x1239, category='lo', description='ETHIOPIC SYLLABLE SHU' }, + [0x123A] = { unicodeslot=0x123A, category='lo', description='ETHIOPIC SYLLABLE SHI' }, + [0x123B] = { unicodeslot=0x123B, category='lo', description='ETHIOPIC SYLLABLE SHAA' }, + [0x123C] = { unicodeslot=0x123C, category='lo', description='ETHIOPIC SYLLABLE SHEE' }, + [0x123D] = { unicodeslot=0x123D, category='lo', description='ETHIOPIC SYLLABLE SHE' }, + [0x123E] = { unicodeslot=0x123E, category='lo', description='ETHIOPIC SYLLABLE SHO' }, + [0x123F] = { unicodeslot=0x123F, category='lo', description='ETHIOPIC SYLLABLE SHWA' }, + [0x1240] = { unicodeslot=0x1240, category='lo', description='ETHIOPIC SYLLABLE QA' }, + [0x1241] = { unicodeslot=0x1241, category='lo', description='ETHIOPIC SYLLABLE QU' }, + [0x1242] = { unicodeslot=0x1242, category='lo', description='ETHIOPIC SYLLABLE QI' }, + [0x1243] = { unicodeslot=0x1243, category='lo', description='ETHIOPIC SYLLABLE QAA' }, + [0x1244] = { unicodeslot=0x1244, category='lo', description='ETHIOPIC SYLLABLE QEE' }, + [0x1245] = { unicodeslot=0x1245, category='lo', description='ETHIOPIC SYLLABLE QE' }, + [0x1246] = { unicodeslot=0x1246, category='lo', description='ETHIOPIC SYLLABLE QO' }, + [0x1247] = { unicodeslot=0x1247, category='lo', description='ETHIOPIC SYLLABLE QOA' }, + [0x1248] = { unicodeslot=0x1248, category='lo', description='ETHIOPIC SYLLABLE QWA' }, + [0x124A] = { unicodeslot=0x124A, category='lo', description='ETHIOPIC SYLLABLE QWI' }, + [0x124B] = { unicodeslot=0x124B, category='lo', description='ETHIOPIC SYLLABLE QWAA' }, + [0x124C] = { unicodeslot=0x124C, category='lo', description='ETHIOPIC SYLLABLE QWEE' }, + [0x124D] = { unicodeslot=0x124D, category='lo', description='ETHIOPIC SYLLABLE QWE' }, + [0x1250] = { unicodeslot=0x1250, category='lo', description='ETHIOPIC SYLLABLE QHA' }, + [0x1251] = { unicodeslot=0x1251, category='lo', description='ETHIOPIC SYLLABLE QHU' }, + [0x1252] = { unicodeslot=0x1252, category='lo', description='ETHIOPIC SYLLABLE QHI' }, + [0x1253] = { unicodeslot=0x1253, category='lo', description='ETHIOPIC SYLLABLE QHAA' }, + [0x1254] = { unicodeslot=0x1254, category='lo', description='ETHIOPIC SYLLABLE QHEE' }, + [0x1255] = { unicodeslot=0x1255, category='lo', description='ETHIOPIC SYLLABLE QHE' }, + [0x1256] = { unicodeslot=0x1256, category='lo', description='ETHIOPIC SYLLABLE QHO' }, + [0x1258] = { unicodeslot=0x1258, category='lo', description='ETHIOPIC SYLLABLE QHWA' }, + [0x125A] = { unicodeslot=0x125A, category='lo', description='ETHIOPIC SYLLABLE QHWI' }, + [0x125B] = { unicodeslot=0x125B, category='lo', description='ETHIOPIC SYLLABLE QHWAA' }, + [0x125C] = { unicodeslot=0x125C, category='lo', description='ETHIOPIC SYLLABLE QHWEE' }, + [0x125D] = { unicodeslot=0x125D, category='lo', description='ETHIOPIC SYLLABLE QHWE' }, + [0x1260] = { unicodeslot=0x1260, category='lo', description='ETHIOPIC SYLLABLE BA' }, + [0x1261] = { unicodeslot=0x1261, category='lo', description='ETHIOPIC SYLLABLE BU' }, + [0x1262] = { unicodeslot=0x1262, category='lo', description='ETHIOPIC SYLLABLE BI' }, + [0x1263] = { unicodeslot=0x1263, category='lo', description='ETHIOPIC SYLLABLE BAA' }, + [0x1264] = { unicodeslot=0x1264, category='lo', description='ETHIOPIC SYLLABLE BEE' }, + [0x1265] = { unicodeslot=0x1265, category='lo', description='ETHIOPIC SYLLABLE BE' }, + [0x1266] = { unicodeslot=0x1266, category='lo', description='ETHIOPIC SYLLABLE BO' }, + [0x1267] = { unicodeslot=0x1267, category='lo', description='ETHIOPIC SYLLABLE BWA' }, + [0x1268] = { unicodeslot=0x1268, category='lo', description='ETHIOPIC SYLLABLE VA' }, + [0x1269] = { unicodeslot=0x1269, category='lo', description='ETHIOPIC SYLLABLE VU' }, + [0x126A] = { unicodeslot=0x126A, category='lo', description='ETHIOPIC SYLLABLE VI' }, + [0x126B] = { unicodeslot=0x126B, category='lo', description='ETHIOPIC SYLLABLE VAA' }, + [0x126C] = { unicodeslot=0x126C, category='lo', description='ETHIOPIC SYLLABLE VEE' }, + [0x126D] = { unicodeslot=0x126D, category='lo', description='ETHIOPIC SYLLABLE VE' }, + [0x126E] = { unicodeslot=0x126E, category='lo', description='ETHIOPIC SYLLABLE VO' }, + [0x126F] = { unicodeslot=0x126F, category='lo', description='ETHIOPIC SYLLABLE VWA' }, + [0x1270] = { unicodeslot=0x1270, category='lo', description='ETHIOPIC SYLLABLE TA' }, + [0x1271] = { unicodeslot=0x1271, category='lo', description='ETHIOPIC SYLLABLE TU' }, + [0x1272] = { unicodeslot=0x1272, category='lo', description='ETHIOPIC SYLLABLE TI' }, + [0x1273] = { unicodeslot=0x1273, category='lo', description='ETHIOPIC SYLLABLE TAA' }, + [0x1274] = { unicodeslot=0x1274, category='lo', description='ETHIOPIC SYLLABLE TEE' }, + [0x1275] = { unicodeslot=0x1275, category='lo', description='ETHIOPIC SYLLABLE TE' }, + [0x1276] = { unicodeslot=0x1276, category='lo', description='ETHIOPIC SYLLABLE TO' }, + [0x1277] = { unicodeslot=0x1277, category='lo', description='ETHIOPIC SYLLABLE TWA' }, + [0x1278] = { unicodeslot=0x1278, category='lo', description='ETHIOPIC SYLLABLE CA' }, + [0x1279] = { unicodeslot=0x1279, category='lo', description='ETHIOPIC SYLLABLE CU' }, + [0x127A] = { unicodeslot=0x127A, category='lo', description='ETHIOPIC SYLLABLE CI' }, + [0x127B] = { unicodeslot=0x127B, category='lo', description='ETHIOPIC SYLLABLE CAA' }, + [0x127C] = { unicodeslot=0x127C, category='lo', description='ETHIOPIC SYLLABLE CEE' }, + [0x127D] = { unicodeslot=0x127D, category='lo', description='ETHIOPIC SYLLABLE CE' }, + [0x127E] = { unicodeslot=0x127E, category='lo', description='ETHIOPIC SYLLABLE CO' }, + [0x127F] = { unicodeslot=0x127F, category='lo', description='ETHIOPIC SYLLABLE CWA' }, + [0x1280] = { unicodeslot=0x1280, category='lo', description='ETHIOPIC SYLLABLE XA' }, + [0x1281] = { unicodeslot=0x1281, category='lo', description='ETHIOPIC SYLLABLE XU' }, + [0x1282] = { unicodeslot=0x1282, category='lo', description='ETHIOPIC SYLLABLE XI' }, + [0x1283] = { unicodeslot=0x1283, category='lo', description='ETHIOPIC SYLLABLE XAA' }, + [0x1284] = { unicodeslot=0x1284, category='lo', description='ETHIOPIC SYLLABLE XEE' }, + [0x1285] = { unicodeslot=0x1285, category='lo', description='ETHIOPIC SYLLABLE XE' }, + [0x1286] = { unicodeslot=0x1286, category='lo', description='ETHIOPIC SYLLABLE XO' }, + [0x1287] = { unicodeslot=0x1287, category='lo', description='ETHIOPIC SYLLABLE XOA' }, + [0x1288] = { unicodeslot=0x1288, category='lo', description='ETHIOPIC SYLLABLE XWA' }, + [0x128A] = { unicodeslot=0x128A, category='lo', description='ETHIOPIC SYLLABLE XWI' }, + [0x128B] = { unicodeslot=0x128B, category='lo', description='ETHIOPIC SYLLABLE XWAA' }, + [0x128C] = { unicodeslot=0x128C, category='lo', description='ETHIOPIC SYLLABLE XWEE' }, + [0x128D] = { unicodeslot=0x128D, category='lo', description='ETHIOPIC SYLLABLE XWE' }, + [0x1290] = { unicodeslot=0x1290, category='lo', description='ETHIOPIC SYLLABLE NA' }, + [0x1291] = { unicodeslot=0x1291, category='lo', description='ETHIOPIC SYLLABLE NU' }, + [0x1292] = { unicodeslot=0x1292, category='lo', description='ETHIOPIC SYLLABLE NI' }, + [0x1293] = { unicodeslot=0x1293, category='lo', description='ETHIOPIC SYLLABLE NAA' }, + [0x1294] = { unicodeslot=0x1294, category='lo', description='ETHIOPIC SYLLABLE NEE' }, + [0x1295] = { unicodeslot=0x1295, category='lo', description='ETHIOPIC SYLLABLE NE' }, + [0x1296] = { unicodeslot=0x1296, category='lo', description='ETHIOPIC SYLLABLE NO' }, + [0x1297] = { unicodeslot=0x1297, category='lo', description='ETHIOPIC SYLLABLE NWA' }, + [0x1298] = { unicodeslot=0x1298, category='lo', description='ETHIOPIC SYLLABLE NYA' }, + [0x1299] = { unicodeslot=0x1299, category='lo', description='ETHIOPIC SYLLABLE NYU' }, + [0x129A] = { unicodeslot=0x129A, category='lo', description='ETHIOPIC SYLLABLE NYI' }, + [0x129B] = { unicodeslot=0x129B, category='lo', description='ETHIOPIC SYLLABLE NYAA' }, + [0x129C] = { unicodeslot=0x129C, category='lo', description='ETHIOPIC SYLLABLE NYEE' }, + [0x129D] = { unicodeslot=0x129D, category='lo', description='ETHIOPIC SYLLABLE NYE' }, + [0x129E] = { unicodeslot=0x129E, category='lo', description='ETHIOPIC SYLLABLE NYO' }, + [0x129F] = { unicodeslot=0x129F, category='lo', description='ETHIOPIC SYLLABLE NYWA' }, + [0x12A0] = { unicodeslot=0x12A0, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL A' }, + [0x12A1] = { unicodeslot=0x12A1, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL U' }, + [0x12A2] = { unicodeslot=0x12A2, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL I' }, + [0x12A3] = { unicodeslot=0x12A3, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL AA' }, + [0x12A4] = { unicodeslot=0x12A4, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL EE' }, + [0x12A5] = { unicodeslot=0x12A5, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL E' }, + [0x12A6] = { unicodeslot=0x12A6, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL O' }, + [0x12A7] = { unicodeslot=0x12A7, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL WA' }, + [0x12A8] = { unicodeslot=0x12A8, category='lo', description='ETHIOPIC SYLLABLE KA' }, + [0x12A9] = { unicodeslot=0x12A9, category='lo', description='ETHIOPIC SYLLABLE KU' }, + [0x12AA] = { unicodeslot=0x12AA, category='lo', description='ETHIOPIC SYLLABLE KI' }, + [0x12AB] = { unicodeslot=0x12AB, category='lo', description='ETHIOPIC SYLLABLE KAA' }, + [0x12AC] = { unicodeslot=0x12AC, category='lo', description='ETHIOPIC SYLLABLE KEE' }, + [0x12AD] = { unicodeslot=0x12AD, category='lo', description='ETHIOPIC SYLLABLE KE' }, + [0x12AE] = { unicodeslot=0x12AE, category='lo', description='ETHIOPIC SYLLABLE KO' }, + [0x12AF] = { unicodeslot=0x12AF, category='lo', description='ETHIOPIC SYLLABLE KOA' }, + [0x12B0] = { unicodeslot=0x12B0, category='lo', description='ETHIOPIC SYLLABLE KWA' }, + [0x12B2] = { unicodeslot=0x12B2, category='lo', description='ETHIOPIC SYLLABLE KWI' }, + [0x12B3] = { unicodeslot=0x12B3, category='lo', description='ETHIOPIC SYLLABLE KWAA' }, + [0x12B4] = { unicodeslot=0x12B4, category='lo', description='ETHIOPIC SYLLABLE KWEE' }, + [0x12B5] = { unicodeslot=0x12B5, category='lo', description='ETHIOPIC SYLLABLE KWE' }, + [0x12B8] = { unicodeslot=0x12B8, category='lo', description='ETHIOPIC SYLLABLE KXA' }, + [0x12B9] = { unicodeslot=0x12B9, category='lo', description='ETHIOPIC SYLLABLE KXU' }, + [0x12BA] = { unicodeslot=0x12BA, category='lo', description='ETHIOPIC SYLLABLE KXI' }, + [0x12BB] = { unicodeslot=0x12BB, category='lo', description='ETHIOPIC SYLLABLE KXAA' }, + [0x12BC] = { unicodeslot=0x12BC, category='lo', description='ETHIOPIC SYLLABLE KXEE' }, + [0x12BD] = { unicodeslot=0x12BD, category='lo', description='ETHIOPIC SYLLABLE KXE' }, + [0x12BE] = { unicodeslot=0x12BE, category='lo', description='ETHIOPIC SYLLABLE KXO' }, + [0x12C0] = { unicodeslot=0x12C0, category='lo', description='ETHIOPIC SYLLABLE KXWA' }, + [0x12C2] = { unicodeslot=0x12C2, category='lo', description='ETHIOPIC SYLLABLE KXWI' }, + [0x12C3] = { unicodeslot=0x12C3, category='lo', description='ETHIOPIC SYLLABLE KXWAA' }, + [0x12C4] = { unicodeslot=0x12C4, category='lo', description='ETHIOPIC SYLLABLE KXWEE' }, + [0x12C5] = { unicodeslot=0x12C5, category='lo', description='ETHIOPIC SYLLABLE KXWE' }, + [0x12C8] = { unicodeslot=0x12C8, category='lo', description='ETHIOPIC SYLLABLE WA' }, + [0x12C9] = { unicodeslot=0x12C9, category='lo', description='ETHIOPIC SYLLABLE WU' }, + [0x12CA] = { unicodeslot=0x12CA, category='lo', description='ETHIOPIC SYLLABLE WI' }, + [0x12CB] = { unicodeslot=0x12CB, category='lo', description='ETHIOPIC SYLLABLE WAA' }, + [0x12CC] = { unicodeslot=0x12CC, category='lo', description='ETHIOPIC SYLLABLE WEE' }, + [0x12CD] = { unicodeslot=0x12CD, category='lo', description='ETHIOPIC SYLLABLE WE' }, + [0x12CE] = { unicodeslot=0x12CE, category='lo', description='ETHIOPIC SYLLABLE WO' }, + [0x12CF] = { unicodeslot=0x12CF, category='lo', description='ETHIOPIC SYLLABLE WOA' }, + [0x12D0] = { unicodeslot=0x12D0, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL A' }, + [0x12D1] = { unicodeslot=0x12D1, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL U' }, + [0x12D2] = { unicodeslot=0x12D2, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL I' }, + [0x12D3] = { unicodeslot=0x12D3, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL AA' }, + [0x12D4] = { unicodeslot=0x12D4, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL EE' }, + [0x12D5] = { unicodeslot=0x12D5, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL E' }, + [0x12D6] = { unicodeslot=0x12D6, category='lo', description='ETHIOPIC SYLLABLE PHARYNGEAL O' }, + [0x12D8] = { unicodeslot=0x12D8, category='lo', description='ETHIOPIC SYLLABLE ZA' }, + [0x12D9] = { unicodeslot=0x12D9, category='lo', description='ETHIOPIC SYLLABLE ZU' }, + [0x12DA] = { unicodeslot=0x12DA, category='lo', description='ETHIOPIC SYLLABLE ZI' }, + [0x12DB] = { unicodeslot=0x12DB, category='lo', description='ETHIOPIC SYLLABLE ZAA' }, + [0x12DC] = { unicodeslot=0x12DC, category='lo', description='ETHIOPIC SYLLABLE ZEE' }, + [0x12DD] = { unicodeslot=0x12DD, category='lo', description='ETHIOPIC SYLLABLE ZE' }, + [0x12DE] = { unicodeslot=0x12DE, category='lo', description='ETHIOPIC SYLLABLE ZO' }, + [0x12DF] = { unicodeslot=0x12DF, category='lo', description='ETHIOPIC SYLLABLE ZWA' }, + [0x12E0] = { unicodeslot=0x12E0, category='lo', description='ETHIOPIC SYLLABLE ZHA' }, + [0x12E1] = { unicodeslot=0x12E1, category='lo', description='ETHIOPIC SYLLABLE ZHU' }, + [0x12E2] = { unicodeslot=0x12E2, category='lo', description='ETHIOPIC SYLLABLE ZHI' }, + [0x12E3] = { unicodeslot=0x12E3, category='lo', description='ETHIOPIC SYLLABLE ZHAA' }, + [0x12E4] = { unicodeslot=0x12E4, category='lo', description='ETHIOPIC SYLLABLE ZHEE' }, + [0x12E5] = { unicodeslot=0x12E5, category='lo', description='ETHIOPIC SYLLABLE ZHE' }, + [0x12E6] = { unicodeslot=0x12E6, category='lo', description='ETHIOPIC SYLLABLE ZHO' }, + [0x12E7] = { unicodeslot=0x12E7, category='lo', description='ETHIOPIC SYLLABLE ZHWA' }, + [0x12E8] = { unicodeslot=0x12E8, category='lo', description='ETHIOPIC SYLLABLE YA' }, + [0x12E9] = { unicodeslot=0x12E9, category='lo', description='ETHIOPIC SYLLABLE YU' }, + [0x12EA] = { unicodeslot=0x12EA, category='lo', description='ETHIOPIC SYLLABLE YI' }, + [0x12EB] = { unicodeslot=0x12EB, category='lo', description='ETHIOPIC SYLLABLE YAA' }, + [0x12EC] = { unicodeslot=0x12EC, category='lo', description='ETHIOPIC SYLLABLE YEE' }, + [0x12ED] = { unicodeslot=0x12ED, category='lo', description='ETHIOPIC SYLLABLE YE' }, + [0x12EE] = { unicodeslot=0x12EE, category='lo', description='ETHIOPIC SYLLABLE YO' }, + [0x12EF] = { unicodeslot=0x12EF, category='lo', description='ETHIOPIC SYLLABLE YOA' }, + [0x12F0] = { unicodeslot=0x12F0, category='lo', description='ETHIOPIC SYLLABLE DA' }, + [0x12F1] = { unicodeslot=0x12F1, category='lo', description='ETHIOPIC SYLLABLE DU' }, + [0x12F2] = { unicodeslot=0x12F2, category='lo', description='ETHIOPIC SYLLABLE DI' }, + [0x12F3] = { unicodeslot=0x12F3, category='lo', description='ETHIOPIC SYLLABLE DAA' }, + [0x12F4] = { unicodeslot=0x12F4, category='lo', description='ETHIOPIC SYLLABLE DEE' }, + [0x12F5] = { unicodeslot=0x12F5, category='lo', description='ETHIOPIC SYLLABLE DE' }, + [0x12F6] = { unicodeslot=0x12F6, category='lo', description='ETHIOPIC SYLLABLE DO' }, + [0x12F7] = { unicodeslot=0x12F7, category='lo', description='ETHIOPIC SYLLABLE DWA' }, + [0x12F8] = { unicodeslot=0x12F8, category='lo', description='ETHIOPIC SYLLABLE DDA' }, + [0x12F9] = { unicodeslot=0x12F9, category='lo', description='ETHIOPIC SYLLABLE DDU' }, + [0x12FA] = { unicodeslot=0x12FA, category='lo', description='ETHIOPIC SYLLABLE DDI' }, + [0x12FB] = { unicodeslot=0x12FB, category='lo', description='ETHIOPIC SYLLABLE DDAA' }, + [0x12FC] = { unicodeslot=0x12FC, category='lo', description='ETHIOPIC SYLLABLE DDEE' }, + [0x12FD] = { unicodeslot=0x12FD, category='lo', description='ETHIOPIC SYLLABLE DDE' }, + [0x12FE] = { unicodeslot=0x12FE, category='lo', description='ETHIOPIC SYLLABLE DDO' }, + [0x12FF] = { unicodeslot=0x12FF, category='lo', description='ETHIOPIC SYLLABLE DDWA' }, + [0x1300] = { unicodeslot=0x1300, category='lo', description='ETHIOPIC SYLLABLE JA' }, + [0x1301] = { unicodeslot=0x1301, category='lo', description='ETHIOPIC SYLLABLE JU' }, + [0x1302] = { unicodeslot=0x1302, category='lo', description='ETHIOPIC SYLLABLE JI' }, + [0x1303] = { unicodeslot=0x1303, category='lo', description='ETHIOPIC SYLLABLE JAA' }, + [0x1304] = { unicodeslot=0x1304, category='lo', description='ETHIOPIC SYLLABLE JEE' }, + [0x1305] = { unicodeslot=0x1305, category='lo', description='ETHIOPIC SYLLABLE JE' }, + [0x1306] = { unicodeslot=0x1306, category='lo', description='ETHIOPIC SYLLABLE JO' }, + [0x1307] = { unicodeslot=0x1307, category='lo', description='ETHIOPIC SYLLABLE JWA' }, + [0x1308] = { unicodeslot=0x1308, category='lo', description='ETHIOPIC SYLLABLE GA' }, + [0x1309] = { unicodeslot=0x1309, category='lo', description='ETHIOPIC SYLLABLE GU' }, + [0x130A] = { unicodeslot=0x130A, category='lo', description='ETHIOPIC SYLLABLE GI' }, + [0x130B] = { unicodeslot=0x130B, category='lo', description='ETHIOPIC SYLLABLE GAA' }, + [0x130C] = { unicodeslot=0x130C, category='lo', description='ETHIOPIC SYLLABLE GEE' }, + [0x130D] = { unicodeslot=0x130D, category='lo', description='ETHIOPIC SYLLABLE GE' }, + [0x130E] = { unicodeslot=0x130E, category='lo', description='ETHIOPIC SYLLABLE GO' }, + [0x130F] = { unicodeslot=0x130F, category='lo', description='ETHIOPIC SYLLABLE GOA' }, + [0x1310] = { unicodeslot=0x1310, category='lo', description='ETHIOPIC SYLLABLE GWA' }, + [0x1312] = { unicodeslot=0x1312, category='lo', description='ETHIOPIC SYLLABLE GWI' }, + [0x1313] = { unicodeslot=0x1313, category='lo', description='ETHIOPIC SYLLABLE GWAA' }, + [0x1314] = { unicodeslot=0x1314, category='lo', description='ETHIOPIC SYLLABLE GWEE' }, + [0x1315] = { unicodeslot=0x1315, category='lo', description='ETHIOPIC SYLLABLE GWE' }, + [0x1318] = { unicodeslot=0x1318, category='lo', description='ETHIOPIC SYLLABLE GGA' }, + [0x1319] = { unicodeslot=0x1319, category='lo', description='ETHIOPIC SYLLABLE GGU' }, + [0x131A] = { unicodeslot=0x131A, category='lo', description='ETHIOPIC SYLLABLE GGI' }, + [0x131B] = { unicodeslot=0x131B, category='lo', description='ETHIOPIC SYLLABLE GGAA' }, + [0x131C] = { unicodeslot=0x131C, category='lo', description='ETHIOPIC SYLLABLE GGEE' }, + [0x131D] = { unicodeslot=0x131D, category='lo', description='ETHIOPIC SYLLABLE GGE' }, + [0x131E] = { unicodeslot=0x131E, category='lo', description='ETHIOPIC SYLLABLE GGO' }, + [0x131F] = { unicodeslot=0x131F, category='lo', description='ETHIOPIC SYLLABLE GGWAA' }, + [0x1320] = { unicodeslot=0x1320, category='lo', description='ETHIOPIC SYLLABLE THA' }, + [0x1321] = { unicodeslot=0x1321, category='lo', description='ETHIOPIC SYLLABLE THU' }, + [0x1322] = { unicodeslot=0x1322, category='lo', description='ETHIOPIC SYLLABLE THI' }, + [0x1323] = { unicodeslot=0x1323, category='lo', description='ETHIOPIC SYLLABLE THAA' }, + [0x1324] = { unicodeslot=0x1324, category='lo', description='ETHIOPIC SYLLABLE THEE' }, + [0x1325] = { unicodeslot=0x1325, category='lo', description='ETHIOPIC SYLLABLE THE' }, + [0x1326] = { unicodeslot=0x1326, category='lo', description='ETHIOPIC SYLLABLE THO' }, + [0x1327] = { unicodeslot=0x1327, category='lo', description='ETHIOPIC SYLLABLE THWA' }, + [0x1328] = { unicodeslot=0x1328, category='lo', description='ETHIOPIC SYLLABLE CHA' }, + [0x1329] = { unicodeslot=0x1329, category='lo', description='ETHIOPIC SYLLABLE CHU' }, + [0x132A] = { unicodeslot=0x132A, category='lo', description='ETHIOPIC SYLLABLE CHI' }, + [0x132B] = { unicodeslot=0x132B, category='lo', description='ETHIOPIC SYLLABLE CHAA' }, + [0x132C] = { unicodeslot=0x132C, category='lo', description='ETHIOPIC SYLLABLE CHEE' }, + [0x132D] = { unicodeslot=0x132D, category='lo', description='ETHIOPIC SYLLABLE CHE' }, + [0x132E] = { unicodeslot=0x132E, category='lo', description='ETHIOPIC SYLLABLE CHO' }, + [0x132F] = { unicodeslot=0x132F, category='lo', description='ETHIOPIC SYLLABLE CHWA' }, + [0x1330] = { unicodeslot=0x1330, category='lo', description='ETHIOPIC SYLLABLE PHA' }, + [0x1331] = { unicodeslot=0x1331, category='lo', description='ETHIOPIC SYLLABLE PHU' }, + [0x1332] = { unicodeslot=0x1332, category='lo', description='ETHIOPIC SYLLABLE PHI' }, + [0x1333] = { unicodeslot=0x1333, category='lo', description='ETHIOPIC SYLLABLE PHAA' }, + [0x1334] = { unicodeslot=0x1334, category='lo', description='ETHIOPIC SYLLABLE PHEE' }, + [0x1335] = { unicodeslot=0x1335, category='lo', description='ETHIOPIC SYLLABLE PHE' }, + [0x1336] = { unicodeslot=0x1336, category='lo', description='ETHIOPIC SYLLABLE PHO' }, + [0x1337] = { unicodeslot=0x1337, category='lo', description='ETHIOPIC SYLLABLE PHWA' }, + [0x1338] = { unicodeslot=0x1338, category='lo', description='ETHIOPIC SYLLABLE TSA' }, + [0x1339] = { unicodeslot=0x1339, category='lo', description='ETHIOPIC SYLLABLE TSU' }, + [0x133A] = { unicodeslot=0x133A, category='lo', description='ETHIOPIC SYLLABLE TSI' }, + [0x133B] = { unicodeslot=0x133B, category='lo', description='ETHIOPIC SYLLABLE TSAA' }, + [0x133C] = { unicodeslot=0x133C, category='lo', description='ETHIOPIC SYLLABLE TSEE' }, + [0x133D] = { unicodeslot=0x133D, category='lo', description='ETHIOPIC SYLLABLE TSE' }, + [0x133E] = { unicodeslot=0x133E, category='lo', description='ETHIOPIC SYLLABLE TSO' }, + [0x133F] = { unicodeslot=0x133F, category='lo', description='ETHIOPIC SYLLABLE TSWA' }, + [0x1340] = { unicodeslot=0x1340, category='lo', description='ETHIOPIC SYLLABLE TZA' }, + [0x1341] = { unicodeslot=0x1341, category='lo', description='ETHIOPIC SYLLABLE TZU' }, + [0x1342] = { unicodeslot=0x1342, category='lo', description='ETHIOPIC SYLLABLE TZI' }, + [0x1343] = { unicodeslot=0x1343, category='lo', description='ETHIOPIC SYLLABLE TZAA' }, + [0x1344] = { unicodeslot=0x1344, category='lo', description='ETHIOPIC SYLLABLE TZEE' }, + [0x1345] = { unicodeslot=0x1345, category='lo', description='ETHIOPIC SYLLABLE TZE' }, + [0x1346] = { unicodeslot=0x1346, category='lo', description='ETHIOPIC SYLLABLE TZO' }, + [0x1347] = { unicodeslot=0x1347, category='lo', description='ETHIOPIC SYLLABLE TZOA' }, + [0x1348] = { unicodeslot=0x1348, category='lo', description='ETHIOPIC SYLLABLE FA' }, + [0x1349] = { unicodeslot=0x1349, category='lo', description='ETHIOPIC SYLLABLE FU' }, + [0x134A] = { unicodeslot=0x134A, category='lo', description='ETHIOPIC SYLLABLE FI' }, + [0x134B] = { unicodeslot=0x134B, category='lo', description='ETHIOPIC SYLLABLE FAA' }, + [0x134C] = { unicodeslot=0x134C, category='lo', description='ETHIOPIC SYLLABLE FEE' }, + [0x134D] = { unicodeslot=0x134D, category='lo', description='ETHIOPIC SYLLABLE FE' }, + [0x134E] = { unicodeslot=0x134E, category='lo', description='ETHIOPIC SYLLABLE FO' }, + [0x134F] = { unicodeslot=0x134F, category='lo', description='ETHIOPIC SYLLABLE FWA' }, + [0x1350] = { unicodeslot=0x1350, category='lo', description='ETHIOPIC SYLLABLE PA' }, + [0x1351] = { unicodeslot=0x1351, category='lo', description='ETHIOPIC SYLLABLE PU' }, + [0x1352] = { unicodeslot=0x1352, category='lo', description='ETHIOPIC SYLLABLE PI' }, + [0x1353] = { unicodeslot=0x1353, category='lo', description='ETHIOPIC SYLLABLE PAA' }, + [0x1354] = { unicodeslot=0x1354, category='lo', description='ETHIOPIC SYLLABLE PEE' }, + [0x1355] = { unicodeslot=0x1355, category='lo', description='ETHIOPIC SYLLABLE PE' }, + [0x1356] = { unicodeslot=0x1356, category='lo', description='ETHIOPIC SYLLABLE PO' }, + [0x1357] = { unicodeslot=0x1357, category='lo', description='ETHIOPIC SYLLABLE PWA' }, + [0x1358] = { unicodeslot=0x1358, category='lo', description='ETHIOPIC SYLLABLE RYA' }, + [0x1359] = { unicodeslot=0x1359, category='lo', description='ETHIOPIC SYLLABLE MYA' }, + [0x135A] = { unicodeslot=0x135A, category='lo', description='ETHIOPIC SYLLABLE FYA' }, + [0x135F] = { unicodeslot=0x135F, category='mn', description='ETHIOPIC COMBINING GEMINATION MARK' }, + [0x1360] = { unicodeslot=0x1360, category='so', description='ETHIOPIC SECTION MARK' }, + [0x1361] = { unicodeslot=0x1361, category='po', description='ETHIOPIC WORDSPACE' }, + [0x1362] = { unicodeslot=0x1362, category='po', description='ETHIOPIC FULL STOP' }, + [0x1363] = { unicodeslot=0x1363, category='po', description='ETHIOPIC COMMA' }, + [0x1364] = { unicodeslot=0x1364, category='po', description='ETHIOPIC SEMICOLON' }, + [0x1365] = { unicodeslot=0x1365, category='po', description='ETHIOPIC COLON' }, + [0x1366] = { unicodeslot=0x1366, category='po', description='ETHIOPIC PREFACE COLON' }, + [0x1367] = { unicodeslot=0x1367, category='po', description='ETHIOPIC QUESTION MARK' }, + [0x1368] = { unicodeslot=0x1368, category='po', description='ETHIOPIC PARAGRAPH SEPARATOR' }, + [0x1369] = { unicodeslot=0x1369, category='no', description='ETHIOPIC DIGIT ONE' }, + [0x136A] = { unicodeslot=0x136A, category='no', description='ETHIOPIC DIGIT TWO' }, + [0x136B] = { unicodeslot=0x136B, category='no', description='ETHIOPIC DIGIT THREE' }, + [0x136C] = { unicodeslot=0x136C, category='no', description='ETHIOPIC DIGIT FOUR' }, + [0x136D] = { unicodeslot=0x136D, category='no', description='ETHIOPIC DIGIT FIVE' }, + [0x136E] = { unicodeslot=0x136E, category='no', description='ETHIOPIC DIGIT SIX' }, + [0x136F] = { unicodeslot=0x136F, category='no', description='ETHIOPIC DIGIT SEVEN' }, + [0x1370] = { unicodeslot=0x1370, category='no', description='ETHIOPIC DIGIT EIGHT' }, + [0x1371] = { unicodeslot=0x1371, category='no', description='ETHIOPIC DIGIT NINE' }, + [0x1372] = { unicodeslot=0x1372, category='no', description='ETHIOPIC NUMBER TEN' }, + [0x1373] = { unicodeslot=0x1373, category='no', description='ETHIOPIC NUMBER TWENTY' }, + [0x1374] = { unicodeslot=0x1374, category='no', description='ETHIOPIC NUMBER THIRTY' }, + [0x1375] = { unicodeslot=0x1375, category='no', description='ETHIOPIC NUMBER FORTY' }, + [0x1376] = { unicodeslot=0x1376, category='no', description='ETHIOPIC NUMBER FIFTY' }, + [0x1377] = { unicodeslot=0x1377, category='no', description='ETHIOPIC NUMBER SIXTY' }, + [0x1378] = { unicodeslot=0x1378, category='no', description='ETHIOPIC NUMBER SEVENTY' }, + [0x1379] = { unicodeslot=0x1379, category='no', description='ETHIOPIC NUMBER EIGHTY' }, + [0x137A] = { unicodeslot=0x137A, category='no', description='ETHIOPIC NUMBER NINETY' }, + [0x137B] = { unicodeslot=0x137B, category='no', description='ETHIOPIC NUMBER HUNDRED' }, + [0x137C] = { unicodeslot=0x137C, category='no', description='ETHIOPIC NUMBER TEN THOUSAND' }, + [0x1380] = { unicodeslot=0x1380, category='lo', description='ETHIOPIC SYLLABLE SEBATBEIT MWA' }, + [0x1381] = { unicodeslot=0x1381, category='lo', description='ETHIOPIC SYLLABLE MWI' }, + [0x1382] = { unicodeslot=0x1382, category='lo', description='ETHIOPIC SYLLABLE MWEE' }, + [0x1383] = { unicodeslot=0x1383, category='lo', description='ETHIOPIC SYLLABLE MWE' }, + [0x1384] = { unicodeslot=0x1384, category='lo', description='ETHIOPIC SYLLABLE SEBATBEIT BWA' }, + [0x1385] = { unicodeslot=0x1385, category='lo', description='ETHIOPIC SYLLABLE BWI' }, + [0x1386] = { unicodeslot=0x1386, category='lo', description='ETHIOPIC SYLLABLE BWEE' }, + [0x1387] = { unicodeslot=0x1387, category='lo', description='ETHIOPIC SYLLABLE BWE' }, + [0x1388] = { unicodeslot=0x1388, category='lo', description='ETHIOPIC SYLLABLE SEBATBEIT FWA' }, + [0x1389] = { unicodeslot=0x1389, category='lo', description='ETHIOPIC SYLLABLE FWI' }, + [0x138A] = { unicodeslot=0x138A, category='lo', description='ETHIOPIC SYLLABLE FWEE' }, + [0x138B] = { unicodeslot=0x138B, category='lo', description='ETHIOPIC SYLLABLE FWE' }, + [0x138C] = { unicodeslot=0x138C, category='lo', description='ETHIOPIC SYLLABLE SEBATBEIT PWA' }, + [0x138D] = { unicodeslot=0x138D, category='lo', description='ETHIOPIC SYLLABLE PWI' }, + [0x138E] = { unicodeslot=0x138E, category='lo', description='ETHIOPIC SYLLABLE PWEE' }, + [0x138F] = { unicodeslot=0x138F, category='lo', description='ETHIOPIC SYLLABLE PWE' }, + [0x1390] = { unicodeslot=0x1390, category='so', description='ETHIOPIC TONAL MARK YIZET' }, + [0x1391] = { unicodeslot=0x1391, category='so', description='ETHIOPIC TONAL MARK DERET' }, + [0x1392] = { unicodeslot=0x1392, category='so', description='ETHIOPIC TONAL MARK RIKRIK' }, + [0x1393] = { unicodeslot=0x1393, category='so', description='ETHIOPIC TONAL MARK SHORT RIKRIK' }, + [0x1394] = { unicodeslot=0x1394, category='so', description='ETHIOPIC TONAL MARK DIFAT' }, + [0x1395] = { unicodeslot=0x1395, category='so', description='ETHIOPIC TONAL MARK KENAT' }, + [0x1396] = { unicodeslot=0x1396, category='so', description='ETHIOPIC TONAL MARK CHIRET' }, + [0x1397] = { unicodeslot=0x1397, category='so', description='ETHIOPIC TONAL MARK HIDET' }, + [0x1398] = { unicodeslot=0x1398, category='so', description='ETHIOPIC TONAL MARK DERET-HIDET' }, + [0x1399] = { unicodeslot=0x1399, category='so', description='ETHIOPIC TONAL MARK KURT' }, + [0x13A0] = { unicodeslot=0x13A0, category='lo', description='CHEROKEE LETTER A' }, + [0x13A1] = { unicodeslot=0x13A1, category='lo', description='CHEROKEE LETTER E' }, + [0x13A2] = { unicodeslot=0x13A2, category='lo', description='CHEROKEE LETTER I' }, + [0x13A3] = { unicodeslot=0x13A3, category='lo', description='CHEROKEE LETTER O' }, + [0x13A4] = { unicodeslot=0x13A4, category='lo', description='CHEROKEE LETTER U' }, + [0x13A5] = { unicodeslot=0x13A5, category='lo', description='CHEROKEE LETTER V' }, + [0x13A6] = { unicodeslot=0x13A6, category='lo', description='CHEROKEE LETTER GA' }, + [0x13A7] = { unicodeslot=0x13A7, category='lo', description='CHEROKEE LETTER KA' }, + [0x13A8] = { unicodeslot=0x13A8, category='lo', description='CHEROKEE LETTER GE' }, + [0x13A9] = { unicodeslot=0x13A9, category='lo', description='CHEROKEE LETTER GI' }, + [0x13AA] = { unicodeslot=0x13AA, category='lo', description='CHEROKEE LETTER GO' }, + [0x13AB] = { unicodeslot=0x13AB, category='lo', description='CHEROKEE LETTER GU' }, + [0x13AC] = { unicodeslot=0x13AC, category='lo', description='CHEROKEE LETTER GV' }, + [0x13AD] = { unicodeslot=0x13AD, category='lo', description='CHEROKEE LETTER HA' }, + [0x13AE] = { unicodeslot=0x13AE, category='lo', description='CHEROKEE LETTER HE' }, + [0x13AF] = { unicodeslot=0x13AF, category='lo', description='CHEROKEE LETTER HI' }, + [0x13B0] = { unicodeslot=0x13B0, category='lo', description='CHEROKEE LETTER HO' }, + [0x13B1] = { unicodeslot=0x13B1, category='lo', description='CHEROKEE LETTER HU' }, + [0x13B2] = { unicodeslot=0x13B2, category='lo', description='CHEROKEE LETTER HV' }, + [0x13B3] = { unicodeslot=0x13B3, category='lo', description='CHEROKEE LETTER LA' }, + [0x13B4] = { unicodeslot=0x13B4, category='lo', description='CHEROKEE LETTER LE' }, + [0x13B5] = { unicodeslot=0x13B5, category='lo', description='CHEROKEE LETTER LI' }, + [0x13B6] = { unicodeslot=0x13B6, category='lo', description='CHEROKEE LETTER LO' }, + [0x13B7] = { unicodeslot=0x13B7, category='lo', description='CHEROKEE LETTER LU' }, + [0x13B8] = { unicodeslot=0x13B8, category='lo', description='CHEROKEE LETTER LV' }, + [0x13B9] = { unicodeslot=0x13B9, category='lo', description='CHEROKEE LETTER MA' }, + [0x13BA] = { unicodeslot=0x13BA, category='lo', description='CHEROKEE LETTER ME' }, + [0x13BB] = { unicodeslot=0x13BB, category='lo', description='CHEROKEE LETTER MI' }, + [0x13BC] = { unicodeslot=0x13BC, category='lo', description='CHEROKEE LETTER MO' }, + [0x13BD] = { unicodeslot=0x13BD, category='lo', description='CHEROKEE LETTER MU' }, + [0x13BE] = { unicodeslot=0x13BE, category='lo', description='CHEROKEE LETTER NA' }, + [0x13BF] = { unicodeslot=0x13BF, category='lo', description='CHEROKEE LETTER HNA' }, + [0x13C0] = { unicodeslot=0x13C0, category='lo', description='CHEROKEE LETTER NAH' }, + [0x13C1] = { unicodeslot=0x13C1, category='lo', description='CHEROKEE LETTER NE' }, + [0x13C2] = { unicodeslot=0x13C2, category='lo', description='CHEROKEE LETTER NI' }, + [0x13C3] = { unicodeslot=0x13C3, category='lo', description='CHEROKEE LETTER NO' }, + [0x13C4] = { unicodeslot=0x13C4, category='lo', description='CHEROKEE LETTER NU' }, + [0x13C5] = { unicodeslot=0x13C5, category='lo', description='CHEROKEE LETTER NV' }, + [0x13C6] = { unicodeslot=0x13C6, category='lo', description='CHEROKEE LETTER QUA' }, + [0x13C7] = { unicodeslot=0x13C7, category='lo', description='CHEROKEE LETTER QUE' }, + [0x13C8] = { unicodeslot=0x13C8, category='lo', description='CHEROKEE LETTER QUI' }, + [0x13C9] = { unicodeslot=0x13C9, category='lo', description='CHEROKEE LETTER QUO' }, + [0x13CA] = { unicodeslot=0x13CA, category='lo', description='CHEROKEE LETTER QUU' }, + [0x13CB] = { unicodeslot=0x13CB, category='lo', description='CHEROKEE LETTER QUV' }, + [0x13CC] = { unicodeslot=0x13CC, category='lo', description='CHEROKEE LETTER SA' }, + [0x13CD] = { unicodeslot=0x13CD, category='lo', description='CHEROKEE LETTER S' }, + [0x13CE] = { unicodeslot=0x13CE, category='lo', description='CHEROKEE LETTER SE' }, + [0x13CF] = { unicodeslot=0x13CF, category='lo', description='CHEROKEE LETTER SI' }, + [0x13D0] = { unicodeslot=0x13D0, category='lo', description='CHEROKEE LETTER SO' }, + [0x13D1] = { unicodeslot=0x13D1, category='lo', description='CHEROKEE LETTER SU' }, + [0x13D2] = { unicodeslot=0x13D2, category='lo', description='CHEROKEE LETTER SV' }, + [0x13D3] = { unicodeslot=0x13D3, category='lo', description='CHEROKEE LETTER DA' }, + [0x13D4] = { unicodeslot=0x13D4, category='lo', description='CHEROKEE LETTER TA' }, + [0x13D5] = { unicodeslot=0x13D5, category='lo', description='CHEROKEE LETTER DE' }, + [0x13D6] = { unicodeslot=0x13D6, category='lo', description='CHEROKEE LETTER TE' }, + [0x13D7] = { unicodeslot=0x13D7, category='lo', description='CHEROKEE LETTER DI' }, + [0x13D8] = { unicodeslot=0x13D8, category='lo', description='CHEROKEE LETTER TI' }, + [0x13D9] = { unicodeslot=0x13D9, category='lo', description='CHEROKEE LETTER DO' }, + [0x13DA] = { unicodeslot=0x13DA, category='lo', description='CHEROKEE LETTER DU' }, + [0x13DB] = { unicodeslot=0x13DB, category='lo', description='CHEROKEE LETTER DV' }, + [0x13DC] = { unicodeslot=0x13DC, category='lo', description='CHEROKEE LETTER DLA' }, + [0x13DD] = { unicodeslot=0x13DD, category='lo', description='CHEROKEE LETTER TLA' }, + [0x13DE] = { unicodeslot=0x13DE, category='lo', description='CHEROKEE LETTER TLE' }, + [0x13DF] = { unicodeslot=0x13DF, category='lo', description='CHEROKEE LETTER TLI' }, + [0x13E0] = { unicodeslot=0x13E0, category='lo', description='CHEROKEE LETTER TLO' }, + [0x13E1] = { unicodeslot=0x13E1, category='lo', description='CHEROKEE LETTER TLU' }, + [0x13E2] = { unicodeslot=0x13E2, category='lo', description='CHEROKEE LETTER TLV' }, + [0x13E3] = { unicodeslot=0x13E3, category='lo', description='CHEROKEE LETTER TSA' }, + [0x13E4] = { unicodeslot=0x13E4, category='lo', description='CHEROKEE LETTER TSE' }, + [0x13E5] = { unicodeslot=0x13E5, category='lo', description='CHEROKEE LETTER TSI' }, + [0x13E6] = { unicodeslot=0x13E6, category='lo', description='CHEROKEE LETTER TSO' }, + [0x13E7] = { unicodeslot=0x13E7, category='lo', description='CHEROKEE LETTER TSU' }, + [0x13E8] = { unicodeslot=0x13E8, category='lo', description='CHEROKEE LETTER TSV' }, + [0x13E9] = { unicodeslot=0x13E9, category='lo', description='CHEROKEE LETTER WA' }, + [0x13EA] = { unicodeslot=0x13EA, category='lo', description='CHEROKEE LETTER WE' }, + [0x13EB] = { unicodeslot=0x13EB, category='lo', description='CHEROKEE LETTER WI' }, + [0x13EC] = { unicodeslot=0x13EC, category='lo', description='CHEROKEE LETTER WO' }, + [0x13ED] = { unicodeslot=0x13ED, category='lo', description='CHEROKEE LETTER WU' }, + [0x13EE] = { unicodeslot=0x13EE, category='lo', description='CHEROKEE LETTER WV' }, + [0x13EF] = { unicodeslot=0x13EF, category='lo', description='CHEROKEE LETTER YA' }, + [0x13F0] = { unicodeslot=0x13F0, category='lo', description='CHEROKEE LETTER YE' }, + [0x13F1] = { unicodeslot=0x13F1, category='lo', description='CHEROKEE LETTER YI' }, + [0x13F2] = { unicodeslot=0x13F2, category='lo', description='CHEROKEE LETTER YO' }, + [0x13F3] = { unicodeslot=0x13F3, category='lo', description='CHEROKEE LETTER YU' }, + [0x13F4] = { unicodeslot=0x13F4, category='lo', description='CHEROKEE LETTER YV' }, + [0x1401] = { unicodeslot=0x1401, category='lo', description='CANADIAN SYLLABICS E' }, + [0x1402] = { unicodeslot=0x1402, category='lo', description='CANADIAN SYLLABICS AAI' }, + [0x1403] = { unicodeslot=0x1403, category='lo', description='CANADIAN SYLLABICS I' }, + [0x1404] = { unicodeslot=0x1404, category='lo', description='CANADIAN SYLLABICS II' }, + [0x1405] = { unicodeslot=0x1405, category='lo', description='CANADIAN SYLLABICS O' }, + [0x1406] = { unicodeslot=0x1406, category='lo', description='CANADIAN SYLLABICS OO' }, + [0x1407] = { unicodeslot=0x1407, category='lo', description='CANADIAN SYLLABICS Y-CREE OO' }, + [0x1408] = { unicodeslot=0x1408, category='lo', description='CANADIAN SYLLABICS CARRIER EE' }, + [0x1409] = { unicodeslot=0x1409, category='lo', description='CANADIAN SYLLABICS CARRIER I' }, + [0x140A] = { unicodeslot=0x140A, category='lo', description='CANADIAN SYLLABICS A' }, + [0x140B] = { unicodeslot=0x140B, category='lo', description='CANADIAN SYLLABICS AA' }, + [0x140C] = { unicodeslot=0x140C, category='lo', description='CANADIAN SYLLABICS WE' }, + [0x140D] = { unicodeslot=0x140D, category='lo', description='CANADIAN SYLLABICS WEST-CREE WE' }, + [0x140E] = { unicodeslot=0x140E, category='lo', description='CANADIAN SYLLABICS WI' }, + [0x140F] = { unicodeslot=0x140F, category='lo', description='CANADIAN SYLLABICS WEST-CREE WI' }, + [0x1410] = { unicodeslot=0x1410, category='lo', description='CANADIAN SYLLABICS WII' }, + [0x1411] = { unicodeslot=0x1411, category='lo', description='CANADIAN SYLLABICS WEST-CREE WII' }, + [0x1412] = { unicodeslot=0x1412, category='lo', description='CANADIAN SYLLABICS WO' }, + [0x1413] = { unicodeslot=0x1413, category='lo', description='CANADIAN SYLLABICS WEST-CREE WO' }, + [0x1414] = { unicodeslot=0x1414, category='lo', description='CANADIAN SYLLABICS WOO' }, + [0x1415] = { unicodeslot=0x1415, category='lo', description='CANADIAN SYLLABICS WEST-CREE WOO' }, + [0x1416] = { unicodeslot=0x1416, category='lo', description='CANADIAN SYLLABICS NASKAPI WOO' }, + [0x1417] = { unicodeslot=0x1417, category='lo', description='CANADIAN SYLLABICS WA' }, + [0x1418] = { unicodeslot=0x1418, category='lo', description='CANADIAN SYLLABICS WEST-CREE WA' }, + [0x1419] = { unicodeslot=0x1419, category='lo', description='CANADIAN SYLLABICS WAA' }, + [0x141A] = { unicodeslot=0x141A, category='lo', description='CANADIAN SYLLABICS WEST-CREE WAA' }, + [0x141B] = { unicodeslot=0x141B, category='lo', description='CANADIAN SYLLABICS NASKAPI WAA' }, + [0x141C] = { unicodeslot=0x141C, category='lo', description='CANADIAN SYLLABICS AI' }, + [0x141D] = { unicodeslot=0x141D, category='lo', description='CANADIAN SYLLABICS Y-CREE W' }, + [0x141E] = { unicodeslot=0x141E, category='lo', description='CANADIAN SYLLABICS GLOTTAL STOP' }, + [0x141F] = { unicodeslot=0x141F, category='lo', description='CANADIAN SYLLABICS FINAL ACUTE' }, + [0x1420] = { unicodeslot=0x1420, category='lo', description='CANADIAN SYLLABICS FINAL GRAVE' }, + [0x1421] = { unicodeslot=0x1421, category='lo', description='CANADIAN SYLLABICS FINAL BOTTOM HALF RING' }, + [0x1422] = { unicodeslot=0x1422, category='lo', description='CANADIAN SYLLABICS FINAL TOP HALF RING' }, + [0x1423] = { unicodeslot=0x1423, category='lo', description='CANADIAN SYLLABICS FINAL RIGHT HALF RING' }, + [0x1424] = { unicodeslot=0x1424, category='lo', description='CANADIAN SYLLABICS FINAL RING' }, + [0x1425] = { unicodeslot=0x1425, category='lo', description='CANADIAN SYLLABICS FINAL DOUBLE ACUTE' }, + [0x1426] = { unicodeslot=0x1426, category='lo', description='CANADIAN SYLLABICS FINAL DOUBLE SHORT VERTICAL STROKES' }, + [0x1427] = { unicodeslot=0x1427, category='lo', description='CANADIAN SYLLABICS FINAL MIDDLE DOT' }, + [0x1428] = { unicodeslot=0x1428, category='lo', description='CANADIAN SYLLABICS FINAL SHORT HORIZONTAL STROKE' }, + [0x1429] = { unicodeslot=0x1429, category='lo', description='CANADIAN SYLLABICS FINAL PLUS' }, + [0x142A] = { unicodeslot=0x142A, category='lo', description='CANADIAN SYLLABICS FINAL DOWN TACK' }, + [0x142B] = { unicodeslot=0x142B, category='lo', description='CANADIAN SYLLABICS EN' }, + [0x142C] = { unicodeslot=0x142C, category='lo', description='CANADIAN SYLLABICS IN' }, + [0x142D] = { unicodeslot=0x142D, category='lo', description='CANADIAN SYLLABICS ON' }, + [0x142E] = { unicodeslot=0x142E, category='lo', description='CANADIAN SYLLABICS AN' }, + [0x142F] = { unicodeslot=0x142F, category='lo', description='CANADIAN SYLLABICS PE' }, + [0x1430] = { unicodeslot=0x1430, category='lo', description='CANADIAN SYLLABICS PAAI' }, + [0x1431] = { unicodeslot=0x1431, category='lo', description='CANADIAN SYLLABICS PI' }, + [0x1432] = { unicodeslot=0x1432, category='lo', description='CANADIAN SYLLABICS PII' }, + [0x1433] = { unicodeslot=0x1433, category='lo', description='CANADIAN SYLLABICS PO' }, + [0x1434] = { unicodeslot=0x1434, category='lo', description='CANADIAN SYLLABICS POO' }, + [0x1435] = { unicodeslot=0x1435, category='lo', description='CANADIAN SYLLABICS Y-CREE POO' }, + [0x1436] = { unicodeslot=0x1436, category='lo', description='CANADIAN SYLLABICS CARRIER HEE' }, + [0x1437] = { unicodeslot=0x1437, category='lo', description='CANADIAN SYLLABICS CARRIER HI' }, + [0x1438] = { unicodeslot=0x1438, category='lo', description='CANADIAN SYLLABICS PA' }, + [0x1439] = { unicodeslot=0x1439, category='lo', description='CANADIAN SYLLABICS PAA' }, + [0x143A] = { unicodeslot=0x143A, category='lo', description='CANADIAN SYLLABICS PWE' }, + [0x143B] = { unicodeslot=0x143B, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWE' }, + [0x143C] = { unicodeslot=0x143C, category='lo', description='CANADIAN SYLLABICS PWI' }, + [0x143D] = { unicodeslot=0x143D, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWI' }, + [0x143E] = { unicodeslot=0x143E, category='lo', description='CANADIAN SYLLABICS PWII' }, + [0x143F] = { unicodeslot=0x143F, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWII' }, + [0x1440] = { unicodeslot=0x1440, category='lo', description='CANADIAN SYLLABICS PWO' }, + [0x1441] = { unicodeslot=0x1441, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWO' }, + [0x1442] = { unicodeslot=0x1442, category='lo', description='CANADIAN SYLLABICS PWOO' }, + [0x1443] = { unicodeslot=0x1443, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWOO' }, + [0x1444] = { unicodeslot=0x1444, category='lo', description='CANADIAN SYLLABICS PWA' }, + [0x1445] = { unicodeslot=0x1445, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWA' }, + [0x1446] = { unicodeslot=0x1446, category='lo', description='CANADIAN SYLLABICS PWAA' }, + [0x1447] = { unicodeslot=0x1447, category='lo', description='CANADIAN SYLLABICS WEST-CREE PWAA' }, + [0x1448] = { unicodeslot=0x1448, category='lo', description='CANADIAN SYLLABICS Y-CREE PWAA' }, + [0x1449] = { unicodeslot=0x1449, category='lo', description='CANADIAN SYLLABICS P' }, + [0x144A] = { unicodeslot=0x144A, category='lo', description='CANADIAN SYLLABICS WEST-CREE P' }, + [0x144B] = { unicodeslot=0x144B, category='lo', description='CANADIAN SYLLABICS CARRIER H' }, + [0x144C] = { unicodeslot=0x144C, category='lo', description='CANADIAN SYLLABICS TE' }, + [0x144D] = { unicodeslot=0x144D, category='lo', description='CANADIAN SYLLABICS TAAI' }, + [0x144E] = { unicodeslot=0x144E, category='lo', description='CANADIAN SYLLABICS TI' }, + [0x144F] = { unicodeslot=0x144F, category='lo', description='CANADIAN SYLLABICS TII' }, + [0x1450] = { unicodeslot=0x1450, category='lo', description='CANADIAN SYLLABICS TO' }, + [0x1451] = { unicodeslot=0x1451, category='lo', description='CANADIAN SYLLABICS TOO' }, + [0x1452] = { unicodeslot=0x1452, category='lo', description='CANADIAN SYLLABICS Y-CREE TOO' }, + [0x1453] = { unicodeslot=0x1453, category='lo', description='CANADIAN SYLLABICS CARRIER DEE' }, + [0x1454] = { unicodeslot=0x1454, category='lo', description='CANADIAN SYLLABICS CARRIER DI' }, + [0x1455] = { unicodeslot=0x1455, category='lo', description='CANADIAN SYLLABICS TA' }, + [0x1456] = { unicodeslot=0x1456, category='lo', description='CANADIAN SYLLABICS TAA' }, + [0x1457] = { unicodeslot=0x1457, category='lo', description='CANADIAN SYLLABICS TWE' }, + [0x1458] = { unicodeslot=0x1458, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWE' }, + [0x1459] = { unicodeslot=0x1459, category='lo', description='CANADIAN SYLLABICS TWI' }, + [0x145A] = { unicodeslot=0x145A, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWI' }, + [0x145B] = { unicodeslot=0x145B, category='lo', description='CANADIAN SYLLABICS TWII' }, + [0x145C] = { unicodeslot=0x145C, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWII' }, + [0x145D] = { unicodeslot=0x145D, category='lo', description='CANADIAN SYLLABICS TWO' }, + [0x145E] = { unicodeslot=0x145E, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWO' }, + [0x145F] = { unicodeslot=0x145F, category='lo', description='CANADIAN SYLLABICS TWOO' }, + [0x1460] = { unicodeslot=0x1460, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWOO' }, + [0x1461] = { unicodeslot=0x1461, category='lo', description='CANADIAN SYLLABICS TWA' }, + [0x1462] = { unicodeslot=0x1462, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWA' }, + [0x1463] = { unicodeslot=0x1463, category='lo', description='CANADIAN SYLLABICS TWAA' }, + [0x1464] = { unicodeslot=0x1464, category='lo', description='CANADIAN SYLLABICS WEST-CREE TWAA' }, + [0x1465] = { unicodeslot=0x1465, category='lo', description='CANADIAN SYLLABICS NASKAPI TWAA' }, + [0x1466] = { unicodeslot=0x1466, category='lo', description='CANADIAN SYLLABICS T' }, + [0x1467] = { unicodeslot=0x1467, category='lo', description='CANADIAN SYLLABICS TTE' }, + [0x1468] = { unicodeslot=0x1468, category='lo', description='CANADIAN SYLLABICS TTI' }, + [0x1469] = { unicodeslot=0x1469, category='lo', description='CANADIAN SYLLABICS TTO' }, + [0x146A] = { unicodeslot=0x146A, category='lo', description='CANADIAN SYLLABICS TTA' }, + [0x146B] = { unicodeslot=0x146B, category='lo', description='CANADIAN SYLLABICS KE' }, + [0x146C] = { unicodeslot=0x146C, category='lo', description='CANADIAN SYLLABICS KAAI' }, + [0x146D] = { unicodeslot=0x146D, category='lo', description='CANADIAN SYLLABICS KI' }, + [0x146E] = { unicodeslot=0x146E, category='lo', description='CANADIAN SYLLABICS KII' }, + [0x146F] = { unicodeslot=0x146F, category='lo', description='CANADIAN SYLLABICS KO' }, + [0x1470] = { unicodeslot=0x1470, category='lo', description='CANADIAN SYLLABICS KOO' }, + [0x1471] = { unicodeslot=0x1471, category='lo', description='CANADIAN SYLLABICS Y-CREE KOO' }, + [0x1472] = { unicodeslot=0x1472, category='lo', description='CANADIAN SYLLABICS KA' }, + [0x1473] = { unicodeslot=0x1473, category='lo', description='CANADIAN SYLLABICS KAA' }, + [0x1474] = { unicodeslot=0x1474, category='lo', description='CANADIAN SYLLABICS KWE' }, + [0x1475] = { unicodeslot=0x1475, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWE' }, + [0x1476] = { unicodeslot=0x1476, category='lo', description='CANADIAN SYLLABICS KWI' }, + [0x1477] = { unicodeslot=0x1477, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWI' }, + [0x1478] = { unicodeslot=0x1478, category='lo', description='CANADIAN SYLLABICS KWII' }, + [0x1479] = { unicodeslot=0x1479, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWII' }, + [0x147A] = { unicodeslot=0x147A, category='lo', description='CANADIAN SYLLABICS KWO' }, + [0x147B] = { unicodeslot=0x147B, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWO' }, + [0x147C] = { unicodeslot=0x147C, category='lo', description='CANADIAN SYLLABICS KWOO' }, + [0x147D] = { unicodeslot=0x147D, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWOO' }, + [0x147E] = { unicodeslot=0x147E, category='lo', description='CANADIAN SYLLABICS KWA' }, + [0x147F] = { unicodeslot=0x147F, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWA' }, + [0x1480] = { unicodeslot=0x1480, category='lo', description='CANADIAN SYLLABICS KWAA' }, + [0x1481] = { unicodeslot=0x1481, category='lo', description='CANADIAN SYLLABICS WEST-CREE KWAA' }, + [0x1482] = { unicodeslot=0x1482, category='lo', description='CANADIAN SYLLABICS NASKAPI KWAA' }, + [0x1483] = { unicodeslot=0x1483, category='lo', description='CANADIAN SYLLABICS K' }, + [0x1484] = { unicodeslot=0x1484, category='lo', description='CANADIAN SYLLABICS KW' }, + [0x1485] = { unicodeslot=0x1485, category='lo', description='CANADIAN SYLLABICS SOUTH-SLAVEY KEH' }, + [0x1486] = { unicodeslot=0x1486, category='lo', description='CANADIAN SYLLABICS SOUTH-SLAVEY KIH' }, + [0x1487] = { unicodeslot=0x1487, category='lo', description='CANADIAN SYLLABICS SOUTH-SLAVEY KOH' }, + [0x1488] = { unicodeslot=0x1488, category='lo', description='CANADIAN SYLLABICS SOUTH-SLAVEY KAH' }, + [0x1489] = { unicodeslot=0x1489, category='lo', description='CANADIAN SYLLABICS CE' }, + [0x148A] = { unicodeslot=0x148A, category='lo', description='CANADIAN SYLLABICS CAAI' }, + [0x148B] = { unicodeslot=0x148B, category='lo', description='CANADIAN SYLLABICS CI' }, + [0x148C] = { unicodeslot=0x148C, category='lo', description='CANADIAN SYLLABICS CII' }, + [0x148D] = { unicodeslot=0x148D, category='lo', description='CANADIAN SYLLABICS CO' }, + [0x148E] = { unicodeslot=0x148E, category='lo', description='CANADIAN SYLLABICS COO' }, + [0x148F] = { unicodeslot=0x148F, category='lo', description='CANADIAN SYLLABICS Y-CREE COO' }, + [0x1490] = { unicodeslot=0x1490, category='lo', description='CANADIAN SYLLABICS CA' }, + [0x1491] = { unicodeslot=0x1491, category='lo', description='CANADIAN SYLLABICS CAA' }, + [0x1492] = { unicodeslot=0x1492, category='lo', description='CANADIAN SYLLABICS CWE' }, + [0x1493] = { unicodeslot=0x1493, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWE' }, + [0x1494] = { unicodeslot=0x1494, category='lo', description='CANADIAN SYLLABICS CWI' }, + [0x1495] = { unicodeslot=0x1495, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWI' }, + [0x1496] = { unicodeslot=0x1496, category='lo', description='CANADIAN SYLLABICS CWII' }, + [0x1497] = { unicodeslot=0x1497, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWII' }, + [0x1498] = { unicodeslot=0x1498, category='lo', description='CANADIAN SYLLABICS CWO' }, + [0x1499] = { unicodeslot=0x1499, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWO' }, + [0x149A] = { unicodeslot=0x149A, category='lo', description='CANADIAN SYLLABICS CWOO' }, + [0x149B] = { unicodeslot=0x149B, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWOO' }, + [0x149C] = { unicodeslot=0x149C, category='lo', description='CANADIAN SYLLABICS CWA' }, + [0x149D] = { unicodeslot=0x149D, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWA' }, + [0x149E] = { unicodeslot=0x149E, category='lo', description='CANADIAN SYLLABICS CWAA' }, + [0x149F] = { unicodeslot=0x149F, category='lo', description='CANADIAN SYLLABICS WEST-CREE CWAA' }, + [0x14A0] = { unicodeslot=0x14A0, category='lo', description='CANADIAN SYLLABICS NASKAPI CWAA' }, + [0x14A1] = { unicodeslot=0x14A1, category='lo', description='CANADIAN SYLLABICS C' }, + [0x14A2] = { unicodeslot=0x14A2, category='lo', description='CANADIAN SYLLABICS SAYISI TH' }, + [0x14A3] = { unicodeslot=0x14A3, category='lo', description='CANADIAN SYLLABICS ME' }, + [0x14A4] = { unicodeslot=0x14A4, category='lo', description='CANADIAN SYLLABICS MAAI' }, + [0x14A5] = { unicodeslot=0x14A5, category='lo', description='CANADIAN SYLLABICS MI' }, + [0x14A6] = { unicodeslot=0x14A6, category='lo', description='CANADIAN SYLLABICS MII' }, + [0x14A7] = { unicodeslot=0x14A7, category='lo', description='CANADIAN SYLLABICS MO' }, + [0x14A8] = { unicodeslot=0x14A8, category='lo', description='CANADIAN SYLLABICS MOO' }, + [0x14A9] = { unicodeslot=0x14A9, category='lo', description='CANADIAN SYLLABICS Y-CREE MOO' }, + [0x14AA] = { unicodeslot=0x14AA, category='lo', description='CANADIAN SYLLABICS MA' }, + [0x14AB] = { unicodeslot=0x14AB, category='lo', description='CANADIAN SYLLABICS MAA' }, + [0x14AC] = { unicodeslot=0x14AC, category='lo', description='CANADIAN SYLLABICS MWE' }, + [0x14AD] = { unicodeslot=0x14AD, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWE' }, + [0x14AE] = { unicodeslot=0x14AE, category='lo', description='CANADIAN SYLLABICS MWI' }, + [0x14AF] = { unicodeslot=0x14AF, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWI' }, + [0x14B0] = { unicodeslot=0x14B0, category='lo', description='CANADIAN SYLLABICS MWII' }, + [0x14B1] = { unicodeslot=0x14B1, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWII' }, + [0x14B2] = { unicodeslot=0x14B2, category='lo', description='CANADIAN SYLLABICS MWO' }, + [0x14B3] = { unicodeslot=0x14B3, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWO' }, + [0x14B4] = { unicodeslot=0x14B4, category='lo', description='CANADIAN SYLLABICS MWOO' }, + [0x14B5] = { unicodeslot=0x14B5, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWOO' }, + [0x14B6] = { unicodeslot=0x14B6, category='lo', description='CANADIAN SYLLABICS MWA' }, + [0x14B7] = { unicodeslot=0x14B7, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWA' }, + [0x14B8] = { unicodeslot=0x14B8, category='lo', description='CANADIAN SYLLABICS MWAA' }, + [0x14B9] = { unicodeslot=0x14B9, category='lo', description='CANADIAN SYLLABICS WEST-CREE MWAA' }, + [0x14BA] = { unicodeslot=0x14BA, category='lo', description='CANADIAN SYLLABICS NASKAPI MWAA' }, + [0x14BB] = { unicodeslot=0x14BB, category='lo', description='CANADIAN SYLLABICS M' }, + [0x14BC] = { unicodeslot=0x14BC, category='lo', description='CANADIAN SYLLABICS WEST-CREE M' }, + [0x14BD] = { unicodeslot=0x14BD, category='lo', description='CANADIAN SYLLABICS MH' }, + [0x14BE] = { unicodeslot=0x14BE, category='lo', description='CANADIAN SYLLABICS ATHAPASCAN M' }, + [0x14BF] = { unicodeslot=0x14BF, category='lo', description='CANADIAN SYLLABICS SAYISI M' }, + [0x14C0] = { unicodeslot=0x14C0, category='lo', description='CANADIAN SYLLABICS NE' }, + [0x14C1] = { unicodeslot=0x14C1, category='lo', description='CANADIAN SYLLABICS NAAI' }, + [0x14C2] = { unicodeslot=0x14C2, category='lo', description='CANADIAN SYLLABICS NI' }, + [0x14C3] = { unicodeslot=0x14C3, category='lo', description='CANADIAN SYLLABICS NII' }, + [0x14C4] = { unicodeslot=0x14C4, category='lo', description='CANADIAN SYLLABICS NO' }, + [0x14C5] = { unicodeslot=0x14C5, category='lo', description='CANADIAN SYLLABICS NOO' }, + [0x14C6] = { unicodeslot=0x14C6, category='lo', description='CANADIAN SYLLABICS Y-CREE NOO' }, + [0x14C7] = { unicodeslot=0x14C7, category='lo', description='CANADIAN SYLLABICS NA' }, + [0x14C8] = { unicodeslot=0x14C8, category='lo', description='CANADIAN SYLLABICS NAA' }, + [0x14C9] = { unicodeslot=0x14C9, category='lo', description='CANADIAN SYLLABICS NWE' }, + [0x14CA] = { unicodeslot=0x14CA, category='lo', description='CANADIAN SYLLABICS WEST-CREE NWE' }, + [0x14CB] = { unicodeslot=0x14CB, category='lo', description='CANADIAN SYLLABICS NWA' }, + [0x14CC] = { unicodeslot=0x14CC, category='lo', description='CANADIAN SYLLABICS WEST-CREE NWA' }, + [0x14CD] = { unicodeslot=0x14CD, category='lo', description='CANADIAN SYLLABICS NWAA' }, + [0x14CE] = { unicodeslot=0x14CE, category='lo', description='CANADIAN SYLLABICS WEST-CREE NWAA' }, + [0x14CF] = { unicodeslot=0x14CF, category='lo', description='CANADIAN SYLLABICS NASKAPI NWAA' }, + [0x14D0] = { unicodeslot=0x14D0, category='lo', description='CANADIAN SYLLABICS N' }, + [0x14D1] = { unicodeslot=0x14D1, category='lo', description='CANADIAN SYLLABICS CARRIER NG' }, + [0x14D2] = { unicodeslot=0x14D2, category='lo', description='CANADIAN SYLLABICS NH' }, + [0x14D3] = { unicodeslot=0x14D3, category='lo', description='CANADIAN SYLLABICS LE' }, + [0x14D4] = { unicodeslot=0x14D4, category='lo', description='CANADIAN SYLLABICS LAAI' }, + [0x14D5] = { unicodeslot=0x14D5, category='lo', description='CANADIAN SYLLABICS LI' }, + [0x14D6] = { unicodeslot=0x14D6, category='lo', description='CANADIAN SYLLABICS LII' }, + [0x14D7] = { unicodeslot=0x14D7, category='lo', description='CANADIAN SYLLABICS LO' }, + [0x14D8] = { unicodeslot=0x14D8, category='lo', description='CANADIAN SYLLABICS LOO' }, + [0x14D9] = { unicodeslot=0x14D9, category='lo', description='CANADIAN SYLLABICS Y-CREE LOO' }, + [0x14DA] = { unicodeslot=0x14DA, category='lo', description='CANADIAN SYLLABICS LA' }, + [0x14DB] = { unicodeslot=0x14DB, category='lo', description='CANADIAN SYLLABICS LAA' }, + [0x14DC] = { unicodeslot=0x14DC, category='lo', description='CANADIAN SYLLABICS LWE' }, + [0x14DD] = { unicodeslot=0x14DD, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWE' }, + [0x14DE] = { unicodeslot=0x14DE, category='lo', description='CANADIAN SYLLABICS LWI' }, + [0x14DF] = { unicodeslot=0x14DF, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWI' }, + [0x14E0] = { unicodeslot=0x14E0, category='lo', description='CANADIAN SYLLABICS LWII' }, + [0x14E1] = { unicodeslot=0x14E1, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWII' }, + [0x14E2] = { unicodeslot=0x14E2, category='lo', description='CANADIAN SYLLABICS LWO' }, + [0x14E3] = { unicodeslot=0x14E3, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWO' }, + [0x14E4] = { unicodeslot=0x14E4, category='lo', description='CANADIAN SYLLABICS LWOO' }, + [0x14E5] = { unicodeslot=0x14E5, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWOO' }, + [0x14E6] = { unicodeslot=0x14E6, category='lo', description='CANADIAN SYLLABICS LWA' }, + [0x14E7] = { unicodeslot=0x14E7, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWA' }, + [0x14E8] = { unicodeslot=0x14E8, category='lo', description='CANADIAN SYLLABICS LWAA' }, + [0x14E9] = { unicodeslot=0x14E9, category='lo', description='CANADIAN SYLLABICS WEST-CREE LWAA' }, + [0x14EA] = { unicodeslot=0x14EA, category='lo', description='CANADIAN SYLLABICS L' }, + [0x14EB] = { unicodeslot=0x14EB, category='lo', description='CANADIAN SYLLABICS WEST-CREE L' }, + [0x14EC] = { unicodeslot=0x14EC, category='lo', description='CANADIAN SYLLABICS MEDIAL L' }, + [0x14ED] = { unicodeslot=0x14ED, category='lo', description='CANADIAN SYLLABICS SE' }, + [0x14EE] = { unicodeslot=0x14EE, category='lo', description='CANADIAN SYLLABICS SAAI' }, + [0x14EF] = { unicodeslot=0x14EF, category='lo', description='CANADIAN SYLLABICS SI' }, + [0x14F0] = { unicodeslot=0x14F0, category='lo', description='CANADIAN SYLLABICS SII' }, + [0x14F1] = { unicodeslot=0x14F1, category='lo', description='CANADIAN SYLLABICS SO' }, + [0x14F2] = { unicodeslot=0x14F2, category='lo', description='CANADIAN SYLLABICS SOO' }, + [0x14F3] = { unicodeslot=0x14F3, category='lo', description='CANADIAN SYLLABICS Y-CREE SOO' }, + [0x14F4] = { unicodeslot=0x14F4, category='lo', description='CANADIAN SYLLABICS SA' }, + [0x14F5] = { unicodeslot=0x14F5, category='lo', description='CANADIAN SYLLABICS SAA' }, + [0x14F6] = { unicodeslot=0x14F6, category='lo', description='CANADIAN SYLLABICS SWE' }, + [0x14F7] = { unicodeslot=0x14F7, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWE' }, + [0x14F8] = { unicodeslot=0x14F8, category='lo', description='CANADIAN SYLLABICS SWI' }, + [0x14F9] = { unicodeslot=0x14F9, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWI' }, + [0x14FA] = { unicodeslot=0x14FA, category='lo', description='CANADIAN SYLLABICS SWII' }, + [0x14FB] = { unicodeslot=0x14FB, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWII' }, + [0x14FC] = { unicodeslot=0x14FC, category='lo', description='CANADIAN SYLLABICS SWO' }, + [0x14FD] = { unicodeslot=0x14FD, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWO' }, + [0x14FE] = { unicodeslot=0x14FE, category='lo', description='CANADIAN SYLLABICS SWOO' }, + [0x14FF] = { unicodeslot=0x14FF, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWOO' }, + [0x1500] = { unicodeslot=0x1500, category='lo', description='CANADIAN SYLLABICS SWA' }, + [0x1501] = { unicodeslot=0x1501, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWA' }, + [0x1502] = { unicodeslot=0x1502, category='lo', description='CANADIAN SYLLABICS SWAA' }, + [0x1503] = { unicodeslot=0x1503, category='lo', description='CANADIAN SYLLABICS WEST-CREE SWAA' }, + [0x1504] = { unicodeslot=0x1504, category='lo', description='CANADIAN SYLLABICS NASKAPI SWAA' }, + [0x1505] = { unicodeslot=0x1505, category='lo', description='CANADIAN SYLLABICS S' }, + [0x1506] = { unicodeslot=0x1506, category='lo', description='CANADIAN SYLLABICS ATHAPASCAN S' }, + [0x1507] = { unicodeslot=0x1507, category='lo', description='CANADIAN SYLLABICS SW' }, + [0x1508] = { unicodeslot=0x1508, category='lo', description='CANADIAN SYLLABICS BLACKFOOT S' }, + [0x1509] = { unicodeslot=0x1509, category='lo', description='CANADIAN SYLLABICS MOOSE-CREE SK' }, + [0x150A] = { unicodeslot=0x150A, category='lo', description='CANADIAN SYLLABICS NASKAPI SKW' }, + [0x150B] = { unicodeslot=0x150B, category='lo', description='CANADIAN SYLLABICS NASKAPI S-W' }, + [0x150C] = { unicodeslot=0x150C, category='lo', description='CANADIAN SYLLABICS NASKAPI SPWA' }, + [0x150D] = { unicodeslot=0x150D, category='lo', description='CANADIAN SYLLABICS NASKAPI STWA' }, + [0x150E] = { unicodeslot=0x150E, category='lo', description='CANADIAN SYLLABICS NASKAPI SKWA' }, + [0x150F] = { unicodeslot=0x150F, category='lo', description='CANADIAN SYLLABICS NASKAPI SCWA' }, + [0x1510] = { unicodeslot=0x1510, category='lo', description='CANADIAN SYLLABICS SHE' }, + [0x1511] = { unicodeslot=0x1511, category='lo', description='CANADIAN SYLLABICS SHI' }, + [0x1512] = { unicodeslot=0x1512, category='lo', description='CANADIAN SYLLABICS SHII' }, + [0x1513] = { unicodeslot=0x1513, category='lo', description='CANADIAN SYLLABICS SHO' }, + [0x1514] = { unicodeslot=0x1514, category='lo', description='CANADIAN SYLLABICS SHOO' }, + [0x1515] = { unicodeslot=0x1515, category='lo', description='CANADIAN SYLLABICS SHA' }, + [0x1516] = { unicodeslot=0x1516, category='lo', description='CANADIAN SYLLABICS SHAA' }, + [0x1517] = { unicodeslot=0x1517, category='lo', description='CANADIAN SYLLABICS SHWE' }, + [0x1518] = { unicodeslot=0x1518, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWE' }, + [0x1519] = { unicodeslot=0x1519, category='lo', description='CANADIAN SYLLABICS SHWI' }, + [0x151A] = { unicodeslot=0x151A, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWI' }, + [0x151B] = { unicodeslot=0x151B, category='lo', description='CANADIAN SYLLABICS SHWII' }, + [0x151C] = { unicodeslot=0x151C, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWII' }, + [0x151D] = { unicodeslot=0x151D, category='lo', description='CANADIAN SYLLABICS SHWO' }, + [0x151E] = { unicodeslot=0x151E, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWO' }, + [0x151F] = { unicodeslot=0x151F, category='lo', description='CANADIAN SYLLABICS SHWOO' }, + [0x1520] = { unicodeslot=0x1520, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWOO' }, + [0x1521] = { unicodeslot=0x1521, category='lo', description='CANADIAN SYLLABICS SHWA' }, + [0x1522] = { unicodeslot=0x1522, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWA' }, + [0x1523] = { unicodeslot=0x1523, category='lo', description='CANADIAN SYLLABICS SHWAA' }, + [0x1524] = { unicodeslot=0x1524, category='lo', description='CANADIAN SYLLABICS WEST-CREE SHWAA' }, + [0x1525] = { unicodeslot=0x1525, category='lo', description='CANADIAN SYLLABICS SH' }, + [0x1526] = { unicodeslot=0x1526, category='lo', description='CANADIAN SYLLABICS YE' }, + [0x1527] = { unicodeslot=0x1527, category='lo', description='CANADIAN SYLLABICS YAAI' }, + [0x1528] = { unicodeslot=0x1528, category='lo', description='CANADIAN SYLLABICS YI' }, + [0x1529] = { unicodeslot=0x1529, category='lo', description='CANADIAN SYLLABICS YII' }, + [0x152A] = { unicodeslot=0x152A, category='lo', description='CANADIAN SYLLABICS YO' }, + [0x152B] = { unicodeslot=0x152B, category='lo', description='CANADIAN SYLLABICS YOO' }, + [0x152C] = { unicodeslot=0x152C, category='lo', description='CANADIAN SYLLABICS Y-CREE YOO' }, + [0x152D] = { unicodeslot=0x152D, category='lo', description='CANADIAN SYLLABICS YA' }, + [0x152E] = { unicodeslot=0x152E, category='lo', description='CANADIAN SYLLABICS YAA' }, + [0x152F] = { unicodeslot=0x152F, category='lo', description='CANADIAN SYLLABICS YWE' }, + [0x1530] = { unicodeslot=0x1530, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWE' }, + [0x1531] = { unicodeslot=0x1531, category='lo', description='CANADIAN SYLLABICS YWI' }, + [0x1532] = { unicodeslot=0x1532, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWI' }, + [0x1533] = { unicodeslot=0x1533, category='lo', description='CANADIAN SYLLABICS YWII' }, + [0x1534] = { unicodeslot=0x1534, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWII' }, + [0x1535] = { unicodeslot=0x1535, category='lo', description='CANADIAN SYLLABICS YWO' }, + [0x1536] = { unicodeslot=0x1536, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWO' }, + [0x1537] = { unicodeslot=0x1537, category='lo', description='CANADIAN SYLLABICS YWOO' }, + [0x1538] = { unicodeslot=0x1538, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWOO' }, + [0x1539] = { unicodeslot=0x1539, category='lo', description='CANADIAN SYLLABICS YWA' }, + [0x153A] = { unicodeslot=0x153A, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWA' }, + [0x153B] = { unicodeslot=0x153B, category='lo', description='CANADIAN SYLLABICS YWAA' }, + [0x153C] = { unicodeslot=0x153C, category='lo', description='CANADIAN SYLLABICS WEST-CREE YWAA' }, + [0x153D] = { unicodeslot=0x153D, category='lo', description='CANADIAN SYLLABICS NASKAPI YWAA' }, + [0x153E] = { unicodeslot=0x153E, category='lo', description='CANADIAN SYLLABICS Y' }, + [0x153F] = { unicodeslot=0x153F, category='lo', description='CANADIAN SYLLABICS BIBLE-CREE Y' }, + [0x1540] = { unicodeslot=0x1540, category='lo', description='CANADIAN SYLLABICS WEST-CREE Y' }, + [0x1541] = { unicodeslot=0x1541, category='lo', description='CANADIAN SYLLABICS SAYISI YI' }, + [0x1542] = { unicodeslot=0x1542, category='lo', description='CANADIAN SYLLABICS RE' }, + [0x1543] = { unicodeslot=0x1543, category='lo', description='CANADIAN SYLLABICS R-CREE RE' }, + [0x1544] = { unicodeslot=0x1544, category='lo', description='CANADIAN SYLLABICS WEST-CREE LE' }, + [0x1545] = { unicodeslot=0x1545, category='lo', description='CANADIAN SYLLABICS RAAI' }, + [0x1546] = { unicodeslot=0x1546, category='lo', description='CANADIAN SYLLABICS RI' }, + [0x1547] = { unicodeslot=0x1547, category='lo', description='CANADIAN SYLLABICS RII' }, + [0x1548] = { unicodeslot=0x1548, category='lo', description='CANADIAN SYLLABICS RO' }, + [0x1549] = { unicodeslot=0x1549, category='lo', description='CANADIAN SYLLABICS ROO' }, + [0x154A] = { unicodeslot=0x154A, category='lo', description='CANADIAN SYLLABICS WEST-CREE LO' }, + [0x154B] = { unicodeslot=0x154B, category='lo', description='CANADIAN SYLLABICS RA' }, + [0x154C] = { unicodeslot=0x154C, category='lo', description='CANADIAN SYLLABICS RAA' }, + [0x154D] = { unicodeslot=0x154D, category='lo', description='CANADIAN SYLLABICS WEST-CREE LA' }, + [0x154E] = { unicodeslot=0x154E, category='lo', description='CANADIAN SYLLABICS RWAA' }, + [0x154F] = { unicodeslot=0x154F, category='lo', description='CANADIAN SYLLABICS WEST-CREE RWAA' }, + [0x1550] = { unicodeslot=0x1550, category='lo', description='CANADIAN SYLLABICS R' }, + [0x1551] = { unicodeslot=0x1551, category='lo', description='CANADIAN SYLLABICS WEST-CREE R' }, + [0x1552] = { unicodeslot=0x1552, category='lo', description='CANADIAN SYLLABICS MEDIAL R' }, + [0x1553] = { unicodeslot=0x1553, category='lo', description='CANADIAN SYLLABICS FE' }, + [0x1554] = { unicodeslot=0x1554, category='lo', description='CANADIAN SYLLABICS FAAI' }, + [0x1555] = { unicodeslot=0x1555, category='lo', description='CANADIAN SYLLABICS FI' }, + [0x1556] = { unicodeslot=0x1556, category='lo', description='CANADIAN SYLLABICS FII' }, + [0x1557] = { unicodeslot=0x1557, category='lo', description='CANADIAN SYLLABICS FO' }, + [0x1558] = { unicodeslot=0x1558, category='lo', description='CANADIAN SYLLABICS FOO' }, + [0x1559] = { unicodeslot=0x1559, category='lo', description='CANADIAN SYLLABICS FA' }, + [0x155A] = { unicodeslot=0x155A, category='lo', description='CANADIAN SYLLABICS FAA' }, + [0x155B] = { unicodeslot=0x155B, category='lo', description='CANADIAN SYLLABICS FWAA' }, + [0x155C] = { unicodeslot=0x155C, category='lo', description='CANADIAN SYLLABICS WEST-CREE FWAA' }, + [0x155D] = { unicodeslot=0x155D, category='lo', description='CANADIAN SYLLABICS F' }, + [0x155E] = { unicodeslot=0x155E, category='lo', description='CANADIAN SYLLABICS THE' }, + [0x155F] = { unicodeslot=0x155F, category='lo', description='CANADIAN SYLLABICS N-CREE THE' }, + [0x1560] = { unicodeslot=0x1560, category='lo', description='CANADIAN SYLLABICS THI' }, + [0x1561] = { unicodeslot=0x1561, category='lo', description='CANADIAN SYLLABICS N-CREE THI' }, + [0x1562] = { unicodeslot=0x1562, category='lo', description='CANADIAN SYLLABICS THII' }, + [0x1563] = { unicodeslot=0x1563, category='lo', description='CANADIAN SYLLABICS N-CREE THII' }, + [0x1564] = { unicodeslot=0x1564, category='lo', description='CANADIAN SYLLABICS THO' }, + [0x1565] = { unicodeslot=0x1565, category='lo', description='CANADIAN SYLLABICS THOO' }, + [0x1566] = { unicodeslot=0x1566, category='lo', description='CANADIAN SYLLABICS THA' }, + [0x1567] = { unicodeslot=0x1567, category='lo', description='CANADIAN SYLLABICS THAA' }, + [0x1568] = { unicodeslot=0x1568, category='lo', description='CANADIAN SYLLABICS THWAA' }, + [0x1569] = { unicodeslot=0x1569, category='lo', description='CANADIAN SYLLABICS WEST-CREE THWAA' }, + [0x156A] = { unicodeslot=0x156A, category='lo', description='CANADIAN SYLLABICS TH' }, + [0x156B] = { unicodeslot=0x156B, category='lo', description='CANADIAN SYLLABICS TTHE' }, + [0x156C] = { unicodeslot=0x156C, category='lo', description='CANADIAN SYLLABICS TTHI' }, + [0x156D] = { unicodeslot=0x156D, category='lo', description='CANADIAN SYLLABICS TTHO' }, + [0x156E] = { unicodeslot=0x156E, category='lo', description='CANADIAN SYLLABICS TTHA' }, + [0x156F] = { unicodeslot=0x156F, category='lo', description='CANADIAN SYLLABICS TTH' }, + [0x1570] = { unicodeslot=0x1570, category='lo', description='CANADIAN SYLLABICS TYE' }, + [0x1571] = { unicodeslot=0x1571, category='lo', description='CANADIAN SYLLABICS TYI' }, + [0x1572] = { unicodeslot=0x1572, category='lo', description='CANADIAN SYLLABICS TYO' }, + [0x1573] = { unicodeslot=0x1573, category='lo', description='CANADIAN SYLLABICS TYA' }, + [0x1574] = { unicodeslot=0x1574, category='lo', description='CANADIAN SYLLABICS NUNAVIK HE' }, + [0x1575] = { unicodeslot=0x1575, category='lo', description='CANADIAN SYLLABICS NUNAVIK HI' }, + [0x1576] = { unicodeslot=0x1576, category='lo', description='CANADIAN SYLLABICS NUNAVIK HII' }, + [0x1577] = { unicodeslot=0x1577, category='lo', description='CANADIAN SYLLABICS NUNAVIK HO' }, + [0x1578] = { unicodeslot=0x1578, category='lo', description='CANADIAN SYLLABICS NUNAVIK HOO' }, + [0x1579] = { unicodeslot=0x1579, category='lo', description='CANADIAN SYLLABICS NUNAVIK HA' }, + [0x157A] = { unicodeslot=0x157A, category='lo', description='CANADIAN SYLLABICS NUNAVIK HAA' }, + [0x157B] = { unicodeslot=0x157B, category='lo', description='CANADIAN SYLLABICS NUNAVIK H' }, + [0x157C] = { unicodeslot=0x157C, category='lo', description='CANADIAN SYLLABICS NUNAVUT H' }, + [0x157D] = { unicodeslot=0x157D, category='lo', description='CANADIAN SYLLABICS HK' }, + [0x157E] = { unicodeslot=0x157E, category='lo', description='CANADIAN SYLLABICS QAAI' }, + [0x157F] = { unicodeslot=0x157F, category='lo', description='CANADIAN SYLLABICS QI' }, + [0x1580] = { unicodeslot=0x1580, category='lo', description='CANADIAN SYLLABICS QII' }, + [0x1581] = { unicodeslot=0x1581, category='lo', description='CANADIAN SYLLABICS QO' }, + [0x1582] = { unicodeslot=0x1582, category='lo', description='CANADIAN SYLLABICS QOO' }, + [0x1583] = { unicodeslot=0x1583, category='lo', description='CANADIAN SYLLABICS QA' }, + [0x1584] = { unicodeslot=0x1584, category='lo', description='CANADIAN SYLLABICS QAA' }, + [0x1585] = { unicodeslot=0x1585, category='lo', description='CANADIAN SYLLABICS Q' }, + [0x1586] = { unicodeslot=0x1586, category='lo', description='CANADIAN SYLLABICS TLHE' }, + [0x1587] = { unicodeslot=0x1587, category='lo', description='CANADIAN SYLLABICS TLHI' }, + [0x1588] = { unicodeslot=0x1588, category='lo', description='CANADIAN SYLLABICS TLHO' }, + [0x1589] = { unicodeslot=0x1589, category='lo', description='CANADIAN SYLLABICS TLHA' }, + [0x158A] = { unicodeslot=0x158A, category='lo', description='CANADIAN SYLLABICS WEST-CREE RE' }, + [0x158B] = { unicodeslot=0x158B, category='lo', description='CANADIAN SYLLABICS WEST-CREE RI' }, + [0x158C] = { unicodeslot=0x158C, category='lo', description='CANADIAN SYLLABICS WEST-CREE RO' }, + [0x158D] = { unicodeslot=0x158D, category='lo', description='CANADIAN SYLLABICS WEST-CREE RA' }, + [0x158E] = { unicodeslot=0x158E, category='lo', description='CANADIAN SYLLABICS NGAAI' }, + [0x158F] = { unicodeslot=0x158F, category='lo', description='CANADIAN SYLLABICS NGI' }, + [0x1590] = { unicodeslot=0x1590, category='lo', description='CANADIAN SYLLABICS NGII' }, + [0x1591] = { unicodeslot=0x1591, category='lo', description='CANADIAN SYLLABICS NGO' }, + [0x1592] = { unicodeslot=0x1592, category='lo', description='CANADIAN SYLLABICS NGOO' }, + [0x1593] = { unicodeslot=0x1593, category='lo', description='CANADIAN SYLLABICS NGA' }, + [0x1594] = { unicodeslot=0x1594, category='lo', description='CANADIAN SYLLABICS NGAA' }, + [0x1595] = { unicodeslot=0x1595, category='lo', description='CANADIAN SYLLABICS NG' }, + [0x1596] = { unicodeslot=0x1596, category='lo', description='CANADIAN SYLLABICS NNG' }, + [0x1597] = { unicodeslot=0x1597, category='lo', description='CANADIAN SYLLABICS SAYISI SHE' }, + [0x1598] = { unicodeslot=0x1598, category='lo', description='CANADIAN SYLLABICS SAYISI SHI' }, + [0x1599] = { unicodeslot=0x1599, category='lo', description='CANADIAN SYLLABICS SAYISI SHO' }, + [0x159A] = { unicodeslot=0x159A, category='lo', description='CANADIAN SYLLABICS SAYISI SHA' }, + [0x159B] = { unicodeslot=0x159B, category='lo', description='CANADIAN SYLLABICS WOODS-CREE THE' }, + [0x159C] = { unicodeslot=0x159C, category='lo', description='CANADIAN SYLLABICS WOODS-CREE THI' }, + [0x159D] = { unicodeslot=0x159D, category='lo', description='CANADIAN SYLLABICS WOODS-CREE THO' }, + [0x159E] = { unicodeslot=0x159E, category='lo', description='CANADIAN SYLLABICS WOODS-CREE THA' }, + [0x159F] = { unicodeslot=0x159F, category='lo', description='CANADIAN SYLLABICS WOODS-CREE TH' }, + [0x15A0] = { unicodeslot=0x15A0, category='lo', description='CANADIAN SYLLABICS LHI' }, + [0x15A1] = { unicodeslot=0x15A1, category='lo', description='CANADIAN SYLLABICS LHII' }, + [0x15A2] = { unicodeslot=0x15A2, category='lo', description='CANADIAN SYLLABICS LHO' }, + [0x15A3] = { unicodeslot=0x15A3, category='lo', description='CANADIAN SYLLABICS LHOO' }, + [0x15A4] = { unicodeslot=0x15A4, category='lo', description='CANADIAN SYLLABICS LHA' }, + [0x15A5] = { unicodeslot=0x15A5, category='lo', description='CANADIAN SYLLABICS LHAA' }, + [0x15A6] = { unicodeslot=0x15A6, category='lo', description='CANADIAN SYLLABICS LH' }, + [0x15A7] = { unicodeslot=0x15A7, category='lo', description='CANADIAN SYLLABICS TH-CREE THE' }, + [0x15A8] = { unicodeslot=0x15A8, category='lo', description='CANADIAN SYLLABICS TH-CREE THI' }, + [0x15A9] = { unicodeslot=0x15A9, category='lo', description='CANADIAN SYLLABICS TH-CREE THII' }, + [0x15AA] = { unicodeslot=0x15AA, category='lo', description='CANADIAN SYLLABICS TH-CREE THO' }, + [0x15AB] = { unicodeslot=0x15AB, category='lo', description='CANADIAN SYLLABICS TH-CREE THOO' }, + [0x15AC] = { unicodeslot=0x15AC, category='lo', description='CANADIAN SYLLABICS TH-CREE THA' }, + [0x15AD] = { unicodeslot=0x15AD, category='lo', description='CANADIAN SYLLABICS TH-CREE THAA' }, + [0x15AE] = { unicodeslot=0x15AE, category='lo', description='CANADIAN SYLLABICS TH-CREE TH' }, + [0x15AF] = { unicodeslot=0x15AF, category='lo', description='CANADIAN SYLLABICS AIVILIK B' }, + [0x15B0] = { unicodeslot=0x15B0, category='lo', description='CANADIAN SYLLABICS BLACKFOOT E' }, + [0x15B1] = { unicodeslot=0x15B1, category='lo', description='CANADIAN SYLLABICS BLACKFOOT I' }, + [0x15B2] = { unicodeslot=0x15B2, category='lo', description='CANADIAN SYLLABICS BLACKFOOT O' }, + [0x15B3] = { unicodeslot=0x15B3, category='lo', description='CANADIAN SYLLABICS BLACKFOOT A' }, + [0x15B4] = { unicodeslot=0x15B4, category='lo', description='CANADIAN SYLLABICS BLACKFOOT WE' }, + [0x15B5] = { unicodeslot=0x15B5, category='lo', description='CANADIAN SYLLABICS BLACKFOOT WI' }, + [0x15B6] = { unicodeslot=0x15B6, category='lo', description='CANADIAN SYLLABICS BLACKFOOT WO' }, + [0x15B7] = { unicodeslot=0x15B7, category='lo', description='CANADIAN SYLLABICS BLACKFOOT WA' }, + [0x15B8] = { unicodeslot=0x15B8, category='lo', description='CANADIAN SYLLABICS BLACKFOOT NE' }, + [0x15B9] = { unicodeslot=0x15B9, category='lo', description='CANADIAN SYLLABICS BLACKFOOT NI' }, + [0x15BA] = { unicodeslot=0x15BA, category='lo', description='CANADIAN SYLLABICS BLACKFOOT NO' }, + [0x15BB] = { unicodeslot=0x15BB, category='lo', description='CANADIAN SYLLABICS BLACKFOOT NA' }, + [0x15BC] = { unicodeslot=0x15BC, category='lo', description='CANADIAN SYLLABICS BLACKFOOT KE' }, + [0x15BD] = { unicodeslot=0x15BD, category='lo', description='CANADIAN SYLLABICS BLACKFOOT KI' }, + [0x15BE] = { unicodeslot=0x15BE, category='lo', description='CANADIAN SYLLABICS BLACKFOOT KO' }, + [0x15BF] = { unicodeslot=0x15BF, category='lo', description='CANADIAN SYLLABICS BLACKFOOT KA' }, + [0x15C0] = { unicodeslot=0x15C0, category='lo', description='CANADIAN SYLLABICS SAYISI HE' }, + [0x15C1] = { unicodeslot=0x15C1, category='lo', description='CANADIAN SYLLABICS SAYISI HI' }, + [0x15C2] = { unicodeslot=0x15C2, category='lo', description='CANADIAN SYLLABICS SAYISI HO' }, + [0x15C3] = { unicodeslot=0x15C3, category='lo', description='CANADIAN SYLLABICS SAYISI HA' }, + [0x15C4] = { unicodeslot=0x15C4, category='lo', description='CANADIAN SYLLABICS CARRIER GHU' }, + [0x15C5] = { unicodeslot=0x15C5, category='lo', description='CANADIAN SYLLABICS CARRIER GHO' }, + [0x15C6] = { unicodeslot=0x15C6, category='lo', description='CANADIAN SYLLABICS CARRIER GHE' }, + [0x15C7] = { unicodeslot=0x15C7, category='lo', description='CANADIAN SYLLABICS CARRIER GHEE' }, + [0x15C8] = { unicodeslot=0x15C8, category='lo', description='CANADIAN SYLLABICS CARRIER GHI' }, + [0x15C9] = { unicodeslot=0x15C9, category='lo', description='CANADIAN SYLLABICS CARRIER GHA' }, + [0x15CA] = { unicodeslot=0x15CA, category='lo', description='CANADIAN SYLLABICS CARRIER RU' }, + [0x15CB] = { unicodeslot=0x15CB, category='lo', description='CANADIAN SYLLABICS CARRIER RO' }, + [0x15CC] = { unicodeslot=0x15CC, category='lo', description='CANADIAN SYLLABICS CARRIER RE' }, + [0x15CD] = { unicodeslot=0x15CD, category='lo', description='CANADIAN SYLLABICS CARRIER REE' }, + [0x15CE] = { unicodeslot=0x15CE, category='lo', description='CANADIAN SYLLABICS CARRIER RI' }, + [0x15CF] = { unicodeslot=0x15CF, category='lo', description='CANADIAN SYLLABICS CARRIER RA' }, + [0x15D0] = { unicodeslot=0x15D0, category='lo', description='CANADIAN SYLLABICS CARRIER WU' }, + [0x15D1] = { unicodeslot=0x15D1, category='lo', description='CANADIAN SYLLABICS CARRIER WO' }, + [0x15D2] = { unicodeslot=0x15D2, category='lo', description='CANADIAN SYLLABICS CARRIER WE' }, + [0x15D3] = { unicodeslot=0x15D3, category='lo', description='CANADIAN SYLLABICS CARRIER WEE' }, + [0x15D4] = { unicodeslot=0x15D4, category='lo', description='CANADIAN SYLLABICS CARRIER WI' }, + [0x15D5] = { unicodeslot=0x15D5, category='lo', description='CANADIAN SYLLABICS CARRIER WA' }, + [0x15D6] = { unicodeslot=0x15D6, category='lo', description='CANADIAN SYLLABICS CARRIER HWU' }, + [0x15D7] = { unicodeslot=0x15D7, category='lo', description='CANADIAN SYLLABICS CARRIER HWO' }, + [0x15D8] = { unicodeslot=0x15D8, category='lo', description='CANADIAN SYLLABICS CARRIER HWE' }, + [0x15D9] = { unicodeslot=0x15D9, category='lo', description='CANADIAN SYLLABICS CARRIER HWEE' }, + [0x15DA] = { unicodeslot=0x15DA, category='lo', description='CANADIAN SYLLABICS CARRIER HWI' }, + [0x15DB] = { unicodeslot=0x15DB, category='lo', description='CANADIAN SYLLABICS CARRIER HWA' }, + [0x15DC] = { unicodeslot=0x15DC, category='lo', description='CANADIAN SYLLABICS CARRIER THU' }, + [0x15DD] = { unicodeslot=0x15DD, category='lo', description='CANADIAN SYLLABICS CARRIER THO' }, + [0x15DE] = { unicodeslot=0x15DE, category='lo', description='CANADIAN SYLLABICS CARRIER THE' }, + [0x15DF] = { unicodeslot=0x15DF, category='lo', description='CANADIAN SYLLABICS CARRIER THEE' }, + [0x15E0] = { unicodeslot=0x15E0, category='lo', description='CANADIAN SYLLABICS CARRIER THI' }, + [0x15E1] = { unicodeslot=0x15E1, category='lo', description='CANADIAN SYLLABICS CARRIER THA' }, + [0x15E2] = { unicodeslot=0x15E2, category='lo', description='CANADIAN SYLLABICS CARRIER TTU' }, + [0x15E3] = { unicodeslot=0x15E3, category='lo', description='CANADIAN SYLLABICS CARRIER TTO' }, + [0x15E4] = { unicodeslot=0x15E4, category='lo', description='CANADIAN SYLLABICS CARRIER TTE' }, + [0x15E5] = { unicodeslot=0x15E5, category='lo', description='CANADIAN SYLLABICS CARRIER TTEE' }, + [0x15E6] = { unicodeslot=0x15E6, category='lo', description='CANADIAN SYLLABICS CARRIER TTI' }, + [0x15E7] = { unicodeslot=0x15E7, category='lo', description='CANADIAN SYLLABICS CARRIER TTA' }, + [0x15E8] = { unicodeslot=0x15E8, category='lo', description='CANADIAN SYLLABICS CARRIER PU' }, + [0x15E9] = { unicodeslot=0x15E9, category='lo', description='CANADIAN SYLLABICS CARRIER PO' }, + [0x15EA] = { unicodeslot=0x15EA, category='lo', description='CANADIAN SYLLABICS CARRIER PE' }, + [0x15EB] = { unicodeslot=0x15EB, category='lo', description='CANADIAN SYLLABICS CARRIER PEE' }, + [0x15EC] = { unicodeslot=0x15EC, category='lo', description='CANADIAN SYLLABICS CARRIER PI' }, + [0x15ED] = { unicodeslot=0x15ED, category='lo', description='CANADIAN SYLLABICS CARRIER PA' }, + [0x15EE] = { unicodeslot=0x15EE, category='lo', description='CANADIAN SYLLABICS CARRIER P' }, + [0x15EF] = { unicodeslot=0x15EF, category='lo', description='CANADIAN SYLLABICS CARRIER GU' }, + [0x15F0] = { unicodeslot=0x15F0, category='lo', description='CANADIAN SYLLABICS CARRIER GO' }, + [0x15F1] = { unicodeslot=0x15F1, category='lo', description='CANADIAN SYLLABICS CARRIER GE' }, + [0x15F2] = { unicodeslot=0x15F2, category='lo', description='CANADIAN SYLLABICS CARRIER GEE' }, + [0x15F3] = { unicodeslot=0x15F3, category='lo', description='CANADIAN SYLLABICS CARRIER GI' }, + [0x15F4] = { unicodeslot=0x15F4, category='lo', description='CANADIAN SYLLABICS CARRIER GA' }, + [0x15F5] = { unicodeslot=0x15F5, category='lo', description='CANADIAN SYLLABICS CARRIER KHU' }, + [0x15F6] = { unicodeslot=0x15F6, category='lo', description='CANADIAN SYLLABICS CARRIER KHO' }, + [0x15F7] = { unicodeslot=0x15F7, category='lo', description='CANADIAN SYLLABICS CARRIER KHE' }, + [0x15F8] = { unicodeslot=0x15F8, category='lo', description='CANADIAN SYLLABICS CARRIER KHEE' }, + [0x15F9] = { unicodeslot=0x15F9, category='lo', description='CANADIAN SYLLABICS CARRIER KHI' }, + [0x15FA] = { unicodeslot=0x15FA, category='lo', description='CANADIAN SYLLABICS CARRIER KHA' }, + [0x15FB] = { unicodeslot=0x15FB, category='lo', description='CANADIAN SYLLABICS CARRIER KKU' }, + [0x15FC] = { unicodeslot=0x15FC, category='lo', description='CANADIAN SYLLABICS CARRIER KKO' }, + [0x15FD] = { unicodeslot=0x15FD, category='lo', description='CANADIAN SYLLABICS CARRIER KKE' }, + [0x15FE] = { unicodeslot=0x15FE, category='lo', description='CANADIAN SYLLABICS CARRIER KKEE' }, + [0x15FF] = { unicodeslot=0x15FF, category='lo', description='CANADIAN SYLLABICS CARRIER KKI' }, + [0x1600] = { unicodeslot=0x1600, category='lo', description='CANADIAN SYLLABICS CARRIER KKA' }, + [0x1601] = { unicodeslot=0x1601, category='lo', description='CANADIAN SYLLABICS CARRIER KK' }, + [0x1602] = { unicodeslot=0x1602, category='lo', description='CANADIAN SYLLABICS CARRIER NU' }, + [0x1603] = { unicodeslot=0x1603, category='lo', description='CANADIAN SYLLABICS CARRIER NO' }, + [0x1604] = { unicodeslot=0x1604, category='lo', description='CANADIAN SYLLABICS CARRIER NE' }, + [0x1605] = { unicodeslot=0x1605, category='lo', description='CANADIAN SYLLABICS CARRIER NEE' }, + [0x1606] = { unicodeslot=0x1606, category='lo', description='CANADIAN SYLLABICS CARRIER NI' }, + [0x1607] = { unicodeslot=0x1607, category='lo', description='CANADIAN SYLLABICS CARRIER NA' }, + [0x1608] = { unicodeslot=0x1608, category='lo', description='CANADIAN SYLLABICS CARRIER MU' }, + [0x1609] = { unicodeslot=0x1609, category='lo', description='CANADIAN SYLLABICS CARRIER MO' }, + [0x160A] = { unicodeslot=0x160A, category='lo', description='CANADIAN SYLLABICS CARRIER ME' }, + [0x160B] = { unicodeslot=0x160B, category='lo', description='CANADIAN SYLLABICS CARRIER MEE' }, + [0x160C] = { unicodeslot=0x160C, category='lo', description='CANADIAN SYLLABICS CARRIER MI' }, + [0x160D] = { unicodeslot=0x160D, category='lo', description='CANADIAN SYLLABICS CARRIER MA' }, + [0x160E] = { unicodeslot=0x160E, category='lo', description='CANADIAN SYLLABICS CARRIER YU' }, + [0x160F] = { unicodeslot=0x160F, category='lo', description='CANADIAN SYLLABICS CARRIER YO' }, + [0x1610] = { unicodeslot=0x1610, category='lo', description='CANADIAN SYLLABICS CARRIER YE' }, + [0x1611] = { unicodeslot=0x1611, category='lo', description='CANADIAN SYLLABICS CARRIER YEE' }, + [0x1612] = { unicodeslot=0x1612, category='lo', description='CANADIAN SYLLABICS CARRIER YI' }, + [0x1613] = { unicodeslot=0x1613, category='lo', description='CANADIAN SYLLABICS CARRIER YA' }, + [0x1614] = { unicodeslot=0x1614, category='lo', description='CANADIAN SYLLABICS CARRIER JU' }, + [0x1615] = { unicodeslot=0x1615, category='lo', description='CANADIAN SYLLABICS SAYISI JU' }, + [0x1616] = { unicodeslot=0x1616, category='lo', description='CANADIAN SYLLABICS CARRIER JO' }, + [0x1617] = { unicodeslot=0x1617, category='lo', description='CANADIAN SYLLABICS CARRIER JE' }, + [0x1618] = { unicodeslot=0x1618, category='lo', description='CANADIAN SYLLABICS CARRIER JEE' }, + [0x1619] = { unicodeslot=0x1619, category='lo', description='CANADIAN SYLLABICS CARRIER JI' }, + [0x161A] = { unicodeslot=0x161A, category='lo', description='CANADIAN SYLLABICS SAYISI JI' }, + [0x161B] = { unicodeslot=0x161B, category='lo', description='CANADIAN SYLLABICS CARRIER JA' }, + [0x161C] = { unicodeslot=0x161C, category='lo', description='CANADIAN SYLLABICS CARRIER JJU' }, + [0x161D] = { unicodeslot=0x161D, category='lo', description='CANADIAN SYLLABICS CARRIER JJO' }, + [0x161E] = { unicodeslot=0x161E, category='lo', description='CANADIAN SYLLABICS CARRIER JJE' }, + [0x161F] = { unicodeslot=0x161F, category='lo', description='CANADIAN SYLLABICS CARRIER JJEE' }, + [0x1620] = { unicodeslot=0x1620, category='lo', description='CANADIAN SYLLABICS CARRIER JJI' }, + [0x1621] = { unicodeslot=0x1621, category='lo', description='CANADIAN SYLLABICS CARRIER JJA' }, + [0x1622] = { unicodeslot=0x1622, category='lo', description='CANADIAN SYLLABICS CARRIER LU' }, + [0x1623] = { unicodeslot=0x1623, category='lo', description='CANADIAN SYLLABICS CARRIER LO' }, + [0x1624] = { unicodeslot=0x1624, category='lo', description='CANADIAN SYLLABICS CARRIER LE' }, + [0x1625] = { unicodeslot=0x1625, category='lo', description='CANADIAN SYLLABICS CARRIER LEE' }, + [0x1626] = { unicodeslot=0x1626, category='lo', description='CANADIAN SYLLABICS CARRIER LI' }, + [0x1627] = { unicodeslot=0x1627, category='lo', description='CANADIAN SYLLABICS CARRIER LA' }, + [0x1628] = { unicodeslot=0x1628, category='lo', description='CANADIAN SYLLABICS CARRIER DLU' }, + [0x1629] = { unicodeslot=0x1629, category='lo', description='CANADIAN SYLLABICS CARRIER DLO' }, + [0x162A] = { unicodeslot=0x162A, category='lo', description='CANADIAN SYLLABICS CARRIER DLE' }, + [0x162B] = { unicodeslot=0x162B, category='lo', description='CANADIAN SYLLABICS CARRIER DLEE' }, + [0x162C] = { unicodeslot=0x162C, category='lo', description='CANADIAN SYLLABICS CARRIER DLI' }, + [0x162D] = { unicodeslot=0x162D, category='lo', description='CANADIAN SYLLABICS CARRIER DLA' }, + [0x162E] = { unicodeslot=0x162E, category='lo', description='CANADIAN SYLLABICS CARRIER LHU' }, + [0x162F] = { unicodeslot=0x162F, category='lo', description='CANADIAN SYLLABICS CARRIER LHO' }, + [0x1630] = { unicodeslot=0x1630, category='lo', description='CANADIAN SYLLABICS CARRIER LHE' }, + [0x1631] = { unicodeslot=0x1631, category='lo', description='CANADIAN SYLLABICS CARRIER LHEE' }, + [0x1632] = { unicodeslot=0x1632, category='lo', description='CANADIAN SYLLABICS CARRIER LHI' }, + [0x1633] = { unicodeslot=0x1633, category='lo', description='CANADIAN SYLLABICS CARRIER LHA' }, + [0x1634] = { unicodeslot=0x1634, category='lo', description='CANADIAN SYLLABICS CARRIER TLHU' }, + [0x1635] = { unicodeslot=0x1635, category='lo', description='CANADIAN SYLLABICS CARRIER TLHO' }, + [0x1636] = { unicodeslot=0x1636, category='lo', description='CANADIAN SYLLABICS CARRIER TLHE' }, + [0x1637] = { unicodeslot=0x1637, category='lo', description='CANADIAN SYLLABICS CARRIER TLHEE' }, + [0x1638] = { unicodeslot=0x1638, category='lo', description='CANADIAN SYLLABICS CARRIER TLHI' }, + [0x1639] = { unicodeslot=0x1639, category='lo', description='CANADIAN SYLLABICS CARRIER TLHA' }, + [0x163A] = { unicodeslot=0x163A, category='lo', description='CANADIAN SYLLABICS CARRIER TLU' }, + [0x163B] = { unicodeslot=0x163B, category='lo', description='CANADIAN SYLLABICS CARRIER TLO' }, + [0x163C] = { unicodeslot=0x163C, category='lo', description='CANADIAN SYLLABICS CARRIER TLE' }, + [0x163D] = { unicodeslot=0x163D, category='lo', description='CANADIAN SYLLABICS CARRIER TLEE' }, + [0x163E] = { unicodeslot=0x163E, category='lo', description='CANADIAN SYLLABICS CARRIER TLI' }, + [0x163F] = { unicodeslot=0x163F, category='lo', description='CANADIAN SYLLABICS CARRIER TLA' }, + [0x1640] = { unicodeslot=0x1640, category='lo', description='CANADIAN SYLLABICS CARRIER ZU' }, + [0x1641] = { unicodeslot=0x1641, category='lo', description='CANADIAN SYLLABICS CARRIER ZO' }, + [0x1642] = { unicodeslot=0x1642, category='lo', description='CANADIAN SYLLABICS CARRIER ZE' }, + [0x1643] = { unicodeslot=0x1643, category='lo', description='CANADIAN SYLLABICS CARRIER ZEE' }, + [0x1644] = { unicodeslot=0x1644, category='lo', description='CANADIAN SYLLABICS CARRIER ZI' }, + [0x1645] = { unicodeslot=0x1645, category='lo', description='CANADIAN SYLLABICS CARRIER ZA' }, + [0x1646] = { unicodeslot=0x1646, category='lo', description='CANADIAN SYLLABICS CARRIER Z' }, + [0x1647] = { unicodeslot=0x1647, category='lo', description='CANADIAN SYLLABICS CARRIER INITIAL Z' }, + [0x1648] = { unicodeslot=0x1648, category='lo', description='CANADIAN SYLLABICS CARRIER DZU' }, + [0x1649] = { unicodeslot=0x1649, category='lo', description='CANADIAN SYLLABICS CARRIER DZO' }, + [0x164A] = { unicodeslot=0x164A, category='lo', description='CANADIAN SYLLABICS CARRIER DZE' }, + [0x164B] = { unicodeslot=0x164B, category='lo', description='CANADIAN SYLLABICS CARRIER DZEE' }, + [0x164C] = { unicodeslot=0x164C, category='lo', description='CANADIAN SYLLABICS CARRIER DZI' }, + [0x164D] = { unicodeslot=0x164D, category='lo', description='CANADIAN SYLLABICS CARRIER DZA' }, + [0x164E] = { unicodeslot=0x164E, category='lo', description='CANADIAN SYLLABICS CARRIER SU' }, + [0x164F] = { unicodeslot=0x164F, category='lo', description='CANADIAN SYLLABICS CARRIER SO' }, + [0x1650] = { unicodeslot=0x1650, category='lo', description='CANADIAN SYLLABICS CARRIER SE' }, + [0x1651] = { unicodeslot=0x1651, category='lo', description='CANADIAN SYLLABICS CARRIER SEE' }, + [0x1652] = { unicodeslot=0x1652, category='lo', description='CANADIAN SYLLABICS CARRIER SI' }, + [0x1653] = { unicodeslot=0x1653, category='lo', description='CANADIAN SYLLABICS CARRIER SA' }, + [0x1654] = { unicodeslot=0x1654, category='lo', description='CANADIAN SYLLABICS CARRIER SHU' }, + [0x1655] = { unicodeslot=0x1655, category='lo', description='CANADIAN SYLLABICS CARRIER SHO' }, + [0x1656] = { unicodeslot=0x1656, category='lo', description='CANADIAN SYLLABICS CARRIER SHE' }, + [0x1657] = { unicodeslot=0x1657, category='lo', description='CANADIAN SYLLABICS CARRIER SHEE' }, + [0x1658] = { unicodeslot=0x1658, category='lo', description='CANADIAN SYLLABICS CARRIER SHI' }, + [0x1659] = { unicodeslot=0x1659, category='lo', description='CANADIAN SYLLABICS CARRIER SHA' }, + [0x165A] = { unicodeslot=0x165A, category='lo', description='CANADIAN SYLLABICS CARRIER SH' }, + [0x165B] = { unicodeslot=0x165B, category='lo', description='CANADIAN SYLLABICS CARRIER TSU' }, + [0x165C] = { unicodeslot=0x165C, category='lo', description='CANADIAN SYLLABICS CARRIER TSO' }, + [0x165D] = { unicodeslot=0x165D, category='lo', description='CANADIAN SYLLABICS CARRIER TSE' }, + [0x165E] = { unicodeslot=0x165E, category='lo', description='CANADIAN SYLLABICS CARRIER TSEE' }, + [0x165F] = { unicodeslot=0x165F, category='lo', description='CANADIAN SYLLABICS CARRIER TSI' }, + [0x1660] = { unicodeslot=0x1660, category='lo', description='CANADIAN SYLLABICS CARRIER TSA' }, + [0x1661] = { unicodeslot=0x1661, category='lo', description='CANADIAN SYLLABICS CARRIER CHU' }, + [0x1662] = { unicodeslot=0x1662, category='lo', description='CANADIAN SYLLABICS CARRIER CHO' }, + [0x1663] = { unicodeslot=0x1663, category='lo', description='CANADIAN SYLLABICS CARRIER CHE' }, + [0x1664] = { unicodeslot=0x1664, category='lo', description='CANADIAN SYLLABICS CARRIER CHEE' }, + [0x1665] = { unicodeslot=0x1665, category='lo', description='CANADIAN SYLLABICS CARRIER CHI' }, + [0x1666] = { unicodeslot=0x1666, category='lo', description='CANADIAN SYLLABICS CARRIER CHA' }, + [0x1667] = { unicodeslot=0x1667, category='lo', description='CANADIAN SYLLABICS CARRIER TTSU' }, + [0x1668] = { unicodeslot=0x1668, category='lo', description='CANADIAN SYLLABICS CARRIER TTSO' }, + [0x1669] = { unicodeslot=0x1669, category='lo', description='CANADIAN SYLLABICS CARRIER TTSE' }, + [0x166A] = { unicodeslot=0x166A, category='lo', description='CANADIAN SYLLABICS CARRIER TTSEE' }, + [0x166B] = { unicodeslot=0x166B, category='lo', description='CANADIAN SYLLABICS CARRIER TTSI' }, + [0x166C] = { unicodeslot=0x166C, category='lo', description='CANADIAN SYLLABICS CARRIER TTSA' }, + [0x166D] = { unicodeslot=0x166D, category='po', description='CANADIAN SYLLABICS CHI SIGN' }, + [0x166E] = { unicodeslot=0x166E, category='po', description='CANADIAN SYLLABICS FULL STOP' }, + [0x166F] = { unicodeslot=0x166F, category='lo', description='CANADIAN SYLLABICS QAI' }, + [0x1670] = { unicodeslot=0x1670, category='lo', description='CANADIAN SYLLABICS NGAI' }, + [0x1671] = { unicodeslot=0x1671, category='lo', description='CANADIAN SYLLABICS NNGI' }, + [0x1672] = { unicodeslot=0x1672, category='lo', description='CANADIAN SYLLABICS NNGII' }, + [0x1673] = { unicodeslot=0x1673, category='lo', description='CANADIAN SYLLABICS NNGO' }, + [0x1674] = { unicodeslot=0x1674, category='lo', description='CANADIAN SYLLABICS NNGOO' }, + [0x1675] = { unicodeslot=0x1675, category='lo', description='CANADIAN SYLLABICS NNGA' }, + [0x1676] = { unicodeslot=0x1676, category='lo', description='CANADIAN SYLLABICS NNGAA' }, + [0x1680] = { unicodeslot=0x1680, category='zs', description='OGHAM SPACE MARK' }, + [0x1681] = { unicodeslot=0x1681, category='lo', description='OGHAM LETTER BEITH' }, + [0x1682] = { unicodeslot=0x1682, category='lo', description='OGHAM LETTER LUIS' }, + [0x1683] = { unicodeslot=0x1683, category='lo', description='OGHAM LETTER FEARN' }, + [0x1684] = { unicodeslot=0x1684, category='lo', description='OGHAM LETTER SAIL' }, + [0x1685] = { unicodeslot=0x1685, category='lo', description='OGHAM LETTER NION' }, + [0x1686] = { unicodeslot=0x1686, category='lo', description='OGHAM LETTER UATH' }, + [0x1687] = { unicodeslot=0x1687, category='lo', description='OGHAM LETTER DAIR' }, + [0x1688] = { unicodeslot=0x1688, category='lo', description='OGHAM LETTER TINNE' }, + [0x1689] = { unicodeslot=0x1689, category='lo', description='OGHAM LETTER COLL' }, + [0x168A] = { unicodeslot=0x168A, category='lo', description='OGHAM LETTER CEIRT' }, + [0x168B] = { unicodeslot=0x168B, category='lo', description='OGHAM LETTER MUIN' }, + [0x168C] = { unicodeslot=0x168C, category='lo', description='OGHAM LETTER GORT' }, + [0x168D] = { unicodeslot=0x168D, category='lo', description='OGHAM LETTER NGEADAL' }, + [0x168E] = { unicodeslot=0x168E, category='lo', description='OGHAM LETTER STRAIF' }, + [0x168F] = { unicodeslot=0x168F, category='lo', description='OGHAM LETTER RUIS' }, + [0x1690] = { unicodeslot=0x1690, category='lo', description='OGHAM LETTER AILM' }, + [0x1691] = { unicodeslot=0x1691, category='lo', description='OGHAM LETTER ONN' }, + [0x1692] = { unicodeslot=0x1692, category='lo', description='OGHAM LETTER UR' }, + [0x1693] = { unicodeslot=0x1693, category='lo', description='OGHAM LETTER EADHADH' }, + [0x1694] = { unicodeslot=0x1694, category='lo', description='OGHAM LETTER IODHADH' }, + [0x1695] = { unicodeslot=0x1695, category='lo', description='OGHAM LETTER EABHADH' }, + [0x1696] = { unicodeslot=0x1696, category='lo', description='OGHAM LETTER OR' }, + [0x1697] = { unicodeslot=0x1697, category='lo', description='OGHAM LETTER UILLEANN' }, + [0x1698] = { unicodeslot=0x1698, category='lo', description='OGHAM LETTER IFIN' }, + [0x1699] = { unicodeslot=0x1699, category='lo', description='OGHAM LETTER EAMHANCHOLL' }, + [0x169A] = { unicodeslot=0x169A, category='lo', description='OGHAM LETTER PEITH' }, + [0x169B] = { unicodeslot=0x169B, category='ps', description='OGHAM FEATHER MARK' }, + [0x169C] = { unicodeslot=0x169C, category='pe', description='OGHAM REVERSED FEATHER MARK' }, + [0x16A0] = { unicodeslot=0x16A0, category='lo', description='RUNIC LETTER FEHU FEOH FE F' }, + [0x16A1] = { unicodeslot=0x16A1, category='lo', description='RUNIC LETTER V' }, + [0x16A2] = { unicodeslot=0x16A2, category='lo', description='RUNIC LETTER URUZ UR U' }, + [0x16A3] = { unicodeslot=0x16A3, category='lo', description='RUNIC LETTER YR' }, + [0x16A4] = { unicodeslot=0x16A4, category='lo', description='RUNIC LETTER Y' }, + [0x16A5] = { unicodeslot=0x16A5, category='lo', description='RUNIC LETTER W' }, + [0x16A6] = { unicodeslot=0x16A6, category='lo', description='RUNIC LETTER THURISAZ THURS THORN' }, + [0x16A7] = { unicodeslot=0x16A7, category='lo', description='RUNIC LETTER ETH' }, + [0x16A8] = { unicodeslot=0x16A8, category='lo', description='RUNIC LETTER ANSUZ A' }, + [0x16A9] = { unicodeslot=0x16A9, category='lo', description='RUNIC LETTER OS O' }, + [0x16AA] = { unicodeslot=0x16AA, category='lo', description='RUNIC LETTER AC A' }, + [0x16AB] = { unicodeslot=0x16AB, category='lo', description='RUNIC LETTER AESC' }, + [0x16AC] = { unicodeslot=0x16AC, category='lo', description='RUNIC LETTER LONG-BRANCH-OSS O' }, + [0x16AD] = { unicodeslot=0x16AD, category='lo', description='RUNIC LETTER SHORT-TWIG-OSS O' }, + [0x16AE] = { unicodeslot=0x16AE, category='lo', description='RUNIC LETTER O' }, + [0x16AF] = { unicodeslot=0x16AF, category='lo', description='RUNIC LETTER OE' }, + [0x16B0] = { unicodeslot=0x16B0, category='lo', description='RUNIC LETTER ON' }, + [0x16B1] = { unicodeslot=0x16B1, category='lo', description='RUNIC LETTER RAIDO RAD REID R' }, + [0x16B2] = { unicodeslot=0x16B2, category='lo', description='RUNIC LETTER KAUNA' }, + [0x16B3] = { unicodeslot=0x16B3, category='lo', description='RUNIC LETTER CEN' }, + [0x16B4] = { unicodeslot=0x16B4, category='lo', description='RUNIC LETTER KAUN K' }, + [0x16B5] = { unicodeslot=0x16B5, category='lo', description='RUNIC LETTER G' }, + [0x16B6] = { unicodeslot=0x16B6, category='lo', description='RUNIC LETTER ENG' }, + [0x16B7] = { unicodeslot=0x16B7, category='lo', description='RUNIC LETTER GEBO GYFU G' }, + [0x16B8] = { unicodeslot=0x16B8, category='lo', description='RUNIC LETTER GAR' }, + [0x16B9] = { unicodeslot=0x16B9, category='lo', description='RUNIC LETTER WUNJO WYNN W' }, + [0x16BA] = { unicodeslot=0x16BA, category='lo', description='RUNIC LETTER HAGLAZ H' }, + [0x16BB] = { unicodeslot=0x16BB, category='lo', description='RUNIC LETTER HAEGL H' }, + [0x16BC] = { unicodeslot=0x16BC, category='lo', description='RUNIC LETTER LONG-BRANCH-HAGALL H' }, + [0x16BD] = { unicodeslot=0x16BD, category='lo', description='RUNIC LETTER SHORT-TWIG-HAGALL H' }, + [0x16BE] = { unicodeslot=0x16BE, category='lo', description='RUNIC LETTER NAUDIZ NYD NAUD N' }, + [0x16BF] = { unicodeslot=0x16BF, category='lo', description='RUNIC LETTER SHORT-TWIG-NAUD N' }, + [0x16C0] = { unicodeslot=0x16C0, category='lo', description='RUNIC LETTER DOTTED-N' }, + [0x16C1] = { unicodeslot=0x16C1, category='lo', description='RUNIC LETTER ISAZ IS ISS I' }, + [0x16C2] = { unicodeslot=0x16C2, category='lo', description='RUNIC LETTER E' }, + [0x16C3] = { unicodeslot=0x16C3, category='lo', description='RUNIC LETTER JERAN J' }, + [0x16C4] = { unicodeslot=0x16C4, category='lo', description='RUNIC LETTER GER' }, + [0x16C5] = { unicodeslot=0x16C5, category='lo', description='RUNIC LETTER LONG-BRANCH-AR AE' }, + [0x16C6] = { unicodeslot=0x16C6, category='lo', description='RUNIC LETTER SHORT-TWIG-AR A' }, + [0x16C7] = { unicodeslot=0x16C7, category='lo', description='RUNIC LETTER IWAZ EOH' }, + [0x16C8] = { unicodeslot=0x16C8, category='lo', description='RUNIC LETTER PERTHO PEORTH P' }, + [0x16C9] = { unicodeslot=0x16C9, category='lo', description='RUNIC LETTER ALGIZ EOLHX' }, + [0x16CA] = { unicodeslot=0x16CA, category='lo', description='RUNIC LETTER SOWILO S' }, + [0x16CB] = { unicodeslot=0x16CB, category='lo', description='RUNIC LETTER SIGEL LONG-BRANCH-SOL S' }, + [0x16CC] = { unicodeslot=0x16CC, category='lo', description='RUNIC LETTER SHORT-TWIG-SOL S' }, + [0x16CD] = { unicodeslot=0x16CD, category='lo', description='RUNIC LETTER C' }, + [0x16CE] = { unicodeslot=0x16CE, category='lo', description='RUNIC LETTER Z' }, + [0x16CF] = { unicodeslot=0x16CF, category='lo', description='RUNIC LETTER TIWAZ TIR TYR T' }, + [0x16D0] = { unicodeslot=0x16D0, category='lo', description='RUNIC LETTER SHORT-TWIG-TYR T' }, + [0x16D1] = { unicodeslot=0x16D1, category='lo', description='RUNIC LETTER D' }, + [0x16D2] = { unicodeslot=0x16D2, category='lo', description='RUNIC LETTER BERKANAN BEORC BJARKAN B' }, + [0x16D3] = { unicodeslot=0x16D3, category='lo', description='RUNIC LETTER SHORT-TWIG-BJARKAN B' }, + [0x16D4] = { unicodeslot=0x16D4, category='lo', description='RUNIC LETTER DOTTED-P' }, + [0x16D5] = { unicodeslot=0x16D5, category='lo', description='RUNIC LETTER OPEN-P' }, + [0x16D6] = { unicodeslot=0x16D6, category='lo', description='RUNIC LETTER EHWAZ EH E' }, + [0x16D7] = { unicodeslot=0x16D7, category='lo', description='RUNIC LETTER MANNAZ MAN M' }, + [0x16D8] = { unicodeslot=0x16D8, category='lo', description='RUNIC LETTER LONG-BRANCH-MADR M' }, + [0x16D9] = { unicodeslot=0x16D9, category='lo', description='RUNIC LETTER SHORT-TWIG-MADR M' }, + [0x16DA] = { unicodeslot=0x16DA, category='lo', description='RUNIC LETTER LAUKAZ LAGU LOGR L' }, + [0x16DB] = { unicodeslot=0x16DB, category='lo', description='RUNIC LETTER DOTTED-L' }, + [0x16DC] = { unicodeslot=0x16DC, category='lo', description='RUNIC LETTER INGWAZ' }, + [0x16DD] = { unicodeslot=0x16DD, category='lo', description='RUNIC LETTER ING' }, + [0x16DE] = { unicodeslot=0x16DE, category='lo', description='RUNIC LETTER DAGAZ DAEG D' }, + [0x16DF] = { unicodeslot=0x16DF, category='lo', description='RUNIC LETTER OTHALAN ETHEL O' }, + [0x16E0] = { unicodeslot=0x16E0, category='lo', description='RUNIC LETTER EAR' }, + [0x16E1] = { unicodeslot=0x16E1, category='lo', description='RUNIC LETTER IOR' }, + [0x16E2] = { unicodeslot=0x16E2, category='lo', description='RUNIC LETTER CWEORTH' }, + [0x16E3] = { unicodeslot=0x16E3, category='lo', description='RUNIC LETTER CALC' }, + [0x16E4] = { unicodeslot=0x16E4, category='lo', description='RUNIC LETTER CEALC' }, + [0x16E5] = { unicodeslot=0x16E5, category='lo', description='RUNIC LETTER STAN' }, + [0x16E6] = { unicodeslot=0x16E6, category='lo', description='RUNIC LETTER LONG-BRANCH-YR' }, + [0x16E7] = { unicodeslot=0x16E7, category='lo', description='RUNIC LETTER SHORT-TWIG-YR' }, + [0x16E8] = { unicodeslot=0x16E8, category='lo', description='RUNIC LETTER ICELANDIC-YR' }, + [0x16E9] = { unicodeslot=0x16E9, category='lo', description='RUNIC LETTER Q' }, + [0x16EA] = { unicodeslot=0x16EA, category='lo', description='RUNIC LETTER X' }, + [0x16EB] = { unicodeslot=0x16EB, category='po', description='RUNIC SINGLE PUNCTUATION' }, + [0x16EC] = { unicodeslot=0x16EC, category='po', description='RUNIC MULTIPLE PUNCTUATION' }, + [0x16ED] = { unicodeslot=0x16ED, category='po', description='RUNIC CROSS PUNCTUATION' }, + [0x16EE] = { unicodeslot=0x16EE, category='nl', description='RUNIC ARLAUG SYMBOL' }, + [0x16EF] = { unicodeslot=0x16EF, category='nl', description='RUNIC TVIMADUR SYMBOL' }, + [0x16F0] = { unicodeslot=0x16F0, category='nl', description='RUNIC BELGTHOR SYMBOL' }, + [0x1700] = { unicodeslot=0x1700, category='lo', description='TAGALOG LETTER A' }, + [0x1701] = { unicodeslot=0x1701, category='lo', description='TAGALOG LETTER I' }, + [0x1702] = { unicodeslot=0x1702, category='lo', description='TAGALOG LETTER U' }, + [0x1703] = { unicodeslot=0x1703, category='lo', description='TAGALOG LETTER KA' }, + [0x1704] = { unicodeslot=0x1704, category='lo', description='TAGALOG LETTER GA' }, + [0x1705] = { unicodeslot=0x1705, category='lo', description='TAGALOG LETTER NGA' }, + [0x1706] = { unicodeslot=0x1706, category='lo', description='TAGALOG LETTER TA' }, + [0x1707] = { unicodeslot=0x1707, category='lo', description='TAGALOG LETTER DA' }, + [0x1708] = { unicodeslot=0x1708, category='lo', description='TAGALOG LETTER NA' }, + [0x1709] = { unicodeslot=0x1709, category='lo', description='TAGALOG LETTER PA' }, + [0x170A] = { unicodeslot=0x170A, category='lo', description='TAGALOG LETTER BA' }, + [0x170B] = { unicodeslot=0x170B, category='lo', description='TAGALOG LETTER MA' }, + [0x170C] = { unicodeslot=0x170C, category='lo', description='TAGALOG LETTER YA' }, + [0x170E] = { unicodeslot=0x170E, category='lo', description='TAGALOG LETTER LA' }, + [0x170F] = { unicodeslot=0x170F, category='lo', description='TAGALOG LETTER WA' }, + [0x1710] = { unicodeslot=0x1710, category='lo', description='TAGALOG LETTER SA' }, + [0x1711] = { unicodeslot=0x1711, category='lo', description='TAGALOG LETTER HA' }, + [0x1712] = { unicodeslot=0x1712, category='mn', description='TAGALOG VOWEL SIGN I' }, + [0x1713] = { unicodeslot=0x1713, category='mn', description='TAGALOG VOWEL SIGN U' }, + [0x1714] = { unicodeslot=0x1714, category='mn', description='TAGALOG SIGN VIRAMA' }, + [0x1720] = { unicodeslot=0x1720, category='lo', description='HANUNOO LETTER A' }, + [0x1721] = { unicodeslot=0x1721, category='lo', description='HANUNOO LETTER I' }, + [0x1722] = { unicodeslot=0x1722, category='lo', description='HANUNOO LETTER U' }, + [0x1723] = { unicodeslot=0x1723, category='lo', description='HANUNOO LETTER KA' }, + [0x1724] = { unicodeslot=0x1724, category='lo', description='HANUNOO LETTER GA' }, + [0x1725] = { unicodeslot=0x1725, category='lo', description='HANUNOO LETTER NGA' }, + [0x1726] = { unicodeslot=0x1726, category='lo', description='HANUNOO LETTER TA' }, + [0x1727] = { unicodeslot=0x1727, category='lo', description='HANUNOO LETTER DA' }, + [0x1728] = { unicodeslot=0x1728, category='lo', description='HANUNOO LETTER NA' }, + [0x1729] = { unicodeslot=0x1729, category='lo', description='HANUNOO LETTER PA' }, + [0x172A] = { unicodeslot=0x172A, category='lo', description='HANUNOO LETTER BA' }, + [0x172B] = { unicodeslot=0x172B, category='lo', description='HANUNOO LETTER MA' }, + [0x172C] = { unicodeslot=0x172C, category='lo', description='HANUNOO LETTER YA' }, + [0x172D] = { unicodeslot=0x172D, category='lo', description='HANUNOO LETTER RA' }, + [0x172E] = { unicodeslot=0x172E, category='lo', description='HANUNOO LETTER LA' }, + [0x172F] = { unicodeslot=0x172F, category='lo', description='HANUNOO LETTER WA' }, + [0x1730] = { unicodeslot=0x1730, category='lo', description='HANUNOO LETTER SA' }, + [0x1731] = { unicodeslot=0x1731, category='lo', description='HANUNOO LETTER HA' }, + [0x1732] = { unicodeslot=0x1732, category='mn', description='HANUNOO VOWEL SIGN I' }, + [0x1733] = { unicodeslot=0x1733, category='mn', description='HANUNOO VOWEL SIGN U' }, + [0x1734] = { unicodeslot=0x1734, category='mn', description='HANUNOO SIGN PAMUDPOD' }, + [0x1735] = { unicodeslot=0x1735, category='po', description='PHILIPPINE SINGLE PUNCTUATION' }, + [0x1736] = { unicodeslot=0x1736, category='po', description='PHILIPPINE DOUBLE PUNCTUATION' }, + [0x1740] = { unicodeslot=0x1740, category='lo', description='BUHID LETTER A' }, + [0x1741] = { unicodeslot=0x1741, category='lo', description='BUHID LETTER I' }, + [0x1742] = { unicodeslot=0x1742, category='lo', description='BUHID LETTER U' }, + [0x1743] = { unicodeslot=0x1743, category='lo', description='BUHID LETTER KA' }, + [0x1744] = { unicodeslot=0x1744, category='lo', description='BUHID LETTER GA' }, + [0x1745] = { unicodeslot=0x1745, category='lo', description='BUHID LETTER NGA' }, + [0x1746] = { unicodeslot=0x1746, category='lo', description='BUHID LETTER TA' }, + [0x1747] = { unicodeslot=0x1747, category='lo', description='BUHID LETTER DA' }, + [0x1748] = { unicodeslot=0x1748, category='lo', description='BUHID LETTER NA' }, + [0x1749] = { unicodeslot=0x1749, category='lo', description='BUHID LETTER PA' }, + [0x174A] = { unicodeslot=0x174A, category='lo', description='BUHID LETTER BA' }, + [0x174B] = { unicodeslot=0x174B, category='lo', description='BUHID LETTER MA' }, + [0x174C] = { unicodeslot=0x174C, category='lo', description='BUHID LETTER YA' }, + [0x174D] = { unicodeslot=0x174D, category='lo', description='BUHID LETTER RA' }, + [0x174E] = { unicodeslot=0x174E, category='lo', description='BUHID LETTER LA' }, + [0x174F] = { unicodeslot=0x174F, category='lo', description='BUHID LETTER WA' }, + [0x1750] = { unicodeslot=0x1750, category='lo', description='BUHID LETTER SA' }, + [0x1751] = { unicodeslot=0x1751, category='lo', description='BUHID LETTER HA' }, + [0x1752] = { unicodeslot=0x1752, category='mn', description='BUHID VOWEL SIGN I' }, + [0x1753] = { unicodeslot=0x1753, category='mn', description='BUHID VOWEL SIGN U' }, + [0x1760] = { unicodeslot=0x1760, category='lo', description='TAGBANWA LETTER A' }, + [0x1761] = { unicodeslot=0x1761, category='lo', description='TAGBANWA LETTER I' }, + [0x1762] = { unicodeslot=0x1762, category='lo', description='TAGBANWA LETTER U' }, + [0x1763] = { unicodeslot=0x1763, category='lo', description='TAGBANWA LETTER KA' }, + [0x1764] = { unicodeslot=0x1764, category='lo', description='TAGBANWA LETTER GA' }, + [0x1765] = { unicodeslot=0x1765, category='lo', description='TAGBANWA LETTER NGA' }, + [0x1766] = { unicodeslot=0x1766, category='lo', description='TAGBANWA LETTER TA' }, + [0x1767] = { unicodeslot=0x1767, category='lo', description='TAGBANWA LETTER DA' }, + [0x1768] = { unicodeslot=0x1768, category='lo', description='TAGBANWA LETTER NA' }, + [0x1769] = { unicodeslot=0x1769, category='lo', description='TAGBANWA LETTER PA' }, + [0x176A] = { unicodeslot=0x176A, category='lo', description='TAGBANWA LETTER BA' }, + [0x176B] = { unicodeslot=0x176B, category='lo', description='TAGBANWA LETTER MA' }, + [0x176C] = { unicodeslot=0x176C, category='lo', description='TAGBANWA LETTER YA' }, + [0x176E] = { unicodeslot=0x176E, category='lo', description='TAGBANWA LETTER LA' }, + [0x176F] = { unicodeslot=0x176F, category='lo', description='TAGBANWA LETTER WA' }, + [0x1770] = { unicodeslot=0x1770, category='lo', description='TAGBANWA LETTER SA' }, + [0x1772] = { unicodeslot=0x1772, category='mn', description='TAGBANWA VOWEL SIGN I' }, + [0x1773] = { unicodeslot=0x1773, category='mn', description='TAGBANWA VOWEL SIGN U' }, + [0x1780] = { unicodeslot=0x1780, category='lo', description='KHMER LETTER KA' }, + [0x1781] = { unicodeslot=0x1781, category='lo', description='KHMER LETTER KHA' }, + [0x1782] = { unicodeslot=0x1782, category='lo', description='KHMER LETTER KO' }, + [0x1783] = { unicodeslot=0x1783, category='lo', description='KHMER LETTER KHO' }, + [0x1784] = { unicodeslot=0x1784, category='lo', description='KHMER LETTER NGO' }, + [0x1785] = { unicodeslot=0x1785, category='lo', description='KHMER LETTER CA' }, + [0x1786] = { unicodeslot=0x1786, category='lo', description='KHMER LETTER CHA' }, + [0x1787] = { unicodeslot=0x1787, category='lo', description='KHMER LETTER CO' }, + [0x1788] = { unicodeslot=0x1788, category='lo', description='KHMER LETTER CHO' }, + [0x1789] = { unicodeslot=0x1789, category='lo', description='KHMER LETTER NYO' }, + [0x178A] = { unicodeslot=0x178A, category='lo', description='KHMER LETTER DA' }, + [0x178B] = { unicodeslot=0x178B, category='lo', description='KHMER LETTER TTHA' }, + [0x178C] = { unicodeslot=0x178C, category='lo', description='KHMER LETTER DO' }, + [0x178D] = { unicodeslot=0x178D, category='lo', description='KHMER LETTER TTHO' }, + [0x178E] = { unicodeslot=0x178E, category='lo', description='KHMER LETTER NNO' }, + [0x178F] = { unicodeslot=0x178F, category='lo', description='KHMER LETTER TA' }, + [0x1790] = { unicodeslot=0x1790, category='lo', description='KHMER LETTER THA' }, + [0x1791] = { unicodeslot=0x1791, category='lo', description='KHMER LETTER TO' }, + [0x1792] = { unicodeslot=0x1792, category='lo', description='KHMER LETTER THO' }, + [0x1793] = { unicodeslot=0x1793, category='lo', description='KHMER LETTER NO' }, + [0x1794] = { unicodeslot=0x1794, category='lo', description='KHMER LETTER BA' }, + [0x1795] = { unicodeslot=0x1795, category='lo', description='KHMER LETTER PHA' }, + [0x1796] = { unicodeslot=0x1796, category='lo', description='KHMER LETTER PO' }, + [0x1797] = { unicodeslot=0x1797, category='lo', description='KHMER LETTER PHO' }, + [0x1798] = { unicodeslot=0x1798, category='lo', description='KHMER LETTER MO' }, + [0x1799] = { unicodeslot=0x1799, category='lo', description='KHMER LETTER YO' }, + [0x179A] = { unicodeslot=0x179A, category='lo', description='KHMER LETTER RO' }, + [0x179B] = { unicodeslot=0x179B, category='lo', description='KHMER LETTER LO' }, + [0x179C] = { unicodeslot=0x179C, category='lo', description='KHMER LETTER VO' }, + [0x179D] = { unicodeslot=0x179D, category='lo', description='KHMER LETTER SHA' }, + [0x179E] = { unicodeslot=0x179E, category='lo', description='KHMER LETTER SSO' }, + [0x179F] = { unicodeslot=0x179F, category='lo', description='KHMER LETTER SA' }, + [0x17A0] = { unicodeslot=0x17A0, category='lo', description='KHMER LETTER HA' }, + [0x17A1] = { unicodeslot=0x17A1, category='lo', description='KHMER LETTER LA' }, + [0x17A2] = { unicodeslot=0x17A2, category='lo', description='KHMER LETTER QA' }, + [0x17A3] = { unicodeslot=0x17A3, category='lo', description='KHMER INDEPENDENT VOWEL QAQ' }, + [0x17A4] = { unicodeslot=0x17A4, category='lo', description='KHMER INDEPENDENT VOWEL QAA' }, + [0x17A5] = { unicodeslot=0x17A5, category='lo', description='KHMER INDEPENDENT VOWEL QI' }, + [0x17A6] = { unicodeslot=0x17A6, category='lo', description='KHMER INDEPENDENT VOWEL QII' }, + [0x17A7] = { unicodeslot=0x17A7, category='lo', description='KHMER INDEPENDENT VOWEL QU' }, + [0x17A8] = { unicodeslot=0x17A8, category='lo', description='KHMER INDEPENDENT VOWEL QUK' }, + [0x17A9] = { unicodeslot=0x17A9, category='lo', description='KHMER INDEPENDENT VOWEL QUU' }, + [0x17AA] = { unicodeslot=0x17AA, category='lo', description='KHMER INDEPENDENT VOWEL QUUV' }, + [0x17AB] = { unicodeslot=0x17AB, category='lo', description='KHMER INDEPENDENT VOWEL RY' }, + [0x17AC] = { unicodeslot=0x17AC, category='lo', description='KHMER INDEPENDENT VOWEL RYY' }, + [0x17AD] = { unicodeslot=0x17AD, category='lo', description='KHMER INDEPENDENT VOWEL LY' }, + [0x17AE] = { unicodeslot=0x17AE, category='lo', description='KHMER INDEPENDENT VOWEL LYY' }, + [0x17AF] = { unicodeslot=0x17AF, category='lo', description='KHMER INDEPENDENT VOWEL QE' }, + [0x17B0] = { unicodeslot=0x17B0, category='lo', description='KHMER INDEPENDENT VOWEL QAI' }, + [0x17B1] = { unicodeslot=0x17B1, category='lo', description='KHMER INDEPENDENT VOWEL QOO TYPE ONE' }, + [0x17B2] = { unicodeslot=0x17B2, category='lo', description='KHMER INDEPENDENT VOWEL QOO TYPE TWO' }, + [0x17B3] = { unicodeslot=0x17B3, category='lo', description='KHMER INDEPENDENT VOWEL QAU' }, + [0x17B4] = { unicodeslot=0x17B4, category='cf', description='KHMER VOWEL INHERENT AQ' }, + [0x17B5] = { unicodeslot=0x17B5, category='cf', description='KHMER VOWEL INHERENT AA' }, + [0x17B6] = { unicodeslot=0x17B6, category='mc', description='KHMER VOWEL SIGN AA' }, + [0x17B7] = { unicodeslot=0x17B7, category='mn', description='KHMER VOWEL SIGN I' }, + [0x17B8] = { unicodeslot=0x17B8, category='mn', description='KHMER VOWEL SIGN II' }, + [0x17B9] = { unicodeslot=0x17B9, category='mn', description='KHMER VOWEL SIGN Y' }, + [0x17BA] = { unicodeslot=0x17BA, category='mn', description='KHMER VOWEL SIGN YY' }, + [0x17BB] = { unicodeslot=0x17BB, category='mn', description='KHMER VOWEL SIGN U' }, + [0x17BC] = { unicodeslot=0x17BC, category='mn', description='KHMER VOWEL SIGN UU' }, + [0x17BD] = { unicodeslot=0x17BD, category='mn', description='KHMER VOWEL SIGN UA' }, + [0x17BE] = { unicodeslot=0x17BE, category='mc', description='KHMER VOWEL SIGN OE' }, + [0x17BF] = { unicodeslot=0x17BF, category='mc', description='KHMER VOWEL SIGN YA' }, + [0x17C0] = { unicodeslot=0x17C0, category='mc', description='KHMER VOWEL SIGN IE' }, + [0x17C1] = { unicodeslot=0x17C1, category='mc', description='KHMER VOWEL SIGN E' }, + [0x17C2] = { unicodeslot=0x17C2, category='mc', description='KHMER VOWEL SIGN AE' }, + [0x17C3] = { unicodeslot=0x17C3, category='mc', description='KHMER VOWEL SIGN AI' }, + [0x17C4] = { unicodeslot=0x17C4, category='mc', description='KHMER VOWEL SIGN OO' }, + [0x17C5] = { unicodeslot=0x17C5, category='mc', description='KHMER VOWEL SIGN AU' }, + [0x17C6] = { unicodeslot=0x17C6, category='mn', description='KHMER SIGN NIKAHIT' }, + [0x17C7] = { unicodeslot=0x17C7, category='mc', description='KHMER SIGN REAHMUK' }, + [0x17C8] = { unicodeslot=0x17C8, category='mc', description='KHMER SIGN YUUKALEAPINTU' }, + [0x17C9] = { unicodeslot=0x17C9, category='mn', description='KHMER SIGN MUUSIKATOAN' }, + [0x17CA] = { unicodeslot=0x17CA, category='mn', description='KHMER SIGN TRIISAP' }, + [0x17CB] = { unicodeslot=0x17CB, category='mn', description='KHMER SIGN BANTOC' }, + [0x17CC] = { unicodeslot=0x17CC, category='mn', description='KHMER SIGN ROBAT' }, + [0x17CD] = { unicodeslot=0x17CD, category='mn', description='KHMER SIGN TOANDAKHIAT' }, + [0x17CE] = { unicodeslot=0x17CE, category='mn', description='KHMER SIGN KAKABAT' }, + [0x17CF] = { unicodeslot=0x17CF, category='mn', description='KHMER SIGN AHSDA' }, + [0x17D0] = { unicodeslot=0x17D0, category='mn', description='KHMER SIGN SAMYOK SANNYA' }, + [0x17D1] = { unicodeslot=0x17D1, category='mn', description='KHMER SIGN VIRIAM' }, + [0x17D2] = { unicodeslot=0x17D2, category='mn', description='KHMER SIGN COENG' }, + [0x17D3] = { unicodeslot=0x17D3, category='mn', description='KHMER SIGN BATHAMASAT' }, + [0x17D4] = { unicodeslot=0x17D4, category='po', description='KHMER SIGN KHAN' }, + [0x17D5] = { unicodeslot=0x17D5, category='po', description='KHMER SIGN BARIYOOSAN' }, + [0x17D6] = { unicodeslot=0x17D6, category='po', description='KHMER SIGN CAMNUC PII KUUH' }, + [0x17D7] = { unicodeslot=0x17D7, category='lm', description='KHMER SIGN LEK TOO' }, + [0x17D8] = { unicodeslot=0x17D8, category='po', description='KHMER SIGN BEYYAL' }, + [0x17D9] = { unicodeslot=0x17D9, category='po', description='KHMER SIGN PHNAEK MUAN' }, + [0x17DA] = { unicodeslot=0x17DA, category='po', description='KHMER SIGN KOOMUUT' }, + [0x17DB] = { unicodeslot=0x17DB, category='sc', description='KHMER CURRENCY SYMBOL RIEL' }, + [0x17DC] = { unicodeslot=0x17DC, category='lo', description='KHMER SIGN AVAKRAHASANYA' }, + [0x17DD] = { unicodeslot=0x17DD, category='mn', description='KHMER SIGN ATTHACAN' }, + [0x17E0] = { unicodeslot=0x17E0, category='nd', description='KHMER DIGIT ZERO' }, + [0x17E1] = { unicodeslot=0x17E1, category='nd', description='KHMER DIGIT ONE' }, + [0x17E2] = { unicodeslot=0x17E2, category='nd', description='KHMER DIGIT TWO' }, + [0x17E3] = { unicodeslot=0x17E3, category='nd', description='KHMER DIGIT THREE' }, + [0x17E4] = { unicodeslot=0x17E4, category='nd', description='KHMER DIGIT FOUR' }, + [0x17E5] = { unicodeslot=0x17E5, category='nd', description='KHMER DIGIT FIVE' }, + [0x17E6] = { unicodeslot=0x17E6, category='nd', description='KHMER DIGIT SIX' }, + [0x17E7] = { unicodeslot=0x17E7, category='nd', description='KHMER DIGIT SEVEN' }, + [0x17E8] = { unicodeslot=0x17E8, category='nd', description='KHMER DIGIT EIGHT' }, + [0x17E9] = { unicodeslot=0x17E9, category='nd', description='KHMER DIGIT NINE' }, + [0x17F0] = { unicodeslot=0x17F0, category='no', description='KHMER SYMBOL LEK ATTAK SON' }, + [0x17F1] = { unicodeslot=0x17F1, category='no', description='KHMER SYMBOL LEK ATTAK MUOY' }, + [0x17F2] = { unicodeslot=0x17F2, category='no', description='KHMER SYMBOL LEK ATTAK PII' }, + [0x17F3] = { unicodeslot=0x17F3, category='no', description='KHMER SYMBOL LEK ATTAK BEI' }, + [0x17F4] = { unicodeslot=0x17F4, category='no', description='KHMER SYMBOL LEK ATTAK BUON' }, + [0x17F5] = { unicodeslot=0x17F5, category='no', description='KHMER SYMBOL LEK ATTAK PRAM' }, + [0x17F6] = { unicodeslot=0x17F6, category='no', description='KHMER SYMBOL LEK ATTAK PRAM-MUOY' }, + [0x17F7] = { unicodeslot=0x17F7, category='no', description='KHMER SYMBOL LEK ATTAK PRAM-PII' }, + [0x17F8] = { unicodeslot=0x17F8, category='no', description='KHMER SYMBOL LEK ATTAK PRAM-BEI' }, + [0x17F9] = { unicodeslot=0x17F9, category='no', description='KHMER SYMBOL LEK ATTAK PRAM-BUON' }, + [0x1800] = { unicodeslot=0x1800, category='po', description='MONGOLIAN BIRGA' }, + [0x1801] = { unicodeslot=0x1801, category='po', description='MONGOLIAN ELLIPSIS' }, + [0x1802] = { unicodeslot=0x1802, category='po', description='MONGOLIAN COMMA' }, + [0x1803] = { unicodeslot=0x1803, category='po', description='MONGOLIAN FULL STOP' }, + [0x1804] = { unicodeslot=0x1804, category='po', description='MONGOLIAN COLON' }, + [0x1805] = { unicodeslot=0x1805, category='po', description='MONGOLIAN FOUR DOTS' }, + [0x1806] = { unicodeslot=0x1806, category='pd', description='MONGOLIAN TODO SOFT HYPHEN' }, + [0x1807] = { unicodeslot=0x1807, category='po', description='MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER' }, + [0x1808] = { unicodeslot=0x1808, category='po', description='MONGOLIAN MANCHU COMMA' }, + [0x1809] = { unicodeslot=0x1809, category='po', description='MONGOLIAN MANCHU FULL STOP' }, + [0x180A] = { unicodeslot=0x180A, category='po', description='MONGOLIAN NIRUGU' }, + [0x180B] = { unicodeslot=0x180B, category='mn', description='MONGOLIAN FREE VARIATION SELECTOR ONE' }, + [0x180C] = { unicodeslot=0x180C, category='mn', description='MONGOLIAN FREE VARIATION SELECTOR TWO' }, + [0x180D] = { unicodeslot=0x180D, category='mn', description='MONGOLIAN FREE VARIATION SELECTOR THREE' }, + [0x180E] = { unicodeslot=0x180E, category='zs', description='MONGOLIAN VOWEL SEPARATOR' }, + [0x1810] = { unicodeslot=0x1810, category='nd', description='MONGOLIAN DIGIT ZERO' }, + [0x1811] = { unicodeslot=0x1811, category='nd', description='MONGOLIAN DIGIT ONE' }, + [0x1812] = { unicodeslot=0x1812, category='nd', description='MONGOLIAN DIGIT TWO' }, + [0x1813] = { unicodeslot=0x1813, category='nd', description='MONGOLIAN DIGIT THREE' }, + [0x1814] = { unicodeslot=0x1814, category='nd', description='MONGOLIAN DIGIT FOUR' }, + [0x1815] = { unicodeslot=0x1815, category='nd', description='MONGOLIAN DIGIT FIVE' }, + [0x1816] = { unicodeslot=0x1816, category='nd', description='MONGOLIAN DIGIT SIX' }, + [0x1817] = { unicodeslot=0x1817, category='nd', description='MONGOLIAN DIGIT SEVEN' }, + [0x1818] = { unicodeslot=0x1818, category='nd', description='MONGOLIAN DIGIT EIGHT' }, + [0x1819] = { unicodeslot=0x1819, category='nd', description='MONGOLIAN DIGIT NINE' }, + [0x1820] = { unicodeslot=0x1820, category='lo', description='MONGOLIAN LETTER A' }, + [0x1821] = { unicodeslot=0x1821, category='lo', description='MONGOLIAN LETTER E' }, + [0x1822] = { unicodeslot=0x1822, category='lo', description='MONGOLIAN LETTER I' }, + [0x1823] = { unicodeslot=0x1823, category='lo', description='MONGOLIAN LETTER O' }, + [0x1824] = { unicodeslot=0x1824, category='lo', description='MONGOLIAN LETTER U' }, + [0x1825] = { unicodeslot=0x1825, category='lo', description='MONGOLIAN LETTER OE' }, + [0x1826] = { unicodeslot=0x1826, category='lo', description='MONGOLIAN LETTER UE' }, + [0x1827] = { unicodeslot=0x1827, category='lo', description='MONGOLIAN LETTER EE' }, + [0x1828] = { unicodeslot=0x1828, category='lo', description='MONGOLIAN LETTER NA' }, + [0x1829] = { unicodeslot=0x1829, category='lo', description='MONGOLIAN LETTER ANG' }, + [0x182A] = { unicodeslot=0x182A, category='lo', description='MONGOLIAN LETTER BA' }, + [0x182B] = { unicodeslot=0x182B, category='lo', description='MONGOLIAN LETTER PA' }, + [0x182C] = { unicodeslot=0x182C, category='lo', description='MONGOLIAN LETTER QA' }, + [0x182D] = { unicodeslot=0x182D, category='lo', description='MONGOLIAN LETTER GA' }, + [0x182E] = { unicodeslot=0x182E, category='lo', description='MONGOLIAN LETTER MA' }, + [0x182F] = { unicodeslot=0x182F, category='lo', description='MONGOLIAN LETTER LA' }, + [0x1830] = { unicodeslot=0x1830, category='lo', description='MONGOLIAN LETTER SA' }, + [0x1831] = { unicodeslot=0x1831, category='lo', description='MONGOLIAN LETTER SHA' }, + [0x1832] = { unicodeslot=0x1832, category='lo', description='MONGOLIAN LETTER TA' }, + [0x1833] = { unicodeslot=0x1833, category='lo', description='MONGOLIAN LETTER DA' }, + [0x1834] = { unicodeslot=0x1834, category='lo', description='MONGOLIAN LETTER CHA' }, + [0x1835] = { unicodeslot=0x1835, category='lo', description='MONGOLIAN LETTER JA' }, + [0x1836] = { unicodeslot=0x1836, category='lo', description='MONGOLIAN LETTER YA' }, + [0x1837] = { unicodeslot=0x1837, category='lo', description='MONGOLIAN LETTER RA' }, + [0x1838] = { unicodeslot=0x1838, category='lo', description='MONGOLIAN LETTER WA' }, + [0x1839] = { unicodeslot=0x1839, category='lo', description='MONGOLIAN LETTER FA' }, + [0x183A] = { unicodeslot=0x183A, category='lo', description='MONGOLIAN LETTER KA' }, + [0x183B] = { unicodeslot=0x183B, category='lo', description='MONGOLIAN LETTER KHA' }, + [0x183C] = { unicodeslot=0x183C, category='lo', description='MONGOLIAN LETTER TSA' }, + [0x183D] = { unicodeslot=0x183D, category='lo', description='MONGOLIAN LETTER ZA' }, + [0x183E] = { unicodeslot=0x183E, category='lo', description='MONGOLIAN LETTER HAA' }, + [0x183F] = { unicodeslot=0x183F, category='lo', description='MONGOLIAN LETTER ZRA' }, + [0x1840] = { unicodeslot=0x1840, category='lo', description='MONGOLIAN LETTER LHA' }, + [0x1841] = { unicodeslot=0x1841, category='lo', description='MONGOLIAN LETTER ZHI' }, + [0x1842] = { unicodeslot=0x1842, category='lo', description='MONGOLIAN LETTER CHI' }, + [0x1843] = { unicodeslot=0x1843, category='lm', description='MONGOLIAN LETTER TODO LONG VOWEL SIGN' }, + [0x1844] = { unicodeslot=0x1844, category='lo', description='MONGOLIAN LETTER TODO E' }, + [0x1845] = { unicodeslot=0x1845, category='lo', description='MONGOLIAN LETTER TODO I' }, + [0x1846] = { unicodeslot=0x1846, category='lo', description='MONGOLIAN LETTER TODO O' }, + [0x1847] = { unicodeslot=0x1847, category='lo', description='MONGOLIAN LETTER TODO U' }, + [0x1848] = { unicodeslot=0x1848, category='lo', description='MONGOLIAN LETTER TODO OE' }, + [0x1849] = { unicodeslot=0x1849, category='lo', description='MONGOLIAN LETTER TODO UE' }, + [0x184A] = { unicodeslot=0x184A, category='lo', description='MONGOLIAN LETTER TODO ANG' }, + [0x184B] = { unicodeslot=0x184B, category='lo', description='MONGOLIAN LETTER TODO BA' }, + [0x184C] = { unicodeslot=0x184C, category='lo', description='MONGOLIAN LETTER TODO PA' }, + [0x184D] = { unicodeslot=0x184D, category='lo', description='MONGOLIAN LETTER TODO QA' }, + [0x184E] = { unicodeslot=0x184E, category='lo', description='MONGOLIAN LETTER TODO GA' }, + [0x184F] = { unicodeslot=0x184F, category='lo', description='MONGOLIAN LETTER TODO MA' }, + [0x1850] = { unicodeslot=0x1850, category='lo', description='MONGOLIAN LETTER TODO TA' }, + [0x1851] = { unicodeslot=0x1851, category='lo', description='MONGOLIAN LETTER TODO DA' }, + [0x1852] = { unicodeslot=0x1852, category='lo', description='MONGOLIAN LETTER TODO CHA' }, + [0x1853] = { unicodeslot=0x1853, category='lo', description='MONGOLIAN LETTER TODO JA' }, + [0x1854] = { unicodeslot=0x1854, category='lo', description='MONGOLIAN LETTER TODO TSA' }, + [0x1855] = { unicodeslot=0x1855, category='lo', description='MONGOLIAN LETTER TODO YA' }, + [0x1856] = { unicodeslot=0x1856, category='lo', description='MONGOLIAN LETTER TODO WA' }, + [0x1857] = { unicodeslot=0x1857, category='lo', description='MONGOLIAN LETTER TODO KA' }, + [0x1858] = { unicodeslot=0x1858, category='lo', description='MONGOLIAN LETTER TODO GAA' }, + [0x1859] = { unicodeslot=0x1859, category='lo', description='MONGOLIAN LETTER TODO HAA' }, + [0x185A] = { unicodeslot=0x185A, category='lo', description='MONGOLIAN LETTER TODO JIA' }, + [0x185B] = { unicodeslot=0x185B, category='lo', description='MONGOLIAN LETTER TODO NIA' }, + [0x185C] = { unicodeslot=0x185C, category='lo', description='MONGOLIAN LETTER TODO DZA' }, + [0x185D] = { unicodeslot=0x185D, category='lo', description='MONGOLIAN LETTER SIBE E' }, + [0x185E] = { unicodeslot=0x185E, category='lo', description='MONGOLIAN LETTER SIBE I' }, + [0x185F] = { unicodeslot=0x185F, category='lo', description='MONGOLIAN LETTER SIBE IY' }, + [0x1860] = { unicodeslot=0x1860, category='lo', description='MONGOLIAN LETTER SIBE UE' }, + [0x1861] = { unicodeslot=0x1861, category='lo', description='MONGOLIAN LETTER SIBE U' }, + [0x1862] = { unicodeslot=0x1862, category='lo', description='MONGOLIAN LETTER SIBE ANG' }, + [0x1863] = { unicodeslot=0x1863, category='lo', description='MONGOLIAN LETTER SIBE KA' }, + [0x1864] = { unicodeslot=0x1864, category='lo', description='MONGOLIAN LETTER SIBE GA' }, + [0x1865] = { unicodeslot=0x1865, category='lo', description='MONGOLIAN LETTER SIBE HA' }, + [0x1866] = { unicodeslot=0x1866, category='lo', description='MONGOLIAN LETTER SIBE PA' }, + [0x1867] = { unicodeslot=0x1867, category='lo', description='MONGOLIAN LETTER SIBE SHA' }, + [0x1868] = { unicodeslot=0x1868, category='lo', description='MONGOLIAN LETTER SIBE TA' }, + [0x1869] = { unicodeslot=0x1869, category='lo', description='MONGOLIAN LETTER SIBE DA' }, + [0x186A] = { unicodeslot=0x186A, category='lo', description='MONGOLIAN LETTER SIBE JA' }, + [0x186B] = { unicodeslot=0x186B, category='lo', description='MONGOLIAN LETTER SIBE FA' }, + [0x186C] = { unicodeslot=0x186C, category='lo', description='MONGOLIAN LETTER SIBE GAA' }, + [0x186D] = { unicodeslot=0x186D, category='lo', description='MONGOLIAN LETTER SIBE HAA' }, + [0x186E] = { unicodeslot=0x186E, category='lo', description='MONGOLIAN LETTER SIBE TSA' }, + [0x186F] = { unicodeslot=0x186F, category='lo', description='MONGOLIAN LETTER SIBE ZA' }, + [0x1870] = { unicodeslot=0x1870, category='lo', description='MONGOLIAN LETTER SIBE RAA' }, + [0x1871] = { unicodeslot=0x1871, category='lo', description='MONGOLIAN LETTER SIBE CHA' }, + [0x1872] = { unicodeslot=0x1872, category='lo', description='MONGOLIAN LETTER SIBE ZHA' }, + [0x1873] = { unicodeslot=0x1873, category='lo', description='MONGOLIAN LETTER MANCHU I' }, + [0x1874] = { unicodeslot=0x1874, category='lo', description='MONGOLIAN LETTER MANCHU KA' }, + [0x1875] = { unicodeslot=0x1875, category='lo', description='MONGOLIAN LETTER MANCHU RA' }, + [0x1876] = { unicodeslot=0x1876, category='lo', description='MONGOLIAN LETTER MANCHU FA' }, + [0x1877] = { unicodeslot=0x1877, category='lo', description='MONGOLIAN LETTER MANCHU ZHA' }, + [0x1880] = { unicodeslot=0x1880, category='lo', description='MONGOLIAN LETTER ALI GALI ANUSVARA ONE' }, + [0x1881] = { unicodeslot=0x1881, category='lo', description='MONGOLIAN LETTER ALI GALI VISARGA ONE' }, + [0x1882] = { unicodeslot=0x1882, category='lo', description='MONGOLIAN LETTER ALI GALI DAMARU' }, + [0x1883] = { unicodeslot=0x1883, category='lo', description='MONGOLIAN LETTER ALI GALI UBADAMA' }, + [0x1884] = { unicodeslot=0x1884, category='lo', description='MONGOLIAN LETTER ALI GALI INVERTED UBADAMA' }, + [0x1885] = { unicodeslot=0x1885, category='lo', description='MONGOLIAN LETTER ALI GALI BALUDA' }, + [0x1886] = { unicodeslot=0x1886, category='lo', description='MONGOLIAN LETTER ALI GALI THREE BALUDA' }, + [0x1887] = { unicodeslot=0x1887, category='lo', description='MONGOLIAN LETTER ALI GALI A' }, + [0x1888] = { unicodeslot=0x1888, category='lo', description='MONGOLIAN LETTER ALI GALI I' }, + [0x1889] = { unicodeslot=0x1889, category='lo', description='MONGOLIAN LETTER ALI GALI KA' }, + [0x188A] = { unicodeslot=0x188A, category='lo', description='MONGOLIAN LETTER ALI GALI NGA' }, + [0x188B] = { unicodeslot=0x188B, category='lo', description='MONGOLIAN LETTER ALI GALI CA' }, + [0x188C] = { unicodeslot=0x188C, category='lo', description='MONGOLIAN LETTER ALI GALI TTA' }, + [0x188D] = { unicodeslot=0x188D, category='lo', description='MONGOLIAN LETTER ALI GALI TTHA' }, + [0x188E] = { unicodeslot=0x188E, category='lo', description='MONGOLIAN LETTER ALI GALI DDA' }, + [0x188F] = { unicodeslot=0x188F, category='lo', description='MONGOLIAN LETTER ALI GALI NNA' }, + [0x1890] = { unicodeslot=0x1890, category='lo', description='MONGOLIAN LETTER ALI GALI TA' }, + [0x1891] = { unicodeslot=0x1891, category='lo', description='MONGOLIAN LETTER ALI GALI DA' }, + [0x1892] = { unicodeslot=0x1892, category='lo', description='MONGOLIAN LETTER ALI GALI PA' }, + [0x1893] = { unicodeslot=0x1893, category='lo', description='MONGOLIAN LETTER ALI GALI PHA' }, + [0x1894] = { unicodeslot=0x1894, category='lo', description='MONGOLIAN LETTER ALI GALI SSA' }, + [0x1895] = { unicodeslot=0x1895, category='lo', description='MONGOLIAN LETTER ALI GALI ZHA' }, + [0x1896] = { unicodeslot=0x1896, category='lo', description='MONGOLIAN LETTER ALI GALI ZA' }, + [0x1897] = { unicodeslot=0x1897, category='lo', description='MONGOLIAN LETTER ALI GALI AH' }, + [0x1898] = { unicodeslot=0x1898, category='lo', description='MONGOLIAN LETTER TODO ALI GALI TA' }, + [0x1899] = { unicodeslot=0x1899, category='lo', description='MONGOLIAN LETTER TODO ALI GALI ZHA' }, + [0x189A] = { unicodeslot=0x189A, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI GHA' }, + [0x189B] = { unicodeslot=0x189B, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI NGA' }, + [0x189C] = { unicodeslot=0x189C, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI CA' }, + [0x189D] = { unicodeslot=0x189D, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI JHA' }, + [0x189E] = { unicodeslot=0x189E, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI TTA' }, + [0x189F] = { unicodeslot=0x189F, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI DDHA' }, + [0x18A0] = { unicodeslot=0x18A0, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI TA' }, + [0x18A1] = { unicodeslot=0x18A1, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI DHA' }, + [0x18A2] = { unicodeslot=0x18A2, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI SSA' }, + [0x18A3] = { unicodeslot=0x18A3, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI CYA' }, + [0x18A4] = { unicodeslot=0x18A4, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI ZHA' }, + [0x18A5] = { unicodeslot=0x18A5, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI ZA' }, + [0x18A6] = { unicodeslot=0x18A6, category='lo', description='MONGOLIAN LETTER ALI GALI HALF U' }, + [0x18A7] = { unicodeslot=0x18A7, category='lo', description='MONGOLIAN LETTER ALI GALI HALF YA' }, + [0x18A8] = { unicodeslot=0x18A8, category='lo', description='MONGOLIAN LETTER MANCHU ALI GALI BHA' }, + [0x18A9] = { unicodeslot=0x18A9, category='mn', description='MONGOLIAN LETTER ALI GALI DAGALGA' }, + [0x1900] = { unicodeslot=0x1900, category='lo', description='LIMBU VOWEL-CARRIER LETTER' }, + [0x1901] = { unicodeslot=0x1901, category='lo', description='LIMBU LETTER KA' }, + [0x1902] = { unicodeslot=0x1902, category='lo', description='LIMBU LETTER KHA' }, + [0x1903] = { unicodeslot=0x1903, category='lo', description='LIMBU LETTER GA' }, + [0x1904] = { unicodeslot=0x1904, category='lo', description='LIMBU LETTER GHA' }, + [0x1905] = { unicodeslot=0x1905, category='lo', description='LIMBU LETTER NGA' }, + [0x1906] = { unicodeslot=0x1906, category='lo', description='LIMBU LETTER CA' }, + [0x1907] = { unicodeslot=0x1907, category='lo', description='LIMBU LETTER CHA' }, + [0x1908] = { unicodeslot=0x1908, category='lo', description='LIMBU LETTER JA' }, + [0x1909] = { unicodeslot=0x1909, category='lo', description='LIMBU LETTER JHA' }, + [0x190A] = { unicodeslot=0x190A, category='lo', description='LIMBU LETTER YAN' }, + [0x190B] = { unicodeslot=0x190B, category='lo', description='LIMBU LETTER TA' }, + [0x190C] = { unicodeslot=0x190C, category='lo', description='LIMBU LETTER THA' }, + [0x190D] = { unicodeslot=0x190D, category='lo', description='LIMBU LETTER DA' }, + [0x190E] = { unicodeslot=0x190E, category='lo', description='LIMBU LETTER DHA' }, + [0x190F] = { unicodeslot=0x190F, category='lo', description='LIMBU LETTER NA' }, + [0x1910] = { unicodeslot=0x1910, category='lo', description='LIMBU LETTER PA' }, + [0x1911] = { unicodeslot=0x1911, category='lo', description='LIMBU LETTER PHA' }, + [0x1912] = { unicodeslot=0x1912, category='lo', description='LIMBU LETTER BA' }, + [0x1913] = { unicodeslot=0x1913, category='lo', description='LIMBU LETTER BHA' }, + [0x1914] = { unicodeslot=0x1914, category='lo', description='LIMBU LETTER MA' }, + [0x1915] = { unicodeslot=0x1915, category='lo', description='LIMBU LETTER YA' }, + [0x1916] = { unicodeslot=0x1916, category='lo', description='LIMBU LETTER RA' }, + [0x1917] = { unicodeslot=0x1917, category='lo', description='LIMBU LETTER LA' }, + [0x1918] = { unicodeslot=0x1918, category='lo', description='LIMBU LETTER WA' }, + [0x1919] = { unicodeslot=0x1919, category='lo', description='LIMBU LETTER SHA' }, + [0x191A] = { unicodeslot=0x191A, category='lo', description='LIMBU LETTER SSA' }, + [0x191B] = { unicodeslot=0x191B, category='lo', description='LIMBU LETTER SA' }, + [0x191C] = { unicodeslot=0x191C, category='lo', description='LIMBU LETTER HA' }, + [0x1920] = { unicodeslot=0x1920, category='mn', description='LIMBU VOWEL SIGN A' }, + [0x1921] = { unicodeslot=0x1921, category='mn', description='LIMBU VOWEL SIGN I' }, + [0x1922] = { unicodeslot=0x1922, category='mn', description='LIMBU VOWEL SIGN U' }, + [0x1923] = { unicodeslot=0x1923, category='mc', description='LIMBU VOWEL SIGN EE' }, + [0x1924] = { unicodeslot=0x1924, category='mc', description='LIMBU VOWEL SIGN AI' }, + [0x1925] = { unicodeslot=0x1925, category='mc', description='LIMBU VOWEL SIGN OO' }, + [0x1926] = { unicodeslot=0x1926, category='mc', description='LIMBU VOWEL SIGN AU' }, + [0x1927] = { unicodeslot=0x1927, category='mn', description='LIMBU VOWEL SIGN E' }, + [0x1928] = { unicodeslot=0x1928, category='mn', description='LIMBU VOWEL SIGN O' }, + [0x1929] = { unicodeslot=0x1929, category='mc', description='LIMBU SUBJOINED LETTER YA' }, + [0x192A] = { unicodeslot=0x192A, category='mc', description='LIMBU SUBJOINED LETTER RA' }, + [0x192B] = { unicodeslot=0x192B, category='mc', description='LIMBU SUBJOINED LETTER WA' }, + [0x1930] = { unicodeslot=0x1930, category='mc', description='LIMBU SMALL LETTER KA' }, + [0x1931] = { unicodeslot=0x1931, category='mc', description='LIMBU SMALL LETTER NGA' }, + [0x1932] = { unicodeslot=0x1932, category='mn', description='LIMBU SMALL LETTER ANUSVARA' }, + [0x1933] = { unicodeslot=0x1933, category='mc', description='LIMBU SMALL LETTER TA' }, + [0x1934] = { unicodeslot=0x1934, category='mc', description='LIMBU SMALL LETTER NA' }, + [0x1935] = { unicodeslot=0x1935, category='mc', description='LIMBU SMALL LETTER PA' }, + [0x1936] = { unicodeslot=0x1936, category='mc', description='LIMBU SMALL LETTER MA' }, + [0x1937] = { unicodeslot=0x1937, category='mc', description='LIMBU SMALL LETTER RA' }, + [0x1938] = { unicodeslot=0x1938, category='mc', description='LIMBU SMALL LETTER LA' }, + [0x1939] = { unicodeslot=0x1939, category='mn', description='LIMBU SIGN MUKPHRENG' }, + [0x193A] = { unicodeslot=0x193A, category='mn', description='LIMBU SIGN KEMPHRENG' }, + [0x193B] = { unicodeslot=0x193B, category='mn', description='LIMBU SIGN SA-I' }, + [0x1940] = { unicodeslot=0x1940, category='so', description='LIMBU SIGN LOO' }, + [0x1944] = { unicodeslot=0x1944, category='po', description='LIMBU EXCLAMATION MARK' }, + [0x1945] = { unicodeslot=0x1945, category='po', description='LIMBU QUESTION MARK' }, + [0x1946] = { unicodeslot=0x1946, category='nd', description='LIMBU DIGIT ZERO' }, + [0x1947] = { unicodeslot=0x1947, category='nd', description='LIMBU DIGIT ONE' }, + [0x1948] = { unicodeslot=0x1948, category='nd', description='LIMBU DIGIT TWO' }, + [0x1949] = { unicodeslot=0x1949, category='nd', description='LIMBU DIGIT THREE' }, + [0x194A] = { unicodeslot=0x194A, category='nd', description='LIMBU DIGIT FOUR' }, + [0x194B] = { unicodeslot=0x194B, category='nd', description='LIMBU DIGIT FIVE' }, + [0x194C] = { unicodeslot=0x194C, category='nd', description='LIMBU DIGIT SIX' }, + [0x194D] = { unicodeslot=0x194D, category='nd', description='LIMBU DIGIT SEVEN' }, + [0x194E] = { unicodeslot=0x194E, category='nd', description='LIMBU DIGIT EIGHT' }, + [0x194F] = { unicodeslot=0x194F, category='nd', description='LIMBU DIGIT NINE' }, + [0x1950] = { unicodeslot=0x1950, category='lo', description='TAI LE LETTER KA' }, + [0x1951] = { unicodeslot=0x1951, category='lo', description='TAI LE LETTER XA' }, + [0x1952] = { unicodeslot=0x1952, category='lo', description='TAI LE LETTER NGA' }, + [0x1953] = { unicodeslot=0x1953, category='lo', description='TAI LE LETTER TSA' }, + [0x1954] = { unicodeslot=0x1954, category='lo', description='TAI LE LETTER SA' }, + [0x1955] = { unicodeslot=0x1955, category='lo', description='TAI LE LETTER YA' }, + [0x1956] = { unicodeslot=0x1956, category='lo', description='TAI LE LETTER TA' }, + [0x1957] = { unicodeslot=0x1957, category='lo', description='TAI LE LETTER THA' }, + [0x1958] = { unicodeslot=0x1958, category='lo', description='TAI LE LETTER LA' }, + [0x1959] = { unicodeslot=0x1959, category='lo', description='TAI LE LETTER PA' }, + [0x195A] = { unicodeslot=0x195A, category='lo', description='TAI LE LETTER PHA' }, + [0x195B] = { unicodeslot=0x195B, category='lo', description='TAI LE LETTER MA' }, + [0x195C] = { unicodeslot=0x195C, category='lo', description='TAI LE LETTER FA' }, + [0x195D] = { unicodeslot=0x195D, category='lo', description='TAI LE LETTER VA' }, + [0x195E] = { unicodeslot=0x195E, category='lo', description='TAI LE LETTER HA' }, + [0x195F] = { unicodeslot=0x195F, category='lo', description='TAI LE LETTER QA' }, + [0x1960] = { unicodeslot=0x1960, category='lo', description='TAI LE LETTER KHA' }, + [0x1961] = { unicodeslot=0x1961, category='lo', description='TAI LE LETTER TSHA' }, + [0x1962] = { unicodeslot=0x1962, category='lo', description='TAI LE LETTER NA' }, + [0x1963] = { unicodeslot=0x1963, category='lo', description='TAI LE LETTER A' }, + [0x1964] = { unicodeslot=0x1964, category='lo', description='TAI LE LETTER I' }, + [0x1965] = { unicodeslot=0x1965, category='lo', description='TAI LE LETTER EE' }, + [0x1966] = { unicodeslot=0x1966, category='lo', description='TAI LE LETTER EH' }, + [0x1967] = { unicodeslot=0x1967, category='lo', description='TAI LE LETTER U' }, + [0x1968] = { unicodeslot=0x1968, category='lo', description='TAI LE LETTER OO' }, + [0x1969] = { unicodeslot=0x1969, category='lo', description='TAI LE LETTER O' }, + [0x196A] = { unicodeslot=0x196A, category='lo', description='TAI LE LETTER UE' }, + [0x196B] = { unicodeslot=0x196B, category='lo', description='TAI LE LETTER E' }, + [0x196C] = { unicodeslot=0x196C, category='lo', description='TAI LE LETTER AUE' }, + [0x196D] = { unicodeslot=0x196D, category='lo', description='TAI LE LETTER AI' }, + [0x1970] = { unicodeslot=0x1970, category='lo', description='TAI LE LETTER TONE-2' }, + [0x1971] = { unicodeslot=0x1971, category='lo', description='TAI LE LETTER TONE-3' }, + [0x1972] = { unicodeslot=0x1972, category='lo', description='TAI LE LETTER TONE-4' }, + [0x1973] = { unicodeslot=0x1973, category='lo', description='TAI LE LETTER TONE-5' }, + [0x1974] = { unicodeslot=0x1974, category='lo', description='TAI LE LETTER TONE-6' }, + [0x1980] = { unicodeslot=0x1980, category='lo', description='NEW TAI LUE LETTER HIGH QA' }, + [0x1981] = { unicodeslot=0x1981, category='lo', description='NEW TAI LUE LETTER LOW QA' }, + [0x1982] = { unicodeslot=0x1982, category='lo', description='NEW TAI LUE LETTER HIGH KA' }, + [0x1983] = { unicodeslot=0x1983, category='lo', description='NEW TAI LUE LETTER HIGH XA' }, + [0x1984] = { unicodeslot=0x1984, category='lo', description='NEW TAI LUE LETTER HIGH NGA' }, + [0x1985] = { unicodeslot=0x1985, category='lo', description='NEW TAI LUE LETTER LOW KA' }, + [0x1986] = { unicodeslot=0x1986, category='lo', description='NEW TAI LUE LETTER LOW XA' }, + [0x1987] = { unicodeslot=0x1987, category='lo', description='NEW TAI LUE LETTER LOW NGA' }, + [0x1988] = { unicodeslot=0x1988, category='lo', description='NEW TAI LUE LETTER HIGH TSA' }, + [0x1989] = { unicodeslot=0x1989, category='lo', description='NEW TAI LUE LETTER HIGH SA' }, + [0x198A] = { unicodeslot=0x198A, category='lo', description='NEW TAI LUE LETTER HIGH YA' }, + [0x198B] = { unicodeslot=0x198B, category='lo', description='NEW TAI LUE LETTER LOW TSA' }, + [0x198C] = { unicodeslot=0x198C, category='lo', description='NEW TAI LUE LETTER LOW SA' }, + [0x198D] = { unicodeslot=0x198D, category='lo', description='NEW TAI LUE LETTER LOW YA' }, + [0x198E] = { unicodeslot=0x198E, category='lo', description='NEW TAI LUE LETTER HIGH TA' }, + [0x198F] = { unicodeslot=0x198F, category='lo', description='NEW TAI LUE LETTER HIGH THA' }, + [0x1990] = { unicodeslot=0x1990, category='lo', description='NEW TAI LUE LETTER HIGH NA' }, + [0x1991] = { unicodeslot=0x1991, category='lo', description='NEW TAI LUE LETTER LOW TA' }, + [0x1992] = { unicodeslot=0x1992, category='lo', description='NEW TAI LUE LETTER LOW THA' }, + [0x1993] = { unicodeslot=0x1993, category='lo', description='NEW TAI LUE LETTER LOW NA' }, + [0x1994] = { unicodeslot=0x1994, category='lo', description='NEW TAI LUE LETTER HIGH PA' }, + [0x1995] = { unicodeslot=0x1995, category='lo', description='NEW TAI LUE LETTER HIGH PHA' }, + [0x1996] = { unicodeslot=0x1996, category='lo', description='NEW TAI LUE LETTER HIGH MA' }, + [0x1997] = { unicodeslot=0x1997, category='lo', description='NEW TAI LUE LETTER LOW PA' }, + [0x1998] = { unicodeslot=0x1998, category='lo', description='NEW TAI LUE LETTER LOW PHA' }, + [0x1999] = { unicodeslot=0x1999, category='lo', description='NEW TAI LUE LETTER LOW MA' }, + [0x199A] = { unicodeslot=0x199A, category='lo', description='NEW TAI LUE LETTER HIGH FA' }, + [0x199B] = { unicodeslot=0x199B, category='lo', description='NEW TAI LUE LETTER HIGH VA' }, + [0x199C] = { unicodeslot=0x199C, category='lo', description='NEW TAI LUE LETTER HIGH LA' }, + [0x199D] = { unicodeslot=0x199D, category='lo', description='NEW TAI LUE LETTER LOW FA' }, + [0x199E] = { unicodeslot=0x199E, category='lo', description='NEW TAI LUE LETTER LOW VA' }, + [0x199F] = { unicodeslot=0x199F, category='lo', description='NEW TAI LUE LETTER LOW LA' }, + [0x19A0] = { unicodeslot=0x19A0, category='lo', description='NEW TAI LUE LETTER HIGH HA' }, + [0x19A1] = { unicodeslot=0x19A1, category='lo', description='NEW TAI LUE LETTER HIGH DA' }, + [0x19A2] = { unicodeslot=0x19A2, category='lo', description='NEW TAI LUE LETTER HIGH BA' }, + [0x19A3] = { unicodeslot=0x19A3, category='lo', description='NEW TAI LUE LETTER LOW HA' }, + [0x19A4] = { unicodeslot=0x19A4, category='lo', description='NEW TAI LUE LETTER LOW DA' }, + [0x19A5] = { unicodeslot=0x19A5, category='lo', description='NEW TAI LUE LETTER LOW BA' }, + [0x19A6] = { unicodeslot=0x19A6, category='lo', description='NEW TAI LUE LETTER HIGH KVA' }, + [0x19A7] = { unicodeslot=0x19A7, category='lo', description='NEW TAI LUE LETTER HIGH XVA' }, + [0x19A8] = { unicodeslot=0x19A8, category='lo', description='NEW TAI LUE LETTER LOW KVA' }, + [0x19A9] = { unicodeslot=0x19A9, category='lo', description='NEW TAI LUE LETTER LOW XVA' }, + [0x19B0] = { unicodeslot=0x19B0, category='mc', description='NEW TAI LUE VOWEL SIGN VOWEL SHORTENER' }, + [0x19B1] = { unicodeslot=0x19B1, category='mc', description='NEW TAI LUE VOWEL SIGN AA' }, + [0x19B2] = { unicodeslot=0x19B2, category='mc', description='NEW TAI LUE VOWEL SIGN II' }, + [0x19B3] = { unicodeslot=0x19B3, category='mc', description='NEW TAI LUE VOWEL SIGN U' }, + [0x19B4] = { unicodeslot=0x19B4, category='mc', description='NEW TAI LUE VOWEL SIGN UU' }, + [0x19B5] = { unicodeslot=0x19B5, category='mc', description='NEW TAI LUE VOWEL SIGN E' }, + [0x19B6] = { unicodeslot=0x19B6, category='mc', description='NEW TAI LUE VOWEL SIGN AE' }, + [0x19B7] = { unicodeslot=0x19B7, category='mc', description='NEW TAI LUE VOWEL SIGN O' }, + [0x19B8] = { unicodeslot=0x19B8, category='mc', description='NEW TAI LUE VOWEL SIGN OA' }, + [0x19B9] = { unicodeslot=0x19B9, category='mc', description='NEW TAI LUE VOWEL SIGN UE' }, + [0x19BA] = { unicodeslot=0x19BA, category='mc', description='NEW TAI LUE VOWEL SIGN AY' }, + [0x19BB] = { unicodeslot=0x19BB, category='mc', description='NEW TAI LUE VOWEL SIGN AAY' }, + [0x19BC] = { unicodeslot=0x19BC, category='mc', description='NEW TAI LUE VOWEL SIGN UY' }, + [0x19BD] = { unicodeslot=0x19BD, category='mc', description='NEW TAI LUE VOWEL SIGN OY' }, + [0x19BE] = { unicodeslot=0x19BE, category='mc', description='NEW TAI LUE VOWEL SIGN OAY' }, + [0x19BF] = { unicodeslot=0x19BF, category='mc', description='NEW TAI LUE VOWEL SIGN UEY' }, + [0x19C0] = { unicodeslot=0x19C0, category='mc', description='NEW TAI LUE VOWEL SIGN IY' }, + [0x19C1] = { unicodeslot=0x19C1, category='lo', description='NEW TAI LUE LETTER FINAL V' }, + [0x19C2] = { unicodeslot=0x19C2, category='lo', description='NEW TAI LUE LETTER FINAL NG' }, + [0x19C3] = { unicodeslot=0x19C3, category='lo', description='NEW TAI LUE LETTER FINAL N' }, + [0x19C4] = { unicodeslot=0x19C4, category='lo', description='NEW TAI LUE LETTER FINAL M' }, + [0x19C5] = { unicodeslot=0x19C5, category='lo', description='NEW TAI LUE LETTER FINAL K' }, + [0x19C6] = { unicodeslot=0x19C6, category='lo', description='NEW TAI LUE LETTER FINAL D' }, + [0x19C7] = { unicodeslot=0x19C7, category='lo', description='NEW TAI LUE LETTER FINAL B' }, + [0x19C8] = { unicodeslot=0x19C8, category='mc', description='NEW TAI LUE TONE MARK-1' }, + [0x19C9] = { unicodeslot=0x19C9, category='mc', description='NEW TAI LUE TONE MARK-2' }, + [0x19D0] = { unicodeslot=0x19D0, category='nd', description='NEW TAI LUE DIGIT ZERO' }, + [0x19D1] = { unicodeslot=0x19D1, category='nd', description='NEW TAI LUE DIGIT ONE' }, + [0x19D2] = { unicodeslot=0x19D2, category='nd', description='NEW TAI LUE DIGIT TWO' }, + [0x19D3] = { unicodeslot=0x19D3, category='nd', description='NEW TAI LUE DIGIT THREE' }, + [0x19D4] = { unicodeslot=0x19D4, category='nd', description='NEW TAI LUE DIGIT FOUR' }, + [0x19D5] = { unicodeslot=0x19D5, category='nd', description='NEW TAI LUE DIGIT FIVE' }, + [0x19D6] = { unicodeslot=0x19D6, category='nd', description='NEW TAI LUE DIGIT SIX' }, + [0x19D7] = { unicodeslot=0x19D7, category='nd', description='NEW TAI LUE DIGIT SEVEN' }, + [0x19D8] = { unicodeslot=0x19D8, category='nd', description='NEW TAI LUE DIGIT EIGHT' }, + [0x19D9] = { unicodeslot=0x19D9, category='nd', description='NEW TAI LUE DIGIT NINE' }, + [0x19DE] = { unicodeslot=0x19DE, category='po', description='NEW TAI LUE SIGN LAE' }, + [0x19DF] = { unicodeslot=0x19DF, category='po', description='NEW TAI LUE SIGN LAEV' }, + [0x19E0] = { unicodeslot=0x19E0, category='so', description='KHMER SYMBOL PATHAMASAT' }, + [0x19E1] = { unicodeslot=0x19E1, category='so', description='KHMER SYMBOL MUOY KOET' }, + [0x19E2] = { unicodeslot=0x19E2, category='so', description='KHMER SYMBOL PII KOET' }, + [0x19E3] = { unicodeslot=0x19E3, category='so', description='KHMER SYMBOL BEI KOET' }, + [0x19E4] = { unicodeslot=0x19E4, category='so', description='KHMER SYMBOL BUON KOET' }, + [0x19E5] = { unicodeslot=0x19E5, category='so', description='KHMER SYMBOL PRAM KOET' }, + [0x19E6] = { unicodeslot=0x19E6, category='so', description='KHMER SYMBOL PRAM-MUOY KOET' }, + [0x19E7] = { unicodeslot=0x19E7, category='so', description='KHMER SYMBOL PRAM-PII KOET' }, + [0x19E8] = { unicodeslot=0x19E8, category='so', description='KHMER SYMBOL PRAM-BEI KOET' }, + [0x19E9] = { unicodeslot=0x19E9, category='so', description='KHMER SYMBOL PRAM-BUON KOET' }, + [0x19EA] = { unicodeslot=0x19EA, category='so', description='KHMER SYMBOL DAP KOET' }, + [0x19EB] = { unicodeslot=0x19EB, category='so', description='KHMER SYMBOL DAP-MUOY KOET' }, + [0x19EC] = { unicodeslot=0x19EC, category='so', description='KHMER SYMBOL DAP-PII KOET' }, + [0x19ED] = { unicodeslot=0x19ED, category='so', description='KHMER SYMBOL DAP-BEI KOET' }, + [0x19EE] = { unicodeslot=0x19EE, category='so', description='KHMER SYMBOL DAP-BUON KOET' }, + [0x19EF] = { unicodeslot=0x19EF, category='so', description='KHMER SYMBOL DAP-PRAM KOET' }, + [0x19F0] = { unicodeslot=0x19F0, category='so', description='KHMER SYMBOL TUTEYASAT' }, + [0x19F1] = { unicodeslot=0x19F1, category='so', description='KHMER SYMBOL MUOY ROC' }, + [0x19F2] = { unicodeslot=0x19F2, category='so', description='KHMER SYMBOL PII ROC' }, + [0x19F3] = { unicodeslot=0x19F3, category='so', description='KHMER SYMBOL BEI ROC' }, + [0x19F4] = { unicodeslot=0x19F4, category='so', description='KHMER SYMBOL BUON ROC' }, + [0x19F5] = { unicodeslot=0x19F5, category='so', description='KHMER SYMBOL PRAM ROC' }, + [0x19F6] = { unicodeslot=0x19F6, category='so', description='KHMER SYMBOL PRAM-MUOY ROC' }, + [0x19F7] = { unicodeslot=0x19F7, category='so', description='KHMER SYMBOL PRAM-PII ROC' }, + [0x19F8] = { unicodeslot=0x19F8, category='so', description='KHMER SYMBOL PRAM-BEI ROC' }, + [0x19F9] = { unicodeslot=0x19F9, category='so', description='KHMER SYMBOL PRAM-BUON ROC' }, + [0x19FA] = { unicodeslot=0x19FA, category='so', description='KHMER SYMBOL DAP ROC' }, + [0x19FB] = { unicodeslot=0x19FB, category='so', description='KHMER SYMBOL DAP-MUOY ROC' }, + [0x19FC] = { unicodeslot=0x19FC, category='so', description='KHMER SYMBOL DAP-PII ROC' }, + [0x19FD] = { unicodeslot=0x19FD, category='so', description='KHMER SYMBOL DAP-BEI ROC' }, + [0x19FE] = { unicodeslot=0x19FE, category='so', description='KHMER SYMBOL DAP-BUON ROC' }, + [0x19FF] = { unicodeslot=0x19FF, category='so', description='KHMER SYMBOL DAP-PRAM ROC' }, + [0x1A00] = { unicodeslot=0x1A00, category='lo', description='BUGINESE LETTER KA' }, + [0x1A01] = { unicodeslot=0x1A01, category='lo', description='BUGINESE LETTER GA' }, + [0x1A02] = { unicodeslot=0x1A02, category='lo', description='BUGINESE LETTER NGA' }, + [0x1A03] = { unicodeslot=0x1A03, category='lo', description='BUGINESE LETTER NGKA' }, + [0x1A04] = { unicodeslot=0x1A04, category='lo', description='BUGINESE LETTER PA' }, + [0x1A05] = { unicodeslot=0x1A05, category='lo', description='BUGINESE LETTER BA' }, + [0x1A06] = { unicodeslot=0x1A06, category='lo', description='BUGINESE LETTER MA' }, + [0x1A07] = { unicodeslot=0x1A07, category='lo', description='BUGINESE LETTER MPA' }, + [0x1A08] = { unicodeslot=0x1A08, category='lo', description='BUGINESE LETTER TA' }, + [0x1A09] = { unicodeslot=0x1A09, category='lo', description='BUGINESE LETTER DA' }, + [0x1A0A] = { unicodeslot=0x1A0A, category='lo', description='BUGINESE LETTER NA' }, + [0x1A0B] = { unicodeslot=0x1A0B, category='lo', description='BUGINESE LETTER NRA' }, + [0x1A0C] = { unicodeslot=0x1A0C, category='lo', description='BUGINESE LETTER CA' }, + [0x1A0D] = { unicodeslot=0x1A0D, category='lo', description='BUGINESE LETTER JA' }, + [0x1A0E] = { unicodeslot=0x1A0E, category='lo', description='BUGINESE LETTER NYA' }, + [0x1A0F] = { unicodeslot=0x1A0F, category='lo', description='BUGINESE LETTER NYCA' }, + [0x1A10] = { unicodeslot=0x1A10, category='lo', description='BUGINESE LETTER YA' }, + [0x1A11] = { unicodeslot=0x1A11, category='lo', description='BUGINESE LETTER RA' }, + [0x1A12] = { unicodeslot=0x1A12, category='lo', description='BUGINESE LETTER LA' }, + [0x1A13] = { unicodeslot=0x1A13, category='lo', description='BUGINESE LETTER VA' }, + [0x1A14] = { unicodeslot=0x1A14, category='lo', description='BUGINESE LETTER SA' }, + [0x1A15] = { unicodeslot=0x1A15, category='lo', description='BUGINESE LETTER A' }, + [0x1A16] = { unicodeslot=0x1A16, category='lo', description='BUGINESE LETTER HA' }, + [0x1A17] = { unicodeslot=0x1A17, category='mn', description='BUGINESE VOWEL SIGN I' }, + [0x1A18] = { unicodeslot=0x1A18, category='mn', description='BUGINESE VOWEL SIGN U' }, + [0x1A19] = { unicodeslot=0x1A19, category='mc', description='BUGINESE VOWEL SIGN E' }, + [0x1A1A] = { unicodeslot=0x1A1A, category='mc', description='BUGINESE VOWEL SIGN O' }, + [0x1A1B] = { unicodeslot=0x1A1B, category='mc', description='BUGINESE VOWEL SIGN AE' }, + [0x1A1E] = { unicodeslot=0x1A1E, category='po', description='BUGINESE PALLAWA' }, + [0x1A1F] = { unicodeslot=0x1A1F, category='po', description='BUGINESE END OF SECTION' }, + [0x1B00] = { unicodeslot=0x1B00, category='mn', description='BALINESE SIGN ULU RICEM' }, + [0x1B01] = { unicodeslot=0x1B01, category='mn', description='BALINESE SIGN ULU CANDRA' }, + [0x1B02] = { unicodeslot=0x1B02, category='mn', description='BALINESE SIGN CECEK' }, + [0x1B03] = { unicodeslot=0x1B03, category='mn', description='BALINESE SIGN SURANG' }, + [0x1B04] = { unicodeslot=0x1B04, category='mc', description='BALINESE SIGN BISAH' }, + [0x1B05] = { unicodeslot=0x1B05, category='lo', description='BALINESE LETTER AKARA' }, + [0x1B06] = { unicodeslot=0x1B06, category='lo', description='BALINESE LETTER AKARA TEDUNG', specials={'char',0x1B05,0x1B35} }, + [0x1B07] = { unicodeslot=0x1B07, category='lo', description='BALINESE LETTER IKARA' }, + [0x1B08] = { unicodeslot=0x1B08, category='lo', description='BALINESE LETTER IKARA TEDUNG', specials={'char',0x1B07,0x1B35} }, + [0x1B09] = { unicodeslot=0x1B09, category='lo', description='BALINESE LETTER UKARA' }, + [0x1B0A] = { unicodeslot=0x1B0A, category='lo', description='BALINESE LETTER UKARA TEDUNG', specials={'char',0x1B09,0x1B35} }, + [0x1B0B] = { unicodeslot=0x1B0B, category='lo', description='BALINESE LETTER RA REPA' }, + [0x1B0C] = { unicodeslot=0x1B0C, category='lo', description='BALINESE LETTER RA REPA TEDUNG', specials={'char',0x1B0B,0x1B35} }, + [0x1B0D] = { unicodeslot=0x1B0D, category='lo', description='BALINESE LETTER LA LENGA' }, + [0x1B0E] = { unicodeslot=0x1B0E, category='lo', description='BALINESE LETTER LA LENGA TEDUNG', specials={'char',0x1B0D,0x1B35} }, + [0x1B0F] = { unicodeslot=0x1B0F, category='lo', description='BALINESE LETTER EKARA' }, + [0x1B10] = { unicodeslot=0x1B10, category='lo', description='BALINESE LETTER AIKARA' }, + [0x1B11] = { unicodeslot=0x1B11, category='lo', description='BALINESE LETTER OKARA' }, + [0x1B12] = { unicodeslot=0x1B12, category='lo', description='BALINESE LETTER OKARA TEDUNG', specials={'char',0x1B11,0x1B35} }, + [0x1B13] = { unicodeslot=0x1B13, category='lo', description='BALINESE LETTER KA' }, + [0x1B14] = { unicodeslot=0x1B14, category='lo', description='BALINESE LETTER KA MAHAPRANA' }, + [0x1B15] = { unicodeslot=0x1B15, category='lo', description='BALINESE LETTER GA' }, + [0x1B16] = { unicodeslot=0x1B16, category='lo', description='BALINESE LETTER GA GORA' }, + [0x1B17] = { unicodeslot=0x1B17, category='lo', description='BALINESE LETTER NGA' }, + [0x1B18] = { unicodeslot=0x1B18, category='lo', description='BALINESE LETTER CA' }, + [0x1B19] = { unicodeslot=0x1B19, category='lo', description='BALINESE LETTER CA LACA' }, + [0x1B1A] = { unicodeslot=0x1B1A, category='lo', description='BALINESE LETTER JA' }, + [0x1B1B] = { unicodeslot=0x1B1B, category='lo', description='BALINESE LETTER JA JERA' }, + [0x1B1C] = { unicodeslot=0x1B1C, category='lo', description='BALINESE LETTER NYA' }, + [0x1B1D] = { unicodeslot=0x1B1D, category='lo', description='BALINESE LETTER TA LATIK' }, + [0x1B1E] = { unicodeslot=0x1B1E, category='lo', description='BALINESE LETTER TA MURDA MAHAPRANA' }, + [0x1B1F] = { unicodeslot=0x1B1F, category='lo', description='BALINESE LETTER DA MURDA ALPAPRANA' }, + [0x1B20] = { unicodeslot=0x1B20, category='lo', description='BALINESE LETTER DA MURDA MAHAPRANA' }, + [0x1B21] = { unicodeslot=0x1B21, category='lo', description='BALINESE LETTER NA RAMBAT' }, + [0x1B22] = { unicodeslot=0x1B22, category='lo', description='BALINESE LETTER TA' }, + [0x1B23] = { unicodeslot=0x1B23, category='lo', description='BALINESE LETTER TA TAWA' }, + [0x1B24] = { unicodeslot=0x1B24, category='lo', description='BALINESE LETTER DA' }, + [0x1B25] = { unicodeslot=0x1B25, category='lo', description='BALINESE LETTER DA MADU' }, + [0x1B26] = { unicodeslot=0x1B26, category='lo', description='BALINESE LETTER NA' }, + [0x1B27] = { unicodeslot=0x1B27, category='lo', description='BALINESE LETTER PA' }, + [0x1B28] = { unicodeslot=0x1B28, category='lo', description='BALINESE LETTER PA KAPAL' }, + [0x1B29] = { unicodeslot=0x1B29, category='lo', description='BALINESE LETTER BA' }, + [0x1B2A] = { unicodeslot=0x1B2A, category='lo', description='BALINESE LETTER BA KEMBANG' }, + [0x1B2B] = { unicodeslot=0x1B2B, category='lo', description='BALINESE LETTER MA' }, + [0x1B2C] = { unicodeslot=0x1B2C, category='lo', description='BALINESE LETTER YA' }, + [0x1B2D] = { unicodeslot=0x1B2D, category='lo', description='BALINESE LETTER RA' }, + [0x1B2E] = { unicodeslot=0x1B2E, category='lo', description='BALINESE LETTER LA' }, + [0x1B2F] = { unicodeslot=0x1B2F, category='lo', description='BALINESE LETTER WA' }, + [0x1B30] = { unicodeslot=0x1B30, category='lo', description='BALINESE LETTER SA SAGA' }, + [0x1B31] = { unicodeslot=0x1B31, category='lo', description='BALINESE LETTER SA SAPA' }, + [0x1B32] = { unicodeslot=0x1B32, category='lo', description='BALINESE LETTER SA' }, + [0x1B33] = { unicodeslot=0x1B33, category='lo', description='BALINESE LETTER HA' }, + [0x1B34] = { unicodeslot=0x1B34, category='mn', description='BALINESE SIGN REREKAN' }, + [0x1B35] = { unicodeslot=0x1B35, category='mc', description='BALINESE VOWEL SIGN TEDUNG' }, + [0x1B36] = { unicodeslot=0x1B36, category='mn', description='BALINESE VOWEL SIGN ULU' }, + [0x1B37] = { unicodeslot=0x1B37, category='mn', description='BALINESE VOWEL SIGN ULU SARI' }, + [0x1B38] = { unicodeslot=0x1B38, category='mn', description='BALINESE VOWEL SIGN SUKU' }, + [0x1B39] = { unicodeslot=0x1B39, category='mn', description='BALINESE VOWEL SIGN SUKU ILUT' }, + [0x1B3A] = { unicodeslot=0x1B3A, category='mn', description='BALINESE VOWEL SIGN RA REPA' }, + [0x1B3B] = { unicodeslot=0x1B3B, category='mc', description='BALINESE VOWEL SIGN RA REPA TEDUNG', specials={'char',0x1B3A,0x1B35} }, + [0x1B3C] = { unicodeslot=0x1B3C, category='mn', description='BALINESE VOWEL SIGN LA LENGA' }, + [0x1B3D] = { unicodeslot=0x1B3D, category='mc', description='BALINESE VOWEL SIGN LA LENGA TEDUNG', specials={'char',0x1B3C,0x1B35} }, + [0x1B3E] = { unicodeslot=0x1B3E, category='mc', description='BALINESE VOWEL SIGN TALING' }, + [0x1B3F] = { unicodeslot=0x1B3F, category='mc', description='BALINESE VOWEL SIGN TALING REPA' }, + [0x1B40] = { unicodeslot=0x1B40, category='mc', description='BALINESE VOWEL SIGN TALING TEDUNG', specials={'char',0x1B3E,0x1B35} }, + [0x1B41] = { unicodeslot=0x1B41, category='mc', description='BALINESE VOWEL SIGN TALING REPA TEDUNG', specials={'char',0x1B3F,0x1B35} }, + [0x1B42] = { unicodeslot=0x1B42, category='mn', description='BALINESE VOWEL SIGN PEPET' }, + [0x1B43] = { unicodeslot=0x1B43, category='mc', description='BALINESE VOWEL SIGN PEPET TEDUNG', specials={'char',0x1B42,0x1B35} }, + [0x1B44] = { unicodeslot=0x1B44, category='mc', description='BALINESE ADEG ADEG' }, + [0x1B45] = { unicodeslot=0x1B45, category='lo', description='BALINESE LETTER KAF SASAK' }, + [0x1B46] = { unicodeslot=0x1B46, category='lo', description='BALINESE LETTER KHOT SASAK' }, + [0x1B47] = { unicodeslot=0x1B47, category='lo', description='BALINESE LETTER TZIR SASAK' }, + [0x1B48] = { unicodeslot=0x1B48, category='lo', description='BALINESE LETTER EF SASAK' }, + [0x1B49] = { unicodeslot=0x1B49, category='lo', description='BALINESE LETTER VE SASAK' }, + [0x1B4A] = { unicodeslot=0x1B4A, category='lo', description='BALINESE LETTER ZAL SASAK' }, + [0x1B4B] = { unicodeslot=0x1B4B, category='lo', description='BALINESE LETTER ASYURA SASAK' }, + [0x1B50] = { unicodeslot=0x1B50, category='nd', description='BALINESE DIGIT ZERO' }, + [0x1B51] = { unicodeslot=0x1B51, category='nd', description='BALINESE DIGIT ONE' }, + [0x1B52] = { unicodeslot=0x1B52, category='nd', description='BALINESE DIGIT TWO' }, + [0x1B53] = { unicodeslot=0x1B53, category='nd', description='BALINESE DIGIT THREE' }, + [0x1B54] = { unicodeslot=0x1B54, category='nd', description='BALINESE DIGIT FOUR' }, + [0x1B55] = { unicodeslot=0x1B55, category='nd', description='BALINESE DIGIT FIVE' }, + [0x1B56] = { unicodeslot=0x1B56, category='nd', description='BALINESE DIGIT SIX' }, + [0x1B57] = { unicodeslot=0x1B57, category='nd', description='BALINESE DIGIT SEVEN' }, + [0x1B58] = { unicodeslot=0x1B58, category='nd', description='BALINESE DIGIT EIGHT' }, + [0x1B59] = { unicodeslot=0x1B59, category='nd', description='BALINESE DIGIT NINE' }, + [0x1B5A] = { unicodeslot=0x1B5A, category='po', description='BALINESE PANTI' }, + [0x1B5B] = { unicodeslot=0x1B5B, category='po', description='BALINESE PAMADA' }, + [0x1B5C] = { unicodeslot=0x1B5C, category='po', description='BALINESE WINDU' }, + [0x1B5D] = { unicodeslot=0x1B5D, category='po', description='BALINESE CARIK PAMUNGKAH' }, + [0x1B5E] = { unicodeslot=0x1B5E, category='po', description='BALINESE CARIK SIKI' }, + [0x1B5F] = { unicodeslot=0x1B5F, category='po', description='BALINESE CARIK PAREREN' }, + [0x1B60] = { unicodeslot=0x1B60, category='po', description='BALINESE PAMENENG' }, + [0x1B61] = { unicodeslot=0x1B61, category='so', description='BALINESE MUSICAL SYMBOL DONG' }, + [0x1B62] = { unicodeslot=0x1B62, category='so', description='BALINESE MUSICAL SYMBOL DENG' }, + [0x1B63] = { unicodeslot=0x1B63, category='so', description='BALINESE MUSICAL SYMBOL DUNG' }, + [0x1B64] = { unicodeslot=0x1B64, category='so', description='BALINESE MUSICAL SYMBOL DANG' }, + [0x1B65] = { unicodeslot=0x1B65, category='so', description='BALINESE MUSICAL SYMBOL DANG SURANG' }, + [0x1B66] = { unicodeslot=0x1B66, category='so', description='BALINESE MUSICAL SYMBOL DING' }, + [0x1B67] = { unicodeslot=0x1B67, category='so', description='BALINESE MUSICAL SYMBOL DAENG' }, + [0x1B68] = { unicodeslot=0x1B68, category='so', description='BALINESE MUSICAL SYMBOL DEUNG' }, + [0x1B69] = { unicodeslot=0x1B69, category='so', description='BALINESE MUSICAL SYMBOL DAING' }, + [0x1B6A] = { unicodeslot=0x1B6A, category='so', description='BALINESE MUSICAL SYMBOL DANG GEDE' }, + [0x1B6B] = { unicodeslot=0x1B6B, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING TEGEH' }, + [0x1B6C] = { unicodeslot=0x1B6C, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING ENDEP' }, + [0x1B6D] = { unicodeslot=0x1B6D, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING KEMPUL' }, + [0x1B6E] = { unicodeslot=0x1B6E, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING KEMPLI' }, + [0x1B6F] = { unicodeslot=0x1B6F, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING JEGOGAN' }, + [0x1B70] = { unicodeslot=0x1B70, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING KEMPUL WITH JEGOGAN' }, + [0x1B71] = { unicodeslot=0x1B71, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING KEMPLI WITH JEGOGAN' }, + [0x1B72] = { unicodeslot=0x1B72, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING BENDE' }, + [0x1B73] = { unicodeslot=0x1B73, category='mn', description='BALINESE MUSICAL SYMBOL COMBINING GONG' }, + [0x1B74] = { unicodeslot=0x1B74, category='so', description='BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DUG' }, + [0x1B75] = { unicodeslot=0x1B75, category='so', description='BALINESE MUSICAL SYMBOL RIGHT-HAND OPEN DAG' }, + [0x1B76] = { unicodeslot=0x1B76, category='so', description='BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TUK' }, + [0x1B77] = { unicodeslot=0x1B77, category='so', description='BALINESE MUSICAL SYMBOL RIGHT-HAND CLOSED TAK' }, + [0x1B78] = { unicodeslot=0x1B78, category='so', description='BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PANG' }, + [0x1B79] = { unicodeslot=0x1B79, category='so', description='BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PUNG' }, + [0x1B7A] = { unicodeslot=0x1B7A, category='so', description='BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLAK' }, + [0x1B7B] = { unicodeslot=0x1B7B, category='so', description='BALINESE MUSICAL SYMBOL LEFT-HAND CLOSED PLUK' }, + [0x1B7C] = { unicodeslot=0x1B7C, category='so', description='BALINESE MUSICAL SYMBOL LEFT-HAND OPEN PING' }, + [0x1D00] = { unicodeslot=0x1D00, category='ll', description='LATIN LETTER SMALL CAPITAL A' }, + [0x1D01] = { unicodeslot=0x1D01, category='ll', description='LATIN LETTER SMALL CAPITAL AE' }, + [0x1D02] = { unicodeslot=0x1D02, category='ll', description='LATIN SMALL LETTER TURNED AE' }, + [0x1D03] = { unicodeslot=0x1D03, category='ll', description='LATIN LETTER SMALL CAPITAL BARRED B' }, + [0x1D04] = { unicodeslot=0x1D04, category='ll', description='LATIN LETTER SMALL CAPITAL C' }, + [0x1D05] = { unicodeslot=0x1D05, category='ll', description='LATIN LETTER SMALL CAPITAL D' }, + [0x1D06] = { unicodeslot=0x1D06, category='ll', description='LATIN LETTER SMALL CAPITAL ETH' }, + [0x1D07] = { unicodeslot=0x1D07, category='ll', description='LATIN LETTER SMALL CAPITAL E' }, + [0x1D08] = { unicodeslot=0x1D08, category='ll', description='LATIN SMALL LETTER TURNED OPEN E' }, + [0x1D09] = { unicodeslot=0x1D09, category='ll', description='LATIN SMALL LETTER TURNED I' }, + [0x1D0A] = { unicodeslot=0x1D0A, category='ll', description='LATIN LETTER SMALL CAPITAL J' }, + [0x1D0B] = { unicodeslot=0x1D0B, category='ll', description='LATIN LETTER SMALL CAPITAL K' }, + [0x1D0C] = { unicodeslot=0x1D0C, category='ll', description='LATIN LETTER SMALL CAPITAL L WITH STROKE' }, + [0x1D0D] = { unicodeslot=0x1D0D, category='ll', description='LATIN LETTER SMALL CAPITAL M' }, + [0x1D0E] = { unicodeslot=0x1D0E, category='ll', description='LATIN LETTER SMALL CAPITAL REVERSED N' }, + [0x1D0F] = { unicodeslot=0x1D0F, category='ll', description='LATIN LETTER SMALL CAPITAL O' }, + [0x1D10] = { unicodeslot=0x1D10, category='ll', description='LATIN LETTER SMALL CAPITAL OPEN O' }, + [0x1D11] = { unicodeslot=0x1D11, category='ll', description='LATIN SMALL LETTER SIDEWAYS O' }, + [0x1D12] = { unicodeslot=0x1D12, category='ll', description='LATIN SMALL LETTER SIDEWAYS OPEN O' }, + [0x1D13] = { unicodeslot=0x1D13, category='ll', description='LATIN SMALL LETTER SIDEWAYS O WITH STROKE' }, + [0x1D14] = { unicodeslot=0x1D14, category='ll', description='LATIN SMALL LETTER TURNED OE' }, + [0x1D15] = { unicodeslot=0x1D15, category='ll', description='LATIN LETTER SMALL CAPITAL OU' }, + [0x1D16] = { unicodeslot=0x1D16, category='ll', description='LATIN SMALL LETTER TOP HALF O' }, + [0x1D17] = { unicodeslot=0x1D17, category='ll', description='LATIN SMALL LETTER BOTTOM HALF O' }, + [0x1D18] = { unicodeslot=0x1D18, category='ll', description='LATIN LETTER SMALL CAPITAL P' }, + [0x1D19] = { unicodeslot=0x1D19, category='ll', description='LATIN LETTER SMALL CAPITAL REVERSED R' }, + [0x1D1A] = { unicodeslot=0x1D1A, category='ll', description='LATIN LETTER SMALL CAPITAL TURNED R' }, + [0x1D1B] = { unicodeslot=0x1D1B, category='ll', description='LATIN LETTER SMALL CAPITAL T' }, + [0x1D1C] = { unicodeslot=0x1D1C, category='ll', description='LATIN LETTER SMALL CAPITAL U' }, + [0x1D1D] = { unicodeslot=0x1D1D, category='ll', description='LATIN SMALL LETTER SIDEWAYS U' }, + [0x1D1E] = { unicodeslot=0x1D1E, category='ll', description='LATIN SMALL LETTER SIDEWAYS DIAERESIZED U' }, + [0x1D1F] = { unicodeslot=0x1D1F, category='ll', description='LATIN SMALL LETTER SIDEWAYS TURNED M' }, + [0x1D20] = { unicodeslot=0x1D20, category='ll', description='LATIN LETTER SMALL CAPITAL V' }, + [0x1D21] = { unicodeslot=0x1D21, category='ll', description='LATIN LETTER SMALL CAPITAL W' }, + [0x1D22] = { unicodeslot=0x1D22, category='ll', description='LATIN LETTER SMALL CAPITAL Z' }, + [0x1D23] = { unicodeslot=0x1D23, category='ll', description='LATIN LETTER SMALL CAPITAL EZH' }, + [0x1D24] = { unicodeslot=0x1D24, category='ll', description='LATIN LETTER VOICED LARYNGEAL SPIRANT' }, + [0x1D25] = { unicodeslot=0x1D25, category='ll', description='LATIN LETTER AIN' }, + [0x1D26] = { unicodeslot=0x1D26, category='ll', description='GREEK LETTER SMALL CAPITAL GAMMA' }, + [0x1D27] = { unicodeslot=0x1D27, category='ll', description='GREEK LETTER SMALL CAPITAL LAMDA' }, + [0x1D28] = { unicodeslot=0x1D28, category='ll', description='GREEK LETTER SMALL CAPITAL PI' }, + [0x1D29] = { unicodeslot=0x1D29, category='ll', description='GREEK LETTER SMALL CAPITAL RHO' }, + [0x1D2A] = { unicodeslot=0x1D2A, category='ll', description='GREEK LETTER SMALL CAPITAL PSI' }, + [0x1D2B] = { unicodeslot=0x1D2B, category='ll', description='CYRILLIC LETTER SMALL CAPITAL EL' }, + [0x1D2C] = { unicodeslot=0x1D2C, category='lm', description='MODIFIER LETTER CAPITAL A', specials={'super',0x0041} }, + [0x1D2D] = { unicodeslot=0x1D2D, category='lm', description='MODIFIER LETTER CAPITAL AE', specials={'super',0x00C6} }, + [0x1D2E] = { unicodeslot=0x1D2E, category='lm', description='MODIFIER LETTER CAPITAL B', specials={'super',0x0042} }, + [0x1D2F] = { unicodeslot=0x1D2F, category='lm', description='MODIFIER LETTER CAPITAL BARRED B' }, + [0x1D30] = { unicodeslot=0x1D30, category='lm', description='MODIFIER LETTER CAPITAL D', specials={'super',0x0044} }, + [0x1D31] = { unicodeslot=0x1D31, category='lm', description='MODIFIER LETTER CAPITAL E', specials={'super',0x0045} }, + [0x1D32] = { unicodeslot=0x1D32, category='lm', description='MODIFIER LETTER CAPITAL REVERSED E', specials={'super',0x018E} }, + [0x1D33] = { unicodeslot=0x1D33, category='lm', description='MODIFIER LETTER CAPITAL G', specials={'super',0x0047} }, + [0x1D34] = { unicodeslot=0x1D34, category='lm', description='MODIFIER LETTER CAPITAL H', specials={'super',0x0048} }, + [0x1D35] = { unicodeslot=0x1D35, category='lm', description='MODIFIER LETTER CAPITAL I', specials={'super',0x0049} }, + [0x1D36] = { unicodeslot=0x1D36, category='lm', description='MODIFIER LETTER CAPITAL J', specials={'super',0x004A} }, + [0x1D37] = { unicodeslot=0x1D37, category='lm', description='MODIFIER LETTER CAPITAL K', specials={'super',0x004B} }, + [0x1D38] = { unicodeslot=0x1D38, category='lm', description='MODIFIER LETTER CAPITAL L', specials={'super',0x004C} }, + [0x1D39] = { unicodeslot=0x1D39, category='lm', description='MODIFIER LETTER CAPITAL M', specials={'super',0x004D} }, + [0x1D3A] = { unicodeslot=0x1D3A, category='lm', description='MODIFIER LETTER CAPITAL N', specials={'super',0x004E} }, + [0x1D3B] = { unicodeslot=0x1D3B, category='lm', description='MODIFIER LETTER CAPITAL REVERSED N' }, + [0x1D3C] = { unicodeslot=0x1D3C, category='lm', description='MODIFIER LETTER CAPITAL O', specials={'super',0x004F} }, + [0x1D3D] = { unicodeslot=0x1D3D, category='lm', description='MODIFIER LETTER CAPITAL OU', specials={'super',0x0222} }, + [0x1D3E] = { unicodeslot=0x1D3E, category='lm', description='MODIFIER LETTER CAPITAL P', specials={'super',0x0050} }, + [0x1D3F] = { unicodeslot=0x1D3F, category='lm', description='MODIFIER LETTER CAPITAL R', specials={'super',0x0052} }, + [0x1D40] = { unicodeslot=0x1D40, category='lm', description='MODIFIER LETTER CAPITAL T', specials={'super',0x0054} }, + [0x1D41] = { unicodeslot=0x1D41, category='lm', description='MODIFIER LETTER CAPITAL U', specials={'super',0x0055} }, + [0x1D42] = { unicodeslot=0x1D42, category='lm', description='MODIFIER LETTER CAPITAL W', specials={'super',0x0057} }, + [0x1D43] = { unicodeslot=0x1D43, category='lm', description='MODIFIER LETTER SMALL A', specials={'super',0x0061} }, + [0x1D44] = { unicodeslot=0x1D44, category='lm', description='MODIFIER LETTER SMALL TURNED A', specials={'super',0x0250} }, + [0x1D45] = { unicodeslot=0x1D45, category='lm', description='MODIFIER LETTER SMALL ALPHA', specials={'super',0x0251} }, + [0x1D46] = { unicodeslot=0x1D46, category='lm', description='MODIFIER LETTER SMALL TURNED AE', specials={'super',0x1D02} }, + [0x1D47] = { unicodeslot=0x1D47, category='lm', description='MODIFIER LETTER SMALL B', specials={'super',0x0062} }, + [0x1D48] = { unicodeslot=0x1D48, category='lm', description='MODIFIER LETTER SMALL D', specials={'super',0x0064} }, + [0x1D49] = { unicodeslot=0x1D49, category='lm', description='MODIFIER LETTER SMALL E', specials={'super',0x0065} }, + [0x1D4A] = { unicodeslot=0x1D4A, category='lm', description='MODIFIER LETTER SMALL SCHWA', specials={'super',0x0259} }, + [0x1D4B] = { unicodeslot=0x1D4B, category='lm', description='MODIFIER LETTER SMALL OPEN E', specials={'super',0x025B} }, + [0x1D4C] = { unicodeslot=0x1D4C, category='lm', description='MODIFIER LETTER SMALL TURNED OPEN E', specials={'super',0x025C} }, + [0x1D4D] = { unicodeslot=0x1D4D, category='lm', description='MODIFIER LETTER SMALL G', specials={'super',0x0067} }, + [0x1D4E] = { unicodeslot=0x1D4E, category='lm', description='MODIFIER LETTER SMALL TURNED I' }, + [0x1D4F] = { unicodeslot=0x1D4F, category='lm', description='MODIFIER LETTER SMALL K', specials={'super',0x006B} }, + [0x1D50] = { unicodeslot=0x1D50, category='lm', description='MODIFIER LETTER SMALL M', specials={'super',0x006D} }, + [0x1D51] = { unicodeslot=0x1D51, category='lm', description='MODIFIER LETTER SMALL ENG', specials={'super',0x014B} }, + [0x1D52] = { unicodeslot=0x1D52, category='lm', description='MODIFIER LETTER SMALL O', specials={'super',0x006F} }, + [0x1D53] = { unicodeslot=0x1D53, category='lm', description='MODIFIER LETTER SMALL OPEN O', specials={'super',0x0254} }, + [0x1D54] = { unicodeslot=0x1D54, category='lm', description='MODIFIER LETTER SMALL TOP HALF O', specials={'super',0x1D16} }, + [0x1D55] = { unicodeslot=0x1D55, category='lm', description='MODIFIER LETTER SMALL BOTTOM HALF O', specials={'super',0x1D17} }, + [0x1D56] = { unicodeslot=0x1D56, category='lm', description='MODIFIER LETTER SMALL P', specials={'super',0x0070} }, + [0x1D57] = { unicodeslot=0x1D57, category='lm', description='MODIFIER LETTER SMALL T', specials={'super',0x0074} }, + [0x1D58] = { unicodeslot=0x1D58, category='lm', description='MODIFIER LETTER SMALL U', specials={'super',0x0075} }, + [0x1D59] = { unicodeslot=0x1D59, category='lm', description='MODIFIER LETTER SMALL SIDEWAYS U', specials={'super',0x1D1D} }, + [0x1D5A] = { unicodeslot=0x1D5A, category='lm', description='MODIFIER LETTER SMALL TURNED M', specials={'super',0x026F} }, + [0x1D5B] = { unicodeslot=0x1D5B, category='lm', description='MODIFIER LETTER SMALL V', specials={'super',0x0076} }, + [0x1D5C] = { unicodeslot=0x1D5C, category='lm', description='MODIFIER LETTER SMALL AIN', specials={'super',0x1D25} }, + [0x1D5D] = { unicodeslot=0x1D5D, category='lm', description='MODIFIER LETTER SMALL BETA', specials={'super',0x03B2} }, + [0x1D5E] = { unicodeslot=0x1D5E, category='lm', description='MODIFIER LETTER SMALL GREEK GAMMA', specials={'super',0x03B3} }, + [0x1D5F] = { unicodeslot=0x1D5F, category='lm', description='MODIFIER LETTER SMALL DELTA', specials={'super',0x03B4} }, + [0x1D60] = { unicodeslot=0x1D60, category='lm', description='MODIFIER LETTER SMALL GREEK PHI', specials={'super',0x03C6} }, + [0x1D61] = { unicodeslot=0x1D61, category='lm', description='MODIFIER LETTER SMALL CHI', specials={'super',0x03C7} }, + [0x1D62] = { unicodeslot=0x1D62, category='ll', description='LATIN SUBSCRIPT SMALL LETTER I', specials={'sub',0x0069} }, + [0x1D63] = { unicodeslot=0x1D63, category='ll', description='LATIN SUBSCRIPT SMALL LETTER R', specials={'sub',0x0072} }, + [0x1D64] = { unicodeslot=0x1D64, category='ll', description='LATIN SUBSCRIPT SMALL LETTER U', specials={'sub',0x0075} }, + [0x1D65] = { unicodeslot=0x1D65, category='ll', description='LATIN SUBSCRIPT SMALL LETTER V', specials={'sub',0x0076} }, + [0x1D66] = { unicodeslot=0x1D66, category='ll', description='GREEK SUBSCRIPT SMALL LETTER BETA', specials={'sub',0x03B2} }, + [0x1D67] = { unicodeslot=0x1D67, category='ll', description='GREEK SUBSCRIPT SMALL LETTER GAMMA', specials={'sub',0x03B3} }, + [0x1D68] = { unicodeslot=0x1D68, category='ll', description='GREEK SUBSCRIPT SMALL LETTER RHO', specials={'sub',0x03C1} }, + [0x1D69] = { unicodeslot=0x1D69, category='ll', description='GREEK SUBSCRIPT SMALL LETTER PHI', specials={'sub',0x03C6} }, + [0x1D6A] = { unicodeslot=0x1D6A, category='ll', description='GREEK SUBSCRIPT SMALL LETTER CHI', specials={'sub',0x03C7} }, + [0x1D6B] = { unicodeslot=0x1D6B, category='ll', description='LATIN SMALL LETTER UE' }, + [0x1D6C] = { unicodeslot=0x1D6C, category='ll', description='LATIN SMALL LETTER B WITH MIDDLE TILDE', shcode=0x0062 }, + [0x1D6D] = { unicodeslot=0x1D6D, category='ll', description='LATIN SMALL LETTER D WITH MIDDLE TILDE', shcode=0x0064 }, + [0x1D6E] = { unicodeslot=0x1D6E, category='ll', description='LATIN SMALL LETTER F WITH MIDDLE TILDE', shcode=0x0066 }, + [0x1D6F] = { unicodeslot=0x1D6F, category='ll', description='LATIN SMALL LETTER M WITH MIDDLE TILDE', shcode=0x006D }, + [0x1D70] = { unicodeslot=0x1D70, category='ll', description='LATIN SMALL LETTER N WITH MIDDLE TILDE', shcode=0x006E }, + [0x1D71] = { unicodeslot=0x1D71, category='ll', description='LATIN SMALL LETTER P WITH MIDDLE TILDE', shcode=0x0070 }, + [0x1D72] = { unicodeslot=0x1D72, category='ll', description='LATIN SMALL LETTER R WITH MIDDLE TILDE', shcode=0x0072 }, + [0x1D73] = { unicodeslot=0x1D73, category='ll', description='LATIN SMALL LETTER R WITH FISHHOOK AND MIDDLE TILDE', shcode=0x0072 }, + [0x1D74] = { unicodeslot=0x1D74, category='ll', description='LATIN SMALL LETTER S WITH MIDDLE TILDE', shcode=0x0073 }, + [0x1D75] = { unicodeslot=0x1D75, category='ll', description='LATIN SMALL LETTER T WITH MIDDLE TILDE', shcode=0x0074 }, + [0x1D76] = { unicodeslot=0x1D76, category='ll', description='LATIN SMALL LETTER Z WITH MIDDLE TILDE', shcode=0x007A }, + [0x1D77] = { unicodeslot=0x1D77, category='ll', description='LATIN SMALL LETTER TURNED G' }, + [0x1D78] = { unicodeslot=0x1D78, category='lm', description='MODIFIER LETTER CYRILLIC EN', specials={'super',0x043D} }, + [0x1D79] = { unicodeslot=0x1D79, category='ll', description='LATIN SMALL LETTER INSULAR G' }, + [0x1D7A] = { unicodeslot=0x1D7A, category='ll', description='LATIN SMALL LETTER TH WITH STRIKETHROUGH' }, + [0x1D7B] = { unicodeslot=0x1D7B, category='ll', description='LATIN SMALL CAPITAL LETTER I WITH STROKE' }, + [0x1D7C] = { unicodeslot=0x1D7C, category='ll', description='LATIN SMALL LETTER IOTA WITH STROKE', shcode=0x0269 }, + [0x1D7D] = { unicodeslot=0x1D7D, category='ll', description='LATIN SMALL LETTER P WITH STROKE', shcode=0x0070, uccode=0x2C63 }, + [0x1D7E] = { unicodeslot=0x1D7E, category='ll', description='LATIN SMALL CAPITAL LETTER U WITH STROKE' }, + [0x1D7F] = { unicodeslot=0x1D7F, category='ll', description='LATIN SMALL LETTER UPSILON WITH STROKE', shcode=0x028A }, + [0x1D80] = { unicodeslot=0x1D80, category='ll', description='LATIN SMALL LETTER B WITH PALATAL HOOK', shcode=0x0062 }, + [0x1D81] = { unicodeslot=0x1D81, category='ll', description='LATIN SMALL LETTER D WITH PALATAL HOOK', shcode=0x0064 }, + [0x1D82] = { unicodeslot=0x1D82, category='ll', description='LATIN SMALL LETTER F WITH PALATAL HOOK', shcode=0x0066 }, + [0x1D83] = { unicodeslot=0x1D83, category='ll', description='LATIN SMALL LETTER G WITH PALATAL HOOK', shcode=0x0067 }, + [0x1D84] = { unicodeslot=0x1D84, category='ll', description='LATIN SMALL LETTER K WITH PALATAL HOOK', shcode=0x006B }, + [0x1D85] = { unicodeslot=0x1D85, category='ll', description='LATIN SMALL LETTER L WITH PALATAL HOOK', shcode=0x006C }, + [0x1D86] = { unicodeslot=0x1D86, category='ll', description='LATIN SMALL LETTER M WITH PALATAL HOOK', shcode=0x006D }, + [0x1D87] = { unicodeslot=0x1D87, category='ll', description='LATIN SMALL LETTER N WITH PALATAL HOOK', shcode=0x006E }, + [0x1D88] = { unicodeslot=0x1D88, category='ll', description='LATIN SMALL LETTER P WITH PALATAL HOOK', shcode=0x0070 }, + [0x1D89] = { unicodeslot=0x1D89, category='ll', description='LATIN SMALL LETTER R WITH PALATAL HOOK', shcode=0x0072 }, + [0x1D8A] = { unicodeslot=0x1D8A, category='ll', description='LATIN SMALL LETTER S WITH PALATAL HOOK', shcode=0x0073 }, + [0x1D8B] = { unicodeslot=0x1D8B, category='ll', description='LATIN SMALL LETTER ESH WITH PALATAL HOOK', shcode=0x0283 }, + [0x1D8C] = { unicodeslot=0x1D8C, category='ll', description='LATIN SMALL LETTER V WITH PALATAL HOOK', shcode=0x0076 }, + [0x1D8D] = { unicodeslot=0x1D8D, category='ll', description='LATIN SMALL LETTER X WITH PALATAL HOOK', shcode=0x0078 }, + [0x1D8E] = { unicodeslot=0x1D8E, category='ll', description='LATIN SMALL LETTER Z WITH PALATAL HOOK', shcode=0x007A }, + [0x1D8F] = { unicodeslot=0x1D8F, category='ll', description='LATIN SMALL LETTER A WITH RETROFLEX HOOK', shcode=0x0061 }, + [0x1D90] = { unicodeslot=0x1D90, category='ll', description='LATIN SMALL LETTER ALPHA WITH RETROFLEX HOOK', shcode=0x0251 }, + [0x1D91] = { unicodeslot=0x1D91, category='ll', description='LATIN SMALL LETTER D WITH HOOK AND TAIL', shcode=0x0064 }, + [0x1D92] = { unicodeslot=0x1D92, category='ll', description='LATIN SMALL LETTER E WITH RETROFLEX HOOK', shcode=0x0065 }, + [0x1D93] = { unicodeslot=0x1D93, category='ll', description='LATIN SMALL LETTER OPEN E WITH RETROFLEX HOOK' }, + [0x1D94] = { unicodeslot=0x1D94, category='ll', description='LATIN SMALL LETTER REVERSED OPEN E WITH RETROFLEX HOOK' }, + [0x1D95] = { unicodeslot=0x1D95, category='ll', description='LATIN SMALL LETTER SCHWA WITH RETROFLEX HOOK', shcode=0x0259 }, + [0x1D96] = { unicodeslot=0x1D96, category='ll', description='LATIN SMALL LETTER I WITH RETROFLEX HOOK', shcode=0x0069 }, + [0x1D97] = { unicodeslot=0x1D97, category='ll', description='LATIN SMALL LETTER OPEN O WITH RETROFLEX HOOK' }, + [0x1D98] = { unicodeslot=0x1D98, category='ll', description='LATIN SMALL LETTER ESH WITH RETROFLEX HOOK', shcode=0x0283 }, + [0x1D99] = { unicodeslot=0x1D99, category='ll', description='LATIN SMALL LETTER U WITH RETROFLEX HOOK', shcode=0x0075 }, + [0x1D9A] = { unicodeslot=0x1D9A, category='ll', description='LATIN SMALL LETTER EZH WITH RETROFLEX HOOK', shcode=0x0292 }, + [0x1D9B] = { unicodeslot=0x1D9B, category='lm', description='MODIFIER LETTER SMALL TURNED ALPHA', specials={'super',0x0252} }, + [0x1D9C] = { unicodeslot=0x1D9C, category='lm', description='MODIFIER LETTER SMALL C', specials={'super',0x0063} }, + [0x1D9D] = { unicodeslot=0x1D9D, category='lm', description='MODIFIER LETTER SMALL C WITH CURL', specials={'super',0x0255} }, + [0x1D9E] = { unicodeslot=0x1D9E, category='lm', description='MODIFIER LETTER SMALL ETH', specials={'super',0x00F0} }, + [0x1D9F] = { unicodeslot=0x1D9F, category='lm', description='MODIFIER LETTER SMALL REVERSED OPEN E', specials={'super',0x025C} }, + [0x1DA0] = { unicodeslot=0x1DA0, category='lm', description='MODIFIER LETTER SMALL F', specials={'super',0x0066} }, + [0x1DA1] = { unicodeslot=0x1DA1, category='lm', description='MODIFIER LETTER SMALL DOTLESS J WITH STROKE', specials={'super',0x025F} }, + [0x1DA2] = { unicodeslot=0x1DA2, category='lm', description='MODIFIER LETTER SMALL SCRIPT G', specials={'super',0x0261} }, + [0x1DA3] = { unicodeslot=0x1DA3, category='lm', description='MODIFIER LETTER SMALL TURNED H', specials={'super',0x0265} }, + [0x1DA4] = { unicodeslot=0x1DA4, category='lm', description='MODIFIER LETTER SMALL I WITH STROKE', specials={'super',0x0268} }, + [0x1DA5] = { unicodeslot=0x1DA5, category='lm', description='MODIFIER LETTER SMALL IOTA', specials={'super',0x0269} }, + [0x1DA6] = { unicodeslot=0x1DA6, category='lm', description='MODIFIER LETTER SMALL CAPITAL I', specials={'super',0x026A} }, + [0x1DA7] = { unicodeslot=0x1DA7, category='lm', description='MODIFIER LETTER SMALL CAPITAL I WITH STROKE', specials={'super',0x1D7B} }, + [0x1DA8] = { unicodeslot=0x1DA8, category='lm', description='MODIFIER LETTER SMALL J WITH CROSSED-TAIL', specials={'super',0x029D} }, + [0x1DA9] = { unicodeslot=0x1DA9, category='lm', description='MODIFIER LETTER SMALL L WITH RETROFLEX HOOK', specials={'super',0x026D} }, + [0x1DAA] = { unicodeslot=0x1DAA, category='lm', description='MODIFIER LETTER SMALL L WITH PALATAL HOOK', specials={'super',0x1D85} }, + [0x1DAB] = { unicodeslot=0x1DAB, category='lm', description='MODIFIER LETTER SMALL CAPITAL L', specials={'super',0x029F} }, + [0x1DAC] = { unicodeslot=0x1DAC, category='lm', description='MODIFIER LETTER SMALL M WITH HOOK', specials={'super',0x0271} }, + [0x1DAD] = { unicodeslot=0x1DAD, category='lm', description='MODIFIER LETTER SMALL TURNED M WITH LONG LEG', specials={'super',0x0270} }, + [0x1DAE] = { unicodeslot=0x1DAE, category='lm', description='MODIFIER LETTER SMALL N WITH LEFT HOOK', specials={'super',0x0272} }, + [0x1DAF] = { unicodeslot=0x1DAF, category='lm', description='MODIFIER LETTER SMALL N WITH RETROFLEX HOOK', specials={'super',0x0273} }, + [0x1DB0] = { unicodeslot=0x1DB0, category='lm', description='MODIFIER LETTER SMALL CAPITAL N', specials={'super',0x0274} }, + [0x1DB1] = { unicodeslot=0x1DB1, category='lm', description='MODIFIER LETTER SMALL BARRED O', specials={'super',0x0275} }, + [0x1DB2] = { unicodeslot=0x1DB2, category='lm', description='MODIFIER LETTER SMALL PHI', specials={'super',0x0278} }, + [0x1DB3] = { unicodeslot=0x1DB3, category='lm', description='MODIFIER LETTER SMALL S WITH HOOK', specials={'super',0x0282} }, + [0x1DB4] = { unicodeslot=0x1DB4, category='lm', description='MODIFIER LETTER SMALL ESH', specials={'super',0x0283} }, + [0x1DB5] = { unicodeslot=0x1DB5, category='lm', description='MODIFIER LETTER SMALL T WITH PALATAL HOOK', specials={'super',0x01AB} }, + [0x1DB6] = { unicodeslot=0x1DB6, category='lm', description='MODIFIER LETTER SMALL U BAR', specials={'super',0x0289} }, + [0x1DB7] = { unicodeslot=0x1DB7, category='lm', description='MODIFIER LETTER SMALL UPSILON', specials={'super',0x028A} }, + [0x1DB8] = { unicodeslot=0x1DB8, category='lm', description='MODIFIER LETTER SMALL CAPITAL U', specials={'super',0x1D1C} }, + [0x1DB9] = { unicodeslot=0x1DB9, category='lm', description='MODIFIER LETTER SMALL V WITH HOOK', specials={'super',0x028B} }, + [0x1DBA] = { unicodeslot=0x1DBA, category='lm', description='MODIFIER LETTER SMALL TURNED V', specials={'super',0x028C} }, + [0x1DBB] = { unicodeslot=0x1DBB, category='lm', description='MODIFIER LETTER SMALL Z', specials={'super',0x007A} }, + [0x1DBC] = { unicodeslot=0x1DBC, category='lm', description='MODIFIER LETTER SMALL Z WITH RETROFLEX HOOK', specials={'super',0x0290} }, + [0x1DBD] = { unicodeslot=0x1DBD, category='lm', description='MODIFIER LETTER SMALL Z WITH CURL', specials={'super',0x0291} }, + [0x1DBE] = { unicodeslot=0x1DBE, category='lm', description='MODIFIER LETTER SMALL EZH', specials={'super',0x0292} }, + [0x1DBF] = { unicodeslot=0x1DBF, category='lm', description='MODIFIER LETTER SMALL THETA', specials={'super',0x03B8} }, + [0x1DC0] = { unicodeslot=0x1DC0, category='mn', description='COMBINING DOTTED GRAVE ACCENT' }, + [0x1DC1] = { unicodeslot=0x1DC1, category='mn', description='COMBINING DOTTED ACUTE ACCENT' }, + [0x1DC2] = { unicodeslot=0x1DC2, category='mn', description='COMBINING SNAKE BELOW' }, + [0x1DC3] = { unicodeslot=0x1DC3, category='mn', description='COMBINING SUSPENSION MARK' }, + [0x1DC4] = { unicodeslot=0x1DC4, category='mn', description='COMBINING MACRON-ACUTE' }, + [0x1DC5] = { unicodeslot=0x1DC5, category='mn', description='COMBINING GRAVE-MACRON' }, + [0x1DC6] = { unicodeslot=0x1DC6, category='mn', description='COMBINING MACRON-GRAVE' }, + [0x1DC7] = { unicodeslot=0x1DC7, category='mn', description='COMBINING ACUTE-MACRON' }, + [0x1DC8] = { unicodeslot=0x1DC8, category='mn', description='COMBINING GRAVE-ACUTE-GRAVE' }, + [0x1DC9] = { unicodeslot=0x1DC9, category='mn', description='COMBINING ACUTE-GRAVE-ACUTE' }, + [0x1DCA] = { unicodeslot=0x1DCA, category='mn', description='COMBINING LATIN SMALL LETTER R BELOW' }, + [0x1DFE] = { unicodeslot=0x1DFE, category='mn', description='COMBINING LEFT ARROWHEAD ABOVE' }, + [0x1DFF] = { unicodeslot=0x1DFF, category='mn', description='COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW' }, + [0x1E00] = { unicodeslot=0x1E00, category='lu', description='LATIN CAPITAL LETTER A WITH RING BELOW', shcode=0x0041, lccode=0x1E01, specials={'char',0x0041,0x0325} }, + [0x1E01] = { unicodeslot=0x1E01, category='ll', description='LATIN SMALL LETTER A WITH RING BELOW', shcode=0x0061, uccode=0x1E00, specials={'char',0x0061,0x0325} }, + [0x1E02] = { unicodeslot=0x1E02, category='lu', description='LATIN CAPITAL LETTER B WITH DOT ABOVE', shcode=0x0042, lccode=0x1E03, specials={'char',0x0042,0x0307} }, + [0x1E03] = { unicodeslot=0x1E03, category='ll', description='LATIN SMALL LETTER B WITH DOT ABOVE', shcode=0x0062, uccode=0x1E02, specials={'char',0x0062,0x0307} }, + [0x1E04] = { unicodeslot=0x1E04, category='lu', description='LATIN CAPITAL LETTER B WITH DOT BELOW', shcode=0x0042, lccode=0x1E05, specials={'char',0x0042,0x0323} }, + [0x1E05] = { unicodeslot=0x1E05, category='ll', description='LATIN SMALL LETTER B WITH DOT BELOW', shcode=0x0062, uccode=0x1E04, specials={'char',0x0062,0x0323} }, + [0x1E06] = { unicodeslot=0x1E06, category='lu', description='LATIN CAPITAL LETTER B WITH LINE BELOW', shcode=0x0042, lccode=0x1E07, specials={'char',0x0042,0x0331} }, + [0x1E07] = { unicodeslot=0x1E07, category='ll', description='LATIN SMALL LETTER B WITH LINE BELOW', shcode=0x0062, uccode=0x1E06, specials={'char',0x0062,0x0331} }, + [0x1E08] = { unicodeslot=0x1E08, category='lu', description='LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE', shcode=0x0043, lccode=0x1E09, specials={'char',0x00C7,0x0301} }, + [0x1E09] = { unicodeslot=0x1E09, category='ll', description='LATIN SMALL LETTER C WITH CEDILLA AND ACUTE', shcode=0x0063, uccode=0x1E08, specials={'char',0x00E7,0x0301} }, + [0x1E0A] = { unicodeslot=0x1E0A, category='lu', description='LATIN CAPITAL LETTER D WITH DOT ABOVE', shcode=0x0044, lccode=0x1E0B, specials={'char',0x0044,0x0307} }, + [0x1E0B] = { unicodeslot=0x1E0B, category='ll', description='LATIN SMALL LETTER D WITH DOT ABOVE', shcode=0x0064, uccode=0x1E0A, specials={'char',0x0064,0x0307} }, + [0x1E0C] = { unicodeslot=0x1E0C, category='lu', description='LATIN CAPITAL LETTER D WITH DOT BELOW', shcode=0x0044, lccode=0x1E0D, specials={'char',0x0044,0x0323} }, + [0x1E0D] = { unicodeslot=0x1E0D, category='ll', description='LATIN SMALL LETTER D WITH DOT BELOW', shcode=0x0064, uccode=0x1E0C, specials={'char',0x0064,0x0323} }, + [0x1E0E] = { unicodeslot=0x1E0E, category='lu', description='LATIN CAPITAL LETTER D WITH LINE BELOW', shcode=0x0044, lccode=0x1E0F, specials={'char',0x0044,0x0331} }, + [0x1E0F] = { unicodeslot=0x1E0F, category='ll', description='LATIN SMALL LETTER D WITH LINE BELOW', shcode=0x0064, uccode=0x1E0E, specials={'char',0x0064,0x0331} }, + [0x1E10] = { unicodeslot=0x1E10, category='lu', description='LATIN CAPITAL LETTER D WITH CEDILLA', shcode=0x0044, lccode=0x1E11, specials={'char',0x0044,0x0327} }, + [0x1E11] = { unicodeslot=0x1E11, category='ll', description='LATIN SMALL LETTER D WITH CEDILLA', shcode=0x0064, uccode=0x1E10, specials={'char',0x0064,0x0327} }, + [0x1E12] = { unicodeslot=0x1E12, category='lu', description='LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW', shcode=0x0044, lccode=0x1E13, specials={'char',0x0044,0x032D} }, + [0x1E13] = { unicodeslot=0x1E13, category='ll', description='LATIN SMALL LETTER D WITH CIRCUMFLEX BELOW', shcode=0x0064, uccode=0x1E12, specials={'char',0x0064,0x032D} }, + [0x1E14] = { unicodeslot=0x1E14, category='lu', description='LATIN CAPITAL LETTER E WITH MACRON AND GRAVE', shcode=0x0045, lccode=0x1E15, specials={'char',0x0112,0x0300} }, + [0x1E15] = { unicodeslot=0x1E15, category='ll', description='LATIN SMALL LETTER E WITH MACRON AND GRAVE', shcode=0x0065, uccode=0x1E14, specials={'char',0x0113,0x0300} }, + [0x1E16] = { unicodeslot=0x1E16, category='lu', description='LATIN CAPITAL LETTER E WITH MACRON AND ACUTE', shcode=0x0045, lccode=0x1E17, specials={'char',0x0112,0x0301} }, + [0x1E17] = { unicodeslot=0x1E17, category='ll', description='LATIN SMALL LETTER E WITH MACRON AND ACUTE', shcode=0x0065, uccode=0x1E16, specials={'char',0x0113,0x0301} }, + [0x1E18] = { unicodeslot=0x1E18, category='lu', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW', shcode=0x0045, lccode=0x1E19, specials={'char',0x0045,0x032D} }, + [0x1E19] = { unicodeslot=0x1E19, category='ll', description='LATIN SMALL LETTER E WITH CIRCUMFLEX BELOW', shcode=0x0065, uccode=0x1E18, specials={'char',0x0065,0x032D} }, + [0x1E1A] = { unicodeslot=0x1E1A, category='lu', description='LATIN CAPITAL LETTER E WITH TILDE BELOW', shcode=0x0045, lccode=0x1E1B, specials={'char',0x0045,0x0330} }, + [0x1E1B] = { unicodeslot=0x1E1B, category='ll', description='LATIN SMALL LETTER E WITH TILDE BELOW', shcode=0x0065, uccode=0x1E1A, specials={'char',0x0065,0x0330} }, + [0x1E1C] = { unicodeslot=0x1E1C, category='lu', description='LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE', shcode=0x0045, lccode=0x1E1D, specials={'char',0x0228,0x0306} }, + [0x1E1D] = { unicodeslot=0x1E1D, category='ll', description='LATIN SMALL LETTER E WITH CEDILLA AND BREVE', shcode=0x0065, uccode=0x1E1C, specials={'char',0x0229,0x0306} }, + [0x1E1E] = { unicodeslot=0x1E1E, category='lu', description='LATIN CAPITAL LETTER F WITH DOT ABOVE', shcode=0x0046, lccode=0x1E1F, specials={'char',0x0046,0x0307} }, + [0x1E1F] = { unicodeslot=0x1E1F, category='ll', description='LATIN SMALL LETTER F WITH DOT ABOVE', shcode=0x0066, uccode=0x1E1E, specials={'char',0x0066,0x0307} }, + [0x1E20] = { unicodeslot=0x1E20, category='lu', description='LATIN CAPITAL LETTER G WITH MACRON', shcode=0x0047, lccode=0x1E21, specials={'char',0x0047,0x0304} }, + [0x1E21] = { unicodeslot=0x1E21, category='ll', description='LATIN SMALL LETTER G WITH MACRON', shcode=0x0067, uccode=0x1E20, specials={'char',0x0067,0x0304} }, + [0x1E22] = { unicodeslot=0x1E22, category='lu', description='LATIN CAPITAL LETTER H WITH DOT ABOVE', shcode=0x0048, lccode=0x1E23, specials={'char',0x0048,0x0307} }, + [0x1E23] = { unicodeslot=0x1E23, category='ll', description='LATIN SMALL LETTER H WITH DOT ABOVE', shcode=0x0068, uccode=0x1E22, specials={'char',0x0068,0x0307} }, + [0x1E24] = { unicodeslot=0x1E24, category='lu', description='LATIN CAPITAL LETTER H WITH DOT BELOW', shcode=0x0048, lccode=0x1E25, specials={'char',0x0048,0x0323} }, + [0x1E25] = { unicodeslot=0x1E25, category='ll', description='LATIN SMALL LETTER H WITH DOT BELOW', shcode=0x0068, uccode=0x1E24, specials={'char',0x0068,0x0323} }, + [0x1E26] = { unicodeslot=0x1E26, category='lu', description='LATIN CAPITAL LETTER H WITH DIAERESIS', shcode=0x0048, lccode=0x1E27, specials={'char',0x0048,0x0308} }, + [0x1E27] = { unicodeslot=0x1E27, category='ll', description='LATIN SMALL LETTER H WITH DIAERESIS', shcode=0x0068, uccode=0x1E26, specials={'char',0x0068,0x0308} }, + [0x1E28] = { unicodeslot=0x1E28, category='lu', description='LATIN CAPITAL LETTER H WITH CEDILLA', shcode=0x0048, lccode=0x1E29, specials={'char',0x0048,0x0327} }, + [0x1E29] = { unicodeslot=0x1E29, category='ll', description='LATIN SMALL LETTER H WITH CEDILLA', shcode=0x0068, uccode=0x1E28, specials={'char',0x0068,0x0327} }, + [0x1E2A] = { unicodeslot=0x1E2A, category='lu', description='LATIN CAPITAL LETTER H WITH BREVE BELOW', shcode=0x0048, lccode=0x1E2B, specials={'char',0x0048,0x032E} }, + [0x1E2B] = { unicodeslot=0x1E2B, category='ll', description='LATIN SMALL LETTER H WITH BREVE BELOW', shcode=0x0068, uccode=0x1E2A, specials={'char',0x0068,0x032E} }, + [0x1E2C] = { unicodeslot=0x1E2C, category='lu', description='LATIN CAPITAL LETTER I WITH TILDE BELOW', shcode=0x0049, lccode=0x1E2D, specials={'char',0x0049,0x0330} }, + [0x1E2D] = { unicodeslot=0x1E2D, category='ll', description='LATIN SMALL LETTER I WITH TILDE BELOW', shcode=0x0069, uccode=0x1E2C, specials={'char',0x0069,0x0330} }, + [0x1E2E] = { unicodeslot=0x1E2E, category='lu', description='LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE', shcode=0x0049, lccode=0x1E2F, specials={'char',0x00CF,0x0301} }, + [0x1E2F] = { unicodeslot=0x1E2F, category='ll', description='LATIN SMALL LETTER I WITH DIAERESIS AND ACUTE', shcode=0x0069, uccode=0x1E2E, specials={'char',0x00EF,0x0301} }, + [0x1E30] = { unicodeslot=0x1E30, category='lu', description='LATIN CAPITAL LETTER K WITH ACUTE', shcode=0x004B, lccode=0x1E31, specials={'char',0x004B,0x0301} }, + [0x1E31] = { unicodeslot=0x1E31, category='ll', description='LATIN SMALL LETTER K WITH ACUTE', shcode=0x006B, uccode=0x1E30, specials={'char',0x006B,0x0301} }, + [0x1E32] = { unicodeslot=0x1E32, category='lu', description='LATIN CAPITAL LETTER K WITH DOT BELOW', shcode=0x004B, lccode=0x1E33, specials={'char',0x004B,0x0323} }, + [0x1E33] = { unicodeslot=0x1E33, category='ll', description='LATIN SMALL LETTER K WITH DOT BELOW', shcode=0x006B, uccode=0x1E32, specials={'char',0x006B,0x0323} }, + [0x1E34] = { unicodeslot=0x1E34, category='lu', description='LATIN CAPITAL LETTER K WITH LINE BELOW', shcode=0x004B, lccode=0x1E35, specials={'char',0x004B,0x0331} }, + [0x1E35] = { unicodeslot=0x1E35, category='ll', description='LATIN SMALL LETTER K WITH LINE BELOW', shcode=0x006B, uccode=0x1E34, specials={'char',0x006B,0x0331} }, + [0x1E36] = { unicodeslot=0x1E36, category='lu', description='LATIN CAPITAL LETTER L WITH DOT BELOW', shcode=0x004C, lccode=0x1E37, specials={'char',0x004C,0x0323} }, + [0x1E37] = { unicodeslot=0x1E37, category='ll', description='LATIN SMALL LETTER L WITH DOT BELOW', shcode=0x006C, uccode=0x1E36, specials={'char',0x006C,0x0323} }, + [0x1E38] = { unicodeslot=0x1E38, category='lu', description='LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON', shcode=0x004C, lccode=0x1E39, specials={'char',0x1E36,0x0304} }, + [0x1E39] = { unicodeslot=0x1E39, category='ll', description='LATIN SMALL LETTER L WITH DOT BELOW AND MACRON', shcode=0x006C, uccode=0x1E38, specials={'char',0x1E37,0x0304} }, + [0x1E3A] = { unicodeslot=0x1E3A, category='lu', description='LATIN CAPITAL LETTER L WITH LINE BELOW', shcode=0x004C, lccode=0x1E3B, specials={'char',0x004C,0x0331} }, + [0x1E3B] = { unicodeslot=0x1E3B, category='ll', description='LATIN SMALL LETTER L WITH LINE BELOW', shcode=0x006C, uccode=0x1E3A, specials={'char',0x006C,0x0331} }, + [0x1E3C] = { unicodeslot=0x1E3C, category='lu', description='LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW', shcode=0x004C, lccode=0x1E3D, specials={'char',0x004C,0x032D} }, + [0x1E3D] = { unicodeslot=0x1E3D, category='ll', description='LATIN SMALL LETTER L WITH CIRCUMFLEX BELOW', shcode=0x006C, uccode=0x1E3C, specials={'char',0x006C,0x032D} }, + [0x1E3E] = { unicodeslot=0x1E3E, category='lu', description='LATIN CAPITAL LETTER M WITH ACUTE', shcode=0x004D, lccode=0x1E3F, specials={'char',0x004D,0x0301} }, + [0x1E3F] = { unicodeslot=0x1E3F, category='ll', description='LATIN SMALL LETTER M WITH ACUTE', shcode=0x006D, uccode=0x1E3E, specials={'char',0x006D,0x0301} }, + [0x1E40] = { unicodeslot=0x1E40, category='lu', description='LATIN CAPITAL LETTER M WITH DOT ABOVE', shcode=0x004D, lccode=0x1E41, specials={'char',0x004D,0x0307} }, + [0x1E41] = { unicodeslot=0x1E41, category='ll', description='LATIN SMALL LETTER M WITH DOT ABOVE', shcode=0x006D, uccode=0x1E40, specials={'char',0x006D,0x0307} }, + [0x1E42] = { unicodeslot=0x1E42, category='lu', description='LATIN CAPITAL LETTER M WITH DOT BELOW', shcode=0x004D, lccode=0x1E43, specials={'char',0x004D,0x0323} }, + [0x1E43] = { unicodeslot=0x1E43, category='ll', description='LATIN SMALL LETTER M WITH DOT BELOW', shcode=0x006D, uccode=0x1E42, specials={'char',0x006D,0x0323} }, + [0x1E44] = { unicodeslot=0x1E44, category='lu', description='LATIN CAPITAL LETTER N WITH DOT ABOVE', shcode=0x004E, lccode=0x1E45, specials={'char',0x004E,0x0307} }, + [0x1E45] = { unicodeslot=0x1E45, category='ll', description='LATIN SMALL LETTER N WITH DOT ABOVE', shcode=0x006E, uccode=0x1E44, specials={'char',0x006E,0x0307} }, + [0x1E46] = { unicodeslot=0x1E46, category='lu', description='LATIN CAPITAL LETTER N WITH DOT BELOW', shcode=0x004E, lccode=0x1E47, specials={'char',0x004E,0x0323} }, + [0x1E47] = { unicodeslot=0x1E47, category='ll', description='LATIN SMALL LETTER N WITH DOT BELOW', shcode=0x006E, uccode=0x1E46, specials={'char',0x006E,0x0323} }, + [0x1E48] = { unicodeslot=0x1E48, category='lu', description='LATIN CAPITAL LETTER N WITH LINE BELOW', shcode=0x004E, lccode=0x1E49, specials={'char',0x004E,0x0331} }, + [0x1E49] = { unicodeslot=0x1E49, category='ll', description='LATIN SMALL LETTER N WITH LINE BELOW', shcode=0x006E, uccode=0x1E48, specials={'char',0x006E,0x0331} }, + [0x1E4A] = { unicodeslot=0x1E4A, category='lu', description='LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW', shcode=0x004E, lccode=0x1E4B, specials={'char',0x004E,0x032D} }, + [0x1E4B] = { unicodeslot=0x1E4B, category='ll', description='LATIN SMALL LETTER N WITH CIRCUMFLEX BELOW', shcode=0x006E, uccode=0x1E4A, specials={'char',0x006E,0x032D} }, + [0x1E4C] = { unicodeslot=0x1E4C, category='lu', description='LATIN CAPITAL LETTER O WITH TILDE AND ACUTE', shcode=0x004F, lccode=0x1E4D, specials={'char',0x00D5,0x0301} }, + [0x1E4D] = { unicodeslot=0x1E4D, category='ll', description='LATIN SMALL LETTER O WITH TILDE AND ACUTE', shcode=0x006F, uccode=0x1E4C, specials={'char',0x00F5,0x0301} }, + [0x1E4E] = { unicodeslot=0x1E4E, category='lu', description='LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS', shcode=0x004F, lccode=0x1E4F, specials={'char',0x00D5,0x0308} }, + [0x1E4F] = { unicodeslot=0x1E4F, category='ll', description='LATIN SMALL LETTER O WITH TILDE AND DIAERESIS', shcode=0x006F, uccode=0x1E4E, specials={'char',0x00F5,0x0308} }, + [0x1E50] = { unicodeslot=0x1E50, category='lu', description='LATIN CAPITAL LETTER O WITH MACRON AND GRAVE', shcode=0x004F, lccode=0x1E51, specials={'char',0x014C,0x0300} }, + [0x1E51] = { unicodeslot=0x1E51, category='ll', description='LATIN SMALL LETTER O WITH MACRON AND GRAVE', shcode=0x006F, uccode=0x1E50, specials={'char',0x014D,0x0300} }, + [0x1E52] = { unicodeslot=0x1E52, category='lu', description='LATIN CAPITAL LETTER O WITH MACRON AND ACUTE', shcode=0x004F, lccode=0x1E53, specials={'char',0x014C,0x0301} }, + [0x1E53] = { unicodeslot=0x1E53, category='ll', description='LATIN SMALL LETTER O WITH MACRON AND ACUTE', shcode=0x006F, uccode=0x1E52, specials={'char',0x014D,0x0301} }, + [0x1E54] = { unicodeslot=0x1E54, category='lu', description='LATIN CAPITAL LETTER P WITH ACUTE', shcode=0x0050, lccode=0x1E55, specials={'char',0x0050,0x0301} }, + [0x1E55] = { unicodeslot=0x1E55, category='ll', description='LATIN SMALL LETTER P WITH ACUTE', shcode=0x0070, uccode=0x1E54, specials={'char',0x0070,0x0301} }, + [0x1E56] = { unicodeslot=0x1E56, category='lu', description='LATIN CAPITAL LETTER P WITH DOT ABOVE', shcode=0x0050, lccode=0x1E57, specials={'char',0x0050,0x0307} }, + [0x1E57] = { unicodeslot=0x1E57, category='ll', description='LATIN SMALL LETTER P WITH DOT ABOVE', shcode=0x0070, uccode=0x1E56, specials={'char',0x0070,0x0307} }, + [0x1E58] = { unicodeslot=0x1E58, category='lu', description='LATIN CAPITAL LETTER R WITH DOT ABOVE', shcode=0x0052, lccode=0x1E59, specials={'char',0x0052,0x0307} }, + [0x1E59] = { unicodeslot=0x1E59, category='ll', description='LATIN SMALL LETTER R WITH DOT ABOVE', shcode=0x0072, uccode=0x1E58, specials={'char',0x0072,0x0307} }, + [0x1E5A] = { unicodeslot=0x1E5A, category='lu', description='LATIN CAPITAL LETTER R WITH DOT BELOW', shcode=0x0052, lccode=0x1E5B, specials={'char',0x0052,0x0323} }, + [0x1E5B] = { unicodeslot=0x1E5B, category='ll', description='LATIN SMALL LETTER R WITH DOT BELOW', shcode=0x0072, uccode=0x1E5A, specials={'char',0x0072,0x0323} }, + [0x1E5C] = { unicodeslot=0x1E5C, category='lu', description='LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON', shcode=0x0052, lccode=0x1E5D, specials={'char',0x1E5A,0x0304} }, + [0x1E5D] = { unicodeslot=0x1E5D, category='ll', description='LATIN SMALL LETTER R WITH DOT BELOW AND MACRON', shcode=0x0072, uccode=0x1E5C, specials={'char',0x1E5B,0x0304} }, + [0x1E5E] = { unicodeslot=0x1E5E, category='lu', description='LATIN CAPITAL LETTER R WITH LINE BELOW', shcode=0x0052, lccode=0x1E5F, specials={'char',0x0052,0x0331} }, + [0x1E5F] = { unicodeslot=0x1E5F, category='ll', description='LATIN SMALL LETTER R WITH LINE BELOW', shcode=0x0072, uccode=0x1E5E, specials={'char',0x0072,0x0331} }, + [0x1E60] = { unicodeslot=0x1E60, category='lu', description='LATIN CAPITAL LETTER S WITH DOT ABOVE', shcode=0x0053, lccode=0x1E61, specials={'char',0x0053,0x0307} }, + [0x1E61] = { unicodeslot=0x1E61, category='ll', description='LATIN SMALL LETTER S WITH DOT ABOVE', shcode=0x0073, uccode=0x1E60, specials={'char',0x0073,0x0307} }, + [0x1E62] = { unicodeslot=0x1E62, category='lu', description='LATIN CAPITAL LETTER S WITH DOT BELOW', shcode=0x0053, lccode=0x1E63, specials={'char',0x0053,0x0323} }, + [0x1E63] = { unicodeslot=0x1E63, category='ll', description='LATIN SMALL LETTER S WITH DOT BELOW', shcode=0x0073, uccode=0x1E62, specials={'char',0x0073,0x0323} }, + [0x1E64] = { unicodeslot=0x1E64, category='lu', description='LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE', shcode=0x0053, lccode=0x1E65, specials={'char',0x015A,0x0307} }, + [0x1E65] = { unicodeslot=0x1E65, category='ll', description='LATIN SMALL LETTER S WITH ACUTE AND DOT ABOVE', shcode=0x0073, uccode=0x1E64, specials={'char',0x015B,0x0307} }, + [0x1E66] = { unicodeslot=0x1E66, category='lu', description='LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE', shcode=0x0053, lccode=0x1E67, specials={'char',0x0160,0x0307} }, + [0x1E67] = { unicodeslot=0x1E67, category='ll', description='LATIN SMALL LETTER S WITH CARON AND DOT ABOVE', shcode=0x0073, uccode=0x1E66, specials={'char',0x0161,0x0307} }, + [0x1E68] = { unicodeslot=0x1E68, category='lu', description='LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE', shcode=0x0053, lccode=0x1E69, specials={'char',0x1E62,0x0307} }, + [0x1E69] = { unicodeslot=0x1E69, category='ll', description='LATIN SMALL LETTER S WITH DOT BELOW AND DOT ABOVE', shcode=0x0073, uccode=0x1E68, specials={'char',0x1E63,0x0307} }, + [0x1E6A] = { unicodeslot=0x1E6A, category='lu', description='LATIN CAPITAL LETTER T WITH DOT ABOVE', shcode=0x0054, lccode=0x1E6B, specials={'char',0x0054,0x0307} }, + [0x1E6B] = { unicodeslot=0x1E6B, category='ll', description='LATIN SMALL LETTER T WITH DOT ABOVE', shcode=0x0074, uccode=0x1E6A, specials={'char',0x0074,0x0307} }, + [0x1E6C] = { unicodeslot=0x1E6C, category='lu', description='LATIN CAPITAL LETTER T WITH DOT BELOW', shcode=0x0054, lccode=0x1E6D, specials={'char',0x0054,0x0323} }, + [0x1E6D] = { unicodeslot=0x1E6D, category='ll', description='LATIN SMALL LETTER T WITH DOT BELOW', shcode=0x0074, uccode=0x1E6C, specials={'char',0x0074,0x0323} }, + [0x1E6E] = { unicodeslot=0x1E6E, category='lu', description='LATIN CAPITAL LETTER T WITH LINE BELOW', shcode=0x0054, lccode=0x1E6F, specials={'char',0x0054,0x0331} }, + [0x1E6F] = { unicodeslot=0x1E6F, category='ll', description='LATIN SMALL LETTER T WITH LINE BELOW', shcode=0x0074, uccode=0x1E6E, specials={'char',0x0074,0x0331} }, + [0x1E70] = { unicodeslot=0x1E70, category='lu', description='LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW', shcode=0x0054, lccode=0x1E71, specials={'char',0x0054,0x032D} }, + [0x1E71] = { unicodeslot=0x1E71, category='ll', description='LATIN SMALL LETTER T WITH CIRCUMFLEX BELOW', shcode=0x0074, uccode=0x1E70, specials={'char',0x0074,0x032D} }, + [0x1E72] = { unicodeslot=0x1E72, category='lu', description='LATIN CAPITAL LETTER U WITH DIAERESIS BELOW', shcode=0x0055, lccode=0x1E73, specials={'char',0x0055,0x0324} }, + [0x1E73] = { unicodeslot=0x1E73, category='ll', description='LATIN SMALL LETTER U WITH DIAERESIS BELOW', shcode=0x0075, uccode=0x1E72, specials={'char',0x0075,0x0324} }, + [0x1E74] = { unicodeslot=0x1E74, category='lu', description='LATIN CAPITAL LETTER U WITH TILDE BELOW', shcode=0x0055, lccode=0x1E75, specials={'char',0x0055,0x0330} }, + [0x1E75] = { unicodeslot=0x1E75, category='ll', description='LATIN SMALL LETTER U WITH TILDE BELOW', shcode=0x0075, uccode=0x1E74, specials={'char',0x0075,0x0330} }, + [0x1E76] = { unicodeslot=0x1E76, category='lu', description='LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW', shcode=0x0055, lccode=0x1E77, specials={'char',0x0055,0x032D} }, + [0x1E77] = { unicodeslot=0x1E77, category='ll', description='LATIN SMALL LETTER U WITH CIRCUMFLEX BELOW', shcode=0x0075, uccode=0x1E76, specials={'char',0x0075,0x032D} }, + [0x1E78] = { unicodeslot=0x1E78, category='lu', description='LATIN CAPITAL LETTER U WITH TILDE AND ACUTE', shcode=0x0055, lccode=0x1E79, specials={'char',0x0168,0x0301} }, + [0x1E79] = { unicodeslot=0x1E79, category='ll', description='LATIN SMALL LETTER U WITH TILDE AND ACUTE', shcode=0x0075, uccode=0x1E78, specials={'char',0x0169,0x0301} }, + [0x1E7A] = { unicodeslot=0x1E7A, category='lu', description='LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS', shcode=0x0055, lccode=0x1E7B, specials={'char',0x016A,0x0308} }, + [0x1E7B] = { unicodeslot=0x1E7B, category='ll', description='LATIN SMALL LETTER U WITH MACRON AND DIAERESIS', shcode=0x0075, uccode=0x1E7A, specials={'char',0x016B,0x0308} }, + [0x1E7C] = { unicodeslot=0x1E7C, category='lu', description='LATIN CAPITAL LETTER V WITH TILDE', shcode=0x0056, lccode=0x1E7D, specials={'char',0x0056,0x0303} }, + [0x1E7D] = { unicodeslot=0x1E7D, category='ll', description='LATIN SMALL LETTER V WITH TILDE', shcode=0x0076, uccode=0x1E7C, specials={'char',0x0076,0x0303} }, + [0x1E7E] = { unicodeslot=0x1E7E, category='lu', description='LATIN CAPITAL LETTER V WITH DOT BELOW', shcode=0x0056, lccode=0x1E7F, specials={'char',0x0056,0x0323} }, + [0x1E7F] = { unicodeslot=0x1E7F, category='ll', description='LATIN SMALL LETTER V WITH DOT BELOW', shcode=0x0076, uccode=0x1E7E, specials={'char',0x0076,0x0323} }, + [0x1E80] = { unicodeslot=0x1E80, category='lu', adobename='Wgrave', description='LATIN CAPITAL LETTER W WITH GRAVE', shcode=0x0057, lccode=0x1E81, specials={'char',0x0057,0x0300} }, + [0x1E81] = { unicodeslot=0x1E81, category='ll', adobename='wgrave', description='LATIN SMALL LETTER W WITH GRAVE', shcode=0x0077, uccode=0x1E80, specials={'char',0x0077,0x0300} }, + [0x1E82] = { unicodeslot=0x1E82, category='lu', adobename='Wacute', description='LATIN CAPITAL LETTER W WITH ACUTE', shcode=0x0057, lccode=0x1E83, specials={'char',0x0057,0x0301} }, + [0x1E83] = { unicodeslot=0x1E83, category='ll', adobename='wacute', description='LATIN SMALL LETTER W WITH ACUTE', shcode=0x0077, uccode=0x1E82, specials={'char',0x0077,0x0301} }, + [0x1E84] = { unicodeslot=0x1E84, category='lu', adobename='Wdieresis', description='LATIN CAPITAL LETTER W WITH DIAERESIS', shcode=0x0057, lccode=0x1E85, specials={'char',0x0057,0x0308} }, + [0x1E85] = { unicodeslot=0x1E85, category='ll', adobename='wdieresis', description='LATIN SMALL LETTER W WITH DIAERESIS', shcode=0x0077, uccode=0x1E84, specials={'char',0x0077,0x0308} }, + [0x1E86] = { unicodeslot=0x1E86, category='lu', description='LATIN CAPITAL LETTER W WITH DOT ABOVE', shcode=0x0057, lccode=0x1E87, specials={'char',0x0057,0x0307} }, + [0x1E87] = { unicodeslot=0x1E87, category='ll', description='LATIN SMALL LETTER W WITH DOT ABOVE', shcode=0x0077, uccode=0x1E86, specials={'char',0x0077,0x0307} }, + [0x1E88] = { unicodeslot=0x1E88, category='lu', description='LATIN CAPITAL LETTER W WITH DOT BELOW', shcode=0x0057, lccode=0x1E89, specials={'char',0x0057,0x0323} }, + [0x1E89] = { unicodeslot=0x1E89, category='ll', description='LATIN SMALL LETTER W WITH DOT BELOW', shcode=0x0077, uccode=0x1E88, specials={'char',0x0077,0x0323} }, + [0x1E8A] = { unicodeslot=0x1E8A, category='lu', description='LATIN CAPITAL LETTER X WITH DOT ABOVE', shcode=0x0058, lccode=0x1E8B, specials={'char',0x0058,0x0307} }, + [0x1E8B] = { unicodeslot=0x1E8B, category='ll', description='LATIN SMALL LETTER X WITH DOT ABOVE', shcode=0x0078, uccode=0x1E8A, specials={'char',0x0078,0x0307} }, + [0x1E8C] = { unicodeslot=0x1E8C, category='lu', description='LATIN CAPITAL LETTER X WITH DIAERESIS', shcode=0x0058, lccode=0x1E8D, specials={'char',0x0058,0x0308} }, + [0x1E8D] = { unicodeslot=0x1E8D, category='ll', description='LATIN SMALL LETTER X WITH DIAERESIS', shcode=0x0078, uccode=0x1E8C, specials={'char',0x0078,0x0308} }, + [0x1E8E] = { unicodeslot=0x1E8E, category='lu', description='LATIN CAPITAL LETTER Y WITH DOT ABOVE', shcode=0x0059, lccode=0x1E8F, specials={'char',0x0059,0x0307} }, + [0x1E8F] = { unicodeslot=0x1E8F, category='ll', description='LATIN SMALL LETTER Y WITH DOT ABOVE', shcode=0x0079, uccode=0x1E8E, specials={'char',0x0079,0x0307} }, + [0x1E90] = { unicodeslot=0x1E90, category='lu', description='LATIN CAPITAL LETTER Z WITH CIRCUMFLEX', shcode=0x005A, lccode=0x1E91, specials={'char',0x005A,0x0302} }, + [0x1E91] = { unicodeslot=0x1E91, category='ll', description='LATIN SMALL LETTER Z WITH CIRCUMFLEX', shcode=0x007A, uccode=0x1E90, specials={'char',0x007A,0x0302} }, + [0x1E92] = { unicodeslot=0x1E92, category='lu', description='LATIN CAPITAL LETTER Z WITH DOT BELOW', shcode=0x005A, lccode=0x1E93, specials={'char',0x005A,0x0323} }, + [0x1E93] = { unicodeslot=0x1E93, category='ll', description='LATIN SMALL LETTER Z WITH DOT BELOW', shcode=0x007A, uccode=0x1E92, specials={'char',0x007A,0x0323} }, + [0x1E94] = { unicodeslot=0x1E94, category='lu', description='LATIN CAPITAL LETTER Z WITH LINE BELOW', shcode=0x005A, lccode=0x1E95, specials={'char',0x005A,0x0331} }, + [0x1E95] = { unicodeslot=0x1E95, category='ll', description='LATIN SMALL LETTER Z WITH LINE BELOW', shcode=0x007A, uccode=0x1E94, specials={'char',0x007A,0x0331} }, + [0x1E96] = { unicodeslot=0x1E96, category='ll', description='LATIN SMALL LETTER H WITH LINE BELOW', shcode=0x0068, specials={'char',0x0068,0x0331} }, + [0x1E97] = { unicodeslot=0x1E97, category='ll', description='LATIN SMALL LETTER T WITH DIAERESIS', shcode=0x0074, specials={'char',0x0074,0x0308} }, + [0x1E98] = { unicodeslot=0x1E98, category='ll', description='LATIN SMALL LETTER W WITH RING ABOVE', shcode=0x0077, specials={'char',0x0077,0x030A} }, + [0x1E99] = { unicodeslot=0x1E99, category='ll', description='LATIN SMALL LETTER Y WITH RING ABOVE', shcode=0x0079, specials={'char',0x0079,0x030A} }, + [0x1E9A] = { unicodeslot=0x1E9A, category='ll', description='LATIN SMALL LETTER A WITH RIGHT HALF RING', shcode=0x0061, specials={'compat',0x0061,0x02BE} }, + [0x1E9B] = { unicodeslot=0x1E9B, category='ll', description='LATIN SMALL LETTER LONG S WITH DOT ABOVE', uccode=0x1E60, specials={'char',0x017F,0x0307} }, + [0x1EA0] = { unicodeslot=0x1EA0, category='lu', contextname='Adotbelow', description='LATIN CAPITAL LETTER A WITH DOT BELOW', shcode=0x0041, lccode=0x1EA1, specials={'char',0x0041,0x0323} }, + [0x1EA1] = { unicodeslot=0x1EA1, category='ll', contextname='adotbelow', description='LATIN SMALL LETTER A WITH DOT BELOW', shcode=0x0061, uccode=0x1EA0, specials={'char',0x0061,0x0323} }, + [0x1EA2] = { unicodeslot=0x1EA2, category='lu', contextname='Ahook', description='LATIN CAPITAL LETTER A WITH HOOK ABOVE', shcode=0x0041, lccode=0x1EA3, specials={'char',0x0041,0x0309} }, + [0x1EA3] = { unicodeslot=0x1EA3, category='ll', contextname='ahook', description='LATIN SMALL LETTER A WITH HOOK ABOVE', shcode=0x0061, uccode=0x1EA2, specials={'char',0x0061,0x0309} }, + [0x1EA4] = { unicodeslot=0x1EA4, category='lu', contextname='Acircumflexacute', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE', shcode=0x0041, lccode=0x1EA5, specials={'char',0x00C2,0x0301} }, + [0x1EA5] = { unicodeslot=0x1EA5, category='ll', contextname='acircumflexacute', description='LATIN SMALL LETTER A WITH CIRCUMFLEX AND ACUTE', shcode=0x0061, uccode=0x1EA4, specials={'char',0x00E2,0x0301} }, + [0x1EA6] = { unicodeslot=0x1EA6, category='lu', contextname='Acircumflexgrave', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE', shcode=0x0041, lccode=0x1EA7, specials={'char',0x00C2,0x0300} }, + [0x1EA7] = { unicodeslot=0x1EA7, category='ll', contextname='acircumflexgrave', description='LATIN SMALL LETTER A WITH CIRCUMFLEX AND GRAVE', shcode=0x0061, uccode=0x1EA6, specials={'char',0x00E2,0x0300} }, + [0x1EA8] = { unicodeslot=0x1EA8, category='lu', contextname='Acircumflexhook', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x0041, lccode=0x1EA9, specials={'char',0x00C2,0x0309} }, + [0x1EA9] = { unicodeslot=0x1EA9, category='ll', contextname='acircumflexhook', description='LATIN SMALL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x0061, uccode=0x1EA8, specials={'char',0x00E2,0x0309} }, + [0x1EAA] = { unicodeslot=0x1EAA, category='lu', contextname='Acircumflextilde', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE', shcode=0x0041, lccode=0x1EAB, specials={'char',0x00C2,0x0303} }, + [0x1EAB] = { unicodeslot=0x1EAB, category='ll', contextname='acircumflextilde', description='LATIN SMALL LETTER A WITH CIRCUMFLEX AND TILDE', shcode=0x0061, uccode=0x1EAA, specials={'char',0x00E2,0x0303} }, + [0x1EAC] = { unicodeslot=0x1EAC, category='lu', contextname='Acircumflexdotbelow', description='LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW', shcode=0x0041, lccode=0x1EAD, specials={'char',0x1EA0,0x0302} }, + [0x1EAD] = { unicodeslot=0x1EAD, category='ll', contextname='acircumflexdotbelow', description='LATIN SMALL LETTER A WITH CIRCUMFLEX AND DOT BELOW', shcode=0x0061, uccode=0x1EAC, specials={'char',0x1EA1,0x0302} }, + [0x1EAE] = { unicodeslot=0x1EAE, category='lu', contextname='Abreveacute', description='LATIN CAPITAL LETTER A WITH BREVE AND ACUTE', shcode=0x0041, lccode=0x1EAF, specials={'char',0x0102,0x0301} }, + [0x1EAF] = { unicodeslot=0x1EAF, category='ll', contextname='abreveacute', description='LATIN SMALL LETTER A WITH BREVE AND ACUTE', shcode=0x0061, uccode=0x1EAE, specials={'char',0x0103,0x0301} }, + [0x1EB0] = { unicodeslot=0x1EB0, category='lu', contextname='Abrevegrave', description='LATIN CAPITAL LETTER A WITH BREVE AND GRAVE', shcode=0x0041, lccode=0x1EB1, specials={'char',0x0102,0x0300} }, + [0x1EB1] = { unicodeslot=0x1EB1, category='ll', contextname='abrevegrave', description='LATIN SMALL LETTER A WITH BREVE AND GRAVE', shcode=0x0061, uccode=0x1EB0, specials={'char',0x0103,0x0300} }, + [0x1EB2] = { unicodeslot=0x1EB2, category='lu', contextname='Abrevehook', description='LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE', shcode=0x0041, lccode=0x1EB3, specials={'char',0x0102,0x0309} }, + [0x1EB3] = { unicodeslot=0x1EB3, category='ll', contextname='abrevehook', description='LATIN SMALL LETTER A WITH BREVE AND HOOK ABOVE', shcode=0x0061, uccode=0x1EB2, specials={'char',0x0103,0x0309} }, + [0x1EB4] = { unicodeslot=0x1EB4, category='lu', contextname='Abrevetilde', description='LATIN CAPITAL LETTER A WITH BREVE AND TILDE', shcode=0x0041, lccode=0x1EB5, specials={'char',0x0102,0x0303} }, + [0x1EB5] = { unicodeslot=0x1EB5, category='ll', contextname='abrevetilde', description='LATIN SMALL LETTER A WITH BREVE AND TILDE', shcode=0x0061, uccode=0x1EB4, specials={'char',0x0103,0x0303} }, + [0x1EB6] = { unicodeslot=0x1EB6, category='lu', contextname='Abrevedotbelow', description='LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW', shcode=0x0041, lccode=0x1EB7, specials={'char',0x1EA0,0x0306} }, + [0x1EB7] = { unicodeslot=0x1EB7, category='ll', contextname='abrevedotbelow', description='LATIN SMALL LETTER A WITH BREVE AND DOT BELOW', shcode=0x0061, uccode=0x1EB6, specials={'char',0x1EA1,0x0306} }, + [0x1EB8] = { unicodeslot=0x1EB8, category='lu', contextname='Edotbelow', description='LATIN CAPITAL LETTER E WITH DOT BELOW', shcode=0x0045, lccode=0x1EB9, specials={'char',0x0045,0x0323} }, + [0x1EB9] = { unicodeslot=0x1EB9, category='ll', contextname='edotbelow', description='LATIN SMALL LETTER E WITH DOT BELOW', shcode=0x0065, uccode=0x1EB8, specials={'char',0x0065,0x0323} }, + [0x1EBA] = { unicodeslot=0x1EBA, category='lu', contextname='Ehook', description='LATIN CAPITAL LETTER E WITH HOOK ABOVE', shcode=0x0045, lccode=0x1EBB, specials={'char',0x0045,0x0309} }, + [0x1EBB] = { unicodeslot=0x1EBB, category='ll', contextname='ehook', description='LATIN SMALL LETTER E WITH HOOK ABOVE', shcode=0x0065, uccode=0x1EBA, specials={'char',0x0065,0x0309} }, + [0x1EBC] = { unicodeslot=0x1EBC, category='lu', contextname='Etilde', description='LATIN CAPITAL LETTER E WITH TILDE', shcode=0x0045, lccode=0x1EBD, specials={'char',0x0045,0x0303} }, + [0x1EBD] = { unicodeslot=0x1EBD, category='ll', contextname='etilde', description='LATIN SMALL LETTER E WITH TILDE', shcode=0x0065, uccode=0x1EBC, specials={'char',0x0065,0x0303} }, + [0x1EBE] = { unicodeslot=0x1EBE, category='lu', contextname='Ecircumflexacute', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE', shcode=0x0045, lccode=0x1EBF, specials={'char',0x00CA,0x0301} }, + [0x1EBF] = { unicodeslot=0x1EBF, category='ll', contextname='ecircumflexacute', description='LATIN SMALL LETTER E WITH CIRCUMFLEX AND ACUTE', shcode=0x0065, uccode=0x1EBE, specials={'char',0x00EA,0x0301} }, + [0x1EC0] = { unicodeslot=0x1EC0, category='lu', contextname='Ecircumflexgrave', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE', shcode=0x0045, lccode=0x1EC1, specials={'char',0x00CA,0x0300} }, + [0x1EC1] = { unicodeslot=0x1EC1, category='ll', contextname='ecircumflexgrave', description='LATIN SMALL LETTER E WITH CIRCUMFLEX AND GRAVE', shcode=0x0065, uccode=0x1EC0, specials={'char',0x00EA,0x0300} }, + [0x1EC2] = { unicodeslot=0x1EC2, category='lu', contextname='Ecircumflexhook', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x0045, lccode=0x1EC3, specials={'char',0x00CA,0x0309} }, + [0x1EC3] = { unicodeslot=0x1EC3, category='ll', contextname='ecircumflexhook', description='LATIN SMALL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x0065, uccode=0x1EC2, specials={'char',0x00EA,0x0309} }, + [0x1EC4] = { unicodeslot=0x1EC4, category='lu', contextname='Ecircumflextilde', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE', shcode=0x0045, lccode=0x1EC5, specials={'char',0x00CA,0x0303} }, + [0x1EC5] = { unicodeslot=0x1EC5, category='ll', contextname='ecircumflextilde', description='LATIN SMALL LETTER E WITH CIRCUMFLEX AND TILDE', shcode=0x0065, uccode=0x1EC4, specials={'char',0x00EA,0x0303} }, + [0x1EC6] = { unicodeslot=0x1EC6, category='lu', contextname='Ecircumflexdotbelow', description='LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW', shcode=0x0045, lccode=0x1EC7, specials={'char',0x1EB8,0x0302} }, + [0x1EC7] = { unicodeslot=0x1EC7, category='ll', contextname='ecircumflexdotbelow', description='LATIN SMALL LETTER E WITH CIRCUMFLEX AND DOT BELOW', shcode=0x0065, uccode=0x1EC6, specials={'char',0x1EB9,0x0302} }, + [0x1EC8] = { unicodeslot=0x1EC8, category='lu', contextname='Ihook', description='LATIN CAPITAL LETTER I WITH HOOK ABOVE', shcode=0x0049, lccode=0x1EC9, specials={'char',0x0049,0x0309} }, + [0x1EC9] = { unicodeslot=0x1EC9, category='ll', contextname='ihook', description='LATIN SMALL LETTER I WITH HOOK ABOVE', shcode=0x0069, uccode=0x1EC8, specials={'char',0x0069,0x0309} }, + [0x1ECA] = { unicodeslot=0x1ECA, category='lu', contextname='Idotbelow', description='LATIN CAPITAL LETTER I WITH DOT BELOW', shcode=0x0049, lccode=0x1ECB, specials={'char',0x0049,0x0323} }, + [0x1ECB] = { unicodeslot=0x1ECB, category='ll', contextname='idotbelow', description='LATIN SMALL LETTER I WITH DOT BELOW', shcode=0x0069, uccode=0x1ECA, specials={'char',0x0069,0x0323} }, + [0x1ECC] = { unicodeslot=0x1ECC, category='lu', contextname='Odotbelow', description='LATIN CAPITAL LETTER O WITH DOT BELOW', shcode=0x004F, lccode=0x1ECD, specials={'char',0x004F,0x0323} }, + [0x1ECD] = { unicodeslot=0x1ECD, category='ll', contextname='odotbelow', description='LATIN SMALL LETTER O WITH DOT BELOW', shcode=0x006F, uccode=0x1ECC, specials={'char',0x006F,0x0323} }, + [0x1ECE] = { unicodeslot=0x1ECE, category='lu', contextname='Ohook', description='LATIN CAPITAL LETTER O WITH HOOK ABOVE', shcode=0x004F, lccode=0x1ECF, specials={'char',0x004F,0x0309} }, + [0x1ECF] = { unicodeslot=0x1ECF, category='ll', contextname='ohook', description='LATIN SMALL LETTER O WITH HOOK ABOVE', shcode=0x006F, uccode=0x1ECE, specials={'char',0x006F,0x0309} }, + [0x1ED0] = { unicodeslot=0x1ED0, category='lu', contextname='Ocircumflexacute', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE', shcode=0x004F, lccode=0x1ED1, specials={'char',0x00D4,0x0301} }, + [0x1ED1] = { unicodeslot=0x1ED1, category='ll', contextname='ocircumflexacute', description='LATIN SMALL LETTER O WITH CIRCUMFLEX AND ACUTE', shcode=0x006F, uccode=0x1ED0, specials={'char',0x00F4,0x0301} }, + [0x1ED2] = { unicodeslot=0x1ED2, category='lu', contextname='Ocircumflexgrave', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE', shcode=0x004F, lccode=0x1ED3, specials={'char',0x00D4,0x0300} }, + [0x1ED3] = { unicodeslot=0x1ED3, category='ll', contextname='ocircumflexgrave', description='LATIN SMALL LETTER O WITH CIRCUMFLEX AND GRAVE', shcode=0x006F, uccode=0x1ED2, specials={'char',0x00F4,0x0300} }, + [0x1ED4] = { unicodeslot=0x1ED4, category='lu', contextname='Ocircumflexhook', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x004F, lccode=0x1ED5, specials={'char',0x00D4,0x0309} }, + [0x1ED5] = { unicodeslot=0x1ED5, category='ll', contextname='ocircumflexhook', description='LATIN SMALL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE', shcode=0x006F, uccode=0x1ED4, specials={'char',0x00F4,0x0309} }, + [0x1ED6] = { unicodeslot=0x1ED6, category='lu', contextname='Ocircumflextilde', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE', shcode=0x004F, lccode=0x1ED7, specials={'char',0x00D4,0x0303} }, + [0x1ED7] = { unicodeslot=0x1ED7, category='ll', contextname='ocircumflextilde', description='LATIN SMALL LETTER O WITH CIRCUMFLEX AND TILDE', shcode=0x006F, uccode=0x1ED6, specials={'char',0x00F4,0x0303} }, + [0x1ED8] = { unicodeslot=0x1ED8, category='lu', contextname='Ocircumflexdotbelow', description='LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW', shcode=0x004F, lccode=0x1ED9, specials={'char',0x1ECC,0x0302} }, + [0x1ED9] = { unicodeslot=0x1ED9, category='ll', contextname='ocircumflexdotbelow', description='LATIN SMALL LETTER O WITH CIRCUMFLEX AND DOT BELOW', shcode=0x006F, uccode=0x1ED8, specials={'char',0x1ECD,0x0302} }, + [0x1EDA] = { unicodeslot=0x1EDA, category='lu', contextname='Ohornacute', description='LATIN CAPITAL LETTER O WITH HORN AND ACUTE', shcode=0x004F, lccode=0x1EDB, specials={'char',0x01A0,0x0301} }, + [0x1EDB] = { unicodeslot=0x1EDB, category='ll', contextname='ohornacute', description='LATIN SMALL LETTER O WITH HORN AND ACUTE', shcode=0x006F, uccode=0x1EDA, specials={'char',0x01A1,0x0301} }, + [0x1EDC] = { unicodeslot=0x1EDC, category='lu', contextname='Ohorngrave', description='LATIN CAPITAL LETTER O WITH HORN AND GRAVE', shcode=0x004F, lccode=0x1EDD, specials={'char',0x01A0,0x0300} }, + [0x1EDD] = { unicodeslot=0x1EDD, category='ll', contextname='ohorngrave', description='LATIN SMALL LETTER O WITH HORN AND GRAVE', shcode=0x006F, uccode=0x1EDC, specials={'char',0x01A1,0x0300} }, + [0x1EDE] = { unicodeslot=0x1EDE, category='lu', contextname='Ohornhook', description='LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE', shcode=0x004F, lccode=0x1EDF, specials={'char',0x01A0,0x0309} }, + [0x1EDF] = { unicodeslot=0x1EDF, category='ll', contextname='ohornhook', description='LATIN SMALL LETTER O WITH HORN AND HOOK ABOVE', shcode=0x006F, uccode=0x1EDE, specials={'char',0x01A1,0x0309} }, + [0x1EE0] = { unicodeslot=0x1EE0, category='lu', contextname='Ohorntilde', description='LATIN CAPITAL LETTER O WITH HORN AND TILDE', shcode=0x004F, lccode=0x1EE1, specials={'char',0x01A0,0x0303} }, + [0x1EE1] = { unicodeslot=0x1EE1, category='ll', contextname='ohorntilde', description='LATIN SMALL LETTER O WITH HORN AND TILDE', shcode=0x006F, uccode=0x1EE0, specials={'char',0x01A1,0x0303} }, + [0x1EE2] = { unicodeslot=0x1EE2, category='lu', contextname='Ohorndotbelow', description='LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW', shcode=0x004F, lccode=0x1EE3, specials={'char',0x01A0,0x0323} }, + [0x1EE3] = { unicodeslot=0x1EE3, category='ll', contextname='ohorndotbelow', description='LATIN SMALL LETTER O WITH HORN AND DOT BELOW', shcode=0x006F, uccode=0x1EE2, specials={'char',0x01A1,0x0323} }, + [0x1EE4] = { unicodeslot=0x1EE4, category='lu', contextname='Udotbelow', description='LATIN CAPITAL LETTER U WITH DOT BELOW', shcode=0x0055, lccode=0x1EE5, specials={'char',0x0055,0x0323} }, + [0x1EE5] = { unicodeslot=0x1EE5, category='ll', contextname='udotbelow', description='LATIN SMALL LETTER U WITH DOT BELOW', shcode=0x0075, uccode=0x1EE4, specials={'char',0x0075,0x0323} }, + [0x1EE6] = { unicodeslot=0x1EE6, category='lu', contextname='Uhook', description='LATIN CAPITAL LETTER U WITH HOOK ABOVE', shcode=0x0055, lccode=0x1EE7, specials={'char',0x0055,0x0309} }, + [0x1EE7] = { unicodeslot=0x1EE7, category='ll', contextname='uhook', description='LATIN SMALL LETTER U WITH HOOK ABOVE', shcode=0x0075, uccode=0x1EE6, specials={'char',0x0075,0x0309} }, + [0x1EE8] = { unicodeslot=0x1EE8, category='lu', contextname='Uhornacute', description='LATIN CAPITAL LETTER U WITH HORN AND ACUTE', shcode=0x0055, lccode=0x1EE9, specials={'char',0x01AF,0x0301} }, + [0x1EE9] = { unicodeslot=0x1EE9, category='ll', contextname='uhornacute', description='LATIN SMALL LETTER U WITH HORN AND ACUTE', shcode=0x0075, uccode=0x1EE8, specials={'char',0x01B0,0x0301} }, + [0x1EEA] = { unicodeslot=0x1EEA, category='lu', contextname='Uhorngrave', description='LATIN CAPITAL LETTER U WITH HORN AND GRAVE', shcode=0x0055, lccode=0x1EEB, specials={'char',0x01AF,0x0300} }, + [0x1EEB] = { unicodeslot=0x1EEB, category='ll', contextname='uhorngrave', description='LATIN SMALL LETTER U WITH HORN AND GRAVE', shcode=0x0075, uccode=0x1EEA, specials={'char',0x01B0,0x0300} }, + [0x1EEC] = { unicodeslot=0x1EEC, category='lu', contextname='Uhornhook', description='LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE', shcode=0x0055, lccode=0x1EED, specials={'char',0x01AF,0x0309} }, + [0x1EED] = { unicodeslot=0x1EED, category='ll', contextname='uhornhook', description='LATIN SMALL LETTER U WITH HORN AND HOOK ABOVE', shcode=0x0075, uccode=0x1EEC, specials={'char',0x01B0,0x0309} }, + [0x1EEE] = { unicodeslot=0x1EEE, category='lu', contextname='Uhorntilde', description='LATIN CAPITAL LETTER U WITH HORN AND TILDE', shcode=0x0055, lccode=0x1EEF, specials={'char',0x01AF,0x0303} }, + [0x1EEF] = { unicodeslot=0x1EEF, category='ll', contextname='uhorntilde', description='LATIN SMALL LETTER U WITH HORN AND TILDE', shcode=0x0075, uccode=0x1EEE, specials={'char',0x01B0,0x0303} }, + [0x1EF0] = { unicodeslot=0x1EF0, category='lu', contextname='Uhorndotbelow', description='LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW', shcode=0x0055, lccode=0x1EF1, specials={'char',0x01AF,0x0323} }, + [0x1EF1] = { unicodeslot=0x1EF1, category='ll', contextname='uhorndotbelow', description='LATIN SMALL LETTER U WITH HORN AND DOT BELOW', shcode=0x0075, uccode=0x1EF0, specials={'char',0x01B0,0x0323} }, + [0x1EF2] = { unicodeslot=0x1EF2, category='lu', adobename='Ygrave', contextname='Ygrave', description='LATIN CAPITAL LETTER Y WITH GRAVE', shcode=0x0059, lccode=0x1EF3, specials={'char',0x0059,0x0300} }, + [0x1EF3] = { unicodeslot=0x1EF3, category='ll', adobename='ygrave', contextname='ygrave', description='LATIN SMALL LETTER Y WITH GRAVE', shcode=0x0079, uccode=0x1EF2, specials={'char',0x0079,0x0300} }, + [0x1EF4] = { unicodeslot=0x1EF4, category='lu', contextname='Ydotbelow', description='LATIN CAPITAL LETTER Y WITH DOT BELOW', shcode=0x0059, lccode=0x1EF5, specials={'char',0x0059,0x0323} }, + [0x1EF5] = { unicodeslot=0x1EF5, category='ll', contextname='ydotbelow', description='LATIN SMALL LETTER Y WITH DOT BELOW', shcode=0x0079, uccode=0x1EF4, specials={'char',0x0079,0x0323} }, + [0x1EF6] = { unicodeslot=0x1EF6, category='lu', contextname='Yhook', description='LATIN CAPITAL LETTER Y WITH HOOK ABOVE', shcode=0x0059, lccode=0x1EF7, specials={'char',0x0059,0x0309} }, + [0x1EF7] = { unicodeslot=0x1EF7, category='ll', contextname='yhook', description='LATIN SMALL LETTER Y WITH HOOK ABOVE', shcode=0x0079, uccode=0x1EF6, specials={'char',0x0079,0x0309} }, + [0x1EF8] = { unicodeslot=0x1EF8, category='lu', contextname='Ytilde', description='LATIN CAPITAL LETTER Y WITH TILDE', shcode=0x0059, lccode=0x1EF9, specials={'char',0x0059,0x0303} }, + [0x1EF9] = { unicodeslot=0x1EF9, category='ll', contextname='ytilde', description='LATIN SMALL LETTER Y WITH TILDE', shcode=0x0079, uccode=0x1EF8, specials={'char',0x0079,0x0303} }, + [0x1F00] = { unicodeslot=0x1F00, category='ll', contextname='greekalphapsili', description='GREEK SMALL LETTER ALPHA WITH PSILI', shcode=0x03B1, uccode=0x1F08, specials={'char',0x03B1,0x0313} }, + [0x1F01] = { unicodeslot=0x1F01, category='ll', contextname='greekalphadasia', description='GREEK SMALL LETTER ALPHA WITH DASIA', shcode=0x03B1, uccode=0x1F09, specials={'char',0x03B1,0x0314} }, + [0x1F02] = { unicodeslot=0x1F02, category='ll', contextname='greekalphapsilivaria', description='GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA', shcode=0x03B1, uccode=0x1F0A, specials={'char',0x1F00,0x0300} }, + [0x1F03] = { unicodeslot=0x1F03, category='ll', contextname='greekalphadasiavaria', description='GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA', shcode=0x03B1, uccode=0x1F0B, specials={'char',0x1F01,0x0300} }, + [0x1F04] = { unicodeslot=0x1F04, category='ll', contextname='greekalphapsilitonos', description='GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA', shcode=0x03B1, uccode=0x1F0C, specials={'char',0x1F00,0x0301} }, + [0x1F05] = { unicodeslot=0x1F05, category='ll', contextname='greekalphadasiatonos', description='GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA', shcode=0x03B1, uccode=0x1F0D, specials={'char',0x1F01,0x0301} }, + [0x1F06] = { unicodeslot=0x1F06, category='ll', contextname='greekalphapsiliperispomeni', description='GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI', shcode=0x03B1, uccode=0x1F0E, specials={'char',0x1F00,0x0342} }, + [0x1F07] = { unicodeslot=0x1F07, category='ll', contextname='greekalphadasiaperispomeni', description='GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI', shcode=0x03B1, uccode=0x1F0F, specials={'char',0x1F01,0x0342} }, + [0x1F08] = { unicodeslot=0x1F08, category='lu', contextname='greekAlphapsili', description='GREEK CAPITAL LETTER ALPHA WITH PSILI', shcode=0x0391, lccode=0x1F00, specials={'char',0x0391,0x0313} }, + [0x1F09] = { unicodeslot=0x1F09, category='lu', contextname='greekAlphadasia', description='GREEK CAPITAL LETTER ALPHA WITH DASIA', shcode=0x0391, lccode=0x1F01, specials={'char',0x0391,0x0314} }, + [0x1F0A] = { unicodeslot=0x1F0A, category='lu', contextname='greekAlphapsilivaria', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA', shcode=0x0391, lccode=0x1F02, specials={'char',0x1F08,0x0300} }, + [0x1F0B] = { unicodeslot=0x1F0B, category='lu', contextname='greekAlphadasiavaria', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA', shcode=0x0391, lccode=0x1F03, specials={'char',0x1F09,0x0300} }, + [0x1F0C] = { unicodeslot=0x1F0C, category='lu', contextname='greekAlphapsilitonos', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA', shcode=0x0391, lccode=0x1F04, specials={'char',0x1F08,0x0301} }, + [0x1F0D] = { unicodeslot=0x1F0D, category='lu', contextname='greekAlphadasiatonos', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA', shcode=0x0391, lccode=0x1F05, specials={'char',0x1F09,0x0301} }, + [0x1F0E] = { unicodeslot=0x1F0E, category='lu', contextname='greekAlphapsiliperispomeni', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI', shcode=0x0391, lccode=0x1F06, specials={'char',0x1F08,0x0342} }, + [0x1F0F] = { unicodeslot=0x1F0F, category='lu', contextname='greekAlphadasiaperispomeni', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI', shcode=0x0391, lccode=0x1F07, specials={'char',0x1F09,0x0342} }, + [0x1F10] = { unicodeslot=0x1F10, category='ll', contextname='greekepsilonpsili', description='GREEK SMALL LETTER EPSILON WITH PSILI', shcode=0x03B5, uccode=0x1F18, specials={'char',0x03B5,0x0313} }, + [0x1F11] = { unicodeslot=0x1F11, category='ll', contextname='greekepsilondasia', description='GREEK SMALL LETTER EPSILON WITH DASIA', shcode=0x03B5, uccode=0x1F19, specials={'char',0x03B5,0x0314} }, + [0x1F12] = { unicodeslot=0x1F12, category='ll', contextname='greekepsilonpsilivaria', description='GREEK SMALL LETTER EPSILON WITH PSILI AND VARIA', shcode=0x03B5, uccode=0x1F1A, specials={'char',0x1F10,0x0300} }, + [0x1F13] = { unicodeslot=0x1F13, category='ll', contextname='greekepsilondasiavaria', description='GREEK SMALL LETTER EPSILON WITH DASIA AND VARIA', shcode=0x03B5, uccode=0x1F1B, specials={'char',0x1F11,0x0300} }, + [0x1F14] = { unicodeslot=0x1F14, category='ll', contextname='greekepsilonpsilitonos', description='GREEK SMALL LETTER EPSILON WITH PSILI AND OXIA', shcode=0x03B5, uccode=0x1F1C, specials={'char',0x1F10,0x0301} }, + [0x1F15] = { unicodeslot=0x1F15, category='ll', contextname='greekepsilondasiatonos', description='GREEK SMALL LETTER EPSILON WITH DASIA AND OXIA', shcode=0x03B5, uccode=0x1F1D, specials={'char',0x1F11,0x0301} }, + [0x1F18] = { unicodeslot=0x1F18, category='lu', contextname='greekEpsilonpsili', description='GREEK CAPITAL LETTER EPSILON WITH PSILI', shcode=0x0395, lccode=0x1F10, specials={'char',0x0395,0x0313} }, + [0x1F19] = { unicodeslot=0x1F19, category='lu', contextname='greekEpsilondasia', description='GREEK CAPITAL LETTER EPSILON WITH DASIA', shcode=0x0395, lccode=0x1F11, specials={'char',0x0395,0x0314} }, + [0x1F1A] = { unicodeslot=0x1F1A, category='lu', contextname='greekEpsilonpsilivaria', description='GREEK CAPITAL LETTER EPSILON WITH PSILI AND VARIA', shcode=0x0395, lccode=0x1F12, specials={'char',0x1F18,0x0300} }, + [0x1F1B] = { unicodeslot=0x1F1B, category='lu', contextname='greekEpsilondasiavaria', description='GREEK CAPITAL LETTER EPSILON WITH DASIA AND VARIA', shcode=0x0395, lccode=0x1F13, specials={'char',0x1F19,0x0300} }, + [0x1F1C] = { unicodeslot=0x1F1C, category='lu', contextname='greekEpsilonpsilitonos', description='GREEK CAPITAL LETTER EPSILON WITH PSILI AND OXIA', shcode=0x0395, lccode=0x1F14, specials={'char',0x1F18,0x0301} }, + [0x1F1D] = { unicodeslot=0x1F1D, category='lu', contextname='greekEpsilondasiatonos', description='GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA', shcode=0x0395, lccode=0x1F15, specials={'char',0x1F19,0x0301} }, + [0x1F20] = { unicodeslot=0x1F20, category='ll', contextname='greeketapsili', description='GREEK SMALL LETTER ETA WITH PSILI', shcode=0x03B7, uccode=0x1F28, specials={'char',0x03B7,0x0313} }, + [0x1F21] = { unicodeslot=0x1F21, category='ll', contextname='greeketadasia', description='GREEK SMALL LETTER ETA WITH DASIA', shcode=0x03B7, uccode=0x1F29, specials={'char',0x03B7,0x0314} }, + [0x1F22] = { unicodeslot=0x1F22, category='ll', contextname='greeketapsilivaria', description='GREEK SMALL LETTER ETA WITH PSILI AND VARIA', shcode=0x03B7, uccode=0x1F2A, specials={'char',0x1F20,0x0300} }, + [0x1F23] = { unicodeslot=0x1F23, category='ll', contextname='greeketadasiavaria', description='GREEK SMALL LETTER ETA WITH DASIA AND VARIA', shcode=0x03B7, uccode=0x1F2B, specials={'char',0x1F21,0x0300} }, + [0x1F24] = { unicodeslot=0x1F24, category='ll', contextname='greeketapsilitonos', description='GREEK SMALL LETTER ETA WITH PSILI AND OXIA', shcode=0x03B7, uccode=0x1F2C, specials={'char',0x1F20,0x0301} }, + [0x1F25] = { unicodeslot=0x1F25, category='ll', contextname='greeketadasiatonos', description='GREEK SMALL LETTER ETA WITH DASIA AND OXIA', shcode=0x03B7, uccode=0x1F2D, specials={'char',0x1F21,0x0301} }, + [0x1F26] = { unicodeslot=0x1F26, category='ll', contextname='greeketapsiliperispomeni', description='GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI', shcode=0x03B7, uccode=0x1F2E, specials={'char',0x1F20,0x0342} }, + [0x1F27] = { unicodeslot=0x1F27, category='ll', contextname='greeketadasiaperispomeni', description='GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI', shcode=0x03B7, uccode=0x1F2F, specials={'char',0x1F21,0x0342} }, + [0x1F28] = { unicodeslot=0x1F28, category='lu', contextname='greekEtapsili', description='GREEK CAPITAL LETTER ETA WITH PSILI', shcode=0x0397, lccode=0x1F20, specials={'char',0x0397,0x0313} }, + [0x1F29] = { unicodeslot=0x1F29, category='lu', contextname='greekEtadasia', description='GREEK CAPITAL LETTER ETA WITH DASIA', shcode=0x0397, lccode=0x1F21, specials={'char',0x0397,0x0314} }, + [0x1F2A] = { unicodeslot=0x1F2A, category='lu', contextname='greekEtapsilivaria', description='GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA', shcode=0x0397, lccode=0x1F22, specials={'char',0x1F28,0x0300} }, + [0x1F2B] = { unicodeslot=0x1F2B, category='lu', contextname='greekEtadasiavaria', description='GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA', shcode=0x0397, lccode=0x1F23, specials={'char',0x1F29,0x0300} }, + [0x1F2C] = { unicodeslot=0x1F2C, category='lu', contextname='greekEtapsilitonos', description='GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA', shcode=0x0397, lccode=0x1F24, specials={'char',0x1F28,0x0301} }, + [0x1F2D] = { unicodeslot=0x1F2D, category='lu', contextname='greekEtadasiatonos', description='GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA', shcode=0x0397, lccode=0x1F25, specials={'char',0x1F29,0x0301} }, + [0x1F2E] = { unicodeslot=0x1F2E, category='lu', contextname='greekEtapsiliperispomeni', description='GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI', shcode=0x0397, lccode=0x1F26, specials={'char',0x1F28,0x0342} }, + [0x1F2F] = { unicodeslot=0x1F2F, category='lu', contextname='greekEtadasiaperispomeni', description='GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI', shcode=0x0397, lccode=0x1F27, specials={'char',0x1F29,0x0342} }, + [0x1F30] = { unicodeslot=0x1F30, category='ll', contextname='greekiotapsili', description='GREEK SMALL LETTER IOTA WITH PSILI', shcode=0x03B9, uccode=0x1F38, specials={'char',0x03B9,0x0313} }, + [0x1F31] = { unicodeslot=0x1F31, category='ll', contextname='greekiotadasia', description='GREEK SMALL LETTER IOTA WITH DASIA', shcode=0x03B9, uccode=0x1F39, specials={'char',0x03B9,0x0314} }, + [0x1F32] = { unicodeslot=0x1F32, category='ll', contextname='greekiotapsilivaria', description='GREEK SMALL LETTER IOTA WITH PSILI AND VARIA', shcode=0x03B9, uccode=0x1F3A, specials={'char',0x1F30,0x0300} }, + [0x1F33] = { unicodeslot=0x1F33, category='ll', contextname='greekiotadasiavaria', description='GREEK SMALL LETTER IOTA WITH DASIA AND VARIA', shcode=0x03B9, uccode=0x1F3B, specials={'char',0x1F31,0x0300} }, + [0x1F34] = { unicodeslot=0x1F34, category='ll', contextname='greekiotapsilitonos', description='GREEK SMALL LETTER IOTA WITH PSILI AND OXIA', shcode=0x03B9, uccode=0x1F3C, specials={'char',0x1F30,0x0301} }, + [0x1F35] = { unicodeslot=0x1F35, category='ll', contextname='greekiotadasiatonos', description='GREEK SMALL LETTER IOTA WITH DASIA AND OXIA', shcode=0x03B9, uccode=0x1F3D, specials={'char',0x1F31,0x0301} }, + [0x1F36] = { unicodeslot=0x1F36, category='ll', contextname='greekiotapsiliperispomeni', description='GREEK SMALL LETTER IOTA WITH PSILI AND PERISPOMENI', shcode=0x03B9, uccode=0x1F3E, specials={'char',0x1F30,0x0342} }, + [0x1F37] = { unicodeslot=0x1F37, category='ll', contextname='greekiotadasiaperispomeni', description='GREEK SMALL LETTER IOTA WITH DASIA AND PERISPOMENI', shcode=0x03B9, uccode=0x1F3F, specials={'char',0x1F31,0x0342} }, + [0x1F38] = { unicodeslot=0x1F38, category='lu', contextname='greekIotapsili', description='GREEK CAPITAL LETTER IOTA WITH PSILI', shcode=0x0399, lccode=0x1F30, specials={'char',0x0399,0x0313} }, + [0x1F39] = { unicodeslot=0x1F39, category='lu', contextname='greekIotadasia', description='GREEK CAPITAL LETTER IOTA WITH DASIA', shcode=0x0399, lccode=0x1F31, specials={'char',0x0399,0x0314} }, + [0x1F3A] = { unicodeslot=0x1F3A, category='lu', contextname='greekIotapsilivaria', description='GREEK CAPITAL LETTER IOTA WITH PSILI AND VARIA', shcode=0x0399, lccode=0x1F32, specials={'char',0x1F38,0x0300} }, + [0x1F3B] = { unicodeslot=0x1F3B, category='lu', contextname='greekIotadasiavaria', description='GREEK CAPITAL LETTER IOTA WITH DASIA AND VARIA', shcode=0x0399, lccode=0x1F33, specials={'char',0x1F39,0x0300} }, + [0x1F3C] = { unicodeslot=0x1F3C, category='lu', contextname='greekIotapsilitonos', description='GREEK CAPITAL LETTER IOTA WITH PSILI AND OXIA', shcode=0x0399, lccode=0x1F34, specials={'char',0x1F38,0x0301} }, + [0x1F3D] = { unicodeslot=0x1F3D, category='lu', contextname='greekIotadasiatonos', description='GREEK CAPITAL LETTER IOTA WITH DASIA AND OXIA', shcode=0x0399, lccode=0x1F35, specials={'char',0x1F39,0x0301} }, + [0x1F3E] = { unicodeslot=0x1F3E, category='lu', contextname='greekIotapsiliperispomeni', description='GREEK CAPITAL LETTER IOTA WITH PSILI AND PERISPOMENI', shcode=0x0399, lccode=0x1F36, specials={'char',0x1F38,0x0342} }, + [0x1F3F] = { unicodeslot=0x1F3F, category='lu', contextname='greekIotadasiaperispomeni', description='GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI', shcode=0x0399, lccode=0x1F37, specials={'char',0x1F39,0x0342} }, + [0x1F40] = { unicodeslot=0x1F40, category='ll', contextname='greekomicronpsili', description='GREEK SMALL LETTER OMICRON WITH PSILI', shcode=0x03BF, uccode=0x1F48, specials={'char',0x03BF,0x0313} }, + [0x1F41] = { unicodeslot=0x1F41, category='ll', contextname='greekomicrondasia', description='GREEK SMALL LETTER OMICRON WITH DASIA', shcode=0x03BF, uccode=0x1F49, specials={'char',0x03BF,0x0314} }, + [0x1F42] = { unicodeslot=0x1F42, category='ll', contextname='greekomicronpsilivaria', description='GREEK SMALL LETTER OMICRON WITH PSILI AND VARIA', shcode=0x03BF, uccode=0x1F4A, specials={'char',0x1F40,0x0300} }, + [0x1F43] = { unicodeslot=0x1F43, category='ll', contextname='greekomicrondasiavaria', description='GREEK SMALL LETTER OMICRON WITH DASIA AND VARIA', shcode=0x03BF, uccode=0x1F4B, specials={'char',0x1F41,0x0300} }, + [0x1F44] = { unicodeslot=0x1F44, category='ll', contextname='greekomicronpsilitonos', description='GREEK SMALL LETTER OMICRON WITH PSILI AND OXIA', shcode=0x03BF, uccode=0x1F4C, specials={'char',0x1F40,0x0301} }, + [0x1F45] = { unicodeslot=0x1F45, category='ll', contextname='greekomicrondasiatonos', description='GREEK SMALL LETTER OMICRON WITH DASIA AND OXIA', shcode=0x03BF, uccode=0x1F4D, specials={'char',0x1F41,0x0301} }, + [0x1F48] = { unicodeslot=0x1F48, category='lu', contextname='greekOmicronpsili', description='GREEK CAPITAL LETTER OMICRON WITH PSILI', shcode=0x039F, lccode=0x1F40, specials={'char',0x039F,0x0313} }, + [0x1F49] = { unicodeslot=0x1F49, category='lu', contextname='greekOmicrondasia', description='GREEK CAPITAL LETTER OMICRON WITH DASIA', shcode=0x039F, lccode=0x1F41, specials={'char',0x039F,0x0314} }, + [0x1F4A] = { unicodeslot=0x1F4A, category='lu', contextname='greekOmicronpsilivaria', description='GREEK CAPITAL LETTER OMICRON WITH PSILI AND VARIA', shcode=0x039F, lccode=0x1F42, specials={'char',0x1F48,0x0300} }, + [0x1F4B] = { unicodeslot=0x1F4B, category='lu', contextname='greekOmicrondasiavaria', description='GREEK CAPITAL LETTER OMICRON WITH DASIA AND VARIA', shcode=0x039F, lccode=0x1F43, specials={'char',0x1F49,0x0300} }, + [0x1F4C] = { unicodeslot=0x1F4C, category='lu', contextname='greekOmicronpsilitonos', description='GREEK CAPITAL LETTER OMICRON WITH PSILI AND OXIA', shcode=0x039F, lccode=0x1F44, specials={'char',0x1F48,0x0301} }, + [0x1F4D] = { unicodeslot=0x1F4D, category='lu', contextname='greekOmicrondasiatonos', description='GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA', shcode=0x039F, lccode=0x1F45, specials={'char',0x1F49,0x0301} }, + [0x1F50] = { unicodeslot=0x1F50, category='ll', contextname='greekupsilonpsili', description='GREEK SMALL LETTER UPSILON WITH PSILI', shcode=0x03C5, specials={'char',0x03C5,0x0313} }, + [0x1F51] = { unicodeslot=0x1F51, category='ll', contextname='greekupsilondasia', description='GREEK SMALL LETTER UPSILON WITH DASIA', shcode=0x03C5, uccode=0x1F59, specials={'char',0x03C5,0x0314} }, + [0x1F52] = { unicodeslot=0x1F52, category='ll', contextname='greekupsilonpsilivaria', description='GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA', shcode=0x03C5, specials={'char',0x1F50,0x0300} }, + [0x1F53] = { unicodeslot=0x1F53, category='ll', contextname='greekupsilondasiavaria', description='GREEK SMALL LETTER UPSILON WITH DASIA AND VARIA', shcode=0x03C5, uccode=0x1F5B, specials={'char',0x1F51,0x0300} }, + [0x1F54] = { unicodeslot=0x1F54, category='ll', contextname='greekupsilonpsilitonos', description='GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA', shcode=0x03C5, specials={'char',0x1F50,0x0301} }, + [0x1F55] = { unicodeslot=0x1F55, category='ll', contextname='greekupsilondasiatonos', description='GREEK SMALL LETTER UPSILON WITH DASIA AND OXIA', shcode=0x03C5, uccode=0x1F5D, specials={'char',0x1F51,0x0301} }, + [0x1F56] = { unicodeslot=0x1F56, category='ll', contextname='greekupsilonpsiliperispomeni', description='GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI', shcode=0x03C5, specials={'char',0x1F50,0x0342} }, + [0x1F57] = { unicodeslot=0x1F57, category='ll', contextname='greekupsilondasiaperispomeni', description='GREEK SMALL LETTER UPSILON WITH DASIA AND PERISPOMENI', shcode=0x03C5, uccode=0x1F5F, specials={'char',0x1F51,0x0342} }, + [0x1F59] = { unicodeslot=0x1F59, category='lu', contextname='greekUpsilondasia', description='GREEK CAPITAL LETTER UPSILON WITH DASIA', shcode=0x03A5, lccode=0x1F51, specials={'char',0x03A5,0x0314} }, + [0x1F5B] = { unicodeslot=0x1F5B, category='lu', contextname='greekUpsilondasiavaria', description='GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA', shcode=0x03A5, lccode=0x1F53, specials={'char',0x1F59,0x0300} }, + [0x1F5D] = { unicodeslot=0x1F5D, category='lu', contextname='greekUpsilondasiatonos', description='GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA', shcode=0x03A5, lccode=0x1F55, specials={'char',0x1F59,0x0301} }, + [0x1F5F] = { unicodeslot=0x1F5F, category='lu', contextname='greekUpsilondasiaperispomeni', description='GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI', shcode=0x03A5, lccode=0x1F57, specials={'char',0x1F59,0x0342} }, + [0x1F60] = { unicodeslot=0x1F60, category='ll', contextname='greekomegapsili', description='GREEK SMALL LETTER OMEGA WITH PSILI', shcode=0x03C9, uccode=0x1F68, specials={'char',0x03C9,0x0313} }, + [0x1F61] = { unicodeslot=0x1F61, category='ll', contextname='greekomegadasia', description='GREEK SMALL LETTER OMEGA WITH DASIA', shcode=0x03C9, uccode=0x1F69, specials={'char',0x03C9,0x0314} }, + [0x1F62] = { unicodeslot=0x1F62, category='ll', contextname='greekomegapsilivaria', description='GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA', shcode=0x03C9, uccode=0x1F6A, specials={'char',0x1F60,0x0300} }, + [0x1F63] = { unicodeslot=0x1F63, category='ll', contextname='greekomegadasiavaria', description='GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA', shcode=0x03C9, uccode=0x1F6B, specials={'char',0x1F61,0x0300} }, + [0x1F64] = { unicodeslot=0x1F64, category='ll', contextname='greekomegapsilitonos', description='GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA', shcode=0x03C9, uccode=0x1F6C, specials={'char',0x1F60,0x0301} }, + [0x1F65] = { unicodeslot=0x1F65, category='ll', contextname='greekomegadasiatonos', description='GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA', shcode=0x03C9, uccode=0x1F6D, specials={'char',0x1F61,0x0301} }, + [0x1F66] = { unicodeslot=0x1F66, category='ll', contextname='greekomegapsiliperispomeni', description='GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI', shcode=0x03C9, uccode=0x1F6E, specials={'char',0x1F60,0x0342} }, + [0x1F67] = { unicodeslot=0x1F67, category='ll', contextname='greekomegadasiaperispomeni', description='GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI', shcode=0x03C9, uccode=0x1F6F, specials={'char',0x1F61,0x0342} }, + [0x1F68] = { unicodeslot=0x1F68, category='lu', contextname='greekOmegapsili', description='GREEK CAPITAL LETTER OMEGA WITH PSILI', shcode=0x03A9, lccode=0x1F60, specials={'char',0x03A9,0x0313} }, + [0x1F69] = { unicodeslot=0x1F69, category='lu', contextname='greekOmegadasia', description='GREEK CAPITAL LETTER OMEGA WITH DASIA', shcode=0x03A9, lccode=0x1F61, specials={'char',0x03A9,0x0314} }, + [0x1F6A] = { unicodeslot=0x1F6A, category='lu', contextname='greekOmegapsilivaria', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA', shcode=0x03A9, lccode=0x1F62, specials={'char',0x1F68,0x0300} }, + [0x1F6B] = { unicodeslot=0x1F6B, category='lu', contextname='greekOmegadasiavaria', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA', shcode=0x03A9, lccode=0x1F63, specials={'char',0x1F69,0x0300} }, + [0x1F6C] = { unicodeslot=0x1F6C, category='lu', contextname='greekOmegapsilitonos', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA', shcode=0x03A9, lccode=0x1F64, specials={'char',0x1F68,0x0301} }, + [0x1F6D] = { unicodeslot=0x1F6D, category='lu', contextname='greekOmegadasiatonos', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA', shcode=0x03A9, lccode=0x1F65, specials={'char',0x1F69,0x0301} }, + [0x1F6E] = { unicodeslot=0x1F6E, category='lu', contextname='greekOmegapsiliperispomeni', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI', shcode=0x03A9, lccode=0x1F66, specials={'char',0x1F68,0x0342} }, + [0x1F6F] = { unicodeslot=0x1F6F, category='lu', contextname='greekOmegadasiaperispomeni', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI', shcode=0x03A9, lccode=0x1F67, specials={'char',0x1F69,0x0342} }, + [0x1F70] = { unicodeslot=0x1F70, category='ll', contextname='greekalphavaria', description='GREEK SMALL LETTER ALPHA WITH VARIA', shcode=0x03B1, uccode=0x1FBA, specials={'char',0x03B1,0x0300} }, + [0x1F71] = { unicodeslot=0x1F71, category='ll', contextname='greekalphaoxia', description='GREEK SMALL LETTER ALPHA WITH OXIA', shcode=0x03B1, uccode=0x1FBB, specials={'char',0x03AC} }, + [0x1F72] = { unicodeslot=0x1F72, category='ll', contextname='greekepsilonvaria', description='GREEK SMALL LETTER EPSILON WITH VARIA', shcode=0x03B5, uccode=0x1FC8, specials={'char',0x03B5,0x0300} }, + [0x1F73] = { unicodeslot=0x1F73, category='ll', contextname='greekepsilonoxia', description='GREEK SMALL LETTER EPSILON WITH OXIA', shcode=0x03B5, uccode=0x1FC9, specials={'char',0x03AD} }, + [0x1F74] = { unicodeslot=0x1F74, category='ll', contextname='greeketavaria', description='GREEK SMALL LETTER ETA WITH VARIA', shcode=0x03B7, uccode=0x1FCA, specials={'char',0x03B7,0x0300} }, + [0x1F75] = { unicodeslot=0x1F75, category='ll', contextname='greeketaoxia', description='GREEK SMALL LETTER ETA WITH OXIA', shcode=0x03B7, uccode=0x1FCB, specials={'char',0x03AE} }, + [0x1F76] = { unicodeslot=0x1F76, category='ll', contextname='greekiotavaria', description='GREEK SMALL LETTER IOTA WITH VARIA', shcode=0x03B9, uccode=0x1FDA, specials={'char',0x03B9,0x0300} }, + [0x1F77] = { unicodeslot=0x1F77, category='ll', contextname='greekiotaoxia', description='GREEK SMALL LETTER IOTA WITH OXIA', shcode=0x03B9, uccode=0x1FDB, specials={'char',0x03AF} }, + [0x1F78] = { unicodeslot=0x1F78, category='ll', contextname='greekomicronvaria', description='GREEK SMALL LETTER OMICRON WITH VARIA', shcode=0x03BF, uccode=0x1FF8, specials={'char',0x03BF,0x0300} }, + [0x1F79] = { unicodeslot=0x1F79, category='ll', contextname='greekomicronoxia', description='GREEK SMALL LETTER OMICRON WITH OXIA', shcode=0x03BF, uccode=0x1FF9, specials={'char',0x03CC} }, + [0x1F7A] = { unicodeslot=0x1F7A, category='ll', contextname='greekupsilonvaria', description='GREEK SMALL LETTER UPSILON WITH VARIA', shcode=0x03C5, uccode=0x1FEA, specials={'char',0x03C5,0x0300} }, + [0x1F7B] = { unicodeslot=0x1F7B, category='ll', contextname='greekupsilonoxia', description='GREEK SMALL LETTER UPSILON WITH OXIA', shcode=0x03C5, uccode=0x1FEB, specials={'char',0x03CD} }, + [0x1F7C] = { unicodeslot=0x1F7C, category='ll', contextname='greekomegavaria', description='GREEK SMALL LETTER OMEGA WITH VARIA', shcode=0x03C9, uccode=0x1FFA, specials={'char',0x03C9,0x0300} }, + [0x1F7D] = { unicodeslot=0x1F7D, category='ll', contextname='greekomegaoxia', description='GREEK SMALL LETTER OMEGA WITH OXIA', shcode=0x03C9, uccode=0x1FFB, specials={'char',0x03CE} }, + [0x1F80] = { unicodeslot=0x1F80, category='ll', contextname='greekalphaiotasubpsili', description='GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F88, specials={'char',0x1F00,0x0345} }, + [0x1F81] = { unicodeslot=0x1F81, category='ll', contextname='greekalphaiotasubdasia', description='GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F89, specials={'char',0x1F01,0x0345} }, + [0x1F82] = { unicodeslot=0x1F82, category='ll', contextname='greekalphaiotasubpsilivaria', description='GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8A, specials={'char',0x1F02,0x0345} }, + [0x1F83] = { unicodeslot=0x1F83, category='ll', contextname='greekalphaiotasubdasiavaria', description='GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8B, specials={'char',0x1F03,0x0345} }, + [0x1F84] = { unicodeslot=0x1F84, category='ll', contextname='greekalphaiotasubpsilitonos', description='GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8C, specials={'char',0x1F04,0x0345} }, + [0x1F85] = { unicodeslot=0x1F85, category='ll', contextname='greekalphaiotasubdasiatonos', description='GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8D, specials={'char',0x1F05,0x0345} }, + [0x1F86] = { unicodeslot=0x1F86, category='ll', contextname='greekalphaiotasubpsiliperispomeni', description='GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8E, specials={'char',0x1F06,0x0345} }, + [0x1F87] = { unicodeslot=0x1F87, category='ll', contextname='greekalphaiotasubdasiaperispomeni', description='GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1F8F, specials={'char',0x1F07,0x0345} }, + [0x1F88] = { unicodeslot=0x1F88, category='lt', contextname='greekAlphaiotasubpsili', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F80, specials={'char',0x1F08,0x0345} }, + [0x1F89] = { unicodeslot=0x1F89, category='lt', contextname='greekAlphaiotasubdasia', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F81, specials={'char',0x1F09,0x0345} }, + [0x1F8A] = { unicodeslot=0x1F8A, category='lt', contextname='greekAlphaiotasubpsilivaria', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F82, specials={'char',0x1F0A,0x0345} }, + [0x1F8B] = { unicodeslot=0x1F8B, category='lt', contextname='greekAlphaiotasubdasiavaria', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F83, specials={'char',0x1F0B,0x0345} }, + [0x1F8C] = { unicodeslot=0x1F8C, category='lt', contextname='greekAlphaiotasubpsilitonos', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F84, specials={'char',0x1F0C,0x0345} }, + [0x1F8D] = { unicodeslot=0x1F8D, category='lt', contextname='greekAlphaiotasubdasiatonos', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F85, specials={'char',0x1F0D,0x0345} }, + [0x1F8E] = { unicodeslot=0x1F8E, category='lt', contextname='greekAlphaiotasubpsiliperispomeni', description='GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F86, specials={'char',0x1F0E,0x0345} }, + [0x1F8F] = { unicodeslot=0x1F8F, category='lt', contextname='greekAlphaiotasubdasiaperispomeni', description='GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x0391, lccode=0x1F87, specials={'char',0x1F0F,0x0345} }, + [0x1F90] = { unicodeslot=0x1F90, category='ll', contextname='greeketaiotasubpsili', description='GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F98, specials={'char',0x1F20,0x0345} }, + [0x1F91] = { unicodeslot=0x1F91, category='ll', contextname='greeketaiotasubdasia', description='GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F99, specials={'char',0x1F21,0x0345} }, + [0x1F92] = { unicodeslot=0x1F92, category='ll', contextname='greeketaiotasubpsilivaria', description='GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9A, specials={'char',0x1F22,0x0345} }, + [0x1F93] = { unicodeslot=0x1F93, category='ll', contextname='greeketaiotasubdasiavaria', description='GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9B, specials={'char',0x1F23,0x0345} }, + [0x1F94] = { unicodeslot=0x1F94, category='ll', contextname='greeketaiotasubpsilitonos', description='GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9C, specials={'char',0x1F24,0x0345} }, + [0x1F95] = { unicodeslot=0x1F95, category='ll', contextname='greeketaiotasubdasiatonos', description='GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9D, specials={'char',0x1F25,0x0345} }, + [0x1F96] = { unicodeslot=0x1F96, category='ll', contextname='greeketaiotasubpsiliperispomeni', description='GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9E, specials={'char',0x1F26,0x0345} }, + [0x1F97] = { unicodeslot=0x1F97, category='ll', contextname='greeketaiotasubdasiaperispomeni', description='GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1F9F, specials={'char',0x1F27,0x0345} }, + [0x1F98] = { unicodeslot=0x1F98, category='lt', contextname='greekEtaiotasubpsili', description='GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F90, specials={'char',0x1F28,0x0345} }, + [0x1F99] = { unicodeslot=0x1F99, category='lt', contextname='greekEtaiotasubdasia', description='GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F91, specials={'char',0x1F29,0x0345} }, + [0x1F9A] = { unicodeslot=0x1F9A, category='lt', contextname='greekEtaiotasubpsilivaria', description='GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F92, specials={'char',0x1F2A,0x0345} }, + [0x1F9B] = { unicodeslot=0x1F9B, category='lt', contextname='greekEtaiotasubdasiavaria', description='GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F93, specials={'char',0x1F2B,0x0345} }, + [0x1F9C] = { unicodeslot=0x1F9C, category='lt', contextname='greekEtaiotasubpsilitonos', description='GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F94, specials={'char',0x1F2C,0x0345} }, + [0x1F9D] = { unicodeslot=0x1F9D, category='lt', contextname='greekEtaiotasubdasiatonos', description='GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F95, specials={'char',0x1F2D,0x0345} }, + [0x1F9E] = { unicodeslot=0x1F9E, category='lt', contextname='greekEtaiotasubpsiliperispomeni', description='GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F96, specials={'char',0x1F2E,0x0345} }, + [0x1F9F] = { unicodeslot=0x1F9F, category='lt', contextname='greekEtaiotasubdasiaperispomeni', description='GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x0397, lccode=0x1F97, specials={'char',0x1F2F,0x0345} }, + [0x1FA0] = { unicodeslot=0x1FA0, category='ll', contextname='greekomegaiotasubpsili', description='GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FA8, specials={'char',0x1F60,0x0345} }, + [0x1FA1] = { unicodeslot=0x1FA1, category='ll', contextname='greekomegaiotasubdasia', description='GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FA9, specials={'char',0x1F61,0x0345} }, + [0x1FA2] = { unicodeslot=0x1FA2, category='ll', contextname='greekomegaiotasubpsilivaria', description='GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAA, specials={'char',0x1F62,0x0345} }, + [0x1FA3] = { unicodeslot=0x1FA3, category='ll', contextname='greekomegaiotasubdasiavaria', description='GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAB, specials={'char',0x1F63,0x0345} }, + [0x1FA4] = { unicodeslot=0x1FA4, category='ll', contextname='greekomegaiotasubpsilitonos', description='GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAC, specials={'char',0x1F64,0x0345} }, + [0x1FA5] = { unicodeslot=0x1FA5, category='ll', contextname='greekomegaiotasubdasiatonos', description='GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAD, specials={'char',0x1F65,0x0345} }, + [0x1FA6] = { unicodeslot=0x1FA6, category='ll', contextname='greekomegaiotasubpsiliperispomeni', description='GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAE, specials={'char',0x1F66,0x0345} }, + [0x1FA7] = { unicodeslot=0x1FA7, category='ll', contextname='greekomegaiotasubdasiaperispomeni', description='GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FAF, specials={'char',0x1F67,0x0345} }, + [0x1FA8] = { unicodeslot=0x1FA8, category='lt', contextname='greekOmegaiotasubpsili', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA0, specials={'char',0x1F68,0x0345} }, + [0x1FA9] = { unicodeslot=0x1FA9, category='lt', contextname='greekOmegaiotasubdasia', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA1, specials={'char',0x1F69,0x0345} }, + [0x1FAA] = { unicodeslot=0x1FAA, category='lt', contextname='greekOmegaiotasubpsilivaria', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA2, specials={'char',0x1F6A,0x0345} }, + [0x1FAB] = { unicodeslot=0x1FAB, category='lt', contextname='greekOmegaiotasubdasiavaria', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA3, specials={'char',0x1F6B,0x0345} }, + [0x1FAC] = { unicodeslot=0x1FAC, category='lt', contextname='greekOmegaiotasubpsilitonos', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA4, specials={'char',0x1F6C,0x0345} }, + [0x1FAD] = { unicodeslot=0x1FAD, category='lt', contextname='greekOmegaiotasubdasiatonos', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA5, specials={'char',0x1F6D,0x0345} }, + [0x1FAE] = { unicodeslot=0x1FAE, category='lt', contextname='greekOmegaiotasubpsiliperispomeni', description='GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA6, specials={'char',0x1F6E,0x0345} }, + [0x1FAF] = { unicodeslot=0x1FAF, category='lt', contextname='greekOmegaiotasubdasiaperispomeni', description='GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FA7, specials={'char',0x1F6F,0x0345} }, + [0x1FB0] = { unicodeslot=0x1FB0, category='ll', contextname='greekalphavrachy', description='GREEK SMALL LETTER ALPHA WITH VRACHY', shcode=0x03B1, uccode=0x1FB8, specials={'char',0x03B1,0x0306} }, + [0x1FB1] = { unicodeslot=0x1FB1, category='ll', contextname='greekalphamacron', description='GREEK SMALL LETTER ALPHA WITH MACRON', shcode=0x03B1, uccode=0x1FB9, specials={'char',0x03B1,0x0304} }, + [0x1FB2] = { unicodeslot=0x1FB2, category='ll', contextname='greekalphaiotasubvaria', description='GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI', shcode=0x03B1, specials={'char',0x1F70,0x0345} }, + [0x1FB3] = { unicodeslot=0x1FB3, category='ll', contextname='greekalphaiotasub', description='GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI', shcode=0x03B1, uccode=0x1FBC, specials={'char',0x03B1,0x0345} }, + [0x1FB4] = { unicodeslot=0x1FB4, category='ll', contextname='greekalphaiotasubtonos', description='GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI', shcode=0x03B1, specials={'char',0x03AC,0x0345} }, + [0x1FB6] = { unicodeslot=0x1FB6, category='ll', contextname='greekalphaperispomeni', description='GREEK SMALL LETTER ALPHA WITH PERISPOMENI', shcode=0x03B1, specials={'char',0x03B1,0x0342} }, + [0x1FB7] = { unicodeslot=0x1FB7, category='ll', contextname='greekalphaiotasubperispomeni', description='GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B1, specials={'char',0x1FB6,0x0345} }, + [0x1FB8] = { unicodeslot=0x1FB8, category='lu', contextname='greekAlphavrachy', description='GREEK CAPITAL LETTER ALPHA WITH VRACHY', shcode=0x0391, lccode=0x1FB0, specials={'char',0x0391,0x0306} }, + [0x1FB9] = { unicodeslot=0x1FB9, category='lu', contextname='greekAlphamacron', description='GREEK CAPITAL LETTER ALPHA WITH MACRON', shcode=0x0391, lccode=0x1FB1, specials={'char',0x0391,0x0304} }, + [0x1FBA] = { unicodeslot=0x1FBA, category='lu', contextname='greekAlphavaria', description='GREEK CAPITAL LETTER ALPHA WITH VARIA', shcode=0x0391, lccode=0x1F70, specials={'char',0x0391,0x0300} }, + [0x1FBB] = { unicodeslot=0x1FBB, category='lu', contextname='greekAlphatonos', description='GREEK CAPITAL LETTER ALPHA WITH OXIA', shcode=0x0391, lccode=0x1F71, specials={'char',0x0386} }, + [0x1FBC] = { unicodeslot=0x1FBC, category='lt', contextname='greekAlphaiotasub', description='GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI', shcode=0x0391, lccode=0x1FB3, specials={'char',0x0391,0x0345} }, + [0x1FBD] = { unicodeslot=0x1FBD, category='sk', contextname='greekCoronis', description='GREEK KORONIS', specials={'compat',0x0020,0x0313} }, + [0x1FBE] = { unicodeslot=0x1FBE, category='ll', contextname='greekprosgegrammeni', description='GREEK PROSGEGRAMMENI', uccode=0x0399, specials={'char',0x03B9} }, + [0x1FBF] = { unicodeslot=0x1FBF, category='sk', contextname='greekpsili', description='GREEK PSILI', specials={'compat',0x0020,0x0313} }, + [0x1FC0] = { unicodeslot=0x1FC0, category='sk', contextname='greekperispomeni', description='GREEK PERISPOMENI', specials={'compat',0x0020,0x0342} }, + [0x1FC1] = { unicodeslot=0x1FC1, category='sk', contextname='greekdialytikaperispomeni', description='GREEK DIALYTIKA AND PERISPOMENI', specials={'char',0x00A8,0x0342} }, + [0x1FC2] = { unicodeslot=0x1FC2, category='ll', contextname='greeketaiotasubvaria', description='GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI', shcode=0x03B7, specials={'char',0x1F74,0x0345} }, + [0x1FC3] = { unicodeslot=0x1FC3, category='ll', contextname='greeketaiotasub', description='GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI', shcode=0x03B7, uccode=0x1FCC, specials={'char',0x03B7,0x0345} }, + [0x1FC4] = { unicodeslot=0x1FC4, category='ll', contextname='greeketaiotasubtonos', description='GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI', shcode=0x03B7, specials={'char',0x03AE,0x0345} }, + [0x1FC6] = { unicodeslot=0x1FC6, category='ll', contextname='greeketaperispomeni', description='GREEK SMALL LETTER ETA WITH PERISPOMENI', shcode=0x03B7, specials={'char',0x03B7,0x0342} }, + [0x1FC7] = { unicodeslot=0x1FC7, category='ll', contextname='greeketaiotasubperispomeni', description='GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03B7, specials={'char',0x1FC6,0x0345} }, + [0x1FC8] = { unicodeslot=0x1FC8, category='lu', contextname='greekEpsilonvaria', description='GREEK CAPITAL LETTER EPSILON WITH VARIA', shcode=0x0395, lccode=0x1F72, specials={'char',0x0395,0x0300} }, + [0x1FC9] = { unicodeslot=0x1FC9, category='lu', contextname='greekEpsilontonos', description='GREEK CAPITAL LETTER EPSILON WITH OXIA', shcode=0x0395, lccode=0x1F73, specials={'char',0x0388} }, + [0x1FCA] = { unicodeslot=0x1FCA, category='lu', contextname='greekEtavaria', description='GREEK CAPITAL LETTER ETA WITH VARIA', shcode=0x0397, lccode=0x1F74, specials={'char',0x0397,0x0300} }, + [0x1FCB] = { unicodeslot=0x1FCB, category='lu', contextname='greekEtatonos', description='GREEK CAPITAL LETTER ETA WITH OXIA', shcode=0x0397, lccode=0x1F75, specials={'char',0x0389} }, + [0x1FCC] = { unicodeslot=0x1FCC, category='lt', contextname='greekEtaiotasub', description='GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI', shcode=0x0397, lccode=0x1FC3, specials={'char',0x0397,0x0345} }, + [0x1FCD] = { unicodeslot=0x1FCD, category='sk', contextname='greekpsilivaria', description='GREEK PSILI AND VARIA', specials={'char',0x1FBF,0x0300} }, + [0x1FCE] = { unicodeslot=0x1FCE, category='sk', contextname='greekpsilitonos', description='GREEK PSILI AND OXIA', specials={'char',0x1FBF,0x0301} }, + [0x1FCF] = { unicodeslot=0x1FCF, category='sk', contextname='greekpsiliperispomeni', description='GREEK PSILI AND PERISPOMENI', specials={'char',0x1FBF,0x0342} }, + [0x1FD0] = { unicodeslot=0x1FD0, category='ll', contextname='greekiotavrachy', description='GREEK SMALL LETTER IOTA WITH VRACHY', shcode=0x03B9, uccode=0x1FD8, specials={'char',0x03B9,0x0306} }, + [0x1FD1] = { unicodeslot=0x1FD1, category='ll', contextname='greekiotamacron', description='GREEK SMALL LETTER IOTA WITH MACRON', shcode=0x03B9, uccode=0x1FD9, specials={'char',0x03B9,0x0304} }, + [0x1FD2] = { unicodeslot=0x1FD2, category='ll', contextname='greekiotadialytikavaria', description='GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA', shcode=0x03B9, specials={'char',0x03CA,0x0300} }, + [0x1FD3] = { unicodeslot=0x1FD3, category='ll', contextname='greekiotadialytikatonos', description='GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA', shcode=0x03B9, specials={'char',0x0390} }, + [0x1FD6] = { unicodeslot=0x1FD6, category='ll', contextname='greekiotaperispomeni', description='GREEK SMALL LETTER IOTA WITH PERISPOMENI', shcode=0x03B9, specials={'char',0x03B9,0x0342} }, + [0x1FD7] = { unicodeslot=0x1FD7, category='ll', contextname='greekiotadialytikaperispomeni', description='GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI', shcode=0x03B9, specials={'char',0x03CA,0x0342} }, + [0x1FD8] = { unicodeslot=0x1FD8, category='lu', contextname='greekIotavrachy', description='GREEK CAPITAL LETTER IOTA WITH VRACHY', shcode=0x0399, lccode=0x1FD0, specials={'char',0x0399,0x0306} }, + [0x1FD9] = { unicodeslot=0x1FD9, category='lu', contextname='greekIotamacron', description='GREEK CAPITAL LETTER IOTA WITH MACRON', shcode=0x0399, lccode=0x1FD1, specials={'char',0x0399,0x0304} }, + [0x1FDA] = { unicodeslot=0x1FDA, category='lu', contextname='greekIotavaria', description='GREEK CAPITAL LETTER IOTA WITH VARIA', shcode=0x0399, lccode=0x1F76, specials={'char',0x0399,0x0300} }, + [0x1FDB] = { unicodeslot=0x1FDB, category='lu', contextname='greekIotatonos', description='GREEK CAPITAL LETTER IOTA WITH OXIA', shcode=0x0399, lccode=0x1F77, specials={'char',0x038A} }, + [0x1FDD] = { unicodeslot=0x1FDD, category='sk', contextname='greekdasiavaria', description='GREEK DASIA AND VARIA', specials={'char',0x1FFE,0x0300} }, + [0x1FDE] = { unicodeslot=0x1FDE, category='sk', contextname='greekdasiatonos', description='GREEK DASIA AND OXIA', specials={'char',0x1FFE,0x0301} }, + [0x1FDF] = { unicodeslot=0x1FDF, category='sk', contextname='greekdasiaperispomeni', description='GREEK DASIA AND PERISPOMENI', specials={'char',0x1FFE,0x0342} }, + [0x1FE0] = { unicodeslot=0x1FE0, category='ll', contextname='greekupsilonvrachy', description='GREEK SMALL LETTER UPSILON WITH VRACHY', shcode=0x03C5, uccode=0x1FE8, specials={'char',0x03C5,0x0306} }, + [0x1FE1] = { unicodeslot=0x1FE1, category='ll', contextname='greekupsilonmacron', description='GREEK SMALL LETTER UPSILON WITH MACRON', shcode=0x03C5, uccode=0x1FE9, specials={'char',0x03C5,0x0304} }, + [0x1FE2] = { unicodeslot=0x1FE2, category='ll', contextname='greekupsilondialytikavaria', description='GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA', shcode=0x03C5, specials={'char',0x03CB,0x0300} }, + [0x1FE3] = { unicodeslot=0x1FE3, category='ll', contextname='greekupsilondialytikatonos', description='GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA', shcode=0x03C5, specials={'char',0x03B0} }, + [0x1FE4] = { unicodeslot=0x1FE4, category='ll', contextname='greekrhopsili', description='GREEK SMALL LETTER RHO WITH PSILI', shcode=0x03C1, specials={'char',0x03C1,0x0313} }, + [0x1FE5] = { unicodeslot=0x1FE5, category='ll', contextname='greekrhodasia', description='GREEK SMALL LETTER RHO WITH DASIA', shcode=0x03C1, uccode=0x1FEC, specials={'char',0x03C1,0x0314} }, + [0x1FE6] = { unicodeslot=0x1FE6, category='ll', contextname='greekupsilonperispomeni', description='GREEK SMALL LETTER UPSILON WITH PERISPOMENI', shcode=0x03C5, specials={'char',0x03C5,0x0342} }, + [0x1FE7] = { unicodeslot=0x1FE7, category='ll', contextname='greekupsilondialytikaperispomeni', description='GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI', shcode=0x03C5, specials={'char',0x03CB,0x0342} }, + [0x1FE8] = { unicodeslot=0x1FE8, category='lu', contextname='greekUpsilonvrachy', description='GREEK CAPITAL LETTER UPSILON WITH VRACHY', shcode=0x03A5, lccode=0x1FE0, specials={'char',0x03A5,0x0306} }, + [0x1FE9] = { unicodeslot=0x1FE9, category='lu', contextname='greekUpsilonmacron', description='GREEK CAPITAL LETTER UPSILON WITH MACRON', shcode=0x03A5, lccode=0x1FE1, specials={'char',0x03A5,0x0304} }, + [0x1FEA] = { unicodeslot=0x1FEA, category='lu', contextname='greekUpsilonvaria', description='GREEK CAPITAL LETTER UPSILON WITH VARIA', shcode=0x03A5, lccode=0x1F7A, specials={'char',0x03A5,0x0300} }, + [0x1FEB] = { unicodeslot=0x1FEB, category='lu', contextname='greekUpsilontonos', description='GREEK CAPITAL LETTER UPSILON WITH OXIA', shcode=0x03A5, lccode=0x1F7B, specials={'char',0x038E} }, + [0x1FEC] = { unicodeslot=0x1FEC, category='lu', contextname='greekRhodasia', description='GREEK CAPITAL LETTER RHO WITH DASIA', shcode=0x03A1, lccode=0x1FE5, specials={'char',0x03A1,0x0314} }, + [0x1FED] = { unicodeslot=0x1FED, category='sk', contextname='greekdialytikavaria', description='GREEK DIALYTIKA AND VARIA', specials={'char',0x00A8,0x0300} }, + [0x1FEE] = { unicodeslot=0x1FEE, category='sk', contextname='greekdialytikatonos', description='GREEK DIALYTIKA AND OXIA', specials={'char',0x0385} }, + [0x1FEF] = { unicodeslot=0x1FEF, category='sk', contextname='greekvaria', description='GREEK VARIA', specials={'char',0x0060} }, + [0x1FF2] = { unicodeslot=0x1FF2, category='ll', contextname='greekomegaiotasubvaria', description='GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI', shcode=0x03C9, specials={'char',0x1F7C,0x0345} }, + [0x1FF3] = { unicodeslot=0x1FF3, category='ll', contextname='greekomegaiotasub', description='GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI', shcode=0x03C9, uccode=0x1FFC, specials={'char',0x03C9,0x0345} }, + [0x1FF4] = { unicodeslot=0x1FF4, category='ll', contextname='greekomegaiotasubtonos', description='GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI', shcode=0x03C9, specials={'char',0x03CE,0x0345} }, + [0x1FF6] = { unicodeslot=0x1FF6, category='ll', contextname='greekomegaperispomeni', description='GREEK SMALL LETTER OMEGA WITH PERISPOMENI', shcode=0x03C9, specials={'char',0x03C9,0x0342} }, + [0x1FF7] = { unicodeslot=0x1FF7, category='ll', contextname='greekomegaiotasubperispomeni', description='GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI', shcode=0x03C9, specials={'char',0x1FF6,0x0345} }, + [0x1FF8] = { unicodeslot=0x1FF8, category='lu', contextname='greekOmicronvaria', description='GREEK CAPITAL LETTER OMICRON WITH VARIA', shcode=0x039F, lccode=0x1F78, specials={'char',0x039F,0x0300} }, + [0x1FF9] = { unicodeslot=0x1FF9, category='lu', contextname='greekOmicrontonos', description='GREEK CAPITAL LETTER OMICRON WITH OXIA', shcode=0x039F, lccode=0x1F79, specials={'char',0x038C} }, + [0x1FFA] = { unicodeslot=0x1FFA, category='lu', contextname='greekOmegavaria', description='GREEK CAPITAL LETTER OMEGA WITH VARIA', shcode=0x03A9, lccode=0x1F7C, specials={'char',0x03A9,0x0300} }, + [0x1FFB] = { unicodeslot=0x1FFB, category='lu', contextname='greekOmegatonos', description='GREEK CAPITAL LETTER OMEGA WITH OXIA', shcode=0x03A9, lccode=0x1F7D, specials={'char',0x038F} }, + [0x1FFC] = { unicodeslot=0x1FFC, category='lt', contextname='greekOmegaiotasub', description='GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI', shcode=0x03A9, lccode=0x1FF3, specials={'char',0x03A9,0x0345} }, + [0x1FFD] = { unicodeslot=0x1FFD, category='sk', contextname='greekoxia', description='GREEK OXIA', specials={'char',0x00B4} }, + [0x1FFE] = { unicodeslot=0x1FFE, category='sk', contextname='greekdasia', description='GREEK DASIA', specials={'compat',0x0020,0x0314} }, + [0x2000] = { unicodeslot=0x2000, category='zs', description='EN QUAD', specials={'char',0x2002} }, + [0x2001] = { unicodeslot=0x2001, category='zs', description='EM QUAD', specials={'char',0x2003} }, + [0x2002] = { unicodeslot=0x2002, category='zs', description='EN SPACE', specials={'compat',0x0020} }, + [0x2003] = { unicodeslot=0x2003, category='zs', description='EM SPACE', specials={'compat',0x0020} }, + [0x2004] = { unicodeslot=0x2004, category='zs', description='THREE-PER-EM SPACE', specials={'compat',0x0020} }, + [0x2005] = { unicodeslot=0x2005, category='zs', description='FOUR-PER-EM SPACE', specials={'compat',0x0020} }, + [0x2006] = { unicodeslot=0x2006, category='zs', description='SIX-PER-EM SPACE', specials={'compat',0x0020} }, + [0x2007] = { unicodeslot=0x2007, category='zs', description='FIGURE SPACE', specials={'nobreak',0x0020} }, + [0x2008] = { unicodeslot=0x2008, category='zs', description='PUNCTUATION SPACE', specials={'compat',0x0020} }, + [0x2009] = { unicodeslot=0x2009, category='zs', description='THIN SPACE', specials={'compat',0x0020} }, + [0x200A] = { unicodeslot=0x200A, category='zs', description='HAIR SPACE', specials={'compat',0x0020} }, + [0x200B] = { unicodeslot=0x200B, category='cf', description='ZERO WIDTH SPACE' }, + [0x200C] = { unicodeslot=0x200C, category='cf', adobename='afii61664', description='ZERO WIDTH NON-JOINER' }, + [0x200D] = { unicodeslot=0x200D, category='cf', adobename='afii301', description='ZERO WIDTH JOINER' }, + [0x200E] = { unicodeslot=0x200E, category='cf', adobename='afii299', description='LEFT-TO-RIGHT MARK' }, + [0x200F] = { unicodeslot=0x200F, category='cf', adobename='afii300', description='RIGHT-TO-LEFT MARK' }, + [0x2010] = { unicodeslot=0x2010, category='pd', description='HYPHEN' }, + [0x2011] = { unicodeslot=0x2011, category='pd', description='NON-BREAKING HYPHEN', specials={'nobreak',0x2010} }, + [0x2012] = { unicodeslot=0x2012, category='pd', adobename='figuredash', contextname='textminus', description='FIGURE DASH' }, + [0x2013] = { unicodeslot=0x2013, category='pd', adobename='endash', contextname='endash', description='EN DASH' }, + [0x2014] = { unicodeslot=0x2014, category='pd', adobename='emdash', contextname='emdash', description='EM DASH' }, + [0x2015] = { unicodeslot=0x2015, category='pd', adobename='afii00208', contextname='texthorizontalbar', description='HORIZONTAL BAR' }, + [0x2016] = { unicodeslot=0x2016, category='po', description='DOUBLE VERTICAL LINE' }, + [0x2017] = { unicodeslot=0x2017, category='po', adobename='underscoredbl', description='DOUBLE LOW LINE', specials={'compat',0x0020,0x0333} }, + [0x2018] = { unicodeslot=0x2018, category='pi', adobename='quoteleft', contextname='quoteleft', description='LEFT SINGLE QUOTATION MARK' }, + [0x2019] = { unicodeslot=0x2019, category='pf', adobename='quoteright', contextname='quoteright', description='RIGHT SINGLE QUOTATION MARK' }, + [0x201A] = { unicodeslot=0x201A, category='ps', adobename='quotesinglbase', contextname='quotesinglebase', description='SINGLE LOW-9 QUOTATION MARK' }, + [0x201B] = { unicodeslot=0x201B, category='pi', adobename='quotereversed', description='SINGLE HIGH-REVERSED-9 QUOTATION MARK' }, + [0x201C] = { unicodeslot=0x201C, category='pi', adobename='quotedblleft', contextname='quotedblleft', description='LEFT DOUBLE QUOTATION MARK' }, + [0x201D] = { unicodeslot=0x201D, category='pf', adobename='quotedblright', contextname='quotedblright', description='RIGHT DOUBLE QUOTATION MARK' }, + [0x201E] = { unicodeslot=0x201E, category='ps', adobename='quotedblbase', contextname='quotedblbase', description='DOUBLE LOW-9 QUOTATION MARK' }, + [0x201F] = { unicodeslot=0x201F, category='pi', description='DOUBLE HIGH-REVERSED-9 QUOTATION MARK' }, + [0x2020] = { unicodeslot=0x2020, category='po', adobename='dagger', contextname='textdag', description='DAGGER' }, + [0x2021] = { unicodeslot=0x2021, category='po', adobename='daggerdbl', contextname='textddag', description='DOUBLE DAGGER' }, + [0x2022] = { unicodeslot=0x2022, category='po', adobename='bullet', contextname='textbullet', description='BULLET' }, + [0x2023] = { unicodeslot=0x2023, category='po', description='TRIANGULAR BULLET' }, + [0x2024] = { unicodeslot=0x2024, category='po', adobename='onedotenleader', description='ONE DOT LEADER', specials={'compat',0x002E} }, + [0x2025] = { unicodeslot=0x2025, category='po', adobename='twodotenleader', description='TWO DOT LEADER', specials={'compat',0x002E,0x002E} }, + [0x2026] = { unicodeslot=0x2026, category='po', adobename='ellipsis', contextname='textellipsis', description='HORIZONTAL ELLIPSIS', specials={'compat',0x002E,0x002E,0x002E} }, + [0x2027] = { unicodeslot=0x2027, category='po', description='HYPHENATION POINT' }, + [0x2028] = { unicodeslot=0x2028, category='zl', description='LINE SEPARATOR' }, + [0x2029] = { unicodeslot=0x2029, category='zp', description='PARAGRAPH SEPARATOR' }, + [0x202A] = { unicodeslot=0x202A, category='cf', description='LEFT-TO-RIGHT EMBEDDING' }, + [0x202B] = { unicodeslot=0x202B, category='cf', description='RIGHT-TO-LEFT EMBEDDING' }, + [0x202C] = { unicodeslot=0x202C, category='cf', adobename='afii61573', description='POP DIRECTIONAL FORMATTING' }, + [0x202D] = { unicodeslot=0x202D, category='cf', adobename='afii61574', description='LEFT-TO-RIGHT OVERRIDE' }, + [0x202E] = { unicodeslot=0x202E, category='cf', adobename='afii61575', description='RIGHT-TO-LEFT OVERRIDE' }, + [0x202F] = { unicodeslot=0x202F, category='zs', description='NARROW NO-BREAK SPACE', specials={'nobreak',0x0020} }, + [0x2030] = { unicodeslot=0x2030, category='po', adobename='perthousand', contextname='perthousand', description='PER MILLE SIGN' }, + [0x2031] = { unicodeslot=0x2031, category='po', description='PER TEN THOUSAND SIGN' }, + [0x2032] = { unicodeslot=0x2032, category='po', adobename='minute', description='PRIME' }, + [0x2033] = { unicodeslot=0x2033, category='po', adobename='second', description='DOUBLE PRIME', specials={'compat',0x2032,0x2032} }, + [0x2034] = { unicodeslot=0x2034, category='po', description='TRIPLE PRIME', specials={'compat',0x2032,0x2032,0x2032} }, + [0x2035] = { unicodeslot=0x2035, category='po', description='REVERSED PRIME' }, + [0x2036] = { unicodeslot=0x2036, category='po', description='REVERSED DOUBLE PRIME', specials={'compat',0x2035,0x2035} }, + [0x2037] = { unicodeslot=0x2037, category='po', description='REVERSED TRIPLE PRIME', specials={'compat',0x2035,0x2035,0x2035} }, + [0x2038] = { unicodeslot=0x2038, category='po', description='CARET' }, + [0x2039] = { unicodeslot=0x2039, category='pi', adobename='guilsinglleft', contextname='guilsingleleft', description='SINGLE LEFT-POINTING ANGLE QUOTATION MARK' }, + [0x203A] = { unicodeslot=0x203A, category='pf', adobename='guilsinglright', contextname='guilsingleright', description='SINGLE RIGHT-POINTING ANGLE QUOTATION MARK' }, + [0x203B] = { unicodeslot=0x203B, category='po', description='REFERENCE MARK' }, + [0x203C] = { unicodeslot=0x203C, category='po', adobename='exclamdbl', description='DOUBLE EXCLAMATION MARK', specials={'compat',0x0021,0x0021} }, + [0x203D] = { unicodeslot=0x203D, category='po', description='INTERROBANG' }, + [0x203E] = { unicodeslot=0x203E, category='po', description='OVERLINE', specials={'compat',0x0020,0x0305} }, + [0x203F] = { unicodeslot=0x203F, category='pc', description='UNDERTIE' }, + [0x2040] = { unicodeslot=0x2040, category='pc', description='CHARACTER TIE' }, + [0x2041] = { unicodeslot=0x2041, category='po', description='CARET INSERTION POINT' }, + [0x2042] = { unicodeslot=0x2042, category='po', description='ASTERISM' }, + [0x2043] = { unicodeslot=0x2043, category='po', description='HYPHEN BULLET' }, + [0x2044] = { unicodeslot=0x2044, category='sm', adobename='fraction', description='FRACTION SLASH' }, + [0x2045] = { unicodeslot=0x2045, category='ps', description='LEFT SQUARE BRACKET WITH QUILL' }, + [0x2046] = { unicodeslot=0x2046, category='pe', description='RIGHT SQUARE BRACKET WITH QUILL' }, + [0x2047] = { unicodeslot=0x2047, category='po', description='DOUBLE QUESTION MARK', specials={'compat',0x003F,0x003F} }, + [0x2048] = { unicodeslot=0x2048, category='po', description='QUESTION EXCLAMATION MARK', specials={'compat',0x003F,0x0021} }, + [0x2049] = { unicodeslot=0x2049, category='po', description='EXCLAMATION QUESTION MARK', specials={'compat',0x0021,0x003F} }, + [0x204A] = { unicodeslot=0x204A, category='po', description='TIRONIAN SIGN ET' }, + [0x204B] = { unicodeslot=0x204B, category='po', description='REVERSED PILCROW SIGN' }, + [0x204C] = { unicodeslot=0x204C, category='po', description='BLACK LEFTWARDS BULLET' }, + [0x204D] = { unicodeslot=0x204D, category='po', description='BLACK RIGHTWARDS BULLET' }, + [0x204E] = { unicodeslot=0x204E, category='po', description='LOW ASTERISK' }, + [0x204F] = { unicodeslot=0x204F, category='po', description='REVERSED SEMICOLON' }, + [0x2050] = { unicodeslot=0x2050, category='po', description='CLOSE UP' }, + [0x2051] = { unicodeslot=0x2051, category='po', description='TWO ASTERISKS ALIGNED VERTICALLY' }, + [0x2052] = { unicodeslot=0x2052, category='sm', description='COMMERCIAL MINUS SIGN' }, + [0x2053] = { unicodeslot=0x2053, category='po', description='SWUNG DASH' }, + [0x2054] = { unicodeslot=0x2054, category='pc', description='INVERTED UNDERTIE' }, + [0x2055] = { unicodeslot=0x2055, category='po', description='FLOWER PUNCTUATION MARK' }, + [0x2056] = { unicodeslot=0x2056, category='po', description='THREE DOT PUNCTUATION' }, + [0x2057] = { unicodeslot=0x2057, category='po', description='QUADRUPLE PRIME', specials={'compat',0x2032,0x2032,0x2032,0x2032} }, + [0x2058] = { unicodeslot=0x2058, category='po', description='FOUR DOT PUNCTUATION' }, + [0x2059] = { unicodeslot=0x2059, category='po', description='FIVE DOT PUNCTUATION' }, + [0x205A] = { unicodeslot=0x205A, category='po', description='TWO DOT PUNCTUATION' }, + [0x205B] = { unicodeslot=0x205B, category='po', description='FOUR DOT MARK' }, + [0x205C] = { unicodeslot=0x205C, category='po', description='DOTTED CROSS' }, + [0x205D] = { unicodeslot=0x205D, category='po', description='TRICOLON' }, + [0x205E] = { unicodeslot=0x205E, category='po', description='VERTICAL FOUR DOTS' }, + [0x205F] = { unicodeslot=0x205F, category='zs', description='MEDIUM MATHEMATICAL SPACE', specials={'compat',0x0020} }, + [0x2060] = { unicodeslot=0x2060, category='cf', description='WORD JOINER' }, + [0x2061] = { unicodeslot=0x2061, category='cf', description='FUNCTION APPLICATION' }, + [0x2062] = { unicodeslot=0x2062, category='cf', description='INVISIBLE TIMES' }, + [0x2063] = { unicodeslot=0x2063, category='cf', description='INVISIBLE SEPARATOR' }, + [0x206A] = { unicodeslot=0x206A, category='cf', description='INHIBIT SYMMETRIC SWAPPING' }, + [0x206B] = { unicodeslot=0x206B, category='cf', description='ACTIVATE SYMMETRIC SWAPPING' }, + [0x206C] = { unicodeslot=0x206C, category='cf', description='INHIBIT ARABIC FORM SHAPING' }, + [0x206D] = { unicodeslot=0x206D, category='cf', description='ACTIVATE ARABIC FORM SHAPING' }, + [0x206E] = { unicodeslot=0x206E, category='cf', description='NATIONAL DIGIT SHAPES' }, + [0x206F] = { unicodeslot=0x206F, category='cf', description='NOMINAL DIGIT SHAPES' }, + [0x2070] = { unicodeslot=0x2070, category='no', description='SUPERSCRIPT ZERO', specials={'super',0x0030} }, + [0x2071] = { unicodeslot=0x2071, category='ll', description='SUPERSCRIPT LATIN SMALL LETTER I', specials={'super',0x0069} }, + [0x2074] = { unicodeslot=0x2074, category='no', description='SUPERSCRIPT FOUR', specials={'super',0x0034} }, + [0x2075] = { unicodeslot=0x2075, category='no', description='SUPERSCRIPT FIVE', specials={'super',0x0035} }, + [0x2076] = { unicodeslot=0x2076, category='no', description='SUPERSCRIPT SIX', specials={'super',0x0036} }, + [0x2077] = { unicodeslot=0x2077, category='no', description='SUPERSCRIPT SEVEN', specials={'super',0x0037} }, + [0x2078] = { unicodeslot=0x2078, category='no', description='SUPERSCRIPT EIGHT', specials={'super',0x0038} }, + [0x2079] = { unicodeslot=0x2079, category='no', description='SUPERSCRIPT NINE', specials={'super',0x0039} }, + [0x207A] = { unicodeslot=0x207A, category='sm', description='SUPERSCRIPT PLUS SIGN', specials={'super',0x002B} }, + [0x207B] = { unicodeslot=0x207B, category='sm', description='SUPERSCRIPT MINUS', specials={'super',0x2212} }, + [0x207C] = { unicodeslot=0x207C, category='sm', description='SUPERSCRIPT EQUALS SIGN', specials={'super',0x003D} }, + [0x207D] = { unicodeslot=0x207D, category='ps', description='SUPERSCRIPT LEFT PARENTHESIS', specials={'super',0x0028} }, + [0x207E] = { unicodeslot=0x207E, category='pe', description='SUPERSCRIPT RIGHT PARENTHESIS', specials={'super',0x0029} }, + [0x207F] = { unicodeslot=0x207F, category='ll', description='SUPERSCRIPT LATIN SMALL LETTER N', specials={'super',0x006E} }, + [0x2080] = { unicodeslot=0x2080, category='no', description='SUBSCRIPT ZERO', specials={'sub',0x0030} }, + [0x2081] = { unicodeslot=0x2081, category='no', description='SUBSCRIPT ONE', specials={'sub',0x0031} }, + [0x2082] = { unicodeslot=0x2082, category='no', description='SUBSCRIPT TWO', specials={'sub',0x0032} }, + [0x2083] = { unicodeslot=0x2083, category='no', description='SUBSCRIPT THREE', specials={'sub',0x0033} }, + [0x2084] = { unicodeslot=0x2084, category='no', description='SUBSCRIPT FOUR', specials={'sub',0x0034} }, + [0x2085] = { unicodeslot=0x2085, category='no', description='SUBSCRIPT FIVE', specials={'sub',0x0035} }, + [0x2086] = { unicodeslot=0x2086, category='no', description='SUBSCRIPT SIX', specials={'sub',0x0036} }, + [0x2087] = { unicodeslot=0x2087, category='no', description='SUBSCRIPT SEVEN', specials={'sub',0x0037} }, + [0x2088] = { unicodeslot=0x2088, category='no', description='SUBSCRIPT EIGHT', specials={'sub',0x0038} }, + [0x2089] = { unicodeslot=0x2089, category='no', description='SUBSCRIPT NINE', specials={'sub',0x0039} }, + [0x208A] = { unicodeslot=0x208A, category='sm', description='SUBSCRIPT PLUS SIGN', specials={'sub',0x002B} }, + [0x208B] = { unicodeslot=0x208B, category='sm', description='SUBSCRIPT MINUS', specials={'sub',0x2212} }, + [0x208C] = { unicodeslot=0x208C, category='sm', description='SUBSCRIPT EQUALS SIGN', specials={'sub',0x003D} }, + [0x208D] = { unicodeslot=0x208D, category='ps', description='SUBSCRIPT LEFT PARENTHESIS', specials={'sub',0x0028} }, + [0x208E] = { unicodeslot=0x208E, category='pe', description='SUBSCRIPT RIGHT PARENTHESIS', specials={'sub',0x0029} }, + [0x2090] = { unicodeslot=0x2090, category='lm', description='LATIN SUBSCRIPT SMALL LETTER A', specials={'sub',0x0061} }, + [0x2091] = { unicodeslot=0x2091, category='lm', description='LATIN SUBSCRIPT SMALL LETTER E', specials={'sub',0x0065} }, + [0x2092] = { unicodeslot=0x2092, category='lm', description='LATIN SUBSCRIPT SMALL LETTER O', specials={'sub',0x006F} }, + [0x2093] = { unicodeslot=0x2093, category='lm', description='LATIN SUBSCRIPT SMALL LETTER X', specials={'sub',0x0078} }, + [0x2094] = { unicodeslot=0x2094, category='lm', description='LATIN SUBSCRIPT SMALL LETTER SCHWA', specials={'sub',0x0259} }, + [0x20A0] = { unicodeslot=0x20A0, category='sc', description='EURO-CURRENCY SIGN' }, + [0x20A1] = { unicodeslot=0x20A1, category='sc', adobename='colonmonetary', description='COLON SIGN' }, + [0x20A2] = { unicodeslot=0x20A2, category='sc', description='CRUZEIRO SIGN' }, + [0x20A3] = { unicodeslot=0x20A3, category='sc', adobename='franc', description='FRENCH FRANC SIGN' }, + [0x20A4] = { unicodeslot=0x20A4, category='sc', adobename='lira', description='LIRA SIGN' }, + [0x20A5] = { unicodeslot=0x20A5, category='sc', description='MILL SIGN' }, + [0x20A6] = { unicodeslot=0x20A6, category='sc', description='NAIRA SIGN' }, + [0x20A7] = { unicodeslot=0x20A7, category='sc', adobename='peseta', description='PESETA SIGN' }, + [0x20A8] = { unicodeslot=0x20A8, category='sc', description='RUPEE SIGN', specials={'compat',0x0052,0x0073} }, + [0x20A9] = { unicodeslot=0x20A9, category='sc', description='WON SIGN' }, + [0x20AA] = { unicodeslot=0x20AA, category='sc', adobename='afii57636', description='NEW SHEQEL SIGN' }, + [0x20AB] = { unicodeslot=0x20AB, category='sc', adobename='dong', contextname='textdong', description='DONG SIGN' }, + [0x20AC] = { unicodeslot=0x20AC, category='sc', adobename='Euro', contextname='texteuro', description='EURO SIGN' }, + [0x20AD] = { unicodeslot=0x20AD, category='sc', description='KIP SIGN' }, + [0x20AE] = { unicodeslot=0x20AE, category='sc', description='TUGRIK SIGN' }, + [0x20AF] = { unicodeslot=0x20AF, category='sc', description='DRACHMA SIGN' }, + [0x20B0] = { unicodeslot=0x20B0, category='sc', description='GERMAN PENNY SIGN' }, + [0x20B1] = { unicodeslot=0x20B1, category='sc', description='PESO SIGN' }, + [0x20B2] = { unicodeslot=0x20B2, category='sc', description='GUARANI SIGN' }, + [0x20B3] = { unicodeslot=0x20B3, category='sc', description='AUSTRAL SIGN' }, + [0x20B4] = { unicodeslot=0x20B4, category='sc', description='HRYVNIA SIGN' }, + [0x20B5] = { unicodeslot=0x20B5, category='sc', description='CEDI SIGN' }, + [0x20D0] = { unicodeslot=0x20D0, category='mn', description='COMBINING LEFT HARPOON ABOVE' }, + [0x20D1] = { unicodeslot=0x20D1, category='mn', description='COMBINING RIGHT HARPOON ABOVE' }, + [0x20D2] = { unicodeslot=0x20D2, category='mn', description='COMBINING LONG VERTICAL LINE OVERLAY' }, + [0x20D3] = { unicodeslot=0x20D3, category='mn', description='COMBINING SHORT VERTICAL LINE OVERLAY' }, + [0x20D4] = { unicodeslot=0x20D4, category='mn', description='COMBINING ANTICLOCKWISE ARROW ABOVE' }, + [0x20D5] = { unicodeslot=0x20D5, category='mn', description='COMBINING CLOCKWISE ARROW ABOVE' }, + [0x20D6] = { unicodeslot=0x20D6, category='mn', description='COMBINING LEFT ARROW ABOVE' }, + [0x20D7] = { unicodeslot=0x20D7, category='mn', description='COMBINING RIGHT ARROW ABOVE' }, + [0x20D8] = { unicodeslot=0x20D8, category='mn', description='COMBINING RING OVERLAY' }, + [0x20D9] = { unicodeslot=0x20D9, category='mn', description='COMBINING CLOCKWISE RING OVERLAY' }, + [0x20DA] = { unicodeslot=0x20DA, category='mn', description='COMBINING ANTICLOCKWISE RING OVERLAY' }, + [0x20DB] = { unicodeslot=0x20DB, category='mn', description='COMBINING THREE DOTS ABOVE' }, + [0x20DC] = { unicodeslot=0x20DC, category='mn', description='COMBINING FOUR DOTS ABOVE' }, + [0x20DD] = { unicodeslot=0x20DD, category='me', description='COMBINING ENCLOSING CIRCLE' }, + [0x20DE] = { unicodeslot=0x20DE, category='me', description='COMBINING ENCLOSING SQUARE' }, + [0x20DF] = { unicodeslot=0x20DF, category='me', description='COMBINING ENCLOSING DIAMOND' }, + [0x20E0] = { unicodeslot=0x20E0, category='me', description='COMBINING ENCLOSING CIRCLE BACKSLASH' }, + [0x20E1] = { unicodeslot=0x20E1, category='mn', description='COMBINING LEFT RIGHT ARROW ABOVE' }, + [0x20E2] = { unicodeslot=0x20E2, category='me', description='COMBINING ENCLOSING SCREEN' }, + [0x20E3] = { unicodeslot=0x20E3, category='me', description='COMBINING ENCLOSING KEYCAP' }, + [0x20E4] = { unicodeslot=0x20E4, category='me', description='COMBINING ENCLOSING UPWARD POINTING TRIANGLE' }, + [0x20E5] = { unicodeslot=0x20E5, category='mn', description='COMBINING REVERSE SOLIDUS OVERLAY' }, + [0x20E6] = { unicodeslot=0x20E6, category='mn', description='COMBINING DOUBLE VERTICAL STROKE OVERLAY' }, + [0x20E7] = { unicodeslot=0x20E7, category='mn', description='COMBINING ANNUITY SYMBOL' }, + [0x20E8] = { unicodeslot=0x20E8, category='mn', description='COMBINING TRIPLE UNDERDOT' }, + [0x20E9] = { unicodeslot=0x20E9, category='mn', description='COMBINING WIDE BRIDGE ABOVE' }, + [0x20EA] = { unicodeslot=0x20EA, category='mn', description='COMBINING LEFTWARDS ARROW OVERLAY' }, + [0x20EB] = { unicodeslot=0x20EB, category='mn', description='COMBINING LONG DOUBLE SOLIDUS OVERLAY' }, + [0x20EC] = { unicodeslot=0x20EC, category='mn', description='COMBINING RIGHTWARDS HARPOON WITH BARB DOWNWARDS' }, + [0x20ED] = { unicodeslot=0x20ED, category='mn', description='COMBINING LEFTWARDS HARPOON WITH BARB DOWNWARDS' }, + [0x20EE] = { unicodeslot=0x20EE, category='mn', description='COMBINING LEFT ARROW BELOW' }, + [0x20EF] = { unicodeslot=0x20EF, category='mn', description='COMBINING RIGHT ARROW BELOW' }, + [0x2100] = { unicodeslot=0x2100, category='so', description='ACCOUNT OF', specials={'compat',0x0061,0x002F,0x0063} }, + [0x2101] = { unicodeslot=0x2101, category='so', description='ADDRESSED TO THE SUBJECT', specials={'compat',0x0061,0x002F,0x0073} }, + [0x2102] = { unicodeslot=0x2102, category='lu', description='DOUBLE-STRUCK CAPITAL C', specials={'font',0x0043} }, + [0x2103] = { unicodeslot=0x2103, category='so', description='DEGREE CELSIUS', specials={'compat',0x00B0,0x0043} }, + [0x2104] = { unicodeslot=0x2104, category='so', description='CENTRE LINE SYMBOL' }, + [0x2105] = { unicodeslot=0x2105, category='so', adobename='afii61248', description='CARE OF', specials={'compat',0x0063,0x002F,0x006F} }, + [0x2106] = { unicodeslot=0x2106, category='so', description='CADA UNA', specials={'compat',0x0063,0x002F,0x0075} }, + [0x2107] = { unicodeslot=0x2107, category='lu', description='EULER CONSTANT', specials={'compat',0x0190} }, + [0x2108] = { unicodeslot=0x2108, category='so', description='SCRUPLE' }, + [0x2109] = { unicodeslot=0x2109, category='so', description='DEGREE FAHRENHEIT', specials={'compat',0x00B0,0x0046} }, + [0x210A] = { unicodeslot=0x210A, category='ll', description='SCRIPT SMALL G', specials={'font',0x0067} }, + [0x210B] = { unicodeslot=0x210B, category='lu', description='SCRIPT CAPITAL H', specials={'font',0x0048} }, + [0x210C] = { unicodeslot=0x210C, category='lu', description='BLACK-LETTER CAPITAL H', specials={'font',0x0048} }, + [0x210D] = { unicodeslot=0x210D, category='lu', description='DOUBLE-STRUCK CAPITAL H', specials={'font',0x0048} }, + [0x210E] = { unicodeslot=0x210E, category='ll', description='PLANCK CONSTANT', specials={'font',0x0068} }, + [0x210F] = { unicodeslot=0x210F, category='ll', description='PLANCK CONSTANT OVER TWO PI', specials={'font',0x0127} }, + [0x2110] = { unicodeslot=0x2110, category='lu', description='SCRIPT CAPITAL I', specials={'font',0x0049} }, + [0x2111] = { unicodeslot=0x2111, category='lu', adobename='Ifraktur', description='BLACK-LETTER CAPITAL I', specials={'font',0x0049} }, + [0x2112] = { unicodeslot=0x2112, category='lu', description='SCRIPT CAPITAL L', specials={'font',0x004C} }, + [0x2113] = { unicodeslot=0x2113, category='ll', adobename='afii61289', description='SCRIPT SMALL L', specials={'font',0x006C} }, + [0x2114] = { unicodeslot=0x2114, category='so', description='L B BAR SYMBOL' }, + [0x2115] = { unicodeslot=0x2115, category='lu', description='DOUBLE-STRUCK CAPITAL N', specials={'font',0x004E} }, + [0x2116] = { unicodeslot=0x2116, category='so', adobename='afii61352', contextname='textnumero', description='NUMERO SIGN', specials={'compat',0x004E,0x006F} }, + [0x2117] = { unicodeslot=0x2117, category='so', description='SOUND RECORDING COPYRIGHT' }, + [0x2118] = { unicodeslot=0x2118, category='so', adobename='weierstrass', description='SCRIPT CAPITAL P' }, + [0x2119] = { unicodeslot=0x2119, category='lu', description='DOUBLE-STRUCK CAPITAL P', specials={'font',0x0050} }, + [0x211A] = { unicodeslot=0x211A, category='lu', description='DOUBLE-STRUCK CAPITAL Q', specials={'font',0x0051} }, + [0x211B] = { unicodeslot=0x211B, category='lu', description='SCRIPT CAPITAL R', specials={'font',0x0052} }, + [0x211C] = { unicodeslot=0x211C, category='lu', adobename='Rfraktur', description='BLACK-LETTER CAPITAL R', specials={'font',0x0052} }, + [0x211D] = { unicodeslot=0x211D, category='lu', description='DOUBLE-STRUCK CAPITAL R', specials={'font',0x0052} }, + [0x211E] = { unicodeslot=0x211E, category='so', adobename='prescription', description='PRESCRIPTION TAKE' }, + [0x211F] = { unicodeslot=0x211F, category='so', description='RESPONSE' }, + [0x2120] = { unicodeslot=0x2120, category='so', description='SERVICE MARK', specials={'super',0x0053,0x004D} }, + [0x2121] = { unicodeslot=0x2121, category='so', description='TELEPHONE SIGN', specials={'compat',0x0054,0x0045,0x004C} }, + [0x2122] = { unicodeslot=0x2122, category='so', adobename='trademark', contextname='trademark', description='TRADE MARK SIGN', specials={'super',0x0054,0x004D} }, + [0x2123] = { unicodeslot=0x2123, category='so', description='VERSICLE' }, + [0x2124] = { unicodeslot=0x2124, category='lu', description='DOUBLE-STRUCK CAPITAL Z', specials={'font',0x005A} }, + [0x2125] = { unicodeslot=0x2125, category='so', description='OUNCE SIGN' }, + [0x2126] = { unicodeslot=0x2126, category='lu', adobename='Omega', description='OHM SIGN', lccode=0x03C9, specials={'char',0x03A9} }, + [0x2127] = { unicodeslot=0x2127, category='so', description='INVERTED OHM SIGN' }, + [0x2128] = { unicodeslot=0x2128, category='lu', description='BLACK-LETTER CAPITAL Z', specials={'font',0x005A} }, + [0x2129] = { unicodeslot=0x2129, category='so', description='TURNED GREEK SMALL LETTER IOTA' }, + [0x212A] = { unicodeslot=0x212A, category='lu', description='KELVIN SIGN', lccode=0x006B, specials={'char',0x004B} }, + [0x212B] = { unicodeslot=0x212B, category='lu', description='ANGSTROM SIGN', lccode=0x00E5, specials={'char',0x00C5} }, + [0x212C] = { unicodeslot=0x212C, category='lu', description='SCRIPT CAPITAL B', specials={'font',0x0042} }, + [0x212D] = { unicodeslot=0x212D, category='lu', description='BLACK-LETTER CAPITAL C', specials={'font',0x0043} }, + [0x212E] = { unicodeslot=0x212E, category='so', adobename='estimated', description='ESTIMATED SYMBOL' }, + [0x212F] = { unicodeslot=0x212F, category='ll', description='SCRIPT SMALL E', specials={'font',0x0065} }, + [0x2130] = { unicodeslot=0x2130, category='lu', description='SCRIPT CAPITAL E', specials={'font',0x0045} }, + [0x2131] = { unicodeslot=0x2131, category='lu', description='SCRIPT CAPITAL F', specials={'font',0x0046} }, + [0x2132] = { unicodeslot=0x2132, category='lu', description='TURNED CAPITAL F', lccode=0x214E }, + [0x2133] = { unicodeslot=0x2133, category='lu', description='SCRIPT CAPITAL M', specials={'font',0x004D} }, + [0x2134] = { unicodeslot=0x2134, category='ll', description='SCRIPT SMALL O', specials={'font',0x006F} }, + [0x2135] = { unicodeslot=0x2135, category='lo', adobename='aleph', description='ALEF SYMBOL', specials={'compat',0x05D0} }, + [0x2136] = { unicodeslot=0x2136, category='lo', description='BET SYMBOL', specials={'compat',0x05D1} }, + [0x2137] = { unicodeslot=0x2137, category='lo', description='GIMEL SYMBOL', specials={'compat',0x05D2} }, + [0x2138] = { unicodeslot=0x2138, category='lo', description='DALET SYMBOL', specials={'compat',0x05D3} }, + [0x2139] = { unicodeslot=0x2139, category='ll', description='INFORMATION SOURCE', specials={'font',0x0069} }, + [0x213A] = { unicodeslot=0x213A, category='so', description='ROTATED CAPITAL Q' }, + [0x213B] = { unicodeslot=0x213B, category='so', description='FACSIMILE SIGN', specials={'compat',0x0046,0x0041,0x0058} }, + [0x213C] = { unicodeslot=0x213C, category='ll', description='DOUBLE-STRUCK SMALL PI', specials={'font',0x03C0} }, + [0x213D] = { unicodeslot=0x213D, category='ll', description='DOUBLE-STRUCK SMALL GAMMA', specials={'font',0x03B3} }, + [0x213E] = { unicodeslot=0x213E, category='lu', description='DOUBLE-STRUCK CAPITAL GAMMA', specials={'font',0x0393} }, + [0x213F] = { unicodeslot=0x213F, category='lu', description='DOUBLE-STRUCK CAPITAL PI', specials={'font',0x03A0} }, + [0x2140] = { unicodeslot=0x2140, category='sm', description='DOUBLE-STRUCK N-ARY SUMMATION', specials={'font',0x2211} }, + [0x2141] = { unicodeslot=0x2141, category='sm', description='TURNED SANS-SERIF CAPITAL G' }, + [0x2142] = { unicodeslot=0x2142, category='sm', description='TURNED SANS-SERIF CAPITAL L' }, + [0x2143] = { unicodeslot=0x2143, category='sm', description='REVERSED SANS-SERIF CAPITAL L' }, + [0x2144] = { unicodeslot=0x2144, category='sm', description='TURNED SANS-SERIF CAPITAL Y' }, + [0x2145] = { unicodeslot=0x2145, category='lu', description='DOUBLE-STRUCK ITALIC CAPITAL D', specials={'font',0x0044} }, + [0x2146] = { unicodeslot=0x2146, category='ll', description='DOUBLE-STRUCK ITALIC SMALL D', specials={'font',0x0064} }, + [0x2147] = { unicodeslot=0x2147, category='ll', description='DOUBLE-STRUCK ITALIC SMALL E', specials={'font',0x0065} }, + [0x2148] = { unicodeslot=0x2148, category='ll', description='DOUBLE-STRUCK ITALIC SMALL I', specials={'font',0x0069} }, + [0x2149] = { unicodeslot=0x2149, category='ll', description='DOUBLE-STRUCK ITALIC SMALL J', specials={'font',0x006A} }, + [0x214A] = { unicodeslot=0x214A, category='so', description='PROPERTY LINE' }, + [0x214B] = { unicodeslot=0x214B, category='sm', description='TURNED AMPERSAND' }, + [0x214C] = { unicodeslot=0x214C, category='so', description='PER SIGN' }, + [0x214D] = { unicodeslot=0x214D, category='so', description='AKTIESELSKAB' }, + [0x214E] = { unicodeslot=0x214E, category='ll', description='TURNED SMALL F', uccode=0x2132 }, + [0x2153] = { unicodeslot=0x2153, category='no', adobename='onethird', contextname='onethird', description='VULGAR FRACTION ONE THIRD', specials={'fraction',0x0031,0x2044,0x0033} }, + [0x2154] = { unicodeslot=0x2154, category='no', adobename='twothirds', contextname='twothirds', description='VULGAR FRACTION TWO THIRDS', specials={'fraction',0x0032,0x2044,0x0033} }, + [0x2155] = { unicodeslot=0x2155, category='no', contextname='onefifth', description='VULGAR FRACTION ONE FIFTH', specials={'fraction',0x0031,0x2044,0x0035} }, + [0x2156] = { unicodeslot=0x2156, category='no', contextname='twofifths', description='VULGAR FRACTION TWO FIFTHS', specials={'fraction',0x0032,0x2044,0x0035} }, + [0x2157] = { unicodeslot=0x2157, category='no', contextname='threefifths', description='VULGAR FRACTION THREE FIFTHS', specials={'fraction',0x0033,0x2044,0x0035} }, + [0x2158] = { unicodeslot=0x2158, category='no', contextname='fourfifths', description='VULGAR FRACTION FOUR FIFTHS', specials={'fraction',0x0034,0x2044,0x0035} }, + [0x2159] = { unicodeslot=0x2159, category='no', contextname='onesixth', description='VULGAR FRACTION ONE SIXTH', specials={'fraction',0x0031,0x2044,0x0036} }, + [0x215A] = { unicodeslot=0x215A, category='no', contextname='fivesixths', description='VULGAR FRACTION FIVE SIXTHS', specials={'fraction',0x0035,0x2044,0x0036} }, + [0x215B] = { unicodeslot=0x215B, category='no', adobename='oneeighth', contextname='oneeighth', description='VULGAR FRACTION ONE EIGHTH', specials={'fraction',0x0031,0x2044,0x0038} }, + [0x215C] = { unicodeslot=0x215C, category='no', adobename='threeeighths', contextname='threeeighths', description='VULGAR FRACTION THREE EIGHTHS', specials={'fraction',0x0033,0x2044,0x0038} }, + [0x215D] = { unicodeslot=0x215D, category='no', adobename='fiveeighths', contextname='fiveeighths', description='VULGAR FRACTION FIVE EIGHTHS', specials={'fraction',0x0035,0x2044,0x0038} }, + [0x215E] = { unicodeslot=0x215E, category='no', adobename='seveneighths', contextname='seveneighths', description='VULGAR FRACTION SEVEN EIGHTHS', specials={'fraction',0x0037,0x2044,0x0038} }, + [0x215F] = { unicodeslot=0x215F, category='no', description='FRACTION NUMERATOR ONE', specials={'fraction',0x0031,0x2044} }, + [0x2160] = { unicodeslot=0x2160, category='nl', contextname='romanI', description='ROMAN NUMERAL ONE', lccode=0x2170, specials={'compat',0x0049} }, + [0x2161] = { unicodeslot=0x2161, category='nl', contextname='romanII', description='ROMAN NUMERAL TWO', lccode=0x2171, specials={'compat',0x0049,0x0049} }, + [0x2162] = { unicodeslot=0x2162, category='nl', contextname='romanIII', description='ROMAN NUMERAL THREE', lccode=0x2172, specials={'compat',0x0049,0x0049,0x0049} }, + [0x2163] = { unicodeslot=0x2163, category='nl', contextname='romanIV', description='ROMAN NUMERAL FOUR', lccode=0x2173, specials={'compat',0x0049,0x0056} }, + [0x2164] = { unicodeslot=0x2164, category='nl', contextname='romanV', description='ROMAN NUMERAL FIVE', lccode=0x2174, specials={'compat',0x0056} }, + [0x2165] = { unicodeslot=0x2165, category='nl', contextname='romanVI', description='ROMAN NUMERAL SIX', lccode=0x2175, specials={'compat',0x0056,0x0049} }, + [0x2166] = { unicodeslot=0x2166, category='nl', contextname='romanVII', description='ROMAN NUMERAL SEVEN', lccode=0x2176, specials={'compat',0x0056,0x0049,0x0049} }, + [0x2167] = { unicodeslot=0x2167, category='nl', contextname='romanVIII', description='ROMAN NUMERAL EIGHT', lccode=0x2177, specials={'compat',0x0056,0x0049,0x0049,0x0049} }, + [0x2168] = { unicodeslot=0x2168, category='nl', contextname='romanIX', description='ROMAN NUMERAL NINE', lccode=0x2178, specials={'compat',0x0049,0x0058} }, + [0x2169] = { unicodeslot=0x2169, category='nl', contextname='romanX', description='ROMAN NUMERAL TEN', lccode=0x2179, specials={'compat',0x0058} }, + [0x216A] = { unicodeslot=0x216A, category='nl', contextname='romanXI', description='ROMAN NUMERAL ELEVEN', lccode=0x217A, specials={'compat',0x0058,0x0049} }, + [0x216B] = { unicodeslot=0x216B, category='nl', contextname='romanXII', description='ROMAN NUMERAL TWELVE', lccode=0x217B, specials={'compat',0x0058,0x0049,0x0049} }, + [0x216C] = { unicodeslot=0x216C, category='nl', contextname='romanL', description='ROMAN NUMERAL FIFTY', lccode=0x217C, specials={'compat',0x004C} }, + [0x216D] = { unicodeslot=0x216D, category='nl', contextname='romanC', description='ROMAN NUMERAL ONE HUNDRED', lccode=0x217D, specials={'compat',0x0043} }, + [0x216E] = { unicodeslot=0x216E, category='nl', contextname='romanD', description='ROMAN NUMERAL FIVE HUNDRED', lccode=0x217E, specials={'compat',0x0044} }, + [0x216F] = { unicodeslot=0x216F, category='nl', contextname='romanM', description='ROMAN NUMERAL ONE THOUSAND', lccode=0x217F, specials={'compat',0x004D} }, + [0x2170] = { unicodeslot=0x2170, category='nl', contextname='romani', description='SMALL ROMAN NUMERAL ONE', uccode=0x2160, specials={'compat',0x0069} }, + [0x2171] = { unicodeslot=0x2171, category='nl', contextname='romanii', description='SMALL ROMAN NUMERAL TWO', uccode=0x2161, specials={'compat',0x0069,0x0069} }, + [0x2172] = { unicodeslot=0x2172, category='nl', contextname='romaniii', description='SMALL ROMAN NUMERAL THREE', uccode=0x2162, specials={'compat',0x0069,0x0069,0x0069} }, + [0x2173] = { unicodeslot=0x2173, category='nl', contextname='romaniv', description='SMALL ROMAN NUMERAL FOUR', uccode=0x2163, specials={'compat',0x0069,0x0076} }, + [0x2174] = { unicodeslot=0x2174, category='nl', contextname='romanv', description='SMALL ROMAN NUMERAL FIVE', uccode=0x2164, specials={'compat',0x0076} }, + [0x2175] = { unicodeslot=0x2175, category='nl', contextname='romanvi', description='SMALL ROMAN NUMERAL SIX', uccode=0x2165, specials={'compat',0x0076,0x0069} }, + [0x2176] = { unicodeslot=0x2176, category='nl', contextname='romanvii', description='SMALL ROMAN NUMERAL SEVEN', uccode=0x2166, specials={'compat',0x0076,0x0069,0x0069} }, + [0x2177] = { unicodeslot=0x2177, category='nl', contextname='romanviii', description='SMALL ROMAN NUMERAL EIGHT', uccode=0x2167, specials={'compat',0x0076,0x0069,0x0069,0x0069} }, + [0x2178] = { unicodeslot=0x2178, category='nl', contextname='romanix', description='SMALL ROMAN NUMERAL NINE', uccode=0x2168, specials={'compat',0x0069,0x0078} }, + [0x2179] = { unicodeslot=0x2179, category='nl', contextname='romanx', description='SMALL ROMAN NUMERAL TEN', uccode=0x2169, specials={'compat',0x0078} }, + [0x217A] = { unicodeslot=0x217A, category='nl', contextname='romanxi', description='SMALL ROMAN NUMERAL ELEVEN', uccode=0x216A, specials={'compat',0x0078,0x0069} }, + [0x217B] = { unicodeslot=0x217B, category='nl', contextname='romanxii', description='SMALL ROMAN NUMERAL TWELVE', uccode=0x216B, specials={'compat',0x0078,0x0069,0x0069} }, + [0x217C] = { unicodeslot=0x217C, category='nl', contextname='romanl', description='SMALL ROMAN NUMERAL FIFTY', uccode=0x216C, specials={'compat',0x006C} }, + [0x217D] = { unicodeslot=0x217D, category='nl', contextname='romanc', description='SMALL ROMAN NUMERAL ONE HUNDRED', uccode=0x216D, specials={'compat',0x0063} }, + [0x217E] = { unicodeslot=0x217E, category='nl', contextname='romand', description='SMALL ROMAN NUMERAL FIVE HUNDRED', uccode=0x216E, specials={'compat',0x0064} }, + [0x217F] = { unicodeslot=0x217F, category='nl', contextname='romanm', description='SMALL ROMAN NUMERAL ONE THOUSAND', uccode=0x216F, specials={'compat',0x006D} }, + [0x2180] = { unicodeslot=0x2180, category='nl', description='ROMAN NUMERAL ONE THOUSAND C D' }, + [0x2181] = { unicodeslot=0x2181, category='nl', description='ROMAN NUMERAL FIVE THOUSAND' }, + [0x2182] = { unicodeslot=0x2182, category='nl', description='ROMAN NUMERAL TEN THOUSAND' }, + [0x2183] = { unicodeslot=0x2183, category='lu', description='ROMAN NUMERAL REVERSED ONE HUNDRED', lccode=0x2184 }, + [0x2184] = { unicodeslot=0x2184, category='ll', description='LATIN SMALL LETTER REVERSED C', uccode=0x2183 }, + [0x2190] = { unicodeslot=0x2190, category='sm', adobename='arrowleft', description='LEFTWARDS ARROW' }, + [0x2191] = { unicodeslot=0x2191, category='sm', adobename='arrowup', description='UPWARDS ARROW' }, + [0x2192] = { unicodeslot=0x2192, category='sm', adobename='arrowright', description='RIGHTWARDS ARROW' }, + [0x2193] = { unicodeslot=0x2193, category='sm', adobename='arrowdown', description='DOWNWARDS ARROW' }, + [0x2194] = { unicodeslot=0x2194, category='sm', adobename='arrowboth', description='LEFT RIGHT ARROW' }, + [0x2195] = { unicodeslot=0x2195, category='so', adobename='arrowupdn', description='UP DOWN ARROW' }, + [0x2196] = { unicodeslot=0x2196, category='so', description='NORTH WEST ARROW' }, + [0x2197] = { unicodeslot=0x2197, category='so', description='NORTH EAST ARROW' }, + [0x2198] = { unicodeslot=0x2198, category='so', description='SOUTH EAST ARROW' }, + [0x2199] = { unicodeslot=0x2199, category='so', description='SOUTH WEST ARROW' }, + [0x219A] = { unicodeslot=0x219A, category='sm', description='LEFTWARDS ARROW WITH STROKE', specials={'char',0x2190,0x0338} }, + [0x219B] = { unicodeslot=0x219B, category='sm', description='RIGHTWARDS ARROW WITH STROKE', specials={'char',0x2192,0x0338} }, + [0x219C] = { unicodeslot=0x219C, category='so', description='LEFTWARDS WAVE ARROW' }, + [0x219D] = { unicodeslot=0x219D, category='so', description='RIGHTWARDS WAVE ARROW' }, + [0x219E] = { unicodeslot=0x219E, category='so', description='LEFTWARDS TWO HEADED ARROW' }, + [0x219F] = { unicodeslot=0x219F, category='so', description='UPWARDS TWO HEADED ARROW' }, + [0x21A0] = { unicodeslot=0x21A0, category='sm', description='RIGHTWARDS TWO HEADED ARROW' }, + [0x21A1] = { unicodeslot=0x21A1, category='so', description='DOWNWARDS TWO HEADED ARROW' }, + [0x21A2] = { unicodeslot=0x21A2, category='so', description='LEFTWARDS ARROW WITH TAIL' }, + [0x21A3] = { unicodeslot=0x21A3, category='sm', description='RIGHTWARDS ARROW WITH TAIL' }, + [0x21A4] = { unicodeslot=0x21A4, category='so', description='LEFTWARDS ARROW FROM BAR' }, + [0x21A5] = { unicodeslot=0x21A5, category='so', description='UPWARDS ARROW FROM BAR' }, + [0x21A6] = { unicodeslot=0x21A6, category='sm', description='RIGHTWARDS ARROW FROM BAR' }, + [0x21A7] = { unicodeslot=0x21A7, category='so', description='DOWNWARDS ARROW FROM BAR' }, + [0x21A8] = { unicodeslot=0x21A8, category='so', adobename='arrowupdnbse', description='UP DOWN ARROW WITH BASE' }, + [0x21A9] = { unicodeslot=0x21A9, category='so', description='LEFTWARDS ARROW WITH HOOK' }, + [0x21AA] = { unicodeslot=0x21AA, category='so', description='RIGHTWARDS ARROW WITH HOOK' }, + [0x21AB] = { unicodeslot=0x21AB, category='so', description='LEFTWARDS ARROW WITH LOOP' }, + [0x21AC] = { unicodeslot=0x21AC, category='so', description='RIGHTWARDS ARROW WITH LOOP' }, + [0x21AD] = { unicodeslot=0x21AD, category='so', description='LEFT RIGHT WAVE ARROW' }, + [0x21AE] = { unicodeslot=0x21AE, category='sm', description='LEFT RIGHT ARROW WITH STROKE', specials={'char',0x2194,0x0338} }, + [0x21AF] = { unicodeslot=0x21AF, category='so', description='DOWNWARDS ZIGZAG ARROW' }, + [0x21B0] = { unicodeslot=0x21B0, category='so', description='UPWARDS ARROW WITH TIP LEFTWARDS' }, + [0x21B1] = { unicodeslot=0x21B1, category='so', description='UPWARDS ARROW WITH TIP RIGHTWARDS' }, + [0x21B2] = { unicodeslot=0x21B2, category='so', description='DOWNWARDS ARROW WITH TIP LEFTWARDS' }, + [0x21B3] = { unicodeslot=0x21B3, category='so', description='DOWNWARDS ARROW WITH TIP RIGHTWARDS' }, + [0x21B4] = { unicodeslot=0x21B4, category='so', description='RIGHTWARDS ARROW WITH CORNER DOWNWARDS' }, + [0x21B5] = { unicodeslot=0x21B5, category='so', adobename='carriagereturn', description='DOWNWARDS ARROW WITH CORNER LEFTWARDS' }, + [0x21B6] = { unicodeslot=0x21B6, category='so', description='ANTICLOCKWISE TOP SEMICIRCLE ARROW' }, + [0x21B7] = { unicodeslot=0x21B7, category='so', description='CLOCKWISE TOP SEMICIRCLE ARROW' }, + [0x21B8] = { unicodeslot=0x21B8, category='so', description='NORTH WEST ARROW TO LONG BAR' }, + [0x21B9] = { unicodeslot=0x21B9, category='so', description='LEFTWARDS ARROW TO BAR OVER RIGHTWARDS ARROW TO BAR' }, + [0x21BA] = { unicodeslot=0x21BA, category='so', description='ANTICLOCKWISE OPEN CIRCLE ARROW' }, + [0x21BB] = { unicodeslot=0x21BB, category='so', description='CLOCKWISE OPEN CIRCLE ARROW' }, + [0x21BC] = { unicodeslot=0x21BC, category='so', description='LEFTWARDS HARPOON WITH BARB UPWARDS' }, + [0x21BD] = { unicodeslot=0x21BD, category='so', description='LEFTWARDS HARPOON WITH BARB DOWNWARDS' }, + [0x21BE] = { unicodeslot=0x21BE, category='so', description='UPWARDS HARPOON WITH BARB RIGHTWARDS' }, + [0x21BF] = { unicodeslot=0x21BF, category='so', description='UPWARDS HARPOON WITH BARB LEFTWARDS' }, + [0x21C0] = { unicodeslot=0x21C0, category='so', description='RIGHTWARDS HARPOON WITH BARB UPWARDS' }, + [0x21C1] = { unicodeslot=0x21C1, category='so', description='RIGHTWARDS HARPOON WITH BARB DOWNWARDS' }, + [0x21C2] = { unicodeslot=0x21C2, category='so', description='DOWNWARDS HARPOON WITH BARB RIGHTWARDS' }, + [0x21C3] = { unicodeslot=0x21C3, category='so', description='DOWNWARDS HARPOON WITH BARB LEFTWARDS' }, + [0x21C4] = { unicodeslot=0x21C4, category='so', description='RIGHTWARDS ARROW OVER LEFTWARDS ARROW' }, + [0x21C5] = { unicodeslot=0x21C5, category='so', description='UPWARDS ARROW LEFTWARDS OF DOWNWARDS ARROW' }, + [0x21C6] = { unicodeslot=0x21C6, category='so', description='LEFTWARDS ARROW OVER RIGHTWARDS ARROW' }, + [0x21C7] = { unicodeslot=0x21C7, category='so', description='LEFTWARDS PAIRED ARROWS' }, + [0x21C8] = { unicodeslot=0x21C8, category='so', description='UPWARDS PAIRED ARROWS' }, + [0x21C9] = { unicodeslot=0x21C9, category='so', description='RIGHTWARDS PAIRED ARROWS' }, + [0x21CA] = { unicodeslot=0x21CA, category='so', description='DOWNWARDS PAIRED ARROWS' }, + [0x21CB] = { unicodeslot=0x21CB, category='so', description='LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON' }, + [0x21CC] = { unicodeslot=0x21CC, category='so', description='RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON' }, + [0x21CD] = { unicodeslot=0x21CD, category='so', description='LEFTWARDS DOUBLE ARROW WITH STROKE', specials={'char',0x21D0,0x0338} }, + [0x21CE] = { unicodeslot=0x21CE, category='sm', description='LEFT RIGHT DOUBLE ARROW WITH STROKE', specials={'char',0x21D4,0x0338} }, + [0x21CF] = { unicodeslot=0x21CF, category='sm', description='RIGHTWARDS DOUBLE ARROW WITH STROKE', specials={'char',0x21D2,0x0338} }, + [0x21D0] = { unicodeslot=0x21D0, category='so', adobename='arrowdblleft', description='LEFTWARDS DOUBLE ARROW' }, + [0x21D1] = { unicodeslot=0x21D1, category='so', adobename='arrowdblup', description='UPWARDS DOUBLE ARROW' }, + [0x21D2] = { unicodeslot=0x21D2, category='sm', adobename='arrowdblright', description='RIGHTWARDS DOUBLE ARROW' }, + [0x21D3] = { unicodeslot=0x21D3, category='so', adobename='arrowdbldown', description='DOWNWARDS DOUBLE ARROW' }, + [0x21D4] = { unicodeslot=0x21D4, category='sm', adobename='arrowdblboth', description='LEFT RIGHT DOUBLE ARROW' }, + [0x21D5] = { unicodeslot=0x21D5, category='so', description='UP DOWN DOUBLE ARROW' }, + [0x21D6] = { unicodeslot=0x21D6, category='so', description='NORTH WEST DOUBLE ARROW' }, + [0x21D7] = { unicodeslot=0x21D7, category='so', description='NORTH EAST DOUBLE ARROW' }, + [0x21D8] = { unicodeslot=0x21D8, category='so', description='SOUTH EAST DOUBLE ARROW' }, + [0x21D9] = { unicodeslot=0x21D9, category='so', description='SOUTH WEST DOUBLE ARROW' }, + [0x21DA] = { unicodeslot=0x21DA, category='so', description='LEFTWARDS TRIPLE ARROW' }, + [0x21DB] = { unicodeslot=0x21DB, category='so', description='RIGHTWARDS TRIPLE ARROW' }, + [0x21DC] = { unicodeslot=0x21DC, category='so', description='LEFTWARDS SQUIGGLE ARROW' }, + [0x21DD] = { unicodeslot=0x21DD, category='so', description='RIGHTWARDS SQUIGGLE ARROW' }, + [0x21DE] = { unicodeslot=0x21DE, category='so', description='UPWARDS ARROW WITH DOUBLE STROKE' }, + [0x21DF] = { unicodeslot=0x21DF, category='so', description='DOWNWARDS ARROW WITH DOUBLE STROKE' }, + [0x21E0] = { unicodeslot=0x21E0, category='so', description='LEFTWARDS DASHED ARROW' }, + [0x21E1] = { unicodeslot=0x21E1, category='so', description='UPWARDS DASHED ARROW' }, + [0x21E2] = { unicodeslot=0x21E2, category='so', description='RIGHTWARDS DASHED ARROW' }, + [0x21E3] = { unicodeslot=0x21E3, category='so', description='DOWNWARDS DASHED ARROW' }, + [0x21E4] = { unicodeslot=0x21E4, category='so', description='LEFTWARDS ARROW TO BAR' }, + [0x21E5] = { unicodeslot=0x21E5, category='so', description='RIGHTWARDS ARROW TO BAR' }, + [0x21E6] = { unicodeslot=0x21E6, category='so', description='LEFTWARDS WHITE ARROW' }, + [0x21E7] = { unicodeslot=0x21E7, category='so', description='UPWARDS WHITE ARROW' }, + [0x21E8] = { unicodeslot=0x21E8, category='so', description='RIGHTWARDS WHITE ARROW' }, + [0x21E9] = { unicodeslot=0x21E9, category='so', description='DOWNWARDS WHITE ARROW' }, + [0x21EA] = { unicodeslot=0x21EA, category='so', description='UPWARDS WHITE ARROW FROM BAR' }, + [0x21EB] = { unicodeslot=0x21EB, category='so', description='UPWARDS WHITE ARROW ON PEDESTAL' }, + [0x21EC] = { unicodeslot=0x21EC, category='so', description='UPWARDS WHITE ARROW ON PEDESTAL WITH HORIZONTAL BAR' }, + [0x21ED] = { unicodeslot=0x21ED, category='so', description='UPWARDS WHITE ARROW ON PEDESTAL WITH VERTICAL BAR' }, + [0x21EE] = { unicodeslot=0x21EE, category='so', description='UPWARDS WHITE DOUBLE ARROW' }, + [0x21EF] = { unicodeslot=0x21EF, category='so', description='UPWARDS WHITE DOUBLE ARROW ON PEDESTAL' }, + [0x21F0] = { unicodeslot=0x21F0, category='so', description='RIGHTWARDS WHITE ARROW FROM WALL' }, + [0x21F1] = { unicodeslot=0x21F1, category='so', description='NORTH WEST ARROW TO CORNER' }, + [0x21F2] = { unicodeslot=0x21F2, category='so', description='SOUTH EAST ARROW TO CORNER' }, + [0x21F3] = { unicodeslot=0x21F3, category='so', description='UP DOWN WHITE ARROW' }, + [0x21F4] = { unicodeslot=0x21F4, category='sm', description='RIGHT ARROW WITH SMALL CIRCLE' }, + [0x21F5] = { unicodeslot=0x21F5, category='sm', description='DOWNWARDS ARROW LEFTWARDS OF UPWARDS ARROW' }, + [0x21F6] = { unicodeslot=0x21F6, category='sm', description='THREE RIGHTWARDS ARROWS' }, + [0x21F7] = { unicodeslot=0x21F7, category='sm', description='LEFTWARDS ARROW WITH VERTICAL STROKE' }, + [0x21F8] = { unicodeslot=0x21F8, category='sm', description='RIGHTWARDS ARROW WITH VERTICAL STROKE' }, + [0x21F9] = { unicodeslot=0x21F9, category='sm', description='LEFT RIGHT ARROW WITH VERTICAL STROKE' }, + [0x21FA] = { unicodeslot=0x21FA, category='sm', description='LEFTWARDS ARROW WITH DOUBLE VERTICAL STROKE' }, + [0x21FB] = { unicodeslot=0x21FB, category='sm', description='RIGHTWARDS ARROW WITH DOUBLE VERTICAL STROKE' }, + [0x21FC] = { unicodeslot=0x21FC, category='sm', description='LEFT RIGHT ARROW WITH DOUBLE VERTICAL STROKE' }, + [0x21FD] = { unicodeslot=0x21FD, category='sm', description='LEFTWARDS OPEN-HEADED ARROW' }, + [0x21FE] = { unicodeslot=0x21FE, category='sm', description='RIGHTWARDS OPEN-HEADED ARROW' }, + [0x21FF] = { unicodeslot=0x21FF, category='sm', description='LEFT RIGHT OPEN-HEADED ARROW' }, + [0x2200] = { unicodeslot=0x2200, category='sm', adobename='universal', description='FOR ALL' }, + [0x2201] = { unicodeslot=0x2201, category='sm', description='COMPLEMENT' }, + [0x2202] = { unicodeslot=0x2202, category='sm', adobename='partialdiff', description='PARTIAL DIFFERENTIAL' }, + [0x2203] = { unicodeslot=0x2203, category='sm', adobename='existential', description='THERE EXISTS' }, + [0x2204] = { unicodeslot=0x2204, category='sm', description='THERE DOES NOT EXIST', specials={'char',0x2203,0x0338} }, + [0x2205] = { unicodeslot=0x2205, category='sm', adobename='emptyset', description='EMPTY SET' }, + [0x2206] = { unicodeslot=0x2206, category='sm', adobename='Delta', description='INCREMENT' }, + [0x2207] = { unicodeslot=0x2207, category='sm', adobename='gradient', description='NABLA' }, + [0x2208] = { unicodeslot=0x2208, category='sm', adobename='element', description='ELEMENT OF' }, + [0x2209] = { unicodeslot=0x2209, category='sm', adobename='notelement', description='NOT AN ELEMENT OF', specials={'char',0x2208,0x0338} }, + [0x220A] = { unicodeslot=0x220A, category='sm', description='SMALL ELEMENT OF' }, + [0x220B] = { unicodeslot=0x220B, category='sm', adobename='suchthat', description='CONTAINS AS MEMBER' }, + [0x220C] = { unicodeslot=0x220C, category='sm', description='DOES NOT CONTAIN AS MEMBER', specials={'char',0x220B,0x0338} }, + [0x220D] = { unicodeslot=0x220D, category='sm', description='SMALL CONTAINS AS MEMBER' }, + [0x220E] = { unicodeslot=0x220E, category='sm', description='END OF PROOF' }, + [0x220F] = { unicodeslot=0x220F, category='sm', adobename='product', description='N-ARY PRODUCT' }, + [0x2210] = { unicodeslot=0x2210, category='sm', description='N-ARY COPRODUCT' }, + [0x2211] = { unicodeslot=0x2211, category='sm', adobename='summation', description='N-ARY SUMMATION' }, + [0x2212] = { unicodeslot=0x2212, category='sm', adobename='minus', description='MINUS SIGN' }, + [0x2213] = { unicodeslot=0x2213, category='sm', description='MINUS-OR-PLUS SIGN' }, + [0x2214] = { unicodeslot=0x2214, category='sm', description='DOT PLUS' }, + [0x2215] = { unicodeslot=0x2215, category='sm', description='DIVISION SLASH' }, + [0x2216] = { unicodeslot=0x2216, category='sm', description='SET MINUS' }, + [0x2217] = { unicodeslot=0x2217, category='sm', adobename='asteriskmath', description='ASTERISK OPERATOR' }, + [0x2218] = { unicodeslot=0x2218, category='sm', description='RING OPERATOR' }, + [0x2219] = { unicodeslot=0x2219, category='sm', description='BULLET OPERATOR' }, + [0x221A] = { unicodeslot=0x221A, category='sm', adobename='radical', description='SQUARE ROOT' }, + [0x221B] = { unicodeslot=0x221B, category='sm', description='CUBE ROOT' }, + [0x221C] = { unicodeslot=0x221C, category='sm', description='FOURTH ROOT' }, + [0x221D] = { unicodeslot=0x221D, category='sm', adobename='proportional', description='PROPORTIONAL TO' }, + [0x221E] = { unicodeslot=0x221E, category='sm', adobename='infinity', description='INFINITY' }, + [0x221F] = { unicodeslot=0x221F, category='sm', adobename='orthogonal', description='RIGHT ANGLE' }, + [0x2220] = { unicodeslot=0x2220, category='sm', adobename='angle', description='ANGLE' }, + [0x2221] = { unicodeslot=0x2221, category='sm', description='MEASURED ANGLE' }, + [0x2222] = { unicodeslot=0x2222, category='sm', description='SPHERICAL ANGLE' }, + [0x2223] = { unicodeslot=0x2223, category='sm', description='DIVIDES' }, + [0x2224] = { unicodeslot=0x2224, category='sm', description='DOES NOT DIVIDE', specials={'char',0x2223,0x0338} }, + [0x2225] = { unicodeslot=0x2225, category='sm', description='PARALLEL TO' }, + [0x2226] = { unicodeslot=0x2226, category='sm', description='NOT PARALLEL TO', specials={'char',0x2225,0x0338} }, + [0x2227] = { unicodeslot=0x2227, category='sm', adobename='logicaland', description='LOGICAL AND' }, + [0x2228] = { unicodeslot=0x2228, category='sm', adobename='logicalor', description='LOGICAL OR' }, + [0x2229] = { unicodeslot=0x2229, category='sm', adobename='intersection', description='INTERSECTION' }, + [0x222A] = { unicodeslot=0x222A, category='sm', adobename='union', description='UNION' }, + [0x222B] = { unicodeslot=0x222B, category='sm', adobename='integral', description='INTEGRAL' }, + [0x222C] = { unicodeslot=0x222C, category='sm', description='DOUBLE INTEGRAL', specials={'compat',0x222B,0x222B} }, + [0x222D] = { unicodeslot=0x222D, category='sm', description='TRIPLE INTEGRAL', specials={'compat',0x222B,0x222B,0x222B} }, + [0x222E] = { unicodeslot=0x222E, category='sm', description='CONTOUR INTEGRAL' }, + [0x222F] = { unicodeslot=0x222F, category='sm', description='SURFACE INTEGRAL', specials={'compat',0x222E,0x222E} }, + [0x2230] = { unicodeslot=0x2230, category='sm', description='VOLUME INTEGRAL', specials={'compat',0x222E,0x222E,0x222E} }, + [0x2231] = { unicodeslot=0x2231, category='sm', description='CLOCKWISE INTEGRAL' }, + [0x2232] = { unicodeslot=0x2232, category='sm', description='CLOCKWISE CONTOUR INTEGRAL' }, + [0x2233] = { unicodeslot=0x2233, category='sm', description='ANTICLOCKWISE CONTOUR INTEGRAL' }, + [0x2234] = { unicodeslot=0x2234, category='sm', adobename='therefore', description='THEREFORE' }, + [0x2235] = { unicodeslot=0x2235, category='sm', description='BECAUSE' }, + [0x2236] = { unicodeslot=0x2236, category='sm', description='RATIO' }, + [0x2237] = { unicodeslot=0x2237, category='sm', description='PROPORTION' }, + [0x2238] = { unicodeslot=0x2238, category='sm', description='DOT MINUS' }, + [0x2239] = { unicodeslot=0x2239, category='sm', description='EXCESS' }, + [0x223A] = { unicodeslot=0x223A, category='sm', description='GEOMETRIC PROPORTION' }, + [0x223B] = { unicodeslot=0x223B, category='sm', description='HOMOTHETIC' }, + [0x223C] = { unicodeslot=0x223C, category='sm', adobename='similar', description='TILDE OPERATOR' }, + [0x223D] = { unicodeslot=0x223D, category='sm', description='REVERSED TILDE' }, + [0x223E] = { unicodeslot=0x223E, category='sm', description='INVERTED LAZY S' }, + [0x223F] = { unicodeslot=0x223F, category='sm', description='SINE WAVE' }, + [0x2240] = { unicodeslot=0x2240, category='sm', description='WREATH PRODUCT' }, + [0x2241] = { unicodeslot=0x2241, category='sm', description='NOT TILDE', specials={'char',0x223C,0x0338} }, + [0x2242] = { unicodeslot=0x2242, category='sm', description='MINUS TILDE' }, + [0x2243] = { unicodeslot=0x2243, category='sm', description='ASYMPTOTICALLY EQUAL TO' }, + [0x2244] = { unicodeslot=0x2244, category='sm', description='NOT ASYMPTOTICALLY EQUAL TO', specials={'char',0x2243,0x0338} }, + [0x2245] = { unicodeslot=0x2245, category='sm', adobename='congruent', description='APPROXIMATELY EQUAL TO' }, + [0x2246] = { unicodeslot=0x2246, category='sm', description='APPROXIMATELY BUT NOT ACTUALLY EQUAL TO' }, + [0x2247] = { unicodeslot=0x2247, category='sm', description='NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO', specials={'char',0x2245,0x0338} }, + [0x2248] = { unicodeslot=0x2248, category='sm', adobename='approxequal', description='ALMOST EQUAL TO' }, + [0x2249] = { unicodeslot=0x2249, category='sm', description='NOT ALMOST EQUAL TO', specials={'char',0x2248,0x0338} }, + [0x224A] = { unicodeslot=0x224A, category='sm', description='ALMOST EQUAL OR EQUAL TO' }, + [0x224B] = { unicodeslot=0x224B, category='sm', description='TRIPLE TILDE' }, + [0x224C] = { unicodeslot=0x224C, category='sm', description='ALL EQUAL TO' }, + [0x224D] = { unicodeslot=0x224D, category='sm', description='EQUIVALENT TO' }, + [0x224E] = { unicodeslot=0x224E, category='sm', description='GEOMETRICALLY EQUIVALENT TO' }, + [0x224F] = { unicodeslot=0x224F, category='sm', description='DIFFERENCE BETWEEN' }, + [0x2250] = { unicodeslot=0x2250, category='sm', description='APPROACHES THE LIMIT' }, + [0x2251] = { unicodeslot=0x2251, category='sm', description='GEOMETRICALLY EQUAL TO' }, + [0x2252] = { unicodeslot=0x2252, category='sm', description='APPROXIMATELY EQUAL TO OR THE IMAGE OF' }, + [0x2253] = { unicodeslot=0x2253, category='sm', description='IMAGE OF OR APPROXIMATELY EQUAL TO' }, + [0x2254] = { unicodeslot=0x2254, category='sm', description='COLON EQUALS' }, + [0x2255] = { unicodeslot=0x2255, category='sm', description='EQUALS COLON' }, + [0x2256] = { unicodeslot=0x2256, category='sm', description='RING IN EQUAL TO' }, + [0x2257] = { unicodeslot=0x2257, category='sm', description='RING EQUAL TO' }, + [0x2258] = { unicodeslot=0x2258, category='sm', description='CORRESPONDS TO' }, + [0x2259] = { unicodeslot=0x2259, category='sm', description='ESTIMATES' }, + [0x225A] = { unicodeslot=0x225A, category='sm', description='EQUIANGULAR TO' }, + [0x225B] = { unicodeslot=0x225B, category='sm', description='STAR EQUALS' }, + [0x225C] = { unicodeslot=0x225C, category='sm', description='DELTA EQUAL TO' }, + [0x225D] = { unicodeslot=0x225D, category='sm', description='EQUAL TO BY DEFINITION' }, + [0x225E] = { unicodeslot=0x225E, category='sm', description='MEASURED BY' }, + [0x225F] = { unicodeslot=0x225F, category='sm', description='QUESTIONED EQUAL TO' }, + [0x2260] = { unicodeslot=0x2260, category='sm', adobename='notequal', description='NOT EQUAL TO', specials={'char',0x003D,0x0338} }, + [0x2261] = { unicodeslot=0x2261, category='sm', adobename='equivalence', description='IDENTICAL TO' }, + [0x2262] = { unicodeslot=0x2262, category='sm', description='NOT IDENTICAL TO', specials={'char',0x2261,0x0338} }, + [0x2263] = { unicodeslot=0x2263, category='sm', description='STRICTLY EQUIVALENT TO' }, + [0x2264] = { unicodeslot=0x2264, category='sm', adobename='lessequal', description='LESS-THAN OR EQUAL TO' }, + [0x2265] = { unicodeslot=0x2265, category='sm', adobename='greaterequal', description='GREATER-THAN OR EQUAL TO' }, + [0x2266] = { unicodeslot=0x2266, category='sm', description='LESS-THAN OVER EQUAL TO' }, + [0x2267] = { unicodeslot=0x2267, category='sm', description='GREATER-THAN OVER EQUAL TO' }, + [0x2268] = { unicodeslot=0x2268, category='sm', description='LESS-THAN BUT NOT EQUAL TO' }, + [0x2269] = { unicodeslot=0x2269, category='sm', description='GREATER-THAN BUT NOT EQUAL TO' }, + [0x226A] = { unicodeslot=0x226A, category='sm', description='MUCH LESS-THAN' }, + [0x226B] = { unicodeslot=0x226B, category='sm', description='MUCH GREATER-THAN' }, + [0x226C] = { unicodeslot=0x226C, category='sm', description='BETWEEN' }, + [0x226D] = { unicodeslot=0x226D, category='sm', description='NOT EQUIVALENT TO', specials={'char',0x224D,0x0338} }, + [0x226E] = { unicodeslot=0x226E, category='sm', description='NOT LESS-THAN', specials={'char',0x003C,0x0338} }, + [0x226F] = { unicodeslot=0x226F, category='sm', description='NOT GREATER-THAN', specials={'char',0x003E,0x0338} }, + [0x2270] = { unicodeslot=0x2270, category='sm', description='NEITHER LESS-THAN NOR EQUAL TO', specials={'char',0x2264,0x0338} }, + [0x2271] = { unicodeslot=0x2271, category='sm', description='NEITHER GREATER-THAN NOR EQUAL TO', specials={'char',0x2265,0x0338} }, + [0x2272] = { unicodeslot=0x2272, category='sm', description='LESS-THAN OR EQUIVALENT TO' }, + [0x2273] = { unicodeslot=0x2273, category='sm', description='GREATER-THAN OR EQUIVALENT TO' }, + [0x2274] = { unicodeslot=0x2274, category='sm', description='NEITHER LESS-THAN NOR EQUIVALENT TO', specials={'char',0x2272,0x0338} }, + [0x2275] = { unicodeslot=0x2275, category='sm', description='NEITHER GREATER-THAN NOR EQUIVALENT TO', specials={'char',0x2273,0x0338} }, + [0x2276] = { unicodeslot=0x2276, category='sm', description='LESS-THAN OR GREATER-THAN' }, + [0x2277] = { unicodeslot=0x2277, category='sm', description='GREATER-THAN OR LESS-THAN' }, + [0x2278] = { unicodeslot=0x2278, category='sm', description='NEITHER LESS-THAN NOR GREATER-THAN', specials={'char',0x2276,0x0338} }, + [0x2279] = { unicodeslot=0x2279, category='sm', description='NEITHER GREATER-THAN NOR LESS-THAN', specials={'char',0x2277,0x0338} }, + [0x227A] = { unicodeslot=0x227A, category='sm', description='PRECEDES' }, + [0x227B] = { unicodeslot=0x227B, category='sm', description='SUCCEEDS' }, + [0x227C] = { unicodeslot=0x227C, category='sm', description='PRECEDES OR EQUAL TO' }, + [0x227D] = { unicodeslot=0x227D, category='sm', description='SUCCEEDS OR EQUAL TO' }, + [0x227E] = { unicodeslot=0x227E, category='sm', description='PRECEDES OR EQUIVALENT TO' }, + [0x227F] = { unicodeslot=0x227F, category='sm', description='SUCCEEDS OR EQUIVALENT TO' }, + [0x2280] = { unicodeslot=0x2280, category='sm', description='DOES NOT PRECEDE', specials={'char',0x227A,0x0338} }, + [0x2281] = { unicodeslot=0x2281, category='sm', description='DOES NOT SUCCEED', specials={'char',0x227B,0x0338} }, + [0x2282] = { unicodeslot=0x2282, category='sm', adobename='propersubset', description='SUBSET OF' }, + [0x2283] = { unicodeslot=0x2283, category='sm', adobename='propersuperset', description='SUPERSET OF' }, + [0x2284] = { unicodeslot=0x2284, category='sm', adobename='notsubset', description='NOT A SUBSET OF', specials={'char',0x2282,0x0338} }, + [0x2285] = { unicodeslot=0x2285, category='sm', description='NOT A SUPERSET OF', specials={'char',0x2283,0x0338} }, + [0x2286] = { unicodeslot=0x2286, category='sm', adobename='reflexsubset', description='SUBSET OF OR EQUAL TO' }, + [0x2287] = { unicodeslot=0x2287, category='sm', adobename='reflexsuperset', description='SUPERSET OF OR EQUAL TO' }, + [0x2288] = { unicodeslot=0x2288, category='sm', description='NEITHER A SUBSET OF NOR EQUAL TO', specials={'char',0x2286,0x0338} }, + [0x2289] = { unicodeslot=0x2289, category='sm', description='NEITHER A SUPERSET OF NOR EQUAL TO', specials={'char',0x2287,0x0338} }, + [0x228A] = { unicodeslot=0x228A, category='sm', description='SUBSET OF WITH NOT EQUAL TO' }, + [0x228B] = { unicodeslot=0x228B, category='sm', description='SUPERSET OF WITH NOT EQUAL TO' }, + [0x228C] = { unicodeslot=0x228C, category='sm', description='MULTISET' }, + [0x228D] = { unicodeslot=0x228D, category='sm', description='MULTISET MULTIPLICATION' }, + [0x228E] = { unicodeslot=0x228E, category='sm', description='MULTISET UNION' }, + [0x228F] = { unicodeslot=0x228F, category='sm', description='SQUARE IMAGE OF' }, + [0x2290] = { unicodeslot=0x2290, category='sm', description='SQUARE ORIGINAL OF' }, + [0x2291] = { unicodeslot=0x2291, category='sm', description='SQUARE IMAGE OF OR EQUAL TO' }, + [0x2292] = { unicodeslot=0x2292, category='sm', description='SQUARE ORIGINAL OF OR EQUAL TO' }, + [0x2293] = { unicodeslot=0x2293, category='sm', description='SQUARE CAP' }, + [0x2294] = { unicodeslot=0x2294, category='sm', description='SQUARE CUP' }, + [0x2295] = { unicodeslot=0x2295, category='sm', adobename='circleplus', description='CIRCLED PLUS' }, + [0x2296] = { unicodeslot=0x2296, category='sm', description='CIRCLED MINUS' }, + [0x2297] = { unicodeslot=0x2297, category='sm', adobename='circlemultiply', description='CIRCLED TIMES' }, + [0x2298] = { unicodeslot=0x2298, category='sm', description='CIRCLED DIVISION SLASH' }, + [0x2299] = { unicodeslot=0x2299, category='sm', description='CIRCLED DOT OPERATOR' }, + [0x229A] = { unicodeslot=0x229A, category='sm', description='CIRCLED RING OPERATOR' }, + [0x229B] = { unicodeslot=0x229B, category='sm', description='CIRCLED ASTERISK OPERATOR' }, + [0x229C] = { unicodeslot=0x229C, category='sm', description='CIRCLED EQUALS' }, + [0x229D] = { unicodeslot=0x229D, category='sm', description='CIRCLED DASH' }, + [0x229E] = { unicodeslot=0x229E, category='sm', description='SQUARED PLUS' }, + [0x229F] = { unicodeslot=0x229F, category='sm', description='SQUARED MINUS' }, + [0x22A0] = { unicodeslot=0x22A0, category='sm', description='SQUARED TIMES' }, + [0x22A1] = { unicodeslot=0x22A1, category='sm', description='SQUARED DOT OPERATOR' }, + [0x22A2] = { unicodeslot=0x22A2, category='sm', description='RIGHT TACK' }, + [0x22A3] = { unicodeslot=0x22A3, category='sm', description='LEFT TACK' }, + [0x22A4] = { unicodeslot=0x22A4, category='sm', description='DOWN TACK' }, + [0x22A5] = { unicodeslot=0x22A5, category='sm', adobename='perpendicular', description='UP TACK' }, + [0x22A6] = { unicodeslot=0x22A6, category='sm', description='ASSERTION' }, + [0x22A7] = { unicodeslot=0x22A7, category='sm', description='MODELS' }, + [0x22A8] = { unicodeslot=0x22A8, category='sm', description='TRUE' }, + [0x22A9] = { unicodeslot=0x22A9, category='sm', description='FORCES' }, + [0x22AA] = { unicodeslot=0x22AA, category='sm', description='TRIPLE VERTICAL BAR RIGHT TURNSTILE' }, + [0x22AB] = { unicodeslot=0x22AB, category='sm', description='DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE' }, + [0x22AC] = { unicodeslot=0x22AC, category='sm', description='DOES NOT PROVE', specials={'char',0x22A2,0x0338} }, + [0x22AD] = { unicodeslot=0x22AD, category='sm', description='NOT TRUE', specials={'char',0x22A8,0x0338} }, + [0x22AE] = { unicodeslot=0x22AE, category='sm', description='DOES NOT FORCE', specials={'char',0x22A9,0x0338} }, + [0x22AF] = { unicodeslot=0x22AF, category='sm', description='NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE', specials={'char',0x22AB,0x0338} }, + [0x22B0] = { unicodeslot=0x22B0, category='sm', description='PRECEDES UNDER RELATION' }, + [0x22B1] = { unicodeslot=0x22B1, category='sm', description='SUCCEEDS UNDER RELATION' }, + [0x22B2] = { unicodeslot=0x22B2, category='sm', description='NORMAL SUBGROUP OF' }, + [0x22B3] = { unicodeslot=0x22B3, category='sm', description='CONTAINS AS NORMAL SUBGROUP' }, + [0x22B4] = { unicodeslot=0x22B4, category='sm', description='NORMAL SUBGROUP OF OR EQUAL TO' }, + [0x22B5] = { unicodeslot=0x22B5, category='sm', description='CONTAINS AS NORMAL SUBGROUP OR EQUAL TO' }, + [0x22B6] = { unicodeslot=0x22B6, category='sm', description='ORIGINAL OF' }, + [0x22B7] = { unicodeslot=0x22B7, category='sm', description='IMAGE OF' }, + [0x22B8] = { unicodeslot=0x22B8, category='sm', description='MULTIMAP' }, + [0x22B9] = { unicodeslot=0x22B9, category='sm', description='HERMITIAN CONJUGATE MATRIX' }, + [0x22BA] = { unicodeslot=0x22BA, category='sm', description='INTERCALATE' }, + [0x22BB] = { unicodeslot=0x22BB, category='sm', description='XOR' }, + [0x22BC] = { unicodeslot=0x22BC, category='sm', description='NAND' }, + [0x22BD] = { unicodeslot=0x22BD, category='sm', description='NOR' }, + [0x22BE] = { unicodeslot=0x22BE, category='sm', description='RIGHT ANGLE WITH ARC' }, + [0x22BF] = { unicodeslot=0x22BF, category='sm', description='RIGHT TRIANGLE' }, + [0x22C0] = { unicodeslot=0x22C0, category='sm', description='N-ARY LOGICAL AND' }, + [0x22C1] = { unicodeslot=0x22C1, category='sm', description='N-ARY LOGICAL OR' }, + [0x22C2] = { unicodeslot=0x22C2, category='sm', description='N-ARY INTERSECTION' }, + [0x22C3] = { unicodeslot=0x22C3, category='sm', description='N-ARY UNION' }, + [0x22C4] = { unicodeslot=0x22C4, category='sm', description='DIAMOND OPERATOR' }, + [0x22C5] = { unicodeslot=0x22C5, category='sm', adobename='dotmath', description='DOT OPERATOR' }, + [0x22C6] = { unicodeslot=0x22C6, category='sm', description='STAR OPERATOR' }, + [0x22C7] = { unicodeslot=0x22C7, category='sm', description='DIVISION TIMES' }, + [0x22C8] = { unicodeslot=0x22C8, category='sm', description='BOWTIE' }, + [0x22C9] = { unicodeslot=0x22C9, category='sm', description='LEFT NORMAL FACTOR SEMIDIRECT PRODUCT' }, + [0x22CA] = { unicodeslot=0x22CA, category='sm', description='RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT' }, + [0x22CB] = { unicodeslot=0x22CB, category='sm', description='LEFT SEMIDIRECT PRODUCT' }, + [0x22CC] = { unicodeslot=0x22CC, category='sm', description='RIGHT SEMIDIRECT PRODUCT' }, + [0x22CD] = { unicodeslot=0x22CD, category='sm', description='REVERSED TILDE EQUALS' }, + [0x22CE] = { unicodeslot=0x22CE, category='sm', description='CURLY LOGICAL OR' }, + [0x22CF] = { unicodeslot=0x22CF, category='sm', description='CURLY LOGICAL AND' }, + [0x22D0] = { unicodeslot=0x22D0, category='sm', description='DOUBLE SUBSET' }, + [0x22D1] = { unicodeslot=0x22D1, category='sm', description='DOUBLE SUPERSET' }, + [0x22D2] = { unicodeslot=0x22D2, category='sm', description='DOUBLE INTERSECTION' }, + [0x22D3] = { unicodeslot=0x22D3, category='sm', description='DOUBLE UNION' }, + [0x22D4] = { unicodeslot=0x22D4, category='sm', description='PITCHFORK' }, + [0x22D5] = { unicodeslot=0x22D5, category='sm', description='EQUAL AND PARALLEL TO' }, + [0x22D6] = { unicodeslot=0x22D6, category='sm', description='LESS-THAN WITH DOT' }, + [0x22D7] = { unicodeslot=0x22D7, category='sm', description='GREATER-THAN WITH DOT' }, + [0x22D8] = { unicodeslot=0x22D8, category='sm', description='VERY MUCH LESS-THAN' }, + [0x22D9] = { unicodeslot=0x22D9, category='sm', description='VERY MUCH GREATER-THAN' }, + [0x22DA] = { unicodeslot=0x22DA, category='sm', description='LESS-THAN EQUAL TO OR GREATER-THAN' }, + [0x22DB] = { unicodeslot=0x22DB, category='sm', description='GREATER-THAN EQUAL TO OR LESS-THAN' }, + [0x22DC] = { unicodeslot=0x22DC, category='sm', description='EQUAL TO OR LESS-THAN' }, + [0x22DD] = { unicodeslot=0x22DD, category='sm', description='EQUAL TO OR GREATER-THAN' }, + [0x22DE] = { unicodeslot=0x22DE, category='sm', description='EQUAL TO OR PRECEDES' }, + [0x22DF] = { unicodeslot=0x22DF, category='sm', description='EQUAL TO OR SUCCEEDS' }, + [0x22E0] = { unicodeslot=0x22E0, category='sm', description='DOES NOT PRECEDE OR EQUAL', specials={'char',0x227C,0x0338} }, + [0x22E1] = { unicodeslot=0x22E1, category='sm', description='DOES NOT SUCCEED OR EQUAL', specials={'char',0x227D,0x0338} }, + [0x22E2] = { unicodeslot=0x22E2, category='sm', description='NOT SQUARE IMAGE OF OR EQUAL TO', specials={'char',0x2291,0x0338} }, + [0x22E3] = { unicodeslot=0x22E3, category='sm', description='NOT SQUARE ORIGINAL OF OR EQUAL TO', specials={'char',0x2292,0x0338} }, + [0x22E4] = { unicodeslot=0x22E4, category='sm', description='SQUARE IMAGE OF OR NOT EQUAL TO' }, + [0x22E5] = { unicodeslot=0x22E5, category='sm', description='SQUARE ORIGINAL OF OR NOT EQUAL TO' }, + [0x22E6] = { unicodeslot=0x22E6, category='sm', description='LESS-THAN BUT NOT EQUIVALENT TO' }, + [0x22E7] = { unicodeslot=0x22E7, category='sm', description='GREATER-THAN BUT NOT EQUIVALENT TO' }, + [0x22E8] = { unicodeslot=0x22E8, category='sm', description='PRECEDES BUT NOT EQUIVALENT TO' }, + [0x22E9] = { unicodeslot=0x22E9, category='sm', description='SUCCEEDS BUT NOT EQUIVALENT TO' }, + [0x22EA] = { unicodeslot=0x22EA, category='sm', description='NOT NORMAL SUBGROUP OF', specials={'char',0x22B2,0x0338} }, + [0x22EB] = { unicodeslot=0x22EB, category='sm', description='DOES NOT CONTAIN AS NORMAL SUBGROUP', specials={'char',0x22B3,0x0338} }, + [0x22EC] = { unicodeslot=0x22EC, category='sm', description='NOT NORMAL SUBGROUP OF OR EQUAL TO', specials={'char',0x22B4,0x0338} }, + [0x22ED] = { unicodeslot=0x22ED, category='sm', description='DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL', specials={'char',0x22B5,0x0338} }, + [0x22EE] = { unicodeslot=0x22EE, category='sm', description='VERTICAL ELLIPSIS' }, + [0x22EF] = { unicodeslot=0x22EF, category='sm', description='MIDLINE HORIZONTAL ELLIPSIS' }, + [0x22F0] = { unicodeslot=0x22F0, category='sm', description='UP RIGHT DIAGONAL ELLIPSIS' }, + [0x22F1] = { unicodeslot=0x22F1, category='sm', description='DOWN RIGHT DIAGONAL ELLIPSIS' }, + [0x22F2] = { unicodeslot=0x22F2, category='sm', description='ELEMENT OF WITH LONG HORIZONTAL STROKE' }, + [0x22F3] = { unicodeslot=0x22F3, category='sm', description='ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE' }, + [0x22F4] = { unicodeslot=0x22F4, category='sm', description='SMALL ELEMENT OF WITH VERTICAL BAR AT END OF HORIZONTAL STROKE' }, + [0x22F5] = { unicodeslot=0x22F5, category='sm', description='ELEMENT OF WITH DOT ABOVE' }, + [0x22F6] = { unicodeslot=0x22F6, category='sm', description='ELEMENT OF WITH OVERBAR' }, + [0x22F7] = { unicodeslot=0x22F7, category='sm', description='SMALL ELEMENT OF WITH OVERBAR' }, + [0x22F8] = { unicodeslot=0x22F8, category='sm', description='ELEMENT OF WITH UNDERBAR' }, + [0x22F9] = { unicodeslot=0x22F9, category='sm', description='ELEMENT OF WITH TWO HORIZONTAL STROKES' }, + [0x22FA] = { unicodeslot=0x22FA, category='sm', description='CONTAINS WITH LONG HORIZONTAL STROKE' }, + [0x22FB] = { unicodeslot=0x22FB, category='sm', description='CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE' }, + [0x22FC] = { unicodeslot=0x22FC, category='sm', description='SMALL CONTAINS WITH VERTICAL BAR AT END OF HORIZONTAL STROKE' }, + [0x22FD] = { unicodeslot=0x22FD, category='sm', description='CONTAINS WITH OVERBAR' }, + [0x22FE] = { unicodeslot=0x22FE, category='sm', description='SMALL CONTAINS WITH OVERBAR' }, + [0x22FF] = { unicodeslot=0x22FF, category='sm', description='Z NOTATION BAG MEMBERSHIP' }, + [0x2300] = { unicodeslot=0x2300, category='so', description='DIAMETER SIGN' }, + [0x2301] = { unicodeslot=0x2301, category='so', description='ELECTRIC ARROW' }, + [0x2302] = { unicodeslot=0x2302, category='so', adobename='house', description='HOUSE' }, + [0x2303] = { unicodeslot=0x2303, category='so', description='UP ARROWHEAD' }, + [0x2304] = { unicodeslot=0x2304, category='so', description='DOWN ARROWHEAD' }, + [0x2305] = { unicodeslot=0x2305, category='so', description='PROJECTIVE' }, + [0x2306] = { unicodeslot=0x2306, category='so', description='PERSPECTIVE' }, + [0x2307] = { unicodeslot=0x2307, category='so', description='WAVY LINE' }, + [0x2308] = { unicodeslot=0x2308, category='sm', description='LEFT CEILING' }, + [0x2309] = { unicodeslot=0x2309, category='sm', description='RIGHT CEILING' }, + [0x230A] = { unicodeslot=0x230A, category='sm', description='LEFT FLOOR' }, + [0x230B] = { unicodeslot=0x230B, category='sm', description='RIGHT FLOOR' }, + [0x230C] = { unicodeslot=0x230C, category='so', description='BOTTOM RIGHT CROP' }, + [0x230D] = { unicodeslot=0x230D, category='so', description='BOTTOM LEFT CROP' }, + [0x230E] = { unicodeslot=0x230E, category='so', description='TOP RIGHT CROP' }, + [0x230F] = { unicodeslot=0x230F, category='so', description='TOP LEFT CROP' }, + [0x2310] = { unicodeslot=0x2310, category='so', adobename='revlogicalnot', description='REVERSED NOT SIGN' }, + [0x2311] = { unicodeslot=0x2311, category='so', description='SQUARE LOZENGE' }, + [0x2312] = { unicodeslot=0x2312, category='so', description='ARC' }, + [0x2313] = { unicodeslot=0x2313, category='so', description='SEGMENT' }, + [0x2314] = { unicodeslot=0x2314, category='so', description='SECTOR' }, + [0x2315] = { unicodeslot=0x2315, category='so', description='TELEPHONE RECORDER' }, + [0x2316] = { unicodeslot=0x2316, category='so', description='POSITION INDICATOR' }, + [0x2317] = { unicodeslot=0x2317, category='so', description='VIEWDATA SQUARE' }, + [0x2318] = { unicodeslot=0x2318, category='so', description='PLACE OF INTEREST SIGN' }, + [0x2319] = { unicodeslot=0x2319, category='so', description='TURNED NOT SIGN' }, + [0x231A] = { unicodeslot=0x231A, category='so', description='WATCH' }, + [0x231B] = { unicodeslot=0x231B, category='so', description='HOURGLASS' }, + [0x231C] = { unicodeslot=0x231C, category='so', description='TOP LEFT CORNER' }, + [0x231D] = { unicodeslot=0x231D, category='so', description='TOP RIGHT CORNER' }, + [0x231E] = { unicodeslot=0x231E, category='so', description='BOTTOM LEFT CORNER' }, + [0x231F] = { unicodeslot=0x231F, category='so', description='BOTTOM RIGHT CORNER' }, + [0x2320] = { unicodeslot=0x2320, category='sm', adobename='integraltp', description='TOP HALF INTEGRAL' }, + [0x2321] = { unicodeslot=0x2321, category='sm', adobename='integralbt', description='BOTTOM HALF INTEGRAL' }, + [0x2322] = { unicodeslot=0x2322, category='so', description='FROWN' }, + [0x2323] = { unicodeslot=0x2323, category='so', description='SMILE' }, + [0x2324] = { unicodeslot=0x2324, category='so', description='UP ARROWHEAD BETWEEN TWO HORIZONTAL BARS' }, + [0x2325] = { unicodeslot=0x2325, category='so', description='OPTION KEY' }, + [0x2326] = { unicodeslot=0x2326, category='so', description='ERASE TO THE RIGHT' }, + [0x2327] = { unicodeslot=0x2327, category='so', description='X IN A RECTANGLE BOX' }, + [0x2328] = { unicodeslot=0x2328, category='so', description='KEYBOARD' }, + [0x2329] = { unicodeslot=0x2329, category='ps', adobename='angleleft', description='LEFT-POINTING ANGLE BRACKET', specials={'char',0x3008} }, + [0x232A] = { unicodeslot=0x232A, category='pe', adobename='angleright', description='RIGHT-POINTING ANGLE BRACKET', specials={'char',0x3009} }, + [0x232B] = { unicodeslot=0x232B, category='so', description='ERASE TO THE LEFT' }, + [0x232C] = { unicodeslot=0x232C, category='so', description='BENZENE RING' }, + [0x232D] = { unicodeslot=0x232D, category='so', description='CYLINDRICITY' }, + [0x232E] = { unicodeslot=0x232E, category='so', description='ALL AROUND-PROFILE' }, + [0x232F] = { unicodeslot=0x232F, category='so', description='SYMMETRY' }, + [0x2330] = { unicodeslot=0x2330, category='so', description='TOTAL RUNOUT' }, + [0x2331] = { unicodeslot=0x2331, category='so', description='DIMENSION ORIGIN' }, + [0x2332] = { unicodeslot=0x2332, category='so', description='CONICAL TAPER' }, + [0x2333] = { unicodeslot=0x2333, category='so', description='SLOPE' }, + [0x2334] = { unicodeslot=0x2334, category='so', description='COUNTERBORE' }, + [0x2335] = { unicodeslot=0x2335, category='so', description='COUNTERSINK' }, + [0x2336] = { unicodeslot=0x2336, category='so', description='APL FUNCTIONAL SYMBOL I-BEAM' }, + [0x2337] = { unicodeslot=0x2337, category='so', description='APL FUNCTIONAL SYMBOL SQUISH QUAD' }, + [0x2338] = { unicodeslot=0x2338, category='so', description='APL FUNCTIONAL SYMBOL QUAD EQUAL' }, + [0x2339] = { unicodeslot=0x2339, category='so', description='APL FUNCTIONAL SYMBOL QUAD DIVIDE' }, + [0x233A] = { unicodeslot=0x233A, category='so', description='APL FUNCTIONAL SYMBOL QUAD DIAMOND' }, + [0x233B] = { unicodeslot=0x233B, category='so', description='APL FUNCTIONAL SYMBOL QUAD JOT' }, + [0x233C] = { unicodeslot=0x233C, category='so', description='APL FUNCTIONAL SYMBOL QUAD CIRCLE' }, + [0x233D] = { unicodeslot=0x233D, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE STILE' }, + [0x233E] = { unicodeslot=0x233E, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE JOT' }, + [0x233F] = { unicodeslot=0x233F, category='so', description='APL FUNCTIONAL SYMBOL SLASH BAR' }, + [0x2340] = { unicodeslot=0x2340, category='so', description='APL FUNCTIONAL SYMBOL BACKSLASH BAR' }, + [0x2341] = { unicodeslot=0x2341, category='so', description='APL FUNCTIONAL SYMBOL QUAD SLASH' }, + [0x2342] = { unicodeslot=0x2342, category='so', description='APL FUNCTIONAL SYMBOL QUAD BACKSLASH' }, + [0x2343] = { unicodeslot=0x2343, category='so', description='APL FUNCTIONAL SYMBOL QUAD LESS-THAN' }, + [0x2344] = { unicodeslot=0x2344, category='so', description='APL FUNCTIONAL SYMBOL QUAD GREATER-THAN' }, + [0x2345] = { unicodeslot=0x2345, category='so', description='APL FUNCTIONAL SYMBOL LEFTWARDS VANE' }, + [0x2346] = { unicodeslot=0x2346, category='so', description='APL FUNCTIONAL SYMBOL RIGHTWARDS VANE' }, + [0x2347] = { unicodeslot=0x2347, category='so', description='APL FUNCTIONAL SYMBOL QUAD LEFTWARDS ARROW' }, + [0x2348] = { unicodeslot=0x2348, category='so', description='APL FUNCTIONAL SYMBOL QUAD RIGHTWARDS ARROW' }, + [0x2349] = { unicodeslot=0x2349, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE BACKSLASH' }, + [0x234A] = { unicodeslot=0x234A, category='so', description='APL FUNCTIONAL SYMBOL DOWN TACK UNDERBAR' }, + [0x234B] = { unicodeslot=0x234B, category='so', description='APL FUNCTIONAL SYMBOL DELTA STILE' }, + [0x234C] = { unicodeslot=0x234C, category='so', description='APL FUNCTIONAL SYMBOL QUAD DOWN CARET' }, + [0x234D] = { unicodeslot=0x234D, category='so', description='APL FUNCTIONAL SYMBOL QUAD DELTA' }, + [0x234E] = { unicodeslot=0x234E, category='so', description='APL FUNCTIONAL SYMBOL DOWN TACK JOT' }, + [0x234F] = { unicodeslot=0x234F, category='so', description='APL FUNCTIONAL SYMBOL UPWARDS VANE' }, + [0x2350] = { unicodeslot=0x2350, category='so', description='APL FUNCTIONAL SYMBOL QUAD UPWARDS ARROW' }, + [0x2351] = { unicodeslot=0x2351, category='so', description='APL FUNCTIONAL SYMBOL UP TACK OVERBAR' }, + [0x2352] = { unicodeslot=0x2352, category='so', description='APL FUNCTIONAL SYMBOL DEL STILE' }, + [0x2353] = { unicodeslot=0x2353, category='so', description='APL FUNCTIONAL SYMBOL QUAD UP CARET' }, + [0x2354] = { unicodeslot=0x2354, category='so', description='APL FUNCTIONAL SYMBOL QUAD DEL' }, + [0x2355] = { unicodeslot=0x2355, category='so', description='APL FUNCTIONAL SYMBOL UP TACK JOT' }, + [0x2356] = { unicodeslot=0x2356, category='so', description='APL FUNCTIONAL SYMBOL DOWNWARDS VANE' }, + [0x2357] = { unicodeslot=0x2357, category='so', description='APL FUNCTIONAL SYMBOL QUAD DOWNWARDS ARROW' }, + [0x2358] = { unicodeslot=0x2358, category='so', description='APL FUNCTIONAL SYMBOL QUOTE UNDERBAR' }, + [0x2359] = { unicodeslot=0x2359, category='so', description='APL FUNCTIONAL SYMBOL DELTA UNDERBAR' }, + [0x235A] = { unicodeslot=0x235A, category='so', description='APL FUNCTIONAL SYMBOL DIAMOND UNDERBAR' }, + [0x235B] = { unicodeslot=0x235B, category='so', description='APL FUNCTIONAL SYMBOL JOT UNDERBAR' }, + [0x235C] = { unicodeslot=0x235C, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE UNDERBAR' }, + [0x235D] = { unicodeslot=0x235D, category='so', description='APL FUNCTIONAL SYMBOL UP SHOE JOT' }, + [0x235E] = { unicodeslot=0x235E, category='so', description='APL FUNCTIONAL SYMBOL QUOTE QUAD' }, + [0x235F] = { unicodeslot=0x235F, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE STAR' }, + [0x2360] = { unicodeslot=0x2360, category='so', description='APL FUNCTIONAL SYMBOL QUAD COLON' }, + [0x2361] = { unicodeslot=0x2361, category='so', description='APL FUNCTIONAL SYMBOL UP TACK DIAERESIS' }, + [0x2362] = { unicodeslot=0x2362, category='so', description='APL FUNCTIONAL SYMBOL DEL DIAERESIS' }, + [0x2363] = { unicodeslot=0x2363, category='so', description='APL FUNCTIONAL SYMBOL STAR DIAERESIS' }, + [0x2364] = { unicodeslot=0x2364, category='so', description='APL FUNCTIONAL SYMBOL JOT DIAERESIS' }, + [0x2365] = { unicodeslot=0x2365, category='so', description='APL FUNCTIONAL SYMBOL CIRCLE DIAERESIS' }, + [0x2366] = { unicodeslot=0x2366, category='so', description='APL FUNCTIONAL SYMBOL DOWN SHOE STILE' }, + [0x2367] = { unicodeslot=0x2367, category='so', description='APL FUNCTIONAL SYMBOL LEFT SHOE STILE' }, + [0x2368] = { unicodeslot=0x2368, category='so', description='APL FUNCTIONAL SYMBOL TILDE DIAERESIS' }, + [0x2369] = { unicodeslot=0x2369, category='so', description='APL FUNCTIONAL SYMBOL GREATER-THAN DIAERESIS' }, + [0x236A] = { unicodeslot=0x236A, category='so', description='APL FUNCTIONAL SYMBOL COMMA BAR' }, + [0x236B] = { unicodeslot=0x236B, category='so', description='APL FUNCTIONAL SYMBOL DEL TILDE' }, + [0x236C] = { unicodeslot=0x236C, category='so', description='APL FUNCTIONAL SYMBOL ZILDE' }, + [0x236D] = { unicodeslot=0x236D, category='so', description='APL FUNCTIONAL SYMBOL STILE TILDE' }, + [0x236E] = { unicodeslot=0x236E, category='so', description='APL FUNCTIONAL SYMBOL SEMICOLON UNDERBAR' }, + [0x236F] = { unicodeslot=0x236F, category='so', description='APL FUNCTIONAL SYMBOL QUAD NOT EQUAL' }, + [0x2370] = { unicodeslot=0x2370, category='so', description='APL FUNCTIONAL SYMBOL QUAD QUESTION' }, + [0x2371] = { unicodeslot=0x2371, category='so', description='APL FUNCTIONAL SYMBOL DOWN CARET TILDE' }, + [0x2372] = { unicodeslot=0x2372, category='so', description='APL FUNCTIONAL SYMBOL UP CARET TILDE' }, + [0x2373] = { unicodeslot=0x2373, category='so', description='APL FUNCTIONAL SYMBOL IOTA' }, + [0x2374] = { unicodeslot=0x2374, category='so', description='APL FUNCTIONAL SYMBOL RHO' }, + [0x2375] = { unicodeslot=0x2375, category='so', description='APL FUNCTIONAL SYMBOL OMEGA' }, + [0x2376] = { unicodeslot=0x2376, category='so', description='APL FUNCTIONAL SYMBOL ALPHA UNDERBAR' }, + [0x2377] = { unicodeslot=0x2377, category='so', description='APL FUNCTIONAL SYMBOL EPSILON UNDERBAR' }, + [0x2378] = { unicodeslot=0x2378, category='so', description='APL FUNCTIONAL SYMBOL IOTA UNDERBAR' }, + [0x2379] = { unicodeslot=0x2379, category='so', description='APL FUNCTIONAL SYMBOL OMEGA UNDERBAR' }, + [0x237A] = { unicodeslot=0x237A, category='so', description='APL FUNCTIONAL SYMBOL ALPHA' }, + [0x237B] = { unicodeslot=0x237B, category='so', description='NOT CHECK MARK' }, + [0x237C] = { unicodeslot=0x237C, category='sm', description='RIGHT ANGLE WITH DOWNWARDS ZIGZAG ARROW' }, + [0x237D] = { unicodeslot=0x237D, category='so', description='SHOULDERED OPEN BOX' }, + [0x237E] = { unicodeslot=0x237E, category='so', description='BELL SYMBOL' }, + [0x237F] = { unicodeslot=0x237F, category='so', description='VERTICAL LINE WITH MIDDLE DOT' }, + [0x2380] = { unicodeslot=0x2380, category='so', description='INSERTION SYMBOL' }, + [0x2381] = { unicodeslot=0x2381, category='so', description='CONTINUOUS UNDERLINE SYMBOL' }, + [0x2382] = { unicodeslot=0x2382, category='so', description='DISCONTINUOUS UNDERLINE SYMBOL' }, + [0x2383] = { unicodeslot=0x2383, category='so', description='EMPHASIS SYMBOL' }, + [0x2384] = { unicodeslot=0x2384, category='so', description='COMPOSITION SYMBOL' }, + [0x2385] = { unicodeslot=0x2385, category='so', description='WHITE SQUARE WITH CENTRE VERTICAL LINE' }, + [0x2386] = { unicodeslot=0x2386, category='so', description='ENTER SYMBOL' }, + [0x2387] = { unicodeslot=0x2387, category='so', description='ALTERNATIVE KEY SYMBOL' }, + [0x2388] = { unicodeslot=0x2388, category='so', description='HELM SYMBOL' }, + [0x2389] = { unicodeslot=0x2389, category='so', description='CIRCLED HORIZONTAL BAR WITH NOTCH' }, + [0x238A] = { unicodeslot=0x238A, category='so', description='CIRCLED TRIANGLE DOWN' }, + [0x238B] = { unicodeslot=0x238B, category='so', description='BROKEN CIRCLE WITH NORTHWEST ARROW' }, + [0x238C] = { unicodeslot=0x238C, category='so', description='UNDO SYMBOL' }, + [0x238D] = { unicodeslot=0x238D, category='so', description='MONOSTABLE SYMBOL' }, + [0x238E] = { unicodeslot=0x238E, category='so', description='HYSTERESIS SYMBOL' }, + [0x238F] = { unicodeslot=0x238F, category='so', description='OPEN-CIRCUIT-OUTPUT H-TYPE SYMBOL' }, + [0x2390] = { unicodeslot=0x2390, category='so', description='OPEN-CIRCUIT-OUTPUT L-TYPE SYMBOL' }, + [0x2391] = { unicodeslot=0x2391, category='so', description='PASSIVE-PULL-DOWN-OUTPUT SYMBOL' }, + [0x2392] = { unicodeslot=0x2392, category='so', description='PASSIVE-PULL-UP-OUTPUT SYMBOL' }, + [0x2393] = { unicodeslot=0x2393, category='so', description='DIRECT CURRENT SYMBOL FORM TWO' }, + [0x2394] = { unicodeslot=0x2394, category='so', description='SOFTWARE-FUNCTION SYMBOL' }, + [0x2395] = { unicodeslot=0x2395, category='so', description='APL FUNCTIONAL SYMBOL QUAD' }, + [0x2396] = { unicodeslot=0x2396, category='so', description='DECIMAL SEPARATOR KEY SYMBOL' }, + [0x2397] = { unicodeslot=0x2397, category='so', description='PREVIOUS PAGE' }, + [0x2398] = { unicodeslot=0x2398, category='so', description='NEXT PAGE' }, + [0x2399] = { unicodeslot=0x2399, category='so', description='PRINT SCREEN SYMBOL' }, + [0x239A] = { unicodeslot=0x239A, category='so', description='CLEAR SCREEN SYMBOL' }, + [0x239B] = { unicodeslot=0x239B, category='sm', description='LEFT PARENTHESIS UPPER HOOK' }, + [0x239C] = { unicodeslot=0x239C, category='sm', description='LEFT PARENTHESIS EXTENSION' }, + [0x239D] = { unicodeslot=0x239D, category='sm', description='LEFT PARENTHESIS LOWER HOOK' }, + [0x239E] = { unicodeslot=0x239E, category='sm', description='RIGHT PARENTHESIS UPPER HOOK' }, + [0x239F] = { unicodeslot=0x239F, category='sm', description='RIGHT PARENTHESIS EXTENSION' }, + [0x23A0] = { unicodeslot=0x23A0, category='sm', description='RIGHT PARENTHESIS LOWER HOOK' }, + [0x23A1] = { unicodeslot=0x23A1, category='sm', description='LEFT SQUARE BRACKET UPPER CORNER' }, + [0x23A2] = { unicodeslot=0x23A2, category='sm', description='LEFT SQUARE BRACKET EXTENSION' }, + [0x23A3] = { unicodeslot=0x23A3, category='sm', description='LEFT SQUARE BRACKET LOWER CORNER' }, + [0x23A4] = { unicodeslot=0x23A4, category='sm', description='RIGHT SQUARE BRACKET UPPER CORNER' }, + [0x23A5] = { unicodeslot=0x23A5, category='sm', description='RIGHT SQUARE BRACKET EXTENSION' }, + [0x23A6] = { unicodeslot=0x23A6, category='sm', description='RIGHT SQUARE BRACKET LOWER CORNER' }, + [0x23A7] = { unicodeslot=0x23A7, category='sm', description='LEFT CURLY BRACKET UPPER HOOK' }, + [0x23A8] = { unicodeslot=0x23A8, category='sm', description='LEFT CURLY BRACKET MIDDLE PIECE' }, + [0x23A9] = { unicodeslot=0x23A9, category='sm', description='LEFT CURLY BRACKET LOWER HOOK' }, + [0x23AA] = { unicodeslot=0x23AA, category='sm', description='CURLY BRACKET EXTENSION' }, + [0x23AB] = { unicodeslot=0x23AB, category='sm', description='RIGHT CURLY BRACKET UPPER HOOK' }, + [0x23AC] = { unicodeslot=0x23AC, category='sm', description='RIGHT CURLY BRACKET MIDDLE PIECE' }, + [0x23AD] = { unicodeslot=0x23AD, category='sm', description='RIGHT CURLY BRACKET LOWER HOOK' }, + [0x23AE] = { unicodeslot=0x23AE, category='sm', description='INTEGRAL EXTENSION' }, + [0x23AF] = { unicodeslot=0x23AF, category='sm', description='HORIZONTAL LINE EXTENSION' }, + [0x23B0] = { unicodeslot=0x23B0, category='sm', description='UPPER LEFT OR LOWER RIGHT CURLY BRACKET SECTION' }, + [0x23B1] = { unicodeslot=0x23B1, category='sm', description='UPPER RIGHT OR LOWER LEFT CURLY BRACKET SECTION' }, + [0x23B2] = { unicodeslot=0x23B2, category='sm', description='SUMMATION TOP' }, + [0x23B3] = { unicodeslot=0x23B3, category='sm', description='SUMMATION BOTTOM' }, + [0x23B4] = { unicodeslot=0x23B4, category='so', description='TOP SQUARE BRACKET' }, + [0x23B5] = { unicodeslot=0x23B5, category='so', description='BOTTOM SQUARE BRACKET' }, + [0x23B6] = { unicodeslot=0x23B6, category='so', description='BOTTOM SQUARE BRACKET OVER TOP SQUARE BRACKET' }, + [0x23B7] = { unicodeslot=0x23B7, category='so', description='RADICAL SYMBOL BOTTOM' }, + [0x23B8] = { unicodeslot=0x23B8, category='so', description='LEFT VERTICAL BOX LINE' }, + [0x23B9] = { unicodeslot=0x23B9, category='so', description='RIGHT VERTICAL BOX LINE' }, + [0x23BA] = { unicodeslot=0x23BA, category='so', description='HORIZONTAL SCAN LINE-1' }, + [0x23BB] = { unicodeslot=0x23BB, category='so', description='HORIZONTAL SCAN LINE-3' }, + [0x23BC] = { unicodeslot=0x23BC, category='so', description='HORIZONTAL SCAN LINE-7' }, + [0x23BD] = { unicodeslot=0x23BD, category='so', description='HORIZONTAL SCAN LINE-9' }, + [0x23BE] = { unicodeslot=0x23BE, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL AND TOP RIGHT' }, + [0x23BF] = { unicodeslot=0x23BF, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM RIGHT' }, + [0x23C0] = { unicodeslot=0x23C0, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL WITH CIRCLE' }, + [0x23C1] = { unicodeslot=0x23C1, category='so', description='DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH CIRCLE' }, + [0x23C2] = { unicodeslot=0x23C2, category='so', description='DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH CIRCLE' }, + [0x23C3] = { unicodeslot=0x23C3, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL WITH TRIANGLE' }, + [0x23C4] = { unicodeslot=0x23C4, category='so', description='DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH TRIANGLE' }, + [0x23C5] = { unicodeslot=0x23C5, category='so', description='DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH TRIANGLE' }, + [0x23C6] = { unicodeslot=0x23C6, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL AND WAVE' }, + [0x23C7] = { unicodeslot=0x23C7, category='so', description='DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL WITH WAVE' }, + [0x23C8] = { unicodeslot=0x23C8, category='so', description='DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL WITH WAVE' }, + [0x23C9] = { unicodeslot=0x23C9, category='so', description='DENTISTRY SYMBOL LIGHT DOWN AND HORIZONTAL' }, + [0x23CA] = { unicodeslot=0x23CA, category='so', description='DENTISTRY SYMBOL LIGHT UP AND HORIZONTAL' }, + [0x23CB] = { unicodeslot=0x23CB, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL AND TOP LEFT' }, + [0x23CC] = { unicodeslot=0x23CC, category='so', description='DENTISTRY SYMBOL LIGHT VERTICAL AND BOTTOM LEFT' }, + [0x23CD] = { unicodeslot=0x23CD, category='so', description='SQUARE FOOT' }, + [0x23CE] = { unicodeslot=0x23CE, category='so', description='RETURN SYMBOL' }, + [0x23CF] = { unicodeslot=0x23CF, category='so', description='EJECT SYMBOL' }, + [0x23D0] = { unicodeslot=0x23D0, category='so', description='VERTICAL LINE EXTENSION' }, + [0x23D1] = { unicodeslot=0x23D1, category='so', description='METRICAL BREVE' }, + [0x23D2] = { unicodeslot=0x23D2, category='so', description='METRICAL LONG OVER SHORT' }, + [0x23D3] = { unicodeslot=0x23D3, category='so', description='METRICAL SHORT OVER LONG' }, + [0x23D4] = { unicodeslot=0x23D4, category='so', description='METRICAL LONG OVER TWO SHORTS' }, + [0x23D5] = { unicodeslot=0x23D5, category='so', description='METRICAL TWO SHORTS OVER LONG' }, + [0x23D6] = { unicodeslot=0x23D6, category='so', description='METRICAL TWO SHORTS JOINED' }, + [0x23D7] = { unicodeslot=0x23D7, category='so', description='METRICAL TRISEME' }, + [0x23D8] = { unicodeslot=0x23D8, category='so', description='METRICAL TETRASEME' }, + [0x23D9] = { unicodeslot=0x23D9, category='so', description='METRICAL PENTASEME' }, + [0x23DA] = { unicodeslot=0x23DA, category='so', description='EARTH GROUND' }, + [0x23DB] = { unicodeslot=0x23DB, category='so', description='FUSE' }, + [0x23DC] = { unicodeslot=0x23DC, category='sm', description='TOP PARENTHESIS' }, + [0x23DD] = { unicodeslot=0x23DD, category='sm', description='BOTTOM PARENTHESIS' }, + [0x23DE] = { unicodeslot=0x23DE, category='sm', description='TOP CURLY BRACKET' }, + [0x23DF] = { unicodeslot=0x23DF, category='sm', description='BOTTOM CURLY BRACKET' }, + [0x23E0] = { unicodeslot=0x23E0, category='sm', description='TOP TORTOISE SHELL BRACKET' }, + [0x23E1] = { unicodeslot=0x23E1, category='sm', description='BOTTOM TORTOISE SHELL BRACKET' }, + [0x23E2] = { unicodeslot=0x23E2, category='so', description='WHITE TRAPEZIUM' }, + [0x23E3] = { unicodeslot=0x23E3, category='so', description='BENZENE RING WITH CIRCLE' }, + [0x23E4] = { unicodeslot=0x23E4, category='so', description='STRAIGHTNESS' }, + [0x23E5] = { unicodeslot=0x23E5, category='so', description='FLATNESS' }, + [0x23E6] = { unicodeslot=0x23E6, category='so', description='AC CURRENT' }, + [0x23E7] = { unicodeslot=0x23E7, category='so', description='ELECTRICAL INTERSECTION' }, + [0x2400] = { unicodeslot=0x2400, category='so', description='SYMBOL FOR NULL' }, + [0x2401] = { unicodeslot=0x2401, category='so', description='SYMBOL FOR START OF HEADING' }, + [0x2402] = { unicodeslot=0x2402, category='so', description='SYMBOL FOR START OF TEXT' }, + [0x2403] = { unicodeslot=0x2403, category='so', description='SYMBOL FOR END OF TEXT' }, + [0x2404] = { unicodeslot=0x2404, category='so', description='SYMBOL FOR END OF TRANSMISSION' }, + [0x2405] = { unicodeslot=0x2405, category='so', description='SYMBOL FOR ENQUIRY' }, + [0x2406] = { unicodeslot=0x2406, category='so', description='SYMBOL FOR ACKNOWLEDGE' }, + [0x2407] = { unicodeslot=0x2407, category='so', description='SYMBOL FOR BELL' }, + [0x2408] = { unicodeslot=0x2408, category='so', description='SYMBOL FOR BACKSPACE' }, + [0x2409] = { unicodeslot=0x2409, category='so', description='SYMBOL FOR HORIZONTAL TABULATION' }, + [0x240A] = { unicodeslot=0x240A, category='so', description='SYMBOL FOR LINE FEED' }, + [0x240B] = { unicodeslot=0x240B, category='so', description='SYMBOL FOR VERTICAL TABULATION' }, + [0x240C] = { unicodeslot=0x240C, category='so', description='SYMBOL FOR FORM FEED' }, + [0x240D] = { unicodeslot=0x240D, category='so', description='SYMBOL FOR CARRIAGE RETURN' }, + [0x240E] = { unicodeslot=0x240E, category='so', description='SYMBOL FOR SHIFT OUT' }, + [0x240F] = { unicodeslot=0x240F, category='so', description='SYMBOL FOR SHIFT IN' }, + [0x2410] = { unicodeslot=0x2410, category='so', description='SYMBOL FOR DATA LINK ESCAPE' }, + [0x2411] = { unicodeslot=0x2411, category='so', description='SYMBOL FOR DEVICE CONTROL ONE' }, + [0x2412] = { unicodeslot=0x2412, category='so', description='SYMBOL FOR DEVICE CONTROL TWO' }, + [0x2413] = { unicodeslot=0x2413, category='so', description='SYMBOL FOR DEVICE CONTROL THREE' }, + [0x2414] = { unicodeslot=0x2414, category='so', description='SYMBOL FOR DEVICE CONTROL FOUR' }, + [0x2415] = { unicodeslot=0x2415, category='so', description='SYMBOL FOR NEGATIVE ACKNOWLEDGE' }, + [0x2416] = { unicodeslot=0x2416, category='so', description='SYMBOL FOR SYNCHRONOUS IDLE' }, + [0x2417] = { unicodeslot=0x2417, category='so', description='SYMBOL FOR END OF TRANSMISSION BLOCK' }, + [0x2418] = { unicodeslot=0x2418, category='so', description='SYMBOL FOR CANCEL' }, + [0x2419] = { unicodeslot=0x2419, category='so', description='SYMBOL FOR END OF MEDIUM' }, + [0x241A] = { unicodeslot=0x241A, category='so', description='SYMBOL FOR SUBSTITUTE' }, + [0x241B] = { unicodeslot=0x241B, category='so', description='SYMBOL FOR ESCAPE' }, + [0x241C] = { unicodeslot=0x241C, category='so', description='SYMBOL FOR FILE SEPARATOR' }, + [0x241D] = { unicodeslot=0x241D, category='so', description='SYMBOL FOR GROUP SEPARATOR' }, + [0x241E] = { unicodeslot=0x241E, category='so', description='SYMBOL FOR RECORD SEPARATOR' }, + [0x241F] = { unicodeslot=0x241F, category='so', description='SYMBOL FOR UNIT SEPARATOR' }, + [0x2420] = { unicodeslot=0x2420, category='so', description='SYMBOL FOR SPACE' }, + [0x2421] = { unicodeslot=0x2421, category='so', description='SYMBOL FOR DELETE' }, + [0x2422] = { unicodeslot=0x2422, category='so', description='BLANK SYMBOL' }, + [0x2423] = { unicodeslot=0x2423, category='so', description='OPEN BOX' }, + [0x2424] = { unicodeslot=0x2424, category='so', description='SYMBOL FOR NEWLINE' }, + [0x2425] = { unicodeslot=0x2425, category='so', description='SYMBOL FOR DELETE FORM TWO' }, + [0x2426] = { unicodeslot=0x2426, category='so', description='SYMBOL FOR SUBSTITUTE FORM TWO' }, + [0x2440] = { unicodeslot=0x2440, category='so', description='OCR HOOK' }, + [0x2441] = { unicodeslot=0x2441, category='so', description='OCR CHAIR' }, + [0x2442] = { unicodeslot=0x2442, category='so', description='OCR FORK' }, + [0x2443] = { unicodeslot=0x2443, category='so', description='OCR INVERTED FORK' }, + [0x2444] = { unicodeslot=0x2444, category='so', description='OCR BELT BUCKLE' }, + [0x2445] = { unicodeslot=0x2445, category='so', description='OCR BOW TIE' }, + [0x2446] = { unicodeslot=0x2446, category='so', description='OCR BRANCH BANK IDENTIFICATION' }, + [0x2447] = { unicodeslot=0x2447, category='so', description='OCR AMOUNT OF CHECK' }, + [0x2448] = { unicodeslot=0x2448, category='so', description='OCR DASH' }, + [0x2449] = { unicodeslot=0x2449, category='so', description='OCR CUSTOMER ACCOUNT NUMBER' }, + [0x244A] = { unicodeslot=0x244A, category='so', description='OCR DOUBLE BACKSLASH' }, + [0x2460] = { unicodeslot=0x2460, category='no', description='CIRCLED DIGIT ONE', specials={'circle',0x0031} }, + [0x2461] = { unicodeslot=0x2461, category='no', description='CIRCLED DIGIT TWO', specials={'circle',0x0032} }, + [0x2462] = { unicodeslot=0x2462, category='no', description='CIRCLED DIGIT THREE', specials={'circle',0x0033} }, + [0x2463] = { unicodeslot=0x2463, category='no', description='CIRCLED DIGIT FOUR', specials={'circle',0x0034} }, + [0x2464] = { unicodeslot=0x2464, category='no', description='CIRCLED DIGIT FIVE', specials={'circle',0x0035} }, + [0x2465] = { unicodeslot=0x2465, category='no', description='CIRCLED DIGIT SIX', specials={'circle',0x0036} }, + [0x2466] = { unicodeslot=0x2466, category='no', description='CIRCLED DIGIT SEVEN', specials={'circle',0x0037} }, + [0x2467] = { unicodeslot=0x2467, category='no', description='CIRCLED DIGIT EIGHT', specials={'circle',0x0038} }, + [0x2468] = { unicodeslot=0x2468, category='no', description='CIRCLED DIGIT NINE', specials={'circle',0x0039} }, + [0x2469] = { unicodeslot=0x2469, category='no', description='CIRCLED NUMBER TEN', specials={'circle',0x0031,0x0030} }, + [0x246A] = { unicodeslot=0x246A, category='no', description='CIRCLED NUMBER ELEVEN', specials={'circle',0x0031,0x0031} }, + [0x246B] = { unicodeslot=0x246B, category='no', description='CIRCLED NUMBER TWELVE', specials={'circle',0x0031,0x0032} }, + [0x246C] = { unicodeslot=0x246C, category='no', description='CIRCLED NUMBER THIRTEEN', specials={'circle',0x0031,0x0033} }, + [0x246D] = { unicodeslot=0x246D, category='no', description='CIRCLED NUMBER FOURTEEN', specials={'circle',0x0031,0x0034} }, + [0x246E] = { unicodeslot=0x246E, category='no', description='CIRCLED NUMBER FIFTEEN', specials={'circle',0x0031,0x0035} }, + [0x246F] = { unicodeslot=0x246F, category='no', description='CIRCLED NUMBER SIXTEEN', specials={'circle',0x0031,0x0036} }, + [0x2470] = { unicodeslot=0x2470, category='no', description='CIRCLED NUMBER SEVENTEEN', specials={'circle',0x0031,0x0037} }, + [0x2471] = { unicodeslot=0x2471, category='no', description='CIRCLED NUMBER EIGHTEEN', specials={'circle',0x0031,0x0038} }, + [0x2472] = { unicodeslot=0x2472, category='no', description='CIRCLED NUMBER NINETEEN', specials={'circle',0x0031,0x0039} }, + [0x2473] = { unicodeslot=0x2473, category='no', description='CIRCLED NUMBER TWENTY', specials={'circle',0x0032,0x0030} }, + [0x2474] = { unicodeslot=0x2474, category='no', description='PARENTHESIZED DIGIT ONE', specials={'compat',0x0028,0x0031,0x0029} }, + [0x2475] = { unicodeslot=0x2475, category='no', description='PARENTHESIZED DIGIT TWO', specials={'compat',0x0028,0x0032,0x0029} }, + [0x2476] = { unicodeslot=0x2476, category='no', description='PARENTHESIZED DIGIT THREE', specials={'compat',0x0028,0x0033,0x0029} }, + [0x2477] = { unicodeslot=0x2477, category='no', description='PARENTHESIZED DIGIT FOUR', specials={'compat',0x0028,0x0034,0x0029} }, + [0x2478] = { unicodeslot=0x2478, category='no', description='PARENTHESIZED DIGIT FIVE', specials={'compat',0x0028,0x0035,0x0029} }, + [0x2479] = { unicodeslot=0x2479, category='no', description='PARENTHESIZED DIGIT SIX', specials={'compat',0x0028,0x0036,0x0029} }, + [0x247A] = { unicodeslot=0x247A, category='no', description='PARENTHESIZED DIGIT SEVEN', specials={'compat',0x0028,0x0037,0x0029} }, + [0x247B] = { unicodeslot=0x247B, category='no', description='PARENTHESIZED DIGIT EIGHT', specials={'compat',0x0028,0x0038,0x0029} }, + [0x247C] = { unicodeslot=0x247C, category='no', description='PARENTHESIZED DIGIT NINE', specials={'compat',0x0028,0x0039,0x0029} }, + [0x247D] = { unicodeslot=0x247D, category='no', description='PARENTHESIZED NUMBER TEN', specials={'compat',0x0028,0x0031,0x0030,0x0029} }, + [0x247E] = { unicodeslot=0x247E, category='no', description='PARENTHESIZED NUMBER ELEVEN', specials={'compat',0x0028,0x0031,0x0031,0x0029} }, + [0x247F] = { unicodeslot=0x247F, category='no', description='PARENTHESIZED NUMBER TWELVE', specials={'compat',0x0028,0x0031,0x0032,0x0029} }, + [0x2480] = { unicodeslot=0x2480, category='no', description='PARENTHESIZED NUMBER THIRTEEN', specials={'compat',0x0028,0x0031,0x0033,0x0029} }, + [0x2481] = { unicodeslot=0x2481, category='no', description='PARENTHESIZED NUMBER FOURTEEN', specials={'compat',0x0028,0x0031,0x0034,0x0029} }, + [0x2482] = { unicodeslot=0x2482, category='no', description='PARENTHESIZED NUMBER FIFTEEN', specials={'compat',0x0028,0x0031,0x0035,0x0029} }, + [0x2483] = { unicodeslot=0x2483, category='no', description='PARENTHESIZED NUMBER SIXTEEN', specials={'compat',0x0028,0x0031,0x0036,0x0029} }, + [0x2484] = { unicodeslot=0x2484, category='no', description='PARENTHESIZED NUMBER SEVENTEEN', specials={'compat',0x0028,0x0031,0x0037,0x0029} }, + [0x2485] = { unicodeslot=0x2485, category='no', description='PARENTHESIZED NUMBER EIGHTEEN', specials={'compat',0x0028,0x0031,0x0038,0x0029} }, + [0x2486] = { unicodeslot=0x2486, category='no', description='PARENTHESIZED NUMBER NINETEEN', specials={'compat',0x0028,0x0031,0x0039,0x0029} }, + [0x2487] = { unicodeslot=0x2487, category='no', description='PARENTHESIZED NUMBER TWENTY', specials={'compat',0x0028,0x0032,0x0030,0x0029} }, + [0x2488] = { unicodeslot=0x2488, category='no', description='DIGIT ONE FULL STOP', specials={'compat',0x0031,0x002E} }, + [0x2489] = { unicodeslot=0x2489, category='no', description='DIGIT TWO FULL STOP', specials={'compat',0x0032,0x002E} }, + [0x248A] = { unicodeslot=0x248A, category='no', description='DIGIT THREE FULL STOP', specials={'compat',0x0033,0x002E} }, + [0x248B] = { unicodeslot=0x248B, category='no', description='DIGIT FOUR FULL STOP', specials={'compat',0x0034,0x002E} }, + [0x248C] = { unicodeslot=0x248C, category='no', description='DIGIT FIVE FULL STOP', specials={'compat',0x0035,0x002E} }, + [0x248D] = { unicodeslot=0x248D, category='no', description='DIGIT SIX FULL STOP', specials={'compat',0x0036,0x002E} }, + [0x248E] = { unicodeslot=0x248E, category='no', description='DIGIT SEVEN FULL STOP', specials={'compat',0x0037,0x002E} }, + [0x248F] = { unicodeslot=0x248F, category='no', description='DIGIT EIGHT FULL STOP', specials={'compat',0x0038,0x002E} }, + [0x2490] = { unicodeslot=0x2490, category='no', description='DIGIT NINE FULL STOP', specials={'compat',0x0039,0x002E} }, + [0x2491] = { unicodeslot=0x2491, category='no', description='NUMBER TEN FULL STOP', specials={'compat',0x0031,0x0030,0x002E} }, + [0x2492] = { unicodeslot=0x2492, category='no', description='NUMBER ELEVEN FULL STOP', specials={'compat',0x0031,0x0031,0x002E} }, + [0x2493] = { unicodeslot=0x2493, category='no', description='NUMBER TWELVE FULL STOP', specials={'compat',0x0031,0x0032,0x002E} }, + [0x2494] = { unicodeslot=0x2494, category='no', description='NUMBER THIRTEEN FULL STOP', specials={'compat',0x0031,0x0033,0x002E} }, + [0x2495] = { unicodeslot=0x2495, category='no', description='NUMBER FOURTEEN FULL STOP', specials={'compat',0x0031,0x0034,0x002E} }, + [0x2496] = { unicodeslot=0x2496, category='no', description='NUMBER FIFTEEN FULL STOP', specials={'compat',0x0031,0x0035,0x002E} }, + [0x2497] = { unicodeslot=0x2497, category='no', description='NUMBER SIXTEEN FULL STOP', specials={'compat',0x0031,0x0036,0x002E} }, + [0x2498] = { unicodeslot=0x2498, category='no', description='NUMBER SEVENTEEN FULL STOP', specials={'compat',0x0031,0x0037,0x002E} }, + [0x2499] = { unicodeslot=0x2499, category='no', description='NUMBER EIGHTEEN FULL STOP', specials={'compat',0x0031,0x0038,0x002E} }, + [0x249A] = { unicodeslot=0x249A, category='no', description='NUMBER NINETEEN FULL STOP', specials={'compat',0x0031,0x0039,0x002E} }, + [0x249B] = { unicodeslot=0x249B, category='no', description='NUMBER TWENTY FULL STOP', specials={'compat',0x0032,0x0030,0x002E} }, + [0x249C] = { unicodeslot=0x249C, category='so', description='PARENTHESIZED LATIN SMALL LETTER A', specials={'compat',0x0028,0x0061,0x0029} }, + [0x249D] = { unicodeslot=0x249D, category='so', description='PARENTHESIZED LATIN SMALL LETTER B', specials={'compat',0x0028,0x0062,0x0029} }, + [0x249E] = { unicodeslot=0x249E, category='so', description='PARENTHESIZED LATIN SMALL LETTER C', specials={'compat',0x0028,0x0063,0x0029} }, + [0x249F] = { unicodeslot=0x249F, category='so', description='PARENTHESIZED LATIN SMALL LETTER D', specials={'compat',0x0028,0x0064,0x0029} }, + [0x24A0] = { unicodeslot=0x24A0, category='so', description='PARENTHESIZED LATIN SMALL LETTER E', specials={'compat',0x0028,0x0065,0x0029} }, + [0x24A1] = { unicodeslot=0x24A1, category='so', description='PARENTHESIZED LATIN SMALL LETTER F', specials={'compat',0x0028,0x0066,0x0029} }, + [0x24A2] = { unicodeslot=0x24A2, category='so', description='PARENTHESIZED LATIN SMALL LETTER G', specials={'compat',0x0028,0x0067,0x0029} }, + [0x24A3] = { unicodeslot=0x24A3, category='so', description='PARENTHESIZED LATIN SMALL LETTER H', specials={'compat',0x0028,0x0068,0x0029} }, + [0x24A4] = { unicodeslot=0x24A4, category='so', description='PARENTHESIZED LATIN SMALL LETTER I', specials={'compat',0x0028,0x0069,0x0029} }, + [0x24A5] = { unicodeslot=0x24A5, category='so', description='PARENTHESIZED LATIN SMALL LETTER J', specials={'compat',0x0028,0x006A,0x0029} }, + [0x24A6] = { unicodeslot=0x24A6, category='so', description='PARENTHESIZED LATIN SMALL LETTER K', specials={'compat',0x0028,0x006B,0x0029} }, + [0x24A7] = { unicodeslot=0x24A7, category='so', description='PARENTHESIZED LATIN SMALL LETTER L', specials={'compat',0x0028,0x006C,0x0029} }, + [0x24A8] = { unicodeslot=0x24A8, category='so', description='PARENTHESIZED LATIN SMALL LETTER M', specials={'compat',0x0028,0x006D,0x0029} }, + [0x24A9] = { unicodeslot=0x24A9, category='so', description='PARENTHESIZED LATIN SMALL LETTER N', specials={'compat',0x0028,0x006E,0x0029} }, + [0x24AA] = { unicodeslot=0x24AA, category='so', description='PARENTHESIZED LATIN SMALL LETTER O', specials={'compat',0x0028,0x006F,0x0029} }, + [0x24AB] = { unicodeslot=0x24AB, category='so', description='PARENTHESIZED LATIN SMALL LETTER P', specials={'compat',0x0028,0x0070,0x0029} }, + [0x24AC] = { unicodeslot=0x24AC, category='so', description='PARENTHESIZED LATIN SMALL LETTER Q', specials={'compat',0x0028,0x0071,0x0029} }, + [0x24AD] = { unicodeslot=0x24AD, category='so', description='PARENTHESIZED LATIN SMALL LETTER R', specials={'compat',0x0028,0x0072,0x0029} }, + [0x24AE] = { unicodeslot=0x24AE, category='so', description='PARENTHESIZED LATIN SMALL LETTER S', specials={'compat',0x0028,0x0073,0x0029} }, + [0x24AF] = { unicodeslot=0x24AF, category='so', description='PARENTHESIZED LATIN SMALL LETTER T', specials={'compat',0x0028,0x0074,0x0029} }, + [0x24B0] = { unicodeslot=0x24B0, category='so', description='PARENTHESIZED LATIN SMALL LETTER U', specials={'compat',0x0028,0x0075,0x0029} }, + [0x24B1] = { unicodeslot=0x24B1, category='so', description='PARENTHESIZED LATIN SMALL LETTER V', specials={'compat',0x0028,0x0076,0x0029} }, + [0x24B2] = { unicodeslot=0x24B2, category='so', description='PARENTHESIZED LATIN SMALL LETTER W', specials={'compat',0x0028,0x0077,0x0029} }, + [0x24B3] = { unicodeslot=0x24B3, category='so', description='PARENTHESIZED LATIN SMALL LETTER X', specials={'compat',0x0028,0x0078,0x0029} }, + [0x24B4] = { unicodeslot=0x24B4, category='so', description='PARENTHESIZED LATIN SMALL LETTER Y', specials={'compat',0x0028,0x0079,0x0029} }, + [0x24B5] = { unicodeslot=0x24B5, category='so', description='PARENTHESIZED LATIN SMALL LETTER Z', specials={'compat',0x0028,0x007A,0x0029} }, + [0x24B6] = { unicodeslot=0x24B6, category='so', description='CIRCLED LATIN CAPITAL LETTER A', lccode=0x24D0, specials={'circle',0x0041} }, + [0x24B7] = { unicodeslot=0x24B7, category='so', description='CIRCLED LATIN CAPITAL LETTER B', lccode=0x24D1, specials={'circle',0x0042} }, + [0x24B8] = { unicodeslot=0x24B8, category='so', description='CIRCLED LATIN CAPITAL LETTER C', lccode=0x24D2, specials={'circle',0x0043} }, + [0x24B9] = { unicodeslot=0x24B9, category='so', description='CIRCLED LATIN CAPITAL LETTER D', lccode=0x24D3, specials={'circle',0x0044} }, + [0x24BA] = { unicodeslot=0x24BA, category='so', description='CIRCLED LATIN CAPITAL LETTER E', lccode=0x24D4, specials={'circle',0x0045} }, + [0x24BB] = { unicodeslot=0x24BB, category='so', description='CIRCLED LATIN CAPITAL LETTER F', lccode=0x24D5, specials={'circle',0x0046} }, + [0x24BC] = { unicodeslot=0x24BC, category='so', description='CIRCLED LATIN CAPITAL LETTER G', lccode=0x24D6, specials={'circle',0x0047} }, + [0x24BD] = { unicodeslot=0x24BD, category='so', description='CIRCLED LATIN CAPITAL LETTER H', lccode=0x24D7, specials={'circle',0x0048} }, + [0x24BE] = { unicodeslot=0x24BE, category='so', description='CIRCLED LATIN CAPITAL LETTER I', lccode=0x24D8, specials={'circle',0x0049} }, + [0x24BF] = { unicodeslot=0x24BF, category='so', description='CIRCLED LATIN CAPITAL LETTER J', lccode=0x24D9, specials={'circle',0x004A} }, + [0x24C0] = { unicodeslot=0x24C0, category='so', description='CIRCLED LATIN CAPITAL LETTER K', lccode=0x24DA, specials={'circle',0x004B} }, + [0x24C1] = { unicodeslot=0x24C1, category='so', description='CIRCLED LATIN CAPITAL LETTER L', lccode=0x24DB, specials={'circle',0x004C} }, + [0x24C2] = { unicodeslot=0x24C2, category='so', description='CIRCLED LATIN CAPITAL LETTER M', lccode=0x24DC, specials={'circle',0x004D} }, + [0x24C3] = { unicodeslot=0x24C3, category='so', description='CIRCLED LATIN CAPITAL LETTER N', lccode=0x24DD, specials={'circle',0x004E} }, + [0x24C4] = { unicodeslot=0x24C4, category='so', description='CIRCLED LATIN CAPITAL LETTER O', lccode=0x24DE, specials={'circle',0x004F} }, + [0x24C5] = { unicodeslot=0x24C5, category='so', description='CIRCLED LATIN CAPITAL LETTER P', lccode=0x24DF, specials={'circle',0x0050} }, + [0x24C6] = { unicodeslot=0x24C6, category='so', description='CIRCLED LATIN CAPITAL LETTER Q', lccode=0x24E0, specials={'circle',0x0051} }, + [0x24C7] = { unicodeslot=0x24C7, category='so', description='CIRCLED LATIN CAPITAL LETTER R', lccode=0x24E1, specials={'circle',0x0052} }, + [0x24C8] = { unicodeslot=0x24C8, category='so', description='CIRCLED LATIN CAPITAL LETTER S', lccode=0x24E2, specials={'circle',0x0053} }, + [0x24C9] = { unicodeslot=0x24C9, category='so', description='CIRCLED LATIN CAPITAL LETTER T', lccode=0x24E3, specials={'circle',0x0054} }, + [0x24CA] = { unicodeslot=0x24CA, category='so', description='CIRCLED LATIN CAPITAL LETTER U', lccode=0x24E4, specials={'circle',0x0055} }, + [0x24CB] = { unicodeslot=0x24CB, category='so', description='CIRCLED LATIN CAPITAL LETTER V', lccode=0x24E5, specials={'circle',0x0056} }, + [0x24CC] = { unicodeslot=0x24CC, category='so', description='CIRCLED LATIN CAPITAL LETTER W', lccode=0x24E6, specials={'circle',0x0057} }, + [0x24CD] = { unicodeslot=0x24CD, category='so', description='CIRCLED LATIN CAPITAL LETTER X', lccode=0x24E7, specials={'circle',0x0058} }, + [0x24CE] = { unicodeslot=0x24CE, category='so', description='CIRCLED LATIN CAPITAL LETTER Y', lccode=0x24E8, specials={'circle',0x0059} }, + [0x24CF] = { unicodeslot=0x24CF, category='so', description='CIRCLED LATIN CAPITAL LETTER Z', lccode=0x24E9, specials={'circle',0x005A} }, + [0x24D0] = { unicodeslot=0x24D0, category='so', description='CIRCLED LATIN SMALL LETTER A', uccode=0x24B6, specials={'circle',0x0061} }, + [0x24D1] = { unicodeslot=0x24D1, category='so', description='CIRCLED LATIN SMALL LETTER B', uccode=0x24B7, specials={'circle',0x0062} }, + [0x24D2] = { unicodeslot=0x24D2, category='so', description='CIRCLED LATIN SMALL LETTER C', uccode=0x24B8, specials={'circle',0x0063} }, + [0x24D3] = { unicodeslot=0x24D3, category='so', description='CIRCLED LATIN SMALL LETTER D', uccode=0x24B9, specials={'circle',0x0064} }, + [0x24D4] = { unicodeslot=0x24D4, category='so', description='CIRCLED LATIN SMALL LETTER E', uccode=0x24BA, specials={'circle',0x0065} }, + [0x24D5] = { unicodeslot=0x24D5, category='so', description='CIRCLED LATIN SMALL LETTER F', uccode=0x24BB, specials={'circle',0x0066} }, + [0x24D6] = { unicodeslot=0x24D6, category='so', description='CIRCLED LATIN SMALL LETTER G', uccode=0x24BC, specials={'circle',0x0067} }, + [0x24D7] = { unicodeslot=0x24D7, category='so', description='CIRCLED LATIN SMALL LETTER H', uccode=0x24BD, specials={'circle',0x0068} }, + [0x24D8] = { unicodeslot=0x24D8, category='so', description='CIRCLED LATIN SMALL LETTER I', uccode=0x24BE, specials={'circle',0x0069} }, + [0x24D9] = { unicodeslot=0x24D9, category='so', description='CIRCLED LATIN SMALL LETTER J', uccode=0x24BF, specials={'circle',0x006A} }, + [0x24DA] = { unicodeslot=0x24DA, category='so', description='CIRCLED LATIN SMALL LETTER K', uccode=0x24C0, specials={'circle',0x006B} }, + [0x24DB] = { unicodeslot=0x24DB, category='so', description='CIRCLED LATIN SMALL LETTER L', uccode=0x24C1, specials={'circle',0x006C} }, + [0x24DC] = { unicodeslot=0x24DC, category='so', description='CIRCLED LATIN SMALL LETTER M', uccode=0x24C2, specials={'circle',0x006D} }, + [0x24DD] = { unicodeslot=0x24DD, category='so', description='CIRCLED LATIN SMALL LETTER N', uccode=0x24C3, specials={'circle',0x006E} }, + [0x24DE] = { unicodeslot=0x24DE, category='so', description='CIRCLED LATIN SMALL LETTER O', uccode=0x24C4, specials={'circle',0x006F} }, + [0x24DF] = { unicodeslot=0x24DF, category='so', description='CIRCLED LATIN SMALL LETTER P', uccode=0x24C5, specials={'circle',0x0070} }, + [0x24E0] = { unicodeslot=0x24E0, category='so', description='CIRCLED LATIN SMALL LETTER Q', uccode=0x24C6, specials={'circle',0x0071} }, + [0x24E1] = { unicodeslot=0x24E1, category='so', description='CIRCLED LATIN SMALL LETTER R', uccode=0x24C7, specials={'circle',0x0072} }, + [0x24E2] = { unicodeslot=0x24E2, category='so', description='CIRCLED LATIN SMALL LETTER S', uccode=0x24C8, specials={'circle',0x0073} }, + [0x24E3] = { unicodeslot=0x24E3, category='so', description='CIRCLED LATIN SMALL LETTER T', uccode=0x24C9, specials={'circle',0x0074} }, + [0x24E4] = { unicodeslot=0x24E4, category='so', description='CIRCLED LATIN SMALL LETTER U', uccode=0x24CA, specials={'circle',0x0075} }, + [0x24E5] = { unicodeslot=0x24E5, category='so', description='CIRCLED LATIN SMALL LETTER V', uccode=0x24CB, specials={'circle',0x0076} }, + [0x24E6] = { unicodeslot=0x24E6, category='so', description='CIRCLED LATIN SMALL LETTER W', uccode=0x24CC, specials={'circle',0x0077} }, + [0x24E7] = { unicodeslot=0x24E7, category='so', description='CIRCLED LATIN SMALL LETTER X', uccode=0x24CD, specials={'circle',0x0078} }, + [0x24E8] = { unicodeslot=0x24E8, category='so', description='CIRCLED LATIN SMALL LETTER Y', uccode=0x24CE, specials={'circle',0x0079} }, + [0x24E9] = { unicodeslot=0x24E9, category='so', description='CIRCLED LATIN SMALL LETTER Z', uccode=0x24CF, specials={'circle',0x007A} }, + [0x24EA] = { unicodeslot=0x24EA, category='no', description='CIRCLED DIGIT ZERO', specials={'circle',0x0030} }, + [0x24EB] = { unicodeslot=0x24EB, category='no', description='NEGATIVE CIRCLED NUMBER ELEVEN' }, + [0x24EC] = { unicodeslot=0x24EC, category='no', description='NEGATIVE CIRCLED NUMBER TWELVE' }, + [0x24ED] = { unicodeslot=0x24ED, category='no', description='NEGATIVE CIRCLED NUMBER THIRTEEN' }, + [0x24EE] = { unicodeslot=0x24EE, category='no', description='NEGATIVE CIRCLED NUMBER FOURTEEN' }, + [0x24EF] = { unicodeslot=0x24EF, category='no', description='NEGATIVE CIRCLED NUMBER FIFTEEN' }, + [0x24F0] = { unicodeslot=0x24F0, category='no', description='NEGATIVE CIRCLED NUMBER SIXTEEN' }, + [0x24F1] = { unicodeslot=0x24F1, category='no', description='NEGATIVE CIRCLED NUMBER SEVENTEEN' }, + [0x24F2] = { unicodeslot=0x24F2, category='no', description='NEGATIVE CIRCLED NUMBER EIGHTEEN' }, + [0x24F3] = { unicodeslot=0x24F3, category='no', description='NEGATIVE CIRCLED NUMBER NINETEEN' }, + [0x24F4] = { unicodeslot=0x24F4, category='no', description='NEGATIVE CIRCLED NUMBER TWENTY' }, + [0x24F5] = { unicodeslot=0x24F5, category='no', description='DOUBLE CIRCLED DIGIT ONE' }, + [0x24F6] = { unicodeslot=0x24F6, category='no', description='DOUBLE CIRCLED DIGIT TWO' }, + [0x24F7] = { unicodeslot=0x24F7, category='no', description='DOUBLE CIRCLED DIGIT THREE' }, + [0x24F8] = { unicodeslot=0x24F8, category='no', description='DOUBLE CIRCLED DIGIT FOUR' }, + [0x24F9] = { unicodeslot=0x24F9, category='no', description='DOUBLE CIRCLED DIGIT FIVE' }, + [0x24FA] = { unicodeslot=0x24FA, category='no', description='DOUBLE CIRCLED DIGIT SIX' }, + [0x24FB] = { unicodeslot=0x24FB, category='no', description='DOUBLE CIRCLED DIGIT SEVEN' }, + [0x24FC] = { unicodeslot=0x24FC, category='no', description='DOUBLE CIRCLED DIGIT EIGHT' }, + [0x24FD] = { unicodeslot=0x24FD, category='no', description='DOUBLE CIRCLED DIGIT NINE' }, + [0x24FE] = { unicodeslot=0x24FE, category='no', description='DOUBLE CIRCLED NUMBER TEN' }, + [0x24FF] = { unicodeslot=0x24FF, category='no', description='NEGATIVE CIRCLED DIGIT ZERO' }, + [0x2500] = { unicodeslot=0x2500, category='so', adobename='SF100000', description='BOX DRAWINGS LIGHT HORIZONTAL' }, + [0x2501] = { unicodeslot=0x2501, category='so', description='BOX DRAWINGS HEAVY HORIZONTAL' }, + [0x2502] = { unicodeslot=0x2502, category='so', adobename='SF110000', description='BOX DRAWINGS LIGHT VERTICAL' }, + [0x2503] = { unicodeslot=0x2503, category='so', description='BOX DRAWINGS HEAVY VERTICAL' }, + [0x2504] = { unicodeslot=0x2504, category='so', description='BOX DRAWINGS LIGHT TRIPLE DASH HORIZONTAL' }, + [0x2505] = { unicodeslot=0x2505, category='so', description='BOX DRAWINGS HEAVY TRIPLE DASH HORIZONTAL' }, + [0x2506] = { unicodeslot=0x2506, category='so', description='BOX DRAWINGS LIGHT TRIPLE DASH VERTICAL' }, + [0x2507] = { unicodeslot=0x2507, category='so', description='BOX DRAWINGS HEAVY TRIPLE DASH VERTICAL' }, + [0x2508] = { unicodeslot=0x2508, category='so', description='BOX DRAWINGS LIGHT QUADRUPLE DASH HORIZONTAL' }, + [0x2509] = { unicodeslot=0x2509, category='so', description='BOX DRAWINGS HEAVY QUADRUPLE DASH HORIZONTAL' }, + [0x250A] = { unicodeslot=0x250A, category='so', description='BOX DRAWINGS LIGHT QUADRUPLE DASH VERTICAL' }, + [0x250B] = { unicodeslot=0x250B, category='so', description='BOX DRAWINGS HEAVY QUADRUPLE DASH VERTICAL' }, + [0x250C] = { unicodeslot=0x250C, category='so', adobename='SF010000', description='BOX DRAWINGS LIGHT DOWN AND RIGHT' }, + [0x250D] = { unicodeslot=0x250D, category='so', description='BOX DRAWINGS DOWN LIGHT AND RIGHT HEAVY' }, + [0x250E] = { unicodeslot=0x250E, category='so', description='BOX DRAWINGS DOWN HEAVY AND RIGHT LIGHT' }, + [0x250F] = { unicodeslot=0x250F, category='so', description='BOX DRAWINGS HEAVY DOWN AND RIGHT' }, + [0x2510] = { unicodeslot=0x2510, category='so', adobename='SF030000', description='BOX DRAWINGS LIGHT DOWN AND LEFT' }, + [0x2511] = { unicodeslot=0x2511, category='so', description='BOX DRAWINGS DOWN LIGHT AND LEFT HEAVY' }, + [0x2512] = { unicodeslot=0x2512, category='so', description='BOX DRAWINGS DOWN HEAVY AND LEFT LIGHT' }, + [0x2513] = { unicodeslot=0x2513, category='so', description='BOX DRAWINGS HEAVY DOWN AND LEFT' }, + [0x2514] = { unicodeslot=0x2514, category='so', adobename='SF020000', description='BOX DRAWINGS LIGHT UP AND RIGHT' }, + [0x2515] = { unicodeslot=0x2515, category='so', description='BOX DRAWINGS UP LIGHT AND RIGHT HEAVY' }, + [0x2516] = { unicodeslot=0x2516, category='so', description='BOX DRAWINGS UP HEAVY AND RIGHT LIGHT' }, + [0x2517] = { unicodeslot=0x2517, category='so', description='BOX DRAWINGS HEAVY UP AND RIGHT' }, + [0x2518] = { unicodeslot=0x2518, category='so', adobename='SF040000', description='BOX DRAWINGS LIGHT UP AND LEFT' }, + [0x2519] = { unicodeslot=0x2519, category='so', description='BOX DRAWINGS UP LIGHT AND LEFT HEAVY' }, + [0x251A] = { unicodeslot=0x251A, category='so', description='BOX DRAWINGS UP HEAVY AND LEFT LIGHT' }, + [0x251B] = { unicodeslot=0x251B, category='so', description='BOX DRAWINGS HEAVY UP AND LEFT' }, + [0x251C] = { unicodeslot=0x251C, category='so', adobename='SF080000', description='BOX DRAWINGS LIGHT VERTICAL AND RIGHT' }, + [0x251D] = { unicodeslot=0x251D, category='so', description='BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY' }, + [0x251E] = { unicodeslot=0x251E, category='so', description='BOX DRAWINGS UP HEAVY AND RIGHT DOWN LIGHT' }, + [0x251F] = { unicodeslot=0x251F, category='so', description='BOX DRAWINGS DOWN HEAVY AND RIGHT UP LIGHT' }, + [0x2520] = { unicodeslot=0x2520, category='so', description='BOX DRAWINGS VERTICAL HEAVY AND RIGHT LIGHT' }, + [0x2521] = { unicodeslot=0x2521, category='so', description='BOX DRAWINGS DOWN LIGHT AND RIGHT UP HEAVY' }, + [0x2522] = { unicodeslot=0x2522, category='so', description='BOX DRAWINGS UP LIGHT AND RIGHT DOWN HEAVY' }, + [0x2523] = { unicodeslot=0x2523, category='so', description='BOX DRAWINGS HEAVY VERTICAL AND RIGHT' }, + [0x2524] = { unicodeslot=0x2524, category='so', adobename='SF090000', description='BOX DRAWINGS LIGHT VERTICAL AND LEFT' }, + [0x2525] = { unicodeslot=0x2525, category='so', description='BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY' }, + [0x2526] = { unicodeslot=0x2526, category='so', description='BOX DRAWINGS UP HEAVY AND LEFT DOWN LIGHT' }, + [0x2527] = { unicodeslot=0x2527, category='so', description='BOX DRAWINGS DOWN HEAVY AND LEFT UP LIGHT' }, + [0x2528] = { unicodeslot=0x2528, category='so', description='BOX DRAWINGS VERTICAL HEAVY AND LEFT LIGHT' }, + [0x2529] = { unicodeslot=0x2529, category='so', description='BOX DRAWINGS DOWN LIGHT AND LEFT UP HEAVY' }, + [0x252A] = { unicodeslot=0x252A, category='so', description='BOX DRAWINGS UP LIGHT AND LEFT DOWN HEAVY' }, + [0x252B] = { unicodeslot=0x252B, category='so', description='BOX DRAWINGS HEAVY VERTICAL AND LEFT' }, + [0x252C] = { unicodeslot=0x252C, category='so', adobename='SF060000', description='BOX DRAWINGS LIGHT DOWN AND HORIZONTAL' }, + [0x252D] = { unicodeslot=0x252D, category='so', description='BOX DRAWINGS LEFT HEAVY AND RIGHT DOWN LIGHT' }, + [0x252E] = { unicodeslot=0x252E, category='so', description='BOX DRAWINGS RIGHT HEAVY AND LEFT DOWN LIGHT' }, + [0x252F] = { unicodeslot=0x252F, category='so', description='BOX DRAWINGS DOWN LIGHT AND HORIZONTAL HEAVY' }, + [0x2530] = { unicodeslot=0x2530, category='so', description='BOX DRAWINGS DOWN HEAVY AND HORIZONTAL LIGHT' }, + [0x2531] = { unicodeslot=0x2531, category='so', description='BOX DRAWINGS RIGHT LIGHT AND LEFT DOWN HEAVY' }, + [0x2532] = { unicodeslot=0x2532, category='so', description='BOX DRAWINGS LEFT LIGHT AND RIGHT DOWN HEAVY' }, + [0x2533] = { unicodeslot=0x2533, category='so', description='BOX DRAWINGS HEAVY DOWN AND HORIZONTAL' }, + [0x2534] = { unicodeslot=0x2534, category='so', adobename='SF070000', description='BOX DRAWINGS LIGHT UP AND HORIZONTAL' }, + [0x2535] = { unicodeslot=0x2535, category='so', description='BOX DRAWINGS LEFT HEAVY AND RIGHT UP LIGHT' }, + [0x2536] = { unicodeslot=0x2536, category='so', description='BOX DRAWINGS RIGHT HEAVY AND LEFT UP LIGHT' }, + [0x2537] = { unicodeslot=0x2537, category='so', description='BOX DRAWINGS UP LIGHT AND HORIZONTAL HEAVY' }, + [0x2538] = { unicodeslot=0x2538, category='so', description='BOX DRAWINGS UP HEAVY AND HORIZONTAL LIGHT' }, + [0x2539] = { unicodeslot=0x2539, category='so', description='BOX DRAWINGS RIGHT LIGHT AND LEFT UP HEAVY' }, + [0x253A] = { unicodeslot=0x253A, category='so', description='BOX DRAWINGS LEFT LIGHT AND RIGHT UP HEAVY' }, + [0x253B] = { unicodeslot=0x253B, category='so', description='BOX DRAWINGS HEAVY UP AND HORIZONTAL' }, + [0x253C] = { unicodeslot=0x253C, category='so', adobename='SF050000', description='BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL' }, + [0x253D] = { unicodeslot=0x253D, category='so', description='BOX DRAWINGS LEFT HEAVY AND RIGHT VERTICAL LIGHT' }, + [0x253E] = { unicodeslot=0x253E, category='so', description='BOX DRAWINGS RIGHT HEAVY AND LEFT VERTICAL LIGHT' }, + [0x253F] = { unicodeslot=0x253F, category='so', description='BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY' }, + [0x2540] = { unicodeslot=0x2540, category='so', description='BOX DRAWINGS UP HEAVY AND DOWN HORIZONTAL LIGHT' }, + [0x2541] = { unicodeslot=0x2541, category='so', description='BOX DRAWINGS DOWN HEAVY AND UP HORIZONTAL LIGHT' }, + [0x2542] = { unicodeslot=0x2542, category='so', description='BOX DRAWINGS VERTICAL HEAVY AND HORIZONTAL LIGHT' }, + [0x2543] = { unicodeslot=0x2543, category='so', description='BOX DRAWINGS LEFT UP HEAVY AND RIGHT DOWN LIGHT' }, + [0x2544] = { unicodeslot=0x2544, category='so', description='BOX DRAWINGS RIGHT UP HEAVY AND LEFT DOWN LIGHT' }, + [0x2545] = { unicodeslot=0x2545, category='so', description='BOX DRAWINGS LEFT DOWN HEAVY AND RIGHT UP LIGHT' }, + [0x2546] = { unicodeslot=0x2546, category='so', description='BOX DRAWINGS RIGHT DOWN HEAVY AND LEFT UP LIGHT' }, + [0x2547] = { unicodeslot=0x2547, category='so', description='BOX DRAWINGS DOWN LIGHT AND UP HORIZONTAL HEAVY' }, + [0x2548] = { unicodeslot=0x2548, category='so', description='BOX DRAWINGS UP LIGHT AND DOWN HORIZONTAL HEAVY' }, + [0x2549] = { unicodeslot=0x2549, category='so', description='BOX DRAWINGS RIGHT LIGHT AND LEFT VERTICAL HEAVY' }, + [0x254A] = { unicodeslot=0x254A, category='so', description='BOX DRAWINGS LEFT LIGHT AND RIGHT VERTICAL HEAVY' }, + [0x254B] = { unicodeslot=0x254B, category='so', description='BOX DRAWINGS HEAVY VERTICAL AND HORIZONTAL' }, + [0x254C] = { unicodeslot=0x254C, category='so', description='BOX DRAWINGS LIGHT DOUBLE DASH HORIZONTAL' }, + [0x254D] = { unicodeslot=0x254D, category='so', description='BOX DRAWINGS HEAVY DOUBLE DASH HORIZONTAL' }, + [0x254E] = { unicodeslot=0x254E, category='so', description='BOX DRAWINGS LIGHT DOUBLE DASH VERTICAL' }, + [0x254F] = { unicodeslot=0x254F, category='so', description='BOX DRAWINGS HEAVY DOUBLE DASH VERTICAL' }, + [0x2550] = { unicodeslot=0x2550, category='so', adobename='SF430000', description='BOX DRAWINGS DOUBLE HORIZONTAL' }, + [0x2551] = { unicodeslot=0x2551, category='so', adobename='SF240000', description='BOX DRAWINGS DOUBLE VERTICAL' }, + [0x2552] = { unicodeslot=0x2552, category='so', adobename='SF510000', description='BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE' }, + [0x2553] = { unicodeslot=0x2553, category='so', adobename='SF520000', description='BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE' }, + [0x2554] = { unicodeslot=0x2554, category='so', adobename='SF390000', description='BOX DRAWINGS DOUBLE DOWN AND RIGHT' }, + [0x2555] = { unicodeslot=0x2555, category='so', adobename='SF220000', description='BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE' }, + [0x2556] = { unicodeslot=0x2556, category='so', adobename='SF210000', description='BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE' }, + [0x2557] = { unicodeslot=0x2557, category='so', adobename='SF250000', description='BOX DRAWINGS DOUBLE DOWN AND LEFT' }, + [0x2558] = { unicodeslot=0x2558, category='so', adobename='SF500000', description='BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE' }, + [0x2559] = { unicodeslot=0x2559, category='so', adobename='SF490000', description='BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE' }, + [0x255A] = { unicodeslot=0x255A, category='so', adobename='SF380000', description='BOX DRAWINGS DOUBLE UP AND RIGHT' }, + [0x255B] = { unicodeslot=0x255B, category='so', adobename='SF280000', description='BOX DRAWINGS UP SINGLE AND LEFT DOUBLE' }, + [0x255C] = { unicodeslot=0x255C, category='so', adobename='SF270000', description='BOX DRAWINGS UP DOUBLE AND LEFT SINGLE' }, + [0x255D] = { unicodeslot=0x255D, category='so', adobename='SF260000', description='BOX DRAWINGS DOUBLE UP AND LEFT' }, + [0x255E] = { unicodeslot=0x255E, category='so', adobename='SF360000', description='BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE' }, + [0x255F] = { unicodeslot=0x255F, category='so', adobename='SF370000', description='BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE' }, + [0x2560] = { unicodeslot=0x2560, category='so', adobename='SF420000', description='BOX DRAWINGS DOUBLE VERTICAL AND RIGHT' }, + [0x2561] = { unicodeslot=0x2561, category='so', adobename='SF190000', description='BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE' }, + [0x2562] = { unicodeslot=0x2562, category='so', adobename='SF200000', description='BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE' }, + [0x2563] = { unicodeslot=0x2563, category='so', adobename='SF230000', description='BOX DRAWINGS DOUBLE VERTICAL AND LEFT' }, + [0x2564] = { unicodeslot=0x2564, category='so', adobename='SF470000', description='BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE' }, + [0x2565] = { unicodeslot=0x2565, category='so', adobename='SF480000', description='BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE' }, + [0x2566] = { unicodeslot=0x2566, category='so', adobename='SF410000', description='BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL' }, + [0x2567] = { unicodeslot=0x2567, category='so', adobename='SF450000', description='BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE' }, + [0x2568] = { unicodeslot=0x2568, category='so', adobename='SF460000', description='BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE' }, + [0x2569] = { unicodeslot=0x2569, category='so', adobename='SF400000', description='BOX DRAWINGS DOUBLE UP AND HORIZONTAL' }, + [0x256A] = { unicodeslot=0x256A, category='so', adobename='SF540000', description='BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE' }, + [0x256B] = { unicodeslot=0x256B, category='so', adobename='SF530000', description='BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE' }, + [0x256C] = { unicodeslot=0x256C, category='so', adobename='SF440000', description='BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL' }, + [0x256D] = { unicodeslot=0x256D, category='so', description='BOX DRAWINGS LIGHT ARC DOWN AND RIGHT' }, + [0x256E] = { unicodeslot=0x256E, category='so', description='BOX DRAWINGS LIGHT ARC DOWN AND LEFT' }, + [0x256F] = { unicodeslot=0x256F, category='so', description='BOX DRAWINGS LIGHT ARC UP AND LEFT' }, + [0x2570] = { unicodeslot=0x2570, category='so', description='BOX DRAWINGS LIGHT ARC UP AND RIGHT' }, + [0x2571] = { unicodeslot=0x2571, category='so', description='BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT' }, + [0x2572] = { unicodeslot=0x2572, category='so', description='BOX DRAWINGS LIGHT DIAGONAL UPPER LEFT TO LOWER RIGHT' }, + [0x2573] = { unicodeslot=0x2573, category='so', description='BOX DRAWINGS LIGHT DIAGONAL CROSS' }, + [0x2574] = { unicodeslot=0x2574, category='so', description='BOX DRAWINGS LIGHT LEFT' }, + [0x2575] = { unicodeslot=0x2575, category='so', description='BOX DRAWINGS LIGHT UP' }, + [0x2576] = { unicodeslot=0x2576, category='so', description='BOX DRAWINGS LIGHT RIGHT' }, + [0x2577] = { unicodeslot=0x2577, category='so', description='BOX DRAWINGS LIGHT DOWN' }, + [0x2578] = { unicodeslot=0x2578, category='so', description='BOX DRAWINGS HEAVY LEFT' }, + [0x2579] = { unicodeslot=0x2579, category='so', description='BOX DRAWINGS HEAVY UP' }, + [0x257A] = { unicodeslot=0x257A, category='so', description='BOX DRAWINGS HEAVY RIGHT' }, + [0x257B] = { unicodeslot=0x257B, category='so', description='BOX DRAWINGS HEAVY DOWN' }, + [0x257C] = { unicodeslot=0x257C, category='so', description='BOX DRAWINGS LIGHT LEFT AND HEAVY RIGHT' }, + [0x257D] = { unicodeslot=0x257D, category='so', description='BOX DRAWINGS LIGHT UP AND HEAVY DOWN' }, + [0x257E] = { unicodeslot=0x257E, category='so', description='BOX DRAWINGS HEAVY LEFT AND LIGHT RIGHT' }, + [0x257F] = { unicodeslot=0x257F, category='so', description='BOX DRAWINGS HEAVY UP AND LIGHT DOWN' }, + [0x2580] = { unicodeslot=0x2580, category='so', adobename='upblock', description='UPPER HALF BLOCK' }, + [0x2581] = { unicodeslot=0x2581, category='so', description='LOWER ONE EIGHTH BLOCK' }, + [0x2582] = { unicodeslot=0x2582, category='so', description='LOWER ONE QUARTER BLOCK' }, + [0x2583] = { unicodeslot=0x2583, category='so', description='LOWER THREE EIGHTHS BLOCK' }, + [0x2584] = { unicodeslot=0x2584, category='so', adobename='dnblock', description='LOWER HALF BLOCK' }, + [0x2585] = { unicodeslot=0x2585, category='so', description='LOWER FIVE EIGHTHS BLOCK' }, + [0x2586] = { unicodeslot=0x2586, category='so', description='LOWER THREE QUARTERS BLOCK' }, + [0x2587] = { unicodeslot=0x2587, category='so', description='LOWER SEVEN EIGHTHS BLOCK' }, + [0x2588] = { unicodeslot=0x2588, category='so', adobename='block', description='FULL BLOCK' }, + [0x2589] = { unicodeslot=0x2589, category='so', description='LEFT SEVEN EIGHTHS BLOCK' }, + [0x258A] = { unicodeslot=0x258A, category='so', description='LEFT THREE QUARTERS BLOCK' }, + [0x258B] = { unicodeslot=0x258B, category='so', description='LEFT FIVE EIGHTHS BLOCK' }, + [0x258C] = { unicodeslot=0x258C, category='so', adobename='lfblock', description='LEFT HALF BLOCK' }, + [0x258D] = { unicodeslot=0x258D, category='so', description='LEFT THREE EIGHTHS BLOCK' }, + [0x258E] = { unicodeslot=0x258E, category='so', description='LEFT ONE QUARTER BLOCK' }, + [0x258F] = { unicodeslot=0x258F, category='so', description='LEFT ONE EIGHTH BLOCK' }, + [0x2590] = { unicodeslot=0x2590, category='so', adobename='rtblock', description='RIGHT HALF BLOCK' }, + [0x2591] = { unicodeslot=0x2591, category='so', adobename='ltshade', description='LIGHT SHADE' }, + [0x2592] = { unicodeslot=0x2592, category='so', adobename='shade', description='MEDIUM SHADE' }, + [0x2593] = { unicodeslot=0x2593, category='so', adobename='dkshade', description='DARK SHADE' }, + [0x2594] = { unicodeslot=0x2594, category='so', description='UPPER ONE EIGHTH BLOCK' }, + [0x2595] = { unicodeslot=0x2595, category='so', description='RIGHT ONE EIGHTH BLOCK' }, + [0x2596] = { unicodeslot=0x2596, category='so', description='QUADRANT LOWER LEFT' }, + [0x2597] = { unicodeslot=0x2597, category='so', description='QUADRANT LOWER RIGHT' }, + [0x2598] = { unicodeslot=0x2598, category='so', description='QUADRANT UPPER LEFT' }, + [0x2599] = { unicodeslot=0x2599, category='so', description='QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT' }, + [0x259A] = { unicodeslot=0x259A, category='so', description='QUADRANT UPPER LEFT AND LOWER RIGHT' }, + [0x259B] = { unicodeslot=0x259B, category='so', description='QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT' }, + [0x259C] = { unicodeslot=0x259C, category='so', description='QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT' }, + [0x259D] = { unicodeslot=0x259D, category='so', description='QUADRANT UPPER RIGHT' }, + [0x259E] = { unicodeslot=0x259E, category='so', description='QUADRANT UPPER RIGHT AND LOWER LEFT' }, + [0x259F] = { unicodeslot=0x259F, category='so', description='QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT' }, + [0x25A0] = { unicodeslot=0x25A0, category='so', adobename='filledbox', description='BLACK SQUARE' }, + [0x25A1] = { unicodeslot=0x25A1, category='so', adobename='H22073', description='WHITE SQUARE' }, + [0x25A2] = { unicodeslot=0x25A2, category='so', description='WHITE SQUARE WITH ROUNDED CORNERS' }, + [0x25A3] = { unicodeslot=0x25A3, category='so', description='WHITE SQUARE CONTAINING BLACK SMALL SQUARE' }, + [0x25A4] = { unicodeslot=0x25A4, category='so', description='SQUARE WITH HORIZONTAL FILL' }, + [0x25A5] = { unicodeslot=0x25A5, category='so', description='SQUARE WITH VERTICAL FILL' }, + [0x25A6] = { unicodeslot=0x25A6, category='so', description='SQUARE WITH ORTHOGONAL CROSSHATCH FILL' }, + [0x25A7] = { unicodeslot=0x25A7, category='so', description='SQUARE WITH UPPER LEFT TO LOWER RIGHT FILL' }, + [0x25A8] = { unicodeslot=0x25A8, category='so', description='SQUARE WITH UPPER RIGHT TO LOWER LEFT FILL' }, + [0x25A9] = { unicodeslot=0x25A9, category='so', description='SQUARE WITH DIAGONAL CROSSHATCH FILL' }, + [0x25AA] = { unicodeslot=0x25AA, category='so', adobename='H18543', description='BLACK SMALL SQUARE' }, + [0x25AB] = { unicodeslot=0x25AB, category='so', adobename='H18551', description='WHITE SMALL SQUARE' }, + [0x25AC] = { unicodeslot=0x25AC, category='so', adobename='filledrect', description='BLACK RECTANGLE' }, + [0x25AD] = { unicodeslot=0x25AD, category='so', description='WHITE RECTANGLE' }, + [0x25AE] = { unicodeslot=0x25AE, category='so', description='BLACK VERTICAL RECTANGLE' }, + [0x25AF] = { unicodeslot=0x25AF, category='so', description='WHITE VERTICAL RECTANGLE' }, + [0x25B0] = { unicodeslot=0x25B0, category='so', description='BLACK PARALLELOGRAM' }, + [0x25B1] = { unicodeslot=0x25B1, category='so', description='WHITE PARALLELOGRAM' }, + [0x25B2] = { unicodeslot=0x25B2, category='so', adobename='triagup', description='BLACK UP-POINTING TRIANGLE' }, + [0x25B3] = { unicodeslot=0x25B3, category='so', description='WHITE UP-POINTING TRIANGLE' }, + [0x25B4] = { unicodeslot=0x25B4, category='so', description='BLACK UP-POINTING SMALL TRIANGLE' }, + [0x25B5] = { unicodeslot=0x25B5, category='so', description='WHITE UP-POINTING SMALL TRIANGLE' }, + [0x25B6] = { unicodeslot=0x25B6, category='so', description='BLACK RIGHT-POINTING TRIANGLE' }, + [0x25B7] = { unicodeslot=0x25B7, category='sm', description='WHITE RIGHT-POINTING TRIANGLE' }, + [0x25B8] = { unicodeslot=0x25B8, category='so', description='BLACK RIGHT-POINTING SMALL TRIANGLE' }, + [0x25B9] = { unicodeslot=0x25B9, category='so', description='WHITE RIGHT-POINTING SMALL TRIANGLE' }, + [0x25BA] = { unicodeslot=0x25BA, category='so', adobename='triagrt', description='BLACK RIGHT-POINTING POINTER' }, + [0x25BB] = { unicodeslot=0x25BB, category='so', description='WHITE RIGHT-POINTING POINTER' }, + [0x25BC] = { unicodeslot=0x25BC, category='so', adobename='triagdn', description='BLACK DOWN-POINTING TRIANGLE' }, + [0x25BD] = { unicodeslot=0x25BD, category='so', description='WHITE DOWN-POINTING TRIANGLE' }, + [0x25BE] = { unicodeslot=0x25BE, category='so', description='BLACK DOWN-POINTING SMALL TRIANGLE' }, + [0x25BF] = { unicodeslot=0x25BF, category='so', description='WHITE DOWN-POINTING SMALL TRIANGLE' }, + [0x25C0] = { unicodeslot=0x25C0, category='so', description='BLACK LEFT-POINTING TRIANGLE' }, + [0x25C1] = { unicodeslot=0x25C1, category='sm', description='WHITE LEFT-POINTING TRIANGLE' }, + [0x25C2] = { unicodeslot=0x25C2, category='so', description='BLACK LEFT-POINTING SMALL TRIANGLE' }, + [0x25C3] = { unicodeslot=0x25C3, category='so', description='WHITE LEFT-POINTING SMALL TRIANGLE' }, + [0x25C4] = { unicodeslot=0x25C4, category='so', adobename='triaglf', description='BLACK LEFT-POINTING POINTER' }, + [0x25C5] = { unicodeslot=0x25C5, category='so', description='WHITE LEFT-POINTING POINTER' }, + [0x25C6] = { unicodeslot=0x25C6, category='so', description='BLACK DIAMOND' }, + [0x25C7] = { unicodeslot=0x25C7, category='so', description='WHITE DIAMOND' }, + [0x25C8] = { unicodeslot=0x25C8, category='so', description='WHITE DIAMOND CONTAINING BLACK SMALL DIAMOND' }, + [0x25C9] = { unicodeslot=0x25C9, category='so', description='FISHEYE' }, + [0x25CA] = { unicodeslot=0x25CA, category='so', adobename='lozenge', description='LOZENGE' }, + [0x25CB] = { unicodeslot=0x25CB, category='so', adobename='circle', description='WHITE CIRCLE' }, + [0x25CC] = { unicodeslot=0x25CC, category='so', description='DOTTED CIRCLE' }, + [0x25CD] = { unicodeslot=0x25CD, category='so', description='CIRCLE WITH VERTICAL FILL' }, + [0x25CE] = { unicodeslot=0x25CE, category='so', description='BULLSEYE' }, + [0x25CF] = { unicodeslot=0x25CF, category='so', adobename='H18533', description='BLACK CIRCLE' }, + [0x25D0] = { unicodeslot=0x25D0, category='so', description='CIRCLE WITH LEFT HALF BLACK' }, + [0x25D1] = { unicodeslot=0x25D1, category='so', description='CIRCLE WITH RIGHT HALF BLACK' }, + [0x25D2] = { unicodeslot=0x25D2, category='so', description='CIRCLE WITH LOWER HALF BLACK' }, + [0x25D3] = { unicodeslot=0x25D3, category='so', description='CIRCLE WITH UPPER HALF BLACK' }, + [0x25D4] = { unicodeslot=0x25D4, category='so', description='CIRCLE WITH UPPER RIGHT QUADRANT BLACK' }, + [0x25D5] = { unicodeslot=0x25D5, category='so', description='CIRCLE WITH ALL BUT UPPER LEFT QUADRANT BLACK' }, + [0x25D6] = { unicodeslot=0x25D6, category='so', description='LEFT HALF BLACK CIRCLE' }, + [0x25D7] = { unicodeslot=0x25D7, category='so', description='RIGHT HALF BLACK CIRCLE' }, + [0x25D8] = { unicodeslot=0x25D8, category='so', adobename='invbullet', description='INVERSE BULLET' }, + [0x25D9] = { unicodeslot=0x25D9, category='so', adobename='invcircle', description='INVERSE WHITE CIRCLE' }, + [0x25DA] = { unicodeslot=0x25DA, category='so', description='UPPER HALF INVERSE WHITE CIRCLE' }, + [0x25DB] = { unicodeslot=0x25DB, category='so', description='LOWER HALF INVERSE WHITE CIRCLE' }, + [0x25DC] = { unicodeslot=0x25DC, category='so', description='UPPER LEFT QUADRANT CIRCULAR ARC' }, + [0x25DD] = { unicodeslot=0x25DD, category='so', description='UPPER RIGHT QUADRANT CIRCULAR ARC' }, + [0x25DE] = { unicodeslot=0x25DE, category='so', description='LOWER RIGHT QUADRANT CIRCULAR ARC' }, + [0x25DF] = { unicodeslot=0x25DF, category='so', description='LOWER LEFT QUADRANT CIRCULAR ARC' }, + [0x25E0] = { unicodeslot=0x25E0, category='so', description='UPPER HALF CIRCLE' }, + [0x25E1] = { unicodeslot=0x25E1, category='so', description='LOWER HALF CIRCLE' }, + [0x25E2] = { unicodeslot=0x25E2, category='so', description='BLACK LOWER RIGHT TRIANGLE' }, + [0x25E3] = { unicodeslot=0x25E3, category='so', description='BLACK LOWER LEFT TRIANGLE' }, + [0x25E4] = { unicodeslot=0x25E4, category='so', description='BLACK UPPER LEFT TRIANGLE' }, + [0x25E5] = { unicodeslot=0x25E5, category='so', description='BLACK UPPER RIGHT TRIANGLE' }, + [0x25E6] = { unicodeslot=0x25E6, category='so', adobename='openbullet', description='WHITE BULLET' }, + [0x25E7] = { unicodeslot=0x25E7, category='so', description='SQUARE WITH LEFT HALF BLACK' }, + [0x25E8] = { unicodeslot=0x25E8, category='so', description='SQUARE WITH RIGHT HALF BLACK' }, + [0x25E9] = { unicodeslot=0x25E9, category='so', description='SQUARE WITH UPPER LEFT DIAGONAL HALF BLACK' }, + [0x25EA] = { unicodeslot=0x25EA, category='so', description='SQUARE WITH LOWER RIGHT DIAGONAL HALF BLACK' }, + [0x25EB] = { unicodeslot=0x25EB, category='so', description='WHITE SQUARE WITH VERTICAL BISECTING LINE' }, + [0x25EC] = { unicodeslot=0x25EC, category='so', description='WHITE UP-POINTING TRIANGLE WITH DOT' }, + [0x25ED] = { unicodeslot=0x25ED, category='so', description='UP-POINTING TRIANGLE WITH LEFT HALF BLACK' }, + [0x25EE] = { unicodeslot=0x25EE, category='so', description='UP-POINTING TRIANGLE WITH RIGHT HALF BLACK' }, + [0x25EF] = { unicodeslot=0x25EF, category='so', description='LARGE CIRCLE' }, + [0x25F0] = { unicodeslot=0x25F0, category='so', description='WHITE SQUARE WITH UPPER LEFT QUADRANT' }, + [0x25F1] = { unicodeslot=0x25F1, category='so', description='WHITE SQUARE WITH LOWER LEFT QUADRANT' }, + [0x25F2] = { unicodeslot=0x25F2, category='so', description='WHITE SQUARE WITH LOWER RIGHT QUADRANT' }, + [0x25F3] = { unicodeslot=0x25F3, category='so', description='WHITE SQUARE WITH UPPER RIGHT QUADRANT' }, + [0x25F4] = { unicodeslot=0x25F4, category='so', description='WHITE CIRCLE WITH UPPER LEFT QUADRANT' }, + [0x25F5] = { unicodeslot=0x25F5, category='so', description='WHITE CIRCLE WITH LOWER LEFT QUADRANT' }, + [0x25F6] = { unicodeslot=0x25F6, category='so', description='WHITE CIRCLE WITH LOWER RIGHT QUADRANT' }, + [0x25F7] = { unicodeslot=0x25F7, category='so', description='WHITE CIRCLE WITH UPPER RIGHT QUADRANT' }, + [0x25F8] = { unicodeslot=0x25F8, category='sm', description='UPPER LEFT TRIANGLE' }, + [0x25F9] = { unicodeslot=0x25F9, category='sm', description='UPPER RIGHT TRIANGLE' }, + [0x25FA] = { unicodeslot=0x25FA, category='sm', description='LOWER LEFT TRIANGLE' }, + [0x25FB] = { unicodeslot=0x25FB, category='sm', description='WHITE MEDIUM SQUARE' }, + [0x25FC] = { unicodeslot=0x25FC, category='sm', description='BLACK MEDIUM SQUARE' }, + [0x25FD] = { unicodeslot=0x25FD, category='sm', description='WHITE MEDIUM SMALL SQUARE' }, + [0x25FE] = { unicodeslot=0x25FE, category='sm', description='BLACK MEDIUM SMALL SQUARE' }, + [0x25FF] = { unicodeslot=0x25FF, category='sm', description='LOWER RIGHT TRIANGLE' }, + [0x2600] = { unicodeslot=0x2600, category='so', description='BLACK SUN WITH RAYS' }, + [0x2601] = { unicodeslot=0x2601, category='so', description='CLOUD' }, + [0x2602] = { unicodeslot=0x2602, category='so', description='UMBRELLA' }, + [0x2603] = { unicodeslot=0x2603, category='so', description='SNOWMAN' }, + [0x2604] = { unicodeslot=0x2604, category='so', description='COMET' }, + [0x2605] = { unicodeslot=0x2605, category='so', description='BLACK STAR' }, + [0x2606] = { unicodeslot=0x2606, category='so', description='WHITE STAR' }, + [0x2607] = { unicodeslot=0x2607, category='so', description='LIGHTNING' }, + [0x2608] = { unicodeslot=0x2608, category='so', description='THUNDERSTORM' }, + [0x2609] = { unicodeslot=0x2609, category='so', description='SUN' }, + [0x260A] = { unicodeslot=0x260A, category='so', description='ASCENDING NODE' }, + [0x260B] = { unicodeslot=0x260B, category='so', description='DESCENDING NODE' }, + [0x260C] = { unicodeslot=0x260C, category='so', description='CONJUNCTION' }, + [0x260D] = { unicodeslot=0x260D, category='so', description='OPPOSITION' }, + [0x260E] = { unicodeslot=0x260E, category='so', description='BLACK TELEPHONE' }, + [0x260F] = { unicodeslot=0x260F, category='so', description='WHITE TELEPHONE' }, + [0x2610] = { unicodeslot=0x2610, category='so', description='BALLOT BOX' }, + [0x2611] = { unicodeslot=0x2611, category='so', description='BALLOT BOX WITH CHECK' }, + [0x2612] = { unicodeslot=0x2612, category='so', description='BALLOT BOX WITH X' }, + [0x2613] = { unicodeslot=0x2613, category='so', description='SALTIRE' }, + [0x2614] = { unicodeslot=0x2614, category='so', description='UMBRELLA WITH RAIN DROPS' }, + [0x2615] = { unicodeslot=0x2615, category='so', description='HOT BEVERAGE' }, + [0x2616] = { unicodeslot=0x2616, category='so', description='WHITE SHOGI PIECE' }, + [0x2617] = { unicodeslot=0x2617, category='so', description='BLACK SHOGI PIECE' }, + [0x2618] = { unicodeslot=0x2618, category='so', description='SHAMROCK' }, + [0x2619] = { unicodeslot=0x2619, category='so', description='REVERSED ROTATED FLORAL HEART BULLET' }, + [0x261A] = { unicodeslot=0x261A, category='so', description='BLACK LEFT POINTING INDEX' }, + [0x261B] = { unicodeslot=0x261B, category='so', description='BLACK RIGHT POINTING INDEX' }, + [0x261C] = { unicodeslot=0x261C, category='so', description='WHITE LEFT POINTING INDEX' }, + [0x261D] = { unicodeslot=0x261D, category='so', description='WHITE UP POINTING INDEX' }, + [0x261E] = { unicodeslot=0x261E, category='so', description='WHITE RIGHT POINTING INDEX' }, + [0x261F] = { unicodeslot=0x261F, category='so', description='WHITE DOWN POINTING INDEX' }, + [0x2620] = { unicodeslot=0x2620, category='so', description='SKULL AND CROSSBONES' }, + [0x2621] = { unicodeslot=0x2621, category='so', description='CAUTION SIGN' }, + [0x2622] = { unicodeslot=0x2622, category='so', description='RADIOACTIVE SIGN' }, + [0x2623] = { unicodeslot=0x2623, category='so', description='BIOHAZARD SIGN' }, + [0x2624] = { unicodeslot=0x2624, category='so', description='CADUCEUS' }, + [0x2625] = { unicodeslot=0x2625, category='so', description='ANKH' }, + [0x2626] = { unicodeslot=0x2626, category='so', description='ORTHODOX CROSS' }, + [0x2627] = { unicodeslot=0x2627, category='so', description='CHI RHO' }, + [0x2628] = { unicodeslot=0x2628, category='so', description='CROSS OF LORRAINE' }, + [0x2629] = { unicodeslot=0x2629, category='so', description='CROSS OF JERUSALEM' }, + [0x262A] = { unicodeslot=0x262A, category='so', description='STAR AND CRESCENT' }, + [0x262B] = { unicodeslot=0x262B, category='so', description='FARSI SYMBOL' }, + [0x262C] = { unicodeslot=0x262C, category='so', description='ADI SHAKTI' }, + [0x262D] = { unicodeslot=0x262D, category='so', description='HAMMER AND SICKLE' }, + [0x262E] = { unicodeslot=0x262E, category='so', description='PEACE SYMBOL' }, + [0x262F] = { unicodeslot=0x262F, category='so', description='YIN YANG' }, + [0x2630] = { unicodeslot=0x2630, category='so', description='TRIGRAM FOR HEAVEN' }, + [0x2631] = { unicodeslot=0x2631, category='so', description='TRIGRAM FOR LAKE' }, + [0x2632] = { unicodeslot=0x2632, category='so', description='TRIGRAM FOR FIRE' }, + [0x2633] = { unicodeslot=0x2633, category='so', description='TRIGRAM FOR THUNDER' }, + [0x2634] = { unicodeslot=0x2634, category='so', description='TRIGRAM FOR WIND' }, + [0x2635] = { unicodeslot=0x2635, category='so', description='TRIGRAM FOR WATER' }, + [0x2636] = { unicodeslot=0x2636, category='so', description='TRIGRAM FOR MOUNTAIN' }, + [0x2637] = { unicodeslot=0x2637, category='so', description='TRIGRAM FOR EARTH' }, + [0x2638] = { unicodeslot=0x2638, category='so', description='WHEEL OF DHARMA' }, + [0x2639] = { unicodeslot=0x2639, category='so', description='WHITE FROWNING FACE' }, + [0x263A] = { unicodeslot=0x263A, category='so', adobename='smileface', description='WHITE SMILING FACE' }, + [0x263B] = { unicodeslot=0x263B, category='so', adobename='invsmileface', description='BLACK SMILING FACE' }, + [0x263C] = { unicodeslot=0x263C, category='so', adobename='sun', description='WHITE SUN WITH RAYS' }, + [0x263D] = { unicodeslot=0x263D, category='so', description='FIRST QUARTER MOON' }, + [0x263E] = { unicodeslot=0x263E, category='so', description='LAST QUARTER MOON' }, + [0x263F] = { unicodeslot=0x263F, category='so', description='MERCURY' }, + [0x2640] = { unicodeslot=0x2640, category='so', adobename='female', description='FEMALE SIGN' }, + [0x2641] = { unicodeslot=0x2641, category='so', description='EARTH' }, + [0x2642] = { unicodeslot=0x2642, category='so', adobename='male', description='MALE SIGN' }, + [0x2643] = { unicodeslot=0x2643, category='so', description='JUPITER' }, + [0x2644] = { unicodeslot=0x2644, category='so', description='SATURN' }, + [0x2645] = { unicodeslot=0x2645, category='so', description='URANUS' }, + [0x2646] = { unicodeslot=0x2646, category='so', description='NEPTUNE' }, + [0x2647] = { unicodeslot=0x2647, category='so', description='PLUTO' }, + [0x2648] = { unicodeslot=0x2648, category='so', description='ARIES' }, + [0x2649] = { unicodeslot=0x2649, category='so', description='TAURUS' }, + [0x264A] = { unicodeslot=0x264A, category='so', description='GEMINI' }, + [0x264B] = { unicodeslot=0x264B, category='so', description='CANCER' }, + [0x264C] = { unicodeslot=0x264C, category='so', description='LEO' }, + [0x264D] = { unicodeslot=0x264D, category='so', description='VIRGO' }, + [0x264E] = { unicodeslot=0x264E, category='so', description='LIBRA' }, + [0x264F] = { unicodeslot=0x264F, category='so', description='SCORPIUS' }, + [0x2650] = { unicodeslot=0x2650, category='so', description='SAGITTARIUS' }, + [0x2651] = { unicodeslot=0x2651, category='so', description='CAPRICORN' }, + [0x2652] = { unicodeslot=0x2652, category='so', description='AQUARIUS' }, + [0x2653] = { unicodeslot=0x2653, category='so', description='PISCES' }, + [0x2654] = { unicodeslot=0x2654, category='so', description='WHITE CHESS KING' }, + [0x2655] = { unicodeslot=0x2655, category='so', description='WHITE CHESS QUEEN' }, + [0x2656] = { unicodeslot=0x2656, category='so', description='WHITE CHESS ROOK' }, + [0x2657] = { unicodeslot=0x2657, category='so', description='WHITE CHESS BISHOP' }, + [0x2658] = { unicodeslot=0x2658, category='so', description='WHITE CHESS KNIGHT' }, + [0x2659] = { unicodeslot=0x2659, category='so', description='WHITE CHESS PAWN' }, + [0x265A] = { unicodeslot=0x265A, category='so', description='BLACK CHESS KING' }, + [0x265B] = { unicodeslot=0x265B, category='so', description='BLACK CHESS QUEEN' }, + [0x265C] = { unicodeslot=0x265C, category='so', description='BLACK CHESS ROOK' }, + [0x265D] = { unicodeslot=0x265D, category='so', description='BLACK CHESS BISHOP' }, + [0x265E] = { unicodeslot=0x265E, category='so', description='BLACK CHESS KNIGHT' }, + [0x265F] = { unicodeslot=0x265F, category='so', description='BLACK CHESS PAWN' }, + [0x2660] = { unicodeslot=0x2660, category='so', adobename='spade', description='BLACK SPADE SUIT' }, + [0x2661] = { unicodeslot=0x2661, category='so', description='WHITE HEART SUIT' }, + [0x2662] = { unicodeslot=0x2662, category='so', description='WHITE DIAMOND SUIT' }, + [0x2663] = { unicodeslot=0x2663, category='so', adobename='club', description='BLACK CLUB SUIT' }, + [0x2664] = { unicodeslot=0x2664, category='so', description='WHITE SPADE SUIT' }, + [0x2665] = { unicodeslot=0x2665, category='so', adobename='heart', description='BLACK HEART SUIT' }, + [0x2666] = { unicodeslot=0x2666, category='so', adobename='diamond', description='BLACK DIAMOND SUIT' }, + [0x2667] = { unicodeslot=0x2667, category='so', description='WHITE CLUB SUIT' }, + [0x2668] = { unicodeslot=0x2668, category='so', description='HOT SPRINGS' }, + [0x2669] = { unicodeslot=0x2669, category='so', description='QUARTER NOTE' }, + [0x266A] = { unicodeslot=0x266A, category='so', adobename='musicalnote', description='EIGHTH NOTE' }, + [0x266B] = { unicodeslot=0x266B, category='so', adobename='musicalnotedbl', description='BEAMED EIGHTH NOTES' }, + [0x266C] = { unicodeslot=0x266C, category='so', description='BEAMED SIXTEENTH NOTES' }, + [0x266D] = { unicodeslot=0x266D, category='so', description='MUSIC FLAT SIGN' }, + [0x266E] = { unicodeslot=0x266E, category='so', description='MUSIC NATURAL SIGN' }, + [0x266F] = { unicodeslot=0x266F, category='sm', description='MUSIC SHARP SIGN' }, + [0x2670] = { unicodeslot=0x2670, category='so', description='WEST SYRIAC CROSS' }, + [0x2671] = { unicodeslot=0x2671, category='so', description='EAST SYRIAC CROSS' }, + [0x2672] = { unicodeslot=0x2672, category='so', description='UNIVERSAL RECYCLING SYMBOL' }, + [0x2673] = { unicodeslot=0x2673, category='so', description='RECYCLING SYMBOL FOR TYPE-1 PLASTICS' }, + [0x2674] = { unicodeslot=0x2674, category='so', description='RECYCLING SYMBOL FOR TYPE-2 PLASTICS' }, + [0x2675] = { unicodeslot=0x2675, category='so', description='RECYCLING SYMBOL FOR TYPE-3 PLASTICS' }, + [0x2676] = { unicodeslot=0x2676, category='so', description='RECYCLING SYMBOL FOR TYPE-4 PLASTICS' }, + [0x2677] = { unicodeslot=0x2677, category='so', description='RECYCLING SYMBOL FOR TYPE-5 PLASTICS' }, + [0x2678] = { unicodeslot=0x2678, category='so', description='RECYCLING SYMBOL FOR TYPE-6 PLASTICS' }, + [0x2679] = { unicodeslot=0x2679, category='so', description='RECYCLING SYMBOL FOR TYPE-7 PLASTICS' }, + [0x267A] = { unicodeslot=0x267A, category='so', description='RECYCLING SYMBOL FOR GENERIC MATERIALS' }, + [0x267B] = { unicodeslot=0x267B, category='so', description='BLACK UNIVERSAL RECYCLING SYMBOL' }, + [0x267C] = { unicodeslot=0x267C, category='so', description='RECYCLED PAPER SYMBOL' }, + [0x267D] = { unicodeslot=0x267D, category='so', description='PARTIALLY-RECYCLED PAPER SYMBOL' }, + [0x267E] = { unicodeslot=0x267E, category='so', description='PERMANENT PAPER SIGN' }, + [0x267F] = { unicodeslot=0x267F, category='so', description='WHEELCHAIR SYMBOL' }, + [0x2680] = { unicodeslot=0x2680, category='so', description='DIE FACE-1' }, + [0x2681] = { unicodeslot=0x2681, category='so', description='DIE FACE-2' }, + [0x2682] = { unicodeslot=0x2682, category='so', description='DIE FACE-3' }, + [0x2683] = { unicodeslot=0x2683, category='so', description='DIE FACE-4' }, + [0x2684] = { unicodeslot=0x2684, category='so', description='DIE FACE-5' }, + [0x2685] = { unicodeslot=0x2685, category='so', description='DIE FACE-6' }, + [0x2686] = { unicodeslot=0x2686, category='so', description='WHITE CIRCLE WITH DOT RIGHT' }, + [0x2687] = { unicodeslot=0x2687, category='so', description='WHITE CIRCLE WITH TWO DOTS' }, + [0x2688] = { unicodeslot=0x2688, category='so', description='BLACK CIRCLE WITH WHITE DOT RIGHT' }, + [0x2689] = { unicodeslot=0x2689, category='so', description='BLACK CIRCLE WITH TWO WHITE DOTS' }, + [0x268A] = { unicodeslot=0x268A, category='so', description='MONOGRAM FOR YANG' }, + [0x268B] = { unicodeslot=0x268B, category='so', description='MONOGRAM FOR YIN' }, + [0x268C] = { unicodeslot=0x268C, category='so', description='DIGRAM FOR GREATER YANG' }, + [0x268D] = { unicodeslot=0x268D, category='so', description='DIGRAM FOR LESSER YIN' }, + [0x268E] = { unicodeslot=0x268E, category='so', description='DIGRAM FOR LESSER YANG' }, + [0x268F] = { unicodeslot=0x268F, category='so', description='DIGRAM FOR GREATER YIN' }, + [0x2690] = { unicodeslot=0x2690, category='so', description='WHITE FLAG' }, + [0x2691] = { unicodeslot=0x2691, category='so', description='BLACK FLAG' }, + [0x2692] = { unicodeslot=0x2692, category='so', description='HAMMER AND PICK' }, + [0x2693] = { unicodeslot=0x2693, category='so', description='ANCHOR' }, + [0x2694] = { unicodeslot=0x2694, category='so', description='CROSSED SWORDS' }, + [0x2695] = { unicodeslot=0x2695, category='so', description='STAFF OF AESCULAPIUS' }, + [0x2696] = { unicodeslot=0x2696, category='so', description='SCALES' }, + [0x2697] = { unicodeslot=0x2697, category='so', description='ALEMBIC' }, + [0x2698] = { unicodeslot=0x2698, category='so', description='FLOWER' }, + [0x2699] = { unicodeslot=0x2699, category='so', description='GEAR' }, + [0x269A] = { unicodeslot=0x269A, category='so', description='STAFF OF HERMES' }, + [0x269B] = { unicodeslot=0x269B, category='so', description='ATOM SYMBOL' }, + [0x269C] = { unicodeslot=0x269C, category='so', description='FLEUR-DE-LIS' }, + [0x26A0] = { unicodeslot=0x26A0, category='so', description='WARNING SIGN' }, + [0x26A1] = { unicodeslot=0x26A1, category='so', description='HIGH VOLTAGE SIGN' }, + [0x26A2] = { unicodeslot=0x26A2, category='so', description='DOUBLED FEMALE SIGN' }, + [0x26A3] = { unicodeslot=0x26A3, category='so', description='DOUBLED MALE SIGN' }, + [0x26A4] = { unicodeslot=0x26A4, category='so', description='INTERLOCKED FEMALE AND MALE SIGN' }, + [0x26A5] = { unicodeslot=0x26A5, category='so', description='MALE AND FEMALE SIGN' }, + [0x26A6] = { unicodeslot=0x26A6, category='so', description='MALE WITH STROKE SIGN' }, + [0x26A7] = { unicodeslot=0x26A7, category='so', description='MALE WITH STROKE AND MALE AND FEMALE SIGN' }, + [0x26A8] = { unicodeslot=0x26A8, category='so', description='VERTICAL MALE WITH STROKE SIGN' }, + [0x26A9] = { unicodeslot=0x26A9, category='so', description='HORIZONTAL MALE WITH STROKE SIGN' }, + [0x26AA] = { unicodeslot=0x26AA, category='so', description='MEDIUM WHITE CIRCLE' }, + [0x26AB] = { unicodeslot=0x26AB, category='so', description='MEDIUM BLACK CIRCLE' }, + [0x26AC] = { unicodeslot=0x26AC, category='so', description='MEDIUM SMALL WHITE CIRCLE' }, + [0x26AD] = { unicodeslot=0x26AD, category='so', description='MARRIAGE SYMBOL' }, + [0x26AE] = { unicodeslot=0x26AE, category='so', description='DIVORCE SYMBOL' }, + [0x26AF] = { unicodeslot=0x26AF, category='so', description='UNMARRIED PARTNERSHIP SYMBOL' }, + [0x26B0] = { unicodeslot=0x26B0, category='so', description='COFFIN' }, + [0x26B1] = { unicodeslot=0x26B1, category='so', description='FUNERAL URN' }, + [0x26B2] = { unicodeslot=0x26B2, category='so', description='NEUTER' }, + [0x2701] = { unicodeslot=0x2701, category='so', description='UPPER BLADE SCISSORS' }, + [0x2702] = { unicodeslot=0x2702, category='so', description='BLACK SCISSORS' }, + [0x2703] = { unicodeslot=0x2703, category='so', description='LOWER BLADE SCISSORS' }, + [0x2704] = { unicodeslot=0x2704, category='so', description='WHITE SCISSORS' }, + [0x2706] = { unicodeslot=0x2706, category='so', description='TELEPHONE LOCATION SIGN' }, + [0x2707] = { unicodeslot=0x2707, category='so', description='TAPE DRIVE' }, + [0x2708] = { unicodeslot=0x2708, category='so', description='AIRPLANE' }, + [0x2709] = { unicodeslot=0x2709, category='so', description='ENVELOPE' }, + [0x270C] = { unicodeslot=0x270C, category='so', description='VICTORY HAND' }, + [0x270D] = { unicodeslot=0x270D, category='so', description='WRITING HAND' }, + [0x270E] = { unicodeslot=0x270E, category='so', description='LOWER RIGHT PENCIL' }, + [0x270F] = { unicodeslot=0x270F, category='so', description='PENCIL' }, + [0x2710] = { unicodeslot=0x2710, category='so', description='UPPER RIGHT PENCIL' }, + [0x2711] = { unicodeslot=0x2711, category='so', description='WHITE NIB' }, + [0x2712] = { unicodeslot=0x2712, category='so', description='BLACK NIB' }, + [0x2713] = { unicodeslot=0x2713, category='so', description='CHECK MARK' }, + [0x2714] = { unicodeslot=0x2714, category='so', description='HEAVY CHECK MARK' }, + [0x2715] = { unicodeslot=0x2715, category='so', description='MULTIPLICATION X' }, + [0x2716] = { unicodeslot=0x2716, category='so', description='HEAVY MULTIPLICATION X' }, + [0x2717] = { unicodeslot=0x2717, category='so', description='BALLOT X' }, + [0x2718] = { unicodeslot=0x2718, category='so', description='HEAVY BALLOT X' }, + [0x2719] = { unicodeslot=0x2719, category='so', description='OUTLINED GREEK CROSS' }, + [0x271A] = { unicodeslot=0x271A, category='so', description='HEAVY GREEK CROSS' }, + [0x271B] = { unicodeslot=0x271B, category='so', description='OPEN CENTRE CROSS' }, + [0x271C] = { unicodeslot=0x271C, category='so', description='HEAVY OPEN CENTRE CROSS' }, + [0x271D] = { unicodeslot=0x271D, category='so', description='LATIN CROSS' }, + [0x271E] = { unicodeslot=0x271E, category='so', description='SHADOWED WHITE LATIN CROSS' }, + [0x271F] = { unicodeslot=0x271F, category='so', description='OUTLINED LATIN CROSS' }, + [0x2720] = { unicodeslot=0x2720, category='so', description='MALTESE CROSS' }, + [0x2721] = { unicodeslot=0x2721, category='so', description='STAR OF DAVID' }, + [0x2722] = { unicodeslot=0x2722, category='so', description='FOUR TEARDROP-SPOKED ASTERISK' }, + [0x2723] = { unicodeslot=0x2723, category='so', description='FOUR BALLOON-SPOKED ASTERISK' }, + [0x2724] = { unicodeslot=0x2724, category='so', description='HEAVY FOUR BALLOON-SPOKED ASTERISK' }, + [0x2725] = { unicodeslot=0x2725, category='so', description='FOUR CLUB-SPOKED ASTERISK' }, + [0x2726] = { unicodeslot=0x2726, category='so', description='BLACK FOUR POINTED STAR' }, + [0x2727] = { unicodeslot=0x2727, category='so', description='WHITE FOUR POINTED STAR' }, + [0x2729] = { unicodeslot=0x2729, category='so', description='STRESS OUTLINED WHITE STAR' }, + [0x272A] = { unicodeslot=0x272A, category='so', description='CIRCLED WHITE STAR' }, + [0x272B] = { unicodeslot=0x272B, category='so', description='OPEN CENTRE BLACK STAR' }, + [0x272C] = { unicodeslot=0x272C, category='so', description='BLACK CENTRE WHITE STAR' }, + [0x272D] = { unicodeslot=0x272D, category='so', description='OUTLINED BLACK STAR' }, + [0x272E] = { unicodeslot=0x272E, category='so', description='HEAVY OUTLINED BLACK STAR' }, + [0x272F] = { unicodeslot=0x272F, category='so', description='PINWHEEL STAR' }, + [0x2730] = { unicodeslot=0x2730, category='so', description='SHADOWED WHITE STAR' }, + [0x2731] = { unicodeslot=0x2731, category='so', description='HEAVY ASTERISK' }, + [0x2732] = { unicodeslot=0x2732, category='so', description='OPEN CENTRE ASTERISK' }, + [0x2733] = { unicodeslot=0x2733, category='so', description='EIGHT SPOKED ASTERISK' }, + [0x2734] = { unicodeslot=0x2734, category='so', description='EIGHT POINTED BLACK STAR' }, + [0x2735] = { unicodeslot=0x2735, category='so', description='EIGHT POINTED PINWHEEL STAR' }, + [0x2736] = { unicodeslot=0x2736, category='so', description='SIX POINTED BLACK STAR' }, + [0x2737] = { unicodeslot=0x2737, category='so', description='EIGHT POINTED RECTILINEAR BLACK STAR' }, + [0x2738] = { unicodeslot=0x2738, category='so', description='HEAVY EIGHT POINTED RECTILINEAR BLACK STAR' }, + [0x2739] = { unicodeslot=0x2739, category='so', description='TWELVE POINTED BLACK STAR' }, + [0x273A] = { unicodeslot=0x273A, category='so', description='SIXTEEN POINTED ASTERISK' }, + [0x273B] = { unicodeslot=0x273B, category='so', description='TEARDROP-SPOKED ASTERISK' }, + [0x273C] = { unicodeslot=0x273C, category='so', description='OPEN CENTRE TEARDROP-SPOKED ASTERISK' }, + [0x273D] = { unicodeslot=0x273D, category='so', description='HEAVY TEARDROP-SPOKED ASTERISK' }, + [0x273E] = { unicodeslot=0x273E, category='so', description='SIX PETALLED BLACK AND WHITE FLORETTE' }, + [0x273F] = { unicodeslot=0x273F, category='so', description='BLACK FLORETTE' }, + [0x2740] = { unicodeslot=0x2740, category='so', description='WHITE FLORETTE' }, + [0x2741] = { unicodeslot=0x2741, category='so', description='EIGHT PETALLED OUTLINED BLACK FLORETTE' }, + [0x2742] = { unicodeslot=0x2742, category='so', description='CIRCLED OPEN CENTRE EIGHT POINTED STAR' }, + [0x2743] = { unicodeslot=0x2743, category='so', description='HEAVY TEARDROP-SPOKED PINWHEEL ASTERISK' }, + [0x2744] = { unicodeslot=0x2744, category='so', description='SNOWFLAKE' }, + [0x2745] = { unicodeslot=0x2745, category='so', description='TIGHT TRIFOLIATE SNOWFLAKE' }, + [0x2746] = { unicodeslot=0x2746, category='so', description='HEAVY CHEVRON SNOWFLAKE' }, + [0x2747] = { unicodeslot=0x2747, category='so', description='SPARKLE' }, + [0x2748] = { unicodeslot=0x2748, category='so', description='HEAVY SPARKLE' }, + [0x2749] = { unicodeslot=0x2749, category='so', description='BALLOON-SPOKED ASTERISK' }, + [0x274A] = { unicodeslot=0x274A, category='so', description='EIGHT TEARDROP-SPOKED PROPELLER ASTERISK' }, + [0x274B] = { unicodeslot=0x274B, category='so', description='HEAVY EIGHT TEARDROP-SPOKED PROPELLER ASTERISK' }, + [0x274D] = { unicodeslot=0x274D, category='so', description='SHADOWED WHITE CIRCLE' }, + [0x274F] = { unicodeslot=0x274F, category='so', description='LOWER RIGHT DROP-SHADOWED WHITE SQUARE' }, + [0x2750] = { unicodeslot=0x2750, category='so', description='UPPER RIGHT DROP-SHADOWED WHITE SQUARE' }, + [0x2751] = { unicodeslot=0x2751, category='so', description='LOWER RIGHT SHADOWED WHITE SQUARE' }, + [0x2752] = { unicodeslot=0x2752, category='so', description='UPPER RIGHT SHADOWED WHITE SQUARE' }, + [0x2756] = { unicodeslot=0x2756, category='so', description='BLACK DIAMOND MINUS WHITE X' }, + [0x2758] = { unicodeslot=0x2758, category='so', description='LIGHT VERTICAL BAR' }, + [0x2759] = { unicodeslot=0x2759, category='so', description='MEDIUM VERTICAL BAR' }, + [0x275A] = { unicodeslot=0x275A, category='so', description='HEAVY VERTICAL BAR' }, + [0x275B] = { unicodeslot=0x275B, category='so', description='HEAVY SINGLE TURNED COMMA QUOTATION MARK ORNAMENT' }, + [0x275C] = { unicodeslot=0x275C, category='so', description='HEAVY SINGLE COMMA QUOTATION MARK ORNAMENT' }, + [0x275D] = { unicodeslot=0x275D, category='so', description='HEAVY DOUBLE TURNED COMMA QUOTATION MARK ORNAMENT' }, + [0x275E] = { unicodeslot=0x275E, category='so', description='HEAVY DOUBLE COMMA QUOTATION MARK ORNAMENT' }, + [0x2761] = { unicodeslot=0x2761, category='so', description='CURVED STEM PARAGRAPH SIGN ORNAMENT' }, + [0x2762] = { unicodeslot=0x2762, category='so', description='HEAVY EXCLAMATION MARK ORNAMENT' }, + [0x2763] = { unicodeslot=0x2763, category='so', description='HEAVY HEART EXCLAMATION MARK ORNAMENT' }, + [0x2764] = { unicodeslot=0x2764, category='so', description='HEAVY BLACK HEART' }, + [0x2765] = { unicodeslot=0x2765, category='so', description='ROTATED HEAVY BLACK HEART BULLET' }, + [0x2766] = { unicodeslot=0x2766, category='so', description='FLORAL HEART' }, + [0x2767] = { unicodeslot=0x2767, category='so', description='ROTATED FLORAL HEART BULLET' }, + [0x2768] = { unicodeslot=0x2768, category='ps', description='MEDIUM LEFT PARENTHESIS ORNAMENT' }, + [0x2769] = { unicodeslot=0x2769, category='pe', description='MEDIUM RIGHT PARENTHESIS ORNAMENT' }, + [0x276A] = { unicodeslot=0x276A, category='ps', description='MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT' }, + [0x276B] = { unicodeslot=0x276B, category='pe', description='MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT' }, + [0x276C] = { unicodeslot=0x276C, category='ps', description='MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT' }, + [0x276D] = { unicodeslot=0x276D, category='pe', description='MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT' }, + [0x276E] = { unicodeslot=0x276E, category='ps', description='HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT' }, + [0x276F] = { unicodeslot=0x276F, category='pe', description='HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT' }, + [0x2770] = { unicodeslot=0x2770, category='ps', description='HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT' }, + [0x2771] = { unicodeslot=0x2771, category='pe', description='HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT' }, + [0x2772] = { unicodeslot=0x2772, category='ps', description='LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT' }, + [0x2773] = { unicodeslot=0x2773, category='pe', description='LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT' }, + [0x2774] = { unicodeslot=0x2774, category='ps', description='MEDIUM LEFT CURLY BRACKET ORNAMENT' }, + [0x2775] = { unicodeslot=0x2775, category='pe', description='MEDIUM RIGHT CURLY BRACKET ORNAMENT' }, + [0x2776] = { unicodeslot=0x2776, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT ONE' }, + [0x2777] = { unicodeslot=0x2777, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT TWO' }, + [0x2778] = { unicodeslot=0x2778, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT THREE' }, + [0x2779] = { unicodeslot=0x2779, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT FOUR' }, + [0x277A] = { unicodeslot=0x277A, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT FIVE' }, + [0x277B] = { unicodeslot=0x277B, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT SIX' }, + [0x277C] = { unicodeslot=0x277C, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT SEVEN' }, + [0x277D] = { unicodeslot=0x277D, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT EIGHT' }, + [0x277E] = { unicodeslot=0x277E, category='no', description='DINGBAT NEGATIVE CIRCLED DIGIT NINE' }, + [0x277F] = { unicodeslot=0x277F, category='no', description='DINGBAT NEGATIVE CIRCLED NUMBER TEN' }, + [0x2780] = { unicodeslot=0x2780, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT ONE' }, + [0x2781] = { unicodeslot=0x2781, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT TWO' }, + [0x2782] = { unicodeslot=0x2782, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT THREE' }, + [0x2783] = { unicodeslot=0x2783, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT FOUR' }, + [0x2784] = { unicodeslot=0x2784, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT FIVE' }, + [0x2785] = { unicodeslot=0x2785, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT SIX' }, + [0x2786] = { unicodeslot=0x2786, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT SEVEN' }, + [0x2787] = { unicodeslot=0x2787, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT EIGHT' }, + [0x2788] = { unicodeslot=0x2788, category='no', description='DINGBAT CIRCLED SANS-SERIF DIGIT NINE' }, + [0x2789] = { unicodeslot=0x2789, category='no', description='DINGBAT CIRCLED SANS-SERIF NUMBER TEN' }, + [0x278A] = { unicodeslot=0x278A, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT ONE' }, + [0x278B] = { unicodeslot=0x278B, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT TWO' }, + [0x278C] = { unicodeslot=0x278C, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT THREE' }, + [0x278D] = { unicodeslot=0x278D, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FOUR' }, + [0x278E] = { unicodeslot=0x278E, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT FIVE' }, + [0x278F] = { unicodeslot=0x278F, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SIX' }, + [0x2790] = { unicodeslot=0x2790, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT SEVEN' }, + [0x2791] = { unicodeslot=0x2791, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT EIGHT' }, + [0x2792] = { unicodeslot=0x2792, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF DIGIT NINE' }, + [0x2793] = { unicodeslot=0x2793, category='no', description='DINGBAT NEGATIVE CIRCLED SANS-SERIF NUMBER TEN' }, + [0x2794] = { unicodeslot=0x2794, category='so', description='HEAVY WIDE-HEADED RIGHTWARDS ARROW' }, + [0x2798] = { unicodeslot=0x2798, category='so', description='HEAVY SOUTH EAST ARROW' }, + [0x2799] = { unicodeslot=0x2799, category='so', description='HEAVY RIGHTWARDS ARROW' }, + [0x279A] = { unicodeslot=0x279A, category='so', description='HEAVY NORTH EAST ARROW' }, + [0x279B] = { unicodeslot=0x279B, category='so', description='DRAFTING POINT RIGHTWARDS ARROW' }, + [0x279C] = { unicodeslot=0x279C, category='so', description='HEAVY ROUND-TIPPED RIGHTWARDS ARROW' }, + [0x279D] = { unicodeslot=0x279D, category='so', description='TRIANGLE-HEADED RIGHTWARDS ARROW' }, + [0x279E] = { unicodeslot=0x279E, category='so', description='HEAVY TRIANGLE-HEADED RIGHTWARDS ARROW' }, + [0x279F] = { unicodeslot=0x279F, category='so', description='DASHED TRIANGLE-HEADED RIGHTWARDS ARROW' }, + [0x27A0] = { unicodeslot=0x27A0, category='so', description='HEAVY DASHED TRIANGLE-HEADED RIGHTWARDS ARROW' }, + [0x27A1] = { unicodeslot=0x27A1, category='so', description='BLACK RIGHTWARDS ARROW' }, + [0x27A2] = { unicodeslot=0x27A2, category='so', description='THREE-D TOP-LIGHTED RIGHTWARDS ARROWHEAD' }, + [0x27A3] = { unicodeslot=0x27A3, category='so', description='THREE-D BOTTOM-LIGHTED RIGHTWARDS ARROWHEAD' }, + [0x27A4] = { unicodeslot=0x27A4, category='so', description='BLACK RIGHTWARDS ARROWHEAD' }, + [0x27A5] = { unicodeslot=0x27A5, category='so', description='HEAVY BLACK CURVED DOWNWARDS AND RIGHTWARDS ARROW' }, + [0x27A6] = { unicodeslot=0x27A6, category='so', description='HEAVY BLACK CURVED UPWARDS AND RIGHTWARDS ARROW' }, + [0x27A7] = { unicodeslot=0x27A7, category='so', description='SQUAT BLACK RIGHTWARDS ARROW' }, + [0x27A8] = { unicodeslot=0x27A8, category='so', description='HEAVY CONCAVE-POINTED BLACK RIGHTWARDS ARROW' }, + [0x27A9] = { unicodeslot=0x27A9, category='so', description='RIGHT-SHADED WHITE RIGHTWARDS ARROW' }, + [0x27AA] = { unicodeslot=0x27AA, category='so', description='LEFT-SHADED WHITE RIGHTWARDS ARROW' }, + [0x27AB] = { unicodeslot=0x27AB, category='so', description='BACK-TILTED SHADOWED WHITE RIGHTWARDS ARROW' }, + [0x27AC] = { unicodeslot=0x27AC, category='so', description='FRONT-TILTED SHADOWED WHITE RIGHTWARDS ARROW' }, + [0x27AD] = { unicodeslot=0x27AD, category='so', description='HEAVY LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW' }, + [0x27AE] = { unicodeslot=0x27AE, category='so', description='HEAVY UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW' }, + [0x27AF] = { unicodeslot=0x27AF, category='so', description='NOTCHED LOWER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW' }, + [0x27B1] = { unicodeslot=0x27B1, category='so', description='NOTCHED UPPER RIGHT-SHADOWED WHITE RIGHTWARDS ARROW' }, + [0x27B2] = { unicodeslot=0x27B2, category='so', description='CIRCLED HEAVY WHITE RIGHTWARDS ARROW' }, + [0x27B3] = { unicodeslot=0x27B3, category='so', description='WHITE-FEATHERED RIGHTWARDS ARROW' }, + [0x27B4] = { unicodeslot=0x27B4, category='so', description='BLACK-FEATHERED SOUTH EAST ARROW' }, + [0x27B5] = { unicodeslot=0x27B5, category='so', description='BLACK-FEATHERED RIGHTWARDS ARROW' }, + [0x27B6] = { unicodeslot=0x27B6, category='so', description='BLACK-FEATHERED NORTH EAST ARROW' }, + [0x27B7] = { unicodeslot=0x27B7, category='so', description='HEAVY BLACK-FEATHERED SOUTH EAST ARROW' }, + [0x27B8] = { unicodeslot=0x27B8, category='so', description='HEAVY BLACK-FEATHERED RIGHTWARDS ARROW' }, + [0x27B9] = { unicodeslot=0x27B9, category='so', description='HEAVY BLACK-FEATHERED NORTH EAST ARROW' }, + [0x27BA] = { unicodeslot=0x27BA, category='so', description='TEARDROP-BARBED RIGHTWARDS ARROW' }, + [0x27BB] = { unicodeslot=0x27BB, category='so', description='HEAVY TEARDROP-SHANKED RIGHTWARDS ARROW' }, + [0x27BC] = { unicodeslot=0x27BC, category='so', description='WEDGE-TAILED RIGHTWARDS ARROW' }, + [0x27BD] = { unicodeslot=0x27BD, category='so', description='HEAVY WEDGE-TAILED RIGHTWARDS ARROW' }, + [0x27BE] = { unicodeslot=0x27BE, category='so', description='OPEN-OUTLINED RIGHTWARDS ARROW' }, + [0x27C0] = { unicodeslot=0x27C0, category='sm', description='THREE DIMENSIONAL ANGLE' }, + [0x27C1] = { unicodeslot=0x27C1, category='sm', description='WHITE TRIANGLE CONTAINING SMALL WHITE TRIANGLE' }, + [0x27C2] = { unicodeslot=0x27C2, category='sm', description='PERPENDICULAR' }, + [0x27C3] = { unicodeslot=0x27C3, category='sm', description='OPEN SUBSET' }, + [0x27C4] = { unicodeslot=0x27C4, category='sm', description='OPEN SUPERSET' }, + [0x27C5] = { unicodeslot=0x27C5, category='ps', description='LEFT S-SHAPED BAG DELIMITER' }, + [0x27C6] = { unicodeslot=0x27C6, category='pe', description='RIGHT S-SHAPED BAG DELIMITER' }, + [0x27C7] = { unicodeslot=0x27C7, category='sm', description='OR WITH DOT INSIDE' }, + [0x27C8] = { unicodeslot=0x27C8, category='sm', description='REVERSE SOLIDUS PRECEDING SUBSET' }, + [0x27C9] = { unicodeslot=0x27C9, category='sm', description='SUPERSET PRECEDING SOLIDUS' }, + [0x27CA] = { unicodeslot=0x27CA, category='sm', description='VERTICAL BAR WITH HORIZONTAL STROKE' }, + [0x27D0] = { unicodeslot=0x27D0, category='sm', description='WHITE DIAMOND WITH CENTRED DOT' }, + [0x27D1] = { unicodeslot=0x27D1, category='sm', description='AND WITH DOT' }, + [0x27D2] = { unicodeslot=0x27D2, category='sm', description='ELEMENT OF OPENING UPWARDS' }, + [0x27D3] = { unicodeslot=0x27D3, category='sm', description='LOWER RIGHT CORNER WITH DOT' }, + [0x27D4] = { unicodeslot=0x27D4, category='sm', description='UPPER LEFT CORNER WITH DOT' }, + [0x27D5] = { unicodeslot=0x27D5, category='sm', description='LEFT OUTER JOIN' }, + [0x27D6] = { unicodeslot=0x27D6, category='sm', description='RIGHT OUTER JOIN' }, + [0x27D7] = { unicodeslot=0x27D7, category='sm', description='FULL OUTER JOIN' }, + [0x27D8] = { unicodeslot=0x27D8, category='sm', description='LARGE UP TACK' }, + [0x27D9] = { unicodeslot=0x27D9, category='sm', description='LARGE DOWN TACK' }, + [0x27DA] = { unicodeslot=0x27DA, category='sm', description='LEFT AND RIGHT DOUBLE TURNSTILE' }, + [0x27DB] = { unicodeslot=0x27DB, category='sm', description='LEFT AND RIGHT TACK' }, + [0x27DC] = { unicodeslot=0x27DC, category='sm', description='LEFT MULTIMAP' }, + [0x27DD] = { unicodeslot=0x27DD, category='sm', description='LONG RIGHT TACK' }, + [0x27DE] = { unicodeslot=0x27DE, category='sm', description='LONG LEFT TACK' }, + [0x27DF] = { unicodeslot=0x27DF, category='sm', description='UP TACK WITH CIRCLE ABOVE' }, + [0x27E0] = { unicodeslot=0x27E0, category='sm', description='LOZENGE DIVIDED BY HORIZONTAL RULE' }, + [0x27E1] = { unicodeslot=0x27E1, category='sm', description='WHITE CONCAVE-SIDED DIAMOND' }, + [0x27E2] = { unicodeslot=0x27E2, category='sm', description='WHITE CONCAVE-SIDED DIAMOND WITH LEFTWARDS TICK' }, + [0x27E3] = { unicodeslot=0x27E3, category='sm', description='WHITE CONCAVE-SIDED DIAMOND WITH RIGHTWARDS TICK' }, + [0x27E4] = { unicodeslot=0x27E4, category='sm', description='WHITE SQUARE WITH LEFTWARDS TICK' }, + [0x27E5] = { unicodeslot=0x27E5, category='sm', description='WHITE SQUARE WITH RIGHTWARDS TICK' }, + [0x27E6] = { unicodeslot=0x27E6, category='ps', description='MATHEMATICAL LEFT WHITE SQUARE BRACKET' }, + [0x27E7] = { unicodeslot=0x27E7, category='pe', description='MATHEMATICAL RIGHT WHITE SQUARE BRACKET' }, + [0x27E8] = { unicodeslot=0x27E8, category='ps', description='MATHEMATICAL LEFT ANGLE BRACKET' }, + [0x27E9] = { unicodeslot=0x27E9, category='pe', description='MATHEMATICAL RIGHT ANGLE BRACKET' }, + [0x27EA] = { unicodeslot=0x27EA, category='ps', description='MATHEMATICAL LEFT DOUBLE ANGLE BRACKET' }, + [0x27EB] = { unicodeslot=0x27EB, category='pe', description='MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET' }, + [0x27F0] = { unicodeslot=0x27F0, category='sm', description='UPWARDS QUADRUPLE ARROW' }, + [0x27F1] = { unicodeslot=0x27F1, category='sm', description='DOWNWARDS QUADRUPLE ARROW' }, + [0x27F2] = { unicodeslot=0x27F2, category='sm', description='ANTICLOCKWISE GAPPED CIRCLE ARROW' }, + [0x27F3] = { unicodeslot=0x27F3, category='sm', description='CLOCKWISE GAPPED CIRCLE ARROW' }, + [0x27F4] = { unicodeslot=0x27F4, category='sm', description='RIGHT ARROW WITH CIRCLED PLUS' }, + [0x27F5] = { unicodeslot=0x27F5, category='sm', description='LONG LEFTWARDS ARROW' }, + [0x27F6] = { unicodeslot=0x27F6, category='sm', description='LONG RIGHTWARDS ARROW' }, + [0x27F7] = { unicodeslot=0x27F7, category='sm', description='LONG LEFT RIGHT ARROW' }, + [0x27F8] = { unicodeslot=0x27F8, category='sm', description='LONG LEFTWARDS DOUBLE ARROW' }, + [0x27F9] = { unicodeslot=0x27F9, category='sm', description='LONG RIGHTWARDS DOUBLE ARROW' }, + [0x27FA] = { unicodeslot=0x27FA, category='sm', description='LONG LEFT RIGHT DOUBLE ARROW' }, + [0x27FB] = { unicodeslot=0x27FB, category='sm', description='LONG LEFTWARDS ARROW FROM BAR' }, + [0x27FC] = { unicodeslot=0x27FC, category='sm', description='LONG RIGHTWARDS ARROW FROM BAR' }, + [0x27FD] = { unicodeslot=0x27FD, category='sm', description='LONG LEFTWARDS DOUBLE ARROW FROM BAR' }, + [0x27FE] = { unicodeslot=0x27FE, category='sm', description='LONG RIGHTWARDS DOUBLE ARROW FROM BAR' }, + [0x27FF] = { unicodeslot=0x27FF, category='sm', description='LONG RIGHTWARDS SQUIGGLE ARROW' }, + [0x2800] = { unicodeslot=0x2800, category='so', description='BRAILLE PATTERN BLANK' }, + [0x2801] = { unicodeslot=0x2801, category='so', description='BRAILLE PATTERN DOTS-1' }, + [0x2802] = { unicodeslot=0x2802, category='so', description='BRAILLE PATTERN DOTS-2' }, + [0x2803] = { unicodeslot=0x2803, category='so', description='BRAILLE PATTERN DOTS-12' }, + [0x2804] = { unicodeslot=0x2804, category='so', description='BRAILLE PATTERN DOTS-3' }, + [0x2805] = { unicodeslot=0x2805, category='so', description='BRAILLE PATTERN DOTS-13' }, + [0x2806] = { unicodeslot=0x2806, category='so', description='BRAILLE PATTERN DOTS-23' }, + [0x2807] = { unicodeslot=0x2807, category='so', description='BRAILLE PATTERN DOTS-123' }, + [0x2808] = { unicodeslot=0x2808, category='so', description='BRAILLE PATTERN DOTS-4' }, + [0x2809] = { unicodeslot=0x2809, category='so', description='BRAILLE PATTERN DOTS-14' }, + [0x280A] = { unicodeslot=0x280A, category='so', description='BRAILLE PATTERN DOTS-24' }, + [0x280B] = { unicodeslot=0x280B, category='so', description='BRAILLE PATTERN DOTS-124' }, + [0x280C] = { unicodeslot=0x280C, category='so', description='BRAILLE PATTERN DOTS-34' }, + [0x280D] = { unicodeslot=0x280D, category='so', description='BRAILLE PATTERN DOTS-134' }, + [0x280E] = { unicodeslot=0x280E, category='so', description='BRAILLE PATTERN DOTS-234' }, + [0x280F] = { unicodeslot=0x280F, category='so', description='BRAILLE PATTERN DOTS-1234' }, + [0x2810] = { unicodeslot=0x2810, category='so', description='BRAILLE PATTERN DOTS-5' }, + [0x2811] = { unicodeslot=0x2811, category='so', description='BRAILLE PATTERN DOTS-15' }, + [0x2812] = { unicodeslot=0x2812, category='so', description='BRAILLE PATTERN DOTS-25' }, + [0x2813] = { unicodeslot=0x2813, category='so', description='BRAILLE PATTERN DOTS-125' }, + [0x2814] = { unicodeslot=0x2814, category='so', description='BRAILLE PATTERN DOTS-35' }, + [0x2815] = { unicodeslot=0x2815, category='so', description='BRAILLE PATTERN DOTS-135' }, + [0x2816] = { unicodeslot=0x2816, category='so', description='BRAILLE PATTERN DOTS-235' }, + [0x2817] = { unicodeslot=0x2817, category='so', description='BRAILLE PATTERN DOTS-1235' }, + [0x2818] = { unicodeslot=0x2818, category='so', description='BRAILLE PATTERN DOTS-45' }, + [0x2819] = { unicodeslot=0x2819, category='so', description='BRAILLE PATTERN DOTS-145' }, + [0x281A] = { unicodeslot=0x281A, category='so', description='BRAILLE PATTERN DOTS-245' }, + [0x281B] = { unicodeslot=0x281B, category='so', description='BRAILLE PATTERN DOTS-1245' }, + [0x281C] = { unicodeslot=0x281C, category='so', description='BRAILLE PATTERN DOTS-345' }, + [0x281D] = { unicodeslot=0x281D, category='so', description='BRAILLE PATTERN DOTS-1345' }, + [0x281E] = { unicodeslot=0x281E, category='so', description='BRAILLE PATTERN DOTS-2345' }, + [0x281F] = { unicodeslot=0x281F, category='so', description='BRAILLE PATTERN DOTS-12345' }, + [0x2820] = { unicodeslot=0x2820, category='so', description='BRAILLE PATTERN DOTS-6' }, + [0x2821] = { unicodeslot=0x2821, category='so', description='BRAILLE PATTERN DOTS-16' }, + [0x2822] = { unicodeslot=0x2822, category='so', description='BRAILLE PATTERN DOTS-26' }, + [0x2823] = { unicodeslot=0x2823, category='so', description='BRAILLE PATTERN DOTS-126' }, + [0x2824] = { unicodeslot=0x2824, category='so', description='BRAILLE PATTERN DOTS-36' }, + [0x2825] = { unicodeslot=0x2825, category='so', description='BRAILLE PATTERN DOTS-136' }, + [0x2826] = { unicodeslot=0x2826, category='so', description='BRAILLE PATTERN DOTS-236' }, + [0x2827] = { unicodeslot=0x2827, category='so', description='BRAILLE PATTERN DOTS-1236' }, + [0x2828] = { unicodeslot=0x2828, category='so', description='BRAILLE PATTERN DOTS-46' }, + [0x2829] = { unicodeslot=0x2829, category='so', description='BRAILLE PATTERN DOTS-146' }, + [0x282A] = { unicodeslot=0x282A, category='so', description='BRAILLE PATTERN DOTS-246' }, + [0x282B] = { unicodeslot=0x282B, category='so', description='BRAILLE PATTERN DOTS-1246' }, + [0x282C] = { unicodeslot=0x282C, category='so', description='BRAILLE PATTERN DOTS-346' }, + [0x282D] = { unicodeslot=0x282D, category='so', description='BRAILLE PATTERN DOTS-1346' }, + [0x282E] = { unicodeslot=0x282E, category='so', description='BRAILLE PATTERN DOTS-2346' }, + [0x282F] = { unicodeslot=0x282F, category='so', description='BRAILLE PATTERN DOTS-12346' }, + [0x2830] = { unicodeslot=0x2830, category='so', description='BRAILLE PATTERN DOTS-56' }, + [0x2831] = { unicodeslot=0x2831, category='so', description='BRAILLE PATTERN DOTS-156' }, + [0x2832] = { unicodeslot=0x2832, category='so', description='BRAILLE PATTERN DOTS-256' }, + [0x2833] = { unicodeslot=0x2833, category='so', description='BRAILLE PATTERN DOTS-1256' }, + [0x2834] = { unicodeslot=0x2834, category='so', description='BRAILLE PATTERN DOTS-356' }, + [0x2835] = { unicodeslot=0x2835, category='so', description='BRAILLE PATTERN DOTS-1356' }, + [0x2836] = { unicodeslot=0x2836, category='so', description='BRAILLE PATTERN DOTS-2356' }, + [0x2837] = { unicodeslot=0x2837, category='so', description='BRAILLE PATTERN DOTS-12356' }, + [0x2838] = { unicodeslot=0x2838, category='so', description='BRAILLE PATTERN DOTS-456' }, + [0x2839] = { unicodeslot=0x2839, category='so', description='BRAILLE PATTERN DOTS-1456' }, + [0x283A] = { unicodeslot=0x283A, category='so', description='BRAILLE PATTERN DOTS-2456' }, + [0x283B] = { unicodeslot=0x283B, category='so', description='BRAILLE PATTERN DOTS-12456' }, + [0x283C] = { unicodeslot=0x283C, category='so', description='BRAILLE PATTERN DOTS-3456' }, + [0x283D] = { unicodeslot=0x283D, category='so', description='BRAILLE PATTERN DOTS-13456' }, + [0x283E] = { unicodeslot=0x283E, category='so', description='BRAILLE PATTERN DOTS-23456' }, + [0x283F] = { unicodeslot=0x283F, category='so', description='BRAILLE PATTERN DOTS-123456' }, + [0x2840] = { unicodeslot=0x2840, category='so', description='BRAILLE PATTERN DOTS-7' }, + [0x2841] = { unicodeslot=0x2841, category='so', description='BRAILLE PATTERN DOTS-17' }, + [0x2842] = { unicodeslot=0x2842, category='so', description='BRAILLE PATTERN DOTS-27' }, + [0x2843] = { unicodeslot=0x2843, category='so', description='BRAILLE PATTERN DOTS-127' }, + [0x2844] = { unicodeslot=0x2844, category='so', description='BRAILLE PATTERN DOTS-37' }, + [0x2845] = { unicodeslot=0x2845, category='so', description='BRAILLE PATTERN DOTS-137' }, + [0x2846] = { unicodeslot=0x2846, category='so', description='BRAILLE PATTERN DOTS-237' }, + [0x2847] = { unicodeslot=0x2847, category='so', description='BRAILLE PATTERN DOTS-1237' }, + [0x2848] = { unicodeslot=0x2848, category='so', description='BRAILLE PATTERN DOTS-47' }, + [0x2849] = { unicodeslot=0x2849, category='so', description='BRAILLE PATTERN DOTS-147' }, + [0x284A] = { unicodeslot=0x284A, category='so', description='BRAILLE PATTERN DOTS-247' }, + [0x284B] = { unicodeslot=0x284B, category='so', description='BRAILLE PATTERN DOTS-1247' }, + [0x284C] = { unicodeslot=0x284C, category='so', description='BRAILLE PATTERN DOTS-347' }, + [0x284D] = { unicodeslot=0x284D, category='so', description='BRAILLE PATTERN DOTS-1347' }, + [0x284E] = { unicodeslot=0x284E, category='so', description='BRAILLE PATTERN DOTS-2347' }, + [0x284F] = { unicodeslot=0x284F, category='so', description='BRAILLE PATTERN DOTS-12347' }, + [0x2850] = { unicodeslot=0x2850, category='so', description='BRAILLE PATTERN DOTS-57' }, + [0x2851] = { unicodeslot=0x2851, category='so', description='BRAILLE PATTERN DOTS-157' }, + [0x2852] = { unicodeslot=0x2852, category='so', description='BRAILLE PATTERN DOTS-257' }, + [0x2853] = { unicodeslot=0x2853, category='so', description='BRAILLE PATTERN DOTS-1257' }, + [0x2854] = { unicodeslot=0x2854, category='so', description='BRAILLE PATTERN DOTS-357' }, + [0x2855] = { unicodeslot=0x2855, category='so', description='BRAILLE PATTERN DOTS-1357' }, + [0x2856] = { unicodeslot=0x2856, category='so', description='BRAILLE PATTERN DOTS-2357' }, + [0x2857] = { unicodeslot=0x2857, category='so', description='BRAILLE PATTERN DOTS-12357' }, + [0x2858] = { unicodeslot=0x2858, category='so', description='BRAILLE PATTERN DOTS-457' }, + [0x2859] = { unicodeslot=0x2859, category='so', description='BRAILLE PATTERN DOTS-1457' }, + [0x285A] = { unicodeslot=0x285A, category='so', description='BRAILLE PATTERN DOTS-2457' }, + [0x285B] = { unicodeslot=0x285B, category='so', description='BRAILLE PATTERN DOTS-12457' }, + [0x285C] = { unicodeslot=0x285C, category='so', description='BRAILLE PATTERN DOTS-3457' }, + [0x285D] = { unicodeslot=0x285D, category='so', description='BRAILLE PATTERN DOTS-13457' }, + [0x285E] = { unicodeslot=0x285E, category='so', description='BRAILLE PATTERN DOTS-23457' }, + [0x285F] = { unicodeslot=0x285F, category='so', description='BRAILLE PATTERN DOTS-123457' }, + [0x2860] = { unicodeslot=0x2860, category='so', description='BRAILLE PATTERN DOTS-67' }, + [0x2861] = { unicodeslot=0x2861, category='so', description='BRAILLE PATTERN DOTS-167' }, + [0x2862] = { unicodeslot=0x2862, category='so', description='BRAILLE PATTERN DOTS-267' }, + [0x2863] = { unicodeslot=0x2863, category='so', description='BRAILLE PATTERN DOTS-1267' }, + [0x2864] = { unicodeslot=0x2864, category='so', description='BRAILLE PATTERN DOTS-367' }, + [0x2865] = { unicodeslot=0x2865, category='so', description='BRAILLE PATTERN DOTS-1367' }, + [0x2866] = { unicodeslot=0x2866, category='so', description='BRAILLE PATTERN DOTS-2367' }, + [0x2867] = { unicodeslot=0x2867, category='so', description='BRAILLE PATTERN DOTS-12367' }, + [0x2868] = { unicodeslot=0x2868, category='so', description='BRAILLE PATTERN DOTS-467' }, + [0x2869] = { unicodeslot=0x2869, category='so', description='BRAILLE PATTERN DOTS-1467' }, + [0x286A] = { unicodeslot=0x286A, category='so', description='BRAILLE PATTERN DOTS-2467' }, + [0x286B] = { unicodeslot=0x286B, category='so', description='BRAILLE PATTERN DOTS-12467' }, + [0x286C] = { unicodeslot=0x286C, category='so', description='BRAILLE PATTERN DOTS-3467' }, + [0x286D] = { unicodeslot=0x286D, category='so', description='BRAILLE PATTERN DOTS-13467' }, + [0x286E] = { unicodeslot=0x286E, category='so', description='BRAILLE PATTERN DOTS-23467' }, + [0x286F] = { unicodeslot=0x286F, category='so', description='BRAILLE PATTERN DOTS-123467' }, + [0x2870] = { unicodeslot=0x2870, category='so', description='BRAILLE PATTERN DOTS-567' }, + [0x2871] = { unicodeslot=0x2871, category='so', description='BRAILLE PATTERN DOTS-1567' }, + [0x2872] = { unicodeslot=0x2872, category='so', description='BRAILLE PATTERN DOTS-2567' }, + [0x2873] = { unicodeslot=0x2873, category='so', description='BRAILLE PATTERN DOTS-12567' }, + [0x2874] = { unicodeslot=0x2874, category='so', description='BRAILLE PATTERN DOTS-3567' }, + [0x2875] = { unicodeslot=0x2875, category='so', description='BRAILLE PATTERN DOTS-13567' }, + [0x2876] = { unicodeslot=0x2876, category='so', description='BRAILLE PATTERN DOTS-23567' }, + [0x2877] = { unicodeslot=0x2877, category='so', description='BRAILLE PATTERN DOTS-123567' }, + [0x2878] = { unicodeslot=0x2878, category='so', description='BRAILLE PATTERN DOTS-4567' }, + [0x2879] = { unicodeslot=0x2879, category='so', description='BRAILLE PATTERN DOTS-14567' }, + [0x287A] = { unicodeslot=0x287A, category='so', description='BRAILLE PATTERN DOTS-24567' }, + [0x287B] = { unicodeslot=0x287B, category='so', description='BRAILLE PATTERN DOTS-124567' }, + [0x287C] = { unicodeslot=0x287C, category='so', description='BRAILLE PATTERN DOTS-34567' }, + [0x287D] = { unicodeslot=0x287D, category='so', description='BRAILLE PATTERN DOTS-134567' }, + [0x287E] = { unicodeslot=0x287E, category='so', description='BRAILLE PATTERN DOTS-234567' }, + [0x287F] = { unicodeslot=0x287F, category='so', description='BRAILLE PATTERN DOTS-1234567' }, + [0x2880] = { unicodeslot=0x2880, category='so', description='BRAILLE PATTERN DOTS-8' }, + [0x2881] = { unicodeslot=0x2881, category='so', description='BRAILLE PATTERN DOTS-18' }, + [0x2882] = { unicodeslot=0x2882, category='so', description='BRAILLE PATTERN DOTS-28' }, + [0x2883] = { unicodeslot=0x2883, category='so', description='BRAILLE PATTERN DOTS-128' }, + [0x2884] = { unicodeslot=0x2884, category='so', description='BRAILLE PATTERN DOTS-38' }, + [0x2885] = { unicodeslot=0x2885, category='so', description='BRAILLE PATTERN DOTS-138' }, + [0x2886] = { unicodeslot=0x2886, category='so', description='BRAILLE PATTERN DOTS-238' }, + [0x2887] = { unicodeslot=0x2887, category='so', description='BRAILLE PATTERN DOTS-1238' }, + [0x2888] = { unicodeslot=0x2888, category='so', description='BRAILLE PATTERN DOTS-48' }, + [0x2889] = { unicodeslot=0x2889, category='so', description='BRAILLE PATTERN DOTS-148' }, + [0x288A] = { unicodeslot=0x288A, category='so', description='BRAILLE PATTERN DOTS-248' }, + [0x288B] = { unicodeslot=0x288B, category='so', description='BRAILLE PATTERN DOTS-1248' }, + [0x288C] = { unicodeslot=0x288C, category='so', description='BRAILLE PATTERN DOTS-348' }, + [0x288D] = { unicodeslot=0x288D, category='so', description='BRAILLE PATTERN DOTS-1348' }, + [0x288E] = { unicodeslot=0x288E, category='so', description='BRAILLE PATTERN DOTS-2348' }, + [0x288F] = { unicodeslot=0x288F, category='so', description='BRAILLE PATTERN DOTS-12348' }, + [0x2890] = { unicodeslot=0x2890, category='so', description='BRAILLE PATTERN DOTS-58' }, + [0x2891] = { unicodeslot=0x2891, category='so', description='BRAILLE PATTERN DOTS-158' }, + [0x2892] = { unicodeslot=0x2892, category='so', description='BRAILLE PATTERN DOTS-258' }, + [0x2893] = { unicodeslot=0x2893, category='so', description='BRAILLE PATTERN DOTS-1258' }, + [0x2894] = { unicodeslot=0x2894, category='so', description='BRAILLE PATTERN DOTS-358' }, + [0x2895] = { unicodeslot=0x2895, category='so', description='BRAILLE PATTERN DOTS-1358' }, + [0x2896] = { unicodeslot=0x2896, category='so', description='BRAILLE PATTERN DOTS-2358' }, + [0x2897] = { unicodeslot=0x2897, category='so', description='BRAILLE PATTERN DOTS-12358' }, + [0x2898] = { unicodeslot=0x2898, category='so', description='BRAILLE PATTERN DOTS-458' }, + [0x2899] = { unicodeslot=0x2899, category='so', description='BRAILLE PATTERN DOTS-1458' }, + [0x289A] = { unicodeslot=0x289A, category='so', description='BRAILLE PATTERN DOTS-2458' }, + [0x289B] = { unicodeslot=0x289B, category='so', description='BRAILLE PATTERN DOTS-12458' }, + [0x289C] = { unicodeslot=0x289C, category='so', description='BRAILLE PATTERN DOTS-3458' }, + [0x289D] = { unicodeslot=0x289D, category='so', description='BRAILLE PATTERN DOTS-13458' }, + [0x289E] = { unicodeslot=0x289E, category='so', description='BRAILLE PATTERN DOTS-23458' }, + [0x289F] = { unicodeslot=0x289F, category='so', description='BRAILLE PATTERN DOTS-123458' }, + [0x28A0] = { unicodeslot=0x28A0, category='so', description='BRAILLE PATTERN DOTS-68' }, + [0x28A1] = { unicodeslot=0x28A1, category='so', description='BRAILLE PATTERN DOTS-168' }, + [0x28A2] = { unicodeslot=0x28A2, category='so', description='BRAILLE PATTERN DOTS-268' }, + [0x28A3] = { unicodeslot=0x28A3, category='so', description='BRAILLE PATTERN DOTS-1268' }, + [0x28A4] = { unicodeslot=0x28A4, category='so', description='BRAILLE PATTERN DOTS-368' }, + [0x28A5] = { unicodeslot=0x28A5, category='so', description='BRAILLE PATTERN DOTS-1368' }, + [0x28A6] = { unicodeslot=0x28A6, category='so', description='BRAILLE PATTERN DOTS-2368' }, + [0x28A7] = { unicodeslot=0x28A7, category='so', description='BRAILLE PATTERN DOTS-12368' }, + [0x28A8] = { unicodeslot=0x28A8, category='so', description='BRAILLE PATTERN DOTS-468' }, + [0x28A9] = { unicodeslot=0x28A9, category='so', description='BRAILLE PATTERN DOTS-1468' }, + [0x28AA] = { unicodeslot=0x28AA, category='so', description='BRAILLE PATTERN DOTS-2468' }, + [0x28AB] = { unicodeslot=0x28AB, category='so', description='BRAILLE PATTERN DOTS-12468' }, + [0x28AC] = { unicodeslot=0x28AC, category='so', description='BRAILLE PATTERN DOTS-3468' }, + [0x28AD] = { unicodeslot=0x28AD, category='so', description='BRAILLE PATTERN DOTS-13468' }, + [0x28AE] = { unicodeslot=0x28AE, category='so', description='BRAILLE PATTERN DOTS-23468' }, + [0x28AF] = { unicodeslot=0x28AF, category='so', description='BRAILLE PATTERN DOTS-123468' }, + [0x28B0] = { unicodeslot=0x28B0, category='so', description='BRAILLE PATTERN DOTS-568' }, + [0x28B1] = { unicodeslot=0x28B1, category='so', description='BRAILLE PATTERN DOTS-1568' }, + [0x28B2] = { unicodeslot=0x28B2, category='so', description='BRAILLE PATTERN DOTS-2568' }, + [0x28B3] = { unicodeslot=0x28B3, category='so', description='BRAILLE PATTERN DOTS-12568' }, + [0x28B4] = { unicodeslot=0x28B4, category='so', description='BRAILLE PATTERN DOTS-3568' }, + [0x28B5] = { unicodeslot=0x28B5, category='so', description='BRAILLE PATTERN DOTS-13568' }, + [0x28B6] = { unicodeslot=0x28B6, category='so', description='BRAILLE PATTERN DOTS-23568' }, + [0x28B7] = { unicodeslot=0x28B7, category='so', description='BRAILLE PATTERN DOTS-123568' }, + [0x28B8] = { unicodeslot=0x28B8, category='so', description='BRAILLE PATTERN DOTS-4568' }, + [0x28B9] = { unicodeslot=0x28B9, category='so', description='BRAILLE PATTERN DOTS-14568' }, + [0x28BA] = { unicodeslot=0x28BA, category='so', description='BRAILLE PATTERN DOTS-24568' }, + [0x28BB] = { unicodeslot=0x28BB, category='so', description='BRAILLE PATTERN DOTS-124568' }, + [0x28BC] = { unicodeslot=0x28BC, category='so', description='BRAILLE PATTERN DOTS-34568' }, + [0x28BD] = { unicodeslot=0x28BD, category='so', description='BRAILLE PATTERN DOTS-134568' }, + [0x28BE] = { unicodeslot=0x28BE, category='so', description='BRAILLE PATTERN DOTS-234568' }, + [0x28BF] = { unicodeslot=0x28BF, category='so', description='BRAILLE PATTERN DOTS-1234568' }, + [0x28C0] = { unicodeslot=0x28C0, category='so', description='BRAILLE PATTERN DOTS-78' }, + [0x28C1] = { unicodeslot=0x28C1, category='so', description='BRAILLE PATTERN DOTS-178' }, + [0x28C2] = { unicodeslot=0x28C2, category='so', description='BRAILLE PATTERN DOTS-278' }, + [0x28C3] = { unicodeslot=0x28C3, category='so', description='BRAILLE PATTERN DOTS-1278' }, + [0x28C4] = { unicodeslot=0x28C4, category='so', description='BRAILLE PATTERN DOTS-378' }, + [0x28C5] = { unicodeslot=0x28C5, category='so', description='BRAILLE PATTERN DOTS-1378' }, + [0x28C6] = { unicodeslot=0x28C6, category='so', description='BRAILLE PATTERN DOTS-2378' }, + [0x28C7] = { unicodeslot=0x28C7, category='so', description='BRAILLE PATTERN DOTS-12378' }, + [0x28C8] = { unicodeslot=0x28C8, category='so', description='BRAILLE PATTERN DOTS-478' }, + [0x28C9] = { unicodeslot=0x28C9, category='so', description='BRAILLE PATTERN DOTS-1478' }, + [0x28CA] = { unicodeslot=0x28CA, category='so', description='BRAILLE PATTERN DOTS-2478' }, + [0x28CB] = { unicodeslot=0x28CB, category='so', description='BRAILLE PATTERN DOTS-12478' }, + [0x28CC] = { unicodeslot=0x28CC, category='so', description='BRAILLE PATTERN DOTS-3478' }, + [0x28CD] = { unicodeslot=0x28CD, category='so', description='BRAILLE PATTERN DOTS-13478' }, + [0x28CE] = { unicodeslot=0x28CE, category='so', description='BRAILLE PATTERN DOTS-23478' }, + [0x28CF] = { unicodeslot=0x28CF, category='so', description='BRAILLE PATTERN DOTS-123478' }, + [0x28D0] = { unicodeslot=0x28D0, category='so', description='BRAILLE PATTERN DOTS-578' }, + [0x28D1] = { unicodeslot=0x28D1, category='so', description='BRAILLE PATTERN DOTS-1578' }, + [0x28D2] = { unicodeslot=0x28D2, category='so', description='BRAILLE PATTERN DOTS-2578' }, + [0x28D3] = { unicodeslot=0x28D3, category='so', description='BRAILLE PATTERN DOTS-12578' }, + [0x28D4] = { unicodeslot=0x28D4, category='so', description='BRAILLE PATTERN DOTS-3578' }, + [0x28D5] = { unicodeslot=0x28D5, category='so', description='BRAILLE PATTERN DOTS-13578' }, + [0x28D6] = { unicodeslot=0x28D6, category='so', description='BRAILLE PATTERN DOTS-23578' }, + [0x28D7] = { unicodeslot=0x28D7, category='so', description='BRAILLE PATTERN DOTS-123578' }, + [0x28D8] = { unicodeslot=0x28D8, category='so', description='BRAILLE PATTERN DOTS-4578' }, + [0x28D9] = { unicodeslot=0x28D9, category='so', description='BRAILLE PATTERN DOTS-14578' }, + [0x28DA] = { unicodeslot=0x28DA, category='so', description='BRAILLE PATTERN DOTS-24578' }, + [0x28DB] = { unicodeslot=0x28DB, category='so', description='BRAILLE PATTERN DOTS-124578' }, + [0x28DC] = { unicodeslot=0x28DC, category='so', description='BRAILLE PATTERN DOTS-34578' }, + [0x28DD] = { unicodeslot=0x28DD, category='so', description='BRAILLE PATTERN DOTS-134578' }, + [0x28DE] = { unicodeslot=0x28DE, category='so', description='BRAILLE PATTERN DOTS-234578' }, + [0x28DF] = { unicodeslot=0x28DF, category='so', description='BRAILLE PATTERN DOTS-1234578' }, + [0x28E0] = { unicodeslot=0x28E0, category='so', description='BRAILLE PATTERN DOTS-678' }, + [0x28E1] = { unicodeslot=0x28E1, category='so', description='BRAILLE PATTERN DOTS-1678' }, + [0x28E2] = { unicodeslot=0x28E2, category='so', description='BRAILLE PATTERN DOTS-2678' }, + [0x28E3] = { unicodeslot=0x28E3, category='so', description='BRAILLE PATTERN DOTS-12678' }, + [0x28E4] = { unicodeslot=0x28E4, category='so', description='BRAILLE PATTERN DOTS-3678' }, + [0x28E5] = { unicodeslot=0x28E5, category='so', description='BRAILLE PATTERN DOTS-13678' }, + [0x28E6] = { unicodeslot=0x28E6, category='so', description='BRAILLE PATTERN DOTS-23678' }, + [0x28E7] = { unicodeslot=0x28E7, category='so', description='BRAILLE PATTERN DOTS-123678' }, + [0x28E8] = { unicodeslot=0x28E8, category='so', description='BRAILLE PATTERN DOTS-4678' }, + [0x28E9] = { unicodeslot=0x28E9, category='so', description='BRAILLE PATTERN DOTS-14678' }, + [0x28EA] = { unicodeslot=0x28EA, category='so', description='BRAILLE PATTERN DOTS-24678' }, + [0x28EB] = { unicodeslot=0x28EB, category='so', description='BRAILLE PATTERN DOTS-124678' }, + [0x28EC] = { unicodeslot=0x28EC, category='so', description='BRAILLE PATTERN DOTS-34678' }, + [0x28ED] = { unicodeslot=0x28ED, category='so', description='BRAILLE PATTERN DOTS-134678' }, + [0x28EE] = { unicodeslot=0x28EE, category='so', description='BRAILLE PATTERN DOTS-234678' }, + [0x28EF] = { unicodeslot=0x28EF, category='so', description='BRAILLE PATTERN DOTS-1234678' }, + [0x28F0] = { unicodeslot=0x28F0, category='so', description='BRAILLE PATTERN DOTS-5678' }, + [0x28F1] = { unicodeslot=0x28F1, category='so', description='BRAILLE PATTERN DOTS-15678' }, + [0x28F2] = { unicodeslot=0x28F2, category='so', description='BRAILLE PATTERN DOTS-25678' }, + [0x28F3] = { unicodeslot=0x28F3, category='so', description='BRAILLE PATTERN DOTS-125678' }, + [0x28F4] = { unicodeslot=0x28F4, category='so', description='BRAILLE PATTERN DOTS-35678' }, + [0x28F5] = { unicodeslot=0x28F5, category='so', description='BRAILLE PATTERN DOTS-135678' }, + [0x28F6] = { unicodeslot=0x28F6, category='so', description='BRAILLE PATTERN DOTS-235678' }, + [0x28F7] = { unicodeslot=0x28F7, category='so', description='BRAILLE PATTERN DOTS-1235678' }, + [0x28F8] = { unicodeslot=0x28F8, category='so', description='BRAILLE PATTERN DOTS-45678' }, + [0x28F9] = { unicodeslot=0x28F9, category='so', description='BRAILLE PATTERN DOTS-145678' }, + [0x28FA] = { unicodeslot=0x28FA, category='so', description='BRAILLE PATTERN DOTS-245678' }, + [0x28FB] = { unicodeslot=0x28FB, category='so', description='BRAILLE PATTERN DOTS-1245678' }, + [0x28FC] = { unicodeslot=0x28FC, category='so', description='BRAILLE PATTERN DOTS-345678' }, + [0x28FD] = { unicodeslot=0x28FD, category='so', description='BRAILLE PATTERN DOTS-1345678' }, + [0x28FE] = { unicodeslot=0x28FE, category='so', description='BRAILLE PATTERN DOTS-2345678' }, + [0x28FF] = { unicodeslot=0x28FF, category='so', description='BRAILLE PATTERN DOTS-12345678' }, + [0x2900] = { unicodeslot=0x2900, category='sm', description='RIGHTWARDS TWO-HEADED ARROW WITH VERTICAL STROKE' }, + [0x2901] = { unicodeslot=0x2901, category='sm', description='RIGHTWARDS TWO-HEADED ARROW WITH DOUBLE VERTICAL STROKE' }, + [0x2902] = { unicodeslot=0x2902, category='sm', description='LEFTWARDS DOUBLE ARROW WITH VERTICAL STROKE' }, + [0x2903] = { unicodeslot=0x2903, category='sm', description='RIGHTWARDS DOUBLE ARROW WITH VERTICAL STROKE' }, + [0x2904] = { unicodeslot=0x2904, category='sm', description='LEFT RIGHT DOUBLE ARROW WITH VERTICAL STROKE' }, + [0x2905] = { unicodeslot=0x2905, category='sm', description='RIGHTWARDS TWO-HEADED ARROW FROM BAR' }, + [0x2906] = { unicodeslot=0x2906, category='sm', description='LEFTWARDS DOUBLE ARROW FROM BAR' }, + [0x2907] = { unicodeslot=0x2907, category='sm', description='RIGHTWARDS DOUBLE ARROW FROM BAR' }, + [0x2908] = { unicodeslot=0x2908, category='sm', description='DOWNWARDS ARROW WITH HORIZONTAL STROKE' }, + [0x2909] = { unicodeslot=0x2909, category='sm', description='UPWARDS ARROW WITH HORIZONTAL STROKE' }, + [0x290A] = { unicodeslot=0x290A, category='sm', description='UPWARDS TRIPLE ARROW' }, + [0x290B] = { unicodeslot=0x290B, category='sm', description='DOWNWARDS TRIPLE ARROW' }, + [0x290C] = { unicodeslot=0x290C, category='sm', description='LEFTWARDS DOUBLE DASH ARROW' }, + [0x290D] = { unicodeslot=0x290D, category='sm', description='RIGHTWARDS DOUBLE DASH ARROW' }, + [0x290E] = { unicodeslot=0x290E, category='sm', description='LEFTWARDS TRIPLE DASH ARROW' }, + [0x290F] = { unicodeslot=0x290F, category='sm', description='RIGHTWARDS TRIPLE DASH ARROW' }, + [0x2910] = { unicodeslot=0x2910, category='sm', description='RIGHTWARDS TWO-HEADED TRIPLE DASH ARROW' }, + [0x2911] = { unicodeslot=0x2911, category='sm', description='RIGHTWARDS ARROW WITH DOTTED STEM' }, + [0x2912] = { unicodeslot=0x2912, category='sm', description='UPWARDS ARROW TO BAR' }, + [0x2913] = { unicodeslot=0x2913, category='sm', description='DOWNWARDS ARROW TO BAR' }, + [0x2914] = { unicodeslot=0x2914, category='sm', description='RIGHTWARDS ARROW WITH TAIL WITH VERTICAL STROKE' }, + [0x2915] = { unicodeslot=0x2915, category='sm', description='RIGHTWARDS ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE' }, + [0x2916] = { unicodeslot=0x2916, category='sm', description='RIGHTWARDS TWO-HEADED ARROW WITH TAIL' }, + [0x2917] = { unicodeslot=0x2917, category='sm', description='RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH VERTICAL STROKE' }, + [0x2918] = { unicodeslot=0x2918, category='sm', description='RIGHTWARDS TWO-HEADED ARROW WITH TAIL WITH DOUBLE VERTICAL STROKE' }, + [0x2919] = { unicodeslot=0x2919, category='sm', description='LEFTWARDS ARROW-TAIL' }, + [0x291A] = { unicodeslot=0x291A, category='sm', description='RIGHTWARDS ARROW-TAIL' }, + [0x291B] = { unicodeslot=0x291B, category='sm', description='LEFTWARDS DOUBLE ARROW-TAIL' }, + [0x291C] = { unicodeslot=0x291C, category='sm', description='RIGHTWARDS DOUBLE ARROW-TAIL' }, + [0x291D] = { unicodeslot=0x291D, category='sm', description='LEFTWARDS ARROW TO BLACK DIAMOND' }, + [0x291E] = { unicodeslot=0x291E, category='sm', description='RIGHTWARDS ARROW TO BLACK DIAMOND' }, + [0x291F] = { unicodeslot=0x291F, category='sm', description='LEFTWARDS ARROW FROM BAR TO BLACK DIAMOND' }, + [0x2920] = { unicodeslot=0x2920, category='sm', description='RIGHTWARDS ARROW FROM BAR TO BLACK DIAMOND' }, + [0x2921] = { unicodeslot=0x2921, category='sm', description='NORTH WEST AND SOUTH EAST ARROW' }, + [0x2922] = { unicodeslot=0x2922, category='sm', description='NORTH EAST AND SOUTH WEST ARROW' }, + [0x2923] = { unicodeslot=0x2923, category='sm', description='NORTH WEST ARROW WITH HOOK' }, + [0x2924] = { unicodeslot=0x2924, category='sm', description='NORTH EAST ARROW WITH HOOK' }, + [0x2925] = { unicodeslot=0x2925, category='sm', description='SOUTH EAST ARROW WITH HOOK' }, + [0x2926] = { unicodeslot=0x2926, category='sm', description='SOUTH WEST ARROW WITH HOOK' }, + [0x2927] = { unicodeslot=0x2927, category='sm', description='NORTH WEST ARROW AND NORTH EAST ARROW' }, + [0x2928] = { unicodeslot=0x2928, category='sm', description='NORTH EAST ARROW AND SOUTH EAST ARROW' }, + [0x2929] = { unicodeslot=0x2929, category='sm', description='SOUTH EAST ARROW AND SOUTH WEST ARROW' }, + [0x292A] = { unicodeslot=0x292A, category='sm', description='SOUTH WEST ARROW AND NORTH WEST ARROW' }, + [0x292B] = { unicodeslot=0x292B, category='sm', description='RISING DIAGONAL CROSSING FALLING DIAGONAL' }, + [0x292C] = { unicodeslot=0x292C, category='sm', description='FALLING DIAGONAL CROSSING RISING DIAGONAL' }, + [0x292D] = { unicodeslot=0x292D, category='sm', description='SOUTH EAST ARROW CROSSING NORTH EAST ARROW' }, + [0x292E] = { unicodeslot=0x292E, category='sm', description='NORTH EAST ARROW CROSSING SOUTH EAST ARROW' }, + [0x292F] = { unicodeslot=0x292F, category='sm', description='FALLING DIAGONAL CROSSING NORTH EAST ARROW' }, + [0x2930] = { unicodeslot=0x2930, category='sm', description='RISING DIAGONAL CROSSING SOUTH EAST ARROW' }, + [0x2931] = { unicodeslot=0x2931, category='sm', description='NORTH EAST ARROW CROSSING NORTH WEST ARROW' }, + [0x2932] = { unicodeslot=0x2932, category='sm', description='NORTH WEST ARROW CROSSING NORTH EAST ARROW' }, + [0x2933] = { unicodeslot=0x2933, category='sm', description='WAVE ARROW POINTING DIRECTLY RIGHT' }, + [0x2934] = { unicodeslot=0x2934, category='sm', description='ARROW POINTING RIGHTWARDS THEN CURVING UPWARDS' }, + [0x2935] = { unicodeslot=0x2935, category='sm', description='ARROW POINTING RIGHTWARDS THEN CURVING DOWNWARDS' }, + [0x2936] = { unicodeslot=0x2936, category='sm', description='ARROW POINTING DOWNWARDS THEN CURVING LEFTWARDS' }, + [0x2937] = { unicodeslot=0x2937, category='sm', description='ARROW POINTING DOWNWARDS THEN CURVING RIGHTWARDS' }, + [0x2938] = { unicodeslot=0x2938, category='sm', description='RIGHT-SIDE ARC CLOCKWISE ARROW' }, + [0x2939] = { unicodeslot=0x2939, category='sm', description='LEFT-SIDE ARC ANTICLOCKWISE ARROW' }, + [0x293A] = { unicodeslot=0x293A, category='sm', description='TOP ARC ANTICLOCKWISE ARROW' }, + [0x293B] = { unicodeslot=0x293B, category='sm', description='BOTTOM ARC ANTICLOCKWISE ARROW' }, + [0x293C] = { unicodeslot=0x293C, category='sm', description='TOP ARC CLOCKWISE ARROW WITH MINUS' }, + [0x293D] = { unicodeslot=0x293D, category='sm', description='TOP ARC ANTICLOCKWISE ARROW WITH PLUS' }, + [0x293E] = { unicodeslot=0x293E, category='sm', description='LOWER RIGHT SEMICIRCULAR CLOCKWISE ARROW' }, + [0x293F] = { unicodeslot=0x293F, category='sm', description='LOWER LEFT SEMICIRCULAR ANTICLOCKWISE ARROW' }, + [0x2940] = { unicodeslot=0x2940, category='sm', description='ANTICLOCKWISE CLOSED CIRCLE ARROW' }, + [0x2941] = { unicodeslot=0x2941, category='sm', description='CLOCKWISE CLOSED CIRCLE ARROW' }, + [0x2942] = { unicodeslot=0x2942, category='sm', description='RIGHTWARDS ARROW ABOVE SHORT LEFTWARDS ARROW' }, + [0x2943] = { unicodeslot=0x2943, category='sm', description='LEFTWARDS ARROW ABOVE SHORT RIGHTWARDS ARROW' }, + [0x2944] = { unicodeslot=0x2944, category='sm', description='SHORT RIGHTWARDS ARROW ABOVE LEFTWARDS ARROW' }, + [0x2945] = { unicodeslot=0x2945, category='sm', description='RIGHTWARDS ARROW WITH PLUS BELOW' }, + [0x2946] = { unicodeslot=0x2946, category='sm', description='LEFTWARDS ARROW WITH PLUS BELOW' }, + [0x2947] = { unicodeslot=0x2947, category='sm', description='RIGHTWARDS ARROW THROUGH X' }, + [0x2948] = { unicodeslot=0x2948, category='sm', description='LEFT RIGHT ARROW THROUGH SMALL CIRCLE' }, + [0x2949] = { unicodeslot=0x2949, category='sm', description='UPWARDS TWO-HEADED ARROW FROM SMALL CIRCLE' }, + [0x294A] = { unicodeslot=0x294A, category='sm', description='LEFT BARB UP RIGHT BARB DOWN HARPOON' }, + [0x294B] = { unicodeslot=0x294B, category='sm', description='LEFT BARB DOWN RIGHT BARB UP HARPOON' }, + [0x294C] = { unicodeslot=0x294C, category='sm', description='UP BARB RIGHT DOWN BARB LEFT HARPOON' }, + [0x294D] = { unicodeslot=0x294D, category='sm', description='UP BARB LEFT DOWN BARB RIGHT HARPOON' }, + [0x294E] = { unicodeslot=0x294E, category='sm', description='LEFT BARB UP RIGHT BARB UP HARPOON' }, + [0x294F] = { unicodeslot=0x294F, category='sm', description='UP BARB RIGHT DOWN BARB RIGHT HARPOON' }, + [0x2950] = { unicodeslot=0x2950, category='sm', description='LEFT BARB DOWN RIGHT BARB DOWN HARPOON' }, + [0x2951] = { unicodeslot=0x2951, category='sm', description='UP BARB LEFT DOWN BARB LEFT HARPOON' }, + [0x2952] = { unicodeslot=0x2952, category='sm', description='LEFTWARDS HARPOON WITH BARB UP TO BAR' }, + [0x2953] = { unicodeslot=0x2953, category='sm', description='RIGHTWARDS HARPOON WITH BARB UP TO BAR' }, + [0x2954] = { unicodeslot=0x2954, category='sm', description='UPWARDS HARPOON WITH BARB RIGHT TO BAR' }, + [0x2955] = { unicodeslot=0x2955, category='sm', description='DOWNWARDS HARPOON WITH BARB RIGHT TO BAR' }, + [0x2956] = { unicodeslot=0x2956, category='sm', description='LEFTWARDS HARPOON WITH BARB DOWN TO BAR' }, + [0x2957] = { unicodeslot=0x2957, category='sm', description='RIGHTWARDS HARPOON WITH BARB DOWN TO BAR' }, + [0x2958] = { unicodeslot=0x2958, category='sm', description='UPWARDS HARPOON WITH BARB LEFT TO BAR' }, + [0x2959] = { unicodeslot=0x2959, category='sm', description='DOWNWARDS HARPOON WITH BARB LEFT TO BAR' }, + [0x295A] = { unicodeslot=0x295A, category='sm', description='LEFTWARDS HARPOON WITH BARB UP FROM BAR' }, + [0x295B] = { unicodeslot=0x295B, category='sm', description='RIGHTWARDS HARPOON WITH BARB UP FROM BAR' }, + [0x295C] = { unicodeslot=0x295C, category='sm', description='UPWARDS HARPOON WITH BARB RIGHT FROM BAR' }, + [0x295D] = { unicodeslot=0x295D, category='sm', description='DOWNWARDS HARPOON WITH BARB RIGHT FROM BAR' }, + [0x295E] = { unicodeslot=0x295E, category='sm', description='LEFTWARDS HARPOON WITH BARB DOWN FROM BAR' }, + [0x295F] = { unicodeslot=0x295F, category='sm', description='RIGHTWARDS HARPOON WITH BARB DOWN FROM BAR' }, + [0x2960] = { unicodeslot=0x2960, category='sm', description='UPWARDS HARPOON WITH BARB LEFT FROM BAR' }, + [0x2961] = { unicodeslot=0x2961, category='sm', description='DOWNWARDS HARPOON WITH BARB LEFT FROM BAR' }, + [0x2962] = { unicodeslot=0x2962, category='sm', description='LEFTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB DOWN' }, + [0x2963] = { unicodeslot=0x2963, category='sm', description='UPWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT' }, + [0x2964] = { unicodeslot=0x2964, category='sm', description='RIGHTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB DOWN' }, + [0x2965] = { unicodeslot=0x2965, category='sm', description='DOWNWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT' }, + [0x2966] = { unicodeslot=0x2966, category='sm', description='LEFTWARDS HARPOON WITH BARB UP ABOVE RIGHTWARDS HARPOON WITH BARB UP' }, + [0x2967] = { unicodeslot=0x2967, category='sm', description='LEFTWARDS HARPOON WITH BARB DOWN ABOVE RIGHTWARDS HARPOON WITH BARB DOWN' }, + [0x2968] = { unicodeslot=0x2968, category='sm', description='RIGHTWARDS HARPOON WITH BARB UP ABOVE LEFTWARDS HARPOON WITH BARB UP' }, + [0x2969] = { unicodeslot=0x2969, category='sm', description='RIGHTWARDS HARPOON WITH BARB DOWN ABOVE LEFTWARDS HARPOON WITH BARB DOWN' }, + [0x296A] = { unicodeslot=0x296A, category='sm', description='LEFTWARDS HARPOON WITH BARB UP ABOVE LONG DASH' }, + [0x296B] = { unicodeslot=0x296B, category='sm', description='LEFTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH' }, + [0x296C] = { unicodeslot=0x296C, category='sm', description='RIGHTWARDS HARPOON WITH BARB UP ABOVE LONG DASH' }, + [0x296D] = { unicodeslot=0x296D, category='sm', description='RIGHTWARDS HARPOON WITH BARB DOWN BELOW LONG DASH' }, + [0x296E] = { unicodeslot=0x296E, category='sm', description='UPWARDS HARPOON WITH BARB LEFT BESIDE DOWNWARDS HARPOON WITH BARB RIGHT' }, + [0x296F] = { unicodeslot=0x296F, category='sm', description='DOWNWARDS HARPOON WITH BARB LEFT BESIDE UPWARDS HARPOON WITH BARB RIGHT' }, + [0x2970] = { unicodeslot=0x2970, category='sm', description='RIGHT DOUBLE ARROW WITH ROUNDED HEAD' }, + [0x2971] = { unicodeslot=0x2971, category='sm', description='EQUALS SIGN ABOVE RIGHTWARDS ARROW' }, + [0x2972] = { unicodeslot=0x2972, category='sm', description='TILDE OPERATOR ABOVE RIGHTWARDS ARROW' }, + [0x2973] = { unicodeslot=0x2973, category='sm', description='LEFTWARDS ARROW ABOVE TILDE OPERATOR' }, + [0x2974] = { unicodeslot=0x2974, category='sm', description='RIGHTWARDS ARROW ABOVE TILDE OPERATOR' }, + [0x2975] = { unicodeslot=0x2975, category='sm', description='RIGHTWARDS ARROW ABOVE ALMOST EQUAL TO' }, + [0x2976] = { unicodeslot=0x2976, category='sm', description='LESS-THAN ABOVE LEFTWARDS ARROW' }, + [0x2977] = { unicodeslot=0x2977, category='sm', description='LEFTWARDS ARROW THROUGH LESS-THAN' }, + [0x2978] = { unicodeslot=0x2978, category='sm', description='GREATER-THAN ABOVE RIGHTWARDS ARROW' }, + [0x2979] = { unicodeslot=0x2979, category='sm', description='SUBSET ABOVE RIGHTWARDS ARROW' }, + [0x297A] = { unicodeslot=0x297A, category='sm', description='LEFTWARDS ARROW THROUGH SUBSET' }, + [0x297B] = { unicodeslot=0x297B, category='sm', description='SUPERSET ABOVE LEFTWARDS ARROW' }, + [0x297C] = { unicodeslot=0x297C, category='sm', description='LEFT FISH TAIL' }, + [0x297D] = { unicodeslot=0x297D, category='sm', description='RIGHT FISH TAIL' }, + [0x297E] = { unicodeslot=0x297E, category='sm', description='UP FISH TAIL' }, + [0x297F] = { unicodeslot=0x297F, category='sm', description='DOWN FISH TAIL' }, + [0x2980] = { unicodeslot=0x2980, category='sm', description='TRIPLE VERTICAL BAR DELIMITER' }, + [0x2981] = { unicodeslot=0x2981, category='sm', description='Z NOTATION SPOT' }, + [0x2982] = { unicodeslot=0x2982, category='sm', description='Z NOTATION TYPE COLON' }, + [0x2983] = { unicodeslot=0x2983, category='ps', description='LEFT WHITE CURLY BRACKET' }, + [0x2984] = { unicodeslot=0x2984, category='pe', description='RIGHT WHITE CURLY BRACKET' }, + [0x2985] = { unicodeslot=0x2985, category='ps', description='LEFT WHITE PARENTHESIS' }, + [0x2986] = { unicodeslot=0x2986, category='pe', description='RIGHT WHITE PARENTHESIS' }, + [0x2987] = { unicodeslot=0x2987, category='ps', description='Z NOTATION LEFT IMAGE BRACKET' }, + [0x2988] = { unicodeslot=0x2988, category='pe', description='Z NOTATION RIGHT IMAGE BRACKET' }, + [0x2989] = { unicodeslot=0x2989, category='ps', description='Z NOTATION LEFT BINDING BRACKET' }, + [0x298A] = { unicodeslot=0x298A, category='pe', description='Z NOTATION RIGHT BINDING BRACKET' }, + [0x298B] = { unicodeslot=0x298B, category='ps', description='LEFT SQUARE BRACKET WITH UNDERBAR' }, + [0x298C] = { unicodeslot=0x298C, category='pe', description='RIGHT SQUARE BRACKET WITH UNDERBAR' }, + [0x298D] = { unicodeslot=0x298D, category='ps', description='LEFT SQUARE BRACKET WITH TICK IN TOP CORNER' }, + [0x298E] = { unicodeslot=0x298E, category='pe', description='RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER' }, + [0x298F] = { unicodeslot=0x298F, category='ps', description='LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER' }, + [0x2990] = { unicodeslot=0x2990, category='pe', description='RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER' }, + [0x2991] = { unicodeslot=0x2991, category='ps', description='LEFT ANGLE BRACKET WITH DOT' }, + [0x2992] = { unicodeslot=0x2992, category='pe', description='RIGHT ANGLE BRACKET WITH DOT' }, + [0x2993] = { unicodeslot=0x2993, category='ps', description='LEFT ARC LESS-THAN BRACKET' }, + [0x2994] = { unicodeslot=0x2994, category='pe', description='RIGHT ARC GREATER-THAN BRACKET' }, + [0x2995] = { unicodeslot=0x2995, category='ps', description='DOUBLE LEFT ARC GREATER-THAN BRACKET' }, + [0x2996] = { unicodeslot=0x2996, category='pe', description='DOUBLE RIGHT ARC LESS-THAN BRACKET' }, + [0x2997] = { unicodeslot=0x2997, category='ps', description='LEFT BLACK TORTOISE SHELL BRACKET' }, + [0x2998] = { unicodeslot=0x2998, category='pe', description='RIGHT BLACK TORTOISE SHELL BRACKET' }, + [0x2999] = { unicodeslot=0x2999, category='sm', description='DOTTED FENCE' }, + [0x299A] = { unicodeslot=0x299A, category='sm', description='VERTICAL ZIGZAG LINE' }, + [0x299B] = { unicodeslot=0x299B, category='sm', description='MEASURED ANGLE OPENING LEFT' }, + [0x299C] = { unicodeslot=0x299C, category='sm', description='RIGHT ANGLE VARIANT WITH SQUARE' }, + [0x299D] = { unicodeslot=0x299D, category='sm', description='MEASURED RIGHT ANGLE WITH DOT' }, + [0x299E] = { unicodeslot=0x299E, category='sm', description='ANGLE WITH S INSIDE' }, + [0x299F] = { unicodeslot=0x299F, category='sm', description='ACUTE ANGLE' }, + [0x29A0] = { unicodeslot=0x29A0, category='sm', description='SPHERICAL ANGLE OPENING LEFT' }, + [0x29A1] = { unicodeslot=0x29A1, category='sm', description='SPHERICAL ANGLE OPENING UP' }, + [0x29A2] = { unicodeslot=0x29A2, category='sm', description='TURNED ANGLE' }, + [0x29A3] = { unicodeslot=0x29A3, category='sm', description='REVERSED ANGLE' }, + [0x29A4] = { unicodeslot=0x29A4, category='sm', description='ANGLE WITH UNDERBAR' }, + [0x29A5] = { unicodeslot=0x29A5, category='sm', description='REVERSED ANGLE WITH UNDERBAR' }, + [0x29A6] = { unicodeslot=0x29A6, category='sm', description='OBLIQUE ANGLE OPENING UP' }, + [0x29A7] = { unicodeslot=0x29A7, category='sm', description='OBLIQUE ANGLE OPENING DOWN' }, + [0x29A8] = { unicodeslot=0x29A8, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND RIGHT' }, + [0x29A9] = { unicodeslot=0x29A9, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING UP AND LEFT' }, + [0x29AA] = { unicodeslot=0x29AA, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND RIGHT' }, + [0x29AB] = { unicodeslot=0x29AB, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING DOWN AND LEFT' }, + [0x29AC] = { unicodeslot=0x29AC, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND UP' }, + [0x29AD] = { unicodeslot=0x29AD, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND UP' }, + [0x29AE] = { unicodeslot=0x29AE, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING RIGHT AND DOWN' }, + [0x29AF] = { unicodeslot=0x29AF, category='sm', description='MEASURED ANGLE WITH OPEN ARM ENDING IN ARROW POINTING LEFT AND DOWN' }, + [0x29B0] = { unicodeslot=0x29B0, category='sm', description='REVERSED EMPTY SET' }, + [0x29B1] = { unicodeslot=0x29B1, category='sm', description='EMPTY SET WITH OVERBAR' }, + [0x29B2] = { unicodeslot=0x29B2, category='sm', description='EMPTY SET WITH SMALL CIRCLE ABOVE' }, + [0x29B3] = { unicodeslot=0x29B3, category='sm', description='EMPTY SET WITH RIGHT ARROW ABOVE' }, + [0x29B4] = { unicodeslot=0x29B4, category='sm', description='EMPTY SET WITH LEFT ARROW ABOVE' }, + [0x29B5] = { unicodeslot=0x29B5, category='sm', description='CIRCLE WITH HORIZONTAL BAR' }, + [0x29B6] = { unicodeslot=0x29B6, category='sm', description='CIRCLED VERTICAL BAR' }, + [0x29B7] = { unicodeslot=0x29B7, category='sm', description='CIRCLED PARALLEL' }, + [0x29B8] = { unicodeslot=0x29B8, category='sm', description='CIRCLED REVERSE SOLIDUS' }, + [0x29B9] = { unicodeslot=0x29B9, category='sm', description='CIRCLED PERPENDICULAR' }, + [0x29BA] = { unicodeslot=0x29BA, category='sm', description='CIRCLE DIVIDED BY HORIZONTAL BAR AND TOP HALF DIVIDED BY VERTICAL BAR' }, + [0x29BB] = { unicodeslot=0x29BB, category='sm', description='CIRCLE WITH SUPERIMPOSED X' }, + [0x29BC] = { unicodeslot=0x29BC, category='sm', description='CIRCLED ANTICLOCKWISE-ROTATED DIVISION SIGN' }, + [0x29BD] = { unicodeslot=0x29BD, category='sm', description='UP ARROW THROUGH CIRCLE' }, + [0x29BE] = { unicodeslot=0x29BE, category='sm', description='CIRCLED WHITE BULLET' }, + [0x29BF] = { unicodeslot=0x29BF, category='sm', description='CIRCLED BULLET' }, + [0x29C0] = { unicodeslot=0x29C0, category='sm', description='CIRCLED LESS-THAN' }, + [0x29C1] = { unicodeslot=0x29C1, category='sm', description='CIRCLED GREATER-THAN' }, + [0x29C2] = { unicodeslot=0x29C2, category='sm', description='CIRCLE WITH SMALL CIRCLE TO THE RIGHT' }, + [0x29C3] = { unicodeslot=0x29C3, category='sm', description='CIRCLE WITH TWO HORIZONTAL STROKES TO THE RIGHT' }, + [0x29C4] = { unicodeslot=0x29C4, category='sm', description='SQUARED RISING DIAGONAL SLASH' }, + [0x29C5] = { unicodeslot=0x29C5, category='sm', description='SQUARED FALLING DIAGONAL SLASH' }, + [0x29C6] = { unicodeslot=0x29C6, category='sm', description='SQUARED ASTERISK' }, + [0x29C7] = { unicodeslot=0x29C7, category='sm', description='SQUARED SMALL CIRCLE' }, + [0x29C8] = { unicodeslot=0x29C8, category='sm', description='SQUARED SQUARE' }, + [0x29C9] = { unicodeslot=0x29C9, category='sm', description='TWO JOINED SQUARES' }, + [0x29CA] = { unicodeslot=0x29CA, category='sm', description='TRIANGLE WITH DOT ABOVE' }, + [0x29CB] = { unicodeslot=0x29CB, category='sm', description='TRIANGLE WITH UNDERBAR' }, + [0x29CC] = { unicodeslot=0x29CC, category='sm', description='S IN TRIANGLE' }, + [0x29CD] = { unicodeslot=0x29CD, category='sm', description='TRIANGLE WITH SERIFS AT BOTTOM' }, + [0x29CE] = { unicodeslot=0x29CE, category='sm', description='RIGHT TRIANGLE ABOVE LEFT TRIANGLE' }, + [0x29CF] = { unicodeslot=0x29CF, category='sm', description='LEFT TRIANGLE BESIDE VERTICAL BAR' }, + [0x29D0] = { unicodeslot=0x29D0, category='sm', description='VERTICAL BAR BESIDE RIGHT TRIANGLE' }, + [0x29D1] = { unicodeslot=0x29D1, category='sm', description='BOWTIE WITH LEFT HALF BLACK' }, + [0x29D2] = { unicodeslot=0x29D2, category='sm', description='BOWTIE WITH RIGHT HALF BLACK' }, + [0x29D3] = { unicodeslot=0x29D3, category='sm', description='BLACK BOWTIE' }, + [0x29D4] = { unicodeslot=0x29D4, category='sm', description='TIMES WITH LEFT HALF BLACK' }, + [0x29D5] = { unicodeslot=0x29D5, category='sm', description='TIMES WITH RIGHT HALF BLACK' }, + [0x29D6] = { unicodeslot=0x29D6, category='sm', description='WHITE HOURGLASS' }, + [0x29D7] = { unicodeslot=0x29D7, category='sm', description='BLACK HOURGLASS' }, + [0x29D8] = { unicodeslot=0x29D8, category='ps', description='LEFT WIGGLY FENCE' }, + [0x29D9] = { unicodeslot=0x29D9, category='pe', description='RIGHT WIGGLY FENCE' }, + [0x29DA] = { unicodeslot=0x29DA, category='ps', description='LEFT DOUBLE WIGGLY FENCE' }, + [0x29DB] = { unicodeslot=0x29DB, category='pe', description='RIGHT DOUBLE WIGGLY FENCE' }, + [0x29DC] = { unicodeslot=0x29DC, category='sm', description='INCOMPLETE INFINITY' }, + [0x29DD] = { unicodeslot=0x29DD, category='sm', description='TIE OVER INFINITY' }, + [0x29DE] = { unicodeslot=0x29DE, category='sm', description='INFINITY NEGATED WITH VERTICAL BAR' }, + [0x29DF] = { unicodeslot=0x29DF, category='sm', description='DOUBLE-ENDED MULTIMAP' }, + [0x29E0] = { unicodeslot=0x29E0, category='sm', description='SQUARE WITH CONTOURED OUTLINE' }, + [0x29E1] = { unicodeslot=0x29E1, category='sm', description='INCREASES AS' }, + [0x29E2] = { unicodeslot=0x29E2, category='sm', description='SHUFFLE PRODUCT' }, + [0x29E3] = { unicodeslot=0x29E3, category='sm', description='EQUALS SIGN AND SLANTED PARALLEL' }, + [0x29E4] = { unicodeslot=0x29E4, category='sm', description='EQUALS SIGN AND SLANTED PARALLEL WITH TILDE ABOVE' }, + [0x29E5] = { unicodeslot=0x29E5, category='sm', description='IDENTICAL TO AND SLANTED PARALLEL' }, + [0x29E6] = { unicodeslot=0x29E6, category='sm', description='GLEICH STARK' }, + [0x29E7] = { unicodeslot=0x29E7, category='sm', description='THERMODYNAMIC' }, + [0x29E8] = { unicodeslot=0x29E8, category='sm', description='DOWN-POINTING TRIANGLE WITH LEFT HALF BLACK' }, + [0x29E9] = { unicodeslot=0x29E9, category='sm', description='DOWN-POINTING TRIANGLE WITH RIGHT HALF BLACK' }, + [0x29EA] = { unicodeslot=0x29EA, category='sm', description='BLACK DIAMOND WITH DOWN ARROW' }, + [0x29EB] = { unicodeslot=0x29EB, category='sm', description='BLACK LOZENGE' }, + [0x29EC] = { unicodeslot=0x29EC, category='sm', description='WHITE CIRCLE WITH DOWN ARROW' }, + [0x29ED] = { unicodeslot=0x29ED, category='sm', description='BLACK CIRCLE WITH DOWN ARROW' }, + [0x29EE] = { unicodeslot=0x29EE, category='sm', description='ERROR-BARRED WHITE SQUARE' }, + [0x29EF] = { unicodeslot=0x29EF, category='sm', description='ERROR-BARRED BLACK SQUARE' }, + [0x29F0] = { unicodeslot=0x29F0, category='sm', description='ERROR-BARRED WHITE DIAMOND' }, + [0x29F1] = { unicodeslot=0x29F1, category='sm', description='ERROR-BARRED BLACK DIAMOND' }, + [0x29F2] = { unicodeslot=0x29F2, category='sm', description='ERROR-BARRED WHITE CIRCLE' }, + [0x29F3] = { unicodeslot=0x29F3, category='sm', description='ERROR-BARRED BLACK CIRCLE' }, + [0x29F4] = { unicodeslot=0x29F4, category='sm', description='RULE-DELAYED' }, + [0x29F5] = { unicodeslot=0x29F5, category='sm', description='REVERSE SOLIDUS OPERATOR' }, + [0x29F6] = { unicodeslot=0x29F6, category='sm', description='SOLIDUS WITH OVERBAR' }, + [0x29F7] = { unicodeslot=0x29F7, category='sm', description='REVERSE SOLIDUS WITH HORIZONTAL STROKE' }, + [0x29F8] = { unicodeslot=0x29F8, category='sm', description='BIG SOLIDUS' }, + [0x29F9] = { unicodeslot=0x29F9, category='sm', description='BIG REVERSE SOLIDUS' }, + [0x29FA] = { unicodeslot=0x29FA, category='sm', description='DOUBLE PLUS' }, + [0x29FB] = { unicodeslot=0x29FB, category='sm', description='TRIPLE PLUS' }, + [0x29FC] = { unicodeslot=0x29FC, category='ps', description='LEFT-POINTING CURVED ANGLE BRACKET' }, + [0x29FD] = { unicodeslot=0x29FD, category='pe', description='RIGHT-POINTING CURVED ANGLE BRACKET' }, + [0x29FE] = { unicodeslot=0x29FE, category='sm', description='TINY' }, + [0x29FF] = { unicodeslot=0x29FF, category='sm', description='MINY' }, + [0x2A00] = { unicodeslot=0x2A00, category='sm', description='N-ARY CIRCLED DOT OPERATOR' }, + [0x2A01] = { unicodeslot=0x2A01, category='sm', description='N-ARY CIRCLED PLUS OPERATOR' }, + [0x2A02] = { unicodeslot=0x2A02, category='sm', description='N-ARY CIRCLED TIMES OPERATOR' }, + [0x2A03] = { unicodeslot=0x2A03, category='sm', description='N-ARY UNION OPERATOR WITH DOT' }, + [0x2A04] = { unicodeslot=0x2A04, category='sm', description='N-ARY UNION OPERATOR WITH PLUS' }, + [0x2A05] = { unicodeslot=0x2A05, category='sm', description='N-ARY SQUARE INTERSECTION OPERATOR' }, + [0x2A06] = { unicodeslot=0x2A06, category='sm', description='N-ARY SQUARE UNION OPERATOR' }, + [0x2A07] = { unicodeslot=0x2A07, category='sm', description='TWO LOGICAL AND OPERATOR' }, + [0x2A08] = { unicodeslot=0x2A08, category='sm', description='TWO LOGICAL OR OPERATOR' }, + [0x2A09] = { unicodeslot=0x2A09, category='sm', description='N-ARY TIMES OPERATOR' }, + [0x2A0A] = { unicodeslot=0x2A0A, category='sm', description='MODULO TWO SUM' }, + [0x2A0B] = { unicodeslot=0x2A0B, category='sm', description='SUMMATION WITH INTEGRAL' }, + [0x2A0C] = { unicodeslot=0x2A0C, category='sm', description='QUADRUPLE INTEGRAL OPERATOR', specials={'compat',0x222B,0x222B,0x222B,0x222B} }, + [0x2A0D] = { unicodeslot=0x2A0D, category='sm', description='FINITE PART INTEGRAL' }, + [0x2A0E] = { unicodeslot=0x2A0E, category='sm', description='INTEGRAL WITH DOUBLE STROKE' }, + [0x2A0F] = { unicodeslot=0x2A0F, category='sm', description='INTEGRAL AVERAGE WITH SLASH' }, + [0x2A10] = { unicodeslot=0x2A10, category='sm', description='CIRCULATION FUNCTION' }, + [0x2A11] = { unicodeslot=0x2A11, category='sm', description='ANTICLOCKWISE INTEGRATION' }, + [0x2A12] = { unicodeslot=0x2A12, category='sm', description='LINE INTEGRATION WITH RECTANGULAR PATH AROUND POLE' }, + [0x2A13] = { unicodeslot=0x2A13, category='sm', description='LINE INTEGRATION WITH SEMICIRCULAR PATH AROUND POLE' }, + [0x2A14] = { unicodeslot=0x2A14, category='sm', description='LINE INTEGRATION NOT INCLUDING THE POLE' }, + [0x2A15] = { unicodeslot=0x2A15, category='sm', description='INTEGRAL AROUND A POINT OPERATOR' }, + [0x2A16] = { unicodeslot=0x2A16, category='sm', description='QUATERNION INTEGRAL OPERATOR' }, + [0x2A17] = { unicodeslot=0x2A17, category='sm', description='INTEGRAL WITH LEFTWARDS ARROW WITH HOOK' }, + [0x2A18] = { unicodeslot=0x2A18, category='sm', description='INTEGRAL WITH TIMES SIGN' }, + [0x2A19] = { unicodeslot=0x2A19, category='sm', description='INTEGRAL WITH INTERSECTION' }, + [0x2A1A] = { unicodeslot=0x2A1A, category='sm', description='INTEGRAL WITH UNION' }, + [0x2A1B] = { unicodeslot=0x2A1B, category='sm', description='INTEGRAL WITH OVERBAR' }, + [0x2A1C] = { unicodeslot=0x2A1C, category='sm', description='INTEGRAL WITH UNDERBAR' }, + [0x2A1D] = { unicodeslot=0x2A1D, category='sm', description='JOIN' }, + [0x2A1E] = { unicodeslot=0x2A1E, category='sm', description='LARGE LEFT TRIANGLE OPERATOR' }, + [0x2A1F] = { unicodeslot=0x2A1F, category='sm', description='Z NOTATION SCHEMA COMPOSITION' }, + [0x2A20] = { unicodeslot=0x2A20, category='sm', description='Z NOTATION SCHEMA PIPING' }, + [0x2A21] = { unicodeslot=0x2A21, category='sm', description='Z NOTATION SCHEMA PROJECTION' }, + [0x2A22] = { unicodeslot=0x2A22, category='sm', description='PLUS SIGN WITH SMALL CIRCLE ABOVE' }, + [0x2A23] = { unicodeslot=0x2A23, category='sm', description='PLUS SIGN WITH CIRCUMFLEX ACCENT ABOVE' }, + [0x2A24] = { unicodeslot=0x2A24, category='sm', description='PLUS SIGN WITH TILDE ABOVE' }, + [0x2A25] = { unicodeslot=0x2A25, category='sm', description='PLUS SIGN WITH DOT BELOW' }, + [0x2A26] = { unicodeslot=0x2A26, category='sm', description='PLUS SIGN WITH TILDE BELOW' }, + [0x2A27] = { unicodeslot=0x2A27, category='sm', description='PLUS SIGN WITH SUBSCRIPT TWO' }, + [0x2A28] = { unicodeslot=0x2A28, category='sm', description='PLUS SIGN WITH BLACK TRIANGLE' }, + [0x2A29] = { unicodeslot=0x2A29, category='sm', description='MINUS SIGN WITH COMMA ABOVE' }, + [0x2A2A] = { unicodeslot=0x2A2A, category='sm', description='MINUS SIGN WITH DOT BELOW' }, + [0x2A2B] = { unicodeslot=0x2A2B, category='sm', description='MINUS SIGN WITH FALLING DOTS' }, + [0x2A2C] = { unicodeslot=0x2A2C, category='sm', description='MINUS SIGN WITH RISING DOTS' }, + [0x2A2D] = { unicodeslot=0x2A2D, category='sm', description='PLUS SIGN IN LEFT HALF CIRCLE' }, + [0x2A2E] = { unicodeslot=0x2A2E, category='sm', description='PLUS SIGN IN RIGHT HALF CIRCLE' }, + [0x2A2F] = { unicodeslot=0x2A2F, category='sm', description='VECTOR OR CROSS PRODUCT' }, + [0x2A30] = { unicodeslot=0x2A30, category='sm', description='MULTIPLICATION SIGN WITH DOT ABOVE' }, + [0x2A31] = { unicodeslot=0x2A31, category='sm', description='MULTIPLICATION SIGN WITH UNDERBAR' }, + [0x2A32] = { unicodeslot=0x2A32, category='sm', description='SEMIDIRECT PRODUCT WITH BOTTOM CLOSED' }, + [0x2A33] = { unicodeslot=0x2A33, category='sm', description='SMASH PRODUCT' }, + [0x2A34] = { unicodeslot=0x2A34, category='sm', description='MULTIPLICATION SIGN IN LEFT HALF CIRCLE' }, + [0x2A35] = { unicodeslot=0x2A35, category='sm', description='MULTIPLICATION SIGN IN RIGHT HALF CIRCLE' }, + [0x2A36] = { unicodeslot=0x2A36, category='sm', description='CIRCLED MULTIPLICATION SIGN WITH CIRCUMFLEX ACCENT' }, + [0x2A37] = { unicodeslot=0x2A37, category='sm', description='MULTIPLICATION SIGN IN DOUBLE CIRCLE' }, + [0x2A38] = { unicodeslot=0x2A38, category='sm', description='CIRCLED DIVISION SIGN' }, + [0x2A39] = { unicodeslot=0x2A39, category='sm', description='PLUS SIGN IN TRIANGLE' }, + [0x2A3A] = { unicodeslot=0x2A3A, category='sm', description='MINUS SIGN IN TRIANGLE' }, + [0x2A3B] = { unicodeslot=0x2A3B, category='sm', description='MULTIPLICATION SIGN IN TRIANGLE' }, + [0x2A3C] = { unicodeslot=0x2A3C, category='sm', description='INTERIOR PRODUCT' }, + [0x2A3D] = { unicodeslot=0x2A3D, category='sm', description='RIGHTHAND INTERIOR PRODUCT' }, + [0x2A3E] = { unicodeslot=0x2A3E, category='sm', description='Z NOTATION RELATIONAL COMPOSITION' }, + [0x2A3F] = { unicodeslot=0x2A3F, category='sm', description='AMALGAMATION OR COPRODUCT' }, + [0x2A40] = { unicodeslot=0x2A40, category='sm', description='INTERSECTION WITH DOT' }, + [0x2A41] = { unicodeslot=0x2A41, category='sm', description='UNION WITH MINUS SIGN' }, + [0x2A42] = { unicodeslot=0x2A42, category='sm', description='UNION WITH OVERBAR' }, + [0x2A43] = { unicodeslot=0x2A43, category='sm', description='INTERSECTION WITH OVERBAR' }, + [0x2A44] = { unicodeslot=0x2A44, category='sm', description='INTERSECTION WITH LOGICAL AND' }, + [0x2A45] = { unicodeslot=0x2A45, category='sm', description='UNION WITH LOGICAL OR' }, + [0x2A46] = { unicodeslot=0x2A46, category='sm', description='UNION ABOVE INTERSECTION' }, + [0x2A47] = { unicodeslot=0x2A47, category='sm', description='INTERSECTION ABOVE UNION' }, + [0x2A48] = { unicodeslot=0x2A48, category='sm', description='UNION ABOVE BAR ABOVE INTERSECTION' }, + [0x2A49] = { unicodeslot=0x2A49, category='sm', description='INTERSECTION ABOVE BAR ABOVE UNION' }, + [0x2A4A] = { unicodeslot=0x2A4A, category='sm', description='UNION BESIDE AND JOINED WITH UNION' }, + [0x2A4B] = { unicodeslot=0x2A4B, category='sm', description='INTERSECTION BESIDE AND JOINED WITH INTERSECTION' }, + [0x2A4C] = { unicodeslot=0x2A4C, category='sm', description='CLOSED UNION WITH SERIFS' }, + [0x2A4D] = { unicodeslot=0x2A4D, category='sm', description='CLOSED INTERSECTION WITH SERIFS' }, + [0x2A4E] = { unicodeslot=0x2A4E, category='sm', description='DOUBLE SQUARE INTERSECTION' }, + [0x2A4F] = { unicodeslot=0x2A4F, category='sm', description='DOUBLE SQUARE UNION' }, + [0x2A50] = { unicodeslot=0x2A50, category='sm', description='CLOSED UNION WITH SERIFS AND SMASH PRODUCT' }, + [0x2A51] = { unicodeslot=0x2A51, category='sm', description='LOGICAL AND WITH DOT ABOVE' }, + [0x2A52] = { unicodeslot=0x2A52, category='sm', description='LOGICAL OR WITH DOT ABOVE' }, + [0x2A53] = { unicodeslot=0x2A53, category='sm', description='DOUBLE LOGICAL AND' }, + [0x2A54] = { unicodeslot=0x2A54, category='sm', description='DOUBLE LOGICAL OR' }, + [0x2A55] = { unicodeslot=0x2A55, category='sm', description='TWO INTERSECTING LOGICAL AND' }, + [0x2A56] = { unicodeslot=0x2A56, category='sm', description='TWO INTERSECTING LOGICAL OR' }, + [0x2A57] = { unicodeslot=0x2A57, category='sm', description='SLOPING LARGE OR' }, + [0x2A58] = { unicodeslot=0x2A58, category='sm', description='SLOPING LARGE AND' }, + [0x2A59] = { unicodeslot=0x2A59, category='sm', description='LOGICAL OR OVERLAPPING LOGICAL AND' }, + [0x2A5A] = { unicodeslot=0x2A5A, category='sm', description='LOGICAL AND WITH MIDDLE STEM' }, + [0x2A5B] = { unicodeslot=0x2A5B, category='sm', description='LOGICAL OR WITH MIDDLE STEM' }, + [0x2A5C] = { unicodeslot=0x2A5C, category='sm', description='LOGICAL AND WITH HORIZONTAL DASH' }, + [0x2A5D] = { unicodeslot=0x2A5D, category='sm', description='LOGICAL OR WITH HORIZONTAL DASH' }, + [0x2A5E] = { unicodeslot=0x2A5E, category='sm', description='LOGICAL AND WITH DOUBLE OVERBAR' }, + [0x2A5F] = { unicodeslot=0x2A5F, category='sm', description='LOGICAL AND WITH UNDERBAR' }, + [0x2A60] = { unicodeslot=0x2A60, category='sm', description='LOGICAL AND WITH DOUBLE UNDERBAR' }, + [0x2A61] = { unicodeslot=0x2A61, category='sm', description='SMALL VEE WITH UNDERBAR' }, + [0x2A62] = { unicodeslot=0x2A62, category='sm', description='LOGICAL OR WITH DOUBLE OVERBAR' }, + [0x2A63] = { unicodeslot=0x2A63, category='sm', description='LOGICAL OR WITH DOUBLE UNDERBAR' }, + [0x2A64] = { unicodeslot=0x2A64, category='sm', description='Z NOTATION DOMAIN ANTIRESTRICTION' }, + [0x2A65] = { unicodeslot=0x2A65, category='sm', description='Z NOTATION RANGE ANTIRESTRICTION' }, + [0x2A66] = { unicodeslot=0x2A66, category='sm', description='EQUALS SIGN WITH DOT BELOW' }, + [0x2A67] = { unicodeslot=0x2A67, category='sm', description='IDENTICAL WITH DOT ABOVE' }, + [0x2A68] = { unicodeslot=0x2A68, category='sm', description='TRIPLE HORIZONTAL BAR WITH DOUBLE VERTICAL STROKE' }, + [0x2A69] = { unicodeslot=0x2A69, category='sm', description='TRIPLE HORIZONTAL BAR WITH TRIPLE VERTICAL STROKE' }, + [0x2A6A] = { unicodeslot=0x2A6A, category='sm', description='TILDE OPERATOR WITH DOT ABOVE' }, + [0x2A6B] = { unicodeslot=0x2A6B, category='sm', description='TILDE OPERATOR WITH RISING DOTS' }, + [0x2A6C] = { unicodeslot=0x2A6C, category='sm', description='SIMILAR MINUS SIMILAR' }, + [0x2A6D] = { unicodeslot=0x2A6D, category='sm', description='CONGRUENT WITH DOT ABOVE' }, + [0x2A6E] = { unicodeslot=0x2A6E, category='sm', description='EQUALS WITH ASTERISK' }, + [0x2A6F] = { unicodeslot=0x2A6F, category='sm', description='ALMOST EQUAL TO WITH CIRCUMFLEX ACCENT' }, + [0x2A70] = { unicodeslot=0x2A70, category='sm', description='APPROXIMATELY EQUAL OR EQUAL TO' }, + [0x2A71] = { unicodeslot=0x2A71, category='sm', description='EQUALS SIGN ABOVE PLUS SIGN' }, + [0x2A72] = { unicodeslot=0x2A72, category='sm', description='PLUS SIGN ABOVE EQUALS SIGN' }, + [0x2A73] = { unicodeslot=0x2A73, category='sm', description='EQUALS SIGN ABOVE TILDE OPERATOR' }, + [0x2A74] = { unicodeslot=0x2A74, category='sm', description='DOUBLE COLON EQUAL', specials={'compat',0x003A,0x003A,0x003D} }, + [0x2A75] = { unicodeslot=0x2A75, category='sm', description='TWO CONSECUTIVE EQUALS SIGNS', specials={'compat',0x003D,0x003D} }, + [0x2A76] = { unicodeslot=0x2A76, category='sm', description='THREE CONSECUTIVE EQUALS SIGNS', specials={'compat',0x003D,0x003D,0x003D} }, + [0x2A77] = { unicodeslot=0x2A77, category='sm', description='EQUALS SIGN WITH TWO DOTS ABOVE AND TWO DOTS BELOW' }, + [0x2A78] = { unicodeslot=0x2A78, category='sm', description='EQUIVALENT WITH FOUR DOTS ABOVE' }, + [0x2A79] = { unicodeslot=0x2A79, category='sm', description='LESS-THAN WITH CIRCLE INSIDE' }, + [0x2A7A] = { unicodeslot=0x2A7A, category='sm', description='GREATER-THAN WITH CIRCLE INSIDE' }, + [0x2A7B] = { unicodeslot=0x2A7B, category='sm', description='LESS-THAN WITH QUESTION MARK ABOVE' }, + [0x2A7C] = { unicodeslot=0x2A7C, category='sm', description='GREATER-THAN WITH QUESTION MARK ABOVE' }, + [0x2A7D] = { unicodeslot=0x2A7D, category='sm', description='LESS-THAN OR SLANTED EQUAL TO' }, + [0x2A7E] = { unicodeslot=0x2A7E, category='sm', description='GREATER-THAN OR SLANTED EQUAL TO' }, + [0x2A7F] = { unicodeslot=0x2A7F, category='sm', description='LESS-THAN OR SLANTED EQUAL TO WITH DOT INSIDE' }, + [0x2A80] = { unicodeslot=0x2A80, category='sm', description='GREATER-THAN OR SLANTED EQUAL TO WITH DOT INSIDE' }, + [0x2A81] = { unicodeslot=0x2A81, category='sm', description='LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE' }, + [0x2A82] = { unicodeslot=0x2A82, category='sm', description='GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE' }, + [0x2A83] = { unicodeslot=0x2A83, category='sm', description='LESS-THAN OR SLANTED EQUAL TO WITH DOT ABOVE RIGHT' }, + [0x2A84] = { unicodeslot=0x2A84, category='sm', description='GREATER-THAN OR SLANTED EQUAL TO WITH DOT ABOVE LEFT' }, + [0x2A85] = { unicodeslot=0x2A85, category='sm', description='LESS-THAN OR APPROXIMATE' }, + [0x2A86] = { unicodeslot=0x2A86, category='sm', description='GREATER-THAN OR APPROXIMATE' }, + [0x2A87] = { unicodeslot=0x2A87, category='sm', description='LESS-THAN AND SINGLE-LINE NOT EQUAL TO' }, + [0x2A88] = { unicodeslot=0x2A88, category='sm', description='GREATER-THAN AND SINGLE-LINE NOT EQUAL TO' }, + [0x2A89] = { unicodeslot=0x2A89, category='sm', description='LESS-THAN AND NOT APPROXIMATE' }, + [0x2A8A] = { unicodeslot=0x2A8A, category='sm', description='GREATER-THAN AND NOT APPROXIMATE' }, + [0x2A8B] = { unicodeslot=0x2A8B, category='sm', description='LESS-THAN ABOVE DOUBLE-LINE EQUAL ABOVE GREATER-THAN' }, + [0x2A8C] = { unicodeslot=0x2A8C, category='sm', description='GREATER-THAN ABOVE DOUBLE-LINE EQUAL ABOVE LESS-THAN' }, + [0x2A8D] = { unicodeslot=0x2A8D, category='sm', description='LESS-THAN ABOVE SIMILAR OR EQUAL' }, + [0x2A8E] = { unicodeslot=0x2A8E, category='sm', description='GREATER-THAN ABOVE SIMILAR OR EQUAL' }, + [0x2A8F] = { unicodeslot=0x2A8F, category='sm', description='LESS-THAN ABOVE SIMILAR ABOVE GREATER-THAN' }, + [0x2A90] = { unicodeslot=0x2A90, category='sm', description='GREATER-THAN ABOVE SIMILAR ABOVE LESS-THAN' }, + [0x2A91] = { unicodeslot=0x2A91, category='sm', description='LESS-THAN ABOVE GREATER-THAN ABOVE DOUBLE-LINE EQUAL' }, + [0x2A92] = { unicodeslot=0x2A92, category='sm', description='GREATER-THAN ABOVE LESS-THAN ABOVE DOUBLE-LINE EQUAL' }, + [0x2A93] = { unicodeslot=0x2A93, category='sm', description='LESS-THAN ABOVE SLANTED EQUAL ABOVE GREATER-THAN ABOVE SLANTED EQUAL' }, + [0x2A94] = { unicodeslot=0x2A94, category='sm', description='GREATER-THAN ABOVE SLANTED EQUAL ABOVE LESS-THAN ABOVE SLANTED EQUAL' }, + [0x2A95] = { unicodeslot=0x2A95, category='sm', description='SLANTED EQUAL TO OR LESS-THAN' }, + [0x2A96] = { unicodeslot=0x2A96, category='sm', description='SLANTED EQUAL TO OR GREATER-THAN' }, + [0x2A97] = { unicodeslot=0x2A97, category='sm', description='SLANTED EQUAL TO OR LESS-THAN WITH DOT INSIDE' }, + [0x2A98] = { unicodeslot=0x2A98, category='sm', description='SLANTED EQUAL TO OR GREATER-THAN WITH DOT INSIDE' }, + [0x2A99] = { unicodeslot=0x2A99, category='sm', description='DOUBLE-LINE EQUAL TO OR LESS-THAN' }, + [0x2A9A] = { unicodeslot=0x2A9A, category='sm', description='DOUBLE-LINE EQUAL TO OR GREATER-THAN' }, + [0x2A9B] = { unicodeslot=0x2A9B, category='sm', description='DOUBLE-LINE SLANTED EQUAL TO OR LESS-THAN' }, + [0x2A9C] = { unicodeslot=0x2A9C, category='sm', description='DOUBLE-LINE SLANTED EQUAL TO OR GREATER-THAN' }, + [0x2A9D] = { unicodeslot=0x2A9D, category='sm', description='SIMILAR OR LESS-THAN' }, + [0x2A9E] = { unicodeslot=0x2A9E, category='sm', description='SIMILAR OR GREATER-THAN' }, + [0x2A9F] = { unicodeslot=0x2A9F, category='sm', description='SIMILAR ABOVE LESS-THAN ABOVE EQUALS SIGN' }, + [0x2AA0] = { unicodeslot=0x2AA0, category='sm', description='SIMILAR ABOVE GREATER-THAN ABOVE EQUALS SIGN' }, + [0x2AA1] = { unicodeslot=0x2AA1, category='sm', description='DOUBLE NESTED LESS-THAN' }, + [0x2AA2] = { unicodeslot=0x2AA2, category='sm', description='DOUBLE NESTED GREATER-THAN' }, + [0x2AA3] = { unicodeslot=0x2AA3, category='sm', description='DOUBLE NESTED LESS-THAN WITH UNDERBAR' }, + [0x2AA4] = { unicodeslot=0x2AA4, category='sm', description='GREATER-THAN OVERLAPPING LESS-THAN' }, + [0x2AA5] = { unicodeslot=0x2AA5, category='sm', description='GREATER-THAN BESIDE LESS-THAN' }, + [0x2AA6] = { unicodeslot=0x2AA6, category='sm', description='LESS-THAN CLOSED BY CURVE' }, + [0x2AA7] = { unicodeslot=0x2AA7, category='sm', description='GREATER-THAN CLOSED BY CURVE' }, + [0x2AA8] = { unicodeslot=0x2AA8, category='sm', description='LESS-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL' }, + [0x2AA9] = { unicodeslot=0x2AA9, category='sm', description='GREATER-THAN CLOSED BY CURVE ABOVE SLANTED EQUAL' }, + [0x2AAA] = { unicodeslot=0x2AAA, category='sm', description='SMALLER THAN' }, + [0x2AAB] = { unicodeslot=0x2AAB, category='sm', description='LARGER THAN' }, + [0x2AAC] = { unicodeslot=0x2AAC, category='sm', description='SMALLER THAN OR EQUAL TO' }, + [0x2AAD] = { unicodeslot=0x2AAD, category='sm', description='LARGER THAN OR EQUAL TO' }, + [0x2AAE] = { unicodeslot=0x2AAE, category='sm', description='EQUALS SIGN WITH BUMPY ABOVE' }, + [0x2AAF] = { unicodeslot=0x2AAF, category='sm', description='PRECEDES ABOVE SINGLE-LINE EQUALS SIGN' }, + [0x2AB0] = { unicodeslot=0x2AB0, category='sm', description='SUCCEEDS ABOVE SINGLE-LINE EQUALS SIGN' }, + [0x2AB1] = { unicodeslot=0x2AB1, category='sm', description='PRECEDES ABOVE SINGLE-LINE NOT EQUAL TO' }, + [0x2AB2] = { unicodeslot=0x2AB2, category='sm', description='SUCCEEDS ABOVE SINGLE-LINE NOT EQUAL TO' }, + [0x2AB3] = { unicodeslot=0x2AB3, category='sm', description='PRECEDES ABOVE EQUALS SIGN' }, + [0x2AB4] = { unicodeslot=0x2AB4, category='sm', description='SUCCEEDS ABOVE EQUALS SIGN' }, + [0x2AB5] = { unicodeslot=0x2AB5, category='sm', description='PRECEDES ABOVE NOT EQUAL TO' }, + [0x2AB6] = { unicodeslot=0x2AB6, category='sm', description='SUCCEEDS ABOVE NOT EQUAL TO' }, + [0x2AB7] = { unicodeslot=0x2AB7, category='sm', description='PRECEDES ABOVE ALMOST EQUAL TO' }, + [0x2AB8] = { unicodeslot=0x2AB8, category='sm', description='SUCCEEDS ABOVE ALMOST EQUAL TO' }, + [0x2AB9] = { unicodeslot=0x2AB9, category='sm', description='PRECEDES ABOVE NOT ALMOST EQUAL TO' }, + [0x2ABA] = { unicodeslot=0x2ABA, category='sm', description='SUCCEEDS ABOVE NOT ALMOST EQUAL TO' }, + [0x2ABB] = { unicodeslot=0x2ABB, category='sm', description='DOUBLE PRECEDES' }, + [0x2ABC] = { unicodeslot=0x2ABC, category='sm', description='DOUBLE SUCCEEDS' }, + [0x2ABD] = { unicodeslot=0x2ABD, category='sm', description='SUBSET WITH DOT' }, + [0x2ABE] = { unicodeslot=0x2ABE, category='sm', description='SUPERSET WITH DOT' }, + [0x2ABF] = { unicodeslot=0x2ABF, category='sm', description='SUBSET WITH PLUS SIGN BELOW' }, + [0x2AC0] = { unicodeslot=0x2AC0, category='sm', description='SUPERSET WITH PLUS SIGN BELOW' }, + [0x2AC1] = { unicodeslot=0x2AC1, category='sm', description='SUBSET WITH MULTIPLICATION SIGN BELOW' }, + [0x2AC2] = { unicodeslot=0x2AC2, category='sm', description='SUPERSET WITH MULTIPLICATION SIGN BELOW' }, + [0x2AC3] = { unicodeslot=0x2AC3, category='sm', description='SUBSET OF OR EQUAL TO WITH DOT ABOVE' }, + [0x2AC4] = { unicodeslot=0x2AC4, category='sm', description='SUPERSET OF OR EQUAL TO WITH DOT ABOVE' }, + [0x2AC5] = { unicodeslot=0x2AC5, category='sm', description='SUBSET OF ABOVE EQUALS SIGN' }, + [0x2AC6] = { unicodeslot=0x2AC6, category='sm', description='SUPERSET OF ABOVE EQUALS SIGN' }, + [0x2AC7] = { unicodeslot=0x2AC7, category='sm', description='SUBSET OF ABOVE TILDE OPERATOR' }, + [0x2AC8] = { unicodeslot=0x2AC8, category='sm', description='SUPERSET OF ABOVE TILDE OPERATOR' }, + [0x2AC9] = { unicodeslot=0x2AC9, category='sm', description='SUBSET OF ABOVE ALMOST EQUAL TO' }, + [0x2ACA] = { unicodeslot=0x2ACA, category='sm', description='SUPERSET OF ABOVE ALMOST EQUAL TO' }, + [0x2ACB] = { unicodeslot=0x2ACB, category='sm', description='SUBSET OF ABOVE NOT EQUAL TO' }, + [0x2ACC] = { unicodeslot=0x2ACC, category='sm', description='SUPERSET OF ABOVE NOT EQUAL TO' }, + [0x2ACD] = { unicodeslot=0x2ACD, category='sm', description='SQUARE LEFT OPEN BOX OPERATOR' }, + [0x2ACE] = { unicodeslot=0x2ACE, category='sm', description='SQUARE RIGHT OPEN BOX OPERATOR' }, + [0x2ACF] = { unicodeslot=0x2ACF, category='sm', description='CLOSED SUBSET' }, + [0x2AD0] = { unicodeslot=0x2AD0, category='sm', description='CLOSED SUPERSET' }, + [0x2AD1] = { unicodeslot=0x2AD1, category='sm', description='CLOSED SUBSET OR EQUAL TO' }, + [0x2AD2] = { unicodeslot=0x2AD2, category='sm', description='CLOSED SUPERSET OR EQUAL TO' }, + [0x2AD3] = { unicodeslot=0x2AD3, category='sm', description='SUBSET ABOVE SUPERSET' }, + [0x2AD4] = { unicodeslot=0x2AD4, category='sm', description='SUPERSET ABOVE SUBSET' }, + [0x2AD5] = { unicodeslot=0x2AD5, category='sm', description='SUBSET ABOVE SUBSET' }, + [0x2AD6] = { unicodeslot=0x2AD6, category='sm', description='SUPERSET ABOVE SUPERSET' }, + [0x2AD7] = { unicodeslot=0x2AD7, category='sm', description='SUPERSET BESIDE SUBSET' }, + [0x2AD8] = { unicodeslot=0x2AD8, category='sm', description='SUPERSET BESIDE AND JOINED BY DASH WITH SUBSET' }, + [0x2AD9] = { unicodeslot=0x2AD9, category='sm', description='ELEMENT OF OPENING DOWNWARDS' }, + [0x2ADA] = { unicodeslot=0x2ADA, category='sm', description='PITCHFORK WITH TEE TOP' }, + [0x2ADB] = { unicodeslot=0x2ADB, category='sm', description='TRANSVERSAL INTERSECTION' }, + [0x2ADC] = { unicodeslot=0x2ADC, category='sm', description='FORKING', specials={'char',0x2ADD,0x0338} }, + [0x2ADD] = { unicodeslot=0x2ADD, category='sm', description='NONFORKING' }, + [0x2ADE] = { unicodeslot=0x2ADE, category='sm', description='SHORT LEFT TACK' }, + [0x2ADF] = { unicodeslot=0x2ADF, category='sm', description='SHORT DOWN TACK' }, + [0x2AE0] = { unicodeslot=0x2AE0, category='sm', description='SHORT UP TACK' }, + [0x2AE1] = { unicodeslot=0x2AE1, category='sm', description='PERPENDICULAR WITH S' }, + [0x2AE2] = { unicodeslot=0x2AE2, category='sm', description='VERTICAL BAR TRIPLE RIGHT TURNSTILE' }, + [0x2AE3] = { unicodeslot=0x2AE3, category='sm', description='DOUBLE VERTICAL BAR LEFT TURNSTILE' }, + [0x2AE4] = { unicodeslot=0x2AE4, category='sm', description='VERTICAL BAR DOUBLE LEFT TURNSTILE' }, + [0x2AE5] = { unicodeslot=0x2AE5, category='sm', description='DOUBLE VERTICAL BAR DOUBLE LEFT TURNSTILE' }, + [0x2AE6] = { unicodeslot=0x2AE6, category='sm', description='LONG DASH FROM LEFT MEMBER OF DOUBLE VERTICAL' }, + [0x2AE7] = { unicodeslot=0x2AE7, category='sm', description='SHORT DOWN TACK WITH OVERBAR' }, + [0x2AE8] = { unicodeslot=0x2AE8, category='sm', description='SHORT UP TACK WITH UNDERBAR' }, + [0x2AE9] = { unicodeslot=0x2AE9, category='sm', description='SHORT UP TACK ABOVE SHORT DOWN TACK' }, + [0x2AEA] = { unicodeslot=0x2AEA, category='sm', description='DOUBLE DOWN TACK' }, + [0x2AEB] = { unicodeslot=0x2AEB, category='sm', description='DOUBLE UP TACK' }, + [0x2AEC] = { unicodeslot=0x2AEC, category='sm', description='DOUBLE STROKE NOT SIGN' }, + [0x2AED] = { unicodeslot=0x2AED, category='sm', description='REVERSED DOUBLE STROKE NOT SIGN' }, + [0x2AEE] = { unicodeslot=0x2AEE, category='sm', description='DOES NOT DIVIDE WITH REVERSED NEGATION SLASH' }, + [0x2AEF] = { unicodeslot=0x2AEF, category='sm', description='VERTICAL LINE WITH CIRCLE ABOVE' }, + [0x2AF0] = { unicodeslot=0x2AF0, category='sm', description='VERTICAL LINE WITH CIRCLE BELOW' }, + [0x2AF1] = { unicodeslot=0x2AF1, category='sm', description='DOWN TACK WITH CIRCLE BELOW' }, + [0x2AF2] = { unicodeslot=0x2AF2, category='sm', description='PARALLEL WITH HORIZONTAL STROKE' }, + [0x2AF3] = { unicodeslot=0x2AF3, category='sm', description='PARALLEL WITH TILDE OPERATOR' }, + [0x2AF4] = { unicodeslot=0x2AF4, category='sm', description='TRIPLE VERTICAL BAR BINARY RELATION' }, + [0x2AF5] = { unicodeslot=0x2AF5, category='sm', description='TRIPLE VERTICAL BAR WITH HORIZONTAL STROKE' }, + [0x2AF6] = { unicodeslot=0x2AF6, category='sm', description='TRIPLE COLON OPERATOR' }, + [0x2AF7] = { unicodeslot=0x2AF7, category='sm', description='TRIPLE NESTED LESS-THAN' }, + [0x2AF8] = { unicodeslot=0x2AF8, category='sm', description='TRIPLE NESTED GREATER-THAN' }, + [0x2AF9] = { unicodeslot=0x2AF9, category='sm', description='DOUBLE-LINE SLANTED LESS-THAN OR EQUAL TO' }, + [0x2AFA] = { unicodeslot=0x2AFA, category='sm', description='DOUBLE-LINE SLANTED GREATER-THAN OR EQUAL TO' }, + [0x2AFB] = { unicodeslot=0x2AFB, category='sm', description='TRIPLE SOLIDUS BINARY RELATION' }, + [0x2AFC] = { unicodeslot=0x2AFC, category='sm', description='LARGE TRIPLE VERTICAL BAR OPERATOR' }, + [0x2AFD] = { unicodeslot=0x2AFD, category='sm', description='DOUBLE SOLIDUS OPERATOR' }, + [0x2AFE] = { unicodeslot=0x2AFE, category='sm', description='WHITE VERTICAL BAR' }, + [0x2AFF] = { unicodeslot=0x2AFF, category='sm', description='N-ARY WHITE VERTICAL BAR' }, + [0x2B00] = { unicodeslot=0x2B00, category='so', description='NORTH EAST WHITE ARROW' }, + [0x2B01] = { unicodeslot=0x2B01, category='so', description='NORTH WEST WHITE ARROW' }, + [0x2B02] = { unicodeslot=0x2B02, category='so', description='SOUTH EAST WHITE ARROW' }, + [0x2B03] = { unicodeslot=0x2B03, category='so', description='SOUTH WEST WHITE ARROW' }, + [0x2B04] = { unicodeslot=0x2B04, category='so', description='LEFT RIGHT WHITE ARROW' }, + [0x2B05] = { unicodeslot=0x2B05, category='so', description='LEFTWARDS BLACK ARROW' }, + [0x2B06] = { unicodeslot=0x2B06, category='so', description='UPWARDS BLACK ARROW' }, + [0x2B07] = { unicodeslot=0x2B07, category='so', description='DOWNWARDS BLACK ARROW' }, + [0x2B08] = { unicodeslot=0x2B08, category='so', description='NORTH EAST BLACK ARROW' }, + [0x2B09] = { unicodeslot=0x2B09, category='so', description='NORTH WEST BLACK ARROW' }, + [0x2B0A] = { unicodeslot=0x2B0A, category='so', description='SOUTH EAST BLACK ARROW' }, + [0x2B0B] = { unicodeslot=0x2B0B, category='so', description='SOUTH WEST BLACK ARROW' }, + [0x2B0C] = { unicodeslot=0x2B0C, category='so', description='LEFT RIGHT BLACK ARROW' }, + [0x2B0D] = { unicodeslot=0x2B0D, category='so', description='UP DOWN BLACK ARROW' }, + [0x2B0E] = { unicodeslot=0x2B0E, category='so', description='RIGHTWARDS ARROW WITH TIP DOWNWARDS' }, + [0x2B0F] = { unicodeslot=0x2B0F, category='so', description='RIGHTWARDS ARROW WITH TIP UPWARDS' }, + [0x2B10] = { unicodeslot=0x2B10, category='so', description='LEFTWARDS ARROW WITH TIP DOWNWARDS' }, + [0x2B11] = { unicodeslot=0x2B11, category='so', description='LEFTWARDS ARROW WITH TIP UPWARDS' }, + [0x2B12] = { unicodeslot=0x2B12, category='so', description='SQUARE WITH TOP HALF BLACK' }, + [0x2B13] = { unicodeslot=0x2B13, category='so', description='SQUARE WITH BOTTOM HALF BLACK' }, + [0x2B14] = { unicodeslot=0x2B14, category='so', description='SQUARE WITH UPPER RIGHT DIAGONAL HALF BLACK' }, + [0x2B15] = { unicodeslot=0x2B15, category='so', description='SQUARE WITH LOWER LEFT DIAGONAL HALF BLACK' }, + [0x2B16] = { unicodeslot=0x2B16, category='so', description='DIAMOND WITH LEFT HALF BLACK' }, + [0x2B17] = { unicodeslot=0x2B17, category='so', description='DIAMOND WITH RIGHT HALF BLACK' }, + [0x2B18] = { unicodeslot=0x2B18, category='so', description='DIAMOND WITH TOP HALF BLACK' }, + [0x2B19] = { unicodeslot=0x2B19, category='so', description='DIAMOND WITH BOTTOM HALF BLACK' }, + [0x2B1A] = { unicodeslot=0x2B1A, category='so', description='DOTTED SQUARE' }, + [0x2B20] = { unicodeslot=0x2B20, category='so', description='WHITE PENTAGON' }, + [0x2B21] = { unicodeslot=0x2B21, category='so', description='WHITE HEXAGON' }, + [0x2B22] = { unicodeslot=0x2B22, category='so', description='BLACK HEXAGON' }, + [0x2B23] = { unicodeslot=0x2B23, category='so', description='HORIZONTAL BLACK HEXAGON' }, + [0x2C00] = { unicodeslot=0x2C00, category='lu', description='GLAGOLITIC CAPITAL LETTER AZU', lccode=0x2C30 }, + [0x2C01] = { unicodeslot=0x2C01, category='lu', description='GLAGOLITIC CAPITAL LETTER BUKY', lccode=0x2C31 }, + [0x2C02] = { unicodeslot=0x2C02, category='lu', description='GLAGOLITIC CAPITAL LETTER VEDE', lccode=0x2C32 }, + [0x2C03] = { unicodeslot=0x2C03, category='lu', description='GLAGOLITIC CAPITAL LETTER GLAGOLI', lccode=0x2C33 }, + [0x2C04] = { unicodeslot=0x2C04, category='lu', description='GLAGOLITIC CAPITAL LETTER DOBRO', lccode=0x2C34 }, + [0x2C05] = { unicodeslot=0x2C05, category='lu', description='GLAGOLITIC CAPITAL LETTER YESTU', lccode=0x2C35 }, + [0x2C06] = { unicodeslot=0x2C06, category='lu', description='GLAGOLITIC CAPITAL LETTER ZHIVETE', lccode=0x2C36 }, + [0x2C07] = { unicodeslot=0x2C07, category='lu', description='GLAGOLITIC CAPITAL LETTER DZELO', lccode=0x2C37 }, + [0x2C08] = { unicodeslot=0x2C08, category='lu', description='GLAGOLITIC CAPITAL LETTER ZEMLJA', lccode=0x2C38 }, + [0x2C09] = { unicodeslot=0x2C09, category='lu', description='GLAGOLITIC CAPITAL LETTER IZHE', lccode=0x2C39 }, + [0x2C0A] = { unicodeslot=0x2C0A, category='lu', description='GLAGOLITIC CAPITAL LETTER INITIAL IZHE', lccode=0x2C3A }, + [0x2C0B] = { unicodeslot=0x2C0B, category='lu', description='GLAGOLITIC CAPITAL LETTER I', lccode=0x2C3B }, + [0x2C0C] = { unicodeslot=0x2C0C, category='lu', description='GLAGOLITIC CAPITAL LETTER DJERVI', lccode=0x2C3C }, + [0x2C0D] = { unicodeslot=0x2C0D, category='lu', description='GLAGOLITIC CAPITAL LETTER KAKO', lccode=0x2C3D }, + [0x2C0E] = { unicodeslot=0x2C0E, category='lu', description='GLAGOLITIC CAPITAL LETTER LJUDIJE', lccode=0x2C3E }, + [0x2C0F] = { unicodeslot=0x2C0F, category='lu', description='GLAGOLITIC CAPITAL LETTER MYSLITE', lccode=0x2C3F }, + [0x2C10] = { unicodeslot=0x2C10, category='lu', description='GLAGOLITIC CAPITAL LETTER NASHI', lccode=0x2C40 }, + [0x2C11] = { unicodeslot=0x2C11, category='lu', description='GLAGOLITIC CAPITAL LETTER ONU', lccode=0x2C41 }, + [0x2C12] = { unicodeslot=0x2C12, category='lu', description='GLAGOLITIC CAPITAL LETTER POKOJI', lccode=0x2C42 }, + [0x2C13] = { unicodeslot=0x2C13, category='lu', description='GLAGOLITIC CAPITAL LETTER RITSI', lccode=0x2C43 }, + [0x2C14] = { unicodeslot=0x2C14, category='lu', description='GLAGOLITIC CAPITAL LETTER SLOVO', lccode=0x2C44 }, + [0x2C15] = { unicodeslot=0x2C15, category='lu', description='GLAGOLITIC CAPITAL LETTER TVRIDO', lccode=0x2C45 }, + [0x2C16] = { unicodeslot=0x2C16, category='lu', description='GLAGOLITIC CAPITAL LETTER UKU', lccode=0x2C46 }, + [0x2C17] = { unicodeslot=0x2C17, category='lu', description='GLAGOLITIC CAPITAL LETTER FRITU', lccode=0x2C47 }, + [0x2C18] = { unicodeslot=0x2C18, category='lu', description='GLAGOLITIC CAPITAL LETTER HERU', lccode=0x2C48 }, + [0x2C19] = { unicodeslot=0x2C19, category='lu', description='GLAGOLITIC CAPITAL LETTER OTU', lccode=0x2C49 }, + [0x2C1A] = { unicodeslot=0x2C1A, category='lu', description='GLAGOLITIC CAPITAL LETTER PE', lccode=0x2C4A }, + [0x2C1B] = { unicodeslot=0x2C1B, category='lu', description='GLAGOLITIC CAPITAL LETTER SHTA', lccode=0x2C4B }, + [0x2C1C] = { unicodeslot=0x2C1C, category='lu', description='GLAGOLITIC CAPITAL LETTER TSI', lccode=0x2C4C }, + [0x2C1D] = { unicodeslot=0x2C1D, category='lu', description='GLAGOLITIC CAPITAL LETTER CHRIVI', lccode=0x2C4D }, + [0x2C1E] = { unicodeslot=0x2C1E, category='lu', description='GLAGOLITIC CAPITAL LETTER SHA', lccode=0x2C4E }, + [0x2C1F] = { unicodeslot=0x2C1F, category='lu', description='GLAGOLITIC CAPITAL LETTER YERU', lccode=0x2C4F }, + [0x2C20] = { unicodeslot=0x2C20, category='lu', description='GLAGOLITIC CAPITAL LETTER YERI', lccode=0x2C50 }, + [0x2C21] = { unicodeslot=0x2C21, category='lu', description='GLAGOLITIC CAPITAL LETTER YATI', lccode=0x2C51 }, + [0x2C22] = { unicodeslot=0x2C22, category='lu', description='GLAGOLITIC CAPITAL LETTER SPIDERY HA', lccode=0x2C52 }, + [0x2C23] = { unicodeslot=0x2C23, category='lu', description='GLAGOLITIC CAPITAL LETTER YU', lccode=0x2C53 }, + [0x2C24] = { unicodeslot=0x2C24, category='lu', description='GLAGOLITIC CAPITAL LETTER SMALL YUS', lccode=0x2C54 }, + [0x2C25] = { unicodeslot=0x2C25, category='lu', description='GLAGOLITIC CAPITAL LETTER SMALL YUS WITH TAIL', lccode=0x2C55 }, + [0x2C26] = { unicodeslot=0x2C26, category='lu', description='GLAGOLITIC CAPITAL LETTER YO', lccode=0x2C56 }, + [0x2C27] = { unicodeslot=0x2C27, category='lu', description='GLAGOLITIC CAPITAL LETTER IOTATED SMALL YUS', lccode=0x2C57 }, + [0x2C28] = { unicodeslot=0x2C28, category='lu', description='GLAGOLITIC CAPITAL LETTER BIG YUS', lccode=0x2C58 }, + [0x2C29] = { unicodeslot=0x2C29, category='lu', description='GLAGOLITIC CAPITAL LETTER IOTATED BIG YUS', lccode=0x2C59 }, + [0x2C2A] = { unicodeslot=0x2C2A, category='lu', description='GLAGOLITIC CAPITAL LETTER FITA', lccode=0x2C5A }, + [0x2C2B] = { unicodeslot=0x2C2B, category='lu', description='GLAGOLITIC CAPITAL LETTER IZHITSA', lccode=0x2C5B }, + [0x2C2C] = { unicodeslot=0x2C2C, category='lu', description='GLAGOLITIC CAPITAL LETTER SHTAPIC', lccode=0x2C5C }, + [0x2C2D] = { unicodeslot=0x2C2D, category='lu', description='GLAGOLITIC CAPITAL LETTER TROKUTASTI A', lccode=0x2C5D }, + [0x2C2E] = { unicodeslot=0x2C2E, category='lu', description='GLAGOLITIC CAPITAL LETTER LATINATE MYSLITE', lccode=0x2C5E }, + [0x2C30] = { unicodeslot=0x2C30, category='ll', description='GLAGOLITIC SMALL LETTER AZU', uccode=0x2C00 }, + [0x2C31] = { unicodeslot=0x2C31, category='ll', description='GLAGOLITIC SMALL LETTER BUKY', uccode=0x2C01 }, + [0x2C32] = { unicodeslot=0x2C32, category='ll', description='GLAGOLITIC SMALL LETTER VEDE', uccode=0x2C02 }, + [0x2C33] = { unicodeslot=0x2C33, category='ll', description='GLAGOLITIC SMALL LETTER GLAGOLI', uccode=0x2C03 }, + [0x2C34] = { unicodeslot=0x2C34, category='ll', description='GLAGOLITIC SMALL LETTER DOBRO', uccode=0x2C04 }, + [0x2C35] = { unicodeslot=0x2C35, category='ll', description='GLAGOLITIC SMALL LETTER YESTU', uccode=0x2C05 }, + [0x2C36] = { unicodeslot=0x2C36, category='ll', description='GLAGOLITIC SMALL LETTER ZHIVETE', uccode=0x2C06 }, + [0x2C37] = { unicodeslot=0x2C37, category='ll', description='GLAGOLITIC SMALL LETTER DZELO', uccode=0x2C07 }, + [0x2C38] = { unicodeslot=0x2C38, category='ll', description='GLAGOLITIC SMALL LETTER ZEMLJA', uccode=0x2C08 }, + [0x2C39] = { unicodeslot=0x2C39, category='ll', description='GLAGOLITIC SMALL LETTER IZHE', uccode=0x2C09 }, + [0x2C3A] = { unicodeslot=0x2C3A, category='ll', description='GLAGOLITIC SMALL LETTER INITIAL IZHE', uccode=0x2C0A }, + [0x2C3B] = { unicodeslot=0x2C3B, category='ll', description='GLAGOLITIC SMALL LETTER I', uccode=0x2C0B }, + [0x2C3C] = { unicodeslot=0x2C3C, category='ll', description='GLAGOLITIC SMALL LETTER DJERVI', uccode=0x2C0C }, + [0x2C3D] = { unicodeslot=0x2C3D, category='ll', description='GLAGOLITIC SMALL LETTER KAKO', uccode=0x2C0D }, + [0x2C3E] = { unicodeslot=0x2C3E, category='ll', description='GLAGOLITIC SMALL LETTER LJUDIJE', uccode=0x2C0E }, + [0x2C3F] = { unicodeslot=0x2C3F, category='ll', description='GLAGOLITIC SMALL LETTER MYSLITE', uccode=0x2C0F }, + [0x2C40] = { unicodeslot=0x2C40, category='ll', description='GLAGOLITIC SMALL LETTER NASHI', uccode=0x2C10 }, + [0x2C41] = { unicodeslot=0x2C41, category='ll', description='GLAGOLITIC SMALL LETTER ONU', uccode=0x2C11 }, + [0x2C42] = { unicodeslot=0x2C42, category='ll', description='GLAGOLITIC SMALL LETTER POKOJI', uccode=0x2C12 }, + [0x2C43] = { unicodeslot=0x2C43, category='ll', description='GLAGOLITIC SMALL LETTER RITSI', uccode=0x2C13 }, + [0x2C44] = { unicodeslot=0x2C44, category='ll', description='GLAGOLITIC SMALL LETTER SLOVO', uccode=0x2C14 }, + [0x2C45] = { unicodeslot=0x2C45, category='ll', description='GLAGOLITIC SMALL LETTER TVRIDO', uccode=0x2C15 }, + [0x2C46] = { unicodeslot=0x2C46, category='ll', description='GLAGOLITIC SMALL LETTER UKU', uccode=0x2C16 }, + [0x2C47] = { unicodeslot=0x2C47, category='ll', description='GLAGOLITIC SMALL LETTER FRITU', uccode=0x2C17 }, + [0x2C48] = { unicodeslot=0x2C48, category='ll', description='GLAGOLITIC SMALL LETTER HERU', uccode=0x2C18 }, + [0x2C49] = { unicodeslot=0x2C49, category='ll', description='GLAGOLITIC SMALL LETTER OTU', uccode=0x2C19 }, + [0x2C4A] = { unicodeslot=0x2C4A, category='ll', description='GLAGOLITIC SMALL LETTER PE', uccode=0x2C1A }, + [0x2C4B] = { unicodeslot=0x2C4B, category='ll', description='GLAGOLITIC SMALL LETTER SHTA', uccode=0x2C1B }, + [0x2C4C] = { unicodeslot=0x2C4C, category='ll', description='GLAGOLITIC SMALL LETTER TSI', uccode=0x2C1C }, + [0x2C4D] = { unicodeslot=0x2C4D, category='ll', description='GLAGOLITIC SMALL LETTER CHRIVI', uccode=0x2C1D }, + [0x2C4E] = { unicodeslot=0x2C4E, category='ll', description='GLAGOLITIC SMALL LETTER SHA', uccode=0x2C1E }, + [0x2C4F] = { unicodeslot=0x2C4F, category='ll', description='GLAGOLITIC SMALL LETTER YERU', uccode=0x2C1F }, + [0x2C50] = { unicodeslot=0x2C50, category='ll', description='GLAGOLITIC SMALL LETTER YERI', uccode=0x2C20 }, + [0x2C51] = { unicodeslot=0x2C51, category='ll', description='GLAGOLITIC SMALL LETTER YATI', uccode=0x2C21 }, + [0x2C52] = { unicodeslot=0x2C52, category='ll', description='GLAGOLITIC SMALL LETTER SPIDERY HA', uccode=0x2C22 }, + [0x2C53] = { unicodeslot=0x2C53, category='ll', description='GLAGOLITIC SMALL LETTER YU', uccode=0x2C23 }, + [0x2C54] = { unicodeslot=0x2C54, category='ll', description='GLAGOLITIC SMALL LETTER SMALL YUS', uccode=0x2C24 }, + [0x2C55] = { unicodeslot=0x2C55, category='ll', description='GLAGOLITIC SMALL LETTER SMALL YUS WITH TAIL', uccode=0x2C25 }, + [0x2C56] = { unicodeslot=0x2C56, category='ll', description='GLAGOLITIC SMALL LETTER YO', uccode=0x2C26 }, + [0x2C57] = { unicodeslot=0x2C57, category='ll', description='GLAGOLITIC SMALL LETTER IOTATED SMALL YUS', uccode=0x2C27 }, + [0x2C58] = { unicodeslot=0x2C58, category='ll', description='GLAGOLITIC SMALL LETTER BIG YUS', uccode=0x2C28 }, + [0x2C59] = { unicodeslot=0x2C59, category='ll', description='GLAGOLITIC SMALL LETTER IOTATED BIG YUS', uccode=0x2C29 }, + [0x2C5A] = { unicodeslot=0x2C5A, category='ll', description='GLAGOLITIC SMALL LETTER FITA', uccode=0x2C2A }, + [0x2C5B] = { unicodeslot=0x2C5B, category='ll', description='GLAGOLITIC SMALL LETTER IZHITSA', uccode=0x2C2B }, + [0x2C5C] = { unicodeslot=0x2C5C, category='ll', description='GLAGOLITIC SMALL LETTER SHTAPIC', uccode=0x2C2C }, + [0x2C5D] = { unicodeslot=0x2C5D, category='ll', description='GLAGOLITIC SMALL LETTER TROKUTASTI A', uccode=0x2C2D }, + [0x2C5E] = { unicodeslot=0x2C5E, category='ll', description='GLAGOLITIC SMALL LETTER LATINATE MYSLITE', uccode=0x2C2E }, + [0x2C60] = { unicodeslot=0x2C60, category='lu', description='LATIN CAPITAL LETTER L WITH DOUBLE BAR', shcode=0x004C, lccode=0x2C61 }, + [0x2C61] = { unicodeslot=0x2C61, category='ll', description='LATIN SMALL LETTER L WITH DOUBLE BAR', shcode=0x006C, uccode=0x2C60 }, + [0x2C62] = { unicodeslot=0x2C62, category='lu', description='LATIN CAPITAL LETTER L WITH MIDDLE TILDE', shcode=0x004C, lccode=0x026B }, + [0x2C63] = { unicodeslot=0x2C63, category='lu', description='LATIN CAPITAL LETTER P WITH STROKE', shcode=0x0050, lccode=0x1D7D }, + [0x2C64] = { unicodeslot=0x2C64, category='lu', description='LATIN CAPITAL LETTER R WITH TAIL', shcode=0x0052, lccode=0x027D }, + [0x2C65] = { unicodeslot=0x2C65, category='ll', description='LATIN SMALL LETTER A WITH STROKE', shcode=0x0061, uccode=0x023A }, + [0x2C66] = { unicodeslot=0x2C66, category='ll', description='LATIN SMALL LETTER T WITH DIAGONAL STROKE', shcode=0x0074, uccode=0x023E }, + [0x2C67] = { unicodeslot=0x2C67, category='lu', description='LATIN CAPITAL LETTER H WITH DESCENDER', shcode=0x0048, lccode=0x2C68 }, + [0x2C68] = { unicodeslot=0x2C68, category='ll', description='LATIN SMALL LETTER H WITH DESCENDER', shcode=0x0068, uccode=0x2C67 }, + [0x2C69] = { unicodeslot=0x2C69, category='lu', description='LATIN CAPITAL LETTER K WITH DESCENDER', shcode=0x004B, lccode=0x2C6A }, + [0x2C6A] = { unicodeslot=0x2C6A, category='ll', description='LATIN SMALL LETTER K WITH DESCENDER', shcode=0x006B, uccode=0x2C69 }, + [0x2C6B] = { unicodeslot=0x2C6B, category='lu', description='LATIN CAPITAL LETTER Z WITH DESCENDER', shcode=0x005A, lccode=0x2C6C }, + [0x2C6C] = { unicodeslot=0x2C6C, category='ll', description='LATIN SMALL LETTER Z WITH DESCENDER', shcode=0x007A, uccode=0x2C6B }, + [0x2C74] = { unicodeslot=0x2C74, category='ll', description='LATIN SMALL LETTER V WITH CURL', shcode=0x0076 }, + [0x2C75] = { unicodeslot=0x2C75, category='lu', description='LATIN CAPITAL LETTER HALF H', lccode=0x2C76 }, + [0x2C76] = { unicodeslot=0x2C76, category='ll', description='LATIN SMALL LETTER HALF H', uccode=0x2C75 }, + [0x2C77] = { unicodeslot=0x2C77, category='ll', description='LATIN SMALL LETTER TAILLESS PHI' }, + [0x2C80] = { unicodeslot=0x2C80, category='lu', description='COPTIC CAPITAL LETTER ALFA', lccode=0x2C81 }, + [0x2C81] = { unicodeslot=0x2C81, category='ll', description='COPTIC SMALL LETTER ALFA', uccode=0x2C80 }, + [0x2C82] = { unicodeslot=0x2C82, category='lu', description='COPTIC CAPITAL LETTER VIDA', lccode=0x2C83 }, + [0x2C83] = { unicodeslot=0x2C83, category='ll', description='COPTIC SMALL LETTER VIDA', uccode=0x2C82 }, + [0x2C84] = { unicodeslot=0x2C84, category='lu', description='COPTIC CAPITAL LETTER GAMMA', lccode=0x2C85 }, + [0x2C85] = { unicodeslot=0x2C85, category='ll', description='COPTIC SMALL LETTER GAMMA', uccode=0x2C84 }, + [0x2C86] = { unicodeslot=0x2C86, category='lu', description='COPTIC CAPITAL LETTER DALDA', lccode=0x2C87 }, + [0x2C87] = { unicodeslot=0x2C87, category='ll', description='COPTIC SMALL LETTER DALDA', uccode=0x2C86 }, + [0x2C88] = { unicodeslot=0x2C88, category='lu', description='COPTIC CAPITAL LETTER EIE', lccode=0x2C89 }, + [0x2C89] = { unicodeslot=0x2C89, category='ll', description='COPTIC SMALL LETTER EIE', uccode=0x2C88 }, + [0x2C8A] = { unicodeslot=0x2C8A, category='lu', description='COPTIC CAPITAL LETTER SOU', lccode=0x2C8B }, + [0x2C8B] = { unicodeslot=0x2C8B, category='ll', description='COPTIC SMALL LETTER SOU', uccode=0x2C8A }, + [0x2C8C] = { unicodeslot=0x2C8C, category='lu', description='COPTIC CAPITAL LETTER ZATA', lccode=0x2C8D }, + [0x2C8D] = { unicodeslot=0x2C8D, category='ll', description='COPTIC SMALL LETTER ZATA', uccode=0x2C8C }, + [0x2C8E] = { unicodeslot=0x2C8E, category='lu', description='COPTIC CAPITAL LETTER HATE', lccode=0x2C8F }, + [0x2C8F] = { unicodeslot=0x2C8F, category='ll', description='COPTIC SMALL LETTER HATE', uccode=0x2C8E }, + [0x2C90] = { unicodeslot=0x2C90, category='lu', description='COPTIC CAPITAL LETTER THETHE', lccode=0x2C91 }, + [0x2C91] = { unicodeslot=0x2C91, category='ll', description='COPTIC SMALL LETTER THETHE', uccode=0x2C90 }, + [0x2C92] = { unicodeslot=0x2C92, category='lu', description='COPTIC CAPITAL LETTER IAUDA', lccode=0x2C93 }, + [0x2C93] = { unicodeslot=0x2C93, category='ll', description='COPTIC SMALL LETTER IAUDA', uccode=0x2C92 }, + [0x2C94] = { unicodeslot=0x2C94, category='lu', description='COPTIC CAPITAL LETTER KAPA', lccode=0x2C95 }, + [0x2C95] = { unicodeslot=0x2C95, category='ll', description='COPTIC SMALL LETTER KAPA', uccode=0x2C94 }, + [0x2C96] = { unicodeslot=0x2C96, category='lu', description='COPTIC CAPITAL LETTER LAULA', lccode=0x2C97 }, + [0x2C97] = { unicodeslot=0x2C97, category='ll', description='COPTIC SMALL LETTER LAULA', uccode=0x2C96 }, + [0x2C98] = { unicodeslot=0x2C98, category='lu', description='COPTIC CAPITAL LETTER MI', lccode=0x2C99 }, + [0x2C99] = { unicodeslot=0x2C99, category='ll', description='COPTIC SMALL LETTER MI', uccode=0x2C98 }, + [0x2C9A] = { unicodeslot=0x2C9A, category='lu', description='COPTIC CAPITAL LETTER NI', lccode=0x2C9B }, + [0x2C9B] = { unicodeslot=0x2C9B, category='ll', description='COPTIC SMALL LETTER NI', uccode=0x2C9A }, + [0x2C9C] = { unicodeslot=0x2C9C, category='lu', description='COPTIC CAPITAL LETTER KSI', lccode=0x2C9D }, + [0x2C9D] = { unicodeslot=0x2C9D, category='ll', description='COPTIC SMALL LETTER KSI', uccode=0x2C9C }, + [0x2C9E] = { unicodeslot=0x2C9E, category='lu', description='COPTIC CAPITAL LETTER O', lccode=0x2C9F }, + [0x2C9F] = { unicodeslot=0x2C9F, category='ll', description='COPTIC SMALL LETTER O', uccode=0x2C9E }, + [0x2CA0] = { unicodeslot=0x2CA0, category='lu', description='COPTIC CAPITAL LETTER PI', lccode=0x2CA1 }, + [0x2CA1] = { unicodeslot=0x2CA1, category='ll', description='COPTIC SMALL LETTER PI', uccode=0x2CA0 }, + [0x2CA2] = { unicodeslot=0x2CA2, category='lu', description='COPTIC CAPITAL LETTER RO', lccode=0x2CA3 }, + [0x2CA3] = { unicodeslot=0x2CA3, category='ll', description='COPTIC SMALL LETTER RO', uccode=0x2CA2 }, + [0x2CA4] = { unicodeslot=0x2CA4, category='lu', description='COPTIC CAPITAL LETTER SIMA', lccode=0x2CA5 }, + [0x2CA5] = { unicodeslot=0x2CA5, category='ll', description='COPTIC SMALL LETTER SIMA', uccode=0x2CA4 }, + [0x2CA6] = { unicodeslot=0x2CA6, category='lu', description='COPTIC CAPITAL LETTER TAU', lccode=0x2CA7 }, + [0x2CA7] = { unicodeslot=0x2CA7, category='ll', description='COPTIC SMALL LETTER TAU', uccode=0x2CA6 }, + [0x2CA8] = { unicodeslot=0x2CA8, category='lu', description='COPTIC CAPITAL LETTER UA', lccode=0x2CA9 }, + [0x2CA9] = { unicodeslot=0x2CA9, category='ll', description='COPTIC SMALL LETTER UA', uccode=0x2CA8 }, + [0x2CAA] = { unicodeslot=0x2CAA, category='lu', description='COPTIC CAPITAL LETTER FI', lccode=0x2CAB }, + [0x2CAB] = { unicodeslot=0x2CAB, category='ll', description='COPTIC SMALL LETTER FI', uccode=0x2CAA }, + [0x2CAC] = { unicodeslot=0x2CAC, category='lu', description='COPTIC CAPITAL LETTER KHI', lccode=0x2CAD }, + [0x2CAD] = { unicodeslot=0x2CAD, category='ll', description='COPTIC SMALL LETTER KHI', uccode=0x2CAC }, + [0x2CAE] = { unicodeslot=0x2CAE, category='lu', description='COPTIC CAPITAL LETTER PSI', lccode=0x2CAF }, + [0x2CAF] = { unicodeslot=0x2CAF, category='ll', description='COPTIC SMALL LETTER PSI', uccode=0x2CAE }, + [0x2CB0] = { unicodeslot=0x2CB0, category='lu', description='COPTIC CAPITAL LETTER OOU', lccode=0x2CB1 }, + [0x2CB1] = { unicodeslot=0x2CB1, category='ll', description='COPTIC SMALL LETTER OOU', uccode=0x2CB0 }, + [0x2CB2] = { unicodeslot=0x2CB2, category='lu', description='COPTIC CAPITAL LETTER DIALECT-P ALEF', lccode=0x2CB3 }, + [0x2CB3] = { unicodeslot=0x2CB3, category='ll', description='COPTIC SMALL LETTER DIALECT-P ALEF', uccode=0x2CB2 }, + [0x2CB4] = { unicodeslot=0x2CB4, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC AIN', lccode=0x2CB5 }, + [0x2CB5] = { unicodeslot=0x2CB5, category='ll', description='COPTIC SMALL LETTER OLD COPTIC AIN', uccode=0x2CB4 }, + [0x2CB6] = { unicodeslot=0x2CB6, category='lu', description='COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE', lccode=0x2CB7 }, + [0x2CB7] = { unicodeslot=0x2CB7, category='ll', description='COPTIC SMALL LETTER CRYPTOGRAMMIC EIE', uccode=0x2CB6 }, + [0x2CB8] = { unicodeslot=0x2CB8, category='lu', description='COPTIC CAPITAL LETTER DIALECT-P KAPA', lccode=0x2CB9 }, + [0x2CB9] = { unicodeslot=0x2CB9, category='ll', description='COPTIC SMALL LETTER DIALECT-P KAPA', uccode=0x2CB8 }, + [0x2CBA] = { unicodeslot=0x2CBA, category='lu', description='COPTIC CAPITAL LETTER DIALECT-P NI', lccode=0x2CBB }, + [0x2CBB] = { unicodeslot=0x2CBB, category='ll', description='COPTIC SMALL LETTER DIALECT-P NI', uccode=0x2CBA }, + [0x2CBC] = { unicodeslot=0x2CBC, category='lu', description='COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI', lccode=0x2CBD }, + [0x2CBD] = { unicodeslot=0x2CBD, category='ll', description='COPTIC SMALL LETTER CRYPTOGRAMMIC NI', uccode=0x2CBC }, + [0x2CBE] = { unicodeslot=0x2CBE, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC OOU', lccode=0x2CBF }, + [0x2CBF] = { unicodeslot=0x2CBF, category='ll', description='COPTIC SMALL LETTER OLD COPTIC OOU', uccode=0x2CBE }, + [0x2CC0] = { unicodeslot=0x2CC0, category='lu', description='COPTIC CAPITAL LETTER SAMPI', lccode=0x2CC1 }, + [0x2CC1] = { unicodeslot=0x2CC1, category='ll', description='COPTIC SMALL LETTER SAMPI', uccode=0x2CC0 }, + [0x2CC2] = { unicodeslot=0x2CC2, category='lu', description='COPTIC CAPITAL LETTER CROSSED SHEI', lccode=0x2CC3 }, + [0x2CC3] = { unicodeslot=0x2CC3, category='ll', description='COPTIC SMALL LETTER CROSSED SHEI', uccode=0x2CC2 }, + [0x2CC4] = { unicodeslot=0x2CC4, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC SHEI', lccode=0x2CC5 }, + [0x2CC5] = { unicodeslot=0x2CC5, category='ll', description='COPTIC SMALL LETTER OLD COPTIC SHEI', uccode=0x2CC4 }, + [0x2CC6] = { unicodeslot=0x2CC6, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC ESH', lccode=0x2CC7 }, + [0x2CC7] = { unicodeslot=0x2CC7, category='ll', description='COPTIC SMALL LETTER OLD COPTIC ESH', uccode=0x2CC6 }, + [0x2CC8] = { unicodeslot=0x2CC8, category='lu', description='COPTIC CAPITAL LETTER AKHMIMIC KHEI', lccode=0x2CC9 }, + [0x2CC9] = { unicodeslot=0x2CC9, category='ll', description='COPTIC SMALL LETTER AKHMIMIC KHEI', uccode=0x2CC8 }, + [0x2CCA] = { unicodeslot=0x2CCA, category='lu', description='COPTIC CAPITAL LETTER DIALECT-P HORI', lccode=0x2CCB }, + [0x2CCB] = { unicodeslot=0x2CCB, category='ll', description='COPTIC SMALL LETTER DIALECT-P HORI', uccode=0x2CCA }, + [0x2CCC] = { unicodeslot=0x2CCC, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC HORI', lccode=0x2CCD }, + [0x2CCD] = { unicodeslot=0x2CCD, category='ll', description='COPTIC SMALL LETTER OLD COPTIC HORI', uccode=0x2CCC }, + [0x2CCE] = { unicodeslot=0x2CCE, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC HA', lccode=0x2CCF }, + [0x2CCF] = { unicodeslot=0x2CCF, category='ll', description='COPTIC SMALL LETTER OLD COPTIC HA', uccode=0x2CCE }, + [0x2CD0] = { unicodeslot=0x2CD0, category='lu', description='COPTIC CAPITAL LETTER L-SHAPED HA', lccode=0x2CD1 }, + [0x2CD1] = { unicodeslot=0x2CD1, category='ll', description='COPTIC SMALL LETTER L-SHAPED HA', uccode=0x2CD0 }, + [0x2CD2] = { unicodeslot=0x2CD2, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC HEI', lccode=0x2CD3 }, + [0x2CD3] = { unicodeslot=0x2CD3, category='ll', description='COPTIC SMALL LETTER OLD COPTIC HEI', uccode=0x2CD2 }, + [0x2CD4] = { unicodeslot=0x2CD4, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC HAT', lccode=0x2CD5 }, + [0x2CD5] = { unicodeslot=0x2CD5, category='ll', description='COPTIC SMALL LETTER OLD COPTIC HAT', uccode=0x2CD4 }, + [0x2CD6] = { unicodeslot=0x2CD6, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC GANGIA', lccode=0x2CD7 }, + [0x2CD7] = { unicodeslot=0x2CD7, category='ll', description='COPTIC SMALL LETTER OLD COPTIC GANGIA', uccode=0x2CD6 }, + [0x2CD8] = { unicodeslot=0x2CD8, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC DJA', lccode=0x2CD9 }, + [0x2CD9] = { unicodeslot=0x2CD9, category='ll', description='COPTIC SMALL LETTER OLD COPTIC DJA', uccode=0x2CD8 }, + [0x2CDA] = { unicodeslot=0x2CDA, category='lu', description='COPTIC CAPITAL LETTER OLD COPTIC SHIMA', lccode=0x2CDB }, + [0x2CDB] = { unicodeslot=0x2CDB, category='ll', description='COPTIC SMALL LETTER OLD COPTIC SHIMA', uccode=0x2CDA }, + [0x2CDC] = { unicodeslot=0x2CDC, category='lu', description='COPTIC CAPITAL LETTER OLD NUBIAN SHIMA', lccode=0x2CDD }, + [0x2CDD] = { unicodeslot=0x2CDD, category='ll', description='COPTIC SMALL LETTER OLD NUBIAN SHIMA', uccode=0x2CDC }, + [0x2CDE] = { unicodeslot=0x2CDE, category='lu', description='COPTIC CAPITAL LETTER OLD NUBIAN NGI', lccode=0x2CDF }, + [0x2CDF] = { unicodeslot=0x2CDF, category='ll', description='COPTIC SMALL LETTER OLD NUBIAN NGI', uccode=0x2CDE }, + [0x2CE0] = { unicodeslot=0x2CE0, category='lu', description='COPTIC CAPITAL LETTER OLD NUBIAN NYI', lccode=0x2CE1 }, + [0x2CE1] = { unicodeslot=0x2CE1, category='ll', description='COPTIC SMALL LETTER OLD NUBIAN NYI', uccode=0x2CE0 }, + [0x2CE2] = { unicodeslot=0x2CE2, category='lu', description='COPTIC CAPITAL LETTER OLD NUBIAN WAU', lccode=0x2CE3 }, + [0x2CE3] = { unicodeslot=0x2CE3, category='ll', description='COPTIC SMALL LETTER OLD NUBIAN WAU', uccode=0x2CE2 }, + [0x2CE4] = { unicodeslot=0x2CE4, category='ll', description='COPTIC SYMBOL KAI' }, + [0x2CE5] = { unicodeslot=0x2CE5, category='so', description='COPTIC SYMBOL MI RO' }, + [0x2CE6] = { unicodeslot=0x2CE6, category='so', description='COPTIC SYMBOL PI RO' }, + [0x2CE7] = { unicodeslot=0x2CE7, category='so', description='COPTIC SYMBOL STAUROS' }, + [0x2CE8] = { unicodeslot=0x2CE8, category='so', description='COPTIC SYMBOL TAU RO' }, + [0x2CE9] = { unicodeslot=0x2CE9, category='so', description='COPTIC SYMBOL KHI RO' }, + [0x2CEA] = { unicodeslot=0x2CEA, category='so', description='COPTIC SYMBOL SHIMA SIMA' }, + [0x2CF9] = { unicodeslot=0x2CF9, category='po', description='COPTIC OLD NUBIAN FULL STOP' }, + [0x2CFA] = { unicodeslot=0x2CFA, category='po', description='COPTIC OLD NUBIAN DIRECT QUESTION MARK' }, + [0x2CFB] = { unicodeslot=0x2CFB, category='po', description='COPTIC OLD NUBIAN INDIRECT QUESTION MARK' }, + [0x2CFC] = { unicodeslot=0x2CFC, category='po', description='COPTIC OLD NUBIAN VERSE DIVIDER' }, + [0x2CFD] = { unicodeslot=0x2CFD, category='no', description='COPTIC FRACTION ONE HALF' }, + [0x2CFE] = { unicodeslot=0x2CFE, category='po', description='COPTIC FULL STOP' }, + [0x2CFF] = { unicodeslot=0x2CFF, category='po', description='COPTIC MORPHOLOGICAL DIVIDER' }, + [0x2D00] = { unicodeslot=0x2D00, category='ll', description='GEORGIAN SMALL LETTER AN', uccode=0x10A0 }, + [0x2D01] = { unicodeslot=0x2D01, category='ll', description='GEORGIAN SMALL LETTER BAN', uccode=0x10A1 }, + [0x2D02] = { unicodeslot=0x2D02, category='ll', description='GEORGIAN SMALL LETTER GAN', uccode=0x10A2 }, + [0x2D03] = { unicodeslot=0x2D03, category='ll', description='GEORGIAN SMALL LETTER DON', uccode=0x10A3 }, + [0x2D04] = { unicodeslot=0x2D04, category='ll', description='GEORGIAN SMALL LETTER EN', uccode=0x10A4 }, + [0x2D05] = { unicodeslot=0x2D05, category='ll', description='GEORGIAN SMALL LETTER VIN', uccode=0x10A5 }, + [0x2D06] = { unicodeslot=0x2D06, category='ll', description='GEORGIAN SMALL LETTER ZEN', uccode=0x10A6 }, + [0x2D07] = { unicodeslot=0x2D07, category='ll', description='GEORGIAN SMALL LETTER TAN', uccode=0x10A7 }, + [0x2D08] = { unicodeslot=0x2D08, category='ll', description='GEORGIAN SMALL LETTER IN', uccode=0x10A8 }, + [0x2D09] = { unicodeslot=0x2D09, category='ll', description='GEORGIAN SMALL LETTER KAN', uccode=0x10A9 }, + [0x2D0A] = { unicodeslot=0x2D0A, category='ll', description='GEORGIAN SMALL LETTER LAS', uccode=0x10AA }, + [0x2D0B] = { unicodeslot=0x2D0B, category='ll', description='GEORGIAN SMALL LETTER MAN', uccode=0x10AB }, + [0x2D0C] = { unicodeslot=0x2D0C, category='ll', description='GEORGIAN SMALL LETTER NAR', uccode=0x10AC }, + [0x2D0D] = { unicodeslot=0x2D0D, category='ll', description='GEORGIAN SMALL LETTER ON', uccode=0x10AD }, + [0x2D0E] = { unicodeslot=0x2D0E, category='ll', description='GEORGIAN SMALL LETTER PAR', uccode=0x10AE }, + [0x2D0F] = { unicodeslot=0x2D0F, category='ll', description='GEORGIAN SMALL LETTER ZHAR', uccode=0x10AF }, + [0x2D10] = { unicodeslot=0x2D10, category='ll', description='GEORGIAN SMALL LETTER RAE', uccode=0x10B0 }, + [0x2D11] = { unicodeslot=0x2D11, category='ll', description='GEORGIAN SMALL LETTER SAN', uccode=0x10B1 }, + [0x2D12] = { unicodeslot=0x2D12, category='ll', description='GEORGIAN SMALL LETTER TAR', uccode=0x10B2 }, + [0x2D13] = { unicodeslot=0x2D13, category='ll', description='GEORGIAN SMALL LETTER UN', uccode=0x10B3 }, + [0x2D14] = { unicodeslot=0x2D14, category='ll', description='GEORGIAN SMALL LETTER PHAR', uccode=0x10B4 }, + [0x2D15] = { unicodeslot=0x2D15, category='ll', description='GEORGIAN SMALL LETTER KHAR', uccode=0x10B5 }, + [0x2D16] = { unicodeslot=0x2D16, category='ll', description='GEORGIAN SMALL LETTER GHAN', uccode=0x10B6 }, + [0x2D17] = { unicodeslot=0x2D17, category='ll', description='GEORGIAN SMALL LETTER QAR', uccode=0x10B7 }, + [0x2D18] = { unicodeslot=0x2D18, category='ll', description='GEORGIAN SMALL LETTER SHIN', uccode=0x10B8 }, + [0x2D19] = { unicodeslot=0x2D19, category='ll', description='GEORGIAN SMALL LETTER CHIN', uccode=0x10B9 }, + [0x2D1A] = { unicodeslot=0x2D1A, category='ll', description='GEORGIAN SMALL LETTER CAN', uccode=0x10BA }, + [0x2D1B] = { unicodeslot=0x2D1B, category='ll', description='GEORGIAN SMALL LETTER JIL', uccode=0x10BB }, + [0x2D1C] = { unicodeslot=0x2D1C, category='ll', description='GEORGIAN SMALL LETTER CIL', uccode=0x10BC }, + [0x2D1D] = { unicodeslot=0x2D1D, category='ll', description='GEORGIAN SMALL LETTER CHAR', uccode=0x10BD }, + [0x2D1E] = { unicodeslot=0x2D1E, category='ll', description='GEORGIAN SMALL LETTER XAN', uccode=0x10BE }, + [0x2D1F] = { unicodeslot=0x2D1F, category='ll', description='GEORGIAN SMALL LETTER JHAN', uccode=0x10BF }, + [0x2D20] = { unicodeslot=0x2D20, category='ll', description='GEORGIAN SMALL LETTER HAE', uccode=0x10C0 }, + [0x2D21] = { unicodeslot=0x2D21, category='ll', description='GEORGIAN SMALL LETTER HE', uccode=0x10C1 }, + [0x2D22] = { unicodeslot=0x2D22, category='ll', description='GEORGIAN SMALL LETTER HIE', uccode=0x10C2 }, + [0x2D23] = { unicodeslot=0x2D23, category='ll', description='GEORGIAN SMALL LETTER WE', uccode=0x10C3 }, + [0x2D24] = { unicodeslot=0x2D24, category='ll', description='GEORGIAN SMALL LETTER HAR', uccode=0x10C4 }, + [0x2D25] = { unicodeslot=0x2D25, category='ll', description='GEORGIAN SMALL LETTER HOE', uccode=0x10C5 }, + [0x2D30] = { unicodeslot=0x2D30, category='lo', description='TIFINAGH LETTER YA' }, + [0x2D31] = { unicodeslot=0x2D31, category='lo', description='TIFINAGH LETTER YAB' }, + [0x2D32] = { unicodeslot=0x2D32, category='lo', description='TIFINAGH LETTER YABH' }, + [0x2D33] = { unicodeslot=0x2D33, category='lo', description='TIFINAGH LETTER YAG' }, + [0x2D34] = { unicodeslot=0x2D34, category='lo', description='TIFINAGH LETTER YAGHH' }, + [0x2D35] = { unicodeslot=0x2D35, category='lo', description='TIFINAGH LETTER BERBER ACADEMY YAJ' }, + [0x2D36] = { unicodeslot=0x2D36, category='lo', description='TIFINAGH LETTER YAJ' }, + [0x2D37] = { unicodeslot=0x2D37, category='lo', description='TIFINAGH LETTER YAD' }, + [0x2D38] = { unicodeslot=0x2D38, category='lo', description='TIFINAGH LETTER YADH' }, + [0x2D39] = { unicodeslot=0x2D39, category='lo', description='TIFINAGH LETTER YADD' }, + [0x2D3A] = { unicodeslot=0x2D3A, category='lo', description='TIFINAGH LETTER YADDH' }, + [0x2D3B] = { unicodeslot=0x2D3B, category='lo', description='TIFINAGH LETTER YEY' }, + [0x2D3C] = { unicodeslot=0x2D3C, category='lo', description='TIFINAGH LETTER YAF' }, + [0x2D3D] = { unicodeslot=0x2D3D, category='lo', description='TIFINAGH LETTER YAK' }, + [0x2D3E] = { unicodeslot=0x2D3E, category='lo', description='TIFINAGH LETTER TUAREG YAK' }, + [0x2D3F] = { unicodeslot=0x2D3F, category='lo', description='TIFINAGH LETTER YAKHH' }, + [0x2D40] = { unicodeslot=0x2D40, category='lo', description='TIFINAGH LETTER YAH' }, + [0x2D41] = { unicodeslot=0x2D41, category='lo', description='TIFINAGH LETTER BERBER ACADEMY YAH' }, + [0x2D42] = { unicodeslot=0x2D42, category='lo', description='TIFINAGH LETTER TUAREG YAH' }, + [0x2D43] = { unicodeslot=0x2D43, category='lo', description='TIFINAGH LETTER YAHH' }, + [0x2D44] = { unicodeslot=0x2D44, category='lo', description='TIFINAGH LETTER YAA' }, + [0x2D45] = { unicodeslot=0x2D45, category='lo', description='TIFINAGH LETTER YAKH' }, + [0x2D46] = { unicodeslot=0x2D46, category='lo', description='TIFINAGH LETTER TUAREG YAKH' }, + [0x2D47] = { unicodeslot=0x2D47, category='lo', description='TIFINAGH LETTER YAQ' }, + [0x2D48] = { unicodeslot=0x2D48, category='lo', description='TIFINAGH LETTER TUAREG YAQ' }, + [0x2D49] = { unicodeslot=0x2D49, category='lo', description='TIFINAGH LETTER YI' }, + [0x2D4A] = { unicodeslot=0x2D4A, category='lo', description='TIFINAGH LETTER YAZH' }, + [0x2D4B] = { unicodeslot=0x2D4B, category='lo', description='TIFINAGH LETTER AHAGGAR YAZH' }, + [0x2D4C] = { unicodeslot=0x2D4C, category='lo', description='TIFINAGH LETTER TUAREG YAZH' }, + [0x2D4D] = { unicodeslot=0x2D4D, category='lo', description='TIFINAGH LETTER YAL' }, + [0x2D4E] = { unicodeslot=0x2D4E, category='lo', description='TIFINAGH LETTER YAM' }, + [0x2D4F] = { unicodeslot=0x2D4F, category='lo', description='TIFINAGH LETTER YAN' }, + [0x2D50] = { unicodeslot=0x2D50, category='lo', description='TIFINAGH LETTER TUAREG YAGN' }, + [0x2D51] = { unicodeslot=0x2D51, category='lo', description='TIFINAGH LETTER TUAREG YANG' }, + [0x2D52] = { unicodeslot=0x2D52, category='lo', description='TIFINAGH LETTER YAP' }, + [0x2D53] = { unicodeslot=0x2D53, category='lo', description='TIFINAGH LETTER YU' }, + [0x2D54] = { unicodeslot=0x2D54, category='lo', description='TIFINAGH LETTER YAR' }, + [0x2D55] = { unicodeslot=0x2D55, category='lo', description='TIFINAGH LETTER YARR' }, + [0x2D56] = { unicodeslot=0x2D56, category='lo', description='TIFINAGH LETTER YAGH' }, + [0x2D57] = { unicodeslot=0x2D57, category='lo', description='TIFINAGH LETTER TUAREG YAGH' }, + [0x2D58] = { unicodeslot=0x2D58, category='lo', description='TIFINAGH LETTER AYER YAGH' }, + [0x2D59] = { unicodeslot=0x2D59, category='lo', description='TIFINAGH LETTER YAS' }, + [0x2D5A] = { unicodeslot=0x2D5A, category='lo', description='TIFINAGH LETTER YASS' }, + [0x2D5B] = { unicodeslot=0x2D5B, category='lo', description='TIFINAGH LETTER YASH' }, + [0x2D5C] = { unicodeslot=0x2D5C, category='lo', description='TIFINAGH LETTER YAT' }, + [0x2D5D] = { unicodeslot=0x2D5D, category='lo', description='TIFINAGH LETTER YATH' }, + [0x2D5E] = { unicodeslot=0x2D5E, category='lo', description='TIFINAGH LETTER YACH' }, + [0x2D5F] = { unicodeslot=0x2D5F, category='lo', description='TIFINAGH LETTER YATT' }, + [0x2D60] = { unicodeslot=0x2D60, category='lo', description='TIFINAGH LETTER YAV' }, + [0x2D61] = { unicodeslot=0x2D61, category='lo', description='TIFINAGH LETTER YAW' }, + [0x2D62] = { unicodeslot=0x2D62, category='lo', description='TIFINAGH LETTER YAY' }, + [0x2D63] = { unicodeslot=0x2D63, category='lo', description='TIFINAGH LETTER YAZ' }, + [0x2D64] = { unicodeslot=0x2D64, category='lo', description='TIFINAGH LETTER TAWELLEMET YAZ' }, + [0x2D65] = { unicodeslot=0x2D65, category='lo', description='TIFINAGH LETTER YAZZ' }, + [0x2D6F] = { unicodeslot=0x2D6F, category='lm', description='TIFINAGH MODIFIER LETTER LABIALIZATION MARK', specials={'super',0x2D61} }, + [0x2D80] = { unicodeslot=0x2D80, category='lo', description='ETHIOPIC SYLLABLE LOA' }, + [0x2D81] = { unicodeslot=0x2D81, category='lo', description='ETHIOPIC SYLLABLE MOA' }, + [0x2D82] = { unicodeslot=0x2D82, category='lo', description='ETHIOPIC SYLLABLE ROA' }, + [0x2D83] = { unicodeslot=0x2D83, category='lo', description='ETHIOPIC SYLLABLE SOA' }, + [0x2D84] = { unicodeslot=0x2D84, category='lo', description='ETHIOPIC SYLLABLE SHOA' }, + [0x2D85] = { unicodeslot=0x2D85, category='lo', description='ETHIOPIC SYLLABLE BOA' }, + [0x2D86] = { unicodeslot=0x2D86, category='lo', description='ETHIOPIC SYLLABLE TOA' }, + [0x2D87] = { unicodeslot=0x2D87, category='lo', description='ETHIOPIC SYLLABLE COA' }, + [0x2D88] = { unicodeslot=0x2D88, category='lo', description='ETHIOPIC SYLLABLE NOA' }, + [0x2D89] = { unicodeslot=0x2D89, category='lo', description='ETHIOPIC SYLLABLE NYOA' }, + [0x2D8A] = { unicodeslot=0x2D8A, category='lo', description='ETHIOPIC SYLLABLE GLOTTAL OA' }, + [0x2D8B] = { unicodeslot=0x2D8B, category='lo', description='ETHIOPIC SYLLABLE ZOA' }, + [0x2D8C] = { unicodeslot=0x2D8C, category='lo', description='ETHIOPIC SYLLABLE DOA' }, + [0x2D8D] = { unicodeslot=0x2D8D, category='lo', description='ETHIOPIC SYLLABLE DDOA' }, + [0x2D8E] = { unicodeslot=0x2D8E, category='lo', description='ETHIOPIC SYLLABLE JOA' }, + [0x2D8F] = { unicodeslot=0x2D8F, category='lo', description='ETHIOPIC SYLLABLE THOA' }, + [0x2D90] = { unicodeslot=0x2D90, category='lo', description='ETHIOPIC SYLLABLE CHOA' }, + [0x2D91] = { unicodeslot=0x2D91, category='lo', description='ETHIOPIC SYLLABLE PHOA' }, + [0x2D92] = { unicodeslot=0x2D92, category='lo', description='ETHIOPIC SYLLABLE POA' }, + [0x2D93] = { unicodeslot=0x2D93, category='lo', description='ETHIOPIC SYLLABLE GGWA' }, + [0x2D94] = { unicodeslot=0x2D94, category='lo', description='ETHIOPIC SYLLABLE GGWI' }, + [0x2D95] = { unicodeslot=0x2D95, category='lo', description='ETHIOPIC SYLLABLE GGWEE' }, + [0x2D96] = { unicodeslot=0x2D96, category='lo', description='ETHIOPIC SYLLABLE GGWE' }, + [0x2DA0] = { unicodeslot=0x2DA0, category='lo', description='ETHIOPIC SYLLABLE SSA' }, + [0x2DA1] = { unicodeslot=0x2DA1, category='lo', description='ETHIOPIC SYLLABLE SSU' }, + [0x2DA2] = { unicodeslot=0x2DA2, category='lo', description='ETHIOPIC SYLLABLE SSI' }, + [0x2DA3] = { unicodeslot=0x2DA3, category='lo', description='ETHIOPIC SYLLABLE SSAA' }, + [0x2DA4] = { unicodeslot=0x2DA4, category='lo', description='ETHIOPIC SYLLABLE SSEE' }, + [0x2DA5] = { unicodeslot=0x2DA5, category='lo', description='ETHIOPIC SYLLABLE SSE' }, + [0x2DA6] = { unicodeslot=0x2DA6, category='lo', description='ETHIOPIC SYLLABLE SSO' }, + [0x2DA8] = { unicodeslot=0x2DA8, category='lo', description='ETHIOPIC SYLLABLE CCA' }, + [0x2DA9] = { unicodeslot=0x2DA9, category='lo', description='ETHIOPIC SYLLABLE CCU' }, + [0x2DAA] = { unicodeslot=0x2DAA, category='lo', description='ETHIOPIC SYLLABLE CCI' }, + [0x2DAB] = { unicodeslot=0x2DAB, category='lo', description='ETHIOPIC SYLLABLE CCAA' }, + [0x2DAC] = { unicodeslot=0x2DAC, category='lo', description='ETHIOPIC SYLLABLE CCEE' }, + [0x2DAD] = { unicodeslot=0x2DAD, category='lo', description='ETHIOPIC SYLLABLE CCE' }, + [0x2DAE] = { unicodeslot=0x2DAE, category='lo', description='ETHIOPIC SYLLABLE CCO' }, + [0x2DB0] = { unicodeslot=0x2DB0, category='lo', description='ETHIOPIC SYLLABLE ZZA' }, + [0x2DB1] = { unicodeslot=0x2DB1, category='lo', description='ETHIOPIC SYLLABLE ZZU' }, + [0x2DB2] = { unicodeslot=0x2DB2, category='lo', description='ETHIOPIC SYLLABLE ZZI' }, + [0x2DB3] = { unicodeslot=0x2DB3, category='lo', description='ETHIOPIC SYLLABLE ZZAA' }, + [0x2DB4] = { unicodeslot=0x2DB4, category='lo', description='ETHIOPIC SYLLABLE ZZEE' }, + [0x2DB5] = { unicodeslot=0x2DB5, category='lo', description='ETHIOPIC SYLLABLE ZZE' }, + [0x2DB6] = { unicodeslot=0x2DB6, category='lo', description='ETHIOPIC SYLLABLE ZZO' }, + [0x2DB8] = { unicodeslot=0x2DB8, category='lo', description='ETHIOPIC SYLLABLE CCHA' }, + [0x2DB9] = { unicodeslot=0x2DB9, category='lo', description='ETHIOPIC SYLLABLE CCHU' }, + [0x2DBA] = { unicodeslot=0x2DBA, category='lo', description='ETHIOPIC SYLLABLE CCHI' }, + [0x2DBB] = { unicodeslot=0x2DBB, category='lo', description='ETHIOPIC SYLLABLE CCHAA' }, + [0x2DBC] = { unicodeslot=0x2DBC, category='lo', description='ETHIOPIC SYLLABLE CCHEE' }, + [0x2DBD] = { unicodeslot=0x2DBD, category='lo', description='ETHIOPIC SYLLABLE CCHE' }, + [0x2DBE] = { unicodeslot=0x2DBE, category='lo', description='ETHIOPIC SYLLABLE CCHO' }, + [0x2DC0] = { unicodeslot=0x2DC0, category='lo', description='ETHIOPIC SYLLABLE QYA' }, + [0x2DC1] = { unicodeslot=0x2DC1, category='lo', description='ETHIOPIC SYLLABLE QYU' }, + [0x2DC2] = { unicodeslot=0x2DC2, category='lo', description='ETHIOPIC SYLLABLE QYI' }, + [0x2DC3] = { unicodeslot=0x2DC3, category='lo', description='ETHIOPIC SYLLABLE QYAA' }, + [0x2DC4] = { unicodeslot=0x2DC4, category='lo', description='ETHIOPIC SYLLABLE QYEE' }, + [0x2DC5] = { unicodeslot=0x2DC5, category='lo', description='ETHIOPIC SYLLABLE QYE' }, + [0x2DC6] = { unicodeslot=0x2DC6, category='lo', description='ETHIOPIC SYLLABLE QYO' }, + [0x2DC8] = { unicodeslot=0x2DC8, category='lo', description='ETHIOPIC SYLLABLE KYA' }, + [0x2DC9] = { unicodeslot=0x2DC9, category='lo', description='ETHIOPIC SYLLABLE KYU' }, + [0x2DCA] = { unicodeslot=0x2DCA, category='lo', description='ETHIOPIC SYLLABLE KYI' }, + [0x2DCB] = { unicodeslot=0x2DCB, category='lo', description='ETHIOPIC SYLLABLE KYAA' }, + [0x2DCC] = { unicodeslot=0x2DCC, category='lo', description='ETHIOPIC SYLLABLE KYEE' }, + [0x2DCD] = { unicodeslot=0x2DCD, category='lo', description='ETHIOPIC SYLLABLE KYE' }, + [0x2DCE] = { unicodeslot=0x2DCE, category='lo', description='ETHIOPIC SYLLABLE KYO' }, + [0x2DD0] = { unicodeslot=0x2DD0, category='lo', description='ETHIOPIC SYLLABLE XYA' }, + [0x2DD1] = { unicodeslot=0x2DD1, category='lo', description='ETHIOPIC SYLLABLE XYU' }, + [0x2DD2] = { unicodeslot=0x2DD2, category='lo', description='ETHIOPIC SYLLABLE XYI' }, + [0x2DD3] = { unicodeslot=0x2DD3, category='lo', description='ETHIOPIC SYLLABLE XYAA' }, + [0x2DD4] = { unicodeslot=0x2DD4, category='lo', description='ETHIOPIC SYLLABLE XYEE' }, + [0x2DD5] = { unicodeslot=0x2DD5, category='lo', description='ETHIOPIC SYLLABLE XYE' }, + [0x2DD6] = { unicodeslot=0x2DD6, category='lo', description='ETHIOPIC SYLLABLE XYO' }, + [0x2DD8] = { unicodeslot=0x2DD8, category='lo', description='ETHIOPIC SYLLABLE GYA' }, + [0x2DD9] = { unicodeslot=0x2DD9, category='lo', description='ETHIOPIC SYLLABLE GYU' }, + [0x2DDA] = { unicodeslot=0x2DDA, category='lo', description='ETHIOPIC SYLLABLE GYI' }, + [0x2DDB] = { unicodeslot=0x2DDB, category='lo', description='ETHIOPIC SYLLABLE GYAA' }, + [0x2DDC] = { unicodeslot=0x2DDC, category='lo', description='ETHIOPIC SYLLABLE GYEE' }, + [0x2DDD] = { unicodeslot=0x2DDD, category='lo', description='ETHIOPIC SYLLABLE GYE' }, + [0x2DDE] = { unicodeslot=0x2DDE, category='lo', description='ETHIOPIC SYLLABLE GYO' }, + [0x2E00] = { unicodeslot=0x2E00, category='po', description='RIGHT ANGLE SUBSTITUTION MARKER' }, + [0x2E01] = { unicodeslot=0x2E01, category='po', description='RIGHT ANGLE DOTTED SUBSTITUTION MARKER' }, + [0x2E02] = { unicodeslot=0x2E02, category='pi', description='LEFT SUBSTITUTION BRACKET' }, + [0x2E03] = { unicodeslot=0x2E03, category='pf', description='RIGHT SUBSTITUTION BRACKET' }, + [0x2E04] = { unicodeslot=0x2E04, category='pi', description='LEFT DOTTED SUBSTITUTION BRACKET' }, + [0x2E05] = { unicodeslot=0x2E05, category='pf', description='RIGHT DOTTED SUBSTITUTION BRACKET' }, + [0x2E06] = { unicodeslot=0x2E06, category='po', description='RAISED INTERPOLATION MARKER' }, + [0x2E07] = { unicodeslot=0x2E07, category='po', description='RAISED DOTTED INTERPOLATION MARKER' }, + [0x2E08] = { unicodeslot=0x2E08, category='po', description='DOTTED TRANSPOSITION MARKER' }, + [0x2E09] = { unicodeslot=0x2E09, category='pi', description='LEFT TRANSPOSITION BRACKET' }, + [0x2E0A] = { unicodeslot=0x2E0A, category='pf', description='RIGHT TRANSPOSITION BRACKET' }, + [0x2E0B] = { unicodeslot=0x2E0B, category='po', description='RAISED SQUARE' }, + [0x2E0C] = { unicodeslot=0x2E0C, category='pi', description='LEFT RAISED OMISSION BRACKET' }, + [0x2E0D] = { unicodeslot=0x2E0D, category='pf', description='RIGHT RAISED OMISSION BRACKET' }, + [0x2E0E] = { unicodeslot=0x2E0E, category='po', description='EDITORIAL CORONIS' }, + [0x2E0F] = { unicodeslot=0x2E0F, category='po', description='PARAGRAPHOS' }, + [0x2E10] = { unicodeslot=0x2E10, category='po', description='FORKED PARAGRAPHOS' }, + [0x2E11] = { unicodeslot=0x2E11, category='po', description='REVERSED FORKED PARAGRAPHOS' }, + [0x2E12] = { unicodeslot=0x2E12, category='po', description='HYPODIASTOLE' }, + [0x2E13] = { unicodeslot=0x2E13, category='po', description='DOTTED OBELOS' }, + [0x2E14] = { unicodeslot=0x2E14, category='po', description='DOWNWARDS ANCORA' }, + [0x2E15] = { unicodeslot=0x2E15, category='po', description='UPWARDS ANCORA' }, + [0x2E16] = { unicodeslot=0x2E16, category='po', description='DOTTED RIGHT-POINTING ANGLE' }, + [0x2E17] = { unicodeslot=0x2E17, category='pd', description='DOUBLE OBLIQUE HYPHEN' }, + [0x2E1C] = { unicodeslot=0x2E1C, category='pi', description='LEFT LOW PARAPHRASE BRACKET' }, + [0x2E1D] = { unicodeslot=0x2E1D, category='pf', description='RIGHT LOW PARAPHRASE BRACKET' }, + [0x2E80] = { unicodeslot=0x2E80, category='so', description='CJK RADICAL REPEAT' }, + [0x2E81] = { unicodeslot=0x2E81, category='so', description='CJK RADICAL CLIFF' }, + [0x2E82] = { unicodeslot=0x2E82, category='so', description='CJK RADICAL SECOND ONE' }, + [0x2E83] = { unicodeslot=0x2E83, category='so', description='CJK RADICAL SECOND TWO' }, + [0x2E84] = { unicodeslot=0x2E84, category='so', description='CJK RADICAL SECOND THREE' }, + [0x2E85] = { unicodeslot=0x2E85, category='so', description='CJK RADICAL PERSON' }, + [0x2E86] = { unicodeslot=0x2E86, category='so', description='CJK RADICAL BOX' }, + [0x2E87] = { unicodeslot=0x2E87, category='so', description='CJK RADICAL TABLE' }, + [0x2E88] = { unicodeslot=0x2E88, category='so', description='CJK RADICAL KNIFE ONE' }, + [0x2E89] = { unicodeslot=0x2E89, category='so', description='CJK RADICAL KNIFE TWO' }, + [0x2E8A] = { unicodeslot=0x2E8A, category='so', description='CJK RADICAL DIVINATION' }, + [0x2E8B] = { unicodeslot=0x2E8B, category='so', description='CJK RADICAL SEAL' }, + [0x2E8C] = { unicodeslot=0x2E8C, category='so', description='CJK RADICAL SMALL ONE' }, + [0x2E8D] = { unicodeslot=0x2E8D, category='so', description='CJK RADICAL SMALL TWO' }, + [0x2E8E] = { unicodeslot=0x2E8E, category='so', description='CJK RADICAL LAME ONE' }, + [0x2E8F] = { unicodeslot=0x2E8F, category='so', description='CJK RADICAL LAME TWO' }, + [0x2E90] = { unicodeslot=0x2E90, category='so', description='CJK RADICAL LAME THREE' }, + [0x2E91] = { unicodeslot=0x2E91, category='so', description='CJK RADICAL LAME FOUR' }, + [0x2E92] = { unicodeslot=0x2E92, category='so', description='CJK RADICAL SNAKE' }, + [0x2E93] = { unicodeslot=0x2E93, category='so', description='CJK RADICAL THREAD' }, + [0x2E94] = { unicodeslot=0x2E94, category='so', description='CJK RADICAL SNOUT ONE' }, + [0x2E95] = { unicodeslot=0x2E95, category='so', description='CJK RADICAL SNOUT TWO' }, + [0x2E96] = { unicodeslot=0x2E96, category='so', description='CJK RADICAL HEART ONE' }, + [0x2E97] = { unicodeslot=0x2E97, category='so', description='CJK RADICAL HEART TWO' }, + [0x2E98] = { unicodeslot=0x2E98, category='so', description='CJK RADICAL HAND' }, + [0x2E99] = { unicodeslot=0x2E99, category='so', description='CJK RADICAL RAP' }, + [0x2E9B] = { unicodeslot=0x2E9B, category='so', description='CJK RADICAL CHOKE' }, + [0x2E9C] = { unicodeslot=0x2E9C, category='so', description='CJK RADICAL SUN' }, + [0x2E9D] = { unicodeslot=0x2E9D, category='so', description='CJK RADICAL MOON' }, + [0x2E9E] = { unicodeslot=0x2E9E, category='so', description='CJK RADICAL DEATH' }, + [0x2E9F] = { unicodeslot=0x2E9F, category='so', description='CJK RADICAL MOTHER', specials={'compat',0x6BCD} }, + [0x2EA0] = { unicodeslot=0x2EA0, category='so', description='CJK RADICAL CIVILIAN' }, + [0x2EA1] = { unicodeslot=0x2EA1, category='so', description='CJK RADICAL WATER ONE' }, + [0x2EA2] = { unicodeslot=0x2EA2, category='so', description='CJK RADICAL WATER TWO' }, + [0x2EA3] = { unicodeslot=0x2EA3, category='so', description='CJK RADICAL FIRE' }, + [0x2EA4] = { unicodeslot=0x2EA4, category='so', description='CJK RADICAL PAW ONE' }, + [0x2EA5] = { unicodeslot=0x2EA5, category='so', description='CJK RADICAL PAW TWO' }, + [0x2EA6] = { unicodeslot=0x2EA6, category='so', description='CJK RADICAL SIMPLIFIED HALF TREE TRUNK' }, + [0x2EA7] = { unicodeslot=0x2EA7, category='so', description='CJK RADICAL COW' }, + [0x2EA8] = { unicodeslot=0x2EA8, category='so', description='CJK RADICAL DOG' }, + [0x2EA9] = { unicodeslot=0x2EA9, category='so', description='CJK RADICAL JADE' }, + [0x2EAA] = { unicodeslot=0x2EAA, category='so', description='CJK RADICAL BOLT OF CLOTH' }, + [0x2EAB] = { unicodeslot=0x2EAB, category='so', description='CJK RADICAL EYE' }, + [0x2EAC] = { unicodeslot=0x2EAC, category='so', description='CJK RADICAL SPIRIT ONE' }, + [0x2EAD] = { unicodeslot=0x2EAD, category='so', description='CJK RADICAL SPIRIT TWO' }, + [0x2EAE] = { unicodeslot=0x2EAE, category='so', description='CJK RADICAL BAMBOO' }, + [0x2EAF] = { unicodeslot=0x2EAF, category='so', description='CJK RADICAL SILK' }, + [0x2EB0] = { unicodeslot=0x2EB0, category='so', description='CJK RADICAL C-SIMPLIFIED SILK' }, + [0x2EB1] = { unicodeslot=0x2EB1, category='so', description='CJK RADICAL NET ONE' }, + [0x2EB2] = { unicodeslot=0x2EB2, category='so', description='CJK RADICAL NET TWO' }, + [0x2EB3] = { unicodeslot=0x2EB3, category='so', description='CJK RADICAL NET THREE' }, + [0x2EB4] = { unicodeslot=0x2EB4, category='so', description='CJK RADICAL NET FOUR' }, + [0x2EB5] = { unicodeslot=0x2EB5, category='so', description='CJK RADICAL MESH' }, + [0x2EB6] = { unicodeslot=0x2EB6, category='so', description='CJK RADICAL SHEEP' }, + [0x2EB7] = { unicodeslot=0x2EB7, category='so', description='CJK RADICAL RAM' }, + [0x2EB8] = { unicodeslot=0x2EB8, category='so', description='CJK RADICAL EWE' }, + [0x2EB9] = { unicodeslot=0x2EB9, category='so', description='CJK RADICAL OLD' }, + [0x2EBA] = { unicodeslot=0x2EBA, category='so', description='CJK RADICAL BRUSH ONE' }, + [0x2EBB] = { unicodeslot=0x2EBB, category='so', description='CJK RADICAL BRUSH TWO' }, + [0x2EBC] = { unicodeslot=0x2EBC, category='so', description='CJK RADICAL MEAT' }, + [0x2EBD] = { unicodeslot=0x2EBD, category='so', description='CJK RADICAL MORTAR' }, + [0x2EBE] = { unicodeslot=0x2EBE, category='so', description='CJK RADICAL GRASS ONE' }, + [0x2EBF] = { unicodeslot=0x2EBF, category='so', description='CJK RADICAL GRASS TWO' }, + [0x2EC0] = { unicodeslot=0x2EC0, category='so', description='CJK RADICAL GRASS THREE' }, + [0x2EC1] = { unicodeslot=0x2EC1, category='so', description='CJK RADICAL TIGER' }, + [0x2EC2] = { unicodeslot=0x2EC2, category='so', description='CJK RADICAL CLOTHES' }, + [0x2EC3] = { unicodeslot=0x2EC3, category='so', description='CJK RADICAL WEST ONE' }, + [0x2EC4] = { unicodeslot=0x2EC4, category='so', description='CJK RADICAL WEST TWO' }, + [0x2EC5] = { unicodeslot=0x2EC5, category='so', description='CJK RADICAL C-SIMPLIFIED SEE' }, + [0x2EC6] = { unicodeslot=0x2EC6, category='so', description='CJK RADICAL SIMPLIFIED HORN' }, + [0x2EC7] = { unicodeslot=0x2EC7, category='so', description='CJK RADICAL HORN' }, + [0x2EC8] = { unicodeslot=0x2EC8, category='so', description='CJK RADICAL C-SIMPLIFIED SPEECH' }, + [0x2EC9] = { unicodeslot=0x2EC9, category='so', description='CJK RADICAL C-SIMPLIFIED SHELL' }, + [0x2ECA] = { unicodeslot=0x2ECA, category='so', description='CJK RADICAL FOOT' }, + [0x2ECB] = { unicodeslot=0x2ECB, category='so', description='CJK RADICAL C-SIMPLIFIED CART' }, + [0x2ECC] = { unicodeslot=0x2ECC, category='so', description='CJK RADICAL SIMPLIFIED WALK' }, + [0x2ECD] = { unicodeslot=0x2ECD, category='so', description='CJK RADICAL WALK ONE' }, + [0x2ECE] = { unicodeslot=0x2ECE, category='so', description='CJK RADICAL WALK TWO' }, + [0x2ECF] = { unicodeslot=0x2ECF, category='so', description='CJK RADICAL CITY' }, + [0x2ED0] = { unicodeslot=0x2ED0, category='so', description='CJK RADICAL C-SIMPLIFIED GOLD' }, + [0x2ED1] = { unicodeslot=0x2ED1, category='so', description='CJK RADICAL LONG ONE' }, + [0x2ED2] = { unicodeslot=0x2ED2, category='so', description='CJK RADICAL LONG TWO' }, + [0x2ED3] = { unicodeslot=0x2ED3, category='so', description='CJK RADICAL C-SIMPLIFIED LONG' }, + [0x2ED4] = { unicodeslot=0x2ED4, category='so', description='CJK RADICAL C-SIMPLIFIED GATE' }, + [0x2ED5] = { unicodeslot=0x2ED5, category='so', description='CJK RADICAL MOUND ONE' }, + [0x2ED6] = { unicodeslot=0x2ED6, category='so', description='CJK RADICAL MOUND TWO' }, + [0x2ED7] = { unicodeslot=0x2ED7, category='so', description='CJK RADICAL RAIN' }, + [0x2ED8] = { unicodeslot=0x2ED8, category='so', description='CJK RADICAL BLUE' }, + [0x2ED9] = { unicodeslot=0x2ED9, category='so', description='CJK RADICAL C-SIMPLIFIED TANNED LEATHER' }, + [0x2EDA] = { unicodeslot=0x2EDA, category='so', description='CJK RADICAL C-SIMPLIFIED LEAF' }, + [0x2EDB] = { unicodeslot=0x2EDB, category='so', description='CJK RADICAL C-SIMPLIFIED WIND' }, + [0x2EDC] = { unicodeslot=0x2EDC, category='so', description='CJK RADICAL C-SIMPLIFIED FLY' }, + [0x2EDD] = { unicodeslot=0x2EDD, category='so', description='CJK RADICAL EAT ONE' }, + [0x2EDE] = { unicodeslot=0x2EDE, category='so', description='CJK RADICAL EAT TWO' }, + [0x2EDF] = { unicodeslot=0x2EDF, category='so', description='CJK RADICAL EAT THREE' }, + [0x2EE0] = { unicodeslot=0x2EE0, category='so', description='CJK RADICAL C-SIMPLIFIED EAT' }, + [0x2EE1] = { unicodeslot=0x2EE1, category='so', description='CJK RADICAL HEAD' }, + [0x2EE2] = { unicodeslot=0x2EE2, category='so', description='CJK RADICAL C-SIMPLIFIED HORSE' }, + [0x2EE3] = { unicodeslot=0x2EE3, category='so', description='CJK RADICAL BONE' }, + [0x2EE4] = { unicodeslot=0x2EE4, category='so', description='CJK RADICAL GHOST' }, + [0x2EE5] = { unicodeslot=0x2EE5, category='so', description='CJK RADICAL C-SIMPLIFIED FISH' }, + [0x2EE6] = { unicodeslot=0x2EE6, category='so', description='CJK RADICAL C-SIMPLIFIED BIRD' }, + [0x2EE7] = { unicodeslot=0x2EE7, category='so', description='CJK RADICAL C-SIMPLIFIED SALT' }, + [0x2EE8] = { unicodeslot=0x2EE8, category='so', description='CJK RADICAL SIMPLIFIED WHEAT' }, + [0x2EE9] = { unicodeslot=0x2EE9, category='so', description='CJK RADICAL SIMPLIFIED YELLOW' }, + [0x2EEA] = { unicodeslot=0x2EEA, category='so', description='CJK RADICAL C-SIMPLIFIED FROG' }, + [0x2EEB] = { unicodeslot=0x2EEB, category='so', description='CJK RADICAL J-SIMPLIFIED EVEN' }, + [0x2EEC] = { unicodeslot=0x2EEC, category='so', description='CJK RADICAL C-SIMPLIFIED EVEN' }, + [0x2EED] = { unicodeslot=0x2EED, category='so', description='CJK RADICAL J-SIMPLIFIED TOOTH' }, + [0x2EEE] = { unicodeslot=0x2EEE, category='so', description='CJK RADICAL C-SIMPLIFIED TOOTH' }, + [0x2EEF] = { unicodeslot=0x2EEF, category='so', description='CJK RADICAL J-SIMPLIFIED DRAGON' }, + [0x2EF0] = { unicodeslot=0x2EF0, category='so', description='CJK RADICAL C-SIMPLIFIED DRAGON' }, + [0x2EF1] = { unicodeslot=0x2EF1, category='so', description='CJK RADICAL TURTLE' }, + [0x2EF2] = { unicodeslot=0x2EF2, category='so', description='CJK RADICAL J-SIMPLIFIED TURTLE' }, + [0x2EF3] = { unicodeslot=0x2EF3, category='so', description='CJK RADICAL C-SIMPLIFIED TURTLE', specials={'compat',0x9F9F} }, + [0x2F00] = { unicodeslot=0x2F00, category='so', description='KANGXI RADICAL ONE', specials={'compat',0x4E00} }, + [0x2F01] = { unicodeslot=0x2F01, category='so', description='KANGXI RADICAL LINE', specials={'compat',0x4E28} }, + [0x2F02] = { unicodeslot=0x2F02, category='so', description='KANGXI RADICAL DOT', specials={'compat',0x4E36} }, + [0x2F03] = { unicodeslot=0x2F03, category='so', description='KANGXI RADICAL SLASH', specials={'compat',0x4E3F} }, + [0x2F04] = { unicodeslot=0x2F04, category='so', description='KANGXI RADICAL SECOND', specials={'compat',0x4E59} }, + [0x2F05] = { unicodeslot=0x2F05, category='so', description='KANGXI RADICAL HOOK', specials={'compat',0x4E85} }, + [0x2F06] = { unicodeslot=0x2F06, category='so', description='KANGXI RADICAL TWO', specials={'compat',0x4E8C} }, + [0x2F07] = { unicodeslot=0x2F07, category='so', description='KANGXI RADICAL LID', specials={'compat',0x4EA0} }, + [0x2F08] = { unicodeslot=0x2F08, category='so', description='KANGXI RADICAL MAN', specials={'compat',0x4EBA} }, + [0x2F09] = { unicodeslot=0x2F09, category='so', description='KANGXI RADICAL LEGS', specials={'compat',0x513F} }, + [0x2F0A] = { unicodeslot=0x2F0A, category='so', description='KANGXI RADICAL ENTER', specials={'compat',0x5165} }, + [0x2F0B] = { unicodeslot=0x2F0B, category='so', description='KANGXI RADICAL EIGHT', specials={'compat',0x516B} }, + [0x2F0C] = { unicodeslot=0x2F0C, category='so', description='KANGXI RADICAL DOWN BOX', specials={'compat',0x5182} }, + [0x2F0D] = { unicodeslot=0x2F0D, category='so', description='KANGXI RADICAL COVER', specials={'compat',0x5196} }, + [0x2F0E] = { unicodeslot=0x2F0E, category='so', description='KANGXI RADICAL ICE', specials={'compat',0x51AB} }, + [0x2F0F] = { unicodeslot=0x2F0F, category='so', description='KANGXI RADICAL TABLE', specials={'compat',0x51E0} }, + [0x2F10] = { unicodeslot=0x2F10, category='so', description='KANGXI RADICAL OPEN BOX', specials={'compat',0x51F5} }, + [0x2F11] = { unicodeslot=0x2F11, category='so', description='KANGXI RADICAL KNIFE', specials={'compat',0x5200} }, + [0x2F12] = { unicodeslot=0x2F12, category='so', description='KANGXI RADICAL POWER', specials={'compat',0x529B} }, + [0x2F13] = { unicodeslot=0x2F13, category='so', description='KANGXI RADICAL WRAP', specials={'compat',0x52F9} }, + [0x2F14] = { unicodeslot=0x2F14, category='so', description='KANGXI RADICAL SPOON', specials={'compat',0x5315} }, + [0x2F15] = { unicodeslot=0x2F15, category='so', description='KANGXI RADICAL RIGHT OPEN BOX', specials={'compat',0x531A} }, + [0x2F16] = { unicodeslot=0x2F16, category='so', description='KANGXI RADICAL HIDING ENCLOSURE', specials={'compat',0x5338} }, + [0x2F17] = { unicodeslot=0x2F17, category='so', description='KANGXI RADICAL TEN', specials={'compat',0x5341} }, + [0x2F18] = { unicodeslot=0x2F18, category='so', description='KANGXI RADICAL DIVINATION', specials={'compat',0x535C} }, + [0x2F19] = { unicodeslot=0x2F19, category='so', description='KANGXI RADICAL SEAL', specials={'compat',0x5369} }, + [0x2F1A] = { unicodeslot=0x2F1A, category='so', description='KANGXI RADICAL CLIFF', specials={'compat',0x5382} }, + [0x2F1B] = { unicodeslot=0x2F1B, category='so', description='KANGXI RADICAL PRIVATE', specials={'compat',0x53B6} }, + [0x2F1C] = { unicodeslot=0x2F1C, category='so', description='KANGXI RADICAL AGAIN', specials={'compat',0x53C8} }, + [0x2F1D] = { unicodeslot=0x2F1D, category='so', description='KANGXI RADICAL MOUTH', specials={'compat',0x53E3} }, + [0x2F1E] = { unicodeslot=0x2F1E, category='so', description='KANGXI RADICAL ENCLOSURE', specials={'compat',0x56D7} }, + [0x2F1F] = { unicodeslot=0x2F1F, category='so', description='KANGXI RADICAL EARTH', specials={'compat',0x571F} }, + [0x2F20] = { unicodeslot=0x2F20, category='so', description='KANGXI RADICAL SCHOLAR', specials={'compat',0x58EB} }, + [0x2F21] = { unicodeslot=0x2F21, category='so', description='KANGXI RADICAL GO', specials={'compat',0x5902} }, + [0x2F22] = { unicodeslot=0x2F22, category='so', description='KANGXI RADICAL GO SLOWLY', specials={'compat',0x590A} }, + [0x2F23] = { unicodeslot=0x2F23, category='so', description='KANGXI RADICAL EVENING', specials={'compat',0x5915} }, + [0x2F24] = { unicodeslot=0x2F24, category='so', description='KANGXI RADICAL BIG', specials={'compat',0x5927} }, + [0x2F25] = { unicodeslot=0x2F25, category='so', description='KANGXI RADICAL WOMAN', specials={'compat',0x5973} }, + [0x2F26] = { unicodeslot=0x2F26, category='so', description='KANGXI RADICAL CHILD', specials={'compat',0x5B50} }, + [0x2F27] = { unicodeslot=0x2F27, category='so', description='KANGXI RADICAL ROOF', specials={'compat',0x5B80} }, + [0x2F28] = { unicodeslot=0x2F28, category='so', description='KANGXI RADICAL INCH', specials={'compat',0x5BF8} }, + [0x2F29] = { unicodeslot=0x2F29, category='so', description='KANGXI RADICAL SMALL', specials={'compat',0x5C0F} }, + [0x2F2A] = { unicodeslot=0x2F2A, category='so', description='KANGXI RADICAL LAME', specials={'compat',0x5C22} }, + [0x2F2B] = { unicodeslot=0x2F2B, category='so', description='KANGXI RADICAL CORPSE', specials={'compat',0x5C38} }, + [0x2F2C] = { unicodeslot=0x2F2C, category='so', description='KANGXI RADICAL SPROUT', specials={'compat',0x5C6E} }, + [0x2F2D] = { unicodeslot=0x2F2D, category='so', description='KANGXI RADICAL MOUNTAIN', specials={'compat',0x5C71} }, + [0x2F2E] = { unicodeslot=0x2F2E, category='so', description='KANGXI RADICAL RIVER', specials={'compat',0x5DDB} }, + [0x2F2F] = { unicodeslot=0x2F2F, category='so', description='KANGXI RADICAL WORK', specials={'compat',0x5DE5} }, + [0x2F30] = { unicodeslot=0x2F30, category='so', description='KANGXI RADICAL ONESELF', specials={'compat',0x5DF1} }, + [0x2F31] = { unicodeslot=0x2F31, category='so', description='KANGXI RADICAL TURBAN', specials={'compat',0x5DFE} }, + [0x2F32] = { unicodeslot=0x2F32, category='so', description='KANGXI RADICAL DRY', specials={'compat',0x5E72} }, + [0x2F33] = { unicodeslot=0x2F33, category='so', description='KANGXI RADICAL SHORT THREAD', specials={'compat',0x5E7A} }, + [0x2F34] = { unicodeslot=0x2F34, category='so', description='KANGXI RADICAL DOTTED CLIFF', specials={'compat',0x5E7F} }, + [0x2F35] = { unicodeslot=0x2F35, category='so', description='KANGXI RADICAL LONG STRIDE', specials={'compat',0x5EF4} }, + [0x2F36] = { unicodeslot=0x2F36, category='so', description='KANGXI RADICAL TWO HANDS', specials={'compat',0x5EFE} }, + [0x2F37] = { unicodeslot=0x2F37, category='so', description='KANGXI RADICAL SHOOT', specials={'compat',0x5F0B} }, + [0x2F38] = { unicodeslot=0x2F38, category='so', description='KANGXI RADICAL BOW', specials={'compat',0x5F13} }, + [0x2F39] = { unicodeslot=0x2F39, category='so', description='KANGXI RADICAL SNOUT', specials={'compat',0x5F50} }, + [0x2F3A] = { unicodeslot=0x2F3A, category='so', description='KANGXI RADICAL BRISTLE', specials={'compat',0x5F61} }, + [0x2F3B] = { unicodeslot=0x2F3B, category='so', description='KANGXI RADICAL STEP', specials={'compat',0x5F73} }, + [0x2F3C] = { unicodeslot=0x2F3C, category='so', description='KANGXI RADICAL HEART', specials={'compat',0x5FC3} }, + [0x2F3D] = { unicodeslot=0x2F3D, category='so', description='KANGXI RADICAL HALBERD', specials={'compat',0x6208} }, + [0x2F3E] = { unicodeslot=0x2F3E, category='so', description='KANGXI RADICAL DOOR', specials={'compat',0x6236} }, + [0x2F3F] = { unicodeslot=0x2F3F, category='so', description='KANGXI RADICAL HAND', specials={'compat',0x624B} }, + [0x2F40] = { unicodeslot=0x2F40, category='so', description='KANGXI RADICAL BRANCH', specials={'compat',0x652F} }, + [0x2F41] = { unicodeslot=0x2F41, category='so', description='KANGXI RADICAL RAP', specials={'compat',0x6534} }, + [0x2F42] = { unicodeslot=0x2F42, category='so', description='KANGXI RADICAL SCRIPT', specials={'compat',0x6587} }, + [0x2F43] = { unicodeslot=0x2F43, category='so', description='KANGXI RADICAL DIPPER', specials={'compat',0x6597} }, + [0x2F44] = { unicodeslot=0x2F44, category='so', description='KANGXI RADICAL AXE', specials={'compat',0x65A4} }, + [0x2F45] = { unicodeslot=0x2F45, category='so', description='KANGXI RADICAL SQUARE', specials={'compat',0x65B9} }, + [0x2F46] = { unicodeslot=0x2F46, category='so', description='KANGXI RADICAL NOT', specials={'compat',0x65E0} }, + [0x2F47] = { unicodeslot=0x2F47, category='so', description='KANGXI RADICAL SUN', specials={'compat',0x65E5} }, + [0x2F48] = { unicodeslot=0x2F48, category='so', description='KANGXI RADICAL SAY', specials={'compat',0x66F0} }, + [0x2F49] = { unicodeslot=0x2F49, category='so', description='KANGXI RADICAL MOON', specials={'compat',0x6708} }, + [0x2F4A] = { unicodeslot=0x2F4A, category='so', description='KANGXI RADICAL TREE', specials={'compat',0x6728} }, + [0x2F4B] = { unicodeslot=0x2F4B, category='so', description='KANGXI RADICAL LACK', specials={'compat',0x6B20} }, + [0x2F4C] = { unicodeslot=0x2F4C, category='so', description='KANGXI RADICAL STOP', specials={'compat',0x6B62} }, + [0x2F4D] = { unicodeslot=0x2F4D, category='so', description='KANGXI RADICAL DEATH', specials={'compat',0x6B79} }, + [0x2F4E] = { unicodeslot=0x2F4E, category='so', description='KANGXI RADICAL WEAPON', specials={'compat',0x6BB3} }, + [0x2F4F] = { unicodeslot=0x2F4F, category='so', description='KANGXI RADICAL DO NOT', specials={'compat',0x6BCB} }, + [0x2F50] = { unicodeslot=0x2F50, category='so', description='KANGXI RADICAL COMPARE', specials={'compat',0x6BD4} }, + [0x2F51] = { unicodeslot=0x2F51, category='so', description='KANGXI RADICAL FUR', specials={'compat',0x6BDB} }, + [0x2F52] = { unicodeslot=0x2F52, category='so', description='KANGXI RADICAL CLAN', specials={'compat',0x6C0F} }, + [0x2F53] = { unicodeslot=0x2F53, category='so', description='KANGXI RADICAL STEAM', specials={'compat',0x6C14} }, + [0x2F54] = { unicodeslot=0x2F54, category='so', description='KANGXI RADICAL WATER', specials={'compat',0x6C34} }, + [0x2F55] = { unicodeslot=0x2F55, category='so', description='KANGXI RADICAL FIRE', specials={'compat',0x706B} }, + [0x2F56] = { unicodeslot=0x2F56, category='so', description='KANGXI RADICAL CLAW', specials={'compat',0x722A} }, + [0x2F57] = { unicodeslot=0x2F57, category='so', description='KANGXI RADICAL FATHER', specials={'compat',0x7236} }, + [0x2F58] = { unicodeslot=0x2F58, category='so', description='KANGXI RADICAL DOUBLE X', specials={'compat',0x723B} }, + [0x2F59] = { unicodeslot=0x2F59, category='so', description='KANGXI RADICAL HALF TREE TRUNK', specials={'compat',0x723F} }, + [0x2F5A] = { unicodeslot=0x2F5A, category='so', description='KANGXI RADICAL SLICE', specials={'compat',0x7247} }, + [0x2F5B] = { unicodeslot=0x2F5B, category='so', description='KANGXI RADICAL FANG', specials={'compat',0x7259} }, + [0x2F5C] = { unicodeslot=0x2F5C, category='so', description='KANGXI RADICAL COW', specials={'compat',0x725B} }, + [0x2F5D] = { unicodeslot=0x2F5D, category='so', description='KANGXI RADICAL DOG', specials={'compat',0x72AC} }, + [0x2F5E] = { unicodeslot=0x2F5E, category='so', description='KANGXI RADICAL PROFOUND', specials={'compat',0x7384} }, + [0x2F5F] = { unicodeslot=0x2F5F, category='so', description='KANGXI RADICAL JADE', specials={'compat',0x7389} }, + [0x2F60] = { unicodeslot=0x2F60, category='so', description='KANGXI RADICAL MELON', specials={'compat',0x74DC} }, + [0x2F61] = { unicodeslot=0x2F61, category='so', description='KANGXI RADICAL TILE', specials={'compat',0x74E6} }, + [0x2F62] = { unicodeslot=0x2F62, category='so', description='KANGXI RADICAL SWEET', specials={'compat',0x7518} }, + [0x2F63] = { unicodeslot=0x2F63, category='so', description='KANGXI RADICAL LIFE', specials={'compat',0x751F} }, + [0x2F64] = { unicodeslot=0x2F64, category='so', description='KANGXI RADICAL USE', specials={'compat',0x7528} }, + [0x2F65] = { unicodeslot=0x2F65, category='so', description='KANGXI RADICAL FIELD', specials={'compat',0x7530} }, + [0x2F66] = { unicodeslot=0x2F66, category='so', description='KANGXI RADICAL BOLT OF CLOTH', specials={'compat',0x758B} }, + [0x2F67] = { unicodeslot=0x2F67, category='so', description='KANGXI RADICAL SICKNESS', specials={'compat',0x7592} }, + [0x2F68] = { unicodeslot=0x2F68, category='so', description='KANGXI RADICAL DOTTED TENT', specials={'compat',0x7676} }, + [0x2F69] = { unicodeslot=0x2F69, category='so', description='KANGXI RADICAL WHITE', specials={'compat',0x767D} }, + [0x2F6A] = { unicodeslot=0x2F6A, category='so', description='KANGXI RADICAL SKIN', specials={'compat',0x76AE} }, + [0x2F6B] = { unicodeslot=0x2F6B, category='so', description='KANGXI RADICAL DISH', specials={'compat',0x76BF} }, + [0x2F6C] = { unicodeslot=0x2F6C, category='so', description='KANGXI RADICAL EYE', specials={'compat',0x76EE} }, + [0x2F6D] = { unicodeslot=0x2F6D, category='so', description='KANGXI RADICAL SPEAR', specials={'compat',0x77DB} }, + [0x2F6E] = { unicodeslot=0x2F6E, category='so', description='KANGXI RADICAL ARROW', specials={'compat',0x77E2} }, + [0x2F6F] = { unicodeslot=0x2F6F, category='so', description='KANGXI RADICAL STONE', specials={'compat',0x77F3} }, + [0x2F70] = { unicodeslot=0x2F70, category='so', description='KANGXI RADICAL SPIRIT', specials={'compat',0x793A} }, + [0x2F71] = { unicodeslot=0x2F71, category='so', description='KANGXI RADICAL TRACK', specials={'compat',0x79B8} }, + [0x2F72] = { unicodeslot=0x2F72, category='so', description='KANGXI RADICAL GRAIN', specials={'compat',0x79BE} }, + [0x2F73] = { unicodeslot=0x2F73, category='so', description='KANGXI RADICAL CAVE', specials={'compat',0x7A74} }, + [0x2F74] = { unicodeslot=0x2F74, category='so', description='KANGXI RADICAL STAND', specials={'compat',0x7ACB} }, + [0x2F75] = { unicodeslot=0x2F75, category='so', description='KANGXI RADICAL BAMBOO', specials={'compat',0x7AF9} }, + [0x2F76] = { unicodeslot=0x2F76, category='so', description='KANGXI RADICAL RICE', specials={'compat',0x7C73} }, + [0x2F77] = { unicodeslot=0x2F77, category='so', description='KANGXI RADICAL SILK', specials={'compat',0x7CF8} }, + [0x2F78] = { unicodeslot=0x2F78, category='so', description='KANGXI RADICAL JAR', specials={'compat',0x7F36} }, + [0x2F79] = { unicodeslot=0x2F79, category='so', description='KANGXI RADICAL NET', specials={'compat',0x7F51} }, + [0x2F7A] = { unicodeslot=0x2F7A, category='so', description='KANGXI RADICAL SHEEP', specials={'compat',0x7F8A} }, + [0x2F7B] = { unicodeslot=0x2F7B, category='so', description='KANGXI RADICAL FEATHER', specials={'compat',0x7FBD} }, + [0x2F7C] = { unicodeslot=0x2F7C, category='so', description='KANGXI RADICAL OLD', specials={'compat',0x8001} }, + [0x2F7D] = { unicodeslot=0x2F7D, category='so', description='KANGXI RADICAL AND', specials={'compat',0x800C} }, + [0x2F7E] = { unicodeslot=0x2F7E, category='so', description='KANGXI RADICAL PLOW', specials={'compat',0x8012} }, + [0x2F7F] = { unicodeslot=0x2F7F, category='so', description='KANGXI RADICAL EAR', specials={'compat',0x8033} }, + [0x2F80] = { unicodeslot=0x2F80, category='so', description='KANGXI RADICAL BRUSH', specials={'compat',0x807F} }, + [0x2F81] = { unicodeslot=0x2F81, category='so', description='KANGXI RADICAL MEAT', specials={'compat',0x8089} }, + [0x2F82] = { unicodeslot=0x2F82, category='so', description='KANGXI RADICAL MINISTER', specials={'compat',0x81E3} }, + [0x2F83] = { unicodeslot=0x2F83, category='so', description='KANGXI RADICAL SELF', specials={'compat',0x81EA} }, + [0x2F84] = { unicodeslot=0x2F84, category='so', description='KANGXI RADICAL ARRIVE', specials={'compat',0x81F3} }, + [0x2F85] = { unicodeslot=0x2F85, category='so', description='KANGXI RADICAL MORTAR', specials={'compat',0x81FC} }, + [0x2F86] = { unicodeslot=0x2F86, category='so', description='KANGXI RADICAL TONGUE', specials={'compat',0x820C} }, + [0x2F87] = { unicodeslot=0x2F87, category='so', description='KANGXI RADICAL OPPOSE', specials={'compat',0x821B} }, + [0x2F88] = { unicodeslot=0x2F88, category='so', description='KANGXI RADICAL BOAT', specials={'compat',0x821F} }, + [0x2F89] = { unicodeslot=0x2F89, category='so', description='KANGXI RADICAL STOPPING', specials={'compat',0x826E} }, + [0x2F8A] = { unicodeslot=0x2F8A, category='so', description='KANGXI RADICAL COLOR', specials={'compat',0x8272} }, + [0x2F8B] = { unicodeslot=0x2F8B, category='so', description='KANGXI RADICAL GRASS', specials={'compat',0x8278} }, + [0x2F8C] = { unicodeslot=0x2F8C, category='so', description='KANGXI RADICAL TIGER', specials={'compat',0x864D} }, + [0x2F8D] = { unicodeslot=0x2F8D, category='so', description='KANGXI RADICAL INSECT', specials={'compat',0x866B} }, + [0x2F8E] = { unicodeslot=0x2F8E, category='so', description='KANGXI RADICAL BLOOD', specials={'compat',0x8840} }, + [0x2F8F] = { unicodeslot=0x2F8F, category='so', description='KANGXI RADICAL WALK ENCLOSURE', specials={'compat',0x884C} }, + [0x2F90] = { unicodeslot=0x2F90, category='so', description='KANGXI RADICAL CLOTHES', specials={'compat',0x8863} }, + [0x2F91] = { unicodeslot=0x2F91, category='so', description='KANGXI RADICAL WEST', specials={'compat',0x897E} }, + [0x2F92] = { unicodeslot=0x2F92, category='so', description='KANGXI RADICAL SEE', specials={'compat',0x898B} }, + [0x2F93] = { unicodeslot=0x2F93, category='so', description='KANGXI RADICAL HORN', specials={'compat',0x89D2} }, + [0x2F94] = { unicodeslot=0x2F94, category='so', description='KANGXI RADICAL SPEECH', specials={'compat',0x8A00} }, + [0x2F95] = { unicodeslot=0x2F95, category='so', description='KANGXI RADICAL VALLEY', specials={'compat',0x8C37} }, + [0x2F96] = { unicodeslot=0x2F96, category='so', description='KANGXI RADICAL BEAN', specials={'compat',0x8C46} }, + [0x2F97] = { unicodeslot=0x2F97, category='so', description='KANGXI RADICAL PIG', specials={'compat',0x8C55} }, + [0x2F98] = { unicodeslot=0x2F98, category='so', description='KANGXI RADICAL BADGER', specials={'compat',0x8C78} }, + [0x2F99] = { unicodeslot=0x2F99, category='so', description='KANGXI RADICAL SHELL', specials={'compat',0x8C9D} }, + [0x2F9A] = { unicodeslot=0x2F9A, category='so', description='KANGXI RADICAL RED', specials={'compat',0x8D64} }, + [0x2F9B] = { unicodeslot=0x2F9B, category='so', description='KANGXI RADICAL RUN', specials={'compat',0x8D70} }, + [0x2F9C] = { unicodeslot=0x2F9C, category='so', description='KANGXI RADICAL FOOT', specials={'compat',0x8DB3} }, + [0x2F9D] = { unicodeslot=0x2F9D, category='so', description='KANGXI RADICAL BODY', specials={'compat',0x8EAB} }, + [0x2F9E] = { unicodeslot=0x2F9E, category='so', description='KANGXI RADICAL CART', specials={'compat',0x8ECA} }, + [0x2F9F] = { unicodeslot=0x2F9F, category='so', description='KANGXI RADICAL BITTER', specials={'compat',0x8F9B} }, + [0x2FA0] = { unicodeslot=0x2FA0, category='so', description='KANGXI RADICAL MORNING', specials={'compat',0x8FB0} }, + [0x2FA1] = { unicodeslot=0x2FA1, category='so', description='KANGXI RADICAL WALK', specials={'compat',0x8FB5} }, + [0x2FA2] = { unicodeslot=0x2FA2, category='so', description='KANGXI RADICAL CITY', specials={'compat',0x9091} }, + [0x2FA3] = { unicodeslot=0x2FA3, category='so', description='KANGXI RADICAL WINE', specials={'compat',0x9149} }, + [0x2FA4] = { unicodeslot=0x2FA4, category='so', description='KANGXI RADICAL DISTINGUISH', specials={'compat',0x91C6} }, + [0x2FA5] = { unicodeslot=0x2FA5, category='so', description='KANGXI RADICAL VILLAGE', specials={'compat',0x91CC} }, + [0x2FA6] = { unicodeslot=0x2FA6, category='so', description='KANGXI RADICAL GOLD', specials={'compat',0x91D1} }, + [0x2FA7] = { unicodeslot=0x2FA7, category='so', description='KANGXI RADICAL LONG', specials={'compat',0x9577} }, + [0x2FA8] = { unicodeslot=0x2FA8, category='so', description='KANGXI RADICAL GATE', specials={'compat',0x9580} }, + [0x2FA9] = { unicodeslot=0x2FA9, category='so', description='KANGXI RADICAL MOUND', specials={'compat',0x961C} }, + [0x2FAA] = { unicodeslot=0x2FAA, category='so', description='KANGXI RADICAL SLAVE', specials={'compat',0x96B6} }, + [0x2FAB] = { unicodeslot=0x2FAB, category='so', description='KANGXI RADICAL SHORT TAILED BIRD', specials={'compat',0x96B9} }, + [0x2FAC] = { unicodeslot=0x2FAC, category='so', description='KANGXI RADICAL RAIN', specials={'compat',0x96E8} }, + [0x2FAD] = { unicodeslot=0x2FAD, category='so', description='KANGXI RADICAL BLUE', specials={'compat',0x9751} }, + [0x2FAE] = { unicodeslot=0x2FAE, category='so', description='KANGXI RADICAL WRONG', specials={'compat',0x975E} }, + [0x2FAF] = { unicodeslot=0x2FAF, category='so', description='KANGXI RADICAL FACE', specials={'compat',0x9762} }, + [0x2FB0] = { unicodeslot=0x2FB0, category='so', description='KANGXI RADICAL LEATHER', specials={'compat',0x9769} }, + [0x2FB1] = { unicodeslot=0x2FB1, category='so', description='KANGXI RADICAL TANNED LEATHER', specials={'compat',0x97CB} }, + [0x2FB2] = { unicodeslot=0x2FB2, category='so', description='KANGXI RADICAL LEEK', specials={'compat',0x97ED} }, + [0x2FB3] = { unicodeslot=0x2FB3, category='so', description='KANGXI RADICAL SOUND', specials={'compat',0x97F3} }, + [0x2FB4] = { unicodeslot=0x2FB4, category='so', description='KANGXI RADICAL LEAF', specials={'compat',0x9801} }, + [0x2FB5] = { unicodeslot=0x2FB5, category='so', description='KANGXI RADICAL WIND', specials={'compat',0x98A8} }, + [0x2FB6] = { unicodeslot=0x2FB6, category='so', description='KANGXI RADICAL FLY', specials={'compat',0x98DB} }, + [0x2FB7] = { unicodeslot=0x2FB7, category='so', description='KANGXI RADICAL EAT', specials={'compat',0x98DF} }, + [0x2FB8] = { unicodeslot=0x2FB8, category='so', description='KANGXI RADICAL HEAD', specials={'compat',0x9996} }, + [0x2FB9] = { unicodeslot=0x2FB9, category='so', description='KANGXI RADICAL FRAGRANT', specials={'compat',0x9999} }, + [0x2FBA] = { unicodeslot=0x2FBA, category='so', description='KANGXI RADICAL HORSE', specials={'compat',0x99AC} }, + [0x2FBB] = { unicodeslot=0x2FBB, category='so', description='KANGXI RADICAL BONE', specials={'compat',0x9AA8} }, + [0x2FBC] = { unicodeslot=0x2FBC, category='so', description='KANGXI RADICAL TALL', specials={'compat',0x9AD8} }, + [0x2FBD] = { unicodeslot=0x2FBD, category='so', description='KANGXI RADICAL HAIR', specials={'compat',0x9ADF} }, + [0x2FBE] = { unicodeslot=0x2FBE, category='so', description='KANGXI RADICAL FIGHT', specials={'compat',0x9B25} }, + [0x2FBF] = { unicodeslot=0x2FBF, category='so', description='KANGXI RADICAL SACRIFICIAL WINE', specials={'compat',0x9B2F} }, + [0x2FC0] = { unicodeslot=0x2FC0, category='so', description='KANGXI RADICAL CAULDRON', specials={'compat',0x9B32} }, + [0x2FC1] = { unicodeslot=0x2FC1, category='so', description='KANGXI RADICAL GHOST', specials={'compat',0x9B3C} }, + [0x2FC2] = { unicodeslot=0x2FC2, category='so', description='KANGXI RADICAL FISH', specials={'compat',0x9B5A} }, + [0x2FC3] = { unicodeslot=0x2FC3, category='so', description='KANGXI RADICAL BIRD', specials={'compat',0x9CE5} }, + [0x2FC4] = { unicodeslot=0x2FC4, category='so', description='KANGXI RADICAL SALT', specials={'compat',0x9E75} }, + [0x2FC5] = { unicodeslot=0x2FC5, category='so', description='KANGXI RADICAL DEER', specials={'compat',0x9E7F} }, + [0x2FC6] = { unicodeslot=0x2FC6, category='so', description='KANGXI RADICAL WHEAT', specials={'compat',0x9EA5} }, + [0x2FC7] = { unicodeslot=0x2FC7, category='so', description='KANGXI RADICAL HEMP', specials={'compat',0x9EBB} }, + [0x2FC8] = { unicodeslot=0x2FC8, category='so', description='KANGXI RADICAL YELLOW', specials={'compat',0x9EC3} }, + [0x2FC9] = { unicodeslot=0x2FC9, category='so', description='KANGXI RADICAL MILLET', specials={'compat',0x9ECD} }, + [0x2FCA] = { unicodeslot=0x2FCA, category='so', description='KANGXI RADICAL BLACK', specials={'compat',0x9ED1} }, + [0x2FCB] = { unicodeslot=0x2FCB, category='so', description='KANGXI RADICAL EMBROIDERY', specials={'compat',0x9EF9} }, + [0x2FCC] = { unicodeslot=0x2FCC, category='so', description='KANGXI RADICAL FROG', specials={'compat',0x9EFD} }, + [0x2FCD] = { unicodeslot=0x2FCD, category='so', description='KANGXI RADICAL TRIPOD', specials={'compat',0x9F0E} }, + [0x2FCE] = { unicodeslot=0x2FCE, category='so', description='KANGXI RADICAL DRUM', specials={'compat',0x9F13} }, + [0x2FCF] = { unicodeslot=0x2FCF, category='so', description='KANGXI RADICAL RAT', specials={'compat',0x9F20} }, + [0x2FD0] = { unicodeslot=0x2FD0, category='so', description='KANGXI RADICAL NOSE', specials={'compat',0x9F3B} }, + [0x2FD1] = { unicodeslot=0x2FD1, category='so', description='KANGXI RADICAL EVEN', specials={'compat',0x9F4A} }, + [0x2FD2] = { unicodeslot=0x2FD2, category='so', description='KANGXI RADICAL TOOTH', specials={'compat',0x9F52} }, + [0x2FD3] = { unicodeslot=0x2FD3, category='so', description='KANGXI RADICAL DRAGON', specials={'compat',0x9F8D} }, + [0x2FD4] = { unicodeslot=0x2FD4, category='so', description='KANGXI RADICAL TURTLE', specials={'compat',0x9F9C} }, + [0x2FD5] = { unicodeslot=0x2FD5, category='so', description='KANGXI RADICAL FLUTE', specials={'compat',0x9FA0} }, + [0x2FF0] = { unicodeslot=0x2FF0, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO RIGHT' }, + [0x2FF1] = { unicodeslot=0x2FF1, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO BELOW' }, + [0x2FF2] = { unicodeslot=0x2FF2, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER LEFT TO MIDDLE AND RIGHT' }, + [0x2FF3] = { unicodeslot=0x2FF3, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER ABOVE TO MIDDLE AND BELOW' }, + [0x2FF4] = { unicodeslot=0x2FF4, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER FULL SURROUND' }, + [0x2FF5] = { unicodeslot=0x2FF5, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM ABOVE' }, + [0x2FF6] = { unicodeslot=0x2FF6, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM BELOW' }, + [0x2FF7] = { unicodeslot=0x2FF7, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LEFT' }, + [0x2FF8] = { unicodeslot=0x2FF8, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER LEFT' }, + [0x2FF9] = { unicodeslot=0x2FF9, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM UPPER RIGHT' }, + [0x2FFA] = { unicodeslot=0x2FFA, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER SURROUND FROM LOWER LEFT' }, + [0x2FFB] = { unicodeslot=0x2FFB, category='so', description='IDEOGRAPHIC DESCRIPTION CHARACTER OVERLAID' }, + [0x3000] = { unicodeslot=0x3000, category='zs', description='IDEOGRAPHIC SPACE', specials={'wide',0x0020} }, + [0x3001] = { unicodeslot=0x3001, category='po', description='IDEOGRAPHIC COMMA' }, + [0x3002] = { unicodeslot=0x3002, category='po', description='IDEOGRAPHIC FULL STOP' }, + [0x3003] = { unicodeslot=0x3003, category='po', description='DITTO MARK' }, + [0x3004] = { unicodeslot=0x3004, category='so', description='JAPANESE INDUSTRIAL STANDARD SYMBOL' }, + [0x3005] = { unicodeslot=0x3005, category='lm', description='IDEOGRAPHIC ITERATION MARK' }, + [0x3006] = { unicodeslot=0x3006, category='lo', description='IDEOGRAPHIC CLOSING MARK' }, + [0x3007] = { unicodeslot=0x3007, category='nl', description='IDEOGRAPHIC NUMBER ZERO' }, + [0x3008] = { unicodeslot=0x3008, category='ps', description='LEFT ANGLE BRACKET' }, + [0x3009] = { unicodeslot=0x3009, category='pe', description='RIGHT ANGLE BRACKET' }, + [0x300A] = { unicodeslot=0x300A, category='ps', description='LEFT DOUBLE ANGLE BRACKET' }, + [0x300B] = { unicodeslot=0x300B, category='pe', description='RIGHT DOUBLE ANGLE BRACKET' }, + [0x300C] = { unicodeslot=0x300C, category='ps', description='LEFT CORNER BRACKET' }, + [0x300D] = { unicodeslot=0x300D, category='pe', description='RIGHT CORNER BRACKET' }, + [0x300E] = { unicodeslot=0x300E, category='ps', description='LEFT WHITE CORNER BRACKET' }, + [0x300F] = { unicodeslot=0x300F, category='pe', description='RIGHT WHITE CORNER BRACKET' }, + [0x3010] = { unicodeslot=0x3010, category='ps', description='LEFT BLACK LENTICULAR BRACKET' }, + [0x3011] = { unicodeslot=0x3011, category='pe', description='RIGHT BLACK LENTICULAR BRACKET' }, + [0x3012] = { unicodeslot=0x3012, category='so', description='POSTAL MARK' }, + [0x3013] = { unicodeslot=0x3013, category='so', description='GETA MARK' }, + [0x3014] = { unicodeslot=0x3014, category='ps', description='LEFT TORTOISE SHELL BRACKET' }, + [0x3015] = { unicodeslot=0x3015, category='pe', description='RIGHT TORTOISE SHELL BRACKET' }, + [0x3016] = { unicodeslot=0x3016, category='ps', description='LEFT WHITE LENTICULAR BRACKET' }, + [0x3017] = { unicodeslot=0x3017, category='pe', description='RIGHT WHITE LENTICULAR BRACKET' }, + [0x3018] = { unicodeslot=0x3018, category='ps', description='LEFT WHITE TORTOISE SHELL BRACKET' }, + [0x3019] = { unicodeslot=0x3019, category='pe', description='RIGHT WHITE TORTOISE SHELL BRACKET' }, + [0x301A] = { unicodeslot=0x301A, category='ps', description='LEFT WHITE SQUARE BRACKET' }, + [0x301B] = { unicodeslot=0x301B, category='pe', description='RIGHT WHITE SQUARE BRACKET' }, + [0x301C] = { unicodeslot=0x301C, category='pd', description='WAVE DASH' }, + [0x301D] = { unicodeslot=0x301D, category='ps', description='REVERSED DOUBLE PRIME QUOTATION MARK' }, + [0x301E] = { unicodeslot=0x301E, category='pe', description='DOUBLE PRIME QUOTATION MARK' }, + [0x301F] = { unicodeslot=0x301F, category='pe', description='LOW DOUBLE PRIME QUOTATION MARK' }, + [0x3020] = { unicodeslot=0x3020, category='so', description='POSTAL MARK FACE' }, + [0x3021] = { unicodeslot=0x3021, category='nl', description='HANGZHOU NUMERAL ONE' }, + [0x3022] = { unicodeslot=0x3022, category='nl', description='HANGZHOU NUMERAL TWO' }, + [0x3023] = { unicodeslot=0x3023, category='nl', description='HANGZHOU NUMERAL THREE' }, + [0x3024] = { unicodeslot=0x3024, category='nl', description='HANGZHOU NUMERAL FOUR' }, + [0x3025] = { unicodeslot=0x3025, category='nl', description='HANGZHOU NUMERAL FIVE' }, + [0x3026] = { unicodeslot=0x3026, category='nl', description='HANGZHOU NUMERAL SIX' }, + [0x3027] = { unicodeslot=0x3027, category='nl', description='HANGZHOU NUMERAL SEVEN' }, + [0x3028] = { unicodeslot=0x3028, category='nl', description='HANGZHOU NUMERAL EIGHT' }, + [0x3029] = { unicodeslot=0x3029, category='nl', description='HANGZHOU NUMERAL NINE' }, + [0x302A] = { unicodeslot=0x302A, category='mn', description='IDEOGRAPHIC LEVEL TONE MARK' }, + [0x302B] = { unicodeslot=0x302B, category='mn', description='IDEOGRAPHIC RISING TONE MARK' }, + [0x302C] = { unicodeslot=0x302C, category='mn', description='IDEOGRAPHIC DEPARTING TONE MARK' }, + [0x302D] = { unicodeslot=0x302D, category='mn', description='IDEOGRAPHIC ENTERING TONE MARK' }, + [0x302E] = { unicodeslot=0x302E, category='mn', description='HANGUL SINGLE DOT TONE MARK' }, + [0x302F] = { unicodeslot=0x302F, category='mn', description='HANGUL DOUBLE DOT TONE MARK' }, + [0x3030] = { unicodeslot=0x3030, category='pd', description='WAVY DASH' }, + [0x3031] = { unicodeslot=0x3031, category='lm', description='VERTICAL KANA REPEAT MARK' }, + [0x3032] = { unicodeslot=0x3032, category='lm', description='VERTICAL KANA REPEAT WITH VOICED SOUND MARK' }, + [0x3033] = { unicodeslot=0x3033, category='lm', description='VERTICAL KANA REPEAT MARK UPPER HALF' }, + [0x3034] = { unicodeslot=0x3034, category='lm', description='VERTICAL KANA REPEAT WITH VOICED SOUND MARK UPPER HALF' }, + [0x3035] = { unicodeslot=0x3035, category='lm', description='VERTICAL KANA REPEAT MARK LOWER HALF' }, + [0x3036] = { unicodeslot=0x3036, category='so', description='CIRCLED POSTAL MARK', specials={'compat',0x3012} }, + [0x3037] = { unicodeslot=0x3037, category='so', description='IDEOGRAPHIC TELEGRAPH LINE FEED SEPARATOR SYMBOL' }, + [0x3038] = { unicodeslot=0x3038, category='nl', description='HANGZHOU NUMERAL TEN', specials={'compat',0x5341} }, + [0x3039] = { unicodeslot=0x3039, category='nl', description='HANGZHOU NUMERAL TWENTY', specials={'compat',0x5344} }, + [0x303A] = { unicodeslot=0x303A, category='nl', description='HANGZHOU NUMERAL THIRTY', specials={'compat',0x5345} }, + [0x303B] = { unicodeslot=0x303B, category='lm', description='VERTICAL IDEOGRAPHIC ITERATION MARK' }, + [0x303C] = { unicodeslot=0x303C, category='lo', description='MASU MARK' }, + [0x303D] = { unicodeslot=0x303D, category='po', description='PART ALTERNATION MARK' }, + [0x303E] = { unicodeslot=0x303E, category='so', description='IDEOGRAPHIC VARIATION INDICATOR' }, + [0x303F] = { unicodeslot=0x303F, category='so', description='IDEOGRAPHIC HALF FILL SPACE' }, + [0x3041] = { unicodeslot=0x3041, category='lo', description='HIRAGANA LETTER SMALL A' }, + [0x3042] = { unicodeslot=0x3042, category='lo', description='HIRAGANA LETTER A' }, + [0x3043] = { unicodeslot=0x3043, category='lo', description='HIRAGANA LETTER SMALL I' }, + [0x3044] = { unicodeslot=0x3044, category='lo', description='HIRAGANA LETTER I' }, + [0x3045] = { unicodeslot=0x3045, category='lo', description='HIRAGANA LETTER SMALL U' }, + [0x3046] = { unicodeslot=0x3046, category='lo', description='HIRAGANA LETTER U' }, + [0x3047] = { unicodeslot=0x3047, category='lo', description='HIRAGANA LETTER SMALL E' }, + [0x3048] = { unicodeslot=0x3048, category='lo', description='HIRAGANA LETTER E' }, + [0x3049] = { unicodeslot=0x3049, category='lo', description='HIRAGANA LETTER SMALL O' }, + [0x304A] = { unicodeslot=0x304A, category='lo', description='HIRAGANA LETTER O' }, + [0x304B] = { unicodeslot=0x304B, category='lo', description='HIRAGANA LETTER KA' }, + [0x304C] = { unicodeslot=0x304C, category='lo', description='HIRAGANA LETTER GA', specials={'char',0x304B,0x3099} }, + [0x304D] = { unicodeslot=0x304D, category='lo', description='HIRAGANA LETTER KI' }, + [0x304E] = { unicodeslot=0x304E, category='lo', description='HIRAGANA LETTER GI', specials={'char',0x304D,0x3099} }, + [0x304F] = { unicodeslot=0x304F, category='lo', description='HIRAGANA LETTER KU' }, + [0x3050] = { unicodeslot=0x3050, category='lo', description='HIRAGANA LETTER GU', specials={'char',0x304F,0x3099} }, + [0x3051] = { unicodeslot=0x3051, category='lo', description='HIRAGANA LETTER KE' }, + [0x3052] = { unicodeslot=0x3052, category='lo', description='HIRAGANA LETTER GE', specials={'char',0x3051,0x3099} }, + [0x3053] = { unicodeslot=0x3053, category='lo', description='HIRAGANA LETTER KO' }, + [0x3054] = { unicodeslot=0x3054, category='lo', description='HIRAGANA LETTER GO', specials={'char',0x3053,0x3099} }, + [0x3055] = { unicodeslot=0x3055, category='lo', description='HIRAGANA LETTER SA' }, + [0x3056] = { unicodeslot=0x3056, category='lo', description='HIRAGANA LETTER ZA', specials={'char',0x3055,0x3099} }, + [0x3057] = { unicodeslot=0x3057, category='lo', description='HIRAGANA LETTER SI' }, + [0x3058] = { unicodeslot=0x3058, category='lo', description='HIRAGANA LETTER ZI', specials={'char',0x3057,0x3099} }, + [0x3059] = { unicodeslot=0x3059, category='lo', description='HIRAGANA LETTER SU' }, + [0x305A] = { unicodeslot=0x305A, category='lo', description='HIRAGANA LETTER ZU', specials={'char',0x3059,0x3099} }, + [0x305B] = { unicodeslot=0x305B, category='lo', description='HIRAGANA LETTER SE' }, + [0x305C] = { unicodeslot=0x305C, category='lo', description='HIRAGANA LETTER ZE', specials={'char',0x305B,0x3099} }, + [0x305D] = { unicodeslot=0x305D, category='lo', description='HIRAGANA LETTER SO' }, + [0x305E] = { unicodeslot=0x305E, category='lo', description='HIRAGANA LETTER ZO', specials={'char',0x305D,0x3099} }, + [0x305F] = { unicodeslot=0x305F, category='lo', description='HIRAGANA LETTER TA' }, + [0x3060] = { unicodeslot=0x3060, category='lo', description='HIRAGANA LETTER DA', specials={'char',0x305F,0x3099} }, + [0x3061] = { unicodeslot=0x3061, category='lo', description='HIRAGANA LETTER TI' }, + [0x3062] = { unicodeslot=0x3062, category='lo', description='HIRAGANA LETTER DI', specials={'char',0x3061,0x3099} }, + [0x3063] = { unicodeslot=0x3063, category='lo', description='HIRAGANA LETTER SMALL TU' }, + [0x3064] = { unicodeslot=0x3064, category='lo', description='HIRAGANA LETTER TU' }, + [0x3065] = { unicodeslot=0x3065, category='lo', description='HIRAGANA LETTER DU', specials={'char',0x3064,0x3099} }, + [0x3066] = { unicodeslot=0x3066, category='lo', description='HIRAGANA LETTER TE' }, + [0x3067] = { unicodeslot=0x3067, category='lo', description='HIRAGANA LETTER DE', specials={'char',0x3066,0x3099} }, + [0x3068] = { unicodeslot=0x3068, category='lo', description='HIRAGANA LETTER TO' }, + [0x3069] = { unicodeslot=0x3069, category='lo', description='HIRAGANA LETTER DO', specials={'char',0x3068,0x3099} }, + [0x306A] = { unicodeslot=0x306A, category='lo', description='HIRAGANA LETTER NA' }, + [0x306B] = { unicodeslot=0x306B, category='lo', description='HIRAGANA LETTER NI' }, + [0x306C] = { unicodeslot=0x306C, category='lo', description='HIRAGANA LETTER NU' }, + [0x306D] = { unicodeslot=0x306D, category='lo', description='HIRAGANA LETTER NE' }, + [0x306E] = { unicodeslot=0x306E, category='lo', description='HIRAGANA LETTER NO' }, + [0x306F] = { unicodeslot=0x306F, category='lo', description='HIRAGANA LETTER HA' }, + [0x3070] = { unicodeslot=0x3070, category='lo', description='HIRAGANA LETTER BA', specials={'char',0x306F,0x3099} }, + [0x3071] = { unicodeslot=0x3071, category='lo', description='HIRAGANA LETTER PA', specials={'char',0x306F,0x309A} }, + [0x3072] = { unicodeslot=0x3072, category='lo', description='HIRAGANA LETTER HI' }, + [0x3073] = { unicodeslot=0x3073, category='lo', description='HIRAGANA LETTER BI', specials={'char',0x3072,0x3099} }, + [0x3074] = { unicodeslot=0x3074, category='lo', description='HIRAGANA LETTER PI', specials={'char',0x3072,0x309A} }, + [0x3075] = { unicodeslot=0x3075, category='lo', description='HIRAGANA LETTER HU' }, + [0x3076] = { unicodeslot=0x3076, category='lo', description='HIRAGANA LETTER BU', specials={'char',0x3075,0x3099} }, + [0x3077] = { unicodeslot=0x3077, category='lo', description='HIRAGANA LETTER PU', specials={'char',0x3075,0x309A} }, + [0x3078] = { unicodeslot=0x3078, category='lo', description='HIRAGANA LETTER HE' }, + [0x3079] = { unicodeslot=0x3079, category='lo', description='HIRAGANA LETTER BE', specials={'char',0x3078,0x3099} }, + [0x307A] = { unicodeslot=0x307A, category='lo', description='HIRAGANA LETTER PE', specials={'char',0x3078,0x309A} }, + [0x307B] = { unicodeslot=0x307B, category='lo', description='HIRAGANA LETTER HO' }, + [0x307C] = { unicodeslot=0x307C, category='lo', description='HIRAGANA LETTER BO', specials={'char',0x307B,0x3099} }, + [0x307D] = { unicodeslot=0x307D, category='lo', description='HIRAGANA LETTER PO', specials={'char',0x307B,0x309A} }, + [0x307E] = { unicodeslot=0x307E, category='lo', description='HIRAGANA LETTER MA' }, + [0x307F] = { unicodeslot=0x307F, category='lo', description='HIRAGANA LETTER MI' }, + [0x3080] = { unicodeslot=0x3080, category='lo', description='HIRAGANA LETTER MU' }, + [0x3081] = { unicodeslot=0x3081, category='lo', description='HIRAGANA LETTER ME' }, + [0x3082] = { unicodeslot=0x3082, category='lo', description='HIRAGANA LETTER MO' }, + [0x3083] = { unicodeslot=0x3083, category='lo', description='HIRAGANA LETTER SMALL YA' }, + [0x3084] = { unicodeslot=0x3084, category='lo', description='HIRAGANA LETTER YA' }, + [0x3085] = { unicodeslot=0x3085, category='lo', description='HIRAGANA LETTER SMALL YU' }, + [0x3086] = { unicodeslot=0x3086, category='lo', description='HIRAGANA LETTER YU' }, + [0x3087] = { unicodeslot=0x3087, category='lo', description='HIRAGANA LETTER SMALL YO' }, + [0x3088] = { unicodeslot=0x3088, category='lo', description='HIRAGANA LETTER YO' }, + [0x3089] = { unicodeslot=0x3089, category='lo', description='HIRAGANA LETTER RA' }, + [0x308A] = { unicodeslot=0x308A, category='lo', description='HIRAGANA LETTER RI' }, + [0x308B] = { unicodeslot=0x308B, category='lo', description='HIRAGANA LETTER RU' }, + [0x308C] = { unicodeslot=0x308C, category='lo', description='HIRAGANA LETTER RE' }, + [0x308D] = { unicodeslot=0x308D, category='lo', description='HIRAGANA LETTER RO' }, + [0x308E] = { unicodeslot=0x308E, category='lo', description='HIRAGANA LETTER SMALL WA' }, + [0x308F] = { unicodeslot=0x308F, category='lo', description='HIRAGANA LETTER WA' }, + [0x3090] = { unicodeslot=0x3090, category='lo', description='HIRAGANA LETTER WI' }, + [0x3091] = { unicodeslot=0x3091, category='lo', description='HIRAGANA LETTER WE' }, + [0x3092] = { unicodeslot=0x3092, category='lo', description='HIRAGANA LETTER WO' }, + [0x3093] = { unicodeslot=0x3093, category='lo', description='HIRAGANA LETTER N' }, + [0x3094] = { unicodeslot=0x3094, category='lo', description='HIRAGANA LETTER VU', specials={'char',0x3046,0x3099} }, + [0x3095] = { unicodeslot=0x3095, category='lo', description='HIRAGANA LETTER SMALL KA' }, + [0x3096] = { unicodeslot=0x3096, category='lo', description='HIRAGANA LETTER SMALL KE' }, + [0x3099] = { unicodeslot=0x3099, category='mn', description='COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK' }, + [0x309A] = { unicodeslot=0x309A, category='mn', description='COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK' }, + [0x309B] = { unicodeslot=0x309B, category='sk', description='KATAKANA-HIRAGANA VOICED SOUND MARK', specials={'compat',0x0020,0x3099} }, + [0x309C] = { unicodeslot=0x309C, category='sk', description='KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK', specials={'compat',0x0020,0x309A} }, + [0x309D] = { unicodeslot=0x309D, category='lm', description='HIRAGANA ITERATION MARK' }, + [0x309E] = { unicodeslot=0x309E, category='lm', description='HIRAGANA VOICED ITERATION MARK', specials={'char',0x309D,0x3099} }, + [0x309F] = { unicodeslot=0x309F, category='lo', description='HIRAGANA DIGRAPH YORI', specials={'vertical',0x3088,0x308A} }, + [0x30A0] = { unicodeslot=0x30A0, category='pd', description='KATAKANA-HIRAGANA DOUBLE HYPHEN' }, + [0x30A1] = { unicodeslot=0x30A1, category='lo', description='KATAKANA LETTER SMALL A' }, + [0x30A2] = { unicodeslot=0x30A2, category='lo', description='KATAKANA LETTER A' }, + [0x30A3] = { unicodeslot=0x30A3, category='lo', description='KATAKANA LETTER SMALL I' }, + [0x30A4] = { unicodeslot=0x30A4, category='lo', description='KATAKANA LETTER I' }, + [0x30A5] = { unicodeslot=0x30A5, category='lo', description='KATAKANA LETTER SMALL U' }, + [0x30A6] = { unicodeslot=0x30A6, category='lo', description='KATAKANA LETTER U' }, + [0x30A7] = { unicodeslot=0x30A7, category='lo', description='KATAKANA LETTER SMALL E' }, + [0x30A8] = { unicodeslot=0x30A8, category='lo', description='KATAKANA LETTER E' }, + [0x30A9] = { unicodeslot=0x30A9, category='lo', description='KATAKANA LETTER SMALL O' }, + [0x30AA] = { unicodeslot=0x30AA, category='lo', description='KATAKANA LETTER O' }, + [0x30AB] = { unicodeslot=0x30AB, category='lo', description='KATAKANA LETTER KA' }, + [0x30AC] = { unicodeslot=0x30AC, category='lo', description='KATAKANA LETTER GA', specials={'char',0x30AB,0x3099} }, + [0x30AD] = { unicodeslot=0x30AD, category='lo', description='KATAKANA LETTER KI' }, + [0x30AE] = { unicodeslot=0x30AE, category='lo', description='KATAKANA LETTER GI', specials={'char',0x30AD,0x3099} }, + [0x30AF] = { unicodeslot=0x30AF, category='lo', description='KATAKANA LETTER KU' }, + [0x30B0] = { unicodeslot=0x30B0, category='lo', description='KATAKANA LETTER GU', specials={'char',0x30AF,0x3099} }, + [0x30B1] = { unicodeslot=0x30B1, category='lo', description='KATAKANA LETTER KE' }, + [0x30B2] = { unicodeslot=0x30B2, category='lo', description='KATAKANA LETTER GE', specials={'char',0x30B1,0x3099} }, + [0x30B3] = { unicodeslot=0x30B3, category='lo', description='KATAKANA LETTER KO' }, + [0x30B4] = { unicodeslot=0x30B4, category='lo', description='KATAKANA LETTER GO', specials={'char',0x30B3,0x3099} }, + [0x30B5] = { unicodeslot=0x30B5, category='lo', description='KATAKANA LETTER SA' }, + [0x30B6] = { unicodeslot=0x30B6, category='lo', description='KATAKANA LETTER ZA', specials={'char',0x30B5,0x3099} }, + [0x30B7] = { unicodeslot=0x30B7, category='lo', description='KATAKANA LETTER SI' }, + [0x30B8] = { unicodeslot=0x30B8, category='lo', description='KATAKANA LETTER ZI', specials={'char',0x30B7,0x3099} }, + [0x30B9] = { unicodeslot=0x30B9, category='lo', description='KATAKANA LETTER SU' }, + [0x30BA] = { unicodeslot=0x30BA, category='lo', description='KATAKANA LETTER ZU', specials={'char',0x30B9,0x3099} }, + [0x30BB] = { unicodeslot=0x30BB, category='lo', description='KATAKANA LETTER SE' }, + [0x30BC] = { unicodeslot=0x30BC, category='lo', description='KATAKANA LETTER ZE', specials={'char',0x30BB,0x3099} }, + [0x30BD] = { unicodeslot=0x30BD, category='lo', description='KATAKANA LETTER SO' }, + [0x30BE] = { unicodeslot=0x30BE, category='lo', description='KATAKANA LETTER ZO', specials={'char',0x30BD,0x3099} }, + [0x30BF] = { unicodeslot=0x30BF, category='lo', description='KATAKANA LETTER TA' }, + [0x30C0] = { unicodeslot=0x30C0, category='lo', description='KATAKANA LETTER DA', specials={'char',0x30BF,0x3099} }, + [0x30C1] = { unicodeslot=0x30C1, category='lo', description='KATAKANA LETTER TI' }, + [0x30C2] = { unicodeslot=0x30C2, category='lo', description='KATAKANA LETTER DI', specials={'char',0x30C1,0x3099} }, + [0x30C3] = { unicodeslot=0x30C3, category='lo', description='KATAKANA LETTER SMALL TU' }, + [0x30C4] = { unicodeslot=0x30C4, category='lo', description='KATAKANA LETTER TU' }, + [0x30C5] = { unicodeslot=0x30C5, category='lo', description='KATAKANA LETTER DU', specials={'char',0x30C4,0x3099} }, + [0x30C6] = { unicodeslot=0x30C6, category='lo', description='KATAKANA LETTER TE' }, + [0x30C7] = { unicodeslot=0x30C7, category='lo', description='KATAKANA LETTER DE', specials={'char',0x30C6,0x3099} }, + [0x30C8] = { unicodeslot=0x30C8, category='lo', description='KATAKANA LETTER TO' }, + [0x30C9] = { unicodeslot=0x30C9, category='lo', description='KATAKANA LETTER DO', specials={'char',0x30C8,0x3099} }, + [0x30CA] = { unicodeslot=0x30CA, category='lo', description='KATAKANA LETTER NA' }, + [0x30CB] = { unicodeslot=0x30CB, category='lo', description='KATAKANA LETTER NI' }, + [0x30CC] = { unicodeslot=0x30CC, category='lo', description='KATAKANA LETTER NU' }, + [0x30CD] = { unicodeslot=0x30CD, category='lo', description='KATAKANA LETTER NE' }, + [0x30CE] = { unicodeslot=0x30CE, category='lo', description='KATAKANA LETTER NO' }, + [0x30CF] = { unicodeslot=0x30CF, category='lo', description='KATAKANA LETTER HA' }, + [0x30D0] = { unicodeslot=0x30D0, category='lo', description='KATAKANA LETTER BA', specials={'char',0x30CF,0x3099} }, + [0x30D1] = { unicodeslot=0x30D1, category='lo', description='KATAKANA LETTER PA', specials={'char',0x30CF,0x309A} }, + [0x30D2] = { unicodeslot=0x30D2, category='lo', description='KATAKANA LETTER HI' }, + [0x30D3] = { unicodeslot=0x30D3, category='lo', description='KATAKANA LETTER BI', specials={'char',0x30D2,0x3099} }, + [0x30D4] = { unicodeslot=0x30D4, category='lo', description='KATAKANA LETTER PI', specials={'char',0x30D2,0x309A} }, + [0x30D5] = { unicodeslot=0x30D5, category='lo', description='KATAKANA LETTER HU' }, + [0x30D6] = { unicodeslot=0x30D6, category='lo', description='KATAKANA LETTER BU', specials={'char',0x30D5,0x3099} }, + [0x30D7] = { unicodeslot=0x30D7, category='lo', description='KATAKANA LETTER PU', specials={'char',0x30D5,0x309A} }, + [0x30D8] = { unicodeslot=0x30D8, category='lo', description='KATAKANA LETTER HE' }, + [0x30D9] = { unicodeslot=0x30D9, category='lo', description='KATAKANA LETTER BE', specials={'char',0x30D8,0x3099} }, + [0x30DA] = { unicodeslot=0x30DA, category='lo', description='KATAKANA LETTER PE', specials={'char',0x30D8,0x309A} }, + [0x30DB] = { unicodeslot=0x30DB, category='lo', description='KATAKANA LETTER HO' }, + [0x30DC] = { unicodeslot=0x30DC, category='lo', description='KATAKANA LETTER BO', specials={'char',0x30DB,0x3099} }, + [0x30DD] = { unicodeslot=0x30DD, category='lo', description='KATAKANA LETTER PO', specials={'char',0x30DB,0x309A} }, + [0x30DE] = { unicodeslot=0x30DE, category='lo', description='KATAKANA LETTER MA' }, + [0x30DF] = { unicodeslot=0x30DF, category='lo', description='KATAKANA LETTER MI' }, + [0x30E0] = { unicodeslot=0x30E0, category='lo', description='KATAKANA LETTER MU' }, + [0x30E1] = { unicodeslot=0x30E1, category='lo', description='KATAKANA LETTER ME' }, + [0x30E2] = { unicodeslot=0x30E2, category='lo', description='KATAKANA LETTER MO' }, + [0x30E3] = { unicodeslot=0x30E3, category='lo', description='KATAKANA LETTER SMALL YA' }, + [0x30E4] = { unicodeslot=0x30E4, category='lo', description='KATAKANA LETTER YA' }, + [0x30E5] = { unicodeslot=0x30E5, category='lo', description='KATAKANA LETTER SMALL YU' }, + [0x30E6] = { unicodeslot=0x30E6, category='lo', description='KATAKANA LETTER YU' }, + [0x30E7] = { unicodeslot=0x30E7, category='lo', description='KATAKANA LETTER SMALL YO' }, + [0x30E8] = { unicodeslot=0x30E8, category='lo', description='KATAKANA LETTER YO' }, + [0x30E9] = { unicodeslot=0x30E9, category='lo', description='KATAKANA LETTER RA' }, + [0x30EA] = { unicodeslot=0x30EA, category='lo', description='KATAKANA LETTER RI' }, + [0x30EB] = { unicodeslot=0x30EB, category='lo', description='KATAKANA LETTER RU' }, + [0x30EC] = { unicodeslot=0x30EC, category='lo', description='KATAKANA LETTER RE' }, + [0x30ED] = { unicodeslot=0x30ED, category='lo', description='KATAKANA LETTER RO' }, + [0x30EE] = { unicodeslot=0x30EE, category='lo', description='KATAKANA LETTER SMALL WA' }, + [0x30EF] = { unicodeslot=0x30EF, category='lo', description='KATAKANA LETTER WA' }, + [0x30F0] = { unicodeslot=0x30F0, category='lo', description='KATAKANA LETTER WI' }, + [0x30F1] = { unicodeslot=0x30F1, category='lo', description='KATAKANA LETTER WE' }, + [0x30F2] = { unicodeslot=0x30F2, category='lo', description='KATAKANA LETTER WO' }, + [0x30F3] = { unicodeslot=0x30F3, category='lo', description='KATAKANA LETTER N' }, + [0x30F4] = { unicodeslot=0x30F4, category='lo', description='KATAKANA LETTER VU', specials={'char',0x30A6,0x3099} }, + [0x30F5] = { unicodeslot=0x30F5, category='lo', description='KATAKANA LETTER SMALL KA' }, + [0x30F6] = { unicodeslot=0x30F6, category='lo', description='KATAKANA LETTER SMALL KE' }, + [0x30F7] = { unicodeslot=0x30F7, category='lo', description='KATAKANA LETTER VA', specials={'char',0x30EF,0x3099} }, + [0x30F8] = { unicodeslot=0x30F8, category='lo', description='KATAKANA LETTER VI', specials={'char',0x30F0,0x3099} }, + [0x30F9] = { unicodeslot=0x30F9, category='lo', description='KATAKANA LETTER VE', specials={'char',0x30F1,0x3099} }, + [0x30FA] = { unicodeslot=0x30FA, category='lo', description='KATAKANA LETTER VO', specials={'char',0x30F2,0x3099} }, + [0x30FB] = { unicodeslot=0x30FB, category='po', description='KATAKANA MIDDLE DOT' }, + [0x30FC] = { unicodeslot=0x30FC, category='lm', description='KATAKANA-HIRAGANA PROLONGED SOUND MARK' }, + [0x30FD] = { unicodeslot=0x30FD, category='lm', description='KATAKANA ITERATION MARK' }, + [0x30FE] = { unicodeslot=0x30FE, category='lm', description='KATAKANA VOICED ITERATION MARK', specials={'char',0x30FD,0x3099} }, + [0x30FF] = { unicodeslot=0x30FF, category='lo', description='KATAKANA DIGRAPH KOTO', specials={'vertical',0x30B3,0x30C8} }, + [0x3105] = { unicodeslot=0x3105, category='lo', description='BOPOMOFO LETTER B' }, + [0x3106] = { unicodeslot=0x3106, category='lo', description='BOPOMOFO LETTER P' }, + [0x3107] = { unicodeslot=0x3107, category='lo', description='BOPOMOFO LETTER M' }, + [0x3108] = { unicodeslot=0x3108, category='lo', description='BOPOMOFO LETTER F' }, + [0x3109] = { unicodeslot=0x3109, category='lo', description='BOPOMOFO LETTER D' }, + [0x310A] = { unicodeslot=0x310A, category='lo', description='BOPOMOFO LETTER T' }, + [0x310B] = { unicodeslot=0x310B, category='lo', description='BOPOMOFO LETTER N' }, + [0x310C] = { unicodeslot=0x310C, category='lo', description='BOPOMOFO LETTER L' }, + [0x310D] = { unicodeslot=0x310D, category='lo', description='BOPOMOFO LETTER G' }, + [0x310E] = { unicodeslot=0x310E, category='lo', description='BOPOMOFO LETTER K' }, + [0x310F] = { unicodeslot=0x310F, category='lo', description='BOPOMOFO LETTER H' }, + [0x3110] = { unicodeslot=0x3110, category='lo', description='BOPOMOFO LETTER J' }, + [0x3111] = { unicodeslot=0x3111, category='lo', description='BOPOMOFO LETTER Q' }, + [0x3112] = { unicodeslot=0x3112, category='lo', description='BOPOMOFO LETTER X' }, + [0x3113] = { unicodeslot=0x3113, category='lo', description='BOPOMOFO LETTER ZH' }, + [0x3114] = { unicodeslot=0x3114, category='lo', description='BOPOMOFO LETTER CH' }, + [0x3115] = { unicodeslot=0x3115, category='lo', description='BOPOMOFO LETTER SH' }, + [0x3116] = { unicodeslot=0x3116, category='lo', description='BOPOMOFO LETTER R' }, + [0x3117] = { unicodeslot=0x3117, category='lo', description='BOPOMOFO LETTER Z' }, + [0x3118] = { unicodeslot=0x3118, category='lo', description='BOPOMOFO LETTER C' }, + [0x3119] = { unicodeslot=0x3119, category='lo', description='BOPOMOFO LETTER S' }, + [0x311A] = { unicodeslot=0x311A, category='lo', description='BOPOMOFO LETTER A' }, + [0x311B] = { unicodeslot=0x311B, category='lo', description='BOPOMOFO LETTER O' }, + [0x311C] = { unicodeslot=0x311C, category='lo', description='BOPOMOFO LETTER E' }, + [0x311D] = { unicodeslot=0x311D, category='lo', description='BOPOMOFO LETTER EH' }, + [0x311E] = { unicodeslot=0x311E, category='lo', description='BOPOMOFO LETTER AI' }, + [0x311F] = { unicodeslot=0x311F, category='lo', description='BOPOMOFO LETTER EI' }, + [0x3120] = { unicodeslot=0x3120, category='lo', description='BOPOMOFO LETTER AU' }, + [0x3121] = { unicodeslot=0x3121, category='lo', description='BOPOMOFO LETTER OU' }, + [0x3122] = { unicodeslot=0x3122, category='lo', description='BOPOMOFO LETTER AN' }, + [0x3123] = { unicodeslot=0x3123, category='lo', description='BOPOMOFO LETTER EN' }, + [0x3124] = { unicodeslot=0x3124, category='lo', description='BOPOMOFO LETTER ANG' }, + [0x3125] = { unicodeslot=0x3125, category='lo', description='BOPOMOFO LETTER ENG' }, + [0x3126] = { unicodeslot=0x3126, category='lo', description='BOPOMOFO LETTER ER' }, + [0x3127] = { unicodeslot=0x3127, category='lo', description='BOPOMOFO LETTER I' }, + [0x3128] = { unicodeslot=0x3128, category='lo', description='BOPOMOFO LETTER U' }, + [0x3129] = { unicodeslot=0x3129, category='lo', description='BOPOMOFO LETTER IU' }, + [0x312A] = { unicodeslot=0x312A, category='lo', description='BOPOMOFO LETTER V' }, + [0x312B] = { unicodeslot=0x312B, category='lo', description='BOPOMOFO LETTER NG' }, + [0x312C] = { unicodeslot=0x312C, category='lo', description='BOPOMOFO LETTER GN' }, + [0x3131] = { unicodeslot=0x3131, category='lo', description='HANGUL LETTER KIYEOK', specials={'compat',0x1100} }, + [0x3132] = { unicodeslot=0x3132, category='lo', description='HANGUL LETTER SSANGKIYEOK', specials={'compat',0x1101} }, + [0x3133] = { unicodeslot=0x3133, category='lo', description='HANGUL LETTER KIYEOK-SIOS', specials={'compat',0x11AA} }, + [0x3134] = { unicodeslot=0x3134, category='lo', description='HANGUL LETTER NIEUN', specials={'compat',0x1102} }, + [0x3135] = { unicodeslot=0x3135, category='lo', description='HANGUL LETTER NIEUN-CIEUC', specials={'compat',0x11AC} }, + [0x3136] = { unicodeslot=0x3136, category='lo', description='HANGUL LETTER NIEUN-HIEUH', specials={'compat',0x11AD} }, + [0x3137] = { unicodeslot=0x3137, category='lo', description='HANGUL LETTER TIKEUT', specials={'compat',0x1103} }, + [0x3138] = { unicodeslot=0x3138, category='lo', description='HANGUL LETTER SSANGTIKEUT', specials={'compat',0x1104} }, + [0x3139] = { unicodeslot=0x3139, category='lo', description='HANGUL LETTER RIEUL', specials={'compat',0x1105} }, + [0x313A] = { unicodeslot=0x313A, category='lo', description='HANGUL LETTER RIEUL-KIYEOK', specials={'compat',0x11B0} }, + [0x313B] = { unicodeslot=0x313B, category='lo', description='HANGUL LETTER RIEUL-MIEUM', specials={'compat',0x11B1} }, + [0x313C] = { unicodeslot=0x313C, category='lo', description='HANGUL LETTER RIEUL-PIEUP', specials={'compat',0x11B2} }, + [0x313D] = { unicodeslot=0x313D, category='lo', description='HANGUL LETTER RIEUL-SIOS', specials={'compat',0x11B3} }, + [0x313E] = { unicodeslot=0x313E, category='lo', description='HANGUL LETTER RIEUL-THIEUTH', specials={'compat',0x11B4} }, + [0x313F] = { unicodeslot=0x313F, category='lo', description='HANGUL LETTER RIEUL-PHIEUPH', specials={'compat',0x11B5} }, + [0x3140] = { unicodeslot=0x3140, category='lo', description='HANGUL LETTER RIEUL-HIEUH', specials={'compat',0x111A} }, + [0x3141] = { unicodeslot=0x3141, category='lo', description='HANGUL LETTER MIEUM', specials={'compat',0x1106} }, + [0x3142] = { unicodeslot=0x3142, category='lo', description='HANGUL LETTER PIEUP', specials={'compat',0x1107} }, + [0x3143] = { unicodeslot=0x3143, category='lo', description='HANGUL LETTER SSANGPIEUP', specials={'compat',0x1108} }, + [0x3144] = { unicodeslot=0x3144, category='lo', description='HANGUL LETTER PIEUP-SIOS', specials={'compat',0x1121} }, + [0x3145] = { unicodeslot=0x3145, category='lo', description='HANGUL LETTER SIOS', specials={'compat',0x1109} }, + [0x3146] = { unicodeslot=0x3146, category='lo', description='HANGUL LETTER SSANGSIOS', specials={'compat',0x110A} }, + [0x3147] = { unicodeslot=0x3147, category='lo', description='HANGUL LETTER IEUNG', specials={'compat',0x110B} }, + [0x3148] = { unicodeslot=0x3148, category='lo', description='HANGUL LETTER CIEUC', specials={'compat',0x110C} }, + [0x3149] = { unicodeslot=0x3149, category='lo', description='HANGUL LETTER SSANGCIEUC', specials={'compat',0x110D} }, + [0x314A] = { unicodeslot=0x314A, category='lo', description='HANGUL LETTER CHIEUCH', specials={'compat',0x110E} }, + [0x314B] = { unicodeslot=0x314B, category='lo', description='HANGUL LETTER KHIEUKH', specials={'compat',0x110F} }, + [0x314C] = { unicodeslot=0x314C, category='lo', description='HANGUL LETTER THIEUTH', specials={'compat',0x1110} }, + [0x314D] = { unicodeslot=0x314D, category='lo', description='HANGUL LETTER PHIEUPH', specials={'compat',0x1111} }, + [0x314E] = { unicodeslot=0x314E, category='lo', description='HANGUL LETTER HIEUH', specials={'compat',0x1112} }, + [0x314F] = { unicodeslot=0x314F, category='lo', description='HANGUL LETTER A', specials={'compat',0x1161} }, + [0x3150] = { unicodeslot=0x3150, category='lo', description='HANGUL LETTER AE', specials={'compat',0x1162} }, + [0x3151] = { unicodeslot=0x3151, category='lo', description='HANGUL LETTER YA', specials={'compat',0x1163} }, + [0x3152] = { unicodeslot=0x3152, category='lo', description='HANGUL LETTER YAE', specials={'compat',0x1164} }, + [0x3153] = { unicodeslot=0x3153, category='lo', description='HANGUL LETTER EO', specials={'compat',0x1165} }, + [0x3154] = { unicodeslot=0x3154, category='lo', description='HANGUL LETTER E', specials={'compat',0x1166} }, + [0x3155] = { unicodeslot=0x3155, category='lo', description='HANGUL LETTER YEO', specials={'compat',0x1167} }, + [0x3156] = { unicodeslot=0x3156, category='lo', description='HANGUL LETTER YE', specials={'compat',0x1168} }, + [0x3157] = { unicodeslot=0x3157, category='lo', description='HANGUL LETTER O', specials={'compat',0x1169} }, + [0x3158] = { unicodeslot=0x3158, category='lo', description='HANGUL LETTER WA', specials={'compat',0x116A} }, + [0x3159] = { unicodeslot=0x3159, category='lo', description='HANGUL LETTER WAE', specials={'compat',0x116B} }, + [0x315A] = { unicodeslot=0x315A, category='lo', description='HANGUL LETTER OE', specials={'compat',0x116C} }, + [0x315B] = { unicodeslot=0x315B, category='lo', description='HANGUL LETTER YO', specials={'compat',0x116D} }, + [0x315C] = { unicodeslot=0x315C, category='lo', description='HANGUL LETTER U', specials={'compat',0x116E} }, + [0x315D] = { unicodeslot=0x315D, category='lo', description='HANGUL LETTER WEO', specials={'compat',0x116F} }, + [0x315E] = { unicodeslot=0x315E, category='lo', description='HANGUL LETTER WE', specials={'compat',0x1170} }, + [0x315F] = { unicodeslot=0x315F, category='lo', description='HANGUL LETTER WI', specials={'compat',0x1171} }, + [0x3160] = { unicodeslot=0x3160, category='lo', description='HANGUL LETTER YU', specials={'compat',0x1172} }, + [0x3161] = { unicodeslot=0x3161, category='lo', description='HANGUL LETTER EU', specials={'compat',0x1173} }, + [0x3162] = { unicodeslot=0x3162, category='lo', description='HANGUL LETTER YI', specials={'compat',0x1174} }, + [0x3163] = { unicodeslot=0x3163, category='lo', description='HANGUL LETTER I', specials={'compat',0x1175} }, + [0x3164] = { unicodeslot=0x3164, category='lo', description='HANGUL FILLER', specials={'compat',0x1160} }, + [0x3165] = { unicodeslot=0x3165, category='lo', description='HANGUL LETTER SSANGNIEUN', specials={'compat',0x1114} }, + [0x3166] = { unicodeslot=0x3166, category='lo', description='HANGUL LETTER NIEUN-TIKEUT', specials={'compat',0x1115} }, + [0x3167] = { unicodeslot=0x3167, category='lo', description='HANGUL LETTER NIEUN-SIOS', specials={'compat',0x11C7} }, + [0x3168] = { unicodeslot=0x3168, category='lo', description='HANGUL LETTER NIEUN-PANSIOS', specials={'compat',0x11C8} }, + [0x3169] = { unicodeslot=0x3169, category='lo', description='HANGUL LETTER RIEUL-KIYEOK-SIOS', specials={'compat',0x11CC} }, + [0x316A] = { unicodeslot=0x316A, category='lo', description='HANGUL LETTER RIEUL-TIKEUT', specials={'compat',0x11CE} }, + [0x316B] = { unicodeslot=0x316B, category='lo', description='HANGUL LETTER RIEUL-PIEUP-SIOS', specials={'compat',0x11D3} }, + [0x316C] = { unicodeslot=0x316C, category='lo', description='HANGUL LETTER RIEUL-PANSIOS', specials={'compat',0x11D7} }, + [0x316D] = { unicodeslot=0x316D, category='lo', description='HANGUL LETTER RIEUL-YEORINHIEUH', specials={'compat',0x11D9} }, + [0x316E] = { unicodeslot=0x316E, category='lo', description='HANGUL LETTER MIEUM-PIEUP', specials={'compat',0x111C} }, + [0x316F] = { unicodeslot=0x316F, category='lo', description='HANGUL LETTER MIEUM-SIOS', specials={'compat',0x11DD} }, + [0x3170] = { unicodeslot=0x3170, category='lo', description='HANGUL LETTER MIEUM-PANSIOS', specials={'compat',0x11DF} }, + [0x3171] = { unicodeslot=0x3171, category='lo', description='HANGUL LETTER KAPYEOUNMIEUM', specials={'compat',0x111D} }, + [0x3172] = { unicodeslot=0x3172, category='lo', description='HANGUL LETTER PIEUP-KIYEOK', specials={'compat',0x111E} }, + [0x3173] = { unicodeslot=0x3173, category='lo', description='HANGUL LETTER PIEUP-TIKEUT', specials={'compat',0x1120} }, + [0x3174] = { unicodeslot=0x3174, category='lo', description='HANGUL LETTER PIEUP-SIOS-KIYEOK', specials={'compat',0x1122} }, + [0x3175] = { unicodeslot=0x3175, category='lo', description='HANGUL LETTER PIEUP-SIOS-TIKEUT', specials={'compat',0x1123} }, + [0x3176] = { unicodeslot=0x3176, category='lo', description='HANGUL LETTER PIEUP-CIEUC', specials={'compat',0x1127} }, + [0x3177] = { unicodeslot=0x3177, category='lo', description='HANGUL LETTER PIEUP-THIEUTH', specials={'compat',0x1129} }, + [0x3178] = { unicodeslot=0x3178, category='lo', description='HANGUL LETTER KAPYEOUNPIEUP', specials={'compat',0x112B} }, + [0x3179] = { unicodeslot=0x3179, category='lo', description='HANGUL LETTER KAPYEOUNSSANGPIEUP', specials={'compat',0x112C} }, + [0x317A] = { unicodeslot=0x317A, category='lo', description='HANGUL LETTER SIOS-KIYEOK', specials={'compat',0x112D} }, + [0x317B] = { unicodeslot=0x317B, category='lo', description='HANGUL LETTER SIOS-NIEUN', specials={'compat',0x112E} }, + [0x317C] = { unicodeslot=0x317C, category='lo', description='HANGUL LETTER SIOS-TIKEUT', specials={'compat',0x112F} }, + [0x317D] = { unicodeslot=0x317D, category='lo', description='HANGUL LETTER SIOS-PIEUP', specials={'compat',0x1132} }, + [0x317E] = { unicodeslot=0x317E, category='lo', description='HANGUL LETTER SIOS-CIEUC', specials={'compat',0x1136} }, + [0x317F] = { unicodeslot=0x317F, category='lo', description='HANGUL LETTER PANSIOS', specials={'compat',0x1140} }, + [0x3180] = { unicodeslot=0x3180, category='lo', description='HANGUL LETTER SSANGIEUNG', specials={'compat',0x1147} }, + [0x3181] = { unicodeslot=0x3181, category='lo', description='HANGUL LETTER YESIEUNG', specials={'compat',0x114C} }, + [0x3182] = { unicodeslot=0x3182, category='lo', description='HANGUL LETTER YESIEUNG-SIOS', specials={'compat',0x11F1} }, + [0x3183] = { unicodeslot=0x3183, category='lo', description='HANGUL LETTER YESIEUNG-PANSIOS', specials={'compat',0x11F2} }, + [0x3184] = { unicodeslot=0x3184, category='lo', description='HANGUL LETTER KAPYEOUNPHIEUPH', specials={'compat',0x1157} }, + [0x3185] = { unicodeslot=0x3185, category='lo', description='HANGUL LETTER SSANGHIEUH', specials={'compat',0x1158} }, + [0x3186] = { unicodeslot=0x3186, category='lo', description='HANGUL LETTER YEORINHIEUH', specials={'compat',0x1159} }, + [0x3187] = { unicodeslot=0x3187, category='lo', description='HANGUL LETTER YO-YA', specials={'compat',0x1184} }, + [0x3188] = { unicodeslot=0x3188, category='lo', description='HANGUL LETTER YO-YAE', specials={'compat',0x1185} }, + [0x3189] = { unicodeslot=0x3189, category='lo', description='HANGUL LETTER YO-I', specials={'compat',0x1188} }, + [0x318A] = { unicodeslot=0x318A, category='lo', description='HANGUL LETTER YU-YEO', specials={'compat',0x1191} }, + [0x318B] = { unicodeslot=0x318B, category='lo', description='HANGUL LETTER YU-YE', specials={'compat',0x1192} }, + [0x318C] = { unicodeslot=0x318C, category='lo', description='HANGUL LETTER YU-I', specials={'compat',0x1194} }, + [0x318D] = { unicodeslot=0x318D, category='lo', description='HANGUL LETTER ARAEA', specials={'compat',0x119E} }, + [0x318E] = { unicodeslot=0x318E, category='lo', description='HANGUL LETTER ARAEAE', specials={'compat',0x11A1} }, + [0x3190] = { unicodeslot=0x3190, category='so', description='IDEOGRAPHIC ANNOTATION LINKING MARK' }, + [0x3191] = { unicodeslot=0x3191, category='so', description='IDEOGRAPHIC ANNOTATION REVERSE MARK' }, + [0x3192] = { unicodeslot=0x3192, category='no', description='IDEOGRAPHIC ANNOTATION ONE MARK', specials={'super',0x4E00} }, + [0x3193] = { unicodeslot=0x3193, category='no', description='IDEOGRAPHIC ANNOTATION TWO MARK', specials={'super',0x4E8C} }, + [0x3194] = { unicodeslot=0x3194, category='no', description='IDEOGRAPHIC ANNOTATION THREE MARK', specials={'super',0x4E09} }, + [0x3195] = { unicodeslot=0x3195, category='no', description='IDEOGRAPHIC ANNOTATION FOUR MARK', specials={'super',0x56DB} }, + [0x3196] = { unicodeslot=0x3196, category='so', description='IDEOGRAPHIC ANNOTATION TOP MARK', specials={'super',0x4E0A} }, + [0x3197] = { unicodeslot=0x3197, category='so', description='IDEOGRAPHIC ANNOTATION MIDDLE MARK', specials={'super',0x4E2D} }, + [0x3198] = { unicodeslot=0x3198, category='so', description='IDEOGRAPHIC ANNOTATION BOTTOM MARK', specials={'super',0x4E0B} }, + [0x3199] = { unicodeslot=0x3199, category='so', description='IDEOGRAPHIC ANNOTATION FIRST MARK', specials={'super',0x7532} }, + [0x319A] = { unicodeslot=0x319A, category='so', description='IDEOGRAPHIC ANNOTATION SECOND MARK', specials={'super',0x4E59} }, + [0x319B] = { unicodeslot=0x319B, category='so', description='IDEOGRAPHIC ANNOTATION THIRD MARK', specials={'super',0x4E19} }, + [0x319C] = { unicodeslot=0x319C, category='so', description='IDEOGRAPHIC ANNOTATION FOURTH MARK', specials={'super',0x4E01} }, + [0x319D] = { unicodeslot=0x319D, category='so', description='IDEOGRAPHIC ANNOTATION HEAVEN MARK', specials={'super',0x5929} }, + [0x319E] = { unicodeslot=0x319E, category='so', description='IDEOGRAPHIC ANNOTATION EARTH MARK', specials={'super',0x5730} }, + [0x319F] = { unicodeslot=0x319F, category='so', description='IDEOGRAPHIC ANNOTATION MAN MARK', specials={'super',0x4EBA} }, + [0x31A0] = { unicodeslot=0x31A0, category='lo', description='BOPOMOFO LETTER BU' }, + [0x31A1] = { unicodeslot=0x31A1, category='lo', description='BOPOMOFO LETTER ZI' }, + [0x31A2] = { unicodeslot=0x31A2, category='lo', description='BOPOMOFO LETTER JI' }, + [0x31A3] = { unicodeslot=0x31A3, category='lo', description='BOPOMOFO LETTER GU' }, + [0x31A4] = { unicodeslot=0x31A4, category='lo', description='BOPOMOFO LETTER EE' }, + [0x31A5] = { unicodeslot=0x31A5, category='lo', description='BOPOMOFO LETTER ENN' }, + [0x31A6] = { unicodeslot=0x31A6, category='lo', description='BOPOMOFO LETTER OO' }, + [0x31A7] = { unicodeslot=0x31A7, category='lo', description='BOPOMOFO LETTER ONN' }, + [0x31A8] = { unicodeslot=0x31A8, category='lo', description='BOPOMOFO LETTER IR' }, + [0x31A9] = { unicodeslot=0x31A9, category='lo', description='BOPOMOFO LETTER ANN' }, + [0x31AA] = { unicodeslot=0x31AA, category='lo', description='BOPOMOFO LETTER INN' }, + [0x31AB] = { unicodeslot=0x31AB, category='lo', description='BOPOMOFO LETTER UNN' }, + [0x31AC] = { unicodeslot=0x31AC, category='lo', description='BOPOMOFO LETTER IM' }, + [0x31AD] = { unicodeslot=0x31AD, category='lo', description='BOPOMOFO LETTER NGG' }, + [0x31AE] = { unicodeslot=0x31AE, category='lo', description='BOPOMOFO LETTER AINN' }, + [0x31AF] = { unicodeslot=0x31AF, category='lo', description='BOPOMOFO LETTER AUNN' }, + [0x31B0] = { unicodeslot=0x31B0, category='lo', description='BOPOMOFO LETTER AM' }, + [0x31B1] = { unicodeslot=0x31B1, category='lo', description='BOPOMOFO LETTER OM' }, + [0x31B2] = { unicodeslot=0x31B2, category='lo', description='BOPOMOFO LETTER ONG' }, + [0x31B3] = { unicodeslot=0x31B3, category='lo', description='BOPOMOFO LETTER INNN' }, + [0x31B4] = { unicodeslot=0x31B4, category='lo', description='BOPOMOFO FINAL LETTER P' }, + [0x31B5] = { unicodeslot=0x31B5, category='lo', description='BOPOMOFO FINAL LETTER T' }, + [0x31B6] = { unicodeslot=0x31B6, category='lo', description='BOPOMOFO FINAL LETTER K' }, + [0x31B7] = { unicodeslot=0x31B7, category='lo', description='BOPOMOFO FINAL LETTER H' }, + [0x31C0] = { unicodeslot=0x31C0, category='so', description='CJK STROKE T' }, + [0x31C1] = { unicodeslot=0x31C1, category='so', description='CJK STROKE WG' }, + [0x31C2] = { unicodeslot=0x31C2, category='so', description='CJK STROKE XG' }, + [0x31C3] = { unicodeslot=0x31C3, category='so', description='CJK STROKE BXG' }, + [0x31C4] = { unicodeslot=0x31C4, category='so', description='CJK STROKE SW' }, + [0x31C5] = { unicodeslot=0x31C5, category='so', description='CJK STROKE HZZ' }, + [0x31C6] = { unicodeslot=0x31C6, category='so', description='CJK STROKE HZG' }, + [0x31C7] = { unicodeslot=0x31C7, category='so', description='CJK STROKE HP' }, + [0x31C8] = { unicodeslot=0x31C8, category='so', description='CJK STROKE HZWG' }, + [0x31C9] = { unicodeslot=0x31C9, category='so', description='CJK STROKE SZWG' }, + [0x31CA] = { unicodeslot=0x31CA, category='so', description='CJK STROKE HZT' }, + [0x31CB] = { unicodeslot=0x31CB, category='so', description='CJK STROKE HZZP' }, + [0x31CC] = { unicodeslot=0x31CC, category='so', description='CJK STROKE HPWG' }, + [0x31CD] = { unicodeslot=0x31CD, category='so', description='CJK STROKE HZW' }, + [0x31CE] = { unicodeslot=0x31CE, category='so', description='CJK STROKE HZZZ' }, + [0x31CF] = { unicodeslot=0x31CF, category='so', description='CJK STROKE N' }, + [0x31F0] = { unicodeslot=0x31F0, category='lo', description='KATAKANA LETTER SMALL KU' }, + [0x31F1] = { unicodeslot=0x31F1, category='lo', description='KATAKANA LETTER SMALL SI' }, + [0x31F2] = { unicodeslot=0x31F2, category='lo', description='KATAKANA LETTER SMALL SU' }, + [0x31F3] = { unicodeslot=0x31F3, category='lo', description='KATAKANA LETTER SMALL TO' }, + [0x31F4] = { unicodeslot=0x31F4, category='lo', description='KATAKANA LETTER SMALL NU' }, + [0x31F5] = { unicodeslot=0x31F5, category='lo', description='KATAKANA LETTER SMALL HA' }, + [0x31F6] = { unicodeslot=0x31F6, category='lo', description='KATAKANA LETTER SMALL HI' }, + [0x31F7] = { unicodeslot=0x31F7, category='lo', description='KATAKANA LETTER SMALL HU' }, + [0x31F8] = { unicodeslot=0x31F8, category='lo', description='KATAKANA LETTER SMALL HE' }, + [0x31F9] = { unicodeslot=0x31F9, category='lo', description='KATAKANA LETTER SMALL HO' }, + [0x31FA] = { unicodeslot=0x31FA, category='lo', description='KATAKANA LETTER SMALL MU' }, + [0x31FB] = { unicodeslot=0x31FB, category='lo', description='KATAKANA LETTER SMALL RA' }, + [0x31FC] = { unicodeslot=0x31FC, category='lo', description='KATAKANA LETTER SMALL RI' }, + [0x31FD] = { unicodeslot=0x31FD, category='lo', description='KATAKANA LETTER SMALL RU' }, + [0x31FE] = { unicodeslot=0x31FE, category='lo', description='KATAKANA LETTER SMALL RE' }, + [0x31FF] = { unicodeslot=0x31FF, category='lo', description='KATAKANA LETTER SMALL RO' }, + [0x3200] = { unicodeslot=0x3200, category='so', description='PARENTHESIZED HANGUL KIYEOK', specials={'compat',0x0028,0x1100,0x0029} }, + [0x3201] = { unicodeslot=0x3201, category='so', description='PARENTHESIZED HANGUL NIEUN', specials={'compat',0x0028,0x1102,0x0029} }, + [0x3202] = { unicodeslot=0x3202, category='so', description='PARENTHESIZED HANGUL TIKEUT', specials={'compat',0x0028,0x1103,0x0029} }, + [0x3203] = { unicodeslot=0x3203, category='so', description='PARENTHESIZED HANGUL RIEUL', specials={'compat',0x0028,0x1105,0x0029} }, + [0x3204] = { unicodeslot=0x3204, category='so', description='PARENTHESIZED HANGUL MIEUM', specials={'compat',0x0028,0x1106,0x0029} }, + [0x3205] = { unicodeslot=0x3205, category='so', description='PARENTHESIZED HANGUL PIEUP', specials={'compat',0x0028,0x1107,0x0029} }, + [0x3206] = { unicodeslot=0x3206, category='so', description='PARENTHESIZED HANGUL SIOS', specials={'compat',0x0028,0x1109,0x0029} }, + [0x3207] = { unicodeslot=0x3207, category='so', description='PARENTHESIZED HANGUL IEUNG', specials={'compat',0x0028,0x110B,0x0029} }, + [0x3208] = { unicodeslot=0x3208, category='so', description='PARENTHESIZED HANGUL CIEUC', specials={'compat',0x0028,0x110C,0x0029} }, + [0x3209] = { unicodeslot=0x3209, category='so', description='PARENTHESIZED HANGUL CHIEUCH', specials={'compat',0x0028,0x110E,0x0029} }, + [0x320A] = { unicodeslot=0x320A, category='so', description='PARENTHESIZED HANGUL KHIEUKH', specials={'compat',0x0028,0x110F,0x0029} }, + [0x320B] = { unicodeslot=0x320B, category='so', description='PARENTHESIZED HANGUL THIEUTH', specials={'compat',0x0028,0x1110,0x0029} }, + [0x320C] = { unicodeslot=0x320C, category='so', description='PARENTHESIZED HANGUL PHIEUPH', specials={'compat',0x0028,0x1111,0x0029} }, + [0x320D] = { unicodeslot=0x320D, category='so', description='PARENTHESIZED HANGUL HIEUH', specials={'compat',0x0028,0x1112,0x0029} }, + [0x320E] = { unicodeslot=0x320E, category='so', description='PARENTHESIZED HANGUL KIYEOK A', specials={'compat',0x0028,0x1100,0x1161,0x0029} }, + [0x320F] = { unicodeslot=0x320F, category='so', description='PARENTHESIZED HANGUL NIEUN A', specials={'compat',0x0028,0x1102,0x1161,0x0029} }, + [0x3210] = { unicodeslot=0x3210, category='so', description='PARENTHESIZED HANGUL TIKEUT A', specials={'compat',0x0028,0x1103,0x1161,0x0029} }, + [0x3211] = { unicodeslot=0x3211, category='so', description='PARENTHESIZED HANGUL RIEUL A', specials={'compat',0x0028,0x1105,0x1161,0x0029} }, + [0x3212] = { unicodeslot=0x3212, category='so', description='PARENTHESIZED HANGUL MIEUM A', specials={'compat',0x0028,0x1106,0x1161,0x0029} }, + [0x3213] = { unicodeslot=0x3213, category='so', description='PARENTHESIZED HANGUL PIEUP A', specials={'compat',0x0028,0x1107,0x1161,0x0029} }, + [0x3214] = { unicodeslot=0x3214, category='so', description='PARENTHESIZED HANGUL SIOS A', specials={'compat',0x0028,0x1109,0x1161,0x0029} }, + [0x3215] = { unicodeslot=0x3215, category='so', description='PARENTHESIZED HANGUL IEUNG A', specials={'compat',0x0028,0x110B,0x1161,0x0029} }, + [0x3216] = { unicodeslot=0x3216, category='so', description='PARENTHESIZED HANGUL CIEUC A', specials={'compat',0x0028,0x110C,0x1161,0x0029} }, + [0x3217] = { unicodeslot=0x3217, category='so', description='PARENTHESIZED HANGUL CHIEUCH A', specials={'compat',0x0028,0x110E,0x1161,0x0029} }, + [0x3218] = { unicodeslot=0x3218, category='so', description='PARENTHESIZED HANGUL KHIEUKH A', specials={'compat',0x0028,0x110F,0x1161,0x0029} }, + [0x3219] = { unicodeslot=0x3219, category='so', description='PARENTHESIZED HANGUL THIEUTH A', specials={'compat',0x0028,0x1110,0x1161,0x0029} }, + [0x321A] = { unicodeslot=0x321A, category='so', description='PARENTHESIZED HANGUL PHIEUPH A', specials={'compat',0x0028,0x1111,0x1161,0x0029} }, + [0x321B] = { unicodeslot=0x321B, category='so', description='PARENTHESIZED HANGUL HIEUH A', specials={'compat',0x0028,0x1112,0x1161,0x0029} }, + [0x321C] = { unicodeslot=0x321C, category='so', description='PARENTHESIZED HANGUL CIEUC U', specials={'compat',0x0028,0x110C,0x116E,0x0029} }, + [0x321D] = { unicodeslot=0x321D, category='so', description='PARENTHESIZED KOREAN CHARACTER OJEON', specials={'compat',0x0028,0x110B,0x1169,0x110C,0x1165,0x11AB,0x0029} }, + [0x321E] = { unicodeslot=0x321E, category='so', description='PARENTHESIZED KOREAN CHARACTER O HU', specials={'compat',0x0028,0x110B,0x1169,0x1112,0x116E,0x0029} }, + [0x3220] = { unicodeslot=0x3220, category='no', description='PARENTHESIZED IDEOGRAPH ONE', specials={'compat',0x0028,0x4E00,0x0029} }, + [0x3221] = { unicodeslot=0x3221, category='no', description='PARENTHESIZED IDEOGRAPH TWO', specials={'compat',0x0028,0x4E8C,0x0029} }, + [0x3222] = { unicodeslot=0x3222, category='no', description='PARENTHESIZED IDEOGRAPH THREE', specials={'compat',0x0028,0x4E09,0x0029} }, + [0x3223] = { unicodeslot=0x3223, category='no', description='PARENTHESIZED IDEOGRAPH FOUR', specials={'compat',0x0028,0x56DB,0x0029} }, + [0x3224] = { unicodeslot=0x3224, category='no', description='PARENTHESIZED IDEOGRAPH FIVE', specials={'compat',0x0028,0x4E94,0x0029} }, + [0x3225] = { unicodeslot=0x3225, category='no', description='PARENTHESIZED IDEOGRAPH SIX', specials={'compat',0x0028,0x516D,0x0029} }, + [0x3226] = { unicodeslot=0x3226, category='no', description='PARENTHESIZED IDEOGRAPH SEVEN', specials={'compat',0x0028,0x4E03,0x0029} }, + [0x3227] = { unicodeslot=0x3227, category='no', description='PARENTHESIZED IDEOGRAPH EIGHT', specials={'compat',0x0028,0x516B,0x0029} }, + [0x3228] = { unicodeslot=0x3228, category='no', description='PARENTHESIZED IDEOGRAPH NINE', specials={'compat',0x0028,0x4E5D,0x0029} }, + [0x3229] = { unicodeslot=0x3229, category='no', description='PARENTHESIZED IDEOGRAPH TEN', specials={'compat',0x0028,0x5341,0x0029} }, + [0x322A] = { unicodeslot=0x322A, category='so', description='PARENTHESIZED IDEOGRAPH MOON', specials={'compat',0x0028,0x6708,0x0029} }, + [0x322B] = { unicodeslot=0x322B, category='so', description='PARENTHESIZED IDEOGRAPH FIRE', specials={'compat',0x0028,0x706B,0x0029} }, + [0x322C] = { unicodeslot=0x322C, category='so', description='PARENTHESIZED IDEOGRAPH WATER', specials={'compat',0x0028,0x6C34,0x0029} }, + [0x322D] = { unicodeslot=0x322D, category='so', description='PARENTHESIZED IDEOGRAPH WOOD', specials={'compat',0x0028,0x6728,0x0029} }, + [0x322E] = { unicodeslot=0x322E, category='so', description='PARENTHESIZED IDEOGRAPH METAL', specials={'compat',0x0028,0x91D1,0x0029} }, + [0x322F] = { unicodeslot=0x322F, category='so', description='PARENTHESIZED IDEOGRAPH EARTH', specials={'compat',0x0028,0x571F,0x0029} }, + [0x3230] = { unicodeslot=0x3230, category='so', description='PARENTHESIZED IDEOGRAPH SUN', specials={'compat',0x0028,0x65E5,0x0029} }, + [0x3231] = { unicodeslot=0x3231, category='so', description='PARENTHESIZED IDEOGRAPH STOCK', specials={'compat',0x0028,0x682A,0x0029} }, + [0x3232] = { unicodeslot=0x3232, category='so', description='PARENTHESIZED IDEOGRAPH HAVE', specials={'compat',0x0028,0x6709,0x0029} }, + [0x3233] = { unicodeslot=0x3233, category='so', description='PARENTHESIZED IDEOGRAPH SOCIETY', specials={'compat',0x0028,0x793E,0x0029} }, + [0x3234] = { unicodeslot=0x3234, category='so', description='PARENTHESIZED IDEOGRAPH NAME', specials={'compat',0x0028,0x540D,0x0029} }, + [0x3235] = { unicodeslot=0x3235, category='so', description='PARENTHESIZED IDEOGRAPH SPECIAL', specials={'compat',0x0028,0x7279,0x0029} }, + [0x3236] = { unicodeslot=0x3236, category='so', description='PARENTHESIZED IDEOGRAPH FINANCIAL', specials={'compat',0x0028,0x8CA1,0x0029} }, + [0x3237] = { unicodeslot=0x3237, category='so', description='PARENTHESIZED IDEOGRAPH CONGRATULATION', specials={'compat',0x0028,0x795D,0x0029} }, + [0x3238] = { unicodeslot=0x3238, category='so', description='PARENTHESIZED IDEOGRAPH LABOR', specials={'compat',0x0028,0x52B4,0x0029} }, + [0x3239] = { unicodeslot=0x3239, category='so', description='PARENTHESIZED IDEOGRAPH REPRESENT', specials={'compat',0x0028,0x4EE3,0x0029} }, + [0x323A] = { unicodeslot=0x323A, category='so', description='PARENTHESIZED IDEOGRAPH CALL', specials={'compat',0x0028,0x547C,0x0029} }, + [0x323B] = { unicodeslot=0x323B, category='so', description='PARENTHESIZED IDEOGRAPH STUDY', specials={'compat',0x0028,0x5B66,0x0029} }, + [0x323C] = { unicodeslot=0x323C, category='so', description='PARENTHESIZED IDEOGRAPH SUPERVISE', specials={'compat',0x0028,0x76E3,0x0029} }, + [0x323D] = { unicodeslot=0x323D, category='so', description='PARENTHESIZED IDEOGRAPH ENTERPRISE', specials={'compat',0x0028,0x4F01,0x0029} }, + [0x323E] = { unicodeslot=0x323E, category='so', description='PARENTHESIZED IDEOGRAPH RESOURCE', specials={'compat',0x0028,0x8CC7,0x0029} }, + [0x323F] = { unicodeslot=0x323F, category='so', description='PARENTHESIZED IDEOGRAPH ALLIANCE', specials={'compat',0x0028,0x5354,0x0029} }, + [0x3240] = { unicodeslot=0x3240, category='so', description='PARENTHESIZED IDEOGRAPH FESTIVAL', specials={'compat',0x0028,0x796D,0x0029} }, + [0x3241] = { unicodeslot=0x3241, category='so', description='PARENTHESIZED IDEOGRAPH REST', specials={'compat',0x0028,0x4F11,0x0029} }, + [0x3242] = { unicodeslot=0x3242, category='so', description='PARENTHESIZED IDEOGRAPH SELF', specials={'compat',0x0028,0x81EA,0x0029} }, + [0x3243] = { unicodeslot=0x3243, category='so', description='PARENTHESIZED IDEOGRAPH REACH', specials={'compat',0x0028,0x81F3,0x0029} }, + [0x3250] = { unicodeslot=0x3250, category='so', description='PARTNERSHIP SIGN', specials={'square',0x0050,0x0054,0x0045} }, + [0x3251] = { unicodeslot=0x3251, category='no', description='CIRCLED NUMBER TWENTY ONE', specials={'circle',0x0032,0x0031} }, + [0x3252] = { unicodeslot=0x3252, category='no', description='CIRCLED NUMBER TWENTY TWO', specials={'circle',0x0032,0x0032} }, + [0x3253] = { unicodeslot=0x3253, category='no', description='CIRCLED NUMBER TWENTY THREE', specials={'circle',0x0032,0x0033} }, + [0x3254] = { unicodeslot=0x3254, category='no', description='CIRCLED NUMBER TWENTY FOUR', specials={'circle',0x0032,0x0034} }, + [0x3255] = { unicodeslot=0x3255, category='no', description='CIRCLED NUMBER TWENTY FIVE', specials={'circle',0x0032,0x0035} }, + [0x3256] = { unicodeslot=0x3256, category='no', description='CIRCLED NUMBER TWENTY SIX', specials={'circle',0x0032,0x0036} }, + [0x3257] = { unicodeslot=0x3257, category='no', description='CIRCLED NUMBER TWENTY SEVEN', specials={'circle',0x0032,0x0037} }, + [0x3258] = { unicodeslot=0x3258, category='no', description='CIRCLED NUMBER TWENTY EIGHT', specials={'circle',0x0032,0x0038} }, + [0x3259] = { unicodeslot=0x3259, category='no', description='CIRCLED NUMBER TWENTY NINE', specials={'circle',0x0032,0x0039} }, + [0x325A] = { unicodeslot=0x325A, category='no', description='CIRCLED NUMBER THIRTY', specials={'circle',0x0033,0x0030} }, + [0x325B] = { unicodeslot=0x325B, category='no', description='CIRCLED NUMBER THIRTY ONE', specials={'circle',0x0033,0x0031} }, + [0x325C] = { unicodeslot=0x325C, category='no', description='CIRCLED NUMBER THIRTY TWO', specials={'circle',0x0033,0x0032} }, + [0x325D] = { unicodeslot=0x325D, category='no', description='CIRCLED NUMBER THIRTY THREE', specials={'circle',0x0033,0x0033} }, + [0x325E] = { unicodeslot=0x325E, category='no', description='CIRCLED NUMBER THIRTY FOUR', specials={'circle',0x0033,0x0034} }, + [0x325F] = { unicodeslot=0x325F, category='no', description='CIRCLED NUMBER THIRTY FIVE', specials={'circle',0x0033,0x0035} }, + [0x3260] = { unicodeslot=0x3260, category='so', description='CIRCLED HANGUL KIYEOK', specials={'circle',0x1100} }, + [0x3261] = { unicodeslot=0x3261, category='so', description='CIRCLED HANGUL NIEUN', specials={'circle',0x1102} }, + [0x3262] = { unicodeslot=0x3262, category='so', description='CIRCLED HANGUL TIKEUT', specials={'circle',0x1103} }, + [0x3263] = { unicodeslot=0x3263, category='so', description='CIRCLED HANGUL RIEUL', specials={'circle',0x1105} }, + [0x3264] = { unicodeslot=0x3264, category='so', description='CIRCLED HANGUL MIEUM', specials={'circle',0x1106} }, + [0x3265] = { unicodeslot=0x3265, category='so', description='CIRCLED HANGUL PIEUP', specials={'circle',0x1107} }, + [0x3266] = { unicodeslot=0x3266, category='so', description='CIRCLED HANGUL SIOS', specials={'circle',0x1109} }, + [0x3267] = { unicodeslot=0x3267, category='so', description='CIRCLED HANGUL IEUNG', specials={'circle',0x110B} }, + [0x3268] = { unicodeslot=0x3268, category='so', description='CIRCLED HANGUL CIEUC', specials={'circle',0x110C} }, + [0x3269] = { unicodeslot=0x3269, category='so', description='CIRCLED HANGUL CHIEUCH', specials={'circle',0x110E} }, + [0x326A] = { unicodeslot=0x326A, category='so', description='CIRCLED HANGUL KHIEUKH', specials={'circle',0x110F} }, + [0x326B] = { unicodeslot=0x326B, category='so', description='CIRCLED HANGUL THIEUTH', specials={'circle',0x1110} }, + [0x326C] = { unicodeslot=0x326C, category='so', description='CIRCLED HANGUL PHIEUPH', specials={'circle',0x1111} }, + [0x326D] = { unicodeslot=0x326D, category='so', description='CIRCLED HANGUL HIEUH', specials={'circle',0x1112} }, + [0x326E] = { unicodeslot=0x326E, category='so', description='CIRCLED HANGUL KIYEOK A', specials={'circle',0x1100,0x1161} }, + [0x326F] = { unicodeslot=0x326F, category='so', description='CIRCLED HANGUL NIEUN A', specials={'circle',0x1102,0x1161} }, + [0x3270] = { unicodeslot=0x3270, category='so', description='CIRCLED HANGUL TIKEUT A', specials={'circle',0x1103,0x1161} }, + [0x3271] = { unicodeslot=0x3271, category='so', description='CIRCLED HANGUL RIEUL A', specials={'circle',0x1105,0x1161} }, + [0x3272] = { unicodeslot=0x3272, category='so', description='CIRCLED HANGUL MIEUM A', specials={'circle',0x1106,0x1161} }, + [0x3273] = { unicodeslot=0x3273, category='so', description='CIRCLED HANGUL PIEUP A', specials={'circle',0x1107,0x1161} }, + [0x3274] = { unicodeslot=0x3274, category='so', description='CIRCLED HANGUL SIOS A', specials={'circle',0x1109,0x1161} }, + [0x3275] = { unicodeslot=0x3275, category='so', description='CIRCLED HANGUL IEUNG A', specials={'circle',0x110B,0x1161} }, + [0x3276] = { unicodeslot=0x3276, category='so', description='CIRCLED HANGUL CIEUC A', specials={'circle',0x110C,0x1161} }, + [0x3277] = { unicodeslot=0x3277, category='so', description='CIRCLED HANGUL CHIEUCH A', specials={'circle',0x110E,0x1161} }, + [0x3278] = { unicodeslot=0x3278, category='so', description='CIRCLED HANGUL KHIEUKH A', specials={'circle',0x110F,0x1161} }, + [0x3279] = { unicodeslot=0x3279, category='so', description='CIRCLED HANGUL THIEUTH A', specials={'circle',0x1110,0x1161} }, + [0x327A] = { unicodeslot=0x327A, category='so', description='CIRCLED HANGUL PHIEUPH A', specials={'circle',0x1111,0x1161} }, + [0x327B] = { unicodeslot=0x327B, category='so', description='CIRCLED HANGUL HIEUH A', specials={'circle',0x1112,0x1161} }, + [0x327C] = { unicodeslot=0x327C, category='so', description='CIRCLED KOREAN CHARACTER CHAMKO', specials={'circle',0x110E,0x1161,0x11B7,0x1100,0x1169} }, + [0x327D] = { unicodeslot=0x327D, category='so', description='CIRCLED KOREAN CHARACTER JUEUI', specials={'circle',0x110C,0x116E,0x110B,0x1174} }, + [0x327E] = { unicodeslot=0x327E, category='so', description='CIRCLED HANGUL IEUNG U', specials={'circle',0x110B,0x116E} }, + [0x327F] = { unicodeslot=0x327F, category='so', description='KOREAN STANDARD SYMBOL' }, + [0x3280] = { unicodeslot=0x3280, category='no', description='CIRCLED IDEOGRAPH ONE', specials={'circle',0x4E00} }, + [0x3281] = { unicodeslot=0x3281, category='no', description='CIRCLED IDEOGRAPH TWO', specials={'circle',0x4E8C} }, + [0x3282] = { unicodeslot=0x3282, category='no', description='CIRCLED IDEOGRAPH THREE', specials={'circle',0x4E09} }, + [0x3283] = { unicodeslot=0x3283, category='no', description='CIRCLED IDEOGRAPH FOUR', specials={'circle',0x56DB} }, + [0x3284] = { unicodeslot=0x3284, category='no', description='CIRCLED IDEOGRAPH FIVE', specials={'circle',0x4E94} }, + [0x3285] = { unicodeslot=0x3285, category='no', description='CIRCLED IDEOGRAPH SIX', specials={'circle',0x516D} }, + [0x3286] = { unicodeslot=0x3286, category='no', description='CIRCLED IDEOGRAPH SEVEN', specials={'circle',0x4E03} }, + [0x3287] = { unicodeslot=0x3287, category='no', description='CIRCLED IDEOGRAPH EIGHT', specials={'circle',0x516B} }, + [0x3288] = { unicodeslot=0x3288, category='no', description='CIRCLED IDEOGRAPH NINE', specials={'circle',0x4E5D} }, + [0x3289] = { unicodeslot=0x3289, category='no', description='CIRCLED IDEOGRAPH TEN', specials={'circle',0x5341} }, + [0x328A] = { unicodeslot=0x328A, category='so', description='CIRCLED IDEOGRAPH MOON', specials={'circle',0x6708} }, + [0x328B] = { unicodeslot=0x328B, category='so', description='CIRCLED IDEOGRAPH FIRE', specials={'circle',0x706B} }, + [0x328C] = { unicodeslot=0x328C, category='so', description='CIRCLED IDEOGRAPH WATER', specials={'circle',0x6C34} }, + [0x328D] = { unicodeslot=0x328D, category='so', description='CIRCLED IDEOGRAPH WOOD', specials={'circle',0x6728} }, + [0x328E] = { unicodeslot=0x328E, category='so', description='CIRCLED IDEOGRAPH METAL', specials={'circle',0x91D1} }, + [0x328F] = { unicodeslot=0x328F, category='so', description='CIRCLED IDEOGRAPH EARTH', specials={'circle',0x571F} }, + [0x3290] = { unicodeslot=0x3290, category='so', description='CIRCLED IDEOGRAPH SUN', specials={'circle',0x65E5} }, + [0x3291] = { unicodeslot=0x3291, category='so', description='CIRCLED IDEOGRAPH STOCK', specials={'circle',0x682A} }, + [0x3292] = { unicodeslot=0x3292, category='so', description='CIRCLED IDEOGRAPH HAVE', specials={'circle',0x6709} }, + [0x3293] = { unicodeslot=0x3293, category='so', description='CIRCLED IDEOGRAPH SOCIETY', specials={'circle',0x793E} }, + [0x3294] = { unicodeslot=0x3294, category='so', description='CIRCLED IDEOGRAPH NAME', specials={'circle',0x540D} }, + [0x3295] = { unicodeslot=0x3295, category='so', description='CIRCLED IDEOGRAPH SPECIAL', specials={'circle',0x7279} }, + [0x3296] = { unicodeslot=0x3296, category='so', description='CIRCLED IDEOGRAPH FINANCIAL', specials={'circle',0x8CA1} }, + [0x3297] = { unicodeslot=0x3297, category='so', description='CIRCLED IDEOGRAPH CONGRATULATION', specials={'circle',0x795D} }, + [0x3298] = { unicodeslot=0x3298, category='so', description='CIRCLED IDEOGRAPH LABOR', specials={'circle',0x52B4} }, + [0x3299] = { unicodeslot=0x3299, category='so', description='CIRCLED IDEOGRAPH SECRET', specials={'circle',0x79D8} }, + [0x329A] = { unicodeslot=0x329A, category='so', description='CIRCLED IDEOGRAPH MALE', specials={'circle',0x7537} }, + [0x329B] = { unicodeslot=0x329B, category='so', description='CIRCLED IDEOGRAPH FEMALE', specials={'circle',0x5973} }, + [0x329C] = { unicodeslot=0x329C, category='so', description='CIRCLED IDEOGRAPH SUITABLE', specials={'circle',0x9069} }, + [0x329D] = { unicodeslot=0x329D, category='so', description='CIRCLED IDEOGRAPH EXCELLENT', specials={'circle',0x512A} }, + [0x329E] = { unicodeslot=0x329E, category='so', description='CIRCLED IDEOGRAPH PRINT', specials={'circle',0x5370} }, + [0x329F] = { unicodeslot=0x329F, category='so', description='CIRCLED IDEOGRAPH ATTENTION', specials={'circle',0x6CE8} }, + [0x32A0] = { unicodeslot=0x32A0, category='so', description='CIRCLED IDEOGRAPH ITEM', specials={'circle',0x9805} }, + [0x32A1] = { unicodeslot=0x32A1, category='so', description='CIRCLED IDEOGRAPH REST', specials={'circle',0x4F11} }, + [0x32A2] = { unicodeslot=0x32A2, category='so', description='CIRCLED IDEOGRAPH COPY', specials={'circle',0x5199} }, + [0x32A3] = { unicodeslot=0x32A3, category='so', description='CIRCLED IDEOGRAPH CORRECT', specials={'circle',0x6B63} }, + [0x32A4] = { unicodeslot=0x32A4, category='so', description='CIRCLED IDEOGRAPH HIGH', specials={'circle',0x4E0A} }, + [0x32A5] = { unicodeslot=0x32A5, category='so', description='CIRCLED IDEOGRAPH CENTRE', specials={'circle',0x4E2D} }, + [0x32A6] = { unicodeslot=0x32A6, category='so', description='CIRCLED IDEOGRAPH LOW', specials={'circle',0x4E0B} }, + [0x32A7] = { unicodeslot=0x32A7, category='so', description='CIRCLED IDEOGRAPH LEFT', specials={'circle',0x5DE6} }, + [0x32A8] = { unicodeslot=0x32A8, category='so', description='CIRCLED IDEOGRAPH RIGHT', specials={'circle',0x53F3} }, + [0x32A9] = { unicodeslot=0x32A9, category='so', description='CIRCLED IDEOGRAPH MEDICINE', specials={'circle',0x533B} }, + [0x32AA] = { unicodeslot=0x32AA, category='so', description='CIRCLED IDEOGRAPH RELIGION', specials={'circle',0x5B97} }, + [0x32AB] = { unicodeslot=0x32AB, category='so', description='CIRCLED IDEOGRAPH STUDY', specials={'circle',0x5B66} }, + [0x32AC] = { unicodeslot=0x32AC, category='so', description='CIRCLED IDEOGRAPH SUPERVISE', specials={'circle',0x76E3} }, + [0x32AD] = { unicodeslot=0x32AD, category='so', description='CIRCLED IDEOGRAPH ENTERPRISE', specials={'circle',0x4F01} }, + [0x32AE] = { unicodeslot=0x32AE, category='so', description='CIRCLED IDEOGRAPH RESOURCE', specials={'circle',0x8CC7} }, + [0x32AF] = { unicodeslot=0x32AF, category='so', description='CIRCLED IDEOGRAPH ALLIANCE', specials={'circle',0x5354} }, + [0x32B0] = { unicodeslot=0x32B0, category='so', description='CIRCLED IDEOGRAPH NIGHT', specials={'circle',0x591C} }, + [0x32B1] = { unicodeslot=0x32B1, category='no', description='CIRCLED NUMBER THIRTY SIX', specials={'circle',0x0033,0x0036} }, + [0x32B2] = { unicodeslot=0x32B2, category='no', description='CIRCLED NUMBER THIRTY SEVEN', specials={'circle',0x0033,0x0037} }, + [0x32B3] = { unicodeslot=0x32B3, category='no', description='CIRCLED NUMBER THIRTY EIGHT', specials={'circle',0x0033,0x0038} }, + [0x32B4] = { unicodeslot=0x32B4, category='no', description='CIRCLED NUMBER THIRTY NINE', specials={'circle',0x0033,0x0039} }, + [0x32B5] = { unicodeslot=0x32B5, category='no', description='CIRCLED NUMBER FORTY', specials={'circle',0x0034,0x0030} }, + [0x32B6] = { unicodeslot=0x32B6, category='no', description='CIRCLED NUMBER FORTY ONE', specials={'circle',0x0034,0x0031} }, + [0x32B7] = { unicodeslot=0x32B7, category='no', description='CIRCLED NUMBER FORTY TWO', specials={'circle',0x0034,0x0032} }, + [0x32B8] = { unicodeslot=0x32B8, category='no', description='CIRCLED NUMBER FORTY THREE', specials={'circle',0x0034,0x0033} }, + [0x32B9] = { unicodeslot=0x32B9, category='no', description='CIRCLED NUMBER FORTY FOUR', specials={'circle',0x0034,0x0034} }, + [0x32BA] = { unicodeslot=0x32BA, category='no', description='CIRCLED NUMBER FORTY FIVE', specials={'circle',0x0034,0x0035} }, + [0x32BB] = { unicodeslot=0x32BB, category='no', description='CIRCLED NUMBER FORTY SIX', specials={'circle',0x0034,0x0036} }, + [0x32BC] = { unicodeslot=0x32BC, category='no', description='CIRCLED NUMBER FORTY SEVEN', specials={'circle',0x0034,0x0037} }, + [0x32BD] = { unicodeslot=0x32BD, category='no', description='CIRCLED NUMBER FORTY EIGHT', specials={'circle',0x0034,0x0038} }, + [0x32BE] = { unicodeslot=0x32BE, category='no', description='CIRCLED NUMBER FORTY NINE', specials={'circle',0x0034,0x0039} }, + [0x32BF] = { unicodeslot=0x32BF, category='no', description='CIRCLED NUMBER FIFTY', specials={'circle',0x0035,0x0030} }, + [0x32C0] = { unicodeslot=0x32C0, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR JANUARY', specials={'compat',0x0031,0x6708} }, + [0x32C1] = { unicodeslot=0x32C1, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR FEBRUARY', specials={'compat',0x0032,0x6708} }, + [0x32C2] = { unicodeslot=0x32C2, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR MARCH', specials={'compat',0x0033,0x6708} }, + [0x32C3] = { unicodeslot=0x32C3, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR APRIL', specials={'compat',0x0034,0x6708} }, + [0x32C4] = { unicodeslot=0x32C4, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR MAY', specials={'compat',0x0035,0x6708} }, + [0x32C5] = { unicodeslot=0x32C5, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR JUNE', specials={'compat',0x0036,0x6708} }, + [0x32C6] = { unicodeslot=0x32C6, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR JULY', specials={'compat',0x0037,0x6708} }, + [0x32C7] = { unicodeslot=0x32C7, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR AUGUST', specials={'compat',0x0038,0x6708} }, + [0x32C8] = { unicodeslot=0x32C8, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR SEPTEMBER', specials={'compat',0x0039,0x6708} }, + [0x32C9] = { unicodeslot=0x32C9, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR OCTOBER', specials={'compat',0x0031,0x0030,0x6708} }, + [0x32CA] = { unicodeslot=0x32CA, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR NOVEMBER', specials={'compat',0x0031,0x0031,0x6708} }, + [0x32CB] = { unicodeslot=0x32CB, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DECEMBER', specials={'compat',0x0031,0x0032,0x6708} }, + [0x32CC] = { unicodeslot=0x32CC, category='so', description='SQUARE HG', specials={'square',0x0048,0x0067} }, + [0x32CD] = { unicodeslot=0x32CD, category='so', description='SQUARE ERG', specials={'square',0x0065,0x0072,0x0067} }, + [0x32CE] = { unicodeslot=0x32CE, category='so', description='SQUARE EV', specials={'square',0x0065,0x0056} }, + [0x32CF] = { unicodeslot=0x32CF, category='so', description='LIMITED LIABILITY SIGN', specials={'square',0x004C,0x0054,0x0044} }, + [0x32D0] = { unicodeslot=0x32D0, category='so', description='CIRCLED KATAKANA A', specials={'circle',0x30A2} }, + [0x32D1] = { unicodeslot=0x32D1, category='so', description='CIRCLED KATAKANA I', specials={'circle',0x30A4} }, + [0x32D2] = { unicodeslot=0x32D2, category='so', description='CIRCLED KATAKANA U', specials={'circle',0x30A6} }, + [0x32D3] = { unicodeslot=0x32D3, category='so', description='CIRCLED KATAKANA E', specials={'circle',0x30A8} }, + [0x32D4] = { unicodeslot=0x32D4, category='so', description='CIRCLED KATAKANA O', specials={'circle',0x30AA} }, + [0x32D5] = { unicodeslot=0x32D5, category='so', description='CIRCLED KATAKANA KA', specials={'circle',0x30AB} }, + [0x32D6] = { unicodeslot=0x32D6, category='so', description='CIRCLED KATAKANA KI', specials={'circle',0x30AD} }, + [0x32D7] = { unicodeslot=0x32D7, category='so', description='CIRCLED KATAKANA KU', specials={'circle',0x30AF} }, + [0x32D8] = { unicodeslot=0x32D8, category='so', description='CIRCLED KATAKANA KE', specials={'circle',0x30B1} }, + [0x32D9] = { unicodeslot=0x32D9, category='so', description='CIRCLED KATAKANA KO', specials={'circle',0x30B3} }, + [0x32DA] = { unicodeslot=0x32DA, category='so', description='CIRCLED KATAKANA SA', specials={'circle',0x30B5} }, + [0x32DB] = { unicodeslot=0x32DB, category='so', description='CIRCLED KATAKANA SI', specials={'circle',0x30B7} }, + [0x32DC] = { unicodeslot=0x32DC, category='so', description='CIRCLED KATAKANA SU', specials={'circle',0x30B9} }, + [0x32DD] = { unicodeslot=0x32DD, category='so', description='CIRCLED KATAKANA SE', specials={'circle',0x30BB} }, + [0x32DE] = { unicodeslot=0x32DE, category='so', description='CIRCLED KATAKANA SO', specials={'circle',0x30BD} }, + [0x32DF] = { unicodeslot=0x32DF, category='so', description='CIRCLED KATAKANA TA', specials={'circle',0x30BF} }, + [0x32E0] = { unicodeslot=0x32E0, category='so', description='CIRCLED KATAKANA TI', specials={'circle',0x30C1} }, + [0x32E1] = { unicodeslot=0x32E1, category='so', description='CIRCLED KATAKANA TU', specials={'circle',0x30C4} }, + [0x32E2] = { unicodeslot=0x32E2, category='so', description='CIRCLED KATAKANA TE', specials={'circle',0x30C6} }, + [0x32E3] = { unicodeslot=0x32E3, category='so', description='CIRCLED KATAKANA TO', specials={'circle',0x30C8} }, + [0x32E4] = { unicodeslot=0x32E4, category='so', description='CIRCLED KATAKANA NA', specials={'circle',0x30CA} }, + [0x32E5] = { unicodeslot=0x32E5, category='so', description='CIRCLED KATAKANA NI', specials={'circle',0x30CB} }, + [0x32E6] = { unicodeslot=0x32E6, category='so', description='CIRCLED KATAKANA NU', specials={'circle',0x30CC} }, + [0x32E7] = { unicodeslot=0x32E7, category='so', description='CIRCLED KATAKANA NE', specials={'circle',0x30CD} }, + [0x32E8] = { unicodeslot=0x32E8, category='so', description='CIRCLED KATAKANA NO', specials={'circle',0x30CE} }, + [0x32E9] = { unicodeslot=0x32E9, category='so', description='CIRCLED KATAKANA HA', specials={'circle',0x30CF} }, + [0x32EA] = { unicodeslot=0x32EA, category='so', description='CIRCLED KATAKANA HI', specials={'circle',0x30D2} }, + [0x32EB] = { unicodeslot=0x32EB, category='so', description='CIRCLED KATAKANA HU', specials={'circle',0x30D5} }, + [0x32EC] = { unicodeslot=0x32EC, category='so', description='CIRCLED KATAKANA HE', specials={'circle',0x30D8} }, + [0x32ED] = { unicodeslot=0x32ED, category='so', description='CIRCLED KATAKANA HO', specials={'circle',0x30DB} }, + [0x32EE] = { unicodeslot=0x32EE, category='so', description='CIRCLED KATAKANA MA', specials={'circle',0x30DE} }, + [0x32EF] = { unicodeslot=0x32EF, category='so', description='CIRCLED KATAKANA MI', specials={'circle',0x30DF} }, + [0x32F0] = { unicodeslot=0x32F0, category='so', description='CIRCLED KATAKANA MU', specials={'circle',0x30E0} }, + [0x32F1] = { unicodeslot=0x32F1, category='so', description='CIRCLED KATAKANA ME', specials={'circle',0x30E1} }, + [0x32F2] = { unicodeslot=0x32F2, category='so', description='CIRCLED KATAKANA MO', specials={'circle',0x30E2} }, + [0x32F3] = { unicodeslot=0x32F3, category='so', description='CIRCLED KATAKANA YA', specials={'circle',0x30E4} }, + [0x32F4] = { unicodeslot=0x32F4, category='so', description='CIRCLED KATAKANA YU', specials={'circle',0x30E6} }, + [0x32F5] = { unicodeslot=0x32F5, category='so', description='CIRCLED KATAKANA YO', specials={'circle',0x30E8} }, + [0x32F6] = { unicodeslot=0x32F6, category='so', description='CIRCLED KATAKANA RA', specials={'circle',0x30E9} }, + [0x32F7] = { unicodeslot=0x32F7, category='so', description='CIRCLED KATAKANA RI', specials={'circle',0x30EA} }, + [0x32F8] = { unicodeslot=0x32F8, category='so', description='CIRCLED KATAKANA RU', specials={'circle',0x30EB} }, + [0x32F9] = { unicodeslot=0x32F9, category='so', description='CIRCLED KATAKANA RE', specials={'circle',0x30EC} }, + [0x32FA] = { unicodeslot=0x32FA, category='so', description='CIRCLED KATAKANA RO', specials={'circle',0x30ED} }, + [0x32FB] = { unicodeslot=0x32FB, category='so', description='CIRCLED KATAKANA WA', specials={'circle',0x30EF} }, + [0x32FC] = { unicodeslot=0x32FC, category='so', description='CIRCLED KATAKANA WI', specials={'circle',0x30F0} }, + [0x32FD] = { unicodeslot=0x32FD, category='so', description='CIRCLED KATAKANA WE', specials={'circle',0x30F1} }, + [0x32FE] = { unicodeslot=0x32FE, category='so', description='CIRCLED KATAKANA WO', specials={'circle',0x30F2} }, + [0x3300] = { unicodeslot=0x3300, category='so', description='SQUARE APAATO', specials={'square',0x30A2,0x30D1,0x30FC,0x30C8} }, + [0x3301] = { unicodeslot=0x3301, category='so', description='SQUARE ARUHUA', specials={'square',0x30A2,0x30EB,0x30D5,0x30A1} }, + [0x3302] = { unicodeslot=0x3302, category='so', description='SQUARE ANPEA', specials={'square',0x30A2,0x30F3,0x30DA,0x30A2} }, + [0x3303] = { unicodeslot=0x3303, category='so', description='SQUARE AARU', specials={'square',0x30A2,0x30FC,0x30EB} }, + [0x3304] = { unicodeslot=0x3304, category='so', description='SQUARE ININGU', specials={'square',0x30A4,0x30CB,0x30F3,0x30B0} }, + [0x3305] = { unicodeslot=0x3305, category='so', description='SQUARE INTI', specials={'square',0x30A4,0x30F3,0x30C1} }, + [0x3306] = { unicodeslot=0x3306, category='so', description='SQUARE UON', specials={'square',0x30A6,0x30A9,0x30F3} }, + [0x3307] = { unicodeslot=0x3307, category='so', description='SQUARE ESUKUUDO', specials={'square',0x30A8,0x30B9,0x30AF,0x30FC,0x30C9} }, + [0x3308] = { unicodeslot=0x3308, category='so', description='SQUARE EEKAA', specials={'square',0x30A8,0x30FC,0x30AB,0x30FC} }, + [0x3309] = { unicodeslot=0x3309, category='so', description='SQUARE ONSU', specials={'square',0x30AA,0x30F3,0x30B9} }, + [0x330A] = { unicodeslot=0x330A, category='so', description='SQUARE OOMU', specials={'square',0x30AA,0x30FC,0x30E0} }, + [0x330B] = { unicodeslot=0x330B, category='so', description='SQUARE KAIRI', specials={'square',0x30AB,0x30A4,0x30EA} }, + [0x330C] = { unicodeslot=0x330C, category='so', description='SQUARE KARATTO', specials={'square',0x30AB,0x30E9,0x30C3,0x30C8} }, + [0x330D] = { unicodeslot=0x330D, category='so', description='SQUARE KARORII', specials={'square',0x30AB,0x30ED,0x30EA,0x30FC} }, + [0x330E] = { unicodeslot=0x330E, category='so', description='SQUARE GARON', specials={'square',0x30AC,0x30ED,0x30F3} }, + [0x330F] = { unicodeslot=0x330F, category='so', description='SQUARE GANMA', specials={'square',0x30AC,0x30F3,0x30DE} }, + [0x3310] = { unicodeslot=0x3310, category='so', description='SQUARE GIGA', specials={'square',0x30AE,0x30AC} }, + [0x3311] = { unicodeslot=0x3311, category='so', description='SQUARE GINII', specials={'square',0x30AE,0x30CB,0x30FC} }, + [0x3312] = { unicodeslot=0x3312, category='so', description='SQUARE KYURII', specials={'square',0x30AD,0x30E5,0x30EA,0x30FC} }, + [0x3313] = { unicodeslot=0x3313, category='so', description='SQUARE GIRUDAA', specials={'square',0x30AE,0x30EB,0x30C0,0x30FC} }, + [0x3314] = { unicodeslot=0x3314, category='so', description='SQUARE KIRO', specials={'square',0x30AD,0x30ED} }, + [0x3315] = { unicodeslot=0x3315, category='so', description='SQUARE KIROGURAMU', specials={'square',0x30AD,0x30ED,0x30B0,0x30E9,0x30E0} }, + [0x3316] = { unicodeslot=0x3316, category='so', description='SQUARE KIROMEETORU', specials={'square',0x30AD,0x30ED,0x30E1,0x30FC,0x30C8,0x30EB} }, + [0x3317] = { unicodeslot=0x3317, category='so', description='SQUARE KIROWATTO', specials={'square',0x30AD,0x30ED,0x30EF,0x30C3,0x30C8} }, + [0x3318] = { unicodeslot=0x3318, category='so', description='SQUARE GURAMU', specials={'square',0x30B0,0x30E9,0x30E0} }, + [0x3319] = { unicodeslot=0x3319, category='so', description='SQUARE GURAMUTON', specials={'square',0x30B0,0x30E9,0x30E0,0x30C8,0x30F3} }, + [0x331A] = { unicodeslot=0x331A, category='so', description='SQUARE KURUZEIRO', specials={'square',0x30AF,0x30EB,0x30BC,0x30A4,0x30ED} }, + [0x331B] = { unicodeslot=0x331B, category='so', description='SQUARE KUROONE', specials={'square',0x30AF,0x30ED,0x30FC,0x30CD} }, + [0x331C] = { unicodeslot=0x331C, category='so', description='SQUARE KEESU', specials={'square',0x30B1,0x30FC,0x30B9} }, + [0x331D] = { unicodeslot=0x331D, category='so', description='SQUARE KORUNA', specials={'square',0x30B3,0x30EB,0x30CA} }, + [0x331E] = { unicodeslot=0x331E, category='so', description='SQUARE KOOPO', specials={'square',0x30B3,0x30FC,0x30DD} }, + [0x331F] = { unicodeslot=0x331F, category='so', description='SQUARE SAIKURU', specials={'square',0x30B5,0x30A4,0x30AF,0x30EB} }, + [0x3320] = { unicodeslot=0x3320, category='so', description='SQUARE SANTIIMU', specials={'square',0x30B5,0x30F3,0x30C1,0x30FC,0x30E0} }, + [0x3321] = { unicodeslot=0x3321, category='so', description='SQUARE SIRINGU', specials={'square',0x30B7,0x30EA,0x30F3,0x30B0} }, + [0x3322] = { unicodeslot=0x3322, category='so', description='SQUARE SENTI', specials={'square',0x30BB,0x30F3,0x30C1} }, + [0x3323] = { unicodeslot=0x3323, category='so', description='SQUARE SENTO', specials={'square',0x30BB,0x30F3,0x30C8} }, + [0x3324] = { unicodeslot=0x3324, category='so', description='SQUARE DAASU', specials={'square',0x30C0,0x30FC,0x30B9} }, + [0x3325] = { unicodeslot=0x3325, category='so', description='SQUARE DESI', specials={'square',0x30C7,0x30B7} }, + [0x3326] = { unicodeslot=0x3326, category='so', description='SQUARE DORU', specials={'square',0x30C9,0x30EB} }, + [0x3327] = { unicodeslot=0x3327, category='so', description='SQUARE TON', specials={'square',0x30C8,0x30F3} }, + [0x3328] = { unicodeslot=0x3328, category='so', description='SQUARE NANO', specials={'square',0x30CA,0x30CE} }, + [0x3329] = { unicodeslot=0x3329, category='so', description='SQUARE NOTTO', specials={'square',0x30CE,0x30C3,0x30C8} }, + [0x332A] = { unicodeslot=0x332A, category='so', description='SQUARE HAITU', specials={'square',0x30CF,0x30A4,0x30C4} }, + [0x332B] = { unicodeslot=0x332B, category='so', description='SQUARE PAASENTO', specials={'square',0x30D1,0x30FC,0x30BB,0x30F3,0x30C8} }, + [0x332C] = { unicodeslot=0x332C, category='so', description='SQUARE PAATU', specials={'square',0x30D1,0x30FC,0x30C4} }, + [0x332D] = { unicodeslot=0x332D, category='so', description='SQUARE BAARERU', specials={'square',0x30D0,0x30FC,0x30EC,0x30EB} }, + [0x332E] = { unicodeslot=0x332E, category='so', description='SQUARE PIASUTORU', specials={'square',0x30D4,0x30A2,0x30B9,0x30C8,0x30EB} }, + [0x332F] = { unicodeslot=0x332F, category='so', description='SQUARE PIKURU', specials={'square',0x30D4,0x30AF,0x30EB} }, + [0x3330] = { unicodeslot=0x3330, category='so', description='SQUARE PIKO', specials={'square',0x30D4,0x30B3} }, + [0x3331] = { unicodeslot=0x3331, category='so', description='SQUARE BIRU', specials={'square',0x30D3,0x30EB} }, + [0x3332] = { unicodeslot=0x3332, category='so', description='SQUARE HUARADDO', specials={'square',0x30D5,0x30A1,0x30E9,0x30C3,0x30C9} }, + [0x3333] = { unicodeslot=0x3333, category='so', description='SQUARE HUIITO', specials={'square',0x30D5,0x30A3,0x30FC,0x30C8} }, + [0x3334] = { unicodeslot=0x3334, category='so', description='SQUARE BUSSYERU', specials={'square',0x30D6,0x30C3,0x30B7,0x30A7,0x30EB} }, + [0x3335] = { unicodeslot=0x3335, category='so', description='SQUARE HURAN', specials={'square',0x30D5,0x30E9,0x30F3} }, + [0x3336] = { unicodeslot=0x3336, category='so', description='SQUARE HEKUTAARU', specials={'square',0x30D8,0x30AF,0x30BF,0x30FC,0x30EB} }, + [0x3337] = { unicodeslot=0x3337, category='so', description='SQUARE PESO', specials={'square',0x30DA,0x30BD} }, + [0x3338] = { unicodeslot=0x3338, category='so', description='SQUARE PENIHI', specials={'square',0x30DA,0x30CB,0x30D2} }, + [0x3339] = { unicodeslot=0x3339, category='so', description='SQUARE HERUTU', specials={'square',0x30D8,0x30EB,0x30C4} }, + [0x333A] = { unicodeslot=0x333A, category='so', description='SQUARE PENSU', specials={'square',0x30DA,0x30F3,0x30B9} }, + [0x333B] = { unicodeslot=0x333B, category='so', description='SQUARE PEEZI', specials={'square',0x30DA,0x30FC,0x30B8} }, + [0x333C] = { unicodeslot=0x333C, category='so', description='SQUARE BEETA', specials={'square',0x30D9,0x30FC,0x30BF} }, + [0x333D] = { unicodeslot=0x333D, category='so', description='SQUARE POINTO', specials={'square',0x30DD,0x30A4,0x30F3,0x30C8} }, + [0x333E] = { unicodeslot=0x333E, category='so', description='SQUARE BORUTO', specials={'square',0x30DC,0x30EB,0x30C8} }, + [0x333F] = { unicodeslot=0x333F, category='so', description='SQUARE HON', specials={'square',0x30DB,0x30F3} }, + [0x3340] = { unicodeslot=0x3340, category='so', description='SQUARE PONDO', specials={'square',0x30DD,0x30F3,0x30C9} }, + [0x3341] = { unicodeslot=0x3341, category='so', description='SQUARE HOORU', specials={'square',0x30DB,0x30FC,0x30EB} }, + [0x3342] = { unicodeslot=0x3342, category='so', description='SQUARE HOON', specials={'square',0x30DB,0x30FC,0x30F3} }, + [0x3343] = { unicodeslot=0x3343, category='so', description='SQUARE MAIKURO', specials={'square',0x30DE,0x30A4,0x30AF,0x30ED} }, + [0x3344] = { unicodeslot=0x3344, category='so', description='SQUARE MAIRU', specials={'square',0x30DE,0x30A4,0x30EB} }, + [0x3345] = { unicodeslot=0x3345, category='so', description='SQUARE MAHHA', specials={'square',0x30DE,0x30C3,0x30CF} }, + [0x3346] = { unicodeslot=0x3346, category='so', description='SQUARE MARUKU', specials={'square',0x30DE,0x30EB,0x30AF} }, + [0x3347] = { unicodeslot=0x3347, category='so', description='SQUARE MANSYON', specials={'square',0x30DE,0x30F3,0x30B7,0x30E7,0x30F3} }, + [0x3348] = { unicodeslot=0x3348, category='so', description='SQUARE MIKURON', specials={'square',0x30DF,0x30AF,0x30ED,0x30F3} }, + [0x3349] = { unicodeslot=0x3349, category='so', description='SQUARE MIRI', specials={'square',0x30DF,0x30EA} }, + [0x334A] = { unicodeslot=0x334A, category='so', description='SQUARE MIRIBAARU', specials={'square',0x30DF,0x30EA,0x30D0,0x30FC,0x30EB} }, + [0x334B] = { unicodeslot=0x334B, category='so', description='SQUARE MEGA', specials={'square',0x30E1,0x30AC} }, + [0x334C] = { unicodeslot=0x334C, category='so', description='SQUARE MEGATON', specials={'square',0x30E1,0x30AC,0x30C8,0x30F3} }, + [0x334D] = { unicodeslot=0x334D, category='so', description='SQUARE MEETORU', specials={'square',0x30E1,0x30FC,0x30C8,0x30EB} }, + [0x334E] = { unicodeslot=0x334E, category='so', description='SQUARE YAADO', specials={'square',0x30E4,0x30FC,0x30C9} }, + [0x334F] = { unicodeslot=0x334F, category='so', description='SQUARE YAARU', specials={'square',0x30E4,0x30FC,0x30EB} }, + [0x3350] = { unicodeslot=0x3350, category='so', description='SQUARE YUAN', specials={'square',0x30E6,0x30A2,0x30F3} }, + [0x3351] = { unicodeslot=0x3351, category='so', description='SQUARE RITTORU', specials={'square',0x30EA,0x30C3,0x30C8,0x30EB} }, + [0x3352] = { unicodeslot=0x3352, category='so', description='SQUARE RIRA', specials={'square',0x30EA,0x30E9} }, + [0x3353] = { unicodeslot=0x3353, category='so', description='SQUARE RUPII', specials={'square',0x30EB,0x30D4,0x30FC} }, + [0x3354] = { unicodeslot=0x3354, category='so', description='SQUARE RUUBURU', specials={'square',0x30EB,0x30FC,0x30D6,0x30EB} }, + [0x3355] = { unicodeslot=0x3355, category='so', description='SQUARE REMU', specials={'square',0x30EC,0x30E0} }, + [0x3356] = { unicodeslot=0x3356, category='so', description='SQUARE RENTOGEN', specials={'square',0x30EC,0x30F3,0x30C8,0x30B2,0x30F3} }, + [0x3357] = { unicodeslot=0x3357, category='so', description='SQUARE WATTO', specials={'square',0x30EF,0x30C3,0x30C8} }, + [0x3358] = { unicodeslot=0x3358, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ZERO', specials={'compat',0x0030,0x70B9} }, + [0x3359] = { unicodeslot=0x3359, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ONE', specials={'compat',0x0031,0x70B9} }, + [0x335A] = { unicodeslot=0x335A, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWO', specials={'compat',0x0032,0x70B9} }, + [0x335B] = { unicodeslot=0x335B, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THREE', specials={'compat',0x0033,0x70B9} }, + [0x335C] = { unicodeslot=0x335C, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOUR', specials={'compat',0x0034,0x70B9} }, + [0x335D] = { unicodeslot=0x335D, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIVE', specials={'compat',0x0035,0x70B9} }, + [0x335E] = { unicodeslot=0x335E, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIX', specials={'compat',0x0036,0x70B9} }, + [0x335F] = { unicodeslot=0x335F, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVEN', specials={'compat',0x0037,0x70B9} }, + [0x3360] = { unicodeslot=0x3360, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHT', specials={'compat',0x0038,0x70B9} }, + [0x3361] = { unicodeslot=0x3361, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINE', specials={'compat',0x0039,0x70B9} }, + [0x3362] = { unicodeslot=0x3362, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TEN', specials={'compat',0x0031,0x0030,0x70B9} }, + [0x3363] = { unicodeslot=0x3363, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR ELEVEN', specials={'compat',0x0031,0x0031,0x70B9} }, + [0x3364] = { unicodeslot=0x3364, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWELVE', specials={'compat',0x0031,0x0032,0x70B9} }, + [0x3365] = { unicodeslot=0x3365, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR THIRTEEN', specials={'compat',0x0031,0x0033,0x70B9} }, + [0x3366] = { unicodeslot=0x3366, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FOURTEEN', specials={'compat',0x0031,0x0034,0x70B9} }, + [0x3367] = { unicodeslot=0x3367, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR FIFTEEN', specials={'compat',0x0031,0x0035,0x70B9} }, + [0x3368] = { unicodeslot=0x3368, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SIXTEEN', specials={'compat',0x0031,0x0036,0x70B9} }, + [0x3369] = { unicodeslot=0x3369, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR SEVENTEEN', specials={'compat',0x0031,0x0037,0x70B9} }, + [0x336A] = { unicodeslot=0x336A, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR EIGHTEEN', specials={'compat',0x0031,0x0038,0x70B9} }, + [0x336B] = { unicodeslot=0x336B, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR NINETEEN', specials={'compat',0x0031,0x0039,0x70B9} }, + [0x336C] = { unicodeslot=0x336C, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY', specials={'compat',0x0032,0x0030,0x70B9} }, + [0x336D] = { unicodeslot=0x336D, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-ONE', specials={'compat',0x0032,0x0031,0x70B9} }, + [0x336E] = { unicodeslot=0x336E, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-TWO', specials={'compat',0x0032,0x0032,0x70B9} }, + [0x336F] = { unicodeslot=0x336F, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-THREE', specials={'compat',0x0032,0x0033,0x70B9} }, + [0x3370] = { unicodeslot=0x3370, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR HOUR TWENTY-FOUR', specials={'compat',0x0032,0x0034,0x70B9} }, + [0x3371] = { unicodeslot=0x3371, category='so', description='SQUARE HPA', specials={'square',0x0068,0x0050,0x0061} }, + [0x3372] = { unicodeslot=0x3372, category='so', description='SQUARE DA', specials={'square',0x0064,0x0061} }, + [0x3373] = { unicodeslot=0x3373, category='so', description='SQUARE AU', specials={'square',0x0041,0x0055} }, + [0x3374] = { unicodeslot=0x3374, category='so', description='SQUARE BAR', specials={'square',0x0062,0x0061,0x0072} }, + [0x3375] = { unicodeslot=0x3375, category='so', description='SQUARE OV', specials={'square',0x006F,0x0056} }, + [0x3376] = { unicodeslot=0x3376, category='so', description='SQUARE PC', specials={'square',0x0070,0x0063} }, + [0x3377] = { unicodeslot=0x3377, category='so', description='SQUARE DM', specials={'square',0x0064,0x006D} }, + [0x3378] = { unicodeslot=0x3378, category='so', description='SQUARE DM SQUARED', specials={'square',0x0064,0x006D,0x00B2} }, + [0x3379] = { unicodeslot=0x3379, category='so', description='SQUARE DM CUBED', specials={'square',0x0064,0x006D,0x00B3} }, + [0x337A] = { unicodeslot=0x337A, category='so', description='SQUARE IU', specials={'square',0x0049,0x0055} }, + [0x337B] = { unicodeslot=0x337B, category='so', description='SQUARE ERA NAME HEISEI', specials={'square',0x5E73,0x6210} }, + [0x337C] = { unicodeslot=0x337C, category='so', description='SQUARE ERA NAME SYOUWA', specials={'square',0x662D,0x548C} }, + [0x337D] = { unicodeslot=0x337D, category='so', description='SQUARE ERA NAME TAISYOU', specials={'square',0x5927,0x6B63} }, + [0x337E] = { unicodeslot=0x337E, category='so', description='SQUARE ERA NAME MEIZI', specials={'square',0x660E,0x6CBB} }, + [0x337F] = { unicodeslot=0x337F, category='so', description='SQUARE CORPORATION', specials={'square',0x682A,0x5F0F,0x4F1A,0x793E} }, + [0x3380] = { unicodeslot=0x3380, category='so', description='SQUARE PA AMPS', specials={'square',0x0070,0x0041} }, + [0x3381] = { unicodeslot=0x3381, category='so', description='SQUARE NA', specials={'square',0x006E,0x0041} }, + [0x3382] = { unicodeslot=0x3382, category='so', description='SQUARE MU A', specials={'square',0x03BC,0x0041} }, + [0x3383] = { unicodeslot=0x3383, category='so', description='SQUARE MA', specials={'square',0x006D,0x0041} }, + [0x3384] = { unicodeslot=0x3384, category='so', description='SQUARE KA', specials={'square',0x006B,0x0041} }, + [0x3385] = { unicodeslot=0x3385, category='so', description='SQUARE KB', specials={'square',0x004B,0x0042} }, + [0x3386] = { unicodeslot=0x3386, category='so', description='SQUARE MB', specials={'square',0x004D,0x0042} }, + [0x3387] = { unicodeslot=0x3387, category='so', description='SQUARE GB', specials={'square',0x0047,0x0042} }, + [0x3388] = { unicodeslot=0x3388, category='so', description='SQUARE CAL', specials={'square',0x0063,0x0061,0x006C} }, + [0x3389] = { unicodeslot=0x3389, category='so', description='SQUARE KCAL', specials={'square',0x006B,0x0063,0x0061,0x006C} }, + [0x338A] = { unicodeslot=0x338A, category='so', description='SQUARE PF', specials={'square',0x0070,0x0046} }, + [0x338B] = { unicodeslot=0x338B, category='so', description='SQUARE NF', specials={'square',0x006E,0x0046} }, + [0x338C] = { unicodeslot=0x338C, category='so', description='SQUARE MU F', specials={'square',0x03BC,0x0046} }, + [0x338D] = { unicodeslot=0x338D, category='so', description='SQUARE MU G', specials={'square',0x03BC,0x0067} }, + [0x338E] = { unicodeslot=0x338E, category='so', description='SQUARE MG', specials={'square',0x006D,0x0067} }, + [0x338F] = { unicodeslot=0x338F, category='so', description='SQUARE KG', specials={'square',0x006B,0x0067} }, + [0x3390] = { unicodeslot=0x3390, category='so', description='SQUARE HZ', specials={'square',0x0048,0x007A} }, + [0x3391] = { unicodeslot=0x3391, category='so', description='SQUARE KHZ', specials={'square',0x006B,0x0048,0x007A} }, + [0x3392] = { unicodeslot=0x3392, category='so', description='SQUARE MHZ', specials={'square',0x004D,0x0048,0x007A} }, + [0x3393] = { unicodeslot=0x3393, category='so', description='SQUARE GHZ', specials={'square',0x0047,0x0048,0x007A} }, + [0x3394] = { unicodeslot=0x3394, category='so', description='SQUARE THZ', specials={'square',0x0054,0x0048,0x007A} }, + [0x3395] = { unicodeslot=0x3395, category='so', description='SQUARE MU L', specials={'square',0x03BC,0x2113} }, + [0x3396] = { unicodeslot=0x3396, category='so', description='SQUARE ML', specials={'square',0x006D,0x2113} }, + [0x3397] = { unicodeslot=0x3397, category='so', description='SQUARE DL', specials={'square',0x0064,0x2113} }, + [0x3398] = { unicodeslot=0x3398, category='so', description='SQUARE KL', specials={'square',0x006B,0x2113} }, + [0x3399] = { unicodeslot=0x3399, category='so', description='SQUARE FM', specials={'square',0x0066,0x006D} }, + [0x339A] = { unicodeslot=0x339A, category='so', description='SQUARE NM', specials={'square',0x006E,0x006D} }, + [0x339B] = { unicodeslot=0x339B, category='so', description='SQUARE MU M', specials={'square',0x03BC,0x006D} }, + [0x339C] = { unicodeslot=0x339C, category='so', description='SQUARE MM', specials={'square',0x006D,0x006D} }, + [0x339D] = { unicodeslot=0x339D, category='so', description='SQUARE CM', specials={'square',0x0063,0x006D} }, + [0x339E] = { unicodeslot=0x339E, category='so', description='SQUARE KM', specials={'square',0x006B,0x006D} }, + [0x339F] = { unicodeslot=0x339F, category='so', description='SQUARE MM SQUARED', specials={'square',0x006D,0x006D,0x00B2} }, + [0x33A0] = { unicodeslot=0x33A0, category='so', description='SQUARE CM SQUARED', specials={'square',0x0063,0x006D,0x00B2} }, + [0x33A1] = { unicodeslot=0x33A1, category='so', description='SQUARE M SQUARED', specials={'square',0x006D,0x00B2} }, + [0x33A2] = { unicodeslot=0x33A2, category='so', description='SQUARE KM SQUARED', specials={'square',0x006B,0x006D,0x00B2} }, + [0x33A3] = { unicodeslot=0x33A3, category='so', description='SQUARE MM CUBED', specials={'square',0x006D,0x006D,0x00B3} }, + [0x33A4] = { unicodeslot=0x33A4, category='so', description='SQUARE CM CUBED', specials={'square',0x0063,0x006D,0x00B3} }, + [0x33A5] = { unicodeslot=0x33A5, category='so', description='SQUARE M CUBED', specials={'square',0x006D,0x00B3} }, + [0x33A6] = { unicodeslot=0x33A6, category='so', description='SQUARE KM CUBED', specials={'square',0x006B,0x006D,0x00B3} }, + [0x33A7] = { unicodeslot=0x33A7, category='so', description='SQUARE M OVER S', specials={'square',0x006D,0x2215,0x0073} }, + [0x33A8] = { unicodeslot=0x33A8, category='so', description='SQUARE M OVER S SQUARED', specials={'square',0x006D,0x2215,0x0073,0x00B2} }, + [0x33A9] = { unicodeslot=0x33A9, category='so', description='SQUARE PA', specials={'square',0x0050,0x0061} }, + [0x33AA] = { unicodeslot=0x33AA, category='so', description='SQUARE KPA', specials={'square',0x006B,0x0050,0x0061} }, + [0x33AB] = { unicodeslot=0x33AB, category='so', description='SQUARE MPA', specials={'square',0x004D,0x0050,0x0061} }, + [0x33AC] = { unicodeslot=0x33AC, category='so', description='SQUARE GPA', specials={'square',0x0047,0x0050,0x0061} }, + [0x33AD] = { unicodeslot=0x33AD, category='so', description='SQUARE RAD', specials={'square',0x0072,0x0061,0x0064} }, + [0x33AE] = { unicodeslot=0x33AE, category='so', description='SQUARE RAD OVER S', specials={'square',0x0072,0x0061,0x0064,0x2215,0x0073} }, + [0x33AF] = { unicodeslot=0x33AF, category='so', description='SQUARE RAD OVER S SQUARED', specials={'square',0x0072,0x0061,0x0064,0x2215,0x0073,0x00B2} }, + [0x33B0] = { unicodeslot=0x33B0, category='so', description='SQUARE PS', specials={'square',0x0070,0x0073} }, + [0x33B1] = { unicodeslot=0x33B1, category='so', description='SQUARE NS', specials={'square',0x006E,0x0073} }, + [0x33B2] = { unicodeslot=0x33B2, category='so', description='SQUARE MU S', specials={'square',0x03BC,0x0073} }, + [0x33B3] = { unicodeslot=0x33B3, category='so', description='SQUARE MS', specials={'square',0x006D,0x0073} }, + [0x33B4] = { unicodeslot=0x33B4, category='so', description='SQUARE PV', specials={'square',0x0070,0x0056} }, + [0x33B5] = { unicodeslot=0x33B5, category='so', description='SQUARE NV', specials={'square',0x006E,0x0056} }, + [0x33B6] = { unicodeslot=0x33B6, category='so', description='SQUARE MU V', specials={'square',0x03BC,0x0056} }, + [0x33B7] = { unicodeslot=0x33B7, category='so', description='SQUARE MV', specials={'square',0x006D,0x0056} }, + [0x33B8] = { unicodeslot=0x33B8, category='so', description='SQUARE KV', specials={'square',0x006B,0x0056} }, + [0x33B9] = { unicodeslot=0x33B9, category='so', description='SQUARE MV MEGA', specials={'square',0x004D,0x0056} }, + [0x33BA] = { unicodeslot=0x33BA, category='so', description='SQUARE PW', specials={'square',0x0070,0x0057} }, + [0x33BB] = { unicodeslot=0x33BB, category='so', description='SQUARE NW', specials={'square',0x006E,0x0057} }, + [0x33BC] = { unicodeslot=0x33BC, category='so', description='SQUARE MU W', specials={'square',0x03BC,0x0057} }, + [0x33BD] = { unicodeslot=0x33BD, category='so', description='SQUARE MW', specials={'square',0x006D,0x0057} }, + [0x33BE] = { unicodeslot=0x33BE, category='so', description='SQUARE KW', specials={'square',0x006B,0x0057} }, + [0x33BF] = { unicodeslot=0x33BF, category='so', description='SQUARE MW MEGA', specials={'square',0x004D,0x0057} }, + [0x33C0] = { unicodeslot=0x33C0, category='so', description='SQUARE K OHM', specials={'square',0x006B,0x03A9} }, + [0x33C1] = { unicodeslot=0x33C1, category='so', description='SQUARE M OHM', specials={'square',0x004D,0x03A9} }, + [0x33C2] = { unicodeslot=0x33C2, category='so', description='SQUARE AM', specials={'square',0x0061,0x002E,0x006D,0x002E} }, + [0x33C3] = { unicodeslot=0x33C3, category='so', description='SQUARE BQ', specials={'square',0x0042,0x0071} }, + [0x33C4] = { unicodeslot=0x33C4, category='so', description='SQUARE CC', specials={'square',0x0063,0x0063} }, + [0x33C5] = { unicodeslot=0x33C5, category='so', description='SQUARE CD', specials={'square',0x0063,0x0064} }, + [0x33C6] = { unicodeslot=0x33C6, category='so', description='SQUARE C OVER KG', specials={'square',0x0043,0x2215,0x006B,0x0067} }, + [0x33C7] = { unicodeslot=0x33C7, category='so', description='SQUARE CO', specials={'square',0x0043,0x006F,0x002E} }, + [0x33C8] = { unicodeslot=0x33C8, category='so', description='SQUARE DB', specials={'square',0x0064,0x0042} }, + [0x33C9] = { unicodeslot=0x33C9, category='so', description='SQUARE GY', specials={'square',0x0047,0x0079} }, + [0x33CA] = { unicodeslot=0x33CA, category='so', description='SQUARE HA', specials={'square',0x0068,0x0061} }, + [0x33CB] = { unicodeslot=0x33CB, category='so', description='SQUARE HP', specials={'square',0x0048,0x0050} }, + [0x33CC] = { unicodeslot=0x33CC, category='so', description='SQUARE IN', specials={'square',0x0069,0x006E} }, + [0x33CD] = { unicodeslot=0x33CD, category='so', description='SQUARE KK', specials={'square',0x004B,0x004B} }, + [0x33CE] = { unicodeslot=0x33CE, category='so', description='SQUARE KM CAPITAL', specials={'square',0x004B,0x004D} }, + [0x33CF] = { unicodeslot=0x33CF, category='so', description='SQUARE KT', specials={'square',0x006B,0x0074} }, + [0x33D0] = { unicodeslot=0x33D0, category='so', description='SQUARE LM', specials={'square',0x006C,0x006D} }, + [0x33D1] = { unicodeslot=0x33D1, category='so', description='SQUARE LN', specials={'square',0x006C,0x006E} }, + [0x33D2] = { unicodeslot=0x33D2, category='so', description='SQUARE LOG', specials={'square',0x006C,0x006F,0x0067} }, + [0x33D3] = { unicodeslot=0x33D3, category='so', description='SQUARE LX', specials={'square',0x006C,0x0078} }, + [0x33D4] = { unicodeslot=0x33D4, category='so', description='SQUARE MB SMALL', specials={'square',0x006D,0x0062} }, + [0x33D5] = { unicodeslot=0x33D5, category='so', description='SQUARE MIL', specials={'square',0x006D,0x0069,0x006C} }, + [0x33D6] = { unicodeslot=0x33D6, category='so', description='SQUARE MOL', specials={'square',0x006D,0x006F,0x006C} }, + [0x33D7] = { unicodeslot=0x33D7, category='so', description='SQUARE PH', specials={'square',0x0050,0x0048} }, + [0x33D8] = { unicodeslot=0x33D8, category='so', description='SQUARE PM', specials={'square',0x0070,0x002E,0x006D,0x002E} }, + [0x33D9] = { unicodeslot=0x33D9, category='so', description='SQUARE PPM', specials={'square',0x0050,0x0050,0x004D} }, + [0x33DA] = { unicodeslot=0x33DA, category='so', description='SQUARE PR', specials={'square',0x0050,0x0052} }, + [0x33DB] = { unicodeslot=0x33DB, category='so', description='SQUARE SR', specials={'square',0x0073,0x0072} }, + [0x33DC] = { unicodeslot=0x33DC, category='so', description='SQUARE SV', specials={'square',0x0053,0x0076} }, + [0x33DD] = { unicodeslot=0x33DD, category='so', description='SQUARE WB', specials={'square',0x0057,0x0062} }, + [0x33DE] = { unicodeslot=0x33DE, category='so', description='SQUARE V OVER M', specials={'square',0x0056,0x2215,0x006D} }, + [0x33DF] = { unicodeslot=0x33DF, category='so', description='SQUARE A OVER M', specials={'square',0x0041,0x2215,0x006D} }, + [0x33E0] = { unicodeslot=0x33E0, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ONE', specials={'compat',0x0031,0x65E5} }, + [0x33E1] = { unicodeslot=0x33E1, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWO', specials={'compat',0x0032,0x65E5} }, + [0x33E2] = { unicodeslot=0x33E2, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THREE', specials={'compat',0x0033,0x65E5} }, + [0x33E3] = { unicodeslot=0x33E3, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOUR', specials={'compat',0x0034,0x65E5} }, + [0x33E4] = { unicodeslot=0x33E4, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIVE', specials={'compat',0x0035,0x65E5} }, + [0x33E5] = { unicodeslot=0x33E5, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIX', specials={'compat',0x0036,0x65E5} }, + [0x33E6] = { unicodeslot=0x33E6, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVEN', specials={'compat',0x0037,0x65E5} }, + [0x33E7] = { unicodeslot=0x33E7, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHT', specials={'compat',0x0038,0x65E5} }, + [0x33E8] = { unicodeslot=0x33E8, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINE', specials={'compat',0x0039,0x65E5} }, + [0x33E9] = { unicodeslot=0x33E9, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TEN', specials={'compat',0x0031,0x0030,0x65E5} }, + [0x33EA] = { unicodeslot=0x33EA, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY ELEVEN', specials={'compat',0x0031,0x0031,0x65E5} }, + [0x33EB] = { unicodeslot=0x33EB, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWELVE', specials={'compat',0x0031,0x0032,0x65E5} }, + [0x33EC] = { unicodeslot=0x33EC, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTEEN', specials={'compat',0x0031,0x0033,0x65E5} }, + [0x33ED] = { unicodeslot=0x33ED, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FOURTEEN', specials={'compat',0x0031,0x0034,0x65E5} }, + [0x33EE] = { unicodeslot=0x33EE, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY FIFTEEN', specials={'compat',0x0031,0x0035,0x65E5} }, + [0x33EF] = { unicodeslot=0x33EF, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SIXTEEN', specials={'compat',0x0031,0x0036,0x65E5} }, + [0x33F0] = { unicodeslot=0x33F0, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY SEVENTEEN', specials={'compat',0x0031,0x0037,0x65E5} }, + [0x33F1] = { unicodeslot=0x33F1, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY EIGHTEEN', specials={'compat',0x0031,0x0038,0x65E5} }, + [0x33F2] = { unicodeslot=0x33F2, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY NINETEEN', specials={'compat',0x0031,0x0039,0x65E5} }, + [0x33F3] = { unicodeslot=0x33F3, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY', specials={'compat',0x0032,0x0030,0x65E5} }, + [0x33F4] = { unicodeslot=0x33F4, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-ONE', specials={'compat',0x0032,0x0031,0x65E5} }, + [0x33F5] = { unicodeslot=0x33F5, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-TWO', specials={'compat',0x0032,0x0032,0x65E5} }, + [0x33F6] = { unicodeslot=0x33F6, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-THREE', specials={'compat',0x0032,0x0033,0x65E5} }, + [0x33F7] = { unicodeslot=0x33F7, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FOUR', specials={'compat',0x0032,0x0034,0x65E5} }, + [0x33F8] = { unicodeslot=0x33F8, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-FIVE', specials={'compat',0x0032,0x0035,0x65E5} }, + [0x33F9] = { unicodeslot=0x33F9, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SIX', specials={'compat',0x0032,0x0036,0x65E5} }, + [0x33FA] = { unicodeslot=0x33FA, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-SEVEN', specials={'compat',0x0032,0x0037,0x65E5} }, + [0x33FB] = { unicodeslot=0x33FB, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-EIGHT', specials={'compat',0x0032,0x0038,0x65E5} }, + [0x33FC] = { unicodeslot=0x33FC, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY TWENTY-NINE', specials={'compat',0x0032,0x0039,0x65E5} }, + [0x33FD] = { unicodeslot=0x33FD, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY', specials={'compat',0x0033,0x0030,0x65E5} }, + [0x33FE] = { unicodeslot=0x33FE, category='so', description='IDEOGRAPHIC TELEGRAPH SYMBOL FOR DAY THIRTY-ONE', specials={'compat',0x0033,0x0031,0x65E5} }, + [0x33FF] = { unicodeslot=0x33FF, category='so', description='SQUARE GAL', specials={'square',0x0067,0x0061,0x006C} }, + [0x3400] = { unicodeslot=0x3400, category='lo', description='' }, + [0x4DB5] = { unicodeslot=0x4DB5, category='lo', description='' }, + [0x4DC0] = { unicodeslot=0x4DC0, category='so', description='HEXAGRAM FOR THE CREATIVE HEAVEN' }, + [0x4DC1] = { unicodeslot=0x4DC1, category='so', description='HEXAGRAM FOR THE RECEPTIVE EARTH' }, + [0x4DC2] = { unicodeslot=0x4DC2, category='so', description='HEXAGRAM FOR DIFFICULTY AT THE BEGINNING' }, + [0x4DC3] = { unicodeslot=0x4DC3, category='so', description='HEXAGRAM FOR YOUTHFUL FOLLY' }, + [0x4DC4] = { unicodeslot=0x4DC4, category='so', description='HEXAGRAM FOR WAITING' }, + [0x4DC5] = { unicodeslot=0x4DC5, category='so', description='HEXAGRAM FOR CONFLICT' }, + [0x4DC6] = { unicodeslot=0x4DC6, category='so', description='HEXAGRAM FOR THE ARMY' }, + [0x4DC7] = { unicodeslot=0x4DC7, category='so', description='HEXAGRAM FOR HOLDING TOGETHER' }, + [0x4DC8] = { unicodeslot=0x4DC8, category='so', description='HEXAGRAM FOR SMALL TAMING' }, + [0x4DC9] = { unicodeslot=0x4DC9, category='so', description='HEXAGRAM FOR TREADING' }, + [0x4DCA] = { unicodeslot=0x4DCA, category='so', description='HEXAGRAM FOR PEACE' }, + [0x4DCB] = { unicodeslot=0x4DCB, category='so', description='HEXAGRAM FOR STANDSTILL' }, + [0x4DCC] = { unicodeslot=0x4DCC, category='so', description='HEXAGRAM FOR FELLOWSHIP' }, + [0x4DCD] = { unicodeslot=0x4DCD, category='so', description='HEXAGRAM FOR GREAT POSSESSION' }, + [0x4DCE] = { unicodeslot=0x4DCE, category='so', description='HEXAGRAM FOR MODESTY' }, + [0x4DCF] = { unicodeslot=0x4DCF, category='so', description='HEXAGRAM FOR ENTHUSIASM' }, + [0x4DD0] = { unicodeslot=0x4DD0, category='so', description='HEXAGRAM FOR FOLLOWING' }, + [0x4DD1] = { unicodeslot=0x4DD1, category='so', description='HEXAGRAM FOR WORK ON THE DECAYED' }, + [0x4DD2] = { unicodeslot=0x4DD2, category='so', description='HEXAGRAM FOR APPROACH' }, + [0x4DD3] = { unicodeslot=0x4DD3, category='so', description='HEXAGRAM FOR CONTEMPLATION' }, + [0x4DD4] = { unicodeslot=0x4DD4, category='so', description='HEXAGRAM FOR BITING THROUGH' }, + [0x4DD5] = { unicodeslot=0x4DD5, category='so', description='HEXAGRAM FOR GRACE' }, + [0x4DD6] = { unicodeslot=0x4DD6, category='so', description='HEXAGRAM FOR SPLITTING APART' }, + [0x4DD7] = { unicodeslot=0x4DD7, category='so', description='HEXAGRAM FOR RETURN' }, + [0x4DD8] = { unicodeslot=0x4DD8, category='so', description='HEXAGRAM FOR INNOCENCE' }, + [0x4DD9] = { unicodeslot=0x4DD9, category='so', description='HEXAGRAM FOR GREAT TAMING' }, + [0x4DDA] = { unicodeslot=0x4DDA, category='so', description='HEXAGRAM FOR MOUTH CORNERS' }, + [0x4DDB] = { unicodeslot=0x4DDB, category='so', description='HEXAGRAM FOR GREAT PREPONDERANCE' }, + [0x4DDC] = { unicodeslot=0x4DDC, category='so', description='HEXAGRAM FOR THE ABYSMAL WATER' }, + [0x4DDD] = { unicodeslot=0x4DDD, category='so', description='HEXAGRAM FOR THE CLINGING FIRE' }, + [0x4DDE] = { unicodeslot=0x4DDE, category='so', description='HEXAGRAM FOR INFLUENCE' }, + [0x4DDF] = { unicodeslot=0x4DDF, category='so', description='HEXAGRAM FOR DURATION' }, + [0x4DE0] = { unicodeslot=0x4DE0, category='so', description='HEXAGRAM FOR RETREAT' }, + [0x4DE1] = { unicodeslot=0x4DE1, category='so', description='HEXAGRAM FOR GREAT POWER' }, + [0x4DE2] = { unicodeslot=0x4DE2, category='so', description='HEXAGRAM FOR PROGRESS' }, + [0x4DE3] = { unicodeslot=0x4DE3, category='so', description='HEXAGRAM FOR DARKENING OF THE LIGHT' }, + [0x4DE4] = { unicodeslot=0x4DE4, category='so', description='HEXAGRAM FOR THE FAMILY' }, + [0x4DE5] = { unicodeslot=0x4DE5, category='so', description='HEXAGRAM FOR OPPOSITION' }, + [0x4DE6] = { unicodeslot=0x4DE6, category='so', description='HEXAGRAM FOR OBSTRUCTION' }, + [0x4DE7] = { unicodeslot=0x4DE7, category='so', description='HEXAGRAM FOR DELIVERANCE' }, + [0x4DE8] = { unicodeslot=0x4DE8, category='so', description='HEXAGRAM FOR DECREASE' }, + [0x4DE9] = { unicodeslot=0x4DE9, category='so', description='HEXAGRAM FOR INCREASE' }, + [0x4DEA] = { unicodeslot=0x4DEA, category='so', description='HEXAGRAM FOR BREAKTHROUGH' }, + [0x4DEB] = { unicodeslot=0x4DEB, category='so', description='HEXAGRAM FOR COMING TO MEET' }, + [0x4DEC] = { unicodeslot=0x4DEC, category='so', description='HEXAGRAM FOR GATHERING TOGETHER' }, + [0x4DED] = { unicodeslot=0x4DED, category='so', description='HEXAGRAM FOR PUSHING UPWARD' }, + [0x4DEE] = { unicodeslot=0x4DEE, category='so', description='HEXAGRAM FOR OPPRESSION' }, + [0x4DEF] = { unicodeslot=0x4DEF, category='so', description='HEXAGRAM FOR THE WELL' }, + [0x4DF0] = { unicodeslot=0x4DF0, category='so', description='HEXAGRAM FOR REVOLUTION' }, + [0x4DF1] = { unicodeslot=0x4DF1, category='so', description='HEXAGRAM FOR THE CAULDRON' }, + [0x4DF2] = { unicodeslot=0x4DF2, category='so', description='HEXAGRAM FOR THE AROUSING THUNDER' }, + [0x4DF3] = { unicodeslot=0x4DF3, category='so', description='HEXAGRAM FOR THE KEEPING STILL MOUNTAIN' }, + [0x4DF4] = { unicodeslot=0x4DF4, category='so', description='HEXAGRAM FOR DEVELOPMENT' }, + [0x4DF5] = { unicodeslot=0x4DF5, category='so', description='HEXAGRAM FOR THE MARRYING MAIDEN' }, + [0x4DF6] = { unicodeslot=0x4DF6, category='so', description='HEXAGRAM FOR ABUNDANCE' }, + [0x4DF7] = { unicodeslot=0x4DF7, category='so', description='HEXAGRAM FOR THE WANDERER' }, + [0x4DF8] = { unicodeslot=0x4DF8, category='so', description='HEXAGRAM FOR THE GENTLE WIND' }, + [0x4DF9] = { unicodeslot=0x4DF9, category='so', description='HEXAGRAM FOR THE JOYOUS LAKE' }, + [0x4DFA] = { unicodeslot=0x4DFA, category='so', description='HEXAGRAM FOR DISPERSION' }, + [0x4DFB] = { unicodeslot=0x4DFB, category='so', description='HEXAGRAM FOR LIMITATION' }, + [0x4DFC] = { unicodeslot=0x4DFC, category='so', description='HEXAGRAM FOR INNER TRUTH' }, + [0x4DFD] = { unicodeslot=0x4DFD, category='so', description='HEXAGRAM FOR SMALL PREPONDERANCE' }, + [0x4DFE] = { unicodeslot=0x4DFE, category='so', description='HEXAGRAM FOR AFTER COMPLETION' }, + [0x4DFF] = { unicodeslot=0x4DFF, category='so', description='HEXAGRAM FOR BEFORE COMPLETION' }, + [0x4E00] = { unicodeslot=0x4E00, category='lo', description='' }, + [0x9FBB] = { unicodeslot=0x9FBB, category='lo', description='' }, + [0xA000] = { unicodeslot=0xA000, category='lo', description='YI SYLLABLE IT' }, + [0xA001] = { unicodeslot=0xA001, category='lo', description='YI SYLLABLE IX' }, + [0xA002] = { unicodeslot=0xA002, category='lo', description='YI SYLLABLE I' }, + [0xA003] = { unicodeslot=0xA003, category='lo', description='YI SYLLABLE IP' }, + [0xA004] = { unicodeslot=0xA004, category='lo', description='YI SYLLABLE IET' }, + [0xA005] = { unicodeslot=0xA005, category='lo', description='YI SYLLABLE IEX' }, + [0xA006] = { unicodeslot=0xA006, category='lo', description='YI SYLLABLE IE' }, + [0xA007] = { unicodeslot=0xA007, category='lo', description='YI SYLLABLE IEP' }, + [0xA008] = { unicodeslot=0xA008, category='lo', description='YI SYLLABLE AT' }, + [0xA009] = { unicodeslot=0xA009, category='lo', description='YI SYLLABLE AX' }, + [0xA00A] = { unicodeslot=0xA00A, category='lo', description='YI SYLLABLE A' }, + [0xA00B] = { unicodeslot=0xA00B, category='lo', description='YI SYLLABLE AP' }, + [0xA00C] = { unicodeslot=0xA00C, category='lo', description='YI SYLLABLE UOX' }, + [0xA00D] = { unicodeslot=0xA00D, category='lo', description='YI SYLLABLE UO' }, + [0xA00E] = { unicodeslot=0xA00E, category='lo', description='YI SYLLABLE UOP' }, + [0xA00F] = { unicodeslot=0xA00F, category='lo', description='YI SYLLABLE OT' }, + [0xA010] = { unicodeslot=0xA010, category='lo', description='YI SYLLABLE OX' }, + [0xA011] = { unicodeslot=0xA011, category='lo', description='YI SYLLABLE O' }, + [0xA012] = { unicodeslot=0xA012, category='lo', description='YI SYLLABLE OP' }, + [0xA013] = { unicodeslot=0xA013, category='lo', description='YI SYLLABLE EX' }, + [0xA014] = { unicodeslot=0xA014, category='lo', description='YI SYLLABLE E' }, + [0xA015] = { unicodeslot=0xA015, category='lm', description='YI SYLLABLE WU' }, + [0xA016] = { unicodeslot=0xA016, category='lo', description='YI SYLLABLE BIT' }, + [0xA017] = { unicodeslot=0xA017, category='lo', description='YI SYLLABLE BIX' }, + [0xA018] = { unicodeslot=0xA018, category='lo', description='YI SYLLABLE BI' }, + [0xA019] = { unicodeslot=0xA019, category='lo', description='YI SYLLABLE BIP' }, + [0xA01A] = { unicodeslot=0xA01A, category='lo', description='YI SYLLABLE BIET' }, + [0xA01B] = { unicodeslot=0xA01B, category='lo', description='YI SYLLABLE BIEX' }, + [0xA01C] = { unicodeslot=0xA01C, category='lo', description='YI SYLLABLE BIE' }, + [0xA01D] = { unicodeslot=0xA01D, category='lo', description='YI SYLLABLE BIEP' }, + [0xA01E] = { unicodeslot=0xA01E, category='lo', description='YI SYLLABLE BAT' }, + [0xA01F] = { unicodeslot=0xA01F, category='lo', description='YI SYLLABLE BAX' }, + [0xA020] = { unicodeslot=0xA020, category='lo', description='YI SYLLABLE BA' }, + [0xA021] = { unicodeslot=0xA021, category='lo', description='YI SYLLABLE BAP' }, + [0xA022] = { unicodeslot=0xA022, category='lo', description='YI SYLLABLE BUOX' }, + [0xA023] = { unicodeslot=0xA023, category='lo', description='YI SYLLABLE BUO' }, + [0xA024] = { unicodeslot=0xA024, category='lo', description='YI SYLLABLE BUOP' }, + [0xA025] = { unicodeslot=0xA025, category='lo', description='YI SYLLABLE BOT' }, + [0xA026] = { unicodeslot=0xA026, category='lo', description='YI SYLLABLE BOX' }, + [0xA027] = { unicodeslot=0xA027, category='lo', description='YI SYLLABLE BO' }, + [0xA028] = { unicodeslot=0xA028, category='lo', description='YI SYLLABLE BOP' }, + [0xA029] = { unicodeslot=0xA029, category='lo', description='YI SYLLABLE BEX' }, + [0xA02A] = { unicodeslot=0xA02A, category='lo', description='YI SYLLABLE BE' }, + [0xA02B] = { unicodeslot=0xA02B, category='lo', description='YI SYLLABLE BEP' }, + [0xA02C] = { unicodeslot=0xA02C, category='lo', description='YI SYLLABLE BUT' }, + [0xA02D] = { unicodeslot=0xA02D, category='lo', description='YI SYLLABLE BUX' }, + [0xA02E] = { unicodeslot=0xA02E, category='lo', description='YI SYLLABLE BU' }, + [0xA02F] = { unicodeslot=0xA02F, category='lo', description='YI SYLLABLE BUP' }, + [0xA030] = { unicodeslot=0xA030, category='lo', description='YI SYLLABLE BURX' }, + [0xA031] = { unicodeslot=0xA031, category='lo', description='YI SYLLABLE BUR' }, + [0xA032] = { unicodeslot=0xA032, category='lo', description='YI SYLLABLE BYT' }, + [0xA033] = { unicodeslot=0xA033, category='lo', description='YI SYLLABLE BYX' }, + [0xA034] = { unicodeslot=0xA034, category='lo', description='YI SYLLABLE BY' }, + [0xA035] = { unicodeslot=0xA035, category='lo', description='YI SYLLABLE BYP' }, + [0xA036] = { unicodeslot=0xA036, category='lo', description='YI SYLLABLE BYRX' }, + [0xA037] = { unicodeslot=0xA037, category='lo', description='YI SYLLABLE BYR' }, + [0xA038] = { unicodeslot=0xA038, category='lo', description='YI SYLLABLE PIT' }, + [0xA039] = { unicodeslot=0xA039, category='lo', description='YI SYLLABLE PIX' }, + [0xA03A] = { unicodeslot=0xA03A, category='lo', description='YI SYLLABLE PI' }, + [0xA03B] = { unicodeslot=0xA03B, category='lo', description='YI SYLLABLE PIP' }, + [0xA03C] = { unicodeslot=0xA03C, category='lo', description='YI SYLLABLE PIEX' }, + [0xA03D] = { unicodeslot=0xA03D, category='lo', description='YI SYLLABLE PIE' }, + [0xA03E] = { unicodeslot=0xA03E, category='lo', description='YI SYLLABLE PIEP' }, + [0xA03F] = { unicodeslot=0xA03F, category='lo', description='YI SYLLABLE PAT' }, + [0xA040] = { unicodeslot=0xA040, category='lo', description='YI SYLLABLE PAX' }, + [0xA041] = { unicodeslot=0xA041, category='lo', description='YI SYLLABLE PA' }, + [0xA042] = { unicodeslot=0xA042, category='lo', description='YI SYLLABLE PAP' }, + [0xA043] = { unicodeslot=0xA043, category='lo', description='YI SYLLABLE PUOX' }, + [0xA044] = { unicodeslot=0xA044, category='lo', description='YI SYLLABLE PUO' }, + [0xA045] = { unicodeslot=0xA045, category='lo', description='YI SYLLABLE PUOP' }, + [0xA046] = { unicodeslot=0xA046, category='lo', description='YI SYLLABLE POT' }, + [0xA047] = { unicodeslot=0xA047, category='lo', description='YI SYLLABLE POX' }, + [0xA048] = { unicodeslot=0xA048, category='lo', description='YI SYLLABLE PO' }, + [0xA049] = { unicodeslot=0xA049, category='lo', description='YI SYLLABLE POP' }, + [0xA04A] = { unicodeslot=0xA04A, category='lo', description='YI SYLLABLE PUT' }, + [0xA04B] = { unicodeslot=0xA04B, category='lo', description='YI SYLLABLE PUX' }, + [0xA04C] = { unicodeslot=0xA04C, category='lo', description='YI SYLLABLE PU' }, + [0xA04D] = { unicodeslot=0xA04D, category='lo', description='YI SYLLABLE PUP' }, + [0xA04E] = { unicodeslot=0xA04E, category='lo', description='YI SYLLABLE PURX' }, + [0xA04F] = { unicodeslot=0xA04F, category='lo', description='YI SYLLABLE PUR' }, + [0xA050] = { unicodeslot=0xA050, category='lo', description='YI SYLLABLE PYT' }, + [0xA051] = { unicodeslot=0xA051, category='lo', description='YI SYLLABLE PYX' }, + [0xA052] = { unicodeslot=0xA052, category='lo', description='YI SYLLABLE PY' }, + [0xA053] = { unicodeslot=0xA053, category='lo', description='YI SYLLABLE PYP' }, + [0xA054] = { unicodeslot=0xA054, category='lo', description='YI SYLLABLE PYRX' }, + [0xA055] = { unicodeslot=0xA055, category='lo', description='YI SYLLABLE PYR' }, + [0xA056] = { unicodeslot=0xA056, category='lo', description='YI SYLLABLE BBIT' }, + [0xA057] = { unicodeslot=0xA057, category='lo', description='YI SYLLABLE BBIX' }, + [0xA058] = { unicodeslot=0xA058, category='lo', description='YI SYLLABLE BBI' }, + [0xA059] = { unicodeslot=0xA059, category='lo', description='YI SYLLABLE BBIP' }, + [0xA05A] = { unicodeslot=0xA05A, category='lo', description='YI SYLLABLE BBIET' }, + [0xA05B] = { unicodeslot=0xA05B, category='lo', description='YI SYLLABLE BBIEX' }, + [0xA05C] = { unicodeslot=0xA05C, category='lo', description='YI SYLLABLE BBIE' }, + [0xA05D] = { unicodeslot=0xA05D, category='lo', description='YI SYLLABLE BBIEP' }, + [0xA05E] = { unicodeslot=0xA05E, category='lo', description='YI SYLLABLE BBAT' }, + [0xA05F] = { unicodeslot=0xA05F, category='lo', description='YI SYLLABLE BBAX' }, + [0xA060] = { unicodeslot=0xA060, category='lo', description='YI SYLLABLE BBA' }, + [0xA061] = { unicodeslot=0xA061, category='lo', description='YI SYLLABLE BBAP' }, + [0xA062] = { unicodeslot=0xA062, category='lo', description='YI SYLLABLE BBUOX' }, + [0xA063] = { unicodeslot=0xA063, category='lo', description='YI SYLLABLE BBUO' }, + [0xA064] = { unicodeslot=0xA064, category='lo', description='YI SYLLABLE BBUOP' }, + [0xA065] = { unicodeslot=0xA065, category='lo', description='YI SYLLABLE BBOT' }, + [0xA066] = { unicodeslot=0xA066, category='lo', description='YI SYLLABLE BBOX' }, + [0xA067] = { unicodeslot=0xA067, category='lo', description='YI SYLLABLE BBO' }, + [0xA068] = { unicodeslot=0xA068, category='lo', description='YI SYLLABLE BBOP' }, + [0xA069] = { unicodeslot=0xA069, category='lo', description='YI SYLLABLE BBEX' }, + [0xA06A] = { unicodeslot=0xA06A, category='lo', description='YI SYLLABLE BBE' }, + [0xA06B] = { unicodeslot=0xA06B, category='lo', description='YI SYLLABLE BBEP' }, + [0xA06C] = { unicodeslot=0xA06C, category='lo', description='YI SYLLABLE BBUT' }, + [0xA06D] = { unicodeslot=0xA06D, category='lo', description='YI SYLLABLE BBUX' }, + [0xA06E] = { unicodeslot=0xA06E, category='lo', description='YI SYLLABLE BBU' }, + [0xA06F] = { unicodeslot=0xA06F, category='lo', description='YI SYLLABLE BBUP' }, + [0xA070] = { unicodeslot=0xA070, category='lo', description='YI SYLLABLE BBURX' }, + [0xA071] = { unicodeslot=0xA071, category='lo', description='YI SYLLABLE BBUR' }, + [0xA072] = { unicodeslot=0xA072, category='lo', description='YI SYLLABLE BBYT' }, + [0xA073] = { unicodeslot=0xA073, category='lo', description='YI SYLLABLE BBYX' }, + [0xA074] = { unicodeslot=0xA074, category='lo', description='YI SYLLABLE BBY' }, + [0xA075] = { unicodeslot=0xA075, category='lo', description='YI SYLLABLE BBYP' }, + [0xA076] = { unicodeslot=0xA076, category='lo', description='YI SYLLABLE NBIT' }, + [0xA077] = { unicodeslot=0xA077, category='lo', description='YI SYLLABLE NBIX' }, + [0xA078] = { unicodeslot=0xA078, category='lo', description='YI SYLLABLE NBI' }, + [0xA079] = { unicodeslot=0xA079, category='lo', description='YI SYLLABLE NBIP' }, + [0xA07A] = { unicodeslot=0xA07A, category='lo', description='YI SYLLABLE NBIEX' }, + [0xA07B] = { unicodeslot=0xA07B, category='lo', description='YI SYLLABLE NBIE' }, + [0xA07C] = { unicodeslot=0xA07C, category='lo', description='YI SYLLABLE NBIEP' }, + [0xA07D] = { unicodeslot=0xA07D, category='lo', description='YI SYLLABLE NBAT' }, + [0xA07E] = { unicodeslot=0xA07E, category='lo', description='YI SYLLABLE NBAX' }, + [0xA07F] = { unicodeslot=0xA07F, category='lo', description='YI SYLLABLE NBA' }, + [0xA080] = { unicodeslot=0xA080, category='lo', description='YI SYLLABLE NBAP' }, + [0xA081] = { unicodeslot=0xA081, category='lo', description='YI SYLLABLE NBOT' }, + [0xA082] = { unicodeslot=0xA082, category='lo', description='YI SYLLABLE NBOX' }, + [0xA083] = { unicodeslot=0xA083, category='lo', description='YI SYLLABLE NBO' }, + [0xA084] = { unicodeslot=0xA084, category='lo', description='YI SYLLABLE NBOP' }, + [0xA085] = { unicodeslot=0xA085, category='lo', description='YI SYLLABLE NBUT' }, + [0xA086] = { unicodeslot=0xA086, category='lo', description='YI SYLLABLE NBUX' }, + [0xA087] = { unicodeslot=0xA087, category='lo', description='YI SYLLABLE NBU' }, + [0xA088] = { unicodeslot=0xA088, category='lo', description='YI SYLLABLE NBUP' }, + [0xA089] = { unicodeslot=0xA089, category='lo', description='YI SYLLABLE NBURX' }, + [0xA08A] = { unicodeslot=0xA08A, category='lo', description='YI SYLLABLE NBUR' }, + [0xA08B] = { unicodeslot=0xA08B, category='lo', description='YI SYLLABLE NBYT' }, + [0xA08C] = { unicodeslot=0xA08C, category='lo', description='YI SYLLABLE NBYX' }, + [0xA08D] = { unicodeslot=0xA08D, category='lo', description='YI SYLLABLE NBY' }, + [0xA08E] = { unicodeslot=0xA08E, category='lo', description='YI SYLLABLE NBYP' }, + [0xA08F] = { unicodeslot=0xA08F, category='lo', description='YI SYLLABLE NBYRX' }, + [0xA090] = { unicodeslot=0xA090, category='lo', description='YI SYLLABLE NBYR' }, + [0xA091] = { unicodeslot=0xA091, category='lo', description='YI SYLLABLE HMIT' }, + [0xA092] = { unicodeslot=0xA092, category='lo', description='YI SYLLABLE HMIX' }, + [0xA093] = { unicodeslot=0xA093, category='lo', description='YI SYLLABLE HMI' }, + [0xA094] = { unicodeslot=0xA094, category='lo', description='YI SYLLABLE HMIP' }, + [0xA095] = { unicodeslot=0xA095, category='lo', description='YI SYLLABLE HMIEX' }, + [0xA096] = { unicodeslot=0xA096, category='lo', description='YI SYLLABLE HMIE' }, + [0xA097] = { unicodeslot=0xA097, category='lo', description='YI SYLLABLE HMIEP' }, + [0xA098] = { unicodeslot=0xA098, category='lo', description='YI SYLLABLE HMAT' }, + [0xA099] = { unicodeslot=0xA099, category='lo', description='YI SYLLABLE HMAX' }, + [0xA09A] = { unicodeslot=0xA09A, category='lo', description='YI SYLLABLE HMA' }, + [0xA09B] = { unicodeslot=0xA09B, category='lo', description='YI SYLLABLE HMAP' }, + [0xA09C] = { unicodeslot=0xA09C, category='lo', description='YI SYLLABLE HMUOX' }, + [0xA09D] = { unicodeslot=0xA09D, category='lo', description='YI SYLLABLE HMUO' }, + [0xA09E] = { unicodeslot=0xA09E, category='lo', description='YI SYLLABLE HMUOP' }, + [0xA09F] = { unicodeslot=0xA09F, category='lo', description='YI SYLLABLE HMOT' }, + [0xA0A0] = { unicodeslot=0xA0A0, category='lo', description='YI SYLLABLE HMOX' }, + [0xA0A1] = { unicodeslot=0xA0A1, category='lo', description='YI SYLLABLE HMO' }, + [0xA0A2] = { unicodeslot=0xA0A2, category='lo', description='YI SYLLABLE HMOP' }, + [0xA0A3] = { unicodeslot=0xA0A3, category='lo', description='YI SYLLABLE HMUT' }, + [0xA0A4] = { unicodeslot=0xA0A4, category='lo', description='YI SYLLABLE HMUX' }, + [0xA0A5] = { unicodeslot=0xA0A5, category='lo', description='YI SYLLABLE HMU' }, + [0xA0A6] = { unicodeslot=0xA0A6, category='lo', description='YI SYLLABLE HMUP' }, + [0xA0A7] = { unicodeslot=0xA0A7, category='lo', description='YI SYLLABLE HMURX' }, + [0xA0A8] = { unicodeslot=0xA0A8, category='lo', description='YI SYLLABLE HMUR' }, + [0xA0A9] = { unicodeslot=0xA0A9, category='lo', description='YI SYLLABLE HMYX' }, + [0xA0AA] = { unicodeslot=0xA0AA, category='lo', description='YI SYLLABLE HMY' }, + [0xA0AB] = { unicodeslot=0xA0AB, category='lo', description='YI SYLLABLE HMYP' }, + [0xA0AC] = { unicodeslot=0xA0AC, category='lo', description='YI SYLLABLE HMYRX' }, + [0xA0AD] = { unicodeslot=0xA0AD, category='lo', description='YI SYLLABLE HMYR' }, + [0xA0AE] = { unicodeslot=0xA0AE, category='lo', description='YI SYLLABLE MIT' }, + [0xA0AF] = { unicodeslot=0xA0AF, category='lo', description='YI SYLLABLE MIX' }, + [0xA0B0] = { unicodeslot=0xA0B0, category='lo', description='YI SYLLABLE MI' }, + [0xA0B1] = { unicodeslot=0xA0B1, category='lo', description='YI SYLLABLE MIP' }, + [0xA0B2] = { unicodeslot=0xA0B2, category='lo', description='YI SYLLABLE MIEX' }, + [0xA0B3] = { unicodeslot=0xA0B3, category='lo', description='YI SYLLABLE MIE' }, + [0xA0B4] = { unicodeslot=0xA0B4, category='lo', description='YI SYLLABLE MIEP' }, + [0xA0B5] = { unicodeslot=0xA0B5, category='lo', description='YI SYLLABLE MAT' }, + [0xA0B6] = { unicodeslot=0xA0B6, category='lo', description='YI SYLLABLE MAX' }, + [0xA0B7] = { unicodeslot=0xA0B7, category='lo', description='YI SYLLABLE MA' }, + [0xA0B8] = { unicodeslot=0xA0B8, category='lo', description='YI SYLLABLE MAP' }, + [0xA0B9] = { unicodeslot=0xA0B9, category='lo', description='YI SYLLABLE MUOT' }, + [0xA0BA] = { unicodeslot=0xA0BA, category='lo', description='YI SYLLABLE MUOX' }, + [0xA0BB] = { unicodeslot=0xA0BB, category='lo', description='YI SYLLABLE MUO' }, + [0xA0BC] = { unicodeslot=0xA0BC, category='lo', description='YI SYLLABLE MUOP' }, + [0xA0BD] = { unicodeslot=0xA0BD, category='lo', description='YI SYLLABLE MOT' }, + [0xA0BE] = { unicodeslot=0xA0BE, category='lo', description='YI SYLLABLE MOX' }, + [0xA0BF] = { unicodeslot=0xA0BF, category='lo', description='YI SYLLABLE MO' }, + [0xA0C0] = { unicodeslot=0xA0C0, category='lo', description='YI SYLLABLE MOP' }, + [0xA0C1] = { unicodeslot=0xA0C1, category='lo', description='YI SYLLABLE MEX' }, + [0xA0C2] = { unicodeslot=0xA0C2, category='lo', description='YI SYLLABLE ME' }, + [0xA0C3] = { unicodeslot=0xA0C3, category='lo', description='YI SYLLABLE MUT' }, + [0xA0C4] = { unicodeslot=0xA0C4, category='lo', description='YI SYLLABLE MUX' }, + [0xA0C5] = { unicodeslot=0xA0C5, category='lo', description='YI SYLLABLE MU' }, + [0xA0C6] = { unicodeslot=0xA0C6, category='lo', description='YI SYLLABLE MUP' }, + [0xA0C7] = { unicodeslot=0xA0C7, category='lo', description='YI SYLLABLE MURX' }, + [0xA0C8] = { unicodeslot=0xA0C8, category='lo', description='YI SYLLABLE MUR' }, + [0xA0C9] = { unicodeslot=0xA0C9, category='lo', description='YI SYLLABLE MYT' }, + [0xA0CA] = { unicodeslot=0xA0CA, category='lo', description='YI SYLLABLE MYX' }, + [0xA0CB] = { unicodeslot=0xA0CB, category='lo', description='YI SYLLABLE MY' }, + [0xA0CC] = { unicodeslot=0xA0CC, category='lo', description='YI SYLLABLE MYP' }, + [0xA0CD] = { unicodeslot=0xA0CD, category='lo', description='YI SYLLABLE FIT' }, + [0xA0CE] = { unicodeslot=0xA0CE, category='lo', description='YI SYLLABLE FIX' }, + [0xA0CF] = { unicodeslot=0xA0CF, category='lo', description='YI SYLLABLE FI' }, + [0xA0D0] = { unicodeslot=0xA0D0, category='lo', description='YI SYLLABLE FIP' }, + [0xA0D1] = { unicodeslot=0xA0D1, category='lo', description='YI SYLLABLE FAT' }, + [0xA0D2] = { unicodeslot=0xA0D2, category='lo', description='YI SYLLABLE FAX' }, + [0xA0D3] = { unicodeslot=0xA0D3, category='lo', description='YI SYLLABLE FA' }, + [0xA0D4] = { unicodeslot=0xA0D4, category='lo', description='YI SYLLABLE FAP' }, + [0xA0D5] = { unicodeslot=0xA0D5, category='lo', description='YI SYLLABLE FOX' }, + [0xA0D6] = { unicodeslot=0xA0D6, category='lo', description='YI SYLLABLE FO' }, + [0xA0D7] = { unicodeslot=0xA0D7, category='lo', description='YI SYLLABLE FOP' }, + [0xA0D8] = { unicodeslot=0xA0D8, category='lo', description='YI SYLLABLE FUT' }, + [0xA0D9] = { unicodeslot=0xA0D9, category='lo', description='YI SYLLABLE FUX' }, + [0xA0DA] = { unicodeslot=0xA0DA, category='lo', description='YI SYLLABLE FU' }, + [0xA0DB] = { unicodeslot=0xA0DB, category='lo', description='YI SYLLABLE FUP' }, + [0xA0DC] = { unicodeslot=0xA0DC, category='lo', description='YI SYLLABLE FURX' }, + [0xA0DD] = { unicodeslot=0xA0DD, category='lo', description='YI SYLLABLE FUR' }, + [0xA0DE] = { unicodeslot=0xA0DE, category='lo', description='YI SYLLABLE FYT' }, + [0xA0DF] = { unicodeslot=0xA0DF, category='lo', description='YI SYLLABLE FYX' }, + [0xA0E0] = { unicodeslot=0xA0E0, category='lo', description='YI SYLLABLE FY' }, + [0xA0E1] = { unicodeslot=0xA0E1, category='lo', description='YI SYLLABLE FYP' }, + [0xA0E2] = { unicodeslot=0xA0E2, category='lo', description='YI SYLLABLE VIT' }, + [0xA0E3] = { unicodeslot=0xA0E3, category='lo', description='YI SYLLABLE VIX' }, + [0xA0E4] = { unicodeslot=0xA0E4, category='lo', description='YI SYLLABLE VI' }, + [0xA0E5] = { unicodeslot=0xA0E5, category='lo', description='YI SYLLABLE VIP' }, + [0xA0E6] = { unicodeslot=0xA0E6, category='lo', description='YI SYLLABLE VIET' }, + [0xA0E7] = { unicodeslot=0xA0E7, category='lo', description='YI SYLLABLE VIEX' }, + [0xA0E8] = { unicodeslot=0xA0E8, category='lo', description='YI SYLLABLE VIE' }, + [0xA0E9] = { unicodeslot=0xA0E9, category='lo', description='YI SYLLABLE VIEP' }, + [0xA0EA] = { unicodeslot=0xA0EA, category='lo', description='YI SYLLABLE VAT' }, + [0xA0EB] = { unicodeslot=0xA0EB, category='lo', description='YI SYLLABLE VAX' }, + [0xA0EC] = { unicodeslot=0xA0EC, category='lo', description='YI SYLLABLE VA' }, + [0xA0ED] = { unicodeslot=0xA0ED, category='lo', description='YI SYLLABLE VAP' }, + [0xA0EE] = { unicodeslot=0xA0EE, category='lo', description='YI SYLLABLE VOT' }, + [0xA0EF] = { unicodeslot=0xA0EF, category='lo', description='YI SYLLABLE VOX' }, + [0xA0F0] = { unicodeslot=0xA0F0, category='lo', description='YI SYLLABLE VO' }, + [0xA0F1] = { unicodeslot=0xA0F1, category='lo', description='YI SYLLABLE VOP' }, + [0xA0F2] = { unicodeslot=0xA0F2, category='lo', description='YI SYLLABLE VEX' }, + [0xA0F3] = { unicodeslot=0xA0F3, category='lo', description='YI SYLLABLE VEP' }, + [0xA0F4] = { unicodeslot=0xA0F4, category='lo', description='YI SYLLABLE VUT' }, + [0xA0F5] = { unicodeslot=0xA0F5, category='lo', description='YI SYLLABLE VUX' }, + [0xA0F6] = { unicodeslot=0xA0F6, category='lo', description='YI SYLLABLE VU' }, + [0xA0F7] = { unicodeslot=0xA0F7, category='lo', description='YI SYLLABLE VUP' }, + [0xA0F8] = { unicodeslot=0xA0F8, category='lo', description='YI SYLLABLE VURX' }, + [0xA0F9] = { unicodeslot=0xA0F9, category='lo', description='YI SYLLABLE VUR' }, + [0xA0FA] = { unicodeslot=0xA0FA, category='lo', description='YI SYLLABLE VYT' }, + [0xA0FB] = { unicodeslot=0xA0FB, category='lo', description='YI SYLLABLE VYX' }, + [0xA0FC] = { unicodeslot=0xA0FC, category='lo', description='YI SYLLABLE VY' }, + [0xA0FD] = { unicodeslot=0xA0FD, category='lo', description='YI SYLLABLE VYP' }, + [0xA0FE] = { unicodeslot=0xA0FE, category='lo', description='YI SYLLABLE VYRX' }, + [0xA0FF] = { unicodeslot=0xA0FF, category='lo', description='YI SYLLABLE VYR' }, + [0xA100] = { unicodeslot=0xA100, category='lo', description='YI SYLLABLE DIT' }, + [0xA101] = { unicodeslot=0xA101, category='lo', description='YI SYLLABLE DIX' }, + [0xA102] = { unicodeslot=0xA102, category='lo', description='YI SYLLABLE DI' }, + [0xA103] = { unicodeslot=0xA103, category='lo', description='YI SYLLABLE DIP' }, + [0xA104] = { unicodeslot=0xA104, category='lo', description='YI SYLLABLE DIEX' }, + [0xA105] = { unicodeslot=0xA105, category='lo', description='YI SYLLABLE DIE' }, + [0xA106] = { unicodeslot=0xA106, category='lo', description='YI SYLLABLE DIEP' }, + [0xA107] = { unicodeslot=0xA107, category='lo', description='YI SYLLABLE DAT' }, + [0xA108] = { unicodeslot=0xA108, category='lo', description='YI SYLLABLE DAX' }, + [0xA109] = { unicodeslot=0xA109, category='lo', description='YI SYLLABLE DA' }, + [0xA10A] = { unicodeslot=0xA10A, category='lo', description='YI SYLLABLE DAP' }, + [0xA10B] = { unicodeslot=0xA10B, category='lo', description='YI SYLLABLE DUOX' }, + [0xA10C] = { unicodeslot=0xA10C, category='lo', description='YI SYLLABLE DUO' }, + [0xA10D] = { unicodeslot=0xA10D, category='lo', description='YI SYLLABLE DOT' }, + [0xA10E] = { unicodeslot=0xA10E, category='lo', description='YI SYLLABLE DOX' }, + [0xA10F] = { unicodeslot=0xA10F, category='lo', description='YI SYLLABLE DO' }, + [0xA110] = { unicodeslot=0xA110, category='lo', description='YI SYLLABLE DOP' }, + [0xA111] = { unicodeslot=0xA111, category='lo', description='YI SYLLABLE DEX' }, + [0xA112] = { unicodeslot=0xA112, category='lo', description='YI SYLLABLE DE' }, + [0xA113] = { unicodeslot=0xA113, category='lo', description='YI SYLLABLE DEP' }, + [0xA114] = { unicodeslot=0xA114, category='lo', description='YI SYLLABLE DUT' }, + [0xA115] = { unicodeslot=0xA115, category='lo', description='YI SYLLABLE DUX' }, + [0xA116] = { unicodeslot=0xA116, category='lo', description='YI SYLLABLE DU' }, + [0xA117] = { unicodeslot=0xA117, category='lo', description='YI SYLLABLE DUP' }, + [0xA118] = { unicodeslot=0xA118, category='lo', description='YI SYLLABLE DURX' }, + [0xA119] = { unicodeslot=0xA119, category='lo', description='YI SYLLABLE DUR' }, + [0xA11A] = { unicodeslot=0xA11A, category='lo', description='YI SYLLABLE TIT' }, + [0xA11B] = { unicodeslot=0xA11B, category='lo', description='YI SYLLABLE TIX' }, + [0xA11C] = { unicodeslot=0xA11C, category='lo', description='YI SYLLABLE TI' }, + [0xA11D] = { unicodeslot=0xA11D, category='lo', description='YI SYLLABLE TIP' }, + [0xA11E] = { unicodeslot=0xA11E, category='lo', description='YI SYLLABLE TIEX' }, + [0xA11F] = { unicodeslot=0xA11F, category='lo', description='YI SYLLABLE TIE' }, + [0xA120] = { unicodeslot=0xA120, category='lo', description='YI SYLLABLE TIEP' }, + [0xA121] = { unicodeslot=0xA121, category='lo', description='YI SYLLABLE TAT' }, + [0xA122] = { unicodeslot=0xA122, category='lo', description='YI SYLLABLE TAX' }, + [0xA123] = { unicodeslot=0xA123, category='lo', description='YI SYLLABLE TA' }, + [0xA124] = { unicodeslot=0xA124, category='lo', description='YI SYLLABLE TAP' }, + [0xA125] = { unicodeslot=0xA125, category='lo', description='YI SYLLABLE TUOT' }, + [0xA126] = { unicodeslot=0xA126, category='lo', description='YI SYLLABLE TUOX' }, + [0xA127] = { unicodeslot=0xA127, category='lo', description='YI SYLLABLE TUO' }, + [0xA128] = { unicodeslot=0xA128, category='lo', description='YI SYLLABLE TUOP' }, + [0xA129] = { unicodeslot=0xA129, category='lo', description='YI SYLLABLE TOT' }, + [0xA12A] = { unicodeslot=0xA12A, category='lo', description='YI SYLLABLE TOX' }, + [0xA12B] = { unicodeslot=0xA12B, category='lo', description='YI SYLLABLE TO' }, + [0xA12C] = { unicodeslot=0xA12C, category='lo', description='YI SYLLABLE TOP' }, + [0xA12D] = { unicodeslot=0xA12D, category='lo', description='YI SYLLABLE TEX' }, + [0xA12E] = { unicodeslot=0xA12E, category='lo', description='YI SYLLABLE TE' }, + [0xA12F] = { unicodeslot=0xA12F, category='lo', description='YI SYLLABLE TEP' }, + [0xA130] = { unicodeslot=0xA130, category='lo', description='YI SYLLABLE TUT' }, + [0xA131] = { unicodeslot=0xA131, category='lo', description='YI SYLLABLE TUX' }, + [0xA132] = { unicodeslot=0xA132, category='lo', description='YI SYLLABLE TU' }, + [0xA133] = { unicodeslot=0xA133, category='lo', description='YI SYLLABLE TUP' }, + [0xA134] = { unicodeslot=0xA134, category='lo', description='YI SYLLABLE TURX' }, + [0xA135] = { unicodeslot=0xA135, category='lo', description='YI SYLLABLE TUR' }, + [0xA136] = { unicodeslot=0xA136, category='lo', description='YI SYLLABLE DDIT' }, + [0xA137] = { unicodeslot=0xA137, category='lo', description='YI SYLLABLE DDIX' }, + [0xA138] = { unicodeslot=0xA138, category='lo', description='YI SYLLABLE DDI' }, + [0xA139] = { unicodeslot=0xA139, category='lo', description='YI SYLLABLE DDIP' }, + [0xA13A] = { unicodeslot=0xA13A, category='lo', description='YI SYLLABLE DDIEX' }, + [0xA13B] = { unicodeslot=0xA13B, category='lo', description='YI SYLLABLE DDIE' }, + [0xA13C] = { unicodeslot=0xA13C, category='lo', description='YI SYLLABLE DDIEP' }, + [0xA13D] = { unicodeslot=0xA13D, category='lo', description='YI SYLLABLE DDAT' }, + [0xA13E] = { unicodeslot=0xA13E, category='lo', description='YI SYLLABLE DDAX' }, + [0xA13F] = { unicodeslot=0xA13F, category='lo', description='YI SYLLABLE DDA' }, + [0xA140] = { unicodeslot=0xA140, category='lo', description='YI SYLLABLE DDAP' }, + [0xA141] = { unicodeslot=0xA141, category='lo', description='YI SYLLABLE DDUOX' }, + [0xA142] = { unicodeslot=0xA142, category='lo', description='YI SYLLABLE DDUO' }, + [0xA143] = { unicodeslot=0xA143, category='lo', description='YI SYLLABLE DDUOP' }, + [0xA144] = { unicodeslot=0xA144, category='lo', description='YI SYLLABLE DDOT' }, + [0xA145] = { unicodeslot=0xA145, category='lo', description='YI SYLLABLE DDOX' }, + [0xA146] = { unicodeslot=0xA146, category='lo', description='YI SYLLABLE DDO' }, + [0xA147] = { unicodeslot=0xA147, category='lo', description='YI SYLLABLE DDOP' }, + [0xA148] = { unicodeslot=0xA148, category='lo', description='YI SYLLABLE DDEX' }, + [0xA149] = { unicodeslot=0xA149, category='lo', description='YI SYLLABLE DDE' }, + [0xA14A] = { unicodeslot=0xA14A, category='lo', description='YI SYLLABLE DDEP' }, + [0xA14B] = { unicodeslot=0xA14B, category='lo', description='YI SYLLABLE DDUT' }, + [0xA14C] = { unicodeslot=0xA14C, category='lo', description='YI SYLLABLE DDUX' }, + [0xA14D] = { unicodeslot=0xA14D, category='lo', description='YI SYLLABLE DDU' }, + [0xA14E] = { unicodeslot=0xA14E, category='lo', description='YI SYLLABLE DDUP' }, + [0xA14F] = { unicodeslot=0xA14F, category='lo', description='YI SYLLABLE DDURX' }, + [0xA150] = { unicodeslot=0xA150, category='lo', description='YI SYLLABLE DDUR' }, + [0xA151] = { unicodeslot=0xA151, category='lo', description='YI SYLLABLE NDIT' }, + [0xA152] = { unicodeslot=0xA152, category='lo', description='YI SYLLABLE NDIX' }, + [0xA153] = { unicodeslot=0xA153, category='lo', description='YI SYLLABLE NDI' }, + [0xA154] = { unicodeslot=0xA154, category='lo', description='YI SYLLABLE NDIP' }, + [0xA155] = { unicodeslot=0xA155, category='lo', description='YI SYLLABLE NDIEX' }, + [0xA156] = { unicodeslot=0xA156, category='lo', description='YI SYLLABLE NDIE' }, + [0xA157] = { unicodeslot=0xA157, category='lo', description='YI SYLLABLE NDAT' }, + [0xA158] = { unicodeslot=0xA158, category='lo', description='YI SYLLABLE NDAX' }, + [0xA159] = { unicodeslot=0xA159, category='lo', description='YI SYLLABLE NDA' }, + [0xA15A] = { unicodeslot=0xA15A, category='lo', description='YI SYLLABLE NDAP' }, + [0xA15B] = { unicodeslot=0xA15B, category='lo', description='YI SYLLABLE NDOT' }, + [0xA15C] = { unicodeslot=0xA15C, category='lo', description='YI SYLLABLE NDOX' }, + [0xA15D] = { unicodeslot=0xA15D, category='lo', description='YI SYLLABLE NDO' }, + [0xA15E] = { unicodeslot=0xA15E, category='lo', description='YI SYLLABLE NDOP' }, + [0xA15F] = { unicodeslot=0xA15F, category='lo', description='YI SYLLABLE NDEX' }, + [0xA160] = { unicodeslot=0xA160, category='lo', description='YI SYLLABLE NDE' }, + [0xA161] = { unicodeslot=0xA161, category='lo', description='YI SYLLABLE NDEP' }, + [0xA162] = { unicodeslot=0xA162, category='lo', description='YI SYLLABLE NDUT' }, + [0xA163] = { unicodeslot=0xA163, category='lo', description='YI SYLLABLE NDUX' }, + [0xA164] = { unicodeslot=0xA164, category='lo', description='YI SYLLABLE NDU' }, + [0xA165] = { unicodeslot=0xA165, category='lo', description='YI SYLLABLE NDUP' }, + [0xA166] = { unicodeslot=0xA166, category='lo', description='YI SYLLABLE NDURX' }, + [0xA167] = { unicodeslot=0xA167, category='lo', description='YI SYLLABLE NDUR' }, + [0xA168] = { unicodeslot=0xA168, category='lo', description='YI SYLLABLE HNIT' }, + [0xA169] = { unicodeslot=0xA169, category='lo', description='YI SYLLABLE HNIX' }, + [0xA16A] = { unicodeslot=0xA16A, category='lo', description='YI SYLLABLE HNI' }, + [0xA16B] = { unicodeslot=0xA16B, category='lo', description='YI SYLLABLE HNIP' }, + [0xA16C] = { unicodeslot=0xA16C, category='lo', description='YI SYLLABLE HNIET' }, + [0xA16D] = { unicodeslot=0xA16D, category='lo', description='YI SYLLABLE HNIEX' }, + [0xA16E] = { unicodeslot=0xA16E, category='lo', description='YI SYLLABLE HNIE' }, + [0xA16F] = { unicodeslot=0xA16F, category='lo', description='YI SYLLABLE HNIEP' }, + [0xA170] = { unicodeslot=0xA170, category='lo', description='YI SYLLABLE HNAT' }, + [0xA171] = { unicodeslot=0xA171, category='lo', description='YI SYLLABLE HNAX' }, + [0xA172] = { unicodeslot=0xA172, category='lo', description='YI SYLLABLE HNA' }, + [0xA173] = { unicodeslot=0xA173, category='lo', description='YI SYLLABLE HNAP' }, + [0xA174] = { unicodeslot=0xA174, category='lo', description='YI SYLLABLE HNUOX' }, + [0xA175] = { unicodeslot=0xA175, category='lo', description='YI SYLLABLE HNUO' }, + [0xA176] = { unicodeslot=0xA176, category='lo', description='YI SYLLABLE HNOT' }, + [0xA177] = { unicodeslot=0xA177, category='lo', description='YI SYLLABLE HNOX' }, + [0xA178] = { unicodeslot=0xA178, category='lo', description='YI SYLLABLE HNOP' }, + [0xA179] = { unicodeslot=0xA179, category='lo', description='YI SYLLABLE HNEX' }, + [0xA17A] = { unicodeslot=0xA17A, category='lo', description='YI SYLLABLE HNE' }, + [0xA17B] = { unicodeslot=0xA17B, category='lo', description='YI SYLLABLE HNEP' }, + [0xA17C] = { unicodeslot=0xA17C, category='lo', description='YI SYLLABLE HNUT' }, + [0xA17D] = { unicodeslot=0xA17D, category='lo', description='YI SYLLABLE NIT' }, + [0xA17E] = { unicodeslot=0xA17E, category='lo', description='YI SYLLABLE NIX' }, + [0xA17F] = { unicodeslot=0xA17F, category='lo', description='YI SYLLABLE NI' }, + [0xA180] = { unicodeslot=0xA180, category='lo', description='YI SYLLABLE NIP' }, + [0xA181] = { unicodeslot=0xA181, category='lo', description='YI SYLLABLE NIEX' }, + [0xA182] = { unicodeslot=0xA182, category='lo', description='YI SYLLABLE NIE' }, + [0xA183] = { unicodeslot=0xA183, category='lo', description='YI SYLLABLE NIEP' }, + [0xA184] = { unicodeslot=0xA184, category='lo', description='YI SYLLABLE NAX' }, + [0xA185] = { unicodeslot=0xA185, category='lo', description='YI SYLLABLE NA' }, + [0xA186] = { unicodeslot=0xA186, category='lo', description='YI SYLLABLE NAP' }, + [0xA187] = { unicodeslot=0xA187, category='lo', description='YI SYLLABLE NUOX' }, + [0xA188] = { unicodeslot=0xA188, category='lo', description='YI SYLLABLE NUO' }, + [0xA189] = { unicodeslot=0xA189, category='lo', description='YI SYLLABLE NUOP' }, + [0xA18A] = { unicodeslot=0xA18A, category='lo', description='YI SYLLABLE NOT' }, + [0xA18B] = { unicodeslot=0xA18B, category='lo', description='YI SYLLABLE NOX' }, + [0xA18C] = { unicodeslot=0xA18C, category='lo', description='YI SYLLABLE NO' }, + [0xA18D] = { unicodeslot=0xA18D, category='lo', description='YI SYLLABLE NOP' }, + [0xA18E] = { unicodeslot=0xA18E, category='lo', description='YI SYLLABLE NEX' }, + [0xA18F] = { unicodeslot=0xA18F, category='lo', description='YI SYLLABLE NE' }, + [0xA190] = { unicodeslot=0xA190, category='lo', description='YI SYLLABLE NEP' }, + [0xA191] = { unicodeslot=0xA191, category='lo', description='YI SYLLABLE NUT' }, + [0xA192] = { unicodeslot=0xA192, category='lo', description='YI SYLLABLE NUX' }, + [0xA193] = { unicodeslot=0xA193, category='lo', description='YI SYLLABLE NU' }, + [0xA194] = { unicodeslot=0xA194, category='lo', description='YI SYLLABLE NUP' }, + [0xA195] = { unicodeslot=0xA195, category='lo', description='YI SYLLABLE NURX' }, + [0xA196] = { unicodeslot=0xA196, category='lo', description='YI SYLLABLE NUR' }, + [0xA197] = { unicodeslot=0xA197, category='lo', description='YI SYLLABLE HLIT' }, + [0xA198] = { unicodeslot=0xA198, category='lo', description='YI SYLLABLE HLIX' }, + [0xA199] = { unicodeslot=0xA199, category='lo', description='YI SYLLABLE HLI' }, + [0xA19A] = { unicodeslot=0xA19A, category='lo', description='YI SYLLABLE HLIP' }, + [0xA19B] = { unicodeslot=0xA19B, category='lo', description='YI SYLLABLE HLIEX' }, + [0xA19C] = { unicodeslot=0xA19C, category='lo', description='YI SYLLABLE HLIE' }, + [0xA19D] = { unicodeslot=0xA19D, category='lo', description='YI SYLLABLE HLIEP' }, + [0xA19E] = { unicodeslot=0xA19E, category='lo', description='YI SYLLABLE HLAT' }, + [0xA19F] = { unicodeslot=0xA19F, category='lo', description='YI SYLLABLE HLAX' }, + [0xA1A0] = { unicodeslot=0xA1A0, category='lo', description='YI SYLLABLE HLA' }, + [0xA1A1] = { unicodeslot=0xA1A1, category='lo', description='YI SYLLABLE HLAP' }, + [0xA1A2] = { unicodeslot=0xA1A2, category='lo', description='YI SYLLABLE HLUOX' }, + [0xA1A3] = { unicodeslot=0xA1A3, category='lo', description='YI SYLLABLE HLUO' }, + [0xA1A4] = { unicodeslot=0xA1A4, category='lo', description='YI SYLLABLE HLUOP' }, + [0xA1A5] = { unicodeslot=0xA1A5, category='lo', description='YI SYLLABLE HLOX' }, + [0xA1A6] = { unicodeslot=0xA1A6, category='lo', description='YI SYLLABLE HLO' }, + [0xA1A7] = { unicodeslot=0xA1A7, category='lo', description='YI SYLLABLE HLOP' }, + [0xA1A8] = { unicodeslot=0xA1A8, category='lo', description='YI SYLLABLE HLEX' }, + [0xA1A9] = { unicodeslot=0xA1A9, category='lo', description='YI SYLLABLE HLE' }, + [0xA1AA] = { unicodeslot=0xA1AA, category='lo', description='YI SYLLABLE HLEP' }, + [0xA1AB] = { unicodeslot=0xA1AB, category='lo', description='YI SYLLABLE HLUT' }, + [0xA1AC] = { unicodeslot=0xA1AC, category='lo', description='YI SYLLABLE HLUX' }, + [0xA1AD] = { unicodeslot=0xA1AD, category='lo', description='YI SYLLABLE HLU' }, + [0xA1AE] = { unicodeslot=0xA1AE, category='lo', description='YI SYLLABLE HLUP' }, + [0xA1AF] = { unicodeslot=0xA1AF, category='lo', description='YI SYLLABLE HLURX' }, + [0xA1B0] = { unicodeslot=0xA1B0, category='lo', description='YI SYLLABLE HLUR' }, + [0xA1B1] = { unicodeslot=0xA1B1, category='lo', description='YI SYLLABLE HLYT' }, + [0xA1B2] = { unicodeslot=0xA1B2, category='lo', description='YI SYLLABLE HLYX' }, + [0xA1B3] = { unicodeslot=0xA1B3, category='lo', description='YI SYLLABLE HLY' }, + [0xA1B4] = { unicodeslot=0xA1B4, category='lo', description='YI SYLLABLE HLYP' }, + [0xA1B5] = { unicodeslot=0xA1B5, category='lo', description='YI SYLLABLE HLYRX' }, + [0xA1B6] = { unicodeslot=0xA1B6, category='lo', description='YI SYLLABLE HLYR' }, + [0xA1B7] = { unicodeslot=0xA1B7, category='lo', description='YI SYLLABLE LIT' }, + [0xA1B8] = { unicodeslot=0xA1B8, category='lo', description='YI SYLLABLE LIX' }, + [0xA1B9] = { unicodeslot=0xA1B9, category='lo', description='YI SYLLABLE LI' }, + [0xA1BA] = { unicodeslot=0xA1BA, category='lo', description='YI SYLLABLE LIP' }, + [0xA1BB] = { unicodeslot=0xA1BB, category='lo', description='YI SYLLABLE LIET' }, + [0xA1BC] = { unicodeslot=0xA1BC, category='lo', description='YI SYLLABLE LIEX' }, + [0xA1BD] = { unicodeslot=0xA1BD, category='lo', description='YI SYLLABLE LIE' }, + [0xA1BE] = { unicodeslot=0xA1BE, category='lo', description='YI SYLLABLE LIEP' }, + [0xA1BF] = { unicodeslot=0xA1BF, category='lo', description='YI SYLLABLE LAT' }, + [0xA1C0] = { unicodeslot=0xA1C0, category='lo', description='YI SYLLABLE LAX' }, + [0xA1C1] = { unicodeslot=0xA1C1, category='lo', description='YI SYLLABLE LA' }, + [0xA1C2] = { unicodeslot=0xA1C2, category='lo', description='YI SYLLABLE LAP' }, + [0xA1C3] = { unicodeslot=0xA1C3, category='lo', description='YI SYLLABLE LUOT' }, + [0xA1C4] = { unicodeslot=0xA1C4, category='lo', description='YI SYLLABLE LUOX' }, + [0xA1C5] = { unicodeslot=0xA1C5, category='lo', description='YI SYLLABLE LUO' }, + [0xA1C6] = { unicodeslot=0xA1C6, category='lo', description='YI SYLLABLE LUOP' }, + [0xA1C7] = { unicodeslot=0xA1C7, category='lo', description='YI SYLLABLE LOT' }, + [0xA1C8] = { unicodeslot=0xA1C8, category='lo', description='YI SYLLABLE LOX' }, + [0xA1C9] = { unicodeslot=0xA1C9, category='lo', description='YI SYLLABLE LO' }, + [0xA1CA] = { unicodeslot=0xA1CA, category='lo', description='YI SYLLABLE LOP' }, + [0xA1CB] = { unicodeslot=0xA1CB, category='lo', description='YI SYLLABLE LEX' }, + [0xA1CC] = { unicodeslot=0xA1CC, category='lo', description='YI SYLLABLE LE' }, + [0xA1CD] = { unicodeslot=0xA1CD, category='lo', description='YI SYLLABLE LEP' }, + [0xA1CE] = { unicodeslot=0xA1CE, category='lo', description='YI SYLLABLE LUT' }, + [0xA1CF] = { unicodeslot=0xA1CF, category='lo', description='YI SYLLABLE LUX' }, + [0xA1D0] = { unicodeslot=0xA1D0, category='lo', description='YI SYLLABLE LU' }, + [0xA1D1] = { unicodeslot=0xA1D1, category='lo', description='YI SYLLABLE LUP' }, + [0xA1D2] = { unicodeslot=0xA1D2, category='lo', description='YI SYLLABLE LURX' }, + [0xA1D3] = { unicodeslot=0xA1D3, category='lo', description='YI SYLLABLE LUR' }, + [0xA1D4] = { unicodeslot=0xA1D4, category='lo', description='YI SYLLABLE LYT' }, + [0xA1D5] = { unicodeslot=0xA1D5, category='lo', description='YI SYLLABLE LYX' }, + [0xA1D6] = { unicodeslot=0xA1D6, category='lo', description='YI SYLLABLE LY' }, + [0xA1D7] = { unicodeslot=0xA1D7, category='lo', description='YI SYLLABLE LYP' }, + [0xA1D8] = { unicodeslot=0xA1D8, category='lo', description='YI SYLLABLE LYRX' }, + [0xA1D9] = { unicodeslot=0xA1D9, category='lo', description='YI SYLLABLE LYR' }, + [0xA1DA] = { unicodeslot=0xA1DA, category='lo', description='YI SYLLABLE GIT' }, + [0xA1DB] = { unicodeslot=0xA1DB, category='lo', description='YI SYLLABLE GIX' }, + [0xA1DC] = { unicodeslot=0xA1DC, category='lo', description='YI SYLLABLE GI' }, + [0xA1DD] = { unicodeslot=0xA1DD, category='lo', description='YI SYLLABLE GIP' }, + [0xA1DE] = { unicodeslot=0xA1DE, category='lo', description='YI SYLLABLE GIET' }, + [0xA1DF] = { unicodeslot=0xA1DF, category='lo', description='YI SYLLABLE GIEX' }, + [0xA1E0] = { unicodeslot=0xA1E0, category='lo', description='YI SYLLABLE GIE' }, + [0xA1E1] = { unicodeslot=0xA1E1, category='lo', description='YI SYLLABLE GIEP' }, + [0xA1E2] = { unicodeslot=0xA1E2, category='lo', description='YI SYLLABLE GAT' }, + [0xA1E3] = { unicodeslot=0xA1E3, category='lo', description='YI SYLLABLE GAX' }, + [0xA1E4] = { unicodeslot=0xA1E4, category='lo', description='YI SYLLABLE GA' }, + [0xA1E5] = { unicodeslot=0xA1E5, category='lo', description='YI SYLLABLE GAP' }, + [0xA1E6] = { unicodeslot=0xA1E6, category='lo', description='YI SYLLABLE GUOT' }, + [0xA1E7] = { unicodeslot=0xA1E7, category='lo', description='YI SYLLABLE GUOX' }, + [0xA1E8] = { unicodeslot=0xA1E8, category='lo', description='YI SYLLABLE GUO' }, + [0xA1E9] = { unicodeslot=0xA1E9, category='lo', description='YI SYLLABLE GUOP' }, + [0xA1EA] = { unicodeslot=0xA1EA, category='lo', description='YI SYLLABLE GOT' }, + [0xA1EB] = { unicodeslot=0xA1EB, category='lo', description='YI SYLLABLE GOX' }, + [0xA1EC] = { unicodeslot=0xA1EC, category='lo', description='YI SYLLABLE GO' }, + [0xA1ED] = { unicodeslot=0xA1ED, category='lo', description='YI SYLLABLE GOP' }, + [0xA1EE] = { unicodeslot=0xA1EE, category='lo', description='YI SYLLABLE GET' }, + [0xA1EF] = { unicodeslot=0xA1EF, category='lo', description='YI SYLLABLE GEX' }, + [0xA1F0] = { unicodeslot=0xA1F0, category='lo', description='YI SYLLABLE GE' }, + [0xA1F1] = { unicodeslot=0xA1F1, category='lo', description='YI SYLLABLE GEP' }, + [0xA1F2] = { unicodeslot=0xA1F2, category='lo', description='YI SYLLABLE GUT' }, + [0xA1F3] = { unicodeslot=0xA1F3, category='lo', description='YI SYLLABLE GUX' }, + [0xA1F4] = { unicodeslot=0xA1F4, category='lo', description='YI SYLLABLE GU' }, + [0xA1F5] = { unicodeslot=0xA1F5, category='lo', description='YI SYLLABLE GUP' }, + [0xA1F6] = { unicodeslot=0xA1F6, category='lo', description='YI SYLLABLE GURX' }, + [0xA1F7] = { unicodeslot=0xA1F7, category='lo', description='YI SYLLABLE GUR' }, + [0xA1F8] = { unicodeslot=0xA1F8, category='lo', description='YI SYLLABLE KIT' }, + [0xA1F9] = { unicodeslot=0xA1F9, category='lo', description='YI SYLLABLE KIX' }, + [0xA1FA] = { unicodeslot=0xA1FA, category='lo', description='YI SYLLABLE KI' }, + [0xA1FB] = { unicodeslot=0xA1FB, category='lo', description='YI SYLLABLE KIP' }, + [0xA1FC] = { unicodeslot=0xA1FC, category='lo', description='YI SYLLABLE KIEX' }, + [0xA1FD] = { unicodeslot=0xA1FD, category='lo', description='YI SYLLABLE KIE' }, + [0xA1FE] = { unicodeslot=0xA1FE, category='lo', description='YI SYLLABLE KIEP' }, + [0xA1FF] = { unicodeslot=0xA1FF, category='lo', description='YI SYLLABLE KAT' }, + [0xA200] = { unicodeslot=0xA200, category='lo', description='YI SYLLABLE KAX' }, + [0xA201] = { unicodeslot=0xA201, category='lo', description='YI SYLLABLE KA' }, + [0xA202] = { unicodeslot=0xA202, category='lo', description='YI SYLLABLE KAP' }, + [0xA203] = { unicodeslot=0xA203, category='lo', description='YI SYLLABLE KUOX' }, + [0xA204] = { unicodeslot=0xA204, category='lo', description='YI SYLLABLE KUO' }, + [0xA205] = { unicodeslot=0xA205, category='lo', description='YI SYLLABLE KUOP' }, + [0xA206] = { unicodeslot=0xA206, category='lo', description='YI SYLLABLE KOT' }, + [0xA207] = { unicodeslot=0xA207, category='lo', description='YI SYLLABLE KOX' }, + [0xA208] = { unicodeslot=0xA208, category='lo', description='YI SYLLABLE KO' }, + [0xA209] = { unicodeslot=0xA209, category='lo', description='YI SYLLABLE KOP' }, + [0xA20A] = { unicodeslot=0xA20A, category='lo', description='YI SYLLABLE KET' }, + [0xA20B] = { unicodeslot=0xA20B, category='lo', description='YI SYLLABLE KEX' }, + [0xA20C] = { unicodeslot=0xA20C, category='lo', description='YI SYLLABLE KE' }, + [0xA20D] = { unicodeslot=0xA20D, category='lo', description='YI SYLLABLE KEP' }, + [0xA20E] = { unicodeslot=0xA20E, category='lo', description='YI SYLLABLE KUT' }, + [0xA20F] = { unicodeslot=0xA20F, category='lo', description='YI SYLLABLE KUX' }, + [0xA210] = { unicodeslot=0xA210, category='lo', description='YI SYLLABLE KU' }, + [0xA211] = { unicodeslot=0xA211, category='lo', description='YI SYLLABLE KUP' }, + [0xA212] = { unicodeslot=0xA212, category='lo', description='YI SYLLABLE KURX' }, + [0xA213] = { unicodeslot=0xA213, category='lo', description='YI SYLLABLE KUR' }, + [0xA214] = { unicodeslot=0xA214, category='lo', description='YI SYLLABLE GGIT' }, + [0xA215] = { unicodeslot=0xA215, category='lo', description='YI SYLLABLE GGIX' }, + [0xA216] = { unicodeslot=0xA216, category='lo', description='YI SYLLABLE GGI' }, + [0xA217] = { unicodeslot=0xA217, category='lo', description='YI SYLLABLE GGIEX' }, + [0xA218] = { unicodeslot=0xA218, category='lo', description='YI SYLLABLE GGIE' }, + [0xA219] = { unicodeslot=0xA219, category='lo', description='YI SYLLABLE GGIEP' }, + [0xA21A] = { unicodeslot=0xA21A, category='lo', description='YI SYLLABLE GGAT' }, + [0xA21B] = { unicodeslot=0xA21B, category='lo', description='YI SYLLABLE GGAX' }, + [0xA21C] = { unicodeslot=0xA21C, category='lo', description='YI SYLLABLE GGA' }, + [0xA21D] = { unicodeslot=0xA21D, category='lo', description='YI SYLLABLE GGAP' }, + [0xA21E] = { unicodeslot=0xA21E, category='lo', description='YI SYLLABLE GGUOT' }, + [0xA21F] = { unicodeslot=0xA21F, category='lo', description='YI SYLLABLE GGUOX' }, + [0xA220] = { unicodeslot=0xA220, category='lo', description='YI SYLLABLE GGUO' }, + [0xA221] = { unicodeslot=0xA221, category='lo', description='YI SYLLABLE GGUOP' }, + [0xA222] = { unicodeslot=0xA222, category='lo', description='YI SYLLABLE GGOT' }, + [0xA223] = { unicodeslot=0xA223, category='lo', description='YI SYLLABLE GGOX' }, + [0xA224] = { unicodeslot=0xA224, category='lo', description='YI SYLLABLE GGO' }, + [0xA225] = { unicodeslot=0xA225, category='lo', description='YI SYLLABLE GGOP' }, + [0xA226] = { unicodeslot=0xA226, category='lo', description='YI SYLLABLE GGET' }, + [0xA227] = { unicodeslot=0xA227, category='lo', description='YI SYLLABLE GGEX' }, + [0xA228] = { unicodeslot=0xA228, category='lo', description='YI SYLLABLE GGE' }, + [0xA229] = { unicodeslot=0xA229, category='lo', description='YI SYLLABLE GGEP' }, + [0xA22A] = { unicodeslot=0xA22A, category='lo', description='YI SYLLABLE GGUT' }, + [0xA22B] = { unicodeslot=0xA22B, category='lo', description='YI SYLLABLE GGUX' }, + [0xA22C] = { unicodeslot=0xA22C, category='lo', description='YI SYLLABLE GGU' }, + [0xA22D] = { unicodeslot=0xA22D, category='lo', description='YI SYLLABLE GGUP' }, + [0xA22E] = { unicodeslot=0xA22E, category='lo', description='YI SYLLABLE GGURX' }, + [0xA22F] = { unicodeslot=0xA22F, category='lo', description='YI SYLLABLE GGUR' }, + [0xA230] = { unicodeslot=0xA230, category='lo', description='YI SYLLABLE MGIEX' }, + [0xA231] = { unicodeslot=0xA231, category='lo', description='YI SYLLABLE MGIE' }, + [0xA232] = { unicodeslot=0xA232, category='lo', description='YI SYLLABLE MGAT' }, + [0xA233] = { unicodeslot=0xA233, category='lo', description='YI SYLLABLE MGAX' }, + [0xA234] = { unicodeslot=0xA234, category='lo', description='YI SYLLABLE MGA' }, + [0xA235] = { unicodeslot=0xA235, category='lo', description='YI SYLLABLE MGAP' }, + [0xA236] = { unicodeslot=0xA236, category='lo', description='YI SYLLABLE MGUOX' }, + [0xA237] = { unicodeslot=0xA237, category='lo', description='YI SYLLABLE MGUO' }, + [0xA238] = { unicodeslot=0xA238, category='lo', description='YI SYLLABLE MGUOP' }, + [0xA239] = { unicodeslot=0xA239, category='lo', description='YI SYLLABLE MGOT' }, + [0xA23A] = { unicodeslot=0xA23A, category='lo', description='YI SYLLABLE MGOX' }, + [0xA23B] = { unicodeslot=0xA23B, category='lo', description='YI SYLLABLE MGO' }, + [0xA23C] = { unicodeslot=0xA23C, category='lo', description='YI SYLLABLE MGOP' }, + [0xA23D] = { unicodeslot=0xA23D, category='lo', description='YI SYLLABLE MGEX' }, + [0xA23E] = { unicodeslot=0xA23E, category='lo', description='YI SYLLABLE MGE' }, + [0xA23F] = { unicodeslot=0xA23F, category='lo', description='YI SYLLABLE MGEP' }, + [0xA240] = { unicodeslot=0xA240, category='lo', description='YI SYLLABLE MGUT' }, + [0xA241] = { unicodeslot=0xA241, category='lo', description='YI SYLLABLE MGUX' }, + [0xA242] = { unicodeslot=0xA242, category='lo', description='YI SYLLABLE MGU' }, + [0xA243] = { unicodeslot=0xA243, category='lo', description='YI SYLLABLE MGUP' }, + [0xA244] = { unicodeslot=0xA244, category='lo', description='YI SYLLABLE MGURX' }, + [0xA245] = { unicodeslot=0xA245, category='lo', description='YI SYLLABLE MGUR' }, + [0xA246] = { unicodeslot=0xA246, category='lo', description='YI SYLLABLE HXIT' }, + [0xA247] = { unicodeslot=0xA247, category='lo', description='YI SYLLABLE HXIX' }, + [0xA248] = { unicodeslot=0xA248, category='lo', description='YI SYLLABLE HXI' }, + [0xA249] = { unicodeslot=0xA249, category='lo', description='YI SYLLABLE HXIP' }, + [0xA24A] = { unicodeslot=0xA24A, category='lo', description='YI SYLLABLE HXIET' }, + [0xA24B] = { unicodeslot=0xA24B, category='lo', description='YI SYLLABLE HXIEX' }, + [0xA24C] = { unicodeslot=0xA24C, category='lo', description='YI SYLLABLE HXIE' }, + [0xA24D] = { unicodeslot=0xA24D, category='lo', description='YI SYLLABLE HXIEP' }, + [0xA24E] = { unicodeslot=0xA24E, category='lo', description='YI SYLLABLE HXAT' }, + [0xA24F] = { unicodeslot=0xA24F, category='lo', description='YI SYLLABLE HXAX' }, + [0xA250] = { unicodeslot=0xA250, category='lo', description='YI SYLLABLE HXA' }, + [0xA251] = { unicodeslot=0xA251, category='lo', description='YI SYLLABLE HXAP' }, + [0xA252] = { unicodeslot=0xA252, category='lo', description='YI SYLLABLE HXUOT' }, + [0xA253] = { unicodeslot=0xA253, category='lo', description='YI SYLLABLE HXUOX' }, + [0xA254] = { unicodeslot=0xA254, category='lo', description='YI SYLLABLE HXUO' }, + [0xA255] = { unicodeslot=0xA255, category='lo', description='YI SYLLABLE HXUOP' }, + [0xA256] = { unicodeslot=0xA256, category='lo', description='YI SYLLABLE HXOT' }, + [0xA257] = { unicodeslot=0xA257, category='lo', description='YI SYLLABLE HXOX' }, + [0xA258] = { unicodeslot=0xA258, category='lo', description='YI SYLLABLE HXO' }, + [0xA259] = { unicodeslot=0xA259, category='lo', description='YI SYLLABLE HXOP' }, + [0xA25A] = { unicodeslot=0xA25A, category='lo', description='YI SYLLABLE HXEX' }, + [0xA25B] = { unicodeslot=0xA25B, category='lo', description='YI SYLLABLE HXE' }, + [0xA25C] = { unicodeslot=0xA25C, category='lo', description='YI SYLLABLE HXEP' }, + [0xA25D] = { unicodeslot=0xA25D, category='lo', description='YI SYLLABLE NGIEX' }, + [0xA25E] = { unicodeslot=0xA25E, category='lo', description='YI SYLLABLE NGIE' }, + [0xA25F] = { unicodeslot=0xA25F, category='lo', description='YI SYLLABLE NGIEP' }, + [0xA260] = { unicodeslot=0xA260, category='lo', description='YI SYLLABLE NGAT' }, + [0xA261] = { unicodeslot=0xA261, category='lo', description='YI SYLLABLE NGAX' }, + [0xA262] = { unicodeslot=0xA262, category='lo', description='YI SYLLABLE NGA' }, + [0xA263] = { unicodeslot=0xA263, category='lo', description='YI SYLLABLE NGAP' }, + [0xA264] = { unicodeslot=0xA264, category='lo', description='YI SYLLABLE NGUOT' }, + [0xA265] = { unicodeslot=0xA265, category='lo', description='YI SYLLABLE NGUOX' }, + [0xA266] = { unicodeslot=0xA266, category='lo', description='YI SYLLABLE NGUO' }, + [0xA267] = { unicodeslot=0xA267, category='lo', description='YI SYLLABLE NGOT' }, + [0xA268] = { unicodeslot=0xA268, category='lo', description='YI SYLLABLE NGOX' }, + [0xA269] = { unicodeslot=0xA269, category='lo', description='YI SYLLABLE NGO' }, + [0xA26A] = { unicodeslot=0xA26A, category='lo', description='YI SYLLABLE NGOP' }, + [0xA26B] = { unicodeslot=0xA26B, category='lo', description='YI SYLLABLE NGEX' }, + [0xA26C] = { unicodeslot=0xA26C, category='lo', description='YI SYLLABLE NGE' }, + [0xA26D] = { unicodeslot=0xA26D, category='lo', description='YI SYLLABLE NGEP' }, + [0xA26E] = { unicodeslot=0xA26E, category='lo', description='YI SYLLABLE HIT' }, + [0xA26F] = { unicodeslot=0xA26F, category='lo', description='YI SYLLABLE HIEX' }, + [0xA270] = { unicodeslot=0xA270, category='lo', description='YI SYLLABLE HIE' }, + [0xA271] = { unicodeslot=0xA271, category='lo', description='YI SYLLABLE HAT' }, + [0xA272] = { unicodeslot=0xA272, category='lo', description='YI SYLLABLE HAX' }, + [0xA273] = { unicodeslot=0xA273, category='lo', description='YI SYLLABLE HA' }, + [0xA274] = { unicodeslot=0xA274, category='lo', description='YI SYLLABLE HAP' }, + [0xA275] = { unicodeslot=0xA275, category='lo', description='YI SYLLABLE HUOT' }, + [0xA276] = { unicodeslot=0xA276, category='lo', description='YI SYLLABLE HUOX' }, + [0xA277] = { unicodeslot=0xA277, category='lo', description='YI SYLLABLE HUO' }, + [0xA278] = { unicodeslot=0xA278, category='lo', description='YI SYLLABLE HUOP' }, + [0xA279] = { unicodeslot=0xA279, category='lo', description='YI SYLLABLE HOT' }, + [0xA27A] = { unicodeslot=0xA27A, category='lo', description='YI SYLLABLE HOX' }, + [0xA27B] = { unicodeslot=0xA27B, category='lo', description='YI SYLLABLE HO' }, + [0xA27C] = { unicodeslot=0xA27C, category='lo', description='YI SYLLABLE HOP' }, + [0xA27D] = { unicodeslot=0xA27D, category='lo', description='YI SYLLABLE HEX' }, + [0xA27E] = { unicodeslot=0xA27E, category='lo', description='YI SYLLABLE HE' }, + [0xA27F] = { unicodeslot=0xA27F, category='lo', description='YI SYLLABLE HEP' }, + [0xA280] = { unicodeslot=0xA280, category='lo', description='YI SYLLABLE WAT' }, + [0xA281] = { unicodeslot=0xA281, category='lo', description='YI SYLLABLE WAX' }, + [0xA282] = { unicodeslot=0xA282, category='lo', description='YI SYLLABLE WA' }, + [0xA283] = { unicodeslot=0xA283, category='lo', description='YI SYLLABLE WAP' }, + [0xA284] = { unicodeslot=0xA284, category='lo', description='YI SYLLABLE WUOX' }, + [0xA285] = { unicodeslot=0xA285, category='lo', description='YI SYLLABLE WUO' }, + [0xA286] = { unicodeslot=0xA286, category='lo', description='YI SYLLABLE WUOP' }, + [0xA287] = { unicodeslot=0xA287, category='lo', description='YI SYLLABLE WOX' }, + [0xA288] = { unicodeslot=0xA288, category='lo', description='YI SYLLABLE WO' }, + [0xA289] = { unicodeslot=0xA289, category='lo', description='YI SYLLABLE WOP' }, + [0xA28A] = { unicodeslot=0xA28A, category='lo', description='YI SYLLABLE WEX' }, + [0xA28B] = { unicodeslot=0xA28B, category='lo', description='YI SYLLABLE WE' }, + [0xA28C] = { unicodeslot=0xA28C, category='lo', description='YI SYLLABLE WEP' }, + [0xA28D] = { unicodeslot=0xA28D, category='lo', description='YI SYLLABLE ZIT' }, + [0xA28E] = { unicodeslot=0xA28E, category='lo', description='YI SYLLABLE ZIX' }, + [0xA28F] = { unicodeslot=0xA28F, category='lo', description='YI SYLLABLE ZI' }, + [0xA290] = { unicodeslot=0xA290, category='lo', description='YI SYLLABLE ZIP' }, + [0xA291] = { unicodeslot=0xA291, category='lo', description='YI SYLLABLE ZIEX' }, + [0xA292] = { unicodeslot=0xA292, category='lo', description='YI SYLLABLE ZIE' }, + [0xA293] = { unicodeslot=0xA293, category='lo', description='YI SYLLABLE ZIEP' }, + [0xA294] = { unicodeslot=0xA294, category='lo', description='YI SYLLABLE ZAT' }, + [0xA295] = { unicodeslot=0xA295, category='lo', description='YI SYLLABLE ZAX' }, + [0xA296] = { unicodeslot=0xA296, category='lo', description='YI SYLLABLE ZA' }, + [0xA297] = { unicodeslot=0xA297, category='lo', description='YI SYLLABLE ZAP' }, + [0xA298] = { unicodeslot=0xA298, category='lo', description='YI SYLLABLE ZUOX' }, + [0xA299] = { unicodeslot=0xA299, category='lo', description='YI SYLLABLE ZUO' }, + [0xA29A] = { unicodeslot=0xA29A, category='lo', description='YI SYLLABLE ZUOP' }, + [0xA29B] = { unicodeslot=0xA29B, category='lo', description='YI SYLLABLE ZOT' }, + [0xA29C] = { unicodeslot=0xA29C, category='lo', description='YI SYLLABLE ZOX' }, + [0xA29D] = { unicodeslot=0xA29D, category='lo', description='YI SYLLABLE ZO' }, + [0xA29E] = { unicodeslot=0xA29E, category='lo', description='YI SYLLABLE ZOP' }, + [0xA29F] = { unicodeslot=0xA29F, category='lo', description='YI SYLLABLE ZEX' }, + [0xA2A0] = { unicodeslot=0xA2A0, category='lo', description='YI SYLLABLE ZE' }, + [0xA2A1] = { unicodeslot=0xA2A1, category='lo', description='YI SYLLABLE ZEP' }, + [0xA2A2] = { unicodeslot=0xA2A2, category='lo', description='YI SYLLABLE ZUT' }, + [0xA2A3] = { unicodeslot=0xA2A3, category='lo', description='YI SYLLABLE ZUX' }, + [0xA2A4] = { unicodeslot=0xA2A4, category='lo', description='YI SYLLABLE ZU' }, + [0xA2A5] = { unicodeslot=0xA2A5, category='lo', description='YI SYLLABLE ZUP' }, + [0xA2A6] = { unicodeslot=0xA2A6, category='lo', description='YI SYLLABLE ZURX' }, + [0xA2A7] = { unicodeslot=0xA2A7, category='lo', description='YI SYLLABLE ZUR' }, + [0xA2A8] = { unicodeslot=0xA2A8, category='lo', description='YI SYLLABLE ZYT' }, + [0xA2A9] = { unicodeslot=0xA2A9, category='lo', description='YI SYLLABLE ZYX' }, + [0xA2AA] = { unicodeslot=0xA2AA, category='lo', description='YI SYLLABLE ZY' }, + [0xA2AB] = { unicodeslot=0xA2AB, category='lo', description='YI SYLLABLE ZYP' }, + [0xA2AC] = { unicodeslot=0xA2AC, category='lo', description='YI SYLLABLE ZYRX' }, + [0xA2AD] = { unicodeslot=0xA2AD, category='lo', description='YI SYLLABLE ZYR' }, + [0xA2AE] = { unicodeslot=0xA2AE, category='lo', description='YI SYLLABLE CIT' }, + [0xA2AF] = { unicodeslot=0xA2AF, category='lo', description='YI SYLLABLE CIX' }, + [0xA2B0] = { unicodeslot=0xA2B0, category='lo', description='YI SYLLABLE CI' }, + [0xA2B1] = { unicodeslot=0xA2B1, category='lo', description='YI SYLLABLE CIP' }, + [0xA2B2] = { unicodeslot=0xA2B2, category='lo', description='YI SYLLABLE CIET' }, + [0xA2B3] = { unicodeslot=0xA2B3, category='lo', description='YI SYLLABLE CIEX' }, + [0xA2B4] = { unicodeslot=0xA2B4, category='lo', description='YI SYLLABLE CIE' }, + [0xA2B5] = { unicodeslot=0xA2B5, category='lo', description='YI SYLLABLE CIEP' }, + [0xA2B6] = { unicodeslot=0xA2B6, category='lo', description='YI SYLLABLE CAT' }, + [0xA2B7] = { unicodeslot=0xA2B7, category='lo', description='YI SYLLABLE CAX' }, + [0xA2B8] = { unicodeslot=0xA2B8, category='lo', description='YI SYLLABLE CA' }, + [0xA2B9] = { unicodeslot=0xA2B9, category='lo', description='YI SYLLABLE CAP' }, + [0xA2BA] = { unicodeslot=0xA2BA, category='lo', description='YI SYLLABLE CUOX' }, + [0xA2BB] = { unicodeslot=0xA2BB, category='lo', description='YI SYLLABLE CUO' }, + [0xA2BC] = { unicodeslot=0xA2BC, category='lo', description='YI SYLLABLE CUOP' }, + [0xA2BD] = { unicodeslot=0xA2BD, category='lo', description='YI SYLLABLE COT' }, + [0xA2BE] = { unicodeslot=0xA2BE, category='lo', description='YI SYLLABLE COX' }, + [0xA2BF] = { unicodeslot=0xA2BF, category='lo', description='YI SYLLABLE CO' }, + [0xA2C0] = { unicodeslot=0xA2C0, category='lo', description='YI SYLLABLE COP' }, + [0xA2C1] = { unicodeslot=0xA2C1, category='lo', description='YI SYLLABLE CEX' }, + [0xA2C2] = { unicodeslot=0xA2C2, category='lo', description='YI SYLLABLE CE' }, + [0xA2C3] = { unicodeslot=0xA2C3, category='lo', description='YI SYLLABLE CEP' }, + [0xA2C4] = { unicodeslot=0xA2C4, category='lo', description='YI SYLLABLE CUT' }, + [0xA2C5] = { unicodeslot=0xA2C5, category='lo', description='YI SYLLABLE CUX' }, + [0xA2C6] = { unicodeslot=0xA2C6, category='lo', description='YI SYLLABLE CU' }, + [0xA2C7] = { unicodeslot=0xA2C7, category='lo', description='YI SYLLABLE CUP' }, + [0xA2C8] = { unicodeslot=0xA2C8, category='lo', description='YI SYLLABLE CURX' }, + [0xA2C9] = { unicodeslot=0xA2C9, category='lo', description='YI SYLLABLE CUR' }, + [0xA2CA] = { unicodeslot=0xA2CA, category='lo', description='YI SYLLABLE CYT' }, + [0xA2CB] = { unicodeslot=0xA2CB, category='lo', description='YI SYLLABLE CYX' }, + [0xA2CC] = { unicodeslot=0xA2CC, category='lo', description='YI SYLLABLE CY' }, + [0xA2CD] = { unicodeslot=0xA2CD, category='lo', description='YI SYLLABLE CYP' }, + [0xA2CE] = { unicodeslot=0xA2CE, category='lo', description='YI SYLLABLE CYRX' }, + [0xA2CF] = { unicodeslot=0xA2CF, category='lo', description='YI SYLLABLE CYR' }, + [0xA2D0] = { unicodeslot=0xA2D0, category='lo', description='YI SYLLABLE ZZIT' }, + [0xA2D1] = { unicodeslot=0xA2D1, category='lo', description='YI SYLLABLE ZZIX' }, + [0xA2D2] = { unicodeslot=0xA2D2, category='lo', description='YI SYLLABLE ZZI' }, + [0xA2D3] = { unicodeslot=0xA2D3, category='lo', description='YI SYLLABLE ZZIP' }, + [0xA2D4] = { unicodeslot=0xA2D4, category='lo', description='YI SYLLABLE ZZIET' }, + [0xA2D5] = { unicodeslot=0xA2D5, category='lo', description='YI SYLLABLE ZZIEX' }, + [0xA2D6] = { unicodeslot=0xA2D6, category='lo', description='YI SYLLABLE ZZIE' }, + [0xA2D7] = { unicodeslot=0xA2D7, category='lo', description='YI SYLLABLE ZZIEP' }, + [0xA2D8] = { unicodeslot=0xA2D8, category='lo', description='YI SYLLABLE ZZAT' }, + [0xA2D9] = { unicodeslot=0xA2D9, category='lo', description='YI SYLLABLE ZZAX' }, + [0xA2DA] = { unicodeslot=0xA2DA, category='lo', description='YI SYLLABLE ZZA' }, + [0xA2DB] = { unicodeslot=0xA2DB, category='lo', description='YI SYLLABLE ZZAP' }, + [0xA2DC] = { unicodeslot=0xA2DC, category='lo', description='YI SYLLABLE ZZOX' }, + [0xA2DD] = { unicodeslot=0xA2DD, category='lo', description='YI SYLLABLE ZZO' }, + [0xA2DE] = { unicodeslot=0xA2DE, category='lo', description='YI SYLLABLE ZZOP' }, + [0xA2DF] = { unicodeslot=0xA2DF, category='lo', description='YI SYLLABLE ZZEX' }, + [0xA2E0] = { unicodeslot=0xA2E0, category='lo', description='YI SYLLABLE ZZE' }, + [0xA2E1] = { unicodeslot=0xA2E1, category='lo', description='YI SYLLABLE ZZEP' }, + [0xA2E2] = { unicodeslot=0xA2E2, category='lo', description='YI SYLLABLE ZZUX' }, + [0xA2E3] = { unicodeslot=0xA2E3, category='lo', description='YI SYLLABLE ZZU' }, + [0xA2E4] = { unicodeslot=0xA2E4, category='lo', description='YI SYLLABLE ZZUP' }, + [0xA2E5] = { unicodeslot=0xA2E5, category='lo', description='YI SYLLABLE ZZURX' }, + [0xA2E6] = { unicodeslot=0xA2E6, category='lo', description='YI SYLLABLE ZZUR' }, + [0xA2E7] = { unicodeslot=0xA2E7, category='lo', description='YI SYLLABLE ZZYT' }, + [0xA2E8] = { unicodeslot=0xA2E8, category='lo', description='YI SYLLABLE ZZYX' }, + [0xA2E9] = { unicodeslot=0xA2E9, category='lo', description='YI SYLLABLE ZZY' }, + [0xA2EA] = { unicodeslot=0xA2EA, category='lo', description='YI SYLLABLE ZZYP' }, + [0xA2EB] = { unicodeslot=0xA2EB, category='lo', description='YI SYLLABLE ZZYRX' }, + [0xA2EC] = { unicodeslot=0xA2EC, category='lo', description='YI SYLLABLE ZZYR' }, + [0xA2ED] = { unicodeslot=0xA2ED, category='lo', description='YI SYLLABLE NZIT' }, + [0xA2EE] = { unicodeslot=0xA2EE, category='lo', description='YI SYLLABLE NZIX' }, + [0xA2EF] = { unicodeslot=0xA2EF, category='lo', description='YI SYLLABLE NZI' }, + [0xA2F0] = { unicodeslot=0xA2F0, category='lo', description='YI SYLLABLE NZIP' }, + [0xA2F1] = { unicodeslot=0xA2F1, category='lo', description='YI SYLLABLE NZIEX' }, + [0xA2F2] = { unicodeslot=0xA2F2, category='lo', description='YI SYLLABLE NZIE' }, + [0xA2F3] = { unicodeslot=0xA2F3, category='lo', description='YI SYLLABLE NZIEP' }, + [0xA2F4] = { unicodeslot=0xA2F4, category='lo', description='YI SYLLABLE NZAT' }, + [0xA2F5] = { unicodeslot=0xA2F5, category='lo', description='YI SYLLABLE NZAX' }, + [0xA2F6] = { unicodeslot=0xA2F6, category='lo', description='YI SYLLABLE NZA' }, + [0xA2F7] = { unicodeslot=0xA2F7, category='lo', description='YI SYLLABLE NZAP' }, + [0xA2F8] = { unicodeslot=0xA2F8, category='lo', description='YI SYLLABLE NZUOX' }, + [0xA2F9] = { unicodeslot=0xA2F9, category='lo', description='YI SYLLABLE NZUO' }, + [0xA2FA] = { unicodeslot=0xA2FA, category='lo', description='YI SYLLABLE NZOX' }, + [0xA2FB] = { unicodeslot=0xA2FB, category='lo', description='YI SYLLABLE NZOP' }, + [0xA2FC] = { unicodeslot=0xA2FC, category='lo', description='YI SYLLABLE NZEX' }, + [0xA2FD] = { unicodeslot=0xA2FD, category='lo', description='YI SYLLABLE NZE' }, + [0xA2FE] = { unicodeslot=0xA2FE, category='lo', description='YI SYLLABLE NZUX' }, + [0xA2FF] = { unicodeslot=0xA2FF, category='lo', description='YI SYLLABLE NZU' }, + [0xA300] = { unicodeslot=0xA300, category='lo', description='YI SYLLABLE NZUP' }, + [0xA301] = { unicodeslot=0xA301, category='lo', description='YI SYLLABLE NZURX' }, + [0xA302] = { unicodeslot=0xA302, category='lo', description='YI SYLLABLE NZUR' }, + [0xA303] = { unicodeslot=0xA303, category='lo', description='YI SYLLABLE NZYT' }, + [0xA304] = { unicodeslot=0xA304, category='lo', description='YI SYLLABLE NZYX' }, + [0xA305] = { unicodeslot=0xA305, category='lo', description='YI SYLLABLE NZY' }, + [0xA306] = { unicodeslot=0xA306, category='lo', description='YI SYLLABLE NZYP' }, + [0xA307] = { unicodeslot=0xA307, category='lo', description='YI SYLLABLE NZYRX' }, + [0xA308] = { unicodeslot=0xA308, category='lo', description='YI SYLLABLE NZYR' }, + [0xA309] = { unicodeslot=0xA309, category='lo', description='YI SYLLABLE SIT' }, + [0xA30A] = { unicodeslot=0xA30A, category='lo', description='YI SYLLABLE SIX' }, + [0xA30B] = { unicodeslot=0xA30B, category='lo', description='YI SYLLABLE SI' }, + [0xA30C] = { unicodeslot=0xA30C, category='lo', description='YI SYLLABLE SIP' }, + [0xA30D] = { unicodeslot=0xA30D, category='lo', description='YI SYLLABLE SIEX' }, + [0xA30E] = { unicodeslot=0xA30E, category='lo', description='YI SYLLABLE SIE' }, + [0xA30F] = { unicodeslot=0xA30F, category='lo', description='YI SYLLABLE SIEP' }, + [0xA310] = { unicodeslot=0xA310, category='lo', description='YI SYLLABLE SAT' }, + [0xA311] = { unicodeslot=0xA311, category='lo', description='YI SYLLABLE SAX' }, + [0xA312] = { unicodeslot=0xA312, category='lo', description='YI SYLLABLE SA' }, + [0xA313] = { unicodeslot=0xA313, category='lo', description='YI SYLLABLE SAP' }, + [0xA314] = { unicodeslot=0xA314, category='lo', description='YI SYLLABLE SUOX' }, + [0xA315] = { unicodeslot=0xA315, category='lo', description='YI SYLLABLE SUO' }, + [0xA316] = { unicodeslot=0xA316, category='lo', description='YI SYLLABLE SUOP' }, + [0xA317] = { unicodeslot=0xA317, category='lo', description='YI SYLLABLE SOT' }, + [0xA318] = { unicodeslot=0xA318, category='lo', description='YI SYLLABLE SOX' }, + [0xA319] = { unicodeslot=0xA319, category='lo', description='YI SYLLABLE SO' }, + [0xA31A] = { unicodeslot=0xA31A, category='lo', description='YI SYLLABLE SOP' }, + [0xA31B] = { unicodeslot=0xA31B, category='lo', description='YI SYLLABLE SEX' }, + [0xA31C] = { unicodeslot=0xA31C, category='lo', description='YI SYLLABLE SE' }, + [0xA31D] = { unicodeslot=0xA31D, category='lo', description='YI SYLLABLE SEP' }, + [0xA31E] = { unicodeslot=0xA31E, category='lo', description='YI SYLLABLE SUT' }, + [0xA31F] = { unicodeslot=0xA31F, category='lo', description='YI SYLLABLE SUX' }, + [0xA320] = { unicodeslot=0xA320, category='lo', description='YI SYLLABLE SU' }, + [0xA321] = { unicodeslot=0xA321, category='lo', description='YI SYLLABLE SUP' }, + [0xA322] = { unicodeslot=0xA322, category='lo', description='YI SYLLABLE SURX' }, + [0xA323] = { unicodeslot=0xA323, category='lo', description='YI SYLLABLE SUR' }, + [0xA324] = { unicodeslot=0xA324, category='lo', description='YI SYLLABLE SYT' }, + [0xA325] = { unicodeslot=0xA325, category='lo', description='YI SYLLABLE SYX' }, + [0xA326] = { unicodeslot=0xA326, category='lo', description='YI SYLLABLE SY' }, + [0xA327] = { unicodeslot=0xA327, category='lo', description='YI SYLLABLE SYP' }, + [0xA328] = { unicodeslot=0xA328, category='lo', description='YI SYLLABLE SYRX' }, + [0xA329] = { unicodeslot=0xA329, category='lo', description='YI SYLLABLE SYR' }, + [0xA32A] = { unicodeslot=0xA32A, category='lo', description='YI SYLLABLE SSIT' }, + [0xA32B] = { unicodeslot=0xA32B, category='lo', description='YI SYLLABLE SSIX' }, + [0xA32C] = { unicodeslot=0xA32C, category='lo', description='YI SYLLABLE SSI' }, + [0xA32D] = { unicodeslot=0xA32D, category='lo', description='YI SYLLABLE SSIP' }, + [0xA32E] = { unicodeslot=0xA32E, category='lo', description='YI SYLLABLE SSIEX' }, + [0xA32F] = { unicodeslot=0xA32F, category='lo', description='YI SYLLABLE SSIE' }, + [0xA330] = { unicodeslot=0xA330, category='lo', description='YI SYLLABLE SSIEP' }, + [0xA331] = { unicodeslot=0xA331, category='lo', description='YI SYLLABLE SSAT' }, + [0xA332] = { unicodeslot=0xA332, category='lo', description='YI SYLLABLE SSAX' }, + [0xA333] = { unicodeslot=0xA333, category='lo', description='YI SYLLABLE SSA' }, + [0xA334] = { unicodeslot=0xA334, category='lo', description='YI SYLLABLE SSAP' }, + [0xA335] = { unicodeslot=0xA335, category='lo', description='YI SYLLABLE SSOT' }, + [0xA336] = { unicodeslot=0xA336, category='lo', description='YI SYLLABLE SSOX' }, + [0xA337] = { unicodeslot=0xA337, category='lo', description='YI SYLLABLE SSO' }, + [0xA338] = { unicodeslot=0xA338, category='lo', description='YI SYLLABLE SSOP' }, + [0xA339] = { unicodeslot=0xA339, category='lo', description='YI SYLLABLE SSEX' }, + [0xA33A] = { unicodeslot=0xA33A, category='lo', description='YI SYLLABLE SSE' }, + [0xA33B] = { unicodeslot=0xA33B, category='lo', description='YI SYLLABLE SSEP' }, + [0xA33C] = { unicodeslot=0xA33C, category='lo', description='YI SYLLABLE SSUT' }, + [0xA33D] = { unicodeslot=0xA33D, category='lo', description='YI SYLLABLE SSUX' }, + [0xA33E] = { unicodeslot=0xA33E, category='lo', description='YI SYLLABLE SSU' }, + [0xA33F] = { unicodeslot=0xA33F, category='lo', description='YI SYLLABLE SSUP' }, + [0xA340] = { unicodeslot=0xA340, category='lo', description='YI SYLLABLE SSYT' }, + [0xA341] = { unicodeslot=0xA341, category='lo', description='YI SYLLABLE SSYX' }, + [0xA342] = { unicodeslot=0xA342, category='lo', description='YI SYLLABLE SSY' }, + [0xA343] = { unicodeslot=0xA343, category='lo', description='YI SYLLABLE SSYP' }, + [0xA344] = { unicodeslot=0xA344, category='lo', description='YI SYLLABLE SSYRX' }, + [0xA345] = { unicodeslot=0xA345, category='lo', description='YI SYLLABLE SSYR' }, + [0xA346] = { unicodeslot=0xA346, category='lo', description='YI SYLLABLE ZHAT' }, + [0xA347] = { unicodeslot=0xA347, category='lo', description='YI SYLLABLE ZHAX' }, + [0xA348] = { unicodeslot=0xA348, category='lo', description='YI SYLLABLE ZHA' }, + [0xA349] = { unicodeslot=0xA349, category='lo', description='YI SYLLABLE ZHAP' }, + [0xA34A] = { unicodeslot=0xA34A, category='lo', description='YI SYLLABLE ZHUOX' }, + [0xA34B] = { unicodeslot=0xA34B, category='lo', description='YI SYLLABLE ZHUO' }, + [0xA34C] = { unicodeslot=0xA34C, category='lo', description='YI SYLLABLE ZHUOP' }, + [0xA34D] = { unicodeslot=0xA34D, category='lo', description='YI SYLLABLE ZHOT' }, + [0xA34E] = { unicodeslot=0xA34E, category='lo', description='YI SYLLABLE ZHOX' }, + [0xA34F] = { unicodeslot=0xA34F, category='lo', description='YI SYLLABLE ZHO' }, + [0xA350] = { unicodeslot=0xA350, category='lo', description='YI SYLLABLE ZHOP' }, + [0xA351] = { unicodeslot=0xA351, category='lo', description='YI SYLLABLE ZHET' }, + [0xA352] = { unicodeslot=0xA352, category='lo', description='YI SYLLABLE ZHEX' }, + [0xA353] = { unicodeslot=0xA353, category='lo', description='YI SYLLABLE ZHE' }, + [0xA354] = { unicodeslot=0xA354, category='lo', description='YI SYLLABLE ZHEP' }, + [0xA355] = { unicodeslot=0xA355, category='lo', description='YI SYLLABLE ZHUT' }, + [0xA356] = { unicodeslot=0xA356, category='lo', description='YI SYLLABLE ZHUX' }, + [0xA357] = { unicodeslot=0xA357, category='lo', description='YI SYLLABLE ZHU' }, + [0xA358] = { unicodeslot=0xA358, category='lo', description='YI SYLLABLE ZHUP' }, + [0xA359] = { unicodeslot=0xA359, category='lo', description='YI SYLLABLE ZHURX' }, + [0xA35A] = { unicodeslot=0xA35A, category='lo', description='YI SYLLABLE ZHUR' }, + [0xA35B] = { unicodeslot=0xA35B, category='lo', description='YI SYLLABLE ZHYT' }, + [0xA35C] = { unicodeslot=0xA35C, category='lo', description='YI SYLLABLE ZHYX' }, + [0xA35D] = { unicodeslot=0xA35D, category='lo', description='YI SYLLABLE ZHY' }, + [0xA35E] = { unicodeslot=0xA35E, category='lo', description='YI SYLLABLE ZHYP' }, + [0xA35F] = { unicodeslot=0xA35F, category='lo', description='YI SYLLABLE ZHYRX' }, + [0xA360] = { unicodeslot=0xA360, category='lo', description='YI SYLLABLE ZHYR' }, + [0xA361] = { unicodeslot=0xA361, category='lo', description='YI SYLLABLE CHAT' }, + [0xA362] = { unicodeslot=0xA362, category='lo', description='YI SYLLABLE CHAX' }, + [0xA363] = { unicodeslot=0xA363, category='lo', description='YI SYLLABLE CHA' }, + [0xA364] = { unicodeslot=0xA364, category='lo', description='YI SYLLABLE CHAP' }, + [0xA365] = { unicodeslot=0xA365, category='lo', description='YI SYLLABLE CHUOT' }, + [0xA366] = { unicodeslot=0xA366, category='lo', description='YI SYLLABLE CHUOX' }, + [0xA367] = { unicodeslot=0xA367, category='lo', description='YI SYLLABLE CHUO' }, + [0xA368] = { unicodeslot=0xA368, category='lo', description='YI SYLLABLE CHUOP' }, + [0xA369] = { unicodeslot=0xA369, category='lo', description='YI SYLLABLE CHOT' }, + [0xA36A] = { unicodeslot=0xA36A, category='lo', description='YI SYLLABLE CHOX' }, + [0xA36B] = { unicodeslot=0xA36B, category='lo', description='YI SYLLABLE CHO' }, + [0xA36C] = { unicodeslot=0xA36C, category='lo', description='YI SYLLABLE CHOP' }, + [0xA36D] = { unicodeslot=0xA36D, category='lo', description='YI SYLLABLE CHET' }, + [0xA36E] = { unicodeslot=0xA36E, category='lo', description='YI SYLLABLE CHEX' }, + [0xA36F] = { unicodeslot=0xA36F, category='lo', description='YI SYLLABLE CHE' }, + [0xA370] = { unicodeslot=0xA370, category='lo', description='YI SYLLABLE CHEP' }, + [0xA371] = { unicodeslot=0xA371, category='lo', description='YI SYLLABLE CHUX' }, + [0xA372] = { unicodeslot=0xA372, category='lo', description='YI SYLLABLE CHU' }, + [0xA373] = { unicodeslot=0xA373, category='lo', description='YI SYLLABLE CHUP' }, + [0xA374] = { unicodeslot=0xA374, category='lo', description='YI SYLLABLE CHURX' }, + [0xA375] = { unicodeslot=0xA375, category='lo', description='YI SYLLABLE CHUR' }, + [0xA376] = { unicodeslot=0xA376, category='lo', description='YI SYLLABLE CHYT' }, + [0xA377] = { unicodeslot=0xA377, category='lo', description='YI SYLLABLE CHYX' }, + [0xA378] = { unicodeslot=0xA378, category='lo', description='YI SYLLABLE CHY' }, + [0xA379] = { unicodeslot=0xA379, category='lo', description='YI SYLLABLE CHYP' }, + [0xA37A] = { unicodeslot=0xA37A, category='lo', description='YI SYLLABLE CHYRX' }, + [0xA37B] = { unicodeslot=0xA37B, category='lo', description='YI SYLLABLE CHYR' }, + [0xA37C] = { unicodeslot=0xA37C, category='lo', description='YI SYLLABLE RRAX' }, + [0xA37D] = { unicodeslot=0xA37D, category='lo', description='YI SYLLABLE RRA' }, + [0xA37E] = { unicodeslot=0xA37E, category='lo', description='YI SYLLABLE RRUOX' }, + [0xA37F] = { unicodeslot=0xA37F, category='lo', description='YI SYLLABLE RRUO' }, + [0xA380] = { unicodeslot=0xA380, category='lo', description='YI SYLLABLE RROT' }, + [0xA381] = { unicodeslot=0xA381, category='lo', description='YI SYLLABLE RROX' }, + [0xA382] = { unicodeslot=0xA382, category='lo', description='YI SYLLABLE RRO' }, + [0xA383] = { unicodeslot=0xA383, category='lo', description='YI SYLLABLE RROP' }, + [0xA384] = { unicodeslot=0xA384, category='lo', description='YI SYLLABLE RRET' }, + [0xA385] = { unicodeslot=0xA385, category='lo', description='YI SYLLABLE RREX' }, + [0xA386] = { unicodeslot=0xA386, category='lo', description='YI SYLLABLE RRE' }, + [0xA387] = { unicodeslot=0xA387, category='lo', description='YI SYLLABLE RREP' }, + [0xA388] = { unicodeslot=0xA388, category='lo', description='YI SYLLABLE RRUT' }, + [0xA389] = { unicodeslot=0xA389, category='lo', description='YI SYLLABLE RRUX' }, + [0xA38A] = { unicodeslot=0xA38A, category='lo', description='YI SYLLABLE RRU' }, + [0xA38B] = { unicodeslot=0xA38B, category='lo', description='YI SYLLABLE RRUP' }, + [0xA38C] = { unicodeslot=0xA38C, category='lo', description='YI SYLLABLE RRURX' }, + [0xA38D] = { unicodeslot=0xA38D, category='lo', description='YI SYLLABLE RRUR' }, + [0xA38E] = { unicodeslot=0xA38E, category='lo', description='YI SYLLABLE RRYT' }, + [0xA38F] = { unicodeslot=0xA38F, category='lo', description='YI SYLLABLE RRYX' }, + [0xA390] = { unicodeslot=0xA390, category='lo', description='YI SYLLABLE RRY' }, + [0xA391] = { unicodeslot=0xA391, category='lo', description='YI SYLLABLE RRYP' }, + [0xA392] = { unicodeslot=0xA392, category='lo', description='YI SYLLABLE RRYRX' }, + [0xA393] = { unicodeslot=0xA393, category='lo', description='YI SYLLABLE RRYR' }, + [0xA394] = { unicodeslot=0xA394, category='lo', description='YI SYLLABLE NRAT' }, + [0xA395] = { unicodeslot=0xA395, category='lo', description='YI SYLLABLE NRAX' }, + [0xA396] = { unicodeslot=0xA396, category='lo', description='YI SYLLABLE NRA' }, + [0xA397] = { unicodeslot=0xA397, category='lo', description='YI SYLLABLE NRAP' }, + [0xA398] = { unicodeslot=0xA398, category='lo', description='YI SYLLABLE NROX' }, + [0xA399] = { unicodeslot=0xA399, category='lo', description='YI SYLLABLE NRO' }, + [0xA39A] = { unicodeslot=0xA39A, category='lo', description='YI SYLLABLE NROP' }, + [0xA39B] = { unicodeslot=0xA39B, category='lo', description='YI SYLLABLE NRET' }, + [0xA39C] = { unicodeslot=0xA39C, category='lo', description='YI SYLLABLE NREX' }, + [0xA39D] = { unicodeslot=0xA39D, category='lo', description='YI SYLLABLE NRE' }, + [0xA39E] = { unicodeslot=0xA39E, category='lo', description='YI SYLLABLE NREP' }, + [0xA39F] = { unicodeslot=0xA39F, category='lo', description='YI SYLLABLE NRUT' }, + [0xA3A0] = { unicodeslot=0xA3A0, category='lo', description='YI SYLLABLE NRUX' }, + [0xA3A1] = { unicodeslot=0xA3A1, category='lo', description='YI SYLLABLE NRU' }, + [0xA3A2] = { unicodeslot=0xA3A2, category='lo', description='YI SYLLABLE NRUP' }, + [0xA3A3] = { unicodeslot=0xA3A3, category='lo', description='YI SYLLABLE NRURX' }, + [0xA3A4] = { unicodeslot=0xA3A4, category='lo', description='YI SYLLABLE NRUR' }, + [0xA3A5] = { unicodeslot=0xA3A5, category='lo', description='YI SYLLABLE NRYT' }, + [0xA3A6] = { unicodeslot=0xA3A6, category='lo', description='YI SYLLABLE NRYX' }, + [0xA3A7] = { unicodeslot=0xA3A7, category='lo', description='YI SYLLABLE NRY' }, + [0xA3A8] = { unicodeslot=0xA3A8, category='lo', description='YI SYLLABLE NRYP' }, + [0xA3A9] = { unicodeslot=0xA3A9, category='lo', description='YI SYLLABLE NRYRX' }, + [0xA3AA] = { unicodeslot=0xA3AA, category='lo', description='YI SYLLABLE NRYR' }, + [0xA3AB] = { unicodeslot=0xA3AB, category='lo', description='YI SYLLABLE SHAT' }, + [0xA3AC] = { unicodeslot=0xA3AC, category='lo', description='YI SYLLABLE SHAX' }, + [0xA3AD] = { unicodeslot=0xA3AD, category='lo', description='YI SYLLABLE SHA' }, + [0xA3AE] = { unicodeslot=0xA3AE, category='lo', description='YI SYLLABLE SHAP' }, + [0xA3AF] = { unicodeslot=0xA3AF, category='lo', description='YI SYLLABLE SHUOX' }, + [0xA3B0] = { unicodeslot=0xA3B0, category='lo', description='YI SYLLABLE SHUO' }, + [0xA3B1] = { unicodeslot=0xA3B1, category='lo', description='YI SYLLABLE SHUOP' }, + [0xA3B2] = { unicodeslot=0xA3B2, category='lo', description='YI SYLLABLE SHOT' }, + [0xA3B3] = { unicodeslot=0xA3B3, category='lo', description='YI SYLLABLE SHOX' }, + [0xA3B4] = { unicodeslot=0xA3B4, category='lo', description='YI SYLLABLE SHO' }, + [0xA3B5] = { unicodeslot=0xA3B5, category='lo', description='YI SYLLABLE SHOP' }, + [0xA3B6] = { unicodeslot=0xA3B6, category='lo', description='YI SYLLABLE SHET' }, + [0xA3B7] = { unicodeslot=0xA3B7, category='lo', description='YI SYLLABLE SHEX' }, + [0xA3B8] = { unicodeslot=0xA3B8, category='lo', description='YI SYLLABLE SHE' }, + [0xA3B9] = { unicodeslot=0xA3B9, category='lo', description='YI SYLLABLE SHEP' }, + [0xA3BA] = { unicodeslot=0xA3BA, category='lo', description='YI SYLLABLE SHUT' }, + [0xA3BB] = { unicodeslot=0xA3BB, category='lo', description='YI SYLLABLE SHUX' }, + [0xA3BC] = { unicodeslot=0xA3BC, category='lo', description='YI SYLLABLE SHU' }, + [0xA3BD] = { unicodeslot=0xA3BD, category='lo', description='YI SYLLABLE SHUP' }, + [0xA3BE] = { unicodeslot=0xA3BE, category='lo', description='YI SYLLABLE SHURX' }, + [0xA3BF] = { unicodeslot=0xA3BF, category='lo', description='YI SYLLABLE SHUR' }, + [0xA3C0] = { unicodeslot=0xA3C0, category='lo', description='YI SYLLABLE SHYT' }, + [0xA3C1] = { unicodeslot=0xA3C1, category='lo', description='YI SYLLABLE SHYX' }, + [0xA3C2] = { unicodeslot=0xA3C2, category='lo', description='YI SYLLABLE SHY' }, + [0xA3C3] = { unicodeslot=0xA3C3, category='lo', description='YI SYLLABLE SHYP' }, + [0xA3C4] = { unicodeslot=0xA3C4, category='lo', description='YI SYLLABLE SHYRX' }, + [0xA3C5] = { unicodeslot=0xA3C5, category='lo', description='YI SYLLABLE SHYR' }, + [0xA3C6] = { unicodeslot=0xA3C6, category='lo', description='YI SYLLABLE RAT' }, + [0xA3C7] = { unicodeslot=0xA3C7, category='lo', description='YI SYLLABLE RAX' }, + [0xA3C8] = { unicodeslot=0xA3C8, category='lo', description='YI SYLLABLE RA' }, + [0xA3C9] = { unicodeslot=0xA3C9, category='lo', description='YI SYLLABLE RAP' }, + [0xA3CA] = { unicodeslot=0xA3CA, category='lo', description='YI SYLLABLE RUOX' }, + [0xA3CB] = { unicodeslot=0xA3CB, category='lo', description='YI SYLLABLE RUO' }, + [0xA3CC] = { unicodeslot=0xA3CC, category='lo', description='YI SYLLABLE RUOP' }, + [0xA3CD] = { unicodeslot=0xA3CD, category='lo', description='YI SYLLABLE ROT' }, + [0xA3CE] = { unicodeslot=0xA3CE, category='lo', description='YI SYLLABLE ROX' }, + [0xA3CF] = { unicodeslot=0xA3CF, category='lo', description='YI SYLLABLE RO' }, + [0xA3D0] = { unicodeslot=0xA3D0, category='lo', description='YI SYLLABLE ROP' }, + [0xA3D1] = { unicodeslot=0xA3D1, category='lo', description='YI SYLLABLE REX' }, + [0xA3D2] = { unicodeslot=0xA3D2, category='lo', description='YI SYLLABLE RE' }, + [0xA3D3] = { unicodeslot=0xA3D3, category='lo', description='YI SYLLABLE REP' }, + [0xA3D4] = { unicodeslot=0xA3D4, category='lo', description='YI SYLLABLE RUT' }, + [0xA3D5] = { unicodeslot=0xA3D5, category='lo', description='YI SYLLABLE RUX' }, + [0xA3D6] = { unicodeslot=0xA3D6, category='lo', description='YI SYLLABLE RU' }, + [0xA3D7] = { unicodeslot=0xA3D7, category='lo', description='YI SYLLABLE RUP' }, + [0xA3D8] = { unicodeslot=0xA3D8, category='lo', description='YI SYLLABLE RURX' }, + [0xA3D9] = { unicodeslot=0xA3D9, category='lo', description='YI SYLLABLE RUR' }, + [0xA3DA] = { unicodeslot=0xA3DA, category='lo', description='YI SYLLABLE RYT' }, + [0xA3DB] = { unicodeslot=0xA3DB, category='lo', description='YI SYLLABLE RYX' }, + [0xA3DC] = { unicodeslot=0xA3DC, category='lo', description='YI SYLLABLE RY' }, + [0xA3DD] = { unicodeslot=0xA3DD, category='lo', description='YI SYLLABLE RYP' }, + [0xA3DE] = { unicodeslot=0xA3DE, category='lo', description='YI SYLLABLE RYRX' }, + [0xA3DF] = { unicodeslot=0xA3DF, category='lo', description='YI SYLLABLE RYR' }, + [0xA3E0] = { unicodeslot=0xA3E0, category='lo', description='YI SYLLABLE JIT' }, + [0xA3E1] = { unicodeslot=0xA3E1, category='lo', description='YI SYLLABLE JIX' }, + [0xA3E2] = { unicodeslot=0xA3E2, category='lo', description='YI SYLLABLE JI' }, + [0xA3E3] = { unicodeslot=0xA3E3, category='lo', description='YI SYLLABLE JIP' }, + [0xA3E4] = { unicodeslot=0xA3E4, category='lo', description='YI SYLLABLE JIET' }, + [0xA3E5] = { unicodeslot=0xA3E5, category='lo', description='YI SYLLABLE JIEX' }, + [0xA3E6] = { unicodeslot=0xA3E6, category='lo', description='YI SYLLABLE JIE' }, + [0xA3E7] = { unicodeslot=0xA3E7, category='lo', description='YI SYLLABLE JIEP' }, + [0xA3E8] = { unicodeslot=0xA3E8, category='lo', description='YI SYLLABLE JUOT' }, + [0xA3E9] = { unicodeslot=0xA3E9, category='lo', description='YI SYLLABLE JUOX' }, + [0xA3EA] = { unicodeslot=0xA3EA, category='lo', description='YI SYLLABLE JUO' }, + [0xA3EB] = { unicodeslot=0xA3EB, category='lo', description='YI SYLLABLE JUOP' }, + [0xA3EC] = { unicodeslot=0xA3EC, category='lo', description='YI SYLLABLE JOT' }, + [0xA3ED] = { unicodeslot=0xA3ED, category='lo', description='YI SYLLABLE JOX' }, + [0xA3EE] = { unicodeslot=0xA3EE, category='lo', description='YI SYLLABLE JO' }, + [0xA3EF] = { unicodeslot=0xA3EF, category='lo', description='YI SYLLABLE JOP' }, + [0xA3F0] = { unicodeslot=0xA3F0, category='lo', description='YI SYLLABLE JUT' }, + [0xA3F1] = { unicodeslot=0xA3F1, category='lo', description='YI SYLLABLE JUX' }, + [0xA3F2] = { unicodeslot=0xA3F2, category='lo', description='YI SYLLABLE JU' }, + [0xA3F3] = { unicodeslot=0xA3F3, category='lo', description='YI SYLLABLE JUP' }, + [0xA3F4] = { unicodeslot=0xA3F4, category='lo', description='YI SYLLABLE JURX' }, + [0xA3F5] = { unicodeslot=0xA3F5, category='lo', description='YI SYLLABLE JUR' }, + [0xA3F6] = { unicodeslot=0xA3F6, category='lo', description='YI SYLLABLE JYT' }, + [0xA3F7] = { unicodeslot=0xA3F7, category='lo', description='YI SYLLABLE JYX' }, + [0xA3F8] = { unicodeslot=0xA3F8, category='lo', description='YI SYLLABLE JY' }, + [0xA3F9] = { unicodeslot=0xA3F9, category='lo', description='YI SYLLABLE JYP' }, + [0xA3FA] = { unicodeslot=0xA3FA, category='lo', description='YI SYLLABLE JYRX' }, + [0xA3FB] = { unicodeslot=0xA3FB, category='lo', description='YI SYLLABLE JYR' }, + [0xA3FC] = { unicodeslot=0xA3FC, category='lo', description='YI SYLLABLE QIT' }, + [0xA3FD] = { unicodeslot=0xA3FD, category='lo', description='YI SYLLABLE QIX' }, + [0xA3FE] = { unicodeslot=0xA3FE, category='lo', description='YI SYLLABLE QI' }, + [0xA3FF] = { unicodeslot=0xA3FF, category='lo', description='YI SYLLABLE QIP' }, + [0xA400] = { unicodeslot=0xA400, category='lo', description='YI SYLLABLE QIET' }, + [0xA401] = { unicodeslot=0xA401, category='lo', description='YI SYLLABLE QIEX' }, + [0xA402] = { unicodeslot=0xA402, category='lo', description='YI SYLLABLE QIE' }, + [0xA403] = { unicodeslot=0xA403, category='lo', description='YI SYLLABLE QIEP' }, + [0xA404] = { unicodeslot=0xA404, category='lo', description='YI SYLLABLE QUOT' }, + [0xA405] = { unicodeslot=0xA405, category='lo', description='YI SYLLABLE QUOX' }, + [0xA406] = { unicodeslot=0xA406, category='lo', description='YI SYLLABLE QUO' }, + [0xA407] = { unicodeslot=0xA407, category='lo', description='YI SYLLABLE QUOP' }, + [0xA408] = { unicodeslot=0xA408, category='lo', description='YI SYLLABLE QOT' }, + [0xA409] = { unicodeslot=0xA409, category='lo', description='YI SYLLABLE QOX' }, + [0xA40A] = { unicodeslot=0xA40A, category='lo', description='YI SYLLABLE QO' }, + [0xA40B] = { unicodeslot=0xA40B, category='lo', description='YI SYLLABLE QOP' }, + [0xA40C] = { unicodeslot=0xA40C, category='lo', description='YI SYLLABLE QUT' }, + [0xA40D] = { unicodeslot=0xA40D, category='lo', description='YI SYLLABLE QUX' }, + [0xA40E] = { unicodeslot=0xA40E, category='lo', description='YI SYLLABLE QU' }, + [0xA40F] = { unicodeslot=0xA40F, category='lo', description='YI SYLLABLE QUP' }, + [0xA410] = { unicodeslot=0xA410, category='lo', description='YI SYLLABLE QURX' }, + [0xA411] = { unicodeslot=0xA411, category='lo', description='YI SYLLABLE QUR' }, + [0xA412] = { unicodeslot=0xA412, category='lo', description='YI SYLLABLE QYT' }, + [0xA413] = { unicodeslot=0xA413, category='lo', description='YI SYLLABLE QYX' }, + [0xA414] = { unicodeslot=0xA414, category='lo', description='YI SYLLABLE QY' }, + [0xA415] = { unicodeslot=0xA415, category='lo', description='YI SYLLABLE QYP' }, + [0xA416] = { unicodeslot=0xA416, category='lo', description='YI SYLLABLE QYRX' }, + [0xA417] = { unicodeslot=0xA417, category='lo', description='YI SYLLABLE QYR' }, + [0xA418] = { unicodeslot=0xA418, category='lo', description='YI SYLLABLE JJIT' }, + [0xA419] = { unicodeslot=0xA419, category='lo', description='YI SYLLABLE JJIX' }, + [0xA41A] = { unicodeslot=0xA41A, category='lo', description='YI SYLLABLE JJI' }, + [0xA41B] = { unicodeslot=0xA41B, category='lo', description='YI SYLLABLE JJIP' }, + [0xA41C] = { unicodeslot=0xA41C, category='lo', description='YI SYLLABLE JJIET' }, + [0xA41D] = { unicodeslot=0xA41D, category='lo', description='YI SYLLABLE JJIEX' }, + [0xA41E] = { unicodeslot=0xA41E, category='lo', description='YI SYLLABLE JJIE' }, + [0xA41F] = { unicodeslot=0xA41F, category='lo', description='YI SYLLABLE JJIEP' }, + [0xA420] = { unicodeslot=0xA420, category='lo', description='YI SYLLABLE JJUOX' }, + [0xA421] = { unicodeslot=0xA421, category='lo', description='YI SYLLABLE JJUO' }, + [0xA422] = { unicodeslot=0xA422, category='lo', description='YI SYLLABLE JJUOP' }, + [0xA423] = { unicodeslot=0xA423, category='lo', description='YI SYLLABLE JJOT' }, + [0xA424] = { unicodeslot=0xA424, category='lo', description='YI SYLLABLE JJOX' }, + [0xA425] = { unicodeslot=0xA425, category='lo', description='YI SYLLABLE JJO' }, + [0xA426] = { unicodeslot=0xA426, category='lo', description='YI SYLLABLE JJOP' }, + [0xA427] = { unicodeslot=0xA427, category='lo', description='YI SYLLABLE JJUT' }, + [0xA428] = { unicodeslot=0xA428, category='lo', description='YI SYLLABLE JJUX' }, + [0xA429] = { unicodeslot=0xA429, category='lo', description='YI SYLLABLE JJU' }, + [0xA42A] = { unicodeslot=0xA42A, category='lo', description='YI SYLLABLE JJUP' }, + [0xA42B] = { unicodeslot=0xA42B, category='lo', description='YI SYLLABLE JJURX' }, + [0xA42C] = { unicodeslot=0xA42C, category='lo', description='YI SYLLABLE JJUR' }, + [0xA42D] = { unicodeslot=0xA42D, category='lo', description='YI SYLLABLE JJYT' }, + [0xA42E] = { unicodeslot=0xA42E, category='lo', description='YI SYLLABLE JJYX' }, + [0xA42F] = { unicodeslot=0xA42F, category='lo', description='YI SYLLABLE JJY' }, + [0xA430] = { unicodeslot=0xA430, category='lo', description='YI SYLLABLE JJYP' }, + [0xA431] = { unicodeslot=0xA431, category='lo', description='YI SYLLABLE NJIT' }, + [0xA432] = { unicodeslot=0xA432, category='lo', description='YI SYLLABLE NJIX' }, + [0xA433] = { unicodeslot=0xA433, category='lo', description='YI SYLLABLE NJI' }, + [0xA434] = { unicodeslot=0xA434, category='lo', description='YI SYLLABLE NJIP' }, + [0xA435] = { unicodeslot=0xA435, category='lo', description='YI SYLLABLE NJIET' }, + [0xA436] = { unicodeslot=0xA436, category='lo', description='YI SYLLABLE NJIEX' }, + [0xA437] = { unicodeslot=0xA437, category='lo', description='YI SYLLABLE NJIE' }, + [0xA438] = { unicodeslot=0xA438, category='lo', description='YI SYLLABLE NJIEP' }, + [0xA439] = { unicodeslot=0xA439, category='lo', description='YI SYLLABLE NJUOX' }, + [0xA43A] = { unicodeslot=0xA43A, category='lo', description='YI SYLLABLE NJUO' }, + [0xA43B] = { unicodeslot=0xA43B, category='lo', description='YI SYLLABLE NJOT' }, + [0xA43C] = { unicodeslot=0xA43C, category='lo', description='YI SYLLABLE NJOX' }, + [0xA43D] = { unicodeslot=0xA43D, category='lo', description='YI SYLLABLE NJO' }, + [0xA43E] = { unicodeslot=0xA43E, category='lo', description='YI SYLLABLE NJOP' }, + [0xA43F] = { unicodeslot=0xA43F, category='lo', description='YI SYLLABLE NJUX' }, + [0xA440] = { unicodeslot=0xA440, category='lo', description='YI SYLLABLE NJU' }, + [0xA441] = { unicodeslot=0xA441, category='lo', description='YI SYLLABLE NJUP' }, + [0xA442] = { unicodeslot=0xA442, category='lo', description='YI SYLLABLE NJURX' }, + [0xA443] = { unicodeslot=0xA443, category='lo', description='YI SYLLABLE NJUR' }, + [0xA444] = { unicodeslot=0xA444, category='lo', description='YI SYLLABLE NJYT' }, + [0xA445] = { unicodeslot=0xA445, category='lo', description='YI SYLLABLE NJYX' }, + [0xA446] = { unicodeslot=0xA446, category='lo', description='YI SYLLABLE NJY' }, + [0xA447] = { unicodeslot=0xA447, category='lo', description='YI SYLLABLE NJYP' }, + [0xA448] = { unicodeslot=0xA448, category='lo', description='YI SYLLABLE NJYRX' }, + [0xA449] = { unicodeslot=0xA449, category='lo', description='YI SYLLABLE NJYR' }, + [0xA44A] = { unicodeslot=0xA44A, category='lo', description='YI SYLLABLE NYIT' }, + [0xA44B] = { unicodeslot=0xA44B, category='lo', description='YI SYLLABLE NYIX' }, + [0xA44C] = { unicodeslot=0xA44C, category='lo', description='YI SYLLABLE NYI' }, + [0xA44D] = { unicodeslot=0xA44D, category='lo', description='YI SYLLABLE NYIP' }, + [0xA44E] = { unicodeslot=0xA44E, category='lo', description='YI SYLLABLE NYIET' }, + [0xA44F] = { unicodeslot=0xA44F, category='lo', description='YI SYLLABLE NYIEX' }, + [0xA450] = { unicodeslot=0xA450, category='lo', description='YI SYLLABLE NYIE' }, + [0xA451] = { unicodeslot=0xA451, category='lo', description='YI SYLLABLE NYIEP' }, + [0xA452] = { unicodeslot=0xA452, category='lo', description='YI SYLLABLE NYUOX' }, + [0xA453] = { unicodeslot=0xA453, category='lo', description='YI SYLLABLE NYUO' }, + [0xA454] = { unicodeslot=0xA454, category='lo', description='YI SYLLABLE NYUOP' }, + [0xA455] = { unicodeslot=0xA455, category='lo', description='YI SYLLABLE NYOT' }, + [0xA456] = { unicodeslot=0xA456, category='lo', description='YI SYLLABLE NYOX' }, + [0xA457] = { unicodeslot=0xA457, category='lo', description='YI SYLLABLE NYO' }, + [0xA458] = { unicodeslot=0xA458, category='lo', description='YI SYLLABLE NYOP' }, + [0xA459] = { unicodeslot=0xA459, category='lo', description='YI SYLLABLE NYUT' }, + [0xA45A] = { unicodeslot=0xA45A, category='lo', description='YI SYLLABLE NYUX' }, + [0xA45B] = { unicodeslot=0xA45B, category='lo', description='YI SYLLABLE NYU' }, + [0xA45C] = { unicodeslot=0xA45C, category='lo', description='YI SYLLABLE NYUP' }, + [0xA45D] = { unicodeslot=0xA45D, category='lo', description='YI SYLLABLE XIT' }, + [0xA45E] = { unicodeslot=0xA45E, category='lo', description='YI SYLLABLE XIX' }, + [0xA45F] = { unicodeslot=0xA45F, category='lo', description='YI SYLLABLE XI' }, + [0xA460] = { unicodeslot=0xA460, category='lo', description='YI SYLLABLE XIP' }, + [0xA461] = { unicodeslot=0xA461, category='lo', description='YI SYLLABLE XIET' }, + [0xA462] = { unicodeslot=0xA462, category='lo', description='YI SYLLABLE XIEX' }, + [0xA463] = { unicodeslot=0xA463, category='lo', description='YI SYLLABLE XIE' }, + [0xA464] = { unicodeslot=0xA464, category='lo', description='YI SYLLABLE XIEP' }, + [0xA465] = { unicodeslot=0xA465, category='lo', description='YI SYLLABLE XUOX' }, + [0xA466] = { unicodeslot=0xA466, category='lo', description='YI SYLLABLE XUO' }, + [0xA467] = { unicodeslot=0xA467, category='lo', description='YI SYLLABLE XOT' }, + [0xA468] = { unicodeslot=0xA468, category='lo', description='YI SYLLABLE XOX' }, + [0xA469] = { unicodeslot=0xA469, category='lo', description='YI SYLLABLE XO' }, + [0xA46A] = { unicodeslot=0xA46A, category='lo', description='YI SYLLABLE XOP' }, + [0xA46B] = { unicodeslot=0xA46B, category='lo', description='YI SYLLABLE XYT' }, + [0xA46C] = { unicodeslot=0xA46C, category='lo', description='YI SYLLABLE XYX' }, + [0xA46D] = { unicodeslot=0xA46D, category='lo', description='YI SYLLABLE XY' }, + [0xA46E] = { unicodeslot=0xA46E, category='lo', description='YI SYLLABLE XYP' }, + [0xA46F] = { unicodeslot=0xA46F, category='lo', description='YI SYLLABLE XYRX' }, + [0xA470] = { unicodeslot=0xA470, category='lo', description='YI SYLLABLE XYR' }, + [0xA471] = { unicodeslot=0xA471, category='lo', description='YI SYLLABLE YIT' }, + [0xA472] = { unicodeslot=0xA472, category='lo', description='YI SYLLABLE YIX' }, + [0xA473] = { unicodeslot=0xA473, category='lo', description='YI SYLLABLE YI' }, + [0xA474] = { unicodeslot=0xA474, category='lo', description='YI SYLLABLE YIP' }, + [0xA475] = { unicodeslot=0xA475, category='lo', description='YI SYLLABLE YIET' }, + [0xA476] = { unicodeslot=0xA476, category='lo', description='YI SYLLABLE YIEX' }, + [0xA477] = { unicodeslot=0xA477, category='lo', description='YI SYLLABLE YIE' }, + [0xA478] = { unicodeslot=0xA478, category='lo', description='YI SYLLABLE YIEP' }, + [0xA479] = { unicodeslot=0xA479, category='lo', description='YI SYLLABLE YUOT' }, + [0xA47A] = { unicodeslot=0xA47A, category='lo', description='YI SYLLABLE YUOX' }, + [0xA47B] = { unicodeslot=0xA47B, category='lo', description='YI SYLLABLE YUO' }, + [0xA47C] = { unicodeslot=0xA47C, category='lo', description='YI SYLLABLE YUOP' }, + [0xA47D] = { unicodeslot=0xA47D, category='lo', description='YI SYLLABLE YOT' }, + [0xA47E] = { unicodeslot=0xA47E, category='lo', description='YI SYLLABLE YOX' }, + [0xA47F] = { unicodeslot=0xA47F, category='lo', description='YI SYLLABLE YO' }, + [0xA480] = { unicodeslot=0xA480, category='lo', description='YI SYLLABLE YOP' }, + [0xA481] = { unicodeslot=0xA481, category='lo', description='YI SYLLABLE YUT' }, + [0xA482] = { unicodeslot=0xA482, category='lo', description='YI SYLLABLE YUX' }, + [0xA483] = { unicodeslot=0xA483, category='lo', description='YI SYLLABLE YU' }, + [0xA484] = { unicodeslot=0xA484, category='lo', description='YI SYLLABLE YUP' }, + [0xA485] = { unicodeslot=0xA485, category='lo', description='YI SYLLABLE YURX' }, + [0xA486] = { unicodeslot=0xA486, category='lo', description='YI SYLLABLE YUR' }, + [0xA487] = { unicodeslot=0xA487, category='lo', description='YI SYLLABLE YYT' }, + [0xA488] = { unicodeslot=0xA488, category='lo', description='YI SYLLABLE YYX' }, + [0xA489] = { unicodeslot=0xA489, category='lo', description='YI SYLLABLE YY' }, + [0xA48A] = { unicodeslot=0xA48A, category='lo', description='YI SYLLABLE YYP' }, + [0xA48B] = { unicodeslot=0xA48B, category='lo', description='YI SYLLABLE YYRX' }, + [0xA48C] = { unicodeslot=0xA48C, category='lo', description='YI SYLLABLE YYR' }, + [0xA490] = { unicodeslot=0xA490, category='so', description='YI RADICAL QOT' }, + [0xA491] = { unicodeslot=0xA491, category='so', description='YI RADICAL LI' }, + [0xA492] = { unicodeslot=0xA492, category='so', description='YI RADICAL KIT' }, + [0xA493] = { unicodeslot=0xA493, category='so', description='YI RADICAL NYIP' }, + [0xA494] = { unicodeslot=0xA494, category='so', description='YI RADICAL CYP' }, + [0xA495] = { unicodeslot=0xA495, category='so', description='YI RADICAL SSI' }, + [0xA496] = { unicodeslot=0xA496, category='so', description='YI RADICAL GGOP' }, + [0xA497] = { unicodeslot=0xA497, category='so', description='YI RADICAL GEP' }, + [0xA498] = { unicodeslot=0xA498, category='so', description='YI RADICAL MI' }, + [0xA499] = { unicodeslot=0xA499, category='so', description='YI RADICAL HXIT' }, + [0xA49A] = { unicodeslot=0xA49A, category='so', description='YI RADICAL LYR' }, + [0xA49B] = { unicodeslot=0xA49B, category='so', description='YI RADICAL BBUT' }, + [0xA49C] = { unicodeslot=0xA49C, category='so', description='YI RADICAL MOP' }, + [0xA49D] = { unicodeslot=0xA49D, category='so', description='YI RADICAL YO' }, + [0xA49E] = { unicodeslot=0xA49E, category='so', description='YI RADICAL PUT' }, + [0xA49F] = { unicodeslot=0xA49F, category='so', description='YI RADICAL HXUO' }, + [0xA4A0] = { unicodeslot=0xA4A0, category='so', description='YI RADICAL TAT' }, + [0xA4A1] = { unicodeslot=0xA4A1, category='so', description='YI RADICAL GA' }, + [0xA4A2] = { unicodeslot=0xA4A2, category='so', description='YI RADICAL ZUP' }, + [0xA4A3] = { unicodeslot=0xA4A3, category='so', description='YI RADICAL CYT' }, + [0xA4A4] = { unicodeslot=0xA4A4, category='so', description='YI RADICAL DDUR' }, + [0xA4A5] = { unicodeslot=0xA4A5, category='so', description='YI RADICAL BUR' }, + [0xA4A6] = { unicodeslot=0xA4A6, category='so', description='YI RADICAL GGUO' }, + [0xA4A7] = { unicodeslot=0xA4A7, category='so', description='YI RADICAL NYOP' }, + [0xA4A8] = { unicodeslot=0xA4A8, category='so', description='YI RADICAL TU' }, + [0xA4A9] = { unicodeslot=0xA4A9, category='so', description='YI RADICAL OP' }, + [0xA4AA] = { unicodeslot=0xA4AA, category='so', description='YI RADICAL JJUT' }, + [0xA4AB] = { unicodeslot=0xA4AB, category='so', description='YI RADICAL ZOT' }, + [0xA4AC] = { unicodeslot=0xA4AC, category='so', description='YI RADICAL PYT' }, + [0xA4AD] = { unicodeslot=0xA4AD, category='so', description='YI RADICAL HMO' }, + [0xA4AE] = { unicodeslot=0xA4AE, category='so', description='YI RADICAL YIT' }, + [0xA4AF] = { unicodeslot=0xA4AF, category='so', description='YI RADICAL VUR' }, + [0xA4B0] = { unicodeslot=0xA4B0, category='so', description='YI RADICAL SHY' }, + [0xA4B1] = { unicodeslot=0xA4B1, category='so', description='YI RADICAL VEP' }, + [0xA4B2] = { unicodeslot=0xA4B2, category='so', description='YI RADICAL ZA' }, + [0xA4B3] = { unicodeslot=0xA4B3, category='so', description='YI RADICAL JO' }, + [0xA4B4] = { unicodeslot=0xA4B4, category='so', description='YI RADICAL NZUP' }, + [0xA4B5] = { unicodeslot=0xA4B5, category='so', description='YI RADICAL JJY' }, + [0xA4B6] = { unicodeslot=0xA4B6, category='so', description='YI RADICAL GOT' }, + [0xA4B7] = { unicodeslot=0xA4B7, category='so', description='YI RADICAL JJIE' }, + [0xA4B8] = { unicodeslot=0xA4B8, category='so', description='YI RADICAL WO' }, + [0xA4B9] = { unicodeslot=0xA4B9, category='so', description='YI RADICAL DU' }, + [0xA4BA] = { unicodeslot=0xA4BA, category='so', description='YI RADICAL SHUR' }, + [0xA4BB] = { unicodeslot=0xA4BB, category='so', description='YI RADICAL LIE' }, + [0xA4BC] = { unicodeslot=0xA4BC, category='so', description='YI RADICAL CY' }, + [0xA4BD] = { unicodeslot=0xA4BD, category='so', description='YI RADICAL CUOP' }, + [0xA4BE] = { unicodeslot=0xA4BE, category='so', description='YI RADICAL CIP' }, + [0xA4BF] = { unicodeslot=0xA4BF, category='so', description='YI RADICAL HXOP' }, + [0xA4C0] = { unicodeslot=0xA4C0, category='so', description='YI RADICAL SHAT' }, + [0xA4C1] = { unicodeslot=0xA4C1, category='so', description='YI RADICAL ZUR' }, + [0xA4C2] = { unicodeslot=0xA4C2, category='so', description='YI RADICAL SHOP' }, + [0xA4C3] = { unicodeslot=0xA4C3, category='so', description='YI RADICAL CHE' }, + [0xA4C4] = { unicodeslot=0xA4C4, category='so', description='YI RADICAL ZZIET' }, + [0xA4C5] = { unicodeslot=0xA4C5, category='so', description='YI RADICAL NBIE' }, + [0xA4C6] = { unicodeslot=0xA4C6, category='so', description='YI RADICAL KE' }, + [0xA700] = { unicodeslot=0xA700, category='sk', description='MODIFIER LETTER CHINESE TONE YIN PING' }, + [0xA701] = { unicodeslot=0xA701, category='sk', description='MODIFIER LETTER CHINESE TONE YANG PING' }, + [0xA702] = { unicodeslot=0xA702, category='sk', description='MODIFIER LETTER CHINESE TONE YIN SHANG' }, + [0xA703] = { unicodeslot=0xA703, category='sk', description='MODIFIER LETTER CHINESE TONE YANG SHANG' }, + [0xA704] = { unicodeslot=0xA704, category='sk', description='MODIFIER LETTER CHINESE TONE YIN QU' }, + [0xA705] = { unicodeslot=0xA705, category='sk', description='MODIFIER LETTER CHINESE TONE YANG QU' }, + [0xA706] = { unicodeslot=0xA706, category='sk', description='MODIFIER LETTER CHINESE TONE YIN RU' }, + [0xA707] = { unicodeslot=0xA707, category='sk', description='MODIFIER LETTER CHINESE TONE YANG RU' }, + [0xA708] = { unicodeslot=0xA708, category='sk', description='MODIFIER LETTER EXTRA-HIGH DOTTED TONE BAR' }, + [0xA709] = { unicodeslot=0xA709, category='sk', description='MODIFIER LETTER HIGH DOTTED TONE BAR' }, + [0xA70A] = { unicodeslot=0xA70A, category='sk', description='MODIFIER LETTER MID DOTTED TONE BAR' }, + [0xA70B] = { unicodeslot=0xA70B, category='sk', description='MODIFIER LETTER LOW DOTTED TONE BAR' }, + [0xA70C] = { unicodeslot=0xA70C, category='sk', description='MODIFIER LETTER EXTRA-LOW DOTTED TONE BAR' }, + [0xA70D] = { unicodeslot=0xA70D, category='sk', description='MODIFIER LETTER EXTRA-HIGH DOTTED LEFT-STEM TONE BAR' }, + [0xA70E] = { unicodeslot=0xA70E, category='sk', description='MODIFIER LETTER HIGH DOTTED LEFT-STEM TONE BAR' }, + [0xA70F] = { unicodeslot=0xA70F, category='sk', description='MODIFIER LETTER MID DOTTED LEFT-STEM TONE BAR' }, + [0xA710] = { unicodeslot=0xA710, category='sk', description='MODIFIER LETTER LOW DOTTED LEFT-STEM TONE BAR' }, + [0xA711] = { unicodeslot=0xA711, category='sk', description='MODIFIER LETTER EXTRA-LOW DOTTED LEFT-STEM TONE BAR' }, + [0xA712] = { unicodeslot=0xA712, category='sk', description='MODIFIER LETTER EXTRA-HIGH LEFT-STEM TONE BAR' }, + [0xA713] = { unicodeslot=0xA713, category='sk', description='MODIFIER LETTER HIGH LEFT-STEM TONE BAR' }, + [0xA714] = { unicodeslot=0xA714, category='sk', description='MODIFIER LETTER MID LEFT-STEM TONE BAR' }, + [0xA715] = { unicodeslot=0xA715, category='sk', description='MODIFIER LETTER LOW LEFT-STEM TONE BAR' }, + [0xA716] = { unicodeslot=0xA716, category='sk', description='MODIFIER LETTER EXTRA-LOW LEFT-STEM TONE BAR' }, + [0xA717] = { unicodeslot=0xA717, category='lm', description='MODIFIER LETTER DOT VERTICAL BAR' }, + [0xA718] = { unicodeslot=0xA718, category='lm', description='MODIFIER LETTER DOT SLASH' }, + [0xA719] = { unicodeslot=0xA719, category='lm', description='MODIFIER LETTER DOT HORIZONTAL BAR' }, + [0xA71A] = { unicodeslot=0xA71A, category='lm', description='MODIFIER LETTER LOWER RIGHT CORNER ANGLE' }, + [0xA720] = { unicodeslot=0xA720, category='sk', description='MODIFIER LETTER STRESS AND HIGH TONE' }, + [0xA721] = { unicodeslot=0xA721, category='sk', description='MODIFIER LETTER STRESS AND LOW TONE' }, + [0xA800] = { unicodeslot=0xA800, category='lo', description='SYLOTI NAGRI LETTER A' }, + [0xA801] = { unicodeslot=0xA801, category='lo', description='SYLOTI NAGRI LETTER I' }, + [0xA802] = { unicodeslot=0xA802, category='mc', description='SYLOTI NAGRI SIGN DVISVARA' }, + [0xA803] = { unicodeslot=0xA803, category='lo', description='SYLOTI NAGRI LETTER U' }, + [0xA804] = { unicodeslot=0xA804, category='lo', description='SYLOTI NAGRI LETTER E' }, + [0xA805] = { unicodeslot=0xA805, category='lo', description='SYLOTI NAGRI LETTER O' }, + [0xA806] = { unicodeslot=0xA806, category='mn', description='SYLOTI NAGRI SIGN HASANTA' }, + [0xA807] = { unicodeslot=0xA807, category='lo', description='SYLOTI NAGRI LETTER KO' }, + [0xA808] = { unicodeslot=0xA808, category='lo', description='SYLOTI NAGRI LETTER KHO' }, + [0xA809] = { unicodeslot=0xA809, category='lo', description='SYLOTI NAGRI LETTER GO' }, + [0xA80A] = { unicodeslot=0xA80A, category='lo', description='SYLOTI NAGRI LETTER GHO' }, + [0xA80B] = { unicodeslot=0xA80B, category='mn', description='SYLOTI NAGRI SIGN ANUSVARA' }, + [0xA80C] = { unicodeslot=0xA80C, category='lo', description='SYLOTI NAGRI LETTER CO' }, + [0xA80D] = { unicodeslot=0xA80D, category='lo', description='SYLOTI NAGRI LETTER CHO' }, + [0xA80E] = { unicodeslot=0xA80E, category='lo', description='SYLOTI NAGRI LETTER JO' }, + [0xA80F] = { unicodeslot=0xA80F, category='lo', description='SYLOTI NAGRI LETTER JHO' }, + [0xA810] = { unicodeslot=0xA810, category='lo', description='SYLOTI NAGRI LETTER TTO' }, + [0xA811] = { unicodeslot=0xA811, category='lo', description='SYLOTI NAGRI LETTER TTHO' }, + [0xA812] = { unicodeslot=0xA812, category='lo', description='SYLOTI NAGRI LETTER DDO' }, + [0xA813] = { unicodeslot=0xA813, category='lo', description='SYLOTI NAGRI LETTER DDHO' }, + [0xA814] = { unicodeslot=0xA814, category='lo', description='SYLOTI NAGRI LETTER TO' }, + [0xA815] = { unicodeslot=0xA815, category='lo', description='SYLOTI NAGRI LETTER THO' }, + [0xA816] = { unicodeslot=0xA816, category='lo', description='SYLOTI NAGRI LETTER DO' }, + [0xA817] = { unicodeslot=0xA817, category='lo', description='SYLOTI NAGRI LETTER DHO' }, + [0xA818] = { unicodeslot=0xA818, category='lo', description='SYLOTI NAGRI LETTER NO' }, + [0xA819] = { unicodeslot=0xA819, category='lo', description='SYLOTI NAGRI LETTER PO' }, + [0xA81A] = { unicodeslot=0xA81A, category='lo', description='SYLOTI NAGRI LETTER PHO' }, + [0xA81B] = { unicodeslot=0xA81B, category='lo', description='SYLOTI NAGRI LETTER BO' }, + [0xA81C] = { unicodeslot=0xA81C, category='lo', description='SYLOTI NAGRI LETTER BHO' }, + [0xA81D] = { unicodeslot=0xA81D, category='lo', description='SYLOTI NAGRI LETTER MO' }, + [0xA81E] = { unicodeslot=0xA81E, category='lo', description='SYLOTI NAGRI LETTER RO' }, + [0xA81F] = { unicodeslot=0xA81F, category='lo', description='SYLOTI NAGRI LETTER LO' }, + [0xA820] = { unicodeslot=0xA820, category='lo', description='SYLOTI NAGRI LETTER RRO' }, + [0xA821] = { unicodeslot=0xA821, category='lo', description='SYLOTI NAGRI LETTER SO' }, + [0xA822] = { unicodeslot=0xA822, category='lo', description='SYLOTI NAGRI LETTER HO' }, + [0xA823] = { unicodeslot=0xA823, category='mc', description='SYLOTI NAGRI VOWEL SIGN A' }, + [0xA824] = { unicodeslot=0xA824, category='mc', description='SYLOTI NAGRI VOWEL SIGN I' }, + [0xA825] = { unicodeslot=0xA825, category='mn', description='SYLOTI NAGRI VOWEL SIGN U' }, + [0xA826] = { unicodeslot=0xA826, category='mn', description='SYLOTI NAGRI VOWEL SIGN E' }, + [0xA827] = { unicodeslot=0xA827, category='mc', description='SYLOTI NAGRI VOWEL SIGN OO' }, + [0xA828] = { unicodeslot=0xA828, category='so', description='SYLOTI NAGRI POETRY MARK-1' }, + [0xA829] = { unicodeslot=0xA829, category='so', description='SYLOTI NAGRI POETRY MARK-2' }, + [0xA82A] = { unicodeslot=0xA82A, category='so', description='SYLOTI NAGRI POETRY MARK-3' }, + [0xA82B] = { unicodeslot=0xA82B, category='so', description='SYLOTI NAGRI POETRY MARK-4' }, + [0xA840] = { unicodeslot=0xA840, category='lo', description='PHAGS-PA LETTER KA' }, + [0xA841] = { unicodeslot=0xA841, category='lo', description='PHAGS-PA LETTER KHA' }, + [0xA842] = { unicodeslot=0xA842, category='lo', description='PHAGS-PA LETTER GA' }, + [0xA843] = { unicodeslot=0xA843, category='lo', description='PHAGS-PA LETTER NGA' }, + [0xA844] = { unicodeslot=0xA844, category='lo', description='PHAGS-PA LETTER CA' }, + [0xA845] = { unicodeslot=0xA845, category='lo', description='PHAGS-PA LETTER CHA' }, + [0xA846] = { unicodeslot=0xA846, category='lo', description='PHAGS-PA LETTER JA' }, + [0xA847] = { unicodeslot=0xA847, category='lo', description='PHAGS-PA LETTER NYA' }, + [0xA848] = { unicodeslot=0xA848, category='lo', description='PHAGS-PA LETTER TA' }, + [0xA849] = { unicodeslot=0xA849, category='lo', description='PHAGS-PA LETTER THA' }, + [0xA84A] = { unicodeslot=0xA84A, category='lo', description='PHAGS-PA LETTER DA' }, + [0xA84B] = { unicodeslot=0xA84B, category='lo', description='PHAGS-PA LETTER NA' }, + [0xA84C] = { unicodeslot=0xA84C, category='lo', description='PHAGS-PA LETTER PA' }, + [0xA84D] = { unicodeslot=0xA84D, category='lo', description='PHAGS-PA LETTER PHA' }, + [0xA84E] = { unicodeslot=0xA84E, category='lo', description='PHAGS-PA LETTER BA' }, + [0xA84F] = { unicodeslot=0xA84F, category='lo', description='PHAGS-PA LETTER MA' }, + [0xA850] = { unicodeslot=0xA850, category='lo', description='PHAGS-PA LETTER TSA' }, + [0xA851] = { unicodeslot=0xA851, category='lo', description='PHAGS-PA LETTER TSHA' }, + [0xA852] = { unicodeslot=0xA852, category='lo', description='PHAGS-PA LETTER DZA' }, + [0xA853] = { unicodeslot=0xA853, category='lo', description='PHAGS-PA LETTER WA' }, + [0xA854] = { unicodeslot=0xA854, category='lo', description='PHAGS-PA LETTER ZHA' }, + [0xA855] = { unicodeslot=0xA855, category='lo', description='PHAGS-PA LETTER ZA' }, + [0xA856] = { unicodeslot=0xA856, category='lo', description='PHAGS-PA LETTER SMALL A' }, + [0xA857] = { unicodeslot=0xA857, category='lo', description='PHAGS-PA LETTER YA' }, + [0xA858] = { unicodeslot=0xA858, category='lo', description='PHAGS-PA LETTER RA' }, + [0xA859] = { unicodeslot=0xA859, category='lo', description='PHAGS-PA LETTER LA' }, + [0xA85A] = { unicodeslot=0xA85A, category='lo', description='PHAGS-PA LETTER SHA' }, + [0xA85B] = { unicodeslot=0xA85B, category='lo', description='PHAGS-PA LETTER SA' }, + [0xA85C] = { unicodeslot=0xA85C, category='lo', description='PHAGS-PA LETTER HA' }, + [0xA85D] = { unicodeslot=0xA85D, category='lo', description='PHAGS-PA LETTER A' }, + [0xA85E] = { unicodeslot=0xA85E, category='lo', description='PHAGS-PA LETTER I' }, + [0xA85F] = { unicodeslot=0xA85F, category='lo', description='PHAGS-PA LETTER U' }, + [0xA860] = { unicodeslot=0xA860, category='lo', description='PHAGS-PA LETTER E' }, + [0xA861] = { unicodeslot=0xA861, category='lo', description='PHAGS-PA LETTER O' }, + [0xA862] = { unicodeslot=0xA862, category='lo', description='PHAGS-PA LETTER QA' }, + [0xA863] = { unicodeslot=0xA863, category='lo', description='PHAGS-PA LETTER XA' }, + [0xA864] = { unicodeslot=0xA864, category='lo', description='PHAGS-PA LETTER FA' }, + [0xA865] = { unicodeslot=0xA865, category='lo', description='PHAGS-PA LETTER GGA' }, + [0xA866] = { unicodeslot=0xA866, category='lo', description='PHAGS-PA LETTER EE' }, + [0xA867] = { unicodeslot=0xA867, category='lo', description='PHAGS-PA SUBJOINED LETTER WA' }, + [0xA868] = { unicodeslot=0xA868, category='lo', description='PHAGS-PA SUBJOINED LETTER YA' }, + [0xA869] = { unicodeslot=0xA869, category='lo', description='PHAGS-PA LETTER TTA' }, + [0xA86A] = { unicodeslot=0xA86A, category='lo', description='PHAGS-PA LETTER TTHA' }, + [0xA86B] = { unicodeslot=0xA86B, category='lo', description='PHAGS-PA LETTER DDA' }, + [0xA86C] = { unicodeslot=0xA86C, category='lo', description='PHAGS-PA LETTER NNA' }, + [0xA86D] = { unicodeslot=0xA86D, category='lo', description='PHAGS-PA LETTER ALTERNATE YA' }, + [0xA86E] = { unicodeslot=0xA86E, category='lo', description='PHAGS-PA LETTER VOICELESS SHA' }, + [0xA86F] = { unicodeslot=0xA86F, category='lo', description='PHAGS-PA LETTER VOICED HA' }, + [0xA870] = { unicodeslot=0xA870, category='lo', description='PHAGS-PA LETTER ASPIRATED FA' }, + [0xA871] = { unicodeslot=0xA871, category='lo', description='PHAGS-PA SUBJOINED LETTER RA' }, + [0xA872] = { unicodeslot=0xA872, category='lo', description='PHAGS-PA SUPERFIXED LETTER RA' }, + [0xA873] = { unicodeslot=0xA873, category='lo', description='PHAGS-PA LETTER CANDRABINDU' }, + [0xA874] = { unicodeslot=0xA874, category='po', description='PHAGS-PA SINGLE HEAD MARK' }, + [0xA875] = { unicodeslot=0xA875, category='po', description='PHAGS-PA DOUBLE HEAD MARK' }, + [0xA876] = { unicodeslot=0xA876, category='po', description='PHAGS-PA MARK SHAD' }, + [0xA877] = { unicodeslot=0xA877, category='po', description='PHAGS-PA MARK DOUBLE SHAD' }, + [0xAC00] = { unicodeslot=0xAC00, category='lo', description='' }, + [0xD7A3] = { unicodeslot=0xD7A3, category='lo', description='' }, + [0xD800] = { unicodeslot=0xD800, category='cs', description='' }, + [0xDB7F] = { unicodeslot=0xDB7F, category='cs', description='' }, + [0xDB80] = { unicodeslot=0xDB80, category='cs', description='' }, + [0xDBFF] = { unicodeslot=0xDBFF, category='cs', description='' }, + [0xDC00] = { unicodeslot=0xDC00, category='cs', description='' }, + [0xDFFF] = { unicodeslot=0xDFFF, category='cs', description='' }, + [0xE000] = { unicodeslot=0xE000, category='co', description='' }, + [0xF8FF] = { unicodeslot=0xF8FF, category='co', description='' }, + [0xF900] = { unicodeslot=0xF900, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F900', specials={'char',0x8C48} }, + [0xF901] = { unicodeslot=0xF901, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F901', specials={'char',0x66F4} }, + [0xF902] = { unicodeslot=0xF902, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F902', specials={'char',0x8ECA} }, + [0xF903] = { unicodeslot=0xF903, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F903', specials={'char',0x8CC8} }, + [0xF904] = { unicodeslot=0xF904, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F904', specials={'char',0x6ED1} }, + [0xF905] = { unicodeslot=0xF905, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F905', specials={'char',0x4E32} }, + [0xF906] = { unicodeslot=0xF906, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F906', specials={'char',0x53E5} }, + [0xF907] = { unicodeslot=0xF907, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F907', specials={'char',0x9F9C} }, + [0xF908] = { unicodeslot=0xF908, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F908', specials={'char',0x9F9C} }, + [0xF909] = { unicodeslot=0xF909, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F909', specials={'char',0x5951} }, + [0xF90A] = { unicodeslot=0xF90A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90A', specials={'char',0x91D1} }, + [0xF90B] = { unicodeslot=0xF90B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90B', specials={'char',0x5587} }, + [0xF90C] = { unicodeslot=0xF90C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90C', specials={'char',0x5948} }, + [0xF90D] = { unicodeslot=0xF90D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90D', specials={'char',0x61F6} }, + [0xF90E] = { unicodeslot=0xF90E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90E', specials={'char',0x7669} }, + [0xF90F] = { unicodeslot=0xF90F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F90F', specials={'char',0x7F85} }, + [0xF910] = { unicodeslot=0xF910, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F910', specials={'char',0x863F} }, + [0xF911] = { unicodeslot=0xF911, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F911', specials={'char',0x87BA} }, + [0xF912] = { unicodeslot=0xF912, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F912', specials={'char',0x88F8} }, + [0xF913] = { unicodeslot=0xF913, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F913', specials={'char',0x908F} }, + [0xF914] = { unicodeslot=0xF914, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F914', specials={'char',0x6A02} }, + [0xF915] = { unicodeslot=0xF915, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F915', specials={'char',0x6D1B} }, + [0xF916] = { unicodeslot=0xF916, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F916', specials={'char',0x70D9} }, + [0xF917] = { unicodeslot=0xF917, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F917', specials={'char',0x73DE} }, + [0xF918] = { unicodeslot=0xF918, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F918', specials={'char',0x843D} }, + [0xF919] = { unicodeslot=0xF919, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F919', specials={'char',0x916A} }, + [0xF91A] = { unicodeslot=0xF91A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91A', specials={'char',0x99F1} }, + [0xF91B] = { unicodeslot=0xF91B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91B', specials={'char',0x4E82} }, + [0xF91C] = { unicodeslot=0xF91C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91C', specials={'char',0x5375} }, + [0xF91D] = { unicodeslot=0xF91D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91D', specials={'char',0x6B04} }, + [0xF91E] = { unicodeslot=0xF91E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91E', specials={'char',0x721B} }, + [0xF91F] = { unicodeslot=0xF91F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F91F', specials={'char',0x862D} }, + [0xF920] = { unicodeslot=0xF920, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F920', specials={'char',0x9E1E} }, + [0xF921] = { unicodeslot=0xF921, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F921', specials={'char',0x5D50} }, + [0xF922] = { unicodeslot=0xF922, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F922', specials={'char',0x6FEB} }, + [0xF923] = { unicodeslot=0xF923, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F923', specials={'char',0x85CD} }, + [0xF924] = { unicodeslot=0xF924, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F924', specials={'char',0x8964} }, + [0xF925] = { unicodeslot=0xF925, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F925', specials={'char',0x62C9} }, + [0xF926] = { unicodeslot=0xF926, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F926', specials={'char',0x81D8} }, + [0xF927] = { unicodeslot=0xF927, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F927', specials={'char',0x881F} }, + [0xF928] = { unicodeslot=0xF928, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F928', specials={'char',0x5ECA} }, + [0xF929] = { unicodeslot=0xF929, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F929', specials={'char',0x6717} }, + [0xF92A] = { unicodeslot=0xF92A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92A', specials={'char',0x6D6A} }, + [0xF92B] = { unicodeslot=0xF92B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92B', specials={'char',0x72FC} }, + [0xF92C] = { unicodeslot=0xF92C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92C', specials={'char',0x90CE} }, + [0xF92D] = { unicodeslot=0xF92D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92D', specials={'char',0x4F86} }, + [0xF92E] = { unicodeslot=0xF92E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92E', specials={'char',0x51B7} }, + [0xF92F] = { unicodeslot=0xF92F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F92F', specials={'char',0x52DE} }, + [0xF930] = { unicodeslot=0xF930, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F930', specials={'char',0x64C4} }, + [0xF931] = { unicodeslot=0xF931, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F931', specials={'char',0x6AD3} }, + [0xF932] = { unicodeslot=0xF932, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F932', specials={'char',0x7210} }, + [0xF933] = { unicodeslot=0xF933, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F933', specials={'char',0x76E7} }, + [0xF934] = { unicodeslot=0xF934, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F934', specials={'char',0x8001} }, + [0xF935] = { unicodeslot=0xF935, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F935', specials={'char',0x8606} }, + [0xF936] = { unicodeslot=0xF936, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F936', specials={'char',0x865C} }, + [0xF937] = { unicodeslot=0xF937, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F937', specials={'char',0x8DEF} }, + [0xF938] = { unicodeslot=0xF938, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F938', specials={'char',0x9732} }, + [0xF939] = { unicodeslot=0xF939, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F939', specials={'char',0x9B6F} }, + [0xF93A] = { unicodeslot=0xF93A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93A', specials={'char',0x9DFA} }, + [0xF93B] = { unicodeslot=0xF93B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93B', specials={'char',0x788C} }, + [0xF93C] = { unicodeslot=0xF93C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93C', specials={'char',0x797F} }, + [0xF93D] = { unicodeslot=0xF93D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93D', specials={'char',0x7DA0} }, + [0xF93E] = { unicodeslot=0xF93E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93E', specials={'char',0x83C9} }, + [0xF93F] = { unicodeslot=0xF93F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F93F', specials={'char',0x9304} }, + [0xF940] = { unicodeslot=0xF940, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F940', specials={'char',0x9E7F} }, + [0xF941] = { unicodeslot=0xF941, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F941', specials={'char',0x8AD6} }, + [0xF942] = { unicodeslot=0xF942, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F942', specials={'char',0x58DF} }, + [0xF943] = { unicodeslot=0xF943, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F943', specials={'char',0x5F04} }, + [0xF944] = { unicodeslot=0xF944, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F944', specials={'char',0x7C60} }, + [0xF945] = { unicodeslot=0xF945, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F945', specials={'char',0x807E} }, + [0xF946] = { unicodeslot=0xF946, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F946', specials={'char',0x7262} }, + [0xF947] = { unicodeslot=0xF947, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F947', specials={'char',0x78CA} }, + [0xF948] = { unicodeslot=0xF948, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F948', specials={'char',0x8CC2} }, + [0xF949] = { unicodeslot=0xF949, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F949', specials={'char',0x96F7} }, + [0xF94A] = { unicodeslot=0xF94A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94A', specials={'char',0x58D8} }, + [0xF94B] = { unicodeslot=0xF94B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94B', specials={'char',0x5C62} }, + [0xF94C] = { unicodeslot=0xF94C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94C', specials={'char',0x6A13} }, + [0xF94D] = { unicodeslot=0xF94D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94D', specials={'char',0x6DDA} }, + [0xF94E] = { unicodeslot=0xF94E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94E', specials={'char',0x6F0F} }, + [0xF94F] = { unicodeslot=0xF94F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F94F', specials={'char',0x7D2F} }, + [0xF950] = { unicodeslot=0xF950, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F950', specials={'char',0x7E37} }, + [0xF951] = { unicodeslot=0xF951, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F951', specials={'char',0x964B} }, + [0xF952] = { unicodeslot=0xF952, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F952', specials={'char',0x52D2} }, + [0xF953] = { unicodeslot=0xF953, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F953', specials={'char',0x808B} }, + [0xF954] = { unicodeslot=0xF954, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F954', specials={'char',0x51DC} }, + [0xF955] = { unicodeslot=0xF955, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F955', specials={'char',0x51CC} }, + [0xF956] = { unicodeslot=0xF956, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F956', specials={'char',0x7A1C} }, + [0xF957] = { unicodeslot=0xF957, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F957', specials={'char',0x7DBE} }, + [0xF958] = { unicodeslot=0xF958, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F958', specials={'char',0x83F1} }, + [0xF959] = { unicodeslot=0xF959, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F959', specials={'char',0x9675} }, + [0xF95A] = { unicodeslot=0xF95A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95A', specials={'char',0x8B80} }, + [0xF95B] = { unicodeslot=0xF95B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95B', specials={'char',0x62CF} }, + [0xF95C] = { unicodeslot=0xF95C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95C', specials={'char',0x6A02} }, + [0xF95D] = { unicodeslot=0xF95D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95D', specials={'char',0x8AFE} }, + [0xF95E] = { unicodeslot=0xF95E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95E', specials={'char',0x4E39} }, + [0xF95F] = { unicodeslot=0xF95F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F95F', specials={'char',0x5BE7} }, + [0xF960] = { unicodeslot=0xF960, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F960', specials={'char',0x6012} }, + [0xF961] = { unicodeslot=0xF961, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F961', specials={'char',0x7387} }, + [0xF962] = { unicodeslot=0xF962, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F962', specials={'char',0x7570} }, + [0xF963] = { unicodeslot=0xF963, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F963', specials={'char',0x5317} }, + [0xF964] = { unicodeslot=0xF964, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F964', specials={'char',0x78FB} }, + [0xF965] = { unicodeslot=0xF965, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F965', specials={'char',0x4FBF} }, + [0xF966] = { unicodeslot=0xF966, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F966', specials={'char',0x5FA9} }, + [0xF967] = { unicodeslot=0xF967, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F967', specials={'char',0x4E0D} }, + [0xF968] = { unicodeslot=0xF968, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F968', specials={'char',0x6CCC} }, + [0xF969] = { unicodeslot=0xF969, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F969', specials={'char',0x6578} }, + [0xF96A] = { unicodeslot=0xF96A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96A', specials={'char',0x7D22} }, + [0xF96B] = { unicodeslot=0xF96B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96B', specials={'char',0x53C3} }, + [0xF96C] = { unicodeslot=0xF96C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96C', specials={'char',0x585E} }, + [0xF96D] = { unicodeslot=0xF96D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96D', specials={'char',0x7701} }, + [0xF96E] = { unicodeslot=0xF96E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96E', specials={'char',0x8449} }, + [0xF96F] = { unicodeslot=0xF96F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F96F', specials={'char',0x8AAA} }, + [0xF970] = { unicodeslot=0xF970, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F970', specials={'char',0x6BBA} }, + [0xF971] = { unicodeslot=0xF971, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F971', specials={'char',0x8FB0} }, + [0xF972] = { unicodeslot=0xF972, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F972', specials={'char',0x6C88} }, + [0xF973] = { unicodeslot=0xF973, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F973', specials={'char',0x62FE} }, + [0xF974] = { unicodeslot=0xF974, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F974', specials={'char',0x82E5} }, + [0xF975] = { unicodeslot=0xF975, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F975', specials={'char',0x63A0} }, + [0xF976] = { unicodeslot=0xF976, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F976', specials={'char',0x7565} }, + [0xF977] = { unicodeslot=0xF977, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F977', specials={'char',0x4EAE} }, + [0xF978] = { unicodeslot=0xF978, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F978', specials={'char',0x5169} }, + [0xF979] = { unicodeslot=0xF979, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F979', specials={'char',0x51C9} }, + [0xF97A] = { unicodeslot=0xF97A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97A', specials={'char',0x6881} }, + [0xF97B] = { unicodeslot=0xF97B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97B', specials={'char',0x7CE7} }, + [0xF97C] = { unicodeslot=0xF97C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97C', specials={'char',0x826F} }, + [0xF97D] = { unicodeslot=0xF97D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97D', specials={'char',0x8AD2} }, + [0xF97E] = { unicodeslot=0xF97E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97E', specials={'char',0x91CF} }, + [0xF97F] = { unicodeslot=0xF97F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F97F', specials={'char',0x52F5} }, + [0xF980] = { unicodeslot=0xF980, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F980', specials={'char',0x5442} }, + [0xF981] = { unicodeslot=0xF981, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F981', specials={'char',0x5973} }, + [0xF982] = { unicodeslot=0xF982, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F982', specials={'char',0x5EEC} }, + [0xF983] = { unicodeslot=0xF983, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F983', specials={'char',0x65C5} }, + [0xF984] = { unicodeslot=0xF984, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F984', specials={'char',0x6FFE} }, + [0xF985] = { unicodeslot=0xF985, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F985', specials={'char',0x792A} }, + [0xF986] = { unicodeslot=0xF986, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F986', specials={'char',0x95AD} }, + [0xF987] = { unicodeslot=0xF987, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F987', specials={'char',0x9A6A} }, + [0xF988] = { unicodeslot=0xF988, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F988', specials={'char',0x9E97} }, + [0xF989] = { unicodeslot=0xF989, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F989', specials={'char',0x9ECE} }, + [0xF98A] = { unicodeslot=0xF98A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98A', specials={'char',0x529B} }, + [0xF98B] = { unicodeslot=0xF98B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98B', specials={'char',0x66C6} }, + [0xF98C] = { unicodeslot=0xF98C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98C', specials={'char',0x6B77} }, + [0xF98D] = { unicodeslot=0xF98D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98D', specials={'char',0x8F62} }, + [0xF98E] = { unicodeslot=0xF98E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98E', specials={'char',0x5E74} }, + [0xF98F] = { unicodeslot=0xF98F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F98F', specials={'char',0x6190} }, + [0xF990] = { unicodeslot=0xF990, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F990', specials={'char',0x6200} }, + [0xF991] = { unicodeslot=0xF991, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F991', specials={'char',0x649A} }, + [0xF992] = { unicodeslot=0xF992, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F992', specials={'char',0x6F23} }, + [0xF993] = { unicodeslot=0xF993, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F993', specials={'char',0x7149} }, + [0xF994] = { unicodeslot=0xF994, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F994', specials={'char',0x7489} }, + [0xF995] = { unicodeslot=0xF995, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F995', specials={'char',0x79CA} }, + [0xF996] = { unicodeslot=0xF996, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F996', specials={'char',0x7DF4} }, + [0xF997] = { unicodeslot=0xF997, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F997', specials={'char',0x806F} }, + [0xF998] = { unicodeslot=0xF998, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F998', specials={'char',0x8F26} }, + [0xF999] = { unicodeslot=0xF999, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F999', specials={'char',0x84EE} }, + [0xF99A] = { unicodeslot=0xF99A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99A', specials={'char',0x9023} }, + [0xF99B] = { unicodeslot=0xF99B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99B', specials={'char',0x934A} }, + [0xF99C] = { unicodeslot=0xF99C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99C', specials={'char',0x5217} }, + [0xF99D] = { unicodeslot=0xF99D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99D', specials={'char',0x52A3} }, + [0xF99E] = { unicodeslot=0xF99E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99E', specials={'char',0x54BD} }, + [0xF99F] = { unicodeslot=0xF99F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F99F', specials={'char',0x70C8} }, + [0xF9A0] = { unicodeslot=0xF9A0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A0', specials={'char',0x88C2} }, + [0xF9A1] = { unicodeslot=0xF9A1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A1', specials={'char',0x8AAA} }, + [0xF9A2] = { unicodeslot=0xF9A2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A2', specials={'char',0x5EC9} }, + [0xF9A3] = { unicodeslot=0xF9A3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A3', specials={'char',0x5FF5} }, + [0xF9A4] = { unicodeslot=0xF9A4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A4', specials={'char',0x637B} }, + [0xF9A5] = { unicodeslot=0xF9A5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A5', specials={'char',0x6BAE} }, + [0xF9A6] = { unicodeslot=0xF9A6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A6', specials={'char',0x7C3E} }, + [0xF9A7] = { unicodeslot=0xF9A7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A7', specials={'char',0x7375} }, + [0xF9A8] = { unicodeslot=0xF9A8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A8', specials={'char',0x4EE4} }, + [0xF9A9] = { unicodeslot=0xF9A9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9A9', specials={'char',0x56F9} }, + [0xF9AA] = { unicodeslot=0xF9AA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AA', specials={'char',0x5BE7} }, + [0xF9AB] = { unicodeslot=0xF9AB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AB', specials={'char',0x5DBA} }, + [0xF9AC] = { unicodeslot=0xF9AC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AC', specials={'char',0x601C} }, + [0xF9AD] = { unicodeslot=0xF9AD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AD', specials={'char',0x73B2} }, + [0xF9AE] = { unicodeslot=0xF9AE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AE', specials={'char',0x7469} }, + [0xF9AF] = { unicodeslot=0xF9AF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9AF', specials={'char',0x7F9A} }, + [0xF9B0] = { unicodeslot=0xF9B0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B0', specials={'char',0x8046} }, + [0xF9B1] = { unicodeslot=0xF9B1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B1', specials={'char',0x9234} }, + [0xF9B2] = { unicodeslot=0xF9B2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B2', specials={'char',0x96F6} }, + [0xF9B3] = { unicodeslot=0xF9B3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B3', specials={'char',0x9748} }, + [0xF9B4] = { unicodeslot=0xF9B4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B4', specials={'char',0x9818} }, + [0xF9B5] = { unicodeslot=0xF9B5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B5', specials={'char',0x4F8B} }, + [0xF9B6] = { unicodeslot=0xF9B6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B6', specials={'char',0x79AE} }, + [0xF9B7] = { unicodeslot=0xF9B7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B7', specials={'char',0x91B4} }, + [0xF9B8] = { unicodeslot=0xF9B8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B8', specials={'char',0x96B8} }, + [0xF9B9] = { unicodeslot=0xF9B9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9B9', specials={'char',0x60E1} }, + [0xF9BA] = { unicodeslot=0xF9BA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BA', specials={'char',0x4E86} }, + [0xF9BB] = { unicodeslot=0xF9BB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BB', specials={'char',0x50DA} }, + [0xF9BC] = { unicodeslot=0xF9BC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BC', specials={'char',0x5BEE} }, + [0xF9BD] = { unicodeslot=0xF9BD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BD', specials={'char',0x5C3F} }, + [0xF9BE] = { unicodeslot=0xF9BE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BE', specials={'char',0x6599} }, + [0xF9BF] = { unicodeslot=0xF9BF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9BF', specials={'char',0x6A02} }, + [0xF9C0] = { unicodeslot=0xF9C0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C0', specials={'char',0x71CE} }, + [0xF9C1] = { unicodeslot=0xF9C1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C1', specials={'char',0x7642} }, + [0xF9C2] = { unicodeslot=0xF9C2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C2', specials={'char',0x84FC} }, + [0xF9C3] = { unicodeslot=0xF9C3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C3', specials={'char',0x907C} }, + [0xF9C4] = { unicodeslot=0xF9C4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C4', specials={'char',0x9F8D} }, + [0xF9C5] = { unicodeslot=0xF9C5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C5', specials={'char',0x6688} }, + [0xF9C6] = { unicodeslot=0xF9C6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C6', specials={'char',0x962E} }, + [0xF9C7] = { unicodeslot=0xF9C7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C7', specials={'char',0x5289} }, + [0xF9C8] = { unicodeslot=0xF9C8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C8', specials={'char',0x677B} }, + [0xF9C9] = { unicodeslot=0xF9C9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9C9', specials={'char',0x67F3} }, + [0xF9CA] = { unicodeslot=0xF9CA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CA', specials={'char',0x6D41} }, + [0xF9CB] = { unicodeslot=0xF9CB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CB', specials={'char',0x6E9C} }, + [0xF9CC] = { unicodeslot=0xF9CC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CC', specials={'char',0x7409} }, + [0xF9CD] = { unicodeslot=0xF9CD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CD', specials={'char',0x7559} }, + [0xF9CE] = { unicodeslot=0xF9CE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CE', specials={'char',0x786B} }, + [0xF9CF] = { unicodeslot=0xF9CF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9CF', specials={'char',0x7D10} }, + [0xF9D0] = { unicodeslot=0xF9D0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D0', specials={'char',0x985E} }, + [0xF9D1] = { unicodeslot=0xF9D1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D1', specials={'char',0x516D} }, + [0xF9D2] = { unicodeslot=0xF9D2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D2', specials={'char',0x622E} }, + [0xF9D3] = { unicodeslot=0xF9D3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D3', specials={'char',0x9678} }, + [0xF9D4] = { unicodeslot=0xF9D4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D4', specials={'char',0x502B} }, + [0xF9D5] = { unicodeslot=0xF9D5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D5', specials={'char',0x5D19} }, + [0xF9D6] = { unicodeslot=0xF9D6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D6', specials={'char',0x6DEA} }, + [0xF9D7] = { unicodeslot=0xF9D7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D7', specials={'char',0x8F2A} }, + [0xF9D8] = { unicodeslot=0xF9D8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D8', specials={'char',0x5F8B} }, + [0xF9D9] = { unicodeslot=0xF9D9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9D9', specials={'char',0x6144} }, + [0xF9DA] = { unicodeslot=0xF9DA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DA', specials={'char',0x6817} }, + [0xF9DB] = { unicodeslot=0xF9DB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DB', specials={'char',0x7387} }, + [0xF9DC] = { unicodeslot=0xF9DC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DC', specials={'char',0x9686} }, + [0xF9DD] = { unicodeslot=0xF9DD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DD', specials={'char',0x5229} }, + [0xF9DE] = { unicodeslot=0xF9DE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DE', specials={'char',0x540F} }, + [0xF9DF] = { unicodeslot=0xF9DF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9DF', specials={'char',0x5C65} }, + [0xF9E0] = { unicodeslot=0xF9E0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E0', specials={'char',0x6613} }, + [0xF9E1] = { unicodeslot=0xF9E1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E1', specials={'char',0x674E} }, + [0xF9E2] = { unicodeslot=0xF9E2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E2', specials={'char',0x68A8} }, + [0xF9E3] = { unicodeslot=0xF9E3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E3', specials={'char',0x6CE5} }, + [0xF9E4] = { unicodeslot=0xF9E4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E4', specials={'char',0x7406} }, + [0xF9E5] = { unicodeslot=0xF9E5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E5', specials={'char',0x75E2} }, + [0xF9E6] = { unicodeslot=0xF9E6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E6', specials={'char',0x7F79} }, + [0xF9E7] = { unicodeslot=0xF9E7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E7', specials={'char',0x88CF} }, + [0xF9E8] = { unicodeslot=0xF9E8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E8', specials={'char',0x88E1} }, + [0xF9E9] = { unicodeslot=0xF9E9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9E9', specials={'char',0x91CC} }, + [0xF9EA] = { unicodeslot=0xF9EA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9EA', specials={'char',0x96E2} }, + [0xF9EB] = { unicodeslot=0xF9EB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9EB', specials={'char',0x533F} }, + [0xF9EC] = { unicodeslot=0xF9EC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9EC', specials={'char',0x6EBA} }, + [0xF9ED] = { unicodeslot=0xF9ED, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9ED', specials={'char',0x541D} }, + [0xF9EE] = { unicodeslot=0xF9EE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9EE', specials={'char',0x71D0} }, + [0xF9EF] = { unicodeslot=0xF9EF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9EF', specials={'char',0x7498} }, + [0xF9F0] = { unicodeslot=0xF9F0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F0', specials={'char',0x85FA} }, + [0xF9F1] = { unicodeslot=0xF9F1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F1', specials={'char',0x96A3} }, + [0xF9F2] = { unicodeslot=0xF9F2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F2', specials={'char',0x9C57} }, + [0xF9F3] = { unicodeslot=0xF9F3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F3', specials={'char',0x9E9F} }, + [0xF9F4] = { unicodeslot=0xF9F4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F4', specials={'char',0x6797} }, + [0xF9F5] = { unicodeslot=0xF9F5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F5', specials={'char',0x6DCB} }, + [0xF9F6] = { unicodeslot=0xF9F6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F6', specials={'char',0x81E8} }, + [0xF9F7] = { unicodeslot=0xF9F7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F7', specials={'char',0x7ACB} }, + [0xF9F8] = { unicodeslot=0xF9F8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F8', specials={'char',0x7B20} }, + [0xF9F9] = { unicodeslot=0xF9F9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9F9', specials={'char',0x7C92} }, + [0xF9FA] = { unicodeslot=0xF9FA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FA', specials={'char',0x72C0} }, + [0xF9FB] = { unicodeslot=0xF9FB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FB', specials={'char',0x7099} }, + [0xF9FC] = { unicodeslot=0xF9FC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FC', specials={'char',0x8B58} }, + [0xF9FD] = { unicodeslot=0xF9FD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FD', specials={'char',0x4EC0} }, + [0xF9FE] = { unicodeslot=0xF9FE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FE', specials={'char',0x8336} }, + [0xF9FF] = { unicodeslot=0xF9FF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-F9FF', specials={'char',0x523A} }, + [0xFA00] = { unicodeslot=0xFA00, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA00', specials={'char',0x5207} }, + [0xFA01] = { unicodeslot=0xFA01, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA01', specials={'char',0x5EA6} }, + [0xFA02] = { unicodeslot=0xFA02, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA02', specials={'char',0x62D3} }, + [0xFA03] = { unicodeslot=0xFA03, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA03', specials={'char',0x7CD6} }, + [0xFA04] = { unicodeslot=0xFA04, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA04', specials={'char',0x5B85} }, + [0xFA05] = { unicodeslot=0xFA05, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA05', specials={'char',0x6D1E} }, + [0xFA06] = { unicodeslot=0xFA06, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA06', specials={'char',0x66B4} }, + [0xFA07] = { unicodeslot=0xFA07, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA07', specials={'char',0x8F3B} }, + [0xFA08] = { unicodeslot=0xFA08, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA08', specials={'char',0x884C} }, + [0xFA09] = { unicodeslot=0xFA09, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA09', specials={'char',0x964D} }, + [0xFA0A] = { unicodeslot=0xFA0A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0A', specials={'char',0x898B} }, + [0xFA0B] = { unicodeslot=0xFA0B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0B', specials={'char',0x5ED3} }, + [0xFA0C] = { unicodeslot=0xFA0C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0C', specials={'char',0x5140} }, + [0xFA0D] = { unicodeslot=0xFA0D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0D', specials={'char',0x55C0} }, + [0xFA0E] = { unicodeslot=0xFA0E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0E' }, + [0xFA0F] = { unicodeslot=0xFA0F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA0F' }, + [0xFA10] = { unicodeslot=0xFA10, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA10', specials={'char',0x585A} }, + [0xFA11] = { unicodeslot=0xFA11, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA11' }, + [0xFA12] = { unicodeslot=0xFA12, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA12', specials={'char',0x6674} }, + [0xFA13] = { unicodeslot=0xFA13, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA13' }, + [0xFA14] = { unicodeslot=0xFA14, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA14' }, + [0xFA15] = { unicodeslot=0xFA15, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA15', specials={'char',0x51DE} }, + [0xFA16] = { unicodeslot=0xFA16, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA16', specials={'char',0x732A} }, + [0xFA17] = { unicodeslot=0xFA17, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA17', specials={'char',0x76CA} }, + [0xFA18] = { unicodeslot=0xFA18, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA18', specials={'char',0x793C} }, + [0xFA19] = { unicodeslot=0xFA19, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA19', specials={'char',0x795E} }, + [0xFA1A] = { unicodeslot=0xFA1A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1A', specials={'char',0x7965} }, + [0xFA1B] = { unicodeslot=0xFA1B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1B', specials={'char',0x798F} }, + [0xFA1C] = { unicodeslot=0xFA1C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1C', specials={'char',0x9756} }, + [0xFA1D] = { unicodeslot=0xFA1D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1D', specials={'char',0x7CBE} }, + [0xFA1E] = { unicodeslot=0xFA1E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1E', specials={'char',0x7FBD} }, + [0xFA1F] = { unicodeslot=0xFA1F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA1F' }, + [0xFA20] = { unicodeslot=0xFA20, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA20', specials={'char',0x8612} }, + [0xFA21] = { unicodeslot=0xFA21, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA21' }, + [0xFA22] = { unicodeslot=0xFA22, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA22', specials={'char',0x8AF8} }, + [0xFA23] = { unicodeslot=0xFA23, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA23' }, + [0xFA24] = { unicodeslot=0xFA24, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA24' }, + [0xFA25] = { unicodeslot=0xFA25, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA25', specials={'char',0x9038} }, + [0xFA26] = { unicodeslot=0xFA26, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA26', specials={'char',0x90FD} }, + [0xFA27] = { unicodeslot=0xFA27, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA27' }, + [0xFA28] = { unicodeslot=0xFA28, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA28' }, + [0xFA29] = { unicodeslot=0xFA29, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA29' }, + [0xFA2A] = { unicodeslot=0xFA2A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA2A', specials={'char',0x98EF} }, + [0xFA2B] = { unicodeslot=0xFA2B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA2B', specials={'char',0x98FC} }, + [0xFA2C] = { unicodeslot=0xFA2C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA2C', specials={'char',0x9928} }, + [0xFA2D] = { unicodeslot=0xFA2D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA2D', specials={'char',0x9DB4} }, + [0xFA30] = { unicodeslot=0xFA30, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA30', specials={'char',0x4FAE} }, + [0xFA31] = { unicodeslot=0xFA31, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA31', specials={'char',0x50E7} }, + [0xFA32] = { unicodeslot=0xFA32, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA32', specials={'char',0x514D} }, + [0xFA33] = { unicodeslot=0xFA33, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA33', specials={'char',0x52C9} }, + [0xFA34] = { unicodeslot=0xFA34, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA34', specials={'char',0x52E4} }, + [0xFA35] = { unicodeslot=0xFA35, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA35', specials={'char',0x5351} }, + [0xFA36] = { unicodeslot=0xFA36, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA36', specials={'char',0x559D} }, + [0xFA37] = { unicodeslot=0xFA37, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA37', specials={'char',0x5606} }, + [0xFA38] = { unicodeslot=0xFA38, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA38', specials={'char',0x5668} }, + [0xFA39] = { unicodeslot=0xFA39, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA39', specials={'char',0x5840} }, + [0xFA3A] = { unicodeslot=0xFA3A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3A', specials={'char',0x58A8} }, + [0xFA3B] = { unicodeslot=0xFA3B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3B', specials={'char',0x5C64} }, + [0xFA3C] = { unicodeslot=0xFA3C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3C', specials={'char',0x5C6E} }, + [0xFA3D] = { unicodeslot=0xFA3D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3D', specials={'char',0x6094} }, + [0xFA3E] = { unicodeslot=0xFA3E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3E', specials={'char',0x6168} }, + [0xFA3F] = { unicodeslot=0xFA3F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA3F', specials={'char',0x618E} }, + [0xFA40] = { unicodeslot=0xFA40, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA40', specials={'char',0x61F2} }, + [0xFA41] = { unicodeslot=0xFA41, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA41', specials={'char',0x654F} }, + [0xFA42] = { unicodeslot=0xFA42, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA42', specials={'char',0x65E2} }, + [0xFA43] = { unicodeslot=0xFA43, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA43', specials={'char',0x6691} }, + [0xFA44] = { unicodeslot=0xFA44, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA44', specials={'char',0x6885} }, + [0xFA45] = { unicodeslot=0xFA45, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA45', specials={'char',0x6D77} }, + [0xFA46] = { unicodeslot=0xFA46, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA46', specials={'char',0x6E1A} }, + [0xFA47] = { unicodeslot=0xFA47, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA47', specials={'char',0x6F22} }, + [0xFA48] = { unicodeslot=0xFA48, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA48', specials={'char',0x716E} }, + [0xFA49] = { unicodeslot=0xFA49, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA49', specials={'char',0x722B} }, + [0xFA4A] = { unicodeslot=0xFA4A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4A', specials={'char',0x7422} }, + [0xFA4B] = { unicodeslot=0xFA4B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4B', specials={'char',0x7891} }, + [0xFA4C] = { unicodeslot=0xFA4C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4C', specials={'char',0x793E} }, + [0xFA4D] = { unicodeslot=0xFA4D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4D', specials={'char',0x7949} }, + [0xFA4E] = { unicodeslot=0xFA4E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4E', specials={'char',0x7948} }, + [0xFA4F] = { unicodeslot=0xFA4F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA4F', specials={'char',0x7950} }, + [0xFA50] = { unicodeslot=0xFA50, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA50', specials={'char',0x7956} }, + [0xFA51] = { unicodeslot=0xFA51, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA51', specials={'char',0x795D} }, + [0xFA52] = { unicodeslot=0xFA52, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA52', specials={'char',0x798D} }, + [0xFA53] = { unicodeslot=0xFA53, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA53', specials={'char',0x798E} }, + [0xFA54] = { unicodeslot=0xFA54, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA54', specials={'char',0x7A40} }, + [0xFA55] = { unicodeslot=0xFA55, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA55', specials={'char',0x7A81} }, + [0xFA56] = { unicodeslot=0xFA56, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA56', specials={'char',0x7BC0} }, + [0xFA57] = { unicodeslot=0xFA57, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA57', specials={'char',0x7DF4} }, + [0xFA58] = { unicodeslot=0xFA58, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA58', specials={'char',0x7E09} }, + [0xFA59] = { unicodeslot=0xFA59, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA59', specials={'char',0x7E41} }, + [0xFA5A] = { unicodeslot=0xFA5A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5A', specials={'char',0x7F72} }, + [0xFA5B] = { unicodeslot=0xFA5B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5B', specials={'char',0x8005} }, + [0xFA5C] = { unicodeslot=0xFA5C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5C', specials={'char',0x81ED} }, + [0xFA5D] = { unicodeslot=0xFA5D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5D', specials={'char',0x8279} }, + [0xFA5E] = { unicodeslot=0xFA5E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5E', specials={'char',0x8279} }, + [0xFA5F] = { unicodeslot=0xFA5F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA5F', specials={'char',0x8457} }, + [0xFA60] = { unicodeslot=0xFA60, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA60', specials={'char',0x8910} }, + [0xFA61] = { unicodeslot=0xFA61, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA61', specials={'char',0x8996} }, + [0xFA62] = { unicodeslot=0xFA62, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA62', specials={'char',0x8B01} }, + [0xFA63] = { unicodeslot=0xFA63, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA63', specials={'char',0x8B39} }, + [0xFA64] = { unicodeslot=0xFA64, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA64', specials={'char',0x8CD3} }, + [0xFA65] = { unicodeslot=0xFA65, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA65', specials={'char',0x8D08} }, + [0xFA66] = { unicodeslot=0xFA66, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA66', specials={'char',0x8FB6} }, + [0xFA67] = { unicodeslot=0xFA67, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA67', specials={'char',0x9038} }, + [0xFA68] = { unicodeslot=0xFA68, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA68', specials={'char',0x96E3} }, + [0xFA69] = { unicodeslot=0xFA69, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA69', specials={'char',0x97FF} }, + [0xFA6A] = { unicodeslot=0xFA6A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA6A', specials={'char',0x983B} }, + [0xFA70] = { unicodeslot=0xFA70, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA70', specials={'char',0x4E26} }, + [0xFA71] = { unicodeslot=0xFA71, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA71', specials={'char',0x51B5} }, + [0xFA72] = { unicodeslot=0xFA72, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA72', specials={'char',0x5168} }, + [0xFA73] = { unicodeslot=0xFA73, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA73', specials={'char',0x4F80} }, + [0xFA74] = { unicodeslot=0xFA74, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA74', specials={'char',0x5145} }, + [0xFA75] = { unicodeslot=0xFA75, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA75', specials={'char',0x5180} }, + [0xFA76] = { unicodeslot=0xFA76, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA76', specials={'char',0x52C7} }, + [0xFA77] = { unicodeslot=0xFA77, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA77', specials={'char',0x52FA} }, + [0xFA78] = { unicodeslot=0xFA78, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA78', specials={'char',0x559D} }, + [0xFA79] = { unicodeslot=0xFA79, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA79', specials={'char',0x5555} }, + [0xFA7A] = { unicodeslot=0xFA7A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7A', specials={'char',0x5599} }, + [0xFA7B] = { unicodeslot=0xFA7B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7B', specials={'char',0x55E2} }, + [0xFA7C] = { unicodeslot=0xFA7C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7C', specials={'char',0x585A} }, + [0xFA7D] = { unicodeslot=0xFA7D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7D', specials={'char',0x58B3} }, + [0xFA7E] = { unicodeslot=0xFA7E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7E', specials={'char',0x5944} }, + [0xFA7F] = { unicodeslot=0xFA7F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA7F', specials={'char',0x5954} }, + [0xFA80] = { unicodeslot=0xFA80, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA80', specials={'char',0x5A62} }, + [0xFA81] = { unicodeslot=0xFA81, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA81', specials={'char',0x5B28} }, + [0xFA82] = { unicodeslot=0xFA82, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA82', specials={'char',0x5ED2} }, + [0xFA83] = { unicodeslot=0xFA83, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA83', specials={'char',0x5ED9} }, + [0xFA84] = { unicodeslot=0xFA84, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA84', specials={'char',0x5F69} }, + [0xFA85] = { unicodeslot=0xFA85, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA85', specials={'char',0x5FAD} }, + [0xFA86] = { unicodeslot=0xFA86, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA86', specials={'char',0x60D8} }, + [0xFA87] = { unicodeslot=0xFA87, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA87', specials={'char',0x614E} }, + [0xFA88] = { unicodeslot=0xFA88, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA88', specials={'char',0x6108} }, + [0xFA89] = { unicodeslot=0xFA89, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA89', specials={'char',0x618E} }, + [0xFA8A] = { unicodeslot=0xFA8A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8A', specials={'char',0x6160} }, + [0xFA8B] = { unicodeslot=0xFA8B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8B', specials={'char',0x61F2} }, + [0xFA8C] = { unicodeslot=0xFA8C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8C', specials={'char',0x6234} }, + [0xFA8D] = { unicodeslot=0xFA8D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8D', specials={'char',0x63C4} }, + [0xFA8E] = { unicodeslot=0xFA8E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8E', specials={'char',0x641C} }, + [0xFA8F] = { unicodeslot=0xFA8F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA8F', specials={'char',0x6452} }, + [0xFA90] = { unicodeslot=0xFA90, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA90', specials={'char',0x6556} }, + [0xFA91] = { unicodeslot=0xFA91, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA91', specials={'char',0x6674} }, + [0xFA92] = { unicodeslot=0xFA92, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA92', specials={'char',0x6717} }, + [0xFA93] = { unicodeslot=0xFA93, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA93', specials={'char',0x671B} }, + [0xFA94] = { unicodeslot=0xFA94, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA94', specials={'char',0x6756} }, + [0xFA95] = { unicodeslot=0xFA95, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA95', specials={'char',0x6B79} }, + [0xFA96] = { unicodeslot=0xFA96, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA96', specials={'char',0x6BBA} }, + [0xFA97] = { unicodeslot=0xFA97, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA97', specials={'char',0x6D41} }, + [0xFA98] = { unicodeslot=0xFA98, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA98', specials={'char',0x6EDB} }, + [0xFA99] = { unicodeslot=0xFA99, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA99', specials={'char',0x6ECB} }, + [0xFA9A] = { unicodeslot=0xFA9A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9A', specials={'char',0x6F22} }, + [0xFA9B] = { unicodeslot=0xFA9B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9B', specials={'char',0x701E} }, + [0xFA9C] = { unicodeslot=0xFA9C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9C', specials={'char',0x716E} }, + [0xFA9D] = { unicodeslot=0xFA9D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9D', specials={'char',0x77A7} }, + [0xFA9E] = { unicodeslot=0xFA9E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9E', specials={'char',0x7235} }, + [0xFA9F] = { unicodeslot=0xFA9F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FA9F', specials={'char',0x72AF} }, + [0xFAA0] = { unicodeslot=0xFAA0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA0', specials={'char',0x732A} }, + [0xFAA1] = { unicodeslot=0xFAA1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA1', specials={'char',0x7471} }, + [0xFAA2] = { unicodeslot=0xFAA2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA2', specials={'char',0x7506} }, + [0xFAA3] = { unicodeslot=0xFAA3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA3', specials={'char',0x753B} }, + [0xFAA4] = { unicodeslot=0xFAA4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA4', specials={'char',0x761D} }, + [0xFAA5] = { unicodeslot=0xFAA5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA5', specials={'char',0x761F} }, + [0xFAA6] = { unicodeslot=0xFAA6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA6', specials={'char',0x76CA} }, + [0xFAA7] = { unicodeslot=0xFAA7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA7', specials={'char',0x76DB} }, + [0xFAA8] = { unicodeslot=0xFAA8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA8', specials={'char',0x76F4} }, + [0xFAA9] = { unicodeslot=0xFAA9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAA9', specials={'char',0x774A} }, + [0xFAAA] = { unicodeslot=0xFAAA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAA', specials={'char',0x7740} }, + [0xFAAB] = { unicodeslot=0xFAAB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAB', specials={'char',0x78CC} }, + [0xFAAC] = { unicodeslot=0xFAAC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAC', specials={'char',0x7AB1} }, + [0xFAAD] = { unicodeslot=0xFAAD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAD', specials={'char',0x7BC0} }, + [0xFAAE] = { unicodeslot=0xFAAE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAE', specials={'char',0x7C7B} }, + [0xFAAF] = { unicodeslot=0xFAAF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAAF', specials={'char',0x7D5B} }, + [0xFAB0] = { unicodeslot=0xFAB0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB0', specials={'char',0x7DF4} }, + [0xFAB1] = { unicodeslot=0xFAB1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB1', specials={'char',0x7F3E} }, + [0xFAB2] = { unicodeslot=0xFAB2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB2', specials={'char',0x8005} }, + [0xFAB3] = { unicodeslot=0xFAB3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB3', specials={'char',0x8352} }, + [0xFAB4] = { unicodeslot=0xFAB4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB4', specials={'char',0x83EF} }, + [0xFAB5] = { unicodeslot=0xFAB5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB5', specials={'char',0x8779} }, + [0xFAB6] = { unicodeslot=0xFAB6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB6', specials={'char',0x8941} }, + [0xFAB7] = { unicodeslot=0xFAB7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB7', specials={'char',0x8986} }, + [0xFAB8] = { unicodeslot=0xFAB8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB8', specials={'char',0x8996} }, + [0xFAB9] = { unicodeslot=0xFAB9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAB9', specials={'char',0x8ABF} }, + [0xFABA] = { unicodeslot=0xFABA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABA', specials={'char',0x8AF8} }, + [0xFABB] = { unicodeslot=0xFABB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABB', specials={'char',0x8ACB} }, + [0xFABC] = { unicodeslot=0xFABC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABC', specials={'char',0x8B01} }, + [0xFABD] = { unicodeslot=0xFABD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABD', specials={'char',0x8AFE} }, + [0xFABE] = { unicodeslot=0xFABE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABE', specials={'char',0x8AED} }, + [0xFABF] = { unicodeslot=0xFABF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FABF', specials={'char',0x8B39} }, + [0xFAC0] = { unicodeslot=0xFAC0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC0', specials={'char',0x8B8A} }, + [0xFAC1] = { unicodeslot=0xFAC1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC1', specials={'char',0x8D08} }, + [0xFAC2] = { unicodeslot=0xFAC2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC2', specials={'char',0x8F38} }, + [0xFAC3] = { unicodeslot=0xFAC3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC3', specials={'char',0x9072} }, + [0xFAC4] = { unicodeslot=0xFAC4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC4', specials={'char',0x9199} }, + [0xFAC5] = { unicodeslot=0xFAC5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC5', specials={'char',0x9276} }, + [0xFAC6] = { unicodeslot=0xFAC6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC6', specials={'char',0x967C} }, + [0xFAC7] = { unicodeslot=0xFAC7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC7', specials={'char',0x96E3} }, + [0xFAC8] = { unicodeslot=0xFAC8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC8', specials={'char',0x9756} }, + [0xFAC9] = { unicodeslot=0xFAC9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAC9', specials={'char',0x97DB} }, + [0xFACA] = { unicodeslot=0xFACA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACA', specials={'char',0x97FF} }, + [0xFACB] = { unicodeslot=0xFACB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACB', specials={'char',0x980B} }, + [0xFACC] = { unicodeslot=0xFACC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACC', specials={'char',0x983B} }, + [0xFACD] = { unicodeslot=0xFACD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACD', specials={'char',0x9B12} }, + [0xFACE] = { unicodeslot=0xFACE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACE', specials={'char',0x9F9C} }, + [0xFACF] = { unicodeslot=0xFACF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FACF', specials={'char',0x2284A} }, + [0xFAD0] = { unicodeslot=0xFAD0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD0', specials={'char',0x22844} }, + [0xFAD1] = { unicodeslot=0xFAD1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD1', specials={'char',0x233D5} }, + [0xFAD2] = { unicodeslot=0xFAD2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD2', specials={'char',0x3B9D} }, + [0xFAD3] = { unicodeslot=0xFAD3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD3', specials={'char',0x4018} }, + [0xFAD4] = { unicodeslot=0xFAD4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD4', specials={'char',0x4039} }, + [0xFAD5] = { unicodeslot=0xFAD5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD5', specials={'char',0x25249} }, + [0xFAD6] = { unicodeslot=0xFAD6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD6', specials={'char',0x25CD0} }, + [0xFAD7] = { unicodeslot=0xFAD7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD7', specials={'char',0x27ED3} }, + [0xFAD8] = { unicodeslot=0xFAD8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD8', specials={'char',0x9F43} }, + [0xFAD9] = { unicodeslot=0xFAD9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-FAD9', specials={'char',0x9F8E} }, + [0xFB00] = { unicodeslot=0xFB00, category='ll', contextname='ffligature', description='LATIN SMALL LIGATURE FF', specials={'compat',0x0066,0x0066} }, + [0xFB01] = { unicodeslot=0xFB01, category='ll', contextname='filigature', description='LATIN SMALL LIGATURE FI', specials={'compat',0x0066,0x0069} }, + [0xFB02] = { unicodeslot=0xFB02, category='ll', contextname='flligature', description='LATIN SMALL LIGATURE FL', specials={'compat',0x0066,0x006C} }, + [0xFB03] = { unicodeslot=0xFB03, category='ll', contextname='ffiligature', description='LATIN SMALL LIGATURE FFI', specials={'compat',0x0066,0x0066,0x0069} }, + [0xFB04] = { unicodeslot=0xFB04, category='ll', contextname='fflligature', description='LATIN SMALL LIGATURE FFL', specials={'compat',0x0066,0x0066,0x006C} }, + [0xFB05] = { unicodeslot=0xFB05, category='ll', description='LATIN SMALL LIGATURE LONG S T', specials={'compat',0x017F,0x0074} }, + [0xFB06] = { unicodeslot=0xFB06, category='ll', contextname='stligature', description='LATIN SMALL LIGATURE ST', specials={'compat',0x0073,0x0074} }, + [0xFB13] = { unicodeslot=0xFB13, category='ll', description='ARMENIAN SMALL LIGATURE MEN NOW', specials={'compat',0x0574,0x0576} }, + [0xFB14] = { unicodeslot=0xFB14, category='ll', description='ARMENIAN SMALL LIGATURE MEN ECH', specials={'compat',0x0574,0x0565} }, + [0xFB15] = { unicodeslot=0xFB15, category='ll', description='ARMENIAN SMALL LIGATURE MEN INI', specials={'compat',0x0574,0x056B} }, + [0xFB16] = { unicodeslot=0xFB16, category='ll', description='ARMENIAN SMALL LIGATURE VEW NOW', specials={'compat',0x057E,0x0576} }, + [0xFB17] = { unicodeslot=0xFB17, category='ll', description='ARMENIAN SMALL LIGATURE MEN XEH', specials={'compat',0x0574,0x056D} }, + [0xFB1D] = { unicodeslot=0xFB1D, category='lo', description='HEBREW LETTER YOD WITH HIRIQ', shcode=0x05D9, specials={'char',0x05D9,0x05B4} }, + [0xFB1E] = { unicodeslot=0xFB1E, category='mn', description='HEBREW POINT JUDEO-SPANISH VARIKA' }, + [0xFB1F] = { unicodeslot=0xFB1F, category='lo', description='HEBREW LIGATURE YIDDISH YOD YOD PATAH', specials={'char',0x05F2,0x05B7} }, + [0xFB20] = { unicodeslot=0xFB20, category='lo', description='HEBREW LETTER ALTERNATIVE AYIN', specials={'font',0x05E2} }, + [0xFB21] = { unicodeslot=0xFB21, category='lo', description='HEBREW LETTER WIDE ALEF', specials={'font',0x05D0} }, + [0xFB22] = { unicodeslot=0xFB22, category='lo', description='HEBREW LETTER WIDE DALET', specials={'font',0x05D3} }, + [0xFB23] = { unicodeslot=0xFB23, category='lo', description='HEBREW LETTER WIDE HE', specials={'font',0x05D4} }, + [0xFB24] = { unicodeslot=0xFB24, category='lo', description='HEBREW LETTER WIDE KAF', specials={'font',0x05DB} }, + [0xFB25] = { unicodeslot=0xFB25, category='lo', description='HEBREW LETTER WIDE LAMED', specials={'font',0x05DC} }, + [0xFB26] = { unicodeslot=0xFB26, category='lo', description='HEBREW LETTER WIDE FINAL MEM', specials={'font',0x05DD} }, + [0xFB27] = { unicodeslot=0xFB27, category='lo', description='HEBREW LETTER WIDE RESH', specials={'font',0x05E8} }, + [0xFB28] = { unicodeslot=0xFB28, category='lo', description='HEBREW LETTER WIDE TAV', specials={'font',0x05EA} }, + [0xFB29] = { unicodeslot=0xFB29, category='sm', description='HEBREW LETTER ALTERNATIVE PLUS SIGN', specials={'font',0x002B} }, + [0xFB2A] = { unicodeslot=0xFB2A, category='lo', description='HEBREW LETTER SHIN WITH SHIN DOT', shcode=0x05E9, specials={'char',0x05E9,0x05C1} }, + [0xFB2B] = { unicodeslot=0xFB2B, category='lo', description='HEBREW LETTER SHIN WITH SIN DOT', shcode=0x05E9, specials={'char',0x05E9,0x05C2} }, + [0xFB2C] = { unicodeslot=0xFB2C, category='lo', description='HEBREW LETTER SHIN WITH DAGESH AND SHIN DOT', shcode=0x05E9, specials={'char',0xFB49,0x05C1} }, + [0xFB2D] = { unicodeslot=0xFB2D, category='lo', description='HEBREW LETTER SHIN WITH DAGESH AND SIN DOT', shcode=0x05E9, specials={'char',0xFB49,0x05C2} }, + [0xFB2E] = { unicodeslot=0xFB2E, category='lo', description='HEBREW LETTER ALEF WITH PATAH', shcode=0x05D0, specials={'char',0x05D0,0x05B7} }, + [0xFB2F] = { unicodeslot=0xFB2F, category='lo', description='HEBREW LETTER ALEF WITH QAMATS', shcode=0x05D0, specials={'char',0x05D0,0x05B8} }, + [0xFB30] = { unicodeslot=0xFB30, category='lo', description='HEBREW LETTER ALEF WITH MAPIQ', shcode=0x05D0, specials={'char',0x05D0,0x05BC} }, + [0xFB31] = { unicodeslot=0xFB31, category='lo', description='HEBREW LETTER BET WITH DAGESH', shcode=0x05D1, specials={'char',0x05D1,0x05BC} }, + [0xFB32] = { unicodeslot=0xFB32, category='lo', description='HEBREW LETTER GIMEL WITH DAGESH', shcode=0x05D2, specials={'char',0x05D2,0x05BC} }, + [0xFB33] = { unicodeslot=0xFB33, category='lo', description='HEBREW LETTER DALET WITH DAGESH', shcode=0x05D3, specials={'char',0x05D3,0x05BC} }, + [0xFB34] = { unicodeslot=0xFB34, category='lo', description='HEBREW LETTER HE WITH MAPIQ', shcode=0x05D4, specials={'char',0x05D4,0x05BC} }, + [0xFB35] = { unicodeslot=0xFB35, category='lo', description='HEBREW LETTER VAV WITH DAGESH', shcode=0x05D5, specials={'char',0x05D5,0x05BC} }, + [0xFB36] = { unicodeslot=0xFB36, category='lo', description='HEBREW LETTER ZAYIN WITH DAGESH', shcode=0x05D6, specials={'char',0x05D6,0x05BC} }, + [0xFB38] = { unicodeslot=0xFB38, category='lo', description='HEBREW LETTER TET WITH DAGESH', shcode=0x05D8, specials={'char',0x05D8,0x05BC} }, + [0xFB39] = { unicodeslot=0xFB39, category='lo', description='HEBREW LETTER YOD WITH DAGESH', shcode=0x05D9, specials={'char',0x05D9,0x05BC} }, + [0xFB3A] = { unicodeslot=0xFB3A, category='lo', description='HEBREW LETTER FINAL KAF WITH DAGESH', specials={'char',0x05DA,0x05BC} }, + [0xFB3B] = { unicodeslot=0xFB3B, category='lo', description='HEBREW LETTER KAF WITH DAGESH', shcode=0x05DB, specials={'char',0x05DB,0x05BC} }, + [0xFB3C] = { unicodeslot=0xFB3C, category='lo', description='HEBREW LETTER LAMED WITH DAGESH', shcode=0x05DC, specials={'char',0x05DC,0x05BC} }, + [0xFB3E] = { unicodeslot=0xFB3E, category='lo', description='HEBREW LETTER MEM WITH DAGESH', shcode=0x05DE, specials={'char',0x05DE,0x05BC} }, + [0xFB40] = { unicodeslot=0xFB40, category='lo', description='HEBREW LETTER NUN WITH DAGESH', shcode=0x05E0, specials={'char',0x05E0,0x05BC} }, + [0xFB41] = { unicodeslot=0xFB41, category='lo', description='HEBREW LETTER SAMEKH WITH DAGESH', shcode=0x05E1, specials={'char',0x05E1,0x05BC} }, + [0xFB43] = { unicodeslot=0xFB43, category='lo', description='HEBREW LETTER FINAL PE WITH DAGESH', specials={'char',0x05E3,0x05BC} }, + [0xFB44] = { unicodeslot=0xFB44, category='lo', description='HEBREW LETTER PE WITH DAGESH', shcode=0x05E4, specials={'char',0x05E4,0x05BC} }, + [0xFB46] = { unicodeslot=0xFB46, category='lo', description='HEBREW LETTER TSADI WITH DAGESH', shcode=0x05E6, specials={'char',0x05E6,0x05BC} }, + [0xFB47] = { unicodeslot=0xFB47, category='lo', description='HEBREW LETTER QOF WITH DAGESH', shcode=0x05E7, specials={'char',0x05E7,0x05BC} }, + [0xFB48] = { unicodeslot=0xFB48, category='lo', description='HEBREW LETTER RESH WITH DAGESH', shcode=0x05E8, specials={'char',0x05E8,0x05BC} }, + [0xFB49] = { unicodeslot=0xFB49, category='lo', description='HEBREW LETTER SHIN WITH DAGESH', shcode=0x05E9, specials={'char',0x05E9,0x05BC} }, + [0xFB4A] = { unicodeslot=0xFB4A, category='lo', description='HEBREW LETTER TAV WITH DAGESH', shcode=0x05EA, specials={'char',0x05EA,0x05BC} }, + [0xFB4B] = { unicodeslot=0xFB4B, category='lo', description='HEBREW LETTER VAV WITH HOLAM', shcode=0x05D5, specials={'char',0x05D5,0x05B9} }, + [0xFB4C] = { unicodeslot=0xFB4C, category='lo', description='HEBREW LETTER BET WITH RAFE', shcode=0x05D1, specials={'char',0x05D1,0x05BF} }, + [0xFB4D] = { unicodeslot=0xFB4D, category='lo', description='HEBREW LETTER KAF WITH RAFE', shcode=0x05DB, specials={'char',0x05DB,0x05BF} }, + [0xFB4E] = { unicodeslot=0xFB4E, category='lo', description='HEBREW LETTER PE WITH RAFE', shcode=0x05E4, specials={'char',0x05E4,0x05BF} }, + [0xFB4F] = { unicodeslot=0xFB4F, category='lo', description='HEBREW LIGATURE ALEF LAMED', specials={'compat',0x05D0,0x05DC} }, + [0xFB50] = { unicodeslot=0xFB50, category='lo', description='ARABIC LETTER ALEF WASLA ISOLATED FORM', specials={'isolated',0x0671} }, + [0xFB51] = { unicodeslot=0xFB51, category='lo', description='ARABIC LETTER ALEF WASLA FINAL FORM', specials={'final',0x0671} }, + [0xFB52] = { unicodeslot=0xFB52, category='lo', description='ARABIC LETTER BEEH ISOLATED FORM', specials={'isolated',0x067B} }, + [0xFB53] = { unicodeslot=0xFB53, category='lo', description='ARABIC LETTER BEEH FINAL FORM', specials={'final',0x067B} }, + [0xFB54] = { unicodeslot=0xFB54, category='lo', description='ARABIC LETTER BEEH INITIAL FORM', specials={'initial',0x067B} }, + [0xFB55] = { unicodeslot=0xFB55, category='lo', description='ARABIC LETTER BEEH MEDIAL FORM', specials={'medial',0x067B} }, + [0xFB56] = { unicodeslot=0xFB56, category='lo', description='ARABIC LETTER PEH ISOLATED FORM', specials={'isolated',0x067E} }, + [0xFB57] = { unicodeslot=0xFB57, category='lo', description='ARABIC LETTER PEH FINAL FORM', specials={'final',0x067E} }, + [0xFB58] = { unicodeslot=0xFB58, category='lo', description='ARABIC LETTER PEH INITIAL FORM', specials={'initial',0x067E} }, + [0xFB59] = { unicodeslot=0xFB59, category='lo', description='ARABIC LETTER PEH MEDIAL FORM', specials={'medial',0x067E} }, + [0xFB5A] = { unicodeslot=0xFB5A, category='lo', description='ARABIC LETTER BEHEH ISOLATED FORM', specials={'isolated',0x0680} }, + [0xFB5B] = { unicodeslot=0xFB5B, category='lo', description='ARABIC LETTER BEHEH FINAL FORM', specials={'final',0x0680} }, + [0xFB5C] = { unicodeslot=0xFB5C, category='lo', description='ARABIC LETTER BEHEH INITIAL FORM', specials={'initial',0x0680} }, + [0xFB5D] = { unicodeslot=0xFB5D, category='lo', description='ARABIC LETTER BEHEH MEDIAL FORM', specials={'medial',0x0680} }, + [0xFB5E] = { unicodeslot=0xFB5E, category='lo', description='ARABIC LETTER TTEHEH ISOLATED FORM', specials={'isolated',0x067A} }, + [0xFB5F] = { unicodeslot=0xFB5F, category='lo', description='ARABIC LETTER TTEHEH FINAL FORM', specials={'final',0x067A} }, + [0xFB60] = { unicodeslot=0xFB60, category='lo', description='ARABIC LETTER TTEHEH INITIAL FORM', specials={'initial',0x067A} }, + [0xFB61] = { unicodeslot=0xFB61, category='lo', description='ARABIC LETTER TTEHEH MEDIAL FORM', specials={'medial',0x067A} }, + [0xFB62] = { unicodeslot=0xFB62, category='lo', description='ARABIC LETTER TEHEH ISOLATED FORM', specials={'isolated',0x067F} }, + [0xFB63] = { unicodeslot=0xFB63, category='lo', description='ARABIC LETTER TEHEH FINAL FORM', specials={'final',0x067F} }, + [0xFB64] = { unicodeslot=0xFB64, category='lo', description='ARABIC LETTER TEHEH INITIAL FORM', specials={'initial',0x067F} }, + [0xFB65] = { unicodeslot=0xFB65, category='lo', description='ARABIC LETTER TEHEH MEDIAL FORM', specials={'medial',0x067F} }, + [0xFB66] = { unicodeslot=0xFB66, category='lo', description='ARABIC LETTER TTEH ISOLATED FORM', specials={'isolated',0x0679} }, + [0xFB67] = { unicodeslot=0xFB67, category='lo', description='ARABIC LETTER TTEH FINAL FORM', specials={'final',0x0679} }, + [0xFB68] = { unicodeslot=0xFB68, category='lo', description='ARABIC LETTER TTEH INITIAL FORM', specials={'initial',0x0679} }, + [0xFB69] = { unicodeslot=0xFB69, category='lo', description='ARABIC LETTER TTEH MEDIAL FORM', specials={'medial',0x0679} }, + [0xFB6A] = { unicodeslot=0xFB6A, category='lo', description='ARABIC LETTER VEH ISOLATED FORM', specials={'isolated',0x06A4} }, + [0xFB6B] = { unicodeslot=0xFB6B, category='lo', description='ARABIC LETTER VEH FINAL FORM', specials={'final',0x06A4} }, + [0xFB6C] = { unicodeslot=0xFB6C, category='lo', description='ARABIC LETTER VEH INITIAL FORM', specials={'initial',0x06A4} }, + [0xFB6D] = { unicodeslot=0xFB6D, category='lo', description='ARABIC LETTER VEH MEDIAL FORM', specials={'medial',0x06A4} }, + [0xFB6E] = { unicodeslot=0xFB6E, category='lo', description='ARABIC LETTER PEHEH ISOLATED FORM', specials={'isolated',0x06A6} }, + [0xFB6F] = { unicodeslot=0xFB6F, category='lo', description='ARABIC LETTER PEHEH FINAL FORM', specials={'final',0x06A6} }, + [0xFB70] = { unicodeslot=0xFB70, category='lo', description='ARABIC LETTER PEHEH INITIAL FORM', specials={'initial',0x06A6} }, + [0xFB71] = { unicodeslot=0xFB71, category='lo', description='ARABIC LETTER PEHEH MEDIAL FORM', specials={'medial',0x06A6} }, + [0xFB72] = { unicodeslot=0xFB72, category='lo', description='ARABIC LETTER DYEH ISOLATED FORM', specials={'isolated',0x0684} }, + [0xFB73] = { unicodeslot=0xFB73, category='lo', description='ARABIC LETTER DYEH FINAL FORM', specials={'final',0x0684} }, + [0xFB74] = { unicodeslot=0xFB74, category='lo', description='ARABIC LETTER DYEH INITIAL FORM', specials={'initial',0x0684} }, + [0xFB75] = { unicodeslot=0xFB75, category='lo', description='ARABIC LETTER DYEH MEDIAL FORM', specials={'medial',0x0684} }, + [0xFB76] = { unicodeslot=0xFB76, category='lo', description='ARABIC LETTER NYEH ISOLATED FORM', specials={'isolated',0x0683} }, + [0xFB77] = { unicodeslot=0xFB77, category='lo', description='ARABIC LETTER NYEH FINAL FORM', specials={'final',0x0683} }, + [0xFB78] = { unicodeslot=0xFB78, category='lo', description='ARABIC LETTER NYEH INITIAL FORM', specials={'initial',0x0683} }, + [0xFB79] = { unicodeslot=0xFB79, category='lo', description='ARABIC LETTER NYEH MEDIAL FORM', specials={'medial',0x0683} }, + [0xFB7A] = { unicodeslot=0xFB7A, category='lo', description='ARABIC LETTER TCHEH ISOLATED FORM', specials={'isolated',0x0686} }, + [0xFB7B] = { unicodeslot=0xFB7B, category='lo', description='ARABIC LETTER TCHEH FINAL FORM', specials={'final',0x0686} }, + [0xFB7C] = { unicodeslot=0xFB7C, category='lo', description='ARABIC LETTER TCHEH INITIAL FORM', specials={'initial',0x0686} }, + [0xFB7D] = { unicodeslot=0xFB7D, category='lo', description='ARABIC LETTER TCHEH MEDIAL FORM', specials={'medial',0x0686} }, + [0xFB7E] = { unicodeslot=0xFB7E, category='lo', description='ARABIC LETTER TCHEHEH ISOLATED FORM', specials={'isolated',0x0687} }, + [0xFB7F] = { unicodeslot=0xFB7F, category='lo', description='ARABIC LETTER TCHEHEH FINAL FORM', specials={'final',0x0687} }, + [0xFB80] = { unicodeslot=0xFB80, category='lo', description='ARABIC LETTER TCHEHEH INITIAL FORM', specials={'initial',0x0687} }, + [0xFB81] = { unicodeslot=0xFB81, category='lo', description='ARABIC LETTER TCHEHEH MEDIAL FORM', specials={'medial',0x0687} }, + [0xFB82] = { unicodeslot=0xFB82, category='lo', description='ARABIC LETTER DDAHAL ISOLATED FORM', specials={'isolated',0x068D} }, + [0xFB83] = { unicodeslot=0xFB83, category='lo', description='ARABIC LETTER DDAHAL FINAL FORM', specials={'final',0x068D} }, + [0xFB84] = { unicodeslot=0xFB84, category='lo', description='ARABIC LETTER DAHAL ISOLATED FORM', specials={'isolated',0x068C} }, + [0xFB85] = { unicodeslot=0xFB85, category='lo', description='ARABIC LETTER DAHAL FINAL FORM', specials={'final',0x068C} }, + [0xFB86] = { unicodeslot=0xFB86, category='lo', description='ARABIC LETTER DUL ISOLATED FORM', specials={'isolated',0x068E} }, + [0xFB87] = { unicodeslot=0xFB87, category='lo', description='ARABIC LETTER DUL FINAL FORM', specials={'final',0x068E} }, + [0xFB88] = { unicodeslot=0xFB88, category='lo', description='ARABIC LETTER DDAL ISOLATED FORM', specials={'isolated',0x0688} }, + [0xFB89] = { unicodeslot=0xFB89, category='lo', description='ARABIC LETTER DDAL FINAL FORM', specials={'final',0x0688} }, + [0xFB8A] = { unicodeslot=0xFB8A, category='lo', description='ARABIC LETTER JEH ISOLATED FORM', specials={'isolated',0x0698} }, + [0xFB8B] = { unicodeslot=0xFB8B, category='lo', description='ARABIC LETTER JEH FINAL FORM', specials={'final',0x0698} }, + [0xFB8C] = { unicodeslot=0xFB8C, category='lo', description='ARABIC LETTER RREH ISOLATED FORM', specials={'isolated',0x0691} }, + [0xFB8D] = { unicodeslot=0xFB8D, category='lo', description='ARABIC LETTER RREH FINAL FORM', specials={'final',0x0691} }, + [0xFB8E] = { unicodeslot=0xFB8E, category='lo', description='ARABIC LETTER KEHEH ISOLATED FORM', specials={'isolated',0x06A9} }, + [0xFB8F] = { unicodeslot=0xFB8F, category='lo', description='ARABIC LETTER KEHEH FINAL FORM', specials={'final',0x06A9} }, + [0xFB90] = { unicodeslot=0xFB90, category='lo', description='ARABIC LETTER KEHEH INITIAL FORM', specials={'initial',0x06A9} }, + [0xFB91] = { unicodeslot=0xFB91, category='lo', description='ARABIC LETTER KEHEH MEDIAL FORM', specials={'medial',0x06A9} }, + [0xFB92] = { unicodeslot=0xFB92, category='lo', description='ARABIC LETTER GAF ISOLATED FORM', specials={'isolated',0x06AF} }, + [0xFB93] = { unicodeslot=0xFB93, category='lo', description='ARABIC LETTER GAF FINAL FORM', specials={'final',0x06AF} }, + [0xFB94] = { unicodeslot=0xFB94, category='lo', description='ARABIC LETTER GAF INITIAL FORM', specials={'initial',0x06AF} }, + [0xFB95] = { unicodeslot=0xFB95, category='lo', description='ARABIC LETTER GAF MEDIAL FORM', specials={'medial',0x06AF} }, + [0xFB96] = { unicodeslot=0xFB96, category='lo', description='ARABIC LETTER GUEH ISOLATED FORM', specials={'isolated',0x06B3} }, + [0xFB97] = { unicodeslot=0xFB97, category='lo', description='ARABIC LETTER GUEH FINAL FORM', specials={'final',0x06B3} }, + [0xFB98] = { unicodeslot=0xFB98, category='lo', description='ARABIC LETTER GUEH INITIAL FORM', specials={'initial',0x06B3} }, + [0xFB99] = { unicodeslot=0xFB99, category='lo', description='ARABIC LETTER GUEH MEDIAL FORM', specials={'medial',0x06B3} }, + [0xFB9A] = { unicodeslot=0xFB9A, category='lo', description='ARABIC LETTER NGOEH ISOLATED FORM', specials={'isolated',0x06B1} }, + [0xFB9B] = { unicodeslot=0xFB9B, category='lo', description='ARABIC LETTER NGOEH FINAL FORM', specials={'final',0x06B1} }, + [0xFB9C] = { unicodeslot=0xFB9C, category='lo', description='ARABIC LETTER NGOEH INITIAL FORM', specials={'initial',0x06B1} }, + [0xFB9D] = { unicodeslot=0xFB9D, category='lo', description='ARABIC LETTER NGOEH MEDIAL FORM', specials={'medial',0x06B1} }, + [0xFB9E] = { unicodeslot=0xFB9E, category='lo', description='ARABIC LETTER NOON GHUNNA ISOLATED FORM', specials={'isolated',0x06BA} }, + [0xFB9F] = { unicodeslot=0xFB9F, category='lo', description='ARABIC LETTER NOON GHUNNA FINAL FORM', specials={'final',0x06BA} }, + [0xFBA0] = { unicodeslot=0xFBA0, category='lo', description='ARABIC LETTER RNOON ISOLATED FORM', specials={'isolated',0x06BB} }, + [0xFBA1] = { unicodeslot=0xFBA1, category='lo', description='ARABIC LETTER RNOON FINAL FORM', specials={'final',0x06BB} }, + [0xFBA2] = { unicodeslot=0xFBA2, category='lo', description='ARABIC LETTER RNOON INITIAL FORM', specials={'initial',0x06BB} }, + [0xFBA3] = { unicodeslot=0xFBA3, category='lo', description='ARABIC LETTER RNOON MEDIAL FORM', specials={'medial',0x06BB} }, + [0xFBA4] = { unicodeslot=0xFBA4, category='lo', description='ARABIC LETTER HEH WITH YEH ABOVE ISOLATED FORM', shcode=0x0647, specials={'isolated',0x06C0} }, + [0xFBA5] = { unicodeslot=0xFBA5, category='lo', description='ARABIC LETTER HEH WITH YEH ABOVE FINAL FORM', shcode=0x0647, specials={'final',0x06C0} }, + [0xFBA6] = { unicodeslot=0xFBA6, category='lo', description='ARABIC LETTER HEH GOAL ISOLATED FORM', specials={'isolated',0x06C1} }, + [0xFBA7] = { unicodeslot=0xFBA7, category='lo', description='ARABIC LETTER HEH GOAL FINAL FORM', specials={'final',0x06C1} }, + [0xFBA8] = { unicodeslot=0xFBA8, category='lo', description='ARABIC LETTER HEH GOAL INITIAL FORM', specials={'initial',0x06C1} }, + [0xFBA9] = { unicodeslot=0xFBA9, category='lo', description='ARABIC LETTER HEH GOAL MEDIAL FORM', specials={'medial',0x06C1} }, + [0xFBAA] = { unicodeslot=0xFBAA, category='lo', description='ARABIC LETTER HEH DOACHASHMEE ISOLATED FORM', specials={'isolated',0x06BE} }, + [0xFBAB] = { unicodeslot=0xFBAB, category='lo', description='ARABIC LETTER HEH DOACHASHMEE FINAL FORM', specials={'final',0x06BE} }, + [0xFBAC] = { unicodeslot=0xFBAC, category='lo', description='ARABIC LETTER HEH DOACHASHMEE INITIAL FORM', specials={'initial',0x06BE} }, + [0xFBAD] = { unicodeslot=0xFBAD, category='lo', description='ARABIC LETTER HEH DOACHASHMEE MEDIAL FORM', specials={'medial',0x06BE} }, + [0xFBAE] = { unicodeslot=0xFBAE, category='lo', description='ARABIC LETTER YEH BARREE ISOLATED FORM', specials={'isolated',0x06D2} }, + [0xFBAF] = { unicodeslot=0xFBAF, category='lo', description='ARABIC LETTER YEH BARREE FINAL FORM', specials={'final',0x06D2} }, + [0xFBB0] = { unicodeslot=0xFBB0, category='lo', description='ARABIC LETTER YEH BARREE WITH HAMZA ABOVE ISOLATED FORM', specials={'isolated',0x06D3} }, + [0xFBB1] = { unicodeslot=0xFBB1, category='lo', description='ARABIC LETTER YEH BARREE WITH HAMZA ABOVE FINAL FORM', specials={'final',0x06D3} }, + [0xFBD3] = { unicodeslot=0xFBD3, category='lo', description='ARABIC LETTER NG ISOLATED FORM', specials={'isolated',0x06AD} }, + [0xFBD4] = { unicodeslot=0xFBD4, category='lo', description='ARABIC LETTER NG FINAL FORM', specials={'final',0x06AD} }, + [0xFBD5] = { unicodeslot=0xFBD5, category='lo', description='ARABIC LETTER NG INITIAL FORM', specials={'initial',0x06AD} }, + [0xFBD6] = { unicodeslot=0xFBD6, category='lo', description='ARABIC LETTER NG MEDIAL FORM', specials={'medial',0x06AD} }, + [0xFBD7] = { unicodeslot=0xFBD7, category='lo', description='ARABIC LETTER U ISOLATED FORM', specials={'isolated',0x06C7} }, + [0xFBD8] = { unicodeslot=0xFBD8, category='lo', description='ARABIC LETTER U FINAL FORM', specials={'final',0x06C7} }, + [0xFBD9] = { unicodeslot=0xFBD9, category='lo', description='ARABIC LETTER OE ISOLATED FORM', specials={'isolated',0x06C6} }, + [0xFBDA] = { unicodeslot=0xFBDA, category='lo', description='ARABIC LETTER OE FINAL FORM', specials={'final',0x06C6} }, + [0xFBDB] = { unicodeslot=0xFBDB, category='lo', description='ARABIC LETTER YU ISOLATED FORM', specials={'isolated',0x06C8} }, + [0xFBDC] = { unicodeslot=0xFBDC, category='lo', description='ARABIC LETTER YU FINAL FORM', specials={'final',0x06C8} }, + [0xFBDD] = { unicodeslot=0xFBDD, category='lo', description='ARABIC LETTER U WITH HAMZA ABOVE ISOLATED FORM', shcode=0x06C7, specials={'isolated',0x0677} }, + [0xFBDE] = { unicodeslot=0xFBDE, category='lo', description='ARABIC LETTER VE ISOLATED FORM', specials={'isolated',0x06CB} }, + [0xFBDF] = { unicodeslot=0xFBDF, category='lo', description='ARABIC LETTER VE FINAL FORM', specials={'final',0x06CB} }, + [0xFBE0] = { unicodeslot=0xFBE0, category='lo', description='ARABIC LETTER KIRGHIZ OE ISOLATED FORM', specials={'isolated',0x06C5} }, + [0xFBE1] = { unicodeslot=0xFBE1, category='lo', description='ARABIC LETTER KIRGHIZ OE FINAL FORM', specials={'final',0x06C5} }, + [0xFBE2] = { unicodeslot=0xFBE2, category='lo', description='ARABIC LETTER KIRGHIZ YU ISOLATED FORM', specials={'isolated',0x06C9} }, + [0xFBE3] = { unicodeslot=0xFBE3, category='lo', description='ARABIC LETTER KIRGHIZ YU FINAL FORM', specials={'final',0x06C9} }, + [0xFBE4] = { unicodeslot=0xFBE4, category='lo', description='ARABIC LETTER E ISOLATED FORM', specials={'isolated',0x06D0} }, + [0xFBE5] = { unicodeslot=0xFBE5, category='lo', description='ARABIC LETTER E FINAL FORM', specials={'final',0x06D0} }, + [0xFBE6] = { unicodeslot=0xFBE6, category='lo', description='ARABIC LETTER E INITIAL FORM', specials={'initial',0x06D0} }, + [0xFBE7] = { unicodeslot=0xFBE7, category='lo', description='ARABIC LETTER E MEDIAL FORM', specials={'medial',0x06D0} }, + [0xFBE8] = { unicodeslot=0xFBE8, category='lo', description='ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA INITIAL FORM', specials={'initial',0x0649} }, + [0xFBE9] = { unicodeslot=0xFBE9, category='lo', description='ARABIC LETTER UIGHUR KAZAKH KIRGHIZ ALEF MAKSURA MEDIAL FORM', specials={'medial',0x0649} }, + [0xFBEA] = { unicodeslot=0xFBEA, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF ISOLATED FORM', specials={'isolated',0x0626,0x0627} }, + [0xFBEB] = { unicodeslot=0xFBEB, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF FINAL FORM', specials={'final',0x0626,0x0627} }, + [0xFBEC] = { unicodeslot=0xFBEC, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE ISOLATED FORM', specials={'isolated',0x0626,0x06D5} }, + [0xFBED] = { unicodeslot=0xFBED, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH AE FINAL FORM', specials={'final',0x0626,0x06D5} }, + [0xFBEE] = { unicodeslot=0xFBEE, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW ISOLATED FORM', specials={'isolated',0x0626,0x0648} }, + [0xFBEF] = { unicodeslot=0xFBEF, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH WAW FINAL FORM', specials={'final',0x0626,0x0648} }, + [0xFBF0] = { unicodeslot=0xFBF0, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U ISOLATED FORM', specials={'isolated',0x0626,0x06C7} }, + [0xFBF1] = { unicodeslot=0xFBF1, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH U FINAL FORM', specials={'final',0x0626,0x06C7} }, + [0xFBF2] = { unicodeslot=0xFBF2, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE ISOLATED FORM', specials={'isolated',0x0626,0x06C6} }, + [0xFBF3] = { unicodeslot=0xFBF3, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH OE FINAL FORM', specials={'final',0x0626,0x06C6} }, + [0xFBF4] = { unicodeslot=0xFBF4, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU ISOLATED FORM', specials={'isolated',0x0626,0x06C8} }, + [0xFBF5] = { unicodeslot=0xFBF5, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YU FINAL FORM', specials={'final',0x0626,0x06C8} }, + [0xFBF6] = { unicodeslot=0xFBF6, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E ISOLATED FORM', specials={'isolated',0x0626,0x06D0} }, + [0xFBF7] = { unicodeslot=0xFBF7, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E FINAL FORM', specials={'final',0x0626,0x06D0} }, + [0xFBF8] = { unicodeslot=0xFBF8, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH E INITIAL FORM', specials={'initial',0x0626,0x06D0} }, + [0xFBF9] = { unicodeslot=0xFBF9, category='lo', description='ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0626,0x0649} }, + [0xFBFA] = { unicodeslot=0xFBFA, category='lo', description='ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0626,0x0649} }, + [0xFBFB] = { unicodeslot=0xFBFB, category='lo', description='ARABIC LIGATURE UIGHUR KIRGHIZ YEH WITH HAMZA ABOVE WITH ALEF MAKSURA INITIAL FORM', specials={'initial',0x0626,0x0649} }, + [0xFBFC] = { unicodeslot=0xFBFC, category='lo', description='ARABIC LETTER FARSI YEH ISOLATED FORM', specials={'isolated',0x06CC} }, + [0xFBFD] = { unicodeslot=0xFBFD, category='lo', description='ARABIC LETTER FARSI YEH FINAL FORM', specials={'final',0x06CC} }, + [0xFBFE] = { unicodeslot=0xFBFE, category='lo', description='ARABIC LETTER FARSI YEH INITIAL FORM', specials={'initial',0x06CC} }, + [0xFBFF] = { unicodeslot=0xFBFF, category='lo', description='ARABIC LETTER FARSI YEH MEDIAL FORM', specials={'medial',0x06CC} }, + [0xFC00] = { unicodeslot=0xFC00, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM ISOLATED FORM', specials={'isolated',0x0626,0x062C} }, + [0xFC01] = { unicodeslot=0xFC01, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH ISOLATED FORM', specials={'isolated',0x0626,0x062D} }, + [0xFC02] = { unicodeslot=0xFC02, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM ISOLATED FORM', specials={'isolated',0x0626,0x0645} }, + [0xFC03] = { unicodeslot=0xFC03, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0626,0x0649} }, + [0xFC04] = { unicodeslot=0xFC04, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH ISOLATED FORM', specials={'isolated',0x0626,0x064A} }, + [0xFC05] = { unicodeslot=0xFC05, category='lo', description='ARABIC LIGATURE BEH WITH JEEM ISOLATED FORM', specials={'isolated',0x0628,0x062C} }, + [0xFC06] = { unicodeslot=0xFC06, category='lo', description='ARABIC LIGATURE BEH WITH HAH ISOLATED FORM', specials={'isolated',0x0628,0x062D} }, + [0xFC07] = { unicodeslot=0xFC07, category='lo', description='ARABIC LIGATURE BEH WITH KHAH ISOLATED FORM', specials={'isolated',0x0628,0x062E} }, + [0xFC08] = { unicodeslot=0xFC08, category='lo', description='ARABIC LIGATURE BEH WITH MEEM ISOLATED FORM', specials={'isolated',0x0628,0x0645} }, + [0xFC09] = { unicodeslot=0xFC09, category='lo', description='ARABIC LIGATURE BEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0628,0x0649} }, + [0xFC0A] = { unicodeslot=0xFC0A, category='lo', description='ARABIC LIGATURE BEH WITH YEH ISOLATED FORM', specials={'isolated',0x0628,0x064A} }, + [0xFC0B] = { unicodeslot=0xFC0B, category='lo', description='ARABIC LIGATURE TEH WITH JEEM ISOLATED FORM', specials={'isolated',0x062A,0x062C} }, + [0xFC0C] = { unicodeslot=0xFC0C, category='lo', description='ARABIC LIGATURE TEH WITH HAH ISOLATED FORM', specials={'isolated',0x062A,0x062D} }, + [0xFC0D] = { unicodeslot=0xFC0D, category='lo', description='ARABIC LIGATURE TEH WITH KHAH ISOLATED FORM', specials={'isolated',0x062A,0x062E} }, + [0xFC0E] = { unicodeslot=0xFC0E, category='lo', description='ARABIC LIGATURE TEH WITH MEEM ISOLATED FORM', specials={'isolated',0x062A,0x0645} }, + [0xFC0F] = { unicodeslot=0xFC0F, category='lo', description='ARABIC LIGATURE TEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x062A,0x0649} }, + [0xFC10] = { unicodeslot=0xFC10, category='lo', description='ARABIC LIGATURE TEH WITH YEH ISOLATED FORM', specials={'isolated',0x062A,0x064A} }, + [0xFC11] = { unicodeslot=0xFC11, category='lo', description='ARABIC LIGATURE THEH WITH JEEM ISOLATED FORM', specials={'isolated',0x062B,0x062C} }, + [0xFC12] = { unicodeslot=0xFC12, category='lo', description='ARABIC LIGATURE THEH WITH MEEM ISOLATED FORM', specials={'isolated',0x062B,0x0645} }, + [0xFC13] = { unicodeslot=0xFC13, category='lo', description='ARABIC LIGATURE THEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x062B,0x0649} }, + [0xFC14] = { unicodeslot=0xFC14, category='lo', description='ARABIC LIGATURE THEH WITH YEH ISOLATED FORM', specials={'isolated',0x062B,0x064A} }, + [0xFC15] = { unicodeslot=0xFC15, category='lo', description='ARABIC LIGATURE JEEM WITH HAH ISOLATED FORM', specials={'isolated',0x062C,0x062D} }, + [0xFC16] = { unicodeslot=0xFC16, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM ISOLATED FORM', specials={'isolated',0x062C,0x0645} }, + [0xFC17] = { unicodeslot=0xFC17, category='lo', description='ARABIC LIGATURE HAH WITH JEEM ISOLATED FORM', specials={'isolated',0x062D,0x062C} }, + [0xFC18] = { unicodeslot=0xFC18, category='lo', description='ARABIC LIGATURE HAH WITH MEEM ISOLATED FORM', specials={'isolated',0x062D,0x0645} }, + [0xFC19] = { unicodeslot=0xFC19, category='lo', description='ARABIC LIGATURE KHAH WITH JEEM ISOLATED FORM', specials={'isolated',0x062E,0x062C} }, + [0xFC1A] = { unicodeslot=0xFC1A, category='lo', description='ARABIC LIGATURE KHAH WITH HAH ISOLATED FORM', specials={'isolated',0x062E,0x062D} }, + [0xFC1B] = { unicodeslot=0xFC1B, category='lo', description='ARABIC LIGATURE KHAH WITH MEEM ISOLATED FORM', specials={'isolated',0x062E,0x0645} }, + [0xFC1C] = { unicodeslot=0xFC1C, category='lo', description='ARABIC LIGATURE SEEN WITH JEEM ISOLATED FORM', specials={'isolated',0x0633,0x062C} }, + [0xFC1D] = { unicodeslot=0xFC1D, category='lo', description='ARABIC LIGATURE SEEN WITH HAH ISOLATED FORM', specials={'isolated',0x0633,0x062D} }, + [0xFC1E] = { unicodeslot=0xFC1E, category='lo', description='ARABIC LIGATURE SEEN WITH KHAH ISOLATED FORM', specials={'isolated',0x0633,0x062E} }, + [0xFC1F] = { unicodeslot=0xFC1F, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM ISOLATED FORM', specials={'isolated',0x0633,0x0645} }, + [0xFC20] = { unicodeslot=0xFC20, category='lo', description='ARABIC LIGATURE SAD WITH HAH ISOLATED FORM', specials={'isolated',0x0635,0x062D} }, + [0xFC21] = { unicodeslot=0xFC21, category='lo', description='ARABIC LIGATURE SAD WITH MEEM ISOLATED FORM', specials={'isolated',0x0635,0x0645} }, + [0xFC22] = { unicodeslot=0xFC22, category='lo', description='ARABIC LIGATURE DAD WITH JEEM ISOLATED FORM', specials={'isolated',0x0636,0x062C} }, + [0xFC23] = { unicodeslot=0xFC23, category='lo', description='ARABIC LIGATURE DAD WITH HAH ISOLATED FORM', specials={'isolated',0x0636,0x062D} }, + [0xFC24] = { unicodeslot=0xFC24, category='lo', description='ARABIC LIGATURE DAD WITH KHAH ISOLATED FORM', specials={'isolated',0x0636,0x062E} }, + [0xFC25] = { unicodeslot=0xFC25, category='lo', description='ARABIC LIGATURE DAD WITH MEEM ISOLATED FORM', specials={'isolated',0x0636,0x0645} }, + [0xFC26] = { unicodeslot=0xFC26, category='lo', description='ARABIC LIGATURE TAH WITH HAH ISOLATED FORM', specials={'isolated',0x0637,0x062D} }, + [0xFC27] = { unicodeslot=0xFC27, category='lo', description='ARABIC LIGATURE TAH WITH MEEM ISOLATED FORM', specials={'isolated',0x0637,0x0645} }, + [0xFC28] = { unicodeslot=0xFC28, category='lo', description='ARABIC LIGATURE ZAH WITH MEEM ISOLATED FORM', specials={'isolated',0x0638,0x0645} }, + [0xFC29] = { unicodeslot=0xFC29, category='lo', description='ARABIC LIGATURE AIN WITH JEEM ISOLATED FORM', specials={'isolated',0x0639,0x062C} }, + [0xFC2A] = { unicodeslot=0xFC2A, category='lo', description='ARABIC LIGATURE AIN WITH MEEM ISOLATED FORM', specials={'isolated',0x0639,0x0645} }, + [0xFC2B] = { unicodeslot=0xFC2B, category='lo', description='ARABIC LIGATURE GHAIN WITH JEEM ISOLATED FORM', specials={'isolated',0x063A,0x062C} }, + [0xFC2C] = { unicodeslot=0xFC2C, category='lo', description='ARABIC LIGATURE GHAIN WITH MEEM ISOLATED FORM', specials={'isolated',0x063A,0x0645} }, + [0xFC2D] = { unicodeslot=0xFC2D, category='lo', description='ARABIC LIGATURE FEH WITH JEEM ISOLATED FORM', specials={'isolated',0x0641,0x062C} }, + [0xFC2E] = { unicodeslot=0xFC2E, category='lo', description='ARABIC LIGATURE FEH WITH HAH ISOLATED FORM', specials={'isolated',0x0641,0x062D} }, + [0xFC2F] = { unicodeslot=0xFC2F, category='lo', description='ARABIC LIGATURE FEH WITH KHAH ISOLATED FORM', specials={'isolated',0x0641,0x062E} }, + [0xFC30] = { unicodeslot=0xFC30, category='lo', description='ARABIC LIGATURE FEH WITH MEEM ISOLATED FORM', specials={'isolated',0x0641,0x0645} }, + [0xFC31] = { unicodeslot=0xFC31, category='lo', description='ARABIC LIGATURE FEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0641,0x0649} }, + [0xFC32] = { unicodeslot=0xFC32, category='lo', description='ARABIC LIGATURE FEH WITH YEH ISOLATED FORM', specials={'isolated',0x0641,0x064A} }, + [0xFC33] = { unicodeslot=0xFC33, category='lo', description='ARABIC LIGATURE QAF WITH HAH ISOLATED FORM', specials={'isolated',0x0642,0x062D} }, + [0xFC34] = { unicodeslot=0xFC34, category='lo', description='ARABIC LIGATURE QAF WITH MEEM ISOLATED FORM', specials={'isolated',0x0642,0x0645} }, + [0xFC35] = { unicodeslot=0xFC35, category='lo', description='ARABIC LIGATURE QAF WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0642,0x0649} }, + [0xFC36] = { unicodeslot=0xFC36, category='lo', description='ARABIC LIGATURE QAF WITH YEH ISOLATED FORM', specials={'isolated',0x0642,0x064A} }, + [0xFC37] = { unicodeslot=0xFC37, category='lo', description='ARABIC LIGATURE KAF WITH ALEF ISOLATED FORM', specials={'isolated',0x0643,0x0627} }, + [0xFC38] = { unicodeslot=0xFC38, category='lo', description='ARABIC LIGATURE KAF WITH JEEM ISOLATED FORM', specials={'isolated',0x0643,0x062C} }, + [0xFC39] = { unicodeslot=0xFC39, category='lo', description='ARABIC LIGATURE KAF WITH HAH ISOLATED FORM', specials={'isolated',0x0643,0x062D} }, + [0xFC3A] = { unicodeslot=0xFC3A, category='lo', description='ARABIC LIGATURE KAF WITH KHAH ISOLATED FORM', specials={'isolated',0x0643,0x062E} }, + [0xFC3B] = { unicodeslot=0xFC3B, category='lo', description='ARABIC LIGATURE KAF WITH LAM ISOLATED FORM', specials={'isolated',0x0643,0x0644} }, + [0xFC3C] = { unicodeslot=0xFC3C, category='lo', description='ARABIC LIGATURE KAF WITH MEEM ISOLATED FORM', specials={'isolated',0x0643,0x0645} }, + [0xFC3D] = { unicodeslot=0xFC3D, category='lo', description='ARABIC LIGATURE KAF WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0643,0x0649} }, + [0xFC3E] = { unicodeslot=0xFC3E, category='lo', description='ARABIC LIGATURE KAF WITH YEH ISOLATED FORM', specials={'isolated',0x0643,0x064A} }, + [0xFC3F] = { unicodeslot=0xFC3F, category='lo', description='ARABIC LIGATURE LAM WITH JEEM ISOLATED FORM', specials={'isolated',0x0644,0x062C} }, + [0xFC40] = { unicodeslot=0xFC40, category='lo', description='ARABIC LIGATURE LAM WITH HAH ISOLATED FORM', specials={'isolated',0x0644,0x062D} }, + [0xFC41] = { unicodeslot=0xFC41, category='lo', description='ARABIC LIGATURE LAM WITH KHAH ISOLATED FORM', specials={'isolated',0x0644,0x062E} }, + [0xFC42] = { unicodeslot=0xFC42, category='lo', description='ARABIC LIGATURE LAM WITH MEEM ISOLATED FORM', specials={'isolated',0x0644,0x0645} }, + [0xFC43] = { unicodeslot=0xFC43, category='lo', description='ARABIC LIGATURE LAM WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0644,0x0649} }, + [0xFC44] = { unicodeslot=0xFC44, category='lo', description='ARABIC LIGATURE LAM WITH YEH ISOLATED FORM', specials={'isolated',0x0644,0x064A} }, + [0xFC45] = { unicodeslot=0xFC45, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM ISOLATED FORM', specials={'isolated',0x0645,0x062C} }, + [0xFC46] = { unicodeslot=0xFC46, category='lo', description='ARABIC LIGATURE MEEM WITH HAH ISOLATED FORM', specials={'isolated',0x0645,0x062D} }, + [0xFC47] = { unicodeslot=0xFC47, category='lo', description='ARABIC LIGATURE MEEM WITH KHAH ISOLATED FORM', specials={'isolated',0x0645,0x062E} }, + [0xFC48] = { unicodeslot=0xFC48, category='lo', description='ARABIC LIGATURE MEEM WITH MEEM ISOLATED FORM', specials={'isolated',0x0645,0x0645} }, + [0xFC49] = { unicodeslot=0xFC49, category='lo', description='ARABIC LIGATURE MEEM WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0645,0x0649} }, + [0xFC4A] = { unicodeslot=0xFC4A, category='lo', description='ARABIC LIGATURE MEEM WITH YEH ISOLATED FORM', specials={'isolated',0x0645,0x064A} }, + [0xFC4B] = { unicodeslot=0xFC4B, category='lo', description='ARABIC LIGATURE NOON WITH JEEM ISOLATED FORM', specials={'isolated',0x0646,0x062C} }, + [0xFC4C] = { unicodeslot=0xFC4C, category='lo', description='ARABIC LIGATURE NOON WITH HAH ISOLATED FORM', specials={'isolated',0x0646,0x062D} }, + [0xFC4D] = { unicodeslot=0xFC4D, category='lo', description='ARABIC LIGATURE NOON WITH KHAH ISOLATED FORM', specials={'isolated',0x0646,0x062E} }, + [0xFC4E] = { unicodeslot=0xFC4E, category='lo', description='ARABIC LIGATURE NOON WITH MEEM ISOLATED FORM', specials={'isolated',0x0646,0x0645} }, + [0xFC4F] = { unicodeslot=0xFC4F, category='lo', description='ARABIC LIGATURE NOON WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0646,0x0649} }, + [0xFC50] = { unicodeslot=0xFC50, category='lo', description='ARABIC LIGATURE NOON WITH YEH ISOLATED FORM', specials={'isolated',0x0646,0x064A} }, + [0xFC51] = { unicodeslot=0xFC51, category='lo', description='ARABIC LIGATURE HEH WITH JEEM ISOLATED FORM', specials={'isolated',0x0647,0x062C} }, + [0xFC52] = { unicodeslot=0xFC52, category='lo', description='ARABIC LIGATURE HEH WITH MEEM ISOLATED FORM', specials={'isolated',0x0647,0x0645} }, + [0xFC53] = { unicodeslot=0xFC53, category='lo', description='ARABIC LIGATURE HEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0647,0x0649} }, + [0xFC54] = { unicodeslot=0xFC54, category='lo', description='ARABIC LIGATURE HEH WITH YEH ISOLATED FORM', specials={'isolated',0x0647,0x064A} }, + [0xFC55] = { unicodeslot=0xFC55, category='lo', description='ARABIC LIGATURE YEH WITH JEEM ISOLATED FORM', specials={'isolated',0x064A,0x062C} }, + [0xFC56] = { unicodeslot=0xFC56, category='lo', description='ARABIC LIGATURE YEH WITH HAH ISOLATED FORM', specials={'isolated',0x064A,0x062D} }, + [0xFC57] = { unicodeslot=0xFC57, category='lo', description='ARABIC LIGATURE YEH WITH KHAH ISOLATED FORM', specials={'isolated',0x064A,0x062E} }, + [0xFC58] = { unicodeslot=0xFC58, category='lo', description='ARABIC LIGATURE YEH WITH MEEM ISOLATED FORM', specials={'isolated',0x064A,0x0645} }, + [0xFC59] = { unicodeslot=0xFC59, category='lo', description='ARABIC LIGATURE YEH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x064A,0x0649} }, + [0xFC5A] = { unicodeslot=0xFC5A, category='lo', description='ARABIC LIGATURE YEH WITH YEH ISOLATED FORM', specials={'isolated',0x064A,0x064A} }, + [0xFC5B] = { unicodeslot=0xFC5B, category='lo', description='ARABIC LIGATURE THAL WITH SUPERSCRIPT ALEF ISOLATED FORM', specials={'isolated',0x0630,0x0670} }, + [0xFC5C] = { unicodeslot=0xFC5C, category='lo', description='ARABIC LIGATURE REH WITH SUPERSCRIPT ALEF ISOLATED FORM', specials={'isolated',0x0631,0x0670} }, + [0xFC5D] = { unicodeslot=0xFC5D, category='lo', description='ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF ISOLATED FORM', specials={'isolated',0x0649,0x0670} }, + [0xFC5E] = { unicodeslot=0xFC5E, category='lo', description='ARABIC LIGATURE SHADDA WITH DAMMATAN ISOLATED FORM', specials={'isolated',0x0020,0x064C,0x0651} }, + [0xFC5F] = { unicodeslot=0xFC5F, category='lo', description='ARABIC LIGATURE SHADDA WITH KASRATAN ISOLATED FORM', specials={'isolated',0x0020,0x064D,0x0651} }, + [0xFC60] = { unicodeslot=0xFC60, category='lo', description='ARABIC LIGATURE SHADDA WITH FATHA ISOLATED FORM', specials={'isolated',0x0020,0x064E,0x0651} }, + [0xFC61] = { unicodeslot=0xFC61, category='lo', description='ARABIC LIGATURE SHADDA WITH DAMMA ISOLATED FORM', specials={'isolated',0x0020,0x064F,0x0651} }, + [0xFC62] = { unicodeslot=0xFC62, category='lo', description='ARABIC LIGATURE SHADDA WITH KASRA ISOLATED FORM', specials={'isolated',0x0020,0x0650,0x0651} }, + [0xFC63] = { unicodeslot=0xFC63, category='lo', description='ARABIC LIGATURE SHADDA WITH SUPERSCRIPT ALEF ISOLATED FORM', specials={'isolated',0x0020,0x0651,0x0670} }, + [0xFC64] = { unicodeslot=0xFC64, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH REH FINAL FORM', specials={'final',0x0626,0x0631} }, + [0xFC65] = { unicodeslot=0xFC65, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ZAIN FINAL FORM', specials={'final',0x0626,0x0632} }, + [0xFC66] = { unicodeslot=0xFC66, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM FINAL FORM', specials={'final',0x0626,0x0645} }, + [0xFC67] = { unicodeslot=0xFC67, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH NOON FINAL FORM', specials={'final',0x0626,0x0646} }, + [0xFC68] = { unicodeslot=0xFC68, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0626,0x0649} }, + [0xFC69] = { unicodeslot=0xFC69, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH YEH FINAL FORM', specials={'final',0x0626,0x064A} }, + [0xFC6A] = { unicodeslot=0xFC6A, category='lo', description='ARABIC LIGATURE BEH WITH REH FINAL FORM', specials={'final',0x0628,0x0631} }, + [0xFC6B] = { unicodeslot=0xFC6B, category='lo', description='ARABIC LIGATURE BEH WITH ZAIN FINAL FORM', specials={'final',0x0628,0x0632} }, + [0xFC6C] = { unicodeslot=0xFC6C, category='lo', description='ARABIC LIGATURE BEH WITH MEEM FINAL FORM', specials={'final',0x0628,0x0645} }, + [0xFC6D] = { unicodeslot=0xFC6D, category='lo', description='ARABIC LIGATURE BEH WITH NOON FINAL FORM', specials={'final',0x0628,0x0646} }, + [0xFC6E] = { unicodeslot=0xFC6E, category='lo', description='ARABIC LIGATURE BEH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0628,0x0649} }, + [0xFC6F] = { unicodeslot=0xFC6F, category='lo', description='ARABIC LIGATURE BEH WITH YEH FINAL FORM', specials={'final',0x0628,0x064A} }, + [0xFC70] = { unicodeslot=0xFC70, category='lo', description='ARABIC LIGATURE TEH WITH REH FINAL FORM', specials={'final',0x062A,0x0631} }, + [0xFC71] = { unicodeslot=0xFC71, category='lo', description='ARABIC LIGATURE TEH WITH ZAIN FINAL FORM', specials={'final',0x062A,0x0632} }, + [0xFC72] = { unicodeslot=0xFC72, category='lo', description='ARABIC LIGATURE TEH WITH MEEM FINAL FORM', specials={'final',0x062A,0x0645} }, + [0xFC73] = { unicodeslot=0xFC73, category='lo', description='ARABIC LIGATURE TEH WITH NOON FINAL FORM', specials={'final',0x062A,0x0646} }, + [0xFC74] = { unicodeslot=0xFC74, category='lo', description='ARABIC LIGATURE TEH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062A,0x0649} }, + [0xFC75] = { unicodeslot=0xFC75, category='lo', description='ARABIC LIGATURE TEH WITH YEH FINAL FORM', specials={'final',0x062A,0x064A} }, + [0xFC76] = { unicodeslot=0xFC76, category='lo', description='ARABIC LIGATURE THEH WITH REH FINAL FORM', specials={'final',0x062B,0x0631} }, + [0xFC77] = { unicodeslot=0xFC77, category='lo', description='ARABIC LIGATURE THEH WITH ZAIN FINAL FORM', specials={'final',0x062B,0x0632} }, + [0xFC78] = { unicodeslot=0xFC78, category='lo', description='ARABIC LIGATURE THEH WITH MEEM FINAL FORM', specials={'final',0x062B,0x0645} }, + [0xFC79] = { unicodeslot=0xFC79, category='lo', description='ARABIC LIGATURE THEH WITH NOON FINAL FORM', specials={'final',0x062B,0x0646} }, + [0xFC7A] = { unicodeslot=0xFC7A, category='lo', description='ARABIC LIGATURE THEH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062B,0x0649} }, + [0xFC7B] = { unicodeslot=0xFC7B, category='lo', description='ARABIC LIGATURE THEH WITH YEH FINAL FORM', specials={'final',0x062B,0x064A} }, + [0xFC7C] = { unicodeslot=0xFC7C, category='lo', description='ARABIC LIGATURE FEH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0641,0x0649} }, + [0xFC7D] = { unicodeslot=0xFC7D, category='lo', description='ARABIC LIGATURE FEH WITH YEH FINAL FORM', specials={'final',0x0641,0x064A} }, + [0xFC7E] = { unicodeslot=0xFC7E, category='lo', description='ARABIC LIGATURE QAF WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0642,0x0649} }, + [0xFC7F] = { unicodeslot=0xFC7F, category='lo', description='ARABIC LIGATURE QAF WITH YEH FINAL FORM', specials={'final',0x0642,0x064A} }, + [0xFC80] = { unicodeslot=0xFC80, category='lo', description='ARABIC LIGATURE KAF WITH ALEF FINAL FORM', specials={'final',0x0643,0x0627} }, + [0xFC81] = { unicodeslot=0xFC81, category='lo', description='ARABIC LIGATURE KAF WITH LAM FINAL FORM', specials={'final',0x0643,0x0644} }, + [0xFC82] = { unicodeslot=0xFC82, category='lo', description='ARABIC LIGATURE KAF WITH MEEM FINAL FORM', specials={'final',0x0643,0x0645} }, + [0xFC83] = { unicodeslot=0xFC83, category='lo', description='ARABIC LIGATURE KAF WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0643,0x0649} }, + [0xFC84] = { unicodeslot=0xFC84, category='lo', description='ARABIC LIGATURE KAF WITH YEH FINAL FORM', specials={'final',0x0643,0x064A} }, + [0xFC85] = { unicodeslot=0xFC85, category='lo', description='ARABIC LIGATURE LAM WITH MEEM FINAL FORM', specials={'final',0x0644,0x0645} }, + [0xFC86] = { unicodeslot=0xFC86, category='lo', description='ARABIC LIGATURE LAM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0644,0x0649} }, + [0xFC87] = { unicodeslot=0xFC87, category='lo', description='ARABIC LIGATURE LAM WITH YEH FINAL FORM', specials={'final',0x0644,0x064A} }, + [0xFC88] = { unicodeslot=0xFC88, category='lo', description='ARABIC LIGATURE MEEM WITH ALEF FINAL FORM', specials={'final',0x0645,0x0627} }, + [0xFC89] = { unicodeslot=0xFC89, category='lo', description='ARABIC LIGATURE MEEM WITH MEEM FINAL FORM', specials={'final',0x0645,0x0645} }, + [0xFC8A] = { unicodeslot=0xFC8A, category='lo', description='ARABIC LIGATURE NOON WITH REH FINAL FORM', specials={'final',0x0646,0x0631} }, + [0xFC8B] = { unicodeslot=0xFC8B, category='lo', description='ARABIC LIGATURE NOON WITH ZAIN FINAL FORM', specials={'final',0x0646,0x0632} }, + [0xFC8C] = { unicodeslot=0xFC8C, category='lo', description='ARABIC LIGATURE NOON WITH MEEM FINAL FORM', specials={'final',0x0646,0x0645} }, + [0xFC8D] = { unicodeslot=0xFC8D, category='lo', description='ARABIC LIGATURE NOON WITH NOON FINAL FORM', specials={'final',0x0646,0x0646} }, + [0xFC8E] = { unicodeslot=0xFC8E, category='lo', description='ARABIC LIGATURE NOON WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0646,0x0649} }, + [0xFC8F] = { unicodeslot=0xFC8F, category='lo', description='ARABIC LIGATURE NOON WITH YEH FINAL FORM', specials={'final',0x0646,0x064A} }, + [0xFC90] = { unicodeslot=0xFC90, category='lo', description='ARABIC LIGATURE ALEF MAKSURA WITH SUPERSCRIPT ALEF FINAL FORM', specials={'final',0x0649,0x0670} }, + [0xFC91] = { unicodeslot=0xFC91, category='lo', description='ARABIC LIGATURE YEH WITH REH FINAL FORM', specials={'final',0x064A,0x0631} }, + [0xFC92] = { unicodeslot=0xFC92, category='lo', description='ARABIC LIGATURE YEH WITH ZAIN FINAL FORM', specials={'final',0x064A,0x0632} }, + [0xFC93] = { unicodeslot=0xFC93, category='lo', description='ARABIC LIGATURE YEH WITH MEEM FINAL FORM', specials={'final',0x064A,0x0645} }, + [0xFC94] = { unicodeslot=0xFC94, category='lo', description='ARABIC LIGATURE YEH WITH NOON FINAL FORM', specials={'final',0x064A,0x0646} }, + [0xFC95] = { unicodeslot=0xFC95, category='lo', description='ARABIC LIGATURE YEH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x064A,0x0649} }, + [0xFC96] = { unicodeslot=0xFC96, category='lo', description='ARABIC LIGATURE YEH WITH YEH FINAL FORM', specials={'final',0x064A,0x064A} }, + [0xFC97] = { unicodeslot=0xFC97, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH JEEM INITIAL FORM', specials={'initial',0x0626,0x062C} }, + [0xFC98] = { unicodeslot=0xFC98, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HAH INITIAL FORM', specials={'initial',0x0626,0x062D} }, + [0xFC99] = { unicodeslot=0xFC99, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH KHAH INITIAL FORM', specials={'initial',0x0626,0x062E} }, + [0xFC9A] = { unicodeslot=0xFC9A, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM INITIAL FORM', specials={'initial',0x0626,0x0645} }, + [0xFC9B] = { unicodeslot=0xFC9B, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH INITIAL FORM', specials={'initial',0x0626,0x0647} }, + [0xFC9C] = { unicodeslot=0xFC9C, category='lo', description='ARABIC LIGATURE BEH WITH JEEM INITIAL FORM', specials={'initial',0x0628,0x062C} }, + [0xFC9D] = { unicodeslot=0xFC9D, category='lo', description='ARABIC LIGATURE BEH WITH HAH INITIAL FORM', specials={'initial',0x0628,0x062D} }, + [0xFC9E] = { unicodeslot=0xFC9E, category='lo', description='ARABIC LIGATURE BEH WITH KHAH INITIAL FORM', specials={'initial',0x0628,0x062E} }, + [0xFC9F] = { unicodeslot=0xFC9F, category='lo', description='ARABIC LIGATURE BEH WITH MEEM INITIAL FORM', specials={'initial',0x0628,0x0645} }, + [0xFCA0] = { unicodeslot=0xFCA0, category='lo', description='ARABIC LIGATURE BEH WITH HEH INITIAL FORM', specials={'initial',0x0628,0x0647} }, + [0xFCA1] = { unicodeslot=0xFCA1, category='lo', description='ARABIC LIGATURE TEH WITH JEEM INITIAL FORM', specials={'initial',0x062A,0x062C} }, + [0xFCA2] = { unicodeslot=0xFCA2, category='lo', description='ARABIC LIGATURE TEH WITH HAH INITIAL FORM', specials={'initial',0x062A,0x062D} }, + [0xFCA3] = { unicodeslot=0xFCA3, category='lo', description='ARABIC LIGATURE TEH WITH KHAH INITIAL FORM', specials={'initial',0x062A,0x062E} }, + [0xFCA4] = { unicodeslot=0xFCA4, category='lo', description='ARABIC LIGATURE TEH WITH MEEM INITIAL FORM', specials={'initial',0x062A,0x0645} }, + [0xFCA5] = { unicodeslot=0xFCA5, category='lo', description='ARABIC LIGATURE TEH WITH HEH INITIAL FORM', specials={'initial',0x062A,0x0647} }, + [0xFCA6] = { unicodeslot=0xFCA6, category='lo', description='ARABIC LIGATURE THEH WITH MEEM INITIAL FORM', specials={'initial',0x062B,0x0645} }, + [0xFCA7] = { unicodeslot=0xFCA7, category='lo', description='ARABIC LIGATURE JEEM WITH HAH INITIAL FORM', specials={'initial',0x062C,0x062D} }, + [0xFCA8] = { unicodeslot=0xFCA8, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM INITIAL FORM', specials={'initial',0x062C,0x0645} }, + [0xFCA9] = { unicodeslot=0xFCA9, category='lo', description='ARABIC LIGATURE HAH WITH JEEM INITIAL FORM', specials={'initial',0x062D,0x062C} }, + [0xFCAA] = { unicodeslot=0xFCAA, category='lo', description='ARABIC LIGATURE HAH WITH MEEM INITIAL FORM', specials={'initial',0x062D,0x0645} }, + [0xFCAB] = { unicodeslot=0xFCAB, category='lo', description='ARABIC LIGATURE KHAH WITH JEEM INITIAL FORM', specials={'initial',0x062E,0x062C} }, + [0xFCAC] = { unicodeslot=0xFCAC, category='lo', description='ARABIC LIGATURE KHAH WITH MEEM INITIAL FORM', specials={'initial',0x062E,0x0645} }, + [0xFCAD] = { unicodeslot=0xFCAD, category='lo', description='ARABIC LIGATURE SEEN WITH JEEM INITIAL FORM', specials={'initial',0x0633,0x062C} }, + [0xFCAE] = { unicodeslot=0xFCAE, category='lo', description='ARABIC LIGATURE SEEN WITH HAH INITIAL FORM', specials={'initial',0x0633,0x062D} }, + [0xFCAF] = { unicodeslot=0xFCAF, category='lo', description='ARABIC LIGATURE SEEN WITH KHAH INITIAL FORM', specials={'initial',0x0633,0x062E} }, + [0xFCB0] = { unicodeslot=0xFCB0, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM INITIAL FORM', specials={'initial',0x0633,0x0645} }, + [0xFCB1] = { unicodeslot=0xFCB1, category='lo', description='ARABIC LIGATURE SAD WITH HAH INITIAL FORM', specials={'initial',0x0635,0x062D} }, + [0xFCB2] = { unicodeslot=0xFCB2, category='lo', description='ARABIC LIGATURE SAD WITH KHAH INITIAL FORM', specials={'initial',0x0635,0x062E} }, + [0xFCB3] = { unicodeslot=0xFCB3, category='lo', description='ARABIC LIGATURE SAD WITH MEEM INITIAL FORM', specials={'initial',0x0635,0x0645} }, + [0xFCB4] = { unicodeslot=0xFCB4, category='lo', description='ARABIC LIGATURE DAD WITH JEEM INITIAL FORM', specials={'initial',0x0636,0x062C} }, + [0xFCB5] = { unicodeslot=0xFCB5, category='lo', description='ARABIC LIGATURE DAD WITH HAH INITIAL FORM', specials={'initial',0x0636,0x062D} }, + [0xFCB6] = { unicodeslot=0xFCB6, category='lo', description='ARABIC LIGATURE DAD WITH KHAH INITIAL FORM', specials={'initial',0x0636,0x062E} }, + [0xFCB7] = { unicodeslot=0xFCB7, category='lo', description='ARABIC LIGATURE DAD WITH MEEM INITIAL FORM', specials={'initial',0x0636,0x0645} }, + [0xFCB8] = { unicodeslot=0xFCB8, category='lo', description='ARABIC LIGATURE TAH WITH HAH INITIAL FORM', specials={'initial',0x0637,0x062D} }, + [0xFCB9] = { unicodeslot=0xFCB9, category='lo', description='ARABIC LIGATURE ZAH WITH MEEM INITIAL FORM', specials={'initial',0x0638,0x0645} }, + [0xFCBA] = { unicodeslot=0xFCBA, category='lo', description='ARABIC LIGATURE AIN WITH JEEM INITIAL FORM', specials={'initial',0x0639,0x062C} }, + [0xFCBB] = { unicodeslot=0xFCBB, category='lo', description='ARABIC LIGATURE AIN WITH MEEM INITIAL FORM', specials={'initial',0x0639,0x0645} }, + [0xFCBC] = { unicodeslot=0xFCBC, category='lo', description='ARABIC LIGATURE GHAIN WITH JEEM INITIAL FORM', specials={'initial',0x063A,0x062C} }, + [0xFCBD] = { unicodeslot=0xFCBD, category='lo', description='ARABIC LIGATURE GHAIN WITH MEEM INITIAL FORM', specials={'initial',0x063A,0x0645} }, + [0xFCBE] = { unicodeslot=0xFCBE, category='lo', description='ARABIC LIGATURE FEH WITH JEEM INITIAL FORM', specials={'initial',0x0641,0x062C} }, + [0xFCBF] = { unicodeslot=0xFCBF, category='lo', description='ARABIC LIGATURE FEH WITH HAH INITIAL FORM', specials={'initial',0x0641,0x062D} }, + [0xFCC0] = { unicodeslot=0xFCC0, category='lo', description='ARABIC LIGATURE FEH WITH KHAH INITIAL FORM', specials={'initial',0x0641,0x062E} }, + [0xFCC1] = { unicodeslot=0xFCC1, category='lo', description='ARABIC LIGATURE FEH WITH MEEM INITIAL FORM', specials={'initial',0x0641,0x0645} }, + [0xFCC2] = { unicodeslot=0xFCC2, category='lo', description='ARABIC LIGATURE QAF WITH HAH INITIAL FORM', specials={'initial',0x0642,0x062D} }, + [0xFCC3] = { unicodeslot=0xFCC3, category='lo', description='ARABIC LIGATURE QAF WITH MEEM INITIAL FORM', specials={'initial',0x0642,0x0645} }, + [0xFCC4] = { unicodeslot=0xFCC4, category='lo', description='ARABIC LIGATURE KAF WITH JEEM INITIAL FORM', specials={'initial',0x0643,0x062C} }, + [0xFCC5] = { unicodeslot=0xFCC5, category='lo', description='ARABIC LIGATURE KAF WITH HAH INITIAL FORM', specials={'initial',0x0643,0x062D} }, + [0xFCC6] = { unicodeslot=0xFCC6, category='lo', description='ARABIC LIGATURE KAF WITH KHAH INITIAL FORM', specials={'initial',0x0643,0x062E} }, + [0xFCC7] = { unicodeslot=0xFCC7, category='lo', description='ARABIC LIGATURE KAF WITH LAM INITIAL FORM', specials={'initial',0x0643,0x0644} }, + [0xFCC8] = { unicodeslot=0xFCC8, category='lo', description='ARABIC LIGATURE KAF WITH MEEM INITIAL FORM', specials={'initial',0x0643,0x0645} }, + [0xFCC9] = { unicodeslot=0xFCC9, category='lo', description='ARABIC LIGATURE LAM WITH JEEM INITIAL FORM', specials={'initial',0x0644,0x062C} }, + [0xFCCA] = { unicodeslot=0xFCCA, category='lo', description='ARABIC LIGATURE LAM WITH HAH INITIAL FORM', specials={'initial',0x0644,0x062D} }, + [0xFCCB] = { unicodeslot=0xFCCB, category='lo', description='ARABIC LIGATURE LAM WITH KHAH INITIAL FORM', specials={'initial',0x0644,0x062E} }, + [0xFCCC] = { unicodeslot=0xFCCC, category='lo', description='ARABIC LIGATURE LAM WITH MEEM INITIAL FORM', specials={'initial',0x0644,0x0645} }, + [0xFCCD] = { unicodeslot=0xFCCD, category='lo', description='ARABIC LIGATURE LAM WITH HEH INITIAL FORM', specials={'initial',0x0644,0x0647} }, + [0xFCCE] = { unicodeslot=0xFCCE, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM INITIAL FORM', specials={'initial',0x0645,0x062C} }, + [0xFCCF] = { unicodeslot=0xFCCF, category='lo', description='ARABIC LIGATURE MEEM WITH HAH INITIAL FORM', specials={'initial',0x0645,0x062D} }, + [0xFCD0] = { unicodeslot=0xFCD0, category='lo', description='ARABIC LIGATURE MEEM WITH KHAH INITIAL FORM', specials={'initial',0x0645,0x062E} }, + [0xFCD1] = { unicodeslot=0xFCD1, category='lo', description='ARABIC LIGATURE MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0645,0x0645} }, + [0xFCD2] = { unicodeslot=0xFCD2, category='lo', description='ARABIC LIGATURE NOON WITH JEEM INITIAL FORM', specials={'initial',0x0646,0x062C} }, + [0xFCD3] = { unicodeslot=0xFCD3, category='lo', description='ARABIC LIGATURE NOON WITH HAH INITIAL FORM', specials={'initial',0x0646,0x062D} }, + [0xFCD4] = { unicodeslot=0xFCD4, category='lo', description='ARABIC LIGATURE NOON WITH KHAH INITIAL FORM', specials={'initial',0x0646,0x062E} }, + [0xFCD5] = { unicodeslot=0xFCD5, category='lo', description='ARABIC LIGATURE NOON WITH MEEM INITIAL FORM', specials={'initial',0x0646,0x0645} }, + [0xFCD6] = { unicodeslot=0xFCD6, category='lo', description='ARABIC LIGATURE NOON WITH HEH INITIAL FORM', specials={'initial',0x0646,0x0647} }, + [0xFCD7] = { unicodeslot=0xFCD7, category='lo', description='ARABIC LIGATURE HEH WITH JEEM INITIAL FORM', specials={'initial',0x0647,0x062C} }, + [0xFCD8] = { unicodeslot=0xFCD8, category='lo', description='ARABIC LIGATURE HEH WITH MEEM INITIAL FORM', specials={'initial',0x0647,0x0645} }, + [0xFCD9] = { unicodeslot=0xFCD9, category='lo', description='ARABIC LIGATURE HEH WITH SUPERSCRIPT ALEF INITIAL FORM', specials={'initial',0x0647,0x0670} }, + [0xFCDA] = { unicodeslot=0xFCDA, category='lo', description='ARABIC LIGATURE YEH WITH JEEM INITIAL FORM', specials={'initial',0x064A,0x062C} }, + [0xFCDB] = { unicodeslot=0xFCDB, category='lo', description='ARABIC LIGATURE YEH WITH HAH INITIAL FORM', specials={'initial',0x064A,0x062D} }, + [0xFCDC] = { unicodeslot=0xFCDC, category='lo', description='ARABIC LIGATURE YEH WITH KHAH INITIAL FORM', specials={'initial',0x064A,0x062E} }, + [0xFCDD] = { unicodeslot=0xFCDD, category='lo', description='ARABIC LIGATURE YEH WITH MEEM INITIAL FORM', specials={'initial',0x064A,0x0645} }, + [0xFCDE] = { unicodeslot=0xFCDE, category='lo', description='ARABIC LIGATURE YEH WITH HEH INITIAL FORM', specials={'initial',0x064A,0x0647} }, + [0xFCDF] = { unicodeslot=0xFCDF, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH MEEM MEDIAL FORM', specials={'medial',0x0626,0x0645} }, + [0xFCE0] = { unicodeslot=0xFCE0, category='lo', description='ARABIC LIGATURE YEH WITH HAMZA ABOVE WITH HEH MEDIAL FORM', specials={'medial',0x0626,0x0647} }, + [0xFCE1] = { unicodeslot=0xFCE1, category='lo', description='ARABIC LIGATURE BEH WITH MEEM MEDIAL FORM', specials={'medial',0x0628,0x0645} }, + [0xFCE2] = { unicodeslot=0xFCE2, category='lo', description='ARABIC LIGATURE BEH WITH HEH MEDIAL FORM', specials={'medial',0x0628,0x0647} }, + [0xFCE3] = { unicodeslot=0xFCE3, category='lo', description='ARABIC LIGATURE TEH WITH MEEM MEDIAL FORM', specials={'medial',0x062A,0x0645} }, + [0xFCE4] = { unicodeslot=0xFCE4, category='lo', description='ARABIC LIGATURE TEH WITH HEH MEDIAL FORM', specials={'medial',0x062A,0x0647} }, + [0xFCE5] = { unicodeslot=0xFCE5, category='lo', description='ARABIC LIGATURE THEH WITH MEEM MEDIAL FORM', specials={'medial',0x062B,0x0645} }, + [0xFCE6] = { unicodeslot=0xFCE6, category='lo', description='ARABIC LIGATURE THEH WITH HEH MEDIAL FORM', specials={'medial',0x062B,0x0647} }, + [0xFCE7] = { unicodeslot=0xFCE7, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM MEDIAL FORM', specials={'medial',0x0633,0x0645} }, + [0xFCE8] = { unicodeslot=0xFCE8, category='lo', description='ARABIC LIGATURE SEEN WITH HEH MEDIAL FORM', specials={'medial',0x0633,0x0647} }, + [0xFCE9] = { unicodeslot=0xFCE9, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM MEDIAL FORM', specials={'medial',0x0634,0x0645} }, + [0xFCEA] = { unicodeslot=0xFCEA, category='lo', description='ARABIC LIGATURE SHEEN WITH HEH MEDIAL FORM', specials={'medial',0x0634,0x0647} }, + [0xFCEB] = { unicodeslot=0xFCEB, category='lo', description='ARABIC LIGATURE KAF WITH LAM MEDIAL FORM', specials={'medial',0x0643,0x0644} }, + [0xFCEC] = { unicodeslot=0xFCEC, category='lo', description='ARABIC LIGATURE KAF WITH MEEM MEDIAL FORM', specials={'medial',0x0643,0x0645} }, + [0xFCED] = { unicodeslot=0xFCED, category='lo', description='ARABIC LIGATURE LAM WITH MEEM MEDIAL FORM', specials={'medial',0x0644,0x0645} }, + [0xFCEE] = { unicodeslot=0xFCEE, category='lo', description='ARABIC LIGATURE NOON WITH MEEM MEDIAL FORM', specials={'medial',0x0646,0x0645} }, + [0xFCEF] = { unicodeslot=0xFCEF, category='lo', description='ARABIC LIGATURE NOON WITH HEH MEDIAL FORM', specials={'medial',0x0646,0x0647} }, + [0xFCF0] = { unicodeslot=0xFCF0, category='lo', description='ARABIC LIGATURE YEH WITH MEEM MEDIAL FORM', specials={'medial',0x064A,0x0645} }, + [0xFCF1] = { unicodeslot=0xFCF1, category='lo', description='ARABIC LIGATURE YEH WITH HEH MEDIAL FORM', specials={'medial',0x064A,0x0647} }, + [0xFCF2] = { unicodeslot=0xFCF2, category='lo', description='ARABIC LIGATURE SHADDA WITH FATHA MEDIAL FORM', specials={'medial',0x0640,0x064E,0x0651} }, + [0xFCF3] = { unicodeslot=0xFCF3, category='lo', description='ARABIC LIGATURE SHADDA WITH DAMMA MEDIAL FORM', specials={'medial',0x0640,0x064F,0x0651} }, + [0xFCF4] = { unicodeslot=0xFCF4, category='lo', description='ARABIC LIGATURE SHADDA WITH KASRA MEDIAL FORM', specials={'medial',0x0640,0x0650,0x0651} }, + [0xFCF5] = { unicodeslot=0xFCF5, category='lo', description='ARABIC LIGATURE TAH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0637,0x0649} }, + [0xFCF6] = { unicodeslot=0xFCF6, category='lo', description='ARABIC LIGATURE TAH WITH YEH ISOLATED FORM', specials={'isolated',0x0637,0x064A} }, + [0xFCF7] = { unicodeslot=0xFCF7, category='lo', description='ARABIC LIGATURE AIN WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0639,0x0649} }, + [0xFCF8] = { unicodeslot=0xFCF8, category='lo', description='ARABIC LIGATURE AIN WITH YEH ISOLATED FORM', specials={'isolated',0x0639,0x064A} }, + [0xFCF9] = { unicodeslot=0xFCF9, category='lo', description='ARABIC LIGATURE GHAIN WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x063A,0x0649} }, + [0xFCFA] = { unicodeslot=0xFCFA, category='lo', description='ARABIC LIGATURE GHAIN WITH YEH ISOLATED FORM', specials={'isolated',0x063A,0x064A} }, + [0xFCFB] = { unicodeslot=0xFCFB, category='lo', description='ARABIC LIGATURE SEEN WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0633,0x0649} }, + [0xFCFC] = { unicodeslot=0xFCFC, category='lo', description='ARABIC LIGATURE SEEN WITH YEH ISOLATED FORM', specials={'isolated',0x0633,0x064A} }, + [0xFCFD] = { unicodeslot=0xFCFD, category='lo', description='ARABIC LIGATURE SHEEN WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0634,0x0649} }, + [0xFCFE] = { unicodeslot=0xFCFE, category='lo', description='ARABIC LIGATURE SHEEN WITH YEH ISOLATED FORM', specials={'isolated',0x0634,0x064A} }, + [0xFCFF] = { unicodeslot=0xFCFF, category='lo', description='ARABIC LIGATURE HAH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x062D,0x0649} }, + [0xFD00] = { unicodeslot=0xFD00, category='lo', description='ARABIC LIGATURE HAH WITH YEH ISOLATED FORM', specials={'isolated',0x062D,0x064A} }, + [0xFD01] = { unicodeslot=0xFD01, category='lo', description='ARABIC LIGATURE JEEM WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x062C,0x0649} }, + [0xFD02] = { unicodeslot=0xFD02, category='lo', description='ARABIC LIGATURE JEEM WITH YEH ISOLATED FORM', specials={'isolated',0x062C,0x064A} }, + [0xFD03] = { unicodeslot=0xFD03, category='lo', description='ARABIC LIGATURE KHAH WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x062E,0x0649} }, + [0xFD04] = { unicodeslot=0xFD04, category='lo', description='ARABIC LIGATURE KHAH WITH YEH ISOLATED FORM', specials={'isolated',0x062E,0x064A} }, + [0xFD05] = { unicodeslot=0xFD05, category='lo', description='ARABIC LIGATURE SAD WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0635,0x0649} }, + [0xFD06] = { unicodeslot=0xFD06, category='lo', description='ARABIC LIGATURE SAD WITH YEH ISOLATED FORM', specials={'isolated',0x0635,0x064A} }, + [0xFD07] = { unicodeslot=0xFD07, category='lo', description='ARABIC LIGATURE DAD WITH ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0636,0x0649} }, + [0xFD08] = { unicodeslot=0xFD08, category='lo', description='ARABIC LIGATURE DAD WITH YEH ISOLATED FORM', specials={'isolated',0x0636,0x064A} }, + [0xFD09] = { unicodeslot=0xFD09, category='lo', description='ARABIC LIGATURE SHEEN WITH JEEM ISOLATED FORM', specials={'isolated',0x0634,0x062C} }, + [0xFD0A] = { unicodeslot=0xFD0A, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH ISOLATED FORM', specials={'isolated',0x0634,0x062D} }, + [0xFD0B] = { unicodeslot=0xFD0B, category='lo', description='ARABIC LIGATURE SHEEN WITH KHAH ISOLATED FORM', specials={'isolated',0x0634,0x062E} }, + [0xFD0C] = { unicodeslot=0xFD0C, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM ISOLATED FORM', specials={'isolated',0x0634,0x0645} }, + [0xFD0D] = { unicodeslot=0xFD0D, category='lo', description='ARABIC LIGATURE SHEEN WITH REH ISOLATED FORM', specials={'isolated',0x0634,0x0631} }, + [0xFD0E] = { unicodeslot=0xFD0E, category='lo', description='ARABIC LIGATURE SEEN WITH REH ISOLATED FORM', specials={'isolated',0x0633,0x0631} }, + [0xFD0F] = { unicodeslot=0xFD0F, category='lo', description='ARABIC LIGATURE SAD WITH REH ISOLATED FORM', specials={'isolated',0x0635,0x0631} }, + [0xFD10] = { unicodeslot=0xFD10, category='lo', description='ARABIC LIGATURE DAD WITH REH ISOLATED FORM', specials={'isolated',0x0636,0x0631} }, + [0xFD11] = { unicodeslot=0xFD11, category='lo', description='ARABIC LIGATURE TAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0637,0x0649} }, + [0xFD12] = { unicodeslot=0xFD12, category='lo', description='ARABIC LIGATURE TAH WITH YEH FINAL FORM', specials={'final',0x0637,0x064A} }, + [0xFD13] = { unicodeslot=0xFD13, category='lo', description='ARABIC LIGATURE AIN WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0639,0x0649} }, + [0xFD14] = { unicodeslot=0xFD14, category='lo', description='ARABIC LIGATURE AIN WITH YEH FINAL FORM', specials={'final',0x0639,0x064A} }, + [0xFD15] = { unicodeslot=0xFD15, category='lo', description='ARABIC LIGATURE GHAIN WITH ALEF MAKSURA FINAL FORM', specials={'final',0x063A,0x0649} }, + [0xFD16] = { unicodeslot=0xFD16, category='lo', description='ARABIC LIGATURE GHAIN WITH YEH FINAL FORM', specials={'final',0x063A,0x064A} }, + [0xFD17] = { unicodeslot=0xFD17, category='lo', description='ARABIC LIGATURE SEEN WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0633,0x0649} }, + [0xFD18] = { unicodeslot=0xFD18, category='lo', description='ARABIC LIGATURE SEEN WITH YEH FINAL FORM', specials={'final',0x0633,0x064A} }, + [0xFD19] = { unicodeslot=0xFD19, category='lo', description='ARABIC LIGATURE SHEEN WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0634,0x0649} }, + [0xFD1A] = { unicodeslot=0xFD1A, category='lo', description='ARABIC LIGATURE SHEEN WITH YEH FINAL FORM', specials={'final',0x0634,0x064A} }, + [0xFD1B] = { unicodeslot=0xFD1B, category='lo', description='ARABIC LIGATURE HAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062D,0x0649} }, + [0xFD1C] = { unicodeslot=0xFD1C, category='lo', description='ARABIC LIGATURE HAH WITH YEH FINAL FORM', specials={'final',0x062D,0x064A} }, + [0xFD1D] = { unicodeslot=0xFD1D, category='lo', description='ARABIC LIGATURE JEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062C,0x0649} }, + [0xFD1E] = { unicodeslot=0xFD1E, category='lo', description='ARABIC LIGATURE JEEM WITH YEH FINAL FORM', specials={'final',0x062C,0x064A} }, + [0xFD1F] = { unicodeslot=0xFD1F, category='lo', description='ARABIC LIGATURE KHAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062E,0x0649} }, + [0xFD20] = { unicodeslot=0xFD20, category='lo', description='ARABIC LIGATURE KHAH WITH YEH FINAL FORM', specials={'final',0x062E,0x064A} }, + [0xFD21] = { unicodeslot=0xFD21, category='lo', description='ARABIC LIGATURE SAD WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0635,0x0649} }, + [0xFD22] = { unicodeslot=0xFD22, category='lo', description='ARABIC LIGATURE SAD WITH YEH FINAL FORM', specials={'final',0x0635,0x064A} }, + [0xFD23] = { unicodeslot=0xFD23, category='lo', description='ARABIC LIGATURE DAD WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0636,0x0649} }, + [0xFD24] = { unicodeslot=0xFD24, category='lo', description='ARABIC LIGATURE DAD WITH YEH FINAL FORM', specials={'final',0x0636,0x064A} }, + [0xFD25] = { unicodeslot=0xFD25, category='lo', description='ARABIC LIGATURE SHEEN WITH JEEM FINAL FORM', specials={'final',0x0634,0x062C} }, + [0xFD26] = { unicodeslot=0xFD26, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH FINAL FORM', specials={'final',0x0634,0x062D} }, + [0xFD27] = { unicodeslot=0xFD27, category='lo', description='ARABIC LIGATURE SHEEN WITH KHAH FINAL FORM', specials={'final',0x0634,0x062E} }, + [0xFD28] = { unicodeslot=0xFD28, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM FINAL FORM', specials={'final',0x0634,0x0645} }, + [0xFD29] = { unicodeslot=0xFD29, category='lo', description='ARABIC LIGATURE SHEEN WITH REH FINAL FORM', specials={'final',0x0634,0x0631} }, + [0xFD2A] = { unicodeslot=0xFD2A, category='lo', description='ARABIC LIGATURE SEEN WITH REH FINAL FORM', specials={'final',0x0633,0x0631} }, + [0xFD2B] = { unicodeslot=0xFD2B, category='lo', description='ARABIC LIGATURE SAD WITH REH FINAL FORM', specials={'final',0x0635,0x0631} }, + [0xFD2C] = { unicodeslot=0xFD2C, category='lo', description='ARABIC LIGATURE DAD WITH REH FINAL FORM', specials={'final',0x0636,0x0631} }, + [0xFD2D] = { unicodeslot=0xFD2D, category='lo', description='ARABIC LIGATURE SHEEN WITH JEEM INITIAL FORM', specials={'initial',0x0634,0x062C} }, + [0xFD2E] = { unicodeslot=0xFD2E, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH INITIAL FORM', specials={'initial',0x0634,0x062D} }, + [0xFD2F] = { unicodeslot=0xFD2F, category='lo', description='ARABIC LIGATURE SHEEN WITH KHAH INITIAL FORM', specials={'initial',0x0634,0x062E} }, + [0xFD30] = { unicodeslot=0xFD30, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM INITIAL FORM', specials={'initial',0x0634,0x0645} }, + [0xFD31] = { unicodeslot=0xFD31, category='lo', description='ARABIC LIGATURE SEEN WITH HEH INITIAL FORM', specials={'initial',0x0633,0x0647} }, + [0xFD32] = { unicodeslot=0xFD32, category='lo', description='ARABIC LIGATURE SHEEN WITH HEH INITIAL FORM', specials={'initial',0x0634,0x0647} }, + [0xFD33] = { unicodeslot=0xFD33, category='lo', description='ARABIC LIGATURE TAH WITH MEEM INITIAL FORM', specials={'initial',0x0637,0x0645} }, + [0xFD34] = { unicodeslot=0xFD34, category='lo', description='ARABIC LIGATURE SEEN WITH JEEM MEDIAL FORM', specials={'medial',0x0633,0x062C} }, + [0xFD35] = { unicodeslot=0xFD35, category='lo', description='ARABIC LIGATURE SEEN WITH HAH MEDIAL FORM', specials={'medial',0x0633,0x062D} }, + [0xFD36] = { unicodeslot=0xFD36, category='lo', description='ARABIC LIGATURE SEEN WITH KHAH MEDIAL FORM', specials={'medial',0x0633,0x062E} }, + [0xFD37] = { unicodeslot=0xFD37, category='lo', description='ARABIC LIGATURE SHEEN WITH JEEM MEDIAL FORM', specials={'medial',0x0634,0x062C} }, + [0xFD38] = { unicodeslot=0xFD38, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH MEDIAL FORM', specials={'medial',0x0634,0x062D} }, + [0xFD39] = { unicodeslot=0xFD39, category='lo', description='ARABIC LIGATURE SHEEN WITH KHAH MEDIAL FORM', specials={'medial',0x0634,0x062E} }, + [0xFD3A] = { unicodeslot=0xFD3A, category='lo', description='ARABIC LIGATURE TAH WITH MEEM MEDIAL FORM', specials={'medial',0x0637,0x0645} }, + [0xFD3B] = { unicodeslot=0xFD3B, category='lo', description='ARABIC LIGATURE ZAH WITH MEEM MEDIAL FORM', specials={'medial',0x0638,0x0645} }, + [0xFD3C] = { unicodeslot=0xFD3C, category='lo', description='ARABIC LIGATURE ALEF WITH FATHATAN FINAL FORM', specials={'final',0x0627,0x064B} }, + [0xFD3D] = { unicodeslot=0xFD3D, category='lo', description='ARABIC LIGATURE ALEF WITH FATHATAN ISOLATED FORM', specials={'isolated',0x0627,0x064B} }, + [0xFD3E] = { unicodeslot=0xFD3E, category='ps', description='ORNATE LEFT PARENTHESIS' }, + [0xFD3F] = { unicodeslot=0xFD3F, category='pe', description='ORNATE RIGHT PARENTHESIS' }, + [0xFD50] = { unicodeslot=0xFD50, category='lo', description='ARABIC LIGATURE TEH WITH JEEM WITH MEEM INITIAL FORM', specials={'initial',0x062A,0x062C,0x0645} }, + [0xFD51] = { unicodeslot=0xFD51, category='lo', description='ARABIC LIGATURE TEH WITH HAH WITH JEEM FINAL FORM', specials={'final',0x062A,0x062D,0x062C} }, + [0xFD52] = { unicodeslot=0xFD52, category='lo', description='ARABIC LIGATURE TEH WITH HAH WITH JEEM INITIAL FORM', specials={'initial',0x062A,0x062D,0x062C} }, + [0xFD53] = { unicodeslot=0xFD53, category='lo', description='ARABIC LIGATURE TEH WITH HAH WITH MEEM INITIAL FORM', specials={'initial',0x062A,0x062D,0x0645} }, + [0xFD54] = { unicodeslot=0xFD54, category='lo', description='ARABIC LIGATURE TEH WITH KHAH WITH MEEM INITIAL FORM', specials={'initial',0x062A,0x062E,0x0645} }, + [0xFD55] = { unicodeslot=0xFD55, category='lo', description='ARABIC LIGATURE TEH WITH MEEM WITH JEEM INITIAL FORM', specials={'initial',0x062A,0x0645,0x062C} }, + [0xFD56] = { unicodeslot=0xFD56, category='lo', description='ARABIC LIGATURE TEH WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x062A,0x0645,0x062D} }, + [0xFD57] = { unicodeslot=0xFD57, category='lo', description='ARABIC LIGATURE TEH WITH MEEM WITH KHAH INITIAL FORM', specials={'initial',0x062A,0x0645,0x062E} }, + [0xFD58] = { unicodeslot=0xFD58, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM WITH HAH FINAL FORM', specials={'final',0x062C,0x0645,0x062D} }, + [0xFD59] = { unicodeslot=0xFD59, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x062C,0x0645,0x062D} }, + [0xFD5A] = { unicodeslot=0xFD5A, category='lo', description='ARABIC LIGATURE HAH WITH MEEM WITH YEH FINAL FORM', specials={'final',0x062D,0x0645,0x064A} }, + [0xFD5B] = { unicodeslot=0xFD5B, category='lo', description='ARABIC LIGATURE HAH WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062D,0x0645,0x0649} }, + [0xFD5C] = { unicodeslot=0xFD5C, category='lo', description='ARABIC LIGATURE SEEN WITH HAH WITH JEEM INITIAL FORM', specials={'initial',0x0633,0x062D,0x062C} }, + [0xFD5D] = { unicodeslot=0xFD5D, category='lo', description='ARABIC LIGATURE SEEN WITH JEEM WITH HAH INITIAL FORM', specials={'initial',0x0633,0x062C,0x062D} }, + [0xFD5E] = { unicodeslot=0xFD5E, category='lo', description='ARABIC LIGATURE SEEN WITH JEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0633,0x062C,0x0649} }, + [0xFD5F] = { unicodeslot=0xFD5F, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM WITH HAH FINAL FORM', specials={'final',0x0633,0x0645,0x062D} }, + [0xFD60] = { unicodeslot=0xFD60, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x0633,0x0645,0x062D} }, + [0xFD61] = { unicodeslot=0xFD61, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM WITH JEEM INITIAL FORM', specials={'initial',0x0633,0x0645,0x062C} }, + [0xFD62] = { unicodeslot=0xFD62, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0633,0x0645,0x0645} }, + [0xFD63] = { unicodeslot=0xFD63, category='lo', description='ARABIC LIGATURE SEEN WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0633,0x0645,0x0645} }, + [0xFD64] = { unicodeslot=0xFD64, category='lo', description='ARABIC LIGATURE SAD WITH HAH WITH HAH FINAL FORM', specials={'final',0x0635,0x062D,0x062D} }, + [0xFD65] = { unicodeslot=0xFD65, category='lo', description='ARABIC LIGATURE SAD WITH HAH WITH HAH INITIAL FORM', specials={'initial',0x0635,0x062D,0x062D} }, + [0xFD66] = { unicodeslot=0xFD66, category='lo', description='ARABIC LIGATURE SAD WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0635,0x0645,0x0645} }, + [0xFD67] = { unicodeslot=0xFD67, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH WITH MEEM FINAL FORM', specials={'final',0x0634,0x062D,0x0645} }, + [0xFD68] = { unicodeslot=0xFD68, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH WITH MEEM INITIAL FORM', specials={'initial',0x0634,0x062D,0x0645} }, + [0xFD69] = { unicodeslot=0xFD69, category='lo', description='ARABIC LIGATURE SHEEN WITH JEEM WITH YEH FINAL FORM', specials={'final',0x0634,0x062C,0x064A} }, + [0xFD6A] = { unicodeslot=0xFD6A, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH FINAL FORM', specials={'final',0x0634,0x0645,0x062E} }, + [0xFD6B] = { unicodeslot=0xFD6B, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM WITH KHAH INITIAL FORM', specials={'initial',0x0634,0x0645,0x062E} }, + [0xFD6C] = { unicodeslot=0xFD6C, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0634,0x0645,0x0645} }, + [0xFD6D] = { unicodeslot=0xFD6D, category='lo', description='ARABIC LIGATURE SHEEN WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0634,0x0645,0x0645} }, + [0xFD6E] = { unicodeslot=0xFD6E, category='lo', description='ARABIC LIGATURE DAD WITH HAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0636,0x062D,0x0649} }, + [0xFD6F] = { unicodeslot=0xFD6F, category='lo', description='ARABIC LIGATURE DAD WITH KHAH WITH MEEM FINAL FORM', specials={'final',0x0636,0x062E,0x0645} }, + [0xFD70] = { unicodeslot=0xFD70, category='lo', description='ARABIC LIGATURE DAD WITH KHAH WITH MEEM INITIAL FORM', specials={'initial',0x0636,0x062E,0x0645} }, + [0xFD71] = { unicodeslot=0xFD71, category='lo', description='ARABIC LIGATURE TAH WITH MEEM WITH HAH FINAL FORM', specials={'final',0x0637,0x0645,0x062D} }, + [0xFD72] = { unicodeslot=0xFD72, category='lo', description='ARABIC LIGATURE TAH WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x0637,0x0645,0x062D} }, + [0xFD73] = { unicodeslot=0xFD73, category='lo', description='ARABIC LIGATURE TAH WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0637,0x0645,0x0645} }, + [0xFD74] = { unicodeslot=0xFD74, category='lo', description='ARABIC LIGATURE TAH WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0637,0x0645,0x064A} }, + [0xFD75] = { unicodeslot=0xFD75, category='lo', description='ARABIC LIGATURE AIN WITH JEEM WITH MEEM FINAL FORM', specials={'final',0x0639,0x062C,0x0645} }, + [0xFD76] = { unicodeslot=0xFD76, category='lo', description='ARABIC LIGATURE AIN WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0639,0x0645,0x0645} }, + [0xFD77] = { unicodeslot=0xFD77, category='lo', description='ARABIC LIGATURE AIN WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0639,0x0645,0x0645} }, + [0xFD78] = { unicodeslot=0xFD78, category='lo', description='ARABIC LIGATURE AIN WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0639,0x0645,0x0649} }, + [0xFD79] = { unicodeslot=0xFD79, category='lo', description='ARABIC LIGATURE GHAIN WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x063A,0x0645,0x0645} }, + [0xFD7A] = { unicodeslot=0xFD7A, category='lo', description='ARABIC LIGATURE GHAIN WITH MEEM WITH YEH FINAL FORM', specials={'final',0x063A,0x0645,0x064A} }, + [0xFD7B] = { unicodeslot=0xFD7B, category='lo', description='ARABIC LIGATURE GHAIN WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x063A,0x0645,0x0649} }, + [0xFD7C] = { unicodeslot=0xFD7C, category='lo', description='ARABIC LIGATURE FEH WITH KHAH WITH MEEM FINAL FORM', specials={'final',0x0641,0x062E,0x0645} }, + [0xFD7D] = { unicodeslot=0xFD7D, category='lo', description='ARABIC LIGATURE FEH WITH KHAH WITH MEEM INITIAL FORM', specials={'initial',0x0641,0x062E,0x0645} }, + [0xFD7E] = { unicodeslot=0xFD7E, category='lo', description='ARABIC LIGATURE QAF WITH MEEM WITH HAH FINAL FORM', specials={'final',0x0642,0x0645,0x062D} }, + [0xFD7F] = { unicodeslot=0xFD7F, category='lo', description='ARABIC LIGATURE QAF WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0642,0x0645,0x0645} }, + [0xFD80] = { unicodeslot=0xFD80, category='lo', description='ARABIC LIGATURE LAM WITH HAH WITH MEEM FINAL FORM', specials={'final',0x0644,0x062D,0x0645} }, + [0xFD81] = { unicodeslot=0xFD81, category='lo', description='ARABIC LIGATURE LAM WITH HAH WITH YEH FINAL FORM', specials={'final',0x0644,0x062D,0x064A} }, + [0xFD82] = { unicodeslot=0xFD82, category='lo', description='ARABIC LIGATURE LAM WITH HAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0644,0x062D,0x0649} }, + [0xFD83] = { unicodeslot=0xFD83, category='lo', description='ARABIC LIGATURE LAM WITH JEEM WITH JEEM INITIAL FORM', specials={'initial',0x0644,0x062C,0x062C} }, + [0xFD84] = { unicodeslot=0xFD84, category='lo', description='ARABIC LIGATURE LAM WITH JEEM WITH JEEM FINAL FORM', specials={'final',0x0644,0x062C,0x062C} }, + [0xFD85] = { unicodeslot=0xFD85, category='lo', description='ARABIC LIGATURE LAM WITH KHAH WITH MEEM FINAL FORM', specials={'final',0x0644,0x062E,0x0645} }, + [0xFD86] = { unicodeslot=0xFD86, category='lo', description='ARABIC LIGATURE LAM WITH KHAH WITH MEEM INITIAL FORM', specials={'initial',0x0644,0x062E,0x0645} }, + [0xFD87] = { unicodeslot=0xFD87, category='lo', description='ARABIC LIGATURE LAM WITH MEEM WITH HAH FINAL FORM', specials={'final',0x0644,0x0645,0x062D} }, + [0xFD88] = { unicodeslot=0xFD88, category='lo', description='ARABIC LIGATURE LAM WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x0644,0x0645,0x062D} }, + [0xFD89] = { unicodeslot=0xFD89, category='lo', description='ARABIC LIGATURE MEEM WITH HAH WITH JEEM INITIAL FORM', specials={'initial',0x0645,0x062D,0x062C} }, + [0xFD8A] = { unicodeslot=0xFD8A, category='lo', description='ARABIC LIGATURE MEEM WITH HAH WITH MEEM INITIAL FORM', specials={'initial',0x0645,0x062D,0x0645} }, + [0xFD8B] = { unicodeslot=0xFD8B, category='lo', description='ARABIC LIGATURE MEEM WITH HAH WITH YEH FINAL FORM', specials={'final',0x0645,0x062D,0x064A} }, + [0xFD8C] = { unicodeslot=0xFD8C, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM WITH HAH INITIAL FORM', specials={'initial',0x0645,0x062C,0x062D} }, + [0xFD8D] = { unicodeslot=0xFD8D, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM WITH MEEM INITIAL FORM', specials={'initial',0x0645,0x062C,0x0645} }, + [0xFD8E] = { unicodeslot=0xFD8E, category='lo', description='ARABIC LIGATURE MEEM WITH KHAH WITH JEEM INITIAL FORM', specials={'initial',0x0645,0x062E,0x062C} }, + [0xFD8F] = { unicodeslot=0xFD8F, category='lo', description='ARABIC LIGATURE MEEM WITH KHAH WITH MEEM INITIAL FORM', specials={'initial',0x0645,0x062E,0x0645} }, + [0xFD92] = { unicodeslot=0xFD92, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM WITH KHAH INITIAL FORM', specials={'initial',0x0645,0x062C,0x062E} }, + [0xFD93] = { unicodeslot=0xFD93, category='lo', description='ARABIC LIGATURE HEH WITH MEEM WITH JEEM INITIAL FORM', specials={'initial',0x0647,0x0645,0x062C} }, + [0xFD94] = { unicodeslot=0xFD94, category='lo', description='ARABIC LIGATURE HEH WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0647,0x0645,0x0645} }, + [0xFD95] = { unicodeslot=0xFD95, category='lo', description='ARABIC LIGATURE NOON WITH HAH WITH MEEM INITIAL FORM', specials={'initial',0x0646,0x062D,0x0645} }, + [0xFD96] = { unicodeslot=0xFD96, category='lo', description='ARABIC LIGATURE NOON WITH HAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0646,0x062D,0x0649} }, + [0xFD97] = { unicodeslot=0xFD97, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH MEEM FINAL FORM', specials={'final',0x0646,0x062C,0x0645} }, + [0xFD98] = { unicodeslot=0xFD98, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH MEEM INITIAL FORM', specials={'initial',0x0646,0x062C,0x0645} }, + [0xFD99] = { unicodeslot=0xFD99, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0646,0x062C,0x0649} }, + [0xFD9A] = { unicodeslot=0xFD9A, category='lo', description='ARABIC LIGATURE NOON WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0646,0x0645,0x064A} }, + [0xFD9B] = { unicodeslot=0xFD9B, category='lo', description='ARABIC LIGATURE NOON WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0646,0x0645,0x0649} }, + [0xFD9C] = { unicodeslot=0xFD9C, category='lo', description='ARABIC LIGATURE YEH WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x064A,0x0645,0x0645} }, + [0xFD9D] = { unicodeslot=0xFD9D, category='lo', description='ARABIC LIGATURE YEH WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x064A,0x0645,0x0645} }, + [0xFD9E] = { unicodeslot=0xFD9E, category='lo', description='ARABIC LIGATURE BEH WITH KHAH WITH YEH FINAL FORM', specials={'final',0x0628,0x062E,0x064A} }, + [0xFD9F] = { unicodeslot=0xFD9F, category='lo', description='ARABIC LIGATURE TEH WITH JEEM WITH YEH FINAL FORM', specials={'final',0x062A,0x062C,0x064A} }, + [0xFDA0] = { unicodeslot=0xFDA0, category='lo', description='ARABIC LIGATURE TEH WITH JEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062A,0x062C,0x0649} }, + [0xFDA1] = { unicodeslot=0xFDA1, category='lo', description='ARABIC LIGATURE TEH WITH KHAH WITH YEH FINAL FORM', specials={'final',0x062A,0x062E,0x064A} }, + [0xFDA2] = { unicodeslot=0xFDA2, category='lo', description='ARABIC LIGATURE TEH WITH KHAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062A,0x062E,0x0649} }, + [0xFDA3] = { unicodeslot=0xFDA3, category='lo', description='ARABIC LIGATURE TEH WITH MEEM WITH YEH FINAL FORM', specials={'final',0x062A,0x0645,0x064A} }, + [0xFDA4] = { unicodeslot=0xFDA4, category='lo', description='ARABIC LIGATURE TEH WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062A,0x0645,0x0649} }, + [0xFDA5] = { unicodeslot=0xFDA5, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM WITH YEH FINAL FORM', specials={'final',0x062C,0x0645,0x064A} }, + [0xFDA6] = { unicodeslot=0xFDA6, category='lo', description='ARABIC LIGATURE JEEM WITH HAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062C,0x062D,0x0649} }, + [0xFDA7] = { unicodeslot=0xFDA7, category='lo', description='ARABIC LIGATURE JEEM WITH MEEM WITH ALEF MAKSURA FINAL FORM', specials={'final',0x062C,0x0645,0x0649} }, + [0xFDA8] = { unicodeslot=0xFDA8, category='lo', description='ARABIC LIGATURE SEEN WITH KHAH WITH ALEF MAKSURA FINAL FORM', specials={'final',0x0633,0x062E,0x0649} }, + [0xFDA9] = { unicodeslot=0xFDA9, category='lo', description='ARABIC LIGATURE SAD WITH HAH WITH YEH FINAL FORM', specials={'final',0x0635,0x062D,0x064A} }, + [0xFDAA] = { unicodeslot=0xFDAA, category='lo', description='ARABIC LIGATURE SHEEN WITH HAH WITH YEH FINAL FORM', specials={'final',0x0634,0x062D,0x064A} }, + [0xFDAB] = { unicodeslot=0xFDAB, category='lo', description='ARABIC LIGATURE DAD WITH HAH WITH YEH FINAL FORM', specials={'final',0x0636,0x062D,0x064A} }, + [0xFDAC] = { unicodeslot=0xFDAC, category='lo', description='ARABIC LIGATURE LAM WITH JEEM WITH YEH FINAL FORM', specials={'final',0x0644,0x062C,0x064A} }, + [0xFDAD] = { unicodeslot=0xFDAD, category='lo', description='ARABIC LIGATURE LAM WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0644,0x0645,0x064A} }, + [0xFDAE] = { unicodeslot=0xFDAE, category='lo', description='ARABIC LIGATURE YEH WITH HAH WITH YEH FINAL FORM', specials={'final',0x064A,0x062D,0x064A} }, + [0xFDAF] = { unicodeslot=0xFDAF, category='lo', description='ARABIC LIGATURE YEH WITH JEEM WITH YEH FINAL FORM', specials={'final',0x064A,0x062C,0x064A} }, + [0xFDB0] = { unicodeslot=0xFDB0, category='lo', description='ARABIC LIGATURE YEH WITH MEEM WITH YEH FINAL FORM', specials={'final',0x064A,0x0645,0x064A} }, + [0xFDB1] = { unicodeslot=0xFDB1, category='lo', description='ARABIC LIGATURE MEEM WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0645,0x0645,0x064A} }, + [0xFDB2] = { unicodeslot=0xFDB2, category='lo', description='ARABIC LIGATURE QAF WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0642,0x0645,0x064A} }, + [0xFDB3] = { unicodeslot=0xFDB3, category='lo', description='ARABIC LIGATURE NOON WITH HAH WITH YEH FINAL FORM', specials={'final',0x0646,0x062D,0x064A} }, + [0xFDB4] = { unicodeslot=0xFDB4, category='lo', description='ARABIC LIGATURE QAF WITH MEEM WITH HAH INITIAL FORM', specials={'initial',0x0642,0x0645,0x062D} }, + [0xFDB5] = { unicodeslot=0xFDB5, category='lo', description='ARABIC LIGATURE LAM WITH HAH WITH MEEM INITIAL FORM', specials={'initial',0x0644,0x062D,0x0645} }, + [0xFDB6] = { unicodeslot=0xFDB6, category='lo', description='ARABIC LIGATURE AIN WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0639,0x0645,0x064A} }, + [0xFDB7] = { unicodeslot=0xFDB7, category='lo', description='ARABIC LIGATURE KAF WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0643,0x0645,0x064A} }, + [0xFDB8] = { unicodeslot=0xFDB8, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH HAH INITIAL FORM', specials={'initial',0x0646,0x062C,0x062D} }, + [0xFDB9] = { unicodeslot=0xFDB9, category='lo', description='ARABIC LIGATURE MEEM WITH KHAH WITH YEH FINAL FORM', specials={'final',0x0645,0x062E,0x064A} }, + [0xFDBA] = { unicodeslot=0xFDBA, category='lo', description='ARABIC LIGATURE LAM WITH JEEM WITH MEEM INITIAL FORM', specials={'initial',0x0644,0x062C,0x0645} }, + [0xFDBB] = { unicodeslot=0xFDBB, category='lo', description='ARABIC LIGATURE KAF WITH MEEM WITH MEEM FINAL FORM', specials={'final',0x0643,0x0645,0x0645} }, + [0xFDBC] = { unicodeslot=0xFDBC, category='lo', description='ARABIC LIGATURE LAM WITH JEEM WITH MEEM FINAL FORM', specials={'final',0x0644,0x062C,0x0645} }, + [0xFDBD] = { unicodeslot=0xFDBD, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH HAH FINAL FORM', specials={'final',0x0646,0x062C,0x062D} }, + [0xFDBE] = { unicodeslot=0xFDBE, category='lo', description='ARABIC LIGATURE JEEM WITH HAH WITH YEH FINAL FORM', specials={'final',0x062C,0x062D,0x064A} }, + [0xFDBF] = { unicodeslot=0xFDBF, category='lo', description='ARABIC LIGATURE HAH WITH JEEM WITH YEH FINAL FORM', specials={'final',0x062D,0x062C,0x064A} }, + [0xFDC0] = { unicodeslot=0xFDC0, category='lo', description='ARABIC LIGATURE MEEM WITH JEEM WITH YEH FINAL FORM', specials={'final',0x0645,0x062C,0x064A} }, + [0xFDC1] = { unicodeslot=0xFDC1, category='lo', description='ARABIC LIGATURE FEH WITH MEEM WITH YEH FINAL FORM', specials={'final',0x0641,0x0645,0x064A} }, + [0xFDC2] = { unicodeslot=0xFDC2, category='lo', description='ARABIC LIGATURE BEH WITH HAH WITH YEH FINAL FORM', specials={'final',0x0628,0x062D,0x064A} }, + [0xFDC3] = { unicodeslot=0xFDC3, category='lo', description='ARABIC LIGATURE KAF WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0643,0x0645,0x0645} }, + [0xFDC4] = { unicodeslot=0xFDC4, category='lo', description='ARABIC LIGATURE AIN WITH JEEM WITH MEEM INITIAL FORM', specials={'initial',0x0639,0x062C,0x0645} }, + [0xFDC5] = { unicodeslot=0xFDC5, category='lo', description='ARABIC LIGATURE SAD WITH MEEM WITH MEEM INITIAL FORM', specials={'initial',0x0635,0x0645,0x0645} }, + [0xFDC6] = { unicodeslot=0xFDC6, category='lo', description='ARABIC LIGATURE SEEN WITH KHAH WITH YEH FINAL FORM', specials={'final',0x0633,0x062E,0x064A} }, + [0xFDC7] = { unicodeslot=0xFDC7, category='lo', description='ARABIC LIGATURE NOON WITH JEEM WITH YEH FINAL FORM', specials={'final',0x0646,0x062C,0x064A} }, + [0xFDF0] = { unicodeslot=0xFDF0, category='lo', description='ARABIC LIGATURE SALLA USED AS KORANIC STOP SIGN ISOLATED FORM', specials={'isolated',0x0635,0x0644,0x06D2} }, + [0xFDF1] = { unicodeslot=0xFDF1, category='lo', description='ARABIC LIGATURE QALA USED AS KORANIC STOP SIGN ISOLATED FORM', specials={'isolated',0x0642,0x0644,0x06D2} }, + [0xFDF2] = { unicodeslot=0xFDF2, category='lo', description='ARABIC LIGATURE ALLAH ISOLATED FORM', specials={'isolated',0x0627,0x0644,0x0644,0x0647} }, + [0xFDF3] = { unicodeslot=0xFDF3, category='lo', description='ARABIC LIGATURE AKBAR ISOLATED FORM', specials={'isolated',0x0627,0x0643,0x0628,0x0631} }, + [0xFDF4] = { unicodeslot=0xFDF4, category='lo', description='ARABIC LIGATURE MOHAMMAD ISOLATED FORM', specials={'isolated',0x0645,0x062D,0x0645,0x062F} }, + [0xFDF5] = { unicodeslot=0xFDF5, category='lo', description='ARABIC LIGATURE SALAM ISOLATED FORM', specials={'isolated',0x0635,0x0644,0x0639,0x0645} }, + [0xFDF6] = { unicodeslot=0xFDF6, category='lo', description='ARABIC LIGATURE RASOUL ISOLATED FORM', specials={'isolated',0x0631,0x0633,0x0648,0x0644} }, + [0xFDF7] = { unicodeslot=0xFDF7, category='lo', description='ARABIC LIGATURE ALAYHE ISOLATED FORM', specials={'isolated',0x0639,0x0644,0x064A,0x0647} }, + [0xFDF8] = { unicodeslot=0xFDF8, category='lo', description='ARABIC LIGATURE WASALLAM ISOLATED FORM', specials={'isolated',0x0648,0x0633,0x0644,0x0645} }, + [0xFDF9] = { unicodeslot=0xFDF9, category='lo', description='ARABIC LIGATURE SALLA ISOLATED FORM', specials={'isolated',0x0635,0x0644,0x0649} }, + [0xFDFA] = { unicodeslot=0xFDFA, category='lo', description='ARABIC LIGATURE SALLALLAHOU ALAYHE WASALLAM', specials={'isolated',0x0635,0x0644,0x0649,0x0020,0x0627,0x0644,0x0644,0x0647,0x0020,0x0639,0x0644,0x064A,0x0647,0x0020,0x0648,0x0633,0x0644,0x0645} }, + [0xFDFB] = { unicodeslot=0xFDFB, category='lo', description='ARABIC LIGATURE JALLAJALALOUHOU', specials={'isolated',0x062C,0x0644,0x0020,0x062C,0x0644,0x0627,0x0644,0x0647} }, + [0xFDFC] = { unicodeslot=0xFDFC, category='sc', description='RIAL SIGN', specials={'isolated',0x0631,0x06CC,0x0627,0x0644} }, + [0xFDFD] = { unicodeslot=0xFDFD, category='so', description='ARABIC LIGATURE BISMILLAH AR-RAHMAN AR-RAHEEM' }, + [0xFE00] = { unicodeslot=0xFE00, category='mn', description='VARIATION SELECTOR-1' }, + [0xFE01] = { unicodeslot=0xFE01, category='mn', description='VARIATION SELECTOR-2' }, + [0xFE02] = { unicodeslot=0xFE02, category='mn', description='VARIATION SELECTOR-3' }, + [0xFE03] = { unicodeslot=0xFE03, category='mn', description='VARIATION SELECTOR-4' }, + [0xFE04] = { unicodeslot=0xFE04, category='mn', description='VARIATION SELECTOR-5' }, + [0xFE05] = { unicodeslot=0xFE05, category='mn', description='VARIATION SELECTOR-6' }, + [0xFE06] = { unicodeslot=0xFE06, category='mn', description='VARIATION SELECTOR-7' }, + [0xFE07] = { unicodeslot=0xFE07, category='mn', description='VARIATION SELECTOR-8' }, + [0xFE08] = { unicodeslot=0xFE08, category='mn', description='VARIATION SELECTOR-9' }, + [0xFE09] = { unicodeslot=0xFE09, category='mn', description='VARIATION SELECTOR-10' }, + [0xFE0A] = { unicodeslot=0xFE0A, category='mn', description='VARIATION SELECTOR-11' }, + [0xFE0B] = { unicodeslot=0xFE0B, category='mn', description='VARIATION SELECTOR-12' }, + [0xFE0C] = { unicodeslot=0xFE0C, category='mn', description='VARIATION SELECTOR-13' }, + [0xFE0D] = { unicodeslot=0xFE0D, category='mn', description='VARIATION SELECTOR-14' }, + [0xFE0E] = { unicodeslot=0xFE0E, category='mn', description='VARIATION SELECTOR-15' }, + [0xFE0F] = { unicodeslot=0xFE0F, category='mn', description='VARIATION SELECTOR-16' }, + [0xFE10] = { unicodeslot=0xFE10, category='po', description='PRESENTATION FORM FOR VERTICAL COMMA', specials={'vertical',0x002C} }, + [0xFE11] = { unicodeslot=0xFE11, category='po', description='PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA', specials={'vertical',0x3001} }, + [0xFE12] = { unicodeslot=0xFE12, category='po', description='PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP', specials={'vertical',0x3002} }, + [0xFE13] = { unicodeslot=0xFE13, category='po', description='PRESENTATION FORM FOR VERTICAL COLON', specials={'vertical',0x003A} }, + [0xFE14] = { unicodeslot=0xFE14, category='po', description='PRESENTATION FORM FOR VERTICAL SEMICOLON', specials={'vertical',0x003B} }, + [0xFE15] = { unicodeslot=0xFE15, category='po', description='PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK', specials={'vertical',0x0021} }, + [0xFE16] = { unicodeslot=0xFE16, category='po', description='PRESENTATION FORM FOR VERTICAL QUESTION MARK', specials={'vertical',0x003F} }, + [0xFE17] = { unicodeslot=0xFE17, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET', specials={'vertical',0x3016} }, + [0xFE18] = { unicodeslot=0xFE18, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET', specials={'vertical',0x3017} }, + [0xFE19] = { unicodeslot=0xFE19, category='po', description='PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS', specials={'vertical',0x2026} }, + [0xFE20] = { unicodeslot=0xFE20, category='mn', description='COMBINING LIGATURE LEFT HALF' }, + [0xFE21] = { unicodeslot=0xFE21, category='mn', description='COMBINING LIGATURE RIGHT HALF' }, + [0xFE22] = { unicodeslot=0xFE22, category='mn', description='COMBINING DOUBLE TILDE LEFT HALF' }, + [0xFE23] = { unicodeslot=0xFE23, category='mn', description='COMBINING DOUBLE TILDE RIGHT HALF' }, + [0xFE30] = { unicodeslot=0xFE30, category='po', description='PRESENTATION FORM FOR VERTICAL TWO DOT LEADER', specials={'vertical',0x2025} }, + [0xFE31] = { unicodeslot=0xFE31, category='pd', description='PRESENTATION FORM FOR VERTICAL EM DASH', specials={'vertical',0x2014} }, + [0xFE32] = { unicodeslot=0xFE32, category='pd', description='PRESENTATION FORM FOR VERTICAL EN DASH', specials={'vertical',0x2013} }, + [0xFE33] = { unicodeslot=0xFE33, category='pc', description='PRESENTATION FORM FOR VERTICAL LOW LINE', specials={'vertical',0x005F} }, + [0xFE34] = { unicodeslot=0xFE34, category='pc', description='PRESENTATION FORM FOR VERTICAL WAVY LOW LINE', specials={'vertical',0x005F} }, + [0xFE35] = { unicodeslot=0xFE35, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS', specials={'vertical',0x0028} }, + [0xFE36] = { unicodeslot=0xFE36, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS', specials={'vertical',0x0029} }, + [0xFE37] = { unicodeslot=0xFE37, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET', specials={'vertical',0x007B} }, + [0xFE38] = { unicodeslot=0xFE38, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET', specials={'vertical',0x007D} }, + [0xFE39] = { unicodeslot=0xFE39, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET', specials={'vertical',0x3014} }, + [0xFE3A] = { unicodeslot=0xFE3A, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET', specials={'vertical',0x3015} }, + [0xFE3B] = { unicodeslot=0xFE3B, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET', specials={'vertical',0x3010} }, + [0xFE3C] = { unicodeslot=0xFE3C, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET', specials={'vertical',0x3011} }, + [0xFE3D] = { unicodeslot=0xFE3D, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET', specials={'vertical',0x300A} }, + [0xFE3E] = { unicodeslot=0xFE3E, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET', specials={'vertical',0x300B} }, + [0xFE3F] = { unicodeslot=0xFE3F, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET', specials={'vertical',0x3008} }, + [0xFE40] = { unicodeslot=0xFE40, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET', specials={'vertical',0x3009} }, + [0xFE41] = { unicodeslot=0xFE41, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET', specials={'vertical',0x300C} }, + [0xFE42] = { unicodeslot=0xFE42, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET', specials={'vertical',0x300D} }, + [0xFE43] = { unicodeslot=0xFE43, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET', specials={'vertical',0x300E} }, + [0xFE44] = { unicodeslot=0xFE44, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET', specials={'vertical',0x300F} }, + [0xFE45] = { unicodeslot=0xFE45, category='po', description='SESAME DOT' }, + [0xFE46] = { unicodeslot=0xFE46, category='po', description='WHITE SESAME DOT' }, + [0xFE47] = { unicodeslot=0xFE47, category='ps', description='PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET', specials={'vertical',0x005B} }, + [0xFE48] = { unicodeslot=0xFE48, category='pe', description='PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET', specials={'vertical',0x005D} }, + [0xFE49] = { unicodeslot=0xFE49, category='po', description='DASHED OVERLINE', specials={'compat',0x203E} }, + [0xFE4A] = { unicodeslot=0xFE4A, category='po', description='CENTRELINE OVERLINE', specials={'compat',0x203E} }, + [0xFE4B] = { unicodeslot=0xFE4B, category='po', description='WAVY OVERLINE', specials={'compat',0x203E} }, + [0xFE4C] = { unicodeslot=0xFE4C, category='po', description='DOUBLE WAVY OVERLINE', specials={'compat',0x203E} }, + [0xFE4D] = { unicodeslot=0xFE4D, category='pc', description='DASHED LOW LINE', specials={'compat',0x005F} }, + [0xFE4E] = { unicodeslot=0xFE4E, category='pc', description='CENTRELINE LOW LINE', specials={'compat',0x005F} }, + [0xFE4F] = { unicodeslot=0xFE4F, category='pc', description='WAVY LOW LINE', specials={'compat',0x005F} }, + [0xFE50] = { unicodeslot=0xFE50, category='po', description='SMALL COMMA', specials={'small',0x002C} }, + [0xFE51] = { unicodeslot=0xFE51, category='po', description='SMALL IDEOGRAPHIC COMMA', specials={'small',0x3001} }, + [0xFE52] = { unicodeslot=0xFE52, category='po', description='SMALL FULL STOP', specials={'small',0x002E} }, + [0xFE54] = { unicodeslot=0xFE54, category='po', description='SMALL SEMICOLON', specials={'small',0x003B} }, + [0xFE55] = { unicodeslot=0xFE55, category='po', description='SMALL COLON', specials={'small',0x003A} }, + [0xFE56] = { unicodeslot=0xFE56, category='po', description='SMALL QUESTION MARK', specials={'small',0x003F} }, + [0xFE57] = { unicodeslot=0xFE57, category='po', description='SMALL EXCLAMATION MARK', specials={'small',0x0021} }, + [0xFE58] = { unicodeslot=0xFE58, category='pd', description='SMALL EM DASH', specials={'small',0x2014} }, + [0xFE59] = { unicodeslot=0xFE59, category='ps', description='SMALL LEFT PARENTHESIS', specials={'small',0x0028} }, + [0xFE5A] = { unicodeslot=0xFE5A, category='pe', description='SMALL RIGHT PARENTHESIS', specials={'small',0x0029} }, + [0xFE5B] = { unicodeslot=0xFE5B, category='ps', description='SMALL LEFT CURLY BRACKET', specials={'small',0x007B} }, + [0xFE5C] = { unicodeslot=0xFE5C, category='pe', description='SMALL RIGHT CURLY BRACKET', specials={'small',0x007D} }, + [0xFE5D] = { unicodeslot=0xFE5D, category='ps', description='SMALL LEFT TORTOISE SHELL BRACKET', specials={'small',0x3014} }, + [0xFE5E] = { unicodeslot=0xFE5E, category='pe', description='SMALL RIGHT TORTOISE SHELL BRACKET', specials={'small',0x3015} }, + [0xFE5F] = { unicodeslot=0xFE5F, category='po', description='SMALL NUMBER SIGN', specials={'small',0x0023} }, + [0xFE60] = { unicodeslot=0xFE60, category='po', description='SMALL AMPERSAND', specials={'small',0x0026} }, + [0xFE61] = { unicodeslot=0xFE61, category='po', description='SMALL ASTERISK', specials={'small',0x002A} }, + [0xFE62] = { unicodeslot=0xFE62, category='sm', description='SMALL PLUS SIGN', specials={'small',0x002B} }, + [0xFE63] = { unicodeslot=0xFE63, category='pd', description='SMALL HYPHEN-MINUS', specials={'small',0x002D} }, + [0xFE64] = { unicodeslot=0xFE64, category='sm', description='SMALL LESS-THAN SIGN', specials={'small',0x003C} }, + [0xFE65] = { unicodeslot=0xFE65, category='sm', description='SMALL GREATER-THAN SIGN', specials={'small',0x003E} }, + [0xFE66] = { unicodeslot=0xFE66, category='sm', description='SMALL EQUALS SIGN', specials={'small',0x003D} }, + [0xFE68] = { unicodeslot=0xFE68, category='po', description='SMALL REVERSE SOLIDUS', specials={'small',0x005C} }, + [0xFE69] = { unicodeslot=0xFE69, category='sc', description='SMALL DOLLAR SIGN', specials={'small',0x0024} }, + [0xFE6A] = { unicodeslot=0xFE6A, category='po', description='SMALL PERCENT SIGN', specials={'small',0x0025} }, + [0xFE6B] = { unicodeslot=0xFE6B, category='po', description='SMALL COMMERCIAL AT', specials={'small',0x0040} }, + [0xFE70] = { unicodeslot=0xFE70, category='lo', description='ARABIC FATHATAN ISOLATED FORM', specials={'isolated',0x0020,0x064B} }, + [0xFE71] = { unicodeslot=0xFE71, category='lo', description='ARABIC TATWEEL WITH FATHATAN ABOVE', specials={'medial',0x0640,0x064B} }, + [0xFE72] = { unicodeslot=0xFE72, category='lo', description='ARABIC DAMMATAN ISOLATED FORM', specials={'isolated',0x0020,0x064C} }, + [0xFE73] = { unicodeslot=0xFE73, category='lo', description='ARABIC TAIL FRAGMENT' }, + [0xFE74] = { unicodeslot=0xFE74, category='lo', description='ARABIC KASRATAN ISOLATED FORM', specials={'isolated',0x0020,0x064D} }, + [0xFE76] = { unicodeslot=0xFE76, category='lo', description='ARABIC FATHA ISOLATED FORM', specials={'isolated',0x0020,0x064E} }, + [0xFE77] = { unicodeslot=0xFE77, category='lo', description='ARABIC FATHA MEDIAL FORM', specials={'medial',0x0640,0x064E} }, + [0xFE78] = { unicodeslot=0xFE78, category='lo', description='ARABIC DAMMA ISOLATED FORM', specials={'isolated',0x0020,0x064F} }, + [0xFE79] = { unicodeslot=0xFE79, category='lo', description='ARABIC DAMMA MEDIAL FORM', specials={'medial',0x0640,0x064F} }, + [0xFE7A] = { unicodeslot=0xFE7A, category='lo', description='ARABIC KASRA ISOLATED FORM', specials={'isolated',0x0020,0x0650} }, + [0xFE7B] = { unicodeslot=0xFE7B, category='lo', description='ARABIC KASRA MEDIAL FORM', specials={'medial',0x0640,0x0650} }, + [0xFE7C] = { unicodeslot=0xFE7C, category='lo', description='ARABIC SHADDA ISOLATED FORM', specials={'isolated',0x0020,0x0651} }, + [0xFE7D] = { unicodeslot=0xFE7D, category='lo', description='ARABIC SHADDA MEDIAL FORM', specials={'medial',0x0640,0x0651} }, + [0xFE7E] = { unicodeslot=0xFE7E, category='lo', description='ARABIC SUKUN ISOLATED FORM', specials={'isolated',0x0020,0x0652} }, + [0xFE7F] = { unicodeslot=0xFE7F, category='lo', description='ARABIC SUKUN MEDIAL FORM', specials={'medial',0x0640,0x0652} }, + [0xFE80] = { unicodeslot=0xFE80, category='lo', description='ARABIC LETTER HAMZA ISOLATED FORM', specials={'isolated',0x0621} }, + [0xFE81] = { unicodeslot=0xFE81, category='lo', description='ARABIC LETTER ALEF WITH MADDA ABOVE ISOLATED FORM', shcode=0x0627, specials={'isolated',0x0622} }, + [0xFE82] = { unicodeslot=0xFE82, category='lo', description='ARABIC LETTER ALEF WITH MADDA ABOVE FINAL FORM', shcode=0x0627, specials={'final',0x0622} }, + [0xFE83] = { unicodeslot=0xFE83, category='lo', description='ARABIC LETTER ALEF WITH HAMZA ABOVE ISOLATED FORM', shcode=0x0627, specials={'isolated',0x0623} }, + [0xFE84] = { unicodeslot=0xFE84, category='lo', description='ARABIC LETTER ALEF WITH HAMZA ABOVE FINAL FORM', shcode=0x0627, specials={'final',0x0623} }, + [0xFE85] = { unicodeslot=0xFE85, category='lo', description='ARABIC LETTER WAW WITH HAMZA ABOVE ISOLATED FORM', shcode=0x0648, specials={'isolated',0x0624} }, + [0xFE86] = { unicodeslot=0xFE86, category='lo', description='ARABIC LETTER WAW WITH HAMZA ABOVE FINAL FORM', shcode=0x0648, specials={'final',0x0624} }, + [0xFE87] = { unicodeslot=0xFE87, category='lo', description='ARABIC LETTER ALEF WITH HAMZA BELOW ISOLATED FORM', shcode=0x0627, specials={'isolated',0x0625} }, + [0xFE88] = { unicodeslot=0xFE88, category='lo', description='ARABIC LETTER ALEF WITH HAMZA BELOW FINAL FORM', shcode=0x0627, specials={'final',0x0625} }, + [0xFE89] = { unicodeslot=0xFE89, category='lo', description='ARABIC LETTER YEH WITH HAMZA ABOVE ISOLATED FORM', shcode=0x064A, specials={'isolated',0x0626} }, + [0xFE8A] = { unicodeslot=0xFE8A, category='lo', description='ARABIC LETTER YEH WITH HAMZA ABOVE FINAL FORM', shcode=0x064A, specials={'final',0x0626} }, + [0xFE8B] = { unicodeslot=0xFE8B, category='lo', description='ARABIC LETTER YEH WITH HAMZA ABOVE INITIAL FORM', shcode=0x064A, specials={'initial',0x0626} }, + [0xFE8C] = { unicodeslot=0xFE8C, category='lo', description='ARABIC LETTER YEH WITH HAMZA ABOVE MEDIAL FORM', shcode=0x064A, specials={'medial',0x0626} }, + [0xFE8D] = { unicodeslot=0xFE8D, category='lo', description='ARABIC LETTER ALEF ISOLATED FORM', specials={'isolated',0x0627} }, + [0xFE8E] = { unicodeslot=0xFE8E, category='lo', description='ARABIC LETTER ALEF FINAL FORM', specials={'final',0x0627} }, + [0xFE8F] = { unicodeslot=0xFE8F, category='lo', description='ARABIC LETTER BEH ISOLATED FORM', specials={'isolated',0x0628} }, + [0xFE90] = { unicodeslot=0xFE90, category='lo', description='ARABIC LETTER BEH FINAL FORM', specials={'final',0x0628} }, + [0xFE91] = { unicodeslot=0xFE91, category='lo', description='ARABIC LETTER BEH INITIAL FORM', specials={'initial',0x0628} }, + [0xFE92] = { unicodeslot=0xFE92, category='lo', description='ARABIC LETTER BEH MEDIAL FORM', specials={'medial',0x0628} }, + [0xFE93] = { unicodeslot=0xFE93, category='lo', description='ARABIC LETTER TEH MARBUTA ISOLATED FORM', specials={'isolated',0x0629} }, + [0xFE94] = { unicodeslot=0xFE94, category='lo', description='ARABIC LETTER TEH MARBUTA FINAL FORM', specials={'final',0x0629} }, + [0xFE95] = { unicodeslot=0xFE95, category='lo', description='ARABIC LETTER TEH ISOLATED FORM', specials={'isolated',0x062A} }, + [0xFE96] = { unicodeslot=0xFE96, category='lo', description='ARABIC LETTER TEH FINAL FORM', specials={'final',0x062A} }, + [0xFE97] = { unicodeslot=0xFE97, category='lo', description='ARABIC LETTER TEH INITIAL FORM', specials={'initial',0x062A} }, + [0xFE98] = { unicodeslot=0xFE98, category='lo', description='ARABIC LETTER TEH MEDIAL FORM', specials={'medial',0x062A} }, + [0xFE99] = { unicodeslot=0xFE99, category='lo', description='ARABIC LETTER THEH ISOLATED FORM', specials={'isolated',0x062B} }, + [0xFE9A] = { unicodeslot=0xFE9A, category='lo', description='ARABIC LETTER THEH FINAL FORM', specials={'final',0x062B} }, + [0xFE9B] = { unicodeslot=0xFE9B, category='lo', description='ARABIC LETTER THEH INITIAL FORM', specials={'initial',0x062B} }, + [0xFE9C] = { unicodeslot=0xFE9C, category='lo', description='ARABIC LETTER THEH MEDIAL FORM', specials={'medial',0x062B} }, + [0xFE9D] = { unicodeslot=0xFE9D, category='lo', description='ARABIC LETTER JEEM ISOLATED FORM', specials={'isolated',0x062C} }, + [0xFE9E] = { unicodeslot=0xFE9E, category='lo', description='ARABIC LETTER JEEM FINAL FORM', specials={'final',0x062C} }, + [0xFE9F] = { unicodeslot=0xFE9F, category='lo', description='ARABIC LETTER JEEM INITIAL FORM', specials={'initial',0x062C} }, + [0xFEA0] = { unicodeslot=0xFEA0, category='lo', description='ARABIC LETTER JEEM MEDIAL FORM', specials={'medial',0x062C} }, + [0xFEA1] = { unicodeslot=0xFEA1, category='lo', description='ARABIC LETTER HAH ISOLATED FORM', specials={'isolated',0x062D} }, + [0xFEA2] = { unicodeslot=0xFEA2, category='lo', description='ARABIC LETTER HAH FINAL FORM', specials={'final',0x062D} }, + [0xFEA3] = { unicodeslot=0xFEA3, category='lo', description='ARABIC LETTER HAH INITIAL FORM', specials={'initial',0x062D} }, + [0xFEA4] = { unicodeslot=0xFEA4, category='lo', description='ARABIC LETTER HAH MEDIAL FORM', specials={'medial',0x062D} }, + [0xFEA5] = { unicodeslot=0xFEA5, category='lo', description='ARABIC LETTER KHAH ISOLATED FORM', specials={'isolated',0x062E} }, + [0xFEA6] = { unicodeslot=0xFEA6, category='lo', description='ARABIC LETTER KHAH FINAL FORM', specials={'final',0x062E} }, + [0xFEA7] = { unicodeslot=0xFEA7, category='lo', description='ARABIC LETTER KHAH INITIAL FORM', specials={'initial',0x062E} }, + [0xFEA8] = { unicodeslot=0xFEA8, category='lo', description='ARABIC LETTER KHAH MEDIAL FORM', specials={'medial',0x062E} }, + [0xFEA9] = { unicodeslot=0xFEA9, category='lo', description='ARABIC LETTER DAL ISOLATED FORM', specials={'isolated',0x062F} }, + [0xFEAA] = { unicodeslot=0xFEAA, category='lo', description='ARABIC LETTER DAL FINAL FORM', specials={'final',0x062F} }, + [0xFEAB] = { unicodeslot=0xFEAB, category='lo', description='ARABIC LETTER THAL ISOLATED FORM', specials={'isolated',0x0630} }, + [0xFEAC] = { unicodeslot=0xFEAC, category='lo', description='ARABIC LETTER THAL FINAL FORM', specials={'final',0x0630} }, + [0xFEAD] = { unicodeslot=0xFEAD, category='lo', description='ARABIC LETTER REH ISOLATED FORM', specials={'isolated',0x0631} }, + [0xFEAE] = { unicodeslot=0xFEAE, category='lo', description='ARABIC LETTER REH FINAL FORM', specials={'final',0x0631} }, + [0xFEAF] = { unicodeslot=0xFEAF, category='lo', description='ARABIC LETTER ZAIN ISOLATED FORM', specials={'isolated',0x0632} }, + [0xFEB0] = { unicodeslot=0xFEB0, category='lo', description='ARABIC LETTER ZAIN FINAL FORM', specials={'final',0x0632} }, + [0xFEB1] = { unicodeslot=0xFEB1, category='lo', description='ARABIC LETTER SEEN ISOLATED FORM', specials={'isolated',0x0633} }, + [0xFEB2] = { unicodeslot=0xFEB2, category='lo', description='ARABIC LETTER SEEN FINAL FORM', specials={'final',0x0633} }, + [0xFEB3] = { unicodeslot=0xFEB3, category='lo', description='ARABIC LETTER SEEN INITIAL FORM', specials={'initial',0x0633} }, + [0xFEB4] = { unicodeslot=0xFEB4, category='lo', description='ARABIC LETTER SEEN MEDIAL FORM', specials={'medial',0x0633} }, + [0xFEB5] = { unicodeslot=0xFEB5, category='lo', description='ARABIC LETTER SHEEN ISOLATED FORM', specials={'isolated',0x0634} }, + [0xFEB6] = { unicodeslot=0xFEB6, category='lo', description='ARABIC LETTER SHEEN FINAL FORM', specials={'final',0x0634} }, + [0xFEB7] = { unicodeslot=0xFEB7, category='lo', description='ARABIC LETTER SHEEN INITIAL FORM', specials={'initial',0x0634} }, + [0xFEB8] = { unicodeslot=0xFEB8, category='lo', description='ARABIC LETTER SHEEN MEDIAL FORM', specials={'medial',0x0634} }, + [0xFEB9] = { unicodeslot=0xFEB9, category='lo', description='ARABIC LETTER SAD ISOLATED FORM', specials={'isolated',0x0635} }, + [0xFEBA] = { unicodeslot=0xFEBA, category='lo', description='ARABIC LETTER SAD FINAL FORM', specials={'final',0x0635} }, + [0xFEBB] = { unicodeslot=0xFEBB, category='lo', description='ARABIC LETTER SAD INITIAL FORM', specials={'initial',0x0635} }, + [0xFEBC] = { unicodeslot=0xFEBC, category='lo', description='ARABIC LETTER SAD MEDIAL FORM', specials={'medial',0x0635} }, + [0xFEBD] = { unicodeslot=0xFEBD, category='lo', description='ARABIC LETTER DAD ISOLATED FORM', specials={'isolated',0x0636} }, + [0xFEBE] = { unicodeslot=0xFEBE, category='lo', description='ARABIC LETTER DAD FINAL FORM', specials={'final',0x0636} }, + [0xFEBF] = { unicodeslot=0xFEBF, category='lo', description='ARABIC LETTER DAD INITIAL FORM', specials={'initial',0x0636} }, + [0xFEC0] = { unicodeslot=0xFEC0, category='lo', description='ARABIC LETTER DAD MEDIAL FORM', specials={'medial',0x0636} }, + [0xFEC1] = { unicodeslot=0xFEC1, category='lo', description='ARABIC LETTER TAH ISOLATED FORM', specials={'isolated',0x0637} }, + [0xFEC2] = { unicodeslot=0xFEC2, category='lo', description='ARABIC LETTER TAH FINAL FORM', specials={'final',0x0637} }, + [0xFEC3] = { unicodeslot=0xFEC3, category='lo', description='ARABIC LETTER TAH INITIAL FORM', specials={'initial',0x0637} }, + [0xFEC4] = { unicodeslot=0xFEC4, category='lo', description='ARABIC LETTER TAH MEDIAL FORM', specials={'medial',0x0637} }, + [0xFEC5] = { unicodeslot=0xFEC5, category='lo', description='ARABIC LETTER ZAH ISOLATED FORM', specials={'isolated',0x0638} }, + [0xFEC6] = { unicodeslot=0xFEC6, category='lo', description='ARABIC LETTER ZAH FINAL FORM', specials={'final',0x0638} }, + [0xFEC7] = { unicodeslot=0xFEC7, category='lo', description='ARABIC LETTER ZAH INITIAL FORM', specials={'initial',0x0638} }, + [0xFEC8] = { unicodeslot=0xFEC8, category='lo', description='ARABIC LETTER ZAH MEDIAL FORM', specials={'medial',0x0638} }, + [0xFEC9] = { unicodeslot=0xFEC9, category='lo', description='ARABIC LETTER AIN ISOLATED FORM', specials={'isolated',0x0639} }, + [0xFECA] = { unicodeslot=0xFECA, category='lo', description='ARABIC LETTER AIN FINAL FORM', specials={'final',0x0639} }, + [0xFECB] = { unicodeslot=0xFECB, category='lo', description='ARABIC LETTER AIN INITIAL FORM', specials={'initial',0x0639} }, + [0xFECC] = { unicodeslot=0xFECC, category='lo', description='ARABIC LETTER AIN MEDIAL FORM', specials={'medial',0x0639} }, + [0xFECD] = { unicodeslot=0xFECD, category='lo', description='ARABIC LETTER GHAIN ISOLATED FORM', specials={'isolated',0x063A} }, + [0xFECE] = { unicodeslot=0xFECE, category='lo', description='ARABIC LETTER GHAIN FINAL FORM', specials={'final',0x063A} }, + [0xFECF] = { unicodeslot=0xFECF, category='lo', description='ARABIC LETTER GHAIN INITIAL FORM', specials={'initial',0x063A} }, + [0xFED0] = { unicodeslot=0xFED0, category='lo', description='ARABIC LETTER GHAIN MEDIAL FORM', specials={'medial',0x063A} }, + [0xFED1] = { unicodeslot=0xFED1, category='lo', description='ARABIC LETTER FEH ISOLATED FORM', specials={'isolated',0x0641} }, + [0xFED2] = { unicodeslot=0xFED2, category='lo', description='ARABIC LETTER FEH FINAL FORM', specials={'final',0x0641} }, + [0xFED3] = { unicodeslot=0xFED3, category='lo', description='ARABIC LETTER FEH INITIAL FORM', specials={'initial',0x0641} }, + [0xFED4] = { unicodeslot=0xFED4, category='lo', description='ARABIC LETTER FEH MEDIAL FORM', specials={'medial',0x0641} }, + [0xFED5] = { unicodeslot=0xFED5, category='lo', description='ARABIC LETTER QAF ISOLATED FORM', specials={'isolated',0x0642} }, + [0xFED6] = { unicodeslot=0xFED6, category='lo', description='ARABIC LETTER QAF FINAL FORM', specials={'final',0x0642} }, + [0xFED7] = { unicodeslot=0xFED7, category='lo', description='ARABIC LETTER QAF INITIAL FORM', specials={'initial',0x0642} }, + [0xFED8] = { unicodeslot=0xFED8, category='lo', description='ARABIC LETTER QAF MEDIAL FORM', specials={'medial',0x0642} }, + [0xFED9] = { unicodeslot=0xFED9, category='lo', description='ARABIC LETTER KAF ISOLATED FORM', specials={'isolated',0x0643} }, + [0xFEDA] = { unicodeslot=0xFEDA, category='lo', description='ARABIC LETTER KAF FINAL FORM', specials={'final',0x0643} }, + [0xFEDB] = { unicodeslot=0xFEDB, category='lo', description='ARABIC LETTER KAF INITIAL FORM', specials={'initial',0x0643} }, + [0xFEDC] = { unicodeslot=0xFEDC, category='lo', description='ARABIC LETTER KAF MEDIAL FORM', specials={'medial',0x0643} }, + [0xFEDD] = { unicodeslot=0xFEDD, category='lo', description='ARABIC LETTER LAM ISOLATED FORM', specials={'isolated',0x0644} }, + [0xFEDE] = { unicodeslot=0xFEDE, category='lo', description='ARABIC LETTER LAM FINAL FORM', specials={'final',0x0644} }, + [0xFEDF] = { unicodeslot=0xFEDF, category='lo', description='ARABIC LETTER LAM INITIAL FORM', specials={'initial',0x0644} }, + [0xFEE0] = { unicodeslot=0xFEE0, category='lo', description='ARABIC LETTER LAM MEDIAL FORM', specials={'medial',0x0644} }, + [0xFEE1] = { unicodeslot=0xFEE1, category='lo', description='ARABIC LETTER MEEM ISOLATED FORM', specials={'isolated',0x0645} }, + [0xFEE2] = { unicodeslot=0xFEE2, category='lo', description='ARABIC LETTER MEEM FINAL FORM', specials={'final',0x0645} }, + [0xFEE3] = { unicodeslot=0xFEE3, category='lo', description='ARABIC LETTER MEEM INITIAL FORM', specials={'initial',0x0645} }, + [0xFEE4] = { unicodeslot=0xFEE4, category='lo', description='ARABIC LETTER MEEM MEDIAL FORM', specials={'medial',0x0645} }, + [0xFEE5] = { unicodeslot=0xFEE5, category='lo', description='ARABIC LETTER NOON ISOLATED FORM', specials={'isolated',0x0646} }, + [0xFEE6] = { unicodeslot=0xFEE6, category='lo', description='ARABIC LETTER NOON FINAL FORM', specials={'final',0x0646} }, + [0xFEE7] = { unicodeslot=0xFEE7, category='lo', description='ARABIC LETTER NOON INITIAL FORM', specials={'initial',0x0646} }, + [0xFEE8] = { unicodeslot=0xFEE8, category='lo', description='ARABIC LETTER NOON MEDIAL FORM', specials={'medial',0x0646} }, + [0xFEE9] = { unicodeslot=0xFEE9, category='lo', description='ARABIC LETTER HEH ISOLATED FORM', specials={'isolated',0x0647} }, + [0xFEEA] = { unicodeslot=0xFEEA, category='lo', description='ARABIC LETTER HEH FINAL FORM', specials={'final',0x0647} }, + [0xFEEB] = { unicodeslot=0xFEEB, category='lo', description='ARABIC LETTER HEH INITIAL FORM', specials={'initial',0x0647} }, + [0xFEEC] = { unicodeslot=0xFEEC, category='lo', description='ARABIC LETTER HEH MEDIAL FORM', specials={'medial',0x0647} }, + [0xFEED] = { unicodeslot=0xFEED, category='lo', description='ARABIC LETTER WAW ISOLATED FORM', specials={'isolated',0x0648} }, + [0xFEEE] = { unicodeslot=0xFEEE, category='lo', description='ARABIC LETTER WAW FINAL FORM', specials={'final',0x0648} }, + [0xFEEF] = { unicodeslot=0xFEEF, category='lo', description='ARABIC LETTER ALEF MAKSURA ISOLATED FORM', specials={'isolated',0x0649} }, + [0xFEF0] = { unicodeslot=0xFEF0, category='lo', description='ARABIC LETTER ALEF MAKSURA FINAL FORM', specials={'final',0x0649} }, + [0xFEF1] = { unicodeslot=0xFEF1, category='lo', description='ARABIC LETTER YEH ISOLATED FORM', specials={'isolated',0x064A} }, + [0xFEF2] = { unicodeslot=0xFEF2, category='lo', description='ARABIC LETTER YEH FINAL FORM', specials={'final',0x064A} }, + [0xFEF3] = { unicodeslot=0xFEF3, category='lo', description='ARABIC LETTER YEH INITIAL FORM', specials={'initial',0x064A} }, + [0xFEF4] = { unicodeslot=0xFEF4, category='lo', description='ARABIC LETTER YEH MEDIAL FORM', specials={'medial',0x064A} }, + [0xFEF5] = { unicodeslot=0xFEF5, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE ISOLATED FORM', specials={'isolated',0x0644,0x0622} }, + [0xFEF6] = { unicodeslot=0xFEF6, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH MADDA ABOVE FINAL FORM', specials={'final',0x0644,0x0622} }, + [0xFEF7] = { unicodeslot=0xFEF7, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE ISOLATED FORM', specials={'isolated',0x0644,0x0623} }, + [0xFEF8] = { unicodeslot=0xFEF8, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH HAMZA ABOVE FINAL FORM', specials={'final',0x0644,0x0623} }, + [0xFEF9] = { unicodeslot=0xFEF9, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW ISOLATED FORM', specials={'isolated',0x0644,0x0625} }, + [0xFEFA] = { unicodeslot=0xFEFA, category='lo', description='ARABIC LIGATURE LAM WITH ALEF WITH HAMZA BELOW FINAL FORM', specials={'final',0x0644,0x0625} }, + [0xFEFB] = { unicodeslot=0xFEFB, category='lo', description='ARABIC LIGATURE LAM WITH ALEF ISOLATED FORM', specials={'isolated',0x0644,0x0627} }, + [0xFEFC] = { unicodeslot=0xFEFC, category='lo', description='ARABIC LIGATURE LAM WITH ALEF FINAL FORM', specials={'final',0x0644,0x0627} }, + [0xFEFF] = { unicodeslot=0xFEFF, category='cf', description='ZERO WIDTH NO-BREAK SPACE' }, + [0xFF01] = { unicodeslot=0xFF01, category='po', description='FULLWIDTH EXCLAMATION MARK', specials={'wide',0x0021} }, + [0xFF02] = { unicodeslot=0xFF02, category='po', description='FULLWIDTH QUOTATION MARK', specials={'wide',0x0022} }, + [0xFF03] = { unicodeslot=0xFF03, category='po', description='FULLWIDTH NUMBER SIGN', specials={'wide',0x0023} }, + [0xFF04] = { unicodeslot=0xFF04, category='sc', description='FULLWIDTH DOLLAR SIGN', specials={'wide',0x0024} }, + [0xFF05] = { unicodeslot=0xFF05, category='po', description='FULLWIDTH PERCENT SIGN', specials={'wide',0x0025} }, + [0xFF06] = { unicodeslot=0xFF06, category='po', description='FULLWIDTH AMPERSAND', specials={'wide',0x0026} }, + [0xFF07] = { unicodeslot=0xFF07, category='po', description='FULLWIDTH APOSTROPHE', specials={'wide',0x0027} }, + [0xFF08] = { unicodeslot=0xFF08, category='ps', description='FULLWIDTH LEFT PARENTHESIS', specials={'wide',0x0028} }, + [0xFF09] = { unicodeslot=0xFF09, category='pe', description='FULLWIDTH RIGHT PARENTHESIS', specials={'wide',0x0029} }, + [0xFF0A] = { unicodeslot=0xFF0A, category='po', description='FULLWIDTH ASTERISK', specials={'wide',0x002A} }, + [0xFF0B] = { unicodeslot=0xFF0B, category='sm', description='FULLWIDTH PLUS SIGN', specials={'wide',0x002B} }, + [0xFF0C] = { unicodeslot=0xFF0C, category='po', description='FULLWIDTH COMMA', specials={'wide',0x002C} }, + [0xFF0D] = { unicodeslot=0xFF0D, category='pd', description='FULLWIDTH HYPHEN-MINUS', specials={'wide',0x002D} }, + [0xFF0E] = { unicodeslot=0xFF0E, category='po', description='FULLWIDTH FULL STOP', specials={'wide',0x002E} }, + [0xFF0F] = { unicodeslot=0xFF0F, category='po', description='FULLWIDTH SOLIDUS', specials={'wide',0x002F} }, + [0xFF10] = { unicodeslot=0xFF10, category='nd', description='FULLWIDTH DIGIT ZERO', specials={'wide',0x0030} }, + [0xFF11] = { unicodeslot=0xFF11, category='nd', description='FULLWIDTH DIGIT ONE', specials={'wide',0x0031} }, + [0xFF12] = { unicodeslot=0xFF12, category='nd', description='FULLWIDTH DIGIT TWO', specials={'wide',0x0032} }, + [0xFF13] = { unicodeslot=0xFF13, category='nd', description='FULLWIDTH DIGIT THREE', specials={'wide',0x0033} }, + [0xFF14] = { unicodeslot=0xFF14, category='nd', description='FULLWIDTH DIGIT FOUR', specials={'wide',0x0034} }, + [0xFF15] = { unicodeslot=0xFF15, category='nd', description='FULLWIDTH DIGIT FIVE', specials={'wide',0x0035} }, + [0xFF16] = { unicodeslot=0xFF16, category='nd', description='FULLWIDTH DIGIT SIX', specials={'wide',0x0036} }, + [0xFF17] = { unicodeslot=0xFF17, category='nd', description='FULLWIDTH DIGIT SEVEN', specials={'wide',0x0037} }, + [0xFF18] = { unicodeslot=0xFF18, category='nd', description='FULLWIDTH DIGIT EIGHT', specials={'wide',0x0038} }, + [0xFF19] = { unicodeslot=0xFF19, category='nd', description='FULLWIDTH DIGIT NINE', specials={'wide',0x0039} }, + [0xFF1A] = { unicodeslot=0xFF1A, category='po', description='FULLWIDTH COLON', specials={'wide',0x003A} }, + [0xFF1B] = { unicodeslot=0xFF1B, category='po', description='FULLWIDTH SEMICOLON', specials={'wide',0x003B} }, + [0xFF1C] = { unicodeslot=0xFF1C, category='sm', description='FULLWIDTH LESS-THAN SIGN', specials={'wide',0x003C} }, + [0xFF1D] = { unicodeslot=0xFF1D, category='sm', description='FULLWIDTH EQUALS SIGN', specials={'wide',0x003D} }, + [0xFF1E] = { unicodeslot=0xFF1E, category='sm', description='FULLWIDTH GREATER-THAN SIGN', specials={'wide',0x003E} }, + [0xFF1F] = { unicodeslot=0xFF1F, category='po', description='FULLWIDTH QUESTION MARK', specials={'wide',0x003F} }, + [0xFF20] = { unicodeslot=0xFF20, category='po', description='FULLWIDTH COMMERCIAL AT', specials={'wide',0x0040} }, + [0xFF21] = { unicodeslot=0xFF21, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER A', lccode=0xFF41, specials={'wide',0x0041} }, + [0xFF22] = { unicodeslot=0xFF22, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER B', lccode=0xFF42, specials={'wide',0x0042} }, + [0xFF23] = { unicodeslot=0xFF23, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER C', lccode=0xFF43, specials={'wide',0x0043} }, + [0xFF24] = { unicodeslot=0xFF24, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER D', lccode=0xFF44, specials={'wide',0x0044} }, + [0xFF25] = { unicodeslot=0xFF25, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER E', lccode=0xFF45, specials={'wide',0x0045} }, + [0xFF26] = { unicodeslot=0xFF26, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER F', lccode=0xFF46, specials={'wide',0x0046} }, + [0xFF27] = { unicodeslot=0xFF27, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER G', lccode=0xFF47, specials={'wide',0x0047} }, + [0xFF28] = { unicodeslot=0xFF28, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER H', lccode=0xFF48, specials={'wide',0x0048} }, + [0xFF29] = { unicodeslot=0xFF29, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER I', lccode=0xFF49, specials={'wide',0x0049} }, + [0xFF2A] = { unicodeslot=0xFF2A, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER J', lccode=0xFF4A, specials={'wide',0x004A} }, + [0xFF2B] = { unicodeslot=0xFF2B, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER K', lccode=0xFF4B, specials={'wide',0x004B} }, + [0xFF2C] = { unicodeslot=0xFF2C, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER L', lccode=0xFF4C, specials={'wide',0x004C} }, + [0xFF2D] = { unicodeslot=0xFF2D, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER M', lccode=0xFF4D, specials={'wide',0x004D} }, + [0xFF2E] = { unicodeslot=0xFF2E, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER N', lccode=0xFF4E, specials={'wide',0x004E} }, + [0xFF2F] = { unicodeslot=0xFF2F, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER O', lccode=0xFF4F, specials={'wide',0x004F} }, + [0xFF30] = { unicodeslot=0xFF30, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER P', lccode=0xFF50, specials={'wide',0x0050} }, + [0xFF31] = { unicodeslot=0xFF31, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER Q', lccode=0xFF51, specials={'wide',0x0051} }, + [0xFF32] = { unicodeslot=0xFF32, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER R', lccode=0xFF52, specials={'wide',0x0052} }, + [0xFF33] = { unicodeslot=0xFF33, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER S', lccode=0xFF53, specials={'wide',0x0053} }, + [0xFF34] = { unicodeslot=0xFF34, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER T', lccode=0xFF54, specials={'wide',0x0054} }, + [0xFF35] = { unicodeslot=0xFF35, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER U', lccode=0xFF55, specials={'wide',0x0055} }, + [0xFF36] = { unicodeslot=0xFF36, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER V', lccode=0xFF56, specials={'wide',0x0056} }, + [0xFF37] = { unicodeslot=0xFF37, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER W', lccode=0xFF57, specials={'wide',0x0057} }, + [0xFF38] = { unicodeslot=0xFF38, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER X', lccode=0xFF58, specials={'wide',0x0058} }, + [0xFF39] = { unicodeslot=0xFF39, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER Y', lccode=0xFF59, specials={'wide',0x0059} }, + [0xFF3A] = { unicodeslot=0xFF3A, category='lu', description='FULLWIDTH LATIN CAPITAL LETTER Z', lccode=0xFF5A, specials={'wide',0x005A} }, + [0xFF3B] = { unicodeslot=0xFF3B, category='ps', description='FULLWIDTH LEFT SQUARE BRACKET', specials={'wide',0x005B} }, + [0xFF3C] = { unicodeslot=0xFF3C, category='po', description='FULLWIDTH REVERSE SOLIDUS', specials={'wide',0x005C} }, + [0xFF3D] = { unicodeslot=0xFF3D, category='pe', description='FULLWIDTH RIGHT SQUARE BRACKET', specials={'wide',0x005D} }, + [0xFF3E] = { unicodeslot=0xFF3E, category='sk', description='FULLWIDTH CIRCUMFLEX ACCENT', specials={'wide',0x005E} }, + [0xFF3F] = { unicodeslot=0xFF3F, category='pc', description='FULLWIDTH LOW LINE', specials={'wide',0x005F} }, + [0xFF40] = { unicodeslot=0xFF40, category='sk', description='FULLWIDTH GRAVE ACCENT', specials={'wide',0x0060} }, + [0xFF41] = { unicodeslot=0xFF41, category='ll', description='FULLWIDTH LATIN SMALL LETTER A', uccode=0xFF21, specials={'wide',0x0061} }, + [0xFF42] = { unicodeslot=0xFF42, category='ll', description='FULLWIDTH LATIN SMALL LETTER B', uccode=0xFF22, specials={'wide',0x0062} }, + [0xFF43] = { unicodeslot=0xFF43, category='ll', description='FULLWIDTH LATIN SMALL LETTER C', uccode=0xFF23, specials={'wide',0x0063} }, + [0xFF44] = { unicodeslot=0xFF44, category='ll', description='FULLWIDTH LATIN SMALL LETTER D', uccode=0xFF24, specials={'wide',0x0064} }, + [0xFF45] = { unicodeslot=0xFF45, category='ll', description='FULLWIDTH LATIN SMALL LETTER E', uccode=0xFF25, specials={'wide',0x0065} }, + [0xFF46] = { unicodeslot=0xFF46, category='ll', description='FULLWIDTH LATIN SMALL LETTER F', uccode=0xFF26, specials={'wide',0x0066} }, + [0xFF47] = { unicodeslot=0xFF47, category='ll', description='FULLWIDTH LATIN SMALL LETTER G', uccode=0xFF27, specials={'wide',0x0067} }, + [0xFF48] = { unicodeslot=0xFF48, category='ll', description='FULLWIDTH LATIN SMALL LETTER H', uccode=0xFF28, specials={'wide',0x0068} }, + [0xFF49] = { unicodeslot=0xFF49, category='ll', description='FULLWIDTH LATIN SMALL LETTER I', uccode=0xFF29, specials={'wide',0x0069} }, + [0xFF4A] = { unicodeslot=0xFF4A, category='ll', description='FULLWIDTH LATIN SMALL LETTER J', uccode=0xFF2A, specials={'wide',0x006A} }, + [0xFF4B] = { unicodeslot=0xFF4B, category='ll', description='FULLWIDTH LATIN SMALL LETTER K', uccode=0xFF2B, specials={'wide',0x006B} }, + [0xFF4C] = { unicodeslot=0xFF4C, category='ll', description='FULLWIDTH LATIN SMALL LETTER L', uccode=0xFF2C, specials={'wide',0x006C} }, + [0xFF4D] = { unicodeslot=0xFF4D, category='ll', description='FULLWIDTH LATIN SMALL LETTER M', uccode=0xFF2D, specials={'wide',0x006D} }, + [0xFF4E] = { unicodeslot=0xFF4E, category='ll', description='FULLWIDTH LATIN SMALL LETTER N', uccode=0xFF2E, specials={'wide',0x006E} }, + [0xFF4F] = { unicodeslot=0xFF4F, category='ll', description='FULLWIDTH LATIN SMALL LETTER O', uccode=0xFF2F, specials={'wide',0x006F} }, + [0xFF50] = { unicodeslot=0xFF50, category='ll', description='FULLWIDTH LATIN SMALL LETTER P', uccode=0xFF30, specials={'wide',0x0070} }, + [0xFF51] = { unicodeslot=0xFF51, category='ll', description='FULLWIDTH LATIN SMALL LETTER Q', uccode=0xFF31, specials={'wide',0x0071} }, + [0xFF52] = { unicodeslot=0xFF52, category='ll', description='FULLWIDTH LATIN SMALL LETTER R', uccode=0xFF32, specials={'wide',0x0072} }, + [0xFF53] = { unicodeslot=0xFF53, category='ll', description='FULLWIDTH LATIN SMALL LETTER S', uccode=0xFF33, specials={'wide',0x0073} }, + [0xFF54] = { unicodeslot=0xFF54, category='ll', description='FULLWIDTH LATIN SMALL LETTER T', uccode=0xFF34, specials={'wide',0x0074} }, + [0xFF55] = { unicodeslot=0xFF55, category='ll', description='FULLWIDTH LATIN SMALL LETTER U', uccode=0xFF35, specials={'wide',0x0075} }, + [0xFF56] = { unicodeslot=0xFF56, category='ll', description='FULLWIDTH LATIN SMALL LETTER V', uccode=0xFF36, specials={'wide',0x0076} }, + [0xFF57] = { unicodeslot=0xFF57, category='ll', description='FULLWIDTH LATIN SMALL LETTER W', uccode=0xFF37, specials={'wide',0x0077} }, + [0xFF58] = { unicodeslot=0xFF58, category='ll', description='FULLWIDTH LATIN SMALL LETTER X', uccode=0xFF38, specials={'wide',0x0078} }, + [0xFF59] = { unicodeslot=0xFF59, category='ll', description='FULLWIDTH LATIN SMALL LETTER Y', uccode=0xFF39, specials={'wide',0x0079} }, + [0xFF5A] = { unicodeslot=0xFF5A, category='ll', description='FULLWIDTH LATIN SMALL LETTER Z', uccode=0xFF3A, specials={'wide',0x007A} }, + [0xFF5B] = { unicodeslot=0xFF5B, category='ps', description='FULLWIDTH LEFT CURLY BRACKET', specials={'wide',0x007B} }, + [0xFF5C] = { unicodeslot=0xFF5C, category='sm', description='FULLWIDTH VERTICAL LINE', specials={'wide',0x007C} }, + [0xFF5D] = { unicodeslot=0xFF5D, category='pe', description='FULLWIDTH RIGHT CURLY BRACKET', specials={'wide',0x007D} }, + [0xFF5E] = { unicodeslot=0xFF5E, category='sm', description='FULLWIDTH TILDE', specials={'wide',0x007E} }, + [0xFF5F] = { unicodeslot=0xFF5F, category='ps', description='FULLWIDTH LEFT WHITE PARENTHESIS', specials={'wide',0x2985} }, + [0xFF60] = { unicodeslot=0xFF60, category='pe', description='FULLWIDTH RIGHT WHITE PARENTHESIS', specials={'wide',0x2986} }, + [0xFF61] = { unicodeslot=0xFF61, category='po', description='HALFWIDTH IDEOGRAPHIC FULL STOP', specials={'narrow',0x3002} }, + [0xFF62] = { unicodeslot=0xFF62, category='ps', description='HALFWIDTH LEFT CORNER BRACKET', specials={'narrow',0x300C} }, + [0xFF63] = { unicodeslot=0xFF63, category='pe', description='HALFWIDTH RIGHT CORNER BRACKET', specials={'narrow',0x300D} }, + [0xFF64] = { unicodeslot=0xFF64, category='po', description='HALFWIDTH IDEOGRAPHIC COMMA', specials={'narrow',0x3001} }, + [0xFF65] = { unicodeslot=0xFF65, category='po', description='HALFWIDTH KATAKANA MIDDLE DOT', specials={'narrow',0x30FB} }, + [0xFF66] = { unicodeslot=0xFF66, category='lo', description='HALFWIDTH KATAKANA LETTER WO', specials={'narrow',0x30F2} }, + [0xFF67] = { unicodeslot=0xFF67, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL A', specials={'narrow',0x30A1} }, + [0xFF68] = { unicodeslot=0xFF68, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL I', specials={'narrow',0x30A3} }, + [0xFF69] = { unicodeslot=0xFF69, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL U', specials={'narrow',0x30A5} }, + [0xFF6A] = { unicodeslot=0xFF6A, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL E', specials={'narrow',0x30A7} }, + [0xFF6B] = { unicodeslot=0xFF6B, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL O', specials={'narrow',0x30A9} }, + [0xFF6C] = { unicodeslot=0xFF6C, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL YA', specials={'narrow',0x30E3} }, + [0xFF6D] = { unicodeslot=0xFF6D, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL YU', specials={'narrow',0x30E5} }, + [0xFF6E] = { unicodeslot=0xFF6E, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL YO', specials={'narrow',0x30E7} }, + [0xFF6F] = { unicodeslot=0xFF6F, category='lo', description='HALFWIDTH KATAKANA LETTER SMALL TU', specials={'narrow',0x30C3} }, + [0xFF70] = { unicodeslot=0xFF70, category='lm', description='HALFWIDTH KATAKANA-HIRAGANA PROLONGED SOUND MARK', specials={'narrow',0x30FC} }, + [0xFF71] = { unicodeslot=0xFF71, category='lo', description='HALFWIDTH KATAKANA LETTER A', specials={'narrow',0x30A2} }, + [0xFF72] = { unicodeslot=0xFF72, category='lo', description='HALFWIDTH KATAKANA LETTER I', specials={'narrow',0x30A4} }, + [0xFF73] = { unicodeslot=0xFF73, category='lo', description='HALFWIDTH KATAKANA LETTER U', specials={'narrow',0x30A6} }, + [0xFF74] = { unicodeslot=0xFF74, category='lo', description='HALFWIDTH KATAKANA LETTER E', specials={'narrow',0x30A8} }, + [0xFF75] = { unicodeslot=0xFF75, category='lo', description='HALFWIDTH KATAKANA LETTER O', specials={'narrow',0x30AA} }, + [0xFF76] = { unicodeslot=0xFF76, category='lo', description='HALFWIDTH KATAKANA LETTER KA', specials={'narrow',0x30AB} }, + [0xFF77] = { unicodeslot=0xFF77, category='lo', description='HALFWIDTH KATAKANA LETTER KI', specials={'narrow',0x30AD} }, + [0xFF78] = { unicodeslot=0xFF78, category='lo', description='HALFWIDTH KATAKANA LETTER KU', specials={'narrow',0x30AF} }, + [0xFF79] = { unicodeslot=0xFF79, category='lo', description='HALFWIDTH KATAKANA LETTER KE', specials={'narrow',0x30B1} }, + [0xFF7A] = { unicodeslot=0xFF7A, category='lo', description='HALFWIDTH KATAKANA LETTER KO', specials={'narrow',0x30B3} }, + [0xFF7B] = { unicodeslot=0xFF7B, category='lo', description='HALFWIDTH KATAKANA LETTER SA', specials={'narrow',0x30B5} }, + [0xFF7C] = { unicodeslot=0xFF7C, category='lo', description='HALFWIDTH KATAKANA LETTER SI', specials={'narrow',0x30B7} }, + [0xFF7D] = { unicodeslot=0xFF7D, category='lo', description='HALFWIDTH KATAKANA LETTER SU', specials={'narrow',0x30B9} }, + [0xFF7E] = { unicodeslot=0xFF7E, category='lo', description='HALFWIDTH KATAKANA LETTER SE', specials={'narrow',0x30BB} }, + [0xFF7F] = { unicodeslot=0xFF7F, category='lo', description='HALFWIDTH KATAKANA LETTER SO', specials={'narrow',0x30BD} }, + [0xFF80] = { unicodeslot=0xFF80, category='lo', description='HALFWIDTH KATAKANA LETTER TA', specials={'narrow',0x30BF} }, + [0xFF81] = { unicodeslot=0xFF81, category='lo', description='HALFWIDTH KATAKANA LETTER TI', specials={'narrow',0x30C1} }, + [0xFF82] = { unicodeslot=0xFF82, category='lo', description='HALFWIDTH KATAKANA LETTER TU', specials={'narrow',0x30C4} }, + [0xFF83] = { unicodeslot=0xFF83, category='lo', description='HALFWIDTH KATAKANA LETTER TE', specials={'narrow',0x30C6} }, + [0xFF84] = { unicodeslot=0xFF84, category='lo', description='HALFWIDTH KATAKANA LETTER TO', specials={'narrow',0x30C8} }, + [0xFF85] = { unicodeslot=0xFF85, category='lo', description='HALFWIDTH KATAKANA LETTER NA', specials={'narrow',0x30CA} }, + [0xFF86] = { unicodeslot=0xFF86, category='lo', description='HALFWIDTH KATAKANA LETTER NI', specials={'narrow',0x30CB} }, + [0xFF87] = { unicodeslot=0xFF87, category='lo', description='HALFWIDTH KATAKANA LETTER NU', specials={'narrow',0x30CC} }, + [0xFF88] = { unicodeslot=0xFF88, category='lo', description='HALFWIDTH KATAKANA LETTER NE', specials={'narrow',0x30CD} }, + [0xFF89] = { unicodeslot=0xFF89, category='lo', description='HALFWIDTH KATAKANA LETTER NO', specials={'narrow',0x30CE} }, + [0xFF8A] = { unicodeslot=0xFF8A, category='lo', description='HALFWIDTH KATAKANA LETTER HA', specials={'narrow',0x30CF} }, + [0xFF8B] = { unicodeslot=0xFF8B, category='lo', description='HALFWIDTH KATAKANA LETTER HI', specials={'narrow',0x30D2} }, + [0xFF8C] = { unicodeslot=0xFF8C, category='lo', description='HALFWIDTH KATAKANA LETTER HU', specials={'narrow',0x30D5} }, + [0xFF8D] = { unicodeslot=0xFF8D, category='lo', description='HALFWIDTH KATAKANA LETTER HE', specials={'narrow',0x30D8} }, + [0xFF8E] = { unicodeslot=0xFF8E, category='lo', description='HALFWIDTH KATAKANA LETTER HO', specials={'narrow',0x30DB} }, + [0xFF8F] = { unicodeslot=0xFF8F, category='lo', description='HALFWIDTH KATAKANA LETTER MA', specials={'narrow',0x30DE} }, + [0xFF90] = { unicodeslot=0xFF90, category='lo', description='HALFWIDTH KATAKANA LETTER MI', specials={'narrow',0x30DF} }, + [0xFF91] = { unicodeslot=0xFF91, category='lo', description='HALFWIDTH KATAKANA LETTER MU', specials={'narrow',0x30E0} }, + [0xFF92] = { unicodeslot=0xFF92, category='lo', description='HALFWIDTH KATAKANA LETTER ME', specials={'narrow',0x30E1} }, + [0xFF93] = { unicodeslot=0xFF93, category='lo', description='HALFWIDTH KATAKANA LETTER MO', specials={'narrow',0x30E2} }, + [0xFF94] = { unicodeslot=0xFF94, category='lo', description='HALFWIDTH KATAKANA LETTER YA', specials={'narrow',0x30E4} }, + [0xFF95] = { unicodeslot=0xFF95, category='lo', description='HALFWIDTH KATAKANA LETTER YU', specials={'narrow',0x30E6} }, + [0xFF96] = { unicodeslot=0xFF96, category='lo', description='HALFWIDTH KATAKANA LETTER YO', specials={'narrow',0x30E8} }, + [0xFF97] = { unicodeslot=0xFF97, category='lo', description='HALFWIDTH KATAKANA LETTER RA', specials={'narrow',0x30E9} }, + [0xFF98] = { unicodeslot=0xFF98, category='lo', description='HALFWIDTH KATAKANA LETTER RI', specials={'narrow',0x30EA} }, + [0xFF99] = { unicodeslot=0xFF99, category='lo', description='HALFWIDTH KATAKANA LETTER RU', specials={'narrow',0x30EB} }, + [0xFF9A] = { unicodeslot=0xFF9A, category='lo', description='HALFWIDTH KATAKANA LETTER RE', specials={'narrow',0x30EC} }, + [0xFF9B] = { unicodeslot=0xFF9B, category='lo', description='HALFWIDTH KATAKANA LETTER RO', specials={'narrow',0x30ED} }, + [0xFF9C] = { unicodeslot=0xFF9C, category='lo', description='HALFWIDTH KATAKANA LETTER WA', specials={'narrow',0x30EF} }, + [0xFF9D] = { unicodeslot=0xFF9D, category='lo', description='HALFWIDTH KATAKANA LETTER N', specials={'narrow',0x30F3} }, + [0xFF9E] = { unicodeslot=0xFF9E, category='lm', description='HALFWIDTH KATAKANA VOICED SOUND MARK', specials={'narrow',0x3099} }, + [0xFF9F] = { unicodeslot=0xFF9F, category='lm', description='HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK', specials={'narrow',0x309A} }, + [0xFFA0] = { unicodeslot=0xFFA0, category='lo', description='HALFWIDTH HANGUL FILLER', specials={'narrow',0x3164} }, + [0xFFA1] = { unicodeslot=0xFFA1, category='lo', description='HALFWIDTH HANGUL LETTER KIYEOK', specials={'narrow',0x3131} }, + [0xFFA2] = { unicodeslot=0xFFA2, category='lo', description='HALFWIDTH HANGUL LETTER SSANGKIYEOK', specials={'narrow',0x3132} }, + [0xFFA3] = { unicodeslot=0xFFA3, category='lo', description='HALFWIDTH HANGUL LETTER KIYEOK-SIOS', specials={'narrow',0x3133} }, + [0xFFA4] = { unicodeslot=0xFFA4, category='lo', description='HALFWIDTH HANGUL LETTER NIEUN', specials={'narrow',0x3134} }, + [0xFFA5] = { unicodeslot=0xFFA5, category='lo', description='HALFWIDTH HANGUL LETTER NIEUN-CIEUC', specials={'narrow',0x3135} }, + [0xFFA6] = { unicodeslot=0xFFA6, category='lo', description='HALFWIDTH HANGUL LETTER NIEUN-HIEUH', specials={'narrow',0x3136} }, + [0xFFA7] = { unicodeslot=0xFFA7, category='lo', description='HALFWIDTH HANGUL LETTER TIKEUT', specials={'narrow',0x3137} }, + [0xFFA8] = { unicodeslot=0xFFA8, category='lo', description='HALFWIDTH HANGUL LETTER SSANGTIKEUT', specials={'narrow',0x3138} }, + [0xFFA9] = { unicodeslot=0xFFA9, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL', specials={'narrow',0x3139} }, + [0xFFAA] = { unicodeslot=0xFFAA, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-KIYEOK', specials={'narrow',0x313A} }, + [0xFFAB] = { unicodeslot=0xFFAB, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-MIEUM', specials={'narrow',0x313B} }, + [0xFFAC] = { unicodeslot=0xFFAC, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-PIEUP', specials={'narrow',0x313C} }, + [0xFFAD] = { unicodeslot=0xFFAD, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-SIOS', specials={'narrow',0x313D} }, + [0xFFAE] = { unicodeslot=0xFFAE, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-THIEUTH', specials={'narrow',0x313E} }, + [0xFFAF] = { unicodeslot=0xFFAF, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-PHIEUPH', specials={'narrow',0x313F} }, + [0xFFB0] = { unicodeslot=0xFFB0, category='lo', description='HALFWIDTH HANGUL LETTER RIEUL-HIEUH', specials={'narrow',0x3140} }, + [0xFFB1] = { unicodeslot=0xFFB1, category='lo', description='HALFWIDTH HANGUL LETTER MIEUM', specials={'narrow',0x3141} }, + [0xFFB2] = { unicodeslot=0xFFB2, category='lo', description='HALFWIDTH HANGUL LETTER PIEUP', specials={'narrow',0x3142} }, + [0xFFB3] = { unicodeslot=0xFFB3, category='lo', description='HALFWIDTH HANGUL LETTER SSANGPIEUP', specials={'narrow',0x3143} }, + [0xFFB4] = { unicodeslot=0xFFB4, category='lo', description='HALFWIDTH HANGUL LETTER PIEUP-SIOS', specials={'narrow',0x3144} }, + [0xFFB5] = { unicodeslot=0xFFB5, category='lo', description='HALFWIDTH HANGUL LETTER SIOS', specials={'narrow',0x3145} }, + [0xFFB6] = { unicodeslot=0xFFB6, category='lo', description='HALFWIDTH HANGUL LETTER SSANGSIOS', specials={'narrow',0x3146} }, + [0xFFB7] = { unicodeslot=0xFFB7, category='lo', description='HALFWIDTH HANGUL LETTER IEUNG', specials={'narrow',0x3147} }, + [0xFFB8] = { unicodeslot=0xFFB8, category='lo', description='HALFWIDTH HANGUL LETTER CIEUC', specials={'narrow',0x3148} }, + [0xFFB9] = { unicodeslot=0xFFB9, category='lo', description='HALFWIDTH HANGUL LETTER SSANGCIEUC', specials={'narrow',0x3149} }, + [0xFFBA] = { unicodeslot=0xFFBA, category='lo', description='HALFWIDTH HANGUL LETTER CHIEUCH', specials={'narrow',0x314A} }, + [0xFFBB] = { unicodeslot=0xFFBB, category='lo', description='HALFWIDTH HANGUL LETTER KHIEUKH', specials={'narrow',0x314B} }, + [0xFFBC] = { unicodeslot=0xFFBC, category='lo', description='HALFWIDTH HANGUL LETTER THIEUTH', specials={'narrow',0x314C} }, + [0xFFBD] = { unicodeslot=0xFFBD, category='lo', description='HALFWIDTH HANGUL LETTER PHIEUPH', specials={'narrow',0x314D} }, + [0xFFBE] = { unicodeslot=0xFFBE, category='lo', description='HALFWIDTH HANGUL LETTER HIEUH', specials={'narrow',0x314E} }, + [0xFFC2] = { unicodeslot=0xFFC2, category='lo', description='HALFWIDTH HANGUL LETTER A', specials={'narrow',0x314F} }, + [0xFFC3] = { unicodeslot=0xFFC3, category='lo', description='HALFWIDTH HANGUL LETTER AE', specials={'narrow',0x3150} }, + [0xFFC4] = { unicodeslot=0xFFC4, category='lo', description='HALFWIDTH HANGUL LETTER YA', specials={'narrow',0x3151} }, + [0xFFC5] = { unicodeslot=0xFFC5, category='lo', description='HALFWIDTH HANGUL LETTER YAE', specials={'narrow',0x3152} }, + [0xFFC6] = { unicodeslot=0xFFC6, category='lo', description='HALFWIDTH HANGUL LETTER EO', specials={'narrow',0x3153} }, + [0xFFC7] = { unicodeslot=0xFFC7, category='lo', description='HALFWIDTH HANGUL LETTER E', specials={'narrow',0x3154} }, + [0xFFCA] = { unicodeslot=0xFFCA, category='lo', description='HALFWIDTH HANGUL LETTER YEO', specials={'narrow',0x3155} }, + [0xFFCB] = { unicodeslot=0xFFCB, category='lo', description='HALFWIDTH HANGUL LETTER YE', specials={'narrow',0x3156} }, + [0xFFCC] = { unicodeslot=0xFFCC, category='lo', description='HALFWIDTH HANGUL LETTER O', specials={'narrow',0x3157} }, + [0xFFCD] = { unicodeslot=0xFFCD, category='lo', description='HALFWIDTH HANGUL LETTER WA', specials={'narrow',0x3158} }, + [0xFFCE] = { unicodeslot=0xFFCE, category='lo', description='HALFWIDTH HANGUL LETTER WAE', specials={'narrow',0x3159} }, + [0xFFCF] = { unicodeslot=0xFFCF, category='lo', description='HALFWIDTH HANGUL LETTER OE', specials={'narrow',0x315A} }, + [0xFFD2] = { unicodeslot=0xFFD2, category='lo', description='HALFWIDTH HANGUL LETTER YO', specials={'narrow',0x315B} }, + [0xFFD3] = { unicodeslot=0xFFD3, category='lo', description='HALFWIDTH HANGUL LETTER U', specials={'narrow',0x315C} }, + [0xFFD4] = { unicodeslot=0xFFD4, category='lo', description='HALFWIDTH HANGUL LETTER WEO', specials={'narrow',0x315D} }, + [0xFFD5] = { unicodeslot=0xFFD5, category='lo', description='HALFWIDTH HANGUL LETTER WE', specials={'narrow',0x315E} }, + [0xFFD6] = { unicodeslot=0xFFD6, category='lo', description='HALFWIDTH HANGUL LETTER WI', specials={'narrow',0x315F} }, + [0xFFD7] = { unicodeslot=0xFFD7, category='lo', description='HALFWIDTH HANGUL LETTER YU', specials={'narrow',0x3160} }, + [0xFFDA] = { unicodeslot=0xFFDA, category='lo', description='HALFWIDTH HANGUL LETTER EU', specials={'narrow',0x3161} }, + [0xFFDB] = { unicodeslot=0xFFDB, category='lo', description='HALFWIDTH HANGUL LETTER YI', specials={'narrow',0x3162} }, + [0xFFDC] = { unicodeslot=0xFFDC, category='lo', description='HALFWIDTH HANGUL LETTER I', specials={'narrow',0x3163} }, + [0xFFE0] = { unicodeslot=0xFFE0, category='sc', description='FULLWIDTH CENT SIGN', specials={'wide',0x00A2} }, + [0xFFE1] = { unicodeslot=0xFFE1, category='sc', description='FULLWIDTH POUND SIGN', specials={'wide',0x00A3} }, + [0xFFE2] = { unicodeslot=0xFFE2, category='sm', description='FULLWIDTH NOT SIGN', specials={'wide',0x00AC} }, + [0xFFE3] = { unicodeslot=0xFFE3, category='sk', description='FULLWIDTH MACRON', specials={'wide',0x00AF} }, + [0xFFE4] = { unicodeslot=0xFFE4, category='so', description='FULLWIDTH BROKEN BAR', specials={'wide',0x00A6} }, + [0xFFE5] = { unicodeslot=0xFFE5, category='sc', description='FULLWIDTH YEN SIGN', specials={'wide',0x00A5} }, + [0xFFE6] = { unicodeslot=0xFFE6, category='sc', description='FULLWIDTH WON SIGN', specials={'wide',0x20A9} }, + [0xFFE8] = { unicodeslot=0xFFE8, category='so', description='HALFWIDTH FORMS LIGHT VERTICAL', specials={'narrow',0x2502} }, + [0xFFE9] = { unicodeslot=0xFFE9, category='sm', description='HALFWIDTH LEFTWARDS ARROW', specials={'narrow',0x2190} }, + [0xFFEA] = { unicodeslot=0xFFEA, category='sm', description='HALFWIDTH UPWARDS ARROW', specials={'narrow',0x2191} }, + [0xFFEB] = { unicodeslot=0xFFEB, category='sm', description='HALFWIDTH RIGHTWARDS ARROW', specials={'narrow',0x2192} }, + [0xFFEC] = { unicodeslot=0xFFEC, category='sm', description='HALFWIDTH DOWNWARDS ARROW', specials={'narrow',0x2193} }, + [0xFFED] = { unicodeslot=0xFFED, category='so', description='HALFWIDTH BLACK SQUARE', specials={'narrow',0x25A0} }, + [0xFFEE] = { unicodeslot=0xFFEE, category='so', description='HALFWIDTH WHITE CIRCLE', specials={'narrow',0x25CB} }, + [0xFFF9] = { unicodeslot=0xFFF9, category='cf', description='INTERLINEAR ANNOTATION ANCHOR' }, + [0xFFFA] = { unicodeslot=0xFFFA, category='cf', description='INTERLINEAR ANNOTATION SEPARATOR' }, + [0xFFFB] = { unicodeslot=0xFFFB, category='cf', description='INTERLINEAR ANNOTATION TERMINATOR' }, + [0xFFFC] = { unicodeslot=0xFFFC, category='so', description='OBJECT REPLACEMENT CHARACTER' }, + [0xFFFD] = { unicodeslot=0xFFFD, category='so', description='REPLACEMENT CHARACTER' }, + [0x10000] = { unicodeslot=0x10000, category='lo', description='LINEAR B SYLLABLE B008 A' }, + [0x10001] = { unicodeslot=0x10001, category='lo', description='LINEAR B SYLLABLE B038 E' }, + [0x10002] = { unicodeslot=0x10002, category='lo', description='LINEAR B SYLLABLE B028 I' }, + [0x10003] = { unicodeslot=0x10003, category='lo', description='LINEAR B SYLLABLE B061 O' }, + [0x10004] = { unicodeslot=0x10004, category='lo', description='LINEAR B SYLLABLE B010 U' }, + [0x10005] = { unicodeslot=0x10005, category='lo', description='LINEAR B SYLLABLE B001 DA' }, + [0x10006] = { unicodeslot=0x10006, category='lo', description='LINEAR B SYLLABLE B045 DE' }, + [0x10007] = { unicodeslot=0x10007, category='lo', description='LINEAR B SYLLABLE B007 DI' }, + [0x10008] = { unicodeslot=0x10008, category='lo', description='LINEAR B SYLLABLE B014 DO' }, + [0x10009] = { unicodeslot=0x10009, category='lo', description='LINEAR B SYLLABLE B051 DU' }, + [0x1000A] = { unicodeslot=0x1000A, category='lo', description='LINEAR B SYLLABLE B057 JA' }, + [0x1000B] = { unicodeslot=0x1000B, category='lo', description='LINEAR B SYLLABLE B046 JE' }, + [0x1000D] = { unicodeslot=0x1000D, category='lo', description='LINEAR B SYLLABLE B036 JO' }, + [0x1000E] = { unicodeslot=0x1000E, category='lo', description='LINEAR B SYLLABLE B065 JU' }, + [0x1000F] = { unicodeslot=0x1000F, category='lo', description='LINEAR B SYLLABLE B077 KA' }, + [0x10010] = { unicodeslot=0x10010, category='lo', description='LINEAR B SYLLABLE B044 KE' }, + [0x10011] = { unicodeslot=0x10011, category='lo', description='LINEAR B SYLLABLE B067 KI' }, + [0x10012] = { unicodeslot=0x10012, category='lo', description='LINEAR B SYLLABLE B070 KO' }, + [0x10013] = { unicodeslot=0x10013, category='lo', description='LINEAR B SYLLABLE B081 KU' }, + [0x10014] = { unicodeslot=0x10014, category='lo', description='LINEAR B SYLLABLE B080 MA' }, + [0x10015] = { unicodeslot=0x10015, category='lo', description='LINEAR B SYLLABLE B013 ME' }, + [0x10016] = { unicodeslot=0x10016, category='lo', description='LINEAR B SYLLABLE B073 MI' }, + [0x10017] = { unicodeslot=0x10017, category='lo', description='LINEAR B SYLLABLE B015 MO' }, + [0x10018] = { unicodeslot=0x10018, category='lo', description='LINEAR B SYLLABLE B023 MU' }, + [0x10019] = { unicodeslot=0x10019, category='lo', description='LINEAR B SYLLABLE B006 NA' }, + [0x1001A] = { unicodeslot=0x1001A, category='lo', description='LINEAR B SYLLABLE B024 NE' }, + [0x1001B] = { unicodeslot=0x1001B, category='lo', description='LINEAR B SYLLABLE B030 NI' }, + [0x1001C] = { unicodeslot=0x1001C, category='lo', description='LINEAR B SYLLABLE B052 NO' }, + [0x1001D] = { unicodeslot=0x1001D, category='lo', description='LINEAR B SYLLABLE B055 NU' }, + [0x1001E] = { unicodeslot=0x1001E, category='lo', description='LINEAR B SYLLABLE B003 PA' }, + [0x1001F] = { unicodeslot=0x1001F, category='lo', description='LINEAR B SYLLABLE B072 PE' }, + [0x10020] = { unicodeslot=0x10020, category='lo', description='LINEAR B SYLLABLE B039 PI' }, + [0x10021] = { unicodeslot=0x10021, category='lo', description='LINEAR B SYLLABLE B011 PO' }, + [0x10022] = { unicodeslot=0x10022, category='lo', description='LINEAR B SYLLABLE B050 PU' }, + [0x10023] = { unicodeslot=0x10023, category='lo', description='LINEAR B SYLLABLE B016 QA' }, + [0x10024] = { unicodeslot=0x10024, category='lo', description='LINEAR B SYLLABLE B078 QE' }, + [0x10025] = { unicodeslot=0x10025, category='lo', description='LINEAR B SYLLABLE B021 QI' }, + [0x10026] = { unicodeslot=0x10026, category='lo', description='LINEAR B SYLLABLE B032 QO' }, + [0x10028] = { unicodeslot=0x10028, category='lo', description='LINEAR B SYLLABLE B060 RA' }, + [0x10029] = { unicodeslot=0x10029, category='lo', description='LINEAR B SYLLABLE B027 RE' }, + [0x1002A] = { unicodeslot=0x1002A, category='lo', description='LINEAR B SYLLABLE B053 RI' }, + [0x1002B] = { unicodeslot=0x1002B, category='lo', description='LINEAR B SYLLABLE B002 RO' }, + [0x1002C] = { unicodeslot=0x1002C, category='lo', description='LINEAR B SYLLABLE B026 RU' }, + [0x1002D] = { unicodeslot=0x1002D, category='lo', description='LINEAR B SYLLABLE B031 SA' }, + [0x1002E] = { unicodeslot=0x1002E, category='lo', description='LINEAR B SYLLABLE B009 SE' }, + [0x1002F] = { unicodeslot=0x1002F, category='lo', description='LINEAR B SYLLABLE B041 SI' }, + [0x10030] = { unicodeslot=0x10030, category='lo', description='LINEAR B SYLLABLE B012 SO' }, + [0x10031] = { unicodeslot=0x10031, category='lo', description='LINEAR B SYLLABLE B058 SU' }, + [0x10032] = { unicodeslot=0x10032, category='lo', description='LINEAR B SYLLABLE B059 TA' }, + [0x10033] = { unicodeslot=0x10033, category='lo', description='LINEAR B SYLLABLE B004 TE' }, + [0x10034] = { unicodeslot=0x10034, category='lo', description='LINEAR B SYLLABLE B037 TI' }, + [0x10035] = { unicodeslot=0x10035, category='lo', description='LINEAR B SYLLABLE B005 TO' }, + [0x10036] = { unicodeslot=0x10036, category='lo', description='LINEAR B SYLLABLE B069 TU' }, + [0x10037] = { unicodeslot=0x10037, category='lo', description='LINEAR B SYLLABLE B054 WA' }, + [0x10038] = { unicodeslot=0x10038, category='lo', description='LINEAR B SYLLABLE B075 WE' }, + [0x10039] = { unicodeslot=0x10039, category='lo', description='LINEAR B SYLLABLE B040 WI' }, + [0x1003A] = { unicodeslot=0x1003A, category='lo', description='LINEAR B SYLLABLE B042 WO' }, + [0x1003C] = { unicodeslot=0x1003C, category='lo', description='LINEAR B SYLLABLE B017 ZA' }, + [0x1003D] = { unicodeslot=0x1003D, category='lo', description='LINEAR B SYLLABLE B074 ZE' }, + [0x1003F] = { unicodeslot=0x1003F, category='lo', description='LINEAR B SYLLABLE B020 ZO' }, + [0x10040] = { unicodeslot=0x10040, category='lo', description='LINEAR B SYLLABLE B025 A2' }, + [0x10041] = { unicodeslot=0x10041, category='lo', description='LINEAR B SYLLABLE B043 A3' }, + [0x10042] = { unicodeslot=0x10042, category='lo', description='LINEAR B SYLLABLE B085 AU' }, + [0x10043] = { unicodeslot=0x10043, category='lo', description='LINEAR B SYLLABLE B071 DWE' }, + [0x10044] = { unicodeslot=0x10044, category='lo', description='LINEAR B SYLLABLE B090 DWO' }, + [0x10045] = { unicodeslot=0x10045, category='lo', description='LINEAR B SYLLABLE B048 NWA' }, + [0x10046] = { unicodeslot=0x10046, category='lo', description='LINEAR B SYLLABLE B029 PU2' }, + [0x10047] = { unicodeslot=0x10047, category='lo', description='LINEAR B SYLLABLE B062 PTE' }, + [0x10048] = { unicodeslot=0x10048, category='lo', description='LINEAR B SYLLABLE B076 RA2' }, + [0x10049] = { unicodeslot=0x10049, category='lo', description='LINEAR B SYLLABLE B033 RA3' }, + [0x1004A] = { unicodeslot=0x1004A, category='lo', description='LINEAR B SYLLABLE B068 RO2' }, + [0x1004B] = { unicodeslot=0x1004B, category='lo', description='LINEAR B SYLLABLE B066 TA2' }, + [0x1004C] = { unicodeslot=0x1004C, category='lo', description='LINEAR B SYLLABLE B087 TWE' }, + [0x1004D] = { unicodeslot=0x1004D, category='lo', description='LINEAR B SYLLABLE B091 TWO' }, + [0x10050] = { unicodeslot=0x10050, category='lo', description='LINEAR B SYMBOL B018' }, + [0x10051] = { unicodeslot=0x10051, category='lo', description='LINEAR B SYMBOL B019' }, + [0x10052] = { unicodeslot=0x10052, category='lo', description='LINEAR B SYMBOL B022' }, + [0x10053] = { unicodeslot=0x10053, category='lo', description='LINEAR B SYMBOL B034' }, + [0x10054] = { unicodeslot=0x10054, category='lo', description='LINEAR B SYMBOL B047' }, + [0x10055] = { unicodeslot=0x10055, category='lo', description='LINEAR B SYMBOL B049' }, + [0x10056] = { unicodeslot=0x10056, category='lo', description='LINEAR B SYMBOL B056' }, + [0x10057] = { unicodeslot=0x10057, category='lo', description='LINEAR B SYMBOL B063' }, + [0x10058] = { unicodeslot=0x10058, category='lo', description='LINEAR B SYMBOL B064' }, + [0x10059] = { unicodeslot=0x10059, category='lo', description='LINEAR B SYMBOL B079' }, + [0x1005A] = { unicodeslot=0x1005A, category='lo', description='LINEAR B SYMBOL B082' }, + [0x1005B] = { unicodeslot=0x1005B, category='lo', description='LINEAR B SYMBOL B083' }, + [0x1005C] = { unicodeslot=0x1005C, category='lo', description='LINEAR B SYMBOL B086' }, + [0x1005D] = { unicodeslot=0x1005D, category='lo', description='LINEAR B SYMBOL B089' }, + [0x10080] = { unicodeslot=0x10080, category='lo', description='LINEAR B IDEOGRAM B100 MAN' }, + [0x10081] = { unicodeslot=0x10081, category='lo', description='LINEAR B IDEOGRAM B102 WOMAN' }, + [0x10082] = { unicodeslot=0x10082, category='lo', description='LINEAR B IDEOGRAM B104 DEER' }, + [0x10083] = { unicodeslot=0x10083, category='lo', description='LINEAR B IDEOGRAM B105 EQUID' }, + [0x10084] = { unicodeslot=0x10084, category='lo', description='LINEAR B IDEOGRAM B105F MARE' }, + [0x10085] = { unicodeslot=0x10085, category='lo', description='LINEAR B IDEOGRAM B105M STALLION' }, + [0x10086] = { unicodeslot=0x10086, category='lo', description='LINEAR B IDEOGRAM B106F EWE' }, + [0x10087] = { unicodeslot=0x10087, category='lo', description='LINEAR B IDEOGRAM B106M RAM' }, + [0x10088] = { unicodeslot=0x10088, category='lo', description='LINEAR B IDEOGRAM B107F SHE-GOAT' }, + [0x10089] = { unicodeslot=0x10089, category='lo', description='LINEAR B IDEOGRAM B107M HE-GOAT' }, + [0x1008A] = { unicodeslot=0x1008A, category='lo', description='LINEAR B IDEOGRAM B108F SOW' }, + [0x1008B] = { unicodeslot=0x1008B, category='lo', description='LINEAR B IDEOGRAM B108M BOAR' }, + [0x1008C] = { unicodeslot=0x1008C, category='lo', description='LINEAR B IDEOGRAM B109F COW' }, + [0x1008D] = { unicodeslot=0x1008D, category='lo', description='LINEAR B IDEOGRAM B109M BULL' }, + [0x1008E] = { unicodeslot=0x1008E, category='lo', description='LINEAR B IDEOGRAM B120 WHEAT' }, + [0x1008F] = { unicodeslot=0x1008F, category='lo', description='LINEAR B IDEOGRAM B121 BARLEY' }, + [0x10090] = { unicodeslot=0x10090, category='lo', description='LINEAR B IDEOGRAM B122 OLIVE' }, + [0x10091] = { unicodeslot=0x10091, category='lo', description='LINEAR B IDEOGRAM B123 SPICE' }, + [0x10092] = { unicodeslot=0x10092, category='lo', description='LINEAR B IDEOGRAM B125 CYPERUS' }, + [0x10093] = { unicodeslot=0x10093, category='lo', description='LINEAR B MONOGRAM B127 KAPO' }, + [0x10094] = { unicodeslot=0x10094, category='lo', description='LINEAR B MONOGRAM B128 KANAKO' }, + [0x10095] = { unicodeslot=0x10095, category='lo', description='LINEAR B IDEOGRAM B130 OIL' }, + [0x10096] = { unicodeslot=0x10096, category='lo', description='LINEAR B IDEOGRAM B131 WINE' }, + [0x10097] = { unicodeslot=0x10097, category='lo', description='LINEAR B IDEOGRAM B132' }, + [0x10098] = { unicodeslot=0x10098, category='lo', description='LINEAR B MONOGRAM B133 AREPA' }, + [0x10099] = { unicodeslot=0x10099, category='lo', description='LINEAR B MONOGRAM B135 MERI' }, + [0x1009A] = { unicodeslot=0x1009A, category='lo', description='LINEAR B IDEOGRAM B140 BRONZE' }, + [0x1009B] = { unicodeslot=0x1009B, category='lo', description='LINEAR B IDEOGRAM B141 GOLD' }, + [0x1009C] = { unicodeslot=0x1009C, category='lo', description='LINEAR B IDEOGRAM B142' }, + [0x1009D] = { unicodeslot=0x1009D, category='lo', description='LINEAR B IDEOGRAM B145 WOOL' }, + [0x1009E] = { unicodeslot=0x1009E, category='lo', description='LINEAR B IDEOGRAM B146' }, + [0x1009F] = { unicodeslot=0x1009F, category='lo', description='LINEAR B IDEOGRAM B150' }, + [0x100A0] = { unicodeslot=0x100A0, category='lo', description='LINEAR B IDEOGRAM B151 HORN' }, + [0x100A1] = { unicodeslot=0x100A1, category='lo', description='LINEAR B IDEOGRAM B152' }, + [0x100A2] = { unicodeslot=0x100A2, category='lo', description='LINEAR B IDEOGRAM B153' }, + [0x100A3] = { unicodeslot=0x100A3, category='lo', description='LINEAR B IDEOGRAM B154' }, + [0x100A4] = { unicodeslot=0x100A4, category='lo', description='LINEAR B MONOGRAM B156 TURO2' }, + [0x100A5] = { unicodeslot=0x100A5, category='lo', description='LINEAR B IDEOGRAM B157' }, + [0x100A6] = { unicodeslot=0x100A6, category='lo', description='LINEAR B IDEOGRAM B158' }, + [0x100A7] = { unicodeslot=0x100A7, category='lo', description='LINEAR B IDEOGRAM B159 CLOTH' }, + [0x100A8] = { unicodeslot=0x100A8, category='lo', description='LINEAR B IDEOGRAM B160' }, + [0x100A9] = { unicodeslot=0x100A9, category='lo', description='LINEAR B IDEOGRAM B161' }, + [0x100AA] = { unicodeslot=0x100AA, category='lo', description='LINEAR B IDEOGRAM B162 GARMENT' }, + [0x100AB] = { unicodeslot=0x100AB, category='lo', description='LINEAR B IDEOGRAM B163 ARMOUR' }, + [0x100AC] = { unicodeslot=0x100AC, category='lo', description='LINEAR B IDEOGRAM B164' }, + [0x100AD] = { unicodeslot=0x100AD, category='lo', description='LINEAR B IDEOGRAM B165' }, + [0x100AE] = { unicodeslot=0x100AE, category='lo', description='LINEAR B IDEOGRAM B166' }, + [0x100AF] = { unicodeslot=0x100AF, category='lo', description='LINEAR B IDEOGRAM B167' }, + [0x100B0] = { unicodeslot=0x100B0, category='lo', description='LINEAR B IDEOGRAM B168' }, + [0x100B1] = { unicodeslot=0x100B1, category='lo', description='LINEAR B IDEOGRAM B169' }, + [0x100B2] = { unicodeslot=0x100B2, category='lo', description='LINEAR B IDEOGRAM B170' }, + [0x100B3] = { unicodeslot=0x100B3, category='lo', description='LINEAR B IDEOGRAM B171' }, + [0x100B4] = { unicodeslot=0x100B4, category='lo', description='LINEAR B IDEOGRAM B172' }, + [0x100B5] = { unicodeslot=0x100B5, category='lo', description='LINEAR B IDEOGRAM B173 MONTH' }, + [0x100B6] = { unicodeslot=0x100B6, category='lo', description='LINEAR B IDEOGRAM B174' }, + [0x100B7] = { unicodeslot=0x100B7, category='lo', description='LINEAR B IDEOGRAM B176 TREE' }, + [0x100B8] = { unicodeslot=0x100B8, category='lo', description='LINEAR B IDEOGRAM B177' }, + [0x100B9] = { unicodeslot=0x100B9, category='lo', description='LINEAR B IDEOGRAM B178' }, + [0x100BA] = { unicodeslot=0x100BA, category='lo', description='LINEAR B IDEOGRAM B179' }, + [0x100BB] = { unicodeslot=0x100BB, category='lo', description='LINEAR B IDEOGRAM B180' }, + [0x100BC] = { unicodeslot=0x100BC, category='lo', description='LINEAR B IDEOGRAM B181' }, + [0x100BD] = { unicodeslot=0x100BD, category='lo', description='LINEAR B IDEOGRAM B182' }, + [0x100BE] = { unicodeslot=0x100BE, category='lo', description='LINEAR B IDEOGRAM B183' }, + [0x100BF] = { unicodeslot=0x100BF, category='lo', description='LINEAR B IDEOGRAM B184' }, + [0x100C0] = { unicodeslot=0x100C0, category='lo', description='LINEAR B IDEOGRAM B185' }, + [0x100C1] = { unicodeslot=0x100C1, category='lo', description='LINEAR B IDEOGRAM B189' }, + [0x100C2] = { unicodeslot=0x100C2, category='lo', description='LINEAR B IDEOGRAM B190' }, + [0x100C3] = { unicodeslot=0x100C3, category='lo', description='LINEAR B IDEOGRAM B191 HELMET' }, + [0x100C4] = { unicodeslot=0x100C4, category='lo', description='LINEAR B IDEOGRAM B220 FOOTSTOOL' }, + [0x100C5] = { unicodeslot=0x100C5, category='lo', description='LINEAR B IDEOGRAM B225 BATHTUB' }, + [0x100C6] = { unicodeslot=0x100C6, category='lo', description='LINEAR B IDEOGRAM B230 SPEAR' }, + [0x100C7] = { unicodeslot=0x100C7, category='lo', description='LINEAR B IDEOGRAM B231 ARROW' }, + [0x100C8] = { unicodeslot=0x100C8, category='lo', description='LINEAR B IDEOGRAM B232' }, + [0x100C9] = { unicodeslot=0x100C9, category='lo', description='LINEAR B IDEOGRAM B233 SWORD' }, + [0x100CA] = { unicodeslot=0x100CA, category='lo', description='LINEAR B IDEOGRAM B234' }, + [0x100CB] = { unicodeslot=0x100CB, category='lo', description='LINEAR B IDEOGRAM B236' }, + [0x100CC] = { unicodeslot=0x100CC, category='lo', description='LINEAR B IDEOGRAM B240 WHEELED CHARIOT' }, + [0x100CD] = { unicodeslot=0x100CD, category='lo', description='LINEAR B IDEOGRAM B241 CHARIOT' }, + [0x100CE] = { unicodeslot=0x100CE, category='lo', description='LINEAR B IDEOGRAM B242 CHARIOT FRAME' }, + [0x100CF] = { unicodeslot=0x100CF, category='lo', description='LINEAR B IDEOGRAM B243 WHEEL' }, + [0x100D0] = { unicodeslot=0x100D0, category='lo', description='LINEAR B IDEOGRAM B245' }, + [0x100D1] = { unicodeslot=0x100D1, category='lo', description='LINEAR B IDEOGRAM B246' }, + [0x100D2] = { unicodeslot=0x100D2, category='lo', description='LINEAR B MONOGRAM B247 DIPTE' }, + [0x100D3] = { unicodeslot=0x100D3, category='lo', description='LINEAR B IDEOGRAM B248' }, + [0x100D4] = { unicodeslot=0x100D4, category='lo', description='LINEAR B IDEOGRAM B249' }, + [0x100D5] = { unicodeslot=0x100D5, category='lo', description='LINEAR B IDEOGRAM B251' }, + [0x100D6] = { unicodeslot=0x100D6, category='lo', description='LINEAR B IDEOGRAM B252' }, + [0x100D7] = { unicodeslot=0x100D7, category='lo', description='LINEAR B IDEOGRAM B253' }, + [0x100D8] = { unicodeslot=0x100D8, category='lo', description='LINEAR B IDEOGRAM B254 DART' }, + [0x100D9] = { unicodeslot=0x100D9, category='lo', description='LINEAR B IDEOGRAM B255' }, + [0x100DA] = { unicodeslot=0x100DA, category='lo', description='LINEAR B IDEOGRAM B256' }, + [0x100DB] = { unicodeslot=0x100DB, category='lo', description='LINEAR B IDEOGRAM B257' }, + [0x100DC] = { unicodeslot=0x100DC, category='lo', description='LINEAR B IDEOGRAM B258' }, + [0x100DD] = { unicodeslot=0x100DD, category='lo', description='LINEAR B IDEOGRAM B259' }, + [0x100DE] = { unicodeslot=0x100DE, category='lo', description='LINEAR B IDEOGRAM VESSEL B155' }, + [0x100DF] = { unicodeslot=0x100DF, category='lo', description='LINEAR B IDEOGRAM VESSEL B200' }, + [0x100E0] = { unicodeslot=0x100E0, category='lo', description='LINEAR B IDEOGRAM VESSEL B201' }, + [0x100E1] = { unicodeslot=0x100E1, category='lo', description='LINEAR B IDEOGRAM VESSEL B202' }, + [0x100E2] = { unicodeslot=0x100E2, category='lo', description='LINEAR B IDEOGRAM VESSEL B203' }, + [0x100E3] = { unicodeslot=0x100E3, category='lo', description='LINEAR B IDEOGRAM VESSEL B204' }, + [0x100E4] = { unicodeslot=0x100E4, category='lo', description='LINEAR B IDEOGRAM VESSEL B205' }, + [0x100E5] = { unicodeslot=0x100E5, category='lo', description='LINEAR B IDEOGRAM VESSEL B206' }, + [0x100E6] = { unicodeslot=0x100E6, category='lo', description='LINEAR B IDEOGRAM VESSEL B207' }, + [0x100E7] = { unicodeslot=0x100E7, category='lo', description='LINEAR B IDEOGRAM VESSEL B208' }, + [0x100E8] = { unicodeslot=0x100E8, category='lo', description='LINEAR B IDEOGRAM VESSEL B209' }, + [0x100E9] = { unicodeslot=0x100E9, category='lo', description='LINEAR B IDEOGRAM VESSEL B210' }, + [0x100EA] = { unicodeslot=0x100EA, category='lo', description='LINEAR B IDEOGRAM VESSEL B211' }, + [0x100EB] = { unicodeslot=0x100EB, category='lo', description='LINEAR B IDEOGRAM VESSEL B212' }, + [0x100EC] = { unicodeslot=0x100EC, category='lo', description='LINEAR B IDEOGRAM VESSEL B213' }, + [0x100ED] = { unicodeslot=0x100ED, category='lo', description='LINEAR B IDEOGRAM VESSEL B214' }, + [0x100EE] = { unicodeslot=0x100EE, category='lo', description='LINEAR B IDEOGRAM VESSEL B215' }, + [0x100EF] = { unicodeslot=0x100EF, category='lo', description='LINEAR B IDEOGRAM VESSEL B216' }, + [0x100F0] = { unicodeslot=0x100F0, category='lo', description='LINEAR B IDEOGRAM VESSEL B217' }, + [0x100F1] = { unicodeslot=0x100F1, category='lo', description='LINEAR B IDEOGRAM VESSEL B218' }, + [0x100F2] = { unicodeslot=0x100F2, category='lo', description='LINEAR B IDEOGRAM VESSEL B219' }, + [0x100F3] = { unicodeslot=0x100F3, category='lo', description='LINEAR B IDEOGRAM VESSEL B221' }, + [0x100F4] = { unicodeslot=0x100F4, category='lo', description='LINEAR B IDEOGRAM VESSEL B222' }, + [0x100F5] = { unicodeslot=0x100F5, category='lo', description='LINEAR B IDEOGRAM VESSEL B226' }, + [0x100F6] = { unicodeslot=0x100F6, category='lo', description='LINEAR B IDEOGRAM VESSEL B227' }, + [0x100F7] = { unicodeslot=0x100F7, category='lo', description='LINEAR B IDEOGRAM VESSEL B228' }, + [0x100F8] = { unicodeslot=0x100F8, category='lo', description='LINEAR B IDEOGRAM VESSEL B229' }, + [0x100F9] = { unicodeslot=0x100F9, category='lo', description='LINEAR B IDEOGRAM VESSEL B250' }, + [0x100FA] = { unicodeslot=0x100FA, category='lo', description='LINEAR B IDEOGRAM VESSEL B305' }, + [0x10100] = { unicodeslot=0x10100, category='po', description='AEGEAN WORD SEPARATOR LINE' }, + [0x10101] = { unicodeslot=0x10101, category='po', description='AEGEAN WORD SEPARATOR DOT' }, + [0x10102] = { unicodeslot=0x10102, category='so', description='AEGEAN CHECK MARK' }, + [0x10107] = { unicodeslot=0x10107, category='no', description='AEGEAN NUMBER ONE' }, + [0x10108] = { unicodeslot=0x10108, category='no', description='AEGEAN NUMBER TWO' }, + [0x10109] = { unicodeslot=0x10109, category='no', description='AEGEAN NUMBER THREE' }, + [0x1010A] = { unicodeslot=0x1010A, category='no', description='AEGEAN NUMBER FOUR' }, + [0x1010B] = { unicodeslot=0x1010B, category='no', description='AEGEAN NUMBER FIVE' }, + [0x1010C] = { unicodeslot=0x1010C, category='no', description='AEGEAN NUMBER SIX' }, + [0x1010D] = { unicodeslot=0x1010D, category='no', description='AEGEAN NUMBER SEVEN' }, + [0x1010E] = { unicodeslot=0x1010E, category='no', description='AEGEAN NUMBER EIGHT' }, + [0x1010F] = { unicodeslot=0x1010F, category='no', description='AEGEAN NUMBER NINE' }, + [0x10110] = { unicodeslot=0x10110, category='no', description='AEGEAN NUMBER TEN' }, + [0x10111] = { unicodeslot=0x10111, category='no', description='AEGEAN NUMBER TWENTY' }, + [0x10112] = { unicodeslot=0x10112, category='no', description='AEGEAN NUMBER THIRTY' }, + [0x10113] = { unicodeslot=0x10113, category='no', description='AEGEAN NUMBER FORTY' }, + [0x10114] = { unicodeslot=0x10114, category='no', description='AEGEAN NUMBER FIFTY' }, + [0x10115] = { unicodeslot=0x10115, category='no', description='AEGEAN NUMBER SIXTY' }, + [0x10116] = { unicodeslot=0x10116, category='no', description='AEGEAN NUMBER SEVENTY' }, + [0x10117] = { unicodeslot=0x10117, category='no', description='AEGEAN NUMBER EIGHTY' }, + [0x10118] = { unicodeslot=0x10118, category='no', description='AEGEAN NUMBER NINETY' }, + [0x10119] = { unicodeslot=0x10119, category='no', description='AEGEAN NUMBER ONE HUNDRED' }, + [0x1011A] = { unicodeslot=0x1011A, category='no', description='AEGEAN NUMBER TWO HUNDRED' }, + [0x1011B] = { unicodeslot=0x1011B, category='no', description='AEGEAN NUMBER THREE HUNDRED' }, + [0x1011C] = { unicodeslot=0x1011C, category='no', description='AEGEAN NUMBER FOUR HUNDRED' }, + [0x1011D] = { unicodeslot=0x1011D, category='no', description='AEGEAN NUMBER FIVE HUNDRED' }, + [0x1011E] = { unicodeslot=0x1011E, category='no', description='AEGEAN NUMBER SIX HUNDRED' }, + [0x1011F] = { unicodeslot=0x1011F, category='no', description='AEGEAN NUMBER SEVEN HUNDRED' }, + [0x10120] = { unicodeslot=0x10120, category='no', description='AEGEAN NUMBER EIGHT HUNDRED' }, + [0x10121] = { unicodeslot=0x10121, category='no', description='AEGEAN NUMBER NINE HUNDRED' }, + [0x10122] = { unicodeslot=0x10122, category='no', description='AEGEAN NUMBER ONE THOUSAND' }, + [0x10123] = { unicodeslot=0x10123, category='no', description='AEGEAN NUMBER TWO THOUSAND' }, + [0x10124] = { unicodeslot=0x10124, category='no', description='AEGEAN NUMBER THREE THOUSAND' }, + [0x10125] = { unicodeslot=0x10125, category='no', description='AEGEAN NUMBER FOUR THOUSAND' }, + [0x10126] = { unicodeslot=0x10126, category='no', description='AEGEAN NUMBER FIVE THOUSAND' }, + [0x10127] = { unicodeslot=0x10127, category='no', description='AEGEAN NUMBER SIX THOUSAND' }, + [0x10128] = { unicodeslot=0x10128, category='no', description='AEGEAN NUMBER SEVEN THOUSAND' }, + [0x10129] = { unicodeslot=0x10129, category='no', description='AEGEAN NUMBER EIGHT THOUSAND' }, + [0x1012A] = { unicodeslot=0x1012A, category='no', description='AEGEAN NUMBER NINE THOUSAND' }, + [0x1012B] = { unicodeslot=0x1012B, category='no', description='AEGEAN NUMBER TEN THOUSAND' }, + [0x1012C] = { unicodeslot=0x1012C, category='no', description='AEGEAN NUMBER TWENTY THOUSAND' }, + [0x1012D] = { unicodeslot=0x1012D, category='no', description='AEGEAN NUMBER THIRTY THOUSAND' }, + [0x1012E] = { unicodeslot=0x1012E, category='no', description='AEGEAN NUMBER FORTY THOUSAND' }, + [0x1012F] = { unicodeslot=0x1012F, category='no', description='AEGEAN NUMBER FIFTY THOUSAND' }, + [0x10130] = { unicodeslot=0x10130, category='no', description='AEGEAN NUMBER SIXTY THOUSAND' }, + [0x10131] = { unicodeslot=0x10131, category='no', description='AEGEAN NUMBER SEVENTY THOUSAND' }, + [0x10132] = { unicodeslot=0x10132, category='no', description='AEGEAN NUMBER EIGHTY THOUSAND' }, + [0x10133] = { unicodeslot=0x10133, category='no', description='AEGEAN NUMBER NINETY THOUSAND' }, + [0x10137] = { unicodeslot=0x10137, category='so', description='AEGEAN WEIGHT BASE UNIT' }, + [0x10138] = { unicodeslot=0x10138, category='so', description='AEGEAN WEIGHT FIRST SUBUNIT' }, + [0x10139] = { unicodeslot=0x10139, category='so', description='AEGEAN WEIGHT SECOND SUBUNIT' }, + [0x1013A] = { unicodeslot=0x1013A, category='so', description='AEGEAN WEIGHT THIRD SUBUNIT' }, + [0x1013B] = { unicodeslot=0x1013B, category='so', description='AEGEAN WEIGHT FOURTH SUBUNIT' }, + [0x1013C] = { unicodeslot=0x1013C, category='so', description='AEGEAN DRY MEASURE FIRST SUBUNIT' }, + [0x1013D] = { unicodeslot=0x1013D, category='so', description='AEGEAN LIQUID MEASURE FIRST SUBUNIT' }, + [0x1013E] = { unicodeslot=0x1013E, category='so', description='AEGEAN MEASURE SECOND SUBUNIT' }, + [0x1013F] = { unicodeslot=0x1013F, category='so', description='AEGEAN MEASURE THIRD SUBUNIT' }, + [0x10140] = { unicodeslot=0x10140, category='nl', description='GREEK ACROPHONIC ATTIC ONE QUARTER' }, + [0x10141] = { unicodeslot=0x10141, category='nl', description='GREEK ACROPHONIC ATTIC ONE HALF' }, + [0x10142] = { unicodeslot=0x10142, category='nl', description='GREEK ACROPHONIC ATTIC ONE DRACHMA' }, + [0x10143] = { unicodeslot=0x10143, category='nl', description='GREEK ACROPHONIC ATTIC FIVE' }, + [0x10144] = { unicodeslot=0x10144, category='nl', description='GREEK ACROPHONIC ATTIC FIFTY' }, + [0x10145] = { unicodeslot=0x10145, category='nl', description='GREEK ACROPHONIC ATTIC FIVE HUNDRED' }, + [0x10146] = { unicodeslot=0x10146, category='nl', description='GREEK ACROPHONIC ATTIC FIVE THOUSAND' }, + [0x10147] = { unicodeslot=0x10147, category='nl', description='GREEK ACROPHONIC ATTIC FIFTY THOUSAND' }, + [0x10148] = { unicodeslot=0x10148, category='nl', description='GREEK ACROPHONIC ATTIC FIVE TALENTS' }, + [0x10149] = { unicodeslot=0x10149, category='nl', description='GREEK ACROPHONIC ATTIC TEN TALENTS' }, + [0x1014A] = { unicodeslot=0x1014A, category='nl', description='GREEK ACROPHONIC ATTIC FIFTY TALENTS' }, + [0x1014B] = { unicodeslot=0x1014B, category='nl', description='GREEK ACROPHONIC ATTIC ONE HUNDRED TALENTS' }, + [0x1014C] = { unicodeslot=0x1014C, category='nl', description='GREEK ACROPHONIC ATTIC FIVE HUNDRED TALENTS' }, + [0x1014D] = { unicodeslot=0x1014D, category='nl', description='GREEK ACROPHONIC ATTIC ONE THOUSAND TALENTS' }, + [0x1014E] = { unicodeslot=0x1014E, category='nl', description='GREEK ACROPHONIC ATTIC FIVE THOUSAND TALENTS' }, + [0x1014F] = { unicodeslot=0x1014F, category='nl', description='GREEK ACROPHONIC ATTIC FIVE STATERS' }, + [0x10150] = { unicodeslot=0x10150, category='nl', description='GREEK ACROPHONIC ATTIC TEN STATERS' }, + [0x10151] = { unicodeslot=0x10151, category='nl', description='GREEK ACROPHONIC ATTIC FIFTY STATERS' }, + [0x10152] = { unicodeslot=0x10152, category='nl', description='GREEK ACROPHONIC ATTIC ONE HUNDRED STATERS' }, + [0x10153] = { unicodeslot=0x10153, category='nl', description='GREEK ACROPHONIC ATTIC FIVE HUNDRED STATERS' }, + [0x10154] = { unicodeslot=0x10154, category='nl', description='GREEK ACROPHONIC ATTIC ONE THOUSAND STATERS' }, + [0x10155] = { unicodeslot=0x10155, category='nl', description='GREEK ACROPHONIC ATTIC TEN THOUSAND STATERS' }, + [0x10156] = { unicodeslot=0x10156, category='nl', description='GREEK ACROPHONIC ATTIC FIFTY THOUSAND STATERS' }, + [0x10157] = { unicodeslot=0x10157, category='nl', description='GREEK ACROPHONIC ATTIC TEN MNAS' }, + [0x10158] = { unicodeslot=0x10158, category='nl', description='GREEK ACROPHONIC HERAEUM ONE PLETHRON' }, + [0x10159] = { unicodeslot=0x10159, category='nl', description='GREEK ACROPHONIC THESPIAN ONE' }, + [0x1015A] = { unicodeslot=0x1015A, category='nl', description='GREEK ACROPHONIC HERMIONIAN ONE' }, + [0x1015B] = { unicodeslot=0x1015B, category='nl', description='GREEK ACROPHONIC EPIDAUREAN TWO' }, + [0x1015C] = { unicodeslot=0x1015C, category='nl', description='GREEK ACROPHONIC THESPIAN TWO' }, + [0x1015D] = { unicodeslot=0x1015D, category='nl', description='GREEK ACROPHONIC CYRENAIC TWO DRACHMAS' }, + [0x1015E] = { unicodeslot=0x1015E, category='nl', description='GREEK ACROPHONIC EPIDAUREAN TWO DRACHMAS' }, + [0x1015F] = { unicodeslot=0x1015F, category='nl', description='GREEK ACROPHONIC TROEZENIAN FIVE' }, + [0x10160] = { unicodeslot=0x10160, category='nl', description='GREEK ACROPHONIC TROEZENIAN TEN' }, + [0x10161] = { unicodeslot=0x10161, category='nl', description='GREEK ACROPHONIC TROEZENIAN TEN ALTERNATE FORM' }, + [0x10162] = { unicodeslot=0x10162, category='nl', description='GREEK ACROPHONIC HERMIONIAN TEN' }, + [0x10163] = { unicodeslot=0x10163, category='nl', description='GREEK ACROPHONIC MESSENIAN TEN' }, + [0x10164] = { unicodeslot=0x10164, category='nl', description='GREEK ACROPHONIC THESPIAN TEN' }, + [0x10165] = { unicodeslot=0x10165, category='nl', description='GREEK ACROPHONIC THESPIAN THIRTY' }, + [0x10166] = { unicodeslot=0x10166, category='nl', description='GREEK ACROPHONIC TROEZENIAN FIFTY' }, + [0x10167] = { unicodeslot=0x10167, category='nl', description='GREEK ACROPHONIC TROEZENIAN FIFTY ALTERNATE FORM' }, + [0x10168] = { unicodeslot=0x10168, category='nl', description='GREEK ACROPHONIC HERMIONIAN FIFTY' }, + [0x10169] = { unicodeslot=0x10169, category='nl', description='GREEK ACROPHONIC THESPIAN FIFTY' }, + [0x1016A] = { unicodeslot=0x1016A, category='nl', description='GREEK ACROPHONIC THESPIAN ONE HUNDRED' }, + [0x1016B] = { unicodeslot=0x1016B, category='nl', description='GREEK ACROPHONIC THESPIAN THREE HUNDRED' }, + [0x1016C] = { unicodeslot=0x1016C, category='nl', description='GREEK ACROPHONIC EPIDAUREAN FIVE HUNDRED' }, + [0x1016D] = { unicodeslot=0x1016D, category='nl', description='GREEK ACROPHONIC TROEZENIAN FIVE HUNDRED' }, + [0x1016E] = { unicodeslot=0x1016E, category='nl', description='GREEK ACROPHONIC THESPIAN FIVE HUNDRED' }, + [0x1016F] = { unicodeslot=0x1016F, category='nl', description='GREEK ACROPHONIC CARYSTIAN FIVE HUNDRED' }, + [0x10170] = { unicodeslot=0x10170, category='nl', description='GREEK ACROPHONIC NAXIAN FIVE HUNDRED' }, + [0x10171] = { unicodeslot=0x10171, category='nl', description='GREEK ACROPHONIC THESPIAN ONE THOUSAND' }, + [0x10172] = { unicodeslot=0x10172, category='nl', description='GREEK ACROPHONIC THESPIAN FIVE THOUSAND' }, + [0x10173] = { unicodeslot=0x10173, category='nl', description='GREEK ACROPHONIC DELPHIC FIVE MNAS' }, + [0x10174] = { unicodeslot=0x10174, category='nl', description='GREEK ACROPHONIC STRATIAN FIFTY MNAS' }, + [0x10175] = { unicodeslot=0x10175, category='no', description='GREEK ONE HALF SIGN' }, + [0x10176] = { unicodeslot=0x10176, category='no', description='GREEK ONE HALF SIGN ALTERNATE FORM' }, + [0x10177] = { unicodeslot=0x10177, category='no', description='GREEK TWO THIRDS SIGN' }, + [0x10178] = { unicodeslot=0x10178, category='no', description='GREEK THREE QUARTERS SIGN' }, + [0x10179] = { unicodeslot=0x10179, category='so', description='GREEK YEAR SIGN' }, + [0x1017A] = { unicodeslot=0x1017A, category='so', description='GREEK TALENT SIGN' }, + [0x1017B] = { unicodeslot=0x1017B, category='so', description='GREEK DRACHMA SIGN' }, + [0x1017C] = { unicodeslot=0x1017C, category='so', description='GREEK OBOL SIGN' }, + [0x1017D] = { unicodeslot=0x1017D, category='so', description='GREEK TWO OBOLS SIGN' }, + [0x1017E] = { unicodeslot=0x1017E, category='so', description='GREEK THREE OBOLS SIGN' }, + [0x1017F] = { unicodeslot=0x1017F, category='so', description='GREEK FOUR OBOLS SIGN' }, + [0x10180] = { unicodeslot=0x10180, category='so', description='GREEK FIVE OBOLS SIGN' }, + [0x10181] = { unicodeslot=0x10181, category='so', description='GREEK METRETES SIGN' }, + [0x10182] = { unicodeslot=0x10182, category='so', description='GREEK KYATHOS BASE SIGN' }, + [0x10183] = { unicodeslot=0x10183, category='so', description='GREEK LITRA SIGN' }, + [0x10184] = { unicodeslot=0x10184, category='so', description='GREEK OUNKIA SIGN' }, + [0x10185] = { unicodeslot=0x10185, category='so', description='GREEK XESTES SIGN' }, + [0x10186] = { unicodeslot=0x10186, category='so', description='GREEK ARTABE SIGN' }, + [0x10187] = { unicodeslot=0x10187, category='so', description='GREEK AROURA SIGN' }, + [0x10188] = { unicodeslot=0x10188, category='so', description='GREEK GRAMMA SIGN' }, + [0x10189] = { unicodeslot=0x10189, category='so', description='GREEK TRYBLION BASE SIGN' }, + [0x1018A] = { unicodeslot=0x1018A, category='no', description='GREEK ZERO SIGN' }, + [0x10300] = { unicodeslot=0x10300, category='lo', description='OLD ITALIC LETTER A' }, + [0x10301] = { unicodeslot=0x10301, category='lo', description='OLD ITALIC LETTER BE' }, + [0x10302] = { unicodeslot=0x10302, category='lo', description='OLD ITALIC LETTER KE' }, + [0x10303] = { unicodeslot=0x10303, category='lo', description='OLD ITALIC LETTER DE' }, + [0x10304] = { unicodeslot=0x10304, category='lo', description='OLD ITALIC LETTER E' }, + [0x10305] = { unicodeslot=0x10305, category='lo', description='OLD ITALIC LETTER VE' }, + [0x10306] = { unicodeslot=0x10306, category='lo', description='OLD ITALIC LETTER ZE' }, + [0x10307] = { unicodeslot=0x10307, category='lo', description='OLD ITALIC LETTER HE' }, + [0x10308] = { unicodeslot=0x10308, category='lo', description='OLD ITALIC LETTER THE' }, + [0x10309] = { unicodeslot=0x10309, category='lo', description='OLD ITALIC LETTER I' }, + [0x1030A] = { unicodeslot=0x1030A, category='lo', description='OLD ITALIC LETTER KA' }, + [0x1030B] = { unicodeslot=0x1030B, category='lo', description='OLD ITALIC LETTER EL' }, + [0x1030C] = { unicodeslot=0x1030C, category='lo', description='OLD ITALIC LETTER EM' }, + [0x1030D] = { unicodeslot=0x1030D, category='lo', description='OLD ITALIC LETTER EN' }, + [0x1030E] = { unicodeslot=0x1030E, category='lo', description='OLD ITALIC LETTER ESH' }, + [0x1030F] = { unicodeslot=0x1030F, category='lo', description='OLD ITALIC LETTER O' }, + [0x10310] = { unicodeslot=0x10310, category='lo', description='OLD ITALIC LETTER PE' }, + [0x10311] = { unicodeslot=0x10311, category='lo', description='OLD ITALIC LETTER SHE' }, + [0x10312] = { unicodeslot=0x10312, category='lo', description='OLD ITALIC LETTER KU' }, + [0x10313] = { unicodeslot=0x10313, category='lo', description='OLD ITALIC LETTER ER' }, + [0x10314] = { unicodeslot=0x10314, category='lo', description='OLD ITALIC LETTER ES' }, + [0x10315] = { unicodeslot=0x10315, category='lo', description='OLD ITALIC LETTER TE' }, + [0x10316] = { unicodeslot=0x10316, category='lo', description='OLD ITALIC LETTER U' }, + [0x10317] = { unicodeslot=0x10317, category='lo', description='OLD ITALIC LETTER EKS' }, + [0x10318] = { unicodeslot=0x10318, category='lo', description='OLD ITALIC LETTER PHE' }, + [0x10319] = { unicodeslot=0x10319, category='lo', description='OLD ITALIC LETTER KHE' }, + [0x1031A] = { unicodeslot=0x1031A, category='lo', description='OLD ITALIC LETTER EF' }, + [0x1031B] = { unicodeslot=0x1031B, category='lo', description='OLD ITALIC LETTER ERS' }, + [0x1031C] = { unicodeslot=0x1031C, category='lo', description='OLD ITALIC LETTER CHE' }, + [0x1031D] = { unicodeslot=0x1031D, category='lo', description='OLD ITALIC LETTER II' }, + [0x1031E] = { unicodeslot=0x1031E, category='lo', description='OLD ITALIC LETTER UU' }, + [0x10320] = { unicodeslot=0x10320, category='no', description='OLD ITALIC NUMERAL ONE' }, + [0x10321] = { unicodeslot=0x10321, category='no', description='OLD ITALIC NUMERAL FIVE' }, + [0x10322] = { unicodeslot=0x10322, category='no', description='OLD ITALIC NUMERAL TEN' }, + [0x10323] = { unicodeslot=0x10323, category='no', description='OLD ITALIC NUMERAL FIFTY' }, + [0x10330] = { unicodeslot=0x10330, category='lo', description='GOTHIC LETTER AHSA' }, + [0x10331] = { unicodeslot=0x10331, category='lo', description='GOTHIC LETTER BAIRKAN' }, + [0x10332] = { unicodeslot=0x10332, category='lo', description='GOTHIC LETTER GIBA' }, + [0x10333] = { unicodeslot=0x10333, category='lo', description='GOTHIC LETTER DAGS' }, + [0x10334] = { unicodeslot=0x10334, category='lo', description='GOTHIC LETTER AIHVUS' }, + [0x10335] = { unicodeslot=0x10335, category='lo', description='GOTHIC LETTER QAIRTHRA' }, + [0x10336] = { unicodeslot=0x10336, category='lo', description='GOTHIC LETTER IUJA' }, + [0x10337] = { unicodeslot=0x10337, category='lo', description='GOTHIC LETTER HAGL' }, + [0x10338] = { unicodeslot=0x10338, category='lo', description='GOTHIC LETTER THIUTH' }, + [0x10339] = { unicodeslot=0x10339, category='lo', description='GOTHIC LETTER EIS' }, + [0x1033A] = { unicodeslot=0x1033A, category='lo', description='GOTHIC LETTER KUSMA' }, + [0x1033B] = { unicodeslot=0x1033B, category='lo', description='GOTHIC LETTER LAGUS' }, + [0x1033C] = { unicodeslot=0x1033C, category='lo', description='GOTHIC LETTER MANNA' }, + [0x1033D] = { unicodeslot=0x1033D, category='lo', description='GOTHIC LETTER NAUTHS' }, + [0x1033E] = { unicodeslot=0x1033E, category='lo', description='GOTHIC LETTER JER' }, + [0x1033F] = { unicodeslot=0x1033F, category='lo', description='GOTHIC LETTER URUS' }, + [0x10340] = { unicodeslot=0x10340, category='lo', description='GOTHIC LETTER PAIRTHRA' }, + [0x10341] = { unicodeslot=0x10341, category='nl', description='GOTHIC LETTER NINETY' }, + [0x10342] = { unicodeslot=0x10342, category='lo', description='GOTHIC LETTER RAIDA' }, + [0x10343] = { unicodeslot=0x10343, category='lo', description='GOTHIC LETTER SAUIL' }, + [0x10344] = { unicodeslot=0x10344, category='lo', description='GOTHIC LETTER TEIWS' }, + [0x10345] = { unicodeslot=0x10345, category='lo', description='GOTHIC LETTER WINJA' }, + [0x10346] = { unicodeslot=0x10346, category='lo', description='GOTHIC LETTER FAIHU' }, + [0x10347] = { unicodeslot=0x10347, category='lo', description='GOTHIC LETTER IGGWS' }, + [0x10348] = { unicodeslot=0x10348, category='lo', description='GOTHIC LETTER HWAIR' }, + [0x10349] = { unicodeslot=0x10349, category='lo', description='GOTHIC LETTER OTHAL' }, + [0x1034A] = { unicodeslot=0x1034A, category='nl', description='GOTHIC LETTER NINE HUNDRED' }, + [0x10380] = { unicodeslot=0x10380, category='lo', description='UGARITIC LETTER ALPA' }, + [0x10381] = { unicodeslot=0x10381, category='lo', description='UGARITIC LETTER BETA' }, + [0x10382] = { unicodeslot=0x10382, category='lo', description='UGARITIC LETTER GAMLA' }, + [0x10383] = { unicodeslot=0x10383, category='lo', description='UGARITIC LETTER KHA' }, + [0x10384] = { unicodeslot=0x10384, category='lo', description='UGARITIC LETTER DELTA' }, + [0x10385] = { unicodeslot=0x10385, category='lo', description='UGARITIC LETTER HO' }, + [0x10386] = { unicodeslot=0x10386, category='lo', description='UGARITIC LETTER WO' }, + [0x10387] = { unicodeslot=0x10387, category='lo', description='UGARITIC LETTER ZETA' }, + [0x10388] = { unicodeslot=0x10388, category='lo', description='UGARITIC LETTER HOTA' }, + [0x10389] = { unicodeslot=0x10389, category='lo', description='UGARITIC LETTER TET' }, + [0x1038A] = { unicodeslot=0x1038A, category='lo', description='UGARITIC LETTER YOD' }, + [0x1038B] = { unicodeslot=0x1038B, category='lo', description='UGARITIC LETTER KAF' }, + [0x1038C] = { unicodeslot=0x1038C, category='lo', description='UGARITIC LETTER SHIN' }, + [0x1038D] = { unicodeslot=0x1038D, category='lo', description='UGARITIC LETTER LAMDA' }, + [0x1038E] = { unicodeslot=0x1038E, category='lo', description='UGARITIC LETTER MEM' }, + [0x1038F] = { unicodeslot=0x1038F, category='lo', description='UGARITIC LETTER DHAL' }, + [0x10390] = { unicodeslot=0x10390, category='lo', description='UGARITIC LETTER NUN' }, + [0x10391] = { unicodeslot=0x10391, category='lo', description='UGARITIC LETTER ZU' }, + [0x10392] = { unicodeslot=0x10392, category='lo', description='UGARITIC LETTER SAMKA' }, + [0x10393] = { unicodeslot=0x10393, category='lo', description='UGARITIC LETTER AIN' }, + [0x10394] = { unicodeslot=0x10394, category='lo', description='UGARITIC LETTER PU' }, + [0x10395] = { unicodeslot=0x10395, category='lo', description='UGARITIC LETTER SADE' }, + [0x10396] = { unicodeslot=0x10396, category='lo', description='UGARITIC LETTER QOPA' }, + [0x10397] = { unicodeslot=0x10397, category='lo', description='UGARITIC LETTER RASHA' }, + [0x10398] = { unicodeslot=0x10398, category='lo', description='UGARITIC LETTER THANNA' }, + [0x10399] = { unicodeslot=0x10399, category='lo', description='UGARITIC LETTER GHAIN' }, + [0x1039A] = { unicodeslot=0x1039A, category='lo', description='UGARITIC LETTER TO' }, + [0x1039B] = { unicodeslot=0x1039B, category='lo', description='UGARITIC LETTER I' }, + [0x1039C] = { unicodeslot=0x1039C, category='lo', description='UGARITIC LETTER U' }, + [0x1039D] = { unicodeslot=0x1039D, category='lo', description='UGARITIC LETTER SSU' }, + [0x1039F] = { unicodeslot=0x1039F, category='po', description='UGARITIC WORD DIVIDER' }, + [0x103A0] = { unicodeslot=0x103A0, category='lo', description='OLD PERSIAN SIGN A' }, + [0x103A1] = { unicodeslot=0x103A1, category='lo', description='OLD PERSIAN SIGN I' }, + [0x103A2] = { unicodeslot=0x103A2, category='lo', description='OLD PERSIAN SIGN U' }, + [0x103A3] = { unicodeslot=0x103A3, category='lo', description='OLD PERSIAN SIGN KA' }, + [0x103A4] = { unicodeslot=0x103A4, category='lo', description='OLD PERSIAN SIGN KU' }, + [0x103A5] = { unicodeslot=0x103A5, category='lo', description='OLD PERSIAN SIGN GA' }, + [0x103A6] = { unicodeslot=0x103A6, category='lo', description='OLD PERSIAN SIGN GU' }, + [0x103A7] = { unicodeslot=0x103A7, category='lo', description='OLD PERSIAN SIGN XA' }, + [0x103A8] = { unicodeslot=0x103A8, category='lo', description='OLD PERSIAN SIGN CA' }, + [0x103A9] = { unicodeslot=0x103A9, category='lo', description='OLD PERSIAN SIGN JA' }, + [0x103AA] = { unicodeslot=0x103AA, category='lo', description='OLD PERSIAN SIGN JI' }, + [0x103AB] = { unicodeslot=0x103AB, category='lo', description='OLD PERSIAN SIGN TA' }, + [0x103AC] = { unicodeslot=0x103AC, category='lo', description='OLD PERSIAN SIGN TU' }, + [0x103AD] = { unicodeslot=0x103AD, category='lo', description='OLD PERSIAN SIGN DA' }, + [0x103AE] = { unicodeslot=0x103AE, category='lo', description='OLD PERSIAN SIGN DI' }, + [0x103AF] = { unicodeslot=0x103AF, category='lo', description='OLD PERSIAN SIGN DU' }, + [0x103B0] = { unicodeslot=0x103B0, category='lo', description='OLD PERSIAN SIGN THA' }, + [0x103B1] = { unicodeslot=0x103B1, category='lo', description='OLD PERSIAN SIGN PA' }, + [0x103B2] = { unicodeslot=0x103B2, category='lo', description='OLD PERSIAN SIGN BA' }, + [0x103B3] = { unicodeslot=0x103B3, category='lo', description='OLD PERSIAN SIGN FA' }, + [0x103B4] = { unicodeslot=0x103B4, category='lo', description='OLD PERSIAN SIGN NA' }, + [0x103B5] = { unicodeslot=0x103B5, category='lo', description='OLD PERSIAN SIGN NU' }, + [0x103B6] = { unicodeslot=0x103B6, category='lo', description='OLD PERSIAN SIGN MA' }, + [0x103B7] = { unicodeslot=0x103B7, category='lo', description='OLD PERSIAN SIGN MI' }, + [0x103B8] = { unicodeslot=0x103B8, category='lo', description='OLD PERSIAN SIGN MU' }, + [0x103B9] = { unicodeslot=0x103B9, category='lo', description='OLD PERSIAN SIGN YA' }, + [0x103BA] = { unicodeslot=0x103BA, category='lo', description='OLD PERSIAN SIGN VA' }, + [0x103BB] = { unicodeslot=0x103BB, category='lo', description='OLD PERSIAN SIGN VI' }, + [0x103BC] = { unicodeslot=0x103BC, category='lo', description='OLD PERSIAN SIGN RA' }, + [0x103BD] = { unicodeslot=0x103BD, category='lo', description='OLD PERSIAN SIGN RU' }, + [0x103BE] = { unicodeslot=0x103BE, category='lo', description='OLD PERSIAN SIGN LA' }, + [0x103BF] = { unicodeslot=0x103BF, category='lo', description='OLD PERSIAN SIGN SA' }, + [0x103C0] = { unicodeslot=0x103C0, category='lo', description='OLD PERSIAN SIGN ZA' }, + [0x103C1] = { unicodeslot=0x103C1, category='lo', description='OLD PERSIAN SIGN SHA' }, + [0x103C2] = { unicodeslot=0x103C2, category='lo', description='OLD PERSIAN SIGN SSA' }, + [0x103C3] = { unicodeslot=0x103C3, category='lo', description='OLD PERSIAN SIGN HA' }, + [0x103C8] = { unicodeslot=0x103C8, category='lo', description='OLD PERSIAN SIGN AURAMAZDAA' }, + [0x103C9] = { unicodeslot=0x103C9, category='lo', description='OLD PERSIAN SIGN AURAMAZDAA-2' }, + [0x103CA] = { unicodeslot=0x103CA, category='lo', description='OLD PERSIAN SIGN AURAMAZDAAHA' }, + [0x103CB] = { unicodeslot=0x103CB, category='lo', description='OLD PERSIAN SIGN XSHAAYATHIYA' }, + [0x103CC] = { unicodeslot=0x103CC, category='lo', description='OLD PERSIAN SIGN DAHYAAUSH' }, + [0x103CD] = { unicodeslot=0x103CD, category='lo', description='OLD PERSIAN SIGN DAHYAAUSH-2' }, + [0x103CE] = { unicodeslot=0x103CE, category='lo', description='OLD PERSIAN SIGN BAGA' }, + [0x103CF] = { unicodeslot=0x103CF, category='lo', description='OLD PERSIAN SIGN BUUMISH' }, + [0x103D0] = { unicodeslot=0x103D0, category='po', description='OLD PERSIAN WORD DIVIDER' }, + [0x103D1] = { unicodeslot=0x103D1, category='nl', description='OLD PERSIAN NUMBER ONE' }, + [0x103D2] = { unicodeslot=0x103D2, category='nl', description='OLD PERSIAN NUMBER TWO' }, + [0x103D3] = { unicodeslot=0x103D3, category='nl', description='OLD PERSIAN NUMBER TEN' }, + [0x103D4] = { unicodeslot=0x103D4, category='nl', description='OLD PERSIAN NUMBER TWENTY' }, + [0x103D5] = { unicodeslot=0x103D5, category='nl', description='OLD PERSIAN NUMBER HUNDRED' }, + [0x10400] = { unicodeslot=0x10400, category='lu', description='DESERET CAPITAL LETTER LONG I', lccode=0x10428 }, + [0x10401] = { unicodeslot=0x10401, category='lu', description='DESERET CAPITAL LETTER LONG E', lccode=0x10429 }, + [0x10402] = { unicodeslot=0x10402, category='lu', description='DESERET CAPITAL LETTER LONG A', lccode=0x1042A }, + [0x10403] = { unicodeslot=0x10403, category='lu', description='DESERET CAPITAL LETTER LONG AH', lccode=0x1042B }, + [0x10404] = { unicodeslot=0x10404, category='lu', description='DESERET CAPITAL LETTER LONG O', lccode=0x1042C }, + [0x10405] = { unicodeslot=0x10405, category='lu', description='DESERET CAPITAL LETTER LONG OO', lccode=0x1042D }, + [0x10406] = { unicodeslot=0x10406, category='lu', description='DESERET CAPITAL LETTER SHORT I', lccode=0x1042E }, + [0x10407] = { unicodeslot=0x10407, category='lu', description='DESERET CAPITAL LETTER SHORT E', lccode=0x1042F }, + [0x10408] = { unicodeslot=0x10408, category='lu', description='DESERET CAPITAL LETTER SHORT A', lccode=0x10430 }, + [0x10409] = { unicodeslot=0x10409, category='lu', description='DESERET CAPITAL LETTER SHORT AH', lccode=0x10431 }, + [0x1040A] = { unicodeslot=0x1040A, category='lu', description='DESERET CAPITAL LETTER SHORT O', lccode=0x10432 }, + [0x1040B] = { unicodeslot=0x1040B, category='lu', description='DESERET CAPITAL LETTER SHORT OO', lccode=0x10433 }, + [0x1040C] = { unicodeslot=0x1040C, category='lu', description='DESERET CAPITAL LETTER AY', lccode=0x10434 }, + [0x1040D] = { unicodeslot=0x1040D, category='lu', description='DESERET CAPITAL LETTER OW', lccode=0x10435 }, + [0x1040E] = { unicodeslot=0x1040E, category='lu', description='DESERET CAPITAL LETTER WU', lccode=0x10436 }, + [0x1040F] = { unicodeslot=0x1040F, category='lu', description='DESERET CAPITAL LETTER YEE', lccode=0x10437 }, + [0x10410] = { unicodeslot=0x10410, category='lu', description='DESERET CAPITAL LETTER H', lccode=0x10438 }, + [0x10411] = { unicodeslot=0x10411, category='lu', description='DESERET CAPITAL LETTER PEE', lccode=0x10439 }, + [0x10412] = { unicodeslot=0x10412, category='lu', description='DESERET CAPITAL LETTER BEE', lccode=0x1043A }, + [0x10413] = { unicodeslot=0x10413, category='lu', description='DESERET CAPITAL LETTER TEE', lccode=0x1043B }, + [0x10414] = { unicodeslot=0x10414, category='lu', description='DESERET CAPITAL LETTER DEE', lccode=0x1043C }, + [0x10415] = { unicodeslot=0x10415, category='lu', description='DESERET CAPITAL LETTER CHEE', lccode=0x1043D }, + [0x10416] = { unicodeslot=0x10416, category='lu', description='DESERET CAPITAL LETTER JEE', lccode=0x1043E }, + [0x10417] = { unicodeslot=0x10417, category='lu', description='DESERET CAPITAL LETTER KAY', lccode=0x1043F }, + [0x10418] = { unicodeslot=0x10418, category='lu', description='DESERET CAPITAL LETTER GAY', lccode=0x10440 }, + [0x10419] = { unicodeslot=0x10419, category='lu', description='DESERET CAPITAL LETTER EF', lccode=0x10441 }, + [0x1041A] = { unicodeslot=0x1041A, category='lu', description='DESERET CAPITAL LETTER VEE', lccode=0x10442 }, + [0x1041B] = { unicodeslot=0x1041B, category='lu', description='DESERET CAPITAL LETTER ETH', lccode=0x10443 }, + [0x1041C] = { unicodeslot=0x1041C, category='lu', description='DESERET CAPITAL LETTER THEE', lccode=0x10444 }, + [0x1041D] = { unicodeslot=0x1041D, category='lu', description='DESERET CAPITAL LETTER ES', lccode=0x10445 }, + [0x1041E] = { unicodeslot=0x1041E, category='lu', description='DESERET CAPITAL LETTER ZEE', lccode=0x10446 }, + [0x1041F] = { unicodeslot=0x1041F, category='lu', description='DESERET CAPITAL LETTER ESH', lccode=0x10447 }, + [0x10420] = { unicodeslot=0x10420, category='lu', description='DESERET CAPITAL LETTER ZHEE', lccode=0x10448 }, + [0x10421] = { unicodeslot=0x10421, category='lu', description='DESERET CAPITAL LETTER ER', lccode=0x10449 }, + [0x10422] = { unicodeslot=0x10422, category='lu', description='DESERET CAPITAL LETTER EL', lccode=0x1044A }, + [0x10423] = { unicodeslot=0x10423, category='lu', description='DESERET CAPITAL LETTER EM', lccode=0x1044B }, + [0x10424] = { unicodeslot=0x10424, category='lu', description='DESERET CAPITAL LETTER EN', lccode=0x1044C }, + [0x10425] = { unicodeslot=0x10425, category='lu', description='DESERET CAPITAL LETTER ENG', lccode=0x1044D }, + [0x10426] = { unicodeslot=0x10426, category='lu', description='DESERET CAPITAL LETTER OI', lccode=0x1044E }, + [0x10427] = { unicodeslot=0x10427, category='lu', description='DESERET CAPITAL LETTER EW', lccode=0x1044F }, + [0x10428] = { unicodeslot=0x10428, category='ll', description='DESERET SMALL LETTER LONG I', uccode=0x10400 }, + [0x10429] = { unicodeslot=0x10429, category='ll', description='DESERET SMALL LETTER LONG E', uccode=0x10401 }, + [0x1042A] = { unicodeslot=0x1042A, category='ll', description='DESERET SMALL LETTER LONG A', uccode=0x10402 }, + [0x1042B] = { unicodeslot=0x1042B, category='ll', description='DESERET SMALL LETTER LONG AH', uccode=0x10403 }, + [0x1042C] = { unicodeslot=0x1042C, category='ll', description='DESERET SMALL LETTER LONG O', uccode=0x10404 }, + [0x1042D] = { unicodeslot=0x1042D, category='ll', description='DESERET SMALL LETTER LONG OO', uccode=0x10405 }, + [0x1042E] = { unicodeslot=0x1042E, category='ll', description='DESERET SMALL LETTER SHORT I', uccode=0x10406 }, + [0x1042F] = { unicodeslot=0x1042F, category='ll', description='DESERET SMALL LETTER SHORT E', uccode=0x10407 }, + [0x10430] = { unicodeslot=0x10430, category='ll', description='DESERET SMALL LETTER SHORT A', uccode=0x10408 }, + [0x10431] = { unicodeslot=0x10431, category='ll', description='DESERET SMALL LETTER SHORT AH', uccode=0x10409 }, + [0x10432] = { unicodeslot=0x10432, category='ll', description='DESERET SMALL LETTER SHORT O', uccode=0x1040A }, + [0x10433] = { unicodeslot=0x10433, category='ll', description='DESERET SMALL LETTER SHORT OO', uccode=0x1040B }, + [0x10434] = { unicodeslot=0x10434, category='ll', description='DESERET SMALL LETTER AY', uccode=0x1040C }, + [0x10435] = { unicodeslot=0x10435, category='ll', description='DESERET SMALL LETTER OW', uccode=0x1040D }, + [0x10436] = { unicodeslot=0x10436, category='ll', description='DESERET SMALL LETTER WU', uccode=0x1040E }, + [0x10437] = { unicodeslot=0x10437, category='ll', description='DESERET SMALL LETTER YEE', uccode=0x1040F }, + [0x10438] = { unicodeslot=0x10438, category='ll', description='DESERET SMALL LETTER H', uccode=0x10410 }, + [0x10439] = { unicodeslot=0x10439, category='ll', description='DESERET SMALL LETTER PEE', uccode=0x10411 }, + [0x1043A] = { unicodeslot=0x1043A, category='ll', description='DESERET SMALL LETTER BEE', uccode=0x10412 }, + [0x1043B] = { unicodeslot=0x1043B, category='ll', description='DESERET SMALL LETTER TEE', uccode=0x10413 }, + [0x1043C] = { unicodeslot=0x1043C, category='ll', description='DESERET SMALL LETTER DEE', uccode=0x10414 }, + [0x1043D] = { unicodeslot=0x1043D, category='ll', description='DESERET SMALL LETTER CHEE', uccode=0x10415 }, + [0x1043E] = { unicodeslot=0x1043E, category='ll', description='DESERET SMALL LETTER JEE', uccode=0x10416 }, + [0x1043F] = { unicodeslot=0x1043F, category='ll', description='DESERET SMALL LETTER KAY', uccode=0x10417 }, + [0x10440] = { unicodeslot=0x10440, category='ll', description='DESERET SMALL LETTER GAY', uccode=0x10418 }, + [0x10441] = { unicodeslot=0x10441, category='ll', description='DESERET SMALL LETTER EF', uccode=0x10419 }, + [0x10442] = { unicodeslot=0x10442, category='ll', description='DESERET SMALL LETTER VEE', uccode=0x1041A }, + [0x10443] = { unicodeslot=0x10443, category='ll', description='DESERET SMALL LETTER ETH', uccode=0x1041B }, + [0x10444] = { unicodeslot=0x10444, category='ll', description='DESERET SMALL LETTER THEE', uccode=0x1041C }, + [0x10445] = { unicodeslot=0x10445, category='ll', description='DESERET SMALL LETTER ES', uccode=0x1041D }, + [0x10446] = { unicodeslot=0x10446, category='ll', description='DESERET SMALL LETTER ZEE', uccode=0x1041E }, + [0x10447] = { unicodeslot=0x10447, category='ll', description='DESERET SMALL LETTER ESH', uccode=0x1041F }, + [0x10448] = { unicodeslot=0x10448, category='ll', description='DESERET SMALL LETTER ZHEE', uccode=0x10420 }, + [0x10449] = { unicodeslot=0x10449, category='ll', description='DESERET SMALL LETTER ER', uccode=0x10421 }, + [0x1044A] = { unicodeslot=0x1044A, category='ll', description='DESERET SMALL LETTER EL', uccode=0x10422 }, + [0x1044B] = { unicodeslot=0x1044B, category='ll', description='DESERET SMALL LETTER EM', uccode=0x10423 }, + [0x1044C] = { unicodeslot=0x1044C, category='ll', description='DESERET SMALL LETTER EN', uccode=0x10424 }, + [0x1044D] = { unicodeslot=0x1044D, category='ll', description='DESERET SMALL LETTER ENG', uccode=0x10425 }, + [0x1044E] = { unicodeslot=0x1044E, category='ll', description='DESERET SMALL LETTER OI', uccode=0x10426 }, + [0x1044F] = { unicodeslot=0x1044F, category='ll', description='DESERET SMALL LETTER EW', uccode=0x10427 }, + [0x10450] = { unicodeslot=0x10450, category='lo', description='SHAVIAN LETTER PEEP' }, + [0x10451] = { unicodeslot=0x10451, category='lo', description='SHAVIAN LETTER TOT' }, + [0x10452] = { unicodeslot=0x10452, category='lo', description='SHAVIAN LETTER KICK' }, + [0x10453] = { unicodeslot=0x10453, category='lo', description='SHAVIAN LETTER FEE' }, + [0x10454] = { unicodeslot=0x10454, category='lo', description='SHAVIAN LETTER THIGH' }, + [0x10455] = { unicodeslot=0x10455, category='lo', description='SHAVIAN LETTER SO' }, + [0x10456] = { unicodeslot=0x10456, category='lo', description='SHAVIAN LETTER SURE' }, + [0x10457] = { unicodeslot=0x10457, category='lo', description='SHAVIAN LETTER CHURCH' }, + [0x10458] = { unicodeslot=0x10458, category='lo', description='SHAVIAN LETTER YEA' }, + [0x10459] = { unicodeslot=0x10459, category='lo', description='SHAVIAN LETTER HUNG' }, + [0x1045A] = { unicodeslot=0x1045A, category='lo', description='SHAVIAN LETTER BIB' }, + [0x1045B] = { unicodeslot=0x1045B, category='lo', description='SHAVIAN LETTER DEAD' }, + [0x1045C] = { unicodeslot=0x1045C, category='lo', description='SHAVIAN LETTER GAG' }, + [0x1045D] = { unicodeslot=0x1045D, category='lo', description='SHAVIAN LETTER VOW' }, + [0x1045E] = { unicodeslot=0x1045E, category='lo', description='SHAVIAN LETTER THEY' }, + [0x1045F] = { unicodeslot=0x1045F, category='lo', description='SHAVIAN LETTER ZOO' }, + [0x10460] = { unicodeslot=0x10460, category='lo', description='SHAVIAN LETTER MEASURE' }, + [0x10461] = { unicodeslot=0x10461, category='lo', description='SHAVIAN LETTER JUDGE' }, + [0x10462] = { unicodeslot=0x10462, category='lo', description='SHAVIAN LETTER WOE' }, + [0x10463] = { unicodeslot=0x10463, category='lo', description='SHAVIAN LETTER HA-HA' }, + [0x10464] = { unicodeslot=0x10464, category='lo', description='SHAVIAN LETTER LOLL' }, + [0x10465] = { unicodeslot=0x10465, category='lo', description='SHAVIAN LETTER MIME' }, + [0x10466] = { unicodeslot=0x10466, category='lo', description='SHAVIAN LETTER IF' }, + [0x10467] = { unicodeslot=0x10467, category='lo', description='SHAVIAN LETTER EGG' }, + [0x10468] = { unicodeslot=0x10468, category='lo', description='SHAVIAN LETTER ASH' }, + [0x10469] = { unicodeslot=0x10469, category='lo', description='SHAVIAN LETTER ADO' }, + [0x1046A] = { unicodeslot=0x1046A, category='lo', description='SHAVIAN LETTER ON' }, + [0x1046B] = { unicodeslot=0x1046B, category='lo', description='SHAVIAN LETTER WOOL' }, + [0x1046C] = { unicodeslot=0x1046C, category='lo', description='SHAVIAN LETTER OUT' }, + [0x1046D] = { unicodeslot=0x1046D, category='lo', description='SHAVIAN LETTER AH' }, + [0x1046E] = { unicodeslot=0x1046E, category='lo', description='SHAVIAN LETTER ROAR' }, + [0x1046F] = { unicodeslot=0x1046F, category='lo', description='SHAVIAN LETTER NUN' }, + [0x10470] = { unicodeslot=0x10470, category='lo', description='SHAVIAN LETTER EAT' }, + [0x10471] = { unicodeslot=0x10471, category='lo', description='SHAVIAN LETTER AGE' }, + [0x10472] = { unicodeslot=0x10472, category='lo', description='SHAVIAN LETTER ICE' }, + [0x10473] = { unicodeslot=0x10473, category='lo', description='SHAVIAN LETTER UP' }, + [0x10474] = { unicodeslot=0x10474, category='lo', description='SHAVIAN LETTER OAK' }, + [0x10475] = { unicodeslot=0x10475, category='lo', description='SHAVIAN LETTER OOZE' }, + [0x10476] = { unicodeslot=0x10476, category='lo', description='SHAVIAN LETTER OIL' }, + [0x10477] = { unicodeslot=0x10477, category='lo', description='SHAVIAN LETTER AWE' }, + [0x10478] = { unicodeslot=0x10478, category='lo', description='SHAVIAN LETTER ARE' }, + [0x10479] = { unicodeslot=0x10479, category='lo', description='SHAVIAN LETTER OR' }, + [0x1047A] = { unicodeslot=0x1047A, category='lo', description='SHAVIAN LETTER AIR' }, + [0x1047B] = { unicodeslot=0x1047B, category='lo', description='SHAVIAN LETTER ERR' }, + [0x1047C] = { unicodeslot=0x1047C, category='lo', description='SHAVIAN LETTER ARRAY' }, + [0x1047D] = { unicodeslot=0x1047D, category='lo', description='SHAVIAN LETTER EAR' }, + [0x1047E] = { unicodeslot=0x1047E, category='lo', description='SHAVIAN LETTER IAN' }, + [0x1047F] = { unicodeslot=0x1047F, category='lo', description='SHAVIAN LETTER YEW' }, + [0x10480] = { unicodeslot=0x10480, category='lo', description='OSMANYA LETTER ALEF' }, + [0x10481] = { unicodeslot=0x10481, category='lo', description='OSMANYA LETTER BA' }, + [0x10482] = { unicodeslot=0x10482, category='lo', description='OSMANYA LETTER TA' }, + [0x10483] = { unicodeslot=0x10483, category='lo', description='OSMANYA LETTER JA' }, + [0x10484] = { unicodeslot=0x10484, category='lo', description='OSMANYA LETTER XA' }, + [0x10485] = { unicodeslot=0x10485, category='lo', description='OSMANYA LETTER KHA' }, + [0x10486] = { unicodeslot=0x10486, category='lo', description='OSMANYA LETTER DEEL' }, + [0x10487] = { unicodeslot=0x10487, category='lo', description='OSMANYA LETTER RA' }, + [0x10488] = { unicodeslot=0x10488, category='lo', description='OSMANYA LETTER SA' }, + [0x10489] = { unicodeslot=0x10489, category='lo', description='OSMANYA LETTER SHIIN' }, + [0x1048A] = { unicodeslot=0x1048A, category='lo', description='OSMANYA LETTER DHA' }, + [0x1048B] = { unicodeslot=0x1048B, category='lo', description='OSMANYA LETTER CAYN' }, + [0x1048C] = { unicodeslot=0x1048C, category='lo', description='OSMANYA LETTER GA' }, + [0x1048D] = { unicodeslot=0x1048D, category='lo', description='OSMANYA LETTER FA' }, + [0x1048E] = { unicodeslot=0x1048E, category='lo', description='OSMANYA LETTER QAAF' }, + [0x1048F] = { unicodeslot=0x1048F, category='lo', description='OSMANYA LETTER KAAF' }, + [0x10490] = { unicodeslot=0x10490, category='lo', description='OSMANYA LETTER LAAN' }, + [0x10491] = { unicodeslot=0x10491, category='lo', description='OSMANYA LETTER MIIN' }, + [0x10492] = { unicodeslot=0x10492, category='lo', description='OSMANYA LETTER NUUN' }, + [0x10493] = { unicodeslot=0x10493, category='lo', description='OSMANYA LETTER WAW' }, + [0x10494] = { unicodeslot=0x10494, category='lo', description='OSMANYA LETTER HA' }, + [0x10495] = { unicodeslot=0x10495, category='lo', description='OSMANYA LETTER YA' }, + [0x10496] = { unicodeslot=0x10496, category='lo', description='OSMANYA LETTER A' }, + [0x10497] = { unicodeslot=0x10497, category='lo', description='OSMANYA LETTER E' }, + [0x10498] = { unicodeslot=0x10498, category='lo', description='OSMANYA LETTER I' }, + [0x10499] = { unicodeslot=0x10499, category='lo', description='OSMANYA LETTER O' }, + [0x1049A] = { unicodeslot=0x1049A, category='lo', description='OSMANYA LETTER U' }, + [0x1049B] = { unicodeslot=0x1049B, category='lo', description='OSMANYA LETTER AA' }, + [0x1049C] = { unicodeslot=0x1049C, category='lo', description='OSMANYA LETTER EE' }, + [0x1049D] = { unicodeslot=0x1049D, category='lo', description='OSMANYA LETTER OO' }, + [0x104A0] = { unicodeslot=0x104A0, category='nd', description='OSMANYA DIGIT ZERO' }, + [0x104A1] = { unicodeslot=0x104A1, category='nd', description='OSMANYA DIGIT ONE' }, + [0x104A2] = { unicodeslot=0x104A2, category='nd', description='OSMANYA DIGIT TWO' }, + [0x104A3] = { unicodeslot=0x104A3, category='nd', description='OSMANYA DIGIT THREE' }, + [0x104A4] = { unicodeslot=0x104A4, category='nd', description='OSMANYA DIGIT FOUR' }, + [0x104A5] = { unicodeslot=0x104A5, category='nd', description='OSMANYA DIGIT FIVE' }, + [0x104A6] = { unicodeslot=0x104A6, category='nd', description='OSMANYA DIGIT SIX' }, + [0x104A7] = { unicodeslot=0x104A7, category='nd', description='OSMANYA DIGIT SEVEN' }, + [0x104A8] = { unicodeslot=0x104A8, category='nd', description='OSMANYA DIGIT EIGHT' }, + [0x104A9] = { unicodeslot=0x104A9, category='nd', description='OSMANYA DIGIT NINE' }, + [0x10800] = { unicodeslot=0x10800, category='lo', description='CYPRIOT SYLLABLE A' }, + [0x10801] = { unicodeslot=0x10801, category='lo', description='CYPRIOT SYLLABLE E' }, + [0x10802] = { unicodeslot=0x10802, category='lo', description='CYPRIOT SYLLABLE I' }, + [0x10803] = { unicodeslot=0x10803, category='lo', description='CYPRIOT SYLLABLE O' }, + [0x10804] = { unicodeslot=0x10804, category='lo', description='CYPRIOT SYLLABLE U' }, + [0x10805] = { unicodeslot=0x10805, category='lo', description='CYPRIOT SYLLABLE JA' }, + [0x10808] = { unicodeslot=0x10808, category='lo', description='CYPRIOT SYLLABLE JO' }, + [0x1080A] = { unicodeslot=0x1080A, category='lo', description='CYPRIOT SYLLABLE KA' }, + [0x1080B] = { unicodeslot=0x1080B, category='lo', description='CYPRIOT SYLLABLE KE' }, + [0x1080C] = { unicodeslot=0x1080C, category='lo', description='CYPRIOT SYLLABLE KI' }, + [0x1080D] = { unicodeslot=0x1080D, category='lo', description='CYPRIOT SYLLABLE KO' }, + [0x1080E] = { unicodeslot=0x1080E, category='lo', description='CYPRIOT SYLLABLE KU' }, + [0x1080F] = { unicodeslot=0x1080F, category='lo', description='CYPRIOT SYLLABLE LA' }, + [0x10810] = { unicodeslot=0x10810, category='lo', description='CYPRIOT SYLLABLE LE' }, + [0x10811] = { unicodeslot=0x10811, category='lo', description='CYPRIOT SYLLABLE LI' }, + [0x10812] = { unicodeslot=0x10812, category='lo', description='CYPRIOT SYLLABLE LO' }, + [0x10813] = { unicodeslot=0x10813, category='lo', description='CYPRIOT SYLLABLE LU' }, + [0x10814] = { unicodeslot=0x10814, category='lo', description='CYPRIOT SYLLABLE MA' }, + [0x10815] = { unicodeslot=0x10815, category='lo', description='CYPRIOT SYLLABLE ME' }, + [0x10816] = { unicodeslot=0x10816, category='lo', description='CYPRIOT SYLLABLE MI' }, + [0x10817] = { unicodeslot=0x10817, category='lo', description='CYPRIOT SYLLABLE MO' }, + [0x10818] = { unicodeslot=0x10818, category='lo', description='CYPRIOT SYLLABLE MU' }, + [0x10819] = { unicodeslot=0x10819, category='lo', description='CYPRIOT SYLLABLE NA' }, + [0x1081A] = { unicodeslot=0x1081A, category='lo', description='CYPRIOT SYLLABLE NE' }, + [0x1081B] = { unicodeslot=0x1081B, category='lo', description='CYPRIOT SYLLABLE NI' }, + [0x1081C] = { unicodeslot=0x1081C, category='lo', description='CYPRIOT SYLLABLE NO' }, + [0x1081D] = { unicodeslot=0x1081D, category='lo', description='CYPRIOT SYLLABLE NU' }, + [0x1081E] = { unicodeslot=0x1081E, category='lo', description='CYPRIOT SYLLABLE PA' }, + [0x1081F] = { unicodeslot=0x1081F, category='lo', description='CYPRIOT SYLLABLE PE' }, + [0x10820] = { unicodeslot=0x10820, category='lo', description='CYPRIOT SYLLABLE PI' }, + [0x10821] = { unicodeslot=0x10821, category='lo', description='CYPRIOT SYLLABLE PO' }, + [0x10822] = { unicodeslot=0x10822, category='lo', description='CYPRIOT SYLLABLE PU' }, + [0x10823] = { unicodeslot=0x10823, category='lo', description='CYPRIOT SYLLABLE RA' }, + [0x10824] = { unicodeslot=0x10824, category='lo', description='CYPRIOT SYLLABLE RE' }, + [0x10825] = { unicodeslot=0x10825, category='lo', description='CYPRIOT SYLLABLE RI' }, + [0x10826] = { unicodeslot=0x10826, category='lo', description='CYPRIOT SYLLABLE RO' }, + [0x10827] = { unicodeslot=0x10827, category='lo', description='CYPRIOT SYLLABLE RU' }, + [0x10828] = { unicodeslot=0x10828, category='lo', description='CYPRIOT SYLLABLE SA' }, + [0x10829] = { unicodeslot=0x10829, category='lo', description='CYPRIOT SYLLABLE SE' }, + [0x1082A] = { unicodeslot=0x1082A, category='lo', description='CYPRIOT SYLLABLE SI' }, + [0x1082B] = { unicodeslot=0x1082B, category='lo', description='CYPRIOT SYLLABLE SO' }, + [0x1082C] = { unicodeslot=0x1082C, category='lo', description='CYPRIOT SYLLABLE SU' }, + [0x1082D] = { unicodeslot=0x1082D, category='lo', description='CYPRIOT SYLLABLE TA' }, + [0x1082E] = { unicodeslot=0x1082E, category='lo', description='CYPRIOT SYLLABLE TE' }, + [0x1082F] = { unicodeslot=0x1082F, category='lo', description='CYPRIOT SYLLABLE TI' }, + [0x10830] = { unicodeslot=0x10830, category='lo', description='CYPRIOT SYLLABLE TO' }, + [0x10831] = { unicodeslot=0x10831, category='lo', description='CYPRIOT SYLLABLE TU' }, + [0x10832] = { unicodeslot=0x10832, category='lo', description='CYPRIOT SYLLABLE WA' }, + [0x10833] = { unicodeslot=0x10833, category='lo', description='CYPRIOT SYLLABLE WE' }, + [0x10834] = { unicodeslot=0x10834, category='lo', description='CYPRIOT SYLLABLE WI' }, + [0x10835] = { unicodeslot=0x10835, category='lo', description='CYPRIOT SYLLABLE WO' }, + [0x10837] = { unicodeslot=0x10837, category='lo', description='CYPRIOT SYLLABLE XA' }, + [0x10838] = { unicodeslot=0x10838, category='lo', description='CYPRIOT SYLLABLE XE' }, + [0x1083C] = { unicodeslot=0x1083C, category='lo', description='CYPRIOT SYLLABLE ZA' }, + [0x1083F] = { unicodeslot=0x1083F, category='lo', description='CYPRIOT SYLLABLE ZO' }, + [0x10900] = { unicodeslot=0x10900, category='lo', description='PHOENICIAN LETTER ALF' }, + [0x10901] = { unicodeslot=0x10901, category='lo', description='PHOENICIAN LETTER BET' }, + [0x10902] = { unicodeslot=0x10902, category='lo', description='PHOENICIAN LETTER GAML' }, + [0x10903] = { unicodeslot=0x10903, category='lo', description='PHOENICIAN LETTER DELT' }, + [0x10904] = { unicodeslot=0x10904, category='lo', description='PHOENICIAN LETTER HE' }, + [0x10905] = { unicodeslot=0x10905, category='lo', description='PHOENICIAN LETTER WAU' }, + [0x10906] = { unicodeslot=0x10906, category='lo', description='PHOENICIAN LETTER ZAI' }, + [0x10907] = { unicodeslot=0x10907, category='lo', description='PHOENICIAN LETTER HET' }, + [0x10908] = { unicodeslot=0x10908, category='lo', description='PHOENICIAN LETTER TET' }, + [0x10909] = { unicodeslot=0x10909, category='lo', description='PHOENICIAN LETTER YOD' }, + [0x1090A] = { unicodeslot=0x1090A, category='lo', description='PHOENICIAN LETTER KAF' }, + [0x1090B] = { unicodeslot=0x1090B, category='lo', description='PHOENICIAN LETTER LAMD' }, + [0x1090C] = { unicodeslot=0x1090C, category='lo', description='PHOENICIAN LETTER MEM' }, + [0x1090D] = { unicodeslot=0x1090D, category='lo', description='PHOENICIAN LETTER NUN' }, + [0x1090E] = { unicodeslot=0x1090E, category='lo', description='PHOENICIAN LETTER SEMK' }, + [0x1090F] = { unicodeslot=0x1090F, category='lo', description='PHOENICIAN LETTER AIN' }, + [0x10910] = { unicodeslot=0x10910, category='lo', description='PHOENICIAN LETTER PE' }, + [0x10911] = { unicodeslot=0x10911, category='lo', description='PHOENICIAN LETTER SADE' }, + [0x10912] = { unicodeslot=0x10912, category='lo', description='PHOENICIAN LETTER QOF' }, + [0x10913] = { unicodeslot=0x10913, category='lo', description='PHOENICIAN LETTER ROSH' }, + [0x10914] = { unicodeslot=0x10914, category='lo', description='PHOENICIAN LETTER SHIN' }, + [0x10915] = { unicodeslot=0x10915, category='lo', description='PHOENICIAN LETTER TAU' }, + [0x10916] = { unicodeslot=0x10916, category='no', description='PHOENICIAN NUMBER ONE' }, + [0x10917] = { unicodeslot=0x10917, category='no', description='PHOENICIAN NUMBER TEN' }, + [0x10918] = { unicodeslot=0x10918, category='no', description='PHOENICIAN NUMBER TWENTY' }, + [0x10919] = { unicodeslot=0x10919, category='no', description='PHOENICIAN NUMBER ONE HUNDRED' }, + [0x1091F] = { unicodeslot=0x1091F, category='po', description='PHOENICIAN WORD SEPARATOR' }, + [0x10A00] = { unicodeslot=0x10A00, category='lo', description='KHAROSHTHI LETTER A' }, + [0x10A01] = { unicodeslot=0x10A01, category='mn', description='KHAROSHTHI VOWEL SIGN I' }, + [0x10A02] = { unicodeslot=0x10A02, category='mn', description='KHAROSHTHI VOWEL SIGN U' }, + [0x10A03] = { unicodeslot=0x10A03, category='mn', description='KHAROSHTHI VOWEL SIGN VOCALIC R' }, + [0x10A05] = { unicodeslot=0x10A05, category='mn', description='KHAROSHTHI VOWEL SIGN E' }, + [0x10A06] = { unicodeslot=0x10A06, category='mn', description='KHAROSHTHI VOWEL SIGN O' }, + [0x10A0C] = { unicodeslot=0x10A0C, category='mn', description='KHAROSHTHI VOWEL LENGTH MARK' }, + [0x10A0D] = { unicodeslot=0x10A0D, category='mn', description='KHAROSHTHI SIGN DOUBLE RING BELOW' }, + [0x10A0E] = { unicodeslot=0x10A0E, category='mn', description='KHAROSHTHI SIGN ANUSVARA' }, + [0x10A0F] = { unicodeslot=0x10A0F, category='mn', description='KHAROSHTHI SIGN VISARGA' }, + [0x10A10] = { unicodeslot=0x10A10, category='lo', description='KHAROSHTHI LETTER KA' }, + [0x10A11] = { unicodeslot=0x10A11, category='lo', description='KHAROSHTHI LETTER KHA' }, + [0x10A12] = { unicodeslot=0x10A12, category='lo', description='KHAROSHTHI LETTER GA' }, + [0x10A13] = { unicodeslot=0x10A13, category='lo', description='KHAROSHTHI LETTER GHA' }, + [0x10A15] = { unicodeslot=0x10A15, category='lo', description='KHAROSHTHI LETTER CA' }, + [0x10A16] = { unicodeslot=0x10A16, category='lo', description='KHAROSHTHI LETTER CHA' }, + [0x10A17] = { unicodeslot=0x10A17, category='lo', description='KHAROSHTHI LETTER JA' }, + [0x10A19] = { unicodeslot=0x10A19, category='lo', description='KHAROSHTHI LETTER NYA' }, + [0x10A1A] = { unicodeslot=0x10A1A, category='lo', description='KHAROSHTHI LETTER TTA' }, + [0x10A1B] = { unicodeslot=0x10A1B, category='lo', description='KHAROSHTHI LETTER TTHA' }, + [0x10A1C] = { unicodeslot=0x10A1C, category='lo', description='KHAROSHTHI LETTER DDA' }, + [0x10A1D] = { unicodeslot=0x10A1D, category='lo', description='KHAROSHTHI LETTER DDHA' }, + [0x10A1E] = { unicodeslot=0x10A1E, category='lo', description='KHAROSHTHI LETTER NNA' }, + [0x10A1F] = { unicodeslot=0x10A1F, category='lo', description='KHAROSHTHI LETTER TA' }, + [0x10A20] = { unicodeslot=0x10A20, category='lo', description='KHAROSHTHI LETTER THA' }, + [0x10A21] = { unicodeslot=0x10A21, category='lo', description='KHAROSHTHI LETTER DA' }, + [0x10A22] = { unicodeslot=0x10A22, category='lo', description='KHAROSHTHI LETTER DHA' }, + [0x10A23] = { unicodeslot=0x10A23, category='lo', description='KHAROSHTHI LETTER NA' }, + [0x10A24] = { unicodeslot=0x10A24, category='lo', description='KHAROSHTHI LETTER PA' }, + [0x10A25] = { unicodeslot=0x10A25, category='lo', description='KHAROSHTHI LETTER PHA' }, + [0x10A26] = { unicodeslot=0x10A26, category='lo', description='KHAROSHTHI LETTER BA' }, + [0x10A27] = { unicodeslot=0x10A27, category='lo', description='KHAROSHTHI LETTER BHA' }, + [0x10A28] = { unicodeslot=0x10A28, category='lo', description='KHAROSHTHI LETTER MA' }, + [0x10A29] = { unicodeslot=0x10A29, category='lo', description='KHAROSHTHI LETTER YA' }, + [0x10A2A] = { unicodeslot=0x10A2A, category='lo', description='KHAROSHTHI LETTER RA' }, + [0x10A2B] = { unicodeslot=0x10A2B, category='lo', description='KHAROSHTHI LETTER LA' }, + [0x10A2C] = { unicodeslot=0x10A2C, category='lo', description='KHAROSHTHI LETTER VA' }, + [0x10A2D] = { unicodeslot=0x10A2D, category='lo', description='KHAROSHTHI LETTER SHA' }, + [0x10A2E] = { unicodeslot=0x10A2E, category='lo', description='KHAROSHTHI LETTER SSA' }, + [0x10A2F] = { unicodeslot=0x10A2F, category='lo', description='KHAROSHTHI LETTER SA' }, + [0x10A30] = { unicodeslot=0x10A30, category='lo', description='KHAROSHTHI LETTER ZA' }, + [0x10A31] = { unicodeslot=0x10A31, category='lo', description='KHAROSHTHI LETTER HA' }, + [0x10A32] = { unicodeslot=0x10A32, category='lo', description='KHAROSHTHI LETTER KKA' }, + [0x10A33] = { unicodeslot=0x10A33, category='lo', description='KHAROSHTHI LETTER TTTHA' }, + [0x10A38] = { unicodeslot=0x10A38, category='mn', description='KHAROSHTHI SIGN BAR ABOVE' }, + [0x10A39] = { unicodeslot=0x10A39, category='mn', description='KHAROSHTHI SIGN CAUDA' }, + [0x10A3A] = { unicodeslot=0x10A3A, category='mn', description='KHAROSHTHI SIGN DOT BELOW' }, + [0x10A3F] = { unicodeslot=0x10A3F, category='mn', description='KHAROSHTHI VIRAMA' }, + [0x10A40] = { unicodeslot=0x10A40, category='no', description='KHAROSHTHI DIGIT ONE' }, + [0x10A41] = { unicodeslot=0x10A41, category='no', description='KHAROSHTHI DIGIT TWO' }, + [0x10A42] = { unicodeslot=0x10A42, category='no', description='KHAROSHTHI DIGIT THREE' }, + [0x10A43] = { unicodeslot=0x10A43, category='no', description='KHAROSHTHI DIGIT FOUR' }, + [0x10A44] = { unicodeslot=0x10A44, category='no', description='KHAROSHTHI NUMBER TEN' }, + [0x10A45] = { unicodeslot=0x10A45, category='no', description='KHAROSHTHI NUMBER TWENTY' }, + [0x10A46] = { unicodeslot=0x10A46, category='no', description='KHAROSHTHI NUMBER ONE HUNDRED' }, + [0x10A47] = { unicodeslot=0x10A47, category='no', description='KHAROSHTHI NUMBER ONE THOUSAND' }, + [0x10A50] = { unicodeslot=0x10A50, category='po', description='KHAROSHTHI PUNCTUATION DOT' }, + [0x10A51] = { unicodeslot=0x10A51, category='po', description='KHAROSHTHI PUNCTUATION SMALL CIRCLE' }, + [0x10A52] = { unicodeslot=0x10A52, category='po', description='KHAROSHTHI PUNCTUATION CIRCLE' }, + [0x10A53] = { unicodeslot=0x10A53, category='po', description='KHAROSHTHI PUNCTUATION CRESCENT BAR' }, + [0x10A54] = { unicodeslot=0x10A54, category='po', description='KHAROSHTHI PUNCTUATION MANGALAM' }, + [0x10A55] = { unicodeslot=0x10A55, category='po', description='KHAROSHTHI PUNCTUATION LOTUS' }, + [0x10A56] = { unicodeslot=0x10A56, category='po', description='KHAROSHTHI PUNCTUATION DANDA' }, + [0x10A57] = { unicodeslot=0x10A57, category='po', description='KHAROSHTHI PUNCTUATION DOUBLE DANDA' }, + [0x10A58] = { unicodeslot=0x10A58, category='po', description='KHAROSHTHI PUNCTUATION LINES' }, + [0x12000] = { unicodeslot=0x12000, category='lo', description='CUNEIFORM SIGN A' }, + [0x12001] = { unicodeslot=0x12001, category='lo', description='CUNEIFORM SIGN A TIMES A' }, + [0x12002] = { unicodeslot=0x12002, category='lo', description='CUNEIFORM SIGN A TIMES BAD' }, + [0x12003] = { unicodeslot=0x12003, category='lo', description='CUNEIFORM SIGN A TIMES GAN2 TENU' }, + [0x12004] = { unicodeslot=0x12004, category='lo', description='CUNEIFORM SIGN A TIMES HA' }, + [0x12005] = { unicodeslot=0x12005, category='lo', description='CUNEIFORM SIGN A TIMES IGI' }, + [0x12006] = { unicodeslot=0x12006, category='lo', description='CUNEIFORM SIGN A TIMES LAGAR GUNU' }, + [0x12007] = { unicodeslot=0x12007, category='lo', description='CUNEIFORM SIGN A TIMES MUSH' }, + [0x12008] = { unicodeslot=0x12008, category='lo', description='CUNEIFORM SIGN A TIMES SAG' }, + [0x12009] = { unicodeslot=0x12009, category='lo', description='CUNEIFORM SIGN A2' }, + [0x1200A] = { unicodeslot=0x1200A, category='lo', description='CUNEIFORM SIGN AB' }, + [0x1200B] = { unicodeslot=0x1200B, category='lo', description='CUNEIFORM SIGN AB TIMES ASH2' }, + [0x1200C] = { unicodeslot=0x1200C, category='lo', description='CUNEIFORM SIGN AB TIMES DUN3 GUNU' }, + [0x1200D] = { unicodeslot=0x1200D, category='lo', description='CUNEIFORM SIGN AB TIMES GAL' }, + [0x1200E] = { unicodeslot=0x1200E, category='lo', description='CUNEIFORM SIGN AB TIMES GAN2 TENU' }, + [0x1200F] = { unicodeslot=0x1200F, category='lo', description='CUNEIFORM SIGN AB TIMES HA' }, + [0x12010] = { unicodeslot=0x12010, category='lo', description='CUNEIFORM SIGN AB TIMES IGI GUNU' }, + [0x12011] = { unicodeslot=0x12011, category='lo', description='CUNEIFORM SIGN AB TIMES IMIN' }, + [0x12012] = { unicodeslot=0x12012, category='lo', description='CUNEIFORM SIGN AB TIMES LAGAB' }, + [0x12013] = { unicodeslot=0x12013, category='lo', description='CUNEIFORM SIGN AB TIMES SHESH' }, + [0x12014] = { unicodeslot=0x12014, category='lo', description='CUNEIFORM SIGN AB TIMES U PLUS U PLUS U' }, + [0x12015] = { unicodeslot=0x12015, category='lo', description='CUNEIFORM SIGN AB GUNU' }, + [0x12016] = { unicodeslot=0x12016, category='lo', description='CUNEIFORM SIGN AB2' }, + [0x12017] = { unicodeslot=0x12017, category='lo', description='CUNEIFORM SIGN AB2 TIMES BALAG' }, + [0x12018] = { unicodeslot=0x12018, category='lo', description='CUNEIFORM SIGN AB2 TIMES GAN2 TENU' }, + [0x12019] = { unicodeslot=0x12019, category='lo', description='CUNEIFORM SIGN AB2 TIMES ME PLUS EN' }, + [0x1201A] = { unicodeslot=0x1201A, category='lo', description='CUNEIFORM SIGN AB2 TIMES SHA3' }, + [0x1201B] = { unicodeslot=0x1201B, category='lo', description='CUNEIFORM SIGN AB2 TIMES TAK4' }, + [0x1201C] = { unicodeslot=0x1201C, category='lo', description='CUNEIFORM SIGN AD' }, + [0x1201D] = { unicodeslot=0x1201D, category='lo', description='CUNEIFORM SIGN AK' }, + [0x1201E] = { unicodeslot=0x1201E, category='lo', description='CUNEIFORM SIGN AK TIMES ERIN2' }, + [0x1201F] = { unicodeslot=0x1201F, category='lo', description='CUNEIFORM SIGN AK TIMES SHITA PLUS GISH' }, + [0x12020] = { unicodeslot=0x12020, category='lo', description='CUNEIFORM SIGN AL' }, + [0x12021] = { unicodeslot=0x12021, category='lo', description='CUNEIFORM SIGN AL TIMES AL' }, + [0x12022] = { unicodeslot=0x12022, category='lo', description='CUNEIFORM SIGN AL TIMES DIM2' }, + [0x12023] = { unicodeslot=0x12023, category='lo', description='CUNEIFORM SIGN AL TIMES GISH' }, + [0x12024] = { unicodeslot=0x12024, category='lo', description='CUNEIFORM SIGN AL TIMES HA' }, + [0x12025] = { unicodeslot=0x12025, category='lo', description='CUNEIFORM SIGN AL TIMES KAD3' }, + [0x12026] = { unicodeslot=0x12026, category='lo', description='CUNEIFORM SIGN AL TIMES KI' }, + [0x12027] = { unicodeslot=0x12027, category='lo', description='CUNEIFORM SIGN AL TIMES SHE' }, + [0x12028] = { unicodeslot=0x12028, category='lo', description='CUNEIFORM SIGN AL TIMES USH' }, + [0x12029] = { unicodeslot=0x12029, category='lo', description='CUNEIFORM SIGN ALAN' }, + [0x1202A] = { unicodeslot=0x1202A, category='lo', description='CUNEIFORM SIGN ALEPH' }, + [0x1202B] = { unicodeslot=0x1202B, category='lo', description='CUNEIFORM SIGN AMAR' }, + [0x1202C] = { unicodeslot=0x1202C, category='lo', description='CUNEIFORM SIGN AMAR TIMES SHE' }, + [0x1202D] = { unicodeslot=0x1202D, category='lo', description='CUNEIFORM SIGN AN' }, + [0x1202E] = { unicodeslot=0x1202E, category='lo', description='CUNEIFORM SIGN AN OVER AN' }, + [0x1202F] = { unicodeslot=0x1202F, category='lo', description='CUNEIFORM SIGN AN THREE TIMES' }, + [0x12030] = { unicodeslot=0x12030, category='lo', description='CUNEIFORM SIGN AN PLUS NAGA OPPOSING AN PLUS NAGA' }, + [0x12031] = { unicodeslot=0x12031, category='lo', description='CUNEIFORM SIGN AN PLUS NAGA SQUARED' }, + [0x12032] = { unicodeslot=0x12032, category='lo', description='CUNEIFORM SIGN ANSHE' }, + [0x12033] = { unicodeslot=0x12033, category='lo', description='CUNEIFORM SIGN APIN' }, + [0x12034] = { unicodeslot=0x12034, category='lo', description='CUNEIFORM SIGN ARAD' }, + [0x12035] = { unicodeslot=0x12035, category='lo', description='CUNEIFORM SIGN ARAD TIMES KUR' }, + [0x12036] = { unicodeslot=0x12036, category='lo', description='CUNEIFORM SIGN ARKAB' }, + [0x12037] = { unicodeslot=0x12037, category='lo', description='CUNEIFORM SIGN ASAL2' }, + [0x12038] = { unicodeslot=0x12038, category='lo', description='CUNEIFORM SIGN ASH' }, + [0x12039] = { unicodeslot=0x12039, category='lo', description='CUNEIFORM SIGN ASH ZIDA TENU' }, + [0x1203A] = { unicodeslot=0x1203A, category='lo', description='CUNEIFORM SIGN ASH KABA TENU' }, + [0x1203B] = { unicodeslot=0x1203B, category='lo', description='CUNEIFORM SIGN ASH OVER ASH TUG2 OVER TUG2 TUG2 OVER TUG2 PAP' }, + [0x1203C] = { unicodeslot=0x1203C, category='lo', description='CUNEIFORM SIGN ASH OVER ASH OVER ASH' }, + [0x1203D] = { unicodeslot=0x1203D, category='lo', description='CUNEIFORM SIGN ASH OVER ASH OVER ASH CROSSING ASH OVER ASH OVER ASH' }, + [0x1203E] = { unicodeslot=0x1203E, category='lo', description='CUNEIFORM SIGN ASH2' }, + [0x1203F] = { unicodeslot=0x1203F, category='lo', description='CUNEIFORM SIGN ASHGAB' }, + [0x12040] = { unicodeslot=0x12040, category='lo', description='CUNEIFORM SIGN BA' }, + [0x12041] = { unicodeslot=0x12041, category='lo', description='CUNEIFORM SIGN BAD' }, + [0x12042] = { unicodeslot=0x12042, category='lo', description='CUNEIFORM SIGN BAG3' }, + [0x12043] = { unicodeslot=0x12043, category='lo', description='CUNEIFORM SIGN BAHAR2' }, + [0x12044] = { unicodeslot=0x12044, category='lo', description='CUNEIFORM SIGN BAL' }, + [0x12045] = { unicodeslot=0x12045, category='lo', description='CUNEIFORM SIGN BAL OVER BAL' }, + [0x12046] = { unicodeslot=0x12046, category='lo', description='CUNEIFORM SIGN BALAG' }, + [0x12047] = { unicodeslot=0x12047, category='lo', description='CUNEIFORM SIGN BAR' }, + [0x12048] = { unicodeslot=0x12048, category='lo', description='CUNEIFORM SIGN BARA2' }, + [0x12049] = { unicodeslot=0x12049, category='lo', description='CUNEIFORM SIGN BI' }, + [0x1204A] = { unicodeslot=0x1204A, category='lo', description='CUNEIFORM SIGN BI TIMES A' }, + [0x1204B] = { unicodeslot=0x1204B, category='lo', description='CUNEIFORM SIGN BI TIMES GAR' }, + [0x1204C] = { unicodeslot=0x1204C, category='lo', description='CUNEIFORM SIGN BI TIMES IGI GUNU' }, + [0x1204D] = { unicodeslot=0x1204D, category='lo', description='CUNEIFORM SIGN BU' }, + [0x1204E] = { unicodeslot=0x1204E, category='lo', description='CUNEIFORM SIGN BU OVER BU AB' }, + [0x1204F] = { unicodeslot=0x1204F, category='lo', description='CUNEIFORM SIGN BU OVER BU UN' }, + [0x12050] = { unicodeslot=0x12050, category='lo', description='CUNEIFORM SIGN BU CROSSING BU' }, + [0x12051] = { unicodeslot=0x12051, category='lo', description='CUNEIFORM SIGN BULUG' }, + [0x12052] = { unicodeslot=0x12052, category='lo', description='CUNEIFORM SIGN BULUG OVER BULUG' }, + [0x12053] = { unicodeslot=0x12053, category='lo', description='CUNEIFORM SIGN BUR' }, + [0x12054] = { unicodeslot=0x12054, category='lo', description='CUNEIFORM SIGN BUR2' }, + [0x12055] = { unicodeslot=0x12055, category='lo', description='CUNEIFORM SIGN DA' }, + [0x12056] = { unicodeslot=0x12056, category='lo', description='CUNEIFORM SIGN DAG' }, + [0x12057] = { unicodeslot=0x12057, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES A PLUS MASH' }, + [0x12058] = { unicodeslot=0x12058, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES AMAR' }, + [0x12059] = { unicodeslot=0x12059, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES BALAG' }, + [0x1205A] = { unicodeslot=0x1205A, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES BI' }, + [0x1205B] = { unicodeslot=0x1205B, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES GA' }, + [0x1205C] = { unicodeslot=0x1205C, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES GA PLUS MASH' }, + [0x1205D] = { unicodeslot=0x1205D, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES GI' }, + [0x1205E] = { unicodeslot=0x1205E, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES GIR2' }, + [0x1205F] = { unicodeslot=0x1205F, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES GUD' }, + [0x12060] = { unicodeslot=0x12060, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES HA' }, + [0x12061] = { unicodeslot=0x12061, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES IR' }, + [0x12062] = { unicodeslot=0x12062, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES IR PLUS LU' }, + [0x12063] = { unicodeslot=0x12063, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES KAK' }, + [0x12064] = { unicodeslot=0x12064, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES LA' }, + [0x12065] = { unicodeslot=0x12065, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES LU' }, + [0x12066] = { unicodeslot=0x12066, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES LU PLUS MASH2' }, + [0x12067] = { unicodeslot=0x12067, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES LUM' }, + [0x12068] = { unicodeslot=0x12068, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES NE' }, + [0x12069] = { unicodeslot=0x12069, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES PAP PLUS PAP' }, + [0x1206A] = { unicodeslot=0x1206A, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES SI' }, + [0x1206B] = { unicodeslot=0x1206B, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES TAK4' }, + [0x1206C] = { unicodeslot=0x1206C, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES U2 PLUS GIR2' }, + [0x1206D] = { unicodeslot=0x1206D, category='lo', description='CUNEIFORM SIGN DAG KISIM5 TIMES USH' }, + [0x1206E] = { unicodeslot=0x1206E, category='lo', description='CUNEIFORM SIGN DAM' }, + [0x1206F] = { unicodeslot=0x1206F, category='lo', description='CUNEIFORM SIGN DAR' }, + [0x12070] = { unicodeslot=0x12070, category='lo', description='CUNEIFORM SIGN DARA3' }, + [0x12071] = { unicodeslot=0x12071, category='lo', description='CUNEIFORM SIGN DARA4' }, + [0x12072] = { unicodeslot=0x12072, category='lo', description='CUNEIFORM SIGN DI' }, + [0x12073] = { unicodeslot=0x12073, category='lo', description='CUNEIFORM SIGN DIB' }, + [0x12074] = { unicodeslot=0x12074, category='lo', description='CUNEIFORM SIGN DIM' }, + [0x12075] = { unicodeslot=0x12075, category='lo', description='CUNEIFORM SIGN DIM TIMES SHE' }, + [0x12076] = { unicodeslot=0x12076, category='lo', description='CUNEIFORM SIGN DIM2' }, + [0x12077] = { unicodeslot=0x12077, category='lo', description='CUNEIFORM SIGN DIN' }, + [0x12078] = { unicodeslot=0x12078, category='lo', description='CUNEIFORM SIGN DIN KASKAL U GUNU DISH' }, + [0x12079] = { unicodeslot=0x12079, category='lo', description='CUNEIFORM SIGN DISH' }, + [0x1207A] = { unicodeslot=0x1207A, category='lo', description='CUNEIFORM SIGN DU' }, + [0x1207B] = { unicodeslot=0x1207B, category='lo', description='CUNEIFORM SIGN DU OVER DU' }, + [0x1207C] = { unicodeslot=0x1207C, category='lo', description='CUNEIFORM SIGN DU GUNU' }, + [0x1207D] = { unicodeslot=0x1207D, category='lo', description='CUNEIFORM SIGN DU SHESHIG' }, + [0x1207E] = { unicodeslot=0x1207E, category='lo', description='CUNEIFORM SIGN DUB' }, + [0x1207F] = { unicodeslot=0x1207F, category='lo', description='CUNEIFORM SIGN DUB TIMES ESH2' }, + [0x12080] = { unicodeslot=0x12080, category='lo', description='CUNEIFORM SIGN DUB2' }, + [0x12081] = { unicodeslot=0x12081, category='lo', description='CUNEIFORM SIGN DUG' }, + [0x12082] = { unicodeslot=0x12082, category='lo', description='CUNEIFORM SIGN DUGUD' }, + [0x12083] = { unicodeslot=0x12083, category='lo', description='CUNEIFORM SIGN DUH' }, + [0x12084] = { unicodeslot=0x12084, category='lo', description='CUNEIFORM SIGN DUN' }, + [0x12085] = { unicodeslot=0x12085, category='lo', description='CUNEIFORM SIGN DUN3' }, + [0x12086] = { unicodeslot=0x12086, category='lo', description='CUNEIFORM SIGN DUN3 GUNU' }, + [0x12087] = { unicodeslot=0x12087, category='lo', description='CUNEIFORM SIGN DUN3 GUNU GUNU' }, + [0x12088] = { unicodeslot=0x12088, category='lo', description='CUNEIFORM SIGN DUN4' }, + [0x12089] = { unicodeslot=0x12089, category='lo', description='CUNEIFORM SIGN DUR2' }, + [0x1208A] = { unicodeslot=0x1208A, category='lo', description='CUNEIFORM SIGN E' }, + [0x1208B] = { unicodeslot=0x1208B, category='lo', description='CUNEIFORM SIGN E TIMES PAP' }, + [0x1208C] = { unicodeslot=0x1208C, category='lo', description='CUNEIFORM SIGN E OVER E NUN OVER NUN' }, + [0x1208D] = { unicodeslot=0x1208D, category='lo', description='CUNEIFORM SIGN E2' }, + [0x1208E] = { unicodeslot=0x1208E, category='lo', description='CUNEIFORM SIGN E2 TIMES A PLUS HA PLUS DA' }, + [0x1208F] = { unicodeslot=0x1208F, category='lo', description='CUNEIFORM SIGN E2 TIMES GAR' }, + [0x12090] = { unicodeslot=0x12090, category='lo', description='CUNEIFORM SIGN E2 TIMES MI' }, + [0x12091] = { unicodeslot=0x12091, category='lo', description='CUNEIFORM SIGN E2 TIMES SAL' }, + [0x12092] = { unicodeslot=0x12092, category='lo', description='CUNEIFORM SIGN E2 TIMES SHE' }, + [0x12093] = { unicodeslot=0x12093, category='lo', description='CUNEIFORM SIGN E2 TIMES U' }, + [0x12094] = { unicodeslot=0x12094, category='lo', description='CUNEIFORM SIGN EDIN' }, + [0x12095] = { unicodeslot=0x12095, category='lo', description='CUNEIFORM SIGN EGIR' }, + [0x12096] = { unicodeslot=0x12096, category='lo', description='CUNEIFORM SIGN EL' }, + [0x12097] = { unicodeslot=0x12097, category='lo', description='CUNEIFORM SIGN EN' }, + [0x12098] = { unicodeslot=0x12098, category='lo', description='CUNEIFORM SIGN EN TIMES GAN2' }, + [0x12099] = { unicodeslot=0x12099, category='lo', description='CUNEIFORM SIGN EN TIMES GAN2 TENU' }, + [0x1209A] = { unicodeslot=0x1209A, category='lo', description='CUNEIFORM SIGN EN TIMES ME' }, + [0x1209B] = { unicodeslot=0x1209B, category='lo', description='CUNEIFORM SIGN EN CROSSING EN' }, + [0x1209C] = { unicodeslot=0x1209C, category='lo', description='CUNEIFORM SIGN EN OPPOSING EN' }, + [0x1209D] = { unicodeslot=0x1209D, category='lo', description='CUNEIFORM SIGN EN SQUARED' }, + [0x1209E] = { unicodeslot=0x1209E, category='lo', description='CUNEIFORM SIGN EREN' }, + [0x1209F] = { unicodeslot=0x1209F, category='lo', description='CUNEIFORM SIGN ERIN2' }, + [0x120A0] = { unicodeslot=0x120A0, category='lo', description='CUNEIFORM SIGN ESH2' }, + [0x120A1] = { unicodeslot=0x120A1, category='lo', description='CUNEIFORM SIGN EZEN' }, + [0x120A2] = { unicodeslot=0x120A2, category='lo', description='CUNEIFORM SIGN EZEN TIMES A' }, + [0x120A3] = { unicodeslot=0x120A3, category='lo', description='CUNEIFORM SIGN EZEN TIMES A PLUS LAL' }, + [0x120A4] = { unicodeslot=0x120A4, category='lo', description='CUNEIFORM SIGN EZEN TIMES A PLUS LAL TIMES LAL' }, + [0x120A5] = { unicodeslot=0x120A5, category='lo', description='CUNEIFORM SIGN EZEN TIMES AN' }, + [0x120A6] = { unicodeslot=0x120A6, category='lo', description='CUNEIFORM SIGN EZEN TIMES BAD' }, + [0x120A7] = { unicodeslot=0x120A7, category='lo', description='CUNEIFORM SIGN EZEN TIMES DUN3 GUNU' }, + [0x120A8] = { unicodeslot=0x120A8, category='lo', description='CUNEIFORM SIGN EZEN TIMES DUN3 GUNU GUNU' }, + [0x120A9] = { unicodeslot=0x120A9, category='lo', description='CUNEIFORM SIGN EZEN TIMES HA' }, + [0x120AA] = { unicodeslot=0x120AA, category='lo', description='CUNEIFORM SIGN EZEN TIMES HA GUNU' }, + [0x120AB] = { unicodeslot=0x120AB, category='lo', description='CUNEIFORM SIGN EZEN TIMES IGI GUNU' }, + [0x120AC] = { unicodeslot=0x120AC, category='lo', description='CUNEIFORM SIGN EZEN TIMES KASKAL' }, + [0x120AD] = { unicodeslot=0x120AD, category='lo', description='CUNEIFORM SIGN EZEN TIMES KASKAL SQUARED' }, + [0x120AE] = { unicodeslot=0x120AE, category='lo', description='CUNEIFORM SIGN EZEN TIMES KU3' }, + [0x120AF] = { unicodeslot=0x120AF, category='lo', description='CUNEIFORM SIGN EZEN TIMES LA' }, + [0x120B0] = { unicodeslot=0x120B0, category='lo', description='CUNEIFORM SIGN EZEN TIMES LAL TIMES LAL' }, + [0x120B1] = { unicodeslot=0x120B1, category='lo', description='CUNEIFORM SIGN EZEN TIMES LI' }, + [0x120B2] = { unicodeslot=0x120B2, category='lo', description='CUNEIFORM SIGN EZEN TIMES LU' }, + [0x120B3] = { unicodeslot=0x120B3, category='lo', description='CUNEIFORM SIGN EZEN TIMES U2' }, + [0x120B4] = { unicodeslot=0x120B4, category='lo', description='CUNEIFORM SIGN EZEN TIMES UD' }, + [0x120B5] = { unicodeslot=0x120B5, category='lo', description='CUNEIFORM SIGN GA' }, + [0x120B6] = { unicodeslot=0x120B6, category='lo', description='CUNEIFORM SIGN GA GUNU' }, + [0x120B7] = { unicodeslot=0x120B7, category='lo', description='CUNEIFORM SIGN GA2' }, + [0x120B8] = { unicodeslot=0x120B8, category='lo', description='CUNEIFORM SIGN GA2 TIMES A PLUS DA PLUS HA' }, + [0x120B9] = { unicodeslot=0x120B9, category='lo', description='CUNEIFORM SIGN GA2 TIMES A PLUS HA' }, + [0x120BA] = { unicodeslot=0x120BA, category='lo', description='CUNEIFORM SIGN GA2 TIMES A PLUS IGI' }, + [0x120BB] = { unicodeslot=0x120BB, category='lo', description='CUNEIFORM SIGN GA2 TIMES AB2 TENU PLUS TAB' }, + [0x120BC] = { unicodeslot=0x120BC, category='lo', description='CUNEIFORM SIGN GA2 TIMES AN' }, + [0x120BD] = { unicodeslot=0x120BD, category='lo', description='CUNEIFORM SIGN GA2 TIMES ASH' }, + [0x120BE] = { unicodeslot=0x120BE, category='lo', description='CUNEIFORM SIGN GA2 TIMES ASH2 PLUS GAL' }, + [0x120BF] = { unicodeslot=0x120BF, category='lo', description='CUNEIFORM SIGN GA2 TIMES BAD' }, + [0x120C0] = { unicodeslot=0x120C0, category='lo', description='CUNEIFORM SIGN GA2 TIMES BAR PLUS RA' }, + [0x120C1] = { unicodeslot=0x120C1, category='lo', description='CUNEIFORM SIGN GA2 TIMES BUR' }, + [0x120C2] = { unicodeslot=0x120C2, category='lo', description='CUNEIFORM SIGN GA2 TIMES BUR PLUS RA' }, + [0x120C3] = { unicodeslot=0x120C3, category='lo', description='CUNEIFORM SIGN GA2 TIMES DA' }, + [0x120C4] = { unicodeslot=0x120C4, category='lo', description='CUNEIFORM SIGN GA2 TIMES DI' }, + [0x120C5] = { unicodeslot=0x120C5, category='lo', description='CUNEIFORM SIGN GA2 TIMES DIM TIMES SHE' }, + [0x120C6] = { unicodeslot=0x120C6, category='lo', description='CUNEIFORM SIGN GA2 TIMES DUB' }, + [0x120C7] = { unicodeslot=0x120C7, category='lo', description='CUNEIFORM SIGN GA2 TIMES EL' }, + [0x120C8] = { unicodeslot=0x120C8, category='lo', description='CUNEIFORM SIGN GA2 TIMES EL PLUS LA' }, + [0x120C9] = { unicodeslot=0x120C9, category='lo', description='CUNEIFORM SIGN GA2 TIMES EN' }, + [0x120CA] = { unicodeslot=0x120CA, category='lo', description='CUNEIFORM SIGN GA2 TIMES EN TIMES GAN2 TENU' }, + [0x120CB] = { unicodeslot=0x120CB, category='lo', description='CUNEIFORM SIGN GA2 TIMES GAN2 TENU' }, + [0x120CC] = { unicodeslot=0x120CC, category='lo', description='CUNEIFORM SIGN GA2 TIMES GAR' }, + [0x120CD] = { unicodeslot=0x120CD, category='lo', description='CUNEIFORM SIGN GA2 TIMES GI' }, + [0x120CE] = { unicodeslot=0x120CE, category='lo', description='CUNEIFORM SIGN GA2 TIMES GI4' }, + [0x120CF] = { unicodeslot=0x120CF, category='lo', description='CUNEIFORM SIGN GA2 TIMES GI4 PLUS A' }, + [0x120D0] = { unicodeslot=0x120D0, category='lo', description='CUNEIFORM SIGN GA2 TIMES GIR2 PLUS SU' }, + [0x120D1] = { unicodeslot=0x120D1, category='lo', description='CUNEIFORM SIGN GA2 TIMES HA PLUS LU PLUS ESH2' }, + [0x120D2] = { unicodeslot=0x120D2, category='lo', description='CUNEIFORM SIGN GA2 TIMES HAL' }, + [0x120D3] = { unicodeslot=0x120D3, category='lo', description='CUNEIFORM SIGN GA2 TIMES HAL PLUS LA' }, + [0x120D4] = { unicodeslot=0x120D4, category='lo', description='CUNEIFORM SIGN GA2 TIMES HI PLUS LI' }, + [0x120D5] = { unicodeslot=0x120D5, category='lo', description='CUNEIFORM SIGN GA2 TIMES HUB2' }, + [0x120D6] = { unicodeslot=0x120D6, category='lo', description='CUNEIFORM SIGN GA2 TIMES IGI GUNU' }, + [0x120D7] = { unicodeslot=0x120D7, category='lo', description='CUNEIFORM SIGN GA2 TIMES ISH PLUS HU PLUS ASH' }, + [0x120D8] = { unicodeslot=0x120D8, category='lo', description='CUNEIFORM SIGN GA2 TIMES KAK' }, + [0x120D9] = { unicodeslot=0x120D9, category='lo', description='CUNEIFORM SIGN GA2 TIMES KASKAL' }, + [0x120DA] = { unicodeslot=0x120DA, category='lo', description='CUNEIFORM SIGN GA2 TIMES KID' }, + [0x120DB] = { unicodeslot=0x120DB, category='lo', description='CUNEIFORM SIGN GA2 TIMES KID PLUS LAL' }, + [0x120DC] = { unicodeslot=0x120DC, category='lo', description='CUNEIFORM SIGN GA2 TIMES KU3 PLUS AN' }, + [0x120DD] = { unicodeslot=0x120DD, category='lo', description='CUNEIFORM SIGN GA2 TIMES LA' }, + [0x120DE] = { unicodeslot=0x120DE, category='lo', description='CUNEIFORM SIGN GA2 TIMES ME PLUS EN' }, + [0x120DF] = { unicodeslot=0x120DF, category='lo', description='CUNEIFORM SIGN GA2 TIMES MI' }, + [0x120E0] = { unicodeslot=0x120E0, category='lo', description='CUNEIFORM SIGN GA2 TIMES NUN' }, + [0x120E1] = { unicodeslot=0x120E1, category='lo', description='CUNEIFORM SIGN GA2 TIMES NUN OVER NUN' }, + [0x120E2] = { unicodeslot=0x120E2, category='lo', description='CUNEIFORM SIGN GA2 TIMES PA' }, + [0x120E3] = { unicodeslot=0x120E3, category='lo', description='CUNEIFORM SIGN GA2 TIMES SAL' }, + [0x120E4] = { unicodeslot=0x120E4, category='lo', description='CUNEIFORM SIGN GA2 TIMES SAR' }, + [0x120E5] = { unicodeslot=0x120E5, category='lo', description='CUNEIFORM SIGN GA2 TIMES SHE' }, + [0x120E6] = { unicodeslot=0x120E6, category='lo', description='CUNEIFORM SIGN GA2 TIMES SHE PLUS TUR' }, + [0x120E7] = { unicodeslot=0x120E7, category='lo', description='CUNEIFORM SIGN GA2 TIMES SHID' }, + [0x120E8] = { unicodeslot=0x120E8, category='lo', description='CUNEIFORM SIGN GA2 TIMES SUM' }, + [0x120E9] = { unicodeslot=0x120E9, category='lo', description='CUNEIFORM SIGN GA2 TIMES TAK4' }, + [0x120EA] = { unicodeslot=0x120EA, category='lo', description='CUNEIFORM SIGN GA2 TIMES U' }, + [0x120EB] = { unicodeslot=0x120EB, category='lo', description='CUNEIFORM SIGN GA2 TIMES UD' }, + [0x120EC] = { unicodeslot=0x120EC, category='lo', description='CUNEIFORM SIGN GA2 TIMES UD PLUS DU' }, + [0x120ED] = { unicodeslot=0x120ED, category='lo', description='CUNEIFORM SIGN GA2 OVER GA2' }, + [0x120EE] = { unicodeslot=0x120EE, category='lo', description='CUNEIFORM SIGN GABA' }, + [0x120EF] = { unicodeslot=0x120EF, category='lo', description='CUNEIFORM SIGN GABA CROSSING GABA' }, + [0x120F0] = { unicodeslot=0x120F0, category='lo', description='CUNEIFORM SIGN GAD' }, + [0x120F1] = { unicodeslot=0x120F1, category='lo', description='CUNEIFORM SIGN GAD OVER GAD GAR OVER GAR' }, + [0x120F2] = { unicodeslot=0x120F2, category='lo', description='CUNEIFORM SIGN GAL' }, + [0x120F3] = { unicodeslot=0x120F3, category='lo', description='CUNEIFORM SIGN GAL GAD OVER GAD GAR OVER GAR' }, + [0x120F4] = { unicodeslot=0x120F4, category='lo', description='CUNEIFORM SIGN GALAM' }, + [0x120F5] = { unicodeslot=0x120F5, category='lo', description='CUNEIFORM SIGN GAM' }, + [0x120F6] = { unicodeslot=0x120F6, category='lo', description='CUNEIFORM SIGN GAN' }, + [0x120F7] = { unicodeslot=0x120F7, category='lo', description='CUNEIFORM SIGN GAN2' }, + [0x120F8] = { unicodeslot=0x120F8, category='lo', description='CUNEIFORM SIGN GAN2 TENU' }, + [0x120F9] = { unicodeslot=0x120F9, category='lo', description='CUNEIFORM SIGN GAN2 OVER GAN2' }, + [0x120FA] = { unicodeslot=0x120FA, category='lo', description='CUNEIFORM SIGN GAN2 CROSSING GAN2' }, + [0x120FB] = { unicodeslot=0x120FB, category='lo', description='CUNEIFORM SIGN GAR' }, + [0x120FC] = { unicodeslot=0x120FC, category='lo', description='CUNEIFORM SIGN GAR3' }, + [0x120FD] = { unicodeslot=0x120FD, category='lo', description='CUNEIFORM SIGN GASHAN' }, + [0x120FE] = { unicodeslot=0x120FE, category='lo', description='CUNEIFORM SIGN GESHTIN' }, + [0x120FF] = { unicodeslot=0x120FF, category='lo', description='CUNEIFORM SIGN GESHTIN TIMES KUR' }, + [0x12100] = { unicodeslot=0x12100, category='lo', description='CUNEIFORM SIGN GI' }, + [0x12101] = { unicodeslot=0x12101, category='lo', description='CUNEIFORM SIGN GI TIMES E' }, + [0x12102] = { unicodeslot=0x12102, category='lo', description='CUNEIFORM SIGN GI TIMES U' }, + [0x12103] = { unicodeslot=0x12103, category='lo', description='CUNEIFORM SIGN GI CROSSING GI' }, + [0x12104] = { unicodeslot=0x12104, category='lo', description='CUNEIFORM SIGN GI4' }, + [0x12105] = { unicodeslot=0x12105, category='lo', description='CUNEIFORM SIGN GI4 OVER GI4' }, + [0x12106] = { unicodeslot=0x12106, category='lo', description='CUNEIFORM SIGN GI4 CROSSING GI4' }, + [0x12107] = { unicodeslot=0x12107, category='lo', description='CUNEIFORM SIGN GIDIM' }, + [0x12108] = { unicodeslot=0x12108, category='lo', description='CUNEIFORM SIGN GIR2' }, + [0x12109] = { unicodeslot=0x12109, category='lo', description='CUNEIFORM SIGN GIR2 GUNU' }, + [0x1210A] = { unicodeslot=0x1210A, category='lo', description='CUNEIFORM SIGN GIR3' }, + [0x1210B] = { unicodeslot=0x1210B, category='lo', description='CUNEIFORM SIGN GIR3 TIMES A PLUS IGI' }, + [0x1210C] = { unicodeslot=0x1210C, category='lo', description='CUNEIFORM SIGN GIR3 TIMES GAN2 TENU' }, + [0x1210D] = { unicodeslot=0x1210D, category='lo', description='CUNEIFORM SIGN GIR3 TIMES IGI' }, + [0x1210E] = { unicodeslot=0x1210E, category='lo', description='CUNEIFORM SIGN GIR3 TIMES LU PLUS IGI' }, + [0x1210F] = { unicodeslot=0x1210F, category='lo', description='CUNEIFORM SIGN GIR3 TIMES PA' }, + [0x12110] = { unicodeslot=0x12110, category='lo', description='CUNEIFORM SIGN GISAL' }, + [0x12111] = { unicodeslot=0x12111, category='lo', description='CUNEIFORM SIGN GISH' }, + [0x12112] = { unicodeslot=0x12112, category='lo', description='CUNEIFORM SIGN GISH CROSSING GISH' }, + [0x12113] = { unicodeslot=0x12113, category='lo', description='CUNEIFORM SIGN GISH TIMES BAD' }, + [0x12114] = { unicodeslot=0x12114, category='lo', description='CUNEIFORM SIGN GISH TIMES TAK4' }, + [0x12115] = { unicodeslot=0x12115, category='lo', description='CUNEIFORM SIGN GISH TENU' }, + [0x12116] = { unicodeslot=0x12116, category='lo', description='CUNEIFORM SIGN GU' }, + [0x12117] = { unicodeslot=0x12117, category='lo', description='CUNEIFORM SIGN GU CROSSING GU' }, + [0x12118] = { unicodeslot=0x12118, category='lo', description='CUNEIFORM SIGN GU2' }, + [0x12119] = { unicodeslot=0x12119, category='lo', description='CUNEIFORM SIGN GU2 TIMES KAK' }, + [0x1211A] = { unicodeslot=0x1211A, category='lo', description='CUNEIFORM SIGN GU2 TIMES KAK TIMES IGI GUNU' }, + [0x1211B] = { unicodeslot=0x1211B, category='lo', description='CUNEIFORM SIGN GU2 TIMES NUN' }, + [0x1211C] = { unicodeslot=0x1211C, category='lo', description='CUNEIFORM SIGN GU2 TIMES SAL PLUS TUG2' }, + [0x1211D] = { unicodeslot=0x1211D, category='lo', description='CUNEIFORM SIGN GU2 GUNU' }, + [0x1211E] = { unicodeslot=0x1211E, category='lo', description='CUNEIFORM SIGN GUD' }, + [0x1211F] = { unicodeslot=0x1211F, category='lo', description='CUNEIFORM SIGN GUD TIMES A PLUS KUR' }, + [0x12120] = { unicodeslot=0x12120, category='lo', description='CUNEIFORM SIGN GUD TIMES KUR' }, + [0x12121] = { unicodeslot=0x12121, category='lo', description='CUNEIFORM SIGN GUD OVER GUD LUGAL' }, + [0x12122] = { unicodeslot=0x12122, category='lo', description='CUNEIFORM SIGN GUL' }, + [0x12123] = { unicodeslot=0x12123, category='lo', description='CUNEIFORM SIGN GUM' }, + [0x12124] = { unicodeslot=0x12124, category='lo', description='CUNEIFORM SIGN GUM TIMES SHE' }, + [0x12125] = { unicodeslot=0x12125, category='lo', description='CUNEIFORM SIGN GUR' }, + [0x12126] = { unicodeslot=0x12126, category='lo', description='CUNEIFORM SIGN GUR7' }, + [0x12127] = { unicodeslot=0x12127, category='lo', description='CUNEIFORM SIGN GURUN' }, + [0x12128] = { unicodeslot=0x12128, category='lo', description='CUNEIFORM SIGN GURUSH' }, + [0x12129] = { unicodeslot=0x12129, category='lo', description='CUNEIFORM SIGN HA' }, + [0x1212A] = { unicodeslot=0x1212A, category='lo', description='CUNEIFORM SIGN HA TENU' }, + [0x1212B] = { unicodeslot=0x1212B, category='lo', description='CUNEIFORM SIGN HA GUNU' }, + [0x1212C] = { unicodeslot=0x1212C, category='lo', description='CUNEIFORM SIGN HAL' }, + [0x1212D] = { unicodeslot=0x1212D, category='lo', description='CUNEIFORM SIGN HI' }, + [0x1212E] = { unicodeslot=0x1212E, category='lo', description='CUNEIFORM SIGN HI TIMES ASH' }, + [0x1212F] = { unicodeslot=0x1212F, category='lo', description='CUNEIFORM SIGN HI TIMES ASH2' }, + [0x12130] = { unicodeslot=0x12130, category='lo', description='CUNEIFORM SIGN HI TIMES BAD' }, + [0x12131] = { unicodeslot=0x12131, category='lo', description='CUNEIFORM SIGN HI TIMES DISH' }, + [0x12132] = { unicodeslot=0x12132, category='lo', description='CUNEIFORM SIGN HI TIMES GAD' }, + [0x12133] = { unicodeslot=0x12133, category='lo', description='CUNEIFORM SIGN HI TIMES KIN' }, + [0x12134] = { unicodeslot=0x12134, category='lo', description='CUNEIFORM SIGN HI TIMES NUN' }, + [0x12135] = { unicodeslot=0x12135, category='lo', description='CUNEIFORM SIGN HI TIMES SHE' }, + [0x12136] = { unicodeslot=0x12136, category='lo', description='CUNEIFORM SIGN HI TIMES U' }, + [0x12137] = { unicodeslot=0x12137, category='lo', description='CUNEIFORM SIGN HU' }, + [0x12138] = { unicodeslot=0x12138, category='lo', description='CUNEIFORM SIGN HUB2' }, + [0x12139] = { unicodeslot=0x12139, category='lo', description='CUNEIFORM SIGN HUB2 TIMES AN' }, + [0x1213A] = { unicodeslot=0x1213A, category='lo', description='CUNEIFORM SIGN HUB2 TIMES HAL' }, + [0x1213B] = { unicodeslot=0x1213B, category='lo', description='CUNEIFORM SIGN HUB2 TIMES KASKAL' }, + [0x1213C] = { unicodeslot=0x1213C, category='lo', description='CUNEIFORM SIGN HUB2 TIMES LISH' }, + [0x1213D] = { unicodeslot=0x1213D, category='lo', description='CUNEIFORM SIGN HUB2 TIMES UD' }, + [0x1213E] = { unicodeslot=0x1213E, category='lo', description='CUNEIFORM SIGN HUL2' }, + [0x1213F] = { unicodeslot=0x1213F, category='lo', description='CUNEIFORM SIGN I' }, + [0x12140] = { unicodeslot=0x12140, category='lo', description='CUNEIFORM SIGN I A' }, + [0x12141] = { unicodeslot=0x12141, category='lo', description='CUNEIFORM SIGN IB' }, + [0x12142] = { unicodeslot=0x12142, category='lo', description='CUNEIFORM SIGN IDIM' }, + [0x12143] = { unicodeslot=0x12143, category='lo', description='CUNEIFORM SIGN IDIM OVER IDIM BUR' }, + [0x12144] = { unicodeslot=0x12144, category='lo', description='CUNEIFORM SIGN IDIM OVER IDIM SQUARED' }, + [0x12145] = { unicodeslot=0x12145, category='lo', description='CUNEIFORM SIGN IG' }, + [0x12146] = { unicodeslot=0x12146, category='lo', description='CUNEIFORM SIGN IGI' }, + [0x12147] = { unicodeslot=0x12147, category='lo', description='CUNEIFORM SIGN IGI DIB' }, + [0x12148] = { unicodeslot=0x12148, category='lo', description='CUNEIFORM SIGN IGI RI' }, + [0x12149] = { unicodeslot=0x12149, category='lo', description='CUNEIFORM SIGN IGI OVER IGI SHIR OVER SHIR UD OVER UD' }, + [0x1214A] = { unicodeslot=0x1214A, category='lo', description='CUNEIFORM SIGN IGI GUNU' }, + [0x1214B] = { unicodeslot=0x1214B, category='lo', description='CUNEIFORM SIGN IL' }, + [0x1214C] = { unicodeslot=0x1214C, category='lo', description='CUNEIFORM SIGN IL TIMES GAN2 TENU' }, + [0x1214D] = { unicodeslot=0x1214D, category='lo', description='CUNEIFORM SIGN IL2' }, + [0x1214E] = { unicodeslot=0x1214E, category='lo', description='CUNEIFORM SIGN IM' }, + [0x1214F] = { unicodeslot=0x1214F, category='lo', description='CUNEIFORM SIGN IM TIMES TAK4' }, + [0x12150] = { unicodeslot=0x12150, category='lo', description='CUNEIFORM SIGN IM CROSSING IM' }, + [0x12151] = { unicodeslot=0x12151, category='lo', description='CUNEIFORM SIGN IM OPPOSING IM' }, + [0x12152] = { unicodeslot=0x12152, category='lo', description='CUNEIFORM SIGN IM SQUARED' }, + [0x12153] = { unicodeslot=0x12153, category='lo', description='CUNEIFORM SIGN IMIN' }, + [0x12154] = { unicodeslot=0x12154, category='lo', description='CUNEIFORM SIGN IN' }, + [0x12155] = { unicodeslot=0x12155, category='lo', description='CUNEIFORM SIGN IR' }, + [0x12156] = { unicodeslot=0x12156, category='lo', description='CUNEIFORM SIGN ISH' }, + [0x12157] = { unicodeslot=0x12157, category='lo', description='CUNEIFORM SIGN KA' }, + [0x12158] = { unicodeslot=0x12158, category='lo', description='CUNEIFORM SIGN KA TIMES A' }, + [0x12159] = { unicodeslot=0x12159, category='lo', description='CUNEIFORM SIGN KA TIMES AD' }, + [0x1215A] = { unicodeslot=0x1215A, category='lo', description='CUNEIFORM SIGN KA TIMES AD PLUS KU3' }, + [0x1215B] = { unicodeslot=0x1215B, category='lo', description='CUNEIFORM SIGN KA TIMES ASH2' }, + [0x1215C] = { unicodeslot=0x1215C, category='lo', description='CUNEIFORM SIGN KA TIMES BAD' }, + [0x1215D] = { unicodeslot=0x1215D, category='lo', description='CUNEIFORM SIGN KA TIMES BALAG' }, + [0x1215E] = { unicodeslot=0x1215E, category='lo', description='CUNEIFORM SIGN KA TIMES BAR' }, + [0x1215F] = { unicodeslot=0x1215F, category='lo', description='CUNEIFORM SIGN KA TIMES BI' }, + [0x12160] = { unicodeslot=0x12160, category='lo', description='CUNEIFORM SIGN KA TIMES ERIN2' }, + [0x12161] = { unicodeslot=0x12161, category='lo', description='CUNEIFORM SIGN KA TIMES ESH2' }, + [0x12162] = { unicodeslot=0x12162, category='lo', description='CUNEIFORM SIGN KA TIMES GA' }, + [0x12163] = { unicodeslot=0x12163, category='lo', description='CUNEIFORM SIGN KA TIMES GAL' }, + [0x12164] = { unicodeslot=0x12164, category='lo', description='CUNEIFORM SIGN KA TIMES GAN2 TENU' }, + [0x12165] = { unicodeslot=0x12165, category='lo', description='CUNEIFORM SIGN KA TIMES GAR' }, + [0x12166] = { unicodeslot=0x12166, category='lo', description='CUNEIFORM SIGN KA TIMES GAR PLUS SHA3 PLUS A' }, + [0x12167] = { unicodeslot=0x12167, category='lo', description='CUNEIFORM SIGN KA TIMES GI' }, + [0x12168] = { unicodeslot=0x12168, category='lo', description='CUNEIFORM SIGN KA TIMES GIR2' }, + [0x12169] = { unicodeslot=0x12169, category='lo', description='CUNEIFORM SIGN KA TIMES GISH PLUS SAR' }, + [0x1216A] = { unicodeslot=0x1216A, category='lo', description='CUNEIFORM SIGN KA TIMES GISH CROSSING GISH' }, + [0x1216B] = { unicodeslot=0x1216B, category='lo', description='CUNEIFORM SIGN KA TIMES GU' }, + [0x1216C] = { unicodeslot=0x1216C, category='lo', description='CUNEIFORM SIGN KA TIMES GUR7' }, + [0x1216D] = { unicodeslot=0x1216D, category='lo', description='CUNEIFORM SIGN KA TIMES IGI' }, + [0x1216E] = { unicodeslot=0x1216E, category='lo', description='CUNEIFORM SIGN KA TIMES IM' }, + [0x1216F] = { unicodeslot=0x1216F, category='lo', description='CUNEIFORM SIGN KA TIMES KAK' }, + [0x12170] = { unicodeslot=0x12170, category='lo', description='CUNEIFORM SIGN KA TIMES KI' }, + [0x12171] = { unicodeslot=0x12171, category='lo', description='CUNEIFORM SIGN KA TIMES KID' }, + [0x12172] = { unicodeslot=0x12172, category='lo', description='CUNEIFORM SIGN KA TIMES LI' }, + [0x12173] = { unicodeslot=0x12173, category='lo', description='CUNEIFORM SIGN KA TIMES LU' }, + [0x12174] = { unicodeslot=0x12174, category='lo', description='CUNEIFORM SIGN KA TIMES ME' }, + [0x12175] = { unicodeslot=0x12175, category='lo', description='CUNEIFORM SIGN KA TIMES ME PLUS DU' }, + [0x12176] = { unicodeslot=0x12176, category='lo', description='CUNEIFORM SIGN KA TIMES ME PLUS GI' }, + [0x12177] = { unicodeslot=0x12177, category='lo', description='CUNEIFORM SIGN KA TIMES ME PLUS TE' }, + [0x12178] = { unicodeslot=0x12178, category='lo', description='CUNEIFORM SIGN KA TIMES MI' }, + [0x12179] = { unicodeslot=0x12179, category='lo', description='CUNEIFORM SIGN KA TIMES MI PLUS NUNUZ' }, + [0x1217A] = { unicodeslot=0x1217A, category='lo', description='CUNEIFORM SIGN KA TIMES NE' }, + [0x1217B] = { unicodeslot=0x1217B, category='lo', description='CUNEIFORM SIGN KA TIMES NUN' }, + [0x1217C] = { unicodeslot=0x1217C, category='lo', description='CUNEIFORM SIGN KA TIMES PI' }, + [0x1217D] = { unicodeslot=0x1217D, category='lo', description='CUNEIFORM SIGN KA TIMES RU' }, + [0x1217E] = { unicodeslot=0x1217E, category='lo', description='CUNEIFORM SIGN KA TIMES SA' }, + [0x1217F] = { unicodeslot=0x1217F, category='lo', description='CUNEIFORM SIGN KA TIMES SAR' }, + [0x12180] = { unicodeslot=0x12180, category='lo', description='CUNEIFORM SIGN KA TIMES SHA' }, + [0x12181] = { unicodeslot=0x12181, category='lo', description='CUNEIFORM SIGN KA TIMES SHE' }, + [0x12182] = { unicodeslot=0x12182, category='lo', description='CUNEIFORM SIGN KA TIMES SHID' }, + [0x12183] = { unicodeslot=0x12183, category='lo', description='CUNEIFORM SIGN KA TIMES SHU' }, + [0x12184] = { unicodeslot=0x12184, category='lo', description='CUNEIFORM SIGN KA TIMES SIG' }, + [0x12185] = { unicodeslot=0x12185, category='lo', description='CUNEIFORM SIGN KA TIMES SUHUR' }, + [0x12186] = { unicodeslot=0x12186, category='lo', description='CUNEIFORM SIGN KA TIMES TAR' }, + [0x12187] = { unicodeslot=0x12187, category='lo', description='CUNEIFORM SIGN KA TIMES U' }, + [0x12188] = { unicodeslot=0x12188, category='lo', description='CUNEIFORM SIGN KA TIMES U2' }, + [0x12189] = { unicodeslot=0x12189, category='lo', description='CUNEIFORM SIGN KA TIMES UD' }, + [0x1218A] = { unicodeslot=0x1218A, category='lo', description='CUNEIFORM SIGN KA TIMES UMUM TIMES PA' }, + [0x1218B] = { unicodeslot=0x1218B, category='lo', description='CUNEIFORM SIGN KA TIMES USH' }, + [0x1218C] = { unicodeslot=0x1218C, category='lo', description='CUNEIFORM SIGN KA TIMES ZI' }, + [0x1218D] = { unicodeslot=0x1218D, category='lo', description='CUNEIFORM SIGN KA2' }, + [0x1218E] = { unicodeslot=0x1218E, category='lo', description='CUNEIFORM SIGN KA2 CROSSING KA2' }, + [0x1218F] = { unicodeslot=0x1218F, category='lo', description='CUNEIFORM SIGN KAB' }, + [0x12190] = { unicodeslot=0x12190, category='lo', description='CUNEIFORM SIGN KAD2' }, + [0x12191] = { unicodeslot=0x12191, category='lo', description='CUNEIFORM SIGN KAD3' }, + [0x12192] = { unicodeslot=0x12192, category='lo', description='CUNEIFORM SIGN KAD4' }, + [0x12193] = { unicodeslot=0x12193, category='lo', description='CUNEIFORM SIGN KAD5' }, + [0x12194] = { unicodeslot=0x12194, category='lo', description='CUNEIFORM SIGN KAD5 OVER KAD5' }, + [0x12195] = { unicodeslot=0x12195, category='lo', description='CUNEIFORM SIGN KAK' }, + [0x12196] = { unicodeslot=0x12196, category='lo', description='CUNEIFORM SIGN KAK TIMES IGI GUNU' }, + [0x12197] = { unicodeslot=0x12197, category='lo', description='CUNEIFORM SIGN KAL' }, + [0x12198] = { unicodeslot=0x12198, category='lo', description='CUNEIFORM SIGN KAL TIMES BAD' }, + [0x12199] = { unicodeslot=0x12199, category='lo', description='CUNEIFORM SIGN KAL CROSSING KAL' }, + [0x1219A] = { unicodeslot=0x1219A, category='lo', description='CUNEIFORM SIGN KAM2' }, + [0x1219B] = { unicodeslot=0x1219B, category='lo', description='CUNEIFORM SIGN KAM4' }, + [0x1219C] = { unicodeslot=0x1219C, category='lo', description='CUNEIFORM SIGN KASKAL' }, + [0x1219D] = { unicodeslot=0x1219D, category='lo', description='CUNEIFORM SIGN KASKAL LAGAB TIMES U OVER LAGAB TIMES U' }, + [0x1219E] = { unicodeslot=0x1219E, category='lo', description='CUNEIFORM SIGN KASKAL OVER KASKAL LAGAB TIMES U OVER LAGAB TIMES U' }, + [0x1219F] = { unicodeslot=0x1219F, category='lo', description='CUNEIFORM SIGN KESH2' }, + [0x121A0] = { unicodeslot=0x121A0, category='lo', description='CUNEIFORM SIGN KI' }, + [0x121A1] = { unicodeslot=0x121A1, category='lo', description='CUNEIFORM SIGN KI TIMES BAD' }, + [0x121A2] = { unicodeslot=0x121A2, category='lo', description='CUNEIFORM SIGN KI TIMES U' }, + [0x121A3] = { unicodeslot=0x121A3, category='lo', description='CUNEIFORM SIGN KI TIMES UD' }, + [0x121A4] = { unicodeslot=0x121A4, category='lo', description='CUNEIFORM SIGN KID' }, + [0x121A5] = { unicodeslot=0x121A5, category='lo', description='CUNEIFORM SIGN KIN' }, + [0x121A6] = { unicodeslot=0x121A6, category='lo', description='CUNEIFORM SIGN KISAL' }, + [0x121A7] = { unicodeslot=0x121A7, category='lo', description='CUNEIFORM SIGN KISH' }, + [0x121A8] = { unicodeslot=0x121A8, category='lo', description='CUNEIFORM SIGN KISIM5' }, + [0x121A9] = { unicodeslot=0x121A9, category='lo', description='CUNEIFORM SIGN KISIM5 OVER KISIM5' }, + [0x121AA] = { unicodeslot=0x121AA, category='lo', description='CUNEIFORM SIGN KU' }, + [0x121AB] = { unicodeslot=0x121AB, category='lo', description='CUNEIFORM SIGN KU OVER HI TIMES ASH2 KU OVER HI TIMES ASH2' }, + [0x121AC] = { unicodeslot=0x121AC, category='lo', description='CUNEIFORM SIGN KU3' }, + [0x121AD] = { unicodeslot=0x121AD, category='lo', description='CUNEIFORM SIGN KU4' }, + [0x121AE] = { unicodeslot=0x121AE, category='lo', description='CUNEIFORM SIGN KU4 VARIANT FORM' }, + [0x121AF] = { unicodeslot=0x121AF, category='lo', description='CUNEIFORM SIGN KU7' }, + [0x121B0] = { unicodeslot=0x121B0, category='lo', description='CUNEIFORM SIGN KUL' }, + [0x121B1] = { unicodeslot=0x121B1, category='lo', description='CUNEIFORM SIGN KUL GUNU' }, + [0x121B2] = { unicodeslot=0x121B2, category='lo', description='CUNEIFORM SIGN KUN' }, + [0x121B3] = { unicodeslot=0x121B3, category='lo', description='CUNEIFORM SIGN KUR' }, + [0x121B4] = { unicodeslot=0x121B4, category='lo', description='CUNEIFORM SIGN KUR OPPOSING KUR' }, + [0x121B5] = { unicodeslot=0x121B5, category='lo', description='CUNEIFORM SIGN KUSHU2' }, + [0x121B6] = { unicodeslot=0x121B6, category='lo', description='CUNEIFORM SIGN KWU318' }, + [0x121B7] = { unicodeslot=0x121B7, category='lo', description='CUNEIFORM SIGN LA' }, + [0x121B8] = { unicodeslot=0x121B8, category='lo', description='CUNEIFORM SIGN LAGAB' }, + [0x121B9] = { unicodeslot=0x121B9, category='lo', description='CUNEIFORM SIGN LAGAB TIMES A' }, + [0x121BA] = { unicodeslot=0x121BA, category='lo', description='CUNEIFORM SIGN LAGAB TIMES A PLUS DA PLUS HA' }, + [0x121BB] = { unicodeslot=0x121BB, category='lo', description='CUNEIFORM SIGN LAGAB TIMES A PLUS GAR' }, + [0x121BC] = { unicodeslot=0x121BC, category='lo', description='CUNEIFORM SIGN LAGAB TIMES A PLUS LAL' }, + [0x121BD] = { unicodeslot=0x121BD, category='lo', description='CUNEIFORM SIGN LAGAB TIMES AL' }, + [0x121BE] = { unicodeslot=0x121BE, category='lo', description='CUNEIFORM SIGN LAGAB TIMES AN' }, + [0x121BF] = { unicodeslot=0x121BF, category='lo', description='CUNEIFORM SIGN LAGAB TIMES ASH ZIDA TENU' }, + [0x121C0] = { unicodeslot=0x121C0, category='lo', description='CUNEIFORM SIGN LAGAB TIMES BAD' }, + [0x121C1] = { unicodeslot=0x121C1, category='lo', description='CUNEIFORM SIGN LAGAB TIMES BI' }, + [0x121C2] = { unicodeslot=0x121C2, category='lo', description='CUNEIFORM SIGN LAGAB TIMES DAR' }, + [0x121C3] = { unicodeslot=0x121C3, category='lo', description='CUNEIFORM SIGN LAGAB TIMES EN' }, + [0x121C4] = { unicodeslot=0x121C4, category='lo', description='CUNEIFORM SIGN LAGAB TIMES GA' }, + [0x121C5] = { unicodeslot=0x121C5, category='lo', description='CUNEIFORM SIGN LAGAB TIMES GAR' }, + [0x121C6] = { unicodeslot=0x121C6, category='lo', description='CUNEIFORM SIGN LAGAB TIMES GUD' }, + [0x121C7] = { unicodeslot=0x121C7, category='lo', description='CUNEIFORM SIGN LAGAB TIMES GUD PLUS GUD' }, + [0x121C8] = { unicodeslot=0x121C8, category='lo', description='CUNEIFORM SIGN LAGAB TIMES HA' }, + [0x121C9] = { unicodeslot=0x121C9, category='lo', description='CUNEIFORM SIGN LAGAB TIMES HAL' }, + [0x121CA] = { unicodeslot=0x121CA, category='lo', description='CUNEIFORM SIGN LAGAB TIMES HI TIMES NUN' }, + [0x121CB] = { unicodeslot=0x121CB, category='lo', description='CUNEIFORM SIGN LAGAB TIMES IGI GUNU' }, + [0x121CC] = { unicodeslot=0x121CC, category='lo', description='CUNEIFORM SIGN LAGAB TIMES IM' }, + [0x121CD] = { unicodeslot=0x121CD, category='lo', description='CUNEIFORM SIGN LAGAB TIMES IM PLUS HA' }, + [0x121CE] = { unicodeslot=0x121CE, category='lo', description='CUNEIFORM SIGN LAGAB TIMES IM PLUS LU' }, + [0x121CF] = { unicodeslot=0x121CF, category='lo', description='CUNEIFORM SIGN LAGAB TIMES KI' }, + [0x121D0] = { unicodeslot=0x121D0, category='lo', description='CUNEIFORM SIGN LAGAB TIMES KIN' }, + [0x121D1] = { unicodeslot=0x121D1, category='lo', description='CUNEIFORM SIGN LAGAB TIMES KU3' }, + [0x121D2] = { unicodeslot=0x121D2, category='lo', description='CUNEIFORM SIGN LAGAB TIMES KUL' }, + [0x121D3] = { unicodeslot=0x121D3, category='lo', description='CUNEIFORM SIGN LAGAB TIMES KUL PLUS HI PLUS A' }, + [0x121D4] = { unicodeslot=0x121D4, category='lo', description='CUNEIFORM SIGN LAGAB TIMES LAGAB' }, + [0x121D5] = { unicodeslot=0x121D5, category='lo', description='CUNEIFORM SIGN LAGAB TIMES LISH' }, + [0x121D6] = { unicodeslot=0x121D6, category='lo', description='CUNEIFORM SIGN LAGAB TIMES LU' }, + [0x121D7] = { unicodeslot=0x121D7, category='lo', description='CUNEIFORM SIGN LAGAB TIMES LUL' }, + [0x121D8] = { unicodeslot=0x121D8, category='lo', description='CUNEIFORM SIGN LAGAB TIMES ME' }, + [0x121D9] = { unicodeslot=0x121D9, category='lo', description='CUNEIFORM SIGN LAGAB TIMES ME PLUS EN' }, + [0x121DA] = { unicodeslot=0x121DA, category='lo', description='CUNEIFORM SIGN LAGAB TIMES MUSH' }, + [0x121DB] = { unicodeslot=0x121DB, category='lo', description='CUNEIFORM SIGN LAGAB TIMES NE' }, + [0x121DC] = { unicodeslot=0x121DC, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SHE PLUS SUM' }, + [0x121DD] = { unicodeslot=0x121DD, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH PLUS ERIN2' }, + [0x121DE] = { unicodeslot=0x121DE, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SHITA PLUS GISH TENU' }, + [0x121DF] = { unicodeslot=0x121DF, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SHU2' }, + [0x121E0] = { unicodeslot=0x121E0, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SHU2 PLUS SHU2' }, + [0x121E1] = { unicodeslot=0x121E1, category='lo', description='CUNEIFORM SIGN LAGAB TIMES SUM' }, + [0x121E2] = { unicodeslot=0x121E2, category='lo', description='CUNEIFORM SIGN LAGAB TIMES TAG' }, + [0x121E3] = { unicodeslot=0x121E3, category='lo', description='CUNEIFORM SIGN LAGAB TIMES TAK4' }, + [0x121E4] = { unicodeslot=0x121E4, category='lo', description='CUNEIFORM SIGN LAGAB TIMES TE PLUS A PLUS SU PLUS NA' }, + [0x121E5] = { unicodeslot=0x121E5, category='lo', description='CUNEIFORM SIGN LAGAB TIMES U' }, + [0x121E6] = { unicodeslot=0x121E6, category='lo', description='CUNEIFORM SIGN LAGAB TIMES U PLUS A' }, + [0x121E7] = { unicodeslot=0x121E7, category='lo', description='CUNEIFORM SIGN LAGAB TIMES U PLUS U PLUS U' }, + [0x121E8] = { unicodeslot=0x121E8, category='lo', description='CUNEIFORM SIGN LAGAB TIMES U2 PLUS ASH' }, + [0x121E9] = { unicodeslot=0x121E9, category='lo', description='CUNEIFORM SIGN LAGAB TIMES UD' }, + [0x121EA] = { unicodeslot=0x121EA, category='lo', description='CUNEIFORM SIGN LAGAB TIMES USH' }, + [0x121EB] = { unicodeslot=0x121EB, category='lo', description='CUNEIFORM SIGN LAGAB SQUARED' }, + [0x121EC] = { unicodeslot=0x121EC, category='lo', description='CUNEIFORM SIGN LAGAR' }, + [0x121ED] = { unicodeslot=0x121ED, category='lo', description='CUNEIFORM SIGN LAGAR TIMES SHE' }, + [0x121EE] = { unicodeslot=0x121EE, category='lo', description='CUNEIFORM SIGN LAGAR TIMES SHE PLUS SUM' }, + [0x121EF] = { unicodeslot=0x121EF, category='lo', description='CUNEIFORM SIGN LAGAR GUNU' }, + [0x121F0] = { unicodeslot=0x121F0, category='lo', description='CUNEIFORM SIGN LAGAR GUNU OVER LAGAR GUNU SHE' }, + [0x121F1] = { unicodeslot=0x121F1, category='lo', description='CUNEIFORM SIGN LAHSHU' }, + [0x121F2] = { unicodeslot=0x121F2, category='lo', description='CUNEIFORM SIGN LAL' }, + [0x121F3] = { unicodeslot=0x121F3, category='lo', description='CUNEIFORM SIGN LAL TIMES LAL' }, + [0x121F4] = { unicodeslot=0x121F4, category='lo', description='CUNEIFORM SIGN LAM' }, + [0x121F5] = { unicodeslot=0x121F5, category='lo', description='CUNEIFORM SIGN LAM TIMES KUR' }, + [0x121F6] = { unicodeslot=0x121F6, category='lo', description='CUNEIFORM SIGN LAM TIMES KUR PLUS RU' }, + [0x121F7] = { unicodeslot=0x121F7, category='lo', description='CUNEIFORM SIGN LI' }, + [0x121F8] = { unicodeslot=0x121F8, category='lo', description='CUNEIFORM SIGN LIL' }, + [0x121F9] = { unicodeslot=0x121F9, category='lo', description='CUNEIFORM SIGN LIMMU2' }, + [0x121FA] = { unicodeslot=0x121FA, category='lo', description='CUNEIFORM SIGN LISH' }, + [0x121FB] = { unicodeslot=0x121FB, category='lo', description='CUNEIFORM SIGN LU' }, + [0x121FC] = { unicodeslot=0x121FC, category='lo', description='CUNEIFORM SIGN LU TIMES BAD' }, + [0x121FD] = { unicodeslot=0x121FD, category='lo', description='CUNEIFORM SIGN LU2' }, + [0x121FE] = { unicodeslot=0x121FE, category='lo', description='CUNEIFORM SIGN LU2 TIMES AL' }, + [0x121FF] = { unicodeslot=0x121FF, category='lo', description='CUNEIFORM SIGN LU2 TIMES BAD' }, + [0x12200] = { unicodeslot=0x12200, category='lo', description='CUNEIFORM SIGN LU2 TIMES ESH2' }, + [0x12201] = { unicodeslot=0x12201, category='lo', description='CUNEIFORM SIGN LU2 TIMES ESH2 TENU' }, + [0x12202] = { unicodeslot=0x12202, category='lo', description='CUNEIFORM SIGN LU2 TIMES GAN2 TENU' }, + [0x12203] = { unicodeslot=0x12203, category='lo', description='CUNEIFORM SIGN LU2 TIMES HI TIMES BAD' }, + [0x12204] = { unicodeslot=0x12204, category='lo', description='CUNEIFORM SIGN LU2 TIMES IM' }, + [0x12205] = { unicodeslot=0x12205, category='lo', description='CUNEIFORM SIGN LU2 TIMES KAD2' }, + [0x12206] = { unicodeslot=0x12206, category='lo', description='CUNEIFORM SIGN LU2 TIMES KAD3' }, + [0x12207] = { unicodeslot=0x12207, category='lo', description='CUNEIFORM SIGN LU2 TIMES KAD3 PLUS ASH' }, + [0x12208] = { unicodeslot=0x12208, category='lo', description='CUNEIFORM SIGN LU2 TIMES KI' }, + [0x12209] = { unicodeslot=0x12209, category='lo', description='CUNEIFORM SIGN LU2 TIMES LA PLUS ASH' }, + [0x1220A] = { unicodeslot=0x1220A, category='lo', description='CUNEIFORM SIGN LU2 TIMES LAGAB' }, + [0x1220B] = { unicodeslot=0x1220B, category='lo', description='CUNEIFORM SIGN LU2 TIMES ME PLUS EN' }, + [0x1220C] = { unicodeslot=0x1220C, category='lo', description='CUNEIFORM SIGN LU2 TIMES NE' }, + [0x1220D] = { unicodeslot=0x1220D, category='lo', description='CUNEIFORM SIGN LU2 TIMES NU' }, + [0x1220E] = { unicodeslot=0x1220E, category='lo', description='CUNEIFORM SIGN LU2 TIMES SI PLUS ASH' }, + [0x1220F] = { unicodeslot=0x1220F, category='lo', description='CUNEIFORM SIGN LU2 TIMES SIK2 PLUS BU' }, + [0x12210] = { unicodeslot=0x12210, category='lo', description='CUNEIFORM SIGN LU2 TIMES TUG2' }, + [0x12211] = { unicodeslot=0x12211, category='lo', description='CUNEIFORM SIGN LU2 TENU' }, + [0x12212] = { unicodeslot=0x12212, category='lo', description='CUNEIFORM SIGN LU2 CROSSING LU2' }, + [0x12213] = { unicodeslot=0x12213, category='lo', description='CUNEIFORM SIGN LU2 OPPOSING LU2' }, + [0x12214] = { unicodeslot=0x12214, category='lo', description='CUNEIFORM SIGN LU2 SQUARED' }, + [0x12215] = { unicodeslot=0x12215, category='lo', description='CUNEIFORM SIGN LU2 SHESHIG' }, + [0x12216] = { unicodeslot=0x12216, category='lo', description='CUNEIFORM SIGN LU3' }, + [0x12217] = { unicodeslot=0x12217, category='lo', description='CUNEIFORM SIGN LUGAL' }, + [0x12218] = { unicodeslot=0x12218, category='lo', description='CUNEIFORM SIGN LUGAL OVER LUGAL' }, + [0x12219] = { unicodeslot=0x12219, category='lo', description='CUNEIFORM SIGN LUGAL OPPOSING LUGAL' }, + [0x1221A] = { unicodeslot=0x1221A, category='lo', description='CUNEIFORM SIGN LUGAL SHESHIG' }, + [0x1221B] = { unicodeslot=0x1221B, category='lo', description='CUNEIFORM SIGN LUH' }, + [0x1221C] = { unicodeslot=0x1221C, category='lo', description='CUNEIFORM SIGN LUL' }, + [0x1221D] = { unicodeslot=0x1221D, category='lo', description='CUNEIFORM SIGN LUM' }, + [0x1221E] = { unicodeslot=0x1221E, category='lo', description='CUNEIFORM SIGN LUM OVER LUM' }, + [0x1221F] = { unicodeslot=0x1221F, category='lo', description='CUNEIFORM SIGN LUM OVER LUM GAR OVER GAR' }, + [0x12220] = { unicodeslot=0x12220, category='lo', description='CUNEIFORM SIGN MA' }, + [0x12221] = { unicodeslot=0x12221, category='lo', description='CUNEIFORM SIGN MA TIMES TAK4' }, + [0x12222] = { unicodeslot=0x12222, category='lo', description='CUNEIFORM SIGN MA GUNU' }, + [0x12223] = { unicodeslot=0x12223, category='lo', description='CUNEIFORM SIGN MA2' }, + [0x12224] = { unicodeslot=0x12224, category='lo', description='CUNEIFORM SIGN MAH' }, + [0x12225] = { unicodeslot=0x12225, category='lo', description='CUNEIFORM SIGN MAR' }, + [0x12226] = { unicodeslot=0x12226, category='lo', description='CUNEIFORM SIGN MASH' }, + [0x12227] = { unicodeslot=0x12227, category='lo', description='CUNEIFORM SIGN MASH2' }, + [0x12228] = { unicodeslot=0x12228, category='lo', description='CUNEIFORM SIGN ME' }, + [0x12229] = { unicodeslot=0x12229, category='lo', description='CUNEIFORM SIGN MES' }, + [0x1222A] = { unicodeslot=0x1222A, category='lo', description='CUNEIFORM SIGN MI' }, + [0x1222B] = { unicodeslot=0x1222B, category='lo', description='CUNEIFORM SIGN MIN' }, + [0x1222C] = { unicodeslot=0x1222C, category='lo', description='CUNEIFORM SIGN MU' }, + [0x1222D] = { unicodeslot=0x1222D, category='lo', description='CUNEIFORM SIGN MU OVER MU' }, + [0x1222E] = { unicodeslot=0x1222E, category='lo', description='CUNEIFORM SIGN MUG' }, + [0x1222F] = { unicodeslot=0x1222F, category='lo', description='CUNEIFORM SIGN MUG GUNU' }, + [0x12230] = { unicodeslot=0x12230, category='lo', description='CUNEIFORM SIGN MUNSUB' }, + [0x12231] = { unicodeslot=0x12231, category='lo', description='CUNEIFORM SIGN MURGU2' }, + [0x12232] = { unicodeslot=0x12232, category='lo', description='CUNEIFORM SIGN MUSH' }, + [0x12233] = { unicodeslot=0x12233, category='lo', description='CUNEIFORM SIGN MUSH TIMES A' }, + [0x12234] = { unicodeslot=0x12234, category='lo', description='CUNEIFORM SIGN MUSH TIMES KUR' }, + [0x12235] = { unicodeslot=0x12235, category='lo', description='CUNEIFORM SIGN MUSH TIMES ZA' }, + [0x12236] = { unicodeslot=0x12236, category='lo', description='CUNEIFORM SIGN MUSH OVER MUSH' }, + [0x12237] = { unicodeslot=0x12237, category='lo', description='CUNEIFORM SIGN MUSH OVER MUSH TIMES A PLUS NA' }, + [0x12238] = { unicodeslot=0x12238, category='lo', description='CUNEIFORM SIGN MUSH CROSSING MUSH' }, + [0x12239] = { unicodeslot=0x12239, category='lo', description='CUNEIFORM SIGN MUSH3' }, + [0x1223A] = { unicodeslot=0x1223A, category='lo', description='CUNEIFORM SIGN MUSH3 TIMES A' }, + [0x1223B] = { unicodeslot=0x1223B, category='lo', description='CUNEIFORM SIGN MUSH3 TIMES A PLUS DI' }, + [0x1223C] = { unicodeslot=0x1223C, category='lo', description='CUNEIFORM SIGN MUSH3 TIMES DI' }, + [0x1223D] = { unicodeslot=0x1223D, category='lo', description='CUNEIFORM SIGN MUSH3 GUNU' }, + [0x1223E] = { unicodeslot=0x1223E, category='lo', description='CUNEIFORM SIGN NA' }, + [0x1223F] = { unicodeslot=0x1223F, category='lo', description='CUNEIFORM SIGN NA2' }, + [0x12240] = { unicodeslot=0x12240, category='lo', description='CUNEIFORM SIGN NAGA' }, + [0x12241] = { unicodeslot=0x12241, category='lo', description='CUNEIFORM SIGN NAGA INVERTED' }, + [0x12242] = { unicodeslot=0x12242, category='lo', description='CUNEIFORM SIGN NAGA TIMES SHU TENU' }, + [0x12243] = { unicodeslot=0x12243, category='lo', description='CUNEIFORM SIGN NAGA OPPOSING NAGA' }, + [0x12244] = { unicodeslot=0x12244, category='lo', description='CUNEIFORM SIGN NAGAR' }, + [0x12245] = { unicodeslot=0x12245, category='lo', description='CUNEIFORM SIGN NAM NUTILLU' }, + [0x12246] = { unicodeslot=0x12246, category='lo', description='CUNEIFORM SIGN NAM' }, + [0x12247] = { unicodeslot=0x12247, category='lo', description='CUNEIFORM SIGN NAM2' }, + [0x12248] = { unicodeslot=0x12248, category='lo', description='CUNEIFORM SIGN NE' }, + [0x12249] = { unicodeslot=0x12249, category='lo', description='CUNEIFORM SIGN NE TIMES A' }, + [0x1224A] = { unicodeslot=0x1224A, category='lo', description='CUNEIFORM SIGN NE TIMES UD' }, + [0x1224B] = { unicodeslot=0x1224B, category='lo', description='CUNEIFORM SIGN NE SHESHIG' }, + [0x1224C] = { unicodeslot=0x1224C, category='lo', description='CUNEIFORM SIGN NI' }, + [0x1224D] = { unicodeslot=0x1224D, category='lo', description='CUNEIFORM SIGN NI TIMES E' }, + [0x1224E] = { unicodeslot=0x1224E, category='lo', description='CUNEIFORM SIGN NI2' }, + [0x1224F] = { unicodeslot=0x1224F, category='lo', description='CUNEIFORM SIGN NIM' }, + [0x12250] = { unicodeslot=0x12250, category='lo', description='CUNEIFORM SIGN NIM TIMES GAN2 TENU' }, + [0x12251] = { unicodeslot=0x12251, category='lo', description='CUNEIFORM SIGN NIM TIMES GAR PLUS GAN2 TENU' }, + [0x12252] = { unicodeslot=0x12252, category='lo', description='CUNEIFORM SIGN NINDA2' }, + [0x12253] = { unicodeslot=0x12253, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES AN' }, + [0x12254] = { unicodeslot=0x12254, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES ASH' }, + [0x12255] = { unicodeslot=0x12255, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES ASH PLUS ASH' }, + [0x12256] = { unicodeslot=0x12256, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES GUD' }, + [0x12257] = { unicodeslot=0x12257, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES ME PLUS GAN2 TENU' }, + [0x12258] = { unicodeslot=0x12258, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES NE' }, + [0x12259] = { unicodeslot=0x12259, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES NUN' }, + [0x1225A] = { unicodeslot=0x1225A, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES SHE' }, + [0x1225B] = { unicodeslot=0x1225B, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES SHE PLUS A AN' }, + [0x1225C] = { unicodeslot=0x1225C, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH' }, + [0x1225D] = { unicodeslot=0x1225D, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES SHE PLUS ASH PLUS ASH' }, + [0x1225E] = { unicodeslot=0x1225E, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES U2 PLUS ASH' }, + [0x1225F] = { unicodeslot=0x1225F, category='lo', description='CUNEIFORM SIGN NINDA2 TIMES USH' }, + [0x12260] = { unicodeslot=0x12260, category='lo', description='CUNEIFORM SIGN NISAG' }, + [0x12261] = { unicodeslot=0x12261, category='lo', description='CUNEIFORM SIGN NU' }, + [0x12262] = { unicodeslot=0x12262, category='lo', description='CUNEIFORM SIGN NU11' }, + [0x12263] = { unicodeslot=0x12263, category='lo', description='CUNEIFORM SIGN NUN' }, + [0x12264] = { unicodeslot=0x12264, category='lo', description='CUNEIFORM SIGN NUN LAGAR TIMES GAR' }, + [0x12265] = { unicodeslot=0x12265, category='lo', description='CUNEIFORM SIGN NUN LAGAR TIMES MASH' }, + [0x12266] = { unicodeslot=0x12266, category='lo', description='CUNEIFORM SIGN NUN LAGAR TIMES SAL' }, + [0x12267] = { unicodeslot=0x12267, category='lo', description='CUNEIFORM SIGN NUN LAGAR TIMES SAL OVER NUN LAGAR TIMES SAL' }, + [0x12268] = { unicodeslot=0x12268, category='lo', description='CUNEIFORM SIGN NUN LAGAR TIMES USH' }, + [0x12269] = { unicodeslot=0x12269, category='lo', description='CUNEIFORM SIGN NUN TENU' }, + [0x1226A] = { unicodeslot=0x1226A, category='lo', description='CUNEIFORM SIGN NUN OVER NUN' }, + [0x1226B] = { unicodeslot=0x1226B, category='lo', description='CUNEIFORM SIGN NUN CROSSING NUN' }, + [0x1226C] = { unicodeslot=0x1226C, category='lo', description='CUNEIFORM SIGN NUN CROSSING NUN LAGAR OVER LAGAR' }, + [0x1226D] = { unicodeslot=0x1226D, category='lo', description='CUNEIFORM SIGN NUNUZ' }, + [0x1226E] = { unicodeslot=0x1226E, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES ASHGAB' }, + [0x1226F] = { unicodeslot=0x1226F, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES BI' }, + [0x12270] = { unicodeslot=0x12270, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES DUG' }, + [0x12271] = { unicodeslot=0x12271, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES GUD' }, + [0x12272] = { unicodeslot=0x12272, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES IGI GUNU' }, + [0x12273] = { unicodeslot=0x12273, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES KAD3' }, + [0x12274] = { unicodeslot=0x12274, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES LA' }, + [0x12275] = { unicodeslot=0x12275, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES NE' }, + [0x12276] = { unicodeslot=0x12276, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES SILA3' }, + [0x12277] = { unicodeslot=0x12277, category='lo', description='CUNEIFORM SIGN NUNUZ AB2 TIMES U2' }, + [0x12278] = { unicodeslot=0x12278, category='lo', description='CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI' }, + [0x12279] = { unicodeslot=0x12279, category='lo', description='CUNEIFORM SIGN NUNUZ KISIM5 TIMES BI U' }, + [0x1227A] = { unicodeslot=0x1227A, category='lo', description='CUNEIFORM SIGN PA' }, + [0x1227B] = { unicodeslot=0x1227B, category='lo', description='CUNEIFORM SIGN PAD' }, + [0x1227C] = { unicodeslot=0x1227C, category='lo', description='CUNEIFORM SIGN PAN' }, + [0x1227D] = { unicodeslot=0x1227D, category='lo', description='CUNEIFORM SIGN PAP' }, + [0x1227E] = { unicodeslot=0x1227E, category='lo', description='CUNEIFORM SIGN PESH2' }, + [0x1227F] = { unicodeslot=0x1227F, category='lo', description='CUNEIFORM SIGN PI' }, + [0x12280] = { unicodeslot=0x12280, category='lo', description='CUNEIFORM SIGN PI TIMES A' }, + [0x12281] = { unicodeslot=0x12281, category='lo', description='CUNEIFORM SIGN PI TIMES AB' }, + [0x12282] = { unicodeslot=0x12282, category='lo', description='CUNEIFORM SIGN PI TIMES BI' }, + [0x12283] = { unicodeslot=0x12283, category='lo', description='CUNEIFORM SIGN PI TIMES BU' }, + [0x12284] = { unicodeslot=0x12284, category='lo', description='CUNEIFORM SIGN PI TIMES E' }, + [0x12285] = { unicodeslot=0x12285, category='lo', description='CUNEIFORM SIGN PI TIMES I' }, + [0x12286] = { unicodeslot=0x12286, category='lo', description='CUNEIFORM SIGN PI TIMES IB' }, + [0x12287] = { unicodeslot=0x12287, category='lo', description='CUNEIFORM SIGN PI TIMES U' }, + [0x12288] = { unicodeslot=0x12288, category='lo', description='CUNEIFORM SIGN PI TIMES U2' }, + [0x12289] = { unicodeslot=0x12289, category='lo', description='CUNEIFORM SIGN PI CROSSING PI' }, + [0x1228A] = { unicodeslot=0x1228A, category='lo', description='CUNEIFORM SIGN PIRIG' }, + [0x1228B] = { unicodeslot=0x1228B, category='lo', description='CUNEIFORM SIGN PIRIG TIMES KAL' }, + [0x1228C] = { unicodeslot=0x1228C, category='lo', description='CUNEIFORM SIGN PIRIG TIMES UD' }, + [0x1228D] = { unicodeslot=0x1228D, category='lo', description='CUNEIFORM SIGN PIRIG TIMES ZA' }, + [0x1228E] = { unicodeslot=0x1228E, category='lo', description='CUNEIFORM SIGN PIRIG OPPOSING PIRIG' }, + [0x1228F] = { unicodeslot=0x1228F, category='lo', description='CUNEIFORM SIGN RA' }, + [0x12290] = { unicodeslot=0x12290, category='lo', description='CUNEIFORM SIGN RAB' }, + [0x12291] = { unicodeslot=0x12291, category='lo', description='CUNEIFORM SIGN RI' }, + [0x12292] = { unicodeslot=0x12292, category='lo', description='CUNEIFORM SIGN RU' }, + [0x12293] = { unicodeslot=0x12293, category='lo', description='CUNEIFORM SIGN SA' }, + [0x12294] = { unicodeslot=0x12294, category='lo', description='CUNEIFORM SIGN SAG NUTILLU' }, + [0x12295] = { unicodeslot=0x12295, category='lo', description='CUNEIFORM SIGN SAG' }, + [0x12296] = { unicodeslot=0x12296, category='lo', description='CUNEIFORM SIGN SAG TIMES A' }, + [0x12297] = { unicodeslot=0x12297, category='lo', description='CUNEIFORM SIGN SAG TIMES DU' }, + [0x12298] = { unicodeslot=0x12298, category='lo', description='CUNEIFORM SIGN SAG TIMES DUB' }, + [0x12299] = { unicodeslot=0x12299, category='lo', description='CUNEIFORM SIGN SAG TIMES HA' }, + [0x1229A] = { unicodeslot=0x1229A, category='lo', description='CUNEIFORM SIGN SAG TIMES KAK' }, + [0x1229B] = { unicodeslot=0x1229B, category='lo', description='CUNEIFORM SIGN SAG TIMES KUR' }, + [0x1229C] = { unicodeslot=0x1229C, category='lo', description='CUNEIFORM SIGN SAG TIMES LUM' }, + [0x1229D] = { unicodeslot=0x1229D, category='lo', description='CUNEIFORM SIGN SAG TIMES MI' }, + [0x1229E] = { unicodeslot=0x1229E, category='lo', description='CUNEIFORM SIGN SAG TIMES NUN' }, + [0x1229F] = { unicodeslot=0x1229F, category='lo', description='CUNEIFORM SIGN SAG TIMES SAL' }, + [0x122A0] = { unicodeslot=0x122A0, category='lo', description='CUNEIFORM SIGN SAG TIMES SHID' }, + [0x122A1] = { unicodeslot=0x122A1, category='lo', description='CUNEIFORM SIGN SAG TIMES TAB' }, + [0x122A2] = { unicodeslot=0x122A2, category='lo', description='CUNEIFORM SIGN SAG TIMES U2' }, + [0x122A3] = { unicodeslot=0x122A3, category='lo', description='CUNEIFORM SIGN SAG TIMES UB' }, + [0x122A4] = { unicodeslot=0x122A4, category='lo', description='CUNEIFORM SIGN SAG TIMES UM' }, + [0x122A5] = { unicodeslot=0x122A5, category='lo', description='CUNEIFORM SIGN SAG TIMES UR' }, + [0x122A6] = { unicodeslot=0x122A6, category='lo', description='CUNEIFORM SIGN SAG TIMES USH' }, + [0x122A7] = { unicodeslot=0x122A7, category='lo', description='CUNEIFORM SIGN SAG OVER SAG' }, + [0x122A8] = { unicodeslot=0x122A8, category='lo', description='CUNEIFORM SIGN SAG GUNU' }, + [0x122A9] = { unicodeslot=0x122A9, category='lo', description='CUNEIFORM SIGN SAL' }, + [0x122AA] = { unicodeslot=0x122AA, category='lo', description='CUNEIFORM SIGN SAL LAGAB TIMES ASH2' }, + [0x122AB] = { unicodeslot=0x122AB, category='lo', description='CUNEIFORM SIGN SANGA2' }, + [0x122AC] = { unicodeslot=0x122AC, category='lo', description='CUNEIFORM SIGN SAR' }, + [0x122AD] = { unicodeslot=0x122AD, category='lo', description='CUNEIFORM SIGN SHA' }, + [0x122AE] = { unicodeslot=0x122AE, category='lo', description='CUNEIFORM SIGN SHA3' }, + [0x122AF] = { unicodeslot=0x122AF, category='lo', description='CUNEIFORM SIGN SHA3 TIMES A' }, + [0x122B0] = { unicodeslot=0x122B0, category='lo', description='CUNEIFORM SIGN SHA3 TIMES BAD' }, + [0x122B1] = { unicodeslot=0x122B1, category='lo', description='CUNEIFORM SIGN SHA3 TIMES GISH' }, + [0x122B2] = { unicodeslot=0x122B2, category='lo', description='CUNEIFORM SIGN SHA3 TIMES NE' }, + [0x122B3] = { unicodeslot=0x122B3, category='lo', description='CUNEIFORM SIGN SHA3 TIMES SHU2' }, + [0x122B4] = { unicodeslot=0x122B4, category='lo', description='CUNEIFORM SIGN SHA3 TIMES TUR' }, + [0x122B5] = { unicodeslot=0x122B5, category='lo', description='CUNEIFORM SIGN SHA3 TIMES U' }, + [0x122B6] = { unicodeslot=0x122B6, category='lo', description='CUNEIFORM SIGN SHA3 TIMES U PLUS A' }, + [0x122B7] = { unicodeslot=0x122B7, category='lo', description='CUNEIFORM SIGN SHA6' }, + [0x122B8] = { unicodeslot=0x122B8, category='lo', description='CUNEIFORM SIGN SHAB6' }, + [0x122B9] = { unicodeslot=0x122B9, category='lo', description='CUNEIFORM SIGN SHAR2' }, + [0x122BA] = { unicodeslot=0x122BA, category='lo', description='CUNEIFORM SIGN SHE' }, + [0x122BB] = { unicodeslot=0x122BB, category='lo', description='CUNEIFORM SIGN SHE HU' }, + [0x122BC] = { unicodeslot=0x122BC, category='lo', description='CUNEIFORM SIGN SHE OVER SHE GAD OVER GAD GAR OVER GAR' }, + [0x122BD] = { unicodeslot=0x122BD, category='lo', description='CUNEIFORM SIGN SHE OVER SHE TAB OVER TAB GAR OVER GAR' }, + [0x122BE] = { unicodeslot=0x122BE, category='lo', description='CUNEIFORM SIGN SHEG9' }, + [0x122BF] = { unicodeslot=0x122BF, category='lo', description='CUNEIFORM SIGN SHEN' }, + [0x122C0] = { unicodeslot=0x122C0, category='lo', description='CUNEIFORM SIGN SHESH' }, + [0x122C1] = { unicodeslot=0x122C1, category='lo', description='CUNEIFORM SIGN SHESH2' }, + [0x122C2] = { unicodeslot=0x122C2, category='lo', description='CUNEIFORM SIGN SHESHLAM' }, + [0x122C3] = { unicodeslot=0x122C3, category='lo', description='CUNEIFORM SIGN SHID' }, + [0x122C4] = { unicodeslot=0x122C4, category='lo', description='CUNEIFORM SIGN SHID TIMES A' }, + [0x122C5] = { unicodeslot=0x122C5, category='lo', description='CUNEIFORM SIGN SHID TIMES IM' }, + [0x122C6] = { unicodeslot=0x122C6, category='lo', description='CUNEIFORM SIGN SHIM' }, + [0x122C7] = { unicodeslot=0x122C7, category='lo', description='CUNEIFORM SIGN SHIM TIMES A' }, + [0x122C8] = { unicodeslot=0x122C8, category='lo', description='CUNEIFORM SIGN SHIM TIMES BAL' }, + [0x122C9] = { unicodeslot=0x122C9, category='lo', description='CUNEIFORM SIGN SHIM TIMES BULUG' }, + [0x122CA] = { unicodeslot=0x122CA, category='lo', description='CUNEIFORM SIGN SHIM TIMES DIN' }, + [0x122CB] = { unicodeslot=0x122CB, category='lo', description='CUNEIFORM SIGN SHIM TIMES GAR' }, + [0x122CC] = { unicodeslot=0x122CC, category='lo', description='CUNEIFORM SIGN SHIM TIMES IGI' }, + [0x122CD] = { unicodeslot=0x122CD, category='lo', description='CUNEIFORM SIGN SHIM TIMES IGI GUNU' }, + [0x122CE] = { unicodeslot=0x122CE, category='lo', description='CUNEIFORM SIGN SHIM TIMES KUSHU2' }, + [0x122CF] = { unicodeslot=0x122CF, category='lo', description='CUNEIFORM SIGN SHIM TIMES LUL' }, + [0x122D0] = { unicodeslot=0x122D0, category='lo', description='CUNEIFORM SIGN SHIM TIMES MUG' }, + [0x122D1] = { unicodeslot=0x122D1, category='lo', description='CUNEIFORM SIGN SHIM TIMES SAL' }, + [0x122D2] = { unicodeslot=0x122D2, category='lo', description='CUNEIFORM SIGN SHINIG' }, + [0x122D3] = { unicodeslot=0x122D3, category='lo', description='CUNEIFORM SIGN SHIR' }, + [0x122D4] = { unicodeslot=0x122D4, category='lo', description='CUNEIFORM SIGN SHIR TENU' }, + [0x122D5] = { unicodeslot=0x122D5, category='lo', description='CUNEIFORM SIGN SHIR OVER SHIR BUR OVER BUR' }, + [0x122D6] = { unicodeslot=0x122D6, category='lo', description='CUNEIFORM SIGN SHITA' }, + [0x122D7] = { unicodeslot=0x122D7, category='lo', description='CUNEIFORM SIGN SHU' }, + [0x122D8] = { unicodeslot=0x122D8, category='lo', description='CUNEIFORM SIGN SHU OVER INVERTED SHU' }, + [0x122D9] = { unicodeslot=0x122D9, category='lo', description='CUNEIFORM SIGN SHU2' }, + [0x122DA] = { unicodeslot=0x122DA, category='lo', description='CUNEIFORM SIGN SHUBUR' }, + [0x122DB] = { unicodeslot=0x122DB, category='lo', description='CUNEIFORM SIGN SI' }, + [0x122DC] = { unicodeslot=0x122DC, category='lo', description='CUNEIFORM SIGN SI GUNU' }, + [0x122DD] = { unicodeslot=0x122DD, category='lo', description='CUNEIFORM SIGN SIG' }, + [0x122DE] = { unicodeslot=0x122DE, category='lo', description='CUNEIFORM SIGN SIG4' }, + [0x122DF] = { unicodeslot=0x122DF, category='lo', description='CUNEIFORM SIGN SIG4 OVER SIG4 SHU2' }, + [0x122E0] = { unicodeslot=0x122E0, category='lo', description='CUNEIFORM SIGN SIK2' }, + [0x122E1] = { unicodeslot=0x122E1, category='lo', description='CUNEIFORM SIGN SILA3' }, + [0x122E2] = { unicodeslot=0x122E2, category='lo', description='CUNEIFORM SIGN SU' }, + [0x122E3] = { unicodeslot=0x122E3, category='lo', description='CUNEIFORM SIGN SU OVER SU' }, + [0x122E4] = { unicodeslot=0x122E4, category='lo', description='CUNEIFORM SIGN SUD' }, + [0x122E5] = { unicodeslot=0x122E5, category='lo', description='CUNEIFORM SIGN SUD2' }, + [0x122E6] = { unicodeslot=0x122E6, category='lo', description='CUNEIFORM SIGN SUHUR' }, + [0x122E7] = { unicodeslot=0x122E7, category='lo', description='CUNEIFORM SIGN SUM' }, + [0x122E8] = { unicodeslot=0x122E8, category='lo', description='CUNEIFORM SIGN SUMASH' }, + [0x122E9] = { unicodeslot=0x122E9, category='lo', description='CUNEIFORM SIGN SUR' }, + [0x122EA] = { unicodeslot=0x122EA, category='lo', description='CUNEIFORM SIGN SUR9' }, + [0x122EB] = { unicodeslot=0x122EB, category='lo', description='CUNEIFORM SIGN TA' }, + [0x122EC] = { unicodeslot=0x122EC, category='lo', description='CUNEIFORM SIGN TA ASTERISK' }, + [0x122ED] = { unicodeslot=0x122ED, category='lo', description='CUNEIFORM SIGN TA TIMES HI' }, + [0x122EE] = { unicodeslot=0x122EE, category='lo', description='CUNEIFORM SIGN TA TIMES MI' }, + [0x122EF] = { unicodeslot=0x122EF, category='lo', description='CUNEIFORM SIGN TA GUNU' }, + [0x122F0] = { unicodeslot=0x122F0, category='lo', description='CUNEIFORM SIGN TAB' }, + [0x122F1] = { unicodeslot=0x122F1, category='lo', description='CUNEIFORM SIGN TAB OVER TAB NI OVER NI DISH OVER DISH' }, + [0x122F2] = { unicodeslot=0x122F2, category='lo', description='CUNEIFORM SIGN TAB SQUARED' }, + [0x122F3] = { unicodeslot=0x122F3, category='lo', description='CUNEIFORM SIGN TAG' }, + [0x122F4] = { unicodeslot=0x122F4, category='lo', description='CUNEIFORM SIGN TAG TIMES BI' }, + [0x122F5] = { unicodeslot=0x122F5, category='lo', description='CUNEIFORM SIGN TAG TIMES GUD' }, + [0x122F6] = { unicodeslot=0x122F6, category='lo', description='CUNEIFORM SIGN TAG TIMES SHE' }, + [0x122F7] = { unicodeslot=0x122F7, category='lo', description='CUNEIFORM SIGN TAG TIMES SHU' }, + [0x122F8] = { unicodeslot=0x122F8, category='lo', description='CUNEIFORM SIGN TAG TIMES TUG2' }, + [0x122F9] = { unicodeslot=0x122F9, category='lo', description='CUNEIFORM SIGN TAG TIMES UD' }, + [0x122FA] = { unicodeslot=0x122FA, category='lo', description='CUNEIFORM SIGN TAK4' }, + [0x122FB] = { unicodeslot=0x122FB, category='lo', description='CUNEIFORM SIGN TAR' }, + [0x122FC] = { unicodeslot=0x122FC, category='lo', description='CUNEIFORM SIGN TE' }, + [0x122FD] = { unicodeslot=0x122FD, category='lo', description='CUNEIFORM SIGN TE GUNU' }, + [0x122FE] = { unicodeslot=0x122FE, category='lo', description='CUNEIFORM SIGN TI' }, + [0x122FF] = { unicodeslot=0x122FF, category='lo', description='CUNEIFORM SIGN TI TENU' }, + [0x12300] = { unicodeslot=0x12300, category='lo', description='CUNEIFORM SIGN TIL' }, + [0x12301] = { unicodeslot=0x12301, category='lo', description='CUNEIFORM SIGN TIR' }, + [0x12302] = { unicodeslot=0x12302, category='lo', description='CUNEIFORM SIGN TIR TIMES TAK4' }, + [0x12303] = { unicodeslot=0x12303, category='lo', description='CUNEIFORM SIGN TIR OVER TIR' }, + [0x12304] = { unicodeslot=0x12304, category='lo', description='CUNEIFORM SIGN TIR OVER TIR GAD OVER GAD GAR OVER GAR' }, + [0x12305] = { unicodeslot=0x12305, category='lo', description='CUNEIFORM SIGN TU' }, + [0x12306] = { unicodeslot=0x12306, category='lo', description='CUNEIFORM SIGN TUG2' }, + [0x12307] = { unicodeslot=0x12307, category='lo', description='CUNEIFORM SIGN TUK' }, + [0x12308] = { unicodeslot=0x12308, category='lo', description='CUNEIFORM SIGN TUM' }, + [0x12309] = { unicodeslot=0x12309, category='lo', description='CUNEIFORM SIGN TUR' }, + [0x1230A] = { unicodeslot=0x1230A, category='lo', description='CUNEIFORM SIGN TUR OVER TUR ZA OVER ZA' }, + [0x1230B] = { unicodeslot=0x1230B, category='lo', description='CUNEIFORM SIGN U' }, + [0x1230C] = { unicodeslot=0x1230C, category='lo', description='CUNEIFORM SIGN U GUD' }, + [0x1230D] = { unicodeslot=0x1230D, category='lo', description='CUNEIFORM SIGN U U U' }, + [0x1230E] = { unicodeslot=0x1230E, category='lo', description='CUNEIFORM SIGN U OVER U PA OVER PA GAR OVER GAR' }, + [0x1230F] = { unicodeslot=0x1230F, category='lo', description='CUNEIFORM SIGN U OVER U SUR OVER SUR' }, + [0x12310] = { unicodeslot=0x12310, category='lo', description='CUNEIFORM SIGN U OVER U U REVERSED OVER U REVERSED' }, + [0x12311] = { unicodeslot=0x12311, category='lo', description='CUNEIFORM SIGN U2' }, + [0x12312] = { unicodeslot=0x12312, category='lo', description='CUNEIFORM SIGN UB' }, + [0x12313] = { unicodeslot=0x12313, category='lo', description='CUNEIFORM SIGN UD' }, + [0x12314] = { unicodeslot=0x12314, category='lo', description='CUNEIFORM SIGN UD KUSHU2' }, + [0x12315] = { unicodeslot=0x12315, category='lo', description='CUNEIFORM SIGN UD TIMES BAD' }, + [0x12316] = { unicodeslot=0x12316, category='lo', description='CUNEIFORM SIGN UD TIMES MI' }, + [0x12317] = { unicodeslot=0x12317, category='lo', description='CUNEIFORM SIGN UD TIMES U PLUS U PLUS U' }, + [0x12318] = { unicodeslot=0x12318, category='lo', description='CUNEIFORM SIGN UD TIMES U PLUS U PLUS U GUNU' }, + [0x12319] = { unicodeslot=0x12319, category='lo', description='CUNEIFORM SIGN UD GUNU' }, + [0x1231A] = { unicodeslot=0x1231A, category='lo', description='CUNEIFORM SIGN UD SHESHIG' }, + [0x1231B] = { unicodeslot=0x1231B, category='lo', description='CUNEIFORM SIGN UD SHESHIG TIMES BAD' }, + [0x1231C] = { unicodeslot=0x1231C, category='lo', description='CUNEIFORM SIGN UDUG' }, + [0x1231D] = { unicodeslot=0x1231D, category='lo', description='CUNEIFORM SIGN UM' }, + [0x1231E] = { unicodeslot=0x1231E, category='lo', description='CUNEIFORM SIGN UM TIMES LAGAB' }, + [0x1231F] = { unicodeslot=0x1231F, category='lo', description='CUNEIFORM SIGN UM TIMES ME PLUS DA' }, + [0x12320] = { unicodeslot=0x12320, category='lo', description='CUNEIFORM SIGN UM TIMES SHA3' }, + [0x12321] = { unicodeslot=0x12321, category='lo', description='CUNEIFORM SIGN UM TIMES U' }, + [0x12322] = { unicodeslot=0x12322, category='lo', description='CUNEIFORM SIGN UMBIN' }, + [0x12323] = { unicodeslot=0x12323, category='lo', description='CUNEIFORM SIGN UMUM' }, + [0x12324] = { unicodeslot=0x12324, category='lo', description='CUNEIFORM SIGN UMUM TIMES KASKAL' }, + [0x12325] = { unicodeslot=0x12325, category='lo', description='CUNEIFORM SIGN UMUM TIMES PA' }, + [0x12326] = { unicodeslot=0x12326, category='lo', description='CUNEIFORM SIGN UN' }, + [0x12327] = { unicodeslot=0x12327, category='lo', description='CUNEIFORM SIGN UN GUNU' }, + [0x12328] = { unicodeslot=0x12328, category='lo', description='CUNEIFORM SIGN UR' }, + [0x12329] = { unicodeslot=0x12329, category='lo', description='CUNEIFORM SIGN UR CROSSING UR' }, + [0x1232A] = { unicodeslot=0x1232A, category='lo', description='CUNEIFORM SIGN UR SHESHIG' }, + [0x1232B] = { unicodeslot=0x1232B, category='lo', description='CUNEIFORM SIGN UR2' }, + [0x1232C] = { unicodeslot=0x1232C, category='lo', description='CUNEIFORM SIGN UR2 TIMES A PLUS HA' }, + [0x1232D] = { unicodeslot=0x1232D, category='lo', description='CUNEIFORM SIGN UR2 TIMES A PLUS NA' }, + [0x1232E] = { unicodeslot=0x1232E, category='lo', description='CUNEIFORM SIGN UR2 TIMES AL' }, + [0x1232F] = { unicodeslot=0x1232F, category='lo', description='CUNEIFORM SIGN UR2 TIMES HA' }, + [0x12330] = { unicodeslot=0x12330, category='lo', description='CUNEIFORM SIGN UR2 TIMES NUN' }, + [0x12331] = { unicodeslot=0x12331, category='lo', description='CUNEIFORM SIGN UR2 TIMES U2' }, + [0x12332] = { unicodeslot=0x12332, category='lo', description='CUNEIFORM SIGN UR2 TIMES U2 PLUS ASH' }, + [0x12333] = { unicodeslot=0x12333, category='lo', description='CUNEIFORM SIGN UR2 TIMES U2 PLUS BI' }, + [0x12334] = { unicodeslot=0x12334, category='lo', description='CUNEIFORM SIGN UR4' }, + [0x12335] = { unicodeslot=0x12335, category='lo', description='CUNEIFORM SIGN URI' }, + [0x12336] = { unicodeslot=0x12336, category='lo', description='CUNEIFORM SIGN URI3' }, + [0x12337] = { unicodeslot=0x12337, category='lo', description='CUNEIFORM SIGN URU' }, + [0x12338] = { unicodeslot=0x12338, category='lo', description='CUNEIFORM SIGN URU TIMES A' }, + [0x12339] = { unicodeslot=0x12339, category='lo', description='CUNEIFORM SIGN URU TIMES ASHGAB' }, + [0x1233A] = { unicodeslot=0x1233A, category='lo', description='CUNEIFORM SIGN URU TIMES BAR' }, + [0x1233B] = { unicodeslot=0x1233B, category='lo', description='CUNEIFORM SIGN URU TIMES DUN' }, + [0x1233C] = { unicodeslot=0x1233C, category='lo', description='CUNEIFORM SIGN URU TIMES GA' }, + [0x1233D] = { unicodeslot=0x1233D, category='lo', description='CUNEIFORM SIGN URU TIMES GAL' }, + [0x1233E] = { unicodeslot=0x1233E, category='lo', description='CUNEIFORM SIGN URU TIMES GAN2 TENU' }, + [0x1233F] = { unicodeslot=0x1233F, category='lo', description='CUNEIFORM SIGN URU TIMES GAR' }, + [0x12340] = { unicodeslot=0x12340, category='lo', description='CUNEIFORM SIGN URU TIMES GU' }, + [0x12341] = { unicodeslot=0x12341, category='lo', description='CUNEIFORM SIGN URU TIMES HA' }, + [0x12342] = { unicodeslot=0x12342, category='lo', description='CUNEIFORM SIGN URU TIMES IGI' }, + [0x12343] = { unicodeslot=0x12343, category='lo', description='CUNEIFORM SIGN URU TIMES IM' }, + [0x12344] = { unicodeslot=0x12344, category='lo', description='CUNEIFORM SIGN URU TIMES ISH' }, + [0x12345] = { unicodeslot=0x12345, category='lo', description='CUNEIFORM SIGN URU TIMES KI' }, + [0x12346] = { unicodeslot=0x12346, category='lo', description='CUNEIFORM SIGN URU TIMES LUM' }, + [0x12347] = { unicodeslot=0x12347, category='lo', description='CUNEIFORM SIGN URU TIMES MIN' }, + [0x12348] = { unicodeslot=0x12348, category='lo', description='CUNEIFORM SIGN URU TIMES PA' }, + [0x12349] = { unicodeslot=0x12349, category='lo', description='CUNEIFORM SIGN URU TIMES SHE' }, + [0x1234A] = { unicodeslot=0x1234A, category='lo', description='CUNEIFORM SIGN URU TIMES SIG4' }, + [0x1234B] = { unicodeslot=0x1234B, category='lo', description='CUNEIFORM SIGN URU TIMES TU' }, + [0x1234C] = { unicodeslot=0x1234C, category='lo', description='CUNEIFORM SIGN URU TIMES U PLUS GUD' }, + [0x1234D] = { unicodeslot=0x1234D, category='lo', description='CUNEIFORM SIGN URU TIMES UD' }, + [0x1234E] = { unicodeslot=0x1234E, category='lo', description='CUNEIFORM SIGN URU TIMES URUDA' }, + [0x1234F] = { unicodeslot=0x1234F, category='lo', description='CUNEIFORM SIGN URUDA' }, + [0x12350] = { unicodeslot=0x12350, category='lo', description='CUNEIFORM SIGN URUDA TIMES U' }, + [0x12351] = { unicodeslot=0x12351, category='lo', description='CUNEIFORM SIGN USH' }, + [0x12352] = { unicodeslot=0x12352, category='lo', description='CUNEIFORM SIGN USH TIMES A' }, + [0x12353] = { unicodeslot=0x12353, category='lo', description='CUNEIFORM SIGN USH TIMES KU' }, + [0x12354] = { unicodeslot=0x12354, category='lo', description='CUNEIFORM SIGN USH TIMES KUR' }, + [0x12355] = { unicodeslot=0x12355, category='lo', description='CUNEIFORM SIGN USH TIMES TAK4' }, + [0x12356] = { unicodeslot=0x12356, category='lo', description='CUNEIFORM SIGN USHX' }, + [0x12357] = { unicodeslot=0x12357, category='lo', description='CUNEIFORM SIGN USH2' }, + [0x12358] = { unicodeslot=0x12358, category='lo', description='CUNEIFORM SIGN USHUMX' }, + [0x12359] = { unicodeslot=0x12359, category='lo', description='CUNEIFORM SIGN UTUKI' }, + [0x1235A] = { unicodeslot=0x1235A, category='lo', description='CUNEIFORM SIGN UZ3' }, + [0x1235B] = { unicodeslot=0x1235B, category='lo', description='CUNEIFORM SIGN UZ3 TIMES KASKAL' }, + [0x1235C] = { unicodeslot=0x1235C, category='lo', description='CUNEIFORM SIGN UZU' }, + [0x1235D] = { unicodeslot=0x1235D, category='lo', description='CUNEIFORM SIGN ZA' }, + [0x1235E] = { unicodeslot=0x1235E, category='lo', description='CUNEIFORM SIGN ZA TENU' }, + [0x1235F] = { unicodeslot=0x1235F, category='lo', description='CUNEIFORM SIGN ZA SQUARED TIMES KUR' }, + [0x12360] = { unicodeslot=0x12360, category='lo', description='CUNEIFORM SIGN ZAG' }, + [0x12361] = { unicodeslot=0x12361, category='lo', description='CUNEIFORM SIGN ZAMX' }, + [0x12362] = { unicodeslot=0x12362, category='lo', description='CUNEIFORM SIGN ZE2' }, + [0x12363] = { unicodeslot=0x12363, category='lo', description='CUNEIFORM SIGN ZI' }, + [0x12364] = { unicodeslot=0x12364, category='lo', description='CUNEIFORM SIGN ZI OVER ZI' }, + [0x12365] = { unicodeslot=0x12365, category='lo', description='CUNEIFORM SIGN ZI3' }, + [0x12366] = { unicodeslot=0x12366, category='lo', description='CUNEIFORM SIGN ZIB' }, + [0x12367] = { unicodeslot=0x12367, category='lo', description='CUNEIFORM SIGN ZIB KABA TENU' }, + [0x12368] = { unicodeslot=0x12368, category='lo', description='CUNEIFORM SIGN ZIG' }, + [0x12369] = { unicodeslot=0x12369, category='lo', description='CUNEIFORM SIGN ZIZ2' }, + [0x1236A] = { unicodeslot=0x1236A, category='lo', description='CUNEIFORM SIGN ZU' }, + [0x1236B] = { unicodeslot=0x1236B, category='lo', description='CUNEIFORM SIGN ZU5' }, + [0x1236C] = { unicodeslot=0x1236C, category='lo', description='CUNEIFORM SIGN ZU5 TIMES A' }, + [0x1236D] = { unicodeslot=0x1236D, category='lo', description='CUNEIFORM SIGN ZUBUR' }, + [0x1236E] = { unicodeslot=0x1236E, category='lo', description='CUNEIFORM SIGN ZUM' }, + [0x12400] = { unicodeslot=0x12400, category='nl', description='CUNEIFORM NUMERIC SIGN TWO ASH' }, + [0x12401] = { unicodeslot=0x12401, category='nl', description='CUNEIFORM NUMERIC SIGN THREE ASH' }, + [0x12402] = { unicodeslot=0x12402, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR ASH' }, + [0x12403] = { unicodeslot=0x12403, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE ASH' }, + [0x12404] = { unicodeslot=0x12404, category='nl', description='CUNEIFORM NUMERIC SIGN SIX ASH' }, + [0x12405] = { unicodeslot=0x12405, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN ASH' }, + [0x12406] = { unicodeslot=0x12406, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT ASH' }, + [0x12407] = { unicodeslot=0x12407, category='nl', description='CUNEIFORM NUMERIC SIGN NINE ASH' }, + [0x12408] = { unicodeslot=0x12408, category='nl', description='CUNEIFORM NUMERIC SIGN THREE DISH' }, + [0x12409] = { unicodeslot=0x12409, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR DISH' }, + [0x1240A] = { unicodeslot=0x1240A, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE DISH' }, + [0x1240B] = { unicodeslot=0x1240B, category='nl', description='CUNEIFORM NUMERIC SIGN SIX DISH' }, + [0x1240C] = { unicodeslot=0x1240C, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN DISH' }, + [0x1240D] = { unicodeslot=0x1240D, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT DISH' }, + [0x1240E] = { unicodeslot=0x1240E, category='nl', description='CUNEIFORM NUMERIC SIGN NINE DISH' }, + [0x1240F] = { unicodeslot=0x1240F, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR U' }, + [0x12410] = { unicodeslot=0x12410, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE U' }, + [0x12411] = { unicodeslot=0x12411, category='nl', description='CUNEIFORM NUMERIC SIGN SIX U' }, + [0x12412] = { unicodeslot=0x12412, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN U' }, + [0x12413] = { unicodeslot=0x12413, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT U' }, + [0x12414] = { unicodeslot=0x12414, category='nl', description='CUNEIFORM NUMERIC SIGN NINE U' }, + [0x12415] = { unicodeslot=0x12415, category='nl', description='CUNEIFORM NUMERIC SIGN ONE GESH2' }, + [0x12416] = { unicodeslot=0x12416, category='nl', description='CUNEIFORM NUMERIC SIGN TWO GESH2' }, + [0x12417] = { unicodeslot=0x12417, category='nl', description='CUNEIFORM NUMERIC SIGN THREE GESH2' }, + [0x12418] = { unicodeslot=0x12418, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR GESH2' }, + [0x12419] = { unicodeslot=0x12419, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE GESH2' }, + [0x1241A] = { unicodeslot=0x1241A, category='nl', description='CUNEIFORM NUMERIC SIGN SIX GESH2' }, + [0x1241B] = { unicodeslot=0x1241B, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN GESH2' }, + [0x1241C] = { unicodeslot=0x1241C, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT GESH2' }, + [0x1241D] = { unicodeslot=0x1241D, category='nl', description='CUNEIFORM NUMERIC SIGN NINE GESH2' }, + [0x1241E] = { unicodeslot=0x1241E, category='nl', description='CUNEIFORM NUMERIC SIGN ONE GESHU' }, + [0x1241F] = { unicodeslot=0x1241F, category='nl', description='CUNEIFORM NUMERIC SIGN TWO GESHU' }, + [0x12420] = { unicodeslot=0x12420, category='nl', description='CUNEIFORM NUMERIC SIGN THREE GESHU' }, + [0x12421] = { unicodeslot=0x12421, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR GESHU' }, + [0x12422] = { unicodeslot=0x12422, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE GESHU' }, + [0x12423] = { unicodeslot=0x12423, category='nl', description='CUNEIFORM NUMERIC SIGN TWO SHAR2' }, + [0x12424] = { unicodeslot=0x12424, category='nl', description='CUNEIFORM NUMERIC SIGN THREE SHAR2' }, + [0x12425] = { unicodeslot=0x12425, category='nl', description='CUNEIFORM NUMERIC SIGN THREE SHAR2 VARIANT FORM' }, + [0x12426] = { unicodeslot=0x12426, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR SHAR2' }, + [0x12427] = { unicodeslot=0x12427, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE SHAR2' }, + [0x12428] = { unicodeslot=0x12428, category='nl', description='CUNEIFORM NUMERIC SIGN SIX SHAR2' }, + [0x12429] = { unicodeslot=0x12429, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN SHAR2' }, + [0x1242A] = { unicodeslot=0x1242A, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT SHAR2' }, + [0x1242B] = { unicodeslot=0x1242B, category='nl', description='CUNEIFORM NUMERIC SIGN NINE SHAR2' }, + [0x1242C] = { unicodeslot=0x1242C, category='nl', description='CUNEIFORM NUMERIC SIGN ONE SHARU' }, + [0x1242D] = { unicodeslot=0x1242D, category='nl', description='CUNEIFORM NUMERIC SIGN TWO SHARU' }, + [0x1242E] = { unicodeslot=0x1242E, category='nl', description='CUNEIFORM NUMERIC SIGN THREE SHARU' }, + [0x1242F] = { unicodeslot=0x1242F, category='nl', description='CUNEIFORM NUMERIC SIGN THREE SHARU VARIANT FORM' }, + [0x12430] = { unicodeslot=0x12430, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR SHARU' }, + [0x12431] = { unicodeslot=0x12431, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE SHARU' }, + [0x12432] = { unicodeslot=0x12432, category='nl', description='CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS DISH' }, + [0x12433] = { unicodeslot=0x12433, category='nl', description='CUNEIFORM NUMERIC SIGN SHAR2 TIMES GAL PLUS MIN' }, + [0x12434] = { unicodeslot=0x12434, category='nl', description='CUNEIFORM NUMERIC SIGN ONE BURU' }, + [0x12435] = { unicodeslot=0x12435, category='nl', description='CUNEIFORM NUMERIC SIGN TWO BURU' }, + [0x12436] = { unicodeslot=0x12436, category='nl', description='CUNEIFORM NUMERIC SIGN THREE BURU' }, + [0x12437] = { unicodeslot=0x12437, category='nl', description='CUNEIFORM NUMERIC SIGN THREE BURU VARIANT FORM' }, + [0x12438] = { unicodeslot=0x12438, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR BURU' }, + [0x12439] = { unicodeslot=0x12439, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE BURU' }, + [0x1243A] = { unicodeslot=0x1243A, category='nl', description='CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH16' }, + [0x1243B] = { unicodeslot=0x1243B, category='nl', description='CUNEIFORM NUMERIC SIGN THREE VARIANT FORM ESH21' }, + [0x1243C] = { unicodeslot=0x1243C, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU' }, + [0x1243D] = { unicodeslot=0x1243D, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU4' }, + [0x1243E] = { unicodeslot=0x1243E, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU A' }, + [0x1243F] = { unicodeslot=0x1243F, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR VARIANT FORM LIMMU B' }, + [0x12440] = { unicodeslot=0x12440, category='nl', description='CUNEIFORM NUMERIC SIGN SIX VARIANT FORM ASH9' }, + [0x12441] = { unicodeslot=0x12441, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN3' }, + [0x12442] = { unicodeslot=0x12442, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN A' }, + [0x12443] = { unicodeslot=0x12443, category='nl', description='CUNEIFORM NUMERIC SIGN SEVEN VARIANT FORM IMIN B' }, + [0x12444] = { unicodeslot=0x12444, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU' }, + [0x12445] = { unicodeslot=0x12445, category='nl', description='CUNEIFORM NUMERIC SIGN EIGHT VARIANT FORM USSU3' }, + [0x12446] = { unicodeslot=0x12446, category='nl', description='CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU' }, + [0x12447] = { unicodeslot=0x12447, category='nl', description='CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU3' }, + [0x12448] = { unicodeslot=0x12448, category='nl', description='CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU4' }, + [0x12449] = { unicodeslot=0x12449, category='nl', description='CUNEIFORM NUMERIC SIGN NINE VARIANT FORM ILIMMU A' }, + [0x1244A] = { unicodeslot=0x1244A, category='nl', description='CUNEIFORM NUMERIC SIGN TWO ASH TENU' }, + [0x1244B] = { unicodeslot=0x1244B, category='nl', description='CUNEIFORM NUMERIC SIGN THREE ASH TENU' }, + [0x1244C] = { unicodeslot=0x1244C, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR ASH TENU' }, + [0x1244D] = { unicodeslot=0x1244D, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE ASH TENU' }, + [0x1244E] = { unicodeslot=0x1244E, category='nl', description='CUNEIFORM NUMERIC SIGN SIX ASH TENU' }, + [0x1244F] = { unicodeslot=0x1244F, category='nl', description='CUNEIFORM NUMERIC SIGN ONE BAN2' }, + [0x12450] = { unicodeslot=0x12450, category='nl', description='CUNEIFORM NUMERIC SIGN TWO BAN2' }, + [0x12451] = { unicodeslot=0x12451, category='nl', description='CUNEIFORM NUMERIC SIGN THREE BAN2' }, + [0x12452] = { unicodeslot=0x12452, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR BAN2' }, + [0x12453] = { unicodeslot=0x12453, category='nl', description='CUNEIFORM NUMERIC SIGN FOUR BAN2 VARIANT FORM' }, + [0x12454] = { unicodeslot=0x12454, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE BAN2' }, + [0x12455] = { unicodeslot=0x12455, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE BAN2 VARIANT FORM' }, + [0x12456] = { unicodeslot=0x12456, category='nl', description='CUNEIFORM NUMERIC SIGN NIGIDAMIN' }, + [0x12457] = { unicodeslot=0x12457, category='nl', description='CUNEIFORM NUMERIC SIGN NIGIDAESH' }, + [0x12458] = { unicodeslot=0x12458, category='nl', description='CUNEIFORM NUMERIC SIGN ONE ESHE3' }, + [0x12459] = { unicodeslot=0x12459, category='nl', description='CUNEIFORM NUMERIC SIGN TWO ESHE3' }, + [0x1245A] = { unicodeslot=0x1245A, category='nl', description='CUNEIFORM NUMERIC SIGN ONE THIRD DISH' }, + [0x1245B] = { unicodeslot=0x1245B, category='nl', description='CUNEIFORM NUMERIC SIGN TWO THIRDS DISH' }, + [0x1245C] = { unicodeslot=0x1245C, category='nl', description='CUNEIFORM NUMERIC SIGN FIVE SIXTHS DISH' }, + [0x1245D] = { unicodeslot=0x1245D, category='nl', description='CUNEIFORM NUMERIC SIGN ONE THIRD VARIANT FORM A' }, + [0x1245E] = { unicodeslot=0x1245E, category='nl', description='CUNEIFORM NUMERIC SIGN TWO THIRDS VARIANT FORM A' }, + [0x1245F] = { unicodeslot=0x1245F, category='nl', description='CUNEIFORM NUMERIC SIGN ONE EIGHTH ASH' }, + [0x12460] = { unicodeslot=0x12460, category='nl', description='CUNEIFORM NUMERIC SIGN ONE QUARTER ASH' }, + [0x12461] = { unicodeslot=0x12461, category='nl', description='CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE SIXTH' }, + [0x12462] = { unicodeslot=0x12462, category='nl', description='CUNEIFORM NUMERIC SIGN OLD ASSYRIAN ONE QUARTER' }, + [0x12470] = { unicodeslot=0x12470, category='po', description='CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER' }, + [0x12471] = { unicodeslot=0x12471, category='po', description='CUNEIFORM PUNCTUATION SIGN VERTICAL COLON' }, + [0x12472] = { unicodeslot=0x12472, category='po', description='CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON' }, + [0x12473] = { unicodeslot=0x12473, category='po', description='CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON' }, + [0x1D000] = { unicodeslot=0x1D000, category='so', description='BYZANTINE MUSICAL SYMBOL PSILI' }, + [0x1D001] = { unicodeslot=0x1D001, category='so', description='BYZANTINE MUSICAL SYMBOL DASEIA' }, + [0x1D002] = { unicodeslot=0x1D002, category='so', description='BYZANTINE MUSICAL SYMBOL PERISPOMENI' }, + [0x1D003] = { unicodeslot=0x1D003, category='so', description='BYZANTINE MUSICAL SYMBOL OXEIA EKFONITIKON' }, + [0x1D004] = { unicodeslot=0x1D004, category='so', description='BYZANTINE MUSICAL SYMBOL OXEIA DIPLI' }, + [0x1D005] = { unicodeslot=0x1D005, category='so', description='BYZANTINE MUSICAL SYMBOL VAREIA EKFONITIKON' }, + [0x1D006] = { unicodeslot=0x1D006, category='so', description='BYZANTINE MUSICAL SYMBOL VAREIA DIPLI' }, + [0x1D007] = { unicodeslot=0x1D007, category='so', description='BYZANTINE MUSICAL SYMBOL KATHISTI' }, + [0x1D008] = { unicodeslot=0x1D008, category='so', description='BYZANTINE MUSICAL SYMBOL SYRMATIKI' }, + [0x1D009] = { unicodeslot=0x1D009, category='so', description='BYZANTINE MUSICAL SYMBOL PARAKLITIKI' }, + [0x1D00A] = { unicodeslot=0x1D00A, category='so', description='BYZANTINE MUSICAL SYMBOL YPOKRISIS' }, + [0x1D00B] = { unicodeslot=0x1D00B, category='so', description='BYZANTINE MUSICAL SYMBOL YPOKRISIS DIPLI' }, + [0x1D00C] = { unicodeslot=0x1D00C, category='so', description='BYZANTINE MUSICAL SYMBOL KREMASTI' }, + [0x1D00D] = { unicodeslot=0x1D00D, category='so', description='BYZANTINE MUSICAL SYMBOL APESO EKFONITIKON' }, + [0x1D00E] = { unicodeslot=0x1D00E, category='so', description='BYZANTINE MUSICAL SYMBOL EXO EKFONITIKON' }, + [0x1D00F] = { unicodeslot=0x1D00F, category='so', description='BYZANTINE MUSICAL SYMBOL TELEIA' }, + [0x1D010] = { unicodeslot=0x1D010, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMATA' }, + [0x1D011] = { unicodeslot=0x1D011, category='so', description='BYZANTINE MUSICAL SYMBOL APOSTROFOS' }, + [0x1D012] = { unicodeslot=0x1D012, category='so', description='BYZANTINE MUSICAL SYMBOL APOSTROFOS DIPLI' }, + [0x1D013] = { unicodeslot=0x1D013, category='so', description='BYZANTINE MUSICAL SYMBOL SYNEVMA' }, + [0x1D014] = { unicodeslot=0x1D014, category='so', description='BYZANTINE MUSICAL SYMBOL THITA' }, + [0x1D015] = { unicodeslot=0x1D015, category='so', description='BYZANTINE MUSICAL SYMBOL OLIGON ARCHAION' }, + [0x1D016] = { unicodeslot=0x1D016, category='so', description='BYZANTINE MUSICAL SYMBOL GORGON ARCHAION' }, + [0x1D017] = { unicodeslot=0x1D017, category='so', description='BYZANTINE MUSICAL SYMBOL PSILON' }, + [0x1D018] = { unicodeslot=0x1D018, category='so', description='BYZANTINE MUSICAL SYMBOL CHAMILON' }, + [0x1D019] = { unicodeslot=0x1D019, category='so', description='BYZANTINE MUSICAL SYMBOL VATHY' }, + [0x1D01A] = { unicodeslot=0x1D01A, category='so', description='BYZANTINE MUSICAL SYMBOL ISON ARCHAION' }, + [0x1D01B] = { unicodeslot=0x1D01B, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMA ARCHAION' }, + [0x1D01C] = { unicodeslot=0x1D01C, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMATA ARCHAION' }, + [0x1D01D] = { unicodeslot=0x1D01D, category='so', description='BYZANTINE MUSICAL SYMBOL SAXIMATA' }, + [0x1D01E] = { unicodeslot=0x1D01E, category='so', description='BYZANTINE MUSICAL SYMBOL PARICHON' }, + [0x1D01F] = { unicodeslot=0x1D01F, category='so', description='BYZANTINE MUSICAL SYMBOL STAVROS APODEXIA' }, + [0x1D020] = { unicodeslot=0x1D020, category='so', description='BYZANTINE MUSICAL SYMBOL OXEIAI ARCHAION' }, + [0x1D021] = { unicodeslot=0x1D021, category='so', description='BYZANTINE MUSICAL SYMBOL VAREIAI ARCHAION' }, + [0x1D022] = { unicodeslot=0x1D022, category='so', description='BYZANTINE MUSICAL SYMBOL APODERMA ARCHAION' }, + [0x1D023] = { unicodeslot=0x1D023, category='so', description='BYZANTINE MUSICAL SYMBOL APOTHEMA' }, + [0x1D024] = { unicodeslot=0x1D024, category='so', description='BYZANTINE MUSICAL SYMBOL KLASMA' }, + [0x1D025] = { unicodeslot=0x1D025, category='so', description='BYZANTINE MUSICAL SYMBOL REVMA' }, + [0x1D026] = { unicodeslot=0x1D026, category='so', description='BYZANTINE MUSICAL SYMBOL PIASMA ARCHAION' }, + [0x1D027] = { unicodeslot=0x1D027, category='so', description='BYZANTINE MUSICAL SYMBOL TINAGMA' }, + [0x1D028] = { unicodeslot=0x1D028, category='so', description='BYZANTINE MUSICAL SYMBOL ANATRICHISMA' }, + [0x1D029] = { unicodeslot=0x1D029, category='so', description='BYZANTINE MUSICAL SYMBOL SEISMA' }, + [0x1D02A] = { unicodeslot=0x1D02A, category='so', description='BYZANTINE MUSICAL SYMBOL SYNAGMA ARCHAION' }, + [0x1D02B] = { unicodeslot=0x1D02B, category='so', description='BYZANTINE MUSICAL SYMBOL SYNAGMA META STAVROU' }, + [0x1D02C] = { unicodeslot=0x1D02C, category='so', description='BYZANTINE MUSICAL SYMBOL OYRANISMA ARCHAION' }, + [0x1D02D] = { unicodeslot=0x1D02D, category='so', description='BYZANTINE MUSICAL SYMBOL THEMA' }, + [0x1D02E] = { unicodeslot=0x1D02E, category='so', description='BYZANTINE MUSICAL SYMBOL LEMOI' }, + [0x1D02F] = { unicodeslot=0x1D02F, category='so', description='BYZANTINE MUSICAL SYMBOL DYO' }, + [0x1D030] = { unicodeslot=0x1D030, category='so', description='BYZANTINE MUSICAL SYMBOL TRIA' }, + [0x1D031] = { unicodeslot=0x1D031, category='so', description='BYZANTINE MUSICAL SYMBOL TESSERA' }, + [0x1D032] = { unicodeslot=0x1D032, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMATA' }, + [0x1D033] = { unicodeslot=0x1D033, category='so', description='BYZANTINE MUSICAL SYMBOL APESO EXO NEO' }, + [0x1D034] = { unicodeslot=0x1D034, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION' }, + [0x1D035] = { unicodeslot=0x1D035, category='so', description='BYZANTINE MUSICAL SYMBOL IMIFTHORA' }, + [0x1D036] = { unicodeslot=0x1D036, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKON ARCHAION' }, + [0x1D037] = { unicodeslot=0x1D037, category='so', description='BYZANTINE MUSICAL SYMBOL KATAVA TROMIKON' }, + [0x1D038] = { unicodeslot=0x1D038, category='so', description='BYZANTINE MUSICAL SYMBOL PELASTON' }, + [0x1D039] = { unicodeslot=0x1D039, category='so', description='BYZANTINE MUSICAL SYMBOL PSIFISTON' }, + [0x1D03A] = { unicodeslot=0x1D03A, category='so', description='BYZANTINE MUSICAL SYMBOL KONTEVMA' }, + [0x1D03B] = { unicodeslot=0x1D03B, category='so', description='BYZANTINE MUSICAL SYMBOL CHOREVMA ARCHAION' }, + [0x1D03C] = { unicodeslot=0x1D03C, category='so', description='BYZANTINE MUSICAL SYMBOL RAPISMA' }, + [0x1D03D] = { unicodeslot=0x1D03D, category='so', description='BYZANTINE MUSICAL SYMBOL PARAKALESMA ARCHAION' }, + [0x1D03E] = { unicodeslot=0x1D03E, category='so', description='BYZANTINE MUSICAL SYMBOL PARAKLITIKI ARCHAION' }, + [0x1D03F] = { unicodeslot=0x1D03F, category='so', description='BYZANTINE MUSICAL SYMBOL ICHADIN' }, + [0x1D040] = { unicodeslot=0x1D040, category='so', description='BYZANTINE MUSICAL SYMBOL NANA' }, + [0x1D041] = { unicodeslot=0x1D041, category='so', description='BYZANTINE MUSICAL SYMBOL PETASMA' }, + [0x1D042] = { unicodeslot=0x1D042, category='so', description='BYZANTINE MUSICAL SYMBOL KONTEVMA ALLO' }, + [0x1D043] = { unicodeslot=0x1D043, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKON ALLO' }, + [0x1D044] = { unicodeslot=0x1D044, category='so', description='BYZANTINE MUSICAL SYMBOL STRAGGISMATA' }, + [0x1D045] = { unicodeslot=0x1D045, category='so', description='BYZANTINE MUSICAL SYMBOL GRONTHISMATA' }, + [0x1D046] = { unicodeslot=0x1D046, category='so', description='BYZANTINE MUSICAL SYMBOL ISON NEO' }, + [0x1D047] = { unicodeslot=0x1D047, category='so', description='BYZANTINE MUSICAL SYMBOL OLIGON NEO' }, + [0x1D048] = { unicodeslot=0x1D048, category='so', description='BYZANTINE MUSICAL SYMBOL OXEIA NEO' }, + [0x1D049] = { unicodeslot=0x1D049, category='so', description='BYZANTINE MUSICAL SYMBOL PETASTI' }, + [0x1D04A] = { unicodeslot=0x1D04A, category='so', description='BYZANTINE MUSICAL SYMBOL KOUFISMA' }, + [0x1D04B] = { unicodeslot=0x1D04B, category='so', description='BYZANTINE MUSICAL SYMBOL PETASTOKOUFISMA' }, + [0x1D04C] = { unicodeslot=0x1D04C, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMOKOUFISMA' }, + [0x1D04D] = { unicodeslot=0x1D04D, category='so', description='BYZANTINE MUSICAL SYMBOL PELASTON NEO' }, + [0x1D04E] = { unicodeslot=0x1D04E, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMATA NEO ANO' }, + [0x1D04F] = { unicodeslot=0x1D04F, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMA NEO ANO' }, + [0x1D050] = { unicodeslot=0x1D050, category='so', description='BYZANTINE MUSICAL SYMBOL YPSILI' }, + [0x1D051] = { unicodeslot=0x1D051, category='so', description='BYZANTINE MUSICAL SYMBOL APOSTROFOS NEO' }, + [0x1D052] = { unicodeslot=0x1D052, category='so', description='BYZANTINE MUSICAL SYMBOL APOSTROFOI SYNDESMOS NEO' }, + [0x1D053] = { unicodeslot=0x1D053, category='so', description='BYZANTINE MUSICAL SYMBOL YPORROI' }, + [0x1D054] = { unicodeslot=0x1D054, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMOYPORROON' }, + [0x1D055] = { unicodeslot=0x1D055, category='so', description='BYZANTINE MUSICAL SYMBOL ELAFRON' }, + [0x1D056] = { unicodeslot=0x1D056, category='so', description='BYZANTINE MUSICAL SYMBOL CHAMILI' }, + [0x1D057] = { unicodeslot=0x1D057, category='so', description='BYZANTINE MUSICAL SYMBOL MIKRON ISON' }, + [0x1D058] = { unicodeslot=0x1D058, category='so', description='BYZANTINE MUSICAL SYMBOL VAREIA NEO' }, + [0x1D059] = { unicodeslot=0x1D059, category='so', description='BYZANTINE MUSICAL SYMBOL PIASMA NEO' }, + [0x1D05A] = { unicodeslot=0x1D05A, category='so', description='BYZANTINE MUSICAL SYMBOL PSIFISTON NEO' }, + [0x1D05B] = { unicodeslot=0x1D05B, category='so', description='BYZANTINE MUSICAL SYMBOL OMALON' }, + [0x1D05C] = { unicodeslot=0x1D05C, category='so', description='BYZANTINE MUSICAL SYMBOL ANTIKENOMA' }, + [0x1D05D] = { unicodeslot=0x1D05D, category='so', description='BYZANTINE MUSICAL SYMBOL LYGISMA' }, + [0x1D05E] = { unicodeslot=0x1D05E, category='so', description='BYZANTINE MUSICAL SYMBOL PARAKLITIKI NEO' }, + [0x1D05F] = { unicodeslot=0x1D05F, category='so', description='BYZANTINE MUSICAL SYMBOL PARAKALESMA NEO' }, + [0x1D060] = { unicodeslot=0x1D060, category='so', description='BYZANTINE MUSICAL SYMBOL ETERON PARAKALESMA' }, + [0x1D061] = { unicodeslot=0x1D061, category='so', description='BYZANTINE MUSICAL SYMBOL KYLISMA' }, + [0x1D062] = { unicodeslot=0x1D062, category='so', description='BYZANTINE MUSICAL SYMBOL ANTIKENOKYLISMA' }, + [0x1D063] = { unicodeslot=0x1D063, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKON NEO' }, + [0x1D064] = { unicodeslot=0x1D064, category='so', description='BYZANTINE MUSICAL SYMBOL EKSTREPTON' }, + [0x1D065] = { unicodeslot=0x1D065, category='so', description='BYZANTINE MUSICAL SYMBOL SYNAGMA NEO' }, + [0x1D066] = { unicodeslot=0x1D066, category='so', description='BYZANTINE MUSICAL SYMBOL SYRMA' }, + [0x1D067] = { unicodeslot=0x1D067, category='so', description='BYZANTINE MUSICAL SYMBOL CHOREVMA NEO' }, + [0x1D068] = { unicodeslot=0x1D068, category='so', description='BYZANTINE MUSICAL SYMBOL EPEGERMA' }, + [0x1D069] = { unicodeslot=0x1D069, category='so', description='BYZANTINE MUSICAL SYMBOL SEISMA NEO' }, + [0x1D06A] = { unicodeslot=0x1D06A, category='so', description='BYZANTINE MUSICAL SYMBOL XIRON KLASMA' }, + [0x1D06B] = { unicodeslot=0x1D06B, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKOPSIFISTON' }, + [0x1D06C] = { unicodeslot=0x1D06C, category='so', description='BYZANTINE MUSICAL SYMBOL PSIFISTOLYGISMA' }, + [0x1D06D] = { unicodeslot=0x1D06D, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKOLYGISMA' }, + [0x1D06E] = { unicodeslot=0x1D06E, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKOPARAKALESMA' }, + [0x1D06F] = { unicodeslot=0x1D06F, category='so', description='BYZANTINE MUSICAL SYMBOL PSIFISTOPARAKALESMA' }, + [0x1D070] = { unicodeslot=0x1D070, category='so', description='BYZANTINE MUSICAL SYMBOL TROMIKOSYNAGMA' }, + [0x1D071] = { unicodeslot=0x1D071, category='so', description='BYZANTINE MUSICAL SYMBOL PSIFISTOSYNAGMA' }, + [0x1D072] = { unicodeslot=0x1D072, category='so', description='BYZANTINE MUSICAL SYMBOL GORGOSYNTHETON' }, + [0x1D073] = { unicodeslot=0x1D073, category='so', description='BYZANTINE MUSICAL SYMBOL ARGOSYNTHETON' }, + [0x1D074] = { unicodeslot=0x1D074, category='so', description='BYZANTINE MUSICAL SYMBOL ETERON ARGOSYNTHETON' }, + [0x1D075] = { unicodeslot=0x1D075, category='so', description='BYZANTINE MUSICAL SYMBOL OYRANISMA NEO' }, + [0x1D076] = { unicodeslot=0x1D076, category='so', description='BYZANTINE MUSICAL SYMBOL THEMATISMOS ESO' }, + [0x1D077] = { unicodeslot=0x1D077, category='so', description='BYZANTINE MUSICAL SYMBOL THEMATISMOS EXO' }, + [0x1D078] = { unicodeslot=0x1D078, category='so', description='BYZANTINE MUSICAL SYMBOL THEMA APLOUN' }, + [0x1D079] = { unicodeslot=0x1D079, category='so', description='BYZANTINE MUSICAL SYMBOL THES KAI APOTHES' }, + [0x1D07A] = { unicodeslot=0x1D07A, category='so', description='BYZANTINE MUSICAL SYMBOL KATAVASMA' }, + [0x1D07B] = { unicodeslot=0x1D07B, category='so', description='BYZANTINE MUSICAL SYMBOL ENDOFONON' }, + [0x1D07C] = { unicodeslot=0x1D07C, category='so', description='BYZANTINE MUSICAL SYMBOL YFEN KATO' }, + [0x1D07D] = { unicodeslot=0x1D07D, category='so', description='BYZANTINE MUSICAL SYMBOL YFEN ANO' }, + [0x1D07E] = { unicodeslot=0x1D07E, category='so', description='BYZANTINE MUSICAL SYMBOL STAVROS' }, + [0x1D07F] = { unicodeslot=0x1D07F, category='so', description='BYZANTINE MUSICAL SYMBOL KLASMA ANO' }, + [0x1D080] = { unicodeslot=0x1D080, category='so', description='BYZANTINE MUSICAL SYMBOL DIPLI ARCHAION' }, + [0x1D081] = { unicodeslot=0x1D081, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMA ARCHAION' }, + [0x1D082] = { unicodeslot=0x1D082, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMA ALLO' }, + [0x1D083] = { unicodeslot=0x1D083, category='so', description='BYZANTINE MUSICAL SYMBOL KRATIMA NEO' }, + [0x1D084] = { unicodeslot=0x1D084, category='so', description='BYZANTINE MUSICAL SYMBOL APODERMA NEO' }, + [0x1D085] = { unicodeslot=0x1D085, category='so', description='BYZANTINE MUSICAL SYMBOL APLI' }, + [0x1D086] = { unicodeslot=0x1D086, category='so', description='BYZANTINE MUSICAL SYMBOL DIPLI' }, + [0x1D087] = { unicodeslot=0x1D087, category='so', description='BYZANTINE MUSICAL SYMBOL TRIPLI' }, + [0x1D088] = { unicodeslot=0x1D088, category='so', description='BYZANTINE MUSICAL SYMBOL TETRAPLI' }, + [0x1D089] = { unicodeslot=0x1D089, category='so', description='BYZANTINE MUSICAL SYMBOL KORONIS' }, + [0x1D08A] = { unicodeslot=0x1D08A, category='so', description='BYZANTINE MUSICAL SYMBOL LEIMMA ENOS CHRONOU' }, + [0x1D08B] = { unicodeslot=0x1D08B, category='so', description='BYZANTINE MUSICAL SYMBOL LEIMMA DYO CHRONON' }, + [0x1D08C] = { unicodeslot=0x1D08C, category='so', description='BYZANTINE MUSICAL SYMBOL LEIMMA TRION CHRONON' }, + [0x1D08D] = { unicodeslot=0x1D08D, category='so', description='BYZANTINE MUSICAL SYMBOL LEIMMA TESSARON CHRONON' }, + [0x1D08E] = { unicodeslot=0x1D08E, category='so', description='BYZANTINE MUSICAL SYMBOL LEIMMA IMISEOS CHRONOU' }, + [0x1D08F] = { unicodeslot=0x1D08F, category='so', description='BYZANTINE MUSICAL SYMBOL GORGON NEO ANO' }, + [0x1D090] = { unicodeslot=0x1D090, category='so', description='BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON ARISTERA' }, + [0x1D091] = { unicodeslot=0x1D091, category='so', description='BYZANTINE MUSICAL SYMBOL GORGON PARESTIGMENON DEXIA' }, + [0x1D092] = { unicodeslot=0x1D092, category='so', description='BYZANTINE MUSICAL SYMBOL DIGORGON' }, + [0x1D093] = { unicodeslot=0x1D093, category='so', description='BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA KATO' }, + [0x1D094] = { unicodeslot=0x1D094, category='so', description='BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON ARISTERA ANO' }, + [0x1D095] = { unicodeslot=0x1D095, category='so', description='BYZANTINE MUSICAL SYMBOL DIGORGON PARESTIGMENON DEXIA' }, + [0x1D096] = { unicodeslot=0x1D096, category='so', description='BYZANTINE MUSICAL SYMBOL TRIGORGON' }, + [0x1D097] = { unicodeslot=0x1D097, category='so', description='BYZANTINE MUSICAL SYMBOL ARGON' }, + [0x1D098] = { unicodeslot=0x1D098, category='so', description='BYZANTINE MUSICAL SYMBOL IMIDIARGON' }, + [0x1D099] = { unicodeslot=0x1D099, category='so', description='BYZANTINE MUSICAL SYMBOL DIARGON' }, + [0x1D09A] = { unicodeslot=0x1D09A, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI POLI ARGI' }, + [0x1D09B] = { unicodeslot=0x1D09B, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI ARGOTERI' }, + [0x1D09C] = { unicodeslot=0x1D09C, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI ARGI' }, + [0x1D09D] = { unicodeslot=0x1D09D, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI METRIA' }, + [0x1D09E] = { unicodeslot=0x1D09E, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI MESI' }, + [0x1D09F] = { unicodeslot=0x1D09F, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI GORGI' }, + [0x1D0A0] = { unicodeslot=0x1D0A0, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI GORGOTERI' }, + [0x1D0A1] = { unicodeslot=0x1D0A1, category='so', description='BYZANTINE MUSICAL SYMBOL AGOGI POLI GORGI' }, + [0x1D0A2] = { unicodeslot=0x1D0A2, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOS ICHOS' }, + [0x1D0A3] = { unicodeslot=0x1D0A3, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI PROTOS ICHOS' }, + [0x1D0A4] = { unicodeslot=0x1D0A4, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA DEYTEROS ICHOS' }, + [0x1D0A5] = { unicodeslot=0x1D0A5, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA ALLI DEYTEROS ICHOS' }, + [0x1D0A6] = { unicodeslot=0x1D0A6, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA TRITOS ICHOS' }, + [0x1D0A7] = { unicodeslot=0x1D0A7, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA TRIFONIAS' }, + [0x1D0A8] = { unicodeslot=0x1D0A8, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS ICHOS' }, + [0x1D0A9] = { unicodeslot=0x1D0A9, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA TETARTOS LEGETOS ICHOS' }, + [0x1D0AA] = { unicodeslot=0x1D0AA, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA LEGETOS ICHOS' }, + [0x1D0AB] = { unicodeslot=0x1D0AB, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS ICHOS' }, + [0x1D0AC] = { unicodeslot=0x1D0AC, category='so', description='BYZANTINE MUSICAL SYMBOL ISAKIA TELOUS ICHIMATOS' }, + [0x1D0AD] = { unicodeslot=0x1D0AD, category='so', description='BYZANTINE MUSICAL SYMBOL APOSTROFOI TELOUS ICHIMATOS' }, + [0x1D0AE] = { unicodeslot=0x1D0AE, category='so', description='BYZANTINE MUSICAL SYMBOL FANEROSIS TETRAFONIAS' }, + [0x1D0AF] = { unicodeslot=0x1D0AF, category='so', description='BYZANTINE MUSICAL SYMBOL FANEROSIS MONOFONIAS' }, + [0x1D0B0] = { unicodeslot=0x1D0B0, category='so', description='BYZANTINE MUSICAL SYMBOL FANEROSIS DIFONIAS' }, + [0x1D0B1] = { unicodeslot=0x1D0B1, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA VARYS ICHOS' }, + [0x1D0B2] = { unicodeslot=0x1D0B2, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA PROTOVARYS ICHOS' }, + [0x1D0B3] = { unicodeslot=0x1D0B3, category='so', description='BYZANTINE MUSICAL SYMBOL MARTYRIA PLAGIOS TETARTOS ICHOS' }, + [0x1D0B4] = { unicodeslot=0x1D0B4, category='so', description='BYZANTINE MUSICAL SYMBOL GORTHMIKON N APLOUN' }, + [0x1D0B5] = { unicodeslot=0x1D0B5, category='so', description='BYZANTINE MUSICAL SYMBOL GORTHMIKON N DIPLOUN' }, + [0x1D0B6] = { unicodeslot=0x1D0B6, category='so', description='BYZANTINE MUSICAL SYMBOL ENARXIS KAI FTHORA VOU' }, + [0x1D0B7] = { unicodeslot=0x1D0B7, category='so', description='BYZANTINE MUSICAL SYMBOL IMIFONON' }, + [0x1D0B8] = { unicodeslot=0x1D0B8, category='so', description='BYZANTINE MUSICAL SYMBOL IMIFTHORON' }, + [0x1D0B9] = { unicodeslot=0x1D0B9, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA ARCHAION DEYTEROU ICHOU' }, + [0x1D0BA] = { unicodeslot=0x1D0BA, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI PA' }, + [0x1D0BB] = { unicodeslot=0x1D0BB, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NANA' }, + [0x1D0BC] = { unicodeslot=0x1D0BC, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA NAOS ICHOS' }, + [0x1D0BD] = { unicodeslot=0x1D0BD, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI DI' }, + [0x1D0BE] = { unicodeslot=0x1D0BE, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON DIATONON DI' }, + [0x1D0BF] = { unicodeslot=0x1D0BF, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI KE' }, + [0x1D0C0] = { unicodeslot=0x1D0C0, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI ZO' }, + [0x1D0C1] = { unicodeslot=0x1D0C1, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI KATO' }, + [0x1D0C2] = { unicodeslot=0x1D0C2, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA DIATONIKI NI ANO' }, + [0x1D0C3] = { unicodeslot=0x1D0C3, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA DIFONIAS' }, + [0x1D0C4] = { unicodeslot=0x1D0C4, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA MALAKON CHROMA MONOFONIAS' }, + [0x1D0C5] = { unicodeslot=0x1D0C5, category='so', description='BYZANTINE MUSICAL SYMBOL FHTORA SKLIRON CHROMA VASIS' }, + [0x1D0C6] = { unicodeslot=0x1D0C6, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA SKLIRON CHROMA SYNAFI' }, + [0x1D0C7] = { unicodeslot=0x1D0C7, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA NENANO' }, + [0x1D0C8] = { unicodeslot=0x1D0C8, category='so', description='BYZANTINE MUSICAL SYMBOL CHROA ZYGOS' }, + [0x1D0C9] = { unicodeslot=0x1D0C9, category='so', description='BYZANTINE MUSICAL SYMBOL CHROA KLITON' }, + [0x1D0CA] = { unicodeslot=0x1D0CA, category='so', description='BYZANTINE MUSICAL SYMBOL CHROA SPATHI' }, + [0x1D0CB] = { unicodeslot=0x1D0CB, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA I YFESIS TETARTIMORION' }, + [0x1D0CC] = { unicodeslot=0x1D0CC, category='so', description='BYZANTINE MUSICAL SYMBOL FTHORA ENARMONIOS ANTIFONIA' }, + [0x1D0CD] = { unicodeslot=0x1D0CD, category='so', description='BYZANTINE MUSICAL SYMBOL YFESIS TRITIMORION' }, + [0x1D0CE] = { unicodeslot=0x1D0CE, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS TRITIMORION' }, + [0x1D0CF] = { unicodeslot=0x1D0CF, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS TETARTIMORION' }, + [0x1D0D0] = { unicodeslot=0x1D0D0, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS APLI DYO DODEKATA' }, + [0x1D0D1] = { unicodeslot=0x1D0D1, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS MONOGRAMMOS TESSERA DODEKATA' }, + [0x1D0D2] = { unicodeslot=0x1D0D2, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS DIGRAMMOS EX DODEKATA' }, + [0x1D0D3] = { unicodeslot=0x1D0D3, category='so', description='BYZANTINE MUSICAL SYMBOL DIESIS TRIGRAMMOS OKTO DODEKATA' }, + [0x1D0D4] = { unicodeslot=0x1D0D4, category='so', description='BYZANTINE MUSICAL SYMBOL YFESIS APLI DYO DODEKATA' }, + [0x1D0D5] = { unicodeslot=0x1D0D5, category='so', description='BYZANTINE MUSICAL SYMBOL YFESIS MONOGRAMMOS TESSERA DODEKATA' }, + [0x1D0D6] = { unicodeslot=0x1D0D6, category='so', description='BYZANTINE MUSICAL SYMBOL YFESIS DIGRAMMOS EX DODEKATA' }, + [0x1D0D7] = { unicodeslot=0x1D0D7, category='so', description='BYZANTINE MUSICAL SYMBOL YFESIS TRIGRAMMOS OKTO DODEKATA' }, + [0x1D0D8] = { unicodeslot=0x1D0D8, category='so', description='BYZANTINE MUSICAL SYMBOL GENIKI DIESIS' }, + [0x1D0D9] = { unicodeslot=0x1D0D9, category='so', description='BYZANTINE MUSICAL SYMBOL GENIKI YFESIS' }, + [0x1D0DA] = { unicodeslot=0x1D0DA, category='so', description='BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MIKRI' }, + [0x1D0DB] = { unicodeslot=0x1D0DB, category='so', description='BYZANTINE MUSICAL SYMBOL DIASTOLI APLI MEGALI' }, + [0x1D0DC] = { unicodeslot=0x1D0DC, category='so', description='BYZANTINE MUSICAL SYMBOL DIASTOLI DIPLI' }, + [0x1D0DD] = { unicodeslot=0x1D0DD, category='so', description='BYZANTINE MUSICAL SYMBOL DIASTOLI THESEOS' }, + [0x1D0DE] = { unicodeslot=0x1D0DE, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS' }, + [0x1D0DF] = { unicodeslot=0x1D0DF, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS DISIMOU' }, + [0x1D0E0] = { unicodeslot=0x1D0E0, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TRISIMOU' }, + [0x1D0E1] = { unicodeslot=0x1D0E1, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS THESEOS TETRASIMOU' }, + [0x1D0E2] = { unicodeslot=0x1D0E2, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS' }, + [0x1D0E3] = { unicodeslot=0x1D0E3, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS DISIMOU' }, + [0x1D0E4] = { unicodeslot=0x1D0E4, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TRISIMOU' }, + [0x1D0E5] = { unicodeslot=0x1D0E5, category='so', description='BYZANTINE MUSICAL SYMBOL SIMANSIS ARSEOS TETRASIMOU' }, + [0x1D0E6] = { unicodeslot=0x1D0E6, category='so', description='BYZANTINE MUSICAL SYMBOL DIGRAMMA GG' }, + [0x1D0E7] = { unicodeslot=0x1D0E7, category='so', description='BYZANTINE MUSICAL SYMBOL DIFTOGGOS OU' }, + [0x1D0E8] = { unicodeslot=0x1D0E8, category='so', description='BYZANTINE MUSICAL SYMBOL STIGMA' }, + [0x1D0E9] = { unicodeslot=0x1D0E9, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO PA' }, + [0x1D0EA] = { unicodeslot=0x1D0EA, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO VOU' }, + [0x1D0EB] = { unicodeslot=0x1D0EB, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO GA' }, + [0x1D0EC] = { unicodeslot=0x1D0EC, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO DI' }, + [0x1D0ED] = { unicodeslot=0x1D0ED, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO KE' }, + [0x1D0EE] = { unicodeslot=0x1D0EE, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO ZO' }, + [0x1D0EF] = { unicodeslot=0x1D0EF, category='so', description='BYZANTINE MUSICAL SYMBOL ARKTIKO NI' }, + [0x1D0F0] = { unicodeslot=0x1D0F0, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMATA NEO MESO' }, + [0x1D0F1] = { unicodeslot=0x1D0F1, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMA NEO MESO' }, + [0x1D0F2] = { unicodeslot=0x1D0F2, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMATA NEO KATO' }, + [0x1D0F3] = { unicodeslot=0x1D0F3, category='so', description='BYZANTINE MUSICAL SYMBOL KENTIMA NEO KATO' }, + [0x1D0F4] = { unicodeslot=0x1D0F4, category='so', description='BYZANTINE MUSICAL SYMBOL KLASMA KATO' }, + [0x1D0F5] = { unicodeslot=0x1D0F5, category='so', description='BYZANTINE MUSICAL SYMBOL GORGON NEO KATO' }, + [0x1D100] = { unicodeslot=0x1D100, category='so', description='MUSICAL SYMBOL SINGLE BARLINE' }, + [0x1D101] = { unicodeslot=0x1D101, category='so', description='MUSICAL SYMBOL DOUBLE BARLINE' }, + [0x1D102] = { unicodeslot=0x1D102, category='so', description='MUSICAL SYMBOL FINAL BARLINE' }, + [0x1D103] = { unicodeslot=0x1D103, category='so', description='MUSICAL SYMBOL REVERSE FINAL BARLINE' }, + [0x1D104] = { unicodeslot=0x1D104, category='so', description='MUSICAL SYMBOL DASHED BARLINE' }, + [0x1D105] = { unicodeslot=0x1D105, category='so', description='MUSICAL SYMBOL SHORT BARLINE' }, + [0x1D106] = { unicodeslot=0x1D106, category='so', description='MUSICAL SYMBOL LEFT REPEAT SIGN' }, + [0x1D107] = { unicodeslot=0x1D107, category='so', description='MUSICAL SYMBOL RIGHT REPEAT SIGN' }, + [0x1D108] = { unicodeslot=0x1D108, category='so', description='MUSICAL SYMBOL REPEAT DOTS' }, + [0x1D109] = { unicodeslot=0x1D109, category='so', description='MUSICAL SYMBOL DAL SEGNO' }, + [0x1D10A] = { unicodeslot=0x1D10A, category='so', description='MUSICAL SYMBOL DA CAPO' }, + [0x1D10B] = { unicodeslot=0x1D10B, category='so', description='MUSICAL SYMBOL SEGNO' }, + [0x1D10C] = { unicodeslot=0x1D10C, category='so', description='MUSICAL SYMBOL CODA' }, + [0x1D10D] = { unicodeslot=0x1D10D, category='so', description='MUSICAL SYMBOL REPEATED FIGURE-1' }, + [0x1D10E] = { unicodeslot=0x1D10E, category='so', description='MUSICAL SYMBOL REPEATED FIGURE-2' }, + [0x1D10F] = { unicodeslot=0x1D10F, category='so', description='MUSICAL SYMBOL REPEATED FIGURE-3' }, + [0x1D110] = { unicodeslot=0x1D110, category='so', description='MUSICAL SYMBOL FERMATA' }, + [0x1D111] = { unicodeslot=0x1D111, category='so', description='MUSICAL SYMBOL FERMATA BELOW' }, + [0x1D112] = { unicodeslot=0x1D112, category='so', description='MUSICAL SYMBOL BREATH MARK' }, + [0x1D113] = { unicodeslot=0x1D113, category='so', description='MUSICAL SYMBOL CAESURA' }, + [0x1D114] = { unicodeslot=0x1D114, category='so', description='MUSICAL SYMBOL BRACE' }, + [0x1D115] = { unicodeslot=0x1D115, category='so', description='MUSICAL SYMBOL BRACKET' }, + [0x1D116] = { unicodeslot=0x1D116, category='so', description='MUSICAL SYMBOL ONE-LINE STAFF' }, + [0x1D117] = { unicodeslot=0x1D117, category='so', description='MUSICAL SYMBOL TWO-LINE STAFF' }, + [0x1D118] = { unicodeslot=0x1D118, category='so', description='MUSICAL SYMBOL THREE-LINE STAFF' }, + [0x1D119] = { unicodeslot=0x1D119, category='so', description='MUSICAL SYMBOL FOUR-LINE STAFF' }, + [0x1D11A] = { unicodeslot=0x1D11A, category='so', description='MUSICAL SYMBOL FIVE-LINE STAFF' }, + [0x1D11B] = { unicodeslot=0x1D11B, category='so', description='MUSICAL SYMBOL SIX-LINE STAFF' }, + [0x1D11C] = { unicodeslot=0x1D11C, category='so', description='MUSICAL SYMBOL SIX-STRING FRETBOARD' }, + [0x1D11D] = { unicodeslot=0x1D11D, category='so', description='MUSICAL SYMBOL FOUR-STRING FRETBOARD' }, + [0x1D11E] = { unicodeslot=0x1D11E, category='so', description='MUSICAL SYMBOL G CLEF' }, + [0x1D11F] = { unicodeslot=0x1D11F, category='so', description='MUSICAL SYMBOL G CLEF OTTAVA ALTA' }, + [0x1D120] = { unicodeslot=0x1D120, category='so', description='MUSICAL SYMBOL G CLEF OTTAVA BASSA' }, + [0x1D121] = { unicodeslot=0x1D121, category='so', description='MUSICAL SYMBOL C CLEF' }, + [0x1D122] = { unicodeslot=0x1D122, category='so', description='MUSICAL SYMBOL F CLEF' }, + [0x1D123] = { unicodeslot=0x1D123, category='so', description='MUSICAL SYMBOL F CLEF OTTAVA ALTA' }, + [0x1D124] = { unicodeslot=0x1D124, category='so', description='MUSICAL SYMBOL F CLEF OTTAVA BASSA' }, + [0x1D125] = { unicodeslot=0x1D125, category='so', description='MUSICAL SYMBOL DRUM CLEF-1' }, + [0x1D126] = { unicodeslot=0x1D126, category='so', description='MUSICAL SYMBOL DRUM CLEF-2' }, + [0x1D12A] = { unicodeslot=0x1D12A, category='so', description='MUSICAL SYMBOL DOUBLE SHARP' }, + [0x1D12B] = { unicodeslot=0x1D12B, category='so', description='MUSICAL SYMBOL DOUBLE FLAT' }, + [0x1D12C] = { unicodeslot=0x1D12C, category='so', description='MUSICAL SYMBOL FLAT UP' }, + [0x1D12D] = { unicodeslot=0x1D12D, category='so', description='MUSICAL SYMBOL FLAT DOWN' }, + [0x1D12E] = { unicodeslot=0x1D12E, category='so', description='MUSICAL SYMBOL NATURAL UP' }, + [0x1D12F] = { unicodeslot=0x1D12F, category='so', description='MUSICAL SYMBOL NATURAL DOWN' }, + [0x1D130] = { unicodeslot=0x1D130, category='so', description='MUSICAL SYMBOL SHARP UP' }, + [0x1D131] = { unicodeslot=0x1D131, category='so', description='MUSICAL SYMBOL SHARP DOWN' }, + [0x1D132] = { unicodeslot=0x1D132, category='so', description='MUSICAL SYMBOL QUARTER TONE SHARP' }, + [0x1D133] = { unicodeslot=0x1D133, category='so', description='MUSICAL SYMBOL QUARTER TONE FLAT' }, + [0x1D134] = { unicodeslot=0x1D134, category='so', description='MUSICAL SYMBOL COMMON TIME' }, + [0x1D135] = { unicodeslot=0x1D135, category='so', description='MUSICAL SYMBOL CUT TIME' }, + [0x1D136] = { unicodeslot=0x1D136, category='so', description='MUSICAL SYMBOL OTTAVA ALTA' }, + [0x1D137] = { unicodeslot=0x1D137, category='so', description='MUSICAL SYMBOL OTTAVA BASSA' }, + [0x1D138] = { unicodeslot=0x1D138, category='so', description='MUSICAL SYMBOL QUINDICESIMA ALTA' }, + [0x1D139] = { unicodeslot=0x1D139, category='so', description='MUSICAL SYMBOL QUINDICESIMA BASSA' }, + [0x1D13A] = { unicodeslot=0x1D13A, category='so', description='MUSICAL SYMBOL MULTI REST' }, + [0x1D13B] = { unicodeslot=0x1D13B, category='so', description='MUSICAL SYMBOL WHOLE REST' }, + [0x1D13C] = { unicodeslot=0x1D13C, category='so', description='MUSICAL SYMBOL HALF REST' }, + [0x1D13D] = { unicodeslot=0x1D13D, category='so', description='MUSICAL SYMBOL QUARTER REST' }, + [0x1D13E] = { unicodeslot=0x1D13E, category='so', description='MUSICAL SYMBOL EIGHTH REST' }, + [0x1D13F] = { unicodeslot=0x1D13F, category='so', description='MUSICAL SYMBOL SIXTEENTH REST' }, + [0x1D140] = { unicodeslot=0x1D140, category='so', description='MUSICAL SYMBOL THIRTY-SECOND REST' }, + [0x1D141] = { unicodeslot=0x1D141, category='so', description='MUSICAL SYMBOL SIXTY-FOURTH REST' }, + [0x1D142] = { unicodeslot=0x1D142, category='so', description='MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH REST' }, + [0x1D143] = { unicodeslot=0x1D143, category='so', description='MUSICAL SYMBOL X NOTEHEAD' }, + [0x1D144] = { unicodeslot=0x1D144, category='so', description='MUSICAL SYMBOL PLUS NOTEHEAD' }, + [0x1D145] = { unicodeslot=0x1D145, category='so', description='MUSICAL SYMBOL CIRCLE X NOTEHEAD' }, + [0x1D146] = { unicodeslot=0x1D146, category='so', description='MUSICAL SYMBOL SQUARE NOTEHEAD WHITE' }, + [0x1D147] = { unicodeslot=0x1D147, category='so', description='MUSICAL SYMBOL SQUARE NOTEHEAD BLACK' }, + [0x1D148] = { unicodeslot=0x1D148, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD UP WHITE' }, + [0x1D149] = { unicodeslot=0x1D149, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD UP BLACK' }, + [0x1D14A] = { unicodeslot=0x1D14A, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT WHITE' }, + [0x1D14B] = { unicodeslot=0x1D14B, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD LEFT BLACK' }, + [0x1D14C] = { unicodeslot=0x1D14C, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT WHITE' }, + [0x1D14D] = { unicodeslot=0x1D14D, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD RIGHT BLACK' }, + [0x1D14E] = { unicodeslot=0x1D14E, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN WHITE' }, + [0x1D14F] = { unicodeslot=0x1D14F, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD DOWN BLACK' }, + [0x1D150] = { unicodeslot=0x1D150, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT WHITE' }, + [0x1D151] = { unicodeslot=0x1D151, category='so', description='MUSICAL SYMBOL TRIANGLE NOTEHEAD UP RIGHT BLACK' }, + [0x1D152] = { unicodeslot=0x1D152, category='so', description='MUSICAL SYMBOL MOON NOTEHEAD WHITE' }, + [0x1D153] = { unicodeslot=0x1D153, category='so', description='MUSICAL SYMBOL MOON NOTEHEAD BLACK' }, + [0x1D154] = { unicodeslot=0x1D154, category='so', description='MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN WHITE' }, + [0x1D155] = { unicodeslot=0x1D155, category='so', description='MUSICAL SYMBOL TRIANGLE-ROUND NOTEHEAD DOWN BLACK' }, + [0x1D156] = { unicodeslot=0x1D156, category='so', description='MUSICAL SYMBOL PARENTHESIS NOTEHEAD' }, + [0x1D157] = { unicodeslot=0x1D157, category='so', description='MUSICAL SYMBOL VOID NOTEHEAD' }, + [0x1D158] = { unicodeslot=0x1D158, category='so', description='MUSICAL SYMBOL NOTEHEAD BLACK' }, + [0x1D159] = { unicodeslot=0x1D159, category='so', description='MUSICAL SYMBOL NULL NOTEHEAD' }, + [0x1D15A] = { unicodeslot=0x1D15A, category='so', description='MUSICAL SYMBOL CLUSTER NOTEHEAD WHITE' }, + [0x1D15B] = { unicodeslot=0x1D15B, category='so', description='MUSICAL SYMBOL CLUSTER NOTEHEAD BLACK' }, + [0x1D15C] = { unicodeslot=0x1D15C, category='so', description='MUSICAL SYMBOL BREVE' }, + [0x1D15D] = { unicodeslot=0x1D15D, category='so', description='MUSICAL SYMBOL WHOLE NOTE' }, + [0x1D15E] = { unicodeslot=0x1D15E, category='so', description='MUSICAL SYMBOL HALF NOTE', specials={'char',0x1D157,0x1D165} }, + [0x1D15F] = { unicodeslot=0x1D15F, category='so', description='MUSICAL SYMBOL QUARTER NOTE', specials={'char',0x1D158,0x1D165} }, + [0x1D160] = { unicodeslot=0x1D160, category='so', description='MUSICAL SYMBOL EIGHTH NOTE', specials={'char',0x1D15F,0x1D16E} }, + [0x1D161] = { unicodeslot=0x1D161, category='so', description='MUSICAL SYMBOL SIXTEENTH NOTE', specials={'char',0x1D15F,0x1D16F} }, + [0x1D162] = { unicodeslot=0x1D162, category='so', description='MUSICAL SYMBOL THIRTY-SECOND NOTE', specials={'char',0x1D15F,0x1D170} }, + [0x1D163] = { unicodeslot=0x1D163, category='so', description='MUSICAL SYMBOL SIXTY-FOURTH NOTE', specials={'char',0x1D15F,0x1D171} }, + [0x1D164] = { unicodeslot=0x1D164, category='so', description='MUSICAL SYMBOL ONE HUNDRED TWENTY-EIGHTH NOTE', specials={'char',0x1D15F,0x1D172} }, + [0x1D165] = { unicodeslot=0x1D165, category='mc', description='MUSICAL SYMBOL COMBINING STEM' }, + [0x1D166] = { unicodeslot=0x1D166, category='mc', description='MUSICAL SYMBOL COMBINING SPRECHGESANG STEM' }, + [0x1D167] = { unicodeslot=0x1D167, category='mn', description='MUSICAL SYMBOL COMBINING TREMOLO-1' }, + [0x1D168] = { unicodeslot=0x1D168, category='mn', description='MUSICAL SYMBOL COMBINING TREMOLO-2' }, + [0x1D169] = { unicodeslot=0x1D169, category='mn', description='MUSICAL SYMBOL COMBINING TREMOLO-3' }, + [0x1D16A] = { unicodeslot=0x1D16A, category='so', description='MUSICAL SYMBOL FINGERED TREMOLO-1' }, + [0x1D16B] = { unicodeslot=0x1D16B, category='so', description='MUSICAL SYMBOL FINGERED TREMOLO-2' }, + [0x1D16C] = { unicodeslot=0x1D16C, category='so', description='MUSICAL SYMBOL FINGERED TREMOLO-3' }, + [0x1D16D] = { unicodeslot=0x1D16D, category='mc', description='MUSICAL SYMBOL COMBINING AUGMENTATION DOT' }, + [0x1D16E] = { unicodeslot=0x1D16E, category='mc', description='MUSICAL SYMBOL COMBINING FLAG-1' }, + [0x1D16F] = { unicodeslot=0x1D16F, category='mc', description='MUSICAL SYMBOL COMBINING FLAG-2' }, + [0x1D170] = { unicodeslot=0x1D170, category='mc', description='MUSICAL SYMBOL COMBINING FLAG-3' }, + [0x1D171] = { unicodeslot=0x1D171, category='mc', description='MUSICAL SYMBOL COMBINING FLAG-4' }, + [0x1D172] = { unicodeslot=0x1D172, category='mc', description='MUSICAL SYMBOL COMBINING FLAG-5' }, + [0x1D173] = { unicodeslot=0x1D173, category='cf', description='MUSICAL SYMBOL BEGIN BEAM' }, + [0x1D174] = { unicodeslot=0x1D174, category='cf', description='MUSICAL SYMBOL END BEAM' }, + [0x1D175] = { unicodeslot=0x1D175, category='cf', description='MUSICAL SYMBOL BEGIN TIE' }, + [0x1D176] = { unicodeslot=0x1D176, category='cf', description='MUSICAL SYMBOL END TIE' }, + [0x1D177] = { unicodeslot=0x1D177, category='cf', description='MUSICAL SYMBOL BEGIN SLUR' }, + [0x1D178] = { unicodeslot=0x1D178, category='cf', description='MUSICAL SYMBOL END SLUR' }, + [0x1D179] = { unicodeslot=0x1D179, category='cf', description='MUSICAL SYMBOL BEGIN PHRASE' }, + [0x1D17A] = { unicodeslot=0x1D17A, category='cf', description='MUSICAL SYMBOL END PHRASE' }, + [0x1D17B] = { unicodeslot=0x1D17B, category='mn', description='MUSICAL SYMBOL COMBINING ACCENT' }, + [0x1D17C] = { unicodeslot=0x1D17C, category='mn', description='MUSICAL SYMBOL COMBINING STACCATO' }, + [0x1D17D] = { unicodeslot=0x1D17D, category='mn', description='MUSICAL SYMBOL COMBINING TENUTO' }, + [0x1D17E] = { unicodeslot=0x1D17E, category='mn', description='MUSICAL SYMBOL COMBINING STACCATISSIMO' }, + [0x1D17F] = { unicodeslot=0x1D17F, category='mn', description='MUSICAL SYMBOL COMBINING MARCATO' }, + [0x1D180] = { unicodeslot=0x1D180, category='mn', description='MUSICAL SYMBOL COMBINING MARCATO-STACCATO' }, + [0x1D181] = { unicodeslot=0x1D181, category='mn', description='MUSICAL SYMBOL COMBINING ACCENT-STACCATO' }, + [0x1D182] = { unicodeslot=0x1D182, category='mn', description='MUSICAL SYMBOL COMBINING LOURE' }, + [0x1D183] = { unicodeslot=0x1D183, category='so', description='MUSICAL SYMBOL ARPEGGIATO UP' }, + [0x1D184] = { unicodeslot=0x1D184, category='so', description='MUSICAL SYMBOL ARPEGGIATO DOWN' }, + [0x1D185] = { unicodeslot=0x1D185, category='mn', description='MUSICAL SYMBOL COMBINING DOIT' }, + [0x1D186] = { unicodeslot=0x1D186, category='mn', description='MUSICAL SYMBOL COMBINING RIP' }, + [0x1D187] = { unicodeslot=0x1D187, category='mn', description='MUSICAL SYMBOL COMBINING FLIP' }, + [0x1D188] = { unicodeslot=0x1D188, category='mn', description='MUSICAL SYMBOL COMBINING SMEAR' }, + [0x1D189] = { unicodeslot=0x1D189, category='mn', description='MUSICAL SYMBOL COMBINING BEND' }, + [0x1D18A] = { unicodeslot=0x1D18A, category='mn', description='MUSICAL SYMBOL COMBINING DOUBLE TONGUE' }, + [0x1D18B] = { unicodeslot=0x1D18B, category='mn', description='MUSICAL SYMBOL COMBINING TRIPLE TONGUE' }, + [0x1D18C] = { unicodeslot=0x1D18C, category='so', description='MUSICAL SYMBOL RINFORZANDO' }, + [0x1D18D] = { unicodeslot=0x1D18D, category='so', description='MUSICAL SYMBOL SUBITO' }, + [0x1D18E] = { unicodeslot=0x1D18E, category='so', description='MUSICAL SYMBOL Z' }, + [0x1D18F] = { unicodeslot=0x1D18F, category='so', description='MUSICAL SYMBOL PIANO' }, + [0x1D190] = { unicodeslot=0x1D190, category='so', description='MUSICAL SYMBOL MEZZO' }, + [0x1D191] = { unicodeslot=0x1D191, category='so', description='MUSICAL SYMBOL FORTE' }, + [0x1D192] = { unicodeslot=0x1D192, category='so', description='MUSICAL SYMBOL CRESCENDO' }, + [0x1D193] = { unicodeslot=0x1D193, category='so', description='MUSICAL SYMBOL DECRESCENDO' }, + [0x1D194] = { unicodeslot=0x1D194, category='so', description='MUSICAL SYMBOL GRACE NOTE SLASH' }, + [0x1D195] = { unicodeslot=0x1D195, category='so', description='MUSICAL SYMBOL GRACE NOTE NO SLASH' }, + [0x1D196] = { unicodeslot=0x1D196, category='so', description='MUSICAL SYMBOL TR' }, + [0x1D197] = { unicodeslot=0x1D197, category='so', description='MUSICAL SYMBOL TURN' }, + [0x1D198] = { unicodeslot=0x1D198, category='so', description='MUSICAL SYMBOL INVERTED TURN' }, + [0x1D199] = { unicodeslot=0x1D199, category='so', description='MUSICAL SYMBOL TURN SLASH' }, + [0x1D19A] = { unicodeslot=0x1D19A, category='so', description='MUSICAL SYMBOL TURN UP' }, + [0x1D19B] = { unicodeslot=0x1D19B, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-1' }, + [0x1D19C] = { unicodeslot=0x1D19C, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-2' }, + [0x1D19D] = { unicodeslot=0x1D19D, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-3' }, + [0x1D19E] = { unicodeslot=0x1D19E, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-4' }, + [0x1D19F] = { unicodeslot=0x1D19F, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-5' }, + [0x1D1A0] = { unicodeslot=0x1D1A0, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-6' }, + [0x1D1A1] = { unicodeslot=0x1D1A1, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-7' }, + [0x1D1A2] = { unicodeslot=0x1D1A2, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-8' }, + [0x1D1A3] = { unicodeslot=0x1D1A3, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-9' }, + [0x1D1A4] = { unicodeslot=0x1D1A4, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-10' }, + [0x1D1A5] = { unicodeslot=0x1D1A5, category='so', description='MUSICAL SYMBOL ORNAMENT STROKE-11' }, + [0x1D1A6] = { unicodeslot=0x1D1A6, category='so', description='MUSICAL SYMBOL HAUPTSTIMME' }, + [0x1D1A7] = { unicodeslot=0x1D1A7, category='so', description='MUSICAL SYMBOL NEBENSTIMME' }, + [0x1D1A8] = { unicodeslot=0x1D1A8, category='so', description='MUSICAL SYMBOL END OF STIMME' }, + [0x1D1A9] = { unicodeslot=0x1D1A9, category='so', description='MUSICAL SYMBOL DEGREE SLASH' }, + [0x1D1AA] = { unicodeslot=0x1D1AA, category='mn', description='MUSICAL SYMBOL COMBINING DOWN BOW' }, + [0x1D1AB] = { unicodeslot=0x1D1AB, category='mn', description='MUSICAL SYMBOL COMBINING UP BOW' }, + [0x1D1AC] = { unicodeslot=0x1D1AC, category='mn', description='MUSICAL SYMBOL COMBINING HARMONIC' }, + [0x1D1AD] = { unicodeslot=0x1D1AD, category='mn', description='MUSICAL SYMBOL COMBINING SNAP PIZZICATO' }, + [0x1D1AE] = { unicodeslot=0x1D1AE, category='so', description='MUSICAL SYMBOL PEDAL MARK' }, + [0x1D1AF] = { unicodeslot=0x1D1AF, category='so', description='MUSICAL SYMBOL PEDAL UP MARK' }, + [0x1D1B0] = { unicodeslot=0x1D1B0, category='so', description='MUSICAL SYMBOL HALF PEDAL MARK' }, + [0x1D1B1] = { unicodeslot=0x1D1B1, category='so', description='MUSICAL SYMBOL GLISSANDO UP' }, + [0x1D1B2] = { unicodeslot=0x1D1B2, category='so', description='MUSICAL SYMBOL GLISSANDO DOWN' }, + [0x1D1B3] = { unicodeslot=0x1D1B3, category='so', description='MUSICAL SYMBOL WITH FINGERNAILS' }, + [0x1D1B4] = { unicodeslot=0x1D1B4, category='so', description='MUSICAL SYMBOL DAMP' }, + [0x1D1B5] = { unicodeslot=0x1D1B5, category='so', description='MUSICAL SYMBOL DAMP ALL' }, + [0x1D1B6] = { unicodeslot=0x1D1B6, category='so', description='MUSICAL SYMBOL MAXIMA' }, + [0x1D1B7] = { unicodeslot=0x1D1B7, category='so', description='MUSICAL SYMBOL LONGA' }, + [0x1D1B8] = { unicodeslot=0x1D1B8, category='so', description='MUSICAL SYMBOL BREVIS' }, + [0x1D1B9] = { unicodeslot=0x1D1B9, category='so', description='MUSICAL SYMBOL SEMIBREVIS WHITE' }, + [0x1D1BA] = { unicodeslot=0x1D1BA, category='so', description='MUSICAL SYMBOL SEMIBREVIS BLACK' }, + [0x1D1BB] = { unicodeslot=0x1D1BB, category='so', description='MUSICAL SYMBOL MINIMA', specials={'char',0x1D1B9,0x1D165} }, + [0x1D1BC] = { unicodeslot=0x1D1BC, category='so', description='MUSICAL SYMBOL MINIMA BLACK', specials={'char',0x1D1BA,0x1D165} }, + [0x1D1BD] = { unicodeslot=0x1D1BD, category='so', description='MUSICAL SYMBOL SEMIMINIMA WHITE', specials={'char',0x1D1BB,0x1D16E} }, + [0x1D1BE] = { unicodeslot=0x1D1BE, category='so', description='MUSICAL SYMBOL SEMIMINIMA BLACK', specials={'char',0x1D1BC,0x1D16E} }, + [0x1D1BF] = { unicodeslot=0x1D1BF, category='so', description='MUSICAL SYMBOL FUSA WHITE', specials={'char',0x1D1BB,0x1D16F} }, + [0x1D1C0] = { unicodeslot=0x1D1C0, category='so', description='MUSICAL SYMBOL FUSA BLACK', specials={'char',0x1D1BC,0x1D16F} }, + [0x1D1C1] = { unicodeslot=0x1D1C1, category='so', description='MUSICAL SYMBOL LONGA PERFECTA REST' }, + [0x1D1C2] = { unicodeslot=0x1D1C2, category='so', description='MUSICAL SYMBOL LONGA IMPERFECTA REST' }, + [0x1D1C3] = { unicodeslot=0x1D1C3, category='so', description='MUSICAL SYMBOL BREVIS REST' }, + [0x1D1C4] = { unicodeslot=0x1D1C4, category='so', description='MUSICAL SYMBOL SEMIBREVIS REST' }, + [0x1D1C5] = { unicodeslot=0x1D1C5, category='so', description='MUSICAL SYMBOL MINIMA REST' }, + [0x1D1C6] = { unicodeslot=0x1D1C6, category='so', description='MUSICAL SYMBOL SEMIMINIMA REST' }, + [0x1D1C7] = { unicodeslot=0x1D1C7, category='so', description='MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA' }, + [0x1D1C8] = { unicodeslot=0x1D1C8, category='so', description='MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE IMPERFECTA' }, + [0x1D1C9] = { unicodeslot=0x1D1C9, category='so', description='MUSICAL SYMBOL TEMPUS PERFECTUM CUM PROLATIONE PERFECTA DIMINUTION-1' }, + [0x1D1CA] = { unicodeslot=0x1D1CA, category='so', description='MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE PERFECTA' }, + [0x1D1CB] = { unicodeslot=0x1D1CB, category='so', description='MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA' }, + [0x1D1CC] = { unicodeslot=0x1D1CC, category='so', description='MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-1' }, + [0x1D1CD] = { unicodeslot=0x1D1CD, category='so', description='MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-2' }, + [0x1D1CE] = { unicodeslot=0x1D1CE, category='so', description='MUSICAL SYMBOL TEMPUS IMPERFECTUM CUM PROLATIONE IMPERFECTA DIMINUTION-3' }, + [0x1D1CF] = { unicodeslot=0x1D1CF, category='so', description='MUSICAL SYMBOL CROIX' }, + [0x1D1D0] = { unicodeslot=0x1D1D0, category='so', description='MUSICAL SYMBOL GREGORIAN C CLEF' }, + [0x1D1D1] = { unicodeslot=0x1D1D1, category='so', description='MUSICAL SYMBOL GREGORIAN F CLEF' }, + [0x1D1D2] = { unicodeslot=0x1D1D2, category='so', description='MUSICAL SYMBOL SQUARE B' }, + [0x1D1D3] = { unicodeslot=0x1D1D3, category='so', description='MUSICAL SYMBOL VIRGA' }, + [0x1D1D4] = { unicodeslot=0x1D1D4, category='so', description='MUSICAL SYMBOL PODATUS' }, + [0x1D1D5] = { unicodeslot=0x1D1D5, category='so', description='MUSICAL SYMBOL CLIVIS' }, + [0x1D1D6] = { unicodeslot=0x1D1D6, category='so', description='MUSICAL SYMBOL SCANDICUS' }, + [0x1D1D7] = { unicodeslot=0x1D1D7, category='so', description='MUSICAL SYMBOL CLIMACUS' }, + [0x1D1D8] = { unicodeslot=0x1D1D8, category='so', description='MUSICAL SYMBOL TORCULUS' }, + [0x1D1D9] = { unicodeslot=0x1D1D9, category='so', description='MUSICAL SYMBOL PORRECTUS' }, + [0x1D1DA] = { unicodeslot=0x1D1DA, category='so', description='MUSICAL SYMBOL PORRECTUS FLEXUS' }, + [0x1D1DB] = { unicodeslot=0x1D1DB, category='so', description='MUSICAL SYMBOL SCANDICUS FLEXUS' }, + [0x1D1DC] = { unicodeslot=0x1D1DC, category='so', description='MUSICAL SYMBOL TORCULUS RESUPINUS' }, + [0x1D1DD] = { unicodeslot=0x1D1DD, category='so', description='MUSICAL SYMBOL PES SUBPUNCTIS' }, + [0x1D200] = { unicodeslot=0x1D200, category='so', description='GREEK VOCAL NOTATION SYMBOL-1' }, + [0x1D201] = { unicodeslot=0x1D201, category='so', description='GREEK VOCAL NOTATION SYMBOL-2' }, + [0x1D202] = { unicodeslot=0x1D202, category='so', description='GREEK VOCAL NOTATION SYMBOL-3' }, + [0x1D203] = { unicodeslot=0x1D203, category='so', description='GREEK VOCAL NOTATION SYMBOL-4' }, + [0x1D204] = { unicodeslot=0x1D204, category='so', description='GREEK VOCAL NOTATION SYMBOL-5' }, + [0x1D205] = { unicodeslot=0x1D205, category='so', description='GREEK VOCAL NOTATION SYMBOL-6' }, + [0x1D206] = { unicodeslot=0x1D206, category='so', description='GREEK VOCAL NOTATION SYMBOL-7' }, + [0x1D207] = { unicodeslot=0x1D207, category='so', description='GREEK VOCAL NOTATION SYMBOL-8' }, + [0x1D208] = { unicodeslot=0x1D208, category='so', description='GREEK VOCAL NOTATION SYMBOL-9' }, + [0x1D209] = { unicodeslot=0x1D209, category='so', description='GREEK VOCAL NOTATION SYMBOL-10' }, + [0x1D20A] = { unicodeslot=0x1D20A, category='so', description='GREEK VOCAL NOTATION SYMBOL-11' }, + [0x1D20B] = { unicodeslot=0x1D20B, category='so', description='GREEK VOCAL NOTATION SYMBOL-12' }, + [0x1D20C] = { unicodeslot=0x1D20C, category='so', description='GREEK VOCAL NOTATION SYMBOL-13' }, + [0x1D20D] = { unicodeslot=0x1D20D, category='so', description='GREEK VOCAL NOTATION SYMBOL-14' }, + [0x1D20E] = { unicodeslot=0x1D20E, category='so', description='GREEK VOCAL NOTATION SYMBOL-15' }, + [0x1D20F] = { unicodeslot=0x1D20F, category='so', description='GREEK VOCAL NOTATION SYMBOL-16' }, + [0x1D210] = { unicodeslot=0x1D210, category='so', description='GREEK VOCAL NOTATION SYMBOL-17' }, + [0x1D211] = { unicodeslot=0x1D211, category='so', description='GREEK VOCAL NOTATION SYMBOL-18' }, + [0x1D212] = { unicodeslot=0x1D212, category='so', description='GREEK VOCAL NOTATION SYMBOL-19' }, + [0x1D213] = { unicodeslot=0x1D213, category='so', description='GREEK VOCAL NOTATION SYMBOL-20' }, + [0x1D214] = { unicodeslot=0x1D214, category='so', description='GREEK VOCAL NOTATION SYMBOL-21' }, + [0x1D215] = { unicodeslot=0x1D215, category='so', description='GREEK VOCAL NOTATION SYMBOL-22' }, + [0x1D216] = { unicodeslot=0x1D216, category='so', description='GREEK VOCAL NOTATION SYMBOL-23' }, + [0x1D217] = { unicodeslot=0x1D217, category='so', description='GREEK VOCAL NOTATION SYMBOL-24' }, + [0x1D218] = { unicodeslot=0x1D218, category='so', description='GREEK VOCAL NOTATION SYMBOL-50' }, + [0x1D219] = { unicodeslot=0x1D219, category='so', description='GREEK VOCAL NOTATION SYMBOL-51' }, + [0x1D21A] = { unicodeslot=0x1D21A, category='so', description='GREEK VOCAL NOTATION SYMBOL-52' }, + [0x1D21B] = { unicodeslot=0x1D21B, category='so', description='GREEK VOCAL NOTATION SYMBOL-53' }, + [0x1D21C] = { unicodeslot=0x1D21C, category='so', description='GREEK VOCAL NOTATION SYMBOL-54' }, + [0x1D21D] = { unicodeslot=0x1D21D, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-1' }, + [0x1D21E] = { unicodeslot=0x1D21E, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-2' }, + [0x1D21F] = { unicodeslot=0x1D21F, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-4' }, + [0x1D220] = { unicodeslot=0x1D220, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-5' }, + [0x1D221] = { unicodeslot=0x1D221, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-7' }, + [0x1D222] = { unicodeslot=0x1D222, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-8' }, + [0x1D223] = { unicodeslot=0x1D223, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-11' }, + [0x1D224] = { unicodeslot=0x1D224, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-12' }, + [0x1D225] = { unicodeslot=0x1D225, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-13' }, + [0x1D226] = { unicodeslot=0x1D226, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-14' }, + [0x1D227] = { unicodeslot=0x1D227, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-17' }, + [0x1D228] = { unicodeslot=0x1D228, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-18' }, + [0x1D229] = { unicodeslot=0x1D229, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-19' }, + [0x1D22A] = { unicodeslot=0x1D22A, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-23' }, + [0x1D22B] = { unicodeslot=0x1D22B, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-24' }, + [0x1D22C] = { unicodeslot=0x1D22C, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-25' }, + [0x1D22D] = { unicodeslot=0x1D22D, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-26' }, + [0x1D22E] = { unicodeslot=0x1D22E, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-27' }, + [0x1D22F] = { unicodeslot=0x1D22F, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-29' }, + [0x1D230] = { unicodeslot=0x1D230, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-30' }, + [0x1D231] = { unicodeslot=0x1D231, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-32' }, + [0x1D232] = { unicodeslot=0x1D232, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-36' }, + [0x1D233] = { unicodeslot=0x1D233, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-37' }, + [0x1D234] = { unicodeslot=0x1D234, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-38' }, + [0x1D235] = { unicodeslot=0x1D235, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-39' }, + [0x1D236] = { unicodeslot=0x1D236, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-40' }, + [0x1D237] = { unicodeslot=0x1D237, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-42' }, + [0x1D238] = { unicodeslot=0x1D238, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-43' }, + [0x1D239] = { unicodeslot=0x1D239, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-45' }, + [0x1D23A] = { unicodeslot=0x1D23A, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-47' }, + [0x1D23B] = { unicodeslot=0x1D23B, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-48' }, + [0x1D23C] = { unicodeslot=0x1D23C, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-49' }, + [0x1D23D] = { unicodeslot=0x1D23D, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-50' }, + [0x1D23E] = { unicodeslot=0x1D23E, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-51' }, + [0x1D23F] = { unicodeslot=0x1D23F, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-52' }, + [0x1D240] = { unicodeslot=0x1D240, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-53' }, + [0x1D241] = { unicodeslot=0x1D241, category='so', description='GREEK INSTRUMENTAL NOTATION SYMBOL-54' }, + [0x1D242] = { unicodeslot=0x1D242, category='mn', description='COMBINING GREEK MUSICAL TRISEME' }, + [0x1D243] = { unicodeslot=0x1D243, category='mn', description='COMBINING GREEK MUSICAL TETRASEME' }, + [0x1D244] = { unicodeslot=0x1D244, category='mn', description='COMBINING GREEK MUSICAL PENTASEME' }, + [0x1D245] = { unicodeslot=0x1D245, category='so', description='GREEK MUSICAL LEIMMA' }, + [0x1D300] = { unicodeslot=0x1D300, category='so', description='MONOGRAM FOR EARTH' }, + [0x1D301] = { unicodeslot=0x1D301, category='so', description='DIGRAM FOR HEAVENLY EARTH' }, + [0x1D302] = { unicodeslot=0x1D302, category='so', description='DIGRAM FOR HUMAN EARTH' }, + [0x1D303] = { unicodeslot=0x1D303, category='so', description='DIGRAM FOR EARTHLY HEAVEN' }, + [0x1D304] = { unicodeslot=0x1D304, category='so', description='DIGRAM FOR EARTHLY HUMAN' }, + [0x1D305] = { unicodeslot=0x1D305, category='so', description='DIGRAM FOR EARTH' }, + [0x1D306] = { unicodeslot=0x1D306, category='so', description='TETRAGRAM FOR CENTRE' }, + [0x1D307] = { unicodeslot=0x1D307, category='so', description='TETRAGRAM FOR FULL CIRCLE' }, + [0x1D308] = { unicodeslot=0x1D308, category='so', description='TETRAGRAM FOR MIRED' }, + [0x1D309] = { unicodeslot=0x1D309, category='so', description='TETRAGRAM FOR BARRIER' }, + [0x1D30A] = { unicodeslot=0x1D30A, category='so', description='TETRAGRAM FOR KEEPING SMALL' }, + [0x1D30B] = { unicodeslot=0x1D30B, category='so', description='TETRAGRAM FOR CONTRARIETY' }, + [0x1D30C] = { unicodeslot=0x1D30C, category='so', description='TETRAGRAM FOR ASCENT' }, + [0x1D30D] = { unicodeslot=0x1D30D, category='so', description='TETRAGRAM FOR OPPOSITION' }, + [0x1D30E] = { unicodeslot=0x1D30E, category='so', description='TETRAGRAM FOR BRANCHING OUT' }, + [0x1D30F] = { unicodeslot=0x1D30F, category='so', description='TETRAGRAM FOR DEFECTIVENESS OR DISTORTION' }, + [0x1D310] = { unicodeslot=0x1D310, category='so', description='TETRAGRAM FOR DIVERGENCE' }, + [0x1D311] = { unicodeslot=0x1D311, category='so', description='TETRAGRAM FOR YOUTHFULNESS' }, + [0x1D312] = { unicodeslot=0x1D312, category='so', description='TETRAGRAM FOR INCREASE' }, + [0x1D313] = { unicodeslot=0x1D313, category='so', description='TETRAGRAM FOR PENETRATION' }, + [0x1D314] = { unicodeslot=0x1D314, category='so', description='TETRAGRAM FOR REACH' }, + [0x1D315] = { unicodeslot=0x1D315, category='so', description='TETRAGRAM FOR CONTACT' }, + [0x1D316] = { unicodeslot=0x1D316, category='so', description='TETRAGRAM FOR HOLDING BACK' }, + [0x1D317] = { unicodeslot=0x1D317, category='so', description='TETRAGRAM FOR WAITING' }, + [0x1D318] = { unicodeslot=0x1D318, category='so', description='TETRAGRAM FOR FOLLOWING' }, + [0x1D319] = { unicodeslot=0x1D319, category='so', description='TETRAGRAM FOR ADVANCE' }, + [0x1D31A] = { unicodeslot=0x1D31A, category='so', description='TETRAGRAM FOR RELEASE' }, + [0x1D31B] = { unicodeslot=0x1D31B, category='so', description='TETRAGRAM FOR RESISTANCE' }, + [0x1D31C] = { unicodeslot=0x1D31C, category='so', description='TETRAGRAM FOR EASE' }, + [0x1D31D] = { unicodeslot=0x1D31D, category='so', description='TETRAGRAM FOR JOY' }, + [0x1D31E] = { unicodeslot=0x1D31E, category='so', description='TETRAGRAM FOR CONTENTION' }, + [0x1D31F] = { unicodeslot=0x1D31F, category='so', description='TETRAGRAM FOR ENDEAVOUR' }, + [0x1D320] = { unicodeslot=0x1D320, category='so', description='TETRAGRAM FOR DUTIES' }, + [0x1D321] = { unicodeslot=0x1D321, category='so', description='TETRAGRAM FOR CHANGE' }, + [0x1D322] = { unicodeslot=0x1D322, category='so', description='TETRAGRAM FOR DECISIVENESS' }, + [0x1D323] = { unicodeslot=0x1D323, category='so', description='TETRAGRAM FOR BOLD RESOLUTION' }, + [0x1D324] = { unicodeslot=0x1D324, category='so', description='TETRAGRAM FOR PACKING' }, + [0x1D325] = { unicodeslot=0x1D325, category='so', description='TETRAGRAM FOR LEGION' }, + [0x1D326] = { unicodeslot=0x1D326, category='so', description='TETRAGRAM FOR CLOSENESS' }, + [0x1D327] = { unicodeslot=0x1D327, category='so', description='TETRAGRAM FOR KINSHIP' }, + [0x1D328] = { unicodeslot=0x1D328, category='so', description='TETRAGRAM FOR GATHERING' }, + [0x1D329] = { unicodeslot=0x1D329, category='so', description='TETRAGRAM FOR STRENGTH' }, + [0x1D32A] = { unicodeslot=0x1D32A, category='so', description='TETRAGRAM FOR PURITY' }, + [0x1D32B] = { unicodeslot=0x1D32B, category='so', description='TETRAGRAM FOR FULLNESS' }, + [0x1D32C] = { unicodeslot=0x1D32C, category='so', description='TETRAGRAM FOR RESIDENCE' }, + [0x1D32D] = { unicodeslot=0x1D32D, category='so', description='TETRAGRAM FOR LAW OR MODEL' }, + [0x1D32E] = { unicodeslot=0x1D32E, category='so', description='TETRAGRAM FOR RESPONSE' }, + [0x1D32F] = { unicodeslot=0x1D32F, category='so', description='TETRAGRAM FOR GOING TO MEET' }, + [0x1D330] = { unicodeslot=0x1D330, category='so', description='TETRAGRAM FOR ENCOUNTERS' }, + [0x1D331] = { unicodeslot=0x1D331, category='so', description='TETRAGRAM FOR STOVE' }, + [0x1D332] = { unicodeslot=0x1D332, category='so', description='TETRAGRAM FOR GREATNESS' }, + [0x1D333] = { unicodeslot=0x1D333, category='so', description='TETRAGRAM FOR ENLARGEMENT' }, + [0x1D334] = { unicodeslot=0x1D334, category='so', description='TETRAGRAM FOR PATTERN' }, + [0x1D335] = { unicodeslot=0x1D335, category='so', description='TETRAGRAM FOR RITUAL' }, + [0x1D336] = { unicodeslot=0x1D336, category='so', description='TETRAGRAM FOR FLIGHT' }, + [0x1D337] = { unicodeslot=0x1D337, category='so', description='TETRAGRAM FOR VASTNESS OR WASTING' }, + [0x1D338] = { unicodeslot=0x1D338, category='so', description='TETRAGRAM FOR CONSTANCY' }, + [0x1D339] = { unicodeslot=0x1D339, category='so', description='TETRAGRAM FOR MEASURE' }, + [0x1D33A] = { unicodeslot=0x1D33A, category='so', description='TETRAGRAM FOR ETERNITY' }, + [0x1D33B] = { unicodeslot=0x1D33B, category='so', description='TETRAGRAM FOR UNITY' }, + [0x1D33C] = { unicodeslot=0x1D33C, category='so', description='TETRAGRAM FOR DIMINISHMENT' }, + [0x1D33D] = { unicodeslot=0x1D33D, category='so', description='TETRAGRAM FOR CLOSED MOUTH' }, + [0x1D33E] = { unicodeslot=0x1D33E, category='so', description='TETRAGRAM FOR GUARDEDNESS' }, + [0x1D33F] = { unicodeslot=0x1D33F, category='so', description='TETRAGRAM FOR GATHERING IN' }, + [0x1D340] = { unicodeslot=0x1D340, category='so', description='TETRAGRAM FOR MASSING' }, + [0x1D341] = { unicodeslot=0x1D341, category='so', description='TETRAGRAM FOR ACCUMULATION' }, + [0x1D342] = { unicodeslot=0x1D342, category='so', description='TETRAGRAM FOR EMBELLISHMENT' }, + [0x1D343] = { unicodeslot=0x1D343, category='so', description='TETRAGRAM FOR DOUBT' }, + [0x1D344] = { unicodeslot=0x1D344, category='so', description='TETRAGRAM FOR WATCH' }, + [0x1D345] = { unicodeslot=0x1D345, category='so', description='TETRAGRAM FOR SINKING' }, + [0x1D346] = { unicodeslot=0x1D346, category='so', description='TETRAGRAM FOR INNER' }, + [0x1D347] = { unicodeslot=0x1D347, category='so', description='TETRAGRAM FOR DEPARTURE' }, + [0x1D348] = { unicodeslot=0x1D348, category='so', description='TETRAGRAM FOR DARKENING' }, + [0x1D349] = { unicodeslot=0x1D349, category='so', description='TETRAGRAM FOR DIMMING' }, + [0x1D34A] = { unicodeslot=0x1D34A, category='so', description='TETRAGRAM FOR EXHAUSTION' }, + [0x1D34B] = { unicodeslot=0x1D34B, category='so', description='TETRAGRAM FOR SEVERANCE' }, + [0x1D34C] = { unicodeslot=0x1D34C, category='so', description='TETRAGRAM FOR STOPPAGE' }, + [0x1D34D] = { unicodeslot=0x1D34D, category='so', description='TETRAGRAM FOR HARDNESS' }, + [0x1D34E] = { unicodeslot=0x1D34E, category='so', description='TETRAGRAM FOR COMPLETION' }, + [0x1D34F] = { unicodeslot=0x1D34F, category='so', description='TETRAGRAM FOR CLOSURE' }, + [0x1D350] = { unicodeslot=0x1D350, category='so', description='TETRAGRAM FOR FAILURE' }, + [0x1D351] = { unicodeslot=0x1D351, category='so', description='TETRAGRAM FOR AGGRAVATION' }, + [0x1D352] = { unicodeslot=0x1D352, category='so', description='TETRAGRAM FOR COMPLIANCE' }, + [0x1D353] = { unicodeslot=0x1D353, category='so', description='TETRAGRAM FOR ON THE VERGE' }, + [0x1D354] = { unicodeslot=0x1D354, category='so', description='TETRAGRAM FOR DIFFICULTIES' }, + [0x1D355] = { unicodeslot=0x1D355, category='so', description='TETRAGRAM FOR LABOURING' }, + [0x1D356] = { unicodeslot=0x1D356, category='so', description='TETRAGRAM FOR FOSTERING' }, + [0x1D360] = { unicodeslot=0x1D360, category='no', description='COUNTING ROD UNIT DIGIT ONE' }, + [0x1D361] = { unicodeslot=0x1D361, category='no', description='COUNTING ROD UNIT DIGIT TWO' }, + [0x1D362] = { unicodeslot=0x1D362, category='no', description='COUNTING ROD UNIT DIGIT THREE' }, + [0x1D363] = { unicodeslot=0x1D363, category='no', description='COUNTING ROD UNIT DIGIT FOUR' }, + [0x1D364] = { unicodeslot=0x1D364, category='no', description='COUNTING ROD UNIT DIGIT FIVE' }, + [0x1D365] = { unicodeslot=0x1D365, category='no', description='COUNTING ROD UNIT DIGIT SIX' }, + [0x1D366] = { unicodeslot=0x1D366, category='no', description='COUNTING ROD UNIT DIGIT SEVEN' }, + [0x1D367] = { unicodeslot=0x1D367, category='no', description='COUNTING ROD UNIT DIGIT EIGHT' }, + [0x1D368] = { unicodeslot=0x1D368, category='no', description='COUNTING ROD UNIT DIGIT NINE' }, + [0x1D369] = { unicodeslot=0x1D369, category='no', description='COUNTING ROD TENS DIGIT ONE' }, + [0x1D36A] = { unicodeslot=0x1D36A, category='no', description='COUNTING ROD TENS DIGIT TWO' }, + [0x1D36B] = { unicodeslot=0x1D36B, category='no', description='COUNTING ROD TENS DIGIT THREE' }, + [0x1D36C] = { unicodeslot=0x1D36C, category='no', description='COUNTING ROD TENS DIGIT FOUR' }, + [0x1D36D] = { unicodeslot=0x1D36D, category='no', description='COUNTING ROD TENS DIGIT FIVE' }, + [0x1D36E] = { unicodeslot=0x1D36E, category='no', description='COUNTING ROD TENS DIGIT SIX' }, + [0x1D36F] = { unicodeslot=0x1D36F, category='no', description='COUNTING ROD TENS DIGIT SEVEN' }, + [0x1D370] = { unicodeslot=0x1D370, category='no', description='COUNTING ROD TENS DIGIT EIGHT' }, + [0x1D371] = { unicodeslot=0x1D371, category='no', description='COUNTING ROD TENS DIGIT NINE' }, + [0x1D400] = { unicodeslot=0x1D400, category='lu', description='MATHEMATICAL BOLD CAPITAL A', specials={'font',0x0041} }, + [0x1D401] = { unicodeslot=0x1D401, category='lu', description='MATHEMATICAL BOLD CAPITAL B', specials={'font',0x0042} }, + [0x1D402] = { unicodeslot=0x1D402, category='lu', description='MATHEMATICAL BOLD CAPITAL C', specials={'font',0x0043} }, + [0x1D403] = { unicodeslot=0x1D403, category='lu', description='MATHEMATICAL BOLD CAPITAL D', specials={'font',0x0044} }, + [0x1D404] = { unicodeslot=0x1D404, category='lu', description='MATHEMATICAL BOLD CAPITAL E', specials={'font',0x0045} }, + [0x1D405] = { unicodeslot=0x1D405, category='lu', description='MATHEMATICAL BOLD CAPITAL F', specials={'font',0x0046} }, + [0x1D406] = { unicodeslot=0x1D406, category='lu', description='MATHEMATICAL BOLD CAPITAL G', specials={'font',0x0047} }, + [0x1D407] = { unicodeslot=0x1D407, category='lu', description='MATHEMATICAL BOLD CAPITAL H', specials={'font',0x0048} }, + [0x1D408] = { unicodeslot=0x1D408, category='lu', description='MATHEMATICAL BOLD CAPITAL I', specials={'font',0x0049} }, + [0x1D409] = { unicodeslot=0x1D409, category='lu', description='MATHEMATICAL BOLD CAPITAL J', specials={'font',0x004A} }, + [0x1D40A] = { unicodeslot=0x1D40A, category='lu', description='MATHEMATICAL BOLD CAPITAL K', specials={'font',0x004B} }, + [0x1D40B] = { unicodeslot=0x1D40B, category='lu', description='MATHEMATICAL BOLD CAPITAL L', specials={'font',0x004C} }, + [0x1D40C] = { unicodeslot=0x1D40C, category='lu', description='MATHEMATICAL BOLD CAPITAL M', specials={'font',0x004D} }, + [0x1D40D] = { unicodeslot=0x1D40D, category='lu', description='MATHEMATICAL BOLD CAPITAL N', specials={'font',0x004E} }, + [0x1D40E] = { unicodeslot=0x1D40E, category='lu', description='MATHEMATICAL BOLD CAPITAL O', specials={'font',0x004F} }, + [0x1D40F] = { unicodeslot=0x1D40F, category='lu', description='MATHEMATICAL BOLD CAPITAL P', specials={'font',0x0050} }, + [0x1D410] = { unicodeslot=0x1D410, category='lu', description='MATHEMATICAL BOLD CAPITAL Q', specials={'font',0x0051} }, + [0x1D411] = { unicodeslot=0x1D411, category='lu', description='MATHEMATICAL BOLD CAPITAL R', specials={'font',0x0052} }, + [0x1D412] = { unicodeslot=0x1D412, category='lu', description='MATHEMATICAL BOLD CAPITAL S', specials={'font',0x0053} }, + [0x1D413] = { unicodeslot=0x1D413, category='lu', description='MATHEMATICAL BOLD CAPITAL T', specials={'font',0x0054} }, + [0x1D414] = { unicodeslot=0x1D414, category='lu', description='MATHEMATICAL BOLD CAPITAL U', specials={'font',0x0055} }, + [0x1D415] = { unicodeslot=0x1D415, category='lu', description='MATHEMATICAL BOLD CAPITAL V', specials={'font',0x0056} }, + [0x1D416] = { unicodeslot=0x1D416, category='lu', description='MATHEMATICAL BOLD CAPITAL W', specials={'font',0x0057} }, + [0x1D417] = { unicodeslot=0x1D417, category='lu', description='MATHEMATICAL BOLD CAPITAL X', specials={'font',0x0058} }, + [0x1D418] = { unicodeslot=0x1D418, category='lu', description='MATHEMATICAL BOLD CAPITAL Y', specials={'font',0x0059} }, + [0x1D419] = { unicodeslot=0x1D419, category='lu', description='MATHEMATICAL BOLD CAPITAL Z', specials={'font',0x005A} }, + [0x1D41A] = { unicodeslot=0x1D41A, category='ll', description='MATHEMATICAL BOLD SMALL A', specials={'font',0x0061} }, + [0x1D41B] = { unicodeslot=0x1D41B, category='ll', description='MATHEMATICAL BOLD SMALL B', specials={'font',0x0062} }, + [0x1D41C] = { unicodeslot=0x1D41C, category='ll', description='MATHEMATICAL BOLD SMALL C', specials={'font',0x0063} }, + [0x1D41D] = { unicodeslot=0x1D41D, category='ll', description='MATHEMATICAL BOLD SMALL D', specials={'font',0x0064} }, + [0x1D41E] = { unicodeslot=0x1D41E, category='ll', description='MATHEMATICAL BOLD SMALL E', specials={'font',0x0065} }, + [0x1D41F] = { unicodeslot=0x1D41F, category='ll', description='MATHEMATICAL BOLD SMALL F', specials={'font',0x0066} }, + [0x1D420] = { unicodeslot=0x1D420, category='ll', description='MATHEMATICAL BOLD SMALL G', specials={'font',0x0067} }, + [0x1D421] = { unicodeslot=0x1D421, category='ll', description='MATHEMATICAL BOLD SMALL H', specials={'font',0x0068} }, + [0x1D422] = { unicodeslot=0x1D422, category='ll', description='MATHEMATICAL BOLD SMALL I', specials={'font',0x0069} }, + [0x1D423] = { unicodeslot=0x1D423, category='ll', description='MATHEMATICAL BOLD SMALL J', specials={'font',0x006A} }, + [0x1D424] = { unicodeslot=0x1D424, category='ll', description='MATHEMATICAL BOLD SMALL K', specials={'font',0x006B} }, + [0x1D425] = { unicodeslot=0x1D425, category='ll', description='MATHEMATICAL BOLD SMALL L', specials={'font',0x006C} }, + [0x1D426] = { unicodeslot=0x1D426, category='ll', description='MATHEMATICAL BOLD SMALL M', specials={'font',0x006D} }, + [0x1D427] = { unicodeslot=0x1D427, category='ll', description='MATHEMATICAL BOLD SMALL N', specials={'font',0x006E} }, + [0x1D428] = { unicodeslot=0x1D428, category='ll', description='MATHEMATICAL BOLD SMALL O', specials={'font',0x006F} }, + [0x1D429] = { unicodeslot=0x1D429, category='ll', description='MATHEMATICAL BOLD SMALL P', specials={'font',0x0070} }, + [0x1D42A] = { unicodeslot=0x1D42A, category='ll', description='MATHEMATICAL BOLD SMALL Q', specials={'font',0x0071} }, + [0x1D42B] = { unicodeslot=0x1D42B, category='ll', description='MATHEMATICAL BOLD SMALL R', specials={'font',0x0072} }, + [0x1D42C] = { unicodeslot=0x1D42C, category='ll', description='MATHEMATICAL BOLD SMALL S', specials={'font',0x0073} }, + [0x1D42D] = { unicodeslot=0x1D42D, category='ll', description='MATHEMATICAL BOLD SMALL T', specials={'font',0x0074} }, + [0x1D42E] = { unicodeslot=0x1D42E, category='ll', description='MATHEMATICAL BOLD SMALL U', specials={'font',0x0075} }, + [0x1D42F] = { unicodeslot=0x1D42F, category='ll', description='MATHEMATICAL BOLD SMALL V', specials={'font',0x0076} }, + [0x1D430] = { unicodeslot=0x1D430, category='ll', description='MATHEMATICAL BOLD SMALL W', specials={'font',0x0077} }, + [0x1D431] = { unicodeslot=0x1D431, category='ll', description='MATHEMATICAL BOLD SMALL X', specials={'font',0x0078} }, + [0x1D432] = { unicodeslot=0x1D432, category='ll', description='MATHEMATICAL BOLD SMALL Y', specials={'font',0x0079} }, + [0x1D433] = { unicodeslot=0x1D433, category='ll', description='MATHEMATICAL BOLD SMALL Z', specials={'font',0x007A} }, + [0x1D434] = { unicodeslot=0x1D434, category='lu', description='MATHEMATICAL ITALIC CAPITAL A', specials={'font',0x0041} }, + [0x1D435] = { unicodeslot=0x1D435, category='lu', description='MATHEMATICAL ITALIC CAPITAL B', specials={'font',0x0042} }, + [0x1D436] = { unicodeslot=0x1D436, category='lu', description='MATHEMATICAL ITALIC CAPITAL C', specials={'font',0x0043} }, + [0x1D437] = { unicodeslot=0x1D437, category='lu', description='MATHEMATICAL ITALIC CAPITAL D', specials={'font',0x0044} }, + [0x1D438] = { unicodeslot=0x1D438, category='lu', description='MATHEMATICAL ITALIC CAPITAL E', specials={'font',0x0045} }, + [0x1D439] = { unicodeslot=0x1D439, category='lu', description='MATHEMATICAL ITALIC CAPITAL F', specials={'font',0x0046} }, + [0x1D43A] = { unicodeslot=0x1D43A, category='lu', description='MATHEMATICAL ITALIC CAPITAL G', specials={'font',0x0047} }, + [0x1D43B] = { unicodeslot=0x1D43B, category='lu', description='MATHEMATICAL ITALIC CAPITAL H', specials={'font',0x0048} }, + [0x1D43C] = { unicodeslot=0x1D43C, category='lu', description='MATHEMATICAL ITALIC CAPITAL I', specials={'font',0x0049} }, + [0x1D43D] = { unicodeslot=0x1D43D, category='lu', description='MATHEMATICAL ITALIC CAPITAL J', specials={'font',0x004A} }, + [0x1D43E] = { unicodeslot=0x1D43E, category='lu', description='MATHEMATICAL ITALIC CAPITAL K', specials={'font',0x004B} }, + [0x1D43F] = { unicodeslot=0x1D43F, category='lu', description='MATHEMATICAL ITALIC CAPITAL L', specials={'font',0x004C} }, + [0x1D440] = { unicodeslot=0x1D440, category='lu', description='MATHEMATICAL ITALIC CAPITAL M', specials={'font',0x004D} }, + [0x1D441] = { unicodeslot=0x1D441, category='lu', description='MATHEMATICAL ITALIC CAPITAL N', specials={'font',0x004E} }, + [0x1D442] = { unicodeslot=0x1D442, category='lu', description='MATHEMATICAL ITALIC CAPITAL O', specials={'font',0x004F} }, + [0x1D443] = { unicodeslot=0x1D443, category='lu', description='MATHEMATICAL ITALIC CAPITAL P', specials={'font',0x0050} }, + [0x1D444] = { unicodeslot=0x1D444, category='lu', description='MATHEMATICAL ITALIC CAPITAL Q', specials={'font',0x0051} }, + [0x1D445] = { unicodeslot=0x1D445, category='lu', description='MATHEMATICAL ITALIC CAPITAL R', specials={'font',0x0052} }, + [0x1D446] = { unicodeslot=0x1D446, category='lu', description='MATHEMATICAL ITALIC CAPITAL S', specials={'font',0x0053} }, + [0x1D447] = { unicodeslot=0x1D447, category='lu', description='MATHEMATICAL ITALIC CAPITAL T', specials={'font',0x0054} }, + [0x1D448] = { unicodeslot=0x1D448, category='lu', description='MATHEMATICAL ITALIC CAPITAL U', specials={'font',0x0055} }, + [0x1D449] = { unicodeslot=0x1D449, category='lu', description='MATHEMATICAL ITALIC CAPITAL V', specials={'font',0x0056} }, + [0x1D44A] = { unicodeslot=0x1D44A, category='lu', description='MATHEMATICAL ITALIC CAPITAL W', specials={'font',0x0057} }, + [0x1D44B] = { unicodeslot=0x1D44B, category='lu', description='MATHEMATICAL ITALIC CAPITAL X', specials={'font',0x0058} }, + [0x1D44C] = { unicodeslot=0x1D44C, category='lu', description='MATHEMATICAL ITALIC CAPITAL Y', specials={'font',0x0059} }, + [0x1D44D] = { unicodeslot=0x1D44D, category='lu', description='MATHEMATICAL ITALIC CAPITAL Z', specials={'font',0x005A} }, + [0x1D44E] = { unicodeslot=0x1D44E, category='ll', description='MATHEMATICAL ITALIC SMALL A', specials={'font',0x0061} }, + [0x1D44F] = { unicodeslot=0x1D44F, category='ll', description='MATHEMATICAL ITALIC SMALL B', specials={'font',0x0062} }, + [0x1D450] = { unicodeslot=0x1D450, category='ll', description='MATHEMATICAL ITALIC SMALL C', specials={'font',0x0063} }, + [0x1D451] = { unicodeslot=0x1D451, category='ll', description='MATHEMATICAL ITALIC SMALL D', specials={'font',0x0064} }, + [0x1D452] = { unicodeslot=0x1D452, category='ll', description='MATHEMATICAL ITALIC SMALL E', specials={'font',0x0065} }, + [0x1D453] = { unicodeslot=0x1D453, category='ll', description='MATHEMATICAL ITALIC SMALL F', specials={'font',0x0066} }, + [0x1D454] = { unicodeslot=0x1D454, category='ll', description='MATHEMATICAL ITALIC SMALL G', specials={'font',0x0067} }, + [0x1D456] = { unicodeslot=0x1D456, category='ll', description='MATHEMATICAL ITALIC SMALL I', specials={'font',0x0069} }, + [0x1D457] = { unicodeslot=0x1D457, category='ll', description='MATHEMATICAL ITALIC SMALL J', specials={'font',0x006A} }, + [0x1D458] = { unicodeslot=0x1D458, category='ll', description='MATHEMATICAL ITALIC SMALL K', specials={'font',0x006B} }, + [0x1D459] = { unicodeslot=0x1D459, category='ll', description='MATHEMATICAL ITALIC SMALL L', specials={'font',0x006C} }, + [0x1D45A] = { unicodeslot=0x1D45A, category='ll', description='MATHEMATICAL ITALIC SMALL M', specials={'font',0x006D} }, + [0x1D45B] = { unicodeslot=0x1D45B, category='ll', description='MATHEMATICAL ITALIC SMALL N', specials={'font',0x006E} }, + [0x1D45C] = { unicodeslot=0x1D45C, category='ll', description='MATHEMATICAL ITALIC SMALL O', specials={'font',0x006F} }, + [0x1D45D] = { unicodeslot=0x1D45D, category='ll', description='MATHEMATICAL ITALIC SMALL P', specials={'font',0x0070} }, + [0x1D45E] = { unicodeslot=0x1D45E, category='ll', description='MATHEMATICAL ITALIC SMALL Q', specials={'font',0x0071} }, + [0x1D45F] = { unicodeslot=0x1D45F, category='ll', description='MATHEMATICAL ITALIC SMALL R', specials={'font',0x0072} }, + [0x1D460] = { unicodeslot=0x1D460, category='ll', description='MATHEMATICAL ITALIC SMALL S', specials={'font',0x0073} }, + [0x1D461] = { unicodeslot=0x1D461, category='ll', description='MATHEMATICAL ITALIC SMALL T', specials={'font',0x0074} }, + [0x1D462] = { unicodeslot=0x1D462, category='ll', description='MATHEMATICAL ITALIC SMALL U', specials={'font',0x0075} }, + [0x1D463] = { unicodeslot=0x1D463, category='ll', description='MATHEMATICAL ITALIC SMALL V', specials={'font',0x0076} }, + [0x1D464] = { unicodeslot=0x1D464, category='ll', description='MATHEMATICAL ITALIC SMALL W', specials={'font',0x0077} }, + [0x1D465] = { unicodeslot=0x1D465, category='ll', description='MATHEMATICAL ITALIC SMALL X', specials={'font',0x0078} }, + [0x1D466] = { unicodeslot=0x1D466, category='ll', description='MATHEMATICAL ITALIC SMALL Y', specials={'font',0x0079} }, + [0x1D467] = { unicodeslot=0x1D467, category='ll', description='MATHEMATICAL ITALIC SMALL Z', specials={'font',0x007A} }, + [0x1D468] = { unicodeslot=0x1D468, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL A', specials={'font',0x0041} }, + [0x1D469] = { unicodeslot=0x1D469, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL B', specials={'font',0x0042} }, + [0x1D46A] = { unicodeslot=0x1D46A, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL C', specials={'font',0x0043} }, + [0x1D46B] = { unicodeslot=0x1D46B, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL D', specials={'font',0x0044} }, + [0x1D46C] = { unicodeslot=0x1D46C, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL E', specials={'font',0x0045} }, + [0x1D46D] = { unicodeslot=0x1D46D, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL F', specials={'font',0x0046} }, + [0x1D46E] = { unicodeslot=0x1D46E, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL G', specials={'font',0x0047} }, + [0x1D46F] = { unicodeslot=0x1D46F, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL H', specials={'font',0x0048} }, + [0x1D470] = { unicodeslot=0x1D470, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL I', specials={'font',0x0049} }, + [0x1D471] = { unicodeslot=0x1D471, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL J', specials={'font',0x004A} }, + [0x1D472] = { unicodeslot=0x1D472, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL K', specials={'font',0x004B} }, + [0x1D473] = { unicodeslot=0x1D473, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL L', specials={'font',0x004C} }, + [0x1D474] = { unicodeslot=0x1D474, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL M', specials={'font',0x004D} }, + [0x1D475] = { unicodeslot=0x1D475, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL N', specials={'font',0x004E} }, + [0x1D476] = { unicodeslot=0x1D476, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL O', specials={'font',0x004F} }, + [0x1D477] = { unicodeslot=0x1D477, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL P', specials={'font',0x0050} }, + [0x1D478] = { unicodeslot=0x1D478, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL Q', specials={'font',0x0051} }, + [0x1D479] = { unicodeslot=0x1D479, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL R', specials={'font',0x0052} }, + [0x1D47A] = { unicodeslot=0x1D47A, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL S', specials={'font',0x0053} }, + [0x1D47B] = { unicodeslot=0x1D47B, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL T', specials={'font',0x0054} }, + [0x1D47C] = { unicodeslot=0x1D47C, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL U', specials={'font',0x0055} }, + [0x1D47D] = { unicodeslot=0x1D47D, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL V', specials={'font',0x0056} }, + [0x1D47E] = { unicodeslot=0x1D47E, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL W', specials={'font',0x0057} }, + [0x1D47F] = { unicodeslot=0x1D47F, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL X', specials={'font',0x0058} }, + [0x1D480] = { unicodeslot=0x1D480, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL Y', specials={'font',0x0059} }, + [0x1D481] = { unicodeslot=0x1D481, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL Z', specials={'font',0x005A} }, + [0x1D482] = { unicodeslot=0x1D482, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL A', specials={'font',0x0061} }, + [0x1D483] = { unicodeslot=0x1D483, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL B', specials={'font',0x0062} }, + [0x1D484] = { unicodeslot=0x1D484, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL C', specials={'font',0x0063} }, + [0x1D485] = { unicodeslot=0x1D485, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL D', specials={'font',0x0064} }, + [0x1D486] = { unicodeslot=0x1D486, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL E', specials={'font',0x0065} }, + [0x1D487] = { unicodeslot=0x1D487, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL F', specials={'font',0x0066} }, + [0x1D488] = { unicodeslot=0x1D488, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL G', specials={'font',0x0067} }, + [0x1D489] = { unicodeslot=0x1D489, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL H', specials={'font',0x0068} }, + [0x1D48A] = { unicodeslot=0x1D48A, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL I', specials={'font',0x0069} }, + [0x1D48B] = { unicodeslot=0x1D48B, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL J', specials={'font',0x006A} }, + [0x1D48C] = { unicodeslot=0x1D48C, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL K', specials={'font',0x006B} }, + [0x1D48D] = { unicodeslot=0x1D48D, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL L', specials={'font',0x006C} }, + [0x1D48E] = { unicodeslot=0x1D48E, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL M', specials={'font',0x006D} }, + [0x1D48F] = { unicodeslot=0x1D48F, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL N', specials={'font',0x006E} }, + [0x1D490] = { unicodeslot=0x1D490, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL O', specials={'font',0x006F} }, + [0x1D491] = { unicodeslot=0x1D491, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL P', specials={'font',0x0070} }, + [0x1D492] = { unicodeslot=0x1D492, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL Q', specials={'font',0x0071} }, + [0x1D493] = { unicodeslot=0x1D493, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL R', specials={'font',0x0072} }, + [0x1D494] = { unicodeslot=0x1D494, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL S', specials={'font',0x0073} }, + [0x1D495] = { unicodeslot=0x1D495, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL T', specials={'font',0x0074} }, + [0x1D496] = { unicodeslot=0x1D496, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL U', specials={'font',0x0075} }, + [0x1D497] = { unicodeslot=0x1D497, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL V', specials={'font',0x0076} }, + [0x1D498] = { unicodeslot=0x1D498, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL W', specials={'font',0x0077} }, + [0x1D499] = { unicodeslot=0x1D499, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL X', specials={'font',0x0078} }, + [0x1D49A] = { unicodeslot=0x1D49A, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL Y', specials={'font',0x0079} }, + [0x1D49B] = { unicodeslot=0x1D49B, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL Z', specials={'font',0x007A} }, + [0x1D49C] = { unicodeslot=0x1D49C, category='lu', description='MATHEMATICAL SCRIPT CAPITAL A', specials={'font',0x0041} }, + [0x1D49E] = { unicodeslot=0x1D49E, category='lu', description='MATHEMATICAL SCRIPT CAPITAL C', specials={'font',0x0043} }, + [0x1D49F] = { unicodeslot=0x1D49F, category='lu', description='MATHEMATICAL SCRIPT CAPITAL D', specials={'font',0x0044} }, + [0x1D4A2] = { unicodeslot=0x1D4A2, category='lu', description='MATHEMATICAL SCRIPT CAPITAL G', specials={'font',0x0047} }, + [0x1D4A5] = { unicodeslot=0x1D4A5, category='lu', description='MATHEMATICAL SCRIPT CAPITAL J', specials={'font',0x004A} }, + [0x1D4A6] = { unicodeslot=0x1D4A6, category='lu', description='MATHEMATICAL SCRIPT CAPITAL K', specials={'font',0x004B} }, + [0x1D4A9] = { unicodeslot=0x1D4A9, category='lu', description='MATHEMATICAL SCRIPT CAPITAL N', specials={'font',0x004E} }, + [0x1D4AA] = { unicodeslot=0x1D4AA, category='lu', description='MATHEMATICAL SCRIPT CAPITAL O', specials={'font',0x004F} }, + [0x1D4AB] = { unicodeslot=0x1D4AB, category='lu', description='MATHEMATICAL SCRIPT CAPITAL P', specials={'font',0x0050} }, + [0x1D4AC] = { unicodeslot=0x1D4AC, category='lu', description='MATHEMATICAL SCRIPT CAPITAL Q', specials={'font',0x0051} }, + [0x1D4AE] = { unicodeslot=0x1D4AE, category='lu', description='MATHEMATICAL SCRIPT CAPITAL S', specials={'font',0x0053} }, + [0x1D4AF] = { unicodeslot=0x1D4AF, category='lu', description='MATHEMATICAL SCRIPT CAPITAL T', specials={'font',0x0054} }, + [0x1D4B0] = { unicodeslot=0x1D4B0, category='lu', description='MATHEMATICAL SCRIPT CAPITAL U', specials={'font',0x0055} }, + [0x1D4B1] = { unicodeslot=0x1D4B1, category='lu', description='MATHEMATICAL SCRIPT CAPITAL V', specials={'font',0x0056} }, + [0x1D4B2] = { unicodeslot=0x1D4B2, category='lu', description='MATHEMATICAL SCRIPT CAPITAL W', specials={'font',0x0057} }, + [0x1D4B3] = { unicodeslot=0x1D4B3, category='lu', description='MATHEMATICAL SCRIPT CAPITAL X', specials={'font',0x0058} }, + [0x1D4B4] = { unicodeslot=0x1D4B4, category='lu', description='MATHEMATICAL SCRIPT CAPITAL Y', specials={'font',0x0059} }, + [0x1D4B5] = { unicodeslot=0x1D4B5, category='lu', description='MATHEMATICAL SCRIPT CAPITAL Z', specials={'font',0x005A} }, + [0x1D4B6] = { unicodeslot=0x1D4B6, category='ll', description='MATHEMATICAL SCRIPT SMALL A', specials={'font',0x0061} }, + [0x1D4B7] = { unicodeslot=0x1D4B7, category='ll', description='MATHEMATICAL SCRIPT SMALL B', specials={'font',0x0062} }, + [0x1D4B8] = { unicodeslot=0x1D4B8, category='ll', description='MATHEMATICAL SCRIPT SMALL C', specials={'font',0x0063} }, + [0x1D4B9] = { unicodeslot=0x1D4B9, category='ll', description='MATHEMATICAL SCRIPT SMALL D', specials={'font',0x0064} }, + [0x1D4BB] = { unicodeslot=0x1D4BB, category='ll', description='MATHEMATICAL SCRIPT SMALL F', specials={'font',0x0066} }, + [0x1D4BD] = { unicodeslot=0x1D4BD, category='ll', description='MATHEMATICAL SCRIPT SMALL H', specials={'font',0x0068} }, + [0x1D4BE] = { unicodeslot=0x1D4BE, category='ll', description='MATHEMATICAL SCRIPT SMALL I', specials={'font',0x0069} }, + [0x1D4BF] = { unicodeslot=0x1D4BF, category='ll', description='MATHEMATICAL SCRIPT SMALL J', specials={'font',0x006A} }, + [0x1D4C0] = { unicodeslot=0x1D4C0, category='ll', description='MATHEMATICAL SCRIPT SMALL K', specials={'font',0x006B} }, + [0x1D4C1] = { unicodeslot=0x1D4C1, category='ll', description='MATHEMATICAL SCRIPT SMALL L', specials={'font',0x006C} }, + [0x1D4C2] = { unicodeslot=0x1D4C2, category='ll', description='MATHEMATICAL SCRIPT SMALL M', specials={'font',0x006D} }, + [0x1D4C3] = { unicodeslot=0x1D4C3, category='ll', description='MATHEMATICAL SCRIPT SMALL N', specials={'font',0x006E} }, + [0x1D4C5] = { unicodeslot=0x1D4C5, category='ll', description='MATHEMATICAL SCRIPT SMALL P', specials={'font',0x0070} }, + [0x1D4C6] = { unicodeslot=0x1D4C6, category='ll', description='MATHEMATICAL SCRIPT SMALL Q', specials={'font',0x0071} }, + [0x1D4C7] = { unicodeslot=0x1D4C7, category='ll', description='MATHEMATICAL SCRIPT SMALL R', specials={'font',0x0072} }, + [0x1D4C8] = { unicodeslot=0x1D4C8, category='ll', description='MATHEMATICAL SCRIPT SMALL S', specials={'font',0x0073} }, + [0x1D4C9] = { unicodeslot=0x1D4C9, category='ll', description='MATHEMATICAL SCRIPT SMALL T', specials={'font',0x0074} }, + [0x1D4CA] = { unicodeslot=0x1D4CA, category='ll', description='MATHEMATICAL SCRIPT SMALL U', specials={'font',0x0075} }, + [0x1D4CB] = { unicodeslot=0x1D4CB, category='ll', description='MATHEMATICAL SCRIPT SMALL V', specials={'font',0x0076} }, + [0x1D4CC] = { unicodeslot=0x1D4CC, category='ll', description='MATHEMATICAL SCRIPT SMALL W', specials={'font',0x0077} }, + [0x1D4CD] = { unicodeslot=0x1D4CD, category='ll', description='MATHEMATICAL SCRIPT SMALL X', specials={'font',0x0078} }, + [0x1D4CE] = { unicodeslot=0x1D4CE, category='ll', description='MATHEMATICAL SCRIPT SMALL Y', specials={'font',0x0079} }, + [0x1D4CF] = { unicodeslot=0x1D4CF, category='ll', description='MATHEMATICAL SCRIPT SMALL Z', specials={'font',0x007A} }, + [0x1D4D0] = { unicodeslot=0x1D4D0, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL A', specials={'font',0x0041} }, + [0x1D4D1] = { unicodeslot=0x1D4D1, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL B', specials={'font',0x0042} }, + [0x1D4D2] = { unicodeslot=0x1D4D2, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL C', specials={'font',0x0043} }, + [0x1D4D3] = { unicodeslot=0x1D4D3, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL D', specials={'font',0x0044} }, + [0x1D4D4] = { unicodeslot=0x1D4D4, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL E', specials={'font',0x0045} }, + [0x1D4D5] = { unicodeslot=0x1D4D5, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL F', specials={'font',0x0046} }, + [0x1D4D6] = { unicodeslot=0x1D4D6, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL G', specials={'font',0x0047} }, + [0x1D4D7] = { unicodeslot=0x1D4D7, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL H', specials={'font',0x0048} }, + [0x1D4D8] = { unicodeslot=0x1D4D8, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL I', specials={'font',0x0049} }, + [0x1D4D9] = { unicodeslot=0x1D4D9, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL J', specials={'font',0x004A} }, + [0x1D4DA] = { unicodeslot=0x1D4DA, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL K', specials={'font',0x004B} }, + [0x1D4DB] = { unicodeslot=0x1D4DB, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL L', specials={'font',0x004C} }, + [0x1D4DC] = { unicodeslot=0x1D4DC, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL M', specials={'font',0x004D} }, + [0x1D4DD] = { unicodeslot=0x1D4DD, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL N', specials={'font',0x004E} }, + [0x1D4DE] = { unicodeslot=0x1D4DE, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL O', specials={'font',0x004F} }, + [0x1D4DF] = { unicodeslot=0x1D4DF, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL P', specials={'font',0x0050} }, + [0x1D4E0] = { unicodeslot=0x1D4E0, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL Q', specials={'font',0x0051} }, + [0x1D4E1] = { unicodeslot=0x1D4E1, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL R', specials={'font',0x0052} }, + [0x1D4E2] = { unicodeslot=0x1D4E2, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL S', specials={'font',0x0053} }, + [0x1D4E3] = { unicodeslot=0x1D4E3, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL T', specials={'font',0x0054} }, + [0x1D4E4] = { unicodeslot=0x1D4E4, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL U', specials={'font',0x0055} }, + [0x1D4E5] = { unicodeslot=0x1D4E5, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL V', specials={'font',0x0056} }, + [0x1D4E6] = { unicodeslot=0x1D4E6, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL W', specials={'font',0x0057} }, + [0x1D4E7] = { unicodeslot=0x1D4E7, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL X', specials={'font',0x0058} }, + [0x1D4E8] = { unicodeslot=0x1D4E8, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL Y', specials={'font',0x0059} }, + [0x1D4E9] = { unicodeslot=0x1D4E9, category='lu', description='MATHEMATICAL BOLD SCRIPT CAPITAL Z', specials={'font',0x005A} }, + [0x1D4EA] = { unicodeslot=0x1D4EA, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL A', specials={'font',0x0061} }, + [0x1D4EB] = { unicodeslot=0x1D4EB, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL B', specials={'font',0x0062} }, + [0x1D4EC] = { unicodeslot=0x1D4EC, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL C', specials={'font',0x0063} }, + [0x1D4ED] = { unicodeslot=0x1D4ED, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL D', specials={'font',0x0064} }, + [0x1D4EE] = { unicodeslot=0x1D4EE, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL E', specials={'font',0x0065} }, + [0x1D4EF] = { unicodeslot=0x1D4EF, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL F', specials={'font',0x0066} }, + [0x1D4F0] = { unicodeslot=0x1D4F0, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL G', specials={'font',0x0067} }, + [0x1D4F1] = { unicodeslot=0x1D4F1, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL H', specials={'font',0x0068} }, + [0x1D4F2] = { unicodeslot=0x1D4F2, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL I', specials={'font',0x0069} }, + [0x1D4F3] = { unicodeslot=0x1D4F3, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL J', specials={'font',0x006A} }, + [0x1D4F4] = { unicodeslot=0x1D4F4, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL K', specials={'font',0x006B} }, + [0x1D4F5] = { unicodeslot=0x1D4F5, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL L', specials={'font',0x006C} }, + [0x1D4F6] = { unicodeslot=0x1D4F6, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL M', specials={'font',0x006D} }, + [0x1D4F7] = { unicodeslot=0x1D4F7, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL N', specials={'font',0x006E} }, + [0x1D4F8] = { unicodeslot=0x1D4F8, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL O', specials={'font',0x006F} }, + [0x1D4F9] = { unicodeslot=0x1D4F9, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL P', specials={'font',0x0070} }, + [0x1D4FA] = { unicodeslot=0x1D4FA, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL Q', specials={'font',0x0071} }, + [0x1D4FB] = { unicodeslot=0x1D4FB, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL R', specials={'font',0x0072} }, + [0x1D4FC] = { unicodeslot=0x1D4FC, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL S', specials={'font',0x0073} }, + [0x1D4FD] = { unicodeslot=0x1D4FD, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL T', specials={'font',0x0074} }, + [0x1D4FE] = { unicodeslot=0x1D4FE, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL U', specials={'font',0x0075} }, + [0x1D4FF] = { unicodeslot=0x1D4FF, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL V', specials={'font',0x0076} }, + [0x1D500] = { unicodeslot=0x1D500, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL W', specials={'font',0x0077} }, + [0x1D501] = { unicodeslot=0x1D501, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL X', specials={'font',0x0078} }, + [0x1D502] = { unicodeslot=0x1D502, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL Y', specials={'font',0x0079} }, + [0x1D503] = { unicodeslot=0x1D503, category='ll', description='MATHEMATICAL BOLD SCRIPT SMALL Z', specials={'font',0x007A} }, + [0x1D504] = { unicodeslot=0x1D504, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL A', specials={'font',0x0041} }, + [0x1D505] = { unicodeslot=0x1D505, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL B', specials={'font',0x0042} }, + [0x1D507] = { unicodeslot=0x1D507, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL D', specials={'font',0x0044} }, + [0x1D508] = { unicodeslot=0x1D508, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL E', specials={'font',0x0045} }, + [0x1D509] = { unicodeslot=0x1D509, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL F', specials={'font',0x0046} }, + [0x1D50A] = { unicodeslot=0x1D50A, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL G', specials={'font',0x0047} }, + [0x1D50D] = { unicodeslot=0x1D50D, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL J', specials={'font',0x004A} }, + [0x1D50E] = { unicodeslot=0x1D50E, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL K', specials={'font',0x004B} }, + [0x1D50F] = { unicodeslot=0x1D50F, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL L', specials={'font',0x004C} }, + [0x1D510] = { unicodeslot=0x1D510, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL M', specials={'font',0x004D} }, + [0x1D511] = { unicodeslot=0x1D511, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL N', specials={'font',0x004E} }, + [0x1D512] = { unicodeslot=0x1D512, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL O', specials={'font',0x004F} }, + [0x1D513] = { unicodeslot=0x1D513, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL P', specials={'font',0x0050} }, + [0x1D514] = { unicodeslot=0x1D514, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL Q', specials={'font',0x0051} }, + [0x1D516] = { unicodeslot=0x1D516, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL S', specials={'font',0x0053} }, + [0x1D517] = { unicodeslot=0x1D517, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL T', specials={'font',0x0054} }, + [0x1D518] = { unicodeslot=0x1D518, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL U', specials={'font',0x0055} }, + [0x1D519] = { unicodeslot=0x1D519, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL V', specials={'font',0x0056} }, + [0x1D51A] = { unicodeslot=0x1D51A, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL W', specials={'font',0x0057} }, + [0x1D51B] = { unicodeslot=0x1D51B, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL X', specials={'font',0x0058} }, + [0x1D51C] = { unicodeslot=0x1D51C, category='lu', description='MATHEMATICAL FRAKTUR CAPITAL Y', specials={'font',0x0059} }, + [0x1D51E] = { unicodeslot=0x1D51E, category='ll', description='MATHEMATICAL FRAKTUR SMALL A', specials={'font',0x0061} }, + [0x1D51F] = { unicodeslot=0x1D51F, category='ll', description='MATHEMATICAL FRAKTUR SMALL B', specials={'font',0x0062} }, + [0x1D520] = { unicodeslot=0x1D520, category='ll', description='MATHEMATICAL FRAKTUR SMALL C', specials={'font',0x0063} }, + [0x1D521] = { unicodeslot=0x1D521, category='ll', description='MATHEMATICAL FRAKTUR SMALL D', specials={'font',0x0064} }, + [0x1D522] = { unicodeslot=0x1D522, category='ll', description='MATHEMATICAL FRAKTUR SMALL E', specials={'font',0x0065} }, + [0x1D523] = { unicodeslot=0x1D523, category='ll', description='MATHEMATICAL FRAKTUR SMALL F', specials={'font',0x0066} }, + [0x1D524] = { unicodeslot=0x1D524, category='ll', description='MATHEMATICAL FRAKTUR SMALL G', specials={'font',0x0067} }, + [0x1D525] = { unicodeslot=0x1D525, category='ll', description='MATHEMATICAL FRAKTUR SMALL H', specials={'font',0x0068} }, + [0x1D526] = { unicodeslot=0x1D526, category='ll', description='MATHEMATICAL FRAKTUR SMALL I', specials={'font',0x0069} }, + [0x1D527] = { unicodeslot=0x1D527, category='ll', description='MATHEMATICAL FRAKTUR SMALL J', specials={'font',0x006A} }, + [0x1D528] = { unicodeslot=0x1D528, category='ll', description='MATHEMATICAL FRAKTUR SMALL K', specials={'font',0x006B} }, + [0x1D529] = { unicodeslot=0x1D529, category='ll', description='MATHEMATICAL FRAKTUR SMALL L', specials={'font',0x006C} }, + [0x1D52A] = { unicodeslot=0x1D52A, category='ll', description='MATHEMATICAL FRAKTUR SMALL M', specials={'font',0x006D} }, + [0x1D52B] = { unicodeslot=0x1D52B, category='ll', description='MATHEMATICAL FRAKTUR SMALL N', specials={'font',0x006E} }, + [0x1D52C] = { unicodeslot=0x1D52C, category='ll', description='MATHEMATICAL FRAKTUR SMALL O', specials={'font',0x006F} }, + [0x1D52D] = { unicodeslot=0x1D52D, category='ll', description='MATHEMATICAL FRAKTUR SMALL P', specials={'font',0x0070} }, + [0x1D52E] = { unicodeslot=0x1D52E, category='ll', description='MATHEMATICAL FRAKTUR SMALL Q', specials={'font',0x0071} }, + [0x1D52F] = { unicodeslot=0x1D52F, category='ll', description='MATHEMATICAL FRAKTUR SMALL R', specials={'font',0x0072} }, + [0x1D530] = { unicodeslot=0x1D530, category='ll', description='MATHEMATICAL FRAKTUR SMALL S', specials={'font',0x0073} }, + [0x1D531] = { unicodeslot=0x1D531, category='ll', description='MATHEMATICAL FRAKTUR SMALL T', specials={'font',0x0074} }, + [0x1D532] = { unicodeslot=0x1D532, category='ll', description='MATHEMATICAL FRAKTUR SMALL U', specials={'font',0x0075} }, + [0x1D533] = { unicodeslot=0x1D533, category='ll', description='MATHEMATICAL FRAKTUR SMALL V', specials={'font',0x0076} }, + [0x1D534] = { unicodeslot=0x1D534, category='ll', description='MATHEMATICAL FRAKTUR SMALL W', specials={'font',0x0077} }, + [0x1D535] = { unicodeslot=0x1D535, category='ll', description='MATHEMATICAL FRAKTUR SMALL X', specials={'font',0x0078} }, + [0x1D536] = { unicodeslot=0x1D536, category='ll', description='MATHEMATICAL FRAKTUR SMALL Y', specials={'font',0x0079} }, + [0x1D537] = { unicodeslot=0x1D537, category='ll', description='MATHEMATICAL FRAKTUR SMALL Z', specials={'font',0x007A} }, + [0x1D538] = { unicodeslot=0x1D538, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL A', specials={'font',0x0041} }, + [0x1D539] = { unicodeslot=0x1D539, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL B', specials={'font',0x0042} }, + [0x1D53B] = { unicodeslot=0x1D53B, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL D', specials={'font',0x0044} }, + [0x1D53C] = { unicodeslot=0x1D53C, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL E', specials={'font',0x0045} }, + [0x1D53D] = { unicodeslot=0x1D53D, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL F', specials={'font',0x0046} }, + [0x1D53E] = { unicodeslot=0x1D53E, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL G', specials={'font',0x0047} }, + [0x1D540] = { unicodeslot=0x1D540, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL I', specials={'font',0x0049} }, + [0x1D541] = { unicodeslot=0x1D541, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL J', specials={'font',0x004A} }, + [0x1D542] = { unicodeslot=0x1D542, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL K', specials={'font',0x004B} }, + [0x1D543] = { unicodeslot=0x1D543, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL L', specials={'font',0x004C} }, + [0x1D544] = { unicodeslot=0x1D544, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL M', specials={'font',0x004D} }, + [0x1D546] = { unicodeslot=0x1D546, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL O', specials={'font',0x004F} }, + [0x1D54A] = { unicodeslot=0x1D54A, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL S', specials={'font',0x0053} }, + [0x1D54B] = { unicodeslot=0x1D54B, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL T', specials={'font',0x0054} }, + [0x1D54C] = { unicodeslot=0x1D54C, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL U', specials={'font',0x0055} }, + [0x1D54D] = { unicodeslot=0x1D54D, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL V', specials={'font',0x0056} }, + [0x1D54E] = { unicodeslot=0x1D54E, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL W', specials={'font',0x0057} }, + [0x1D54F] = { unicodeslot=0x1D54F, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL X', specials={'font',0x0058} }, + [0x1D550] = { unicodeslot=0x1D550, category='lu', description='MATHEMATICAL DOUBLE-STRUCK CAPITAL Y', specials={'font',0x0059} }, + [0x1D552] = { unicodeslot=0x1D552, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL A', specials={'font',0x0061} }, + [0x1D553] = { unicodeslot=0x1D553, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL B', specials={'font',0x0062} }, + [0x1D554] = { unicodeslot=0x1D554, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL C', specials={'font',0x0063} }, + [0x1D555] = { unicodeslot=0x1D555, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL D', specials={'font',0x0064} }, + [0x1D556] = { unicodeslot=0x1D556, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL E', specials={'font',0x0065} }, + [0x1D557] = { unicodeslot=0x1D557, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL F', specials={'font',0x0066} }, + [0x1D558] = { unicodeslot=0x1D558, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL G', specials={'font',0x0067} }, + [0x1D559] = { unicodeslot=0x1D559, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL H', specials={'font',0x0068} }, + [0x1D55A] = { unicodeslot=0x1D55A, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL I', specials={'font',0x0069} }, + [0x1D55B] = { unicodeslot=0x1D55B, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL J', specials={'font',0x006A} }, + [0x1D55C] = { unicodeslot=0x1D55C, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL K', specials={'font',0x006B} }, + [0x1D55D] = { unicodeslot=0x1D55D, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL L', specials={'font',0x006C} }, + [0x1D55E] = { unicodeslot=0x1D55E, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL M', specials={'font',0x006D} }, + [0x1D55F] = { unicodeslot=0x1D55F, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL N', specials={'font',0x006E} }, + [0x1D560] = { unicodeslot=0x1D560, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL O', specials={'font',0x006F} }, + [0x1D561] = { unicodeslot=0x1D561, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL P', specials={'font',0x0070} }, + [0x1D562] = { unicodeslot=0x1D562, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL Q', specials={'font',0x0071} }, + [0x1D563] = { unicodeslot=0x1D563, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL R', specials={'font',0x0072} }, + [0x1D564] = { unicodeslot=0x1D564, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL S', specials={'font',0x0073} }, + [0x1D565] = { unicodeslot=0x1D565, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL T', specials={'font',0x0074} }, + [0x1D566] = { unicodeslot=0x1D566, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL U', specials={'font',0x0075} }, + [0x1D567] = { unicodeslot=0x1D567, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL V', specials={'font',0x0076} }, + [0x1D568] = { unicodeslot=0x1D568, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL W', specials={'font',0x0077} }, + [0x1D569] = { unicodeslot=0x1D569, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL X', specials={'font',0x0078} }, + [0x1D56A] = { unicodeslot=0x1D56A, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL Y', specials={'font',0x0079} }, + [0x1D56B] = { unicodeslot=0x1D56B, category='ll', description='MATHEMATICAL DOUBLE-STRUCK SMALL Z', specials={'font',0x007A} }, + [0x1D56C] = { unicodeslot=0x1D56C, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL A', specials={'font',0x0041} }, + [0x1D56D] = { unicodeslot=0x1D56D, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL B', specials={'font',0x0042} }, + [0x1D56E] = { unicodeslot=0x1D56E, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL C', specials={'font',0x0043} }, + [0x1D56F] = { unicodeslot=0x1D56F, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL D', specials={'font',0x0044} }, + [0x1D570] = { unicodeslot=0x1D570, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL E', specials={'font',0x0045} }, + [0x1D571] = { unicodeslot=0x1D571, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL F', specials={'font',0x0046} }, + [0x1D572] = { unicodeslot=0x1D572, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL G', specials={'font',0x0047} }, + [0x1D573] = { unicodeslot=0x1D573, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL H', specials={'font',0x0048} }, + [0x1D574] = { unicodeslot=0x1D574, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL I', specials={'font',0x0049} }, + [0x1D575] = { unicodeslot=0x1D575, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL J', specials={'font',0x004A} }, + [0x1D576] = { unicodeslot=0x1D576, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL K', specials={'font',0x004B} }, + [0x1D577] = { unicodeslot=0x1D577, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL L', specials={'font',0x004C} }, + [0x1D578] = { unicodeslot=0x1D578, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL M', specials={'font',0x004D} }, + [0x1D579] = { unicodeslot=0x1D579, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL N', specials={'font',0x004E} }, + [0x1D57A] = { unicodeslot=0x1D57A, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL O', specials={'font',0x004F} }, + [0x1D57B] = { unicodeslot=0x1D57B, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL P', specials={'font',0x0050} }, + [0x1D57C] = { unicodeslot=0x1D57C, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL Q', specials={'font',0x0051} }, + [0x1D57D] = { unicodeslot=0x1D57D, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL R', specials={'font',0x0052} }, + [0x1D57E] = { unicodeslot=0x1D57E, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL S', specials={'font',0x0053} }, + [0x1D57F] = { unicodeslot=0x1D57F, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL T', specials={'font',0x0054} }, + [0x1D580] = { unicodeslot=0x1D580, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL U', specials={'font',0x0055} }, + [0x1D581] = { unicodeslot=0x1D581, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL V', specials={'font',0x0056} }, + [0x1D582] = { unicodeslot=0x1D582, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL W', specials={'font',0x0057} }, + [0x1D583] = { unicodeslot=0x1D583, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL X', specials={'font',0x0058} }, + [0x1D584] = { unicodeslot=0x1D584, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL Y', specials={'font',0x0059} }, + [0x1D585] = { unicodeslot=0x1D585, category='lu', description='MATHEMATICAL BOLD FRAKTUR CAPITAL Z', specials={'font',0x005A} }, + [0x1D586] = { unicodeslot=0x1D586, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL A', specials={'font',0x0061} }, + [0x1D587] = { unicodeslot=0x1D587, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL B', specials={'font',0x0062} }, + [0x1D588] = { unicodeslot=0x1D588, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL C', specials={'font',0x0063} }, + [0x1D589] = { unicodeslot=0x1D589, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL D', specials={'font',0x0064} }, + [0x1D58A] = { unicodeslot=0x1D58A, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL E', specials={'font',0x0065} }, + [0x1D58B] = { unicodeslot=0x1D58B, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL F', specials={'font',0x0066} }, + [0x1D58C] = { unicodeslot=0x1D58C, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL G', specials={'font',0x0067} }, + [0x1D58D] = { unicodeslot=0x1D58D, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL H', specials={'font',0x0068} }, + [0x1D58E] = { unicodeslot=0x1D58E, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL I', specials={'font',0x0069} }, + [0x1D58F] = { unicodeslot=0x1D58F, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL J', specials={'font',0x006A} }, + [0x1D590] = { unicodeslot=0x1D590, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL K', specials={'font',0x006B} }, + [0x1D591] = { unicodeslot=0x1D591, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL L', specials={'font',0x006C} }, + [0x1D592] = { unicodeslot=0x1D592, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL M', specials={'font',0x006D} }, + [0x1D593] = { unicodeslot=0x1D593, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL N', specials={'font',0x006E} }, + [0x1D594] = { unicodeslot=0x1D594, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL O', specials={'font',0x006F} }, + [0x1D595] = { unicodeslot=0x1D595, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL P', specials={'font',0x0070} }, + [0x1D596] = { unicodeslot=0x1D596, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL Q', specials={'font',0x0071} }, + [0x1D597] = { unicodeslot=0x1D597, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL R', specials={'font',0x0072} }, + [0x1D598] = { unicodeslot=0x1D598, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL S', specials={'font',0x0073} }, + [0x1D599] = { unicodeslot=0x1D599, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL T', specials={'font',0x0074} }, + [0x1D59A] = { unicodeslot=0x1D59A, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL U', specials={'font',0x0075} }, + [0x1D59B] = { unicodeslot=0x1D59B, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL V', specials={'font',0x0076} }, + [0x1D59C] = { unicodeslot=0x1D59C, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL W', specials={'font',0x0077} }, + [0x1D59D] = { unicodeslot=0x1D59D, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL X', specials={'font',0x0078} }, + [0x1D59E] = { unicodeslot=0x1D59E, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL Y', specials={'font',0x0079} }, + [0x1D59F] = { unicodeslot=0x1D59F, category='ll', description='MATHEMATICAL BOLD FRAKTUR SMALL Z', specials={'font',0x007A} }, + [0x1D5A0] = { unicodeslot=0x1D5A0, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL A', specials={'font',0x0041} }, + [0x1D5A1] = { unicodeslot=0x1D5A1, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL B', specials={'font',0x0042} }, + [0x1D5A2] = { unicodeslot=0x1D5A2, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL C', specials={'font',0x0043} }, + [0x1D5A3] = { unicodeslot=0x1D5A3, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL D', specials={'font',0x0044} }, + [0x1D5A4] = { unicodeslot=0x1D5A4, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL E', specials={'font',0x0045} }, + [0x1D5A5] = { unicodeslot=0x1D5A5, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL F', specials={'font',0x0046} }, + [0x1D5A6] = { unicodeslot=0x1D5A6, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL G', specials={'font',0x0047} }, + [0x1D5A7] = { unicodeslot=0x1D5A7, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL H', specials={'font',0x0048} }, + [0x1D5A8] = { unicodeslot=0x1D5A8, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL I', specials={'font',0x0049} }, + [0x1D5A9] = { unicodeslot=0x1D5A9, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL J', specials={'font',0x004A} }, + [0x1D5AA] = { unicodeslot=0x1D5AA, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL K', specials={'font',0x004B} }, + [0x1D5AB] = { unicodeslot=0x1D5AB, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL L', specials={'font',0x004C} }, + [0x1D5AC] = { unicodeslot=0x1D5AC, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL M', specials={'font',0x004D} }, + [0x1D5AD] = { unicodeslot=0x1D5AD, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL N', specials={'font',0x004E} }, + [0x1D5AE] = { unicodeslot=0x1D5AE, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL O', specials={'font',0x004F} }, + [0x1D5AF] = { unicodeslot=0x1D5AF, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL P', specials={'font',0x0050} }, + [0x1D5B0] = { unicodeslot=0x1D5B0, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL Q', specials={'font',0x0051} }, + [0x1D5B1] = { unicodeslot=0x1D5B1, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL R', specials={'font',0x0052} }, + [0x1D5B2] = { unicodeslot=0x1D5B2, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL S', specials={'font',0x0053} }, + [0x1D5B3] = { unicodeslot=0x1D5B3, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL T', specials={'font',0x0054} }, + [0x1D5B4] = { unicodeslot=0x1D5B4, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL U', specials={'font',0x0055} }, + [0x1D5B5] = { unicodeslot=0x1D5B5, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL V', specials={'font',0x0056} }, + [0x1D5B6] = { unicodeslot=0x1D5B6, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL W', specials={'font',0x0057} }, + [0x1D5B7] = { unicodeslot=0x1D5B7, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL X', specials={'font',0x0058} }, + [0x1D5B8] = { unicodeslot=0x1D5B8, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL Y', specials={'font',0x0059} }, + [0x1D5B9] = { unicodeslot=0x1D5B9, category='lu', description='MATHEMATICAL SANS-SERIF CAPITAL Z', specials={'font',0x005A} }, + [0x1D5BA] = { unicodeslot=0x1D5BA, category='ll', description='MATHEMATICAL SANS-SERIF SMALL A', specials={'font',0x0061} }, + [0x1D5BB] = { unicodeslot=0x1D5BB, category='ll', description='MATHEMATICAL SANS-SERIF SMALL B', specials={'font',0x0062} }, + [0x1D5BC] = { unicodeslot=0x1D5BC, category='ll', description='MATHEMATICAL SANS-SERIF SMALL C', specials={'font',0x0063} }, + [0x1D5BD] = { unicodeslot=0x1D5BD, category='ll', description='MATHEMATICAL SANS-SERIF SMALL D', specials={'font',0x0064} }, + [0x1D5BE] = { unicodeslot=0x1D5BE, category='ll', description='MATHEMATICAL SANS-SERIF SMALL E', specials={'font',0x0065} }, + [0x1D5BF] = { unicodeslot=0x1D5BF, category='ll', description='MATHEMATICAL SANS-SERIF SMALL F', specials={'font',0x0066} }, + [0x1D5C0] = { unicodeslot=0x1D5C0, category='ll', description='MATHEMATICAL SANS-SERIF SMALL G', specials={'font',0x0067} }, + [0x1D5C1] = { unicodeslot=0x1D5C1, category='ll', description='MATHEMATICAL SANS-SERIF SMALL H', specials={'font',0x0068} }, + [0x1D5C2] = { unicodeslot=0x1D5C2, category='ll', description='MATHEMATICAL SANS-SERIF SMALL I', specials={'font',0x0069} }, + [0x1D5C3] = { unicodeslot=0x1D5C3, category='ll', description='MATHEMATICAL SANS-SERIF SMALL J', specials={'font',0x006A} }, + [0x1D5C4] = { unicodeslot=0x1D5C4, category='ll', description='MATHEMATICAL SANS-SERIF SMALL K', specials={'font',0x006B} }, + [0x1D5C5] = { unicodeslot=0x1D5C5, category='ll', description='MATHEMATICAL SANS-SERIF SMALL L', specials={'font',0x006C} }, + [0x1D5C6] = { unicodeslot=0x1D5C6, category='ll', description='MATHEMATICAL SANS-SERIF SMALL M', specials={'font',0x006D} }, + [0x1D5C7] = { unicodeslot=0x1D5C7, category='ll', description='MATHEMATICAL SANS-SERIF SMALL N', specials={'font',0x006E} }, + [0x1D5C8] = { unicodeslot=0x1D5C8, category='ll', description='MATHEMATICAL SANS-SERIF SMALL O', specials={'font',0x006F} }, + [0x1D5C9] = { unicodeslot=0x1D5C9, category='ll', description='MATHEMATICAL SANS-SERIF SMALL P', specials={'font',0x0070} }, + [0x1D5CA] = { unicodeslot=0x1D5CA, category='ll', description='MATHEMATICAL SANS-SERIF SMALL Q', specials={'font',0x0071} }, + [0x1D5CB] = { unicodeslot=0x1D5CB, category='ll', description='MATHEMATICAL SANS-SERIF SMALL R', specials={'font',0x0072} }, + [0x1D5CC] = { unicodeslot=0x1D5CC, category='ll', description='MATHEMATICAL SANS-SERIF SMALL S', specials={'font',0x0073} }, + [0x1D5CD] = { unicodeslot=0x1D5CD, category='ll', description='MATHEMATICAL SANS-SERIF SMALL T', specials={'font',0x0074} }, + [0x1D5CE] = { unicodeslot=0x1D5CE, category='ll', description='MATHEMATICAL SANS-SERIF SMALL U', specials={'font',0x0075} }, + [0x1D5CF] = { unicodeslot=0x1D5CF, category='ll', description='MATHEMATICAL SANS-SERIF SMALL V', specials={'font',0x0076} }, + [0x1D5D0] = { unicodeslot=0x1D5D0, category='ll', description='MATHEMATICAL SANS-SERIF SMALL W', specials={'font',0x0077} }, + [0x1D5D1] = { unicodeslot=0x1D5D1, category='ll', description='MATHEMATICAL SANS-SERIF SMALL X', specials={'font',0x0078} }, + [0x1D5D2] = { unicodeslot=0x1D5D2, category='ll', description='MATHEMATICAL SANS-SERIF SMALL Y', specials={'font',0x0079} }, + [0x1D5D3] = { unicodeslot=0x1D5D3, category='ll', description='MATHEMATICAL SANS-SERIF SMALL Z', specials={'font',0x007A} }, + [0x1D5D4] = { unicodeslot=0x1D5D4, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL A', specials={'font',0x0041} }, + [0x1D5D5] = { unicodeslot=0x1D5D5, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL B', specials={'font',0x0042} }, + [0x1D5D6] = { unicodeslot=0x1D5D6, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL C', specials={'font',0x0043} }, + [0x1D5D7] = { unicodeslot=0x1D5D7, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL D', specials={'font',0x0044} }, + [0x1D5D8] = { unicodeslot=0x1D5D8, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL E', specials={'font',0x0045} }, + [0x1D5D9] = { unicodeslot=0x1D5D9, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL F', specials={'font',0x0046} }, + [0x1D5DA] = { unicodeslot=0x1D5DA, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL G', specials={'font',0x0047} }, + [0x1D5DB] = { unicodeslot=0x1D5DB, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL H', specials={'font',0x0048} }, + [0x1D5DC] = { unicodeslot=0x1D5DC, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL I', specials={'font',0x0049} }, + [0x1D5DD] = { unicodeslot=0x1D5DD, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL J', specials={'font',0x004A} }, + [0x1D5DE] = { unicodeslot=0x1D5DE, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL K', specials={'font',0x004B} }, + [0x1D5DF] = { unicodeslot=0x1D5DF, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL L', specials={'font',0x004C} }, + [0x1D5E0] = { unicodeslot=0x1D5E0, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL M', specials={'font',0x004D} }, + [0x1D5E1] = { unicodeslot=0x1D5E1, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL N', specials={'font',0x004E} }, + [0x1D5E2] = { unicodeslot=0x1D5E2, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL O', specials={'font',0x004F} }, + [0x1D5E3] = { unicodeslot=0x1D5E3, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL P', specials={'font',0x0050} }, + [0x1D5E4] = { unicodeslot=0x1D5E4, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL Q', specials={'font',0x0051} }, + [0x1D5E5] = { unicodeslot=0x1D5E5, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL R', specials={'font',0x0052} }, + [0x1D5E6] = { unicodeslot=0x1D5E6, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL S', specials={'font',0x0053} }, + [0x1D5E7] = { unicodeslot=0x1D5E7, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL T', specials={'font',0x0054} }, + [0x1D5E8] = { unicodeslot=0x1D5E8, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL U', specials={'font',0x0055} }, + [0x1D5E9] = { unicodeslot=0x1D5E9, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL V', specials={'font',0x0056} }, + [0x1D5EA] = { unicodeslot=0x1D5EA, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL W', specials={'font',0x0057} }, + [0x1D5EB] = { unicodeslot=0x1D5EB, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL X', specials={'font',0x0058} }, + [0x1D5EC] = { unicodeslot=0x1D5EC, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL Y', specials={'font',0x0059} }, + [0x1D5ED] = { unicodeslot=0x1D5ED, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL Z', specials={'font',0x005A} }, + [0x1D5EE] = { unicodeslot=0x1D5EE, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL A', specials={'font',0x0061} }, + [0x1D5EF] = { unicodeslot=0x1D5EF, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL B', specials={'font',0x0062} }, + [0x1D5F0] = { unicodeslot=0x1D5F0, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL C', specials={'font',0x0063} }, + [0x1D5F1] = { unicodeslot=0x1D5F1, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL D', specials={'font',0x0064} }, + [0x1D5F2] = { unicodeslot=0x1D5F2, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL E', specials={'font',0x0065} }, + [0x1D5F3] = { unicodeslot=0x1D5F3, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL F', specials={'font',0x0066} }, + [0x1D5F4] = { unicodeslot=0x1D5F4, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL G', specials={'font',0x0067} }, + [0x1D5F5] = { unicodeslot=0x1D5F5, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL H', specials={'font',0x0068} }, + [0x1D5F6] = { unicodeslot=0x1D5F6, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL I', specials={'font',0x0069} }, + [0x1D5F7] = { unicodeslot=0x1D5F7, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL J', specials={'font',0x006A} }, + [0x1D5F8] = { unicodeslot=0x1D5F8, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL K', specials={'font',0x006B} }, + [0x1D5F9] = { unicodeslot=0x1D5F9, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL L', specials={'font',0x006C} }, + [0x1D5FA] = { unicodeslot=0x1D5FA, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL M', specials={'font',0x006D} }, + [0x1D5FB] = { unicodeslot=0x1D5FB, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL N', specials={'font',0x006E} }, + [0x1D5FC] = { unicodeslot=0x1D5FC, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL O', specials={'font',0x006F} }, + [0x1D5FD] = { unicodeslot=0x1D5FD, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL P', specials={'font',0x0070} }, + [0x1D5FE] = { unicodeslot=0x1D5FE, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL Q', specials={'font',0x0071} }, + [0x1D5FF] = { unicodeslot=0x1D5FF, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL R', specials={'font',0x0072} }, + [0x1D600] = { unicodeslot=0x1D600, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL S', specials={'font',0x0073} }, + [0x1D601] = { unicodeslot=0x1D601, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL T', specials={'font',0x0074} }, + [0x1D602] = { unicodeslot=0x1D602, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL U', specials={'font',0x0075} }, + [0x1D603] = { unicodeslot=0x1D603, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL V', specials={'font',0x0076} }, + [0x1D604] = { unicodeslot=0x1D604, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL W', specials={'font',0x0077} }, + [0x1D605] = { unicodeslot=0x1D605, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL X', specials={'font',0x0078} }, + [0x1D606] = { unicodeslot=0x1D606, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL Y', specials={'font',0x0079} }, + [0x1D607] = { unicodeslot=0x1D607, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL Z', specials={'font',0x007A} }, + [0x1D608] = { unicodeslot=0x1D608, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL A', specials={'font',0x0041} }, + [0x1D609] = { unicodeslot=0x1D609, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL B', specials={'font',0x0042} }, + [0x1D60A] = { unicodeslot=0x1D60A, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL C', specials={'font',0x0043} }, + [0x1D60B] = { unicodeslot=0x1D60B, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL D', specials={'font',0x0044} }, + [0x1D60C] = { unicodeslot=0x1D60C, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL E', specials={'font',0x0045} }, + [0x1D60D] = { unicodeslot=0x1D60D, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL F', specials={'font',0x0046} }, + [0x1D60E] = { unicodeslot=0x1D60E, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL G', specials={'font',0x0047} }, + [0x1D60F] = { unicodeslot=0x1D60F, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL H', specials={'font',0x0048} }, + [0x1D610] = { unicodeslot=0x1D610, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL I', specials={'font',0x0049} }, + [0x1D611] = { unicodeslot=0x1D611, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL J', specials={'font',0x004A} }, + [0x1D612] = { unicodeslot=0x1D612, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL K', specials={'font',0x004B} }, + [0x1D613] = { unicodeslot=0x1D613, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL L', specials={'font',0x004C} }, + [0x1D614] = { unicodeslot=0x1D614, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL M', specials={'font',0x004D} }, + [0x1D615] = { unicodeslot=0x1D615, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL N', specials={'font',0x004E} }, + [0x1D616] = { unicodeslot=0x1D616, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL O', specials={'font',0x004F} }, + [0x1D617] = { unicodeslot=0x1D617, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL P', specials={'font',0x0050} }, + [0x1D618] = { unicodeslot=0x1D618, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL Q', specials={'font',0x0051} }, + [0x1D619] = { unicodeslot=0x1D619, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL R', specials={'font',0x0052} }, + [0x1D61A] = { unicodeslot=0x1D61A, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL S', specials={'font',0x0053} }, + [0x1D61B] = { unicodeslot=0x1D61B, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL T', specials={'font',0x0054} }, + [0x1D61C] = { unicodeslot=0x1D61C, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL U', specials={'font',0x0055} }, + [0x1D61D] = { unicodeslot=0x1D61D, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL V', specials={'font',0x0056} }, + [0x1D61E] = { unicodeslot=0x1D61E, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL W', specials={'font',0x0057} }, + [0x1D61F] = { unicodeslot=0x1D61F, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL X', specials={'font',0x0058} }, + [0x1D620] = { unicodeslot=0x1D620, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL Y', specials={'font',0x0059} }, + [0x1D621] = { unicodeslot=0x1D621, category='lu', description='MATHEMATICAL SANS-SERIF ITALIC CAPITAL Z', specials={'font',0x005A} }, + [0x1D622] = { unicodeslot=0x1D622, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL A', specials={'font',0x0061} }, + [0x1D623] = { unicodeslot=0x1D623, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL B', specials={'font',0x0062} }, + [0x1D624] = { unicodeslot=0x1D624, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL C', specials={'font',0x0063} }, + [0x1D625] = { unicodeslot=0x1D625, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL D', specials={'font',0x0064} }, + [0x1D626] = { unicodeslot=0x1D626, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL E', specials={'font',0x0065} }, + [0x1D627] = { unicodeslot=0x1D627, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL F', specials={'font',0x0066} }, + [0x1D628] = { unicodeslot=0x1D628, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL G', specials={'font',0x0067} }, + [0x1D629] = { unicodeslot=0x1D629, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL H', specials={'font',0x0068} }, + [0x1D62A] = { unicodeslot=0x1D62A, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL I', specials={'font',0x0069} }, + [0x1D62B] = { unicodeslot=0x1D62B, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL J', specials={'font',0x006A} }, + [0x1D62C] = { unicodeslot=0x1D62C, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL K', specials={'font',0x006B} }, + [0x1D62D] = { unicodeslot=0x1D62D, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL L', specials={'font',0x006C} }, + [0x1D62E] = { unicodeslot=0x1D62E, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL M', specials={'font',0x006D} }, + [0x1D62F] = { unicodeslot=0x1D62F, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL N', specials={'font',0x006E} }, + [0x1D630] = { unicodeslot=0x1D630, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL O', specials={'font',0x006F} }, + [0x1D631] = { unicodeslot=0x1D631, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL P', specials={'font',0x0070} }, + [0x1D632] = { unicodeslot=0x1D632, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL Q', specials={'font',0x0071} }, + [0x1D633] = { unicodeslot=0x1D633, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL R', specials={'font',0x0072} }, + [0x1D634] = { unicodeslot=0x1D634, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL S', specials={'font',0x0073} }, + [0x1D635] = { unicodeslot=0x1D635, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL T', specials={'font',0x0074} }, + [0x1D636] = { unicodeslot=0x1D636, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL U', specials={'font',0x0075} }, + [0x1D637] = { unicodeslot=0x1D637, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL V', specials={'font',0x0076} }, + [0x1D638] = { unicodeslot=0x1D638, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL W', specials={'font',0x0077} }, + [0x1D639] = { unicodeslot=0x1D639, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL X', specials={'font',0x0078} }, + [0x1D63A] = { unicodeslot=0x1D63A, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL Y', specials={'font',0x0079} }, + [0x1D63B] = { unicodeslot=0x1D63B, category='ll', description='MATHEMATICAL SANS-SERIF ITALIC SMALL Z', specials={'font',0x007A} }, + [0x1D63C] = { unicodeslot=0x1D63C, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL A', specials={'font',0x0041} }, + [0x1D63D] = { unicodeslot=0x1D63D, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL B', specials={'font',0x0042} }, + [0x1D63E] = { unicodeslot=0x1D63E, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL C', specials={'font',0x0043} }, + [0x1D63F] = { unicodeslot=0x1D63F, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL D', specials={'font',0x0044} }, + [0x1D640] = { unicodeslot=0x1D640, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL E', specials={'font',0x0045} }, + [0x1D641] = { unicodeslot=0x1D641, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL F', specials={'font',0x0046} }, + [0x1D642] = { unicodeslot=0x1D642, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL G', specials={'font',0x0047} }, + [0x1D643] = { unicodeslot=0x1D643, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL H', specials={'font',0x0048} }, + [0x1D644] = { unicodeslot=0x1D644, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL I', specials={'font',0x0049} }, + [0x1D645] = { unicodeslot=0x1D645, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL J', specials={'font',0x004A} }, + [0x1D646] = { unicodeslot=0x1D646, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL K', specials={'font',0x004B} }, + [0x1D647] = { unicodeslot=0x1D647, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL L', specials={'font',0x004C} }, + [0x1D648] = { unicodeslot=0x1D648, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL M', specials={'font',0x004D} }, + [0x1D649] = { unicodeslot=0x1D649, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL N', specials={'font',0x004E} }, + [0x1D64A] = { unicodeslot=0x1D64A, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL O', specials={'font',0x004F} }, + [0x1D64B] = { unicodeslot=0x1D64B, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL P', specials={'font',0x0050} }, + [0x1D64C] = { unicodeslot=0x1D64C, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Q', specials={'font',0x0051} }, + [0x1D64D] = { unicodeslot=0x1D64D, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL R', specials={'font',0x0052} }, + [0x1D64E] = { unicodeslot=0x1D64E, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL S', specials={'font',0x0053} }, + [0x1D64F] = { unicodeslot=0x1D64F, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL T', specials={'font',0x0054} }, + [0x1D650] = { unicodeslot=0x1D650, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL U', specials={'font',0x0055} }, + [0x1D651] = { unicodeslot=0x1D651, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL V', specials={'font',0x0056} }, + [0x1D652] = { unicodeslot=0x1D652, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL W', specials={'font',0x0057} }, + [0x1D653] = { unicodeslot=0x1D653, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL X', specials={'font',0x0058} }, + [0x1D654] = { unicodeslot=0x1D654, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Y', specials={'font',0x0059} }, + [0x1D655] = { unicodeslot=0x1D655, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL Z', specials={'font',0x005A} }, + [0x1D656] = { unicodeslot=0x1D656, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL A', specials={'font',0x0061} }, + [0x1D657] = { unicodeslot=0x1D657, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL B', specials={'font',0x0062} }, + [0x1D658] = { unicodeslot=0x1D658, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL C', specials={'font',0x0063} }, + [0x1D659] = { unicodeslot=0x1D659, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL D', specials={'font',0x0064} }, + [0x1D65A] = { unicodeslot=0x1D65A, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL E', specials={'font',0x0065} }, + [0x1D65B] = { unicodeslot=0x1D65B, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL F', specials={'font',0x0066} }, + [0x1D65C] = { unicodeslot=0x1D65C, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL G', specials={'font',0x0067} }, + [0x1D65D] = { unicodeslot=0x1D65D, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL H', specials={'font',0x0068} }, + [0x1D65E] = { unicodeslot=0x1D65E, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL I', specials={'font',0x0069} }, + [0x1D65F] = { unicodeslot=0x1D65F, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL J', specials={'font',0x006A} }, + [0x1D660] = { unicodeslot=0x1D660, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL K', specials={'font',0x006B} }, + [0x1D661] = { unicodeslot=0x1D661, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL L', specials={'font',0x006C} }, + [0x1D662] = { unicodeslot=0x1D662, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL M', specials={'font',0x006D} }, + [0x1D663] = { unicodeslot=0x1D663, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL N', specials={'font',0x006E} }, + [0x1D664] = { unicodeslot=0x1D664, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL O', specials={'font',0x006F} }, + [0x1D665] = { unicodeslot=0x1D665, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL P', specials={'font',0x0070} }, + [0x1D666] = { unicodeslot=0x1D666, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Q', specials={'font',0x0071} }, + [0x1D667] = { unicodeslot=0x1D667, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL R', specials={'font',0x0072} }, + [0x1D668] = { unicodeslot=0x1D668, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL S', specials={'font',0x0073} }, + [0x1D669] = { unicodeslot=0x1D669, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL T', specials={'font',0x0074} }, + [0x1D66A] = { unicodeslot=0x1D66A, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL U', specials={'font',0x0075} }, + [0x1D66B] = { unicodeslot=0x1D66B, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL V', specials={'font',0x0076} }, + [0x1D66C] = { unicodeslot=0x1D66C, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL W', specials={'font',0x0077} }, + [0x1D66D] = { unicodeslot=0x1D66D, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL X', specials={'font',0x0078} }, + [0x1D66E] = { unicodeslot=0x1D66E, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Y', specials={'font',0x0079} }, + [0x1D66F] = { unicodeslot=0x1D66F, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL Z', specials={'font',0x007A} }, + [0x1D670] = { unicodeslot=0x1D670, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL A', specials={'font',0x0041} }, + [0x1D671] = { unicodeslot=0x1D671, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL B', specials={'font',0x0042} }, + [0x1D672] = { unicodeslot=0x1D672, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL C', specials={'font',0x0043} }, + [0x1D673] = { unicodeslot=0x1D673, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL D', specials={'font',0x0044} }, + [0x1D674] = { unicodeslot=0x1D674, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL E', specials={'font',0x0045} }, + [0x1D675] = { unicodeslot=0x1D675, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL F', specials={'font',0x0046} }, + [0x1D676] = { unicodeslot=0x1D676, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL G', specials={'font',0x0047} }, + [0x1D677] = { unicodeslot=0x1D677, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL H', specials={'font',0x0048} }, + [0x1D678] = { unicodeslot=0x1D678, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL I', specials={'font',0x0049} }, + [0x1D679] = { unicodeslot=0x1D679, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL J', specials={'font',0x004A} }, + [0x1D67A] = { unicodeslot=0x1D67A, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL K', specials={'font',0x004B} }, + [0x1D67B] = { unicodeslot=0x1D67B, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL L', specials={'font',0x004C} }, + [0x1D67C] = { unicodeslot=0x1D67C, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL M', specials={'font',0x004D} }, + [0x1D67D] = { unicodeslot=0x1D67D, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL N', specials={'font',0x004E} }, + [0x1D67E] = { unicodeslot=0x1D67E, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL O', specials={'font',0x004F} }, + [0x1D67F] = { unicodeslot=0x1D67F, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL P', specials={'font',0x0050} }, + [0x1D680] = { unicodeslot=0x1D680, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL Q', specials={'font',0x0051} }, + [0x1D681] = { unicodeslot=0x1D681, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL R', specials={'font',0x0052} }, + [0x1D682] = { unicodeslot=0x1D682, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL S', specials={'font',0x0053} }, + [0x1D683] = { unicodeslot=0x1D683, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL T', specials={'font',0x0054} }, + [0x1D684] = { unicodeslot=0x1D684, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL U', specials={'font',0x0055} }, + [0x1D685] = { unicodeslot=0x1D685, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL V', specials={'font',0x0056} }, + [0x1D686] = { unicodeslot=0x1D686, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL W', specials={'font',0x0057} }, + [0x1D687] = { unicodeslot=0x1D687, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL X', specials={'font',0x0058} }, + [0x1D688] = { unicodeslot=0x1D688, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL Y', specials={'font',0x0059} }, + [0x1D689] = { unicodeslot=0x1D689, category='lu', description='MATHEMATICAL MONOSPACE CAPITAL Z', specials={'font',0x005A} }, + [0x1D68A] = { unicodeslot=0x1D68A, category='ll', description='MATHEMATICAL MONOSPACE SMALL A', specials={'font',0x0061} }, + [0x1D68B] = { unicodeslot=0x1D68B, category='ll', description='MATHEMATICAL MONOSPACE SMALL B', specials={'font',0x0062} }, + [0x1D68C] = { unicodeslot=0x1D68C, category='ll', description='MATHEMATICAL MONOSPACE SMALL C', specials={'font',0x0063} }, + [0x1D68D] = { unicodeslot=0x1D68D, category='ll', description='MATHEMATICAL MONOSPACE SMALL D', specials={'font',0x0064} }, + [0x1D68E] = { unicodeslot=0x1D68E, category='ll', description='MATHEMATICAL MONOSPACE SMALL E', specials={'font',0x0065} }, + [0x1D68F] = { unicodeslot=0x1D68F, category='ll', description='MATHEMATICAL MONOSPACE SMALL F', specials={'font',0x0066} }, + [0x1D690] = { unicodeslot=0x1D690, category='ll', description='MATHEMATICAL MONOSPACE SMALL G', specials={'font',0x0067} }, + [0x1D691] = { unicodeslot=0x1D691, category='ll', description='MATHEMATICAL MONOSPACE SMALL H', specials={'font',0x0068} }, + [0x1D692] = { unicodeslot=0x1D692, category='ll', description='MATHEMATICAL MONOSPACE SMALL I', specials={'font',0x0069} }, + [0x1D693] = { unicodeslot=0x1D693, category='ll', description='MATHEMATICAL MONOSPACE SMALL J', specials={'font',0x006A} }, + [0x1D694] = { unicodeslot=0x1D694, category='ll', description='MATHEMATICAL MONOSPACE SMALL K', specials={'font',0x006B} }, + [0x1D695] = { unicodeslot=0x1D695, category='ll', description='MATHEMATICAL MONOSPACE SMALL L', specials={'font',0x006C} }, + [0x1D696] = { unicodeslot=0x1D696, category='ll', description='MATHEMATICAL MONOSPACE SMALL M', specials={'font',0x006D} }, + [0x1D697] = { unicodeslot=0x1D697, category='ll', description='MATHEMATICAL MONOSPACE SMALL N', specials={'font',0x006E} }, + [0x1D698] = { unicodeslot=0x1D698, category='ll', description='MATHEMATICAL MONOSPACE SMALL O', specials={'font',0x006F} }, + [0x1D699] = { unicodeslot=0x1D699, category='ll', description='MATHEMATICAL MONOSPACE SMALL P', specials={'font',0x0070} }, + [0x1D69A] = { unicodeslot=0x1D69A, category='ll', description='MATHEMATICAL MONOSPACE SMALL Q', specials={'font',0x0071} }, + [0x1D69B] = { unicodeslot=0x1D69B, category='ll', description='MATHEMATICAL MONOSPACE SMALL R', specials={'font',0x0072} }, + [0x1D69C] = { unicodeslot=0x1D69C, category='ll', description='MATHEMATICAL MONOSPACE SMALL S', specials={'font',0x0073} }, + [0x1D69D] = { unicodeslot=0x1D69D, category='ll', description='MATHEMATICAL MONOSPACE SMALL T', specials={'font',0x0074} }, + [0x1D69E] = { unicodeslot=0x1D69E, category='ll', description='MATHEMATICAL MONOSPACE SMALL U', specials={'font',0x0075} }, + [0x1D69F] = { unicodeslot=0x1D69F, category='ll', description='MATHEMATICAL MONOSPACE SMALL V', specials={'font',0x0076} }, + [0x1D6A0] = { unicodeslot=0x1D6A0, category='ll', description='MATHEMATICAL MONOSPACE SMALL W', specials={'font',0x0077} }, + [0x1D6A1] = { unicodeslot=0x1D6A1, category='ll', description='MATHEMATICAL MONOSPACE SMALL X', specials={'font',0x0078} }, + [0x1D6A2] = { unicodeslot=0x1D6A2, category='ll', description='MATHEMATICAL MONOSPACE SMALL Y', specials={'font',0x0079} }, + [0x1D6A3] = { unicodeslot=0x1D6A3, category='ll', description='MATHEMATICAL MONOSPACE SMALL Z', specials={'font',0x007A} }, + [0x1D6A4] = { unicodeslot=0x1D6A4, category='ll', description='MATHEMATICAL ITALIC SMALL DOTLESS I', specials={'font',0x0131} }, + [0x1D6A5] = { unicodeslot=0x1D6A5, category='ll', description='MATHEMATICAL ITALIC SMALL DOTLESS J', specials={'font',0x0237} }, + [0x1D6A8] = { unicodeslot=0x1D6A8, category='lu', description='MATHEMATICAL BOLD CAPITAL ALPHA', specials={'font',0x0391} }, + [0x1D6A9] = { unicodeslot=0x1D6A9, category='lu', description='MATHEMATICAL BOLD CAPITAL BETA', specials={'font',0x0392} }, + [0x1D6AA] = { unicodeslot=0x1D6AA, category='lu', description='MATHEMATICAL BOLD CAPITAL GAMMA', specials={'font',0x0393} }, + [0x1D6AB] = { unicodeslot=0x1D6AB, category='lu', description='MATHEMATICAL BOLD CAPITAL DELTA', specials={'font',0x0394} }, + [0x1D6AC] = { unicodeslot=0x1D6AC, category='lu', description='MATHEMATICAL BOLD CAPITAL EPSILON', specials={'font',0x0395} }, + [0x1D6AD] = { unicodeslot=0x1D6AD, category='lu', description='MATHEMATICAL BOLD CAPITAL ZETA', specials={'font',0x0396} }, + [0x1D6AE] = { unicodeslot=0x1D6AE, category='lu', description='MATHEMATICAL BOLD CAPITAL ETA', specials={'font',0x0397} }, + [0x1D6AF] = { unicodeslot=0x1D6AF, category='lu', description='MATHEMATICAL BOLD CAPITAL THETA', specials={'font',0x0398} }, + [0x1D6B0] = { unicodeslot=0x1D6B0, category='lu', description='MATHEMATICAL BOLD CAPITAL IOTA', specials={'font',0x0399} }, + [0x1D6B1] = { unicodeslot=0x1D6B1, category='lu', description='MATHEMATICAL BOLD CAPITAL KAPPA', specials={'font',0x039A} }, + [0x1D6B2] = { unicodeslot=0x1D6B2, category='lu', description='MATHEMATICAL BOLD CAPITAL LAMDA', specials={'font',0x039B} }, + [0x1D6B3] = { unicodeslot=0x1D6B3, category='lu', description='MATHEMATICAL BOLD CAPITAL MU', specials={'font',0x039C} }, + [0x1D6B4] = { unicodeslot=0x1D6B4, category='lu', description='MATHEMATICAL BOLD CAPITAL NU', specials={'font',0x039D} }, + [0x1D6B5] = { unicodeslot=0x1D6B5, category='lu', description='MATHEMATICAL BOLD CAPITAL XI', specials={'font',0x039E} }, + [0x1D6B6] = { unicodeslot=0x1D6B6, category='lu', description='MATHEMATICAL BOLD CAPITAL OMICRON', specials={'font',0x039F} }, + [0x1D6B7] = { unicodeslot=0x1D6B7, category='lu', description='MATHEMATICAL BOLD CAPITAL PI', specials={'font',0x03A0} }, + [0x1D6B8] = { unicodeslot=0x1D6B8, category='lu', description='MATHEMATICAL BOLD CAPITAL RHO', specials={'font',0x03A1} }, + [0x1D6B9] = { unicodeslot=0x1D6B9, category='lu', description='MATHEMATICAL BOLD CAPITAL THETA SYMBOL', specials={'font',0x03F4} }, + [0x1D6BA] = { unicodeslot=0x1D6BA, category='lu', description='MATHEMATICAL BOLD CAPITAL SIGMA', specials={'font',0x03A3} }, + [0x1D6BB] = { unicodeslot=0x1D6BB, category='lu', description='MATHEMATICAL BOLD CAPITAL TAU', specials={'font',0x03A4} }, + [0x1D6BC] = { unicodeslot=0x1D6BC, category='lu', description='MATHEMATICAL BOLD CAPITAL UPSILON', specials={'font',0x03A5} }, + [0x1D6BD] = { unicodeslot=0x1D6BD, category='lu', description='MATHEMATICAL BOLD CAPITAL PHI', specials={'font',0x03A6} }, + [0x1D6BE] = { unicodeslot=0x1D6BE, category='lu', description='MATHEMATICAL BOLD CAPITAL CHI', specials={'font',0x03A7} }, + [0x1D6BF] = { unicodeslot=0x1D6BF, category='lu', description='MATHEMATICAL BOLD CAPITAL PSI', specials={'font',0x03A8} }, + [0x1D6C0] = { unicodeslot=0x1D6C0, category='lu', description='MATHEMATICAL BOLD CAPITAL OMEGA', specials={'font',0x03A9} }, + [0x1D6C1] = { unicodeslot=0x1D6C1, category='sm', description='MATHEMATICAL BOLD NABLA', specials={'font',0x2207} }, + [0x1D6C2] = { unicodeslot=0x1D6C2, category='ll', description='MATHEMATICAL BOLD SMALL ALPHA', specials={'font',0x03B1} }, + [0x1D6C3] = { unicodeslot=0x1D6C3, category='ll', description='MATHEMATICAL BOLD SMALL BETA', specials={'font',0x03B2} }, + [0x1D6C4] = { unicodeslot=0x1D6C4, category='ll', description='MATHEMATICAL BOLD SMALL GAMMA', specials={'font',0x03B3} }, + [0x1D6C5] = { unicodeslot=0x1D6C5, category='ll', description='MATHEMATICAL BOLD SMALL DELTA', specials={'font',0x03B4} }, + [0x1D6C6] = { unicodeslot=0x1D6C6, category='ll', description='MATHEMATICAL BOLD SMALL EPSILON', specials={'font',0x03B5} }, + [0x1D6C7] = { unicodeslot=0x1D6C7, category='ll', description='MATHEMATICAL BOLD SMALL ZETA', specials={'font',0x03B6} }, + [0x1D6C8] = { unicodeslot=0x1D6C8, category='ll', description='MATHEMATICAL BOLD SMALL ETA', specials={'font',0x03B7} }, + [0x1D6C9] = { unicodeslot=0x1D6C9, category='ll', description='MATHEMATICAL BOLD SMALL THETA', specials={'font',0x03B8} }, + [0x1D6CA] = { unicodeslot=0x1D6CA, category='ll', description='MATHEMATICAL BOLD SMALL IOTA', specials={'font',0x03B9} }, + [0x1D6CB] = { unicodeslot=0x1D6CB, category='ll', description='MATHEMATICAL BOLD SMALL KAPPA', specials={'font',0x03BA} }, + [0x1D6CC] = { unicodeslot=0x1D6CC, category='ll', description='MATHEMATICAL BOLD SMALL LAMDA', specials={'font',0x03BB} }, + [0x1D6CD] = { unicodeslot=0x1D6CD, category='ll', description='MATHEMATICAL BOLD SMALL MU', specials={'font',0x03BC} }, + [0x1D6CE] = { unicodeslot=0x1D6CE, category='ll', description='MATHEMATICAL BOLD SMALL NU', specials={'font',0x03BD} }, + [0x1D6CF] = { unicodeslot=0x1D6CF, category='ll', description='MATHEMATICAL BOLD SMALL XI', specials={'font',0x03BE} }, + [0x1D6D0] = { unicodeslot=0x1D6D0, category='ll', description='MATHEMATICAL BOLD SMALL OMICRON', specials={'font',0x03BF} }, + [0x1D6D1] = { unicodeslot=0x1D6D1, category='ll', description='MATHEMATICAL BOLD SMALL PI', specials={'font',0x03C0} }, + [0x1D6D2] = { unicodeslot=0x1D6D2, category='ll', description='MATHEMATICAL BOLD SMALL RHO', specials={'font',0x03C1} }, + [0x1D6D3] = { unicodeslot=0x1D6D3, category='ll', description='MATHEMATICAL BOLD SMALL FINAL SIGMA', specials={'font',0x03C2} }, + [0x1D6D4] = { unicodeslot=0x1D6D4, category='ll', description='MATHEMATICAL BOLD SMALL SIGMA', specials={'font',0x03C3} }, + [0x1D6D5] = { unicodeslot=0x1D6D5, category='ll', description='MATHEMATICAL BOLD SMALL TAU', specials={'font',0x03C4} }, + [0x1D6D6] = { unicodeslot=0x1D6D6, category='ll', description='MATHEMATICAL BOLD SMALL UPSILON', specials={'font',0x03C5} }, + [0x1D6D7] = { unicodeslot=0x1D6D7, category='ll', description='MATHEMATICAL BOLD SMALL PHI', specials={'font',0x03C6} }, + [0x1D6D8] = { unicodeslot=0x1D6D8, category='ll', description='MATHEMATICAL BOLD SMALL CHI', specials={'font',0x03C7} }, + [0x1D6D9] = { unicodeslot=0x1D6D9, category='ll', description='MATHEMATICAL BOLD SMALL PSI', specials={'font',0x03C8} }, + [0x1D6DA] = { unicodeslot=0x1D6DA, category='ll', description='MATHEMATICAL BOLD SMALL OMEGA', specials={'font',0x03C9} }, + [0x1D6DB] = { unicodeslot=0x1D6DB, category='sm', description='MATHEMATICAL BOLD PARTIAL DIFFERENTIAL', specials={'font',0x2202} }, + [0x1D6DC] = { unicodeslot=0x1D6DC, category='ll', description='MATHEMATICAL BOLD EPSILON SYMBOL', specials={'font',0x03F5} }, + [0x1D6DD] = { unicodeslot=0x1D6DD, category='ll', description='MATHEMATICAL BOLD THETA SYMBOL', specials={'font',0x03D1} }, + [0x1D6DE] = { unicodeslot=0x1D6DE, category='ll', description='MATHEMATICAL BOLD KAPPA SYMBOL', specials={'font',0x03F0} }, + [0x1D6DF] = { unicodeslot=0x1D6DF, category='ll', description='MATHEMATICAL BOLD PHI SYMBOL', specials={'font',0x03D5} }, + [0x1D6E0] = { unicodeslot=0x1D6E0, category='ll', description='MATHEMATICAL BOLD RHO SYMBOL', specials={'font',0x03F1} }, + [0x1D6E1] = { unicodeslot=0x1D6E1, category='ll', description='MATHEMATICAL BOLD PI SYMBOL', specials={'font',0x03D6} }, + [0x1D6E2] = { unicodeslot=0x1D6E2, category='lu', description='MATHEMATICAL ITALIC CAPITAL ALPHA', specials={'font',0x0391} }, + [0x1D6E3] = { unicodeslot=0x1D6E3, category='lu', description='MATHEMATICAL ITALIC CAPITAL BETA', specials={'font',0x0392} }, + [0x1D6E4] = { unicodeslot=0x1D6E4, category='lu', description='MATHEMATICAL ITALIC CAPITAL GAMMA', specials={'font',0x0393} }, + [0x1D6E5] = { unicodeslot=0x1D6E5, category='lu', description='MATHEMATICAL ITALIC CAPITAL DELTA', specials={'font',0x0394} }, + [0x1D6E6] = { unicodeslot=0x1D6E6, category='lu', description='MATHEMATICAL ITALIC CAPITAL EPSILON', specials={'font',0x0395} }, + [0x1D6E7] = { unicodeslot=0x1D6E7, category='lu', description='MATHEMATICAL ITALIC CAPITAL ZETA', specials={'font',0x0396} }, + [0x1D6E8] = { unicodeslot=0x1D6E8, category='lu', description='MATHEMATICAL ITALIC CAPITAL ETA', specials={'font',0x0397} }, + [0x1D6E9] = { unicodeslot=0x1D6E9, category='lu', description='MATHEMATICAL ITALIC CAPITAL THETA', specials={'font',0x0398} }, + [0x1D6EA] = { unicodeslot=0x1D6EA, category='lu', description='MATHEMATICAL ITALIC CAPITAL IOTA', specials={'font',0x0399} }, + [0x1D6EB] = { unicodeslot=0x1D6EB, category='lu', description='MATHEMATICAL ITALIC CAPITAL KAPPA', specials={'font',0x039A} }, + [0x1D6EC] = { unicodeslot=0x1D6EC, category='lu', description='MATHEMATICAL ITALIC CAPITAL LAMDA', specials={'font',0x039B} }, + [0x1D6ED] = { unicodeslot=0x1D6ED, category='lu', description='MATHEMATICAL ITALIC CAPITAL MU', specials={'font',0x039C} }, + [0x1D6EE] = { unicodeslot=0x1D6EE, category='lu', description='MATHEMATICAL ITALIC CAPITAL NU', specials={'font',0x039D} }, + [0x1D6EF] = { unicodeslot=0x1D6EF, category='lu', description='MATHEMATICAL ITALIC CAPITAL XI', specials={'font',0x039E} }, + [0x1D6F0] = { unicodeslot=0x1D6F0, category='lu', description='MATHEMATICAL ITALIC CAPITAL OMICRON', specials={'font',0x039F} }, + [0x1D6F1] = { unicodeslot=0x1D6F1, category='lu', description='MATHEMATICAL ITALIC CAPITAL PI', specials={'font',0x03A0} }, + [0x1D6F2] = { unicodeslot=0x1D6F2, category='lu', description='MATHEMATICAL ITALIC CAPITAL RHO', specials={'font',0x03A1} }, + [0x1D6F3] = { unicodeslot=0x1D6F3, category='lu', description='MATHEMATICAL ITALIC CAPITAL THETA SYMBOL', specials={'font',0x03F4} }, + [0x1D6F4] = { unicodeslot=0x1D6F4, category='lu', description='MATHEMATICAL ITALIC CAPITAL SIGMA', specials={'font',0x03A3} }, + [0x1D6F5] = { unicodeslot=0x1D6F5, category='lu', description='MATHEMATICAL ITALIC CAPITAL TAU', specials={'font',0x03A4} }, + [0x1D6F6] = { unicodeslot=0x1D6F6, category='lu', description='MATHEMATICAL ITALIC CAPITAL UPSILON', specials={'font',0x03A5} }, + [0x1D6F7] = { unicodeslot=0x1D6F7, category='lu', description='MATHEMATICAL ITALIC CAPITAL PHI', specials={'font',0x03A6} }, + [0x1D6F8] = { unicodeslot=0x1D6F8, category='lu', description='MATHEMATICAL ITALIC CAPITAL CHI', specials={'font',0x03A7} }, + [0x1D6F9] = { unicodeslot=0x1D6F9, category='lu', description='MATHEMATICAL ITALIC CAPITAL PSI', specials={'font',0x03A8} }, + [0x1D6FA] = { unicodeslot=0x1D6FA, category='lu', description='MATHEMATICAL ITALIC CAPITAL OMEGA', specials={'font',0x03A9} }, + [0x1D6FB] = { unicodeslot=0x1D6FB, category='sm', description='MATHEMATICAL ITALIC NABLA', specials={'font',0x2207} }, + [0x1D6FC] = { unicodeslot=0x1D6FC, category='ll', description='MATHEMATICAL ITALIC SMALL ALPHA', specials={'font',0x03B1} }, + [0x1D6FD] = { unicodeslot=0x1D6FD, category='ll', description='MATHEMATICAL ITALIC SMALL BETA', specials={'font',0x03B2} }, + [0x1D6FE] = { unicodeslot=0x1D6FE, category='ll', description='MATHEMATICAL ITALIC SMALL GAMMA', specials={'font',0x03B3} }, + [0x1D6FF] = { unicodeslot=0x1D6FF, category='ll', description='MATHEMATICAL ITALIC SMALL DELTA', specials={'font',0x03B4} }, + [0x1D700] = { unicodeslot=0x1D700, category='ll', description='MATHEMATICAL ITALIC SMALL EPSILON', specials={'font',0x03B5} }, + [0x1D701] = { unicodeslot=0x1D701, category='ll', description='MATHEMATICAL ITALIC SMALL ZETA', specials={'font',0x03B6} }, + [0x1D702] = { unicodeslot=0x1D702, category='ll', description='MATHEMATICAL ITALIC SMALL ETA', specials={'font',0x03B7} }, + [0x1D703] = { unicodeslot=0x1D703, category='ll', description='MATHEMATICAL ITALIC SMALL THETA', specials={'font',0x03B8} }, + [0x1D704] = { unicodeslot=0x1D704, category='ll', description='MATHEMATICAL ITALIC SMALL IOTA', specials={'font',0x03B9} }, + [0x1D705] = { unicodeslot=0x1D705, category='ll', description='MATHEMATICAL ITALIC SMALL KAPPA', specials={'font',0x03BA} }, + [0x1D706] = { unicodeslot=0x1D706, category='ll', description='MATHEMATICAL ITALIC SMALL LAMDA', specials={'font',0x03BB} }, + [0x1D707] = { unicodeslot=0x1D707, category='ll', description='MATHEMATICAL ITALIC SMALL MU', specials={'font',0x03BC} }, + [0x1D708] = { unicodeslot=0x1D708, category='ll', description='MATHEMATICAL ITALIC SMALL NU', specials={'font',0x03BD} }, + [0x1D709] = { unicodeslot=0x1D709, category='ll', description='MATHEMATICAL ITALIC SMALL XI', specials={'font',0x03BE} }, + [0x1D70A] = { unicodeslot=0x1D70A, category='ll', description='MATHEMATICAL ITALIC SMALL OMICRON', specials={'font',0x03BF} }, + [0x1D70B] = { unicodeslot=0x1D70B, category='ll', description='MATHEMATICAL ITALIC SMALL PI', specials={'font',0x03C0} }, + [0x1D70C] = { unicodeslot=0x1D70C, category='ll', description='MATHEMATICAL ITALIC SMALL RHO', specials={'font',0x03C1} }, + [0x1D70D] = { unicodeslot=0x1D70D, category='ll', description='MATHEMATICAL ITALIC SMALL FINAL SIGMA', specials={'font',0x03C2} }, + [0x1D70E] = { unicodeslot=0x1D70E, category='ll', description='MATHEMATICAL ITALIC SMALL SIGMA', specials={'font',0x03C3} }, + [0x1D70F] = { unicodeslot=0x1D70F, category='ll', description='MATHEMATICAL ITALIC SMALL TAU', specials={'font',0x03C4} }, + [0x1D710] = { unicodeslot=0x1D710, category='ll', description='MATHEMATICAL ITALIC SMALL UPSILON', specials={'font',0x03C5} }, + [0x1D711] = { unicodeslot=0x1D711, category='ll', description='MATHEMATICAL ITALIC SMALL PHI', specials={'font',0x03C6} }, + [0x1D712] = { unicodeslot=0x1D712, category='ll', description='MATHEMATICAL ITALIC SMALL CHI', specials={'font',0x03C7} }, + [0x1D713] = { unicodeslot=0x1D713, category='ll', description='MATHEMATICAL ITALIC SMALL PSI', specials={'font',0x03C8} }, + [0x1D714] = { unicodeslot=0x1D714, category='ll', description='MATHEMATICAL ITALIC SMALL OMEGA', specials={'font',0x03C9} }, + [0x1D715] = { unicodeslot=0x1D715, category='sm', description='MATHEMATICAL ITALIC PARTIAL DIFFERENTIAL', specials={'font',0x2202} }, + [0x1D716] = { unicodeslot=0x1D716, category='ll', description='MATHEMATICAL ITALIC EPSILON SYMBOL', specials={'font',0x03F5} }, + [0x1D717] = { unicodeslot=0x1D717, category='ll', description='MATHEMATICAL ITALIC THETA SYMBOL', specials={'font',0x03D1} }, + [0x1D718] = { unicodeslot=0x1D718, category='ll', description='MATHEMATICAL ITALIC KAPPA SYMBOL', specials={'font',0x03F0} }, + [0x1D719] = { unicodeslot=0x1D719, category='ll', description='MATHEMATICAL ITALIC PHI SYMBOL', specials={'font',0x03D5} }, + [0x1D71A] = { unicodeslot=0x1D71A, category='ll', description='MATHEMATICAL ITALIC RHO SYMBOL', specials={'font',0x03F1} }, + [0x1D71B] = { unicodeslot=0x1D71B, category='ll', description='MATHEMATICAL ITALIC PI SYMBOL', specials={'font',0x03D6} }, + [0x1D71C] = { unicodeslot=0x1D71C, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL ALPHA', specials={'font',0x0391} }, + [0x1D71D] = { unicodeslot=0x1D71D, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL BETA', specials={'font',0x0392} }, + [0x1D71E] = { unicodeslot=0x1D71E, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL GAMMA', specials={'font',0x0393} }, + [0x1D71F] = { unicodeslot=0x1D71F, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL DELTA', specials={'font',0x0394} }, + [0x1D720] = { unicodeslot=0x1D720, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL EPSILON', specials={'font',0x0395} }, + [0x1D721] = { unicodeslot=0x1D721, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL ZETA', specials={'font',0x0396} }, + [0x1D722] = { unicodeslot=0x1D722, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL ETA', specials={'font',0x0397} }, + [0x1D723] = { unicodeslot=0x1D723, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL THETA', specials={'font',0x0398} }, + [0x1D724] = { unicodeslot=0x1D724, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL IOTA', specials={'font',0x0399} }, + [0x1D725] = { unicodeslot=0x1D725, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL KAPPA', specials={'font',0x039A} }, + [0x1D726] = { unicodeslot=0x1D726, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL LAMDA', specials={'font',0x039B} }, + [0x1D727] = { unicodeslot=0x1D727, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL MU', specials={'font',0x039C} }, + [0x1D728] = { unicodeslot=0x1D728, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL NU', specials={'font',0x039D} }, + [0x1D729] = { unicodeslot=0x1D729, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL XI', specials={'font',0x039E} }, + [0x1D72A] = { unicodeslot=0x1D72A, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL OMICRON', specials={'font',0x039F} }, + [0x1D72B] = { unicodeslot=0x1D72B, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL PI', specials={'font',0x03A0} }, + [0x1D72C] = { unicodeslot=0x1D72C, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL RHO', specials={'font',0x03A1} }, + [0x1D72D] = { unicodeslot=0x1D72D, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL THETA SYMBOL', specials={'font',0x03F4} }, + [0x1D72E] = { unicodeslot=0x1D72E, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL SIGMA', specials={'font',0x03A3} }, + [0x1D72F] = { unicodeslot=0x1D72F, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL TAU', specials={'font',0x03A4} }, + [0x1D730] = { unicodeslot=0x1D730, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL UPSILON', specials={'font',0x03A5} }, + [0x1D731] = { unicodeslot=0x1D731, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL PHI', specials={'font',0x03A6} }, + [0x1D732] = { unicodeslot=0x1D732, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL CHI', specials={'font',0x03A7} }, + [0x1D733] = { unicodeslot=0x1D733, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL PSI', specials={'font',0x03A8} }, + [0x1D734] = { unicodeslot=0x1D734, category='lu', description='MATHEMATICAL BOLD ITALIC CAPITAL OMEGA', specials={'font',0x03A9} }, + [0x1D735] = { unicodeslot=0x1D735, category='sm', description='MATHEMATICAL BOLD ITALIC NABLA', specials={'font',0x2207} }, + [0x1D736] = { unicodeslot=0x1D736, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL ALPHA', specials={'font',0x03B1} }, + [0x1D737] = { unicodeslot=0x1D737, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL BETA', specials={'font',0x03B2} }, + [0x1D738] = { unicodeslot=0x1D738, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL GAMMA', specials={'font',0x03B3} }, + [0x1D739] = { unicodeslot=0x1D739, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL DELTA', specials={'font',0x03B4} }, + [0x1D73A] = { unicodeslot=0x1D73A, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL EPSILON', specials={'font',0x03B5} }, + [0x1D73B] = { unicodeslot=0x1D73B, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL ZETA', specials={'font',0x03B6} }, + [0x1D73C] = { unicodeslot=0x1D73C, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL ETA', specials={'font',0x03B7} }, + [0x1D73D] = { unicodeslot=0x1D73D, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL THETA', specials={'font',0x03B8} }, + [0x1D73E] = { unicodeslot=0x1D73E, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL IOTA', specials={'font',0x03B9} }, + [0x1D73F] = { unicodeslot=0x1D73F, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL KAPPA', specials={'font',0x03BA} }, + [0x1D740] = { unicodeslot=0x1D740, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL LAMDA', specials={'font',0x03BB} }, + [0x1D741] = { unicodeslot=0x1D741, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL MU', specials={'font',0x03BC} }, + [0x1D742] = { unicodeslot=0x1D742, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL NU', specials={'font',0x03BD} }, + [0x1D743] = { unicodeslot=0x1D743, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL XI', specials={'font',0x03BE} }, + [0x1D744] = { unicodeslot=0x1D744, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL OMICRON', specials={'font',0x03BF} }, + [0x1D745] = { unicodeslot=0x1D745, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL PI', specials={'font',0x03C0} }, + [0x1D746] = { unicodeslot=0x1D746, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL RHO', specials={'font',0x03C1} }, + [0x1D747] = { unicodeslot=0x1D747, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL FINAL SIGMA', specials={'font',0x03C2} }, + [0x1D748] = { unicodeslot=0x1D748, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL SIGMA', specials={'font',0x03C3} }, + [0x1D749] = { unicodeslot=0x1D749, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL TAU', specials={'font',0x03C4} }, + [0x1D74A] = { unicodeslot=0x1D74A, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL UPSILON', specials={'font',0x03C5} }, + [0x1D74B] = { unicodeslot=0x1D74B, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL PHI', specials={'font',0x03C6} }, + [0x1D74C] = { unicodeslot=0x1D74C, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL CHI', specials={'font',0x03C7} }, + [0x1D74D] = { unicodeslot=0x1D74D, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL PSI', specials={'font',0x03C8} }, + [0x1D74E] = { unicodeslot=0x1D74E, category='ll', description='MATHEMATICAL BOLD ITALIC SMALL OMEGA', specials={'font',0x03C9} }, + [0x1D74F] = { unicodeslot=0x1D74F, category='sm', description='MATHEMATICAL BOLD ITALIC PARTIAL DIFFERENTIAL', specials={'font',0x2202} }, + [0x1D750] = { unicodeslot=0x1D750, category='ll', description='MATHEMATICAL BOLD ITALIC EPSILON SYMBOL', specials={'font',0x03F5} }, + [0x1D751] = { unicodeslot=0x1D751, category='ll', description='MATHEMATICAL BOLD ITALIC THETA SYMBOL', specials={'font',0x03D1} }, + [0x1D752] = { unicodeslot=0x1D752, category='ll', description='MATHEMATICAL BOLD ITALIC KAPPA SYMBOL', specials={'font',0x03F0} }, + [0x1D753] = { unicodeslot=0x1D753, category='ll', description='MATHEMATICAL BOLD ITALIC PHI SYMBOL', specials={'font',0x03D5} }, + [0x1D754] = { unicodeslot=0x1D754, category='ll', description='MATHEMATICAL BOLD ITALIC RHO SYMBOL', specials={'font',0x03F1} }, + [0x1D755] = { unicodeslot=0x1D755, category='ll', description='MATHEMATICAL BOLD ITALIC PI SYMBOL', specials={'font',0x03D6} }, + [0x1D756] = { unicodeslot=0x1D756, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL ALPHA', specials={'font',0x0391} }, + [0x1D757] = { unicodeslot=0x1D757, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL BETA', specials={'font',0x0392} }, + [0x1D758] = { unicodeslot=0x1D758, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL GAMMA', specials={'font',0x0393} }, + [0x1D759] = { unicodeslot=0x1D759, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL DELTA', specials={'font',0x0394} }, + [0x1D75A] = { unicodeslot=0x1D75A, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL EPSILON', specials={'font',0x0395} }, + [0x1D75B] = { unicodeslot=0x1D75B, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL ZETA', specials={'font',0x0396} }, + [0x1D75C] = { unicodeslot=0x1D75C, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL ETA', specials={'font',0x0397} }, + [0x1D75D] = { unicodeslot=0x1D75D, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA', specials={'font',0x0398} }, + [0x1D75E] = { unicodeslot=0x1D75E, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL IOTA', specials={'font',0x0399} }, + [0x1D75F] = { unicodeslot=0x1D75F, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL KAPPA', specials={'font',0x039A} }, + [0x1D760] = { unicodeslot=0x1D760, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL LAMDA', specials={'font',0x039B} }, + [0x1D761] = { unicodeslot=0x1D761, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL MU', specials={'font',0x039C} }, + [0x1D762] = { unicodeslot=0x1D762, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL NU', specials={'font',0x039D} }, + [0x1D763] = { unicodeslot=0x1D763, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL XI', specials={'font',0x039E} }, + [0x1D764] = { unicodeslot=0x1D764, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL OMICRON', specials={'font',0x039F} }, + [0x1D765] = { unicodeslot=0x1D765, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL PI', specials={'font',0x03A0} }, + [0x1D766] = { unicodeslot=0x1D766, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL RHO', specials={'font',0x03A1} }, + [0x1D767] = { unicodeslot=0x1D767, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL THETA SYMBOL', specials={'font',0x03F4} }, + [0x1D768] = { unicodeslot=0x1D768, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL SIGMA', specials={'font',0x03A3} }, + [0x1D769] = { unicodeslot=0x1D769, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL TAU', specials={'font',0x03A4} }, + [0x1D76A] = { unicodeslot=0x1D76A, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL UPSILON', specials={'font',0x03A5} }, + [0x1D76B] = { unicodeslot=0x1D76B, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL PHI', specials={'font',0x03A6} }, + [0x1D76C] = { unicodeslot=0x1D76C, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL CHI', specials={'font',0x03A7} }, + [0x1D76D] = { unicodeslot=0x1D76D, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL PSI', specials={'font',0x03A8} }, + [0x1D76E] = { unicodeslot=0x1D76E, category='lu', description='MATHEMATICAL SANS-SERIF BOLD CAPITAL OMEGA', specials={'font',0x03A9} }, + [0x1D76F] = { unicodeslot=0x1D76F, category='sm', description='MATHEMATICAL SANS-SERIF BOLD NABLA', specials={'font',0x2207} }, + [0x1D770] = { unicodeslot=0x1D770, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL ALPHA', specials={'font',0x03B1} }, + [0x1D771] = { unicodeslot=0x1D771, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL BETA', specials={'font',0x03B2} }, + [0x1D772] = { unicodeslot=0x1D772, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL GAMMA', specials={'font',0x03B3} }, + [0x1D773] = { unicodeslot=0x1D773, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL DELTA', specials={'font',0x03B4} }, + [0x1D774] = { unicodeslot=0x1D774, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL EPSILON', specials={'font',0x03B5} }, + [0x1D775] = { unicodeslot=0x1D775, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL ZETA', specials={'font',0x03B6} }, + [0x1D776] = { unicodeslot=0x1D776, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL ETA', specials={'font',0x03B7} }, + [0x1D777] = { unicodeslot=0x1D777, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL THETA', specials={'font',0x03B8} }, + [0x1D778] = { unicodeslot=0x1D778, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL IOTA', specials={'font',0x03B9} }, + [0x1D779] = { unicodeslot=0x1D779, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL KAPPA', specials={'font',0x03BA} }, + [0x1D77A] = { unicodeslot=0x1D77A, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL LAMDA', specials={'font',0x03BB} }, + [0x1D77B] = { unicodeslot=0x1D77B, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL MU', specials={'font',0x03BC} }, + [0x1D77C] = { unicodeslot=0x1D77C, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL NU', specials={'font',0x03BD} }, + [0x1D77D] = { unicodeslot=0x1D77D, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL XI', specials={'font',0x03BE} }, + [0x1D77E] = { unicodeslot=0x1D77E, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL OMICRON', specials={'font',0x03BF} }, + [0x1D77F] = { unicodeslot=0x1D77F, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL PI', specials={'font',0x03C0} }, + [0x1D780] = { unicodeslot=0x1D780, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL RHO', specials={'font',0x03C1} }, + [0x1D781] = { unicodeslot=0x1D781, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL FINAL SIGMA', specials={'font',0x03C2} }, + [0x1D782] = { unicodeslot=0x1D782, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL SIGMA', specials={'font',0x03C3} }, + [0x1D783] = { unicodeslot=0x1D783, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL TAU', specials={'font',0x03C4} }, + [0x1D784] = { unicodeslot=0x1D784, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL UPSILON', specials={'font',0x03C5} }, + [0x1D785] = { unicodeslot=0x1D785, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL PHI', specials={'font',0x03C6} }, + [0x1D786] = { unicodeslot=0x1D786, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL CHI', specials={'font',0x03C7} }, + [0x1D787] = { unicodeslot=0x1D787, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL PSI', specials={'font',0x03C8} }, + [0x1D788] = { unicodeslot=0x1D788, category='ll', description='MATHEMATICAL SANS-SERIF BOLD SMALL OMEGA', specials={'font',0x03C9} }, + [0x1D789] = { unicodeslot=0x1D789, category='sm', description='MATHEMATICAL SANS-SERIF BOLD PARTIAL DIFFERENTIAL', specials={'font',0x2202} }, + [0x1D78A] = { unicodeslot=0x1D78A, category='ll', description='MATHEMATICAL SANS-SERIF BOLD EPSILON SYMBOL', specials={'font',0x03F5} }, + [0x1D78B] = { unicodeslot=0x1D78B, category='ll', description='MATHEMATICAL SANS-SERIF BOLD THETA SYMBOL', specials={'font',0x03D1} }, + [0x1D78C] = { unicodeslot=0x1D78C, category='ll', description='MATHEMATICAL SANS-SERIF BOLD KAPPA SYMBOL', specials={'font',0x03F0} }, + [0x1D78D] = { unicodeslot=0x1D78D, category='ll', description='MATHEMATICAL SANS-SERIF BOLD PHI SYMBOL', specials={'font',0x03D5} }, + [0x1D78E] = { unicodeslot=0x1D78E, category='ll', description='MATHEMATICAL SANS-SERIF BOLD RHO SYMBOL', specials={'font',0x03F1} }, + [0x1D78F] = { unicodeslot=0x1D78F, category='ll', description='MATHEMATICAL SANS-SERIF BOLD PI SYMBOL', specials={'font',0x03D6} }, + [0x1D790] = { unicodeslot=0x1D790, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ALPHA', specials={'font',0x0391} }, + [0x1D791] = { unicodeslot=0x1D791, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL BETA', specials={'font',0x0392} }, + [0x1D792] = { unicodeslot=0x1D792, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL GAMMA', specials={'font',0x0393} }, + [0x1D793] = { unicodeslot=0x1D793, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL DELTA', specials={'font',0x0394} }, + [0x1D794] = { unicodeslot=0x1D794, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL EPSILON', specials={'font',0x0395} }, + [0x1D795] = { unicodeslot=0x1D795, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ZETA', specials={'font',0x0396} }, + [0x1D796] = { unicodeslot=0x1D796, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL ETA', specials={'font',0x0397} }, + [0x1D797] = { unicodeslot=0x1D797, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA', specials={'font',0x0398} }, + [0x1D798] = { unicodeslot=0x1D798, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL IOTA', specials={'font',0x0399} }, + [0x1D799] = { unicodeslot=0x1D799, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL KAPPA', specials={'font',0x039A} }, + [0x1D79A] = { unicodeslot=0x1D79A, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL LAMDA', specials={'font',0x039B} }, + [0x1D79B] = { unicodeslot=0x1D79B, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL MU', specials={'font',0x039C} }, + [0x1D79C] = { unicodeslot=0x1D79C, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL NU', specials={'font',0x039D} }, + [0x1D79D] = { unicodeslot=0x1D79D, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL XI', specials={'font',0x039E} }, + [0x1D79E] = { unicodeslot=0x1D79E, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMICRON', specials={'font',0x039F} }, + [0x1D79F] = { unicodeslot=0x1D79F, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PI', specials={'font',0x03A0} }, + [0x1D7A0] = { unicodeslot=0x1D7A0, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL RHO', specials={'font',0x03A1} }, + [0x1D7A1] = { unicodeslot=0x1D7A1, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL THETA SYMBOL', specials={'font',0x03F4} }, + [0x1D7A2] = { unicodeslot=0x1D7A2, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL SIGMA', specials={'font',0x03A3} }, + [0x1D7A3] = { unicodeslot=0x1D7A3, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL TAU', specials={'font',0x03A4} }, + [0x1D7A4] = { unicodeslot=0x1D7A4, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL UPSILON', specials={'font',0x03A5} }, + [0x1D7A5] = { unicodeslot=0x1D7A5, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PHI', specials={'font',0x03A6} }, + [0x1D7A6] = { unicodeslot=0x1D7A6, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL CHI', specials={'font',0x03A7} }, + [0x1D7A7] = { unicodeslot=0x1D7A7, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL PSI', specials={'font',0x03A8} }, + [0x1D7A8] = { unicodeslot=0x1D7A8, category='lu', description='MATHEMATICAL SANS-SERIF BOLD ITALIC CAPITAL OMEGA', specials={'font',0x03A9} }, + [0x1D7A9] = { unicodeslot=0x1D7A9, category='sm', description='MATHEMATICAL SANS-SERIF BOLD ITALIC NABLA', specials={'font',0x2207} }, + [0x1D7AA] = { unicodeslot=0x1D7AA, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ALPHA', specials={'font',0x03B1} }, + [0x1D7AB] = { unicodeslot=0x1D7AB, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL BETA', specials={'font',0x03B2} }, + [0x1D7AC] = { unicodeslot=0x1D7AC, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL GAMMA', specials={'font',0x03B3} }, + [0x1D7AD] = { unicodeslot=0x1D7AD, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL DELTA', specials={'font',0x03B4} }, + [0x1D7AE] = { unicodeslot=0x1D7AE, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL EPSILON', specials={'font',0x03B5} }, + [0x1D7AF] = { unicodeslot=0x1D7AF, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ZETA', specials={'font',0x03B6} }, + [0x1D7B0] = { unicodeslot=0x1D7B0, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL ETA', specials={'font',0x03B7} }, + [0x1D7B1] = { unicodeslot=0x1D7B1, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL THETA', specials={'font',0x03B8} }, + [0x1D7B2] = { unicodeslot=0x1D7B2, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL IOTA', specials={'font',0x03B9} }, + [0x1D7B3] = { unicodeslot=0x1D7B3, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL KAPPA', specials={'font',0x03BA} }, + [0x1D7B4] = { unicodeslot=0x1D7B4, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL LAMDA', specials={'font',0x03BB} }, + [0x1D7B5] = { unicodeslot=0x1D7B5, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL MU', specials={'font',0x03BC} }, + [0x1D7B6] = { unicodeslot=0x1D7B6, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL NU', specials={'font',0x03BD} }, + [0x1D7B7] = { unicodeslot=0x1D7B7, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL XI', specials={'font',0x03BE} }, + [0x1D7B8] = { unicodeslot=0x1D7B8, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMICRON', specials={'font',0x03BF} }, + [0x1D7B9] = { unicodeslot=0x1D7B9, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PI', specials={'font',0x03C0} }, + [0x1D7BA] = { unicodeslot=0x1D7BA, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL RHO', specials={'font',0x03C1} }, + [0x1D7BB] = { unicodeslot=0x1D7BB, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL FINAL SIGMA', specials={'font',0x03C2} }, + [0x1D7BC] = { unicodeslot=0x1D7BC, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL SIGMA', specials={'font',0x03C3} }, + [0x1D7BD] = { unicodeslot=0x1D7BD, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL TAU', specials={'font',0x03C4} }, + [0x1D7BE] = { unicodeslot=0x1D7BE, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL UPSILON', specials={'font',0x03C5} }, + [0x1D7BF] = { unicodeslot=0x1D7BF, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PHI', specials={'font',0x03C6} }, + [0x1D7C0] = { unicodeslot=0x1D7C0, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL CHI', specials={'font',0x03C7} }, + [0x1D7C1] = { unicodeslot=0x1D7C1, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL PSI', specials={'font',0x03C8} }, + [0x1D7C2] = { unicodeslot=0x1D7C2, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC SMALL OMEGA', specials={'font',0x03C9} }, + [0x1D7C3] = { unicodeslot=0x1D7C3, category='sm', description='MATHEMATICAL SANS-SERIF BOLD ITALIC PARTIAL DIFFERENTIAL', specials={'font',0x2202} }, + [0x1D7C4] = { unicodeslot=0x1D7C4, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC EPSILON SYMBOL', specials={'font',0x03F5} }, + [0x1D7C5] = { unicodeslot=0x1D7C5, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC THETA SYMBOL', specials={'font',0x03D1} }, + [0x1D7C6] = { unicodeslot=0x1D7C6, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC KAPPA SYMBOL', specials={'font',0x03F0} }, + [0x1D7C7] = { unicodeslot=0x1D7C7, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC PHI SYMBOL', specials={'font',0x03D5} }, + [0x1D7C8] = { unicodeslot=0x1D7C8, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC RHO SYMBOL', specials={'font',0x03F1} }, + [0x1D7C9] = { unicodeslot=0x1D7C9, category='ll', description='MATHEMATICAL SANS-SERIF BOLD ITALIC PI SYMBOL', specials={'font',0x03D6} }, + [0x1D7CA] = { unicodeslot=0x1D7CA, category='lu', description='MATHEMATICAL BOLD CAPITAL DIGAMMA', specials={'font',0x03DC} }, + [0x1D7CB] = { unicodeslot=0x1D7CB, category='ll', description='MATHEMATICAL BOLD SMALL DIGAMMA', specials={'font',0x03DD} }, + [0x1D7CE] = { unicodeslot=0x1D7CE, category='nd', description='MATHEMATICAL BOLD DIGIT ZERO', specials={'font',0x0030} }, + [0x1D7CF] = { unicodeslot=0x1D7CF, category='nd', description='MATHEMATICAL BOLD DIGIT ONE', specials={'font',0x0031} }, + [0x1D7D0] = { unicodeslot=0x1D7D0, category='nd', description='MATHEMATICAL BOLD DIGIT TWO', specials={'font',0x0032} }, + [0x1D7D1] = { unicodeslot=0x1D7D1, category='nd', description='MATHEMATICAL BOLD DIGIT THREE', specials={'font',0x0033} }, + [0x1D7D2] = { unicodeslot=0x1D7D2, category='nd', description='MATHEMATICAL BOLD DIGIT FOUR', specials={'font',0x0034} }, + [0x1D7D3] = { unicodeslot=0x1D7D3, category='nd', description='MATHEMATICAL BOLD DIGIT FIVE', specials={'font',0x0035} }, + [0x1D7D4] = { unicodeslot=0x1D7D4, category='nd', description='MATHEMATICAL BOLD DIGIT SIX', specials={'font',0x0036} }, + [0x1D7D5] = { unicodeslot=0x1D7D5, category='nd', description='MATHEMATICAL BOLD DIGIT SEVEN', specials={'font',0x0037} }, + [0x1D7D6] = { unicodeslot=0x1D7D6, category='nd', description='MATHEMATICAL BOLD DIGIT EIGHT', specials={'font',0x0038} }, + [0x1D7D7] = { unicodeslot=0x1D7D7, category='nd', description='MATHEMATICAL BOLD DIGIT NINE', specials={'font',0x0039} }, + [0x1D7D8] = { unicodeslot=0x1D7D8, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT ZERO', specials={'font',0x0030} }, + [0x1D7D9] = { unicodeslot=0x1D7D9, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT ONE', specials={'font',0x0031} }, + [0x1D7DA] = { unicodeslot=0x1D7DA, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT TWO', specials={'font',0x0032} }, + [0x1D7DB] = { unicodeslot=0x1D7DB, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT THREE', specials={'font',0x0033} }, + [0x1D7DC] = { unicodeslot=0x1D7DC, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT FOUR', specials={'font',0x0034} }, + [0x1D7DD] = { unicodeslot=0x1D7DD, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT FIVE', specials={'font',0x0035} }, + [0x1D7DE] = { unicodeslot=0x1D7DE, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT SIX', specials={'font',0x0036} }, + [0x1D7DF] = { unicodeslot=0x1D7DF, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT SEVEN', specials={'font',0x0037} }, + [0x1D7E0] = { unicodeslot=0x1D7E0, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT EIGHT', specials={'font',0x0038} }, + [0x1D7E1] = { unicodeslot=0x1D7E1, category='nd', description='MATHEMATICAL DOUBLE-STRUCK DIGIT NINE', specials={'font',0x0039} }, + [0x1D7E2] = { unicodeslot=0x1D7E2, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT ZERO', specials={'font',0x0030} }, + [0x1D7E3] = { unicodeslot=0x1D7E3, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT ONE', specials={'font',0x0031} }, + [0x1D7E4] = { unicodeslot=0x1D7E4, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT TWO', specials={'font',0x0032} }, + [0x1D7E5] = { unicodeslot=0x1D7E5, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT THREE', specials={'font',0x0033} }, + [0x1D7E6] = { unicodeslot=0x1D7E6, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT FOUR', specials={'font',0x0034} }, + [0x1D7E7] = { unicodeslot=0x1D7E7, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT FIVE', specials={'font',0x0035} }, + [0x1D7E8] = { unicodeslot=0x1D7E8, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT SIX', specials={'font',0x0036} }, + [0x1D7E9] = { unicodeslot=0x1D7E9, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT SEVEN', specials={'font',0x0037} }, + [0x1D7EA] = { unicodeslot=0x1D7EA, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT EIGHT', specials={'font',0x0038} }, + [0x1D7EB] = { unicodeslot=0x1D7EB, category='nd', description='MATHEMATICAL SANS-SERIF DIGIT NINE', specials={'font',0x0039} }, + [0x1D7EC] = { unicodeslot=0x1D7EC, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT ZERO', specials={'font',0x0030} }, + [0x1D7ED] = { unicodeslot=0x1D7ED, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT ONE', specials={'font',0x0031} }, + [0x1D7EE] = { unicodeslot=0x1D7EE, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT TWO', specials={'font',0x0032} }, + [0x1D7EF] = { unicodeslot=0x1D7EF, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT THREE', specials={'font',0x0033} }, + [0x1D7F0] = { unicodeslot=0x1D7F0, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT FOUR', specials={'font',0x0034} }, + [0x1D7F1] = { unicodeslot=0x1D7F1, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT FIVE', specials={'font',0x0035} }, + [0x1D7F2] = { unicodeslot=0x1D7F2, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT SIX', specials={'font',0x0036} }, + [0x1D7F3] = { unicodeslot=0x1D7F3, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT SEVEN', specials={'font',0x0037} }, + [0x1D7F4] = { unicodeslot=0x1D7F4, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT EIGHT', specials={'font',0x0038} }, + [0x1D7F5] = { unicodeslot=0x1D7F5, category='nd', description='MATHEMATICAL SANS-SERIF BOLD DIGIT NINE', specials={'font',0x0039} }, + [0x1D7F6] = { unicodeslot=0x1D7F6, category='nd', description='MATHEMATICAL MONOSPACE DIGIT ZERO', specials={'font',0x0030} }, + [0x1D7F7] = { unicodeslot=0x1D7F7, category='nd', description='MATHEMATICAL MONOSPACE DIGIT ONE', specials={'font',0x0031} }, + [0x1D7F8] = { unicodeslot=0x1D7F8, category='nd', description='MATHEMATICAL MONOSPACE DIGIT TWO', specials={'font',0x0032} }, + [0x1D7F9] = { unicodeslot=0x1D7F9, category='nd', description='MATHEMATICAL MONOSPACE DIGIT THREE', specials={'font',0x0033} }, + [0x1D7FA] = { unicodeslot=0x1D7FA, category='nd', description='MATHEMATICAL MONOSPACE DIGIT FOUR', specials={'font',0x0034} }, + [0x1D7FB] = { unicodeslot=0x1D7FB, category='nd', description='MATHEMATICAL MONOSPACE DIGIT FIVE', specials={'font',0x0035} }, + [0x1D7FC] = { unicodeslot=0x1D7FC, category='nd', description='MATHEMATICAL MONOSPACE DIGIT SIX', specials={'font',0x0036} }, + [0x1D7FD] = { unicodeslot=0x1D7FD, category='nd', description='MATHEMATICAL MONOSPACE DIGIT SEVEN', specials={'font',0x0037} }, + [0x1D7FE] = { unicodeslot=0x1D7FE, category='nd', description='MATHEMATICAL MONOSPACE DIGIT EIGHT', specials={'font',0x0038} }, + [0x1D7FF] = { unicodeslot=0x1D7FF, category='nd', description='MATHEMATICAL MONOSPACE DIGIT NINE', specials={'font',0x0039} }, + [0x20000] = { unicodeslot=0x20000, category='lo', description='' }, + [0x2A6D6] = { unicodeslot=0x2A6D6, category='lo', description='' }, + [0x2F800] = { unicodeslot=0x2F800, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F800', specials={'char',0x4E3D} }, + [0x2F801] = { unicodeslot=0x2F801, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F801', specials={'char',0x4E38} }, + [0x2F802] = { unicodeslot=0x2F802, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F802', specials={'char',0x4E41} }, + [0x2F803] = { unicodeslot=0x2F803, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F803', specials={'char',0x20122} }, + [0x2F804] = { unicodeslot=0x2F804, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F804', specials={'char',0x4F60} }, + [0x2F805] = { unicodeslot=0x2F805, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F805', specials={'char',0x4FAE} }, + [0x2F806] = { unicodeslot=0x2F806, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F806', specials={'char',0x4FBB} }, + [0x2F807] = { unicodeslot=0x2F807, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F807', specials={'char',0x5002} }, + [0x2F808] = { unicodeslot=0x2F808, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F808', specials={'char',0x507A} }, + [0x2F809] = { unicodeslot=0x2F809, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F809', specials={'char',0x5099} }, + [0x2F80A] = { unicodeslot=0x2F80A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80A', specials={'char',0x50E7} }, + [0x2F80B] = { unicodeslot=0x2F80B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80B', specials={'char',0x50CF} }, + [0x2F80C] = { unicodeslot=0x2F80C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80C', specials={'char',0x349E} }, + [0x2F80D] = { unicodeslot=0x2F80D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80D', specials={'char',0x2063A} }, + [0x2F80E] = { unicodeslot=0x2F80E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80E', specials={'char',0x514D} }, + [0x2F80F] = { unicodeslot=0x2F80F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F80F', specials={'char',0x5154} }, + [0x2F810] = { unicodeslot=0x2F810, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F810', specials={'char',0x5164} }, + [0x2F811] = { unicodeslot=0x2F811, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F811', specials={'char',0x5177} }, + [0x2F812] = { unicodeslot=0x2F812, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F812', specials={'char',0x2051C} }, + [0x2F813] = { unicodeslot=0x2F813, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F813', specials={'char',0x34B9} }, + [0x2F814] = { unicodeslot=0x2F814, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F814', specials={'char',0x5167} }, + [0x2F815] = { unicodeslot=0x2F815, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F815', specials={'char',0x518D} }, + [0x2F816] = { unicodeslot=0x2F816, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F816', specials={'char',0x2054B} }, + [0x2F817] = { unicodeslot=0x2F817, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F817', specials={'char',0x5197} }, + [0x2F818] = { unicodeslot=0x2F818, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F818', specials={'char',0x51A4} }, + [0x2F819] = { unicodeslot=0x2F819, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F819', specials={'char',0x4ECC} }, + [0x2F81A] = { unicodeslot=0x2F81A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81A', specials={'char',0x51AC} }, + [0x2F81B] = { unicodeslot=0x2F81B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81B', specials={'char',0x51B5} }, + [0x2F81C] = { unicodeslot=0x2F81C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81C', specials={'char',0x291DF} }, + [0x2F81D] = { unicodeslot=0x2F81D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81D', specials={'char',0x51F5} }, + [0x2F81E] = { unicodeslot=0x2F81E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81E', specials={'char',0x5203} }, + [0x2F81F] = { unicodeslot=0x2F81F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F81F', specials={'char',0x34DF} }, + [0x2F820] = { unicodeslot=0x2F820, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F820', specials={'char',0x523B} }, + [0x2F821] = { unicodeslot=0x2F821, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F821', specials={'char',0x5246} }, + [0x2F822] = { unicodeslot=0x2F822, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F822', specials={'char',0x5272} }, + [0x2F823] = { unicodeslot=0x2F823, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F823', specials={'char',0x5277} }, + [0x2F824] = { unicodeslot=0x2F824, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F824', specials={'char',0x3515} }, + [0x2F825] = { unicodeslot=0x2F825, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F825', specials={'char',0x52C7} }, + [0x2F826] = { unicodeslot=0x2F826, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F826', specials={'char',0x52C9} }, + [0x2F827] = { unicodeslot=0x2F827, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F827', specials={'char',0x52E4} }, + [0x2F828] = { unicodeslot=0x2F828, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F828', specials={'char',0x52FA} }, + [0x2F829] = { unicodeslot=0x2F829, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F829', specials={'char',0x5305} }, + [0x2F82A] = { unicodeslot=0x2F82A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82A', specials={'char',0x5306} }, + [0x2F82B] = { unicodeslot=0x2F82B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82B', specials={'char',0x5317} }, + [0x2F82C] = { unicodeslot=0x2F82C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82C', specials={'char',0x5349} }, + [0x2F82D] = { unicodeslot=0x2F82D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82D', specials={'char',0x5351} }, + [0x2F82E] = { unicodeslot=0x2F82E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82E', specials={'char',0x535A} }, + [0x2F82F] = { unicodeslot=0x2F82F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F82F', specials={'char',0x5373} }, + [0x2F830] = { unicodeslot=0x2F830, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F830', specials={'char',0x537D} }, + [0x2F831] = { unicodeslot=0x2F831, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F831', specials={'char',0x537F} }, + [0x2F832] = { unicodeslot=0x2F832, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F832', specials={'char',0x537F} }, + [0x2F833] = { unicodeslot=0x2F833, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F833', specials={'char',0x537F} }, + [0x2F834] = { unicodeslot=0x2F834, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F834', specials={'char',0x20A2C} }, + [0x2F835] = { unicodeslot=0x2F835, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F835', specials={'char',0x7070} }, + [0x2F836] = { unicodeslot=0x2F836, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F836', specials={'char',0x53CA} }, + [0x2F837] = { unicodeslot=0x2F837, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F837', specials={'char',0x53DF} }, + [0x2F838] = { unicodeslot=0x2F838, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F838', specials={'char',0x20B63} }, + [0x2F839] = { unicodeslot=0x2F839, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F839', specials={'char',0x53EB} }, + [0x2F83A] = { unicodeslot=0x2F83A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83A', specials={'char',0x53F1} }, + [0x2F83B] = { unicodeslot=0x2F83B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83B', specials={'char',0x5406} }, + [0x2F83C] = { unicodeslot=0x2F83C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83C', specials={'char',0x549E} }, + [0x2F83D] = { unicodeslot=0x2F83D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83D', specials={'char',0x5438} }, + [0x2F83E] = { unicodeslot=0x2F83E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83E', specials={'char',0x5448} }, + [0x2F83F] = { unicodeslot=0x2F83F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F83F', specials={'char',0x5468} }, + [0x2F840] = { unicodeslot=0x2F840, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F840', specials={'char',0x54A2} }, + [0x2F841] = { unicodeslot=0x2F841, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F841', specials={'char',0x54F6} }, + [0x2F842] = { unicodeslot=0x2F842, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F842', specials={'char',0x5510} }, + [0x2F843] = { unicodeslot=0x2F843, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F843', specials={'char',0x5553} }, + [0x2F844] = { unicodeslot=0x2F844, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F844', specials={'char',0x5563} }, + [0x2F845] = { unicodeslot=0x2F845, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F845', specials={'char',0x5584} }, + [0x2F846] = { unicodeslot=0x2F846, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F846', specials={'char',0x5584} }, + [0x2F847] = { unicodeslot=0x2F847, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F847', specials={'char',0x5599} }, + [0x2F848] = { unicodeslot=0x2F848, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F848', specials={'char',0x55AB} }, + [0x2F849] = { unicodeslot=0x2F849, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F849', specials={'char',0x55B3} }, + [0x2F84A] = { unicodeslot=0x2F84A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84A', specials={'char',0x55C2} }, + [0x2F84B] = { unicodeslot=0x2F84B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84B', specials={'char',0x5716} }, + [0x2F84C] = { unicodeslot=0x2F84C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84C', specials={'char',0x5606} }, + [0x2F84D] = { unicodeslot=0x2F84D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84D', specials={'char',0x5717} }, + [0x2F84E] = { unicodeslot=0x2F84E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84E', specials={'char',0x5651} }, + [0x2F84F] = { unicodeslot=0x2F84F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F84F', specials={'char',0x5674} }, + [0x2F850] = { unicodeslot=0x2F850, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F850', specials={'char',0x5207} }, + [0x2F851] = { unicodeslot=0x2F851, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F851', specials={'char',0x58EE} }, + [0x2F852] = { unicodeslot=0x2F852, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F852', specials={'char',0x57CE} }, + [0x2F853] = { unicodeslot=0x2F853, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F853', specials={'char',0x57F4} }, + [0x2F854] = { unicodeslot=0x2F854, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F854', specials={'char',0x580D} }, + [0x2F855] = { unicodeslot=0x2F855, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F855', specials={'char',0x578B} }, + [0x2F856] = { unicodeslot=0x2F856, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F856', specials={'char',0x5832} }, + [0x2F857] = { unicodeslot=0x2F857, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F857', specials={'char',0x5831} }, + [0x2F858] = { unicodeslot=0x2F858, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F858', specials={'char',0x58AC} }, + [0x2F859] = { unicodeslot=0x2F859, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F859', specials={'char',0x214E4} }, + [0x2F85A] = { unicodeslot=0x2F85A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85A', specials={'char',0x58F2} }, + [0x2F85B] = { unicodeslot=0x2F85B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85B', specials={'char',0x58F7} }, + [0x2F85C] = { unicodeslot=0x2F85C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85C', specials={'char',0x5906} }, + [0x2F85D] = { unicodeslot=0x2F85D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85D', specials={'char',0x591A} }, + [0x2F85E] = { unicodeslot=0x2F85E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85E', specials={'char',0x5922} }, + [0x2F85F] = { unicodeslot=0x2F85F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F85F', specials={'char',0x5962} }, + [0x2F860] = { unicodeslot=0x2F860, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F860', specials={'char',0x216A8} }, + [0x2F861] = { unicodeslot=0x2F861, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F861', specials={'char',0x216EA} }, + [0x2F862] = { unicodeslot=0x2F862, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F862', specials={'char',0x59EC} }, + [0x2F863] = { unicodeslot=0x2F863, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F863', specials={'char',0x5A1B} }, + [0x2F864] = { unicodeslot=0x2F864, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F864', specials={'char',0x5A27} }, + [0x2F865] = { unicodeslot=0x2F865, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F865', specials={'char',0x59D8} }, + [0x2F866] = { unicodeslot=0x2F866, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F866', specials={'char',0x5A66} }, + [0x2F867] = { unicodeslot=0x2F867, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F867', specials={'char',0x36EE} }, + [0x2F868] = { unicodeslot=0x2F868, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F868', specials={'char',0x36FC} }, + [0x2F869] = { unicodeslot=0x2F869, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F869', specials={'char',0x5B08} }, + [0x2F86A] = { unicodeslot=0x2F86A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86A', specials={'char',0x5B3E} }, + [0x2F86B] = { unicodeslot=0x2F86B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86B', specials={'char',0x5B3E} }, + [0x2F86C] = { unicodeslot=0x2F86C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86C', specials={'char',0x219C8} }, + [0x2F86D] = { unicodeslot=0x2F86D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86D', specials={'char',0x5BC3} }, + [0x2F86E] = { unicodeslot=0x2F86E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86E', specials={'char',0x5BD8} }, + [0x2F86F] = { unicodeslot=0x2F86F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F86F', specials={'char',0x5BE7} }, + [0x2F870] = { unicodeslot=0x2F870, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F870', specials={'char',0x5BF3} }, + [0x2F871] = { unicodeslot=0x2F871, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F871', specials={'char',0x21B18} }, + [0x2F872] = { unicodeslot=0x2F872, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F872', specials={'char',0x5BFF} }, + [0x2F873] = { unicodeslot=0x2F873, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F873', specials={'char',0x5C06} }, + [0x2F874] = { unicodeslot=0x2F874, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F874', specials={'char',0x5F53} }, + [0x2F875] = { unicodeslot=0x2F875, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F875', specials={'char',0x5C22} }, + [0x2F876] = { unicodeslot=0x2F876, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F876', specials={'char',0x3781} }, + [0x2F877] = { unicodeslot=0x2F877, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F877', specials={'char',0x5C60} }, + [0x2F878] = { unicodeslot=0x2F878, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F878', specials={'char',0x5C6E} }, + [0x2F879] = { unicodeslot=0x2F879, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F879', specials={'char',0x5CC0} }, + [0x2F87A] = { unicodeslot=0x2F87A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87A', specials={'char',0x5C8D} }, + [0x2F87B] = { unicodeslot=0x2F87B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87B', specials={'char',0x21DE4} }, + [0x2F87C] = { unicodeslot=0x2F87C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87C', specials={'char',0x5D43} }, + [0x2F87D] = { unicodeslot=0x2F87D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87D', specials={'char',0x21DE6} }, + [0x2F87E] = { unicodeslot=0x2F87E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87E', specials={'char',0x5D6E} }, + [0x2F87F] = { unicodeslot=0x2F87F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F87F', specials={'char',0x5D6B} }, + [0x2F880] = { unicodeslot=0x2F880, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F880', specials={'char',0x5D7C} }, + [0x2F881] = { unicodeslot=0x2F881, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F881', specials={'char',0x5DE1} }, + [0x2F882] = { unicodeslot=0x2F882, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F882', specials={'char',0x5DE2} }, + [0x2F883] = { unicodeslot=0x2F883, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F883', specials={'char',0x382F} }, + [0x2F884] = { unicodeslot=0x2F884, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F884', specials={'char',0x5DFD} }, + [0x2F885] = { unicodeslot=0x2F885, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F885', specials={'char',0x5E28} }, + [0x2F886] = { unicodeslot=0x2F886, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F886', specials={'char',0x5E3D} }, + [0x2F887] = { unicodeslot=0x2F887, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F887', specials={'char',0x5E69} }, + [0x2F888] = { unicodeslot=0x2F888, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F888', specials={'char',0x3862} }, + [0x2F889] = { unicodeslot=0x2F889, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F889', specials={'char',0x22183} }, + [0x2F88A] = { unicodeslot=0x2F88A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88A', specials={'char',0x387C} }, + [0x2F88B] = { unicodeslot=0x2F88B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88B', specials={'char',0x5EB0} }, + [0x2F88C] = { unicodeslot=0x2F88C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88C', specials={'char',0x5EB3} }, + [0x2F88D] = { unicodeslot=0x2F88D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88D', specials={'char',0x5EB6} }, + [0x2F88E] = { unicodeslot=0x2F88E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88E', specials={'char',0x5ECA} }, + [0x2F88F] = { unicodeslot=0x2F88F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F88F', specials={'char',0x2A392} }, + [0x2F890] = { unicodeslot=0x2F890, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F890', specials={'char',0x5EFE} }, + [0x2F891] = { unicodeslot=0x2F891, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F891', specials={'char',0x22331} }, + [0x2F892] = { unicodeslot=0x2F892, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F892', specials={'char',0x22331} }, + [0x2F893] = { unicodeslot=0x2F893, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F893', specials={'char',0x8201} }, + [0x2F894] = { unicodeslot=0x2F894, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F894', specials={'char',0x5F22} }, + [0x2F895] = { unicodeslot=0x2F895, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F895', specials={'char',0x5F22} }, + [0x2F896] = { unicodeslot=0x2F896, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F896', specials={'char',0x38C7} }, + [0x2F897] = { unicodeslot=0x2F897, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F897', specials={'char',0x232B8} }, + [0x2F898] = { unicodeslot=0x2F898, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F898', specials={'char',0x261DA} }, + [0x2F899] = { unicodeslot=0x2F899, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F899', specials={'char',0x5F62} }, + [0x2F89A] = { unicodeslot=0x2F89A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89A', specials={'char',0x5F6B} }, + [0x2F89B] = { unicodeslot=0x2F89B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89B', specials={'char',0x38E3} }, + [0x2F89C] = { unicodeslot=0x2F89C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89C', specials={'char',0x5F9A} }, + [0x2F89D] = { unicodeslot=0x2F89D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89D', specials={'char',0x5FCD} }, + [0x2F89E] = { unicodeslot=0x2F89E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89E', specials={'char',0x5FD7} }, + [0x2F89F] = { unicodeslot=0x2F89F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F89F', specials={'char',0x5FF9} }, + [0x2F8A0] = { unicodeslot=0x2F8A0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A0', specials={'char',0x6081} }, + [0x2F8A1] = { unicodeslot=0x2F8A1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A1', specials={'char',0x393A} }, + [0x2F8A2] = { unicodeslot=0x2F8A2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A2', specials={'char',0x391C} }, + [0x2F8A3] = { unicodeslot=0x2F8A3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A3', specials={'char',0x6094} }, + [0x2F8A4] = { unicodeslot=0x2F8A4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A4', specials={'char',0x226D4} }, + [0x2F8A5] = { unicodeslot=0x2F8A5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A5', specials={'char',0x60C7} }, + [0x2F8A6] = { unicodeslot=0x2F8A6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A6', specials={'char',0x6148} }, + [0x2F8A7] = { unicodeslot=0x2F8A7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A7', specials={'char',0x614C} }, + [0x2F8A8] = { unicodeslot=0x2F8A8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A8', specials={'char',0x614E} }, + [0x2F8A9] = { unicodeslot=0x2F8A9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8A9', specials={'char',0x614C} }, + [0x2F8AA] = { unicodeslot=0x2F8AA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AA', specials={'char',0x617A} }, + [0x2F8AB] = { unicodeslot=0x2F8AB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AB', specials={'char',0x618E} }, + [0x2F8AC] = { unicodeslot=0x2F8AC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AC', specials={'char',0x61B2} }, + [0x2F8AD] = { unicodeslot=0x2F8AD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AD', specials={'char',0x61A4} }, + [0x2F8AE] = { unicodeslot=0x2F8AE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AE', specials={'char',0x61AF} }, + [0x2F8AF] = { unicodeslot=0x2F8AF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8AF', specials={'char',0x61DE} }, + [0x2F8B0] = { unicodeslot=0x2F8B0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B0', specials={'char',0x61F2} }, + [0x2F8B1] = { unicodeslot=0x2F8B1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B1', specials={'char',0x61F6} }, + [0x2F8B2] = { unicodeslot=0x2F8B2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B2', specials={'char',0x6210} }, + [0x2F8B3] = { unicodeslot=0x2F8B3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B3', specials={'char',0x621B} }, + [0x2F8B4] = { unicodeslot=0x2F8B4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B4', specials={'char',0x625D} }, + [0x2F8B5] = { unicodeslot=0x2F8B5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B5', specials={'char',0x62B1} }, + [0x2F8B6] = { unicodeslot=0x2F8B6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B6', specials={'char',0x62D4} }, + [0x2F8B7] = { unicodeslot=0x2F8B7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B7', specials={'char',0x6350} }, + [0x2F8B8] = { unicodeslot=0x2F8B8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B8', specials={'char',0x22B0C} }, + [0x2F8B9] = { unicodeslot=0x2F8B9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8B9', specials={'char',0x633D} }, + [0x2F8BA] = { unicodeslot=0x2F8BA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BA', specials={'char',0x62FC} }, + [0x2F8BB] = { unicodeslot=0x2F8BB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BB', specials={'char',0x6368} }, + [0x2F8BC] = { unicodeslot=0x2F8BC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BC', specials={'char',0x6383} }, + [0x2F8BD] = { unicodeslot=0x2F8BD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BD', specials={'char',0x63E4} }, + [0x2F8BE] = { unicodeslot=0x2F8BE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BE', specials={'char',0x22BF1} }, + [0x2F8BF] = { unicodeslot=0x2F8BF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8BF', specials={'char',0x6422} }, + [0x2F8C0] = { unicodeslot=0x2F8C0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C0', specials={'char',0x63C5} }, + [0x2F8C1] = { unicodeslot=0x2F8C1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C1', specials={'char',0x63A9} }, + [0x2F8C2] = { unicodeslot=0x2F8C2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C2', specials={'char',0x3A2E} }, + [0x2F8C3] = { unicodeslot=0x2F8C3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C3', specials={'char',0x6469} }, + [0x2F8C4] = { unicodeslot=0x2F8C4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C4', specials={'char',0x647E} }, + [0x2F8C5] = { unicodeslot=0x2F8C5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C5', specials={'char',0x649D} }, + [0x2F8C6] = { unicodeslot=0x2F8C6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C6', specials={'char',0x6477} }, + [0x2F8C7] = { unicodeslot=0x2F8C7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C7', specials={'char',0x3A6C} }, + [0x2F8C8] = { unicodeslot=0x2F8C8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C8', specials={'char',0x654F} }, + [0x2F8C9] = { unicodeslot=0x2F8C9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8C9', specials={'char',0x656C} }, + [0x2F8CA] = { unicodeslot=0x2F8CA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CA', specials={'char',0x2300A} }, + [0x2F8CB] = { unicodeslot=0x2F8CB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CB', specials={'char',0x65E3} }, + [0x2F8CC] = { unicodeslot=0x2F8CC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CC', specials={'char',0x66F8} }, + [0x2F8CD] = { unicodeslot=0x2F8CD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CD', specials={'char',0x6649} }, + [0x2F8CE] = { unicodeslot=0x2F8CE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CE', specials={'char',0x3B19} }, + [0x2F8CF] = { unicodeslot=0x2F8CF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8CF', specials={'char',0x6691} }, + [0x2F8D0] = { unicodeslot=0x2F8D0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D0', specials={'char',0x3B08} }, + [0x2F8D1] = { unicodeslot=0x2F8D1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D1', specials={'char',0x3AE4} }, + [0x2F8D2] = { unicodeslot=0x2F8D2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D2', specials={'char',0x5192} }, + [0x2F8D3] = { unicodeslot=0x2F8D3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D3', specials={'char',0x5195} }, + [0x2F8D4] = { unicodeslot=0x2F8D4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D4', specials={'char',0x6700} }, + [0x2F8D5] = { unicodeslot=0x2F8D5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D5', specials={'char',0x669C} }, + [0x2F8D6] = { unicodeslot=0x2F8D6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D6', specials={'char',0x80AD} }, + [0x2F8D7] = { unicodeslot=0x2F8D7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D7', specials={'char',0x43D9} }, + [0x2F8D8] = { unicodeslot=0x2F8D8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D8', specials={'char',0x6717} }, + [0x2F8D9] = { unicodeslot=0x2F8D9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8D9', specials={'char',0x671B} }, + [0x2F8DA] = { unicodeslot=0x2F8DA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DA', specials={'char',0x6721} }, + [0x2F8DB] = { unicodeslot=0x2F8DB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DB', specials={'char',0x675E} }, + [0x2F8DC] = { unicodeslot=0x2F8DC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DC', specials={'char',0x6753} }, + [0x2F8DD] = { unicodeslot=0x2F8DD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DD', specials={'char',0x233C3} }, + [0x2F8DE] = { unicodeslot=0x2F8DE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DE', specials={'char',0x3B49} }, + [0x2F8DF] = { unicodeslot=0x2F8DF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8DF', specials={'char',0x67FA} }, + [0x2F8E0] = { unicodeslot=0x2F8E0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E0', specials={'char',0x6785} }, + [0x2F8E1] = { unicodeslot=0x2F8E1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E1', specials={'char',0x6852} }, + [0x2F8E2] = { unicodeslot=0x2F8E2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E2', specials={'char',0x6885} }, + [0x2F8E3] = { unicodeslot=0x2F8E3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E3', specials={'char',0x2346D} }, + [0x2F8E4] = { unicodeslot=0x2F8E4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E4', specials={'char',0x688E} }, + [0x2F8E5] = { unicodeslot=0x2F8E5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E5', specials={'char',0x681F} }, + [0x2F8E6] = { unicodeslot=0x2F8E6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E6', specials={'char',0x6914} }, + [0x2F8E7] = { unicodeslot=0x2F8E7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E7', specials={'char',0x3B9D} }, + [0x2F8E8] = { unicodeslot=0x2F8E8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E8', specials={'char',0x6942} }, + [0x2F8E9] = { unicodeslot=0x2F8E9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8E9', specials={'char',0x69A3} }, + [0x2F8EA] = { unicodeslot=0x2F8EA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8EA', specials={'char',0x69EA} }, + [0x2F8EB] = { unicodeslot=0x2F8EB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8EB', specials={'char',0x6AA8} }, + [0x2F8EC] = { unicodeslot=0x2F8EC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8EC', specials={'char',0x236A3} }, + [0x2F8ED] = { unicodeslot=0x2F8ED, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8ED', specials={'char',0x6ADB} }, + [0x2F8EE] = { unicodeslot=0x2F8EE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8EE', specials={'char',0x3C18} }, + [0x2F8EF] = { unicodeslot=0x2F8EF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8EF', specials={'char',0x6B21} }, + [0x2F8F0] = { unicodeslot=0x2F8F0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F0', specials={'char',0x238A7} }, + [0x2F8F1] = { unicodeslot=0x2F8F1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F1', specials={'char',0x6B54} }, + [0x2F8F2] = { unicodeslot=0x2F8F2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F2', specials={'char',0x3C4E} }, + [0x2F8F3] = { unicodeslot=0x2F8F3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F3', specials={'char',0x6B72} }, + [0x2F8F4] = { unicodeslot=0x2F8F4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F4', specials={'char',0x6B9F} }, + [0x2F8F5] = { unicodeslot=0x2F8F5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F5', specials={'char',0x6BBA} }, + [0x2F8F6] = { unicodeslot=0x2F8F6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F6', specials={'char',0x6BBB} }, + [0x2F8F7] = { unicodeslot=0x2F8F7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F7', specials={'char',0x23A8D} }, + [0x2F8F8] = { unicodeslot=0x2F8F8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F8', specials={'char',0x21D0B} }, + [0x2F8F9] = { unicodeslot=0x2F8F9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8F9', specials={'char',0x23AFA} }, + [0x2F8FA] = { unicodeslot=0x2F8FA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FA', specials={'char',0x6C4E} }, + [0x2F8FB] = { unicodeslot=0x2F8FB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FB', specials={'char',0x23CBC} }, + [0x2F8FC] = { unicodeslot=0x2F8FC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FC', specials={'char',0x6CBF} }, + [0x2F8FD] = { unicodeslot=0x2F8FD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FD', specials={'char',0x6CCD} }, + [0x2F8FE] = { unicodeslot=0x2F8FE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FE', specials={'char',0x6C67} }, + [0x2F8FF] = { unicodeslot=0x2F8FF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F8FF', specials={'char',0x6D16} }, + [0x2F900] = { unicodeslot=0x2F900, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F900', specials={'char',0x6D3E} }, + [0x2F901] = { unicodeslot=0x2F901, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F901', specials={'char',0x6D77} }, + [0x2F902] = { unicodeslot=0x2F902, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F902', specials={'char',0x6D41} }, + [0x2F903] = { unicodeslot=0x2F903, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F903', specials={'char',0x6D69} }, + [0x2F904] = { unicodeslot=0x2F904, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F904', specials={'char',0x6D78} }, + [0x2F905] = { unicodeslot=0x2F905, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F905', specials={'char',0x6D85} }, + [0x2F906] = { unicodeslot=0x2F906, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F906', specials={'char',0x23D1E} }, + [0x2F907] = { unicodeslot=0x2F907, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F907', specials={'char',0x6D34} }, + [0x2F908] = { unicodeslot=0x2F908, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F908', specials={'char',0x6E2F} }, + [0x2F909] = { unicodeslot=0x2F909, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F909', specials={'char',0x6E6E} }, + [0x2F90A] = { unicodeslot=0x2F90A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90A', specials={'char',0x3D33} }, + [0x2F90B] = { unicodeslot=0x2F90B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90B', specials={'char',0x6ECB} }, + [0x2F90C] = { unicodeslot=0x2F90C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90C', specials={'char',0x6EC7} }, + [0x2F90D] = { unicodeslot=0x2F90D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90D', specials={'char',0x23ED1} }, + [0x2F90E] = { unicodeslot=0x2F90E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90E', specials={'char',0x6DF9} }, + [0x2F90F] = { unicodeslot=0x2F90F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F90F', specials={'char',0x6F6E} }, + [0x2F910] = { unicodeslot=0x2F910, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F910', specials={'char',0x23F5E} }, + [0x2F911] = { unicodeslot=0x2F911, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F911', specials={'char',0x23F8E} }, + [0x2F912] = { unicodeslot=0x2F912, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F912', specials={'char',0x6FC6} }, + [0x2F913] = { unicodeslot=0x2F913, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F913', specials={'char',0x7039} }, + [0x2F914] = { unicodeslot=0x2F914, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F914', specials={'char',0x701E} }, + [0x2F915] = { unicodeslot=0x2F915, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F915', specials={'char',0x701B} }, + [0x2F916] = { unicodeslot=0x2F916, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F916', specials={'char',0x3D96} }, + [0x2F917] = { unicodeslot=0x2F917, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F917', specials={'char',0x704A} }, + [0x2F918] = { unicodeslot=0x2F918, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F918', specials={'char',0x707D} }, + [0x2F919] = { unicodeslot=0x2F919, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F919', specials={'char',0x7077} }, + [0x2F91A] = { unicodeslot=0x2F91A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91A', specials={'char',0x70AD} }, + [0x2F91B] = { unicodeslot=0x2F91B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91B', specials={'char',0x20525} }, + [0x2F91C] = { unicodeslot=0x2F91C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91C', specials={'char',0x7145} }, + [0x2F91D] = { unicodeslot=0x2F91D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91D', specials={'char',0x24263} }, + [0x2F91E] = { unicodeslot=0x2F91E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91E', specials={'char',0x719C} }, + [0x2F91F] = { unicodeslot=0x2F91F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F91F', specials={'char',0x243AB} }, + [0x2F920] = { unicodeslot=0x2F920, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F920', specials={'char',0x7228} }, + [0x2F921] = { unicodeslot=0x2F921, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F921', specials={'char',0x7235} }, + [0x2F922] = { unicodeslot=0x2F922, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F922', specials={'char',0x7250} }, + [0x2F923] = { unicodeslot=0x2F923, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F923', specials={'char',0x24608} }, + [0x2F924] = { unicodeslot=0x2F924, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F924', specials={'char',0x7280} }, + [0x2F925] = { unicodeslot=0x2F925, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F925', specials={'char',0x7295} }, + [0x2F926] = { unicodeslot=0x2F926, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F926', specials={'char',0x24735} }, + [0x2F927] = { unicodeslot=0x2F927, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F927', specials={'char',0x24814} }, + [0x2F928] = { unicodeslot=0x2F928, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F928', specials={'char',0x737A} }, + [0x2F929] = { unicodeslot=0x2F929, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F929', specials={'char',0x738B} }, + [0x2F92A] = { unicodeslot=0x2F92A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92A', specials={'char',0x3EAC} }, + [0x2F92B] = { unicodeslot=0x2F92B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92B', specials={'char',0x73A5} }, + [0x2F92C] = { unicodeslot=0x2F92C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92C', specials={'char',0x3EB8} }, + [0x2F92D] = { unicodeslot=0x2F92D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92D', specials={'char',0x3EB8} }, + [0x2F92E] = { unicodeslot=0x2F92E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92E', specials={'char',0x7447} }, + [0x2F92F] = { unicodeslot=0x2F92F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F92F', specials={'char',0x745C} }, + [0x2F930] = { unicodeslot=0x2F930, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F930', specials={'char',0x7471} }, + [0x2F931] = { unicodeslot=0x2F931, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F931', specials={'char',0x7485} }, + [0x2F932] = { unicodeslot=0x2F932, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F932', specials={'char',0x74CA} }, + [0x2F933] = { unicodeslot=0x2F933, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F933', specials={'char',0x3F1B} }, + [0x2F934] = { unicodeslot=0x2F934, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F934', specials={'char',0x7524} }, + [0x2F935] = { unicodeslot=0x2F935, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F935', specials={'char',0x24C36} }, + [0x2F936] = { unicodeslot=0x2F936, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F936', specials={'char',0x753E} }, + [0x2F937] = { unicodeslot=0x2F937, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F937', specials={'char',0x24C92} }, + [0x2F938] = { unicodeslot=0x2F938, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F938', specials={'char',0x7570} }, + [0x2F939] = { unicodeslot=0x2F939, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F939', specials={'char',0x2219F} }, + [0x2F93A] = { unicodeslot=0x2F93A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93A', specials={'char',0x7610} }, + [0x2F93B] = { unicodeslot=0x2F93B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93B', specials={'char',0x24FA1} }, + [0x2F93C] = { unicodeslot=0x2F93C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93C', specials={'char',0x24FB8} }, + [0x2F93D] = { unicodeslot=0x2F93D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93D', specials={'char',0x25044} }, + [0x2F93E] = { unicodeslot=0x2F93E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93E', specials={'char',0x3FFC} }, + [0x2F93F] = { unicodeslot=0x2F93F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F93F', specials={'char',0x4008} }, + [0x2F940] = { unicodeslot=0x2F940, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F940', specials={'char',0x76F4} }, + [0x2F941] = { unicodeslot=0x2F941, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F941', specials={'char',0x250F3} }, + [0x2F942] = { unicodeslot=0x2F942, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F942', specials={'char',0x250F2} }, + [0x2F943] = { unicodeslot=0x2F943, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F943', specials={'char',0x25119} }, + [0x2F944] = { unicodeslot=0x2F944, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F944', specials={'char',0x25133} }, + [0x2F945] = { unicodeslot=0x2F945, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F945', specials={'char',0x771E} }, + [0x2F946] = { unicodeslot=0x2F946, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F946', specials={'char',0x771F} }, + [0x2F947] = { unicodeslot=0x2F947, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F947', specials={'char',0x771F} }, + [0x2F948] = { unicodeslot=0x2F948, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F948', specials={'char',0x774A} }, + [0x2F949] = { unicodeslot=0x2F949, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F949', specials={'char',0x4039} }, + [0x2F94A] = { unicodeslot=0x2F94A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94A', specials={'char',0x778B} }, + [0x2F94B] = { unicodeslot=0x2F94B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94B', specials={'char',0x4046} }, + [0x2F94C] = { unicodeslot=0x2F94C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94C', specials={'char',0x4096} }, + [0x2F94D] = { unicodeslot=0x2F94D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94D', specials={'char',0x2541D} }, + [0x2F94E] = { unicodeslot=0x2F94E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94E', specials={'char',0x784E} }, + [0x2F94F] = { unicodeslot=0x2F94F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F94F', specials={'char',0x788C} }, + [0x2F950] = { unicodeslot=0x2F950, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F950', specials={'char',0x78CC} }, + [0x2F951] = { unicodeslot=0x2F951, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F951', specials={'char',0x40E3} }, + [0x2F952] = { unicodeslot=0x2F952, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F952', specials={'char',0x25626} }, + [0x2F953] = { unicodeslot=0x2F953, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F953', specials={'char',0x7956} }, + [0x2F954] = { unicodeslot=0x2F954, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F954', specials={'char',0x2569A} }, + [0x2F955] = { unicodeslot=0x2F955, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F955', specials={'char',0x256C5} }, + [0x2F956] = { unicodeslot=0x2F956, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F956', specials={'char',0x798F} }, + [0x2F957] = { unicodeslot=0x2F957, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F957', specials={'char',0x79EB} }, + [0x2F958] = { unicodeslot=0x2F958, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F958', specials={'char',0x412F} }, + [0x2F959] = { unicodeslot=0x2F959, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F959', specials={'char',0x7A40} }, + [0x2F95A] = { unicodeslot=0x2F95A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95A', specials={'char',0x7A4A} }, + [0x2F95B] = { unicodeslot=0x2F95B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95B', specials={'char',0x7A4F} }, + [0x2F95C] = { unicodeslot=0x2F95C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95C', specials={'char',0x2597C} }, + [0x2F95D] = { unicodeslot=0x2F95D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95D', specials={'char',0x25AA7} }, + [0x2F95E] = { unicodeslot=0x2F95E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95E', specials={'char',0x25AA7} }, + [0x2F95F] = { unicodeslot=0x2F95F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F95F', specials={'char',0x7AEE} }, + [0x2F960] = { unicodeslot=0x2F960, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F960', specials={'char',0x4202} }, + [0x2F961] = { unicodeslot=0x2F961, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F961', specials={'char',0x25BAB} }, + [0x2F962] = { unicodeslot=0x2F962, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F962', specials={'char',0x7BC6} }, + [0x2F963] = { unicodeslot=0x2F963, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F963', specials={'char',0x7BC9} }, + [0x2F964] = { unicodeslot=0x2F964, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F964', specials={'char',0x4227} }, + [0x2F965] = { unicodeslot=0x2F965, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F965', specials={'char',0x25C80} }, + [0x2F966] = { unicodeslot=0x2F966, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F966', specials={'char',0x7CD2} }, + [0x2F967] = { unicodeslot=0x2F967, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F967', specials={'char',0x42A0} }, + [0x2F968] = { unicodeslot=0x2F968, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F968', specials={'char',0x7CE8} }, + [0x2F969] = { unicodeslot=0x2F969, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F969', specials={'char',0x7CE3} }, + [0x2F96A] = { unicodeslot=0x2F96A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96A', specials={'char',0x7D00} }, + [0x2F96B] = { unicodeslot=0x2F96B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96B', specials={'char',0x25F86} }, + [0x2F96C] = { unicodeslot=0x2F96C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96C', specials={'char',0x7D63} }, + [0x2F96D] = { unicodeslot=0x2F96D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96D', specials={'char',0x4301} }, + [0x2F96E] = { unicodeslot=0x2F96E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96E', specials={'char',0x7DC7} }, + [0x2F96F] = { unicodeslot=0x2F96F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F96F', specials={'char',0x7E02} }, + [0x2F970] = { unicodeslot=0x2F970, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F970', specials={'char',0x7E45} }, + [0x2F971] = { unicodeslot=0x2F971, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F971', specials={'char',0x4334} }, + [0x2F972] = { unicodeslot=0x2F972, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F972', specials={'char',0x26228} }, + [0x2F973] = { unicodeslot=0x2F973, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F973', specials={'char',0x26247} }, + [0x2F974] = { unicodeslot=0x2F974, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F974', specials={'char',0x4359} }, + [0x2F975] = { unicodeslot=0x2F975, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F975', specials={'char',0x262D9} }, + [0x2F976] = { unicodeslot=0x2F976, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F976', specials={'char',0x7F7A} }, + [0x2F977] = { unicodeslot=0x2F977, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F977', specials={'char',0x2633E} }, + [0x2F978] = { unicodeslot=0x2F978, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F978', specials={'char',0x7F95} }, + [0x2F979] = { unicodeslot=0x2F979, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F979', specials={'char',0x7FFA} }, + [0x2F97A] = { unicodeslot=0x2F97A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97A', specials={'char',0x8005} }, + [0x2F97B] = { unicodeslot=0x2F97B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97B', specials={'char',0x264DA} }, + [0x2F97C] = { unicodeslot=0x2F97C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97C', specials={'char',0x26523} }, + [0x2F97D] = { unicodeslot=0x2F97D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97D', specials={'char',0x8060} }, + [0x2F97E] = { unicodeslot=0x2F97E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97E', specials={'char',0x265A8} }, + [0x2F97F] = { unicodeslot=0x2F97F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F97F', specials={'char',0x8070} }, + [0x2F980] = { unicodeslot=0x2F980, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F980', specials={'char',0x2335F} }, + [0x2F981] = { unicodeslot=0x2F981, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F981', specials={'char',0x43D5} }, + [0x2F982] = { unicodeslot=0x2F982, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F982', specials={'char',0x80B2} }, + [0x2F983] = { unicodeslot=0x2F983, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F983', specials={'char',0x8103} }, + [0x2F984] = { unicodeslot=0x2F984, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F984', specials={'char',0x440B} }, + [0x2F985] = { unicodeslot=0x2F985, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F985', specials={'char',0x813E} }, + [0x2F986] = { unicodeslot=0x2F986, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F986', specials={'char',0x5AB5} }, + [0x2F987] = { unicodeslot=0x2F987, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F987', specials={'char',0x267A7} }, + [0x2F988] = { unicodeslot=0x2F988, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F988', specials={'char',0x267B5} }, + [0x2F989] = { unicodeslot=0x2F989, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F989', specials={'char',0x23393} }, + [0x2F98A] = { unicodeslot=0x2F98A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98A', specials={'char',0x2339C} }, + [0x2F98B] = { unicodeslot=0x2F98B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98B', specials={'char',0x8201} }, + [0x2F98C] = { unicodeslot=0x2F98C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98C', specials={'char',0x8204} }, + [0x2F98D] = { unicodeslot=0x2F98D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98D', specials={'char',0x8F9E} }, + [0x2F98E] = { unicodeslot=0x2F98E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98E', specials={'char',0x446B} }, + [0x2F98F] = { unicodeslot=0x2F98F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F98F', specials={'char',0x8291} }, + [0x2F990] = { unicodeslot=0x2F990, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F990', specials={'char',0x828B} }, + [0x2F991] = { unicodeslot=0x2F991, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F991', specials={'char',0x829D} }, + [0x2F992] = { unicodeslot=0x2F992, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F992', specials={'char',0x52B3} }, + [0x2F993] = { unicodeslot=0x2F993, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F993', specials={'char',0x82B1} }, + [0x2F994] = { unicodeslot=0x2F994, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F994', specials={'char',0x82B3} }, + [0x2F995] = { unicodeslot=0x2F995, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F995', specials={'char',0x82BD} }, + [0x2F996] = { unicodeslot=0x2F996, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F996', specials={'char',0x82E6} }, + [0x2F997] = { unicodeslot=0x2F997, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F997', specials={'char',0x26B3C} }, + [0x2F998] = { unicodeslot=0x2F998, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F998', specials={'char',0x82E5} }, + [0x2F999] = { unicodeslot=0x2F999, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F999', specials={'char',0x831D} }, + [0x2F99A] = { unicodeslot=0x2F99A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99A', specials={'char',0x8363} }, + [0x2F99B] = { unicodeslot=0x2F99B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99B', specials={'char',0x83AD} }, + [0x2F99C] = { unicodeslot=0x2F99C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99C', specials={'char',0x8323} }, + [0x2F99D] = { unicodeslot=0x2F99D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99D', specials={'char',0x83BD} }, + [0x2F99E] = { unicodeslot=0x2F99E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99E', specials={'char',0x83E7} }, + [0x2F99F] = { unicodeslot=0x2F99F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F99F', specials={'char',0x8457} }, + [0x2F9A0] = { unicodeslot=0x2F9A0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A0', specials={'char',0x8353} }, + [0x2F9A1] = { unicodeslot=0x2F9A1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A1', specials={'char',0x83CA} }, + [0x2F9A2] = { unicodeslot=0x2F9A2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A2', specials={'char',0x83CC} }, + [0x2F9A3] = { unicodeslot=0x2F9A3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A3', specials={'char',0x83DC} }, + [0x2F9A4] = { unicodeslot=0x2F9A4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A4', specials={'char',0x26C36} }, + [0x2F9A5] = { unicodeslot=0x2F9A5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A5', specials={'char',0x26D6B} }, + [0x2F9A6] = { unicodeslot=0x2F9A6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A6', specials={'char',0x26CD5} }, + [0x2F9A7] = { unicodeslot=0x2F9A7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A7', specials={'char',0x452B} }, + [0x2F9A8] = { unicodeslot=0x2F9A8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A8', specials={'char',0x84F1} }, + [0x2F9A9] = { unicodeslot=0x2F9A9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9A9', specials={'char',0x84F3} }, + [0x2F9AA] = { unicodeslot=0x2F9AA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AA', specials={'char',0x8516} }, + [0x2F9AB] = { unicodeslot=0x2F9AB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AB', specials={'char',0x273CA} }, + [0x2F9AC] = { unicodeslot=0x2F9AC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AC', specials={'char',0x8564} }, + [0x2F9AD] = { unicodeslot=0x2F9AD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AD', specials={'char',0x26F2C} }, + [0x2F9AE] = { unicodeslot=0x2F9AE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AE', specials={'char',0x455D} }, + [0x2F9AF] = { unicodeslot=0x2F9AF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9AF', specials={'char',0x4561} }, + [0x2F9B0] = { unicodeslot=0x2F9B0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B0', specials={'char',0x26FB1} }, + [0x2F9B1] = { unicodeslot=0x2F9B1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B1', specials={'char',0x270D2} }, + [0x2F9B2] = { unicodeslot=0x2F9B2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B2', specials={'char',0x456B} }, + [0x2F9B3] = { unicodeslot=0x2F9B3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B3', specials={'char',0x8650} }, + [0x2F9B4] = { unicodeslot=0x2F9B4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B4', specials={'char',0x865C} }, + [0x2F9B5] = { unicodeslot=0x2F9B5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B5', specials={'char',0x8667} }, + [0x2F9B6] = { unicodeslot=0x2F9B6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B6', specials={'char',0x8669} }, + [0x2F9B7] = { unicodeslot=0x2F9B7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B7', specials={'char',0x86A9} }, + [0x2F9B8] = { unicodeslot=0x2F9B8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B8', specials={'char',0x8688} }, + [0x2F9B9] = { unicodeslot=0x2F9B9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9B9', specials={'char',0x870E} }, + [0x2F9BA] = { unicodeslot=0x2F9BA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BA', specials={'char',0x86E2} }, + [0x2F9BB] = { unicodeslot=0x2F9BB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BB', specials={'char',0x8779} }, + [0x2F9BC] = { unicodeslot=0x2F9BC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BC', specials={'char',0x8728} }, + [0x2F9BD] = { unicodeslot=0x2F9BD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BD', specials={'char',0x876B} }, + [0x2F9BE] = { unicodeslot=0x2F9BE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BE', specials={'char',0x8786} }, + [0x2F9BF] = { unicodeslot=0x2F9BF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9BF', specials={'char',0x45D7} }, + [0x2F9C0] = { unicodeslot=0x2F9C0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C0', specials={'char',0x87E1} }, + [0x2F9C1] = { unicodeslot=0x2F9C1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C1', specials={'char',0x8801} }, + [0x2F9C2] = { unicodeslot=0x2F9C2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C2', specials={'char',0x45F9} }, + [0x2F9C3] = { unicodeslot=0x2F9C3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C3', specials={'char',0x8860} }, + [0x2F9C4] = { unicodeslot=0x2F9C4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C4', specials={'char',0x8863} }, + [0x2F9C5] = { unicodeslot=0x2F9C5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C5', specials={'char',0x27667} }, + [0x2F9C6] = { unicodeslot=0x2F9C6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C6', specials={'char',0x88D7} }, + [0x2F9C7] = { unicodeslot=0x2F9C7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C7', specials={'char',0x88DE} }, + [0x2F9C8] = { unicodeslot=0x2F9C8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C8', specials={'char',0x4635} }, + [0x2F9C9] = { unicodeslot=0x2F9C9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9C9', specials={'char',0x88FA} }, + [0x2F9CA] = { unicodeslot=0x2F9CA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CA', specials={'char',0x34BB} }, + [0x2F9CB] = { unicodeslot=0x2F9CB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CB', specials={'char',0x278AE} }, + [0x2F9CC] = { unicodeslot=0x2F9CC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CC', specials={'char',0x27966} }, + [0x2F9CD] = { unicodeslot=0x2F9CD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CD', specials={'char',0x46BE} }, + [0x2F9CE] = { unicodeslot=0x2F9CE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CE', specials={'char',0x46C7} }, + [0x2F9CF] = { unicodeslot=0x2F9CF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9CF', specials={'char',0x8AA0} }, + [0x2F9D0] = { unicodeslot=0x2F9D0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D0', specials={'char',0x8AED} }, + [0x2F9D1] = { unicodeslot=0x2F9D1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D1', specials={'char',0x8B8A} }, + [0x2F9D2] = { unicodeslot=0x2F9D2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D2', specials={'char',0x8C55} }, + [0x2F9D3] = { unicodeslot=0x2F9D3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D3', specials={'char',0x27CA8} }, + [0x2F9D4] = { unicodeslot=0x2F9D4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D4', specials={'char',0x8CAB} }, + [0x2F9D5] = { unicodeslot=0x2F9D5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D5', specials={'char',0x8CC1} }, + [0x2F9D6] = { unicodeslot=0x2F9D6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D6', specials={'char',0x8D1B} }, + [0x2F9D7] = { unicodeslot=0x2F9D7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D7', specials={'char',0x8D77} }, + [0x2F9D8] = { unicodeslot=0x2F9D8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D8', specials={'char',0x27F2F} }, + [0x2F9D9] = { unicodeslot=0x2F9D9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9D9', specials={'char',0x20804} }, + [0x2F9DA] = { unicodeslot=0x2F9DA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DA', specials={'char',0x8DCB} }, + [0x2F9DB] = { unicodeslot=0x2F9DB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DB', specials={'char',0x8DBC} }, + [0x2F9DC] = { unicodeslot=0x2F9DC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DC', specials={'char',0x8DF0} }, + [0x2F9DD] = { unicodeslot=0x2F9DD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DD', specials={'char',0x208DE} }, + [0x2F9DE] = { unicodeslot=0x2F9DE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DE', specials={'char',0x8ED4} }, + [0x2F9DF] = { unicodeslot=0x2F9DF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9DF', specials={'char',0x8F38} }, + [0x2F9E0] = { unicodeslot=0x2F9E0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E0', specials={'char',0x285D2} }, + [0x2F9E1] = { unicodeslot=0x2F9E1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E1', specials={'char',0x285ED} }, + [0x2F9E2] = { unicodeslot=0x2F9E2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E2', specials={'char',0x9094} }, + [0x2F9E3] = { unicodeslot=0x2F9E3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E3', specials={'char',0x90F1} }, + [0x2F9E4] = { unicodeslot=0x2F9E4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E4', specials={'char',0x9111} }, + [0x2F9E5] = { unicodeslot=0x2F9E5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E5', specials={'char',0x2872E} }, + [0x2F9E6] = { unicodeslot=0x2F9E6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E6', specials={'char',0x911B} }, + [0x2F9E7] = { unicodeslot=0x2F9E7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E7', specials={'char',0x9238} }, + [0x2F9E8] = { unicodeslot=0x2F9E8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E8', specials={'char',0x92D7} }, + [0x2F9E9] = { unicodeslot=0x2F9E9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9E9', specials={'char',0x92D8} }, + [0x2F9EA] = { unicodeslot=0x2F9EA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9EA', specials={'char',0x927C} }, + [0x2F9EB] = { unicodeslot=0x2F9EB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9EB', specials={'char',0x93F9} }, + [0x2F9EC] = { unicodeslot=0x2F9EC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9EC', specials={'char',0x9415} }, + [0x2F9ED] = { unicodeslot=0x2F9ED, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9ED', specials={'char',0x28BFA} }, + [0x2F9EE] = { unicodeslot=0x2F9EE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9EE', specials={'char',0x958B} }, + [0x2F9EF] = { unicodeslot=0x2F9EF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9EF', specials={'char',0x4995} }, + [0x2F9F0] = { unicodeslot=0x2F9F0, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F0', specials={'char',0x95B7} }, + [0x2F9F1] = { unicodeslot=0x2F9F1, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F1', specials={'char',0x28D77} }, + [0x2F9F2] = { unicodeslot=0x2F9F2, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F2', specials={'char',0x49E6} }, + [0x2F9F3] = { unicodeslot=0x2F9F3, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F3', specials={'char',0x96C3} }, + [0x2F9F4] = { unicodeslot=0x2F9F4, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F4', specials={'char',0x5DB2} }, + [0x2F9F5] = { unicodeslot=0x2F9F5, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F5', specials={'char',0x9723} }, + [0x2F9F6] = { unicodeslot=0x2F9F6, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F6', specials={'char',0x29145} }, + [0x2F9F7] = { unicodeslot=0x2F9F7, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F7', specials={'char',0x2921A} }, + [0x2F9F8] = { unicodeslot=0x2F9F8, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F8', specials={'char',0x4A6E} }, + [0x2F9F9] = { unicodeslot=0x2F9F9, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9F9', specials={'char',0x4A76} }, + [0x2F9FA] = { unicodeslot=0x2F9FA, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FA', specials={'char',0x97E0} }, + [0x2F9FB] = { unicodeslot=0x2F9FB, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FB', specials={'char',0x2940A} }, + [0x2F9FC] = { unicodeslot=0x2F9FC, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FC', specials={'char',0x4AB2} }, + [0x2F9FD] = { unicodeslot=0x2F9FD, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FD', specials={'char',0x29496} }, + [0x2F9FE] = { unicodeslot=0x2F9FE, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FE', specials={'char',0x980B} }, + [0x2F9FF] = { unicodeslot=0x2F9FF, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2F9FF', specials={'char',0x980B} }, + [0x2FA00] = { unicodeslot=0x2FA00, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA00', specials={'char',0x9829} }, + [0x2FA01] = { unicodeslot=0x2FA01, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA01', specials={'char',0x295B6} }, + [0x2FA02] = { unicodeslot=0x2FA02, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA02', specials={'char',0x98E2} }, + [0x2FA03] = { unicodeslot=0x2FA03, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA03', specials={'char',0x4B33} }, + [0x2FA04] = { unicodeslot=0x2FA04, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA04', specials={'char',0x9929} }, + [0x2FA05] = { unicodeslot=0x2FA05, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA05', specials={'char',0x99A7} }, + [0x2FA06] = { unicodeslot=0x2FA06, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA06', specials={'char',0x99C2} }, + [0x2FA07] = { unicodeslot=0x2FA07, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA07', specials={'char',0x99FE} }, + [0x2FA08] = { unicodeslot=0x2FA08, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA08', specials={'char',0x4BCE} }, + [0x2FA09] = { unicodeslot=0x2FA09, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA09', specials={'char',0x29B30} }, + [0x2FA0A] = { unicodeslot=0x2FA0A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0A', specials={'char',0x9B12} }, + [0x2FA0B] = { unicodeslot=0x2FA0B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0B', specials={'char',0x9C40} }, + [0x2FA0C] = { unicodeslot=0x2FA0C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0C', specials={'char',0x9CFD} }, + [0x2FA0D] = { unicodeslot=0x2FA0D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0D', specials={'char',0x4CCE} }, + [0x2FA0E] = { unicodeslot=0x2FA0E, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0E', specials={'char',0x4CED} }, + [0x2FA0F] = { unicodeslot=0x2FA0F, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA0F', specials={'char',0x9D67} }, + [0x2FA10] = { unicodeslot=0x2FA10, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA10', specials={'char',0x2A0CE} }, + [0x2FA11] = { unicodeslot=0x2FA11, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA11', specials={'char',0x4CF8} }, + [0x2FA12] = { unicodeslot=0x2FA12, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA12', specials={'char',0x2A105} }, + [0x2FA13] = { unicodeslot=0x2FA13, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA13', specials={'char',0x2A20E} }, + [0x2FA14] = { unicodeslot=0x2FA14, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA14', specials={'char',0x2A291} }, + [0x2FA15] = { unicodeslot=0x2FA15, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA15', specials={'char',0x9EBB} }, + [0x2FA16] = { unicodeslot=0x2FA16, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA16', specials={'char',0x4D56} }, + [0x2FA17] = { unicodeslot=0x2FA17, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA17', specials={'char',0x9EF9} }, + [0x2FA18] = { unicodeslot=0x2FA18, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA18', specials={'char',0x9EFE} }, + [0x2FA19] = { unicodeslot=0x2FA19, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA19', specials={'char',0x9F05} }, + [0x2FA1A] = { unicodeslot=0x2FA1A, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA1A', specials={'char',0x9F0F} }, + [0x2FA1B] = { unicodeslot=0x2FA1B, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA1B', specials={'char',0x9F16} }, + [0x2FA1C] = { unicodeslot=0x2FA1C, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA1C', specials={'char',0x9F3B} }, + [0x2FA1D] = { unicodeslot=0x2FA1D, category='lo', description='CJK COMPATIBILITY IDEOGRAPH-2FA1D', specials={'char',0x2A600} }, + [0xE0001] = { unicodeslot=0xE0001, category='cf', description='LANGUAGE TAG' }, + [0xE0020] = { unicodeslot=0xE0020, category='cf', description='TAG SPACE' }, + [0xE0021] = { unicodeslot=0xE0021, category='cf', description='TAG EXCLAMATION MARK' }, + [0xE0022] = { unicodeslot=0xE0022, category='cf', description='TAG QUOTATION MARK' }, + [0xE0023] = { unicodeslot=0xE0023, category='cf', description='TAG NUMBER SIGN' }, + [0xE0024] = { unicodeslot=0xE0024, category='cf', description='TAG DOLLAR SIGN' }, + [0xE0025] = { unicodeslot=0xE0025, category='cf', description='TAG PERCENT SIGN' }, + [0xE0026] = { unicodeslot=0xE0026, category='cf', description='TAG AMPERSAND' }, + [0xE0027] = { unicodeslot=0xE0027, category='cf', description='TAG APOSTROPHE' }, + [0xE0028] = { unicodeslot=0xE0028, category='cf', description='TAG LEFT PARENTHESIS' }, + [0xE0029] = { unicodeslot=0xE0029, category='cf', description='TAG RIGHT PARENTHESIS' }, + [0xE002A] = { unicodeslot=0xE002A, category='cf', description='TAG ASTERISK' }, + [0xE002B] = { unicodeslot=0xE002B, category='cf', description='TAG PLUS SIGN' }, + [0xE002C] = { unicodeslot=0xE002C, category='cf', description='TAG COMMA' }, + [0xE002D] = { unicodeslot=0xE002D, category='cf', description='TAG HYPHEN-MINUS' }, + [0xE002E] = { unicodeslot=0xE002E, category='cf', description='TAG FULL STOP' }, + [0xE002F] = { unicodeslot=0xE002F, category='cf', description='TAG SOLIDUS' }, + [0xE0030] = { unicodeslot=0xE0030, category='cf', description='TAG DIGIT ZERO' }, + [0xE0031] = { unicodeslot=0xE0031, category='cf', description='TAG DIGIT ONE' }, + [0xE0032] = { unicodeslot=0xE0032, category='cf', description='TAG DIGIT TWO' }, + [0xE0033] = { unicodeslot=0xE0033, category='cf', description='TAG DIGIT THREE' }, + [0xE0034] = { unicodeslot=0xE0034, category='cf', description='TAG DIGIT FOUR' }, + [0xE0035] = { unicodeslot=0xE0035, category='cf', description='TAG DIGIT FIVE' }, + [0xE0036] = { unicodeslot=0xE0036, category='cf', description='TAG DIGIT SIX' }, + [0xE0037] = { unicodeslot=0xE0037, category='cf', description='TAG DIGIT SEVEN' }, + [0xE0038] = { unicodeslot=0xE0038, category='cf', description='TAG DIGIT EIGHT' }, + [0xE0039] = { unicodeslot=0xE0039, category='cf', description='TAG DIGIT NINE' }, + [0xE003A] = { unicodeslot=0xE003A, category='cf', description='TAG COLON' }, + [0xE003B] = { unicodeslot=0xE003B, category='cf', description='TAG SEMICOLON' }, + [0xE003C] = { unicodeslot=0xE003C, category='cf', description='TAG LESS-THAN SIGN' }, + [0xE003D] = { unicodeslot=0xE003D, category='cf', description='TAG EQUALS SIGN' }, + [0xE003E] = { unicodeslot=0xE003E, category='cf', description='TAG GREATER-THAN SIGN' }, + [0xE003F] = { unicodeslot=0xE003F, category='cf', description='TAG QUESTION MARK' }, + [0xE0040] = { unicodeslot=0xE0040, category='cf', description='TAG COMMERCIAL AT' }, + [0xE0041] = { unicodeslot=0xE0041, category='cf', description='TAG LATIN CAPITAL LETTER A' }, + [0xE0042] = { unicodeslot=0xE0042, category='cf', description='TAG LATIN CAPITAL LETTER B' }, + [0xE0043] = { unicodeslot=0xE0043, category='cf', description='TAG LATIN CAPITAL LETTER C' }, + [0xE0044] = { unicodeslot=0xE0044, category='cf', description='TAG LATIN CAPITAL LETTER D' }, + [0xE0045] = { unicodeslot=0xE0045, category='cf', description='TAG LATIN CAPITAL LETTER E' }, + [0xE0046] = { unicodeslot=0xE0046, category='cf', description='TAG LATIN CAPITAL LETTER F' }, + [0xE0047] = { unicodeslot=0xE0047, category='cf', description='TAG LATIN CAPITAL LETTER G' }, + [0xE0048] = { unicodeslot=0xE0048, category='cf', description='TAG LATIN CAPITAL LETTER H' }, + [0xE0049] = { unicodeslot=0xE0049, category='cf', description='TAG LATIN CAPITAL LETTER I' }, + [0xE004A] = { unicodeslot=0xE004A, category='cf', description='TAG LATIN CAPITAL LETTER J' }, + [0xE004B] = { unicodeslot=0xE004B, category='cf', description='TAG LATIN CAPITAL LETTER K' }, + [0xE004C] = { unicodeslot=0xE004C, category='cf', description='TAG LATIN CAPITAL LETTER L' }, + [0xE004D] = { unicodeslot=0xE004D, category='cf', description='TAG LATIN CAPITAL LETTER M' }, + [0xE004E] = { unicodeslot=0xE004E, category='cf', description='TAG LATIN CAPITAL LETTER N' }, + [0xE004F] = { unicodeslot=0xE004F, category='cf', description='TAG LATIN CAPITAL LETTER O' }, + [0xE0050] = { unicodeslot=0xE0050, category='cf', description='TAG LATIN CAPITAL LETTER P' }, + [0xE0051] = { unicodeslot=0xE0051, category='cf', description='TAG LATIN CAPITAL LETTER Q' }, + [0xE0052] = { unicodeslot=0xE0052, category='cf', description='TAG LATIN CAPITAL LETTER R' }, + [0xE0053] = { unicodeslot=0xE0053, category='cf', description='TAG LATIN CAPITAL LETTER S' }, + [0xE0054] = { unicodeslot=0xE0054, category='cf', description='TAG LATIN CAPITAL LETTER T' }, + [0xE0055] = { unicodeslot=0xE0055, category='cf', description='TAG LATIN CAPITAL LETTER U' }, + [0xE0056] = { unicodeslot=0xE0056, category='cf', description='TAG LATIN CAPITAL LETTER V' }, + [0xE0057] = { unicodeslot=0xE0057, category='cf', description='TAG LATIN CAPITAL LETTER W' }, + [0xE0058] = { unicodeslot=0xE0058, category='cf', description='TAG LATIN CAPITAL LETTER X' }, + [0xE0059] = { unicodeslot=0xE0059, category='cf', description='TAG LATIN CAPITAL LETTER Y' }, + [0xE005A] = { unicodeslot=0xE005A, category='cf', description='TAG LATIN CAPITAL LETTER Z' }, + [0xE005B] = { unicodeslot=0xE005B, category='cf', description='TAG LEFT SQUARE BRACKET' }, + [0xE005C] = { unicodeslot=0xE005C, category='cf', description='TAG REVERSE SOLIDUS' }, + [0xE005D] = { unicodeslot=0xE005D, category='cf', description='TAG RIGHT SQUARE BRACKET' }, + [0xE005E] = { unicodeslot=0xE005E, category='cf', description='TAG CIRCUMFLEX ACCENT' }, + [0xE005F] = { unicodeslot=0xE005F, category='cf', description='TAG LOW LINE' }, + [0xE0060] = { unicodeslot=0xE0060, category='cf', description='TAG GRAVE ACCENT' }, + [0xE0061] = { unicodeslot=0xE0061, category='cf', description='TAG LATIN SMALL LETTER A' }, + [0xE0062] = { unicodeslot=0xE0062, category='cf', description='TAG LATIN SMALL LETTER B' }, + [0xE0063] = { unicodeslot=0xE0063, category='cf', description='TAG LATIN SMALL LETTER C' }, + [0xE0064] = { unicodeslot=0xE0064, category='cf', description='TAG LATIN SMALL LETTER D' }, + [0xE0065] = { unicodeslot=0xE0065, category='cf', description='TAG LATIN SMALL LETTER E' }, + [0xE0066] = { unicodeslot=0xE0066, category='cf', description='TAG LATIN SMALL LETTER F' }, + [0xE0067] = { unicodeslot=0xE0067, category='cf', description='TAG LATIN SMALL LETTER G' }, + [0xE0068] = { unicodeslot=0xE0068, category='cf', description='TAG LATIN SMALL LETTER H' }, + [0xE0069] = { unicodeslot=0xE0069, category='cf', description='TAG LATIN SMALL LETTER I' }, + [0xE006A] = { unicodeslot=0xE006A, category='cf', description='TAG LATIN SMALL LETTER J' }, + [0xE006B] = { unicodeslot=0xE006B, category='cf', description='TAG LATIN SMALL LETTER K' }, + [0xE006C] = { unicodeslot=0xE006C, category='cf', description='TAG LATIN SMALL LETTER L' }, + [0xE006D] = { unicodeslot=0xE006D, category='cf', description='TAG LATIN SMALL LETTER M' }, + [0xE006E] = { unicodeslot=0xE006E, category='cf', description='TAG LATIN SMALL LETTER N' }, + [0xE006F] = { unicodeslot=0xE006F, category='cf', description='TAG LATIN SMALL LETTER O' }, + [0xE0070] = { unicodeslot=0xE0070, category='cf', description='TAG LATIN SMALL LETTER P' }, + [0xE0071] = { unicodeslot=0xE0071, category='cf', description='TAG LATIN SMALL LETTER Q' }, + [0xE0072] = { unicodeslot=0xE0072, category='cf', description='TAG LATIN SMALL LETTER R' }, + [0xE0073] = { unicodeslot=0xE0073, category='cf', description='TAG LATIN SMALL LETTER S' }, + [0xE0074] = { unicodeslot=0xE0074, category='cf', description='TAG LATIN SMALL LETTER T' }, + [0xE0075] = { unicodeslot=0xE0075, category='cf', description='TAG LATIN SMALL LETTER U' }, + [0xE0076] = { unicodeslot=0xE0076, category='cf', description='TAG LATIN SMALL LETTER V' }, + [0xE0077] = { unicodeslot=0xE0077, category='cf', description='TAG LATIN SMALL LETTER W' }, + [0xE0078] = { unicodeslot=0xE0078, category='cf', description='TAG LATIN SMALL LETTER X' }, + [0xE0079] = { unicodeslot=0xE0079, category='cf', description='TAG LATIN SMALL LETTER Y' }, + [0xE007A] = { unicodeslot=0xE007A, category='cf', description='TAG LATIN SMALL LETTER Z' }, + [0xE007B] = { unicodeslot=0xE007B, category='cf', description='TAG LEFT CURLY BRACKET' }, + [0xE007C] = { unicodeslot=0xE007C, category='cf', description='TAG VERTICAL LINE' }, + [0xE007D] = { unicodeslot=0xE007D, category='cf', description='TAG RIGHT CURLY BRACKET' }, + [0xE007E] = { unicodeslot=0xE007E, category='cf', description='TAG TILDE' }, + [0xE007F] = { unicodeslot=0xE007F, category='cf', description='CANCEL TAG' }, + [0xE0100] = { unicodeslot=0xE0100, category='mn', description='VARIATION SELECTOR-17' }, + [0xE0101] = { unicodeslot=0xE0101, category='mn', description='VARIATION SELECTOR-18' }, + [0xE0102] = { unicodeslot=0xE0102, category='mn', description='VARIATION SELECTOR-19' }, + [0xE0103] = { unicodeslot=0xE0103, category='mn', description='VARIATION SELECTOR-20' }, + [0xE0104] = { unicodeslot=0xE0104, category='mn', description='VARIATION SELECTOR-21' }, + [0xE0105] = { unicodeslot=0xE0105, category='mn', description='VARIATION SELECTOR-22' }, + [0xE0106] = { unicodeslot=0xE0106, category='mn', description='VARIATION SELECTOR-23' }, + [0xE0107] = { unicodeslot=0xE0107, category='mn', description='VARIATION SELECTOR-24' }, + [0xE0108] = { unicodeslot=0xE0108, category='mn', description='VARIATION SELECTOR-25' }, + [0xE0109] = { unicodeslot=0xE0109, category='mn', description='VARIATION SELECTOR-26' }, + [0xE010A] = { unicodeslot=0xE010A, category='mn', description='VARIATION SELECTOR-27' }, + [0xE010B] = { unicodeslot=0xE010B, category='mn', description='VARIATION SELECTOR-28' }, + [0xE010C] = { unicodeslot=0xE010C, category='mn', description='VARIATION SELECTOR-29' }, + [0xE010D] = { unicodeslot=0xE010D, category='mn', description='VARIATION SELECTOR-30' }, + [0xE010E] = { unicodeslot=0xE010E, category='mn', description='VARIATION SELECTOR-31' }, + [0xE010F] = { unicodeslot=0xE010F, category='mn', description='VARIATION SELECTOR-32' }, + [0xE0110] = { unicodeslot=0xE0110, category='mn', description='VARIATION SELECTOR-33' }, + [0xE0111] = { unicodeslot=0xE0111, category='mn', description='VARIATION SELECTOR-34' }, + [0xE0112] = { unicodeslot=0xE0112, category='mn', description='VARIATION SELECTOR-35' }, + [0xE0113] = { unicodeslot=0xE0113, category='mn', description='VARIATION SELECTOR-36' }, + [0xE0114] = { unicodeslot=0xE0114, category='mn', description='VARIATION SELECTOR-37' }, + [0xE0115] = { unicodeslot=0xE0115, category='mn', description='VARIATION SELECTOR-38' }, + [0xE0116] = { unicodeslot=0xE0116, category='mn', description='VARIATION SELECTOR-39' }, + [0xE0117] = { unicodeslot=0xE0117, category='mn', description='VARIATION SELECTOR-40' }, + [0xE0118] = { unicodeslot=0xE0118, category='mn', description='VARIATION SELECTOR-41' }, + [0xE0119] = { unicodeslot=0xE0119, category='mn', description='VARIATION SELECTOR-42' }, + [0xE011A] = { unicodeslot=0xE011A, category='mn', description='VARIATION SELECTOR-43' }, + [0xE011B] = { unicodeslot=0xE011B, category='mn', description='VARIATION SELECTOR-44' }, + [0xE011C] = { unicodeslot=0xE011C, category='mn', description='VARIATION SELECTOR-45' }, + [0xE011D] = { unicodeslot=0xE011D, category='mn', description='VARIATION SELECTOR-46' }, + [0xE011E] = { unicodeslot=0xE011E, category='mn', description='VARIATION SELECTOR-47' }, + [0xE011F] = { unicodeslot=0xE011F, category='mn', description='VARIATION SELECTOR-48' }, + [0xE0120] = { unicodeslot=0xE0120, category='mn', description='VARIATION SELECTOR-49' }, + [0xE0121] = { unicodeslot=0xE0121, category='mn', description='VARIATION SELECTOR-50' }, + [0xE0122] = { unicodeslot=0xE0122, category='mn', description='VARIATION SELECTOR-51' }, + [0xE0123] = { unicodeslot=0xE0123, category='mn', description='VARIATION SELECTOR-52' }, + [0xE0124] = { unicodeslot=0xE0124, category='mn', description='VARIATION SELECTOR-53' }, + [0xE0125] = { unicodeslot=0xE0125, category='mn', description='VARIATION SELECTOR-54' }, + [0xE0126] = { unicodeslot=0xE0126, category='mn', description='VARIATION SELECTOR-55' }, + [0xE0127] = { unicodeslot=0xE0127, category='mn', description='VARIATION SELECTOR-56' }, + [0xE0128] = { unicodeslot=0xE0128, category='mn', description='VARIATION SELECTOR-57' }, + [0xE0129] = { unicodeslot=0xE0129, category='mn', description='VARIATION SELECTOR-58' }, + [0xE012A] = { unicodeslot=0xE012A, category='mn', description='VARIATION SELECTOR-59' }, + [0xE012B] = { unicodeslot=0xE012B, category='mn', description='VARIATION SELECTOR-60' }, + [0xE012C] = { unicodeslot=0xE012C, category='mn', description='VARIATION SELECTOR-61' }, + [0xE012D] = { unicodeslot=0xE012D, category='mn', description='VARIATION SELECTOR-62' }, + [0xE012E] = { unicodeslot=0xE012E, category='mn', description='VARIATION SELECTOR-63' }, + [0xE012F] = { unicodeslot=0xE012F, category='mn', description='VARIATION SELECTOR-64' }, + [0xE0130] = { unicodeslot=0xE0130, category='mn', description='VARIATION SELECTOR-65' }, + [0xE0131] = { unicodeslot=0xE0131, category='mn', description='VARIATION SELECTOR-66' }, + [0xE0132] = { unicodeslot=0xE0132, category='mn', description='VARIATION SELECTOR-67' }, + [0xE0133] = { unicodeslot=0xE0133, category='mn', description='VARIATION SELECTOR-68' }, + [0xE0134] = { unicodeslot=0xE0134, category='mn', description='VARIATION SELECTOR-69' }, + [0xE0135] = { unicodeslot=0xE0135, category='mn', description='VARIATION SELECTOR-70' }, + [0xE0136] = { unicodeslot=0xE0136, category='mn', description='VARIATION SELECTOR-71' }, + [0xE0137] = { unicodeslot=0xE0137, category='mn', description='VARIATION SELECTOR-72' }, + [0xE0138] = { unicodeslot=0xE0138, category='mn', description='VARIATION SELECTOR-73' }, + [0xE0139] = { unicodeslot=0xE0139, category='mn', description='VARIATION SELECTOR-74' }, + [0xE013A] = { unicodeslot=0xE013A, category='mn', description='VARIATION SELECTOR-75' }, + [0xE013B] = { unicodeslot=0xE013B, category='mn', description='VARIATION SELECTOR-76' }, + [0xE013C] = { unicodeslot=0xE013C, category='mn', description='VARIATION SELECTOR-77' }, + [0xE013D] = { unicodeslot=0xE013D, category='mn', description='VARIATION SELECTOR-78' }, + [0xE013E] = { unicodeslot=0xE013E, category='mn', description='VARIATION SELECTOR-79' }, + [0xE013F] = { unicodeslot=0xE013F, category='mn', description='VARIATION SELECTOR-80' }, + [0xE0140] = { unicodeslot=0xE0140, category='mn', description='VARIATION SELECTOR-81' }, + [0xE0141] = { unicodeslot=0xE0141, category='mn', description='VARIATION SELECTOR-82' }, + [0xE0142] = { unicodeslot=0xE0142, category='mn', description='VARIATION SELECTOR-83' }, + [0xE0143] = { unicodeslot=0xE0143, category='mn', description='VARIATION SELECTOR-84' }, + [0xE0144] = { unicodeslot=0xE0144, category='mn', description='VARIATION SELECTOR-85' }, + [0xE0145] = { unicodeslot=0xE0145, category='mn', description='VARIATION SELECTOR-86' }, + [0xE0146] = { unicodeslot=0xE0146, category='mn', description='VARIATION SELECTOR-87' }, + [0xE0147] = { unicodeslot=0xE0147, category='mn', description='VARIATION SELECTOR-88' }, + [0xE0148] = { unicodeslot=0xE0148, category='mn', description='VARIATION SELECTOR-89' }, + [0xE0149] = { unicodeslot=0xE0149, category='mn', description='VARIATION SELECTOR-90' }, + [0xE014A] = { unicodeslot=0xE014A, category='mn', description='VARIATION SELECTOR-91' }, + [0xE014B] = { unicodeslot=0xE014B, category='mn', description='VARIATION SELECTOR-92' }, + [0xE014C] = { unicodeslot=0xE014C, category='mn', description='VARIATION SELECTOR-93' }, + [0xE014D] = { unicodeslot=0xE014D, category='mn', description='VARIATION SELECTOR-94' }, + [0xE014E] = { unicodeslot=0xE014E, category='mn', description='VARIATION SELECTOR-95' }, + [0xE014F] = { unicodeslot=0xE014F, category='mn', description='VARIATION SELECTOR-96' }, + [0xE0150] = { unicodeslot=0xE0150, category='mn', description='VARIATION SELECTOR-97' }, + [0xE0151] = { unicodeslot=0xE0151, category='mn', description='VARIATION SELECTOR-98' }, + [0xE0152] = { unicodeslot=0xE0152, category='mn', description='VARIATION SELECTOR-99' }, + [0xE0153] = { unicodeslot=0xE0153, category='mn', description='VARIATION SELECTOR-100' }, + [0xE0154] = { unicodeslot=0xE0154, category='mn', description='VARIATION SELECTOR-101' }, + [0xE0155] = { unicodeslot=0xE0155, category='mn', description='VARIATION SELECTOR-102' }, + [0xE0156] = { unicodeslot=0xE0156, category='mn', description='VARIATION SELECTOR-103' }, + [0xE0157] = { unicodeslot=0xE0157, category='mn', description='VARIATION SELECTOR-104' }, + [0xE0158] = { unicodeslot=0xE0158, category='mn', description='VARIATION SELECTOR-105' }, + [0xE0159] = { unicodeslot=0xE0159, category='mn', description='VARIATION SELECTOR-106' }, + [0xE015A] = { unicodeslot=0xE015A, category='mn', description='VARIATION SELECTOR-107' }, + [0xE015B] = { unicodeslot=0xE015B, category='mn', description='VARIATION SELECTOR-108' }, + [0xE015C] = { unicodeslot=0xE015C, category='mn', description='VARIATION SELECTOR-109' }, + [0xE015D] = { unicodeslot=0xE015D, category='mn', description='VARIATION SELECTOR-110' }, + [0xE015E] = { unicodeslot=0xE015E, category='mn', description='VARIATION SELECTOR-111' }, + [0xE015F] = { unicodeslot=0xE015F, category='mn', description='VARIATION SELECTOR-112' }, + [0xE0160] = { unicodeslot=0xE0160, category='mn', description='VARIATION SELECTOR-113' }, + [0xE0161] = { unicodeslot=0xE0161, category='mn', description='VARIATION SELECTOR-114' }, + [0xE0162] = { unicodeslot=0xE0162, category='mn', description='VARIATION SELECTOR-115' }, + [0xE0163] = { unicodeslot=0xE0163, category='mn', description='VARIATION SELECTOR-116' }, + [0xE0164] = { unicodeslot=0xE0164, category='mn', description='VARIATION SELECTOR-117' }, + [0xE0165] = { unicodeslot=0xE0165, category='mn', description='VARIATION SELECTOR-118' }, + [0xE0166] = { unicodeslot=0xE0166, category='mn', description='VARIATION SELECTOR-119' }, + [0xE0167] = { unicodeslot=0xE0167, category='mn', description='VARIATION SELECTOR-120' }, + [0xE0168] = { unicodeslot=0xE0168, category='mn', description='VARIATION SELECTOR-121' }, + [0xE0169] = { unicodeslot=0xE0169, category='mn', description='VARIATION SELECTOR-122' }, + [0xE016A] = { unicodeslot=0xE016A, category='mn', description='VARIATION SELECTOR-123' }, + [0xE016B] = { unicodeslot=0xE016B, category='mn', description='VARIATION SELECTOR-124' }, + [0xE016C] = { unicodeslot=0xE016C, category='mn', description='VARIATION SELECTOR-125' }, + [0xE016D] = { unicodeslot=0xE016D, category='mn', description='VARIATION SELECTOR-126' }, + [0xE016E] = { unicodeslot=0xE016E, category='mn', description='VARIATION SELECTOR-127' }, + [0xE016F] = { unicodeslot=0xE016F, category='mn', description='VARIATION SELECTOR-128' }, + [0xE0170] = { unicodeslot=0xE0170, category='mn', description='VARIATION SELECTOR-129' }, + [0xE0171] = { unicodeslot=0xE0171, category='mn', description='VARIATION SELECTOR-130' }, + [0xE0172] = { unicodeslot=0xE0172, category='mn', description='VARIATION SELECTOR-131' }, + [0xE0173] = { unicodeslot=0xE0173, category='mn', description='VARIATION SELECTOR-132' }, + [0xE0174] = { unicodeslot=0xE0174, category='mn', description='VARIATION SELECTOR-133' }, + [0xE0175] = { unicodeslot=0xE0175, category='mn', description='VARIATION SELECTOR-134' }, + [0xE0176] = { unicodeslot=0xE0176, category='mn', description='VARIATION SELECTOR-135' }, + [0xE0177] = { unicodeslot=0xE0177, category='mn', description='VARIATION SELECTOR-136' }, + [0xE0178] = { unicodeslot=0xE0178, category='mn', description='VARIATION SELECTOR-137' }, + [0xE0179] = { unicodeslot=0xE0179, category='mn', description='VARIATION SELECTOR-138' }, + [0xE017A] = { unicodeslot=0xE017A, category='mn', description='VARIATION SELECTOR-139' }, + [0xE017B] = { unicodeslot=0xE017B, category='mn', description='VARIATION SELECTOR-140' }, + [0xE017C] = { unicodeslot=0xE017C, category='mn', description='VARIATION SELECTOR-141' }, + [0xE017D] = { unicodeslot=0xE017D, category='mn', description='VARIATION SELECTOR-142' }, + [0xE017E] = { unicodeslot=0xE017E, category='mn', description='VARIATION SELECTOR-143' }, + [0xE017F] = { unicodeslot=0xE017F, category='mn', description='VARIATION SELECTOR-144' }, + [0xE0180] = { unicodeslot=0xE0180, category='mn', description='VARIATION SELECTOR-145' }, + [0xE0181] = { unicodeslot=0xE0181, category='mn', description='VARIATION SELECTOR-146' }, + [0xE0182] = { unicodeslot=0xE0182, category='mn', description='VARIATION SELECTOR-147' }, + [0xE0183] = { unicodeslot=0xE0183, category='mn', description='VARIATION SELECTOR-148' }, + [0xE0184] = { unicodeslot=0xE0184, category='mn', description='VARIATION SELECTOR-149' }, + [0xE0185] = { unicodeslot=0xE0185, category='mn', description='VARIATION SELECTOR-150' }, + [0xE0186] = { unicodeslot=0xE0186, category='mn', description='VARIATION SELECTOR-151' }, + [0xE0187] = { unicodeslot=0xE0187, category='mn', description='VARIATION SELECTOR-152' }, + [0xE0188] = { unicodeslot=0xE0188, category='mn', description='VARIATION SELECTOR-153' }, + [0xE0189] = { unicodeslot=0xE0189, category='mn', description='VARIATION SELECTOR-154' }, + [0xE018A] = { unicodeslot=0xE018A, category='mn', description='VARIATION SELECTOR-155' }, + [0xE018B] = { unicodeslot=0xE018B, category='mn', description='VARIATION SELECTOR-156' }, + [0xE018C] = { unicodeslot=0xE018C, category='mn', description='VARIATION SELECTOR-157' }, + [0xE018D] = { unicodeslot=0xE018D, category='mn', description='VARIATION SELECTOR-158' }, + [0xE018E] = { unicodeslot=0xE018E, category='mn', description='VARIATION SELECTOR-159' }, + [0xE018F] = { unicodeslot=0xE018F, category='mn', description='VARIATION SELECTOR-160' }, + [0xE0190] = { unicodeslot=0xE0190, category='mn', description='VARIATION SELECTOR-161' }, + [0xE0191] = { unicodeslot=0xE0191, category='mn', description='VARIATION SELECTOR-162' }, + [0xE0192] = { unicodeslot=0xE0192, category='mn', description='VARIATION SELECTOR-163' }, + [0xE0193] = { unicodeslot=0xE0193, category='mn', description='VARIATION SELECTOR-164' }, + [0xE0194] = { unicodeslot=0xE0194, category='mn', description='VARIATION SELECTOR-165' }, + [0xE0195] = { unicodeslot=0xE0195, category='mn', description='VARIATION SELECTOR-166' }, + [0xE0196] = { unicodeslot=0xE0196, category='mn', description='VARIATION SELECTOR-167' }, + [0xE0197] = { unicodeslot=0xE0197, category='mn', description='VARIATION SELECTOR-168' }, + [0xE0198] = { unicodeslot=0xE0198, category='mn', description='VARIATION SELECTOR-169' }, + [0xE0199] = { unicodeslot=0xE0199, category='mn', description='VARIATION SELECTOR-170' }, + [0xE019A] = { unicodeslot=0xE019A, category='mn', description='VARIATION SELECTOR-171' }, + [0xE019B] = { unicodeslot=0xE019B, category='mn', description='VARIATION SELECTOR-172' }, + [0xE019C] = { unicodeslot=0xE019C, category='mn', description='VARIATION SELECTOR-173' }, + [0xE019D] = { unicodeslot=0xE019D, category='mn', description='VARIATION SELECTOR-174' }, + [0xE019E] = { unicodeslot=0xE019E, category='mn', description='VARIATION SELECTOR-175' }, + [0xE019F] = { unicodeslot=0xE019F, category='mn', description='VARIATION SELECTOR-176' }, + [0xE01A0] = { unicodeslot=0xE01A0, category='mn', description='VARIATION SELECTOR-177' }, + [0xE01A1] = { unicodeslot=0xE01A1, category='mn', description='VARIATION SELECTOR-178' }, + [0xE01A2] = { unicodeslot=0xE01A2, category='mn', description='VARIATION SELECTOR-179' }, + [0xE01A3] = { unicodeslot=0xE01A3, category='mn', description='VARIATION SELECTOR-180' }, + [0xE01A4] = { unicodeslot=0xE01A4, category='mn', description='VARIATION SELECTOR-181' }, + [0xE01A5] = { unicodeslot=0xE01A5, category='mn', description='VARIATION SELECTOR-182' }, + [0xE01A6] = { unicodeslot=0xE01A6, category='mn', description='VARIATION SELECTOR-183' }, + [0xE01A7] = { unicodeslot=0xE01A7, category='mn', description='VARIATION SELECTOR-184' }, + [0xE01A8] = { unicodeslot=0xE01A8, category='mn', description='VARIATION SELECTOR-185' }, + [0xE01A9] = { unicodeslot=0xE01A9, category='mn', description='VARIATION SELECTOR-186' }, + [0xE01AA] = { unicodeslot=0xE01AA, category='mn', description='VARIATION SELECTOR-187' }, + [0xE01AB] = { unicodeslot=0xE01AB, category='mn', description='VARIATION SELECTOR-188' }, + [0xE01AC] = { unicodeslot=0xE01AC, category='mn', description='VARIATION SELECTOR-189' }, + [0xE01AD] = { unicodeslot=0xE01AD, category='mn', description='VARIATION SELECTOR-190' }, + [0xE01AE] = { unicodeslot=0xE01AE, category='mn', description='VARIATION SELECTOR-191' }, + [0xE01AF] = { unicodeslot=0xE01AF, category='mn', description='VARIATION SELECTOR-192' }, + [0xE01B0] = { unicodeslot=0xE01B0, category='mn', description='VARIATION SELECTOR-193' }, + [0xE01B1] = { unicodeslot=0xE01B1, category='mn', description='VARIATION SELECTOR-194' }, + [0xE01B2] = { unicodeslot=0xE01B2, category='mn', description='VARIATION SELECTOR-195' }, + [0xE01B3] = { unicodeslot=0xE01B3, category='mn', description='VARIATION SELECTOR-196' }, + [0xE01B4] = { unicodeslot=0xE01B4, category='mn', description='VARIATION SELECTOR-197' }, + [0xE01B5] = { unicodeslot=0xE01B5, category='mn', description='VARIATION SELECTOR-198' }, + [0xE01B6] = { unicodeslot=0xE01B6, category='mn', description='VARIATION SELECTOR-199' }, + [0xE01B7] = { unicodeslot=0xE01B7, category='mn', description='VARIATION SELECTOR-200' }, + [0xE01B8] = { unicodeslot=0xE01B8, category='mn', description='VARIATION SELECTOR-201' }, + [0xE01B9] = { unicodeslot=0xE01B9, category='mn', description='VARIATION SELECTOR-202' }, + [0xE01BA] = { unicodeslot=0xE01BA, category='mn', description='VARIATION SELECTOR-203' }, + [0xE01BB] = { unicodeslot=0xE01BB, category='mn', description='VARIATION SELECTOR-204' }, + [0xE01BC] = { unicodeslot=0xE01BC, category='mn', description='VARIATION SELECTOR-205' }, + [0xE01BD] = { unicodeslot=0xE01BD, category='mn', description='VARIATION SELECTOR-206' }, + [0xE01BE] = { unicodeslot=0xE01BE, category='mn', description='VARIATION SELECTOR-207' }, + [0xE01BF] = { unicodeslot=0xE01BF, category='mn', description='VARIATION SELECTOR-208' }, + [0xE01C0] = { unicodeslot=0xE01C0, category='mn', description='VARIATION SELECTOR-209' }, + [0xE01C1] = { unicodeslot=0xE01C1, category='mn', description='VARIATION SELECTOR-210' }, + [0xE01C2] = { unicodeslot=0xE01C2, category='mn', description='VARIATION SELECTOR-211' }, + [0xE01C3] = { unicodeslot=0xE01C3, category='mn', description='VARIATION SELECTOR-212' }, + [0xE01C4] = { unicodeslot=0xE01C4, category='mn', description='VARIATION SELECTOR-213' }, + [0xE01C5] = { unicodeslot=0xE01C5, category='mn', description='VARIATION SELECTOR-214' }, + [0xE01C6] = { unicodeslot=0xE01C6, category='mn', description='VARIATION SELECTOR-215' }, + [0xE01C7] = { unicodeslot=0xE01C7, category='mn', description='VARIATION SELECTOR-216' }, + [0xE01C8] = { unicodeslot=0xE01C8, category='mn', description='VARIATION SELECTOR-217' }, + [0xE01C9] = { unicodeslot=0xE01C9, category='mn', description='VARIATION SELECTOR-218' }, + [0xE01CA] = { unicodeslot=0xE01CA, category='mn', description='VARIATION SELECTOR-219' }, + [0xE01CB] = { unicodeslot=0xE01CB, category='mn', description='VARIATION SELECTOR-220' }, + [0xE01CC] = { unicodeslot=0xE01CC, category='mn', description='VARIATION SELECTOR-221' }, + [0xE01CD] = { unicodeslot=0xE01CD, category='mn', description='VARIATION SELECTOR-222' }, + [0xE01CE] = { unicodeslot=0xE01CE, category='mn', description='VARIATION SELECTOR-223' }, + [0xE01CF] = { unicodeslot=0xE01CF, category='mn', description='VARIATION SELECTOR-224' }, + [0xE01D0] = { unicodeslot=0xE01D0, category='mn', description='VARIATION SELECTOR-225' }, + [0xE01D1] = { unicodeslot=0xE01D1, category='mn', description='VARIATION SELECTOR-226' }, + [0xE01D2] = { unicodeslot=0xE01D2, category='mn', description='VARIATION SELECTOR-227' }, + [0xE01D3] = { unicodeslot=0xE01D3, category='mn', description='VARIATION SELECTOR-228' }, + [0xE01D4] = { unicodeslot=0xE01D4, category='mn', description='VARIATION SELECTOR-229' }, + [0xE01D5] = { unicodeslot=0xE01D5, category='mn', description='VARIATION SELECTOR-230' }, + [0xE01D6] = { unicodeslot=0xE01D6, category='mn', description='VARIATION SELECTOR-231' }, + [0xE01D7] = { unicodeslot=0xE01D7, category='mn', description='VARIATION SELECTOR-232' }, + [0xE01D8] = { unicodeslot=0xE01D8, category='mn', description='VARIATION SELECTOR-233' }, + [0xE01D9] = { unicodeslot=0xE01D9, category='mn', description='VARIATION SELECTOR-234' }, + [0xE01DA] = { unicodeslot=0xE01DA, category='mn', description='VARIATION SELECTOR-235' }, + [0xE01DB] = { unicodeslot=0xE01DB, category='mn', description='VARIATION SELECTOR-236' }, + [0xE01DC] = { unicodeslot=0xE01DC, category='mn', description='VARIATION SELECTOR-237' }, + [0xE01DD] = { unicodeslot=0xE01DD, category='mn', description='VARIATION SELECTOR-238' }, + [0xE01DE] = { unicodeslot=0xE01DE, category='mn', description='VARIATION SELECTOR-239' }, + [0xE01DF] = { unicodeslot=0xE01DF, category='mn', description='VARIATION SELECTOR-240' }, + [0xE01E0] = { unicodeslot=0xE01E0, category='mn', description='VARIATION SELECTOR-241' }, + [0xE01E1] = { unicodeslot=0xE01E1, category='mn', description='VARIATION SELECTOR-242' }, + [0xE01E2] = { unicodeslot=0xE01E2, category='mn', description='VARIATION SELECTOR-243' }, + [0xE01E3] = { unicodeslot=0xE01E3, category='mn', description='VARIATION SELECTOR-244' }, + [0xE01E4] = { unicodeslot=0xE01E4, category='mn', description='VARIATION SELECTOR-245' }, + [0xE01E5] = { unicodeslot=0xE01E5, category='mn', description='VARIATION SELECTOR-246' }, + [0xE01E6] = { unicodeslot=0xE01E6, category='mn', description='VARIATION SELECTOR-247' }, + [0xE01E7] = { unicodeslot=0xE01E7, category='mn', description='VARIATION SELECTOR-248' }, + [0xE01E8] = { unicodeslot=0xE01E8, category='mn', description='VARIATION SELECTOR-249' }, + [0xE01E9] = { unicodeslot=0xE01E9, category='mn', description='VARIATION SELECTOR-250' }, + [0xE01EA] = { unicodeslot=0xE01EA, category='mn', description='VARIATION SELECTOR-251' }, + [0xE01EB] = { unicodeslot=0xE01EB, category='mn', description='VARIATION SELECTOR-252' }, + [0xE01EC] = { unicodeslot=0xE01EC, category='mn', description='VARIATION SELECTOR-253' }, + [0xE01ED] = { unicodeslot=0xE01ED, category='mn', description='VARIATION SELECTOR-254' }, + [0xE01EE] = { unicodeslot=0xE01EE, category='mn', description='VARIATION SELECTOR-255' }, + [0xE01EF] = { unicodeslot=0xE01EF, category='mn', description='VARIATION SELECTOR-256' }, + [0xF0000] = { unicodeslot=0xF0000, category='co', description='' }, + [0xFFFFD] = { unicodeslot=0xFFFFD, category='co', description='' }, + [0x100000] = { unicodeslot=0x100000, category='co', description='' }, + [0x10FFFD] = { unicodeslot=0x10FFFD, category='co', description='' }, +} diff --git a/tex/context/base/char-def.tex b/tex/context/base/char-def.tex new file mode 100644 index 000000000..9e722ba13 --- /dev/null +++ b/tex/context/base/char-def.tex @@ -0,0 +1,47 @@ +%D \module +%D [ file=char-def, +%D version=2005.04.25, +%D title=\CONTEXT\ Lua Macros, +%D subtitle=Unicode Support, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Unicode Support (tables)} + +\unprotect + +%D An auxiliary macro: + +\def\setcclcuc #1 #2 #3 % + {\global\catcode#1=11 % + \global\lccode #1=#2 % + \global\uccode #1=#3 } + +\registerctxluafile{char-def}{1.001} + +%D The codes are stored in the format, so we don't need to reinitialize +%D them (unless of course we have adapted the table). + +% \startruntimeluacode + \ctxlua{characters.setcodes()} +% \ctxlua{characters.setpdfunicodes()}% pdftounicode mappings can only be done runtime +% \stopruntimeluacode + +%D This is needed for Turkish: + +\setcclcuc "201C "201C "201C +\setcclcuc "201D "201D "201D + +\protect \endinput + +% \ctxlua{characters.context.show(123)} +% \ctxlua{characters.context.show(0x7B)} +% \ctxlua{characters.context.show("7B")} + +% \dostepwiserecurse{`A}{`Z}{1} +% {\ctxlua{characters.context.show(\recurselevel)}} diff --git a/tex/context/base/char-ini.lua b/tex/context/base/char-ini.lua new file mode 100644 index 000000000..0daa91c0d --- /dev/null +++ b/tex/context/base/char-ini.lua @@ -0,0 +1,280 @@ +if not modules then modules = { } end modules ['char-ini'] = { + version = 1.001, + comment = "companion to char-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +utf = utf or unicode.utf +tex = tex or { } + +function tex.ctxprint(...) + tex.sprint(tex.ctxcatcodes,...) +end + +--[[ldx-- +

This module implements some methods and creates additional datastructured +from the big character table that we use for all kind of purposes: +char-def.lua.

+--ldx]]-- + +characters = characters or { } +characters.data = characters.data or { } +characters.context = characters.context or { } + +_empty_table_ = { } +_empty_table_.__index = function(t,k) return "" end + +setmetatable(characters.data,_empty_table_) + +--[[ldx-- +

At this point we assume that the big data table is loaded. From this +table we derive a few more.

+--ldx]]-- + +characters.context.unicodes = characters.context.unicodes or { } +characters.context.utfcodes = characters.context.utfcodes or { } +characters.context.enccodes = characters.context.enccodes or { } + +function characters.context.rehash() + local unicodes, utfcodes, enccodes = characters.context.unicodes, characters.context.utfcodes, characters.context.enccodes + for k,v in pairs(characters.data) do + local contextname, adobename = v.contextname, v.adobename + if contextname then + unicodes[contextname] = v.unicodeslot + utfcodes[contextname] = utf.char(v.unicodeslot) + end + local encname = adobename or contextname + if encname then + enccodes[encname] = k + end + end +end + +--[[ldx-- +

The context namespace is used to store methods and data +which is rather specific to .

+--ldx]]-- + +function characters.context.show(n) + local n = characters.number(n) + local d = characters.data[n] + if d then + local function entry(label,name) + tex.ctxprint(string.format("\\NC %s\\NC %s\\NC\\NR",label,characters.valid(d[name]))) + end + tex.ctxprint("\\starttabulate[|Tl|Tl|]") + entry("unicode index" , "unicodeslot") + entry("context name" , "contextname") + entry("adobe name" , "adobename") + entry("category" , "category") + entry("description" , "description") + entry("uppercase code", "uccode") + entry("lowercase code", "lccode") + entry("specials" , "specials") + tex.ctxprint("\\stoptabulate ") + end +end + +--[[ldx-- +

Instead of using a file to define the named glyphs, we +use the table. After all, we have this information available anyway.

+--ldx]]-- + +function characters.context.define() + local unicodes, utfcodes = characters.context.unicodes, characters.context.utfcodes + local flush, tc = tex.sprint, tex.ctxcatcodes + for _, chr in pairs(characters.data) do + local contextname = chr.contextname + if contextname then + -- by this time, we're still in normal catcode mode + if chr.unicodeslot < 128 then + flush(tc, "\\chardef\\" .. contextname .. "=" .. unicodes[contextname]) + else + flush(tc, "\\let\\" .. contextname .. "=" .. utfcodes[contextname]) + end + end + end +end + +--[[ldx-- +

Setting the lccodes is also done in a loop over the data table.

+--ldx]]-- + + +function characters.setcodes() + local flush, tc = tex.sprint, tex.ctxcatcodes + for code, chr in pairs(characters.data) do + local cc = chr.category + if cc == 'll' or cc == 'lu' or cc == 'lt' then + if not chr.lccode then chr.lccode = code end + if not chr.uccode then chr.uccode = code end + flush(tc, '\\setcclcuc '.. code .. ' ' .. chr.lccode .. ' ' .. chr.uccode .. ' ') + end + end +end + +--[[ldx-- +

Next comes a whole series of helper methods. These are (will be) part +of the official .

+--ldx]]-- + +--[[ldx-- +

This converts a string (if given) into a number.

+--ldx]]-- + +function characters.number(n) + if type(n) == "string" then return tonumber(n,16) else return n end +end + +--[[ldx-- +

Checking for valid characters.

+--ldx]]-- + +function characters.is_valid(s) + return s or "" +end + +function characters.checked(s, default) + return s or default +end + +characters.valid = characters.is_valid + +--[[ldx-- +

The next method is used when constructing the main table, although nowadays +we do this in one step. The index can be a string or a number.

+--ldx]]-- + +function characters.define(c) + characters.data[characters.number(c.unicodeslot)] = c +end + +--[[ldx-- +

+--ldx]]-- +-- set a table entry; index is number (can be different from unicodeslot) + +function characters.set(n, c) + characters.data[characters.number(n)] = c +end + +--[[ldx-- +

Get a table entry happens by number. Keep in mind that the unicodeslot +can be different (not likely).

+--ldx]]-- + +function characters.get(n) + return characters.data[characters.number(n)] +end + +--[[ldx-- +

A couple of convenience methods. Beware, these are not that fast due +to the checking.

+--ldx]]-- + +function characters.hexindex(n) + return string.format("%04X", characters.valid(characters.data[characters.number(n)].unicodeslot)) +end + +function characters.contextname(n) + return characters.valid(characters.data[characters.number(n)].contextname) +end + +function characters.adobename(n) + return characters.valid(characters.data[characters.number(n)].adobename) +end + +function characters.description(n) + return characters.valid(characters.data[characters.number(n)].description) +end + +function characters.category(n) + return characters.valid(characters.data[characters.number(n)].category) +end + +--[[ldx-- +

Requesting lower and uppercase codes:

+--ldx]]-- + +function characters.uccode(n) return characters.data[n].uccode or n end +function characters.lccode(n) return characters.data[n].lccode or n end + +function characters.flush(n) + if characters.data[n].contextname then + tex.sprint(tex.texcatcodes, "\\"..characters.data[n].contextname) + else + tex.sprint(unicode.utf8.char(n)) + end +end + +function characters.shape(n) + return characters.data[n].shcode or n +end + +--[[ldx-- +

Categories play an important role, so here are some checkers.

+--ldx]]-- + +function characters.is_of_category(token,category) + if type(token) == "string" then + return characters.data[utf.byte(token)].category == category + else + return characters.data[token].category == category + end +end + +function characters.i_is_of_category(i,category) -- by index (number) + local cd = characters.data[i] + return cd and cd.category == category +end + +function characters.n_is_of_category(n,category) -- by name (string) + local cd = characters.data[utf.byte(n)] + return cd and cd.category == category +end + +--[[ldx-- +

The following code is kind of messy. It is used to generate the right +unicode reference tables.

+--ldx]]-- + +function characters.setpdfunicodes() + local flush, tc, sf = tex.sprint, tex.ctxcatcodes, string.format + for _,v in pairs(characters.data) do + if v.adobename then + flush(tc,sf("\\pdfglyphtounicode{%s}{%04X}", v.adobename, v.unicodeslot)) + end + end +end + +--[[ldx-- +

The next method generates a table for good old .

+ + +characters.pdftex.make_pdf_to_unicodetable("pdfr-def.tex") + +--ldx]]-- + +characters.pdftex = characters.pdftex or { } + +function characters.pdftex.make_pdf_to_unicodetable(filename) + local sf = string.format + f = io.open(filename,'w') + if f then + f:write("% This file is generated with Luatex using the\n") + f:write("% character tables that come with ConTeXt MkIV.\n") + f:write("%\n") + f:write("\\ifx\\pdfglyphtounicode\\undefined\\endinput\\fi\n") -- just to be sure + for _, v in pairs(characters.data) do + if v.adobename then + f:write(sf("\\pdfglyphtounicode{%s}{%04X}", v.adobename, v.unicodeslot)) + end + end + f:write("%\n") + f:write("%\n") + f:write("\\endinput") + f:close() + end +end diff --git a/tex/context/base/char-ini.tex b/tex/context/base/char-ini.tex new file mode 100644 index 000000000..4b4c55ef1 --- /dev/null +++ b/tex/context/base/char-ini.tex @@ -0,0 +1,20 @@ +%D \module +%D [ file=char-ini, +%D version=2006.08.20, +%D title=\CONTEXT\ Character Macros, +%D subtitle=Character Support (Initialization), +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Character Support (initialization)} + +\registerctxluafile{char-ini}{1.001} +\registerctxluafile{char-cmp}{1.001} % maybe we will load this someplace else +\registerctxluafile{char-tok}{1.001} % maybe we will load this someplace else + +\endinput diff --git a/tex/context/base/char-utf.lua b/tex/context/base/char-utf.lua new file mode 100644 index 000000000..c30a160bc --- /dev/null +++ b/tex/context/base/char-utf.lua @@ -0,0 +1,298 @@ +if not modules then modules = { } end modules ['char-utf'] = { + version = 1.001, + comment = "companion to char-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

When a sequence of characters enters the application, it may +be neccessary to collapse subsequences into their composed variant.

+ +

This module implements methods for collapsing and expanding +sequences. We also provide means to deal with characters that are +special to as well as 8-bit characters that need to end up +in special kinds of output (for instance ).

+ +

We implement these manipulations as filters. One can run multiple filters +over a string.

+--ldx]]-- + +utf = utf or unicode.utf8 + +characters = characters or { } +characters.graphemes = characters.graphemes or { } +characters.filters = characters.filters or { } +characters.filters.utf = characters.filters.utf or { } + +characters.filters.utf.initialized = false +characters.filters.utf.collapsing = true +characters.filters.utf.expanding = true + +--[[ldx-- +

It only makes sense to collapse at runtime, since we don't expect +source code to depend on collapsing:

+ + +characters.filters.utf.collapsing = true +input.filters.utf_translator = characters.filters.utf.collapse + +--ldx]]-- + +function characters.filters.utf.initialize() + if characters.filters.utf.collapsing and not characters.filters.utf.initialized then + characters.graphemes = { } + local cg = characters.graphemes + local uc = utf.char + for k,v in pairs(characters.data) do + -- using vs and first testing for length is faster (.02->.01 s) + local vs = v.specials + if vs and #vs == 3 and vs[1] == 'char' then + local first, second = uc(vs[2]), uc(vs[3]) + if not cg[first] then + cg[first] = { } + end + cg[first][second] = uc(k) + end + end + characters.filters.utf.initialized = true + end +end + +function characters.filters.utf.collapse(str) + if characters.filters.utf.collapsing and str and #str > 1 then + characters.filters.utf.initialize() + local tokens, first, done = { }, false, false + local cg = characters.graphemes + for second in string.utfcharacters(str) do + local cgf = cg[first] + if cgf and cgf[second] then + first, done = cgf[second], true + elseif first then + tokens[#tokens+1] = first + first = second + else + first = second + end + end + if done then + tokens[#tokens+1] = first + return table.concat(tokens,"") + end + end + return str +end + +--[[ldx-- +

In order to deal with 8-bit output, we need to find a way to +go from to 8-bit. This is handled in the + engine itself.

+ +

This leaves us problems with characters that are specific to + like {}, $ and alike.

+ +

We can remap some chars that tex input files are sensitive for to +a private area (while writing to a utility file) and revert then +to their original slot when we read in such a file. Instead of +reverting, we can (when we resolve characters to glyphs) map them +to their right glyph there.

+ +

For this purpose we can use the private planes 0x0F0000 and +0x100000.

+--ldx]]-- + +characters.filters.utf.private = { } +characters.filters.utf.private.high = { } +characters.filters.utf.private.low = { } + +do + + local ub, uc, ug = utf.byte, utf.char, utf.gsub + local cfup = characters.filters.utf.private + + function characters.filters.utf.private.set(ch) + local cb = ub(ch) + if cb < 256 then + cfup.low[ch] = uc(0x0F0000 + cb) + cfup.high[uc(0x0F0000 + cb)] = ch + end + end + + function characters.filters.utf.private.replace(str) + ug("(.)", cfup.low) + end + + function characters.filters.utf.private.revert(str) + ug("(.)", cfup.high) + end + + for _, ch in pairs({ '~', '#', '$', '%', '^', '&', '_', '{', '}' }) do + cfup.set(ch) + end + +end + +--[[ldx-- +

We get a more efficient variant of this when we integrate +replacements in collapser. This more or less renders the previous +private code redundant. The following code is equivalent but the +first snippet uses the relocated dollars.

+ + +[󰀤x󰀤] [$x$] + +--ldx]]-- + +do + + local cg = characters.graphemes + local cr = characters.filters.utf.private.high + + function characters.filters.utf.collapse(str) + if characters.filters.utf.collapsing and str then + if #str > 1 then + characters.filters.utf.initialize() + local tokens, first, done = { }, false, false + for second in string.utfcharacters(str) do + if cr[second] then + if first then + tokens[#tokens+1] = first + end + first, done = cr[second], true + else + local cgf = cg[first] + if cgf and cgf[second] then + first, done = cgf[second], true + elseif first then + tokens[#tokens+1] = first + first = second + else + first = second + end + end + end + if done then + tokens[#tokens+1] = first + return table.concat(tokens,"") + end + elseif #str > 0 then + return cr[str] or str + end + end + return str + end + +end + +--[[ldx-- +

In the beginning of we experimented with a sequence +of filters so that we could manipulate the input stream. However, since +this is a partial solution (not taking macro expansion into account) +and since it may interfere with non-text, we will not use this feature +by default.

+ + +characters.filters.utf.collapsing = true +characters.filters.append(characters.filters.utf.collapse) +characters.filters.activated = true +callback.register('process_input_buffer', characters.filters.process) + + +

The following helper functions may disappear (or become optional) +in the future.

+--ldx]]-- + +characters.filters.sequences = { } +characters.filters.activated = false + +function characters.filters.append(name) + table.insert(characters.filters.sequences,name) +end + +function characters.filters.prepend(name) + table.insert(characters.filters.sequences,1,name) +end + +function characters.filters.remove(name) + for k,v in pairs(characters.filters.sequences) do + if v == name then + table.remove(characters.filters.sequences,k) + end + end +end + +function characters.filters.replace(name_1,name_2) + for k,v in pairs(characters.filters.sequences) do + if v == name then + characters.filters.sequences[k] = name_2 + end + end +end + +function characters.filters.insert_before(name_1,name_2) + for k,v in pairs(characters.filters.sequences) do + if v == name_1 then + table.insert(characters.filters.sequences,k,name_2) + end + end +end + +function characters.filters.insert_after(name_1,name_2) + for k,v in pairs(characters.filters.sequences) do + if v == name_1 then + table.insert(characters.filters.sequences,k+1,name_2) + end + end +end + +function characters.filters.list(separator) + table.concat(characters.filters.sequences,seperator or ' ') +end + +function characters.filters.process(str) + if characters.filters.activated then + for _,v in pairs(characters.filters.sequences) do + str = v(str) + end + return str + else + return nil -- luatex callback optimalisation + end +end + +--[[ldx-- +

The following code is no longer needed and replaced by token +collectors somehwere else.

+--ldx]]-- + +--[[obsolete-- + +characters.filters.collector = { } +characters.filters.collector.data = { } +characters.filters.collector.collecting = false + +function characters.filters.collector.reset() + characters.filters.collector.data = { } +end + +function characters.filters.collector.flush(separator) + tex.sprint(table.concat(characters.filters.collector.data,separator)) +end + +function characters.filters.collector.prune(n) + for i=1,n do + table.remove(characters.filters.collector.data,-1) + end +end + +function characters.filters.collector.numerate(str) + if characters.filters.collector.collecting then + table.insert(characters.filters.collector.data,(unicode.utf8.gsub(str,"(.)", function(c) + return string.format("0x%04X ",unicode.utf8.byte(c)) + end))) + end + return str +end + +--obsolete]]-- diff --git a/tex/context/base/char-utf.tex b/tex/context/base/char-utf.tex new file mode 100644 index 000000000..cb6eceea1 --- /dev/null +++ b/tex/context/base/char-utf.tex @@ -0,0 +1,54 @@ +%D \module +%D [ file=char-utf, +%D version=2006.12.05, +%D title=\CONTEXT\ Lua Macros, +%D subtitle=Unicode Support (UTF), +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Unicode Support (utf)} + +%D After a bit of experimenting we reached a clean state where \UTF\ +%D 8, 16 and 32 were supported as well as collapsing (combining +%D sequences). Writing the code was a relaxed experience, not in the +%D last place because it was accompanied by listening to those nice +%D Vienna Teng cd's (who decided that making music was more fun than +%D programming, but then, she may not know \TEX\ and \LUA). + +\unprotect + +\registerctxluafile{char-utf}{1.001} + +%D We enable collapsing (combining characters) by default, but +%D since the source files are rather simple, we postpone the +%D initialization till runtime. + +\appendtoks + \ctxlua { + characters.filters.utf.collapsing = true + input.filters.utf_translator = characters.filters.utf.collapse + }% +\to \everyjob + +%D This is a hack, and only meant for special situations. We don't +%D support this in for instance verbatim. The active characters map +%D onto the \CONTEXT\ names and font handling etc. is up to the user. + +\registerctxluafile{char-act}{1.001} + +\def\enableactiveutf {\ctxlua{characters.active.enable()}} +\def\disableactiveutf{\ctxlua{characters.active.disable()}} +\def\testactiveutf #1{\ctxlua{characters.active.test("#1")}} + +%D Usage: +%D +%D \starttyping +%D \enableactiveutf \testactiveutf{eacute} +%D \stoptyping + +\protect diff --git a/tex/context/base/colo-ini.tex b/tex/context/base/colo-ini.tex index 81e7d1cf7..687d41da3 100644 --- a/tex/context/base/colo-ini.tex +++ b/tex/context/base/colo-ini.tex @@ -359,8 +359,7 @@ {% this way we can freeze \definecolor[somecolor][somecolor] % and still prevent cyclic definitions \iffreezecolors#3{\??cr#5}{\csname\??cr#6\endcsname}\fi} - {\iffreezecolors\@EA#3\else\@EA#2\fi - {\??cr#5}{\csname\??cr#6\endcsname}}} + {\iffreezecolors\@EA#3\else\@EA#2\fi{\??cr#5}{\csname\??cr#6\endcsname}}} {\showmessage\m!colors3{#5 (def)}}% \fi}% \ifcase#4\or @@ -527,6 +526,8 @@ %D We now redefine the color definition macro so that you %D can define both normal and spotcolors. +%D This messy method will become obsolete in mkiv. + \def\definecolor {\dotripleempty\dodefinewhatevercolor} @@ -1101,14 +1102,14 @@ \def\predefinecolor[#1]% {\bgroup - \flushatshipout{\hbox{\localcolortrue\color[#1]}}% real ones + \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% real ones \egroup} \def\predefineindexcolor[#1]% {\bgroup - \flushatshipout{\hbox{\localcolortrue\color[#1]}}% real ones + \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% real ones \let\doexeccolorP\doexeccolorPindex - \flushatshipout{\hbox{\localcolortrue\color[#1]}}% index one + \flushatshipout{\hbox{\localcolortrue\color[#1]{}}}% index one \egroup} % \def\checkpredefinedcolor[#1]% @@ -1151,15 +1152,6 @@ \expandafter\noexectransparency \fi} -%\def\doexectransparency#1:#2\od -% {\global\@EA\chardef\csname\@@currenttransparent\endcsname % nasty -% \ifcase#1\space -% \zerocount -% \else -% \plusone -% \dostarttransparency{#1}{#2}% -% \fi} - \def\doexectransparency#1:#2\od {\ifcase#1\space \global\intransparentfalse diff --git a/tex/context/base/colo-run.tex b/tex/context/base/colo-run.tex index 8d21430e1..0b44f2ee5 100644 --- a/tex/context/base/colo-run.tex +++ b/tex/context/base/colo-run.tex @@ -239,24 +239,29 @@ % \def\execcolorRCSP#1:{\csname execcolor#1\endcsname} -> \execcolorR \gdef\dogetcolorcomponents#1% - {\startnointerference - \localcolortrue - \def\doexeccolorR ##1:##2:##3:##4:##5\od{\global\globalscratchtoks{\NC\Od#1 \NC#1\NC a=\Do##4 \enspace t=\Do##5 \NC r=\Do##1 \enspace g=\Do##2 \enspace b=\Do##3 \NC\NR}}% - \def\doexeccolorC##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC#1\NC a=\Do##5 \enspace t=\Do##6 \NC c=\Do##1 \enspace m=\Do##2 \enspace y=\Do##3 \enspace k=\Do##4 \NC\NR}}% - \def\doexeccolorS ##1:##2:##3\od{\global\globalscratchtoks{\NC\Od#1 \NC#1\NC a=\Do##2 \enspace t=\Do##3 \NC s=\Do##1 \NC\NR}}% - %\def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC#1\NC a=\Do##5 \enspace t=\Do##6 \NC p=\Do##4 \enspace f=\Do##2 \enspace d=\Do##3 \enspace n=##1 \NC\NR}}% - \def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC#1\NC a=\Do##5 \enspace t=\Do##6 \NC p=\Do##4 \enspace n=##1 \NC\NR}}% - \let\doexeccolorPindex\doexeccolorP - \backgroundline[#1]{}% - \stopnointerference + {\doifelsenothing{#1} + {\global\globalscratchtoks{\TB}} + {\startnointerference + \localcolortrue + \def\doexeccolorR ##1:##2:##3:##4:##5\od{\global\globalscratchtoks{\NC\Od#1 \NC\Nm #1 \NC a=\Do##4 \enspace t=\Do##5 \NC r=\Do##1 \enspace g=\Do##2 \enspace b=\Do##3 \NC\NR}}% + \def\doexeccolorC##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC\Nm #1 \NC a=\Do##5 \enspace t=\Do##6 \NC c=\Do##1 \enspace m=\Do##2 \enspace y=\Do##3 \enspace k=\Do##4 \NC\NR}}% + \def\doexeccolorS ##1:##2:##3\od{\global\globalscratchtoks{\NC\Od#1 \NC\Nm #1 \NC a=\Do##2 \enspace t=\Do##3 \NC s=\Do##1 \NC\NR}}% + %\def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC\Nm #1 \NC a=\Do##5 \enspace t=\Do##6 \NC p=\Do##4 \enspace f=\Do##2 \enspace d=\Do##3 \enspace n=##1 \NC\NR}}% + \def\doexeccolorP##1:##2:##3:##4:##5:##6\od{\global\globalscratchtoks{\NC\Od#1 \NC\Nm #1 \NC a=\Do##5 \enspace t=\Do##6 \NC p=\Do##4 \enspace n=##1 \NC\NR}}% + \let\doexeccolorPindex\doexeccolorP + \backgroundline[#1]{}% + \stopnointerference}% \appendetoks\the\globalscratchtoks\to\scratchtoks} +\newdimen\colorcomponentwidth % for my eyes only + \gdef\showcolorcomponents[#1]% {\bgroup - \def\Od##1 {\backgroundline[##1]{\strut\quad \color[white]{white}\quad\color[black]{black}\quad\quad}}% + \def\Od##1 {\backgroundline[##1]{\strut\enspace\color[white]{white}\enspace\color[black]{black}\enspace}}% \def\Do##1 {\twodigitrounding{##1}}% + \def\Nm##1 {\ifdim\colorcomponentwidth>\zeropoint\hbox to \colorcomponentwidth\fi{##1}}% \scratchtoks\emptytoks - \appendtoks\starttabulate[|l|l|l|l|]\to\scratchtoks + \appendtoks\starttabulate[|l|l|l|p|]\to\scratchtoks \appendtoks\NC color \NC name \NC transparency \NC specification \NC\NR\TB\to\scratchtoks \processcommacommand[#1]\dogetcolorcomponents \appendtoks\stoptabulate\to\scratchtoks diff --git a/tex/context/base/cont-mtx.tex b/tex/context/base/cont-mtx.tex new file mode 100644 index 000000000..833785a7f --- /dev/null +++ b/tex/context/base/cont-mtx.tex @@ -0,0 +1,25 @@ +%D \module +%D [ file=cont-mtx, +%D version=2006.01.01, % no date -) +%D title=\CONTEXT\ Miscellaneous Macros, +%D subtitle=Experimental MetaTeX Macros, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% format generation : texexec --make --all --luatex +% +% pdftex compatible run : texexec --luatex filename +% aleph compatible run : texexec --luatex --output=dvipdfmx filename +% +% or, at top of tex file : % engine=luatex + +% \loadcorefile{meta-xxx.tex} + +%D Here we load files that are not yet part of the core. + +\endinput diff --git a/tex/context/base/cont-new.mkiv b/tex/context/base/cont-new.mkiv new file mode 100644 index 000000000..b7b069b45 --- /dev/null +++ b/tex/context/base/cont-new.mkiv @@ -0,0 +1,93 @@ +%D \module +%D [ file=cont-new, +%D version=2006.10.04, +%D title=\CONTEXT\ Miscellaneous Macros, +%D subtitle=New Macros, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\ctxlua { fonts.define.method = 2 } + +\unprotect + +\appendtoks + \ctxlua{garbagecollector.update()}% +\to \everyshipout + +% texmf.instance will become just texmf + +\appendtoks + \writestatus\m!lua{input load time - \ctxlua{input.loadtime(texmf.instance)} seconds}% + \writestatus\m!lua{fonts load time - \ctxlua{input.loadtime(fonts)} seconds}% + \writestatus\m!lua{mps conversion time - \ctxlua{input.loadtime(mptopdf)} seconds}% + \writestatus\m!lua{node processing time - \ctxlua{input.loadtime(nodes)} second}% + \writestatus\m!lua{used config path - \ctxlua{tex.print(cache.configpath(texmf.instance))}}% + \writestatus\m!lua{used cache path - \ctxlua{tex.print(cache.path)}}% + \writestatus\m!lua{modules/dumps/instances - \ctxlua{tex.print((status.luabytecodes-500).."/"..input.storage.done.."/"..status.luastates)}}% + \writestatus\m!lua{current memory usage - \ctxlua{tex.print(status.luastate_bytes)} bytes}% + \writestatus\m!lua{loaded fonts - \ctxlua{tex.print(fonts.logger.report())}}% +\to \everystoptext + +\def\resettimer {\ctxlua{environment.starttime = os.clock()}} +\def\elapsedtime {\ctxlua{tex.sprint(os.clock()-environment.starttime)}} +\let\elapsedseconds \elapsedtime + +%D Fonts (experimental AFM loading} + +% \ctxlua { +% remapper.define('encoding','^lm' ,'^(.*)$','lm-\letterpercent1') +% remapper.define('encoding','^qbk','^(.*)$','q-\letterpercent1') +% remapper.define('encoding','^qcs','^(.*)$','q-\letterpercent1') +% remapper.define('encoding','^qpl','^(.*)$','q-\letterpercent1') +% remapper.define('encoding','^qtm','^(.*)$','q-\letterpercent1') +% } + +\appendtoksonce \loadallXfontmapfiles \to \everyPDFxform +\appendtoksonce \loadallXfontmapfiles \to \everyPDFximage +\appendtoksonce \loadallXfontmapfiles \to \everystarttext +\appendtoksonce \loadallXfontmapfiles \to \everybeforepagebody + +\def\loadallXfontmapfiles{\ctxlua { + local s = fonts.map.flushlines("pdftex","") + tex.sprint(tex.ctxcatcodes,s) +}} + +% \ctxlua{ +% do +% local pth = "." .. io.fileseparator .. "tmp" .. io.fileseparator .. "\jobname" +% texio.write_nl("CREATING "..pth) +% os.execute("mkdir " .. pth) +% end +% input.output_files = { } +% callback.register('find_write_file', function(id,name) +% input.output_files[name] = file.join(".","tmp","\jobname",name) +% texio.write_nl("REDIRECTING OUTPUT "..name.. " TO " .. input.output_files[name]) +% return input.output_files[name] +% end) +% callback.register('find_read_file', function(id,name) +% local sname = string.gsub(name,"^\letterpercent./","") +% if input.output_files[sname] then +% return input.output_files[name] +% elseif string.find(sname,"^\jobname[\letterpercent.\letterpercent-]") then +% local n = file.join(".","tmp","\jobname",sname) +% local f = io.open(n) +% if f then +% input.output_files[name] = n +% texio.write_nl("REDIRECTING INPUT "..sname.. " TO " .. n) +% f:close() +% return n +% else +% return input.findtexfile(texmf.instance,name) +% end +% else +% return input.findtexfile(texmf.instance,name) +% end +% end) +% } + +\protect \endinput diff --git a/tex/context/base/context-debug.lmx b/tex/context/base/context-debug.lmx new file mode 100644 index 000000000..88ca0b450 --- /dev/null +++ b/tex/context/base/context-debug.lmx @@ -0,0 +1,108 @@ + + + + <?lua pv('title') ?> + + + + +
+ +
+
+ +
+ + +
+ +

Scratch Variables

+ + + + + + + + + + + + + + + +
index   dimen   count   toks
         
+
+ + + +
type
+
variable
+
value
+ + + + +
+
+
+ + + +

Internal Variables

+ + + + + +
+
+ + +

ConTeXt Variables

+ + + + + +
+
+ +
+
+ Job Name:     + ConTeXt Version:     + Real Page:     + Page:     +
+ + diff --git a/tex/context/base/context-error.lmx b/tex/context/base/context-error.lmx new file mode 100644 index 000000000..075c43073 --- /dev/null +++ b/tex/context/base/context-error.lmx @@ -0,0 +1,55 @@ + + + + <?lua pv('title')?> + + + + +
+ +
+
+ +
+ +
+ + + + +
Error   
File    
Line    
+
+
+            
+            
+
+
+ Job Name:     + ConTeXt Version:     + Real Page:     + Page:     +
+ + diff --git a/tex/context/base/context.css b/tex/context/base/context.css new file mode 100644 index 000000000..ef4a44cea --- /dev/null +++ b/tex/context/base/context.css @@ -0,0 +1,226 @@ +body { + color: #FFFFFF ; + background-color: ; + font-family: optima, verdana, futura, "lucida sans", arial, geneva, helvetica, sans ; + font-size: 12px ; + line-height: 18px ; +} +a:link, a:active, a:visited { + color: #FFFFFF ; +} +a.dir-view:link, a.dir-view:active, a.dir-view:visited { + color: #FFFFFF ; + text-decoration: underline ; +} +h1, .title { + font-style: normal ; + font-weight: normal ; + font-size: 18px ; + line-height: 18px ; + margin-bottom: 20px ; +} +h2, .subtitle { + font-style: normal ; + font-weight: normal ; + font-size: 12px ; + margin-top: 18px ; + margin-bottom: 18px ; +} +table { + line-height: 18px ; + font-size: 12px ; + margin: 0 ; +} +p, li { + max-width: 60em ; +} +.empty-line { + margin-top: 4px ; +} +.more-room { + margin-right: 1.5em ; +} +.much-more-room { + margin-right: 3em ; +} +#main { + position: absolute; + left: 10% ; + top: 10% ; + right: 10% ; + bottom: 10% ; + z-index: 2 ; + width: 80% ; + height: 80% ; + padding: 0% ; + margin: 0% ; + overflow: auto ; + border-style: none ; + border-width: 0 ; + background-color: ; +} +#main-settings { + margin: 12px ; + x_max-width: 60em ; + line-height: 18px ; + font-size: 12px ; +} +#left { + position: absolute; + top : 10% ; + left: 0% ; + bottom: 0%; + right: 90% ; + z-index: 1 ; + width: 10% ; + height: 90% ; + padding: 0% ; + margin: 0% ; + font-size: 16px ; + border-style: none ; + border-width: 0 ; + background-color: ; +} +#right { + position: absolute; + top : 0% ; + left: 90% ; + bottom: 10% ; + right: 0% ; + z-index: 1 ; + width: 10% ; + height: 90% ; + padding: 0% ; + margin: 0% ; + font-size: 16px ; + border-style: none ; + border-width: 0 ; + background-color: ; + _margin-left: -15px ; +} +#bottom { + position: absolute ; + left: 10% ; + right: 0% ; + top: 90% ; + bottom: 0% ; + z-index: 1 ; + width: 90% ; + height: 10% ; + padding: 0% ; + margin: 0% ; + font-size: 16px ; + border-style: none ; + border-width: 0 ; + background-color: ; +} +#top { + position: absolute ; + left: 0% ; + right: 10% ; + top: 0% ; + bottom: 90% ; + z-index: 1 ; + width: 90% ; + height: 10% ; + padding: 0% ; + margin: 0% ; + font-size: 16px ; + border-style: none ; + border-width: 0 ; + background-color: ; +} +#top-one { + position: absolute ; + bottom: 50% ; + width: 100% ; + buggedheight: 100% ; +} +#top-two { + position: relative ; + margin-bottom: -9px ; + margin-left: 12px ; + margin-right: 12px ; + line-height: 18px ; + text-align: right ; + vertical-align: middle ; +} +#bottom-one { + position: absolute ; + bottom: 50% ; + width: 100% ; + buggedheight: 100% ; +} +#bottom-two { + position: relative ; + margin-bottom: -9px ; + margin-left: 12px ; + margin-right: 12px ; + line-height: 18px ; + text-align: left ; + vertical-align: middle ; +} +#left-one { + position: absolute ; + width: 100% ; + buggedheight: 100% ; +} +#left-two { + position: relative ; + margin-top: 12px ; + line-height: 18px ; + text-align: center ; + vertical-align: top ; +} +#right-one { + display: table ; + height: 100% ; + width: 100% ; +} +#right-two { + display: table-row ; + height: 100% ; + width: 100% ; +} +#right-three { + display: table-cell ; + width: 100% ; + vertical-align: bottom ; + _position: absolute ; + _top: 100% ; +} +#right-four { + text-align: center ; + margin-bottom: 2ex ; + _position: relative ; + _top: -100% ; +} +#more-top { + position: absolute; + top: 0% ; + left: 90% ; + bottom: 90%; + right: 0% ; + z-index: 3 ; + width: 10% ; + height: 10% ; + padding: 0% ; + margin: 0% ; + border-style: none ; + border-width: 0 ; +} +#more-top-settings { + text-align: center ; +} +#more-right-settings { + margin-right: 12px ; + margin-left: 12px ; + line-height: 18px ; + font-size: 10px ; + text-align: center ; +} +#right-safari { + display: table ; + width: 100% ; + height: 100% ; +} diff --git a/tex/context/base/context.tex b/tex/context/base/context.tex index 70e4dc67a..8a412745b 100644 --- a/tex/context/base/context.tex +++ b/tex/context/base/context.tex @@ -42,7 +42,7 @@ %D your styles an modules. \edef\contextformat {\jobname} -\edef\contextversion{2007.07.25 12:35} +\edef\contextversion{2007.08.07 01:37} %D For those who want to use this: @@ -622,6 +622,15 @@ \writeline\writebanner{\copyrightversion}\writeline +\unprotect +\beginLUATEX + \appendtoks + \writestatus\m!lua{used config path - \ctxlua{tex.print(cache.configpath(texmf.instance))}}% + \writestatus\m!lua{used cache path - \ctxlua{tex.print(cache.path)}}% + \to \everydump +\endLUATEX +\protect + % %D Except from english, no hyphenation patterns are loaded % %D yet. Users can specify their needs in the next module: % diff --git a/tex/context/base/core-buf.lua b/tex/context/base/core-buf.lua new file mode 100644 index 000000000..57b5274ff --- /dev/null +++ b/tex/context/base/core-buf.lua @@ -0,0 +1,377 @@ +-- filename : core-buf.lua +-- comment : companion to core-buf.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- ctx lua reference model / hooks and such +-- to be optimized + +if not versions then versions = { } end versions['core-buf'] = 1.001 + +if unicode and not utf then utf = unicode.utf8 end + +buffers = { } +buffers.data = { } +buffers.hooks = { } +buffers.flags = { } +buffers.commands = { } + +function buffers.erase(name) + buffers.data[name] = nil +end + +function buffers.set(name, str) + buffers.data[name] = { str } -- CHECK THIS +end + +function buffers.append(name, str) + buffers.data[name] = (buffers.data[name] or "") .. str +end + +buffers.flags.store_as_table = true + +-- to be sorted out: crlf + \ ; slow now + +function buffers.grab(name,begintag,endtag,data) + if not buffers.data[name] or buffers.data[name] == "" then + buffers.data[name] = "" + buffers.level = 0 + end + buffers.level = buffers.level + data:count("\\"..begintag) - data:count("\\"..endtag) + local more = buffers.level>0 + if more then + buffers.data[name] = buffers.data[name] .. data .. endtag + buffers.level = buffers.level - 1 + else + if buffers.data[name] == "" then + buffers.data[name] = data:sub(1,#data-1) + else + buffers.data[name] = buffers.data[name] .. "\n" .. data:sub(1,#data-1) + end + buffers.data[name] = buffers.data[name]:gsub("[\010\013]$","") + if buffers.flags.store_as_table then + -- todo: specific splitter, do we really want to erase the spaces? + buffers.data[name] = string.split(buffers.data[name]," *[\010\013]") + end + end + cs.testcase(more) +end + +function buffers.doifelsebuffer(name) + cs.testcase(buffers.data[name] ~= nil) +end + +buffers.flags.optimize_verbatim = true +buffers.flags.count_empty_lines = false + +buffers.commands.no_break = "\\doverbatimnobreak" +buffers.commands.do_break = "\\doverbatimgoodbreak" +buffers.commands.begin_of_line_command = "\\doverbatimbeginofline" +buffers.commands.end_of_line_command = "\\doverbatimendofline" +buffers.commands.empty_line_command = "\\doverbatimemptyline" + +function buffers.verbatimbreak(n,m) + if buffers.flags.optimize_verbatim then + if (n==2) or (n==m) then + tex.sprint(buffers.commands.no_break) + else + tex.sprint(buffers.commands.do_break) + end + end +end + +function buffers.type(name) + if buffers.data[name] then + if type(buffers.data[name]) == "string" then + -- todo: use linestepper (no need for a table) + local lines = string.split(buffers.data[name]," *[\010\013]") + local line, n, m = 0, 0, #lines + for _,str in ipairs(lines) do + n, line = buffers.typeline(str, n, m, line) + end + else + local line, n, m = 0, 0, #buffers.data[name] + for _,str in ipairs(buffers.data[name]) do + n, line = buffers.typeline(str, n, m, line) + end + end + end +end + +function buffers.typefile(name) + local t = input.openfile(name) + if t then + local line, n, m = 0, 0, t.noflines + while true do + str = t.reader(t) + if str then + n, line = buffers.typeline(str, n, m, line) + else + break + end + end + t.close() + end +end + +function buffers.typeline(str,n,m,line) + n = n + 1 + buffers.verbatimbreak(n,m) + if str:find("%S") then + line = line + 1 + buffers.hooks.begin_of_line(line) + buffers.hooks.flush_line(buffers.hooks.line(str)) + buffers.hooks.end_of_line() + else + if buffers.flags.count_empty_lines then + line = line + 1 + end + buffers.hooks.empty_line(line) + end + return n, line +end + +function buffers.get(name) + if buffers.data[name] then + if type(buffers.data[name]) == "table" then + for _,v in ipairs(buffers.data[name]) do + tex.print(v) + end + else + string.piecewise(buffers.data[name], " *[\010\013]", tex.print) + end + end +end + +function buffers.inspect(name) + if buffers.data[name] then + if type(buffers.data[name]) == "table" then + for _,v in ipairs(buffers.data[name]) do + if v == "" then + tex.sprint(tex.ctxcatcodes,"[crlf]\\par ") + else + tex.sprint(tex.ctxcatcodes,(string.gsub("(.)",function(c) + return " [" .. string.byte(c) .. "] " + end)) .. "\\par") + end + end + else + tex.sprint(tex.ctxcatcodes,(string.gsub(buffers.data[name],"(.)",function(c) + return " [" .. string.byte(c) .. "] " + end))) + end + end +end + +-- maybe just line(n,str) empty(n,str) + +buffers.visualizers = { } +buffers.visualizers.default = { } +buffers.visualizers.tex = { } +buffers.visualizers.mp = { } + +buffers.visualizers.escapetoken = nil +buffers.visualizers.tablength = 7 + +buffers.visualizers.enabletab = false +buffers.visualizers.enableescape = false + +function buffers.visualizers.reset() + buffers.visualizers.enabletab = false + buffers.visualizers.enableescape = false + buffers.currentvisualizer = 'default' +end + +buffers.currentvisualizer = 'default' + +function buffers.setvisualizer(str) + buffers.currentvisualizer = string.lower(str) + if not buffers.visualizers[buffers.currentvisualizer] then + buffers.currentvisualizer = 'default' + end +end + +function buffers.doifelsevisualizer(str) + cs.testcase((str ~= "") and (buffers.visualizers[string.lower(str)] ~= nil)) +end + +-- calling routines, don't change + +function buffers.hooks.flush_line(str,nesting) + if buffers.visualizers[buffers.currentvisualizer].flush_line then + buffers.visualizers[buffers.currentvisualizer].flush_line(str,nesting) +--~ elseif nesting then +--~ buffers.visualizers.flush_nested(str,false) -- no real nesting + else + buffers.visualizers.default.flush_line(str,nesting) + end +end + +function buffers.hooks.begin_of_line(n) + if buffers.visualizers[buffers.currentvisualizer].begin_of_line then + buffers.visualizers[buffers.currentvisualizer].begin_of_line(n) + else + buffers.visualizers.default.begin_of_line(n) + end +end + +function buffers.hooks.end_of_line() + if buffers.visualizers[buffers.currentvisualizer].end_of_line then + buffers.visualizers[buffers.currentvisualizer].end_of_line() + else + buffers.visualizers.default.end_of_line(str) + end +end + +function buffers.hooks.empty_line() + if buffers.visualizers[buffers.currentvisualizer].empty_line then + buffers.visualizers[buffers.currentvisualizer].empty_line() + else + buffers.visualizers.default.empty_line() + end +end + +function buffers.hooks.line(str) + if buffers.visualizers[buffers.currentvisualizer].line then + return buffers.visualizers[buffers.currentvisualizer].line(str) + else + return buffers.visualizers.default.line(str) + end +end + +-- defaults + +function buffers.visualizers.default.flush_line(str) + tex.sprint(tex.ctxcatcodes,buffers.escaped(str)) +end + +function buffers.visualizers.default.begin_of_line(n) + tex.sprint(tex.ctxcatcodes, buffers.commands.begin_of_line_command .. "{" .. n .. "}") +end + +function buffers.visualizers.default.end_of_line() + tex.sprint(tex.ctxcatcodes,buffers.commands.end_of_line_command) +end + +function buffers.visualizers.default.empty_line() + tex.sprint(tex.ctxcatcodes,buffers.commands.empty_line_command) +end + +function buffers.visualizers.default.line(str) + return str +end + +-- special one + +buffers.commands.nested = "\\switchslantedtype " + +-- todo : utf + faster + +function buffers.visualizers.flush_nested(str, enable) -- no utf, kind of obsolete mess + local result, c, nested, i = "", "", 0, 1 + local sb, ss, sf = string.byte, string.sub, string.find + while i < #str do -- slow + c = ss(str,i,i+1) + if c == "<<" then + nested = nested + 1 + if enable then + result = result .. "{" .. buffers.commands.nested + else + result = result .. "{" + end + i = i + 2 + elseif c == ">>" then + if nested > 0 then + nested = nested - 1 + result = result .. "}" + end + i = i + 2 + else + c = ss(str,i,i) + if c == " " then + result = result .. "\\obs " + elseif sf(c,"%a") then + result = result .. c + else + result = result .. "\\char" .. sb(c) .. " " + end + i = i + 1 + end + end + result = result .. "\\char" .. sb(ss(str,i,i)) .. " " .. string.rep("}",nested) + tex.sprint(tex.ctxcatcodes,result) +end + +-- handy helpers +-- +-- \sop[color] switch_of_pretty +-- \bop[color] begin_of_pretty +-- \eop end_of_pretty +-- \obs obeyedspace +-- \char special characters + +buffers.currentcolors = { } + +function buffers.change_state(n, state, result) + if n then + if state ~= n then + if state > 0 then + result[#result+1] = "\\sop[" .. buffers.currentcolors[n] .. "]" + else + result[#result+1] = "\\bop[" .. buffers.currentcolors[n] .. "]" + end + return n + end + elseif state > 0 then + result[#result+1] = "\\eop " + return 0 + end + return state +end + +function buffers.finish_state(state, result) + if state > 0 then + result[#result+1] = "\\eop " + return 0 + else + return state + end +end + +buffers.open_nested = string.rep("\\char"..string.byte('<').." ",2) +buffers.close_nested = string.rep("\\char"..string.byte('>').." ",2) + +function buffers.replace_nested(result) + return (string.gsub(string.gsub(result,buffers.open_nested,"{"),buffers.close_nested,"}")) +end + +function buffers.flush_result(result,nested) + if nested then + tex.sprint(tex.ctxcatcodes,buffers.replace_nested(table.concat(result,""))) + else + tex.sprint(tex.ctxcatcodes,table.concat(result,"")) + end +end + +function buffers.escaped(str) + local sb, sf = utf.byte, utf.find + return (utf.gsub(str,"(.)", function(c) + if sf(c,"^(%a%d)$") then + return c + elseif c == " " then + return "\\obs " + else + return "\\char" .. sb(c) .. " " + end + end)) +end + +function buffers.escaped_chr(ch) + local b = utf.byte(ch) + if b == 32 then + return "\\obs " + else + return "\\char" .. b .. " " + end +end diff --git a/tex/context/base/core-buf.mkiv b/tex/context/base/core-buf.mkiv new file mode 100644 index 000000000..09f4f552e --- /dev/null +++ b/tex/context/base/core-buf.mkiv @@ -0,0 +1,107 @@ +%D \module +%D [ file=core-buf, % blocks are moved to core-blk +%D version=2000.01.05, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Buffers, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\registerctxluafile{core-buf}{1.001} + +\def\mkresetbuffer + {\ctxlua{buffers.erase("\currentbuffer")}} + +\long\def\mksetbuffer#1% + {\ctxlua{buffers.set("\currentbuffer", \!!bs\detokenize{#1}\!!es)}} + +\long\def\mkstartbuffer#1#2#3#4#5% + {\doifelsenothing{#4} + {\expanded{\setbuffercapsules{\e!start\v!buffer}{\e!stop\v!buffer}}% + \letvalue\bufferstop\relax} + {\setbuffercapsules{#3}{#4}}% not expanded, can be \cs \cs ! + \expanded{\dodowithbuffer + {\currentbuffer} + {\bufferstart} + {\bufferstop} + {\donothing} + {#5% \egroup + \noexpand\getvalue{\bufferstop}}}} + +\def\mkdobuffer#1% + {#1} + +\def\mkdoifelsebuffer#1% + {\ctxlua{buffers.doifelsebuffer("#1")}} + +\def\mkgetbuffer + {\ctxlua{buffers.get("\currentbuffer")}} + +% will move + +\ifx\mkinitializeverbatim\undefined \def\mkinitializeverbatim{\tttf} \fi + +\def\mktypebuffer + {\mkdotypebuffer{\v!file}{}{\currentbuffer}} + +\def\mkprocessbufferverbatim + {\mkinitializeverbatim + \ctxlua{buffers.type("\currentbuffer")}} + +\def\mkprocessbufferlinesverbatim#1#2#3% + {#2% + % todo, set up numbers + \mkinitializeverbatim + \ctxlua{buffers.type("\currentbuffer")} + #3} + +\def\mkdotypebuffer#1#2#3% see dodotypefile + {\mkdoifelsebuffer{#3} + {\dosometyping{#1}{#2}{#3}\mkprocessbufferverbatim\mkprocessbufferlinesverbatim} + {\reporttypingerror{#3}}} + +\def\setbuffercapsules#1#2% + {\edef\bufferstart{\strippedcsname#1}\edef\bufferstart{\scantextokens\expandafter{\bufferstart}}% + \edef\bufferstop {\strippedcsname#2}\edef\bufferstop {\scantextokens\expandafter{\bufferstop }}} + +\def\dowithbuffer#1#2#3% name, startsequence, stopsequence, before, after + {\setbuffercapsules{#2}{#3}% + \expanded{\dodowithbuffer{#1}{\bufferstart}{\bufferstop}}} + +\long\def\dodowithbuffer#1#2#3#4#5% name, startsequence, stopsequence, before, after + {#4% + \bgroup + \setcatcodetable \vrbcatcodes + \catcode`\\=12 + \ctxlua{buffers.erase("#1")}% + \long\def\nododowithbuffer + {\egroup + #5}% + \long\def\dododowithbuffer##1#3% is detokenize needed? TEST + {\ctxlua + {buffers.grab("#1","#2","#3",\!!bs\detokenize{##1}\!!es)} + \dododowithbuffer + \nododowithbuffer}% + \dododowithbuffer} + +% kind of redundant in mkiv + +\let\mkstartmemorybuffer\startbuffer +\let\mkstartfilebuffer \startbuffer + +% bonus + +\def\inspectbuffer + {\dosingleempty\doinspectbuffer} + +\def\doinspectbuffer[#1]% + {\setcurrentbuffer{#1}% + \ctxlua{buffers.inspect("\currentbuffer")}} + +\protect \endinput diff --git a/tex/context/base/core-con.lua b/tex/context/base/core-con.lua new file mode 100644 index 000000000..349d33688 --- /dev/null +++ b/tex/context/base/core-con.lua @@ -0,0 +1,164 @@ +if not modules then modules = { } end modules ['char-con'] = { + version = 1.001, + comment = "companion to core-con.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

This module implements a bunch of conversions. Some are more +efficient than their counterpart, some are even +slower but look nicer this way.

+ +

Some code may move to a module in the language namespace.

+--ldx]]-- + +convert = convert or { } +language = language or { } + +language.counters = { + ['**'] = { + 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, + 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, + 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, + 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, + 0x007A + }, + ['sl'] = { + 0x0061, 0x0062, 0x0063, 0x010D, 0x0064, + 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, + 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, + 0x006F, 0x0070, 0x0072, 0x0073, 0x0161, + 0x0074, 0x0075, 0x0076, 0x007A, 0x017E + }, + ['gr'] = { + 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, + 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, + 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x03A3, 0x03A4, 0x03A5, + 0x03A6, 0x03A7, 0x03A8, 0x03A9 + }, + ['arabic'] = { + 0x0660, 0x0661, 0x0662, 0x0663, 0x0664, + 0x0665, 0x0666, 0x0667, 0x0668, 0x0669 + }, + ['persian'] = { + 0x06F0, 0x06F1, 0x06F2, 0x06F3, 0x06F4, + 0x06F5, 0x06F6, 0x06F7, 0x06F8, 0x06F9 + }, + ['thai'] = { + 0xE050, 0xE051, 0xE052, 0xE053, 0xE054, + 0xE055, 0xE056, 0xE057, 0xE058, 0xE059 + }, + ['devangari'] = { + 0x0966, 0x0967, 0x0968, 0x0969, 0x096A, + 0x096B, 0x096C, 0x096D, 0x096E, 0x096F + }, + ['gurmurkhi'] = { + 0x0A66, 0x0A67, 0x0A68, 0x0A69, 0x0A6A, + 0x0A6B, 0x0A6C, 0x0A6D, 0x0A6E, 0x0A6F + }, + ['gujarati'] = { + 0x0AE6, 0x0AE7, 0x0AE8, 0x0AE9, 0x0AEA, + 0x0AEB, 0x0AEC, 0x0AED, 0x0AEE, 0x0AEF + }, + ['tibetan'] = { + 0x0F20, 0x0F21, 0x0F22, 0x0F23, 0x0F24, + 0x0F25, 0x0F26, 0x0F27, 0x0F28, 0x0F29 + } +} + +function convert.chr(n, m) + if n > 0 and n < 27 then + tex.sprint(string.char(n+m)) + end +end + +function convert.maxchrs(n,m,cmd) + if n <= m then + tex.sprint(tex.texcatcodes, cmd .. "{" .. n .. "}") + else + convert.maxchrs(math.floor((n-1)/m),m,cmd) + tex.sprint(tex.texcatcodes, cmd .. "{" .. ((n-1)%m + 1) .. "}") + end +end +function convert.chrs(n,m) + if n <= 26 then + tex.sprint(string.char(n+m)) + else + convert.chrs(math.floor((n-1)/26),m) + tex.sprint(string.char(((n-1)%26 + 1)+m)) + end +end + +function convert.alphabetic(n,code) + local code = language.counters[code] or language.counters['**'] + convert.do_alphabetic(n,#code,function(n) return code[n] end) +end + +function convert.Alphabetic(n,code) + local code = language.counters[code] or language.counters['**'] + convert.do_alphabetic(n,#code,function(n) return characters.uccode(code[n]) end) +end + +function convert.do_alphabetic(n,max,chr) + if n <= max then + characters.flush(chr(n)) + else + convert.do_alphabetic(math.floor((n-1)/max),max,chr) + characters.flush(chr((n-1)%max+1)) + end +end + +function convert.character(n) convert.chr (n,96) end +function convert.Character(n) convert.chr (n,64) end +function convert.characters(n) convert.chrs(n,96) end +function convert.Characters(n) convert.chrs(n,64) end + +function convert.weekday(year,month,day) + tex.sprint(os.date("%w",os.time{year=year,month=month,day=day})+1) +end + +function convert.lpy(year) + return (year % 400 == 0) or ((year % 100 ~= 0) and (year % 4 == 0)) +end + +function convert.leapyear(year) + if convert.lpy(year) then tex.sprint(1) else tex.sprint(0) end +end + +convert.mth = { + [false] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }, + [true] = { 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 } +} + +function convert.nofdays(year,month) + tex.sprint(convert.mth[convert.lpy(year)][month]) +end + +function convert.year () tex.sprint(os.date("%Y")) end +function convert.month () tex.sprint(os.date("%m")) end +function convert.hour () tex.sprint(os.date("%H")) end +function convert.minute () tex.sprint(os.date("%M")) end +function convert.second () tex.sprint(os.date("%S")) end +function convert.textime() tex.sprint(tonumber(os.date("%H"))*60+tonumber(os.date("%M"))) end + +convert.rom = { + { [0] = '', 'I', 'II', 'III', 'IV', 'V', 'VI', 'VII', 'VIII', 'IX' }, + { [0] = '', 'X', 'XX', 'XXX', 'XL', 'L', 'LX', 'LXX', 'LXXX', 'XC' }, + { [0] = '', 'C', 'CC', 'CCC', 'CD', 'D', 'DC', 'DCC', 'DCCC', 'CM' }, +} + +function convert.toroman(n) + if n >= 4000 then + return convert.toroman(math.floor(n/1000)) .. " " .. convert.toroman(n%1000) + else + return string.rep("M",math.floor(n/1000)) .. convert.rom[3][math.floor((n%1000)/100)] .. + convert.rom[2][math.floor((n%100)/10)] .. convert.rom[1][math.floor((n% 10)/1)] + end +end + +function convert.romannumerals(n) return tex.sprint(string.tolower(convert.toroman(n))) end +function convert.Romannumerals(n) return tex.sprint( convert.toroman(n) ) end diff --git a/tex/context/base/core-con.mkiv b/tex/context/base/core-con.mkiv new file mode 100644 index 000000000..afed14f1d --- /dev/null +++ b/tex/context/base/core-con.mkiv @@ -0,0 +1,90 @@ +%D \module +%D [ file=core-con, +%D version=2006.09.16, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Conversion Macros, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\registerctxluafile{core-con}{1.001} + +\def\romannumerals#1{\ctxlua{convert.romannumerals(\number#1)}} +\def\Romannumerals#1{\ctxlua{convert.Romannumerals(\number#1)}} + +\def\greeknumerals#1{\ctxlua{convert.alphabetic(\number#1,"gr")}} +\def\Greeknumerals#1{\ctxlua{convert.Alphabetic(\number#1,"gr")}} + +\def\character #1{\ctxlua{convert.character (\number#1)}} +\def\Character #1{\ctxlua{convert.Character (\number#1)}} +\def\characters#1{\ctxlua{convert.characters(\number#1)}} +\def\Characters#1{\ctxlua{convert.Characters(\number#1)}} + +\def\languagecharacters#1{\ctxlua{convert.alphabetic(\number#1,"\currentlanguage")}} % new +\def\languageCharacters#1{\ctxlua{convert.Alphabetic(\number#1,"\currentlanguage")}} % new + +\def\getdayoftheweek#1#2#3{\normalweekday\ctxlua{convert.weekday(\number#1,\number#2,\number#3)}} +\def\dayoftheweek #1#2#3{\doconvertday{\ctxlua{convert.weekday(\number#1,\number#2,\number#3)}}} + +\def\doifleapyearelse#1% + {\ifcase\ctxlua{convert.leapyear(\number#1)} + \@EA\secondoftwoarguments + \else + \@EA\firstoftwoarguments + \fi} + +\def\getdayspermonth#1#2% + {\edef\numberofdays{\ctxlua{convert.nofdays(\number#1,\number#2)}}} + +\def\dayspermonth#1#2% + {\ctxlua{convert.nofdays(\number#1,\number#2)}} + +\def\calculatecurrenttime + {\edef\currenthour {\ctxlua{convert.hour ()}}% + \edef\currentminute{\ctxlua{convert.minute()}}% + \edef\currentsecond{\ctxlua{convert.second()}}} + +% problem is that we calculate with those numbers +% +% \def\time {\numexpr\ctxlua{convert.textime()}\relax} +% \def\year {\numexpr\ctxlua{convert.year ()}\relax} +% \def\month{\numexpr\ctxlua{convert.month ()}\relax} +% \def\day {\numexpr\ctxlua{convert.day ()}\relax} + +% \dayoftheweek{2006}{9}{15} +% \doifleapyearelse{2000}{OK}{NOT OK} +% \doifleapyearelse{2100}{NOT OK}{OK} +% \doifleapyearelse{2004}{OK}{NOT OK} +% \doifleapyearelse{2003}{NOT OK}{OK} +% \dayspermonth{2000}{2} +% [\the\normaltime=\the\time] + +% we could use an auxiliary macro to save some bytes in the format +% +% \def\dolanguagecharacters#1#2{\ctxlua{convert.alphabetic(\number#2,"#1")}} + +% this does not belong here, but in a lang-module + +\def\arabicnumerals #1{\ctxlua{convert.alphabetic(\number#1,"arabic")}} +\def\persiannumerals #1{\ctxlua{convert.alphabetic(\number#1,"persian")}} +\def\thainumerals #1{\ctxlua{convert.alphabetic(\number#1,"thai")}} +\def\devanagarinumerals#1{\ctxlua{convert.alphabetic(\number#1,"devanagari")}} +\def\gurmurkhinumerals #1{\ctxlua{convert.alphabetic(\number#1,"gurmurkhi")}} +\def\gujaratinumerals #1{\ctxlua{convert.alphabetic(\number#1,"gujarati")}} +\def\tibetannumerals #1{\ctxlua{convert.alphabetic(\number#1,"tibetan")}} + +\defineconversion[arabicnumerals] [\arabicnumerals] +\defineconversion[persiannumerals] [\persiannumerals] +\defineconversion[thainumerals] [\thainumerals] +\defineconversion[devanagarinumerals][\devanagarinumerals] +\defineconversion[gurmurkhinumerals] [\gurmurkhinumerals] +\defineconversion[gujaratinumerals] [\gujaratinumerals] +\defineconversion[tibetannumerals] [\tibetannumerals] + +\protect \endinput diff --git a/tex/context/base/core-des.tex b/tex/context/base/core-des.tex index 1c37b655c..d0152fddc 100644 --- a/tex/context/base/core-des.tex +++ b/tex/context/base/core-des.tex @@ -423,7 +423,7 @@ [\c!location,\c!headstyle,\c!style,\c!color,\c!headcolor,\c!title, \c!width,\c!hang,\c!sample,\c!before,\c!inbetween,\c!after,\c!margin, \c!indenting,\c!indentnext,\c!align,\c!text,\c!distance,\c!titledistance,\c!command, - \c!titleleft,\c!titleright,\c!closesymbol,\c!closecommand]% + \c!titleleft,\c!titleright,\c!titlecommand,\c!closesymbol,\c!closecommand]% \getparameters[\??dd#1] [\c!title=\v!yes,\s!do\c!command=\normal@@descriptionhandler, \c!type=\v!description,\c!list=,\c!listtext=, @@ -520,9 +520,10 @@ {\doifsomething{#1} {\doattributes{\??dd\currentdescription}\c!titlestyle\c!titlecolor {\hskip\descriptionparameter\c!titledistance - \descriptionparameter\c!titleleft - \begstrut#1\endstrut - \descriptionparameter\c!titleright}}}} + \descriptionparameter\c!titlecommand + {\descriptionparameter\c!titleleft + \begstrut#1\endstrut + \descriptionparameter\c!titleright}}}}} \def\showdnpuretext @@ -653,7 +654,7 @@ \c!sample,\c!hang,\c!align,\c!before,\c!inbetween,\c!after, \c!levels,\c!way,\c!blockway,\c!separator,\c!margin, \c!indenting,\c!indentnext,\c!stopper,\c!sectionnumber, - \c!title,\c!titleleft,\c!titleright,\c!closesymbol,\c!closecommand]% + \c!title,\c!titleleft,\c!titleright,\c!titlecommand,\c!closesymbol,\c!closecommand]% \doifassignmentelse{#4} {\getparameters[\??dd#3#1]% [\c!text=#1,\??dd\c!number=#1,\c!conversion=,\c!listtext=#1\space, @@ -671,7 +672,7 @@ \c!sample,\c!hang,\c!align,\c!before,\c!inbetween,\c!after, \c!stopper,\c!indenting,\c!indentnext,\c!left,\c!right, \c!coupling,\c!couplingway, - \c!title,\c!titleleft,\c!titleright,\c!closesymbol,\c!closecommand]% + \c!title,\c!titleleft,\c!titleright,\c!titlecommand,\c!closesymbol,\c!closecommand]% \getparameters[\??dd#3#1] [\c!text=#1,\??dd\c!number=#4,\c!conversion=,#5]% %docheckenumerationnumber{#1}{#3#1}{#4}}}% @@ -859,7 +860,8 @@ \c!titleright=), \c!closesymbol=, \c!closecommand=\wordright, - \c!command=] + \c!command=, + \c!titlecommand=] \setupenumerations [\c!location=\v!top, @@ -893,7 +895,8 @@ \c!closesymbol=, \c!closecommand=\wordright, \c!number=, - \c!command=] + \c!command=, + \c!titlecommand=] \setupindentations [\c!style=\v!normal, diff --git a/tex/context/base/core-itm.tex b/tex/context/base/core-itm.tex index 2171ff837..42d45a5df 100644 --- a/tex/context/base/core-itm.tex +++ b/tex/context/base/core-itm.tex @@ -87,6 +87,10 @@ \let\currentitemoffset \!!zerocount \def\currentitemnumber{\countervalue{\@@itemcounter\itemlevel}} +% tricky ... we cannot use trialtypesetting here because there can be +% multiple itemizes in e.g. a table, so we need something more advanced +% where counters etc are reset to pre-outertrial values + \def\dolistreference {\ifconditional\continuelistitems \savetaggedtwopassdata\s!list\currentlist\currentlist{\itemlevel:\noflistelements:c:\getitemparameter\itemlevel\c!maxwidth}% @@ -104,9 +108,9 @@ \def\checkcurrentnofitems {\splititemtwopassdata\noflists \iftwopassdatafound - \ifcase\scratchcounter + \ifcase\itemdatan\relax % \scratchcounter \let\currentnofitems \!!zerocount - \let\currentminnofitems\!!zerocount + \let\currentminnofitems\!!plusone \let\currentmaxnofitems\!!zerocount \else \scratchcounter\itemdatan\relax @@ -615,16 +619,16 @@ \ifconditional\textlistitem\else\doifnotinset\v!text{#1}\par\fi % suboptimal \fi \begingroup -% new where, ok or not / we should integrate random, intro, continue here -% beware, the following no longer inherit from the previous level, is this ok? -\setfalse\reverselistitem -\setfalse\introlistitem -\setfalse\autointrolistitem -\setfalse\beforelistitem -\setfalse\afterlistitem -\setfalse\nowhitelistitem -\setfalse\randomizeitems -% + % new where, ok or not / we should integrate random, intro, continue here + % beware, the following no longer inherit from the previous level, is this ok? + \setfalse\reverselistitem + \setfalse\introlistitem + \setfalse\autointrolistitem + \setfalse\beforelistitem + \setfalse\afterlistitem + \setfalse\nowhitelistitem + \setfalse\randomizeitems + % \doifinsetelse\v!intro {#1}{\settrue\introlistitem }{\setfalse\introlistitem }% \doifinsetelse\v!random {#1}{\settrue\randomizeitems }{\setfalse\randomizeitems }% \doifinsetelse\v!continue{#1}{\settrue\continuelistitems}{\setfalse\continuelistitems}% @@ -636,7 +640,7 @@ \setfalse\sublistitem \setfalse\symbollistitem \let\marsymbol\relax - \globallet\somdestination\empty + \globallet\doitemdestination\empty \let\symsymbol\empty \the\itemgroupcommands \checkcurrentnofitems @@ -781,7 +785,7 @@ {\doitemgroupitem} \def\itemgroupbutton[#1]% - {\gdef\somdestination{#1}% + {\gdef\doitemdestination{#1}% \itemgroupitem} \def\itemgroupdummy @@ -974,9 +978,9 @@ \setbox8\simplealignedbox{\getitemparameter\itemlevel\c!itemalign}{\itemdataw sp}{\box8}% \fi \fi - \doifsomething\somdestination - {\setbox8\hbox{\goto{\box8}[\somdestination]}}% - \globallet\somdestination\empty + \doifsomething\doitemdestination + {\setbox8\hbox{\goto{\box8}[\doitemdestination]}}% + \globallet\doitemdestination\empty \dimen2=\getitemparameter\itemlevel\c!width\relax % new, prevents loops when symbol is (not yet found) graphic \ht8=\strutheight diff --git a/tex/context/base/core-lst.tex b/tex/context/base/core-lst.tex index 359e9b8ce..7c26b97f7 100644 --- a/tex/context/base/core-lst.tex +++ b/tex/context/base/core-lst.tex @@ -33,6 +33,8 @@ % number uses the text container. We use reference mapping % (define reference) to keep track of the current ref. +% \@@sectie == current level + \def\dowritetolist#1% {\doifelsevalue{\??li#1\c!state}\v!start \dodowritetolist\gobblefourarguments{#1}} diff --git a/tex/context/base/core-ntb.tex b/tex/context/base/core-ntb.tex index e8534b714..aa1ace99f 100644 --- a/tex/context/base/core-ntb.tex +++ b/tex/context/base/core-ntb.tex @@ -884,11 +884,11 @@ \fi \else\ifautoTBLrowspan\ifnum\maximumrowspan>1 % max ? % added jan 2002 because nx=* did no longer work -\edef\savedhsize{\the\hsize}% -\hsize\wd0\relax % new per 17/04/2006 + \edef\savedhsize{\the\hsize}% + \hsize\wd0\relax % new per 17/04/2006 \checktblwidthsone % trial run \checktblwidthstwo % real run -\hsize\savedhsize + \hsize\savedhsize % \let\handleTBLcell\dohandleTBLcellC \setbox\scratchbox\vbox{\trialtypesettingtrue \the\tbltoks}% @@ -901,7 +901,7 @@ \dorecurse{\gettblcol{##1}{##2}} {\advance\dimen2 \gettblwid\colTBL \advance\dimen2 \tbltblcolumndistance -\ifnum\recurselevel<\gettblcol{##1}{##2}\relax \advance\dimen2 \gettbldis\colTBL\fi + \ifnum\recurselevel<\gettblcol{##1}{##2}\relax \advance\dimen2 \gettbldis\colTBL\fi \increment\colTBL}% \advance\dimen2 -\tbltblcolumndistance \edef\widthTBL{\the\dimen2}% diff --git a/tex/context/base/core-obj.lua b/tex/context/base/core-obj.lua new file mode 100644 index 000000000..b94719993 --- /dev/null +++ b/tex/context/base/core-obj.lua @@ -0,0 +1,36 @@ +if not modules then modules = { } end modules ['core-obj'] = { + version = 1.001, + comment = "companion to core-obj.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

We save object references in the main utility table. Objects are +reusable components.

+--ldx]]-- + +if not jobs then jobs = { } end +if not job then jobs['main'] = { } end job = jobs['main'] +if not job.objects then job.objects = { } end + +function job.getobjectreference(tag,default) + if job.objects[tag] then + tex.sprint(job.objects[tag][1] or default) + else + tex.sprint(default) + end +end + +function job.getobjectreferencepage(tag,default) + if job.objects[tag] then + tex.sprint(job.objects[tag][2] or default) + else + tex.sprint(default) + end +end + +function job.doifobjectreference(tag) + cs.testcase(job.objects[tag]) +end diff --git a/tex/context/base/core-obj.mkiv b/tex/context/base/core-obj.mkiv new file mode 100644 index 000000000..022b6908d --- /dev/null +++ b/tex/context/base/core-obj.mkiv @@ -0,0 +1,55 @@ +%D \module +%D [ file=core-obj, +%D version=2006.10.16, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Object Handling, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\let\objectreference\gobblefourarguments % catch mkii tuo stuff + +\registerctxluafile{core-obj}{1.001} + +\appendtoks + \immediatewriteutilitytua{if not job.objects then job.objects = { } end}% + \immediatewriteutilitytua{local ob = job.objects}% +\to \everyopenutilities + +\def\mkregisterobjectreference#1#2#3% + {\blabelgroup + \expanded{\writeutilitytua{ob['#1::#2']={"#3","\noexpand\realfolio"}}}% + \expanded{\ctxlua{job.objects['#1::#2']={"#3","\noexpand\realfolio"}}}% + \elabelgroup} + +\def\mkoverloadobjectreference#1#2#3% + {\blabelgroup + \expanded{\ctxlua{job.objects['#1::#2']={"#3","\noexpand\realfolio"}}}% + \elabelgroup} + +\def\mkgetobjectreference#1#2#3% + {\blabelgroup + \xdef#3{\ctxlua{job.getobjectreference ('#1::#2',"\defaultobjectreference{#1}{#2}")}}% + \elabelgroup} + +\def\mkgetobjectreferencepage#1#2#3% + {\blabelgroup + \xdef#3{\ctxlua{job.getobjectreferencepage('#1::#2',"\defaultobjectpage{#1}{#2}")}}% + \elabelgroup} + +% \def\doifobjectreferencefoundelse#1#2 +% {\ctxlua{job.doifobjectreference('#1::#2')}} + +\def\doifobjectreferencefoundelse#1#2% + {\blabelgroup + \ctxlua{job.doifobjectreference('#1::#2')}% + {\elabelgroup\firstoftwoarguments} + {\elabelgroup\secondoftwoarguments}} + +\protect \endinput diff --git a/tex/context/base/core-pos.lua b/tex/context/base/core-pos.lua new file mode 100644 index 000000000..d5c365031 --- /dev/null +++ b/tex/context/base/core-pos.lua @@ -0,0 +1,95 @@ +if not modules then modules = { } end modules ['core-pos'] = { + version = 1.001, + comment = "companion to core-pos.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

We save positional information in the main utility table. Not only +can we store much more information in but it's also +more efficient.

+--ldx]]-- + +if not jobs then jobs = { } end +if not job then jobs['main'] = { } end job = jobs['main'] +if not job.positions then job.positions = { } end + +function job.MPp(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[1]) else tex.sprint('0' ) end end +function job.MPx(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[2]) else tex.sprint('0pt') end end +function job.MPy(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[3]) else tex.sprint('0pt') end end +function job.MPw(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[4]) else tex.sprint('0pt') end end +function job.MPh(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[5]) else tex.sprint('0pt') end end +function job.MPd(id) local jpi = job.positions[id] if jpi then tex.sprint(jpi[6]) else tex.sprint('0pt') end end + +function job.MPxy(id) + local jpi = job.positions[id] + if jpi then + tex.sprint('('..jpi[2]..','..jpi[3]..')') + else + tex.sprint('(0pt,0pt)') + end +end + +function job.MPll(id) + local jpi = job.positions[id] + if jpi then + tex.sprint('('..jpi[2]..'-'..-jpi[3]..','..jpi[6]..')') + else + tex.sprint('(0pt,0pt)') + end +end +function job.MPlr(id) + local jpi = job.positions[id] + if jpi then + tex.sprint('('..jpi[2]..'+'..jpi[4]..','..jpi[3]..'-'..jpi[6]..')') + else + tex.sprint('(0pt,0pt)') + end +end +function job.MPur(id) + local jpi = job.positions[id] + if jpi then + tex.sprint('('..jpi[2]..'+'..jpi[4]..','..jpi[3]..'+'..jpi[5]..')') + else + tex.sprint('(0pt,0pt)') + end +end +function job.MPul(id) + local jpi = job.positions[id] + if jpi then + tex.sprint('('..jpi[2]..','..jpi[3]..'+'..jpi[5]..')') + else + tex.sprint('(0pt,0pt)') + end +end + +-- todo + +function job.MPpos(id) + local jpi = job.positions[id] + if jpi then + tex.sprint(table.concat(jpi,',',1,6)) + else + tex.sprint('0,0pt,0pt,0pt,0pt,0pt') + end +end + +function job.MPplus(id,n) + local jpi = job.positions[id] + if jpi then + tex.sprint(jpi[n] or '0pt') + else + tex.sprint('0pt') + end +end + +function job.MPrest(id,default) -- 7 or 8 ? + local jpi = job.positions[id] + if jpi then + tex.sprint(jpi[7] or default) + else + tex.sprint(default) + end +end diff --git a/tex/context/base/core-pos.mkiv b/tex/context/base/core-pos.mkiv new file mode 100644 index 000000000..7c80984dc --- /dev/null +++ b/tex/context/base/core-pos.mkiv @@ -0,0 +1,65 @@ +%D \module +%D [ file=core-pos, +%D version=2006.09.18, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Positioning Support, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\registerctxluafile{core-pos}{1.001} + +\appendtoks + \immediatewriteutilitytua{if not job.positions then job.positions = { } end}% + \immediatewriteutilitytua{local jp = job.positions}% +\to \everyopenutilities + +\def\replacepospxywhd#1#2#3#4#5#6#7% + {\ctxlua{job.positions['#1']={\number#2,"\the\dimexpr#3\relax","\the\dimexpr#4\relax",% + "\the\dimexpr#5\relax","\the\dimexpr#6\relax","\the\dimexpr#7\relax"}}} + +\def\dolazysaveposition#1#2#3#4% + {\expanded{\writeutilitytua{jp['#1']={#2,"#3","#4"}}}} + +\def\dolazysavepositionwhd#1#2#3#4#5#6#7% + {\expanded{\writeutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7"}}}} + +\def\dolazysavepositionplus#1#2#3#4#5#6#7#8% + {\expanded{\writeutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}} + +\def\dosaveposition#1#2#3#4% tag page x y + {\expanded{\immediatewriteutilitytua{jp['#1']={#2,"#3","#4"}}}} + +\def\dosavepositionwhd#1#2#3#4#5#6#7% tag page x y w h d + {\expanded{\immediatewriteutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7"}}}} + +\def\dosavepositionplus#1#2#3#4#5#6#7#8% tag page x y w h d list + {\expanded{\immediatewriteutilitytua{jp['#1']={#2,"#3","#4","#5","#6","#7","#8"}}}} + +\def\MPp #1{\ctxlua{job.MPp("#1")}} +\def\MPx #1{\ctxlua{job.MPx("#1")}} +\def\MPy #1{\ctxlua{job.MPy("#1")}} +\def\MPw #1{\ctxlua{job.MPw("#1")}} +\def\MPh #1{\ctxlua{job.MPh("#1")}} +\def\MPd #1{\ctxlua{job.MPd("#1")}} +\def\MPxy #1{\ctxlua{job.MPxy("#1")}} +\def\MPll #1{\ctxlua{job.MPll("#1")}} +\def\MPlr #1{\ctxlua{job.MPlr("#1")}} +\def\MPur #1{\ctxlua{job.MPur("#1")}} +\def\MPul #1{\ctxlua{job.MPul("#1")}} +\def\MPpos#1{\ctxlua{job.MPpos("#1")}} + +\def\MPplus#1#2{\ctxlua{job.MPplus("#1",#2)}} +\def\MPrest#1#2{\ctxlua{job.MPrest("#1","#2")}} + +\def\doifpositionelse#1{\ctxlua{cs.testcase(job.positions['#1'])}} + +\def\copyposition#1#2{\ctxlua{job.positions['#1']=job.positions['#2']}} + +\protect \endinput diff --git a/tex/context/base/core-reg.lua b/tex/context/base/core-reg.lua new file mode 100644 index 000000000..b5ca260f8 --- /dev/null +++ b/tex/context/base/core-reg.lua @@ -0,0 +1,237 @@ +-- filename : core-reg.lua +-- comment : companion to core-reg.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['core-reg'] = 1.001 +if not jobs then jobs = { } end +if not job then jobs['main'] = { } end job = jobs['main'] +if not job.registers then job.registers = { } end + +function job.defineregister(id) + if not job.registers[id] then + job.registers[id] = { } + end +end + +-- {'e','3','','test+test+test','2--0-0-0-0-0-0-0--1','1'} + +-- load index (we could rease the original entry afterwards, freeing memory) + +-- index sorting + +sorters = sorters or { } +sorters.index = sorters.index or { } +sorters.index.data = sorters.index.data or { } + +do + + function sorters.index.compare(a,b) + local result = 0 + for i=1,3 do + if result == 0 then + result = sorters.comparers.basic(a,b,i) + else + return result + end + end + if a[1] ~= 's' then -- e/f/t + local page_a, page_b = a[3], b[3] + if page_a < page_b then + return -1 + elseif page_a > page_b then + return 1 + end + end + return 0 + end + + function sorters.index.prepare(data) + sorters.prepare(data,sorters.splitters.utf,3) + end + + function sorters.index.sort(data) + sorters.sort(data,sorters.index.compare) + end + + function sorters.index.unique(data) + sorters.unique(data) + end + + function sorters.index.cleanup(data) + sorters.cleanup(data) + end + + function sorters.index.finalize(data) + local split = { } + for k,v in ipairs(data) do + local entry, tag = v[2][1][3][1], "" + local se = sorters.entries[sorters.language] + if se and se[entry] then + if type(se[entry]) == "number" then + entry = se[entry] + end + tag = se[entry] + else + entry = 0 + tag = "unknown" + end + split[entry] = split[entry] or { tag = tag, data = { } } + split[entry].data[#split[entry].data+1] = v + end + return split + end + +--~ local template = { +--~ page = "\\pageentry{%s}{%s}{%s}{%s}", +--~ start = { +--~ [0] = "\\startletter{%s}", +--~ [1] = "\\startentry{%s}", +--~ [2] = "\\startsubentry{%s}", +--~ [3] = "\\startsubsubentry{%s}" +--~ }, +--~ stop = { +--~ [0] = "\\stopletter", +--~ [1] = "\\stopentry", +--~ [2] = "\\stopsubentry", +--~ [3] = "\\stopsubsubentry" +--~ } +--~ } + +--~ function sorters.index.flush(sorted,class,flush) +--~ flush = flush or print +--~ class = class or 'index' +--~ local function flushpage(v) +--~ flush(string.format(template.page,v[2],v[3] or "",v[4] or "",v[5] or "")) +--~ end +--~ for _,v in ipairs(table.sortedkeys(sorted)) do +--~ local s = sorted[v] +--~ flush(string.format(template.start[0],s.tag)) +--~ local done = { false, false, false } +--~ for kk,vv in ipairs(s.data) do +--~ if vv[1][1] then +--~ local e = { false, false, false } +--~ for i=1,3,1 do +--~ if vv[1][i] then e[i] = vv[1][i][1] end +--~ end +--~ for i=3,1,-1 do +--~ if done[i] and e[i] ~= done[i] then +--~ flush(template.stop[i]) +--~ end +--~ end +--~ for i=1,3,1 do +--~ if e[i] ~= done[i] then +--~ if e[i] and e[i] ~= "" then +--~ done[i] = e[i] +--~ flush(string.format(template.start[i],e[i])) +--~ else +--~ done[i] = false +--~ end +--~ end +--~ end +--~ flushpage(vv) +--~ end +--~ end +--~ for i=3,1,-1 do +--~ if done[i] then flush(template.stop[i]) end +--~ end +--~ flush(template.stop[0]) +--~ end +--~ end + + -- \registerpage{index}{,}{6}{2--0-0-0-0-0-0-0--1}{1} + + -- for the moment we use the old structure, some day mmiv code + -- will be different: more structure, less mess + + local template = { + page = "\\registerpage{%s}{%s}{%s}{%s}{%s}", + letter = "\\registerentry{%s}{%s}", + entry = { + "\\registerentrya{%s}{%s}", + "\\registerentryb{%s}{%s}", + "\\registerentryc{%s}{%s}", + }, + } + + function sorters.index.flush(sorted,class,flush) + flush = flush or print + class = class or 'index' + for k,v in ipairs(table.sortedkeys(sorted)) do + local s = sorted[v] + flush(string.format(template.letter,class,s.tag)) + local done = { false, false, false } + for kk,vv in ipairs(s.data) do + if vv[2][1] then + local e = { false, false, false } + for i=1,3,1 do + if vv[2][i] then + e[i] = vv[2][i][1] + end + if e[i] ~= done[i] then + if e[i] and e[i] ~= "" then + done[i] = e[i] + flush(string.format(template.entry[i],class,e[i])) + else + done[i] = false + end + end + end + if vv[1] == 'e' then + -- format reference pagespec realpage + flush(string.format(template.page,class,",",vv[4],vv[5],vv[3])) + end + end + end + end + end + + function sorters.index.process(data) + return sorters.process('index',data) + end + +end + +-- { { entry, key }, { entry, key }, { entry, key } }, kind, realpage|see, reference, pagespec + +function job.loadregister(class) + if job.registers[class] then + if not sorters.index.data[class] then + sorters.index.data[class] = { + language = 'en', + entries = { }, + flush = function(s) tex.sprint(tex.ctxcatcodes,s) end, + sorted = false, + class = class + } + local entries = sorters.index.data[class].entries + for k,v in ipairs(job.registers[class]) do + if v[1] == 'l' then -- language + sorters.index.data[class].language = v[2] + else + local key, entry = v[3], v[4] + if type(entry) == 'string' then + entry = entry:splitchr('+') + end + if type(key) == 'string' then + key = key:splitchr('+') + end + entries[#entries+1] = { + v[1], -- kind (e, f, t, s) + { + { entry[1] or "", key[1] or "" }, + { entry[2] or "", key[2] or "" }, + { entry[3] or "", key[3] or "" } + }, + v[6], -- realpage or seeword (check see) + v[2], -- reference + v[5], -- pagespec + } + end + end + end + -- maybe we should also save the register result stream + sorters.index.process(sorters.index.data[class]) + end +end diff --git a/tex/context/base/core-reg.mkiv b/tex/context/base/core-reg.mkiv new file mode 100644 index 000000000..d7dc9a9cb --- /dev/null +++ b/tex/context/base/core-reg.mkiv @@ -0,0 +1,57 @@ +%D \module +%D [ file=core-reg, +%D version=2007.05.07, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Register Management, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\registerctxluafile{core-reg}{1.001} + +\appendtoks + \immediatewriteutilitytua{if not job.registers then job.registers = { } end}% + \immediatewriteutilitytua{local jr = job.registers}% +\to \everyopenutilities + +\let\allregisters\empty + +\appendtoks + \processcommacommand[\allregisters]\mkdodefineregister + \globallet\allregisters\empty +\to \everyopenutilities + +\def\mkdodefineregister#1% class + {\ctxlua{job.defineregister('#1')}% + \immediatewriteutilitytua{job.defineregister('#1')}} + +\def\mkdefineregister#1% class + {\mkdodefineregister{#1}% + \doglobal\addtocommalist{#1}\allregisters} + +\def\mksaveregisterentry#1#2#3#4#5#6#7% class type reference key entry pagespec realpage + {\expanded{\writeutilitytua{table.insert(jr['#1'],{'#2','#3',\!!bs#4\!!es,\!!bs#5\!!es,'#6','#7'})}}} + +\def\mksaveregistersee#1#2#3#4#5#6#7% class type reference key entry see pagespec + {\expanded{\writeutilitytua{table.insert(jr['#1'],{'#2','#3',\!!bs#4\!!es,\!!bs#5\!!es,'#6','#7'})}}} + +\def\mksaveregistervariable#1#2#3% class type value + {\expanded{\immediatewriteutilitytua{table.insert(jr['#1'],{'#2','#3'})}}} + +% Beware, we have no filename support here. For that we need to save the resulting +% tex code in a file. No big deal. + +\def\mkloadregister#1% class, todo: loader macro just like mkii + {\bgroup + \getvalue{\s!set#1}% + \ctxlua{job.loadregister('#1')}\par % par needed for hanging indentation + \getvalue{\s!reset#1}% + \egroup} + +\protect \endinput diff --git a/tex/context/base/core-sec.tex b/tex/context/base/core-sec.tex index 467b0cf50..b92fbb21c 100644 --- a/tex/context/base/core-sec.tex +++ b/tex/context/base/core-sec.tex @@ -1416,6 +1416,9 @@ \def\headparameter#1% to do: everywhere in core-sec {\executeifdefined{\??ko\currenthead#1}\empty} +% todo: write to list etc in both args or in enclosing h/vbox else it gets +% lost when no #1 or #2 is typeset + \def\dodododoconstructhead#1[#2]#3#4% [ref] {number} {title} {\def\currenthead{#1}% dus #1 overal vervangen \let\finalsectionnumber\dofinalsectionnumber % overloaded ungrouped -) diff --git a/tex/context/base/core-spa.lua b/tex/context/base/core-spa.lua new file mode 100644 index 000000000..c6090ab13 --- /dev/null +++ b/tex/context/base/core-spa.lua @@ -0,0 +1,526 @@ +if not modules then modules = { } end modules ['core-spa'] = { + version = 1.001, + comment = "companion to core-spa.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +do + + local glyph, disc, kern, glue, hlist, vlist = node.id('glyph'), node.id('disc'), node.id('kern'), node.id('glue'), node.id('hlist'), node.id('vlist') + + local kernnode = node.new('kern') + local stretch = attributes.numbers['kern-chars'] or 141 + + function nodes.kern_chars(head) + local fti, scale, has_attribute = fonts.tfm.id, tex.scale, node.has_attribute + local fnt, pchar, pfont, p, n = nil, nil, nil, nil, head +-- local marks = fti[font].shared.otfdata.luatex.marks + while n do + local id = n.id + local extra = has_attribute(n,stretch) + if id == glyph then + if pfont == n.font then + -- check for mark + local tchar = n.char +-- if not marks[tchar] then + local pdata = fti[pfont].characters[pchar] + local pkern = pdata.kerns + if pkern and pkern[tchar] then + local k = node.copy(kernnode) + if extra then + k.kern = pkern[tchar] + extra + if p.id == disc then + p.replace = p.replace + 1 + end + else + k.kern = pkern[tchar] + end + k.attr = n.attr + k.next = p.next + p.next = k + elseif extra then + local k = node.copy(kernnode) + k.kern = extra + k.attr = n.attr + k.next = p.next + p.next = k + if p.id == disc then + p.replace = p.replace + 1 + end +-- end + end + else + pfont, pchar = n.font, n.char + end + elseif id == disc then + local pre, post = n.pre, n.post + if pre then + local nn, pp = p.prev, p.next + p.prev, p.next = nil, pre -- hijack node + pre = nodes.kern_chars(p) + pre = pre.next + pre.prev = nil + p.prev, p.next = nn, pp + n.pre = pre + end + if post and n.next then + local tail = node.slide(post) + local nn, pp = n.next.prev, n.next.next + n.next.next, n.next.prev = nil, tail + tail.next = n.next -- hijack node + post = nodes.kern_chars(post) + tail.next = nil + n.next.prev, n.next.next = nn, pp + n.post = post + end + if n.next and n.next.id == glyph then + local tchar = n.next.char + local pdata = fti[pfont].characters[pchar] + local pkern = pdata.kerns + if pkern and pkern[tchar] then + local k = node.copy(kernnode) + if extra then + k.kern = pkern[tchar] + extra + else + k.kern = pkern[tchar] + end + k.attr = n.attr + k.next = n.next + n.next = k + n.replace = n.replace + 1 + n = n.next + end + end + else + pfont = nil + if extra then + if id == glue and n.subtype == 0 then + local g = n.spec + if g.width > 0 then + g = node.copy(g) + n.spec = g + local w = g.width + g.width = w + 2*extra + local f = g.width/w + g.stretch = scale(g.stretch,f) + g.shrink = scale(g.shrink, f) + end + elseif id == kern and n.subtype == 0 then + if n.width > 0 then + n.width = n.width + extra + end + elseif id == hlist or id == vlist then + if n.width > 0 then -- else parindent etc + if p then + local k = node.copy(kernnode) + k.kern = extra + k.attr = n.attr + k.next = n + k.prev = p + p.next = k + n.prev = k + end + if n.next then + local k = node.copy(kernnode) + k.kern = extra + k.attr = n.attr + k.next = n.next + k.prev = n + n.prev = k + n.next = k + p = k + n = n.next + end + end + end + end + end + n.prev = p + p = n + n = n.next + end + return head, p + end + +end + +-- vertical space handler + +nodes.snapvalues = { } + +function nodes.setsnapvalue(n,ht,dp) + nodes.snapvalues[n] = { ht, dp, ht+dp } +end + +do + + nodes.trace_collapse = false + + local kern, glue, penalty, hlist = node.id('kern'), node.id('glue'), node.id('penalty'), node.id('hlist') + + local penalty_node = node.new('penalty') + + local has_attribute = node.has_attribute + local has_field = node.has_field + + local trace_list = { } + + local function reset_tracing() + trace_list = { } + end + local function trace_skip(str,sc,so,sp,data) + trace_list[#trace_list+1] = string.format("%s %8s %8s %8s %8s", str:padd(8), data.spec.width, sc or "-", so or "-", sp or "-") + end + local function trace_done(str,data) + if data.id == penalty then + trace_list[#trace_list+1] = string.format("%s %8s penalty", str:padd(8), data.penalty) + else + trace_list[#trace_list+1] = string.format("%s %8s glue", str:padd(8), data.spec.width) + end + end + local function show_tracing() + texio.write_nl(table.concat(trace_list,"\n")) + end + + -- we assume that these are defined + + local skip_category = attributes.numbers['skip-category'] or 101 + local skip_penalty = attributes.numbers['skip-penalty'] or 102 + local skip_order = attributes.numbers['skip-order'] or 103 + local snap_category = attributes.numbers['snap-category'] or 111 + local display_math = attributes.numbers['display-math'] or 121 + + -- alignment box begin_of_par vmode_par hmode_par insert penalty before_display after_display + + function nodes.is_display_math(head) + n = head.prev + while n do + local id = n.id + if id == penalty then + elseif id == glue then + if n.subtype == 6 then + return true + end + else + break + end + n = n.prev + end + n = head.next + while n do + local id = n.id + if id == penalty then + elseif id == glue then + if n.subtype == 7 then + return true + end + else + break + end + n = n.next + end + return false + end + + -- helpers + + function nodes.snapline(current,where) + local sn = has_attribute(current.list,snap_category) + if sn then + local sv = nodes.snapvalues[sn] + if sv then + local height, depth, lineheight = sv[1], sv[2], sv[3] + current.height = math.ceil((current.height-height)/lineheight)*lineheight + height + current.depth = math.ceil((current.depth -depth )/lineheight)*lineheight + depth + end + end + end + + function collapser(head,where) + if head then + local trace = nodes.trace_collapse + local current, tail = head, nil + local glue_order, glue_data = 0, nil + local penalty_order, penalty_data, natural_penalty = 0, nil, nil + if trace then reset_tracing() end + while current do + local id = current.id + if id == glue and current.subtype == 0 then -- todo, other subtypes, like math + local sc = has_attribute(current,skip_category) + local so = has_attribute(current,skip_order ) or 1 + local sp = has_attribute(current,skip_penalty ) + if not sc then + if glue_data then + if trace then trace_done("before",glue_data) end + head, current = nodes.before(head,current,glue_data) + end + if trace then trace_skip("natural",sc,so,sp,current) end + glue_order, glue_data = 0, nil + current = current.next + elseif sc < 1 or sc > 4 then -- 0 = discard, > 3 = unsupported + if trace then trace_skip("ignore",sc,so,sp,current) end + head, current = nodes.remove(head, current, true) + else + if sp then + if not penalty_data then + penalty_data = sp + elseif penalty_order < so then + penalty_order, penalty_data = so, sp + elseif penalty_order == so and sp > penalty_data then + penalty_data = sp + end + end + if not glue_data then + if trace then trace_skip("assign",sc,so,sp,current) end + glue_order = so + head, current, glue_data = nodes.remove(head, current) + elseif glue_order < so then + if trace then trace_skip("force",sc,so,sp,current) end + glue_order = so + node.free(glue_data) + head, current, glue_data = nodes.remove(head, current) + elseif glue_order == so then + if sc == 1 then + if current.spec.width > glue_data.spec.width then + if trace then trace_skip("larger",sc,so,sp,current) end + node.free(glue_data) + head, current, glue_data = nodes.remove(head, current) + else + if trace then trace_skip("smaller",sc,so,sp,current) end + head, current = nodes.remove(head, current, true) + end + elseif sc == 2 then + if trace then trace_skip("force",sc,so,sp,current) end + node.free(glue_data) + head, current, glue_data = nodes.remove(head, current) + elseif sc == 3 then + if trace then trace_skip("penalty",sc,so,sp,current) end + node.free(glue_data) + head, current = nodes.remove(head, current, true) + elseif sc == 4 then + if trace then trace_skip("add",sc,so,sp,current) end + local old, new = glue_data.spec, current.spec + old.width = old.width + new.width + old.stretch = old.stretch + new.stretch + old.shrink = old.shrink + new.shrink + head, current = nodes.remove(head, current, true) + else + if trace then trace_skip("unknown",sc,so,sp,current) end + head, current = nodes.remove(head, current, true) + end + else + if trace then trace_skip("unknown",sc,so,sp,current) end + head, current = nodes.remove(head, current, true) + end + end + -- elseif id == penalty then + -- natural_penalty = current.penalty + -- head, current = nodes.remove(head, current, true) + elseif id == glue and current.subtype == 2 then + local sn = has_attribute(current,snap_category) + if sn then + -- local sv = nodes.snapvalues[sn] + -- if sv then + head, current = nodes.remove(head, current, true) + -- else + -- current = current.next + -- end + else + current = current.next + end + else + if glue_data then + head, current = nodes.before(head,current,glue_data) + if trace then trace_done("before",glue_data) end + glue_order, glue_data = 0, nil + end + if id == hlist and where == 'hmode_par' and current.list then + nodes.snapline(current,where) -- will be inline later + end + current = current.next + end + tail = current + end + -- if natural_penalty and (not penalty_data or natural_penalty > penalty_data) then + -- penalty_data = natural_penalty + -- end + if penalty_data then + local p = node.copy(penalty_node) + p.penalty = penalty_data + if trace then trace_done("before",p) end + head, head = nodes.before(head,head,p) + end + if glue_data then + if trace then trace_done("after",glue_data) end + head, tail = nodes.after(head,tail,glue_data) + end + if trace then show_tracing() end + end + return head + end + + local head, tail = nil, nil + + function nodes.flush_vertical_spacing() + input.start_timing(nodes) + if head then + t = collapser(head) + head = nil + -- tail = nil + else + t = nil + end + input.stop_timing(nodes) + return t + end + + function nodes.handle_page_spacing(t, where) + -- we need to add the latest t too, else we miss skips and such + if t then + local tt = node.slide(t) + local id = tt.id + if id == glue then -- or id == penalty then -- or maybe: if not hlist or vlist + if head then + t.prev = tail + tail.next = t + else + head = t + end + tail = tt + t = nil + else + input.start_timing(nodes) + if head then + t.prev = tail + tail.next = t + -- tail = tt + t = collapser(head,where) + head = nil + -- tail = nil + else + t = collapser(t,where) + end + input.stop_timing(nodes,where) + end + end + return t + end + + function nodes.handle_vbox_spacing(t) + local tail = node.slide(t) + return collapser(t,'whole') + end + +end + +-- experimental! + +callback.register('vpack_filter', nodes.handle_vbox_spacing) +callback.register('buildpage_filter', nodes.handle_page_spacing) + +-- educational: snapper + +--~ function demo_snapper(head,where) -- snap_category 105 / nodes.snapvalue = { [1] = { 8*65536, 4*65536, 12*65536 } } +--~ if head then +--~ local current, tail, dummy = head, nil, nil +--~ while current do +--~ local id = current.id +--~ if id == glue and current.subtype == 2 then +--~ local sn = has_attribute(current,snap_category) +--~ if sn then +--~ local sv = nodes.snapvalues[sn] +--~ if sv then +--~ head, current, dummy = node.delete(head, current) +--~ node.free(dummy) +--~ else +--~ current = current.next +--~ end +--~ else +--~ current = current.next +--~ end +--~ else +--~ if id == hlist and where == 'hmode_par' and current.list then +--~ local sn = has_attribute(current.list,snap_category) +--~ if sn then +--~ local sv = nodes.snapvalues[sn] +--~ if sv then +--~ local height, depth, lineheight = sv[1], sv[2], sv[3] +--~ current.height = math.ceil((current.height-height)/lineheight)*lineheight + height +--~ current.depth = math.ceil((current.depth -depth )/lineheight)*lineheight + depth +--~ end +--~ end +--~ end +--~ current = current.next +--~ end +--~ tail = current +--~ end +--~ end +--~ return head +--~ end + +--~ callback.register('buildpage_filter', demo_snapper) + + --~ function nodes.kern_chars(head) + --~ local fti = fonts.tfm.id + --~ local fnt, pchar, pfont, p, n = nil, nil, nil, nil, head + --~ while n do + --~ local id = n.id + --~ if id == glyph then + --~ if pfont == n.font then + --~ local tchar = n.char + --~ local pdata = fti[pfont].characters[pchar] + --~ local pkern = pdata.kerns + --~ if pkern and pkern[tchar] then + --~ local k = node.copy(kernnode) + --~ k.kern = pkern[tchar] + --~ k.attr = n.attr + --~ k.next = p.next + --~ p.next = k + --~ -- texio.write_nl(string.format("KERN = %s %s %s",utf.char(pchar), utf.char(tchar), pkern[tchar])) + --~ end + --~ else + --~ pfont, pchar = n.font, n.char + --~ end + --~ elseif id == disc then + --~ if pre then + --~ local nn, pp = p.prev, p.next + --~ p.prev, p.next = nil, pre -- hijack node + --~ pre = nodes.kern_chars(p) + --~ pre = pre.next + --~ pre.prev = nil + --~ p.prev, p.next = nn, pp + --~ n.pre = pre + --~ end + --~ if post then + --~ local tail = node.slide(post) + --~ local nn, pp = n.next.prev, n.next.next + --~ n.next.next, n.next.prev = nil, tail + --~ tail.next = n.next -- hijack node + --~ post = nodes.kern_chars(post) + --~ tail.next = nil + --~ n.next.prev, n.next.next = nn, pp + --~ n.post = post + --~ end + --~ local tchar = n.next.char + --~ local pdata = fti[pfont].characters[pchar] + --~ local pkern = pdata.kerns + --~ if pkern and pkern[tchar] then + --~ local k = node.copy(kernnode) + --~ k.kern = pkern[tchar] + --~ k.attr = n.attr + --~ k.next = n.next + --~ n.next = k + --~ n.replace = n.replace + 1 + --~ n = n.next + --~ end + --~ else + --~ pfont = nil + --~ end + --~ n.prev = p + --~ p = n + --~ n = n.next + --~ end + --~ return head, p + --~ end diff --git a/tex/context/base/core-spa.mkiv b/tex/context/base/core-spa.mkiv new file mode 100644 index 000000000..03d3c5595 --- /dev/null +++ b/tex/context/base/core-spa.mkiv @@ -0,0 +1,126 @@ +%D \module +%D [ file=core-spa, +%D version=1997.03.31, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Spacing, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Context Core Macros / Buffers} + +\unprotect + +% category: +% +% 0 == discard +% 1 == only if larger +% 2 == force even if smaller +% 3 == only take penalty component +% 4 == add to existing skip + +% penalty: +% +% larger wins + +% order: +% +% larger wins + +\defineattribute[kern-chars] + +\defineattribute[skip-category] +\defineattribute[skip-penalty] +\defineattribute[skip-order] + +\defineattribute[snap-category] + +\defineattribute[display-math] + +\registerctxluafile{core-spa}{1.001} + +% \start \dosetstretch{.25em} \setuptolerance[tolerant,stretch] \input tufte \endgraf \stop +% \start \dosetstretch{.5em} effe flink doorfietsen \stop + +\def\dosetstretch#1% to be interfaces + {\relax\ifdim#1>\zeropoint + \dosetattribute{kern-chars}{\number\dimexpr#1\relax}% + \else + \doresetattribute{kern-chars}% + \fi} + +\appendtoks\doresetattribute{kern-chars}\to\everyforgetall + +\def\mksetupgridsnapping + {\ctxlua{nodes.setsnapvalue(1,\number\openstrutheight,\number\openstrutdepth)}} + +\def\mkenablegridsnapping + {\dosetattribute{snap-category}{1}% + \topskip\strutht + \offinterlineskip} + +\def\mkdisablegridsnapping + {\doresetattribute{snap-category}% + % reset topskip + \oninterlineskip} + +\protect \endinput + +\starttext + +\dorecurse{2}{ + $2^{2^{2^{2}}}$ $2_{2_{2_{2}}}^{2^{2^{2^{2^{2^{2^{2^{2^{2}}}}}}}}}$ + \input tufte \inframed {tufte} + \par +} + +\dorecurse{100} { + + \kern \recurselevel pt + + \vbox { + \endgraf \strut first \endgraf + {\dosetattribute{skip-category}{1}\vskip10pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip20pt} + {\dosetattribute{skip-category}{2}\vskip10pt} + \endgraf \strut second \endgraf + } + + \endgraf \strut first \endgraf + {\dosetattribute{skip-category}{1}\vskip10pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip20pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + \endgraf \strut second \endgraf + + {\dosetattribute{skip-category}{0}\vskip10pt} % remove + {\dosetattribute{skip-category}{1}\vskip10pt} % take largest + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\vskip40pt} + {\dosetattribute{skip-category}{1}\dosetattribute{skip-order}{10}\vskip20pt} + {\dosetattribute{skip-category}{4}\dosetattribute{skip-order}{10}\vskip20pt} + {\dosetattribute{skip-category}{1}\vskip60pt} + {\dosetattribute{skip-category}{1}\vskip20pt} + {\dosetattribute{skip-category}{0}\vskip10pt} + + third (no break after this) + + {\dosetattribute{skip-category}{1}\dosetattribute{skip-penalty}{100000}\vskip10pt} + {\dosetattribute{skip-category}{1}\dosetattribute{skip-penalty}{100000}\vskip20pt} + {\dosetattribute{skip-category}{1}\vskip10pt} + {\dosetattribute{skip-category}{1}\vskip20pt} + + fourth + \vskip10pt + fifth +} + +\stoptext diff --git a/tex/context/base/core-syn.lua b/tex/context/base/core-syn.lua new file mode 100644 index 000000000..fc7b72b5d --- /dev/null +++ b/tex/context/base/core-syn.lua @@ -0,0 +1,116 @@ +-- filename : core-syn.lua +-- comment : companion to core-syn.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['core-syn'] = 1.001 +if not jobs then jobs = { } end +if not job then jobs['main'] = { } end job = jobs['main'] +if not job.sortedlists then job.sortedlists = { } end + +function job.definesortedlist(id) + if not job.sortedlists[id] then + job.sortedlists[id] = { } + end +end + +sorters = sorters or { } +sorters.list = sorters.list or { } +sorters.list.data = sorters.list.data or { } + +do + + function sorters.list.compare(a,b) + return sorters.comparers.basic(a,b,1) + end + + function sorters.list.prepare(data) + sorters.prepare(data,sorters.splitters.utf,1) + end + + function sorters.list.sort(data) + sorters.sort(data,sorters.list.compare) + end + + function sorters.list.unique(data) + sorters.unique(data) + end + + function sorters.list.cleanup(data) + sorters.cleanup(data) + end + + function sorters.list.finalize(data) + -- we use the same splitter as with indices + local split = { } + for k,v in ipairs(data) do + local entry, tag = v[2][1][3][1], "" + local se = sorters.entries[sorters.language] + if se and se[entry] then + if type(se[entry]) == "number" then + entry = se[entry] + end + tag = se[entry] + else + entry = 0 + tag = "unknown" + end + split[entry] = split[entry] or { tag = tag, data = { } } + split[entry].data[#split[entry].data+1] = v + end + return split + end + + -- for the moment we use the old structure, some day mmiv code + -- will be different: more structure, less mess + + local template = { + entry = "\\synonymentry{%s}{%s}{%s}{%s}" + } + + function sorters.list.flush(sorted,class,flush) + -- for the moment we don't add split data (letters) yet + flush = flush or print + class = class or 'abbreviation' + for k,v in ipairs(table.sortedkeys(sorted)) do + for _, vv in ipairs(sorted[v].data) do + flush(string.format(template.entry,class,vv[2][1][1],vv[2][1][2],vv[3])) + end + end + end + + function sorters.list.process(data) + return sorters.process('list',data) + end + +end + +-- { { entry, key } }, meaning + +function job.loadsortedlist(class) + if job.sortedlists[class] then + if not sorters.list.data[class] then + sorters.list.data[class] = { + language = 'en', + entries = { }, + flush = function(s) tex.sprint(tex.ctxcatcodes,s) end, + sorted = false, + class = class + } + local entries = sorters.list.data[class].entries + for k,v in ipairs(job.sortedlists[class]) do + if v[1] == 'l' then -- language + sorters.list.data[class].language = v[2] + else + entries[#entries+1] = { + v[1], -- kind (e) + { { v[3], v[2] } }, -- entry, key + v[4] -- optional meaning + } + end + end + end + sorters.list.process(sorters.list.data[class]) + end +end diff --git a/tex/context/base/core-syn.mkiv b/tex/context/base/core-syn.mkiv new file mode 100644 index 000000000..8996940dd --- /dev/null +++ b/tex/context/base/core-syn.mkiv @@ -0,0 +1,51 @@ +%D \module +%D [ file=core-syn, +%D version=1997.03.31, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Synonyms and Sorts, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\registerctxluafile{core-syn}{1.001} + +\appendtoks + \immediatewriteutilitytua{if not job.sortedlists then job.sortedlists = { } end}% + \immediatewriteutilitytua{local js = job.sortedlists}% +\to \everyopenutilities + +\let\allsortedlists\empty + +\appendtoks + \processcommacommand[\allsortedlists]\mkdodefinesortedlist + \globallet\allsortedlists\empty +\to \everyopenutilities + +\def\mkdodefinesortedlist#1% class + {\ctxlua{job.definesortedlist('#1')}% + \immediatewriteutilitytua{job.definesortedlist('#1')}} + +\def\mkdefinesortedlist#1% class + {\mkdodefinesortedlist{#1}% + \doglobal\addtocommalist{#1}\allsortedlists} + +\def\mksavesortedlistentry#1#2#3#4% class key entry meaning + {\immediatewriteutilitytua{table.insert(js['#1'],{'e','#1',\!!bs#2\!!es,\!!bs#3\!!es})}} + +\def\mksavesortedlistvariable#1#2#3% class type value + {\immediatewriteutilitytua{table.insert(js['#1'],{'#2','#3'})}} + +\def\mkloadsortedlist#1% class + {\bgroup + \getvalue{\s!set#1}% + \ctxlua{job.loadsortedlist('#1')}% + \getvalue{\s!reset#1}% + \egroup} + +\protect \endinput diff --git a/tex/context/base/core-sys.mkiv b/tex/context/base/core-sys.mkiv new file mode 100644 index 000000000..0cef6c236 --- /dev/null +++ b/tex/context/base/core-sys.mkiv @@ -0,0 +1,23 @@ +%D \module +%D [ file=core-sys, +%D version=2006.09.18, +%D title=\CONTEXT\ Core Macros, +%D subtitle=System, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\startruntimeluacode + \ctxlua { + environment.inputfilename = "\inputfilename" + environment.outputfilename = "\outputfilename" + environment.jobfilename = "\jobfilename" + environment.jobfilesuffix = "\jobfilesuffix" + } +\stopruntimeluacode + +\endinput diff --git a/tex/context/base/core-two.lua b/tex/context/base/core-two.lua new file mode 100644 index 000000000..45f1d0f46 --- /dev/null +++ b/tex/context/base/core-two.lua @@ -0,0 +1,83 @@ +if not modules then modules = { } end modules ['core-two'] = { + version = 1.001, + comment = "companion to core-two.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

We save multi-pass information in the main utility table.

+--ldx]]-- + +if not jobs then jobs = { } end +if not job then jobs['main'] = { } end job = jobs['main'] +if not job.twopass then job.twopass = { } end + +function job.definetwopassdata(id) + job.twopass[id] = job.twopass[id] or { } +end + +function job.gettwopassdata(id) + local jti = job.twopass[id] + if jti and #jti > 0 then + tex.print(jti[1]) + table.remove(jti,1) + end +end + +function job.checktwopassdata(id) + local jti = job.twopass[id] + if jti and #jti > 0 then + tex.print(jti[1]) + end +end + +function job.getfromtwopassdata(id,n) + local jti = job.twopass[id] + if jti and jti[n] then + tex.print(jti[n]) + end +end + +job.findtwopassdata = job.getfromtwopassdata +job.getfirstpassdata = job.checktwopassdata + +function job.getlasttwopassdata(id) + local jti = job.twopass[id] + if jti and #jti > 0 then + tex.print(jti[#jti]) + end +end + +function job.noftwopassitems(id) + local jti = job.twopass[id] + if jti then + tex.print(#jti) + else + tex.print('0') + end +end + +function job.twopassdatalist(id) + local jti = job.twopass[id] + if jti then + tex.print(table.concat(jti,',')) + end +end + +function job.doifelseintwopassdata(id,str) + local jti = job.twopass[id] + if jti then + local found = false + for _, v in pairs(jti) do + if v == str then + found = true + break + end + end + cs.testcase(found) + else + cs.testcase(false) + end +end diff --git a/tex/context/base/core-two.mkiv b/tex/context/base/core-two.mkiv new file mode 100644 index 000000000..bbe00be92 --- /dev/null +++ b/tex/context/base/core-two.mkiv @@ -0,0 +1,74 @@ +%D \module +%D [ file=core-two, % moved from core-uti +%D version=2006.09.24, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Two Pass Data, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\registerctxluafile{core-two}{1.001} + +\appendtoks + \immediatewriteutilitytua{if not job.twopass then job.twopass = { } end}% + \immediatewriteutilitytua{local tp = job.twopass}% +\to \everyopenutilities + +\def\immediatesavetwopassdata #1#2#3{\expanded{\immediatewriteutilitytua{table.insert(tp['#1'],"#3")}}} +\def\savetwopassdata #1#2#3{\expanded{\writeutilitytua {table.insert(tp['#1'],"#3")}}} +\def\immediatesavetaggedtwopassdata#1#2#3#4{\expanded{\immediatewriteutilitytua{tp['#1']['#3']="#4"}}} +\def\savetaggedtwopassdata #1#2#3#4{\expanded{\writeutilitytua {tp['#1']['#3']="#4"}}} + +% temp hack: needs a proper \starteverytimeluacode + +\def\dodefinetwopasslist#1% + {\ctxlua{job.definetwopassdata('#1')}% + \immediatewriteutilitytua{job.definetwopassdata('#1')}} + +\def\definetwopasslist#1% + {\dodefinetwopasslist{#1}% + \doglobal\addtocommalist{#1}\alltwopasslists} + +\appendtoks + \processcommacommand[\alltwopasslists]\dodefinetwopasslist + \globallet\alltwopasslists\empty +\to \everyopenutilities + +\def\testtwopassdata + {\ifx\twopassdata\empty\twopassdatafoundfalse\else\twopassdatafoundtrue\fi} + +\def\gettwopassdata#1% + {\edef\twopassdata{\ctxlua{job.gettwopassdata("#1")}}\testtwopassdata} + +\def\checktwopassdata#1% + {\edef\twopassdata{\ctxlua{job.checktwopassdata("#1")}}\testtwopassdata} + +\def\findtwopassdata#1#2% + {\edef\twopassdata{\ctxlua{job.findtwopassdata("#1","#2")}}\testtwopassdata} + +\let\getfirsttwopassdata\checktwopassdata + +\def\getlasttwopassdata#1% + {\edef\noftwopassitems{\ctxlua{job.noftwopassitems("#1")}}% + \edef\twopassdata {\ctxlua{job.getlasttwopassdata("#1")}}% + \testtwopassdata} + +\def\getfromtwopassdata#1#2% + {\edef\twopassdata{\ctxlua{job.getfromtwopassdata("#1",#2)}}\testtwopassdata} + +\def\gettwopassdatalist + {\getnamedtwopassdatalist\twopassdatalist} + +\def\getnamedtwopassdatalist#1#2% \cs tag + {\edef#1{\ctxlua{job.twopassdatalist("#2")}}} + +\def\doifelseintwopassdata#1#2% tag dat + {\ctxlua{job.doifelseintwopassdata("#1","#2"))}} + +\protect \endinput diff --git a/tex/context/base/core-uti.lua b/tex/context/base/core-uti.lua new file mode 100644 index 000000000..00811e528 --- /dev/null +++ b/tex/context/base/core-uti.lua @@ -0,0 +1,29 @@ +if not modules then modules = { } end modules ['core-uti'] = { + version = 1.001, + comment = "companion to core-uti.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

A utility file has always been part of and with +the move to we also moved a lot of multi-pass info +to a table. Instead of loading a based +utility file under different setups, we now load a table once. This +saves much runtime but at the cost of more memory usage.

+--ldx]]-- + +if not jobs then jobs = { } end +if not job then jobs['main'] = { } end job = jobs['main'] +if not job.variables then job.variables = { } end + +--[[ldx-- +

Variables are saved using in the previously defined table and passed +onto using the following method. Of course one can also +directly access the variable using a call.

+--ldx]]-- + +function job.initializevariable(cs,value) + tex.sprint("\\xdef\\"..cs.."{"..value.."}") +end diff --git a/tex/context/base/core-uti.mkiv b/tex/context/base/core-uti.mkiv new file mode 100644 index 000000000..6883f2227 --- /dev/null +++ b/tex/context/base/core-uti.mkiv @@ -0,0 +1,103 @@ +%D \module +%D [ file=core-uti, +%D version=2006.09.19, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Utility File Handling, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\registerctxluafile{core-uti}{1.001} + +%D We need a way to pass strings safely to \LUA\ without the +%D need for tricky escaping. Compare: +%D +%D \starttyping +%D \ctxlua {something("anything tricky can go here")} +%D \ctxlua {something([\luastringsep[anything tricky can go here]\luastringsep])} +%D \stoptyping + +\def\luastringsep{===} % this permits \typefile{self} otherwise nested b/e sep problems + +\edef\!!bs{[\luastringsep[} +\edef\!!es{]\luastringsep]} + +%D We have a the following available as primitive so there is no need +%D for it: +%D +%D \starttyping +%D \long\edef\luaescapestring#1{\!!bs#1\!!es} +%D \stoptyping + +%D Next we implement a few helpers: + +\newwrite\utility@tua + +\prependtoks + \def \writeutilitytua {\write\utility@tua} + \def\immediatewriteutilitytua{\immediate\write\utility@tua} +\to \everyjob + +\let \writeutilitytua\gobbleoneargument +\let\immediatewriteutilitytua\gobbleoneargument + +\appendtoks + \immediate\openout\utility@tua=\jobname.tua + \immediatewriteutilitytua{-- file\space\space\space: \jobname}% + \immediatewriteutilitytua{-- format\space: \contextformat}% + \immediatewriteutilitytua{-- stamp\space\space: \contextversion}% + \immediatewriteutilitytua{-- escape\space: \!!bs\space...\space\!!es}% + \immediatewriteutilitytua{-- version: \utilityversion}% + \immediatewriteutilitytua{}% + \immediatewriteutilitytua{do}% + \immediatewriteutilitytua{if job and job.version and not job.version == "\utilityversion" then return end}% + \immediatewriteutilitytua{if not job then job = { } end}% + \immediatewriteutilitytua{job.version = "\utilityversion"}% +\to \everyopenutilities + +\appendtoks + \immediatewriteutilitytua{end}% + %immediate\closeout\utility@tua +\to \everycloseutilities + +% The next file can be in lua or luc format: + +\appendtoks + \ctxlua { do + if not job then job = { } end + job.version = "\utilityversion" + local settings = loadfile("\jobname.tuc") + if settings then settings() end + end}% +\to \everyjob + +% variables + +\appendtoks + \immediatewriteutilitytua{if not job.variables then job.variables = { } end}% +\to \everyopenutilities + +\def\savecurrentvalue#1#2% + {\immediatewriteutilitytua{job.initializevariable("\strippedcsname#1","#2")}} + +% temp + +\let\thisisbytesequence\gobbleoneargument + +% wrong place but we need to have it someplace + +\appendtoks + \ctxlua{input.storage.dump()}% +\to \everydump + +\appendtoks + \ctxlua{input.storage.finalize()}% +\to \everyfinalizeluacode + +\protect \endinput diff --git a/tex/context/base/core-ver.mkiv b/tex/context/base/core-ver.mkiv new file mode 100644 index 000000000..01e46f925 --- /dev/null +++ b/tex/context/base/core-ver.mkiv @@ -0,0 +1,207 @@ +%D \module +%D [ file=core-ver, +%D version=2000.10.13, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Verbatim, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\def\mksetupprettiesintype + {\begingroup + \lowercasestring verb-\prettyidentifier\to\filename + \doonlyonce\filename{\ctxluafileload\filename\empty}% + \endgroup} + +% todo: obeytabs|spaces|lines|pages + +\def\mksetupprettytype % todo check + {\processingverbatimtrue % will move + \ctxlua{buffers.doifelsevisualizer("\prettyidentifier")} + {\ctxlua{buffers.setvisualizer("\prettyidentifier")}% + \localcolortrue % tricky, maybe not here + \def\obs{\obeyedspace}% + \def\bop{\bgroup\beginofpretty}% + \def\eop{\endofpretty\egroup}% + \def\sop{\endofpretty\egroup\bgroup\beginofpretty}} + {\def\obs{\obeyedspace}}} + +\def\mkinitializeverbatim + {\ctxlua{buffers.visualizers.reset()}% + \def\obs{\obeyedspace}% + \verbatimfont + \obeycharacters} + +% \ctxluafileload{verb-tex}{} +% \ctxluafileload{verb-mp} {} + +% \registerctxluafile{core-buf-tex}{} +% \registerctxluafile{core-buf-mp} {} + +% \def\mktype#1% +% {\bgroup +% \begstrut % new, enables leading space in \type { abc } at par start +% \let\currenttypingclass\??ty +% \edef\currenttyping{#1}% +% \initializetype % probably too much +% \verbatimcolor +% \setcatcodetable \vrbcatcodes +% \catcode`\{=\plusone +% \catcode`\}=\plustwo +% \dodotype} + +% \def\dodotype#1% +% {\obeycharacters % everyinitializeverbatim +% \ctxlua{buffers.hooks.flush_line(\!!bs\detokenize{#1}\!!es)}% +% \egroup} + +\let\mksetupslantedtype \relax + +\def\mksetupcommandsintype% can also be \string\ + {\ctxlua{ + buffers.visualizers.enableescape = true + buffers.visualizers.escapetoken = \!!bs\typingparameter\c!escape\!!es + }% + \setevalue{\typingparameter\c!escape}{\typingparameter\c!escape}} + +\def\mktype#1% was \dotype + {\bgroup + \begstrut % new, enables leading space in \type { abc } at par start / begstrut else no hyphenation + \let\currenttypingclass\??ty + \edef\currenttyping{#1}% + \catcode`\<=\@@other + \catcode`\>=\@@other + \futurelet\next\dodotype} + +\def\dodotype + {\ifx\next\bgroup + \@EA\dodotypeA + \else\if\next<% + \doifelse{\typingparameter\c!option}\v!none + {\@EAEAEA\dodotypeB}{\@EAEAEA\dodotypeC}% + \else + \@EAEAEA\dodotypeD + \fi\fi} + +\def\dodotypeA + {\initializetype % probably too much + \verbatimcolor + \setcatcodetable \vrbcatcodes + \catcode`\{=\plusone + \catcode`\}=\plustwo + \dodotypeAA} + +\def\dodotypeAA#1% + {\mkinitializeverbatim +\def\obs{\obeyedspace}% + \ctxlua{buffers.hooks.flush_line(\!!bs\detokenize{#1}\!!es)}% + \egroup} + +\def\dodotypeB#1% + {\initializetype + \verbatimcolor + \setcatcodetable \vrbcatcodes + \catcode`\<=\plusone + \catcode`\>=\plustwo + \dodotypeBB} + +\def\dodotypeBB#1% + {\mkinitializeverbatim + \ctxlua{buffers.visualizers.flush_nested(\!!bs\detokenize{#1}\!!es,false)}% + \egroup + \gobbleoneargument} % grab last > + +\def\dodotypeC#1% + {\initializetype + \verbatimcolor + \setcatcodetable \vrbcatcodes + \catcode`\<=\plusone + \catcode`\>=\plustwo + \dodotypeCC} + +\def\dodotypeCC#1% + {\mkinitializeverbatim + \ifx\obeycharacters\setupprettytype % temp hack, we need a proper signal + \ctxlua{buffers.hooks.flush_line([\!!bs\detokenize{#1}\!!es,true)}% + \else + \def\obs{\obeyedspace}% + \ctxlua{buffers.visualizers.flush_nested(\!!bs\detokenize{#1}\!!es,true)}% + \fi + \egroup + \gobbleoneargument} % grab last > + +\def\dodotypeD#1% + {\initializetype + \verbatimcolor + \setcatcodetable \vrbcatcodes + \def\dodotypeDD##1#1{\dodotypeAA{##1}}% + \dodotypeDD} + +\def\dodotypeDD#1% + {\mkinitializeverbatim + \ctxlua{buffers.hooks.flush_line(\!!bs\detokenize{#1}\!!es,true)}% + \egroup + \gobbleoneargument} % grab last > + +% \typing: + +\def\mktypeblockverbatim#1#2% + {\dowithbuffer{_typing_}{#1}{#2} + {} + {\mkinitializeverbatim + \beginofverbatimlines + \ctxlua{buffers.type("_typing_")}% + \endofverbatimlines + \getvalue{\strippedcsname#2}}} + +% \typefile: + +\def\mktypefileverbatim + {\mkinitializeverbatim + \ctxlua{buffers.typefile("\readfilename")}} + +\def\mktypefilelinesverbatim#1#2% + {#1% + \mkinitializeverbatim + \ctxlua{buffers.typefile("\readfilename")}% + #2} + +% patched from verb-ini (todo) + +\let\beginverbatimline \relax +\let\endverbatimline \relax +\let\doopenupverbatimline\empty + +\def\doverbatimbeginofline#1% linenumber + {\bgroup % due to pretty status + \iflinepar\else\EveryPar{}\fi + \dontleavehmode % \leavevmode + \xdef\dokeepverbatimlinedata % hm, still needed? + {\parindent \the\parindent + \hangindent\the\hangindent + \hangafter \the\hangafter + \leftskip \the\leftskip + \rightskip \the\rightskip}% + \egroup + \dokeepverbatimlinedata + \doopenupverbatimline + \the\everyline\strut + \beginverbatimline} + +\def\doverbatimendofline + {\endverbatimline + \global\lineparfalse + \obeyedline\par} + +\def\doverbatimemptyline + {\strut + \par + \global\linepartrue} + +\protect \endinput diff --git a/tex/context/base/core-ver.tex b/tex/context/base/core-ver.tex index 8623dffef..259d018a6 100644 --- a/tex/context/base/core-ver.tex +++ b/tex/context/base/core-ver.tex @@ -293,7 +293,7 @@ \def\obeyhyphens {\def\obeyedspace {\hskip\interwordspace}% better than spaceskip - \def\controlspace{\hskip\zeropoint\hbox{\char32}\hskip\zeropoint}% + \def\controlspace{\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint}% \spaceskip.25em\relax} % hm a bit of stretch ! \def\obeybreakpoints @@ -302,7 +302,7 @@ \def\ignorehyphens {\def\obeyedspace {\null\hskip\interwordspace\null}% better than spaceskip - \def\controlspace{\null\hskip\zeropoint\hbox{\char32}\hskip\zeropoint\null}% + \def\controlspace{\null\hskip\zeropoint\hbox{\normalcontrolspace}\hskip\zeropoint\null}% \spaceskip.5em\relax} \unexpanded\def\typ diff --git a/tex/context/base/enco-def.tex b/tex/context/base/enco-def.tex index c111b6c44..9511f0f58 100644 --- a/tex/context/base/enco-def.tex +++ b/tex/context/base/enco-def.tex @@ -895,4 +895,20 @@ \stopencoding +%D Goodie (makes more sense): + +\def\normalcontrolspace + {\getglyph{ComputerModernMono}{\char32}} + +\def\fakedcontrolspace % can be virtual in luatex + {\dontleavehmode\hbox + {\scratchdimen.1ex% + \kern\scratchdimen + \vrule \!!width\scratchdimen \!!height5.5\scratchdimen \!!depth3\scratchdimen + \vrule \!!width\dimexpr.5em-4\scratchdimen\relax \!!height-2\scratchdimen \!!depth3\scratchdimen + \vrule \!!width\scratchdimen \!!height5.5\scratchdimen \!!depth3\scratchdimen + \kern\scratchdimen}} + +\def\fakecontrolspace{\let\normalcontrolspace\fakedcontrolspace} + \endinput diff --git a/tex/context/base/enco-ini.mkiv b/tex/context/base/enco-ini.mkiv new file mode 100644 index 000000000..a676c46aa --- /dev/null +++ b/tex/context/base/enco-ini.mkiv @@ -0,0 +1,69 @@ +%D \module +%D [ file=enco-ini, +%D version=2007.02.19, +%D title=\CONTEXT\ Encoding Macros, +%D subtitle=Initialization, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=\PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D In the end we will cleanup enco-ini.tex! + +\unprotect + +% could also be a new kind of table \definecharacter {name} {char} {fallback} + +\startruntimectxluacode + characters.context.rehash() +\stopruntimectxluacode + +\ctxlua { characters.context.define() } % redefines all \characters + +\useencoding[032,033,037] % fallbacks for some unicode chars, todo + +\setupencoding[\s!default=ec] % for the moment keep it this way, till fonts are there + +\protect \endinput + +When dealing with characters we have four cases to take into account when moving +from mkii to mkiv: + +1. => ref to slot 200 in current font +2. \char 200 => ref to slot 200 in current font +3. => can (e.g.) map to another slot in current font +4. \namedglyph => can map to some slot in some font + +Using case 2 for special characters is doomed to fail because we are not going +to intercept these on the fly as happens automatically with traditional font +encoding handling. We could do that in a node pass but it's not worth the effort +because we seldom use this case in a document source. + +We can consider using utf as internal format for mkii. The main reason for not +doing this before was that it was slow. On the other hand, it would make dealing +with utility files easier. + +These are the only cases where char references are used: + +enco-def.tex : 46 : \definecharacter dotlessi {\char"10 } +enco-def.tex : 47 : \definecharacter dotlessj {\char"11 } +enco-def.tex : 54 : \definecharacter aeligature {\char26 } % "1A +enco-def.tex : 55 : \definecharacter AEligature {\char29 } % "1D +enco-def.tex : 58 : \definecharacter oeligature {\char27 } % "1B +enco-def.tex : 59 : \definecharacter OEligature {\char30 } % "1E +enco-def.tex : 61 : \definecharacter ssharp {\char25 } % "19 +enco-def.tex : 336 : \definecharacter Lstroke {\hsmash{\char32}L} +enco-def.tex : 337 : \definecharacter lstroke {\hsmash{\char32}l} +enco-def.tex : 338 : \definecharacter Ostroke {\char31 } % "1F +enco-def.tex : 339 : \definecharacter ostroke {\char28 } % "1C +enco-il2.tex : 147 : {\dontleavehmode{\char32l}} +enco-il2.tex : 152 : \hbox to\wd0{\hss\char32L}% +symb-eur.tex : 37 : \definesymbol [euro] [\getglyph{Euro}{\char160}] +symb-glm.tex : 61 : \definesymbol [xleftguillemot] [\getglyph{Guil}{\char19}] +symb-glm.tex : 62 : \definesymbol [xrightguillemot] [\getglyph{Guil}{\char20}] +symb-glm.tex : 64 : \definesymbol [xguilsingleleft] [\getglyph{Guil}{\char14}] +symb-glm.tex : 65 : \definesymbol [xguilsingleright] [\getglyph{Guil}{\char15}] + diff --git a/tex/context/base/enco-pfr.mkiv b/tex/context/base/enco-pfr.mkiv new file mode 100644 index 000000000..2db8670f0 --- /dev/null +++ b/tex/context/base/enco-pfr.mkiv @@ -0,0 +1,20 @@ +%D \module +%D [ file=enco-pfr, +%D version=2000.12.10, % adapted 2005.08.14 to more delayed loading +%D title=\CONTEXT\ Encoding Macros, +%D subtitle=PDF Font Resource Inclusion, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\ifx\pdfglyphtounicode\undefined \else + \appendtoks + \doif\jobsuffix{pdf}{\ctxlua{characters.setpdfunicodes()}}% pdftounicode mappings can only be done runtime + \to \everystarttext +\fi + +\endinput diff --git a/tex/context/base/font-afm.lua b/tex/context/base/font-afm.lua new file mode 100644 index 000000000..7f4107386 --- /dev/null +++ b/tex/context/base/font-afm.lua @@ -0,0 +1,574 @@ +if not modules then modules = { } end modules ['font-afm'] = { + version = 1.001, + comment = "companion to font-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

Some code may look a bit obscure but this has to do with the +fact that we also use this code for testing and much code evolved +in the transition from to to .

+ +

The following code still has traces of intermediate font support +where we handles font encodings. Eventually font encoding goes +away.

+--ldx]]-- + +fonts = fonts or { } +fonts.afm = fonts.afm or { } +fonts.afm.version = 1.10 -- incrementing this number one up will force a re-cache +fonts.afm.syncspace = true -- when true, nicer stretch values +fonts.afm.enhance_data = true -- best leave this set to true +fonts.afm.trace_features = false +fonts.afm.features = { } +fonts.afm.features.aux = { } +fonts.afm.features.data = { } +fonts.afm.features.list = { } +fonts.afm.features.default = { } +fonts.afm.cache = containers.define("fonts", "afm", fonts.afm.version, true) + +--[[ldx-- +

We start with the basic reader which we give a name similar to the +built in and reader.

+--ldx]]-- + +do + + local keys = { } + + function keys.FontName (data,line) data.fullname = line:strip() end + function keys.ItalicAngle (data,line) data.italicangle = tonumber (line) end + function keys.IsFixedPitch(data,line) data.isfixedpitch = toboolean(line) end + function keys.CharWidth (data,line) data.charwidth = tonumber (line) end + function keys.XHeight (data,line) data.xheight = tonumber (line) end + function keys.Descender (data,line) data.descender = tonumber (line) end + function keys.Ascender (data,line) data.ascender = tonumber (line) end + function keys.Comment (data,line) + -- Comment DesignSize 12 (pts) + -- Comment TFM designsize: 12 (in points) + line = line:lower() + local designsize = line:match("designsize[^%d]*(%d+)") + if designsize then data.designsize = tonumber(designsize) end + end + + local function get_charmetrics(characters,charmetrics) + local characters = data.characters + local chr, str, ind = { }, "", 0 + for k,v in charmetrics:gmatch("([%a]+) +(.-) *;") do + if k == 'C' then + if str ~= "" then characters[str] = chr end + chr = { } + str = "" + v = tonumber(v) + if v < 0 then + ind = ind + 1 + else + ind = v + end + chr.index = ind + elseif k == 'WX' then + chr.wx = v + elseif k == 'N' then + str = v + elseif k == 'B' then + local llx, lly, urx, ury = v:match("^ *(.-) +(.-) +(.-) +(.-)$") + chr.boundingbox = { tonumber(llx), tonumber(lly), tonumber(urx), tonumber(ury) } + elseif k == 'L' then + local plus, becomes = v:match("^(.-) +(.-)$") + if not chr.ligatures then chr.ligatures = { } end + chr.ligatures[plus] = becomes + end + end + if str ~= "" then characters[str] = chr end + end + + local function get_kernpairs(characters,kernpairs) + local characters = data.characters + for one, two, value in kernpairs:gmatch("KPX +(.-) +(.-) +(.-)\n") do + local chr = characters[one] + if chr then + if not chr.kerns then chr.kerns = { } end + chr.kerns[two] = tonumber(value) + end + end + end + + local function get_variables(data,fontmetrics) + for key, rest in fontmetrics:gmatch("(%a+) *(.-)[\n\r]") do + if keys[key] then keys[key](data,rest) end + end + end + + function fonts.afm.read_afm(filename) + local ok, afmblob, size = input.loadbinfile(texmf.instance,filename) -- has logging + -- local ok, afmblob = true, file.readdata(filename) + if ok and afmblob then + data = { + version = version or '0', + characters = { }, + filename = file.removesuffix(file.basename(filename)) + } + afmblob = afmblob:gsub("StartCharMetrics(.-)EndCharMetrics", function(charmetrics) + get_charmetrics(data,charmetrics) + return "" + end) + afmblob = afmblob:gsub("StartKernPairs(.-)EndKernPairs", function(kernpairs) + get_kernpairs(data,kernpairs) + return "" + end) + afmblob = afmblob:gsub("StartFontMetrics%s+([%d%.]+)(.-)EndFontMetrics", function(version,fontmetrics) + data.afmversion = version + get_variables(data,fontmetrics) + return "" + end) + return data + else + return nil + end + end + +end + +--[[ldx-- +

We cache files. Caching is taken care of in the loader. We cheat a bit +by adding ligatures and kern information to the afm derived data. That +way we can set them faster when defining a font.

+--ldx]]-- + +function fonts.afm.load(filename) + local name = file.removesuffix(filename) + local data = containers.read(fonts.afm.cache,name) + if not data then + local foundname = input.find_file(texmf.instance,filename,'afm') + if foundname and foundname ~= "" then + data = fonts.afm.read_afm(foundname) + if data then + fonts.afm.unify(data,filename) + if fonts.afm.enhance_data then + fonts.afm.add_ligatures(data,'ligatures') -- easier this way + fonts.afm.add_ligatures(data,'texligatures') -- easier this way + fonts.afm.add_kerns(data) -- faster this way + end + data = containers.write(fonts.afm.cache, name, data) + end + end + end + return data +end + +function fonts.afm.unify(data, filename) + local unicode, private, unicodes = containers.content(fonts.enc.cache,'unicode').hash, 0x0F0000, { } + for name, blob in pairs(data.characters) do + local code = unicode[name] + if not code then + code = private + private = private + 1 + end + blob.unicode = code + unicodes[name] = code + end + data.luatex = { + filename = file.basename(filename), + -- version = fonts.afm.version, + unicodes = unicodes + } +end + +--[[ldx-- +

These helpers extend the basic table with extra ligatures, texligatures +and extra kerns. This saves quite some lookups later.

+--ldx]]-- + +function fonts.afm.add_ligatures(afmdata,ligatures) + local chars = afmdata.characters + for k,v in pairs(characters[ligatures]) do + local one = chars[k] + if one then + for _, b in pairs(v) do + two, three = b[1], b[2] + if two and three and chars[two] and chars[three] then + if one[ligatures] then + if not one.ligatures[two] then + one[ligatures][two] = three + end + else + one[ligatures] = { [two] = three } + end + end + end + end + end +end + +--[[ldx-- +

We keep the extra kerns in separate kerning tables so that we can use +them selectively.

+--ldx]]-- + +function fonts.afm.add_kerns(afmdata) + local chars = afmdata.characters + -- add complex with values of simplified when present + local function do_it_left(what) + for _,v in pairs(chars) do + if v.kerns then + local k = { } + for complex,simple in pairs(characters.uncomposed[what]) do + if k[simple] and not k[complex] then + k[complex] = k[simple] + end + end + if not table.is_empty(k) then + v.extrakerns = k + end + end + end + end + do_it_left("left") + do_it_left("both") + -- copy kerns from simple char to complex char unless set + local function do_it_copy(what) + for complex,simple in pairs(characters.uncomposed[what]) do + local c = chars[complex] + if c then -- optional + local s = chars[simple] + if s and s.kerns then + c.extrakerns = s.kerns -- ok ? no merge ? + end + end + end + end + do_it_copy("both") + do_it_copy("right") +end + +--[[ldx-- +

The copying routine looks messy (and is indeed a bit messy).

+--ldx]]-- + +-- once we have otf sorted out (new format) we can try to make the afm +-- cache similar to it + +function fonts.afm.copy_to_tfm(data) + if data and data.characters then + local tfm = { characters = { }, parameters = { } } + local characters = data.characters + if characters then + for k, v in pairs(characters) do + local t = { } + t.height = v.boundingbox[4] + t.depth = - v.boundingbox[2] + t.width = v.wx + t.boundingbox = v.boundingbox + t.index = v.index + t.name = k + t.unicode = v.unicode + tfm.characters[t.unicode] = t + end + end + tfm.encodingbytes = 2 + tfm.units = 1000 + tfm.name = data.filename + tfm.type = "real" + tfm.fullname = data.fullname + tfm.stretch = stretch + tfm.slant = slant + tfm.direction = 0 + tfm.boundarychar_label = 0 + tfm.boundarychar = 65536 + --~ tfm.false_boundarychar = 65536 -- produces invalid tfm in luatex + tfm.designsize = (data.designsize or 10)*65536 + local spaceunits = 500 + tfm.spacer = "500 units" + if data.isfixedpitch then + if characters['space'] and characters['space'].wx then + spaceunits, tfm.spacer = characters['space'].wx, "space" + elseif characters['emdash'] and characters['emdash'].wx then -- funny default + spaceunits, tfm.spacer = characters['emdash'].wx, "emdash" + elseif data.charwidth then + spaceunits, tfm.spacer = data.charwidth, "charwidth" + end + elseif characters['space'] and characters['space'].wx then + spaceunits, tfm.spacer = characters['space'].wx, "space" + elseif data.charwidth then + spaceunits, tfm.spacer = data.charwidth, "charwidth variable" + end + spaceunits = tonumber(spaceunits) + tfm.parameters[1] = 0 -- slant + tfm.parameters[2] = spaceunits -- space + tfm.parameters[3] = 500 -- space_stretch + tfm.parameters[4] = 333 -- space_shrink + tfm.parameters[5] = 400 -- x_height + tfm.parameters[6] = 1000 -- quad + tfm.parameters[7] = 0 -- extra_space (todo) + if spaceunits < 200 then + -- todo: warning + end + tfm.italicangle = data.italicangle + tfm.ascender = math.abs(data.ascender or 0) + tfm.descender = math.abs(data.descender or 0) + if data.italicangle then + tfm.parameters[1] = tfm.parameters[1] - math.round(math.tan(data.italicangle*math.pi/180)) + end + if data.isfixedpitch then + tfm.parameters[3] = 0 + tfm.parameters[4] = 0 + elseif fonts.afm.syncspace then + -- too little + -- tfm.parameters[3] = .2*spaceunits -- space_stretch + -- tfm.parameters[4] = .1*spaceunits -- space_shrink + -- taco's suggestion: + -- tfm.parameters[3] = .4*spaceunits -- space_stretch + -- tfm.parameters[4] = .1*spaceunits -- space_shrink + -- knuthian values: (for the moment compatible) + tfm.parameters[3] = spaceunits/2 -- space_stretch + tfm.parameters[4] = spaceunits/3 -- space_shrink + end + if data.xheight and data.xheight > 0 then + tfm.parameters[5] = data.xheight + elseif tfm.characters['x'] and tfm.characters['x'].height then + tfm.parameters[5] = tfm.characters['x'].height + end + if table.is_empty(tfm.characters) then + return nil + else + return tfm + end + else + return nil + end +end + + +--~ function set_x(w,h) return h*slant+w*stretch end +--~ function set_y(h) return h end + +--[[ldx-- +

Originally we had features kind of hard coded for +files but since I expect to support more font formats, I decided +to treat this fontformat like any other and handle features in a +more configurable way.

+--ldx]]-- + +function fonts.afm.features.register(name,default) + fonts.afm.features.list[#fonts.afm.features.list+1] = name + fonts.afm.features.default[name] = default +end + +function fonts.afm.set_features(tfmdata) + local shared = tfmdata.shared + local afmdata = shared.afmdata + shared.features = fonts.define.check(shared.features,fonts.afm.features.default) + local features = shared.features +--~ texio.write_nl(table.serialize(features)) + if not table.is_empty(features) then + local mode = tfmdata.mode or fonts.mode + local fi = fonts.initializers[mode] + if fi and fi.afm then + function initialize(list) -- using tex lig and kerning + if list then + for _, f in ipairs(list) do + local value = features[f] + if value and fi.afm[f] then -- brr + if fonts.afm.trace_features then + logs.report("define afm",string.format("initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown',tfmdata.name or 'unknown')) + end + fi.afm[f](tfmdata,value) + mode = tfmdata.mode or fonts.mode + fi = fonts.initializers[mode] + end + end + end + end + initialize(fonts.triggers) + initialize(fonts.afm.features.list) + end + local fm = fonts.methods[mode] + if fm and fm.afm then + function register(list) -- node manipulations + if list then + for _, f in ipairs(list) do + if features[f] and fm.afm[f] then -- brr + if not shared.processors then -- maybe also predefine + shared.processors = { fm.afm[f] } + else + shared.processors[#shared.processors+1] = fm.afm[f] + end + end + end + end + end + register(fonts.afm.features.list) + end + end +end + +function fonts.afm.afm_to_tfm(specification) + local afmfile = specification.filename + local features = specification.features.normal + local cache_id = specification.hash + local tfmdata = containers.read(fonts.tfm.cache, cache_id) -- cache with features applied + if not tfmdata then + local afmdata = fonts.afm.load(afmfile) + if not table.is_empty(afmdata) then + tfmdata = fonts.afm.copy_to_tfm(afmdata) + if not table.is_empty(tfmdata) then + tfmdata.shared = tfmdata.shared or { } + tfmdata.unique = tfmdata.unique or { } + tfmdata.shared.afmdata = afmdata + tfmdata.shared.features = features + fonts.afm.set_features(tfmdata) + end + end + tfmdata = containers.write(fonts.tfm.cache,cache_id,tfmdata) + end + return tfmdata +end + +--[[ldx-- +

As soon as we could intercept the reader, I implemented an + reader. Since traditional could use +fonts with companions, the following method also could handle +those cases, but now that we can handle directly we no longer +need this features.

+--ldx]]-- + +fonts.tfm.default_encoding = 'unicode' + +function fonts.tfm.set_normal_feature(specification,name,value) + if specification and name then + specification.features = specification.features or { } + specification.features.normal = specification.features.normal or { } + specification.features.normal[name] = value + end +end + +function fonts.tfm.read_from_afm(specification) + local name, size, tfmtable = specification.name, specification.size, nil + local encoding, filename = name:match("^(.-)%-(.*)$") -- context: encoding-name.* + if filename and encoding and fonts.enc.known[encoding] then + fonts.tfm.set_normal_feature(specification,'encoding',encoding) + else + encoding = nil -- fonts.tfm.default_encoding + filename = name + end + if filename ~= "" then + specification.filename = filename .. ".afm" + tfmtable = fonts.afm.afm_to_tfm(specification) + if tfmtable then + tfmtable.name = name + tfmtable = fonts.tfm.scale(tfmtable, size) + filename = input.findbinfile(texmf.instance,filename,"pfb") + if filename then + tfmtable.format, tfmtable.filename = 'type1', filename + else + tfmtable.format, tfmtable.filename = 'pk', nil + end + if fonts.dontembed[filename] then + tfmtable.file = nil + end + -- begin of map hack + local mapentry = { + name = tfmtable.name, + fullname = tfmtable.fullname, + stretch = tfmtable.stretch, + slant = tfmtable.slant, + file = tfmtable.filename, + } + -- end of map hack + fonts.map.data[name] = mapentry + end + end + return tfmtable +end + +--[[ldx-- +

Here comes the implementation of a few features. We only implement +those that make sense for this format.

+--ldx]]-- + +function fonts.afm.features.prepare_ligatures(tfmdata,ligatures,value) + if value then + local charlist = tfmdata.shared.afmdata.characters + for k,v in pairs(tfmdata.characters) do + local ac = charlist[v.name] + if ac then + local al = ac[ligatures] + if al then + local ligatures = { } + for k,v in pairs(al) do + ligatures[charlist[k].index] = { + char = charlist[v].index, + type = 0 + } + end + v.ligatures = ligatures + end + end + end + end +end + +function fonts.afm.features.prepare_kerns(tfmdata,kerns,value) + if value then + local charlist = tfmdata.shared.afmdata.characters + for _, chr in pairs(tfmdata.characters) do + local newkerns = charlist[chr.name][kerns] + if newkerns then + local t = chr.kerns or { } + for k,v in pairs(newkerns) do + t[charlist[k].index] = v + end + chr.kerns = t + end + end + end +end + +function fonts.initializers.base.afm.ligatures(tfmdata,value) + fonts.afm.features.prepare_ligatures(tfmdata,'ligatures',value) +end + +function fonts.initializers.base.afm.texligatures(tfmdata,value) + fonts.afm.features.prepare_ligatures(tfmdata,'texligatures',value) +end + +function fonts.initializers.base.afm.kerns(tfmdata,value) + fonts.afm.features.prepare_kerns(tfmdata,'kerns',value) +end + +function fonts.initializers.base.afm.extrakerns(tfmdata,value) + fonts.afm.features.prepare_kerns(tfmdata,'extrakerns',value) +end + +fonts.afm.features.register('liga',true) +fonts.afm.features.register('kerns',true) +fonts.afm.features.register('extrakerns') + +fonts.initializers.node.afm.ligatures = fonts.initializers.base.afm.ligatures +fonts.initializers.node.afm.texligatures = fonts.initializers.base.afm.texligatures +fonts.initializers.node.afm.kerns = fonts.initializers.base.afm.kerns +fonts.initializers.node.afm.extrakerns = fonts.initializers.base.afm.extrakerns + +fonts.initializers.base.afm.liga = fonts.initializers.base.afm.ligatures +fonts.initializers.node.afm.liga = fonts.initializers.base.afm.ligatures +fonts.initializers.base.afm.tlig = fonts.initializers.base.afm.texligatures +fonts.initializers.node.afm.tlig = fonts.initializers.base.afm.texligatures + +-- tfm features + +fonts.initializers.base.afm.equaldigits = fonts.initializers.common.equaldigits +fonts.initializers.node.afm.equaldigits = fonts.initializers.common.equaldigits +fonts.initializers.base.afm.lineheight = fonts.initializers.common.lineheight +fonts.initializers.node.afm.lineheight = fonts.initializers.common.lineheight + +-- afm specific, encodings ...kind of obsolete + +fonts.afm.features.register('encoding') + +fonts.initializers.base.afm.encoding = fonts.initializers.common.encoding +fonts.initializers.node.afm.encoding = fonts.initializers.common.encoding + +-- todo: oldstyle smallcaps as features for afm files diff --git a/tex/context/base/font-def.lua b/tex/context/base/font-def.lua new file mode 100644 index 000000000..cb8e6f75b --- /dev/null +++ b/tex/context/base/font-def.lua @@ -0,0 +1,477 @@ +if not modules then modules = { } end modules ['font-def'] = { + version = 1.001, + comment = "companion to font-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- check reuse of lmroman1o-regular vs lmr10 + +--[[ldx-- +

Here we deal with defining fonts. We do so by intercepting the +default loader that only handles .

+--ldx]]-- + +fonts = fonts or { } +fonts.define = fonts.define or { } +fonts.tfm = fonts.tfm or { } +fonts.vf = fonts.vf or { } +fonts.used = fonts.used or { } + +fonts.tfm.version = 1.01 +fonts.tfm.cache = containers.define("fonts", "tfm", fonts.tfm.version, false) + +--[[ldx-- +

Choosing a font by name and specififying its size is only part of the +game. In order to prevent complex commands, introduced +a method to pass feature information as part of the font name. At the +risk of introducing nasty parsing and compatinility problems, this +syntax was expanded over time.

+ +

For the sake of users who have defined fonts using that syntax, we +will support it, but we will provide additional methods as well. +Normally users will not use this direct way, but use a more abstract +interface.

+ --ldx]]-- + +--~ name, kind, features = fonts.features.split_xetex("blabla / B : + lnum ; foo = bar ; - whatever ; whow ; + hans ; test = yes") + +fonts.define.method = 3 -- 1: tfm 2: tfm and if not then afm 3: afm and if not then tfm +fonts.define.auto_afm = true +fonts.define.auto_otf = true +fonts.define.specify = { } +fonts.define.splitsymbols = "" +fonts.define.methods = fonts.define.methods or { } + +fonts.tfm.fonts = fonts.tfm.fonts or { } +fonts.tfm.readers = fonts.tfm.readers or { } +fonts.tfm.internalized = fonts.tfm.internalized or { } -- internal tex numbers +fonts.tfm.id = fonts.tfm.id or { } -- font data, maybe use just fonts.ids (faster lookup) + +fonts.tfm.readers.sequence = { 'otf', 'ttf', 'afm', 'tfm' } + +--[[ldx-- +

We hardly gain anything when we cache the final (pre scaled) + table. But it can be handy for debugging.

+--ldx]]-- + +fonts.version = 1.05 +fonts.cache = containers.define("fonts", "def", fonts.version, false) + +--[[ldx-- +

We can prefix a font specification by name: or +file:. The first case will result in a lookup in the +synonym table.

+ + +[ name: | file: ] identifier [ separator [ specification ] ] + + +

The following function split the font specification into components +and prepares a table that will move along as we proceed.

+--ldx]]-- + +function fonts.define.analyze(name, size, id) + local specification = name or 'unknown' + local lookup, rest = name:match("^(.-):(.+)$") + local sub = "" + if lookup == 'file' or lookup == 'name' then + name = rest + else + lookup = 'file' + end + local font, method, detail = name:match("^(.-)(["..fonts.define.splitsymbols.."])(.+)$") + if method and detail then + name = font + else + method, detail = "", "" + end + local mainfont, subfont = name:match("^(.*-)(%(.*-)(%)$") + if mainfont and subfont then + name, sub = mainfont, subfont + end + size = size or (65536*10) + return { + lookup = lookup, -- forced type + specification = specification, -- full specification + size = size, -- size in scaled points or -1000*n + name = name, -- font or filename + sub = sub, -- subfont (eg in ttc) + method = method, -- specification method + detail = detail, -- specification + resolved = "", -- resolved font name + forced = "", -- forced loader + id = id, -- font id + features = { }, -- preprocessed features + -- hash = nil + -- filename = nil, + -- encoding = nil, + -- format = nil, + } +end + +function fonts.define.register_split(symbol,action) + fonts.define.splitsymbols = fonts.define.splitsymbols .. "%" .. symbol + fonts.define.specify[symbol] = action +end + +--[[ldx-- +

A unique hash value is generated by:

+--ldx]]-- + +function fonts.tfm.hash_features(specification) + if specification.features then + local normal = specification.features.normal + if not table.is_empty(normal) then + local t = { } + for _, v in pairs(table.sortedkeys(normal)) do + t[#t+1] = v .. '=' .. tostring(normal[v]) + end + return table.concat(t,"+") + end + end + return "unknown" +end + +function fonts.tfm.hash_instance(specification) + if not specification.hash then + specification.hash = fonts.tfm.hash_features(specification) + end + return specification.hash .. ' @ ' .. tostring(specification.size) +end + +--[[ldx-- +

We can resolve the filename using the next function:

+--ldx]]-- + +function fonts.define.resolve(specification) + if specification.lookup == 'name' then + specification.resolved, specification.sub = fonts.names.resolve(specification.name,specification.sub) + if specification.resolved then + specification.forced = file.extname(specification.resolved) + specification.name = file.removesuffix(specification.resolved) + end + elseif specification.lookup == 'file' then + specification.forced = file.extname(specification.name) + specification.name = file.removesuffix(specification.name) + end + if specification.forced == "" then + specification.forced = nil + end + specification.hash = specification.name .. ' @ ' .. fonts.tfm.hash_features(specification) + if specification.sub and specification.sub ~= "" then + specification.hash = specification.sub .. ' @ ' .. specification.hash + end + return specification +end + +--[[ldx-- +

The main read function either uses a forced reader (as determined by +a lookup) or tries to resolve the name using the list of readers.

+ +

We need to cache when possible. We do cache raw tfm data (from , or ). After that we can cache based +on specificstion (name) and size, that is, only needs a number +for an already loaded fonts. However, it may make sense to cache fonts +before they're scaled as well (store 's with applied methods +and features). However, there may be a relation between the size and +features (esp in virtual fonts) so let's not do that now.

+ +

Watch out, here we do load a font, but we don't prepare the +specification yet.

+--ldx]]-- + +function fonts.tfm.read(specification) + garbagecollector.push() + input.start_timing(fonts) + local hash = fonts.tfm.hash_instance(specification) + local tfmtable = fonts.tfm.fonts[hash] -- hashes by size ! + if not tfmtable then + if specification.forced and specification.forced ~= "" then + tfmtable = fonts.tfm.readers[specification.forced](specification) + else + for _, reader in ipairs(fonts.tfm.readers.sequence) do + if fonts.tfm.readers[reader] then -- not really needed + tfmtable = fonts.tfm.readers[reader](specification) + if tfmtable then break end + end + end + end + if tfmtable then + if tfmtable.filename and fonts.dontembed[tfmtable.filename] then + tfmtable.embedding = "no" + else + tfmtable.embedding = "subset" + end + end + fonts.tfm.fonts[hash] = tfmtable + end + input.stop_timing(fonts) + garbagecollector.pop() + return tfmtable +end + +--[[ldx-- +

For virtual fonts we need a slightly different approach:

+--ldx]]-- + +function fonts.tfm.read_and_define(name,size) -- no id + local specification = fonts.define.analyze(name,size,nil) + if specification.method and fonts.define.specify[specification.method] then + specification = fonts.define.specify[specification.method](specification) + end + specification = fonts.define.resolve(specification) + local hash = fonts.tfm.hash_instance(specification) + local id = fonts.tfm.internalized[hash] + if not id then + local fontdata = fonts.tfm.read(specification) + id = font.define(fontdata) + fonts.tfm.id[id] = fontdata + fonts.tfm.internalized[hash] = id + end + return fonts.tfm.id[id], id +end + +--[[ldx-- +

A naive callback could be the following:

+ + +callback.register('define_font', function(name,size,id) + return fonts.define.read(fonts.define.resolve(fonts.define.analyze(name,size,id))) +end) + +--ldx]]-- + + +--[[ldx-- +

Next follow the readers. This code was written while +evolved. Each one has its own way of dealing with its format.

+--ldx]]-- + +function fonts.tfm.readers.opentype(specification,suffix,what) + if fonts.define.auto_otf then + local fullname, tfmtable = nil, nil + fullname = input.findbinfile(texmf.instance,specification.name,suffix) + if fullname and fullname ~= "" then + specification.filename, specification.format = fullname, what + tfmtable = fonts.tfm.read_from_open_type(specification) + fonts.logger.save(tfmtable,suffix,specification) + end + return tfmtable + else + return nil + end +end + +function fonts.tfm.readers.otf(specification) return fonts.tfm.readers.opentype(specification,"otf","opentype") end +function fonts.tfm.readers.ttf(specification) return fonts.tfm.readers.opentype(specification,"ttf","truetype") end +function fonts.tfm.readers.ttc(specification) return fonts.tfm.readers.opentype(specification,"ttf","truetype") end -- !! + +function fonts.tfm.readers.afm(specification) + local fullname, tfmtable = nil, nil + if fonts.define.method == 2 then + fullname = input.findbinfile(texmf.instance,specification.name,"ofm") -- ? + if not (fullname and fullname ~= "") then + specification.filename = fullname + tfmtable = fonts.tfm.read_from_afm(specification) + fonts.logger.save(tfmtable,'afm',specification) + end + elseif fonts.define.method == 3 then +-- maybe also findbinfile here + if fonts.define.auto_afm then + tfmtable = fonts.tfm.read_from_afm(specification) + fonts.logger.save(tfmtable,'afm',specification) + end + elseif fonts.define.method == 4 then +-- maybe also findbinfile here + tfmtable = fonts.tfm.read_from_afm(specification) + fonts.logger.save(tfmtable,'afm',specification) + end + return tfmtable +end + +function fonts.tfm.readers.tfm(specification) + local fullname, tfmtable = nil, nil + tfmtable = fonts.tfm.read_from_tfm(specification) + fonts.logger.save(tfmtable,'tfm',specification) + return tfmtable +end + +--[[ldx-- +

So far we haven't really dealt with features (or whatever we want +to pass along with the font definition. We distinguish the following +situations:

+ + +name:xetex like specs +name@virtual font spec +name*context specification + + +

Of course one can always define more.

+--ldx]]-- + +function fonts.define.specify.predefined(specification) + if specification.detail ~= "" and fonts.define.methods[specification.detail] then + specification.features.vtf = { preset = specification.detail } + end + return specification +end + +fonts.define.register_split("@", fonts.define.specify.predefined) + +function fonts.define.specify.colonized(specification) + local list = { } + if specification.detail and specification.detail ~= "" then + local expanded_features = { } + local function expand(features) + for _,v in pairs(features:split(";")) do + expanded_features[#expanded_features+1] = v + end + end + expand(specification.detail) + for _,v in pairs(expanded_features) do + local a, b = v:match("^%s*(%S+)%s*=%s*(%S+)%s*$") + if a and b then + list[a] = b:is_boolean() + if type(list[a]) == "nil" then + list[a] = b + end + else + local a, b = v:match("^%s*([%+%-]?)%s*(%S+)%s*$") + if a and b then + list[b] = a ~= "-" + end + end + end + end + specification.features.normal = list + return specification +end + +function fonts.tfm.make(specification) + local fvm = fonts.define.methods[specification.features.vtf.preset] + if fvm then + return fvm(specification) + else + return nil + end +end + +fonts.define.register_split(":", fonts.define.specify.colonized) + +fonts.define.specify.context_setups = fonts.define.specify.context_setups or { } + +input.storage.register(false,"fonts/setups", fonts.define.specify.context_setups, "fonts.define.specify.context_setups") + +function fonts.define.specify.preset_context(name,features) + local t = aux.settings_to_hash(features) + for k,v in pairs(t) do + t[k] = v:is_boolean() + if type(t[k]) == "nil" then + t[k] = v + end + end + fonts.define.specify.context_setups[name] = t +end + +function fonts.define.specify.split_context(features) + if fonts.define.specify.context_setups[features] then + return fonts.define.specify.context_setups[features] + else + return fonts.define.specify.preset_context("***",features) + end +end + +function fonts.define.specify.starred(features) + if features.detail and features.detail ~= "" then + features.features.normal = fonts.define.specify.split_context(features.detail) + else + features.features.normal = { } + end + return features +end + +fonts.define.register_split('*',fonts.define.specify.starred) + +--[[ldx-- +

We need to check for default features. For this we provide +a helper function.

+--ldx]]-- + +function fonts.define.check(features,defaults) + if table.is_empty(features) then + features = table.fastcopy(defaults) -- we could do without copy + else + for k,v in pairs(defaults) do + if features[k] == nil then + features[k] = v + end + end + end + return features +end + +--[[ldx-- +

So far the specifyers. Now comes the real definer. Here we cache +based on id's. Here we also intercept the virtual font handler. Since +it evolved stepwise I may rewrite this bit (combine code).

+ +In the previously defined reader (the one resulting in a +table) we cached the (scaled) instances. Here we cache them again, but +this time based on id. We could combine this in one cache but this does +not gain much. By the way, passing id's back to in the callback was +introduced later in the development.

+--ldx]]-- + +function fonts.define.read(name,size,id) + local specification = fonts.define.analyze(name,size,id) + if specification.method and fonts.define.specify[specification.method] then + specification = fonts.define.specify[specification.method](specification) + end + specification = fonts.define.resolve(specification) + local hash = fonts.tfm.hash_instance(specification) + if true then + local fontdata = containers.read(fonts.cache,hash) -- for tracing purposes + end + local fontdata = fonts.tfm.internalized[hash] + if not fontdata then + if specification.features.vtf and specification.features.vtf.preset then + fontdata = fonts.tfm.make(specification) + else + fontdata = fonts.tfm.read(specification) + end + if true then + fontdata = containers.write(fonts.cache,hash,fontdata) -- for tracing purposes + end + fonts.tfm.id[id] = fontdata + fonts.tfm.internalized[hash] = id + end + return fontdata +end + +--~ table.insert(fonts.tfm.readers.sequence,1,'vtf') + +--~ function fonts.tfm.readers.vtf(specification) +--~ if specification.features.vtf and specification.features.vtf.preset then +--~ return fonts.tfm.make(specification) +--~ else +--~ return nil +--~ end +--~ end + +function fonts.vf.find(name) + if fonts.logger.format(name) == 'tfm' then + return input.findbinfile(texmf.instance,name,"ovf") + else + return "" + end +end + +--[[ldx-- +

We overload both the and readers.

+--ldx]]-- + +callback.register('define_font' , fonts.define.read) +callback.register('find_vf_file', fonts.vf.find ) diff --git a/tex/context/base/font-enc.lua b/tex/context/base/font-enc.lua new file mode 100644 index 000000000..a29ed83d3 --- /dev/null +++ b/tex/context/base/font-enc.lua @@ -0,0 +1,98 @@ +if not modules then modules = { } end modules ['font-enc'] = { + version = 1.001, + comment = "companion to font-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

Because encodings are going to disappear, we don't bother defining +them in tables. But we may do so some day, for consistency.

+--ldx]]-- + +fonts.enc = fonts.enc or { } +fonts.enc.version = 1.01 +fonts.enc.cache = containers.define("fonts", "enc", fonts.enc.version, false) + +fonts.enc.known = { + texnansi = true, + ec = true, + qx = true, + t5 = true, + t2a = true, + t2b = true, + t2c = true, + unicode = true +} + +function fonts.enc.is_known(encoding) + return containers.is_valid(fonts.enc.cache,encoding) +end + +--[[ldx-- +

An encoding file looks like this:

+ + +/TeXnANSIEncoding [ +/.notdef +/Euro +... +/ydieresis +] def + + +

Beware! The generic encoding files don't always apply to the ones that +ship with fonts. This has to do with the fact that names follow (slightly) +different standards. However, the fonts where this applies to (for instance +Latin Modern or Gyre) come in OpenType variants too, so these +will be used.

+--ldx]]-- + +function fonts.enc.load(filename) + local name = file.removesuffix(filename) + local data = containers.read(fonts.enc.cache,name) + if data then + local vector, tag, hash = { }, "", { } + local foundname = input.find_file(texmf.instance,filename,'enc') + if foundname and foundname ~= "" then + local ok, encoding, size = input.loadbinfile(texmf.instance,foundname) + if ok and encoding then + encoding = encoding:gsub("%%(.-)\n","") + local tag, vec = encoding:match("/(%w+)%s*%[(.*)%]%s*def") + local i = 0 + for ch in vec:gmatch("/([%a%d%.]+)") do + if ch ~= ".notdef" then + vector[i] = ch + if not hash[ch] then + hash[ch] = i + else + -- duplicate, play safe for tex ligs and take first + end + end + i = i + 1 + end + end + end + data = containers.write(fonts.enc.cache, name, { name=name, tag=tag, vector=vector, hash=hash }) + end + return data +end + +--[[ldx-- +

There is no unicode encoding but for practical purposed we define +one.

+--ldx]]-- + +do + local vector, hash = { }, { } + for k,v in pairs(characters.data) do + local a = v.adobename + if a then + vector[k], hash[a] = a, k + else + vector[k] = '.notdef' + end + end + containers.write(fonts.enc.cache, 'unicode', { name='unicode', tag='unicode', vector=vector, hash=hash }) +end diff --git a/tex/context/base/font-fbk.lua b/tex/context/base/font-fbk.lua new file mode 100644 index 000000000..b81b94309 --- /dev/null +++ b/tex/context/base/font-fbk.lua @@ -0,0 +1,219 @@ +if not modules then modules = { } end modules ['font-fbk'] = { + version = 1.001, + comment = "companion to font-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

This is very experimental code!

+--ldx]]-- + +fonts.fallbacks = { } +fonts.vf.aux.combine.trace = false + +fonts.vf.aux.combine.commands["enable-tracing"] = function(g,v) + fonts.vf.aux.combine.trace = true +end + +fonts.vf.aux.combine.commands["disable-tracing"] = function(g,v) + fonts.vf.aux.combine.trace = false +end + +fonts.vf.aux.combine.commands["set-tracing"] = function(g,v) + if v[2] == nil then + fonts.vf.aux.combine.trace = true + else + fonts.vf.aux.combine.trace = v[2] + end +end + +function fonts.vf.aux.combine.initialize_trace() + if fonts.vf.aux.combine.trace then + return "special", "pdf: .8 0 0 rg .8 0 0 RG", "pdf: 0 .8 0 rg 0 .8 0 RG", "pdf: 0 0 .8 rg 0 0 .8 RG", "pdf: 0 g 0 G" + else + return "comment", "", "", "", "" + end +end + +fonts.vf.aux.combine.force_fallback = false + +fonts.vf.aux.combine.commands["fake-character"] = function(g,v) -- g, nr, fallback_id + local index, fallback = v[2], v[3] + if fonts.vf.aux.combine.force_fallback or not g.characters[index] then + if fonts.fallbacks[fallback] then + g.characters[index] = fonts.fallbacks[fallback](g) + end + end +end + +fonts.fallbacks['textcent'] = function (g) + local c = string.byte("c") + local t = table.fastcopy(g.characters[c]) +--~ local s = fonts.tfm.scaled(g.specification.size or g.size or g.private.size) +--~ local s = fonts.tfm.scaled(g.size or g.private.size) + local s = fonts.tfm.scaled(g.specification.size or g.size) + local a = - math.tan(math.rad(g.italicangle)) + local special, red, green, blue, black = fonts.vf.aux.combine.initialize_trace() + if a == 0 then + t.commands = { + {"push"}, {"slot", 1, c}, {"pop"}, + {"right", .5*t.width}, + {"down", .2*t.height}, + {special, green}, + {"rule", 1.4*t.height, .02*s}, + {special, black}, + } + else + t.commands = { + {"push"}, + {"right", .5*t.width-.025*s}, + {"down", .2*t.height}, + {"special",string.format("pdf: q 1 0 %s 1 0 0 cm",a)}, + {special, green}, + {"rule", 1.4*t.height, .025*s}, + {special, black}, + {"special","pdf: Q"}, + {"pop"}, + {"slot", 1, c} -- last else problems with cm + } + end + -- somehow the width is messed up now + -- todo: set height + t.height = 1.2*t.height + t.depth = 0.2*t.height + return t +end + +fonts.fallbacks['texteuro'] = function (g) + local c = string.byte("C") + local t = table.fastcopy(g.characters[c]) +--~ local s = fonts.tfm.scaled(g.specification.size or g.size or g.private.size) +--~ local s = fonts.tfm.scaled(g.size or g.private.size) + local s = fonts.tfm.scaled(g.specification.size or g.size) + local d = math.cos(math.rad(90+g.italicangle)) + local special, red, green, blue, black = fonts.vf.aux.combine.initialize_trace() + t.width = 1.05*t.width + t.commands = { + {"right", .05*t.width}, + {"push"}, {"slot", 1, c}, {"pop"}, + {"right", .5*t.width*d}, + {"down", -.5*t.height}, + {special, green}, + {"rule", .05*s, .4*s}, + {special, black}, + } + return t +end + +-- maybe store llx etc instead of bbox in tfm blob / more efficient + +fonts.vf.aux.combine.force_composed = false + +fonts.vf.aux.combine.commands["complete-composed-characters"] = function(g,v) + local chars = g.characters + local cap_lly = chars[string.byte("X")].boundingbox[4] + local ita_cor = math.cos(math.rad(90+g.italicangle)) + local force = fonts.vf.aux.combine.force_composed + local special, red, green, blue, black = fonts.vf.aux.combine.initialize_trace() + for i,c in pairs(characters.data) do + if force or not chars[i] then + local s = c.specials + if s and s[1] == 'char' then + local chr = s[2] + if chars[chr] then + local cc = c.category + if (cc == 'll') or (cc == 'lu') or (cc == 'lt') then + local acc = s[3] + chars[i] = table.fastcopy(chars[chr]) + if chars[acc] then + local cb = chars[chr].boundingbox + local ab = chars[acc].boundingbox + local c_llx, c_lly, c_urx, c_ury = cb[1], cb[2], cb[3], cb[4] + local a_llx, a_lly, a_urx, a_ury = ab[1], ab[2], ab[3], ab[4] + -- local dx = (c_urx-a_urx) - (c_urx-c_llx-a_urx+a_llx)/2 + -- local dx = (c_urx-a_urx) - (c_urx-a_urx-c_llx+a_llx)/2 + local dx = (c_urx - a_urx - a_llx + c_llx)/2 + -- local dd = chars[chr].width*ita_cor + local dd = (c_urx-c_llx)*ita_cor + if a_ury < 0 then + local dy = cap_lly-a_lly + chars[i].commands = { + {"push"}, + {"right", dx-dd}, + {special, red}, + {"slot", 1, acc}, + {special, black}, + {"pop"}, + {"slot", 1, chr}, + } + elseif c_ury > a_lly then + local dy = cap_lly-a_lly + chars[i].commands = { + {"push"}, + {"right", dx+dd}, + {"down", -dy}, + {special, green}, + {"slot", 1, acc}, + {special, black}, + {"pop"}, + {"slot", 1, chr}, + } + else + chars[i].commands = { + {"push"}, + {"right", dx+dd}, + {special, blue}, + {"slot", 1, acc}, + {special, black}, + {"pop"}, + {"slot", 1, chr}, + } + end + end + end + end + end + end + end +end + +--~ {'special', 'pdf: q ' .. s .. ' 0 0 '.. s .. ' 0 0 cm'}, +--~ {'special', 'pdf: q 1 0 0 1 ' .. -w .. ' ' .. -h .. ' cm'}, +--~ -- {'special', 'pdf: /Fm\XX\space Do'}, +--~ {'special', 'pdf: Q'}, +--~ {'special', 'pdf: Q'}, + +-- for documentation purposes we provide: + +fonts.define.methods.install("fallback", { -- todo: auto-fallback with loop over data.characters + { "fake-character", 0x00A2, 'textcent' }, + { "fake-character", 0x20AC, 'texteuro' } +}) + +fonts.vf.aux.combine.commands["enable-force"] = function(g,v) + fonts.vf.aux.combine.force_composed = true + fonts.vf.aux.combine.force_fallback = true +end +fonts.vf.aux.combine.commands["disable-force"] = function(g,v) + fonts.vf.aux.combine.force_composed = false + fonts.vf.aux.combine.force_fallback = false +end + +fonts.define.methods.install("demo-2", { + { "enable-tracing" }, + { "enable-force" }, + { "initialize" }, + { "include-method", "fallback" }, + { "complete-composed-characters" }, + { "disable-tracing" }, + { "disable-force" }, +}) + +fonts.define.methods.install("demo-3", { + { "enable-tracing" }, + { "initialize" }, + { "complete-composed-characters" }, + { "disable-tracing" }, +}) diff --git a/tex/context/base/font-ini.lua b/tex/context/base/font-ini.lua new file mode 100644 index 000000000..68cb49439 --- /dev/null +++ b/tex/context/base/font-ini.lua @@ -0,0 +1,57 @@ +if not modules then modules = { } end modules ['font-ini'] = { + version = 1.001, + comment = "companion to font-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

Not much is happening here.

+--ldx]]-- + +-- vtf comes first +-- fix comes last + +fonts = fonts or { } + +fonts.mode = 'base' + +fonts.methods = { + base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }, + node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }, +} + +fonts.initializers = { + base = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } }, + node = { tfm = { }, afm = { }, otf = { }, vtf = { }, fix = { } } +} + +fonts.triggers = { + 'mode', + 'language', + 'script' +} + +-- tracing + +do + + fonts.color = fonts.color or { } + + fonts.color.trace = false + + local attribute = attributes.numbers['color'] or 4 -- we happen to know this -) + local mapping = attributes.list[attribute] + + local set_attribute = node.set_attribute + local unset_attribute = node.unset_attribute + + function fonts.color.set(n,c) + set_attribute(n,attribute,mapping[c] or -1) + end + function fonts.color.reset(n) + unset_attribute(n,attribute) + end + +end diff --git a/tex/context/base/font-ini.mkii b/tex/context/base/font-ini.mkii index 25fea33b4..ef2ab85a7 100644 --- a/tex/context/base/font-ini.mkii +++ b/tex/context/base/font-ini.mkii @@ -11,65 +11,8 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -% \starttext -% \definefont -% [blabla] -% [name:Latin Modern Something] -% \definefont -% [blabla] -% [file:texnansi-lmr10] -% \blabla test -% \definefont -% [blabla] -% [texnansi-lmtt10] -% \blabla test -% \stoptext - \unprotect -% \definefontsynonym -% [blabla] -% [name:Latin Modern Something] -% \definefontsynonym -% [blabla] -% [file:texnansi-lmr10] -% [encoding=texnansi] -% \definedfont[blabla] test \currentencoding/\fontfile \par -% \definefontsynonym -% [blabla] -% [texnansi-lmtt10] -% [encoding=texnansi] -% \definedfont[blabla] test \currentencoding/\fontfile \par -% \definefontsynonym -% [blabla] -% [ec-lmtt10] -% [encoding=ec] -% \definedfont[blabla] test \currentencoding/\fontfile \par - -\def\checkfontfilename - {\expandafter\docheckfontfilename\fontfile:\empty:\empty\relax} - -\def\docheckfontfilename#1:#2:#3#4\relax - {\edef\!!stringa{#1}% - \edef\!!stringb{#2}% - \ifx\!!stringb\empty - \edef\checkedfontfile{\fontfilesome\!!stringa}% - \else\ifx\!!stringa\v!file - \edef\checkedfontfile{\fontfilefile\!!stringb}% - \else\ifx\!!stringa\v!name - \edef\checkedfontfile{\fontfilename\!!stringb}% - \else - \edef\checkedfontfile{\fontfilesome\!!stringb}% - \fi\fi\fi} - -\def\fontfilename#1{"#1"} -\def\fontfilefile#1{"#1"} -\def\fontfilesome#1{#1} - -\beginXETEX - \def\fontfilefile#1{"[#1]"} -\endXETEX - \def\mkdefinefontfeature#1% #2 {\setvalue{\??fa#1}} % {#2} diff --git a/tex/context/base/font-ini.mkiv b/tex/context/base/font-ini.mkiv new file mode 100644 index 000000000..dd597d41f --- /dev/null +++ b/tex/context/base/font-ini.mkiv @@ -0,0 +1,72 @@ +%D \module +%D [ file=font-ini, +%D version=2007.01.10, +%D title=\CONTEXT\ Font Macros, +%D subtitle=Initialization, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\registerctxluafile{font-ini}{1.001} +\registerctxluafile{font-enc}{1.001} +\registerctxluafile{font-map}{1.001} +\registerctxluafile{font-syn}{1.001} +\registerctxluafile{font-tfm}{1.001} +\registerctxluafile{font-afm}{1.001} +\registerctxluafile{font-otf}{1.001} +\registerctxluafile{font-vf} {1.001} +\registerctxluafile{font-def}{1.001} +\registerctxluafile{font-fbk}{1.001} + +\unprotect + +\def\mkdefinefontfeature#1#2% + {\ctxlua{fonts.define.specify.preset_context("#1","#2")}} + +% handy for manuals + +\def\otfchar#1{\ctxlua{fonts.otf.char("#1")}} + +\registerrgbcolor {font:init} {1}{0}{0}% +\registerrgbcolor {font:medi} {0}{1}{0}% +\registerrgbcolor {font:fina} {0}{0}{1}% +\registerrgbcolor {font:isol} {0}{1}{1}% +\registerrgbcolor {font:mark} {1}{0}{1}% +\registerrgbcolor {font:rest} {1}{1}{0}% + +%D goodies: +%D +%D \starttyping +%D \showinstalledfonts[officinasans.*][all] +%D \showinstalledfonts[officinaserif.*][all] +%D \showinstalledfonts[officina.*itc.*][all] +%D +%D \showinstalledfonts[officina.*itc.*][all,new] +%D \stoptyping + +\def\showinstalledfonts + {\dodoubleempty\doshowinstalledfonts} + +\def\doshowinstalledfonts[#1][#2]% + {\bgroup + \def\pattern{#1}% + \def\all{false}% + \def\reload{false}% + \doifnothing\pattern{\def\pattern{.*}}% + \processallactionsinset[#2][\v!new=>\def\reload{true},\v!all=>\def\all{true}]% + \ctxlua{fonts.names.table("#1",\reload,\all)}% + \egroup} + +%D Experimental! + +\def\installfontfeature + {\dodoubleargument\doinstallfontfeature} + +\def\doinstallfontfeature[#1][#2]% + {\ctxlua{fonts.install_feature("#1","#2")}} + +\protect \endinput diff --git a/tex/context/base/font-ini.tex b/tex/context/base/font-ini.tex index 4b48ad5b5..759d8c7fb 100644 --- a/tex/context/base/font-ini.tex +++ b/tex/context/base/font-ini.tex @@ -936,55 +936,6 @@ % \def\s!nullfont{nullfont} -\beginTEX - -\def\dodosettextfamily#1% - {\@EA\ifx\csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname\relax - \@EA\ifx\csname\fontclass\fontbody\c!mm\fontfamily\endcsname \relax - \@EA\ifx\csname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname\relax - \@EA\ifx\csname\fontclass\fontbody\c!rm\fontfamily\endcsname \relax - \@EA\ifx\csname \fontbody\c!mm\fontfamily\fontsize\endcsname\relax - \@EA\ifx\csname \fontbody\c!mm\fontfamily\endcsname \relax - \@EA\ifx\csname \fontbody\c!rm\fontfamily\fontsize\endcsname\relax - \@EA\ifx\csname \fontbody\c!rm\fontfamily\endcsname \relax - \autofontsizetrue \nullfont \else - \autofontsizetrue \csname\fontbody\c!rm\fontfamily\endcsname \fi\else - \autofontsizefalse \csname\fontbody\c!rm\fontfamily\fontsize\endcsname\fi\else - \autofontsizetrue \csname\fontbody\c!mm\fontfamily\endcsname \fi\else - \autofontsizefalse \csname\fontbody\c!mm\fontfamily\fontsize\endcsname\fi\else - \autofontsizetrue \csname\fontclass\fontbody\c!rm\fontfamily\endcsname \fi\else - \autofontsizefalse \csname\fontclass\fontbody\c!rm\fontsize\endcsname\fi\else - \autofontsizetrue \csname\fontclass\fontbody\c!mm\fontfamily\endcsname \fi\else - \autofontsizefalse \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname\fi - #1\csname\fontfamily\s!fam\endcsname\font} - -\endTEX - -\beginETEX \ifcsname - -%\def\dodosettextfamily#1% -% {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse -% \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \else -% \ifcsname\fontclass\fontbody\c!mm\fontfamily\endcsname \autofontsizetrue -% \csname\fontclass\fontbody\c!mm\fontfamily\endcsname \else -% \ifcsname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname \autofontsizefalse -% \csname\fontclass\fontbody\c!rm\fontfamily\fontsize\endcsname \else -% \ifcsname\fontclass\fontbody\c!rm\fontfamily\endcsname \autofontsizetrue -% \csname\fontclass\fontbody\c!rm\fontfamily\endcsname \else -% \ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse -% \csname \fontbody\c!mm\fontfamily\fontsize\endcsname \else -% \ifcsname \fontbody\c!mm\fontfamily\endcsname \autofontsizetrue -% \csname \fontbody\c!mm\fontfamily\endcsname \else -% \ifcsname \fontbody\c!rm\fontfamily\fontsize\endcsname \autofontsizefalse -% \csname \fontbody\c!rm\fontfamily\fontsize\endcsname \else -% \ifcsname \fontbody\c!rm\fontfamily\endcsname \autofontsizetrue -% \csname \fontbody\c!rm\fontfamily\endcsname \else -% \nullfont \autofontsizetrue -% \fi\fi\fi\fi\fi\fi\fi\fi -% #1\csname\fontfamily\s!fam\endcsname\font} -% -% slightly faster: - \def\dodosettextfamily {\ifx\fontclass\empty \@EA\dodosettextfamilyA @@ -1018,8 +969,6 @@ \fi\fi\fi\fi #1\csname\fontfamily\s!fam\endcsname\font} -\endETEX - \def\mrfallback{\c!rm\c!tf} \appendtoks @@ -1048,55 +997,6 @@ \let\fontbody #2\dodosetmathfamily \textfont#1% \let\fontbody\savedfontbody} -\beginTEX - -\def\dodosetmathfamily#1#2% - {\@EA\ifx \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname\relax - \@EA\ifx \csname\fontclass\fontbody\c!mm\fontfamily \endcsname\relax - \@EA\ifx \csname\fontclass\fontbody \backfamily\fontsize\endcsname\relax - \@EA\ifx \csname\fontclass\fontbody \backfamily \endcsname\relax - \@EA\ifx \csname \fontbody\c!mm\fontfamily\fontsize\endcsname\relax - \@EA\ifx \csname \fontbody\c!mm\fontfamily \endcsname\relax - \@EA\ifx \csname \fontbody \backfamily\fontsize\endcsname\relax - \@EA\ifx \csname \fontbody \backfamily \endcsname\relax - \autofontsizetrue \nullfont \else - \autofontsizetrue \csname \fontbody \backfamily \endcsname\fi \else - \autofontsizefalse \csname \fontbody \backfamily\fontsize\endcsname\fi \else - \autofontsizetrue \csname \fontbody\c!mm\fontfamily \endcsname\fi \else - \autofontsizefalse \csname \fontbody\c!mm\fontfamily\fontsize\endcsname\fi \else - \autofontsizetrue \csname\fontclass\fontbody \backfamily \endcsname\fi \else - \autofontsizefalse \csname\fontclass\fontbody \backfamily\fontsize\endcsname\fi \else - \autofontsizetrue \csname\fontclass\fontbody\c!mm\fontfamily \endcsname\fi \else - \autofontsizefalse \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname\fi - #1#2\font} - -\endTEX - -\beginETEX \ifcsname - -%\def\dodosetmathfamily#1#2% -% {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse -% \csname\fontclass\fontbody\c!mm\fontfamily\fontsize\endcsname \else -% \ifcsname\fontclass\fontbody\c!mm\fontfamily\endcsname \autofontsizetrue -% \csname\fontclass\fontbody\c!mm\fontfamily\endcsname \else -% \ifcsname\fontclass\fontbody\backfamily\fontsize\endcsname \autofontsizefalse -% \csname\fontclass\fontbody\backfamily\fontsize\endcsname \else -% \ifcsname\fontclass\fontbody\backfamily\endcsname \autofontsizetrue -% \csname\fontclass\fontbody\backfamily\endcsname \else -% \ifcsname \fontbody\c!mm\fontfamily\fontsize\endcsname \autofontsizefalse -% \csname \fontbody\c!mm\fontfamily\fontsize\endcsname \else -% \ifcsname \fontbody\c!mm\fontfamily\endcsname \autofontsizetrue -% \csname \fontbody\c!mm\fontfamily\endcsname \else -% \ifcsname \fontbody\backfamily\fontsize\endcsname \autofontsizefalse -% \csname \fontbody\backfamily\fontsize\endcsname \else -% \ifcsname \fontbody\backfamily\endcsname \autofontsizetrue -% \csname \fontbody\backfamily\endcsname \else -% \nullfont \autofontsizetrue -% \fi\fi\fi\fi\fi\fi\fi\fi -% #1#2\font} -% -% sligthly faster: - \def\dodosetmathfamily {\ifx\fontclass\empty \@EA\dodosetmathfamilyA @@ -1130,8 +1030,6 @@ \fi\fi\fi\fi #1#2\font} -\endETEX - \appendtoks \dosetsymbfamily\mrfam\textface\scriptface\scriptscriptface\c!mr \dosetsymbfamily\mifam\textface\scriptface\scriptscriptface\c!mi @@ -1151,24 +1049,6 @@ \let\fontbody #2\dodosetsymbfamily \textfont#1% \let\fontbody\savedfontbody} -\beginTEX - -\def\dodosetsymbfamily#1#2% - {\@EA\ifx\csname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname\relax - \@EA\ifx\csname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname\relax - \else - \csname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname - #1#2\font - \fi - \else - \csname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname - #1#2\font - \fi} - -\endTEX - -\beginETEX \ifcsname - \def\dodosetsymbfamily#1#2% {\ifcsname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname \csname\fontclass\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname @@ -1177,8 +1057,6 @@ \csname\fontbody\c!mm\fontfamily\fontalternative\fontsize\endcsname #1#2\font \fi\fi} - -\endETEX %D All used styles, like rm, ss and tt, are saved in a comma %D separated list. Appart from practical limitations one can @@ -1255,20 +1133,6 @@ \def\saverelativefontsize#1#2% #1=rm|ss|.. #2=waarde {\setxvalue{\fontclass#1\s!rscale}{#2}} -\beginTEX - -\def\checkrelativefontsize#1% - {\edef\relativefontsize - {\@EA\ifx\csname\fontclass#1\s!rscale\endcsname\relax - \defaultrelativefontsize - \else - \csname\fontclass#1\s!rscale\endcsname - \fi}} - -\endTEX - -\beginETEX \ifcsname - \def\checkrelativefontsize#1% {\edef\relativefontsize {\ifcsname\fontclass#1\s!rscale\endcsname @@ -1277,8 +1141,6 @@ \defaultrelativefontsize \fi}} -\endETEX - %D We also save: \def\savemathtextstyle#1% #1=rm|ss|.. @@ -1302,6 +1164,8 @@ % % but, better: +\let\somefontname\empty + \def\parsefontspec#1% {\xdef\somefontspec{#1\space}% \@EA\doparsefontspec\somefontspec\relax]% =>#1 \relax] @@ -1482,8 +1346,240 @@ \ifx\checkfontfilename\undefined \let\checkfontfilename\relax \fi +% \definefontsynonym +% [blabla] +% [name:Latin Modern Something] +% \definefontsynonym +% [blabla] +% [file:texnansi-lmr10] +% [encoding=texnansi] +% \definedfont[blabla] test \currentencoding/\fontfile \par +% \definefontsynonym +% [blabla] +% [texnansi-lmtt10] +% [encoding=texnansi] +% \definedfont[blabla] test \currentencoding/\fontfile \par +% \definefontsynonym +% [blabla] +% [ec-lmtt10] +% [encoding=ec] +% \definedfont[blabla] test \currentencoding/\fontfile \par + +\beginOLDTEX + + \def\checkfontfilename + {\expandafter\docheckfontfilename\fontfile:\empty:\empty\relax} + + \def\docheckfontfilename#1:#2:#3#4\relax + {\edef\!!stringa{#1}% + \edef\!!stringb{#2}% + \ifx\!!stringb\empty + \edef\checkedfontfile{\!!stringa}% + \else\ifx\!!stringa\v!file + \edef\checkedfontfile{"\!!stringb"}% + \else\ifx\!!stringa\v!name + \edef\checkedfontfile{"\!!stringb"}% + \else + \edef\checkedfontfile{\!!stringb}% + \fi\fi\fi} + +\endOLDTEX + +% \definefontfeature[default] [liga=yes,texligatures=yes,texquotes=yes] +% \definefontfeature[default-caps][liga=yes,texligatures=yes,texquotes=yes,smcp=yes,script=latn] +% +% \starttypescript [serif] [palatino-nova-regular] [name] +% \definefontsynonym[Serif] [palatinonova-regular][features=default] +% \definefontsynonym[SerifCaps][palatinonova-regular][features=default-caps] % also sets Serif +% \stoptypescript +% +% \starttypescript [serif] [palatino-nova-regular] [name] +% \definefontsynonym[Serif] [palatinonova-regular*default] +% \definefontsynonym[SerifCaps] [palatinonova-regular*default-caps] +% \stoptypescript +% +% \starttypescript [serif] [palatino-nova-regular] [name] +% \definefontsynonym[Serif] [palatinonova-regular] [resource=palatinonova-regular,features=default] +% \definefontsynonym[SerifCaps][palatinonova-regular-sc][resource=palatinonova-regular,features=default-caps] % caps +% \stoptypescript +% +% \definetypeface[mainface][rm][serif][palatino-nova-regular][default] \setupbodyfont[mainface] +% +% \starttext +% ``Test'' -- --- ff fi fl \sc ``Test'' -- --- ff fi fl +% \stoptext + +% \starttext +% \definefont +% [blabla] +% [name:Latin Modern Something] +% \definefont +% [blabla] +% [file:texnansi-lmr10] +% \blabla test +% \definefont +% [blabla] +% [texnansi-lmtt10] +% \blabla test +% \stoptext + +\beginLUATEX + + \def\checkfontfilename% -- todo: integrate so that we call do.. directly + {\expandafter\docheckfontfilename\fontfile*\empty*\relax} + + \def\docheckfontfilename#1*#2#3*#4\relax % class overrules file + {\edef\checkedfontfile{{% + \ifx\@@fontresource\empty#1\else\@@fontresource\fi + \expandafter\ifx\csname\fontclass\s!features\endcsname\empty + \ifx\@@fontfeatures\empty\ifx#2\empty\else*#2#3\fi\else*\@@fontfeatures\fi + \else\expandafter\ifx\csname\fontclass\s!features\endcsname\relax % redundant, will go away + \ifx\@@fontfeatures\empty\ifx#2\empty\else*#2#3\fi\else*\@@fontfeatures\fi + \else + *\csname\fontclass\s!features\endcsname + \fi\fi + }}% + \doshowcheckedfontfeatures} + +\endLUATEX + +% xetex / todo: disable default features ! + +\beginXETEX + + % for some reason xetex does not support [filename] for tfm files and + % quotes also behave kind of strange " vs ' vs [ vs ... + + % we need to use the specs, + % + % \font\myfont = msam7 % ok + % \font\myfont = "msam7" % also ok + % \font\myfont = "msam7" at 8pt % error + + \newcount\xetexsavedinteractionmode + \newbox \xetexcrappyhackbox + + \def\doiffoundxetexfontelse#1#2% + {\xetexsavedinteractionmode\interactionmode + \batchmode + \setbox\xetexcrappyhackbox\vbox{\par}% resets error count + \font\xetextempfont=#2\somefontspec\relax + \edef\xetextempfont{\fontname\xetextempfont}% + \ifx\xetextempfont\nullfontname + \interactionmode\xetexsavedinteractionmode + %\writestatus\m!fonts{fails #1: #2 (\xetextempfont)}% + \expandafter\secondoftwoarguments + \else + \interactionmode\xetexsavedinteractionmode + %\writestatus\m!fonts{succeeds #1: #2 (\xetextempfont)}% + \expandafter\firstoftwoarguments + \fi} + + \def\docheckfontfilenameprefix#1:#2:#3#4\relax + {\edef\!!stringa{#1}% + \edef\!!stringb{#2}% + \ifx\!!stringb\empty + % no prefix + \edef\checkedfontfile{\ifx\@@fontresource\empty\!!stringa\else\@@fontresource\fi}% + \doiffoundxetexfontelse{1a}{"\checkedfontfile\checkedfontfeatures"} + {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}} + {\doiffoundxetexfontelse{1b}{"[\checkedfontfile]\checkedfontfeatures"} + {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}} + {\edef\checkedfontfile{\checkedfontfile}}}% + \else\ifx\!!stringa\v!file + % force file, only file check when no spaces + \edef\checkedfontfile{\ifx\@@fontresource\empty\!!stringb\else\@@fontresource\fi}% + \doiffoundxetexfontelse{2a}{"[\checkedfontfile]\checkedfontfeatures"} + {\edef\checkedfontfile{"[\checkedfontfile]\checkedfontfeatures"}} + {\doiffoundxetexfontelse{2b}{"\checkedfontfile\checkedfontfeatures"} + {\edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}} + {\edef\checkedfontfile{\checkedfontfile}}}% + \else\ifx\!!stringa\v!name + % force name, always lookup by xetex itself, "" forces otf/ttf/type1 + \edef\checkedfontfile{\ifx\@@fontresource\empty\!!stringb\else\@@fontresource\fi}% + \edef\checkedfontfile{"\checkedfontfile\checkedfontfeatures"}% + \else + % whatever, maybe even xetex spec, forget about features + \edef\checkedfontfile{"\ifx\@@fontresource\empty\!!stringa\!!stringb\else\@@fontresource\fi"}% + \fi\fi\fi} + + \def\checkfontfilename% -- todo: integrate so that we call do.. directly + {\expandafter\docheckfontfilename\fontfile*\empty*\relax} + + \def\docheckfontfilename#1*#2#3*#4\relax % class overrules file + {\edef\checkedfontfeatures + {\expandafter\ifx\csname\fontclass\s!features\endcsname\empty + \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi + \else\expandafter\ifx\csname\fontclass\s!features\endcsname\relax % redundant, will go away + \ifx\@@fontfeatures\empty\ifx#2\empty\else#2#3\fi\else\@@fontfeatures\fi + \else + \csname\fontclass\s!features\endcsname + \fi\fi}% + \ifx\checkedfontfeatures\empty + % done + \else + \edef\checkedfontfeatures{\executeifdefined{\??fa\checkedfontfeatures}\empty}% + \ifx\checkedfontfeatures\empty + % done + \else + \let\convertedfontfeatures\empty + \processcommacommand[\checkedfontfeatures]\doconvertfontfeatures % raw + \ifx\convertedfontfeatures\empty + \let\checkedfontfeatures\empty + \else + \edef\checkedfontfeatures{:\convertedfontfeatures}% + \fi + \fi + \fi + \docheckfontfilenameprefix#1:\empty:\empty\relax + \doshowcheckedfontfeatures} + + \def\dodoconvertfontfeatures#1=#2#3=#4\relax + {\ifx#2\empty + % invalid feature + \else\ifcsname @xtx@#1@#2#3\endcsname + \edef\convertedfontfeatures{\convertedfontfeatures\csname @xtx@#1@#2#3\endcsname;}% + \else + \edef\!!stringa{#1}% + \edef\!!stringb{#2#3}% + \edef\convertedfontfeatures + {\convertedfontfeatures + \ifx\!!stringb\v!yes + +\!!stringa + \else\ifx\!!stringb\v!no + -\!!stringa + \else + \!!stringa=\!!stringb + \fi\fi;}% + \fi\fi} + + \def\doconvertfontfeatures#1% + {\dodoconvertfontfeatures#1=\empty=\relax} + + \def\remapfontfeature #1 #2 #3 {\setvalue{@xtx@#1@#2}{#3}} + + % this may move to another file, maybe font-xtx + + \remapfontfeature tlig yes mapping=tex-text + \remapfontfeature tlig no mapping= + \remapfontfeature trep yes mapping=tex-text + \remapfontfeature trep no mapping= + \remapfontfeature texligatures yes mapping=tex-text + \remapfontfeature texligatures no mapping= + \remapfontfeature texquotes yes mapping=tex-text + \remapfontfeature texquotes no mapping= + +\endXETEX + +\let\doshowcheckedfontfeatures\relax + +\def\showcheckedfontfeatures + {\def\doshowcheckedfontfeatures{\writestatus\m!fonts{checked: \checkedfontfile}}} + \def\checkedfontfile{\fontfile} % default +% todo: adapt this to luatex, i.e. no encoding etc mess + \def\donoparsefontspec % #1 == \cs {\edef\fontfile{\truefontname\somefontname}% \ifx\fontfile\s!unknown \let\fontfile\defaultfontfile \fi @@ -1500,7 +1596,7 @@ {\expandafter\font\csname#1\endcsname\lastfontname\relax} \def\definefontglobal#1% stores \somefontname=Mono and \fontfile=cmtt10 - {\expandafter\xdef\csname#1\endcsname + {\expandafter\xdef\csname#1\endcsname % ! ! ! ! not needed in luatex ! ! ! ! {\noexpand\csname#1:\endcsname \noexpand\reactivatefont{\somefontname}{\fontfile}}% \global\expandafter\font\csname#1:\endcsname\lastfontname\relax} @@ -1558,24 +1654,11 @@ %D We also accept \type{sa a}||\type{sa d} as specification. -\beginETEX \ifcsname - \def\checkfontscale#1#2\end#3% {#3\ifcsname\??ft\s!default\noexpand#1\endcsname \csname\??ft\s!default\noexpand#1\endcsname\else#1#2% \fi#3} -\endETEX - -\beginTEX - -\def\checkfontscale#1#2\end#3% - {#3\expandafter\ifx\csname\??ft\s!default\noexpand#1\endcsname\relax - #1#2\else\csname\??ft\s!default\noexpand#1\endcsname - \fi#3} - -\endTEX - %D The duplicate font definition, using the ever the same dummy %D font name, results in less fuzzy error messages. In the log %D file, for instance when overfull boxes are reported, the @@ -1626,6 +1709,8 @@ \def\classfont#1#2{#1#2} % \definefont[whatever][\classfont{xx}{yy} at 10pt] +\beginOLDTEX + \def\definefontsynonym[#1]#2[#3]% {\edef\@@fontfile{#3}% \@EA\let\csname\??ff\fontclass#1\endcsname\@@fontfile @@ -1639,8 +1724,47 @@ \getglobalfontparameters \fi \fi} +\endOLDTEX + +% We need to move the feature into the filename else it may be +% overloaded by another reference. For instance the definition of +% a regular and caps variant can use the same font. + +% We could use an indirect method ... store in 'array' and refer to +% slot. + +\beginNEWTEX + +\def\definefontsynonym[#1]#2[#3]% + {\edef\@@fontname{#1}% + \edef\@@fontfile{#3}% + \doifnextcharelse[\dodefinefontsynonym\nodefinefontsynonym} + +\def\nodefinefontsynonym + {\@EA\let\csname\??ff\fontclass\@@fontname\endcsname\@@fontfile} + +\def\dodefinefontsynonym[#1]% + {\edef\@@fontdata{#1}% + \ifx\@@fontdata\empty + \nodefinefontsynonym + \else + \ifx\fontclass\empty + \getfontparameters + \else + \getglobalfontparameters + \fi + \ifcsname\??ff\@@fontfile\s!features\endcsname + \@EA\edef\csname\??ff\fontclass\@@fontname\endcsname{\@@fontfile*\csname\??ff\@@fontfile\s!features\endcsname}% + \@EA\let\csname\??ff\@@fontfile\s!features\endcsname\undefined + \else + \nodefinefontsynonym + \fi + \fi} + +\endNEWTEX + % \def\resetfontsynonym[#1]% fails -% {\letbeundefined{\??ff\fontclass#1}} +% {\letbeundefined{\??ff\fontclass#1}\letbeundefined{\??ff#1}} \let\definefontfile\definefontsynonym % dedicated to Taco Hoekwater @@ -1658,57 +1782,6 @@ \fi \fi} -\beginTEX - -\def\truefontdata#1#2% - {\expandafter\ifx\csname\??ff#1#2\endcsname\relax - \expandafter\ifx\csname\??ff\fontclass#1\endcsname\relax - \expandafter\ifx\csname\??ff#1\endcsname\relax - \expandafter\ifx\csname\??ff#2\endcsname\relax - \else - % raw(key) - \csname\??ff#2\endcsname - \fi - \else - % exp(Regular) raw(key) - \expandafter\truefontdata\csname\??ff#1\endcsname#2% - \fi - \else - % exp(palatino Regular) raw(key) - \expandafter\truefontdata\csname\??ff\fontclass#1\endcsname#2% - \fi - \else - % raw(Regular) raw(key) - \csname\??ff#1#2\endcsname - \fi} - -\def\truefontname#1% - {\expandafter\ifx\csname\??ff\fontclass#1\endcsname\relax - \expandafter\ifx\csname\??ff#1\endcsname\relax - #1% - \else - \@EA\truefontname\csname\??ff#1\endcsname - \fi - \else - \@EA\truefontname\csname\??ff\fontclass#1\endcsname - \fi} - -\def\expandfontsynonym#1#2% #2 := onelevelexpansion(#1) - {\@EA\ifx\csname\??ff\fontclass#2\endcsname\relax\else - \expandafter\def\expandafter#1\expandafter{\csname\??ff\fontclass#2\endcsname}% - \fi} - -\def\doifelsefontsynonym#1% - {\@EA\ifx\csname\??ff\fontclass#1\endcsname\relax - \expandafter\secondoftwoarguments - \else - \expandafter\firstoftwoarguments - \fi} - -\endTEX - -\beginETEX \ifcsname - \def\truefontdata#1#2% {\ifcsname\??ff#1#2\endcsname % raw(Regular) raw(key) @@ -1724,6 +1797,8 @@ \csname\??ff#2\endcsname \fi\fi\fi\fi} +\beginOLDTEX + \def\truefontname#1% {\ifcsname\??ff\fontclass#1\endcsname \@EA\truefontname\csname\??ff\fontclass#1\endcsname @@ -1733,6 +1808,86 @@ #1% \fi\fi} +\endOLDTEX + +\beginNEWTEX + +% simple version +% +% \def\truefontname#1% +% {\@EA\dotruefontname#1*\relax} +% +% \def\dotruefontname#1*#2\relax +% {\ifcsname\??ff\fontclass#1\endcsname +% \@EA\truefontname\csname\??ff\fontclass#1\endcsname +% \else\ifcsname\??ff#1\endcsname +% \@EA\truefontname\csname\??ff#1\endcsname +% \else +% #1% +% \fi\fi} +% +% last counts +% +% \def\truefontname#1% +% {\@EA\dotruefontname#1*\empty*\relax} +% +% \def\dotruefontname#1*#2#3*#4\relax +% {\ifcsname\??ff\fontclass#1\endcsname +% \ifx#2\empty +% \@EA\truefontname\csname\??ff\fontclass#1\endcsname +% \else +% \@EA\truefontname\csname\??ff\fontclass#1\endcsname*#2#3% +% \fi +% \else\ifcsname\??ff#1\endcsname +% \ifx#2\empty +% \@EA\truefontname\csname\??ff#1\endcsname +% \else +% \@EA\truefontname\csname\??ff#1\endcsname*#2#3% +% \fi +% \else +% \ifx#2\empty +% #1% +% \else +% #1*#2#3% +% \fi +% \fi\fi} +% +% first counts + +\def\truefontname#1% + {\@EA\dotruefontname#1*\empty*\relax} + +\def\dotruefontname#1*#2#3*#4\relax + {\ifcsname\??ff\fontclass#1\endcsname + \ifx#2\empty + \@EA\truefontname\csname\??ff\fontclass#1\endcsname + \else + \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname*#2#3% + \fi + \else\ifcsname\??ff#1\endcsname + \ifx#2\empty + \@EA\truefontname\csname\??ff#1\endcsname + \else + \@EA\redotruefontname\csname\??ff#1\endcsname*#2#3% + \fi + \else + #1\ifx#2\empty\else*#2#3\fi + \fi\fi} + +\def\redotruefontname#1% + {\@EA\dodotruefontname#1*\relax} + +\def\dodotruefontname#1*#2\relax + {\ifcsname\??ff\fontclass#1\endcsname + \@EA\redotruefontname\csname\??ff\fontclass#1\endcsname + \else\ifcsname\??ff#1\endcsname + \@EA\redotruefontname\csname\??ff#1\endcsname + \else + #1% + \fi\fi} + +\endNEWTEX + \def\expandfontsynonym#1#2% #2 := onelevelexpansion(#1) {\ifcsname\??ff\fontclass#2\endcsname \expandafter\def\expandafter#1\expandafter{\csname\??ff\fontclass#2\endcsname}% @@ -1744,8 +1899,6 @@ \else \expandafter\secondoftwoarguments \fi} - -\endETEX % \definetypeface[palatino][rm][serif][palatino,allbold][default] % @@ -1775,30 +1928,6 @@ %D %D A goody: -\beginTEX - -\def\tracedfontencoding#1% - {\expandafter\ifx\csname\??ff#1\s!encoding\endcsname\relax\else - \space[\csname\??ff#1\s!encoding\endcsname]% - \fi} - -\def\tracedfontname#1% - {\expandafter\ifx\csname\??ff\fontclass#1\endcsname\relax - \expandafter\ifx\csname\??ff#1\endcsname\relax - #1% - \else - #1\tracedfontencoding{#1}\space->\space - \@EA\tracedfontname\csname\??ff#1\endcsname - \fi - \else - #1\tracedfontencoding{\fontclass#1}\space->\space - \@EA\tracedfontname\csname\??ff\fontclass#1\endcsname - \fi} - -\endTEX - -\beginETEX - \def\tracedfontencoding#1% {\ifcsname\??ff#1\s!encoding\endcsname \space[\csname\??ff#1\s!encoding\endcsname]% @@ -1814,8 +1943,6 @@ \else #1% \fi\fi} - -\endETEX %D \macros %D {getfontfileparameters} @@ -1860,17 +1987,7 @@ %D \definefont[Text][LucidaBright sa 5.4] \Text last %D \stoptyping %D -%D The implementation one looks familiar: - -% The simple implementation is: -% -% \def\definefont -% {\dodoubleargument\dodefinefont} -% -% \def\dodefinefont[#1][#2]% -% {\doifinstringelse{ }{#2} -% {\unexpanded\setvalue{#1}{\dododefinefont{#1}{#2}}} -% {\dodefinefont[#1][#2 sa 1]}} +%D The implementation looks as follows: \def\definefont {\dotripleempty\dodefinefont} @@ -1884,14 +2001,6 @@ \fi} {\definefont[#1][#2 sa *][#3]}} -%\def\redodefinefont#1#2#3% -% {\dododefinefont{#1}{#2}% -% \doifnumberelse{#3} -% {\setupinterlinespace[#3]\setupspacing} -% {\doifassignmentelse{#3} -% {\setupinterlinespace[#3]\setupspacing} -% {\setups[#3]}}} % so, we can have setups associated to fonts ! - \def\redodefinefont#1#2#3% {\dododefinefont{#1}{#2}% \doifsetupselse{#3} @@ -1899,6 +2008,13 @@ {\setuplocalinterlinespace[#3]% \setupspacing}} % needed ? +\def\definefrozenfont + {\dotripleempty\dodefinefrozenfont} + +\def\dodefinefrozenfont[#1][#2][#3]% + {\dodefinefont[#1][#2][#3]% + \expandafter\let\csname\lastfontidentifier\expandafter\endcsname\csname\rawfontidentifier\endcsname} + % \def\defineclassfont % {\doquadrupleempty\dodefineclassfont} % @@ -1940,28 +2056,6 @@ \setfontcharacteristics \the\everyfontswitch} -\beginTEX - -\def\xxdododefinefont#1#2#3#4% \autofontsizetrue is set by calling routine - {\edef\lastfontidentifier{#3}% - \@EA\ifx\csname\newfontidentifier\endcsname\relax - \def\localrelativefontsize{#1}% - \def\localabsolutefontsize{#2}% - \parsefontspec{#4}\newfontidentifier - \let\localrelativefontsize\defaultrelativefontsize % not needed - \fi - \csname\newfontidentifier\endcsname - \autofontsizefalse - %\edef\lastfontidentifier{#3}% - \ifskipfontcharacteristics \else - \setfontcharacteristics - \the\everyfontswitch - \fi} - -\endTEX - -\beginETEX \ifcsname - \def\xxdododefinefont#1#2#3#4% \autofontsizetrue is set by calling routine {\edef\lastfontidentifier{#3}% \ifcsname\newfontidentifier\endcsname\else @@ -1978,8 +2072,6 @@ \the\everyfontswitch \fi} -\endETEX - %D I considered checking for mistakenly use of \PLAIN's %D \type{\magstep}'s but although it would take only a few %D lines of code, this would not add to consistent use. I @@ -2020,19 +2112,6 @@ {\scratchdimen#1\relax % \relax is really needed here \setvalue{\??ft*\the\scratchdimen}{#2}} -\beginTEX - -\def\setmappedfontsize#1% - {\expandafter\ifx\csname\??ft*#1\endcsname\relax - #1% - \else - \csname\??ft*#1\endcsname - \fi} - -\endTEX - -\beginETEX \ifcsname - \def\setmappedfontsize#1% {\ifcsname\??ft*#1\endcsname \csname\??ft*#1\endcsname @@ -2040,8 +2119,6 @@ #1% \fi} -\endETEX - %D \macros %D {getfontname} %D @@ -2083,34 +2160,6 @@ %D returns the current scaling factor. Take a look at %D \type {cont-log.tex} for an example of its use. -\beginTEX - -\def\currentfontscale - {\@EA\ifx\csname\??ft\s!default\xfontsize\endcsname\relax - \@EA\ifx\csname\??ft\s!default\s!text\endcsname\relax - 1% - \else - \csname\??ft\s!default\s!text\endcsname - \fi - \else - \csname\??ft\s!default\xfontsize\endcsname - \fi} - -\def\currentfontbodyscale - {\@EA\ifx\csname\??ft\s!default\fontsize\endcsname\relax - \@EA\ifx\csname\??ft\s!default\s!text\endcsname\relax - 1% - \else - \csname\??ft\s!default\s!text\endcsname - \fi - \else - \csname\??ft\s!default\fontsize\endcsname - \fi} - -\endTEX - -\beginETEX \ifcsname - \def\currentfontscale {\csname\??ft\s!default \ifcsname\??ft\s!default\xfontsize\endcsname \xfontsize \else @@ -2123,8 +2172,6 @@ \ifcsname\??ft\s!default\s!text \endcsname \s!text \fi\fi \endcsname} -\endETEX - \setvalue{\??ft\s!default}{1} %D Both alternatives use \type {\xfontsize}, a macro that @@ -2318,20 +2365,9 @@ %D Just a couple of interface macros: -\beginTEX - -\def\bodyfontvariable#1% - {\??ft\@EA\ifx\csname\??ft\fontclass#1\endcsname\relax\else\fontclass\fi#1} - -\endTEX - -\beginETEX \ifcsname - \def\bodyfontvariable#1% {\??ft\ifcsname\??ft\fontclass#1\endcsname\fontclass\fi#1} -\endETEX - \def\bodyfontcsname {\csname\bodyfontvariable} @@ -3176,22 +3212,6 @@ \the\everyfontswitch \fi} -\beginTEX - -\def\dofontstrategy#1#2#3#4#5% - {\@EA\ifx\csname#2#3#4#5\endcsname\relax\else - #1\csname#2#3#4#5\endcsname \tryingfontfalse - \fi} - -\def\dofontclassstrategy#1#2#3#4#5% - {\@EA\ifx\csname\fontclass#2#3#4#5\endcsname\relax\else - #1\csname\fontclass#2#3#4#5\endcsname \tryingfontfalse - \fi} - -\endTEX - -\beginETEX \ifcsname - \def\dofontstrategy#1#2#3#4#5% {\ifcsname#2#3#4#5\endcsname #1\csname#2#3#4#5\endcsname \tryingfontfalse @@ -3202,8 +3222,6 @@ #1\csname\fontclass#2#3#4#5\endcsname \tryingfontfalse \fi} -\endETEX - \appendtoks \iftryingfont \fontstrategy \autofontsizefalse % --- --- --- --- % pt tt bf a \fontbody \fontstyle \fontalternative \fontsize \fi \to \fontstrategies @@ -3245,20 +3263,6 @@ %D in text mode the values defined by the bodyfontenvironment are %D used. Here we also set \type{\currentxfontsize}. -\beginTEX - -\def\dosetcurrentfontxxxalternative#1#2#3#4% - {\chardef\currentxfontsize#2\relax - \ifmmode - #4% - \else\expandafter\ifx\csname\bodyfontvariable{\normalizedbodyfontsize#3}\endcsname\relax\else - \setcurrentfontbodyalternative{\bodyfontcsname\normalizedbodyfontsize#3\endcsname}{#1}% - \fi\fi} - -\endTEX - -\beginETEX \ifcsname - \def\dosetcurrentfontxxxalternative#1#2#3#4% {\chardef\currentxfontsize#2\relax \ifmmode @@ -3267,8 +3271,6 @@ \setcurrentfontbodyalternative{\bodyfontcsname\normalizedbodyfontsize#3\endcsname}{#1}% \fi\fi} -\endETEX - \def\setcurrentfontxalternative#1% {\dosetcurrentfontxxxalternative{#1}1\c!x\scriptstyle \let\tx\txx} @@ -3488,24 +3490,6 @@ %D The following alternative is meant for math||to||text %D switching and will be optimized. -\beginTEX - -\def\fastswitchtobodyfont#1% - {\@EA\ifx\csname\??ft\normalizedbodyfontsize#1\endcsname\else - \edef\futurebodyfontsize - {\csname\??ft\normalizedbodyfontsize#1\endcsname}% - \@EA\ifx\csname\@size@\futurebodyfontsize\endcsname\else - \csname\@size@\futurebodyfontsize\endcsname - \localbodyfontsize\futurebodyfontsize\relax - \fi - \fi - \csname\@style@\fontstyle\endcsname - \the\everybodyfont} - -\endTEX - -\beginETEX \ifcsname - \def\fastswitchtobodyfont#1% {\ifcsname\??ft\normalizedbodyfontsize#1\endcsname \edef\futurebodyfontsize @@ -3518,8 +3502,6 @@ \csname\@style@\fontstyle\endcsname \the\everybodyfont} -\endETEX - %D Because the last macro can appear in arguments or be assigned %D to parameters, we protect this one for unwanted expansion. @@ -3532,19 +3514,8 @@ \scriptfont \mrfam\scriptfont \mffam \scriptscriptfont\mrfam\scriptscriptfont\mffam} -\beginTEX - - \def\domffam#1% - {\csname\ifundefined{#1\s!fam}\c!nn\else#1\fi\s!fam\endcsname} - -\endTEX - -\beginETEX \ifcsname - - \def\domffam#1% - {\csname\ifcsname#1\s!fam\endcsname#1\else\c!nn\fi\s!fam\endcsname} - -\endETEX +\def\domffam#1% + {\csname\ifcsname#1\s!fam\endcsname#1\else\c!nn\fi\s!fam\endcsname} \def\mffam {\domffam\fontalternative} @@ -3608,6 +3579,18 @@ \ifx\mkdefinefontfeature\undefined \let\mkdefinefontfeature\gobbletwoarguments \fi +\definefontfeature + [default] + [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes] % texligatures=yes,texquotes=yes + +\definefontfeature + [smallcaps] + [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes,smcp=yes] % texligatures=yes,texquotes=yes + +\definefontfeature + [oldstyle] + [script=latn,language=dflt,liga=yes,kern=yes,tlig=yes,trep=yes,onum=yes] % texligatures=yes,texquotes=yes + %D The next auxilliary macro is an alternative to \type %D {\fontname}. @@ -4296,8 +4279,6 @@ % \def\fontstringC{\executeifdefined{\??ff:s:\fontstyle}\empty} % \def\fontstringD{\executeifdefined{\??ff:t:\csname\??tf\fontclass\s!default\endcsname}\s!Serif} -\beginETEX \ifcsname - \def\glyphfontfile#1% {#1% \ifcsname\??ff#1\fontstringA\fontstringC\endcsname @@ -4312,25 +4293,6 @@ \fontstringC \fi\fi\fi\fi\fi} -\endETEX - -\beginTEX - -\def\glyphfontfile#1% - {#1% - \expandafter\ifx\csname\??ff#1\fontstringA\fontstringC\endcsname\relax - \expandafter\ifx\csname\??ff#1\fontstringB\fontstringC\endcsname\relax - \expandafter\ifx\csname\??ff#1\fontstringA\endcsname\relax - \expandafter\ifx\csname\??ff#1\fontstringB\endcsname\relax - \expandafter\ifx\csname\??ff#1\fontstringC\endcsname\relax - \else \fontstringC \fi - \else \fontstringB \fi - \else \fontstringA \fi - \else \fontstringB\fontstringC \fi - \else \fontstringA\fontstringC \fi} - -\endTEX - %D The next macro can be used to make decisions based on the shape: \def\doifitalicelse#1#2% @@ -4914,22 +4876,6 @@ %D \doiffontpresentelse{adam-lindsay-modern-serif}{YES}{NO} %D \stoptyping -\beginTEX - -\def\doiffontpresentelse#1% - {\bgroup - \batchmode\font\dummy=\truefontname{#1}\errorstopmode - \edef\lastfontname{\fontname\dummy}% - \ifx\lastfontname\nullfontname - \egroup\expandafter\secondoftwoarguments - \else - \egroup\expandafter\firstoftwoarguments - \fi} - -\endTEX - -\beginETEX \interactionmode - \def\doiffontpresentelse#1% {\bgroup \scratchcounter\interactionmode @@ -4943,6 +4889,4 @@ \egroup\expandafter\firstoftwoarguments \fi} -\endETEX - \protect \endinput diff --git a/tex/context/base/font-map.lua b/tex/context/base/font-map.lua new file mode 100644 index 000000000..4aecde445 --- /dev/null +++ b/tex/context/base/font-map.lua @@ -0,0 +1,172 @@ +if not modules then modules = { } end modules ['font-map'] = { + version = 1.001, + comment = "companion to font-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

Eventually this code will disappear because map files are kind +of obsolete. Some code may move to runtime or auxiliary modules.

+--ldx]]-- + +fonts = fonts or { } +fonts.map = fonts.map or { } +fonts.map.data = fonts.map.data or { } +fonts.map.done = fonts.map.done or { } +fonts.map.line = fonts.map.line or { } +fonts.map.loaded = fonts.map.loaded or { } +fonts.map.direct = fonts.map.direct or { } + +function fonts.map.line.pdfmapline(tag,str) + return "\\loadmapline[" .. tag .. "][" .. str .. "]" +end + +function fonts.map.line.pdftex(e) -- so far no combination of slant and stretch + if e.name and e.file then + local fullname = e.fullname or "" + if e.slant and tonumber(e.slant) ~= 0 then + if e.encoding then + return fonts.map.line.pdfmapline("=",string.format('%s %s "%g SlantFont" <%s <%s',e.name,fullname,e.slant,e.encoding,e.file)) + else + return fonts.map.line.pdfmapline("=",string.format('%s %s "%g SlantFont" <%s',e.name,fullname,e.slant,e.file)) + end + elseif e.stretch and tonumber(e.stretch) ~= 1 and tonumber(e.stretch) ~= 0 then + if e.encoding then + return fonts.map.line.pdfmapline("=",string.format('%s %s "%g ExtendFont" <%s <%s',e.name,fullname,e.stretch,e.encoding,e.file)) + else + return fonts.map.line.pdfmapline("=",string.format('%s %s "%g ExtendFont" <%s',e.name,fullname,e.stretch,e.file)) + end + else + if e.encoding then + return fonts.map.line.pdfmapline("=",string.format('%s %s <%s <%s',e.name,fullname,e.encoding,e.file)) + else + return fonts.map.line.pdfmapline("=",string.format('%s %s <%s',e.name,fullname,e.file)) + end + end + else + return nil + end +end + +function fonts.map.flushlines(backend,separator) + local t = { } + for k,v in pairs(fonts.map.data) do + if not fonts.map.done[k] then + local str = fonts.map.line[backend](v) + if str then + t[#t+1] = str + end + fonts.map.done[k] = true + end + end + return table.join(t,separator or "") +end + +fonts.map.line.dvips = fonts.map.line.pdftex +fonts.map.line.dvipdfmx = function() end + +function fonts.map.process_entries(filename, backend, handle) + local root = xml.load(filename,true) + if root then + if not handle then handle = texio.write_nl end + xml.process_attributes(root, "/fontlist/font", function(e,k) + local str = fonts.map.line[backend](e) + if str then + handle(str) + end + end) + end +end + +function fonts.map.convert_entries(filename) + if not fonts.map.loaded[filename] then + local root = xml.load(filename,true) -- todo: stop garbage collector + if root then + garbagecollector.push() + xml.process_attributes(root, "/fontlist/font", function(e,k) + if e.name and e.file then + fonts.map.data[e.name] = e + -- fonts.map.data[e.name].name = nil -- beware, deletes xml entry as well + end + end) + garbagecollector.pop() + end + fonts.map.loaded[filename] = true + end +end + +function fonts.map.direct.pdftex(filename) + fonts.map.process_entries(filename,'pdftex',function(str) + tex.sprint(tex.ctxcatcodes,str) + end) +end + +-- the next one will go to a runtime module, no need to put this in the format + +function fonts.map.convert_file(filename, handle) -- when handle is string, then assume file + local f, g = io.open(filename), nil + if f then + if not handle then + handle = print + elseif type(handle) == "string" then + g = io.open(handle,"w") + function handle(str) + g:write(str .. "\n") + end + end + handle("\n") + handle(string.format("\n", "generated by context")) + handle(string.format("\n", filename)) + for line in f:lines() do + local comment = line:match("^[%#%%]%s*(.*)%s*$") + if comment then -- todo: optional + handle(string.format(" ", comment)) + elseif line:find("^\s*$") then + handle("") + else + name, fullname, spec, encoding, file = line:match("^(%S+)%s+(%S-)%s*\"([^\"]-)\"%s*<%s*(%S-)%s*<%s*(%S-)%s*$") + if not name then + name, fullname, spec, file = line:match("^(%S+)%s+(%S-)%s*\"([^\"]-)\"%s*<%s*(%S-)%s*$") + end + if not name then + name, fullname, encoding, file = line:match("^(%S+)%s+(%S-)%s*<%s*(%S-)%s*<%s*(%S-)%s*$") + end + if not name then + name, fullname, file = line:match("^(%S+)%s+(%S-)%s*<%s*(%S-)%s*$") + end + if name and name ~= "" and file and file ~= "" then + t = { } + if name then t[#t+1] = string.format("name='%s'" , name) end + if fullname and fullname ~= "" then t[#t+1] = string.format("fullname='%s'", fullname) end + if encoding and encoding ~= "" then t[#t+1] = string.format("encoding='%s'", encoding) end + if file then t[#t+1] = string.format("file='%s'" , file) end + if spec then + local a, b = spec:match("^([%d%.])%s+(%a+)$") + if a and b and b == "ExtendFont" then t[#t+1] = string.format("slant='%s'" , a) end + if a and b and b == "SlantFont" then t[#t+1] = string.format("stretch='%s'", a) end + end + handle(string.format(" ",table.concat(t," "))) + end + end + end + handle("\n") + f:close() + if g then g:close() end + end +end + +--~ fonts.map.convert_file("c:/data/develop/tex/texmf/fonts/map/dvips/lm/lm-ec.map") +--~ fonts.map.convert_file("maptest.map") +--~ fonts.map.convert_file("maptest.map", "maptest-1.xml") +--~ fonts.map.convert_file("c:/data/develop/tex/texmf/fonts/map/pdftex/updmap/pdftex.map") +--~ fonts.map.convert_file("c:/data/develop/tex/texmf/fonts/map/pdftex/updmap/pdftex.map", "maptest-2.xml") + +--~ fonts.map.convert_entries('maptest-2.xml') +--~ fonts.map.process_entries('maptest.xml','pdftex') + +--~ print(table.serialize(fonts.map.data)) + +--~ tex.sprint(fonts.map.flushlines("pdftex","\n")) +--~ str = fonts.map.flushlines("pdftex") diff --git a/tex/context/base/font-otf.lua b/tex/context/base/font-otf.lua new file mode 100644 index 000000000..c6a100566 --- /dev/null +++ b/tex/context/base/font-otf.lua @@ -0,0 +1,3416 @@ +if not modules then modules = { } end modules ['font-otf'] = { + version = 1.001, + comment = "companion to font-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +-- otfdata zit in tfmdata / check + +--~ function string:split_at_space() +--~ local t = { } +--~ for s in self:gmatch("(%S+)") do +--~ t[#t+1] = s +--~ end +--~ return t +--~ end + +-- beware, the node related functions need to return head, current -- todo +-- we may move marks to components so that parsing is faster + +-- using for i=1,#t do ... t[i] ... end is much faster than using ipairs +-- copying some functions is faster than sharing code chunks esp here + +--[[ldx-- +

This module is sparesely documented because it is a moving target. +The table format of the reader changes and we experiment a lot with +different methods for supporting features.

+ +

As with the code, we may decide to store more information +in the table.

+--ldx]]-- + +fonts = fonts or { } +fonts.otf = fonts.otf or { } +fonts.otf.version = 1.56 -- incrementing this number one up will force a re-cache +fonts.otf.tables = fonts.otf.tables or { } +fonts.otf.meanings = fonts.otf.meanings or { } +fonts.otf.enhance_data = false +fonts.otf.syncspace = true +fonts.otf.features = { } +fonts.otf.features.aux = { } +fonts.otf.features.data = { } +fonts.otf.features.list = { } -- not (yet) used, oft fonts have gpos/gsub lists +fonts.otf.features.default = { } +fonts.otf.trace_features = false +fonts.otf.trace_replacements = false +fonts.otf.trace_contexts = false +fonts.otf.trace_anchors = false +fonts.otf.trace_ligatures = false +fonts.otf.trace_kerns = false +fonts.otf.notdef = false +fonts.otf.cache = containers.define("fonts", "otf", fonts.otf.version, true) + +--[[ldx-- +

We start with a lot of tables and related functions.

+--ldx]]-- + +fonts.otf.tables.scripts = { + ['dflt'] = 'Default', + + ['arab'] = 'Arabic', + ['armn'] = 'Armenian', + ['bali'] = 'Balinese', + ['beng'] = 'Bengali', + ['bopo'] = 'Bopomofo', + ['brai'] = 'Braille', + ['bugi'] = 'Buginese', + ['buhd'] = 'Buhid', + ['byzm'] = 'Byzantine Music', + ['cans'] = 'Canadian Syllabics', + ['cher'] = 'Cherokee', + ['copt'] = 'Coptic', + ['cprt'] = 'Cypriot Syllabary', + ['cyrl'] = 'Cyrillic', + ['deva'] = 'Devanagari', + ['dsrt'] = 'Deseret', + ['ethi'] = 'Ethiopic', + ['geor'] = 'Georgian', + ['glag'] = 'Glagolitic', + ['goth'] = 'Gothic', + ['grek'] = 'Greek', + ['gujr'] = 'Gujarati', + ['guru'] = 'Gurmukhi', + ['hang'] = 'Hangul', + ['hani'] = 'CJK Ideographic', + ['hano'] = 'Hanunoo', + ['hebr'] = 'Hebrew', + ['ital'] = 'Old Italic', + ['jamo'] = 'Hangul Jamo', + ['java'] = 'Javanese', + ['kana'] = 'Hiragana and Katakana', + ['khar'] = 'Kharosthi', + ['khmr'] = 'Khmer', + ['knda'] = 'Kannada', + ['lao' ] = 'Lao', + ['latn'] = 'Latin', + ['limb'] = 'Limbu', + ['linb'] = 'Linear B', + ['math'] = 'Mathematical Alphanumeric Symbols', + ['mlym'] = 'Malayalam', + ['mong'] = 'Mongolian', + ['musc'] = 'Musical Symbols', + ['mymr'] = 'Myanmar', + ['nko' ] = "N'ko", + ['ogam'] = 'Ogham', + ['orya'] = 'Oriya', + ['osma'] = 'Osmanya', + ['phag'] = 'Phags-pa', + ['phnx'] = 'Phoenician', + ['runr'] = 'Runic', + ['shaw'] = 'Shavian', + ['sinh'] = 'Sinhala', + ['sylo'] = 'Syloti Nagri', + ['syrc'] = 'Syriac', + ['tagb'] = 'Tagbanwa', + ['tale'] = 'Tai Le', + ['talu'] = 'Tai Lu', + ['taml'] = 'Tamil', + ['telu'] = 'Telugu', + ['tfng'] = 'Tifinagh', + ['tglg'] = 'Tagalog', + ['thaa'] = 'Thaana', + ['thai'] = 'Thai', + ['tibt'] = 'Tibetan', + ['ugar'] = 'Ugaritic Cuneiform', + ['xpeo'] = 'Old Persian Cuneiform', + ['xsux'] = 'Sumero-Akkadian Cuneiform', + ['yi' ] = 'Yi' +} + +fonts.otf.tables.languages = { + ['dflt'] = 'Default', + + ['aba'] = 'Abaza', + ['abk'] = 'Abkhazian', + ['ady'] = 'Adyghe', + ['afk'] = 'Afrikaans', + ['afr'] = 'Afar', + ['agw'] = 'Agaw', + ['als'] = 'Alsatian', + ['alt'] = 'Altai', + ['amh'] = 'Amharic', + ['ara'] = 'Arabic', + ['ari'] = 'Aari', + ['ark'] = 'Arakanese', + ['asm'] = 'Assamese', + ['ath'] = 'Athapaskan', + ['avr'] = 'Avar', + ['awa'] = 'Awadhi', + ['aym'] = 'Aymara', + ['aze'] = 'Azeri', + ['bad'] = 'Badaga', + ['bag'] = 'Baghelkhandi', + ['bal'] = 'Balkar', + ['bau'] = 'Baule', + ['bbr'] = 'Berber', + ['bch'] = 'Bench', + ['bcr'] = 'Bible Cree', + ['bel'] = 'Belarussian', + ['bem'] = 'Bemba', + ['ben'] = 'Bengali', + ['bgr'] = 'Bulgarian', + ['bhi'] = 'Bhili', + ['bho'] = 'Bhojpuri', + ['bik'] = 'Bikol', + ['bil'] = 'Bilen', + ['bkf'] = 'Blackfoot', + ['bli'] = 'Balochi', + ['bln'] = 'Balante', + ['blt'] = 'Balti', + ['bmb'] = 'Bambara', + ['bml'] = 'Bamileke', + ['bos'] = 'Bosnian', + ['bre'] = 'Breton', + ['brh'] = 'Brahui', + ['bri'] = 'Braj Bhasha', + ['brm'] = 'Burmese', + ['bsh'] = 'Bashkir', + ['bti'] = 'Beti', + ['cat'] = 'Catalan', + ['ceb'] = 'Cebuano', + ['che'] = 'Chechen', + ['chg'] = 'Chaha Gurage', + ['chh'] = 'Chattisgarhi', + ['chi'] = 'Chichewa', + ['chk'] = 'Chukchi', + ['chp'] = 'Chipewyan', + ['chr'] = 'Cherokee', + ['chu'] = 'Chuvash', + ['cmr'] = 'Comorian', + ['cop'] = 'Coptic', + ['cos'] = 'Corsican', + ['cre'] = 'Cree', + ['crr'] = 'Carrier', + ['crt'] = 'Crimean Tatar', + ['csl'] = 'Church Slavonic', + ['csy'] = 'Czech', + ['dan'] = 'Danish', + ['dar'] = 'Dargwa', + ['dcr'] = 'Woods Cree', + ['deu'] = 'German', + ['dgr'] = 'Dogri', + ['div'] = 'Divehi', + ['djr'] = 'Djerma', + ['dng'] = 'Dangme', + ['dnk'] = 'Dinka', + ['dri'] = 'Dari', + ['dun'] = 'Dungan', + ['dzn'] = 'Dzongkha', + ['ebi'] = 'Ebira', + ['ecr'] = 'Eastern Cree', + ['edo'] = 'Edo', + ['efi'] = 'Efik', + ['ell'] = 'Greek', + ['eng'] = 'English', + ['erz'] = 'Erzya', + ['esp'] = 'Spanish', + ['eti'] = 'Estonian', + ['euq'] = 'Basque', + ['evk'] = 'Evenki', + ['evn'] = 'Even', + ['ewe'] = 'Ewe', + ['fan'] = 'French Antillean', + ['far'] = 'Farsi', + ['fin'] = 'Finnish', + ['fji'] = 'Fijian', + ['fle'] = 'Flemish', + ['fne'] = 'Forest Nenets', + ['fon'] = 'Fon', + ['fos'] = 'Faroese', + ['fra'] = 'French', + ['fri'] = 'Frisian', + ['frl'] = 'Friulian', + ['fta'] = 'Futa', + ['ful'] = 'Fulani', + ['gad'] = 'Ga', + ['gae'] = 'Gaelic', + ['gag'] = 'Gagauz', + ['gal'] = 'Galician', + ['gar'] = 'Garshuni', + ['gaw'] = 'Garhwali', + ['gez'] = "Ge'ez", + ['gil'] = 'Gilyak', + ['gmz'] = 'Gumuz', + ['gon'] = 'Gondi', + ['grn'] = 'Greenlandic', + ['gro'] = 'Garo', + ['gua'] = 'Guarani', + ['guj'] = 'Gujarati', + ['hai'] = 'Haitian', + ['hal'] = 'Halam', + ['har'] = 'Harauti', + ['hau'] = 'Hausa', + ['haw'] = 'Hawaiin', + ['hbn'] = 'Hammer-Banna', + ['hil'] = 'Hiligaynon', + ['hin'] = 'Hindi', + ['hma'] = 'High Mari', + ['hnd'] = 'Hindko', + ['ho'] = 'Ho', + ['hri'] = 'Harari', + ['hrv'] = 'Croatian', + ['hun'] = 'Hungarian', + ['hye'] = 'Armenian', + ['ibo'] = 'Igbo', + ['ijo'] = 'Ijo', + ['ilo'] = 'Ilokano', + ['ind'] = 'Indonesian', + ['ing'] = 'Ingush', + ['inu'] = 'Inuktitut', + ['iri'] = 'Irish', + ['irt'] = 'Irish Traditional', + ['isl'] = 'Icelandic', + ['ism'] = 'Inari Sami', + ['ita'] = 'Italian', + ['iwr'] = 'Hebrew', + ['jan'] = 'Japanese', + ['jav'] = 'Javanese', + ['jii'] = 'Yiddish', + ['jud'] = 'Judezmo', + ['jul'] = 'Jula', + ['kab'] = 'Kabardian', + ['kac'] = 'Kachchi', + ['kal'] = 'Kalenjin', + ['kan'] = 'Kannada', + ['kar'] = 'Karachay', + ['kat'] = 'Georgian', + ['kaz'] = 'Kazakh', + ['keb'] = 'Kebena', + ['kge'] = 'Khutsuri Georgian', + ['kha'] = 'Khakass', + ['khk'] = 'Khanty-Kazim', + ['khm'] = 'Khmer', + ['khs'] = 'Khanty-Shurishkar', + ['khv'] = 'Khanty-Vakhi', + ['khw'] = 'Khowar', + ['kik'] = 'Kikuyu', + ['kir'] = 'Kirghiz', + ['kis'] = 'Kisii', + ['kkn'] = 'Kokni', + ['klm'] = 'Kalmyk', + ['kmb'] = 'Kamba', + ['kmn'] = 'Kumaoni', + ['kmo'] = 'Komo', + ['kms'] = 'Komso', + ['knr'] = 'Kanuri', + ['kod'] = 'Kodagu', + ['koh'] = 'Korean Old Hangul', + ['kok'] = 'Konkani', + ['kon'] = 'Kikongo', + ['kop'] = 'Komi-Permyak', + ['kor'] = 'Korean', + ['koz'] = 'Komi-Zyrian', + ['kpl'] = 'Kpelle', + ['kri'] = 'Krio', + ['krk'] = 'Karakalpak', + ['krl'] = 'Karelian', + ['krm'] = 'Karaim', + ['krn'] = 'Karen', + ['krt'] = 'Koorete', + ['ksh'] = 'Kashmiri', + ['ksi'] = 'Khasi', + ['ksm'] = 'Kildin Sami', + ['kui'] = 'Kui', + ['kul'] = 'Kulvi', + ['kum'] = 'Kumyk', + ['kur'] = 'Kurdish', + ['kuu'] = 'Kurukh', + ['kuy'] = 'Kuy', + ['kyk'] = 'Koryak', + ['lad'] = 'Ladin', + ['lah'] = 'Lahuli', + ['lak'] = 'Lak', + ['lam'] = 'Lambani', + ['lao'] = 'Lao', + ['lat'] = 'Latin', + ['laz'] = 'Laz', + ['lcr'] = 'L-Cree', + ['ldk'] = 'Ladakhi', + ['lez'] = 'Lezgi', + ['lin'] = 'Lingala', + ['lma'] = 'Low Mari', + ['lmb'] = 'Limbu', + ['lmw'] = 'Lomwe', + ['lsb'] = 'Lower Sorbian', + ['lsm'] = 'Lule Sami', + ['lth'] = 'Lithuanian', + ['ltz'] = 'Luxembourgish', + ['lub'] = 'Luba', + ['lug'] = 'Luganda', + ['luh'] = 'Luhya', + ['luo'] = 'Luo', + ['lvi'] = 'Latvian', + ['maj'] = 'Majang', + ['mak'] = 'Makua', + ['mal'] = 'Malayalam Traditional', + ['man'] = 'Mansi', + ['map'] = 'Mapudungun', + ['mar'] = 'Marathi', + ['maw'] = 'Marwari', + ['mbn'] = 'Mbundu', + ['mch'] = 'Manchu', + ['mcr'] = 'Moose Cree', + ['mde'] = 'Mende', + ['men'] = "Me'en", + ['miz'] = 'Mizo', + ['mkd'] = 'Macedonian', + ['mle'] = 'Male', + ['mlg'] = 'Malagasy', + ['mln'] = 'Malinke', + ['mlr'] = 'Malayalam Reformed', + ['mly'] = 'Malay', + ['mnd'] = 'Mandinka', + ['mng'] = 'Mongolian', + ['mni'] = 'Manipuri', + ['mnk'] = 'Maninka', + ['mnx'] = 'Manx Gaelic', + ['moh'] = 'Mohawk', + ['mok'] = 'Moksha', + ['mol'] = 'Moldavian', + ['mon'] = 'Mon', + ['mor'] = 'Moroccan', + ['mri'] = 'Maori', + ['mth'] = 'Maithili', + ['mts'] = 'Maltese', + ['mun'] = 'Mundari', + ['nag'] = 'Naga-Assamese', + ['nan'] = 'Nanai', + ['nas'] = 'Naskapi', + ['ncr'] = 'N-Cree', + ['ndb'] = 'Ndebele', + ['ndg'] = 'Ndonga', + ['nep'] = 'Nepali', + ['new'] = 'Newari', + ['ngr'] = 'Nagari', + ['nhc'] = 'Norway House Cree', + ['nis'] = 'Nisi', + ['niu'] = 'Niuean', + ['nkl'] = 'Nkole', + ['nko'] = "N'ko", + ['nld'] = 'Dutch', + ['nog'] = 'Nogai', + ['nor'] = 'Norwegian', + ['nsm'] = 'Northern Sami', + ['nta'] = 'Northern Tai', + ['nto'] = 'Esperanto', + ['nyn'] = 'Nynorsk', + ['oci'] = 'Occitan', + ['ocr'] = 'Oji-Cree', + ['ojb'] = 'Ojibway', + ['ori'] = 'Oriya', + ['oro'] = 'Oromo', + ['oss'] = 'Ossetian', + ['paa'] = 'Palestinian Aramaic', + ['pal'] = 'Pali', + ['pan'] = 'Punjabi', + ['pap'] = 'Palpa', + ['pas'] = 'Pashto', + ['pgr'] = 'Polytonic Greek', + ['pil'] = 'Pilipino', + ['plg'] = 'Palaung', + ['plk'] = 'Polish', + ['pro'] = 'Provencal', + ['ptg'] = 'Portuguese', + ['qin'] = 'Chin', + ['raj'] = 'Rajasthani', + ['rbu'] = 'Russian Buriat', + ['rcr'] = 'R-Cree', + ['ria'] = 'Riang', + ['rms'] = 'Rhaeto-Romanic', + ['rom'] = 'Romanian', + ['roy'] = 'Romany', + ['rsy'] = 'Rusyn', + ['rua'] = 'Ruanda', + ['rus'] = 'Russian', + ['sad'] = 'Sadri', + ['san'] = 'Sanskrit', + ['sat'] = 'Santali', + ['say'] = 'Sayisi', + ['sek'] = 'Sekota', + ['sel'] = 'Selkup', + ['sgo'] = 'Sango', + ['shn'] = 'Shan', + ['sib'] = 'Sibe', + ['sid'] = 'Sidamo', + ['sig'] = 'Silte Gurage', + ['sks'] = 'Skolt Sami', + ['sky'] = 'Slovak', + ['sla'] = 'Slavey', + ['slv'] = 'Slovenian', + ['sml'] = 'Somali', + ['smo'] = 'Samoan', + ['sna'] = 'Sena', + ['snd'] = 'Sindhi', + ['snh'] = 'Sinhalese', + ['snk'] = 'Soninke', + ['sog'] = 'Sodo Gurage', + ['sot'] = 'Sotho', + ['sqi'] = 'Albanian', + ['srb'] = 'Serbian', + ['srk'] = 'Saraiki', + ['srr'] = 'Serer', + ['ssl'] = 'South Slavey', + ['ssm'] = 'Southern Sami', + ['sur'] = 'Suri', + ['sva'] = 'Svan', + ['sve'] = 'Swedish', + ['swa'] = 'Swadaya Aramaic', + ['swk'] = 'Swahili', + ['swz'] = 'Swazi', + ['sxt'] = 'Sutu', + ['syr'] = 'Syriac', + ['tab'] = 'Tabasaran', + ['taj'] = 'Tajiki', + ['tam'] = 'Tamil', + ['tat'] = 'Tatar', + ['tcr'] = 'TH-Cree', + ['tel'] = 'Telugu', + ['tgn'] = 'Tongan', + ['tgr'] = 'Tigre', + ['tgy'] = 'Tigrinya', + ['tha'] = 'Thai', + ['tht'] = 'Tahitian', + ['tib'] = 'Tibetan', + ['tkm'] = 'Turkmen', + ['tmn'] = 'Temne', + ['tna'] = 'Tswana', + ['tne'] = 'Tundra Nenets', + ['tng'] = 'Tonga', + ['tod'] = 'Todo', + ['trk'] = 'Turkish', + ['tsg'] = 'Tsonga', + ['tua'] = 'Turoyo Aramaic', + ['tul'] = 'Tulu', + ['tuv'] = 'Tuvin', + ['twi'] = 'Twi', + ['udm'] = 'Udmurt', + ['ukr'] = 'Ukrainian', + ['urd'] = 'Urdu', + ['usb'] = 'Upper Sorbian', + ['uyg'] = 'Uyghur', + ['uzb'] = 'Uzbek', + ['ven'] = 'Venda', + ['vit'] = 'Vietnamese', + ['wa' ] = 'Wa', + ['wag'] = 'Wagdi', + ['wcr'] = 'West-Cree', + ['wel'] = 'Welsh', + ['wlf'] = 'Wolof', + ['xbd'] = 'Tai Lue', + ['xhs'] = 'Xhosa', + ['yak'] = 'Yakut', + ['yba'] = 'Yoruba', + ['ycr'] = 'Y-Cree', + ['yic'] = 'Yi Classic', + ['yim'] = 'Yi Modern', + ['zhh'] = 'Chinese Hong Kong', + ['zhp'] = 'Chinese Phonetic', + ['zhs'] = 'Chinese Simplified', + ['zht'] = 'Chinese Traditional', + ['znd'] = 'Zande', + ['zul'] = 'Zulu' +} + +fonts.otf.tables.features = { + ['aalt'] = 'Access All Alternates', + ['abvf'] = 'Above-Base Forms', + ['abvm'] = 'Above-Base Mark Positioning', + ['abvs'] = 'Above-Base Substitutions', + ['afrc'] = 'Alternative Fractions', + ['akhn'] = 'Akhands', + ['blwf'] = 'Below-Base Forms', + ['blwm'] = 'Below-Base Mark Positioning', + ['blws'] = 'Below-Base Substitutions', + ['c2pc'] = 'Petite Capitals From Capitals', + ['c2sc'] = 'Small Capitals From Capitals', + ['calt'] = 'Contextual Alternates', + ['case'] = 'Case-Sensitive Forms', + ['ccmp'] = 'Glyph Composition/Decomposition', + ['cjct'] = 'Conjunct Forms', + ['clig'] = 'Contextual Ligatures', + ['cpsp'] = 'Capital Spacing', + ['cswh'] = 'Contextual Swash', + ['curs'] = 'Cursive Positioning', + ['dflt'] = 'Default Processing', + ['dist'] = 'Distances', + ['dlig'] = 'Discretionary Ligatures', + ['dnom'] = 'Denominators', + ['expt'] = 'Expert Forms', + ['falt'] = 'Final glyph Alternates', + ['fin2'] = 'Terminal Forms #2', + ['fin3'] = 'Terminal Forms #3', + ['fina'] = 'Terminal Forms', + ['frac'] = 'Fractions', + ['fwid'] = 'Full Width', + ['half'] = 'Half Forms', + ['haln'] = 'Halant Forms', + ['halt'] = 'Alternate Half Width', + ['hist'] = 'Historical Forms', + ['hkna'] = 'Horizontal Kana Alternates', + ['hlig'] = 'Historical Ligatures', + ['hngl'] = 'Hangul', + ['hojo'] = 'Hojo Kanji Forms', + ['hwid'] = 'Half Width', + ['init'] = 'Initial Forms', + ['isol'] = 'Isolated Forms', + ['ital'] = 'Italics', + ['jalt'] = 'Justification Alternatives', + ['jp04'] = 'JIS2004 Forms', + ['jp78'] = 'JIS78 Forms', + ['jp83'] = 'JIS83 Forms', + ['jp90'] = 'JIS90 Forms', + ['kern'] = 'Kerning', + ['lfbd'] = 'Left Bounds', + ['liga'] = 'Standard Ligatures', + ['ljmo'] = 'Leading Jamo Forms', + ['lnum'] = 'Lining Figures', + ['locl'] = 'Localized Forms', + ['mark'] = 'Mark Positioning', + ['med2'] = 'Medial Forms #2', + ['medi'] = 'Medial Forms', + ['mgrk'] = 'Mathematical Greek', + ['mkmk'] = 'Mark to Mark Positioning', + ['mset'] = 'Mark Positioning via Substitution', + ['nalt'] = 'Alternate Annotation Forms', + ['nlck'] = 'NLC Kanji Forms', + ['nukt'] = 'Nukta Forms', + ['numr'] = 'Numerators', + ['onum'] = 'Old Style Figures', + ['opbd'] = 'Optical Bounds', + ['ordn'] = 'Ordinals', + ['ornm'] = 'Ornaments', + ['palt'] = 'Proportional Alternate Width', + ['pcap'] = 'Petite Capitals', + ['pnum'] = 'Proportional Figures', + ['pref'] = 'Pre-base Forms', + ['pres'] = 'Pre-base Substitutions', + ['pstf'] = 'Post-base Forms', + ['psts'] = 'Post-base Substitutions', + ['pwid'] = 'Proportional Widths', + ['qwid'] = 'Quarter Widths', + ['rand'] = 'Randomize', + ['rkrf'] = 'Rakar Forms', + ['rlig'] = 'Required Ligatures', + ['rphf'] = 'Reph Form', + ['rtbd'] = 'Right Bounds', + ['rtla'] = 'Right-To-Left Alternates', + ['ruby'] = 'Ruby Notation Forms', + ['salt'] = 'Stylistic Alternates', + ['sinf'] = 'Scientific Inferiors', + ['size'] = 'Optical Size', + ['smcp'] = 'Small Capitals', + ['smpl'] = 'Simplified Forms', + ['ss01'] = 'Sylistic Set 1', + ['ss02'] = 'Sylistic Set 2', + ['ss03'] = 'Sylistic Set 3', + ['ss04'] = 'Sylistic Set 4', + ['ss05'] = 'Sylistic Set 5', + ['ss06'] = 'Sylistic Set 6', + ['ss07'] = 'Sylistic Set 7', + ['ss08'] = 'Sylistic Set 8', + ['ss09'] = 'Sylistic Set 9', + ['ss10'] = 'Sylistic Set 10', + ['ss11'] = 'Sylistic Set 11', + ['ss12'] = 'Sylistic Set 12', + ['ss13'] = 'Sylistic Set 13', + ['ss14'] = 'Sylistic Set 14', + ['ss15'] = 'Sylistic Set 15', + ['ss16'] = 'Sylistic Set 16', + ['ss17'] = 'Sylistic Set 17', + ['ss18'] = 'Sylistic Set 18', + ['ss19'] = 'Sylistic Set 19', + ['ss20'] = 'Sylistic Set 20', + ['subs'] = 'Subscript', + ['sups'] = 'Superscript', + ['swsh'] = 'Swash', + ['titl'] = 'Titling', + ['tjmo'] = 'Trailing Jamo Forms', + ['tnam'] = 'Traditional Name Forms', + ['tnum'] = 'Tabular Figures', + ['trad'] = 'Traditional Forms', + ['twid'] = 'Third Widths', + ['unic'] = 'Unicase', + ['valt'] = 'Alternate Vertical Metrics', + ['vatu'] = 'Vattu Variants', + ['vert'] = 'Vertical Writing', + ['vhal'] = 'Alternate Vertical Half Metrics', + ['vjmo'] = 'Vowel Jamo Forms', + ['vkna'] = 'Vertical Kana Alternates', + ['vkrn'] = 'Vertical Kerning', + ['vpal'] = 'Proportional Alternate Vertical Metrics', + ['vrt2'] = 'Vertical Rotation', + ['zero'] = 'Slashed Zero' +} + +fonts.otf.tables.baselines = { + ['hang'] = 'Hanging baseline', + ['icfb'] = 'Ideographic character face bottom edge baseline', + ['icft'] = 'Ideographic character face tope edige baseline', + ['ideo'] = 'Ideographic em-box bottom edge baseline', + ['idtp'] = 'Ideographic em-box top edge baseline', + ['math'] = 'Mathmatical centered baseline', + ['romn'] = 'Roman baseline' +} + +function fonts.otf.tables.to_tag(id) + return stringformat("%4s",id:lower()) +end + +function fonts.otf.meanings.resolve(tab,id) + if tab and id then + id = id:lower() + return tab[id] or tab[id:gsub(" ","")] or tab['dflt'] or '' + else + return "unknown" + end +end + +function fonts.otf.meanings.script(id) + return fonts.otf.meanings.resolve(fonts.otf.tables.scripts,id) +end +function fonts.otf.meanings.language(id) + return fonts.otf.meanings.resolve(fonts.otf.tables.languages,id) +end +function fonts.otf.meanings.feature(id) + return fonts.otf.meanings.resolve(fonts.otf.tables.features,id) +end +function fonts.otf.meanings.baseline(id) + return fonts.otf.meanings.resolve(fonts.otf.tables.baselines,id) +end + +--[[ldx-- +

Here we go.

+--ldx]]-- + +fonts.otf.enhance = { } + +function fonts.otf.load(filename,format,sub,featurefile) + local name = file.basename(file.removesuffix(filename)) + if featurefile then + name = name .. "@" .. file.removesuffix(file.basename(featurefile)) + end + local data = containers.read(fonts.otf.cache, name) + if not data then + local ff + if sub and sub ~= "" then + ff = fontforge.open(filename,sub) + else + ff = fontforge.open(filename) + end + if ff then + logs.report("load otf","loading: " .. filename) + if featurefile then + featurefile = input.find_file(texmf.instance,file.addsuffix(featurefile,'fea'),"FONTFEATURES") + if featurefile and featurefile ~= "" then + logs.report("load otf", "featurefile: " .. featurefile) + fontforge.apply_featurefile(ff, featurefile) + end + end + data = fontforge.to_table(ff) + fontforge.close(ff) + if data then + logs.report("load otf","enhance: before") + fonts.otf.enhance.before(data,filename) + logs.report("load otf","enhance: analyze") + fonts.otf.enhance.analyze(data,filename) + logs.report("load otf","enhance: after") + fonts.otf.enhance.after(data,filename) + logs.report("load otf","save in cache") + data = containers.write(fonts.otf.cache, name, data) + else + logs.error("load otf","loading failed") + end + end + end + if data then + local map = data.map.map + local backmap = data.map.backmap + local unicodes = data.luatex.unicodes + local glyphs = data.glyphs + -- maybe handy some day, not used + data.name_to_unicode = function (n) return unicodes[n] end + data.name_to_index = function (n) return map[unicodes[n]] end + data.index_to_name = function (i) return glyphs[i].name end + data.unicode_to_name = function (u) return glyphs[map[u]].name end + data.index_to_unicode = function (u) return backmap[u] end + data.unicode_to_index = function (u) return map[u] end + end + return data +end + +function fonts.otf.enhance.analyze(data,filename) + local t = { + filename = file.basename(filename), + version = fonts.otf.version, + creator = "context mkiv", + unicodes = fonts.otf.analyze_unicodes(data), + gposfeatures = fonts.otf.analyze_features(data.gpos), + gsubfeatures = fonts.otf.analyze_features(data.gsub), + marks = fonts.otf.analyze_class(data,'mark'), + } + t.subtables, t.name_to_type, t.internals, t.always_valid, t.ignore_flags = fonts.otf.analyze_subtables(data) + data.luatex = t +end + +function fonts.otf.enhance.before(data,filename) + local private = 0xE000 + local uni_to_int = data.map.map + local int_to_uni = data.map.backmap + for index, glyph in pairs(data.glyphs) do + if index > 0 and glyph.unicodeenc == -1 then + while uni_to_int[private] do + private = private + 1 + end + uni_to_int[private] = index + int_to_uni[index] = private + glyph.unicodeenc = private + logs.report("load otf",string.format("enhance: glyph %s at index %s is moved to private unicode slot %s",glyph.name,index,private)) + end + end + if data.ttf_tables then + for _, v in ipairs(data.ttf_tables) do + if v.data then v.data = "deleted" end + --~ if v.data then v.data = v.data:gsub("\026","\\026") end -- does not work out well + end + end +end + +function fonts.otf.enhance.after(data,filename) + local unicodes = data.luatex.unicodes + for index, glyph in pairs(data.glyphs) do + if glyph.kerns then + local mykerns = { } + for k,v in ipairs(glyph.kerns) do + local mkl = mykerns[v.lookup] + if not mkl then + mkl = { [unicodes[v.char]] = v.off } + mykerns[v.lookup] = mkl + else + mkl[unicodes[v.char]] = v.off + end + end + glyph.mykerns = mykerns + end + end +end + +function fonts.otf.analyze_class(data,class) + local classes = { } + for index, glyph in pairs(data.glyphs) do + if glyph.class == class then + classes[glyph.unicodeenc] = true + end + end + return classes +end + +function fonts.otf.analyze_subtables(data) + local subtables, name_to_type, internals, always_valid, ignore_flags = { }, { }, { }, { }, { } + local function collect(g) + if g then + for k,v in ipairs(g) do + if v.features then + local ignored = { false, false, false } + if v.flags.ignorecombiningmarks then ignored[1] = 'mark' end + if v.flags.ignorebasechars then ignored[2] = 'base' end + if v.flags.ignoreligatures then ignored[3] = 'ligature' end + if v.subtables then + local type = v.type + for _, feature in ipairs(v.features) do + local ft = feature.tag:lower() + subtables[ft] = subtables[ft] or { } + for _, script in ipairs(feature.scripts) do + local ss = script.script + ss = ss:lower() + ss = ss:strip() + sft = subtables[ft] + sft[ss] = sft[ss] or { } + local sfts = sft[ss] + for _, language in ipairs(script.langs) do + language = language:lower() + language = language:strip() + sfts[language] = sfts[language] or { } + local sftsl = sfts[language] + local lookups, valid = sftsl.lookups or { }, sftsl.valid or { } + for n, subtable in ipairs(v.subtables) do + local stl = subtable.name + if stl then + lookups[#lookups+1] = stl + valid[stl] = true + name_to_type[stl] = type + ignore_flags[stl] = ignored + end + end + sftsl.lookups, sftsl.valid = lookups, valid + end + end + end + end + else + -- we have an internal feature, say ss_l_83 that resolves to + -- subfeatures like ss_l_83_s which we find in the glyphs + name_to_type[v.name] = v.type + local lookups, valid = { }, { } + for n, subtable in ipairs(v.subtables) do + local stl = subtable.name + if stl then + lookups[#lookups+1] = stl + valid[stl] = true + -- name_to_type[stl] = type + always_valid[stl] = true + end + end + internals[v.name] = { + lookups = lookups, + valid = valid + } + always_valid[v.name] = true -- bonus + end + end + end + end + collect(data.gsub) + collect(data.gpos) + return subtables, name_to_type, internals, always_valid, ignore_flags +end + +function fonts.otf.analyze_unicodes(data) + local unicodes = { } + for _, blob in pairs(data.glyphs) do + if blob.name then + unicodes[blob.name] = blob.unicodeenc or 0 + end + end + unicodes['space'] = unicodes['space'] or 32 -- handly later on + return unicodes +end + +function fonts.otf.analyze_features(g) + if g then + local t, done = { }, { } + for k,v in ipairs(g) do + local f = v.features + if f then + for k, v in ipairs(f) do + -- scripts and tag + local tag = v.tag + if not done[tag] then + t[#t+1] = tag + done[tag] = true + end + end + end + end + if #t > 0 then + return t + end + end + return nil +end + +function fonts.otf.valid_subtable(otfdata,language,script,kind) + local t = otfdata.luatex.subtables + return t[kind] and t[kind][script] and t[kind][script][language] and t[kind][script][language].lookups +end + +function fonts.otf.features.register(name,default) + fonts.otf.features.list[#fonts.otf.features.list+1] = name + fonts.otf.features.default[name] = default +end + +function fonts.otf.set_features(tfmdata) + local shared = tfmdata.shared + local otfdata = shared.otfdata + shared.features = fonts.define.check(shared.features,fonts.otf.features.default) + local features = shared.features + if not table.is_empty(features) then + local gposlist = otfdata.luatex.gposfeatures + local gsublist = otfdata.luatex.gsubfeatures + local mode = tfmdata.mode or fonts.mode + local fi = fonts.initializers[mode] + if fi and fi.otf then + function initialize(list) -- using tex lig and kerning + if list then + for _, f in ipairs(list) do + local value = features[f] + if value and fi.otf[f] then -- brr + if fonts.otf.trace_features then + logs.report("define otf",string.format("initializing feature %s to %s for mode %s for font %s",f,tostring(value),mode or 'unknown', tfmdata.name or 'unknown')) + end + fi.otf[f](tfmdata,value) -- can set mode (no need to pass otf) + mode = tfmdata.mode or fonts.mode + fi = fonts.initializers[mode] + end + end + end + end + initialize(fonts.triggers) + initialize(gsublist) + initialize(gposlist) + end + local fm = fonts.methods[mode] + if fm and fm.otf then + function register(list) -- node manipulations + if list then + for _, f in ipairs(list) do + if features[f] and fm.otf[f] then -- brr + if not shared.processors then -- maybe also predefine + shared.processors = { fm.otf[f] } + else + shared.processors[#shared.processors+1] = fm.otf[f] + end + end + end + end + end + register(fonts.triggers) + register(gsublist) + register(gposlist) + end + end +end + +function fonts.otf.otf_to_tfm(specification) + local name = specification.name + local sub = specification.sub + local filename = specification.filename + local format = specification.format + local features = specification.features.normal + local cache_id = specification.hash + local tfmdata = containers.read(fonts.tfm.cache,cache_id) + if not tfmdata then + local otfdata = fonts.otf.load(filename,format,sub,features and features.featurefile) + if not table.is_empty(otfdata) then + tfmdata = fonts.otf.copy_to_tfm(otfdata) + if not table.is_empty(tfmdata) then + tfmdata.shared = tfmdata.shared or { } + tfmdata.unique = tfmdata.unique or { } + tfmdata.shared.otfdata = otfdata + tfmdata.shared.features = features + fonts.otf.set_features(tfmdata) + end + end + containers.write(fonts.tfm.cache,cache_id,tfmdata) + end + return tfmdata +end + +function fonts.otf.features.prepare_base_kerns(tfmdata,kind,value) -- todo what kind of kerns, currently all + if value then + local otfdata = tfmdata.shared.otfdata + local charlist = otfdata.glyphs + local unicodes = otfdata.luatex.unicodes + local somevalid = fonts.otf.some_valid_feature(otfdata,tfmdata.language,tfmdata.script,kind) + for _, chr in pairs(tfmdata.characters) do + local d = charlist[chr.index] + if d and d.kerns then + local t, done = chr.kerns or { }, false + for _, v in pairs(d.kerns) do + if somevalid[v.lookup] then + local k = unicodes[v.char] + if k > 0 then + t[k], done = v.off, true + end + end + end + if done then + chr.kerns = t + end + end + end + end +end + +function fonts.otf.copy_to_tfm(data) + if data then + local tfm = { characters = { }, parameters = { } } + local unicodes = data.luatex.unicodes + local characters = tfm.characters + local force = fonts.otf.notdef + for k,v in pairs(data.map.map) do + -- k = unicode, v = slot + local d = data.glyphs[v] + -- if d then + if d and (force or d.name) then + local t = { } + t.index = v + t.unicode = k + t.name = d.name or ".notdef" + t.boundingbox = d.boundingbox or nil + t.width = d.width or 0 + t.height = d.boundingbox[4] or 0 + t.depth = - d.boundingbox[2] or 0 + t.class = d.class + if d.class == "mark" then + t.width = -t.width + end + characters[k] = t + end + end + tfm.units = data.units_per_em or 1000 + -- we need a runtime lookup because of running from cdrom or zip + tfm.filename = input.findbinfile(texmf.instance,data.luatex.filename,"") or data.luatex.filename + tfm.fullname = data.fullname or data.fontname + tfm.cidinfo = data.cidinfo + -- if not tfm.cidinfo.registry then tfm.cidinfo.registry = "" end + tfm.cidinfo.registry = tfm.cidinfo.registry or "" + tfm.name = file.removesuffix(file.basename(tfm.filename)) + tfm.type = "real" + tfm.stretch = 0 -- stretch + tfm.slant = 0 -- slant + tfm.direction = 0 + tfm.boundarychar_label = 0 + tfm.boundarychar = 65536 + tfm.designsize = ((data.designsize or 100)/10)*65536 + local spaceunits = 500 + tfm.spacer = "500 units" + data.isfixedpitch = data.pfminfo and data.pfminfo.panose and data.pfminfo.panose["proportion"] == "Monospaced" + data.charwidth = nil + if data.pfminfo then + data.charwidth = data.pfminfo.avgwidth + end + if data.isfixedpitch then + if data.glyphs[unicodes['space']] then + spaceunits, tfm.spacer = data.glyphs[unicodes['space']].width, "space" + elseif data.glyphs[unicodes['emdash']] then + spaceunits, tfm.spacer = data.glyphs[unicodes['emdash']].width, "emdash" + elseif data.charwidth then + spaceunits, tfm.spacer = data.charwidth, "charwidth" + end + elseif data.glyphs[unicodes['space']] then + spaceunits, tfm.spacer = data.glyphs[unicodes['space']].width, "space" + elseif data.glyphs[unicodes['emdash']] then + spaceunits, tfm.spacer = data.glyphs[unicodes['emdash']].width/2, "emdash/2" + elseif data.charwidth then + spaceunits, tfm.spacer = data.charwidth, "charwidth" + end + spaceunits = tonumber(spaceunits) + tfm.parameters[1] = 0 -- slant + tfm.parameters[2] = spaceunits -- space + tfm.parameters[3] = 500 -- space_stretch + tfm.parameters[4] = 333 -- space_shrink + tfm.parameters[5] = 400 -- x_height + tfm.parameters[6] = 1000 -- quad + tfm.parameters[7] = 0 -- extra_space (todo) + if spaceunits < 200 then + -- todo: warning + end + tfm.italicangle = data.italicangle + tfm.ascender = math.abs(data.ascent or 0) + tfm.descender = math.abs(data.descent or 0) + if data.italicangle then -- maybe also in afm _ + tfm.parameters[1] = tfm.parameters[1] - math.round(math.tan(data.italicangle*math.pi/180)) + end + if data.isfixedpitch then + tfm.parameters[3] = 0 + tfm.parameters[4] = 0 + elseif fonts.otf.syncspace then + tfm.parameters[3] = spaceunits/2 -- space_stretch + tfm.parameters[4] = spaceunits/3 -- space_shrink + end + if data.pfminfo and data.pfminfo.os2_xheight and data.pfminfo.os2_xheight > 0 then + tfm.parameters[5] = data.pfminfo.os2_xheight + elseif data.glyphs[unicodes['x']] and data.glyphs[unicodes['x']].height then + tfm.parameters[5] = data.glyphs[unicodes['x']].height + end + return tfm + else + return nil + end +end + +function fonts.tfm.read_from_open_type(specification) + local tfmtable = fonts.otf.otf_to_tfm(specification) + if tfmtable then + tfmtable.name = specification.name + tfmtable.sub = specification.sub + tfmtable = fonts.tfm.scale(tfmtable, specification.size) + tfmtable.file = file.basename(specification.filename) + tfmtable.format = specification.format + end + return tfmtable +end + +-- scripts + +fonts.otf.default_language = 'latn' +fonts.otf.default_script = 'dflt' + +function fonts.otf.valid_feature(otfdata,language,script) -- return hash is faster + local language = language or fonts.otf.default_language + local script = script or fonts.otf.default_script + if not (script and language) then + return boolean.alwaystrue + else + language = string.padd(language:lower(),4) + script = string.padd(script:lower (),4) + local t = { } + for k,v in pairs(otfdata.luatex.subtables) do + local vv = v[script] + if vv and vv[language] then + t[k] = vv[language].valid + end + end + local always = otfdata.luatex.always_valid -- for the moment not per feature + return function(kind,tag) -- is the kind test needed + return always[tag] or kind and t[kind] and t[kind][tag] + end + end +end +function fonts.otf.some_valid_feature(otfdata,language,script,kind) + local language = language or fonts.otf.default_language + local script = script or fonts.otf.default_script + if not (script and language) then + return boolean.alwaystrue + else + language = string.padd(language:lower(),4) + script = string.padd(script:lower (),4) + local t = otfdata.luatex.subtables[kind] + if t and t[script] and t[script][language] and t[script][language].valid then + return t[script][language].valid + else + return { } + end +--~ return (t and t[script][language] and t[script][language].valid) or { } + end +end + +function fonts.otf.features.aux.resolve_ligatures(tfmdata,ligatures,kind) + local otfdata = tfmdata.shared.otfdata + local unicodes = otfdata.luatex.unicodes + local chars = tfmdata.characters + local changed = tfmdata.changed or { } + local done = { } + kind = kind or "unknown" + while true do + local ok = false + for k,v in pairs(ligatures) do + local lig = v[1] + if not done[lig] then + local ligs = lig:split(" ") + if #ligs == 2 then + local c, f, s = chars[v[2]], ligs[1], ligs[2] + local uf, us = unicodes[f], unicodes[s] + if changed[uf] or changed[us] then + if fonts.otf.trace_features then + logs.report("define otf",string.format("%s: %s (%s) + %s (%s) ignored",kind,f,uf,s,us)) + end + else + local first, second = chars[uf], us + if first and second then + if not first.ligatures then first.ligatures = { } end + first.ligatures[second] = { + char = unicodes[c.name], + type = 0 + } + if fonts.otf.trace_features then + logs.report("define otf",string.format("%s: %s (%s) + %s (%s) = %s (%s)",kind,f,uf,s,us,c.name,unicodes[c.name])) + end + end + end + ok, done[lig] = true, c.name + end + end + end + if ok then + for d,n in pairs(done) do + local pattern = "^(" .. d .. ") " + for k,v in pairs(ligatures) do + v[1] = v[1]:gsub(pattern, function(str) + return n .. " " + end) + end + end + else + break + end + end +end + +function fonts.otf.features.prepare_base_substitutions(tfmdata,kind,value) -- we can share some code with the node features + if value then + local ligatures = { } + local otfdata = tfmdata.shared.otfdata + local unicodes = otfdata.luatex.unicodes + local trace = fonts.otf.trace_features + local chars = tfmdata.characters + local somevalid = fonts.otf.some_valid_feature(otfdata,tfmdata.language,tfmdata.script,kind) + tfmdata.changed = tfmdata.changed or { } + local changed = tfmdata.changed + for k,c in pairs(chars) do + local o = otfdata.glyphs[c.index] + if o and o.lookups then + for lookup,ps in pairs(o.lookups) do +--~ if valid(kind,lookup) then -- can be optimized for #p = 1 +if somevalid[lookup] then -- can be optimized for #p = 1 + for i=1,#ps do + local p = ps[i] + local t = p.type + if t == 'substitution' then + local ps = p.specification + if ps and ps.variant then + local pv = ps.variant + if pv then + local upv = unicodes[pv] + if upv and chars[upv] then + if trace then + logs.report("define otf",string.format("%s: %s (%s) => %s (%s)",kind,chars[k].name,k,chars[upv].name,upv)) + end + chars[k] = chars[upv] + changed[k] = true + end + end + end + elseif t == 'alternate' then + local pa = p.specification if pa and pa.components then + local pc = pa.components:match("(%S+)") + if pc then + local upc = unicodes[pc] + if upc and chars[upc] then + if trace then + logs.report("define otf",string.format("%s: %s (%s) => %s (%s)",kind,chars[k].name,k,chars[upc].name,upc)) + end + chars[k] = chars[upc] + changed[k] = true + end + end + end + elseif t == 'ligature' and not changed[k] then + local pl = p.specification + if pl and pl.components then + if trace then + logs.report("define otf",string.format("%s: %s => %s (%s)",kind,pl.components,chars[k].name,k)) + end + ligatures[#ligatures+1] = { pl.components, k } + end + end + end + end + end + end + end + fonts.otf.features.aux.resolve_ligatures(tfmdata,ligatures,kind) + else + tfmdata.ligatures = tfmdata.ligatures or { } + end +end + +function fonts.initializers.base.otf.liga(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'liga',value) end +function fonts.initializers.base.otf.dlig(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'dlig',value) end +function fonts.initializers.base.otf.rlig(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'rlig',value) end +function fonts.initializers.base.otf.hlig(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'hlig',value) end +function fonts.initializers.base.otf.pnum(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'pnum',value) end +function fonts.initializers.base.otf.onum(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'onum',value) end +function fonts.initializers.base.otf.tnum(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'tnum',value) end +function fonts.initializers.base.otf.lnum(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'lnum',value) end +function fonts.initializers.base.otf.zero(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'zero',value) end +function fonts.initializers.base.otf.smcp(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'smcp',value) end +function fonts.initializers.base.otf.cpsp(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'cpsp',value) end +function fonts.initializers.base.otf.c2sc(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'c2sc',value) end +function fonts.initializers.base.otf.ornm(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'ornm',value) end +function fonts.initializers.base.otf.aalt(tfm,value) fonts.otf.features.prepare_base_substitutions(tfm,'aalt',value) end + +fonts.otf.features.data.tex = { + { "endash", "hyphen hyphen" }, + { "emdash", "hyphen hyphen hyphen" }, + { "quotedblleft", "quoteleft quoteleft" }, + { "quotedblright", "quoteright quoteright" }, + { "quotedblleft", "grave grave" }, + { "quotedblright", "quotesingle quotesingle" }, + { "quotedblbase", "comma comma" } +} + +--~ 0x201C 0x2018 0x2018 +--~ 0x201D 0x2019 0x2019 +--~ 0x201E 0X002C 0x002C + +function fonts.initializers.base.otf.texligatures(tfm,value) + local otfdata = tfm.shared.otfdata + local unicodes = otfdata.luatex.unicodes + local ligatures = { } + for _,v in pairs(fonts.otf.features.data.tex) do + if type(v[1]) == "string" then + local c = unicodes[v[1]] + if c then + ligatures[#ligatures+1] = { v[2], c } + end + else + ligatures[#ligatures+1] = { v[2], v[1] } + end + end + fonts.otf.features.aux.resolve_ligatures(tfm,ligatures) +end + +function fonts.initializers.base.otf.texquotes(tfm,value) + tfm.characters[0x0022] = table.fastcopy(tfm.characters[0x201D]) + tfm.characters[0x0027] = table.fastcopy(tfm.characters[0x2019]) + tfm.characters[0x0060] = table.fastcopy(tfm.characters[0x2018]) +end + +fonts.initializers.base.otf.trep = fonts.initializers.base.otf.texquotes +fonts.initializers.base.otf.tlig = fonts.initializers.base.otf.texligatures + +table.insert(fonts.triggers,"texquotes") +table.insert(fonts.triggers,"texligatures") +table.insert(fonts.triggers,"tlig") + +-- Here comes the real thing ... node processing! The next session prepares +-- things. The main features (unchained by rules) have their own caches, +-- while the private ones cache locally. + +do + + fonts.otf.features.prepare = { } + + -- also share vars + + function fonts.otf.features.prepare.feature(tfmdata,kind,value) -- check BASE VS NODE + if value then + tfmdata.unique = tfmdata.unique or { } + tfmdata.shared = tfmdata.shared or { } + local shared = tfmdata.shared + shared.featuredata = shared.featuredata or { } + shared.featuredata[kind] = shared.featuredata[kind] or { } + shared.featurecache = shared.featurecache or { } + shared.featurecache[kind] = false -- signal + local otfdata = shared.otfdata + local lookuptable = fonts.otf.valid_subtable(otfdata,tfmdata.language,tfmdata.script,kind) + shared.lookuptable = shared.lookuptable or { } + shared.lookuptable[kind] = lookuptable + if lookuptable then + shared.processes = shared.processes or { } + shared.processes[kind] = shared.processes[kind] or { } + local processes = shared.processes[kind] + local types = otfdata.luatex.name_to_type + local flags = otfdata.luatex.ignore_flags + local preparers = fonts.otf.features.prepare + local process = fonts.otf.features.process + for noflookups, lookupname in ipairs(lookuptable) do + local lookuptype = types[lookupname] + local prepare = preparers[lookuptype] + if prepare then + local processdata = prepare(tfmdata,kind,lookupname) + if processdata then + local processflags = flags[lookupname] or {false,false,false} + processes[#processes+1] = { process[lookuptype], lookupname, processdata, processflags } + end + end + end + end + end + end + + -- helper: todo, we don't need to store non local ones for chains so we can pass the + -- validator as parameter + + function fonts.otf.features.collect_ligatures(tfmdata,kind,internal) -- ligs are spread all over the place + local otfdata = tfmdata.shared.otfdata + local unicodes = tfmdata.shared.otfdata.luatex.unicodes -- actually the char index is ok too + local trace = fonts.otf.trace_features + local ligatures = { } + local function collect(lookup,o,ps) + for i=1,#ps do + local p = ps[i] + if p.specification and p.type == 'ligature' then + if trace then + logs.report("define otf",string.format("feature %s ligature %s => %s",kind,p.specification.components,o.name)) + end + local t = ligatures[lookup] + if not t then + t = { } + ligatures[lookup] = t + end + local first = true + for s in p.specification.components:gmatch("(%S+)") do + local u = unicodes[s] + if first then + if not t[u] then + t[u] = { { } } + end + t = t[u] + first = false + else + if not t[1][u] then + t[1][u] = { { } } + end + t = t[1][u] + end + end + t[2] = o.unicodeenc + end + end + end + if internal then + local always = otfdata.luatex.always_valid + for _,o in pairs(otfdata.glyphs) do + if o.lookups then + for lookup, ps in pairs(o.lookups) do + if always[lookup] then + collect(lookup,o,ps) + end + end + end + end + else -- check if this valid is still ok + local valid = fonts.otf.valid_feature(otfdata,tfmdata.language,tfmdata.script) + for _,o in pairs(otfdata.glyphs) do + if o.lookups then + for lookup, ps in pairs(o.lookups) do + if valid(kind,lookup) then + collect(lookup,o,ps) + end + end + end + end + end + return ligatures + end + + -- gsub_single -> done + -- gsub_multiple -> done + -- gsub_alternate -> done + -- gsub_ligature -> done + -- gsub_context -> todo + -- gsub_contextchain -> done + -- gsub_reversechain -> todo + + -- we used to share code in the following functions but that was relatively + -- due to extensive calls to functions (easily hundreds of thousands per + -- document) + + function fonts.otf.features.prepare.gsub_single(tfmdata,kind,lookupname) + local featuredata = tfmdata.shared.featuredata[kind] + local substitutions = featuredata[lookupname] + if not substitutions then + substitutions = { } + featuredata[lookupname] = substitutions + local otfdata = tfmdata.shared.otfdata + local unicodes = otfdata.luatex.unicodes + local trace = fonts.otf.trace_features + for _, o in pairs(otfdata.glyphs) do + local lookups = o.lookups + if lookups then + for lookup,ps in pairs(lookups) do + if lookup == lookupname then + for i=1,#ps do + local p = ps[i] + if p.specification and p.type == 'substitution' then + local old, new = o.unicodeenc, unicodes[p.specification.variant] + substitutions[old] = new + if trace then + logs.report("define otf",string.format("%s:%s substitution %s => %s",kind,lookupname,old,new)) + end + end + end + end + end + end + end + end + return substitutions + end + + function fonts.otf.features.prepare.gsub_multiple(tfmdata,kind,lookupname) + local featuredata = tfmdata.shared.featuredata[kind] + local substitutions = featuredata[lookupname] + if not substitutions then + substitutions = { } + featuredata[lookupname] = substitutions + local otfdata = tfmdata.shared.otfdata + local unicodes = otfdata.luatex.unicodes + local trace = fonts.otf.trace_features + for _,o in pairs(otfdata.glyphs) do + local lookups = o.lookups + if lookups then + for lookup,ps in pairs(lookups) do + if lookup == lookupname then + for i=1,#ps do + local p = ps[i] + if p.specification and p.type == 'multiple' then + local old, new = o.unicodeenc, { } + substitutions[old] = new + for pc in p.specification.components:gmatch("(%S+)") do + new[#new+1] = unicodes[pc] + end + if trace then + logs.report("define otf",string.format("%s:%s multiple %s => %s",kind,lookupname,old,table.concat(new," "))) + end + end + end + end + end + end + end + end + return substitutions + end + + function fonts.otf.features.prepare.gsub_alternate(tfmdata,kind,lookupname) + -- todo: configurable preference list + local featuredata = tfmdata.shared.featuredata[kind] + local substitutions = featuredata[lookupname] + if not substitutions then + featuredata[lookupname] = { } + substitutions = featuredata[lookupname] + local otfdata = tfmdata.shared.otfdata + local unicodes = otfdata.luatex.unicodes + local trace = fonts.otf.trace_features + for _,o in pairs(otfdata.glyphs) do + local lookups = o.lookups + if lookups then + for lookup,ps in pairs(lookups) do + if lookup == lookupname then + for i=1,#ps do + local p = ps[i] + if p.specification and p.type == 'alternate' then + local old = o.unicodeenc + local t = { } + for pc in p.specification.components:gmatch("(%S+)") do + t[#t+1] = unicodes[pc] + end + substitutions[old] = t + if trace then + logs.report("define otf",string.format("%s:%s alternate %s => %s",kind,lookupname,old,table.concat(substitutions,"|"))) + end + end + end + end + end + end + end + end + return substitutions + end + + function fonts.otf.features.prepare.gsub_ligature(tfmdata,kind,lookupname) + -- we collect them for all lookups, this saves loops, we only use the + -- lookupname for testing, we need to check if this leads to redundant + -- collections + local ligatures = tfmdata.shared.featuredata[kind] + if not ligatures[lookupname] then + ligatures = fonts.otf.features.collect_ligatures(tfmdata,kind) + tfmdata.shared.featuredata[kind] = ligatures + end + return ligatures[lookupname] + end + + function fonts.otf.features.prepare.contextchain(tfmdata,kind,lookupname) + local featuredata = tfmdata.shared.featuredata[kind] + local contexts = featuredata[lookupname] + if not contexts then + featuredata[lookupname] = { } + contexts = featuredata[lookupname] + local otfdata = tfmdata.shared.otfdata + local unicodes = otfdata.luatex.unicodes + local internals = otfdata.luatex.internals + local flags = otfdata.luatex.ignore_flags + local types = otfdata.luatex.name_to_type + otfdata.luatex.covers = otfdata.luatex.covers or { } + local cache = otfdata.luatex.covers + local characters = tfmdata.characters + local function uncover(covers) + if covers then + local result = { } + for n, c in ipairs(covers) do + local cc = cache[c] + if not cc then + local t = { } + for s in c:gmatch("(%S+)") do + t[unicodes[s]] = true + end + cache[c] = t + result[n] = t + else + result[n] = cc + end + end + return result + else + return { } + end + end + local lookupdata = otfdata.lookups[lookupname] + if not lookupdata then + texio.write_nl(string.format("error, missing lookupdata table %s",lookupname)) + elseif lookupdata.rules then + for nofrules, rule in ipairs(lookupdata.rules) do + local coverage = rule.coverage + if coverage and coverage.current then + local current = uncover(coverage.current) + local before = uncover(coverage.before) + local after = uncover(coverage.after) + if current[1] then + local lookups, lookuptype = rule.lookups, 'self' + -- for the moment only lookup index 1 + if lookups then + if #lookups > 1 then + logs.report("otf process","WARNING: more than one lookup in rule") + end + lookuptype = types[lookups[1]] + end + for unic, _ in pairs(current[1]) do + local t = contexts[unic] + if not t then + contexts[unic] = { lookups={}, flags=flags[lookupname] } + t = contexts[unic].lookups + end + t[#t+1] = { nofrules, lookuptype, current, before, after, lookups } + end + end + end + end + end + end + return contexts + end + + fonts.otf.features.prepare.gsub_context = fonts.otf.features.prepare.contextchain + fonts.otf.features.prepare.gsub_contextchain = fonts.otf.features.prepare.contextchain + fonts.otf.features.prepare.gsub_reversecontextchain = fonts.otf.features.prepare.contextchain + + -- ruled->lookup=ks_latn_l_27_c_4 => internal[ls_l_84] => valid[ls_l_84_s] + + -- gpos_mark2base -> done + -- gpos_mark2ligature -> done + -- gpos_mark2mark -> done + -- gpos_single -> not done + -- gpos_pair -> not done + -- gpos_cursive -> not done + -- gpos_context -> not done + -- gpos_contextchain -> not done + + function fonts.otf.features.prepare.anchors(tfmdata,kind,lookupname) -- tracing + local featuredata = tfmdata.shared.featuredata[kind] + local anchors = featuredata[lookupname] + if not anchors then + featuredata[lookupname] = { } + anchors = featuredata[lookupname] + local otfdata = tfmdata.shared.otfdata + local unicodes = otfdata.luatex.unicodes + local validanchors = { } + local glyphs = otfdata.glyphs + if otfdata.anchor_classes then + for k,v in ipairs(otfdata.anchor_classes) do + if v.lookup == lookupname then + validanchors[v.name] = true + end + end + end + for _,o in pairs(glyphs) do + local oanchor = o.anchors + if oanchor then + local t, ok = { }, false + for type, anchors in pairs(oanchor) do -- types + local tt = false + for name, anchor in pairs(anchors) do + if validanchors[name] then + if not tt then + tt = { [name] = anchor } + t[type] = tt + ok = true + else + tt[name] = anchor + end + end + end + end + if ok then + anchors[o.unicodeenc] = t + end + end + end + end + return anchors + end + + fonts.otf.features.prepare.gpos_mark2base = fonts.otf.features.prepare.anchors + fonts.otf.features.prepare.gpos_mark2ligature = fonts.otf.features.prepare.anchors + fonts.otf.features.prepare.gpos_mark2mark = fonts.otf.features.prepare.anchors + fonts.otf.features.prepare.gpos_cursive = fonts.otf.features.prepare.anchors + fonts.otf.features.prepare.gpos_context = fonts.otf.features.prepare.contextchain + fonts.otf.features.prepare.gpos_contextchain = fonts.otf.features.prepare.contextchain + + function fonts.otf.features.prepare.gpos_single(tfmdata,kind,lookupname) + logs.report("otf define","gpos_single not yet supported") + end + + function fonts.otf.features.prepare.gpos_pair(tfmdata,kind,lookupname) + local featuredata = tfmdata.shared.featuredata[kind] + local kerns = featuredata[lookupname] + if not kerns then + featuredata[lookupname] = { } + kerns = featuredata[lookupname] + local otfdata = tfmdata.shared.otfdata + local unicodes = otfdata.luatex.unicodes + local glyphs = otfdata.glyphs + for k,o in pairs(glyphs) do + local list = o.lookups + if list then + local one = o.unicodeenc + for lookup,ps in pairs(list) do + if lookup == lookupname then + for i=1,#ps do + local p = ps[i] + if p.type == 'pair' then + local specification = p.specification + local two = unicodes[specification.paired] + local krn = kerns[one] + if krn then + krn[two] = specification.offsets + else + kerns[one] = { two = specification.offsets } + end + if fonts.otf.trace_features then + logs.report("define otf",string.format("feature %s kern pair %s - %s",kind,one,two)) + end + end + end + end + end + else + list = o.kerns + if list then + local one = o.unicodeenc + for lookup,ps in pairs(list) do + if lookup == lookupname then + for i=1,#ps do + local p = ps[i] + local char = p.char + if char then + local two = unicodes[char] + local krn = kerns[one] + if krn then + krn[two] = p.off + else + kerns[one] = { two = p.off } + end + if fonts.otf.trace_features then + logs.report("define otf",string.format("feature %s kern pair %s - %s",kind,one,two)) + end + end + end + end + end + end + end + end + end + return kerns + end + + fonts.otf.features.prepare.gpos_contextchain = fonts.otf.features.prepare.contextchain + +end + +-- can be generalized: one loop in main + +do + + prepare = fonts.otf.features.prepare.feature + + function fonts.initializers.node.otf.afrc(tfm,value) return prepare(tfm,'afrc',value) end + function fonts.initializers.node.otf.akhn(tfm,value) return prepare(tfm,'akhn',value) end + function fonts.initializers.node.otf.c2pc(tfm,value) return prepare(tfm,'c2pc',value) end + function fonts.initializers.node.otf.c2sc(tfm,value) return prepare(tfm,'c2sc',value) end + function fonts.initializers.node.otf.calt(tfm,value) return prepare(tfm,'calt',value) end + function fonts.initializers.node.otf.case(tfm,value) return prepare(tfm,'case',value) end + function fonts.initializers.node.otf.ccmp(tfm,value) return prepare(tfm,'ccmp',value) end + function fonts.initializers.node.otf.clig(tfm,value) return prepare(tfm,'clig',value) end + function fonts.initializers.node.otf.cpsp(tfm,value) return prepare(tfm,'cpsp',value) end + function fonts.initializers.node.otf.cswh(tfm,value) return prepare(tfm,'cswh',value) end + function fonts.initializers.node.otf.curs(tfm,value) return prepare(tfm,'curs',value) end + function fonts.initializers.node.otf.dlig(tfm,value) return prepare(tfm,'dlig',value) end + function fonts.initializers.node.otf.dnom(tfm,value) return prepare(tfm,'dnom',value) end + function fonts.initializers.node.otf.expt(tfm,value) return prepare(tfm,'expt',value) end + function fonts.initializers.node.otf.fin2(tfm,value) return prepare(tfm,'fin2',value) end + function fonts.initializers.node.otf.fin3(tfm,value) return prepare(tfm,'fin3',value) end + function fonts.initializers.node.otf.fina(tfm,value) return prepare(tfm,'fina',value) end + function fonts.initializers.node.otf.frac(tfm,value) return prepare(tfm,'frac',value) end + function fonts.initializers.node.otf.haln(tfm,value) return prepare(tfm,'haln',value) end + function fonts.initializers.node.otf.hist(tfm,value) return prepare(tfm,'hist',value) end + function fonts.initializers.node.otf.hkna(tfm,value) return prepare(tfm,'hkna',value) end + function fonts.initializers.node.otf.hlig(tfm,value) return prepare(tfm,'hlig',value) end + function fonts.initializers.node.otf.hngl(tfm,value) return prepare(tfm,'hngl',value) end + function fonts.initializers.node.otf.init(tfm,value) return prepare(tfm,'init',value) end + function fonts.initializers.node.otf.isol(tfm,value) return prepare(tfm,'isol',value) end + function fonts.initializers.node.otf.ital(tfm,value) return prepare(tfm,'ital',value) end + function fonts.initializers.node.otf.jp78(tfm,value) return prepare(tfm,'jp78',value) end + function fonts.initializers.node.otf.jp83(tfm,value) return prepare(tfm,'jp83',value) end + function fonts.initializers.node.otf.jp90(tfm,value) return prepare(tfm,'jp90',value) end + function fonts.initializers.node.otf.kern(tfm,value) return prepare(tfm,'kern',value) end + function fonts.initializers.node.otf.liga(tfm,value) return prepare(tfm,'liga',value) end + function fonts.initializers.node.otf.lnum(tfm,value) return prepare(tfm,'lnum',value) end + function fonts.initializers.node.otf.locl(tfm,value) return prepare(tfm,'locl',value) end + function fonts.initializers.node.otf.mark(tfm,value) return prepare(tfm,'mark',value) end + function fonts.initializers.node.otf.med2(tfm,value) return prepare(tfm,'med2',value) end + function fonts.initializers.node.otf.medi(tfm,value) return prepare(tfm,'medi',value) end + function fonts.initializers.node.otf.mgrk(tfm,value) return prepare(tfm,'mgrk',value) end + function fonts.initializers.node.otf.mkmk(tfm,value) return prepare(tfm,'mkmk',value) end + function fonts.initializers.node.otf.nalt(tfm,value) return prepare(tfm,'nalt',value) end + function fonts.initializers.node.otf.nlck(tfm,value) return prepare(tfm,'nlck',value) end + function fonts.initializers.node.otf.nukt(tfm,value) return prepare(tfm,'nukt',value) end + function fonts.initializers.node.otf.numr(tfm,value) return prepare(tfm,'numr',value) end + function fonts.initializers.node.otf.onum(tfm,value) return prepare(tfm,'onum',value) end + function fonts.initializers.node.otf.ordn(tfm,value) return prepare(tfm,'ordn',value) end + function fonts.initializers.node.otf.ornm(tfm,value) return prepare(tfm,'ornm',value) end + function fonts.initializers.node.otf.pnum(tfm,value) return prepare(tfm,'pnum',value) end + function fonts.initializers.node.otf.pref(tfm,value) return prepare(tfm,'pref',value) end + function fonts.initializers.node.otf.pres(tfm,value) return prepare(tfm,'pres',value) end + function fonts.initializers.node.otf.pstf(tfm,value) return prepare(tfm,'pstf',value) end + function fonts.initializers.node.otf.rlig(tfm,value) return prepare(tfm,'rlig',value) end + function fonts.initializers.node.otf.rphf(tfm,value) return prepare(tfm,'rphf',value) end + function fonts.initializers.node.otf.salt(tfm,value) return prepare(tfm,'salt',value) end + function fonts.initializers.node.otf.sinf(tfm,value) return prepare(tfm,'sinf',value) end + function fonts.initializers.node.otf.smcp(tfm,value) return prepare(tfm,'smcp',value) end + function fonts.initializers.node.otf.smpl(tfm,value) return prepare(tfm,'smpl',value) end + function fonts.initializers.node.otf.ss01(tfm,value) return prepare(tfm,'ss01',value) end + function fonts.initializers.node.otf.ss02(tfm,value) return prepare(tfm,'ss02',value) end + function fonts.initializers.node.otf.ss03(tfm,value) return prepare(tfm,'ss03',value) end + function fonts.initializers.node.otf.ss04(tfm,value) return prepare(tfm,'ss04',value) end + function fonts.initializers.node.otf.ss05(tfm,value) return prepare(tfm,'ss05',value) end + function fonts.initializers.node.otf.ss06(tfm,value) return prepare(tfm,'ss06',value) end + function fonts.initializers.node.otf.ss07(tfm,value) return prepare(tfm,'ss07',value) end + function fonts.initializers.node.otf.ss08(tfm,value) return prepare(tfm,'ss08',value) end + function fonts.initializers.node.otf.ss09(tfm,value) return prepare(tfm,'ss09',value) end + function fonts.initializers.node.otf.subs(tfm,value) return prepare(tfm,'subs',value) end + function fonts.initializers.node.otf.sups(tfm,value) return prepare(tfm,'sups',value) end + function fonts.initializers.node.otf.swsh(tfm,value) return prepare(tfm,'swsh',value) end + function fonts.initializers.node.otf.titl(tfm,value) return prepare(tfm,'titl',value) end + function fonts.initializers.node.otf.tnam(tfm,value) return prepare(tfm,'tnam',value) end + function fonts.initializers.node.otf.tnum(tfm,value) return prepare(tfm,'tnum',value) end + function fonts.initializers.node.otf.trad(tfm,value) return prepare(tfm,'trad',value) end + function fonts.initializers.node.otf.unic(tfm,value) return prepare(tfm,'unic',value) end + function fonts.initializers.node.otf.zero(tfm,value) return prepare(tfm,'zero',value) end + +end + +do + + local glyph = node.id('glyph') + local glue = node.id('glue') + local kern_node = node.new("kern") + local glue_node = node.new("glue") + local glyph_node = node.new("glyph") + + local fontdata = fonts.tfm.id + local has_attribute = node.has_attribute + local set_attribute = node.set_attribute + local state = attributes.numbers['state'] or 100 + local marknumber = attributes.numbers['mark'] or 200 + local format = string.format + local report = logs.report + + fonts.otf.features.process = { } + + -- we share aome vars here, after all, we have no nested lookups and + -- less code + + local tfmdata = false + local otfdata = false + local characters = false + local marks = false + local glyphs = false + local currentfont = false + + function fonts.otf.features.process.feature(head,font,kind,attribute) + tfmdata = fontdata[font] + otfdata = tfmdata.shared.otfdata + characters = tfmdata.characters + marks = otfdata.luatex.marks + glyphs = otfdata.glyphs + currentfont = font + local lookuptable = tfmdata.shared.lookuptable[kind] + if lookuptable then + local types = otfdata.luatex.name_to_type + local start, done, ok = head, false, false + local processes = tfmdata.shared.processes[kind] + if #processes == 1 then + local p = processes[1] + while start do + if start.id == glyph and start.font == font and (not attribute or has_attribute(start,state,attribute)) then + -- we can make the p vars also global to this closure + local pp = p[3] -- all lookups + local pc = pp[start.char] + if pc then + start, ok = p[1](start,kind,p[2],pc,pp,p[4]) + done = done or ok + if start then start = start.next end + else + start = start.next + end + else + start = start.next + end + end + else + while start do + if start.id == glyph and start.font == font and (not attribute or has_attribute(start,state,attribute)) then + for i=1,#processes do local p = processes[i] + local pp = p[3] + local pc = pp[start.char] + if pc then + start, ok = p[1](start,kind,p[2],pc,pp,p[4]) + if ok then + done = true + break + elseif not start then + break + end + end + end + if start then start = start.next end + else + start = start.next + end + end + end + return head, done + else + return head, false + end + end + + -- todo: components / else subtype 0 / maybe we should be able to force this + + function toligature(start,stop,char,markflag) + if start ~= stop then + local deletemarks = markflag ~= "mark" + start.subtype = 1 + start.char = char + local marknum = 1 + local next = start.next + while true do + if marks[next.char] then + if not deletemarks then + set_attribute(next,marknumber,marknum) + end + else + marknum = marknum + 1 + end + if next == stop then + break + else + next = next.next + end + end + next = stop.next + while next do + if next.id == glyph and next.font == currentfont and marks[next.char] then + set_attribute(next,marknumber,marknum) + next = next.next + else + break + end + end + local next = start.next + while true do + if next == stop or deletemarks or marks[next.char] then + local crap = next + next.prev.next = next.next + if next.next then + next.next.prev = next.prev + end + if next == stop then + stop = crap.prev + node.free(crap) + break + else + next = next.next + node.free(crap) + end + else + next = next.next + end + end + end + return start + end + + function fonts.otf.features.process.gsub_single(start,kind,lookupname,replacements) + if replacements then + start.char = replacements + if fonts.otf.trace_replacements then + report("process otf",format("%s:%s replacing %s by %s",kind,lookupname,start.char,replacements)) + end + return start, true + else + return start, false + end + end + + function fonts.otf.features.process.gsub_alternate(start,kind,lookupname,alternatives) + if alternatives then + start.char = alternatives[1] -- will be preference + if fonts.otf.trace_replacements then + report("process otf",format("%s:%s alternative %s => %s",kind,lookupname,start.char,table.concat(alternatives,"|"))) + end + return start, true + else + return start, false + end + end + + function fonts.otf.features.process.gsub_multiple(start,kind,lookupname,multiples) + if multiples then + start.char = multiples[1] + if #multiples > 1 then + for k=2,#multiples do + local n = node.copy(start) + n.char = multiples[k] + n.next = start.next + n.prev = start + if start.next then + start.next.prev = n + end + start.next = n + start = n + end + end + if fonts.otf.trace_replacements then + report("process otf",format("%s:%s alternative %s => %s",kind,lookupname,start.char,table.concat(multiples," "))) + end + return start, true + else + return start, false + end + end + + function fonts.otf.features.process.gsub_ligature(start,kind,lookupname,ligatures,alldata,flags) + local s, stop = start.next, nil + while s and s.id == glyph and s.subtype == 0 and s.font == currentfont do + if marks[s.char] then + s = s.next + else + local lg = ligatures[1][s.char] + if not lg then + break + else + stop = s + ligatures = lg + s = s.next + end + end + end + if stop and ligatures[2] then + start = toligature(start,stop,ligatures[2],flags[1]) + if fonts.otf.trace_ligatures then + report("process otf",format("%s: inserting ligature %s (%s)",kind,start.char,utf.char(start.char))) + end + return start, true + end + return start, false + end + + -- again, using copies is more efficient than sharing code + + function fonts.otf.features.process.gpos_mark2base(start,kind,lookupname,baseanchors,anchors) -- maybe use copies + local bases = baseanchors['basechar'] + if bases then + local component = start.next + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + local trace = fonts.otf.trace_anchors + local last, done = start, false + while true do + local markanchors = anchors[component.char] + if markanchors then + local marks = markanchors['mark'] + if marks then + for anchor,data in pairs(marks) do + local ba = bases[anchor] + if ba then + local dx = tex.scale(ba.x-data.x, tfmdata.factor) + local dy = tex.scale(ba.y-data.y, tfmdata.factor) + component.xoffset = start.xoffset - dx + component.yoffset = start.yoffset + dy + if trace then + report("process otf",format("%s: anchoring mark %s to basechar %s => (%s,%s) => (%s,%s)",kind,component.char,start.char,dx,dy,component.xoffset,component.yoffset)) + end + done = true + break + end + end + end + last = component + end + component = component.next +--~ if component and component.id == kern then +--~ component = component.next +--~ end + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + -- ok + else + break + end + end + return last, done + end + end + return start, false + end + + function fonts.otf.features.process.gpos_mark2ligature(start,kind,lookupname,baseanchors,anchors) + local bases = baseanchors['baselig'] + if bases then + local component = start.next + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + local trace = fonts.otf.trace_anchors + local last, done = start, false + while true do + local markanchors = anchors[component.char] + if markanchors then + local marks = markanchors['mark'] + if marks then + for anchor,data in pairs(marks) do + local ba = bases[anchor] + if ba then + local n = has_attribute(component,marknumber) + local ban = ba[n] + if ban then + local dx = tex.scale(ban.x-data.x, tfmdata.factor) + local dy = tex.scale(ban.y-data.y, tfmdata.factor) + component.xoffset = start.xoffset - dx + component.yoffset = start.yoffset + dy + if trace then + report("process otf",format("%s:%s:%s anchoring mark %s to baselig %s => (%s,%s) => (%s,%s)",kind,anchor,n,component.char,start.char,dx,dy,component.xoffset,component.yoffset)) + end + done = true + break + end + end + end + end + end + last = component + component = component.next +--~ if component and component.id == kern then +--~ component = component.next +--~ end + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + -- ok + else + break + end + end + return last, done + end + end + return start, false + end + + function fonts.otf.features.process.gpos_mark2mark(start,kind,lookupname,baseanchors,anchors) + -- we can stay in the loop for all anchors + local bases = baseanchors['basemark'] + if bases then + local component = start.next + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + local baseattr = has_attribute(start,marknumber) or 1 + local trace = fonts.otf.trace_anchors + local last, done = start, false + while true do + local markattr = has_attribute(component,marknumber) or 1 + if baseattr == markattr then + local markanchors = anchors[component.char] + if markanchors then + local marks = markanchors['mark'] + if marks then + for anchor,data in pairs(marks) do + local ba = bases[anchor] + if ba then + local dx = tex.scale(ba.x-data.x, tfmdata.factor) + local dy = tex.scale(ba.y-data.y, tfmdata.factor) + component.xoffset = start.xoffset - dx + component.yoffset = start.yoffset + dy + if trace then + report("process otf",format("%s:%s:%s anchoring mark %s to basemark %s => (%s,%s) => (%s,%s)",kind,anchor,n,start.char,component.char,dx,dy,component.xoffset,component.yoffset)) + end + done = true + break + end + end + end + end + last = component + component = component.next +--~ if component and component.id == kern then +--~ component = component.next +--~ end + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + -- ok + else + break + end + else + break + end + end + return last, done + end + end + return start, false + end + + function fonts.otf.features.process.gpos_cursive(start,kind,lookupname,exitanchors,anchors) + local trace = fonts.otf.trace_anchors + local next, done, x, y, total, t, first = start.next, false, 0, 0, 0, { }, nil + local function finish() + local i = 0 + while first do + if characters[first.char].class == 'mark' then + first = first.next + else + first.yoffset = tex.scale(total, tfmdata.factor) + if first == next then + break + else + i = i + 1 + total = total - (t[i] or 0) + first = first.next + end + end + end + x, y, total, t, first = 0, 0, 0, { }, nil + end + while next do + if next.id == glyph and next.font == currentfont then + local nextchar = next.char + if marks[nextchar] then + next = next.next + else + local entryanchors, exitanchors = anchors[nextchar], anchors[start.char] + if entryanchors and exitanchors then + local centry, cexit = entryanchors['centry'], exitanchors['cexit'] + if centry and cexit then + for anchor, entry in pairs(centry) do + local exit = cexit[anchor] + if exit then + if not first then first = start end + t[#t+1] = exit.y + entry.y + total = total + t[#t] + done = true + break + end + end + else + finish() + end + else + finish() + end + start = next + next = start.next + end + else + finish() + break + end + end + return start, done + end + + function fonts.otf.features.process.gpos_single(start,kind,lookupname,basekerns,kerns) + report("otf process","gpos_single not yet supported") + return start, false + end + + function fonts.otf.features.process.gpos_pair(start,kind,lookupname,basekerns,kerns) + local next, prev, done = start.next, start, false + while next and next.id == glyph and next.font == currentfont do + if characters[next.char].class == 'mark' then + prev = next + next = next.next + else + local krn = basekerns[next.char] + if krn then + local a, b = krn[1], krn[2] + if a and a.x then + local k = node.copy(kern_node) + k.kern = tex.scale(a.x,fontdata[currentfont].factor) -- tfmdata.factor + if b and b.x then + report("otf process","we need to do something with the second kern xoff " .. b.x) + end + k.next = next + k.prev = prev + prev.next = k + next.prev = k + if fonts.otf.trace_kerns then + -- todo + end + end + -- skip over marks + end + break + end + end + return start, done + end + + chainprocs = { } -- we can probably optimize this because they're all internal lookups + + -- For the moment we save each looked up glyph in the sequence, which is ok because + -- each lookup in the chain has its own sequence. This saves memory. Only ligatures + -- are stored in the featurecache, because we don't want to loop over all characters + -- in order to locate them. + + -- We had a version that shared code, but it was too much a slow down + -- todo n x n. + + function chainprocs.gsub_single(start,stop,kind,lookupname,sequence,lookups) + local char = start.char + local cacheslot = sequence[1] + local replacement = cacheslot[char] + if replacement == true then + if lookups then + local looks = glyphs[tfmdata.characters[char].index].lookups + if looks then + local lookups = otfdata.luatex.internals[lookups[1]].lookups + local unicodes = otfdata.luatex.unicodes + for l=1,#lookups do + local lv = looks[lookups[l]] + if lv then + replacement = unicodes[lv[1].specification.variant] or char + cacheslot[char] = replacement + break + end + end + else + replacement, cacheslot[char] = char, char + end + else + replacement, cacheslot[char] = char, char + end + end + if fonts.otf.trace_replacements then + report("otf chain",format("%s: replacing character %s by single %s",kind,char,replacement)) + end + start.char = replacement + return start + end + + function chainprocs.gsub_multiple(start,stop,kind,lookupname,sequence,lookups) + local char = start.char + local cacheslot = sequence[1] + local replacement = cacheslot[char] + if replacement == true then + if lookups then + local looks = glyphs[tfmdata.characters[char].index].lookups + if looks then + local lookups = otfdata.luatex.internals[lookups[1]].lookups + local unicodes = otfdata.luatex.unicodes + for l=1,#lookups do + local lv = looks[lookups[l]] + if lv then + replacement = { } + for c in lv[1].specification.components:gmatch("(%S+)") do + replacement[#replacement+1] = unicodes[c] + end + cacheslot[char] = replacement + break + end + end + else + replacement = { char } + cacheslot[char] = replacement + end + else + replacement = { char } + cacheslot[char] = replacement + end + end + if fonts.otf.trace_replacements then + report("otf chain",format("%s: replacing character %s by multiple",kind,char)) + end + start.char = replacement[1] + if #replacement > 1 then + for k=2,#replacement do + local n = node.copy(start) + n.char = replacement[k] + n.next = start.next + n.prev = start + if start.next then + start.next.prev = n + end + start.next = n + start = n + end + end + return start + end + + function chainprocs.gsub_alternate(start,stop,kind,lookupname,sequence,lookups) + local char = start.char + local cacheslot = sequence[1] + local replacement = cacheslot[char] + if replacement == true then + if lookups then + local looks = glyphs[tfmdata.characters[char].index].lookups + if looks then + local lookups = otfdata.luatex.internals[lookups[1]].lookups + local unicodes = otfdata.luatex.unicodes + for l=1,#lookups do + local lv = looks[lookups[l]] + if lv then + replacement = { } + for c in lv[1].specification.components:gmatch("(%S+)") do + replacement[#replacement+1] = unicodes[c] + end + cacheslot[char] = replacement + break + end + end + else + replacement = { char } + cacheslot[char] = replacement + end + else + replacement = { char } + cacheslot[char] = replacement + end + end + if fonts.otf.trace_replacements then + report("otf chain",format("%s: replacing character %s by alternate",kind,char)) + end + start.char = replacement[1] + return start + end + + function chainprocs.gsub_ligature(start,stop,kind,lookupname,sequence,lookups,flags) + if lookups then + local featurecache = fontdata[currentfont].shared.featurecache + if not featurecache[kind] then + featurecache[kind] = fonts.otf.features.collect_ligatures(tfmdata,kind) + -- to be tested: only collect internal + -- featurecache[kind] = fonts.otf.features.collect_ligatures(tfmdata,kind,true) -- + end + local lookups = otfdata.luatex.internals[lookups[1]].lookups + local ligaturecache = featurecache[kind] + for i=1,#lookups do + local ligatures = ligaturecache[lookups[i]] + if ligatures and ligatures[start.char] then + ligatures = ligatures[start.char] + local s = start.next + while s do + if characters[s.char].class == 'mark' then + s = s.next + else + local lg = ligatures[1][s.char] + if not lg then + break + else + ligatures = lg + if s == stop then + break + else + s = s.next + end + end + end + end + if ligatures[2] then + if fonts.otf.trace_ligatures then + report("otf chain",format("%s: replacing character %s by ligature",kind,start.char)) + end + return toligature(start,stop,ligatures[2],flags[1]) + end + break + end + end + end + return stop + end + + function chainprocs.gpos_mark2base(start,stop,kind,lookupname,sequence,lookups) + local component = start.next + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + local char = start.char + local anchortag = sequence[1][char] + if anchortag == true then + local classes = otfdata.anchor_classes + for k=1,#classes do + local v = classes[k] + if v.lookup == lookupname and v.type == kind then + anchortag = v.name + sequence[1][char] = anchortag + break + end + end + end + if anchortag ~= true then + local glyph = glyphs[characters[char].index] + if glyph.anchors and glyph.anchors[anchortag] then + local trace = fonts.otf.trace_anchors + local last, done = start, false + local baseanchors = glyph.anchors['basechar'][anchortag] + while true do + local nextchar = component.char + local charnext = characters[nextchar] + local markanchors = glyphs[charnext.index].anchors['mark'][anchortag] + if markanchors then + for anchor,data in pairs(markanchors) do + local ba = baseanchors[anchor] + if ba then + local dx = tex.scale(ba.x-data.x, tfmdata.factor) + local dy = tex.scale(ba.y-data.y, tfmdata.factor) + component.xoffset = start.xoffset - dx + component.yoffset = start.yoffset + dy + if trace then + report("otf chain",format("%s: anchoring mark %s to basechar %s => (%s,%s) => (%s,%s)",kind,component.char,start.char,dx,dy,component.xoffset,component.yoffset)) + end + done = true + break + end + end + end + last = component + component = component.next + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + -- ok + else + break + end + end + return last, done + end + end + end + return start, false + end + + function chainprocs.gpos_mark2ligature(start,stop,kind,lookupname,sequence,lookups) + local component = start.next + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + local char = start.char + local anchortag = sequence[1][char] + if anchortag == true then + local classes = otfdata.anchor_classes + for k=1,#classes do + local v = classes[k] + if v.lookup == lookupname and v.type == kind then + anchortag = v.name + sequence[1][char] = anchortag + break + end + end + end + if anchortag ~= true then + local glyph = glyphs[characters[char].index] + if glyph.anchors and glyph.anchors[anchortag] then + local trace = fonts.otf.trace_anchors + local done = false + local last = start + local baseanchors = glyph.anchors['baselig'][anchortag] + while true do + local nextchar = component.char + local charnext = characters[nextchar] + local markanchors = glyphs[charnext.index].anchors['mark'][anchortag] + if markanchors then + for anchor,data in pairs(markanchors) do + local ba = baseanchors[anchor] + if ba then + local n = has_attribute(component,marknumber) + local ban = ba[n] + if ban then + local dx = tex.scale(ban.x-data.x, tfmdata.factor) + local dy = tex.scale(ban.y-data.y, tfmdata.factor) + component.xoffset = start.xoffset - dx + component.yoffset = start.yoffset + dy + if trace then + report("otf chain",format("%s: anchoring mark %s to baselig %s => (%s,%s) => (%s,%s)",kind,component.char,start.char,dx,dy,component.xoffset,component.yoffset)) + end + done = true + break + end + end + end + end + last = component + component = component.next + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + -- ok + else + break + end + end + return last, done + end + end + end + return start, false + end + + function chainprocs.gpos_mark2mark(start,stop,kind,lookupname,sequence,lookups) + local component = start.next + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + local char = start.char + local anchortag = sequence[1][char] + if anchortag == true then + local classes = otfdata.anchor_classes + for k=1,#classes do + local v = classes[k] + if v.lookup == lookupname and v.type == kind then + anchortag = v.name + sequence[1][char] = anchortag + break + end + end + end + local baseattr = has_attribute(start,marknumber) + local markattr = has_attribute(component,marknumber) + if baseattr == markattr and anchortag ~= true then + local glyph = glyphs[characters[char].index] + if glyph.anchors and glyph.anchors[anchortag] then + local trace = fonts.otf.trace_anchors + local last, done = false + local baseanchors = glyph.anchors['basemark'][anchortag] + while true do + local nextchar = component.char + local charnext = characters[nextchar] + local markanchors = glyphs[charnext.index].anchors['mark'][anchortag] + if markanchors then + for anchor,data in pairs(markanchors) do + local ba = baseanchors[anchor] + if ba then + local dx = tex.scale(ba.x-data.x, tfmdata.factor) + local dy = tex.scale(ba.y-data.y, tfmdata.factor) + component.xoffset = start.xoffset - dx + component.yoffset = start.yoffset + dy + if trace then + report("otf chain",format("%s: anchoring mark %s to basemark %s => (%s,%s) => (%s,%s)",kind,component.char,start.char,dx,dy,component.xoffset,component.yoffset)) + end + done = true + break + end + end + end + last = component + component = component.next + if component and component.id == glyph and component.font == currentfont and marks[component.char] then + markattr = has_attribute(component,marknumber) + if baseattr ~= markattr then + break + end + else + break + end + end + return last, done + end + end + end + return start, false + end + + function chainprocs.gpos_cursive(start,stop,kind,lookupname,sequence,lookups) + report("otf chain","chainproc gpos_cursive not yet supported") + return start + end + function chainprocs.gpos_single(start,stop,kind,lookupname,sequence,lookups) + report("otf process","chainproc gpos_single not yet supported") + return start + end + function chainprocs.gpos_pair(start,stop,kind,lookupname,sequence,lookups) + report("otf process","chainproc gpos_pair not yet supported") + return start + end + + function chainprocs.self(start,stop,kind,lookupname,sequence,lookups) + report("otf process","self refering lookup cannot happen") + return stop + end + + function fonts.otf.features.process.contextchain(start,kind,lookupname,contextdata) + local done = false + local contexts = contextdata.lookups + local flags = contextdata.flags + local skipmark, skipligature, skipbase = unpack(flags) + for k=1,#contexts do + local match, stop = true, start + local rule, lookuptype, sequence, before, after, lookups = unpack(contexts[k]) + if #sequence > 0 then + if #sequence == 1 then + match = sequence[1][start.char] + else -- n = #sequence -> faster + for n=1,#sequence do + if stop and stop.id == glyph and stop.font == currentfont then + local char = stop.char + local class = characters[char].class + if class == skipmark or class == skipligature or class == skipbase then + -- skip 'm + elseif sequence[n][char] then + if n < #sequence then + stop = stop.next + end + else + match = false break + end + else + match = false break + end + end + end + end + if match and #before > 0 then + local prev = start.prev + if prev then + if #before == 1 then + match = prev.id == glyph and prev.font == currentfont and before[1][prev.char] + else + for n=#before,1 do + if prev then + if prev.id == glyph and prev.font == currentfont then -- normal char + local char = prev.char + local class = characters[char].class + if class == skipmark or class == skipligature or class == skipbase then + -- skip 'm + elseif not before[n][char] then + match = false break + end + elseif not before[n][32] then + match = false break + end + prev = prev.prev + elseif not before[n][32] then + match = false break + end + end + end + elseif #before == 1 then + match = before[1][32] + else + for n=#before,1 do + if not before[n][32] then + match = false break + end + end + end + end + if match and #after > 0 then + local next = stop.next + if next then + if #after == 1 then + match = next.id == glyph and next.font == currentfont and after[1][next.char] + else + for n=1,#after do + if next then + if next.id == glyph and next.font == currentfont then -- normal char + local char = next.char + local class = characters[char].class + if class == skipmark or class == skipligature or class == skipbase then + -- skip 'm + elseif not after[n][char] then + match = false break + end + elseif not after[n][32] then -- brrr + match = false break + end + next = next.next + elseif not after[n][32] then + match = false break + end + end + end + elseif #after == 1 then + match = after[1][32] + else + for n=1,#after do + if not after[n][32] then + match = false break + end + end + end + end + if match then + local trace = fonts.otf.trace_contexts + if trace then + report("otf chain",format("%s: rule %s of %s matches %s times at char %s (%s) lookuptype %s",kind,rule,lookupname,#sequence,char,utf.char(char),lookuptype)) + end + if lookups then + local cp = chainprocs[lookuptype] + if cp then + start = cp(start,stop,kind,lookupname,sequence,lookups,flags) + else + report("otf chain",format("%s: lookuptype %s not supported yet for %s",kind,lookuptype,lookupname)) + end + elseif trace then + report("otf chain",format("%s: skipping match for %s",kind,lookupname)) + end + done = true + break + end + end + return start, done + end + + function fonts.otf.features.process.reversecontextchain(start,kind,lookupname,contextdata) + -- there is only a single substitution here so it is a simple case of the normal one + -- sequence is one character here and we swap the rest + local done = false + local contexts = contextdata.lookups + local flags = contextdata.flags + local skipmark, skipligature, skipbase = unpack(flags) + for k=1,#contexts do + local match, stop = true, start + local rule, lookuptype, sequence, before, after, lookups = unpack(contexts[k]) + match = sequence[1][start.char] + if match and #after > 0 then + local prev = start.prev + if prev then + if #after == 1 then + match = prev.id == glyph and prev.font == currentfont and after[1][prev.char] + else + for n=1,#after do + if prev then + if prev.id == glyph and prev.font == currentfont then -- normal char + local char = prev.char + local class = characters[char].class + if class == skipmark or class == skipligature or class == skipbase then + -- skip 'm + elseif not after[n][char] then + match = false break + end + elseif not after[n][32] then + match = false break + end + prev = prev.prev + elseif not after[n][32] then + match = false break + end + end + end + elseif #after == 1 then + match = after[1][32] + else + for n=#after,1 do + if not after[n][32] then + match = false break + end + end + end + end + if match and #before > 0 then + local next = stop.next + if next then + if #after == 1 then + match = next.id == glyph and next.font == currentfont and before[1][next.char] + else + for n=#before,1 do + if next then + if next.id == glyph and next.font == currentfont then -- normal char + local char = next.char + local class = characters[char].class + if class == skipmark or class == skipligature or class == skipbase then + -- skip 'm + elseif not before[n][char] then + match = false break + end + elseif not before[n][32] then -- brrr + match = false break + end + next = next.next + elseif not before[n][32] then + match = false break + end + end + end + elseif #before == 1 then + match = before[1][32] + else + for n=1,#before do + if not before[n][32] then + match = false break + end + end + end + end + if match then + local trace = fonts.otf.trace_contexts + if trace then + report("otf reverse chain",format("%s: rule %s of %s matches %s times at char %s (%s) lookuptype %s",kind,rule,lookupname,#sequence,char,utf.char(char),lookuptype)) + end + if lookups then + local cp = chainprocs[lookuptype] + if cp then + start = cp(start,stop,kind,lookupname,sequence,lookups,flags) + else + report("otf reverse chain",format("%s: lookuptype %s not supported yet for %s",kind,lookuptype,lookupname)) + end + elseif trace then + report("otf reverse chain",format("%s: skipping match for %s",kind,lookupname)) + end + done = true + break + end + end + return start, done + end + + fonts.otf.features.process.gsub_context = fonts.otf.features.process.contextchain + fonts.otf.features.process.gsub_contextchain = fonts.otf.features.process.contextchain + fonts.otf.features.process.gsub_reversecontextchain = fonts.otf.features.process.reversecontextchain + + fonts.otf.features.process.gpos_contextchain = fonts.otf.features.process.contextchain + fonts.otf.features.process.gpos_context = fonts.otf.features.process.contextchain + +end + +-- aalt abvf abvs blwf blwm blws dist falt fwid half halt hwid jalt lfbd ljmo +-- mset opbd palt pwid qwid rand rtbd rtla ruby size tjmo twid valt vatu vert +-- vhal vjmo vkna vkrn vpal vrt2 + +do + + local process = fonts.otf.features.process.feature + + function fonts.methods.node.otf.afrc(head,font) return process(head,font,'afrc') end + function fonts.methods.node.otf.akhn(head,font) return process(head,font,'akhn') end + function fonts.methods.node.otf.c2pc(head,font) return process(head,font,'c2pc') end + function fonts.methods.node.otf.c2sc(head,font) return process(head,font,'c2sc') end + function fonts.methods.node.otf.calt(head,font) return process(head,font,'calt') end + function fonts.methods.node.otf.case(head,font) return process(head,font,'case') end + function fonts.methods.node.otf.ccmp(head,font) return process(head,font,'ccmp') end + function fonts.methods.node.otf.clig(head,font) return process(head,font,'clig') end + function fonts.methods.node.otf.cpsp(head,font) return process(head,font,'cpsp') end + function fonts.methods.node.otf.cswh(head,font) return process(head,font,'cswh') end + function fonts.methods.node.otf.curs(head,font) return process(head,font,'curs') end + function fonts.methods.node.otf.dlig(head,font) return process(head,font,'dlig') end + function fonts.methods.node.otf.dnom(head,font) return process(head,font,'dnom') end + function fonts.methods.node.otf.expt(head,font) return process(head,font,'expt') end + function fonts.methods.node.otf.fin2(head,font) return process(head,font,'fin2') end + function fonts.methods.node.otf.fin3(head,font) return process(head,font,'fin3') end + function fonts.methods.node.otf.fina(head,font) return process(head,font,'fina',3) end + function fonts.methods.node.otf.frac(head,font) return process(head,font,'frac') end + function fonts.methods.node.otf.haln(head,font) return process(head,font,'haln') end + function fonts.methods.node.otf.hist(head,font) return process(head,font,'hist') end + function fonts.methods.node.otf.hkna(head,font) return process(head,font,'hkna') end + function fonts.methods.node.otf.hlig(head,font) return process(head,font,'hlig') end + function fonts.methods.node.otf.hngl(head,font) return process(head,font,'hngl') end + function fonts.methods.node.otf.init(head,font) return process(head,font,'init',1) end + function fonts.methods.node.otf.isol(head,font) return process(head,font,'isol',4) end + function fonts.methods.node.otf.ital(head,font) return process(head,font,'ital') end + function fonts.methods.node.otf.jp78(head,font) return process(head,font,'jp78') end + function fonts.methods.node.otf.jp83(head,font) return process(head,font,'jp83') end + function fonts.methods.node.otf.jp90(head,font) return process(head,font,'jp90') end + function fonts.methods.node.otf.kern(head,font) return process(head,font,'kern') end + function fonts.methods.node.otf.liga(head,font) return process(head,font,'liga') end + function fonts.methods.node.otf.lnum(head,font) return process(head,font,'lnum') end + function fonts.methods.node.otf.locl(head,font) return process(head,font,'locl') end + function fonts.methods.node.otf.mark(head,font) return process(head,font,'mark') end + function fonts.methods.node.otf.med2(head,font) return process(head,font,'med2') end + function fonts.methods.node.otf.medi(head,font) return process(head,font,'medi',2) end + function fonts.methods.node.otf.mgrk(head,font) return process(head,font,'mgrk') end + function fonts.methods.node.otf.mkmk(head,font) return process(head,font,'mkmk') end + function fonts.methods.node.otf.nalt(head,font) return process(head,font,'nalt') end + function fonts.methods.node.otf.nlck(head,font) return process(head,font,'nlck') end + function fonts.methods.node.otf.nukt(head,font) return process(head,font,'nukt') end + function fonts.methods.node.otf.numr(head,font) return process(head,font,'numr') end + function fonts.methods.node.otf.onum(head,font) return process(head,font,'onum') end + function fonts.methods.node.otf.ordn(head,font) return process(head,font,'ordn') end + function fonts.methods.node.otf.ornm(head,font) return process(head,font,'ornm') end + function fonts.methods.node.otf.pnum(head,font) return process(head,font,'pnum') end + function fonts.methods.node.otf.pref(head,font) return process(head,font,'pref') end + function fonts.methods.node.otf.pres(head,font) return process(head,font,'pres') end + function fonts.methods.node.otf.pstf(head,font) return process(head,font,'pstf') end + function fonts.methods.node.otf.rlig(head,font) return process(head,font,'rlig') end + function fonts.methods.node.otf.rphf(head,font) return process(head,font,'rphf') end + function fonts.methods.node.otf.salt(head,font) return process(head,font,'calt') end + function fonts.methods.node.otf.sinf(head,font) return process(head,font,'sinf') end + function fonts.methods.node.otf.smcp(head,font) return process(head,font,'smcp') end + function fonts.methods.node.otf.smpl(head,font) return process(head,font,'smpl') end + function fonts.methods.node.otf.ss01(head,font) return process(head,font,'ss01') end + function fonts.methods.node.otf.ss02(head,font) return process(head,font,'ss02') end + function fonts.methods.node.otf.ss03(head,font) return process(head,font,'ss03') end + function fonts.methods.node.otf.ss04(head,font) return process(head,font,'ss04') end + function fonts.methods.node.otf.ss05(head,font) return process(head,font,'ss05') end + function fonts.methods.node.otf.ss06(head,font) return process(head,font,'ss06') end + function fonts.methods.node.otf.ss07(head,font) return process(head,font,'ss07') end + function fonts.methods.node.otf.ss08(head,font) return process(head,font,'ss08') end + function fonts.methods.node.otf.ss09(head,font) return process(head,font,'ss09') end + function fonts.methods.node.otf.subs(head,font) return process(head,font,'subs') end + function fonts.methods.node.otf.sups(head,font) return process(head,font,'sups') end + function fonts.methods.node.otf.swsh(head,font) return process(head,font,'swsh') end + function fonts.methods.node.otf.titl(head,font) return process(head,font,'titl') end + function fonts.methods.node.otf.tnam(head,font) return process(head,font,'tnam') end + function fonts.methods.node.otf.tnum(head,font) return process(head,font,'tnum') end + function fonts.methods.node.otf.trad(head,font) return process(head,font,'trad') end + function fonts.methods.node.otf.unic(head,font) return process(head,font,'unic') end + function fonts.methods.node.otf.zero(head,font) return process(head,font,'zero') end + +end + +--~ function fonts.initializers.node.otf.install(feature,attribute) +--~ function fonts.initializers.node.otf[feature](tfm,value) return fonts.otf.features.prepare.feature(tfm,feature,value) end +--~ function fonts.methods.node.otf[feature] (head,font) return fonts.otf.features.process.feature(head,font,feature,attribute) end +--~ end + +-- common stuff + +function fonts.otf.features.language(tfm,value) + if value then + value = value:lower() + if fonts.otf.tables.languages[value] then + tfm.language = value + end + end +end + +function fonts.otf.features.script(tfm,value) + if value then + value = value:lower() + if fonts.otf.tables.scripts[value] then + tfm.script = value + end + end +end + +function fonts.otf.features.mode(tfm,value) + if value then + tfm.mode = value:lower() + end +end + +fonts.initializers.base.otf.language = fonts.otf.features.language +fonts.initializers.base.otf.script = fonts.otf.features.script +fonts.initializers.base.otf.mode = fonts.otf.features.mode +fonts.initializers.base.otf.method = fonts.otf.features.mode + +fonts.initializers.node.otf.language = fonts.otf.features.language +fonts.initializers.node.otf.script = fonts.otf.features.script +fonts.initializers.node.otf.mode = fonts.otf.features.mode +fonts.initializers.node.otf.method = fonts.otf.features.mode + +fonts.initializers.node.otf.trep = fonts.initializers.base.otf.trep +fonts.initializers.node.otf.tlig = fonts.initializers.base.otf.tlig +fonts.initializers.node.otf.texquotes = fonts.initializers.base.otf.texquotes +fonts.initializers.node.otf.texligatures = fonts.initializers.base.otf.texligatures + +-- we need this because fonts can be bugged + +-- \definefontfeature[calt][language=nld,script=latn,mode=node,calt=yes,clig=yes,rlig=yes] +-- \definefontfeature[dflt][language=nld,script=latn,mode=node,calt=no, clig=yes,rlig=yes] +-- \definefontfeature[fixd][language=nld,script=latn,mode=node,calt=no, clig=yes,rlig=yes,ignoredrules={44,45,47}] + +-- \starttext + +-- {\type{dflt:}\font\test=ZapfinoExtraLTPro*dflt at 24pt \test \char57777\char57812 c/o} \endgraf +-- {\type{calt:}\font\test=ZapfinoExtraLTPro*calt at 24pt \test \char57777\char57812 c/o} \endgraf +-- {\type{fixd:}\font\test=ZapfinoExtraLTPro*fixd at 24pt \test \char57777\char57812 c/o} \endgraf + +-- \stoptext + +--~ table.insert(fonts.triggers,"ignoredrules") + +--~ function fonts.initializers.node.otf.ignoredrules(tfmdata,value) +--~ if value then +--~ -- these tests must move ! +--~ tfmdata.unique = tfmdata.unique or { } +--~ tfmdata.unique.ignoredrules = tfmdata.unique.ignoredrules or { } +--~ local ignored = tfmdata.unique.ignoredrules +--~ -- value is already ok now +--~ for s in string.gmatch(value:gsub("[{}]","")..",", "%s*(.-),") do +--~ ignored[tonumber(s)] = true +--~ end +--~ end +--~ end + +fonts.initializers.base.otf.equaldigits = fonts.initializers.common.equaldigits +fonts.initializers.node.otf.equaldigits = fonts.initializers.common.equaldigits + +fonts.initializers.base.otf.lineheight = fonts.initializers.common.lineheight +fonts.initializers.node.otf.lineheight = fonts.initializers.common.lineheight + +-- temp hack, may change + +function fonts.initializers.base.otf.kern(tfmdata,value) + fonts.otf.features.prepare_base_kerns(tfmdata,'kern',value) +end + +--~ fonts.initializers.node.otf.kern = fonts.initializers.base.otf.kern + +-- there is no real need to register features here, only the defaults; supported +-- features are part of the font data + +-- fonts.otf.features.register('tlig',true) +-- fonts.otf.features.register('liga',true) +-- fonts.otf.features.register('kern',true) + +-- bonus function + +function fonts.otf.name_to_slot(name) -- todo: afm en tfm + local tfmdata = fonts.tfm.id[font.current()] + if tfmdata and tfmdata.shared then + local otfdata = tfmdata.shared.otfdata + if otfdata and otfdata.luatex then + return otfdata.luatex.unicodes[name] + end + end + return nil +end + +function fonts.otf.char(n) -- todo: afm en tfm + if type(n) == "string" then + n = fonts.otf.name_to_slot(n) + end + if n then + tex.sprint(tex.ctxcatcodes,string.format("\\char%s ",n)) + end +end + +--~ function fonts.otf.name_to_table(name) +--~ lcoal temp, result = { } +--~ local tfmdata = fonts.tfm.id[font.current()] +--~ if tfmdata and tfmdata.shared then +--~ local otfdata = tfmdata.shared.otfdata +--~ if otfdata and otfdata.luatex then +--~ for k,v in pairs(otfdata.glyphs) do +--~ if v.name:find(name) then +--~ temp[v.name] = v.unicodeenc +--~ end +--~ end +--~ end +--~ end +--~ for k,v in pairs(table.sortedkeys(temp)) do +--~ result[#result+1] = { v, temp[v] } +--~ end +--~ return result +--~ end + +-- Here we plug in some analyzing code + + +do + + local glyph = node.id('glyph') + local fontdata = fonts.tfm.id + local set_attribute = node.set_attribute + local has_attribute = node.has_attribute + local state = attributes.numbers['state'] or 100 + + -- in the future we will use language/script attributes instead of the + -- font related value, but then we also need dynamic features which is + -- somewhat slower; and .. we need a chain of them + + function fonts.initializers.node.otf.analyze(tfm,value) + local script, language = tfm.script, tfm.language + local action = fonts.analyzers.initializers[script] + if action then + if type(action) == "function" then + return action(tfm,value) + elseif action[language] then + return action[language](tfm,value) + end + end + return nil + end + + function fonts.methods.node.otf.analyze(head,font) + local tfmdata = fontdata[font] + local script, language = fontdata[font].script, fontdata[font].language + local action = fonts.analyzers.methods[script] + if action then + if type(action) == "function" then + return action(head,font) + elseif action[language] then + return action[language](head,font) + end + end + return head, false + end + + fonts.otf.features.register("analyze",true) -- we always analyze + table.insert(fonts.triggers,"analyze") -- we need a proper function for doing this + + -- latin + + fonts.analyzers.methods.latn = fonts.analyzers.aux.setstate + + -- arab / todo: 0640 tadwil + + local isol = { + [0x0621] = true, + } + + local isol_fina = { + [0x0622] = true, [0x0623] = true, [0x0624] = true, [0x0625] = true, [0x0627] = true, [0x062F] = true, + [0x0630] = true, [0x0631] = true, [0x0632] = true, + [0x0648] = true, + [0xFEF5] = true, [0xFEF7] = true, [0xFEF9] = true, [0xFEFB] = true, + } + + local isol_fina_medi_init = { + [0x0626] = true, [0x0628] = true, [0x0629] = true, [0x062A] = true, [0x062B] = true, [0x062C] = true, [0x062D] = true, [0x062E] = true, + [0x0633] = true, [0x0634] = true, [0x0635] = true, [0x0636] = true, [0x0637] = true, [0x0638] = true, [0x0639] = true, [0x063A] = true, + [0x0641] = true, [0x0642] = true, [0x0643] = true, [0x0644] = true, [0x0645] = true, [0x0646] = true, [0x0647] = true, [0x0649] = true, [0x064A] = true, + [0x067E] = true, + [0x0686] = true, + } + + local arab_warned = { } + + local function warning(current,what) + local char = current.char + if not arab_warned[char] then + log.report("analyze",string.format("arab: character %s (0x%04X) has no %s class", char, char, what)) + arab_warned[char] = true + end + end + + local fcs = fonts.color.set + local fcr = fonts.color.reset + + function fonts.analyzers.methods.nocolor(head,font) + for n in nodes.traverse(glyph) do + if not font or n.font == font then + fcr(n) + end + end + return head, true + end + + function fonts.analyzers.methods.arab(head,font) -- maybe make a special version with no trace + local characters = fontdata[font].characters + local first, last, current, done = nil, nil, head, false + local trace = fonts.color.trace + --~ local laststate = 0 + local function finish() + if last then + if first == last then + if isol_fina_medi_init[first.char] or isol_fina[first.char] then + set_attribute(first,state,4) -- isol + if trace then fcs(first,"font:isol") end + else + warning(first,"isol") + set_attribute(first,state,0) -- error + if trace then fcr(first) end + end + else + if isol_fina_medi_init[last.char] or isol_fina[last.char] then -- why isol here ? + -- if laststate == 1 or laststate == 2 or laststate == 4 then + set_attribute(last,state,3) -- fina + if trace then fcs(last,"font:fina") end + else + warning(last,"fina") + set_attribute(last,state,0) -- error + if trace then fcr(last) end + end + end + first, last = nil, nil + elseif first then + -- first and last are either both set so we never com here + if isol_fina_medi_init[first.char] or isol_fina[first.char] then + set_attribute(first,state,4) -- isol + if trace then fcs(first,"font:isol") end + else + warning(first,"isol") + set_attribute(first,state,0) -- error + if trace then fcr(first) end + end + first = nil + end + --~ laststate = 0 + end + while current do + if current.id == glyph and current.font == font then + done = true + local char = current.char + if characters[char].class == "mark" then -- marks are now in components + set_attribute(current,state,5) -- mark + if trace then fcs(current,"font:mark") end + elseif isol[char] then + finish() + set_attribute(current,state,4) -- isol + if trace then fcs(current,"font:isol") end + first, last = nil, nil + --~ laststate = 0 + elseif not first then + if isol_fina_medi_init[char] then + set_attribute(current,state,1) -- init + if trace then fcs(current,"font:init") end + first, last = first or current, current + --~ laststate = 1 + elseif isol_fina[char] then + set_attribute(current,state,4) -- isol + if trace then fcs(current,"font:isol") end + first, last = nil, nil + --~ laststate = 0 + else -- no arab + finish() + end + elseif isol_fina_medi_init[char] then + first, last = first or current, current + set_attribute(current,state,2) -- medi + if trace then fcs(current,"font:medi") end + --~ laststate = 2 + elseif isol_fina[char] then + -- if not laststate == 1 then + if not has_attribute(last,state,1) then + -- tricky, we need to check what last may be ! + set_attribute(last,state,2) -- medi + if trace then fcs(last,"font:medi") end + end + set_attribute(current,state,3) -- fina + if trace then fcs(current,"font:fina") end + first, last = nil, nil + --~ laststate = 0 + elseif char >= 0x0600 and char <= 0x06FF then + if trace then fcs(current,"font:rest") end + finish() + else --no + finish() + end + else + finish() + end + current = current.next + end + finish() + return head, done + end + +end + +-- experimental and will probably change + +function fonts.install_feature(type,...) + if fonts[type] and fonts[type].install_feature then + fonts[type].install_feature(...) + end +end +function fonts.otf.install_feature(tag) + fonts.methods.node.otf [tag] = function(head,font) return fonts.otf.features.process.feature(head,font,tag) end + fonts.initializers.node.otf[tag] = function(tfm,value) return fonts.otf.features.prepare.feature(tfm,tag,value) end +end + + +--~ exclam + quoteleft => exclamdown +--~ question + quoteleft => questiondown + +--~ less + less => guillemotleft +--~ greater + greater => guillemotright + +--~ I + J => IJ +--~ f + f => ff +--~ f + i => fi +--~ f + l => fl +--~ f + k => fk +--~ ff + i => ffi +--~ ff + l => ffl +--~ i + j => ij + +--~ comma + comma => quotedblbase +--~ quoteleft + quoteleft => quotedblleft +--~ quoteright + quoteright => quotedblright + +--~ hyphen + hyphen => endash +--~ endash + hyphen => emdash + diff --git a/tex/context/base/font-syn.lua b/tex/context/base/font-syn.lua new file mode 100644 index 000000000..77898a4a2 --- /dev/null +++ b/tex/context/base/font-syn.lua @@ -0,0 +1,285 @@ +if not modules then modules = { } end modules ['font-syn'] = { + version = 1.001, + comment = "companion to font-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

This module implements a name to filename resolver. Names are resolved +using a table that has keys filtered from the font related files.

+--ldx]]-- + +fonts = fonts or { } +input = input or { } +texmf = texmf or { } + +fonts.names = { } +fonts.names.filters = { } +fonts.names.data = { } +fonts.names.version = 1.04 +fonts.names.saved = false +fonts.names.loaded = false +fonts.names.be_clever = true +fonts.names.enabled = true +fonts.names.cache = containers.define("fonts","data",fonts.names.version,true) + +--[[ldx-- +

It would make sense to implement the filters in the related modules, +but to keep the overview, we define them here.

+--ldx]]-- + +fonts.names.filters.otf = fontforge.info +fonts.names.filters.ttf = fontforge.info +fonts.names.filters.ttc = fontforge.info + +function fonts.names.filters.afm(name) + local f = io.open(name) + if f then + local hash = { } + for line in f:lines() do + local key, value = line:match("^(.+)%s+(.+)%s*$") + if key and #key > 0 then + hash[key:lower()] = value + end + if line:find("StartCharMetrics") then + break + end + end + f:close() + return hash + else + return nil + end +end + +--[[ldx-- +

The scanner loops over the filters using the information stored in +the file databases. Watch how we check not only for the names, but also +for combination with the weight of a font.

+--ldx]]-- + +fonts.names.filters.list = { + "otf", "ttf", "ttc", "afm" +} + +fonts.names.filters.fixes = { + { "reg$", "regular", }, + { "ita$", "italic", }, + { "ital$", "italic", }, + { "cond$", "condensed", }, +} + +function fonts.names.identify() + fonts.names.data = { + mapping = { }, + version = fonts.names.version + } + local done, mapping, nofread, nofok = { }, fonts.names.data.mapping, 0, 0 + local function add(n,fontname,filename,suffix, sub) + n = n:lower() + if not mapping[n] then mapping[n], nofok = { suffix, fontname, filename, sub }, nofok + 1 end + n = n:gsub("[^%a%d]","") + if not mapping[n] then mapping[n], nofok = { suffix, fontname, filename, sub }, nofok + 1 end + end + local function check(result, filename, suffix, is_sub) + local fontname = result.fullname + if fontname then + add(result.fullname, fontname, filename, suffix, is_sub) + end + if result.fontname then + fontname = fontname or result.fontname + add(result.fontname, fontname, filename, suffix, is_sub) + end + if result.familyname and result.weight then + local madename = result.familyname .. " " .. result.weight + fontname = fontname or madename + add(madename, fontname, filename, suffix, is_sub) + end + end + local function identify(completename,name,suffix) + if not done[name] then + nofread = nofread + 1 + logs.info("fontnames", "identifying " .. suffix .. " font " .. completename) + logs.push() + local result = fonts.names.filters[suffix](completename) + logs.pop() + if result then + if not result[1] then + check(result,name,suffix,false) + else for _, r in ipairs(result) do + check(r,name,suffix,true) + end end + end + done[name] = true + end + end + local function traverse(what, method) + for n, suffix in pairs(fonts.names.filters.list) do + nofread, nofok = 0, 0 + local t = os.clock() + logs.report("fontnames", string.format("identifying %s font files with suffix %s",what,suffix)) + method(suffix) + logs.report("fontnames", string.format("%s %s files identified, %s hash entries added, runtime %s seconds", nofread, what,nofok, os.clock()-t)) + end + end + traverse("tree", function(suffix) + input.with_files(texmf.instance,".*%." .. suffix .. "$", function(method,root,path,name) + if method == "file" then + identify(root .."/" .. path .. "/" .. name,name,suffix) + end + end) + end) + traverse("system", function(suffix) + local pathlist = input.expanded_path_list(texmf.instance,"osfontdir") + if pathlist then + for _, path in ipairs(pathlist) do + -- not that much needed + path = input.clean_path(path .. "/") + path = path:gsub("/+","/") + local pattern = path .. "*." .. suffix + logs.info("fontnames", "globbing path " .. pattern) + local t = dir.glob(pattern) + for _, name in pairs(t) do + local mode = lfs.attributes(name,'mode') + if mode == "file" then + identify(name,file.basename(name),suffix) + end + end + end + end + end) + local t = { } + for _, f in ipairs(fonts.names.filters.fixes) do + local expression, replacement = f[1], f[2] + for k,v in pairs(mapping) do + local fix, pos = k:gsub(expression,replacement) + if pos > 0 and not mapping[fix] then + t[fix] = v + end + end + end + for k,v in pairs(t) do + mapping[k] = v + end +end + +function fonts.names.load(reload) + if not fonts.names.loaded then + if reload then + if containers.is_usable(fonts.names.cache, "names") then + fonts.names.identify() + containers.write(fonts.names.cache, "names", fonts.names.data) + end + fonts.names.saved = true + else + fonts.names.data = containers.read(fonts.names.cache, "names") + if not fonts.names.saved then + if table.is_empty(fonts.names.data) or table.is_empty(fonts.names.data.mapping) then + fonts.names.load(true) + end + fonts.names.saved = true + end + end + fonts.names.loaded = true + end +end + +function fonts.names.list(pattern,reload) + fonts.names.load(reload) + if fonts.names.loaded then + local t = { } + for k,v in pairs(fonts.names.data.mapping) do + if k:find(pattern) then + t[k] = v + end + end + return t + else + return nil + end +end + +--[[ldx-- +

The resolver also checks if the cached names are loaded. Being clever +here is for testing purposes only (it deals with names prefixed by an +encoding name).

+--ldx]]-- + +do + + local function found(name) + if fonts.names.data then + local result, mapping = nil, fonts.names.data.mapping + local mn = mapping[name] + if mn then + return mn[2], mn[3], mn[4] + end + if fonts.names.be_clever then -- this will become obsolete + local encoding, tag = name:match("^(.-)[%-%:](.+)$") + local mt = mapping[tag] + if tag and fonts.enc.is_known(encoding) and mt then + return mt[1], encoding .. "-" .. mt[3], mt[4] + end + end + -- name, type, file + for k,v in pairs(mapping) do + if k:find(name) then + return v[2], v[3], v[4] + end + end + local condensed = name:gsub("[^%a%d]","") + local mc = mapping[condensed] + if mc then + return mc[2], mc[3], mc[4] + end + for k,v in pairs(mapping) do + if k:find(condensed) then + return v[2], v[3], v[4] + end + end + end + return nil, nil, nil + end + + function fonts.names.resolve(name, sub) + if not name then + return nil, nil + elseif fonts.names.enabled then + fonts.names.load() + local name, filename, is_sub = found(name:lower()) + if is_sub then + return filename, name + else + return filename, sub + end + else + return filename, sub + end + end + +end + +--[[ldx-- +

A handy helper.

+--ldx]]-- + +function fonts.names.table(pattern,reload,all) + local t = fonts.names.list(pattern,reload) + if t then + tex.sprint(tex.ctxcatcodes,"\\start\\nonknuthmode\\starttabulate[|T|T|T|T|T|]") + tex.sprint(tex.ctxcatcodes,"\\NC hashname\\NC type\\NC fontname\\NC filename\\NC\\NR\\HL") + for k,v in pairs(table.sortedkeys(t)) do + if all or v == t[v][2]:lower() then + local type, name, file = unpack(t[v]) + if type and name and file then + tex.sprint(tex.ctxcatcodes,string.format("\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR",v,type, name, file)) + else + logs.report("font table", "skipping ".. v) + end + end + end + tex.sprint(tex.ctxcatcodes,"\\stoptabulate\\stop") + end +end diff --git a/tex/context/base/font-tfm.lua b/tex/context/base/font-tfm.lua new file mode 100644 index 000000000..b07f0a062 --- /dev/null +++ b/tex/context/base/font-tfm.lua @@ -0,0 +1,479 @@ +if not modules then modules = { } end modules ['font-tfm'] = { + version = 1.001, + comment = "companion to font-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

Here we only implement a few helper functions.

+--ldx]]-- + +fonts = fonts or { } +fonts.loaded = fonts.loaded or { } +fonts.dontembed = fonts.dontembed or { } +fonts.logger = fonts.logger or { } +fonts.loadtime = 0 +fonts.tfm = fonts.tfm or { } +fonts.triggers = fonts.triggers or { } -- brrr + +--[[ldx-- +

The next function encapsulates the standard loader as +supplied by .

+--ldx]]-- + +function fonts.tfm.read_from_tfm(specification) + return font.read_tfm(specification.name,specification.size) +end + +--[[ldx-- +

We need to normalize the scale factor (in scaled points). This has to +do with the fact that uses a negative multiple of 1000 as +a signal for a font scaled based on the design size.

+--ldx]]-- + +function fonts.tfm.scaled(scaledpoints, designsize) -- handles designsize in sp as well + if scaledpoints < 0 then + if designsize then + if designsize > 65536 then -- or just 1000 + return (- scaledpoints/1000) * designsize -- sp's + else + return (- scaledpoints/1000) * designsize * 65536 + end + else + return (- scaledpoints/1000) * 10 * 65536 + end + else + return scaledpoints + end +end + +--[[ldx-- +

Before a font is passed to we scale it.

+--ldx]]-- + +function fonts.tfm.scale(tfmtable, scaledpoints) + -- 65536 = 1pt + -- 1000 units per designsize (not always) + local scale, round = tex.scale, tex.round -- replaces math.floor(n*m+0.5) + local delta + if scaledpoints < 0 then + scaledpoints = (- scaledpoints/1000) * tfmtable.designsize -- already in sp + end + delta = scaledpoints/(tfmtable.units or 1000) -- brr, some open type fonts have 2048 + local t = { } + t.factor = delta + for k,v in pairs(tfmtable) do + if type(v) == "table" then + t[k] = { } + else + t[k] = v + end + end + local tc = t.characters + for k,v in pairs(tfmtable.characters) do + local chr = { + unicode = v.unicode, + name = v.name, + index = v.index or k, + width = scale(v.width , delta), + height = scale(v.height, delta), + depth = scale(v.depth , delta), + class = v.class + } + local b = v.boundingbox -- maybe faster to have llx etc not in table + if b then + chr.boundingbox = scale(v.boundingbox,delta) + end + if v.italic then + chr.italic = scale(v.italic,delta) + end + if v.kerns then + chr.kerns = scale(v.kerns,delta) + end + if v.ligatures then + local tt = { } + for kk,vv in pairs(v.ligatures) do + tt[kk] = vv + end + chr.ligatures = tt + end + tc[k] = chr + end + local tp = t.parameters + for k,v in pairs(tfmtable.parameters) do + if k == 1 then + tp[k] = round(v) + else + tp[k] = scale(v,delta) + end + end +--~ t.encodingbytes = tfmtable.encodingbytes or 2 + t.size = scaledpoints + t.italicangle = tfmtable.italicangle + t.ascender = scale(tfmtable.ascender or 0,delta) + t.descender = scale(tfmtable.descender or 0,delta) + -- new / some data will move here + t.shared = tfmtable.shared or { } + if t.unique then + t.unique = table.fastcopy(tfmtable.unique) + else + t.unique = { } + end + return t +end + +--[[ldx-- +

The following functions are used for reporting about the fonts +used. The message itself is not that useful in regular runs but since +we now have several readers it may be handy to know what reader is +used for which font.

+--ldx]]-- + +function fonts.logger.save(tfmtable,source,specification) + if tfmtable and specification and specification.specification then + specification.source = source + fonts.loaded[specification.specification] = specification + fonts.used[specification.name] = source + end +end + +function fonts.logger.report(separator) + local t = { } + for _,v in pairs(table.sortedkeys(fonts.loaded)) do + t[#t+1] = v .. ":" .. fonts.loaded[v].source + end + return table.concat(t,separator or " ") +end + +function fonts.logger.format(name) + return fonts.used[name] or "unknown" +end + +--[[ldx-- +

When we implement functions that deal with features, most of them +will depend of the font format. Here we define the few that are kind +of neutral.

+--ldx]]-- + +fonts.initializers = fonts.initializers or { } +fonts.initializers.common = fonts.initializers.common or { } + +--[[ldx-- +

This feature will remove inter-digit kerns.

+--ldx]]-- + +table.insert(fonts.triggers,"equaldigits") + +function fonts.initializers.common.equaldigits(tfmdata,value) + if value then + local chr = tfmdata.characters + for i = utf.byte('0'), utf.byte('9') do + local c = chr[i] + if c then + c.kerns = nil + end + end + end +end + +--[[ldx-- +

This feature will give all glyphs an equal height and/or depth. Valid +values are none, height, depth and +both.

+--ldx]]-- + +table.insert(fonts.triggers,"lineheight") + +function fonts.initializers.common.lineheight(tfmdata,value) + if value and type(value) == "string" then + if value == "none" then + for _,v in pairs(tfmdata.characters) do + v.height, v.depth = 0, 0 + end + else + local ascender, descender = tfmdata.ascender, tfmdata.descender + if ascender and descender then + local ht, dp = ascender or 0, descender or 0 + if value == "height" then + dp = 0 + elseif value == "depth" then + ht = 0 + end + if ht > 0 then + if dp > 0 then + for _,v in pairs(tfmdata.characters) do + v.height, v.depth = ht, dp + end + else + for _,v in pairs(tfmdata.characters) do + v.height = ht + end + end + elseif dp > 0 then + for _,v in pairs(tfmdata.characters) do + v.depth = dp + end + end + end + end + end +end + +--[[ldx-- +

It does not make sense any more to support messed up encoding vectors +so we stick to those that implement oldstyle and small caps. After all, +we move on. We can extend the next function on demand. This features is +only used with files.

+--ldx]]-- + +do + + local smallcaps = lpeg.P(".sc") + lpeg.P(".smallcaps") + lpeg.P(".caps") + lpeg.P("small") + local oldstyle = lpeg.P(".os") + lpeg.P(".oldstyle") + lpeg.P(".onum") + + smallcaps = lpeg.Cs((1-smallcaps)^1) * smallcaps^1 + oldstyle = lpeg.Cs((1-oldstyle )^1) * oldstyle ^1 + + function fonts.initializers.common.encoding(tfmdata,value) + if value then + local encodingfile = value .. '.enc' + local encoding = fonts.enc.load(encodingfile) + if encoding then + -- tfmdata.encoding = value + local vector = encoding.vector + local afmdata = tfmdata.shared.afmdata + local characters = tfmdata.characters + local unicodes = afmdata.luatex.unicodes + local function remap(pattern,name) + local p = lpeg.match(pattern,name) + if p then + local oldchr, newchr = unicodes[p], unicodes[name] + if oldchr and newchr then + -- texio.write_nl(string.format("%s (%s) -> %s (%s)",p,oldchr or -1,name,newchr or -1)) + characters[oldchr] = characters[newchr] + end + end + return p + end + for _, name in pairs(vector) do + local ok = remap(smallcaps,name) or remap(oldstyle,name) + end + if fonts.map.data[tfmdata.name] then + fonts.map.data[tfmdata.name].encoding = encodingfile + end + end + end + end + + -- when needed we can provide this as features in e.g. afm files + + function fonts.initializers.common.remap(tfmdata,value,pattern) + if value then + local afmdata = tfmdata.shared.afmdata + local characters = tfmdata.characters + local unicodes = afmdata.luatex.unicodes + local function remap(pattern,name) + local p = lpeg.match(pattern,name) + if p then + local oldchr, newchr = unicodes[p], unicodes[name] + if oldchr and newchr then + characters[oldchr] = characters[newchr] + end + end + return p + end + for _, blob in pairs(characters) do + remap(pattern,blob.name) + end + end + end + + function fonts.initializers.common.oldstyle(tfmdata,value) + fonts.initializers.common.remap(tfmdata,value,oldstyle) + end + function fonts.initializers.common.smallcaps(tfmdata,value) + fonts.initializers.common.remap(tfmdata,value,smallcaps) + end + +end + +--~ function fonts.initializers.common.install(format,feature) -- 'afm','lineheight' +--~ fonts.initializers.base[format][feature] = fonts.initializers.common[feature] +--~ fonts.initializers.node[format][feature] = fonts.initializers.common[feature] +--~ end + +--[[ldx-- +

Analyzers run per script and/or language and are needed in order to +process features right.

+--ldx]]-- + +fonts.analyzers = fonts.analyzers or { } +fonts.analyzers.aux = fonts.analyzers.aux or { } +fonts.analyzers.methods = fonts.analyzers.methods or { } +fonts.analyzers.initializers = fonts.analyzers.initializers or { } + +do + + local glyph = node.id('glyph') + local fontdata = fonts.tfm.id + local set_attribute = node.set_attribute + local unset_attribute = node.unset_attribute + local has_attribute = node.has_attribute + + local state = attributes.numbers['state'] or 100 + + -- todo: analyzers per script/lang, cross font, so we need an font id hash -> script + -- e.g. latin -> hyphenate, arab -> 1/2/3 analyze + + -- an example analyzer + + function fonts.analyzers.aux.setstate(head,font) + local characters = fontdata[font].characters + local first, last, current, n, done = nil, nil, head, 0, false -- maybe make n boolean + local function finish() + if first and first == last then + set_attribute(last,state,4) -- isol + elseif last then + set_attribute(last,state,3) -- fina + end + first, last, n = nil, nil, 0 + end + while current do + if current.id == glyph and current.font == font then + if characters[current.char].class == "mark" then + done = true + set_attribute(current,state,5) -- mark + elseif n == 0 then + first, last, n = current, current, 1 + set_attribute(current,state,1) -- init + else + last, n = current, n+1 + set_attribute(current,state,2) -- medi + end + else + finish() + end + current = current.next + end + finish() + return head, done + end + +end + + +--[[ldx-- +

We move marks into the components list. This saves much nasty testing later on.

+--ldx]]-- + +do + + local glyph = node.id('glyph') + local fontdata = fonts.tfm.id + local marknumber = attributes.numbers['mark'] or 200 + local set_attribute = node.set_attribute + + function fonts.pushmarks(head,font) + local tfmdata = fontdata[font] + local characters = tfmdata.characters + local current, last, done, n = head, nil, false, 0 + while current do + if current.id == glyph and current.font == font then + if characters[current.char].class == "mark" then + -- check if head + if last and not last.components then + last.components = current + last.components.prev = nil + done = true + n = 1 + else + n = n + 1 + end + set_attribute(current,marknumber,n) + current = current.next + elseif last and last.components then + -- finish 'm + current.prev.next = nil + current.prev = last + last.next = current + last = current + last = nil + else + last = current + current = current.next + end + elseif last and last.components then + current.prev.next = nil + current.prev = last + last.next = current + last = nil + else + last = nil + current = current.next + end + end + if last and last.components then + last.next = nil + end + tfmdata.shared.markspushed = done + return head, done + end + + function fonts.removemarks(head,font) + local current, done, characters = head, false, tfmdata.characters + while current do + if current.id == glyph and current.font == font and characters[current.char].class == "mark" then + local next, prev = current.next, current.prev + if next then + next.prev = prev + end + if prev then + prev.next = next + else + head = next + end + node.free(current) + current = next + done = true + else + current = current.next + end + end + return head, done + end + + function fonts.popmarks(head,font) + local tfmdata = fontdata[font] + if tfmdata.shared.markspushed then + local current, done, characters = head, false, tfmdata.characters + while current do + if current.id == glyph and current.font == font then + local components = current.components + if components then + local last, next = components, current.next + while last.next do last = last.next end + if next then + next.prev = last + end + last.next= next + current.next = components + components.prev = current + current.components = nil + current = last.next + done = true + else + current = current.next + end + else + current = current.next + end + end + return head, done + else + return head, false + end + end + +end diff --git a/tex/context/base/font-vf.lua b/tex/context/base/font-vf.lua new file mode 100644 index 000000000..f0258e281 --- /dev/null +++ b/tex/context/base/font-vf.lua @@ -0,0 +1,213 @@ +if not modules then modules = { } end modules ['font-vf'] = { + version = 1.001, + comment = "companion to font-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

This is very experimental code! Not yet adapted to recent changes.

+--ldx]]-- + +-- define.methods elsewhere ! + +fonts = fonts or { } + +fonts.define = fonts.define or { } +fonts.define.methods = fonts.define.methods or { } + +fonts.vf = fonts.vf or { } +fonts.vf.combinations = fonts.vf.combinations or { } +fonts.vf.aux = fonts.vf.aux or { } +fonts.vf.aux.combine = fonts.vf.aux.combine or { } + +function fonts.define.methods.install(tag, rules) + fonts.vf.combinations[tag] = rules + fonts.define.methods[tag] = function(specification) + return fonts.vf.combine(specification,tag) + end +end + +function fonts.vf.aux.combine.assign(g, name, from, to, start, force) + local f, id = fonts.vf.aux.combine.load(g,name) + if f and id then + -- optimize for whole range, then just g = f + if not from then from, to = 0, 0xFF00 end + if not to then to = from end + if not start then start = from end + local fc, gc = f.characters, g.characters + g.fonts[#g.fonts+1] = { id = id } -- no need to be sparse + local hn = #g.fonts + for i=from,to do + if fc[i] and (force or not gc[i]) then + gc[i] = table.fastcopy(fc[i]) + gc[i].commands = { { 'slot', hn, start } } + end + start = start + 1 + end + if not g.parameters and #g.fonts > 0 then -- share this code ! + g.parameters = table.fastcopy(f.parameters) + g.italicangle = f.italicangle + g.ascender = f.ascender + g.descender = f.descender + end + end +end + +function fonts.vf.aux.combine.process(g,list) + if list then + for _,v in pairs(list) do + (fonts.vf.aux.combine.commands[v[1]] or nop)(g,v) + end + end +end + +function fonts.vf.aux.combine.load(g,name) + return fonts.tfm.read_and_define(name or g.specification.name,g.specification.size) +end + +fonts.vf.aux.combine.commands = { + ["initialize"] = function(g,v) fonts.vf.aux.combine.assign(g, g.name) end, + ["include-method"] = function(g,v) fonts.vf.aux.combine.process(g,fonts.vf.combinations[v[2]]) end, -- name + ["copy-parameters"] = function(g,v) fonts.vf.aux.combine.parameters(g,v[2]) end, -- name + ["copy-range"] = function(g,v) fonts.vf.aux.combine.assign(g,v[2],v[3],v[4],v[5],true) end, -- name, from-start, from-end, to-start + ["copy-char"] = function(g,v) fonts.vf.aux.combine.assign(g,v[2],v[3],v[3],v[4],true) end, -- name, from, to + ["fallback-range"] = function(g,v) fonts.vf.aux.combine.assign(g,v[2],v[3],v[4],v[5],false) end, -- name, from-start, from-end, to-start + ["fallback-char"] = function(g,v) fonts.vf.aux.combine.assign(g,v[2],v[3],v[3],v[4],false) end, -- name, from, to +} + +function fonts.vf.combine(specification,tag) + local g = { + name = specification.name, + type = 'virtual', + fonts = { }, + characters = { }, + specification = table.fastcopy(specification) + } + fonts.vf.aux.combine.process(g,fonts.vf.combinations[tag]) + return g +end + +fonts.vf.aux.combine.commands["feature"] = function(g,v) + local key, value = v[2], v[3] + if key then + if value == nil then + value = true + end + if g.specification and g.specification.features.normal then + g.specification.features.normal[key] = value -- otf? + end + end +end + +-- simple example with features + +fonts.define.methods.install( + "ligatures", { + { "feature", "liga" } , + { "feature", "dlig" } , + { "initialize" } , + } +) + +--~ fonts.define.methods.install ( +--~ "ligatures-x", { +--~ { "feature", "liga" } , +--~ { "feature", "dlig" } , +--~ { "initialize" } , +--~ { "lineheight" } +--~ } +--~ ) + +-- docu case + +--~ fonts.define.methods.install( +--~ "weird", { +--~ { "copy-range", "lmroman10-regular" } , +--~ { "copy-char", "lmroman10-regular", 65, 66 } , +--~ { "copy-range", "lmsans10-regular", 0x0100, 0x01FF } , +--~ { "copy-range", "lmtypewriter10-regular", 0x0200, 0xFF00 } , +--~ { "fallback-range", "lmtypewriter10-regular", 0x0000, 0x0200 } +--~ } +--~ ) + +-- demo case -> move to module + +fonts.define.methods["demo-1"] = function(specification) + local name = specification.name -- symbolic name + local size = specification.size -- given size +--~ specification.name = 'lmroman10-regular' -- forced base name +--~ specification.features.vtf = { } + local f, id = fonts.tfm.read_and_define('lmroman10-regular',size) + if f and id then + local capscale, digscale = 0.85, 0.75 + f.name, f.type = name, 'virtual' + f.fonts = { + {id=id}, + {name='lmsans10-regular' , size=size*capscale}, -- forced extra name + {name='lmtypewriter10-regular', size=size*digscale} -- forced extra name + } + for k,v in pairs(f.characters) do + local u = v.unicode + if u and characters.i_is_of_category(u,'lu') then + v.width = capscale*v.width + v.commands = { + {'special','pdf: 1 0 0 rg'}, + {'slot',2, k}, + {'special','pdf: 0 g'}, + } + elseif u and characters.i_is_of_category(u,'nd') then + v.width = digscale*v.width + v.commands = { + {'special','pdf: 0 0 1 rg'}, + {'slot',3,k}, + {'special','pdf: 0 g'}, + } + else + v.commands = { + {'special','pdf: 0 1 0 rg'}, + {'slot',1,k}, + {'special','pdf: 0 g'}, + } + end + end + end + return f +end + +-- keep as example, now tfm feature + +--~ fonts.vf.aux.combine.commands["lineheight"] = function(g,v) +--~ if g.ascender and g.descender then +--~ local ht, dp = g.ascender or 0, g.descender or 0 +--~ if v[2] == "none" then +--~ for _,v in pairs(g.characters) do +--~ v.height = 0 +--~ v.depth = 0 +--~ end +--~ else +--~ if v[2] == "height" then +--~ dp = 0 +--~ elseif v[2] == "depth" then +--~ ht = 0 +--~ end +--~ if ht > 0 then +--~ if dp > 0 then +--~ for _,v in pairs(g.characters) do +--~ v.height = ht +--~ v.depth = dp +--~ end +--~ else +--~ for _,v in pairs(g.characters) do +--~ v.height = ht +--~ end +--~ end +--~ elseif dp > 0 then +--~ for _,v in pairs(g.characters) do +--~ v.depth = dp +--~ end +--~ end +--~ end +--~ end +--~ end diff --git a/tex/context/base/l-aux.lua b/tex/context/base/l-aux.lua new file mode 100644 index 000000000..59ff42539 --- /dev/null +++ b/tex/context/base/l-aux.lua @@ -0,0 +1,39 @@ +-- filename : l-aux.lua +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-aux'] = 1.001 +if not aux then aux = { } end + +do + + hash = { } + + function set(key,value) + hash[key] = value + end + + local space = lpeg.S(' ')^0 + local equal = lpeg.S("=")^1 + local comma = lpeg.S(",")^0 + local nonspace = lpeg.P(1-lpeg.S(' '))^1 + local nonequal = lpeg.P(1-lpeg.S('='))^1 + local noncomma = lpeg.P(1-lpeg.S(','))^1 + local nonbrace = lpeg.P(1-lpeg.S('{}'))^1 + local nested = lpeg.S('{') * lpeg.C(nonbrace^1) * lpeg.S('}') + + local key = lpeg.C(nonequal) + local value = nested + lpeg.C(noncomma) + + local pattern = ((space * key * equal * value * comma) / set)^1 + + function aux.settings_to_hash(str) + hash = { } + lpeg.match(pattern,str) + return hash + end + +end + +--~ print(table.serialize(aux.settings_to_hash("aaa=bbb, ccc={d,d,d}"))) diff --git a/tex/context/base/l-boolean.lua b/tex/context/base/l-boolean.lua new file mode 100644 index 000000000..128e1d069 --- /dev/null +++ b/tex/context/base/l-boolean.lua @@ -0,0 +1,41 @@ +-- filename : l-boolean.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-boolean'] = 1.001 +if not boolean then boolean = { } end + +function boolean.tonumber(b) + if b then return 1 else return 0 end +end + +function toboolean(str) + if type(str) == "string" then + return str == "true" or str == "yes" or str == "on" or str == "1" + elseif type(str) == "number" then + return tonumber(str) ~= 0 + else + return str + end +end + +function string.is_boolean(str) + if type(str) == "string" then + if str == "true" or str == "yes" or str == "on" then + return true + elseif str == "false" or str == "no" or str == "off" then + return false + end + end + return nil +end + +function boolean.alwaystrue() + return true +end + +function boolean.falsetrue() + return false +end diff --git a/tex/context/base/l-dir.lua b/tex/context/base/l-dir.lua new file mode 100644 index 000000000..df241d221 --- /dev/null +++ b/tex/context/base/l-dir.lua @@ -0,0 +1,94 @@ +-- filename : l-dir.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-dir'] = 1.001 + +dir = { } + +-- optimizing for no string.find (*) does not save time + +if lfs then + + function dir.glob_pattern(path,patt,recurse,action) + for name in lfs.dir(path) do + local full = path .. '/' .. name + local mode = lfs.attributes(full,'mode') + if mode == 'file' then + if name:find(patt) then + action(full) + end + elseif recurse and (mode == "directory") and (name ~= '.') and (name ~= "..") then + dir.glob_pattern(full,patt,recurse,action) + end + end + end + + function dir.glob(pattern, action) + local t = { } + local action = action or function(name) table.insert(t,name) end + local path, patt = pattern:match("^(.*)/*%*%*/*(.-)$") + local recurse = path and patt + if not recurse then + path, patt = pattern:match("^(.*)/(.-)$") + if not (path and patt) then + path, patt = '.', pattern + end + end + patt = patt:gsub("([%.%-%+])", "%%%1") + patt = patt:gsub("%*", ".*") + patt = patt:gsub("%?", ".") + patt = "^" .. patt .. "$" + -- print('path: ' .. path .. ' | pattern: ' .. patt .. ' | recurse: ' .. tostring(recurse)) + dir.glob_pattern(path,patt,recurse,action) + return t + end + + -- t = dir.glob("c:/data/develop/context/sources/**/????-*.tex") + -- t = dir.glob("c:/data/develop/tex/texmf/**/*.tex") + -- t = dir.glob("c:/data/develop/context/texmf/**/*.tex") + -- t = dir.glob("f:/minimal/tex/**/*") + -- print(dir.ls("f:/minimal/tex/**/*")) + -- print(dir.ls("*.tex")) + + function dir.ls(pattern) + return table.concat(dir.glob(pattern),"\n") + end + + --~ mkdirs("temp") + --~ mkdirs("a/b/c") + --~ mkdirs(".","/a/b/c") + --~ mkdirs("a","b","c") + + function dir.mkdirs(...) -- root,... or ... ; root is not split + local pth, err = "", false + for k,v in pairs({...}) do + if k == 1 then + if not lfs.isdir(v) then + -- print("no root path " .. v) + err = true + else + pth = v + end + elseif lfs.isdir(pth .. "/" .. v) then + pth = pth .. "/" .. v + else + for _,s in pairs(v:split("/")) do + pth = pth .. "/" .. s + if not lfs.isdir(pth) then + ok = lfs.mkdir(pth) + if not lfs.isdir(pth) then + err = true + end + end + if err then break end + end + end + if err then break end + end + return pth, not err + end + +end diff --git a/tex/context/base/l-file.lua b/tex/context/base/l-file.lua new file mode 100644 index 000000000..ca983402b --- /dev/null +++ b/tex/context/base/l-file.lua @@ -0,0 +1,101 @@ +-- filename : l-file.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-file'] = 1.001 + +if not file then file = { } end + +function file.removesuffix(filename) + return filename:gsub("%.%a+$", "") +end + +function file.addsuffix(filename, suffix) + if not filename:find("%.%a-$") then + return filename .. "." .. suffix + else + return filename + end +end + +function file.replacesuffix(filename, suffix) + return filename:gsub("%.%a+$", "." .. suffix) +end + +function file.dirname(name) + return name:match("^(.+)[/\\].-$") or "" +end + +function file.basename(name) + return name:match("^.+[/\\](.-)$") or name +end + +function file.extname(name) + return name:match("^.+%.(.-)$") or "" +end + +function file.join(...) -- args + return (string.gsub(table.concat({...},"/"),"\\","/")) +end + +function file.is_writable(name) + local f = io.open(name, 'w') + if f then + f:close() + return true + else + return false + end +end + +function file.is_readable(name) + local f = io.open(name,'r') + if f then + f:close() + return true + else + return false + end +end + +function file.split_path(str) + if str:find(';') then + return str:splitchr(";") + else + return str:splitchr(io.pathseparator) + end +end + +function file.join_path(tab) + return table.concat(tab,io.pathseparator) +end + +--~ print('test' .. " == " .. file.collapse_path("test")) +--~ print("test/test" .. " == " .. file.collapse_path("test/test")) +--~ print("test/test/test" .. " == " .. file.collapse_path("test/test/test")) +--~ print("test/test" .. " == " .. file.collapse_path("test/../test/test")) +--~ print("test" .. " == " .. file.collapse_path("test/../test")) +--~ print("../test" .. " == " .. file.collapse_path("../test")) +--~ print("../test/" .. " == " .. file.collapse_path("../test/")) +--~ print("a/a" .. " == " .. file.collapse_path("a/b/c/../../a")) + +function file.collapse_path(str) + local ok = false + while not ok do + ok = true + str, n = str:gsub("[^%./]+/%.%./", function(s) + ok = false + return "" + end) + end + return (str:gsub("/%./","/")) +end + +function file.robustname(str) + return (str:gsub("[^%a%d%/%-%.\\]+","-")) +end + +file.readdata = io.loaddata +file.savedata = io.savedata diff --git a/tex/context/base/l-io.lua b/tex/context/base/l-io.lua new file mode 100644 index 000000000..e53b8fb6a --- /dev/null +++ b/tex/context/base/l-io.lua @@ -0,0 +1,173 @@ +-- filename : l-io.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-io'] = 1.001 + +if string.find(os.getenv("PATH"),";") then + io.fileseparator, io.pathseparator = "\\", ";" +else + io.fileseparator, io.pathseparator = "/" , ":" +end + +function io.loaddata(filename) + local f = io.open(filename) + if f then + local data = f:read('*all') + f:close() + return data + else + return nil + end +end + +function io.savedata(filename,data,joiner) + local f = io.open(filename, "wb") + if f then + if type(data) == "table" then + f:write(table.join(data,joiner or "")) + elseif type(data) == "function" then + data(f) + else + f:write(data) + end + f:close() + end +end + +function io.exists(filename) + local f = io.open(filename) + if f == nil then + return false + else + assert(f:close()) + return true + end +end + +function io.size(filename) + local f = io.open(filename) + if f == nil then + return 0 + else + local s = f:seek("end") + assert(f:close()) + return s + end +end + +function io.noflines(f) + local n = 0 + for _ in f:lines() do + n = n + 1 + end + f:seek('set',0) + return n +end + +--~ t, f, n = os.clock(), io.open("testbed/sample-utf16-bigendian-big.txt",'rb'), 0 +--~ for a in io.characters(f) do n = n + 1 end +--~ print(string.format("characters: %s, time: %s", n, os.clock()-t)) + +do + + local nextchar = { + [ 4] = function(f) + return f:read(1), f:read(1), f:read(1), f:read(1) + end, + [ 2] = function(f) + return f:read(1), f:read(1) + end, + [ 1] = function(f) + return f:read(1) + end, + [-2] = function(f) + local a = f:read(1) + local b = f:read(1) + return b, a + end, + [-4] = function(f) + local a = f:read(1) + local b = f:read(1) + local c = f:read(1) + local c = f:read(1) + return d, c, b, a + end + } + + function io.characters(f,n) + local sb = string.byte + if f then + return nextchar[n or 1], f + else + return nil, nil + end + end + +end + +do + + local nextbyte = { + [4] = function(f) + local a = f:read(1) + local b = f:read(1) + local c = f:read(1) + local d = f:read(1) + if d then + return sb(a), sb(b), sb(c), sb(d) + else + return nil, nil, nil, nil + end + end, + [2] = function(f) + local a = f:read(1) + local b = f:read(1) + if b then + return sb(a), sb(b) + else + return nil, nil + end + end, + [1] = function (f) + local a = f:read(1) + if a then + return sb(a) + else + return nil + end + end, + [-2] = function (f) + local a = f:read(1) + local b = f:read(1) + if b then + return sb(b), sb(a) + else + return nil, nil + end + end, + [-4] = function(f) + local a = f:read(1) + local b = f:read(1) + local c = f:read(1) + local d = f:read(1) + if d then + return sb(d), sb(c), sb(b), sb(a) + else + return nil, nil, nil, nil + end + end + } + + function io.bytes(f,n) + local sb = string.byte + if f then + return nextbyte[n or 1], f + else + return nil, nil + end + end + +end diff --git a/tex/context/base/l-math.lua b/tex/context/base/l-math.lua new file mode 100644 index 000000000..b2090143b --- /dev/null +++ b/tex/context/base/l-math.lua @@ -0,0 +1,25 @@ +-- filename : l-math.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-math'] = 1.001 + +if not math.round then + function math.round(x) + return math.floor(x + 0.5) + end +end + +if not math.div then + function math.div(n,m) + math.floor(n/m) + end +end + +if not math.mod then + function math.mod(n,m) + return n % m + end +end diff --git a/tex/context/base/l-md5.lua b/tex/context/base/l-md5.lua new file mode 100644 index 000000000..2a24f4169 --- /dev/null +++ b/tex/context/base/l-md5.lua @@ -0,0 +1,18 @@ +-- filename : l-md5.lua +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-md5'] = 1.001 + +if md5 then do + + local function convert(str,fmt) + return (string.gsub(md5.sum(str),".",function(chr) return string.format(fmt,string.byte(chr)) end)) + end + + if not md5.HEX then function md5.HEX(str) return convert(str,"%02X") end end + if not md5.hex then function md5.hex(str) return convert(str,"%02x") end end + if not md5.dec then function md5.dec(str) return convert(stt,"%03i") end end + +end end diff --git a/tex/context/base/l-number.lua b/tex/context/base/l-number.lua new file mode 100644 index 000000000..e463cb973 --- /dev/null +++ b/tex/context/base/l-number.lua @@ -0,0 +1,10 @@ +-- filename : l-number.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-number'] = 1.001 + +if not number then number = { } end + diff --git a/tex/context/base/l-os.lua b/tex/context/base/l-os.lua new file mode 100644 index 000000000..0c1d92911 --- /dev/null +++ b/tex/context/base/l-os.lua @@ -0,0 +1,27 @@ +-- filename : l-os.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-os'] = 1.001 + +function os.resultof(command) + return io.popen(command,"r"):read("*all") +end + +--~ if not os.exec then -- still not ok + os.exec = os.execute +--~ end + +function os.launch(str) + if os.platform == "windows" then + os.execute("start " .. str) + else + os.execute(str .. " &") + end +end + +if not os.setenv then + function os.setenv() return false end +end diff --git a/tex/context/base/l-string.lua b/tex/context/base/l-string.lua new file mode 100644 index 000000000..9b594ff8a --- /dev/null +++ b/tex/context/base/l-string.lua @@ -0,0 +1,307 @@ +-- filename : l-string.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-string'] = 1.001 + +--~ function string.split(str, pat) -- taken from the lua wiki +--~ local t = {n = 0} -- so this table has a length field, traverse with ipairs then! +--~ local fpat = "(.-)"..pat +--~ local last_end = 1 +--~ local s, e, cap = string.find(str, fpat, 1) +--~ while s ~= nil do +--~ if s~=1 or cap~="" then +--~ table.insert(t,cap) +--~ end +--~ last_end = e+1 +--~ s, e, cap = string.find(str, fpat, last_end) +--~ end +--~ if last_end<=string.len(str) then +--~ table.insert(t,(string.sub(str,last_end))) +--~ end +--~ return t +--~ end + +--~ function string:split(pat) -- taken from the lua wiki but adapted +--~ local t = { } -- self and colon usage (faster) +--~ local fpat = "(.-)"..pat +--~ local last_end = 1 +--~ local s, e, cap = self:find(fpat, 1) +--~ while s ~= nil do +--~ if s~=1 or cap~="" then +--~ t[#t+1] = cap +--~ end +--~ last_end = e+1 +--~ s, e, cap = self:find(fpat, last_end) +--~ end +--~ if last_end <= #self then +--~ t[#t+1] = self:sub(last_end) +--~ end +--~ return t +--~ end + +--~ a piece of brilliant code by Rici Lake (posted on lua list) -- only names changed +--~ +--~ function string:splitter(pat) +--~ local st, g = 1, self:gmatch("()"..pat.."()") +--~ local function splitter(self) +--~ if st then +--~ local s, f = g() +--~ local rv = self:sub(st, (s or 0)-1) +--~ st = f +--~ return rv +--~ end +--~ end +--~ return splitter, self +--~ end + +function string:splitter(pat) + -- by Rici Lake (posted on lua list) -- only names changed + -- p 79 ref man: () returns position of match + local st, g = 1, self:gmatch("()("..pat..")") + local function strgetter(self, segs, seps, sep, cap1, ...) + st = sep and seps + #sep + return self:sub(segs, (seps or 0) - 1), cap1 or sep, ... + end + local function strsplitter(self) + if st then return strgetter(self, st, g()) end + end + return strsplitter, self +end + +function string:split(separator) + local t = {} + for k in self:splitter(separator) do t[#t+1] = k end + return t +end + +-- faster than a string:split: + +function string:splitchr(chr) + if #self > 0 then + local t = { } + for s in string.gmatch(self..chr,"(.-)"..chr) do + t[#t+1] = s + end + return t + else + return { } + end +end + +--~ function string.piecewise(str, pat, fnc) -- variant of split +--~ local fpat = "(.-)"..pat +--~ local last_end = 1 +--~ local s, e, cap = string.find(str, fpat, 1) +--~ while s ~= nil do +--~ if s~=1 or cap~="" then +--~ fnc(cap) +--~ end +--~ last_end = e+1 +--~ s, e, cap = string.find(str, fpat, last_end) +--~ end +--~ if last_end <= #str then +--~ fnc((string.sub(str,last_end))) +--~ end +--~ end + +function string.piecewise(str, pat, fnc) -- variant of split + for k in string.splitter(str,pat) do fnc(k) end +end + +--~ do if lpeg then + +--~ -- this alternative is 30% faster esp when we cache them +--~ -- problem: no expressions + +--~ splitters = { } + +--~ function string:split(separator) +--~ if #self > 0 then +--~ local split = splitters[separator] +--~ if not split then +--~ -- based on code by Roberto +--~ local p = lpeg.P(separator) +--~ local c = lpeg.C((1-p)^0) +--~ split = lpeg.Ct(c*(p*c)^0) +--~ splitters[separator] = split +--~ end +--~ return lpeg.match(split,self) +--~ else +--~ return { } +--~ end +--~ end + +--~ string.splitchr = string.split + +--~ function string:piecewise(separator,fnc) +--~ for _,v in pairs(self:split(separator)) do +--~ fnc(v) +--~ end +--~ end + +--~ end end + +string.chr_to_esc = { + ["%"] = "%%", + ["."] = "%.", + ["+"] = "%+", ["-"] = "%-", ["*"] = "%*", + ["^"] = "%^", ["$"] = "%$", + ["["] = "%[", ["]"] = "%]", + ["("] = "%(", [")"] = "%)", + ["{"] = "%{", ["}"] = "%}" +} + +function string:esc() -- variant 2 + return (self:gsub("(.)",string.chr_to_esc)) +end + +function string.unquote(str) + return (str:gsub("^([\"\'])(.*)%1$","%2")) +end + +function string.quote(str) + return '"' .. str:unquote() .. '"' +end + +function string:count(pattern) -- variant 3 + local n = 0 + for _ in self:gmatch(pattern) do + n = n + 1 + end + return n +end + +function string:limit(n,sentinel) + if #self > n then + sentinel = sentinel or " ..." + return self:sub(1,(n-#sentinel)) .. sentinel + else + return self + end +end + +function string:strip() + return (self:gsub("^%s*(.-)%s*$", "%1")) +end + +--~ function string.strip(str) -- slightly different +--~ return (string.gsub(string.gsub(str,"^%s*(.-)%s*$","%1"),"%s+"," ")) +--~ end + +function string:is_empty() + return not self:find("%S") +end + +function string:enhance(pattern,action) + local ok, n = true, 0 + while ok do + ok = false + self = self:gsub(pattern, function(...) + ok, n = true, n + 1 + return action(...) + end) + end + return self, n +end + +--~ function string:enhance(pattern,action) +--~ local ok, n = 0, 0 +--~ repeat +--~ self, ok = self:gsub(pattern, function(...) +--~ n = n + 1 +--~ return action(...) +--~ end) +--~ until ok == 0 +--~ return self, n +--~ end + +--~ function string:to_hex() +--~ if self then +--~ return (self:gsub("(.)",function(c) +--~ return string.format("%02X",c:byte()) +--~ end)) +--~ else +--~ return "" +--~ end +--~ end + +--~ function string:from_hex() +--~ if self then +--~ return (self:gsub("(..)",function(c) +--~ return string.char(tonumber(c,16)) +--~ end)) +--~ else +--~ return "" +--~ end +--~ end + +string.chr_to_hex = { } +string.hex_to_chr = { } + +for i=0,255 do + local c, h = string.char(i), string.format("%02X",i) + string.chr_to_hex[c], string.hex_to_chr[h] = h, c +end + +--~ function string:to_hex() +--~ if self then return (self:gsub("(.)",string.chr_to_hex)) else return "" end +--~ end + +--~ function string:from_hex() +--~ if self then return (self:gsub("(..)",string.hex_to_chr)) else return "" end +--~ end + +function string:to_hex() + return ((self or ""):gsub("(.)",string.chr_to_hex)) +end + +function string:from_hex() + return ((self or ""):gsub("(..)",string.hex_to_chr)) +end + +if not string.characters then + + local function nextchar(str, index) + index = index + 1 + return (index <= #str) and index or nil, str:sub(index,index) + end + function string:characters() + return nextchar, self, 0 + end + local function nextbyte(str, index) + index = index + 1 + return (index <= #str) and index or nil, string.byte(str:sub(index,index)) + end + function string:bytes() + return nextbyte, self, 0 + end + +end + +--~ function string:padd(n,chr) +--~ return self .. self.rep(chr or " ",n-#self) +--~ end + +function string:padd(n,chr) + local m = n-#self + if m > 0 then + return self .. self.rep(chr or " ",m) + else + return self + end +end + +function is_number(str) + return str:find("^[%-%+]?[%d]-%.?[%d+]$") == 1 +end + +--~ print(is_number("1")) +--~ print(is_number("1.1")) +--~ print(is_number(".1")) +--~ print(is_number("-0.1")) +--~ print(is_number("+0.1")) +--~ print(is_number("-.1")) +--~ print(is_number("+.1")) diff --git a/tex/context/base/l-table.lua b/tex/context/base/l-table.lua new file mode 100644 index 000000000..79d87139b --- /dev/null +++ b/tex/context/base/l-table.lua @@ -0,0 +1,492 @@ +-- filename : l-table.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-table'] = 1.001 + +table.join = table.concat + +function table.strip(tab) + local lst = { } + for k, v in ipairs(tab) do + -- s = string.gsub(v, "^%s*(.-)%s*$", "%1") + s = v:gsub("^%s*(.-)%s*$", "%1") + if s == "" then + -- skip this one + else + lst[#lst+1] = s + end + end + return lst +end + +--~ function table.sortedkeys(tab) +--~ local srt = { } +--~ for key,_ in pairs(tab) do +--~ srt[#srt+1] = key +--~ end +--~ table.sort(srt) +--~ return srt +--~ end + +function table.sortedkeys(tab) + local srt, kind = { }, 0 -- 0=unknown 1=string, 2=number 3=mixed + for key,_ in pairs(tab) do + srt[#srt+1] = key + if kind == 3 then + -- no further check + elseif type(key) == "string" then + if kind == 2 then kind = 3 else kind = 1 end + elseif type(key) == "number" then + if kind == 1 then kind = 3 else kind = 2 end + else + kind = 3 + end + end + if kind == 0 or kind == 3 then + table.sort(srt,function(a,b) return (tostring(a) < tostring(b)) end) + else + table.sort(srt) + end + return srt +end + +function table.append(t, list) + for _,v in pairs(list) do + table.insert(t,v) + end +end + +function table.prepend(t, list) + for k,v in pairs(list) do + table.insert(t,k,v) + end +end + +if not table.fastcopy then + + function table.fastcopy(old) -- fast one + if old then + local new = { } + for k,v in pairs(old) do + if type(v) == "table" then + new[k] = table.copy(v) + else + new[k] = v + end + end + return new + else + return { } + end + end + +end + +if not table.copy then + + function table.copy(t, _lookup_table) -- taken from lua wiki + _lookup_table = _lookup_table or { } + local tcopy = {} + if not _lookup_table[t] then + _lookup_table[t] = tcopy + end + for i,v in pairs(t) do + if type(i) == "table" then + if _lookup_table[i] then + i = _lookup_table[i] + else + i = table.copy(i, _lookup_table) + end + end + if type(v) ~= "table" then + tcopy[i] = v + else + if _lookup_table[v] then + tcopy[i] = _lookup_table[v] + else + tcopy[i] = table.copy(v, _lookup_table) + end + end + end + return tcopy + end + +end + +-- rougly: copy-loop : unpack : sub == 0.9 : 0.4 : 0.45 (so in critical apps, use unpack) + +function table.sub(t,i,j) + return { unpack(t,i,j) } +end + +function table.replace(a,b) + for k,v in pairs(b) do + a[k] = v + end +end + +-- slower than #t on indexed tables (#t only returns the size of the numerically indexed slice) + +function table.is_empty(t) + return not t or not next(t) +end + +function table.one_entry(t) + local n = next(t) + return n and not next(t,n) +end + +function table.starts_at(t) + return ipairs(t,1)(t,0) +end + +do + + -- 34.055.092 32.403.326 arabtype.tma + -- 1.620.614 1.513.863 lmroman10-italic.tma + -- 1.325.585 1.233.044 lmroman10-regular.tma + -- 1.248.157 1.158.903 lmsans10-regular.tma + -- 194.646 153.120 lmtypewriter10-regular.tma + -- 1.771.678 1.658.461 palatinosanscom-bold.tma + -- 1.695.251 1.584.491 palatinosanscom-regular.tma + -- 13.736.534 13.409.446 zapfinoextraltpro.tma + + -- 13.679.038 11.774.106 arabtype.tmc + -- 886.248 754.944 lmroman10-italic.tmc + -- 729.828 466.864 lmroman10-regular.tmc + -- 688.482 441.962 lmsans10-regular.tmc + -- 128.685 95.853 lmtypewriter10-regular.tmc + -- 715.929 582.985 palatinosanscom-bold.tmc + -- 669.942 540.126 palatinosanscom-regular.tmc + -- 1.560.588 1.317.000 zapfinoextraltpro.tmc + + table.serialize_functions = true + table.serialize_compact = true + table.serialize_inline = true + + local function key(k) + if type(k) == "number" then -- or k:find("^%d+$") then + return "["..k.."]" + elseif noquotes and k:find("^%a[%a%d%_]*$") then + return k + else + return '["'..k..'"]' + end + end + + local function simple_table(t) + if #t > 0 then + local n = 0 + for _,v in pairs(t) do + n = n + 1 + end + if n == #t then + local tt = { } + for _,v in ipairs(t) do + local tv = type(v) + if tv == "number" or tv == "boolean" then + tt[#tt+1] = tostring(v) + elseif tv == "string" then + tt[#tt+1] = ("%q"):format(v) + else + tt = nil + break + end + end + return tt + end + end + return nil + end + + local function serialize(root,name,handle,depth,level,reduce,noquotes,indexed) + handle = handle or print + reduce = reduce or false + if depth then + depth = depth .. " " + if indexed then + handle(("%s{"):format(depth)) + else + handle(("%s%s={"):format(depth,key(name))) + end + else + depth = "" + if type(name) == "string" then + if name == "return" then + handle("return {") + else + handle(name .. "={") + end + elseif type(name) == "number" then + handle("[" .. name .. "]={") + elseif type(name) == "boolean" then + if name then + handle("return {") + else + handle("{") + end + else + handle("t={") + end + end + if root and next(root) then + local compact = table.serialize_compact + local inline = compact and table.serialize_inline + local first, last = nil, 0 -- #root cannot be trusted here + if compact then + for k,v in ipairs(root) do + if not first then first = k end + last = last + 1 + end + end + for _,k in pairs(table.sortedkeys(root)) do + local v = root[k] + local t = type(v) + if compact and first and type(k) == "number" and k >= first and k <= last then + if t == "number" then + handle(("%s %s,"):format(depth,v)) + elseif t == "string" then + if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then + handle(("%s %s,"):format(depth,v)) + else + handle(("%s %q,"):format(depth,v)) + end + elseif t == "table" then + if not next(v) then + handle(("%s {},"):format(depth)) + elseif inline then + local st = simple_table(v) + if st then + handle(("%s { %s },"):format(depth,table.concat(st,", "))) + else + serialize(v,k,handle,depth,level+1,reduce,noquotes,true) + end + else + serialize(v,k,handle,depth,level+1,reduce,noquotes,true) + end + elseif t == "boolean" then + handle(("%s %s,"):format(depth,tostring(v))) + elseif t == "function" then + if table.serialize_functions then + handle(('%s loadstring(%q),'):format(depth,string.dump(v))) + else + handle(('%s "function",'):format(depth)) + end + else + handle(("%s %q,"):format(depth,tostring(v))) + end + elseif k == "__p__" then -- parent + if false then + handle(("%s __p__=nil,"):format(depth)) + end + elseif t == "number" then + handle(("%s %s=%s,"):format(depth,key(k),v)) + elseif t == "string" then + if reduce and (v:find("^[%-%+]?[%d]-%.?[%d+]$") == 1) then + handle(("%s %s=%s,"):format(depth,key(k),v)) + else + handle(("%s %s=%q,"):format(depth,key(k),v)) + end + elseif t == "table" then + if not next(v) then + handle(("%s %s={},"):format(depth,key(k))) + elseif inline then + local st = simple_table(v) + if st then + handle(("%s %s={ %s },"):format(depth,key(k),table.concat(st,", "))) + else + serialize(v,k,handle,depth,level+1,reduce,noquotes) + end + else + serialize(v,k,handle,depth,level+1,reduce,noquotes) + end + elseif t == "boolean" then + handle(("%s %s=%s,"):format(depth,key(k),tostring(v))) + elseif t == "function" then + if table.serialize_functions then + handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(v))) + else + handle(('%s %s="function",'):format(depth,key(k))) + end + else + handle(("%s %s=%q,"):format(depth,key(k),tostring(v))) + -- handle(('%s %s=loadstring(%q),'):format(depth,key(k),string.dump(function() return v end))) + end + end + if level > 0 then + handle(("%s},"):format(depth)) + else + handle(("%s}"):format(depth)) + end + else + handle(("%s}"):format(depth)) + end + end + + --~ name: + --~ + --~ true : return { } + --~ false : { } + --~ nil : t = { } + --~ string : string = { } + --~ 'return' : return { } + --~ number : [number] = { } + + function table.serialize(root,name,reduce,noquotes) + local t = { } + local function flush(s) + t[#t+1] = s + end + serialize(root, name, flush, nil, 0, reduce, noquotes) + return table.concat(t,"\n") + end + + function table.tohandle(handle,root,name,reduce,noquotes) + serialize(root, name, handle, nil, 0, reduce, noquotes) + end + + -- sometimes tables are real use (zapfino extra pro is some 85M) in which + -- case a stepwise serialization is nice; actually, we could consider: + -- + -- for line in table.serializer(root,name,reduce,noquotes) do + -- ...(line) + -- end + -- + -- so this is on the todo list + + table.tofile_maxtab = 2*1024 + + function table.tofile(filename,root,name,reduce,noquotes) + local f = io.open(filename,'w') + if f then + local concat = table.concat + local maxtab = table.tofile_maxtab + if maxtab > 1 then + local t = { } + local function flush(s) + t[#t+1] = s + if #t > maxtab then + f:write(concat(t,"\n"),"\n") -- hm, write(sometable) should be nice + t = { } + end + end + serialize(root, name, flush, nil, 0, reduce, noquotes) + f:write(concat(t,"\n"),"\n") + else + local function flush(s) + f:write(s,"\n") + end + serialize(root, name, flush, nil, 0, reduce, noquotes) + end + f:close() + end + end + +end + +--~ t = { +--~ b = "123", +--~ a = "x", +--~ c = 1.23, +--~ d = "1.23", +--~ e = true, +--~ f = { +--~ d = "1.23", +--~ a = "x", +--~ b = "123", +--~ c = 1.23, +--~ e = true, +--~ f = { +--~ e = true, +--~ f = { +--~ e = true +--~ }, +--~ }, +--~ }, +--~ g = function() end +--~ } + +--~ print(table.serialize(t), "\n") +--~ print(table.serialize(t,"name"), "\n") +--~ print(table.serialize(t,false), "\n") +--~ print(table.serialize(t,true), "\n") +--~ print(table.serialize(t,"name",true), "\n") +--~ print(table.serialize(t,"name",true,true), "\n") + +do + + local function flatten(t,f,complete) + for _,v in ipairs(t) do + if type(v) == "table" then + if complete or type(v[1]) == "table" then + flatten(v,f,complete) + else + f[#f+1] = v + end + else + f[#f+1] = v + end + end + end + + function table.flatten(t) + local f = { } + flatten(t,f,true) + return f + end + + function table.unnest(t) -- bad name + local f = { } + flatten(t,f,false) + return f + end + + table.flatten_one_level = table.unnest + +end + +function table.insert_before_value(t,value,str) + for i=1,#t do + if t[i] == value then + table.insert(t,i,str) + return + end + end + table.insert(t,1,str) +end + +function table.insert_after_value(t,value,str) + for i=1,#t do + if t[i] == value then + table.insert(t,i+1,str) + return + end + end + t[#t+1] = str +end + +function table.are_equal(a,b,n,m) + if #a == #b then + n = n or 1 + m = m or #a + for i=n,m do + local ai, bi = a[i], b[i] + if (ai==bi) or (type(ai)=="table" and type(bi)=="table" and table.are_equal(ai,bi)) then + -- continue + else + return false + end + end + return true + else + return false + end +end + +--~ function table.are_equal(a,b) +--~ return table.serialize(a) == table.serialize(b) +--~ end + diff --git a/tex/context/base/l-tex.lua b/tex/context/base/l-tex.lua new file mode 100644 index 000000000..3d87fe6e3 --- /dev/null +++ b/tex/context/base/l-tex.lua @@ -0,0 +1,110 @@ +-- filename : l-tex.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-tex'] = 1.001 + +if not number then number = { } end + +number.dimenfactors = { + ["pt"] = 1/65536, + ["in"] = ( 100/ 7227)/65536, + ["cm"] = ( 254/ 7227)/65536, + ["mm"] = ( 254/72270)/65536, + ["sp"] = 1, + ["bp"] = ( 7200/ 7227)/65536, + ["pc"] = ( 1/ 12)/65536, + ["dd"] = ( 1157/ 1238)/65536, + ["cc"] = ( 1157/14856)/65536, + ["nd"] = (20320/21681)/65536, + ["nc"] = ( 5080/65043)/65536 +} + +function number.todimen(n,unit,fmt) + if type(n) == 'string' then + return n + else + return string.format(fmt or "%.5g%s",n*number.dimenfactors[unit or 'pt'],unit or 'pt') + end +end + +function number.topoints (n) return number.todimen(n,"pt") end +function number.toinches (n) return number.todimen(n,"in") end +function number.tocentimeters (n) return number.todimen(n,"cm") end +function number.tomillimeters (n) return number.todimen(n,"mm") end +function number.toscaledpoints(n) return number.todimen(n,"sp") end +function number.toscaledpoints(n) return n .. "sp" end +function number.tobasepoints (n) return number.todimen(n,"bp") end +function number.topicas (n) return number.todimen(n "pc") end +function number.todidots (n) return number.todimen(n,"dd") end +function number.tociceros (n) return number.todimen(n,"cc") end +function number.tonewdidots (n) return number.todimen(n,"nd") end +function number.tonewciceros (n) return number.todimen(n,"nc") end + +--~ for k,v in pairs{nil, "%.5f%s", "%.8g%s", "%.8f%s"} do +--~ print(number.todimen(65536)) +--~ print(number.todimen( 256)) +--~ print(number.todimen(65536,'pt',v)) +--~ print(number.todimen( 256,'pt',v)) +--~ end + +-- todo: use different scratchdimen +-- todo: use parser if no tex.dimen + +function string.todimen(str) + if type(str) == "number" then + return str + elseif str:find("^[%d%-%+%.]+$") then + return tonumber(str) +--~ elseif tex then +--~ tex.dimen[0] = str +--~ return tex.dimen[0] or 0 + else + local n, u = str:match("([%d%-%+%.]+)(%a%a)") + if n and u then + return n/number.dimenfactors[u] + else + return 0 + end + end +end + +--~ print(string.todimen("10000")) +--~ print(string.todimen("10pt")) + +--~ See mk.pdf for an explanation of the following code: +--~ +--~ function test(n) +--~ lua.delay(function(...) +--~ tex.sprint(string.format("pi: %s %s %s\\par",...)) +--~ end) +--~ lua.delay(function(...) +--~ tex.sprint(string.format("more pi: %s %s %s\\par",...)) +--~ end) +--~ tex.sprint(string.format("\\setbox0=\\hbox{%s}",math.pi*n)) +--~ lua.flush(tex.wd[0],tex.ht[0],tex.dp[0]) +--~ end + +if lua then do + + delayed = { } -- could also be done with closures + + function lua.delay(f) + delayed[#delayed+1] = f + end + + function lua.flush_delayed(...) + local t = delayed + delayed = { } + for _, fun in ipairs(t) do + fun(...) + end + end + + function lua.flush(...) + tex.sprint("\\directlua 0 {lua.flush_delayed(" .. table.concat({...},',') .. ")}") + end + +end end diff --git a/tex/context/base/l-unicode.lua b/tex/context/base/l-unicode.lua new file mode 100644 index 000000000..d0c05bb86 --- /dev/null +++ b/tex/context/base/l-unicode.lua @@ -0,0 +1,148 @@ +-- filename : l-unicode.lua +-- comment : split off from luat-inp +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-unicode'] = 1.001 +if not unicode then unicode = { } end + +if not garbagecollector then + garbagecollector = { + push = function() collectgarbage("stop") end, + pop = function() collectgarbage("restart") end, + } +end + +-- 0 EF BB BF UTF-8 +-- 1 FF FE UTF-16-little-endian +-- 2 FE FF UTF-16-big-endian +-- 3 FF FE 00 00 UTF-32-little-endian +-- 4 00 00 FE FF UTF-32-big-endian + +unicode.utfname = { + [0] = 'utf-8', + [1] = 'utf-16-le', + [2] = 'utf-16-be', + [3] = 'utf-32-le', + [4] = 'utf-32-be' +} + +function unicode.utftype(f) -- \000 fails ! + local str = f:read(4) + if not str then + f:seek('set') + return 0 + elseif str:find("^%z%z\254\255") then + return 4 + elseif str:find("^\255\254%z%z") then + return 3 + elseif str:find("^\254\255") then + f:seek('set',2) + return 2 + elseif str:find("^\255\254") then + f:seek('set',2) + return 1 + elseif str:find("^\239\187\191") then + f:seek('set',3) + return 0 + else + f:seek('set') + return 0 + end +end + +function unicode.utf16_to_utf8(str, endian) + garbagecollector.push() + local result = { } + local tc, uc = table.concat, unicode.utf8.char + local tmp, n, m, p = { }, 0, 0, 0 + -- lf | cr | crlf / (cr:13, lf:10) + local function doit() + if n == 10 then + if p ~= 13 then + result[#result+1] = tc(tmp,"") + tmp = { } + p = 0 + end + elseif n == 13 then + result[#result+1] = tc(tmp,"") + tmp = { } + p = n + else + tmp[#tmp+1] = uc(n) + p = 0 + end + end + for l,r in str:bytepairs() do + if endian then + n = l*256 + r + else + n = r*256 + l + end + if m > 0 then + n = (m-0xD800)*0x400 + (n-0xDC00) + 0x10000 + m = 0 + doit() + elseif n >= 0xD800 and n <= 0xDBFF then + m = n + else + doit() + end + end + if #tmp > 0 then + result[#result+1] = tc(tmp,"") + end + garbagecollector.pop() + return result +end + +function unicode.utf32_to_utf8(str, endian) + garbagecollector.push() + local result = { } + local tc, uc = table.concat, unicode.utf8.char + local tmp, n, m, p = { }, 0, -1, 0 + -- lf | cr | crlf / (cr:13, lf:10) + local function doit() + if n == 10 then + if p ~= 13 then + result[#result+1] = tc(tmp,"") + tmp = { } + p = 0 + end + elseif n == 13 then + result[#result+1] = tc(tmp,"") + tmp = { } + p = n + else + tmp[#tmp+1] = uc(n) + p = 0 + end + end + for a,b in str:bytepairs() do + if a and b then + if m < 0 then + if endian then + m = a*256*256*256 + b*256*256 + else + m = b*256 + a + end + else + if endian then + n = m + a*256 + b + else + n = m + b*256*256*256 + a*256*256 + end + m = -1 + doit() + end + else + break + end + end + if #tmp > 0 then + result[#result+1] = tc(tmp,"") + end + garbagecollector.pop() + return result +end diff --git a/tex/context/base/l-utils.lua b/tex/context/base/l-utils.lua new file mode 100644 index 000000000..96273106a --- /dev/null +++ b/tex/context/base/l-utils.lua @@ -0,0 +1,121 @@ +-- filename : l-utils.lua +-- comment : split off from luat-lib +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['l-utils'] = 1.001 + +if not utils then utils = { } end +if not utils.merger then utils.merger = { } end +if not utils.lua then utils.lua = { } end + +utils.merger.m_begin = "begin library merge" +utils.merger.m_end = "end library merge" +utils.merger.pattern = + "%c+" .. + "%-%-%s+" .. utils.merger.m_begin .. + "%c+(.-)%c+" .. + "%-%-%s+" .. utils.merger.m_end .. + "%c+" + +function utils.merger._self_fake_() + return + "-- " .. "created merged file" .. "\n\n" .. + "-- " .. utils.merger.m_begin .. "\n\n" .. + "-- " .. utils.merger.m_end .. "\n\n" +end + +function utils.report(...) + print(...) +end + +function utils.merger._self_load_(name) + local f, data = io.open(name), "" + if f then + data = f:read("*all") + f:close() + end + return data or "" +end + +function utils.merger._self_save_(name, data) + if data ~= "" then + local f = io.open(name,'w') + if f then + f:write(data) + f:close() + end + end +end + +function utils.merger._self_swap_(data,code) + if data ~= "" then + return (data:gsub(utils.merger.pattern, function(s) + return "\n\n" .. "-- "..utils.merger.m_begin .. "\n" .. code .. "\n" .. "-- "..utils.merger.m_end .. "\n\n" + end, 1)) + else + return "" + end +end + +function utils.merger._self_libs_(libs,list) + local result, f = "", nil + if type(libs) == 'string' then libs = { libs } end + if type(list) == 'string' then list = { list } end + for _, lib in ipairs(libs) do + for _, pth in ipairs(list) do + local name = string.gsub(pth .. "/" .. lib,"\\","/") + f = io.open(name) + if f then + -- utils.report("merging library",name) + result = result .. "\n" .. f:read("*all") .. "\n" + f:close() + list = { pth } -- speed up the search + break + else + -- utils.report("no library",name) + end + end + end + return result or "" +end + +function utils.merger.selfcreate(libs,list,target) + if target then + utils.merger._self_save_( + target, + utils.merger._self_swap_( + utils.merger._self_fake_(), + utils.merger._self_libs_(libs,list) + ) + ) + end +end + +function utils.merger.selfmerge(name,libs,list,target) + utils.merger._self_save_( + target or name, + utils.merger._self_swap_( + utils.merger._self_load_(name), + utils.merger._self_libs_(libs,list) + ) + ) +end + +function utils.merger.selfclean(name) + utils.merger._self_save_( + name, + utils.merger._self_swap_( + utils.merger._self_load_(name), + "" + ) + ) +end + +function utils.lua.compile(luafile, lucfile) + -- utils.report("compiling",luafile,"into",lucfile) + os.remove(lucfile) + return (os.execute("luac -s -o " .. string.quote(lucfile) .. " " .. string.quote(luafile)) == 0) +end + diff --git a/tex/context/base/lang-ini.lua b/tex/context/base/lang-ini.lua new file mode 100644 index 000000000..5259a085e --- /dev/null +++ b/tex/context/base/lang-ini.lua @@ -0,0 +1,327 @@ +if not modules then modules = { } end modules ['lang-ini'] = { + version = 1.001, + comment = "companion to lang-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +languages = languages or { } +languages.patterns = languages.patterns or { } +languages.version = 1.009 +languages.template = "words-%s.txt" +languages.number = nil +languages.current = nil +languages.attribute = nil + +-- We used to have one list: data[word] = pattern but that overflowed lua's function +-- mechanism. Then we split the lists and again we had oveflows. So eventually we +-- ended up with a dedicated reader. +-- +-- function languages.set(attribute,number,name) +-- if not languages.patterns[number] then +-- languages.patterns[number] = containers.define("languages","patterns", languages.version, true) +-- end +-- input.start_timing(languages) +-- local data = containers.read(languages.patterns[number],name) +-- if not data then +-- data = { } +-- local fullname = string.format(languages.template,name) +-- local foundname = input.find_file(texmf.instance,fullname,'other text file') +-- if foundname and foundname ~= "" then +-- local ok, blob, size = input.loadbinfile(texmf.instance,foundname) +-- for word in utf.gfind(blob,"(.-)[%s]+") do +-- local key = word:gsub("-","") +-- if key == word then +-- -- skip +-- else +-- data[word:gsub("-","")] = word +-- end +-- end +-- end +-- data = containers.write(languages.patterns[number],name,data) +-- end +-- input.stop_timing(languages) +-- languages.attribute = attribute +-- languages.number = number +-- languages.current = data +-- end + +function languages.set(attribute,number,name) + if not languages.patterns[number] then + input.start_timing(languages) + local fullname = string.format(languages.template,name) + local foundname = input.find_file(texmf.instance,fullname,'other text file') + if foundname and foundname ~= "" then + -- texio.write_nl(string.format("loading patterns for language %s as %s from %s",name,number,foundname)) + languages.patterns[number] = tex.load_dict(foundname) or { } + else + languages.patterns[number] = { } + end + input.stop_timing(languages) + end + languages.attribute = attribute + languages.number = number + languages.current = languages.patterns[number] +end + +function languages.add(word,pattern) + if languages.current and word and pattern then + languages.current[word] = pattern + end +end + +function languages.remove(word) + if languages.current and word then + languages.current[word] = nil + end +end + +function languages.hyphenate(str) + if languages.current then + local result = languages.current[str] + if result then + return result + else + -- todo: be clever + end + end + return str +end + +function languages.found(number, str) + local patterns = languages.patterns[number] + return patterns and patterns[str] +end + +do + + local discnode = node.new('disc') + + discnode.pre = node.new('glyph') + discnode.pre.subtype = 0 + discnode.pre.char = 45 -- will be configurable + discnode.pre.font = 0 + + local glyph, disc, kern = node.id('glyph'), node.id('disc'), node.id('kern') + + local bynode = node.traverse + local bychar = string.utfcharacters + + function reconstruct(prev,str,fnt) + local done = false + if #str < 4 then + -- too short + else + local wrd = languages.hyphenate(str) + if wrd == str then + -- not found + else + local pre, post, after, comp = nil, nil, false, nil + for chr in bychar(wrd) do + if prev then + if not comp and prev.next and prev.next.subtype > 0 then + comp = prev.next.components + pre = node.copy(comp) + comp = comp.next + post, after = nil, false + elseif chr == '-' then + if not comp then + done = true + local n = node.copy(discnode) + n.pre.font = fnt.font + n.pre.attr = fnt.attr + if pre then + pre.next = n.pre + n.pre = pre + pre, pos, after = nil, nil, false + end + n.next = prev.next + prev.next = n + prev = n + else + after = true + end + elseif comp then + local g = node.copy(comp) + comp = comp.next + if after then + if post then post.next = g else post = g end + else + if pre then pre.next = g else pre = g end + end + if not comp then + done = true + local n = node.copy(discnode) + n.pre.font = fnt.font + n.pre.attr = fnt.attr + pre.next = n.pre + n.pre = pre + n.post = post + n.replace = 1 + n.next = prev.next + prev.next = n + prev = n + pre, pos, after = nil, nil, false + prev = prev.next -- hm, now we get error 1 + end + else + prev = prev.next + end + else + -- print("ERROR 1") + end + end + end + end + return done + end + + function nodes.hyphenate_words(head) -- we forget about the very first, no head stuff here + local cd = characters.data + local uc = utf.char + local n, p = head, nil + local done, prev, str, fnt, lan = false, false, "", nil, nil + local currentlanguage = languages.current + local att = languages.attribute + local function action() -- maybe inline + if reconstruct(prev,str,fnt) then + done = true + end + str, prev = "", false + end + while n do + local id = n.id + if id == glyph then + local l = node.has_attribute(n,att) + if l then + if l ~= lan then + if prev then action() end + lan = l + languages.current = languages.patterns[lan] + end + elseif prev then + action() + end + if not languages.current then + -- skip + elseif n.subtype > 0 then + if not prev then + prev, fnt = p, n + end + for g in bynode(n.components) do + str = str .. uc(g.char) + end + else + local code = n.char + if cd[code].lccode then + if not prev then + prev, fnt = p, n + end + str = str .. uc(code) + elseif prev then + action() + end + end + elseif id == kern and n.subtype == 0 and p then + p.next = n.next + node.free(p,n) + n = p + elseif prev then + action() + end + p = n + n = n.next + end + if prev then + action() + end + languages.current = currentlanguage + return head + end + + function nodes.mark_words(head,attribute,found) + local cd = characters.data + local uc = utf.char + local current, start, str, att, n = head, nil, "", nil, 0 + local function action() + local f = found(att,str) + if f then + for i=1,n do + f(start) + start = start.next + end + end + str, start, n = "", nil, 0 + end + while current do + local id = current.id + if id == glyph then + local a = node.has_attribute(current,attribute) + if a then + if a ~= att then + if start then + action() + end + att = a + end + elseif start then + action() + att = a + end + if current.subtype > 0 then + start = start or current + n = n + 1 + for g in bynode(current.components) do + str = str .. uc(g.char) + end + else + local code = current.char + if cd[code].lccode then + start = start or current + n = n + 1 + str = str .. uc(code) + else + if start then + action() + end + end + end + elseif id == disc then + -- ok + elseif id == kern and current.subtype == 0 and start then + -- ok + elseif start then + action() + end + current = current.next + end + if start then + action() + end + return head + end + + function languages.check(head, attribute, yes, nop) + local set = node.set_attribute + local unset = node.unset_attribute + local wrong, right = false, false + if nop then wrong = function(n) set(n,attribute,nop) end end + if yes then right = function(n) set(n,attribute,yes) end end + for n in node.traverse(head) do + unset(n,attribute) + end + nodes.mark_words(head, languages.attribute, function(att,str) + if #str < 4 then + return false + elseif languages.found(att,str) then + return right + else + return wrong + end + end) + nodes.hyphenate_words(head) + return head + end + +end diff --git a/tex/context/base/lang-ini.mkiv b/tex/context/base/lang-ini.mkiv new file mode 100644 index 000000000..e62166966 --- /dev/null +++ b/tex/context/base/lang-ini.mkiv @@ -0,0 +1,23 @@ +%D \module +%D [ file=lang-ini, +%D version=1996.01.25, +%D title=\CONTEXT\ Language Macros, +%D subtitle=Initialization, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\registerctxluafile{lang-ini}{1.001} + +\def\synchronizepatternswithfont{} +\def\doloadpatterns #1#2{\dodoloadpatterns{#1}{#2}\s!default\s!default} +\def\setnormallanguage #1{\dosetnormallanguage{:\s!default:\s!default:}#1\empty} +\def\setuphyppatencoding {\pathypsettings} + +\protect \endinput diff --git a/tex/context/base/lang-ini.tex b/tex/context/base/lang-ini.tex index b5cfda0db..6f0352772 100644 --- a/tex/context/base/lang-ini.tex +++ b/tex/context/base/lang-ini.tex @@ -353,12 +353,12 @@ \def\setuphyppatencoding {\pathypsettings} \endXETEX -\beginMETATEX +\beginLUATEX \def\synchronizepatternswithfont{} \def\doloadpatterns #1#2{\dodoloadpatterns{#1}{#2}\s!default\s!default} \def\setnormallanguage #1{\dosetnormallanguage{:\s!default:\s!default:}#1\empty} \def\setuphyppatencoding {\pathypsettings} -\endMETATEX +\endLUATEX \def\dodoloadpatterns#1#2#3#4% beware, loaded language also incr {\normallanguage\loadedlanguage % when not really needed diff --git a/tex/context/base/lang-sla.mkiv b/tex/context/base/lang-sla.mkiv new file mode 100644 index 000000000..dfa56bab5 --- /dev/null +++ b/tex/context/base/lang-sla.mkiv @@ -0,0 +1,17 @@ +%D \module +%D [ file=lang-sla, +%D version=2006.09.16, +%D title=\CONTEXT\ Language Macros, +%D subtitle=Slavic Languages, +%D author=Hans Hagen / Tobias Burnus, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\def\sloveniancharacters#1{\ctxlua{convert.alphabetic(\number#1,"sl")}} +\def\slovenianCharacters#1{\ctxlua{convert.Alphabetic(\number#1,"sl")}} + +\endinput diff --git a/tex/context/base/luat-cbk.lua b/tex/context/base/luat-cbk.lua new file mode 100644 index 000000000..a6145ec3b --- /dev/null +++ b/tex/context/base/luat-cbk.lua @@ -0,0 +1,150 @@ +if not modules then modules = { } end modules ['luat-cbk'] = { + version = 1.001, + comment = "companion to luat-lib.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

Callbacks are the real asset of . They permit you to hook +your own code into the engine. Here we implement a few handy +auxiliary functions.

+--ldx]]-- + +callbacks = { } +callbacks.stack = { } + +--[[ldx-- +

When you (temporarily) want to install a callback function, and after a +while wants to revert to the original one, you can use the following two +functions.

+--ldx]]-- + +function callbacks.push(name, func) + if not callbacks.stack[name] then + callbacks.stack[name] = { } + end + table.insert(callbacks.stack[name],callback.find(name)) + callback.register(name, func) +end + +function callbacks.pop(name) +-- this fails: callback.register(name, table.remove(callbacks.stack[name])) + local func = table.remove(callbacks.stack[name]) + callback.register(name, func) +end + +--[[ldx-- +

The simple case is to remove the callback:

+ + +callbacks.push('linebreak_filter') +... some actions ... +callbacks.pop('linebreak_filter') + + +

Often, in such case, another callback or a macro call will pop +the original.

+ +

In practice one will install a new handler, like in:

+ + +callbacks.push('linebreak_filter', function(...) + return something_done(...) +end) + + +

Even more interesting is:

+ + +callbacks.push('linebreak_filter', function(...) + callbacks.pop('linebreak_filter') + return something_done(...) +end) + + +

This does a one-shot.

+--ldx]]-- + + +--[[ldx-- +

Callbacks may result in doing some hard work +which takes time and above all resourses. Sometimes it makes +sense to disable or tune the garbage collector in order to +keep the use of resources acceptable.

+ +

At some point in the development we did some tests with counting +nodes (in thsi case 121049).

+ + +
setstepmulsecondsmegabytes +
20024.080.5 +
17521.078.2 +
15022.074.6 +
16022.074.6 +
16521.077.6 +
12521.589.2 +
10021.588.4 +
+ +

The following code is kind of experimental. In the documents +that describe the development of we report +on speed tests. One observation is thta it sometimes helps to +restart the collector.

+--ldx]]-- + +garbagecollector = { } + +do + local level = 0 + + collectgarbage("setstepmul", 165) + + garbagecollector.trace = false + garbagecollector.tune = false -- for the moment + + function report(format) + if garbagecollector.trace then + -- texio.write_nl(string.format(format,level,status.luastate_bytes)) + texio.write_nl(string.format(format,level,collectgarbage("count"))) + end + end + + function garbagecollector.update() + report("%s: memory before update: %s") + collectgarbage("restart") + end + + function garbagecollector.push() + if garbagecollector.tune then + level = level + 1 + if level == 1 then + collectgarbage("stop") + end + report("%s: memory after push: %s") + else + garbagecollector.update() + end + end + + function garbagecollector.pop() + if garbagecollector.tune then + report("%s: memory before pop: %s") + if level == 1 then + collectgarbage("restart") + end + level = level - 1 + end + end + + function garbagecollector.cycle() + if garbagecollector.tune then + report("%s: memory before collect: %s") + collectgarbage("collect") + report("%s: memory after collect: %s") + end + end + +end + diff --git a/tex/context/base/luat-crl.lua b/tex/context/base/luat-crl.lua new file mode 100644 index 000000000..9d15b4896 --- /dev/null +++ b/tex/context/base/luat-crl.lua @@ -0,0 +1,53 @@ +-- filename : luat-crl.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-crl'] = 1.001 +if not curl then curl = { } end + +curl.cachepath = cache.setpath(texmf.instance,"curl") + +curl.cached = { } + +function curl.fetch(protocol, name) + local cachename = curl.cachepath .. "/" .. file.robustname(name) + cachename = cachename:gsub("[\\/]", io.fileseparator) + if not curl.cached[name] then + if not io.exists(cachename) then + curl.cached[name] = cachename + local command = "curl --silent --create-dirs --output " .. cachename .. " " .. protocol .. "://" .. name + os.execute(command) + end + if io.exists(cachename) then + curl.cached[name] = cachename + else + curl.cached[name] = "" + end + end + return curl.cached[name] +end + +function input.finders.curl(instance,protocol,filename) + local foundname = curl.fetch(protocol, filename) + return input.finders.generic(instance,protocol,foundname,filetype) +end +function input.openers.curl(instance,protocol,filename) + return input.openers.generic(instance,protocol,filename) +end +function input.loaders.curl(instance,protocol,filename) + return input.loaders.generic(instance,protocol,filename) +end + +-- todo: metamethod + +function curl.install(protocol) + input.finders[protocol] = function (instance,filename,filetype) return input.finders.curl(instance,protocol,filename) end + input.openers[protocol] = function (instance,filename) return input.openers.curl(instance,protocol,filename) end + input.loaders[protocol] = function (instance,filename) return input.loaders.curl(instance,protocol,filename) end +end + +curl.install('http') +curl.install('https') +curl.install('ftp') diff --git a/tex/context/base/luat-deb.lua b/tex/context/base/luat-deb.lua new file mode 100644 index 000000000..fc671d6be --- /dev/null +++ b/tex/context/base/luat-deb.lua @@ -0,0 +1,154 @@ +-- filename : luat-deb.lua +-- comment : companion to luat-deb.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-deb'] = 1.001 +if not lmx then lmx = { } end +if not lmx.variables then lmx.variables = { } end + +lmx.variables['color-background-green'] = '#4F6F6F' +lmx.variables['color-background-blue'] = '#6F6F8F' +lmx.variables['color-background-yellow'] = '#8F8F6F' +lmx.variables['color-background-purple'] = '#8F6F8F' + +lmx.variables['color-background-body'] = '#808080' +lmx.variables['color-background-main'] = '#3F3F3F' +lmx.variables['color-background-one'] = lmx.variables['color-background-green'] +lmx.variables['color-background-two'] = lmx.variables['color-background-blue'] + +lmx.variables['title-default'] = 'ConTeXt Status Information' +lmx.variables['title'] = lmx.variables['title-default'] + +if not trace then trace = { } end +if not trace.list then trace.list = { } end +if not trace.strings then trace.strings = { } end + +trace.strings.undefined = "undefined" + +function trace.split(csname) + return csname:match("^(.+):(.+)$") +end + +function trace.type(csname) + tag, name = trace.split(csname) + if tag then return tag else return nil end +end + +function trace.name(csname) + tag, name = trace.split(csname) + if tag then return name else return csname end +end + +function trace.cs(csname) + tag, name = trace.split(csname) + if trace.types[tag] then + return trace.types[tag](name) + else + return trace.primitive(csname) + end +end + +function trace.dimen(name) + return (tex.dimen[name] and number.topoints(tex.dimen[name])) or trace.strings.undefined +end + +function trace.count(name) + return tex.count[name] or trace.strings.undefined +end + +function trace.toks(name) + return (tex.toks[name] and string.limit(tex.toks[name],40)) or trace.strings.undefined +end + +function trace.primitive(name) + return tex[name] or trace.strings.undefined +end + +trace.types = { + ['d'] = trace.dimen, + ['c'] = trace.count, + ['t'] = trace.toks, + ['p'] = trace.primitive +} + +function trace.knownlist(name) + return trace.list[name] and #trace.list[name] > 0 +end + +function trace.showdebuginfo() + lmx.set('title', 'ConTeXt Debug Information') + lmx.set('color-background-one', lmx.get('color-background-green')) + lmx.set('color-background-two', lmx.get('color-background-blue')) + lmx.show('context-debug.lmx') + lmx.restore() +end + +function trace.showerror() + lmx.set('title', 'ConTeXt Error Information') + lmx.set('errormessage', status.lasterrorstring) + lmx.set('linenumber', status.linenumber) + lmx.set('color-background-one', lmx.get('color-background-yellow')) + lmx.set('color-background-two', lmx.get('color-background-purple')) + local filename = status.filename + local linenumber = tonumber(status.linenumber or "0") + if not filename then + lmx.set('filename', 'unknown') + lmx.set('errorcontext', 'error in filename') + elseif type(filename) == "number" then + lmx.set('filename', "") + lmx.set('errorcontext', 'unknown error') + elseif io.exists(filename) then + -- todo: use an input opener so that we also catch utf16 an reencoding + lmx.set('filename', filename) + lines = io.lines(filename) + if lines then + local context = { } + n, m = 1, linenumber + b, e = m-10, m+10 + s = string.len(tostring(e)) + for line in lines do + if n > e then + break + elseif n > b then + if n == m then + context[#context+1] = string.format("%" .. s .. "d",n) .. " >> " .. line + else + context[#context+1] = string.format("%" .. s .. "d",n) .. " " .. line + end + end + n = n + 1 + end + lmx.set('errorcontext', table.concat(context,"\n")) + else + lmx.set('errorcontext', "") + end + else + lmx.set('filename', filename) + lmx.set('errorcontext', 'file not found') + end + lmx.show('context-error.lmx') + lmx.restore() +end + +function trace.overloaderror() +--~ callback.register('show_error_hook', function(identifier, filename, linenumber) +--~ trace.showerror(identifier, filename, linenumber) +--~ end ) + callback.register('show_error_hook', trace.showerror) +end + +trace.list['scratch'] = { + 0, 2, 4, 6, 8 +} + +trace.list['internals'] = { + 'p:hsize', 'p:parindent', 'p:leftskip','p:rightskip', + 'p:vsize', 'p:parskip', 'p:baselineskip', 'p:lineskip', 'p:topskip' +} + +trace.list['context'] = { + 'd:lineheight', + 'c:realpageno', 'c:pageno', 'c:subpageno' +} diff --git a/tex/context/base/luat-deb.tex b/tex/context/base/luat-deb.tex new file mode 100644 index 000000000..d76cb212e --- /dev/null +++ b/tex/context/base/luat-deb.tex @@ -0,0 +1,49 @@ +%D \module +%D [ file=luat-deb, +%D version=2005.11.06, +%D title=\CONTEXT\ Communication Macros, +%D subtitle=Initialization, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Communication Support (initialization)} + +\registerctxluafile{luat-deb}{1.001} + +\startruntimeluacode + \ctxlua { + lmx.htmfile = function(name) return environment.jobname .. "-status.html" end + lmx.lmxfile = function(name) return environment.texfile(name) end + } +\stopruntimeluacode + +\def\showdebuginfo{\ctxlua{trace.showdebuginfo()}} +\def\overloaderror{\ctxlua{trace.overloaderror()}} + +\def\breakpoint{\showdebuginfo\wait} + +\registerctxluafile{luat-tra}{1.001} + +\appendtoks + \ctxlua { + if debugger.tracing() then + debugger.enable() ; + end + }% +\to \everyjob + +\appendtoks + \ctxlua { + if debugger.tracing() then + debugger.disable() ; + debugger.savestats("\jobname-luacalls.log") ; + end + }% +\to \everybye + +\endinput diff --git a/tex/context/base/luat-env.lua b/tex/context/base/luat-env.lua new file mode 100644 index 000000000..a3bf6cd11 --- /dev/null +++ b/tex/context/base/luat-env.lua @@ -0,0 +1,172 @@ +-- filename : luat-env.lua +-- comment : companion to luat-env.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- here we don't assume any extra libraries + +if not versions then versions = { } end versions['luat-env'] = 1.001 + +-- environment + +if not environment then environment = { } end + +environment.useluc = false -- for testing +--~ environment.silent = true -- for testing + +if environment.silent == nil then environment.silent = false end +if environment.useluc == nil then environment.useluc = true end + +-- kpse is overloaded by this time + +if environment.formatname == nil then environment.formatname = tex.formatname end +if environment.formatpath == nil then environment.formatpath = kpse.find_file(tex.formatname,"fmt") or "." end +if environment.jobname == nil then environment.jobname = tex.jobname end +if environment.progname == nil then environment.progname = os.getenv("progname") or "luatex" end +if environment.engine == nil then environment.engine = os.getenv("engine") or "context" end +if environment.enginepath == nil then environment.enginepath = os.getenv("SELFAUTOLOC") or "." end +if environment.initex == nil then environment.initex = tex.formatname == "" end + +environment.formatpath = string.gsub(environment.formatpath:gsub("\\","/"),"/([^/]-)$","") +environment.enginepath = string.gsub(environment.enginepath:gsub("\\","/"),"/([^/]-)$","") + +if environment.formatname == "" then environment.formatpath = "cont-en" end +if environment.formatpath == "" then environment.formatpath = '.' end +if environment.enginepath == "" then environment.enginepath = '.' end +if environment.version == nil then environment.version = "unknown" end + +function environment.get(name) + return os.getenv(name) or "" +end + +function environment.cleanname(filename) + if filename and filename ~= "" then + return filename:gsub( "\\", "/") + else -- leave nil and empty untouched + return filename + end +end + +function environment.texfile(filename) + return environment.cleanname(input.find_file(texmf.instance,filename,'tex')) +end + +function environment.ctxfile(filename) + return environment.cleanname(input.find_file(texmf.instance,filename,'tex')) +end + +function environment.luafile(filename) + return environment.cleanname(input.find_file(texmf.instance,filename,'tex') or input.find_file(texmf.instance,filename,'texmfscripts')) +end + +function environment.showmessage(...) -- todo, cleaner + if not environment.silent then + if input and input.report then + input.report(table.concat({...}," ")) + elseif texio and texio.write_nl then + texio.write_nl("[[" .. table.concat({...}," ") .. "]]") + else + print("[[" .. table.concat({...}," ") .. "]]") + end + end +end + +if not environment.jobname then environment.jobname = "unknown" end + +function environment.setlucpath() + if environment.initex then + environment.lucpath = nil + else + environment.lucpath = environment.formatpath .. "/lua/" .. environment.progname + end +end + +function environment.luafilechunk(filename) + local filename = filename:gsub("%.%a+$", "") .. ".lua" + local fullname = environment.luafile(filename) + if fullname and fullname ~= "" then + environment.showmessage("loading file", fullname) + return loadfile(fullname) + else + environment.showmessage("unknown file", filename) + return nil + end +end + +-- the next ones can use the previous ones + +function environment.loadluafile(filename,register) + filename = filename:gsub("%.%a+$", "") .. ".lua" + local fullname = environment.luafile(filename) + if fullname and fullname ~= "" then + environment.showmessage("loading", fullname) + if register then + if not environment.regfil then + environment.regfil = io.open('luafiles.tmp', 'w') + end + if environment.regfil then + environment.regfil:write(fullname .."\n") + end + end + dofile(fullname) + else + environment.showmessage("unknown file", filename) + end +end + +function environment.loadlucfile(filename,version) + local filename = filename:gsub("%.%a+$", "") + local fullname = nil + if environment.initex or not environment.useluc then + environment.loadluafile(filename,environment.initex) + else + if environment.lucpath and environment.lucpath ~= "" then + fullname = environment.lucpath .. "/" .. filename .. ".luc" + local chunk = loadfile(fullname) -- this way we don't need a file exists check + if chunk then + environment.showmessage("loading", fullname) + assert(chunk)() + if version then +--~ if modules and modules[filename] and modules[filename].version ~= version then +--~ environment.showmessage("version mismatch", filename,"lua=" .. modules[filename].version, "luc=" ..version) +--~ environment.loadluafile(filename) +--~ elseif versions and versions[filename] and versions[filename] ~= version then +--~ environment.showmessage("version mismatch", filename,"lua=" .. versions[filename], "luc=" ..version) +--~ environment.loadluafile(filename) +--~ end + local v = version -- can be nil + if modules and modules[filename] then + v = modules[filename].version -- new + elseif versions and versions[filename] then + v = versions[filename] -- old + end + if v ~= version then + environment.showmessage("version mismatch", filename,"lua=" .. v, "luc=" ..version) + environment.loadluafile(filename) + end + + end + else + environment.loadluafile(filename) + end + else + environment.loadluafile(filename) + end + end +end + +function environment.loadedctxfile(filename) + local fullname = environment.ctxfile(filename) + local i = io.open(fullname) + if i then + local data = i:read('*all') + i:close() + return data + else + environment.showmessage("missing",filename) + return "" + end +end + +environment.setlucpath() diff --git a/tex/context/base/luat-env.tex b/tex/context/base/luat-env.tex new file mode 100644 index 000000000..ec2b942eb --- /dev/null +++ b/tex/context/base/luat-env.tex @@ -0,0 +1,169 @@ +%D \module +%D [ file=luat-env, +%D version=2005.05.26, +%D title=\CONTEXT\ Lua Macros, +%D subtitle=ConTeXt features, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% \writestatus{loading}{Lua Support Macros (environment)} + +% print (lua.id) +% print (lua.version) +% print (lua.startupfile) + +%D Allocation of \LUA\ engines. + +\newcount\luadefcounter + +\ifx\zerocount\undefined \chardef\zerocount=0 \fi +\ifx\plusone \undefined \chardef\plusone =1 \fi + +\def\newlua#1% + {\global\advance\luadefcounter\plusone + \mathchardef#1\luadefcounter} + +%D We use a dedicated instance for \CONTEXT\ core functionality. In +%D \CONTEXT we also use this as callback instance. Instance 0 is +%D the scratch instance. + +\ifx\luastartup\undefined \newcount\luastartup \fi + +\chardef\CTXlua\zerocount \luadefcounter\CTXlua \luastartup\CTXlua + +\def\ctxlua {\directlua\CTXlua} +\def\directctxlua{\directlua\CTXlua} +\def\latectxlua {\latelua \CTXlua} + +%D The simple \type {\lua} command is just a shortcut to the +%D zero instance. Beware, we don't use the 0--9 range for +%D scratch purposes as we do with other registers. First of all +%D we want to avoid the overhead, but mostly, users can just define +%D their own. + +\newlua \luadefault + +\def \lua {\directlua\luadefault} % zero is the main one, and reserved for ctx +\edef\luaversion{\CTXlua{tex.print(_VERSION)}} + +%D We want to define \LUA\ related things in the format but +%D need to reluad code because \LUA\ instances are not dumped +%D into the format. + +\ifx\undefined\normaleveryjob \let\normaleveryjob\everyjob \newtoks\everyjob \fi + +\newtoks\everyloadluacode +\newtoks\everyfinalizeluacode + +\normaleveryjob{\the\everyloadluacode\the\everyfinalizeluacode\the\everyjob} + +\newif\ifproductionrun + +\long\def\startruntimeluacode#1\stopruntimeluacode % only simple code (load +init) + {\ifproductionrun + \global\let\startruntimeluacode\relax + \global\let\stopruntimeluacode \relax + \else + \global\everyloadluacode\expandafter{\the\everyloadluacode#1}% + \fi + #1} % maybe no interference + +\long\def\startruntimectxluacode#1\stopruntimectxluacode + {\startruntimeluacode\ctxlua{#1}\stopruntimeluacode} + +%D Next we load the initialization code. + +\startruntimectxluacode + if not environment then environment = { } end + environment.jobname = "\jobname" % tex.jobname + environment.formatname = "\contextformat" % tex.formatname + environment.initex = \ifproductionrun false \else true \fi % tex.formatname == "" + environment.version = "\contextversion" + dofile(input.find_file(texmf.instance,"luat-env.lua","tex")) +\stopruntimectxluacode + +% 0 = external compilation and loading +% 1 = runtime compilation and embedding + +\chardef\ctxluaembeddingmode \plusone +\chardef\ctxluaexecutionmode \zerocount % private + +% we start at 500, below this, we store predefined data (dumps) + +\newcount\luabytecodecounter \luabytecodecounter=500 + +\startruntimectxluacode + if not lua.bytedata then lua.bytedata = { } end +\stopruntimectxluacode + +%D Handy when we expand: + +\let\stopruntimeluacode \relax +\let\stopruntimectxluacode\relax + +\long\def\lastexpanded{} % todo: elsewhere we use \@@expanded + +\long\def\expanded#1{\long\xdef\lastexpanded{\noexpand#1}\lastexpanded} + +%D More code: + +\def\ctxluabytecode#1% executes an already loaded chunk + {\ctxlua { + do + local str = '' + if lua.bytedata[#1] then + str = " from file " .. lua.bytedata[#1][1] .. " version " .. lua.bytedata[#1][2] + end + if lua.bytecode[#1] then + if environment.initex then + environment.showmessage("executing byte code " .. "#1" .. str) + assert(lua.bytecode[#1])() + else + assert(lua.bytecode[#1])() + lua.bytecode[#1] = nil + end + else + environment.showmessage("invalid byte code " .. "#1" .. str) + end + end + }} + +\def\ctxluabyteload#1#2% registers and compiles chunk + {\global\advance\luabytecodecounter \plusone + \expanded{\startruntimectxluacode + lua.bytedata[\the\luabytecodecounter] = { "#1", "#2" } + \stopruntimectxluacode}% + \ctxlua { + lua.bytedata[\the\luabytecodecounter] = { "#1", "#2" } + lua.bytecode[\the\luabytecodecounter] = environment.luafilechunk("#1")}} + +\def\ctxluafileload#1#2% load a (either not compiled) chunk at runtime + {\doifelsenothing{#2} + {\ctxlua{environment.loadlucfile("#1")}} + {\ctxlua{environment.loadlucfile("#1",#2)}}} + +\def\registerctxluafile#1#2% name version + {\ifcase\ctxluaembeddingmode + \ifproductionrun \else + \global\everyloadluacode\expandafter{\the\everyloadluacode\ctxluafileload{#1}{#2}}% + \fi + \ifcase\ctxluaexecutionmode\or\ctxluafileload{#1}{#2}\fi + \else + \ifproductionrun \else + \ctxluabyteload{#1}{#2}% + \fi + \global\everyloadluacode\expandafter\expandafter\expandafter{\expandafter\the\expandafter\everyloadluacode + \expandafter\ctxluabytecode\expandafter{\the\luabytecodecounter}}% + \ifcase\ctxluaexecutionmode\or\ctxluabytecode{\the\luabytecodecounter}\fi + \fi} + +\ifcase\ctxluaembeddingmode \else \registerctxluafile{luat-env}{1.001} \fi + +\chardef\ctxluaexecutionmode \plusone + +\endinput diff --git a/tex/context/base/luat-exe.lua b/tex/context/base/luat-exe.lua new file mode 100644 index 000000000..dcb28d35f --- /dev/null +++ b/tex/context/base/luat-exe.lua @@ -0,0 +1,68 @@ +-- filename : luat-exe.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-exe'] = 1.001 +if not executer then executer = { } end + +executer.permitted = { } +executer.execute = os.execute + +function executer.register(...) + for k,v in pairs({...}) do + if v == "*" then + table.insert(executer.permitted, ".*") + else + table.insert(executer.permitted, v) + end + end +end + +function executer.finalize() -- todo: os.exec + do + local execute = os.execute + function executer.execute(...) + local t, name, arguments = {...}, "", "" + if #t == 1 then + if type(t[1]) == 'table' then + name, arguments = t[1], table.concat(t," ",2,#t) + else + name, arguments = string.match(t[1],"^(.-)%s+(.+)$") + if not (name and arguments) then + name, arguments = t[1], "" + end + end + else + name, arguments = t[1], table.concat(t," ",2,#t) + end + for _,v in pairs(executer.permitted) do + if string.find(name,v) then + execute(name .. " " .. arguments) + -- print("executed: " .. name .. " " .. arguments) + else + print("not permitted: " .. name .. " " .. arguments) + end + end + end + function executer.finalize() + print("executer is already finalized") + end + function executer.register(name) + print("executer is already finalized") + end + os.execute = executer.execute + end +end + +--~ executer.register('.*') +--~ executer.register('*') +--~ executer.register('dir','ls') +--~ executer.register('dir') + +--~ executer.finalize() +--~ executer.execute('dir',"*.tex") +--~ executer.execute("dir *.tex") +--~ executer.execute("ls *.tex") +--~ os.execute('ls') diff --git a/tex/context/base/luat-ini.lua b/tex/context/base/luat-ini.lua new file mode 100644 index 000000000..022055e7f --- /dev/null +++ b/tex/context/base/luat-ini.lua @@ -0,0 +1,11 @@ +if not modules then modules = { } end modules ['luat-ini'] = { + version = 1.001, + comment = "companion to luat-lib.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

We cannot load anything yet.

+--ldx]]-- diff --git a/tex/context/base/luat-ini.tex b/tex/context/base/luat-ini.tex new file mode 100644 index 000000000..800950baf --- /dev/null +++ b/tex/context/base/luat-ini.tex @@ -0,0 +1,104 @@ +%D \module +%D [ file=luat-ini, +%D version=2005.08.11, +%D title=\CONTEXT\ Lua Macros, +%D subtitle=Initialization, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Lua Support Macros (initialization)} + +\unprotect + +%D We have to load this module in a very early stage. Therefore we +%D cannot rely on support macros being available. + +% \long\def\rescan#1{\expanded{\scantextokens{#1}}} + +%D Loading lua code can be done using \type {startup.lua}. The following +%D method uses the \TEX\ input file locator of kpse. At least we need to +%D use that way of loading when we haven't yet define our own code, which +%D we keep outside the format. We will keep code outside \TEX\ files as +%D much as possible. + +\ifx\setnaturalcatcodes\undefined \let\setnaturalcatcodes\relax \fi +\ifx\obeylualines \undefined \let\obeylualines \relax \fi +\ifx\obeyluatokens \undefined \let\obeyluatokens \relax \fi + +% \def\loadluacode#1#2% instance filename +% {\bgroup +% \everyeof{\noexpand}% hack to make \input nicely expandable +% \setnaturalcatcodes +% \obeylualines +% %message{[Lua Load: #2]}% +% \directlua#1\expandafter{\normalinput#2\space}\relax +% \egroup} + +%D A few more goodies: + +\def\dostartlua#1% + {\begingroup + \obeylualines + \directlua#1\iftrue{\else}\fi} + +\def\dostoplua + {\iffalse{\else}\fi + \endgroup} + +\def\dostartluacode#1% + {\begingroup + \obeylualines + \obeyluatokens + \directlua#1\iftrue{\else}\fi} + +\def\dostopluacode % no unexpanded, else no } seen + {\iffalse{\else}\fi + \endgroup} + +\def\startlua {\dostartlua \zerocount} \def\stoplua {\dostoplua} +\def\startluacode{\dostartluacode\zerocount} \def\stopluacode {\dostopluacode} + +%D Some delayed definitions: + +\ifx\obeylines \undefined \let\obeylines \relax \fi +\ifx\obeyedline \undefined \let\obeyedline \relax \fi +\ifx\obeyspaces \undefined \let\obeyspaces \relax \fi +\ifx\obeyedspace \undefined \let\obeyedspace \relax \fi +\ifx\outputnewlinechar\undefined \let\outputnewlinechar\relax \fi + +\def\obeylualines + {\obeylines \let\obeyedline \outputnewlinechar + \obeyspaces \let\obeyedspace\space} + +\def\obeyluatokens % todo: make this a proper catcode table + {\catcode`\%=11 \catcode`\#=11 + \catcode`\_=11 \catcode`\^=11 + \catcode`\&=11 \catcode`\|=11 + \catcode`\{=11 \catcode`\}=11 + \def\\{\string\\}\def\|{\string\|}\def\-{\string\-}% + \def\({\string\(}\def\){\string\)}\def\{{\string\{}\def\}{\string\}}% + \def\'{\string\'}\def\"{\string\"}% + \def\n{\string\n}\def\r{\string\r}\def\f{\string\f}\def\t{\string\t}% + \def\a{\string\a}\def\b{\string\b}\def\v{\string\v}% + \def\1{\string1}\def\2{\string2}\def\3{\string3}\def\4{\string\4}\def\5{\string\5}% + \def\6{\string6}\def\7{\string7}\def\8{\string8}\def\9{\string\9}\def\0{\string\0}} + +%D We provide an interface for defining instances: + +\def\s!lua{lua} \def\v!code{code} \let\@EA\expandafter + +\def\definelua[#1]% + {\ifcsname#1\s!lua\endcsname\else\expandafter\newlua\csname#1\s!lua\endcsname\fi + \setevalue{\e!start#1\s!lua }{\noexpand\dostartlua \csname#1\s!lua\endcsname}% + \setevalue{\e!start#1\s!lua\v!code}{\noexpand\dostartluacode\csname#1\s!lua\endcsname}% + \setvalue {\e!stop #1\s!lua }{\dostoplua }% + \setvalue {\e!stop #1\s!lua\v!code}{\dostopluacode}} + +\definelua[CTX] + +\protect \endinput diff --git a/tex/context/base/luat-inp.lua b/tex/context/base/luat-inp.lua new file mode 100644 index 000000000..798105718 --- /dev/null +++ b/tex/context/base/luat-inp.lua @@ -0,0 +1,1865 @@ +-- filename : luat-inp.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- This lib is multi-purpose and can be loaded again later on so that +-- additional functionality becomes available. We will split this +-- module in components when we're done with prototyping. + +-- This is the first code I wrote for LuaTeX, so it needs some cleanup. + +-- To be considered: hash key lowercase, first entry in table filename +-- (any case), rest paths (so no need for optimization). Or maybe a +-- separate table that matches lowercase names to mixed case when +-- present. In that case the lower() cases can go away. I will do that +-- only when we run into problems with names. + +if not versions then versions = { } end versions['luat-inp'] = 1.001 +if not environment then environment = { } end +if not file then file = { } end + +if environment.aleph_mode == nil then environment.aleph_mode = true end -- temp hack + +if not input then input = { } end +if not input.suffixes then input.suffixes = { } end +if not input.formats then input.formats = { } end +if not input.aux then input.aux = { } end + +if not input.suffixmap then input.suffixmap = { } end + +if not input.locators then input.locators = { } end -- locate databases +if not input.hashers then input.hashers = { } end -- load databases +if not input.generators then input.generators = { } end -- generate databases +if not input.filters then input.filters = { } end -- conversion filters + +input.locators.notfound = { nil } +input.hashers.notfound = { nil } +input.generators.notfound = { nil } + +input.cacheversion = '1.0.1' +input.banner = nil +input.verbose = false +input.debug = false +input.cnfname = 'texmf.cnf' +input.lsrname = 'ls-R' +input.luasuffix = '.tma' +input.lucsuffix = '.tmc' + +-- we use a cleaned up list / format=any is a wildcard, as is *name + +input.formats['afm'] = 'AFMFONTS' input.suffixes['afm'] = { 'afm' } +input.formats['enc'] = 'ENCFONTS' input.suffixes['enc'] = { 'enc' } +input.formats['fmt'] = 'TEXFORMATS' input.suffixes['fmt'] = { 'fmt' } +input.formats['map'] = 'TEXFONTMAPS' input.suffixes['map'] = { 'map' } +input.formats['mp'] = 'MPINPUTS' input.suffixes['mp'] = { 'mp' } +input.formats['ocp'] = 'OCPINPUTS' input.suffixes['ocp'] = { 'ocp' } +input.formats['ofm'] = 'OFMFONTS' input.suffixes['ofm'] = { 'ofm', 'tfm' } +input.formats['otf'] = 'OPENTYPEFONTS' input.suffixes['otf'] = { 'otf' } -- 'ttf' +input.formats['opl'] = 'OPLFONTS' input.suffixes['opl'] = { 'opl' } +input.formats['otp'] = 'OTPINPUTS' input.suffixes['otp'] = { 'otp' } +input.formats['ovf'] = 'OVFFONTS' input.suffixes['ovf'] = { 'ovf', 'vf' } +input.formats['ovp'] = 'OVPFONTS' input.suffixes['ovp'] = { 'ovp' } +input.formats['tex'] = 'TEXINPUTS' input.suffixes['tex'] = { 'tex' } +input.formats['tfm'] = 'TFMFONTS' input.suffixes['tfm'] = { 'tfm' } +input.formats['ttf'] = 'TTFONTS' input.suffixes['ttf'] = { 'ttf', 'ttc' } +input.formats['pfb'] = 'T1FONTS' input.suffixes['pfb'] = { 'pfb', 'pfa' } +input.formats['vf'] = 'VFFONTS' input.suffixes['vf'] = { 'vf' } + +input.formats['fea'] = 'FONTFEATURES' input.suffixes['fea'] = { 'fea' } + +input.formats ['texmfscripts'] = 'TEXMFSCRIPTS' -- new +input.suffixes['texmfscripts'] = { 'rb', 'pl', 'py' } -- 'lua' + +input.formats ['lua'] = 'LUAINPUTS' -- new +input.suffixes['lua'] = { 'lua', 'luc', 'tma', 'tmc' } + +-- here we catch a few new thingies + +function input.checkconfigdata(instance) + if input.env(instance,"LUAINPUTS") == "" then + instance.environment["LUAINPUTS"] = ".;$TEXINPUTS;$TEXMFSCRIPTS" + end + if input.env(instance,"FONTFEATURES") == "" then + instance.environment["FONTFEATURES"] = ".;$OPENTYPEFONTS;$TTFONTS;$T1FONTS;$AFMFONTS" + end +end + +-- backward compatible ones + +input.alternatives = { } + +input.alternatives['map files'] = 'map' +input.alternatives['enc files'] = 'enc' +input.alternatives['opentype fonts'] = 'otf' +input.alternatives['truetype fonts'] = 'ttf' +input.alternatives['truetype collections'] = 'ttc' +input.alternatives['type1 fonts'] = 'pfb' + +-- obscure ones + +input.formats ['misc fonts'] = '' +input.suffixes['misc fonts'] = { } + +input.formats ['sfd'] = 'SFDFONTS' +input.suffixes ['sfd'] = { 'sfd' } +input.alternatives['subfont definition files'] = 'sfd' + +function input.reset() + + local instance = { } + + instance.rootpath = '' + instance.treepath = '' + instance.progname = environment.progname or 'context' + instance.engine = environment.engine or 'luatex' + instance.format = '' + instance.environment = { } + instance.variables = { } + instance.expansions = { } + instance.files = { } + instance.configuration = { } + instance.found = { } + instance.foundintrees = { } + instance.kpsevars = { } + instance.hashes = { } + instance.cnffiles = { } + instance.lists = { } + instance.remember = true + instance.diskcache = true + instance.renewcache = false + instance.scandisk = true + instance.cachepath = nil + instance.loaderror = false + instance.smallcache = false + instance.savelists = true + instance.cleanuppaths = true + instance.allresults = false + instance.pattern = nil -- lists + instance.kpseonly = false -- lists + instance.cachefile = 'tmftools' + instance.loadtime = 0 + instance.starttime = 0 + instance.stoptime = 0 + instance.validfile = function(path,name) return true end + instance.data = { } -- only for loading + instance.sortdata = false + instance.force_suffixes = true + instance.dummy_path_expr = "^!*unset/*$" + instance.fakepaths = { } + instance.lsrmode = false + + if os.env then + -- store once, freeze and faster + for k,v in pairs(os.env) do + instance.environment[k] = input.bare_variable(v) + end + else + -- we will access os.env frequently + for k,v in pairs({'HOME','TEXMF','TEXMFCNF','SELFAUTOPARENT'}) do + local e = os.getenv(v) + if e then + -- input.report("setting",v,"to",input.bare_variable(e)) + instance.environment[v] = input.bare_variable(e) + end + end + end + + -- cross referencing + + for k, v in pairs(input.suffixes) do + for _, vv in pairs(v) do + if vv then + input.suffixmap[vv] = k + end + end + end + + return instance + +end + +function input.bare_variable(str) + -- return string.gsub(string.gsub(string.gsub(str,"%s+$",""),'^"(.+)"$',"%1"),"^'(.+)'$","%1") + return str:gsub("\s*([\"\']?)(.+)%1\s*", "%2") +end + +if texio then + input.log = texio.write_nl +else + input.log = print +end + +function input.simple_logger(kind, name) + if name and name ~= "" then + if input.banner then + input.log(input.banner..kind..": "..name) + else + input.log("<<"..kind..": "..name..">>") + end + else + if input.banner then + input.log(input.banner..kind..": no name") + else + input.log("<<"..kind..": no name>>") + end + end +end + +function input.dummy_logger() +end + +function input.settrace(n) + input.trace = tonumber(n or 0) + if input.trace > 0 then + input.logger = input.simple_logger + input.verbose = true + else + input.logger = function() end + end +end + +function input.report(...) -- inefficient + if input.verbose then + if input.banner then + input.log(input.banner .. table.concat({...},' ')) + elseif input.logmode() == 'xml' then + input.log(""..table.concat({...},' ').."") + else + input.log("<<"..table.concat({...},' ')..">>") + end + end +end + +function input.reportlines(str) + if type(str) == "string" then + str = str:split("\n") + end + for _,v in pairs(str) do input.report(v) end +end + +input.settrace(os.getenv("MTX.INPUT.TRACE") or os.getenv("MTX_INPUT_TRACE") or input.trace or 0) + +-- These functions can be used to test the performance, especially +-- loading the database files. + +function input.start_timing(instance) + if instance then + instance.starttime = os.clock() + if not instance.loadtime then + instance.loadtime = 0 + end + end +end + +function input.stop_timing(instance, report) + if instance and instance.starttime then + instance.stoptime = os.clock() + local loadtime = instance.stoptime - instance.starttime + instance.loadtime = instance.loadtime + loadtime + if report then + input.report('load time', string.format("%0.3f",loadtime)) + end + return loadtime + else + return 0 + end +end + +input.stoptiming = input.stop_timing +input.starttiming = input.start_timing + +function input.elapsedtime(instance) + return string.format("%0.3f",instance.loadtime or 0) +end + +function input.report_loadtime(instance) + if instance then + input.report('total load time', input.elapsedtime(instance)) + end +end + +function input.loadtime(instance) + tex.print(input.elapsedtime(instance)) +end + +function input.env(instance,key) + return instance.environment[key] or input.osenv(instance,key) +end + +function input.osenv(instance,key) + if instance.environment[key] == nil then + local e = os.getenv(key) + if e == nil then + instance.environment[key] = "" -- false + else + instance.environment[key] = input.bare_variable(e) + end + end + return instance.environment[key] or "" +end + +-- we follow a rather traditional approach: +-- +-- (1) texmf.cnf given in TEXMFCNF +-- (2) texmf.cnf searched in TEXMF/web2c +-- +-- for the moment we don't expect a configuration file in a zip + +function input.identify_cnf(instance) + if #instance.cnffiles == 0 then + if instance.treepath ~= "" then + if instance.rootpath ~= "" then + local t = instance.treepath:splitchr(',') + for k,v in ipairs(t) do + t[k] = file.join(instance.rootpath,v) + end + instance.treepath = table.concat(t,',') + end + local t = instance.treepath:splitchr(',') + instance.environment['TEXMF'] = input.bare_variable(instance.treepath) + instance.environment['TEXMFCNF'] = file.join(t[1] or '.','texmf/web2c') + end + if instance.rootpath ~= "" then + instance.environment['TEXMFCNF'] = file.join(instance.rootpath,'texmf/web2c') + instance.environment['SELFAUTOPARENT'] = instance.rootpath + end + if input.env(instance,'TEXMFCNF') ~= "" then + local t = input.split_path(input.env(instance,'TEXMFCNF')) + t = input.aux.expanded_path(instance,t) + input.aux.expand_vars(instance,t) + for _,v in ipairs(t) do + table.insert(instance.cnffiles,file.join(v,input.cnfname)) + end + elseif input.env(instance,'SELFAUTOPARENT') == '.' then + table.insert(instance.cnffiles,file.join('.',input.cnfname)) + else + for _,v in ipairs({'texmf-local','texmf'}) do + table.insert(instance.cnffiles,file.join(input.env(instance,'SELFAUTOPARENT'),v,'web2c',input.cnfname)) + end + end + end +end + +function input.load_cnf(instance) + -- instance.cnffiles contain complete names now ! + if #instance.cnffiles == 0 then + input.report("no cnf files found (TEXMFCNF may not be set/known)") + else + instance.rootpath = instance.cnffiles[1] + for k,fname in ipairs(instance.cnffiles) do + instance.cnffiles[k] = fname:gsub("\\",'/') + end + for i = 1, 3 do + instance.rootpath = file.dirname(instance.rootpath) + end + if instance.lsrmode then + input.loadconfigdata(instance,instance.cnffiles) + elseif instance.diskcache and not instance.renewcache then + input.loadconfig(instance,instance.cnffiles) + if instance.loaderror then + input.loadconfigdata(instance,instance.cnffiles) + input.saveconfig(instance) + end + else + input.loadconfigdata(instance,instance.cnffiles) + if instance.renewcache then + input.saveconfig(instance) + end + end + input.aux.collapse_cnf_data(instance) + end + input.checkconfigdata(instance) +end + +function input.loadconfigdata(instance) + for _, fname in pairs(instance.cnffiles) do + input.aux.load_cnf(instance,fname) + end +end + +if os.env then + function input.aux.collapse_cnf_data(instance) + for _,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if not instance.variables[k] then + if instance.environment[k] then + instance.variables[k] = instance.environment[k] + else + instance.kpsevars[k] = true + instance.variables[k] = input.bare_variable(v) + end + end + end + end + end +else + function input.aux.collapse_cnf_data(instance) + for _,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if not instance.variables[k] then + local e = os.getenv(k) + if e then + instance.environment[k] = input.bare_variable(e) + instance.variables[k] = instance.environment[k] + else + instance.variables[k] = input.bare_variable(v) + instance.kpsevars[k] = true + end + end + end + end + end +end + +function input.aux.load_cnf(instance,fname) + fname = input.clean_path(fname) + local lname = fname:gsub("%.%a+$",input.luasuffix) + local f = io.open(lname) + if f then + f:close() + input.aux.load_data(instance,file.dirname(lname),'configuration',file.basename(lname)) + else + f = io.open(fname) + if f then + input.report("loading", fname) + local line, data, n, k, v + local dname = file.dirname(fname) + if not instance.configuration[dname] then + instance.configuration[dname] = { } + end + local data = instance.configuration[dname] + while true do + line = f:read() + if line then + while true do -- join lines + line, n = line:gsub("\\%s*$", "") + if n > 0 then + line = line .. f:read() + else + break + end + end + if not line:find("^[%%#]") then + k, v = (line:gsub("%s*%%.*$","")):match("%s*(.-)%s*=%s*(.-)%s*$") + if k and v and not data[k] then + data[k] = (v:gsub("[%%#].*",'')):gsub("~", "$HOME") + instance.kpsevars[k] = true + end + end + else + break + end + end + f:close() + else + input.report("skipping", fname) + end + end +end + +-- database loading + +function input.load_hash(instance) + input.locatelists(instance) + if instance.lsrmode then + input.loadlists(instance) + elseif instance.diskcache and not instance.renewcache then + input.loadfiles(instance) + if instance.loaderror then + input.loadlists(instance) + input.savefiles(instance) + end + else + input.loadlists(instance) + if instance.renewcache then + input.savefiles(instance) + end + end +end + +function input.aux.append_hash(instance,type,tag,name) + input.logger("= hash append",tag) + table.insert(instance.hashes, { ['type']=type, ['tag']=tag, ['name']=name } ) +end + +function input.aux.prepend_hash(instance,type,tag,name) + input.logger("= hash prepend",tag) + table.insert(instance.hashes, 1, { ['type']=type, ['tag']=tag, ['name']=name } ) +end + +function input.aux.extend_texmf_var(instance,specification) -- crap + if instance.environment['TEXMF'] then + input.report("extending environment variable TEXMF with", specification) + instance.environment['TEXMF'] = instance.environment['TEXMF']:gsub("^%{", function() + return "{" .. specification .. "," + end) + elseif instance.variables['TEXMF'] then + input.report("extending configuration variable TEXMF with", specification) + instance.variables['TEXMF'] = instance.variables['TEXMF']:gsub("^%{", function() + return "{" .. specification .. "," + end) + else + input.report("setting configuration variable TEXMF to", specification) + instance.variables['TEXMF'] = "{" .. specification .. "}" + end + if instance.variables['TEXMF']:find("%,") and not instance.variables['TEXMF']:find("^%{") then + input.report("adding {} to complex TEXMF variable, best do that yourself") + instance.variables['TEXMF'] = "{" .. instance.variables['TEXMF'] .. "}" + end + input.expand_variables(instance) +end + +-- locators + +function input.locatelists(instance) + for _, path in pairs(input.simplified_list(input.expansion(instance,'TEXMF'))) do + input.report("locating list of",path) + input.locatedatabase(instance,input.normalize_name(path)) + end +end + +function input.locatedatabase(instance,specification) + return input.methodhandler('locators', instance, specification) +end + +function input.locators.tex(instance,specification) + if specification and specification ~= '' then + local files = { + file.join(specification,'files'..input.lucsuffix), + file.join(specification,'files'..input.luasuffix), + file.join(specification,input.lsrname) + } + for _, filename in pairs(files) do + local f = io.open(filename) + if f then + input.logger('! tex locator', specification..' found') + input.aux.append_hash(instance,'file',specification,filename) + f:close() + return + end + end + input.logger('? tex locator', specification..' not found') + end +end + +-- hashers + +function input.hashdatabase(instance,tag,name) + return input.methodhandler('hashers',instance,tag,name) +end + +function input.loadfiles(instance) + instance.loaderror = false + instance.files = { } + if not instance.renewcache then + for _, hash in ipairs(instance.hashes) do + input.hashdatabase(instance,hash.tag,hash.name) + if instance.loaderror then break end + end + end +end + +function input.hashers.tex(instance,tag,name) + input.aux.load_data(instance,tag,'files') +end + +-- generators: + +function input.loadlists(instance) + for _, hash in ipairs(instance.hashes) do + input.generatedatabase(instance,hash.tag) + end +end + +function input.generatedatabase(instance,specification) + return input.methodhandler('generators', instance, specification) +end + +function input.generators.tex(instance,specification) + local tag = specification + if not instance.lsrmode and lfs and lfs.dir then + input.report("scanning path",specification) + instance.files[tag] = { } + local files = instance.files[tag] + local n, m = 0, 0 + local spec = specification .. '/' + local attributes = lfs.attributes + local directory = lfs.dir + local small = instance.smallcache + local function action(path) + local mode, full + if path then + full = spec .. path .. '/' + else + full = spec + end + for name in directory(full) do + if name == '.' or name == ".." then + -- skip + else + mode = attributes(full..name,'mode') + if mode == "directory" then + m = m + 1 + if path then + action(path..'/'..name) + else + action(name) + end + elseif path and mode == 'file' then + n = n + 1 + local f = files[name] + if f then + if not small then + if type(f) == 'string' then + files[name] = { f, path } + else + f[#f+1] = path + end + end + else + files[name] = path + end + end + end + end + end + action() + input.report(n,"files found on",m,"directories") + else + local fullname = file.join(specification,input.lsrname) + local path = '.' + local f = io.open(fullname) + if f then + instance.files[tag] = { } + local files = instance.files[tag] + local small = instance.smallcache + input.report("loading lsr file",fullname) + -- for line in f:lines() do -- much slower then the next one + for line in (f:read("*a")):gmatch("(.-)\n") do + if line:find("^[%a%d]") then + local fl = files[line] + if fl then + if not small then + if type(fl) == 'string' then + files[line] = { fl, path } -- table + else + fl[#fl+1] = path + end + end + else + files[line] = path -- string + end + else + path = line:match("%.%/(.-)%:$") or path -- match could be nil due to empty line + end + end + f:close() + end + end +end + +-- savers, todo + +function input.savefiles(instance) + input.aux.save_data(instance, 'files', function(k,v) + return instance.validfile(k,v) -- path, name + end) +end + +-- A config (optionally) has the paths split in tables. Internally +-- we join them and split them after the expansion has taken place. This +-- is more convenient. + +function input.splitconfig(instance) + for i,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if type(v) == 'string' then + local t = file.split_path(v) + if #t > 1 then + c[k] = t + end + end + end + end +end +function input.joinconfig(instance) + for i,c in pairs(instance.configuration) do + for k,v in pairs(c) do + if type(v) == 'table' then + c[k] = file.join_path(v) + end + end + end +end +function input.split_path(str) + if type(str) == 'table' then + return str + else + return file.split_path(str) + end +end +function input.join_path(str) + if type(str) == 'table' then + return file.join_path(str) + else + return str + end +end +function input.splitexpansions(instance) + for k,v in pairs(instance.expansions) do + local t = file.split_path(v) + if #t > 1 then + instance.expansions[k] = t + end + end +end +function input.splitexpansions(instance) + for k,v in pairs(instance.expansions) do + local t, h = { }, { } + for _,vv in pairs(file.split_path(v)) do + if vv ~= "" and not h[vv] then + t[#t+1] = vv + h[vv] = true + end + end + if #t > 1 then + instance.expansions[k] = t + else + instance.expansions[k] = t[1] + end + end +end + +-- end of split/join code + +function input.saveconfig(instance) + input.splitconfig(instance) + input.aux.save_data(instance, 'configuration', nil) + input.joinconfig(instance) +end + +input.configbanner = [[ +-- This is a Luatex configuration file created by 'luatools.lua' or +-- 'luatex.exe' directly. For comment, suggestions and questions you can +-- contact the ConTeXt Development Team. This configuration file is +-- not copyrighted. [HH & TH] +]] + +function input.aux.save_data(instance, dataname, check) + for cachename, files in pairs(instance[dataname]) do + local name = file.join(cachename,dataname) + local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix + local f = io.open(luaname,'w') + if f then + input.report("saving " .. dataname .. " in", luaname) + f:write(input.configbanner) + f:write("\n") + f:write("if not texmf then texmf = { } end\n") + f:write("if not texmf.data then texmf.data = { } end\n") + f:write("\n") + f:write("texmf.data.type = '" .. dataname .. "'\n") + f:write("texmf.data.version = '" .. input.cacheversion .. "'\n") + f:write("texmf.data.date = '" .. os.date("%Y-%m-%d") .. "'\n") + f:write("texmf.data.time = '" .. os.date("%H:%M:%S") .. "'\n") + f:write('texmf.data.content = {\n') + local function dump(k,v) + if not check or check(v,k) then -- path, name + if type(v) == 'string' then + f:write("\t['" .. k .. "'] = '" .. v .. "',\n") + elseif #v == 1 then + f:write("\t['" .. k .. "'] = '" .. v[1] .. "',\n") + else + f:write("\t['" .. k .. "'] = {'" .. table.concat(v,"','").. "'},\n") + end + end + end + if instance.sortdata then + for _, k in pairs(table.sortedkeys(files)) do + dump(k,files[k]) + end + else + for k, v in pairs(files) do + dump(k,v) + end + end + f:write('}\n') + f:close() + input.report("compiling " .. dataname .. " to", lucname) + if not utils.lua.compile(luaname,lucname) then + input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname) + os.remove(lucname) + end + else + input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix) + end + end +end + +function input.loadconfig(instance) + instance.configuration, instance.loaderror = { }, false + if not instance.renewcache then + for _, cnf in pairs(instance.cnffiles) do + input.aux.load_data(instance,file.dirname(cnf),'configuration') + if instance.loaderror then break end + end + end + input.joinconfig(instance) +end + +if not texmf then texmf = {} end +if not texmf.data then texmf.data = {} end + +function input.aux.load_data(instance,pathname,dataname,filename) + if not filename or (filename == "") then + filename = dataname .. input.lucsuffix + end + local blob = loadfile(file.join(pathname,filename)) + if not blob then + filename = dataname .. input.luasuffix + blob = loadfile(file.join(pathname,filename)) + end + if blob then + blob() + if (texmf.data.type == dataname) and (texmf.data.version == input.cacheversion) and texmf.data.content then + input.report("loading",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = texmf.data.content + else + input.report("skipping",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = { } + instance.loaderror = true + end + end + texmf.data.content = { } +end + +function input.expand_variables(instance) + instance.expansions = { } + if instance.engine ~= "" then instance.environment['engine'] = instance.engine end + if instance.progname ~= "" then instance.environment['progname'] = instance.engine end + for k,v in pairs(instance.environment) do + local a, b = k:match("^(%a+)%_(.*)%s*$") + if a and b then + instance.expansions[a..'.'..b] = v + else + instance.expansions[k] = v + end + end + for k,v in pairs(instance.environment) do -- move environment to expansions + if not instance.expansions[k] then instance.expansions[k] = v end + end + for k,v in pairs(instance.variables) do -- move variables to expansions + if not instance.expansions[k] then instance.expansions[k] = v end + end + while true do + local busy = false + for k,v in pairs(instance.expansions) do + local s, n = v:gsub("%$([%a%d%_%-]+)", function(a) + busy = true + return instance.expansions[a] or input.env(instance,a) + end) + local s, m = s:gsub("%$%{([%a%d%_%-]+)%}", function(a) + busy = true + return instance.expansions[a] or input.env(instance,a) + end) + if n > 0 or m > 0 then + instance.expansions[k]= s + end + end + if not busy then break end + end + for k,v in pairs(instance.expansions) do + instance.expansions[k] = v:gsub("\\", '/') + end + input.splitexpansions(instance) +end + +function input.aux.expand_vars(instance,lst) -- simple vars + for k,v in pairs(lst) do + lst[k] = v:gsub("%$([%a%d%_%-]+)", function(a) + return instance.variables[a] or input.env(instance,a) + end) + end +end + +function input.aux.expanded_var(instance,var) -- simple vars + return var:gsub("%$([%a%d%_%-]+)", function(a) + return instance.variables[a] or input.env(instance,a) + end) +end + +function input.aux.entry(instance,entries,name) + if name and (name ~= "") then + name = name:gsub('%$','') + local result = entries[name..'.'..instance.progname] or entries[name] + if result then + return result + else + result = input.env(instance,name) + if result then + instance.variables[name] = result + input.expand_variables(instance) + return instance.expansions[name] or "" + end + end + end + return "" +end +function input.variable(instance,name) + return input.aux.entry(instance,instance.variables,name) +end +function input.expansion(instance,name) + return input.aux.entry(instance,instance.expansions,name) +end + +function input.aux.is_entry(instance,entries,name) + if name and name ~= "" then + name = name:gsub('%$','') + return (entries[name..'.'..instance.progname] or entries[name]) ~= nil + else + return false + end +end + +function input.is_variable(instance,name) + return input.aux.is_entry(instance,instance.variables,name) +end +function input.is_expansion(instance,name) + return input.aux.is_entry(instance,instance.expansions,name) +end + +function input.aux.list(instance,list) + local pat = string.upper(instance.pattern or "","") + for _,key in pairs(table.sortedkeys(list)) do + if (instance.pattern=="") or string.find(key:upper(),pat) then + if instance.kpseonly then + if instance.kpsevars[key] then + print(key .. "=" .. input.aux.tabstr(list[key])) + end + elseif instance.kpsevars[key] then + print('K ' .. key .. "=" .. input.aux.tabstr(list[key])) + else + print('E ' .. key .. "=" .. input.aux.tabstr(list[key])) + end + end + end +end + +function input.list_variables(instance) + input.aux.list(instance,instance.variables) +end +function input.list_expansions(instance) + input.aux.list(instance,instance.expansions) +end + +function input.list_configurations(instance) + for _,key in pairs(table.sortedkeys(instance.kpsevars)) do + if not instance.pattern or (instance.pattern=="") or key:find(instance.pattern) then + print(key.."\n") + for i,c in pairs(instance.configuration) do + local str = c[key] + if str then + print("\t" .. i .. "\t\t" .. input.aux.tabstr(str)) + end + end + print() + end + end +end + +function input.aux.tabstr(str) + if type(str) == 'table' then + return table.concat(str," | ") + else + return str + end +end + +function input.simplified_list(str) + if type(str) == 'table' then + return str -- troubles ; ipv , in texmf + elseif str == '' then + return { } + else + local t = { } + for _,v in ipairs(string.splitchr(str:gsub("^\{(.+)\}$","%1"),",")) do + t[#t+1] = (v:gsub("^[%!]*(.+)[%/\\]*$","%1")) + end + return t + end +end + +function input.unexpanded_path_list(instance,str) + local pth = input.variable(instance,str) + local lst = input.split_path(pth) + return input.aux.expanded_path(instance,lst) +end +function input.unexpanded_path(instance,str) + return file.join_path(input.unexpanded_path_list(instance,str)) +end + +function input.expanded_path_list(instance,str) + if not str then + return { } + elseif instance.savelists then + -- engine+progname hash + str = str:gsub("%$","") + if not instance.lists[str] then -- cached + local lst = input.split_path(input.expansion(instance,str)) + instance.lists[str] = input.aux.expanded_path(instance,lst) + end + return instance.lists[str] + else + local lst = input.split_path(input.expansion(instance,str)) + return input.aux.expanded_path(instance,lst) + end +end +function input.expand_path(instance,str) + return file.join_path(input.expanded_path_list(instance,str)) +end + +--~ function input.first_writable_path(instance,name) +--~ for _,v in pairs(input.expanded_path_list(instance,name)) do +--~ if file.is_writable(file.join(v,'luatex-cache.tmp')) then +--~ return v +--~ end +--~ end +--~ return "." +--~ end + +function input.expanded_path_list_from_var(instance,str) -- brrr + local tmp = input.var_of_format_or_suffix(str:gsub("%$","")) + if tmp ~= "" then + return input.expanded_path_list(instance,str) + else + return input.expanded_path_list(instance,tmp) + end +end +function input.expand_path_from_var(instance,str) + return file.join_path(input.expanded_path_list_from_var(instance,str)) +end + +function input.format_of_var(str) + return input.formats[str] or input.formats[input.alternatives[str]] or '' +end +function input.format_of_suffix(str) + return input.suffixmap[file.extname(str)] or 'tex' +end + +function input.variable_of_format(str) + return input.formats[str] or input.formats[input.alternatives[str]] or '' +end + +function input.var_of_format_or_suffix(str) + local v = input.formats[str] + if v then + return v + end + v = input.formats[input.alternatives[str]] + if v then + return v + end + v = input.suffixmap[file.extname(str)] + if v then + return input.formats[isf] + end + return '' +end + +function input.expand_braces(instance,str) -- output variable and brace expansion of STRING + local ori = input.variable(instance,str) + local pth = input.aux.expanded_path(instance,input.split_path(ori)) + return file.join_path(pth) +end + +-- {a,b,c,d} +-- a,b,c/{p,q,r},d +-- a,b,c/{p,q,r}/d/{x,y,z}// +-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r} +-- a,b,c/{p,q/{x,y,z},r},d/{p,q,r} + +function input.aux.expanded_path(instance,pathlist) + -- a previous version fed back into pathlist + local i, n, oldlist, newlist, ok = 0, 0, { }, { }, false + for _,v in ipairs(pathlist) do + if v:find("[{}]") then + ok = true + break + end + end + if ok then + for _,v in ipairs(pathlist) do + oldlist[#oldlist+1] = (v:gsub("([\{\}])", function(p) + if p == "{" then + i = i + 1 + if i > n then n = i end + return "<" .. (i-1) .. ">" + else + i = i - 1 + return "" + end + end)) + end + for i=1,n do + while true do + local more = false + local pattern = "^(.-)<"..(n-i)..">(.-)(.-)$" + local t = { } + for _,v in ipairs(oldlist) do + local pre, mid, post = v:match(pattern) + if pre and mid and post then + more = true + -- for _,vv in ipairs(mid:splitchr(',')) do + for vv in string.gmatch(mid..',',"(.-),") do + if vv == '.' then + t[#t+1] = pre..post + else + t[#t+1] = pre..vv..post + end + end + else + t[#t+1] = v + end + end + oldlist = t + if not more then break end + end + end + for _,v in pairs(oldlist) do + v = file.collapse_path(v) + if v ~= "" and not v:find(instance.dummy_path_expr) then newlist[#newlist+1] = v end + end + else + for _,v in pairs(pathlist) do + -- for _,vv in pairs(v:split(",")) do + for vv in string.gmatch(v..',',"(.-),") do + vv = file.collapse_path(v) + if vv ~= "" then newlist[#newlist+1] = vv end + end + end + end + return newlist +end + +--~ function input.is_readable(name) -- brrr, get rid of this +--~ return name:find("^zip##") or file.is_readable(name) +--~ end + +input.is_readable = { } + +function input.aux.is_readable(readable, name) + if input.trace > 2 then + if readable then + input.logger("+ readable", name) + else + input.logger("- readable", name) + end + end + return readable +end + +function input.is_readable.file(name) + -- return input.aux.is_readable(file.is_readable(name), name) + return input.aux.is_readable(input.aux.is_file(name), name) +end + +input.is_readable.tex = input.is_readable.file + +-- name +-- name/name + +function input.aux.collect_files(instance,names) + local filelist = nil + for _, fname in pairs(names) do + if fname then + if input.trace > 2 then + input.logger("? blobpath asked",fname) + end + local bname = file.basename(fname) + local dname = file.dirname(fname) + if dname == "" or dname:find("^%.") then + dname = false + else + dname = "/" .. dname .. "$" + end + for _, hash in pairs(instance.hashes) do + local blobpath = hash.tag + if blobpath and instance.files[blobpath] then + if input.trace > 2 then + input.logger('? blobpath do',blobpath .. " (" .. bname ..")") + end + local blobfile = instance.files[blobpath][bname] + if blobfile then + if type(blobfile) == 'string' then + if not dname or blobfile:find(dname) then + if not filelist then filelist = { } end + -- input.logger('= collected', blobpath.." | "..blobfile.." | "..bname) + filelist[#filelist+1] = file.join(blobpath,blobfile,bname) + end + else + for _, vv in pairs(blobfile) do + if not dname or vv:find(dname) then + if not filelist then filelist = { } end + filelist[#filelist+1] = file.join(blobpath,vv,bname) + end + end + end + end + elseif input.trace > 1 then + input.logger('! blobpath no',blobpath .. " (" .. bname ..")" ) + end + end + end + end + return filelist +end + +function input.suffix_of_format(str) + if input.suffixes[str] then + return input.suffixes[str][1] + else + return "" + end +end + +function input.suffixes_of_format(str) + if input.suffixes[str] then + return input.suffixes[str] + else + return {} + end +end + +function input.aux.qualified_path(filename) -- make platform dependent / not good yet + return + filename:find("^%.+/") or + filename:find("^/") or + filename:find("^%a+%:") or + filename:find("^%a+##") +end + +function input.normalize_name(original) + -- internally we use type##spec##subspec ; this hackery slightly slows down searching + local str = original or "" + str = str:gsub("::", "##") -- :: -> ## + str = str:gsub("^(%a+)://" ,"%1##") -- zip:// -> zip## + str = str:gsub("(.+)##(.+)##/(.+)","%1##%2##%3") -- ##/spec -> ##spec + if (input.trace>1) and (original ~= str) then + input.logger('= normalizer',original.." -> "..str) + end + return str +end + +-- split the next one up, better for jit + +function input.aux.register_in_trees(instance,name) + if not name:find("^%.") then + instance.foundintrees[name] = (instance.foundintrees[name] or 0) + 1 -- maybe only one + end +end + +function input.aux.find_file(instance,filename) -- todo : plugin (scanners, checkers etc) + local result = { } + local stamp = nil + filename = input.normalize_name(filename) + filename = file.collapse_path(filename:gsub("\\","/")) + -- speed up / beware: format problem + if instance.remember then + stamp = filename .. "--" .. instance.engine .. "--" .. instance.progname .. "--" .. instance.format + if instance.found[stamp] then + input.logger('! remembered', filename) + return instance.found[stamp] + end + end + if filename:find('%*') then + input.logger('! wildcard', filename) + result = input.find_wildcard_files(instance,filename) + elseif input.aux.qualified_path(filename) then + if input.is_readable.file(filename) then + input.logger('! qualified', filename) + result = { filename } + else + local forcedname, ok = "", false + if file.extname(filename) == "" then + if instance.format == "" then + forcedname = filename .. ".tex" + if input.is_readable.file(forcedname) then + input.logger('! no suffix, forcing standard filetype tex') + result, ok = { forcedname }, true + end + else + for _, s in pairs(input.suffixes_of_format(instance.format)) do + forcedname = filename .. "." .. s + if input.is_readable.file(forcedname) then + input.logger('! no suffix, forcing format filetype', s) + result, ok = { forcedname }, true + break + end + end + end + end + if not ok then + input.logger('? qualified', filename) + end + end + else + -- search spec + local filetype, extra, done, wantedfiles, ext = '', nil, false, { }, file.extname(filename) + if ext == "" then + if not instance.force_suffixes then + table.insert(wantedfiles, filename) + end + else + table.insert(wantedfiles, filename) + end + if instance.format == "" then + if ext == "" then + local forcedname = filename .. '.tex' + table.insert(wantedfiles, forcedname) + filetype = input.format_of_suffix(forcedname) + input.logger('! forcing filetype',filetype) + else + filetype = input.format_of_suffix(filename) + input.logger('! using suffix based filetype',filetype) + end + else + if ext == "" then + for _, s in pairs(input.suffixes_of_format(instance.format)) do + table.insert(wantedfiles, filename .. "." .. s) + end + end + filetype = instance.format + input.logger('! using given filetype',filetype) + end + local typespec = input.variable_of_format(filetype) + local pathlist = input.expanded_path_list(instance,typespec) + if not pathlist or #pathlist == 0 then + -- no pathlist, access check only + if input.trace > 2 then + input.logger('? filename',filename) + input.logger('? filetype',filetype or '?') + input.logger('? wanted files',table.concat(wantedfiles," | ")) + end + for _, fname in pairs(wantedfiles) do + if fname and input.is_readable.file(fname) then + filename, done = fname, true + table.insert(result, file.join('.',fname)) + break + end + end + -- this is actually 'other text files' or 'any' or 'whatever' + local filelist = input.aux.collect_files(instance,wantedfiles) + filename = filelist and filelist[1] + if filename then + table.insert(result, filename) + done = true + end + else + -- list search + local filelist = input.aux.collect_files(instance,wantedfiles) + local doscan, recurse + if input.trace > 2 then + input.logger('? filename',filename) + if pathlist then input.logger('? path list',table.concat(pathlist," | ")) end + if filelist then input.logger('? file list',table.concat(filelist," | ")) end + end + -- a bit messy ... esp the doscan setting here + for _, path in pairs(pathlist) do + if path:find("^!!") then doscan = false else doscan = true end + if path:find("//$") then recurse = true else recurse = false end + local pathname = path:gsub("^!+", '') + done = false + -- using file list + if filelist and not (done and not instance.allresults) and recurse then + -- compare list entries with permitted pattern + pathname = pathname:gsub("([%-%.])","%%%1") -- this also influences + pathname = pathname:gsub("/+$", '/.*') -- later usage of pathname + pathname = pathname:gsub("//", '/.-/') + expr = "^" .. pathname + -- input.debug('?',expr) + for _, f in pairs(filelist) do + if f:find(expr) then + -- input.debug('T',' '..f) + if input.trace > 2 then + input.logger('= found in hash',f) + end + table.insert(result,f) + input.aux.register_in_trees(instance,f) -- for tracing used files + done = true + if not instance.allresults then break end + else + -- input.debug('F',' '..f) + end + end + end + if not done and doscan then + -- check if on disk / unchecked / does not work at all + if input.method_is_file(pathname) then -- ? + local pname = pathname:gsub("%.%*$",'') + if not pname:find("%*") then + local ppname = pname:gsub("/+$","") + if input.aux.can_be_dir(instance,ppname) then + for _, w in pairs(wantedfiles) do + local fname = file.join(ppname,w) + if input.is_readable.file(fname) then + if input.trace > 2 then + input.logger('= found by scanning',fname) + end + table.insert(result,fname) + done = true + if not instance.allresults then break end + end + end + else + -- no access needed for non existing path, speedup (esp in large tree with lots of fake) + end + end + end + end + if not done and doscan then + -- todo: slow path scanning + end + if done and not instance.allresults then break end + end + end + end + for k,v in pairs(result) do + result[k] = file.collapse_path(v) + end + if instance.remember then + instance.found[stamp] = result + end + return result +end + +input.aux._find_file_ = input.aux.find_file + +function input.aux.find_file(instance,filename) -- maybe make a lowres cache too + local result = input.aux._find_file_(instance,filename) + if #result == 0 then + local lowered = filename:lower() + if filename ~= lowered then + return input.aux._find_file_(instance,lowered) + end + end + return result +end + +if lfs and lfs.isfile then + input.aux.is_file = lfs.isfile -- to be done: use this +else + input.aux.is_file = file.is_readable +end + +if lfs and lfs.isdir then + function input.aux.can_be_dir(instance,name) + if not instance.fakepaths[name] then + if lfs.isdir(name) then + instance.fakepaths[name] = 1 -- directory + else + instance.fakepaths[name] = 2 -- no directory + end + end + return (instance.fakepaths[name] == 1) + end +else + function input.aux.can_be_dir() + return true + end +end + +if not input.concatinators then input.concatinators = { } end + +function input.concatinators.tex(tag,path,name) + return tag .. '/' .. path .. '/' .. name +end + +input.concatinators.file = input.concatinators.tex + +function input.find_files(instance,filename,filetype,mustexist) + if type(mustexist) == boolean then + -- all set + elseif type(filetype) == 'boolean' then + filetype, mustexist = nil, false + elseif type(filetype) ~= 'string' then + filetype, mustexist = nil, false + end + instance.format = filetype or '' + local t = input.aux.find_file(instance,filename,true) + instance.format = '' + return t +end + +function input.find_file(instance,filename,filetype,mustexist) + return (input.find_files(instance,filename,filetype,mustexist)[1] or "") +end + +function input.find_given_files(instance,filename) + local bname, result = file.basename(filename), { } + for k, hash in pairs(instance.hashes) do + local blist = instance.files[hash.tag][bname] + if blist then + if type(blist) == 'string' then + table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "") + if not instance.allresults then break end + else + for kk,vv in pairs(blist) do + table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "") + if not instance.allresults then break end + end + end + end + end + return result +end + +function input.find_given_file(instance,filename) + return (input.find_given_files(instance,filename)[1] or "") +end + +--~ function input.find_wildcard_files(instance,filename) +--~ local result = { } +--~ local bname, dname = file.basename(filename), file.dirname(filename) +--~ local expr = dname:gsub("^*/","") +--~ expr = expr:gsub("*",".*") +--~ expr = expr:gsub("-","%-") +--~ for k, hash in pairs(instance.hashes) do +--~ local blist = instance.files[hash.tag][bname] +--~ if blist then +--~ if type(blist) == 'string' then +--~ -- make function and share code +--~ if blist:find(expr) then +--~ table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "") +--~ if not instance.allresults then break end +--~ end +--~ else +--~ for kk,vv in pairs(blist) do +--~ if vv:find(expr) then +--~ table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "") +--~ if not instance.allresults then break end +--~ end +--~ end +--~ end +--~ end +--~ end +--~ return result +--~ end + +function input.find_wildcard_files(instance,filename) + local result = { } + local bname, dname = file.basename(filename), file.dirname(filename) + local path = dname:gsub("^*/","") + path = path:gsub("*",".*") + path = path:gsub("-","%%-") + if dname == "" then + path = ".*" + end + local name = bname + name = name:gsub("*",".*") + name = name:gsub("-","%%-") + path = path:lower() + name = name:lower() + local function doit(blist,bname,hash,allresults) + local done = false + if blist then + if type(blist) == 'string' then + -- make function and share code + if (blist:lower()):find(path) then + table.insert(result,input.concatinators[hash.type](hash.tag,blist,bname) or "") + done = true + end + else + for kk,vv in pairs(blist) do + if (vv:lower()):find(path) then + table.insert(result,input.concatinators[hash.type](hash.tag,vv,bname) or "") + done = true + if not allresults then break end + end + end + end + end + return done + end + local files, allresults, done = instance.files, instance.allresults, false + if name:find("%*") then + for k, hash in pairs(instance.hashes) do + for kk, hh in pairs(files[hash.tag]) do + if (kk:lower()):find(name) then + if doit(hh,kk,hash,allresults) then done = true end + if done and not allresults then break end + end + end + end + else + for k, hash in pairs(instance.hashes) do + if doit(files[hash.tag][bname],bname,hash,allresults) then done = true end + if done and not allresults then break end + end + end + return result +end + +function input.find_wildcard_file(instance,filename) + return (input.find_wildcard_files(instance,filename)[1] or "") +end + +-- main user functions + +function input.save_used_files_in_trees(instance, filename,jobname) + if not filename then filename = 'luatex.jlg' end + local f = io.open(filename,'w') + if f then + f:write("\n") + f:write("\n") + if jobname then + f:write("\t" .. jobname .. "\n") + end + f:write("\t\n") + for _,v in pairs(table.sortedkeys(instance.foundintrees)) do + f:write("\t\t" .. v .. "\n") + end + f:write("\t\n") + f:write("\n") + f:close() + end +end + +function input.automount(instance) + -- implemented later +end + +function input.load(instance) + input.start_timing(instance) + input.identify_cnf(instance) + input.load_cnf(instance) + input.expand_variables(instance) + input.load_hash(instance) + input.automount(instance) + input.stop_timing(instance) +end + +function input.for_files(instance, command, files, filetype, mustexist) + if files and #files > 0 then + local function report(str) + if input.verbose then + input.report(str) -- has already verbose + else + print(str) + end + end + if input.verbose then + report('') + end + for _, file in pairs(files) do + local result = command(instance,file,filetype,mustexist) + if type(result) == 'string' then + report(result) + else + for _,v in pairs(result) do + report(v) + end + end + end + end +end + +-- strtab + +function input.var_value(instance,str) -- output the value of variable $STRING. + return input.variable(instance,str) +end +function input.expand_var(instance,str) -- output variable expansion of STRING. + return input.expansion(instance,str) +end +function input.show_path(instance,str) -- output search path for file type NAME + return file.join_path(input.expanded_path_list(instance,input.format_of_var(str))) +end + +-- input.find_file(filename) +-- input.find_file(filename, filetype, mustexist) +-- input.find_file(filename, mustexist) +-- input.find_file(filename, filetype) + +function input.aux.register_file(files, name, path) + if files[name] then + if type(files[name]) == 'string' then + files[name] = { files[name], path } + else + files[name] = path + end + else + files[name] = path + end +end + +-- zip:: zip## zip:// +-- zip::pathtozipfile::pathinzipfile (also: pathtozipfile/pathinzipfile) +-- file::name +-- tex::name +-- kpse::name +-- kpse::format::name +-- parent::n::name +-- parent::name (default 2) + +if not input.finders then input.finders = { } end +if not input.openers then input.openers = { } end +if not input.loaders then input.loaders = { } end + +input.finders.notfound = { nil } +input.openers.notfound = { nil } +input.loaders.notfound = { false, nil, 0 } + +function input.splitmethod(filename) + local method, specification = filename:match("^(.-)##(.+)$") + if method and specification then + return method, specification + else + return 'tex', filename + end +end + +function input.method_is_file(filename) + local method, specification = input.splitmethod(filename) + return method == 'tex' or method == 'file' +end + +function input.methodhandler(what, instance, filename, filetype) -- ... + local method, specification = input.splitmethod(filename) + if method and specification then -- redundant + if input[what][method] then + input.logger('= handler',filename.." -> "..what.." | "..method.." | "..specification) + return input[what][method](instance,specification,filetype) + else + return nil + end + else + return input[what].tex(instance,filename,filetype) + end +end + +-- also inside next test? + +function input.findtexfile(instance, filename, filetype) + return input.methodhandler('finders',instance, input.normalize_name(filename), filetype) +end +function input.opentexfile(instance,filename) + return input.methodhandler('openers',instance, input.normalize_name(filename)) +end + +function input.findbinfile(instance, filename, filetype) + return input.methodhandler('finders',instance, input.normalize_name(filename), filetype) +end +function input.openbinfile(instance,filename) + return input.methodhandler('loaders',instance, input.normalize_name(filename)) +end + +function input.loadbinfile(instance, filename, filetype) + local fname = input.findbinfile(instance, input.normalize_name(filename), filetype) + if fname and fname ~= "" then + return input.openbinfile(instance,fname) + else + return unpack(input.loaders.notfound) + end +end + +function input.texdatablob(instance, filename, filetype) + local ok, data, size = input.loadbinfile(instance, filename, filetype) + return data or "" +end + +function input.openfile(filename) -- brrr texmf.instance here / todo ! ! ! ! ! + local fullname = input.findtexfile(texmf.instance, filename) + if fullname and (fullname ~= "") then + return input.opentexfile(texmf.instance, fullname) + else + return nil + end +end + +function input.logmode() + return (os.getenv("MTX.LOG.MODE") or os.getenv("MTX_LOG_MODE") or "tex"):lower() +end + +-- this is a prelude to engine/progname specific configuration files +-- in which case we can omit files meant for other programs and +-- packages + +--- ctx + +-- maybe texinputs + font paths +-- maybe positive selection tex/context fonts/tfm|afm|vf|opentype|type1|map|enc + +input.validators = { } +input.validators.visibility = { } + +function input.validators.visibility.default(path, name) + return true +end + +function input.validators.visibility.context(path, name) + path = path[1] or path -- some day a loop + return not ( + path:find("latex") or + path:find("doc") or + path:find("tex4ht") or + path:find("source") or +-- path:find("config") or +-- path:find("metafont") or + path:find("lists$") or + name:find("%.tpm$") or + name:find("%.bak$") + ) +end + +-- todo: describe which functions are public (maybe input.private. ... ) + +-- beware: i need to check where we still need a / on windows: + +function input.clean_path(str) + -- return string.gsub(string.gsub(string.gsub(str,"\\","/"),"^!+",""),"//$","/") + return (string.gsub(string.gsub(str,"\\","/"),"^!+","")) +end +function input.do_with_path(name,func) + for _, v in pairs(input.expanded_path_list(instance,name)) do + func("^"..input.clean_path(v)) + end +end +function input.do_with_var(name,func) + func(input.aux.expanded_var(name)) +end + +function input.with_files(instance,pattern,handle) + for _, hash in pairs(instance.hashes) do + local blobpath = hash.tag + local blobtype = hash.type + if blobpath and instance.files[blobpath] then -- sort them? + for k,v in pairs(instance.files[blobpath]) do + if k:find(pattern) then + if type(v) == "string" then + handle(blobtype,blobpath,v,k) + else + for _,vv in pairs(v) do + handle(blobtype,blobpath,vv,k) + end + end + end + end + end + end +end + +function input.update_script(oldname,newname) -- oldname -> own.name, not per se a suffix + newname = file.addsuffix(newname,"lua") + newscript = input.clean_path(input.find_file(instance, newname)) + oldscript = input.clean_path(oldname) + input.report("old script", oldscript) + input.report("new script", newscript) + if oldscript ~= newscript and (oldscript:find(file.removesuffix(newname).."$") or oldscript:find(newname.."$")) then + newdata = io.loaddata(newscript) + if newdata then + input.report("old script content replaced by new content") + io.savedata(oldscript,newdata) + end + end +end diff --git a/tex/context/base/luat-iop.lua b/tex/context/base/luat-iop.lua new file mode 100644 index 000000000..469b7c034 --- /dev/null +++ b/tex/context/base/luat-iop.lua @@ -0,0 +1,157 @@ +-- filename : luat-iop.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- this paranoid stuff in web2c ... we cannot hook checks into the +-- input functions because one can always change the callback but +-- we can feed back specific patterns and paths into the next +-- mechanism + +if not versions then versions = { } end versions['luat-exe'] = 1.001 + +if not io.inp then io.inp = { } end +if not io.out then io.out = { } end + +io.inp.blocked = { } +io.out.blocked = { } +io.inp.permitted = { } +io.out.permitted = { } +io.inp.modes = { } -- functions +io.out.modes = { } -- functions + +io.blocked_openers = { } -- *.open(name,method) + +function io.inp.inhibit (name) table.insert(io.inp.blocked, name) end +function io.out.inhibit (name) table.insert(io.out.blocked, name) end +function io.inp.permit (name) table.insert(io.inp.permitted, name) end +function io.out.permit (name) table.insert(io.out.permitted, name) end + +function io.register_opener(func) table.insert(io.blocked_openers, func) end + +function io.finalize_openers(func) + if (#io.out.blocked > 0) or (#io.inp.blocked > 0) then + do + local open = func + local out_permitted = io.out.permitted + local inp_permitted = io.inp.permitted + local out_blocked = io.out.blocked + local inp_blocked = io.inp.blocked + return function(name,method) + local function checked(blocked, permitted) + local n = string.lower(name) + for _,b in pairs(blocked) do + if string.find(n,b) then + for _,p in pairs(permitted) do + if string.find(n,p) then + return true + end + end + return false + end + end + return true + end + if method and string.find(method,'[wa]') then + if #out.blocked > 0 then + if not checked(out_blocked, out_permitted) then + -- print("writing to " .. name .. " is not permitted") + return nil + end + end + else + if #inp.blocked > 0 then + if not checked(inp_blocked, inp_permitted) then + -- print("reading from " .. name .. " is not permitted") + return nil + end + end + end + return open(name,method) + end + end + else + return func + end +end + +--~ io.inp.inhibit('^%.') +--~ io.inp.inhibit('^/etc') +--~ io.inp.inhibit('/windows/') +--~ io.inp.inhibit('/winnt/') +--~ io.inp.permit('c:/windows/wmsetup.log') + +--~ io.open = io.finalize_openers(io.open) + +--~ f = io.open('.tex') print(f) +--~ f = io.open('tufte.tex') print(f) +--~ f = io.open('t:/sources/tufte.tex') print(f) +--~ f = io.open('/etc/passwd') print(f) +--~ f = io.open('c:/windows/crap.log') print(f) +--~ f = io.open('c:/windows/wmsetup.log') print(f) + +function io.set_opener_modes(i,o) + for _,v in pairs({'inp','out'}) do + if io[v][i] then + io[v][i]() + elseif io[v][string.sub(i,1,1)] then + io[v][string.sub(i,1,1)]() + end + end + io.open = io.finalize_openers(io.open) +end + +function io.set_opener_modes(i,o) + local f + for _,v in pairs({'inp','out'}) do + f = io[v][i] or io[v][string.sub(i,1,1)] + if f then f() end + end + io.open = io.finalize_openers(io.open) +end + +-- restricted + +function io.inp.modes.restricted() + io.inp.inhibit('^%.[%a]') +end +function io.out.modes.restricted() + io.out.inhibit('^%.[%a]') +end + +-- paranoid + +function io.inp.modes.paranoid() + io.inp.inhibit('.*') + io.inp.inhibit('%.%.') + io.inp.permit('^%./') + io.inp.permit('[^/]') + input.do_with_path('TEXMF',io.inp.permit) +end +function io.out.modes.paranoid() + io.out.inhibit('.*') + input.do_with_path('TEXMFOUTPUT',io.out.permit) +end + +-- handy + +function io.inp.modes.handy() + io.inp.inhibit('%.%.') + if os.platform == 'linux' then + io.inp.inhibit('^/etc') + else + io.inp.inhibit('/windows/') + io.inp.inhibit('/winnt/') + end +end +function io.out.modes.handy() + io.out.inhibit('.*') + io.out.permit('%./') + io.out.permit('^%./') + io.out.permit('[^/]') +end + +--~ io.set_opener_modes('p','p') +--~ io.set_opener_modes('r','r') +--~ io.set_opener_modes('h','h') diff --git a/tex/context/base/luat-kps.lua b/tex/context/base/luat-kps.lua new file mode 100644 index 000000000..15dadbb84 --- /dev/null +++ b/tex/context/base/luat-kps.lua @@ -0,0 +1,102 @@ +if not modules then modules = { } end modules ['luat-kps'] = { + version = 1.001, + comment = "companion to luatools.lua", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

This file is used when we want the input handlers to behave like +kpsewhich. What to do with the following:

+ + +{$SELFAUTOLOC,$SELFAUTODIR,$SELFAUTOPARENT}{,{/share,}/texmf{-local,}/web2c} +$SELFAUTOLOC : /usr/tex/bin/platform +$SELFAUTODIR : /usr/tex/bin +$SELFAUTOPARENT : /usr/tex + + +

How about just forgetting abou them?

+--ldx]]-- + +input = input or { } +input.suffixes = input.suffixes or { } +input.formats = input.formats or { } + +input.suffixes['gf'] = { 'gf' } +input.suffixes['pk'] = { 'pk' } +input.suffixes['base'] = { 'base' } +input.suffixes['bib'] = { 'bib' } +input.suffixes['bst'] = { 'bst' } +input.suffixes['cnf'] = { 'cnf' } +input.suffixes['mem'] = { 'mem' } +input.suffixes['mf'] = { 'mf' } +input.suffixes['mfpool'] = { 'pool' } +input.suffixes['mft'] = { 'mft' } +input.suffixes['mppool'] = { 'pool' } +input.suffixes['graphic/figure'] = { 'eps', 'epsi' } +input.suffixes['texpool'] = { 'pool' } +input.suffixes['PostScript header'] = { 'pro' } +input.suffixes['ist'] = { 'ist' } +input.suffixes['web'] = { 'web', 'ch' } +input.suffixes['cweb'] = { 'w', 'web', 'ch' } +input.suffixes['cmap files'] = { 'cmap' } +input.suffixes['lig files'] = { 'lig' } +input.suffixes['bitmap font'] = { } +input.suffixes['MetaPost support'] = { } +input.suffixes['TeX system documentation'] = { } +input.suffixes['TeX system sources'] = { } +input.suffixes['dvips config'] = { } +input.suffixes['type42 fonts'] = { } +input.suffixes['web2c files'] = { } +input.suffixes['other text files'] = { } +input.suffixes['other binary files'] = { } +input.suffixes['opentype fonts'] = { 'otf' } + +input.suffixes['fmt'] = { 'fmt' } +input.suffixes['texmfscripts'] = { 'rb','lua','py','pl' } + +input.suffixes['pdftex config'] = { } +input.suffixes['Troff fonts'] = { } + +input.suffixes['ls-R'] = { } + +--[[ldx-- +

If you wondered abou tsome of the previous mappings, how about +the next bunch:

+--ldx]]-- + +input.formats['bib'] = '' +input.formats['bst'] = '' +input.formats['mft'] = '' +input.formats['ist'] = '' +input.formats['web'] = '' +input.formats['cweb'] = '' +input.formats['MetaPost support'] = '' +input.formats['TeX system documentation'] = '' +input.formats['TeX system sources'] = '' +input.formats['Troff fonts'] = '' +input.formats['dvips config'] = '' +input.formats['graphic/figure'] = '' +input.formats['ls-R'] = '' +input.formats['other text files'] = '' +input.formats['other binary files'] = '' + +input.formats['gf'] = '' +input.formats['pk'] = '' +input.formats['base'] = 'MFBASES' +input.formats['cnf'] = '' +input.formats['mem'] = 'MPMEMS' +input.formats['mf'] = 'MFINPUTS' +input.formats['mfpool'] = 'MFPOOL' +input.formats['mppool'] = 'MPPOOL' +input.formats['texpool'] = 'TEXPOOL' +input.formats['PostScript header'] = 'TEXPSHEADERS' +input.formats['cmap files'] = 'CMAPFONTS' +input.formats['type42 fonts'] = 'T42FONTS' +input.formats['web2c files'] = 'WEB2C' +input.formats['pdftex config'] = 'PDFTEXCONFIG' +input.formats['texmfscripts'] = 'TEXMFSCRIPTS' +input.formats['bitmap font'] = '' +input.formats['lig files'] = 'LIGFONTS' diff --git a/tex/context/base/luat-lib.lua b/tex/context/base/luat-lib.lua new file mode 100644 index 000000000..16c573ded --- /dev/null +++ b/tex/context/base/luat-lib.lua @@ -0,0 +1,144 @@ +-- filename : luat-lib.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-lib'] = 1.001 + +-- mostcode moved to the l-*.lua and other luat-*.lua files + +-- os / io + +os.setlocale(nil,nil) -- useless feature and even dangerous in luatex + +-- os.platform + +-- mswin|bccwin|mingw|cygwin windows +-- darwin|rhapsody|nextstep macosx +-- netbsd|unix unix +-- linux linux + +if not io.fileseparator then + if string.find(os.getenv("PATH"),";") then + io.fileseparator, io.pathseparator, os.platform = "\\", ";", "windows" + else + io.fileseparator, io.pathseparator, os.platform = "/" , ":", "unix" + end +end + +if not os.platform then + if io.pathseparator == ";" then + os.platform = "windows" + else + os.platform = "unix" + end +end + +-- arg normalization +-- +-- for k,v in pairs(arg) do print(k,v) end + +if arg and (arg[0] == 'luatex' or arg[0] == 'luatex.exe') and arg[1] == "--luaonly" then + arg[-1]=arg[0] arg[0]=arg[2] for k=3,#arg do arg[k-2]=arg[k] end arg[#arg]=nil arg[#arg]=nil +end + +-- environment + +if not environment then environment = { } end + +environment.arguments = { } +environment.files = { } +environment.sorted_argument_keys = nil + +environment.platform = os.platform + +function environment.initialize_arguments(arg) + environment.arguments = { } + environment.files = { } + environment.sorted_argument_keys = nil + for index, argument in pairs(arg) do + if index > 0 then + local flag, value = argument:match("^%-+(.+)=(.-)$") + if flag then + environment.arguments[flag] = string.unquote(value or "") + else + flag = argument:match("^%-+(.+)") + if flag then + environment.arguments[flag] = true + else + environment.files[#environment.files+1] = argument + end + end + end + end + environment.ownname = environment.ownname or arg[0] or 'unknown.lua' +end + +function environment.showarguments() + for k,v in pairs(environment.arguments) do + print(k .. " : " .. tostring(v)) + end + if #environment.files > 0 then + print("files : " .. table.concat(environment.files, " ")) + end +end + +function environment.argument(name) + if environment.arguments[name] then + return environment.arguments[name] + else + if not environment.sorted_argument_keys then + environment.sorted_argument_keys = { } + for _,v in pairs(table.sortedkeys(environment.arguments)) do + table.insert(environment.sorted_argument_keys, "^" .. v) + end + end + for _,v in pairs(environment.sorted_argument_keys) do + if name:find(v) then + return environment.arguments[v:sub(2,#v)] + end + end + end + return nil +end + +function environment.split_arguments(separator) -- rather special, cut-off before separator + local done, before, after = false, { }, { } + for _,v in ipairs(environment.original_arguments) do + if not done and v == separator then + done = true + elseif done then + after[#after+1] = v + else + before[#before+1] = v + end + end + return before, after +end + +function environment.reconstruct_commandline(arg) + if not arg then arg = environment.original_arguments end + local result = { } + for _,a in ipairs(arg) do -- ipairs 1 .. #n + local kk, vv = a:match("^(%-+.-)=(.+)$") + if kk and vv then + if vv:find(" ") then + result[#result+1] = kk .. "=" .. string.quote(vv) + else + result[#result+1] = a + end + elseif a:find(" ") then + result[#result+1] = string.quote(a) + else + result[#result+1] = a + end + end + return table.join(result," ") +end + +if arg then + environment.initialize_arguments(arg) + environment.original_arguments = arg + arg = { } -- prevent duplicate handling +end diff --git a/tex/context/base/luat-lib.tex b/tex/context/base/luat-lib.tex new file mode 100644 index 000000000..6c5c63227 --- /dev/null +++ b/tex/context/base/luat-lib.tex @@ -0,0 +1,86 @@ +%D \module +%D [ file=luat-lib, +%D version=2006.09.11, +%D title=\CONTEXT\ Lua Macros, +%D subtitle=Unicode Support, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% \writestatus{loading}{Lua Support Macros (libs)} + +%D For the moment we only load this lib. + +%D This will move cq. become configurable. The XML like output is just +%D an example. + +% todo \let\normaleverytoks\everytoks \newtoks\everytoke \normaleverytoks{\the\everytoks} + +\chardef\statuswidth=15 +\chardef\statuswrite=16 + +\newtoks\everywritestring + +\def\writedirect {\immediate\write\statuswrite} +\def\writeline {\writedirect{}} +\def\writestring#1{\begingroup\the\everywritestring\writedirect{#1}\endgroup} + +\ifx\normalmessage \undefined \let\normalmessage \message \fi +\ifx\normalwritestatus\undefined \def\normalwritestatus#1#2{\writedirect{#1 : #2}} \fi + +% this will change once we have proper write overloads + +\registerctxluafile{l-string} {1.001} +\registerctxluafile{l-boolean}{1.001} +\registerctxluafile{l-number} {1.001} +\registerctxluafile{l-math} {1.001} +\registerctxluafile{l-table} {1.001} +\registerctxluafile{l-md5} {1.001} +\registerctxluafile{l-aux} {1.001} +\registerctxluafile{l-io} {1.001} +\registerctxluafile{l-os} {1.001} +\registerctxluafile{l-file} {1.001} +\registerctxluafile{l-dir} {1.001} +\registerctxluafile{l-unicode}{1.001} +\registerctxluafile{l-utils} {1.001} +\registerctxluafile{l-tex} {1.001} +\registerctxluafile{l-xml} {1.001} +\registerctxluafile{l-xmlctx} {1.001} + +\registerctxluafile{luat-cbk} {1.001} +\registerctxluafile{luat-lib} {1.001} +\registerctxluafile{luat-inp} {1.001} +\registerctxluafile{luat-log} {1.001} +\registerctxluafile{luat-zip} {1.001} +\registerctxluafile{luat-tex} {1.001} + +\startruntimeluacode + \edef\asciia{\ctxlua{tex.sprint(input.logmode())}} + \edef\asciib{xml} + \ifx\asciia\asciib % brrr + \long\def\writebanner #1{\writestring {#1}} + \long\def\writestatus#1#2{\writestring {#2}} + \long\def\message #1{\normalmessage{#1}} + \else + \let\writebanner\writestring + \let\writestatus\normalwritestatus + \let\message \normalmessage + \fi +\stopruntimeluacode + +\registerctxluafile{luat-tmp}{1.001} +\registerctxluafile{luat-crl}{1.001} +\registerctxluafile{luat-exe}{1.001} +\registerctxluafile{luat-iop}{1.001} + +% trace used files (only from trees) +% +% \ctxlua{input.register_stop_actions(function() input.save_used_files_in_trees(texmf.instance) end)} +% \ctxlua{table.insert(input.stop_actions, function() input.save_used_files_in_trees(texmf.instance) end)} +% \ctxlua{function input.stop_actions.trace_used_files() input.save_used_files_in_trees(texmf.instance) end} + +\endinput diff --git a/tex/context/base/luat-lmx.lua b/tex/context/base/luat-lmx.lua new file mode 100644 index 000000000..817506220 --- /dev/null +++ b/tex/context/base/luat-lmx.lua @@ -0,0 +1,139 @@ +-- filename : luat-lmx.lua +-- comment : companion to luat-lmx.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-mlx'] = 1.001 + +lmx = { } + +lmx.escapes = { + ['&'] = '&', + ['<'] = '<', + ['>'] = '>', + ['"'] = '"' +} + +-- local function p -> ends up in lmx.p, so we need to cast + +lmx.variables = { } + +lmx.variables['title-default'] = 'LMX File' +lmx.variables['title'] = lmx.variables['title-default'] + +-- demonstrates: local, *all, gsub using tables, nil or value, loadstring + +function lmx.loadedfile(filename) + return input.texdatablob(texmf.instance, filename) +end + +lmx.converting = false + +function lmx.convert(template,result) -- use lpeg instead + if not lmx.converting then -- else, if error then again tex error and loop + local data = input.texdatablob(texmf.instance, template) + local f = false + if result then + f = io.open(result,"w") + function lmx.print(str) f:write(str) end + else + lmx.print = io.write + end + function lmx.variable(str) + return lmx.variables[str] or "" + end + function lmx.escape(str) + return string.gsub(string.gsub(str,'&','&'),'[<>"]',lmx.escapes) + end + function lmx.type(str) + if str then lmx.print("" .. lmx.escape(str) .. "") end + end + function lmx.pv(str) + lmx.print(lmx.variable(str)) + end + function lmx.tv(str) + lmx.type(lmx.variable(str)) + end + data = string.gsub(data, "<%?lmx%-include%s+(.-)%s-%?>", function(filename) + return lmx.loadedfile(filename) + end) + local definitions = { } + data = string.gsub(data, "<%?lmx%-define%-begin%s+(%S-)%s-%?>(.-)<%?lmx%-define%-end%s-%?>", function(tag,content) + definitions[tag] = content + return "" + end) + data = string.gsub(data, "<%?lmx%-resolve%s+(%S-)%s-%?>", function(tag) + return definitions[tag] or "" + end) + data = string.gsub(data, "%c%s-(<%?lua .-%?>)%s-%c", function(lua) + return "\n" .. lua .. " " + end) + data = string.gsub(data .. "","(.-)<%?lua%s+(.-)%?>", function(txt, lua) + txt = txt:gsub("%c+", "\\n") + txt = txt:gsub('"' , '\\"') + txt = txt:gsub("'" , "\\'") + -- txt = string.gsub(txt, "([\'\"])", { ["'"] = '\\"', ['"'] = "\\'" } ) + return "p(\"" .. txt .. "\")\n" .. lua .. "\n" + end) + lmx.converting = true + data = "local p,v,e,t,pv,tv = lmx.print,lmx.variable,lmx.escape,lmx.type,lmx.pv,lmx.tv " .. data + assert(loadstring(data))() + lmx.converting = false + if f then + f:close() + end + end +end + +-- these can be overloaded; we assume that the os handles filename associations + +lmx.lmxfile = function(filename) return filename end +lmx.htmfile = function(filename) return filename end + +if environment.platform == "windows" then + lmx.popupfile = function(filename) os.execute("start " .. filename) end +else + lmx.popupfile = function(filename) os.execute(filename) end +end + +function lmx.show(name) + local lmxfile = lmx.lmxfile(name) + local htmfile = lmx.htmfile(name) + if lmxfile == htmfile then + htmfile = string.gsub(lmxfile, "%.%a+$", "html") + end + lmx.convert(lmxfile, htmfile) + lmx.popupfile(htmfile) +end + +-- kind of private + +lmx.restorables = { } + +function lmx.set(key, value) + if not lmx.restorables[key] then + table.insert(lmx.restorables, key) + lmx.variables['@@' .. key] = lmx.variables[key] + end + lmx.variables[key] = value +end + +function lmx.get(key) + return lmx.variables[key] or "" +end + +function lmx.restore() + for _,key in pairs(lmx.restorables) do + lmx.variables[key] = lmx.variables['@@' .. key] + end + lmx.restorables = { } +end + +-- command line + +if arg then + if arg[1] == "--show" then if arg[2] then lmx.show (arg[2]) end + elseif arg[1] == "--convert" then if arg[2] then lmx.convert(arg[2], arg[3] or "temp.html") end + end +end diff --git a/tex/context/base/luat-lmx.tex b/tex/context/base/luat-lmx.tex new file mode 100644 index 000000000..cc7fa448f --- /dev/null +++ b/tex/context/base/luat-lmx.tex @@ -0,0 +1,16 @@ +%D \module +%D [ file=luat-lmx, +%D version=2005.09.02, +%D title=\CONTEXT\ Lua Macros, +%D subtitle=LMX Support, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Lua Support Macros (lmx)} + +\registerctxluafile{luat-lmx}{1.001} diff --git a/tex/context/base/luat-log.lua b/tex/context/base/luat-log.lua new file mode 100644 index 000000000..faecf7e29 --- /dev/null +++ b/tex/context/base/luat-log.lua @@ -0,0 +1,123 @@ +if not modules then modules = { } end modules ['luat-log'] = { + version = 1.001, + comment = "companion to luat-lib.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

This is a prelude to a more extensive logging module. For the sake +of parsing log files, in addition to the standard logging we will +provide an structured file. Actually, any logging that +is hooked into callbacks will be \XML\ by default.

+--ldx]]-- + +input = input or { } +logs = logs or { } + +--[[ldx-- +

This looks pretty ugly but we need to speed things up a bit.

+--ldx]]-- + +logs.levels = { + ['error'] = 1, + ['warning'] = 2, + ['info'] = 3, + ['debug'] = 4 +} + +logs.functions = { + 'error', 'warning', 'info', 'debug', 'report', + 'start', 'stop', 'push', 'pop' +} + +logs.callbacks = { + 'start_page_number', + 'stop_page_number', + 'report_output_pages', + 'report_output_log' +} + +logs.xml = logs.xml or { } +logs.tex = logs.tex or { } + +logs.level = 0 + +do + local write_nl, write, format = texio.write_nl or print, texio.write or print, string.format + + function logs.xml.debug(category,str) + if logs.level > 3 then write_nl(format("%s",category,str)) end + end + function logs.xml.info(category,str) + if logs.level > 2 then write_nl(format("%s",category,str)) end + end + function logs.xml.warning(category,str) + if logs.level > 1 then write_nl(format("%s",category,str)) end + end + function logs.xml.error(category,str) + if logs.level > 0 then write_nl(format("%s",category,str)) end + end + function logs.xml.report(category,str) + write_nl(format("%s",category,str)) + end + + function logs.xml.start() if logs.level > 0 then tw("<%s>" ) end end + function logs.xml.stop () if logs.level > 0 then tw("") end end + function logs.xml.push () if logs.level > 0 then tw("" ) end end + + function logs.tex.debug(category,str) + if logs.level > 3 then write_nl(format("debug >> %s: %s" ,category,str)) end + end + function logs.tex.info(category,str) + if logs.level > 2 then write_nl(format("info >> %s: %s" ,category,str)) end + end + function logs.tex.warning(category,str) + if logs.level > 1 then write_nl(format("warning >> %s: %s",category,str)) end + end + function logs.tex.error(category,str) + if logs.level > 0 then write_nl(format("error >> %s: %s" ,category,str)) end + end + function logs.tex.report(category,str) + write_nl(format("report >> %s: %s" ,category,str)) + end + + function logs.set_level(level) + logs.level = logs.levels[level] or level + end + + function logs.set_method(method) + for _, v in pairs(logs.functions) do + logs[v] = logs[method][v] or function() end + end + if callback and input[method] then + for _, cb in pairs(logs.callbacks) do + callback.register(cb, input[method][cb]) + end + end + end + + function logs.xml.start_page_number() + write_nl(format("

") + write_nl("") + end + + function logs.xml.report_output_pages(p,b) + write_nl(format("", p)) + write_nl(format("", b)) + write_nl("") + end + + function logs.xml.report_output_log() + end + +end + +logs.set_level('error') +logs.set_method('tex') diff --git a/tex/context/base/luat-tex.lua b/tex/context/base/luat-tex.lua new file mode 100644 index 000000000..8e770f9de --- /dev/null +++ b/tex/context/base/luat-tex.lua @@ -0,0 +1,389 @@ +-- filename : luat-zip.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-tex'] = 1.001 + +-- special functions that deal with io + +if texconfig and not texlua then + + input.level = input.level or 0 + + if input.logmode() == 'xml' then + function input.show_open(name) + input.level = input.level + 1 + texio.write_nl("") + end + function input.show_close(name) + texio.write(" ") + input.level = input.level - 1 + end + function input.show_load(name) + texio.write_nl("") -- level? + end + else + function input.show_open () end + function input.show_close() end + function input.show_load () end + end + + function input.finders.generic(instance,tag,filename,filetype) + local foundname = input.find_file(instance,filename,filetype) + if foundname and foundname ~= "" then + input.logger('+ ' .. tag .. ' finder',filename,'filetype') + return foundname + else + input.logger('- ' .. tag .. ' finder',filename,'filetype') + return unpack(input.finders.notfound) + end + end + + input.filters.dynamic_translator = nil + input.filters.frozen_translator = nil + input.filters.utf_translator = nil + + function input.openers.text_opener(filename,file_handle,tag) + local u = unicode.utftype(file_handle) + local t = { } + if u > 0 then + input.logger('+ ' .. tag .. ' opener (' .. unicode.utfname[u] .. ')',filename) + local l + if u > 2 then + l = unicode.utf32_to_utf8(file_handle:read("*a"),u==4) + else + l = unicode.utf16_to_utf8(file_handle:read("*a"),u==2) + end + file_handle:close() + t = { + utftype = u, -- may go away + lines = l, + current = 0, + handle = nil, + noflines = #l, + close = function() + input.logger('= ' .. tag .. ' closer (' .. unicode.utfname[u] .. ')',filename) + input.show_close(filename) + end, + reader = function(self) + if not self then self = t end + if self.current >= #self.lines then + return nil + else + self.current = self.current + 1 + if input.filters.utf_translator then + return input.filters.utf_translator(self.lines[t.current]) + else + return self.lines[self.current] + end + end + end + } + else + input.logger('+ ' .. tag .. ' opener',filename) + -- todo: file;name -> freeze / eerste regel scannen -> freeze + t = { + reader = function(self) + if not self then self = t end -- not used + if input.filters.dynamic_translator then + return input.filters.dynamic_translator(file_handle:read()) + elseif input.filters.utf_translator then + return input.filters.utf_translator(file_handle:read()) + else + return file_handle:read() + end + end, + close = function() + input.logger('= ' .. tag .. ' closer',filename) + input.show_close(filename) + file_handle:close() + end, + handle = function() + return file_handle + end, + noflines = function() + t.noflines = io.noflines(file_handle) + return t.noflines + end + } + end + return t + end + + function input.openers.generic(instance,tag,filename) + if filename and filename ~= "" then + local f = io.open(filename,"r") + if f then + input.show_open(filename) + return input.openers.text_opener(filename,f,tag) + end + end + input.logger('- ' .. tag .. ' opener',filename) + return unpack(input.openers.notfound) + end + + function input.loaders.generic(instance,tag,filename) + if filename and filename ~= "" then + local f = io.open(filename,"rb") + if f then + input.show_load(filename) + input.logger('+ ' .. tag .. ' loader',filename) + local s = f:read("*a") + f:close() + if s then + return true, s, #s + end + end + end + input.logger('- ' .. tag .. ' loader',filename) + return unpack(input.loaders.notfound) + end + + function input.finders.tex(instance,filename,filetype) + return input.finders.generic(instance,'tex',filename,filetype) + end + function input.openers.tex(instance,filename) + return input.openers.generic(instance,'tex',filename) + end + function input.loaders.tex(instance,filename) + return input.loaders.generic(instance,'tex',filename) + end + +end + +-- callback into the file io and related things; disabling kpse + +if texconfig and not texlua then + + texconfig.kpse_init = false + texconfig.trace_file_names = input.logmode() == 'tex' + texconfig.max_print_line = 100000 + + -- if still present, we overload kpse (put it off-line so to say) + + if not texmf then texmf = { } end + + if not texmf.instance then + + if not texmf.instance then -- prevent a second loading + + texmf.instance = input.reset() + texmf.instance.progname = environment.progname or 'context' + texmf.instance.engine = environment.engine or 'luatex' + texmf.instance.validfile = input.validctxfile + + input.load(texmf.instance) + + end + + if callback then + callback.register('find_read_file' , function(id,name) return input.findtexfile(texmf.instance,name) end) + callback.register('open_read_file' , function( name) return input.opentexfile(texmf.instance,name) end) + end + + if callback then + callback.register('find_data_file' , function(name) return input.findbinfile(texmf.instance,name,"tex") end) + callback.register('find_enc_file' , function(name) return input.findbinfile(texmf.instance,name,"enc") end) + callback.register('find_font_file' , function(name) return input.findbinfile(texmf.instance,name,"tfm") end) + callback.register('find_format_file' , function(name) return input.findbinfile(texmf.instance,name,"fmt") end) + callback.register('find_image_file' , function(name) return input.findbinfile(texmf.instance,name,"tex") end) + callback.register('find_map_file' , function(name) return input.findbinfile(texmf.instance,name,"map") end) + callback.register('find_ocp_file' , function(name) return input.findbinfile(texmf.instance,name,"ocp") end) + callback.register('find_opentype_file' , function(name) return input.findbinfile(texmf.instance,name,"otf") end) + callback.register('find_output_file' , function(name) return name end) + callback.register('find_pk_file' , function(name) return input.findbinfile(texmf.instance,name,"pk") end) + callback.register('find_sfd_file' , function(name) return input.findbinfile(texmf.instance,name,"sfd") end) + callback.register('find_truetype_file' , function(name) return input.findbinfile(texmf.instance,name,"ttf") end) + callback.register('find_type1_file' , function(name) return input.findbinfile(texmf.instance,name,"pfb") end) + callback.register('find_vf_file' , function(name) return input.findbinfile(texmf.instance,name,"vf") end) + + callback.register('read_data_file' , function(file) return input.loadbinfile(texmf.instance,file,"tex") end) + callback.register('read_enc_file' , function(file) return input.loadbinfile(texmf.instance,file,"enc") end) + callback.register('read_font_file' , function(file) return input.loadbinfile(texmf.instance,file,"tfm") end) + -- format + -- image + callback.register('read_map_file' , function(file) return input.loadbinfile(texmf.instance,file,"map") end) + callback.register('read_ocp_file' , function(file) return input.loadbinfile(texmf.instance,file,"ocp") end) + callback.register('read_opentype_file' , function(file) return input.loadbinfile(texmf.instance,file,"otf") end) + -- output + callback.register('read_pk_file' , function(file) return input.loadbinfile(texmf.instance,file,"pk") end) + callback.register('read_sfd_file' , function(file) return input.loadbinfile(texmf.instance,file,"sfd") end) + callback.register('read_truetype_file' , function(file) return input.loadbinfile(texmf.instance,file,"ttf") end) + callback.register('read_type1_file' , function(file) return input.loadbinfile(texmf.instance,file,"pfb") end) + callback.register('read_vf_file' , function(file) return input.loadbinfile(texmf.instance,file,"vf" ) end) + end + + if callback and environment.aleph_mode then + callback.register('find_font_file' , function(name) return input.findbinfile(texmf.instance,name,"ofm") end) + callback.register('read_font_file' , function(file) return input.loadbinfile(texmf.instance,file,"ofm") end) + callback.register('find_vf_file' , function(name) return input.findbinfile(texmf.instance,name,"ovf") end) + callback.register('read_vf_file' , function(file) return input.loadbinfile(texmf.instance,file,"ovf") end) + end + + if callback then + callback.register('find_write_file' , function(id,name) return name end) + end + + if callback and (not config or (#config == 0)) then + callback.register('find_format_file' , function(name) return name end) + end + + if callback and false then + for k, v in pairs(callback.list()) do + if not v then texio.write_nl("callback "..k.." is not set") end + end + end + + if callback then + + input.start_actions = { } + input.stop_actions = { } + + function input.register_start_actions(f) table.insert(input.start_actions, f) end + function input.register_stop_actions (f) table.insert(input.stop_actions, f) end + +--~ callback.register('start_run', function() for _, a in pairs(input.start_actions) do a() end end) +--~ callback.register('stop_run' , function() for _, a in pairs(input.stop_actions ) do a() end end) + + end + + if callback and (input.logmode() == 'xml') then + + function input.start_page_number() + texio.write_nl("

") + texio.write_nl("") + end + + callback.register('start_page_number' , input.start_page_number) + callback.register('stop_page_number' , input.stop_page_number ) + + function input.report_output_pages(p,b) + texio.write_nl(""..p.."") + texio.write_nl(""..b.."") + texio.write_nl("") + end + function input.report_output_log() + end + + callback.register('report_output_pages', input.report_output_pages) + callback.register('report_output_log' , input.report_output_log ) + + function input.start_run() + texio.write_nl("") + texio.write_nl("") + texio.write_nl("") + end + function input.stop_run() + texio.write_nl("") + end + function input.show_statistics() + for k,v in pairs(status.list()) do + texio.write_nl("log",""..tostring(v).."") + end + end + + table.insert(input.start_actions, input.start_run) + + table.insert(input.stop_actions, input.show_statistics) + table.insert(input.stop_actions, input.stop_run) + + function input.start_run() for _, a in pairs(input.start_actions) do a() end end + function input.stop_run () for _, a in pairs(input.stop_actions ) do a() end end + + callback.register('start_run', input.start_run) + callback.register('stop_run' , input.stop_run ) + + end + + end + + if kpse then + + function kpse.find_file(filename,filetype,mustexist) + return input.find_file(texmf.instance,filename,filetype,mustexist) + end + function kpse.expand_path(variable) + return input.expand_path(texmf.instance,variable) + end + function kpse.expand_var(variable) + return input.expand_var(texmf.instance,variable) + end + function kpse.expand_braces(variable) + return input.expand_braces(texmf.instance,variable) + end + + end + +end + +-- program specific configuration (memory settings and alike) + +if texconfig and not texlua then + + if not luatex then luatex = { } end + + luatex.variablenames = { + 'main_memory', 'extra_mem_bot', 'extra_mem_top', + 'buf_size', + 'font_max', 'font_mem_size', + 'hash_extra', 'max_strings', 'pool_free', 'pool_size', 'string_vacancies', + 'obj_tab_size', 'pdf_mem_size', 'dest_names_size', + 'nest_size', 'param_size', 'save_size', 'stack_size', + 'trie_size', 'hyph_size', + 'ocp_stack_size', 'ocp_list_size', 'ocp_buf_size' + } + + function luatex.variables() + local t, x = { }, nil + for _,v in pairs(luatex.variablenames) do + x = input.var_value(texmf.instance,v) + if x and x:find("^%d+$") then + t[v] = tonumber(x) + end + end + return t + end + + function luatex.setvariables(tab) + for k,v in pairs(luatex.variables()) do + tab[k] = v + end + end + + if not luatex.variables_set then + luatex.setvariables(texconfig) + luatex.variables_set = true + end + + texconfig.max_print_line = 100000 + +end + +-- some tex basics + +if not cs then cs = { } end + +function cs.def(k,v) + tex.sprint(tex.texcatcodes, "\\def\\" .. k .. "{" .. v .. "}") +end + +function cs.chardef(k,v) + tex.sprint(tex.texcatcodes, "\\chardef\\" .. k .. "=" .. v .. "\\relax") +end + +function cs.boolcase(b) + if b then tex.write(1) else tex.write(0) end +end + +function cs.testcase(b) + if b then + tex.sprint(tex.texcatcodes, "\\firstoftwoarguments") + else + tex.sprint(tex.texcatcodes, "\\secondoftwoarguments") + end +end diff --git a/tex/context/base/luat-tmp.lua b/tex/context/base/luat-tmp.lua new file mode 100644 index 000000000..d11ae6329 --- /dev/null +++ b/tex/context/base/luat-tmp.lua @@ -0,0 +1,457 @@ +if not modules then modules = { } end modules ['luat-tmp'] = { + version = 1.001, + comment = "companion to luat-lib.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

This module deals with caching data. It sets up the paths and +implements loaders and savers for tables. Best is to set the +following variable. When not set, the usual paths will be +checked. Personally I prefer the (users) temporary path.

+ + +TEXMFCACHE=$TMP;$TEMP;$TMPDIR;$TEMPDIR;$HOME;$TEXMFVAR;$VARTEXMF;. + + +

Currently we do no locking when we write files. This is no real +problem because most caching involves fonts and the chance of them +being written at the same time is small. We also need to extend +luatools with a recache feature.

+--ldx]]-- + +cache = cache or { } +dir = dir or { } +texmf = texmf or { } + +cache.path = nil +cache.base = cache.base or "luatex-cache" +cache.more = cache.more or "context" +cache.direct = false -- true is faster but may need huge amounts of memory +cache.trace = false +cache.tree = false +cache.temp = os.getenv("TEXMFCACHE") or os.getenv("HOME") or os.getenv("HOMEPATH") or os.getenv("VARTEXMF") or os.getenv("TEXMFVAR") or os.getenv("TMP") or os.getenv("TEMP") or os.getenv("TMPDIR") or nil +cache.paths = { cache.temp } + +if not cache.temp then + print("\nFATAL ERROR: NO VALID TEMPORARY PATH\n") + os.exit() +end + +function cache.configpath(instance) + return input.expand_var(instance,"TEXMFCNF") +end + +function cache.treehash(instance) + local tree = cache.configpath(instance) + if not tree or tree == "" then + return false + else + return md5.hex(tree) + end +end + +function cache.setpath(instance,...) + if not cache.path then + if lfs and instance then + for _,v in pairs(cache.paths) do + for _,vv in pairs(input.expanded_path_list(instance,v)) do + if lfs.isdir(vv) then + cache.path = vv + break + end + end + if cache.path then break end + end + end + if not cache.path then + cache.path = cache.temp + end + if lfs then + cache.tree = cache.tree or cache.treehash(instance) + if cache.tree then + cache.path = dir.mkdirs(cache.path,cache.base,cache.more,cache.tree) + else + cache.path = dir.mkdirs(cache.path,cache.base,cache.more) + end + end + end + if not cache.path then + cache.path = '.' + end + cache.path = input.clean_path(cache.path) + if lfs and not table.is_empty({...}) then + local pth = dir.mkdirs(cache.path,...) + return pth + end + return cache.path +end + +function cache.setluanames(path,name) + return path .. "/" .. name .. ".tma", path .. "/" .. name .. ".tmc" +end + +function cache.loaddata(path,name) + local tmaname, tmcname = cache.setluanames(path,name) + local loader = loadfile(tmcname) or loadfile(tmaname) + if loader then + return loader() + else + return false + end +end + +function cache.is_writable(filepath,filename) + local tmaname, tmcname = cache.setluanames(filepath,filename) + return file.is_writable(tmaname) +end + +function cache.savedata(filepath,filename,data,raw) -- raw needed for file cache + local tmaname, tmcname = cache.setluanames(filepath,filename) + local reduce, simplify = true, true + if raw then + reduce, simplify = false, false + end + if cache.direct then + file.savedata(tmaname, table.serialize(data,'return',true,true)) + else + table.tofile (tmaname, data,'return',true,true) -- maybe not the last true + end + utils.lua.compile(tmaname, tmcname) +end + +-- here we use the cache for format loading (texconfig.[formatname|jobname]) + +if tex and texconfig and texconfig.formatname and texconfig.formatname == "" then + if not texconfig.luaname then texconfig.luaname = "cont-en.lua" end + texconfig.formatname = cache.setpath(instance,"format") .. "/" .. texconfig.luaname:gsub("%.lu.$",".fmt") +end + +--[[ldx-- +

Once we found ourselves defining similar cache constructs +several times, containers were introduced. Containers are used +to collect tables in memory and reuse them when possible based +on (unique) hashes (to be provided by the calling function).

+ +

Caching to disk is disabled by default. Version numbers are +stored in the saved table which makes it possible to change the +table structures without bothering about the disk cache.

+ +

Examples of usage can be found in the font related code.

+--ldx]]-- + +containers = { } +containers.trace = false + +do -- local report + + local function report(container,tag,name) + if cache.trace or containers.trace or container.trace then + logs.report(string.format("%s cache",container.subcategory),string.format("%s: %s",tag,name or 'invalid')) + end + end + + function containers.define(category, subcategory, version, enabled) + if category and subcategory then + return { + category = category, + subcategory = subcategory, + storage = { }, + enabled = enabled, + version = version or 1.000, + trace = false, + path = cache.setpath(texmf.instance,category,subcategory), + } + else + return nil + end + end + + function containers.is_usable(container, name) + return container.enabled and cache.is_writable(container.path, name) + end + + function containers.is_valid(container, name) + if name and name ~= "" then + local cs = container.storage[name] + return cs and not table.is_empty(cs) and cs.cache_version == container.version + else + return false + end + end + + function containers.read(container,name) + if container.enabled and not container.storage[name] then + container.storage[name] = cache.loaddata(container.path,name) + if containers.is_valid(container,name) then + report(container,"loaded",name) + else + container.storage[name] = nil + end + end + if container.storage[name] then + report(container,"reusing",name) + end + return container.storage[name] + end + + function containers.write(container, name, data) + if data then + data.cache_version = container.version + if container.enabled then + local unique, shared = data.unique, data.shared + data.unique, data.shared = nil, nil + cache.savedata(container.path, name, data) + report(container,"saved",name) + data.unique, data.shared = unique, shared + end + report(container,"stored",name) + container.storage[name] = data + end + return data + end + + function containers.content(container,name) + return container.storage[name] + end + +end + +-- since we want to use the cache instead of the tree, we will now +-- reimplement the saver. + +input.usecache = true + +function input.aux.save_data(instance, dataname, check) + for cachename, files in pairs(instance[dataname]) do + local name + if input.usecache then + name = file.join(cache.setpath(instance,"trees"),md5.hex(cachename)) + else + name = file.join(cachename,dataname) + end + local luaname, lucname = name .. input.luasuffix, name .. input.lucsuffix + input.report("preparing " .. dataname .. " in", luaname) + for k, v in pairs(files) do + if not check or check(v,k) then -- path, name + if #v == 1 then + files[k] = v[1] + end + else + files[k] = nil -- false + end + end + local data = { + type = dataname, + root = cachename, + version = input.cacheversion, + date = os.date("%Y-%m-%d"), + time = os.date("%H:%M:%S"), + content = files, + } + local f = io.open(luaname,'w') + if f then + input.report("saving " .. dataname .. " in", luaname) + -- f:write(table.serialize(data,'return')) + f:write(input.serialize(data)) + f:close() + input.report("compiling " .. dataname .. " to", lucname) + if not utils.lua.compile(luaname,lucname) then + input.report("compiling failed for " .. dataname .. ", deleting file " .. lucname) + os.remove(lucname) + end + else + input.report("unable to save " .. dataname .. " in " .. name..input.luasuffix) + end + end +end + +function input.serialize(files) + -- This version is somewhat optimized for the kind of + -- tables that we deal with, so it's much faster than + -- the generic serializer. This makes sense because + -- luatools and mtxtools are called frequently. Okay, + -- we pay a small price for properly tabbed tables. + local t = { } + local concat = table.concat + local sorted = table.sortedkeys + local function dump(k,v,m) + if type(v) == 'string' then + return m .. "['" .. k .. "']='" .. v .. "'," + elseif #v == 1 then + return m .. "['" .. k .. "']='" .. v[1] .. "'," + else + return m .. "['" .. k .. "']={'" .. concat(v,"','").. "'}," + end + end + t[#t+1] = "return {" + if instance.sortdata then + for _, k in pairs(sorted(files)) do + local fk = files[k] + if type(fk) == 'table' then + t[#t+1] = "\t['" .. k .. "']={" + for _, kk in pairs(sorted(fk)) do + t[#t+1] = dump(kk,fk[kk],"\t\t") + end + t[#t+1] = "\t}," + else + t[#t+1] = dump(k,fk,"\t") + end + end + else + for k, v in pairs(files) do + if type(v) == 'table' then + t[#t+1] = "\t['" .. k .. "']={" + for kk,vv in pairs(v) do + t[#t+1] = dump(kk,vv,"\t\t") + end + t[#t+1] = "\t}," + else + t[#t+1] = dump(k,v,"\t") + end + end + end + t[#t+1] = "}" + return concat(t,"\n") +end + +function input.aux.load_data(instance,pathname,dataname,filename) + local luaname, lucname, pname, fname + if input.usecache then + pname, fname = cache.setpath(instance,"trees"), md5.hex(pathname) + filename = file.join(pname,fname) + else + if not filename or (filename == "") then + filename = dataname + end + pname, fname = pathname, filename + end + luaname = file.join(pname,fname) .. input.luasuffix + lucname = file.join(pname,fname) .. input.lucsuffix + local blob = loadfile(lucname) + if not blob then + blob = loadfile(luaname) + end + if blob then + local data = blob() + if data and data.content and data.type == dataname and data.version == input.cacheversion then + input.report("loading",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = data.content + else + input.report("skipping",dataname,"for",pathname,"from",filename) + instance[dataname][pathname] = { } + instance.loaderror = true + end + else + input.report("skipping",dataname,"for",pathname,"from",filename) + end +end + +-- we will make a better format, maybe something xml or just text + +input.automounted = input.automounted or { } + +function input.automount(instance,usecache) + local mountpaths = input.simplified_list(input.expansion(instance,'TEXMFMOUNT')) + if table.is_empty(mountpaths) and usecache then + mountpaths = { cache.setpath(instance,"mount") } + end + if not table.is_empty(mountpaths) then + input.starttiming(instance) + for k, root in pairs(mountpaths) do + local f = io.open(root.."/url.tmi") + if f then + for line in f:lines() do + if line then + if line:find("^[%%#%-]") then -- or %W + -- skip + elseif line:find("^zip://") then + input.report("mounting",line) + table.insert(input.automounted,line) + input.usezipfile(instance,line) + end + end + end + f:close() + end + end + input.stoptiming(instance) + end +end + +-- store info in format + +input.storage = { } +input.storage.data = { } +input.storage.min = 0 -- 500 +input.storage.max = input.storage.min - 1 +input.storage.trace = false -- true +input.storage.done = 0 +input.storage.evaluators = { } +-- (evaluate,message,names) + +function input.storage.register(...) + input.storage.data[#input.storage.data+1] = { ... } +end + +function input.storage.evaluate(name) + input.storage.evaluators[#input.storage.evaluators+1] = name +end + +function input.storage.finalize() -- we can prepend the string with "evaluate:" + for _, t in ipairs(input.storage.evaluators) do + for i, v in pairs(t) do + if type(v) == "string" then + t[i] = loadstring(v)() + elseif type(v) == "table" then + for _, vv in pairs(v) do + if type(vv) == "string" then + t[i] = loadstring(vv)() + end + end + end + end + end +end + +function input.storage.dump() + for name, data in ipairs(input.storage.data) do + local evaluate, message, original, target = data[1], data[2], data[3] ,data[4] + local name, initialize, finalize = nil, "", "" + for str in string.gmatch(target,"([^%.]+)") do + if name then + name = name .. "." .. str + else + name = str + end + initialize = string.format("%s %s = %s or {} ", initialize, name, name) + end + if evaluate then + finalize = "input.storage.evaluate(" .. name .. ")" + end + input.storage.max = input.storage.max + 1 + if input.storage.trace then + logs.report('storage',string.format('saving %s in slot %s',message,input.storage.max)) + lua.bytecode[input.storage.max] = loadstring( + initialize .. + string.format("logs.report('storage','restoring %s from slot %s') ",message,input.storage.max) .. + table.serialize(original,name) .. + finalize + ) + else + lua.bytecode[input.storage.max] = loadstring(initialize .. table.serialize(original,name) .. finalize) + end + end +end + +if lua.bytecode then -- from 0 upwards + local i = input.storage.min + while lua.bytecode[i] do + lua.bytecode[i]() + lua.bytecode[i] = nil + i = i + 1 + end + input.storage.done = i +end diff --git a/tex/context/base/luat-tra.lua b/tex/context/base/luat-tra.lua new file mode 100644 index 000000000..90756d359 --- /dev/null +++ b/tex/context/base/luat-tra.lua @@ -0,0 +1,82 @@ +-- filename : luat-tra.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-tra'] = 1.001 + +debugger = { } + +debugger.counters = { } +debugger.names = { } + +function debugger.hook() + local f = debug.getinfo(2,"f").func + if debugger.counters[f] == nil then + debugger.counters[f] = 1 + debugger.names[f] = debug.getinfo(2,"Sn") + else + debugger.counters[f] = debugger.counters[f] + 1 + end +end + +function debugger.getname(func) + local n = debugger.names[func] + if n.what == "C" then + return n.name + end + local lc = string.format("[%s]:%s", n.short_src, n.linedefined) + if n.namewhat ~= "" then + return string.format("%s (%s)", lc, n.name) + else + return lc + end +end + +function debugger.showstats(printer,threshold) + if not printer then printer = print end + if not threshold then threshold = 0 end + for func, count in pairs(debugger.counters) do + if count > threshold then + printer(string.format("%8i %s\n", count, debugger.getname(func))) + end + end +end + +function debugger.savestats(filename,threshold) + local f = io.open(filename,'w') + if f then + debugger.showstats(function(str) f:write(str) end,threshold) + f:close() + end +end + +function debugger.enable() + debug.sethook(debugger.hook,"c") +end + +function debugger.disable() + debug.sethook() +--~ debugger.counters[debug.getinfo(2,"f").func] = nil +end + +function debugger.tracing() + return tonumber((os.env['MTX.TRACE.CALLS'] or os.env['MTX_TRACE_CALLS'] or 0)) > 0 +end + +--~ debugger.enable() + +--~ print(math.sin(1*.5)) +--~ print(math.sin(1*.5)) +--~ print(math.sin(1*.5)) +--~ print(math.sin(1*.5)) +--~ print(math.sin(1*.5)) + +--~ debugger.disable() + +--~ print("") +--~ debugger.showstats() +--~ print("") +--~ debugger.showstats(print,3) + diff --git a/tex/context/base/luat-uni.lua b/tex/context/base/luat-uni.lua new file mode 100644 index 000000000..06945ed2b --- /dev/null +++ b/tex/context/base/luat-uni.lua @@ -0,0 +1,23 @@ +-- filename : luat-uni.lua +-- comment : companion to luat-uni.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-uni'] = 1.001 + +function unicode.utf8.split(str) + lst = { } + -- for snippet in unicode.utf8.gfind(str,".") do + for snippet in string.utfcharacters(str) do + table.insert(lst,snippet) + end + return lst +end + +function unicode.utf8.each(str,fnc) + -- for snippet in unicode.utf8.gfind(str,".") do + for snippet in string.utfcharacters(str) do + fnc(snippet) + end +end diff --git a/tex/context/base/luat-uni.tex b/tex/context/base/luat-uni.tex new file mode 100644 index 000000000..453c8e0d8 --- /dev/null +++ b/tex/context/base/luat-uni.tex @@ -0,0 +1,33 @@ +%D \module +%D [ file=luat-uni, +%D version=2006.04.25, +%D title=\CONTEXT\ Lua Macros, +%D subtitle=Unicode Support, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Lua Support Macros (unicode)} + +\registerctxluafile{luat-uni}{1.001} + +% \defconvertedargument\ascii{ÀÁÂÃÄÅàáâãäå} +% +% \lua{ tex.print ("\ascii")} +% \lua{ tex.print(unicode.utf8.reverse ("\ascii"))} +% \lua{ tex.print(unicode.utf8.lower ("\ascii"))} +% \lua{ tex.print(unicode.utf8.upper ("\ascii"))} +% \lua{ tex.print(unicode.utf8.len ("\ascii"))} +% \lua{ tex.print(table.getn(unicode.utf8.split("\ascii"))}} +% +% \lua{unicode.utf8.each("\ascii", function(chr) tex.print("["..chr.."]") end)} + +\let\UnicodeOne \gobbleoneargument +\let\UnicodeTwo \gobbleoneargument +\let\UnicodeThree\gobbleoneargument + +\endinput diff --git a/tex/context/base/luat-zip.lua b/tex/context/base/luat-zip.lua new file mode 100644 index 000000000..fbf00a47e --- /dev/null +++ b/tex/context/base/luat-zip.lua @@ -0,0 +1,221 @@ +-- filename : luat-zip.lua +-- comment : companion to luat-lib.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['luat-zip'] = 1.001 + +if zip and input then + zip.supported = true +else + zip = { } + zip.supported = false +end + +if not zip.supported then + + if not input then input = { } end -- will go away + + function zip.openarchive (...) return nil end -- needed ? + function zip.closenarchive (...) end -- needed ? + function input.registerzipfile (...) end -- needed ? + function input.usezipfile (...) end -- needed ? + +else + + function input.locators.zip(instance,specification) + local name, spec = specification:match("^(.-)##(.-)$") + local f = io.open(name or specification) + if f then -- todo: reuse code + input.logger('! zip locator', specification..' found') + if name and spec then + input.aux.append_hash(instance,'zip',"zip##"..specification,name) + input.aux.extend_texmf_var(instance, "zip##"..specification) + else + input.aux.append_hash(instance,'zip',"zip##"..specification.."##",specification) + input.aux.extend_texmf_var(instance, "zip##"..specification.."##") + end + f:close() + else + input.logger('? zip locator', specification..' not found') + end + end + + function input.hashers.zip(instance,tag,name) + input.report("loading zip file",name,"as",tag) + input.registerzipfile(instance,name,tag) + end + + function input.concatinators.zip(tag,path,name) + return tag .. path .. '/' .. name + end + + function input.is_readable.zip(name) + return true + end + + function input.finders.zip(instance,filename,filetype) + local archive, dataname = filename:match("^(.+)##/*(.+)$") + if archive and dataname then + local zfile = zip.openarchive(archive) + if not zfile then + archive = input.find_file(instance,archive,filetype) + zfile = zip.openarchive(archive) + end + if zfile then + input.logger('! zip finder',archive) + local dfile = zfile:open(dataname) + if dfile then + dfile = zfile:close() + input.logger('+ zip finder',filename) + return 'zip##' .. filename + end + else + input.logger('? zip finder',archive) + end + end + input.logger('- zip finder',filename) + return unpack(input.finders.notfound) + end + + function input.openers.zip(instance,filename) + if filename and filename ~= "" then + local archive, dataname = filename:match("^(.-)##/*(.+)$") + if archive and dataname then + local zfile= zip.openarchive(archive) + if zfile then + input.logger('+ zip starter',archive) + local dfile = zfile:open(dataname) + if dfile then + input.show_open(filename) + return input.openers.text_opener(filename,dfile,'zip') + end + else + input.logger('- zip starter',archive) + end + end + end + input.logger('- zip opener',filename) + return unpack(input.openers.notfound) + end + + function input.loaders.zip(instance, filename) -- we could use input.openers.zip + if filename and filename ~= "" then + input.logger('= zip loader',filename) + local archive, dataname = filename:match("^(.+)##/*(.+)$") + if archive and dataname then + local zfile = zip.openarchive(archive) + if zfile then + input.logger('= zip starter',archive) + local dfile = zfile:open(dataname) + if dfile then + input.show_load(filename) + input.logger('+ zip loader',filename) + local s = dfile:read("*all") + dfile:close() + return true, s, #s + end + else + input.logger('- zip starter',archive) + end + end + end + input.logger('- zip loader',filename) + return unpack(input.loaders.notfound) + end + + zip.archives = { } + zip.registeredfiles = { } + + function zip.openarchive(name) + if name and name ~= "" and not zip.archives[name] then + zip.archives[name] = zip.open(name) + end + return zip.archives[name] + end + + function zip.closearchive(name) + if zip.archives[name] then + zip.close(archives[name]) + zip.archives[name] = nil + end + end + + -- aparte register maken voor user (register tex / zip), runtime tree register + -- todo: alleen url syntax toestaan + -- user function: also handle zip::name::path + + function input.usezipfile(instance,zipname) -- todo zip:// + zipname = input.normalize_name(zipname) + if not zipname:find("^zip##") then + zipname = "zip##"..zipname + end + input.logger('! zip user','file '..zipname) + if not zipname:find("^zip##(.+)##(.-)$") then + zipname = zipname .. "##" -- dummy spec + end + local tag = zipname + local name = zipname:match("zip##(.+)##.-") + input.aux.prepend_hash(instance,'zip',tag,name) + input.aux.extend_texmf_var(instance, tag) + input.registerzipfile(instance,name,tag) + end + + function input.registerzipfile(instance,zipname,tag) + if not zip.registeredfiles[zipname] then + input.start_timing(instance) + local z = zip.open(zipname) + if not z then + zipname = input.find_file(instance,zipname) + z = zip.open(zipname) + end + if z then + input.logger("= zipfile","registering "..zipname) + zip.registeredfiles[zipname] = z + input.aux.register_zip_file(instance,zipname,tag) + else + input.logger("? zipfile","unknown "..zipname) + end + input.stop_timing(instance) + end + end + + function input.aux.register_zip_file(instance,zipname,tagname) + if zip.registeredfiles[zipname] then + if not tagname:find("^zip##") then + tagname = "zip##" .. tagname + end + local path, name, n = nil, nil, 0 + if not instance.files[tagname] then + instance.files[tagname] = { } + end + local files, filter = instance.files[tagname], "" + local subtree = tagname:match("^zip##.+##(.+)$") + if subtree then + filter = "^"..subtree.."/(.+)/(.-)$" + else + filter = "^(.+)/(.-)$" + end + input.logger('= zip filter',filter) + -- we can consider putting a files.luc in the file + local register = input.aux.register_file + for i, _ in zip.registeredfiles[zipname]:files() do + path, name = i.filename:match(filter) + if path then + if name and name ~= '' then + register(files, name, path) + n = n + 1 + else + -- directory + end + else + register(files, i.filename, '') + n = n + 1 + end + end + input.report(n, 'entries in', zipname) + end + end + +end diff --git a/tex/context/base/meta-pdf.lua b/tex/context/base/meta-pdf.lua new file mode 100644 index 000000000..56e09bb1f --- /dev/null +++ b/tex/context/base/meta-pdf.lua @@ -0,0 +1,585 @@ +-- filename : meta-pdf.lua +-- comment : companion to meta-pdf.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- This is the third version. Version 1 converted to Lua code, +-- version 2 gsubbed the file into TeX code, and version 3 uses +-- the new lpeg functionality and streams the result into TeX. + +--~ old lpeg 0.4 lpeg 0.5 +--~ 100 times test graphic 2.45 (T:1.07) 0.72 (T:0.24) 0.580 (0.560 no table) -- 0.54 optimized for one space (T:0.19) +--~ 100 times big graphic 10.44 4.30/3.35 nogb 2.914 (2.050 no table) -- 1.99 optimized for one space (T:0.85) +--~ 500 times test graphic T:1.29 T:1.16 (T:1.10 no table) -- T:1.10 + +if not versions then versions = { } end versions['meta-pdf'] = 1.003 + +mptopdf = { } +mptopdf.parsers = { } +mptopdf.parser = 'none' + +function mptopdf.reset() + mptopdf.data = "" + mptopdf.path = { } + mptopdf.stack = { } + mptopdf.texts = { } + mptopdf.version = 0 + mptopdf.shortcuts = false + mptopdf.resetpath() +end + +function mptopdf.resetpath() + mptopdf.stack.close = false + mptopdf.stack.path = { } + mptopdf.stack.concat = nil + mptopdf.stack.special = false +end + +mptopdf.reset() + +function mptopdf.parsers.none() + -- no parser set +end + +function mptopdf.parse() + mptopdf.parsers[mptopdf.parser]() +end + +-- shared code + +mptopdf.steps = { } + +mptopdf.descapes = { + ['('] = "\\\\char40 ", + [')'] = "\\\\char41 ", + ['"'] = "\\\\char92 " +} + +function mptopdf.descape(str) + str = str:gsub("\\(%d%d%d)",function(n) + return "\\char" .. tonumber(n,8) .. " " + end) + return str:gsub("\\([%(%)\\])",mptopdf.descapes) +end + +-- old code + +function mptopdf.steps.descape(str) + str = str:gsub("\\(%d%d%d)",function(n) + return "\\\\char" .. tonumber(n,8) .. " " + end) + return str:gsub("\\([%(%)\\])",mptopdf.descapes) +end + +function mptopdf.steps.strip() -- .3 per expr + mptopdf.data = mptopdf.data:gsub("^(.-)%%+Page:.-%c+(.*)%s+%a+%s+%%+EOF.*$", function(preamble, graphic) + local bbox = "0 0 0 0" + for b in preamble:gmatch("%%%%%a+oundingBox: +(.-)%c+") do + bbox = b + end + local name, version = preamble:gmatch("%%%%Creator: +(.-) +(.-) ") + mptopdf.version = tostring(version or "0") + if preamble:find("/hlw{0 dtransform") then + mptopdf.shortcuts = true + end + -- the boundingbox specification needs to come before data, well, not really + return bbox .. " boundingbox\n" .. "\nbegindata\n" .. graphic .. "\nenddata\n" + end, 1) + mptopdf.data = mptopdf.data:gsub("%%%%MetaPostSpecials: +(.-)%c+", "%1 specials\n", 1) + mptopdf.data = mptopdf.data:gsub("%%%%MetaPostSpecial: +(.-)%c+", "%1 special\n") + mptopdf.data = mptopdf.data:gsub("%%.-%c+", "") +end + +function mptopdf.steps.cleanup() + if not mptopdf.shortcuts then + mptopdf.data = mptopdf.data:gsub("gsave%s+fill%s+grestore%s+stroke", "both") + mptopdf.data = mptopdf.data:gsub("([%d%.]+)%s+([%d%.]+)%s+dtransform%s+exch%s+truncate%s+exch%s+idtransform%s+pop%s+setlinewidth", function(wx,wy) + if tonumber(wx) > 0 then return wx .. " setlinewidth" else return wy .. " setlinewidth" end + end) + mptopdf.data = mptopdf.data:gsub("([%d%.]+)%s+([%d%.]+)%s+dtransform%s+truncate%s+idtransform%s+setlinewidth%s+pop", function(wx,wy) + if tonumber(wx) > 0 then return wx .. " setlinewidth" else return wy .. " setlinewidth" end + end) + end +end + +function mptopdf.steps.convert() + mptopdf.data = mptopdf.data:gsub("%c%((.-)%) (.-) (.-) fshow", function(str,font,scale) + table.insert(mptopdf.texts,{mptopdf.steps.descape(str), font, scale}) + return "\n" .. #mptopdf.texts .. " textext" + end) + mptopdf.data = mptopdf.data:gsub("%[%s*(.-)%s*%]", function(str) + return str:gsub("%s+"," ") + end) + local t + mptopdf.data = mptopdf.data:gsub("%s*([^%a]-)%s*(%a+)", function(args,cmd) + if cmd == "textext" then + t = mptopdf.texts[tonumber(args)] + return "mp.textext(" .. "\"" .. t[2] .. "\"," .. t[3] .. ",\"" .. t[1] .. "\")\n" + else + return "mp." .. cmd .. "(" .. args:gsub(" +",",") .. ")\n" + end + end) +end + +function mptopdf.steps.process() + assert(loadstring(mptopdf.data))() -- () runs the loaded chunk +end + +function mptopdf.parsers.gsub() + mptopdf.steps.strip() + mptopdf.steps.cleanup() + mptopdf.steps.convert() + mptopdf.steps.process() +end + +-- end of old code + +-- from lua to tex + +function mptopdf.pdfcode(str) + tex.sprint(tex.ctxcatcodes,"\\PDFcode{" .. str .. "}") +end + +function mptopdf.texcode(str) + tex.sprint(tex.ctxcatcodes,str) +end + +-- auxiliary functions + +function mptopdf.flushconcat() + if mptopdf.stack.concat then + mptopdf.pdfcode(table.concat(mptopdf.stack.concat," ") .. " cm") + mptopdf.stack.concat = nil + end +end + +function mptopdf.flushpath(cmd) + if #mptopdf.stack.path > 0 then + local path = { } + if mptopdf.stack.concat then + local sx, sy = mptopdf.stack.concat[1], mptopdf.stack.concat[4] + local rx, ry = mptopdf.stack.concat[2], mptopdf.stack.concat[3] + local tx, ty = mptopdf.stack.concat[5], mptopdf.stack.concat[6] + local d = (sx*sy) - (rx*ry) + local function concat(px, py) + return (sy*(px-tx)-ry*(py-ty))/d, (sx*(py-ty)-rx*(px-tx))/d + end + for _,v in pairs(mptopdf.stack.path) do + v[1],v[2] = concat(v[1],v[2]) + if #v == 7 then + v[3],v[4] = concat(v[3],v[4]) + v[5],v[6] = concat(v[5],v[6]) + end + table.insert(path, table.concat(v," ")) + end + else + for _,v in pairs(mptopdf.stack.path) do + table.insert(path, table.concat(v," ")) + end + end + mptopdf.flushconcat() + mptopdf.texcode("\\MPSpath{" .. table.concat(path," ") .. "}") + if mptopdf.stack.close then + mptopdf.texcode("\\MPScode{h " .. cmd .. "}") + else + mptopdf.texcode("\\MPScode{" .. cmd .."}") + end + end + mptopdf.resetpath() +end + +if texmf and texmf.instance then + function mptopdf.loaded(name) + local ok, n + mptopdf.reset() + ok, mptopdf.data, n = input.loadbinfile(texmf.instance, name, 'tex') -- we need a binary load ! + return ok + end +else + function mptopdf.loaded(name) + local f = io.open(name, 'rb') + if f then + mptopdf.reset() + mptopdf.data = f:read('*all') + f:close() + return true + else + return false + end + end +end + +if not mptopdf.parse then + function mptopdf.parse() end -- forward declaration +end + +function mptopdf.convertmpstopdf(name) + if mptopdf.loaded(name) then + garbagecollector.push() + input.start_timing(mptopdf) + mptopdf.parse() + mptopdf.reset() + input.stop_timing(mptopdf) + garbagecollector.pop() + else + tex.print("file " .. name .. " not found") + end +end + +-- mp interface + +mp = { } + +function mp.creator(a, b, c) + mptopdf.version = tonumber(b) +end + +function mp.creationdate(a) + mptopdf.date= a +end + +function mp.newpath() + mptopdf.stack.path = { } +end + +function mp.boundingbox(llx, lly, urx, ury) + mptopdf.texcode("\\MPSboundingbox{" .. llx .. "}{" .. lly .. "}{" .. urx .. "}{" .. ury .. "}") +end + +function mp.moveto(x,y) + mptopdf.stack.path[#mptopdf.stack.path+1] = {x,y,"m"} +end + +function mp.curveto(ax, ay, bx, by, cx, cy) + mptopdf.stack.path[#mptopdf.stack.path+1] = {ax,ay,bx,by,cx,cy,"c"} +end + +function mp.lineto(x,y) + mptopdf.stack.path[#mptopdf.stack.path+1] = {x,y,"l"} +end + +function mp.rlineto(x,y) + local dx, dy = 0, 0 + if #mptopdf.stack.path > 0 then + dx, dy = mptopdf.stack.path[#mptopdf.stack.path][1], mptopdf.stack.path[#mptopdf.stack.path][2] + end + mptopdf.stack.path[#mptopdf.stack.path+1] = {dx,dy,"l"} +end + +function mp.translate(tx,ty) + mptopdf.pdfcode("1 0 0 0 1 " .. tx .. " " .. ty .. " cm") +end + +function mp.scale(sx,sy) + mptopdf.stack.concat = {sx,0,0,sy,0,0} +end + +function mp.concat(sx, rx, ry, sy, tx, ty) + mptopdf.stack.concat = {sx,rx,ry,sy,tx,ty} +end + +function mp.setlinejoin(d) + mptopdf.pdfcode(d .. " j") +end + +function mp.setlinecap(d) + mptopdf.pdfcode(d .. " J") +end + +function mp.setmiterlimit(d) + mptopdf.pdfcode(d .. " M") +end + +function mp.gsave() + mptopdf.pdfcode("q") +end + +function mp.grestore() + mptopdf.pdfcode("Q") +end + +function mp.setdash(...) + local n = select("#",...) + mptopdf.pdfcode("[" .. table.concat({...}," ",1,n-1) .. "] " .. select(n,...) .. " d") +end + +function mp.resetdash() + mptopdf.pdfcode("[ ] 0 d") +end + +function mp.setlinewidth(d) + mptopdf.pdfcode(d .. " w") +end + +function mp.closepath() + mptopdf.stack.close = true +end + +function mp.fill() + mptopdf.flushpath('f') +end + +function mp.stroke() + mptopdf.flushpath('S') +end + +function mp.both() + mptopdf.flushpath('B') +end + +function mp.clip() + mptopdf.flushpath('W n') +end + +function mp.textext(font, scale, str) -- old parser + local dx, dy = 0, 0 + if #mptopdf.stack.path > 0 then + dx, dy = mptopdf.stack.path[1][1], mptopdf.stack.path[1][2] + end + mptopdf.flushconcat() + mptopdf.texcode("\\MPStextext{"..font.."}{"..scale.."}{"..str.."}{"..dx.."}{"..dy.."}") + mptopdf.resetpath() +end + +function mp.fshow(str,font,scale) -- lpeg parser + mp.textext(font,scale,mptopdf.descape(str)) +--~ local dx, dy = 0, 0 +--~ if #mptopdf.stack.path > 0 then +--~ dx, dy = mptopdf.stack.path[1][1], mptopdf.stack.path[1][2] +--~ end +--~ mptopdf.flushconcat() +--~ mptopdf.texcode("\\MPStextext{"..font.."}{"..scale.."}{"..mptopdf.descape(str).."}{"..dx.."}{"..dy.."}") +--~ mptopdf.resetpath() +end + + +--~ function mp.handletext(font,scale.str,dx,dy) +--~ local one, two = string.match(str, "^(%d+)::::(%d+)") +--~ if one and two then +--~ mptopdf.texcode("\\MPTOPDFtextext{"..font.."}{"..scale.."}{"..one.."}{"..two.."}{"..dx.."}{"..dy.."}") +--~ else +--~ mptopdf.texcode("\\MPTOPDFtexcode{"..font.."}{"..scale.."}{"..str.."}{"..dx.."}{"..dy.."}") +--~ end +--~ end + +function mp.setrgbcolor(r,g,b) -- extra check + r, g = tonumber(r), tonumber(g) -- needed when we use lpeg + if r == 0.0123 and g < 0.01 then + mptopdf.texcode("\\MPSspecial{" .. g*10000 .. "}{" .. b*10000 .. "}") + elseif r == 0.123 and r < 0.1 then + mptopdf.texcode("\\MPSspecial{" .. g* 1000 .. "}{" .. b* 1000 .. "}") + else + mptopdf.texcode("\\MPSrgb{" .. r .. "}{" .. g .. "}{" .. b .. "}") + end +end + +function mp.setcmykcolor(c,m,y,k) + mptopdf.texcode("\\MPScmyk{" .. c .. "}{" .. m .. "}{" .. y .. "}{" .. k .. "}") +end + +function mp.setgray(s) + mptopdf.texcode("\\MPSgray{" .. s .. "}") +end + +function mp.specials(version,signal,factor) -- 2.0 123 1000 +end + +function mp.special(...) -- 7 1 0.5 1 0 0 1 3 + local n = select("#",...) + mptopdf.texcode("\\MPSbegin\\MPSset{" .. table.concat({...},"}\\MPSset{",2,n) .. "}\\MPSend") +end + +function mp.begindata() +end + +function mp.enddata() +end + +function mp.showpage() +end + +mp.n = mp.newpath -- n +mp.p = mp.closepath -- h +mp.l = mp.lineto -- l +mp.r = mp.rlineto -- r +mp.m = mp.moveto -- m +mp.c = mp.curveto -- c +mp.hlw = mp.setlinewidth +mp.vlw = mp.setlinewidth + +mp.C = mp.setcmykcolor -- k +mp.G = mp.setgray -- g +mp.R = mp.setrgbcolor -- rg + +mp.lj = mp.setlinejoin -- j +mp.ml = mp.setmiterlimit -- M +mp.lc = mp.setlinecap -- J +mp.sd = mp.setdash -- d +mp.rd = mp.resetdash + +mp.S = mp.stroke -- S +mp.F = mp.fill -- f +mp.B = mp.both -- B +mp.W = mp.clip -- W + +mp.q = mp.gsave -- q +mp.Q = mp.grestore -- Q + +mp.s = mp.scale -- (not in pdf) +mp.t = mp.concat -- (not the same as pdf anyway) + +mp.P = mp.showpage + +-- experimental + +function mp.attribute(id,value) + mptopdf.texcode("\\attribute " .. id .. "=" .. value .. " ") +-- mptopdf.texcode("\\dompattribute{" .. id .. "}{" .. value .. "}") +end + +-- lpeg parser + +-- The lpeg based parser is rather optimized for the kind of output +-- that MetaPost produces. It's my first real lpeg code, which may +-- show. Because the parser binds to functions, we define it last. + +do + + local eol = lpeg.S('\r\n')^1 + local sp = lpeg.P(' ')^1 + local space = lpeg.S(' \r\n')^1 + local number = lpeg.S('0123456789.-+')^1 + local nonspace = lpeg.P(1-lpeg.S(' \r\n'))^1 + + local cnumber = lpeg.C(number) + local cstring = lpeg.C(nonspace) + + local specials = (lpeg.P("%%MetaPostSpecials:") * sp * (cstring * sp^0)^0 * eol) / mp.specials + local special = (lpeg.P("%%MetaPostSpecial:") * sp * (cstring * sp^0)^0 * eol) / mp.special + local boundingbox = (lpeg.P("%%BoundingBox:") * sp * (cnumber * sp^0)^4 * eol) / mp.boundingbox + local highresboundingbox = (lpeg.P("%%HiResBoundingBox:") * sp * (cnumber * sp^0)^4 * eol) / mp.boundingbox + + local setup = lpeg.P("%%BeginSetup") * (1 - lpeg.P("%%EndSetup") )^1 + local prolog = lpeg.P("%%BeginProlog") * (1 - lpeg.P("%%EndProlog"))^1 + local comment = lpeg.P('%')^1 * (1 - eol)^1 + + local curveto = ((cnumber * sp)^6 * lpeg.P("curveto") ) / mp.curveto + local lineto = ((cnumber * sp)^2 * lpeg.P("lineto") ) / mp.lineto + local rlineto = ((cnumber * sp)^2 * lpeg.P("rlineto") ) / mp.rlineto + local moveto = ((cnumber * sp)^2 * lpeg.P("moveto") ) / mp.moveto + local setrgbcolor = ((cnumber * sp)^3 * lpeg.P("setrgbcolor") ) / mp.setrgbcolor + local setcmykcolor = ((cnumber * sp)^4 * lpeg.P("setcmykcolor") ) / mp.setcmykcolor + local setgray = ((cnumber * sp)^1 * lpeg.P("setgray") ) / mp.setgray + local newpath = ( lpeg.P("newpath") ) / mp.newpath + local closepath = ( lpeg.P("closepath") ) / mp.closepath + local fill = ( lpeg.P("fill") ) / mp.fill + local stroke = ( lpeg.P("stroke") ) / mp.stroke + local clip = ( lpeg.P("clip") ) / mp.clip + local both = ( lpeg.P("gsave fill grestore")) / mp.both + local showpage = ( lpeg.P("showpage") ) + local setlinejoin = ((cnumber * sp)^1 * lpeg.P("setlinejoin") ) / mp.setlinejoin + local setlinecap = ((cnumber * sp)^1 * lpeg.P("setlinecap") ) / mp.setlinecap + local setmiterlimit = ((cnumber * sp)^1 * lpeg.P("setmiterlimit") ) / mp.setmiterlimit + local gsave = ( lpeg.P("gsave") ) / mp.gsave + local grestore = ( lpeg.P("grestore") ) / mp.grestore + + local setdash = (lpeg.P("[") * (cnumber * sp^0)^0 * lpeg.P("]") * sp * cnumber * sp * lpeg.P("setdash")) / mp.setdash + local concat = (lpeg.P("[") * (cnumber * sp^0)^6 * lpeg.P("]") * sp * lpeg.P("concat") ) / mp.concat + local scale = ( (cnumber * sp^0)^6 * sp * lpeg.P("concat") ) / mp.concat + + local fshow = (lpeg.P("(") * lpeg.C((1-lpeg.P(")"))^1) * lpeg.P(")") * space * lpeg.C(lpeg.P((1-space)^1)) * space * cnumber * space * lpeg.P("fshow")) / mp.fshow + local fshow = (lpeg.P("(") * lpeg.C((1-lpeg.P(")"))^1) * lpeg.P(")") * space * cstring * space * cnumber * space * lpeg.P("fshow")) / mp.fshow + + local setlinewidth_x = (lpeg.P("0") * sp * cnumber * sp * lpeg.P("dtransform truncate idtransform setlinewidth pop")) / mp.setlinewidth + local setlinewidth_y = (cnumber * sp * lpeg.P("0 dtransform exch truncate exch idtransform pop setlinewidth") ) / mp.setlinewidth + + local c = ((cnumber * sp)^6 * lpeg.P("c") ) / mp.curveto -- ^6 very inefficient, ^1 ok too + local l = ((cnumber * sp)^2 * lpeg.P("l") ) / mp.lineto + local r = ((cnumber * sp)^2 * lpeg.P("r") ) / mp.rlineto + local m = ((cnumber * sp)^2 * lpeg.P("m") ) / mp.moveto + local vlw = ((cnumber * sp)^1 * lpeg.P("vlw")) / mp.setlinewidth + local hlw = ((cnumber * sp)^1 * lpeg.P("hlw")) / mp.setlinewidth + + local R = ((cnumber * sp)^3 * lpeg.P("R") ) / mp.setrgbcolor + local C = ((cnumber * sp)^4 * lpeg.P("C") ) / mp.setcmykcolor + local G = ((cnumber * sp)^1 * lpeg.P("G") ) / mp.setgray + + local lj = ((cnumber * sp)^1 * lpeg.P("lj") ) / mp.setlinejoin + local ml = ((cnumber * sp)^1 * lpeg.P("ml") ) / mp.setmiterlimit + local lc = ((cnumber * sp)^1 * lpeg.P("lc") ) / mp.setlinecap + + local n = lpeg.P("n") / mp.newpath + local p = lpeg.P("p") / mp.closepath + local S = lpeg.P("S") / mp.stroke + local F = lpeg.P("F") / mp.fill + local B = lpeg.P("B") / mp.both + local W = lpeg.P("W") / mp.clip + local P = lpeg.P("P") / mp.showpage + + local q = lpeg.P("q") / mp.gsave + local Q = lpeg.P("Q") / mp.grestore + + local sd = (lpeg.P("[") * (cnumber * sp^0)^0 * lpeg.P("]") * sp * cnumber * sp * lpeg.P("sd")) / mp.setdash + local rd = ( lpeg.P("rd")) / mp.resetdash + + local s = ( (cnumber * sp^0)^2 * sp * lpeg.P("s") ) / mp.scale + local t = (lpeg.P("[") * (cnumber * sp^0)^6 * lpeg.P("]") * sp * lpeg.P("t") ) / mp.concat + + -- experimental + + local attribute = ((cnumber * sp)^2 * lpeg.P("attribute")) / mp.attribute + local A = ((cnumber * sp)^2 * lpeg.P("A")) / mp.attribute + + + local preamble = ( + prolog + setup + + boundingbox + highresboundingbox + specials + special + + comment + ) + + local procset = ( + lj + ml + lc + + c + l + m + n + p + r + +A + + R + C + G + + S + F + B + W + + vlw + hlw + + Q + q + + sd + rd + + t + s + + fshow + + P + ) + + local verbose = ( + curveto + lineto + moveto + newpath + closepath + rlineto + + setrgbcolor + setcmykcolor + setgray + +attribute + + setlinejoin + setmiterlimit + setlinecap + + stroke + fill + clip + both + + setlinewidth_x + setlinewidth_y + + gsave + grestore + + concat + scale + + fshow + + setdash + -- no resetdash + showpage + ) + + -- order matters in terms of speed / we could check for procset first + + local captures_old = ( space + verbose + preamble )^0 + local captures_new = ( space + procset + preamble + verbose )^0 + + function mptopdf.parsers.lpeg() + if mptopdf.data:find("%%%%BeginResource: procset mpost") then +--~ if mptopdf.data:find("/bd{bind def}bind def") then -- bug in mp + lpeg.match(captures_new,mptopdf.data) + else + lpeg.match(captures_old,mptopdf.data) + end + end + +end + +mptopdf.parser = 'lpeg' diff --git a/tex/context/base/meta-pdf.mkiv b/tex/context/base/meta-pdf.mkiv new file mode 100644 index 000000000..dadf760a6 --- /dev/null +++ b/tex/context/base/meta-pdf.mkiv @@ -0,0 +1,155 @@ +%D \module +%D [ file=meta-pdf, +%D version=2006.29.09, +%D title=\CONTEXT\ Support Macros, +%D subtitle=\METAPOST\ to \PDF\ conversion, +%D author=Hans Hagen \& others (see text), +%D date=\currentdate, +%D copyright=\PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +% Using test case at end of meta-pdf.tex: +% +% \useMPgraphic{1} +% \testfeatureonce{250}{\setbox0\hbox{\convertMPtoPDF{test-mps-mpgraph.1}{1}{1}}} +% +% 8.4 : mkii, direct parsing by tex +% 11.8 : mkiv, dirty conversion (10.8 with dirty tricks) +% 14.5 : mkiv, clean conversion +% 7.4 : mkiv, simulated clean direct lua from mp +% 0.3 : time taken by tex to handle converted code + +% Maybe delayed load, only at first call of the converter. + +\registerctxluafile{meta-pdf}{1.003} + +%D Plugin. + +\def\mkconvertMPtoPDF + {\vbox\bgroup + \forgetall + \offinterlineskip + %\ifcase\blackoutMPgraphic\or\PDFcode{0 g 0 G}\fi % fixed in mp + \setbox\scratchbox\vbox\bgroup + \setnormalcatcodes % we can be in verbatim or so + \message{[MP to PDF]}% + \startMPresources + \PDFcomment{mps begin}% + \PDFcode{q 1 0 0 1 0 0 cm}% + \ctxlua{mptopdf.convertmpstopdf("\MPfilename")}\removeunwantedspaces + \PDFcode{Q}% + \PDFcomment{mps end}% + \stopMPresources + \egroup + \setbox\scratchbox\hbox\bgroup + \hskip-\MPllx\onebasepoint + \raise-\MPlly\onebasepoint + \box\scratchbox + \egroup + \setbox\scratchbox\vbox to \MPheight\bgroup + \vfill + \hsize\MPwidth + \smashbox\scratchbox + \box\scratchbox + \egroup + \wd\scratchbox\MPwidth + \ht\scratchbox\MPheight + \dopackageMPgraphic\scratchbox + \egroup} + +\let\mkprocessMPtoPDFfile\mkconvertMPtoPDF + +% \def\TEXcode#1#2#3#4#5% +% {\setbox\scratchbox\hbox +% {\font\temp=#1\space at #2\onebasepoint +% \temp +% \MPfshowcommand{#3}}% +% \setbox\scratchbox\hbox +% {\hskip#4\onebasepoint +% \raise#5\onebasepoint +% \box\scratchbox}% +% \smashbox\scratchbox +% \box\scratchbox} + +% will be done better + +\def\MPStextext#1#2#3#4#5% if we clean up this plugin model, we can + {\def\MPtextdata{#3}% % delegate the splitter to lua + \def\MPtextsize{#2}% + \def\lastMPmoveX{#4}% + \def\lastMPmoveY{#5}% + \convertcommand\MPtextdata\to\MPtextdata + \splitstring\MPtextdata\at::::\to\MPtexttag\and\MPtextnumber + \executeifdefined{handleMPtext\MPtexttag} + {\setbox\scratchbox\hbox + {\font\temp=#1\space at #2\onebasepoint + \temp + \MPfshowcommand{#3}}% + \setbox\scratchbox\hbox + {\hskip#4\onebasepoint + \raise#5\onebasepoint + \box\scratchbox}% + \smashbox\scratchbox + \box\scratchbox}} + +%D We save the special variables on a stack. It's not that +%D fast, but it make implementing the special more convenient. + +\def\MPSbegin + {\nofMParguments\zerocount} + +\def\MPSend + {\csname\MPspecial\endcsname} + +\def\MPSset + {\advance\nofMParguments\plusone + \expandafter\def\csname\@@MP\number\nofMParguments\endcsname} + +\def\gMPs#1{\csname\@@MP\number#1\endcsname} + +%D The boundingbox. + +\def\MPSboundingbox#1#2#3#4% + {\xdef\MPllx{#1} + \xdef\MPlly{#2} + \xdef\MPurx{#3} + \xdef\MPury{#4} + \xdef\MPwidth {\the\dimexpr#3\onebasepoint-#1\onebasepoint\relax} + \xdef\MPheight{\the\dimexpr#4\onebasepoint-#2\onebasepoint\relax}} + +\MPSboundingbox0000 + +\def\MPSspecial#1#2% + {\csname\@@MPSK#2\endcsname} + +%D A path is (in most cases) just a sequence of \PDF\ commands. + +% \newcontitional\ignoreMPpath + +\def\MPSpath + {\PDFcode} + +\def\MPScode % hack, will be improved + {\ifconditional\ignoreMPpath + \PDFcode{h W n}% + \ifx\extraMPpathcode\empty\else + \PDFcode{\extraMPpathcode}% + \let\extraMPpathcode\empty + \fi + \setfalse\ignoreMPpath + \expandafter\gobbleoneargument + \else + \expandafter\PDFcode + \fi} + +\let\MPSrgb \dohandleMPrgb +\let\MPScmyk\dohandleMPcmyk +\let\MPSgray\dohandleMPgray +\let\MPSspot\dohandleMPspot + +\protect \endinput diff --git a/tex/context/base/mult-sys.tex b/tex/context/base/mult-sys.tex index 2b2cefe99..f10e91cfe 100644 --- a/tex/context/base/mult-sys.tex +++ b/tex/context/base/mult-sys.tex @@ -108,6 +108,7 @@ \definemessageconstant {structures} \definemessageconstant {symbols} \definemessageconstant {systems} +\definemessageconstant {lua} \definemessageconstant {textblocks} \definemessageconstant {verbatims} \definemessageconstant {versions} diff --git a/tex/context/base/node-ini.lua b/tex/context/base/node-ini.lua new file mode 100644 index 000000000..77835e04b --- /dev/null +++ b/tex/context/base/node-ini.lua @@ -0,0 +1,905 @@ +if not modules then modules = { } end modules ['node-ini'] = { + version = 1.001, + comment = "companion to node-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

Access to nodes is what gives its power. Here we +implement a few helper functions.

+--ldx]]-- + +nodes = nodes or { } +nodes.trace = false + +-- handy helpers + +do + + local remove, free = node.remove, node.free + + function nodes.remove(head, current, free_too) + local t = current + head, current = remove(head,current) + if t then + if free_too then + free(t) + t = nil + else + t.next, t.prev = nil, nil + end + end + return head, current, t + end + + function nodes.delete(head,current) + return nodes.remove(head,current,true) + end + + nodes.before = node.insert_before + nodes.after = node.insert_after + + function nodes.show_list(head, message) + if message then + texio.write_nl(message) + end + for n in node.traverse(head) do + texio.write_nl(tostring(n)) + end + end + +end + +-- will move + +nodes.processors = { } +nodes.processors.char = { } +nodes.processors.char.proc = { } + +function nodes.report(t,done) + if nodes.trace then + if done then + if status.output_active then + texio.write(string.format("<++ %s>",nodes.count(t))) + else + texio.write(string.format("<+ %s>",nodes.count(t))) + end + else + if status.output_active then + texio.write(string.format("<-- %s>",nodes.count(t))) + else + texio.write(string.format("<- %s>",nodes.count(t))) + end + end + end +end + +--~ function nodes.count(stack) +--~ if stack then +--~ local n = 0 +--~ for _, node in pairs(stack) do +--~ if node then +--~ local kind = node[1] +--~ if kind == 'hlist' or kind == 'vlist' then +--~ local content = node[8] +--~ if type(content) == "table" then +--~ n = n + 1 + nodes.count(content) -- self counts too +--~ else +--~ n = n + 1 +--~ end +--~ elseif kind == 'inline' then +--~ n = n + nodes.count(node[4]) -- self does not count +--~ else +--~ n = n + 1 +--~ end +--~ end +--~ end +--~ return n +--~ else +--~ return 0 +--~ end +--~ end + +do + + local hlist, vlist = node.id('hlist'), node.id('vlist') + + function nodes.count(stack) + local n = 0 + while stack do + local id = stack.id + if id == hlist or id == vlist then + local list = stack.list + if list then + n = n + 1 + nodes.count(list) -- self counts too + else + n = n + 1 + end + else + n = n + 1 + end + stack = stack.next + end + return n + end + +end + +--[[ldx-- +

When manipulating node lists in , we will remove +nodes and insert new ones. While node access was implemented, we did +quite some experiments in order to find out if manipulating nodes +in was feasible from the perspective of performance.

+ +

First of all, we noticed that the bottleneck is more with excessive +callbacks (some gets called very often) and the conversion from and to +'s datastructures. However, at the end, we +found that inserting and deleting nodes in a table could become a +bottleneck.

+ +

This resulted in two special situations in passing nodes back to +: a table entry with value false is ignored, +and when instead of a table true is returned, the +original table is used.

+ +

Insertion is handled (at least in as follows. When +we need to insert a node at a certain position, we change the node at +that position by a dummy node, tagged inline which itself +contains the original node and one or more new nodes. Before we pass +back the list we collapse the list. Of course collapsing could be built +into the engine, but this is a not so natural extension.

+ +

When we collapse (something that we only do when really needed), we +also ignore the empty nodes.

+--ldx]]-- + +--~ function nodes.inline(...) +--~ return { 'inline', 0, nil, { ... } } +--~ end + +--~ do + +--~ function collapse(stack,existing_t) +--~ if stack then +--~ local t = existing_t or { } +--~ for _, node in pairs(stack) do +--~ if node then +--~ -- if node[3] then node[3][1] = nil end -- remove status bit +--~ local kind = node[1] +--~ if kind == 'inline' then +--~ collapse(node[4],t) +--~ elseif kind == 'hlist' or kind == 'vlist' then +--~ local content = node[8] +--~ if type(content) == "table" then +--~ node[8] = collapse(content) +--~ end +--~ t[#t+1] = node +--~ else +--~ t[#t+1] = node +--~ end +--~ else +--~ -- deleted node +--~ end +--~ end +--~ return t +--~ else +--~ return stack +--~ end +--~ end + +--~ nodes.collapse = collapse + +--~ end + +--[[ldx-- +

The following function implements a generic node processor. A +generic processer is not that much needed, because we often need +to act differently for horizontal or vertical lists. For instance +counting nodes needs a different method (ok, we could add a second +handle for catching them but it would become messy then).

+--ldx]]-- + +--~ function nodes.each(stack,handle) +--~ if stack then +--~ local i = 1 +--~ while true do +--~ local node = stack[i] +--~ if node then +--~ local kind = node[1] +--~ if kind == 'hlist' or kind == 'vlist' then +--~ local content = node[8] +--~ if type(content) == "table" then +--~ nodes.each(content,handle) +--~ end +--~ elseif kind == 'inline' then +--~ nodes.each(node[4],handle) +--~ else +--~ stack[i] = handle(kind,node) +--~ end +--~ end +--~ i = i + 1 +--~ if i > #stack then +--~ break +--~ end +--~ end +--~ end +--~ end + +--~ function nodes.remove(stack,id,subid) -- "whatsit", 6 +--~ nodes.each(stack, function(kind,node) +--~ if kind == id and node[2] == subid then +--~ return false +--~ else +--~ return node +--~ end +--~ end) +--~ end + +--[[ldx-- +

Serializing nodes can be handy for tracing. Also, saving and +loading node lists can come in handy as soon we are going to +use external applications to process node lists.

+--ldx]]-- + +function nodes.show(stack) +--~ texio.write_nl(table.serialize(stack)) +end + +function nodes.save(stack,name) -- *.ltn : luatex node file +--~ if name then +--~ file.savedata(name,table.serialize(stack)) +--~ else +--~ texio.write_nl('log',table.serialize(stack)) +--~ end +end + +function nodes.load(name) +--~ return file.loaddata(name) +end + +-- node-cap.lua + +--~ nodes.capture = { } -- somehow fails + +--~ function nodes.capture.start(cbk) +--~ local head, tail = nil, nil +--~ callbacks.push(cbk, function(t) +--~ if tail then +--~ tail.next = t +--~ else +--~ head, tail = t, t +--~ end +--~ while tail.next do +--~ tail = tail.next +--~ end +--~ return false +--~ end) +--~ function nodes.capture.stop() +--~ function nodes.capture.stop() end +--~ function nodes.capture.get() +--~ function nodes.capture.get() end +--~ return head +--~ end +--~ callbacks.pop(cbk) +--~ end +--~ function nodes.capture.get() end -- error +--~ end + +--~ nodes.capture.stop = function() end +--~ nodes.capture.get = function() end + +-- node-gly.lua + +if not fonts then fonts = { } end +if not fonts.tfm then fonts.tfm = { } end +if not fonts.tfm.id then fonts.tfm.id = { } end + +--~ function nodes.do_process_glyphs(stack) +--~ if not stack or #stack == 0 then +--~ return false +--~ elseif #stack == 1 then +--~ local node = stack[1] +--~ if node then +--~ local kind = node[1] +--~ if kind == 'glyph' then +--~ local tfmdata = fonts.tfm.id[node[5]] -- we can use fonts.tfm.processor_id +--~ if tfmdata and tfmdata.shared and tfmdata.shared.processors then +--~ for _, func in pairs(tfmdata.shared.processors) do -- per font +--~ func(stack,1,node) +--~ end +--~ end +--~ elseif kind == 'hlist' or kind == "vlist" then +--~ local done = nodes.do_process_glyphs(node[8]) +--~ end +--~ return true +--~ else +--~ return false +--~ end +--~ else +--~ local font_ids = { } +--~ local done = false +--~ for _, v in pairs(stack) do +--~ if v then +--~ if v[1] == 'glyph' then +--~ local font_id = v[5] +--~ local tfmdata = fonts.tfm.id[font_id] -- we can use fonts.tfm.processor_id +--~ if tfmdata and tfmdata.shared and tfmdata.shared.processors then +--~ font_ids[font_id] = tfmdata.shared.processors +--~ end +--~ end +--~ end +--~ end +--~ if done then +--~ return false +--~ else +--~ -- todo: generic loop before +--~ for font_id, _ in pairs(font_ids) do +--~ for _, func in pairs(font_ids[font_id]) do -- per font +--~ local i = 1 +--~ while true do +--~ local node = stack[i] +--~ if node and node[1] == 'glyph' and node[5] == font_id then +--~ i = func(stack,i,node) +--~ end +--~ if i < #stack then +--~ i = i + 1 +--~ else +--~ break +--~ end +--~ end +--~ end +--~ end +--~ for i=1, #stack do +--~ local node = stack[i] +--~ if node then +--~ if node[1] == 'hlist' or node[1] == "vlist" then +--~ nodes.do_process_glyphs(node[8]) +--~ end +--~ end +--~ end +--~ return true +--~ end +--~ end +--~ end + +--~ function nodes.do_process_glyphs(stack) +--~ local function process_list(node) +--~ local done = false +--~ if node and node[1] == 'hlist' or node[1] == "vlist" then +--~ local attributes = node[3] +--~ if attributes then +--~ if not attributes[1] then +--~ nodes.do_process_glyphs(node[8]) +--~ attributes[1] = 1 +--~ done = true +--~ end +--~ else +--~ nodes.do_process_glyphs(node[8]) +--~ node[3] = { 1 } +--~ done = true +--~ end +--~ end +--~ return done +--~ end +--~ if not stack or #stack == 0 then +--~ return false +--~ elseif #stack == 1 then +--~ return process_list(stack[1]) +--~ else +--~ local font_ids, found = { }, false +--~ for _, node in ipairs(stack) do +--~ if node and node[1] == 'glyph' then +--~ local font_id = node[5] +--~ local tfmdata = fonts.tfm.id[font_id] -- we can use fonts.tfm.processor_id +--~ if tfmdata and tfmdata.shared and tfmdata.shared.processors then +--~ font_ids[font_id], found = tfmdata.shared.processors, true +--~ end +--~ end +--~ end +--~ if not found then +--~ return false +--~ else +--~ -- we need func to report a 'done' +--~ local done = false +--~ for font_id, font_func in pairs(font_ids) do +--~ for _, func in pairs(font_func) do -- per font +--~ local i = 1 +--~ while true do +--~ local node = stack[i] +--~ if node and node[1] == 'glyph' and node[5] == font_id then +--~ i = func(stack,i,node) +--~ done = true +--~ end +--~ if i < #stack then +--~ i = i + 1 +--~ else +--~ break +--~ end +--~ end +--~ end +--~ end +--~ for _, node in ipairs(stack) do +--~ if node then +--~ done = done or process_list(node) +--~ end +--~ end +--~ return done +--~ end +--~ end +--~ end + +--~ function nodes.process_glyphs(t,...) +--~ input.start_timing(nodes) +--~ local done = nodes.do_process_glyphs(t) +--~ if done then +--~ t = nodes.collapse(t) +--~ end +--~ input.stop_timing(nodes) +--~ nodes.report(t,done) +--~ if done then +--~ return t +--~ else +--~ return true +--~ end +--~ end + +--~ function nodes.do_process_glyphs(stack) +--~ local function process_list(node) +--~ local done = false +--~ if node and node[1] == 'hist' or node[1] == "vlist" then +--~ local attributes = node[3] +--~ if attributes then +--~ if attributes[1] then +--~ else +--~ local content = node[8] +--~ if type(content) == "table" then +--~ nodes.do_process_glyphs(content) +--~ end +--~ attributes[1] = 1 +--~ done = true +--~ end +--~ else +--~ nodes.do_process_glyphs(node[8]) +--~ node[3] = { 1 } +--~ done = true +--~ end +--~ end +--~ return done +--~ end +--~ if not stack or #stack == 0 then +--~ return false +--~ elseif #stack == 1 then +--~ return process_list(stack[1]) +--~ else +--~ local font_ids, found = { }, false +--~ for _, node in ipairs(stack) do +--~ if node and node[1] == 'glyph' then +--~ local font_id = node[5] +--~ local tfmdata = fonts.tfm.id[font_id] -- we can use fonts.tfm.processor_id +--~ if tfmdata and tfmdata.shared and tfmdata.shared.processors then +--~ font_ids[font_id], found = tfmdata.shared.processors, true +--~ end +--~ end +--~ end +--~ if not found then +--~ return false +--~ else +--~ -- we need func to report a 'done' +--~ local done = false +--~ for font_id, font_func in pairs(font_ids) do +--~ for _, func in pairs(font_func) do -- per font +--~ local i = 1 +--~ while true do +--~ local node = stack[i] +--~ if node and node[1] == 'glyph' and node[5] == font_id then +--~ i = func(stack,i,node) +--~ done = true +--~ end +--~ if i < #stack then +--~ i = i + 1 +--~ else +--~ break +--~ end +--~ end +--~ end +--~ end +--~ for _, node in ipairs(stack) do +--~ if node then +--~ done = done or process_list(node) +--~ end +--~ end +--~ return done +--~ end +--~ end +--~ end + +--~ function nodes.process_glyphs(t,...) +--~ if status.output_active then +--~ return true +--~ else +--~ input.start_timing(nodes) +--~ local done = nodes.do_process_glyphs(t) +--~ if done then +--~ t = nodes.collapse(t) +--~ end +--~ input.stop_timing(nodes) +--~ nodes.report(t,done) +--~ if done then +--~ return t +--~ else +--~ return true +--~ end +--~ end +--~ end + +--~ do + +--~ local function do_process_glyphs(stack) +--~ if not stack or #stack == 0 then +--~ return false +--~ elseif #stack == 1 and stack[1][1] ~= 'glyph' then +--~ return false +--~ else +--~ local font_ids, found = { }, false +--~ local fti = fonts.tfm.id +--~ for _, node in ipairs(stack) do +--~ if node and node[1] == 'glyph' then +--~ local font_id = node[5] +--~ local tfmdata = fti[font_id] -- we can use fonts.tfm.processor_id +--~ if tfmdata and tfmdata.shared and tfmdata.shared.processors then +--~ font_ids[font_id], found = tfmdata.shared.processors, true +--~ end +--~ end +--~ end +--~ if not found then +--~ return false +--~ else +--~ -- we need func to report a 'done' +--~ local done = false +--~ for font_id, font_func in pairs(font_ids) do +--~ for _, func in pairs(font_func) do -- per font +--~ local i = 1 +--~ while true do +--~ local node = stack[i] +--~ if node and node[1] == 'glyph' and node[5] == font_id then +--~ i = func(stack,i,node) +--~ done = true +--~ end +--~ if i < #stack then +--~ i = i + 1 +--~ else +--~ break +--~ end +--~ end +--~ end +--~ end +--~ for _, node in ipairs(stack) do +--~ if node then +--~ done = done or process_list(node) +--~ end +--~ end +--~ return done +--~ end +--~ end +--~ end + +--~ local function do_collapse_glyphs(stack,existing_t) +--~ if stack then +--~ local t = existing_t or { } +--~ for _, node in pairs(stack) do +--~ if node then +--~ if node[3] then node[3][1] = nil end -- remove status bit / 1 sec faster on 15 sec +--~ if node[1] == 'inline' then +--~ local nodes = node[4] +--~ if #nodes == 1 then +--~ t[#t+1] = nodes[1] +--~ else +--~ do_collapse_glyphs(nodes,t) +--~ end +--~ else +--~ t[#t+1] = node +--~ end +--~ else +--~ -- deleted node +--~ end +--~ end +--~ return t +--~ else +--~ return stack +--~ end +--~ end + +--~ function nodes.process_glyphs(t,...) +--~ --~ print(...) +--~ if status.output_active then -- not ok, we need a generic blocker, pagebody ! / attr tex.attibutes +--~ return true +--~ else +--~ input.start_timing(nodes) +--~ local done = do_process_glyphs(t) +--~ if done then +--~ t = do_collapse_glyphs(t) +--~ end +--~ input.stop_timing(nodes) +--~ nodes.report(t,done) +--~ if done then +--~ --~ texio.write_nl("RETURNING PROCESSED LIST") +--~ return t +--~ else +--~ --~ texio.write_nl("RETURNING SIGNAL") +--~ return true +--~ end +--~ end +--~ end + +--~ end + +do + + local glyph = node.id('glyph') + local pushmarks = false + + function do_process_glyphs(head) -- beware, we need to handle shifted heads -- todo + if not head then + return head + end + local usedfonts, found, fontdata = { }, false, fonts.tfm.id + for n in node.traverse_id(glyph,head) do + local font = n.font + if not usedfonts[font] then + local shared = fontdata[font].shared + if shared and shared.processors then + usedfonts[font], found = shared.processors, true + end + end + end + if not found then + return head, false + else + local tail, done = node.slide(head), false + for font, processors in pairs(usedfonts) do + if pushmarks then + local h, d = fonts.pushmarks(head,font) + head, done = head or h, done or d + end + for _, processor in ipairs(processors) do + local h, d = processor(head,font) + head, done = head or h, done or d + end + if pushmarks then + local h, d = fonts.popmarks(head,font) + head, done = head or h, done or d + end + end + return head, done + end + end + + function nodes.process_glyphs(head) + if status.output_active then -- not ok, we need a generic blocker, pagebody ! / attr tex.attibutes + return true + else + input.start_timing(nodes) + local head, done = do_process_glyphs(head) + input.stop_timing(nodes) + nodes.report(head,done) + if done then + return head -- something changed + elseif head then + return true -- nothing changed + else + return false -- delete list + end + end + end + +end + +-- vbox: grouptype: vbox vtop output split_off split_keep | box_type: exactly|aditional +-- hbox: grouptype: hbox adjusted_hbox(=hbox_in_vmode) | box_type: exactly|aditional + +callback.register('pre_linebreak_filter', nodes.process_glyphs) +callback.register('hpack_filter', nodes.process_glyphs) + +--~ callback.register('pre_linebreak_filter', function(t,...) +--~ print("pre_linebreak_filter",...) +--~ return nodes.process_glyphs(t) +--~ end ) +--~ callback.register('hpack_filter', function(t,...) +--~ print("hpack_filter",...) +--~ return nodes.process_glyphs(t) +--~ end ) + +function nodes.length(head) + if head then + local m = 0 + for n in node.traverse(head) do + m = m + 1 + end + return m + else + return 0 + end +end + +do + +--~ function nodes.totable(n) +--~ function totable(n) +--~ local f, tt = node.fields(n.id,n.subtype), { } +--~ for _,v in ipairs(f) do +--~ local nv = n[v] +--~ if nv then +--~ local tnv = type(nv) +--~ if tnv == "string" or tnv == "number" then +--~ tt[v] = nv +--~ else -- userdata +--~ tt[v] = nodes.totable(nv) +--~ end +--~ end +--~ end +--~ return tt +--~ end +--~ local t = { } +--~ while n do +--~ t[#t+1] = totable(n) +--~ n = n.next +--~ end +--~ return t +--~ end + + local expand = { + list = true, + pre = true, + post = true, + spec = true, + attr = true, + components = true, + } + + -- flat: don't use next, but indexes + -- verbose: also add type + + function nodes.totable(n,flat,verbose) + function totable(n,verbose) + local f = node.fields(n.id,n.subtype) + local tt = { } + for _,v in ipairs(f) do + if n[v] then + if v == "ref_count" then + -- skip + elseif expand[v] then -- or: type(n[v]) ~= "string" or type(n[v]) ~= "number" + tt[v] = nodes.totable(n[v],flat,verbose) + else + tt[v] = n[v] + end + end + end + if verbose then + tt.type = node.type(tt.id) + end + return tt + end + if flat then + local t = { } + while n do + t[#t+1] = totable(n,verbose) + n = n.next + end + return t + else + local t = totable(n,verbose) + if n.next then + t.next = nodes.totable(n.next,flat,verbose) + end + return t + end + end + + local function key(k) + if type(k) == "number" then + return "["..k.."]" + else + return k + end + end + + local function serialize(root,name,handle,depth,m) + handle = handle or print + if depth then + depth = depth .. " " + handle(("%s%s={"):format(depth,key(name))) + else + depth = "" + if type(name) == "string" then + if name == "return" then + handle("return {") + else + handle(name .. "={") + end + elseif type(name) == "number" then + handle("[" .. name .. "]={") + else + handle("t={") + end + end + if root then + local fld + if root.id then + fld = node.fields(root.id,root.subtype) + else + fld = table.sortedkeys(root) + end + if type(root) == 'table' and root['type'] then -- userdata or table + handle(("%s %s=%q,"):format(depth,'type',root['type'])) + end + for _,k in ipairs(fld) do + if k then + local v = root[k] + local t = type(v) + if t == "number" then + handle(("%s %s=%s,"):format(depth,key(k),v)) + elseif t == "string" then + handle(("%s %s=%q,"):format(depth,key(k),v)) + elseif v then -- userdata or table + serialize(v,k,handle,depth,n+1) + end + end + end + if root['next'] then -- userdata or table + serialize(root['next'],'next',handle,depth,n+1) + end + end + if m and m > 0 then + handle(("%s},"):format(depth)) + else + handle(("%s}"):format(depth)) + end + end + + function nodes.serialize(root,name) + local t = { } + local function flush(s) + t[#t+1] = s + end + serialize(root, name, flush, nil, nil) + return table.concat(t,"\n") + end + + function nodes.serializebox(n,flat,verbose) + return nodes.serialize(nodes.totable(tex.box[n],flat,verbose)) + -- return nodes.serialize(tex.box[n]) + end + + function nodes.visualizebox(...) + -- tex.sprint(tex.ctxcatcodes,"\\starttyping\n" .. nodes.serializebox(...) .. "\n\\stoptyping\n") + tex.print(tex.ctxcatcodes,"\\starttyping") + tex.print(nodes.serializebox(...)) + tex.print("\\stoptyping") + end + +end + +if not node.list_has_attribute then + + function node.list_has_attribute(list,attribute) + if list and attribute then + for n in node.traverse(list) do + local a = has_attribute(n,attribute) + if a then return a end + end + end + return false + end + +end + +function nodes.pack_list(head) + local t = { } + for n in node.traverse(head) do + t[#t+1] = tostring(n) + end + return t +end + diff --git a/tex/context/base/node-ini.tex b/tex/context/base/node-ini.tex new file mode 100644 index 000000000..6b6700e5d --- /dev/null +++ b/tex/context/base/node-ini.tex @@ -0,0 +1,46 @@ +%D \module +%D [ file=node-ini, +%D version=2006.08.20, +%D title=\CONTEXT\ Character Macros, +%D subtitle=Node Support (Initialization), +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Node Support (initialization)} + +\registerctxluafile{node-ini}{1.001} + +% \appendtoks +% \ctxlua { +% callbacks.push('hpack_filter') +% callbacks.push('vpack_filter') +% callbacks.push('buildpage_filter') +% callbacks.push('pre_linebreak_filter') +% callbacks.push('pre_output_filter') +% }% +% \to \everybeforeoutput +% \appendtoks +% \ctxlua { +% callbacks.pop('hpack_filter') +% callbacks.pop('vpack_filter') +% callbacks.pop('buildpage_filter') +% callbacks.pop('pre_linebreak_filter') +% callbacks.pop('pre_output_filter') +% }% +% \to \everyafteroutput + +\newcount\shownodescounter + +\def\shownextnodes {\afterassignment\doshownodes\shownextnodescounter} +\def\showflatnodes {\afterassignment\doshownodes\showflatnodescounter} +\def\doshownextnodes {\ctxlua{texio.write_nl('log',nodes.serializebox(\number\shownodescounter,false,true))}} +\def\doshowflatnodes {\ctxlua{texio.write_nl('log',nodes.serializebox(\number\shownodescounter,true, true))}} +\def\visualizenextnodes{\dowithnextbox{\ctxlua{nodes.visualizebox(\number\nextbox,false,true)}}} +\def\visualizeflatnodes{\dowithnextbox{\ctxlua{nodes.visualizebox(\number\nextbox,true,true)}}} + +\endinput diff --git a/tex/context/base/page-imp.tex b/tex/context/base/page-imp.tex index 2b96e6f44..3acf201bc 100644 --- a/tex/context/base/page-imp.tex +++ b/tex/context/base/page-imp.tex @@ -144,6 +144,8 @@ \let\pagestoshipout\empty % {1,3,6} \chardef\whichpagetoshipout=0 % 0=all 1=odd 2=even +\ifx\processshipoutbox\undefined \let\processshipoutbox\firstofoneargument \fi + \def\actualshipout#1% {\global\advance\shippedoutpages\plusone % this is not resource safe! @@ -170,7 +172,7 @@ \vskip\scratchdimen \hskip\scratchdimen \hbox % \setbox0=\box.. is nicer - {\setbox0\hbox{#1}% just in case there are objects there + {\setbox0\hbox{\processshipoutbox{#1}}% just in case there are objects there, hook for testing \setbox\scratchbox\hbox {% before the main one ! \ifcase\realfolio \or diff --git a/tex/context/base/regi-8859-1.lua b/tex/context/base/regi-8859-1.lua new file mode 100644 index 000000000..affc65762 --- /dev/null +++ b/tex/context/base/regi-8859-1.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-1.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-1"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF +} diff --git a/tex/context/base/regi-8859-10.lua b/tex/context/base/regi-8859-10.lua new file mode 100644 index 000000000..2b1d2d4ab --- /dev/null +++ b/tex/context/base/regi-8859-10.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-10.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-10"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0104, 0x0112, 0x0122, 0x012A, 0x0128, 0x0136, 0x00A7, 0x013B, 0x0110, 0x0160, 0x0166, 0x017D, 0x00AD, 0x016A, 0x014A, + 0x00B0, 0x0105, 0x0113, 0x0123, 0x012B, 0x0129, 0x0137, 0x00B7, 0x013C, 0x0111, 0x0161, 0x0167, 0x017E, 0x2015, 0x016B, 0x014B, + 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x0145, 0x014C, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x0168, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x0146, 0x014D, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x0169, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x0138 +} diff --git a/tex/context/base/regi-8859-11.lua b/tex/context/base/regi-8859-11.lua new file mode 100644 index 000000000..f6ff34b69 --- /dev/null +++ b/tex/context/base/regi-8859-11.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-11.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-11"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0E01, 0x0E02, 0x0E03, 0x0E04, 0x0E05, 0x0E06, 0x0E07, 0x0E08, 0x0E09, 0x0E0A, 0x0E0B, 0x0E0C, 0x0E0D, 0x0E0E, 0x0E0F, + 0x0E10, 0x0E11, 0x0E12, 0x0E13, 0x0E14, 0x0E15, 0x0E16, 0x0E17, 0x0E18, 0x0E19, 0x0E1A, 0x0E1B, 0x0E1C, 0x0E1D, 0x0E1E, 0x0E1F, + 0x0E20, 0x0E21, 0x0E22, 0x0E23, 0x0E24, 0x0E25, 0x0E26, 0x0E27, 0x0E28, 0x0E29, 0x0E2A, 0x0E2B, 0x0E2C, 0x0E2D, 0x0E2E, 0x0E2F, + 0x0E30, 0x0E31, 0x0E32, 0x0E33, 0x0E34, 0x0E35, 0x0E36, 0x0E37, 0x0E38, 0x0E39, 0x0E3A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0E3F, + 0x0E40, 0x0E41, 0x0E42, 0x0E43, 0x0E44, 0x0E45, 0x0E46, 0x0E47, 0x0E48, 0x0E49, 0x0E4A, 0x0E4B, 0x0E4C, 0x0E4D, 0x0E4E, 0x0E4F, + 0x0E50, 0x0E51, 0x0E52, 0x0E53, 0x0E54, 0x0E55, 0x0E56, 0x0E57, 0x0E58, 0x0E59, 0x0E5A, 0x0E5B, 0x0000, 0x0000, 0x0000, 0x0000 +} diff --git a/tex/context/base/regi-8859-13.lua b/tex/context/base/regi-8859-13.lua new file mode 100644 index 000000000..13b631e9b --- /dev/null +++ b/tex/context/base/regi-8859-13.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-13.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-13"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x201D, 0x00A2, 0x00A3, 0x00A4, 0x201E, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x201C, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x2019 +} diff --git a/tex/context/base/regi-8859-14.lua b/tex/context/base/regi-8859-14.lua new file mode 100644 index 000000000..ae349ed36 --- /dev/null +++ b/tex/context/base/regi-8859-14.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-14.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-14"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x1E02, 0x1E03, 0x00A3, 0x010A, 0x010B, 0x1E0A, 0x00A7, 0x1E80, 0x00A9, 0x1E82, 0x1E0B, 0x1EF2, 0x00AD, 0x00AE, 0x0178, + 0x1E1E, 0x1E1F, 0x0120, 0x0121, 0x1E40, 0x1E41, 0x00B6, 0x1E56, 0x1E81, 0x1E57, 0x1E83, 0x1E60, 0x1EF3, 0x1E84, 0x1E85, 0x1E61, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x0174, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x1E6A, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x0176, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x0175, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x1E6B, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x0177, 0x00FF +} diff --git a/tex/context/base/regi-8859-15.lua b/tex/context/base/regi-8859-15.lua new file mode 100644 index 000000000..14891c7ff --- /dev/null +++ b/tex/context/base/regi-8859-15.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-15.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-15"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AC, 0x00A5, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x017D, 0x00B5, 0x00B6, 0x00B7, 0x017E, 0x00B9, 0x00BA, 0x00BB, 0x0152, 0x0153, 0x0178, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF +} diff --git a/tex/context/base/regi-8859-16.lua b/tex/context/base/regi-8859-16.lua new file mode 100644 index 000000000..426c43773 --- /dev/null +++ b/tex/context/base/regi-8859-16.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-16.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-16"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0104, 0x0105, 0x0141, 0x20AC, 0x201E, 0x0160, 0x00A7, 0x0161, 0x00A9, 0x0218, 0x00AB, 0x0179, 0x00AD, 0x017A, 0x017B, + 0x00B0, 0x00B1, 0x010C, 0x0142, 0x017D, 0x201D, 0x00B6, 0x00B7, 0x017E, 0x010D, 0x0219, 0x00BB, 0x0152, 0x0153, 0x0178, 0x017C, + 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0106, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x0110, 0x0143, 0x00D2, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x015A, 0x0170, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0118, 0x021A, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x0107, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x0111, 0x0144, 0x00F2, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x015B, 0x0171, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0119, 0x021B, 0x00FF +} diff --git a/tex/context/base/regi-8859-2.lua b/tex/context/base/regi-8859-2.lua new file mode 100644 index 000000000..98988cd8e --- /dev/null +++ b/tex/context/base/regi-8859-2.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-2.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-2"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0104, 0x02D8, 0x0141, 0x00A4, 0x013D, 0x015A, 0x00A7, 0x00A8, 0x0160, 0x015E, 0x0164, 0x0179, 0x00AD, 0x017D, 0x017B, + 0x00B0, 0x0105, 0x02DB, 0x0142, 0x00B4, 0x013E, 0x015B, 0x02C7, 0x00B8, 0x0161, 0x015F, 0x0165, 0x017A, 0x02DD, 0x017E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 +} diff --git a/tex/context/base/regi-8859-3.lua b/tex/context/base/regi-8859-3.lua new file mode 100644 index 000000000..ab94e5a77 --- /dev/null +++ b/tex/context/base/regi-8859-3.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-3.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-3"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0126, 0x02D8, 0x00A3, 0x00A4, 0x0000, 0x0124, 0x00A7, 0x00A8, 0x0130, 0x015E, 0x011E, 0x0134, 0x00AD, 0x0000, 0x017B, + 0x00B0, 0x0127, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x0125, 0x00B7, 0x00B8, 0x0131, 0x015F, 0x011F, 0x0135, 0x00BD, 0x0000, 0x017C, + 0x00C0, 0x00C1, 0x00C2, 0x0000, 0x00C4, 0x010A, 0x0108, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x0000, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x0120, 0x00D6, 0x00D7, 0x011C, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x016C, 0x015C, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0000, 0x00E4, 0x010B, 0x0109, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x0000, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x0121, 0x00F6, 0x00F7, 0x011D, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x016D, 0x015D, 0x02D9 +} diff --git a/tex/context/base/regi-8859-4.lua b/tex/context/base/regi-8859-4.lua new file mode 100644 index 000000000..079285590 --- /dev/null +++ b/tex/context/base/regi-8859-4.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-4.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-4"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0104, 0x0138, 0x0156, 0x00A4, 0x0128, 0x013B, 0x00A7, 0x00A8, 0x0160, 0x0112, 0x0122, 0x0166, 0x00AD, 0x017D, 0x00AF, + 0x00B0, 0x0105, 0x02DB, 0x0157, 0x00B4, 0x0129, 0x013C, 0x02C7, 0x00B8, 0x0161, 0x0113, 0x0123, 0x0167, 0x014A, 0x017E, 0x014B, + 0x0100, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x012E, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x0116, 0x00CD, 0x00CE, 0x012A, + 0x0110, 0x0145, 0x014C, 0x0136, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x0172, 0x00DA, 0x00DB, 0x00DC, 0x0168, 0x016A, 0x00DF, + 0x0101, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x012F, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x0117, 0x00ED, 0x00EE, 0x012B, + 0x0111, 0x0146, 0x014D, 0x0137, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x0173, 0x00FA, 0x00FB, 0x00FC, 0x0169, 0x016B, 0x02D9 +} diff --git a/tex/context/base/regi-8859-5.lua b/tex/context/base/regi-8859-5.lua new file mode 100644 index 000000000..5f6df9242 --- /dev/null +++ b/tex/context/base/regi-8859-5.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-5.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-5"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0406, 0x0407, 0x0408, 0x0409, 0x040A, 0x040B, 0x040C, 0x00AD, 0x040E, 0x040F, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F, + 0x2116, 0x0451, 0x0452, 0x0453, 0x0454, 0x0455, 0x0456, 0x0457, 0x0458, 0x0459, 0x045A, 0x045B, 0x045C, 0x00A7, 0x045E, 0x045F +} diff --git a/tex/context/base/regi-8859-6.lua b/tex/context/base/regi-8859-6.lua new file mode 100644 index 000000000..86ed0b262 --- /dev/null +++ b/tex/context/base/regi-8859-6.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-6.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-6"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0000, 0x0000, 0x0000, 0x00A4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x060C, 0x00AD, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x061B, 0x0000, 0x0000, 0x0000, 0x061F, + 0x0000, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x0637, 0x0638, 0x0639, 0x063A, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0640, 0x0641, 0x0642, 0x0643, 0x0644, 0x0645, 0x0646, 0x0647, 0x0648, 0x0649, 0x064A, 0x064B, 0x064C, 0x064D, 0x064E, 0x064F, + 0x0650, 0x0651, 0x0652, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000 +} diff --git a/tex/context/base/regi-8859-7.lua b/tex/context/base/regi-8859-7.lua new file mode 100644 index 000000000..bb110fbfa --- /dev/null +++ b/tex/context/base/regi-8859-7.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-7.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-7"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x2018, 0x2019, 0x00A3, 0x20AC, 0x20AF, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x037A, 0x00AB, 0x00AC, 0x00AD, 0x0000, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x0385, 0x0386, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 +} diff --git a/tex/context/base/regi-8859-8.lua b/tex/context/base/regi-8859-8.lua new file mode 100644 index 000000000..a6821499a --- /dev/null +++ b/tex/context/base/regi-8859-8.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-8.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-8"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x2017, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 +} diff --git a/tex/context/base/regi-8859-9.lua b/tex/context/base/regi-8859-9.lua new file mode 100644 index 000000000..44a3a18ab --- /dev/null +++ b/tex/context/base/regi-8859-9.lua @@ -0,0 +1,26 @@ +-- filename : regi-8859-9.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["8859-9"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0080, 0x0081, 0x0082, 0x0083, 0x0084, 0x0085, 0x0086, 0x0087, 0x0088, 0x0089, 0x008A, 0x008B, 0x008C, 0x008D, 0x008E, 0x008F, + 0x0090, 0x0091, 0x0092, 0x0093, 0x0094, 0x0095, 0x0096, 0x0097, 0x0098, 0x0099, 0x009A, 0x009B, 0x009C, 0x009D, 0x009E, 0x009F, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF +} diff --git a/tex/context/base/regi-cp1250.lua b/tex/context/base/regi-cp1250.lua new file mode 100644 index 000000000..aa374193a --- /dev/null +++ b/tex/context/base/regi-cp1250.lua @@ -0,0 +1,26 @@ +-- filename : regi-cp1250.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["cp1250"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0160, 0x2039, 0x015A, 0x0164, 0x017D, 0x0179, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0161, 0x203A, 0x015B, 0x0165, 0x017E, 0x017A, + 0x00A0, 0x02C7, 0x02D8, 0x0141, 0x00A4, 0x0104, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x015E, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x017B, + 0x00B0, 0x00B1, 0x02DB, 0x0142, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x0105, 0x015F, 0x00BB, 0x013D, 0x02DD, 0x013E, 0x017C, + 0x0154, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x0139, 0x0106, 0x00C7, 0x010C, 0x00C9, 0x0118, 0x00CB, 0x011A, 0x00CD, 0x00CE, 0x010E, + 0x0110, 0x0143, 0x0147, 0x00D3, 0x00D4, 0x0150, 0x00D6, 0x00D7, 0x0158, 0x016E, 0x00DA, 0x0170, 0x00DC, 0x00DD, 0x0162, 0x00DF, + 0x0155, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x013A, 0x0107, 0x00E7, 0x010D, 0x00E9, 0x0119, 0x00EB, 0x011B, 0x00ED, 0x00EE, 0x010F, + 0x0111, 0x0144, 0x0148, 0x00F3, 0x00F4, 0x0151, 0x00F6, 0x00F7, 0x0159, 0x016F, 0x00FA, 0x0171, 0x00FC, 0x00FD, 0x0163, 0x02D9 +} diff --git a/tex/context/base/regi-cp1251.lua b/tex/context/base/regi-cp1251.lua new file mode 100644 index 000000000..88204df36 --- /dev/null +++ b/tex/context/base/regi-cp1251.lua @@ -0,0 +1,26 @@ +-- filename : regi-cp1251.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["cp1251"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x0402, 0x0403, 0x201A, 0x0453, 0x201E, 0x2026, 0x2020, 0x2021, 0x20AC, 0x2030, 0x0409, 0x2039, 0x040A, 0x040C, 0x040B, 0x040F, + 0x0452, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0459, 0x203A, 0x045A, 0x045C, 0x045B, 0x045F, + 0x00A0, 0x040E, 0x045E, 0x0408, 0x00A4, 0x0490, 0x00A6, 0x00A7, 0x0401, 0x00A9, 0x0404, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x0407, + 0x00B0, 0x00B1, 0x0406, 0x0456, 0x0491, 0x00B5, 0x00B6, 0x00B7, 0x0451, 0x2116, 0x0454, 0x00BB, 0x0458, 0x0405, 0x0455, 0x0457, + 0x0410, 0x0411, 0x0412, 0x0413, 0x0414, 0x0415, 0x0416, 0x0417, 0x0418, 0x0419, 0x041A, 0x041B, 0x041C, 0x041D, 0x041E, 0x041F, + 0x0420, 0x0421, 0x0422, 0x0423, 0x0424, 0x0425, 0x0426, 0x0427, 0x0428, 0x0429, 0x042A, 0x042B, 0x042C, 0x042D, 0x042E, 0x042F, + 0x0430, 0x0431, 0x0432, 0x0433, 0x0434, 0x0435, 0x0436, 0x0437, 0x0438, 0x0439, 0x043A, 0x043B, 0x043C, 0x043D, 0x043E, 0x043F, + 0x0440, 0x0441, 0x0442, 0x0443, 0x0444, 0x0445, 0x0446, 0x0447, 0x0448, 0x0449, 0x044A, 0x044B, 0x044C, 0x044D, 0x044E, 0x044F +} diff --git a/tex/context/base/regi-cp1252.lua b/tex/context/base/regi-cp1252.lua new file mode 100644 index 000000000..910656edf --- /dev/null +++ b/tex/context/base/regi-cp1252.lua @@ -0,0 +1,26 @@ +-- filename : regi-cp1252.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["cp1252"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x017D, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x017E, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x00D0, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x00DD, 0x00DE, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x00F0, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x00FD, 0x00FE, 0x00FF +} diff --git a/tex/context/base/regi-cp1253.lua b/tex/context/base/regi-cp1253.lua new file mode 100644 index 000000000..6d854e967 --- /dev/null +++ b/tex/context/base/regi-cp1253.lua @@ -0,0 +1,26 @@ +-- filename : regi-cp1253.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["cp1253"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x0385, 0x0386, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x0000, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x2015, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x0384, 0x00B5, 0x00B6, 0x00B7, 0x0388, 0x0389, 0x038A, 0x00BB, 0x038C, 0x00BD, 0x038E, 0x038F, + 0x0390, 0x0391, 0x0392, 0x0393, 0x0394, 0x0395, 0x0396, 0x0397, 0x0398, 0x0399, 0x039A, 0x039B, 0x039C, 0x039D, 0x039E, 0x039F, + 0x03A0, 0x03A1, 0x0000, 0x03A3, 0x03A4, 0x03A5, 0x03A6, 0x03A7, 0x03A8, 0x03A9, 0x03AA, 0x03AB, 0x03AC, 0x03AD, 0x03AE, 0x03AF, + 0x03B0, 0x03B1, 0x03B2, 0x03B3, 0x03B4, 0x03B5, 0x03B6, 0x03B7, 0x03B8, 0x03B9, 0x03BA, 0x03BB, 0x03BC, 0x03BD, 0x03BE, 0x03BF, + 0x03C0, 0x03C1, 0x03C2, 0x03C3, 0x03C4, 0x03C5, 0x03C6, 0x03C7, 0x03C8, 0x03C9, 0x03CA, 0x03CB, 0x03CC, 0x03CD, 0x03CE, 0x0000 +} diff --git a/tex/context/base/regi-cp1254.lua b/tex/context/base/regi-cp1254.lua new file mode 100644 index 000000000..12f094b46 --- /dev/null +++ b/tex/context/base/regi-cp1254.lua @@ -0,0 +1,26 @@ +-- filename : regi-cp1254.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["cp1254"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0160, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0161, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x00C3, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x00CC, 0x00CD, 0x00CE, 0x00CF, + 0x011E, 0x00D1, 0x00D2, 0x00D3, 0x00D4, 0x00D5, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x0130, 0x015E, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x00E3, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x00EC, 0x00ED, 0x00EE, 0x00EF, + 0x011F, 0x00F1, 0x00F2, 0x00F3, 0x00F4, 0x00F5, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x0131, 0x015F, 0x00FF +} diff --git a/tex/context/base/regi-cp1255.lua b/tex/context/base/regi-cp1255.lua new file mode 100644 index 000000000..77119da56 --- /dev/null +++ b/tex/context/base/regi-cp1255.lua @@ -0,0 +1,26 @@ +-- filename : regi-cp1255.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["cp1255"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0000, 0x0000, 0x0000, 0x0000, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x20AA, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00D7, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00F7, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x05B0, 0x05B1, 0x05B2, 0x05B3, 0x05B4, 0x05B5, 0x05B6, 0x05B7, 0x05B8, 0x05B9, 0x0000, 0x05BB, 0x05BC, 0x05BD, 0x05BE, 0x05BF, + 0x05C0, 0x05C1, 0x05C2, 0x05C3, 0x05F0, 0x05F1, 0x05F2, 0x05F3, 0x05F4, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x05D0, 0x05D1, 0x05D2, 0x05D3, 0x05D4, 0x05D5, 0x05D6, 0x05D7, 0x05D8, 0x05D9, 0x05DA, 0x05DB, 0x05DC, 0x05DD, 0x05DE, 0x05DF, + 0x05E0, 0x05E1, 0x05E2, 0x05E3, 0x05E4, 0x05E5, 0x05E6, 0x05E7, 0x05E8, 0x05E9, 0x05EA, 0x0000, 0x0000, 0x200E, 0x200F, 0x0000 +} diff --git a/tex/context/base/regi-cp1256.lua b/tex/context/base/regi-cp1256.lua new file mode 100644 index 000000000..9bd3dbd73 --- /dev/null +++ b/tex/context/base/regi-cp1256.lua @@ -0,0 +1,26 @@ +-- filename : regi-cp1256.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["cp1256"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x067E, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0679, 0x2039, 0x0152, 0x0686, 0x0698, 0x0688, + 0x06AF, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x06A9, 0x2122, 0x0691, 0x203A, 0x0153, 0x200C, 0x200D, 0x06BA, + 0x00A0, 0x060C, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x06BE, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x061B, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x061F, + 0x06C1, 0x0621, 0x0622, 0x0623, 0x0624, 0x0625, 0x0626, 0x0627, 0x0628, 0x0629, 0x062A, 0x062B, 0x062C, 0x062D, 0x062E, 0x062F, + 0x0630, 0x0631, 0x0632, 0x0633, 0x0634, 0x0635, 0x0636, 0x00D7, 0x0637, 0x0638, 0x0639, 0x063A, 0x0640, 0x0641, 0x0642, 0x0643, + 0x00E0, 0x0644, 0x00E2, 0x0645, 0x0646, 0x0647, 0x0648, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0649, 0x064A, 0x00EE, 0x00EF, + 0x064B, 0x064C, 0x064D, 0x064E, 0x00F4, 0x064F, 0x0650, 0x00F7, 0x0651, 0x00F9, 0x0652, 0x00FB, 0x00FC, 0x200E, 0x200F, 0x06D2 +} diff --git a/tex/context/base/regi-cp1257.lua b/tex/context/base/regi-cp1257.lua new file mode 100644 index 000000000..d043b256f --- /dev/null +++ b/tex/context/base/regi-cp1257.lua @@ -0,0 +1,26 @@ +-- filename : regi-cp1257.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["cp1257"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0000, 0x201E, 0x2026, 0x2020, 0x2021, 0x0000, 0x2030, 0x0000, 0x2039, 0x0000, 0x00A8, 0x02C7, 0x00B8, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x0000, 0x2122, 0x0000, 0x203A, 0x0000, 0x00AF, 0x02DB, 0x0000, + 0x00A0, 0x0000, 0x00A2, 0x00A3, 0x00A4, 0x0000, 0x00A6, 0x00A7, 0x00D8, 0x00A9, 0x0156, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00C6, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00F8, 0x00B9, 0x0157, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00E6, + 0x0104, 0x012E, 0x0100, 0x0106, 0x00C4, 0x00C5, 0x0118, 0x0112, 0x010C, 0x00C9, 0x0179, 0x0116, 0x0122, 0x0136, 0x012A, 0x013B, + 0x0160, 0x0143, 0x0145, 0x00D3, 0x014C, 0x00D5, 0x00D6, 0x00D7, 0x0172, 0x0141, 0x015A, 0x016A, 0x00DC, 0x017B, 0x017D, 0x00DF, + 0x0105, 0x012F, 0x0101, 0x0107, 0x00E4, 0x00E5, 0x0119, 0x0113, 0x010D, 0x00E9, 0x017A, 0x0117, 0x0123, 0x0137, 0x012B, 0x013C, + 0x0161, 0x0144, 0x0146, 0x00F3, 0x014D, 0x00F5, 0x00F6, 0x00F7, 0x0173, 0x0142, 0x015B, 0x016B, 0x00FC, 0x017C, 0x017E, 0x02D9 +} diff --git a/tex/context/base/regi-cp1258.lua b/tex/context/base/regi-cp1258.lua new file mode 100644 index 000000000..45fa7eca0 --- /dev/null +++ b/tex/context/base/regi-cp1258.lua @@ -0,0 +1,26 @@ +-- filename : regi-cp1258.lua +-- comment : companion to char-reg.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +regimes.data["cp1258"] = { [0] = + 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0006, 0x0007, 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F, + 0x0010, 0x0011, 0x0012, 0x0013, 0x0014, 0x0015, 0x0016, 0x0017, 0x0018, 0x0019, 0x001A, 0x001B, 0x001C, 0x001D, 0x001E, 0x001F, + 0x0020, 0x0021, 0x0022, 0x0023, 0x0024, 0x0025, 0x0026, 0x0027, 0x0028, 0x0029, 0x002A, 0x002B, 0x002C, 0x002D, 0x002E, 0x002F, + 0x0030, 0x0031, 0x0032, 0x0033, 0x0034, 0x0035, 0x0036, 0x0037, 0x0038, 0x0039, 0x003A, 0x003B, 0x003C, 0x003D, 0x003E, 0x003F, + 0x0040, 0x0041, 0x0042, 0x0043, 0x0044, 0x0045, 0x0046, 0x0047, 0x0048, 0x0049, 0x004A, 0x004B, 0x004C, 0x004D, 0x004E, 0x004F, + 0x0050, 0x0051, 0x0052, 0x0053, 0x0054, 0x0055, 0x0056, 0x0057, 0x0058, 0x0059, 0x005A, 0x005B, 0x005C, 0x005D, 0x005E, 0x005F, + 0x0060, 0x0061, 0x0062, 0x0063, 0x0064, 0x0065, 0x0066, 0x0067, 0x0068, 0x0069, 0x006A, 0x006B, 0x006C, 0x006D, 0x006E, 0x006F, + 0x0070, 0x0071, 0x0072, 0x0073, 0x0074, 0x0075, 0x0076, 0x0077, 0x0078, 0x0079, 0x007A, 0x007B, 0x007C, 0x007D, 0x007E, 0x007F, + 0x20AC, 0x0000, 0x201A, 0x0192, 0x201E, 0x2026, 0x2020, 0x2021, 0x02C6, 0x2030, 0x0000, 0x2039, 0x0152, 0x0000, 0x0000, 0x0000, + 0x0000, 0x2018, 0x2019, 0x201C, 0x201D, 0x2022, 0x2013, 0x2014, 0x02DC, 0x2122, 0x0000, 0x203A, 0x0153, 0x0000, 0x0000, 0x0178, + 0x00A0, 0x00A1, 0x00A2, 0x00A3, 0x00A4, 0x00A5, 0x00A6, 0x00A7, 0x00A8, 0x00A9, 0x00AA, 0x00AB, 0x00AC, 0x00AD, 0x00AE, 0x00AF, + 0x00B0, 0x00B1, 0x00B2, 0x00B3, 0x00B4, 0x00B5, 0x00B6, 0x00B7, 0x00B8, 0x00B9, 0x00BA, 0x00BB, 0x00BC, 0x00BD, 0x00BE, 0x00BF, + 0x00C0, 0x00C1, 0x00C2, 0x0102, 0x00C4, 0x00C5, 0x00C6, 0x00C7, 0x00C8, 0x00C9, 0x00CA, 0x00CB, 0x0300, 0x00CD, 0x00CE, 0x00CF, + 0x0110, 0x00D1, 0x0309, 0x00D3, 0x00D4, 0x01A0, 0x00D6, 0x00D7, 0x00D8, 0x00D9, 0x00DA, 0x00DB, 0x00DC, 0x01AF, 0x0303, 0x00DF, + 0x00E0, 0x00E1, 0x00E2, 0x0103, 0x00E4, 0x00E5, 0x00E6, 0x00E7, 0x00E8, 0x00E9, 0x00EA, 0x00EB, 0x0301, 0x00ED, 0x00EE, 0x00EF, + 0x0111, 0x00F1, 0x0323, 0x00F3, 0x00F4, 0x01A1, 0x00F6, 0x00F7, 0x00F8, 0x00F9, 0x00FA, 0x00FB, 0x00FC, 0x01B0, 0x20AB, 0x00FF +} diff --git a/tex/context/base/regi-ini.lua b/tex/context/base/regi-ini.lua new file mode 100644 index 000000000..07dd54c1f --- /dev/null +++ b/tex/context/base/regi-ini.lua @@ -0,0 +1,107 @@ +if not modules then modules = { } end modules ['regi-ini'] = { + version = 1.001, + comment = "companion to regi-ini.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

Regimes take care of converting the input characters into + sequences. The conversion tables are loaded at +runtime.

+--ldx]]-- + +regimes = regimes or { } +regimes.data = regimes.data or { } +regimes.utf = regimes.utf or { } +regimes.context = regimes.context or { } + +-- setmetatable(regimes.data,_empty_table_) + +regimes.currentregime = "" + +--[[ldx-- +

We will hook regime handling code into the input methods.

+--ldx]]-- + +input = input or { } +input.filters = input.filters or { } + +function regimes.number(n) + if type(n) == "string" then return tonumber(n,16) else return n end +end + +function regimes.define(c) -- is this used at all? + local r, u, s = c.regime, c.unicodeslot, c.slot + regimes.data[r] = regimes.data[r] or { } + if s then + if u then + regimes.data[r][regimes.number(s)] = regimes.number(u) + else + regimes.data[r][regimes.number(s)] = 0 + end + else + input.report(string.format("regi-ini: invalid regime code %s/%s", r, s)) + end +end + +function regimes.load(regime) + environment.loadlucfile("regi-"..regime, 1.001) + if regimes.data[regime] then + regimes.utf[regime] = { } + for k,v in pairs(regimes.data[regime]) do + regimes.utf[regime][string.char(k)] = unicode.utf8.char(v) + end + end +end + +function regimes.translate(line,regime) + if regime and line and regimes.utf[regime] then + return line:gsub("(.)", regimes.utf[regime]) + else + return line + end +end + +function regimes.enable(regime) + if regimes.data[regime] then + regimes.currentregime = regime + input.filters.dynamic_translator = function(s) + return regimes.translate(s,regimes.currentregime) + end + else + regimes.disable() + end +end + +function regimes.disable() + regimes.currentregime = "" + input.filters.dynamic_translator = nil +end + +function input.filters.frozen_translator(regime) + return function(s) + return regimes.translate(s,regime) + end +end + +--[[ldx-- +

The following code is rather specific.

+--ldx]]-- + +function regimes.context.show(regime) + local flush, tc = tex.sprint, tex.ctxcatcodes + local r = regimes.data[regime] + if r then + flush(tc, "\\starttabulate[|rT|T|rT|lT|lT|lT|]") + for k, v in ipairs(r) do + flush(tc, string.format("\\NC %s\\NC\\getvalue{%s}\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR", k, + characters.contextname(v), characters.hexindex(v), characters.contextname(v), + characters.category(v), characters.description(v))) + end + flush(tc, "\\stoptabulate") + else + flush(tc, "unknown regime " .. regime) + end +end diff --git a/tex/context/base/regi-ini.mkiv b/tex/context/base/regi-ini.mkiv new file mode 100644 index 000000000..ef269985c --- /dev/null +++ b/tex/context/base/regi-ini.mkiv @@ -0,0 +1,39 @@ +%D \module +%D [ file=char-reg, +%D version=2005.04.25, +%D title=\CONTEXT\ Lua Macros, +%D subtitle=Regime Support, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +%D First some initialization code: + +\registerctxluafile{regi-ini}{1.001} + +\def\mkloadregime #1{\ctxlua{regimes.load("#1")}} +\def\mkenableregime #1{\ctxlua{regimes.enable("#1")}} +\def\mkdisableregime {\ctxlua{regimes.disable()}} +\def\mkshowregime #1{\ctxlua{regimes.context.show("#1")}} + +\appendtoks + \pushmacro\currentregime + \disableregime +\to \everystartreadingfile + +\appendtoks + \popmacro\currentregime + \enableregime[\currentregime]% +\to \everystopreadingfile + +\protect \endinput + +% \starttext +% \showregimetable{cp1250} +% \stoptext diff --git a/tex/context/base/regi-utf.tex b/tex/context/base/regi-utf.tex index 90e018684..297ad9649 100644 --- a/tex/context/base/regi-utf.tex +++ b/tex/context/base/regi-utf.tex @@ -37,9 +37,9 @@ \expandafter \endinput \endXETEX -\beginMETATEX +\beginLUATEX \expandafter \endinput -\endMETATEX +\endLUATEX \unprotect diff --git a/tex/context/base/s-abr-01.tex b/tex/context/base/s-abr-01.tex index dd5160a0d..98e36e2f1 100644 --- a/tex/context/base/s-abr-01.tex +++ b/tex/context/base/s-abr-01.tex @@ -24,32 +24,35 @@ \logo [MKIII] {MkIII} \logo [MKIV] {MkIV} +%logo [FGA] {fga} +%logo [FGBBS] {fgbbs} \logo [ACROBAT] {Acro\-bat} \logo [AFM] {afm} \logo [ALEPH] {Aleph} % {\mathematics{\aleph}} \logo [ALGOL] {ALGOL} -\logo [ARABTEX] {Arab\TeX} +\logo [AMS] {ams} \logo [AMSLATEX] {\AmSLaTeX} \logo [AMSTEX] {\AmSTeX} -\logo [AMS] {ams} \logo [ANSI] {ansi} -\logo [ASCIITEX] {ascii\TeX} +\logo [ARABTEX] {Arab\TeX} \logo [ASCII] {ascii} +\logo [ASCIITEX] {ascii\TeX} \logo [BACHOTEX] {Bacho\TeX} \logo [BIBTEX] {bib\TeX} \logo [BLUESKY] {BlueSky} -\logo [BSD] {bsd} \logo [BMP] {bmp} -\logo [CDROM] {cdrom} +\logo [BSD] {bsd} +\logo [CALCMATH] {CalcMath} \logo [CD] {cd} +\logo [CDROM] {cdrom} +\logo [CID] {cid} \logo [CMR] {cmr} \logo [CMYK] {cmyk} \logo [CODHOST] {CodHost} -\logo [CALCMATH] {CalcMath} \logo [CONTEXT] {\ConTeXt} \logo [CSS] {css} -\logo [CID] {cid} \logo [CTAN] {ctan} +\logo [CTXTOOLS] {ctxtools} \logo [CWEB] {cweb} \logo [DANTE] {Dante} \logo [DISTILLER] {distiller} @@ -59,41 +62,38 @@ \logo [DTK] {dtk} \logo [DTP] {dtp} \logo [DVD] {dvd} -\logo [DVIPSONE] {dvipsone} +\logo [DVI] {dvi} \logo [DVIPDFM] {dvipdfm} \logo [DVIPDFMX] {dvipdfmx} \logo [DVIPOS] {dvipos} \logo [DVIPS] {dvips} +\logo [DVIPSONE] {dvipsone} \logo [DVISCR] {dviscr} \logo [DVIWINDO] {dviwindo} -\logo [DVI] {dvi} \logo [EC] {ec} \logo [EIFFEL] {Eiffel} \logo [EMACS] {emacs} \logo [EMTEX] {em\TeX} +\logo [ENCODING] {enc} \logo [ENCTEX] {enc\TeX} \logo [EPS] {eps} -\logo [EUROBACHOTEX] {EuroBacho\TeX} -\logo [ENCODING] {enc} -\logo [MAPPING] {map} -\logo [EXAMPLEX] {examplex} -\logo [EXAMPLET] {examplet} -\logo [EXAMPLER] {exampler} -\logo [EXAMPLEQ] {exampleq} -\logo [EXAMPLED] {exampled} -\logo [EXAMPLE] {eXaMpLe} -\logo [EXIMPLE] {eXiMpLe} \logo [ETEX] {\eTeX} +\logo [EUROBACHOTEX] {EuroBacho\TeX} \logo [EUROMATH] {EuroMath} \logo [EUROTEX] {Euro\TeX} +\logo [EXAMPLE] {eXaMpLe} +\logo [EXAMPLED] {exampled} +\logo [EXAMPLEQ] {exampleq} +\logo [EXAMPLER] {exampler} +\logo [EXAMPLET] {examplet} +\logo [EXAMPLEX] {examplex} +\logo [EXIMPLE] {eXiMpLe} \logo [FAQ] {faq} -%logo [FGA] {fga} \logo [FDF] {fdf} -%logo [FGBBS] {fgbbs} +\logo [FONTFORGE] {FontForge} +\logo [FOXET] {foXet} \logo [FPTEX] {fp\TeX} \logo [FREEBSD] {FreeBSD} -\logo [FOXET] {foXet} -\logo [FONTFORGE] {FontForge} \logo [FTP] {ftp} \logo [GHOSTSCRIPT]{Ghost\-script} \logo [GHOSTVIEW] {Ghost\-view} @@ -103,11 +103,10 @@ \logo [GS] {Ghost\-Script} \logo [GUST] {Gust} \logo [GWTEX] {gw\TeX} -\logo [HZ] {hz} -\logo [HTTP] {http} \logo [HSB] {hsb} \logo [HTML] {html} -\logo [XHTML] {xhtml} +\logo [HTTP] {http} +\logo [HZ] {hz} \logo [IBM] {ibm} \logo [IMAGEMAGICK]{ImageMagick} \logo [INITEX] {ini\TeX} @@ -115,27 +114,28 @@ \logo [IO] {io} \logo [IRCNET] {IRCnet} \logo [ISO] {iso} -\logo [JAVASCRIPT] {Java\-Script} \logo [JAVA] {Java} +\logo [JAVASCRIPT] {Java\-Script} \logo [JPEG] {jpeg} \logo [JPG] {jpg} +\logo [KPATHSEA] {kpathsea} \logo [KPSE] {kpse} \logo [KPSEWHICH] {kpsewhich} -\logo [KPATHSEA] {kpathsea} \logo [LAMSTEX] {\LamSTeX} +\logo [LATEX] {\LaTeX} \logo [LATEXTE] {\LaTeX2e} \logo [LATEXTN] {\LaTeX2.09} -\logo [LATEX] {\LaTeX} \logo [LINUX] {linux} \logo [LISP] {Lisp} -\logo [LUAJIT] {LuaJIT} +\logo [LPEG] {lpeg} \logo [LUA] {Lua} +\logo [LUAJIT] {LuaJIT} \logo [LUATEX] {Lua\TeX} -\logo [TEXLUA] {\TeX Lua} \logo [LUATOOLS] {luatools} \logo [MACOSX] {MacOSX} \logo [MACROTEX] {Macro\TeX} \logo [MAKEMPY] {MakeMPY} +\logo [MAPPING] {map} \logo [MAPS] {Maps} \logo [MATHML] {MathML} \logo [METAFONT] {\MetaFont} @@ -143,33 +143,36 @@ \logo [METATEX] {Meta\TeX} \logo [MIKTEX] {Mik\TeX} \logo [MLTEX] {ml\TeX} -\logo [MTXTOOLS] {mtxtools} \logo [MODULA] {Modula} \logo [MOV] {mov} \logo [MPS] {mps} \logo [MPTOPDF] {mptopdf} \logo [MSDOS] {msdos} \logo [MSWINDOWS] {MS~Windows} +\logo [MTXRUN] {mtxrun} +\logo [MTXTOOLS] {mtxtools} \logo [NETPBM] {NetPBM} \logo [NTG] {ntg} \logo [NTS] {nts} +\logo [OFM] {ofm} \logo [OMEGA] {Omega} -\logo [OPI] {opi} \logo [OPENMATH] {OpenMath} \logo [OPENTYPE] {OpenType} -\logo [OTP] {otp} +\logo [OPI] {opi} \logo [OTF] {otf} -\logo [OFM] {ofm} +\logo [OTP] {otp} \logo [OVF] {ovf} \logo [PASCAL] {Pascal} \logo [PCTEX] {pc\TeX} +\logo [PDF] {pdf} \logo [PDFETEX] {pdfe\TeX} \logo [PDFTEX] {pdf\TeX} +\logo [PDFTOOLS] {pdftools} \logo [PDFTOPS] {pdftops} -\logo [PDF] {pdf} -\logo [PERLTK] {Perl/Tk} \logo [PERL] {Perl} +\logo [PERLTK] {Perl/Tk} \logo [PICTEX] {\PiCTeX} +\logo [PK] {pk} \logo [PLAIN] {Plain} \logo [PNG] {png} \logo [POSIX] {posix} @@ -178,17 +181,18 @@ \logo [PRAGMA] {Pragma ADE} \logo [PRESS] {press} \logo [PRIFIL] {prifil} +\logo [PS] {Post\-Script} \logo [PSCHECK] {pscheck} +\logo [PSTOEDIT] {pstoedit} \logo [PSTOPAGE] {pstopage} \logo [PSTOPDF] {pstopdf} \logo [PSTRICKS] {pstricks} -\logo [PSTOEDIT] {pstoedit} -\logo [PS] {Post\-Script} +\logo [RAM] {ram} \logo [READER] {Acro\-bat Reader} \logo [RELAXNG] {Relax\kern.125emNG} -\logo [RAM] {ram} -\logo [RUBY] {Ruby} \logo [RGB] {rgb} +\logo [RLXTOOLS] {rlxtools} +\logo [RUBY] {Ruby} \logo [SCITE] {SciTE} \logo [SGML] {sgml} \logo [SI] {si} @@ -197,73 +201,71 @@ \logo [TCPIP] {tcp/ip} \logo [TDS] {tds} % no sc te \logo [TETEX] {te\TeX} % no sc te +\logo [TEX] {\TeX} \logo [TEXADRES] {\TeX adress} \logo [TEXBASE] {\TeX base} \logo [TEXEDIT] {\TeX edit} \logo [TEXEXEC] {\TeX exec} +\logo [TEXFONT] {\TeX font} \logo [TEXFORM] {\TeX form} \logo [TEXLIVE] {\TeX Live} +\logo [TEXLUA] {\TeX Lua} \logo [TEXMF] {texmf} +\logo [TEXMFSTART] {texmfstart} \logo [TEXNL] {tex-nl} -\logo [TEXXET] {\TeX\XeT} \def\XeT{XeT} \logo [TEXSHOW] {\TeX show} \logo [TEXSPELL] {\TeX spell} -\logo [TEXUTIL] {\TeX util} -\logo [TEXWORK] {\TeX work} -\logo [TEXFONT] {\TeX font} +\logo [TEXSYNC] {texsync} \logo [TEXTMATE] {TextMate} \logo [TEXTOOLS] {\TeX tools} -\logo [TRUETYPE] {TrueType} -\logo [TTF] {ttf} -\logo [TYPEONE] {Type1} -\logo [XMLTOOLS] {xmltools} -\logo [PDFTOOLS] {pdftools} -\logo [RLXTOOLS] {rlxtools} -\logo [CTXTOOLS] {ctxtools} -\logo [TMFTOOLS] {tmftools} -\logo [TEXMFSTART] {texmfstart} -\logo [TEXSYNC] {texsync} -\logo [TEX] {\TeX} +\logo [TEXUTIL] {\TeX util} +\logo [TEXWORK] {\TeX work} +\logo [TEXXET] {\TeX\XeT} \def\XeT{XeT} \logo [TFM] {tfm} -\logo [VF] {vf} -\logo [PK] {pk} +\logo [TIF] {tif} +\logo [TIFF] {tiff} \logo [TIFFINFO] {tiffinfo} \logo [TIFFTAGS] {tifftags} -\logo [TIFF] {tiff} -\logo [TIF] {tif} +\logo [TMFTOOLS] {tmftools} \logo [TPIC] {tpic} \logo [TPM] {tpm} +\logo [TRUETYPE] {TrueType} +\logo [TTF] {ttf} +\logo [TUG] {tug} \logo [TUGBOAT] {Tug\-Boat} \logo [TUGNEWS] {Tug\-News} -\logo [TUG] {tug} +\logo [TYPEONE] {Type1} +\logo [UCS] {ucs} \logo [UNICODE] {Uni\-code} \logo [UNIX] {Unix} \logo [URI] {uri} \logo [URL] {url} \logo [USA] {usa} -\logo [UTF] {utf} -\logo [UCS] {ucs} \logo [USENET] {usenet} \logo [UTF] {utf} +\logo [UTF] {utf} +\logo [VF] {vf} \logo [WDT] {wdt} -\logo [WEBC] {web2c} \logo [WEB] {web} -\logo [WINNT] {WinNT} +\logo [WEBC] {web2c} \logo [WIKI] {Wiki} \logo [WINDOWS] {Windows} +\logo [WINNT] {WinNT} \logo [WINNX] {Win9x} \logo [WWW] {www} \logo [WYSIWYG] {wysiwyg} \logo [XDVI] {Xdvi} +\logo [XETEX] {\XeTeX} +\logo [XFDF] {xfdf} +\logo [XHTML] {xhtml} \logo [XINDY] {Xindy} \logo [XML] {xml} -\logo [XFDF] {xfdf} +\logo [XMLTOOLS] {xmltools} \logo [XPDFETEX] {xpdfe\TeX} -\logo [XSLT] {xslt} -\logo [XSLTPROC] {xsltproc} \logo [XSL] {xsl} -\logo [XETEX] {\XeTeX} \logo [XSLFO] {xsl-fo} +\logo [XSLT] {xslt} +\logo [XSLTPROC] {xsltproc} \logo [XYPIC] {XYPIC} % wrong logo \logo [YandY] {y\&y} \logo [ZIP] {zip} diff --git a/tex/context/base/s-mag-01.tex b/tex/context/base/s-mag-01.tex index 79d944f4c..54d997fc1 100644 --- a/tex/context/base/s-mag-01.tex +++ b/tex/context/base/s-mag-01.tex @@ -377,6 +377,13 @@ \definetyping[xtyping] [style=\ttx] \definetyping[xxtyping][style=\ttxx] +\definetypeface + [narrowtt] [tt] + [mono] [modern-cond] [default] [encoding=\defaultencoding] + +\definetyping[ntyping] \setuptyping[ntyping][style=\narrowtt] +\definetype [ntype] \setuptype [ntype] [style=\narrowtt] + \doifnotmode{demo}{\endinput} \startbuffer[abstract] diff --git a/tex/context/base/sort-def.mkiv b/tex/context/base/sort-def.mkiv new file mode 100644 index 000000000..8cc92a02e --- /dev/null +++ b/tex/context/base/sort-def.mkiv @@ -0,0 +1,16 @@ +%D \module +%D [ file=sort-def, +%D version=2005.08.08, +%D title=\CONTEXT\ Sort Macros, +%D subtitle=Defaults, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +% nothing here + +\endinput diff --git a/tex/context/base/sort-ini.lua b/tex/context/base/sort-ini.lua new file mode 100644 index 000000000..11d1e8c79 --- /dev/null +++ b/tex/context/base/sort-ini.lua @@ -0,0 +1,176 @@ +-- filename : sort-ini.lua +-- comment : companion to sort-ini.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- todo: +-- +-- out of range +-- uppercase +-- texutil compatible +-- always expand to utf + +if not versions then versions = { } end versions['sort-ini'] = 1.001 + +sorters = { } +sorters.comparers = { } +sorters.splitters = { } +sorters.entries = { } +sorters.mappings = { } +sorters.replacements = { } +sorters.language = 'en' + +function sorters.comparers.basic(a,b,i) -- [2] has entry, key, cmp + local sort_a, sort_b = a[2][i][3], b[2][i][3] + if #sort_a > #sort_b then + if #sort_b == 0 then + return 1 + else + for i=1,#sort_b do + local ai, bi = sort_a[i], sort_b[i] + if ai > bi then + return 1 + elseif ai < bi then + return -1 + end + end + return -1 + end + elseif #sort_a < #sort_b then + if #sort_a == 0 then + return -1 + else + for i=1,#sort_a do + local ai, bi = sort_a[i], sort_b[i] + if ai > bi then + return 1 + elseif ai < bi then + return -1 + end + end + return 1 + end + elseif #sort_a == 0 then + return 0 + else + for i=1,#sort_a do + local ai, bi = sort_a[i], sort_b[i] + if ai > bi then + return 1 + elseif ai < bi then + return -1 + end + end + sort_a, sort_b = a[2][i][2], b[2][i][2] + if sort_a == "" then sort_a = a[2][i][1] end + if sort_b == "" then sort_b = b[2][i][1] end + if sort_a < sort_b then + return -1 + elseif sort_a > sort_b then + return 1 + else + return 0 + end + end +end + +function sorters.prepare(data,split,n) + local strip = sorters.strip + for k,v in ipairs(data) do + for i=1,n do + local vv = v[2][i] + if vv then + if vv[2] then + if vv[2] ~= "" then + vv[3] = split(strip(vv[2])) + else + vv[3] = split(strip(vv[1])) + end + else + vv[2] = { } + vv[3] = split(strip(vv[1])) + end + else + v[2][i] = { {}, {}, {} } + end + end + end +end + +function sorters.strip(str) -- todo: only letters and such utf.gsub("([^%w%d])","") + str = str:gsub("\\%S*","") + str = str:gsub("[%s%[%](){}%$\"\']*","") + str = str:gsub("(%d+)",function(s) return (" "):rep(10-#s) .. s end) -- sort numbers properly + return str +end + +function sorters.splitters.utf(str) + local r = sorters.replacements[sorters.language] or { } + local m = sorters.mappings[sorters.language] or { } + local u = characters.uncompose + local t = { } + for _,v in pairs(r) do + str = str:gsub(v[1],v[2]) + end + for c in string.utfcharacters(str) do + if m[c] then + t[#t+1] = m[c] + else + for cc in string.characters(u(c)) do + t[#t+1] = m[cc] or cc + end + end + end + return t +end + +function sorters.sort(data,cmp) + table.sort(data,function(a,b) return cmp(a,b) == -1 end) +end + +function sorters.cleanup(data) + for k,v in ipairs(data) do + for kk,vv in ipairs(v[2]) do + if vv and #vv[1] == 0 then + v[1][kk] = nil + else + vv[3] = nil + end + end + for kk,vv in pairs(v) do + if vv == "" then + v[kk] = nil + end + end + end +end + +function sorters.unique(data) + local prev, last = nil, 0 + for _,v in ipairs(data) do + if not prev or not table.are_equal(prev,v,2,3) then -- check range + last = last + 1 + data[last] = v + prev = v + end + end + for i=last+1,#data do + data[i] = nil + end +end + +function sorters.process(kind,data) + if data.entries then + if not data.sorted then + sorters.language = data.language or sorters.language + sorters[kind].prepare(data.entries) + sorters[kind].sort(data.entries) + sorters[kind].unique(data.entries) + data.sorted = true + end + return sorters[kind].flush(sorters[kind].finalize(data.entries),data.class,data.flush) + else + return { } + end +end diff --git a/tex/context/base/sort-ini.mkiv b/tex/context/base/sort-ini.mkiv new file mode 100644 index 000000000..9c87edb11 --- /dev/null +++ b/tex/context/base/sort-ini.mkiv @@ -0,0 +1,21 @@ +%D \module +%D [ file=sort-ini, +%D version=2005.08.08, +%D title=\CONTEXT\ Sort Macros, +%D subtitle=Initialization, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\registerctxluafile{sort-ini}{1.001} + +\let\savesortlanguage\gobbleoneargument + +\readfile{sort-def.tex}{}{} % runtime loaded in mkii +\readfile{sort-lan.tex}{}{} % runtime loaded in mkii + +\endinput diff --git a/tex/context/base/sort-lan.lua b/tex/context/base/sort-lan.lua new file mode 100644 index 000000000..9802dd315 --- /dev/null +++ b/tex/context/base/sort-lan.lua @@ -0,0 +1,193 @@ +-- filename : sort-lan.lua +-- comment : companion to sort-lan.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not versions then versions = { } end versions['sort-lan'] = 1.001 + +-- this is a rather preliminary and incomplete file +-- maybe we should load this kind of stuff runtime + +-- english + +do + -- The next one can be more efficient when not indexed this way, but + -- other languages are sparse so for the moment we keep this one. + + sorters.entries['en'] = { + [ 1] = "a", [ 3] = "b", [ 5] = "c", [ 7] = "d", [ 9] = "e", + [11] = "f", [13] = "g", [15] = "h", [17] = "i", [19] = "j", + [21] = "k", [23] = "l", [25] = "m", [27] = "n", [29] = "o", + [31] = "p", [33] = "q", [35] = "r", [37] = "s", [39] = "t", + [41] = "u", [43] = "v", [45] = "w", [47] = "x", [49] = "y", + [51] = "z", + [ 2] = 1, [ 4] = 3, [ 6] = 5, [ 8] = 7, [10] = 9, + [12] = 11, [14] = 13, [16] = 15, [18] = 17, [20] = 19, + [22] = 21, [24] = 23, [26] = 25, [28] = 27, [30] = 29, + [32] = 31, [34] = 33, [36] = 35, [38] = 37, [40] = 39, + [42] = 41, [44] = 43, [46] = 45, [48] = 47, [50] = 49, + [52] = 51, + } + sorters.mappings['en'] = { + ["a"] = 1, ["b"] = 3, ["c"] = 5, ["d"] = 7, ["e"] = 9, + ["f"] = 11, ["g"] = 13, ["h"] = 15, ["i"] = 17, ["j"] = 19, + ["k"] = 21, ["l"] = 23, ["m"] = 25, ["n"] = 27, ["o"] = 29, + ["p"] = 31, ["q"] = 33, ["r"] = 35, ["s"] = 37, ["t"] = 39, + ["u"] = 41, ["v"] = 43, ["w"] = 45, ["x"] = 47, ["y"] = 49, + ["z"] = 51, + ["A"] = 2, ["B"] = 4, ["C"] = 6, ["D"] = 8, ["E"] = 10, + ["F"] = 12, ["G"] = 14, ["H"] = 16, ["I"] = 18, ["J"] = 20, + ["K"] = 22, ["L"] = 24, ["M"] = 26, ["N"] = 28, ["O"] = 30, + ["P"] = 32, ["Q"] = 34, ["R"] = 36, ["S"] = 38, ["T"] = 40, + ["U"] = 42, ["V"] = 44, ["W"] = 46, ["X"] = 48, ["Y"] = 50, + ["Z"] = 52, + } +end + +-- dutch + +do + sorters.replacements['nl'] = { { "ij", 'y' }, { "IJ", 'Y' } } + sorters.entries ['nl'] = sorters.entries ['en'] + sorters.mappings ['nl'] = sorters.mappings['en'] +end + +-- czech + +do + + local uc = unicode.utf8.char + local ub = unicode.utf8.byte + + sorters.replacements['cz'] = { + [1] = { "ch", uc(0xFF01) } + } + + sorters.entries['cz'] = { + [ 1] = "a", + [ 2] = 1, + [ 3] = "b", + [ 4] = "c", + [ 5] = uc(0x010D), -- ccaron + [ 6] = "d", + [ 7] = uc(0x010F), -- dcaron + [ 8] = "e", + [ 9] = 8, + [10] = 8, + [11] = "f", + [12] = "g", + [13] = "h", + [14] = "ch", + [15] = "i", + [16] = 15, + [17] = "j", + [18] = "k", + [19] = "l", + [20] = "m", + [21] = "n", + [22] = uc(0x0147), -- ncaron + [23] = "o", + [24] = "p", + [25] = "q", + [26] = "r", + [27] = uc(0x0147), -- rcaron + [28] = "s", + [29] = uc(0x0161), -- scaron + [30] = "t", + [31] = uc(0x0165), -- tcaron + [32] = "u", + [33] = 32, + [34] = 32, + [35] = "v", + [36] = "w", + [37] = "x", + [38] = "y", + [49] = "z", + [40] = uc(0x017E), -- zcaron + } + + sorters.mappings['cz'] = { + ['a'] = 1, -- a + [uc(0x00E1)] = 2, -- aacute + ['b'] = 3, -- b + ['c'] = 4, -- c + [uc(0x010D)] = 5, -- ccaron + ['d'] = 6, -- d + [uc(0x010F)] = 7, -- dcaron + ['e'] = 8, -- e + [uc(0x00E9)] = 9, -- eacute + [uc(0x011B)] = 10, -- ecaron + ['f'] = 11, -- f + ['g'] = 12, -- g + ['h'] = 13, -- h + [uc(0xFF01)] = 14, -- ch + ['i'] = 15, -- i + [uc(0x00ED)] = 16, -- iacute + ['j'] = 17, -- j + ['k'] = 18, -- k + ['l'] = 19, -- l + ['m'] = 20, -- m + ['n'] = 21, -- n + [uc(0x0147)] = 22, -- ncaron + ['o'] = 23, -- o + ['p'] = 24, -- p + ['q'] = 25, -- q + ['s'] = 26, -- r + [uc(0x0147)] = 27, -- rcaron + ['s'] = 28, -- s + [uc(0x0161)] = 29, -- scaron + ['t'] = 30, -- t + [uc(0x0165)] = 31, -- tcaron + ['u'] = 32, -- u + [uc(0x00FA)] = 33, -- uacute + [uc(0x01F6)] = 34, -- uring + ['v'] = 35, -- v + ['w'] = 36, -- w + ['x'] = 37, -- x + ['y'] = 38, -- y + ['z'] = 49, -- z + [uc(0x017E)] = 40, -- zcaron + } + +end + +--~ sorters.test = '' +--~ sorters.test = 'nl' +--~ sorters.test = 'cz' + +--~ if sorters.test == 'nl' then -- dutch test + +--~ data = { +--~ { 'e', { {"ijsco",""} },2,"","","",""}, +--~ { 'e', { {"ysco" ,""} },2,"","","",""}, +--~ { 'e', { {"ijsco",""} },2,"","","",""}, +--~ { 'e', { {"hans" ,""}, {"aap" ,""} },2,"","","",""}, +--~ { 'e', { {"$a$" ,""} },2,"","","",""}, +--~ { 'e', { {"aap" ,""} },2,"","","",""}, +--~ { 'e', { {"hans" ,""}, {"aap" ,""} },6,"","","",""}, +--~ { 'e', { {"hans" ,""}, {"noot",""} },2,"","","",""}, +--~ { 'e', { {"hans" ,""}, {"mies",""} },2,"","","",""}, +--~ { 'e', { {"hans" ,""}, {"mies",""} },2,"","","",""}, +--~ { 'e', { {"hans" ,""}, {"mies",""}, [3] = {"oeps",""} },2,"","","",""}, +--~ { 'e', { {"hans" ,""}, {"mies",""}, [3] = {"oeps",""} },4,"","","",""}, +--~ } +--~ sorters.index.process({ entries = data, language = 'nl'}) + +--~ elseif sorters.test == 'cz' then -- czech test + +--~ data = { +--~ { 'e', { {"blabla",""} },2,"","","",""}, +--~ { 'e', { {"czacza",""} },2,"","","",""}, +--~ { 'e', { {"albalb",""} },2,"","","",""}, +--~ { 'e', { {"azcazc",""} },2,"","","",""}, +--~ { 'e', { {"chacha",""} },2,"","","",""}, +--~ { 'e', { {"hazzah",""} },2,"","","",""}, +--~ { 'e', { {"iaccai",""} },2,"","","",""}, +--~ } +--~ sorters.index.process({ entries = data, language = 'cz'}) + +--~ end + + +--~ print(table.serialize(sorters)) diff --git a/tex/context/base/sort-lan.mkiv b/tex/context/base/sort-lan.mkiv new file mode 100644 index 000000000..918f7f9b7 --- /dev/null +++ b/tex/context/base/sort-lan.mkiv @@ -0,0 +1,16 @@ +%D \module +%D [ file=sort-lan, +%D version=2005.08.08, +%D title=\CONTEXT\ Sort Macros, +%D subtitle=Language Definitions, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\registerctxluafile{sort-lan}{1.001} + +\endinput diff --git a/tex/context/base/spec-def.mkiv b/tex/context/base/spec-def.mkiv new file mode 100644 index 000000000..82e121864 --- /dev/null +++ b/tex/context/base/spec-def.mkiv @@ -0,0 +1,19 @@ +%D \module +%D [ file=spec-def, +%D version=2006.09.18, +%D title=\CONTEXT\ Special Macros, +%D subtitle=Definitions, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D We load the lua scripts here because we don't want to load +%D them multiple times. + +\registerctxluafile{spec-pdf}{1.001} + +\endinput diff --git a/tex/context/base/spec-fdf.mkiv b/tex/context/base/spec-fdf.mkiv new file mode 100644 index 000000000..87a30d0ca --- /dev/null +++ b/tex/context/base/spec-fdf.mkiv @@ -0,0 +1,19 @@ +%D \module +%D [ file=spec-fdf, +%D version=2006.09.18, +%D title=\CONTEXT\ \PDF\ Macros, +%D subtitle=Support Macros, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\def\setPDFdestination#1{\xdef\PDFdestination{\ctxlua{pdf.cleandestination("\luaescapestring{#1}")}}} +\def\sanitizePDFstring#1\to#2{\xdef#2{\ctxlua{pdf.sanitizedstring("\luaescapestring{#1}")}}} + +\protect \endinput diff --git a/tex/context/base/spec-fdf.tex b/tex/context/base/spec-fdf.tex index d6f912df5..7b99dfcc9 100644 --- a/tex/context/base/spec-fdf.tex +++ b/tex/context/base/spec-fdf.tex @@ -3111,7 +3111,7 @@ \PDFcode{/GSknockout gs}% wrong \fi} -%D Transparency support (experimental): +%D Transparency support: \newif\ifPDFtransparencysupported @@ -3126,11 +3126,9 @@ \def\dodoPDFstarttransparency#1#2% {\presetPDFtransparency{#1}{#2}% -% \PDFdirectcode{\PDFtransparencyidentifier\space gs }} \PDFcode{\PDFtransparencyidentifier\space gs }} \def\dodoPDFstoptransparency -% {\PDFdirectcode{/Tr0 gs }} {\PDFcode{/Tr0 gs }} \def\doPDFstarttransparency diff --git a/tex/context/base/spec-pdf.lua b/tex/context/base/spec-pdf.lua new file mode 100644 index 000000000..04886b724 --- /dev/null +++ b/tex/context/base/spec-pdf.lua @@ -0,0 +1,28 @@ +if not modules then modules = { } end modules ['spec-pdf'] = { + version = 1.001, + comment = "companion to spec-fdf.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

This module implements a couple of cleanup methods. We need these +in order to meet the specification. Watch the double +parenthesis; they are needed because otherwise we would pass more +than one argument to .

+--ldx]]-- + +pdf = pdf or { } + +function pdf.cleandestination(str) + tex.sprint((str:gsub("[%/%#%<%>%[%]%(%)%-%s]+","-"))) +end + +function pdf.cleandestination(str) + tex.sprint((str:gsub("[%/%#%<%>%[%]%(%)%-%s]+","-"))) +end + +function pdf.santizedstring(str) + tex.sprint((str:gsub("([\\/#<>%[%]%(%)])","\\%1"))) +end diff --git a/tex/context/base/supp-fil.lua b/tex/context/base/supp-fil.lua new file mode 100644 index 000000000..ecf118104 --- /dev/null +++ b/tex/context/base/supp-fil.lua @@ -0,0 +1,78 @@ +if not modules then modules = { } end modules ['supp-fil'] = { + version = 1.001, + comment = "companion to supp-fil.tex", + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +--[[ldx-- +

It's more convenient to manipulate filenames (paths) in + than in . These methods have counterparts +at the side.

+--ldx]]-- + +support = support or { } +environment = environment or { } + +environment.outputfilename = environment.outputfilename or environment.jobname + +function support.checkfilename(str) -- "/whatever..." "c:..." "http://..." + cs.chardef("kindoffile",boolean.tonumber(str:find("^/") or str:find("[%a]:"))) +end + +function support.thesanitizedfilename(str) + tex.write((str:gsub("\\","/"))) +end + +function support.splitfilename(fullname) + local path, name, base, suffix, kind = '', fullname, fullname, '', 0 + local p, n = fullname:match("^(.+)/(.-)$") + if p and n then + path, name, base = p, n, n + end + local b, s = base:match("^(.+)%.(.-)$") + if b and s then + name, suffix = b, s + end + if path == "" then + kind = 0 + elseif path == '.' then + kind = 1 + else + kind = 2 + end + cs.def("splitofffull", fullname) + cs.def("splitoffpath", path) + cs.def("splitoffbase", base) + cs.def("splitoffname", name) + cs.def("splitofftype", suffix) + cs.chardef("splitoffkind", kind) +end + +function support.splitfiletype(fullname) + local name, suffix = fullname, '' + local n, s = fullname:match("^(.+)%.(.-)$") + if n and s then + name, suffix = n, s + end + cs.def("splitofffull", fullname) + cs.def("splitoffpath", "") + cs.def("splitoffname", name) + cs.def("splitofftype", suffix) +end + +function support.doifparentfileelse(n) + cs.testcase(n==environment.jobname or n==environment.jobname..'.tex' or n==environment.outputfilename) +end + +-- saves some .15 sec on 12 sec format generation + +function support.doiffileexistelse(name) + if not name or name == "" then + return cs.testcase(false) + else + local n = input.findtexfile(texmf.instance,name) + return cs.testcase(n and n ~= "") + end +end diff --git a/tex/context/base/supp-fil.mkiv b/tex/context/base/supp-fil.mkiv new file mode 100644 index 000000000..586004259 --- /dev/null +++ b/tex/context/base/supp-fil.mkiv @@ -0,0 +1,32 @@ +%D \module +%D [ file=supp-fil, +%D version=2006.09.18, +%D title=\CONTEXT\ Support Macros, +%D subtitle=Files, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details + +% \input supp-fil.mkii \endinput + +\registerctxluafile{supp-fil}{1.001} + +% \def\sanitizefilename#1\to#2% +% {\edef#2{\ctxlua{support.thesanitizedfilename("\luaescapestring{#1}")}}} +% \def\checkfilename #1{\ctxlua{support.checkfilename("\luaescapestring{#1}")}} +% \def\splitfilename #1{\ctxlua{support.splitfilename("\luaescapestring{#1}")}} +% \def\splitfiletype #1{\ctxlua{support.splitfiletype("\luaescapestring{#1}")}} +% \def\doifparentfileelse#1{\ctxlua{support.doifparentfileelse("\luaescapestring{#1}")}} + +\def\sanitizefilename#1\to#2{\edef#2{\ctxlua{support.thesanitizedfilename([[#1]])}}} +\def\checkfilename #1{\ctxlua{support.checkfilename([[#1]])}} +\def\splitfilename #1{\ctxlua{support.splitfilename([[#1]])}} +\def\splitfiletype #1{\ctxlua{support.splitfiletype([[#1]])}} +\def\doifparentfileelse #1{\ctxlua{support.doifparentfileelse([[#1]])}} +\def\doiffileexistselse #1{\ctxlua{support.doiffileexistelse([[#1]])}} + +\endinput diff --git a/tex/context/base/syst-cat.mkiv b/tex/context/base/syst-cat.mkiv new file mode 100644 index 000000000..6f3f605b8 --- /dev/null +++ b/tex/context/base/syst-cat.mkiv @@ -0,0 +1,116 @@ +%D \module +%D [ file=syst-cat, +%D version=2006.09.18, +%D title=\CONTEXT\ System Macros, +%D subtitle=Catcode Handling, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\def\newcatcodetable#1% + {\global\advance\cctdefcounter\plusone + \expandafter\xdef\csname @@ccn:\number\cctdefcounter\endcsname{\string#1}% logging + \global\mathchardef#1\cctdefcounter} + +\newcatcodetable \scratchcatcodetable \initcatcodetable\scratchcatcodetable + +\ifx\nilcatcodes \undefined \newcatcodetable \nilcatcodes \fi +\ifx\texcatcodes \undefined \newcatcodetable \texcatcodes \fi +\ifx\ctxcatcodes \undefined \newcatcodetable \ctxcatcodes \fi +\ifx\vrbcatcodes \undefined \newcatcodetable \vrbcatcodes \fi +\ifx\prtcatcodes \undefined \newcatcodetable \prtcatcodes \fi +\ifx\xmlcatcodesn\undefined \newcatcodetable \xmlcatcodesn \fi % normal +\ifx\xmlcatcodese\undefined \newcatcodetable \xmlcatcodese \fi % entitle +\ifx\xmlcatcodesr\undefined \newcatcodetable \xmlcatcodesr \fi % reduce + +\newtoks \setdefaultcatcodes + +\setdefaultcatcodes + {\catcode`\\ 12 + \catcode`\^^M 12 + \catcode`\ 12 + \catcode`\% 12 + \catcode127 12 } + +\long\def\startcatcodetable#1#2\stopcatcodetable + {\bgroup + \catcodetable\scratchcatcodetable + \the\setdefaultcatcodes + #2% + \savecatcodetable#1\relax + \egroup} + +\newcatcodetable\dummycatcodes + +% \long\def\startextendcatcodetable#1#2\stopextendcatcodetable +% {\bgroup +% \catcodetable#1\relax +% #2% +% \savecatcodetable\dummycatcodes +% \catcodetable\dummycatcodes +% \savecatcodetable#1\relax +% \egroup} + +\long\def\startextendcatcodetable#1#2\stopextendcatcodetable + {\bgroup + \catcodetable#1\relax + \globaldefs\plusone + #2% + \globaldefs\zerocount + \egroup} + +% == +% +% \long\def\startextendcatcodetable#1#2\stopextendcatcodetable +% {\bgroup +% \scratchcounter\the\catcodetable +% \catcodetable #1 #2 +% \catcodetable\scratchcounter +% \egroup} + +\def\letcatcodecommand + {\afterassignment\letcatcodecommanda\cctcountera} + +\def\letcatcodecommanda + {\afterassignment\letcatcodecommandb\cctcounterb} + +% construct the definition in lua +% +% \def\letcatcodecommandb +% {\scratchcounter\catcode\cctcounterb \catcode\cctcounterb=13 +% \directlua\CTXlua{tex.print(tex.texcatcodes,"\\xdef " .. string.char(\number\cctcounterb) +% .. "{\\noexpand\\catcodecommand{\number\cctcounterb}}")}% +% \catcode\cctcounterb\scratchcounter +% \expandafter\let\csname cc:\number\cctcountera:\number\cctcounterb\endcsname} +% +% or less messy: +% +% \def\letcatcodecommandb +% {\chardef\savedcctcode\catcode\cctcounterb +% \catcode\cctcounterb=13 +% \expandafter\edef\directlua\CTXlua{tex.sprint(tex.texcatcodes,string.char(\number\cctcounterb))}% +% {\noexpand\catcodecommand{\number\cctcounterb}}% +% \catcode\cctcounterb\savedcctcode +% \expandafter\let\csname cc:\number\cctcountera:\number\cctcounterb\endcsname} + +\let\currentcatcodetable\catcodetable + +\startruntimectxluacode + tex.nilcatcodes = \number\nilcatcodes ; + tex.texcatcodes = \number\texcatcodes ; + tex.ctxcatcodes = \number\ctxcatcodes ; + tex.vrbcatcodes = \number\vrbcatcodes ; + tex.prtcatcodes = \number\prtcatcodes ; + tex.xmlcatcodes = \number\xmlcatcodesn ; + tex.xmlcatcodesn = \number\xmlcatcodesn ; % normal + tex.xmlcatcodese = \number\xmlcatcodese ; % entitle + tex.xmlcatcodesr = \number\xmlcatcodesr ; % reduce +\stopruntimectxluacode + +\protect \endinput diff --git a/tex/context/base/syst-con.lua b/tex/context/base/syst-con.lua new file mode 100644 index 000000000..273bc5b5c --- /dev/null +++ b/tex/context/base/syst-con.lua @@ -0,0 +1,30 @@ +-- filename : syst-con.lua +-- comment : companion to syst-con.tex (in ConTeXt) +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- remark : compact version + +if not versions then versions = { } end versions['syst-con'] = 1.001 +if not convert then convert = { } end + +-- For raw 8 bit characters, the offset is 0x110000 (bottom of plane 18) +-- at the top of luatex's char range but outside the unicode range. + +function convert.lchexnumber (n) tex.sprint(string.format("%x" ,n)) end +function convert.uchexnumber (n) tex.sprint(string.format("%X" ,n)) end +function convert.lchexnumbers (n) tex.sprint(string.format("%02x",n)) end +function convert.uchexnumbers (n) tex.sprint(string.format("%02X",n)) end +function convert.octnumber (n) tex.sprint(string.format("%03o",n)) end +function convert.hexstringtonumber(n) tex.sprint(tonumber(n,16)) end +function convert.octstringtonumber(n) tex.sprint(tonumber(n, 8)) end +function convert.rawcharacter (n) tex.sprint(unicode.utf8.char(0x110000+n)) end + +do + local char = unicode.utf8.char + local flush = tex.sprint + + function convert.rawcharacter(n) flush(char(0x110000+n)) end + +end diff --git a/tex/context/base/syst-con.mkiv b/tex/context/base/syst-con.mkiv new file mode 100644 index 000000000..ddc9fe564 --- /dev/null +++ b/tex/context/base/syst-con.mkiv @@ -0,0 +1,27 @@ +%D \module +%D [ file=syst-con, +%D version=2006.09.16, +%D title=\CONTEXT\ System Macros, +%D subtitle=Conversions, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\registerctxluafile{syst-con}{1.001} + +\unprotect + +\def\lchexnumber #1{\ctxlua{convert.lchexnumber(\number#1)}} +\def\uchexnumber #1{\ctxlua{convert.uchexnumber(\number#1)}} +\def\lchexnumbers #1{\ctxlua{convert.lchexnumbers(\number#1)}} +\def\uchexnumbers #1{\ctxlua{convert.uchexnumbers(\number#1)}} +\def\octnumber #1{\ctxlua{convert.octnumber(\number#1)}} +\def\hexstringtonumber#1{\ctxlua{convert.hexstringtonumber("#1")}} +\def\octstringtonumber#1{\ctxlua{convert.octstringtonumber("#1")}} +\def\rawcharacter #1{\ctxlua{convert.rawcharacter(\number#1)}} + +\protect \endinput diff --git a/tex/context/base/syst-new.tex b/tex/context/base/syst-new.tex index dca897ac0..853b2514c 100644 --- a/tex/context/base/syst-new.tex +++ b/tex/context/base/syst-new.tex @@ -65,6 +65,21 @@ \def\unspaceafter#1#2% {\edef\ascii{\dounspaced#2\end}\@EA#1\@EA{\ascii}} + +% sometimes handy: + +\def\doifhasspaceelse#1% + {\edef\!!stringa{#1}% + \expanded{\dodoifhasspaceelse#1\space}\empty\relax} + +\def\dodoifhasspaceelse#1 #2#3\relax % \space\empty\relax + {\ifx\!!stringa\space + \@EA\firstoftwoarguments + \else\ifx#2\empty + \@EAEAEA\secondoftwoarguments + \else + \@EAEAEA\firstoftwoarguments + \fi\fi} % this will replace loadfile once and alike !!! todo diff --git a/tex/context/base/syst-prm.tex b/tex/context/base/syst-prm.tex index ea7b5634c..dc259dff7 100644 --- a/tex/context/base/syst-prm.tex +++ b/tex/context/base/syst-prm.tex @@ -102,19 +102,51 @@ \ifx\directlua\undefined - \long\gdef\beginMETATEX#1\endMETATEX% + \long\gdef\beginLUATEX#1\endLUATEX% {} \else - \gdef\beginMETATEX% - {\bgroup\obeylines\dobeginMETATEX} + \gdef\beginLUATEX% + {\bgroup\obeylines\dobeginLUATEX} - \gdef\dobeginMETATEX#1 + \gdef\dobeginLUATEX#1 {\egroup\immediate\write16% - {system (METATEX) : [line \the\inputlineno] \detokenize{#1}}} + {system (LUATEX) : [line \the\inputlineno] \detokenize{#1}}} - \global\let\endMETATEX\relax + \global\let\endLUATEX\relax + +\fi + +% traditional tex's vs de utf tex's + +\ifx\XeTeXversion\undefined \ifx\directlua\undefined + + \gdef\beginOLDTEX% + {\bgroup\obeylines\dobeginOLDTEX} + + \gdef\dobeginOLDTEX#1 + {\egroup\immediate\write16% + {system (OLDTEX) : [line \the\inputlineno] \detokenize{#1}}} + + \global\let\endOLDTEX\relax + + \long\gdef\beginNEWTEX#1\endNEWTEX% + {} + +\fi \fi \ifx\beginOLDTEX\undefined + + \long\gdef\beginOLDTEX#1\endOLDTEX% + {} + + \gdef\beginNEWTEX% + {\bgroup\obeylines\dobeginNEWTEX} + + \gdef\dobeginNEWTEX#1 + {\egroup\immediate\write16% + {system (NEWTEX) : [line \the\inputlineno] \detokenize{#1}}} + + \global\let\endNEWTEX\relax \fi diff --git a/tex/context/base/syst-rtp.mkiv b/tex/context/base/syst-rtp.mkiv new file mode 100644 index 000000000..36ce8edb1 --- /dev/null +++ b/tex/context/base/syst-rtp.mkiv @@ -0,0 +1,18 @@ +%D \module +%D [ file=syst-rtp, +%D version=2006.10.13, +%D title=\CONTEXT\ Core Macros, +%D subtitle=Run Time Processes, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +\def\executesystemcommand#1{\ctxlua{os.execute([[#1]])}} + +\protect \endinput diff --git a/tex/context/base/syst-str.mkiv b/tex/context/base/syst-str.mkiv new file mode 100644 index 000000000..6d0f0565e --- /dev/null +++ b/tex/context/base/syst-str.mkiv @@ -0,0 +1,27 @@ +%D \module +%D [ file=syst-str, +%D version=2006.09.18, +%D title=\CONTEXT\ System Macros, +%D subtitle=String Processing, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\unprotect + +% todo: escape special chars in expr (\luaescapeexpression) + +\def\replacecharacters#1#2#3% macro characters replacement + {\dodoglobal\edef#1{\ctxlua{tex.sprint((string.gsub("#1",string.esc(#2),"#3")))}}} + +\def\separatestring#1\to#2% + {\dodoglobal\def#2{\ctxlua{tex.sprint(string.gsub(("#1","\letterpercent s+",","))})}} + +\def\unspacefilename#1\to#2% + {\dodoglobal\def#2{\ctxlua{tex.sprint(string.gsub(("#1","\letterpercent s+","-")))}}} + +\protect \endinput diff --git a/tex/context/base/toks-ini.lua b/tex/context/base/toks-ini.lua new file mode 100644 index 000000000..ad046be50 --- /dev/null +++ b/tex/context/base/toks-ini.lua @@ -0,0 +1,232 @@ +if not modules then modules = { } end modules ['toks-ini'] = { + version = 1.001, + author = "Hans Hagen, PRAGMA-ADE, Hasselt NL", + copyright = "PRAGMA ADE / ConTeXt Development Team", + license = "see context related readme files" +} + +utf = utf or unicode.utf8 + +--[[ldx-- +

This code is experimental.

+--ldx]]-- + + +-- 1 = command, 2 = modifier (char), 3 = controlsequence id +-- +-- callback.register('token_filter', token.get_next) +-- +-- token.get_next() +-- token.expand() +-- token.create() +-- token.csname_id() +-- token.csname_name(v) +-- token.command_id() +-- token.command_name(v) +-- token.is_expandable() +-- token.is_activechar() +-- token.lookup(v) + +-- actually, we can use token registers to store tokens + +tokens = tokens or { } + +tokens.vbox = token.create("vbox") +tokens.hbox = token.create("hbox") +tokens.vtop = token.create("vtop") +tokens.bgroup = token.create(utf.byte("{"), 1) +tokens.egroup = token.create(utf.byte("}"), 2) + +tokens.letter = function(chr) return token.create(utf.byte(chr), 11) end +tokens.other = function(chr) return token.create(utf.byte(chr), 12) end + +tokens.letters = function(str) + local t = { } + for chr in string.utfvalues(str) do + t[#t+1] = token.create(chr, 11) + end + return t +end + +collector = collector or { } +collector.data = collector.data or { } + +function tex.printlist(data) + callbacks.push('token_filter', function () + callbacks.pop('token_filter') + return data + end) +end + +function collector.flush(tag) + tex.printlist(collector.data[tag]) +end + +function collector.test(tag) + tex.printlist(collector.data[tag]) +end + +collector.registered = { } + +function collector.register(name) + collector.registered[token.csname_id(name)] = name +end + +function collector.install(tag,end_cs) + collector.data[tag] = { } + local data = collector.data[tag] + local call = token.command_id("call") + local relax = token.command_id("relax") + local endcs = token.csname_id(end_cs) + local expand = collector.registered + local get = token.get_next -- so no callback! + while true do + local t = get() + local a, b = t[1], t[3] + if a == relax and b == endcs then + return + elseif a == call and expand[b] then + token.expand() + else + data[#data+1] = t + end + end +end + +collector.show_methods = { } + +function collector.show(tag, method) + if type(tag) == "table" then + collector.show_methods[method or 'a'](tag) + else + collector.show_methods[method or 'a'](collector.data[tag]) + end +end + +commands = commands or { } + +commands.letter = token.command_id("letter") +commands.other = token.command_id("other_char") + +function collector.default_words(t,str) + t[#t+1] = tokens.bgroup + t[#t+1] = token.create("red") + for k,v in ipairs(str) do + t[#t+1] = tokens.other('*') + end + t[#t+1] = tokens.egroup +end + +function collector.with_words(tag,handle) + local t, w = { }, { } + handle = handle or collector.default_words + for _,v in ipairs(collector.data[tag]) do + if v[1] == commands.letter then + w[#w+1] = v[2] + else + if #w > 0 then + handle(t,w) + w = { } + end + t[#t+1] = v + end + end + if #w > 0 then + handle(t,w) + end + collector.data[tag] = t +end + +function collector.show_token(t) + if t then + local cmd, chr, id, cs, name = t[1], t[2], t[3], nil, token.command_name(t) or "" + if cmd == commands.letter or cmd == commands.other then + return string.format("%s-> %s -> %s", name, chr, utf.char(chr)) + elseif id > 0 then + cs = token.csname_name(t) or nil + if cs then + return string.format("%s-> %s", name, cs) + elseif tonumber(chr) < 0 then + return string.format("%s-> %s", name, id) + else + return string.format("%s-> (%s,%s)", name, chr, id) + end + else + return string.format("%s", name) + end + else + return "no node" + end +end + +function collector.trace() + local t = token.get_next() + texio.write_nl(collector.show_token(t)) + return t +end + +collector.show_methods.a = function(data) -- no need to store the table, just pass directly + local flush, ct = tex.sprint, tex.ctxcatcodes + local template = "\\NC %s\\NC %s\\NC %s\\NC %s\\NC %s\\NC\\NR " + flush(ct, "\\starttabulate[|T|Tr|cT|Tr|T|]") + flush(ct, template:format("cmd","chr","","id","name")) + flush(ct, "\\HL") + for _,v in pairs(data) do + local cmd, chr, id, cs, sym = v[1], v[2], v[3], "", "" + local name = (token.command_name(v) or ""):gsub("_","\\_") + if id > 0 then + cs = token.csname_name(v) or "" + if cs ~= "" then cs = "\\string " .. cs end + else + id = "" + end + if cmd == commands.letter or cmd == commands.other then + sym = "\\char " .. chr + end + if tonumber(chr) < 0 then + flush(ct, template:format(name, "", sym, id, cs)) + else + flush(ct, template:format(name, chr, sym, id, cs)) + end + end + flush(ct, "\\stoptabulate") +end + +collector.show_methods.b_c = function(data,swap) -- no need to store the table, just pass directly + local flush, ct = tex.sprint, tex.ctxcatcodes + local template = "\\NC %s\\NC %s\\NC %s\\NC\\NR" + if swap then + flush(ct, "\\starttabulate[|Tl|Tl|Tr|]") + else + flush(ct, "\\starttabulate[|Tl|Tr|Tl|]") + end + flush(ct, template:format("cmd","chr","name")) + flush(ct, "\\HL") + for _,v in pairs(data) do + local cmd, chr, id, cs, sym = v[1], v[2], v[3], "", "" + local name = (token.command_name(v) or ""):gsub("_","\\_") + if id > 0 then + cs = token.csname_name(v) or "" + end + if cmd == commands.letter or cmd == commands.other then + sym = "\\char " .. chr + elseif cs ~= "" then + if token.is_activechar(v) then + sym = "\\string " .. cs + else + sym = "\\string\\" .. cs + end + end + if swap then + flush(ct, template:format(name, sym, chr)) + elseif tonumber(chr) < 0 then + flush(ct, template:format(name, "", sym)) + else + flush(ct, template:format(name, chr, sym)) + end + end + flush(ct, "\\stoptabulate") +end + +collector.show_methods.b = function(tag) collector.show_methods.b_c(tag,false) end +collector.show_methods.c = function(tag) collector.show_methods.b_c(tag,true ) end diff --git a/tex/context/base/toks-ini.tex b/tex/context/base/toks-ini.tex new file mode 100644 index 000000000..873cfa4d5 --- /dev/null +++ b/tex/context/base/toks-ini.tex @@ -0,0 +1,25 @@ +%D \module +%D [ file=toks-ini, +%D version=2007.03.03, +%D title=\CONTEXT\ Character Macros, +%D subtitle=Token Support (Initialization), +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright=PRAGMA] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\writestatus{loading}{Token Support (initialization)} + +\registerctxluafile{toks-ini}{1.001} + +\def\starttokens [#1]{\ctxlua{collector.install("#1", "stoptokens")}} +\let\stoptokens \relax +\def\flushtokens [#1]{\ctxlua{collector.flush("#1")}} +\def\showtokens [#1]{\ctxlua{collector.show("#1")}} +\def\testtokens [#1]{\ctxlua{collector.with_words("#1")}} +\def\registertoken #1{\ctxlua{collector.register("#1")}} + +\endinput diff --git a/tex/context/base/type-buy.tex b/tex/context/base/type-buy.tex index 7ccbac9ca..555535388 100644 --- a/tex/context/base/type-buy.tex +++ b/tex/context/base/type-buy.tex @@ -20,467 +20,442 @@ % temporary code, replaced by setups \starttypescript [serif] [fallback] - - \definefontsynonym [SerifBold] [Serif] - \definefontsynonym [SerifItalic] [Serif] - \definefontsynonym [SerifSlanted] [SerifItalic] - \definefontsynonym [SerifBoldItalic] [SerifBold] - \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic] - \definefontsynonym [SerifCaps] [Serif] - + \definefontsynonym [SerifBold] [Serif] + \definefontsynonym [SerifItalic] [Serif] + \definefontsynonym [SerifSlanted] [SerifItalic] + \definefontsynonym [SerifBoldItalic] [SerifBold] + \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic] + \definefontsynonym [SerifCaps] [Serif] \stoptypescript \starttypescript [sans] [fallback] - - \definefontsynonym [SansBold] [Sans] - \definefontsynonym [SansItalic] [Sans] - \definefontsynonym [SansSlanted] [SansItalic] - \definefontsynonym [SansBoldItalic] [SansBold] - \definefontsynonym [SansBoldSlanted] [SansBoldItalic] - \definefontsynonym [SansCaps] [Sans] - + \definefontsynonym [SansBold] [Sans] + \definefontsynonym [SansItalic] [Sans] + \definefontsynonym [SansSlanted] [SansItalic] + \definefontsynonym [SansBoldItalic] [SansBold] + \definefontsynonym [SansBoldSlanted] [SansBoldItalic] + \definefontsynonym [SansCaps] [Sans] \stoptypescript \starttypescript [mono] [fallback] - - \definefontsynonym [MonoBold] [Mono] - \definefontsynonym [MonoItalic] [Mono] - \definefontsynonym [MonoSlanted] [MonoItalic] - \definefontsynonym [MonoBoldItalic] [MonoBold] - \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic] - \definefontsynonym [MonoCaps] [Mono] - + \definefontsynonym [MonoBold] [Mono] + \definefontsynonym [MonoItalic] [Mono] + \definefontsynonym [MonoSlanted] [MonoItalic] + \definefontsynonym [MonoBoldItalic] [MonoBold] + \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic] + \definefontsynonym [MonoCaps] [Mono] \stoptypescript % Lucida Bright : Biggelow and Holmes -\starttypescript [map] [lucida] [ec,8r,texnansi] - \loadmapfile [\typescriptthree-bh-lucida.map] -\stoptypescript - \starttypescript [serif] [lucida] [name] - \definefontsynonym [Serif] [LucidaBright] - \definefontsynonym [SerifBold] [LucidaBright-Demi] - \definefontsynonym [SerifItalic] [LucidaBright-Italic] - \definefontsynonym [SerifSlanted] [LucidaBright-Oblique] - \definefontsynonym [SerifBoldItalic] [LucidaBright-DemiItalic] - \definefontsynonym [SerifBoldSlanted] [LucidaBright-DemiItalic] - \definefontsynonym [SerifCaps] [LucidaBrightSmallcaps] - \definefontsynonym [SerifBoldCaps] [LucidaBrightSmallcaps-Demi] + \definefontsynonym [Serif] [LucidaBright] + \definefontsynonym [SerifBold] [LucidaBright-Demi] + \definefontsynonym [SerifItalic] [LucidaBright-Italic] + \definefontsynonym [SerifSlanted] [LucidaBright-Oblique] + \definefontsynonym [SerifBoldItalic] [LucidaBright-DemiItalic] + \definefontsynonym [SerifBoldSlanted] [LucidaBright-DemiItalic] + \definefontsynonym [SerifCaps] [LucidaBrightSmallcaps] + \definefontsynonym [SerifBoldCaps] [LucidaBrightSmallcaps-Demi] \stoptypescript \starttypescript [sans] [lucida] [name] - \definefontsynonym [Sans] [LucidaSans] - \definefontsynonym [SansBold] [LucidaSans-Demi] - \definefontsynonym [SansItalic] [LucidaSans-Italic] - \definefontsynonym [SansSlanted] [LucidaSans-Italic] - \definefontsynonym [SansBoldItalic] [LucidaSans-DemiItalic] - \definefontsynonym [SansBoldSlanted] [LucidaSans-DemiItalic] - \definefontsynonym [SansCaps] [LucidaSans] + \definefontsynonym [Sans] [LucidaSans] + \definefontsynonym [SansBold] [LucidaSans-Demi] + \definefontsynonym [SansItalic] [LucidaSans-Italic] + \definefontsynonym [SansSlanted] [LucidaSans-Italic] + \definefontsynonym [SansBoldItalic] [LucidaSans-DemiItalic] + \definefontsynonym [SansBoldSlanted] [LucidaSans-DemiItalic] + \definefontsynonym [SansCaps] [LucidaSans] \stoptypescript \starttypescript [mono] [lucida] [name] - \definefontsynonym [Mono] [LucidaSans-Typewriter] - \definefontsynonym [MonoBold] [LucidaSans-TypewriterBold] - \definefontsynonym [MonoItalic] [LucidaSans-TypewriterOblique] - \definefontsynonym [MonoSlanted] [LucidaSans-TypewriterOblique] - \definefontsynonym [MonoBoldItalic] [LucidaSans-TypewriterBoldOblique] - \definefontsynonym [MonoBoldSlanted] [LucidaSans-TypewriterBoldOblique] - \definefontsynonym [MonoCaps] [LucidaSans-Typewriter] + \definefontsynonym [Mono] [LucidaSans-Typewriter] + \definefontsynonym [MonoBold] [LucidaSans-TypewriterBold] + \definefontsynonym [MonoItalic] [LucidaSans-TypewriterOblique] + \definefontsynonym [MonoSlanted] [LucidaSans-TypewriterOblique] + \definefontsynonym [MonoBoldItalic] [LucidaSans-TypewriterBoldOblique] + \definefontsynonym [MonoBoldSlanted] [LucidaSans-TypewriterBoldOblique] + \definefontsynonym [MonoCaps] [LucidaSans-Typewriter] \stoptypescript \starttypescript [math] [lucida] [name] - \definefontsynonym [MathRoman] [LucidaBright] - \definefontsynonym [MathExtension] [LucidaNewMath-Extension] - \definefontsynonym [MathItalic] [LucidaNewMath-AltItalic] - \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol] - \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows] - \definefontsynonym [MathBeta] [LucidaNewMath-Roman] + \definefontsynonym [MathRoman] [LucidaBright] + \definefontsynonym [MathExtension] [LucidaNewMath-Extension] + \definefontsynonym [MathItalic] [LucidaNewMath-AltItalic] + \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol] + \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows] + \definefontsynonym [MathBeta] [LucidaNewMath-Roman] \stoptypescript \starttypescript [math] [lucida] [name] - \definefontsynonym [OldStyle] [MathItalic] - \definefontsynonym [Fraktur] [eufm10] - \definefontsynonym [Blackboard] [MathAlpha] - \definefontsynonym [Gothic] [eufm10] - \definefontsynonym [Calligraphic] [MathSymbol] % math caligraphic ! + \definefontsynonym [OldStyle] [MathItalic] + \definefontsynonym [Fraktur] [eufm10] + \definefontsynonym [Blackboard] [MathAlpha] + \definefontsynonym [Gothic] [eufm10] + \definefontsynonym [Calligraphic] [MathSymbol] % math caligraphic ! \stoptypescript \starttypescript [boldmath] [lucida] [name] - \definefontsynonym [MathRoman] [LucidaBright-Demi] - \definefontsynonym [MathExtension] [LucidaNewMath-Extension] - \definefontsynonym [MathItalic] [LucidaNewMath-AltDemiItalic] - \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol-Demi] - \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows-Demi] - \definefontsynonym [MathBeta] [LucidaNewMath-Demi] + \definefontsynonym [MathRoman] [LucidaBright-Demi] + \definefontsynonym [MathExtension] [LucidaNewMath-Extension] + \definefontsynonym [MathItalic] [LucidaNewMath-AltDemiItalic] + \definefontsynonym [MathSymbol] [LucidaNewMath-Symbol-Demi] + \definefontsynonym [MathAlpha] [LucidaNewMath-Arrows-Demi] + \definefontsynonym [MathBeta] [LucidaNewMath-Demi] \stoptypescript \starttypescript [bfmath] [lucida] [name] - \definefontsynonym [MathRomanBold] [LucidaNewMath-Demi] - \definefontsynonym [MathExtensionBold] [LucidaNewMath-Extension] - \definefontsynonym [MathItalicBold] [LucidaNewMath-AltDemiItalic] - \definefontsynonym [MathSymbolBold] [LucidaNewMath-Symbol-Demi] - \definefontsynonym [MathAlphaBold] [LucidaNewMath-Arrows-Demi] - \definefontsynonym [MathBetaBold] [LucidaNewMath-Demi] + \definefontsynonym [MathRomanBold] [LucidaNewMath-Demi] + \definefontsynonym [MathExtensionBold] [LucidaNewMath-Extension] + \definefontsynonym [MathItalicBold] [LucidaNewMath-AltDemiItalic] + \definefontsynonym [MathSymbolBold] [LucidaNewMath-Symbol-Demi] + \definefontsynonym [MathAlphaBold] [LucidaNewMath-Arrows-Demi] + \definefontsynonym [MathBetaBold] [LucidaNewMath-Demi] \stoptypescript \starttypescript [handwriting] [lucida] [name] - \definefontsynonym [Handwriting] [LucidaHandwriting-Italic] + \definefontsynonym [Handwriting] [LucidaHandwriting-Italic] \stoptypescript \starttypescript [calligraphy] [lucida] [name] - \definefontsynonym [Calligraphy] [LucidaCalligraphy-Italic] + \definefontsynonym [Calligraphy] [LucidaCalligraphy-Italic] \stoptypescript \starttypescript [serif] [lucida] [texnansi,ec,8r] - \definefontsynonym [LucidaBright] [\typescriptthree-lbr] [encoding=\typescriptthree] - \definefontsynonym [LucidaBright-Demi] [\typescriptthree-lbd] [encoding=\typescriptthree] - \definefontsynonym [LucidaBright-DemiItalic] [\typescriptthree-lbdi] [encoding=\typescriptthree] - \definefontsynonym [LucidaBright-Italic] [\typescriptthree-lbi] [encoding=\typescriptthree] - \definefontsynonym [LucidaBrightSmallcaps] [\typescriptthree-lbrsc] [encoding=\typescriptthree] - \definefontsynonym [LucidaBrightSmallcaps-Demi] [\typescriptthree-lbdsc] [encoding=\typescriptthree] - \definefontsynonym [LucidaBright-Oblique] [\typescriptthree-lbsl] [encoding=\typescriptthree] + \definefontsynonym [LucidaBright] [\typescriptthree-lbr] [encoding=\typescriptthree] + \definefontsynonym [LucidaBright-Demi] [\typescriptthree-lbd] [encoding=\typescriptthree] + \definefontsynonym [LucidaBright-DemiItalic] [\typescriptthree-lbdi] [encoding=\typescriptthree] + \definefontsynonym [LucidaBright-Italic] [\typescriptthree-lbi] [encoding=\typescriptthree] + \definefontsynonym [LucidaBrightSmallcaps] [\typescriptthree-lbrsc] [encoding=\typescriptthree] + \definefontsynonym [LucidaBrightSmallcaps-Demi] [\typescriptthree-lbdsc] [encoding=\typescriptthree] + \definefontsynonym [LucidaBright-Oblique] [\typescriptthree-lbsl] [encoding=\typescriptthree] \stoptypescript \starttypescript [sans] [lucida] [texnansi,ec,8r] - \definefontsynonym [LucidaSans] [\typescriptthree-lsr] [encoding=\typescriptthree] - \definefontsynonym [LucidaSans-Demi] [\typescriptthree-lsd] [encoding=\typescriptthree] - \definefontsynonym [LucidaSans-DemiItalic] [\typescriptthree-lsdi] [encoding=\typescriptthree] - \definefontsynonym [LucidaSans-Italic] [\typescriptthree-lsi] [encoding=\typescriptthree] - \definefontsynonym [LucidaSans-Bold] [\typescriptthree-lsb] [encoding=\typescriptthree] - \definefontsynonym [LucidaSans-BoldItalic] [\typescriptthree-lsbi] [encoding=\typescriptthree] + \definefontsynonym [LucidaSans] [\typescriptthree-lsr] [encoding=\typescriptthree] + \definefontsynonym [LucidaSans-Demi] [\typescriptthree-lsd] [encoding=\typescriptthree] + \definefontsynonym [LucidaSans-DemiItalic] [\typescriptthree-lsdi] [encoding=\typescriptthree] + \definefontsynonym [LucidaSans-Italic] [\typescriptthree-lsi] [encoding=\typescriptthree] + \definefontsynonym [LucidaSans-Bold] [\typescriptthree-lsb] [encoding=\typescriptthree] + \definefontsynonym [LucidaSans-BoldItalic] [\typescriptthree-lsbi] [encoding=\typescriptthree] \stoptypescript \starttypescript [mono] [lucida] [texnansi,ec,8r] - \definefontsynonym [LucidaSans-Typewriter] [\typescriptthree-lstr] [encoding=\typescriptthree] - \definefontsynonym [LucidaSans-TypewriterBold] [\typescriptthree-lstb] [encoding=\typescriptthree] - \definefontsynonym [LucidaSans-TypewriterBoldOblique] [\typescriptthree-lstbo] [encoding=\typescriptthree] - \definefontsynonym [LucidaSans-TypewriterOblique] [\typescriptthree-lsto] [encoding=\typescriptthree] + \definefontsynonym [LucidaSans-Typewriter] [\typescriptthree-lstr] [encoding=\typescriptthree] + \definefontsynonym [LucidaSans-TypewriterBold] [\typescriptthree-lstb] [encoding=\typescriptthree] + \definefontsynonym [LucidaSans-TypewriterBoldOblique] [\typescriptthree-lstbo] [encoding=\typescriptthree] + \definefontsynonym [LucidaSans-TypewriterOblique] [\typescriptthree-lsto] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-bh-lucida.map] + \fakecontrolspace \stoptypescript \starttypescript [math] [lucida] [texnansi,ec,8r] - \definefontsynonym [LucidaBright] [\typescriptthree-lbr] [encoding=\typescriptthree] - \definefontsynonym [LucidaNewMath-AltItalic] [lbmo] - \definefontsynonym [LucidaNewMath-Arrows] [lbma] - \definefontsynonym [LucidaNewMath-Extension] [lbme] - \definefontsynonym [LucidaNewMath-Roman] [lbmr] - \definefontsynonym [LucidaNewMath-Italic] [lbmi] - \definefontsynonym [LucidaNewMath-Symbol] [lbms] - \definefontsynonym [LucidaBlackletter] [lbl] + \definefontsynonym [LucidaBright] [\typescriptthree-lbr] [encoding=\typescriptthree] + \definefontsynonym [LucidaNewMath-AltItalic] [lbmo] + \definefontsynonym [LucidaNewMath-Arrows] [lbma] + \definefontsynonym [LucidaNewMath-Extension] [lbme] + \definefontsynonym [LucidaNewMath-Roman] [lbmr] + \definefontsynonym [LucidaNewMath-Italic] [lbmi] + \definefontsynonym [LucidaNewMath-Symbol] [lbms] + \definefontsynonym [LucidaBlackletter] [lbl] + \loadmapfile [\typescriptthree-bh-lucida.map] \stoptypescript \starttypescript [boldmath,bfmath] [lucida] [texnansi,ec,8r] - \definefontsynonym [LucidaNewMath-AltDemiItalic] [lbmdo] - \definefontsynonym [LucidaNewMath-Arrows-Demi] [lbmad] - \definefontsynonym [LucidaNewMath-Extension] [lbme] - \definefontsynonym [LucidaNewMath-Demi] [lbmd] - \definefontsynonym [LucidaNewMath-DemiItalic] [lbmdi] - \definefontsynonym [LucidaNewMath-Symbol-Demi] [lbmsd] + \definefontsynonym [LucidaNewMath-AltDemiItalic] [lbmdo] + \definefontsynonym [LucidaNewMath-Arrows-Demi] [lbmad] + \definefontsynonym [LucidaNewMath-Extension] [lbme] + \definefontsynonym [LucidaNewMath-Demi] [lbmd] + \definefontsynonym [LucidaNewMath-DemiItalic] [lbmdi] + \definefontsynonym [LucidaNewMath-Symbol-Demi] [lbmsd] + \loadmapfile [\typescriptthree-bh-lucida.map] \stoptypescript \starttypescript [calligraphy] [lucida] [texnansi,ec,8r] - \definefontsynonym [LucidaCalligraphy-Italic] [\typescriptthree-lbc] [encoding=\typescriptthree] + \definefontsynonym [LucidaCalligraphy-Italic] [\typescriptthree-lbc] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-bh-lucida.map] \stoptypescript \starttypescript [casual] [lucida] [texnansi,ec,8r] - \definefontsynonym [LucidaCasual] [\typescriptthree-lbkr] [encoding=\typescriptthree] - \definefontsynonym [LucidaCasual-Italic] [\typescriptthree-lbki] [encoding=\typescriptthree] + \definefontsynonym [LucidaCasual] [\typescriptthree-lbkr] [encoding=\typescriptthree] + \definefontsynonym [LucidaCasual-Italic] [\typescriptthree-lbki] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-bh-lucida.map] \stoptypescript \starttypescript [handwriting] [lucida] [texnansi,ec,8r] - \definefontsynonym [LucidaHandwriting-Italic] [\typescriptthree-lbh] [encoding=\typescriptthree] + \definefontsynonym [LucidaHandwriting-Italic] [\typescriptthree-lbh] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-bh-lucida.map] \stoptypescript \starttypescript [fax] [lucida] [texnansi,ec,8r] - \definefontsynonym [LucidaFax] [\typescriptthree-lfr] [encoding=\typescriptthree] - \definefontsynonym [LucidaFax-Demi] [\typescriptthree-lfd] [encoding=\typescriptthree] - \definefontsynonym [LucidaFax-DemiItalic] [\typescriptthree-lfdi] [encoding=\typescriptthree] - \definefontsynonym [LucidaFax-Italic] [\typescriptthree-lfi] [encoding=\typescriptthree] + \definefontsynonym [LucidaFax] [\typescriptthree-lfr] [encoding=\typescriptthree] + \definefontsynonym [LucidaFax-Demi] [\typescriptthree-lfd] [encoding=\typescriptthree] + \definefontsynonym [LucidaFax-DemiItalic] [\typescriptthree-lfdi] [encoding=\typescriptthree] + \definefontsynonym [LucidaFax-Italic] [\typescriptthree-lfi] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-bh-lucida.map] \stoptypescript -% Informal : Vulis +\starttypescript [lucida,lucidabfm] [texnansi,ec,8r,uc] + \definetypeface [lucida] [rm] [serif] [lucida] [default] [encoding=\typescripttwo] + \definetypeface [lucida] [ss] [sans] [lucida] [default] [encoding=\typescripttwo] + \definetypeface [lucida] [tt] [mono] [lucida] [default] [encoding=\typescripttwo] + \definetypeface [lucida] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo] + \definetypeface [lucida] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo] + \loadmapfile [\typescriptthree-bh-lucida.map] +\stoptypescript + +\starttypescript [lucida] [texnansi,ec,8r] + \definetypeface [lucida] [mm] [math] [lucida] [default] [encoding=\typescripttwo] +\stoptypescript -\starttypescript [map] [informal] [default] - \loadmapfile[original-micropress-informal.map] +\starttypescript [lucidaboldmath] [texnansi,ec,8r] + \definetypeface [lucidaboldmath] [rm] [serif] [lucida] [default] [encoding=\typescripttwo] % needed ? + \definetypeface [lucidaboldmath] [ss] [sans] [lucida] [default] [encoding=\typescripttwo] % needed ? + \definetypeface [lucidaboldmath] [tt] [mono] [lucida] [default] [encoding=\typescripttwo] % needed ? + \definetypeface [lucidaboldmath] [mm] [boldmath] [lucida] [default] [encoding=\typescripttwo] \stoptypescript +\starttypescript [lucidabfm,lucidaboldmath] [texnansi,ec,8r] + \definetypeface [lucida] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo] + \definetypeface [lucidaboldmath] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo] +\stoptypescript + +\starttypescript [lucida,lucidabfm,lucidaboldmath] [texnansi,ec,8r] + \usemathcollection[lbr] + \quittypescriptscanning % last in the row +\stoptypescript + +% Informal : Vulis + \starttypescript [casual] [informal] [name] - \definefontsynonym [Serif] [Informal-Regular] - \definefontsynonym [SerifBold] [Informal-Bold] - \definefontsynonym [SerifSlanted] [Informal-Oblique] - \definefontsynonym [SerifItalic] [Informal-Oblique] - \definefontsynonym [SerifBoldSlanted] [Informal-BoldOblique] - \definefontsynonym [SerifBoldItalic] [Informal-BoldOblique] - \definefontsynonym [SerifCaps] [Informal-Regular] + \definefontsynonym [Serif] [Informal-Regular] + \definefontsynonym [SerifBold] [Informal-Bold] + \definefontsynonym [SerifSlanted] [Informal-Oblique] + \definefontsynonym [SerifItalic] [Informal-Oblique] + \definefontsynonym [SerifBoldSlanted] [Informal-BoldOblique] + \definefontsynonym [SerifBoldItalic] [Informal-BoldOblique] + \definefontsynonym [SerifCaps] [Informal-Regular] \stoptypescript \starttypescript [math] [informal] [name] - \definefontsynonym [MathRoman] [Informal-Regular] - \definefontsynonym [MathExtension] [Informal-MathExtendedSymbols] - \definefontsynonym [MathItalic] [Informal-MathItalics] - \definefontsynonym [MathSymbol] [Informal-MathSymbols] + \definefontsynonym [MathRoman] [Informal-Regular] + \definefontsynonym [MathExtension] [Informal-MathExtendedSymbols] + \definefontsynonym [MathItalic] [Informal-MathItalics] + \definefontsynonym [MathSymbol] [Informal-MathSymbols] \stoptypescript \starttypescript [casual] [informal] [default] - \definefontsynonym [Informal-Regular] [ifrm10cm] - \definefontsynonym [Informal-Bold] [ifrb10cm] - \definefontsynonym [Informal-Oblique] [ifro10cm] - \definefontsynonym [Informal-BoldOblique] [ifbo10cm] + \definefontsynonym [Informal-Regular] [ifrm10cm] + \definefontsynonym [Informal-Bold] [ifrb10cm] + \definefontsynonym [Informal-Oblique] [ifro10cm] + \definefontsynonym [Informal-BoldOblique] [ifbo10cm] + \loadmapfile[original-micropress-informal.map] \stoptypescript \starttypescript [math] [informal] [default] - \definefontsynonym [Informal-Regular] [ifrm10cm] - \definefontsynonym [Informal-MathExtendedSymbols] [ifex10] - \definefontsynonym [Informal-MathItalics] [ifmi10] - \definefontsynonym [Informal-MathSymbols] [ifsy10] + \definefontsynonym [Informal-Regular] [ifrm10cm] + \definefontsynonym [Informal-MathExtendedSymbols] [ifex10] + \definefontsynonym [Informal-MathItalics] [ifmi10] + \definefontsynonym [Informal-MathSymbols] [ifsy10] + \loadmapfile[original-micropress-informal.map] \stoptypescript % ITC Officina -\starttypescript [map] [officina] [ec,8r,texnansi] - \loadmapfile [\typescriptthree-itc-officina.map] -\stoptypescript - \starttypescript [serif] [officina] [name] - - \definefontsynonym [Serif] [OfficinaSerif-Book] - \definefontsynonym [SerifItalic] [OfficinaSerif-BookItalic] - \definefontsynonym [SerifSlanted] [OfficinaSerif-BookSlanted] - \definefontsynonym [SerifBold] [OfficinaSerif-Bold] - \definefontsynonym [SerifBoldItalic] [OfficinaSerif-BoldItalic] - \definefontsynonym [SerifBoldSlanted][OfficinaSerif-BoldSlanted] - \definefontsynonym [SerifCaps] [OfficinaSerif-Caps] - + \definefontsynonym [Serif] [OfficinaSerif-Book] + \definefontsynonym [SerifItalic] [OfficinaSerif-BookItalic] + \definefontsynonym [SerifSlanted] [OfficinaSerif-BookSlanted] + \definefontsynonym [SerifBold] [OfficinaSerif-Bold] + \definefontsynonym [SerifBoldItalic] [OfficinaSerif-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [OfficinaSerif-BoldSlanted] + \definefontsynonym [SerifCaps] [OfficinaSerif-Caps] \stoptypescript \starttypescript [sans] [officina] [name] - - \definefontsynonym [Sans] [OfficinaSans-Book] - \definefontsynonym [SansItalic] [OfficinaSans-BookItalic] - \definefontsynonym [SansSlanted] [OfficinaSans-BookSlanted] - \definefontsynonym [SansBold] [OfficinaSans-Bold] - \definefontsynonym [SansBoldItalic] [OfficinaSans-BoldItalic] - \definefontsynonym [SansBoldSlanted][OfficinaSans-BoldSlanted] - \definefontsynonym [SansCaps] [OfficinaSans-Caps] - + \definefontsynonym [Sans] [OfficinaSans-Book] + \definefontsynonym [SansItalic] [OfficinaSans-BookItalic] + \definefontsynonym [SansSlanted] [OfficinaSans-BookSlanted] + \definefontsynonym [SansBold] [OfficinaSans-Bold] + \definefontsynonym [SansBoldItalic] [OfficinaSans-BoldItalic] + \definefontsynonym [SansBoldSlanted] [OfficinaSans-BoldSlanted] + \definefontsynonym [SansCaps] [OfficinaSans-Caps] \stoptypescript \starttypescript [serif] [officina] [texnansi,ec,8r] - - \definefontsynonym [OfficinaSerif-Book] [\typescriptthree-ovbk] [encoding=\typescriptthree] - \definefontsynonym [OfficinaSerif-BookItalic] [\typescriptthree-ovwi] [encoding=\typescriptthree] - \definefontsynonym [OfficinaSerif-Bold] [\typescriptthree-ovb] [encoding=\typescriptthree] - \definefontsynonym [OfficinaSerif-BoldItalic] [\typescriptthree-ovbi] [encoding=\typescriptthree] - - \definefontsynonym [OfficinaSerif-BookSlanted][\typescriptthree-ovbk-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [OfficinaSerif-BoldSlanted][\typescriptthree-ovb-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [OfficinaSerif-Caps] [\typescriptthree-ovbk-capitalized-800] [encoding=\typescriptthree] - + \definefontsynonym [OfficinaSerif-Book] [\typescriptthree-ovbk] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSerif-BookItalic] [\typescriptthree-ovwi] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSerif-Bold] [\typescriptthree-ovb] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSerif-BoldItalic] [\typescriptthree-ovbi] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSerif-BookSlanted] [\typescriptthree-ovbk-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSerif-BoldSlanted] [\typescriptthree-ovb-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSerif-Caps] [\typescriptthree-ovbk-capitalized-800] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-itc-officina.map] \stoptypescript \starttypescript [sans] [officina] [texnansi,ec,8r] - - \definefontsynonym [OfficinaSans-Book] [\typescriptthree-owbk] [encoding=\typescriptthree] - \definefontsynonym [OfficinaSans-BookItalic] [\typescriptthree-owwi] [encoding=\typescriptthree] - \definefontsynonym [OfficinaSans-Bold] [\typescriptthree-owb] [encoding=\typescriptthree] - \definefontsynonym [OfficinaSans-BoldItalic] [\typescriptthree-owbi] [encoding=\typescriptthree] - - \definefontsynonym [OfficinaSans-BookSlanted][\typescriptthree-owbk-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [OfficinaSans-BoldSlanted][\typescriptthree-owb-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [OfficinaSans-Caps] [\typescriptthree-owbk-capitalized-800] [encoding=\typescriptthree] - + \definefontsynonym [OfficinaSans-Book] [\typescriptthree-owbk] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSans-BookItalic] [\typescriptthree-owwi] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSans-Bold] [\typescriptthree-owb] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSans-BoldItalic] [\typescriptthree-owbi] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSans-BookSlanted] [\typescriptthree-owbk-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSans-BoldSlanted] [\typescriptthree-owb-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [OfficinaSans-Caps] [\typescriptthree-owbk-capitalized-800] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-itc-officina.map] \stoptypescript % FontFont Meta -\starttypescript [map] [meta] [ec,8r,texnansi] - \loadmapfile [\typescriptthree-fontfont-meta.map] -\stoptypescript - \starttypescript [sans] [meta] [name] - - \definefontsynonym [Sans] [MetaNormal-Roman] - \definefontsynonym [SansItalic] [MetaNormal-Italic] - \definefontsynonym [SansSlanted] [MetaNormal-Italic] - \definefontsynonym [SansBold] [MetaBold-Roman] - \definefontsynonym [SansBoldItalic] [MetaBold-Italic] - \definefontsynonym [SansBoldSlanted][MetaBold-Italic] - \definefontsynonym [SansCaps] [MetaNormal-Caps] - + \definefontsynonym [Sans] [MetaNormal-Roman] + \definefontsynonym [SansItalic] [MetaNormal-Italic] + \definefontsynonym [SansSlanted] [MetaNormal-Italic] + \definefontsynonym [SansBold] [MetaBold-Roman] + \definefontsynonym [SansBoldItalic] [MetaBold-Italic] + \definefontsynonym [SansBoldSlanted][MetaBold-Italic] + \definefontsynonym [SansCaps] [MetaNormal-Caps] \stoptypescript \starttypescript [sans] [meta-medium] [name] - - \definefontsynonym [Sans] [MetaMedium-Roman] - \definefontsynonym [SansItalic] [MetaMedium-Italic] - \definefontsynonym [SansSlanted] [MetaMedium-Italic] - \definefontsynonym [SansBold] [MetaBold-Roman] - \definefontsynonym [SansBoldItalic] [MetaBold-Italic] - \definefontsynonym [SansBoldSlanted][MetaBold-Italic] - \definefontsynonym [SansCaps] [MetaMedium-Caps] - + \definefontsynonym [Sans] [MetaMedium-Roman] + \definefontsynonym [SansItalic] [MetaMedium-Italic] + \definefontsynonym [SansSlanted] [MetaMedium-Italic] + \definefontsynonym [SansBold] [MetaBold-Roman] + \definefontsynonym [SansBoldItalic] [MetaBold-Italic] + \definefontsynonym [SansBoldSlanted][MetaBold-Italic] + \definefontsynonym [SansCaps] [MetaMedium-Caps] \stoptypescript \starttypescript [sans] [meta-lf] [name] - - \definefontsynonym [Sans] [MetaBookLF-Roman] - \definefontsynonym [SansBold] [MetaBoldLF-Roman] - \definefontsynonym [SansItalic] [MetaBookLF-Italic] - \definefontsynonym [SansBoldItalic] [MetaBoldLF-Italic] - \definefontsynonym [SansCaps] [MetaBookLF-Caps] - + \definefontsynonym [Sans] [MetaBookLF-Roman] + \definefontsynonym [SansBold] [MetaBoldLF-Roman] + \definefontsynonym [SansItalic] [MetaBookLF-Italic] + \definefontsynonym [SansBoldItalic] [MetaBoldLF-Italic] + \definefontsynonym [SansCaps] [MetaBookLF-Caps] \stoptypescript \starttypescript [sans] [meta,meta-book] [texnansi,ec,8r] - - \definefontsynonym [MetaBook-Roman] [\typescriptthree-mtbk] [encoding=\typescriptthree] - \definefontsynonym [MetaBook-Italic] [\typescriptthree-mtbki] [encoding=\typescriptthree] - \definefontsynonym [MetaBook-Caps] [\typescriptthree-mtbkc] [encoding=\typescriptthree] - \definefontsynonym [MetaBook-ItalicCaps] [\typescriptthree-mtbkic] [encoding=\typescriptthree] - + \definefontsynonym [MetaBook-Roman] [\typescriptthree-mtbk] [encoding=\typescriptthree] + \definefontsynonym [MetaBook-Italic] [\typescriptthree-mtbki] [encoding=\typescriptthree] + \definefontsynonym [MetaBook-Caps] [\typescriptthree-mtbkc] [encoding=\typescriptthree] + \definefontsynonym [MetaBook-ItalicCaps] [\typescriptthree-mtbkic] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-fontfont-meta.map] \stoptypescript \starttypescript [sans] [meta-lf,meta-book-lf] [texnansi,ec,8r] - - \definefontsynonym [MetaBookLF-Roman] [\typescriptthree-mtbkf] [encoding=\typescriptthree] - \definefontsynonym [MetaBookLF-Italic] [\typescriptthree-mtbkfi] [encoding=\typescriptthree] - \definefontsynonym [MetaBookLF-Caps] [\typescriptthree-mtbkfc] [encoding=\typescriptthree] - \definefontsynonym [MetaBookLF-ItalicCaps] [\typescriptthree-mtbkfic] [encoding=\typescriptthree] - + \definefontsynonym [MetaBookLF-Roman] [\typescriptthree-mtbkf] [encoding=\typescriptthree] + \definefontsynonym [MetaBookLF-Italic] [\typescriptthree-mtbkfi] [encoding=\typescriptthree] + \definefontsynonym [MetaBookLF-Caps] [\typescriptthree-mtbkfc] [encoding=\typescriptthree] + \definefontsynonym [MetaBookLF-ItalicCaps] [\typescriptthree-mtbkfic] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-fontfont-meta.map] \stoptypescript \starttypescript [sans] [meta,meta-bold] [texnansi,ec,8r] - - \definefontsynonym [MetaBold-Roman] [\typescriptthree-mtbd] [encoding=\typescriptthree] - \definefontsynonym [MetaBold-Italic] [\typescriptthree-mtbdi] [encoding=\typescriptthree] - \definefontsynonym [MetaBold-Caps] [\typescriptthree-mtbdc] [encoding=\typescriptthree] - \definefontsynonym [MetaBold-ItalicCaps] [\typescriptthree-mtbdic] [encoding=\typescriptthree] - + \definefontsynonym [MetaBold-Roman] [\typescriptthree-mtbd] [encoding=\typescriptthree] + \definefontsynonym [MetaBold-Italic] [\typescriptthree-mtbdi] [encoding=\typescriptthree] + \definefontsynonym [MetaBold-Caps] [\typescriptthree-mtbdc] [encoding=\typescriptthree] + \definefontsynonym [MetaBold-ItalicCaps] [\typescriptthree-mtbdic] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-fontfont-meta.map] \stoptypescript \starttypescript [sans] [meta-lf,meta-bold-lf] [texnansi,ec,8r] - - \definefontsynonym [MetaBoldLF-Roman] [\typescriptthree-mtbdf] [encoding=\typescriptthree] - \definefontsynonym [MetaBoldLF-Italic] [\typescriptthree-mtbdfi] [encoding=\typescriptthree] - \definefontsynonym [MetaBoldLF-Caps] [\typescriptthree-mtbdfc] [encoding=\typescriptthree] - \definefontsynonym [MetaBoldLF-ItalicCaps] [\typescriptthree-mtbdfic] [encoding=\typescriptthree] - + \definefontsynonym [MetaBoldLF-Roman] [\typescriptthree-mtbdf] [encoding=\typescriptthree] + \definefontsynonym [MetaBoldLF-Italic] [\typescriptthree-mtbdfi] [encoding=\typescriptthree] + \definefontsynonym [MetaBoldLF-Caps] [\typescriptthree-mtbdfc] [encoding=\typescriptthree] + \definefontsynonym [MetaBoldLF-ItalicCaps] [\typescriptthree-mtbdfic] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-fontfont-meta.map] \stoptypescript \starttypescript [sans] [meta-normal] [texnansi,ec,8r] - - \definefontsynonym [MetaNormal-Roman] [\typescriptthree-mtn] [encoding=\typescriptthree] - \definefontsynonym [MetaNormal-Italic] [\typescriptthree-mtni] [encoding=\typescriptthree] - \definefontsynonym [MetaNormal-Caps] [\typescriptthree-mtnc] [encoding=\typescriptthree] - \definefontsynonym [MetaNormal-ItalicCaps] [\typescriptthree-mtnic] [encoding=\typescriptthree] - + \definefontsynonym [MetaNormal-Roman] [\typescriptthree-mtn] [encoding=\typescriptthree] + \definefontsynonym [MetaNormal-Italic] [\typescriptthree-mtni] [encoding=\typescriptthree] + \definefontsynonym [MetaNormal-Caps] [\typescriptthree-mtnc] [encoding=\typescriptthree] + \definefontsynonym [MetaNormal-ItalicCaps] [\typescriptthree-mtnic] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-fontfont-meta.map] \stoptypescript \starttypescript [sans] [meta-normal-lf] [texnansi,ec,8r] - - \definefontsynonym [MetaNormalLF-Roman] [\typescriptthree-mtnf] [encoding=\typescriptthree] - \definefontsynonym [MetaNormalLF-Italic] [\typescriptthree-mtnfi] [encoding=\typescriptthree] - \definefontsynonym [MetaNormalLF-Caps] [\typescriptthree-mtnfc] [encoding=\typescriptthree] - \definefontsynonym [MetaNormalLF-ItalicCaps] [\typescriptthree-mtnfic] [encoding=\typescriptthree] - + \definefontsynonym [MetaNormalLF-Roman] [\typescriptthree-mtnf] [encoding=\typescriptthree] + \definefontsynonym [MetaNormalLF-Italic] [\typescriptthree-mtnfi] [encoding=\typescriptthree] + \definefontsynonym [MetaNormalLF-Caps] [\typescriptthree-mtnfc] [encoding=\typescriptthree] + \definefontsynonym [MetaNormalLF-ItalicCaps] [\typescriptthree-mtnfic] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-fontfont-meta.map] \stoptypescript \starttypescript [sans] [meta-medium] [texnansi,ec,8r] - - \definefontsynonym [MetaMedium-Roman] [\typescriptthree-mtm] [encoding=\typescriptthree] - \definefontsynonym [MetaMedium-Italic] [\typescriptthree-mtmi] [encoding=\typescriptthree] - \definefontsynonym [MetaMedium-Caps] [\typescriptthree-mtmc] [encoding=\typescriptthree] - \definefontsynonym [MetaMedium-ItalicCaps] [\typescriptthree-mtmic] [encoding=\typescriptthree] - + \definefontsynonym [MetaMedium-Roman] [\typescriptthree-mtm] [encoding=\typescriptthree] + \definefontsynonym [MetaMedium-Italic] [\typescriptthree-mtmi] [encoding=\typescriptthree] + \definefontsynonym [MetaMedium-Caps] [\typescriptthree-mtmc] [encoding=\typescriptthree] + \definefontsynonym [MetaMedium-ItalicCaps] [\typescriptthree-mtmic] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-fontfont-meta.map] \stoptypescript \starttypescript [sans] [meta-medium-lf] [texnansi,ec,8r] - - \definefontsynonym [MetaMediumLF-Roman] [\typescriptthree-mtmf] [encoding=\typescriptthree] - \definefontsynonym [MetaMediumLF-Italic] [\typescriptthree-mtmfi] [encoding=\typescriptthree] - \definefontsynonym [MetaMediumLF-Caps] [\typescriptthree-mtmfc] [encoding=\typescriptthree] - \definefontsynonym [MetaMediumLF-ItalicCaps] [\typescriptthree-mtmfic] [encoding=\typescriptthree] - + \definefontsynonym [MetaMediumLF-Roman] [\typescriptthree-mtmf] [encoding=\typescriptthree] + \definefontsynonym [MetaMediumLF-Italic] [\typescriptthree-mtmfi] [encoding=\typescriptthree] + \definefontsynonym [MetaMediumLF-Caps] [\typescriptthree-mtmfc] [encoding=\typescriptthree] + \definefontsynonym [MetaMediumLF-ItalicCaps] [\typescriptthree-mtmfic] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-fontfont-meta.map] \stoptypescript \starttypescript [sans] [meta-black] [texnansi,ec,8r] - - \definefontsynonym [MetaBlack-Roman] [\typescriptthree-mtbl] [encoding=\typescriptthree] - \definefontsynonym [MetaBlack-Italic] [\typescriptthree-mtbli] [encoding=\typescriptthree] - \definefontsynonym [MetaBlack-Caps] [\typescriptthree-mtblc] [encoding=\typescriptthree] - \definefontsynonym [MetaBlack-ItalicCaps] [\typescriptthree-mtblic] [encoding=\typescriptthree] - + \definefontsynonym [MetaBlack-Roman] [\typescriptthree-mtbl] [encoding=\typescriptthree] + \definefontsynonym [MetaBlack-Italic] [\typescriptthree-mtbli] [encoding=\typescriptthree] + \definefontsynonym [MetaBlack-Caps] [\typescriptthree-mtblc] [encoding=\typescriptthree] + \definefontsynonym [MetaBlack-ItalicCaps] [\typescriptthree-mtblic] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-fontfont-meta.map] \stoptypescript \starttypescript [sans] [meta-black-lf] [texnansi,ec,8r] - - \definefontsynonym [MetaBlackLF-Roman] [\typescriptthree-mtblf] [encoding=\typescriptthree] - \definefontsynonym [MetaBlackLF-Italic] [\typescriptthree-mtblfi] [encoding=\typescriptthree] - \definefontsynonym [MetaBlackLF-Caps] [\typescriptthree-mtblfc] [encoding=\typescriptthree] - \definefontsynonym [MetaBlackLF-ItalicCaps] [\typescriptthree-mtblfic] [encoding=\typescriptthree] - + \definefontsynonym [MetaBlackLF-Roman] [\typescriptthree-mtblf] [encoding=\typescriptthree] + \definefontsynonym [MetaBlackLF-Italic] [\typescriptthree-mtblfi] [encoding=\typescriptthree] + \definefontsynonym [MetaBlackLF-Caps] [\typescriptthree-mtblfc] [encoding=\typescriptthree] + \definefontsynonym [MetaBlackLF-ItalicCaps] [\typescriptthree-mtblfic] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-fontfont-meta.map] \stoptypescript \starttypescript [expert] [meta] % incomplete - - \definefontsynonym [MetaNormal-Expert] [mtnx] - + \definefontsynonym [MetaNormal-Expert] [mtnx] + \loadmapfile [\typescriptthree-fontfont-meta.map] \stoptypescript %D Linotype Univers -\starttypescript [map] [univers] [texnansi] - \loadmapfile[\typescriptthree-linotype-univers.map] -\stoptypescript - \starttypescript [sans] [univers,univers-light,univers-black] [name] - \definefontsynonym [Sans] [Univers] \definefontsynonym [SansBold] [Univers-Bold] \definefontsynonym [SansSlanted] [Univers-Oblique] \definefontsynonym [SansBoldSlanted] [Univers-BoldOblique] - \stoptypescript \starttypescript [sans] [univers-light] [name] - \definefontsynonym [Sans] [Univers-Light] \definefontsynonym [SansSlanted] [Univers-LightOblique] - \stoptypescript \starttypescript [sans] [univers-black] [name] - \definefontsynonym [Sans] [Univers-Black] \definefontsynonym [SansSlanted] [Univers-BlackOblique] \definefontsynonym [SansBold] [Univers-Black] \definefontsynonym [SansBoldSlanted] [Univers-BlackOblique] - \stoptypescript \starttypescript [sans] [univers,univers-black,univers-light] [texnansi,ec,8r] - - \definefontsynonym [Univers-Light] [\typescriptthree-lt50136] [encoding=\typescriptthree] - \definefontsynonym [Univers-LightOblique] [\typescriptthree-lt50137] [encoding=\typescriptthree] - - \definefontsynonym [Univers] [\typescriptthree-lt50138] [encoding=\typescriptthree] - \definefontsynonym [Univers-Oblique] [\typescriptthree-lt50139] [encoding=\typescriptthree] - \definefontsynonym [Univers-Bold] [\typescriptthree-lt50140] [encoding=\typescriptthree] - \definefontsynonym [Univers-BoldOblique] [\typescriptthree-lt50141] [encoding=\typescriptthree] - - \definefontsynonym [Univers-Black] [\typescriptthree-lt50142] [encoding=\typescriptthree] - \definefontsynonym [Univers-BlackOblique] [\typescriptthree-lt50143] [encoding=\typescriptthree] - + \definefontsynonym [Univers-Light] [\typescriptthree-lt50136] [encoding=\typescriptthree] + \definefontsynonym [Univers-LightOblique] [\typescriptthree-lt50137] [encoding=\typescriptthree] + \definefontsynonym [Univers] [\typescriptthree-lt50138] [encoding=\typescriptthree] + \definefontsynonym [Univers-Oblique] [\typescriptthree-lt50139] [encoding=\typescriptthree] + \definefontsynonym [Univers-Bold] [\typescriptthree-lt50140] [encoding=\typescriptthree] + \definefontsynonym [Univers-BoldOblique] [\typescriptthree-lt50141] [encoding=\typescriptthree] + \definefontsynonym [Univers-Black] [\typescriptthree-lt50142] [encoding=\typescriptthree] + \definefontsynonym [Univers-BlackOblique] [\typescriptthree-lt50143] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-linotype-univers.map] \stoptypescript % mendoza -\starttypescript [map] [mendoza] [ec,8r,texnansi] - \loadmapfile[\typescriptthree-itc-mendoza.map] -\stoptypescript - \starttypescript [serif] [mendoza] [name] - \definefontsynonym [Serif] [MendozaRoman-Book] \definefontsynonym [SerifCaps] [MendozaRoman-Book] \definefontsynonym [SerifSlanted] [MendozaRoman-BookItalic] @@ -488,370 +463,241 @@ \definefontsynonym [SerifBold] [MendozaRoman-Bold] \definefontsynonym [SerifBoldSlanted] [MendozaRoman-BoldItalic] \definefontsynonym [SerifBoldItalic] [MendozaRoman-BoldItalic] - \stoptypescript \starttypescript [serif] [mendoza] [ec,8r,texnansi] - - \definefontsynonym[MendozaRoman-Bold] [\typescriptthree-zab] [encoding=\typescriptthree] - \definefontsynonym[MendozaRoman-BoldItalic] [\typescriptthree-zabi][encoding=\typescriptthree] - \definefontsynonym[MendozaRoman-Medium] [\typescriptthree-zam] [encoding=\typescriptthree] - \definefontsynonym[MendozaRoman-MediumItalic][\typescriptthree-zami][encoding=\typescriptthree] - \definefontsynonym[MendozaRoman-Book] [\typescriptthree-zaw] [encoding=\typescriptthree] - \definefontsynonym[MendozaRoman-BookItalic] [\typescriptthree-zawi][encoding=\typescriptthree] - + \definefontsynonym[MendozaRoman-Bold] [\typescriptthree-zab] [encoding=\typescriptthree] + \definefontsynonym[MendozaRoman-BoldItalic] [\typescriptthree-zabi][encoding=\typescriptthree] + \definefontsynonym[MendozaRoman-Medium] [\typescriptthree-zam] [encoding=\typescriptthree] + \definefontsynonym[MendozaRoman-MediumItalic][\typescriptthree-zami][encoding=\typescriptthree] + \definefontsynonym[MendozaRoman-Book] [\typescriptthree-zaw] [encoding=\typescriptthree] + \definefontsynonym[MendozaRoman-BookItalic] [\typescriptthree-zawi][encoding=\typescriptthree] + \loadmapfile[\typescriptthree-itc-mendoza.map] \stoptypescript % frutiger -\starttypescript [map] [frutiger] [ec,8r,texnansi] - \loadmapfile[\typescriptthree-adobe-frutiger.map] -\stoptypescript - \starttypescript [sans] [frutiger] [name] - - \definefontsynonym [Sans] [Frutiger-Roman] - \definefontsynonym [SansCaps] [Frutiger-Roman] - \definefontsynonym [SansItalic] [Frutiger-Italic] - \definefontsynonym [SansSlanted] [Frutiger-Italic] - \definefontsynonym [SansBold] [Frutiger-Bold] - \definefontsynonym [SansBoldItalic] [Frutiger-BoldItalic] - \definefontsynonym [SansBoldSlanted] [Frutiger-BoldItalic] - + \definefontsynonym [Sans] [Frutiger-Roman] + \definefontsynonym [SansCaps] [Frutiger-Roman] + \definefontsynonym [SansItalic] [Frutiger-Italic] + \definefontsynonym [SansSlanted] [Frutiger-Italic] + \definefontsynonym [SansBold] [Frutiger-Bold] + \definefontsynonym [SansBoldItalic] [Frutiger-BoldItalic] + \definefontsynonym [SansBoldSlanted] [Frutiger-BoldItalic] \stoptypescript \starttypescript [sans] [frutiger] [ec,8r,texnansi] - - \definefontsynonym[Frutiger-Bold] [\typescriptthree-ftb] [encoding=\typescriptthree] - \definefontsynonym[Frutiger-BoldItalic] [\typescriptthree-ftbi] [encoding=\typescriptthree] - \definefontsynonym[Frutiger-Black] [\typescriptthree-ftbl] [encoding=\typescriptthree] - \definefontsynonym[Frutiger-BlackItalic][\typescriptthree-ftbli][encoding=\typescriptthree] - \definefontsynonym[Frutiger-Italic] [\typescriptthree-fti] [encoding=\typescriptthree] - \definefontsynonym[Frutiger-Light] [\typescriptthree-ftl] [encoding=\typescriptthree] - \definefontsynonym[Frutiger-LightItalic][\typescriptthree-ftli] [encoding=\typescriptthree] - \definefontsynonym[Frutiger-Roman] [\typescriptthree-ftr] [encoding=\typescriptthree] - \definefontsynonym[Frutiger-UltraBlack] [\typescriptthree-ftubl][encoding=\typescriptthree] - + \definefontsynonym[Frutiger-Bold] [\typescriptthree-ftb] [encoding=\typescriptthree] + \definefontsynonym[Frutiger-BoldItalic] [\typescriptthree-ftbi] [encoding=\typescriptthree] + \definefontsynonym[Frutiger-Black] [\typescriptthree-ftbl] [encoding=\typescriptthree] + \definefontsynonym[Frutiger-BlackItalic][\typescriptthree-ftbli][encoding=\typescriptthree] + \definefontsynonym[Frutiger-Italic] [\typescriptthree-fti] [encoding=\typescriptthree] + \definefontsynonym[Frutiger-Light] [\typescriptthree-ftl] [encoding=\typescriptthree] + \definefontsynonym[Frutiger-LightItalic][\typescriptthree-ftli] [encoding=\typescriptthree] + \definefontsynonym[Frutiger-Roman] [\typescriptthree-ftr] [encoding=\typescriptthree] + \definefontsynonym[Frutiger-UltraBlack] [\typescriptthree-ftubl][encoding=\typescriptthree] + \loadmapfile[\typescriptthree-adobe-frutiger.map] \stoptypescript % kabel -\starttypescript [map] [kabel] [ec,8r,texnansi] - \loadmapfile [\typescriptthree-itc-kabel.map] -\stoptypescript - -% \starttypescript [sans] [kabel] [name] - -% \definefontsynonym [Sans] [ItcKabel-Bold] -% \definefontsynonym [SansItalic] [ItcKabel-Bold] -% \definefontsynonym [SansSlanted] [ItcKabel-Bold] -% \definefontsynonym [SansBold] [ItcKabel-Bold] -% \definefontsynonym [SansBoldItalic] [ItcKabel-Bold] -% \definefontsynonym [SansBoldSlanted] [ItcKabel-Bold] - -% \stoptypescript - \starttypescript [sans] [kabel] [ec,8r,texnansi] - - \definefontsynonym [ItcKabel-Bold] [\typescriptthree-kbb] [encoding=\typescriptthree] - \definefontsynonym [ItcKabel-Demi] [\typescriptthree-kbd] [encoding=\typescriptthree] - \definefontsynonym [ItcKabel-Medium] [\typescriptthree-kbm] [encoding=\typescriptthree] - \definefontsynonym [ItcKabel-Ultra] [\typescriptthree-kbu] [encoding=\typescriptthree] - \definefontsynonym [ItcKabel-Book] [\typescriptthree-kbw] [encoding=\typescriptthree] - + \definefontsynonym [ItcKabel-Bold] [\typescriptthree-kbb] [encoding=\typescriptthree] + \definefontsynonym [ItcKabel-Demi] [\typescriptthree-kbd] [encoding=\typescriptthree] + \definefontsynonym [ItcKabel-Medium] [\typescriptthree-kbm] [encoding=\typescriptthree] + \definefontsynonym [ItcKabel-Ultra] [\typescriptthree-kbu] [encoding=\typescriptthree] + \definefontsynonym [ItcKabel-Book] [\typescriptthree-kbw] [encoding=\typescriptthree] + \loadmapfile [\typescriptthree-itc-kabel.map] \stoptypescript % thesans -\starttypescript [map] [thesans] [ec,8r,texnansi] - \loadmapfile[\typescriptthree-lucas-thesans.map] -\stoptypescript - \starttypescript [sans] [thesans] [name] - - \definefontsynonym [Sans] [TheSans-Plain] - \definefontsynonym [SansItalic] [TheSans-Italic] - \definefontsynonym [SansSlanted] [TheSans-Italic] - \definefontsynonym [SansBold] [TheSansBold-Plain] - \definefontsynonym [SansBoldItalic] [TheSansBold-Italic] - \definefontsynonym [SansBoldSlanted] [TheSansBold-Italic] - - \definefontsynonym [SansCaps] [TheSans-Caps] - \definefontsynonym [SansCapsItalic] [TheSans-CapsItalic] - \definefontsynonym [SansCapsSlanted] [TheSans-CapsItalic] - \definefontsynonym [SansCapsBold] [TheSansBold-Caps] - \definefontsynonym [SansCapsBoldItalic] [TheSansBold-CapsItalic] - \definefontsynonym [SansCapsBoldSlanted] [TheSansBold-CapsItalic] - + \definefontsynonym [Sans] [TheSans-Plain] + \definefontsynonym [SansItalic] [TheSans-Italic] + \definefontsynonym [SansSlanted] [TheSans-Italic] + \definefontsynonym [SansBold] [TheSansBold-Plain] + \definefontsynonym [SansBoldItalic] [TheSansBold-Italic] + \definefontsynonym [SansBoldSlanted] [TheSansBold-Italic] + \definefontsynonym [SansCaps] [TheSans-Caps] + \definefontsynonym [SansCapsItalic] [TheSans-CapsItalic] + \definefontsynonym [SansCapsSlanted] [TheSans-CapsItalic] + \definefontsynonym [SansCapsBold] [TheSansBold-Caps] + \definefontsynonym [SansCapsBoldItalic] [TheSansBold-CapsItalic] + \definefontsynonym [SansCapsBoldSlanted] [TheSansBold-CapsItalic] \stoptypescript \starttypescript [mono] [thesans] [name] - - \definefontsynonym [Mono] [TheSansTypewriter-Plain] - \definefontsynonym [MonoCaps] [TheSansTypewriter-Plain] - \definefontsynonym [MonoItalic] [TheSansTypewriter-Italic] - \definefontsynonym [MonoSlanted] [TheSansTypewriter-Italic] - \definefontsynonym [MonoBold] [TheSansTypewriter-Bold] - \definefontsynonym [MonoBoldItalic] [TheSansTypewriter-BoldItalic] - \definefontsynonym [MonoBoldSlanted] [TheSansTypewriter-BoldItalic] - + \definefontsynonym [Mono] [TheSansTypewriter-Plain] + \definefontsynonym [MonoCaps] [TheSansTypewriter-Plain] + \definefontsynonym [MonoItalic] [TheSansTypewriter-Italic] + \definefontsynonym [MonoSlanted] [TheSansTypewriter-Italic] + \definefontsynonym [MonoBold] [TheSansTypewriter-Bold] + \definefontsynonym [MonoBoldItalic] [TheSansTypewriter-BoldItalic] + \definefontsynonym [MonoBoldSlanted] [TheSansTypewriter-BoldItalic] \stoptypescript \starttypescript [sans] [thesans] [ec,8r,texnansi] - - \definefontsynonym [TheSans-Plain] [\typescriptthree-tsan5] [encoding=\typescriptthree] - \definefontsynonym [TheSans-Italic] [\typescriptthree-tsan5i] [encoding=\typescriptthree] - \definefontsynonym [TheSansBold-Plain] [\typescriptthree-tsan7] [encoding=\typescriptthree] - \definefontsynonym [TheSansBold-Italic] [\typescriptthree-tsan7i] [encoding=\typescriptthree] - - \definefontsynonym [TheSans-Caps] [\typescriptthree-tsan5c] [encoding=\typescriptthree] - \definefontsynonym [TheSans-CapsItalic] [\typescriptthree-tsan5ci] [encoding=\typescriptthree] - \definefontsynonym [TheSansBold-Caps] [\typescriptthree-tsan7c] [encoding=\typescriptthree] - \definefontsynonym [TheSansBold-CapsItalic] [\typescriptthree-tsan7ci] [encoding=\typescriptthree] - -% \definefontsynonym[TheSans-B2ExtraLight] [\typescriptthree-thesnb2] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B2ExtraLightItalic] [\typescriptthree-thesnb2i] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B3Light] [\typescriptthree-thesnb3] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B3LightItalic] [\typescriptthree-thesnb3i] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B4SemiLight] [\typescriptthree-thesnb4] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B4SemiLightItalic] [\typescriptthree-thesnb4i] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B5Plain] [\typescriptthree-thesnb5] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B5PlainItalic] [\typescriptthree-thesnb5i] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B6SemiBold] [\typescriptthree-thesnb6] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B6SemiBoldItalic] [\typescriptthree-thesnb6i] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B7Bold] [\typescriptthree-thesnb7] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B7BoldItalic] [\typescriptthree-thesnb7i] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B8ExtraBold] [\typescriptthree-thesnb8] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B8ExtraBoldItalic] [\typescriptthree-thesnb8i] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B8ExtraBoldItalic] [\typescriptthree-thesnb8i] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B9Black] [\typescriptthree-thesnb9] [encoding=\typescriptthree] -% \definefontsynonym[TheSans-B9BlackItalic] [\typescriptthree-thesnb9i] [encoding=\typescriptthree] - + \definefontsynonym [TheSans-Plain] [\typescriptthree-tsan5] [encoding=\typescriptthree] + \definefontsynonym [TheSans-Italic] [\typescriptthree-tsan5i] [encoding=\typescriptthree] + \definefontsynonym [TheSansBold-Plain] [\typescriptthree-tsan7] [encoding=\typescriptthree] + \definefontsynonym [TheSansBold-Italic] [\typescriptthree-tsan7i] [encoding=\typescriptthree] + \definefontsynonym [TheSans-Caps] [\typescriptthree-tsan5c] [encoding=\typescriptthree] + \definefontsynonym [TheSans-CapsItalic] [\typescriptthree-tsan5ci] [encoding=\typescriptthree] + \definefontsynonym [TheSansBold-Caps] [\typescriptthree-tsan7c] [encoding=\typescriptthree] + \definefontsynonym [TheSansBold-CapsItalic] [\typescriptthree-tsan7ci] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-lucas-thesans.map] \stoptypescript \starttypescript [mono] [thesans] [ec,8r,texnansi] - - \definefontsynonym [TheSansTypewriter-Plain] [\typescriptthree-tsaty5] [encoding=\typescriptthree] - \definefontsynonym [TheSansTypewriter-Italic] [\typescriptthree-tsaty5i] [encoding=\typescriptthree] - \definefontsynonym [TheSansTypewriter-Bold] [\typescriptthree-tsaty7] [encoding=\typescriptthree] - \definefontsynonym [TheSansTypewriter-BoldItalic] [\typescriptthree-tsaty7i] [encoding=\typescriptthree] - + \definefontsynonym [TheSansTypewriter-Plain] [\typescriptthree-tsaty5] [encoding=\typescriptthree] + \definefontsynonym [TheSansTypewriter-Italic] [\typescriptthree-tsaty5i] [encoding=\typescriptthree] + \definefontsynonym [TheSansTypewriter-Bold] [\typescriptthree-tsaty7] [encoding=\typescriptthree] + \definefontsynonym [TheSansTypewriter-BoldItalic] [\typescriptthree-tsaty7i] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-lucas-thesans.map] \stoptypescript \starttypescript [expert] [thesans] - - \definefontsynonym [TheSans-Expert] [tsan5e] [encoding=\typescriptthree] - \definefontsynonym [TheSans-ExpertItalic] [tsan5ei] [encoding=\typescriptthree] - \definefontsynonym [TheSansBold-Expert] [tsan7e] [encoding=\typescriptthree] - \definefontsynonym [TheSansBold-ExpertItalic] [tsan7ei] [encoding=\typescriptthree] - + \definefontsynonym [TheSans-Expert] [tsan5e] [encoding=\typescriptthree] + \definefontsynonym [TheSans-ExpertItalic] [tsan5ei] [encoding=\typescriptthree] + \definefontsynonym [TheSansBold-Expert] [tsan7e] [encoding=\typescriptthree] + \definefontsynonym [TheSansBold-ExpertItalic] [tsan7ei] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-lucas-thesans.map] \stoptypescript % monotype sabon -\starttypescript [map] [sabon] [ec,8r,texnansi] - \loadmapfile[\typescriptthree-monotype-sabon.map] -\stoptypescript - \starttypescript [serif] [sabon] [name] - - \definefontsynonym [Serif] [SabonMT] - \definefontsynonym [SerifItalic] [SabonMT-Italic] - \definefontsynonym [SerifSlanted] [SabonMT-Italic] - \definefontsynonym [SerifBold] [SabonMT-SemiBold] - \definefontsynonym [SerifBoldItalic] [SabonMT-SemiBoldItalic] - \definefontsynonym [SerifBoldSlanted] [SabonMT-SemiBoldItalic] - \definefontsynonym [SerifCaps] [SabonMT-RegularSC] - + \definefontsynonym [Serif] [SabonMT] + \definefontsynonym [SerifItalic] [SabonMT-Italic] + \definefontsynonym [SerifSlanted] [SabonMT-Italic] + \definefontsynonym [SerifBold] [SabonMT-SemiBold] + \definefontsynonym [SerifBoldItalic] [SabonMT-SemiBoldItalic] + \definefontsynonym [SerifBoldSlanted] [SabonMT-SemiBoldItalic] + \definefontsynonym [SerifCaps] [SabonMT-RegularSC] \stoptypescript \starttypescript [serif] [sabon] [ec,8r,texnansi] - - \definefontsynonym[SabonMT] [\typescriptthree-sab] [encoding=\typescriptthree] - \definefontsynonym[SabonMT-Italic] [\typescriptthree-sabi] [encoding=\typescriptthree] - \definefontsynonym[SabonMT-ItalicOsF] [\typescriptthree-saboi][encoding=\typescriptthree] - \definefontsynonym[SabonMT-SemiBoldOsF] [\typescriptthree-sabos][encoding=\typescriptthree] - \definefontsynonym[SabonMT-SemiBold] [\typescriptthree-sabs] [encoding=\typescriptthree] - \definefontsynonym[SabonMT-RegularSC] [\typescriptthree-sabsc][encoding=\typescriptthree] - \definefontsynonym[SabonMT-SemiBoldItalic] [\typescriptthree-sabsi][encoding=\typescriptthree] - \definefontsynonym[SabonMT-SemiBoldItalicOsF][\typescriptthree-sasio][encoding=\typescriptthree] - + \definefontsynonym[SabonMT] [\typescriptthree-sab] [encoding=\typescriptthree] + \definefontsynonym[SabonMT-Italic] [\typescriptthree-sabi] [encoding=\typescriptthree] + \definefontsynonym[SabonMT-ItalicOsF] [\typescriptthree-saboi][encoding=\typescriptthree] + \definefontsynonym[SabonMT-SemiBoldOsF] [\typescriptthree-sabos][encoding=\typescriptthree] + \definefontsynonym[SabonMT-SemiBold] [\typescriptthree-sabs] [encoding=\typescriptthree] + \definefontsynonym[SabonMT-RegularSC] [\typescriptthree-sabsc][encoding=\typescriptthree] + \definefontsynonym[SabonMT-SemiBoldItalic] [\typescriptthree-sabsi][encoding=\typescriptthree] + \definefontsynonym[SabonMT-SemiBoldItalicOsF][\typescriptthree-sasio][encoding=\typescriptthree] + \loadmapfile[\typescriptthree-monotype-sabon.map] \stoptypescript % itc stone -\starttypescript [map] [stone] [ec,texnansi] - \loadmapfile[\typescriptthree-itc-stone.map] -\stoptypescript - -% less readable but less parsing -% -% \starttypescript [sans,serif] [stone] [name] -% -% \definefontsynonym [\typescriptprefix\typescriptone ] [Stone\typescriptprefix\typescriptone ITC-Medium] -% \definefontsynonym [\typescriptprefix\typescriptone Italic] [Stone\typescriptprefix\typescriptone ITC-MediumItalic] -% \definefontsynonym [\typescriptprefix\typescriptone Slanted] [Stone\typescriptprefix\typescriptone ITC-MediumItalic] -% \definefontsynonym [\typescriptprefix\typescriptone Bold] [Stone\typescriptprefix\typescriptone ITC-Bold] -% \definefontsynonym [\typescriptprefix\typescriptone BoldItalic] [Stone\typescriptprefix\typescriptone ITC-BoldItalic] -% \definefontsynonym [\typescriptprefix\typescriptone BoldSlanted] [Stone\typescriptprefix\typescriptone ITC-BoldItalic] -% \definefontsynonym [\typescriptprefix\typescriptone Caps] [Stone\typescriptprefix\typescriptone SCITC-Medium] -% -% \stoptypescript - \starttypescript [sans] [stone] [name] - - \definefontsynonym [Sans] [StoneSansITC-Medium] - \definefontsynonym [SansItalic] [StoneSansITC-MediumItalic] - \definefontsynonym [SansSlanted] [StoneSansITC-MediumItalic] - \definefontsynonym [SansBold] [StoneSansITC-Bold] - \definefontsynonym [SansBoldItalic] [StoneSansITC-BoldItalic] - \definefontsynonym [SansBoldSlanted] [StoneSansITC-BoldItalic] - \definefontsynonym [SansCaps] [StoneSansSCITC-Medium] - + \definefontsynonym [Sans] [StoneSansITC-Medium] + \definefontsynonym [SansItalic] [StoneSansITC-MediumItalic] + \definefontsynonym [SansSlanted] [StoneSansITC-MediumItalic] + \definefontsynonym [SansBold] [StoneSansITC-Bold] + \definefontsynonym [SansBoldItalic] [StoneSansITC-BoldItalic] + \definefontsynonym [SansBoldSlanted] [StoneSansITC-BoldItalic] + \definefontsynonym [SansCaps] [StoneSansSCITC-Medium] \stoptypescript \starttypescript [serif] [stone] [name] - - \definefontsynonym [Serif] [StoneSerifITC-Medium] - \definefontsynonym [SerifItalic] [StoneSerifITC-MediumItalic] - \definefontsynonym [SerifSlanted] [StoneSerifITC-MediumItalic] - \definefontsynonym [SerifBold] [StoneSerifITC-Bold] - \definefontsynonym [SerifBoldItalic] [StoneSerifITC-BoldItalic] - \definefontsynonym [SerifBoldSlanted] [StoneSerifITC-BoldItalic] - \definefontsynonym [SerifCaps] [StoneSerifSCITC-Medium] - + \definefontsynonym [Serif] [StoneSerifITC-Medium] + \definefontsynonym [SerifItalic] [StoneSerifITC-MediumItalic] + \definefontsynonym [SerifSlanted] [StoneSerifITC-MediumItalic] + \definefontsynonym [SerifBold] [StoneSerifITC-Bold] + \definefontsynonym [SerifBoldItalic] [StoneSerifITC-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [StoneSerifITC-BoldItalic] + \definefontsynonym [SerifCaps] [StoneSerifSCITC-Medium] \stoptypescript \starttypescript [sans] [stone-oldstyle] [name] - - \definefontsynonym [Sans] [StoneSansOSITC-Medium] - \definefontsynonym [SansItalic] [StoneSansOSITC-MediumItalic] - \definefontsynonym [SansSlanted] [StoneSansOSITC-MediumItalic] - \definefontsynonym [SansBold] [StoneSansOSITC-Bold] - \definefontsynonym [SansBoldItalic] [StoneSansOSITC-BoldItalic] - \definefontsynonym [SansBoldSlanted] [StoneSansOSITC-BoldItalic] - \definefontsynonym [SansCaps] [StoneSansSCITC-Medium] - + \definefontsynonym [Sans] [StoneSansOSITC-Medium] + \definefontsynonym [SansItalic] [StoneSansOSITC-MediumItalic] + \definefontsynonym [SansSlanted] [StoneSansOSITC-MediumItalic] + \definefontsynonym [SansBold] [StoneSansOSITC-Bold] + \definefontsynonym [SansBoldItalic] [StoneSansOSITC-BoldItalic] + \definefontsynonym [SansBoldSlanted] [StoneSansOSITC-BoldItalic] + \definefontsynonym [SansCaps] [StoneSansSCITC-Medium] \stoptypescript \starttypescript [serif] [stone-oldstyle] [name] - - \definefontsynonym [Serif] [StoneSerifOSITC-Medium] - \definefontsynonym [SerifItalic] [StoneSerifOSITC-MediumItalic] - \definefontsynonym [SerifSlanted] [StoneSerifOSITC-MediumItalic] - \definefontsynonym [SerifBold] [StoneSerifOSITC-Bold] - \definefontsynonym [SerifBoldItalic] [StoneSerifOSITC-BoldItalic] - \definefontsynonym [SerifBoldSlanted] [StoneSerifOSITC-BoldItalic] - \definefontsynonym [SerifCaps] [StoneSerifSCITC-Medium] - + \definefontsynonym [Serif] [StoneSerifOSITC-Medium] + \definefontsynonym [SerifItalic] [StoneSerifOSITC-MediumItalic] + \definefontsynonym [SerifSlanted] [StoneSerifOSITC-MediumItalic] + \definefontsynonym [SerifBold] [StoneSerifOSITC-Bold] + \definefontsynonym [SerifBoldItalic] [StoneSerifOSITC-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [StoneSerifOSITC-BoldItalic] + \definefontsynonym [SerifCaps] [StoneSerifSCITC-Medium] \stoptypescript \starttypescript [sans] [stone] [ec,texnansi] - - \definefontsynonym[StoneSansITC-Bold] [\typescriptthree-stosnb] [encoding=\typescriptthree] - \definefontsynonym[StoneSansITC-BoldItalic] [\typescriptthree-stosnbi] [encoding=\typescriptthree] - \definefontsynonym[StoneSansITC-Medium] [\typescriptthree-stosnm] [encoding=\typescriptthree] - \definefontsynonym[StoneSansITC-MediumItalic] [\typescriptthree-stosnmi] [encoding=\typescriptthree] - \definefontsynonym[StoneSansOSITC-Bold] [\typescriptthree-stosnob] [encoding=\typescriptthree] - \definefontsynonym[StoneSansOSITC-BoldItalic] [\typescriptthree-stosnobi][encoding=\typescriptthree] - \definefontsynonym[StoneSansOSITC-Medium] [\typescriptthree-stosnom] [encoding=\typescriptthree] - \definefontsynonym[StoneSansOSITC-MediumItalic][\typescriptthree-stosnomi][encoding=\typescriptthree] - \definefontsynonym[StoneSansSCITC-Medium] [\typescriptthree-stosnscm][encoding=\typescriptthree] - \definefontsynonym[StoneSansSemITC-Semi] [\typescriptthree-stosns] [encoding=\typescriptthree] - \definefontsynonym[StoneSansSemITC-SemiIta] [\typescriptthree-stosnsi] [encoding=\typescriptthree] - \definefontsynonym[StoneSansSemOSITC-Semi] [\typescriptthree-stosnos] [encoding=\typescriptthree] - \definefontsynonym[StoneSansSemOSITC-SemiIta] [\typescriptthree-stosnosi][encoding=\typescriptthree] - \definefontsynonym[StoneSansSemSCITC-Semi] [\typescriptthree-stosnscs][encoding=\typescriptthree] - + \definefontsynonym[StoneSansITC-Bold] [\typescriptthree-stosnb] [encoding=\typescriptthree] + \definefontsynonym[StoneSansITC-BoldItalic] [\typescriptthree-stosnbi] [encoding=\typescriptthree] + \definefontsynonym[StoneSansITC-Medium] [\typescriptthree-stosnm] [encoding=\typescriptthree] + \definefontsynonym[StoneSansITC-MediumItalic] [\typescriptthree-stosnmi] [encoding=\typescriptthree] + \definefontsynonym[StoneSansOSITC-Bold] [\typescriptthree-stosnob] [encoding=\typescriptthree] + \definefontsynonym[StoneSansOSITC-BoldItalic] [\typescriptthree-stosnobi][encoding=\typescriptthree] + \definefontsynonym[StoneSansOSITC-Medium] [\typescriptthree-stosnom] [encoding=\typescriptthree] + \definefontsynonym[StoneSansOSITC-MediumItalic][\typescriptthree-stosnomi][encoding=\typescriptthree] + \definefontsynonym[StoneSansSCITC-Medium] [\typescriptthree-stosnscm][encoding=\typescriptthree] + \definefontsynonym[StoneSansSemITC-Semi] [\typescriptthree-stosns] [encoding=\typescriptthree] + \definefontsynonym[StoneSansSemITC-SemiIta] [\typescriptthree-stosnsi] [encoding=\typescriptthree] + \definefontsynonym[StoneSansSemOSITC-Semi] [\typescriptthree-stosnos] [encoding=\typescriptthree] + \definefontsynonym[StoneSansSemOSITC-SemiIta] [\typescriptthree-stosnosi][encoding=\typescriptthree] + \definefontsynonym[StoneSansSemSCITC-Semi] [\typescriptthree-stosnscs][encoding=\typescriptthree] + \loadmapfile[\typescriptthree-itc-stone.map] \stoptypescript \starttypescript [serif] [stone] [ec,texnansi] - - \definefontsynonym[StoneSerifITC-Bold] [\typescriptthree-stosfb] [encoding=\typescriptthree] - \definefontsynonym[StoneSerifITC-BoldItalic] [\typescriptthree-stosfbi] [encoding=\typescriptthree] - \definefontsynonym[StoneSerifITC-Medium] [\typescriptthree-stosfm] [encoding=\typescriptthree] - \definefontsynonym[StoneSerifITC-MediumItalic] [\typescriptthree-stosfmi] [encoding=\typescriptthree] - \definefontsynonym[StoneSerifOSITC-Bold] [\typescriptthree-stosfob] [encoding=\typescriptthree] - \definefontsynonym[StoneSerifOSITC-BoldItalic] [\typescriptthree-stosfobi][encoding=\typescriptthree] - \definefontsynonym[StoneSerifOSITC-Medium] [\typescriptthree-stosfom] [encoding=\typescriptthree] - \definefontsynonym[StoneSerifOSITC-MediumItalic][\typescriptthree-stosfomi][encoding=\typescriptthree] - \definefontsynonym[StoneSerifSCITC-Medium] [\typescriptthree-stosfscm][encoding=\typescriptthree] - \definefontsynonym[StoneSerifSemITC-Semi] [\typescriptthree-stosfs] [encoding=\typescriptthree] - \definefontsynonym[StoneSerifSemITC-SemiIta] [\typescriptthree-stosfsi] [encoding=\typescriptthree] - \definefontsynonym[StoneSerifSemOSITC-Semi] [\typescriptthree-stosfos] [encoding=\typescriptthree] - \definefontsynonym[StoneSerifSemOSITC-SemiIta] [\typescriptthree-stosfosi][encoding=\typescriptthree] - \definefontsynonym[StoneSerifSemSCITC-Semi] [\typescriptthree-stosfscs][encoding=\typescriptthree] - + \definefontsynonym[StoneSerifITC-Bold] [\typescriptthree-stosfb] [encoding=\typescriptthree] + \definefontsynonym[StoneSerifITC-BoldItalic] [\typescriptthree-stosfbi] [encoding=\typescriptthree] + \definefontsynonym[StoneSerifITC-Medium] [\typescriptthree-stosfm] [encoding=\typescriptthree] + \definefontsynonym[StoneSerifITC-MediumItalic] [\typescriptthree-stosfmi] [encoding=\typescriptthree] + \definefontsynonym[StoneSerifOSITC-Bold] [\typescriptthree-stosfob] [encoding=\typescriptthree] + \definefontsynonym[StoneSerifOSITC-BoldItalic] [\typescriptthree-stosfobi][encoding=\typescriptthree] + \definefontsynonym[StoneSerifOSITC-Medium] [\typescriptthree-stosfom] [encoding=\typescriptthree] + \definefontsynonym[StoneSerifOSITC-MediumItalic][\typescriptthree-stosfomi][encoding=\typescriptthree] + \definefontsynonym[StoneSerifSCITC-Medium] [\typescriptthree-stosfscm][encoding=\typescriptthree] + \definefontsynonym[StoneSerifSemITC-Semi] [\typescriptthree-stosfs] [encoding=\typescriptthree] + \definefontsynonym[StoneSerifSemITC-SemiIta] [\typescriptthree-stosfsi] [encoding=\typescriptthree] + \definefontsynonym[StoneSerifSemOSITC-Semi] [\typescriptthree-stosfos] [encoding=\typescriptthree] + \definefontsynonym[StoneSerifSemOSITC-SemiIta] [\typescriptthree-stosfosi][encoding=\typescriptthree] + \definefontsynonym[StoneSerifSemSCITC-Semi] [\typescriptthree-stosfscs][encoding=\typescriptthree] + \loadmapfile[\typescriptthree-itc-stone.map] \stoptypescript % linotype industria -\starttypescript [map] [industria] [ec,texnansi] - \loadmapfile[\typescriptthree-linotype-industria.map] -\stoptypescript - \starttypescript [sans] [industria] [ec,texnansi] - - \loadmapfile[\typescriptthree-linotype-industria.map] - - \definefontsynonym[Industria-Solid][\typescriptthree-lt50545][encoding=\typescriptthree] - + \definefontsynonym[Industria-Solid][\typescriptthree-lt50545][encoding=\typescriptthree] + \loadmapfile[\typescriptthree-linotype-industria.map] \stoptypescript % itc bauhaus % % texfont --enc=texnansi --ven=itc --col=bauhaus type-buy.dat -\starttypescript [map] [bauhaus] [ec,texnansi] - \loadmapfile[\typescriptthree-itc-bauhaus.map] -\stoptypescript - \starttypescript [sans] [bauhaus] [ec,texnansi] - - \loadmapfile[\typescriptthree-itc-bauhaus.map] - - \definefontsynonym[Bauhaus-Light] [\typescriptthree-bhl] [encoding=\typescriptthree] - \definefontsynonym[Bauhaus-Medium] [\typescriptthree-bhm] [encoding=\typescriptthree] - \definefontsynonym[Bauhaus-Demi] [\typescriptthree-bhd] [encoding=\typescriptthree] - \definefontsynonym[Bauhaus-Bold] [\typescriptthree-bhb] [encoding=\typescriptthree] - \definefontsynonym[Bauhaus-Heavy] [\typescriptthree-bhh] [encoding=\typescriptthree] - - \definefontsynonym[Bauhaus-Bold-Slanted] [\typescriptthree-bhb-slanted-167][encoding=\typescriptthree] - \definefontsynonym[Bauhaus-Demi-Slanted] [\typescriptthree-bhd-slanted-167][encoding=\typescriptthree] - \definefontsynonym[Bauhaus-Heavy-Slanted] [\typescriptthree-bhh-slanted-167][encoding=\typescriptthree] - \definefontsynonym[Bauhaus-Light-Slanted] [\typescriptthree-bhl-slanted-167][encoding=\typescriptthree] - \definefontsynonym[Bauhaus-Medium-Slanted][\typescriptthree-bhm-slanted-167][encoding=\typescriptthree] - + \definefontsynonym[Bauhaus-Light] [\typescriptthree-bhl] [encoding=\typescriptthree] + \definefontsynonym[Bauhaus-Medium] [\typescriptthree-bhm] [encoding=\typescriptthree] + \definefontsynonym[Bauhaus-Demi] [\typescriptthree-bhd] [encoding=\typescriptthree] + \definefontsynonym[Bauhaus-Bold] [\typescriptthree-bhb] [encoding=\typescriptthree] + \definefontsynonym[Bauhaus-Heavy] [\typescriptthree-bhh] [encoding=\typescriptthree] + \definefontsynonym[Bauhaus-Bold-Slanted] [\typescriptthree-bhb-slanted-167][encoding=\typescriptthree] + \definefontsynonym[Bauhaus-Demi-Slanted] [\typescriptthree-bhd-slanted-167][encoding=\typescriptthree] + \definefontsynonym[Bauhaus-Heavy-Slanted] [\typescriptthree-bhh-slanted-167][encoding=\typescriptthree] + \definefontsynonym[Bauhaus-Light-Slanted] [\typescriptthree-bhl-slanted-167][encoding=\typescriptthree] + \definefontsynonym[Bauhaus-Medium-Slanted][\typescriptthree-bhm-slanted-167][encoding=\typescriptthree] + \loadmapfile[\typescriptthree-itc-bauhaus.map] \stoptypescript - % ef swift % % texfont --enc=texnansi --ven=ef --col=swift type-buy.dat -\starttypescript [map] [swift] [ec,texnansi] - \loadmapfile[\typescriptthree-itc-bauhaus.map] -\stoptypescript - -\starttypescript [serif] [swift] [ec,texnansi] - - \loadmapfile[\typescriptthree-ef-swift.map] - - \definefontsynonym[SwiftEF-Light] [\typescriptthree-swlt] [encoding=\typescriptthree] - \definefontsynonym[SwiftEF-Regular] [\typescriptthree-swrg] [encoding=\typescriptthree] - \definefontsynonym[SwiftEF-Bold] [\typescriptthree-swbd] [encoding=\typescriptthree] - \definefontsynonym[SwiftEF-ExtraBold] [\typescriptthree-swxb] [encoding=\typescriptthree] - - \definefontsynonym[SwiftEF-LightItalic] [\typescriptthree-swlti][encoding=\typescriptthree] - \definefontsynonym[SwiftEF-RegularItalic][\typescriptthree-swrgi][encoding=\typescriptthree] - - \definefontsynonym[SwiftEF-BoldCondensed][\typescriptthree-swbdc][encoding=\typescriptthree] - \definefontsynonym[SwiftSCEF-Regular] [\typescriptthree-swrgs][encoding=\typescriptthree] - -\stoptypescript - \starttypescript [serif] [swift] [name] - \definefontsynonym [Serif] [SwiftEF-Regular] \definefontsynonym [SerifItalic] [SwiftEF-RegularItalic] \definefontsynonym [SerifSlanted] [SwiftEF-RegularItalic] @@ -859,11 +705,9 @@ \definefontsynonym [SerifBoldItalic] [SwiftEF-Bold] \definefontsynonym [SerifBoldSlanted] [SwiftEF-Bold] \definefontsynonym [SerifCaps] [SwiftSCEF-Regular] - \stoptypescript \starttypescript [serif] [swift-light] [name] - \definefontsynonym [Serif] [SwiftEF-Light] \definefontsynonym [SerifItalic] [SwiftEF-LightItalic] \definefontsynonym [SerifSlanted] [SwiftEF-LightItalic] @@ -871,63 +715,59 @@ \definefontsynonym [SerifBoldItalic] [SwiftEF-RegularItalic] \definefontsynonym [SerifBoldSlanted] [SwiftEF-RegularItalic] \definefontsynonym [SerifCaps] [SwiftSCEF-Regular] +\stoptypescript +\starttypescript [serif] [swift] [ec,texnansi] + \definefontsynonym[SwiftEF-Light] [\typescriptthree-swlt] [encoding=\typescriptthree] + \definefontsynonym[SwiftEF-Regular] [\typescriptthree-swrg] [encoding=\typescriptthree] + \definefontsynonym[SwiftEF-Bold] [\typescriptthree-swbd] [encoding=\typescriptthree] + \definefontsynonym[SwiftEF-ExtraBold] [\typescriptthree-swxb] [encoding=\typescriptthree] + \definefontsynonym[SwiftEF-LightItalic] [\typescriptthree-swlti][encoding=\typescriptthree] + \definefontsynonym[SwiftEF-RegularItalic][\typescriptthree-swrgi][encoding=\typescriptthree] + \definefontsynonym[SwiftEF-BoldCondensed][\typescriptthree-swbdc][encoding=\typescriptthree] + \definefontsynonym[SwiftSCEF-Regular] [\typescriptthree-swrgs][encoding=\typescriptthree] + \loadmapfile[\typescriptthree-ef-swift.map] \stoptypescript % linotype syntax -\starttypescript [sans] [syntax] [ec,texnansi] - - \loadmapfile[\typescriptthree-linotype-syntax.map] - - \definefontsynonym [SyntaxLT-Roman] [\typescriptthree-lte50617] [encoding=\typescriptthree] - \definefontsynonym [SyntaxLT-Italic] [\typescriptthree-lte50618] [encoding=\typescriptthree] - \definefontsynonym [SyntaxLT-Bold] [\typescriptthree-lte50619] [encoding=\typescriptthree] - \definefontsynonym [SyntaxLT-Black] [\typescriptthree-lte50620] [encoding=\typescriptthree] - \definefontsynonym [SyntaxLT-UltraBlack] [\typescriptthree-lte50621] [encoding=\typescriptthree] - -\stoptypescript - \starttypescript [sans] [syntax] [name] - - \loadmapfile[\typescriptthree-linotype-syntax.map] - \definefontsynonym [Sans] [SyntaxLT-Roman] \definefontsynonym [SansItalic] [SyntaxLT-Italic] \definefontsynonym [SansSlanted] [SyntaxLT-Italic] \definefontsynonym [SansBold] [SyntaxLT-Black] \definefontsynonym [SansBoldItalic] [SyntaxLT-Black] \definefontsynonym [SansBoldSlanted][SyntaxLT-Black] +\stoptypescript +\starttypescript [sans] [syntax] [ec,texnansi] + \definefontsynonym [SyntaxLT-Roman] [\typescriptthree-lte50617] [encoding=\typescriptthree] + \definefontsynonym [SyntaxLT-Italic] [\typescriptthree-lte50618] [encoding=\typescriptthree] + \definefontsynonym [SyntaxLT-Bold] [\typescriptthree-lte50619] [encoding=\typescriptthree] + \definefontsynonym [SyntaxLT-Black] [\typescriptthree-lte50620] [encoding=\typescriptthree] + \definefontsynonym [SyntaxLT-UltraBlack] [\typescriptthree-lte50621] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-linotype-syntax.map] \stoptypescript % linotype linoletter -\starttypescript [serif] [linoletter] [ec,texnansi] - - \loadmapfile[\typescriptthree-linotype-linoletter.map] - - \definefontsynonym[LinoLetterLT-Roman] [texnansi-lte51129] [encoding=\typescriptthree] - \definefontsynonym[LinoLetterLT-Italic] [texnansi-lte51130] [encoding=\typescriptthree] - \definefontsynonym[LinoLetterLT-Bold] [texnansi-lte51133] [encoding=\typescriptthree] - \definefontsynonym[LinoLetterLT-BoldItalic] [texnansi-lte51134] [encoding=\typescriptthree] - - \definefontsynonym[LinoLetterLT-BlackItalic] [texnansi-lte51136] [encoding=\typescriptthree] - \definefontsynonym[LinoLetter-MediumSC] [texnansi-llmsc] [encoding=\typescriptthree] - -\stoptypescript - \starttypescript [serif] [linoletter] [name] + \definefontsynonym [Serif] [LinoLetterLT-Roman] + \definefontsynonym [SerifItalic] [LinoLetterLT-Italic] + \definefontsynonym [SerifSlanted] [LinoLetterLT-Italic] + \definefontsynonym [SerifBold] [LinoLetterLT-Bold] + \definefontsynonym [SerifBoldItalic] [LinoLetterLT-BoldItalic] + \definefontsynonym [SerifBoldSlanted][LinoLetterLT-BoldItalic] +\stoptypescript - \loadmapfile[\typescriptthree-linotype-linoletter.map] - - \definefontsynonym [Serif] [LinoLetterLT-Roman] - \definefontsynonym [SerifItalic] [LinoLetterLT-Italic] - \definefontsynonym [SerifSlanted] [LinoLetterLT-Italic] - \definefontsynonym [SerifBold] [LinoLetterLT-Bold] - \definefontsynonym [SerifBoldItalic] [LinoLetterLT-BoldItalic] - \definefontsynonym [SerifBoldSlanted][LinoLetterLT-BoldItalic] - +\starttypescript [serif] [linoletter] [ec,texnansi] + \definefontsynonym[LinoLetterLT-Roman] [texnansi-lte51129] [encoding=\typescriptthree] + \definefontsynonym[LinoLetterLT-Italic] [texnansi-lte51130] [encoding=\typescriptthree] + \definefontsynonym[LinoLetterLT-Bold] [texnansi-lte51133] [encoding=\typescriptthree] + \definefontsynonym[LinoLetterLT-BoldItalic] [texnansi-lte51134] [encoding=\typescriptthree] + \definefontsynonym[LinoLetterLT-BlackItalic] [texnansi-lte51136] [encoding=\typescriptthree] + \definefontsynonym[LinoLetter-MediumSC] [texnansi-llmsc] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-linotype-linoletter.map] \stoptypescript \stoptypescriptcollection diff --git a/tex/context/base/type-cbg.tex b/tex/context/base/type-cbg.tex index 1c041376b..93cfa077e 100644 --- a/tex/context/base/type-cbg.tex +++ b/tex/context/base/type-cbg.tex @@ -33,90 +33,82 @@ \starttypescriptcollection[cbgreek] \starttypescript [serif] [cbgreek] [name] - - \definefontsynonym [CBGreek-Regular-Medium-Normal] [grmn1000] - \definefontsynonym [CBGreek-Regular-Medium-Oblique] [grmo1000] - \definefontsynonym [CBGreek-Regular-Medium-Italic] [grmi1000] - \definefontsynonym [CBGreek-Regular-Medium-UprightItalic] [grmu1000] - \definefontsynonym [CBGreek-Regular-Medium-Caps] [grmc1000] - \definefontsynonym [CBGreek-Regular-Medium-Leipzig] [grml1000] - \definefontsynonym [CBGreek-Regular-Medium-Roman] [grmr1000] - - \definefontsynonym [CBGreek-Regular-BoldExtended-Normal] [grxn1000] - \definefontsynonym [CBGreek-Regular-BoldExtended-Oblique] [grxo1000] - \definefontsynonym [CBGreek-Regular-BoldExtended-Italic] [grxi1000] - \definefontsynonym [CBGreek-Regular-BoldExtended-UprightItalic] [grxu1000] - \definefontsynonym [CBGreek-Regular-BoldExtended-Caps] [grxc1000] - \definefontsynonym [CBGreek-Regular-BoldExtended-Leipzig] [grxl1000] - \definefontsynonym [CBGreek-Regular-BoldExtended-Roman] [grxr1000] - + \definefontsynonym [CBGreek-Regular-Medium-Normal] [grmn1000] + \definefontsynonym [CBGreek-Regular-Medium-Oblique] [grmo1000] + \definefontsynonym [CBGreek-Regular-Medium-Italic] [grmi1000] + \definefontsynonym [CBGreek-Regular-Medium-UprightItalic] [grmu1000] + \definefontsynonym [CBGreek-Regular-Medium-Caps] [grmc1000] + \definefontsynonym [CBGreek-Regular-Medium-Leipzig] [grml1000] + \definefontsynonym [CBGreek-Regular-Medium-Roman] [grmr1000] + \definefontsynonym [CBGreek-Regular-BoldExtended-Normal] [grxn1000] + \definefontsynonym [CBGreek-Regular-BoldExtended-Oblique] [grxo1000] + \definefontsynonym [CBGreek-Regular-BoldExtended-Italic] [grxi1000] + \definefontsynonym [CBGreek-Regular-BoldExtended-UprightItalic] [grxu1000] + \definefontsynonym [CBGreek-Regular-BoldExtended-Caps] [grxc1000] + \definefontsynonym [CBGreek-Regular-BoldExtended-Leipzig] [grxl1000] + \definefontsynonym [CBGreek-Regular-BoldExtended-Roman] [grxr1000] + \loadmapfile [cbgreek.map] \stoptypescript \starttypescript [sans] [cbgreek] [name] - - \definefontsynonym [CBGreek-Sans-Medium-Normal] [gsmn1000] - \definefontsynonym [CBGreek-Sans-Medium-Oblique] [gsmo1000] - \definefontsynonym [CBGreek-Sans-Medium-Italic] [gsmi1000] - \definefontsynonym [CBGreek-Sans-Medium-UprightItalic] [gsmu1000] - \definefontsynonym [CBGreek-Sans-Medium-Caps] [gsmc1000] - \definefontsynonym [CBGreek-Sans-Medium-Leipzig] [gsml1000] - \definefontsynonym [CBGreek-Sans-Medium-Roman] [gsmr1000] - - \definefontsynonym [CBGreek-Sans-BoldExtended-Normal] [gsxn1000] - \definefontsynonym [CBGreek-Sans-BoldExtended-Oblique] [gsxo1000] - \definefontsynonym [CBGreek-Sans-BoldExtended-Italic] [gsxi1000] - \definefontsynonym [CBGreek-Sans-BoldExtended-UprightItalic] [gsxu1000] - \definefontsynonym [CBGreek-Sans-BoldExtended-Caps] [gsxc1000] - \definefontsynonym [CBGreek-Sans-BoldExtended-Leipzig] [gsxl1000] - \definefontsynonym [CBGreek-Sans-BoldExtended-Roman] [gsxr1000] - + \definefontsynonym [CBGreek-Sans-Medium-Normal] [gsmn1000] + \definefontsynonym [CBGreek-Sans-Medium-Oblique] [gsmo1000] + \definefontsynonym [CBGreek-Sans-Medium-Italic] [gsmi1000] + \definefontsynonym [CBGreek-Sans-Medium-UprightItalic] [gsmu1000] + \definefontsynonym [CBGreek-Sans-Medium-Caps] [gsmc1000] + \definefontsynonym [CBGreek-Sans-Medium-Leipzig] [gsml1000] + \definefontsynonym [CBGreek-Sans-Medium-Roman] [gsmr1000] + \definefontsynonym [CBGreek-Sans-BoldExtended-Normal] [gsxn1000] + \definefontsynonym [CBGreek-Sans-BoldExtended-Oblique] [gsxo1000] + \definefontsynonym [CBGreek-Sans-BoldExtended-Italic] [gsxi1000] + \definefontsynonym [CBGreek-Sans-BoldExtended-UprightItalic] [gsxu1000] + \definefontsynonym [CBGreek-Sans-BoldExtended-Caps] [gsxc1000] + \definefontsynonym [CBGreek-Sans-BoldExtended-Leipzig] [gsxl1000] + \definefontsynonym [CBGreek-Sans-BoldExtended-Roman] [gsxr1000] + \loadmapfile [cbgreek.map] \stoptypescript \starttypescript [mono] [cbgreek] [name] - - \definefontsynonym [CBGreek-Typewriter-Medium-Normal] [gttn1000] - \definefontsynonym [CBGreek-Typewriter-Medium-Oblique] [gtto1000] - \definefontsynonym [CBGreek-Typewriter-Medium-Italic] [gtti1000] - \definefontsynonym [CBGreek-Typewriter-Medium-UprightItalic] [gttu1000] - \definefontsynonym [CBGreek-Typewriter-Medium-Caps] [gttc1000] - \definefontsynonym [CBGreek-Typewriter-Medium-Leipzig] [gttl1000] - \definefontsynonym [CBGreek-Typewriter-Medium-Roman] [gttr1000] - + \definefontsynonym [CBGreek-Typewriter-Medium-Normal] [gttn1000] + \definefontsynonym [CBGreek-Typewriter-Medium-Oblique] [gtto1000] + \definefontsynonym [CBGreek-Typewriter-Medium-Italic] [gtti1000] + \definefontsynonym [CBGreek-Typewriter-Medium-UprightItalic] [gttu1000] + \definefontsynonym [CBGreek-Typewriter-Medium-Caps] [gttc1000] + \definefontsynonym [CBGreek-Typewriter-Medium-Leipzig] [gttl1000] + \definefontsynonym [CBGreek-Typewriter-Medium-Roman] [gttr1000] + \loadmapfile [cbgreek.map] \stoptypescript \starttypescript [serif] [cbgreek] [name] - - \definefontsynonym [Serif] [CBGreek-Regular-Medium-Normal] - \definefontsynonym [SerifSlanted] [CBGreek-Regular-Medium-Oblique] - \definefontsynonym [SerifItalic] [CBGreek-Regular-Medium-Italic] - \definefontsynonym [SerifCaps] [CBGreek-Regular-Medium-Caps] - \definefontsynonym [SerifBold] [CBGreek-Regular-BoldExtended-Normal] - \definefontsynonym [SerifBoldSlanted] [CBGreek-Regular-BoldExtended-Oblique] - \definefontsynonym [SerifBoldItalic] [CBGreek-Regular-BoldExtended-Italic] - \definefontsynonym [SerifBoldCaps] [CBGreek-Regular-BoldExtended-Caps] - + \definefontsynonym [Serif] [CBGreek-Regular-Medium-Normal] + \definefontsynonym [SerifSlanted] [CBGreek-Regular-Medium-Oblique] + \definefontsynonym [SerifItalic] [CBGreek-Regular-Medium-Italic] + \definefontsynonym [SerifCaps] [CBGreek-Regular-Medium-Caps] + \definefontsynonym [SerifBold] [CBGreek-Regular-BoldExtended-Normal] + \definefontsynonym [SerifBoldSlanted] [CBGreek-Regular-BoldExtended-Oblique] + \definefontsynonym [SerifBoldItalic] [CBGreek-Regular-BoldExtended-Italic] + \definefontsynonym [SerifBoldCaps] [CBGreek-Regular-BoldExtended-Caps] + \loadmapfile [cbgreek.map] \stoptypescript \starttypescript [sans] [cbgreek] [name] - - \definefontsynonym [Sans] [CBGreek-Sans-Medium-Normal] - \definefontsynonym [SansSlanted] [CBGreek-Sans-Medium-Oblique] - \definefontsynonym [SansItalic] [CBGreek-Sans-Medium-Italic] - \definefontsynonym [SansCaps] [CBGreek-Sans-Medium-Caps] - \definefontsynonym [SansBold] [CBGreek-Sans-BoldExtended-Normal] - \definefontsynonym [SansBoldSlanted] [CBGreek-Sans-BoldExtended-Oblique] - \definefontsynonym [SansBoldItalic] [CBGreek-Sans-BoldExtended-Italic] - \definefontsynonym [SansBoldCaps] [CBGreek-Sans-BoldExtended-Caps] - + \definefontsynonym [Sans] [CBGreek-Sans-Medium-Normal] + \definefontsynonym [SansSlanted] [CBGreek-Sans-Medium-Oblique] + \definefontsynonym [SansItalic] [CBGreek-Sans-Medium-Italic] + \definefontsynonym [SansCaps] [CBGreek-Sans-Medium-Caps] + \definefontsynonym [SansBold] [CBGreek-Sans-BoldExtended-Normal] + \definefontsynonym [SansBoldSlanted] [CBGreek-Sans-BoldExtended-Oblique] + \definefontsynonym [SansBoldItalic] [CBGreek-Sans-BoldExtended-Italic] + \definefontsynonym [SansBoldCaps] [CBGreek-Sans-BoldExtended-Caps] + \loadmapfile [cbgreek.map] \stoptypescript \starttypescript [mono] [cbgreek] [name] - - \definefontsynonym [Mono] [CBGreek-Typewriter-Medium-Normal] - \definefontsynonym [MonoSlanted] [CBGreek-Typewriter-Medium-Oblique] - \definefontsynonym [MonoItalic] [CBGreek-Typewriter-Medium-Italic] - \definefontsynonym [MonoCaps] [CBGreek-Typewriter-Medium-Caps] - + \definefontsynonym [Mono] [CBGreek-Typewriter-Medium-Normal] + \definefontsynonym [MonoSlanted] [CBGreek-Typewriter-Medium-Oblique] + \definefontsynonym [MonoItalic] [CBGreek-Typewriter-Medium-Italic] + \definefontsynonym [MonoCaps] [CBGreek-Typewriter-Medium-Caps] + \loadmapfile [cbgreek.map] \stoptypescript % Please note that we use Bold Extended instead of Bold @@ -168,6 +160,8 @@ bf=grxn1440 sa 1,bs=grxo1440 sa 1,bi=grxi1440 sa 1, sc=grmc1440 sa 1] + \loadmapfile [cbgreek.map] + \stoptypescript \starttypescript [sans] [cbgreek-all] [size] @@ -217,6 +211,8 @@ bf=gsxn1440 sa 1,bs=gsxo1440 sa 1,bi=gsxi1440 sa 1, sc=gsmc1440 sa 1] + \loadmapfile [cbgreek.map] + \stoptypescript \starttypescript [mono] [cbgreek-all] [size] @@ -257,6 +253,8 @@ [tf=gttn1440 sa 1,sl=gtto1440 sa 1,it=gtti1440 sa 1, sc=gttc1440 sa 1] + \loadmapfile [cbgreek.map] + \stoptypescript \starttypescript [serif] [cbgreek-medium] [size] @@ -276,6 +274,8 @@ bf=grxn1200 sa 1,bs=grxo1200 sa 1,bi=grxi1200 sa 1, sc=grmc1200 sa 1] + \loadmapfile [cbgreek.map] + \stoptypescript \starttypescript [sans] [cbgreek-medium] [size] @@ -295,6 +295,8 @@ bf=gsxn1200 sa 1,bs=gsxo1200 sa 1,bi=gsxi1200 sa 1, sc=gsmc1200 sa 1] + \loadmapfile [cbgreek.map] + \stoptypescript \starttypescript [mono] [cbgreek-medium] [size] @@ -311,11 +313,8 @@ [tf=gttn1200 sa 1,sl=gtto1200 sa 1,it=gtti1200 sa 1, sc=gttc1200 sa 1] -\stoptypescript - -\starttypescript [map] [cbgreek] \loadmapfile [cbgreek.map] -% \loadmapfile [cbsmall.map] + \stoptypescript \starttypescript [cbgreek-all] diff --git a/tex/context/base/type-def.tex b/tex/context/base/type-def.tex index e78087b94..6469a5925 100644 --- a/tex/context/base/type-def.tex +++ b/tex/context/base/type-def.tex @@ -18,47 +18,111 @@ \definefontsynonym [DefaultFont] [cmvtt10] \startsetups [font:fallback:serif] - \definefontsynonym [Serif] [DefaultFont] - \definefontsynonym [SerifBold] [Serif] - \definefontsynonym [SerifItalic] [Serif] - \definefontsynonym [SerifSlanted] [SerifItalic] - \definefontsynonym [SerifBoldItalic] [Serif] - \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic] - \definefontsynonym [SerifCaps] [Serif] + \definefontsynonym [Serif] [DefaultFont] + \definefontsynonym [SerifBold] [Serif] + \definefontsynonym [SerifItalic] [Serif] + \definefontsynonym [SerifSlanted] [SerifItalic] + \definefontsynonym [SerifBoldItalic] [Serif] + \definefontsynonym [SerifBoldSlanted] [SerifBoldItalic] + \definefontsynonym [SerifCaps] [Serif] \stopsetups \startsetups [font:fallback:sans] - \definefontsynonym [Sans] [DefaultFont] - \definefontsynonym [SansBold] [Sans] - \definefontsynonym [SansItalic] [Sans] - \definefontsynonym [SansSlanted] [SansItalic] - \definefontsynonym [SansBoldItalic] [Sans] - \definefontsynonym [SansBoldSlanted] [SansBoldItalic] - \definefontsynonym [SansCaps] [Sans] + \definefontsynonym [Sans] [DefaultFont] + \definefontsynonym [SansBold] [Sans] + \definefontsynonym [SansItalic] [Sans] + \definefontsynonym [SansSlanted] [SansItalic] + \definefontsynonym [SansBoldItalic] [Sans] + \definefontsynonym [SansBoldSlanted] [SansBoldItalic] + \definefontsynonym [SansCaps] [Sans] \stopsetups \startsetups [font:fallback:mono] - \definefontsynonym [Mono] [DefaultFont] - \definefontsynonym [MonoBold] [Mono] - \definefontsynonym [MonoItalic] [Mono] - \definefontsynonym [MonoSlanted] [MonoItalic] - \definefontsynonym [MonoBoldItalic] [Mono] - \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic] - \definefontsynonym [MonoCaps] [Mono] + \definefontsynonym [Mono] [DefaultFont] + \definefontsynonym [MonoBold] [Mono] + \definefontsynonym [MonoItalic] [Mono] + \definefontsynonym [MonoSlanted] [MonoItalic] + \definefontsynonym [MonoBoldItalic] [Mono] + \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic] + \definefontsynonym [MonoCaps] [Mono] \stopsetups \startsetups [font:allbold:serif] - \definefontsynonym [Serif] [SerifBold] - \definefontsynonym [SerifItalic] [SerifBoldItalic] - \definefontsynonym [SerifSlanted] [SerifBoldSlanted] - %definefontsynonym [SerifCaps] [SerifBold] + \definefontsynonym [Serif] [SerifBold] + \definefontsynonym [SerifItalic] [SerifBoldItalic] + \definefontsynonym [SerifSlanted] [SerifBoldSlanted] + %definefontsynonym [SerifCaps] [SerifBold] \stopsetups \startsetups [font:allbold:sans] - \definefontsynonym [Sans] [SansBold] - \definefontsynonym [SansItalic] [SansBoldItalic] - \definefontsynonym [SansSlanted] [SansBoldSlanted] - %definefontsynonym [SansCaps] [SansBold] + \definefontsynonym [Sans] [SansBold] + \definefontsynonym [SansItalic] [SansBoldItalic] + \definefontsynonym [SansSlanted] [SansBoldSlanted] + %definefontsynonym [SansCaps] [SansBold] \stopsetups +\starttypescript [serif] [simple] [name] + \definefontsynonym [Serif] [Simple] + \definefontsynonym [SerifBold] [Serif] + \definefontsynonym [SerifItalic] [Serif] + \definefontsynonym [SerifSlanted] [Serif] + \definefontsynonym [SerifBoldItalic] [Serif] + \definefontsynonym [SerifBoldSlanted] [Serif] + \definefontsynonym [SerifCaps] [Serif] +\stoptypescript + +\starttypescript [sans] [simple] [name] + \definefontsynonym [Sans] [Simple] + \definefontsynonym [SansBold] [Sans] + \definefontsynonym [SansItalic] [Sans] + \definefontsynonym [SansSlanted] [Sans] + \definefontsynonym [SansBoldItalic] [Sans] + \definefontsynonym [SansBoldSlanted] [Sans] + \definefontsynonym [SansCaps] [Sans] +\stoptypescript + +\starttypescript [mono] [simple] [name] + \definefontsynonym [Mono] [Simple] + \definefontsynonym [MonoBold] [Mono] + \definefontsynonym [MonoItalic] [Mono] + \definefontsynonym [MonoSlanted] [Mono] + \definefontsynonym [MonoBoldItalic] [Mono] + \definefontsynonym [MonoBoldSlanted] [Mono] + \definefontsynonym [MonoCaps] [Mono] +\stoptypescript + +% handy + +% \starttypescript [serif] [simple] [name] +% \definefontsynonym [Simple] [cmvtt10] +% \setupfontsynonym [Simple] [handling=pure] +% \stoptypescript + +\starttypescript [serif,sans,mono] [handling,hanging] [pure,normal] + \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree] + \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree bold] + \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree slanted] + \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree italic] + \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree boldslanted] + \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree bolditalic] +\stoptypescript + +\starttypescript [serif,sans,mono] [handling,hz] [hz,quality,highquality] + \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree] + \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree] + \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree] + \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree] + \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree] + \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree] +\stoptypescript + +\starttypescript [serif,sans,mono] [handling] [noligs,prespacing,flexspacing] + \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree] + \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree] + \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree] + \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree] + \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree] + \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree] +\stoptypescript + \endinput diff --git a/tex/context/base/type-exa.tex b/tex/context/base/type-exa.tex index 123e2cb4d..29f882f02 100644 --- a/tex/context/base/type-exa.tex +++ b/tex/context/base/type-exa.tex @@ -11,244 +11,17 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. -%D A couple of goodies: - -\starttypescriptcollection[examples] - -\starttypescript [fallback] [texnansi,ec,qx,t5,default] - - % no fontclass, so this is the fall back - - \definetypeface [] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo] - - \quittypescriptscanning - -\stoptypescript - -\starttypescript [modern] [texnansi,ec,qx,t5,default] - - \definetypeface [modern] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [modern] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [modern] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo] - \definetypeface [modern] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo] - - \quittypescriptscanning - -\stoptypescript - -\starttypescript [modern-base] [texnansi,ec,qx,t5,default] - - \definetypeface [modern] [rm] [serif] [modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [ss] [sans] [modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [tt] [mono] [modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [mm] [math] [modern] [default] [encoding=\typescripttwo] - - \quittypescriptscanning - -\stoptypescript - -\starttypescript [modern-base] [t2a,t2b,t2c,x2] - - \definetypeface [modern] [rm] [serif] [computer-modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [ss] [sans] [computer-modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [tt] [mono] [computer-modern] [default] [encoding=\typescripttwo] - \definetypeface [modern] [mm] [math] [computer-modern] [default] [encoding=\typescripttwo] - - \quittypescriptscanning - -\stoptypescript +%D The examples are moved to \type {type-one}, \type {type-otf} and +%D \type {type-buy}. \starttypescript [fallback,modern,modern-base] [il2] - \usetypescript[\typescriptone][ec] - \enableregime[il2] -\stoptypescript -\starttypescript [fallback,modern,modern-base] [pl0] - \usetypescript[\typescriptone][qx] - \enableregime[pl0] -\stoptypescript - -\starttypescript [postscript] [texnansi,ec,qx,t5,uc,8r] - - \definetypeface [postscript] [rm] [serif] [times] [default] [encoding=\typescripttwo] - \definetypeface [postscript] [ss] [sans] [helvetica] [default] [rscale=.9,encoding=\typescripttwo] - \definetypeface [postscript] [tt] [mono] [courier] [default] [rscale=1.1,encoding=\typescripttwo] - \definetypeface [postscript] [mm] [math] [times] [default] - - \quittypescriptscanning - -\stoptypescript - -\starttypescript [times] [texnansi,ec,qx,8r,t5,uc] - - \definetypeface [times] [rm] [serif] [times] [default] [encoding=\typescripttwo] - \definetypeface [times] [ss] [sans] [helvetica] [default] [encoding=\typescripttwo,rscale=0.9] - \definetypeface [times] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.05] - \definetypeface [times] [mm] [math] [times] [default] [encoding=\typescripttwo] - -% \usemathcollection[default] - - \quittypescriptscanning - -\stoptypescript - -\starttypescript [palatino] [texnansi,ec,qx,8r,t5,uc] - - \definetypeface [palatino] [rm] [serif] [palatino] [default] [encoding=\typescripttwo] - \definetypeface [palatino] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.075] - \definetypeface [palatino] [mm] [math] [palatino] [default] [encoding=default] - -% \usemathcollection[default] - - \quittypescriptscanning - + \usetypescript[\typescriptone][ec] + \enableregime[il2] \stoptypescript -\starttypescript [fourier] [ec] - - \definetypeface [fourier] [rm] [serif] [fourier] [default] [encoding=ec] - \definetypeface [fourier] [mm] [math] [fourier] [default] [encoding=default] - \definetypeface [fourier] [tt] [mono] [modern] [default] [encoding=ec,rscale=1.07] - - \usemathcollection[fou] - - \quittypescriptscanning - -\stoptypescript - -% \starttypescript [utopia] [ec] - -% \definetypeface [fourier] [rm] [serif] [fourier] [default] [encoding=ec] -% \definetypeface [fourier] [mm] [math] [fourier] [default] [encoding=default] -% \definetypeface [fourier] [tt] [mono] [modern] [default] [rscale=1.070,encoding=ec] - -% \usemathcollection[fou] - -% \stoptypescript - -\starttypescript [lucida,lucidabfm] [texnansi,ec,8r,uc] - - \definetypeface [lucida] [rm] [serif] [lucida] [default] [encoding=\typescripttwo] - \definetypeface [lucida] [ss] [sans] [lucida] [default] [encoding=\typescripttwo] - \definetypeface [lucida] [tt] [mono] [lucida] [default] [encoding=\typescripttwo] - \definetypeface [lucida] [hw] [handwriting] [lucida] [default] [encoding=\typescripttwo] - \definetypeface [lucida] [cg] [calligraphy] [lucida] [default] [encoding=\typescripttwo] - -\stoptypescript - -\starttypescript [lucida] [texnansi,ec,8r] - - \definetypeface [lucida] [mm] [math] [lucida] [default] [encoding=\typescripttwo] - -\stoptypescript - -\starttypescript [lucidaboldmath] [texnansi,ec,8r] - - \definetypeface [lucidaboldmath] [rm] [serif] [lucida] [default] [encoding=\typescripttwo] % needed ? - \definetypeface [lucidaboldmath] [ss] [sans] [lucida] [default] [encoding=\typescripttwo] % needed ? - \definetypeface [lucidaboldmath] [tt] [mono] [lucida] [default] [encoding=\typescripttwo] % needed ? - \definetypeface [lucidaboldmath] [mm] [boldmath] [lucida] [default] [encoding=\typescripttwo] - -\stoptypescript - -\starttypescript [lucidabfm,lucidaboldmath] [texnansi,ec,8r] - - \definetypeface [lucida] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo] - \definetypeface [lucidaboldmath] [mm] [bfmath] [lucida] [default] [encoding=\typescripttwo] - -\stoptypescript - -\starttypescript [lucida,lucidabfm,lucidaboldmath] [texnansi,ec,8r] - - \usemathcollection[lbr] - - \quittypescriptscanning % last in the row - -\stoptypescript - -\starttypescript [serif,sans,mono] [handling,hanging] [pure,normal] - - \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree] - \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree bold] - \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree slanted] - \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree italic] - \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree boldslanted] - \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree bolditalic] - -\stoptypescript - -\starttypescript [serif,sans,mono] [handling,hz] [hz,quality,highquality] - - \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree] - \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree] - \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree] - \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree] - \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree] - \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree] - -\stoptypescript - - -\starttypescript [serif,sans,mono] [handling] [noligs,prespacing,flexspacing] - - \setupfontsynonym [\typescriptprefix\typescriptone ] [handling=\typescriptthree] - \setupfontsynonym [\typescriptprefix\typescriptone Bold] [handling=\typescriptthree] - \setupfontsynonym [\typescriptprefix\typescriptone Slanted] [handling=\typescriptthree] - \setupfontsynonym [\typescriptprefix\typescriptone Italic] [handling=\typescriptthree] - \setupfontsynonym [\typescriptprefix\typescriptone BoldSlanted] [handling=\typescriptthree] - \setupfontsynonym [\typescriptprefix\typescriptone BoldItalic] [handling=\typescriptthree] - -\stoptypescript - -% handy - -\starttypescript [serif] [simple] [name] % bad, will be changed but in sycn with manuals that use it - - \definefontsynonym [Simple] [cmvtt10] - \setupfontsynonym [Simple] [handling=pure] - -\stoptypescript - -\starttypescript [modernvariable] [texnansi,ec,qx,8r,t5] - - \definetypeface [modernvariable] [rm] [serif] [simple] [default] [encoding=\typescripttwo] - \definetypeface [modernvariable] [ss] [sans] [modern] [default] [encoding=\typescripttwo] - \definetypeface [modernvariable] [tt] [mono] [modern] [default] [encoding=\typescripttwo] - \definetypeface [modernvariable] [mm] [math] [modern] [default] - -\stoptypescript - -\starttypescript [optima] [texnansi,ec,qx] - - \definetypeface[optima][ss][sans] [optima-nova][default][encoding=\typescripttwo] - \definetypeface[optima][rm][serif][palatino] [default][encoding=\typescripttwo] - \definetypeface[optima][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1] - \definetypeface[optima][mm][math] [palatino] [default][encoding=\typescripttwo] - -\stoptypescript - -\starttypescript [antykwa-torunska] [texnansi,ec,8r,uc,t2a] - - \definetypeface[antykwa][rm][serif][antykwa-torunska] [default][encoding=\typescripttwo] - \definetypeface[antykwa][ss][sans] [modern] [default][encoding=\typescripttwo,rscale=1.05] - \definetypeface[antykwa][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1] - \definetypeface[antykwa][mm][math] [antykwa-torunska] [default][encoding=\typescripttwo] - -\stoptypescript - -\starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium] [texnansi,ec,8r,uc,t2a] - - % todo: rscale - - \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default][encoding=\typescripttwo] - \definetypeface[\typescriptone][rm][serif][modern] [default][encoding=\typescripttwo] - \definetypeface[\typescriptone][tt][mono] [modern] [default][encoding=\typescripttwo] - \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][encoding=\typescripttwo,text=ss] - +\starttypescript [fallback,modern,modern-base] [pl0] + \usetypescript[\typescriptone][qx] + \enableregime[pl0] \stoptypescript -\stoptypescriptcollection - \endinput diff --git a/tex/context/base/type-fsf.tex b/tex/context/base/type-fsf.tex index 9467ae929..7813b7b5d 100644 --- a/tex/context/base/type-fsf.tex +++ b/tex/context/base/type-fsf.tex @@ -11,6 +11,9 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +%D I'm not sure how correct the fontsite cd is. These are probably +%D mostly rip-offs. I no longer use these fonts. + % run texfont from currentpath with the fonts on subpath fontsite/500 % texfont --en=texnansi --ve=fontsite --co=opus type-fsf.dat @@ -18,99 +21,72 @@ \starttypescriptcollection[font site 500] -\starttypescript [sans] [opus] [name] - - \definefontsynonym [Sans] [Opus] - \definefontsynonym [SansCaps] [OpusSmCaps] - \definefontsynonym [SansItalic] [Opus-Italic] - \definefontsynonym [SansBold] [Opus-Bold] - \definefontsynonym [SansBoldCaps] [OpusSmCaps-Bold] - \definefontsynonym [SansBoldItalic] [Opus-BoldItalic] - - \definefontsynonym [SansSlanted] [Opus-Slanted] % faked - \definefontsynonym [SansBoldSlanted] [Opus-BoldSlanted] % faked +%D Please use the original Optima! +\starttypescript [sans] [opus] [name] + \definefontsynonym [Sans] [Opus] + \definefontsynonym [SansCaps] [OpusSmCaps] + \definefontsynonym [SansItalic] [Opus-Italic] + \definefontsynonym [SansBold] [Opus-Bold] + \definefontsynonym [SansBoldCaps] [OpusSmCaps-Bold] + \definefontsynonym [SansBoldItalic] [Opus-BoldItalic] + \definefontsynonym [SansSlanted] [Opus-Slanted] % faked + \definefontsynonym [SansBoldSlanted] [Opus-BoldSlanted] % faked \stoptypescript \starttypescript [sans] [opus] [texnansi,ec,8r] - - \definefontsynonym [Opus] [\typescriptthree-opusrg] [encoding=\typescriptthree] - \definefontsynonym [OpusSmCaps] [\typescriptthree-opusscrg] [encoding=\typescriptthree] - \definefontsynonym [Opus-Italic] [\typescriptthree-opusi] [encoding=\typescriptthree] - \definefontsynonym [Opus-Bold] [\typescriptthree-opusb] [encoding=\typescriptthree] - \definefontsynonym [Opus-BoldItalic] [\typescriptthree-opusbi] [encoding=\typescriptthree] - \definefontsynonym [OpusSmCaps-Bold] [\typescriptthree-opusscb] [encoding=\typescriptthree] - - \definefontsynonym [Opus-Slanted] [\typescriptthree-opusrg-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Opus-BoldSlanted] [\typescriptthree-opusb-slanted-167] [encoding=\typescriptthree] - -\stoptypescript - -\starttypescript [map] [opus] [texnansi,ec,8r] - \loadmapfile[\typescriptthree-fontsite-opus.map] + \definefontsynonym [Opus] [\typescriptthree-opusrg] [encoding=\typescriptthree] + \definefontsynonym [OpusSmCaps] [\typescriptthree-opusscrg] [encoding=\typescriptthree] + \definefontsynonym [Opus-Italic] [\typescriptthree-opusi] [encoding=\typescriptthree] + \definefontsynonym [Opus-Bold] [\typescriptthree-opusb] [encoding=\typescriptthree] + \definefontsynonym [Opus-BoldItalic] [\typescriptthree-opusbi] [encoding=\typescriptthree] + \definefontsynonym [OpusSmCaps-Bold] [\typescriptthree-opusscb] [encoding=\typescriptthree] + \definefontsynonym [Opus-Slanted] [\typescriptthree-opusrg-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Opus-BoldSlanted] [\typescriptthree-opusb-slanted-167] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-fontsite-opus.map] \stoptypescript \starttypescript [mono] [typewriter] [name] - - \definefontsynonym [Mono] [Typewriter] - \definefontsynonym [MonoItalic] [Typewriter-Italic] - \definefontsynonym [MonoBold] [Typewriter-Bold] - \definefontsynonym [MonoBoldItalic] [Typewriter-BoldItalic] - - \definefontsynonym [MonoSlanted] [Typewriter-Slanted] % faked - \definefontsynonym [MonoBoldSlanted] [Typewriter-BoldSlanted] % faked - + \definefontsynonym [Mono] [Typewriter] + \definefontsynonym [MonoItalic] [Typewriter-Italic] + \definefontsynonym [MonoBold] [Typewriter-Bold] + \definefontsynonym [MonoBoldItalic] [Typewriter-BoldItalic] + \definefontsynonym [MonoSlanted] [Typewriter-Slanted] % faked + \definefontsynonym [MonoBoldSlanted] [Typewriter-BoldSlanted] % faked \stoptypescript \starttypescript [mono] [typewriter] [texnansi,ec,8r] - - - \definefontsynonym [Typewriter] [\typescriptthree-typerg] [encoding=\typescriptthree] - \definefontsynonym [Typewriter-Italic] [\typescriptthree-typei] [encoding=\typescriptthree] - \definefontsynonym [Typewriter-Bold] [\typescriptthree-typeb] [encoding=\typescriptthree] - \definefontsynonym [Typewriter-BoldItalic] [\typescriptthree-typebi] [encoding=\typescriptthree] - - \definefontsynonym [Typewriter-Slanted] [\typescriptthree-typerg-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [Typewriter-BoldSlanted] [\typescriptthree-typeb-slanted-167] [encoding=\typescriptthree] - - \definefontsynonym [TypewriterCond] [\typescriptthree-typecrg] - \definefontsynonym [TypewriterCond-Bold] [\typescriptthree-typecb] - -\stoptypescript - -\starttypescript [map] [typewriter] [texnansi,ec,8r] - \loadmapfile[\typescriptthree-fontsite-typewriter.map] + \definefontsynonym [Typewriter] [\typescriptthree-typerg] [encoding=\typescriptthree] + \definefontsynonym [Typewriter-Italic] [\typescriptthree-typei] [encoding=\typescriptthree] + \definefontsynonym [Typewriter-Bold] [\typescriptthree-typeb] [encoding=\typescriptthree] + \definefontsynonym [Typewriter-BoldItalic] [\typescriptthree-typebi] [encoding=\typescriptthree] + \definefontsynonym [Typewriter-Slanted] [\typescriptthree-typerg-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Typewriter-BoldSlanted] [\typescriptthree-typeb-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [TypewriterCond] [\typescriptthree-typecrg] + \definefontsynonym [TypewriterCond-Bold] [\typescriptthree-typecb] + \loadmapfile[\typescriptthree-fontsite-typewriter.map] \stoptypescript \starttypescript [serif] [garamond] [name] - - \definefontsynonym [Serif] [FSGaramond] - \definefontsynonym [SerifCaps] [FSGaramondSmCaps] - \definefontsynonym [SerifItalic] [FSGaramond-Italic] - \definefontsynonym [SerifBold] [FSGaramond-Bold] - \definefontsynonym [SerifBoldCaps] [FSGaramondSmCaps-Bold] - - \definefontsynonym [SerifSlanted] [FSGaramond-Slanted] - \definefontsynonym [SerifBoldSlanted] [FSGaramond-BoldSlanted] - + \definefontsynonym [Serif] [FSGaramond] + \definefontsynonym [SerifCaps] [FSGaramondSmCaps] + \definefontsynonym [SerifItalic] [FSGaramond-Italic] + \definefontsynonym [SerifBold] [FSGaramond-Bold] + \definefontsynonym [SerifBoldCaps] [FSGaramondSmCaps-Bold] + \definefontsynonym [SerifSlanted] [FSGaramond-Slanted] + \definefontsynonym [SerifBoldSlanted] [FSGaramond-BoldSlanted] \stoptypescript \starttypescript [serif] [garamond] [texnansi,ec,8r] - - \definefontsynonym [FSGaramond] [\typescriptthree-garamond] [encoding=\typescriptthree] - \definefontsynonym [FSGaramondSmCaps] [\typescriptthree-garasc] [encoding=\typescriptthree] - \definefontsynonym [FSGaramond-Italic] [\typescriptthree-garai] [encoding=\typescriptthree] - \definefontsynonym [FSGaramond-Bold] [\typescriptthree-garab] [encoding=\typescriptthree] - \definefontsynonym [FSGaramond-BoldItalic] [\typescriptthree-garabi] [encoding=\typescriptthree] - \definefontsynonym [FSGaramondSmCaps-Bold] [\typescriptthree-garascb] [encoding=\typescriptthree] - - \definefontsynonym [FSGaramond-Slanted] [\typescriptthree-garamond-slanted-167] [encoding=\typescriptthree] - \definefontsynonym [FSGaramond-BoldSlanted] [\typescriptthree-garab-slanted-167] [encoding=\typescriptthree] - -\stoptypescript - -\starttypescript [map] [garamond] [texnansi,ec,8r] - \loadmapfile[\typescriptthree-fontsite-garamond.map] + \definefontsynonym [FSGaramond] [\typescriptthree-garamond] [encoding=\typescriptthree] + \definefontsynonym [FSGaramondSmCaps] [\typescriptthree-garasc] [encoding=\typescriptthree] + \definefontsynonym [FSGaramond-Italic] [\typescriptthree-garai] [encoding=\typescriptthree] + \definefontsynonym [FSGaramond-Bold] [\typescriptthree-garab] [encoding=\typescriptthree] + \definefontsynonym [FSGaramond-BoldItalic] [\typescriptthree-garabi] [encoding=\typescriptthree] + \definefontsynonym [FSGaramondSmCaps-Bold] [\typescriptthree-garascb] [encoding=\typescriptthree] + \definefontsynonym [FSGaramond-Slanted] [\typescriptthree-garamond-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [FSGaramond-BoldSlanted] [\typescriptthree-garab-slanted-167] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-fontsite-garamond.map] \stoptypescript \stoptypescriptcollection diff --git a/tex/context/base/type-ghz.tex b/tex/context/base/type-ghz.tex index 2be9de7cb..12ee9f3a3 100644 --- a/tex/context/base/type-ghz.tex +++ b/tex/context/base/type-ghz.tex @@ -59,8 +59,6 @@ \starttypescript [sans] [optima,optima-nova] [texnansi,ec,8r] - \loadmapfile[\typescriptthree-linotype-optima.map] - \definefontsynonym [OptimaLT] [\typescriptthree-lte50019] [encoding=\typescriptthree] \definefontsynonym [OptimaLT-Italic] [\typescriptthree-lte52401] [encoding=\typescriptthree] \definefontsynonym [OptimaLT-Bold] [\typescriptthree-lte50021] [encoding=\typescriptthree] @@ -75,14 +73,18 @@ \definefontsynonym [OptimaLT-ExtraBlack] [\typescriptthree-lte53511] [encoding=\typescriptthree] \definefontsynonym [OptimaLT-ExtraBlackItalic] [\typescriptthree-lte53512] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [map] [optima,optima-nova] [texnansi,ec,8r] - \loadmapfile[\typescriptthree-linotype-optima.map] \stoptypescript +\starttypescript [optima] [texnansi,ec,qx] + \definetypeface[optima][ss][sans] [optima-nova][default][encoding=\typescripttwo] + \definetypeface[optima][rm][serif][palatino] [default][encoding=\typescripttwo] + \definetypeface[optima][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1] + \definetypeface[optima][mm][math] [palatino] [default][encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + % optima nova % see antykwa, we could define variants for light and osf @@ -172,8 +174,6 @@ \starttypescript [sans] [optima-nova,optima-nova-light,optima-nova-medium,optima-nova-os] [texnansi,ec,8r] - \loadmapfile[\typescriptthree-linotype-optima-nova.map] - \definefontsynonym[OptimaNovaLT-Light] [\typescriptthree-lt55476][encoding=\typescriptthree] \definefontsynonym[OptimaNovaLT-LightSC] [\typescriptthree-lt55477][encoding=\typescriptthree] \definefontsynonym[OptimaNovaLT-LightOsF] [\typescriptthree-lt55478][encoding=\typescriptthree] @@ -215,10 +215,8 @@ \definefontsynonym[OptimaNovaLT-Black] [\typescriptthree-lt55514][encoding=\typescriptthree] \definefontsynonym[OptimaNovaLT-BlackItalic] [\typescriptthree-lt55515][encoding=\typescriptthree] -\stoptypescript - -\starttypescript [map] [optima-nova,optima-nova-light,optima-nova-medium,optima-nova-os] [texnansi,ec,8r] \loadmapfile[\typescriptthree-linotype-optima-nova.map] + \stoptypescript % palatino @@ -238,8 +236,6 @@ \starttypescript [serif] [palatino] [texnansi,ec,8r] - \loadmapfile[\typescriptthree-linotype-palatino.map] - \definefontsynonym[PalatinoLT-Roman] [\typescriptthree-lte50001] [encoding=\typescriptthree] \definefontsynonym[PalatinoLT-Italic] [\typescriptthree-lte50002] [encoding=\typescriptthree] \definefontsynonym[PalatinoLT-Bold] [\typescriptthree-lte50003] [encoding=\typescriptthree] @@ -257,10 +253,8 @@ \definefontsynonym[PalatinoSC] [\typescriptthree-posc] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [map] [palatino] [texnansi,ec,8r] \loadmapfile[\typescriptthree-linotype-palatino.map] + \stoptypescript % palatino nova @@ -313,8 +307,6 @@ \starttypescript [serif] [palatino-nova,palatino-nova-light,palatino-nova-medium] [texnansi,ec,8r] - \loadmapfile[\typescriptthree-linotype-palatino-nova.map] - \definefontsynonym[PalatinoNova-Light] [\typescriptthree-PalatinoNova-Light] [encoding=\typescriptthree] \definefontsynonym[PalatinoNova-LightItalic] [\typescriptthree-PalatinoNova-LightItalic] [encoding=\typescriptthree] \definefontsynonym[PalatinoNova-Regular] [\typescriptthree-PalatinoNova-Regular] [encoding=\typescriptthree] @@ -326,8 +318,6 @@ \definefontsynonym[PalatinoNova-Imperial] [\typescriptthree-PalatinoNova-Imperial] [encoding=\typescriptthree] \definefontsynonym[PalatinoNova-Titling] [\typescriptthree-PalatinoNova-Titling] [encoding=\typescriptthree] - \loadmapfile[\typescriptthree-sc-linotype-palatino-nova.map] - \definefontsynonym[PalatinoNova-LightSC] [\typescriptthree-sc-PalatinoNova-Light] [encoding=\typescriptthree] \definefontsynonym[PalatinoNova-LightItalicSC] [\typescriptthree-sc-PalatinoNova-LightItalic] [encoding=\typescriptthree] \definefontsynonym[PalatinoNova-RegularSC] [\typescriptthree-sc-PalatinoNova-Regular] [encoding=\typescriptthree] @@ -339,12 +329,9 @@ \definefontsynonym[PalatinoNova-ImperialSC] [\typescriptthree-sc-PalatinoNova-Imperial] [encoding=\typescriptthree] \definefontsynonym[PalatinoNova-TitlingSC] [\typescriptthree-sc-PalatinoNova-Titling] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [map] [palatino-nova,palatino-nova-light,palatino-nova-medium] [texnansi,ec,8r] \loadmapfile[\typescriptthree-linotype-palatino-nova.map] \loadmapfile[\typescriptthree-sc-linotype-palatino-nova.map] -% \loadmapfile[\typescriptthree-os-linotype-palatino-nova.map] + \stoptypescript % aldusnova @@ -373,27 +360,20 @@ \starttypescript [serif] [aldus-nova] [texnansi,ec,8r] - \loadmapfile[\typescriptthree-linotype-aldus-nova.map] - \definefontsynonym[AldusNova-Book] [\typescriptthree-AldusNova-Book] [encoding=\typescriptthree] \definefontsynonym[AldusNova-BookItalic] [\typescriptthree-AldusNova-BookItalic] [encoding=\typescriptthree] \definefontsynonym[AldusNova-Bold] [\typescriptthree-AldusNova-Bold] [encoding=\typescriptthree] \definefontsynonym[AldusNova-BoldItalic] [\typescriptthree-AldusNova-BoldItalic] [encoding=\typescriptthree] - \loadmapfile[\typescriptthree-sc-linotype-aldus-nova.map] - \definefontsynonym[AldusNova-BookSC] [\typescriptthree-sc-AldusNova-Book] [encoding=\typescriptthree] \definefontsynonym[AldusNova-BookItalicSC] [\typescriptthree-sc-AldusNova-BookItalic] [encoding=\typescriptthree] \definefontsynonym[AldusNova-BoldSC] [\typescriptthree-sc-AldusNova-Bold] [encoding=\typescriptthree] \definefontsynonym[AldusNova-BoldItalicSC] [\typescriptthree-sc-AldusNova-BoldItalic] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [map] [aldus-nova] [texnansi,ec,8r] \loadmapfile[\typescriptthree-linotype-aldus-nova.map] \loadmapfile[\typescriptthree-sc-linotype-aldus-nova.map] -\stoptypescript +\stoptypescript % melior @@ -415,17 +395,13 @@ \starttypescript [serif] [melior] [texnansi,ec,8r] - \loadmapfile[\typescriptthree-linotype-melior.map] - \definefontsynonym [MeliorLT] [texnansi-lte50062] [encoding=\typescriptthree] \definefontsynonym [MeliorLT-Italic] [texnansi-lte50063] [encoding=\typescriptthree] \definefontsynonym [MeliorLT-Bold] [texnansi-lte50064] [encoding=\typescriptthree] \definefontsynonym [MeliorLT-BoldItalic] [texnansi-lte50065] [encoding=\typescriptthree] -\stoptypescript - -\starttypescript [map] [melior] [texnansi,ec,8r] \loadmapfile[\typescriptthree-linotype-melior.map] + \stoptypescript \stoptypescriptcollection diff --git a/tex/context/base/type-gyr.tex b/tex/context/base/type-gyr.tex index ac625d22f..3fa266f8e 100644 --- a/tex/context/base/type-gyr.tex +++ b/tex/context/base/type-gyr.tex @@ -11,6 +11,8 @@ %C therefore copyrighted by \PRAGMA. See mreadme.pdf for %C details. +%D These definitions will eventually replace the ones in \type {type-one}! + % \usetypescriptfile[type-gyr] % \definetypeface[pagella][rm][serif][pagella][default][encoding=t5] % \setupbodyfont[pagella] @@ -50,69 +52,64 @@ \definetypescriptprefix [f:adventor][ag] \starttypescript [serif] [pagella,termes,heros,bonum,schola,adventor] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x] - \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map] - - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Caps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r-sc] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri-sc] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b-sc] [encoding=\typescriptthree] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi-sc] [encoding=\typescriptthree] - - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Slanted] [\typescriptprefix{n:\typescripttwo}-Italic] - \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldItalic] -\stoptypescript + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi] [encoding=\typescriptthree] -\starttypescript [serif] [pagella,termes,bonum,schola] [name] - \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular] - \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic] - \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold] - \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] - \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps] - \definefontsynonym [SerifSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted] - \definefontsynonym [SerifBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted] - - \definefontvariant [Serif][osf][Caps] - \definefontvariant [Serif][sc] [Caps] - - \definefontsynonym [SerifRegular] [\typescriptprefix{n:\typescripttwo}-Regular] - \definefontsynonym [SerifRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps] - \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] - \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] - \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] - \definefontsynonym [SerifCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps] - \definefontsynonym [SerifSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] - \definefontsynonym [SerifBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Caps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}r-sc] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}ri-sc] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}b-sc] [encoding=\typescriptthree] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [\typescriptthree-q\typescriptprefix{f:\typescripttwo}bi-sc] [encoding=\typescriptthree] -\stoptypescript + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Slanted] [\typescriptprefix{n:\typescripttwo}-Italic] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldItalic] -\starttypescript [sans] [heros,adventor] [name] - \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular] - \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic] - \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold] - \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] - \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps] - \definefontsynonym [SansSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted] - \definefontsynonym [SansBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted] - - \definefontvariant [Sans][osf][Caps] - \definefontvariant [Sans][sc] [Caps] - - \definefontsynonym [SansRegular] [\typescriptprefix{n:\typescripttwo}-Regular] - \definefontsynonym [SansRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps] - \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] - \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] - \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] - \definefontsynonym [SansCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps] - \definefontsynonym [SansSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] - \definefontsynonym [SansBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] + \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map] +\stoptypescript +\starttypescript [serif] [pagella,termes,bonum,schola] [name] + \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular] + \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic] + \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold] + \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] + \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps] + \definefontsynonym [SerifSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted] + \definefontsynonym [SerifBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegular] [\typescriptprefix{n:\typescripttwo}-Regular] + \definefontsynonym [SerifRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps] + \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] + \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] + \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] + \definefontsynonym [SerifCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps] + \definefontsynonym [SerifSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] + \definefontsynonym [SerifBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] \stoptypescript -\starttypescript [map] [pagella,termes,bonum,schola,heros,adventor] [all] - \loadmapfile[q\typescriptprefix{f:\typescripttwo}-\typescriptthree.map] +\starttypescript [sans] [heros,adventor] [name] + \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular] + \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic] + \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold] + \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] + \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps] + \definefontsynonym [SansSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted] + \definefontsynonym [SansBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted] + + \definefontvariant [Sans][osf][Caps] + \definefontvariant [Sans][sc] [Caps] + + \definefontsynonym [SansRegular] [\typescriptprefix{n:\typescripttwo}-Regular] + \definefontsynonym [SansRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps] + \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] + \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] + \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] + \definefontsynonym [SansCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps] + \definefontsynonym [SansSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] + \definefontsynonym [SansBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] \stoptypescript %D Here we overload the older (URW) fonts. @@ -125,16 +122,16 @@ % qplbi TeXGyrePagella-BoldItalic \starttypescript [serif] [palatino] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x] - \loadmapfile[qpl-\typescriptthree.map] + \definefontsynonym [Palatino] [\typescriptthree-qplr] [encoding=\typescriptthree] + \definefontsynonym [Palatino-Italic] [\typescriptthree-qplri] [encoding=\typescriptthree] + \definefontsynonym [Palatino-Bold] [\typescriptthree-qplb] [encoding=\typescriptthree] + \definefontsynonym [Palatino-BoldItalic] [\typescriptthree-qplbi] [encoding=\typescriptthree] + \definefontsynonym [Palatino-Caps] [\typescriptthree-qplr-sc] [encoding=\typescriptthree] - \definefontsynonym [Palatino] [\typescriptthree-qplr] [encoding=\typescriptthree] - \definefontsynonym [Palatino-Italic] [\typescriptthree-qplri] [encoding=\typescriptthree] - \definefontsynonym [Palatino-Bold] [\typescriptthree-qplb] [encoding=\typescriptthree] - \definefontsynonym [Palatino-BoldItalic] [\typescriptthree-qplbi] [encoding=\typescriptthree] - \definefontsynonym [Palatino-Caps] [\typescriptthree-qplr-sc] [encoding=\typescriptthree] + \definefontsynonym [Palatino-Slanted] [Palatino-Italic] + \definefontsynonym [Palatino-BoldSlanted] [Palatino-BoldItalic] - \definefontsynonym [Palatino-Slanted] [Palatino-Italic] - \definefontsynonym [Palatino-BoldSlanted] [Palatino-BoldItalic] + \loadmapfile[qpl-\typescriptthree.map] \stoptypescript % TeXGyreTermes @@ -145,17 +142,16 @@ % qtmbi TeXGyreTermes-BoldItalic \starttypescript [serif] [times] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x] -% \loadmapfile[\typescriptthree-qtm.map] - \loadmapfile[qtm-\typescriptthree.map] + \definefontsynonym [Times-Roman] [\typescriptthree-qtmr] [encoding=\typescriptthree] + \definefontsynonym [Times-Italic] [\typescriptthree-qtmri] [encoding=\typescriptthree] + \definefontsynonym [Times-Bold] [\typescriptthree-qtmb] [encoding=\typescriptthree] + \definefontsynonym [Times-BoldItalic] [\typescriptthree-qtmbi] [encoding=\typescriptthree] + \definefontsynonym [Times-Caps] [\typescriptthree-qtmr-sc] [encoding=\typescriptthree] - \definefontsynonym [Times-Roman] [\typescriptthree-qtmr] [encoding=\typescriptthree] - \definefontsynonym [Times-Italic] [\typescriptthree-qtmri] [encoding=\typescriptthree] - \definefontsynonym [Times-Bold] [\typescriptthree-qtmb] [encoding=\typescriptthree] - \definefontsynonym [Times-BoldItalic] [\typescriptthree-qtmbi] [encoding=\typescriptthree] - \definefontsynonym [Times-Caps] [\typescriptthree-qtmr-sc] [encoding=\typescriptthree] + \definefontsynonym [Times-Slanted] [Times-Italic] + \definefontsynonym [Times-BoldSlanted] [Times-BoldItalic] - \definefontsynonym [Times-Slanted] [Times-Italic] - \definefontsynonym [Times-BoldSlanted] [Times-BoldItalic] + \loadmapfile[qtm-\typescriptthree.map] \stoptypescript % TeXGyreHeros @@ -166,13 +162,13 @@ % qtmbi TeXGyreHeros-BoldItalic \starttypescript [serif] [heros,helvetica] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x] - \loadmapfile[qhv-\typescriptthree.map] + \definefontsynonym [Helvetica] [\typescriptthree-qhvr] [encoding=\typescriptthree] + \definefontsynonym [Helvetica-Oblique] [\typescriptthree-qhvri] [encoding=\typescriptthree] + \definefontsynonym [Helvetica-Bold] [\typescriptthree-qhvb] [encoding=\typescriptthree] + \definefontsynonym [Helvetica-BoldOblique] [\typescriptthree-qhvbi] [encoding=\typescriptthree] + \definefontsynonym [Helvetica-Caps] [\typescriptthree-qhvr-sc] [encoding=\typescriptthree] - \definefontsynonym [Helvetica] [\typescriptthree-qhvr] [encoding=\typescriptthree] - \definefontsynonym [Helvetica-Oblique] [\typescriptthree-qhvri] [encoding=\typescriptthree] - \definefontsynonym [Helvetica-Bold] [\typescriptthree-qhvb] [encoding=\typescriptthree] - \definefontsynonym [Helvetica-BoldOblique] [\typescriptthree-qhvbi] [encoding=\typescriptthree] - \definefontsynonym [Helvetica-Caps] [\typescriptthree-qhvr-sc] [encoding=\typescriptthree] + \loadmapfile[qhv-\typescriptthree.map] \stoptypescript % TeXGyreBonum @@ -183,17 +179,16 @@ % qtmbi TeXGyreBonum-BoldItalic \starttypescript [serif] [bookman] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x] -% \loadmapfile[\typescriptthree-qbk.map] - \loadmapfile[qbk-\typescriptthree.map] + \definefontsynonym [Bookman-Light] [\typescriptthree-qbkr] [encoding=\typescriptthree] + \definefontsynonym [Bookman-LightItalic] [\typescriptthree-qbkri] [encoding=\typescriptthree] + \definefontsynonym [Bookman-DemiBold] [\typescriptthree-qbkb] [encoding=\typescriptthree] + \definefontsynonym [Bookman-DemiBoldItalic] [\typescriptthree-qbkbi] [encoding=\typescriptthree] + \definefontsynonym [Bookman-Light-Caps] [\typescriptthree-qbkr-sc] [encoding=\typescriptthree] - \definefontsynonym [Bookman-Light] [\typescriptthree-qbkr] [encoding=\typescriptthree] - \definefontsynonym [Bookman-LightItalic] [\typescriptthree-qbkri] [encoding=\typescriptthree] - \definefontsynonym [Bookman-DemiBold] [\typescriptthree-qbkb] [encoding=\typescriptthree] - \definefontsynonym [Bookman-DemiBoldItalic] [\typescriptthree-qbkbi] [encoding=\typescriptthree] - \definefontsynonym [Bookman-Light-Caps] [\typescriptthree-qbkr-sc] [encoding=\typescriptthree] + \definefontsynonym [Bookman-LightSlanted] [Bookman-LightItalic] + \definefontsynonym [Bookman-DemiBoldSlanted] [Bookman-DemiBoldItalic] - \definefontsynonym [Bookman-LightSlanted] [Bookman-LightItalic] - \definefontsynonym [Bookman-DemiBoldSlanted] [Bookman-DemiBoldItalic] + \loadmapfile[qbk-\typescriptthree.map] \stoptypescript % TeXGyreScola @@ -204,16 +199,16 @@ % qcsbi TeXGyreSchola-BoldItalic \starttypescript [serif] [schoolbook] [ec,texnansi,cs,el,qx,rm,t5,t2a,t2b,t2c,l7x] - \loadmapfile[qcs-\typescriptthree.map] + \definefontsynonym [Schoolbook-Roman] [\typescriptthree-qcsr] [encoding=\typescriptthree] + \definefontsynonym [Schoolbook-Italic] [\typescriptthree-qcsri] [encoding=\typescriptthree] + \definefontsynonym [Schoolbook-Bold] [\typescriptthree-qcsb] [encoding=\typescriptthree] + \definefontsynonym [Schoolbook-BoldItalic] [\typescriptthree-qcsbi] [encoding=\typescriptthree] + \definefontsynonym [Schoolbook-Roman-Caps] [\typescriptthree-qcsr-sc] [encoding=\typescriptthree] - \definefontsynonym [Schoolbook-Roman] [\typescriptthree-qcsr] [encoding=\typescriptthree] - \definefontsynonym [Schoolbook-Italic] [\typescriptthree-qcsri] [encoding=\typescriptthree] - \definefontsynonym [Schoolbook-Bold] [\typescriptthree-qcsb] [encoding=\typescriptthree] - \definefontsynonym [Schoolbook-BoldItalic] [\typescriptthree-qcsbi] [encoding=\typescriptthree] - \definefontsynonym [Schoolbook-Roman-Caps] [\typescriptthree-qcsr-sc] [encoding=\typescriptthree] + \definefontsynonym [Schoolbook-Slanted] [Schoolbook-Italic] + \definefontsynonym [Schoolbook-BoldSlanted] [Schoolbook-BoldItalic] - \definefontsynonym [Schoolbook-Slanted] [Schoolbook-Italic] - \definefontsynonym [Schoolbook-BoldSlanted] [Schoolbook-BoldItalic] + \loadmapfile[qcs-\typescriptthree.map] \stoptypescript % TeXGyreAdventor diff --git a/tex/context/base/type-ini.tex b/tex/context/base/type-ini.tex index 25f12ff17..a009c37e1 100644 --- a/tex/context/base/type-ini.tex +++ b/tex/context/base/type-ini.tex @@ -76,25 +76,39 @@ {\splitfiletype{#1}% \addtocommalist\splitoffname\typescriptfiles}} -\usetypescriptfile[\f!typeprefix exa] % some examples -\usetypescriptfile[\f!typeprefix syn] % font file synonyms -\usetypescriptfile[\f!typeprefix enc] % files and encodings -%usetypescriptfile[\f!typeprefix dis] % funny name remappings, obsolete -\usetypescriptfile[\f!typeprefix siz] % specific font sizes -\usetypescriptfile[\f!typeprefix map] % pdftex mapping -\usetypescriptfile[\f!typeprefix spe] % special macros -\usetypescriptfile[\f!typeprefix akb] % adobe karl berry names +% \usetypescriptfile[\f!typeprefix exa] % some examples +% \usetypescriptfile[\f!typeprefix syn] % font file synonyms +% \usetypescriptfile[\f!typeprefix enc] % files and encodings +% %usetypescriptfile[\f!typeprefix dis] % funny name remappings, obsolete +% \usetypescriptfile[\f!typeprefix siz] % specific font sizes +% \usetypescriptfile[\f!typeprefix map] % pdftex mapping +% \usetypescriptfile[\f!typeprefix spe] % special macros +% \usetypescriptfile[\f!typeprefix akb] % adobe karl berry names +% +% \beginXETEX \font +% \usetypescriptfile[\f!typeprefix xtx] % xetex definitions +% \endXETEX -\beginXETEX \font +\usetypescriptfile[\f!typeprefix tmf] +\usetypescriptfile[\f!typeprefix siz] - \usetypescriptfile[\f!typeprefix xtx] % xetex definitions +\beginOLDTEX \font + \usetypescriptfile[\f!typeprefix one] + %usetypescriptfile[\f!typeprefix gyr] % to be merged into one + \usetypescriptfile[\f!typeprefix akb] % will go away when gyre is merged +\endOLDTEX +\beginNEWTEX \font + \usetypescriptfile[\f!typeprefix otf] +\endNEWTEX + +\beginXETEX \font + \usetypescriptfile[\f!typeprefix xtx] \endXETEX -\usetypescriptfile[\f!typeprefix loc] % local scripts +\usetypescriptfile[\f!typeprefix loc] -%usetypescriptfile[\f!typeprefix pre] % predefined scripts (compatible) -%usetypescriptfile[typeface] % project scripts +% SO FAR \let\currenttypescripts\empty @@ -148,6 +162,7 @@ % {\startreadingfile % \pushmacro\currenttypefile % \def\currenttypefile{#1}% +% \def\currenttypefile{#1}% % \readfile\currenttypefile\donothing\donothing % \popmacro\currenttypefile % \stopreadingfile} @@ -535,22 +550,26 @@ % we can use \rawgetparameters or \rawgeteparameters +\ifx\mkdodefinetypeface\undefined + \let\mkdodefinetypeface\gobblefivearguments +\fi + \def\dodefinetypeface[#1][#2][#3][#4][#5][#6]% {\dododefinetypeface[#1][#2]% \iffifthargument % sixth is optional % we need to expand since in #6 there can be a \typescripttwo - \expanded{\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!text=,#6]}% \geteparameters + \expanded{\getparameters[\??ts][\s!rscale=\plusone,\s!encoding=\defaultencoding,\s!features=,\s!text=,#6]}% \geteparameters \pushmacro\relativefontsize \pushmacro\typefaceencoding \pushmacro\fontclass \let\relativefontsize\@@tsrscale \let\typefaceencoding\@@tsencoding \setcurrentfontclass{#1}% + \letvalue{\fontclass\s!features}\@@tsfeatures % new per 16/6/2007 \saverelativefontsize{#2}\relativefontsize % fall back \savemathtextstyle\@@tstext % math text style (new per 28/4/2006) \iftracetypescripts\writestatus\m!fonts{define: [#1] [#2] [#3] [#4] / \typefaceencoding}\fi - %\usetypescript[map][\typefaceencoding]% latest versions of pdftex can load after first page - \usetypescript[#3,\t!map][#4][\t!name,\t!default,\typefaceencoding,\t!special]% is default needed + \usetypescript[#3,\t!map][#4][\t!name,\t!default,\typefaceencoding,\t!special]% map is needed for backward cmp \usetypescript[#3][#5][\t!size]% \popmacro\fontclass \popmacro\typefaceencoding diff --git a/tex/context/base/type-map.tex b/tex/context/base/type-map.tex index e333423b7..37eef0ed5 100644 --- a/tex/context/base/type-map.tex +++ b/tex/context/base/type-map.tex @@ -16,62 +16,62 @@ %D This one plays safe: \starttypescript [map] [base] [all] - \loadmapfile[original-base.map] - \loadmapfile[ec-base.map] - \loadmapfile[texnansi-base.map] - \loadmapfile[8r-base.map] - \loadmapfile[qx-base.map] - \loadmapfile[t5-base.map] + \loadmapfile[original-base.map] + \loadmapfile[ec-base.map] + \loadmapfile[texnansi-base.map] + \loadmapfile[8r-base.map] + \loadmapfile[qx-base.map] + \loadmapfile[t5-base.map] \stoptypescript \starttypescript [map] [base,euler,ams] [all] - \loadmapfile[original-ams-base.map] -% \loadmapfile[original-ams-cmr.map] - \loadmapfile[original-ams-euler.map] - \loadmapfile[original-public-lm.map] + \loadmapfile[original-ams-base.map] + %loadmapfile[original-ams-cmr.map] + \loadmapfile[original-ams-euler.map] + \loadmapfile[original-public-lm.map] \stoptypescript % This is the base map file, load it to be sure. \starttypescript [map] [all] [ec,8r,texnansi,qx,t5] - \loadmapfile[original-base.map] - \loadmapfile[\typescriptthree-base.map] + \loadmapfile[original-base.map] + \loadmapfile[\typescriptthree-base.map] \stoptypescript % if we were in full control, we could have % % \starttypescript [berry] [ec] -% \loadmapfile[ec-base.map] +% \loadmapfile[ec-base.map] % \stoptypescript % cmr and related \starttypescript [map] [cmr,lm,lmr] - \loadmapfile[original-public-lm.map] - \loadmapfile[original-ams-base.map] - \loadmapfile[original-ams-euler.map] + \loadmapfile[original-public-lm.map] + \loadmapfile[original-ams-base.map] + \loadmapfile[original-ams-euler.map] \stoptypescript % cyrillic \starttypescript [map] [computer-modern] [t2a,t2b,t2c,x2] - \loadmapfile[subset-cmsuper-\typescriptthree.map] - \loadmapfile[cm-super-\typescriptthree.map] + \loadmapfile[subset-cmsuper-\typescriptthree.map] + \loadmapfile[cm-super-\typescriptthree.map] \stoptypescript % latin modern (watch the unfortunate \quote {lm-encoding} order % in the name; for the moment we ship copies of the map files. \starttypescript [map] [modern,modern-vari,modern-cond,computer-modern,latin-modern,latin-modern-vari,latin-modern-cond,] [ec,texnansi,qx,t5] - % this was what we had at the start and what fits best into our naming scheme - % well, all those changes in lm gave too many user problem reports so i revert to: - % \loadmapfile[\typescriptthree-public-lm.map] - % this one also fits into the naming scheme but has been dropped by the distributers - % \loadmapfile[\typescriptthree-lm.map] - % this is what the latest distributions provide - \loadmapfile[lm-\typescriptthree.map] % maybe some day - \loadmapfile[lm-math.map] - \loadmapfile[lm-rm.map] + % this was what we had at the start and what fits best into our naming scheme + % well, all those changes in lm gave too many user problem reports so i revert to: + % \loadmapfile[\typescriptthree-public-lm.map] + % this one also fits into the naming scheme but has been dropped by the distributers + % \loadmapfile[\typescriptthree-lm.map] + % this is what the latest distributions provide + \loadmapfile[lm-\typescriptthree.map] % maybe some day + \loadmapfile[lm-math.map] + \loadmapfile[lm-rm.map] \stoptypescript % \usetypescript [map] [latin-modern-os] [ec] % lm is loaded under ec regime @@ -80,116 +80,116 @@ % \stoptext \starttypescript [map] [latin-modern-os] [ec,texnansi,qx,t5] - \loadmapfile[\typescriptthree-os-public-lm.map] + \loadmapfile[\typescriptthree-os-public-lm.map] \stoptypescript % the next applies to texfont generated metrics \starttypescript [map] [utopia] [ec,texnansi,t5,8r] - \loadmapfile[\typescriptthree-adobe-utopia.map] + \loadmapfile[\typescriptthree-adobe-utopia.map] \stoptypescript \starttypescript [map] [charter] [ec,texnansi,t5,8r] - \loadmapfile[\typescriptthree-bitstrea-charter.map] + \loadmapfile[\typescriptthree-bitstrea-charter.map] \stoptypescript % \starttypescript [map] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,ec,qx,t5,t2a,t2b,t2c,default] -% \loadmapfile[\typescriptthree-antt.map] -% \loadmapfile[rm-antt.map] -% \loadmapfile[mi-antt.map] -% \loadmapfile[sy-antt.map] -% \loadmapfile[ex-antt.map] +% \loadmapfile[\typescriptthree-antt.map] +% \loadmapfile[rm-antt.map] +% \loadmapfile[mi-antt.map] +% \loadmapfile[sy-antt.map] +% \loadmapfile[ex-antt.map] % \stoptypescript \starttypescript [map] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,ec,qx,t5,t2a,t2b,t2c,default] - \loadmapfile[antt-\typescriptthree.map] - \loadmapfile[antt-rm.map] - \loadmapfile[antt-mi.map] - \loadmapfile[antt-sy.map] - \loadmapfile[antt-ex.map] + \loadmapfile[antt-\typescriptthree.map] + \loadmapfile[antt-rm.map] + \loadmapfile[antt-mi.map] + \loadmapfile[antt-sy.map] + \loadmapfile[antt-ex.map] \stoptypescript \starttypescript [map] [antykwa-poltawskiego] [ec,texnansi,qx,t5] - \loadmapfile[\typescriptthree-public-antp.map] + \loadmapfile[\typescriptthree-public-antp.map] \stoptypescript % \starttypescript [map] [iwona,iwona-light,iwona-medium,iwona-heavy] [ec,texnansi,qx,t5] -% \loadmapfile[\typescriptthree-iwona.map] -% \loadmapfile[rm-iwona.map] -% \loadmapfile[mi-iwona.map] -% \loadmapfile[sy-iwona.map] -% \loadmapfile[ex-iwona.map] +% \loadmapfile[\typescriptthree-iwona.map] +% \loadmapfile[rm-iwona.map] +% \loadmapfile[mi-iwona.map] +% \loadmapfile[sy-iwona.map] +% \loadmapfile[ex-iwona.map] % \stoptypescript \starttypescript [map] [iwona,iwona-light,iwona-medium,iwona-heavy] [ec,texnansi,qx,t5] - \loadmapfile[iwona-\typescriptthree.map] - \loadmapfile[iwona-rm.map] - \loadmapfile[iwona-mi.map] - \loadmapfile[iwona-sy.map] - \loadmapfile[iwona-ex.map] + \loadmapfile[iwona-\typescriptthree.map] + \loadmapfile[iwona-rm.map] + \loadmapfile[iwona-mi.map] + \loadmapfile[iwona-sy.map] + \loadmapfile[iwona-ex.map] \stoptypescript % \starttypescript [map] [kurier,kurier-light,kurier-medium,kurier-heavy] [ec,texnansi,qx,t5,default] -% \loadmapfile[\typescriptthree-kurier.map] -% \loadmapfile[rm-kurier.map] -% \loadmapfile[mi-kurier.map] -% \loadmapfile[sy-kurier.map] -% \loadmapfile[ex-kurier.map] +% \loadmapfile[\typescriptthree-kurier.map] +% \loadmapfile[rm-kurier.map] +% \loadmapfile[mi-kurier.map] +% \loadmapfile[sy-kurier.map] +% \loadmapfile[ex-kurier.map] % \stoptypescript \starttypescript [map] [kurier,kurier-light,kurier-medium,kurier-heavy] [ec,texnansi,qx,t5,default] - \loadmapfile[kurier-\typescriptthree.map] - \loadmapfile[kurier-rm.map] - \loadmapfile[kurier-mi.map] - \loadmapfile[kurier-sy.map] - \loadmapfile[kurier-ex.map] + \loadmapfile[kurier-\typescriptthree.map] + \loadmapfile[kurier-rm.map] + \loadmapfile[kurier-mi.map] + \loadmapfile[kurier-sy.map] + \loadmapfile[kurier-ex.map] \stoptypescript \starttypescript [map] [bookman] [ec,texnansi,t5,8r] - \loadmapfile[\typescriptthree-urw-bookman.map] + \loadmapfile[\typescriptthree-urw-bookman.map] \stoptypescript \starttypescript [map] [courier] [ec,texnansi,t5,8r] - \loadmapfile[\typescriptthree-urw-courier.map] + \loadmapfile[\typescriptthree-urw-courier.map] \stoptypescript \starttypescript [map] [helvetica] [ec,texnansi,t5,8r] - \loadmapfile[\typescriptthree-urw-helvetica.map] + \loadmapfile[\typescriptthree-urw-helvetica.map] \stoptypescript \starttypescript [map] [palatino] [ec,texnansi,t5,8r] - \loadmapfile[\typescriptthree-urw-palatino.map] -% \loadmapfile[\typescriptthree-public-pfl.map] + \loadmapfile[\typescriptthree-urw-palatino.map] + %loadmapfile[\typescriptthree-public-pfl.map] \stoptypescript \starttypescript [map] [times] [ec,texnansi,t5,8r] - \loadmapfile[\typescriptthree-urw-times.map] + \loadmapfile[\typescriptthree-urw-times.map] \stoptypescript \starttypescript [map] [chancery] [ec,texnansi,t5,8r] - \loadmapfile[\typescriptthree-urw-zapfchan.map] + \loadmapfile[\typescriptthree-urw-zapfchan.map] \stoptypescript \starttypescript [map] [schoolbook] [ec,texnansi,t5,8r] - \loadmapfile[\typescriptthree-urw-ncntrsbk.map] + \loadmapfile[\typescriptthree-urw-ncntrsbk.map] \stoptypescript % once i can be sure that the map files are in the tree, i will % use those instead of original (too many variants anyway) \starttypescript [map] [palatino] [default,ec,texnansi,t5,8r] - \loadmapfile[original-youngryu-px.map] + \loadmapfile[original-youngryu-px.map] \stoptypescript \starttypescript [map] [times] [default,ec,texnansi,t5,8r] - \loadmapfile[original-youngryu-tx.map] + \loadmapfile[original-youngryu-tx.map] \stoptypescript % to do: maybe original, maybe not \starttypescript [map] [fourier] [ec] - \loadmapfile[fourier.map] - \loadmapfile[fourier-utopia-expert.map] + \loadmapfile[fourier.map] + \loadmapfile[fourier-utopia-expert.map] \stoptypescript \stoptypescriptcollection diff --git a/tex/context/base/type-msw.tex b/tex/context/base/type-msw.tex index 985aa9c17..343e76eab 100644 --- a/tex/context/base/type-msw.tex +++ b/tex/context/base/type-msw.tex @@ -31,57 +31,37 @@ % verdana \starttypescript [sans] [verdana] [name] - - \setups[font:fallback:sans] - - \definefontsynonym [Sans] [Verdana] - \definefontsynonym [SansBold] [Verdana-Bold] - \definefontsynonym [SansItalic] [Verdana-Italic] - \definefontsynonym [SansBoldItalic] [Verdana-BoldItalic] - + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Verdana] + \definefontsynonym [SansBold] [Verdana-Bold] + \definefontsynonym [SansItalic] [Verdana-Italic] + \definefontsynonym [SansBoldItalic] [Verdana-BoldItalic] \stoptypescript \starttypescript [sans] [verdana] [texnansi] - - \definefontsynonym [Verdana] [\typescriptthree-verdana] [encoding=\typescriptthree] - \definefontsynonym [Verdana-Bold] [\typescriptthree-verdanab] [encoding=\typescriptthree] - \definefontsynonym [Verdana-Italic] [\typescriptthree-verdanai] [encoding=\typescriptthree] - \definefontsynonym [Verdana-BoldItalic] [\typescriptthree-verdanaz] [encoding=\typescriptthree] - -\stoptypescript - -\starttypescript [map] [verdana] [texnansi] - - \loadmapfile[texnansi-microsoft-verdana.map] - + \definefontsynonym [Verdana] [\typescriptthree-verdana] [encoding=\typescriptthree] + \definefontsynonym [Verdana-Bold] [\typescriptthree-verdanab] [encoding=\typescriptthree] + \definefontsynonym [Verdana-Italic] [\typescriptthree-verdanai] [encoding=\typescriptthree] + \definefontsynonym [Verdana-BoldItalic] [\typescriptthree-verdanaz] [encoding=\typescriptthree] + \loadmapfile[texnansi-microsoft-verdana.map] \stoptypescript % arial \starttypescript [sans] [arial] [name] - \setups[font:fallback:sans] - \definefontsynonym [Sans] [ArialMT] \definefontsynonym [SansBold] [Arial-BoldMT] \definefontsynonym [SansItalic] [Arial-ItalicMT] \definefontsynonym [SansBoldItalic] [Arial-BoldItalicMT] - \stoptypescript \starttypescript [sans] [arial] [texnansi] - - \definefontsynonym [ArialMT] [\typescriptthree-arial] [encoding=\typescriptthree] - \definefontsynonym [Arial-BoldMT] [\typescriptthree-arialbd] [encoding=\typescriptthree] - \definefontsynonym [Arial-ItalicMT] [\typescriptthree-ariali] [encoding=\typescriptthree] - \definefontsynonym [Arial-BoldItalicMT] [\typescriptthree-arialbi] [encoding=\typescriptthree] - -\stoptypescript - -\starttypescript [map] [arial] [texnansi] - - \loadmapfile[texnansi-microsoft-arial.map] - + \definefontsynonym [ArialMT] [\typescriptthree-arial] [encoding=\typescriptthree] + \definefontsynonym [Arial-BoldMT] [\typescriptthree-arialbd] [encoding=\typescriptthree] + \definefontsynonym [Arial-ItalicMT] [\typescriptthree-ariali] [encoding=\typescriptthree] + \definefontsynonym [Arial-BoldItalicMT] [\typescriptthree-arialbi] [encoding=\typescriptthree] + \loadmapfile[texnansi-microsoft-arial.map] \stoptypescript \stoptypescriptcollection diff --git a/tex/context/base/type-one.tex b/tex/context/base/type-one.tex new file mode 100644 index 000000000..09ffc748b --- /dev/null +++ b/tex/context/base/type-one.tex @@ -0,0 +1,1154 @@ +%D \module +%D [ file=type-one, +%D version=2007.07.30, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Type One Definitions, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D This file merges the traditional enc, syn and map files into one. If +%D you think that it looks messy you're right. It shows some history of +%D \TEX\ fonts and the development towards latin modern. + +% texfont --ven=public --col=antt --enc=ec --sou=auto +% texfont --ven=public --col=antp --enc=ec --sou=auto +% texfont --ven=urw --col=palatino --enc=ec --sou=auto +% texfont --ven-lucas --col=sun --enc=ec --sou=. + +% \usetypescript [all] [modern] [texnansi] +% \setupbodyfont[reset] \setupbodyfont[cmr] +% \starttext \showfont[Serif] \stoptext + +\starttypescriptcollection[examples] + +\starttypescript [fallback] [texnansi,ec,qx,t5,default] + \definetypeface [] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [modern] [texnansi,ec,qx,t5,default] + \definetypeface [modern] [rm] [serif] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [modern] [ss] [sans] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [modern] [tt] [mono] [modern] [computer-modern] [encoding=\typescripttwo] + \definetypeface [modern] [mm] [math] [modern] [computer-modern] [encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [modern-base] [texnansi,ec,qx,t5,default] + \definetypeface [modern] [rm] [serif] [modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [ss] [sans] [modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [tt] [mono] [modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [mm] [math] [modern] [default] [encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [modern-base] [t2a,t2b,t2c,x2] + \definetypeface [modern] [rm] [serif] [computer-modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [ss] [sans] [computer-modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [tt] [mono] [computer-modern] [default] [encoding=\typescripttwo] + \definetypeface [modern] [mm] [math] [computer-modern] [default] [encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [postscript] [texnansi,ec,qx,t5,uc,8r] + \definetypeface [postscript] [rm] [serif] [times] [default] [encoding=\typescripttwo] + \definetypeface [postscript] [ss] [sans] [helvetica] [default] [rscale=.9,encoding=\typescripttwo] + \definetypeface [postscript] [tt] [mono] [courier] [default] [rscale=1.1,encoding=\typescripttwo] + \definetypeface [postscript] [mm] [math] [times] [default] + \usemathcollection[default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [times] [texnansi,ec,qx,8r,t5,uc] + \definetypeface [times] [rm] [serif] [times] [default] [encoding=\typescripttwo] + \definetypeface [times] [ss] [sans] [helvetica] [default] [encoding=\typescripttwo,rscale=0.9] + \definetypeface [times] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.05] + \definetypeface [times] [mm] [math] [times] [default] [encoding=\typescripttwo] + \usemathcollection[default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [palatino] [texnansi,ec,qx,8r,t5,uc] + \definetypeface [palatino] [rm] [serif] [palatino] [default] [encoding=\typescripttwo] + \definetypeface [palatino] [tt] [mono] [modern] [default] [encoding=\typescripttwo,rscale=1.075] + \definetypeface [palatino] [mm] [math] [palatino] [default] [encoding=default] + \usemathcollection[default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [fourier] [ec] + \definetypeface [fourier] [rm] [serif] [fourier] [default] [encoding=ec] + \definetypeface [fourier] [mm] [math] [fourier] [default] [encoding=default] + \definetypeface [fourier] [tt] [mono] [modern] [default] [encoding=ec,rscale=1.07] + \usemathcollection[fou] + \quittypescriptscanning +\stoptypescript + +% handy + +\starttypescript [serif] [simple] [name] % bad, will be changed but in sycn with manuals that use it + \definefontsynonym [Simple] [cmvtt10] + \setupfontsynonym [Simple] [handling=pure] +\stoptypescript + +\starttypescript [modernvariable] [texnansi,ec,qx,8r,t5] + \definetypeface [modernvariable] [rm] [serif] [simple] [default] [encoding=\typescripttwo] + \definetypeface [modernvariable] [ss] [sans] [modern] [default] [encoding=\typescripttwo] + \definetypeface [modernvariable] [tt] [mono] [modern] [default] [encoding=\typescripttwo] + \definetypeface [modernvariable] [mm] [math] [modern] [default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [optima] [texnansi,ec,qx] + \definetypeface[optima][ss][sans] [optima-nova][default][encoding=\typescripttwo] + \definetypeface[optima][rm][serif][palatino] [default][encoding=\typescripttwo] + \definetypeface[optima][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1] + \definetypeface[optima][mm][math] [palatino] [default][encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [antykwa-torunska] [texnansi,ec,8r,uc,t2a] + \definetypeface[antykwa][rm][serif][antykwa-torunska] [default][encoding=\typescripttwo] + \definetypeface[antykwa][ss][sans] [modern] [default][encoding=\typescripttwo,rscale=1.05] + \definetypeface[antykwa][tt][mono] [modern] [default][encoding=\typescripttwo,rscale=1.1] + \definetypeface[antykwa][mm][math] [antykwa-torunska] [default][encoding=\typescripttwo] + \quittypescriptscanning +\stoptypescript + +\starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium] [texnansi,ec,8r,uc,t2a] + \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default][encoding=\typescripttwo] + \definetypeface[\typescriptone][rm][serif][modern] [default][encoding=\typescripttwo] + \definetypeface[\typescriptone][tt][mono] [modern] [default][encoding=\typescripttwo] + \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][encoding=\typescripttwo,text=ss] + \quittypescriptscanning +\stoptypescript + +\stoptypescriptcollection + +\starttypescriptcollection[typeone] + +\starttypescript [map] [all] + \loadmapfile[original-base.map] + \loadmapfile[original-ams-base.map] +\stoptypescript + +\starttypescript[all][modern,latin-modern][all] + + % fallbacks, no math in latin modern + + \definefontsynonym[lmdunh10][cmdunh10] + \definefontsynonym[lmff10] [cmff10] + \definefontsynonym[lmfi10] [cmfi10] + \definefontsynonym[lmfib8] [cmfib8] + \definefontsynonym[lmtex10] [cmtex10] + \definefontsynonym[lmtex8] [cmtex8] + \definefontsynonym[lmtex9] [cmtex9] + + \loadmapfile[original-public-lm.map] +\stoptypescript + +\starttypescript [serif] [modern,latin-modern] [texnansi,ec,qx,t5] + \definefontsynonym [LMRoman10-DemiOblique] [\typescriptthree-lmbo10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-Bold] [\typescriptthree-lmbx10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman12-Bold] [\typescriptthree-lmbx12] [encoding=\typescriptthree] + \definefontsynonym [LMRoman5-Bold] [\typescriptthree-lmbx5] [encoding=\typescriptthree] + \definefontsynonym [LMRoman6-Bold] [\typescriptthree-lmbx6] [encoding=\typescriptthree] + \definefontsynonym [LMRoman7-Bold] [\typescriptthree-lmbx7] [encoding=\typescriptthree] + \definefontsynonym [LMRoman8-Bold] [\typescriptthree-lmbx8] [encoding=\typescriptthree] + \definefontsynonym [LMRoman9-Bold] [\typescriptthree-lmbx9] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-BoldItalic] [\typescriptthree-lmbxi10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-BoldOblique] [\typescriptthree-lmbxo10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-CapsRegular] [\typescriptthree-lmcsc10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-CapsOblique] [\typescriptthree-lmcsco10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-Regular] [\typescriptthree-lmr10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman12-Regular] [\typescriptthree-lmr12] [encoding=\typescriptthree] + \definefontsynonym [LMRoman17-Regular] [\typescriptthree-lmr17] [encoding=\typescriptthree] + \definefontsynonym [LMRoman5-Regular] [\typescriptthree-lmr5] [encoding=\typescriptthree] + \definefontsynonym [LMRoman6-Regular] [\typescriptthree-lmr6] [encoding=\typescriptthree] + \definefontsynonym [LMRoman7-Regular] [\typescriptthree-lmr7] [encoding=\typescriptthree] + \definefontsynonym [LMRoman8-Regular] [\typescriptthree-lmr8] [encoding=\typescriptthree] + \definefontsynonym [LMRoman9-Regular] [\typescriptthree-lmr9] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-Italic] [\typescriptthree-lmri10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman12-Italic] [\typescriptthree-lmri12] [encoding=\typescriptthree] + \definefontsynonym [LMRoman7-Italic] [\typescriptthree-lmri7] [encoding=\typescriptthree] + \definefontsynonym [LMRoman8-Italic] [\typescriptthree-lmri8] [encoding=\typescriptthree] + \definefontsynonym [LMRoman9-Italic] [\typescriptthree-lmri9] [encoding=\typescriptthree] + \definefontsynonym [LMRoman10-Oblique] [\typescriptthree-lmro10] [encoding=\typescriptthree] + \definefontsynonym [LMRoman12-Oblique] [\typescriptthree-lmro12] [encoding=\typescriptthree] + \definefontsynonym [LMRoman17-Oblique] [\typescriptthree-lmro17] [encoding=\typescriptthree] + \definefontsynonym [LMRoman8-Oblique] [\typescriptthree-lmro8] [encoding=\typescriptthree] + \definefontsynonym [LMRoman9-Oblique] [\typescriptthree-lmro9] [encoding=\typescriptthree] + + \loadmapfile[lm-\typescriptthree.map] +\stoptypescript + +\starttypescript [sans] [modern,latin-modern] [texnansi,ec,qx,t5] + \definefontsynonym [LMSans10-Regular] [\typescriptthree-lmss10] [encoding=\typescriptthree] + \definefontsynonym [LMSans12-Regular] [\typescriptthree-lmss12] [encoding=\typescriptthree] + \definefontsynonym [LMSans17-Regular] [\typescriptthree-lmss17] [encoding=\typescriptthree] + \definefontsynonym [LMSans8-Regular] [\typescriptthree-lmss8] [encoding=\typescriptthree] + \definefontsynonym [LMSans9-Regular] [\typescriptthree-lmss9] [encoding=\typescriptthree] + \definefontsynonym [LMSans10-BoldOblique] [\typescriptthree-lmssbo10] [encoding=\typescriptthree] + \definefontsynonym [LMSans10-Bold] [\typescriptthree-lmssbx10] [encoding=\typescriptthree] + \definefontsynonym [LMSans10-DemiCondensed] [\typescriptthree-lmssdc10] [encoding=\typescriptthree] + \definefontsynonym [LMSans10-DemiCondensedOblique] [\typescriptthree-lmssdo10] [encoding=\typescriptthree] + \definefontsynonym [LMSans10-Oblique] [\typescriptthree-lmsso10] [encoding=\typescriptthree] + \definefontsynonym [LMSans12-Oblique] [\typescriptthree-lmsso12] [encoding=\typescriptthree] + \definefontsynonym [LMSans17-Oblique] [\typescriptthree-lmsso17] [encoding=\typescriptthree] + \definefontsynonym [LMSans8-Oblique] [\typescriptthree-lmsso8] [encoding=\typescriptthree] + \definefontsynonym [LMSans9-Oblique] [\typescriptthree-lmsso9] [encoding=\typescriptthree] + \definefontsynonym [LMSansQuotation8-Regular] [\typescriptthree-lmssq8] [encoding=\typescriptthree] + \definefontsynonym [LMSansQuotation8-BoldOblique] [\typescriptthree-lmssqbo8] [encoding=\typescriptthree] + \definefontsynonym [LMSansQuotation8-Bold] [\typescriptthree-lmssqbx8] [encoding=\typescriptthree] + \definefontsynonym [LMSansQuotation8-Oblique] [\typescriptthree-lmssqo8] [encoding=\typescriptthree] + + \loadmapfile[lm-\typescriptthree.map] +\stoptypescript + +\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond] [texnansi,ec,qx,t5] + \definefontsynonym [LMTypewriter10-CapsRegular] [\typescriptthree-lmtcsc10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-CapsOblique] [\typescriptthree-lmtcso10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-Light] [\typescriptthree-lmtl10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-LightOblique] [\typescriptthree-lmtlo10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-LightCondensed] [\typescriptthree-lmtlc10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-LightCondensedOblique] [\typescriptthree-lmtlco10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-Dark] [\typescriptthree-lmtk10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-DarkOblique] [\typescriptthree-lmtko10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-Regular] [\typescriptthree-lmtt10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter12-Regular] [\typescriptthree-lmtt12] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter8-Regular] [\typescriptthree-lmtt8] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter9-Regular] [\typescriptthree-lmtt9] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-Italic] [\typescriptthree-lmtti10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriter10-Oblique] [\typescriptthree-lmtto10] [encoding=\typescriptthree] + + \definefontsynonym [LMTypewriterVarWd10-Regular] [\typescriptthree-lmvtt10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriterVarWd10-Oblique] [\typescriptthree-lmvtto10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriterVarWd10-Light] [\typescriptthree-lmvtl10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriterVarWd10-LightOblique] [\typescriptthree-lmvtlo10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriterVarWd10-Dark] [\typescriptthree-lmvtk10] [encoding=\typescriptthree] + \definefontsynonym [LMTypewriterVarWd10-DarkOblique] [\typescriptthree-lmvtko10] [encoding=\typescriptthree] + + \loadmapfile[lm-\typescriptthree.map] +\stoptypescript + +\starttypescript [math] [modern,latin-modern] + \definefontsynonym [LMMathSymbols5-BoldItalic] [lmbsy5] + \definefontsynonym [LMMathSymbols7-BoldItalic] [lmbsy7] + \definefontsynonym [LMMathSymbols10-BoldItalic][lmbsy10] + \definefontsynonym [LMMathSymbols5-Italic] [lmsy5] + \definefontsynonym [LMMathSymbols6-Italic] [lmsy6] + \definefontsynonym [LMMathSymbols7-Italic] [lmsy7] + \definefontsynonym [LMMathSymbols8-Italic] [lmsy8] + \definefontsynonym [LMMathSymbols9-Italic] [lmsy9] + \definefontsynonym [LMMathSymbols10-Italic] [lmsy10] + \definefontsynonym [LMMathExtension10-Regular] [lmex10] + \definefontsynonym [LMMathItalic5-Italic] [lmmi5] + \definefontsynonym [LMMathItalic6-Italic] [lmmi6] + \definefontsynonym [LMMathItalic7-Italic] [lmmi7] + \definefontsynonym [LMMathItalic8-Italic] [lmmi8] + \definefontsynonym [LMMathItalic9-Italic] [lmmi9] + \definefontsynonym [LMMathItalic10-Italic] [lmmi10] + \definefontsynonym [LMMathItalic12-Italic] [lmmi12] + \definefontsynonym [LMMathItalic5-BoldItalic] [lmmib5] + \definefontsynonym [LMMathItalic7-BoldItalic] [lmmib7] + \definefontsynonym [LMMathItalic10-BoldItalic] [lmmib10] + + \loadmapfile[lm-math.map] + \loadmapfile[lm-rm.map] +\stoptypescript + +%D {\em Comments by Victor Figurnov:} the wcmb10, wcmbx10, +%D \unknown\ fonts below are taken from the Paradissa +%D collection by Basil Malyshev. These fonts don't conform t2a +%D encoding but are in MS Windows Cyrillic codepage 1251 +%D encoding. These fonts contain only 33 russian letters in +%D upper and lower case, the number sign, and guillemots. But +%D even among these characters only the basic 32 russian +%D letters (in upper and lower case) will be typeset correctly +%D with this definition. The letters cyrillicYO and +%D cyrillicyo, as well as number sign (textnumero) and +%D guillemots won't be typeset properly, because these symbols +%D have different positions in t2a and MS CP1251 encodings. +%D +%D I think that the russian lh fonts and|/|or cm-super provide +%D better alternatives (type1). Therefore, the names below +%D match those of cm-super (\type {0NNN} instead of \type +%D {NNN}, i.e.\ four digit numbers). + +\starttypescript [serif] [computer-modern] [cyr] + \definefontsynonym [cmb10] [wcmb10] [encoding=t2a] + \definefontsynonym [cmbsy10] [wcmbsy10] [encoding=t2a] + \definefontsynonym [cmbx10] [wcmbx10] [encoding=t2a] + \definefontsynonym [cmbx12] [wcmbx12] [encoding=t2a] + \definefontsynonym [cmbx5] [wcmbx5] [encoding=t2a] + \definefontsynonym [cmbx6] [wcmbx6] [encoding=t2a] + \definefontsynonym [cmbx7] [wcmbx7] [encoding=t2a] + \definefontsynonym [cmbx8] [wcmbx8] [encoding=t2a] + \definefontsynonym [cmbx9] [wcmbx9] [encoding=t2a] + \definefontsynonym [cmbxsl10] [wcmbxsl10] [encoding=t2a] + \definefontsynonym [cmbxti10] [wcmbxti10] [encoding=t2a] + \definefontsynonym [cmcsc10] [wcmcsc10] [encoding=t2a] + %definefontsynonym [cmdunh10] [wcmdunh10] [encoding=t2a] + \definefontsynonym [cminch] [wcminch] [encoding=t2a] + \definefontsynonym [cmr10] [wcmr10] [encoding=t2a] + \definefontsynonym [cmr12] [wcmr12] [encoding=t2a] + \definefontsynonym [cmr17] [wcmr17] [encoding=t2a] + \definefontsynonym [cmr5] [wcmr5] [encoding=t2a] + \definefontsynonym [cmr6] [wcmr6] [encoding=t2a] + \definefontsynonym [cmr7] [wcmr7] [encoding=t2a] + \definefontsynonym [cmr8] [wcmr8] [encoding=t2a] + \definefontsynonym [cmr9] [wcmr9] [encoding=t2a] + \definefontsynonym [cmsl10] [wcmsl10] [encoding=t2a] + \definefontsynonym [cmsl12] [wcmsl12] [encoding=t2a] + \definefontsynonym [cmsl8] [wcmsl8] [encoding=t2a] + \definefontsynonym [cmsl9] [wcmsl9] [encoding=t2a] + \definefontsynonym [cmti10] [wcmti10] [encoding=t2a] + \definefontsynonym [cmti12] [wcmti12] [encoding=t2a] + \definefontsynonym [cmti7] [wcmti7] [encoding=t2a] + \definefontsynonym [cmti8] [wcmti8] [encoding=t2a] + \definefontsynonym [cmti9] [wcmti9] [encoding=t2a] + \definefontsynonym [cmu10] [wcmu10] [encoding=t2a] +\stoptypescript + +\starttypescript [sans] [computer-modern] [cyr] + \definefontsynonym [cmss10] [wcmss10] [encoding=t2a] + \definefontsynonym [cmss12] [wcmss12] [encoding=t2a] + \definefontsynonym [cmss17] [wcmss17] [encoding=t2a] + \definefontsynonym [cmss8] [wcmss8] [encoding=t2a] + \definefontsynonym [cmss9] [wcmss9] [encoding=t2a] + %definefontsynonym [cmssbi10] [wcmssbi10] [encoding=t2a] + \definefontsynonym [cmssbx10] [wcmssbx10] [encoding=t2a] + \definefontsynonym [cmssdc10] [wcmssdc10] [encoding=t2a] + \definefontsynonym [cmssi10] [wcmssi10] [encoding=t2a] + \definefontsynonym [cmssi12] [wcmssi12] [encoding=t2a] + \definefontsynonym [cmssi17] [wcmssi17] [encoding=t2a] + \definefontsynonym [cmssi8] [wcmssi8] [encoding=t2a] + \definefontsynonym [cmssi9] [wcmssi9] [encoding=t2a] + \definefontsynonym [cmssq8] [wcmssq8] [encoding=t2a] + \definefontsynonym [cmssqi8] [wcmssqi8] [encoding=t2a] +\stoptypescript + +\starttypescript [mono] [computer-modern] [cyr] + \definefontsynonym [cmitt10] [wcmitt10] [encoding=t2a] + \definefontsynonym [cmsltt10] [wcmsltt10] [encoding=t2a] + \definefontsynonym [cmtt10] [wcmtt10] [encoding=t2a] + \definefontsynonym [cmtt12] [wcmtt12] [encoding=t2a] + \definefontsynonym [cmtt8] [wcmtt8] [encoding=t2a] + \definefontsynonym [cmtt9] [wcmtt9] [encoding=t2a] + %definefontsynonym [cmvtt10] [wcmvtt10] [encoding=t2a] +\stoptypescript + +\definetypescriptprefix [c:t2a] [la] +\definetypescriptprefix [c:t2b] [lb] +\definetypescriptprefix [c:t2c] [lc] +\definetypescriptprefix [c:x2] [rx] + +\starttypescript [all] [computer-modern] [t2a,t2b,t2c,x2] + \loadmapfile[subset-cmsuper-\typescriptthree.map] + \loadmapfile[subset-cmsuper-\typescriptthree.map] + \loadmapfile[cm-super-\typescriptthree.map] +\stoptypescript + +\starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [cmb10] [\typescriptprefix{c:\typescriptthree}rb1000] [encoding=\typescriptthree] + \definefontsynonym [cmbx10] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree] + \definefontsynonym [cmbx12] [\typescriptprefix{c:\typescriptthree}bx1200] [encoding=\typescriptthree] + \definefontsynonym [cmbx5] [\typescriptprefix{c:\typescriptthree}bx0500] [encoding=\typescriptthree] + \definefontsynonym [cmbx6] [\typescriptprefix{c:\typescriptthree}bx0600] [encoding=\typescriptthree] + \definefontsynonym [cmbx7] [\typescriptprefix{c:\typescriptthree}bx0700] [encoding=\typescriptthree] + \definefontsynonym [cmbx8] [\typescriptprefix{c:\typescriptthree}bx0800] [encoding=\typescriptthree] + \definefontsynonym [cmbx9] [\typescriptprefix{c:\typescriptthree}bx0900] [encoding=\typescriptthree] + \definefontsynonym [cmbxsl10] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree] + \definefontsynonym [cmbxti10] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree] + \definefontsynonym [cmcsc10] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree] + \definefontsynonym [cmdunh10] [\typescriptprefix{c:\typescriptthree}dh1000] [encoding=\typescriptthree] + \definefontsynonym [cmff10] [\typescriptprefix{c:\typescriptthree}ff1000] [encoding=\typescriptthree] + \definefontsynonym [cmfi10] [\typescriptprefix{c:\typescriptthree}fi1000] [encoding=\typescriptthree] + \definefontsynonym [cmfib8] [\typescriptprefix{c:\typescriptthree}fb0800] [encoding=\typescriptthree] + %\definefontsynonym [cminch] [\typescriptprefix{c:\typescriptthree}inch00] [encoding=\typescriptthree] + \definefontsynonym [cmr10] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree] + \definefontsynonym [cmr12] [\typescriptprefix{c:\typescriptthree}rm1200] [encoding=\typescriptthree] + \definefontsynonym [cmr17] [\typescriptprefix{c:\typescriptthree}rm1700] [encoding=\typescriptthree] + \definefontsynonym [cmr5] [\typescriptprefix{c:\typescriptthree}rm0500] [encoding=\typescriptthree] + \definefontsynonym [cmr6] [\typescriptprefix{c:\typescriptthree}rm0600] [encoding=\typescriptthree] + \definefontsynonym [cmr7] [\typescriptprefix{c:\typescriptthree}rm0700] [encoding=\typescriptthree] + \definefontsynonym [cmr8] [\typescriptprefix{c:\typescriptthree}rm0800] [encoding=\typescriptthree] + \definefontsynonym [cmr9] [\typescriptprefix{c:\typescriptthree}rm0900] [encoding=\typescriptthree] + \definefontsynonym [cmsl10] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree] + \definefontsynonym [cmsl12] [\typescriptprefix{c:\typescriptthree}sl1200] [encoding=\typescriptthree] + \definefontsynonym [cmsl8] [\typescriptprefix{c:\typescriptthree}sl0800] [encoding=\typescriptthree] + \definefontsynonym [cmsl9] [\typescriptprefix{c:\typescriptthree}sl0900] [encoding=\typescriptthree] + \definefontsynonym [cmtcsc10] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree] + \definefontsynonym [cmti10] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree] + \definefontsynonym [cmti12] [\typescriptprefix{c:\typescriptthree}ti1200] [encoding=\typescriptthree] + \definefontsynonym [cmti7] [\typescriptprefix{c:\typescriptthree}ti0700] [encoding=\typescriptthree] + \definefontsynonym [cmti8] [\typescriptprefix{c:\typescriptthree}ti0800] [encoding=\typescriptthree] + \definefontsynonym [cmti9] [\typescriptprefix{c:\typescriptthree}ti0900] [encoding=\typescriptthree] + \definefontsynonym [cmu10] [\typescriptprefix{c:\typescriptthree}ui1000] [encoding=\typescriptthree] +\stoptypescript + +\starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [cmss10] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree] + \definefontsynonym [cmss12] [\typescriptprefix{c:\typescriptthree}ss1200] [encoding=\typescriptthree] + \definefontsynonym [cmss17] [\typescriptprefix{c:\typescriptthree}ss1700] [encoding=\typescriptthree] + \definefontsynonym [cmss8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree] + \definefontsynonym [cmss9] [\typescriptprefix{c:\typescriptthree}ss0900] [encoding=\typescriptthree] + \definefontsynonym [cmssbx10] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree] + %\definefontsynonym [cmssdc10] [\typescriptprefix{c:\typescriptthree}ssdc1000] [encoding=\typescriptthree] + \definefontsynonym [cmssi10] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] + \definefontsynonym [cmssi12] [\typescriptprefix{c:\typescriptthree}si1200] [encoding=\typescriptthree] + \definefontsynonym [cmssi17] [\typescriptprefix{c:\typescriptthree}si1700] [encoding=\typescriptthree] + \definefontsynonym [cmssi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree] + \definefontsynonym [cmssi9] [\typescriptprefix{c:\typescriptthree}si0900] [encoding=\typescriptthree] + \definefontsynonym [cmssq8] [\typescriptprefix{c:\typescriptthree}ss0800] [encoding=\typescriptthree] + \definefontsynonym [cmssqi8] [\typescriptprefix{c:\typescriptthree}si0800] [encoding=\typescriptthree] +\stoptypescript + +\starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [cmitt10] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree] + \definefontsynonym [cmsltt10] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree] + \definefontsynonym [cmtt10] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree] + \definefontsynonym [cmtt12] [\typescriptprefix{c:\typescriptthree}tt1200] [encoding=\typescriptthree] + \definefontsynonym [cmtt8] [\typescriptprefix{c:\typescriptthree}tt0800] [encoding=\typescriptthree] + \definefontsynonym [cmtt9] [\typescriptprefix{c:\typescriptthree}tt0900] [encoding=\typescriptthree] + \definefontsynonym [cmvtt10] [\typescriptprefix{c:\typescriptthree}vt1000] [encoding=\typescriptthree] +\stoptypescript + +\starttypescript [serif] [computer-modern] [lcy] + \definefontsynonym [cmb10] [lhb10] [encoding=lcy] + \definefontsynonym [cmbx10] [lhbx10] [encoding=lcy] + \definefontsynonym [cmbx12] [lhbx12] [encoding=lcy] + \definefontsynonym [cmbx5] [lhbx5] [encoding=lcy] + \definefontsynonym [cmbx6] [lhbx6] [encoding=lcy] + \definefontsynonym [cmbx7] [lhbx7] [encoding=lcy] + \definefontsynonym [cmbx8] [lhbx8] [encoding=lcy] + \definefontsynonym [cmbx9] [lhbx9] [encoding=lcy] + \definefontsynonym [cmbxsl10] [lhbxsl10] [encoding=lcy] + \definefontsynonym [cmbxti10] [lhbxti10] [encoding=lcy] + \definefontsynonym [cmcsc10] [lhcsc10] [encoding=lcy] + \definefontsynonym [cmdunh10] [lhdunh10] [encoding=lcy] + \definefontsynonym [cmff10] [lhff10] [encoding=lcy] + \definefontsynonym [cmfi10] [lhfi10] [encoding=lcy] + \definefontsynonym [cmfib8] [lhfib8] [encoding=lcy] + \definefontsynonym [cminch] [lhinch] [encoding=lcy] + \definefontsynonym [cmr10] [lhr10] [encoding=lcy] + \definefontsynonym [cmr12] [lhr12] [encoding=lcy] + \definefontsynonym [cmr17] [lhr17] [encoding=lcy] + \definefontsynonym [cmr5] [lhr5] [encoding=lcy] + \definefontsynonym [cmr6] [lhr6] [encoding=lcy] + \definefontsynonym [cmr7] [lhr7] [encoding=lcy] + \definefontsynonym [cmr8] [lhr8] [encoding=lcy] + \definefontsynonym [cmr9] [lhr9] [encoding=lcy] + \definefontsynonym [cmsl10] [lhsl10] [encoding=lcy] + \definefontsynonym [cmsl12] [lhsl12] [encoding=lcy] + \definefontsynonym [cmsl8] [lhsl8] [encoding=lcy] + \definefontsynonym [cmsl9] [lhsl9] [encoding=lcy] + \definefontsynonym [cmtcsc10] [lhtcsc10] [encoding=lcy] + \definefontsynonym [cmtex10] [lhtex10] [encoding=lcy] + \definefontsynonym [cmtex8] [lhtex8] [encoding=lcy] + \definefontsynonym [cmtex9] [lhtex9] [encoding=lcy] + \definefontsynonym [cmti10] [lhti10] [encoding=lcy] + \definefontsynonym [cmti12] [lhti12] [encoding=lcy] + \definefontsynonym [cmti7] [lhti7] [encoding=lcy] + \definefontsynonym [cmti8] [lhti8] [encoding=lcy] + \definefontsynonym [cmti9] [lhti9] [encoding=lcy] + \definefontsynonym [cmu10] [lhu10] [encoding=lcy] +\stoptypescript + +\starttypescript [sans] [computer-modern] [lcy] + \definefontsynonym [cmss10] [lhss10] [encoding=lcy] + \definefontsynonym [cmss12] [lhss12] [encoding=lcy] + \definefontsynonym [cmss17] [lhss17] [encoding=lcy] + \definefontsynonym [cmss8] [lhss8] [encoding=lcy] + \definefontsynonym [cmss9] [lhss9] [encoding=lcy] + \definefontsynonym [cmssbi10] [lhssbi10] [encoding=lcy] + \definefontsynonym [cmssbx10] [lhssbx10] [encoding=lcy] + \definefontsynonym [cmssdc10] [lhssdc10] [encoding=lcy] + \definefontsynonym [cmssi10] [lhssi10] [encoding=lcy] + \definefontsynonym [cmssi12] [lhssi12] [encoding=lcy] + \definefontsynonym [cmssi17] [lhssi17] [encoding=lcy] + \definefontsynonym [cmssi8] [lhssi8] [encoding=lcy] + \definefontsynonym [cmssi9] [lhssi9] [encoding=lcy] + \definefontsynonym [cmssq8] [lhssq8] [encoding=lcy] + \definefontsynonym [cmssqi8] [lhssqi8] [encoding=lcy] +\stoptypescript + +\starttypescript [mono] [computer-modern] [lcy] + \definefontsynonym [cmitt10] [lhitt10] [encoding=lcy] + \definefontsynonym [cmsltt10] [lhsltt10] [encoding=lcy] + \definefontsynonym [cmtt10] [lhtt10] [encoding=lcy] + \definefontsynonym [cmtt12] [lhtt12] [encoding=lcy] + \definefontsynonym [cmtt8] [lhtt8] [encoding=lcy] + \definefontsynonym [cmtt9] [lhtt9] [encoding=lcy] + \definefontsynonym [cmvtt10] [lhvtt10] [encoding=lcy] +\stoptypescript + +% + +\starttypescript [math] [modern,computer-modern,latin-modern] % [default] + % watch the space, it prevents remapping + \definefontsynonym [ComputerModernMath-Roman] [rm-lmr10]% [lmr10 ] + \definefontsynonym [ComputerModernMath-Extension] [lmex10] + \definefontsynonym [ComputerModernMath-Italic] [lmmi10] + \definefontsynonym [ComputerModernMath-Symbol] [lmsy10] +\stoptypescript + +\starttypescript [boldmath,bfmath] [modern,computer-modern,latin-modern] % [default] + % watch the space, it prevents remapping + \definefontsynonym [ComputerModernMath-Roman-Bold] [rm-lmb10] % [lmb10 ] + \definefontsynonym [ComputerModernMath-Extension] [lmex10] + \definefontsynonym [ComputerModernMath-Italic-Bold] [lmmib10] + \definefontsynonym [ComputerModernMath-Symbol-Bold] [lmbsy10] +\stoptypescript + +% Till we have cyrilic in lm: + +% \usetypescript[modern-base][t2a] +% \setupbodyfont[modern,10pt] + +\starttypescript [serif] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [ComputerModern] [\typescriptprefix{c:\typescriptthree}rm1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModern-Italic] [\typescriptprefix{c:\typescriptthree}ti1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModern-Slanted] [\typescriptprefix{c:\typescriptthree}sl1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModern-Bold] [\typescriptprefix{c:\typescriptthree}bx1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModern-BoldItalic] [\typescriptprefix{c:\typescriptthree}bi1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModern-BoldSlanted] [\typescriptprefix{c:\typescriptthree}bl1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModern-Caps] [\typescriptprefix{c:\typescriptthree}cc1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModern-CapsSlanted] [\typescriptprefix{c:\typescriptthree}sc1000] [encoding=\typescriptthree] +\stoptypescript + +\starttypescript [sans] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [ComputerModernSans] [\typescriptprefix{c:\typescriptthree}ss1000] [encoding=\typescriptthree] + %definefontsynonym [ComputerModernSans-Italic] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModernSans-Slanted] [\typescriptprefix{c:\typescriptthree}si1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModernSans-Bold] [\typescriptprefix{c:\typescriptthree}sx1000] [encoding=\typescriptthree] + %definefontsynonym [ComputerModernSans-BoldItalic] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModernSans-BoldSlanted] [\typescriptprefix{c:\typescriptthree}so1000] [encoding=\typescriptthree] + %definefontsynonym [ComputerModernSans-Caps] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] + %definefontsynonym [ComputerModernSans-CapsSlanted] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] +\stoptypescript + +\starttypescript [mono] [computer-modern] [t2a,t2b,t2c,x2] + \definefontsynonym [ComputerModernMono] [\typescriptprefix{c:\typescriptthree}tt1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModernMono-Italic] [\typescriptprefix{c:\typescriptthree}it1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModernMono-Slanted] [\typescriptprefix{c:\typescriptthree}st1000] [encoding=\typescriptthree] + %definefontsynonym [ComputerModernMono-Bold] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] + %definefontsynonym [ComputerModernMono-BoldItalic] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] + %definefontsynonym [ComputerModernMono-BoldSlanted] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] + \definefontsynonym [ComputerModernMono-Caps] [\typescriptprefix{c:\typescriptthree}tc1000] [encoding=\typescriptthree] + %definefontsynonym [ComputerModernMono-CapsSlanted] [\typescriptprefix{c:\typescriptthree}1000] [encoding=\typescriptthree] +\stoptypescript + +% Computer Concrete (AMS) + +\starttypescript [serif] [concrete] [default] + \definefontsynonym [ComputerConcrete] [ccr10] + \definefontsynonym [ComputerConcrete-Italic] [ccti10] + \definefontsynonym [ComputerConcrete-Slanted] [ccsl10] + \definefontsynonym [ComputerConcrete-Bold] [ComputerConcrete] + \definefontsynonym [ComputerConcrete-BoldItalic] [ComputerConcrete-Italic] + \definefontsynonym [ComputerConcrete-BoldSlanted] [ComputerConcrete-Slanted] + \definefontsynonym [ComputerConcrete-Caps] [cccsc10] +\stoptypescript + +% Euler (AMS) + +\starttypescript [math] [euler] [default] + \definefontsynonym [Euler-Roman] [zeurm10] + \definefontsynonym [Euler-Extension] [zeuex10] + \definefontsynonym [Euler-Symbol] [zeusm10] + \definefontsynonym [Euler-Fraktur] [eufm10] + + \loadmapfile[original-ams-euler.map] +\stoptypescript + +\starttypescript [boldmath,bfmath] [euler] [default] + \definefontsynonym [Euler-Roman-Bold] [zeurb10] + \definefontsynonym [Euler-Extension] [zeuex10] + \definefontsynonym [Euler-Symbol-Bold] [zeusb10] + \definefontsynonym [Euler-Fraktur-Bold] [eufb10] + + \loadmapfile[original-ams-euler.map] +\stoptypescript + +% AMS (AMS) + +\starttypescript [math] [modern,computer-modern,latin-modern,ams] [default] + \definefontsynonym [AMS-SymbolA] [msam10] + \definefontsynonym [AMS-SymbolB] [msbm10] +\stoptypescript + +% Fourier (Utopia) + +\starttypescript [math] [fourier] [default,ec] + \definefontsynonym [Fourier-Math-Letters] [futr8t] [encoding=ec] + %definefontsynonym [Fourier-Math-Letters] [futmi] + \definefontsynonym [Fourier-Math-Letters-Italic] [futmii] + \definefontsynonym [Fourier-Math-Symbols] [futsy] + \definefontsynonym [Fourier-Math-Extension] [fourier-mex] + + \loadmapfile[fourier.map] +\stoptypescript + +\starttypescript [serif] [fourier] [ec] + \definefontsynonym [Fourier-Regular] [futr8t] [encoding=ec] + \definefontsynonym [Fourier-Slanted] [futro8t] [encoding=ec] + \definefontsynonym [Fourier-Italic] [futri8t] [encoding=ec] + \definefontsynonym [Fourier-RegularCaps] [futrc8t] [encoding=ec] + \definefontsynonym [Fourier-Bold] [futb8t] [encoding=ec] + \definefontsynonym [Fourier-BoldSlanted] [futbo8t] [encoding=ec] + \definefontsynonym [Fourier-BoldItalic] [futbi8t] [encoding=ec] + \definefontsynonym [Fourier-BoldCaps] [futbc8t] [encoding=ec] + + \definefontsynonym [Fourier-Regular-Expert] [futr9e] [encoding=ec] + \definefontsynonym [Fourier-Slanted-Expert] [futro9e] [encoding=ec] + \definefontsynonym [Fourier-Italic-Expert] [futri9e] [encoding=ec] + \definefontsynonym [Fourier-RegularCaps-Expert] [futrc9e] [encoding=ec] + \definefontsynonym [Fourier-Semi-Expert] [futs9e] [encoding=ec] + \definefontsynonym [Fourier-SemiSlanted-Expert] [futso9e] [encoding=ec] + \definefontsynonym [Fourier-SemiItalic-Expert] [futsi9e] [encoding=ec] + \definefontsynonym [Fourier-SemiCaps-Expert] [futsc9e] [encoding=ec] + \definefontsynonym [Fourier-Bold-Expert] [futb9e] [encoding=ec] + \definefontsynonym [Fourier-BoldSlanted-Expert] [futbo9e] [encoding=ec] + \definefontsynonym [Fourier-BoldItalic-Expert] [futbi9e] [encoding=ec] + \definefontsynonym [Fourier-Black-Expert] [futc9e] [encoding=ec] + + \definefontsynonym [Fourier-Regular-OldStyle] [futr9d] [encoding=ec] + \definefontsynonym [Fourier-Slanted-OldStyle] [futro9d] [encoding=ec] + \definefontsynonym [Fourier-Italic-OldStyle] [futri9d] [encoding=ec] + \definefontsynonym [Fourier-RegularCaps-OldStyle] [futrc9d] [encoding=ec] + \definefontsynonym [Fourier-Semi-OldStyle] [futs9d] [encoding=ec] + \definefontsynonym [Fourier-SemiSlanted-OldStyle] [futso9d] [encoding=ec] + \definefontsynonym [Fourier-SemiItalic-OldStyle] [futsi9d] [encoding=ec] + \definefontsynonym [Fourier-SemiCaps-OldStyle] [futsc9d] [encoding=ec] + \definefontsynonym [Fourier-Bold-OldStyle] [futb9d] [encoding=ec] + \definefontsynonym [Fourier-BoldSlanted-OldStyle] [futbo9d] [encoding=ec] + \definefontsynonym [Fourier-BoldItalic-OldStyle] [futbi9d] [encoding=ec] + \definefontsynonym [Fourier-Black-OldStyle] [futc9d] [encoding=ec] + + \loadmapfile[fourier.map] + \loadmapfile[fourier-utopia-expert.map] +\stoptypescript + +% Courier (URW) + +\starttypescript [mono] [courier] [qx] + \definefontsynonym [qx-ucrr8a] [qcrr] [encoding=qx] + \definefontsynonym [qx-ucrb8a] [qcrb] [encoding=qx] + \definefontsynonym [qx-ucrro8a] [qcrri] [encoding=qx] + \definefontsynonym [qx-ucrbo8a] [qcrbi] [encoding=qx] +\stoptypescript + +\starttypescript [mono] [courier] [texnansi,ec,8r,t5] + \definefontsynonym [Courier] [\typescriptthree-ucrr8a] [encoding=\typescriptthree] + \definefontsynonym [Courier-Bold] [\typescriptthree-ucrb8a] [encoding=\typescriptthree] + \definefontsynonym [Courier-Oblique] [\typescriptthree-ucrro8a] [encoding=\typescriptthree] + \definefontsynonym [Courier-BoldOblique] [\typescriptthree-ucrbo8a] [encoding=\typescriptthree] + + \loadmapfile[\typescriptthree-urw-courier.map] +\stoptypescript + +% Helvetica (URW) + +\starttypescript [sans] [helvetica] [qx] + \definefontsynonym [qx-uhvr8a] [qhvr] [encoding=qx] + \definefontsynonym [qx-uhvri8a] [qhvri] [encoding=qx] + \definefontsynonym [qx-uhvro8a] [qhvri] [encoding=qx] + \definefontsynonym [qx-uhvb8a] [qhvb] [encoding=qx] + \definefontsynonym [qx-uhvbi8a] [qhvbi] [encoding=qx] + \definefontsynonym [qx-uhvbo8a] [qhvbi] [encoding=qx] +\stoptypescript + +\starttypescript [sans] [helvetica] [texnansi,ec,8r,t5] + \definefontsynonym [Helvetica] [\typescriptthree-uhvr8a] [encoding=\typescriptthree] + \definefontsynonym [Helvetica-Italic] [\typescriptthree-uhvri8a] [encoding=\typescriptthree] + \definefontsynonym [Helvetica-Oblique] [\typescriptthree-uhvro8a] [encoding=\typescriptthree] + \definefontsynonym [Helvetica-Bold] [\typescriptthree-uhvb8a] [encoding=\typescriptthree] + \definefontsynonym [Helvetica-BoldItalic] [\typescriptthree-uhvbi8a] [encoding=\typescriptthree] + \definefontsynonym [Helvetica-BoldOblique] [\typescriptthree-uhvbo8a] [encoding=\typescriptthree] + + \loadmapfile[\typescriptthree-urw-helvetica.map] +\stoptypescript + +% Times Roman (URW) + +\starttypescript [serif] [times] [qx] + \definefontsynonym [qx-utmr8a] [qtmr] [encoding=qx] + \definefontsynonym [qx-utmri8a] [qtmri] [encoding=qx] + \definefontsynonym [qx-utmb8a] [qtmb] [encoding=qx] + \definefontsynonym [qx-utmbi8a] [qtmbi] [encoding=qx] + \definefontsynonym [qx-utmr8a-slanted-167] [qtmri] [encoding=qx] + \definefontsynonym [qx-utmb8a-slanted-167] [qtmbi] [encoding=qx] +\stoptypescript + +\starttypescript [serif] [times] [texnansi,ec,8r,t5] + \definefontsynonym [Times-Roman] [\typescriptthree-utmr8a] [encoding=\typescriptthree] + \definefontsynonym [Times-Italic] [\typescriptthree-utmri8a] [encoding=\typescriptthree] + \definefontsynonym [Times-Bold] [\typescriptthree-utmb8a] [encoding=\typescriptthree] + \definefontsynonym [Times-BoldItalic] [\typescriptthree-utmbi8a] [encoding=\typescriptthree] + \definefontsynonym [Times-Slanted] [\typescriptthree-utmr8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Times-BoldSlanted] [\typescriptthree-utmb8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Times-Caps] [Times-Roman] + \definefontsynonym [Times] [Times-Roman] + + \loadmapfile[\typescriptthree-urw-times.map] +\stoptypescript + +% Math Times (tx) + +\starttypescript [math] [times] [all] + \definefontsynonym [Times-Roman-Upright] [txr] + \definefontsynonym [Times-Roman-Italic] [txi] + \definefontsynonym [Times-Roman-Slanted] [txsl] + \definefontsynonym [Times-Roman-Caps] [txsc] + \definefontsynonym [Times-Companion-Upright] [tcxr] + \definefontsynonym [Times-Companion-Italic] [tcxi] + \definefontsynonym [Times-Companion-Slanted] [tcxsl] + \definefontsynonym [Times-Math-Italic] [txmi] + \definefontsynonym [Times-Math-Symbols] [txsy] + \definefontsynonym [Times-Math-Extension] [txex] + \definefontsynonym [Times-Math-SymbolsA] [txsya] + \definefontsynonym [Times-Math-SymbolsB] [txsyb] + \definefontsynonym [Times-Math-SymbolsC] [txsyc] + \definefontsynonym [Times-Math-Italic-A] [txmia] + \definefontsynonym [Times-Math-Extension-A] [txexa] + + \loadmapfile[original-youngryu-tx.map] +\stoptypescript + +% Antykwa Torunska (GUST) + +% \starttypescript [serif] [antykwa-torunska] [texnansi,ec,8r] +% \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree] +% \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree] +% \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree] +% \stoptypescript + +\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec,t2a,t2b,t2c,greek] + \definefontsynonym [AntykwaTorunska-Bold] [\typescriptthree-anttb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-BoldItalic] [\typescriptthree-anttbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Light] [\typescriptthree-anttl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightItalic] [\typescriptthree-anttli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Medium] [\typescriptthree-anttm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MedItalic] [\typescriptthree-anttmi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Regular] [\typescriptthree-anttr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Italic] [\typescriptthree-anttri] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBold] [\typescriptthree-anttcb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldItalic] [\typescriptthree-anttcbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLight] [\typescriptthree-anttcl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightItalic][\typescriptthree-anttcli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMedium] [\typescriptthree-anttcm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMedItalic] [\typescriptthree-anttcmi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondRegular] [\typescriptthree-anttcr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondItalic] [\typescriptthree-anttcri] [encoding=\typescriptthree] + + \loadmapfile[antt-\typescriptthree.map] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [texnansi,qx,t5,ec] + \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttbcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbicap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttlcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttlicap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttmcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmicap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttrcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttricap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcbcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbicap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttclcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttclicap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcmcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmicap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcrcap] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcricap] [encoding=\typescriptthree] + + \loadmapfile[antt-\typescriptthree.map] +\stoptypescript + +% duplicates ? ? +% atl: no: fallbacks for the named variants + +\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c,greek] + \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree] + + \loadmapfile[antt-\typescriptthree.map] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [t2a,t2b,t2c] + \definefontsynonym [AntykwaTorunska-BoldCap] [\typescriptthree-anttb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-BoldItalicCap] [\typescriptthree-anttbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightCap] [\typescriptthree-anttl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-LightItalicCap] [\typescriptthree-anttli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MediumCap] [\typescriptthree-anttm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-MedItalicCap] [\typescriptthree-anttmi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-Cap] [\typescriptthree-anttr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-ItalicCap] [\typescriptthree-anttri] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldCap] [\typescriptthree-anttcb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [\typescriptthree-anttcbi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightCap] [\typescriptthree-anttcl] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondLightItalicCap][\typescriptthree-anttcli] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMediumCap] [\typescriptthree-anttcm] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [\typescriptthree-anttcmi] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondCap] [\typescriptthree-anttcr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaTorunska-CondItalicCap] [\typescriptthree-anttcri] [encoding=\typescriptthree] + + \loadmapfile[antt-\typescriptthree.map] +\stoptypescript + +% mabye no -Regular etc +% dunny reverse of condlight lightcond + +\starttypescript [math] [antykwa-torunska] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-Regular] [rm-anttr] + \definefontsynonym [AntykwaTorunska-Math-Letters-RegularItalic] [mi-anttri] + \definefontsynonym [AntykwaTorunska-Math-Symbols-Regular] [sy-anttrz] + \definefontsynonym [AntykwaTorunska-Math-Extension-Regular] [ex-anttr] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-light] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-Light] [rm-anttl] + \definefontsynonym [AntykwaTorunska-Math-Letters-LightItalic] [mi-anttli] + \definefontsynonym [AntykwaTorunska-Math-Symbols-Light] [sy-anttlz] + \definefontsynonym [AntykwaTorunska-Math-Extension-Light] [ex-anttl] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-cond] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegular] [rm-anttcr] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegularItalic] [mi-anttcri] + \definefontsynonym [AntykwaTorunska-Math-Symbols-CondRegular] [sy-anttcrz] + \definefontsynonym [AntykwaTorunska-Math-Extension-CondRegular] [ex-anttcr] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-lightcond] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondLight] [rm-anttcl] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondLightItalic] [mi-anttcli] + \definefontsynonym [AntykwaTorunska-Math-Symbols-CondLight] [sy-anttclz] + \definefontsynonym [AntykwaTorunska-Math-Extension-CondLight] [ex-anttcl] +\stoptypescript + +\starttypescript [math] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] [default] + \loadmapfile[antt-rm.map] + \loadmapfile[antt-mi.map] + \loadmapfile[antt-sy.map] + \loadmapfile[antt-ex.map] +\stoptypescript + +% Antykwa Poltawskiego (GUST) + +\starttypescript [serif] [antykwa-poltawskiego] [texnansi,ec,8r] + \definefontsynonym [AntykwaPoltawskiego-Regular] [\typescriptthree-antpr] [encoding=\typescriptthree] + \definefontsynonym [AntykwaPoltawskiego-Bold] [\typescriptthree-antpb] [encoding=\typescriptthree] + \definefontsynonym [AntykwaPoltawskiego-Italic] [\typescriptthree-antpri] [encoding=\typescriptthree] + \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [\typescriptthree-antpbi] [encoding=\typescriptthree] + + \loadmapfile[\typescriptthree-public-antp.map] +\stoptypescript + +% Iwona (JMN) + +% maybe this will change in Iwona-Math-Letters and Iwona-Math-Letters-Italic + +\starttypescript [sans] [iwona-light,iwona,iwona-medium,iwona-heavy,iwona-light-cond,iwona-cond,iwona-medium-cond,iwona-heavy-cond] [texnansi,ec,el,qx,t5] + \definefontsynonym[Iwona-Light] [\typescriptthree-iwonal] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Regular] [\typescriptthree-iwonar] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Medium] [\typescriptthree-iwonam] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Bold] [\typescriptthree-iwonab] [encoding=\typescriptthree] + \definefontsynonym[Iwona-Heavy] [\typescriptthree-iwonah] [encoding=\typescriptthree] + \definefontsynonym[Iwona-LightItalic] [\typescriptthree-iwonali] [encoding=\typescriptthree] + \definefontsynonym[Iwona-RegularItalic] [\typescriptthree-iwonari] [encoding=\typescriptthree] + \definefontsynonym[Iwona-MediumItalic] [\typescriptthree-iwonami] [encoding=\typescriptthree] + \definefontsynonym[Iwona-BoldItalic] [\typescriptthree-iwonabi] [encoding=\typescriptthree] + \definefontsynonym[Iwona-HeavyItalic] [\typescriptthree-iwonahi] [encoding=\typescriptthree] + + \definefontsynonym[Iwona-CapsLight] [\typescriptthree-iwonalcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsRegular] [\typescriptthree-iwonarcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsMedium] [\typescriptthree-iwonamcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsBold] [\typescriptthree-iwonabcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsHeavy] [\typescriptthree-iwonahcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsLightItalic] [\typescriptthree-iwonalicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsRegularItalic] [\typescriptthree-iwonaricap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsMediumItalic] [\typescriptthree-iwonamicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsBoldItalic] [\typescriptthree-iwonabicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CapsHeavyItalic] [\typescriptthree-iwonahicap] [encoding=\typescriptthree] + + \definefontsynonym[Iwona-CondLight] [\typescriptthree-iwonacl] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondRegular] [\typescriptthree-iwonacr] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondMedium] [\typescriptthree-iwonacm] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondBold] [\typescriptthree-iwonacb] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondHeavy] [\typescriptthree-iwonach] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondLightItalic] [\typescriptthree-iwonacli] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondRegularItalic] [\typescriptthree-iwonacri] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondMediumItalic] [\typescriptthree-iwonacmi] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondBoldItalic] [\typescriptthree-iwonacbi] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondHeavyItalic] [\typescriptthree-iwonachi] [encoding=\typescriptthree] + + \definefontsynonym[Iwona-CondCapsLight] [\typescriptthree-iwonaclcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondCapsRegular] [\typescriptthree-iwonacrcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondCapsMedium] [\typescriptthree-iwonacmcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondCapsBold] [\typescriptthree-iwonacbcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondCapsHeavy] [\typescriptthree-iwonachcap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondCapsLightItalic] [\typescriptthree-iwonaclicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondCapsRegularItalic] [\typescriptthree-iwonacricap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondCapsMediumItalic] [\typescriptthree-iwonacmicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondCapsBoldItalic] [\typescriptthree-iwonacbicap] [encoding=\typescriptthree] + \definefontsynonym[Iwona-CondCapsHeavyItalic] [\typescriptthree-iwonachicap] [encoding=\typescriptthree] + + \loadmapfile[iwona-\typescriptthree.map] +\stoptypescript + +\starttypescript [math] [iwona] [default] + \definefontsynonym [Iwona-Math-Letters-Regular] [rm-iwonar] + \definefontsynonym [Iwona-Math-Letters-RegularItalic] [mi-iwonari] + \definefontsynonym [Iwona-Math-Symbols-Regular] [sy-iwonarz] + \definefontsynonym [Iwona-Math-Extension-Regular] [ex-iwonar] +\stoptypescript + +\starttypescript [math] [iwona-light] [default] + \definefontsynonym [Iwona-Math-Letters-Light] [rm-iwonal] + \definefontsynonym [Iwona-Math-Letters-LightItalic] [mi-iwonali] + \definefontsynonym [Iwona-Math-Symbols-Light] [sy-iwonalz] + \definefontsynonym [Iwona-Math-Extension-Light] [ex-iwonal] +\stoptypescript + +\starttypescript [math] [iwona-medium] [default] + \definefontsynonym [Iwona-Math-Letters-Medium] [rm-iwonam] + \definefontsynonym [Iwona-Math-Letters-MediumItalic] [mi-iwonami] + \definefontsynonym [Iwona-Math-Symbols-Medium] [sy-iwonamz] + \definefontsynonym [Iwona-Math-Extension-Medium] [ex-iwonam] +\stoptypescript + +\starttypescript [math] [iwona-heavy] [default] + \definefontsynonym [Iwona-Math-Letters-Heavy] [rm-iwonah] + \definefontsynonym [Iwona-Math-Letters-HeavyItalic] [mi-iwonahi] + \definefontsynonym [Iwona-Math-Symbols-Heavy] [sy-iwonahz] + \definefontsynonym [Iwona-Math-Extension-Heavy] [ex-iwonah] +\stoptypescript + +\starttypescript [math] [iwona,iwona-light,iwona-medium,iwona-heavy] [default] + \loadmapfile[iwona-rm.map] + \loadmapfile[iwona-mi.map] + \loadmapfile[iwona-sy.map] + \loadmapfile[iwona-ex.map] +\stoptypescript + +% Kurier (JMN) + +\starttypescript [sans] [kurier-light,kurier,kurier-medium] [texnansi,ec,qx,t5] + \definefontsynonym[Kurier-Light] [\typescriptthree-kurierl] [encoding=\typescriptthree] + \definefontsynonym[Kurier-Regular] [\typescriptthree-kurierr] [encoding=\typescriptthree] + \definefontsynonym[Kurier-Medium] [\typescriptthree-kurierm] [encoding=\typescriptthree] + \definefontsynonym[Kurier-Bold] [\typescriptthree-kurierb] [encoding=\typescriptthree] + \definefontsynonym[Kurier-Heavy] [\typescriptthree-kurierh] [encoding=\typescriptthree] + \definefontsynonym[Kurier-LightItalic] [\typescriptthree-kurierli] [encoding=\typescriptthree] + \definefontsynonym[Kurier-RegularItalic] [\typescriptthree-kurierri] [encoding=\typescriptthree] + \definefontsynonym[Kurier-MediumItalic] [\typescriptthree-kuriermi] [encoding=\typescriptthree] + \definefontsynonym[Kurier-BoldItalic] [\typescriptthree-kurierbi] [encoding=\typescriptthree] + \definefontsynonym[Kurier-HeavyItalic] [\typescriptthree-kurierhi] [encoding=\typescriptthree] + + \loadmapfile[kurier-\typescriptthree.map] +\stoptypescript + +\starttypescript [math] [kurier] [default] + \definefontsynonym [Kurier-Math-Letters-Regular] [rm-kurierr] + \definefontsynonym [Kurier-Math-Letters-RegularItalic] [mi-kurierri] + \definefontsynonym [Kurier-Math-Symbols-Regular] [sy-kurierrz] + \definefontsynonym [Kurier-Math-Extension-Regular] [ex-kurierr] +\stoptypescript + +\starttypescript [math] [kurier-light] [default] + \definefontsynonym [Kurier-Math-Letters-Light] [rm-kurierl] + \definefontsynonym [Kurier-Math-Letters-LightItalic] [mi-kurierli] + \definefontsynonym [Kurier-Math-Symbols-Light] [sy-kurierlz] + \definefontsynonym [Kurier-Math-Extension-Light] [ex-kurierl] +\stoptypescript + +\starttypescript [math] [kurier-medium] [default] + \definefontsynonym [Kurier-Math-Letters-Medium] [rm-kurierm] + \definefontsynonym [Kurier-Math-Letters-MediumItalic] [mi-kuriermi] + \definefontsynonym [Kurier-Math-Symbols-Medium] [sy-kuriermz] + \definefontsynonym [Kurier-Math-Extension-medium] [ex-kurierm] +\stoptypescript + +\starttypescript [math] [kurier,kurier-light,kurier-medium] [default] + \loadmapfile[kurier-rm.map] + \loadmapfile[kurier-mi.map] + \loadmapfile[kurier-sy.map] + \loadmapfile[kurier-ex.map] +\stoptypescript + +% Palatino (URW) + +\starttypescript [serif] [palatino] [qx] + \definefontsynonym [qx-uplr8a] [qplr] [encoding=qx] + \definefontsynonym [qx-uplri8a] [qplri] [encoding=qx] + \definefontsynonym [qx-uplb8a] [qplb] [encoding=qx] + \definefontsynonym [qx-uplbi8a] [qplbi] [encoding=qx] + \definefontsynonym [qx-uplr8a-slanted-167] [qplri] [encoding=qx] + \definefontsynonym [qx-uplb8a-slanted-167] [qplbi] [encoding=qx] + \definefontsynonym [qx-uplr8a-capitalized-800] [qplr] [encoding=qx] +\stoptypescript + +\starttypescript [serif] [palatino] [texnansi,ec,8r,t5] + \definefontsynonym [Palatino] [\typescriptthree-uplr8a] [encoding=\typescriptthree] + \definefontsynonym [Palatino-Italic] [\typescriptthree-uplri8a] [encoding=\typescriptthree] + \definefontsynonym [Palatino-Bold] [\typescriptthree-uplb8a] [encoding=\typescriptthree] + \definefontsynonym [Palatino-BoldItalic] [\typescriptthree-uplbi8a] [encoding=\typescriptthree] + + \definefontsynonym [Palatino-Slanted] [\typescriptthree-uplr8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Palatino-BoldSlanted] [\typescriptthree-uplb8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Palatino-Caps] [\typescriptthree-uplr8a-capitalized-800] [encoding=\typescriptthree] + + \loadmapfile[\typescriptthree-urw-palatino.map] +\stoptypescript + +% bonus definitions + +% when these fonts are in tex live ... +% +% \definefontsynonym [Palatino-Caps] [TeXPalladioL-SC] [encoding=\typescriptthree] + +\starttypescript [serif] [palatino] [ec,texnansi,8r] + + \definefontsynonym[TeXPalladioL-BoldItalicOsF][\typescriptthree-fplbij8a][encoding=\typescriptthree] + \definefontsynonym[TeXPalladioL-BoldOsF] [\typescriptthree-fplbj8a] [encoding=\typescriptthree] + \definefontsynonym[TeXPalladioL-SC] [\typescriptthree-fplrc8a] [encoding=\typescriptthree] + \definefontsynonym[TeXPalladioL-ItalicOsF] [\typescriptthree-fplrij8a][encoding=\typescriptthree] + + \loadmapfile[\typescriptthree-urw-palatino.map] +\stoptypescript + +% Palatino Math (PX) + +\starttypescript [math] [palatino] [all] + \definefontsynonym [Palatino-Roman-Upright] [pxr] + \definefontsynonym [Palatino-Roman-Italic] [pxi] + \definefontsynonym [Palatino-Roman-Slanted] [pxsl] + \definefontsynonym [Palatino-Roman-Caps] [pxsc] + \definefontsynonym [Palatino-Companion-Upright] [pcxr] + \definefontsynonym [Palatino-Companion-Italic] [pcxi] + \definefontsynonym [Palatino-Companion-Slanted] [pcxsl] + \definefontsynonym [Palatino-Math-Italic] [pxmi] + \definefontsynonym [Palatino-Math-Symbols] [pxsy] + \definefontsynonym [Palatino-Math-Extension] [pxex] + \definefontsynonym [Palatino-Math-SymbolsA] [pxsya] + \definefontsynonym [Palatino-Math-SymbolsB] [pxsyb] + \definefontsynonym [Palatino-Math-SymbolsC] [pxsyc] + \definefontsynonym [Palatino-Math-Italic-A] [pxmia] + \definefontsynonym [Palatino-Math-Extension-A] [pxexa] + + \loadmapfile[original-youngryu-px.map] +\stoptypescript + +% Bookman (URW) + + +\starttypescript [serif] [bookman] [qx] + \definefontsynonym [qx-ubkl8a] [qbkr] [encoding=qx] + \definefontsynonym [qx-ubkli8a] [qbkri] [encoding=qx] + \definefontsynonym [qx-ubkd8a] [qbkb] [encoding=qx] + \definefontsynonym [qx-ubkdi8a] [qbkbi] [encoding=qx] + \definefontsynonym [qx-ubkl8a-slanted-167] [qbkri] [encoding=qx] + \definefontsynonym [qx-ubkd8a-slanted-167] [qbkbi] [encoding=qx] + \definefontsynonym [qx-ubkl8a-capitalized-800] [qbkr] [encoding=qx] +\stoptypescript + +\starttypescript [serif] [bookman] [ec,texnansi,8r,t5] + \definefontsynonym [Bookman-Light] [\typescriptthree-ubkl8a] [encoding=\typescriptthree] + \definefontsynonym [Bookman-LightItalic] [\typescriptthree-ubkli8a] [encoding=\typescriptthree] + \definefontsynonym [Bookman-DemiBold] [\typescriptthree-ubkd8a] [encoding=\typescriptthree] + \definefontsynonym [Bookman-DemiBoldItalic] [\typescriptthree-ubkdi8a] [encoding=\typescriptthree] + \definefontsynonym [Bookman-LightSlanted] [\typescriptthree-ubkl8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Bookman-DemiBoldSlanted] [\typescriptthree-ubkd8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Bookman-Light-Caps] [\typescriptthree-ubkl8a-capitalized-800] [encoding=\typescriptthree] + + \loadmapfile[\typescriptthree-urw-bookman.map] +\stoptypescript + +% Chancery (URW) + +\starttypescript [calligraphy] [chancery] [qx] + \definefontsynonym [qx-uzcmi8a] [qzcmi] [encoding=qx] +\stoptypescript + +\starttypescript [calligraphy] [chancery] [ec,texnansi,8r] + \definefontsynonym [Chancery] [\typescriptthree-uzcmi8a] [encoding=\typescriptthree] + \loadmapfile[\typescriptthree-urw-zapfchan.map] +\stoptypescript + +% New Century Schoolbook (URW) + +\starttypescript [serif] [schoolbook] [ec,texnansi,8r,t5] + \definefontsynonym [Schoolbook-Roman] [\typescriptthree-uncr8a] [encoding=\typescriptthree] + \definefontsynonym [Schoolbook-Italic] [\typescriptthree-uncri8a] [encoding=\typescriptthree] + \definefontsynonym [Schoolbook-Bold] [\typescriptthree-uncb8a] [encoding=\typescriptthree] + \definefontsynonym [Schoolbook-BoldItalic] [\typescriptthree-uncbi8a] [encoding=\typescriptthree] + \definefontsynonym [Schoolbook-RomanSlanted] [\typescriptthree-uncr8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Schoolbook-BoldSlanted] [\typescriptthree-uncb8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Schoolbook-Roman-Caps] [\typescriptthree-uncr8a-capitalized-800] [encoding=\typescriptthree] + + \loadmapfile[\typescriptthree-urw-ncntrsbk.map] +\stoptypescript + +% Utopia (Adobe) + +\starttypescript [serif] [utopia] [ec,texnansi] + \definefontsynonym [Utopia-Regular] [\typescriptthree-putr8a] [encoding=\typescriptthree] + \definefontsynonym [Utopia-Italic] [\typescriptthree-putri8a] [encoding=\typescriptthree] + \definefontsynonym [Utopia-Bold] [\typescriptthree-putb8a] [encoding=\typescriptthree] + \definefontsynonym [Utopia-BoldItalic] [\typescriptthree-putbi8a] [encoding=\typescriptthree] + \definefontsynonym [Utopia-Slanted] [\typescriptthree-putr8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Utopia-BoldSlanted] [\typescriptthree-putb8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Utopia-Regular-Caps][\typescriptthree-putr8a-capitalized-800] [encoding=\typescriptthree] + + \loadmapfile[\typescriptthree-adobe-utopia.map] +\stoptypescript + +% Charter (Bitstream) + +\starttypescript [serif] [charter] [ec,texnansi,8r] + \definefontsynonym [Charter-Roman] [\typescriptthree-bchr8a] [encoding=\typescriptthree] + \definefontsynonym [Charter-Italic] [\typescriptthree-bchri8a] [encoding=\typescriptthree] + \definefontsynonym [Charter-Bold] [\typescriptthree-bchb8a] [encoding=\typescriptthree] + \definefontsynonym [Charter-BoldItalic] [\typescriptthree-bchbi8a] [encoding=\typescriptthree] + \definefontsynonym [Charter-Slanted] [\typescriptthree-bchr8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Charter-BoldSlanted][\typescriptthree-bchb8a-slanted-167] [encoding=\typescriptthree] + \definefontsynonym [Charter-Roman-Caps] [\typescriptthree-bchr8a-capitalized-800] [encoding=\typescriptthree] + + \loadmapfile[\typescriptthree-bitstrea-charter.map] +\stoptypescript + +% Whatever else we need: + +\starttypescript + \definefontsynonym [ZapfDingbats] [uzdr] + \definefontsynonym [RalfSmithFormalScript] [rsfs10] + \definefontsynonym [MartinVogel] [fmvr8x] +\stoptypescript + +\stoptypescriptcollection + +\endinput diff --git a/tex/context/base/type-otf.tex b/tex/context/base/type-otf.tex new file mode 100644 index 000000000..ee51c559c --- /dev/null +++ b/tex/context/base/type-otf.tex @@ -0,0 +1,720 @@ +%D \module +%D [ file=type-otf, +%D version=2007.07.30, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Opentype Definitions, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +%D Actually, \LUATEX\ does not need all these definitions since it can +%D consult its database. However, here we use the names that we used +%D in good old \TEX, and these may differ a bit. Here we also see +%D some oldstyle definitions which normally are done with features. + +\starttypescriptcollection[examples] + +\starttypescript [fallback] + \definetypeface [] [rm] [serif] [modern] [computer-modern] + \definetypeface [] [ss] [sans] [modern] [computer-modern] + \definetypeface [] [tt] [mono] [modern] [computer-modern] + \definetypeface [] [mm] [math] [modern] [computer-modern] + \quittypescriptscanning +\stoptypescript + +\starttypescript [modern] + \definetypeface [modern] [rm] [serif] [modern] [computer-modern] + \definetypeface [modern] [ss] [sans] [modern] [computer-modern] + \definetypeface [modern] [tt] [mono] [modern] [computer-modern] + \definetypeface [modern] [mm] [math] [modern] [computer-modern] + \quittypescriptscanning +\stoptypescript + +\starttypescript [modern-base] + \definetypeface [modern] [rm] [serif] [modern] [default] + \definetypeface [modern] [ss] [sans] [modern] [default] + \definetypeface [modern] [tt] [mono] [modern] [default] + \definetypeface [modern] [mm] [math] [modern] [default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [postscript] + \definetypeface [postscript] [rm] [serif] [times] [default] + \definetypeface [postscript] [ss] [sans] [helvetica] [default] [rscale=.9] + \definetypeface [postscript] [tt] [mono] [courier] [default] [rscale=1.1] + \definetypeface [postscript] [mm] [math] [times] [default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [times] + \definetypeface [times] [rm] [serif] [times] [default] + \definetypeface [times] [ss] [sans] [helvetica] [default] [rscale=0.9] + \definetypeface [times] [tt] [mono] [modern] [default] [rscale=1.05] + \definetypeface [times] [mm] [math] [times] [default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [palatino] + \definetypeface [palatino] [rm] [serif] [palatino] [default] + \definetypeface [palatino] [tt] [mono] [modern] [default] [rscale=1.075] + \definetypeface [palatino] [mm] [math] [palatino] [default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [modernvariable] + \definetypeface [modernvariable] [rm] [serif] [simple] [default] + \definetypeface [modernvariable] [ss] [sans] [modern] [default] + \definetypeface [modernvariable] [tt] [mono] [modern] [default] + \definetypeface [modernvariable] [mm] [math] [modern] [default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [antykwa-torunska] + \definetypeface[antykwa][rm][serif][antykwa-torunska] [default] + \definetypeface[antykwa][ss][sans] [modern] [default] [rscale=1.05] + \definetypeface[antykwa][tt][mono] [modern] [default] [rscale=1.1] + \definetypeface[antykwa][mm][math] [antykwa-torunska] [default] + \quittypescriptscanning +\stoptypescript + +\starttypescript [iwona,iwona-light,iwona-heavy,iwona-medium] + \definetypeface[\typescriptone][ss][sans] [\typescriptone] [default] + \definetypeface[\typescriptone][rm][serif][modern] [default] + \definetypeface[\typescriptone][tt][mono] [modern] [default] + \definetypeface[\typescriptone][mm][math] [\typescriptone] [default][text=ss] + \quittypescriptscanning +\stoptypescript + +\stoptypescriptcollection + +% if a fontname equals the filename, then use +% +% \setupfontsynonym [LMRoman10-DemiOblique] [features=default] % file is lowercase, so fails +% \definefontsynonym [LMRoman10-DemiOblique] [name:LMRoman10-DemiOblique] [features=default] +% \definefontsynonym [LMRoman10-DemiOblique] [lmroman10-demioblique] [features=default] + +\starttypescriptcollection[opentype] + +\starttypescript [serif] [modern,latin-modern] + \definefontsynonym [LMRoman10-DemiOblique] [lmroman10-demioblique] [features=default] + \definefontsynonym [LMRoman10-Bold] [lmroman10-bold] [features=default] + \definefontsynonym [LMRoman12-Bold] [lmroman12-bold] [features=default] + \definefontsynonym [LMRoman5-Bold] [lmroman5-bold] [features=default] + \definefontsynonym [LMRoman6-Bold] [lmroman6-bold] [features=default] + \definefontsynonym [LMRoman7-Bold] [lmroman7-bold] [features=default] + \definefontsynonym [LMRoman8-Bold] [lmroman8-bold] [features=default] + \definefontsynonym [LMRoman9-Bold] [lmroman9-bold] [features=default] + \definefontsynonym [LMRoman10-BoldItalic] [lmroman10-bolditalic] [features=default] + \definefontsynonym [LMRoman10-BoldOblique] [lmroman10-boldoblique] [features=default] + \definefontsynonym [LMRoman10-CapsRegular] [lmroman10-capsregular] [features=default] + \definefontsynonym [LMRoman10-CapsOblique] [lmroman10-capsoblique] [features=default] + \definefontsynonym [LMRoman10-Regular] [lmroman10-regular] [features=default] + \definefontsynonym [LMRoman12-Regular] [lmroman12-regular] [features=default] + \definefontsynonym [LMRoman17-Regular] [lmroman17-regular] [features=default] + \definefontsynonym [LMRoman5-Regular] [lmroman5-regular] [features=default] + \definefontsynonym [LMRoman6-Regular] [lmroman6-regular] [features=default] + \definefontsynonym [LMRoman7-Regular] [lmroman7-regular] [features=default] + \definefontsynonym [LMRoman8-Regular] [lmroman8-regular] [features=default] + \definefontsynonym [LMRoman9-Regular] [lmroman9-regular] [features=default] + \definefontsynonym [LMRoman10-Italic] [lmroman10-italic] [features=default] + \definefontsynonym [LMRoman12-Italic] [lmroman12-italic] [features=default] + \definefontsynonym [LMRoman7-Italic] [lmroman7-italic] [features=default] + \definefontsynonym [LMRoman8-Italic] [lmroman8-italic] [features=default] + \definefontsynonym [LMRoman9-Italic] [lmroman9-italic] [features=default] + \definefontsynonym [LMRoman10-Oblique] [lmroman10-oblique] [features=default] + \definefontsynonym [LMRoman12-Oblique] [lmroman12-oblique] [features=default] + \definefontsynonym [LMRoman17-Oblique] [lmroman17-oblique] [features=default] + \definefontsynonym [LMRoman8-Oblique] [lmroman8-oblique] [features=default] + \definefontsynonym [LMRoman9-Oblique] [lmroman9-oblique] [features=default] +\stoptypescript + +\starttypescript [sans] [modern,latin-modern] + \definefontsynonym [LMSans10-Regular] [lmsans10-regular] [features=default] + \definefontsynonym [LMSans12-Regular] [lmsans12-regular] [features=default] + \definefontsynonym [LMSans17-Regular] [lmsans17-regular] [features=default] + \definefontsynonym [LMSans8-Regular] [lmsans8-regular] [features=default] + \definefontsynonym [LMSans9-Regular] [lmsans9-regular] [features=default] + \definefontsynonym [LMSans10-BoldOblique] [lmsans10-boldoblique] [features=default] + \definefontsynonym [LMSans10-Bold] [lmsans10-bold] [features=default] + \definefontsynonym [LMSans10-DemiCondensed] [lmsans10-demicondensed] [features=default] + \definefontsynonym [LMSans10-DemiCondensedOblique] [lmsans10-demicondensedoblique] [features=default] + \definefontsynonym [LMSans10-Oblique] [lmsans10-oblique] [features=default] + \definefontsynonym [LMSans12-Oblique] [lmsans12-oblique] [features=default] + \definefontsynonym [LMSans17-Oblique] [lmsans17-oblique] [features=default] + \definefontsynonym [LMSans8-Oblique] [lmsans8-oblique] [features=default] + \definefontsynonym [LMSans9-Oblique] [lmsans9-oblique] [features=default] + \definefontsynonym [LMSansQuotation8-Regular] [lmsansquotation8-regular] [features=default] + \definefontsynonym [LMSansQuotation8-BoldOblique] [lmsansquotation8-boldoblique] [features=default] + \definefontsynonym [LMSansQuotation8-Bold] [lmsansquotation8-bold] [features=default] + \definefontsynonym [LMSansQuotation8-Oblique] [lmsansquotation8-oblique] [features=default] +\stoptypescript + +\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond] + \definefontsynonym [LMTypewriter10-CapsRegular] [lmtypewriter10-capsregular] + \definefontsynonym [LMTypewriter10-CapsOblique] [lmtypewriter10-capsoblique] + \definefontsynonym [LMTypewriter10-Light] [lmtypewriter10-light] + \definefontsynonym [LMTypewriter10-LightOblique] [lmtypewriter10-lightoblique] + \definefontsynonym [LMTypewriter10-LightCondensed] [lmtypewriter10-lightcondensed] + \definefontsynonym [LMTypewriter10-LightCondensedOblique] [lmtypewriter10-lightcondensedoblique] + \definefontsynonym [LMTypewriter10-Dark] [lmtypewriter10-dark] + \definefontsynonym [LMTypewriter10-DarkOblique] [lmtypewriter10-darkoblique] + \definefontsynonym [LMTypewriter10-Regular] [lmtypewriter10-regular] + \definefontsynonym [LMTypewriter12-Regular] [lmtypewriter12-regular] + \definefontsynonym [LMTypewriter8-Regular] [lmtypewriter8-regular] + \definefontsynonym [LMTypewriter9-Regular] [lmtypewriter9-regular] + \definefontsynonym [LMTypewriter10-Italic] [lmtypewriter10-italic] + \definefontsynonym [LMTypewriter10-Oblique] [lmtypewriter10-oblique] + \definefontsynonym [LMTypewriterVarWd10-Regular] [lmtypewritervarwd10-regular] [features=default] + \definefontsynonym [LMTypewriterVarWd10-Oblique] [lmtypewritervarwd10-oblique] [features=default] + \definefontsynonym [LMTypewriterVarWd10-Light] [lmtypewritervarwd10-light] [features=default] + \definefontsynonym [LMTypewriterVarWd10-LightOblique] [lmtypewritervarwd10-lightoblique] [features=default] + \definefontsynonym [LMTypewriterVarWd10-Dark] [lmtypewritervarwd10-dark] [features=default] + \definefontsynonym [LMTypewriterVarWd10-DarkOblique] [lmtypewritervarwd10-darkoblique] [features=default] +\stoptypescript + +\starttypescript [math] [modern,latin-modern] + \definefontsynonym [LMMathSymbols5-BoldItalic] [lmbsy5] + \definefontsynonym [LMMathSymbols7-BoldItalic] [lmbsy7] + \definefontsynonym [LMMathSymbols10-BoldItalic][lmbsy10] + \definefontsynonym [LMMathSymbols5-Italic] [lmsy5] + \definefontsynonym [LMMathSymbols6-Italic] [lmsy6] + \definefontsynonym [LMMathSymbols7-Italic] [lmsy7] + \definefontsynonym [LMMathSymbols8-Italic] [lmsy8] + \definefontsynonym [LMMathSymbols9-Italic] [lmsy9] + \definefontsynonym [LMMathSymbols10-Italic] [lmsy10] + \definefontsynonym [LMMathExtension10-Regular] [lmex10] + \definefontsynonym [LMMathItalic5-Italic] [lmmi5] + \definefontsynonym [LMMathItalic6-Italic] [lmmi6] + \definefontsynonym [LMMathItalic7-Italic] [lmmi7] + \definefontsynonym [LMMathItalic8-Italic] [lmmi8] + \definefontsynonym [LMMathItalic9-Italic] [lmmi9] + \definefontsynonym [LMMathItalic10-Italic] [lmmi10] + \definefontsynonym [LMMathItalic12-Italic] [lmmi12] + \definefontsynonym [LMMathItalic5-BoldItalic] [lmmib5] + \definefontsynonym [LMMathItalic7-BoldItalic] [lmmib7] + \definefontsynonym [LMMathItalic10-BoldItalic] [lmmib10] + + \loadmapfile[lm-math.map] + \loadmapfile[lm-rm.map] +\stoptypescript + +\starttypescript [math] [modern,computer-modern,latin-modern] + % watch the space, it prevents remapping + \definefontsynonym [ComputerModernMath-Roman] [rm-lmr10] + \definefontsynonym [ComputerModernMath-Extension] [lmex10] + \definefontsynonym [ComputerModernMath-Italic] [lmmi10] + \definefontsynonym [ComputerModernMath-Symbol] [lmsy10] +\stoptypescript + +\starttypescript [boldmath,bfmath] [modern,computer-modern,latin-modern] + % watch the space, it prevents remapping + \definefontsynonym [ComputerModernMath-Roman-Bold] [rm-lmb10] + \definefontsynonym [ComputerModernMath-Extension] [lmex10] + \definefontsynonym [ComputerModernMath-Italic-Bold] [lmmib10] + \definefontsynonym [ComputerModernMath-Symbol-Bold] [lmbsy10] +\stoptypescript + +% Computer Concrete (AMS) + +\starttypescript [serif] [concrete] + \definefontsynonym [ComputerConcrete] [ccr10] + \definefontsynonym [ComputerConcrete-Italic] [ccti10] + \definefontsynonym [ComputerConcrete-Slanted] [ccsl10] + \definefontsynonym [ComputerConcrete-Bold] [ComputerConcrete] + \definefontsynonym [ComputerConcrete-BoldItalic] [ComputerConcrete-Italic] + \definefontsynonym [ComputerConcrete-BoldSlanted] [ComputerConcrete-Slanted] + \definefontsynonym [ComputerConcrete-Caps] [cccsc10] +\stoptypescript + +% Euler (AMS) + +\starttypescript [math] [euler] + \definefontsynonym [Euler-Roman] [zeurm10] + \definefontsynonym [Euler-Extension] [zeuex10] + \definefontsynonym [Euler-Symbol] [zeusm10] + \definefontsynonym [Euler-Fraktur] [eufm10] + + \loadmapfile[original-ams-euler.map] +\stoptypescript + +\starttypescript [boldmath,bfmath] [euler] + \definefontsynonym [Euler-Roman-Bold] [zeurb10] + \definefontsynonym [Euler-Extension] [zeuex10] + \definefontsynonym [Euler-Symbol-Bold] [zeusb10] + \definefontsynonym [Euler-Fraktur-Bold] [eufb10] + + \loadmapfile[original-ams-euler.map] +\stoptypescript + +% AMS (AMS) + +\starttypescript [math] [modern,computer-modern,latin-modern,ams] + \definefontsynonym [AMS-SymbolA] [msam10] + \definefontsynonym [AMS-SymbolB] [msbm10] +\stoptypescript + +% TeXGyre + +\definetypescriptprefix [n:pagella] [TeXGyrePagella] \definetypescriptprefix [f:pagella] [pagella] +\definetypescriptprefix [n:termes] [TeXGyreTermes] \definetypescriptprefix [f:termes] [termes] +\definetypescriptprefix [n:heros] [TeXGyreHeros] \definetypescriptprefix [f:heros] [heros] +\definetypescriptprefix [n:bonum] [TeXGyreBonum] \definetypescriptprefix [f:bonum] [bonum] +\definetypescriptprefix [n:schola] [TeXGyreSchola] \definetypescriptprefix [f:schola] [schola] +\definetypescriptprefix [n:adventor][TeXGyreAdventor] \definetypescriptprefix [f:adventor][adventor] +\definetypescriptprefix [n:cursor] [TeXGyreCursor] \definetypescriptprefix [f:cursor] [cursor] +\definetypescriptprefix [n:chorus] [TeXGyreChorus] \definetypescriptprefix [f:chorus] [chorus] % not the full set + +\starttypescript [serif] [pagella,termes,heros,bonum,schola,adventor] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Regular] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-regular] [features=default] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Italic] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-italic] [features=default] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Bold] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-bold] [features=default] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalic] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-bolditalic] [features=default] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Caps] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-regular] [features=oldstyle] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-italic] [features=oldstyle] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldCaps] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-bold] [features=oldstyle] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [texgyre\typescriptthree\typescriptprefix{f:\typescripttwo}-bolditalic] [features=oldstyle] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-Slanted] [texgyre\typescriptprefix{n:\typescripttwo}-Italic] [features=default] + \definefontsynonym [\typescriptprefix{n:\typescripttwo}-BoldSlanted] [texgyre\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default] +\stoptypescript + +\starttypescript [serif] [pagella,termes,bonum,schola,chorus] [name] + \definefontsynonym [Serif] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default] + \definefontsynonym [SerifItalic] [\typescriptprefix{n:\typescripttwo}-Italic] [features=default] + \definefontsynonym [SerifBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default] + \definefontsynonym [SerifBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default] + \definefontsynonym [SerifCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps] + \definefontsynonym [SerifSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted] [features=default] + \definefontsynonym [SerifBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted] [features=default] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegular] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default] + \definefontsynonym [SerifRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps] + \definefontsynonym [SerifItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [features=smallcaps] + \definefontsynonym [SerifBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] [features=smallcaps] + \definefontsynonym [SerifBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [features=smallcaps] + \definefontsynonym [SerifCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps] + \definefontsynonym [SerifSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [features=smallcaps] + \definefontsynonym [SerifBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [features=smallcaps] +\stoptypescript + +\starttypescript [sans] [heros,adventor] [name] + \definefontsynonym [Sans] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default] + \definefontsynonym [SansItalic] [\typescriptprefix{n:\typescripttwo}-Italic] [features=default] + \definefontsynonym [SansBold] [\typescriptprefix{n:\typescripttwo}-Bold] [features=default] + \definefontsynonym [SansBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] [features=default] + \definefontsynonym [SansCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps] + \definefontsynonym [SansSlanted] [\typescriptprefix{n:\typescripttwo}-Slanted] [features=default] + \definefontsynonym [SansBoldSlanted] [\typescriptprefix{n:\typescripttwo}-BoldSlanted] [features=default] + + \definefontvariant [Sans][osf][Caps] + \definefontvariant [Sans][sc] [Caps] + + \definefontsynonym [SansRegular] [\typescriptprefix{n:\typescripttwo}-Regular] [features=default] + \definefontsynonym [SansRegularCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps] + \definefontsynonym [SansItalicCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [features=smallcaps] + \definefontsynonym [SansBoldCaps] [\typescriptprefix{n:\typescripttwo}-BoldCaps] [features=smallcaps] + \definefontsynonym [SansBoldItalicCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [features=smallcaps] + \definefontsynonym [SansCapsCaps] [\typescriptprefix{n:\typescripttwo}-Caps] [features=smallcaps] + \definefontsynonym [SansSlantedCaps] [\typescriptprefix{n:\typescripttwo}-ItalicCaps] [features=smallcaps] + \definefontsynonym [SansBoldSlantedCaps] [\typescriptprefix{n:\typescripttwo}-BoldItalicCaps] [features=smallcaps] +\stoptypescript + +\starttypescript [sans] [cursor] [name] + \definefontsynonym [Mono] [\typescriptprefix{n:\typescripttwo}-Regular] + \definefontsynonym [MonoItalic] [\typescriptprefix{n:\typescripttwo}-Italic] + \definefontsynonym [MonoBold] [\typescriptprefix{n:\typescripttwo}-Bold] + \definefontsynonym [MonoBoldItalic] [\typescriptprefix{n:\typescripttwo}-BoldItalic] + \definefontsynonym [MonoSlanted] [MonoItalic] + \definefontsynonym [MonoBoldSlanted] [MonoBoldItalic] +\stoptypescript + +%D Here we overload the older (URW) fonts. + +% TeXGyrePagella +% +% qplr TeXGyrePagella-Regular +% qplri TeXGyrePagella-Italic +% qplb TeXGyrePagella-Bold +% qplbi TeXGyrePagella-BoldItalic + +\starttypescript [serif] [palatino] + \definefontsynonym [Palatino] [texgyrepagella-regular] [features=default] + \definefontsynonym [Palatino-Italic] [texgyrepagella-italic] [features=default] + \definefontsynonym [Palatino-Bold] [texgyrepagella-bold] [features=default] + \definefontsynonym [Palatino-BoldItalic] [texgyrepagella-bolditalic] [features=default] + \definefontsynonym [Palatino-Caps] [texgyrepagella-regular] [features=smallcaps] + \definefontsynonym [Palatino-Slanted] [Palatino-Italic] + \definefontsynonym [Palatino-BoldSlanted] [Palatino-BoldItalic] +\stoptypescript + +% TeXGyreTermes +% +% qtmr TeXGyreTermes-Regular +% qtmri TeXGyreTermes-Italic +% qtmb TeXGyreTermes-Bold +% qtmbi TeXGyreTermes-BoldItalic + +\starttypescript [serif] [times] + \definefontsynonym [Times-Roman] [texgyretermes-regular] [features=default] + \definefontsynonym [Times-Italic] [texgyretermes-italic] [features=default] + \definefontsynonym [Times-Bold] [texgyretermes-bold] [features=default] + \definefontsynonym [Times-BoldItalic] [texgyretermes-bolditalic] [features=default] + \definefontsynonym [Times-Caps] [texgyretermes-regular] [features=smallcaps] + \definefontsynonym [Times-Slanted] [Times-Italic] + \definefontsynonym [Times-BoldSlanted] [Times-BoldItalic] +\stoptypescript + +% TeXGyreHeros +% +% qtmr TeXGyreHeros-Regular +% qtmri TeXGyreHeros-Italic +% qtmb TeXGyreHeros-Bold +% qtmbi TeXGyreHeros-BoldItalic + +\starttypescript [serif] [helvetica] + \definefontsynonym [Helvetica] [texgyreheros-regular] [features=default] + \definefontsynonym [Helvetica-Oblique] [texgyreheros-italic] [features=default] + \definefontsynonym [Helvetica-Bold] [texgyreheros-bold] [features=default] + \definefontsynonym [Helvetica-BoldOblique] [texgyreheros-bolditalic] [features=default] + \definefontsynonym [Helvetica-Caps] [texgyreheros-regular] [features=smallcaps] +\stoptypescript + +% TeXGyreBonum +% +% qtmr TeXGyreBonum-Regular +% qtmri TeXGyreBonum-Italic +% qtmb TeXGyreBonum-Bold +% qtmbi TeXGyreBonum-BoldItalic + +\starttypescript [serif] [bookman] + \definefontsynonym [Bookman-Light] [texgyrebonum-regular] [features=default] + \definefontsynonym [Bookman-LightItalic] [texgyrebonum-italic] [features=default] + \definefontsynonym [Bookman-DemiBold] [texgyrebonum-bold] [features=default] + \definefontsynonym [Bookman-DemiBoldItalic] [texgyrebonum-bolditalic] [features=default] + \definefontsynonym [Bookman-Light-Caps] [texgyrebonum-regular] [features=smallcaps] + \definefontsynonym [Bookman-LightSlanted] [Bookman-LightItalic] [features=default] + \definefontsynonym [Bookman-DemiBoldSlanted] [Bookman-DemiBoldItalic] [features=default] +\stoptypescript + +% TeXGyreScola +% +% qcsr TeXGyreSchola-Regular +% qcsri TeXGyreSchola-Italic +% qcsb TeXGyreSchola-Bold +% qcsbi TeXGyreSchola-BoldItalic + +\starttypescript [serif] [schoolbook] + \definefontsynonym [Schoolbook-Roman] [texgyreschola-regular] [features=default] + \definefontsynonym [Schoolbook-Italic] [texgyreschola-italic] [features=default] + \definefontsynonym [Schoolbook-Bold] [texgyreschola-bold] [features=default] + \definefontsynonym [Schoolbook-BoldItalic] [texgyreschola-bolditalic] [features=default] + \definefontsynonym [Schoolbook-Roman-Caps] [texgyreschola-regular] [features=smallcaps] + \definefontsynonym [Schoolbook-Slanted] [Schoolbook-Italic] [features=default] + \definefontsynonym [Schoolbook-BoldSlanted] [Schoolbook-BoldItalic] [features=default] +\stoptypescript + +% TeXGyreAdventor +% +% qagr TeXGyreAdventor-Regular +% qagri TeXGyreAdventor-Italic +% qagb TeXGyreAdventor-Bold +% qagbi TeXGyreAdventor-BoldItalic + +% TeXGyreCursor +% +% crgr TeXGyreCursor-Regular +% crgri TeXGyreCursor-Italic +% crgb TeXGyreCursor-Bold +% crgbi TeXGyreCursor-BoldItalic + +\starttypescript [mono] [courier] [name] + \definefontsynonym [Courier] [texgyrecursor-regular] [features=default] + \definefontsynonym [Courier-Bold] [texgyrecursor-bold] [features=default] + \definefontsynonym [Courier-Oblique] [texgyrecursor-italic] [features=default] + \definefontsynonym [Courier-BoldOblique] [texgyrecursor-bolditalic] [features=default] + \fakecontrolspace +\stoptypescript + +% TeXGyreChorus +% +% qzcr TeXGyreChorus-Regular + +\starttypescript [calligraphy] [chancery] + \definefontsynonym [Chancery] [texgyrechorus-regular] [features=default] +\stoptypescript + +% Math Times (tx) + +\starttypescript [math] [times] [all] + \definefontsynonym [Times-Roman-Upright] [txr] + \definefontsynonym [Times-Roman-Italic] [txi] + \definefontsynonym [Times-Roman-Slanted] [txsl] + \definefontsynonym [Times-Roman-Caps] [txsc] + \definefontsynonym [Times-Companion-Upright] [tcxr] + \definefontsynonym [Times-Companion-Italic] [tcxi] + \definefontsynonym [Times-Companion-Slanted] [tcxsl] + \definefontsynonym [Times-Math-Italic] [txmi] + \definefontsynonym [Times-Math-Symbols] [txsy] + \definefontsynonym [Times-Math-Extension] [txex] + \definefontsynonym [Times-Math-SymbolsA] [txsya] + \definefontsynonym [Times-Math-SymbolsB] [txsyb] + \definefontsynonym [Times-Math-SymbolsC] [txsyc] + \definefontsynonym [Times-Math-Italic-A] [txmia] + \definefontsynonym [Times-Math-Extension-A] [txexa] + + \loadmapfile[original-youngryu-tx.map] + \usemathcollection[default] +\stoptypescript + +% Palatino Math (PX) + +\starttypescript [math] [palatino] [all] + \definefontsynonym [Palatino-Roman-Upright] [pxr] + \definefontsynonym [Palatino-Roman-Italic] [pxi] + \definefontsynonym [Palatino-Roman-Slanted] [pxsl] + \definefontsynonym [Palatino-Roman-Caps] [pxsc] + \definefontsynonym [Palatino-Companion-Upright] [pcxr] + \definefontsynonym [Palatino-Companion-Italic] [pcxi] + \definefontsynonym [Palatino-Companion-Slanted] [pcxsl] + \definefontsynonym [Palatino-Math-Italic] [pxmi] + \definefontsynonym [Palatino-Math-Symbols] [pxsy] + \definefontsynonym [Palatino-Math-Extension] [pxex] + \definefontsynonym [Palatino-Math-SymbolsA] [pxsya] + \definefontsynonym [Palatino-Math-SymbolsB] [pxsyb] + \definefontsynonym [Palatino-Math-SymbolsC] [pxsyc] + \definefontsynonym [Palatino-Math-Italic-A] [pxmia] + \definefontsynonym [Palatino-Math-Extension-A] [pxexa] + + \loadmapfile[original-youngryu-px.map] + \usemathcollection[default] +\stoptypescript + +% Antykwa Torunska (GUST) + +\starttypescript [serif] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] + \definefontsynonym [AntykwaTorunska-Bold] [AntykwaTorunska-Bold] [features=default] + \definefontsynonym [AntykwaTorunska-BoldItalic] [AntykwaTorunska-BoldItalic] [features=default] + \definefontsynonym [AntykwaTorunska-Light] [AntykwaTorunskaLight-Regular] [features=default] + \definefontsynonym [AntykwaTorunska-LightItalic] [AntykwaTorunskaLight-Italic] [features=default] + \definefontsynonym [AntykwaTorunska-Medium] [AntykwaTorunskaMed-Regular] [features=default] + \definefontsynonym [AntykwaTorunska-MedItalic] [AntykwaTorunskaMed-Italic] [features=default] + \definefontsynonym [AntykwaTorunska-Regular] [AntykwaTorunska-Regular] [features=default] + \definefontsynonym [AntykwaTorunska-Italic] [AntykwaTorunska-Italic] [features=default] + \definefontsynonym [AntykwaTorunska-CondBold] [AntykwaTorunskaCond-Bold] [features=default] + \definefontsynonym [AntykwaTorunska-CondBoldItalic] [AntykwaTorunskaCond-BoldItalic] [features=default] + \definefontsynonym [AntykwaTorunska-CondLight] [AntykwaTorunskaCondLight-Regular] [features=default] + \definefontsynonym [AntykwaTorunska-CondLightItalic] [AntykwaTorunskaCondLight-Italic] [features=default] + \definefontsynonym [AntykwaTorunska-CondMedium] [AntykwaTorunskaCondMed-Regular] [features=default] + \definefontsynonym [AntykwaTorunska-CondMedItalic] [AntykwaTorunskaCondMed-Italic] [features=default] + \definefontsynonym [AntykwaTorunska-CondRegular] [AntykwaTorunskaCond-Regular] [features=default] + \definefontsynonym [AntykwaTorunska-CondItalic] [AntykwaTorunskaCond-Italic] [features=default] + + \definefontsynonym [AntykwaTorunska-BoldCap] [AntykwaTorunska-Bold] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-BoldItalicCap] [AntykwaTorunska-BoldItalic] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-LightCap] [AntykwaTorunskaLight-Regular] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-LightItalicCap] [AntykwaTorunskaLight-Italic] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-MediumCap] [AntykwaTorunskaMed-Regular] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-MedItalicCap] [AntykwaTorunskaMed-Italic] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-Cap] [AntykwaTorunska-Regular] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-ItalicCap] [AntykwaTorunska-Italic] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-CondBoldCap] [AntykwaTorunskaCond-Bold] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-CondBoldItalicCap] [AntykwaTorunskaCond-BoldItalic] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-CondLightCap] [AntykwaTorunskaCondLight-Regular] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-CondLightItalicCap][AntykwaTorunskaCondLight-Italic] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-CondMediumCap] [AntykwaTorunskaCondMed-Regular] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-CondMedItalicCap] [AntykwaTorunskaCondMed-Italic] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-CondCap] [AntykwaTorunskaCond-Regular] [features=smallcaps] + \definefontsynonym [AntykwaTorunska-CondItalicCap] [AntykwaTorunskaCond-Italic] [features=smallcaps] +\stoptypescript + +\starttypescript [math] [antykwa-torunska] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-Regular] [rm-anttr] + \definefontsynonym [AntykwaTorunska-Math-Letters-RegularItalic] [mi-anttri] + \definefontsynonym [AntykwaTorunska-Math-Symbols-Regular] [sy-anttrz] + \definefontsynonym [AntykwaTorunska-Math-Extension-Regular] [ex-anttr] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-light] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-Light] [rm-anttl] + \definefontsynonym [AntykwaTorunska-Math-Letters-LightItalic] [mi-anttli] + \definefontsynonym [AntykwaTorunska-Math-Symbols-Light] [sy-anttlz] + \definefontsynonym [AntykwaTorunska-Math-Extension-Light] [ex-anttl] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-cond] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegular] [rm-anttcr] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondRegularItalic] [mi-anttcri] + \definefontsynonym [AntykwaTorunska-Math-Symbols-CondRegular] [sy-anttcrz] + \definefontsynonym [AntykwaTorunska-Math-Extension-CondRegular] [ex-anttcr] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-lightcond] [default] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondLight] [rm-anttcl] + \definefontsynonym [AntykwaTorunska-Math-Letters-CondLightItalic] [mi-anttcli] + \definefontsynonym [AntykwaTorunska-Math-Symbols-CondLight] [sy-anttclz] + \definefontsynonym [AntykwaTorunska-Math-Extension-CondLight] [ex-anttcl] +\stoptypescript + +\starttypescript [math] [antykwa-torunska,antykwa-torunska-light,antykwa-torunska-cond,antykwa-torunska-lightcond] + \usemathcollection[default] + \loadmapfile[antt-rm.map] + \loadmapfile[antt-mi.map] + \loadmapfile[antt-sy.map] + \loadmapfile[antt-ex.map] +\stoptypescript + +% Antykwa Poltawskiego (GUST) + +\starttypescript [serif] [antykwa-poltawskiego] + \definefontsynonym [AntykwaPoltawskiego-Regular] [antpr] + \definefontsynonym [AntykwaPoltawskiego-Bold] [antpb] + \definefontsynonym [AntykwaPoltawskiego-Italic] [antpri] + \definefontsynonym [AntykwaPoltawskiego-BoldItalic] [antpbi] +\stoptypescript + +% Iwona (JMN) + +% maybe this will change in Iwona-Math-Letters and Iwona-Math-Letters-Italic + +\starttypescript [sans] [iwona-light,iwona,iwona-medium,iwona-heavy,iwona-light-cond,iwona-cond,iwona-medium-cond,iwona-heavy-cond] + \definefontsynonym [Iwona-Regular] [Iwona-Regular] [features=default] + \definefontsynonym [Iwona-RegularItalic] [Iwona-Italic] [features=default] + \definefontsynonym [Iwona-Bold] [Iwona-Bold] [features=default] + \definefontsynonym [Iwona-BoldItalic] [Iwona-BoldItalic] [features=default] + \definefontsynonym [Iwona-Light] [IwonaLight-Regular] [features=default] + \definefontsynonym [Iwona-LightItalic] [IwonaLight-Italic] [features=default] + \definefontsynonym [Iwona-Medium] [IwonaMedium-Regular] [features=default] + \definefontsynonym [Iwona-MediumItalic] [IwonaMedium-Italic] [features=default] + \definefontsynonym [Iwona-Heavy] [IwonaHeavy-Regular] [features=default] + \definefontsynonym [Iwona-HeavyItalic] [IwonaHeavy-Italic] [features=default] + + \definefontsynonym [Iwona-CondLight] [IwonaCond-Regular] [features=default] + \definefontsynonym [Iwona-CondRegular] [IwonaCond-Italic] [features=default] + \definefontsynonym [Iwona-CondMedium] [IwonaCond-Bold] [features=default] + \definefontsynonym [Iwona-CondBold] [IwonaCond-BoldItalic] [features=default] + \definefontsynonym [Iwona-CondHeavy] [IwonaCondLight-Regular] [features=default] + \definefontsynonym [Iwona-CondLightItalic] [IwonaCondLight-Italic] [features=default] + \definefontsynonym [Iwona-CondRegularItalic] [IwonaCondMedium-Regular] [features=default] + \definefontsynonym [Iwona-CondMediumItalic] [IwonaCondMedium-Italic] [features=default] + \definefontsynonym [Iwona-CondBoldItalic] [IwonaCondHeavy-Regular] [features=default] + \definefontsynonym [Iwona-CondHeavyItalic] [IwonaCondHeavy-Italic] [features=default] + + \definefontsynonym [Iwona-CapsLight] [Iwona-Regular] [features=smallcaps] + \definefontsynonym [Iwona-CapsRegular] [Iwona-Italic] [features=smallcaps] + \definefontsynonym [Iwona-CapsMedium] [Iwona-Bold] [features=smallcaps] + \definefontsynonym [Iwona-CapsBold] [Iwona-BoldItalic] [features=smallcaps] + \definefontsynonym [Iwona-CapsHeavy] [IwonaLight-Regular] [features=smallcaps] + \definefontsynonym [Iwona-CapsLightItalic] [IwonaLight-Italic] [features=smallcaps] + \definefontsynonym [Iwona-CapsRegularItalic] [IwonaMedium-Regular] [features=smallcaps] + \definefontsynonym [Iwona-CapsMediumItalic] [IwonaMedium-Italic] [features=smallcaps] + \definefontsynonym [Iwona-CapsBoldItalic] [IwonaHeavy-Regular] [features=smallcaps] + \definefontsynonym [Iwona-CapsHeavyItalic] [IwonaHeavy-Italic] [features=smallcaps] + + \definefontsynonym [Iwona-CondCapsLight] [IwonaCond-Regular] [features=smallcaps] + \definefontsynonym [Iwona-CondCapsRegular] [IwonaCond-Italic] [features=smallcaps] + \definefontsynonym [Iwona-CondCapsMedium] [IwonaCond-Bold] [features=smallcaps] + \definefontsynonym [Iwona-CondCapsBold] [IwonaCond-BoldItalic] [features=smallcaps] + \definefontsynonym [Iwona-CondCapsHeavy] [IwonaCondLight-Regular] [features=smallcaps] + \definefontsynonym [Iwona-CondCapsLightItalic] [IwonaCondLight-Italic] [features=smallcaps] + \definefontsynonym [Iwona-CondCapsRegularItalic] [IwonaCondMedium-Regular] [features=smallcaps] + \definefontsynonym [Iwona-CondCapsMediumItalic] [IwonaCondMedium-Italic] [features=smallcaps] + \definefontsynonym [Iwona-CondCapsBoldItalic] [IwonaCondHeavy-Regular] [features=smallcaps] + \definefontsynonym [Iwona-CondCapsHeavyItalic] [IwonaCondHeavy-Italic] [features=smallcaps] +\stoptypescript + +\starttypescript [math] [iwona] [default] + \definefontsynonym [Iwona-Math-Letters-Regular] [rm-iwonar] + \definefontsynonym [Iwona-Math-Letters-RegularItalic] [mi-iwonari] + \definefontsynonym [Iwona-Math-Symbols-Regular] [sy-iwonarz] + \definefontsynonym [Iwona-Math-Extension-Regular] [ex-iwonar] +\stoptypescript + +\starttypescript [math] [iwona-light] [default] + \definefontsynonym [Iwona-Math-Letters-Light] [rm-iwonal] + \definefontsynonym [Iwona-Math-Letters-LightItalic] [mi-iwonali] + \definefontsynonym [Iwona-Math-Symbols-Light] [sy-iwonalz] + \definefontsynonym [Iwona-Math-Extension-Light] [ex-iwonal] +\stoptypescript + +\starttypescript [math] [iwona-medium] [default] + \definefontsynonym [Iwona-Math-Letters-Medium] [rm-iwonam] + \definefontsynonym [Iwona-Math-Letters-MediumItalic] [mi-iwonami] + \definefontsynonym [Iwona-Math-Symbols-Medium] [sy-iwonamz] + \definefontsynonym [Iwona-Math-Extension-Medium] [ex-iwonam] +\stoptypescript + +\starttypescript [math] [iwona-heavy] [default] + \definefontsynonym [Iwona-Math-Letters-Heavy] [rm-iwonah] + \definefontsynonym [Iwona-Math-Letters-HeavyItalic] [mi-iwonahi] + \definefontsynonym [Iwona-Math-Symbols-Heavy] [sy-iwonahz] + \definefontsynonym [Iwona-Math-Extension-Heavy] [ex-iwonah] +\stoptypescript + +\starttypescript [math] [iwona,iwona-light,iwona-medium,iwona-heavy] [default] + \usemathcollection[default] + \loadmapfile[iwona-rm.map] + \loadmapfile[iwona-mi.map] + \loadmapfile[iwona-sy.map] + \loadmapfile[iwona-ex.map] +\stoptypescript + +% Kurier (JMN) / no open type fonts + +\starttypescript [sans] [kurier-light,kurier,kurier-medium] + \definefontsynonym[Kurier-Light] [kurierl] + \definefontsynonym[Kurier-Regular] [kurierr] + \definefontsynonym[Kurier-Medium] [kurierm] + \definefontsynonym[Kurier-Bold] [kurierb] + \definefontsynonym[Kurier-Heavy] [kurierh] + \definefontsynonym[Kurier-LightItalic] [kurierli] + \definefontsynonym[Kurier-RegularItalic] [kurierri] + \definefontsynonym[Kurier-MediumItalic] [kuriermi] + \definefontsynonym[Kurier-BoldItalic] [kurierbi] + \definefontsynonym[Kurier-HeavyItalic] [kurierhi] +\stoptypescript + +\starttypescript [math] [kurier] [default] + \definefontsynonym [Kurier-Math-Letters-Regular] [rm-kurierr] + \definefontsynonym [Kurier-Math-Letters-RegularItalic] [mi-kurierri] + \definefontsynonym [Kurier-Math-Symbols-Regular] [sy-kurierrz] + \definefontsynonym [Kurier-Math-Extension-Regular] [ex-kurierr] +\stoptypescript + +\starttypescript [math] [kurier-light] [default] + \definefontsynonym [Kurier-Math-Letters-Light] [rm-kurierl] + \definefontsynonym [Kurier-Math-Letters-LightItalic] [mi-kurierli] + \definefontsynonym [Kurier-Math-Symbols-Light] [sy-kurierlz] + \definefontsynonym [Kurier-Math-Extension-Light] [ex-kurierl] +\stoptypescript + +\starttypescript [math] [kurier-medium] [default] + \definefontsynonym [Kurier-Math-Letters-Medium] [rm-kurierm] + \definefontsynonym [Kurier-Math-Letters-MediumItalic] [mi-kuriermi] + \definefontsynonym [Kurier-Math-Symbols-Medium] [sy-kuriermz] + \definefontsynonym [Kurier-Math-Extension-medium] [ex-kurierm] +\stoptypescript + +\starttypescript [math] [kurier,kurier-light,kurier-medium] [default] + \loadmapfile[kurier-rm.map] + \loadmapfile[kurier-mi.map] + \loadmapfile[kurier-sy.map] + \loadmapfile[kurier-ex.map] +\stoptypescript + +% Whatever else we need: + +\starttypescript + \definefontsynonym [ZapfDingbats] [uzdr] + \definefontsynonym [RalfSmithFormalScript] [rsfs10] + \definefontsynonym [MartinVogel] [fmvr8x] +\stoptypescript + +\stoptypescriptcollection + +\endinput diff --git a/tex/context/base/type-siz.tex b/tex/context/base/type-siz.tex index 6a2e35b30..018f979bb 100644 --- a/tex/context/base/type-siz.tex +++ b/tex/context/base/type-siz.tex @@ -394,15 +394,18 @@ \starttypescript [math] [modern,computer-modern,latin-modern] [size] - % hack to prevent mapping of filenames, watch the space! - - \definefontsynonym[xcmr12][cmr12 ] - \definefontsynonym[xcmr10][cmr10 ] - \definefontsynonym[xcmr9] [cmr9 ] - \definefontsynonym[xcmr8] [cmr8 ] - \definefontsynonym[xcmr7] [cmr7 ] - \definefontsynonym[xcmr6] [cmr6 ] - \definefontsynonym[xcmr5] [cmr5 ] + % hack to prevent mapping of filenames, watch the space! before + % latin modern came aroudn we needed this trick to make sure that + % we loaded the raw cmr12 etc instead of the ones mapped onto + % an encoding + + % \definefontsynonym[xcmr12][cmr12 ] + % \definefontsynonym[xcmr10][cmr10 ] + % \definefontsynonym[xcmr9] [cmr9 ] + % \definefontsynonym[xcmr8] [cmr8 ] + % \definefontsynonym[xcmr7] [cmr7 ] + % \definefontsynonym[xcmr6] [cmr6 ] + % \definefontsynonym[xcmr5] [cmr5 ] \definebodyfont [12pt] [mm] [mr=xcmr12, diff --git a/tex/context/base/type-syn.tex b/tex/context/base/type-syn.tex index c5514c65f..b7e9335df 100644 --- a/tex/context/base/type-syn.tex +++ b/tex/context/base/type-syn.tex @@ -13,37 +13,6 @@ \starttypescriptcollection[synonyms] -% Simple Minded Fonts / to be redone so that it's not bound to modern - -\starttypescript [serif] [simple] [name] - \definefontsynonym [Serif] [Simple] - \definefontsynonym [SerifBold] [Serif] - \definefontsynonym [SerifItalic] [Serif] - \definefontsynonym [SerifSlanted] [Serif] - \definefontsynonym [SerifBoldItalic] [Serif] - \definefontsynonym [SerifBoldSlanted] [Serif] - \definefontsynonym [SerifCaps] [Serif] -\stoptypescript - -% \starttypescript [sans] [simple] [name] -% \definefontsynonym [Sans] [Simple] -% \definefontsynonym [SansBold] [Sans] -% \definefontsynonym [SansItalic] [Sans] -% \definefontsynonym [SansSlanted] [Sans] -% \definefontsynonym [SansBoldItalic] [Sans] -% \definefontsynonym [SansBoldSlanted] [Sans] -% \definefontsynonym [SansCaps] [Sans] -% \stoptypescript - -% \starttypescript [mono] [simple] [name] -% \definefontsynonym [Mono] [Simple] -% \definefontsynonym [MonoBold] [Mono] -% \definefontsynonym [MonoItalic] [Mono] -% \definefontsynonym [MonoSlanted] [Mono] -% \definefontsynonym [MonoBoldItalic] [Mono] -% \definefontsynonym [MonoBoldSlanted] [Mono] -% \definefontsynonym [MonoCaps] [Mono] -% \stoptypescript % Computer Modern Roman : Donald Knuth % Latin Modern: LM Font Revision Team @@ -819,13 +788,6 @@ \definefontsynonym [SerifCaps] [Times-Roman] \stoptypescript -% \starttypescript [math] [times] [name] -% \definefontsynonym [MathRoman] [Times-MathRoman] -% \definefontsynonym [MathExtension] [Times-MathExtension] -% \definefontsynonym [MathItalic] [Times-MathItalic] -% \definefontsynonym [MathSymbol] [Times-MathSymbol] -% \stoptypescript - \starttypescript [math] [times] [name] \definefontsynonym [MathRoman] [Times-Roman-Upright] \definefontsynonym [MathExtension] [Times-Math-Extension] diff --git a/tex/context/base/type-tmf.tex b/tex/context/base/type-tmf.tex new file mode 100644 index 000000000..db6240ba5 --- /dev/null +++ b/tex/context/base/type-tmf.tex @@ -0,0 +1,1073 @@ +%D \module +%D [ file=type-tmf, +%D version=2007.07.30, +%D title=\CONTEXT\ Typescript Macros, +%D subtitle=Core \TEX\ Fonts, +%D author=Hans Hagen, +%D date=\currentdate, +%D copyright={PRAGMA / Hans Hagen \& Ton Otten}] +%C +%C This module is part of the \CONTEXT\ macro||package and is +%C therefore copyrighted by \PRAGMA. See mreadme.pdf for +%C details. + +\starttypescriptcollection[synonyms] + +% Computer Modern Roman : Donald Knuth +% Latin Modern: LM Font Revision Team + +% LM math vs CM math (analysis by Taco): +% +% lmex10.tfm % identical +% lmmi5.tfm % identical +% lmmi6.tfm % identical +% lmmi7.tfm % identical +% lmmi8.tfm % identical +% lmmi9.tfm % identical +% lmmi10.tfm % identical +% lmmi12.tfm % identical +% lmmib10.tfm % identical +% lmsy5.tfm % extra chars: 254,255 (octal) +% lmsy6.tfm % extra chars: 254,255 (octal) +% lmsy7.tfm % extra chars: 254,255 (octal) +% lmsy8.tfm % extra chars: 254,255 (octal) +% lmsy9.tfm % extra chars: 254,255 (octal) +% lmsy10.tfm % extra chars: 254,255 (octal) +% lmbsy10.tfm % extra chars: 254,255 (octal) +% +% From the 'AMS' set: +% +% lmmib5.tfm % identical +% lmmib7.tfm % identical +% lmbsy5.tfm % extra chars: 254,255 (octal) +% lmbsy7.tfm % extra chars: 254,255 (octal) +% +% The two extra characters are: +% +% /lessorequalslant +% /greaterorequalslant + +\starttypescript [serif] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [Serif] [LMRoman-Regular] + \definefontsynonym [SerifBold] [LMRoman-Bold] + \definefontsynonym [SerifItalic] [LMRoman-Italic] + \definefontsynonym [SerifSlanted] [LMRoman-Oblique] + \definefontsynonym [SerifBoldItalic] [LMRoman-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [LMRoman-BoldOblique] + \definefontsynonym [SerifCaps] [LMRoman-CapsRegular] + \definefontsynonym [SerifCapsSlanted] [LMRoman-CapsOblique] +\stoptypescript + +\starttypescript [sans] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [Sans] [LMSans-Regular] + \definefontsynonym [SansBold] [LMSans-Bold] + \definefontsynonym [SansItalic] [LMSans-Oblique] + \definefontsynonym [SansSlanted] [LMSans-Oblique] + \definefontsynonym [SansBoldItalic] [LMSans-BoldOblique] + \definefontsynonym [SansBoldSlanted] [LMSans-BoldOblique] + \definefontsynonym [SansCaps] [LMSans-Regular] + \definefontsynonym [SansCapsSlanted] [LMSans-Oblique] +\stoptypescript + +\starttypescript [mono] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [Mono] [LMTypewriter-Regular] + \definefontsynonym [MonoBold] [LMTypewriter-Dark] + \definefontsynonym [MonoItalic] [LMTypewriter-Italic] + \definefontsynonym [MonoSlanted] [LMTypewriter-Oblique] + \definefontsynonym [MonoBoldItalic] [LMTypewriter-DarkOblique] + \definefontsynonym [MonoBoldSlanted] [LMTypewriter-DarkOblique] + \definefontsynonym [MonoCaps] [LMTypewriter-CapsRegular] + \definefontsynonym [MonoCapsSlanted] [LMTypewriter-CapsOblique] + \definefontsynonym [MonoVariable] [LMTypewriterVarWd-Regular] +\stoptypescript + +\starttypescript [math] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [MathRoman] [LMRoman-Regular] + \definefontsynonym [MathExtension] [LMMathExtension-Regular] + \definefontsynonym [MathItalic] [LMMathItalic-Italic] + \definefontsynonym [MathSymbol] [LMMathSymbols-Italic] +\stoptypescript + +% maybe we can by now just use: (to be tested first) + +% \starttypescript [math] [modern,computer-modern,latin-modern] [name] +% \definefontsynonym[xcmr12][LMRoman-Regular12] +% \definefontsynonym[xcmr10][LMRoman-Regular10] +% \definefontsynonym[xcmr9] [LMRoman-Regular9] +% \definefontsynonym[xcmr8] [LMRoman-Regular8] +% \definefontsynonym[xcmr7] [LMRoman-Regular7] +% \definefontsynonym[xcmr6] [LMRoman-Regular6] +% \definefontsynonym[xcmr5] [LMRoman-Regular5] +% \stoptypescript + +\starttypescript [math] [modern,computer-modern,latin-modern] [name] + \definefontsynonym[xcmr12][rm-lmr12] + \definefontsynonym[xcmr10][rm-lmr10] + \definefontsynonym[xcmr9] [rm-lmr9] + \definefontsynonym[xcmr8] [rm-lmr8] + \definefontsynonym[xcmr7] [rm-lmr7] + \definefontsynonym[xcmr6] [rm-lmr6] + \definefontsynonym[xcmr5] [rm-lmr5] +\stoptypescript + +\starttypescript [boldmath] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [MathRoman] [LMRoman-Bold] + \definefontsynonym [MathExtension] [LMMathExtension-Regular] + \definefontsynonym [MathItalic] [LMMathItalic-BoldItalic] + \definefontsynonym [MathSymbol] [LMMathSymbols-BoldItalic] +\stoptypescript + +\starttypescript [bfmath] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [MathRomanBold] [LMRoman-Bold] + \definefontsynonym [MathExtension] [LMMathExtension-Regular] + \definefontsynonym [MathItalicBold] [LMMathItalic-BoldItalic] + \definefontsynonym [MathSymbolBold] [LMMathSymbols-BoldItalic] +\stoptypescript + +\starttypescript [math,boldmath,bfmath] [modern,computer-modern,latin-modern] [name] + \usemathcollection[default] +\stoptypescript + +\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] [name] + \definefontsynonym [Serif] [LMTypewriterVarWd-Regular] + \definefontsynonym [SerifBold] [LMTypewriterVarWd-Oblique] + \definefontsynonym [SerifItalic] [LMTypewriterVarWd-Oblique] + \definefontsynonym [SerifSlanted] [LMTypewriterVarWd-Dark] + \definefontsynonym [SerifBoldItalic] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [SerifBoldSlanted] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [SerifCaps] [LMTypewriterVarWd-Regular] + \definefontsynonym [SerifCapsSlanted] [LMTypewriterVarWd-Oblique] +\stoptypescript + +\starttypescript [mono] [modern-cond,computer-modern-cond,latin-modern-cond,modern-lightcond,computer-modern-lightcond,latin-modern-lightcond] [name] + \definefontsynonym [Mono] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoBold] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoItalic] [LMTypewriter-LightCondensedOblique] + \definefontsynonym [MonoSlanted] [LMTypewriter-LightCondensedOblique] + \definefontsynonym [MonoBoldItalic] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoBoldSlanted] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoCaps] [LMTypewriter-LightCondensed] + \definefontsynonym [MonoCapsSlanted] [LMTypewriter-LightCondensed] +\stoptypescript + +\starttypescript [mono] [modern-light,computer-modern-light,latin-modern-light] [name] + \definefontsynonym [Mono] [LMTypewriter-Light] + \definefontsynonym [MonoBold] [LMTypewriter-Light] + \definefontsynonym [MonoItalic] [LMTypewriter-LightOblique] + \definefontsynonym [MonoSlanted] [LMTypewriter-LightOblique] + \definefontsynonym [MonoBoldItalic] [LMTypewriter-Light] + \definefontsynonym [MonoBoldSlanted] [LMTypewriter-Light] + \definefontsynonym [MonoCaps] [LMTypewriter-Light] + \definefontsynonym [MonoCapsSlanted] [LMTypewriter-Light] +\stoptypescript + +% Later we will map the real fonts, here we just map synonyms. + +\starttypescript [serif] [modern,latin-modern] + \definefontsynonym [LMRoman-DemiOblique] [LMRoman10-DemiOblique] + \definefontsynonym [LMRoman-Bold] [LMRoman10-Bold] + \definefontsynonym [LMRoman-BoldItalic] [LMRoman10-BoldItalic] + \definefontsynonym [LMRoman-BoldOblique] [LMRoman10-BoldOblique] + \definefontsynonym [LMRoman-CapsRegular] [LMRoman10-CapsRegular] + \definefontsynonym [LMRoman-CapsOblique] [LMRoman10-CapsOblique] + \definefontsynonym [LMRoman-Regular] [LMRoman10-Regular] + \definefontsynonym [LMRoman-Italic] [LMRoman10-Italic] + \definefontsynonym [LMRoman-Oblique] [LMRoman10-Oblique] +\stoptypescript + +\starttypescript [sans] [modern,latin-modern] + \definefontsynonym [LMSans-Regular] [LMSans10-Regular] + \definefontsynonym [LMSans-BoldOblique] [LMSans10-BoldOblique] + \definefontsynonym [LMSans-Bold] [LMSans10-Bold] + \definefontsynonym [LMSans-DemiCondensed] [LMSans10-DemiCondensed] + \definefontsynonym [LMSans-DemiCondensedOblique] [LMSans10-DemiCondensedOblique] + \definefontsynonym [LMSans-Oblique] [LMSans10-Oblique] +\stoptypescript + +\starttypescript [mono] [modern,latin-modern,modern-vari,latin-modern-vari,modern-cond,latin-modern-cond] + \definefontsynonym [LMTypewriter-CapsRegular] [LMTypewriter10-CapsRegular] + \definefontsynonym [LMTypewriter-CapsOblique] [LMTypewriter10-CapsOblique] + \definefontsynonym [LMTypewriter-Light] [LMTypewriter10-Light] + \definefontsynonym [LMTypewriter-LightOblique] [LMTypewriter10-LightOblique] + \definefontsynonym [LMTypewriter-LightCondensed] [LMTypewriter10-LightCondensed] + \definefontsynonym [LMTypewriter-LightCondensedOblique] [LMTypewriter10-LightCondensedOblique] + \definefontsynonym [LMTypewriter-Dark] [LMTypewriter10-Dark] + \definefontsynonym [LMTypewriter-DarkOblique] [LMTypewriter10-DarkOblique] + \definefontsynonym [LMTypewriter-Regular] [LMTypewriter10-Regular] + \definefontsynonym [LMTypewriter-Italic] [LMTypewriter10-Italic] + \definefontsynonym [LMTypewriter-Oblique] [LMTypewriter10-Oblique] + \definefontsynonym [LMTypewriterVarWd-Regular] [LMTypewriterVarWd10-Regular] + \definefontsynonym [LMTypewriterVarWd-Oblique] [LMTypewriterVarWd10-Oblique] + \definefontsynonym [LMTypewriterVarWd-Light] [LMTypewriterVarWd10-Light] + \definefontsynonym [LMTypewriterVarWd-LightOblique] [LMTypewriterVarWd10-LightOblique] + \definefontsynonym [LMTypewriterVarWd-Dark] [LMTypewriterVarWd10-Dark] + \definefontsynonym [LMTypewriterVarWd-DarkOblique] [LMTypewriterVarWd10-DarkOblique] +\stoptypescript + +\starttypescript [serif] [modern,computer-modern,latin-modern] + \definefontsynonym [ComputerModern] [LMRoman-Regular] + \definefontsynonym [ComputerModern-Italic] [LMRoman-Italic] + \definefontsynonym [ComputerModern-Slanted] [LMRoman-Oblique] + \definefontsynonym [ComputerModern-Bold] [LMRoman-Bold] + \definefontsynonym [ComputerModern-BoldItalic] [LMRoman-BoldItalic] + \definefontsynonym [ComputerModern-BoldSlanted] [LMRoman-BoldOblique] + \definefontsynonym [ComputerModern-Caps] [LMRoman-CapsRegular] + \definefontsynonym [ComputerModern-CapsSlanted] [LMRoman-CapsOblique] +\stoptypescript + +\starttypescript [sans] [modern,computer-modern,latin-modern] + \definefontsynonym [ComputerModernSans] [LMSans-Regular] + \definefontsynonym [ComputerModernSans-Italic] [LMSans-Oblique] + \definefontsynonym [ComputerModernSans-Slanted] [LMSans-Oblique] + \definefontsynonym [ComputerModernSans-Bold] [LMSans-Bold] + \definefontsynonym [ComputerModernSans-BoldItalic] [LMSans-BoldOblique] + \definefontsynonym [ComputerModernSans-BoldSlanted] [LMSans-BoldOblique] + \definefontsynonym [ComputerModernSans-Caps] [LMSans-Regular] % [LMSans-CapsRegular] + \definefontsynonym [ComputerModernSans-CapsSlanted] [LMSans-Oblique] % [LMSans-CapsOblique] +\stoptypescript + +\starttypescript [mono] [modern,computer-modern,latin-modern] + \definefontsynonym [ComputerModernMono] [LMTypewriter-Regular] + \definefontsynonym [ComputerModernMono-Italic] [LMTypewriter-Italic] + \definefontsynonym [ComputerModernMono-Slanted] [LMTypewriter-Oblique] + \definefontsynonym [ComputerModernMono-Bold] [LMTypewriter-Dark] + \definefontsynonym [ComputerModernMono-BoldItalic] [LMTypewriter-DarkOblique] % ! + \definefontsynonym [ComputerModernMono-BoldSlanted] [LMTypewriter-DarkOblique] + \definefontsynonym [ComputerModernMono-Caps] [LMTypewriter-CapsRegular] + \definefontsynonym [ComputerModernMono-CapsSlanted] [LMTypewriter-CapsOblique] + \definefontsynonym [ComputerModernMono-Variable] [LMTypewriterVarWd-Regular] +\stoptypescript + +\starttypescript [serif] [modern-vari,computer-modern-vari,latin-modern-vari] + \definefontsynonym [ComputerModernVariable] [LMTypewriterVarWd-Regular] + \definefontsynonym [ComputerModernVariable-Italic] [LMTypewriterVarWd-Oblique] + \definefontsynonym [ComputerModernVariable-Slanted] [LMTypewriterVarWd-Oblique] + \definefontsynonym [ComputerModernVariable-Bold] [LMTypewriterVarWd-Dark] + \definefontsynonym [ComputerModernVariable-BoldItalic] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [ComputerModernVariable-BoldSlanted] [LMTypewriterVarWd-DarkOblique] + \definefontsynonym [ComputerModernVariable-Caps] [LMTypewriterVarWd-Regular] + \definefontsynonym [ComputerModernVariable-CapsSlanted] [LMTypewriterVarWd-Oblique] +\stoptypescript + +\starttypescript [math] [modern,latin-modern] + \definefontsynonym [LMMathSymbols-BoldItalic] [LMMathSymbols10-BoldItalic] + \definefontsynonym [LMMathSymbols-Italic] [LMMathSymbols10-Italic] + \definefontsynonym [LMMathExtension-Regular] [LMMathExtension10-Regular] + \definefontsynonym [LMMathItalic-Italic] [LMMathItalic10-Italic] + \definefontsynonym [LMMathItalic-BoldItalic] [LMMathItalic10-BoldItalic] +\stoptypescript + +\starttypescript [serif] [modern,latin-modern,computer-modern] + \definefontsynonym [cmr5] [LMRoman5-Regular] + \definefontsynonym [cmr6] [LMRoman6-Regular] + \definefontsynonym [cmr7] [LMRoman7-Regular] + \definefontsynonym [cmr8] [LMRoman8-Regular] + \definefontsynonym [cmr9] [LMRoman9-Regular] + \definefontsynonym [cmr10] [LMRoman10-Regular] + \definefontsynonym [cmr12] [LMRoman12-Regular] + \definefontsynonym [cmr17] [LMRoman17-Regular] + \definefontsynonym [cmbx5] [LMRoman5-Bold] + \definefontsynonym [cmbx6] [LMRoman6-Bold] + \definefontsynonym [cmbx7] [LMRoman7-Bold] + \definefontsynonym [cmbx8] [LMRoman8-Bold] + \definefontsynonym [cmbx9] [LMRoman9-Bold] + \definefontsynonym [cmbx10] [LMRoman10-Bold] + \definefontsynonym [cmbx12] [LMRoman12-Bold] + \definefontsynonym [cmsl10] [LMRoman10-Oblique] + \definefontsynonym [cmsl12] [LMRoman12-Oblique] + \definefontsynonym [cmsl17] [LMRoman17-Oblique] + \definefontsynonym [cmsl8] [LMRoman8-Oblique] + \definefontsynonym [cmsl9] [LMRoman9-Oblique] + \definefontsynonym [cmti7] [LMRoman7-Italic] + \definefontsynonym [cmti8] [LMRoman8-Italic] + \definefontsynonym [cmti9] [LMRoman9-Italic] + \definefontsynonym [cmti10] [LMRoman10-Italic] + \definefontsynonym [cmti12] [LMRoman12-Italic] + \definefontsynonym [cmbsl10] [LMRoman10-DemiOblique] + \definefontsynonym [cmbxsl10] [LMRoman10-BoldOblique] + \definefontsynonym [cmbxti10] [LMRoman10-BoldItalic] + \definefontsynonym [cmcsc10] [LMRoman10-CapsRegular] + \definefontsynonym [cmcscsl10][LMRoman10-CapsOblique] + + %definefontsynonym [cmb10] +\stoptypescript + +\starttypescript [sans] [modern,latin-modern,computer-modern] + \definefontsynonym [cmss8] [LMSans8-Regular] + \definefontsynonym [cmss9] [LMSans9-Regular] + \definefontsynonym [cmss10] [LMSans10-Regular] + \definefontsynonym [cmss12] [LMSans12-Regular] + \definefontsynonym [cmss17] [LMSans17-Regular] + \definefontsynonym [cmssi10] [LMSans10-Oblique] + \definefontsynonym [cmssi12] [LMSans12-Oblique] + \definefontsynonym [cmssi17] [LMSans17-Oblique] + \definefontsynonym [cmssi8] [LMSans8-Oblique] + \definefontsynonym [cmssi9] [LMSans9-Oblique] + \definefontsynonym [cmssq8] [LMSansQuotation8-Regular] + \definefontsynonym [cmssqb8] [LMSansQuotation8-Bold] + \definefontsynonym [cmssqbi8] [LMSansQuotation8-BoldOblique] + \definefontsynonym [cmssqi8] [LMSansQuotation8-Oblique] + \definefontsynonym [cmssbx10] [LMSans10-Bold] + \definefontsynonym [cmssdc10] [LMSans10-DemiCondensed] + \definefontsynonym [cmssbi10] [LMSans10-BoldOblique] + \definefontsynonym [cmssdi10] [LMSans10-DemiCondensedOblique] +\stoptypescript + +\starttypescript [mono] [modern,latin-modern,computer-modern] + \definefontsynonym [cmtt8] [LMTypewriter8-Regular] + \definefontsynonym [cmtt9] [LMTypewriter9-Regular] + \definefontsynonym [cmtt10] [LMTypewriter10-Regular] + \definefontsynonym [cmtt12] [LMTypewriter12-Regular] + \definefontsynonym [cmitt10] [LMTypewriter10-Italic] + \definefontsynonym [cmsltt10] [LMTypewriter10-Oblique] + \definefontsynonym [cmvtt10] [LMTypewriterVarWd10-Regular] + \definefontsynonym [cmvtti10] [LMTypewriterVarWd10-Oblique] + \definefontsynonym [cmtcsc10] [LMTypewriter10-CapsRegular] +\stoptypescript + +\starttypescript [math] [modern,latin-modern,computer-modern] + \definefontsynonym [cmbsy5] [LMMathSymbols5-BoldItalic] + \definefontsynonym [cmbsy7] [LMMathSymbols7-BoldItalic] + \definefontsynonym [cmbsy10] [LMMathSymbols10-BoldItalic] + \definefontsynonym [cmsy5] [LMMathSymbols5-Italic] + \definefontsynonym [cmsy6] [LMMathSymbols6-Italic] + \definefontsynonym [cmsy7] [LMMathSymbols7-Italic] + \definefontsynonym [cmsy8] [LMMathSymbols8-Italic] + \definefontsynonym [cmsy9] [LMMathSymbols9-Italic] + \definefontsynonym [cmsy10] [LMMathSymbols10-Italic] + \definefontsynonym [cmex10] [LMMathExtension10-Regular] + \definefontsynonym [cmmi5] [LMMathItalic5-Italic] + \definefontsynonym [cmmi6] [LMMathItalic6-Italic] + \definefontsynonym [cmmi7] [LMMathItalic7-Italic] + \definefontsynonym [cmmi8] [LMMathItalic8-Italic] + \definefontsynonym [cmmi9] [LMMathItalic9-Italic] + \definefontsynonym [cmmi10] [LMMathItalic10-Italic] + \definefontsynonym [cmmi12] [LMMathItalic12-Italic] + \definefontsynonym [cmmib5] [LMMathItalic5-BoldItalic] + \definefontsynonym [cmmib7] [LMMathItalic7-BoldItalic] + \definefontsynonym [cmmib10] [LMMathItalic10-BoldItalic] +\stoptypescript + +% This will change some day. + +\starttypescript [math] [modern,computer-modern,latin-modern] [name] + \definefontsynonym [OldStyle] [MathItalic] + \definefontsynonym [Fraktur] [eufm10] + \definefontsynonym [Blackboard] [msbm10] + \definefontsynonym [Gothic] [eufm10] + \definefontsynonym [Calligraphic] [cmsy10] +\stoptypescript + +% Concrete Modern Roman : Donald Knuth + +\starttypescript [serif] [concrete] [name] + \definefontsynonym [Serif] [ComputerConcrete] + \definefontsynonym [SerifBold] [ComputerConcrete] + \definefontsynonym [SerifItalic] [ComputerConcrete-Italic] + \definefontsynonym [SerifSlanted] [ComputerConcrete-Slanted] + \definefontsynonym [SerifBoldItalic] [ComputerConcrete-Italic] + \definefontsynonym [SerifBoldSlanted] [ComputerConcrete-Slanted] + \definefontsynonym [SerifCaps] [ComputerConcrete-Caps] +\stoptypescript + +% Euler : Hermann Zapf + +\starttypescript [math] [euler] [name] + \definefontsynonym [MathRoman] [Euler-Roman] % mr + \definefontsynonym [MathItalic] [Euler-Fraktur] % mi + \definefontsynonym [MathExtension] [Euler-Extension] % ex + \definefontsynonym [MathSymbol] [Euler-Symbol] % sy +\stoptypescript + +\starttypescript [boldmath] [euler] [name] + \definefontsynonym [MathRoman] [Euler-Roman-Bold] % mr + \definefontsynonym [MathItalic] [Euler-Fraktur-Bold] % mi + \definefontsynonym [MathExtension] [Euler-Extension] % ex + \definefontsynonym [MathSymbol] [Euler-Symbol-Bold] % sy +\stoptypescript + +\starttypescript [bfmath] [euler] [name] + \definefontsynonym [MathRomanBold] [Euler-Roman-Bold] % mr + \definefontsynonym [MathItalicBold] [Euler-Fraktur-Bold] % mi + \definefontsynonym [MathExtension] [Euler-Extension] % ex + \definefontsynonym [MathSymbolBold] [Euler-Symbol-Bold] % sy +\stoptypescript + +\starttypescript [math] [euler] [name] + \definefontsynonym [OldStyle] [MathItalic] + \definefontsynonym [Fraktur] [MathItalic] + \definefontsynonym [Gothic] [MathItalic] + \definefontsynonym [Calligraphic] [MathSymbol] +\stoptypescript + +\starttypescript [boldmath] [euler] [name] + \definefontsynonym [OldStyle] [MathItalicBold] + \definefontsynonym [Fraktur] [MathItalicBold] + \definefontsynonym [Gothic] [MathItalicBold] + \definefontsynonym [Calligraphic] [MathSymbolBold] +\stoptypescript + +\starttypescript [math,boldmath,bfmath] [euler] [name] + \usemathcollection[eul] +\stoptypescript + +% American Math Society : Michael Spivak + +\starttypescript [math] [modern,computer-modern,latin-modern,ams] [name] + \definefontsynonym [MathAlpha] [AMS-SymbolA] + \definefontsynonym [MathBeta] [AMS-SymbolB] +\stoptypescript + +% Antykwa Torunska : + +\starttypescript [serif] [antykwa-torunska] [name] + \definefontsynonym [Serif] [AntykwaTorunska-Regular] + \definefontsynonym [SerifBold] [AntykwaTorunska-Bold] + \definefontsynonym [SerifItalic] [AntykwaTorunska-Italic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-Italic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-Cap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-light] [name] + \definefontsynonym [Serif] [AntykwaTorunska-Light] + \definefontsynonym [SerifBold] [AntykwaTorunska-Medium] + \definefontsynonym [SerifItalic] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-LightCap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-cond] [name] + \definefontsynonym [Serif] [AntykwaTorunska-CondRegular] + \definefontsynonym [SerifBold] [AntykwaTorunska-CondBold] + \definefontsynonym [SerifItalic] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-CondCap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-lightcond] [name] + \definefontsynonym [Serif] [AntykwaTorunska-CondLight] + \definefontsynonym [SerifBold] [AntykwaTorunska-CondMedium] + \definefontsynonym [SerifItalic] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifSlanted] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifBoldItalic] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifBoldSlanted] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifCaps] [AntykwaTorunska-CondLightCap] +\stoptypescript + +\starttypescript [serif] [antykwa-torunska] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-Cap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-BoldCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-ItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-ItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-BoldItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-BoldItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-Cap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularLight] [AntykwaTorunska-Light] + \definefontsynonym [SerifBoldLight] [AntykwaTorunska-Medium] + \definefontsynonym [SerifItalicLight] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifCapsLight] [AntykwaTorunska-LightCap] + + \definefontvariant [Serif][lt][Light] + + \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondRegular] + \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondBold] + \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondCap] + + \definefontvariant [Serif][cond][Cond] + +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-light] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-LightCap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-MediumCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-LightItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-LightItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-MedItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-MedItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-LightCap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularDark] [AntykwaTorunska-Regular] + \definefontsynonym [SerifBoldDark] [AntykwaTorunska-Bold] + \definefontsynonym [SerifItalicDark] [AntykwaTorunska-Italic] + \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-Italic] + \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifCapsDark] [AntykwaTorunska-Cap] + + \definefontvariant [Serif][dk][Dark] + + \definefontsynonym [SerifRegularCond] [AntykwaTorunska-CondLight] + \definefontsynonym [SerifBoldCond] [AntykwaTorunska-CondMedium] + \definefontsynonym [SerifItalicCond] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifSlantedCond] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifBoldItalicCond] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifBoldSlantedCond] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifCapsCond] [AntykwaTorunska-CondLightCap] + + \definefontvariant [Serif][cond][Cond] + +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-cond] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondCap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondBoldCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondBoldItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondBoldItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondCap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularLight] [AntykwaTorunska-CondLight] + \definefontsynonym [SerifBoldLight] [AntykwaTorunska-CondMedium] + \definefontsynonym [SerifItalicLight] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifSlantedLight] [AntykwaTorunska-CondLightItalic] + \definefontsynonym [SerifBoldItalicLight] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifBoldSlantedLight] [AntykwaTorunska-CondMedItalic] + \definefontsynonym [SerifCapsLight] [AntykwaTorunska-CondLightCap] + + \definefontvariant [Serif][lt][Light] + + \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Regular] + \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Bold] + \definefontsynonym [SerifItalicExp] [AntykwaTorunska-Italic] + \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-Italic] + \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-BoldItalic] + \definefontsynonym [SerifCapsExp] [AntykwaTorunska-Cap] + + \definefontvariant [Serif][exp][Exp] + +\stoptypescript + +\starttypescript [serif] [antykwa-torunska-lightcond] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularCaps] [AntykwaTorunska-CondLightCap] + \definefontsynonym [SerifBoldCaps] [AntykwaTorunska-CondMediumCap] + \definefontsynonym [SerifItalicCaps] [AntykwaTorunska-CondLightItalicCap] + \definefontsynonym [SerifSlantedCaps] [AntykwaTorunska-CondLightItalicCap] + \definefontsynonym [SerifBoldItalicCaps] [AntykwaTorunska-CondMedItalicCap] + \definefontsynonym [SerifBoldSlantedCaps] [AntykwaTorunska-CondMedItalicCap] + \definefontsynonym [SerifCapsCaps] [AntykwaTorunska-CondLightCap] + + \definefontvariant [Serif][osf][Caps] + \definefontvariant [Serif][sc] [Caps] + + \definefontsynonym [SerifRegularDark] [AntykwaTorunska-CondRegular] + \definefontsynonym [SerifBoldDark] [AntykwaTorunska-CondBold] + \definefontsynonym [SerifItalicDark] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifSlantedDark] [AntykwaTorunska-CondItalic] + \definefontsynonym [SerifBoldItalicDark] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifBoldSlantedDark] [AntykwaTorunska-CondBoldItalic] + \definefontsynonym [SerifCapsDark] [AntykwaTorunska-CondCap] + + \definefontvariant [Serif][dk][Dark] + + \definefontsynonym [SerifRegularExp] [AntykwaTorunska-Light] + \definefontsynonym [SerifBoldExp] [AntykwaTorunska-Medium] + \definefontsynonym [SerifItalicExp] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifSlantedExp] [AntykwaTorunska-LightItalic] + \definefontsynonym [SerifBoldItalicExp] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifBoldSlantedExp] [AntykwaTorunska-MedItalic] + \definefontsynonym [SerifCapsExp] [AntykwaTorunska-LightCap] + + \definefontvariant [Serif][exp][Exp] + +\stoptypescript + +% maybe no -Regular etc + +\starttypescript [math] [antykwa-torunska-light] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Light] + \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-LightItalic] + \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Light] + \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Light] +\stoptypescript + +\starttypescript [math] [antykwa-torunska] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-Regular] + \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-RegularItalic] + \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-Regular] + \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-Regular] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-cond] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondRegular] + \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondRegularItalic] + \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondRegular] + \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondRegular] +\stoptypescript + +\starttypescript [math] [antykwa-torunska-lightcond] [name] + \definefontsynonym [MathRoman] [AntykwaTorunska-Math-Letters-CondLight] + \definefontsynonym [MathItalic] [AntykwaTorunska-Math-Letters-CondLightItalic] + \definefontsynonym [MathSymbol] [AntykwaTorunska-Math-Symbols-CondLight] + \definefontsynonym [MathExtension] [AntykwaTorunska-Math-Extension-CondLight] +\stoptypescript + +% Antykwa Poltawskiego : + +\starttypescript [serif] [antykwa-poltawskiego] [name] + \definefontsynonym [Serif] [AntykwaPoltawskiego-Regular] + \definefontsynonym [SerifBold] [AntykwaPoltawskiego-Bold] + \definefontsynonym [SerifItalic] [AntykwaPoltawskiego-Italic] + \definefontsynonym [SerifSlanted] [AntykwaPoltawskiego-Italic] + \definefontsynonym [SerifBoldItalic] [AntykwaPoltawskiego-Bold] + \definefontsynonym [SerifBoldSlanted] [AntykwaPoltawskiego-Bold] + \definefontsynonym [SerifCaps] [AntykwaPoltawskiego-Regular] +\stoptypescript + +% Iwona + +\starttypescript [sans] [iwona-light] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Light] + \definefontsynonym [SansItalic] [Iwona-LightItalic] + \definefontsynonym [SansBold] [Iwona-Medium] + \definefontsynonym [SansBoldItalic] [Iwona-MediumItalic] + \definefontsynonym [SansCaps] [Iwona-CapsLight] + \definefontsynonym [SansItalicCaps] [Iwona-CapsLightItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsMedium] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsMediumItalic] +\stoptypescript + +\starttypescript [sans] [iwona-light-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsLight] + \definefontsynonym [SansItalic] [Iwona-CapsLightItalic] + \definefontsynonym [SansBold] [Iwona-CapsMedium] + \definefontsynonym [SansBoldItalic] [Iwona-CapsMediumItalic] +\stoptypescript + +\starttypescript [sans] [iwona] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Regular] + \definefontsynonym [SansItalic] [Iwona-RegularItalic] + \definefontsynonym [SansBold] [Iwona-Bold] + \definefontsynonym [SansBoldItalic] [Iwona-BoldItalic] + \definefontsynonym [SansCaps] [Iwona-CapsRegular] + \definefontsynonym [SansItalicCaps] [Iwona-CapsRegularItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsBold] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsRegular] + \definefontsynonym [SansItalic] [Iwona-CapsRegularItalic] + \definefontsynonym [SansBold] [Iwona-CapsBold] + \definefontsynonym [SansBoldItalic] [Iwona-CapsBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-medium] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Medium] + \definefontsynonym [SansItalic] [Iwona-MediumItalic] + \definefontsynonym [SansBold] [Iwona-Heavy] + \definefontsynonym [SansBoldItalic] [Iwona-HeavyItalic] + \definefontsynonym [SansCaps] [Iwona-CapsHeavy] + \definefontsynonym [SansItalicCaps] [Iwona-CapsMediumItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavyItalic] +\stoptypescript + +\starttypescript [sans] [iwona-medium-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CapsHeavy] + \definefontsynonym [SansItalic] [Iwona-CapsMediumItalic] + \definefontsynonym [SansBold] [Iwona-CapsHeavy] + \definefontsynonym [SansBoldItalic] [Iwona-CapsHeavyItalic] +\stoptypescript + +\starttypescript [sans] [iwona-heavy] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-Heavy] + \definefontsynonym [SansItalic] [Iwona-HeavyItalic] + \definefontsynonym [SansBold] [Iwona-Heavy] + \definefontsynonym [SansBoldItalic] [Iwona-HeavyItalic] + \definefontsynonym [SansCaps] [Iwona-CapsHeavy] + \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavyItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavyItalic] +\stoptypescript + +\starttypescript [sans] [iwona-heavy-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [SansCaps] [Iwona-CapsHeavy] + \definefontsynonym [SansItalicCaps] [Iwona-CapsHeavyItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CapsHeavy] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CapsHeavyItalic] +\stoptypescript + +\starttypescript [sans] [iwona-light-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondLight] + \definefontsynonym [SansItalic] [Iwona-CondLightItalic] + \definefontsynonym [SansBold] [Iwona-CondMedium] + \definefontsynonym [SansBoldItalic] [Iwona-CondMediumItalic] + \definefontsynonym [SansCaps] [Iwona-CondCapsLight] + \definefontsynonym [SansItalicCaps] [Iwona-CondCapsLightItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CondCapsMedium] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CondCapsMediumItalic] +\stoptypescript + +\starttypescript [sans] [iwona-light-cond-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondCapsLight] + \definefontsynonym [SansItalic] [Iwona-CondCapsLightItalic] + \definefontsynonym [SansBold] [Iwona-CondCapsMedium] + \definefontsynonym [SansBoldItalic] [Iwona-CondCapsMediumItalic] +\stoptypescript + +\starttypescript [sans] [iwona-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondRegular] + \definefontsynonym [SansItalic] [Iwona-CondRegularItalic] + \definefontsynonym [SansBold] [Iwona-CondBold] + \definefontsynonym [SansBoldItalic] [Iwona-CondBoldItalic] + \definefontsynonym [SansCaps] [Iwona-CondCapsRegular] + \definefontsynonym [SansItalicCaps] [Iwona-CondCapsRegularItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CondCapsBold] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CondCapsBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-cond-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondCapsRegular] + \definefontsynonym [SansItalic] [Iwona-CondCapsRegularItalic] + \definefontsynonym [SansBold] [Iwona-CondCapsBold] + \definefontsynonym [SansBoldItalic] [Iwona-CondCapsBoldItalic] +\stoptypescript + +\starttypescript [sans] [iwona-medium-cond] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondMedium] + \definefontsynonym [SansItalic] [Iwona-CondMediumItalic] + \definefontsynonym [SansBold] [Iwona-CondHeavy] + \definefontsynonym [SansBoldItalic] [Iwona-CondHeavyItalic] + \definefontsynonym [SansCaps] [Iwona-CondCapsHeavy] + \definefontsynonym [SansItalicCaps] [Iwona-CondCapsMediumItalic] + \definefontsynonym [SansBoldCaps] [Iwona-CondCapsHeavy] + \definefontsynonym [SansBoldItalicCaps] [Iwona-CondCapsHeavyItalic] +\stoptypescript + +\starttypescript [sans] [iwona-medium-cond-caps] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Iwona-CondCapsHeavy] + \definefontsynonym [SansItalic] [Iwona-CondCapsMediumItalic] + \definefontsynonym [SansBold] [Iwona-CondCapsHeavy] + \definefontsynonym [SansBoldItalic] [Iwona-CondCapsHeavyItalic] +\stoptypescript + +\starttypescript [math] [iwona-light] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Light] + \definefontsynonym [MathItalic] [Iwona-Math-Letters-LightItalic] + \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Light] + \definefontsynonym [MathExtension] [Iwona-Math-Extension-Light] +\stoptypescript + +\starttypescript [math] [iwona] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Regular] + \definefontsynonym [MathItalic] [Iwona-Math-Letters-RegularItalic] + \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Regular] + \definefontsynonym [MathExtension] [Iwona-Math-Extension-Regular] +\stoptypescript + +\starttypescript [math] [iwona-medium] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Medium] + \definefontsynonym [MathItalic] [Iwona-Math-Letters-MediumItalic] + \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Medium] + \definefontsynonym [MathExtension] [Iwona-Math-Extension-Medium] +\stoptypescript + +\starttypescript [math] [iwona-heavy] [name] + \definefontsynonym [MathRoman] [Iwona-Math-Letters-Heavy] + \definefontsynonym [MathItalic] [Iwona-Math-Letters-HeavyItalic] + \definefontsynonym [MathSymbol] [Iwona-Math-Symbols-Heavy] + \definefontsynonym [MathExtension] [Iwona-Math-Extension-Heavy] +\stoptypescript + +% Kurier + +\starttypescript [sans] [kurier-light] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Kurier-Light] + \definefontsynonym [SansItalic] [Kurier-LightItalic] + \definefontsynonym [SansBold] [Kurier-Medium] + \definefontsynonym [SansBoldItalic] [Kurier-MediumItalic] +\stoptypescript + +\starttypescript [sans] [kurier] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Kurier-Regular] + \definefontsynonym [SansItalic] [Kurier-RegularItalic] + \definefontsynonym [SansBold] [Kurier-Bold] + \definefontsynonym [SansBoldItalic] [Kurier-BoldItalic] +\stoptypescript + +\starttypescript [sans] [kurier-medium] [name] + \setups[font:fallback:sans] + \definefontsynonym [Sans] [Kurier-Medium] + \definefontsynonym [SansItalic] [Kurier-MediumItalic] + \definefontsynonym [SansBold] [Kurier-Heavy] + \definefontsynonym [SansBoldItalic] [Kurier-HeavyItalic] +\stoptypescript + +\starttypescript [math] [kurier-light] [name] + \definefontsynonym [MathRoman] [Kurier-Math-Letters-Light] + \definefontsynonym [MathItalic] [Kurier-Math-Letters-LightItalic] + \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Light] + \definefontsynonym [MathExtension] [Kurier-Math-Extension-Light] +\stoptypescript + +\starttypescript [math] [kurier] [name] + \definefontsynonym [MathRoman] [Kurier-Math-Letters-Regular] + \definefontsynonym [MathItalic] [Kurier-Math-Letters-RegularItalic] + \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Regular] + \definefontsynonym [MathExtension] [Kurier-Math-Extension-Regular] +\stoptypescript + +\starttypescript [math] [kurier-medium] [name] + \definefontsynonym [MathRoman] [Kurier-Math-Letters-Medium] + \definefontsynonym [MathItalic] [Kurier-Math-Letters-MediumItalic] + \definefontsynonym [MathSymbol] [Kurier-Math-Symbols-Medium] + \definefontsynonym [MathExtension] [Kurier-Math-Extension-Medium] +\stoptypescript + +% Bookman : + +\starttypescript [serif] [bookman] [name] + \definefontsynonym [Serif] [Bookman-Light] + \definefontsynonym [SerifItalic] [Bookman-LightItalic] + \definefontsynonym [SerifBold] [Bookman-DemiBold] + \definefontsynonym [SerifBoldItalic] [Bookman-DemiBoldItalic] + \definefontsynonym [SerifSlanted] [Bookman-LightSlanted] + \definefontsynonym [SerifBoldSlanted] [Bookman-DemiBoldSlanted] + \definefontsynonym [SerifCaps] [Bookman-Light-Caps] +\stoptypescript + +% Chancery : Zapf + +\starttypescript [calligraphy] [chancery] [name] + \definefontsynonym [Calligraphy] [Chancery] +\stoptypescript + +% Schoolbook : + +\starttypescript [serif] [schoolbook] [name] + \definefontsynonym [Serif] [Schoolbook-Roman] + \definefontsynonym [SerifItalic] [Schoolbook-Italic] + \definefontsynonym [SerifBold] [Schoolbook-Bold] + \definefontsynonym [SerifBoldItalic] [Schoolbook-BoldItalic] + \definefontsynonym [SerifSlanted] [Schoolbook-RomanSlanted] + \definefontsynonym [SerifBoldSlanted] [Schoolbook-BoldSlanted] + \definefontsynonym [SerifCaps] [Schoolbook-Roman-Caps] +\stoptypescript + +% Utopia : Adobe + +\starttypescript [serif] [utopia] [name] + \definefontsynonym [Serif] [Utopia-Regular] + \definefontsynonym [SerifItalic] [Utopia-Italic] + \definefontsynonym [SerifBold] [Utopia-Bold] + \definefontsynonym [SerifBoldItalic] [Utopia-BoldItalic] + \definefontsynonym [SerifSlanted] [Utopia-Slanted] + \definefontsynonym [SerifBoldSlanted] [Utopia-BoldSlanted] + \definefontsynonym [SerifCaps] [Utopia-Regular-Caps] +\stoptypescript + +% Fourier : Michael Bovani + +\starttypescript [serif] [fourier] [name] + \definefontsynonym [Serif] [Fourier-Regular] + \definefontsynonym [SerifSlanted] [Fourier-Slanted] + \definefontsynonym [SerifItalic] [Fourier-Italic] + \definefontsynonym [SerifCaps] [Fourier-RegularCaps] + \definefontsynonym [SerifBold] [Fourier-Bold] + \definefontsynonym [SerifBoldSlanted] [Fourier-BoldSlanted] + \definefontsynonym [SerifBoldItalic] [Fourier-BoldItalic] + \definefontsynonym [SerifBoldCaps] [Fourier-BoldCaps] + + \definefontsynonym [Serif-Expert] [Fourier-Regular-Expert] + \definefontsynonym [SerifSlanted-Expert] [Fourier-Slanted-Expert] + \definefontsynonym [SerifItalic-Expert] [Fourier-Italic-Expert] + \definefontsynonym [SerifCaps-Expert] [Fourier-RegularCaps-Expert] + \definefontsynonym [SerifSemiBold-Expert] [Fourier-Semi-Expert] + \definefontsynonym [SerifSemiSlanted-Expert] [Fourier-SemiSlanted-Expert] + \definefontsynonym [SerifSemiItalic-Expert] [Fourier-SemiItalic-Expert] + \definefontsynonym [SerifSemiCaps-Expert] [Fourier-SemiCaps-Expert] + \definefontsynonym [SerifBold-Expert] [Fourier-Bold-Expert] + \definefontsynonym [SerifBoldSlanted-Expert] [Fourier-BoldSlanted-Expert] + \definefontsynonym [SerifBoldItalic-Expert] [Fourier-BoldItalic-Expert] + \definefontsynonym [SerifBlack-Expert] [Fourier-Black-Expert] + + \definefontsynonym [Serif-OldStyle] [Fourier-Regular-OldStyle] + \definefontsynonym [SerifSlanted-OldStyle] [Fourier-Slanted-OldStyle] + \definefontsynonym [SerifItalic-OldStyle] [Fourier-Italic-OldStyle] + \definefontsynonym [SerifCaps-OldStyle] [Fourier-RegularCaps-OldStyle] + \definefontsynonym [SerifSemiBold-OldStyle] [Fourier-Semi-OldStyle] + \definefontsynonym [SerifSemiSlanted-OldStyle] [Fourier-SemiSlanted-OldStyle] + \definefontsynonym [SerifSemiItalic-OldStyle] [Fourier-SemiItalic-OldStyle] + \definefontsynonym [SerifSemiCaps-OldStyle] [Fourier-SemiCaps-OldStyle] + \definefontsynonym [SerifBold-OldStyle] [Fourier-Bold-OldStyle] + \definefontsynonym [SerifBoldSlanted-OldStyle] [Fourier-BoldSlanted-OldStyle] + \definefontsynonym [SerifBoldItalic-OldStyle] [Fourier-BoldItalic-OldStyle] + \definefontsynonym [SerifBlack-OldStyle] [Fourier-Black-OldStyle] + \definefontsynonym [SerifBlackSlanted-OldStyle] [Fourier-BlackSlanted-OldStyle] +\stoptypescript + +\starttypescript [math] [fourier] [name] + \definefontsynonym [MathRoman] [Fourier-Math-Letters] + \definefontsynonym [MathItalic] [Fourier-Math-Letters-Italic] + \definefontsynonym [MathSymbol] [Fourier-Math-Symbols] + \definefontsynonym [MathExtension] [Fourier-Math-Extension] +\stoptypescript + +\starttypescript [math] [fourier] [name] % todo + \definefontsynonym [OldStyle] [Serif-OldStyle] % strange, no oldstyles + \definefontsynonym [Fraktur] [eufm10] + \definefontsynonym [Blackboard] [msbm10] + \definefontsynonym [Gothic] [eufm10] + \definefontsynonym [Calligraphic] [eusm10] +\stoptypescript + +% Charter : + +\starttypescript [serif] [charter] [name] + \definefontsynonym [Serif] [Charter-Roman] + \definefontsynonym [SerifItalic] [Charter-Italic] + \definefontsynonym [SerifBold] [Charter-Bold] + \definefontsynonym [SerifBoldItalic] [Charter-BoldItalic] + \definefontsynonym [SerifSlanted] [Charter-Slanted] + \definefontsynonym [SerifBoldSlanted] [Charter-BoldSlanted] + \definefontsynonym [SerifCaps] [Charter-Roman-Caps] +\stoptypescript + +% Times : + +\starttypescript [serif] [times] [name] + \definefontsynonym [Serif] [Times-Roman] + \definefontsynonym [SerifBold] [Times-Bold] + \definefontsynonym [SerifItalic] [Times-Italic] + \definefontsynonym [SerifSlanted] [Times-Italic] + \definefontsynonym [SerifBoldItalic] [Times-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [Times-BoldItalic] + \definefontsynonym [SerifCaps] [Times-Caps] +\stoptypescript + +\starttypescript [math] [times] [name] + \definefontsynonym [MathRoman] [Times-Roman-Upright] + \definefontsynonym [MathExtension] [Times-Math-Extension] + \definefontsynonym [MathItalic] [Times-Math-Italic] + \definefontsynonym [MathSymbol] [Times-Math-Symbols] + \definefontsynonym [MathAlpha] [Times-Math-SymbolsA] + \definefontsynonym [MathBeta] [Times-Math-SymbolsB] +\stoptypescript + +\starttypescript [math] [times] [name] + \definefontsynonym [OldStyle] [MathItalic] + \definefontsynonym [Fraktur] [eufm10] + \definefontsynonym [Blackboard] [MathBeta] + \definefontsynonym [Gothic] [eufm10] + \definefontsynonym [Calligraphic] [eusm10] +\stoptypescript + +% Helvetica : + +\starttypescript [sans] [helvetica] [name] + \definefontsynonym [Sans] [Helvetica] + \definefontsynonym [SansBold] [Helvetica-Bold] + \definefontsynonym [SansItalic] [Helvetica-Oblique] + \definefontsynonym [SansSlanted] [Helvetica-Oblique] + \definefontsynonym [SansBoldItalic] [Helvetica-BoldOblique] + \definefontsynonym [SansBoldSlanted] [Helvetica-BoldOblique] + \definefontsynonym [SansCaps] [Helvetica-Caps] +\stoptypescript + +\starttypescript [math] [helvetica] [name] + \definefontsynonym [MathRoman] [Helvetica-MathRoman] + \definefontsynonym [MathExtension] [Helvetica-MathExtendedSymbols] + \definefontsynonym [MathItalic] [Helvetica-MathItalics] + \definefontsynonym [MathSymbol] [Helvetica-MathSymbols] +\stoptypescript + +% Courier : + +\starttypescript [mono] [courier] [name] + \definefontsynonym [Mono] [Courier] + \definefontsynonym [MonoBold] [Courier-Bold] + \definefontsynonym [MonoItalic] [Courier-Oblique] + \definefontsynonym [MonoSlanted] [Courier-Oblique] + \definefontsynonym [MonoBoldItalic] [Courier-BoldOblique] + \definefontsynonym [MonoBoldSlanted] [Courier-BoldOblique] + \definefontsynonym [MonoCaps] [Courier-Caps] +\stoptypescript + +% Palatino : Hermann Zapf / URW + +\starttypescript [serif] [palatino] [name] + \definefontsynonym [Serif] [Palatino] + \definefontsynonym [SerifBold] [Palatino-Bold] + \definefontsynonym [SerifItalic] [Palatino-Italic] + \definefontsynonym [SerifSlanted] [Palatino-Slanted] + \definefontsynonym [SerifBoldItalic] [Palatino-BoldItalic] + \definefontsynonym [SerifBoldSlanted] [Palatino-BoldSlanted] + \definefontsynonym [SerifCaps] [Palatino-Caps] +\stoptypescript + +\starttypescript [math] [palatino] [name] + \definefontsynonym [MathRoman] [Palatino-Roman-Upright] + \definefontsynonym [MathExtension] [Palatino-Math-Extension] + \definefontsynonym [MathItalic] [Palatino-Math-Italic] + \definefontsynonym [MathSymbol] [Palatino-Math-Symbols] + \definefontsynonym [MathAlpha] [Palatino-Math-SymbolsA] + \definefontsynonym [MathBeta] [Palatino-Math-SymbolsB] +\stoptypescript + +\starttypescript [math] [palatino] [name] + \definefontsynonym [OldStyle] [MathItalic] + \definefontsynonym [Fraktur] [eufm10] + \definefontsynonym [Blackboard] [MathBeta] + \definefontsynonym [Gothic] [eufm10] + \definefontsynonym [Calligraphic] [eusm10] +\stoptypescript + +% bonus definitions / will disappear + +\starttypescript [serif] [palatino] [name] + \definefontsynonym [SerifRegular] [Serif] + \definefontsynonym [SerifRegularOsF] [TeXPalladioL-SC] + \definefontsynonym [SerifItalicOsF] [TeXPalladioL-ItalicOsF] + \definefontsynonym [SerifBoldOsF] [TeXPalladioL-BoldOsF] + \definefontsynonym [SerifBoldItalicOsF][TeXPalladioL-BoldItalicOsF] + \definefontsynonym [SerifCapsOsF] [TeXPalladioL-SC] +\stoptypescript + +\stoptypescriptcollection + +\endinput diff --git a/tex/context/base/type-xtx.tex b/tex/context/base/type-xtx.tex index 010de1f85..be833bb2a 100644 --- a/tex/context/base/type-xtx.tex +++ b/tex/context/base/type-xtx.tex @@ -106,7 +106,7 @@ %D in this case since tricks like \type{/I} will never, ever work for local fonts, %D so there is really only one choice. -%D HH: todo, define feature set swith mapping=tex-tex +%D HH: todo, define feature set switch mapping=tex-tex \definefontsynonym[Dummy] [name:\typescripttwo\xetexcolon mapping=tex-text] [encoding=uc] \definefontsynonym[DummyItalic] [name:\typescripttwo/I\xetexcolon mapping=tex-text] [encoding=uc] diff --git a/tex/context/base/verb-lua.lua b/tex/context/base/verb-lua.lua new file mode 100644 index 000000000..78d5f2a2c --- /dev/null +++ b/tex/context/base/verb-lua.lua @@ -0,0 +1,212 @@ +-- filename : type-lua.lua +-- comment : companion to core-buf.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +-- BROKEN : result is now table + + + +if not buffers then buffers = { } end +if not buffers.visualizers then buffers.visualizers = { } end +if not buffers.visualizers.lua then buffers.visualizers.lua = { } end + +buffers.visualizers.lua.identifiers = { } + +-- borrowed from scite + +buffers.visualizers.lua.identifiers.core = { + "and", "break", "do", "else", "elseif", "end", "false", "for", "function", + "if", "in", "local", "nil", "not", "or", "repeat", "return", "then", + "true", "until", "while" +} + +buffers.visualizers.lua.identifiers.base = { + "assert", "collectgarbage", "dofile", "error", "gcinfo", "loadfile", + "loadstring", "print", "rawget", "rawset", "require", "tonumber", + "tostring", "type", "unpack", +} + +buffers.visualizers.lua.identifiers.five = { + "_G", "getfenv", "getmetatable", "ipairs", "loadlib", "next", "pairs", + "pcall", "rawequal", "setfenv", "setmetatable", "xpcall", "string", "table", + "math", "coroutine", "io", "os", "debug", "load", "module", "select" +} + +buffers.visualizers.lua.identifiers.libs = { + -- coroutine + "coroutine.create", "coroutine.resume", "coroutine.status", "coroutine.wrap", + "coroutine.yield", "coroutine.running", + -- package + "package.cpath", "package.loaded", "package.loadlib", "package.path", + -- io + "io.close", "io.flush", "io.input", "io.lines", "io.open", "io.output", + "io.read", "io.tmpfile", "io.type", "io.write", "io.stdin", "io.stdout", + "io.stderr", "io.popen", + -- math + "math.abs", "math.acos", "math.asin", "math.atan", "math.atan2", "math.ceil", + "math.cos", "math.deg", "math.exp", "math.floor math.", "math.ldexp", + "math.log", "math.log10", "math.max", "math.min math.mod math.pi", "math.pow", + "math.rad", "math.random", "math.randomseed", "math.sin", "math.sqrt", + "math.tan", "math.cosh", "math.fmod", "math.modf", "math.sinh", "math.tanh", + "math.huge", + -- string + "string.byte", "string.char", "string.dump", "string.find", "string.len", + "string.lower", "string.rep", "string.sub", "string.upper", "string.format", + "string.gfind", "string.gsub", "string.gmatch", "string.match", "string.reverse", + -- table + "table.maxn", "table.concat", "table.foreach", "table.foreachi", "table.getn", + "table.sort", "table.insert", "table.remove", "table.setn", + -- os + "os.clock", "os.date", "os.difftime", "os.execute", "os.exit", "os.getenv", + "os.remove", "os.rename", "os.setlocale", "os.time", "os.tmpname", + -- package + "package.preload", "package.seeall" +} + +buffers.visualizers.lua.words = { } + +for k,v in pairs(buffers.visualizers.lua.identifiers) do + for _,w in pairs(v) do + buffers.visualizers.lua.words[w] = k + end +end + +buffers.visualizers.lua.styles = { } + +buffers.visualizers.lua.styles.core = "" +buffers.visualizers.lua.styles.base = "\\sl " +buffers.visualizers.lua.styles.five = "\\sl " +buffers.visualizers.lua.styles.libs = "\\sl " + +-- btex .. etex + +buffers.visualizers.lua.colors = { + "prettyone", + "prettytwo", + "prettythree", + "prettyfour", +} + +buffers.visualizers.lua.states = { + ['1']=1, ['2']=1, ['3']=1, ['4']=1, ['5']=1, ['6']=1, ['7']=1, ['8']=1, ['9']=1, ['0']=1, + ['--']=4, + ['"']=3, ["'"]=3, + ['+']=1, ['-']=1, ['*']=1, ['/']=1, ['%']=1, ['^']=1, +} + +buffers.visualizers.lua.options = { } + +buffers.visualizers.lua.options.colorize_strings = false +buffers.visualizers.lua.options.colorize_comments = false + +function buffers.flush_lua_word(state, word, result) + if #word>0 then + local id = buffers.visualizers.lua.words[word] + if id then + state, result = buffers.change_state(2, state, result) + if buffers.visualizers.lua.styles[id] then + state, result = buffers.finish_state(state,result .. buffers.visualizers.lua.styles[id] .. word) + else + state, result = buffers.finish_state(state,result .. word) + end + return state, result + else + state, result = buffers.finish_state(state,result) + return state, result .. buffers.escaped(word) -- cmp mp + end + else + state, result = buffers.finish_state(state,result) + return state, result + end +end + +buffers.visualizers.lua.states.incomment = false + +-- to be sped up + +function buffers.visualizers.lua.flush_line(str, nested) + local result, state = { }, 0 + local instr, inesc, incom = false, false, false + local c, p + local sb, ss, sf = string.byte, string.sub, string.find + local code, comment +--~ buffers.currentcolors = buffers.visualizers.lua.colors +--~ if sf(str,"^%-%-%[") then +--~ buffers.visualizers.lua.states.incomment = true +--~ code, comment, incom = "", str, true +--~ elseif sf(str,"^%]%-%-") then +--~ buffers.visualizers.lua.states.incomment = false +--~ code, comment, incom = "", str, true +--~ elseif buffers.visualizers.lua.states.incomment then +--~ code, comment, incom = "", str, true +--~ else +--~ code, comment = string.match(str,"^(.-)%-%-(.*)$") +--~ if not code then +--~ code, comment = str, "" +--~ end +--~ end +--~ -- bla bla1 bla.bla +--~ for c in string.utfcharacters(code) do +--~ if instr then +--~ if c == s then +--~ if inesc then +--~ result = result .. "\\char" .. sb(c) .. " " +--~ inesc = false +--~ else +--~ state, result = buffers.change_state(buffers.visualizers.lua.states[c], state, result) +--~ instr = false +--~ result = result .. "\\char" .. sb(c) .. " " +--~ state, result = buffers.finish_state(state,result) +--~ end +--~ elseif c == "\\" then +--~ inesc = not inesc +--~ result = result .. buffers.escaped_chr(c) +--~ else +--~ inesc = false +--~ result = result .. buffers.escaped_chr(c) +--~ end +--~ elseif sf(c,"^([\'\"])$") then +--~ s, instr = c, true +--~ state, result = buffers.change_state(buffers.visualizers.lua.states[c], state, result) +--~ result = result .. "\\char" .. sb(c) .. " " +--~ if not buffers.visualizers.lua.options.colorize_strings then +--~ state, result = buffers.finish_state(state,result) +--~ end +--~ elseif c == " " then +--~ state, result = buffers.flush_lua_word(state, word, result) +--~ word = "" +--~ result = result .. "\\obs " +--~ elseif sf(c,"^[%a]$") then +--~ state, result = buffers.finish_state(state,result) +--~ word = word .. c +--~ elseif (#word > 1) and sf(c,"^[%d%.%_]$") then +--~ word = word .. c +--~ else +--~ state, result = buffers.flush_lua_word(state, word, result) +--~ word = "" +--~ state, result = buffers.change_state(buffers.visualizers.lua.states[c], state, result) +--~ result = result .. "\\char" .. sb(c) .. " " +--~ instr = (c == '"') +--~ end +--~ end +--~ state, result = buffers.flush_lua_word(state, word, result) +--~ if comment ~= "" then +--~ state, result = buffers.change_state(buffers.visualizers.lua.states['--'], state, result) +--~ if not incom then +--~ result = result .. buffers.escaped("--") +--~ end +--~ if buffers.visualizers.lua.options.colorize_comments then +--~ state, result = buffers.finish_state(state,result) +--~ result = result .. buffers.escaped(comment) +--~ else +--~ result = result .. buffers.escaped(comment) +--~ state, result = buffers.finish_state(state,result) +--~ end +--~ else +--~ state, result = buffers.finish_state(state,result) +--~ end +--~ tex.sprint(tex.ctxcatcodes,result) + return "not yet finished" +end diff --git a/tex/context/base/verb-mp.lua b/tex/context/base/verb-mp.lua new file mode 100644 index 000000000..90091a2a9 --- /dev/null +++ b/tex/context/base/verb-mp.lua @@ -0,0 +1,234 @@ +-- filename : type-mp.lua +-- comment : companion to core-buf.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not buffers then buffers = { } end +if not buffers.visualizers then buffers.visualizers = { } end +if not buffers.visualizers.mp then buffers.visualizers.mp = { } end + +buffers.visualizers.mp.identifiers = { } + +buffers.visualizers.mp.identifiers.primitives = { + 'charcode', 'day', 'linecap', 'linejoin', 'miterlimit', 'month', 'pausing', + 'prologues', 'showstopping', 'time', 'tracingcapsules', 'tracingchoices', + 'tracingcommands', 'tracingequations', 'tracinglostchars', + 'tracingmacros', 'tracingonline', 'tracingoutput', 'tracingrestores', + 'tracingspecs', 'tracingstats', 'tracingtitles', 'truecorners', + 'warningcheck', 'year', 'mpprocset', + 'false', 'nullpicture', 'pencircle', 'true', + 'and', 'angle', 'arclength', 'arctime', 'ASCII', 'bluepart', 'boolean', 'bot', + 'char', 'color', 'cosd', 'cycle', 'decimal', 'directiontime', 'floor', 'fontsize', + 'greenpart', 'hex', 'infont', 'intersectiontimes', 'known', 'length', 'llcorner', + 'lrcorner', 'makepath', 'makepen', 'mexp', 'mlog', 'normaldeviate', 'not', + 'numeric', 'oct', 'odd', 'or', 'path', 'pair', 'pen', 'penoffset', 'picture', 'point', + 'postcontrol', 'precontrol', 'redpart', 'reverse', 'rotated', 'scaled', + 'shifted', 'sind', 'slanted', 'sqrt', 'str', 'string', 'subpath', 'substring', + 'transform', 'transformed', 'ulcorner', 'uniformdeviate', 'unknown', + 'urcorner', 'xpart', 'xscaled', 'xxpart', 'xypart', 'ypart', 'yscaled', 'yxpart', + 'yypart', 'zscaled', + 'addto', 'clip', 'input', 'interim', 'let', 'newinternal', 'save', 'setbounds', + 'shipout', 'show', 'showdependencies', 'showtoken', 'showvariable', + 'special', + 'begingroup', 'endgroup', 'of', 'curl', 'tension', 'and', 'controls', + 'reflectedabout', 'rotatedaround', 'interpath', 'on', 'off', 'beginfig', + 'endfig', 'def', 'vardef', 'enddef', 'epxr', 'suffix', 'text', 'primary', 'secondary', + 'tertiary', 'primarydef', 'secondarydef', 'tertiarydef', 'top', 'bottom', + 'ulft', 'urt', 'llft', 'lrt', 'randomseed', 'also', 'contour', 'doublepath', + 'withcolor', 'withpen', 'dashed', 'if', 'else', 'elseif', 'fi', 'for', 'endfor', 'forever', 'exitif', + 'forsuffixes', 'downto', 'upto', 'step', 'until', + 'charlist', 'extensible', 'fontdimen', 'headerbyte', 'kern', 'ligtable', + 'boundarychar', 'chardp', 'charext', 'charht', 'charic', 'charwd', 'designsize', + 'fontmaking', 'charexists', + 'cullit', 'currenttransform', 'gfcorners', 'grayfont', 'hround', + 'imagerules', 'lowres_fix', 'nodisplays', 'notransforms', 'openit', + 'displaying', 'currentwindow', 'screen_rows', 'screen_cols', + 'pixels_per_inch', 'cull', 'display', 'openwindow', 'numspecial', + 'totalweight', 'autorounding', 'fillin', 'proofing', 'tracingpens', + 'xoffset', 'chardx', 'granularity', 'smoothing', 'turningcheck', 'yoffset', + 'chardy', 'hppp', 'tracingedges', 'vppp', + 'extra_beginfig', 'extra_endfig', 'mpxbreak', + 'end', 'btex', 'etex', 'verbatimtex' +} + +buffers.visualizers.mp.identifiers.plain = { + 'ahangle', 'ahlength', 'bboxmargin', 'defaultpen', 'defaultscale', + 'labeloffset', 'background', 'currentpen', 'currentpicture', 'cuttings', + 'defaultfont', 'extra_beginfig', 'extra_endfig', + 'beveled', 'black', 'blue', 'bp', 'butt', 'cc', 'cm', 'dd', 'ditto', 'down', 'epsilon', + 'evenly', 'fullcircle', 'green', 'halfcircle', 'identity', 'in', 'infinity', 'left', + 'mitered', 'mm', 'origin', 'pensquare', 'pt', 'quartercircle', 'red', 'right', + 'rounded', 'squared', 'unitsquare', 'up', 'white', 'withdots', + 'abs', 'bbox', 'ceiling', 'center', 'cutafter', 'cutbefore', 'dir', + 'directionpoint', 'div', 'dotprod', 'intersectionpoint', 'inverse', 'mod', 'lft', + 'round', 'rt', 'unitvector', 'whatever', + 'cutdraw', 'draw', 'drawarrow', 'drawdblarrow', 'fill', 'filldraw', 'drawdot', + 'loggingall', 'pickup', 'tracingall', 'tracingnone', 'undraw', 'unfill', + 'unfilldraw', + 'buildcycle', 'dashpattern', 'decr', 'dotlabel', 'dotlabels', 'drawoptions', + 'incr', 'label', 'labels', 'max', 'min', 'thelabel', 'z', + 'beginchar', 'blacker', 'capsule_end', 'change_width', + 'define_blacker_pixels', 'define_corrected_pixels', + 'define_good_x_pixels', 'define_good_y_pixels', + 'define_horizontal_corrected_pixels', 'define_pixels', + 'define_whole_blacker_pixels', 'define_whole_pixels', + 'define_whole_vertical_blacker_pixels', + 'define_whole_vertical_pixels', 'endchar', 'extra_beginchar', + 'extra_endchar', 'extra_setup', 'font_coding_scheme', + 'font_extra_space' +} + +buffers.visualizers.mp.identifiers.metafun = { + 'unitcircle', 'fulldiamond', 'unitdiamond', + 'halfcircle', 'quartercircle', + 'llcircle', 'lrcircle', 'urcircle', 'ulcircle', + 'tcircle', 'bcircle', 'lcircle', 'rcircle', + 'lltriangle', 'lrtriangle', 'urtriangle', 'ultriangle', + 'smoothed', 'cornered', 'superellipsed', 'randomized', 'squeezed', + 'punked', 'curved', 'unspiked', 'simplified', 'blownup', 'stretched', + 'enlarged', 'leftenlarged', 'topenlarged', 'rightenlarged', 'bottomenlarged', + 'llenlarged', 'lrenlarged', 'urenlarged', 'ulenlarged', + 'llmoved', 'lrmoved', 'urmoved', 'ulmoved', + 'boundingbox', 'innerboundingbox', 'outerboundingbox', + 'bottomboundary', 'leftboundary', 'topboundary', 'rightboundary', + 'xsized', 'ysized', 'xysized', + 'cmyk', 'transparent', 'withshade', 'spotcolor', + 'drawfill', 'undrawfill', + 'inverted', 'uncolored', 'softened', 'grayed', + 'textext', 'graphictext', + 'loadfigure', 'externalfigure' +} + +buffers.visualizers.mp.words = { } + +for k,v in pairs(buffers.visualizers.mp.identifiers) do + for _,w in pairs(v) do + buffers.visualizers.mp.words[w] = k + end +end + +buffers.visualizers.mp.styles = { } + +buffers.visualizers.mp.styles.primitives = "" +buffers.visualizers.mp.styles.plain = "\\sl " +buffers.visualizers.mp.styles.metafun = "\\sl " + +-- btex .. etex + +buffers.visualizers.mp.colors = { + "prettyone", + "prettytwo", + "prettythree", + "prettyfour", +} + +buffers.visualizers.mp.states = { + [';']=1, ['$']=1, ['@']=1, ['#']=1, + ['\\']=2, + ['(']=3, [')']=3, ['[']=3, [']']=3, [':']=3, ['=']=3, ['<']=3, ['>']=3, + ['-']=4, ['+']=4, ['/']=4, ['*']=4, ['|']=4, ['`']=4, ['!']=4, ['?']=4, ['^']=4, ['&']=4, ['%']=4, + ['%']=4, ['.']=4, [',']=4 +} + +function buffers.flush_mp_word(state, word, intex, result) + if #word>0 then + if intex then + if word == 'etex' then + state = buffers.change_state(2, state, result) + result[#result+1] = word + state = buffers.finish_state(state,result) + return state, false + else + result[#result+1] = word + return state, true + end + else + local id = buffers.visualizers.mp.words[word] + if id then + state = buffers.change_state(2, state, result) + if buffers.visualizers.mp.styles[id] then + result[#result+1] = buffers.visualizers.mp.styles[id] .. word + else + result[#result+1] = word + end + state = buffers.finish_state(state,result) + return state, (word == 'btex') or (word == 'verbatimtex') + else + state = buffers.finish_state(state,result) + result[#result+1] = word + return state, intex + end + end + else + state = buffers.finish_state(state,result) + return state, intex + end +end + +-- todo: split string in code and comment, and escape comment fast +-- could be generic + +-- to be considered: visualizer => table [result, instr, incomment, word] + +function buffers.visualizers.mp.flush_line_(str,nested) + local result, state, word = { }, 0, "" + local instr, intex, incomment = false, false, false + local byte, find = utf.byte, utf.find + local finish, change = buffers.finish_state, buffers.change_state + buffers.currentcolors = buffers.visualizers.mp.colors + for c in string.utfcharacters(str) do + if incomment then + result[#result+1] = buffers.escaped_chr(c) + elseif c == '%' then + state = change(buffers.visualizers.mp.states[c], state, result) + incomment = true + result[#result+1] = "\\char" .. byte(c) .. " " + state = finish(state,result) + elseif instr then + if c == '"' then + state = change(buffers.visualizers.mp.states[c], state, result) + instr = false + result[#result+1] = "\\char" .. byte(c) .. " " + state = finish(state,result) + elseif find(c,"^[%a%d]$") then + result[#result+1] = c + else + result[#result+1] = "\\char" .. byte(c) .. " " + end + elseif c == " " then + state, intex = buffers.flush_mp_word_(state, word, intex, result) + word = "" + result[#result+1] = "\\obs " + elseif intex then + if find(c,"^[%a]$") then + word = word .. c + else + state, intex = buffers.flush_mp_word_(state, word, intex, result) + word = "" + if intex then + if find(c,"^[%d]$") then + result[#result+1] = c + else + result[#result+1] = "\\char" .. byte(c) .. " " + end + else + state = change(buffers.visualizers.mp.states[c], state, result) + result[#result+1] = "\\char" .. byte(c) .. " " + end + end + elseif find(c,"^[%a]$") then + state = finish(state,result) + word = word .. c + else + state, intex = buffers.flush_mp_word_(state, word, intex, result) + word = "" + state = change(buffers.visualizers.mp.states[c], state, result) + result[#result+1] = "\\char" .. byte(c) .. " " + instr = (c == '"') + end + end + state, intex = buffers.flush_mp_word_(state, word, intex, result) + state = finish(state,result) + buffers.flush_result(result,false) +end diff --git a/tex/context/base/verb-tex.lua b/tex/context/base/verb-tex.lua new file mode 100644 index 000000000..dbb483ad5 --- /dev/null +++ b/tex/context/base/verb-tex.lua @@ -0,0 +1,122 @@ +-- filename : type-tex.lua +-- comment : companion to core-buf.tex +-- author : Hans Hagen, PRAGMA-ADE, Hasselt NL +-- copyright: PRAGMA ADE / ConTeXt Development Team +-- license : see context related readme files + +if not buffers then buffers = { } end +if not buffers.visualizers then buffers.visualizers = { } end +if not buffers.visualizers.tex then buffers.visualizers.tex = { } end + +buffers.visualizers.tex.colors = { + "prettytwo", + "prettyone", + "prettythree", + "prettyfour" +} + +buffers.visualizers.tex.states = { + ['$']=2, ['{']=2, ['}']=2, + ['[']=3, [']']=3, ['(']=3, [')']=3, ['<']=3, ['>']=3, ['#']=3, ['=']=3, ['"']=3, + ['/']=4, ['^']=4, ['_']=4, ['-']=4, ['&']=4, ['+']=4, ["'"]=4, ['`']=4, ['|']=4, ['%']=4 +} + +-- using a table to store the result does not make sense here (actually, +-- it's substantial slower since we're flushing lines on the fly) +-- +-- we could use a special catcode regime: only \ { } + +function buffers.visualizers.tex.flush_line(str,nested) + local result, state = { }, 0 + local first, escaping = false, false + local byte, find = utf.byte, utf.find + local finish, change = buffers.finish_state, buffers.change_state + buffers.currentcolors = buffers.visualizers.tex.colors + for c in string.utfcharacters(str) do + if c == " " then + if escaping then + result[#result+1] = " " + else + state = finish(state, result) + result[#result+1] = "\\obs " + end + escaping, first = false, false + elseif c == "\t" then + if escaping then + result[#result+1] = " " + else + state = finish(state, result) + result[#result+1] = "\\obs " + end + if buffers.visualizers.enabletab then + result[#result+1] = string.rep("\\obs ",i%buffers.visualizers.tablength) + end + escaping, first = false, false + elseif buffers.visualizers.enableescape and (c == buffers.visualizers.escapetoken) then + if escaping then + if first then + if find(c,"^[%a%!%?%@]$") then + result[#result+1] =c + else + result[#result+1] ="\\char" .. byte(c) .. " " + end + first = false + else + result[#result+1] = "\\" + first = true + end + else + state = finish(state, result) + result[#result+1] = "\\" + escaping, first = true, true + end + elseif escaping then + if find(c,"^[%a%!%?%@]$") then + result[#result+1] = c + else + result[#result+1] = "\\char" .. byte(c) .. " " + end + first = false + elseif first then + state = 1 + if find(c,"^[%a%!%?%@]$") then + result[#result+1] = c + else + result[#result+1] = "\\char" .. byte(c) .. " " + state = finish(state, result) + end + first = false + elseif state == 1 then + if find(c,"^[%a%!%?%@]$") then + result[#result+1] = c + first = false + elseif c == "\\" then + state = change(1, state, result) + result[#result+1] = "\\char" .. byte(c) .. " " + first = true + else + state = change(buffers.visualizers.tex.states[c], state, result) + if state == 0 then + result[#result+1] = c + else + result[#result+1] = "\\char" .. byte(c) .. " " + end + first = false + end + elseif c == "\\" then + first = true + state = change(1, state, result) + result[#result+1] = "\\char" .. byte(c) .. " " + else + state = change(buffers.visualizers.tex.states[c], state, result) + if state == 0 then + result[#result+1] = c + else + result[#result+1] = "\\char" .. byte(c) .. " " + end + first = false + end + end + state = finish(state, result) + buffers.flush_result(result,nested) +end diff --git a/tex/context/base/x-ldx.ctx b/tex/context/base/x-ldx.ctx new file mode 100644 index 000000000..21ef6db5f --- /dev/null +++ b/tex/context/base/x-ldx.ctx @@ -0,0 +1,23 @@ + + + + Lua Documentation + + + mtxrun --verbose --internal x-ldx.lua + + + + + + + purge + forcexml + + + + ldx + + + + diff --git a/tex/context/base/x-ldx.tex b/tex/context/base/x-ldx.tex new file mode 100644 index 000000000..0d9350c1c --- /dev/null +++ b/tex/context/base/x-ldx.tex @@ -0,0 +1,133 @@ +\defineregister[function][functions] +\defineregister[variable][variables] + +\definehead[source][subject] +\definehead[extra] [subsubject] +\definehead[topic] [subsubsubject] + +\setuphead[source][style=\bfb] +\setuphead[extra] [style=\bfa] +\setuphead[topic] [style=\bf] + +\def\LDXkey #1{\bold{#1}} +\def\LDXfunction#1{\LDXkey{function} #1\function{#1}} +\def\LDXvariable#1{#1\variable{#1}} +\def\LDXcomment #1{{\tt--#1}} +\def\LDXsource #1{\source{#1}} + +\defineXMLenvironment + [ldx:document] + {\page} + {\determineregistercharacteristics[function] + \startmode[*register] + \extra{Functions} + \placeregister[function] + \stopmode + \determineregistercharacteristics[variable] + \startmode[*register] + \extra{Variables} + \placeregister[variable] + \stopmode} + +\defineXMLargument [ldx:source] \LDXsource +\defineXMLargument [ldx:key] \LDXkey +\defineXMLargument [ldx:variable] \LDXvariable +\defineXMLargument [ldx:function] \LDXfunction +\defineXMLargument [ldx:com] \LDXcomment + +\newcounter\CommentCounter + +\defineXMLenvironment[ldx:comment] + {\endgraf + \blank + \doglobal\increment\CommentCounter + \margintitle{\bf\CommentCounter}} + {\blank + \endgraf} + +\defineXMLenvironment[ldx:dqs] + {\bgroup\tt"} + {"\egroup} + +\defineXMLenvironment[ldx:sqs] + {\bgroup\tt'} + {'\egroup} + +\defineXMLenvironment[ldx:code] + {\startpacked} + {\stoppacked} + +\defineXMLenvironment[ldx:line][n=0,comment=] % maybe hangindent or leftskip + {\dontleavehmode + \hbox to \hsize\bgroup + \strut\hskip\dimexpr\XMLop{n}em/4\relax\relax + \doif {\XMLop{comment}} {yes} {\tt}} + {\hss + \egroup + \endgraf} + +\defineXMLsingular[ldx:line] + {\crlf} + +\defineXMLargument [source] \LDXsource +\defineXMLargument [key] \LDXkey + +\defineXMLsingular[logo][label=,name=] + {\uppercasestring\XMLop{label}\XMLop{label}\to\ascii + \getvalue{\ascii}} + +\defineXMLsingular[l][l=,n=] + {\uppercasestring\XMLop{l}\XMLop{l}\to\ascii + \getvalue{\ascii}} + +\defineXMLenvironment + [typing] + {\blank + \startpacked \tt + \obeyspaces} + {\stoppacked + \blank} + +\defineXMLentity[amp]{\&} +\defineXMLentity[lt] {<} +\defineXMLentity[gt] {>} + +\usemodule[abr-02] + +\startnotmode[atpragma] + \definetypeface[mainfacenormal] [ss][sans] [iwona] [default] + \definetypeface[mainfacenormal] [rm][serif][palatino] [default] + \definetypeface[mainfacenormal] [tt][mono] [modern] [default][rscale=1.1] + \definetypeface[mainfacenormal] [mm][math] [iwona] [default][encoding=default] + + \definetypeface[mainfacemedium] [ss][sans] [iwona-medium][default] + \definetypeface[mainfacenormal] [rm][serif][palatino] [default] + \definetypeface[mainfacemedium] [tt][mono] [modern] [default][rscale=1.1] + \definetypeface[mainfacemedium] [mm][math] [iwona-medium][default][encoding=default] + + \definetypeface[mainfacenarrowtt][tt][mono] [modern-cond] [default][rscale=1.1] +\stopnotmode + +\startmode[atpragma] + \usetypescriptfile[type-ghz] + + \definetypeface[mainfacenormal] [ss][sans] [optima-nova] [default] + \definetypeface[mainfacenormal] [rm][serif][palatino] [default] + \definetypeface[mainfacenormal] [tt][mono] [modern] [default][rscale=1.1] + \definetypeface[mainfacenormal] [mm][math] [palatino] [default][encoding=default] + + \definetypeface[mainfacemedium] [ss][sans] [optima-nova] [default] + \definetypeface[mainfacenormal] [rm][serif][palatino] [default] + \definetypeface[mainfacemedium] [tt][mono] [modern] [default][rscale=1.1] + \definetypeface[mainfacemedium] [mm][math] [palatino] [default][encoding=default] + + \definetypeface[mainfacenarrowtt][tt][mono] [modern-cond] [default][rscale=1.1] +\stopmode + +\setupbodyfont[mainfacenormal,11pt] + +\setupwhitespace[big] + +% \starttext +% \processXMLfilegrouped{\inputfilename} +% \stoptext diff --git a/tex/context/interface/keys-cz.xml b/tex/context/interface/keys-cz.xml index 4a67e283b..7bb8e9000 100644 --- a/tex/context/interface/keys-cz.xml +++ b/tex/context/interface/keys-cz.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-de.xml b/tex/context/interface/keys-de.xml index a05e281b4..9611a5593 100644 --- a/tex/context/interface/keys-de.xml +++ b/tex/context/interface/keys-de.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-en.xml b/tex/context/interface/keys-en.xml index e205814a8..2b623712e 100644 --- a/tex/context/interface/keys-en.xml +++ b/tex/context/interface/keys-en.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-fr.xml b/tex/context/interface/keys-fr.xml index 291669d90..afdee8099 100644 --- a/tex/context/interface/keys-fr.xml +++ b/tex/context/interface/keys-fr.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-it.xml b/tex/context/interface/keys-it.xml index d038e931d..3a6de75a1 100644 --- a/tex/context/interface/keys-it.xml +++ b/tex/context/interface/keys-it.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-nl.xml b/tex/context/interface/keys-nl.xml index 1c67d4b4b..5fccd10a7 100644 --- a/tex/context/interface/keys-nl.xml +++ b/tex/context/interface/keys-nl.xml @@ -1,6 +1,6 @@ - + diff --git a/tex/context/interface/keys-ro.xml b/tex/context/interface/keys-ro.xml index dfcc7003a..f1194cf49 100644 --- a/tex/context/interface/keys-ro.xml +++ b/tex/context/interface/keys-ro.xml @@ -1,6 +1,6 @@ - + -- cgit v1.2.3