From 0b97630d6b30551ffe05b5d8124305b1065f729d Mon Sep 17 00:00:00 2001 From: Thiago Kenji Okada Date: Thu, 22 Aug 2024 16:13:56 +0100 Subject: [PATCH] vendor: init --- .../github.com/alecthomas/chroma/.gitignore | 19 + .../alecthomas/chroma/.golangci.yml | 76 + .../alecthomas/chroma/.goreleaser.yml | 37 + vendor/github.com/alecthomas/chroma/COPYING | 19 + vendor/github.com/alecthomas/chroma/Makefile | 19 + vendor/github.com/alecthomas/chroma/README.md | 285 + .../github.com/alecthomas/chroma/coalesce.go | 35 + vendor/github.com/alecthomas/chroma/colour.go | 164 + .../github.com/alecthomas/chroma/delegate.go | 137 + vendor/github.com/alecthomas/chroma/doc.go | 7 + .../github.com/alecthomas/chroma/formatter.go | 43 + .../alecthomas/chroma/formatters/html/html.go | 500 + .../github.com/alecthomas/chroma/iterator.go | 76 + vendor/github.com/alecthomas/chroma/lexer.go | 128 + .../alecthomas/chroma/lexers/README.md | 40 + .../alecthomas/chroma/lexers/a/abap.go | 60 + .../alecthomas/chroma/lexers/a/abnf.go | 42 + .../chroma/lexers/a/actionscript.go | 43 + .../chroma/lexers/a/actionscript3.go | 60 + .../alecthomas/chroma/lexers/a/ada.go | 118 + .../alecthomas/chroma/lexers/a/al.go | 47 + .../alecthomas/chroma/lexers/a/angular2.go | 46 + .../alecthomas/chroma/lexers/a/antlr.go | 105 + .../alecthomas/chroma/lexers/a/apache.go | 42 + .../alecthomas/chroma/lexers/a/apl.go | 40 + .../alecthomas/chroma/lexers/a/applescript.go | 59 + .../alecthomas/chroma/lexers/a/arduino.go | 114 + .../alecthomas/chroma/lexers/a/armasm.go | 72 + .../alecthomas/chroma/lexers/a/awk.go | 52 + .../alecthomas/chroma/lexers/b/ballerina.go | 50 + .../alecthomas/chroma/lexers/b/bash.go | 100 + .../alecthomas/chroma/lexers/b/bashsession.go | 27 + .../alecthomas/chroma/lexers/b/batch.go | 198 + .../alecthomas/chroma/lexers/b/bibtex.go | 80 + .../alecthomas/chroma/lexers/b/bicep.go | 112 + .../alecthomas/chroma/lexers/b/blitz.go | 52 + .../alecthomas/chroma/lexers/b/bnf.go | 28 + .../alecthomas/chroma/lexers/b/brainfuck.go | 38 + .../alecthomas/chroma/lexers/c/c.go | 96 + .../alecthomas/chroma/lexers/c/caddyfile.go | 216 + .../alecthomas/chroma/lexers/c/capnproto.go | 65 + .../alecthomas/chroma/lexers/c/ceylon.go | 67 + .../alecthomas/chroma/lexers/c/cfengine3.go | 60 + .../alecthomas/chroma/lexers/c/chaiscript.go | 67 + .../alecthomas/chroma/lexers/c/cheetah.go | 41 + .../alecthomas/chroma/lexers/c/cl.go | 310 + .../alecthomas/chroma/lexers/c/clojure.go | 42 + .../alecthomas/chroma/lexers/c/cmake.go | 48 + .../alecthomas/chroma/lexers/c/cobol.go | 55 + .../alecthomas/chroma/lexers/c/coffee.go | 95 + .../alecthomas/chroma/lexers/c/coldfusion.go | 52 + .../alecthomas/chroma/lexers/c/coq.go | 67 + .../alecthomas/chroma/lexers/c/cpp.go | 110 + .../alecthomas/chroma/lexers/c/cql.go | 74 + .../alecthomas/chroma/lexers/c/crystal.go | 266 + .../alecthomas/chroma/lexers/c/csharp.go | 56 + .../alecthomas/chroma/lexers/c/css.go | 121 + .../alecthomas/chroma/lexers/c/cython.go | 139 + .../alecthomas/chroma/lexers/circular/doc.go | 2 + .../alecthomas/chroma/lexers/circular/php.go | 86 + .../chroma/lexers/circular/phtml.go | 39 + .../alecthomas/chroma/lexers/d/d.go | 73 + .../alecthomas/chroma/lexers/d/dart.go | 95 + .../alecthomas/chroma/lexers/d/diff.go | 33 + .../alecthomas/chroma/lexers/d/django.go | 57 + .../alecthomas/chroma/lexers/d/docker.go | 35 + .../alecthomas/chroma/lexers/d/dtd.go | 73 + .../alecthomas/chroma/lexers/d/dylan.go | 76 + .../alecthomas/chroma/lexers/e/ebnf.go | 55 + .../alecthomas/chroma/lexers/e/elixir.go | 281 + .../alecthomas/chroma/lexers/e/elm.go | 63 + .../alecthomas/chroma/lexers/e/emacs.go | 586 + .../alecthomas/chroma/lexers/e/erlang.go | 70 + .../alecthomas/chroma/lexers/f/factor.go | 119 + .../alecthomas/chroma/lexers/f/fennel.go | 66 + .../alecthomas/chroma/lexers/f/fish.go | 98 + .../alecthomas/chroma/lexers/f/forth.go | 44 + .../alecthomas/chroma/lexers/f/fortran.go | 51 + .../chroma/lexers/f/fortran_fixed.go | 39 + .../alecthomas/chroma/lexers/f/fsharp.go | 98 + .../alecthomas/chroma/lexers/g/gas.go | 59 + .../alecthomas/chroma/lexers/g/gdscript.go | 128 + .../alecthomas/chroma/lexers/g/genshi.go | 120 + .../alecthomas/chroma/lexers/g/gherkin.go | 122 + .../alecthomas/chroma/lexers/g/glsl.go | 41 + .../alecthomas/chroma/lexers/g/gnuplot.go | 121 + .../alecthomas/chroma/lexers/g/go.go | 123 + .../alecthomas/chroma/lexers/g/graphql.go | 49 + .../alecthomas/chroma/lexers/g/groff.go | 47 + .../alecthomas/chroma/lexers/g/groovy.go | 62 + .../alecthomas/chroma/lexers/h/handlebars.go | 60 + .../alecthomas/chroma/lexers/h/haskell.go | 103 + .../alecthomas/chroma/lexers/h/haxe.go | 646 + .../alecthomas/chroma/lexers/h/hcl.go | 73 + .../alecthomas/chroma/lexers/h/hexdump.go | 71 + .../alecthomas/chroma/lexers/h/hlb.go | 58 + .../alecthomas/chroma/lexers/h/html.go | 63 + .../alecthomas/chroma/lexers/h/http.go | 132 + .../alecthomas/chroma/lexers/h/hy.go | 55 + .../alecthomas/chroma/lexers/i/idris.go | 84 + .../alecthomas/chroma/lexers/i/igor.go | 36 + .../alecthomas/chroma/lexers/i/ini.go | 29 + .../alecthomas/chroma/lexers/i/io.go | 44 + .../alecthomas/chroma/lexers/internal/api.go | 201 + .../alecthomas/chroma/lexers/j/j.go | 77 + .../alecthomas/chroma/lexers/j/java.go | 56 + .../alecthomas/chroma/lexers/j/javascript.go | 74 + .../alecthomas/chroma/lexers/j/json.go | 65 + .../alecthomas/chroma/lexers/j/jsx.go | 99 + .../alecthomas/chroma/lexers/j/julia.go | 134 + .../alecthomas/chroma/lexers/j/jungle.go | 54 + .../alecthomas/chroma/lexers/k/kotlin.go | 98 + .../alecthomas/chroma/lexers/l/lighttpd.go | 34 + .../alecthomas/chroma/lexers/l/llvm.go | 47 + .../alecthomas/chroma/lexers/l/lua.go | 79 + .../alecthomas/chroma/lexers/lexers.go | 60 + .../alecthomas/chroma/lexers/m/make.go | 58 + .../alecthomas/chroma/lexers/m/mako.go | 64 + .../alecthomas/chroma/lexers/m/markdown.go | 53 + .../alecthomas/chroma/lexers/m/mason.go | 47 + .../alecthomas/chroma/lexers/m/mathematica.go | 36 + .../alecthomas/chroma/lexers/m/matlab.go | 55 + .../alecthomas/chroma/lexers/m/mcfunction.go | 109 + .../alecthomas/chroma/lexers/m/meson.go | 51 + .../alecthomas/chroma/lexers/m/metal.go | 101 + .../alecthomas/chroma/lexers/m/minizinc.go | 45 + .../alecthomas/chroma/lexers/m/mlir.go | 47 + .../alecthomas/chroma/lexers/m/modula2.go | 119 + .../alecthomas/chroma/lexers/m/monkeyc.go | 66 + .../alecthomas/chroma/lexers/m/mwscript.go | 57 + .../alecthomas/chroma/lexers/m/myghty.go | 44 + .../alecthomas/chroma/lexers/m/mysql.go | 83 + .../alecthomas/chroma/lexers/n/nasm.go | 63 + .../alecthomas/chroma/lexers/n/newspeak.go | 59 + .../alecthomas/chroma/lexers/n/nginx.go | 51 + .../alecthomas/chroma/lexers/n/nim.go | 97 + .../alecthomas/chroma/lexers/n/nix.go | 126 + .../alecthomas/chroma/lexers/o/objectivec.go | 169 + .../alecthomas/chroma/lexers/o/ocaml.go | 70 + .../alecthomas/chroma/lexers/o/octave.go | 50 + .../chroma/lexers/o/onesenterprise.go | 50 + .../alecthomas/chroma/lexers/o/openedgeabl.go | 50 + .../alecthomas/chroma/lexers/o/openscad.go | 47 + .../alecthomas/chroma/lexers/o/org.go | 108 + .../alecthomas/chroma/lexers/p/pacman.go | 30 + .../alecthomas/chroma/lexers/p/perl.go | 142 + .../alecthomas/chroma/lexers/p/pig.go | 61 + .../alecthomas/chroma/lexers/p/pkgconfig.go | 45 + .../alecthomas/chroma/lexers/p/plaintext.go | 17 + .../alecthomas/chroma/lexers/p/plsql.go | 62 + .../alecthomas/chroma/lexers/p/plutus_core.go | 76 + .../alecthomas/chroma/lexers/p/pony.go | 63 + .../alecthomas/chroma/lexers/p/postgres.go | 83 + .../alecthomas/chroma/lexers/p/postscript.go | 50 + .../alecthomas/chroma/lexers/p/povray.go | 39 + .../alecthomas/chroma/lexers/p/powerquery.go | 38 + .../alecthomas/chroma/lexers/p/powershell.go | 70 + .../alecthomas/chroma/lexers/p/prolog.go | 54 + .../alecthomas/chroma/lexers/p/promql.go | 59 + .../alecthomas/chroma/lexers/p/protobuf.go | 57 + .../alecthomas/chroma/lexers/p/puppet.go | 60 + .../alecthomas/chroma/lexers/p/python.go | 211 + .../alecthomas/chroma/lexers/p/python2.go | 141 + .../alecthomas/chroma/lexers/q/qbasic.go | 71 + .../alecthomas/chroma/lexers/q/qml.go | 58 + .../alecthomas/chroma/lexers/r/r.go | 70 + .../alecthomas/chroma/lexers/r/racket.go | 106 + .../alecthomas/chroma/lexers/r/ragel.go | 80 + .../alecthomas/chroma/lexers/r/raku.go | 1721 + .../alecthomas/chroma/lexers/r/reasonml.go | 71 + .../alecthomas/chroma/lexers/r/regedit.go | 36 + .../alecthomas/chroma/lexers/r/rexx.go | 63 + .../alecthomas/chroma/lexers/r/rst.go | 90 + .../alecthomas/chroma/lexers/r/ruby.go | 254 + .../alecthomas/chroma/lexers/r/rust.go | 133 + .../alecthomas/chroma/lexers/s/sas.go | 98 + .../alecthomas/chroma/lexers/s/sass.go | 148 + .../alecthomas/chroma/lexers/s/scala.go | 116 + .../alecthomas/chroma/lexers/s/scheme.go | 57 + .../alecthomas/chroma/lexers/s/scilab.go | 48 + .../alecthomas/chroma/lexers/s/scss.go | 153 + .../alecthomas/chroma/lexers/s/sieve.go | 37 + .../alecthomas/chroma/lexers/s/smalltalk.go | 103 + .../alecthomas/chroma/lexers/s/smarty.go | 44 + .../alecthomas/chroma/lexers/s/sml.go | 204 + .../alecthomas/chroma/lexers/s/snobol.go | 52 + .../alecthomas/chroma/lexers/s/solidity.go | 118 + .../alecthomas/chroma/lexers/s/sparql.go | 73 + .../alecthomas/chroma/lexers/s/sql.go | 53 + .../alecthomas/chroma/lexers/s/squid.go | 42 + .../alecthomas/chroma/lexers/s/stylus.go | 66 + .../alecthomas/chroma/lexers/s/svelte.go | 73 + .../alecthomas/chroma/lexers/s/swift.go | 91 + .../alecthomas/chroma/lexers/s/systemd.go | 33 + .../chroma/lexers/s/systemverilog.go | 77 + .../alecthomas/chroma/lexers/t/tablegen.go | 46 + .../alecthomas/chroma/lexers/t/tasm.go | 65 + .../alecthomas/chroma/lexers/t/tcl.go | 120 + .../alecthomas/chroma/lexers/t/tcsh.go | 63 + .../alecthomas/chroma/lexers/t/termcap.go | 46 + .../alecthomas/chroma/lexers/t/terminfo.go | 46 + .../alecthomas/chroma/lexers/t/terraform.go | 64 + .../alecthomas/chroma/lexers/t/tex.go | 60 + .../alecthomas/chroma/lexers/t/thrift.go | 77 + .../alecthomas/chroma/lexers/t/toml.go | 33 + .../alecthomas/chroma/lexers/t/tradingview.go | 44 + .../alecthomas/chroma/lexers/t/transactsql.go | 64 + .../alecthomas/chroma/lexers/t/turing.go | 47 + .../alecthomas/chroma/lexers/t/turtle.go | 71 + .../alecthomas/chroma/lexers/t/twig.go | 58 + .../alecthomas/chroma/lexers/t/typescript.go | 101 + .../alecthomas/chroma/lexers/t/typoscript.go | 138 + .../alecthomas/chroma/lexers/v/vb.go | 77 + .../alecthomas/chroma/lexers/v/verilog.go | 72 + .../alecthomas/chroma/lexers/v/vhdl.go | 70 + .../alecthomas/chroma/lexers/v/vim.go | 41 + .../alecthomas/chroma/lexers/v/vue.go | 111 + .../alecthomas/chroma/lexers/w/wdte.go | 33 + .../alecthomas/chroma/lexers/x/xml.go | 49 + .../alecthomas/chroma/lexers/x/xorg.go | 29 + .../alecthomas/chroma/lexers/y/yaml.go | 58 + .../alecthomas/chroma/lexers/y/yang.go | 71 + .../alecthomas/chroma/lexers/z/zed.go | 53 + .../alecthomas/chroma/lexers/z/zig.go | 58 + .../github.com/alecthomas/chroma/mutators.go | 131 + .../alecthomas/chroma/pygments-lexers.txt | 322 + vendor/github.com/alecthomas/chroma/regexp.go | 572 + vendor/github.com/alecthomas/chroma/remap.go | 80 + vendor/github.com/alecthomas/chroma/style.go | 344 + .../alecthomas/chroma/styles/abap.go | 18 + .../alecthomas/chroma/styles/algol.go | 25 + .../alecthomas/chroma/styles/algol_nu.go | 25 + .../alecthomas/chroma/styles/api.go | 37 + .../alecthomas/chroma/styles/arduino.go | 25 + .../alecthomas/chroma/styles/autumn.go | 43 + .../alecthomas/chroma/styles/base16-snazzy.go | 81 + .../alecthomas/chroma/styles/borland.go | 33 + .../github.com/alecthomas/chroma/styles/bw.go | 30 + .../alecthomas/chroma/styles/colorful.go | 59 + .../alecthomas/chroma/styles/doom-one.go | 58 + .../alecthomas/chroma/styles/doom-one2.go | 71 + .../alecthomas/chroma/styles/dracula.go | 81 + .../alecthomas/chroma/styles/emacs.go | 51 + .../alecthomas/chroma/styles/friendly.go | 51 + .../alecthomas/chroma/styles/fruity.go | 26 + .../alecthomas/chroma/styles/github.go | 51 + .../alecthomas/chroma/styles/hr_dark.go | 17 + .../chroma/styles/hr_high_contrast.go | 19 + .../alecthomas/chroma/styles/igor.go | 16 + .../alecthomas/chroma/styles/lovelace.go | 60 + .../alecthomas/chroma/styles/manni.go | 51 + .../alecthomas/chroma/styles/monokai.go | 36 + .../alecthomas/chroma/styles/monokailight.go | 33 + .../alecthomas/chroma/styles/murphy.go | 59 + .../alecthomas/chroma/styles/native.go | 42 + .../alecthomas/chroma/styles/nord.go | 75 + .../chroma/styles/onesenterprise.go | 17 + .../alecthomas/chroma/styles/paraiso-dark.go | 44 + .../alecthomas/chroma/styles/paraiso-light.go | 44 + .../alecthomas/chroma/styles/pastie.go | 52 + .../alecthomas/chroma/styles/perldoc.go | 44 + .../alecthomas/chroma/styles/pygments.go | 55 + .../alecthomas/chroma/styles/rainbow_dash.go | 47 + .../alecthomas/chroma/styles/rrt.go | 20 + .../chroma/styles/solarized-dark.go | 46 + .../chroma/styles/solarized-dark256.go | 48 + .../chroma/styles/solarized-light.go | 24 + .../alecthomas/chroma/styles/swapoff.go | 25 + .../alecthomas/chroma/styles/tango.go | 79 + .../alecthomas/chroma/styles/trac.go | 42 + .../alecthomas/chroma/styles/vim.go | 36 + .../github.com/alecthomas/chroma/styles/vs.go | 23 + .../alecthomas/chroma/styles/vulcan.go | 95 + .../alecthomas/chroma/styles/witchhazel.go | 52 + .../alecthomas/chroma/styles/xcode-dark.go | 62 + .../alecthomas/chroma/styles/xcode.go | 29 + vendor/github.com/alecthomas/chroma/table.py | 32 + .../alecthomas/chroma/tokentype_string.go | 219 + vendor/github.com/alecthomas/chroma/types.go | 356 + vendor/github.com/dlclark/regexp2/.gitignore | 27 + vendor/github.com/dlclark/regexp2/.travis.yml | 7 + vendor/github.com/dlclark/regexp2/ATTRIB | 133 + vendor/github.com/dlclark/regexp2/LICENSE | 21 + vendor/github.com/dlclark/regexp2/README.md | 174 + .../github.com/dlclark/regexp2/fastclock.go | 129 + vendor/github.com/dlclark/regexp2/match.go | 349 + vendor/github.com/dlclark/regexp2/regexp.go | 395 + vendor/github.com/dlclark/regexp2/replace.go | 177 + vendor/github.com/dlclark/regexp2/runner.go | 1613 + .../dlclark/regexp2/syntax/charclass.go | 865 + .../github.com/dlclark/regexp2/syntax/code.go | 274 + .../dlclark/regexp2/syntax/escape.go | 94 + .../github.com/dlclark/regexp2/syntax/fuzz.go | 20 + .../dlclark/regexp2/syntax/parser.go | 2262 + .../dlclark/regexp2/syntax/prefix.go | 896 + .../dlclark/regexp2/syntax/replacerdata.go | 87 + .../github.com/dlclark/regexp2/syntax/tree.go | 654 + .../dlclark/regexp2/syntax/writer.go | 500 + vendor/github.com/dlclark/regexp2/testoutput1 | 7061 +++ .../elliotchance/orderedmap/v2/LICENSE | 21 + .../elliotchance/orderedmap/v2/iterator.go | 26 + .../elliotchance/orderedmap/v2/list.go | 95 + .../elliotchance/orderedmap/v2/orderedmap.go | 124 + vendor/github.com/gorilla/feeds/.editorconfig | 20 + vendor/github.com/gorilla/feeds/.gitignore | 1 + vendor/github.com/gorilla/feeds/LICENSE | 28 + vendor/github.com/gorilla/feeds/Makefile | 34 + vendor/github.com/gorilla/feeds/README.md | 198 + vendor/github.com/gorilla/feeds/atom.go | 178 + vendor/github.com/gorilla/feeds/doc.go | 73 + vendor/github.com/gorilla/feeds/feed.go | 146 + vendor/github.com/gorilla/feeds/json.go | 190 + vendor/github.com/gorilla/feeds/rss.go | 183 + vendor/github.com/gorilla/feeds/test.atom | 92 + vendor/github.com/gorilla/feeds/test.rss | 96 + .../github.com/gorilla/feeds/to-implement.md | 20 + vendor/github.com/gorilla/feeds/uuid.go | 27 + vendor/github.com/gosimple/slug/.gitignore | 3 + vendor/github.com/gosimple/slug/LICENSE | 373 + vendor/github.com/gosimple/slug/README.md | 98 + vendor/github.com/gosimple/slug/codecov.yml | 4 + vendor/github.com/gosimple/slug/doc.go | 47 + .../gosimple/slug/languages_substitution.go | 313 + vendor/github.com/gosimple/slug/slug.go | 213 + .../github.com/gosimple/unidecode/.gitignore | 23 + vendor/github.com/gosimple/unidecode/LICENSE | 203 + .../github.com/gosimple/unidecode/README.md | 58 + .../github.com/gosimple/unidecode/decode.go | 44 + .../gosimple/unidecode/make_table.go | 80 + vendor/github.com/gosimple/unidecode/table.go | 5 + .../github.com/gosimple/unidecode/table.txt | 46731 ++++++++++++++++ .../gosimple/unidecode/unidecode.go | 58 + .../teekennedy/goldmark-markdown/.gitignore | 1 + .../teekennedy/goldmark-markdown/LICENSE | 25 + .../teekennedy/goldmark-markdown/README.md | 177 + .../teekennedy/goldmark-markdown/options.go | 271 + .../teekennedy/goldmark-markdown/renderer.go | 406 + .../teekennedy/goldmark-markdown/writer.go | 173 + .../yuin/goldmark-highlighting/.gitignore | 13 + .../yuin/goldmark-highlighting/LICENSE | 21 + .../yuin/goldmark-highlighting/README.md | 66 + .../goldmark-highlighting/highlighting.go | 578 + vendor/github.com/yuin/goldmark/.gitignore | 19 + vendor/github.com/yuin/goldmark/.golangci.yml | 105 + vendor/github.com/yuin/goldmark/LICENSE | 21 + vendor/github.com/yuin/goldmark/Makefile | 13 + vendor/github.com/yuin/goldmark/README.md | 568 + vendor/github.com/yuin/goldmark/ast/ast.go | 508 + vendor/github.com/yuin/goldmark/ast/block.go | 508 + vendor/github.com/yuin/goldmark/ast/inline.go | 549 + .../goldmark/extension/ast/definition_list.go | 83 + .../yuin/goldmark/extension/ast/footnote.go | 138 + .../goldmark/extension/ast/strikethrough.go | 29 + .../yuin/goldmark/extension/ast/table.go | 158 + .../yuin/goldmark/extension/ast/tasklist.go | 35 + .../github.com/yuin/goldmark/extension/cjk.go | 72 + .../goldmark/extension/definition_list.go | 274 + .../yuin/goldmark/extension/footnote.go | 691 + .../github.com/yuin/goldmark/extension/gfm.go | 18 + .../yuin/goldmark/extension/linkify.go | 322 + .../yuin/goldmark/extension/package.go | 2 + .../yuin/goldmark/extension/strikethrough.go | 118 + .../yuin/goldmark/extension/table.go | 564 + .../yuin/goldmark/extension/tasklist.go | 120 + .../yuin/goldmark/extension/typographer.go | 348 + vendor/github.com/yuin/goldmark/markdown.go | 141 + .../yuin/goldmark/parser/attribute.go | 329 + .../yuin/goldmark/parser/atx_heading.go | 248 + .../yuin/goldmark/parser/auto_link.go | 42 + .../yuin/goldmark/parser/blockquote.go | 69 + .../yuin/goldmark/parser/code_block.go | 100 + .../yuin/goldmark/parser/code_span.go | 84 + .../yuin/goldmark/parser/delimiter.go | 238 + .../yuin/goldmark/parser/emphasis.go | 50 + .../yuin/goldmark/parser/fcode_block.go | 121 + .../yuin/goldmark/parser/html_block.go | 229 + .../github.com/yuin/goldmark/parser/link.go | 449 + .../yuin/goldmark/parser/link_ref.go | 152 + .../github.com/yuin/goldmark/parser/list.go | 287 + .../yuin/goldmark/parser/list_item.go | 90 + .../yuin/goldmark/parser/paragraph.go | 72 + .../github.com/yuin/goldmark/parser/parser.go | 1259 + .../yuin/goldmark/parser/raw_html.go | 153 + .../yuin/goldmark/parser/setext_headings.go | 126 + .../yuin/goldmark/parser/thematic_break.go | 75 + .../yuin/goldmark/renderer/html/html.go | 1026 + .../yuin/goldmark/renderer/renderer.go | 174 + .../github.com/yuin/goldmark/text/package.go | 2 + .../github.com/yuin/goldmark/text/reader.go | 660 + .../github.com/yuin/goldmark/text/segment.go | 209 + .../yuin/goldmark/util/html5entities.go | 2143 + .../goldmark/util/unicode_case_folding.go | 1535 + vendor/github.com/yuin/goldmark/util/util.go | 982 + .../github.com/yuin/goldmark/util/util_cjk.go | 469 + .../yuin/goldmark/util/util_safe.go | 14 + .../yuin/goldmark/util/util_unsafe.go | 24 + vendor/modules.txt | 67 + 397 files changed, 108666 insertions(+) create mode 100644 vendor/github.com/alecthomas/chroma/.gitignore create mode 100644 vendor/github.com/alecthomas/chroma/.golangci.yml create mode 100644 vendor/github.com/alecthomas/chroma/.goreleaser.yml create mode 100644 vendor/github.com/alecthomas/chroma/COPYING create mode 100644 vendor/github.com/alecthomas/chroma/Makefile create mode 100644 vendor/github.com/alecthomas/chroma/README.md create mode 100644 vendor/github.com/alecthomas/chroma/coalesce.go create mode 100644 vendor/github.com/alecthomas/chroma/colour.go create mode 100644 vendor/github.com/alecthomas/chroma/delegate.go create mode 100644 vendor/github.com/alecthomas/chroma/doc.go create mode 100644 vendor/github.com/alecthomas/chroma/formatter.go create mode 100644 vendor/github.com/alecthomas/chroma/formatters/html/html.go create mode 100644 vendor/github.com/alecthomas/chroma/iterator.go create mode 100644 vendor/github.com/alecthomas/chroma/lexer.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/README.md create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/abap.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/abnf.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/actionscript.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/actionscript3.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/ada.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/al.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/angular2.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/antlr.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/apache.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/apl.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/applescript.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/arduino.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/armasm.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/a/awk.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/b/ballerina.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/b/bash.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/b/bashsession.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/b/batch.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/b/bibtex.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/b/bicep.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/b/blitz.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/b/bnf.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/b/brainfuck.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/c.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/caddyfile.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/capnproto.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/ceylon.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/cfengine3.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/chaiscript.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/cheetah.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/cl.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/clojure.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/cmake.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/cobol.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/coffee.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/coldfusion.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/coq.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/cpp.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/cql.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/crystal.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/csharp.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/css.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/c/cython.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/circular/doc.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/circular/php.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/circular/phtml.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/d/d.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/d/dart.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/d/diff.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/d/django.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/d/docker.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/d/dtd.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/d/dylan.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/e/ebnf.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/e/elixir.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/e/elm.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/e/emacs.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/e/erlang.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/f/factor.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/f/fennel.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/f/fish.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/f/forth.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/f/fortran.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/f/fortran_fixed.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/f/fsharp.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/g/gas.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/g/gdscript.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/g/genshi.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/g/gherkin.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/g/glsl.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/g/gnuplot.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/g/go.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/g/graphql.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/g/groff.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/g/groovy.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/h/handlebars.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/h/haskell.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/h/haxe.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/h/hcl.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/h/hexdump.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/h/hlb.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/h/html.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/h/http.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/h/hy.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/i/idris.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/i/igor.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/i/ini.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/i/io.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/internal/api.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/j/j.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/j/java.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/j/javascript.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/j/json.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/j/jsx.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/j/julia.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/j/jungle.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/k/kotlin.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/l/lighttpd.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/l/llvm.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/l/lua.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/lexers.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/make.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/mako.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/markdown.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/mason.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/mathematica.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/matlab.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/mcfunction.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/meson.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/metal.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/minizinc.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/mlir.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/modula2.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/monkeyc.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/mwscript.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/myghty.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/m/mysql.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/n/nasm.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/n/newspeak.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/n/nginx.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/n/nim.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/n/nix.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/o/objectivec.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/o/ocaml.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/o/octave.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/o/onesenterprise.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/o/openedgeabl.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/o/openscad.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/o/org.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/pacman.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/perl.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/pig.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/pkgconfig.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/plaintext.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/plsql.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/plutus_core.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/pony.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/postgres.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/postscript.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/povray.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/powerquery.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/powershell.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/prolog.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/promql.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/protobuf.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/puppet.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/python.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/p/python2.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/q/qbasic.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/q/qml.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/r/r.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/r/racket.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/r/ragel.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/r/raku.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/r/reasonml.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/r/regedit.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/r/rexx.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/r/rst.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/r/ruby.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/r/rust.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/sas.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/sass.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/scala.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/scheme.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/scilab.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/scss.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/sieve.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/smalltalk.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/smarty.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/sml.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/snobol.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/solidity.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/sparql.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/sql.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/squid.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/stylus.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/svelte.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/swift.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/systemd.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/s/systemverilog.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/tablegen.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/tasm.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/tcl.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/tcsh.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/termcap.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/terminfo.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/terraform.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/tex.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/thrift.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/toml.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/tradingview.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/transactsql.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/turing.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/turtle.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/twig.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/typescript.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/t/typoscript.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/v/vb.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/v/verilog.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/v/vhdl.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/v/vim.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/v/vue.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/w/wdte.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/x/xml.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/x/xorg.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/y/yaml.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/y/yang.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/z/zed.go create mode 100644 vendor/github.com/alecthomas/chroma/lexers/z/zig.go create mode 100644 vendor/github.com/alecthomas/chroma/mutators.go create mode 100644 vendor/github.com/alecthomas/chroma/pygments-lexers.txt create mode 100644 vendor/github.com/alecthomas/chroma/regexp.go create mode 100644 vendor/github.com/alecthomas/chroma/remap.go create mode 100644 vendor/github.com/alecthomas/chroma/style.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/abap.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/algol.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/algol_nu.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/api.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/arduino.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/autumn.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/base16-snazzy.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/borland.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/bw.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/colorful.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/doom-one.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/doom-one2.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/dracula.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/emacs.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/friendly.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/fruity.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/github.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/hr_dark.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/hr_high_contrast.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/igor.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/lovelace.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/manni.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/monokai.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/monokailight.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/murphy.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/native.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/nord.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/onesenterprise.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/paraiso-dark.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/paraiso-light.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/pastie.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/perldoc.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/pygments.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/rainbow_dash.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/rrt.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/solarized-dark.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/solarized-dark256.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/solarized-light.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/swapoff.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/tango.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/trac.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/vim.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/vs.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/vulcan.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/witchhazel.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/xcode-dark.go create mode 100644 vendor/github.com/alecthomas/chroma/styles/xcode.go create mode 100644 vendor/github.com/alecthomas/chroma/table.py create mode 100644 vendor/github.com/alecthomas/chroma/tokentype_string.go create mode 100644 vendor/github.com/alecthomas/chroma/types.go create mode 100644 vendor/github.com/dlclark/regexp2/.gitignore create mode 100644 vendor/github.com/dlclark/regexp2/.travis.yml create mode 100644 vendor/github.com/dlclark/regexp2/ATTRIB create mode 100644 vendor/github.com/dlclark/regexp2/LICENSE create mode 100644 vendor/github.com/dlclark/regexp2/README.md create mode 100644 vendor/github.com/dlclark/regexp2/fastclock.go create mode 100644 vendor/github.com/dlclark/regexp2/match.go create mode 100644 vendor/github.com/dlclark/regexp2/regexp.go create mode 100644 vendor/github.com/dlclark/regexp2/replace.go create mode 100644 vendor/github.com/dlclark/regexp2/runner.go create mode 100644 vendor/github.com/dlclark/regexp2/syntax/charclass.go create mode 100644 vendor/github.com/dlclark/regexp2/syntax/code.go create mode 100644 vendor/github.com/dlclark/regexp2/syntax/escape.go create mode 100644 vendor/github.com/dlclark/regexp2/syntax/fuzz.go create mode 100644 vendor/github.com/dlclark/regexp2/syntax/parser.go create mode 100644 vendor/github.com/dlclark/regexp2/syntax/prefix.go create mode 100644 vendor/github.com/dlclark/regexp2/syntax/replacerdata.go create mode 100644 vendor/github.com/dlclark/regexp2/syntax/tree.go create mode 100644 vendor/github.com/dlclark/regexp2/syntax/writer.go create mode 100644 vendor/github.com/dlclark/regexp2/testoutput1 create mode 100644 vendor/github.com/elliotchance/orderedmap/v2/LICENSE create mode 100644 vendor/github.com/elliotchance/orderedmap/v2/iterator.go create mode 100644 vendor/github.com/elliotchance/orderedmap/v2/list.go create mode 100644 vendor/github.com/elliotchance/orderedmap/v2/orderedmap.go create mode 100644 vendor/github.com/gorilla/feeds/.editorconfig create mode 100644 vendor/github.com/gorilla/feeds/.gitignore create mode 100644 vendor/github.com/gorilla/feeds/LICENSE create mode 100644 vendor/github.com/gorilla/feeds/Makefile create mode 100644 vendor/github.com/gorilla/feeds/README.md create mode 100644 vendor/github.com/gorilla/feeds/atom.go create mode 100644 vendor/github.com/gorilla/feeds/doc.go create mode 100644 vendor/github.com/gorilla/feeds/feed.go create mode 100644 vendor/github.com/gorilla/feeds/json.go create mode 100644 vendor/github.com/gorilla/feeds/rss.go create mode 100644 vendor/github.com/gorilla/feeds/test.atom create mode 100644 vendor/github.com/gorilla/feeds/test.rss create mode 100644 vendor/github.com/gorilla/feeds/to-implement.md create mode 100644 vendor/github.com/gorilla/feeds/uuid.go create mode 100644 vendor/github.com/gosimple/slug/.gitignore create mode 100644 vendor/github.com/gosimple/slug/LICENSE create mode 100644 vendor/github.com/gosimple/slug/README.md create mode 100644 vendor/github.com/gosimple/slug/codecov.yml create mode 100644 vendor/github.com/gosimple/slug/doc.go create mode 100644 vendor/github.com/gosimple/slug/languages_substitution.go create mode 100644 vendor/github.com/gosimple/slug/slug.go create mode 100644 vendor/github.com/gosimple/unidecode/.gitignore create mode 100644 vendor/github.com/gosimple/unidecode/LICENSE create mode 100644 vendor/github.com/gosimple/unidecode/README.md create mode 100644 vendor/github.com/gosimple/unidecode/decode.go create mode 100644 vendor/github.com/gosimple/unidecode/make_table.go create mode 100644 vendor/github.com/gosimple/unidecode/table.go create mode 100644 vendor/github.com/gosimple/unidecode/table.txt create mode 100644 vendor/github.com/gosimple/unidecode/unidecode.go create mode 100644 vendor/github.com/teekennedy/goldmark-markdown/.gitignore create mode 100644 vendor/github.com/teekennedy/goldmark-markdown/LICENSE create mode 100644 vendor/github.com/teekennedy/goldmark-markdown/README.md create mode 100644 vendor/github.com/teekennedy/goldmark-markdown/options.go create mode 100644 vendor/github.com/teekennedy/goldmark-markdown/renderer.go create mode 100644 vendor/github.com/teekennedy/goldmark-markdown/writer.go create mode 100644 vendor/github.com/yuin/goldmark-highlighting/.gitignore create mode 100644 vendor/github.com/yuin/goldmark-highlighting/LICENSE create mode 100644 vendor/github.com/yuin/goldmark-highlighting/README.md create mode 100644 vendor/github.com/yuin/goldmark-highlighting/highlighting.go create mode 100644 vendor/github.com/yuin/goldmark/.gitignore create mode 100644 vendor/github.com/yuin/goldmark/.golangci.yml create mode 100644 vendor/github.com/yuin/goldmark/LICENSE create mode 100644 vendor/github.com/yuin/goldmark/Makefile create mode 100644 vendor/github.com/yuin/goldmark/README.md create mode 100644 vendor/github.com/yuin/goldmark/ast/ast.go create mode 100644 vendor/github.com/yuin/goldmark/ast/block.go create mode 100644 vendor/github.com/yuin/goldmark/ast/inline.go create mode 100644 vendor/github.com/yuin/goldmark/extension/ast/definition_list.go create mode 100644 vendor/github.com/yuin/goldmark/extension/ast/footnote.go create mode 100644 vendor/github.com/yuin/goldmark/extension/ast/strikethrough.go create mode 100644 vendor/github.com/yuin/goldmark/extension/ast/table.go create mode 100644 vendor/github.com/yuin/goldmark/extension/ast/tasklist.go create mode 100644 vendor/github.com/yuin/goldmark/extension/cjk.go create mode 100644 vendor/github.com/yuin/goldmark/extension/definition_list.go create mode 100644 vendor/github.com/yuin/goldmark/extension/footnote.go create mode 100644 vendor/github.com/yuin/goldmark/extension/gfm.go create mode 100644 vendor/github.com/yuin/goldmark/extension/linkify.go create mode 100644 vendor/github.com/yuin/goldmark/extension/package.go create mode 100644 vendor/github.com/yuin/goldmark/extension/strikethrough.go create mode 100644 vendor/github.com/yuin/goldmark/extension/table.go create mode 100644 vendor/github.com/yuin/goldmark/extension/tasklist.go create mode 100644 vendor/github.com/yuin/goldmark/extension/typographer.go create mode 100644 vendor/github.com/yuin/goldmark/markdown.go create mode 100644 vendor/github.com/yuin/goldmark/parser/attribute.go create mode 100644 vendor/github.com/yuin/goldmark/parser/atx_heading.go create mode 100644 vendor/github.com/yuin/goldmark/parser/auto_link.go create mode 100644 vendor/github.com/yuin/goldmark/parser/blockquote.go create mode 100644 vendor/github.com/yuin/goldmark/parser/code_block.go create mode 100644 vendor/github.com/yuin/goldmark/parser/code_span.go create mode 100644 vendor/github.com/yuin/goldmark/parser/delimiter.go create mode 100644 vendor/github.com/yuin/goldmark/parser/emphasis.go create mode 100644 vendor/github.com/yuin/goldmark/parser/fcode_block.go create mode 100644 vendor/github.com/yuin/goldmark/parser/html_block.go create mode 100644 vendor/github.com/yuin/goldmark/parser/link.go create mode 100644 vendor/github.com/yuin/goldmark/parser/link_ref.go create mode 100644 vendor/github.com/yuin/goldmark/parser/list.go create mode 100644 vendor/github.com/yuin/goldmark/parser/list_item.go create mode 100644 vendor/github.com/yuin/goldmark/parser/paragraph.go create mode 100644 vendor/github.com/yuin/goldmark/parser/parser.go create mode 100644 vendor/github.com/yuin/goldmark/parser/raw_html.go create mode 100644 vendor/github.com/yuin/goldmark/parser/setext_headings.go create mode 100644 vendor/github.com/yuin/goldmark/parser/thematic_break.go create mode 100644 vendor/github.com/yuin/goldmark/renderer/html/html.go create mode 100644 vendor/github.com/yuin/goldmark/renderer/renderer.go create mode 100644 vendor/github.com/yuin/goldmark/text/package.go create mode 100644 vendor/github.com/yuin/goldmark/text/reader.go create mode 100644 vendor/github.com/yuin/goldmark/text/segment.go create mode 100644 vendor/github.com/yuin/goldmark/util/html5entities.go create mode 100644 vendor/github.com/yuin/goldmark/util/unicode_case_folding.go create mode 100644 vendor/github.com/yuin/goldmark/util/util.go create mode 100644 vendor/github.com/yuin/goldmark/util/util_cjk.go create mode 100644 vendor/github.com/yuin/goldmark/util/util_safe.go create mode 100644 vendor/github.com/yuin/goldmark/util/util_unsafe.go create mode 100644 vendor/modules.txt diff --git a/vendor/github.com/alecthomas/chroma/.gitignore b/vendor/github.com/alecthomas/chroma/.gitignore new file mode 100644 index 0000000..ccacd12 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/.gitignore @@ -0,0 +1,19 @@ +# Binaries for programs and plugins +*.exe +*.dll +*.so +*.dylib +/cmd/chroma/chroma + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 +.glide/ + +_models/ + +_examples/ diff --git a/vendor/github.com/alecthomas/chroma/.golangci.yml b/vendor/github.com/alecthomas/chroma/.golangci.yml new file mode 100644 index 0000000..ba75573 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/.golangci.yml @@ -0,0 +1,76 @@ +run: + tests: true + skip-dirs: + - _examples + +output: + print-issued-lines: false + +linters: + enable-all: true + disable: + - maligned + - megacheck + - lll + - gocyclo + - dupl + - gochecknoglobals + - funlen + - godox + - wsl + - gomnd + - gocognit + - goerr113 + - nolintlint + - testpackage + - godot + - nestif + - paralleltest + - nlreturn + - cyclop + - exhaustivestruct + - gci + - gofumpt + - errorlint + - exhaustive + - ifshort + - wrapcheck + - stylecheck + +linters-settings: + govet: + check-shadowing: true + gocyclo: + min-complexity: 10 + dupl: + threshold: 100 + goconst: + min-len: 8 + min-occurrences: 3 + forbidigo: + forbid: + - (Must)?NewLexer + exclude_godoc_examples: false + + +issues: + max-per-linter: 0 + max-same: 0 + exclude-use-default: false + exclude: + # Captured by errcheck. + - '^(G104|G204):' + # Very commonly not checked. + - 'Error return value of .(.*\.Help|.*\.MarkFlagRequired|(os\.)?std(out|err)\..*|.*Close|.*Flush|os\.Remove(All)?|.*printf?|os\.(Un)?Setenv). is not checked' + - 'exported method (.*\.MarshalJSON|.*\.UnmarshalJSON|.*\.EntityURN|.*\.GoString|.*\.Pos) should have comment or be unexported' + - 'composite literal uses unkeyed fields' + - 'declaration of "err" shadows declaration' + - 'should not use dot imports' + - 'Potential file inclusion via variable' + - 'should have comment or be unexported' + - 'comment on exported var .* should be of the form' + - 'at least one file in a package should have a package comment' + - 'string literal contains the Unicode' + - 'methods on the same type should have the same receiver name' + - '_TokenType_name should be _TokenTypeName' + - '`_TokenType_map` should be `_TokenTypeMap`' diff --git a/vendor/github.com/alecthomas/chroma/.goreleaser.yml b/vendor/github.com/alecthomas/chroma/.goreleaser.yml new file mode 100644 index 0000000..8cd7592 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/.goreleaser.yml @@ -0,0 +1,37 @@ +project_name: chroma +release: + github: + owner: alecthomas + name: chroma +brews: + - + install: bin.install "chroma" +env: + - CGO_ENABLED=0 +builds: +- goos: + - linux + - darwin + - windows + goarch: + - arm64 + - amd64 + - "386" + goarm: + - "6" + dir: ./cmd/chroma + main: . + ldflags: -s -w -X main.version={{.Version}} -X main.commit={{.Commit}} -X main.date={{.Date}} + binary: chroma +archives: + - + format: tar.gz + name_template: '{{ .Binary }}-{{ .Version }}-{{ .Os }}-{{ .Arch }}{{ if .Arm }}v{{ + .Arm }}{{ end }}' + files: + - COPYING + - README* +snapshot: + name_template: SNAPSHOT-{{ .Commit }} +checksum: + name_template: '{{ .ProjectName }}-{{ .Version }}-checksums.txt' diff --git a/vendor/github.com/alecthomas/chroma/COPYING b/vendor/github.com/alecthomas/chroma/COPYING new file mode 100644 index 0000000..92dc39f --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/COPYING @@ -0,0 +1,19 @@ +Copyright (C) 2017 Alec Thomas + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/alecthomas/chroma/Makefile b/vendor/github.com/alecthomas/chroma/Makefile new file mode 100644 index 0000000..34e3c41 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/Makefile @@ -0,0 +1,19 @@ +.PHONY: chromad upload all + +VERSION ?= $(shell git describe --tags --dirty --always) + +all: README.md tokentype_string.go + +README.md: lexers/*/*.go + ./table.py + +tokentype_string.go: types.go + go generate + +chromad: + rm -f chromad + (export CGOENABLED=0 GOOS=linux GOARCH=amd64; cd ./cmd/chromad && go build -ldflags="-X 'main.version=$(VERSION)'" -o ../../chromad .) + +upload: chromad + scp chromad root@swapoff.org: && \ + ssh root@swapoff.org 'install -m755 ./chromad /srv/http/swapoff.org/bin && service chromad restart' diff --git a/vendor/github.com/alecthomas/chroma/README.md b/vendor/github.com/alecthomas/chroma/README.md new file mode 100644 index 0000000..b62b847 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/README.md @@ -0,0 +1,285 @@ +# Chroma — A general purpose syntax highlighter in pure Go +[![Golang Documentation](https://godoc.org/github.com/alecthomas/chroma?status.svg)](https://godoc.org/github.com/alecthomas/chroma) [![CI](https://github.com/alecthomas/chroma/actions/workflows/ci.yml/badge.svg)](https://github.com/alecthomas/chroma/actions/workflows/ci.yml) [![Slack chat](https://img.shields.io/static/v1?logo=slack&style=flat&label=slack&color=green&message=gophers)](https://invite.slack.golangbridge.org/) + +> **NOTE:** As Chroma has just been released, its API is still in flux. That said, the high-level interface should not change significantly. + +Chroma takes source code and other structured text and converts it into syntax +highlighted HTML, ANSI-coloured text, etc. + +Chroma is based heavily on [Pygments](http://pygments.org/), and includes +translators for Pygments lexers and styles. + + +## Table of Contents + + + +1. [Table of Contents](#table-of-contents) +2. [Supported languages](#supported-languages) +3. [Try it](#try-it) +4. [Using the library](#using-the-library) + 1. [Quick start](#quick-start) + 2. [Identifying the language](#identifying-the-language) + 3. [Formatting the output](#formatting-the-output) + 4. [The HTML formatter](#the-html-formatter) +5. [More detail](#more-detail) + 1. [Lexers](#lexers) + 2. [Formatters](#formatters) + 3. [Styles](#styles) +6. [Command-line interface](#command-line-interface) +7. [What's missing compared to Pygments?](#whats-missing-compared-to-pygments) + + + + +## Supported languages + +Prefix | Language +:----: | -------- +A | ABAP, ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, Arduino, Awk +B | Ballerina, Base Makefile, Bash, Batchfile, BibTeX, Bicep, BlitzBasic, BNF, Brainfuck +C | C, C#, C++, Caddyfile, Caddyfile Directives, Cap'n Proto, Cassandra CQL, Ceylon, CFEngine3, cfstatement, ChaiScript, Cheetah, Clojure, CMake, COBOL, CoffeeScript, Common Lisp, Coq, Crystal, CSS, Cython +D | D, Dart, Diff, Django/Jinja, Docker, DTD, Dylan +E | EBNF, Elixir, Elm, EmacsLisp, Erlang +F | Factor, Fish, Forth, Fortran, FSharp +G | GAS, GDScript, Genshi, Genshi HTML, Genshi Text, Gherkin, GLSL, Gnuplot, Go, Go HTML Template, Go Text Template, GraphQL, Groff, Groovy +H | Handlebars, Haskell, Haxe, HCL, Hexdump, HLB, HTML, HTTP, Hy +I | Idris, Igor, INI, Io +J | J, Java, JavaScript, JSON, Julia, Jungle +K | Kotlin +L | Lighttpd configuration file, LLVM, Lua +M | Mako, markdown, Mason, Mathematica, Matlab, MiniZinc, MLIR, Modula-2, MonkeyC, MorrowindScript, Myghty, MySQL +N | NASM, Newspeak, Nginx configuration file, Nim, Nix +O | Objective-C, OCaml, Octave, OnesEnterprise, OpenEdge ABL, OpenSCAD, Org Mode +P | PacmanConf, Perl, PHP, PHTML, Pig, PkgConfig, PL/pgSQL, plaintext, Pony, PostgreSQL SQL dialect, PostScript, POVRay, PowerShell, Prolog, PromQL, Protocol Buffer, Puppet, Python 2, Python +Q | QBasic +R | R, Racket, Ragel, Raku, react, ReasonML, reg, reStructuredText, Rexx, Ruby, Rust +S | SAS, Sass, Scala, Scheme, Scilab, SCSS, Smalltalk, Smarty, Snobol, Solidity, SPARQL, SQL, SquidConf, Standard ML, Stylus, Svelte, Swift, SYSTEMD, systemverilog +T | TableGen, TASM, Tcl, Tcsh, Termcap, Terminfo, Terraform, TeX, Thrift, TOML, TradingView, Transact-SQL, Turing, Turtle, Twig, TypeScript, TypoScript, TypoScriptCssData, TypoScriptHtmlData +V | VB.net, verilog, VHDL, VimL, vue +W | WDTE +X | XML, Xorg +Y | YAML, YANG +Z | Zig + + +_I will attempt to keep this section up to date, but an authoritative list can be +displayed with `chroma --list`._ + + +## Try it + +Try out various languages and styles on the [Chroma Playground](https://swapoff.org/chroma/playground/). + + +## Using the library + +Chroma, like Pygments, has the concepts of +[lexers](https://github.com/alecthomas/chroma/tree/master/lexers), +[formatters](https://github.com/alecthomas/chroma/tree/master/formatters) and +[styles](https://github.com/alecthomas/chroma/tree/master/styles). + +Lexers convert source text into a stream of tokens, styles specify how token +types are mapped to colours, and formatters convert tokens and styles into +formatted output. + +A package exists for each of these, containing a global `Registry` variable +with all of the registered implementations. There are also helper functions +for using the registry in each package, such as looking up lexers by name or +matching filenames, etc. + +In all cases, if a lexer, formatter or style can not be determined, `nil` will +be returned. In this situation you may want to default to the `Fallback` +value in each respective package, which provides sane defaults. + + +### Quick start + +A convenience function exists that can be used to simply format some source +text, without any effort: + +```go +err := quick.Highlight(os.Stdout, someSourceCode, "go", "html", "monokai") +``` + + +### Identifying the language + +To highlight code, you'll first have to identify what language the code is +written in. There are three primary ways to do that: + +1. Detect the language from its filename. + + ```go + lexer := lexers.Match("foo.go") + ``` + +3. Explicitly specify the language by its Chroma syntax ID (a full list is available from `lexers.Names()`). + + ```go + lexer := lexers.Get("go") + ``` + +3. Detect the language from its content. + + ```go + lexer := lexers.Analyse("package main\n\nfunc main()\n{\n}\n") + ``` + +In all cases, `nil` will be returned if the language can not be identified. + +```go +if lexer == nil { + lexer = lexers.Fallback +} +``` + +At this point, it should be noted that some lexers can be extremely chatty. To +mitigate this, you can use the coalescing lexer to coalesce runs of identical +token types into a single token: + +```go +lexer = chroma.Coalesce(lexer) +``` + + +### Formatting the output + +Once a language is identified you will need to pick a formatter and a style (theme). + +```go +style := styles.Get("swapoff") +if style == nil { + style = styles.Fallback +} +formatter := formatters.Get("html") +if formatter == nil { + formatter = formatters.Fallback +} +``` + +Then obtain an iterator over the tokens: + +```go +contents, err := ioutil.ReadAll(r) +iterator, err := lexer.Tokenise(nil, string(contents)) +``` + +And finally, format the tokens from the iterator: + +```go +err := formatter.Format(w, style, iterator) +``` + + +### The HTML formatter + +By default the `html` registered formatter generates standalone HTML with +embedded CSS. More flexibility is available through the `formatters/html` package. + +Firstly, the output generated by the formatter can be customised with the +following constructor options: + +- `Standalone()` - generate standalone HTML with embedded CSS. +- `WithClasses()` - use classes rather than inlined style attributes. +- `ClassPrefix(prefix)` - prefix each generated CSS class. +- `TabWidth(width)` - Set the rendered tab width, in characters. +- `WithLineNumbers()` - Render line numbers (style with `LineNumbers`). +- `LinkableLineNumbers()` - Make the line numbers linkable and be a link to themselves. +- `HighlightLines(ranges)` - Highlight lines in these ranges (style with `LineHighlight`). +- `LineNumbersInTable()` - Use a table for formatting line numbers and code, rather than spans. + +If `WithClasses()` is used, the corresponding CSS can be obtained from the formatter with: + +```go +formatter := html.New(html.WithClasses()) +err := formatter.WriteCSS(w, style) +``` + + +## More detail + + +### Lexers + +See the [Pygments documentation](http://pygments.org/docs/lexerdevelopment/) +for details on implementing lexers. Most concepts apply directly to Chroma, +but see existing lexer implementations for real examples. + +In many cases lexers can be automatically converted directly from Pygments by +using the included Python 3 script `pygments2chroma.py`. I use something like +the following: + +```sh +python3 _tools/pygments2chroma.py \ + pygments.lexers.jvm.KotlinLexer \ + > lexers/k/kotlin.go \ + && gofmt -s -w lexers/k/kotlin.go +``` + +See notes in [pygments-lexers.txt](https://github.com/alecthomas/chroma/blob/master/pygments-lexers.txt) +for a list of lexers, and notes on some of the issues importing them. + + +### Formatters + +Chroma supports HTML output, as well as terminal output in 8 colour, 256 colour, and true-colour. + +A `noop` formatter is included that outputs the token text only, and a `tokens` +formatter outputs raw tokens. The latter is useful for debugging lexers. + + +### Styles + +Chroma styles use the [same syntax](http://pygments.org/docs/styles/) as Pygments. + +All Pygments styles have been converted to Chroma using the `_tools/style.py` script. + +When you work with one of [Chroma's styles](https://github.com/alecthomas/chroma/tree/master/styles), know that the `chroma.Background` token type provides the default style for tokens. It does so by defining a foreground color and background color. + +For example, this gives each token name not defined in the style a default color of `#f8f8f8` and uses `#000000` for the highlighted code block's background: + +~~~go +chroma.Background: "#f8f8f2 bg:#000000", +~~~ + +Also, token types in a style file are hierarchical. For instance, when `CommentSpecial` is not defined, Chroma uses the token style from `Comment`. So when several comment tokens use the same color, you'll only need to define `Comment` and override the one that has a different color. + +For a quick overview of the available styles and how they look, check out the [Chroma Style Gallery](https://xyproto.github.io/splash/docs/). + + +## Command-line interface + +A command-line interface to Chroma is included. + +Binaries are available to install from [the releases page](https://github.com/alecthomas/chroma/releases). + +The CLI can be used as a preprocessor to colorise output of `less(1)`, +see documentation for the `LESSOPEN` environment variable. + +The `--fail` flag can be used to suppress output and return with exit status +1 to facilitate falling back to some other preprocessor in case chroma +does not resolve a specific lexer to use for the given file. For example: + +```shell +export LESSOPEN='| p() { chroma --fail "$1" || cat "$1"; }; p "%s"' +``` + +Replace `cat` with your favourite fallback preprocessor. + +When invoked as `.lessfilter`, the `--fail` flag is automatically turned +on under the hood for easy integration with [lesspipe shipping with +Debian and derivatives](https://manpages.debian.org/lesspipe#USER_DEFINED_FILTERS); +for that setup the `chroma` executable can be just symlinked to `~/.lessfilter`. + + +## What's missing compared to Pygments? + +- Quite a few lexers, for various reasons (pull-requests welcome): + - Pygments lexers for complex languages often include custom code to + handle certain aspects, such as Raku's ability to nest code inside + regular expressions. These require time and effort to convert. + - I mostly only converted languages I had heard of, to reduce the porting cost. +- Some more esoteric features of Pygments are omitted for simplicity. +- Though the Chroma API supports content detection, very few languages support them. + I have plans to implement a statistical analyser at some point, but not enough time. diff --git a/vendor/github.com/alecthomas/chroma/coalesce.go b/vendor/github.com/alecthomas/chroma/coalesce.go new file mode 100644 index 0000000..f504895 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/coalesce.go @@ -0,0 +1,35 @@ +package chroma + +// Coalesce is a Lexer interceptor that collapses runs of common types into a single token. +func Coalesce(lexer Lexer) Lexer { return &coalescer{lexer} } + +type coalescer struct{ Lexer } + +func (d *coalescer) Tokenise(options *TokeniseOptions, text string) (Iterator, error) { + var prev Token + it, err := d.Lexer.Tokenise(options, text) + if err != nil { + return nil, err + } + return func() Token { + for token := it(); token != (EOF); token = it() { + if len(token.Value) == 0 { + continue + } + if prev == EOF { + prev = token + } else { + if prev.Type == token.Type && len(prev.Value) < 8192 { + prev.Value += token.Value + } else { + out := prev + prev = token + return out + } + } + } + out := prev + prev = EOF + return out + }, nil +} diff --git a/vendor/github.com/alecthomas/chroma/colour.go b/vendor/github.com/alecthomas/chroma/colour.go new file mode 100644 index 0000000..15d794c --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/colour.go @@ -0,0 +1,164 @@ +package chroma + +import ( + "fmt" + "math" + "strconv" + "strings" +) + +// ANSI2RGB maps ANSI colour names, as supported by Chroma, to hex RGB values. +var ANSI2RGB = map[string]string{ + "#ansiblack": "000000", + "#ansidarkred": "7f0000", + "#ansidarkgreen": "007f00", + "#ansibrown": "7f7fe0", + "#ansidarkblue": "00007f", + "#ansipurple": "7f007f", + "#ansiteal": "007f7f", + "#ansilightgray": "e5e5e5", + // Normal + "#ansidarkgray": "555555", + "#ansired": "ff0000", + "#ansigreen": "00ff00", + "#ansiyellow": "ffff00", + "#ansiblue": "0000ff", + "#ansifuchsia": "ff00ff", + "#ansiturquoise": "00ffff", + "#ansiwhite": "ffffff", + + // Aliases without the "ansi" prefix, because...why? + "#black": "000000", + "#darkred": "7f0000", + "#darkgreen": "007f00", + "#brown": "7f7fe0", + "#darkblue": "00007f", + "#purple": "7f007f", + "#teal": "007f7f", + "#lightgray": "e5e5e5", + // Normal + "#darkgray": "555555", + "#red": "ff0000", + "#green": "00ff00", + "#yellow": "ffff00", + "#blue": "0000ff", + "#fuchsia": "ff00ff", + "#turquoise": "00ffff", + "#white": "ffffff", +} + +// Colour represents an RGB colour. +type Colour int32 + +// NewColour creates a Colour directly from RGB values. +func NewColour(r, g, b uint8) Colour { + return ParseColour(fmt.Sprintf("%02x%02x%02x", r, g, b)) +} + +// Distance between this colour and another. +// +// This uses the approach described here (https://www.compuphase.com/cmetric.htm). +// This is not as accurate as LAB, et. al. but is *vastly* simpler and sufficient for our needs. +func (c Colour) Distance(e2 Colour) float64 { + ar, ag, ab := int64(c.Red()), int64(c.Green()), int64(c.Blue()) + br, bg, bb := int64(e2.Red()), int64(e2.Green()), int64(e2.Blue()) + rmean := (ar + br) / 2 + r := ar - br + g := ag - bg + b := ab - bb + return math.Sqrt(float64((((512 + rmean) * r * r) >> 8) + 4*g*g + (((767 - rmean) * b * b) >> 8))) +} + +// Brighten returns a copy of this colour with its brightness adjusted. +// +// If factor is negative, the colour is darkened. +// +// Uses approach described here (http://www.pvladov.com/2012/09/make-color-lighter-or-darker.html). +func (c Colour) Brighten(factor float64) Colour { + r := float64(c.Red()) + g := float64(c.Green()) + b := float64(c.Blue()) + + if factor < 0 { + factor++ + r *= factor + g *= factor + b *= factor + } else { + r = (255-r)*factor + r + g = (255-g)*factor + g + b = (255-b)*factor + b + } + return NewColour(uint8(r), uint8(g), uint8(b)) +} + +// BrightenOrDarken brightens a colour if it is < 0.5 brighteness or darkens if > 0.5 brightness. +func (c Colour) BrightenOrDarken(factor float64) Colour { + if c.Brightness() < 0.5 { + return c.Brighten(factor) + } + return c.Brighten(-factor) +} + +// Brightness of the colour (roughly) in the range 0.0 to 1.0 +func (c Colour) Brightness() float64 { + return (float64(c.Red()) + float64(c.Green()) + float64(c.Blue())) / 255.0 / 3.0 +} + +// ParseColour in the forms #rgb, #rrggbb, #ansi, or #. +// Will return an "unset" colour if invalid. +func ParseColour(colour string) Colour { + colour = normaliseColour(colour) + n, err := strconv.ParseUint(colour, 16, 32) + if err != nil { + return 0 + } + return Colour(n + 1) +} + +// MustParseColour is like ParseColour except it panics if the colour is invalid. +// +// Will panic if colour is in an invalid format. +func MustParseColour(colour string) Colour { + parsed := ParseColour(colour) + if !parsed.IsSet() { + panic(fmt.Errorf("invalid colour %q", colour)) + } + return parsed +} + +// IsSet returns true if the colour is set. +func (c Colour) IsSet() bool { return c != 0 } + +func (c Colour) String() string { return fmt.Sprintf("#%06x", int(c-1)) } +func (c Colour) GoString() string { return fmt.Sprintf("Colour(0x%06x)", int(c-1)) } + +// Red component of colour. +func (c Colour) Red() uint8 { return uint8(((c - 1) >> 16) & 0xff) } + +// Green component of colour. +func (c Colour) Green() uint8 { return uint8(((c - 1) >> 8) & 0xff) } + +// Blue component of colour. +func (c Colour) Blue() uint8 { return uint8((c - 1) & 0xff) } + +// Colours is an orderable set of colours. +type Colours []Colour + +func (c Colours) Len() int { return len(c) } +func (c Colours) Swap(i, j int) { c[i], c[j] = c[j], c[i] } +func (c Colours) Less(i, j int) bool { return c[i] < c[j] } + +// Convert colours to #rrggbb. +func normaliseColour(colour string) string { + if ansi, ok := ANSI2RGB[colour]; ok { + return ansi + } + if strings.HasPrefix(colour, "#") { + colour = colour[1:] + if len(colour) == 3 { + return colour[0:1] + colour[0:1] + colour[1:2] + colour[1:2] + colour[2:3] + colour[2:3] + } + } + return colour +} diff --git a/vendor/github.com/alecthomas/chroma/delegate.go b/vendor/github.com/alecthomas/chroma/delegate.go new file mode 100644 index 0000000..5cef01b --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/delegate.go @@ -0,0 +1,137 @@ +package chroma + +import ( + "bytes" +) + +type delegatingLexer struct { + root Lexer + language Lexer +} + +// DelegatingLexer combines two lexers to handle the common case of a language embedded inside another, such as PHP +// inside HTML or PHP inside plain text. +// +// It takes two lexer as arguments: a root lexer and a language lexer. First everything is scanned using the language +// lexer, which must return "Other" for unrecognised tokens. Then all "Other" tokens are lexed using the root lexer. +// Finally, these two sets of tokens are merged. +// +// The lexers from the template lexer package use this base lexer. +func DelegatingLexer(root Lexer, language Lexer) Lexer { + return &delegatingLexer{ + root: root, + language: language, + } +} + +func (d *delegatingLexer) Config() *Config { + return d.language.Config() +} + +// An insertion is the character range where language tokens should be inserted. +type insertion struct { + start, end int + tokens []Token +} + +func (d *delegatingLexer) Tokenise(options *TokeniseOptions, text string) (Iterator, error) { // nolint: gocognit + tokens, err := Tokenise(Coalesce(d.language), options, text) + if err != nil { + return nil, err + } + // Compute insertions and gather "Other" tokens. + others := &bytes.Buffer{} + insertions := []*insertion{} + var insert *insertion + offset := 0 + var last Token + for _, t := range tokens { + if t.Type == Other { + if last != EOF && insert != nil && last.Type != Other { + insert.end = offset + } + others.WriteString(t.Value) + } else { + if last == EOF || last.Type == Other { + insert = &insertion{start: offset} + insertions = append(insertions, insert) + } + insert.tokens = append(insert.tokens, t) + } + last = t + offset += len(t.Value) + } + + if len(insertions) == 0 { + return d.root.Tokenise(options, text) + } + + // Lex the other tokens. + rootTokens, err := Tokenise(Coalesce(d.root), options, others.String()) + if err != nil { + return nil, err + } + + // Interleave the two sets of tokens. + var out []Token + offset = 0 // Offset into text. + tokenIndex := 0 + nextToken := func() Token { + if tokenIndex >= len(rootTokens) { + return EOF + } + t := rootTokens[tokenIndex] + tokenIndex++ + return t + } + insertionIndex := 0 + nextInsertion := func() *insertion { + if insertionIndex >= len(insertions) { + return nil + } + i := insertions[insertionIndex] + insertionIndex++ + return i + } + t := nextToken() + i := nextInsertion() + for t != EOF || i != nil { + // fmt.Printf("%d->%d:%q %d->%d:%q\n", offset, offset+len(t.Value), t.Value, i.start, i.end, Stringify(i.tokens...)) + if t == EOF || (i != nil && i.start < offset+len(t.Value)) { + var l Token + l, t = splitToken(t, i.start-offset) + if l != EOF { + out = append(out, l) + offset += len(l.Value) + } + out = append(out, i.tokens...) + offset += i.end - i.start + if t == EOF { + t = nextToken() + } + i = nextInsertion() + } else { + out = append(out, t) + offset += len(t.Value) + t = nextToken() + } + } + return Literator(out...), nil +} + +func splitToken(t Token, offset int) (l Token, r Token) { + if t == EOF { + return EOF, EOF + } + if offset == 0 { + return EOF, t + } + if offset == len(t.Value) { + return t, EOF + } + l = t.Clone() + r = t.Clone() + l.Value = l.Value[:offset] + r.Value = r.Value[offset:] + return +} diff --git a/vendor/github.com/alecthomas/chroma/doc.go b/vendor/github.com/alecthomas/chroma/doc.go new file mode 100644 index 0000000..4dde77c --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/doc.go @@ -0,0 +1,7 @@ +// Package chroma takes source code and other structured text and converts it into syntax highlighted HTML, ANSI- +// coloured text, etc. +// +// Chroma is based heavily on Pygments, and includes translators for Pygments lexers and styles. +// +// For more information, go here: https://github.com/alecthomas/chroma +package chroma diff --git a/vendor/github.com/alecthomas/chroma/formatter.go b/vendor/github.com/alecthomas/chroma/formatter.go new file mode 100644 index 0000000..00dd5d8 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/formatter.go @@ -0,0 +1,43 @@ +package chroma + +import ( + "io" +) + +// A Formatter for Chroma lexers. +type Formatter interface { + // Format returns a formatting function for tokens. + // + // If the iterator panics, the Formatter should recover. + Format(w io.Writer, style *Style, iterator Iterator) error +} + +// A FormatterFunc is a Formatter implemented as a function. +// +// Guards against iterator panics. +type FormatterFunc func(w io.Writer, style *Style, iterator Iterator) error + +func (f FormatterFunc) Format(w io.Writer, s *Style, it Iterator) (err error) { // nolint + defer func() { + if perr := recover(); perr != nil { + err = perr.(error) + } + }() + return f(w, s, it) +} + +type recoveringFormatter struct { + Formatter +} + +func (r recoveringFormatter) Format(w io.Writer, s *Style, it Iterator) (err error) { + defer func() { + if perr := recover(); perr != nil { + err = perr.(error) + } + }() + return r.Formatter.Format(w, s, it) +} + +// RecoveringFormatter wraps a formatter with panic recovery. +func RecoveringFormatter(formatter Formatter) Formatter { return recoveringFormatter{formatter} } diff --git a/vendor/github.com/alecthomas/chroma/formatters/html/html.go b/vendor/github.com/alecthomas/chroma/formatters/html/html.go new file mode 100644 index 0000000..164c842 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/formatters/html/html.go @@ -0,0 +1,500 @@ +package html + +import ( + "fmt" + "html" + "io" + "sort" + "strings" + + "github.com/alecthomas/chroma" +) + +// Option sets an option of the HTML formatter. +type Option func(f *Formatter) + +// Standalone configures the HTML formatter for generating a standalone HTML document. +func Standalone(b bool) Option { return func(f *Formatter) { f.standalone = b } } + +// ClassPrefix sets the CSS class prefix. +func ClassPrefix(prefix string) Option { return func(f *Formatter) { f.prefix = prefix } } + +// WithClasses emits HTML using CSS classes, rather than inline styles. +func WithClasses(b bool) Option { return func(f *Formatter) { f.Classes = b } } + +// WithAllClasses disables an optimisation that omits redundant CSS classes. +func WithAllClasses(b bool) Option { return func(f *Formatter) { f.allClasses = b } } + +// TabWidth sets the number of characters for a tab. Defaults to 8. +func TabWidth(width int) Option { return func(f *Formatter) { f.tabWidth = width } } + +// PreventSurroundingPre prevents the surrounding pre tags around the generated code. +func PreventSurroundingPre(b bool) Option { + return func(f *Formatter) { + if b { + f.preWrapper = nopPreWrapper + } else { + f.preWrapper = defaultPreWrapper + } + } +} + +// WithPreWrapper allows control of the surrounding pre tags. +func WithPreWrapper(wrapper PreWrapper) Option { + return func(f *Formatter) { + f.preWrapper = wrapper + } +} + +// WrapLongLines wraps long lines. +func WrapLongLines(b bool) Option { + return func(f *Formatter) { + f.wrapLongLines = b + } +} + +// WithLineNumbers formats output with line numbers. +func WithLineNumbers(b bool) Option { + return func(f *Formatter) { + f.lineNumbers = b + } +} + +// LineNumbersInTable will, when combined with WithLineNumbers, separate the line numbers +// and code in table td's, which make them copy-and-paste friendly. +func LineNumbersInTable(b bool) Option { + return func(f *Formatter) { + f.lineNumbersInTable = b + } +} + +// LinkableLineNumbers decorates the line numbers HTML elements with an "id" +// attribute so they can be linked. +func LinkableLineNumbers(b bool, prefix string) Option { + return func(f *Formatter) { + f.linkableLineNumbers = b + f.lineNumbersIDPrefix = prefix + } +} + +// HighlightLines higlights the given line ranges with the Highlight style. +// +// A range is the beginning and ending of a range as 1-based line numbers, inclusive. +func HighlightLines(ranges [][2]int) Option { + return func(f *Formatter) { + f.highlightRanges = ranges + sort.Sort(f.highlightRanges) + } +} + +// BaseLineNumber sets the initial number to start line numbering at. Defaults to 1. +func BaseLineNumber(n int) Option { + return func(f *Formatter) { + f.baseLineNumber = n + } +} + +// New HTML formatter. +func New(options ...Option) *Formatter { + f := &Formatter{ + baseLineNumber: 1, + preWrapper: defaultPreWrapper, + } + for _, option := range options { + option(f) + } + return f +} + +// PreWrapper defines the operations supported in WithPreWrapper. +type PreWrapper interface { + // Start is called to write a start
 element.
+	// The code flag tells whether this block surrounds
+	// highlighted code. This will be false when surrounding
+	// line numbers.
+	Start(code bool, styleAttr string) string
+
+	// End is called to write the end 
element. + End(code bool) string +} + +type preWrapper struct { + start func(code bool, styleAttr string) string + end func(code bool) string +} + +func (p preWrapper) Start(code bool, styleAttr string) string { + return p.start(code, styleAttr) +} + +func (p preWrapper) End(code bool) string { + return p.end(code) +} + +var ( + nopPreWrapper = preWrapper{ + start: func(code bool, styleAttr string) string { return "" }, + end: func(code bool) string { return "" }, + } + defaultPreWrapper = preWrapper{ + start: func(code bool, styleAttr string) string { + if code { + return fmt.Sprintf(`
`, styleAttr)
+			}
+
+			return fmt.Sprintf(`
`, styleAttr)
+		},
+		end: func(code bool) string {
+			if code {
+				return `
` + } + + return `
` + }, + } +) + +// Formatter that generates HTML. +type Formatter struct { + standalone bool + prefix string + Classes bool // Exported field to detect when classes are being used + allClasses bool + preWrapper PreWrapper + tabWidth int + wrapLongLines bool + lineNumbers bool + lineNumbersInTable bool + linkableLineNumbers bool + lineNumbersIDPrefix string + highlightRanges highlightRanges + baseLineNumber int +} + +type highlightRanges [][2]int + +func (h highlightRanges) Len() int { return len(h) } +func (h highlightRanges) Swap(i, j int) { h[i], h[j] = h[j], h[i] } +func (h highlightRanges) Less(i, j int) bool { return h[i][0] < h[j][0] } + +func (f *Formatter) Format(w io.Writer, style *chroma.Style, iterator chroma.Iterator) (err error) { + return f.writeHTML(w, style, iterator.Tokens()) +} + +// We deliberately don't use html/template here because it is two orders of magnitude slower (benchmarked). +// +// OTOH we need to be super careful about correct escaping... +func (f *Formatter) writeHTML(w io.Writer, style *chroma.Style, tokens []chroma.Token) (err error) { // nolint: gocyclo + css := f.styleToCSS(style) + if !f.Classes { + for t, style := range css { + css[t] = compressStyle(style) + } + } + if f.standalone { + fmt.Fprint(w, "\n") + if f.Classes { + fmt.Fprint(w, "") + } + fmt.Fprintf(w, "\n", f.styleAttr(css, chroma.Background)) + } + + wrapInTable := f.lineNumbers && f.lineNumbersInTable + + lines := chroma.SplitTokensIntoLines(tokens) + lineDigits := len(fmt.Sprintf("%d", f.baseLineNumber+len(lines)-1)) + highlightIndex := 0 + + if wrapInTable { + // List line numbers in its own + fmt.Fprintf(w, "\n", f.styleAttr(css, chroma.PreWrapper)) + fmt.Fprintf(w, "", f.styleAttr(css, chroma.LineTable)) + fmt.Fprintf(w, "\n", f.styleAttr(css, chroma.LineTableTD)) + fmt.Fprintf(w, f.preWrapper.Start(false, f.styleAttr(css, chroma.PreWrapper))) + for index := range lines { + line := f.baseLineNumber + index + highlight, next := f.shouldHighlight(highlightIndex, line) + if next { + highlightIndex++ + } + if highlight { + fmt.Fprintf(w, "", f.styleAttr(css, chroma.LineHighlight)) + } + + fmt.Fprintf(w, "%s\n", f.styleAttr(css, chroma.LineNumbersTable), f.lineIDAttribute(line), f.lineTitleWithLinkIfNeeded(lineDigits, line)) + + if highlight { + fmt.Fprintf(w, "") + } + } + fmt.Fprint(w, f.preWrapper.End(false)) + fmt.Fprint(w, "\n") + fmt.Fprintf(w, "\n", f.styleAttr(css, chroma.LineTableTD, "width:100%")) + } + + fmt.Fprintf(w, f.preWrapper.Start(true, f.styleAttr(css, chroma.PreWrapper))) + + highlightIndex = 0 + for index, tokens := range lines { + // 1-based line number. + line := f.baseLineNumber + index + highlight, next := f.shouldHighlight(highlightIndex, line) + if next { + highlightIndex++ + } + + // Start of Line + fmt.Fprint(w, ``) + } else { + fmt.Fprintf(w, "%s>", f.styleAttr(css, chroma.Line)) + } + + // Line number + if f.lineNumbers && !wrapInTable { + fmt.Fprintf(w, "%s", f.styleAttr(css, chroma.LineNumbers), f.lineIDAttribute(line), f.lineTitleWithLinkIfNeeded(lineDigits, line)) + } + + fmt.Fprintf(w, ``, f.styleAttr(css, chroma.CodeLine)) + + for _, token := range tokens { + html := html.EscapeString(token.String()) + attr := f.styleAttr(css, token.Type) + if attr != "" { + html = fmt.Sprintf("%s", attr, html) + } + fmt.Fprint(w, html) + } + + fmt.Fprint(w, ``) // End of CodeLine + + fmt.Fprint(w, ``) // End of Line + } + + fmt.Fprintf(w, f.preWrapper.End(true)) + + if wrapInTable { + fmt.Fprint(w, "\n") + fmt.Fprint(w, "\n") + } + + if f.standalone { + fmt.Fprint(w, "\n\n") + fmt.Fprint(w, "\n") + } + + return nil +} + +func (f *Formatter) lineIDAttribute(line int) string { + if !f.linkableLineNumbers { + return "" + } + return fmt.Sprintf(" id=\"%s\"", f.lineID(line)) +} + +func (f *Formatter) lineTitleWithLinkIfNeeded(lineDigits, line int) string { + title := fmt.Sprintf("%*d", lineDigits, line) + if !f.linkableLineNumbers { + return title + } + return fmt.Sprintf("%s", f.lineID(line), title) +} + +func (f *Formatter) lineID(line int) string { + return fmt.Sprintf("%s%d", f.lineNumbersIDPrefix, line) +} + +func (f *Formatter) shouldHighlight(highlightIndex, line int) (bool, bool) { + next := false + for highlightIndex < len(f.highlightRanges) && line > f.highlightRanges[highlightIndex][1] { + highlightIndex++ + next = true + } + if highlightIndex < len(f.highlightRanges) { + hrange := f.highlightRanges[highlightIndex] + if line >= hrange[0] && line <= hrange[1] { + return true, next + } + } + return false, next +} + +func (f *Formatter) class(t chroma.TokenType) string { + for t != 0 { + if cls, ok := chroma.StandardTypes[t]; ok { + if cls != "" { + return f.prefix + cls + } + return "" + } + t = t.Parent() + } + if cls := chroma.StandardTypes[t]; cls != "" { + return f.prefix + cls + } + return "" +} + +func (f *Formatter) styleAttr(styles map[chroma.TokenType]string, tt chroma.TokenType, extraCSS ...string) string { + if f.Classes { + cls := f.class(tt) + if cls == "" { + return "" + } + return fmt.Sprintf(` class="%s"`, cls) + } + if _, ok := styles[tt]; !ok { + tt = tt.SubCategory() + if _, ok := styles[tt]; !ok { + tt = tt.Category() + if _, ok := styles[tt]; !ok { + return "" + } + } + } + css := []string{styles[tt]} + css = append(css, extraCSS...) + return fmt.Sprintf(` style="%s"`, strings.Join(css, ";")) +} + +func (f *Formatter) tabWidthStyle() string { + if f.tabWidth != 0 && f.tabWidth != 8 { + return fmt.Sprintf("; -moz-tab-size: %[1]d; -o-tab-size: %[1]d; tab-size: %[1]d", f.tabWidth) + } + return "" +} + +// WriteCSS writes CSS style definitions (without any surrounding HTML). +func (f *Formatter) WriteCSS(w io.Writer, style *chroma.Style) error { + css := f.styleToCSS(style) + // Special-case background as it is mapped to the outer ".chroma" class. + if _, err := fmt.Fprintf(w, "/* %s */ .%sbg { %s }\n", chroma.Background, f.prefix, css[chroma.Background]); err != nil { + return err + } + // Special-case PreWrapper as it is the ".chroma" class. + if _, err := fmt.Fprintf(w, "/* %s */ .%schroma { %s }\n", chroma.PreWrapper, f.prefix, css[chroma.PreWrapper]); err != nil { + return err + } + // Special-case code column of table to expand width. + if f.lineNumbers && f.lineNumbersInTable { + if _, err := fmt.Fprintf(w, "/* %s */ .%schroma .%s:last-child { width: 100%%; }", + chroma.LineTableTD, f.prefix, f.class(chroma.LineTableTD)); err != nil { + return err + } + } + // Special-case line number highlighting when targeted. + if f.lineNumbers || f.lineNumbersInTable { + targetedLineCSS := StyleEntryToCSS(style.Get(chroma.LineHighlight)) + for _, tt := range []chroma.TokenType{chroma.LineNumbers, chroma.LineNumbersTable} { + fmt.Fprintf(w, "/* %s targeted by URL anchor */ .%schroma .%s:target { %s }\n", tt, f.prefix, f.class(tt), targetedLineCSS) + } + } + tts := []int{} + for tt := range css { + tts = append(tts, int(tt)) + } + sort.Ints(tts) + for _, ti := range tts { + tt := chroma.TokenType(ti) + switch tt { + case chroma.Background, chroma.PreWrapper: + continue + } + class := f.class(tt) + if class == "" { + continue + } + styles := css[tt] + if _, err := fmt.Fprintf(w, "/* %s */ .%schroma .%s { %s }\n", tt, f.prefix, class, styles); err != nil { + return err + } + } + return nil +} + +func (f *Formatter) styleToCSS(style *chroma.Style) map[chroma.TokenType]string { + classes := map[chroma.TokenType]string{} + bg := style.Get(chroma.Background) + // Convert the style. + for t := range chroma.StandardTypes { + entry := style.Get(t) + if t != chroma.Background { + entry = entry.Sub(bg) + } + if !f.allClasses && entry.IsZero() { + continue + } + classes[t] = StyleEntryToCSS(entry) + } + classes[chroma.Background] += f.tabWidthStyle() + classes[chroma.PreWrapper] += classes[chroma.Background] + `;` + // Make PreWrapper a grid to show highlight style with full width. + if len(f.highlightRanges) > 0 { + classes[chroma.PreWrapper] += `display: grid;` + } + // Make PreWrapper wrap long lines. + if f.wrapLongLines { + classes[chroma.PreWrapper] += `white-space: pre-wrap; word-break: break-word;` + } + lineNumbersStyle := `white-space: pre; user-select: none; margin-right: 0.4em; padding: 0 0.4em 0 0.4em;` + // All rules begin with default rules followed by user provided rules + classes[chroma.Line] = `display: flex;` + classes[chroma.Line] + classes[chroma.LineNumbers] = lineNumbersStyle + classes[chroma.LineNumbers] + classes[chroma.LineNumbersTable] = lineNumbersStyle + classes[chroma.LineNumbersTable] + classes[chroma.LineTable] = "border-spacing: 0; padding: 0; margin: 0; border: 0;" + classes[chroma.LineTable] + classes[chroma.LineTableTD] = "vertical-align: top; padding: 0; margin: 0; border: 0;" + classes[chroma.LineTableTD] + return classes +} + +// StyleEntryToCSS converts a chroma.StyleEntry to CSS attributes. +func StyleEntryToCSS(e chroma.StyleEntry) string { + styles := []string{} + if e.Colour.IsSet() { + styles = append(styles, "color: "+e.Colour.String()) + } + if e.Background.IsSet() { + styles = append(styles, "background-color: "+e.Background.String()) + } + if e.Bold == chroma.Yes { + styles = append(styles, "font-weight: bold") + } + if e.Italic == chroma.Yes { + styles = append(styles, "font-style: italic") + } + if e.Underline == chroma.Yes { + styles = append(styles, "text-decoration: underline") + } + return strings.Join(styles, "; ") +} + +// Compress CSS attributes - remove spaces, transform 6-digit colours to 3. +func compressStyle(s string) string { + parts := strings.Split(s, ";") + out := []string{} + for _, p := range parts { + p = strings.Join(strings.Fields(p), " ") + p = strings.Replace(p, ": ", ":", 1) + if strings.Contains(p, "#") { + c := p[len(p)-6:] + if c[0] == c[1] && c[2] == c[3] && c[4] == c[5] { + p = p[:len(p)-6] + c[0:1] + c[2:3] + c[4:5] + } + } + out = append(out, p) + } + return strings.Join(out, ";") +} diff --git a/vendor/github.com/alecthomas/chroma/iterator.go b/vendor/github.com/alecthomas/chroma/iterator.go new file mode 100644 index 0000000..d5175de --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/iterator.go @@ -0,0 +1,76 @@ +package chroma + +import "strings" + +// An Iterator across tokens. +// +// EOF will be returned at the end of the Token stream. +// +// If an error occurs within an Iterator, it may propagate this in a panic. Formatters should recover. +type Iterator func() Token + +// Tokens consumes all tokens from the iterator and returns them as a slice. +func (i Iterator) Tokens() []Token { + var out []Token + for t := i(); t != EOF; t = i() { + out = append(out, t) + } + return out +} + +// Concaterator concatenates tokens from a series of iterators. +func Concaterator(iterators ...Iterator) Iterator { + return func() Token { + for len(iterators) > 0 { + t := iterators[0]() + if t != EOF { + return t + } + iterators = iterators[1:] + } + return EOF + } +} + +// Literator converts a sequence of literal Tokens into an Iterator. +func Literator(tokens ...Token) Iterator { + return func() Token { + if len(tokens) == 0 { + return EOF + } + token := tokens[0] + tokens = tokens[1:] + return token + } +} + +// SplitTokensIntoLines splits tokens containing newlines in two. +func SplitTokensIntoLines(tokens []Token) (out [][]Token) { + var line []Token // nolint: prealloc + for _, token := range tokens { + for strings.Contains(token.Value, "\n") { + parts := strings.SplitAfterN(token.Value, "\n", 2) + // Token becomes the tail. + token.Value = parts[1] + + // Append the head to the line and flush the line. + clone := token.Clone() + clone.Value = parts[0] + line = append(line, clone) + out = append(out, line) + line = nil + } + line = append(line, token) + } + if len(line) > 0 { + out = append(out, line) + } + // Strip empty trailing token line. + if len(out) > 0 { + last := out[len(out)-1] + if len(last) == 1 && last[0].Value == "" { + out = out[:len(out)-1] + } + } + return +} diff --git a/vendor/github.com/alecthomas/chroma/lexer.go b/vendor/github.com/alecthomas/chroma/lexer.go new file mode 100644 index 0000000..fe62519 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexer.go @@ -0,0 +1,128 @@ +package chroma + +import ( + "fmt" + "strings" +) + +var ( + defaultOptions = &TokeniseOptions{ + State: "root", + EnsureLF: true, + } +) + +// Config for a lexer. +type Config struct { + // Name of the lexer. + Name string + + // Shortcuts for the lexer + Aliases []string + + // File name globs + Filenames []string + + // Secondary file name globs + AliasFilenames []string + + // MIME types + MimeTypes []string + + // Regex matching is case-insensitive. + CaseInsensitive bool + + // Regex matches all characters. + DotAll bool + + // Regex does not match across lines ($ matches EOL). + // + // Defaults to multiline. + NotMultiline bool + + // Don't strip leading and trailing newlines from the input. + // DontStripNL bool + + // Strip all leading and trailing whitespace from the input + // StripAll bool + + // Make sure that the input ends with a newline. This + // is required for some lexers that consume input linewise. + EnsureNL bool + + // If given and greater than 0, expand tabs in the input. + // TabSize int + + // Priority of lexer. + // + // If this is 0 it will be treated as a default of 1. + Priority float32 +} + +// Token output to formatter. +type Token struct { + Type TokenType `json:"type"` + Value string `json:"value"` +} + +func (t *Token) String() string { return t.Value } +func (t *Token) GoString() string { return fmt.Sprintf("&Token{%s, %q}", t.Type, t.Value) } + +// Clone returns a clone of the Token. +func (t *Token) Clone() Token { + return *t +} + +// EOF is returned by lexers at the end of input. +var EOF Token + +// TokeniseOptions contains options for tokenisers. +type TokeniseOptions struct { + // State to start tokenisation in. Defaults to "root". + State string + // Nested tokenisation. + Nested bool + + // If true, all EOLs are converted into LF + // by replacing CRLF and CR + EnsureLF bool +} + +// A Lexer for tokenising source code. +type Lexer interface { + // Config describing the features of the Lexer. + Config() *Config + // Tokenise returns an Iterator over tokens in text. + Tokenise(options *TokeniseOptions, text string) (Iterator, error) +} + +// Lexers is a slice of lexers sortable by name. +type Lexers []Lexer + +func (l Lexers) Len() int { return len(l) } +func (l Lexers) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l Lexers) Less(i, j int) bool { + return strings.ToLower(l[i].Config().Name) < strings.ToLower(l[j].Config().Name) +} + +// PrioritisedLexers is a slice of lexers sortable by priority. +type PrioritisedLexers []Lexer + +func (l PrioritisedLexers) Len() int { return len(l) } +func (l PrioritisedLexers) Swap(i, j int) { l[i], l[j] = l[j], l[i] } +func (l PrioritisedLexers) Less(i, j int) bool { + ip := l[i].Config().Priority + if ip == 0 { + ip = 1 + } + jp := l[j].Config().Priority + if jp == 0 { + jp = 1 + } + return ip > jp +} + +// Analyser determines how appropriate this lexer is for the given text. +type Analyser interface { + AnalyseText(text string) float32 +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/README.md b/vendor/github.com/alecthomas/chroma/lexers/README.md new file mode 100644 index 0000000..b4ed292 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/README.md @@ -0,0 +1,40 @@ +# Lexer tests + +The tests in this directory feed a known input `testdata/.actual` into the parser for `` and check +that its output matches `.exported`. + +It is also possible to perform several tests on a same parser ``, by placing know inputs `*.actual` into a +directory `testdata//`. + +## Running the tests + +Run the tests as normal: +```go +go test ./lexers +``` + +## Update existing tests +When you add a new test data file (`*.actual`), you need to regenerate all tests. That's how Chroma creates the `*.expected` test file based on the corresponding lexer. + +To regenerate all tests, type in your terminal: + +```go +RECORD=true go test ./lexers +``` + +This first sets the `RECORD` environment variable to `true`. Then it runs `go test` on the `./lexers` directory of the Chroma project. + +(That environment variable tells Chroma it needs to output test data. After running `go test ./lexers` you can remove or reset that variable.) + +### Windows users +Windows users will find that the `RECORD=true go test ./lexers` command fails in both the standard command prompt terminal and in PowerShell. + +Instead we have to perform both steps separately: + +- Set the `RECORD` environment variable to `true`. + + In the regular command prompt window, the `set` command sets an environment variable for the current session: `set RECORD=true`. See [this page](https://superuser.com/questions/212150/how-to-set-env-variable-in-windows-cmd-line) for more. + + In PowerShell, you can use the `$env:RECORD = 'true'` command for that. See [this article](https://mcpmag.com/articles/2019/03/28/environment-variables-in-powershell.aspx) for more. + + You can also make a persistent environment variable by hand in the Windows computer settings. See [this article](https://www.computerhope.com/issues/ch000549.htm) for how. +- When the environment variable is set, run `go tests ./lexers`. + +Chroma will now regenerate the test files and print its results to the console window. diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/abap.go b/vendor/github.com/alecthomas/chroma/lexers/a/abap.go new file mode 100644 index 0000000..268aa6a --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/abap.go @@ -0,0 +1,60 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// ABAP lexer. +var Abap = internal.Register(MustNewLazyLexer( + &Config{ + Name: "ABAP", + Aliases: []string{"abap"}, + Filenames: []string{"*.abap", "*.ABAP"}, + MimeTypes: []string{"text/x-abap"}, + CaseInsensitive: true, + }, + abapRules, +)) + +func abapRules() Rules { + return Rules{ + "common": { + {`\s+`, Text, nil}, + {`^\*.*$`, CommentSingle, nil}, + {`\".*?\n`, CommentSingle, nil}, + {`##\w+`, CommentSpecial, nil}, + }, + "variable-names": { + {`<\S+>`, NameVariable, nil}, + {`\w[\w~]*(?:(\[\])|->\*)?`, NameVariable, nil}, + }, + "root": { + Include("common"), + {`CALL\s+(?:BADI|CUSTOMER-FUNCTION|FUNCTION)`, Keyword, nil}, + {`(CALL\s+(?:DIALOG|SCREEN|SUBSCREEN|SELECTION-SCREEN|TRANSACTION|TRANSFORMATION))\b`, Keyword, nil}, + {`(FORM|PERFORM)(\s+)(\w+)`, ByGroups(Keyword, Text, NameFunction), nil}, + {`(PERFORM)(\s+)(\()(\w+)(\))`, ByGroups(Keyword, Text, Punctuation, NameVariable, Punctuation), nil}, + {`(MODULE)(\s+)(\S+)(\s+)(INPUT|OUTPUT)`, ByGroups(Keyword, Text, NameFunction, Text, Keyword), nil}, + {`(METHOD)(\s+)([\w~]+)`, ByGroups(Keyword, Text, NameFunction), nil}, + {`(\s+)([\w\-]+)([=\-]>)([\w\-~]+)`, ByGroups(Text, NameVariable, Operator, NameFunction), nil}, + {`(?<=(=|-)>)([\w\-~]+)(?=\()`, NameFunction, nil}, + {`(TEXT)(-)(\d{3})`, ByGroups(Keyword, Punctuation, LiteralNumberInteger), nil}, + {`(TEXT)(-)(\w{3})`, ByGroups(Keyword, Punctuation, NameVariable), nil}, + {`(ADD-CORRESPONDING|AUTHORITY-CHECK|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|DELETE-ADJACENT|DIVIDE-CORRESPONDING|EDITOR-CALL|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|EXIT-COMMAND|FIELD-GROUPS|FIELD-SYMBOLS|FUNCTION-POOL|INTERFACE-POOL|INVERTED-DATE|LOAD-OF-PROGRAM|LOG-POINT|MESSAGE-ID|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|NEW-LINE|NEW-PAGE|NEW-SECTION|NO-EXTENSION|OUTPUT-LENGTH|PRINT-CONTROL|SELECT-OPTIONS|START-OF-SELECTION|SUBTRACT-CORRESPONDING|SYNTAX-CHECK|SYSTEM-EXCEPTIONS|TYPE-POOL|TYPE-POOLS|NO-DISPLAY)\b`, Keyword, nil}, + {`(?])(CREATE\s+(PUBLIC|PRIVATE|DATA|OBJECT)|(PUBLIC|PRIVATE|PROTECTED)\s+SECTION|(TYPE|LIKE)\s+((LINE\s+OF|REF\s+TO|(SORTED|STANDARD|HASHED)\s+TABLE\s+OF))?|FROM\s+(DATABASE|MEMORY)|CALL\s+METHOD|(GROUP|ORDER) BY|HAVING|SEPARATED BY|GET\s+(BADI|BIT|CURSOR|DATASET|LOCALE|PARAMETER|PF-STATUS|(PROPERTY|REFERENCE)\s+OF|RUN\s+TIME|TIME\s+(STAMP)?)?|SET\s+(BIT|BLANK\s+LINES|COUNTRY|CURSOR|DATASET|EXTENDED\s+CHECK|HANDLER|HOLD\s+DATA|LANGUAGE|LEFT\s+SCROLL-BOUNDARY|LOCALE|MARGIN|PARAMETER|PF-STATUS|PROPERTY\s+OF|RUN\s+TIME\s+(ANALYZER|CLOCK\s+RESOLUTION)|SCREEN|TITLEBAR|UPADTE\s+TASK\s+LOCAL|USER-COMMAND)|CONVERT\s+((INVERTED-)?DATE|TIME|TIME\s+STAMP|TEXT)|(CLOSE|OPEN)\s+(DATASET|CURSOR)|(TO|FROM)\s+(DATA BUFFER|INTERNAL TABLE|MEMORY ID|DATABASE|SHARED\s+(MEMORY|BUFFER))|DESCRIBE\s+(DISTANCE\s+BETWEEN|FIELD|LIST|TABLE)|FREE\s(MEMORY|OBJECT)?|PROCESS\s+(BEFORE\s+OUTPUT|AFTER\s+INPUT|ON\s+(VALUE-REQUEST|HELP-REQUEST))|AT\s+(LINE-SELECTION|USER-COMMAND|END\s+OF|NEW)|AT\s+SELECTION-SCREEN(\s+(ON(\s+(BLOCK|(HELP|VALUE)-REQUEST\s+FOR|END\s+OF|RADIOBUTTON\s+GROUP))?|OUTPUT))?|SELECTION-SCREEN:?\s+((BEGIN|END)\s+OF\s+((TABBED\s+)?BLOCK|LINE|SCREEN)|COMMENT|FUNCTION\s+KEY|INCLUDE\s+BLOCKS|POSITION|PUSHBUTTON|SKIP|ULINE)|LEAVE\s+(LIST-PROCESSING|PROGRAM|SCREEN|TO LIST-PROCESSING|TO TRANSACTION)(ENDING|STARTING)\s+AT|FORMAT\s+(COLOR|INTENSIFIED|INVERSE|HOTSPOT|INPUT|FRAMES|RESET)|AS\s+(CHECKBOX|SUBSCREEN|WINDOW)|WITH\s+(((NON-)?UNIQUE)?\s+KEY|FRAME)|(BEGIN|END)\s+OF|DELETE(\s+ADJACENT\s+DUPLICATES\sFROM)?|COMPARING(\s+ALL\s+FIELDS)?|(INSERT|APPEND)(\s+INITIAL\s+LINE\s+(IN)?TO|\s+LINES\s+OF)?|IN\s+((BYTE|CHARACTER)\s+MODE|PROGRAM)|END-OF-(DEFINITION|PAGE|SELECTION)|WITH\s+FRAME(\s+TITLE)|(REPLACE|FIND)\s+((FIRST|ALL)\s+OCCURRENCES?\s+OF\s+)?(SUBSTRING|REGEX)?|MATCH\s+(LENGTH|COUNT|LINE|OFFSET)|(RESPECTING|IGNORING)\s+CASE|IN\s+UPDATE\s+TASK|(SOURCE|RESULT)\s+(XML)?|REFERENCE\s+INTO|AND\s+(MARK|RETURN)|CLIENT\s+SPECIFIED|CORRESPONDING\s+FIELDS\s+OF|IF\s+FOUND|FOR\s+EVENT|INHERITING\s+FROM|LEAVE\s+TO\s+SCREEN|LOOP\s+AT\s+(SCREEN)?|LOWER\s+CASE|MATCHCODE\s+OBJECT|MODIF\s+ID|MODIFY\s+SCREEN|NESTING\s+LEVEL|NO\s+INTERVALS|OF\s+STRUCTURE|RADIOBUTTON\s+GROUP|RANGE\s+OF|REF\s+TO|SUPPRESS DIALOG|TABLE\s+OF|UPPER\s+CASE|TRANSPORTING\s+NO\s+FIELDS|VALUE\s+CHECK|VISIBLE\s+LENGTH|HEADER\s+LINE|COMMON\s+PART)\b`, Keyword, nil}, + {`(^|(?<=(\s|\.)))(ABBREVIATED|ABSTRACT|ADD|ALIASES|ALIGN|ALPHA|ASSERT|AS|ASSIGN(ING)?|AT(\s+FIRST)?|BACK|BLOCK|BREAK-POINT|CASE|CATCH|CHANGING|CHECK|CLASS|CLEAR|COLLECT|COLOR|COMMIT|CREATE|COMMUNICATION|COMPONENTS?|COMPUTE|CONCATENATE|CONDENSE|CONSTANTS|CONTEXTS|CONTINUE|CONTROLS|COUNTRY|CURRENCY|DATA|DATE|DECIMALS|DEFAULT|DEFINE|DEFINITION|DEFERRED|DEMAND|DETAIL|DIRECTORY|DIVIDE|DO|DUMMY|ELSE(IF)?|ENDAT|ENDCASE|ENDCATCH|ENDCLASS|ENDDO|ENDFORM|ENDFUNCTION|ENDIF|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDSELECT|ENDTRY|ENDWHILE|ENHANCEMENT|EVENTS|EXACT|EXCEPTIONS?|EXIT|EXPONENT|EXPORT|EXPORTING|EXTRACT|FETCH|FIELDS?|FOR|FORM|FORMAT|FREE|FROM|FUNCTION|HIDE|ID|IF|IMPORT|IMPLEMENTATION|IMPORTING|IN|INCLUDE|INCLUDING|INDEX|INFOTYPES|INITIALIZATION|INTERFACE|INTERFACES|INTO|LANGUAGE|LEAVE|LENGTH|LINES|LOAD|LOCAL|JOIN|KEY|NEXT|MAXIMUM|MESSAGE|METHOD[S]?|MINIMUM|MODULE|MODIFIER|MODIFY|MOVE|MULTIPLY|NODES|NUMBER|OBLIGATORY|OBJECT|OF|OFF|ON|OTHERS|OVERLAY|PACK|PAD|PARAMETERS|PERCENTAGE|POSITION|PROGRAM|PROVIDE|PUBLIC|PUT|PF\d\d|RAISE|RAISING|RANGES?|READ|RECEIVE|REDEFINITION|REFRESH|REJECT|REPORT|RESERVE|RESUME|RETRY|RETURN|RETURNING|RIGHT|ROLLBACK|REPLACE|SCROLL|SEARCH|SELECT|SHIFT|SIGN|SINGLE|SIZE|SKIP|SORT|SPLIT|STATICS|STOP|STYLE|SUBMATCHES|SUBMIT|SUBTRACT|SUM(?!\()|SUMMARY|SUMMING|SUPPLY|TABLE|TABLES|TIMESTAMP|TIMES?|TIMEZONE|TITLE|\??TO|TOP-OF-PAGE|TRANSFER|TRANSLATE|TRY|TYPES|ULINE|UNDER|UNPACK|UPDATE|USING|VALUE|VALUES|VIA|VARYING|VARY|WAIT|WHEN|WHERE|WIDTH|WHILE|WITH|WINDOW|WRITE|XSD|ZERO)\b`, Keyword, nil}, + {`(abs|acos|asin|atan|boolc|boolx|bit_set|char_off|charlen|ceil|cmax|cmin|condense|contains|contains_any_of|contains_any_not_of|concat_lines_of|cos|cosh|count|count_any_of|count_any_not_of|dbmaxlen|distance|escape|exp|find|find_end|find_any_of|find_any_not_of|floor|frac|from_mixed|insert|lines|log|log10|match|matches|nmax|nmin|numofchar|repeat|replace|rescale|reverse|round|segment|shift_left|shift_right|sign|sin|sinh|sqrt|strlen|substring|substring_after|substring_from|substring_before|substring_to|tan|tanh|to_upper|to_lower|to_mixed|translate|trunc|xstrlen)(\()\b`, ByGroups(NameBuiltin, Punctuation), nil}, + {`&[0-9]`, Name, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`(?<=(\s|.))(AND|OR|EQ|NE|GT|LT|GE|LE|CO|CN|CA|NA|CS|NOT|NS|CP|NP|BYTE-CO|BYTE-CN|BYTE-CA|BYTE-NA|BYTE-CS|BYTE-NS|IS\s+(NOT\s+)?(INITIAL|ASSIGNED|REQUESTED|BOUND))\b`, OperatorWord, nil}, + Include("variable-names"), + {`[?*<>=\-+&]`, Operator, nil}, + {`'(''|[^'])*'`, LiteralStringSingle, nil}, + {"`([^`])*`", LiteralStringSingle, nil}, + {`([|}])([^{}|]*?)([|{])`, ByGroups(Punctuation, LiteralStringSingle, Punctuation), nil}, + {`[/;:()\[\],.]`, Punctuation, nil}, + {`(!)(\w+)`, ByGroups(Operator, Name), nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/abnf.go b/vendor/github.com/alecthomas/chroma/lexers/a/abnf.go new file mode 100644 index 0000000..85c47af --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/abnf.go @@ -0,0 +1,42 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Abnf lexer. +var Abnf = internal.Register(MustNewLazyLexer( + &Config{ + Name: "ABNF", + Aliases: []string{"abnf"}, + Filenames: []string{"*.abnf"}, + MimeTypes: []string{"text/x-abnf"}, + }, + abnfRules, +)) + +func abnfRules() Rules { + return Rules{ + "root": { + {`;.*$`, CommentSingle, nil}, + {`(%[si])?"[^"]*"`, Literal, nil}, + {`%b[01]+\-[01]+\b`, Literal, nil}, + {`%b[01]+(\.[01]+)*\b`, Literal, nil}, + {`%d[0-9]+\-[0-9]+\b`, Literal, nil}, + {`%d[0-9]+(\.[0-9]+)*\b`, Literal, nil}, + {`%x[0-9a-fA-F]+\-[0-9a-fA-F]+\b`, Literal, nil}, + {`%x[0-9a-fA-F]+(\.[0-9a-fA-F]+)*\b`, Literal, nil}, + {`\b[0-9]+\*[0-9]+`, Operator, nil}, + {`\b[0-9]+\*`, Operator, nil}, + {`\b[0-9]+`, Operator, nil}, + {`\*`, Operator, nil}, + {Words(``, `\b`, `ALPHA`, `BIT`, `CHAR`, `CR`, `CRLF`, `CTL`, `DIGIT`, `DQUOTE`, `HEXDIG`, `HTAB`, `LF`, `LWSP`, `OCTET`, `SP`, `VCHAR`, `WSP`), Keyword, nil}, + {`[a-zA-Z][a-zA-Z0-9-]+\b`, NameClass, nil}, + {`(=/|=|/)`, Operator, nil}, + {`[\[\]()]`, Punctuation, nil}, + {`\s+`, Text, nil}, + {`.`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/actionscript.go b/vendor/github.com/alecthomas/chroma/lexers/a/actionscript.go new file mode 100644 index 0000000..df55d6d --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/actionscript.go @@ -0,0 +1,43 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Actionscript lexer. +var Actionscript = internal.Register(MustNewLazyLexer( + &Config{ + Name: "ActionScript", + Aliases: []string{"as", "actionscript"}, + Filenames: []string{"*.as"}, + MimeTypes: []string{"application/x-actionscript", "text/x-actionscript", "text/actionscript"}, + NotMultiline: true, + DotAll: true, + }, + actionscriptRules, +)) + +func actionscriptRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`/(\\\\|\\/|[^/\n])*/[gim]*`, LiteralStringRegex, nil}, + {`[~^*!%&<>|+=:;,/?\\-]+`, Operator, nil}, + {`[{}\[\]();.]+`, Punctuation, nil}, + {Words(``, `\b`, `case`, `default`, `for`, `each`, `in`, `while`, `do`, `break`, `return`, `continue`, `if`, `else`, `throw`, `try`, `catch`, `var`, `with`, `new`, `typeof`, `arguments`, `instanceof`, `this`, `switch`), Keyword, nil}, + {Words(``, `\b`, `class`, `public`, `final`, `internal`, `native`, `override`, `private`, `protected`, `static`, `import`, `extends`, `implements`, `interface`, `intrinsic`, `return`, `super`, `dynamic`, `function`, `const`, `get`, `namespace`, `package`, `set`), KeywordDeclaration, nil}, + {`(true|false|null|NaN|Infinity|-Infinity|undefined|Void)\b`, KeywordConstant, nil}, + {Words(``, `\b`, `Accessibility`, `AccessibilityProperties`, `ActionScriptVersion`, `ActivityEvent`, `AntiAliasType`, `ApplicationDomain`, `AsBroadcaster`, `Array`, `AsyncErrorEvent`, `AVM1Movie`, `BevelFilter`, `Bitmap`, `BitmapData`, `BitmapDataChannel`, `BitmapFilter`, `BitmapFilterQuality`, `BitmapFilterType`, `BlendMode`, `BlurFilter`, `Boolean`, `ByteArray`, `Camera`, `Capabilities`, `CapsStyle`, `Class`, `Color`, `ColorMatrixFilter`, `ColorTransform`, `ContextMenu`, `ContextMenuBuiltInItems`, `ContextMenuEvent`, `ContextMenuItem`, `ConvultionFilter`, `CSMSettings`, `DataEvent`, `Date`, `DefinitionError`, `DeleteObjectSample`, `Dictionary`, `DisplacmentMapFilter`, `DisplayObject`, `DisplacmentMapFilterMode`, `DisplayObjectContainer`, `DropShadowFilter`, `Endian`, `EOFError`, `Error`, `ErrorEvent`, `EvalError`, `Event`, `EventDispatcher`, `EventPhase`, `ExternalInterface`, `FileFilter`, `FileReference`, `FileReferenceList`, `FocusDirection`, `FocusEvent`, `Font`, `FontStyle`, `FontType`, `FrameLabel`, `FullScreenEvent`, `Function`, `GlowFilter`, `GradientBevelFilter`, `GradientGlowFilter`, `GradientType`, `Graphics`, `GridFitType`, `HTTPStatusEvent`, `IBitmapDrawable`, `ID3Info`, `IDataInput`, `IDataOutput`, `IDynamicPropertyOutputIDynamicPropertyWriter`, `IEventDispatcher`, `IExternalizable`, `IllegalOperationError`, `IME`, `IMEConversionMode`, `IMEEvent`, `int`, `InteractiveObject`, `InterpolationMethod`, `InvalidSWFError`, `InvokeEvent`, `IOError`, `IOErrorEvent`, `JointStyle`, `Key`, `Keyboard`, `KeyboardEvent`, `KeyLocation`, `LineScaleMode`, `Loader`, `LoaderContext`, `LoaderInfo`, `LoadVars`, `LocalConnection`, `Locale`, `Math`, `Matrix`, `MemoryError`, `Microphone`, `MorphShape`, `Mouse`, `MouseEvent`, `MovieClip`, `MovieClipLoader`, `Namespace`, `NetConnection`, `NetStatusEvent`, `NetStream`, `NewObjectSample`, `Number`, `Object`, `ObjectEncoding`, `PixelSnapping`, `Point`, `PrintJob`, `PrintJobOptions`, `PrintJobOrientation`, `ProgressEvent`, `Proxy`, `QName`, `RangeError`, `Rectangle`, `ReferenceError`, `RegExp`, `Responder`, `Sample`, `Scene`, `ScriptTimeoutError`, `Security`, `SecurityDomain`, `SecurityError`, `SecurityErrorEvent`, `SecurityPanel`, `Selection`, `Shape`, `SharedObject`, `SharedObjectFlushStatus`, `SimpleButton`, `Socket`, `Sound`, `SoundChannel`, `SoundLoaderContext`, `SoundMixer`, `SoundTransform`, `SpreadMethod`, `Sprite`, `StackFrame`, `StackOverflowError`, `Stage`, `StageAlign`, `StageDisplayState`, `StageQuality`, `StageScaleMode`, `StaticText`, `StatusEvent`, `String`, `StyleSheet`, `SWFVersion`, `SyncEvent`, `SyntaxError`, `System`, `TextColorType`, `TextField`, `TextFieldAutoSize`, `TextFieldType`, `TextFormat`, `TextFormatAlign`, `TextLineMetrics`, `TextRenderer`, `TextSnapshot`, `Timer`, `TimerEvent`, `Transform`, `TypeError`, `uint`, `URIError`, `URLLoader`, `URLLoaderDataFormat`, `URLRequest`, `URLRequestHeader`, `URLRequestMethod`, `URLStream`, `URLVariabeles`, `VerifyError`, `Video`, `XML`, `XMLDocument`, `XMLList`, `XMLNode`, `XMLNodeType`, `XMLSocket`, `XMLUI`), NameBuiltin, nil}, + {Words(``, `\b`, `decodeURI`, `decodeURIComponent`, `encodeURI`, `escape`, `eval`, `isFinite`, `isNaN`, `isXMLName`, `clearInterval`, `fscommand`, `getTimer`, `getURL`, `getVersion`, `parseFloat`, `parseInt`, `setInterval`, `trace`, `updateAfterEvent`, `unescape`), NameFunction, nil}, + {`[$a-zA-Z_]\w*`, NameOther, nil}, + {`[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?`, LiteralNumberFloat, nil}, + {`0x[0-9a-f]+`, LiteralNumberHex, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/actionscript3.go b/vendor/github.com/alecthomas/chroma/lexers/a/actionscript3.go new file mode 100644 index 0000000..45596dc --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/actionscript3.go @@ -0,0 +1,60 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Actionscript 3 lexer. +var Actionscript3 = internal.Register(MustNewLazyLexer( + &Config{ + Name: "ActionScript 3", + Aliases: []string{"as3", "actionscript3"}, + Filenames: []string{"*.as"}, + MimeTypes: []string{"application/x-actionscript3", "text/x-actionscript3", "text/actionscript3"}, + DotAll: true, + }, + actionscript3Rules, +)) + +func actionscript3Rules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`(function\s+)([$a-zA-Z_]\w*)(\s*)(\()`, ByGroups(KeywordDeclaration, NameFunction, Text, Operator), Push("funcparams")}, + {`(var|const)(\s+)([$a-zA-Z_]\w*)(\s*)(:)(\s*)([$a-zA-Z_]\w*(?:\.<\w+>)?)`, ByGroups(KeywordDeclaration, Text, Name, Text, Punctuation, Text, KeywordType), nil}, + {`(import|package)(\s+)((?:[$a-zA-Z_]\w*|\.)+)(\s*)`, ByGroups(Keyword, Text, NameNamespace, Text), nil}, + {`(new)(\s+)([$a-zA-Z_]\w*(?:\.<\w+>)?)(\s*)(\()`, ByGroups(Keyword, Text, KeywordType, Text, Operator), nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`/(\\\\|\\/|[^\n])*/[gisx]*`, LiteralStringRegex, nil}, + {`(\.)([$a-zA-Z_]\w*)`, ByGroups(Operator, NameAttribute), nil}, + {`(case|default|for|each|in|while|do|break|return|continue|if|else|throw|try|catch|with|new|typeof|arguments|instanceof|this|switch|import|include|as|is)\b`, Keyword, nil}, + {`(class|public|final|internal|native|override|private|protected|static|import|extends|implements|interface|intrinsic|return|super|dynamic|function|const|get|namespace|package|set)\b`, KeywordDeclaration, nil}, + {`(true|false|null|NaN|Infinity|-Infinity|undefined|void)\b`, KeywordConstant, nil}, + {`(decodeURI|decodeURIComponent|encodeURI|escape|eval|isFinite|isNaN|isXMLName|clearInterval|fscommand|getTimer|getURL|getVersion|isFinite|parseFloat|parseInt|setInterval|trace|updateAfterEvent|unescape)\b`, NameFunction, nil}, + {`[$a-zA-Z_]\w*`, Name, nil}, + {`[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?`, LiteralNumberFloat, nil}, + {`0x[0-9a-f]+`, LiteralNumberHex, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + {`[~^*!%&<>|+=:;,/?\\{}\[\]().-]+`, Operator, nil}, + }, + "funcparams": { + {`\s+`, Text, nil}, + {`(\s*)(\.\.\.)?([$a-zA-Z_]\w*)(\s*)(:)(\s*)([$a-zA-Z_]\w*(?:\.<\w+>)?|\*)(\s*)`, ByGroups(Text, Punctuation, Name, Text, Operator, Text, KeywordType, Text), Push("defval")}, + {`\)`, Operator, Push("type")}, + }, + "type": { + {`(\s*)(:)(\s*)([$a-zA-Z_]\w*(?:\.<\w+>)?|\*)`, ByGroups(Text, Operator, Text, KeywordType), Pop(2)}, + {`\s+`, Text, Pop(2)}, + Default(Pop(2)), + }, + "defval": { + {`(=)(\s*)([^(),]+)(\s*)(,?)`, ByGroups(Operator, Text, UsingSelf("root"), Text, Operator), Pop(1)}, + {`,`, Operator, Pop(1)}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/ada.go b/vendor/github.com/alecthomas/chroma/lexers/a/ada.go new file mode 100644 index 0000000..9167271 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/ada.go @@ -0,0 +1,118 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Ada lexer. +var Ada = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Ada", + Aliases: []string{"ada", "ada95", "ada2005"}, + Filenames: []string{"*.adb", "*.ads", "*.ada"}, + MimeTypes: []string{"text/x-ada"}, + CaseInsensitive: true, + }, + adaRules, +)) + +func adaRules() Rules { + return Rules{ + "root": { + {`[^\S\n]+`, Text, nil}, + {`--.*?\n`, CommentSingle, nil}, + {`[^\S\n]+`, Text, nil}, + {`function|procedure|entry`, KeywordDeclaration, Push("subprogram")}, + {`(subtype|type)(\s+)(\w+)`, ByGroups(KeywordDeclaration, Text, KeywordType), Push("type_def")}, + {`task|protected`, KeywordDeclaration, nil}, + {`(subtype)(\s+)`, ByGroups(KeywordDeclaration, Text), nil}, + {`(end)(\s+)`, ByGroups(KeywordReserved, Text), Push("end")}, + {`(pragma)(\s+)(\w+)`, ByGroups(KeywordReserved, Text, CommentPreproc), nil}, + {`(true|false|null)\b`, KeywordConstant, nil}, + {Words(``, `\b`, `Address`, `Byte`, `Boolean`, `Character`, `Controlled`, `Count`, `Cursor`, `Duration`, `File_Mode`, `File_Type`, `Float`, `Generator`, `Integer`, `Long_Float`, `Long_Integer`, `Long_Long_Float`, `Long_Long_Integer`, `Natural`, `Positive`, `Reference_Type`, `Short_Float`, `Short_Integer`, `Short_Short_Float`, `Short_Short_Integer`, `String`, `Wide_Character`, `Wide_String`), KeywordType, nil}, + {`(and(\s+then)?|in|mod|not|or(\s+else)|rem)\b`, OperatorWord, nil}, + {`generic|private`, KeywordDeclaration, nil}, + {`package`, KeywordDeclaration, Push("package")}, + {`array\b`, KeywordReserved, Push("array_def")}, + {`(with|use)(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + {`(\w+)(\s*)(:)(\s*)(constant)`, ByGroups(NameConstant, Text, Punctuation, Text, KeywordReserved), nil}, + {`<<\w+>>`, NameLabel, nil}, + {`(\w+)(\s*)(:)(\s*)(declare|begin|loop|for|while)`, ByGroups(NameLabel, Text, Punctuation, Text, KeywordReserved), nil}, + {Words(`\b`, `\b`, `abort`, `abs`, `abstract`, `accept`, `access`, `aliased`, `all`, `array`, `at`, `begin`, `body`, `case`, `constant`, `declare`, `delay`, `delta`, `digits`, `do`, `else`, `elsif`, `end`, `entry`, `exception`, `exit`, `interface`, `for`, `goto`, `if`, `is`, `limited`, `loop`, `new`, `null`, `of`, `or`, `others`, `out`, `overriding`, `pragma`, `protected`, `raise`, `range`, `record`, `renames`, `requeue`, `return`, `reverse`, `select`, `separate`, `subtype`, `synchronized`, `task`, `tagged`, `terminate`, `then`, `type`, `until`, `when`, `while`, `xor`), KeywordReserved, nil}, + {`"[^"]*"`, LiteralString, nil}, + Include("attribute"), + Include("numbers"), + {`'[^']'`, LiteralStringChar, nil}, + {`(\w+)(\s*|[(,])`, ByGroups(Name, UsingSelf("root")), nil}, + {`(<>|=>|:=|[()|:;,.'])`, Punctuation, nil}, + {`[*<>+=/&-]`, Operator, nil}, + {`\n+`, Text, nil}, + }, + "numbers": { + {`[0-9_]+#[0-9a-f]+#`, LiteralNumberHex, nil}, + {`[0-9_]+\.[0-9_]*`, LiteralNumberFloat, nil}, + {`[0-9_]+`, LiteralNumberInteger, nil}, + }, + "attribute": { + {`(')(\w+)`, ByGroups(Punctuation, NameAttribute), nil}, + }, + "subprogram": { + {`\(`, Punctuation, Push("#pop", "formal_part")}, + {`;`, Punctuation, Pop(1)}, + {`is\b`, KeywordReserved, Pop(1)}, + {`"[^"]+"|\w+`, NameFunction, nil}, + Include("root"), + }, + "end": { + {`(if|case|record|loop|select)`, KeywordReserved, nil}, + {`"[^"]+"|[\w.]+`, NameFunction, nil}, + {`\s+`, Text, nil}, + {`;`, Punctuation, Pop(1)}, + }, + "type_def": { + {`;`, Punctuation, Pop(1)}, + {`\(`, Punctuation, Push("formal_part")}, + {`with|and|use`, KeywordReserved, nil}, + {`array\b`, KeywordReserved, Push("#pop", "array_def")}, + {`record\b`, KeywordReserved, Push("record_def")}, + {`(null record)(;)`, ByGroups(KeywordReserved, Punctuation), Pop(1)}, + Include("root"), + }, + "array_def": { + {`;`, Punctuation, Pop(1)}, + {`(\w+)(\s+)(range)`, ByGroups(KeywordType, Text, KeywordReserved), nil}, + Include("root"), + }, + "record_def": { + {`end record`, KeywordReserved, Pop(1)}, + Include("root"), + }, + "import": { + {`[\w.]+`, NameNamespace, Pop(1)}, + Default(Pop(1)), + }, + "formal_part": { + {`\)`, Punctuation, Pop(1)}, + {`\w+`, NameVariable, nil}, + {`,|:[^=]`, Punctuation, nil}, + {`(in|not|null|out|access)\b`, KeywordReserved, nil}, + Include("root"), + }, + "package": { + {`body`, KeywordDeclaration, nil}, + {`is\s+new|renames`, KeywordReserved, nil}, + {`is`, KeywordReserved, Pop(1)}, + {`;`, Punctuation, Pop(1)}, + {`\(`, Punctuation, Push("package_instantiation")}, + {`([\w.]+)`, NameClass, nil}, + Include("root"), + }, + "package_instantiation": { + {`("[^"]+"|\w+)(\s+)(=>)`, ByGroups(NameVariable, Text, Punctuation), nil}, + {`[\w.\'"]`, Text, nil}, + {`\)`, Punctuation, Pop(1)}, + Include("root"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/al.go b/vendor/github.com/alecthomas/chroma/lexers/a/al.go new file mode 100644 index 0000000..4055f36 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/al.go @@ -0,0 +1,47 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Al lexer. +var Al = internal.Register(MustNewLazyLexer( + &Config{ + Name: "AL", + Aliases: []string{"al"}, + Filenames: []string{"*.al", "*.dal"}, + MimeTypes: []string{"text/x-al"}, + DotAll: true, + CaseInsensitive: true, + }, + alRules, +)) + +// https://github.com/microsoft/AL/blob/master/grammar/alsyntax.tmlanguage +func alRules() Rules { + return Rules{ + "root": { + {`\s+`, TextWhitespace, nil}, + {`(?s)\/\*.*?\\*\*\/`, CommentMultiline, nil}, + {`(?s)//.*?\n`, CommentSingle, nil}, + {`\"([^\"])*\"`, Text, nil}, + {`'([^'])*'`, LiteralString, nil}, + {`\b(?i:(ARRAY|ASSERTERROR|BEGIN|BREAK|CASE|DO|DOWNTO|ELSE|END|EVENT|EXIT|FOR|FOREACH|FUNCTION|IF|IMPLEMENTS|IN|INDATASET|INTERFACE|INTERNAL|LOCAL|OF|PROCEDURE|PROGRAM|PROTECTED|REPEAT|RUNONCLIENT|SECURITYFILTERING|SUPPRESSDISPOSE|TEMPORARY|THEN|TO|TRIGGER|UNTIL|VAR|WHILE|WITH|WITHEVENTS))\b`, Keyword, nil}, + {`\b(?i:(AND|DIV|MOD|NOT|OR|XOR))\b`, OperatorWord, nil}, + {`\b(?i:(AVERAGE|CONST|COUNT|EXIST|FIELD|FILTER|LOOKUP|MAX|MIN|ORDER|SORTING|SUM|TABLEDATA|UPPERLIMIT|WHERE|ASCENDING|DESCENDING))\b`, Keyword, nil}, + {`\b(?i:(CODEUNIT|PAGE|PAGEEXTENSION|PAGECUSTOMIZATION|DOTNET|ENUM|ENUMEXTENSION|VALUE|QUERY|REPORT|TABLE|TABLEEXTENSION|XMLPORT|PROFILE|CONTROLADDIN|REPORTEXTENSION|INTERFACE|PERMISSIONSET|PERMISSIONSETEXTENSION|ENTITLEMENT))\b`, Keyword, nil}, + {`\b(?i:(Action|Array|Automation|BigInteger|BigText|Blob|Boolean|Byte|Char|ClientType|Code|Codeunit|CompletionTriggerErrorLevel|ConnectionType|Database|DataClassification|DataScope|Date|DateFormula|DateTime|Decimal|DefaultLayout|Dialog|Dictionary|DotNet|DotNetAssembly|DotNetTypeDeclaration|Duration|Enum|ErrorInfo|ErrorType|ExecutionContext|ExecutionMode|FieldClass|FieldRef|FieldType|File|FilterPageBuilder|Guid|InStream|Integer|Joker|KeyRef|List|ModuleDependencyInfo|ModuleInfo|None|Notification|NotificationScope|ObjectType|Option|OutStream|Page|PageResult|Query|Record|RecordId|RecordRef|Report|ReportFormat|SecurityFilter|SecurityFiltering|Table|TableConnectionType|TableFilter|TestAction|TestField|TestFilterField|TestPage|TestPermissions|TestRequestPage|Text|TextBuilder|TextConst|TextEncoding|Time|TransactionModel|TransactionType|Variant|Verbosity|Version|XmlPort|HttpContent|HttpHeaders|HttpClient|HttpRequestMessage|HttpResponseMessage|JsonToken|JsonValue|JsonArray|JsonObject|View|Views|XmlAttribute|XmlAttributeCollection|XmlComment|XmlCData|XmlDeclaration|XmlDocument|XmlDocumentType|XmlElement|XmlNamespaceManager|XmlNameTable|XmlNode|XmlNodeList|XmlProcessingInstruction|XmlReadOptions|XmlText|XmlWriteOptions|WebServiceActionContext|WebServiceActionResultCode|SessionSettings))\b`, Keyword, nil}, + {`\b([<>]=|<>|<|>)\b?`, Operator, nil}, + {`\b(\-|\+|\/|\*)\b`, Operator, nil}, + {`\s*(\:=|\+=|-=|\/=|\*=)\s*?`, Operator, nil}, + {`\b(?i:(ADD|ADDFIRST|ADDLAST|ADDAFTER|ADDBEFORE|ACTION|ACTIONS|AREA|ASSEMBLY|CHARTPART|CUEGROUP|CUSTOMIZES|COLUMN|DATAITEM|DATASET|ELEMENTS|EXTENDS|FIELD|FIELDGROUP|FIELDATTRIBUTE|FIELDELEMENT|FIELDGROUPS|FIELDS|FILTER|FIXED|GRID|GROUP|MOVEAFTER|MOVEBEFORE|KEY|KEYS|LABEL|LABELS|LAYOUT|MODIFY|MOVEFIRST|MOVELAST|MOVEBEFORE|MOVEAFTER|PART|REPEATER|USERCONTROL|REQUESTPAGE|SCHEMA|SEPARATOR|SYSTEMPART|TABLEELEMENT|TEXTATTRIBUTE|TEXTELEMENT|TYPE))\b`, Keyword, nil}, + {`\s*[(\.\.)&\|]\s*`, Operator, nil}, + {`\b((0(x|X)[0-9a-fA-F]*)|(([0-9]+\.?[0-9]*)|(\.[0-9]+))((e|E)(\+|-)?[0-9]+)?)(L|l|UL|ul|u|U|F|f|ll|LL|ull|ULL)?\b`, LiteralNumber, nil}, + {`[;:,]`, Punctuation, nil}, + {`#[ \t]*(if|else|elif|endif|define|undef|region|endregion|pragma)\b.*?\n`, CommentPreproc, nil}, + {`\w+`, Text, nil}, + {`.`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/angular2.go b/vendor/github.com/alecthomas/chroma/lexers/a/angular2.go new file mode 100644 index 0000000..a947eda --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/angular2.go @@ -0,0 +1,46 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Angular2 lexer. +var Angular2 = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Angular2", + Aliases: []string{"ng2"}, + Filenames: []string{}, + MimeTypes: []string{}, + }, + angular2Rules, +)) + +func angular2Rules() Rules { + return Rules{ + "root": { + {`[^{([*#]+`, Other, nil}, + {`(\{\{)(\s*)`, ByGroups(CommentPreproc, Text), Push("ngExpression")}, + {`([([]+)([\w:.-]+)([\])]+)(\s*)(=)(\s*)`, ByGroups(Punctuation, NameAttribute, Punctuation, Text, Operator, Text), Push("attr")}, + {`([([]+)([\w:.-]+)([\])]+)(\s*)`, ByGroups(Punctuation, NameAttribute, Punctuation, Text), nil}, + {`([*#])([\w:.-]+)(\s*)(=)(\s*)`, ByGroups(Punctuation, NameAttribute, Punctuation, Operator), Push("attr")}, + {`([*#])([\w:.-]+)(\s*)`, ByGroups(Punctuation, NameAttribute, Punctuation), nil}, + }, + "ngExpression": { + {`\s+(\|\s+)?`, Text, nil}, + {`\}\}`, CommentPreproc, Pop(1)}, + {`:?(true|false)`, LiteralStringBoolean, nil}, + {`:?"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`:?'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + {`[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?`, LiteralNumber, nil}, + {`[a-zA-Z][\w-]*(\(.*\))?`, NameVariable, nil}, + {`\.[\w-]+(\(.*\))?`, NameVariable, nil}, + {`(\?)(\s*)([^}\s]+)(\s*)(:)(\s*)([^}\s]+)(\s*)`, ByGroups(Operator, Text, LiteralString, Text, Operator, Text, LiteralString, Text), nil}, + }, + "attr": { + {`".*?"`, LiteralString, Pop(1)}, + {`'.*?'`, LiteralString, Pop(1)}, + {`[^\s>]+`, LiteralString, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/antlr.go b/vendor/github.com/alecthomas/chroma/lexers/a/antlr.go new file mode 100644 index 0000000..c744353 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/antlr.go @@ -0,0 +1,105 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// ANTLR lexer. +var ANTLR = internal.Register(MustNewLazyLexer( + &Config{ + Name: "ANTLR", + Aliases: []string{"antlr"}, + Filenames: []string{}, + MimeTypes: []string{}, + }, + antlrRules, +)) + +func antlrRules() Rules { + return Rules{ + "whitespace": { + {`\s+`, TextWhitespace, nil}, + }, + "comments": { + {`//.*$`, Comment, nil}, + {`/\*(.|\n)*?\*/`, Comment, nil}, + }, + "root": { + Include("whitespace"), + Include("comments"), + {`(lexer|parser|tree)?(\s*)(grammar\b)(\s*)([A-Za-z]\w*)(;)`, ByGroups(Keyword, TextWhitespace, Keyword, TextWhitespace, NameClass, Punctuation), nil}, + {`options\b`, Keyword, Push("options")}, + {`tokens\b`, Keyword, Push("tokens")}, + {`(scope)(\s*)([A-Za-z]\w*)(\s*)(\{)`, ByGroups(Keyword, TextWhitespace, NameVariable, TextWhitespace, Punctuation), Push("action")}, + {`(catch|finally)\b`, Keyword, Push("exception")}, + {`(@[A-Za-z]\w*)(\s*)(::)?(\s*)([A-Za-z]\w*)(\s*)(\{)`, ByGroups(NameLabel, TextWhitespace, Punctuation, TextWhitespace, NameLabel, TextWhitespace, Punctuation), Push("action")}, + {`((?:protected|private|public|fragment)\b)?(\s*)([A-Za-z]\w*)(!)?`, ByGroups(Keyword, TextWhitespace, NameLabel, Punctuation), Push("rule-alts", "rule-prelims")}, + }, + "exception": { + {`\n`, TextWhitespace, Pop(1)}, + {`\s`, TextWhitespace, nil}, + Include("comments"), + {`\[`, Punctuation, Push("nested-arg-action")}, + {`\{`, Punctuation, Push("action")}, + }, + "rule-prelims": { + Include("whitespace"), + Include("comments"), + {`returns\b`, Keyword, nil}, + {`\[`, Punctuation, Push("nested-arg-action")}, + {`\{`, Punctuation, Push("action")}, + {`(throws)(\s+)([A-Za-z]\w*)`, ByGroups(Keyword, TextWhitespace, NameLabel), nil}, + {`(,)(\s*)([A-Za-z]\w*)`, ByGroups(Punctuation, TextWhitespace, NameLabel), nil}, + {`options\b`, Keyword, Push("options")}, + {`(scope)(\s+)(\{)`, ByGroups(Keyword, TextWhitespace, Punctuation), Push("action")}, + {`(scope)(\s+)([A-Za-z]\w*)(\s*)(;)`, ByGroups(Keyword, TextWhitespace, NameLabel, TextWhitespace, Punctuation), nil}, + {`(@[A-Za-z]\w*)(\s*)(\{)`, ByGroups(NameLabel, TextWhitespace, Punctuation), Push("action")}, + {`:`, Punctuation, Pop(1)}, + }, + "rule-alts": { + Include("whitespace"), + Include("comments"), + {`options\b`, Keyword, Push("options")}, + {`:`, Punctuation, nil}, + {`'(\\\\|\\'|[^'])*'`, LiteralString, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`<<([^>]|>[^>])>>`, LiteralString, nil}, + {`\$?[A-Z_]\w*`, NameConstant, nil}, + {`\$?[a-z_]\w*`, NameVariable, nil}, + {`(\+|\||->|=>|=|\(|\)|\.\.|\.|\?|\*|\^|!|\#|~)`, Operator, nil}, + {`,`, Punctuation, nil}, + {`\[`, Punctuation, Push("nested-arg-action")}, + {`\{`, Punctuation, Push("action")}, + {`;`, Punctuation, Pop(1)}, + }, + "tokens": { + Include("whitespace"), + Include("comments"), + {`\{`, Punctuation, nil}, + {`([A-Z]\w*)(\s*)(=)?(\s*)(\'(?:\\\\|\\\'|[^\']*)\')?(\s*)(;)`, ByGroups(NameLabel, TextWhitespace, Punctuation, TextWhitespace, LiteralString, TextWhitespace, Punctuation), nil}, + {`\}`, Punctuation, Pop(1)}, + }, + "options": { + Include("whitespace"), + Include("comments"), + {`\{`, Punctuation, nil}, + {`([A-Za-z]\w*)(\s*)(=)(\s*)([A-Za-z]\w*|\'(?:\\\\|\\\'|[^\']*)\'|[0-9]+|\*)(\s*)(;)`, ByGroups(NameVariable, TextWhitespace, Punctuation, TextWhitespace, Text, TextWhitespace, Punctuation), nil}, + {`\}`, Punctuation, Pop(1)}, + }, + "action": { + {`([^${}\'"/\\]+|"(\\\\|\\"|[^"])*"|'(\\\\|\\'|[^'])*'|//.*$\n?|/\*(.|\n)*?\*/|/(?!\*)(\\\\|\\/|[^/])*/|\\(?!%)|/)+`, Other, nil}, + {`(\\)(%)`, ByGroups(Punctuation, Other), nil}, + {`(\$[a-zA-Z]+)(\.?)(text|value)?`, ByGroups(NameVariable, Punctuation, NameProperty), nil}, + {`\{`, Punctuation, Push()}, + {`\}`, Punctuation, Pop(1)}, + }, + "nested-arg-action": { + {`([^$\[\]\'"/]+|"(\\\\|\\"|[^"])*"|'(\\\\|\\'|[^'])*'|//.*$\n?|/\*(.|\n)*?\*/|/(?!\*)(\\\\|\\/|[^/])*/|/)+`, Other, nil}, + {`\[`, Punctuation, Push()}, + {`\]`, Punctuation, Pop(1)}, + {`(\$[a-zA-Z]+)(\.?)(text|value)?`, ByGroups(NameVariable, Punctuation, NameProperty), nil}, + {`(\\\\|\\\]|\\\[|[^\[\]])+`, Other, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/apache.go b/vendor/github.com/alecthomas/chroma/lexers/a/apache.go new file mode 100644 index 0000000..5685eb1 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/apache.go @@ -0,0 +1,42 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Apacheconf lexer. +var Apacheconf = internal.Register(MustNewLazyLexer( + &Config{ + Name: "ApacheConf", + Aliases: []string{"apacheconf", "aconf", "apache"}, + Filenames: []string{".htaccess", "apache.conf", "apache2.conf"}, + MimeTypes: []string{"text/x-apacheconf"}, + CaseInsensitive: true, + }, + apacheconfRules, +)) + +func apacheconfRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`(#.*?)$`, Comment, nil}, + {`(<[^\s>]+)(?:(\s+)(.*?))?(>)`, ByGroups(NameTag, Text, LiteralString, NameTag), nil}, + {`([a-z]\w*)(\s+)`, ByGroups(NameBuiltin, Text), Push("value")}, + {`\.+`, Text, nil}, + }, + "value": { + {`\\\n`, Text, nil}, + {`$`, Text, Pop(1)}, + {`\\`, Text, nil}, + {`[^\S\n]+`, Text, nil}, + {`\d+\.\d+\.\d+\.\d+(?:/\d+)?`, LiteralNumber, nil}, + {`\d+`, LiteralNumber, nil}, + {`/([a-z0-9][\w./-]+)`, LiteralStringOther, nil}, + {`(on|off|none|any|all|double|email|dns|min|minimal|os|productonly|full|emerg|alert|crit|error|warn|notice|info|debug|registry|script|inetd|standalone|user|group)\b`, Keyword, nil}, + {`"([^"\\]*(?:\\.[^"\\]*)*)"`, LiteralStringDouble, nil}, + {`[^\s"\\]+`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/apl.go b/vendor/github.com/alecthomas/chroma/lexers/a/apl.go new file mode 100644 index 0000000..f929d2e --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/apl.go @@ -0,0 +1,40 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Apl lexer. +var Apl = internal.Register(MustNewLazyLexer( + &Config{ + Name: "APL", + Aliases: []string{"apl"}, + Filenames: []string{"*.apl"}, + MimeTypes: []string{}, + }, + aplRules, +)) + +func aplRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`[⍝#].*$`, CommentSingle, nil}, + {`\'((\'\')|[^\'])*\'`, LiteralStringSingle, nil}, + {`"(("")|[^"])*"`, LiteralStringDouble, nil}, + {`[⋄◇()]`, Punctuation, nil}, + {`[\[\];]`, LiteralStringRegex, nil}, + {`⎕[A-Za-zΔ∆⍙][A-Za-zΔ∆⍙_¯0-9]*`, NameFunction, nil}, + {`[A-Za-zΔ∆⍙_][A-Za-zΔ∆⍙_¯0-9]*`, NameVariable, nil}, + {`¯?(0[Xx][0-9A-Fa-f]+|[0-9]*\.?[0-9]+([Ee][+¯]?[0-9]+)?|¯|∞)([Jj]¯?(0[Xx][0-9A-Fa-f]+|[0-9]*\.?[0-9]+([Ee][+¯]?[0-9]+)?|¯|∞))?`, LiteralNumber, nil}, + {`[\.\\/⌿⍀¨⍣⍨⍠⍤∘⍥@⌺⌶⍢]`, NameAttribute, nil}, + {`[+\-×÷⌈⌊∣|⍳?*⍟○!⌹<≤=>≥≠≡≢∊⍷∪∩~∨∧⍱⍲⍴,⍪⌽⊖⍉↑↓⊂⊃⌷⍋⍒⊤⊥⍕⍎⊣⊢⍁⍂≈⌸⍯↗⊆⍸]`, Operator, nil}, + {`⍬`, NameConstant, nil}, + {`[⎕⍞]`, NameVariableGlobal, nil}, + {`[←→]`, KeywordDeclaration, nil}, + {`[⍺⍵⍶⍹∇:]`, NameBuiltinPseudo, nil}, + {`[{}]`, KeywordType, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/applescript.go b/vendor/github.com/alecthomas/chroma/lexers/a/applescript.go new file mode 100644 index 0000000..b6a53c5 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/applescript.go @@ -0,0 +1,59 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Applescript lexer. +var Applescript = internal.Register(MustNewLazyLexer( + &Config{ + Name: "AppleScript", + Aliases: []string{"applescript"}, + Filenames: []string{"*.applescript"}, + MimeTypes: []string{}, + DotAll: true, + }, + applescriptRules, +)) + +func applescriptRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`¬\n`, LiteralStringEscape, nil}, + {`'s\s+`, Text, nil}, + {`(--|#).*?$`, Comment, nil}, + {`\(\*`, CommentMultiline, Push("comment")}, + {`[(){}!,.:]`, Punctuation, nil}, + {`(«)([^»]+)(»)`, ByGroups(Text, NameBuiltin, Text), nil}, + {`\b((?:considering|ignoring)\s*)(application responses|case|diacriticals|hyphens|numeric strings|punctuation|white space)`, ByGroups(Keyword, NameBuiltin), nil}, + {`(-|\*|\+|&|≠|>=?|<=?|=|≥|≤|/|÷|\^)`, Operator, nil}, + {`\b(and|or|is equal|equals|(is )?equal to|is not|isn't|isn't equal( to)?|is not equal( to)?|doesn't equal|does not equal|(is )?greater than|comes after|is not less than or equal( to)?|isn't less than or equal( to)?|(is )?less than|comes before|is not greater than or equal( to)?|isn't greater than or equal( to)?|(is )?greater than or equal( to)?|is not less than|isn't less than|does not come before|doesn't come before|(is )?less than or equal( to)?|is not greater than|isn't greater than|does not come after|doesn't come after|starts? with|begins? with|ends? with|contains?|does not contain|doesn't contain|is in|is contained by|is not in|is not contained by|isn't contained by|div|mod|not|(a )?(ref( to)?|reference to)|is|does)\b`, OperatorWord, nil}, + {`^(\s*(?:on|end)\s+)(zoomed|write to file|will zoom|will show|will select tab view item|will resize( sub views)?|will resign active|will quit|will pop up|will open|will move|will miniaturize|will hide|will finish launching|will display outline cell|will display item cell|will display cell|will display browser cell|will dismiss|will close|will become active|was miniaturized|was hidden|update toolbar item|update parameters|update menu item|shown|should zoom|should selection change|should select tab view item|should select row|should select item|should select column|should quit( after last window closed)?|should open( untitled)?|should expand item|should end editing|should collapse item|should close|should begin editing|selection changing|selection changed|selected tab view item|scroll wheel|rows changed|right mouse up|right mouse dragged|right mouse down|resized( sub views)?|resigned main|resigned key|resigned active|read from file|prepare table drop|prepare table drag|prepare outline drop|prepare outline drag|prepare drop|plugin loaded|parameters updated|panel ended|opened|open untitled|number of rows|number of items|number of browser rows|moved|mouse up|mouse moved|mouse exited|mouse entered|mouse dragged|mouse down|miniaturized|load data representation|launched|keyboard up|keyboard down|items changed|item value changed|item value|item expandable|idle|exposed|end editing|drop|drag( (entered|exited|updated))?|double clicked|document nib name|dialog ended|deminiaturized|data representation|conclude drop|column resized|column moved|column clicked|closed|clicked toolbar item|clicked|choose menu item|child of item|changed|change item value|change cell value|cell value changed|cell value|bounds changed|begin editing|became main|became key|awake from nib|alert ended|activated|action|accept table drop|accept outline drop)`, ByGroups(Keyword, NameFunction), nil}, + {`^(\s*)(in|on|script|to)(\s+)`, ByGroups(Text, Keyword, Text), nil}, + {`\b(as )(alias |application |boolean |class |constant |date |file |integer |list |number |POSIX file |real |record |reference |RGB color |script |text |unit types|(?:Unicode )?text|string)\b`, ByGroups(Keyword, NameClass), nil}, + {`\b(AppleScript|current application|false|linefeed|missing value|pi|quote|result|return|space|tab|text item delimiters|true|version)\b`, NameConstant, nil}, + {`\b(ASCII (character|number)|activate|beep|choose URL|choose application|choose color|choose file( name)?|choose folder|choose from list|choose remote application|clipboard info|close( access)?|copy|count|current date|delay|delete|display (alert|dialog)|do shell script|duplicate|exists|get eof|get volume settings|info for|launch|list (disks|folder)|load script|log|make|mount volume|new|offset|open( (for access|location))?|path to|print|quit|random number|read|round|run( script)?|say|scripting components|set (eof|the clipboard to|volume)|store script|summarize|system attribute|system info|the clipboard|time to GMT|write|quoted form)\b`, NameBuiltin, nil}, + {`\b(considering|else|error|exit|from|if|ignoring|in|repeat|tell|then|times|to|try|until|using terms from|while|with|with timeout( of)?|with transaction|by|continue|end|its?|me|my|return|of|as)\b`, Keyword, nil}, + {`\b(global|local|prop(erty)?|set|get)\b`, Keyword, nil}, + {`\b(but|put|returning|the)\b`, NameBuiltin, nil}, + {`\b(attachment|attribute run|character|day|month|paragraph|word|year)s?\b`, NameBuiltin, nil}, + {`\b(about|above|against|apart from|around|aside from|at|below|beneath|beside|between|for|given|instead of|on|onto|out of|over|since)\b`, NameBuiltin, nil}, + {`\b(accepts arrow key|action method|active|alignment|allowed identifiers|allows branch selection|allows column reordering|allows column resizing|allows column selection|allows customization|allows editing text attributes|allows empty selection|allows mixed state|allows multiple selection|allows reordering|allows undo|alpha( value)?|alternate image|alternate increment value|alternate title|animation delay|associated file name|associated object|auto completes|auto display|auto enables items|auto repeat|auto resizes( outline column)?|auto save expanded items|auto save name|auto save table columns|auto saves configuration|auto scroll|auto sizes all columns to fit|auto sizes cells|background color|bezel state|bezel style|bezeled|border rect|border type|bordered|bounds( rotation)?|box type|button returned|button type|can choose directories|can choose files|can draw|can hide|cell( (background color|size|type))?|characters|class|click count|clicked( data)? column|clicked data item|clicked( data)? row|closeable|collating|color( (mode|panel))|command key down|configuration|content(s| (size|view( margins)?))?|context|continuous|control key down|control size|control tint|control view|controller visible|coordinate system|copies( on scroll)?|corner view|current cell|current column|current( field)? editor|current( menu)? item|current row|current tab view item|data source|default identifiers|delta (x|y|z)|destination window|directory|display mode|displayed cell|document( (edited|rect|view))?|double value|dragged column|dragged distance|dragged items|draws( cell)? background|draws grid|dynamically scrolls|echos bullets|edge|editable|edited( data)? column|edited data item|edited( data)? row|enabled|enclosing scroll view|ending page|error handling|event number|event type|excluded from windows menu|executable path|expanded|fax number|field editor|file kind|file name|file type|first responder|first visible column|flipped|floating|font( panel)?|formatter|frameworks path|frontmost|gave up|grid color|has data items|has horizontal ruler|has horizontal scroller|has parent data item|has resize indicator|has shadow|has sub menu|has vertical ruler|has vertical scroller|header cell|header view|hidden|hides when deactivated|highlights by|horizontal line scroll|horizontal page scroll|horizontal ruler view|horizontally resizable|icon image|id|identifier|ignores multiple clicks|image( (alignment|dims when disabled|frame style|scaling))?|imports graphics|increment value|indentation per level|indeterminate|index|integer value|intercell spacing|item height|key( (code|equivalent( modifier)?|window))?|knob thickness|label|last( visible)? column|leading offset|leaf|level|line scroll|loaded|localized sort|location|loop mode|main( (bunde|menu|window))?|marker follows cell|matrix mode|maximum( content)? size|maximum visible columns|menu( form representation)?|miniaturizable|miniaturized|minimized image|minimized title|minimum column width|minimum( content)? size|modal|modified|mouse down state|movie( (controller|file|rect))?|muted|name|needs display|next state|next text|number of tick marks|only tick mark values|opaque|open panel|option key down|outline table column|page scroll|pages across|pages down|palette label|pane splitter|parent data item|parent window|pasteboard|path( (names|separator))?|playing|plays every frame|plays selection only|position|preferred edge|preferred type|pressure|previous text|prompt|properties|prototype cell|pulls down|rate|released when closed|repeated|requested print time|required file type|resizable|resized column|resource path|returns records|reuses columns|rich text|roll over|row height|rulers visible|save panel|scripts path|scrollable|selectable( identifiers)?|selected cell|selected( data)? columns?|selected data items?|selected( data)? rows?|selected item identifier|selection by rect|send action on arrow key|sends action when done editing|separates columns|separator item|sequence number|services menu|shared frameworks path|shared support path|sheet|shift key down|shows alpha|shows state by|size( mode)?|smart insert delete enabled|sort case sensitivity|sort column|sort order|sort type|sorted( data rows)?|sound|source( mask)?|spell checking enabled|starting page|state|string value|sub menu|super menu|super view|tab key traverses cells|tab state|tab type|tab view|table view|tag|target( printer)?|text color|text container insert|text container origin|text returned|tick mark position|time stamp|title(d| (cell|font|height|position|rect))?|tool tip|toolbar|trailing offset|transparent|treat packages as directories|truncated labels|types|unmodified characters|update views|use sort indicator|user defaults|uses data source|uses ruler|uses threaded animation|uses title from previous column|value wraps|version|vertical( (line scroll|page scroll|ruler view))?|vertically resizable|view|visible( document rect)?|volume|width|window|windows menu|wraps|zoomable|zoomed)\b`, NameAttribute, nil}, + {`\b(action cell|alert reply|application|box|browser( cell)?|bundle|button( cell)?|cell|clip view|color well|color-panel|combo box( item)?|control|data( (cell|column|item|row|source))?|default entry|dialog reply|document|drag info|drawer|event|font(-panel)?|formatter|image( (cell|view))?|matrix|menu( item)?|item|movie( view)?|open-panel|outline view|panel|pasteboard|plugin|popup button|progress indicator|responder|save-panel|scroll view|secure text field( cell)?|slider|sound|split view|stepper|tab view( item)?|table( (column|header cell|header view|view))|text( (field( cell)?|view))?|toolbar( item)?|user-defaults|view|window)s?\b`, NameBuiltin, nil}, + {`\b(animate|append|call method|center|close drawer|close panel|display|display alert|display dialog|display panel|go|hide|highlight|increment|item for|load image|load movie|load nib|load panel|load sound|localized string|lock focus|log|open drawer|path for|pause|perform action|play|register|resume|scroll|select( all)?|show|size to fit|start|step back|step forward|stop|synchronize|unlock focus|update)\b`, NameBuiltin, nil}, + {`\b((in )?back of|(in )?front of|[0-9]+(st|nd|rd|th)|first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth|after|back|before|behind|every|front|index|last|middle|some|that|through|thru|where|whose)\b`, NameBuiltin, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`\b([a-zA-Z]\w*)\b`, NameVariable, nil}, + {`[-+]?(\d+\.\d*|\d*\.\d+)(E[-+][0-9]+)?`, LiteralNumberFloat, nil}, + {`[-+]?\d+`, LiteralNumberInteger, nil}, + }, + "comment": { + {`\(\*`, CommentMultiline, Push()}, + {`\*\)`, CommentMultiline, Pop(1)}, + {`[^*(]+`, CommentMultiline, nil}, + {`[*(]`, CommentMultiline, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/arduino.go b/vendor/github.com/alecthomas/chroma/lexers/a/arduino.go new file mode 100644 index 0000000..0edbe3f --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/arduino.go @@ -0,0 +1,114 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Arduino lexer. +var Arduino = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Arduino", + Aliases: []string{"arduino"}, + Filenames: []string{"*.ino"}, + MimeTypes: []string{"text/x-arduino"}, + EnsureNL: true, + }, + arduinoRules, +)) + +func arduinoRules() Rules { + return Rules{ + "statements": { + {Words(``, `\b`, `catch`, `const_cast`, `delete`, `dynamic_cast`, `explicit`, `export`, `friend`, `mutable`, `namespace`, `new`, `operator`, `private`, `protected`, `public`, `reinterpret_cast`, `restrict`, `static_cast`, `template`, `this`, `throw`, `throws`, `try`, `typeid`, `typename`, `using`, `virtual`, `constexpr`, `nullptr`, `decltype`, `thread_local`, `alignas`, `alignof`, `static_assert`, `noexcept`, `override`, `final`), Keyword, nil}, + {`char(16_t|32_t)\b`, KeywordType, nil}, + {`(class)\b`, ByGroups(Keyword, Text), Push("classname")}, + {`(R)(")([^\\()\s]{,16})(\()((?:.|\n)*?)(\)\3)(")`, ByGroups(LiteralStringAffix, LiteralString, LiteralStringDelimiter, LiteralStringDelimiter, LiteralString, LiteralStringDelimiter, LiteralString), nil}, + {`(u8|u|U)(")`, ByGroups(LiteralStringAffix, LiteralString), Push("string")}, + {`(L?)(")`, ByGroups(LiteralStringAffix, LiteralString), Push("string")}, + {`(L?)(')(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])(')`, ByGroups(LiteralStringAffix, LiteralStringChar, LiteralStringChar, LiteralStringChar), nil}, + {`(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*`, LiteralNumberFloat, nil}, + {`(\d+\.\d*|\.\d+|\d+[fF])[fF]?`, LiteralNumberFloat, nil}, + {`0x[0-9a-fA-F]+[LlUu]*`, LiteralNumberHex, nil}, + {`0[0-7]+[LlUu]*`, LiteralNumberOct, nil}, + {`\d+[LlUu]*`, LiteralNumberInteger, nil}, + {`\*/`, Error, nil}, + {`[~!%^&*+=|?:<>/-]`, Operator, nil}, + {`[()\[\],.]`, Punctuation, nil}, + {Words(``, `\b`, `asm`, `auto`, `break`, `case`, `const`, `continue`, `default`, `do`, `else`, `enum`, `extern`, `for`, `goto`, `if`, `register`, `restricted`, `return`, `sizeof`, `static`, `struct`, `switch`, `typedef`, `union`, `volatile`, `while`), Keyword, nil}, + {`(_Bool|_Complex|_Imaginary|array|atomic_bool|atomic_char|atomic_int|atomic_llong|atomic_long|atomic_schar|atomic_short|atomic_uchar|atomic_uint|atomic_ullong|atomic_ulong|atomic_ushort|auto|bool|boolean|BooleanVariables|Byte|byte|Char|char|char16_t|char32_t|class|complex|Const|const|const_cast|delete|double|dynamic_cast|enum|explicit|extern|Float|float|friend|inline|Int|int|int16_t|int32_t|int64_t|int8_t|Long|long|new|NULL|null|operator|private|PROGMEM|protected|public|register|reinterpret_cast|short|signed|sizeof|Static|static|static_cast|String|struct|typedef|uint16_t|uint32_t|uint64_t|uint8_t|union|unsigned|virtual|Void|void|Volatile|volatile|word)\b`, KeywordType, nil}, + // Start of: Arduino-specific syntax + {`(and|final|If|Loop|loop|not|or|override|setup|Setup|throw|try|xor)\b`, Keyword, nil}, // Addition to keywords already defined by C++ + {`(ANALOG_MESSAGE|BIN|CHANGE|DEC|DEFAULT|DIGITAL_MESSAGE|EXTERNAL|FALLING|FIRMATA_STRING|HALF_PI|HEX|HIGH|INPUT|INPUT_PULLUP|INTERNAL|INTERNAL1V1|INTERNAL1V1|INTERNAL2V56|INTERNAL2V56|LED_BUILTIN|LED_BUILTIN_RX|LED_BUILTIN_TX|LOW|LSBFIRST|MSBFIRST|OCT|OUTPUT|PI|REPORT_ANALOG|REPORT_DIGITAL|RISING|SET_PIN_MODE|SYSEX_START|SYSTEM_RESET|TWO_PI)\b`, KeywordConstant, nil}, + {`(boolean|const|byte|word|string|String|array)\b`, NameVariable, nil}, + {`(Keyboard|KeyboardController|MouseController|SoftwareSerial|EthernetServer|EthernetClient|LiquidCrystal|RobotControl|GSMVoiceCall|EthernetUDP|EsploraTFT|HttpClient|RobotMotor|WiFiClient|GSMScanner|FileSystem|Scheduler|GSMServer|YunClient|YunServer|IPAddress|GSMClient|GSMModem|Keyboard|Ethernet|Console|GSMBand|Esplora|Stepper|Process|WiFiUDP|GSM_SMS|Mailbox|USBHost|Firmata|PImage|Client|Server|GSMPIN|FileIO|Bridge|Serial|EEPROM|Stream|Mouse|Audio|Servo|File|Task|GPRS|WiFi|Wire|TFT|GSM|SPI|SD)\b`, NameClass, nil}, + {`(abs|Abs|accept|ACos|acos|acosf|addParameter|analogRead|AnalogRead|analogReadResolution|AnalogReadResolution|analogReference|AnalogReference|analogWrite|AnalogWrite|analogWriteResolution|AnalogWriteResolution|answerCall|asin|ASin|asinf|atan|ATan|atan2|ATan2|atan2f|atanf|attach|attached|attachGPRS|attachInterrupt|AttachInterrupt|autoscroll|available|availableForWrite|background|beep|begin|beginPacket|beginSD|beginSMS|beginSpeaker|beginTFT|beginTransmission|beginWrite|bit|Bit|BitClear|bitClear|bitRead|BitRead|bitSet|BitSet|BitWrite|bitWrite|blink|blinkVersion|BSSID|buffer|byte|cbrt|cbrtf|Ceil|ceil|ceilf|changePIN|char|charAt|checkPIN|checkPUK|checkReg|circle|cityNameRead|cityNameWrite|clear|clearScreen|click|close|compareTo|compassRead|concat|config|connect|connected|constrain|Constrain|copysign|copysignf|cos|Cos|cosf|cosh|coshf|countryNameRead|countryNameWrite|createChar|cursor|debugPrint|degrees|Delay|delay|DelayMicroseconds|delayMicroseconds|detach|DetachInterrupt|detachInterrupt|DigitalPinToInterrupt|digitalPinToInterrupt|DigitalRead|digitalRead|DigitalWrite|digitalWrite|disconnect|display|displayLogos|drawBMP|drawCompass|encryptionType|end|endPacket|endSMS|endsWith|endTransmission|endWrite|equals|equalsIgnoreCase|exists|exitValue|Exp|exp|expf|fabs|fabsf|fdim|fdimf|fill|find|findUntil|float|floor|Floor|floorf|flush|fma|fmaf|fmax|fmaxf|fmin|fminf|fmod|fmodf|gatewayIP|get|getAsynchronously|getBand|getButton|getBytes|getCurrentCarrier|getIMEI|getKey|getModifiers|getOemKey|getPINUsed|getResult|getSignalStrength|getSocket|getVoiceCallStatus|getXChange|getYChange|hangCall|height|highByte|HighByte|home|hypot|hypotf|image|indexOf|int|interrupts|IPAddress|IRread|isActionDone|isAlpha|isAlphaNumeric|isAscii|isControl|isDigit|isDirectory|isfinite|isGraph|isHexadecimalDigit|isinf|isListening|isLowerCase|isnan|isPIN|isPressed|isPrintable|isPunct|isSpace|isUpperCase|isValid|isWhitespace|keyboardRead|keyPressed|keyReleased|knobRead|lastIndexOf|ldexp|ldexpf|leftToRight|length|line|lineFollowConfig|listen|listenOnLocalhost|loadImage|localIP|log|Log|log10|log10f|logf|long|lowByte|LowByte|lrint|lrintf|lround|lroundf|macAddress|maintain|map|Map|Max|max|messageAvailable|Micros|micros|millis|Millis|Min|min|mkdir|motorsStop|motorsWrite|mouseDragged|mouseMoved|mousePressed|mouseReleased|move|noAutoscroll|noBlink|noBuffer|noCursor|noDisplay|noFill|noInterrupts|NoInterrupts|noListenOnLocalhost|noStroke|noTone|NoTone|onReceive|onRequest|open|openNextFile|overflow|parseCommand|parseFloat|parseInt|parsePacket|pauseMode|peek|PinMode|pinMode|playFile|playMelody|point|pointTo|position|Pow|pow|powf|prepare|press|print|printFirmwareVersion|println|printVersion|process|processInput|PulseIn|pulseIn|pulseInLong|PulseInLong|put|radians|random|Random|randomSeed|RandomSeed|read|readAccelerometer|readBlue|readButton|readBytes|readBytesUntil|readGreen|readJoystickButton|readJoystickSwitch|readJoystickX|readJoystickY|readLightSensor|readMessage|readMicrophone|readNetworks|readRed|readSlider|readString|readStringUntil|readTemperature|ready|rect|release|releaseAll|remoteIP|remoteNumber|remotePort|remove|replace|requestFrom|retrieveCallingNumber|rewindDirectory|rightToLeft|rmdir|robotNameRead|robotNameWrite|round|roundf|RSSI|run|runAsynchronously|running|runShellCommand|runShellCommandAsynchronously|scanNetworks|scrollDisplayLeft|scrollDisplayRight|seek|sendAnalog|sendDigitalPortPair|sendDigitalPorts|sendString|sendSysex|Serial_Available|Serial_Begin|Serial_End|Serial_Flush|Serial_Peek|Serial_Print|Serial_Println|Serial_Read|serialEvent|setBand|setBitOrder|setCharAt|setClockDivider|setCursor|setDataMode|setDNS|setFirmwareVersion|setMode|setPINUsed|setSpeed|setTextSize|setTimeout|ShiftIn|shiftIn|ShiftOut|shiftOut|shutdown|signbit|sin|Sin|sinf|sinh|sinhf|size|sizeof|Sq|sq|Sqrt|sqrt|sqrtf|SSID|startLoop|startsWith|step|stop|stroke|subnetMask|substring|switchPIN|tan|Tan|tanf|tanh|tanhf|tempoWrite|text|toCharArray|toInt|toLowerCase|tone|Tone|toUpperCase|transfer|trim|trunc|truncf|tuneWrite|turn|updateIR|userNameRead|userNameWrite|voiceCall|waitContinue|width|WiFiServer|word|write|writeBlue|writeGreen|writeJSON|writeMessage|writeMicroseconds|writeRed|writeRGB|yield|Yield)\b`, NameFunction, nil}, + // End of: Arduino-specific syntax + {Words(``, `\b`, `inline`, `_inline`, `__inline`, `naked`, `restrict`, `thread`, `typename`), KeywordReserved, nil}, + {`(__m(128i|128d|128|64))\b`, KeywordReserved, nil}, + {Words(`__`, `\b`, `asm`, `int8`, `based`, `except`, `int16`, `stdcall`, `cdecl`, `fastcall`, `int32`, `declspec`, `finally`, `int64`, `try`, `leave`, `wchar_t`, `w64`, `unaligned`, `raise`, `noop`, `identifier`, `forceinline`, `assume`), KeywordReserved, nil}, + {`(true|false|NULL)\b`, NameBuiltin, nil}, + {`([a-zA-Z_]\w*)(\s*)(:)(?!:)`, ByGroups(NameLabel, Text, Punctuation), nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + }, + "root": { + Include("whitespace"), + {`((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;{]*)(\{)`, ByGroups(UsingSelf("root"), NameFunction, UsingSelf("root"), UsingSelf("root"), Punctuation), Push("function")}, + {`((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;]*)(;)`, ByGroups(UsingSelf("root"), NameFunction, UsingSelf("root"), UsingSelf("root"), Punctuation), nil}, + Default(Push("statement")), + {Words(`__`, `\b`, `virtual_inheritance`, `uuidof`, `super`, `single_inheritance`, `multiple_inheritance`, `interface`, `event`), KeywordReserved, nil}, + {`__(offload|blockingoffload|outer)\b`, KeywordPseudo, nil}, + }, + "classname": { + {`[a-zA-Z_]\w*`, NameClass, Pop(1)}, + {`\s*(?=>)`, Text, Pop(1)}, + }, + "whitespace": { + {`^#if\s+0`, CommentPreproc, Push("if0")}, + {`^#`, CommentPreproc, Push("macro")}, + {`^(\s*(?:/[*].*?[*]/\s*)?)(#if\s+0)`, ByGroups(UsingSelf("root"), CommentPreproc), Push("if0")}, + {`^(\s*(?:/[*].*?[*]/\s*)?)(#)`, ByGroups(UsingSelf("root"), CommentPreproc), Push("macro")}, + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`\\\n`, Text, nil}, + {`//(\n|[\w\W]*?[^\\]\n)`, CommentSingle, nil}, + {`/(\\\n)?[*][\w\W]*?[*](\\\n)?/`, CommentMultiline, nil}, + {`/(\\\n)?[*][\w\W]*`, CommentMultiline, nil}, + }, + "statement": { + Include("whitespace"), + Include("statements"), + {`[{}]`, Punctuation, nil}, + {`;`, Punctuation, Pop(1)}, + }, + "function": { + Include("whitespace"), + Include("statements"), + {`;`, Punctuation, nil}, + {`\{`, Punctuation, Push()}, + {`\}`, Punctuation, Pop(1)}, + }, + "string": { + {`"`, LiteralString, Pop(1)}, + {`\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})`, LiteralStringEscape, nil}, + {`[^\\"\n]+`, LiteralString, nil}, + {`\\\n`, LiteralString, nil}, + {`\\`, LiteralString, nil}, + }, + "macro": { + {`(include)(\s*(?:/[*].*?[*]/\s*)?)([^\n]+)`, ByGroups(CommentPreproc, Text, CommentPreprocFile), nil}, + {`[^/\n]+`, CommentPreproc, nil}, + {`/[*](.|\n)*?[*]/`, CommentMultiline, nil}, + {`//.*?\n`, CommentSingle, Pop(1)}, + {`/`, CommentPreproc, nil}, + {`(?<=\\)\n`, CommentPreproc, nil}, + {`\n`, CommentPreproc, Pop(1)}, + }, + "if0": { + {`^\s*#if.*?(?+*%\^/!=|])=?`, Operator, Push("slashstartsregex")}, + {`[{(\[;,]`, Punctuation, Push("slashstartsregex")}, + {`[})\].]`, Punctuation, nil}, + {`(break|continue|do|while|exit|for|if|else|return|switch|case|default)\b`, Keyword, Push("slashstartsregex")}, + {`function\b`, KeywordDeclaration, Push("slashstartsregex")}, + {`(atan2|cos|exp|int|log|rand|sin|sqrt|srand|gensub|gsub|index|length|match|split|patsplit|sprintf|sub|substr|tolower|toupper|close|fflush|getline|next(file)|print|printf|strftime|systime|mktime|delete|system|strtonum|and|compl|lshift|or|rshift|asorti?|isarray|bindtextdomain|dcn?gettext|@(include|load|namespace))\b`, KeywordReserved, nil}, + {`(ARGC|ARGIND|ARGV|BEGIN(FILE)?|BINMODE|CONVFMT|ENVIRON|END(FILE)?|ERRNO|FIELDWIDTHS|FILENAME|FNR|FPAT|FS|IGNORECASE|LINT|NF|NR|OFMT|OFS|ORS|PROCINFO|RLENGTH|RS|RSTART|RT|SUBSEP|TEXTDOMAIN)\b`, NameBuiltin, nil}, + {`[@$a-zA-Z_]\w*`, NameOther, nil}, + {`[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?`, LiteralNumberFloat, nil}, + {`0x[0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/ballerina.go b/vendor/github.com/alecthomas/chroma/lexers/b/ballerina.go new file mode 100644 index 0000000..d8916d0 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/b/ballerina.go @@ -0,0 +1,50 @@ +package b + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Ballerina lexer. +var Ballerina = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Ballerina", + Aliases: []string{"ballerina"}, + Filenames: []string{"*.bal"}, + MimeTypes: []string{"text/x-ballerina"}, + DotAll: true, + }, + ballerinaRules, +)) + +func ballerinaRules() Rules { + return Rules{ + "root": { + {`[^\S\n]+`, Text, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`(break|catch|continue|done|else|finally|foreach|forever|fork|if|lock|match|return|throw|transaction|try|while)\b`, Keyword, nil}, + {`((?:(?:[^\W\d]|\$)[\w.\[\]$<>]*\s+)+?)((?:[^\W\d]|\$)[\w$]*)(\s*)(\()`, ByGroups(UsingSelf("root"), NameFunction, Text, Operator), nil}, + {`@[^\W\d][\w.]*`, NameDecorator, nil}, + {`(annotation|bind|but|endpoint|error|function|object|private|public|returns|service|type|var|with|worker)\b`, KeywordDeclaration, nil}, + {`(boolean|byte|decimal|float|int|json|map|nil|record|string|table|xml)\b`, KeywordType, nil}, + {`(true|false|null)\b`, KeywordConstant, nil}, + {`(import)(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'`, LiteralStringChar, nil}, + {`(\.)((?:[^\W\d]|\$)[\w$]*)`, ByGroups(Operator, NameAttribute), nil}, + {`^\s*([^\W\d]|\$)[\w$]*:`, NameLabel, nil}, + {`([^\W\d]|\$)[\w$]*`, Name, nil}, + {`([0-9][0-9_]*\.([0-9][0-9_]*)?|\.[0-9][0-9_]*)([eE][+\-]?[0-9][0-9_]*)?[fFdD]?|[0-9][eE][+\-]?[0-9][0-9_]*[fFdD]?|[0-9]([eE][+\-]?[0-9][0-9_]*)?[fFdD]|0[xX]([0-9a-fA-F][0-9a-fA-F_]*\.?|([0-9a-fA-F][0-9a-fA-F_]*)?\.[0-9a-fA-F][0-9a-fA-F_]*)[pP][+\-]?[0-9][0-9_]*[fFdD]?`, LiteralNumberFloat, nil}, + {`0[xX][0-9a-fA-F][0-9a-fA-F_]*[lL]?`, LiteralNumberHex, nil}, + {`0[bB][01][01_]*[lL]?`, LiteralNumberBin, nil}, + {`0[0-7_]+[lL]?`, LiteralNumberOct, nil}, + {`0|[1-9][0-9_]*[lL]?`, LiteralNumberInteger, nil}, + {`[~^*!%&\[\](){}<>|+=:;,./?-]`, Operator, nil}, + {`\n`, Text, nil}, + }, + "import": { + {`[\w.]+`, NameNamespace, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/bash.go b/vendor/github.com/alecthomas/chroma/lexers/b/bash.go new file mode 100644 index 0000000..34b1e22 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/b/bash.go @@ -0,0 +1,100 @@ +package b + +import ( + "regexp" + + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// TODO(moorereason): can this be factored away? +var bashAnalyserRe = regexp.MustCompile(`(?m)^#!.*/bin/(?:env |)(?:bash|zsh|sh|ksh)`) + +// Bash lexer. +var Bash = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Bash", + Aliases: []string{"bash", "sh", "ksh", "zsh", "shell"}, + Filenames: []string{"*.sh", "*.ksh", "*.bash", "*.ebuild", "*.eclass", ".env", "*.env", "*.exheres-0", "*.exlib", "*.zsh", "*.zshrc", ".bashrc", "bashrc", ".bash_*", "bash_*", "zshrc", ".zshrc", "PKGBUILD"}, + MimeTypes: []string{"application/x-sh", "application/x-shellscript"}, + }, + bashRules, +).SetAnalyser(func(text string) float32 { + if bashAnalyserRe.FindString(text) != "" { + return 1.0 + } + return 0.0 +})) + +func bashRules() Rules { + return Rules{ + "root": { + Include("basic"), + {"`", LiteralStringBacktick, Push("backticks")}, + Include("data"), + Include("interp"), + }, + "interp": { + {`\$\(\(`, Keyword, Push("math")}, + {`\$\(`, Keyword, Push("paren")}, + {`\$\{#?`, LiteralStringInterpol, Push("curly")}, + {`\$[a-zA-Z_]\w*`, NameVariable, nil}, + {`\$(?:\d+|[#$?!_*@-])`, NameVariable, nil}, + {`\$`, Text, nil}, + }, + "basic": { + {`\b(if|fi|else|while|do|done|for|then|return|function|case|select|continue|until|esac|elif)(\s*)\b`, ByGroups(Keyword, Text), nil}, + {"\\b(alias|bg|bind|break|builtin|caller|cd|command|compgen|complete|declare|dirs|disown|echo|enable|eval|exec|exit|export|false|fc|fg|getopts|hash|help|history|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|set|shift|shopt|source|suspend|test|time|times|trap|true|type|typeset|ulimit|umask|unalias|unset|wait)(?=[\\s)`])", NameBuiltin, nil}, + {`\A#!.+\n`, CommentPreproc, nil}, + {`#.*(\S|$)`, CommentSingle, nil}, + {`\\[\w\W]`, LiteralStringEscape, nil}, + {`(\b\w+)(\s*)(\+?=)`, ByGroups(NameVariable, Text, Operator), nil}, + {`[\[\]{}()=]`, Operator, nil}, + {`<<<`, Operator, nil}, + {`<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2`, LiteralString, nil}, + {`&&|\|\|`, Operator, nil}, + }, + "data": { + {`(?s)\$?"(\\\\|\\[0-7]+|\\.|[^"\\$])*"`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Push("string")}, + {`(?s)\$'(\\\\|\\[0-7]+|\\.|[^'\\])*'`, LiteralStringSingle, nil}, + {`(?s)'.*?'`, LiteralStringSingle, nil}, + {`;`, Punctuation, nil}, + {`&`, Punctuation, nil}, + {`\|`, Punctuation, nil}, + {`\s+`, Text, nil}, + {`\d+(?= |$)`, LiteralNumber, nil}, + {"[^=\\s\\[\\]{}()$\"\\'`\\\\<&|;]+", Text, nil}, + {`<`, Text, nil}, + }, + "string": { + {`"`, LiteralStringDouble, Pop(1)}, + {`(?s)(\\\\|\\[0-7]+|\\.|[^"\\$])+`, LiteralStringDouble, nil}, + Include("interp"), + }, + "curly": { + {`\}`, LiteralStringInterpol, Pop(1)}, + {`:-`, Keyword, nil}, + {`\w+`, NameVariable, nil}, + {"[^}:\"\\'`$\\\\]+", Punctuation, nil}, + {`:`, Punctuation, nil}, + Include("root"), + }, + "paren": { + {`\)`, Keyword, Pop(1)}, + Include("root"), + }, + "math": { + {`\)\)`, Keyword, Pop(1)}, + {`[-+*/%^|&]|\*\*|\|\|`, Operator, nil}, + {`\d+#\d+`, LiteralNumber, nil}, + {`\d+#(?! )`, LiteralNumber, nil}, + {`\d+`, LiteralNumber, nil}, + Include("root"), + }, + "backticks": { + {"`", LiteralStringBacktick, Pop(1)}, + Include("root"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/bashsession.go b/vendor/github.com/alecthomas/chroma/lexers/b/bashsession.go new file mode 100644 index 0000000..055cbb3 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/b/bashsession.go @@ -0,0 +1,27 @@ +package b + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// BashSession lexer. +var BashSession = internal.Register(MustNewLazyLexer( + &Config{ + Name: "BashSession", + Aliases: []string{"bash-session", "console", "shell-session"}, + Filenames: []string{".sh-session"}, + MimeTypes: []string{"text/x-sh"}, + EnsureNL: true, + }, + bashsessionRules, +)) + +func bashsessionRules() Rules { + return Rules{ + "root": { + {`^((?:\[[^]]+@[^]]+\]\s?)?[#$%>])(\s*)(.*\n?)`, ByGroups(GenericPrompt, Text, Using(Bash)), nil}, + {`^.+\n?`, GenericOutput, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/batch.go b/vendor/github.com/alecthomas/chroma/lexers/b/batch.go new file mode 100644 index 0000000..f7a8677 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/b/batch.go @@ -0,0 +1,198 @@ +package b + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Batchfile lexer. +var Batchfile = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Batchfile", + Aliases: []string{"bat", "batch", "dosbatch", "winbatch"}, + Filenames: []string{"*.bat", "*.cmd"}, + MimeTypes: []string{"application/x-dos-batch"}, + CaseInsensitive: true, + }, + batchfileRules, +)) + +func batchfileRules() Rules { + return Rules{ + "root": { + {`\)((?=\()|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))(?:(?:[^\n\x1a^]|\^[\n\x1a]?[\w\W])*)`, CommentSingle, nil}, + {`(?=((?:(?<=^[^:])|^[^:]?)[\t\v\f\r ,;=\xa0]*)(:))`, Text, Push("follow")}, + {`(?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)`, UsingSelf("text"), nil}, + Include("redirect"), + {`[\n\x1a]+`, Text, nil}, + {`\(`, Punctuation, Push("root/compound")}, + {`@+`, Punctuation, nil}, + {`((?:for|if|rem)(?:(?=(?:\^[\n\x1a]?)?/)|(?:(?!\^)|(?<=m))(?:(?=\()|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?(?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|\t\v\f\r ,;=\xa0])+)?(?:\^[\n\x1a]?)?/(?:\^[\n\x1a]?)?\?)`, ByGroups(Keyword, UsingSelf("text")), Push("follow")}, + {`(goto(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(]))((?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|[^"%\n\x1a&<>|])*(?:\^[\n\x1a]?)?/(?:\^[\n\x1a]?)?\?(?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|[^"%\n\x1a&<>|])*)`, ByGroups(Keyword, UsingSelf("text")), Push("follow")}, + {Words(``, `(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(])`, `assoc`, `break`, `cd`, `chdir`, `cls`, `color`, `copy`, `date`, `del`, `dir`, `dpath`, `echo`, `endlocal`, `erase`, `exit`, `ftype`, `keys`, `md`, `mkdir`, `mklink`, `move`, `path`, `pause`, `popd`, `prompt`, `pushd`, `rd`, `ren`, `rename`, `rmdir`, `setlocal`, `shift`, `start`, `time`, `title`, `type`, `ver`, `verify`, `vol`), Keyword, Push("follow")}, + {`(call)((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?)(:)`, ByGroups(Keyword, UsingSelf("text"), Punctuation), Push("call")}, + {`call(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(])`, Keyword, nil}, + {`(for(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])(?!\^))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+))(/f(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))`, ByGroups(Keyword, UsingSelf("text"), Keyword), Push("for/f", "for")}, + {`(for(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])(?!\^))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+))(/l(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))`, ByGroups(Keyword, UsingSelf("text"), Keyword), Push("for/l", "for")}, + {`for(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])(?!\^)`, Keyword, Push("for2", "for")}, + {`(goto(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(]))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?)(:?)`, ByGroups(Keyword, UsingSelf("text"), Punctuation), Push("label")}, + {`(if(?:(?=\()|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))(?!\^))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?)((?:/i(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))?)((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?)((?:not(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))?)((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?)`, ByGroups(Keyword, UsingSelf("text"), Keyword, UsingSelf("text"), Keyword, UsingSelf("text")), Push("(?", "if")}, + {`rem(((?=\()|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))(?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?(?:[&<>|]+|(?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|(?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|\t\v\f\r ,;=\xa0])+))+)?.*|(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(])(?:(?:[^\n\x1a^]|\^[\n\x1a]?[\w\W])*))`, CommentSingle, Push("follow")}, + {`(set(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(]))((?:(?:\^[\n\x1a]?)?[^\S\n])*)(/a)`, ByGroups(Keyword, UsingSelf("text"), Keyword), Push("arithmetic")}, + {`(set(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(]))((?:(?:\^[\n\x1a]?)?[^\S\n])*)((?:/p)?)((?:(?:\^[\n\x1a]?)?[^\S\n])*)((?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|^=]|\^[\n\x1a]?[^"=])+)?)((?:(?:\^[\n\x1a]?)?=)?)`, ByGroups(Keyword, UsingSelf("text"), Keyword, UsingSelf("text"), UsingSelf("variable"), Punctuation), Push("follow")}, + Default(Push("follow")), + }, + "follow": { + {`((?:(?<=^[^:])|^[^:]?)[\t\v\f\r ,;=\xa0]*)(:)([\t\v\f\r ,;=\xa0]*)((?:(?:[^\n\x1a&<>|\t\v\f\r ,;=\xa0+:^]|\^[\n\x1a]?[\w\W])*))(.*)`, ByGroups(Text, Punctuation, Text, NameLabel, CommentSingle), nil}, + Include("redirect"), + {`(?=[\n\x1a])`, Text, Pop(1)}, + {`\|\|?|&&?`, Punctuation, Pop(1)}, + Include("text"), + }, + "arithmetic": { + {`0[0-7]+`, LiteralNumberOct, nil}, + {`0x[\da-f]+`, LiteralNumberHex, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`[(),]+`, Punctuation, nil}, + {`([=+\-*/!~]|%|\^\^)+`, Operator, nil}, + {`((?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|(\^[\n\x1a]?)?[^()=+\-*/!~%^"\n\x1a&<>|\t\v\f\r ,;=\xa0]|\^[\n\x1a\t\v\f\r ,;=\xa0]?[\w\W])+`, UsingSelf("variable"), nil}, + {`(?=[\x00|&])`, Text, Pop(1)}, + Include("follow"), + }, + "call": { + {`(:?)((?:(?:[^\n\x1a&<>|\t\v\f\r ,;=\xa0+:^]|\^[\n\x1a]?[\w\W])*))`, ByGroups(Punctuation, NameLabel), Pop(1)}, + }, + "label": { + {`((?:(?:[^\n\x1a&<>|\t\v\f\r ,;=\xa0+:^]|\^[\n\x1a]?[\w\W])*)?)((?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|\^[\n\x1a]?[\w\W]|[^"%^\n\x1a&<>|])*)`, ByGroups(NameLabel, CommentSingle), Pop(1)}, + }, + "redirect": { + {`((?:(?<=[\n\x1a\t\v\f\r ,;=\xa0])\d)?)(>>?&|<&)([\n\x1a\t\v\f\r ,;=\xa0]*)(\d)`, ByGroups(LiteralNumberInteger, Punctuation, Text, LiteralNumberInteger), nil}, + {`((?:(?<=[\n\x1a\t\v\f\r ,;=\xa0])(?>?|<)((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?(?:[&<>|]+|(?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|(?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|\t\v\f\r ,;=\xa0])+))+))`, ByGroups(LiteralNumberInteger, Punctuation, UsingSelf("text")), nil}, + }, + "root/compound": { + {`\)`, Punctuation, Pop(1)}, + {`(?=((?:(?<=^[^:])|^[^:]?)[\t\v\f\r ,;=\xa0]*)(:))`, Text, Push("follow/compound")}, + {`(?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)`, UsingSelf("text"), nil}, + Include("redirect/compound"), + {`[\n\x1a]+`, Text, nil}, + {`\(`, Punctuation, Push("root/compound")}, + {`@+`, Punctuation, nil}, + {`((?:for|if|rem)(?:(?=(?:\^[\n\x1a]?)?/)|(?:(?!\^)|(?<=m))(?:(?=\()|(?:(?=\))|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])))))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?(?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|\t\v\f\r ,;=\xa0)])+)?(?:\^[\n\x1a]?)?/(?:\^[\n\x1a]?)?\?)`, ByGroups(Keyword, UsingSelf("text")), Push("follow/compound")}, + {`(goto(?:(?=\))|(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(])))((?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|[^"%\n\x1a&<>|)])*(?:\^[\n\x1a]?)?/(?:\^[\n\x1a]?)?\?(?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|[^"%\n\x1a&<>|)])*)`, ByGroups(Keyword, UsingSelf("text")), Push("follow/compound")}, + {Words(``, `(?:(?=\))|(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(]))`, `assoc`, `break`, `cd`, `chdir`, `cls`, `color`, `copy`, `date`, `del`, `dir`, `dpath`, `echo`, `endlocal`, `erase`, `exit`, `ftype`, `keys`, `md`, `mkdir`, `mklink`, `move`, `path`, `pause`, `popd`, `prompt`, `pushd`, `rd`, `ren`, `rename`, `rmdir`, `setlocal`, `shift`, `start`, `time`, `title`, `type`, `ver`, `verify`, `vol`), Keyword, Push("follow/compound")}, + {`(call)((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?)(:)`, ByGroups(Keyword, UsingSelf("text"), Punctuation), Push("call/compound")}, + {`call(?:(?=\))|(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(]))`, Keyword, nil}, + {`(for(?:(?=\))|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))(?!\^))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+))(/f(?:(?=\))|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])))`, ByGroups(Keyword, UsingSelf("text"), Keyword), Push("for/f", "for")}, + {`(for(?:(?=\))|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))(?!\^))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+))(/l(?:(?=\))|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])))`, ByGroups(Keyword, UsingSelf("text"), Keyword), Push("for/l", "for")}, + {`for(?:(?=\))|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))(?!\^)`, Keyword, Push("for2", "for")}, + {`(goto(?:(?=\))|(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(])))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?)(:?)`, ByGroups(Keyword, UsingSelf("text"), Punctuation), Push("label/compound")}, + {`(if(?:(?=\()|(?:(?=\))|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])))(?!\^))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?)((?:/i(?:(?=\))|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])))?)((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?)((?:not(?:(?=\))|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])))?)((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?)`, ByGroups(Keyword, UsingSelf("text"), Keyword, UsingSelf("text"), Keyword, UsingSelf("text")), Push("(?", "if")}, + {`rem(((?=\()|(?:(?=\))|(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])))(?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?(?:[&<>|]+|(?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|(?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|\t\v\f\r ,;=\xa0])+))+)?.*|(?:(?=\))|(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(]))(?:(?:[^\n\x1a^)]|\^[\n\x1a]?[^)])*))`, CommentSingle, Push("follow/compound")}, + {`(set(?:(?=\))|(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(])))((?:(?:\^[\n\x1a]?)?[^\S\n])*)(/a)`, ByGroups(Keyword, UsingSelf("text"), Keyword), Push("arithmetic/compound")}, + {`(set(?:(?=\))|(?=(?:\^[\n\x1a]?)?[\t\v\f\r ,;=\xa0+./:[\\\]]|[\n\x1a&<>|(])))((?:(?:\^[\n\x1a]?)?[^\S\n])*)((?:/p)?)((?:(?:\^[\n\x1a]?)?[^\S\n])*)((?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|^=)]|\^[\n\x1a]?[^"=])+)?)((?:(?:\^[\n\x1a]?)?=)?)`, ByGroups(Keyword, UsingSelf("text"), Keyword, UsingSelf("text"), UsingSelf("variable"), Punctuation), Push("follow/compound")}, + Default(Push("follow/compound")), + }, + "follow/compound": { + {`(?=\))`, Text, Pop(1)}, + {`((?:(?<=^[^:])|^[^:]?)[\t\v\f\r ,;=\xa0]*)(:)([\t\v\f\r ,;=\xa0]*)((?:(?:[^\n\x1a&<>|\t\v\f\r ,;=\xa0+:^)]|\^[\n\x1a]?[^)])*))(.*)`, ByGroups(Text, Punctuation, Text, NameLabel, CommentSingle), nil}, + Include("redirect/compound"), + {`(?=[\n\x1a])`, Text, Pop(1)}, + {`\|\|?|&&?`, Punctuation, Pop(1)}, + Include("text"), + }, + "arithmetic/compound": { + {`(?=\))`, Text, Pop(1)}, + {`0[0-7]+`, LiteralNumberOct, nil}, + {`0x[\da-f]+`, LiteralNumberHex, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`[(),]+`, Punctuation, nil}, + {`([=+\-*/!~]|%|\^\^)+`, Operator, nil}, + {`((?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|(\^[\n\x1a]?)?[^()=+\-*/!~%^"\n\x1a&<>|\t\v\f\r ,;=\xa0]|\^[\n\x1a\t\v\f\r ,;=\xa0]?[^)])+`, UsingSelf("variable"), nil}, + {`(?=[\x00|&])`, Text, Pop(1)}, + Include("follow"), + }, + "call/compound": { + {`(?=\))`, Text, Pop(1)}, + {`(:?)((?:(?:[^\n\x1a&<>|\t\v\f\r ,;=\xa0+:^)]|\^[\n\x1a]?[^)])*))`, ByGroups(Punctuation, NameLabel), Pop(1)}, + }, + "label/compound": { + {`(?=\))`, Text, Pop(1)}, + {`((?:(?:[^\n\x1a&<>|\t\v\f\r ,;=\xa0+:^)]|\^[\n\x1a]?[^)])*)?)((?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|\^[\n\x1a]?[^)]|[^"%^\n\x1a&<>|)])*)`, ByGroups(NameLabel, CommentSingle), Pop(1)}, + }, + "redirect/compound": { + {`((?:(?<=[\n\x1a\t\v\f\r ,;=\xa0])\d)?)(>>?&|<&)([\n\x1a\t\v\f\r ,;=\xa0]*)(\d)`, ByGroups(LiteralNumberInteger, Punctuation, Text, LiteralNumberInteger), nil}, + {`((?:(?<=[\n\x1a\t\v\f\r ,;=\xa0])(?>?|<)((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?(?:[&<>|]+|(?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|(?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|\t\v\f\r ,;=\xa0)])+))+))`, ByGroups(LiteralNumberInteger, Punctuation, UsingSelf("text")), nil}, + }, + "variable-or-escape": { + {`(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))`, NameVariable, nil}, + {`%%|\^[\n\x1a]?(\^!|[\w\W])`, LiteralStringEscape, nil}, + }, + "string": { + {`"`, LiteralStringDouble, Pop(1)}, + {`(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))`, NameVariable, nil}, + {`\^!|%%`, LiteralStringEscape, nil}, + {`[^"%^\n\x1a]+|[%^]`, LiteralStringDouble, nil}, + Default(Pop(1)), + }, + "sqstring": { + Include("variable-or-escape"), + {`[^%]+|%`, LiteralStringSingle, nil}, + }, + "bqstring": { + Include("variable-or-escape"), + {`[^%]+|%`, LiteralStringBacktick, nil}, + }, + "text": { + {`"`, LiteralStringDouble, Push("string")}, + Include("variable-or-escape"), + {`[^"%^\n\x1a&<>|\t\v\f\r ,;=\xa0\d)]+|.`, Text, nil}, + }, + "variable": { + {`"`, LiteralStringDouble, Push("string")}, + Include("variable-or-escape"), + {`[^"%^\n\x1a]+|.`, NameVariable, nil}, + }, + "for": { + {`((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+))(in)((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+))(\()`, ByGroups(UsingSelf("text"), Keyword, UsingSelf("text"), Punctuation), Pop(1)}, + Include("follow"), + }, + "for2": { + {`\)`, Punctuation, nil}, + {`((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+))(do(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))`, ByGroups(UsingSelf("text"), Keyword), Pop(1)}, + {`[\n\x1a]+`, Text, nil}, + Include("follow"), + }, + "for/f": { + {`(")((?:(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|[^"])*?")([\n\x1a\t\v\f\r ,;=\xa0]*)(\))`, ByGroups(LiteralStringDouble, UsingSelf("string"), Text, Punctuation), nil}, + {`"`, LiteralStringDouble, Push("#pop", "for2", "string")}, + {`('(?:%%|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|[\w\W])*?')([\n\x1a\t\v\f\r ,;=\xa0]*)(\))`, ByGroups(UsingSelf("sqstring"), Text, Punctuation), nil}, + {"(`(?:%%|(?:(?:%(?:\\*|(?:~[a-z]*(?:\\$[^:]+:)?)?\\d|[^%:\\n\\x1a]+(?::(?:~(?:-?\\d+)?(?:,(?:-?\\d+)?)?|(?:[^%\\n\\x1a^]|\\^[^%\\n\\x1a])[^=\\n\\x1a]*=(?:[^%\\n\\x1a^]|\\^[^%\\n\\x1a])*)?)?%))|(?:\\^?![^!:\\n\\x1a]+(?::(?:~(?:-?\\d+)?(?:,(?:-?\\d+)?)?|(?:[^!\\n\\x1a^]|\\^[^!\\n\\x1a])[^=\\n\\x1a]*=(?:[^!\\n\\x1a^]|\\^[^!\\n\\x1a])*)?)?\\^?!))|[\\w\\W])*?`)([\\n\\x1a\\t\\v\\f\\r ,;=\\xa0]*)(\\))", ByGroups(UsingSelf("bqstring"), Text, Punctuation), nil}, + Include("for2"), + }, + "for/l": { + {`-?\d+`, LiteralNumberInteger, nil}, + Include("for2"), + }, + "if": { + {`((?:cmdextversion|errorlevel)(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+))(\d+)`, ByGroups(Keyword, UsingSelf("text"), LiteralNumberInteger), Pop(1)}, + {`(defined(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+))((?:[&<>|]+|(?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|(?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|\t\v\f\r ,;=\xa0])+))+))`, ByGroups(Keyword, UsingSelf("text"), UsingSelf("variable")), Pop(1)}, + {`(exist(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)(?:[&<>|]+|(?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|(?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|\t\v\f\r ,;=\xa0])+))+))`, ByGroups(Keyword, UsingSelf("text")), Pop(1)}, + {`((?:-?(?:0[0-7]+|0x[\da-f]+|\d+)(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a]))(?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+))((?:equ|geq|gtr|leq|lss|neq))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)(?:-?(?:0[0-7]+|0x[\da-f]+|\d+)(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])))`, ByGroups(UsingSelf("arithmetic"), OperatorWord, UsingSelf("arithmetic")), Pop(1)}, + {`(?:[&<>|]+|(?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|(?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|\t\v\f\r ,;=\xa0])+))+)`, UsingSelf("text"), Push("#pop", "if2")}, + }, + "if2": { + {`((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?)(==)((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)?(?:[&<>|]+|(?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|(?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|\t\v\f\r ,;=\xa0])+))+))`, ByGroups(UsingSelf("text"), Operator, UsingSelf("text")), Pop(1)}, + {`((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+))((?:equ|geq|gtr|leq|lss|neq))((?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)(?:[&<>|]+|(?:(?:"[^\n\x1a"]*(?:"|(?=[\n\x1a])))|(?:(?:%(?:\*|(?:~[a-z]*(?:\$[^:]+:)?)?\d|[^%:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^%\n\x1a^]|\^[^%\n\x1a])[^=\n\x1a]*=(?:[^%\n\x1a^]|\^[^%\n\x1a])*)?)?%))|(?:\^?![^!:\n\x1a]+(?::(?:~(?:-?\d+)?(?:,(?:-?\d+)?)?|(?:[^!\n\x1a^]|\^[^!\n\x1a])[^=\n\x1a]*=(?:[^!\n\x1a^]|\^[^!\n\x1a])*)?)?\^?!))|(?:(?:(?:\^[\n\x1a]?)?[^"\n\x1a&<>|\t\v\f\r ,;=\xa0])+))+))`, ByGroups(UsingSelf("text"), OperatorWord, UsingSelf("text")), Pop(1)}, + }, + "(?": { + {`(?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)`, UsingSelf("text"), nil}, + {`\(`, Punctuation, Push("#pop", "else?", "root/compound")}, + Default(Pop(1)), + }, + "else?": { + {`(?:(?:(?:\^[\n\x1a])?[\t\v\f\r ,;=\xa0])+)`, UsingSelf("text"), nil}, + {`else(?=\^?[\t\v\f\r ,;=\xa0]|[&<>|\n\x1a])`, Keyword, Pop(1)}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/bibtex.go b/vendor/github.com/alecthomas/chroma/lexers/b/bibtex.go new file mode 100644 index 0000000..d6a0ae3 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/b/bibtex.go @@ -0,0 +1,80 @@ +package b + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Bibtex lexer. +var Bibtex = internal.Register(MustNewLazyLexer( + &Config{ + Name: "BibTeX", + Aliases: []string{"bib", "bibtex"}, + Filenames: []string{"*.bib"}, + MimeTypes: []string{"text/x-bibtex"}, + NotMultiline: true, + CaseInsensitive: true, + }, + bibtexRules, +)) + +func bibtexRules() Rules { + return Rules{ + "root": { + Include("whitespace"), + {`@comment`, Comment, nil}, + {`@preamble`, NameClass, Push("closing-brace", "value", "opening-brace")}, + {`@string`, NameClass, Push("closing-brace", "field", "opening-brace")}, + {"@[a-z_@!$&*+\\-./:;<>?\\[\\\\\\]^`|~][\\w@!$&*+\\-./:;<>?\\[\\\\\\]^`|~]*", NameClass, Push("closing-brace", "command-body", "opening-brace")}, + {`.+`, Comment, nil}, + }, + "opening-brace": { + Include("whitespace"), + {`[{(]`, Punctuation, Pop(1)}, + }, + "closing-brace": { + Include("whitespace"), + {`[})]`, Punctuation, Pop(1)}, + }, + "command-body": { + Include("whitespace"), + {`[^\s\,\}]+`, NameLabel, Push("#pop", "fields")}, + }, + "fields": { + Include("whitespace"), + {`,`, Punctuation, Push("field")}, + Default(Pop(1)), + }, + "field": { + Include("whitespace"), + {"[a-z_@!$&*+\\-./:;<>?\\[\\\\\\]^`|~][\\w@!$&*+\\-./:;<>?\\[\\\\\\]^`|~]*", NameAttribute, Push("value", "=")}, + Default(Pop(1)), + }, + "=": { + Include("whitespace"), + {`=`, Punctuation, Pop(1)}, + }, + "value": { + Include("whitespace"), + {"[a-z_@!$&*+\\-./:;<>?\\[\\\\\\]^`|~][\\w@!$&*+\\-./:;<>?\\[\\\\\\]^`|~]*", NameVariable, nil}, + {`"`, LiteralString, Push("quoted-string")}, + {`\{`, LiteralString, Push("braced-string")}, + {`[\d]+`, LiteralNumber, nil}, + {`#`, Punctuation, nil}, + Default(Pop(1)), + }, + "quoted-string": { + {`\{`, LiteralString, Push("braced-string")}, + {`"`, LiteralString, Pop(1)}, + {`[^\{\"]+`, LiteralString, nil}, + }, + "braced-string": { + {`\{`, LiteralString, Push()}, + {`\}`, LiteralString, Pop(1)}, + {`[^\{\}]+`, LiteralString, nil}, + }, + "whitespace": { + {`\s+`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/bicep.go b/vendor/github.com/alecthomas/chroma/lexers/b/bicep.go new file mode 100644 index 0000000..ec136fb --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/b/bicep.go @@ -0,0 +1,112 @@ +package b + +import ( + "strings" + + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Bicep lexer. +var Bicep = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Bicep", + Aliases: []string{"bicep"}, + Filenames: []string{"*.bicep"}, + }, + bicepRules, +)) + +func bicepRules() Rules { + bicepFunctions := []string{ + "any", + "array", + "concat", + "contains", + "empty", + "first", + "intersection", + "items", + "last", + "length", + "min", + "max", + "range", + "skip", + "take", + "union", + "dateTimeAdd", + "utcNow", + "deployment", + "environment", + "loadFileAsBase64", + "loadTextContent", + "int", + "json", + "extensionResourceId", + "getSecret", + "list", + "listKeys", + "listKeyValue", + "listAccountSas", + "listSecrets", + "pickZones", + "reference", + "resourceId", + "subscriptionResourceId", + "tenantResourceId", + "managementGroup", + "resourceGroup", + "subscription", + "tenant", + "base64", + "base64ToJson", + "base64ToString", + "dataUri", + "dataUriToString", + "endsWith", + "format", + "guid", + "indexOf", + "lastIndexOf", + "length", + "newGuid", + "padLeft", + "replace", + "split", + "startsWith", + "string", + "substring", + "toLower", + "toUpper", + "trim", + "uniqueString", + "uri", + "uriComponent", + "uriComponentToString", + } + + return Rules{ + "root": { + {`//[^\n\r]+`, CommentSingle, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`([']?\w+[']?)(:)`, ByGroups(NameProperty, Punctuation), nil}, + {`\b('(resourceGroup|subscription|managementGroup|tenant)')\b`, KeywordNamespace, nil}, + {`'[\w\$\{\(\)\}\.]{1,}?'`, LiteralStringInterpol, nil}, + {`('''|').*?('''|')`, LiteralString, nil}, + {`\b(allowed|batchSize|description|maxLength|maxValue|metadata|minLength|minValue|secure)\b`, NameDecorator, nil}, + {`\b(az|sys)\.`, NameNamespace, nil}, + {`\b(` + strings.Join(bicepFunctions, "|") + `)\b`, NameFunction, nil}, + // https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/bicep-functions-logical + {`\b(bool)(\()`, ByGroups(NameFunction, Punctuation), nil}, + {`\b(for|if|in)\b`, Keyword, nil}, + {`\b(module|output|param|resource|var)\b`, KeywordDeclaration, nil}, + {`\b(array|bool|int|object|string)\b`, KeywordType, nil}, + // https://docs.microsoft.com/en-us/azure/azure-resource-manager/bicep/operators + {`(>=|>|<=|<|==|!=|=~|!~|::|&&|\?\?|!|-|%|\*|\/|\+)`, Operator, nil}, + {`[\(\)\[\]\.:\?{}@=]`, Punctuation, nil}, + {`[\w_-]+`, Text, nil}, + {`\s+`, TextWhitespace, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/blitz.go b/vendor/github.com/alecthomas/chroma/lexers/b/blitz.go new file mode 100644 index 0000000..119f96b --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/b/blitz.go @@ -0,0 +1,52 @@ +package b + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Blitzbasic lexer. +var Blitzbasic = internal.Register(MustNewLazyLexer( + &Config{ + Name: "BlitzBasic", + Aliases: []string{"blitzbasic", "b3d", "bplus"}, + Filenames: []string{"*.bb", "*.decls"}, + MimeTypes: []string{"text/x-bb"}, + CaseInsensitive: true, + }, + blitzbasicRules, +)) + +func blitzbasicRules() Rules { + return Rules{ + "root": { + {`[ \t]+`, Text, nil}, + {`;.*?\n`, CommentSingle, nil}, + {`"`, LiteralStringDouble, Push("string")}, + {`[0-9]+\.[0-9]*(?!\.)`, LiteralNumberFloat, nil}, + {`\.[0-9]+(?!\.)`, LiteralNumberFloat, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`\$[0-9a-f]+`, LiteralNumberHex, nil}, + {`\%[10]+`, LiteralNumberBin, nil}, + {Words(`\b`, `\b`, `Shl`, `Shr`, `Sar`, `Mod`, `Or`, `And`, `Not`, `Abs`, `Sgn`, `Handle`, `Int`, `Float`, `Str`, `First`, `Last`, `Before`, `After`), Operator, nil}, + {`([+\-*/~=<>^])`, Operator, nil}, + {`[(),:\[\]\\]`, Punctuation, nil}, + {`\.([ \t]*)([a-z]\w*)`, NameLabel, nil}, + {`\b(New)\b([ \t]+)([a-z]\w*)`, ByGroups(KeywordReserved, Text, NameClass), nil}, + {`\b(Gosub|Goto)\b([ \t]+)([a-z]\w*)`, ByGroups(KeywordReserved, Text, NameLabel), nil}, + {`\b(Object)\b([ \t]*)([.])([ \t]*)([a-z]\w*)\b`, ByGroups(Operator, Text, Punctuation, Text, NameClass), nil}, + {`\b([a-z]\w*)(?:([ \t]*)(@{1,2}|[#$%])|([ \t]*)([.])([ \t]*)(?:([a-z]\w*)))?\b([ \t]*)(\()`, ByGroups(NameFunction, Text, KeywordType, Text, Punctuation, Text, NameClass, Text, Punctuation), nil}, + {`\b(Function)\b([ \t]+)([a-z]\w*)(?:([ \t]*)(@{1,2}|[#$%])|([ \t]*)([.])([ \t]*)(?:([a-z]\w*)))?`, ByGroups(KeywordReserved, Text, NameFunction, Text, KeywordType, Text, Punctuation, Text, NameClass), nil}, + {`\b(Type)([ \t]+)([a-z]\w*)`, ByGroups(KeywordReserved, Text, NameClass), nil}, + {`\b(Pi|True|False|Null)\b`, KeywordConstant, nil}, + {`\b(Local|Global|Const|Field|Dim)\b`, KeywordDeclaration, nil}, + {Words(`\b`, `\b`, `End`, `Return`, `Exit`, `Chr`, `Len`, `Asc`, `New`, `Delete`, `Insert`, `Include`, `Function`, `Type`, `If`, `Then`, `Else`, `ElseIf`, `EndIf`, `For`, `To`, `Next`, `Step`, `Each`, `While`, `Wend`, `Repeat`, `Until`, `Forever`, `Select`, `Case`, `Default`, `Goto`, `Gosub`, `Data`, `Read`, `Restore`), KeywordReserved, nil}, + {`([a-z]\w*)(?:([ \t]*)(@{1,2}|[#$%])|([ \t]*)([.])([ \t]*)(?:([a-z]\w*)))?`, ByGroups(NameVariable, Text, KeywordType, Text, Punctuation, Text, NameClass), nil}, + }, + "string": { + {`""`, LiteralStringDouble, nil}, + {`"C?`, LiteralStringDouble, Pop(1)}, + {`[^"]+`, LiteralStringDouble, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/bnf.go b/vendor/github.com/alecthomas/chroma/lexers/b/bnf.go new file mode 100644 index 0000000..dcf7360 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/b/bnf.go @@ -0,0 +1,28 @@ +package b + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Bnf lexer. +var Bnf = internal.Register(MustNewLazyLexer( + &Config{ + Name: "BNF", + Aliases: []string{"bnf"}, + Filenames: []string{"*.bnf"}, + MimeTypes: []string{"text/x-bnf"}, + }, + bnfRules, +)) + +func bnfRules() Rules { + return Rules{ + "root": { + {`(<)([ -;=?-~]+)(>)`, ByGroups(Punctuation, NameClass, Punctuation), nil}, + {`::=`, Operator, nil}, + {`[^<>:]+`, Text, nil}, + {`.`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/brainfuck.go b/vendor/github.com/alecthomas/chroma/lexers/b/brainfuck.go new file mode 100644 index 0000000..d35e9c6 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/b/brainfuck.go @@ -0,0 +1,38 @@ +package b + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Brainfuck lexer. +var Brainfuck = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Brainfuck", + Aliases: []string{"brainfuck", "bf"}, + Filenames: []string{"*.bf", "*.b"}, + MimeTypes: []string{"application/x-brainfuck"}, + }, + brainfuckRules, +)) + +func brainfuckRules() Rules { + return Rules{ + "common": { + {`[.,]+`, NameTag, nil}, + {`[+-]+`, NameBuiltin, nil}, + {`[<>]+`, NameVariable, nil}, + {`[^.,+\-<>\[\]]+`, Comment, nil}, + }, + "root": { + {`\[`, Keyword, Push("loop")}, + {`\]`, Error, nil}, + Include("common"), + }, + "loop": { + {`\[`, Keyword, Push()}, + {`\]`, Keyword, Pop(1)}, + Include("common"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/c.go b/vendor/github.com/alecthomas/chroma/lexers/c/c.go new file mode 100644 index 0000000..3698c4f --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/c.go @@ -0,0 +1,96 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// C lexer. +var C = internal.Register(MustNewLazyLexer( + &Config{ + Name: "C", + Aliases: []string{"c"}, + Filenames: []string{"*.c", "*.h", "*.idc", "*.x[bp]m"}, + MimeTypes: []string{"text/x-chdr", "text/x-csrc", "image/x-xbitmap", "image/x-xpixmap"}, + EnsureNL: true, + }, + cRules, +)) + +func cRules() Rules { + return Rules{ + "whitespace": { + {`^#if\s+0`, CommentPreproc, Push("if0")}, + {`^#`, CommentPreproc, Push("macro")}, + {`^(\s*(?:/[*].*?[*]/\s*)?)(#if\s+0)`, ByGroups(UsingSelf("root"), CommentPreproc), Push("if0")}, + {`^(\s*(?:/[*].*?[*]/\s*)?)(#)`, ByGroups(UsingSelf("root"), CommentPreproc), Push("macro")}, + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`\\\n`, Text, nil}, + {`//(\n|[\w\W]*?[^\\]\n)`, CommentSingle, nil}, + {`/(\\\n)?[*][\w\W]*?[*](\\\n)?/`, CommentMultiline, nil}, + {`/(\\\n)?[*][\w\W]*`, CommentMultiline, nil}, + }, + "statements": { + {`(L?)(")`, ByGroups(LiteralStringAffix, LiteralString), Push("string")}, + {`(L?)(')(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])(')`, ByGroups(LiteralStringAffix, LiteralStringChar, LiteralStringChar, LiteralStringChar), nil}, + {`(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*`, LiteralNumberFloat, nil}, + {`(\d+\.\d*|\.\d+|\d+[fF])[fF]?`, LiteralNumberFloat, nil}, + {`0x[0-9a-fA-F]+[LlUu]*`, LiteralNumberHex, nil}, + {`0[0-7]+[LlUu]*`, LiteralNumberOct, nil}, + {`\d+[LlUu]*`, LiteralNumberInteger, nil}, + {`\*/`, Error, nil}, + {`[~!%^&*+=|?:<>/-]`, Operator, nil}, + {`[()\[\],.]`, Punctuation, nil}, + {Words(``, `\b`, `asm`, `auto`, `break`, `case`, `const`, `continue`, `default`, `do`, `else`, `enum`, `extern`, `for`, `goto`, `if`, `register`, `restricted`, `return`, `sizeof`, `static`, `struct`, `switch`, `typedef`, `union`, `volatile`, `while`), Keyword, nil}, + {`(bool|int|long|float|short|double|char((8|16|32)_t)?|unsigned|signed|void|u?int(_fast|_least|)(8|16|32|64)_t)\b`, KeywordType, nil}, + {Words(``, `\b`, `inline`, `_inline`, `__inline`, `naked`, `restrict`, `thread`, `typename`), KeywordReserved, nil}, + {`(__m(128i|128d|128|64))\b`, KeywordReserved, nil}, + {Words(`__`, `\b`, `asm`, `int8`, `based`, `except`, `int16`, `stdcall`, `cdecl`, `fastcall`, `int32`, `declspec`, `finally`, `int64`, `try`, `leave`, `wchar_t`, `w64`, `unaligned`, `raise`, `noop`, `identifier`, `forceinline`, `assume`), KeywordReserved, nil}, + {`(true|false|NULL)\b`, NameBuiltin, nil}, + {`([a-zA-Z_]\w*)(\s*)(:)(?!:)`, ByGroups(NameLabel, Text, Punctuation), nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + }, + "root": { + Include("whitespace"), + {`((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;{]*)(\{)`, ByGroups(UsingSelf("root"), NameFunction, UsingSelf("root"), UsingSelf("root"), Punctuation), Push("function")}, + {`((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;]*)(;)`, ByGroups(UsingSelf("root"), NameFunction, UsingSelf("root"), UsingSelf("root"), Punctuation), nil}, + Default(Push("statement")), + }, + "statement": { + Include("whitespace"), + Include("statements"), + {`[{}]`, Punctuation, nil}, + {`;`, Punctuation, Pop(1)}, + }, + "function": { + Include("whitespace"), + Include("statements"), + {`;`, Punctuation, nil}, + {`\{`, Punctuation, Push()}, + {`\}`, Punctuation, Pop(1)}, + }, + "string": { + {`"`, LiteralString, Pop(1)}, + {`\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})`, LiteralStringEscape, nil}, + {`[^\\"\n]+`, LiteralString, nil}, + {`\\\n`, LiteralString, nil}, + {`\\`, LiteralString, nil}, + }, + "macro": { + {`(include)(\s*(?:/[*].*?[*]/\s*)?)([^\n]+)`, ByGroups(CommentPreproc, Text, CommentPreprocFile), nil}, + {`[^/\n]+`, CommentPreproc, nil}, + {`/[*](.|\n)*?[*]/`, CommentMultiline, nil}, + {`//.*?\n`, CommentSingle, Pop(1)}, + {`/`, CommentPreproc, nil}, + {`(?<=\\)\n`, CommentPreproc, nil}, + {`\n`, CommentPreproc, Pop(1)}, + }, + "if0": { + {`^\s*#if.*?(?\]`, NameDecorator, Push("matcher")}, + // These cannot have matchers but may have things that look like + // matchers in their arguments, so we just parse as a subdirective. + {`try_files`, Keyword, Push("subdirective")}, + // These are special, they can nest more directives + {`handle_errors|handle|route|handle_path|not`, Keyword, Push("nested_directive")}, + // Any other directive + {`[^\s#]+`, Keyword, Push("directive")}, + Include("base"), + }, + "matcher": { + {`\{`, Punctuation, Push("block")}, + // Not can be one-liner + {`not`, Keyword, Push("deep_not_matcher")}, + // Any other same-line matcher + {`[^\s#]+`, Keyword, Push("arguments")}, + // Terminators + {`\n`, Text, Pop(1)}, + {`\}`, Punctuation, Pop(1)}, + Include("base"), + }, + "block": { + {`\}`, Punctuation, Pop(2)}, + // Not can be one-liner + {`not`, Keyword, Push("not_matcher")}, + // Any other subdirective + {`[^\s#]+`, Keyword, Push("subdirective")}, + Include("base"), + }, + "nested_block": { + {`\}`, Punctuation, Pop(2)}, + // Matcher definition + {`@[^\s]+(?=\s)`, NameDecorator, Push("matcher")}, + // Something that starts with literally < is probably a docs stub + {`\<[^#]+\>`, Keyword, Push("nested_directive")}, + // Any other directive + {`[^\s#]+`, Keyword, Push("nested_directive")}, + Include("base"), + }, + "not_matcher": { + {`\}`, Punctuation, Pop(2)}, + {`\{(?=\s)`, Punctuation, Push("block")}, + {`[^\s#]+`, Keyword, Push("arguments")}, + {`\s+`, Text, nil}, + }, + "deep_not_matcher": { + {`\}`, Punctuation, Pop(2)}, + {`\{(?=\s)`, Punctuation, Push("block")}, + {`[^\s#]+`, Keyword, Push("deep_subdirective")}, + {`\s+`, Text, nil}, + }, + "directive": { + {`\{(?=\s)`, Punctuation, Push("block")}, + Include("matcher_token"), + Include("comments_pop_1"), + {`\n`, Text, Pop(1)}, + Include("base"), + }, + "nested_directive": { + {`\{(?=\s)`, Punctuation, Push("nested_block")}, + Include("matcher_token"), + Include("comments_pop_1"), + {`\n`, Text, Pop(1)}, + Include("base"), + }, + "subdirective": { + {`\{(?=\s)`, Punctuation, Push("block")}, + Include("comments_pop_1"), + {`\n`, Text, Pop(1)}, + Include("base"), + }, + "arguments": { + {`\{(?=\s)`, Punctuation, Push("block")}, + Include("comments_pop_2"), + {`\\\n`, Text, nil}, // Skip escaped newlines + {`\n`, Text, Pop(2)}, + Include("base"), + }, + "deep_subdirective": { + {`\{(?=\s)`, Punctuation, Push("block")}, + Include("comments_pop_3"), + {`\n`, Text, Pop(3)}, + Include("base"), + }, + "matcher_token": { + {`@[^\s]+`, NameDecorator, Push("arguments")}, // Named matcher + {`/[^\s]+`, NameDecorator, Push("arguments")}, // Path matcher + {`\*`, NameDecorator, Push("arguments")}, // Wildcard path matcher + {`\[\\]`, NameDecorator, Push("arguments")}, // Matcher token stub for docs + }, + "comments": { + {`^#.*\n`, CommentSingle, nil}, // Comment at start of line + {`\s+#.*\n`, CommentSingle, nil}, // Comment preceded by whitespace + }, + "comments_pop_1": { + {`^#.*\n`, CommentSingle, Pop(1)}, // Comment at start of line + {`\s+#.*\n`, CommentSingle, Pop(1)}, // Comment preceded by whitespace + }, + "comments_pop_2": { + {`^#.*\n`, CommentSingle, Pop(2)}, // Comment at start of line + {`\s+#.*\n`, CommentSingle, Pop(2)}, // Comment preceded by whitespace + }, + "comments_pop_3": { + {`^#.*\n`, CommentSingle, Pop(3)}, // Comment at start of line + {`\s+#.*\n`, CommentSingle, Pop(3)}, // Comment preceded by whitespace + }, + "base": { + Include("comments"), + {`(on|off|first|last|before|after|internal|strip_prefix|strip_suffix|replace)\b`, NameConstant, nil}, + {`(https?://)?([a-z0-9.-]+)(:)([0-9]+)`, ByGroups(Name, Name, Punctuation, LiteralNumberInteger), nil}, + {`[a-z-]+/[a-z-+]+`, LiteralString, nil}, + {`[0-9]+[km]?\b`, LiteralNumberInteger, nil}, + {`\{[\w+.\$-]+\}`, LiteralStringEscape, nil}, // Placeholder + {`\[(?=[^#{}$]+\])`, Punctuation, nil}, + {`\]|\|`, Punctuation, nil}, + {`[^\s#{}$\]]+`, LiteralString, nil}, + {`/[^\s#]*`, Name, nil}, + {`\s+`, Text, nil}, + }, + } +} + +// Caddyfile lexer. +var Caddyfile = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Caddyfile", + Aliases: []string{"caddyfile", "caddy"}, + Filenames: []string{"Caddyfile*"}, + MimeTypes: []string{}, + }, + caddyfileRules, +)) + +func caddyfileRules() Rules { + return Rules{ + "root": { + Include("comments"), + // Global options block + {`^\s*(\{)\s*$`, ByGroups(Punctuation), Push("globals")}, + // Snippets + {`(\([^\s#]+\))(\s*)(\{)`, ByGroups(NameVariableAnonymous, Text, Punctuation), Push("snippet")}, + // Site label + {`[^#{(\s,]+`, GenericHeading, Push("label")}, + // Site label with placeholder + {`\{[\w+.\$-]+\}`, LiteralStringEscape, Push("label")}, + {`\s+`, Text, nil}, + }, + "globals": { + {`\}`, Punctuation, Pop(1)}, + {`[^\s#]+`, Keyword, Push("directive")}, + Include("base"), + }, + "snippet": { + {`\}`, Punctuation, Pop(1)}, + // Matcher definition + {`@[^\s]+(?=\s)`, NameDecorator, Push("matcher")}, + // Any directive + {`[^\s#]+`, Keyword, Push("directive")}, + Include("base"), + }, + "label": { + // Allow multiple labels, comma separated, newlines after + // a comma means another label is coming + {`,\s*\n?`, Text, nil}, + {` `, Text, nil}, + // Site label with placeholder + {`\{[\w+.\$-]+\}`, LiteralStringEscape, nil}, + // Site label + {`[^#{(\s,]+`, GenericHeading, nil}, + // Comment after non-block label (hack because comments end in \n) + {`#.*\n`, CommentSingle, Push("site_block")}, + // Note: if \n, we'll never pop out of the site_block, it's valid + {`\{(?=\s)|\n`, Punctuation, Push("site_block")}, + }, + "site_block": { + {`\}`, Punctuation, Pop(2)}, + Include("site_block_common"), + }, + }.Merge(caddyfileCommonRules()) +} + +// Caddyfile directive-only lexer. +var CaddyfileDirectives = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Caddyfile Directives", + Aliases: []string{"caddyfile-directives", "caddyfile-d", "caddy-d"}, + Filenames: []string{}, + MimeTypes: []string{}, + }, + caddyfileDirectivesRules, +)) + +func caddyfileDirectivesRules() Rules { + return Rules{ + // Same as "site_block" in Caddyfile + "root": { + Include("site_block_common"), + }, + }.Merge(caddyfileCommonRules()) +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/capnproto.go b/vendor/github.com/alecthomas/chroma/lexers/c/capnproto.go new file mode 100644 index 0000000..ec0d892 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/capnproto.go @@ -0,0 +1,65 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Cap'N'Proto Proto lexer. +var CapNProto = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Cap'n Proto", + Aliases: []string{"capnp"}, + Filenames: []string{"*.capnp"}, + MimeTypes: []string{}, + }, + capNProtoRules, +)) + +func capNProtoRules() Rules { + return Rules{ + "root": { + {`#.*?$`, CommentSingle, nil}, + {`@[0-9a-zA-Z]*`, NameDecorator, nil}, + {`=`, Literal, Push("expression")}, + {`:`, NameClass, Push("type")}, + {`\$`, NameAttribute, Push("annotation")}, + {`(struct|enum|interface|union|import|using|const|annotation|extends|in|of|on|as|with|from|fixed)\b`, Keyword, nil}, + {`[\w.]+`, Name, nil}, + {`[^#@=:$\w]+`, Text, nil}, + }, + "type": { + {`[^][=;,(){}$]+`, NameClass, nil}, + {`[[(]`, NameClass, Push("parentype")}, + Default(Pop(1)), + }, + "parentype": { + {`[^][;()]+`, NameClass, nil}, + {`[[(]`, NameClass, Push()}, + {`[])]`, NameClass, Pop(1)}, + Default(Pop(1)), + }, + "expression": { + {`[^][;,(){}$]+`, Literal, nil}, + {`[[(]`, Literal, Push("parenexp")}, + Default(Pop(1)), + }, + "parenexp": { + {`[^][;()]+`, Literal, nil}, + {`[[(]`, Literal, Push()}, + {`[])]`, Literal, Pop(1)}, + Default(Pop(1)), + }, + "annotation": { + {`[^][;,(){}=:]+`, NameAttribute, nil}, + {`[[(]`, NameAttribute, Push("annexp")}, + Default(Pop(1)), + }, + "annexp": { + {`[^][;()]+`, NameAttribute, nil}, + {`[[(]`, NameAttribute, Push()}, + {`[])]`, NameAttribute, Pop(1)}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/ceylon.go b/vendor/github.com/alecthomas/chroma/lexers/c/ceylon.go new file mode 100644 index 0000000..9d424d4 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/ceylon.go @@ -0,0 +1,67 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Ceylon lexer. +var Ceylon = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Ceylon", + Aliases: []string{"ceylon"}, + Filenames: []string{"*.ceylon"}, + MimeTypes: []string{"text/x-ceylon"}, + DotAll: true, + }, + ceylonRules, +)) + +func ceylonRules() Rules { + return Rules{ + "root": { + {`^(\s*(?:[a-zA-Z_][\w.\[\]]*\s+)+?)([a-zA-Z_]\w*)(\s*)(\()`, ByGroups(UsingSelf("root"), NameFunction, Text, Operator), nil}, + {`[^\S\n]+`, Text, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*`, CommentMultiline, Push("comment")}, + {`(shared|abstract|formal|default|actual|variable|deprecated|small|late|literal|doc|by|see|throws|optional|license|tagged|final|native|annotation|sealed)\b`, NameDecorator, nil}, + {`(break|case|catch|continue|else|finally|for|in|if|return|switch|this|throw|try|while|is|exists|dynamic|nonempty|then|outer|assert|let)\b`, Keyword, nil}, + {`(abstracts|extends|satisfies|super|given|of|out|assign)\b`, KeywordDeclaration, nil}, + {`(function|value|void|new)\b`, KeywordType, nil}, + {`(assembly|module|package)(\s+)`, ByGroups(KeywordNamespace, Text), nil}, + {`(true|false|null)\b`, KeywordConstant, nil}, + {`(class|interface|object|alias)(\s+)`, ByGroups(KeywordDeclaration, Text), Push("class")}, + {`(import)(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`'\\.'|'[^\\]'|'\\\{#[0-9a-fA-F]{4}\}'`, LiteralStringChar, nil}, + {"\".*``.*``.*\"", LiteralStringInterpol, nil}, + {`(\.)([a-z_]\w*)`, ByGroups(Operator, NameAttribute), nil}, + {`[a-zA-Z_]\w*:`, NameLabel, nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + {`[~^*!%&\[\](){}<>|+=:;,./?-]`, Operator, nil}, + {`\d{1,3}(_\d{3})+\.\d{1,3}(_\d{3})+[kMGTPmunpf]?`, LiteralNumberFloat, nil}, + {`\d{1,3}(_\d{3})+\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?`, LiteralNumberFloat, nil}, + {`[0-9][0-9]*\.\d{1,3}(_\d{3})+[kMGTPmunpf]?`, LiteralNumberFloat, nil}, + {`[0-9][0-9]*\.[0-9]+([eE][+-]?[0-9]+)?[kMGTPmunpf]?`, LiteralNumberFloat, nil}, + {`#([0-9a-fA-F]{4})(_[0-9a-fA-F]{4})+`, LiteralNumberHex, nil}, + {`#[0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`\$([01]{4})(_[01]{4})+`, LiteralNumberBin, nil}, + {`\$[01]+`, LiteralNumberBin, nil}, + {`\d{1,3}(_\d{3})+[kMGTP]?`, LiteralNumberInteger, nil}, + {`[0-9]+[kMGTP]?`, LiteralNumberInteger, nil}, + {`\n`, Text, nil}, + }, + "class": { + {`[A-Za-z_]\w*`, NameClass, Pop(1)}, + }, + "import": { + {`[a-z][\w.]*`, NameNamespace, Pop(1)}, + }, + "comment": { + {`[^*/]`, CommentMultiline, nil}, + {`/\*`, CommentMultiline, Push()}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[*/]`, CommentMultiline, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/cfengine3.go b/vendor/github.com/alecthomas/chroma/lexers/c/cfengine3.go new file mode 100644 index 0000000..f305034 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/cfengine3.go @@ -0,0 +1,60 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Cfengine3 lexer. +var Cfengine3 = internal.Register(MustNewLazyLexer( + &Config{ + Name: "CFEngine3", + Aliases: []string{"cfengine3", "cf3"}, + Filenames: []string{"*.cf"}, + MimeTypes: []string{}, + }, + cfengine3Rules, +)) + +func cfengine3Rules() Rules { + return Rules{ + "root": { + {`#.*?\n`, Comment, nil}, + {`(body)(\s+)(\S+)(\s+)(control)`, ByGroups(Keyword, Text, Keyword, Text, Keyword), nil}, + {`(body|bundle)(\s+)(\S+)(\s+)(\w+)(\()`, ByGroups(Keyword, Text, Keyword, Text, NameFunction, Punctuation), Push("arglist")}, + {`(body|bundle)(\s+)(\S+)(\s+)(\w+)`, ByGroups(Keyword, Text, Keyword, Text, NameFunction), nil}, + {`(")([^"]+)(")(\s+)(string|slist|int|real)(\s*)(=>)(\s*)`, ByGroups(Punctuation, NameVariable, Punctuation, Text, KeywordType, Text, Operator, Text), nil}, + {`(\S+)(\s*)(=>)(\s*)`, ByGroups(KeywordReserved, Text, Operator, Text), nil}, + {`"`, LiteralString, Push("string")}, + {`(\w+)(\()`, ByGroups(NameFunction, Punctuation), nil}, + {`([\w.!&|()]+)(::)`, ByGroups(NameClass, Punctuation), nil}, + {`(\w+)(:)`, ByGroups(KeywordDeclaration, Punctuation), nil}, + {`@[{(][^)}]+[})]`, NameVariable, nil}, + {`[(){},;]`, Punctuation, nil}, + {`=>`, Operator, nil}, + {`->`, Operator, nil}, + {`\d+\.\d+`, LiteralNumberFloat, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`\w+`, NameFunction, nil}, + {`\s+`, Text, nil}, + }, + "string": { + {`\$[{(]`, LiteralStringInterpol, Push("interpol")}, + {`\\.`, LiteralStringEscape, nil}, + {`"`, LiteralString, Pop(1)}, + {`\n`, LiteralString, nil}, + {`.`, LiteralString, nil}, + }, + "interpol": { + {`\$[{(]`, LiteralStringInterpol, Push()}, + {`[})]`, LiteralStringInterpol, Pop(1)}, + {`[^${()}]+`, LiteralStringInterpol, nil}, + }, + "arglist": { + {`\)`, Punctuation, Pop(1)}, + {`,`, Punctuation, nil}, + {`\w+`, NameVariable, nil}, + {`\s+`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/chaiscript.go b/vendor/github.com/alecthomas/chroma/lexers/c/chaiscript.go new file mode 100644 index 0000000..58db9aa --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/chaiscript.go @@ -0,0 +1,67 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Chaiscript lexer. +var Chaiscript = internal.Register(MustNewLazyLexer( + &Config{ + Name: "ChaiScript", + Aliases: []string{"chai", "chaiscript"}, + Filenames: []string{"*.chai"}, + MimeTypes: []string{"text/x-chaiscript", "application/x-chaiscript"}, + DotAll: true, + }, + chaiscriptRules, +)) + +func chaiscriptRules() Rules { + return Rules{ + "commentsandwhitespace": { + {`\s+`, Text, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`^\#.*?\n`, CommentSingle, nil}, + }, + "slashstartsregex": { + Include("commentsandwhitespace"), + {`/(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)`, LiteralStringRegex, Pop(1)}, + {`(?=/)`, Text, Push("#pop", "badregex")}, + Default(Pop(1)), + }, + "badregex": { + {`\n`, Text, Pop(1)}, + }, + "root": { + Include("commentsandwhitespace"), + {`\n`, Text, nil}, + {`[^\S\n]+`, Text, nil}, + {`\+\+|--|~|&&|\?|:|\|\||\\(?=\n)|\.\.(<<|>>>?|==?|!=?|[-<>+*%&|^/])=?`, Operator, Push("slashstartsregex")}, + {`[{(\[;,]`, Punctuation, Push("slashstartsregex")}, + {`[})\].]`, Punctuation, nil}, + {`[=+\-*/]`, Operator, nil}, + {`(for|in|while|do|break|return|continue|if|else|throw|try|catch)\b`, Keyword, Push("slashstartsregex")}, + {`(var)\b`, KeywordDeclaration, Push("slashstartsregex")}, + {`(attr|def|fun)\b`, KeywordReserved, nil}, + {`(true|false)\b`, KeywordConstant, nil}, + {`(eval|throw)\b`, NameBuiltin, nil}, + {"`\\S+`", NameBuiltin, nil}, + {`[$a-zA-Z_]\w*`, NameOther, nil}, + {`[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?`, LiteralNumberFloat, nil}, + {`0x[0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`"`, LiteralStringDouble, Push("dqstring")}, + {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + }, + "dqstring": { + {`\$\{[^"}]+?\}`, LiteralStringInterpol, nil}, + {`\$`, LiteralStringDouble, nil}, + {`\\\\`, LiteralStringDouble, nil}, + {`\\"`, LiteralStringDouble, nil}, + {`[^\\"$]+`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/cheetah.go b/vendor/github.com/alecthomas/chroma/lexers/c/cheetah.go new file mode 100644 index 0000000..bd5fb9d --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/cheetah.go @@ -0,0 +1,41 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" + . "github.com/alecthomas/chroma/lexers/p" // nolint +) + +// Cheetah lexer. +var Cheetah = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Cheetah", + Aliases: []string{"cheetah", "spitfire"}, + Filenames: []string{"*.tmpl", "*.spt"}, + MimeTypes: []string{"application/x-cheetah", "application/x-spitfire"}, + }, + cheetahRules, +)) + +func cheetahRules() Rules { + return Rules{ + "root": { + {`(##[^\n]*)$`, ByGroups(Comment), nil}, + {`#[*](.|\n)*?[*]#`, Comment, nil}, + {`#end[^#\n]*(?:#|$)`, CommentPreproc, nil}, + {`#slurp$`, CommentPreproc, nil}, + {`(#[a-zA-Z]+)([^#\n]*)(#|$)`, ByGroups(CommentPreproc, Using(Python), CommentPreproc), nil}, + {`(\$)([a-zA-Z_][\w.]*\w)`, ByGroups(CommentPreproc, Using(Python)), nil}, + {`(\$\{!?)(.*?)(\})(?s)`, ByGroups(CommentPreproc, Using(Python), CommentPreproc), nil}, + {`(?sx) + (.+?) # anything, followed by: + (?: + (?=\#[#a-zA-Z]*) | # an eval comment + (?=\$[a-zA-Z_{]) | # a substitution + \Z # end of string + ) + `, Other, nil}, + {`\s+`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/cl.go b/vendor/github.com/alecthomas/chroma/lexers/c/cl.go new file mode 100644 index 0000000..bb16273 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/cl.go @@ -0,0 +1,310 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +var ( + clBuiltinFunctions = []string{ + "<", "<=", "=", ">", ">=", "-", "/", "/=", "*", "+", "1-", "1+", + "abort", "abs", "acons", "acos", "acosh", "add-method", "adjoin", + "adjustable-array-p", "adjust-array", "allocate-instance", + "alpha-char-p", "alphanumericp", "append", "apply", "apropos", + "apropos-list", "aref", "arithmetic-error-operands", + "arithmetic-error-operation", "array-dimension", "array-dimensions", + "array-displacement", "array-element-type", "array-has-fill-pointer-p", + "array-in-bounds-p", "arrayp", "array-rank", "array-row-major-index", + "array-total-size", "ash", "asin", "asinh", "assoc", "assoc-if", + "assoc-if-not", "atan", "atanh", "atom", "bit", "bit-and", "bit-andc1", + "bit-andc2", "bit-eqv", "bit-ior", "bit-nand", "bit-nor", "bit-not", + "bit-orc1", "bit-orc2", "bit-vector-p", "bit-xor", "boole", + "both-case-p", "boundp", "break", "broadcast-stream-streams", + "butlast", "byte", "byte-position", "byte-size", "caaaar", "caaadr", + "caaar", "caadar", "caaddr", "caadr", "caar", "cadaar", "cadadr", + "cadar", "caddar", "cadddr", "caddr", "cadr", "call-next-method", "car", + "cdaaar", "cdaadr", "cdaar", "cdadar", "cdaddr", "cdadr", "cdar", + "cddaar", "cddadr", "cddar", "cdddar", "cddddr", "cdddr", "cddr", "cdr", + "ceiling", "cell-error-name", "cerror", "change-class", "char", "char<", + "char<=", "char=", "char>", "char>=", "char/=", "character", + "characterp", "char-code", "char-downcase", "char-equal", + "char-greaterp", "char-int", "char-lessp", "char-name", + "char-not-equal", "char-not-greaterp", "char-not-lessp", "char-upcase", + "cis", "class-name", "class-of", "clear-input", "clear-output", + "close", "clrhash", "code-char", "coerce", "compile", + "compiled-function-p", "compile-file", "compile-file-pathname", + "compiler-macro-function", "complement", "complex", "complexp", + "compute-applicable-methods", "compute-restarts", "concatenate", + "concatenated-stream-streams", "conjugate", "cons", "consp", + "constantly", "constantp", "continue", "copy-alist", "copy-list", + "copy-pprint-dispatch", "copy-readtable", "copy-seq", "copy-structure", + "copy-symbol", "copy-tree", "cos", "cosh", "count", "count-if", + "count-if-not", "decode-float", "decode-universal-time", "delete", + "delete-duplicates", "delete-file", "delete-if", "delete-if-not", + "delete-package", "denominator", "deposit-field", "describe", + "describe-object", "digit-char", "digit-char-p", "directory", + "directory-namestring", "disassemble", "documentation", "dpb", + "dribble", "echo-stream-input-stream", "echo-stream-output-stream", + "ed", "eighth", "elt", "encode-universal-time", "endp", + "enough-namestring", "ensure-directories-exist", + "ensure-generic-function", "eq", "eql", "equal", "equalp", "error", + "eval", "evenp", "every", "exp", "export", "expt", "fboundp", + "fceiling", "fdefinition", "ffloor", "fifth", "file-author", + "file-error-pathname", "file-length", "file-namestring", + "file-position", "file-string-length", "file-write-date", + "fill", "fill-pointer", "find", "find-all-symbols", "find-class", + "find-if", "find-if-not", "find-method", "find-package", "find-restart", + "find-symbol", "finish-output", "first", "float", "float-digits", + "floatp", "float-precision", "float-radix", "float-sign", "floor", + "fmakunbound", "force-output", "format", "fourth", "fresh-line", + "fround", "ftruncate", "funcall", "function-keywords", + "function-lambda-expression", "functionp", "gcd", "gensym", "gentemp", + "get", "get-decoded-time", "get-dispatch-macro-character", "getf", + "gethash", "get-internal-real-time", "get-internal-run-time", + "get-macro-character", "get-output-stream-string", "get-properties", + "get-setf-expansion", "get-universal-time", "graphic-char-p", + "hash-table-count", "hash-table-p", "hash-table-rehash-size", + "hash-table-rehash-threshold", "hash-table-size", "hash-table-test", + "host-namestring", "identity", "imagpart", "import", + "initialize-instance", "input-stream-p", "inspect", + "integer-decode-float", "integer-length", "integerp", + "interactive-stream-p", "intern", "intersection", + "invalid-method-error", "invoke-debugger", "invoke-restart", + "invoke-restart-interactively", "isqrt", "keywordp", "last", "lcm", + "ldb", "ldb-test", "ldiff", "length", "lisp-implementation-type", + "lisp-implementation-version", "list", "list*", "list-all-packages", + "listen", "list-length", "listp", "load", + "load-logical-pathname-translations", "log", "logand", "logandc1", + "logandc2", "logbitp", "logcount", "logeqv", "logical-pathname", + "logical-pathname-translations", "logior", "lognand", "lognor", + "lognot", "logorc1", "logorc2", "logtest", "logxor", "long-site-name", + "lower-case-p", "machine-instance", "machine-type", "machine-version", + "macroexpand", "macroexpand-1", "macro-function", "make-array", + "make-broadcast-stream", "make-concatenated-stream", "make-condition", + "make-dispatch-macro-character", "make-echo-stream", "make-hash-table", + "make-instance", "make-instances-obsolete", "make-list", + "make-load-form", "make-load-form-saving-slots", "make-package", + "make-pathname", "make-random-state", "make-sequence", "make-string", + "make-string-input-stream", "make-string-output-stream", "make-symbol", + "make-synonym-stream", "make-two-way-stream", "makunbound", "map", + "mapc", "mapcan", "mapcar", "mapcon", "maphash", "map-into", "mapl", + "maplist", "mask-field", "max", "member", "member-if", "member-if-not", + "merge", "merge-pathnames", "method-combination-error", + "method-qualifiers", "min", "minusp", "mismatch", "mod", + "muffle-warning", "name-char", "namestring", "nbutlast", "nconc", + "next-method-p", "nintersection", "ninth", "no-applicable-method", + "no-next-method", "not", "notany", "notevery", "nreconc", "nreverse", + "nset-difference", "nset-exclusive-or", "nstring-capitalize", + "nstring-downcase", "nstring-upcase", "nsublis", "nsubst", "nsubst-if", + "nsubst-if-not", "nsubstitute", "nsubstitute-if", "nsubstitute-if-not", + "nth", "nthcdr", "null", "numberp", "numerator", "nunion", "oddp", + "open", "open-stream-p", "output-stream-p", "package-error-package", + "package-name", "package-nicknames", "packagep", + "package-shadowing-symbols", "package-used-by-list", "package-use-list", + "pairlis", "parse-integer", "parse-namestring", "pathname", + "pathname-device", "pathname-directory", "pathname-host", + "pathname-match-p", "pathname-name", "pathnamep", "pathname-type", + "pathname-version", "peek-char", "phase", "plusp", "position", + "position-if", "position-if-not", "pprint", "pprint-dispatch", + "pprint-fill", "pprint-indent", "pprint-linear", "pprint-newline", + "pprint-tab", "pprint-tabular", "prin1", "prin1-to-string", "princ", + "princ-to-string", "print", "print-object", "probe-file", "proclaim", + "provide", "random", "random-state-p", "rassoc", "rassoc-if", + "rassoc-if-not", "rational", "rationalize", "rationalp", "read", + "read-byte", "read-char", "read-char-no-hang", "read-delimited-list", + "read-from-string", "read-line", "read-preserving-whitespace", + "read-sequence", "readtable-case", "readtablep", "realp", "realpart", + "reduce", "reinitialize-instance", "rem", "remhash", "remove", + "remove-duplicates", "remove-if", "remove-if-not", "remove-method", + "remprop", "rename-file", "rename-package", "replace", "require", + "rest", "restart-name", "revappend", "reverse", "room", "round", + "row-major-aref", "rplaca", "rplacd", "sbit", "scale-float", "schar", + "search", "second", "set", "set-difference", + "set-dispatch-macro-character", "set-exclusive-or", + "set-macro-character", "set-pprint-dispatch", "set-syntax-from-char", + "seventh", "shadow", "shadowing-import", "shared-initialize", + "short-site-name", "signal", "signum", "simple-bit-vector-p", + "simple-condition-format-arguments", "simple-condition-format-control", + "simple-string-p", "simple-vector-p", "sin", "sinh", "sixth", "sleep", + "slot-boundp", "slot-exists-p", "slot-makunbound", "slot-missing", + "slot-unbound", "slot-value", "software-type", "software-version", + "some", "sort", "special-operator-p", "sqrt", "stable-sort", + "standard-char-p", "store-value", "stream-element-type", + "stream-error-stream", "stream-external-format", "streamp", "string", + "string<", "string<=", "string=", "string>", "string>=", "string/=", + "string-capitalize", "string-downcase", "string-equal", + "string-greaterp", "string-left-trim", "string-lessp", + "string-not-equal", "string-not-greaterp", "string-not-lessp", + "stringp", "string-right-trim", "string-trim", "string-upcase", + "sublis", "subseq", "subsetp", "subst", "subst-if", "subst-if-not", + "substitute", "substitute-if", "substitute-if-not", "subtypep", "svref", + "sxhash", "symbol-function", "symbol-name", "symbolp", "symbol-package", + "symbol-plist", "symbol-value", "synonym-stream-symbol", "syntax:", + "tailp", "tan", "tanh", "tenth", "terpri", "third", + "translate-logical-pathname", "translate-pathname", "tree-equal", + "truename", "truncate", "two-way-stream-input-stream", + "two-way-stream-output-stream", "type-error-datum", + "type-error-expected-type", "type-of", "typep", "unbound-slot-instance", + "unexport", "unintern", "union", "unread-char", "unuse-package", + "update-instance-for-different-class", + "update-instance-for-redefined-class", "upgraded-array-element-type", + "upgraded-complex-part-type", "upper-case-p", "use-package", + "user-homedir-pathname", "use-value", "values", "values-list", "vector", + "vectorp", "vector-pop", "vector-push", "vector-push-extend", "warn", + "wild-pathname-p", "write", "write-byte", "write-char", "write-line", + "write-sequence", "write-string", "write-to-string", "yes-or-no-p", + "y-or-n-p", "zerop", + } + + clSpecialForms = []string{ + "block", "catch", "declare", "eval-when", "flet", "function", "go", "if", + "labels", "lambda", "let", "let*", "load-time-value", "locally", "macrolet", + "multiple-value-call", "multiple-value-prog1", "progn", "progv", "quote", + "return-from", "setq", "symbol-macrolet", "tagbody", "the", "throw", + "unwind-protect", + } + + clMacros = []string{ + "and", "assert", "call-method", "case", "ccase", "check-type", "cond", + "ctypecase", "decf", "declaim", "defclass", "defconstant", "defgeneric", + "define-compiler-macro", "define-condition", "define-method-combination", + "define-modify-macro", "define-setf-expander", "define-symbol-macro", + "defmacro", "defmethod", "defpackage", "defparameter", "defsetf", + "defstruct", "deftype", "defun", "defvar", "destructuring-bind", "do", + "do*", "do-all-symbols", "do-external-symbols", "dolist", "do-symbols", + "dotimes", "ecase", "etypecase", "formatter", "handler-bind", + "handler-case", "ignore-errors", "incf", "in-package", "lambda", "loop", + "loop-finish", "make-method", "multiple-value-bind", "multiple-value-list", + "multiple-value-setq", "nth-value", "or", "pop", + "pprint-exit-if-list-exhausted", "pprint-logical-block", "pprint-pop", + "print-unreadable-object", "prog", "prog*", "prog1", "prog2", "psetf", + "psetq", "push", "pushnew", "remf", "restart-bind", "restart-case", + "return", "rotatef", "setf", "shiftf", "step", "time", "trace", "typecase", + "unless", "untrace", "when", "with-accessors", "with-compilation-unit", + "with-condition-restarts", "with-hash-table-iterator", + "with-input-from-string", "with-open-file", "with-open-stream", + "with-output-to-string", "with-package-iterator", "with-simple-restart", + "with-slots", "with-standard-io-syntax", + } + + clLambdaListKeywords = []string{ + "&allow-other-keys", "&aux", "&body", "&environment", "&key", "&optional", + "&rest", "&whole", + } + + clDeclarations = []string{ + "dynamic-extent", "ignore", "optimize", "ftype", "inline", "special", + "ignorable", "notinline", "type", + } + + clBuiltinTypes = []string{ + "atom", "boolean", "base-char", "base-string", "bignum", "bit", + "compiled-function", "extended-char", "fixnum", "keyword", "nil", + "signed-byte", "short-float", "single-float", "double-float", "long-float", + "simple-array", "simple-base-string", "simple-bit-vector", "simple-string", + "simple-vector", "standard-char", "unsigned-byte", + + // Condition Types + "arithmetic-error", "cell-error", "condition", "control-error", + "division-by-zero", "end-of-file", "error", "file-error", + "floating-point-inexact", "floating-point-overflow", + "floating-point-underflow", "floating-point-invalid-operation", + "parse-error", "package-error", "print-not-readable", "program-error", + "reader-error", "serious-condition", "simple-condition", "simple-error", + "simple-type-error", "simple-warning", "stream-error", "storage-condition", + "style-warning", "type-error", "unbound-variable", "unbound-slot", + "undefined-function", "warning", + } + + clBuiltinClasses = []string{ + "array", "broadcast-stream", "bit-vector", "built-in-class", "character", + "class", "complex", "concatenated-stream", "cons", "echo-stream", + "file-stream", "float", "function", "generic-function", "hash-table", + "integer", "list", "logical-pathname", "method-combination", "method", + "null", "number", "package", "pathname", "ratio", "rational", "readtable", + "real", "random-state", "restart", "sequence", "standard-class", + "standard-generic-function", "standard-method", "standard-object", + "string-stream", "stream", "string", "structure-class", "structure-object", + "symbol", "synonym-stream", "t", "two-way-stream", "vector", + } +) + +// Common Lisp lexer. +var CommonLisp = internal.Register(TypeRemappingLexer(MustNewLazyLexer( + &Config{ + Name: "Common Lisp", + Aliases: []string{"common-lisp", "cl", "lisp"}, + Filenames: []string{"*.cl", "*.lisp"}, + MimeTypes: []string{"text/x-common-lisp"}, + CaseInsensitive: true, + }, + commonLispRules, +), TypeMapping{ + {NameVariable, NameFunction, clBuiltinFunctions}, + {NameVariable, Keyword, clSpecialForms}, + {NameVariable, NameBuiltin, clMacros}, + {NameVariable, Keyword, clLambdaListKeywords}, + {NameVariable, Keyword, clDeclarations}, + {NameVariable, KeywordType, clBuiltinTypes}, + {NameVariable, NameClass, clBuiltinClasses}, +})) + +func commonLispRules() Rules { + return Rules{ + "root": { + Default(Push("body")), + }, + "multiline-comment": { + {`#\|`, CommentMultiline, Push()}, + {`\|#`, CommentMultiline, Pop(1)}, + {`[^|#]+`, CommentMultiline, nil}, + {`[|#]`, CommentMultiline, nil}, + }, + "commented-form": { + {`\(`, CommentPreproc, Push()}, + {`\)`, CommentPreproc, Pop(1)}, + {`[^()]+`, CommentPreproc, nil}, + }, + "body": { + {`\s+`, Text, nil}, + {`;.*$`, CommentSingle, nil}, + {`#\|`, CommentMultiline, Push("multiline-comment")}, + {`#\d*Y.*$`, CommentSpecial, nil}, + {`"(\\.|\\\n|[^"\\])*"`, LiteralString, nil}, + {`:(\|[^|]+\||(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~])(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~]|[#.:])*)`, LiteralStringSymbol, nil}, + {`::(\|[^|]+\||(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~])(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~]|[#.:])*)`, LiteralStringSymbol, nil}, + {`:#(\|[^|]+\||(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~])(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~]|[#.:])*)`, LiteralStringSymbol, nil}, + {`'(\|[^|]+\||(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~])(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~]|[#.:])*)`, LiteralStringSymbol, nil}, + {`'`, Operator, nil}, + {"`", Operator, nil}, + {"[-+]?\\d+\\.?(?=[ \"()\\'\\n,;`])", LiteralNumberInteger, nil}, + {"[-+]?\\d+/\\d+(?=[ \"()\\'\\n,;`])", LiteralNumber, nil}, + {"[-+]?(\\d*\\.\\d+([defls][-+]?\\d+)?|\\d+(\\.\\d*)?[defls][-+]?\\d+)(?=[ \"()\\'\\n,;`])", LiteralNumberFloat, nil}, + {"#\\\\.(?=[ \"()\\'\\n,;`])", LiteralStringChar, nil}, + {`#\\(\|[^|]+\||(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~])(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~]|[#.:])*)`, LiteralStringChar, nil}, + {`#\(`, Operator, Push("body")}, + {`#\d*\*[01]*`, LiteralOther, nil}, + {`#:(\|[^|]+\||(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~])(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~]|[#.:])*)`, LiteralStringSymbol, nil}, + {`#[.,]`, Operator, nil}, + {`#\'`, NameFunction, nil}, + {`#b[+-]?[01]+(/[01]+)?`, LiteralNumberBin, nil}, + {`#o[+-]?[0-7]+(/[0-7]+)?`, LiteralNumberOct, nil}, + {`#x[+-]?[0-9a-f]+(/[0-9a-f]+)?`, LiteralNumberHex, nil}, + {`#\d+r[+-]?[0-9a-z]+(/[0-9a-z]+)?`, LiteralNumber, nil}, + {`(#c)(\()`, ByGroups(LiteralNumber, Punctuation), Push("body")}, + {`(#\d+a)(\()`, ByGroups(LiteralOther, Punctuation), Push("body")}, + {`(#s)(\()`, ByGroups(LiteralOther, Punctuation), Push("body")}, + {`#p?"(\\.|[^"])*"`, LiteralOther, nil}, + {`#\d+=`, Operator, nil}, + {`#\d+#`, Operator, nil}, + {"#+nil(?=[ \"()\\'\\n,;`])\\s*\\(", CommentPreproc, Push("commented-form")}, + {`#[+-]`, Operator, nil}, + {`(,@|,|\.)`, Operator, nil}, + {"(t|nil)(?=[ \"()\\'\\n,;`])", NameConstant, nil}, + {`\*(\|[^|]+\||(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~])(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~]|[#.:])*)\*`, NameVariableGlobal, nil}, + {`(\|[^|]+\||(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~])(?:\\.|[\w!$%&*+-/<=>?@\[\]^{}~]|[#.:])*)`, NameVariable, nil}, + {`\(`, Punctuation, Push("body")}, + {`\)`, Punctuation, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/clojure.go b/vendor/github.com/alecthomas/chroma/lexers/c/clojure.go new file mode 100644 index 0000000..f99f906 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/clojure.go @@ -0,0 +1,42 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Clojure lexer. +var Clojure = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Clojure", + Aliases: []string{"clojure", "clj"}, + Filenames: []string{"*.clj"}, + MimeTypes: []string{"text/x-clojure", "application/x-clojure"}, + }, + clojureRules, +)) + +func clojureRules() Rules { + return Rules{ + "root": { + {`;.*$`, CommentSingle, nil}, + {`[,\s]+`, Text, nil}, + {`-?\d+\.\d+`, LiteralNumberFloat, nil}, + {`-?\d+`, LiteralNumberInteger, nil}, + {`0x-?[abcdef\d]+`, LiteralNumberHex, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`'(?!#)[\w!$%*+<=>?/.#-]+`, LiteralStringSymbol, nil}, + {`\\(.|[a-z]+)`, LiteralStringChar, nil}, + {`::?#?(?!#)[\w!$%*+<=>?/.#-]+`, LiteralStringSymbol, nil}, + {"~@|[`\\'#^~&@]", Operator, nil}, + {Words(``, ` `, `.`, `def`, `do`, `fn`, `if`, `let`, `new`, `quote`, `var`, `loop`), Keyword, nil}, + {Words(``, ` `, `def-`, `defn`, `defn-`, `defmacro`, `defmulti`, `defmethod`, `defstruct`, `defonce`, `declare`, `definline`, `definterface`, `defprotocol`, `defrecord`, `deftype`, `defproject`, `ns`), KeywordDeclaration, nil}, + {Words(``, ` `, `*`, `+`, `-`, `->`, `/`, `<`, `<=`, `=`, `==`, `>`, `>=`, `..`, `accessor`, `agent`, `agent-errors`, `aget`, `alength`, `all-ns`, `alter`, `and`, `append-child`, `apply`, `array-map`, `aset`, `aset-boolean`, `aset-byte`, `aset-char`, `aset-double`, `aset-float`, `aset-int`, `aset-long`, `aset-short`, `assert`, `assoc`, `await`, `await-for`, `bean`, `binding`, `bit-and`, `bit-not`, `bit-or`, `bit-shift-left`, `bit-shift-right`, `bit-xor`, `boolean`, `branch?`, `butlast`, `byte`, `cast`, `char`, `children`, `class`, `clear-agent-errors`, `comment`, `commute`, `comp`, `comparator`, `complement`, `concat`, `conj`, `cons`, `constantly`, `cond`, `if-not`, `construct-proxy`, `contains?`, `count`, `create-ns`, `create-struct`, `cycle`, `dec`, `deref`, `difference`, `disj`, `dissoc`, `distinct`, `doall`, `doc`, `dorun`, `doseq`, `dosync`, `dotimes`, `doto`, `double`, `down`, `drop`, `drop-while`, `edit`, `end?`, `ensure`, `eval`, `every?`, `false?`, `ffirst`, `file-seq`, `filter`, `find`, `find-doc`, `find-ns`, `find-var`, `first`, `float`, `flush`, `for`, `fnseq`, `frest`, `gensym`, `get-proxy-class`, `get`, `hash-map`, `hash-set`, `identical?`, `identity`, `if-let`, `import`, `in-ns`, `inc`, `index`, `insert-child`, `insert-left`, `insert-right`, `inspect-table`, `inspect-tree`, `instance?`, `int`, `interleave`, `intersection`, `into`, `into-array`, `iterate`, `join`, `key`, `keys`, `keyword`, `keyword?`, `last`, `lazy-cat`, `lazy-cons`, `left`, `lefts`, `line-seq`, `list*`, `list`, `load`, `load-file`, `locking`, `long`, `loop`, `macroexpand`, `macroexpand-1`, `make-array`, `make-node`, `map`, `map-invert`, `map?`, `mapcat`, `max`, `max-key`, `memfn`, `merge`, `merge-with`, `meta`, `min`, `min-key`, `name`, `namespace`, `neg?`, `new`, `newline`, `next`, `nil?`, `node`, `not`, `not-any?`, `not-every?`, `not=`, `ns-imports`, `ns-interns`, `ns-map`, `ns-name`, `ns-publics`, `ns-refers`, `ns-resolve`, `ns-unmap`, `nth`, `nthrest`, `or`, `parse`, `partial`, `path`, `peek`, `pop`, `pos?`, `pr`, `pr-str`, `print`, `print-str`, `println`, `println-str`, `prn`, `prn-str`, `project`, `proxy`, `proxy-mappings`, `quot`, `rand`, `rand-int`, `range`, `re-find`, `re-groups`, `re-matcher`, `re-matches`, `re-pattern`, `re-seq`, `read`, `read-line`, `reduce`, `ref`, `ref-set`, `refer`, `rem`, `remove`, `remove-method`, `remove-ns`, `rename`, `rename-keys`, `repeat`, `replace`, `replicate`, `resolve`, `rest`, `resultset-seq`, `reverse`, `rfirst`, `right`, `rights`, `root`, `rrest`, `rseq`, `second`, `select`, `select-keys`, `send`, `send-off`, `seq`, `seq-zip`, `seq?`, `set`, `short`, `slurp`, `some`, `sort`, `sort-by`, `sorted-map`, `sorted-map-by`, `sorted-set`, `special-symbol?`, `split-at`, `split-with`, `str`, `string?`, `struct`, `struct-map`, `subs`, `subvec`, `symbol`, `symbol?`, `sync`, `take`, `take-nth`, `take-while`, `test`, `time`, `to-array`, `to-array-2d`, `tree-seq`, `true?`, `union`, `up`, `update-proxy`, `val`, `vals`, `var-get`, `var-set`, `var?`, `vector`, `vector-zip`, `vector?`, `when`, `when-first`, `when-let`, `when-not`, `with-local-vars`, `with-meta`, `with-open`, `with-out-str`, `xml-seq`, `xml-zip`, `zero?`, `zipmap`, `zipper`), NameBuiltin, nil}, + {`(?<=\()(?!#)[\w!$%*+<=>?/.#-]+`, NameFunction, nil}, + {`(?!#)[\w!$%*+<=>?/.#-]+`, NameVariable, nil}, + {`(\[|\])`, Punctuation, nil}, + {`(\{|\})`, Punctuation, nil}, + {`(\(|\))`, Punctuation, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/cmake.go b/vendor/github.com/alecthomas/chroma/lexers/c/cmake.go new file mode 100644 index 0000000..0e0708d --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/cmake.go @@ -0,0 +1,48 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Cmake lexer. +var Cmake = internal.Register(MustNewLazyLexer( + &Config{ + Name: "CMake", + Aliases: []string{"cmake"}, + Filenames: []string{"*.cmake", "CMakeLists.txt"}, + MimeTypes: []string{"text/x-cmake"}, + }, + cmakeRules, +)) + +func cmakeRules() Rules { + return Rules{ + "root": { + {`\b(\w+)([ \t]*)(\()`, ByGroups(NameBuiltin, Text, Punctuation), Push("args")}, + Include("keywords"), + Include("ws"), + }, + "args": { + {`\(`, Punctuation, Push()}, + {`\)`, Punctuation, Pop(1)}, + {`(\$\{)(.+?)(\})`, ByGroups(Operator, NameVariable, Operator), nil}, + {`(\$ENV\{)(.+?)(\})`, ByGroups(Operator, NameVariable, Operator), nil}, + {`(\$<)(.+?)(>)`, ByGroups(Operator, NameVariable, Operator), nil}, + {`(?s)".*?"`, LiteralStringDouble, nil}, + {`\\\S+`, LiteralString, nil}, + {`[^)$"# \t\n]+`, LiteralString, nil}, + {`\n`, Text, nil}, + Include("keywords"), + Include("ws"), + }, + "string": {}, + "keywords": { + {`\b(WIN32|UNIX|APPLE|CYGWIN|BORLAND|MINGW|MSVC|MSVC_IDE|MSVC60|MSVC70|MSVC71|MSVC80|MSVC90)\b`, Keyword, nil}, + }, + "ws": { + {`[ \t]+`, Text, nil}, + {`#.*\n`, Comment, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/cobol.go b/vendor/github.com/alecthomas/chroma/lexers/c/cobol.go new file mode 100644 index 0000000..8b2f6d9 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/cobol.go @@ -0,0 +1,55 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Cobol lexer. +var Cobol = internal.Register(MustNewLazyLexer( + &Config{ + Name: "COBOL", + Aliases: []string{"cobol"}, + Filenames: []string{"*.cob", "*.COB", "*.cpy", "*.CPY"}, + MimeTypes: []string{"text/x-cobol"}, + CaseInsensitive: true, + }, + cobolRules, +)) + +func cobolRules() Rules { + return Rules{ + "root": { + Include("comment"), + Include("strings"), + Include("core"), + Include("nums"), + {`[a-z0-9]([\w\-]*[a-z0-9]+)?`, NameVariable, nil}, + {`[ \t]+`, Text, nil}, + }, + "comment": { + {`(^.{6}[*/].*\n|^.{6}|\*>.*\n)`, Comment, nil}, + }, + "core": { + {`(^|(?<=[^\w\-]))(ALL\s+)?((ZEROES)|(HIGH-VALUE|LOW-VALUE|QUOTE|SPACE|ZERO)(S)?)\s*($|(?=[^\w\-]))`, NameConstant, nil}, + {Words(`(^|(?<=[^\w\-]))`, `\s*($|(?=[^\w\-]))`, `ACCEPT`, `ADD`, `ALLOCATE`, `CALL`, `CANCEL`, `CLOSE`, `COMPUTE`, `CONFIGURATION`, `CONTINUE`, `DATA`, `DELETE`, `DISPLAY`, `DIVIDE`, `DIVISION`, `ELSE`, `END`, `END-ACCEPT`, `END-ADD`, `END-CALL`, `END-COMPUTE`, `END-DELETE`, `END-DISPLAY`, `END-DIVIDE`, `END-EVALUATE`, `END-IF`, `END-MULTIPLY`, `END-OF-PAGE`, `END-PERFORM`, `END-READ`, `END-RETURN`, `END-REWRITE`, `END-SEARCH`, `END-START`, `END-STRING`, `END-SUBTRACT`, `END-UNSTRING`, `END-WRITE`, `ENVIRONMENT`, `EVALUATE`, `EXIT`, `FD`, `FILE`, `FILE-CONTROL`, `FOREVER`, `FREE`, `GENERATE`, `GO`, `GOBACK`, `IDENTIFICATION`, `IF`, `INITIALIZE`, `INITIATE`, `INPUT-OUTPUT`, `INSPECT`, `INVOKE`, `I-O-CONTROL`, `LINKAGE`, `LOCAL-STORAGE`, `MERGE`, `MOVE`, `MULTIPLY`, `OPEN`, `PERFORM`, `PROCEDURE`, `PROGRAM-ID`, `RAISE`, `READ`, `RELEASE`, `RESUME`, `RETURN`, `REWRITE`, `SCREEN`, `SD`, `SEARCH`, `SECTION`, `SET`, `SORT`, `START`, `STOP`, `STRING`, `SUBTRACT`, `SUPPRESS`, `TERMINATE`, `THEN`, `UNLOCK`, `UNSTRING`, `USE`, `VALIDATE`, `WORKING-STORAGE`, `WRITE`), KeywordReserved, nil}, + {Words(`(^|(?<=[^\w\-]))`, `\s*($|(?=[^\w\-]))`, `ACCESS`, `ADDRESS`, `ADVANCING`, `AFTER`, `ALL`, `ALPHABET`, `ALPHABETIC`, `ALPHABETIC-LOWER`, `ALPHABETIC-UPPER`, `ALPHANUMERIC`, `ALPHANUMERIC-EDITED`, `ALSO`, `ALTER`, `ALTERNATEANY`, `ARE`, `AREA`, `AREAS`, `ARGUMENT-NUMBER`, `ARGUMENT-VALUE`, `AS`, `ASCENDING`, `ASSIGN`, `AT`, `AUTO`, `AUTO-SKIP`, `AUTOMATIC`, `AUTOTERMINATE`, `BACKGROUND-COLOR`, `BASED`, `BEEP`, `BEFORE`, `BELL`, `BLANK`, `BLINK`, `BLOCK`, `BOTTOM`, `BY`, `BYTE-LENGTH`, `CHAINING`, `CHARACTER`, `CHARACTERS`, `CLASS`, `CODE`, `CODE-SET`, `COL`, `COLLATING`, `COLS`, `COLUMN`, `COLUMNS`, `COMMA`, `COMMAND-LINE`, `COMMIT`, `COMMON`, `CONSTANT`, `CONTAINS`, `CONTENT`, `CONTROL`, `CONTROLS`, `CONVERTING`, `COPY`, `CORR`, `CORRESPONDING`, `COUNT`, `CRT`, `CURRENCY`, `CURSOR`, `CYCLE`, `DATE`, `DAY`, `DAY-OF-WEEK`, `DE`, `DEBUGGING`, `DECIMAL-POINT`, `DECLARATIVES`, `DEFAULT`, `DELIMITED`, `DELIMITER`, `DEPENDING`, `DESCENDING`, `DETAIL`, `DISK`, `DOWN`, `DUPLICATES`, `DYNAMIC`, `EBCDIC`, `ENTRY`, `ENVIRONMENT-NAME`, `ENVIRONMENT-VALUE`, `EOL`, `EOP`, `EOS`, `ERASE`, `ERROR`, `ESCAPE`, `EXCEPTION`, `EXCLUSIVE`, `EXTEND`, `EXTERNAL`, `FILE-ID`, `FILLER`, `FINAL`, `FIRST`, `FIXED`, `FLOAT-LONG`, `FLOAT-SHORT`, `FOOTING`, `FOR`, `FOREGROUND-COLOR`, `FORMAT`, `FROM`, `FULL`, `FUNCTION`, `FUNCTION-ID`, `GIVING`, `GLOBAL`, `GROUP`, `HEADING`, `HIGHLIGHT`, `I-O`, `ID`, `IGNORE`, `IGNORING`, `IN`, `INDEX`, `INDEXED`, `INDICATE`, `INITIAL`, `INITIALIZED`, `INPUT`, `INTO`, `INTRINSIC`, `INVALID`, `IS`, `JUST`, `JUSTIFIED`, `KEY`, `LABEL`, `LAST`, `LEADING`, `LEFT`, `LENGTH`, `LIMIT`, `LIMITS`, `LINAGE`, `LINAGE-COUNTER`, `LINE`, `LINES`, `LOCALE`, `LOCK`, `LOWLIGHT`, `MANUAL`, `MEMORY`, `MINUS`, `MODE`, `MULTIPLE`, `NATIONAL`, `NATIONAL-EDITED`, `NATIVE`, `NEGATIVE`, `NEXT`, `NO`, `NULL`, `NULLS`, `NUMBER`, `NUMBERS`, `NUMERIC`, `NUMERIC-EDITED`, `OBJECT-COMPUTER`, `OCCURS`, `OF`, `OFF`, `OMITTED`, `ON`, `ONLY`, `OPTIONAL`, `ORDER`, `ORGANIZATION`, `OTHER`, `OUTPUT`, `OVERFLOW`, `OVERLINE`, `PACKED-DECIMAL`, `PADDING`, `PAGE`, `PARAGRAPH`, `PLUS`, `POINTER`, `POSITION`, `POSITIVE`, `PRESENT`, `PREVIOUS`, `PRINTER`, `PRINTING`, `PROCEDURE-POINTER`, `PROCEDURES`, `PROCEED`, `PROGRAM`, `PROGRAM-POINTER`, `PROMPT`, `QUOTE`, `QUOTES`, `RANDOM`, `RD`, `RECORD`, `RECORDING`, `RECORDS`, `RECURSIVE`, `REDEFINES`, `REEL`, `REFERENCE`, `RELATIVE`, `REMAINDER`, `REMOVAL`, `RENAMES`, `REPLACING`, `REPORT`, `REPORTING`, `REPORTS`, `REPOSITORY`, `REQUIRED`, `RESERVE`, `RETURNING`, `REVERSE-VIDEO`, `REWIND`, `RIGHT`, `ROLLBACK`, `ROUNDED`, `RUN`, `SAME`, `SCROLL`, `SECURE`, `SEGMENT-LIMIT`, `SELECT`, `SENTENCE`, `SEPARATE`, `SEQUENCE`, `SEQUENTIAL`, `SHARING`, `SIGN`, `SIGNED`, `SIGNED-INT`, `SIGNED-LONG`, `SIGNED-SHORT`, `SIZE`, `SORT-MERGE`, `SOURCE`, `SOURCE-COMPUTER`, `SPECIAL-NAMES`, `STANDARD`, `STANDARD-1`, `STANDARD-2`, `STATUS`, `SUM`, `SYMBOLIC`, `SYNC`, `SYNCHRONIZED`, `TALLYING`, `TAPE`, `TEST`, `THROUGH`, `THRU`, `TIME`, `TIMES`, `TO`, `TOP`, `TRAILING`, `TRANSFORM`, `TYPE`, `UNDERLINE`, `UNIT`, `UNSIGNED`, `UNSIGNED-INT`, `UNSIGNED-LONG`, `UNSIGNED-SHORT`, `UNTIL`, `UP`, `UPDATE`, `UPON`, `USAGE`, `USING`, `VALUE`, `VALUES`, `VARYING`, `WAIT`, `WHEN`, `WITH`, `WORDS`, `YYYYDDD`, `YYYYMMDD`), KeywordPseudo, nil}, + {Words(`(^|(?<=[^\w\-]))`, `\s*($|(?=[^\w\-]))`, `ACTIVE-CLASS`, `ALIGNED`, `ANYCASE`, `ARITHMETIC`, `ATTRIBUTE`, `B-AND`, `B-NOT`, `B-OR`, `B-XOR`, `BIT`, `BOOLEAN`, `CD`, `CENTER`, `CF`, `CH`, `CHAIN`, `CLASS-ID`, `CLASSIFICATION`, `COMMUNICATION`, `CONDITION`, `DATA-POINTER`, `DESTINATION`, `DISABLE`, `EC`, `EGI`, `EMI`, `ENABLE`, `END-RECEIVE`, `ENTRY-CONVENTION`, `EO`, `ESI`, `EXCEPTION-OBJECT`, `EXPANDS`, `FACTORY`, `FLOAT-BINARY-16`, `FLOAT-BINARY-34`, `FLOAT-BINARY-7`, `FLOAT-DECIMAL-16`, `FLOAT-DECIMAL-34`, `FLOAT-EXTENDED`, `FORMAT`, `FUNCTION-POINTER`, `GET`, `GROUP-USAGE`, `IMPLEMENTS`, `INFINITY`, `INHERITS`, `INTERFACE`, `INTERFACE-ID`, `INVOKE`, `LC_ALL`, `LC_COLLATE`, `LC_CTYPE`, `LC_MESSAGES`, `LC_MONETARY`, `LC_NUMERIC`, `LC_TIME`, `LINE-COUNTER`, `MESSAGE`, `METHOD`, `METHOD-ID`, `NESTED`, `NONE`, `NORMAL`, `OBJECT`, `OBJECT-REFERENCE`, `OPTIONS`, `OVERRIDE`, `PAGE-COUNTER`, `PF`, `PH`, `PROPERTY`, `PROTOTYPE`, `PURGE`, `QUEUE`, `RAISE`, `RAISING`, `RECEIVE`, `RELATION`, `REPLACE`, `REPRESENTS-NOT-A-NUMBER`, `RESET`, `RESUME`, `RETRY`, `RF`, `RH`, `SECONDS`, `SEGMENT`, `SELF`, `SEND`, `SOURCES`, `STATEMENT`, `STEP`, `STRONG`, `SUB-QUEUE-1`, `SUB-QUEUE-2`, `SUB-QUEUE-3`, `SUPER`, `SYMBOL`, `SYSTEM-DEFAULT`, `TABLE`, `TERMINAL`, `TEXT`, `TYPEDEF`, `UCS-4`, `UNIVERSAL`, `USER-DEFAULT`, `UTF-16`, `UTF-8`, `VAL-STATUS`, `VALID`, `VALIDATE`, `VALIDATE-STATUS`), Error, nil}, + {`(^|(?<=[^\w\-]))(PIC\s+.+?(?=(\s|\.\s))|PICTURE\s+.+?(?=(\s|\.\s))|(COMPUTATIONAL)(-[1-5X])?|(COMP)(-[1-5X])?|BINARY-C-LONG|BINARY-CHAR|BINARY-DOUBLE|BINARY-LONG|BINARY-SHORT|BINARY)\s*($|(?=[^\w\-]))`, KeywordType, nil}, + {`(\*\*|\*|\+|-|/|<=|>=|<|>|==|/=|=)`, Operator, nil}, + {`([(),;:&%.])`, Punctuation, nil}, + {`(^|(?<=[^\w\-]))(ABS|ACOS|ANNUITY|ASIN|ATAN|BYTE-LENGTH|CHAR|COMBINED-DATETIME|CONCATENATE|COS|CURRENT-DATE|DATE-OF-INTEGER|DATE-TO-YYYYMMDD|DAY-OF-INTEGER|DAY-TO-YYYYDDD|EXCEPTION-(?:FILE|LOCATION|STATEMENT|STATUS)|EXP10|EXP|E|FACTORIAL|FRACTION-PART|INTEGER-OF-(?:DATE|DAY|PART)|INTEGER|LENGTH|LOCALE-(?:DATE|TIME(?:-FROM-SECONDS)?)|LOG(?:10)?|LOWER-CASE|MAX|MEAN|MEDIAN|MIDRANGE|MIN|MOD|NUMVAL(?:-C)?|ORD(?:-MAX|-MIN)?|PI|PRESENT-VALUE|RANDOM|RANGE|REM|REVERSE|SECONDS-FROM-FORMATTED-TIME|SECONDS-PAST-MIDNIGHT|SIGN|SIN|SQRT|STANDARD-DEVIATION|STORED-CHAR-LENGTH|SUBSTITUTE(?:-CASE)?|SUM|TAN|TEST-DATE-YYYYMMDD|TEST-DAY-YYYYDDD|TRIM|UPPER-CASE|VARIANCE|WHEN-COMPILED|YEAR-TO-YYYY)\s*($|(?=[^\w\-]))`, NameFunction, nil}, + {`(^|(?<=[^\w\-]))(true|false)\s*($|(?=[^\w\-]))`, NameBuiltin, nil}, + {`(^|(?<=[^\w\-]))(equal|equals|ne|lt|le|gt|ge|greater|less|than|not|and|or)\s*($|(?=[^\w\-]))`, OperatorWord, nil}, + }, + "strings": { + {`"[^"\n]*("|\n)`, LiteralStringDouble, nil}, + {`'[^'\n]*('|\n)`, LiteralStringSingle, nil}, + }, + "nums": { + {`\d+(\s*|\.$|$)`, LiteralNumberInteger, nil}, + {`[+-]?\d*\.\d+(E[-+]?\d+)?`, LiteralNumberFloat, nil}, + {`[+-]?\d+\.\d*(E[-+]?\d+)?`, LiteralNumberFloat, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/coffee.go b/vendor/github.com/alecthomas/chroma/lexers/c/coffee.go new file mode 100644 index 0000000..381a8fe --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/coffee.go @@ -0,0 +1,95 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Coffeescript lexer. +var Coffeescript = internal.Register(MustNewLazyLexer( + &Config{ + Name: "CoffeeScript", + Aliases: []string{"coffee-script", "coffeescript", "coffee"}, + Filenames: []string{"*.coffee"}, + MimeTypes: []string{"text/coffeescript"}, + NotMultiline: true, + DotAll: true, + }, + coffeescriptRules, +)) + +func coffeescriptRules() Rules { + return Rules{ + "commentsandwhitespace": { + {`\s+`, Text, nil}, + {`###[^#].*?###`, CommentMultiline, nil}, + {`#(?!##[^#]).*?\n`, CommentSingle, nil}, + }, + "multilineregex": { + {`[^/#]+`, LiteralStringRegex, nil}, + {`///([gim]+\b|\B)`, LiteralStringRegex, Pop(1)}, + {`#\{`, LiteralStringInterpol, Push("interpoling_string")}, + {`[/#]`, LiteralStringRegex, nil}, + }, + "slashstartsregex": { + Include("commentsandwhitespace"), + {`///`, LiteralStringRegex, Push("#pop", "multilineregex")}, + {`/(?! )(\\.|[^[/\\\n]|\[(\\.|[^\]\\\n])*])+/([gim]+\b|\B)`, LiteralStringRegex, Pop(1)}, + {`/`, Operator, nil}, + Default(Pop(1)), + }, + "root": { + Include("commentsandwhitespace"), + {`^(?=\s|/)`, Text, Push("slashstartsregex")}, + {"\\+\\+|~|&&|\\band\\b|\\bor\\b|\\bis\\b|\\bisnt\\b|\\bnot\\b|\\?|:|\\|\\||\\\\(?=\\n)|(<<|>>>?|==?(?!>)|!=?|=(?!>)|-(?!>)|[<>+*`%&\\|\\^/])=?", Operator, Push("slashstartsregex")}, + {`(?:\([^()]*\))?\s*[=-]>`, NameFunction, Push("slashstartsregex")}, + {`[{(\[;,]`, Punctuation, Push("slashstartsregex")}, + {`[})\].]`, Punctuation, nil}, + {`(?=|<|>|==`, Operator, nil}, + {`mod\b`, Operator, nil}, + {`(eq|lt|gt|lte|gte|not|is|and|or)\b`, Operator, nil}, + {`\|\||&&`, Operator, nil}, + {`\?`, Operator, nil}, + {`"`, LiteralStringDouble, Push("string")}, + {`'.*?'`, LiteralStringSingle, nil}, + {`\d+`, LiteralNumber, nil}, + {`(if|else|len|var|xml|default|break|switch|component|property|function|do|try|catch|in|continue|for|return|while|required|any|array|binary|boolean|component|date|guid|numeric|query|string|struct|uuid|case)\b`, Keyword, nil}, + {`(true|false|null)\b`, KeywordConstant, nil}, + {`(application|session|client|cookie|super|this|variables|arguments)\b`, NameConstant, nil}, + {`([a-z_$][\w.]*)(\s*)(\()`, ByGroups(NameFunction, Text, Punctuation), nil}, + {`[a-z_$][\w.]*`, NameVariable, nil}, + {`[()\[\]{};:,.\\]`, Punctuation, nil}, + {`\s+`, Text, nil}, + }, + "string": { + {`""`, LiteralStringDouble, nil}, + {`#.+?#`, LiteralStringInterpol, nil}, + {`[^"#]+`, LiteralStringDouble, nil}, + {`#`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/coq.go b/vendor/github.com/alecthomas/chroma/lexers/c/coq.go new file mode 100644 index 0000000..e0103ef --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/coq.go @@ -0,0 +1,67 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Coq lexer. +var Coq = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Coq", + Aliases: []string{"coq"}, + Filenames: []string{"*.v"}, + MimeTypes: []string{"text/x-coq"}, + }, + coqRules, +)) + +func coqRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`false|true|\(\)|\[\]`, NameBuiltinPseudo, nil}, + {`\(\*`, Comment, Push("comment")}, + {Words(`\b`, `\b`, `Section`, `Module`, `End`, `Require`, `Import`, `Export`, `Variable`, `Variables`, `Parameter`, `Parameters`, `Axiom`, `Hypothesis`, `Hypotheses`, `Notation`, `Local`, `Tactic`, `Reserved`, `Scope`, `Open`, `Close`, `Bind`, `Delimit`, `Definition`, `Let`, `Ltac`, `Fixpoint`, `CoFixpoint`, `Morphism`, `Relation`, `Implicit`, `Arguments`, `Set`, `Unset`, `Contextual`, `Strict`, `Prenex`, `Implicits`, `Inductive`, `CoInductive`, `Record`, `Structure`, `Canonical`, `Coercion`, `Theorem`, `Lemma`, `Corollary`, `Proposition`, `Fact`, `Remark`, `Example`, `Proof`, `Goal`, `Save`, `Qed`, `Defined`, `Hint`, `Resolve`, `Rewrite`, `View`, `Search`, `Show`, `Print`, `Printing`, `All`, `Graph`, `Projections`, `inside`, `outside`, `Check`, `Global`, `Instance`, `Class`, `Existing`, `Universe`, `Polymorphic`, `Monomorphic`, `Context`), KeywordNamespace, nil}, + {Words(`\b`, `\b`, `forall`, `exists`, `exists2`, `fun`, `fix`, `cofix`, `struct`, `match`, `end`, `in`, `return`, `let`, `if`, `is`, `then`, `else`, `for`, `of`, `nosimpl`, `with`, `as`), Keyword, nil}, + {Words(`\b`, `\b`, `Type`, `Prop`), KeywordType, nil}, + {Words(`\b`, `\b`, `pose`, `set`, `move`, `case`, `elim`, `apply`, `clear`, `hnf`, `intro`, `intros`, `generalize`, `rename`, `pattern`, `after`, `destruct`, `induction`, `using`, `refine`, `inversion`, `injection`, `rewrite`, `congr`, `unlock`, `compute`, `ring`, `field`, `replace`, `fold`, `unfold`, `change`, `cutrewrite`, `simpl`, `have`, `suff`, `wlog`, `suffices`, `without`, `loss`, `nat_norm`, `assert`, `cut`, `trivial`, `revert`, `bool_congr`, `nat_congr`, `symmetry`, `transitivity`, `auto`, `split`, `left`, `right`, `autorewrite`, `tauto`, `setoid_rewrite`, `intuition`, `eauto`, `eapply`, `econstructor`, `etransitivity`, `constructor`, `erewrite`, `red`, `cbv`, `lazy`, `vm_compute`, `native_compute`, `subst`), Keyword, nil}, + {Words(`\b`, `\b`, `by`, `done`, `exact`, `reflexivity`, `tauto`, `romega`, `omega`, `assumption`, `solve`, `contradiction`, `discriminate`, `congruence`), KeywordPseudo, nil}, + {Words(`\b`, `\b`, `do`, `last`, `first`, `try`, `idtac`, `repeat`), KeywordReserved, nil}, + {`\b([A-Z][\w\']*)`, Name, nil}, + {"(\u03bb|\u03a0|\\|\\}|\\{\\||\\\\/|/\\\\|=>|~|\\}|\\|]|\\||\\{<|\\{|`|_|]|\\[\\||\\[>|\\[<|\\[|\\?\\?|\\?|>\\}|>]|>|=|<->|<-|<|;;|;|:>|:=|::|:|\\.\\.|\\.|->|-\\.|-|,|\\+|\\*|\\)|\\(|&&|&|#|!=)", Operator, nil}, + {`([=<>@^|&+\*/$%-]|[!?~])?[!$%&*+\./:<=>?@^|~-]`, Operator, nil}, + {`\b(unit|nat|bool|string|ascii|list)\b`, KeywordType, nil}, + {`[^\W\d][\w']*`, Name, nil}, + {`\d[\d_]*`, LiteralNumberInteger, nil}, + {`0[xX][\da-fA-F][\da-fA-F_]*`, LiteralNumberHex, nil}, + {`0[oO][0-7][0-7_]*`, LiteralNumberOct, nil}, + {`0[bB][01][01_]*`, LiteralNumberBin, nil}, + {`-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)`, LiteralNumberFloat, nil}, + {`'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'`, LiteralStringChar, nil}, + {`'.'`, LiteralStringChar, nil}, + {`'`, Keyword, nil}, + {`"`, LiteralStringDouble, Push("string")}, + {`[~?][a-z][\w\']*:`, Name, nil}, + }, + "comment": { + {`[^(*)]+`, Comment, nil}, + {`\(\*`, Comment, Push()}, + {`\*\)`, Comment, Pop(1)}, + {`[(*)]`, Comment, nil}, + }, + "string": { + {`[^"]+`, LiteralStringDouble, nil}, + {`""`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + "dotted": { + {`\s+`, Text, nil}, + {`\.`, Punctuation, nil}, + {`[A-Z][\w\']*(?=\s*\.)`, NameNamespace, nil}, + {`[A-Z][\w\']*`, NameClass, Pop(1)}, + {`[a-z][a-z0-9_\']*`, Name, Pop(1)}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/cpp.go b/vendor/github.com/alecthomas/chroma/lexers/c/cpp.go new file mode 100644 index 0000000..3f4a1fd --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/cpp.go @@ -0,0 +1,110 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// CPP lexer. +var CPP = internal.Register(MustNewLazyLexer( + &Config{ + Name: "C++", + Aliases: []string{"cpp", "c++"}, + Filenames: []string{"*.cpp", "*.hpp", "*.c++", "*.h++", "*.cc", "*.hh", "*.cxx", "*.hxx", "*.C", "*.H", "*.cp", "*.CPP"}, + MimeTypes: []string{"text/x-c++hdr", "text/x-c++src"}, + EnsureNL: true, + }, + cppRules, +)) + +func cppRules() Rules { + return Rules{ + "statements": { + {Words(``, `\b`, `catch`, `const_cast`, `delete`, `dynamic_cast`, `explicit`, `export`, `friend`, `mutable`, `namespace`, `new`, `operator`, `private`, `protected`, `public`, `reinterpret_cast`, `restrict`, `static_cast`, `template`, `this`, `throw`, `throws`, `try`, `typeid`, `typename`, `using`, `virtual`, `constexpr`, `nullptr`, `decltype`, `thread_local`, `alignas`, `alignof`, `static_assert`, `noexcept`, `override`, `final`, `concept`, `requires`, `consteval`, `co_await`, `co_return`, `co_yield`), Keyword, nil}, + {`(enum)\b(\s+)(class)\b(\s*)`, ByGroups(Keyword, Text, Keyword, Text), Push("classname")}, + {`(class|struct|enum|union)\b(\s*)`, ByGroups(Keyword, Text), Push("classname")}, + {`\[\[.+\]\]`, NameAttribute, nil}, + {`(R)(")([^\\()\s]{,16})(\()((?:.|\n)*?)(\)\3)(")`, ByGroups(LiteralStringAffix, LiteralString, LiteralStringDelimiter, LiteralStringDelimiter, LiteralString, LiteralStringDelimiter, LiteralString), nil}, + {`(u8|u|U)(")`, ByGroups(LiteralStringAffix, LiteralString), Push("string")}, + {`(L?)(")`, ByGroups(LiteralStringAffix, LiteralString), Push("string")}, + {`(L?)(')(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])(')`, ByGroups(LiteralStringAffix, LiteralStringChar, LiteralStringChar, LiteralStringChar), nil}, + {`(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*`, LiteralNumberFloat, nil}, + {`(\d+\.\d*|\.\d+|\d+[fF])[fF]?`, LiteralNumberFloat, nil}, + {`0[xX]([0-9A-Fa-f]('?[0-9A-Fa-f]+)*)[LlUu]*`, LiteralNumberHex, nil}, + {`0('?[0-7]+)+[LlUu]*`, LiteralNumberOct, nil}, + {`0[Bb][01]('?[01]+)*[LlUu]*`, LiteralNumberBin, nil}, + {`[0-9]('?[0-9]+)*[LlUu]*`, LiteralNumberInteger, nil}, + {`\*/`, Error, nil}, + {`[~!%^&*+=|?:<>/-]`, Operator, nil}, + {`[()\[\],.]`, Punctuation, nil}, + {Words(``, `\b`, `asm`, `auto`, `break`, `case`, `const`, `continue`, `default`, `do`, `else`, `enum`, `extern`, `for`, `goto`, `if`, `register`, `restricted`, `return`, `sizeof`, `static`, `struct`, `switch`, `typedef`, `union`, `volatile`, `while`), Keyword, nil}, + {`(bool|int|long|float|short|double|char((8|16|32)_t)?|wchar_t|unsigned|signed|void|u?int(_fast|_least|)(8|16|32|64)_t)\b`, KeywordType, nil}, + {Words(``, `\b`, `inline`, `_inline`, `__inline`, `naked`, `restrict`, `thread`, `typename`), KeywordReserved, nil}, + {`(__m(128i|128d|128|64))\b`, KeywordReserved, nil}, + {Words(`__`, `\b`, `asm`, `int8`, `based`, `except`, `int16`, `stdcall`, `cdecl`, `fastcall`, `int32`, `declspec`, `finally`, `int64`, `try`, `leave`, `w64`, `unaligned`, `raise`, `noop`, `identifier`, `forceinline`, `assume`), KeywordReserved, nil}, + {`(true|false|NULL)\b`, NameBuiltin, nil}, + {`([a-zA-Z_]\w*)(\s*)(:)(?!:)`, ByGroups(NameLabel, Text, Punctuation), nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + }, + "root": { + Include("whitespace"), + {`((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;{]*)(\{)`, ByGroups(UsingSelf("root"), NameFunction, UsingSelf("root"), UsingSelf("root"), Punctuation), Push("function")}, + {`((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;]*)(;)`, ByGroups(UsingSelf("root"), NameFunction, UsingSelf("root"), UsingSelf("root"), Punctuation), nil}, + Default(Push("statement")), + {Words(`__`, `\b`, `virtual_inheritance`, `uuidof`, `super`, `single_inheritance`, `multiple_inheritance`, `interface`, `event`), KeywordReserved, nil}, + {`__(offload|blockingoffload|outer)\b`, KeywordPseudo, nil}, + }, + "classname": { + {`(\[\[.+\]\])(\s*)`, ByGroups(NameAttribute, Text), nil}, + {`[a-zA-Z_]\w*`, NameClass, Pop(1)}, + {`\s*(?=[>{])`, Text, Pop(1)}, + }, + "whitespace": { + {`^#if\s+0`, CommentPreproc, Push("if0")}, + {`^#`, CommentPreproc, Push("macro")}, + {`^(\s*(?:/[*].*?[*]/\s*)?)(#if\s+0)`, ByGroups(UsingSelf("root"), CommentPreproc), Push("if0")}, + {`^(\s*(?:/[*].*?[*]/\s*)?)(#)`, ByGroups(UsingSelf("root"), CommentPreproc), Push("macro")}, + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`\\\n`, Text, nil}, + {`//(\n|[\w\W]*?[^\\]\n)`, CommentSingle, nil}, + {`/(\\\n)?[*][\w\W]*?[*](\\\n)?/`, CommentMultiline, nil}, + {`/(\\\n)?[*][\w\W]*`, CommentMultiline, nil}, + }, + "statement": { + Include("whitespace"), + Include("statements"), + {`[{]`, Punctuation, Push("root")}, + {`[;}]`, Punctuation, Pop(1)}, + }, + "function": { + Include("whitespace"), + Include("statements"), + {`;`, Punctuation, nil}, + {`\{`, Punctuation, Push()}, + {`\}`, Punctuation, Pop(1)}, + }, + "string": { + {`"`, LiteralString, Pop(1)}, + {`\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})`, LiteralStringEscape, nil}, + {`[^\\"\n]+`, LiteralString, nil}, + {`\\\n`, LiteralString, nil}, + {`\\`, LiteralString, nil}, + }, + "macro": { + {`(include)(\s*(?:/[*].*?[*]/\s*)?)([^\n]+)`, ByGroups(CommentPreproc, Text, CommentPreprocFile), nil}, + {`[^/\n]+`, CommentPreproc, nil}, + {`/[*](.|\n)*?[*]/`, CommentMultiline, nil}, + {`//.*?\n`, CommentSingle, Pop(1)}, + {`/`, CommentPreproc, nil}, + {`(?<=\\)\n`, CommentPreproc, nil}, + {`\n`, CommentPreproc, Pop(1)}, + }, + "if0": { + {`^\s*#if.*?(?=~!@#%^&|`?-]+", Operator, nil}, + { + `(?s)(java|javascript)(\s+)(AS)(\s+)('|\$\$)(.*?)(\5)`, + UsingByGroup( + internal.Get, + 1, 6, + NameBuiltin, TextWhitespace, Keyword, TextWhitespace, + LiteralStringHeredoc, LiteralStringHeredoc, LiteralStringHeredoc, + ), + nil, + }, + {`(true|false|null)\b`, KeywordConstant, nil}, + {`0x[0-9a-f]+`, LiteralNumberHex, nil}, + {`[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}`, LiteralNumberHex, nil}, + {`\.[0-9]+(e[+-]?[0-9]+)?`, Error, nil}, + {`-?[0-9]+(\.[0-9])?(e[+-]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`'`, LiteralStringSingle, Push("string")}, + {`"`, LiteralStringName, Push("quoted-ident")}, + {`\$\$`, LiteralStringHeredoc, Push("dollar-string")}, + {`[a-z_]\w*`, Name, nil}, + {`:(['"]?)[a-z]\w*\b\1`, NameVariable, nil}, + {`[;:()\[\]\{\},.]`, Punctuation, nil}, + }, + "multiline-comments": { + {`/\*`, CommentMultiline, Push("multiline-comments")}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[^/*]+`, CommentMultiline, nil}, + {`[/*]`, CommentMultiline, nil}, + }, + "string": { + {`[^']+`, LiteralStringSingle, nil}, + {`''`, LiteralStringSingle, nil}, + {`'`, LiteralStringSingle, Pop(1)}, + }, + "quoted-ident": { + {`[^"]+`, LiteralStringName, nil}, + {`""`, LiteralStringName, nil}, + {`"`, LiteralStringName, Pop(1)}, + }, + "dollar-string": { + {`[^\$]+`, LiteralStringHeredoc, nil}, + {`\$\$`, LiteralStringHeredoc, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/crystal.go b/vendor/github.com/alecthomas/chroma/lexers/c/crystal.go new file mode 100644 index 0000000..f06830d --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/crystal.go @@ -0,0 +1,266 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Crystal lexer. +var Crystal = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Crystal", + Aliases: []string{"cr", "crystal"}, + Filenames: []string{"*.cr"}, + MimeTypes: []string{"text/x-crystal"}, + DotAll: true, + }, + crystalRules, +)) + +func crystalRules() Rules { + return Rules{ + "root": { + {`#.*?$`, CommentSingle, nil}, + {Words(``, `\b`, `abstract`, `asm`, `as`, `begin`, `break`, `case`, `do`, `else`, `elsif`, `end`, `ensure`, `extend`, `ifdef`, `if`, `include`, `instance_sizeof`, `next`, `of`, `pointerof`, `private`, `protected`, `rescue`, `return`, `require`, `sizeof`, `super`, `then`, `typeof`, `unless`, `until`, `when`, `while`, `with`, `yield`), Keyword, nil}, + {Words(``, `\b`, `true`, `false`, `nil`), KeywordConstant, nil}, + {`(module|lib)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)`, ByGroups(Keyword, Text, NameNamespace), nil}, + {`(def|fun|macro)(\s+)((?:[a-zA-Z_]\w*::)*)`, ByGroups(Keyword, Text, NameNamespace), Push("funcname")}, + {"def(?=[*%&^`~+-/\\[<>=])", Keyword, Push("funcname")}, + {`(class|struct|union|type|alias|enum)(\s+)((?:[a-zA-Z_]\w*::)*)`, ByGroups(Keyword, Text, NameNamespace), Push("classname")}, + {`(self|out|uninitialized)\b|(is_a|responds_to)\?`, KeywordPseudo, nil}, + {Words(``, `\b`, `debugger`, `record`, `pp`, `assert_responds_to`, `spawn`, `parallel`, `getter`, `setter`, `property`, `delegate`, `def_hash`, `def_equals`, `def_equals_and_hash`, `forward_missing_to`), NameBuiltinPseudo, nil}, + {`getter[!?]|property[!?]|__(DIR|FILE|LINE)__\b`, NameBuiltinPseudo, nil}, + {Words(`(?~!:])|(?<=(?:\s|;)when\s)|(?<=(?:\s|;)or\s)|(?<=(?:\s|;)and\s)|(?<=\.index\s)|(?<=\.scan\s)|(?<=\.sub\s)|(?<=\.sub!\s)|(?<=\.gsub\s)|(?<=\.gsub!\s)|(?<=\.match\s)|(?<=(?:\s|;)if\s)|(?<=(?:\s|;)elsif\s)|(?<=^when\s)|(?<=^index\s)|(?<=^scan\s)|(?<=^sub\s)|(?<=^gsub\s)|(?<=^sub!\s)|(?<=^gsub!\s)|(?<=^match\s)|(?<=^if\s)|(?<=^elsif\s))(\s*)(/)`, ByGroups(Text, LiteralStringRegex), Push("multiline-regex")}, + {`(?<=\(|,|\[)/`, LiteralStringRegex, Push("multiline-regex")}, + {`(\s+)(/)(?![\s=])`, ByGroups(Text, LiteralStringRegex), Push("multiline-regex")}, + {`(0o[0-7]+(?:_[0-7]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?`, ByGroups(LiteralNumberOct, Text, Operator), nil}, + {`(0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?`, ByGroups(LiteralNumberHex, Text, Operator), nil}, + {`(0b[01]+(?:_[01]+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?`, ByGroups(LiteralNumberBin, Text, Operator), nil}, + {`((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)(?:e[+-]?[0-9]+)?(?:_?f[0-9]+)?)(\s*)([/?])?`, ByGroups(LiteralNumberFloat, Text, Operator), nil}, + {`((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)?(?:e[+-]?[0-9]+)(?:_?f[0-9]+)?)(\s*)([/?])?`, ByGroups(LiteralNumberFloat, Text, Operator), nil}, + {`((?:0(?![0-9])|[1-9][\d_]*)(?:\.\d[\d_]*)?(?:e[+-]?[0-9]+)?(?:_?f[0-9]+))(\s*)([/?])?`, ByGroups(LiteralNumberFloat, Text, Operator), nil}, + {`(0\b|[1-9][\d]*(?:_\d+)*(?:_?[iu][0-9]+)?)\b(\s*)([/?])?`, ByGroups(LiteralNumberInteger, Text, Operator), nil}, + {`@@[a-zA-Z_]\w*`, NameVariableClass, nil}, + {`@[a-zA-Z_]\w*`, NameVariableInstance, nil}, + {`\$\w+`, NameVariableGlobal, nil}, + {"\\$[!@&`\\'+~=/\\\\,;.<>_*$?:\"^-]", NameVariableGlobal, nil}, + {`\$-[0adFiIlpvw]`, NameVariableGlobal, nil}, + {`::`, Operator, nil}, + Include("strings"), + {`\?(\\[MC]-)*(\\([\\befnrtv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)(?!\w)`, LiteralStringChar, nil}, + {`[A-Z][A-Z_]+\b`, NameConstant, nil}, + {`\{%`, LiteralStringInterpol, Push("in-macro-control")}, + {`\{\{`, LiteralStringInterpol, Push("in-macro-expr")}, + {`(@\[)(\s*)([A-Z]\w*)`, ByGroups(Operator, Text, NameDecorator), Push("in-attr")}, + {Words(`(\.|::)`, ``, `!=`, `!~`, `!`, `%`, `&&`, `&`, `**`, `*`, `+`, `-`, `/`, `<=>`, `<<`, `<=`, `<`, `===`, `==`, `=~`, `=`, `>=`, `>>`, `>`, `[]=`, `[]?`, `[]`, `^`, `||`, `|`, `~`), ByGroups(Operator, NameOperator), nil}, + {"(\\.|::)([a-zA-Z_]\\w*[!?]?|[*%&^`~+\\-/\\[<>=])", ByGroups(Operator, Name), nil}, + {`[a-zA-Z_]\w*(?:[!?](?!=))?`, Name, nil}, + {`(\[|\]\??|\*\*|<=>?|>=|<>?|=~|===|!~|&&?|\|\||\.{1,3})`, Operator, nil}, + {`[-+/*%=<>&!^|~]=?`, Operator, nil}, + {`[(){};,/?:\\]`, Punctuation, nil}, + {`\s+`, Text, nil}, + }, + "funcname": { + {"(?:([a-zA-Z_]\\w*)(\\.))?([a-zA-Z_]\\w*[!?]?|\\*\\*?|[-+]@?|[/%&|^`~]|\\[\\]=?|<<|>>|<=?>|>=?|===?)", ByGroups(NameClass, Operator, NameFunction), Pop(1)}, + Default(Pop(1)), + }, + "classname": { + {`[A-Z_]\w*`, NameClass, nil}, + {`(\()(\s*)([A-Z_]\w*)(\s*)(\))`, ByGroups(Punctuation, Text, NameClass, Text, Punctuation), nil}, + Default(Pop(1)), + }, + "in-intp": { + {`\{`, LiteralStringInterpol, Push()}, + {`\}`, LiteralStringInterpol, Pop(1)}, + Include("root"), + }, + "string-intp": { + {`#\{`, LiteralStringInterpol, Push("in-intp")}, + }, + "string-escaped": { + {`\\([\\befnstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})`, LiteralStringEscape, nil}, + }, + "string-intp-escaped": { + Include("string-intp"), + Include("string-escaped"), + }, + "interpolated-regex": { + Include("string-intp"), + {`[\\#]`, LiteralStringRegex, nil}, + {`[^\\#]+`, LiteralStringRegex, nil}, + }, + "interpolated-string": { + Include("string-intp"), + {`[\\#]`, LiteralStringOther, nil}, + {`[^\\#]+`, LiteralStringOther, nil}, + }, + "multiline-regex": { + Include("string-intp"), + {`\\\\`, LiteralStringRegex, nil}, + {`\\/`, LiteralStringRegex, nil}, + {`[\\#]`, LiteralStringRegex, nil}, + {`[^\\/#]+`, LiteralStringRegex, nil}, + {`/[imsx]*`, LiteralStringRegex, Pop(1)}, + }, + "end-part": { + {`.+`, CommentPreproc, Pop(1)}, + }, + "in-macro-control": { + {`\{%`, LiteralStringInterpol, Push()}, + {`%\}`, LiteralStringInterpol, Pop(1)}, + {`for\b|in\b`, Keyword, nil}, + Include("root"), + }, + "in-macro-expr": { + {`\{\{`, LiteralStringInterpol, Push()}, + {`\}\}`, LiteralStringInterpol, Pop(1)}, + Include("root"), + }, + "in-attr": { + {`\[`, Operator, Push()}, + {`\]`, Operator, Pop(1)}, + Include("root"), + }, + "strings": { + {`\:@{0,2}[a-zA-Z_]\w*[!?]?`, LiteralStringSymbol, nil}, + {Words(`\:@{0,2}`, ``, `!=`, `!~`, `!`, `%`, `&&`, `&`, `**`, `*`, `+`, `-`, `/`, `<=>`, `<<`, `<=`, `<`, `===`, `==`, `=~`, `=`, `>=`, `>>`, `>`, `[]=`, `[]?`, `[]`, `^`, `||`, `|`, `~`), LiteralStringSymbol, nil}, + {`:'(\\\\|\\'|[^'])*'`, LiteralStringSymbol, nil}, + {`'(\\\\|\\'|[^']|\\[^'\\]+)'`, LiteralStringChar, nil}, + {`:"`, LiteralStringSymbol, Push("simple-sym")}, + {`([a-zA-Z_]\w*)(:)(?!:)`, ByGroups(LiteralStringSymbol, Punctuation), nil}, + {`"`, LiteralStringDouble, Push("simple-string")}, + {"(?&!^|~,(])(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)`, ByGroups(Text, LiteralStringOther, None), nil}, + {`^(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)`, ByGroups(Text, LiteralStringOther, None), nil}, + {`(%([\[{(<]))((?:\\\2|(?!\2).)*)(\2)`, String, nil}, + }, + "simple-string": { + Include("string-intp-escaped"), + {`[^\\"#]+`, LiteralStringDouble, nil}, + {`[\\#]`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + "simple-sym": { + Include("string-escaped"), + {`[^\\"#]+`, LiteralStringSymbol, nil}, + {`[\\#]`, LiteralStringSymbol, nil}, + {`"`, LiteralStringSymbol, Pop(1)}, + }, + "simple-backtick": { + Include("string-intp-escaped"), + {"[^\\\\`#]+", LiteralStringBacktick, nil}, + {`[\\#]`, LiteralStringBacktick, nil}, + {"`", LiteralStringBacktick, Pop(1)}, + }, + "cb-intp-string": { + {`\\[\{]`, LiteralStringOther, nil}, + {`\{`, LiteralStringOther, Push()}, + {`\}`, LiteralStringOther, Pop(1)}, + Include("string-intp-escaped"), + {`[\\#{}]`, LiteralStringOther, nil}, + {`[^\\#{}]+`, LiteralStringOther, nil}, + }, + "cb-string": { + {`\\[\\{}]`, LiteralStringOther, nil}, + {`\{`, LiteralStringOther, Push()}, + {`\}`, LiteralStringOther, Pop(1)}, + {`[\\#{}]`, LiteralStringOther, nil}, + {`[^\\#{}]+`, LiteralStringOther, nil}, + }, + "cb-regex": { + {`\\[\\{}]`, LiteralStringRegex, nil}, + {`\{`, LiteralStringRegex, Push()}, + {`\}[imsx]*`, LiteralStringRegex, Pop(1)}, + Include("string-intp"), + {`[\\#{}]`, LiteralStringRegex, nil}, + {`[^\\#{}]+`, LiteralStringRegex, nil}, + }, + "sb-intp-string": { + {`\\[\[]`, LiteralStringOther, nil}, + {`\[`, LiteralStringOther, Push()}, + {`\]`, LiteralStringOther, Pop(1)}, + Include("string-intp-escaped"), + {`[\\#\[\]]`, LiteralStringOther, nil}, + {`[^\\#\[\]]+`, LiteralStringOther, nil}, + }, + "sb-string": { + {`\\[\\\[\]]`, LiteralStringOther, nil}, + {`\[`, LiteralStringOther, Push()}, + {`\]`, LiteralStringOther, Pop(1)}, + {`[\\#\[\]]`, LiteralStringOther, nil}, + {`[^\\#\[\]]+`, LiteralStringOther, nil}, + }, + "sb-regex": { + {`\\[\\\[\]]`, LiteralStringRegex, nil}, + {`\[`, LiteralStringRegex, Push()}, + {`\][imsx]*`, LiteralStringRegex, Pop(1)}, + Include("string-intp"), + {`[\\#\[\]]`, LiteralStringRegex, nil}, + {`[^\\#\[\]]+`, LiteralStringRegex, nil}, + }, + "pa-intp-string": { + {`\\[\(]`, LiteralStringOther, nil}, + {`\(`, LiteralStringOther, Push()}, + {`\)`, LiteralStringOther, Pop(1)}, + Include("string-intp-escaped"), + {`[\\#()]`, LiteralStringOther, nil}, + {`[^\\#()]+`, LiteralStringOther, nil}, + }, + "pa-string": { + {`\\[\\()]`, LiteralStringOther, nil}, + {`\(`, LiteralStringOther, Push()}, + {`\)`, LiteralStringOther, Pop(1)}, + {`[\\#()]`, LiteralStringOther, nil}, + {`[^\\#()]+`, LiteralStringOther, nil}, + }, + "pa-regex": { + {`\\[\\()]`, LiteralStringRegex, nil}, + {`\(`, LiteralStringRegex, Push()}, + {`\)[imsx]*`, LiteralStringRegex, Pop(1)}, + Include("string-intp"), + {`[\\#()]`, LiteralStringRegex, nil}, + {`[^\\#()]+`, LiteralStringRegex, nil}, + }, + "ab-intp-string": { + {`\\[<]`, LiteralStringOther, nil}, + {`<`, LiteralStringOther, Push()}, + {`>`, LiteralStringOther, Pop(1)}, + Include("string-intp-escaped"), + {`[\\#<>]`, LiteralStringOther, nil}, + {`[^\\#<>]+`, LiteralStringOther, nil}, + }, + "ab-string": { + {`\\[\\<>]`, LiteralStringOther, nil}, + {`<`, LiteralStringOther, Push()}, + {`>`, LiteralStringOther, Pop(1)}, + {`[\\#<>]`, LiteralStringOther, nil}, + {`[^\\#<>]+`, LiteralStringOther, nil}, + }, + "ab-regex": { + {`\\[\\<>]`, LiteralStringRegex, nil}, + {`<`, LiteralStringRegex, Push()}, + {`>[imsx]*`, LiteralStringRegex, Pop(1)}, + Include("string-intp"), + {`[\\#<>]`, LiteralStringRegex, nil}, + {`[^\\#<>]+`, LiteralStringRegex, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/csharp.go b/vendor/github.com/alecthomas/chroma/lexers/c/csharp.go new file mode 100644 index 0000000..4776864 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/csharp.go @@ -0,0 +1,56 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// CSharp lexer. +var CSharp = internal.Register(MustNewLazyLexer( + &Config{ + Name: "C#", + Aliases: []string{"csharp", "c#"}, + Filenames: []string{"*.cs"}, + MimeTypes: []string{"text/x-csharp"}, + DotAll: true, + EnsureNL: true, + }, + cSharpRules, +)) + +func cSharpRules() Rules { + return Rules{ + "root": { + {`^\s*\[.*?\]`, NameAttribute, nil}, + {`[^\S\n]+`, Text, nil}, + {`\\\n`, Text, nil}, + {`///[^\n\r]+`, CommentSpecial, nil}, + {`//[^\n\r]+`, CommentSingle, nil}, + {`/[*].*?[*]/`, CommentMultiline, nil}, + {`\n`, Text, nil}, + {`[~!%^&*()+=|\[\]:;,.<>/?-]`, Punctuation, nil}, + {`[{}]`, Punctuation, nil}, + {`@"(""|[^"])*"`, LiteralString, nil}, + {`\$@?"(""|[^"])*"`, LiteralString, nil}, + {`"(\\\\|\\"|[^"\n])*["\n]`, LiteralString, nil}, + {`'\\.'|'[^\\]'`, LiteralStringChar, nil}, + {`0[xX][0-9a-fA-F]+[Ll]?|[0-9_](\.[0-9]*)?([eE][+-]?[0-9]+)?[flFLdD]?`, LiteralNumber, nil}, + {`#[ \t]*(if|endif|else|elif|define|undef|line|error|warning|region|endregion|pragma|nullable)\b[^\n\r]+`, CommentPreproc, nil}, + {`\b(extern)(\s+)(alias)\b`, ByGroups(Keyword, Text, Keyword), nil}, + {`(abstract|as|async|await|base|break|by|case|catch|checked|const|continue|default|delegate|do|else|enum|event|explicit|extern|false|finally|fixed|for|foreach|goto|if|implicit|in|init|internal|is|let|lock|new|null|on|operator|out|override|params|private|protected|public|readonly|ref|return|sealed|sizeof|stackalloc|static|switch|this|throw|true|try|typeof|unchecked|unsafe|virtual|void|while|get|set|new|partial|yield|add|remove|value|alias|ascending|descending|from|group|into|orderby|select|thenby|where|join|equals)\b`, Keyword, nil}, + {`(global)(::)`, ByGroups(Keyword, Punctuation), nil}, + {`(bool|byte|char|decimal|double|dynamic|float|int|long|object|sbyte|short|string|uint|ulong|ushort|var)\b\??`, KeywordType, nil}, + {`(class|struct|record|interface)(\s+)`, ByGroups(Keyword, Text), Push("class")}, + {`(namespace|using)(\s+)`, ByGroups(Keyword, Text), Push("namespace")}, + {`@?[_a-zA-Z]\w*`, Name, nil}, + }, + "class": { + {`@?[_a-zA-Z]\w*`, NameClass, Pop(1)}, + Default(Pop(1)), + }, + "namespace": { + {`(?=\()`, Text, Pop(1)}, + {`(@?[_a-zA-Z]\w*|\.)+`, NameNamespace, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/css.go b/vendor/github.com/alecthomas/chroma/lexers/c/css.go new file mode 100644 index 0000000..9f3a01d --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/css.go @@ -0,0 +1,121 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// CSS lexer. +var CSS = internal.Register(MustNewLazyLexer( + &Config{ + Name: "CSS", + Aliases: []string{"css"}, + Filenames: []string{"*.css"}, + MimeTypes: []string{"text/css"}, + }, + cssRules, +)) + +func cssRules() Rules { + return Rules{ + "root": { + Include("basics"), + }, + "basics": { + {`\s+`, Text, nil}, + {`/\*(?:.|\n)*?\*/`, Comment, nil}, + {`\{`, Punctuation, Push("content")}, + {`(\:{1,2})([\w-]+)`, ByGroups(Punctuation, NameDecorator), nil}, + {`(\.)([\w-]+)`, ByGroups(Punctuation, NameClass), nil}, + {`(\#)([\w-]+)`, ByGroups(Punctuation, NameNamespace), nil}, + {`(@)([\w-]+)`, ByGroups(Punctuation, Keyword), Push("atrule")}, + {`[\w-]+`, NameTag, nil}, + {`[~^*!%&$\[\]()<>|+=@:;,./?-]`, Operator, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + }, + "atrule": { + {`\{`, Punctuation, Push("atcontent")}, + {`;`, Punctuation, Pop(1)}, + Include("basics"), + }, + "atcontent": { + Include("basics"), + {`\}`, Punctuation, Pop(2)}, + }, + "atparenthesis": { + Include("common-values"), + {`/\*(?:.|\n)*?\*/`, Comment, nil}, + Include("numeric-values"), + {`[*+/-]`, Operator, nil}, + {`[,]`, Punctuation, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + {`[a-zA-Z_-]\w*`, Name, nil}, + {`\(`, Punctuation, Push("atparenthesis")}, + {`\)`, Punctuation, Pop(1)}, + }, + "content": { + {`\s+`, Text, nil}, + {`\}`, Punctuation, Pop(1)}, + {`;`, Punctuation, nil}, + {`^@.*?$`, CommentPreproc, nil}, + {Words(``, ``, `-ms-`, `mso-`, `-moz-`, `-o-`, `-xv-`, `-atsc-`, `-wap-`, `-khtml-`, `-webkit-`, `prince-`, `-ah-`, `-hp-`, `-ro-`, `-rim-`, `-tc-`), KeywordPseudo, nil}, + {`(align-content|align-items|align-self|alignment-baseline|all|animation|animation-delay|animation-direction|animation-duration|animation-fill-mode|animation-iteration-count|animation-name|animation-play-state|animation-timing-function|appearance|azimuth|backface-visibility|background|background-attachment|background-blend-mode|background-clip|background-color|background-image|background-origin|background-position|background-repeat|background-size|baseline-shift|bookmark-label|bookmark-level|bookmark-state|border|border-bottom|border-bottom-color|border-bottom-left-radius|border-bottom-right-radius|border-bottom-style|border-bottom-width|border-boundary|border-collapse|border-color|border-image|border-image-outset|border-image-repeat|border-image-slice|border-image-source|border-image-width|border-left|border-left-color|border-left-style|border-left-width|border-radius|border-right|border-right-color|border-right-style|border-right-width|border-spacing|border-style|border-top|border-top-color|border-top-left-radius|border-top-right-radius|border-top-style|border-top-width|border-width|bottom|box-decoration-break|box-shadow|box-sizing|box-snap|box-suppress|break-after|break-before|break-inside|caption-side|caret|caret-animation|caret-color|caret-shape|chains|clear|clip|clip-path|clip-rule|color|color-interpolation-filters|column-count|column-fill|column-gap|column-rule|column-rule-color|column-rule-style|column-rule-width|column-span|column-width|columns|content|counter-increment|counter-reset|counter-set|crop|cue|cue-after|cue-before|cursor|direction|display|dominant-baseline|elevation|empty-cells|filter|flex|flex-basis|flex-direction|flex-flow|flex-grow|flex-shrink|flex-wrap|float|float-defer|float-offset|float-reference|flood-color|flood-opacity|flow|flow-from|flow-into|font|font-family|font-feature-settings|font-kerning|font-language-override|font-size|font-size-adjust|font-stretch|font-style|font-synthesis|font-variant|font-variant-alternates|font-variant-caps|font-variant-east-asian|font-variant-ligatures|font-variant-numeric|font-variant-position|font-weight|footnote-display|footnote-policy|glyph-orientation-vertical|grid|grid-area|grid-auto-columns|grid-auto-flow|grid-auto-rows|grid-column|grid-column-end|grid-column-gap|grid-column-start|grid-gap|grid-row|grid-row-end|grid-row-gap|grid-row-start|grid-template|grid-template-areas|grid-template-columns|grid-template-rows|hanging-punctuation|height|hyphenate-character|hyphenate-limit-chars|hyphenate-limit-last|hyphenate-limit-lines|hyphenate-limit-zone|hyphens|image-orientation|image-resolution|initial-letter|initial-letter-align|initial-letter-wrap|isolation|justify-content|justify-items|justify-self|left|letter-spacing|lighting-color|line-break|line-grid|line-height|line-snap|list-style|list-style-image|list-style-position|list-style-type|margin|margin-bottom|margin-left|margin-right|margin-top|marker-side|marquee-direction|marquee-loop|marquee-speed|marquee-style|mask|mask-border|mask-border-mode|mask-border-outset|mask-border-repeat|mask-border-slice|mask-border-source|mask-border-width|mask-clip|mask-composite|mask-image|mask-mode|mask-origin|mask-position|mask-repeat|mask-size|mask-type|max-height|max-lines|max-width|min-height|min-width|mix-blend-mode|motion|motion-offset|motion-path|motion-rotation|move-to|nav-down|nav-left|nav-right|nav-up|object-fit|object-position|offset-after|offset-before|offset-end|offset-start|opacity|order|orphans|outline|outline-color|outline-offset|outline-style|outline-width|overflow|overflow-style|overflow-wrap|overflow-x|overflow-y|padding|padding-bottom|padding-left|padding-right|padding-top|page|page-break-after|page-break-before|page-break-inside|page-policy|pause|pause-after|pause-before|perspective|perspective-origin|pitch|pitch-range|play-during|polar-angle|polar-distance|position|presentation-level|quotes|region-fragment|resize|rest|rest-after|rest-before|richness|right|rotation|rotation-point|ruby-align|ruby-merge|ruby-position|running|scroll-snap-coordinate|scroll-snap-destination|scroll-snap-points-x|scroll-snap-points-y|scroll-snap-type|shape-image-threshold|shape-inside|shape-margin|shape-outside|size|speak|speak-as|speak-header|speak-numeral|speak-punctuation|speech-rate|stress|string-set|tab-size|table-layout|text-align|text-align-last|text-combine-upright|text-decoration|text-decoration-color|text-decoration-line|text-decoration-skip|text-decoration-style|text-emphasis|text-emphasis-color|text-emphasis-position|text-emphasis-style|text-indent|text-justify|text-orientation|text-overflow|text-shadow|text-space-collapse|text-space-trim|text-spacing|text-transform|text-underline-position|text-wrap|top|transform|transform-origin|transform-style|transition|transition-delay|transition-duration|transition-property|transition-timing-function|unicode-bidi|user-select|vertical-align|visibility|voice-balance|voice-duration|voice-family|voice-pitch|voice-range|voice-rate|voice-stress|voice-volume|volume|white-space|widows|width|will-change|word-break|word-spacing|word-wrap|wrap-after|wrap-before|wrap-flow|wrap-inside|wrap-through|writing-mode|z-index)(\s*)(\:)`, ByGroups(Keyword, Text, Punctuation), Push("value-start")}, + {`(--[a-zA-Z_][\w-]*)(\s*)(\:)`, ByGroups(NameVariable, Text, Punctuation), Push("value-start")}, + {`([a-zA-Z_][\w-]*)(\s*)(\:)`, ByGroups(Name, Text, Punctuation), Push("value-start")}, + {`/\*(?:.|\n)*?\*/`, Comment, nil}, + }, + "value-start": { + Include("common-values"), + {Words(``, `\b`, `align-content`, `align-items`, `align-self`, `alignment-baseline`, `all`, `animation`, `animation-delay`, `animation-direction`, `animation-duration`, `animation-fill-mode`, `animation-iteration-count`, `animation-name`, `animation-play-state`, `animation-timing-function`, `appearance`, `azimuth`, `backface-visibility`, `background`, `background-attachment`, `background-blend-mode`, `background-clip`, `background-color`, `background-image`, `background-origin`, `background-position`, `background-repeat`, `background-size`, `baseline-shift`, `bookmark-label`, `bookmark-level`, `bookmark-state`, `border`, `border-bottom`, `border-bottom-color`, `border-bottom-left-radius`, `border-bottom-right-radius`, `border-bottom-style`, `border-bottom-width`, `border-boundary`, `border-collapse`, `border-color`, `border-image`, `border-image-outset`, `border-image-repeat`, `border-image-slice`, `border-image-source`, `border-image-width`, `border-left`, `border-left-color`, `border-left-style`, `border-left-width`, `border-radius`, `border-right`, `border-right-color`, `border-right-style`, `border-right-width`, `border-spacing`, `border-style`, `border-top`, `border-top-color`, `border-top-left-radius`, `border-top-right-radius`, `border-top-style`, `border-top-width`, `border-width`, `bottom`, `box-decoration-break`, `box-shadow`, `box-sizing`, `box-snap`, `box-suppress`, `break-after`, `break-before`, `break-inside`, `caption-side`, `caret`, `caret-animation`, `caret-color`, `caret-shape`, `chains`, `clear`, `clip`, `clip-path`, `clip-rule`, `color`, `color-interpolation-filters`, `column-count`, `column-fill`, `column-gap`, `column-rule`, `column-rule-color`, `column-rule-style`, `column-rule-width`, `column-span`, `column-width`, `columns`, `content`, `counter-increment`, `counter-reset`, `counter-set`, `crop`, `cue`, `cue-after`, `cue-before`, `cursor`, `direction`, `display`, `dominant-baseline`, `elevation`, `empty-cells`, `filter`, `flex`, `flex-basis`, `flex-direction`, `flex-flow`, `flex-grow`, `flex-shrink`, `flex-wrap`, `float`, `float-defer`, `float-offset`, `float-reference`, `flood-color`, `flood-opacity`, `flow`, `flow-from`, `flow-into`, `font`, `font-family`, `font-feature-settings`, `font-kerning`, `font-language-override`, `font-size`, `font-size-adjust`, `font-stretch`, `font-style`, `font-synthesis`, `font-variant`, `font-variant-alternates`, `font-variant-caps`, `font-variant-east-asian`, `font-variant-ligatures`, `font-variant-numeric`, `font-variant-position`, `font-weight`, `footnote-display`, `footnote-policy`, `glyph-orientation-vertical`, `grid`, `grid-area`, `grid-auto-columns`, `grid-auto-flow`, `grid-auto-rows`, `grid-column`, `grid-column-end`, `grid-column-gap`, `grid-column-start`, `grid-gap`, `grid-row`, `grid-row-end`, `grid-row-gap`, `grid-row-start`, `grid-template`, `grid-template-areas`, `grid-template-columns`, `grid-template-rows`, `hanging-punctuation`, `height`, `hyphenate-character`, `hyphenate-limit-chars`, `hyphenate-limit-last`, `hyphenate-limit-lines`, `hyphenate-limit-zone`, `hyphens`, `image-orientation`, `image-resolution`, `initial-letter`, `initial-letter-align`, `initial-letter-wrap`, `isolation`, `justify-content`, `justify-items`, `justify-self`, `left`, `letter-spacing`, `lighting-color`, `line-break`, `line-grid`, `line-height`, `line-snap`, `list-style`, `list-style-image`, `list-style-position`, `list-style-type`, `margin`, `margin-bottom`, `margin-left`, `margin-right`, `margin-top`, `marker-side`, `marquee-direction`, `marquee-loop`, `marquee-speed`, `marquee-style`, `mask`, `mask-border`, `mask-border-mode`, `mask-border-outset`, `mask-border-repeat`, `mask-border-slice`, `mask-border-source`, `mask-border-width`, `mask-clip`, `mask-composite`, `mask-image`, `mask-mode`, `mask-origin`, `mask-position`, `mask-repeat`, `mask-size`, `mask-type`, `max-height`, `max-lines`, `max-width`, `min-height`, `min-width`, `mix-blend-mode`, `motion`, `motion-offset`, `motion-path`, `motion-rotation`, `move-to`, `nav-down`, `nav-left`, `nav-right`, `nav-up`, `object-fit`, `object-position`, `offset-after`, `offset-before`, `offset-end`, `offset-start`, `opacity`, `order`, `orphans`, `outline`, `outline-color`, `outline-offset`, `outline-style`, `outline-width`, `overflow`, `overflow-style`, `overflow-wrap`, `overflow-x`, `overflow-y`, `padding`, `padding-bottom`, `padding-left`, `padding-right`, `padding-top`, `page`, `page-break-after`, `page-break-before`, `page-break-inside`, `page-policy`, `pause`, `pause-after`, `pause-before`, `perspective`, `perspective-origin`, `pitch`, `pitch-range`, `play-during`, `polar-angle`, `polar-distance`, `position`, `presentation-level`, `quotes`, `region-fragment`, `resize`, `rest`, `rest-after`, `rest-before`, `richness`, `right`, `rotation`, `rotation-point`, `ruby-align`, `ruby-merge`, `ruby-position`, `running`, `scroll-snap-coordinate`, `scroll-snap-destination`, `scroll-snap-points-x`, `scroll-snap-points-y`, `scroll-snap-type`, `shape-image-threshold`, `shape-inside`, `shape-margin`, `shape-outside`, `size`, `speak`, `speak-as`, `speak-header`, `speak-numeral`, `speak-punctuation`, `speech-rate`, `stress`, `string-set`, `tab-size`, `table-layout`, `text-align`, `text-align-last`, `text-combine-upright`, `text-decoration`, `text-decoration-color`, `text-decoration-line`, `text-decoration-skip`, `text-decoration-style`, `text-emphasis`, `text-emphasis-color`, `text-emphasis-position`, `text-emphasis-style`, `text-indent`, `text-justify`, `text-orientation`, `text-overflow`, `text-shadow`, `text-space-collapse`, `text-space-trim`, `text-spacing`, `text-transform`, `text-underline-position`, `text-wrap`, `top`, `transform`, `transform-origin`, `transform-style`, `transition`, `transition-delay`, `transition-duration`, `transition-property`, `transition-timing-function`, `unicode-bidi`, `user-select`, `vertical-align`, `visibility`, `voice-balance`, `voice-duration`, `voice-family`, `voice-pitch`, `voice-range`, `voice-rate`, `voice-stress`, `voice-volume`, `volume`, `white-space`, `widows`, `width`, `will-change`, `word-break`, `word-spacing`, `word-wrap`, `wrap-after`, `wrap-before`, `wrap-flow`, `wrap-inside`, `wrap-through`, `writing-mode`, `z-index`), Keyword, nil}, + {`\!important`, CommentPreproc, nil}, + {`/\*(?:.|\n)*?\*/`, Comment, nil}, + Include("numeric-values"), + {`[~^*!%&<>|+=@:./?-]+`, Operator, nil}, + {`[\[\](),]+`, Punctuation, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + {`[a-zA-Z_][\w-]*`, Name, nil}, + {`;`, Punctuation, Pop(1)}, + {`\}`, Punctuation, Pop(2)}, + }, + "function-start": { + Include("common-values"), + {`/\*(?:.|\n)*?\*/`, Comment, nil}, + Include("numeric-values"), + {`[*+/-]`, Operator, nil}, + {`[,]`, Punctuation, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + {`[a-zA-Z_-]\w*`, Name, nil}, + {`\(`, Punctuation, Push("atparenthesis")}, + {`\)`, Punctuation, Pop(1)}, + }, + "common-values": { + {`\s+`, Text, nil}, + {Words(``, ``, `-ms-`, `mso-`, `-moz-`, `-o-`, `-xv-`, `-atsc-`, `-wap-`, `-khtml-`, `-webkit-`, `prince-`, `-ah-`, `-hp-`, `-ro-`, `-rim-`, `-tc-`), KeywordPseudo, nil}, + Include("urls"), + {`(attr|blackness|blend|blenda|blur|brightness|calc|circle|color-mod|contrast|counter|cubic-bezier|device-cmyk|drop-shadow|ellipse|gray|grayscale|hsl|hsla|hue|hue-rotate|hwb|image|inset|invert|lightness|linear-gradient|matrix|matrix3d|opacity|perspective|polygon|radial-gradient|rect|repeating-linear-gradient|repeating-radial-gradient|rgb|rgba|rotate|rotate3d|rotateX|rotateY|rotateZ|saturate|saturation|scale|scale3d|scaleX|scaleY|scaleZ|sepia|shade|skewX|skewY|steps|tint|toggle|translate|translate3d|translateX|translateY|translateZ|whiteness)(\()`, ByGroups(NameBuiltin, Punctuation), Push("function-start")}, + {`([a-zA-Z_][\w-]+)(\()`, ByGroups(NameFunction, Punctuation), Push("function-start")}, + {Words(``, `\b`, `absolute`, `alias`, `all`, `all-petite-caps`, `all-scroll`, `all-small-caps`, `allow-end`, `alpha`, `alternate`, `alternate-reverse`, `always`, `armenian`, `auto`, `avoid`, `avoid-column`, `avoid-page`, `backwards`, `balance`, `baseline`, `below`, `blink`, `block`, `bold`, `bolder`, `border-box`, `both`, `bottom`, `box-decoration`, `break-word`, `capitalize`, `cell`, `center`, `circle`, `clip`, `clone`, `close-quote`, `col-resize`, `collapse`, `color`, `color-burn`, `color-dodge`, `column`, `column-reverse`, `compact`, `condensed`, `contain`, `container`, `content-box`, `context-menu`, `copy`, `cover`, `crisp-edges`, `crosshair`, `currentColor`, `cursive`, `darken`, `dashed`, `decimal`, `decimal-leading-zero`, `default`, `descendants`, `difference`, `digits`, `disc`, `distribute`, `dot`, `dotted`, `double`, `double-circle`, `e-resize`, `each-line`, `ease`, `ease-in`, `ease-in-out`, `ease-out`, `edges`, `ellipsis`, `end`, `ew-resize`, `exclusion`, `expanded`, `extra-condensed`, `extra-expanded`, `fantasy`, `fill`, `fill-box`, `filled`, `first`, `fixed`, `flat`, `flex`, `flex-end`, `flex-start`, `flip`, `force-end`, `forwards`, `from-image`, `full-width`, `geometricPrecision`, `georgian`, `groove`, `hanging`, `hard-light`, `help`, `hidden`, `hide`, `horizontal`, `hue`, `icon`, `infinite`, `inherit`, `initial`, `ink`, `inline`, `inline-block`, `inline-flex`, `inline-table`, `inset`, `inside`, `inter-word`, `invert`, `isolate`, `italic`, `justify`, `large`, `larger`, `last`, `left`, `lighten`, `lighter`, `line-through`, `linear`, `list-item`, `local`, `loose`, `lower-alpha`, `lower-greek`, `lower-latin`, `lower-roman`, `lowercase`, `ltr`, `luminance`, `luminosity`, `mandatory`, `manipulation`, `manual`, `margin-box`, `match-parent`, `medium`, `mixed`, `monospace`, `move`, `multiply`, `n-resize`, `ne-resize`, `nesw-resize`, `no-close-quote`, `no-drop`, `no-open-quote`, `no-repeat`, `none`, `normal`, `not-allowed`, `nowrap`, `ns-resize`, `nw-resize`, `nwse-resize`, `objects`, `oblique`, `off`, `on`, `open`, `open-quote`, `optimizeLegibility`, `optimizeSpeed`, `outset`, `outside`, `over`, `overlay`, `overline`, `padding-box`, `page`, `pan-down`, `pan-left`, `pan-right`, `pan-up`, `pan-x`, `pan-y`, `paused`, `petite-caps`, `pixelated`, `pointer`, `preserve-3d`, `progress`, `proximity`, `relative`, `repeat`, `repeat no-repeat`, `repeat-x`, `repeat-y`, `reverse`, `ridge`, `right`, `round`, `row`, `row-resize`, `row-reverse`, `rtl`, `ruby`, `ruby-base`, `ruby-base-container`, `ruby-text`, `ruby-text-container`, `run-in`, `running`, `s-resize`, `sans-serif`, `saturation`, `scale-down`, `screen`, `scroll`, `se-resize`, `semi-condensed`, `semi-expanded`, `separate`, `serif`, `sesame`, `show`, `sideways`, `sideways-left`, `sideways-right`, `slice`, `small`, `small-caps`, `smaller`, `smooth`, `snap`, `soft-light`, `solid`, `space`, `space-around`, `space-between`, `spaces`, `square`, `start`, `static`, `step-end`, `step-start`, `sticky`, `stretch`, `strict`, `stroke-box`, `style`, `sw-resize`, `table`, `table-caption`, `table-cell`, `table-column`, `table-column-group`, `table-footer-group`, `table-header-group`, `table-row`, `table-row-group`, `text`, `thick`, `thin`, `titling-caps`, `to`, `top`, `triangle`, `ultra-condensed`, `ultra-expanded`, `under`, `underline`, `unicase`, `unset`, `upper-alpha`, `upper-latin`, `upper-roman`, `uppercase`, `upright`, `use-glyph-orientation`, `vertical`, `vertical-text`, `view-box`, `visible`, `w-resize`, `wait`, `wavy`, `weight`, `weight style`, `wrap`, `wrap-reverse`, `x-large`, `x-small`, `xx-large`, `xx-small`, `zoom-in`, `zoom-out`), KeywordConstant, nil}, + {Words(``, `\b`, `above`, `aural`, `behind`, `bidi-override`, `center-left`, `center-right`, `cjk-ideographic`, `continuous`, `crop`, `cross`, `embed`, `far-left`, `far-right`, `fast`, `faster`, `hebrew`, `high`, `higher`, `hiragana`, `hiragana-iroha`, `katakana`, `katakana-iroha`, `landscape`, `left-side`, `leftwards`, `level`, `loud`, `low`, `lower`, `message-box`, `middle`, `mix`, `narrower`, `once`, `portrait`, `right-side`, `rightwards`, `silent`, `slow`, `slower`, `small-caption`, `soft`, `spell-out`, `status-bar`, `super`, `text-bottom`, `text-top`, `wider`, `x-fast`, `x-high`, `x-loud`, `x-low`, `x-soft`, `yes`, `pre`, `pre-wrap`, `pre-line`), KeywordConstant, nil}, + {Words(``, `\b`, `aliceblue`, `antiquewhite`, `aqua`, `aquamarine`, `azure`, `beige`, `bisque`, `black`, `blanchedalmond`, `blue`, `blueviolet`, `brown`, `burlywood`, `cadetblue`, `chartreuse`, `chocolate`, `coral`, `cornflowerblue`, `cornsilk`, `crimson`, `cyan`, `darkblue`, `darkcyan`, `darkgoldenrod`, `darkgray`, `darkgreen`, `darkgrey`, `darkkhaki`, `darkmagenta`, `darkolivegreen`, `darkorange`, `darkorchid`, `darkred`, `darksalmon`, `darkseagreen`, `darkslateblue`, `darkslategray`, `darkslategrey`, `darkturquoise`, `darkviolet`, `deeppink`, `deepskyblue`, `dimgray`, `dimgrey`, `dodgerblue`, `firebrick`, `floralwhite`, `forestgreen`, `fuchsia`, `gainsboro`, `ghostwhite`, `gold`, `goldenrod`, `gray`, `green`, `greenyellow`, `grey`, `honeydew`, `hotpink`, `indianred`, `indigo`, `ivory`, `khaki`, `lavender`, `lavenderblush`, `lawngreen`, `lemonchiffon`, `lightblue`, `lightcoral`, `lightcyan`, `lightgoldenrodyellow`, `lightgray`, `lightgreen`, `lightgrey`, `lightpink`, `lightsalmon`, `lightseagreen`, `lightskyblue`, `lightslategray`, `lightslategrey`, `lightsteelblue`, `lightyellow`, `lime`, `limegreen`, `linen`, `magenta`, `maroon`, `mediumaquamarine`, `mediumblue`, `mediumorchid`, `mediumpurple`, `mediumseagreen`, `mediumslateblue`, `mediumspringgreen`, `mediumturquoise`, `mediumvioletred`, `midnightblue`, `mintcream`, `mistyrose`, `moccasin`, `navajowhite`, `navy`, `oldlace`, `olive`, `olivedrab`, `orange`, `orangered`, `orchid`, `palegoldenrod`, `palegreen`, `paleturquoise`, `palevioletred`, `papayawhip`, `peachpuff`, `peru`, `pink`, `plum`, `powderblue`, `purple`, `rebeccapurple`, `red`, `rosybrown`, `royalblue`, `saddlebrown`, `salmon`, `sandybrown`, `seagreen`, `seashell`, `sienna`, `silver`, `skyblue`, `slateblue`, `slategray`, `slategrey`, `snow`, `springgreen`, `steelblue`, `tan`, `teal`, `thistle`, `tomato`, `turquoise`, `violet`, `wheat`, `white`, `whitesmoke`, `yellow`, `yellowgreen`, `transparent`), KeywordConstant, nil}, + }, + "urls": { + {`(url)(\()(".*?")(\))`, ByGroups(NameBuiltin, Punctuation, LiteralStringDouble, Punctuation), nil}, + {`(url)(\()('.*?')(\))`, ByGroups(NameBuiltin, Punctuation, LiteralStringSingle, Punctuation), nil}, + {`(url)(\()(.*?)(\))`, ByGroups(NameBuiltin, Punctuation, LiteralStringOther, Punctuation), nil}, + }, + "numeric-values": { + {`\#[a-zA-Z0-9]{1,6}`, LiteralNumberHex, nil}, + {`[+\-]?[0-9]*[.][0-9]+`, LiteralNumberFloat, Push("numeric-end")}, + {`[+\-]?[0-9]+`, LiteralNumberInteger, Push("numeric-end")}, + }, + "numeric-end": { + {Words(``, `\b`, `deg`, `grad`, `rad`, `turn`, `Hz`, `kHz`, `em`, `ex`, `ch`, `rem`, `vh`, `vw`, `vmin`, `vmax`, `px`, `mm`, `cm`, `in`, `pt`, `pc`, `q`, `dpi`, `dpcm`, `dppx`, `s`, `ms`), KeywordType, nil}, + {`%`, KeywordType, nil}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/cython.go b/vendor/github.com/alecthomas/chroma/lexers/c/cython.go new file mode 100644 index 0000000..0cce204 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/c/cython.go @@ -0,0 +1,139 @@ +package c + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Cython lexer. +var Cython = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Cython", + Aliases: []string{"cython", "pyx", "pyrex"}, + Filenames: []string{"*.pyx", "*.pxd", "*.pxi"}, + MimeTypes: []string{"text/x-cython", "application/x-cython"}, + }, + cythonRules, +)) + +func cythonRules() Rules { + return Rules{ + "root": { + {`\n`, Text, nil}, + {`^(\s*)("""(?:.|\n)*?""")`, ByGroups(Text, LiteralStringDoc), nil}, + {`^(\s*)('''(?:.|\n)*?''')`, ByGroups(Text, LiteralStringDoc), nil}, + {`[^\S\n]+`, Text, nil}, + {`#.*$`, Comment, nil}, + {`[]{}:(),;[]`, Punctuation, nil}, + {`\\\n`, Text, nil}, + {`\\`, Text, nil}, + {`(in|is|and|or|not)\b`, OperatorWord, nil}, + {`(<)([a-zA-Z0-9.?]+)(>)`, ByGroups(Punctuation, KeywordType, Punctuation), nil}, + {`!=|==|<<|>>|[-~+/*%=<>&^|.?]`, Operator, nil}, + {`(from)(\d+)(<=)(\s+)(<)(\d+)(:)`, ByGroups(Keyword, LiteralNumberInteger, Operator, Name, Operator, Name, Punctuation), nil}, + Include("keywords"), + {`(def|property)(\s+)`, ByGroups(Keyword, Text), Push("funcname")}, + {`(cp?def)(\s+)`, ByGroups(Keyword, Text), Push("cdef")}, + {`(cdef)(:)`, ByGroups(Keyword, Punctuation), nil}, + {`(class|struct)(\s+)`, ByGroups(Keyword, Text), Push("classname")}, + {`(from)(\s+)`, ByGroups(Keyword, Text), Push("fromimport")}, + {`(c?import)(\s+)`, ByGroups(Keyword, Text), Push("import")}, + Include("builtins"), + Include("backtick"), + {`(?:[rR]|[uU][rR]|[rR][uU])"""`, LiteralString, Push("tdqs")}, + {`(?:[rR]|[uU][rR]|[rR][uU])'''`, LiteralString, Push("tsqs")}, + {`(?:[rR]|[uU][rR]|[rR][uU])"`, LiteralString, Push("dqs")}, + {`(?:[rR]|[uU][rR]|[rR][uU])'`, LiteralString, Push("sqs")}, + {`[uU]?"""`, LiteralString, Combined("stringescape", "tdqs")}, + {`[uU]?'''`, LiteralString, Combined("stringescape", "tsqs")}, + {`[uU]?"`, LiteralString, Combined("stringescape", "dqs")}, + {`[uU]?'`, LiteralString, Combined("stringescape", "sqs")}, + Include("name"), + Include("numbers"), + }, + "keywords": { + {Words(``, `\b`, `assert`, `break`, `by`, `continue`, `ctypedef`, `del`, `elif`, `else`, `except`, `except?`, `exec`, `finally`, `for`, `fused`, `gil`, `global`, `if`, `include`, `lambda`, `nogil`, `pass`, `print`, `raise`, `return`, `try`, `while`, `yield`, `as`, `with`), Keyword, nil}, + {`(DEF|IF|ELIF|ELSE)\b`, CommentPreproc, nil}, + }, + "builtins": { + {Words(`(?`, CommentPreproc, Pop(1)}, + {`(<<<)([\'"]?)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*)(\2\n.*?\n\s*)(\3)(;?)(\n)`, ByGroups(LiteralString, LiteralString, LiteralStringDelimiter, LiteralString, LiteralStringDelimiter, Punctuation, Text), nil}, + {`\s+`, Text, nil}, + {`#.*?\n`, CommentSingle, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*\*/`, CommentMultiline, nil}, + {`/\*\*.*?\*/`, LiteralStringDoc, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`(->|::)(\s*)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*)`, ByGroups(Operator, Text, NameAttribute), nil}, + {`[~!%^&*+=|:.<>/@-]+`, Operator, nil}, + {`\?`, Operator, nil}, + {`[\[\]{}();,]+`, Punctuation, nil}, + {`(class)(\s+)`, ByGroups(Keyword, Text), Push("classname")}, + {`(function)(\s*)(?=\()`, ByGroups(Keyword, Text), nil}, + {`(function)(\s+)(&?)(\s*)`, ByGroups(Keyword, Text, Operator, Text), Push("functionname")}, + {`(const)(\s+)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*)`, ByGroups(Keyword, Text, NameConstant), nil}, + {`(and|E_PARSE|old_function|E_ERROR|or|as|E_WARNING|parent|eval|PHP_OS|break|exit|case|extends|PHP_VERSION|cfunction|FALSE|print|for|require|continue|foreach|require_once|declare|return|default|static|do|switch|die|stdClass|echo|else|TRUE|elseif|var|empty|if|xor|enddeclare|include|virtual|endfor|include_once|while|endforeach|global|endif|list|endswitch|new|endwhile|not|array|E_ALL|NULL|final|php_user_filter|interface|implements|public|private|protected|abstract|clone|try|catch|throw|this|use|namespace|trait|yield|finally)\b`, Keyword, nil}, + {`(true|false|null)\b`, KeywordConstant, nil}, + Include("magicconstants"), + {`\$\{\$+(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*\}`, NameVariable, nil}, + {`\$+(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*`, NameVariable, nil}, + {`(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*`, NameOther, nil}, + {`(\d+\.\d*|\d*\.\d+)(e[+-]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`\d+e[+-]?[0-9]+`, LiteralNumberFloat, nil}, + {`0[0-7]+`, LiteralNumberOct, nil}, + {`0x[a-f0-9_]+`, LiteralNumberHex, nil}, + {`\d[\d_]*`, LiteralNumberInteger, nil}, + {`0b[01]+`, LiteralNumberBin, nil}, + {`'([^'\\]*(?:\\.[^'\\]*)*)'`, LiteralStringSingle, nil}, + {"`([^`\\\\]*(?:\\\\.[^`\\\\]*)*)`", LiteralStringBacktick, nil}, + {`"`, LiteralStringDouble, Push("string")}, + }, + "magicfuncs": { + {Words(``, `\b`, `__construct`, `__destruct`, `__call`, `__callStatic`, `__get`, `__set`, `__isset`, `__unset`, `__sleep`, `__wakeup`, `__toString`, `__invoke`, `__set_state`, `__clone`, `__debugInfo`), NameFunctionMagic, nil}, + }, + "magicconstants": { + {Words(``, `\b`, `__LINE__`, `__FILE__`, `__DIR__`, `__FUNCTION__`, `__CLASS__`, `__TRAIT__`, `__METHOD__`, `__NAMESPACE__`), NameConstant, nil}, + }, + "classname": { + {`(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*`, NameClass, Pop(1)}, + }, + "functionname": { + Include("magicfuncs"), + {`(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*`, NameFunction, Pop(1)}, + Default(Pop(1)), + }, + "string": { + {`"`, LiteralStringDouble, Pop(1)}, + {`[^{$"\\]+`, LiteralStringDouble, nil}, + {`\\([nrt"$\\]|[0-7]{1,3}|x[0-9a-f]{1,2})`, LiteralStringEscape, nil}, + {`\$(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*(\[\S+?\]|->(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w]|[^\x00-\x7f])*)?`, LiteralStringInterpol, nil}, + {`(\{\$\{)(.*?)(\}\})`, ByGroups(LiteralStringInterpol, UsingSelf("root"), LiteralStringInterpol), nil}, + {`(\{)(\$.*?)(\})`, ByGroups(LiteralStringInterpol, UsingSelf("root"), LiteralStringInterpol), nil}, + {`(\$\{)(\S+)(\})`, ByGroups(LiteralStringInterpol, NameVariable, LiteralStringInterpol), nil}, + {`[${\\]`, LiteralStringDouble, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/circular/phtml.go b/vendor/github.com/alecthomas/chroma/lexers/circular/phtml.go new file mode 100644 index 0000000..fc2e2ea --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/circular/phtml.go @@ -0,0 +1,39 @@ +package circular + +import ( + "strings" + + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/h" + "github.com/alecthomas/chroma/lexers/internal" +) + +// PHTML lexer is PHP in HTML. +var PHTML = internal.Register(DelegatingLexer(h.HTML, MustNewLazyLexer( + &Config{ + Name: "PHTML", + Aliases: []string{"phtml"}, + Filenames: []string{"*.phtml", "*.php", "*.php[345]", "*.inc"}, + MimeTypes: []string{"application/x-php", "application/x-httpd-php", "application/x-httpd-php3", "application/x-httpd-php4", "application/x-httpd-php5", "text/x-php"}, + DotAll: true, + CaseInsensitive: true, + EnsureNL: true, + Priority: 2, + }, + phtmlRules, +).SetAnalyser(func(text string) float32 { + if strings.Contains(text, "]*\s+)+?)((?:[^\W\d]|\$)[\w$]*)(\s*)(\()`, ByGroups(UsingSelf("root"), NameFunction, Text, Operator), nil}, + + // https://dlang.org/spec/attribute.html#uda + {`@[\w.]*`, NameDecorator, nil}, + {`(abstract|auto|alias|align|const|delegate|enum|export|final|function|inout|lazy|nothrow|override|package|private|protected|public|pure|static|synchronized|template|volatile|__gshared)\b`, KeywordDeclaration, nil}, + + // https://dlang.org/spec/type.html#basic-data-types + {`(void|bool|byte|ubyte|short|ushort|int|uint|long|ulong|cent|ucent|float|double|real|ifloat|idouble|ireal|cfloat|cdouble|creal|char|wchar|dchar|string|wstring|dstring)\b`, KeywordType, nil}, + {`(module)(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + {`(true|false|null)\b`, KeywordConstant, nil}, + {`(class|interface|struct|template|union)(\s+)`, ByGroups(KeywordDeclaration, Text), Push("class")}, + {`(import)(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + + // https://dlang.org/spec/lex.html#string_literals + // TODO support delimited strings + {`[qr]?"(\\\\|\\"|[^"])*"[cwd]?`, LiteralString, nil}, + {"(`)([^`]*)(`)[cwd]?", LiteralString, nil}, + {`'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'`, LiteralStringChar, nil}, + {`(\.)((?:[^\W\d]|\$)[\w$]*)`, ByGroups(Operator, NameAttribute), nil}, + {`^\s*([^\W\d]|\$)[\w$]*:`, NameLabel, nil}, + + // https://dlang.org/spec/lex.html#floatliteral + {`([0-9][0-9_]*\.([0-9][0-9_]*)?|\.[0-9][0-9_]*)([eE][+\-]?[0-9][0-9_]*)?[fFL]?i?|[0-9][eE][+\-]?[0-9][0-9_]*[fFL]?|[0-9]([eE][+\-]?[0-9][0-9_]*)?[fFL]|0[xX]([0-9a-fA-F][0-9a-fA-F_]*\.?|([0-9a-fA-F][0-9a-fA-F_]*)?\.[0-9a-fA-F][0-9a-fA-F_]*)[pP][+\-]?[0-9][0-9_]*[fFL]?`, LiteralNumberFloat, nil}, + // https://dlang.org/spec/lex.html#integerliteral + {`0[xX][0-9a-fA-F][0-9a-fA-F_]*[lL]?`, LiteralNumberHex, nil}, + {`0[bB][01][01_]*[lL]?`, LiteralNumberBin, nil}, + {`0[0-7_]+[lL]?`, LiteralNumberOct, nil}, + {`0|[1-9][0-9_]*[lL]?`, LiteralNumberInteger, nil}, + {`([~^*!%&\[\](){}<>|+=:;,./?-]|q{)`, Operator, nil}, + {`([^\W\d]|\$)[\w$]*`, Name, nil}, + {`\n`, Text, nil}, + }, + "class": { + {`([^\W\d]|\$)[\w$]*`, NameClass, Pop(1)}, + }, + "import": { + {`[\w.]+\*?`, NameNamespace, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/d/dart.go b/vendor/github.com/alecthomas/chroma/lexers/d/dart.go new file mode 100644 index 0000000..c1dbb5c --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/d/dart.go @@ -0,0 +1,95 @@ +package d + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Dart lexer. +var Dart = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Dart", + Aliases: []string{"dart"}, + Filenames: []string{"*.dart"}, + MimeTypes: []string{"text/x-dart"}, + DotAll: true, + }, + dartRules, +)) + +func dartRules() Rules { + return Rules{ + "root": { + Include("string_literal"), + {`#!(.*?)$`, CommentPreproc, nil}, + {`\b(import|export)\b`, Keyword, Push("import_decl")}, + {`\b(library|source|part of|part)\b`, Keyword, nil}, + {`[^\S\n]+`, Text, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`\b(class)\b(\s+)`, ByGroups(KeywordDeclaration, Text), Push("class")}, + {`\b(assert|break|case|catch|continue|default|do|else|finally|for|if|in|is|new|return|super|switch|this|throw|try|while)\b`, Keyword, nil}, + {`\b(abstract|async|await|const|extends|factory|final|get|implements|native|operator|set|static|sync|typedef|var|with|yield)\b`, KeywordDeclaration, nil}, + {`\b(bool|double|dynamic|int|num|Object|String|void)\b`, KeywordType, nil}, + {`\b(false|null|true)\b`, KeywordConstant, nil}, + {`[~!%^&*+=|?:<>/-]|as\b`, Operator, nil}, + {`[a-zA-Z_$]\w*:`, NameLabel, nil}, + {`[a-zA-Z_$]\w*`, Name, nil}, + {`[(){}\[\],.;]`, Punctuation, nil}, + {`0[xX][0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`\d+(\.\d*)?([eE][+-]?\d+)?`, LiteralNumber, nil}, + {`\.\d+([eE][+-]?\d+)?`, LiteralNumber, nil}, + {`\n`, Text, nil}, + }, + "class": { + {`[a-zA-Z_$]\w*`, NameClass, Pop(1)}, + }, + "import_decl": { + Include("string_literal"), + {`\s+`, Text, nil}, + {`\b(as|show|hide)\b`, Keyword, nil}, + {`[a-zA-Z_$]\w*`, Name, nil}, + {`\,`, Punctuation, nil}, + {`\;`, Punctuation, Pop(1)}, + }, + "string_literal": { + {`r"""([\w\W]*?)"""`, LiteralStringDouble, nil}, + {`r'''([\w\W]*?)'''`, LiteralStringSingle, nil}, + {`r"(.*?)"`, LiteralStringDouble, nil}, + {`r'(.*?)'`, LiteralStringSingle, nil}, + {`"""`, LiteralStringDouble, Push("string_double_multiline")}, + {`'''`, LiteralStringSingle, Push("string_single_multiline")}, + {`"`, LiteralStringDouble, Push("string_double")}, + {`'`, LiteralStringSingle, Push("string_single")}, + }, + "string_common": { + {`\\(x[0-9A-Fa-f]{2}|u[0-9A-Fa-f]{4}|u\{[0-9A-Fa-f]*\}|[a-z'\"$\\])`, LiteralStringEscape, nil}, + {`(\$)([a-zA-Z_]\w*)`, ByGroups(LiteralStringInterpol, Name), nil}, + {`(\$\{)(.*?)(\})`, ByGroups(LiteralStringInterpol, UsingSelf("root"), LiteralStringInterpol), nil}, + }, + "string_double": { + {`"`, LiteralStringDouble, Pop(1)}, + {`[^"$\\\n]+`, LiteralStringDouble, nil}, + Include("string_common"), + {`\$+`, LiteralStringDouble, nil}, + }, + "string_double_multiline": { + {`"""`, LiteralStringDouble, Pop(1)}, + {`[^"$\\]+`, LiteralStringDouble, nil}, + Include("string_common"), + {`(\$|\")+`, LiteralStringDouble, nil}, + }, + "string_single": { + {`'`, LiteralStringSingle, Pop(1)}, + {`[^'$\\\n]+`, LiteralStringSingle, nil}, + Include("string_common"), + {`\$+`, LiteralStringSingle, nil}, + }, + "string_single_multiline": { + {`'''`, LiteralStringSingle, Pop(1)}, + {`[^\'$\\]+`, LiteralStringSingle, nil}, + Include("string_common"), + {`(\$|\')+`, LiteralStringSingle, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/d/diff.go b/vendor/github.com/alecthomas/chroma/lexers/d/diff.go new file mode 100644 index 0000000..d4d6db4 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/d/diff.go @@ -0,0 +1,33 @@ +package d + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Diff lexer. +var Diff = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Diff", + Aliases: []string{"diff", "udiff"}, + EnsureNL: true, + Filenames: []string{"*.diff", "*.patch"}, + MimeTypes: []string{"text/x-diff", "text/x-patch"}, + }, + diffRules, +)) + +func diffRules() Rules { + return Rules{ + "root": { + {` .*\n`, Text, nil}, + {`\+.*\n`, GenericInserted, nil}, + {`-.*\n`, GenericDeleted, nil}, + {`!.*\n`, GenericStrong, nil}, + {`@.*\n`, GenericSubheading, nil}, + {`([Ii]ndex|diff).*\n`, GenericHeading, nil}, + {`=.*\n`, GenericHeading, nil}, + {`.*\n`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/d/django.go b/vendor/github.com/alecthomas/chroma/lexers/d/django.go new file mode 100644 index 0000000..5d3baa9 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/d/django.go @@ -0,0 +1,57 @@ +package d + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Django/Jinja lexer. +var DjangoJinja = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Django/Jinja", + Aliases: []string{"django", "jinja"}, + Filenames: []string{}, + MimeTypes: []string{"application/x-django-templating", "application/x-jinja"}, + DotAll: true, + }, + djangoJinjaRules, +)) + +func djangoJinjaRules() Rules { + return Rules{ + "root": { + {`[^{]+`, Other, nil}, + {`\{\{`, CommentPreproc, Push("var")}, + {`\{[*#].*?[*#]\}`, Comment, nil}, + {`(\{%)(-?\s*)(comment)(\s*-?)(%\})(.*?)(\{%)(-?\s*)(endcomment)(\s*-?)(%\})`, ByGroups(CommentPreproc, Text, Keyword, Text, CommentPreproc, Comment, CommentPreproc, Text, Keyword, Text, CommentPreproc), nil}, + {`(\{%)(-?\s*)(raw)(\s*-?)(%\})(.*?)(\{%)(-?\s*)(endraw)(\s*-?)(%\})`, ByGroups(CommentPreproc, Text, Keyword, Text, CommentPreproc, Text, CommentPreproc, Text, Keyword, Text, CommentPreproc), nil}, + {`(\{%)(-?\s*)(filter)(\s+)([a-zA-Z_]\w*)`, ByGroups(CommentPreproc, Text, Keyword, Text, NameFunction), Push("block")}, + {`(\{%)(-?\s*)([a-zA-Z_]\w*)`, ByGroups(CommentPreproc, Text, Keyword), Push("block")}, + {`\{`, Other, nil}, + }, + "varnames": { + {`(\|)(\s*)([a-zA-Z_]\w*)`, ByGroups(Operator, Text, NameFunction), nil}, + {`(is)(\s+)(not)?(\s+)?([a-zA-Z_]\w*)`, ByGroups(Keyword, Text, Keyword, Text, NameFunction), nil}, + {`(_|true|false|none|True|False|None)\b`, KeywordPseudo, nil}, + {`(in|as|reversed|recursive|not|and|or|is|if|else|import|with(?:(?:out)?\s*context)?|scoped|ignore\s+missing)\b`, Keyword, nil}, + {`(loop|block|super|forloop)\b`, NameBuiltin, nil}, + {`[a-zA-Z_][\w-]*`, NameVariable, nil}, + {`\.\w+`, NameVariable, nil}, + {`:?"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`:?'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + {`([{}()\[\]+\-*/,:~]|[><=]=?)`, Operator, nil}, + {`[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?`, LiteralNumber, nil}, + }, + "var": { + {`\s+`, Text, nil}, + {`(-?)(\}\})`, ByGroups(Text, CommentPreproc), Pop(1)}, + Include("varnames"), + }, + "block": { + {`\s+`, Text, nil}, + {`(-?)(%\})`, ByGroups(Text, CommentPreproc), Pop(1)}, + Include("varnames"), + {`.`, Punctuation, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/d/docker.go b/vendor/github.com/alecthomas/chroma/lexers/d/docker.go new file mode 100644 index 0000000..ea808f0 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/d/docker.go @@ -0,0 +1,35 @@ +package d + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/b" + "github.com/alecthomas/chroma/lexers/internal" + "github.com/alecthomas/chroma/lexers/j" +) + +// Docker lexer. +var Docker = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Docker", + Aliases: []string{"docker", "dockerfile"}, + Filenames: []string{"Dockerfile", "*.docker"}, + MimeTypes: []string{"text/x-dockerfile-config"}, + CaseInsensitive: true, + }, + dockerRules, +)) + +func dockerRules() Rules { + return Rules{ + "root": { + {`#.*`, Comment, nil}, + {`(ONBUILD)((?:\s*\\?\s*))`, ByGroups(Keyword, Using(b.Bash)), nil}, + {`(HEALTHCHECK)(((?:\s*\\?\s*)--\w+=\w+(?:\s*\\?\s*))*)`, ByGroups(Keyword, Using(b.Bash)), nil}, + {`(VOLUME|ENTRYPOINT|CMD|SHELL)((?:\s*\\?\s*))(\[.*?\])`, ByGroups(Keyword, Using(b.Bash), Using(j.JSON)), nil}, + {`(LABEL|ENV|ARG)((?:(?:\s*\\?\s*)\w+=\w+(?:\s*\\?\s*))*)`, ByGroups(Keyword, Using(b.Bash)), nil}, + {`((?:FROM|MAINTAINER|EXPOSE|WORKDIR|USER|STOPSIGNAL)|VOLUME)\b(.*)`, ByGroups(Keyword, LiteralString), nil}, + {`((?:RUN|CMD|ENTRYPOINT|ENV|ARG|LABEL|ADD|COPY))`, Keyword, nil}, + {`(.*\\\n)*.+`, Using(b.Bash), nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/d/dtd.go b/vendor/github.com/alecthomas/chroma/lexers/d/dtd.go new file mode 100644 index 0000000..aeec6b1 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/d/dtd.go @@ -0,0 +1,73 @@ +package d + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Dtd lexer. +var Dtd = internal.Register(MustNewLazyLexer( + &Config{ + Name: "DTD", + Aliases: []string{"dtd"}, + Filenames: []string{"*.dtd"}, + MimeTypes: []string{"application/xml-dtd"}, + DotAll: true, + }, + dtdRules, +)) + +func dtdRules() Rules { + return Rules{ + "root": { + Include("common"), + {`(\s]+)`, ByGroups(Keyword, Text, NameTag), nil}, + {`PUBLIC|SYSTEM`, KeywordConstant, nil}, + {`[\[\]>]`, Keyword, nil}, + }, + "common": { + {`\s+`, Text, nil}, + {`(%|&)[^;]*;`, NameEntity, nil}, + {``, Comment, Pop(1)}, + {`-`, Comment, nil}, + }, + "element": { + Include("common"), + {`EMPTY|ANY|#PCDATA`, KeywordConstant, nil}, + {`[^>\s|()?+*,]+`, NameTag, nil}, + {`>`, Keyword, Pop(1)}, + }, + "attlist": { + Include("common"), + {`CDATA|IDREFS|IDREF|ID|NMTOKENS|NMTOKEN|ENTITIES|ENTITY|NOTATION`, KeywordConstant, nil}, + {`#REQUIRED|#IMPLIED|#FIXED`, KeywordConstant, nil}, + {`xml:space|xml:lang`, KeywordReserved, nil}, + {`[^>\s|()?+*,]+`, NameAttribute, nil}, + {`>`, Keyword, Pop(1)}, + }, + "entity": { + Include("common"), + {`SYSTEM|PUBLIC|NDATA`, KeywordConstant, nil}, + {`[^>\s|()?+*,]+`, NameEntity, nil}, + {`>`, Keyword, Pop(1)}, + }, + "notation": { + Include("common"), + {`SYSTEM|PUBLIC`, KeywordConstant, nil}, + {`[^>\s|()?+*,]+`, NameAttribute, nil}, + {`>`, Keyword, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/d/dylan.go b/vendor/github.com/alecthomas/chroma/lexers/d/dylan.go new file mode 100644 index 0000000..feda748 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/d/dylan.go @@ -0,0 +1,76 @@ +package d + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Dylan lexer. +var Dylan = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Dylan", + Aliases: []string{"dylan"}, + Filenames: []string{"*.dylan", "*.dyl", "*.intr"}, + MimeTypes: []string{"text/x-dylan"}, + CaseInsensitive: true, + }, + func() Rules { + return Rules{ + "root": { + {`\s+`, Whitespace, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`([a-z0-9-]+:)([ \t]*)(.*(?:\n[ \t].+)*)`, ByGroups(NameAttribute, Whitespace, LiteralString), nil}, + Default(Push("code")), + }, + "code": { + {`\s+`, Whitespace, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*`, CommentMultiline, Push("comment")}, + {`"`, LiteralString, Push("string")}, + {`'(\\.|\\[0-7]{1,3}|\\x[a-f0-9]{1,2}|[^\\\'\n])'`, LiteralStringChar, nil}, + {`#b[01]+`, LiteralNumberBin, nil}, + {`#o[0-7]+`, LiteralNumberOct, nil}, + {`[-+]?(\d*\.\d+([ed][-+]?\d+)?|\d+(\.\d*)?e[-+]?\d+)`, LiteralNumberFloat, nil}, + {`[-+]?\d+`, LiteralNumberInteger, nil}, + {`#x[0-9a-f]+`, LiteralNumberHex, nil}, + + {`(\?\\?)([\w!&*<>|^$%@+~?/=-]+)(:)(token|name|variable|expression|body|case-body|\*)`, + ByGroups(Operator, NameVariable, Operator, NameBuiltin), nil}, + {`(\?)(:)(token|name|variable|expression|body|case-body|\*)`, + ByGroups(Operator, Operator, NameVariable), nil}, + {`(\?\\?)([\w!&*<>|^$%@+~?/=-]+)`, ByGroups(Operator, NameVariable), nil}, + + {`(=>|::|#\(|#\[|##|\?\?|\?=|\?|[(){}\[\],.;])`, Punctuation, nil}, + {`:=`, Operator, nil}, + {`#[tf]`, Literal, nil}, + {`#"`, LiteralStringSymbol, Push("symbol")}, + {`#[a-z0-9-]+`, Keyword, nil}, + {`#(all-keys|include|key|next|rest)`, Keyword, nil}, + {`[\w!&*<>|^$%@+~?/=-]+:`, KeywordConstant, nil}, + {`<[\w!&*<>|^$%@+~?/=-]+>`, NameClass, nil}, + {`\*[\w!&*<>|^$%@+~?/=-]+\*`, NameVariableGlobal, nil}, + {`\$[\w!&*<>|^$%@+~?/=-]+`, NameConstant, nil}, + {`(let|method|function)([ \t]+)([\w!&*<>|^$%@+~?/=-]+)`, ByGroups(NameBuiltin, Whitespace, NameVariable), nil}, + {`(error|signal|return|break)`, NameException, nil}, + {`(\\?)([\w!&*<>|^$%@+~?/=-]+)`, ByGroups(Operator, Name), nil}, + }, + "comment": { + {`[^*/]`, CommentMultiline, nil}, + {`/\*`, CommentMultiline, Push()}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[*/]`, CommentMultiline, nil}, + }, + "symbol": { + {`"`, LiteralStringSymbol, Pop(1)}, + {`[^\\"]+`, LiteralStringSymbol, nil}, + }, + "string": { + {`"`, LiteralString, Pop(1)}, + {`\\([\\abfnrtv"\']|x[a-f0-9]{2,4}|[0-7]{1,3})`, LiteralStringEscape, nil}, + {`[^\\"\n]+`, LiteralString, nil}, + {`\\\n`, LiteralString, nil}, + {`\\`, LiteralString, nil}, + }, + } + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/e/ebnf.go b/vendor/github.com/alecthomas/chroma/lexers/e/ebnf.go new file mode 100644 index 0000000..5ccdd38 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/e/ebnf.go @@ -0,0 +1,55 @@ +package e + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Ebnf lexer. +var Ebnf = internal.Register(MustNewLazyLexer( + &Config{ + Name: "EBNF", + Aliases: []string{"ebnf"}, + Filenames: []string{"*.ebnf"}, + MimeTypes: []string{"text/x-ebnf"}, + }, + ebnfRules, +)) + +func ebnfRules() Rules { + return Rules{ + "root": { + Include("whitespace"), + Include("comment_start"), + Include("identifier"), + {`=`, Operator, Push("production")}, + }, + "production": { + Include("whitespace"), + Include("comment_start"), + Include("identifier"), + {`"[^"]*"`, LiteralStringDouble, nil}, + {`'[^']*'`, LiteralStringSingle, nil}, + {`(\?[^?]*\?)`, NameEntity, nil}, + {`[\[\]{}(),|]`, Punctuation, nil}, + {`-`, Operator, nil}, + {`;`, Punctuation, Pop(1)}, + {`\.`, Punctuation, Pop(1)}, + }, + "whitespace": { + {`\s+`, Text, nil}, + }, + "comment_start": { + {`\(\*`, CommentMultiline, Push("comment")}, + }, + "comment": { + {`[^*)]`, CommentMultiline, nil}, + Include("comment_start"), + {`\*\)`, CommentMultiline, Pop(1)}, + {`[*)]`, CommentMultiline, nil}, + }, + "identifier": { + {`([a-zA-Z][\w \-]*)`, Keyword, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/e/elixir.go b/vendor/github.com/alecthomas/chroma/lexers/e/elixir.go new file mode 100644 index 0000000..f283f84 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/e/elixir.go @@ -0,0 +1,281 @@ +package e + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Elixir lexer. +var Elixir = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Elixir", + Aliases: []string{"elixir", "ex", "exs"}, + Filenames: []string{"*.ex", "*.exs"}, + MimeTypes: []string{"text/x-elixir"}, + }, + elixirRules, +)) + +func elixirRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`#.*$`, CommentSingle, nil}, + {`(\?)(\\x\{)([\da-fA-F]+)(\})`, ByGroups(LiteralStringChar, LiteralStringEscape, LiteralNumberHex, LiteralStringEscape), nil}, + {`(\?)(\\x[\da-fA-F]{1,2})`, ByGroups(LiteralStringChar, LiteralStringEscape), nil}, + {`(\?)(\\[abdefnrstv])`, ByGroups(LiteralStringChar, LiteralStringEscape), nil}, + {`\?\\?.`, LiteralStringChar, nil}, + {`:::`, LiteralStringSymbol, nil}, + {`::`, Operator, nil}, + {`:(?:\.\.\.|<<>>|%\{\}|%|\{\})`, LiteralStringSymbol, nil}, + {`:(?:(?:\.\.\.|[a-z_]\w*[!?]?)|[A-Z]\w*(?:\.[A-Z]\w*)*|(?:\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>|\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~|\<|\>|\+|\-|\*|\/|\!|\^|\&))`, LiteralStringSymbol, nil}, + {`:"`, LiteralStringSymbol, Push("string_double_atom")}, + {`:'`, LiteralStringSymbol, Push("string_single_atom")}, + {`((?:\.\.\.|<<>>|%\{\}|%|\{\})|(?:(?:\.\.\.|[a-z_]\w*[!?]?)|[A-Z]\w*(?:\.[A-Z]\w*)*|(?:\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>|\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~|\<|\>|\+|\-|\*|\/|\!|\^|\&)))(:)(?=\s|\n)`, ByGroups(LiteralStringSymbol, Punctuation), nil}, + {`(fn|do|end|after|else|rescue|catch)\b`, Keyword, nil}, + {`(not|and|or|when|in)\b`, OperatorWord, nil}, + {`(case|cond|for|if|unless|try|receive|raise|quote|unquote|unquote_splicing|throw|super|while)\b`, Keyword, nil}, + {`(def|defp|defmodule|defprotocol|defmacro|defmacrop|defdelegate|defexception|defstruct|defimpl|defcallback)\b`, KeywordDeclaration, nil}, + {`(import|require|use|alias)\b`, KeywordNamespace, nil}, + {`(nil|true|false)\b`, NameConstant, nil}, + {`(_|__MODULE__|__DIR__|__ENV__|__CALLER__)\b`, NamePseudo, nil}, + {`@(?:\.\.\.|[a-z_]\w*[!?]?)`, NameAttribute, nil}, + {`(?:\.\.\.|[a-z_]\w*[!?]?)`, Name, nil}, + {`(%?)([A-Z]\w*(?:\.[A-Z]\w*)*)`, ByGroups(Punctuation, NameClass), nil}, + {`\<\<\<|\>\>\>|\|\|\||\&\&\&|\^\^\^|\~\~\~|\=\=\=|\!\=\=|\~\>\>|\<\~\>|\|\~\>|\<\|\>`, Operator, nil}, + {`\=\=|\!\=|\<\=|\>\=|\&\&|\|\||\<\>|\+\+|\-\-|\|\>|\=\~|\-\>|\<\-|\||\.|\=|\~\>|\<\~`, Operator, nil}, + {`\\\\|\<\<|\>\>|\=\>|\(|\)|\:|\;|\,|\[|\]`, Punctuation, nil}, + {`&\d`, NameEntity, nil}, + {`\<|\>|\+|\-|\*|\/|\!|\^|\&`, Operator, nil}, + {`0b[01](_?[01])*`, LiteralNumberBin, nil}, + {`0o[0-7](_?[0-7])*`, LiteralNumberOct, nil}, + {`0x[\da-fA-F](_?[\dA-Fa-f])*`, LiteralNumberHex, nil}, + {`\d(_?\d)*\.\d(_?\d)*([eE][-+]?\d(_?\d)*)?`, LiteralNumberFloat, nil}, + {`\d(_?\d)*`, LiteralNumberInteger, nil}, + {`"""\s*`, LiteralStringHeredoc, Push("heredoc_double")}, + {`'''\s*$`, LiteralStringHeredoc, Push("heredoc_single")}, + {`"`, LiteralStringDouble, Push("string_double")}, + {`'`, LiteralStringSingle, Push("string_single")}, + Include("sigils"), + {`%\{`, Punctuation, Push("map_key")}, + {`\{`, Punctuation, Push("tuple")}, + }, + "heredoc_double": { + {`^\s*"""`, LiteralStringHeredoc, Pop(1)}, + Include("heredoc_interpol"), + }, + "heredoc_single": { + {`^\s*'''`, LiteralStringHeredoc, Pop(1)}, + Include("heredoc_interpol"), + }, + "heredoc_interpol": { + {`[^#\\\n]+`, LiteralStringHeredoc, nil}, + Include("escapes"), + {`\\.`, LiteralStringHeredoc, nil}, + {`\n+`, LiteralStringHeredoc, nil}, + Include("interpol"), + }, + "heredoc_no_interpol": { + {`[^\\\n]+`, LiteralStringHeredoc, nil}, + {`\\.`, LiteralStringHeredoc, nil}, + {`\n+`, LiteralStringHeredoc, nil}, + }, + "escapes": { + {`(\\x\{)([\da-fA-F]+)(\})`, ByGroups(LiteralStringEscape, LiteralNumberHex, LiteralStringEscape), nil}, + {`(\\x[\da-fA-F]{1,2})`, LiteralStringEscape, nil}, + {`(\\[abdefnrstv])`, LiteralStringEscape, nil}, + }, + "interpol": { + {`#\{`, LiteralStringInterpol, Push("interpol_string")}, + }, + "interpol_string": { + {`\}`, LiteralStringInterpol, Pop(1)}, + Include("root"), + }, + "map_key": { + Include("root"), + {`:`, Punctuation, Push("map_val")}, + {`=>`, Punctuation, Push("map_val")}, + {`\}`, Punctuation, Pop(1)}, + }, + "map_val": { + Include("root"), + {`,`, Punctuation, Pop(1)}, + {`(?=\})`, Punctuation, Pop(1)}, + }, + "tuple": { + Include("root"), + {`\}`, Punctuation, Pop(1)}, + }, + "string_double": { + {`[^#"\\]+`, LiteralStringDouble, nil}, + Include("escapes"), + {`\\.`, LiteralStringDouble, nil}, + {`(")`, ByGroups(LiteralStringDouble), Pop(1)}, + Include("interpol"), + }, + "string_single": { + {`[^#'\\]+`, LiteralStringSingle, nil}, + Include("escapes"), + {`\\.`, LiteralStringSingle, nil}, + {`(')`, ByGroups(LiteralStringSingle), Pop(1)}, + Include("interpol"), + }, + "string_double_atom": { + {`[^#"\\]+`, LiteralStringSymbol, nil}, + Include("escapes"), + {`\\.`, LiteralStringSymbol, nil}, + {`(")`, ByGroups(LiteralStringSymbol), Pop(1)}, + Include("interpol"), + }, + "string_single_atom": { + {`[^#'\\]+`, LiteralStringSymbol, nil}, + Include("escapes"), + {`\\.`, LiteralStringSymbol, nil}, + {`(')`, ByGroups(LiteralStringSymbol), Pop(1)}, + Include("interpol"), + }, + "sigils": { + {`(~[a-z])(""")`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triquot-end", "triquot-intp")}, + {`(~[A-Z])(""")`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triquot-end", "triquot-no-intp")}, + {`(~[a-z])(''')`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triapos-end", "triapos-intp")}, + {`(~[A-Z])(''')`, ByGroups(LiteralStringOther, LiteralStringHeredoc), Push("triapos-end", "triapos-no-intp")}, + {`~[a-z]\{`, LiteralStringOther, Push("cb-intp")}, + {`~[A-Z]\{`, LiteralStringOther, Push("cb-no-intp")}, + {`~[a-z]\[`, LiteralStringOther, Push("sb-intp")}, + {`~[A-Z]\[`, LiteralStringOther, Push("sb-no-intp")}, + {`~[a-z]\(`, LiteralStringOther, Push("pa-intp")}, + {`~[A-Z]\(`, LiteralStringOther, Push("pa-no-intp")}, + {`~[a-z]<`, LiteralStringOther, Push("ab-intp")}, + {`~[A-Z]<`, LiteralStringOther, Push("ab-no-intp")}, + {`~[a-z]/`, LiteralStringOther, Push("slas-intp")}, + {`~[A-Z]/`, LiteralStringOther, Push("slas-no-intp")}, + {`~[a-z]\|`, LiteralStringOther, Push("pipe-intp")}, + {`~[A-Z]\|`, LiteralStringOther, Push("pipe-no-intp")}, + {`~[a-z]"`, LiteralStringOther, Push("quot-intp")}, + {`~[A-Z]"`, LiteralStringOther, Push("quot-no-intp")}, + {`~[a-z]'`, LiteralStringOther, Push("apos-intp")}, + {`~[A-Z]'`, LiteralStringOther, Push("apos-no-intp")}, + }, + "triquot-end": { + {`[a-zA-Z]+`, LiteralStringOther, Pop(1)}, + Default(Pop(1)), + }, + "triquot-intp": { + {`^\s*"""`, LiteralStringHeredoc, Pop(1)}, + Include("heredoc_interpol"), + }, + "triquot-no-intp": { + {`^\s*"""`, LiteralStringHeredoc, Pop(1)}, + Include("heredoc_no_interpol"), + }, + "triapos-end": { + {`[a-zA-Z]+`, LiteralStringOther, Pop(1)}, + Default(Pop(1)), + }, + "triapos-intp": { + {`^\s*'''`, LiteralStringHeredoc, Pop(1)}, + Include("heredoc_interpol"), + }, + "triapos-no-intp": { + {`^\s*'''`, LiteralStringHeredoc, Pop(1)}, + Include("heredoc_no_interpol"), + }, + "cb-intp": { + {`[^#\}\\]+`, LiteralStringOther, nil}, + Include("escapes"), + {`\\.`, LiteralStringOther, nil}, + {`\}[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + Include("interpol"), + }, + "cb-no-intp": { + {`[^\}\\]+`, LiteralStringOther, nil}, + {`\\.`, LiteralStringOther, nil}, + {`\}[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + }, + "sb-intp": { + {`[^#\]\\]+`, LiteralStringOther, nil}, + Include("escapes"), + {`\\.`, LiteralStringOther, nil}, + {`\][a-zA-Z]*`, LiteralStringOther, Pop(1)}, + Include("interpol"), + }, + "sb-no-intp": { + {`[^\]\\]+`, LiteralStringOther, nil}, + {`\\.`, LiteralStringOther, nil}, + {`\][a-zA-Z]*`, LiteralStringOther, Pop(1)}, + }, + "pa-intp": { + {`[^#\)\\]+`, LiteralStringOther, nil}, + Include("escapes"), + {`\\.`, LiteralStringOther, nil}, + {`\)[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + Include("interpol"), + }, + "pa-no-intp": { + {`[^\)\\]+`, LiteralStringOther, nil}, + {`\\.`, LiteralStringOther, nil}, + {`\)[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + }, + "ab-intp": { + {`[^#>\\]+`, LiteralStringOther, nil}, + Include("escapes"), + {`\\.`, LiteralStringOther, nil}, + {`>[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + Include("interpol"), + }, + "ab-no-intp": { + {`[^>\\]+`, LiteralStringOther, nil}, + {`\\.`, LiteralStringOther, nil}, + {`>[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + }, + "slas-intp": { + {`[^#/\\]+`, LiteralStringOther, nil}, + Include("escapes"), + {`\\.`, LiteralStringOther, nil}, + {`/[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + Include("interpol"), + }, + "slas-no-intp": { + {`[^/\\]+`, LiteralStringOther, nil}, + {`\\.`, LiteralStringOther, nil}, + {`/[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + }, + "pipe-intp": { + {`[^#\|\\]+`, LiteralStringOther, nil}, + Include("escapes"), + {`\\.`, LiteralStringOther, nil}, + {`\|[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + Include("interpol"), + }, + "pipe-no-intp": { + {`[^\|\\]+`, LiteralStringOther, nil}, + {`\\.`, LiteralStringOther, nil}, + {`\|[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + }, + "quot-intp": { + {`[^#"\\]+`, LiteralStringOther, nil}, + Include("escapes"), + {`\\.`, LiteralStringOther, nil}, + {`"[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + Include("interpol"), + }, + "quot-no-intp": { + {`[^"\\]+`, LiteralStringOther, nil}, + {`\\.`, LiteralStringOther, nil}, + {`"[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + }, + "apos-intp": { + {`[^#'\\]+`, LiteralStringOther, nil}, + Include("escapes"), + {`\\.`, LiteralStringOther, nil}, + {`'[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + Include("interpol"), + }, + "apos-no-intp": { + {`[^'\\]+`, LiteralStringOther, nil}, + {`\\.`, LiteralStringOther, nil}, + {`'[a-zA-Z]*`, LiteralStringOther, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/e/elm.go b/vendor/github.com/alecthomas/chroma/lexers/e/elm.go new file mode 100644 index 0000000..0fb6689 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/e/elm.go @@ -0,0 +1,63 @@ +package e + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Elm lexer. +var Elm = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Elm", + Aliases: []string{"elm"}, + Filenames: []string{"*.elm"}, + MimeTypes: []string{"text/x-elm"}, + }, + elmRules, +)) + +func elmRules() Rules { + return Rules{ + "root": { + {`\{-`, CommentMultiline, Push("comment")}, + {`--.*`, CommentSingle, nil}, + {`\s+`, Text, nil}, + {`"`, LiteralString, Push("doublequote")}, + {`^\s*module\s*`, KeywordNamespace, Push("imports")}, + {`^\s*import\s*`, KeywordNamespace, Push("imports")}, + {`\[glsl\|.*`, NameEntity, Push("shader")}, + {Words(``, `\b`, `alias`, `as`, `case`, `else`, `if`, `import`, `in`, `let`, `module`, `of`, `port`, `then`, `type`, `where`), KeywordReserved, nil}, + {`[A-Z]\w*`, KeywordType, nil}, + {`^main `, KeywordReserved, nil}, + {Words(`\(`, `\)`, `~`, `||`, `|>`, `|`, "`", `^`, `\`, `'`, `>>`, `>=`, `>`, `==`, `=`, `<~`, `<|`, `<=`, `<<`, `<-`, `<`, `::`, `:`, `/=`, `//`, `/`, `..`, `.`, `->`, `-`, `++`, `+`, `*`, `&&`, `%`), NameFunction, nil}, + {Words(``, ``, `~`, `||`, `|>`, `|`, "`", `^`, `\`, `'`, `>>`, `>=`, `>`, `==`, `=`, `<~`, `<|`, `<=`, `<<`, `<-`, `<`, `::`, `:`, `/=`, `//`, `/`, `..`, `.`, `->`, `-`, `++`, `+`, `*`, `&&`, `%`), NameFunction, nil}, + Include("numbers"), + {`[a-z_][a-zA-Z_\']*`, NameVariable, nil}, + {`[,()\[\]{}]`, Punctuation, nil}, + }, + "comment": { + {`-(?!\})`, CommentMultiline, nil}, + {`\{-`, CommentMultiline, Push("comment")}, + {`[^-}]`, CommentMultiline, nil}, + {`-\}`, CommentMultiline, Pop(1)}, + }, + "doublequote": { + {`\\u[0-9a-fA-F]{4}`, LiteralStringEscape, nil}, + {`\\[nrfvb\\"]`, LiteralStringEscape, nil}, + {`[^"]`, LiteralString, nil}, + {`"`, LiteralString, Pop(1)}, + }, + "imports": { + {`\w+(\.\w+)*`, NameClass, Pop(1)}, + }, + "numbers": { + {`_?\d+\.(?=\d+)`, LiteralNumberFloat, nil}, + {`_?\d+`, LiteralNumberInteger, nil}, + }, + "shader": { + {`\|(?!\])`, NameEntity, nil}, + {`\|\]`, NameEntity, Pop(1)}, + {`.*\n`, NameEntity, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/e/emacs.go b/vendor/github.com/alecthomas/chroma/lexers/e/emacs.go new file mode 100644 index 0000000..51c4910 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/e/emacs.go @@ -0,0 +1,586 @@ +package e + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +var ( + emacsMacros = []string{ + "atomic-change-group", "case", "block", "cl-block", "cl-callf", "cl-callf2", + "cl-case", "cl-decf", "cl-declaim", "cl-declare", + "cl-define-compiler-macro", "cl-defmacro", "cl-defstruct", + "cl-defsubst", "cl-deftype", "cl-defun", "cl-destructuring-bind", + "cl-do", "cl-do*", "cl-do-all-symbols", "cl-do-symbols", "cl-dolist", + "cl-dotimes", "cl-ecase", "cl-etypecase", "eval-when", "cl-eval-when", "cl-flet", + "cl-flet*", "cl-function", "cl-incf", "cl-labels", "cl-letf", + "cl-letf*", "cl-load-time-value", "cl-locally", "cl-loop", + "cl-macrolet", "cl-multiple-value-bind", "cl-multiple-value-setq", + "cl-progv", "cl-psetf", "cl-psetq", "cl-pushnew", "cl-remf", + "cl-return", "cl-return-from", "cl-rotatef", "cl-shiftf", + "cl-symbol-macrolet", "cl-tagbody", "cl-the", "cl-typecase", + "combine-after-change-calls", "condition-case-unless-debug", "decf", + "declaim", "declare", "declare-function", "def-edebug-spec", + "defadvice", "defclass", "defcustom", "defface", "defgeneric", + "defgroup", "define-advice", "define-alternatives", + "define-compiler-macro", "define-derived-mode", "define-generic-mode", + "define-global-minor-mode", "define-globalized-minor-mode", + "define-minor-mode", "define-modify-macro", + "define-obsolete-face-alias", "define-obsolete-function-alias", + "define-obsolete-variable-alias", "define-setf-expander", + "define-skeleton", "defmacro", "defmethod", "defsetf", "defstruct", + "defsubst", "deftheme", "deftype", "defun", "defvar-local", + "delay-mode-hooks", "destructuring-bind", "do", "do*", + "do-all-symbols", "do-symbols", "dolist", "dont-compile", "dotimes", + "dotimes-with-progress-reporter", "ecase", "ert-deftest", "etypecase", + "eval-and-compile", "eval-when-compile", "flet", "ignore-errors", + "incf", "labels", "lambda", "letrec", "lexical-let", "lexical-let*", + "loop", "multiple-value-bind", "multiple-value-setq", "noreturn", + "oref", "oref-default", "oset", "oset-default", "pcase", + "pcase-defmacro", "pcase-dolist", "pcase-exhaustive", "pcase-let", + "pcase-let*", "pop", "psetf", "psetq", "push", "pushnew", "remf", + "return", "rotatef", "rx", "save-match-data", "save-selected-window", + "save-window-excursion", "setf", "setq-local", "shiftf", + "track-mouse", "typecase", "unless", "use-package", "when", + "while-no-input", "with-case-table", "with-category-table", + "with-coding-priority", "with-current-buffer", "with-demoted-errors", + "with-eval-after-load", "with-file-modes", "with-local-quit", + "with-output-to-string", "with-output-to-temp-buffer", + "with-parsed-tramp-file-name", "with-selected-frame", + "with-selected-window", "with-silent-modifications", "with-slots", + "with-syntax-table", "with-temp-buffer", "with-temp-file", + "with-temp-message", "with-timeout", "with-tramp-connection-property", + "with-tramp-file-property", "with-tramp-progress-reporter", + "with-wrapper-hook", "load-time-value", "locally", "macrolet", "progv", + "return-from", + } + + emacsSpecialForms = []string{ + "and", "catch", "cond", "condition-case", "defconst", "defvar", + "function", "if", "interactive", "let", "let*", "or", "prog1", + "prog2", "progn", "quote", "save-current-buffer", "save-excursion", + "save-restriction", "setq", "setq-default", "subr-arity", + "unwind-protect", "while", + } + + emacsBuiltinFunction = []string{ + "%", "*", "+", "-", "/", "/=", "1+", "1-", "<", "<=", "=", ">", ">=", + "Snarf-documentation", "abort-recursive-edit", "abs", + "accept-process-output", "access-file", "accessible-keymaps", "acos", + "active-minibuffer-window", "add-face-text-property", + "add-name-to-file", "add-text-properties", "all-completions", + "append", "apply", "apropos-internal", "aref", "arrayp", "aset", + "ash", "asin", "assoc", "assoc-string", "assq", "atan", "atom", + "autoload", "autoload-do-load", "backtrace", "backtrace--locals", + "backtrace-debug", "backtrace-eval", "backtrace-frame", + "backward-char", "backward-prefix-chars", "barf-if-buffer-read-only", + "base64-decode-region", "base64-decode-string", + "base64-encode-region", "base64-encode-string", "beginning-of-line", + "bidi-find-overridden-directionality", "bidi-resolved-levels", + "bitmap-spec-p", "bobp", "bolp", "bool-vector", + "bool-vector-count-consecutive", "bool-vector-count-population", + "bool-vector-exclusive-or", "bool-vector-intersection", + "bool-vector-not", "bool-vector-p", "bool-vector-set-difference", + "bool-vector-subsetp", "bool-vector-union", "boundp", + "buffer-base-buffer", "buffer-chars-modified-tick", + "buffer-enable-undo", "buffer-file-name", "buffer-has-markers-at", + "buffer-list", "buffer-live-p", "buffer-local-value", + "buffer-local-variables", "buffer-modified-p", "buffer-modified-tick", + "buffer-name", "buffer-size", "buffer-string", "buffer-substring", + "buffer-substring-no-properties", "buffer-swap-text", "bufferp", + "bury-buffer-internal", "byte-code", "byte-code-function-p", + "byte-to-position", "byte-to-string", "byteorder", + "call-interactively", "call-last-kbd-macro", "call-process", + "call-process-region", "cancel-kbd-macro-events", "capitalize", + "capitalize-region", "capitalize-word", "car", "car-less-than-car", + "car-safe", "case-table-p", "category-docstring", + "category-set-mnemonics", "category-table", "category-table-p", + "ccl-execute", "ccl-execute-on-string", "ccl-program-p", "cdr", + "cdr-safe", "ceiling", "char-after", "char-before", + "char-category-set", "char-charset", "char-equal", "char-or-string-p", + "char-resolve-modifiers", "char-syntax", "char-table-extra-slot", + "char-table-p", "char-table-parent", "char-table-range", + "char-table-subtype", "char-to-string", "char-width", "characterp", + "charset-after", "charset-id-internal", "charset-plist", + "charset-priority-list", "charsetp", "check-coding-system", + "check-coding-systems-region", "clear-buffer-auto-save-failure", + "clear-charset-maps", "clear-face-cache", "clear-font-cache", + "clear-image-cache", "clear-string", "clear-this-command-keys", + "close-font", "clrhash", "coding-system-aliases", + "coding-system-base", "coding-system-eol-type", "coding-system-p", + "coding-system-plist", "coding-system-priority-list", + "coding-system-put", "color-distance", "color-gray-p", + "color-supported-p", "combine-after-change-execute", + "command-error-default-function", "command-remapping", "commandp", + "compare-buffer-substrings", "compare-strings", + "compare-window-configurations", "completing-read", + "compose-region-internal", "compose-string-internal", + "composition-get-gstring", "compute-motion", "concat", "cons", + "consp", "constrain-to-field", "continue-process", + "controlling-tty-p", "coordinates-in-window-p", "copy-alist", + "copy-category-table", "copy-file", "copy-hash-table", "copy-keymap", + "copy-marker", "copy-sequence", "copy-syntax-table", "copysign", + "cos", "current-active-maps", "current-bidi-paragraph-direction", + "current-buffer", "current-case-table", "current-column", + "current-global-map", "current-idle-time", "current-indentation", + "current-input-mode", "current-local-map", "current-message", + "current-minor-mode-maps", "current-time", "current-time-string", + "current-time-zone", "current-window-configuration", + "cygwin-convert-file-name-from-windows", + "cygwin-convert-file-name-to-windows", "daemon-initialized", + "daemonp", "dbus--init-bus", "dbus-get-unique-name", + "dbus-message-internal", "debug-timer-check", "declare-equiv-charset", + "decode-big5-char", "decode-char", "decode-coding-region", + "decode-coding-string", "decode-sjis-char", "decode-time", + "default-boundp", "default-file-modes", "default-printer-name", + "default-toplevel-value", "default-value", "define-category", + "define-charset-alias", "define-charset-internal", + "define-coding-system-alias", "define-coding-system-internal", + "define-fringe-bitmap", "define-hash-table-test", "define-key", + "define-prefix-command", "delete", + "delete-all-overlays", "delete-and-extract-region", "delete-char", + "delete-directory-internal", "delete-field", "delete-file", + "delete-frame", "delete-other-windows-internal", "delete-overlay", + "delete-process", "delete-region", "delete-terminal", + "delete-window-internal", "delq", "describe-buffer-bindings", + "describe-vector", "destroy-fringe-bitmap", "detect-coding-region", + "detect-coding-string", "ding", "directory-file-name", + "directory-files", "directory-files-and-attributes", "discard-input", + "display-supports-face-attributes-p", "do-auto-save", "documentation", + "documentation-property", "downcase", "downcase-region", + "downcase-word", "draw-string", "dump-colors", "dump-emacs", + "dump-face", "dump-frame-glyph-matrix", "dump-glyph-matrix", + "dump-glyph-row", "dump-redisplay-history", "dump-tool-bar-row", + "elt", "emacs-pid", "encode-big5-char", "encode-char", + "encode-coding-region", "encode-coding-string", "encode-sjis-char", + "encode-time", "end-kbd-macro", "end-of-line", "eobp", "eolp", "eq", + "eql", "equal", "equal-including-properties", "erase-buffer", + "error-message-string", "eval", "eval-buffer", "eval-region", + "event-convert-list", "execute-kbd-macro", "exit-recursive-edit", + "exp", "expand-file-name", "expt", "external-debugging-output", + "face-attribute-relative-p", "face-attributes-as-vector", "face-font", + "fboundp", "fceiling", "fetch-bytecode", "ffloor", + "field-beginning", "field-end", "field-string", + "field-string-no-properties", "file-accessible-directory-p", + "file-acl", "file-attributes", "file-attributes-lessp", + "file-directory-p", "file-executable-p", "file-exists-p", + "file-locked-p", "file-modes", "file-name-absolute-p", + "file-name-all-completions", "file-name-as-directory", + "file-name-completion", "file-name-directory", + "file-name-nondirectory", "file-newer-than-file-p", "file-readable-p", + "file-regular-p", "file-selinux-context", "file-symlink-p", + "file-system-info", "file-system-info", "file-writable-p", + "fillarray", "find-charset-region", "find-charset-string", + "find-coding-systems-region-internal", "find-composition-internal", + "find-file-name-handler", "find-font", "find-operation-coding-system", + "float", "float-time", "floatp", "floor", "fmakunbound", + "following-char", "font-at", "font-drive-otf", "font-face-attributes", + "font-family-list", "font-get", "font-get-glyphs", + "font-get-system-font", "font-get-system-normal-font", "font-info", + "font-match-p", "font-otf-alternates", "font-put", + "font-shape-gstring", "font-spec", "font-variation-glyphs", + "font-xlfd-name", "fontp", "fontset-font", "fontset-info", + "fontset-list", "fontset-list-all", "force-mode-line-update", + "force-window-update", "format", "format-mode-line", + "format-network-address", "format-time-string", "forward-char", + "forward-comment", "forward-line", "forward-word", + "frame-border-width", "frame-bottom-divider-width", + "frame-can-run-window-configuration-change-hook", "frame-char-height", + "frame-char-width", "frame-face-alist", "frame-first-window", + "frame-focus", "frame-font-cache", "frame-fringe-width", "frame-list", + "frame-live-p", "frame-or-buffer-changed-p", "frame-parameter", + "frame-parameters", "frame-pixel-height", "frame-pixel-width", + "frame-pointer-visible-p", "frame-right-divider-width", + "frame-root-window", "frame-scroll-bar-height", + "frame-scroll-bar-width", "frame-selected-window", "frame-terminal", + "frame-text-cols", "frame-text-height", "frame-text-lines", + "frame-text-width", "frame-total-cols", "frame-total-lines", + "frame-visible-p", "framep", "frexp", "fringe-bitmaps-at-pos", + "fround", "fset", "ftruncate", "funcall", "funcall-interactively", + "function-equal", "functionp", "gap-position", "gap-size", + "garbage-collect", "gc-status", "generate-new-buffer-name", "get", + "get-buffer", "get-buffer-create", "get-buffer-process", + "get-buffer-window", "get-byte", "get-char-property", + "get-char-property-and-overlay", "get-file-buffer", "get-file-char", + "get-internal-run-time", "get-load-suffixes", "get-pos-property", + "get-process", "get-screen-color", "get-text-property", + "get-unicode-property-internal", "get-unused-category", + "get-unused-iso-final-char", "getenv-internal", "gethash", + "gfile-add-watch", "gfile-rm-watch", "global-key-binding", + "gnutls-available-p", "gnutls-boot", "gnutls-bye", "gnutls-deinit", + "gnutls-error-fatalp", "gnutls-error-string", "gnutls-errorp", + "gnutls-get-initstage", "gnutls-peer-status", + "gnutls-peer-status-warning-describe", "goto-char", "gpm-mouse-start", + "gpm-mouse-stop", "group-gid", "group-real-gid", + "handle-save-session", "handle-switch-frame", "hash-table-count", + "hash-table-p", "hash-table-rehash-size", + "hash-table-rehash-threshold", "hash-table-size", "hash-table-test", + "hash-table-weakness", "iconify-frame", "identity", "image-flush", + "image-mask-p", "image-metadata", "image-size", "imagemagick-types", + "imagep", "indent-to", "indirect-function", "indirect-variable", + "init-image-library", "inotify-add-watch", "inotify-rm-watch", + "input-pending-p", "insert", "insert-and-inherit", + "insert-before-markers", "insert-before-markers-and-inherit", + "insert-buffer-substring", "insert-byte", "insert-char", + "insert-file-contents", "insert-startup-screen", "int86", + "integer-or-marker-p", "integerp", "interactive-form", "intern", + "intern-soft", "internal--track-mouse", "internal-char-font", + "internal-complete-buffer", "internal-copy-lisp-face", + "internal-default-process-filter", + "internal-default-process-sentinel", "internal-describe-syntax-value", + "internal-event-symbol-parse-modifiers", + "internal-face-x-get-resource", "internal-get-lisp-face-attribute", + "internal-lisp-face-attribute-values", "internal-lisp-face-empty-p", + "internal-lisp-face-equal-p", "internal-lisp-face-p", + "internal-make-lisp-face", "internal-make-var-non-special", + "internal-merge-in-global-face", + "internal-set-alternative-font-family-alist", + "internal-set-alternative-font-registry-alist", + "internal-set-font-selection-order", + "internal-set-lisp-face-attribute", + "internal-set-lisp-face-attribute-from-resource", + "internal-show-cursor", "internal-show-cursor-p", "interrupt-process", + "invisible-p", "invocation-directory", "invocation-name", "isnan", + "iso-charset", "key-binding", "key-description", + "keyboard-coding-system", "keymap-parent", "keymap-prompt", "keymapp", + "keywordp", "kill-all-local-variables", "kill-buffer", "kill-emacs", + "kill-local-variable", "kill-process", "last-nonminibuffer-frame", + "lax-plist-get", "lax-plist-put", "ldexp", "length", + "libxml-parse-html-region", "libxml-parse-xml-region", + "line-beginning-position", "line-end-position", "line-pixel-height", + "list", "list-fonts", "list-system-processes", "listp", "load", + "load-average", "local-key-binding", "local-variable-if-set-p", + "local-variable-p", "locale-info", "locate-file-internal", + "lock-buffer", "log", "logand", "logb", "logior", "lognot", "logxor", + "looking-at", "lookup-image", "lookup-image-map", "lookup-key", + "lower-frame", "lsh", "macroexpand", "make-bool-vector", + "make-byte-code", "make-category-set", "make-category-table", + "make-char", "make-char-table", "make-directory-internal", + "make-frame-invisible", "make-frame-visible", "make-hash-table", + "make-indirect-buffer", "make-keymap", "make-list", + "make-local-variable", "make-marker", "make-network-process", + "make-overlay", "make-serial-process", "make-sparse-keymap", + "make-string", "make-symbol", "make-symbolic-link", "make-temp-name", + "make-terminal-frame", "make-variable-buffer-local", + "make-variable-frame-local", "make-vector", "makunbound", + "map-char-table", "map-charset-chars", "map-keymap", + "map-keymap-internal", "mapatoms", "mapc", "mapcar", "mapconcat", + "maphash", "mark-marker", "marker-buffer", "marker-insertion-type", + "marker-position", "markerp", "match-beginning", "match-data", + "match-end", "matching-paren", "max", "max-char", "md5", "member", + "memory-info", "memory-limit", "memory-use-counts", "memq", "memql", + "menu-bar-menu-at-x-y", "menu-or-popup-active-p", + "menu-or-popup-active-p", "merge-face-attribute", "message", + "message-box", "message-or-box", "min", + "minibuffer-completion-contents", "minibuffer-contents", + "minibuffer-contents-no-properties", "minibuffer-depth", + "minibuffer-prompt", "minibuffer-prompt-end", + "minibuffer-selected-window", "minibuffer-window", "minibufferp", + "minor-mode-key-binding", "mod", "modify-category-entry", + "modify-frame-parameters", "modify-syntax-entry", + "mouse-pixel-position", "mouse-position", "move-overlay", + "move-point-visually", "move-to-column", "move-to-window-line", + "msdos-downcase-filename", "msdos-long-file-names", "msdos-memget", + "msdos-memput", "msdos-mouse-disable", "msdos-mouse-enable", + "msdos-mouse-init", "msdos-mouse-p", "msdos-remember-default-colors", + "msdos-set-keyboard", "msdos-set-mouse-buttons", + "multibyte-char-to-unibyte", "multibyte-string-p", "narrow-to-region", + "natnump", "nconc", "network-interface-info", + "network-interface-list", "new-fontset", "newline-cache-check", + "next-char-property-change", "next-frame", "next-overlay-change", + "next-property-change", "next-read-file-uses-dialog-p", + "next-single-char-property-change", "next-single-property-change", + "next-window", "nlistp", "nreverse", "nth", "nthcdr", "null", + "number-or-marker-p", "number-to-string", "numberp", + "open-dribble-file", "open-font", "open-termscript", + "optimize-char-table", "other-buffer", "other-window-for-scrolling", + "overlay-buffer", "overlay-end", "overlay-get", "overlay-lists", + "overlay-properties", "overlay-put", "overlay-recenter", + "overlay-start", "overlayp", "overlays-at", "overlays-in", + "parse-partial-sexp", "play-sound-internal", "plist-get", + "plist-member", "plist-put", "point", "point-marker", "point-max", + "point-max-marker", "point-min", "point-min-marker", + "pos-visible-in-window-p", "position-bytes", "posix-looking-at", + "posix-search-backward", "posix-search-forward", "posix-string-match", + "posn-at-point", "posn-at-x-y", "preceding-char", + "prefix-numeric-value", "previous-char-property-change", + "previous-frame", "previous-overlay-change", + "previous-property-change", "previous-single-char-property-change", + "previous-single-property-change", "previous-window", "prin1", + "prin1-to-string", "princ", "print", "process-attributes", + "process-buffer", "process-coding-system", "process-command", + "process-connection", "process-contact", "process-datagram-address", + "process-exit-status", "process-filter", "process-filter-multibyte-p", + "process-id", "process-inherit-coding-system-flag", "process-list", + "process-mark", "process-name", "process-plist", + "process-query-on-exit-flag", "process-running-child-p", + "process-send-eof", "process-send-region", "process-send-string", + "process-sentinel", "process-status", "process-tty-name", + "process-type", "processp", "profiler-cpu-log", + "profiler-cpu-running-p", "profiler-cpu-start", "profiler-cpu-stop", + "profiler-memory-log", "profiler-memory-running-p", + "profiler-memory-start", "profiler-memory-stop", "propertize", + "purecopy", "put", "put-text-property", + "put-unicode-property-internal", "puthash", "query-font", + "query-fontset", "quit-process", "raise-frame", "random", "rassoc", + "rassq", "re-search-backward", "re-search-forward", "read", + "read-buffer", "read-char", "read-char-exclusive", + "read-coding-system", "read-command", "read-event", + "read-from-minibuffer", "read-from-string", "read-function", + "read-key-sequence", "read-key-sequence-vector", + "read-no-blanks-input", "read-non-nil-coding-system", "read-string", + "read-variable", "recent-auto-save-p", "recent-doskeys", + "recent-keys", "recenter", "recursion-depth", "recursive-edit", + "redirect-debugging-output", "redirect-frame-focus", "redisplay", + "redraw-display", "redraw-frame", "regexp-quote", "region-beginning", + "region-end", "register-ccl-program", "register-code-conversion-map", + "remhash", "remove-list-of-text-properties", "remove-text-properties", + "rename-buffer", "rename-file", "replace-match", + "reset-this-command-lengths", "resize-mini-window-internal", + "restore-buffer-modified-p", "resume-tty", "reverse", "round", + "run-hook-with-args", "run-hook-with-args-until-failure", + "run-hook-with-args-until-success", "run-hook-wrapped", "run-hooks", + "run-window-configuration-change-hook", "run-window-scroll-functions", + "safe-length", "scan-lists", "scan-sexps", "scroll-down", + "scroll-left", "scroll-other-window", "scroll-right", "scroll-up", + "search-backward", "search-forward", "secure-hash", "select-frame", + "select-window", "selected-frame", "selected-window", + "self-insert-command", "send-string-to-terminal", "sequencep", + "serial-process-configure", "set", "set-buffer", + "set-buffer-auto-saved", "set-buffer-major-mode", + "set-buffer-modified-p", "set-buffer-multibyte", "set-case-table", + "set-category-table", "set-char-table-extra-slot", + "set-char-table-parent", "set-char-table-range", "set-charset-plist", + "set-charset-priority", "set-coding-system-priority", + "set-cursor-size", "set-default", "set-default-file-modes", + "set-default-toplevel-value", "set-file-acl", "set-file-modes", + "set-file-selinux-context", "set-file-times", "set-fontset-font", + "set-frame-height", "set-frame-position", "set-frame-selected-window", + "set-frame-size", "set-frame-width", "set-fringe-bitmap-face", + "set-input-interrupt-mode", "set-input-meta-mode", "set-input-mode", + "set-keyboard-coding-system-internal", "set-keymap-parent", + "set-marker", "set-marker-insertion-type", "set-match-data", + "set-message-beep", "set-minibuffer-window", + "set-mouse-pixel-position", "set-mouse-position", + "set-network-process-option", "set-output-flow-control", + "set-process-buffer", "set-process-coding-system", + "set-process-datagram-address", "set-process-filter", + "set-process-filter-multibyte", + "set-process-inherit-coding-system-flag", "set-process-plist", + "set-process-query-on-exit-flag", "set-process-sentinel", + "set-process-window-size", "set-quit-char", + "set-safe-terminal-coding-system-internal", "set-screen-color", + "set-standard-case-table", "set-syntax-table", + "set-terminal-coding-system-internal", "set-terminal-local-value", + "set-terminal-parameter", "set-text-properties", "set-time-zone-rule", + "set-visited-file-modtime", "set-window-buffer", + "set-window-combination-limit", "set-window-configuration", + "set-window-dedicated-p", "set-window-display-table", + "set-window-fringes", "set-window-hscroll", "set-window-margins", + "set-window-new-normal", "set-window-new-pixel", + "set-window-new-total", "set-window-next-buffers", + "set-window-parameter", "set-window-point", "set-window-prev-buffers", + "set-window-redisplay-end-trigger", "set-window-scroll-bars", + "set-window-start", "set-window-vscroll", "setcar", "setcdr", + "setplist", "show-face-resources", "signal", "signal-process", "sin", + "single-key-description", "skip-chars-backward", "skip-chars-forward", + "skip-syntax-backward", "skip-syntax-forward", "sleep-for", "sort", + "sort-charsets", "special-variable-p", "split-char", + "split-window-internal", "sqrt", "standard-case-table", + "standard-category-table", "standard-syntax-table", "start-kbd-macro", + "start-process", "stop-process", "store-kbd-macro-event", "string", + "string-as-multibyte", "string-as-unibyte", "string-bytes", + "string-collate-equalp", "string-collate-lessp", "string-equal", + "string-lessp", "string-make-multibyte", "string-make-unibyte", + "string-match", "string-to-char", "string-to-multibyte", + "string-to-number", "string-to-syntax", "string-to-unibyte", + "string-width", "stringp", "subr-name", "subrp", + "subst-char-in-region", "substitute-command-keys", + "substitute-in-file-name", "substring", "substring-no-properties", + "suspend-emacs", "suspend-tty", "suspicious-object", "sxhash", + "symbol-function", "symbol-name", "symbol-plist", "symbol-value", + "symbolp", "syntax-table", "syntax-table-p", "system-groups", + "system-move-file-to-trash", "system-name", "system-users", "tan", + "terminal-coding-system", "terminal-list", "terminal-live-p", + "terminal-local-value", "terminal-name", "terminal-parameter", + "terminal-parameters", "terpri", "test-completion", + "text-char-description", "text-properties-at", "text-property-any", + "text-property-not-all", "this-command-keys", + "this-command-keys-vector", "this-single-command-keys", + "this-single-command-raw-keys", "time-add", "time-less-p", + "time-subtract", "tool-bar-get-system-style", "tool-bar-height", + "tool-bar-pixel-width", "top-level", "trace-redisplay", + "trace-to-stderr", "translate-region-internal", "transpose-regions", + "truncate", "try-completion", "tty-display-color-cells", + "tty-display-color-p", "tty-no-underline", + "tty-suppress-bold-inverse-default-colors", "tty-top-frame", + "tty-type", "type-of", "undo-boundary", "unencodable-char-position", + "unhandled-file-name-directory", "unibyte-char-to-multibyte", + "unibyte-string", "unicode-property-table-internal", "unify-charset", + "unintern", "unix-sync", "unlock-buffer", "upcase", "upcase-initials", + "upcase-initials-region", "upcase-region", "upcase-word", + "use-global-map", "use-local-map", "user-full-name", + "user-login-name", "user-real-login-name", "user-real-uid", + "user-uid", "variable-binding-locus", "vconcat", "vector", + "vector-or-char-table-p", "vectorp", "verify-visited-file-modtime", + "vertical-motion", "visible-frame-list", "visited-file-modtime", + "w16-get-clipboard-data", "w16-selection-exists-p", + "w16-set-clipboard-data", "w32-battery-status", + "w32-default-color-map", "w32-define-rgb-color", + "w32-display-monitor-attributes-list", "w32-frame-menu-bar-size", + "w32-frame-rect", "w32-get-clipboard-data", + "w32-get-codepage-charset", "w32-get-console-codepage", + "w32-get-console-output-codepage", "w32-get-current-locale-id", + "w32-get-default-locale-id", "w32-get-keyboard-layout", + "w32-get-locale-info", "w32-get-valid-codepages", + "w32-get-valid-keyboard-layouts", "w32-get-valid-locale-ids", + "w32-has-winsock", "w32-long-file-name", "w32-reconstruct-hot-key", + "w32-register-hot-key", "w32-registered-hot-keys", + "w32-selection-exists-p", "w32-send-sys-command", + "w32-set-clipboard-data", "w32-set-console-codepage", + "w32-set-console-output-codepage", "w32-set-current-locale", + "w32-set-keyboard-layout", "w32-set-process-priority", + "w32-shell-execute", "w32-short-file-name", "w32-toggle-lock-key", + "w32-unload-winsock", "w32-unregister-hot-key", "w32-window-exists-p", + "w32notify-add-watch", "w32notify-rm-watch", + "waiting-for-user-input-p", "where-is-internal", "widen", + "widget-apply", "widget-get", "widget-put", + "window-absolute-pixel-edges", "window-at", "window-body-height", + "window-body-width", "window-bottom-divider-width", "window-buffer", + "window-combination-limit", "window-configuration-frame", + "window-configuration-p", "window-dedicated-p", + "window-display-table", "window-edges", "window-end", "window-frame", + "window-fringes", "window-header-line-height", "window-hscroll", + "window-inside-absolute-pixel-edges", "window-inside-edges", + "window-inside-pixel-edges", "window-left-child", + "window-left-column", "window-line-height", "window-list", + "window-list-1", "window-live-p", "window-margins", + "window-minibuffer-p", "window-mode-line-height", "window-new-normal", + "window-new-pixel", "window-new-total", "window-next-buffers", + "window-next-sibling", "window-normal-size", "window-old-point", + "window-parameter", "window-parameters", "window-parent", + "window-pixel-edges", "window-pixel-height", "window-pixel-left", + "window-pixel-top", "window-pixel-width", "window-point", + "window-prev-buffers", "window-prev-sibling", + "window-redisplay-end-trigger", "window-resize-apply", + "window-resize-apply-total", "window-right-divider-width", + "window-scroll-bar-height", "window-scroll-bar-width", + "window-scroll-bars", "window-start", "window-system", + "window-text-height", "window-text-pixel-size", "window-text-width", + "window-top-child", "window-top-line", "window-total-height", + "window-total-width", "window-use-time", "window-valid-p", + "window-vscroll", "windowp", "write-char", "write-region", + "x-backspace-delete-keys-p", "x-change-window-property", + "x-change-window-property", "x-close-connection", + "x-close-connection", "x-create-frame", "x-create-frame", + "x-delete-window-property", "x-delete-window-property", + "x-disown-selection-internal", "x-display-backing-store", + "x-display-backing-store", "x-display-color-cells", + "x-display-color-cells", "x-display-grayscale-p", + "x-display-grayscale-p", "x-display-list", "x-display-list", + "x-display-mm-height", "x-display-mm-height", "x-display-mm-width", + "x-display-mm-width", "x-display-monitor-attributes-list", + "x-display-pixel-height", "x-display-pixel-height", + "x-display-pixel-width", "x-display-pixel-width", "x-display-planes", + "x-display-planes", "x-display-save-under", "x-display-save-under", + "x-display-screens", "x-display-screens", "x-display-visual-class", + "x-display-visual-class", "x-family-fonts", "x-file-dialog", + "x-file-dialog", "x-file-dialog", "x-focus-frame", "x-frame-geometry", + "x-frame-geometry", "x-get-atom-name", "x-get-resource", + "x-get-selection-internal", "x-hide-tip", "x-hide-tip", + "x-list-fonts", "x-load-color-file", "x-menu-bar-open-internal", + "x-menu-bar-open-internal", "x-open-connection", "x-open-connection", + "x-own-selection-internal", "x-parse-geometry", "x-popup-dialog", + "x-popup-menu", "x-register-dnd-atom", "x-select-font", + "x-select-font", "x-selection-exists-p", "x-selection-owner-p", + "x-send-client-message", "x-server-max-request-size", + "x-server-max-request-size", "x-server-vendor", "x-server-vendor", + "x-server-version", "x-server-version", "x-show-tip", "x-show-tip", + "x-synchronize", "x-synchronize", "x-uses-old-gtk-dialog", + "x-window-property", "x-window-property", "x-wm-set-size-hint", + "xw-color-defined-p", "xw-color-defined-p", "xw-color-values", + "xw-color-values", "xw-display-color-p", "xw-display-color-p", + "yes-or-no-p", "zlib-available-p", "zlib-decompress-region", + "forward-point", + } + + emacsBuiltinFunctionHighlighted = []string{ + "defvaralias", "provide", "require", + "with-no-warnings", "define-widget", "with-electric-help", + "throw", "defalias", "featurep", + } + + emacsLambdaListKeywords = []string{ + "&allow-other-keys", "&aux", "&body", "&environment", "&key", "&optional", + "&rest", "&whole", + } + + emacsErrorKeywords = []string{ + "cl-assert", "cl-check-type", "error", "signal", + "user-error", "warn", + } +) + +// EmacsLisp lexer. +var EmacsLisp = internal.Register(TypeRemappingLexer(MustNewLazyLexer( + &Config{ + Name: "EmacsLisp", + Aliases: []string{"emacs", "elisp", "emacs-lisp"}, + Filenames: []string{"*.el"}, + MimeTypes: []string{"text/x-elisp", "application/x-elisp"}, + }, + emacsLispRules, +), TypeMapping{ + {NameVariable, NameFunction, emacsBuiltinFunction}, + {NameVariable, NameBuiltin, emacsSpecialForms}, + {NameVariable, NameException, emacsErrorKeywords}, + {NameVariable, NameBuiltin, append(emacsBuiltinFunctionHighlighted, emacsMacros...)}, + {NameVariable, KeywordPseudo, emacsLambdaListKeywords}, +})) + +func emacsLispRules() Rules { + return Rules{ + "root": { + Default(Push("body")), + }, + "body": { + {`\s+`, Text, nil}, + {`;.*$`, CommentSingle, nil}, + {`"`, LiteralString, Push("string")}, + {`\?([^\\]|\\.)`, LiteralStringChar, nil}, + {`:((?:\\.|[\w!$%&*+-/<=>?@^{}~|])(?:\\.|[\w!$%&*+-/<=>?@^{}~|]|[#.:])*)`, NameBuiltin, nil}, + {`::((?:\\.|[\w!$%&*+-/<=>?@^{}~|])(?:\\.|[\w!$%&*+-/<=>?@^{}~|]|[#.:])*)`, LiteralStringSymbol, nil}, + {`'((?:\\.|[\w!$%&*+-/<=>?@^{}~|])(?:\\.|[\w!$%&*+-/<=>?@^{}~|]|[#.:])*)`, LiteralStringSymbol, nil}, + {`'`, Operator, nil}, + {"`", Operator, nil}, + {"[-+]?\\d+\\.?(?=[ \"()\\]\\'\\n,;`])", LiteralNumberInteger, nil}, + {"[-+]?\\d+/\\d+(?=[ \"()\\]\\'\\n,;`])", LiteralNumber, nil}, + {"[-+]?(\\d*\\.\\d+([defls][-+]?\\d+)?|\\d+(\\.\\d*)?[defls][-+]?\\d+)(?=[ \"()\\]\\'\\n,;`])", LiteralNumberFloat, nil}, + {`\[|\]`, Punctuation, nil}, + {`#:((?:\\.|[\w!$%&*+-/<=>?@^{}~|])(?:\\.|[\w!$%&*+-/<=>?@^{}~|]|[#.:])*)`, LiteralStringSymbol, nil}, + {`#\^\^?`, Operator, nil}, + {`#\'`, NameFunction, nil}, + {`#[bB][+-]?[01]+(/[01]+)?`, LiteralNumberBin, nil}, + {`#[oO][+-]?[0-7]+(/[0-7]+)?`, LiteralNumberOct, nil}, + {`#[xX][+-]?[0-9a-fA-F]+(/[0-9a-fA-F]+)?`, LiteralNumberHex, nil}, + {`#\d+r[+-]?[0-9a-zA-Z]+(/[0-9a-zA-Z]+)?`, LiteralNumber, nil}, + {`#\d+=`, Operator, nil}, + {`#\d+#`, Operator, nil}, + {`(,@|,|\.|:)`, Operator, nil}, + {"(t|nil)(?=[ \"()\\]\\'\\n,;`])", NameConstant, nil}, + {`\*((?:\\.|[\w!$%&*+-/<=>?@^{}~|])(?:\\.|[\w!$%&*+-/<=>?@^{}~|]|[#.:])*)\*`, NameVariableGlobal, nil}, + {`((?:\\.|[\w!$%&*+-/<=>?@^{}~|])(?:\\.|[\w!$%&*+-/<=>?@^{}~|]|[#.:])*)`, NameVariable, nil}, + {`#\(`, Operator, Push("body")}, + {`\(`, Punctuation, Push("body")}, + {`\)`, Punctuation, Pop(1)}, + }, + "string": { + {"[^\"\\\\`]+", LiteralString, nil}, + {"`((?:\\\\.|[\\w!$%&*+-/<=>?@^{}~|])(?:\\\\.|[\\w!$%&*+-/<=>?@^{}~|]|[#.:])*)\\'", LiteralStringSymbol, nil}, + {"`", LiteralString, nil}, + {`\\.`, LiteralString, nil}, + {`\\\n`, LiteralString, nil}, + {`"`, LiteralString, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/e/erlang.go b/vendor/github.com/alecthomas/chroma/lexers/e/erlang.go new file mode 100644 index 0000000..5f5c9ca --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/e/erlang.go @@ -0,0 +1,70 @@ +package e + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Erlang lexer. +var Erlang = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Erlang", + Aliases: []string{"erlang"}, + Filenames: []string{"*.erl", "*.hrl", "*.es", "*.escript"}, + MimeTypes: []string{"text/x-erlang"}, + }, + erlangRules, +)) + +func erlangRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`%.*\n`, Comment, nil}, + {Words(``, `\b`, `after`, `begin`, `case`, `catch`, `cond`, `end`, `fun`, `if`, `let`, `of`, `query`, `receive`, `try`, `when`), Keyword, nil}, + {Words(``, `\b`, `abs`, `append_element`, `apply`, `atom_to_list`, `binary_to_list`, `bitstring_to_list`, `binary_to_term`, `bit_size`, `bump_reductions`, `byte_size`, `cancel_timer`, `check_process_code`, `delete_module`, `demonitor`, `disconnect_node`, `display`, `element`, `erase`, `exit`, `float`, `float_to_list`, `fun_info`, `fun_to_list`, `function_exported`, `garbage_collect`, `get`, `get_keys`, `group_leader`, `hash`, `hd`, `integer_to_list`, `iolist_to_binary`, `iolist_size`, `is_atom`, `is_binary`, `is_bitstring`, `is_boolean`, `is_builtin`, `is_float`, `is_function`, `is_integer`, `is_list`, `is_number`, `is_pid`, `is_port`, `is_process_alive`, `is_record`, `is_reference`, `is_tuple`, `length`, `link`, `list_to_atom`, `list_to_binary`, `list_to_bitstring`, `list_to_existing_atom`, `list_to_float`, `list_to_integer`, `list_to_pid`, `list_to_tuple`, `load_module`, `localtime_to_universaltime`, `make_tuple`, `md5`, `md5_final`, `md5_update`, `memory`, `module_loaded`, `monitor`, `monitor_node`, `node`, `nodes`, `open_port`, `phash`, `phash2`, `pid_to_list`, `port_close`, `port_command`, `port_connect`, `port_control`, `port_call`, `port_info`, `port_to_list`, `process_display`, `process_flag`, `process_info`, `purge_module`, `put`, `read_timer`, `ref_to_list`, `register`, `resume_process`, `round`, `send`, `send_after`, `send_nosuspend`, `set_cookie`, `setelement`, `size`, `spawn`, `spawn_link`, `spawn_monitor`, `spawn_opt`, `split_binary`, `start_timer`, `statistics`, `suspend_process`, `system_flag`, `system_info`, `system_monitor`, `system_profile`, `term_to_binary`, `tl`, `trace`, `trace_delivered`, `trace_info`, `trace_pattern`, `trunc`, `tuple_size`, `tuple_to_list`, `universaltime_to_localtime`, `unlink`, `unregister`, `whereis`), NameBuiltin, nil}, + {Words(``, `\b`, `and`, `andalso`, `band`, `bnot`, `bor`, `bsl`, `bsr`, `bxor`, `div`, `not`, `or`, `orelse`, `rem`, `xor`), OperatorWord, nil}, + {`^-`, Punctuation, Push("directive")}, + {`(\+\+?|--?|\*|/|<|>|/=|=:=|=/=|=<|>=|==?|<-|!|\?)`, Operator, nil}, + {`"`, LiteralString, Push("string")}, + {`<<`, NameLabel, nil}, + {`>>`, NameLabel, nil}, + {`((?:[a-z]\w*|'[^\n']*[^\\]'))(:)`, ByGroups(NameNamespace, Punctuation), nil}, + {`(?:^|(?<=:))((?:[a-z]\w*|'[^\n']*[^\\]'))(\s*)(\()`, ByGroups(NameFunction, Text, Punctuation), nil}, + {`[+-]?(?:[2-9]|[12][0-9]|3[0-6])#[0-9a-zA-Z]+`, LiteralNumberInteger, nil}, + {`[+-]?\d+`, LiteralNumberInteger, nil}, + {`[+-]?\d+.\d+`, LiteralNumberFloat, nil}, + {`[]\[:_@\".{}()|;,]`, Punctuation, nil}, + {`(?:[A-Z_]\w*)`, NameVariable, nil}, + {`(?:[a-z]\w*|'[^\n']*[^\\]')`, Name, nil}, + {`\?(?:(?:[A-Z_]\w*)|(?:[a-z]\w*|'[^\n']*[^\\]'))`, NameConstant, nil}, + {`\$(?:(?:\\(?:[bdefnrstv\'"\\]|[0-7][0-7]?[0-7]?|(?:x[0-9a-fA-F]{2}|x\{[0-9a-fA-F]+\})|\^[a-zA-Z]))|\\[ %]|[^\\])`, LiteralStringChar, nil}, + {`#(?:[a-z]\w*|'[^\n']*[^\\]')(:?\.(?:[a-z]\w*|'[^\n']*[^\\]'))?`, NameLabel, nil}, + {`\A#!.+\n`, CommentHashbang, nil}, + {`#\{`, Punctuation, Push("map_key")}, + }, + "string": { + {`(?:\\(?:[bdefnrstv\'"\\]|[0-7][0-7]?[0-7]?|(?:x[0-9a-fA-F]{2}|x\{[0-9a-fA-F]+\})|\^[a-zA-Z]))`, LiteralStringEscape, nil}, + {`"`, LiteralString, Pop(1)}, + {`~[0-9.*]*[~#+BPWXb-ginpswx]`, LiteralStringInterpol, nil}, + {`[^"\\~]+`, LiteralString, nil}, + {`~`, LiteralString, nil}, + }, + "directive": { + {`(define)(\s*)(\()((?:(?:[A-Z_]\w*)|(?:[a-z]\w*|'[^\n']*[^\\]')))`, ByGroups(NameEntity, Text, Punctuation, NameConstant), Pop(1)}, + {`(record)(\s*)(\()((?:(?:[A-Z_]\w*)|(?:[a-z]\w*|'[^\n']*[^\\]')))`, ByGroups(NameEntity, Text, Punctuation, NameLabel), Pop(1)}, + {`(?:[a-z]\w*|'[^\n']*[^\\]')`, NameEntity, Pop(1)}, + }, + "map_key": { + Include("root"), + {`=>`, Punctuation, Push("map_val")}, + {`:=`, Punctuation, Push("map_val")}, + {`\}`, Punctuation, Pop(1)}, + }, + "map_val": { + Include("root"), + {`,`, Punctuation, Pop(1)}, + {`(?=\})`, Punctuation, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/f/factor.go b/vendor/github.com/alecthomas/chroma/lexers/f/factor.go new file mode 100644 index 0000000..d88beb2 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/f/factor.go @@ -0,0 +1,119 @@ +package f + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Factor lexer. +var Factor = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Factor", + Aliases: []string{"factor"}, + Filenames: []string{"*.factor"}, + MimeTypes: []string{"text/x-factor"}, + }, + factorRules, +)) + +func factorRules() Rules { + return Rules{ + "root": { + {`#!.*$`, CommentPreproc, nil}, + Default(Push("base")), + }, + "base": { + {`\s+`, Text, nil}, + {`((?:MACRO|MEMO|TYPED)?:[:]?)(\s+)(\S+)`, ByGroups(Keyword, Text, NameFunction), nil}, + {`(M:[:]?)(\s+)(\S+)(\s+)(\S+)`, ByGroups(Keyword, Text, NameClass, Text, NameFunction), nil}, + {`(C:)(\s+)(\S+)(\s+)(\S+)`, ByGroups(Keyword, Text, NameFunction, Text, NameClass), nil}, + {`(GENERIC:)(\s+)(\S+)`, ByGroups(Keyword, Text, NameFunction), nil}, + {`(HOOK:|GENERIC#)(\s+)(\S+)(\s+)(\S+)`, ByGroups(Keyword, Text, NameFunction, Text, NameFunction), nil}, + {`\(\s`, NameFunction, Push("stackeffect")}, + {`;\s`, Keyword, nil}, + {`(USING:)(\s+)`, ByGroups(KeywordNamespace, Text), Push("vocabs")}, + {`(USE:|UNUSE:|IN:|QUALIFIED:)(\s+)(\S+)`, ByGroups(KeywordNamespace, Text, NameNamespace), nil}, + {`(QUALIFIED-WITH:)(\s+)(\S+)(\s+)(\S+)`, ByGroups(KeywordNamespace, Text, NameNamespace, Text, NameNamespace), nil}, + {`(FROM:|EXCLUDE:)(\s+)(\S+)(\s+=>\s)`, ByGroups(KeywordNamespace, Text, NameNamespace, Text), Push("words")}, + {`(RENAME:)(\s+)(\S+)(\s+)(\S+)(\s+=>\s+)(\S+)`, ByGroups(KeywordNamespace, Text, NameFunction, Text, NameNamespace, Text, NameFunction), nil}, + {`(ALIAS:|TYPEDEF:)(\s+)(\S+)(\s+)(\S+)`, ByGroups(KeywordNamespace, Text, NameFunction, Text, NameFunction), nil}, + {`(DEFER:|FORGET:|POSTPONE:)(\s+)(\S+)`, ByGroups(KeywordNamespace, Text, NameFunction), nil}, + {`(TUPLE:|ERROR:)(\s+)(\S+)(\s+<\s+)(\S+)`, ByGroups(Keyword, Text, NameClass, Text, NameClass), Push("slots")}, + {`(TUPLE:|ERROR:|BUILTIN:)(\s+)(\S+)`, ByGroups(Keyword, Text, NameClass), Push("slots")}, + {`(MIXIN:|UNION:|INTERSECTION:)(\s+)(\S+)`, ByGroups(Keyword, Text, NameClass), nil}, + {`(PREDICATE:)(\s+)(\S+)(\s+<\s+)(\S+)`, ByGroups(Keyword, Text, NameClass, Text, NameClass), nil}, + {`(C:)(\s+)(\S+)(\s+)(\S+)`, ByGroups(Keyword, Text, NameFunction, Text, NameClass), nil}, + {`(INSTANCE:)(\s+)(\S+)(\s+)(\S+)`, ByGroups(Keyword, Text, NameClass, Text, NameClass), nil}, + {`(SLOT:)(\s+)(\S+)`, ByGroups(Keyword, Text, NameFunction), nil}, + {`(SINGLETON:)(\s+)(\S+)`, ByGroups(Keyword, Text, NameClass), nil}, + {`SINGLETONS:`, Keyword, Push("classes")}, + {`(CONSTANT:|SYMBOL:|MAIN:|HELP:)(\s+)(\S+)`, ByGroups(Keyword, Text, NameFunction), nil}, + {`SYMBOLS:\s`, Keyword, Push("words")}, + {`SYNTAX:\s`, Keyword, nil}, + {`ALIEN:\s`, Keyword, nil}, + {`(STRUCT:)(\s+)(\S+)`, ByGroups(Keyword, Text, NameClass), nil}, + {`(FUNCTION:)(\s+\S+\s+)(\S+)(\s+\(\s+[^)]+\)\s)`, ByGroups(KeywordNamespace, Text, NameFunction, Text), nil}, + {`(FUNCTION-ALIAS:)(\s+)(\S+)(\s+\S+\s+)(\S+)(\s+\(\s+[^)]+\)\s)`, ByGroups(KeywordNamespace, Text, NameFunction, Text, NameFunction, Text), nil}, + {`(?:)\s`, KeywordNamespace, nil}, + {`"""\s+(?:.|\n)*?\s+"""`, LiteralString, nil}, + {`"(?:\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`\S+"\s+(?:\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`CHAR:\s+(?:\\[\\abfnrstv]|[^\\]\S*)\s`, LiteralStringChar, nil}, + {`!\s+.*$`, Comment, nil}, + {`#!\s+.*$`, Comment, nil}, + {`/\*\s+(?:.|\n)*?\s\*/\s`, Comment, nil}, + {`[tf]\s`, NameConstant, nil}, + {`[\\$]\s+\S+`, NameConstant, nil}, + {`M\\\s+\S+\s+\S+`, NameConstant, nil}, + {`[+-]?(?:[\d,]*\d)?\.(?:\d([\d,]*\d)?)?(?:[eE][+-]?\d+)?\s`, LiteralNumber, nil}, + {`[+-]?\d(?:[\d,]*\d)?(?:[eE][+-]?\d+)?\s`, LiteralNumber, nil}, + {`0x[a-fA-F\d](?:[a-fA-F\d,]*[a-fA-F\d])?(?:p\d([\d,]*\d)?)?\s`, LiteralNumber, nil}, + {`NAN:\s+[a-fA-F\d](?:[a-fA-F\d,]*[a-fA-F\d])?(?:p\d([\d,]*\d)?)?\s`, LiteralNumber, nil}, + {`0b[01]+\s`, LiteralNumberBin, nil}, + {`0o[0-7]+\s`, LiteralNumberOct, nil}, + {`(?:\d([\d,]*\d)?)?\+\d(?:[\d,]*\d)?/\d(?:[\d,]*\d)?\s`, LiteralNumber, nil}, + {`(?:\-\d([\d,]*\d)?)?\-\d(?:[\d,]*\d)?/\d(?:[\d,]*\d)?\s`, LiteralNumber, nil}, + {`(?:deprecated|final|foldable|flushable|inline|recursive)\s`, Keyword, nil}, + {Words(``, `\s`, `-rot`, `2bi`, `2bi@`, `2bi*`, `2curry`, `2dip`, `2drop`, `2dup`, `2keep`, `2nip`, `2over`, `2tri`, `2tri@`, `2tri*`, `3bi`, `3curry`, `3dip`, `3drop`, `3dup`, `3keep`, `3tri`, `4dip`, `4drop`, `4dup`, `4keep`, ``, `=`, `>boolean`, `clone`, `?`, `?execute`, `?if`, `and`, `assert`, `assert=`, `assert?`, `bi`, `bi-curry`, `bi-curry@`, `bi-curry*`, `bi@`, `bi*`, `boa`, `boolean`, `boolean?`, `both?`, `build`, `call`, `callstack`, `callstack>array`, `callstack?`, `clear`, `(clone)`, `compose`, `compose?`, `curry`, `curry?`, `datastack`, `die`, `dip`, `do`, `drop`, `dup`, `dupd`, `either?`, `eq?`, `equal?`, `execute`, `hashcode`, `hashcode*`, `identity-hashcode`, `identity-tuple`, `identity-tuple?`, `if`, `if*`, `keep`, `loop`, `most`, `new`, `nip`, `not`, `null`, `object`, `or`, `over`, `pick`, `prepose`, `retainstack`, `rot`, `same?`, `swap`, `swapd`, `throw`, `tri`, `tri-curry`, `tri-curry@`, `tri-curry*`, `tri@`, `tri*`, `tuple`, `tuple?`, `unless`, `unless*`, `until`, `when`, `when*`, `while`, `with`, `wrapper`, `wrapper?`, `xor`), NameBuiltin, nil}, + {Words(``, `\s`, `2cache`, ``, `>alist`, `?at`, `?of`, `assoc`, `assoc-all?`, `assoc-any?`, `assoc-clone-like`, `assoc-combine`, `assoc-diff`, `assoc-diff!`, `assoc-differ`, `assoc-each`, `assoc-empty?`, `assoc-filter`, `assoc-filter!`, `assoc-filter-as`, `assoc-find`, `assoc-hashcode`, `assoc-intersect`, `assoc-like`, `assoc-map`, `assoc-map-as`, `assoc-partition`, `assoc-refine`, `assoc-size`, `assoc-stack`, `assoc-subset?`, `assoc-union`, `assoc-union!`, `assoc=`, `assoc>map`, `assoc?`, `at`, `at+`, `at*`, `cache`, `change-at`, `clear-assoc`, `delete-at`, `delete-at*`, `enum`, `enum?`, `extract-keys`, `inc-at`, `key?`, `keys`, `map>assoc`, `maybe-set-at`, `new-assoc`, `of`, `push-at`, `rename-at`, `set-at`, `sift-keys`, `sift-values`, `substitute`, `unzip`, `value-at`, `value-at*`, `value?`, `values`, `zip`), NameBuiltin, nil}, + {Words(``, `\s`, `2cleave`, `2cleave>quot`, `3cleave`, `3cleave>quot`, `4cleave`, `4cleave>quot`, `alist>quot`, `call-effect`, `case`, `case-find`, `case>quot`, `cleave`, `cleave>quot`, `cond`, `cond>quot`, `deep-spread>quot`, `execute-effect`, `linear-case-quot`, `no-case`, `no-case?`, `no-cond`, `no-cond?`, `recursive-hashcode`, `shallow-spread>quot`, `spread`, `to-fixed-point`, `wrong-values`, `wrong-values?`), NameBuiltin, nil}, + {Words(``, `\s`, `-`, `/`, `/f`, `/i`, `/mod`, `2/`, `2^`, `<`, `<=`, ``, `>`, `>=`, `>bignum`, `>fixnum`, `>float`, `>integer`, `(all-integers?)`, `(each-integer)`, `(find-integer)`, `*`, `+`, `?1+`, `abs`, `align`, `all-integers?`, `bignum`, `bignum?`, `bit?`, `bitand`, `bitnot`, `bitor`, `bits>double`, `bits>float`, `bitxor`, `complex`, `complex?`, `denominator`, `double>bits`, `each-integer`, `even?`, `find-integer`, `find-last-integer`, `fixnum`, `fixnum?`, `float`, `float>bits`, `float?`, `fp-bitwise=`, `fp-infinity?`, `fp-nan-payload`, `fp-nan?`, `fp-qnan?`, `fp-sign`, `fp-snan?`, `fp-special?`, `if-zero`, `imaginary-part`, `integer`, `integer>fixnum`, `integer>fixnum-strict`, `integer?`, `log2`, `log2-expects-positive`, `log2-expects-positive?`, `mod`, `neg`, `neg?`, `next-float`, `next-power-of-2`, `number`, `number=`, `number?`, `numerator`, `odd?`, `out-of-fixnum-range`, `out-of-fixnum-range?`, `power-of-2?`, `prev-float`, `ratio`, `ratio?`, `rational`, `rational?`, `real`, `real-part`, `real?`, `recip`, `rem`, `sgn`, `shift`, `sq`, `times`, `u<`, `u<=`, `u>`, `u>=`, `unless-zero`, `unordered?`, `when-zero`, `zero?`), NameBuiltin, nil}, + {Words(``, `\s`, `1sequence`, `2all?`, `2each`, `2map`, `2map-as`, `2map-reduce`, `2reduce`, `2selector`, `2sequence`, `3append`, `3append-as`, `3each`, `3map`, `3map-as`, `3sequence`, `4sequence`, ``, ``, ``, `?first`, `?last`, `?nth`, `?second`, `?set-nth`, `accumulate`, `accumulate!`, `accumulate-as`, `all?`, `any?`, `append`, `append!`, `append-as`, `assert-sequence`, `assert-sequence=`, `assert-sequence?`, `binary-reduce`, `bounds-check`, `bounds-check?`, `bounds-error`, `bounds-error?`, `but-last`, `but-last-slice`, `cartesian-each`, `cartesian-map`, `cartesian-product`, `change-nth`, `check-slice`, `check-slice-error`, `clone-like`, `collapse-slice`, `collector`, `collector-for`, `concat`, `concat-as`, `copy`, `count`, `cut`, `cut-slice`, `cut*`, `delete-all`, `delete-slice`, `drop-prefix`, `each`, `each-from`, `each-index`, `empty?`, `exchange`, `filter`, `filter!`, `filter-as`, `find`, `find-from`, `find-index`, `find-index-from`, `find-last`, `find-last-from`, `first`, `first2`, `first3`, `first4`, `flip`, `follow`, `fourth`, `glue`, `halves`, `harvest`, `head`, `head-slice`, `head-slice*`, `head*`, `head?`, `if-empty`, `immutable`, `immutable-sequence`, `immutable-sequence?`, `immutable?`, `index`, `index-from`, `indices`, `infimum`, `infimum-by`, `insert-nth`, `interleave`, `iota`, `iota-tuple`, `iota-tuple?`, `join`, `join-as`, `last`, `last-index`, `last-index-from`, `length`, `lengthen`, `like`, `longer`, `longer?`, `longest`, `map`, `map!`, `map-as`, `map-find`, `map-find-last`, `map-index`, `map-integers`, `map-reduce`, `map-sum`, `max-length`, `member-eq?`, `member?`, `midpoint@`, `min-length`, `mismatch`, `move`, `new-like`, `new-resizable`, `new-sequence`, `non-negative-integer-expected`, `non-negative-integer-expected?`, `nth`, `nths`, `pad-head`, `pad-tail`, `padding`, `partition`, `pop`, `pop*`, `prefix`, `prepend`, `prepend-as`, `produce`, `produce-as`, `product`, `push`, `push-all`, `push-either`, `push-if`, `reduce`, `reduce-index`, `remove`, `remove!`, `remove-eq`, `remove-eq!`, `remove-nth`, `remove-nth!`, `repetition`, `repetition?`, `replace-slice`, `replicate`, `replicate-as`, `rest`, `rest-slice`, `reverse`, `reverse!`, `reversed`, `reversed?`, `second`, `selector`, `selector-for`, `sequence`, `sequence-hashcode`, `sequence=`, `sequence?`, `set-first`, `set-fourth`, `set-last`, `set-length`, `set-nth`, `set-second`, `set-third`, `short`, `shorten`, `shorter`, `shorter?`, `shortest`, `sift`, `slice`, `slice-error`, `slice-error?`, `slice?`, `snip`, `snip-slice`, `start`, `start*`, `subseq`, `subseq?`, `suffix`, `suffix!`, `sum`, `sum-lengths`, `supremum`, `supremum-by`, `surround`, `tail`, `tail-slice`, `tail-slice*`, `tail*`, `tail?`, `third`, `trim`, `trim-head`, `trim-head-slice`, `trim-slice`, `trim-tail`, `trim-tail-slice`, `unclip`, `unclip-last`, `unclip-last-slice`, `unclip-slice`, `unless-empty`, `virtual-exemplar`, `virtual-sequence`, `virtual-sequence?`, `virtual@`, `when-empty`), NameBuiltin, nil}, + {Words(``, `\s`, `+@`, `change`, `change-global`, `counter`, `dec`, `get`, `get-global`, `global`, `inc`, `init-namespaces`, `initialize`, `is-global`, `make-assoc`, `namespace`, `namestack`, `off`, `on`, `set`, `set-global`, `set-namestack`, `toggle`, `with-global`, `with-scope`, `with-variable`, `with-variables`), NameBuiltin, nil}, + {Words(``, `\s`, `1array`, `2array`, `3array`, `4array`, ``, `>array`, `array`, `array?`, `pair`, `pair?`, `resize-array`), NameBuiltin, nil}, + {Words(``, `\s`, `(each-stream-block-slice)`, `(each-stream-block)`, `(stream-contents-by-block)`, `(stream-contents-by-element)`, `(stream-contents-by-length-or-block)`, `(stream-contents-by-length)`, `+byte+`, `+character+`, `bad-seek-type`, `bad-seek-type?`, `bl`, `contents`, `each-block`, `each-block-size`, `each-block-slice`, `each-line`, `each-morsel`, `each-stream-block`, `each-stream-block-slice`, `each-stream-line`, `error-stream`, `flush`, `input-stream`, `input-stream?`, `invalid-read-buffer`, `invalid-read-buffer?`, `lines`, `nl`, `output-stream`, `output-stream?`, `print`, `read`, `read-into`, `read-partial`, `read-partial-into`, `read-until`, `read1`, `readln`, `seek-absolute`, `seek-absolute?`, `seek-end`, `seek-end?`, `seek-input`, `seek-output`, `seek-relative`, `seek-relative?`, `stream-bl`, `stream-contents`, `stream-contents*`, `stream-copy`, `stream-copy*`, `stream-element-type`, `stream-flush`, `stream-length`, `stream-lines`, `stream-nl`, `stream-print`, `stream-read`, `stream-read-into`, `stream-read-partial`, `stream-read-partial-into`, `stream-read-partial-unsafe`, `stream-read-unsafe`, `stream-read-until`, `stream-read1`, `stream-readln`, `stream-seek`, `stream-seekable?`, `stream-tell`, `stream-write`, `stream-write1`, `tell-input`, `tell-output`, `with-error-stream`, `with-error-stream*`, `with-error>output`, `with-input-output+error-streams`, `with-input-output+error-streams*`, `with-input-stream`, `with-input-stream*`, `with-output-stream`, `with-output-stream*`, `with-output>error`, `with-output+error-stream`, `with-output+error-stream*`, `with-streams`, `with-streams*`, `write`, `write1`), NameBuiltin, nil}, + {Words(``, `\s`, `1string`, ``, `>string`, `resize-string`, `string`, `string?`), NameBuiltin, nil}, + {Words(``, `\s`, `1vector`, ``, `>vector`, `?push`, `vector`, `vector?`), NameBuiltin, nil}, + {Words(``, `\s`, ``, ``, ``, `attempt-all`, `attempt-all-error`, `attempt-all-error?`, `callback-error-hook`, `callcc0`, `callcc1`, `cleanup`, `compute-restarts`, `condition`, `condition?`, `continuation`, `continuation?`, `continue`, `continue-restart`, `continue-with`, `current-continuation`, `error`, `error-continuation`, `error-in-thread`, `error-thread`, `ifcc`, `ignore-errors`, `in-callback?`, `original-error`, `recover`, `restart`, `restart?`, `restarts`, `rethrow`, `rethrow-restarts`, `return`, `return-continuation`, `thread-error-hook`, `throw-continue`, `throw-restarts`, `with-datastack`, `with-return`), NameBuiltin, nil}, + {`\S+`, Text, nil}, + }, + "stackeffect": { + {`\s+`, Text, nil}, + {`\(\s+`, NameFunction, Push("stackeffect")}, + {`\)\s`, NameFunction, Pop(1)}, + {`--\s`, NameFunction, nil}, + {`\S+`, NameVariable, nil}, + }, + "slots": { + {`\s+`, Text, nil}, + {`;\s`, Keyword, Pop(1)}, + {`(\{\s+)(\S+)(\s+[^}]+\s+\}\s)`, ByGroups(Text, NameVariable, Text), nil}, + {`\S+`, NameVariable, nil}, + }, + "vocabs": { + {`\s+`, Text, nil}, + {`;\s`, Keyword, Pop(1)}, + {`\S+`, NameNamespace, nil}, + }, + "classes": { + {`\s+`, Text, nil}, + {`;\s`, Keyword, Pop(1)}, + {`\S+`, NameClass, nil}, + }, + "words": { + {`\s+`, Text, nil}, + {`;\s`, Keyword, Pop(1)}, + {`\S+`, NameFunction, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/f/fennel.go b/vendor/github.com/alecthomas/chroma/lexers/f/fennel.go new file mode 100644 index 0000000..23134d4 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/f/fennel.go @@ -0,0 +1,66 @@ +package f + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Fennel lexer. +var Fennel = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Fennel", + Aliases: []string{"fennel", "fnl"}, + Filenames: []string{"*.fennel"}, + MimeTypes: []string{"text/x-fennel", "application/x-fennel"}, + }, + fennelRules, +)) + +// Here's some Fennel code used to generate the lists of keywords: +// (local fennel (require :fennel)) +// +// (fn member? [t x] (each [_ y (ipairs t)] (when (= y x) (lua "return true")))) +// +// (local declarations [:fn :lambda :λ :local :var :global :macro :macros]) +// (local keywords []) +// (local globals []) +// +// (each [name data (pairs (fennel.syntax))] +// (if (member? declarations name) nil ; already populated +// data.special? (table.insert keywords name) +// data.macro? (table.insert keywords name) +// data.global? (table.insert globals name))) +// +// (fn quoted [tbl] +// (table.sort tbl) +// (table.concat (icollect [_ k (ipairs tbl)] +// (string.format "`%s`" k)) ", ")) +// +// (print :Keyword (quoted keywords)) +// (print :KeywordDeclaration (quoted declarations)) +// (print :NameBuiltin (quoted globals)) + +func fennelRules() Rules { + return Rules{ + "root": { + {`;.*$`, CommentSingle, nil}, + {`\s+`, Whitespace, nil}, + {`-?\d+\.\d+`, LiteralNumberFloat, nil}, + {`-?\d+`, LiteralNumberInteger, nil}, + {`0x-?[abcdef\d]+`, LiteralNumberHex, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`'(?!#)[\w!$%*+<=>?/.#-]+`, LiteralStringSymbol, nil}, + {`\\(.|[a-z]+)`, LiteralStringChar, nil}, + {`::?#?(?!#)[\w!$%*+<=>?/.#-]+`, LiteralStringSymbol, nil}, + {"~@|[`\\'#^~&@]", Operator, nil}, + {Words(``, ` `, `#`, `%`, `*`, `+`, `-`, `->`, `->>`, `-?>`, `-?>>`, `.`, `..`, `/`, `//`, `:`, `<`, `<=`, `=`, `>`, `>=`, `?.`, `^`, `accumulate`, `and`, `band`, `bnot`, `bor`, `bxor`, `collect`, `comment`, `do`, `doc`, `doto`, `each`, `eval-compiler`, `for`, `hashfn`, `icollect`, `if`, `import-macros`, `include`, `length`, `let`, `lshift`, `lua`, `macrodebug`, `match`, `not`, `not=`, `or`, `partial`, `pick-args`, `pick-values`, `quote`, `require-macros`, `rshift`, `set`, `set-forcibly!`, `tset`, `values`, `when`, `while`, `with-open`, `~=`), Keyword, nil}, + {Words(``, ` `, `fn`, `global`, `lambda`, `local`, `macro`, `macros`, `var`, `λ`), KeywordDeclaration, nil}, + {Words(``, ` `, `_G`, `arg`, `assert`, `bit32`, `bit32.arshift`, `bit32.band`, `bit32.bnot`, `bit32.bor`, `bit32.btest`, `bit32.bxor`, `bit32.extract`, `bit32.lrotate`, `bit32.lshift`, `bit32.replace`, `bit32.rrotate`, `bit32.rshift`, `collectgarbage`, `coroutine`, `coroutine.create`, `coroutine.resume`, `coroutine.running`, `coroutine.status`, `coroutine.wrap`, `coroutine.yield`, `debug`, `debug.debug`, `debug.gethook`, `debug.getinfo`, `debug.getlocal`, `debug.getmetatable`, `debug.getregistry`, `debug.getupvalue`, `debug.getuservalue`, `debug.sethook`, `debug.setlocal`, `debug.setmetatable`, `debug.setupvalue`, `debug.setuservalue`, `debug.traceback`, `debug.upvalueid`, `debug.upvaluejoin`, `dofile`, `error`, `getmetatable`, `io`, `io.close`, `io.flush`, `io.input`, `io.lines`, `io.open`, `io.output`, `io.popen`, `io.read`, `io.tmpfile`, `io.type`, `io.write`, `ipairs`, `load`, `loadfile`, `loadstring`, `math`, `math.abs`, `math.acos`, `math.asin`, `math.atan`, `math.atan2`, `math.ceil`, `math.cos`, `math.cosh`, `math.deg`, `math.exp`, `math.floor`, `math.fmod`, `math.frexp`, `math.ldexp`, `math.log`, `math.log10`, `math.max`, `math.min`, `math.modf`, `math.pow`, `math.rad`, `math.random`, `math.randomseed`, `math.sin`, `math.sinh`, `math.sqrt`, `math.tan`, `math.tanh`, `module`, `next`, `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.loadlib`, `package.searchpath`, `package.seeall`, `pairs`, `pcall`, `print`, `rawequal`, `rawget`, `rawlen`, `rawset`, `require`, `select`, `setmetatable`, `string`, `string.byte`, `string.char`, `string.dump`, `string.find`, `string.format`, `string.gmatch`, `string.gsub`, `string.len`, `string.lower`, `string.match`, `string.rep`, `string.reverse`, `string.sub`, `string.upper`, `table`, `table.concat`, `table.insert`, `table.maxn`, `table.pack`, `table.remove`, `table.sort`, `table.unpack`, `tonumber`, `tostring`, `type`, `unpack`, `xpcall`), NameBuiltin, nil}, + {`(?<=\()(?!#)[\w!$%*+<=>?/.#-]+`, NameFunction, nil}, + {`(?!#)[\w!$%*+<=>?/.#-]+`, NameVariable, nil}, + {`(\[|\])`, Punctuation, nil}, + {`(\{|\})`, Punctuation, nil}, + {`(\(|\))`, Punctuation, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/f/fish.go b/vendor/github.com/alecthomas/chroma/lexers/f/fish.go new file mode 100644 index 0000000..29d5028 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/f/fish.go @@ -0,0 +1,98 @@ +package f + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Fish lexer. +var Fish = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Fish", + Aliases: []string{"fish", "fishshell"}, + Filenames: []string{"*.fish", "*.load"}, + MimeTypes: []string{"application/x-fish"}, + }, + fishRules, +)) + +func fishRules() Rules { + keywords := []string{ + `begin`, `end`, `if`, `else`, `while`, `break`, `for`, `return`, `function`, `block`, + `case`, `continue`, `switch`, `not`, `and`, `or`, `set`, `echo`, `exit`, `pwd`, `true`, + `false`, `cd`, `cdh`, `count`, `test`, + } + keywordsPattern := Words(`\b`, `\b`, keywords...) + + builtins := []string{ + `alias`, `bg`, `bind`, `breakpoint`, `builtin`, `argparse`, `abbr`, `string`, `command`, + `commandline`, `complete`, `contains`, `dirh`, `dirs`, `disown`, `emit`, `eval`, `exec`, + `fg`, `fish`, `fish_add_path`, `fish_breakpoint_prompt`, `fish_command_not_found`, + `fish_config`, `fish_git_prompt`, `fish_greeting`, `fish_hg_prompt`, `fish_indent`, + `fish_is_root_user`, `fish_key_reader`, `fish_mode_prompt`, `fish_opt`, `fish_pager`, + `fish_prompt`, `fish_right_prompt`, `fish_status_to_signal`, `fish_svn_prompt`, + `fish_title`, `fish_update_completions`, `fish_vcs_prompt`, `fishd`, `funced`, + `funcsave`, `functions`, `help`, `history`, `isatty`, `jobs`, `math`, `mimedb`, `nextd`, + `open`, `prompt_pwd`, `realpath`, `popd`, `prevd`, `psub`, `pushd`, `random`, `read`, + `set_color`, `source`, `status`, `suspend`, `trap`, `type`, `ulimit`, `umask`, `vared`, + `fc`, `getopts`, `hash`, `kill`, `printf`, `time`, `wait`, + } + + return Rules{ + "root": { + Include("basic"), + Include("interp"), + Include("data"), + }, + "interp": { + {`\$\(\(`, Keyword, Push("math")}, + {`\(`, Keyword, Push("paren")}, + {`\$#?(\w+|.)`, NameVariable, nil}, + }, + "basic": { + {Words(`(?<=(?:^|\A|;|&&|\|\||\||`+keywordsPattern+`)\s*)`, `(?=;?\b)`, keywords...), Keyword, nil}, + {`(?<=for\s+\S+\s+)in\b`, Keyword, nil}, + {Words(`\b`, `\s*\b(?!\.)`, builtins...), NameBuiltin, nil}, + {`#!.*\n`, CommentHashbang, nil}, + {`#.*\n`, Comment, nil}, + {`\\[\w\W]`, LiteralStringEscape, nil}, + {`(\b\w+)(\s*)(=)`, ByGroups(NameVariable, Text, Operator), nil}, + {`[\[\]()={}]`, Operator, nil}, + {`(?<=\[[^\]]+)\.\.|-(?=[^\[]+\])`, Operator, nil}, + {`<<-?\s*(\'?)\\?(\w+)[\w\W]+?\2`, LiteralString, nil}, + {`(?<=set\s+(?:--?[^\d\W][\w-]*\s+)?)\w+`, NameVariable, nil}, + {`(?<=for\s+)\w[\w-]*(?=\s+in)`, NameVariable, nil}, + {`(?<=function\s+)\w(?:[^\n])*?(?= *[-\n])`, NameFunction, nil}, + {`(?<=(?:^|\b(?:and|or|sudo)\b|;|\|\||&&|\||\(|(?:\b\w+\s*=\S+\s)) *)\w[\w-]*`, NameFunction, nil}, + }, + "data": { + {`(?s)\$?"(\\\\|\\[0-7]+|\\.|[^"\\$])*"`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Push("string")}, + {`(?s)\$'(\\\\|\\[0-7]+|\\.|[^'\\])*'`, LiteralStringSingle, nil}, + {`(?s)'.*?'`, LiteralStringSingle, nil}, + {`;`, Punctuation, nil}, + {`&&|\|\||&|\||\^|<|>`, Operator, nil}, + {`\s+`, Text, nil}, + {`\b\d+\b`, LiteralNumber, nil}, + {`(?<=\s+)--?[^\d][\w-]*`, NameAttribute, nil}, + {".+?", Text, nil}, + }, + "string": { + {`"`, LiteralStringDouble, Pop(1)}, + {`(?s)(\\\\|\\[0-7]+|\\.|[^"\\$])+`, LiteralStringDouble, nil}, + Include("interp"), + }, + "paren": { + {`\)`, Keyword, Pop(1)}, + Include("root"), + }, + "math": { + {`\)\)`, Keyword, Pop(1)}, + {`[-+*/%^|&]|\*\*|\|\|`, Operator, nil}, + {`\d+#\d+`, LiteralNumber, nil}, + {`\d+#(?! )`, LiteralNumber, nil}, + {`\d+`, LiteralNumber, nil}, + Include("root"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/f/forth.go b/vendor/github.com/alecthomas/chroma/lexers/f/forth.go new file mode 100644 index 0000000..8d66708 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/f/forth.go @@ -0,0 +1,44 @@ +package f + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Forth lexer. +var Forth = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Forth", + Aliases: []string{"forth"}, + Filenames: []string{"*.frt", "*.fth", "*.fs"}, + MimeTypes: []string{"application/x-forth"}, + CaseInsensitive: true, + }, + forthRules, +)) + +func forthRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`\\.*?\n`, CommentSingle, nil}, + {`\([\s].*?\)`, CommentSingle, nil}, + {`(:|variable|constant|value|buffer:)(\s+)`, ByGroups(KeywordNamespace, Text), Push("worddef")}, + {`([.sc]")(\s+?)`, ByGroups(LiteralString, Text), Push("stringdef")}, + {`(blk|block|buffer|evaluate|flush|load|save-buffers|update|empty-buffers|list|refill|scr|thru|\#s|\*\/mod|\+loop|\/mod|0<|0=|1\+|1-|2!|2\*|2\/|2@|2drop|2dup|2over|2swap|>body|>in|>number|>r|\?dup|abort|abort\"|abs|accept|align|aligned|allot|and|base|begin|bl|c!|c,|c@|cell\+|cells|char|char\+|chars|constant|count|cr|create|decimal|depth|do|does>|drop|dup|else|emit|environment\?|evaluate|execute|exit|fill|find|fm\/mod|here|hold|i|if|immediate|invert|j|key|leave|literal|loop|lshift|m\*|max|min|mod|move|negate|or|over|postpone|quit|r>|r@|recurse|repeat|rot|rshift|s\"|s>d|sign|sm\/rem|source|space|spaces|state|swap|then|type|u\.|u\<|um\*|um\/mod|unloop|until|variable|while|word|xor|\[char\]|\[\'\]|@|!|\#|<\#|\#>|:|;|\+|-|\*|\/|,|<|>|\|1\+|1-|\.|\.r|0<>|0>|2>r|2r>|2r@|:noname|\?do|again|c\"|case|compile,|endcase|endof|erase|false|hex|marker|nip|of|pad|parse|pick|refill|restore-input|roll|save-input|source-id|to|true|tuck|u\.r|u>|unused|value|within|\[compile\]|\#tib|convert|expect|query|span|tib|2constant|2literal|2variable|d\+|d-|d\.|d\.r|d0<|d0=|d2\*|d2\/|d<|d=|d>s|dabs|dmax|dmin|dnegate|m\*\/|m\+|2rot|du<|catch|throw|abort|abort\"|at-xy|key\?|page|ekey|ekey>char|ekey\?|emit\?|ms|time&date|BIN|CLOSE-FILE|CREATE-FILE|DELETE-FILE|FILE-POSITION|FILE-SIZE|INCLUDE-FILE|INCLUDED|OPEN-FILE|R\/O|R\/W|READ-FILE|READ-LINE|REPOSITION-FILE|RESIZE-FILE|S\"|SOURCE-ID|W/O|WRITE-FILE|WRITE-LINE|FILE-STATUS|FLUSH-FILE|REFILL|RENAME-FILE|>float|d>f|f!|f\*|f\+|f-|f\/|f0<|f0=|f<|f>d|f@|falign|faligned|fconstant|fdepth|fdrop|fdup|fliteral|float\+|floats|floor|fmax|fmin|fnegate|fover|frot|fround|fswap|fvariable|represent|df!|df@|dfalign|dfaligned|dfloat\+|dfloats|f\*\*|f\.|fabs|facos|facosh|falog|fasin|fasinh|fatan|fatan2|fatanh|fcos|fcosh|fe\.|fexp|fexpm1|fln|flnp1|flog|fs\.|fsin|fsincos|fsinh|fsqrt|ftan|ftanh|f~|precision|set-precision|sf!|sf@|sfalign|sfaligned|sfloat\+|sfloats|\(local\)|to|locals\||allocate|free|resize|definitions|find|forth-wordlist|get-current|get-order|search-wordlist|set-current|set-order|wordlist|also|forth|only|order|previous|-trailing|\/string|blank|cmove|cmove>|compare|search|sliteral|.s|dump|see|words|;code|ahead|assembler|bye|code|cs-pick|cs-roll|editor|state|\[else\]|\[if\]|\[then\]|forget|defer|defer@|defer!|action-of|begin-structure|field:|buffer:|parse-name|buffer:|traverse-wordlist|n>r|nr>|2value|fvalue|name>interpret|name>compile|name>string|cfield:|end-structure)\s`, Keyword, nil}, + {`(\$[0-9A-F]+)`, LiteralNumberHex, nil}, + {`(\#|%|&|\-|\+)?[0-9]+`, LiteralNumberInteger, nil}, + {`(\#|%|&|\-|\+)?[0-9.]+`, KeywordType, nil}, + {`(@i|!i|@e|!e|pause|noop|turnkey|sleep|itype|icompare|sp@|sp!|rp@|rp!|up@|up!|>a|a>|a@|a!|a@+|a@-|>b|b>|b@|b!|b@+|b@-|find-name|1ms|sp0|rp0|\(evaluate\)|int-trap|int!)\s`, NameConstant, nil}, + {`(do-recognizer|r:fail|recognizer:|get-recognizers|set-recognizers|r:float|r>comp|r>int|r>post|r:name|r:word|r:dnum|r:num|recognizer|forth-recognizer|rec:num|rec:float|rec:word)\s`, NameDecorator, nil}, + {`(Evalue|Rvalue|Uvalue|Edefer|Rdefer|Udefer)(\s+)`, ByGroups(KeywordNamespace, Text), Push("worddef")}, + {`[^\s]+(?=[\s])`, NameFunction, nil}, + }, + "worddef": { + {`\S+`, NameClass, Pop(1)}, + }, + "stringdef": { + {`[^"]+`, LiteralString, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/f/fortran.go b/vendor/github.com/alecthomas/chroma/lexers/f/fortran.go new file mode 100644 index 0000000..af4a969 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/f/fortran.go @@ -0,0 +1,51 @@ +package f + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Fortran lexer. +var Fortran = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Fortran", + Aliases: []string{"fortran"}, + Filenames: []string{"*.f03", "*.f90", "*.F03", "*.F90"}, + MimeTypes: []string{"text/x-fortran"}, + CaseInsensitive: true, + }, + fortranRules, +)) + +func fortranRules() Rules { + return Rules{ + "root": { + {`^#.*\n`, CommentPreproc, nil}, + {`!.*\n`, Comment, nil}, + Include("strings"), + Include("core"), + {`[a-z][\w$]*`, Name, nil}, + Include("nums"), + {`[\s]+`, Text, nil}, + }, + "core": { + {Words(`\b`, `\s*\b`, `ABSTRACT`, `ACCEPT`, `ALL`, `ALLSTOP`, `ALLOCATABLE`, `ALLOCATE`, `ARRAY`, `ASSIGN`, `ASSOCIATE`, `ASYNCHRONOUS`, `BACKSPACE`, `BIND`, `BLOCK`, `BLOCKDATA`, `BYTE`, `CALL`, `CASE`, `CLASS`, `CLOSE`, `CODIMENSION`, `COMMON`, `CONCURRRENT`, `CONTIGUOUS`, `CONTAINS`, `CONTINUE`, `CRITICAL`, `CYCLE`, `DATA`, `DEALLOCATE`, `DECODE`, `DEFERRED`, `DIMENSION`, `DO`, `ELEMENTAL`, `ELSE`, `ENCODE`, `END`, `ENTRY`, `ENUM`, `ENUMERATOR`, `EQUIVALENCE`, `EXIT`, `EXTENDS`, `EXTERNAL`, `EXTRINSIC`, `FILE`, `FINAL`, `FORALL`, `FORMAT`, `FUNCTION`, `GENERIC`, `GOTO`, `IF`, `IMAGES`, `IMPLICIT`, `IMPORT`, `IMPURE`, `INCLUDE`, `INQUIRE`, `INTENT`, `INTERFACE`, `INTRINSIC`, `IS`, `LOCK`, `MEMORY`, `MODULE`, `NAMELIST`, `NULLIFY`, `NONE`, `NON_INTRINSIC`, `NON_OVERRIDABLE`, `NOPASS`, `OPEN`, `OPTIONAL`, `OPTIONS`, `PARAMETER`, `PASS`, `PAUSE`, `POINTER`, `PRINT`, `PRIVATE`, `PROGRAM`, `PROCEDURE`, `PROTECTED`, `PUBLIC`, `PURE`, `READ`, `RECURSIVE`, `RESULT`, `RETURN`, `REWIND`, `SAVE`, `SELECT`, `SEQUENCE`, `STOP`, `SUBMODULE`, `SUBROUTINE`, `SYNC`, `SYNCALL`, `SYNCIMAGES`, `SYNCMEMORY`, `TARGET`, `THEN`, `TYPE`, `UNLOCK`, `USE`, `VALUE`, `VOLATILE`, `WHERE`, `WRITE`, `WHILE`), Keyword, nil}, + {Words(`\b`, `\s*\b`, `CHARACTER`, `COMPLEX`, `DOUBLE PRECISION`, `DOUBLE COMPLEX`, `INTEGER`, `LOGICAL`, `REAL`, `C_INT`, `C_SHORT`, `C_LONG`, `C_LONG_LONG`, `C_SIGNED_CHAR`, `C_SIZE_T`, `C_INT8_T`, `C_INT16_T`, `C_INT32_T`, `C_INT64_T`, `C_INT_LEAST8_T`, `C_INT_LEAST16_T`, `C_INT_LEAST32_T`, `C_INT_LEAST64_T`, `C_INT_FAST8_T`, `C_INT_FAST16_T`, `C_INT_FAST32_T`, `C_INT_FAST64_T`, `C_INTMAX_T`, `C_INTPTR_T`, `C_FLOAT`, `C_DOUBLE`, `C_LONG_DOUBLE`, `C_FLOAT_COMPLEX`, `C_DOUBLE_COMPLEX`, `C_LONG_DOUBLE_COMPLEX`, `C_BOOL`, `C_CHAR`, `C_PTR`, `C_FUNPTR`), KeywordType, nil}, + {`(\*\*|\*|\+|-|\/|<|>|<=|>=|==|\/=|=)`, Operator, nil}, + {`(::)`, KeywordDeclaration, nil}, + {`[()\[\],:&%;.]`, Punctuation, nil}, + {Words(`\b`, `\s*\b`, `Abort`, `Abs`, `Access`, `AChar`, `ACos`, `ACosH`, `AdjustL`, `AdjustR`, `AImag`, `AInt`, `Alarm`, `All`, `Allocated`, `ALog`, `AMax`, `AMin`, `AMod`, `And`, `ANInt`, `Any`, `ASin`, `ASinH`, `Associated`, `ATan`, `ATanH`, `Atomic_Define`, `Atomic_Ref`, `BesJ`, `BesJN`, `Bessel_J0`, `Bessel_J1`, `Bessel_JN`, `Bessel_Y0`, `Bessel_Y1`, `Bessel_YN`, `BesY`, `BesYN`, `BGE`, `BGT`, `BLE`, `BLT`, `Bit_Size`, `BTest`, `CAbs`, `CCos`, `Ceiling`, `CExp`, `Char`, `ChDir`, `ChMod`, `CLog`, `Cmplx`, `Command_Argument_Count`, `Complex`, `Conjg`, `Cos`, `CosH`, `Count`, `CPU_Time`, `CShift`, `CSin`, `CSqRt`, `CTime`, `C_Loc`, `C_Associated`, `C_Null_Ptr`, `C_Null_Funptr`, `C_F_Pointer`, `C_F_ProcPointer`, `C_Null_Char`, `C_Alert`, `C_Backspace`, `C_Form_Feed`, `C_FunLoc`, `C_Sizeof`, `C_New_Line`, `C_Carriage_Return`, `C_Horizontal_Tab`, `C_Vertical_Tab`, `DAbs`, `DACos`, `DASin`, `DATan`, `Date_and_Time`, `DbesJ`, `DbesJN`, `DbesY`, `DbesYN`, `Dble`, `DCos`, `DCosH`, `DDiM`, `DErF`, `DErFC`, `DExp`, `Digits`, `DiM`, `DInt`, `DLog`, `DMax`, `DMin`, `DMod`, `DNInt`, `Dot_Product`, `DProd`, `DSign`, `DSinH`, `DShiftL`, `DShiftR`, `DSin`, `DSqRt`, `DTanH`, `DTan`, `DTime`, `EOShift`, `Epsilon`, `ErF`, `ErFC`, `ErFC_Scaled`, `ETime`, `Execute_Command_Line`, `Exit`, `Exp`, `Exponent`, `Extends_Type_Of`, `FDate`, `FGet`, `FGetC`, `FindLoc`, `Float`, `Floor`, `Flush`, `FNum`, `FPutC`, `FPut`, `Fraction`, `FSeek`, `FStat`, `FTell`, `Gamma`, `GError`, `GetArg`, `Get_Command`, `Get_Command_Argument`, `Get_Environment_Variable`, `GetCWD`, `GetEnv`, `GetGId`, `GetLog`, `GetPId`, `GetUId`, `GMTime`, `HostNm`, `Huge`, `Hypot`, `IAbs`, `IAChar`, `IAll`, `IAnd`, `IAny`, `IArgC`, `IBClr`, `IBits`, `IBSet`, `IChar`, `IDate`, `IDiM`, `IDInt`, `IDNInt`, `IEOr`, `IErrNo`, `IFix`, `Imag`, `ImagPart`, `Image_Index`, `Index`, `Int`, `IOr`, `IParity`, `IRand`, `IsaTty`, `IShft`, `IShftC`, `ISign`, `Iso_C_Binding`, `Is_Contiguous`, `Is_Iostat_End`, `Is_Iostat_Eor`, `ITime`, `Kill`, `Kind`, `LBound`, `LCoBound`, `Len`, `Len_Trim`, `LGe`, `LGt`, `Link`, `LLe`, `LLt`, `LnBlnk`, `Loc`, `Log`, `Log_Gamma`, `Logical`, `Long`, `LShift`, `LStat`, `LTime`, `MaskL`, `MaskR`, `MatMul`, `Max`, `MaxExponent`, `MaxLoc`, `MaxVal`, `MClock`, `Merge`, `Merge_Bits`, `Move_Alloc`, `Min`, `MinExponent`, `MinLoc`, `MinVal`, `Mod`, `Modulo`, `MvBits`, `Nearest`, `New_Line`, `NInt`, `Norm2`, `Not`, `Null`, `Num_Images`, `Or`, `Pack`, `Parity`, `PError`, `Precision`, `Present`, `Product`, `Radix`, `Rand`, `Random_Number`, `Random_Seed`, `Range`, `Real`, `RealPart`, `Rename`, `Repeat`, `Reshape`, `RRSpacing`, `RShift`, `Same_Type_As`, `Scale`, `Scan`, `Second`, `Selected_Char_Kind`, `Selected_Int_Kind`, `Selected_Real_Kind`, `Set_Exponent`, `Shape`, `ShiftA`, `ShiftL`, `ShiftR`, `Short`, `Sign`, `Signal`, `SinH`, `Sin`, `Sleep`, `Sngl`, `Spacing`, `Spread`, `SqRt`, `SRand`, `Stat`, `Storage_Size`, `Sum`, `SymLnk`, `System`, `System_Clock`, `Tan`, `TanH`, `Time`, `This_Image`, `Tiny`, `TrailZ`, `Transfer`, `Transpose`, `Trim`, `TtyNam`, `UBound`, `UCoBound`, `UMask`, `Unlink`, `Unpack`, `Verify`, `XOr`, `ZAbs`, `ZCos`, `ZExp`, `ZLog`, `ZSin`, `ZSqRt`), NameBuiltin, nil}, + {`\.(true|false)\.`, NameBuiltin, nil}, + {`\.(eq|ne|lt|le|gt|ge|not|and|or|eqv|neqv)\.`, OperatorWord, nil}, + }, + "strings": { + {`(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"`, LiteralStringDouble, nil}, + {`(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'`, LiteralStringSingle, nil}, + }, + "nums": { + {`\d+(?![.e])(_[a-z]\w+)?`, LiteralNumberInteger, nil}, + {`[+-]?\d*\.\d+([ed][-+]?\d+)?(_[a-z]\w+)?`, LiteralNumberFloat, nil}, + {`[+-]?\d+\.\d*([ed][-+]?\d+)?(_[a-z]\w+)?`, LiteralNumberFloat, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/f/fortran_fixed.go b/vendor/github.com/alecthomas/chroma/lexers/f/fortran_fixed.go new file mode 100644 index 0000000..7c64638 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/f/fortran_fixed.go @@ -0,0 +1,39 @@ +package f + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// FortranFixed lexer. +var FortranFixed = internal.Register(MustNewLazyLexer( + &Config{ + Name: "FortranFixed", + Aliases: []string{"fortranfixed"}, + Filenames: []string{"*.f", "*.F"}, + MimeTypes: []string{"text/x-fortran"}, + NotMultiline: true, + CaseInsensitive: true, + }, + func() Rules { + return Rules{ + "root": { + {`[C*].*\n`, Comment, nil}, + {`#.*\n`, CommentPreproc, nil}, + {`[\t ]*!.*\n`, Comment, nil}, + {`(.{5})`, NameLabel, Push("cont-char")}, + {`.*\n`, Using(Fortran), nil}, + }, + "cont-char": { + {` `, Text, Push("code")}, + {`0`, Comment, Push("code")}, + {`.`, GenericStrong, Push("code")}, + }, + "code": { + {`(.{66})(.*)(\n)`, ByGroups(Using(Fortran), Comment, Text), Push("root")}, + {`.*\n`, Using(Fortran), Push("root")}, + Default(Push("root")), + }, + } + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/f/fsharp.go b/vendor/github.com/alecthomas/chroma/lexers/f/fsharp.go new file mode 100644 index 0000000..44fced4 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/f/fsharp.go @@ -0,0 +1,98 @@ +package f + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Fsharp lexer. +var Fsharp = internal.Register(MustNewLazyLexer( + &Config{ + Name: "FSharp", + Aliases: []string{"fsharp"}, + Filenames: []string{"*.fs", "*.fsi"}, + MimeTypes: []string{"text/x-fsharp"}, + }, + fsharpRules, +)) + +func fsharpRules() Rules { + return Rules{ + "escape-sequence": { + {`\\[\\"\'ntbrafv]`, LiteralStringEscape, nil}, + {`\\[0-9]{3}`, LiteralStringEscape, nil}, + {`\\u[0-9a-fA-F]{4}`, LiteralStringEscape, nil}, + {`\\U[0-9a-fA-F]{8}`, LiteralStringEscape, nil}, + }, + "root": { + {`\s+`, Text, nil}, + {`\(\)|\[\]`, NameBuiltinPseudo, nil}, + {`\b(?|-|\\.\\.|\\.|::|:=|:>|:|;;|;|<-|<\\]|<|>\\]|>|\\?\\?|\\?|\\[<|\\[\\||\\[|\\]|_|`|\\{|\\|\\]|\\||\\}|~|<@@|<@|=|@>|@@>)", Operator, nil}, + {`([=<>@^|&+\*/$%-]|[!?~])?[!$%&*+\./:<=>?@^|~-]`, Operator, nil}, + {`\b(and|or|not)\b`, OperatorWord, nil}, + {`\b(sbyte|byte|char|nativeint|unativeint|float32|single|float|double|int8|uint8|int16|uint16|int32|uint32|int64|uint64|decimal|unit|bool|string|list|exn|obj|enum)\b`, KeywordType, nil}, + {`#[ \t]*(if|endif|else|line|nowarn|light|\d+)\b.*?\n`, CommentPreproc, nil}, + {`[^\W\d][\w']*`, Name, nil}, + {`\d[\d_]*[uU]?[yslLnQRZINGmM]?`, LiteralNumberInteger, nil}, + {`0[xX][\da-fA-F][\da-fA-F_]*[uU]?[yslLn]?[fF]?`, LiteralNumberHex, nil}, + {`0[oO][0-7][0-7_]*[uU]?[yslLn]?`, LiteralNumberOct, nil}, + {`0[bB][01][01_]*[uU]?[yslLn]?`, LiteralNumberBin, nil}, + {`-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)[fFmM]?`, LiteralNumberFloat, nil}, + {`'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'B?`, LiteralStringChar, nil}, + {`'.'`, LiteralStringChar, nil}, + {`'`, Keyword, nil}, + {`@?"`, LiteralStringDouble, Push("string")}, + {`[~?][a-z][\w\']*:`, NameVariable, nil}, + }, + "dotted": { + {`\s+`, Text, nil}, + {`\.`, Punctuation, nil}, + {`[A-Z][\w\']*(?=\s*\.)`, NameNamespace, nil}, + {`[A-Z][\w\']*`, Name, Pop(1)}, + {`[a-z_][\w\']*`, Name, Pop(1)}, + Default(Pop(1)), + }, + "comment": { + {`[^(*)@"]+`, Comment, nil}, + {`\(\*`, Comment, Push()}, + {`\*\)`, Comment, Pop(1)}, + {`@"`, LiteralString, Push("lstring")}, + {`"""`, LiteralString, Push("tqs")}, + {`"`, LiteralString, Push("string")}, + {`[(*)@]`, Comment, nil}, + }, + "string": { + {`[^\\"]+`, LiteralString, nil}, + Include("escape-sequence"), + {`\\\n`, LiteralString, nil}, + {`\n`, LiteralString, nil}, + {`"B?`, LiteralString, Pop(1)}, + }, + "lstring": { + {`[^"]+`, LiteralString, nil}, + {`\n`, LiteralString, nil}, + {`""`, LiteralString, nil}, + {`"B?`, LiteralString, Pop(1)}, + }, + "tqs": { + {`[^"]+`, LiteralString, nil}, + {`\n`, LiteralString, nil}, + {`"""B?`, LiteralString, Pop(1)}, + {`"`, LiteralString, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/g/gas.go b/vendor/github.com/alecthomas/chroma/lexers/g/gas.go new file mode 100644 index 0000000..1f733f6 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/g/gas.go @@ -0,0 +1,59 @@ +package g + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Gas lexer. +var Gas = internal.Register(MustNewLazyLexer( + &Config{ + Name: "GAS", + Aliases: []string{"gas", "asm"}, + Filenames: []string{"*.s", "*.S"}, + MimeTypes: []string{"text/x-gas"}, + }, + gasRules, +)) + +func gasRules() Rules { + return Rules{ + "root": { + Include("whitespace"), + {`(?:[a-zA-Z$_][\w$.@-]*|\.[\w$.@-]+):`, NameLabel, nil}, + {`\.(?:[a-zA-Z$_][\w$.@-]*|\.[\w$.@-]+)`, NameAttribute, Push("directive-args")}, + {`lock|rep(n?z)?|data\d+`, NameAttribute, nil}, + {`(?:[a-zA-Z$_][\w$.@-]*|\.[\w$.@-]+)`, NameFunction, Push("instruction-args")}, + {`[\r\n]+`, Text, nil}, + }, + "directive-args": { + {`(?:[a-zA-Z$_][\w$.@-]*|\.[\w$.@-]+)`, NameConstant, nil}, + {`"(\\"|[^"])*"`, LiteralString, nil}, + {`@(?:[a-zA-Z$_][\w$.@-]*|\.[\w$.@-]+)`, NameAttribute, nil}, + {`(?:0[xX][a-zA-Z0-9]+|\d+)`, LiteralNumberInteger, nil}, + {`[\r\n]+`, Text, Pop(1)}, + Include("punctuation"), + Include("whitespace"), + }, + "instruction-args": { + {`([a-z0-9]+)( )(<)((?:[a-zA-Z$_][\w$.@-]*|\.[\w$.@-]+))(>)`, ByGroups(LiteralNumberHex, Text, Punctuation, NameConstant, Punctuation), nil}, + {`([a-z0-9]+)( )(<)((?:[a-zA-Z$_][\w$.@-]*|\.[\w$.@-]+))([-+])((?:0[xX][a-zA-Z0-9]+|\d+))(>)`, ByGroups(LiteralNumberHex, Text, Punctuation, NameConstant, Punctuation, LiteralNumberInteger, Punctuation), nil}, + {`(?:[a-zA-Z$_][\w$.@-]*|\.[\w$.@-]+)`, NameConstant, nil}, + {`(?:0[xX][a-zA-Z0-9]+|\d+)`, LiteralNumberInteger, nil}, + {`%(?:[a-zA-Z$_][\w$.@-]*|\.[\w$.@-]+)`, NameVariable, nil}, + {`$(?:0[xX][a-zA-Z0-9]+|\d+)`, LiteralNumberInteger, nil}, + {`$'(.|\\')'`, LiteralStringChar, nil}, + {`[\r\n]+`, Text, Pop(1)}, + Include("punctuation"), + Include("whitespace"), + }, + "whitespace": { + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`[;#].*?\n`, Comment, nil}, + }, + "punctuation": { + {`[-*,.()\[\]!:]+`, Punctuation, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/g/gdscript.go b/vendor/github.com/alecthomas/chroma/lexers/g/gdscript.go new file mode 100644 index 0000000..2b6af97 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/g/gdscript.go @@ -0,0 +1,128 @@ +package g + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// GDScript lexer. +var GDScript = internal.Register(MustNewLazyLexer( + &Config{ + Name: "GDScript", + Aliases: []string{"gdscript", "gd"}, + Filenames: []string{"*.gd"}, + MimeTypes: []string{"text/x-gdscript", "application/x-gdscript"}, + }, + gdscriptRules, +)) + +func gdscriptRules() Rules { + return Rules{ + "root": { + {`\n`, Text, nil}, + {`^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")`, ByGroups(Text, LiteralStringAffix, LiteralStringDoc), nil}, + {`^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')`, ByGroups(Text, LiteralStringAffix, LiteralStringDoc), nil}, + {`[^\S\n]+`, Text, nil}, + {`#.*$`, CommentSingle, nil}, + {`[]{}:(),;[]`, Punctuation, nil}, + {`\\\n`, Text, nil}, + {`\\`, Text, nil}, + {`(in|and|or|not)\b`, OperatorWord, nil}, + {`!=|==|<<|>>|&&|\+=|-=|\*=|/=|%=|&=|\|=|\|\||[-~+/*%=<>&^.!|$]`, Operator, nil}, + Include("keywords"), + {`(def)((?:\s|\\\s)+)`, ByGroups(Keyword, Text), Push("funcname")}, + {`(class)((?:\s|\\\s)+)`, ByGroups(Keyword, Text), Push("classname")}, + Include("builtins"), + {`([rR]|[uUbB][rR]|[rR][uUbB])(""")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Push("tdqs")}, + {`([rR]|[uUbB][rR]|[rR][uUbB])(''')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Push("tsqs")}, + {`([rR]|[uUbB][rR]|[rR][uUbB])(")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Push("dqs")}, + {`([rR]|[uUbB][rR]|[rR][uUbB])(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Push("sqs")}, + {`([uUbB]?)(""")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Combined("stringescape", "tdqs")}, + {`([uUbB]?)(''')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Combined("stringescape", "tsqs")}, + {`([uUbB]?)(")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Combined("stringescape", "dqs")}, + {`([uUbB]?)(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Combined("stringescape", "sqs")}, + Include("name"), + Include("numbers"), + }, + "keywords": { + {Words(``, `\b`, + `if`, `elif`, `else`, `for`, `do`, + `while`, `switch`, `case`, `break`, `continue`, + `pass`, `return`, `class`, `extends`, `tool`, + `signal`, `func`, `static`, `const`, `enum`, + `var`, `onready`, `export`, `setget`, `breakpoint`), Keyword, nil}, + }, + "builtins": { + {Words(`(?)`, ByGroups(CommentPreproc, Using(Python), CommentPreproc), nil}, + {`<\s*(script|style)\s*.*?>.*?<\s*/\1\s*>`, Other, nil}, + {`<\s*py:[a-zA-Z0-9]+`, NameTag, Push("pytag")}, + {`<\s*[a-zA-Z0-9:.]+`, NameTag, Push("tag")}, + Include("variable"), + {`[<$]`, Other, nil}, + }, + "pytag": { + {`\s+`, Text, nil}, + {`[\w:-]+\s*=`, NameAttribute, Push("pyattr")}, + {`/?\s*>`, NameTag, Pop(1)}, + }, + "pyattr": { + {`(")(.*?)(")`, ByGroups(LiteralString, Using(Python), LiteralString), Pop(1)}, + {`(')(.*?)(')`, ByGroups(LiteralString, Using(Python), LiteralString), Pop(1)}, + {`[^\s>]+`, LiteralString, Pop(1)}, + }, + "tag": { + {`\s+`, Text, nil}, + {`py:[\w-]+\s*=`, NameAttribute, Push("pyattr")}, + {`[\w:-]+\s*=`, NameAttribute, Push("attr")}, + {`/?\s*>`, NameTag, Pop(1)}, + }, + "attr": { + {`"`, LiteralString, Push("attr-dstring")}, + {`'`, LiteralString, Push("attr-sstring")}, + {`[^\s>]*`, LiteralString, Pop(1)}, + }, + "attr-dstring": { + {`"`, LiteralString, Pop(1)}, + Include("strings"), + {`'`, LiteralString, nil}, + }, + "attr-sstring": { + {`'`, LiteralString, Pop(1)}, + Include("strings"), + {`'`, LiteralString, nil}, + }, + "strings": { + {`[^"'$]+`, LiteralString, nil}, + Include("variable"), + }, + "variable": { + {`(?]+>)`, NameVariable, nil}, + }, + "numbers": { + {`(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?`, LiteralString, nil}, + }, + "string": { + Include("tableVars"), + {`(\s|.)`, LiteralString, nil}, + }, + "pyString": { + {`"""`, Keyword, Pop(1)}, + Include("string"), + }, + "stepContentRoot": { + {`$`, Keyword, Pop(1)}, + Include("stepContent"), + }, + "stepContentStack": { + {`$`, Keyword, Pop(2)}, + Include("stepContent"), + }, + "stepContent": { + {`"`, NameFunction, Push("doubleString")}, + Include("tableVars"), + Include("numbers"), + Include("comments"), + {`(\s|.)`, NameFunction, nil}, + }, + "tableContent": { + {`\s+\|\s*$`, Keyword, Pop(1)}, + Include("comments"), + {`\\\|`, LiteralString, nil}, + {`\s*\|`, Keyword, nil}, + {`"`, LiteralString, Push("doubleStringTable")}, + Include("string"), + }, + "doubleString": { + {`"`, NameFunction, Pop(1)}, + Include("string"), + }, + "doubleStringTable": { + {`"`, LiteralString, Pop(1)}, + Include("string"), + }, + "root": { + {`\n`, NameFunction, nil}, + Include("comments"), + {`"""`, Keyword, Push("pyString")}, + {`\s+\|`, Keyword, Push("tableContent")}, + {`"`, NameFunction, Push("doubleString")}, + Include("tableVars"), + Include("numbers"), + {`(\s*)(@[^@\r\n\t ]+)`, ByGroups(NameFunction, NameTag), nil}, + {stepKeywords, ByGroups(NameFunction, Keyword), Push("stepContentRoot")}, + {featureKeywords, ByGroups(Keyword, Keyword, NameFunction), Push("narrative")}, + {featureElementKeywords, ByGroups(NameFunction, Keyword, Keyword, NameFunction), Push("featureElements")}, + {examplesKeywords, ByGroups(NameFunction, Keyword, Keyword, NameFunction), Push("examplesTable")}, + {`(\s|.)`, NameFunction, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/g/glsl.go b/vendor/github.com/alecthomas/chroma/lexers/g/glsl.go new file mode 100644 index 0000000..14aa58d --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/g/glsl.go @@ -0,0 +1,41 @@ +package g + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// GLSL lexer. +var GLSL = internal.Register(MustNewLazyLexer( + &Config{ + Name: "GLSL", + Aliases: []string{"glsl"}, + Filenames: []string{"*.vert", "*.frag", "*.geo"}, + MimeTypes: []string{"text/x-glslsrc"}, + }, + glslRules, +)) + +func glslRules() Rules { + return Rules{ + "root": { + {`^#.*`, CommentPreproc, nil}, + {`//.*`, CommentSingle, nil}, + {`/(\\\n)?[*](.|\n)*?[*](\\\n)?/`, CommentMultiline, nil}, + {`\+|-|~|!=?|\*|/|%|<<|>>|<=?|>=?|==?|&&?|\^|\|\|?`, Operator, nil}, + {`[?:]`, Operator, nil}, + {`\bdefined\b`, Operator, nil}, + {`[;{}(),\[\]]`, Punctuation, nil}, + {`[+-]?\d*\.\d+([eE][-+]?\d+)?`, LiteralNumberFloat, nil}, + {`[+-]?\d+\.\d*([eE][-+]?\d+)?`, LiteralNumberFloat, nil}, + {`0[xX][0-9a-fA-F]*`, LiteralNumberHex, nil}, + {`0[0-7]*`, LiteralNumberOct, nil}, + {`[1-9][0-9]*`, LiteralNumberInteger, nil}, + {Words(`\b`, `\b`, `attribute`, `const`, `uniform`, `varying`, `centroid`, `break`, `continue`, `do`, `for`, `while`, `if`, `else`, `in`, `out`, `inout`, `float`, `int`, `void`, `bool`, `true`, `false`, `invariant`, `discard`, `return`, `mat2`, `mat3mat4`, `mat2x2`, `mat3x2`, `mat4x2`, `mat2x3`, `mat3x3`, `mat4x3`, `mat2x4`, `mat3x4`, `mat4x4`, `vec2`, `vec3`, `vec4`, `ivec2`, `ivec3`, `ivec4`, `bvec2`, `bvec3`, `bvec4`, `sampler1D`, `sampler2D`, `sampler3DsamplerCube`, `sampler1DShadow`, `sampler2DShadow`, `struct`), Keyword, nil}, + {Words(`\b`, `\b`, `asm`, `class`, `union`, `enum`, `typedef`, `template`, `this`, `packed`, `goto`, `switch`, `default`, `inline`, `noinline`, `volatile`, `public`, `static`, `extern`, `external`, `interface`, `long`, `short`, `double`, `half`, `fixed`, `unsigned`, `lowp`, `mediump`, `highp`, `precision`, `input`, `output`, `hvec2`, `hvec3`, `hvec4`, `dvec2`, `dvec3`, `dvec4`, `fvec2`, `fvec3`, `fvec4`, `sampler2DRect`, `sampler3DRect`, `sampler2DRectShadow`, `sizeof`, `cast`, `namespace`, `using`), Keyword, nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + {`\.`, Punctuation, nil}, + {`\s+`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/g/gnuplot.go b/vendor/github.com/alecthomas/chroma/lexers/g/gnuplot.go new file mode 100644 index 0000000..a7a2509 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/g/gnuplot.go @@ -0,0 +1,121 @@ +package g + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Gnuplot lexer. +var Gnuplot = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Gnuplot", + Aliases: []string{"gnuplot"}, + Filenames: []string{"*.plot", "*.plt"}, + MimeTypes: []string{"text/x-gnuplot"}, + }, + gnuplotRules, +)) + +func gnuplotRules() Rules { + return Rules{ + "root": { + Include("whitespace"), + {`bind\b|bin\b|bi\b`, Keyword, Push("bind")}, + {`exit\b|exi\b|ex\b|quit\b|qui\b|qu\b|q\b`, Keyword, Push("quit")}, + {`fit\b|fi\b|f\b`, Keyword, Push("fit")}, + {`(if)(\s*)(\()`, ByGroups(Keyword, Text, Punctuation), Push("if")}, + {`else\b`, Keyword, nil}, + {`pause\b|paus\b|pau\b|pa\b`, Keyword, Push("pause")}, + {`plot\b|plo\b|pl\b|p\b|replot\b|replo\b|repl\b|rep\b|splot\b|splo\b|spl\b|sp\b`, Keyword, Push("plot")}, + {`save\b|sav\b|sa\b`, Keyword, Push("save")}, + {`set\b|se\b`, Keyword, Push("genericargs", "optionarg")}, + {`show\b|sho\b|sh\b|unset\b|unse\b|uns\b`, Keyword, Push("noargs", "optionarg")}, + {`lower\b|lowe\b|low\b|raise\b|rais\b|rai\b|ra\b|call\b|cal\b|ca\b|cd\b|clear\b|clea\b|cle\b|cl\b|help\b|hel\b|he\b|h\b|\?\b|history\b|histor\b|histo\b|hist\b|his\b|hi\b|load\b|loa\b|lo\b|l\b|print\b|prin\b|pri\b|pr\b|pwd\b|reread\b|rerea\b|rere\b|rer\b|re\b|reset\b|rese\b|res\b|screendump\b|screendum\b|screendu\b|screend\b|screen\b|scree\b|scre\b|scr\b|shell\b|shel\b|she\b|system\b|syste\b|syst\b|sys\b|sy\b|update\b|updat\b|upda\b|upd\b|up\b`, Keyword, Push("genericargs")}, + {`pwd\b|reread\b|rerea\b|rere\b|rer\b|re\b|reset\b|rese\b|res\b|screendump\b|screendum\b|screendu\b|screend\b|screen\b|scree\b|scre\b|scr\b|shell\b|shel\b|she\b|test\b`, Keyword, Push("noargs")}, + {`([a-zA-Z_]\w*)(\s*)(=)`, ByGroups(NameVariable, Text, Operator), Push("genericargs")}, + {`([a-zA-Z_]\w*)(\s*\(.*?\)\s*)(=)`, ByGroups(NameFunction, Text, Operator), Push("genericargs")}, + {`@[a-zA-Z_]\w*`, NameConstant, nil}, + {`;`, Keyword, nil}, + }, + "comment": { + {`[^\\\n]`, Comment, nil}, + {`\\\n`, Comment, nil}, + {`\\`, Comment, nil}, + Default(Pop(1)), + }, + "whitespace": { + {`#`, Comment, Push("comment")}, + {`[ \t\v\f]+`, Text, nil}, + }, + "noargs": { + Include("whitespace"), + {`;`, Punctuation, Pop(1)}, + {`\n`, Text, Pop(1)}, + }, + "dqstring": { + {`"`, LiteralString, Pop(1)}, + {`\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})`, LiteralStringEscape, nil}, + {`[^\\"\n]+`, LiteralString, nil}, + {`\\\n`, LiteralString, nil}, + {`\\`, LiteralString, nil}, + {`\n`, LiteralString, Pop(1)}, + }, + "sqstring": { + {`''`, LiteralString, nil}, + {`'`, LiteralString, Pop(1)}, + {`[^\\'\n]+`, LiteralString, nil}, + {`\\\n`, LiteralString, nil}, + {`\\`, LiteralString, nil}, + {`\n`, LiteralString, Pop(1)}, + }, + "genericargs": { + Include("noargs"), + {`"`, LiteralString, Push("dqstring")}, + {`'`, LiteralString, Push("sqstring")}, + {`(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+`, LiteralNumberFloat, nil}, + {`(\d+\.\d*|\.\d+)`, LiteralNumberFloat, nil}, + {`-?\d+`, LiteralNumberInteger, nil}, + {`[,.~!%^&*+=|?:<>/-]`, Operator, nil}, + {`[{}()\[\]]`, Punctuation, nil}, + {`(eq|ne)\b`, OperatorWord, nil}, + {`([a-zA-Z_]\w*)(\s*)(\()`, ByGroups(NameFunction, Text, Punctuation), nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + {`@[a-zA-Z_]\w*`, NameConstant, nil}, + {`\\\n`, Text, nil}, + }, + "optionarg": { + Include("whitespace"), + {`all\b|al\b|a\b|angles\b|angle\b|angl\b|ang\b|an\b|arrow\b|arro\b|arr\b|ar\b|autoscale\b|autoscal\b|autosca\b|autosc\b|autos\b|auto\b|aut\b|au\b|bars\b|bar\b|ba\b|b\b|border\b|borde\b|bord\b|bor\b|boxwidth\b|boxwidt\b|boxwid\b|boxwi\b|boxw\b|box\b|clabel\b|clabe\b|clab\b|cla\b|cl\b|clip\b|cli\b|cl\b|c\b|cntrparam\b|cntrpara\b|cntrpar\b|cntrpa\b|cntrp\b|cntr\b|cnt\b|cn\b|contour\b|contou\b|conto\b|cont\b|con\b|co\b|data\b|dat\b|da\b|datafile\b|datafil\b|datafi\b|dataf\b|data\b|dgrid3d\b|dgrid3\b|dgrid\b|dgri\b|dgr\b|dg\b|dummy\b|dumm\b|dum\b|du\b|encoding\b|encodin\b|encodi\b|encod\b|enco\b|enc\b|decimalsign\b|decimalsig\b|decimalsi\b|decimals\b|decimal\b|decima\b|decim\b|deci\b|dec\b|fit\b|fontpath\b|fontpat\b|fontpa\b|fontp\b|font\b|format\b|forma\b|form\b|for\b|fo\b|function\b|functio\b|functi\b|funct\b|func\b|fun\b|fu\b|functions\b|function\b|functio\b|functi\b|funct\b|func\b|fun\b|fu\b|grid\b|gri\b|gr\b|g\b|hidden3d\b|hidden3\b|hidden\b|hidde\b|hidd\b|hid\b|historysize\b|historysiz\b|historysi\b|historys\b|history\b|histor\b|histo\b|hist\b|his\b|isosamples\b|isosample\b|isosampl\b|isosamp\b|isosam\b|isosa\b|isos\b|iso\b|is\b|key\b|ke\b|k\b|keytitle\b|keytitl\b|keytit\b|keyti\b|keyt\b|label\b|labe\b|lab\b|la\b|linestyle\b|linestyl\b|linesty\b|linest\b|lines\b|line\b|lin\b|li\b|ls\b|loadpath\b|loadpat\b|loadpa\b|loadp\b|load\b|loa\b|locale\b|local\b|loca\b|loc\b|logscale\b|logscal\b|logsca\b|logsc\b|logs\b|log\b|macros\b|macro\b|macr\b|mac\b|mapping\b|mappin\b|mappi\b|mapp\b|map\b|mapping3d\b|mapping3\b|mapping\b|mappin\b|mappi\b|mapp\b|map\b|margin\b|margi\b|marg\b|mar\b|lmargin\b|lmargi\b|lmarg\b|lmar\b|rmargin\b|rmargi\b|rmarg\b|rmar\b|tmargin\b|tmargi\b|tmarg\b|tmar\b|bmargin\b|bmargi\b|bmarg\b|bmar\b|mouse\b|mous\b|mou\b|mo\b|multiplot\b|multiplo\b|multipl\b|multip\b|multi\b|mxtics\b|mxtic\b|mxti\b|mxt\b|nomxtics\b|nomxtic\b|nomxti\b|nomxt\b|mx2tics\b|mx2tic\b|mx2ti\b|mx2t\b|nomx2tics\b|nomx2tic\b|nomx2ti\b|nomx2t\b|mytics\b|mytic\b|myti\b|myt\b|nomytics\b|nomytic\b|nomyti\b|nomyt\b|my2tics\b|my2tic\b|my2ti\b|my2t\b|nomy2tics\b|nomy2tic\b|nomy2ti\b|nomy2t\b|mztics\b|mztic\b|mzti\b|mzt\b|nomztics\b|nomztic\b|nomzti\b|nomzt\b|mcbtics\b|mcbtic\b|mcbti\b|mcbt\b|nomcbtics\b|nomcbtic\b|nomcbti\b|nomcbt\b|offsets\b|offset\b|offse\b|offs\b|off\b|of\b|origin\b|origi\b|orig\b|ori\b|or\b|output\b|outpu\b|outp\b|out\b|ou\b|o\b|parametric\b|parametri\b|parametr\b|paramet\b|parame\b|param\b|para\b|par\b|pa\b|pm3d\b|pm3\b|pm\b|palette\b|palett\b|palet\b|pale\b|pal\b|colorbox\b|colorbo\b|colorb\b|plot\b|plo\b|pl\b|p\b|pointsize\b|pointsiz\b|pointsi\b|points\b|point\b|poin\b|poi\b|polar\b|pola\b|pol\b|print\b|prin\b|pri\b|pr\b|object\b|objec\b|obje\b|obj\b|samples\b|sample\b|sampl\b|samp\b|sam\b|sa\b|size\b|siz\b|si\b|style\b|styl\b|sty\b|st\b|surface\b|surfac\b|surfa\b|surf\b|sur\b|su\b|table\b|terminal\b|termina\b|termin\b|termi\b|term\b|ter\b|te\b|t\b|termoptions\b|termoption\b|termoptio\b|termopti\b|termopt\b|termop\b|termo\b|tics\b|tic\b|ti\b|ticscale\b|ticscal\b|ticsca\b|ticsc\b|ticslevel\b|ticsleve\b|ticslev\b|ticsle\b|ticsl\b|timefmt\b|timefm\b|timef\b|timestamp\b|timestam\b|timesta\b|timest\b|times\b|time\b|tim\b|title\b|titl\b|tit\b|variables\b|variable\b|variabl\b|variab\b|varia\b|vari\b|var\b|va\b|v\b|version\b|versio\b|versi\b|vers\b|ver\b|ve\b|view\b|vie\b|vi\b|xyplane\b|xyplan\b|xypla\b|xypl\b|xyp\b|xdata\b|xdat\b|xda\b|x2data\b|x2dat\b|x2da\b|ydata\b|ydat\b|yda\b|y2data\b|y2dat\b|y2da\b|zdata\b|zdat\b|zda\b|cbdata\b|cbdat\b|cbda\b|xlabel\b|xlabe\b|xlab\b|xla\b|xl\b|x2label\b|x2labe\b|x2lab\b|x2la\b|x2l\b|ylabel\b|ylabe\b|ylab\b|yla\b|yl\b|y2label\b|y2labe\b|y2lab\b|y2la\b|y2l\b|zlabel\b|zlabe\b|zlab\b|zla\b|zl\b|cblabel\b|cblabe\b|cblab\b|cbla\b|cbl\b|xtics\b|xtic\b|xti\b|noxtics\b|noxtic\b|noxti\b|x2tics\b|x2tic\b|x2ti\b|nox2tics\b|nox2tic\b|nox2ti\b|ytics\b|ytic\b|yti\b|noytics\b|noytic\b|noyti\b|y2tics\b|y2tic\b|y2ti\b|noy2tics\b|noy2tic\b|noy2ti\b|ztics\b|ztic\b|zti\b|noztics\b|noztic\b|nozti\b|cbtics\b|cbtic\b|cbti\b|nocbtics\b|nocbtic\b|nocbti\b|xdtics\b|xdtic\b|xdti\b|noxdtics\b|noxdtic\b|noxdti\b|x2dtics\b|x2dtic\b|x2dti\b|nox2dtics\b|nox2dtic\b|nox2dti\b|ydtics\b|ydtic\b|ydti\b|noydtics\b|noydtic\b|noydti\b|y2dtics\b|y2dtic\b|y2dti\b|noy2dtics\b|noy2dtic\b|noy2dti\b|zdtics\b|zdtic\b|zdti\b|nozdtics\b|nozdtic\b|nozdti\b|cbdtics\b|cbdtic\b|cbdti\b|nocbdtics\b|nocbdtic\b|nocbdti\b|xmtics\b|xmtic\b|xmti\b|noxmtics\b|noxmtic\b|noxmti\b|x2mtics\b|x2mtic\b|x2mti\b|nox2mtics\b|nox2mtic\b|nox2mti\b|ymtics\b|ymtic\b|ymti\b|noymtics\b|noymtic\b|noymti\b|y2mtics\b|y2mtic\b|y2mti\b|noy2mtics\b|noy2mtic\b|noy2mti\b|zmtics\b|zmtic\b|zmti\b|nozmtics\b|nozmtic\b|nozmti\b|cbmtics\b|cbmtic\b|cbmti\b|nocbmtics\b|nocbmtic\b|nocbmti\b|xrange\b|xrang\b|xran\b|xra\b|xr\b|x2range\b|x2rang\b|x2ran\b|x2ra\b|x2r\b|yrange\b|yrang\b|yran\b|yra\b|yr\b|y2range\b|y2rang\b|y2ran\b|y2ra\b|y2r\b|zrange\b|zrang\b|zran\b|zra\b|zr\b|cbrange\b|cbrang\b|cbran\b|cbra\b|cbr\b|rrange\b|rrang\b|rran\b|rra\b|rr\b|trange\b|trang\b|tran\b|tra\b|tr\b|urange\b|urang\b|uran\b|ura\b|ur\b|vrange\b|vrang\b|vran\b|vra\b|vr\b|xzeroaxis\b|xzeroaxi\b|xzeroax\b|xzeroa\b|x2zeroaxis\b|x2zeroaxi\b|x2zeroax\b|x2zeroa\b|yzeroaxis\b|yzeroaxi\b|yzeroax\b|yzeroa\b|y2zeroaxis\b|y2zeroaxi\b|y2zeroax\b|y2zeroa\b|zzeroaxis\b|zzeroaxi\b|zzeroax\b|zzeroa\b|zeroaxis\b|zeroaxi\b|zeroax\b|zeroa\b|zero\b|zer\b|ze\b|z\b`, NameBuiltin, Pop(1)}, + }, + "bind": { + {`!`, Keyword, Pop(1)}, + {`allwindows\b|allwindow\b|allwindo\b|allwind\b|allwin\b|allwi\b|allw\b|all\b`, NameBuiltin, nil}, + Include("genericargs"), + }, + "quit": { + {`gnuplot\b`, Keyword, nil}, + Include("noargs"), + }, + "fit": { + {`via\b`, NameBuiltin, nil}, + Include("plot"), + }, + "if": { + {`\)`, Punctuation, Pop(1)}, + Include("genericargs"), + }, + "pause": { + {`(mouse|any|button1|button2|button3)\b`, NameBuiltin, nil}, + {`keypress\b|keypres\b|keypre\b|keypr\b|keyp\b|key\b`, NameBuiltin, nil}, + Include("genericargs"), + }, + "plot": { + {`axes\b|axe\b|ax\b|axis\b|axi\b|binary\b|binar\b|bina\b|bin\b|every\b|ever\b|eve\b|ev\b|index\b|inde\b|ind\b|in\b|i\b|matrix\b|matri\b|matr\b|mat\b|smooth\b|smoot\b|smoo\b|smo\b|sm\b|s\b|thru\b|title\b|titl\b|tit\b|ti\b|t\b|notitle\b|notitl\b|notit\b|noti\b|not\b|using\b|usin\b|usi\b|us\b|u\b|with\b|wit\b|wi\b|w\b`, NameBuiltin, nil}, + Include("genericargs"), + }, + "save": { + {`functions\b|function\b|functio\b|functi\b|funct\b|func\b|fun\b|fu\b|f\b|set\b|se\b|s\b|terminal\b|termina\b|termin\b|termi\b|term\b|ter\b|te\b|t\b|variables\b|variable\b|variabl\b|variab\b|varia\b|vari\b|var\b|va\b|v\b`, NameBuiltin, nil}, + Include("genericargs"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/g/go.go b/vendor/github.com/alecthomas/chroma/lexers/g/go.go new file mode 100644 index 0000000..9dc4075 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/g/go.go @@ -0,0 +1,123 @@ +package g + +import ( + "strings" + + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/h" + "github.com/alecthomas/chroma/lexers/internal" +) + +// Go lexer. +var Go = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Go", + Aliases: []string{"go", "golang"}, + Filenames: []string{"*.go"}, + MimeTypes: []string{"text/x-gosrc"}, + EnsureNL: true, + }, + goRules, +).SetAnalyser(func(text string) float32 { + if strings.Contains(text, "fmt.") && strings.Contains(text, "package ") { + return 0.5 + } + if strings.Contains(text, "package ") { + return 0.1 + } + return 0.0 +})) + +func goRules() Rules { + return Rules{ + "root": { + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`\\\n`, Text, nil}, + {`//(.*?)\n`, CommentSingle, nil}, + {`/(\\\n)?[*](.|\n)*?[*](\\\n)?/`, CommentMultiline, nil}, + {`(import|package)\b`, KeywordNamespace, nil}, + {`(var|func|struct|map|chan|type|interface|const)\b`, KeywordDeclaration, nil}, + {Words(``, `\b`, `break`, `default`, `select`, `case`, `defer`, `go`, `else`, `goto`, `switch`, `fallthrough`, `if`, `range`, `continue`, `for`, `return`), Keyword, nil}, + {`(true|false|iota|nil)\b`, KeywordConstant, nil}, + {Words(``, `\b(\()`, `uint`, `uint8`, `uint16`, `uint32`, `uint64`, `int`, `int8`, `int16`, `int32`, `int64`, `float`, `float32`, `float64`, `complex64`, `complex128`, `byte`, `rune`, `string`, `bool`, `error`, `uintptr`, `print`, `println`, `panic`, `recover`, `close`, `complex`, `real`, `imag`, `len`, `cap`, `append`, `copy`, `delete`, `new`, `make`), ByGroups(NameBuiltin, Punctuation), nil}, + {Words(``, `\b`, `uint`, `uint8`, `uint16`, `uint32`, `uint64`, `int`, `int8`, `int16`, `int32`, `int64`, `float`, `float32`, `float64`, `complex64`, `complex128`, `byte`, `rune`, `string`, `bool`, `error`, `uintptr`), KeywordType, nil}, + {`\d+i`, LiteralNumber, nil}, + {`\d+\.\d*([Ee][-+]\d+)?i`, LiteralNumber, nil}, + {`\.\d+([Ee][-+]\d+)?i`, LiteralNumber, nil}, + {`\d+[Ee][-+]\d+i`, LiteralNumber, nil}, + {`\d+(\.\d+[eE][+\-]?\d+|\.\d*|[eE][+\-]?\d+)`, LiteralNumberFloat, nil}, + {`\.\d+([eE][+\-]?\d+)?`, LiteralNumberFloat, nil}, + {`0[0-7]+`, LiteralNumberOct, nil}, + {`0[xX][0-9a-fA-F_]+`, LiteralNumberHex, nil}, + {`0b[01_]+`, LiteralNumberBin, nil}, + {`(0|[1-9][0-9_]*)`, LiteralNumberInteger, nil}, + {`'(\\['"\\abfnrtv]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|[^\\])'`, LiteralStringChar, nil}, + {"(`)([^`]*)(`)", ByGroups(LiteralString, Using(TypeRemappingLexer(GoTextTemplate, TypeMapping{{Other, LiteralString, nil}})), LiteralString), nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`(<<=|>>=|<<|>>|<=|>=|&\^=|&\^|\+=|-=|\*=|/=|%=|&=|\|=|&&|\|\||<-|\+\+|--|==|!=|:=|\.\.\.|[+\-*/%&])`, Operator, nil}, + {`([a-zA-Z_]\w*)(\s*)(\()`, ByGroups(NameFunction, UsingSelf("root"), Punctuation), nil}, + {`[|^<>=!()\[\]{}.,;:]`, Punctuation, nil}, + {`[^\W\d]\w*`, NameOther, nil}, + }, + } +} + +func goTemplateRules() Rules { + return Rules{ + "root": { + {`{{(- )?/\*(.|\n)*?\*/( -)?}}`, CommentMultiline, nil}, + {`{{[-]?`, CommentPreproc, Push("template")}, + {`[^{]+`, Other, nil}, + {`{`, Other, nil}, + }, + "template": { + {`[-]?}}`, CommentPreproc, Pop(1)}, + {`(?=}})`, CommentPreproc, Pop(1)}, // Terminate the pipeline + {`\(`, Operator, Push("subexpression")}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + Include("expression"), + }, + "subexpression": { + {`\)`, Operator, Pop(1)}, + Include("expression"), + }, + "expression": { + {`\s+`, Whitespace, nil}, + {`\(`, Operator, Push("subexpression")}, + {`(range|if|else|while|with|template|end|true|false|nil|and|call|html|index|js|len|not|or|print|printf|println|urlquery|eq|ne|lt|le|gt|ge)\b`, Keyword, nil}, + {`\||:?=|,`, Operator, nil}, + {`[$]?[^\W\d]\w*`, NameOther, nil}, + {`\$|[$]?\.(?:[^\W\d]\w*)?`, NameAttribute, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`-?\d+i`, LiteralNumber, nil}, + {`-?\d+\.\d*([Ee][-+]\d+)?i`, LiteralNumber, nil}, + {`\.\d+([Ee][-+]\d+)?i`, LiteralNumber, nil}, + {`-?\d+[Ee][-+]\d+i`, LiteralNumber, nil}, + {`-?\d+(\.\d+[eE][+\-]?\d+|\.\d*|[eE][+\-]?\d+)`, LiteralNumberFloat, nil}, + {`-?\.\d+([eE][+\-]?\d+)?`, LiteralNumberFloat, nil}, + {`-?0[0-7]+`, LiteralNumberOct, nil}, + {`-?0[xX][0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`-?0b[01_]+`, LiteralNumberBin, nil}, + {`-?(0|[1-9][0-9]*)`, LiteralNumberInteger, nil}, + {`'(\\['"\\abfnrtv]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|[^\\])'`, LiteralStringChar, nil}, + {"`[^`]*`", LiteralString, nil}, + }, + } +} + +var GoHTMLTemplate = internal.Register(DelegatingLexer(h.HTML, MustNewLazyLexer( + &Config{ + Name: "Go HTML Template", + Aliases: []string{"go-html-template"}, + }, + goTemplateRules, +))) + +var GoTextTemplate = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Go Text Template", + Aliases: []string{"go-text-template"}, + }, + goTemplateRules, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/g/graphql.go b/vendor/github.com/alecthomas/chroma/lexers/g/graphql.go new file mode 100644 index 0000000..7d465cd --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/g/graphql.go @@ -0,0 +1,49 @@ +package g + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Go lexer. +var Graphql = internal.Register(MustNewLazyLexer( + &Config{ + Name: "GraphQL", + Aliases: []string{"graphql", "graphqls", "gql"}, + Filenames: []string{"*.graphql", "*.graphqls"}, + }, + graphqlRules, +)) + +func graphqlRules() Rules { + return Rules{ + "root": { + {`(query|mutation|subscription|fragment|scalar|implements|interface|union|enum|input|type)`, KeywordDeclaration, Push("type")}, + {`(on|extend|schema|directive|\.\.\.)`, KeywordDeclaration, nil}, + {`(QUERY|MUTATION|SUBSCRIPTION|FIELD|FRAGMENT_DEFINITION|FRAGMENT_SPREAD|INLINE_FRAGMENT|SCHEMA|SCALAR|OBJECT|FIELD_DEFINITION|ARGUMENT_DEFINITION|INTERFACE|UNION|ENUM|ENUM_VALUE|INPUT_OBJECT|INPUT_FIELD_DEFINITION)\b`, KeywordConstant, nil}, + {`[^\W\d]\w*`, NameProperty, nil}, + {`\@\w+`, NameDecorator, nil}, + {`:`, Punctuation, Push("type")}, + {`[\(\)\{\}\[\],!\|=]`, Punctuation, nil}, + {`\$\w+`, NameVariable, nil}, + {`\d+i`, LiteralNumber, nil}, + {`\d+\.\d*([Ee][-+]\d+)?i`, LiteralNumber, nil}, + {`\.\d+([Ee][-+]\d+)?i`, LiteralNumber, nil}, + {`\d+[Ee][-+]\d+i`, LiteralNumber, nil}, + {`\d+(\.\d+[eE][+\-]?\d+|\.\d*|[eE][+\-]?\d+)`, LiteralNumberFloat, nil}, + {`\.\d+([eE][+\-]?\d+)?`, LiteralNumberFloat, nil}, + {`(0|[1-9][0-9]*)`, LiteralNumberInteger, nil}, + {`"""[\x00-\x7F]*?"""`, LiteralString, nil}, + {`"(\\["\\abfnrtv]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|[^\\])"`, LiteralStringChar, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`"(true|false|null)*"`, Literal, nil}, + {`[\r\n\s]+`, Whitespace, nil}, + {`#[^\r\n]*`, Comment, nil}, + }, + // Treats the next word as a class, default rules it would be a property + "type": { + {`[^\W\d]\w*`, NameClass, Pop(1)}, + Include("root"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/g/groff.go b/vendor/github.com/alecthomas/chroma/lexers/g/groff.go new file mode 100644 index 0000000..65a7093 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/g/groff.go @@ -0,0 +1,47 @@ +package g + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Groff lexer. +var Groff = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Groff", + Aliases: []string{"groff", "nroff", "man"}, + Filenames: []string{"*.[1-9]", "*.1p", "*.3pm", "*.man"}, + MimeTypes: []string{"application/x-troff", "text/troff"}, + }, + func() Rules { + return Rules{ + "root": { + {`(\.)(\w+)`, ByGroups(Text, Keyword), Push("request")}, + {`\.`, Punctuation, Push("request")}, + {`[^\\\n]+`, Text, Push("textline")}, + Default(Push("textline")), + }, + "textline": { + Include("escapes"), + {`[^\\\n]+`, Text, nil}, + {`\n`, Text, Pop(1)}, + }, + "escapes": { + {`\\"[^\n]*`, Comment, nil}, + {`\\[fn]\w`, LiteralStringEscape, nil}, + {`\\\(.{2}`, LiteralStringEscape, nil}, + {`\\.\[.*\]`, LiteralStringEscape, nil}, + {`\\.`, LiteralStringEscape, nil}, + {`\\\n`, Text, Push("request")}, + }, + "request": { + {`\n`, Text, Pop(1)}, + Include("escapes"), + {`"[^\n"]+"`, LiteralStringDouble, nil}, + {`\d+`, LiteralNumber, nil}, + {`\S+`, LiteralString, nil}, + {`\s+`, Text, nil}, + }, + } + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/g/groovy.go b/vendor/github.com/alecthomas/chroma/lexers/g/groovy.go new file mode 100644 index 0000000..8d37bd8 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/g/groovy.go @@ -0,0 +1,62 @@ +package g + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Groovy lexer. +var Groovy = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Groovy", + Aliases: []string{"groovy"}, + Filenames: []string{"*.groovy", "*.gradle"}, + MimeTypes: []string{"text/x-groovy"}, + DotAll: true, + }, + groovyRules, +)) + +func groovyRules() Rules { + return Rules{ + "root": { + {`#!(.*?)$`, CommentPreproc, Push("base")}, + Default(Push("base")), + }, + "base": { + {`^(\s*(?:[a-zA-Z_][\w.\[\]]*\s+)+?)([a-zA-Z_]\w*)(\s*)(\()`, ByGroups(UsingSelf("root"), NameFunction, Text, Operator), nil}, + {`[^\S\n]+`, Text, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`@[a-zA-Z_][\w.]*`, NameDecorator, nil}, + {`(as|assert|break|case|catch|continue|default|do|else|finally|for|if|in|goto|instanceof|new|return|switch|this|throw|try|while|in|as)\b`, Keyword, nil}, + {`(abstract|const|enum|extends|final|implements|native|private|protected|public|static|strictfp|super|synchronized|throws|transient|volatile)\b`, KeywordDeclaration, nil}, + {`(def|boolean|byte|char|double|float|int|long|short|void)\b`, KeywordType, nil}, + {`(package)(\s+)`, ByGroups(KeywordNamespace, Text), nil}, + {`(true|false|null)\b`, KeywordConstant, nil}, + {`(class|interface)(\s+)`, ByGroups(KeywordDeclaration, Text), Push("class")}, + {`(import)(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + {`""".*?"""`, LiteralStringDouble, nil}, + {`'''.*?'''`, LiteralStringSingle, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + {`\$/((?!/\$).)*/\$`, LiteralString, nil}, + {`/(\\\\|\\"|[^/])*/`, LiteralString, nil}, + {`'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'`, LiteralStringChar, nil}, + {`(\.)([a-zA-Z_]\w*)`, ByGroups(Operator, NameAttribute), nil}, + {`[a-zA-Z_]\w*:`, NameLabel, nil}, + {`[a-zA-Z_$]\w*`, Name, nil}, + {`[~^*!%&\[\](){}<>|+=:;,./?-]`, Operator, nil}, + {`[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?`, LiteralNumberFloat, nil}, + {`0x[0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`[0-9]+L?`, LiteralNumberInteger, nil}, + {`\n`, Text, nil}, + }, + "class": { + {`[a-zA-Z_]\w*`, NameClass, Pop(1)}, + }, + "import": { + {`[\w.]+\*?`, NameNamespace, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/handlebars.go b/vendor/github.com/alecthomas/chroma/lexers/h/handlebars.go new file mode 100644 index 0000000..d34ef3a --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/h/handlebars.go @@ -0,0 +1,60 @@ +package h + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Handlebars lexer. +var Handlebars = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Handlebars", + Aliases: []string{"handlebars", "hbs"}, + Filenames: []string{"*.handlebars", "*.hbs"}, + MimeTypes: []string{}, + }, + handlebarsRules, +)) + +func handlebarsRules() Rules { + return Rules{ + "root": { + {`[^{]+`, Other, nil}, + {`\{\{!.*\}\}`, Comment, nil}, + {`(\{\{\{)(\s*)`, ByGroups(CommentSpecial, Text), Push("tag")}, + {`(\{\{)(\s*)`, ByGroups(CommentPreproc, Text), Push("tag")}, + }, + "tag": { + {`\s+`, Text, nil}, + {`\}\}\}`, CommentSpecial, Pop(1)}, + {`\}\}`, CommentPreproc, Pop(1)}, + {`([#/]*)(each|if|unless|else|with|log|in(?:line)?)`, ByGroups(Keyword, Keyword), nil}, + {`#\*inline`, Keyword, nil}, + {`([#/])([\w-]+)`, ByGroups(NameFunction, NameFunction), nil}, + {`([\w-]+)(=)`, ByGroups(NameAttribute, Operator), nil}, + {`(>)(\s*)(@partial-block)`, ByGroups(Keyword, Text, Keyword), nil}, + {`(#?>)(\s*)([\w-]+)`, ByGroups(Keyword, Text, NameVariable), nil}, + {`(>)(\s*)(\()`, ByGroups(Keyword, Text, Punctuation), Push("dynamic-partial")}, + Include("generic"), + }, + "dynamic-partial": { + {`\s+`, Text, nil}, + {`\)`, Punctuation, Pop(1)}, + {`(lookup)(\s+)(\.|this)(\s+)`, ByGroups(Keyword, Text, NameVariable, Text), nil}, + {`(lookup)(\s+)(\S+)`, ByGroups(Keyword, Text, UsingSelf("variable")), nil}, + {`[\w-]+`, NameFunction, nil}, + Include("generic"), + }, + "variable": { + {`[a-zA-Z][\w-]*`, NameVariable, nil}, + {`\.[\w-]+`, NameVariable, nil}, + {`(this\/|\.\/|(\.\.\/)+)[\w-]+`, NameVariable, nil}, + }, + "generic": { + Include("variable"), + {`:?"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`:?'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + {`[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?`, LiteralNumber, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/haskell.go b/vendor/github.com/alecthomas/chroma/lexers/h/haskell.go new file mode 100644 index 0000000..e34f03e --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/h/haskell.go @@ -0,0 +1,103 @@ +package h + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Haskell lexer. +var Haskell = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Haskell", + Aliases: []string{"haskell", "hs"}, + Filenames: []string{"*.hs"}, + MimeTypes: []string{"text/x-haskell"}, + }, + haskellRules, +)) + +func haskellRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`--(?![!#$%&*+./<=>?@^|_~:\\]).*?$`, CommentSingle, nil}, + {`\{-`, CommentMultiline, Push("comment")}, + {`\bimport\b`, KeywordReserved, Push("import")}, + {`\bmodule\b`, KeywordReserved, Push("module")}, + {`\berror\b`, NameException, nil}, + {`\b(case|class|data|default|deriving|do|else|family|if|in|infix[lr]?|instance|let|newtype|of|then|type|where|_)(?!\')\b`, KeywordReserved, nil}, + {`'[^\\]'`, LiteralStringChar, nil}, + {`^[_\p{Ll}][\w\']*`, NameFunction, nil}, + {`'?[_\p{Ll}][\w']*`, Name, nil}, + {`('')?[\p{Lu}][\w\']*`, KeywordType, nil}, + {`(')[\p{Lu}][\w\']*`, KeywordType, nil}, + {`(')\[[^\]]*\]`, KeywordType, nil}, + {`(')\([^)]*\)`, KeywordType, nil}, + {`\\(?![:!#$%&*+.\\/<=>?@^|~-]+)`, NameFunction, nil}, + {`(<-|::|->|=>|=)(?![:!#$%&*+.\\/<=>?@^|~-]+)`, OperatorWord, nil}, + {`:[:!#$%&*+.\\/<=>?@^|~-]*`, KeywordType, nil}, + {`[:!#$%&*+.\\/<=>?@^|~-]+`, Operator, nil}, + {`\d+[eE][+-]?\d+`, LiteralNumberFloat, nil}, + {`\d+\.\d+([eE][+-]?\d+)?`, LiteralNumberFloat, nil}, + {`0[oO][0-7]+`, LiteralNumberOct, nil}, + {`0[xX][\da-fA-F]+`, LiteralNumberHex, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`'`, LiteralStringChar, Push("character")}, + {`"`, LiteralString, Push("string")}, + {`\[\]`, KeywordType, nil}, + {`\(\)`, NameBuiltin, nil}, + {"[][(),;`{}]", Punctuation, nil}, + }, + "import": { + {`\s+`, Text, nil}, + {`"`, LiteralString, Push("string")}, + {`\)`, Punctuation, Pop(1)}, + {`qualified\b`, Keyword, nil}, + {`([\p{Lu}][\w.]*)(\s+)(as)(\s+)([\p{Lu}][\w.]*)`, ByGroups(NameNamespace, Text, Keyword, Text, Name), Pop(1)}, + {`([\p{Lu}][\w.]*)(\s+)(hiding)(\s+)(\()`, ByGroups(NameNamespace, Text, Keyword, Text, Punctuation), Push("funclist")}, + {`([\p{Lu}][\w.]*)(\s+)(\()`, ByGroups(NameNamespace, Text, Punctuation), Push("funclist")}, + {`[\w.]+`, NameNamespace, Pop(1)}, + }, + "module": { + {`\s+`, Text, nil}, + {`([\p{Lu}][\w.]*)(\s+)(\()`, ByGroups(NameNamespace, Text, Punctuation), Push("funclist")}, + {`[\p{Lu}][\w.]*`, NameNamespace, Pop(1)}, + }, + "funclist": { + {`\s+`, Text, nil}, + {`[\p{Lu}]\w*`, KeywordType, nil}, + {`(_[\w\']+|[\p{Ll}][\w\']*)`, NameFunction, nil}, + {`--(?![!#$%&*+./<=>?@^|_~:\\]).*?$`, CommentSingle, nil}, + {`\{-`, CommentMultiline, Push("comment")}, + {`,`, Punctuation, nil}, + {`[:!#$%&*+.\\/<=>?@^|~-]+`, Operator, nil}, + {`\(`, Punctuation, Push("funclist", "funclist")}, + {`\)`, Punctuation, Pop(2)}, + }, + "comment": { + {`[^-{}]+`, CommentMultiline, nil}, + {`\{-`, CommentMultiline, Push()}, + {`-\}`, CommentMultiline, Pop(1)}, + {`[-{}]`, CommentMultiline, nil}, + }, + "character": { + {`[^\\']'`, LiteralStringChar, Pop(1)}, + {`\\`, LiteralStringEscape, Push("escape")}, + {`'`, LiteralStringChar, Pop(1)}, + }, + "string": { + {`[^\\"]+`, LiteralString, nil}, + {`\\`, LiteralStringEscape, Push("escape")}, + {`"`, LiteralString, Pop(1)}, + }, + "escape": { + {`[abfnrtv"\'&\\]`, LiteralStringEscape, Pop(1)}, + {`\^[][\p{Lu}@^_]`, LiteralStringEscape, Pop(1)}, + {`NUL|SOH|[SE]TX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|S[OI]|DLE|DC[1-4]|NAK|SYN|ETB|CAN|EM|SUB|ESC|[FGRU]S|SP|DEL`, LiteralStringEscape, Pop(1)}, + {`o[0-7]+`, LiteralStringEscape, Pop(1)}, + {`x[\da-fA-F]+`, LiteralStringEscape, Pop(1)}, + {`\d+`, LiteralStringEscape, Pop(1)}, + {`\s+\\`, LiteralStringEscape, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/haxe.go b/vendor/github.com/alecthomas/chroma/lexers/h/haxe.go new file mode 100644 index 0000000..cc8c693 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/h/haxe.go @@ -0,0 +1,646 @@ +package h + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Haxe lexer. +var Haxe = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Haxe", + Aliases: []string{"hx", "haxe", "hxsl"}, + Filenames: []string{"*.hx", "*.hxsl"}, + MimeTypes: []string{"text/haxe", "text/x-haxe", "text/x-hx"}, + DotAll: true, + }, + haxeRules, +)) + +func haxeRules() Rules { + return Rules{ + "root": { + Include("spaces"), + Include("meta"), + {`(?:package)\b`, KeywordNamespace, Push("semicolon", "package")}, + {`(?:import)\b`, KeywordNamespace, Push("semicolon", "import")}, + {`(?:using)\b`, KeywordNamespace, Push("semicolon", "using")}, + {`(?:extern|private)\b`, KeywordDeclaration, nil}, + {`(?:abstract)\b`, KeywordDeclaration, Push("abstract")}, + {`(?:class|interface)\b`, KeywordDeclaration, Push("class")}, + {`(?:enum)\b`, KeywordDeclaration, Push("enum")}, + {`(?:typedef)\b`, KeywordDeclaration, Push("typedef")}, + {`(?=.)`, Text, Push("expr-statement")}, + }, + "spaces": { + {`\s+`, Text, nil}, + {`//[^\n\r]*`, CommentSingle, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`(#)(if|elseif|else|end|error)\b`, CommentPreproc, MutatorFunc(haxePreProcMutator)}, + }, + "string-single-interpol": { + {`\$\{`, LiteralStringInterpol, Push("string-interpol-close", "expr")}, + {`\$\$`, LiteralStringEscape, nil}, + {`\$(?=(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+))`, LiteralStringInterpol, Push("ident")}, + Include("string-single"), + }, + "string-single": { + {`'`, LiteralStringSingle, Pop(1)}, + {`\\.`, LiteralStringEscape, nil}, + {`.`, LiteralStringSingle, nil}, + }, + "string-double": { + {`"`, LiteralStringDouble, Pop(1)}, + {`\\.`, LiteralStringEscape, nil}, + {`.`, LiteralStringDouble, nil}, + }, + "string-interpol-close": { + {`\$(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, LiteralStringInterpol, nil}, + {`\}`, LiteralStringInterpol, Pop(1)}, + }, + "package": { + Include("spaces"), + {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameNamespace, nil}, + {`\.`, Punctuation, Push("import-ident")}, + Default(Pop(1)), + }, + "import": { + Include("spaces"), + {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameNamespace, nil}, + {`\*`, Keyword, nil}, + {`\.`, Punctuation, Push("import-ident")}, + {`in`, KeywordNamespace, Push("ident")}, + Default(Pop(1)), + }, + "import-ident": { + Include("spaces"), + {`\*`, Keyword, Pop(1)}, + {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameNamespace, Pop(1)}, + }, + "using": { + Include("spaces"), + {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameNamespace, nil}, + {`\.`, Punctuation, Push("import-ident")}, + Default(Pop(1)), + }, + "preproc-error": { + {`\s+`, CommentPreproc, nil}, + {`'`, LiteralStringSingle, Push("#pop", "string-single")}, + {`"`, LiteralStringDouble, Push("#pop", "string-double")}, + Default(Pop(1)), + }, + "preproc-expr": { + {`\s+`, CommentPreproc, nil}, + {`\!`, CommentPreproc, nil}, + {`\(`, CommentPreproc, Push("#pop", "preproc-parenthesis")}, + {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, CommentPreproc, Pop(1)}, + {`\.[0-9]+`, LiteralNumberFloat, nil}, + {`[0-9]+[eE][+\-]?[0-9]+`, LiteralNumberFloat, nil}, + {`[0-9]+\.[0-9]*[eE][+\-]?[0-9]+`, LiteralNumberFloat, nil}, + {`[0-9]+\.[0-9]+`, LiteralNumberFloat, nil}, + {`[0-9]+\.(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)|\.\.)`, LiteralNumberFloat, nil}, + {`0x[0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`'`, LiteralStringSingle, Push("#pop", "string-single")}, + {`"`, LiteralStringDouble, Push("#pop", "string-double")}, + }, + "preproc-parenthesis": { + {`\s+`, CommentPreproc, nil}, + {`\)`, CommentPreproc, Pop(1)}, + Default(Push("preproc-expr-in-parenthesis")), + }, + "preproc-expr-chain": { + {`\s+`, CommentPreproc, nil}, + {`(?:%=|&=|\|=|\^=|\+=|\-=|\*=|/=|<<=|>\s*>\s*=|>\s*>\s*>\s*=|==|!=|<=|>\s*=|&&|\|\||<<|>>>|>\s*>|\.\.\.|<|>|%|&|\||\^|\+|\*|/|\-|=>|=)`, CommentPreproc, Push("#pop", "preproc-expr-in-parenthesis")}, + Default(Pop(1)), + }, + "preproc-expr-in-parenthesis": { + {`\s+`, CommentPreproc, nil}, + {`\!`, CommentPreproc, nil}, + {`\(`, CommentPreproc, Push("#pop", "preproc-expr-chain", "preproc-parenthesis")}, + {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, CommentPreproc, Push("#pop", "preproc-expr-chain")}, + {`\.[0-9]+`, LiteralNumberFloat, Push("#pop", "preproc-expr-chain")}, + {`[0-9]+[eE][+\-]?[0-9]+`, LiteralNumberFloat, Push("#pop", "preproc-expr-chain")}, + {`[0-9]+\.[0-9]*[eE][+\-]?[0-9]+`, LiteralNumberFloat, Push("#pop", "preproc-expr-chain")}, + {`[0-9]+\.[0-9]+`, LiteralNumberFloat, Push("#pop", "preproc-expr-chain")}, + {`[0-9]+\.(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)|\.\.)`, LiteralNumberFloat, Push("#pop", "preproc-expr-chain")}, + {`0x[0-9a-fA-F]+`, LiteralNumberHex, Push("#pop", "preproc-expr-chain")}, + {`[0-9]+`, LiteralNumberInteger, Push("#pop", "preproc-expr-chain")}, + {`'`, LiteralStringSingle, Push("#pop", "preproc-expr-chain", "string-single")}, + {`"`, LiteralStringDouble, Push("#pop", "preproc-expr-chain", "string-double")}, + }, + "abstract": { + Include("spaces"), + Default(Pop(1), Push("abstract-body"), Push("abstract-relation"), Push("abstract-opaque"), Push("type-param-constraint"), Push("type-name")), + }, + "abstract-body": { + Include("spaces"), + {`\{`, Punctuation, Push("#pop", "class-body")}, + }, + "abstract-opaque": { + Include("spaces"), + {`\(`, Punctuation, Push("#pop", "parenthesis-close", "type")}, + Default(Pop(1)), + }, + "abstract-relation": { + Include("spaces"), + {`(?:to|from)`, KeywordDeclaration, Push("type")}, + {`,`, Punctuation, nil}, + Default(Pop(1)), + }, + "meta": { + Include("spaces"), + {`@`, NameDecorator, Push("meta-body", "meta-ident", "meta-colon")}, + }, + "meta-colon": { + Include("spaces"), + {`:`, NameDecorator, Pop(1)}, + Default(Pop(1)), + }, + "meta-ident": { + Include("spaces"), + {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameDecorator, Pop(1)}, + }, + "meta-body": { + Include("spaces"), + {`\(`, NameDecorator, Push("#pop", "meta-call")}, + Default(Pop(1)), + }, + "meta-call": { + Include("spaces"), + {`\)`, NameDecorator, Pop(1)}, + Default(Pop(1), Push("meta-call-sep"), Push("expr")), + }, + "meta-call-sep": { + Include("spaces"), + {`\)`, NameDecorator, Pop(1)}, + {`,`, Punctuation, Push("#pop", "meta-call")}, + }, + "typedef": { + Include("spaces"), + Default(Pop(1), Push("typedef-body"), Push("type-param-constraint"), Push("type-name")), + }, + "typedef-body": { + Include("spaces"), + {`=`, Operator, Push("#pop", "optional-semicolon", "type")}, + }, + "enum": { + Include("spaces"), + Default(Pop(1), Push("enum-body"), Push("bracket-open"), Push("type-param-constraint"), Push("type-name")), + }, + "enum-body": { + Include("spaces"), + Include("meta"), + {`\}`, Punctuation, Pop(1)}, + {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("enum-member", "type-param-constraint")}, + }, + "enum-member": { + Include("spaces"), + {`\(`, Punctuation, Push("#pop", "semicolon", "flag", "function-param")}, + Default(Pop(1), Push("semicolon"), Push("flag")), + }, + "class": { + Include("spaces"), + Default(Pop(1), Push("class-body"), Push("bracket-open"), Push("extends"), Push("type-param-constraint"), Push("type-name")), + }, + "extends": { + Include("spaces"), + {`(?:extends|implements)\b`, KeywordDeclaration, Push("type")}, + {`,`, Punctuation, nil}, + Default(Pop(1)), + }, + "bracket-open": { + Include("spaces"), + {`\{`, Punctuation, Pop(1)}, + }, + "bracket-close": { + Include("spaces"), + {`\}`, Punctuation, Pop(1)}, + }, + "class-body": { + Include("spaces"), + Include("meta"), + {`\}`, Punctuation, Pop(1)}, + {`(?:static|public|private|override|dynamic|inline|macro)\b`, KeywordDeclaration, nil}, + Default(Push("class-member")), + }, + "class-member": { + Include("spaces"), + {`(var)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "var")}, + {`(function)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "class-method")}, + }, + "function-local": { + Include("spaces"), + {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameFunction, Push("#pop", "optional-expr", "flag", "function-param", "parenthesis-open", "type-param-constraint")}, + Default(Pop(1), Push("optional-expr"), Push("flag"), Push("function-param"), Push("parenthesis-open"), Push("type-param-constraint")), + }, + "optional-expr": { + Include("spaces"), + Include("expr"), + Default(Pop(1)), + }, + "class-method": { + Include("spaces"), + {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, NameFunction, Push("#pop", "optional-expr", "flag", "function-param", "parenthesis-open", "type-param-constraint")}, + }, + "function-param": { + Include("spaces"), + {`\)`, Punctuation, Pop(1)}, + {`\?`, Punctuation, nil}, + {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("#pop", "function-param-sep", "assign", "flag")}, + }, + "function-param-sep": { + Include("spaces"), + {`\)`, Punctuation, Pop(1)}, + {`,`, Punctuation, Push("#pop", "function-param")}, + }, + "prop-get-set": { + Include("spaces"), + {`\(`, Punctuation, Push("#pop", "parenthesis-close", "prop-get-set-opt", "comma", "prop-get-set-opt")}, + Default(Pop(1)), + }, + "prop-get-set-opt": { + Include("spaces"), + {`(?:default|null|never|dynamic|get|set)\b`, Keyword, Pop(1)}, + {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Text, Pop(1)}, + }, + "expr-statement": { + Include("spaces"), + Default(Pop(1), Push("optional-semicolon"), Push("expr")), + }, + "expr": { + Include("spaces"), + {`@`, NameDecorator, Push("#pop", "optional-expr", "meta-body", "meta-ident", "meta-colon")}, + {`(?:\+\+|\-\-|~(?!/)|!|\-)`, Operator, nil}, + {`\(`, Punctuation, Push("#pop", "expr-chain", "parenthesis")}, + {`(?:static|public|private|override|dynamic|inline)\b`, KeywordDeclaration, nil}, + {`(?:function)\b`, KeywordDeclaration, Push("#pop", "expr-chain", "function-local")}, + {`\{`, Punctuation, Push("#pop", "expr-chain", "bracket")}, + {`(?:true|false|null)\b`, KeywordConstant, Push("#pop", "expr-chain")}, + {`(?:this)\b`, Keyword, Push("#pop", "expr-chain")}, + {`(?:cast)\b`, Keyword, Push("#pop", "expr-chain", "cast")}, + {`(?:try)\b`, Keyword, Push("#pop", "catch", "expr")}, + {`(?:var)\b`, KeywordDeclaration, Push("#pop", "var")}, + {`(?:new)\b`, Keyword, Push("#pop", "expr-chain", "new")}, + {`(?:switch)\b`, Keyword, Push("#pop", "switch")}, + {`(?:if)\b`, Keyword, Push("#pop", "if")}, + {`(?:do)\b`, Keyword, Push("#pop", "do")}, + {`(?:while)\b`, Keyword, Push("#pop", "while")}, + {`(?:for)\b`, Keyword, Push("#pop", "for")}, + {`(?:untyped|throw)\b`, Keyword, nil}, + {`(?:return)\b`, Keyword, Push("#pop", "optional-expr")}, + {`(?:macro)\b`, Keyword, Push("#pop", "macro")}, + {`(?:continue|break)\b`, Keyword, Pop(1)}, + {`(?:\$\s*[a-z]\b|\$(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)))`, Name, Push("#pop", "dollar")}, + {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("#pop", "expr-chain")}, + {`\.[0-9]+`, LiteralNumberFloat, Push("#pop", "expr-chain")}, + {`[0-9]+[eE][+\-]?[0-9]+`, LiteralNumberFloat, Push("#pop", "expr-chain")}, + {`[0-9]+\.[0-9]*[eE][+\-]?[0-9]+`, LiteralNumberFloat, Push("#pop", "expr-chain")}, + {`[0-9]+\.[0-9]+`, LiteralNumberFloat, Push("#pop", "expr-chain")}, + {`[0-9]+\.(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)|\.\.)`, LiteralNumberFloat, Push("#pop", "expr-chain")}, + {`0x[0-9a-fA-F]+`, LiteralNumberHex, Push("#pop", "expr-chain")}, + {`[0-9]+`, LiteralNumberInteger, Push("#pop", "expr-chain")}, + {`'`, LiteralStringSingle, Push("#pop", "expr-chain", "string-single-interpol")}, + {`"`, LiteralStringDouble, Push("#pop", "expr-chain", "string-double")}, + {`~/(\\\\|\\/|[^/\n])*/[gimsu]*`, LiteralStringRegex, Push("#pop", "expr-chain")}, + {`\[`, Punctuation, Push("#pop", "expr-chain", "array-decl")}, + }, + "expr-chain": { + Include("spaces"), + {`(?:\+\+|\-\-)`, Operator, nil}, + {`(?:%=|&=|\|=|\^=|\+=|\-=|\*=|/=|<<=|>\s*>\s*=|>\s*>\s*>\s*=|==|!=|<=|>\s*=|&&|\|\||<<|>>>|>\s*>|\.\.\.|<|>|%|&|\||\^|\+|\*|/|\-|=>|=)`, Operator, Push("#pop", "expr")}, + {`(?:in)\b`, Keyword, Push("#pop", "expr")}, + {`\?`, Operator, Push("#pop", "expr", "ternary", "expr")}, + {`(\.)((?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+))`, ByGroups(Punctuation, Name), nil}, + {`\[`, Punctuation, Push("array-access")}, + {`\(`, Punctuation, Push("call")}, + Default(Pop(1)), + }, + "macro": { + Include("spaces"), + Include("meta"), + {`:`, Punctuation, Push("#pop", "type")}, + {`(?:extern|private)\b`, KeywordDeclaration, nil}, + {`(?:abstract)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "abstract")}, + {`(?:class|interface)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "macro-class")}, + {`(?:enum)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "enum")}, + {`(?:typedef)\b`, KeywordDeclaration, Push("#pop", "optional-semicolon", "typedef")}, + Default(Pop(1), Push("expr")), + }, + "macro-class": { + {`\{`, Punctuation, Push("#pop", "class-body")}, + Include("class"), + }, + "cast": { + Include("spaces"), + {`\(`, Punctuation, Push("#pop", "parenthesis-close", "cast-type", "expr")}, + Default(Pop(1), Push("expr")), + }, + "cast-type": { + Include("spaces"), + {`,`, Punctuation, Push("#pop", "type")}, + Default(Pop(1)), + }, + "catch": { + Include("spaces"), + {`(?:catch)\b`, Keyword, Push("expr", "function-param", "parenthesis-open")}, + Default(Pop(1)), + }, + "do": { + Include("spaces"), + Default(Pop(1), Push("do-while"), Push("expr")), + }, + "do-while": { + Include("spaces"), + {`(?:while)\b`, Keyword, Push("#pop", "parenthesis", "parenthesis-open")}, + }, + "while": { + Include("spaces"), + {`\(`, Punctuation, Push("#pop", "expr", "parenthesis")}, + }, + "for": { + Include("spaces"), + {`\(`, Punctuation, Push("#pop", "expr", "parenthesis")}, + }, + "if": { + Include("spaces"), + {`\(`, Punctuation, Push("#pop", "else", "optional-semicolon", "expr", "parenthesis")}, + }, + "else": { + Include("spaces"), + {`(?:else)\b`, Keyword, Push("#pop", "expr")}, + Default(Pop(1)), + }, + "switch": { + Include("spaces"), + Default(Pop(1), Push("switch-body"), Push("bracket-open"), Push("expr")), + }, + "switch-body": { + Include("spaces"), + {`(?:case|default)\b`, Keyword, Push("case-block", "case")}, + {`\}`, Punctuation, Pop(1)}, + }, + "case": { + Include("spaces"), + {`:`, Punctuation, Pop(1)}, + Default(Pop(1), Push("case-sep"), Push("case-guard"), Push("expr")), + }, + "case-sep": { + Include("spaces"), + {`:`, Punctuation, Pop(1)}, + {`,`, Punctuation, Push("#pop", "case")}, + }, + "case-guard": { + Include("spaces"), + {`(?:if)\b`, Keyword, Push("#pop", "parenthesis", "parenthesis-open")}, + Default(Pop(1)), + }, + "case-block": { + Include("spaces"), + {`(?!(?:case|default)\b|\})`, Keyword, Push("expr-statement")}, + Default(Pop(1)), + }, + "new": { + Include("spaces"), + Default(Pop(1), Push("call"), Push("parenthesis-open"), Push("type")), + }, + "array-decl": { + Include("spaces"), + {`\]`, Punctuation, Pop(1)}, + Default(Pop(1), Push("array-decl-sep"), Push("expr")), + }, + "array-decl-sep": { + Include("spaces"), + {`\]`, Punctuation, Pop(1)}, + {`,`, Punctuation, Push("#pop", "array-decl")}, + }, + "array-access": { + Include("spaces"), + Default(Pop(1), Push("array-access-close"), Push("expr")), + }, + "array-access-close": { + Include("spaces"), + {`\]`, Punctuation, Pop(1)}, + }, + "comma": { + Include("spaces"), + {`,`, Punctuation, Pop(1)}, + }, + "colon": { + Include("spaces"), + {`:`, Punctuation, Pop(1)}, + }, + "semicolon": { + Include("spaces"), + {`;`, Punctuation, Pop(1)}, + }, + "optional-semicolon": { + Include("spaces"), + {`;`, Punctuation, Pop(1)}, + Default(Pop(1)), + }, + "ident": { + Include("spaces"), + {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Pop(1)}, + }, + "dollar": { + Include("spaces"), + {`\{`, Punctuation, Push("#pop", "expr-chain", "bracket-close", "expr")}, + Default(Pop(1), Push("expr-chain")), + }, + "type-name": { + Include("spaces"), + {`_*[A-Z]\w*`, Name, Pop(1)}, + }, + "type-full-name": { + Include("spaces"), + {`\.`, Punctuation, Push("ident")}, + Default(Pop(1)), + }, + "type": { + Include("spaces"), + {`\?`, Punctuation, nil}, + {`(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("#pop", "type-check", "type-full-name")}, + {`\{`, Punctuation, Push("#pop", "type-check", "type-struct")}, + {`\(`, Punctuation, Push("#pop", "type-check", "type-parenthesis")}, + }, + "type-parenthesis": { + Include("spaces"), + Default(Pop(1), Push("parenthesis-close"), Push("type")), + }, + "type-check": { + Include("spaces"), + {`->`, Punctuation, Push("#pop", "type")}, + {`<(?!=)`, Punctuation, Push("type-param")}, + Default(Pop(1)), + }, + "type-struct": { + Include("spaces"), + {`\}`, Punctuation, Pop(1)}, + {`\?`, Punctuation, nil}, + {`>`, Punctuation, Push("comma", "type")}, + {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("#pop", "type-struct-sep", "type", "colon")}, + Include("class-body"), + }, + "type-struct-sep": { + Include("spaces"), + {`\}`, Punctuation, Pop(1)}, + {`,`, Punctuation, Push("#pop", "type-struct")}, + }, + "type-param-type": { + {`\.[0-9]+`, LiteralNumberFloat, Pop(1)}, + {`[0-9]+[eE][+\-]?[0-9]+`, LiteralNumberFloat, Pop(1)}, + {`[0-9]+\.[0-9]*[eE][+\-]?[0-9]+`, LiteralNumberFloat, Pop(1)}, + {`[0-9]+\.[0-9]+`, LiteralNumberFloat, Pop(1)}, + {`[0-9]+\.(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)|\.\.)`, LiteralNumberFloat, Pop(1)}, + {`0x[0-9a-fA-F]+`, LiteralNumberHex, Pop(1)}, + {`[0-9]+`, LiteralNumberInteger, Pop(1)}, + {`'`, LiteralStringSingle, Push("#pop", "string-single")}, + {`"`, LiteralStringDouble, Push("#pop", "string-double")}, + {`~/(\\\\|\\/|[^/\n])*/[gim]*`, LiteralStringRegex, Pop(1)}, + {`\[`, Operator, Push("#pop", "array-decl")}, + Include("type"), + }, + "type-param": { + Include("spaces"), + Default(Pop(1), Push("type-param-sep"), Push("type-param-type")), + }, + "type-param-sep": { + Include("spaces"), + {`>`, Punctuation, Pop(1)}, + {`,`, Punctuation, Push("#pop", "type-param")}, + }, + "type-param-constraint": { + Include("spaces"), + {`<(?!=)`, Punctuation, Push("#pop", "type-param-constraint-sep", "type-param-constraint-flag", "type-name")}, + Default(Pop(1)), + }, + "type-param-constraint-sep": { + Include("spaces"), + {`>`, Punctuation, Pop(1)}, + {`,`, Punctuation, Push("#pop", "type-param-constraint-sep", "type-param-constraint-flag", "type-name")}, + }, + "type-param-constraint-flag": { + Include("spaces"), + {`:`, Punctuation, Push("#pop", "type-param-constraint-flag-type")}, + Default(Pop(1)), + }, + "type-param-constraint-flag-type": { + Include("spaces"), + {`\(`, Punctuation, Push("#pop", "type-param-constraint-flag-type-sep", "type")}, + Default(Pop(1), Push("type")), + }, + "type-param-constraint-flag-type-sep": { + Include("spaces"), + {`\)`, Punctuation, Pop(1)}, + {`,`, Punctuation, Push("type")}, + }, + "parenthesis": { + Include("spaces"), + Default(Pop(1), Push("parenthesis-close"), Push("flag"), Push("expr")), + }, + "parenthesis-open": { + Include("spaces"), + {`\(`, Punctuation, Pop(1)}, + }, + "parenthesis-close": { + Include("spaces"), + {`\)`, Punctuation, Pop(1)}, + }, + "var": { + Include("spaces"), + {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Text, Push("#pop", "var-sep", "assign", "flag", "prop-get-set")}, + }, + "var-sep": { + Include("spaces"), + {`,`, Punctuation, Push("#pop", "var")}, + Default(Pop(1)), + }, + "assign": { + Include("spaces"), + {`=`, Operator, Push("#pop", "expr")}, + Default(Pop(1)), + }, + "flag": { + Include("spaces"), + {`:`, Punctuation, Push("#pop", "type")}, + Default(Pop(1)), + }, + "ternary": { + Include("spaces"), + {`:`, Operator, Pop(1)}, + }, + "call": { + Include("spaces"), + {`\)`, Punctuation, Pop(1)}, + Default(Pop(1), Push("call-sep"), Push("expr")), + }, + "call-sep": { + Include("spaces"), + {`\)`, Punctuation, Pop(1)}, + {`,`, Punctuation, Push("#pop", "call")}, + }, + "bracket": { + Include("spaces"), + {`(?!(?:\$\s*[a-z]\b|\$(?!(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+))))(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Push("#pop", "bracket-check")}, + {`'`, LiteralStringSingle, Push("#pop", "bracket-check", "string-single")}, + {`"`, LiteralStringDouble, Push("#pop", "bracket-check", "string-double")}, + Default(Pop(1), Push("block")), + }, + "bracket-check": { + Include("spaces"), + {`:`, Punctuation, Push("#pop", "object-sep", "expr")}, + Default(Pop(1), Push("block"), Push("optional-semicolon"), Push("expr-chain")), + }, + "block": { + Include("spaces"), + {`\}`, Punctuation, Pop(1)}, + Default(Push("expr-statement")), + }, + "object": { + Include("spaces"), + {`\}`, Punctuation, Pop(1)}, + Default(Pop(1), Push("object-sep"), Push("expr"), Push("colon"), Push("ident-or-string")), + }, + "ident-or-string": { + Include("spaces"), + {`(?!(?:function|class|static|var|if|else|while|do|for|break|return|continue|extends|implements|import|switch|case|default|public|private|try|untyped|catch|new|this|throw|extern|enum|in|interface|cast|override|dynamic|typedef|package|inline|using|null|true|false|abstract)\b)(?:_*[a-z]\w*|_+[0-9]\w*|_*[A-Z]\w*|_+|\$\w+)`, Name, Pop(1)}, + {`'`, LiteralStringSingle, Push("#pop", "string-single")}, + {`"`, LiteralStringDouble, Push("#pop", "string-double")}, + }, + "object-sep": { + Include("spaces"), + {`\}`, Punctuation, Pop(1)}, + {`,`, Punctuation, Push("#pop", "object")}, + }, + } +} + +func haxePreProcMutator(state *LexerState) error { + stack, ok := state.Get("haxe-pre-proc").([][]string) + if !ok { + stack = [][]string{} + } + + proc := state.Groups[2] + switch proc { + case "if": + stack = append(stack, state.Stack) + case "else", "elseif": + if len(stack) > 0 { + state.Stack = stack[len(stack)-1] + } + case "end": + stack = stack[:len(stack)-1] + } + + if proc == "if" || proc == "elseif" { + state.Stack = append(state.Stack, "preproc-expr") + } + + if proc == "error" { + state.Stack = append(state.Stack, "preproc-error") + } + state.Set("haxe-pre-proc", stack) + return nil +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/hcl.go b/vendor/github.com/alecthomas/chroma/lexers/h/hcl.go new file mode 100644 index 0000000..7206fba --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/h/hcl.go @@ -0,0 +1,73 @@ +package h + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// HCL lexer. +var HCL = internal.Register(MustNewLazyLexer( + &Config{ + Name: "HCL", + Aliases: []string{"hcl"}, + Filenames: []string{"*.hcl"}, + MimeTypes: []string{"application/x-hcl"}, + }, + hclRules, +)) + +func hclRules() Rules { + return Rules{ + "root": { + Include("string"), + Include("punctuation"), + Include("curly"), + Include("basic"), + Include("whitespace"), + {`[0-9]+`, LiteralNumber, nil}, + }, + "basic": { + {Words(`\b`, `\b`, `true`, `false`), KeywordType, nil}, + {`\s*/\*`, CommentMultiline, Push("comment")}, + {`\s*#.*\n`, CommentSingle, nil}, + {`(.*?)(\s*)(=)`, ByGroups(Name, Text, Operator), nil}, + {`\d+`, Number, nil}, + {`\b\w+\b`, Keyword, nil}, + {`\$\{`, LiteralStringInterpol, Push("var_builtin")}, + }, + "function": { + {`(\s+)(".*")(\s+)`, ByGroups(Text, LiteralString, Text), nil}, + Include("punctuation"), + Include("curly"), + }, + "var_builtin": { + {`\$\{`, LiteralStringInterpol, Push()}, + {Words(`\b`, `\b`, `concat`, `file`, `join`, `lookup`, `element`), NameBuiltin, nil}, + Include("string"), + Include("punctuation"), + {`\s+`, Text, nil}, + {`\}`, LiteralStringInterpol, Pop(1)}, + }, + "string": { + {`(".*")`, ByGroups(LiteralStringDouble), nil}, + }, + "punctuation": { + {`[\[\](),.]`, Punctuation, nil}, + }, + "curly": { + {`\{`, TextPunctuation, nil}, + {`\}`, TextPunctuation, nil}, + }, + "comment": { + {`[^*/]`, CommentMultiline, nil}, + {`/\*`, CommentMultiline, Push()}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[*/]`, CommentMultiline, nil}, + }, + "whitespace": { + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`\\\n`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/hexdump.go b/vendor/github.com/alecthomas/chroma/lexers/h/hexdump.go new file mode 100644 index 0000000..0893537 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/h/hexdump.go @@ -0,0 +1,71 @@ +package h + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Hexdump lexer. +var Hexdump = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Hexdump", + Aliases: []string{"hexdump"}, + Filenames: []string{}, + MimeTypes: []string{}, + }, + hexdumpRules, +)) + +func hexdumpRules() Rules { + return Rules{ + "root": { + {`\n`, Text, nil}, + Include("offset"), + {`([0-9A-Ha-h]{2})(\-)([0-9A-Ha-h]{2})`, ByGroups(LiteralNumberHex, Punctuation, LiteralNumberHex), nil}, + {`[0-9A-Ha-h]{2}`, LiteralNumberHex, nil}, + {`(\s{2,3})(\>)(.{16})(\<)$`, ByGroups(Text, Punctuation, LiteralString, Punctuation), Push("bracket-strings")}, + {`(\s{2,3})(\|)(.{16})(\|)$`, ByGroups(Text, Punctuation, LiteralString, Punctuation), Push("piped-strings")}, + {`(\s{2,3})(\>)(.{1,15})(\<)$`, ByGroups(Text, Punctuation, LiteralString, Punctuation), nil}, + {`(\s{2,3})(\|)(.{1,15})(\|)$`, ByGroups(Text, Punctuation, LiteralString, Punctuation), nil}, + {`(\s{2,3})(.{1,15})$`, ByGroups(Text, LiteralString), nil}, + {`(\s{2,3})(.{16}|.{20})$`, ByGroups(Text, LiteralString), Push("nonpiped-strings")}, + {`\s`, Text, nil}, + {`^\*`, Punctuation, nil}, + }, + "offset": { + {`^([0-9A-Ha-h]+)(:)`, ByGroups(NameLabel, Punctuation), Push("offset-mode")}, + {`^[0-9A-Ha-h]+`, NameLabel, nil}, + }, + "offset-mode": { + {`\s`, Text, Pop(1)}, + {`[0-9A-Ha-h]+`, NameLabel, nil}, + {`:`, Punctuation, nil}, + }, + "piped-strings": { + {`\n`, Text, nil}, + Include("offset"), + {`[0-9A-Ha-h]{2}`, LiteralNumberHex, nil}, + {`(\s{2,3})(\|)(.{1,16})(\|)$`, ByGroups(Text, Punctuation, LiteralString, Punctuation), nil}, + {`\s`, Text, nil}, + {`^\*`, Punctuation, nil}, + }, + "bracket-strings": { + {`\n`, Text, nil}, + Include("offset"), + {`[0-9A-Ha-h]{2}`, LiteralNumberHex, nil}, + {`(\s{2,3})(\>)(.{1,16})(\<)$`, ByGroups(Text, Punctuation, LiteralString, Punctuation), nil}, + {`\s`, Text, nil}, + {`^\*`, Punctuation, nil}, + }, + "nonpiped-strings": { + {`\n`, Text, nil}, + Include("offset"), + {`([0-9A-Ha-h]{2})(\-)([0-9A-Ha-h]{2})`, ByGroups(LiteralNumberHex, Punctuation, LiteralNumberHex), nil}, + {`[0-9A-Ha-h]{2}`, LiteralNumberHex, nil}, + {`(\s{19,})(.{1,20}?)$`, ByGroups(Text, LiteralString), nil}, + {`(\s{2,3})(.{1,20})$`, ByGroups(Text, LiteralString), nil}, + {`\s`, Text, nil}, + {`^\*`, Punctuation, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/hlb.go b/vendor/github.com/alecthomas/chroma/lexers/h/hlb.go new file mode 100644 index 0000000..6c5f637 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/h/hlb.go @@ -0,0 +1,58 @@ +package h + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// HLB lexer. +var HLB = internal.Register(MustNewLazyLexer( + &Config{ + Name: "HLB", + Aliases: []string{"hlb"}, + Filenames: []string{"*.hlb"}, + MimeTypes: []string{}, + }, + hlbRules, +)) + +func hlbRules() Rules { + return Rules{ + "root": { + {`(#.*)`, ByGroups(CommentSingle), nil}, + {`((\b(0(b|B|o|O|x|X)[a-fA-F0-9]+)\b)|(\b(0|[1-9][0-9]*)\b))`, ByGroups(LiteralNumber), nil}, + {`((\b(true|false)\b))`, ByGroups(NameBuiltin), nil}, + {`(\bstring\b|\bint\b|\bbool\b|\bfs\b|\boption\b)`, ByGroups(KeywordType), nil}, + {`(\b[a-zA-Z_][a-zA-Z0-9]*\b)(\()`, ByGroups(NameFunction, Punctuation), Push("params")}, + {`(\{)`, ByGroups(Punctuation), Push("block")}, + {`(\n|\r|\r\n)`, Text, nil}, + {`.`, Text, nil}, + }, + "string": { + {`"`, LiteralString, Pop(1)}, + {`\\"`, LiteralString, nil}, + {`[^\\"]+`, LiteralString, nil}, + }, + "block": { + {`(\})`, ByGroups(Punctuation), Pop(1)}, + {`(#.*)`, ByGroups(CommentSingle), nil}, + {`((\b(0(b|B|o|O|x|X)[a-fA-F0-9]+)\b)|(\b(0|[1-9][0-9]*)\b))`, ByGroups(LiteralNumber), nil}, + {`((\b(true|false)\b))`, ByGroups(KeywordConstant), nil}, + {`"`, LiteralString, Push("string")}, + {`(with)`, ByGroups(KeywordReserved), nil}, + {`(as)([\t ]+)(\b[a-zA-Z_][a-zA-Z0-9]*\b)`, ByGroups(KeywordReserved, Text, NameFunction), nil}, + {`(\bstring\b|\bint\b|\bbool\b|\bfs\b|\boption\b)([\t ]+)(\{)`, ByGroups(KeywordType, Text, Punctuation), Push("block")}, + {`(?!\b(?:scratch|image|resolve|http|checksum|chmod|filename|git|keepGitDir|local|includePatterns|excludePatterns|followPaths|generate|frontendInput|shell|run|readonlyRootfs|env|dir|user|network|security|host|ssh|secret|mount|target|localPath|uid|gid|mode|readonly|tmpfs|sourcePath|cache|mkdir|createParents|chown|createdTime|mkfile|rm|allowNotFound|allowWildcards|copy|followSymlinks|contentsOnly|unpack|createDestPath)\b)(\b[a-zA-Z_][a-zA-Z0-9]*\b)`, ByGroups(NameOther), nil}, + {`(\n|\r|\r\n)`, Text, nil}, + {`.`, Text, nil}, + }, + "params": { + {`(\))`, ByGroups(Punctuation), Pop(1)}, + {`(variadic)`, ByGroups(Keyword), nil}, + {`(\bstring\b|\bint\b|\bbool\b|\bfs\b|\boption\b)`, ByGroups(KeywordType), nil}, + {`(\b[a-zA-Z_][a-zA-Z0-9]*\b)`, ByGroups(NameOther), nil}, + {`(\n|\r|\r\n)`, Text, nil}, + {`.`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/html.go b/vendor/github.com/alecthomas/chroma/lexers/h/html.go new file mode 100644 index 0000000..b9ca1e1 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/h/html.go @@ -0,0 +1,63 @@ +package h + +import ( + . "github.com/alecthomas/chroma" // nolint + . "github.com/alecthomas/chroma/lexers/c" // nolint + "github.com/alecthomas/chroma/lexers/internal" + . "github.com/alecthomas/chroma/lexers/j" // nolint +) + +// HTML lexer. +var HTML = internal.Register(MustNewLazyLexer( + &Config{ + Name: "HTML", + Aliases: []string{"html"}, + Filenames: []string{"*.html", "*.htm", "*.xhtml", "*.xslt"}, + MimeTypes: []string{"text/html", "application/xhtml+xml"}, + NotMultiline: true, + DotAll: true, + CaseInsensitive: true, + }, + htmlRules, +)) + +func htmlRules() Rules { + return Rules{ + "root": { + {`[^<&]+`, Text, nil}, + {`&\S*?;`, NameEntity, nil}, + {`\<\!\[CDATA\[.*?\]\]\>`, CommentPreproc, nil}, + {``, Comment, Pop(1)}, + {`-`, Comment, nil}, + }, + "tag": { + {`\s+`, Text, nil}, + {`([\w:-]+\s*)(=)(\s*)`, ByGroups(NameAttribute, Operator, Text), Push("attr")}, + {`[\w:-]+`, NameAttribute, nil}, + {`(/?)(\s*)(>)`, ByGroups(Punctuation, Text, Punctuation), Pop(1)}, + }, + "script-content": { + {`(<)(\s*)(/)(\s*)(script)(\s*)(>)`, ByGroups(Punctuation, Text, Punctuation, Text, NameTag, Text, Punctuation), Pop(1)}, + {`.+?(?=<\s*/\s*script\s*>)`, Using(Javascript), nil}, + }, + "style-content": { + {`(<)(\s*)(/)(\s*)(style)(\s*)(>)`, ByGroups(Punctuation, Text, Punctuation, Text, NameTag, Text, Punctuation), Pop(1)}, + {`.+?(?=<\s*/\s*style\s*>)`, Using(CSS), nil}, + }, + "attr": { + {`".*?"`, LiteralString, Pop(1)}, + {`'.*?'`, LiteralString, Pop(1)}, + {`[^\s>]+`, LiteralString, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/http.go b/vendor/github.com/alecthomas/chroma/lexers/h/http.go new file mode 100644 index 0000000..c515ed4 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/h/http.go @@ -0,0 +1,132 @@ +package h + +import ( + "strings" + + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// HTTP lexer. +var HTTP = internal.Register(httpBodyContentTypeLexer(MustNewLazyLexer( + &Config{ + Name: "HTTP", + Aliases: []string{"http"}, + Filenames: []string{}, + MimeTypes: []string{}, + NotMultiline: true, + DotAll: true, + }, + httpRules, +))) + +func httpRules() Rules { + return Rules{ + "root": { + {`(GET|POST|PUT|DELETE|HEAD|OPTIONS|TRACE|PATCH|CONNECT)( +)([^ ]+)( +)(HTTP)(/)([12]\.[01])(\r?\n|\Z)`, ByGroups(NameFunction, Text, NameNamespace, Text, KeywordReserved, Operator, LiteralNumber, Text), Push("headers")}, + {`(HTTP)(/)([12]\.[01])( +)(\d{3})( +)([^\r\n]+)(\r?\n|\Z)`, ByGroups(KeywordReserved, Operator, LiteralNumber, Text, LiteralNumber, Text, NameException, Text), Push("headers")}, + }, + "headers": { + {`([^\s:]+)( *)(:)( *)([^\r\n]+)(\r?\n|\Z)`, EmitterFunc(httpHeaderBlock), nil}, + {`([\t ]+)([^\r\n]+)(\r?\n|\Z)`, EmitterFunc(httpContinuousHeaderBlock), nil}, + {`\r?\n`, Text, Push("content")}, + }, + "content": { + {`.+`, EmitterFunc(httpContentBlock), nil}, + }, + } +} + +func httpContentBlock(groups []string, state *LexerState) Iterator { + tokens := []Token{ + {Generic, groups[0]}, + } + return Literator(tokens...) +} + +func httpHeaderBlock(groups []string, state *LexerState) Iterator { + tokens := []Token{ + {Name, groups[1]}, + {Text, groups[2]}, + {Operator, groups[3]}, + {Text, groups[4]}, + {Literal, groups[5]}, + {Text, groups[6]}, + } + return Literator(tokens...) +} + +func httpContinuousHeaderBlock(groups []string, state *LexerState) Iterator { + tokens := []Token{ + {Text, groups[1]}, + {Literal, groups[2]}, + {Text, groups[3]}, + } + return Literator(tokens...) +} + +func httpBodyContentTypeLexer(lexer Lexer) Lexer { return &httpBodyContentTyper{lexer} } + +type httpBodyContentTyper struct{ Lexer } + +func (d *httpBodyContentTyper) Tokenise(options *TokeniseOptions, text string) (Iterator, error) { // nolint: gocognit + var contentType string + var isContentType bool + var subIterator Iterator + + it, err := d.Lexer.Tokenise(options, text) + if err != nil { + return nil, err + } + + return func() Token { + token := it() + + if token == EOF { + if subIterator != nil { + return subIterator() + } + return EOF + } + + switch { + case token.Type == Name && strings.ToLower(token.Value) == "content-type": + { + isContentType = true + } + case token.Type == Literal && isContentType: + { + isContentType = false + contentType = strings.TrimSpace(token.Value) + pos := strings.Index(contentType, ";") + if pos > 0 { + contentType = strings.TrimSpace(contentType[:pos]) + } + } + case token.Type == Generic && contentType != "": + { + lexer := internal.MatchMimeType(contentType) + + // application/calendar+xml can be treated as application/xml + // if there's not a better match. + if lexer == nil && strings.Contains(contentType, "+") { + slashPos := strings.Index(contentType, "/") + plusPos := strings.LastIndex(contentType, "+") + contentType = contentType[:slashPos+1] + contentType[plusPos+1:] + lexer = internal.MatchMimeType(contentType) + } + + if lexer == nil { + token.Type = Text + } else { + subIterator, err = lexer.Tokenise(nil, token.Value) + if err != nil { + panic(err) + } + return EOF + } + } + } + return token + }, nil +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/hy.go b/vendor/github.com/alecthomas/chroma/lexers/h/hy.go new file mode 100644 index 0000000..7a07897 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/h/hy.go @@ -0,0 +1,55 @@ +package h + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Hy lexer. +var Hy = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Hy", + Aliases: []string{"hylang"}, + Filenames: []string{"*.hy"}, + MimeTypes: []string{"text/x-hy", "application/x-hy"}, + }, + hyRules, +)) + +func hyRules() Rules { + return Rules{ + "root": { + {`;.*$`, CommentSingle, nil}, + {`[,\s]+`, Text, nil}, + {`-?\d+\.\d+`, LiteralNumberFloat, nil}, + {`-?\d+`, LiteralNumberInteger, nil}, + {`0[0-7]+j?`, LiteralNumberOct, nil}, + {`0[xX][a-fA-F0-9]+`, LiteralNumberHex, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`'(?!#)[\w!$%*+<=>?/.#-]+`, LiteralStringSymbol, nil}, + {`\\(.|[a-z]+)`, LiteralStringChar, nil}, + {`^(\s*)([rRuU]{,2}"""(?:.|\n)*?""")`, ByGroups(Text, LiteralStringDoc), nil}, + {`^(\s*)([rRuU]{,2}'''(?:.|\n)*?''')`, ByGroups(Text, LiteralStringDoc), nil}, + {`::?(?!#)[\w!$%*+<=>?/.#-]+`, LiteralStringSymbol, nil}, + {"~@|[`\\'#^~&@]", Operator, nil}, + Include("py-keywords"), + Include("py-builtins"), + {Words(``, ` `, `cond`, `for`, `->`, `->>`, `car`, `cdr`, `first`, `rest`, `let`, `when`, `unless`, `import`, `do`, `progn`, `get`, `slice`, `assoc`, `with-decorator`, `,`, `list_comp`, `kwapply`, `~`, `is`, `in`, `is-not`, `not-in`, `quasiquote`, `unquote`, `unquote-splice`, `quote`, `|`, `<<=`, `>>=`, `foreach`, `while`, `eval-and-compile`, `eval-when-compile`), Keyword, nil}, + {Words(``, ` `, `def`, `defn`, `defun`, `defmacro`, `defclass`, `lambda`, `fn`, `setv`), KeywordDeclaration, nil}, + {Words(``, ` `, `cycle`, `dec`, `distinct`, `drop`, `even?`, `filter`, `inc`, `instance?`, `iterable?`, `iterate`, `iterator?`, `neg?`, `none?`, `nth`, `numeric?`, `odd?`, `pos?`, `remove`, `repeat`, `repeatedly`, `take`, `take_nth`, `take_while`, `zero?`), NameBuiltin, nil}, + {`(?<=\()(?!#)[\w!$%*+<=>?/.#-]+`, NameFunction, nil}, + {`(?!#)[\w!$%*+<=>?/.#-]+`, NameVariable, nil}, + {`(\[|\])`, Punctuation, nil}, + {`(\{|\})`, Punctuation, nil}, + {`(\(|\))`, Punctuation, nil}, + }, + "py-keywords": { + {Words(``, `\b`, `assert`, `break`, `continue`, `del`, `elif`, `else`, `except`, `exec`, `finally`, `for`, `global`, `if`, `lambda`, `pass`, `print`, `raise`, `return`, `try`, `while`, `yield`, `yield from`, `as`, `with`), Keyword, nil}, + }, + "py-builtins": { + {Words(`(??@^|_~:\\]).*?)$`, ByGroups(Text, CommentSingle), nil}, + {`(\s*)(\|{3}.*?)$`, ByGroups(Text, CommentSingle), nil}, + {`(\s*)(\{-)`, ByGroups(Text, CommentMultiline), Push("comment")}, + {`^(\s*)([^\s(){}]+)(\s*)(:)(\s*)`, ByGroups(Text, NameFunction, Text, OperatorWord, Text), nil}, + {`\b(case|class|data|default|using|do|else|if|in|infix[lr]?|instance|rewrite|auto|namespace|codata|mutual|private|public|abstract|total|partial|let|proof|of|then|static|where|_|with|pattern|term|syntax|prefix|postulate|parameters|record|dsl|impossible|implicit|tactics|intros|intro|compute|refine|exact|trivial)(?!\')\b`, KeywordReserved, nil}, + {`(import|module)(\s+)`, ByGroups(KeywordReserved, Text), Push("module")}, + {`('')?[A-Z][\w\']*`, KeywordType, nil}, + {`[a-z][\w\']*`, Text, nil}, + {`(<-|::|->|=>|=)`, OperatorWord, nil}, + {`([(){}\[\]:!#$%&*+.\\/<=>?@^|~-]+)`, OperatorWord, nil}, + {`\d+[eE][+-]?\d+`, LiteralNumberFloat, nil}, + {`\d+\.\d+([eE][+-]?\d+)?`, LiteralNumberFloat, nil}, + {`0[xX][\da-fA-F]+`, LiteralNumberHex, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`'`, LiteralStringChar, Push("character")}, + {`"`, LiteralString, Push("string")}, + {`[^\s(){}]+`, Text, nil}, + {`\s+?`, Text, nil}, + }, + "module": { + {`\s+`, Text, nil}, + {`([A-Z][\w.]*)(\s+)(\()`, ByGroups(NameNamespace, Text, Punctuation), Push("funclist")}, + {`[A-Z][\w.]*`, NameNamespace, Pop(1)}, + }, + "funclist": { + {`\s+`, Text, nil}, + {`[A-Z]\w*`, KeywordType, nil}, + {`(_[\w\']+|[a-z][\w\']*)`, NameFunction, nil}, + {`--.*$`, CommentSingle, nil}, + {`\{-`, CommentMultiline, Push("comment")}, + {`,`, Punctuation, nil}, + {`[:!#$%&*+.\\/<=>?@^|~-]+`, Operator, nil}, + {`\(`, Punctuation, Push("funclist", "funclist")}, + {`\)`, Punctuation, Pop(2)}, + }, + "comment": { + {`[^-{}]+`, CommentMultiline, nil}, + {`\{-`, CommentMultiline, Push()}, + {`-\}`, CommentMultiline, Pop(1)}, + {`[-{}]`, CommentMultiline, nil}, + }, + "character": { + {`[^\\']`, LiteralStringChar, nil}, + {`\\`, LiteralStringEscape, Push("escape")}, + {`'`, LiteralStringChar, Pop(1)}, + }, + "string": { + {`[^\\"]+`, LiteralString, nil}, + {`\\`, LiteralStringEscape, Push("escape")}, + {`"`, LiteralString, Pop(1)}, + }, + "escape": { + {`[abfnrtv"\'&\\]`, LiteralStringEscape, Pop(1)}, + {`\^[][A-Z@^_]`, LiteralStringEscape, Pop(1)}, + {`NUL|SOH|[SE]TX|EOT|ENQ|ACK|BEL|BS|HT|LF|VT|FF|CR|S[OI]|DLE|DC[1-4]|NAK|SYN|ETB|CAN|EM|SUB|ESC|[FGRU]S|SP|DEL`, LiteralStringEscape, Pop(1)}, + {`o[0-7]+`, LiteralStringEscape, Pop(1)}, + {`x[\da-fA-F]+`, LiteralStringEscape, Pop(1)}, + {`\d+`, LiteralStringEscape, Pop(1)}, + {`\s+\\`, LiteralStringEscape, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/i/igor.go b/vendor/github.com/alecthomas/chroma/lexers/i/igor.go new file mode 100644 index 0000000..bbb1d72 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/i/igor.go @@ -0,0 +1,36 @@ +package i + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Igor lexer. +var Igor = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Igor", + Aliases: []string{"igor", "igorpro"}, + Filenames: []string{"*.ipf"}, + MimeTypes: []string{"text/ipf"}, + CaseInsensitive: true, + }, + igorRules, +)) + +func igorRules() Rules { + return Rules{ + "root": { + {`//.*$`, CommentSingle, nil}, + {`"([^"\\]|\\.)*"`, LiteralString, nil}, + {Words(`\b`, `\b`, `if`, `else`, `elseif`, `endif`, `for`, `endfor`, `strswitch`, `switch`, `case`, `default`, `endswitch`, `do`, `while`, `try`, `catch`, `endtry`, `break`, `continue`, `return`, `AbortOnRTE`, `AbortOnValue`), Keyword, nil}, + {Words(`\b`, `\b`, `variable`, `string`, `constant`, `strconstant`, `NVAR`, `SVAR`, `WAVE`, `STRUCT`, `dfref`, `funcref`, `char`, `uchar`, `int16`, `uint16`, `int32`, `uint32`, `int64`, `uint64`, `float`, `double`), KeywordType, nil}, + {Words(`\b`, `\b`, `override`, `ThreadSafe`, `MultiThread`, `static`, `Proc`, `Picture`, `Prompt`, `DoPrompt`, `macro`, `window`, `function`, `end`, `Structure`, `EndStructure`, `EndMacro`, `Menu`, `SubMenu`), KeywordReserved, nil}, + {Words(`\b`, `\b`, `Abort`, `AddFIFOData`, `AddFIFOVectData`, `AddMovieAudio`, `AddMovieFrame`, `AddWavesToBoxPlot`, `AddWavesToViolinPlot`, `AdoptFiles`, `APMath`, `Append`, `AppendBoxPlot`, `AppendImage`, `AppendLayoutObject`, `AppendMatrixContour`, `AppendText`, `AppendToGizmo`, `AppendToGraph`, `AppendToLayout`, `AppendToTable`, `AppendViolinPlot`, `AppendXYZContour`, `AutoPositionWindow`, `AxonTelegraphFindServers`, `BackgroundInfo`, `Beep`, `BoundingBall`, `BoxSmooth`, `BrowseURL`, `BuildMenu`, `Button`, `cd`, `Chart`, `CheckBox`, `CheckDisplayed`, `ChooseColor`, `Close`, `CloseHelp`, `CloseMovie`, `CloseProc`, `ColorScale`, `ColorTab2Wave`, `Concatenate`, `ControlBar`, `ControlInfo`, `ControlUpdate`, `ConvertGlobalStringTextEncoding`, `ConvexHull`, `Convolve`, `CopyDimLabels`, `CopyFile`, `CopyFolder`, `CopyScales`, `Correlate`, `CreateAliasShortcut`, `CreateBrowser`, `Cross`, `CtrlBackground`, `CtrlFIFO`, `CtrlNamedBackground`, `Cursor`, `CurveFit`, `CustomControl`, `CWT`, `DAQmx_AI_SetupReader`, `DAQmx_AO_SetOutputs`, `DAQmx_CTR_CountEdges`, `DAQmx_CTR_OutputPulse`, `DAQmx_CTR_Period`, `DAQmx_CTR_PulseWidth`, `DAQmx_DIO_Config`, `DAQmx_DIO_WriteNewData`, `DAQmx_Scan`, `DAQmx_WaveformGen`, `Debugger`, `DebuggerOptions`, `DefaultFont`, `DefaultGuiControls`, `DefaultGuiFont`, `DefaultTextEncoding`, `DefineGuide`, `DelayUpdate`, `DeleteAnnotations`, `DeleteFile`, `DeleteFolder`, `DeletePoints`, `Differentiate`, `dir`, `Display`, `DisplayHelpTopic`, `DisplayProcedure`, `DoAlert`, `DoIgorMenu`, `DoUpdate`, `DoWindow`, `DoXOPIdle`, `DPSS`, `DrawAction`, `DrawArc`, `DrawBezier`, `DrawLine`, `DrawOval`, `DrawPICT`, `DrawPoly`, `DrawRect`, `DrawRRect`, `DrawText`, `DrawUserShape`, `DSPDetrend`, `DSPPeriodogram`, `Duplicate`, `DuplicateDataFolder`, `DWT`, `EdgeStats`, `Edit`, `ErrorBars`, `EstimatePeakSizes`, `Execute`, `ExecuteScriptText`, `ExperimentInfo`, `ExperimentModified`, `ExportGizmo`, `Extract`, `FastGaussTransform`, `FastOp`, `FBinRead`, `FBinWrite`, `FFT`, `FGetPos`, `FIFOStatus`, `FIFO2Wave`, `FilterFIR`, `FilterIIR`, `FindAPeak`, `FindContour`, `FindDuplicates`, `FindLevel`, `FindLevels`, `FindPeak`, `FindPointsInPoly`, `FindRoots`, `FindSequence`, `FindValue`, `FMaxFlat`, `FPClustering`, `fprintf`, `FReadLine`, `FSetPos`, `FStatus`, `FTPCreateDirectory`, `FTPDelete`, `FTPDownload`, `FTPUpload`, `FuncFit`, `FuncFitMD`, `GBLoadWave`, `GetAxis`, `GetCamera`, `GetFileFolderInfo`, `GetGizmo`, `GetLastUserMenuInfo`, `GetMarquee`, `GetMouse`, `GetSelection`, `GetWindow`, `GISCreateVectorLayer`, `GISGetRasterInfo`, `GISGetRegisteredFileInfo`, `GISGetVectorLayerInfo`, `GISLoadRasterData`, `GISLoadVectorData`, `GISRasterizeVectorData`, `GISRegisterFile`, `GISTransformCoords`, `GISUnRegisterFile`, `GISWriteFieldData`, `GISWriteGeometryData`, `GISWriteRaster`, `GPIBReadBinaryWave2`, `GPIBReadBinary2`, `GPIBReadWave2`, `GPIBRead2`, `GPIBWriteBinaryWave2`, `GPIBWriteBinary2`, `GPIBWriteWave2`, `GPIBWrite2`, `GPIB2`, `GraphNormal`, `GraphWaveDraw`, `GraphWaveEdit`, `Grep`, `GroupBox`, `Hanning`, `HDFInfo`, `HDFReadImage`, `HDFReadSDS`, `HDFReadVset`, `HDF5CloseFile`, `HDF5CloseGroup`, `HDF5ConvertColors`, `HDF5CreateFile`, `HDF5CreateGroup`, `HDF5CreateLink`, `HDF5Dump`, `HDF5DumpErrors`, `HDF5DumpState`, `HDF5FlushFile`, `HDF5ListAttributes`, `HDF5ListGroup`, `HDF5LoadData`, `HDF5LoadGroup`, `HDF5LoadImage`, `HDF5OpenFile`, `HDF5OpenGroup`, `HDF5SaveData`, `HDF5SaveGroup`, `HDF5SaveImage`, `HDF5TestOperation`, `HDF5UnlinkObject`, `HideIgorMenus`, `HideInfo`, `HideProcedures`, `HideTools`, `HilbertTransform`, `Histogram`, `ICA`, `IFFT`, `ImageAnalyzeParticles`, `ImageBlend`, `ImageBoundaryToMask`, `ImageComposite`, `ImageEdgeDetection`, `ImageFileInfo`, `ImageFilter`, `ImageFocus`, `ImageFromXYZ`, `ImageGenerateROIMask`, `ImageGLCM`, `ImageHistModification`, `ImageHistogram`, `ImageInterpolate`, `ImageLineProfile`, `ImageLoad`, `ImageMorphology`, `ImageRegistration`, `ImageRemoveBackground`, `ImageRestore`, `ImageRotate`, `ImageSave`, `ImageSeedFill`, `ImageSkeleton3d`, `ImageSnake`, `ImageStats`, `ImageThreshold`, `ImageTransform`, `ImageUnwrapPhase`, `ImageWindow`, `IndexSort`, `InsertPoints`, `Integrate`, `IntegrateODE`, `Integrate2D`, `Interpolate2`, `Interpolate3D`, `Interp3DPath`, `ITCCloseAll2`, `ITCCloseDevice2`, `ITCConfigAllChannels2`, `ITCConfigChannelReset2`, `ITCConfigChannelUpload2`, `ITCConfigChannel2`, `ITCFIFOAvailableAll2`, `ITCFIFOAvailable2`, `ITCGetAllChannelsConfig2`, `ITCGetChannelConfig2`, `ITCGetCurrentDevice2`, `ITCGetDeviceInfo2`, `ITCGetDevices2`, `ITCGetErrorString2`, `ITCGetSerialNumber2`, `ITCGetState2`, `ITCGetVersions2`, `ITCInitialize2`, `ITCOpenDevice2`, `ITCReadADC2`, `ITCReadDigital2`, `ITCReadTimer2`, `ITCSelectDevice2`, `ITCSetDAC2`, `ITCSetGlobals2`, `ITCSetModes2`, `ITCSetState2`, `ITCStartAcq2`, `ITCStopAcq2`, `ITCUpdateFIFOPositionAll2`, `ITCUpdateFIFOPosition2`, `ITCWriteDigital2`, `JCAMPLoadWave`, `JointHistogram`, `KillBackground`, `KillControl`, `KillDataFolder`, `KillFIFO`, `KillFreeAxis`, `KillPath`, `KillPICTs`, `KillStrings`, `KillVariables`, `KillWaves`, `KillWindow`, `KMeans`, `Label`, `Layout`, `LayoutPageAction`, `LayoutSlideShow`, `Legend`, `LinearFeedbackShiftRegister`, `ListBox`, `LoadData`, `LoadPackagePreferences`, `LoadPICT`, `LoadWave`, `Loess`, `LombPeriodogram`, `Make`, `MakeIndex`, `MarkPerfTestTime`, `MatrixConvolve`, `MatrixCorr`, `MatrixEigenV`, `MatrixFilter`, `MatrixGaussJ`, `MatrixGLM`, `MatrixInverse`, `MatrixLinearSolve`, `MatrixLinearSolveTD`, `MatrixLLS`, `MatrixLUBkSub`, `MatrixLUD`, `MatrixLUDTD`, `MatrixMultiply`, `MatrixOP`, `MatrixSchur`, `MatrixSolve`, `MatrixSVBkSub`, `MatrixSVD`, `MatrixTranspose`, `MCC_FindServers`, `MeasureStyledText`, `MFR_CheckForNewBricklets`, `MFR_CloseResultFile`, `MFR_CreateOverviewTable`, `MFR_GetBrickletCount`, `MFR_GetBrickletData`, `MFR_GetBrickletDeployData`, `MFR_GetBrickletMetaData`, `MFR_GetBrickletRawData`, `MFR_GetReportTemplate`, `MFR_GetResultFileMetaData`, `MFR_GetResultFileName`, `MFR_GetVernissageVersion`, `MFR_GetVersion`, `MFR_GetXOPErrorMessage`, `MFR_OpenResultFile`, `MLLoadWave`, `Modify`, `ModifyBoxPlot`, `ModifyBrowser`, `ModifyCamera`, `ModifyContour`, `ModifyControl`, `ModifyControlList`, `ModifyFreeAxis`, `ModifyGizmo`, `ModifyGraph`, `ModifyImage`, `ModifyLayout`, `ModifyPanel`, `ModifyTable`, `ModifyViolinPlot`, `ModifyWaterfall`, `MoveDataFolder`, `MoveFile`, `MoveFolder`, `MoveString`, `MoveSubwindow`, `MoveVariable`, `MoveWave`, `MoveWindow`, `MultiTaperPSD`, `MultiThreadingControl`, `NC_CloseFile`, `NC_DumpErrors`, `NC_Inquire`, `NC_ListAttributes`, `NC_ListObjects`, `NC_LoadData`, `NC_OpenFile`, `NeuralNetworkRun`, `NeuralNetworkTrain`, `NewCamera`, `NewDataFolder`, `NewFIFO`, `NewFIFOChan`, `NewFreeAxis`, `NewGizmo`, `NewImage`, `NewLayout`, `NewMovie`, `NewNotebook`, `NewPanel`, `NewPath`, `NewWaterfall`, `NILoadWave`, `NI4882`, `Note`, `Notebook`, `NotebookAction`, `Open`, `OpenHelp`, `OpenNotebook`, `Optimize`, `ParseOperationTemplate`, `PathInfo`, `PauseForUser`, `PauseUpdate`, `PCA`, `PlayMovie`, `PlayMovieAction`, `PlaySound`, `PopupContextualMenu`, `PopupMenu`, `Preferences`, `PrimeFactors`, `Print`, `printf`, `PrintGraphs`, `PrintLayout`, `PrintNotebook`, `PrintSettings`, `PrintTable`, `Project`, `PulseStats`, `PutScrapText`, `pwd`, `Quit`, `RatioFromNumber`, `Redimension`, `Remez`, `Remove`, `RemoveContour`, `RemoveFromGizmo`, `RemoveFromGraph`, `RemoveFromLayout`, `RemoveFromTable`, `RemoveImage`, `RemoveLayoutObjects`, `RemovePath`, `Rename`, `RenameDataFolder`, `RenamePath`, `RenamePICT`, `RenameWindow`, `ReorderImages`, `ReorderTraces`, `ReplaceText`, `ReplaceWave`, `Resample`, `ResumeUpdate`, `Reverse`, `Rotate`, `Save`, `SaveData`, `SaveExperiment`, `SaveGizmoCopy`, `SaveGraphCopy`, `SaveNotebook`, `SavePackagePreferences`, `SavePICT`, `SaveTableCopy`, `SetActiveSubwindow`, `SetAxis`, `SetBackground`, `SetDashPattern`, `SetDataFolder`, `SetDimLabel`, `SetDrawEnv`, `SetDrawLayer`, `SetFileFolderInfo`, `SetFormula`, `SetIdlePeriod`, `SetIgorHook`, `SetIgorMenuMode`, `SetIgorOption`, `SetMarquee`, `SetProcessSleep`, `SetRandomSeed`, `SetScale`, `SetVariable`, `SetWaveLock`, `SetWaveTextEncoding`, `SetWindow`, `ShowIgorMenus`, `ShowInfo`, `ShowTools`, `Silent`, `Sleep`, `Slider`, `Smooth`, `SmoothCustom`, `Sort`, `SortColumns`, `SoundInRecord`, `SoundInSet`, `SoundInStartChart`, `SoundInStatus`, `SoundInStopChart`, `SoundLoadWave`, `SoundSaveWave`, `SphericalInterpolate`, `SphericalTriangulate`, `SplitString`, `SplitWave`, `sprintf`, `SQLHighLevelOp`, `sscanf`, `Stack`, `StackWindows`, `StatsAngularDistanceTest`, `StatsANOVA1Test`, `StatsANOVA2NRTest`, `StatsANOVA2RMTest`, `StatsANOVA2Test`, `StatsChiTest`, `StatsCircularCorrelationTest`, `StatsCircularMeans`, `StatsCircularMoments`, `StatsCircularTwoSampleTest`, `StatsCochranTest`, `StatsContingencyTable`, `StatsDIPTest`, `StatsDunnettTest`, `StatsFriedmanTest`, `StatsFTest`, `StatsHodgesAjneTest`, `StatsJBTest`, `StatsKDE`, `StatsKendallTauTest`, `StatsKSTest`, `StatsKWTest`, `StatsLinearCorrelationTest`, `StatsLinearRegression`, `StatsMultiCorrelationTest`, `StatsNPMCTest`, `StatsNPNominalSRTest`, `StatsQuantiles`, `StatsRankCorrelationTest`, `StatsResample`, `StatsSample`, `StatsScheffeTest`, `StatsShapiroWilkTest`, `StatsSignTest`, `StatsSRTest`, `StatsTTest`, `StatsTukeyTest`, `StatsVariancesTest`, `StatsWatsonUSquaredTest`, `StatsWatsonWilliamsTest`, `StatsWheelerWatsonTest`, `StatsWilcoxonRankTest`, `StatsWRCorrelationTest`, `STFT`, `String`, `StructFill`, `StructGet`, `StructPut`, `SumDimension`, `SumSeries`, `TabControl`, `Tag`, `TDMLoadData`, `TDMSaveData`, `TextBox`, `ThreadGroupPutDF`, `ThreadStart`, `TickWavesFromAxis`, `Tile`, `TileWindows`, `TitleBox`, `ToCommandLine`, `ToolsGrid`, `Triangulate3d`, `Unwrap`, `URLRequest`, `ValDisplay`, `Variable`, `VDTClosePort2`, `VDTGetPortList2`, `VDTGetStatus2`, `VDTOpenPort2`, `VDTOperationsPort2`, `VDTReadBinaryWave2`, `VDTReadBinary2`, `VDTReadHexWave2`, `VDTReadHex2`, `VDTReadWave2`, `VDTRead2`, `VDTTerminalPort2`, `VDTWriteBinaryWave2`, `VDTWriteBinary2`, `VDTWriteHexWave2`, `VDTWriteHex2`, `VDTWriteWave2`, `VDTWrite2`, `VDT2`, `VISAControl`, `VISARead`, `VISAReadBinary`, `VISAReadBinaryWave`, `VISAReadWave`, `VISAWrite`, `VISAWriteBinary`, `VISAWriteBinaryWave`, `VISAWriteWave`, `WaveMeanStdv`, `WaveStats`, `WaveTransform`, `wfprintf`, `WignerTransform`, `WindowFunction`, `XLLoadWave`), NameClass, nil}, + {Words(`\b`, `\b`, `abs`, `acos`, `acosh`, `AddListItem`, `AiryA`, `AiryAD`, `AiryB`, `AiryBD`, `alog`, `AnnotationInfo`, `AnnotationList`, `area`, `areaXY`, `asin`, `asinh`, `atan`, `atanh`, `atan2`, `AxisInfo`, `AxisList`, `AxisValFromPixel`, `AxonTelegraphAGetDataNum`, `AxonTelegraphAGetDataString`, `AxonTelegraphAGetDataStruct`, `AxonTelegraphGetDataNum`, `AxonTelegraphGetDataString`, `AxonTelegraphGetDataStruct`, `AxonTelegraphGetTimeoutMs`, `AxonTelegraphSetTimeoutMs`, `Base64Decode`, `Base64Encode`, `Besseli`, `Besselj`, `Besselk`, `Bessely`, `beta`, `betai`, `BinarySearch`, `BinarySearchInterp`, `binomial`, `binomialln`, `binomialNoise`, `cabs`, `CaptureHistory`, `CaptureHistoryStart`, `ceil`, `cequal`, `char2num`, `chebyshev`, `chebyshevU`, `CheckName`, `ChildWindowList`, `CleanupName`, `cmplx`, `cmpstr`, `conj`, `ContourInfo`, `ContourNameList`, `ContourNameToWaveRef`, `ContourZ`, `ControlNameList`, `ConvertTextEncoding`, `cos`, `cosh`, `cosIntegral`, `cot`, `coth`, `CountObjects`, `CountObjectsDFR`, `cpowi`, `CreationDate`, `csc`, `csch`, `CsrInfo`, `CsrWave`, `CsrWaveRef`, `CsrXWave`, `CsrXWaveRef`, `CTabList`, `DataFolderDir`, `DataFolderExists`, `DataFolderRefsEqual`, `DataFolderRefStatus`, `date`, `datetime`, `DateToJulian`, `date2secs`, `Dawson`, `defined`, `deltax`, `digamma`, `dilogarithm`, `DimDelta`, `DimOffset`, `DimSize`, `ei`, `enoise`, `equalWaves`, `erf`, `erfc`, `erfcw`, `exists`, `exp`, `expInt`, `expIntegralE1`, `expNoise`, `factorial`, `Faddeeva`, `fakedata`, `faverage`, `faverageXY`, `fDAQmx_AI_GetReader`, `fDAQmx_AO_UpdateOutputs`, `fDAQmx_ConnectTerminals`, `fDAQmx_CTR_Finished`, `fDAQmx_CTR_IsFinished`, `fDAQmx_CTR_IsPulseFinished`, `fDAQmx_CTR_ReadCounter`, `fDAQmx_CTR_ReadWithOptions`, `fDAQmx_CTR_SetPulseFrequency`, `fDAQmx_CTR_Start`, `fDAQmx_DeviceNames`, `fDAQmx_DIO_Finished`, `fDAQmx_DIO_PortWidth`, `fDAQmx_DIO_Read`, `fDAQmx_DIO_Write`, `fDAQmx_DisconnectTerminals`, `fDAQmx_ErrorString`, `fDAQmx_ExternalCalDate`, `fDAQmx_NumAnalogInputs`, `fDAQmx_NumAnalogOutputs`, `fDAQmx_NumCounters`, `fDAQmx_NumDIOPorts`, `fDAQmx_ReadChan`, `fDAQmx_ReadNamedChan`, `fDAQmx_ResetDevice`, `fDAQmx_ScanGetAvailable`, `fDAQmx_ScanGetNextIndex`, `fDAQmx_ScanStart`, `fDAQmx_ScanStop`, `fDAQmx_ScanWait`, `fDAQmx_ScanWaitWithTimeout`, `fDAQmx_SelfCalDate`, `fDAQmx_SelfCalibration`, `fDAQmx_WaveformStart`, `fDAQmx_WaveformStop`, `fDAQmx_WF_IsFinished`, `fDAQmx_WF_WaitUntilFinished`, `fDAQmx_WriteChan`, `FetchURL`, `FindDimLabel`, `FindListItem`, `floor`, `FontList`, `FontSizeHeight`, `FontSizeStringWidth`, `FresnelCos`, `FresnelSin`, `FuncRefInfo`, `FunctionInfo`, `FunctionList`, `FunctionPath`, `gamma`, `gammaEuler`, `gammaInc`, `gammaNoise`, `gammln`, `gammp`, `gammq`, `Gauss`, `Gauss1D`, `Gauss2D`, `gcd`, `GetBrowserLine`, `GetBrowserSelection`, `GetDataFolder`, `GetDataFolderDFR`, `GetDefaultFont`, `GetDefaultFontSize`, `GetDefaultFontStyle`, `GetDimLabel`, `GetEnvironmentVariable`, `GetErrMessage`, `GetFormula`, `GetIndependentModuleName`, `GetIndexedObjName`, `GetIndexedObjNameDFR`, `GetKeyState`, `GetRTErrMessage`, `GetRTError`, `GetRTLocation`, `GetRTLocInfo`, `GetRTStackInfo`, `GetScrapText`, `GetUserData`, `GetWavesDataFolder`, `GetWavesDataFolderDFR`, `GISGetAllFileFormats`, `GISSRefsAreEqual`, `GizmoInfo`, `GizmoScale`, `gnoise`, `GrepList`, `GrepString`, `GuideInfo`, `GuideNameList`, `Hash`, `hcsr`, `HDF5AttributeInfo`, `HDF5DatasetInfo`, `HDF5LibraryInfo`, `HDF5TypeInfo`, `hermite`, `hermiteGauss`, `HyperGNoise`, `HyperGPFQ`, `HyperG0F1`, `HyperG1F1`, `HyperG2F1`, `IgorInfo`, `IgorVersion`, `imag`, `ImageInfo`, `ImageNameList`, `ImageNameToWaveRef`, `IndependentModuleList`, `IndexedDir`, `IndexedFile`, `IndexToScale`, `Inf`, `Integrate1D`, `interp`, `Interp2D`, `Interp3D`, `inverseERF`, `inverseERFC`, `ItemsInList`, `JacobiCn`, `JacobiSn`, `JulianToDate`, `Laguerre`, `LaguerreA`, `LaguerreGauss`, `LambertW`, `LayoutInfo`, `leftx`, `LegendreA`, `limit`, `ListMatch`, `ListToTextWave`, `ListToWaveRefWave`, `ln`, `log`, `logNormalNoise`, `lorentzianNoise`, `LowerStr`, `MacroList`, `magsqr`, `MandelbrotPoint`, `MarcumQ`, `MatrixCondition`, `MatrixDet`, `MatrixDot`, `MatrixRank`, `MatrixTrace`, `max`, `MCC_AutoBridgeBal`, `MCC_AutoFastComp`, `MCC_AutoPipetteOffset`, `MCC_AutoSlowComp`, `MCC_AutoWholeCellComp`, `MCC_GetBridgeBalEnable`, `MCC_GetBridgeBalResist`, `MCC_GetFastCompCap`, `MCC_GetFastCompTau`, `MCC_GetHolding`, `MCC_GetHoldingEnable`, `MCC_GetMode`, `MCC_GetNeutralizationCap`, `MCC_GetNeutralizationEnable`, `MCC_GetOscKillerEnable`, `MCC_GetPipetteOffset`, `MCC_GetPrimarySignalGain`, `MCC_GetPrimarySignalHPF`, `MCC_GetPrimarySignalLPF`, `MCC_GetRsCompBandwidth`, `MCC_GetRsCompCorrection`, `MCC_GetRsCompEnable`, `MCC_GetRsCompPrediction`, `MCC_GetSecondarySignalGain`, `MCC_GetSecondarySignalLPF`, `MCC_GetSlowCompCap`, `MCC_GetSlowCompTau`, `MCC_GetSlowCompTauX20Enable`, `MCC_GetSlowCurrentInjEnable`, `MCC_GetSlowCurrentInjLevel`, `MCC_GetSlowCurrentInjSetlTime`, `MCC_GetWholeCellCompCap`, `MCC_GetWholeCellCompEnable`, `MCC_GetWholeCellCompResist`, `MCC_SelectMultiClamp700B`, `MCC_SetBridgeBalEnable`, `MCC_SetBridgeBalResist`, `MCC_SetFastCompCap`, `MCC_SetFastCompTau`, `MCC_SetHolding`, `MCC_SetHoldingEnable`, `MCC_SetMode`, `MCC_SetNeutralizationCap`, `MCC_SetNeutralizationEnable`, `MCC_SetOscKillerEnable`, `MCC_SetPipetteOffset`, `MCC_SetPrimarySignalGain`, `MCC_SetPrimarySignalHPF`, `MCC_SetPrimarySignalLPF`, `MCC_SetRsCompBandwidth`, `MCC_SetRsCompCorrection`, `MCC_SetRsCompEnable`, `MCC_SetRsCompPrediction`, `MCC_SetSecondarySignalGain`, `MCC_SetSecondarySignalLPF`, `MCC_SetSlowCompCap`, `MCC_SetSlowCompTau`, `MCC_SetSlowCompTauX20Enable`, `MCC_SetSlowCurrentInjEnable`, `MCC_SetSlowCurrentInjLevel`, `MCC_SetSlowCurrentInjSetlTime`, `MCC_SetTimeoutMs`, `MCC_SetWholeCellCompCap`, `MCC_SetWholeCellCompEnable`, `MCC_SetWholeCellCompResist`, `mean`, `median`, `min`, `mod`, `ModDate`, `MPFXEMGPeak`, `MPFXExpConvExpPeak`, `MPFXGaussPeak`, `MPFXLorenzianPeak`, `MPFXVoigtPeak`, `NameOfWave`, `NaN`, `NewFreeDataFolder`, `NewFreeWave`, `norm`, `NormalizeUnicode`, `note`, `NumberByKey`, `numpnts`, `numtype`, `NumVarOrDefault`, `num2char`, `num2istr`, `num2str`, `NVAR_Exists`, `OperationList`, `PadString`, `PanelResolution`, `ParamIsDefault`, `ParseFilePath`, `PathList`, `pcsr`, `Pi`, `PICTInfo`, `PICTList`, `PixelFromAxisVal`, `pnt2x`, `poissonNoise`, `poly`, `PolygonArea`, `poly2D`, `PossiblyQuoteName`, `ProcedureText`, `p2rect`, `qcsr`, `real`, `RemoveByKey`, `RemoveEnding`, `RemoveFromList`, `RemoveListItem`, `ReplaceNumberByKey`, `ReplaceString`, `ReplaceStringByKey`, `rightx`, `round`, `r2polar`, `sawtooth`, `scaleToIndex`, `ScreenResolution`, `sec`, `sech`, `Secs2Date`, `Secs2Time`, `SelectNumber`, `SelectString`, `SetEnvironmentVariable`, `sign`, `sin`, `sinc`, `sinh`, `sinIntegral`, `SortList`, `SpecialCharacterInfo`, `SpecialCharacterList`, `SpecialDirPath`, `SphericalBessJ`, `SphericalBessJD`, `SphericalBessY`, `SphericalBessYD`, `SphericalHarmonics`, `SQLAllocHandle`, `SQLAllocStmt`, `SQLBinaryWavesToTextWave`, `SQLBindCol`, `SQLBindParameter`, `SQLBrowseConnect`, `SQLBulkOperations`, `SQLCancel`, `SQLCloseCursor`, `SQLColAttributeNum`, `SQLColAttributeStr`, `SQLColumnPrivileges`, `SQLColumns`, `SQLConnect`, `SQLDataSources`, `SQLDescribeCol`, `SQLDescribeParam`, `SQLDisconnect`, `SQLDriverConnect`, `SQLDrivers`, `SQLEndTran`, `SQLError`, `SQLExecDirect`, `SQLExecute`, `SQLFetch`, `SQLFetchScroll`, `SQLForeignKeys`, `SQLFreeConnect`, `SQLFreeEnv`, `SQLFreeHandle`, `SQLFreeStmt`, `SQLGetConnectAttrNum`, `SQLGetConnectAttrStr`, `SQLGetCursorName`, `SQLGetDataNum`, `SQLGetDataStr`, `SQLGetDescFieldNum`, `SQLGetDescFieldStr`, `SQLGetDescRec`, `SQLGetDiagFieldNum`, `SQLGetDiagFieldStr`, `SQLGetDiagRec`, `SQLGetEnvAttrNum`, `SQLGetEnvAttrStr`, `SQLGetFunctions`, `SQLGetInfoNum`, `SQLGetInfoStr`, `SQLGetStmtAttrNum`, `SQLGetStmtAttrStr`, `SQLGetTypeInfo`, `SQLMoreResults`, `SQLNativeSql`, `SQLNumParams`, `SQLNumResultCols`, `SQLNumResultRowsIfKnown`, `SQLNumRowsFetched`, `SQLParamData`, `SQLPrepare`, `SQLPrimaryKeys`, `SQLProcedureColumns`, `SQLProcedures`, `SQLPutData`, `SQLReinitialize`, `SQLRowCount`, `SQLSetConnectAttrNum`, `SQLSetConnectAttrStr`, `SQLSetCursorName`, `SQLSetDescFieldNum`, `SQLSetDescFieldStr`, `SQLSetDescRec`, `SQLSetEnvAttrNum`, `SQLSetEnvAttrStr`, `SQLSetPos`, `SQLSetStmtAttrNum`, `SQLSetStmtAttrStr`, `SQLSpecialColumns`, `SQLStatistics`, `SQLTablePrivileges`, `SQLTables`, `SQLTextWaveToBinaryWaves`, `SQLTextWaveTo2DBinaryWave`, `SQLUpdateBoundValues`, `SQLXOPCheckState`, `SQL2DBinaryWaveToTextWave`, `sqrt`, `StartMSTimer`, `StatsBetaCDF`, `StatsBetaPDF`, `StatsBinomialCDF`, `StatsBinomialPDF`, `StatsCauchyCDF`, `StatsCauchyPDF`, `StatsChiCDF`, `StatsChiPDF`, `StatsCMSSDCDF`, `StatsCorrelation`, `StatsDExpCDF`, `StatsDExpPDF`, `StatsErlangCDF`, `StatsErlangPDF`, `StatsErrorPDF`, `StatsEValueCDF`, `StatsEValuePDF`, `StatsExpCDF`, `StatsExpPDF`, `StatsFCDF`, `StatsFPDF`, `StatsFriedmanCDF`, `StatsGammaCDF`, `StatsGammaPDF`, `StatsGeometricCDF`, `StatsGeometricPDF`, `StatsGEVCDF`, `StatsGEVPDF`, `StatsHyperGCDF`, `StatsHyperGPDF`, `StatsInvBetaCDF`, `StatsInvBinomialCDF`, `StatsInvCauchyCDF`, `StatsInvChiCDF`, `StatsInvCMSSDCDF`, `StatsInvDExpCDF`, `StatsInvEValueCDF`, `StatsInvExpCDF`, `StatsInvFCDF`, `StatsInvFriedmanCDF`, `StatsInvGammaCDF`, `StatsInvGeometricCDF`, `StatsInvKuiperCDF`, `StatsInvLogisticCDF`, `StatsInvLogNormalCDF`, `StatsInvMaxwellCDF`, `StatsInvMooreCDF`, `StatsInvNBinomialCDF`, `StatsInvNCChiCDF`, `StatsInvNCFCDF`, `StatsInvNormalCDF`, `StatsInvParetoCDF`, `StatsInvPoissonCDF`, `StatsInvPowerCDF`, `StatsInvQCDF`, `StatsInvQpCDF`, `StatsInvRayleighCDF`, `StatsInvRectangularCDF`, `StatsInvSpearmanCDF`, `StatsInvStudentCDF`, `StatsInvTopDownCDF`, `StatsInvTriangularCDF`, `StatsInvUsquaredCDF`, `StatsInvVonMisesCDF`, `StatsInvWeibullCDF`, `StatsKuiperCDF`, `StatsLogisticCDF`, `StatsLogisticPDF`, `StatsLogNormalCDF`, `StatsLogNormalPDF`, `StatsMaxwellCDF`, `StatsMaxwellPDF`, `StatsMedian`, `StatsMooreCDF`, `StatsNBinomialCDF`, `StatsNBinomialPDF`, `StatsNCChiCDF`, `StatsNCChiPDF`, `StatsNCFCDF`, `StatsNCFPDF`, `StatsNCTCDF`, `StatsNCTPDF`, `StatsNormalCDF`, `StatsNormalPDF`, `StatsParetoCDF`, `StatsParetoPDF`, `StatsPermute`, `StatsPoissonCDF`, `StatsPoissonPDF`, `StatsPowerCDF`, `StatsPowerNoise`, `StatsPowerPDF`, `StatsQCDF`, `StatsQpCDF`, `StatsRayleighCDF`, `StatsRayleighPDF`, `StatsRectangularCDF`, `StatsRectangularPDF`, `StatsRunsCDF`, `StatsSpearmanRhoCDF`, `StatsStudentCDF`, `StatsStudentPDF`, `StatsTopDownCDF`, `StatsTriangularCDF`, `StatsTriangularPDF`, `StatsTrimmedMean`, `StatsUSquaredCDF`, `StatsVonMisesCDF`, `StatsVonMisesNoise`, `StatsVonMisesPDF`, `StatsWaldCDF`, `StatsWaldPDF`, `StatsWeibullCDF`, `StatsWeibullPDF`, `StopMSTimer`, `StringByKey`, `stringCRC`, `StringFromList`, `StringList`, `stringmatch`, `strlen`, `strsearch`, `StrVarOrDefault`, `str2num`, `StudentA`, `StudentT`, `sum`, `SVAR_Exists`, `TableInfo`, `TagVal`, `TagWaveRef`, `tan`, `tango_close_device`, `tango_command_inout`, `tango_compute_image_proj`, `tango_get_dev_attr_list`, `tango_get_dev_black_box`, `tango_get_dev_cmd_list`, `tango_get_dev_status`, `tango_get_dev_timeout`, `tango_get_error_stack`, `tango_open_device`, `tango_ping_device`, `tango_read_attribute`, `tango_read_attributes`, `tango_reload_dev_interface`, `tango_resume_attr_monitor`, `tango_set_attr_monitor_period`, `tango_set_dev_timeout`, `tango_start_attr_monitor`, `tango_stop_attr_monitor`, `tango_suspend_attr_monitor`, `tango_write_attribute`, `tango_write_attributes`, `tanh`, `TDMAddChannel`, `TDMAddGroup`, `TDMAppendDataValues`, `TDMAppendDataValuesTime`, `TDMChannelPropertyExists`, `TDMCloseChannel`, `TDMCloseFile`, `TDMCloseGroup`, `TDMCreateChannelProperty`, `TDMCreateFile`, `TDMCreateFileProperty`, `TDMCreateGroupProperty`, `TDMFilePropertyExists`, `TDMGetChannelPropertyNames`, `TDMGetChannelPropertyNum`, `TDMGetChannelPropertyStr`, `TDMGetChannelPropertyTime`, `TDMGetChannelPropertyType`, `TDMGetChannels`, `TDMGetChannelStringPropertyLen`, `TDMGetDataType`, `TDMGetDataValues`, `TDMGetDataValuesTime`, `TDMGetFilePropertyNames`, `TDMGetFilePropertyNum`, `TDMGetFilePropertyStr`, `TDMGetFilePropertyTime`, `TDMGetFilePropertyType`, `TDMGetFileStringPropertyLen`, `TDMGetGroupPropertyNames`, `TDMGetGroupPropertyNum`, `TDMGetGroupPropertyStr`, `TDMGetGroupPropertyTime`, `TDMGetGroupPropertyType`, `TDMGetGroups`, `TDMGetGroupStringPropertyLen`, `TDMGetLibraryErrorDescription`, `TDMGetNumChannelProperties`, `TDMGetNumChannels`, `TDMGetNumDataValues`, `TDMGetNumFileProperties`, `TDMGetNumGroupProperties`, `TDMGetNumGroups`, `TDMGroupPropertyExists`, `TDMOpenFile`, `TDMOpenFileEx`, `TDMRemoveChannel`, `TDMRemoveGroup`, `TDMReplaceDataValues`, `TDMReplaceDataValuesTime`, `TDMSaveFile`, `TDMSetChannelPropertyNum`, `TDMSetChannelPropertyStr`, `TDMSetChannelPropertyTime`, `TDMSetDataValues`, `TDMSetDataValuesTime`, `TDMSetFilePropertyNum`, `TDMSetFilePropertyStr`, `TDMSetFilePropertyTime`, `TDMSetGroupPropertyNum`, `TDMSetGroupPropertyStr`, `TDMSetGroupPropertyTime`, `TextEncodingCode`, `TextEncodingName`, `TextFile`, `ThreadGroupCreate`, `ThreadGroupGetDF`, `ThreadGroupGetDFR`, `ThreadGroupRelease`, `ThreadGroupWait`, `ThreadProcessorCount`, `ThreadReturnValue`, `ticks`, `time`, `TraceFromPixel`, `TraceInfo`, `TraceNameList`, `TraceNameToWaveRef`, `TrimString`, `trunc`, `UniqueName`, `UnPadString`, `UnsetEnvironmentVariable`, `UpperStr`, `URLDecode`, `URLEncode`, `VariableList`, `Variance`, `vcsr`, `viAssertIntrSignal`, `viAssertTrigger`, `viAssertUtilSignal`, `viClear`, `viClose`, `viDisableEvent`, `viDiscardEvents`, `viEnableEvent`, `viFindNext`, `viFindRsrc`, `viGetAttribute`, `viGetAttributeString`, `viGpibCommand`, `viGpibControlATN`, `viGpibControlREN`, `viGpibPassControl`, `viGpibSendIFC`, `viIn8`, `viIn16`, `viIn32`, `viLock`, `viMapAddress`, `viMapTrigger`, `viMemAlloc`, `viMemFree`, `viMoveIn8`, `viMoveIn16`, `viMoveIn32`, `viMoveOut8`, `viMoveOut16`, `viMoveOut32`, `viOpen`, `viOpenDefaultRM`, `viOut8`, `viOut16`, `viOut32`, `viPeek8`, `viPeek16`, `viPeek32`, `viPoke8`, `viPoke16`, `viPoke32`, `viRead`, `viReadSTB`, `viSetAttribute`, `viSetAttributeString`, `viStatusDesc`, `viTerminate`, `viUnlock`, `viUnmapAddress`, `viUnmapTrigger`, `viUsbControlIn`, `viUsbControlOut`, `viVxiCommandQuery`, `viWaitOnEvent`, `viWrite`, `VoigtFunc`, `VoigtPeak`, `WaveCRC`, `WaveDims`, `WaveExists`, `WaveHash`, `WaveInfo`, `WaveList`, `WaveMax`, `WaveMin`, `WaveName`, `WaveRefIndexed`, `WaveRefIndexedDFR`, `WaveRefsEqual`, `WaveRefWaveToList`, `WaveTextEncoding`, `WaveType`, `WaveUnits`, `WhichListItem`, `WinList`, `WinName`, `WinRecreation`, `WinType`, `wnoise`, `xcsr`, `XWaveName`, `XWaveRefFromTrace`, `x2pnt`, `zcsr`, `ZernikeR`, `zeromq_client_connect`, `zeromq_client_connect`, `zeromq_client_recv`, `zeromq_client_recv`, `zeromq_client_send`, `zeromq_client_send`, `zeromq_handler_start`, `zeromq_handler_start`, `zeromq_handler_stop`, `zeromq_handler_stop`, `zeromq_server_bind`, `zeromq_server_bind`, `zeromq_server_recv`, `zeromq_server_recv`, `zeromq_server_send`, `zeromq_server_send`, `zeromq_set`, `zeromq_set`, `zeromq_stop`, `zeromq_stop`, `zeromq_test_callfunction`, `zeromq_test_callfunction`, `zeromq_test_serializeWave`, `zeromq_test_serializeWave`, `zeta`), NameFunction, nil}, + {`^#(include|pragma|define|undef|ifdef|ifndef|if|elif|else|endif)`, NameDecorator, nil}, + {`[^a-z"/]+$`, Text, nil}, + {`.`, Text, nil}, + {`\n|\r`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/i/ini.go b/vendor/github.com/alecthomas/chroma/lexers/i/ini.go new file mode 100644 index 0000000..46b2ce2 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/i/ini.go @@ -0,0 +1,29 @@ +package i + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Ini lexer. +var Ini = internal.Register(MustNewLazyLexer( + &Config{ + Name: "INI", + Aliases: []string{"ini", "cfg", "dosini"}, + Filenames: []string{"*.ini", "*.cfg", "*.inf", ".gitconfig", ".editorconfig"}, + MimeTypes: []string{"text/x-ini", "text/inf"}, + }, + iniRules, +)) + +func iniRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`[;#].*`, CommentSingle, nil}, + {`\[.*?\]$`, Keyword, nil}, + {`(.*?)([ \t]*)(=)([ \t]*)(.*(?:\n[ \t].+)*)`, ByGroups(NameAttribute, Text, Operator, Text, LiteralString), nil}, + {`(.+?)$`, NameAttribute, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/i/io.go b/vendor/github.com/alecthomas/chroma/lexers/i/io.go new file mode 100644 index 0000000..8b2e53a --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/i/io.go @@ -0,0 +1,44 @@ +package i + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Io lexer. +var Io = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Io", + Aliases: []string{"io"}, + Filenames: []string{"*.io"}, + MimeTypes: []string{"text/x-iosrc"}, + }, + ioRules, +)) + +func ioRules() Rules { + return Rules{ + "root": { + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`//(.*?)\n`, CommentSingle, nil}, + {`#(.*?)\n`, CommentSingle, nil}, + {`/(\\\n)?[*](.|\n)*?[*](\\\n)?/`, CommentMultiline, nil}, + {`/\+`, CommentMultiline, Push("nestedcomment")}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`::=|:=|=|\(|\)|;|,|\*|-|\+|>|<|@|!|/|\||\^|\.|%|&|\[|\]|\{|\}`, Operator, nil}, + {`(clone|do|doFile|doString|method|for|if|else|elseif|then)\b`, Keyword, nil}, + {`(nil|false|true)\b`, NameConstant, nil}, + {`(Object|list|List|Map|args|Sequence|Coroutine|File)\b`, NameBuiltin, nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + {`(\d+\.?\d*|\d*\.\d+)([eE][+-]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`\d+`, LiteralNumberInteger, nil}, + }, + "nestedcomment": { + {`[^+/]+`, CommentMultiline, nil}, + {`/\+`, CommentMultiline, Push()}, + {`\+/`, CommentMultiline, Pop(1)}, + {`[+/]`, CommentMultiline, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/internal/api.go b/vendor/github.com/alecthomas/chroma/lexers/internal/api.go new file mode 100644 index 0000000..12fa45f --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/internal/api.go @@ -0,0 +1,201 @@ +// Package internal contains common API functions and structures shared between lexer packages. +package internal + +import ( + "path/filepath" + "sort" + "strings" + + "github.com/alecthomas/chroma" +) + +var ( + ignoredSuffixes = [...]string{ + // Editor backups + "~", ".bak", ".old", ".orig", + // Debian and derivatives apt/dpkg/ucf backups + ".dpkg-dist", ".dpkg-old", ".ucf-dist", ".ucf-new", ".ucf-old", + // Red Hat and derivatives rpm backups + ".rpmnew", ".rpmorig", ".rpmsave", + // Build system input/template files + ".in", + } +) + +// Registry of Lexers. +var Registry = struct { + Lexers chroma.Lexers + byName map[string]chroma.Lexer + byAlias map[string]chroma.Lexer +}{ + byName: map[string]chroma.Lexer{}, + byAlias: map[string]chroma.Lexer{}, +} + +// Names of all lexers, optionally including aliases. +func Names(withAliases bool) []string { + out := []string{} + for _, lexer := range Registry.Lexers { + config := lexer.Config() + out = append(out, config.Name) + if withAliases { + out = append(out, config.Aliases...) + } + } + sort.Strings(out) + return out +} + +// Get a Lexer by name, alias or file extension. +func Get(name string) chroma.Lexer { + if lexer := Registry.byName[name]; lexer != nil { + return lexer + } + if lexer := Registry.byAlias[name]; lexer != nil { + return lexer + } + if lexer := Registry.byName[strings.ToLower(name)]; lexer != nil { + return lexer + } + if lexer := Registry.byAlias[strings.ToLower(name)]; lexer != nil { + return lexer + } + + candidates := chroma.PrioritisedLexers{} + // Try file extension. + if lexer := Match("filename." + name); lexer != nil { + candidates = append(candidates, lexer) + } + // Try exact filename. + if lexer := Match(name); lexer != nil { + candidates = append(candidates, lexer) + } + if len(candidates) == 0 { + return nil + } + sort.Sort(candidates) + return candidates[0] +} + +// MatchMimeType attempts to find a lexer for the given MIME type. +func MatchMimeType(mimeType string) chroma.Lexer { + matched := chroma.PrioritisedLexers{} + for _, l := range Registry.Lexers { + for _, lmt := range l.Config().MimeTypes { + if mimeType == lmt { + matched = append(matched, l) + } + } + } + if len(matched) != 0 { + sort.Sort(matched) + return matched[0] + } + return nil +} + +// Match returns the first lexer matching filename. +func Match(filename string) chroma.Lexer { + filename = filepath.Base(filename) + matched := chroma.PrioritisedLexers{} + // First, try primary filename matches. + for _, lexer := range Registry.Lexers { + config := lexer.Config() + for _, glob := range config.Filenames { + ok, err := filepath.Match(glob, filename) + if err != nil { // nolint + panic(err) + } else if ok { + matched = append(matched, lexer) + } else { + for _, suf := range &ignoredSuffixes { + ok, err := filepath.Match(glob+suf, filename) + if err != nil { + panic(err) + } else if ok { + matched = append(matched, lexer) + break + } + } + } + } + } + if len(matched) > 0 { + sort.Sort(matched) + return matched[0] + } + matched = nil + // Next, try filename aliases. + for _, lexer := range Registry.Lexers { + config := lexer.Config() + for _, glob := range config.AliasFilenames { + ok, err := filepath.Match(glob, filename) + if err != nil { // nolint + panic(err) + } else if ok { + matched = append(matched, lexer) + } else { + for _, suf := range &ignoredSuffixes { + ok, err := filepath.Match(glob+suf, filename) + if err != nil { + panic(err) + } else if ok { + matched = append(matched, lexer) + break + } + } + } + } + } + if len(matched) > 0 { + sort.Sort(matched) + return matched[0] + } + return nil +} + +// Analyse text content and return the "best" lexer.. +func Analyse(text string) chroma.Lexer { + var picked chroma.Lexer + highest := float32(0.0) + for _, lexer := range Registry.Lexers { + if analyser, ok := lexer.(chroma.Analyser); ok { + weight := analyser.AnalyseText(text) + if weight > highest { + picked = lexer + highest = weight + } + } + } + return picked +} + +// Register a Lexer with the global registry. +func Register(lexer chroma.Lexer) chroma.Lexer { + config := lexer.Config() + Registry.byName[config.Name] = lexer + Registry.byName[strings.ToLower(config.Name)] = lexer + for _, alias := range config.Aliases { + Registry.byAlias[alias] = lexer + Registry.byAlias[strings.ToLower(alias)] = lexer + } + Registry.Lexers = append(Registry.Lexers, lexer) + return lexer +} + +// PlaintextRules is used for the fallback lexer as well as the explicit +// plaintext lexer. +func PlaintextRules() chroma.Rules { + return chroma.Rules{ + "root": []chroma.Rule{ + {`.+`, chroma.Text, nil}, + {`\n`, chroma.Text, nil}, + }, + } +} + +// Fallback lexer if no other is found. +var Fallback chroma.Lexer = chroma.MustNewLazyLexer(&chroma.Config{ + Name: "fallback", + Filenames: []string{"*"}, +}, PlaintextRules) diff --git a/vendor/github.com/alecthomas/chroma/lexers/j/j.go b/vendor/github.com/alecthomas/chroma/lexers/j/j.go new file mode 100644 index 0000000..9a2a4e3 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/j/j.go @@ -0,0 +1,77 @@ +package j + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// J lexer. +var J = internal.Register(MustNewLazyLexer( + &Config{ + Name: "J", + Aliases: []string{"j"}, + Filenames: []string{"*.ijs"}, + MimeTypes: []string{"text/x-j"}, + }, + jRules, +)) + +func jRules() Rules { + return Rules{ + "root": { + {`#!.*$`, CommentPreproc, nil}, + {`NB\..*`, CommentSingle, nil}, + {`\n+\s*Note`, CommentMultiline, Push("comment")}, + {`\s*Note.*`, CommentSingle, nil}, + {`\s+`, Text, nil}, + {`'`, LiteralString, Push("singlequote")}, + {`0\s+:\s*0|noun\s+define\s*$`, NameEntity, Push("nounDefinition")}, + {`(([1-4]|13)\s+:\s*0|(adverb|conjunction|dyad|monad|verb)\s+define)\b`, NameFunction, Push("explicitDefinition")}, + {Words(``, `\b[a-zA-Z]\w*\.`, `for_`, `goto_`, `label_`), NameLabel, nil}, + {Words(``, `\.`, `assert`, `break`, `case`, `catch`, `catchd`, `catcht`, `continue`, `do`, `else`, `elseif`, `end`, `fcase`, `for`, `if`, `return`, `select`, `throw`, `try`, `while`, `whilst`), NameLabel, nil}, + {`\b[a-zA-Z]\w*`, NameVariable, nil}, + {Words(``, ``, `ARGV`, `CR`, `CRLF`, `DEL`, `Debug`, `EAV`, `EMPTY`, `FF`, `JVERSION`, `LF`, `LF2`, `Note`, `TAB`, `alpha17`, `alpha27`, `apply`, `bind`, `boxopen`, `boxxopen`, `bx`, `clear`, `cutLF`, `cutopen`, `datatype`, `def`, `dfh`, `drop`, `each`, `echo`, `empty`, `erase`, `every`, `evtloop`, `exit`, `expand`, `fetch`, `file2url`, `fixdotdot`, `fliprgb`, `getargs`, `getenv`, `hfd`, `inv`, `inverse`, `iospath`, `isatty`, `isutf8`, `items`, `leaf`, `list`, `nameclass`, `namelist`, `names`, `nc`, `nl`, `on`, `pick`, `rows`, `script`, `scriptd`, `sign`, `sminfo`, `smoutput`, `sort`, `split`, `stderr`, `stdin`, `stdout`, `table`, `take`, `timespacex`, `timex`, `tmoutput`, `toCRLF`, `toHOST`, `toJ`, `tolower`, `toupper`, `type`, `ucp`, `ucpcount`, `usleep`, `utf8`, `uucp`), NameFunction, nil}, + {`=[.:]`, Operator, nil}, + {"[-=+*#$%@!~`^&\";:.,<>{}\\[\\]\\\\|/]", Operator, nil}, + {`[abCdDeEfHiIjLMoprtT]\.`, KeywordReserved, nil}, + {`[aDiLpqsStux]\:`, KeywordReserved, nil}, + {`(_[0-9])\:`, KeywordConstant, nil}, + {`\(`, Punctuation, Push("parentheses")}, + Include("numbers"), + }, + "comment": { + {`[^)]`, CommentMultiline, nil}, + {`^\)`, CommentMultiline, Pop(1)}, + {`[)]`, CommentMultiline, nil}, + }, + "explicitDefinition": { + {`\b[nmuvxy]\b`, NameDecorator, nil}, + Include("root"), + {`[^)]`, Name, nil}, + {`^\)`, NameLabel, Pop(1)}, + {`[)]`, Name, nil}, + }, + "numbers": { + {`\b_{1,2}\b`, LiteralNumber, nil}, + {`_?\d+(\.\d+)?(\s*[ejr]\s*)_?\d+(\.?=\d+)?`, LiteralNumber, nil}, + {`_?\d+\.(?=\d+)`, LiteralNumberFloat, nil}, + {`_?\d+x`, LiteralNumberIntegerLong, nil}, + {`_?\d+`, LiteralNumberInteger, nil}, + }, + "nounDefinition": { + {`[^)]`, LiteralString, nil}, + {`^\)`, NameLabel, Pop(1)}, + {`[)]`, LiteralString, nil}, + }, + "parentheses": { + {`\)`, Punctuation, Pop(1)}, + Include("explicitDefinition"), + Include("root"), + }, + "singlequote": { + {`[^']`, LiteralString, nil}, + {`''`, LiteralString, nil}, + {`'`, LiteralString, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/j/java.go b/vendor/github.com/alecthomas/chroma/lexers/j/java.go new file mode 100644 index 0000000..48a9d9f --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/j/java.go @@ -0,0 +1,56 @@ +package j + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Java lexer. +var Java = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Java", + Aliases: []string{"java"}, + Filenames: []string{"*.java"}, + MimeTypes: []string{"text/x-java"}, + DotAll: true, + EnsureNL: true, + }, + javaRules, +)) + +func javaRules() Rules { + return Rules{ + "root": { + {`[^\S\n]+`, Text, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`(assert|break|case|catch|continue|default|do|else|finally|for|if|goto|instanceof|new|return|switch|this|throw|try|while)\b`, Keyword, nil}, + {`((?:(?:[^\W\d]|\$)[\w.\[\]$<>]*\s+)+?)((?:[^\W\d]|\$)[\w$]*)(\s*)(\()`, ByGroups(UsingSelf("root"), NameFunction, Text, Operator), nil}, + {`@[^\W\d][\w.]*`, NameDecorator, nil}, + {`(abstract|const|enum|extends|final|implements|native|private|protected|public|static|strictfp|super|synchronized|throws|transient|volatile)\b`, KeywordDeclaration, nil}, + {`(boolean|byte|char|double|float|int|long|short|void)\b`, KeywordType, nil}, + {`(package)(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + {`(true|false|null)\b`, KeywordConstant, nil}, + {`(class|interface)(\s+)`, ByGroups(KeywordDeclaration, Text), Push("class")}, + {`(import(?:\s+static)?)(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'`, LiteralStringChar, nil}, + {`(\.)((?:[^\W\d]|\$)[\w$]*)`, ByGroups(Operator, NameAttribute), nil}, + {`^\s*([^\W\d]|\$)[\w$]*:`, NameLabel, nil}, + {`([^\W\d]|\$)[\w$]*`, Name, nil}, + {`([0-9][0-9_]*\.([0-9][0-9_]*)?|\.[0-9][0-9_]*)([eE][+\-]?[0-9][0-9_]*)?[fFdD]?|[0-9][eE][+\-]?[0-9][0-9_]*[fFdD]?|[0-9]([eE][+\-]?[0-9][0-9_]*)?[fFdD]|0[xX]([0-9a-fA-F][0-9a-fA-F_]*\.?|([0-9a-fA-F][0-9a-fA-F_]*)?\.[0-9a-fA-F][0-9a-fA-F_]*)[pP][+\-]?[0-9][0-9_]*[fFdD]?`, LiteralNumberFloat, nil}, + {`0[xX][0-9a-fA-F][0-9a-fA-F_]*[lL]?`, LiteralNumberHex, nil}, + {`0[bB][01][01_]*[lL]?`, LiteralNumberBin, nil}, + {`0[0-7_]+[lL]?`, LiteralNumberOct, nil}, + {`0|[1-9][0-9_]*[lL]?`, LiteralNumberInteger, nil}, + {`[~^*!%&\[\](){}<>|+=:;,./?-]`, Operator, nil}, + {`\n`, Text, nil}, + }, + "class": { + {`([^\W\d]|\$)[\w$]*`, NameClass, Pop(1)}, + }, + "import": { + {`[\w.]+\*?`, NameNamespace, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/j/javascript.go b/vendor/github.com/alecthomas/chroma/lexers/j/javascript.go new file mode 100644 index 0000000..5c6b937 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/j/javascript.go @@ -0,0 +1,74 @@ +package j + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Javascript lexer. +var JavascriptRules = Rules{ + "commentsandwhitespace": { + {`\s+`, Text, nil}, + {``, `<--`, `<-->`, `>`, `<`, `>=`, `≥`, `<=`, `≤`, `==`, `===`, `≡`, `!=`, `≠`, `!==`, `≢`, `∈`, `∉`, `∋`, `∌`, `⊆`, `⊈`, `⊂`, `⊄`, `⊊`, `∝`, `∊`, `∍`, `∥`, `∦`, `∷`, `∺`, `∻`, `∽`, `∾`, `≁`, `≃`, `≂`, `≄`, `≅`, `≆`, `≇`, `≈`, `≉`, `≊`, `≋`, `≌`, `≍`, `≎`, `≐`, `≑`, `≒`, `≓`, `≖`, `≗`, `≘`, `≙`, `≚`, `≛`, `≜`, `≝`, `≞`, `≟`, `≣`, `≦`, `≧`, `≨`, `≩`, `≪`, `≫`, `≬`, `≭`, `≮`, `≯`, `≰`, `≱`, `≲`, `≳`, `≴`, `≵`, `≶`, `≷`, `≸`, `≹`, `≺`, `≻`, `≼`, `≽`, `≾`, `≿`, `⊀`, `⊁`, `⊃`, `⊅`, `⊇`, `⊉`, `⊋`, `⊏`, `⊐`, `⊑`, `⊒`, `⊜`, `⊩`, `⊬`, `⊮`, `⊰`, `⊱`, `⊲`, `⊳`, `⊴`, `⊵`, `⊶`, `⊷`, `⋍`, `⋐`, `⋑`, `⋕`, `⋖`, `⋗`, `⋘`, `⋙`, `⋚`, `⋛`, `⋜`, `⋝`, `⋞`, `⋟`, `⋠`, `⋡`, `⋢`, `⋣`, `⋤`, `⋥`, `⋦`, `⋧`, `⋨`, `⋩`, `⋪`, `⋫`, `⋬`, `⋭`, `⋲`, `⋳`, `⋴`, `⋵`, `⋶`, `⋷`, `⋸`, `⋹`, `⋺`, `⋻`, `⋼`, `⋽`, `⋾`, `⋿`, `⟈`, `⟉`, `⟒`, `⦷`, `⧀`, `⧁`, `⧡`, `⧣`, `⧤`, `⧥`, `⩦`, `⩧`, `⩪`, `⩫`, `⩬`, `⩭`, `⩮`, `⩯`, `⩰`, `⩱`, `⩲`, `⩳`, `⩵`, `⩶`, `⩷`, `⩸`, `⩹`, `⩺`, `⩻`, `⩼`, `⩽`, `⩾`, `⩿`, `⪀`, `⪁`, `⪂`, `⪃`, `⪄`, `⪅`, `⪆`, `⪇`, `⪈`, `⪉`, `⪊`, `⪋`, `⪌`, `⪍`, `⪎`, `⪏`, `⪐`, `⪑`, `⪒`, `⪓`, `⪔`, `⪕`, `⪖`, `⪗`, `⪘`, `⪙`, `⪚`, `⪛`, `⪜`, `⪝`, `⪞`, `⪟`, `⪠`, `⪡`, `⪢`, `⪣`, `⪤`, `⪥`, `⪦`, `⪧`, `⪨`, `⪩`, `⪪`, `⪫`, `⪬`, `⪭`, `⪮`, `⪯`, `⪰`, `⪱`, `⪲`, `⪳`, `⪴`, `⪵`, `⪶`, `⪷`, `⪸`, `⪹`, `⪺`, `⪻`, `⪼`, `⪽`, `⪾`, `⪿`, `⫀`, `⫁`, `⫂`, `⫃`, `⫄`, `⫅`, `⫆`, `⫇`, `⫈`, `⫉`, `⫊`, `⫋`, `⫌`, `⫍`, `⫎`, `⫏`, `⫐`, `⫑`, `⫒`, `⫓`, `⫔`, `⫕`, `⫖`, `⫗`, `⫘`, `⫙`, `⫷`, `⫸`, `⫹`, `⫺`, `⊢`, `⊣`, `⟂`, `<:`, `>:`, `<|`, `|>`, `…`, `⁝`, `⋮`, `⋱`, `⋰`, `⋯`, `+`, `-`, `¦`, `|`, `⊕`, `⊖`, `⊞`, `⊟`, `++`, `∪`, `∨`, `⊔`, `±`, `∓`, `∔`, `∸`, `≏`, `⊎`, `⊻`, `⊽`, `⋎`, `⋓`, `⧺`, `⧻`, `⨈`, `⨢`, `⨣`, `⨤`, `⨥`, `⨦`, `⨧`, `⨨`, `⨩`, `⨪`, `⨫`, `⨬`, `⨭`, `⨮`, `⨹`, `⨺`, `⩁`, `⩂`, `⩅`, `⩊`, `⩌`, `⩏`, `⩐`, `⩒`, `⩔`, `⩖`, `⩗`, `⩛`, `⩝`, `⩡`, `⩢`, `⩣`, `*`, `/`, `⌿`, `÷`, `%`, `&`, `⋅`, `∘`, `×`, `\`, `∩`, `∧`, `⊗`, `⊘`, `⊙`, `⊚`, `⊛`, `⊠`, `⊡`, `⊓`, `∗`, `∙`, `∤`, `⅋`, `≀`, `⊼`, `⋄`, `⋆`, `⋇`, `⋉`, `⋊`, `⋋`, `⋌`, `⋏`, `⋒`, `⟑`, `⦸`, `⦼`, `⦾`, `⦿`, `⧶`, `⧷`, `⨇`, `⨰`, `⨱`, `⨲`, `⨳`, `⨴`, `⨵`, `⨶`, `⨷`, `⨸`, `⨻`, `⨼`, `⨽`, `⩀`, `⩃`, `⩄`, `⩋`, `⩍`, `⩎`, `⩑`, `⩓`, `⩕`, `⩘`, `⩚`, `⩜`, `⩞`, `⩟`, `⩠`, `⫛`, `⊍`, `▷`, `⨝`, `⟕`, `⟖`, `⟗`, `⨟`, `//`, `>>`, `<<`, `>>>`, `^`, `↑`, `↓`, `⇵`, `⟰`, `⟱`, `⤈`, `⤉`, `⤊`, `⤋`, `⤒`, `⤓`, `⥉`, `⥌`, `⥍`, `⥏`, `⥑`, `⥔`, `⥕`, `⥘`, `⥙`, `⥜`, `⥝`, `⥠`, `⥡`, `⥣`, `⥥`, `⥮`, `⥯`, `↑`, `↓`, `!`, `¬`, `√`, `∛`, `∜`), Operator, nil}, + {Words(``, `[²³¹ʰʲʳʷʸˡˢˣᴬᴮᴰᴱᴳᴴᴵᴶᴷᴸᴹᴺᴼᴾᴿᵀᵁᵂᵃᵇᵈᵉᵍᵏᵐᵒᵖᵗᵘᵛᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᶜᶠᶥᶦᶫᶰᶸᶻᶿ′″‴‵‶‷⁗⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₕₖₗₘₙₚₛₜⱼⱽ]*`, `.=`, `.+=`, `.-=`, `.*=`, `./=`, `.//=`, `.\=`, `.^=`, `.÷=`, `.%=`, `.<<=`, `.>>=`, `.>>>=`, `.|=`, `.&=`, `.⊻=`, `.≔`, `.⩴`, `.≕'`, `.~`, `.=>`, `.→`, `.↔`, `.↚`, `.↛`, `.↞`, `.↠`, `.↢`, `.↣`, `.↦`, `.↤`, `.↮`, `.⇎`, `.⇍`, `.⇏`, `.⇐`, `.⇒`, `.⇔`, `.⇴`, `.⇶`, `.⇷`, `.⇸`, `.⇹`, `.⇺`, `.⇻`, `.⇼`, `.⇽`, `.⇾`, `.⇿`, `.⟵`, `.⟶`, `.⟷`, `.⟹`, `.⟺`, `.⟻`, `.⟼`, `.⟽`, `.⟾`, `.⟿`, `.⤀`, `.⤁`, `.⤂`, `.⤃`, `.⤄`, `.⤅`, `.⤆`, `.⤇`, `.⤌`, `.⤍`, `.⤎`, `.⤏`, `.⤐`, `.⤑`, `.⤔`, `.⤕`, `.⤖`, `.⤗`, `.⤘`, `.⤝`, `.⤞`, `.⤟`, `.⤠`, `.⥄`, `.⥅`, `.⥆`, `.⥇`, `.⥈`, `.⥊`, `.⥋`, `.⥎`, `.⥐`, `.⥒`, `.⥓`, `.⥖`, `.⥗`, `.⥚`, `.⥛`, `.⥞`, `.⥟`, `.⥢`, `.⥤`, `.⥦`, `.⥧`, `.⥨`, `.⥩`, `.⥪`, `.⥫`, `.⥬`, `.⥭`, `.⥰`, `.⧴`, `.⬱`, `.⬰`, `.⬲`, `.⬳`, `.⬴`, `.⬵`, `.⬶`, `.⬷`, `.⬸`, `.⬹`, `.⬺`, `.⬻`, `.⬼`, `.⬽`, `.⬾`, `.⬿`, `.⭀`, `.⭁`, `.⭂`, `.⭃`, `.⭄`, `.⭇`, `.⭈`, `.⭉`, `.⭊`, `.⭋`, `.⭌`, `.←`, `.→`, `.⇜`, `.⇝`, `.↜`, `.↝`, `.↩`, `.↪`, `.↫`, `.↬`, `.↼`, `.↽`, `.⇀`, `.⇁`, `.⇄`, `.⇆`, `.⇇`, `.⇉`, `.⇋`, `.⇌`, `.⇚`, `.⇛`, `.⇠`, `.⇢`, `.↷`, `.↶`, `.↺`, `.↻`, `.-->`, `.<--`, `.<-->`, `.>`, `.<`, `.>=`, `.≥`, `.<=`, `.≤`, `.==`, `.===`, `.≡`, `.!=`, `.≠`, `.!==`, `.≢`, `.∈`, `.∉`, `.∋`, `.∌`, `.⊆`, `.⊈`, `.⊂`, `.⊄`, `.⊊`, `.∝`, `.∊`, `.∍`, `.∥`, `.∦`, `.∷`, `.∺`, `.∻`, `.∽`, `.∾`, `.≁`, `.≃`, `.≂`, `.≄`, `.≅`, `.≆`, `.≇`, `.≈`, `.≉`, `.≊`, `.≋`, `.≌`, `.≍`, `.≎`, `.≐`, `.≑`, `.≒`, `.≓`, `.≖`, `.≗`, `.≘`, `.≙`, `.≚`, `.≛`, `.≜`, `.≝`, `.≞`, `.≟`, `.≣`, `.≦`, `.≧`, `.≨`, `.≩`, `.≪`, `.≫`, `.≬`, `.≭`, `.≮`, `.≯`, `.≰`, `.≱`, `.≲`, `.≳`, `.≴`, `.≵`, `.≶`, `.≷`, `.≸`, `.≹`, `.≺`, `.≻`, `.≼`, `.≽`, `.≾`, `.≿`, `.⊀`, `.⊁`, `.⊃`, `.⊅`, `.⊇`, `.⊉`, `.⊋`, `.⊏`, `.⊐`, `.⊑`, `.⊒`, `.⊜`, `.⊩`, `.⊬`, `.⊮`, `.⊰`, `.⊱`, `.⊲`, `.⊳`, `.⊴`, `.⊵`, `.⊶`, `.⊷`, `.⋍`, `.⋐`, `.⋑`, `.⋕`, `.⋖`, `.⋗`, `.⋘`, `.⋙`, `.⋚`, `.⋛`, `.⋜`, `.⋝`, `.⋞`, `.⋟`, `.⋠`, `.⋡`, `.⋢`, `.⋣`, `.⋤`, `.⋥`, `.⋦`, `.⋧`, `.⋨`, `.⋩`, `.⋪`, `.⋫`, `.⋬`, `.⋭`, `.⋲`, `.⋳`, `.⋴`, `.⋵`, `.⋶`, `.⋷`, `.⋸`, `.⋹`, `.⋺`, `.⋻`, `.⋼`, `.⋽`, `.⋾`, `.⋿`, `.⟈`, `.⟉`, `.⟒`, `.⦷`, `.⧀`, `.⧁`, `.⧡`, `.⧣`, `.⧤`, `.⧥`, `.⩦`, `.⩧`, `.⩪`, `.⩫`, `.⩬`, `.⩭`, `.⩮`, `.⩯`, `.⩰`, `.⩱`, `.⩲`, `.⩳`, `.⩵`, `.⩶`, `.⩷`, `.⩸`, `.⩹`, `.⩺`, `.⩻`, `.⩼`, `.⩽`, `.⩾`, `.⩿`, `.⪀`, `.⪁`, `.⪂`, `.⪃`, `.⪄`, `.⪅`, `.⪆`, `.⪇`, `.⪈`, `.⪉`, `.⪊`, `.⪋`, `.⪌`, `.⪍`, `.⪎`, `.⪏`, `.⪐`, `.⪑`, `.⪒`, `.⪓`, `.⪔`, `.⪕`, `.⪖`, `.⪗`, `.⪘`, `.⪙`, `.⪚`, `.⪛`, `.⪜`, `.⪝`, `.⪞`, `.⪟`, `.⪠`, `.⪡`, `.⪢`, `.⪣`, `.⪤`, `.⪥`, `.⪦`, `.⪧`, `.⪨`, `.⪩`, `.⪪`, `.⪫`, `.⪬`, `.⪭`, `.⪮`, `.⪯`, `.⪰`, `.⪱`, `.⪲`, `.⪳`, `.⪴`, `.⪵`, `.⪶`, `.⪷`, `.⪸`, `.⪹`, `.⪺`, `.⪻`, `.⪼`, `.⪽`, `.⪾`, `.⪿`, `.⫀`, `.⫁`, `.⫂`, `.⫃`, `.⫄`, `.⫅`, `.⫆`, `.⫇`, `.⫈`, `.⫉`, `.⫊`, `.⫋`, `.⫌`, `.⫍`, `.⫎`, `.⫏`, `.⫐`, `.⫑`, `.⫒`, `.⫓`, `.⫔`, `.⫕`, `.⫖`, `.⫗`, `.⫘`, `.⫙`, `.⫷`, `.⫸`, `.⫹`, `.⫺`, `.⊢`, `.⊣`, `.⟂`, `.<:`, `.>:`, `.<|`, `.|>`, `.…`, `.⁝`, `.⋮`, `.⋱`, `.⋰`, `.⋯`, `.+`, `.-`, `.¦`, `.|`, `.⊕`, `.⊖`, `.⊞`, `.⊟`, `.++`, `.∪`, `.∨`, `.⊔`, `.±`, `.∓`, `.∔`, `.∸`, `.≏`, `.⊎`, `.⊻`, `.⊽`, `.⋎`, `.⋓`, `.⧺`, `.⧻`, `.⨈`, `.⨢`, `.⨣`, `.⨤`, `.⨥`, `.⨦`, `.⨧`, `.⨨`, `.⨩`, `.⨪`, `.⨫`, `.⨬`, `.⨭`, `.⨮`, `.⨹`, `.⨺`, `.⩁`, `.⩂`, `.⩅`, `.⩊`, `.⩌`, `.⩏`, `.⩐`, `.⩒`, `.⩔`, `.⩖`, `.⩗`, `.⩛`, `.⩝`, `.⩡`, `.⩢`, `.⩣`, `.*`, `./`, `.⌿`, `.÷`, `.%`, `.&`, `.⋅`, `.∘`, `.×`, `.\`, `.∩`, `.∧`, `.⊗`, `.⊘`, `.⊙`, `.⊚`, `.⊛`, `.⊠`, `.⊡`, `.⊓`, `.∗`, `.∙`, `.∤`, `.⅋`, `.≀`, `.⊼`, `.⋄`, `.⋆`, `.⋇`, `.⋉`, `.⋊`, `.⋋`, `.⋌`, `.⋏`, `.⋒`, `.⟑`, `.⦸`, `.⦼`, `.⦾`, `.⦿`, `.⧶`, `.⧷`, `.⨇`, `.⨰`, `.⨱`, `.⨲`, `.⨳`, `.⨴`, `.⨵`, `.⨶`, `.⨷`, `.⨸`, `.⨻`, `.⨼`, `.⨽`, `.⩀`, `.⩃`, `.⩄`, `.⩋`, `.⩍`, `.⩎`, `.⩑`, `.⩓`, `.⩕`, `.⩘`, `.⩚`, `.⩜`, `.⩞`, `.⩟`, `.⩠`, `.⫛`, `.⊍`, `.▷`, `.⨝`, `.⟕`, `.⟖`, `.⟗`, `.⨟`, `.//`, `.>>`, `.<<`, `.>>>`, `.^`, `.↑`, `.↓`, `.⇵`, `.⟰`, `.⟱`, `.⤈`, `.⤉`, `.⤊`, `.⤋`, `.⤒`, `.⤓`, `.⥉`, `.⥌`, `.⥍`, `.⥏`, `.⥑`, `.⥔`, `.⥕`, `.⥘`, `.⥙`, `.⥜`, `.⥝`, `.⥠`, `.⥡`, `.⥣`, `.⥥`, `.⥮`, `.⥯`, `.↑`, `.↓`, `.!`, `.¬`, `.√`, `.∛`, `.∜`), Operator, nil}, + {Words(``, ``, `...`, `..`), Operator, nil}, + {`'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,3}|\\u[a-fA-F0-9]{1,4}|\\U[a-fA-F0-9]{1,6}|[^\\\'\n])'`, LiteralStringChar, nil}, + {`(?<=[.\w)\]])(\'[²³¹ʰʲʳʷʸˡˢˣᴬᴮᴰᴱᴳᴴᴵᴶᴷᴸᴹᴺᴼᴾᴿᵀᵁᵂᵃᵇᵈᵉᵍᵏᵐᵒᵖᵗᵘᵛᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᶜᶠᶥᶦᶫᶰᶸᶻᶿ′″‴‵‶‷⁗⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₕₖₗₘₙₚₛₜⱼⱽ]*)+`, Operator, nil}, + {`(raw)(""")`, ByGroups(LiteralStringAffix, LiteralString), Push("tqrawstring")}, + {`(raw)(")`, ByGroups(LiteralStringAffix, LiteralString), Push("rawstring")}, + {`(r)(""")`, ByGroups(LiteralStringAffix, LiteralStringRegex), Push("tqregex")}, + {`(r)(")`, ByGroups(LiteralStringAffix, LiteralStringRegex), Push("regex")}, + {`((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))?(""")`, ByGroups(LiteralStringAffix, LiteralString), Push("tqstring")}, + {`((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))?(")`, ByGroups(LiteralStringAffix, LiteralString), Push("string")}, + {"((?:[a-zA-Z_\u00a1-\U0010ffff][a-zA-Z_0-9!\u00a1-\U0010ffff]*))?(```)", ByGroups(LiteralStringAffix, LiteralStringBacktick), Push("tqcommand")}, + {"((?:[a-zA-Z_\u00a1-\U0010ffff][a-zA-Z_0-9!\u00a1-\U0010ffff]*))?(`)", ByGroups(LiteralStringAffix, LiteralStringBacktick), Push("command")}, + {`((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))(\{)`, ByGroups(KeywordType, Punctuation), Push("curly")}, + {`(where)(\s+)((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))`, ByGroups(Keyword, Text, KeywordType), nil}, + {`(\{)`, Punctuation, Push("curly")}, + {`(abstract[ \t]+type|primitive[ \t]+type|mutable[ \t]+struct|struct)([\s()]+)((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*))`, ByGroups(Keyword, Text, KeywordType), nil}, + {`@(?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)`, NameDecorator, nil}, + {Words(`@`, `[²³¹ʰʲʳʷʸˡˢˣᴬᴮᴰᴱᴳᴴᴵᴶᴷᴸᴹᴺᴼᴾᴿᵀᵁᵂᵃᵇᵈᵉᵍᵏᵐᵒᵖᵗᵘᵛᵝᵞᵟᵠᵡᵢᵣᵤᵥᵦᵧᵨᵩᵪᶜᶠᶥᶦᶫᶰᶸᶻᶿ′″‴‵‶‷⁗⁰ⁱ⁴⁵⁶⁷⁸⁹⁺⁻⁼⁽⁾ⁿ₀₁₂₃₄₅₆₇₈₉₊₋₌₍₎ₐₑₒₓₕₖₗₘₙₚₛₜⱼⱽ]*`, `->`, `:=`, `$=`, `?`, `||`, `&&`, `:`, `$`, `::`, `..`, `.`, `=`, `+=`, `-=`, `*=`, `/=`, `//=`, `\=`, `^=`, `÷=`, `%=`, `<<=`, `>>=`, `>>>=`, `|=`, `&=`, `⊻=`, `≔`, `⩴`, `≕'`, `~`, `=>`, `→`, `↔`, `↚`, `↛`, `↞`, `↠`, `↢`, `↣`, `↦`, `↤`, `↮`, `⇎`, `⇍`, `⇏`, `⇐`, `⇒`, `⇔`, `⇴`, `⇶`, `⇷`, `⇸`, `⇹`, `⇺`, `⇻`, `⇼`, `⇽`, `⇾`, `⇿`, `⟵`, `⟶`, `⟷`, `⟹`, `⟺`, `⟻`, `⟼`, `⟽`, `⟾`, `⟿`, `⤀`, `⤁`, `⤂`, `⤃`, `⤄`, `⤅`, `⤆`, `⤇`, `⤌`, `⤍`, `⤎`, `⤏`, `⤐`, `⤑`, `⤔`, `⤕`, `⤖`, `⤗`, `⤘`, `⤝`, `⤞`, `⤟`, `⤠`, `⥄`, `⥅`, `⥆`, `⥇`, `⥈`, `⥊`, `⥋`, `⥎`, `⥐`, `⥒`, `⥓`, `⥖`, `⥗`, `⥚`, `⥛`, `⥞`, `⥟`, `⥢`, `⥤`, `⥦`, `⥧`, `⥨`, `⥩`, `⥪`, `⥫`, `⥬`, `⥭`, `⥰`, `⧴`, `⬱`, `⬰`, `⬲`, `⬳`, `⬴`, `⬵`, `⬶`, `⬷`, `⬸`, `⬹`, `⬺`, `⬻`, `⬼`, `⬽`, `⬾`, `⬿`, `⭀`, `⭁`, `⭂`, `⭃`, `⭄`, `⭇`, `⭈`, `⭉`, `⭊`, `⭋`, `⭌`, `←`, `→`, `⇜`, `⇝`, `↜`, `↝`, `↩`, `↪`, `↫`, `↬`, `↼`, `↽`, `⇀`, `⇁`, `⇄`, `⇆`, `⇇`, `⇉`, `⇋`, `⇌`, `⇚`, `⇛`, `⇠`, `⇢`, `↷`, `↶`, `↺`, `↻`, `-->`, `<--`, `<-->`, `>`, `<`, `>=`, `≥`, `<=`, `≤`, `==`, `===`, `≡`, `!=`, `≠`, `!==`, `≢`, `∈`, `∉`, `∋`, `∌`, `⊆`, `⊈`, `⊂`, `⊄`, `⊊`, `∝`, `∊`, `∍`, `∥`, `∦`, `∷`, `∺`, `∻`, `∽`, `∾`, `≁`, `≃`, `≂`, `≄`, `≅`, `≆`, `≇`, `≈`, `≉`, `≊`, `≋`, `≌`, `≍`, `≎`, `≐`, `≑`, `≒`, `≓`, `≖`, `≗`, `≘`, `≙`, `≚`, `≛`, `≜`, `≝`, `≞`, `≟`, `≣`, `≦`, `≧`, `≨`, `≩`, `≪`, `≫`, `≬`, `≭`, `≮`, `≯`, `≰`, `≱`, `≲`, `≳`, `≴`, `≵`, `≶`, `≷`, `≸`, `≹`, `≺`, `≻`, `≼`, `≽`, `≾`, `≿`, `⊀`, `⊁`, `⊃`, `⊅`, `⊇`, `⊉`, `⊋`, `⊏`, `⊐`, `⊑`, `⊒`, `⊜`, `⊩`, `⊬`, `⊮`, `⊰`, `⊱`, `⊲`, `⊳`, `⊴`, `⊵`, `⊶`, `⊷`, `⋍`, `⋐`, `⋑`, `⋕`, `⋖`, `⋗`, `⋘`, `⋙`, `⋚`, `⋛`, `⋜`, `⋝`, `⋞`, `⋟`, `⋠`, `⋡`, `⋢`, `⋣`, `⋤`, `⋥`, `⋦`, `⋧`, `⋨`, `⋩`, `⋪`, `⋫`, `⋬`, `⋭`, `⋲`, `⋳`, `⋴`, `⋵`, `⋶`, `⋷`, `⋸`, `⋹`, `⋺`, `⋻`, `⋼`, `⋽`, `⋾`, `⋿`, `⟈`, `⟉`, `⟒`, `⦷`, `⧀`, `⧁`, `⧡`, `⧣`, `⧤`, `⧥`, `⩦`, `⩧`, `⩪`, `⩫`, `⩬`, `⩭`, `⩮`, `⩯`, `⩰`, `⩱`, `⩲`, `⩳`, `⩵`, `⩶`, `⩷`, `⩸`, `⩹`, `⩺`, `⩻`, `⩼`, `⩽`, `⩾`, `⩿`, `⪀`, `⪁`, `⪂`, `⪃`, `⪄`, `⪅`, `⪆`, `⪇`, `⪈`, `⪉`, `⪊`, `⪋`, `⪌`, `⪍`, `⪎`, `⪏`, `⪐`, `⪑`, `⪒`, `⪓`, `⪔`, `⪕`, `⪖`, `⪗`, `⪘`, `⪙`, `⪚`, `⪛`, `⪜`, `⪝`, `⪞`, `⪟`, `⪠`, `⪡`, `⪢`, `⪣`, `⪤`, `⪥`, `⪦`, `⪧`, `⪨`, `⪩`, `⪪`, `⪫`, `⪬`, `⪭`, `⪮`, `⪯`, `⪰`, `⪱`, `⪲`, `⪳`, `⪴`, `⪵`, `⪶`, `⪷`, `⪸`, `⪹`, `⪺`, `⪻`, `⪼`, `⪽`, `⪾`, `⪿`, `⫀`, `⫁`, `⫂`, `⫃`, `⫄`, `⫅`, `⫆`, `⫇`, `⫈`, `⫉`, `⫊`, `⫋`, `⫌`, `⫍`, `⫎`, `⫏`, `⫐`, `⫑`, `⫒`, `⫓`, `⫔`, `⫕`, `⫖`, `⫗`, `⫘`, `⫙`, `⫷`, `⫸`, `⫹`, `⫺`, `⊢`, `⊣`, `⟂`, `<:`, `>:`, `<|`, `|>`, `…`, `⁝`, `⋮`, `⋱`, `⋰`, `⋯`, `+`, `-`, `¦`, `|`, `⊕`, `⊖`, `⊞`, `⊟`, `++`, `∪`, `∨`, `⊔`, `±`, `∓`, `∔`, `∸`, `≏`, `⊎`, `⊻`, `⊽`, `⋎`, `⋓`, `⧺`, `⧻`, `⨈`, `⨢`, `⨣`, `⨤`, `⨥`, `⨦`, `⨧`, `⨨`, `⨩`, `⨪`, `⨫`, `⨬`, `⨭`, `⨮`, `⨹`, `⨺`, `⩁`, `⩂`, `⩅`, `⩊`, `⩌`, `⩏`, `⩐`, `⩒`, `⩔`, `⩖`, `⩗`, `⩛`, `⩝`, `⩡`, `⩢`, `⩣`, `*`, `/`, `⌿`, `÷`, `%`, `&`, `⋅`, `∘`, `×`, `\`, `∩`, `∧`, `⊗`, `⊘`, `⊙`, `⊚`, `⊛`, `⊠`, `⊡`, `⊓`, `∗`, `∙`, `∤`, `⅋`, `≀`, `⊼`, `⋄`, `⋆`, `⋇`, `⋉`, `⋊`, `⋋`, `⋌`, `⋏`, `⋒`, `⟑`, `⦸`, `⦼`, `⦾`, `⦿`, `⧶`, `⧷`, `⨇`, `⨰`, `⨱`, `⨲`, `⨳`, `⨴`, `⨵`, `⨶`, `⨷`, `⨸`, `⨻`, `⨼`, `⨽`, `⩀`, `⩃`, `⩄`, `⩋`, `⩍`, `⩎`, `⩑`, `⩓`, `⩕`, `⩘`, `⩚`, `⩜`, `⩞`, `⩟`, `⩠`, `⫛`, `⊍`, `▷`, `⨝`, `⟕`, `⟖`, `⟗`, `⨟`, `//`, `>>`, `<<`, `>>>`, `^`, `↑`, `↓`, `⇵`, `⟰`, `⟱`, `⤈`, `⤉`, `⤊`, `⤋`, `⤒`, `⤓`, `⥉`, `⥌`, `⥍`, `⥏`, `⥑`, `⥔`, `⥕`, `⥘`, `⥙`, `⥜`, `⥝`, `⥠`, `⥡`, `⥣`, `⥥`, `⥮`, `⥯`, `↑`, `↓`, `!`, `¬`, `√`, `∛`, `∜`), NameDecorator, nil}, + {Words(``, `\b`, `baremodule`, `begin`, `break`, `catch`, `ccall`, `const`, `continue`, `do`, `else`, `elseif`, `end`, `export`, `finally`, `for`, `function`, `global`, `if`, `import`, `in`, `isa`, `let`, `local`, `macro`, `module`, `quote`, `return`, `try`, `using`, `where`, `while`), Keyword, nil}, + {Words(``, `\b`, `AbstractArray`, `AbstractChannel`, `AbstractChar`, `AbstractDict`, `AbstractDisplay`, `AbstractFloat`, `AbstractIrrational`, `AbstractMatch`, `AbstractMatrix`, `AbstractPattern`, `AbstractRange`, `AbstractSet`, `AbstractString`, `AbstractUnitRange`, `AbstractVecOrMat`, `AbstractVector`, `Any`, `ArgumentError`, `Array`, `AssertionError`, `BigFloat`, `BigInt`, `BitArray`, `BitMatrix`, `BitSet`, `BitVector`, `Bool`, `BoundsError`, `CapturedException`, `CartesianIndex`, `CartesianIndices`, `Cchar`, `Cdouble`, `Cfloat`, `Channel`, `Char`, `Cint`, `Cintmax_t`, `Clong`, `Clonglong`, `Cmd`, `Colon`, `Complex`, `ComplexF16`, `ComplexF32`, `ComplexF64`, `ComposedFunction`, `CompositeException`, `Condition`, `Cptrdiff_t`, `Cshort`, `Csize_t`, `Cssize_t`, `Cstring`, `Cuchar`, `Cuint`, `Cuintmax_t`, `Culong`, `Culonglong`, `Cushort`, `Cvoid`, `Cwchar_t`, `Cwstring`, `DataType`, `DenseArray`, `DenseMatrix`, `DenseVecOrMat`, `DenseVector`, `Dict`, `DimensionMismatch`, `Dims`, `DivideError`, `DomainError`, `EOFError`, `Enum`, `ErrorException`, `Exception`, `ExponentialBackOff`, `Expr`, `Float16`, `Float32`, `Float64`, `Function`, `GlobalRef`, `HTML`, `IO`, `IOBuffer`, `IOContext`, `IOStream`, `IdDict`, `IndexCartesian`, `IndexLinear`, `IndexStyle`, `InexactError`, `InitError`, `Int`, `Int128`, `Int16`, `Int32`, `Int64`, `Int8`, `Integer`, `InterruptException`, `InvalidStateException`, `Irrational`, `KeyError`, `LinRange`, `LineNumberNode`, `LinearIndices`, `LoadError`, `MIME`, `Matrix`, `Method`, `MethodError`, `Missing`, `MissingException`, `Module`, `NTuple`, `NamedTuple`, `Nothing`, `Number`, `OrdinalRange`, `OutOfMemoryError`, `OverflowError`, `Pair`, `PartialQuickSort`, `PermutedDimsArray`, `Pipe`, `ProcessFailedException`, `Ptr`, `QuoteNode`, `Rational`, `RawFD`, `ReadOnlyMemoryError`, `Real`, `ReentrantLock`, `Ref`, `Regex`, `RegexMatch`, `RoundingMode`, `SegmentationFault`, `Set`, `Signed`, `Some`, `StackOverflowError`, `StepRange`, `StepRangeLen`, `StridedArray`, `StridedMatrix`, `StridedVecOrMat`, `StridedVector`, `String`, `StringIndexError`, `SubArray`, `SubString`, `SubstitutionString`, `Symbol`, `SystemError`, `Task`, `TaskFailedException`, `Text`, `TextDisplay`, `Timer`, `Tuple`, `Type`, `TypeError`, `TypeVar`, `UInt`, `UInt128`, `UInt16`, `UInt32`, `UInt64`, `UInt8`, `UndefInitializer`, `UndefKeywordError`, `UndefRefError`, `UndefVarError`, `Union`, `UnionAll`, `UnitRange`, `Unsigned`, `Val`, `Vararg`, `VecElement`, `VecOrMat`, `Vector`, `VersionNumber`, `WeakKeyDict`, `WeakRef`), KeywordType, nil}, + {Words(``, `\b`, `ARGS`, `C_NULL`, `DEPOT_PATH`, `ENDIAN_BOM`, `ENV`, `Inf`, `Inf16`, `Inf32`, `Inf64`, `InsertionSort`, `LOAD_PATH`, `MergeSort`, `NaN`, `NaN16`, `NaN32`, `NaN64`, `PROGRAM_FILE`, `QuickSort`, `RoundDown`, `RoundFromZero`, `RoundNearest`, `RoundNearestTiesAway`, `RoundNearestTiesUp`, `RoundToZero`, `RoundUp`, `VERSION`, `devnull`, `false`, `im`, `missing`, `nothing`, `pi`, `stderr`, `stdin`, `stdout`, `true`, `undef`, `π`, `ℯ`), NameBuiltin, nil}, + {`(?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)`, Name, nil}, + {`(\d+((_\d+)+)?\.(?!\.)(\d+((_\d+)+)?)?|\.\d+((_\d+)+)?)([eEf][+-]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`\d+((_\d+)+)?[eEf][+-]?[0-9]+`, LiteralNumberFloat, nil}, + {`0x[a-fA-F0-9]+((_[a-fA-F0-9]+)+)?(\.([a-fA-F0-9]+((_[a-fA-F0-9]+)+)?)?)?p[+-]?\d+`, LiteralNumberFloat, nil}, + {`0b[01]+((_[01]+)+)?`, LiteralNumberBin, nil}, + {`0o[0-7]+((_[0-7]+)+)?`, LiteralNumberOct, nil}, + {`0x[a-fA-F0-9]+((_[a-fA-F0-9]+)+)?`, LiteralNumberHex, nil}, + {`\d+((_\d+)+)?`, LiteralNumberInteger, nil}, + {Words(``, ``, `.`), Operator, nil}, + }, + "blockcomment": { + {`[^=#]`, CommentMultiline, nil}, + {`#=`, CommentMultiline, Push()}, + {`=#`, CommentMultiline, Pop(1)}, + {`[=#]`, CommentMultiline, nil}, + }, + "curly": { + {`\{`, Punctuation, Push()}, + {`\}`, Punctuation, Pop(1)}, + {`(?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)`, KeywordType, nil}, + Include("root"), + }, + "tqrawstring": { + {`"""`, LiteralString, Pop(1)}, + {`([^"]|"[^"][^"])+`, LiteralString, nil}, + }, + "rawstring": { + {`"`, LiteralString, Pop(1)}, + {`\\"`, LiteralStringEscape, nil}, + {`([^"\\]|\\[^"])+`, LiteralString, nil}, + }, + "interp": { + {`\$(?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)`, LiteralStringInterpol, nil}, + {`(\$)(\()`, ByGroups(LiteralStringInterpol, Punctuation), Push("in-intp")}, + }, + "in-intp": { + {`\(`, Punctuation, Push()}, + {`\)`, Punctuation, Pop(1)}, + Include("root"), + }, + "string": { + {`(")((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)|\d+)?`, ByGroups(LiteralString, LiteralStringAffix), Pop(1)}, + {`\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)`, LiteralStringEscape, nil}, + Include("interp"), + {`%[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsux%]`, LiteralStringInterpol, nil}, + {`[^"$%\\]+`, LiteralString, nil}, + {`.`, LiteralString, nil}, + }, + "tqstring": { + {`(""")((?:[a-zA-Z_¡-􏿿][a-zA-Z_0-9!¡-􏿿]*)|\d+)?`, ByGroups(LiteralString, LiteralStringAffix), Pop(1)}, + {`\\([\\"\'$nrbtfav]|(x|u|U)[a-fA-F0-9]+|\d+)`, LiteralStringEscape, nil}, + Include("interp"), + {`[^"$%\\]+`, LiteralString, nil}, + {`.`, LiteralString, nil}, + }, + "regex": { + {`(")([imsxa]*)?`, ByGroups(LiteralStringRegex, LiteralStringAffix), Pop(1)}, + {`\\"`, LiteralStringRegex, nil}, + {`[^\\"]+`, LiteralStringRegex, nil}, + }, + "tqregex": { + {`(""")([imsxa]*)?`, ByGroups(LiteralStringRegex, LiteralStringAffix), Pop(1)}, + {`[^"]+`, LiteralStringRegex, nil}, + }, + "command": { + {"(`)((?:[a-zA-Z_\u00a1-\U0010ffff][a-zA-Z_0-9!\u00a1-\U0010ffff]*)|\\d+)?", ByGroups(LiteralStringBacktick, LiteralStringAffix), Pop(1)}, + {"\\\\[`$]", LiteralStringEscape, nil}, + Include("interp"), + {"[^\\\\`$]+", LiteralStringBacktick, nil}, + {`.`, LiteralStringBacktick, nil}, + }, + "tqcommand": { + {"(```)((?:[a-zA-Z_\u00a1-\U0010ffff][a-zA-Z_0-9!\u00a1-\U0010ffff]*)|\\d+)?", ByGroups(LiteralStringBacktick, LiteralStringAffix), Pop(1)}, + {`\\\$`, LiteralStringEscape, nil}, + Include("interp"), + {"[^\\\\`$]+", LiteralStringBacktick, nil}, + {`.`, LiteralStringBacktick, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/j/jungle.go b/vendor/github.com/alecthomas/chroma/lexers/j/jungle.go new file mode 100644 index 0000000..5dbda9f --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/j/jungle.go @@ -0,0 +1,54 @@ +package j + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +var Jungle = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Jungle", + Aliases: []string{"jungle"}, + Filenames: []string{"*.jungle"}, + MimeTypes: []string{"text/x-jungle"}, + }, + jungleRules, +)) + +func jungleRules() Rules { + return Rules{ + "root": { + {`[^\S\n]+`, Text, nil}, + {`\n`, Text, nil}, + {`#(\n|[\w\W]*?[^#]\n)`, CommentSingle, nil}, + {`^(?=\S)`, None, Push("instruction")}, + {`[\.;\[\]\(\)\$]`, Punctuation, nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + }, + "instruction": { + {`[^\S\n]+`, Text, nil}, + {`=`, Operator, Push("value")}, + {`(?=\S)`, None, Push("var")}, + Default(Pop(1)), + }, + "value": { + {`[^\S\n]+`, Text, nil}, + {`\$\(`, Punctuation, Push("var")}, + {`[;\[\]\(\)\$]`, Punctuation, nil}, + {`#(\n|[\w\W]*?[^#]\n)`, CommentSingle, nil}, + {`[\w_\-\.\/\\]+`, Text, nil}, + Default(Pop(1)), + }, + "var": { + {`[^\S\n]+`, Text, nil}, + {`\b(((re)?source|barrel)Path|excludeAnnotations|annotations|lang)\b`, NameBuiltin, nil}, + {`\bbase\b`, NameConstant, nil}, + {`\b(ind|zsm|hrv|ces|dan|dut|eng|fin|fre|deu|gre|hun|ita|nob|po[lr]|rus|sl[ov]|spa|swe|ara|heb|zh[st]|jpn|kor|tha|vie|bul|tur)`, NameConstant, nil}, + {`\b((semi)?round|rectangle)(-\d+x\d+)?\b`, NameConstant, nil}, + {`[\.;\[\]\(\$]`, Punctuation, nil}, + {`\)`, Punctuation, Pop(1)}, + {`[a-zA-Z_]\w*`, Name, nil}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/k/kotlin.go b/vendor/github.com/alecthomas/chroma/lexers/k/kotlin.go new file mode 100644 index 0000000..deb182e --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/k/kotlin.go @@ -0,0 +1,98 @@ +package k + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Kotlin lexer. +var Kotlin = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Kotlin", + Aliases: []string{"kotlin"}, + Filenames: []string{"*.kt"}, + MimeTypes: []string{"text/x-kotlin"}, + DotAll: true, + }, + kotlinRules, +)) + +func kotlinRules() Rules { + const kotlinIdentifier = "(?:[_\\p{L}][\\p{L}\\p{N}]*|`@?[_\\p{L}][\\p{L}\\p{N}]+`)" + + return Rules{ + "root": { + {`^\s*\[.*?\]`, NameAttribute, nil}, + {`[^\S\n]+`, Text, nil}, + {`\\\n`, Text, nil}, + {`//[^\n]*\n?`, CommentSingle, nil}, + {`/[*].*?[*]/`, CommentMultiline, nil}, + {`\n`, Text, nil}, + {`!==|!in|!is|===`, Operator, nil}, + {`%=|&&|\*=|\+\+|\+=|--|-=|->|\.\.|\/=|::|<=|==|>=|!!|!=|\|\||\?[:.]`, Operator, nil}, + {`[~!%^&*()+=|\[\]:;,.<>\/?-]`, Punctuation, nil}, + {`[{}]`, Punctuation, nil}, + {`"""`, LiteralString, Push("rawstring")}, + {`"`, LiteralStringDouble, Push("string")}, + {`(')(\\u[0-9a-fA-F]{4})(')`, ByGroups(LiteralStringChar, LiteralStringEscape, LiteralStringChar), nil}, + {`'\\.'|'[^\\]'`, LiteralStringChar, nil}, + {`0[xX][0-9a-fA-F]+[Uu]?[Ll]?|[0-9]+(\.[0-9]*)?([eE][+-][0-9]+)?[fF]?[Uu]?[Ll]?`, LiteralNumber, nil}, + {`(companion)(\s+)(object)`, ByGroups(Keyword, Text, Keyword), nil}, + {`(class|interface|object)(\s+)`, ByGroups(Keyword, Text), Push("class")}, + {`(package|import)(\s+)`, ByGroups(Keyword, Text), Push("package")}, + {`(val|var)(\s+)`, ByGroups(Keyword, Text), Push("property")}, + {`(fun)(\s+)`, ByGroups(Keyword, Text), Push("function")}, + {`(abstract|actual|annotation|as|as\?|break|by|catch|class|companion|const|constructor|continue|crossinline|data|delegate|do|dynamic|else|enum|expect|external|false|field|file|final|finally|for|fun|get|if|import|in|infix|init|inline|inner|interface|internal|is|it|lateinit|noinline|null|object|open|operator|out|override|package|param|private|property|protected|public|receiver|reified|return|sealed|set|setparam|super|suspend|tailrec|this|throw|true|try|typealias|typeof|val|var|vararg|when|where|while)\b`, Keyword, nil}, + {`@` + kotlinIdentifier, NameDecorator, nil}, + {kotlinIdentifier, Name, nil}, + }, + "package": { + {`\S+`, NameNamespace, Pop(1)}, + }, + "class": { + // \x60 is the back tick character (`) + {`\x60[^\x60]+?\x60`, NameClass, Pop(1)}, + {kotlinIdentifier, NameClass, Pop(1)}, + }, + "property": { + {`\x60[^\x60]+?\x60`, NameProperty, Pop(1)}, + {kotlinIdentifier, NameProperty, Pop(1)}, + }, + "generics-specification": { + {`<`, Punctuation, Push("generics-specification")}, // required for generics inside generics e.g. > + {`>`, Punctuation, Pop(1)}, + {`[,:*?]`, Punctuation, nil}, + {`(in|out|reified)`, Keyword, nil}, + {`\x60[^\x60]+?\x60`, NameClass, nil}, + {kotlinIdentifier, NameClass, nil}, + {`\s+`, Text, nil}, + }, + "function": { + {`<`, Punctuation, Push("generics-specification")}, + {`\x60[^\x60]+?\x60`, NameFunction, Pop(1)}, + {kotlinIdentifier, NameFunction, Pop(1)}, + {`\s+`, Text, nil}, + }, + "rawstring": { + // raw strings don't allow character escaping + {`"""`, LiteralString, Pop(1)}, + {`(?:[^$"]+|\"{1,2}[^"])+`, LiteralString, nil}, + Include("string-interpol"), + // remaining dollar signs are just a string + {`\$`, LiteralString, nil}, + }, + "string": { + {`\\[tbnr'"\\\$]`, LiteralStringEscape, nil}, + {`\\u[0-9a-fA-F]{4}`, LiteralStringEscape, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + Include("string-interpol"), + {`[^\n\\"$]+`, LiteralStringDouble, nil}, + // remaining dollar signs are just a string + {`\$`, LiteralStringDouble, nil}, + }, + "string-interpol": { + {`\$` + kotlinIdentifier, LiteralStringInterpol, nil}, + {`\${[^}\n]*}`, LiteralStringInterpol, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/l/lighttpd.go b/vendor/github.com/alecthomas/chroma/lexers/l/lighttpd.go new file mode 100644 index 0000000..6d83298 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/l/lighttpd.go @@ -0,0 +1,34 @@ +package l + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Lighttpd Configuration File lexer. +var Lighttpd = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Lighttpd configuration file", + Aliases: []string{"lighty", "lighttpd"}, + Filenames: []string{}, + MimeTypes: []string{"text/x-lighttpd-conf"}, + }, + lighttpdRules, +)) + +func lighttpdRules() Rules { + return Rules{ + "root": { + {`#.*\n`, CommentSingle, nil}, + {`/\S*`, Name, nil}, + {`[a-zA-Z._-]+`, Keyword, nil}, + {`\d+\.\d+\.\d+\.\d+(?:/\d+)?`, LiteralNumber, nil}, + {`[0-9]+`, LiteralNumber, nil}, + {`=>|=~|\+=|==|=|\+`, Operator, nil}, + {`\$[A-Z]+`, NameBuiltin, nil}, + {`[(){}\[\],]`, Punctuation, nil}, + {`"([^"\\]*(?:\\.[^"\\]*)*)"`, LiteralStringDouble, nil}, + {`\s+`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/l/llvm.go b/vendor/github.com/alecthomas/chroma/lexers/l/llvm.go new file mode 100644 index 0000000..e9ea319 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/l/llvm.go @@ -0,0 +1,47 @@ +package l + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Llvm lexer. +var Llvm = internal.Register(MustNewLazyLexer( + &Config{ + Name: "LLVM", + Aliases: []string{"llvm"}, + Filenames: []string{"*.ll"}, + MimeTypes: []string{"text/x-llvm"}, + }, + llvmRules, +)) + +func llvmRules() Rules { + return Rules{ + "root": { + Include("whitespace"), + {`([-a-zA-Z$._][\w\-$.]*|"[^"]*?")\s*:`, NameLabel, nil}, + Include("keyword"), + {`%([-a-zA-Z$._][\w\-$.]*|"[^"]*?")`, NameVariable, nil}, + {`@([-a-zA-Z$._][\w\-$.]*|"[^"]*?")`, NameVariableGlobal, nil}, + {`%\d+`, NameVariableAnonymous, nil}, + {`@\d+`, NameVariableGlobal, nil}, + {`#\d+`, NameVariableGlobal, nil}, + {`!([-a-zA-Z$._][\w\-$.]*|"[^"]*?")`, NameVariable, nil}, + {`!\d+`, NameVariableAnonymous, nil}, + {`c?"[^"]*?"`, LiteralString, nil}, + {`0[xX][a-fA-F0-9]+`, LiteralNumber, nil}, + {`-?\d+(?:[.]\d+)?(?:[eE][-+]?\d+(?:[.]\d+)?)?`, LiteralNumber, nil}, + {`[=<>{}\[\]()*.,!]|x\b`, Punctuation, nil}, + }, + "whitespace": { + {`(\n|\s)+`, Text, nil}, + {`;.*?\n`, Comment, nil}, + }, + "keyword": { + {Words(``, `\b`, `begin`, `end`, `true`, `false`, `declare`, `define`, `global`, `constant`, `private`, `linker_private`, `internal`, `available_externally`, `linkonce`, `linkonce_odr`, `weak`, `weak_odr`, `appending`, `dllimport`, `dllexport`, `common`, `default`, `hidden`, `protected`, `extern_weak`, `external`, `thread_local`, `zeroinitializer`, `undef`, `null`, `to`, `tail`, `target`, `triple`, `datalayout`, `volatile`, `nuw`, `nsw`, `nnan`, `ninf`, `nsz`, `arcp`, `fast`, `exact`, `inbounds`, `align`, `addrspace`, `section`, `alias`, `module`, `asm`, `sideeffect`, `gc`, `dbg`, `linker_private_weak`, `attributes`, `blockaddress`, `initialexec`, `localdynamic`, `localexec`, `prefix`, `unnamed_addr`, `ccc`, `fastcc`, `coldcc`, `x86_stdcallcc`, `x86_fastcallcc`, `arm_apcscc`, `arm_aapcscc`, `arm_aapcs_vfpcc`, `ptx_device`, `ptx_kernel`, `intel_ocl_bicc`, `msp430_intrcc`, `spir_func`, `spir_kernel`, `x86_64_sysvcc`, `x86_64_win64cc`, `x86_thiscallcc`, `cc`, `c`, `signext`, `zeroext`, `inreg`, `sret`, `nounwind`, `noreturn`, `noalias`, `nocapture`, `byval`, `nest`, `readnone`, `readonly`, `inlinehint`, `noinline`, `alwaysinline`, `optsize`, `ssp`, `sspreq`, `noredzone`, `noimplicitfloat`, `naked`, `builtin`, `cold`, `nobuiltin`, `noduplicate`, `nonlazybind`, `optnone`, `returns_twice`, `sanitize_address`, `sanitize_memory`, `sanitize_thread`, `sspstrong`, `uwtable`, `returned`, `type`, `opaque`, `eq`, `ne`, `slt`, `sgt`, `sle`, `sge`, `ult`, `ugt`, `ule`, `uge`, `oeq`, `one`, `olt`, `ogt`, `ole`, `oge`, `ord`, `uno`, `ueq`, `une`, `x`, `acq_rel`, `acquire`, `alignstack`, `atomic`, `catch`, `cleanup`, `filter`, `inteldialect`, `max`, `min`, `monotonic`, `nand`, `personality`, `release`, `seq_cst`, `singlethread`, `umax`, `umin`, `unordered`, `xchg`, `add`, `fadd`, `sub`, `fsub`, `mul`, `fmul`, `udiv`, `sdiv`, `fdiv`, `urem`, `srem`, `frem`, `shl`, `lshr`, `ashr`, `and`, `or`, `xor`, `icmp`, `fcmp`, `phi`, `call`, `trunc`, `zext`, `sext`, `fptrunc`, `fpext`, `uitofp`, `sitofp`, `fptoui`, `fptosi`, `inttoptr`, `ptrtoint`, `bitcast`, `addrspacecast`, `select`, `va_arg`, `ret`, `br`, `switch`, `invoke`, `unwind`, `unreachable`, `indirectbr`, `landingpad`, `resume`, `malloc`, `alloca`, `free`, `load`, `store`, `getelementptr`, `extractelement`, `insertelement`, `shufflevector`, `getresult`, `extractvalue`, `insertvalue`, `atomicrmw`, `cmpxchg`, `fence`, `allocsize`, `amdgpu_cs`, `amdgpu_gs`, `amdgpu_kernel`, `amdgpu_ps`, `amdgpu_vs`, `any`, `anyregcc`, `argmemonly`, `avr_intrcc`, `avr_signalcc`, `caller`, `catchpad`, `catchret`, `catchswitch`, `cleanuppad`, `cleanupret`, `comdat`, `convergent`, `cxx_fast_tlscc`, `deplibs`, `dereferenceable`, `dereferenceable_or_null`, `distinct`, `exactmatch`, `externally_initialized`, `from`, `ghccc`, `hhvm_ccc`, `hhvmcc`, `ifunc`, `inaccessiblemem_or_argmemonly`, `inaccessiblememonly`, `inalloca`, `jumptable`, `largest`, `local_unnamed_addr`, `minsize`, `musttail`, `noduplicates`, `none`, `nonnull`, `norecurse`, `notail`, `preserve_allcc`, `preserve_mostcc`, `prologue`, `safestack`, `samesize`, `source_filename`, `swiftcc`, `swifterror`, `swiftself`, `webkit_jscc`, `within`, `writeonly`, `x86_intrcc`, `x86_vectorcallcc`), Keyword, nil}, + {Words(``, ``, `void`, `half`, `float`, `double`, `x86_fp80`, `fp128`, `ppc_fp128`, `label`, `metadata`, `token`), KeywordType, nil}, + {`i[1-9]\d*`, Keyword, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/l/lua.go b/vendor/github.com/alecthomas/chroma/lexers/l/lua.go new file mode 100644 index 0000000..db574a1 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/l/lua.go @@ -0,0 +1,79 @@ +package l + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Lua lexer. +var Lua = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Lua", + Aliases: []string{"lua"}, + Filenames: []string{"*.lua", "*.wlua"}, + MimeTypes: []string{"text/x-lua", "application/x-lua"}, + }, + luaRules, +)) + +func luaRules() Rules { + return Rules{ + "root": { + {`#!.*`, CommentPreproc, nil}, + Default(Push("base")), + }, + "ws": { + {`(?:--\[(=*)\[[\w\W]*?\](\1)\])`, CommentMultiline, nil}, + {`(?:--.*$)`, CommentSingle, nil}, + {`(?:\s+)`, Text, nil}, + }, + "base": { + Include("ws"), + {`(?i)0x[\da-f]*(\.[\da-f]*)?(p[+-]?\d+)?`, LiteralNumberHex, nil}, + {`(?i)(\d*\.\d+|\d+\.\d*)(e[+-]?\d+)?`, LiteralNumberFloat, nil}, + {`(?i)\d+e[+-]?\d+`, LiteralNumberFloat, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`(?s)\[(=*)\[.*?\]\1\]`, LiteralString, nil}, + {`::`, Punctuation, Push("label")}, + {`\.{3}`, Punctuation, nil}, + {`[=<>|~&+\-*/%#^]+|\.\.`, Operator, nil}, + {`[\[\]{}().,:;]`, Punctuation, nil}, + {`(and|or|not)\b`, OperatorWord, nil}, + {`(break|do|else|elseif|end|for|if|in|repeat|return|then|until|while)\b`, KeywordReserved, nil}, + {`goto\b`, KeywordReserved, Push("goto")}, + {`(local)\b`, KeywordDeclaration, nil}, + {`(true|false|nil)\b`, KeywordConstant, nil}, + {`(function)\b`, KeywordReserved, Push("funcname")}, + {`[A-Za-z_]\w*(\.[A-Za-z_]\w*)?`, Name, nil}, + {`'`, LiteralStringSingle, Combined("stringescape", "sqs")}, + {`"`, LiteralStringDouble, Combined("stringescape", "dqs")}, + }, + "funcname": { + Include("ws"), + {`[.:]`, Punctuation, nil}, + {`(?:[^\W\d]\w*)(?=(?:(?:--\[(=*)\[[\w\W]*?\](\2)\])|(?:--.*$)|(?:\s+))*[.:])`, NameClass, nil}, + {`(?:[^\W\d]\w*)`, NameFunction, Pop(1)}, + {`\(`, Punctuation, Pop(1)}, + }, + "goto": { + Include("ws"), + {`(?:[^\W\d]\w*)`, NameLabel, Pop(1)}, + }, + "label": { + Include("ws"), + {`::`, Punctuation, Pop(1)}, + {`(?:[^\W\d]\w*)`, NameLabel, nil}, + }, + "stringescape": { + {`\\([abfnrtv\\"\']|[\r\n]{1,2}|z\s*|x[0-9a-fA-F]{2}|\d{1,3}|u\{[0-9a-fA-F]+\})`, LiteralStringEscape, nil}, + }, + "sqs": { + {`'`, LiteralStringSingle, Pop(1)}, + {`[^\\']+`, LiteralStringSingle, nil}, + }, + "dqs": { + {`"`, LiteralStringDouble, Pop(1)}, + {`[^\\"]+`, LiteralStringDouble, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/lexers.go b/vendor/github.com/alecthomas/chroma/lexers/lexers.go new file mode 100644 index 0000000..2b42921 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/lexers.go @@ -0,0 +1,60 @@ +// Package lexers contains the registry of all lexers. +// +// Sub-packages contain lexer implementations. +package lexers + +// nolint +import ( + "github.com/alecthomas/chroma" + _ "github.com/alecthomas/chroma/lexers/a" + _ "github.com/alecthomas/chroma/lexers/b" + _ "github.com/alecthomas/chroma/lexers/c" + _ "github.com/alecthomas/chroma/lexers/circular" + _ "github.com/alecthomas/chroma/lexers/d" + _ "github.com/alecthomas/chroma/lexers/e" + _ "github.com/alecthomas/chroma/lexers/f" + _ "github.com/alecthomas/chroma/lexers/g" + _ "github.com/alecthomas/chroma/lexers/h" + _ "github.com/alecthomas/chroma/lexers/i" + "github.com/alecthomas/chroma/lexers/internal" + _ "github.com/alecthomas/chroma/lexers/j" + _ "github.com/alecthomas/chroma/lexers/k" + _ "github.com/alecthomas/chroma/lexers/l" + _ "github.com/alecthomas/chroma/lexers/m" + _ "github.com/alecthomas/chroma/lexers/n" + _ "github.com/alecthomas/chroma/lexers/o" + _ "github.com/alecthomas/chroma/lexers/p" + _ "github.com/alecthomas/chroma/lexers/q" + _ "github.com/alecthomas/chroma/lexers/r" + _ "github.com/alecthomas/chroma/lexers/s" + _ "github.com/alecthomas/chroma/lexers/t" + _ "github.com/alecthomas/chroma/lexers/v" + _ "github.com/alecthomas/chroma/lexers/w" + _ "github.com/alecthomas/chroma/lexers/x" + _ "github.com/alecthomas/chroma/lexers/y" + _ "github.com/alecthomas/chroma/lexers/z" +) + +// Registry of Lexers. +var Registry = internal.Registry + +// Names of all lexers, optionally including aliases. +func Names(withAliases bool) []string { return internal.Names(withAliases) } + +// Get a Lexer by name, alias or file extension. +func Get(name string) chroma.Lexer { return internal.Get(name) } + +// MatchMimeType attempts to find a lexer for the given MIME type. +func MatchMimeType(mimeType string) chroma.Lexer { return internal.MatchMimeType(mimeType) } + +// Match returns the first lexer matching filename. +func Match(filename string) chroma.Lexer { return internal.Match(filename) } + +// Analyse text content and return the "best" lexer.. +func Analyse(text string) chroma.Lexer { return internal.Analyse(text) } + +// Register a Lexer with the global registry. +func Register(lexer chroma.Lexer) chroma.Lexer { return internal.Register(lexer) } + +// Fallback lexer if no other is found. +var Fallback = internal.Fallback diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/make.go b/vendor/github.com/alecthomas/chroma/lexers/m/make.go new file mode 100644 index 0000000..905491a --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/m/make.go @@ -0,0 +1,58 @@ +package m + +import ( + . "github.com/alecthomas/chroma" // nolint + . "github.com/alecthomas/chroma/lexers/b" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Makefile lexer. +var Makefile = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Base Makefile", + Aliases: []string{"make", "makefile", "mf", "bsdmake"}, + Filenames: []string{"*.mak", "*.mk", "Makefile", "makefile", "Makefile.*", "GNUmakefile"}, + MimeTypes: []string{"text/x-makefile"}, + EnsureNL: true, + }, + makefileRules, +)) + +func makefileRules() Rules { + return Rules{ + "root": { + {`^(?:[\t ]+.*\n|\n)+`, Using(Bash), nil}, + {`\$[<@$+%?|*]`, Keyword, nil}, + {`\s+`, Text, nil}, + {`#.*?\n`, Comment, nil}, + {`(export)(\s+)(?=[\w${}\t -]+\n)`, ByGroups(Keyword, Text), Push("export")}, + {`export\s+`, Keyword, nil}, + {`([\w${}().-]+)(\s*)([!?:+]?=)([ \t]*)((?:.*\\\n)+|.*\n)`, ByGroups(NameVariable, Text, Operator, Text, Using(Bash)), nil}, + {`(?s)"(\\\\|\\.|[^"\\])*"`, LiteralStringDouble, nil}, + {`(?s)'(\\\\|\\.|[^'\\])*'`, LiteralStringSingle, nil}, + {`([^\n:]+)(:+)([ \t]*)`, ByGroups(NameFunction, Operator, Text), Push("block-header")}, + {`\$\(`, Keyword, Push("expansion")}, + }, + "expansion": { + {`[^$a-zA-Z_()]+`, Text, nil}, + {`[a-zA-Z_]+`, NameVariable, nil}, + {`\$`, Keyword, nil}, + {`\(`, Keyword, Push()}, + {`\)`, Keyword, Pop(1)}, + }, + "export": { + {`[\w${}-]+`, NameVariable, nil}, + {`\n`, Text, Pop(1)}, + {`\s+`, Text, nil}, + }, + "block-header": { + {`[,|]`, Punctuation, nil}, + {`#.*?\n`, Comment, Pop(1)}, + {`\\\n`, Text, nil}, + {`\$\(`, Keyword, Push("expansion")}, + {`[a-zA-Z_]+`, Name, nil}, + {`\n`, Text, Pop(1)}, + {`.`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/mako.go b/vendor/github.com/alecthomas/chroma/lexers/m/mako.go new file mode 100644 index 0000000..6f777dd --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/m/mako.go @@ -0,0 +1,64 @@ +package m + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" + . "github.com/alecthomas/chroma/lexers/p" // nolint +) + +// Mako lexer. +var Mako = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Mako", + Aliases: []string{"mako"}, + Filenames: []string{"*.mao"}, + MimeTypes: []string{"application/x-mako"}, + }, + makoRules, +)) + +func makoRules() Rules { + return Rules{ + "root": { + {`(\s*)(%)(\s*end(?:\w+))(\n|\Z)`, ByGroups(Text, CommentPreproc, Keyword, Other), nil}, + {`(\s*)(%)([^\n]*)(\n|\Z)`, ByGroups(Text, CommentPreproc, Using(Python), Other), nil}, + {`(\s*)(##[^\n]*)(\n|\Z)`, ByGroups(Text, CommentPreproc, Other), nil}, + {`(?s)<%doc>.*?`, CommentPreproc, nil}, + {`(<%)([\w.:]+)`, ByGroups(CommentPreproc, NameBuiltin), Push("tag")}, + {`()`, ByGroups(CommentPreproc, NameBuiltin, CommentPreproc), nil}, + {`<%(?=([\w.:]+))`, CommentPreproc, Push("ondeftags")}, + {`(<%(?:!?))(.*?)(%>)(?s)`, ByGroups(CommentPreproc, Using(Python), CommentPreproc), nil}, + {`(\$\{)(.*?)(\})`, ByGroups(CommentPreproc, Using(Python), CommentPreproc), nil}, + {`(?sx) + (.+?) # anything, followed by: + (?: + (?<=\n)(?=%|\#\#) | # an eval or comment line + (?=\#\*) | # multiline comment + (?=`, CommentPreproc, Pop(1)}, + {`\s+`, Text, nil}, + }, + "attr": { + {`".*?"`, LiteralString, Pop(1)}, + {`'.*?'`, LiteralString, Pop(1)}, + {`[^\s>]+`, LiteralString, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/markdown.go b/vendor/github.com/alecthomas/chroma/lexers/m/markdown.go new file mode 100644 index 0000000..e50e470 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/m/markdown.go @@ -0,0 +1,53 @@ +package m + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/h" + "github.com/alecthomas/chroma/lexers/internal" +) + +// Markdown lexer. +var Markdown = internal.Register(DelegatingLexer(h.HTML, MustNewLazyLexer( + &Config{ + Name: "markdown", + Aliases: []string{"md", "mkd"}, + Filenames: []string{"*.md", "*.mkd", "*.markdown"}, + MimeTypes: []string{"text/x-markdown"}, + }, + markdownRules, +))) + +func markdownRules() Rules { + return Rules{ + "root": { + {`^(#[^#].+\n)`, ByGroups(GenericHeading), nil}, + {`^(#{2,6}.+\n)`, ByGroups(GenericSubheading), nil}, + {`^(\s*)([*-] )(\[[ xX]\])( .+\n)`, ByGroups(Text, Keyword, Keyword, UsingSelf("inline")), nil}, + {`^(\s*)([*-])(\s)(.+\n)`, ByGroups(Text, Keyword, Text, UsingSelf("inline")), nil}, + {`^(\s*)([0-9]+\.)( .+\n)`, ByGroups(Text, Keyword, UsingSelf("inline")), nil}, + {`^(\s*>\s)(.+\n)`, ByGroups(Keyword, GenericEmph), nil}, + {"^(```\\n)([\\w\\W]*?)(^```$)", ByGroups(String, Text, String), nil}, + { + "^(```)(\\w+)(\\n)([\\w\\W]*?)(^```$)", + UsingByGroup( + internal.Get, + 2, 4, + String, String, String, Text, String, + ), + nil, + }, + Include("inline"), + }, + "inline": { + {`\\.`, Text, nil}, + {`(\s)(\*|_)((?:(?!\2).)*)(\2)((?=\W|\n))`, ByGroups(Text, GenericEmph, GenericEmph, GenericEmph, Text), nil}, + {`(\s)((\*\*|__).*?)\3((?=\W|\n))`, ByGroups(Text, GenericStrong, GenericStrong, Text), nil}, + {`(\s)(~~[^~]+~~)((?=\W|\n))`, ByGroups(Text, GenericDeleted, Text), nil}, + {"`[^`]+`", LiteralStringBacktick, nil}, + {`[@#][\w/:]+`, NameEntity, nil}, + {`(!?\[)([^]]+)(\])(\()([^)]+)(\))`, ByGroups(Text, NameTag, Text, Text, NameAttribute, Text), nil}, + {`[^\\\s]+`, Other, nil}, + {`.|\n`, Other, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/mason.go b/vendor/github.com/alecthomas/chroma/lexers/m/mason.go new file mode 100644 index 0000000..bc48f5c --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/m/mason.go @@ -0,0 +1,47 @@ +package m + +import ( + . "github.com/alecthomas/chroma" // nolint + . "github.com/alecthomas/chroma/lexers/h" // nolint + "github.com/alecthomas/chroma/lexers/internal" + . "github.com/alecthomas/chroma/lexers/p" // nolint +) + +// Mason lexer. +var Mason = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Mason", + Aliases: []string{"mason"}, + Filenames: []string{"*.m", "*.mhtml", "*.mc", "*.mi", "autohandler", "dhandler"}, + MimeTypes: []string{"application/x-mason"}, + Priority: 0.1, + }, + masonRules, +)) + +func masonRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`(<%doc>)(.*?)()(?s)`, ByGroups(NameTag, CommentMultiline, NameTag), nil}, + {`(<%(?:def|method))(\s*)(.*?)(>)(.*?)()(?s)`, ByGroups(NameTag, Text, NameFunction, NameTag, UsingSelf("root"), NameTag), nil}, + {`(<%\w+)(.*?)(>)(.*?)()(?s)`, ByGroups(NameTag, NameFunction, NameTag, Using(Perl), NameTag), nil}, + {`(<&[^|])(.*?)(,.*?)?(&>)(?s)`, ByGroups(NameTag, NameFunction, Using(Perl), NameTag), nil}, + {`(<&\|)(.*?)(,.*?)?(&>)(?s)`, ByGroups(NameTag, NameFunction, Using(Perl), NameTag), nil}, + {``, NameTag, nil}, + {`(<%!?)(.*?)(%>)(?s)`, ByGroups(NameTag, Using(Perl), NameTag), nil}, + {`(?<=^)#[^\n]*(\n|\Z)`, Comment, nil}, + {`(?<=^)(%)([^\n]*)(\n|\Z)`, ByGroups(NameTag, Using(Perl), Other), nil}, + {`(?sx) + (.+?) # anything, followed by: + (?: + (?<=\n)(?=[%#]) | # an eval or comment line + (?=`, `:>`, `/.`, `+`, `-`, `*`, `/`, `^`, `&&`, `||`, `!`, `<>`, `|`, `/;`, `?`, `@`, `//`, `/@`, `@@`, `@@@`, `~~`, `===`, `&`, `<`, `>`, `<=`, `>=`), Operator, nil}, + {Words(``, ``, `,`, `;`, `(`, `)`, `[`, `]`, `{`, `}`), Punctuation, nil}, + {`".*?"`, LiteralString, nil}, + {`\s+`, TextWhitespace, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/matlab.go b/vendor/github.com/alecthomas/chroma/lexers/m/matlab.go new file mode 100644 index 0000000..4e98d69 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/m/matlab.go @@ -0,0 +1,55 @@ +package m + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Matlab lexer. +var Matlab = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Matlab", + Aliases: []string{"matlab"}, + Filenames: []string{"*.m"}, + MimeTypes: []string{"text/matlab"}, + }, + matlabRules, +)) + +func matlabRules() Rules { + return Rules{ + "root": { + {`\n`, Text, nil}, + {`^!.*`, LiteralStringOther, nil}, + {`%\{\s*\n`, CommentMultiline, Push("blockcomment")}, + {`%.*$`, Comment, nil}, + {`^\s*function`, Keyword, Push("deffunc")}, + {Words(``, `\b`, `break`, `case`, `catch`, `classdef`, `continue`, `else`, `elseif`, `end`, `enumerated`, `events`, `for`, `function`, `global`, `if`, `methods`, `otherwise`, `parfor`, `persistent`, `properties`, `return`, `spmd`, `switch`, `try`, `while`), Keyword, nil}, + {`(sin|sind|sinh|asin|asind|asinh|cos|cosd|cosh|acos|acosd|acosh|tan|tand|tanh|atan|atand|atan2|atanh|sec|secd|sech|asec|asecd|asech|csc|cscd|csch|acsc|acscd|acsch|cot|cotd|coth|acot|acotd|acoth|hypot|exp|expm1|log|log1p|log10|log2|pow2|realpow|reallog|realsqrt|sqrt|nthroot|nextpow2|abs|angle|complex|conj|imag|real|unwrap|isreal|cplxpair|fix|floor|ceil|round|mod|rem|sign|airy|besselj|bessely|besselh|besseli|besselk|beta|betainc|betaln|ellipj|ellipke|erf|erfc|erfcx|erfinv|expint|gamma|gammainc|gammaln|psi|legendre|cross|dot|factor|isprime|primes|gcd|lcm|rat|rats|perms|nchoosek|factorial|cart2sph|cart2pol|pol2cart|sph2cart|hsv2rgb|rgb2hsv|zeros|ones|eye|repmat|rand|randn|linspace|logspace|freqspace|meshgrid|accumarray|size|length|ndims|numel|disp|isempty|isequal|isequalwithequalnans|cat|reshape|diag|blkdiag|tril|triu|fliplr|flipud|flipdim|rot90|find|end|sub2ind|ind2sub|bsxfun|ndgrid|permute|ipermute|shiftdim|circshift|squeeze|isscalar|isvector|ans|eps|realmax|realmin|pi|i|inf|nan|isnan|isinf|isfinite|j|why|compan|gallery|hadamard|hankel|hilb|invhilb|magic|pascal|rosser|toeplitz|vander|wilkinson)\b`, NameBuiltin, nil}, + {`\.\.\..*$`, Comment, nil}, + {`-|==|~=|<|>|<=|>=|&&|&|~|\|\|?`, Operator, nil}, + {`\.\*|\*|\+|\.\^|\.\\|\.\/|\/|\\`, Operator, nil}, + {`\[|\]|\(|\)|\{|\}|:|@|\.|,`, Punctuation, nil}, + {`=|:|;`, Punctuation, nil}, + {`(?<=[\w)\].])\'+`, Operator, nil}, + {`(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`\d+[eEf][+-]?[0-9]+`, LiteralNumberFloat, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`(?=]|<=|>=)`, Punctuation, nil}, + Include("simplevalue"), + {`\s+`, TextWhitespace, nil}, + }, + } + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/meson.go b/vendor/github.com/alecthomas/chroma/lexers/m/meson.go new file mode 100644 index 0000000..2a6a22f --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/m/meson.go @@ -0,0 +1,51 @@ +package m + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Meson lexer. +var Meson = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Meson", + Aliases: []string{"meson", "meson.build"}, + Filenames: []string{"meson.build", "meson_options.txt"}, + MimeTypes: []string{"text/x-meson"}, + }, + func() Rules { + return Rules{ + "root": { + {`#.*?$`, Comment, nil}, + {`'''.*'''`, LiteralStringSingle, nil}, + {`[1-9][0-9]*`, LiteralNumberInteger, nil}, + {`0o[0-7]+`, LiteralNumberOct, nil}, + {`0x[a-fA-F0-9]+`, LiteralNumberHex, nil}, + Include("string"), + Include("keywords"), + Include("expr"), + {`[a-zA-Z_][a-zA-Z_0-9]*`, Name, nil}, + {`\s+`, TextWhitespace, nil}, + }, + "string": { + {`[']{3}([']{0,2}([^\\']|\\(.|\n)))*[']{3}`, LiteralString, nil}, + {`'.*?(?/-]`, Operator, nil}, + {`[()\[\],.]`, Punctuation, nil}, + {Words(``, `\b`, `break`, `case`, `const`, `continue`, `do`, `else`, `enum`, `extern`, `for`, `if`, `return`, `sizeof`, `static`, `struct`, `switch`, `typedef`, `union`, `while`), Keyword, nil}, + {`(bool|float|half|long|ptrdiff_t|size_t|unsigned|u?char|u?int((8|16|32|64)_t)?|u?short)\b`, KeywordType, nil}, + {`(bool|float|half|u?(char|int|long|short))(2|3|4)\b`, KeywordType, nil}, + {`packed_(float|half|long|u?(char|int|short))(2|3|4)\b`, KeywordType, nil}, + {`(float|half)(2|3|4)x(2|3|4)\b`, KeywordType, nil}, + {`atomic_u?int\b`, KeywordType, nil}, + {`(rg?(8|16)(u|s)norm|rgba(8|16)(u|s)norm|srgba8unorm|rgb10a2|rg11b10f|rgb9e5)\b`, KeywordType, nil}, + {`(array|depth(2d|cube)(_array)?|depth2d_ms(_array)?|sampler|texture_buffer|texture(1|2)d(_array)?|texture2d_ms(_array)?|texture3d|texturecube(_array)?|uniform|visible_function_table)\b`, KeywordType, nil}, + {`(true|false|NULL)\b`, NameBuiltin, nil}, + {Words(``, `\b`, `device`, `constant`, `ray_data`, `thread`, `threadgroup`, `threadgroup_imageblock`), Keyword, nil}, + {`([a-zA-Z_]\w*)(\s*)(:)(?!:)`, ByGroups(NameLabel, Text, Punctuation), nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + }, + "root": { + Include("whitespace"), + {`(fragment|kernel|vertex)?((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;{]*)(\{)`, ByGroups(Keyword, UsingSelf("root"), NameFunction, UsingSelf("root"), UsingSelf("root"), Punctuation), Push("function")}, + {`(fragment|kernel|vertex)?((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;]*)(;)`, ByGroups(Keyword, UsingSelf("root"), NameFunction, UsingSelf("root"), UsingSelf("root"), Punctuation), nil}, + Default(Push("statement")), + }, + "classname": { + {`(\[\[.+\]\])(\s*)`, ByGroups(NameAttribute, Text), nil}, + {`[a-zA-Z_]\w*`, NameClass, Pop(1)}, + {`\s*(?=[>{])`, Text, Pop(1)}, + }, + "whitespace": { + {`^#if\s+0`, CommentPreproc, Push("if0")}, + {`^#`, CommentPreproc, Push("macro")}, + {`^(\s*(?:/[*].*?[*]/\s*)?)(#if\s+0)`, ByGroups(UsingSelf("root"), CommentPreproc), Push("if0")}, + {`^(\s*(?:/[*].*?[*]/\s*)?)(#)`, ByGroups(UsingSelf("root"), CommentPreproc), Push("macro")}, + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`\\\n`, Text, nil}, + {`//(\n|[\w\W]*?[^\\]\n)`, CommentSingle, nil}, + {`/(\\\n)?[*][\w\W]*?[*](\\\n)?/`, CommentMultiline, nil}, + {`/(\\\n)?[*][\w\W]*`, CommentMultiline, nil}, + }, + "statement": { + Include("whitespace"), + Include("statements"), + {`[{]`, Punctuation, Push("root")}, + {`[;}]`, Punctuation, Pop(1)}, + }, + "function": { + Include("whitespace"), + Include("statements"), + {`;`, Punctuation, nil}, + {`\{`, Punctuation, Push()}, + {`\}`, Punctuation, Pop(1)}, + }, + "macro": { + {`(include)(\s*(?:/[*].*?[*]/\s*)?)([^\n]+)`, ByGroups(CommentPreproc, Text, CommentPreprocFile), nil}, + {`[^/\n]+`, CommentPreproc, nil}, + {`/[*](.|\n)*?[*]/`, CommentMultiline, nil}, + {`//.*?\n`, CommentSingle, Pop(1)}, + {`/`, CommentPreproc, nil}, + {`(?<=\\)\n`, CommentPreproc, nil}, + {`\n`, CommentPreproc, Pop(1)}, + }, + "if0": { + {`^\s*#if.*?(?|->|<-|\\/|xor|/\\)`, Operator, nil}, + {`(<|>|<=|>=|==|=|!=)`, Operator, nil}, + {`(\+|-|\*|/|div|mod)`, Operator, nil}, + {Words(`\b`, `\b`, `in`, `subset`, `superset`, `union`, `diff`, `symdiff`, `intersect`), Operator, nil}, + {`(\\|\.\.|\+\+)`, Operator, nil}, + {`[|()\[\]{},:;]`, Punctuation, nil}, + {`(true|false)\b`, KeywordConstant, nil}, + {`([+-]?)\d+(\.(?!\.)\d*)?([eE][-+]?\d+)?`, LiteralNumber, nil}, + {`::\s*([^\W\d]\w*)(\s*\([^\)]*\))?`, NameDecorator, nil}, + {`\b([^\W\d]\w*)\b(\()`, ByGroups(NameFunction, Punctuation), nil}, + {`[^\W\d]\w*`, NameOther, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/mlir.go b/vendor/github.com/alecthomas/chroma/lexers/m/mlir.go new file mode 100644 index 0000000..112a1c3 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/m/mlir.go @@ -0,0 +1,47 @@ +package m + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// MLIR lexer. +var Mlir = internal.Register(MustNewLazyLexer( + &Config{ + Name: "MLIR", + Aliases: []string{"mlir"}, + Filenames: []string{"*.mlir"}, + MimeTypes: []string{"text/x-mlir"}, + }, + mlirRules, +)) + +func mlirRules() Rules { + return Rules{ + "root": { + Include("whitespace"), + {`c?"[^"]*?"`, LiteralString, nil}, + {`\^([-a-zA-Z$._][\w\-$.0-9]*)\s*`, NameLabel, nil}, + {`([\w\d_$.]+)\s*=`, NameLabel, nil}, + Include("keyword"), + {`->`, Punctuation, nil}, + {`@([\w_][\w\d_$.]*)`, NameFunction, nil}, + {`[%#][\w\d_$.]+`, NameVariable, nil}, + {`([1-9?][\d?]*\s*x)+`, LiteralNumber, nil}, + {`0[xX][a-fA-F0-9]+`, LiteralNumber, nil}, + {`-?\d+(?:[.]\d+)?(?:[eE][-+]?\d+(?:[.]\d+)?)?`, LiteralNumber, nil}, + {`[=<>{}\[\]()*.,!:]|x\b`, Punctuation, nil}, + {`[\w\d]+`, Text, nil}, + }, + "whitespace": { + {`(\n|\s)+`, Text, nil}, + {`//.*?\n`, Comment, nil}, + }, + "keyword": { + {Words(``, ``, `constant`, `return`), KeywordType, nil}, + {Words(``, ``, `func`, `loc`, `memref`, `tensor`, `vector`), KeywordType, nil}, + {`bf16|f16|f32|f64|index`, Keyword, nil}, + {`i[1-9]\d*`, Keyword, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/modula2.go b/vendor/github.com/alecthomas/chroma/lexers/m/modula2.go new file mode 100644 index 0000000..6ab05c9 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/m/modula2.go @@ -0,0 +1,119 @@ +package m + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Modula-2 lexer. +var Modula2 = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Modula-2", + Aliases: []string{"modula2", "m2"}, + Filenames: []string{"*.def", "*.mod"}, + MimeTypes: []string{"text/x-modula2"}, + DotAll: true, + }, + modula2Rules, +)) + +func modula2Rules() Rules { + return Rules{ + "whitespace": { + {`\n+`, Text, nil}, + {`\s+`, Text, nil}, + }, + "dialecttags": { + {`\(\*!m2pim\*\)`, CommentSpecial, nil}, + {`\(\*!m2iso\*\)`, CommentSpecial, nil}, + {`\(\*!m2r10\*\)`, CommentSpecial, nil}, + {`\(\*!objm2\*\)`, CommentSpecial, nil}, + {`\(\*!m2iso\+aglet\*\)`, CommentSpecial, nil}, + {`\(\*!m2pim\+gm2\*\)`, CommentSpecial, nil}, + {`\(\*!m2iso\+p1\*\)`, CommentSpecial, nil}, + {`\(\*!m2iso\+xds\*\)`, CommentSpecial, nil}, + }, + "identifiers": { + {`([a-zA-Z_$][\w$]*)`, Name, nil}, + }, + "prefixed_number_literals": { + {`0b[01]+(\'[01]+)*`, LiteralNumberBin, nil}, + {`0[ux][0-9A-F]+(\'[0-9A-F]+)*`, LiteralNumberHex, nil}, + }, + "plain_number_literals": { + {`[0-9]+(\'[0-9]+)*\.[0-9]+(\'[0-9]+)*[eE][+-]?[0-9]+(\'[0-9]+)*`, LiteralNumberFloat, nil}, + {`[0-9]+(\'[0-9]+)*\.[0-9]+(\'[0-9]+)*`, LiteralNumberFloat, nil}, + {`[0-9]+(\'[0-9]+)*`, LiteralNumberInteger, nil}, + }, + "suffixed_number_literals": { + {`[0-7]+B`, LiteralNumberOct, nil}, + {`[0-7]+C`, LiteralNumberOct, nil}, + {`[0-9A-F]+H`, LiteralNumberHex, nil}, + }, + "string_literals": { + {`'(\\\\|\\'|[^'])*'`, LiteralString, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + }, + "digraph_operators": { + {`\*\.`, Operator, nil}, + {`\+>`, Operator, nil}, + {`<>`, Operator, nil}, + {`<=`, Operator, nil}, + {`>=`, Operator, nil}, + {`==`, Operator, nil}, + {`::`, Operator, nil}, + {`:=`, Operator, nil}, + {`\+\+`, Operator, nil}, + {`--`, Operator, nil}, + }, + "unigraph_operators": { + {`[+-]`, Operator, nil}, + {`[*/]`, Operator, nil}, + {`\\`, Operator, nil}, + {`[=#<>]`, Operator, nil}, + {`\^`, Operator, nil}, + {`@`, Operator, nil}, + {`&`, Operator, nil}, + {`~`, Operator, nil}, + {"`", Operator, nil}, + }, + "digraph_punctuation": { + {`\.\.`, Punctuation, nil}, + {`<<`, Punctuation, nil}, + {`>>`, Punctuation, nil}, + {`->`, Punctuation, nil}, + {`\|#`, Punctuation, nil}, + {`##`, Punctuation, nil}, + {`\|\*`, Punctuation, nil}, + }, + "unigraph_punctuation": { + {`[()\[\]{},.:;|]`, Punctuation, nil}, + {`!`, Punctuation, nil}, + {`\?`, Punctuation, nil}, + }, + "comments": { + {`^//.*?\n`, CommentSingle, nil}, + {`\(\*([^$].*?)\*\)`, CommentMultiline, nil}, + {`/\*(.*?)\*/`, CommentMultiline, nil}, + }, + "pragmas": { + {`<\*.*?\*>`, CommentPreproc, nil}, + {`\(\*\$.*?\*\)`, CommentPreproc, nil}, + }, + "root": { + Include("whitespace"), + Include("dialecttags"), + Include("pragmas"), + Include("comments"), + Include("identifiers"), + Include("suffixed_number_literals"), + Include("prefixed_number_literals"), + Include("plain_number_literals"), + Include("string_literals"), + Include("digraph_punctuation"), + Include("digraph_operators"), + Include("unigraph_punctuation"), + Include("unigraph_operators"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/monkeyc.go b/vendor/github.com/alecthomas/chroma/lexers/m/monkeyc.go new file mode 100644 index 0000000..8ad81cc --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/m/monkeyc.go @@ -0,0 +1,66 @@ +package m + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +var MonkeyC = internal.Register(MustNewLazyLexer( + &Config{ + Name: "MonkeyC", + Aliases: []string{"monkeyc"}, + Filenames: []string{"*.mc"}, + MimeTypes: []string{"text/x-monkeyc"}, + }, + monkeyCRules, +)) + +func monkeyCRules() Rules { + return Rules{ + "root": { + {`[^\S\n]+`, Text, nil}, + {`\n`, Text, nil}, + {`//(\n|[\w\W]*?[^\\]\n)`, CommentSingle, nil}, + {`/(\\\n)?[*][\w\W]*?[*](\\\n)?/`, CommentMultiline, nil}, + {`/(\\\n)?[*][\w\W]*`, CommentMultiline, nil}, + {`:[a-zA-Z_][\w_\.]*`, StringSymbol, nil}, + {`[{}\[\]\(\),;:\.]`, Punctuation, nil}, + {`[&~\|\^!+\-*\/%=?]`, Operator, nil}, + {`=>|[+-]=|&&|\|\||>>|<<|[<>]=?|[!=]=`, Operator, nil}, + {`\b(and|or|instanceof|has|extends|new)`, OperatorWord, nil}, + {Words(``, `\b`, `NaN`, `null`, `true`, `false`), KeywordConstant, nil}, + {`(using)((?:\s|\\\\s)+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + {`(class)((?:\s|\\\\s)+)`, ByGroups(KeywordDeclaration, Text), Push("class")}, + {`(function)((?:\s|\\\\s)+)`, ByGroups(KeywordDeclaration, Text), Push("function")}, + {`(module)((?:\s|\\\\s)+)`, ByGroups(KeywordDeclaration, Text), Push("module")}, + {`\b(if|else|for|switch|case|while|break|continue|default|do|try|catch|finally|return|throw|extends|function)\b`, Keyword, nil}, + {`\b(const|enum|hidden|public|protected|private|static)\b`, KeywordType, nil}, + {`\bvar\b`, KeywordDeclaration, nil}, + {`\b(Activity(Monitor|Recording)?|Ant(Plus)?|Application|Attention|Background|Communications|Cryptography|FitContributor|Graphics|Gregorian|Lang|Math|Media|Persisted(Content|Locations)|Position|Properties|Sensor(History|Logging)?|Storage|StringUtil|System|Test|Time(r)?|Toybox|UserProfile|WatchUi|Rez|Drawables|Strings|Fonts|method)\b`, NameBuiltin, nil}, + {`\b(me|self|\$)\b`, NameBuiltinPseudo, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`'(\\\\|\\'|[^''])*'`, LiteralStringSingle, nil}, + {`-?(0x[0-9a-fA-F]+l?)`, NumberHex, nil}, + {`-?([0-9]+(\.[0-9]+[df]?|[df]))\b`, NumberFloat, nil}, + {`-?([0-9]+l?)`, NumberInteger, nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + }, + "import": { + {`([a-zA-Z_][\w_\.]*)(?:(\s+)(as)(\s+)([a-zA-Z_][\w_]*))?`, ByGroups(NameNamespace, Text, KeywordNamespace, Text, NameNamespace), nil}, + Default(Pop(1)), + }, + "class": { + {`([a-zA-Z_][\w_\.]*)(?:(\s+)(extends)(\s+)([a-zA-Z_][\w_\.]*))?`, ByGroups(NameClass, Text, KeywordDeclaration, Text, NameClass), nil}, + Default(Pop(1)), + }, + "function": { + {`initialize`, NameFunctionMagic, nil}, + {`[a-zA-Z_][\w_\.]*`, NameFunction, nil}, + Default(Pop(1)), + }, + "module": { + {`[a-zA-Z_][\w_\.]*`, NameNamespace, nil}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/mwscript.go b/vendor/github.com/alecthomas/chroma/lexers/m/mwscript.go new file mode 100644 index 0000000..0ba0ba9 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/m/mwscript.go @@ -0,0 +1,57 @@ +package m + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// MorrowindScript lexer. +var MorrowindScript = internal.Register(MustNewLazyLexer( + &Config{ + Name: "MorrowindScript", + Aliases: []string{"morrowind", "mwscript"}, + Filenames: []string{}, + MimeTypes: []string{}, + }, + morrowindScriptRules, +)) + +func morrowindScriptRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`;.*$`, Comment, nil}, + {`(["'])(?:(?=(\\?))\2.)*?\1`, LiteralString, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`[0-9]+\.[0-9]*(?!\.)`, LiteralNumberFloat, nil}, + Include("keywords"), + Include("types"), + Include("builtins"), + Include("punct"), + Include("operators"), + {`\n`, Text, nil}, + {`\S+\s+`, Text, nil}, + {`[a-zA-Z0-9_]\w*`, Name, nil}, + }, + "keywords": { + {`(?i)(begin|if|else|elseif|endif|while|endwhile|return|to)\b`, Keyword, nil}, + {`(?i)(end)\b`, Keyword, nil}, + {`(?i)(end)\w+.*$`, Text, nil}, + {`[\w+]->[\w+]`, Operator, nil}, + }, + "builtins": { + {`(?i)(Activate|AddItem|AddSoulGem|AddSpell|AddToLevCreature|AddToLevItem|AddTopic|AIActivate|AIEscort|AIEscortCell|AIFollow|AiFollowCell|AITravel|AIWander|BecomeWerewolf|Cast|ChangeWeather|Choice|ClearForceJump|ClearForceMoveJump|ClearForceRun|ClearForceSneak|ClearInfoActor|Disable|DisableLevitation|DisablePlayerControls|DisablePlayerFighting|DisablePlayerJumping|DisablePlayerLooking|DisablePlayerMagic|DisablePlayerViewSwitch|DisableTeleporting|DisableVanityMode|DontSaveObject|Drop|Enable|EnableBirthMenu|EnableClassMenu|EnableInventoryMenu|EnableLevelUpMenu|EnableLevitation|EnableMagicMenu|EnableMapMenu|EnableNameMenu|EnablePlayerControls|EnablePlayerFighting|EnablePlayerJumping|EnablePlayerLooking|EnablePlayerMagic|EnablePlayerViewSwitch|EnableRaceMenu|EnableRest|EnableStatsMenu|EnableTeleporting|EnableVanityMode|Equip|ExplodeSpell|Face|FadeIn|FadeOut|FadeTo|Fall|ForceGreeting|ForceJump|ForceRun|ForceSneak|Flee|GotoJail|HurtCollidingActor|HurtStandingActor|Journal|Lock|LoopGroup|LowerRank|MenuTest|MessageBox|ModAcrobatics|ModAgility|ModAlarm|ModAlchemy|ModAlteration|ModArmorBonus|ModArmorer|ModAthletics|ModAttackBonus|ModAxe|ModBlock|ModBluntWeapon|ModCastPenalty|ModChameleon|ModConjuration|ModCurrentFatigue|ModCurrentHealth|ModCurrentMagicka|ModDefendBonus|ModDestruction|ModDisposition|ModEnchant|ModEndurance|ModFactionReaction|ModFatigue|ModFight|ModFlee|ModFlying|ModHandToHand|ModHealth|ModHeavyArmor|ModIllusion|ModIntelligence|ModInvisible|ModLightArmor|ModLongBlade|ModLuck|ModMagicka|ModMarksman|ModMediumArmor|ModMercantile|ModMysticism|ModParalysis|ModPCCrimeLevel|ModPCFacRep|ModPersonality|ModRegion|ModReputation|ModResistBlight|ModResistCorprus|ModResistDisease|ModResistFire|ModResistFrost|ModResistMagicka|ModResistNormalWeapons|ModResistParalysis|ModResistPoison|ModResistShock|ModRestoration|ModScale|ModSecurity|ModShortBlade|ModSilence|ModSneak|ModSpear|ModSpeechcraft|ModSpeed|ModStrength|ModSuperJump|ModSwimSpeed|ModUnarmored|ModWaterBreathing|ModWaterLevel|ModWaterWalking|ModWillpower|Move|MoveWorld|PayFine|PayFineThief|PCClearExpelled|PCExpell|PCForce1stPerson|PCForce3rdPerson|PCJoinFaction|PCLowerRank|PCRaiseRank|PlaceAtMe|PlaceAtPC|PlaceItem|PlaceItemCell|PlayBink|PlayGroup|PlayLoopSound3D|PlayLoopSound3DVP|PlaySound|PlaySound3D|PlaySound3DVP|PlaySoundVP|Position|PositionCell|RaiseRank|RemoveEffects|RemoveFromLevCreature|RemoveFromLevItem|RemoveItem|RemoveSoulgem|RemoveSpell|RemoveSpellEffects|ResetActors|Resurrect|Rotate|RotateWorld|Say|StartScript|[S|s]et|SetAcrobatics|SetAgility|SetAlarm|SetAlchemy|SetAlteration|SetAngle|SetArmorBonus|SetArmorer|SetAthletics|SetAtStart|SetAttackBonus|SetAxe|SetBlock|SetBluntWeapon|SetCastPenalty|SetChameleon|SetConjuration|SetDelete|SetDefendBonus|SetDestruction|SetDisposition|SetEnchant|SetEndurance|SetFactionReaction|SetFatigue|SetFight|SetFlee|SetFlying|SetHandToHand|SetHealth|SetHeavyArmor|SetIllusion|SetIntelligence|SetInvisible|SetJournalIndex|SetLightArmor|SetLevel|SetLongBlade|SetLuck|SetMagicka|SetMarksman|SetMediumArmor|SetMercantile|SetMysticism|SetParalysis|SetPCCCrimeLevel|SetPCFacRep|SetPersonality|SetPos|SetReputation|SetResistBlight|SetResistCorprus|SetResistDisease|SetResistFire|SetResistFrost|SetResistMagicka|SetResistNormalWeapons|SetResistParalysis|SetResistPoison|SetResistShock|SetRestoration|SetScale|SetSecurity|SetShortBlade|SetSilence|SetSneak|SetSpear|SetSpeechcraft|SetSpeed|SetStrength|SetSuperJump|SetSwimSpeed|SetUnarmored|SetWaterBreathing|SetWaterlevel|SetWaterWalking|SetWerewolfAcrobatics|SetWillpower|ShowMap|ShowRestMenu|SkipAnim|StartCombat|StopCombat|StopScript|StopSound|StreamMusic|TurnMoonRed|TurnMoonWhite|UndoWerewolf|Unlock|WakeUpPC|CenterOnCell|CenterOnExterior|FillMap|FixMe|ToggleAI|ToggleCollision|ToggleFogOfWar|ToggleGodMode|ToggleMenus|ToggleSky|ToggleWorld|ToggleVanityMode|CellChanged|GetAcrobatics|GetAgility|GetAIPackageDone|GetAlarm|GetAlchemy|GetAlteration|GetAngle|GetArmorBonus|GetArmorer|GetAthletics|GetAttackBonus|GetAttacked|GetArmorType,|GetAxe|GetBlightDisease|GetBlock|GetBluntWeapon|GetButtonPressed|GetCastPenalty|GetChameleon|GetCollidingActor|GetCollidingPC|GetCommonDisease|GetConjuration|GetCurrentAIPackage|GetCurrentTime|GetCurrentWeather|GetDeadCount|GetDefendBonus|GetDestruction|GetDetected|GetDisabled|GetDisposition|GetDistance|GetEffect|GetEnchant|GetEndurance|GetFatigue|GetFight|GetFlee|GetFlying|GetForceJump|GetForceRun|GetForceSneak|GetHandToHand|GetHealth|GetHealthGetRatio|GetHeavyArmor|GetIllusion|GetIntelligence|GetInterior|GetInvisible|GetItemCount|GetJournalIndex|GetLightArmor|GetLineOfSight|GetLOS|GetLevel|GetLocked|GetLongBlade|GetLuck|GetMagicka|GetMarksman|GetMasserPhase|GetSecundaPhase|GetMediumArmor|GetMercantile|GetMysticism|GetParalysis|GetPCCell|GetPCCrimeLevel|GetPCinJail|GetPCJumping|GetPCRank|GetPCRunning|GetPCSleep|GetPCSneaking|GetPCTraveling|GetPersonality|GetPlayerControlsDisabled|GetPlayerFightingDisabled|GetPlayerJumpingDisabled|GetPlayerLookingDisabled|GetPlayerMagicDisabled|GetPos|GetRace|GetReputation|GetResistBlight|GetResistCorprus|GetResistDisease|GetResistFire|GetResistFrost|GetResistMagicka|GetResistNormalWeapons|GetResistParalysis|GetResistPoison|GetResistShock|GetRestoration|GetScale|GetSecondsPassed|GetSecurity|GetShortBlade|GetSilence|GetSneak|GetSoundPlaying|GetSpear|GetSpeechcraft|GetSpeed|GetSpell|GetSpellEffects|GetSpellReadied|GetSquareRoot|GetStandingActor|GetStandingPC|GetStrength|GetSuperJump|GetSwimSpeed|GetTarget|GetUnarmored|GetVanityModeDisabled|GetWaterBreathing|GetWaterLevel|GetWaterWalking|GetWeaponDrawn|GetWeaponType|GetWerewolfKills|GetWillpower|GetWindSpeed|HasItemEquipped|HasSoulgem|HitAttemptOnMe|HitOnMe|IsWerewolf|MenuMode|OnActivate|OnDeath|OnKnockout|OnMurder|PCExpelled|PCGet3rdPerson|PCKnownWerewolf|Random|RepairedOnMe|SameFaction|SayDone|ScriptRunning|AllowWereWolfForceGreeting|Companion|MinimumProfit|NoFlee|NoHello|NoIdle|NoLore|OnPCAdd|OnPCDrop|OnPCEquip|OnPCHitMe|OnPCRepair|PCSkipEquip|OnPCSoulGemUse|StayOutside|CrimeGoldDiscount|CrimeGoldTurnIn|Day|DaysPassed|GameHour|Month|NPCVoiceDistance|PCRace|PCWerewolf|PCVampire|TimeScale|VampClan|Year)\b`, NameBuiltin, nil}, + {`(?i)(sEffectWaterBreathing|sEffectSwiftSwim|sEffectWaterWalking|sEffectShield|sEffectFireShield|sEffectLightningShield|sEffectFrostShield|sEffectBurden|sEffectFeather|sEffectJump|sEffectLevitate|sEffectSlowFall|sEffectLock|sEffectOpen|sEffectFireDamage|sEffectShockDamage|sEffectFrostDamage|sEffectDrainAttribute|sEffectDrainHealth|sEffectDrainSpellpoints|sEffectDrainFatigue|sEffectDrainSkill|sEffectDamageAttribute|sEffectDamageHealth|sEffectDamageMagicka|sEffectDamageFatigue|sEffectDamageSkill|sEffectPoison|sEffectWeaknessToFire|sEffectWeaknessToFrost|sEffectWeaknessToShock|sEffectWeaknessToMagicka|sEffectWeaknessToCommonDisease|sEffectWeaknessToBlightDisease|sEffectWeaknessToCorprusDisease|sEffectWeaknessToPoison|sEffectWeaknessToNormalWeapons|sEffectDisintegrateWeapon|sEffectDisintegrateArmor|sEffectInvisibility|sEffectChameleon|sEffectLight|sEffectSanctuary|sEffectNightEye|sEffectCharm|sEffectParalyze|sEffectSilence|sEffectBlind|sEffectSound|sEffectCalmHumanoid|sEffectCalmCreature|sEffectFrenzyHumanoid|sEffectFrenzyCreature|sEffectDemoralizeHumanoid|sEffectDemoralizeCreature|sEffectRallyHumanoid|sEffectRallyCreature|sEffectDispel|sEffectSoultrap|sEffectTelekinesis|sEffectMark|sEffectRecall|sEffectDivineIntervention|sEffectAlmsiviIntervention|sEffectDetectAnimal|sEffectDetectEnchantment|sEffectDetectKey|sEffectSpellAbsorption|sEffectReflect|sEffectCureCommonDisease|sEffectCureBlightDisease|sEffectCureCorprusDisease|sEffectCurePoison|sEffectCureParalyzation|sEffectRestoreAttribute|sEffectRestoreHealth|sEffectRestoreSpellPoints|sEffectRestoreFatigue|sEffectRestoreSkill|sEffectFortifyAttribute|sEffectFortifyHealth|sEffectFortifySpellpoints|sEffectFortifyFatigue|sEffectFortifySkill|sEffectFortifyMagickaMultiplier|sEffectAbsorbAttribute|sEffectAbsorbHealth|sEffectAbsorbSpellPoints|sEffectAbsorbFatigue|sEffectAbsorbSkill|sEffectResistFire|sEffectResistFrost|sEffectResistShock|sEffectResistMagicka|sEffectResistCommonDisease|sEffectResistBlightDisease|sEffectResistCorprusDisease|sEffectResistPoison|sEffectResistNormalWeapons|sEffectResistParalysis|sEffectRemoveCurse|sEffectTurnUndead|sEffectSummonScamp|sEffectSummonClannfear|sEffectSummonDaedroth|sEffectSummonDremora|sEffectSummonAncestralGhost|sEffectSummonSkeletalMinion|sEffectSummonLeastBonewalker|sEffectSummonGreaterBonewalker|sEffectSummonBonelord|sEffectSummonWingedTwilight|sEffectSummonHunger|sEffectSummonGoldensaint|sEffectSummonFlameAtronach|sEffectSummonFrostAtronach|sEffectSummonStormAtronach|sEffectFortifyAttackBonus|sEffectCommandCreatures|sEffectCommandHumanoids|sEffectBoundDagger|sEffectBoundLongsword|sEffectBoundMace|sEffectBoundBattleAxe|sEffectBoundSpear|sEffectBoundLongbow|sEffectExtraSpell|sEffectBoundCuirass|sEffectBoundHelm|sEffectBoundBoots|sEffectBoundShield|sEffectBoundGloves|sEffectCorpus|sEffectVampirism|sEffectSummonCenturionSphere|sEffectSunDamage|sEffectStuntedMagicka)`, NameBuiltin, nil}, + }, + "types": { + {`(?i)(short|long|float)\b`, KeywordType, nil}, + }, + "punct": { + {`[()]`, Punctuation, nil}, + }, + "operators": { + {`[#=,./%+\-?]`, Operator, nil}, + {`(==|<=|<|>=|>|!=)`, Operator, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/myghty.go b/vendor/github.com/alecthomas/chroma/lexers/m/myghty.go new file mode 100644 index 0000000..eac082c --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/m/myghty.go @@ -0,0 +1,44 @@ +package m + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" + . "github.com/alecthomas/chroma/lexers/p" // nolint +) + +// Myghty lexer. +var Myghty = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Myghty", + Aliases: []string{"myghty"}, + Filenames: []string{"*.myt", "autodelegate"}, + MimeTypes: []string{"application/x-myghty"}, + }, + myghtyRules, +)) + +func myghtyRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`(<%(?:def|method))(\s*)(.*?)(>)(.*?)()(?s)`, ByGroups(NameTag, Text, NameFunction, NameTag, UsingSelf("root"), NameTag), nil}, + {`(<%\w+)(.*?)(>)(.*?)()(?s)`, ByGroups(NameTag, NameFunction, NameTag, Using(Python2), NameTag), nil}, + {`(<&[^|])(.*?)(,.*?)?(&>)`, ByGroups(NameTag, NameFunction, Using(Python2), NameTag), nil}, + {`(<&\|)(.*?)(,.*?)?(&>)(?s)`, ByGroups(NameTag, NameFunction, Using(Python2), NameTag), nil}, + {``, NameTag, nil}, + {`(<%!?)(.*?)(%>)(?s)`, ByGroups(NameTag, Using(Python2), NameTag), nil}, + {`(?<=^)#[^\n]*(\n|\Z)`, Comment, nil}, + {`(?<=^)(%)([^\n]*)(\n|\Z)`, ByGroups(NameTag, Using(Python2), Other), nil}, + {`(?sx) + (.+?) # anything, followed by: + (?: + (?<=\n)(?=[%#]) | # an eval or comment line + (?== 1 && nameBetweenBacktickCount >= (2*nameBetweenBracketCount) { + // Found at least twice as many `name` as [name]. + result += 0.5 + } else if nameBetweenBacktickCount > nameBetweenBracketCount { + result += 0.2 + } else if nameBetweenBacktickCount > 0 { + result += 0.1 + } + + return result +})) + +func mySQLRules() Rules { + return Rules{ + "root": { + {`\s+`, TextWhitespace, nil}, + {`(#|--\s+).*\n?`, CommentSingle, nil}, + {`/\*`, CommentMultiline, Push("multiline-comments")}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`[0-9]*\.[0-9]+(e[+-][0-9]+)`, LiteralNumberFloat, nil}, + {`((?:_[a-z0-9]+)?)(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Push("string")}, + {`((?:_[a-z0-9]+)?)(")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Push("double-string")}, + {"[+*/<>=~!@#%^&|`?-]", Operator, nil}, + {`\b(tinyint|smallint|mediumint|int|integer|bigint|date|datetime|time|bit|bool|tinytext|mediumtext|longtext|text|tinyblob|mediumblob|longblob|blob|float|double|double\s+precision|real|numeric|dec|decimal|timestamp|year|char|varchar|varbinary|varcharacter|enum|set)(\b\s*)(\()?`, ByGroups(KeywordType, TextWhitespace, Punctuation), nil}, + {`\b(add|all|alter|analyze|and|as|asc|asensitive|before|between|bigint|binary|blob|both|by|call|cascade|case|change|char|character|check|collate|column|condition|constraint|continue|convert|create|cross|current_date|current_time|current_timestamp|current_user|cursor|database|databases|day_hour|day_microsecond|day_minute|day_second|dec|decimal|declare|default|delayed|delete|desc|describe|deterministic|distinct|distinctrow|div|double|drop|dual|each|else|elseif|enclosed|escaped|exists|exit|explain|fetch|flush|float|float4|float8|for|force|foreign|from|fulltext|grant|group|having|high_priority|hour_microsecond|hour_minute|hour_second|identified|if|ignore|in|index|infile|inner|inout|insensitive|insert|int|int1|int2|int3|int4|int8|integer|interval|into|is|iterate|join|key|keys|kill|leading|leave|left|like|limit|lines|load|localtime|localtimestamp|lock|long|loop|low_priority|match|minute_microsecond|minute_second|mod|modifies|natural|no_write_to_binlog|not|numeric|on|optimize|option|optionally|or|order|out|outer|outfile|precision|primary|privileges|procedure|purge|raid0|read|reads|real|references|regexp|release|rename|repeat|replace|require|restrict|return|revoke|right|rlike|schema|schemas|second_microsecond|select|sensitive|separator|set|show|smallint|soname|spatial|specific|sql|sql_big_result|sql_calc_found_rows|sql_small_result|sqlexception|sqlstate|sqlwarning|ssl|starting|straight_join|table|terminated|then|to|trailing|trigger|undo|union|unique|unlock|unsigned|update|usage|use|user|using|utc_date|utc_time|utc_timestamp|values|varying|when|where|while|with|write|x509|xor|year_month|zerofill)\b`, Keyword, nil}, + {`\b(auto_increment|engine|charset|tables)\b`, KeywordPseudo, nil}, + {`(true|false|null)`, NameConstant, nil}, + {`([a-z_]\w*)(\s*)(\()`, ByGroups(NameFunction, TextWhitespace, Punctuation), nil}, + {`[a-z_]\w*`, Name, nil}, + {`@[a-z0-9]*[._]*[a-z0-9]*`, NameVariable, nil}, + {`[;:()\[\],.]`, Punctuation, nil}, + }, + "multiline-comments": { + {`/\*`, CommentMultiline, Push("multiline-comments")}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[^/*]+`, CommentMultiline, nil}, + {`[/*]`, CommentMultiline, nil}, + }, + "string": { + {`[^']+`, LiteralStringSingle, nil}, + {`''`, LiteralStringSingle, nil}, + {`'`, LiteralStringSingle, Pop(1)}, + }, + "double-string": { + {`[^"]+`, LiteralStringDouble, nil}, + {`""`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/n/nasm.go b/vendor/github.com/alecthomas/chroma/lexers/n/nasm.go new file mode 100644 index 0000000..de6734e --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/n/nasm.go @@ -0,0 +1,63 @@ +package n + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Nasm lexer. +var Nasm = internal.Register(MustNewLazyLexer( + &Config{ + Name: "NASM", + Aliases: []string{"nasm"}, + Filenames: []string{"*.asm", "*.ASM"}, + MimeTypes: []string{"text/x-nasm"}, + CaseInsensitive: true, + }, + nasmRules, +)) + +func nasmRules() Rules { + return Rules{ + "root": { + {`^\s*%`, CommentPreproc, Push("preproc")}, + Include("whitespace"), + {`[a-z$._?][\w$.?#@~]*:`, NameLabel, nil}, + {`([a-z$._?][\w$.?#@~]*)(\s+)(equ)`, ByGroups(NameConstant, KeywordDeclaration, KeywordDeclaration), Push("instruction-args")}, + {`BITS|USE16|USE32|SECTION|SEGMENT|ABSOLUTE|EXTERN|GLOBAL|ORG|ALIGN|STRUC|ENDSTRUC|COMMON|CPU|GROUP|UPPERCASE|IMPORT|EXPORT|LIBRARY|MODULE`, Keyword, Push("instruction-args")}, + {`(?:res|d)[bwdqt]|times`, KeywordDeclaration, Push("instruction-args")}, + {`[a-z$._?][\w$.?#@~]*`, NameFunction, Push("instruction-args")}, + {`[\r\n]+`, Text, nil}, + }, + "instruction-args": { + {"\"(\\\\\"|[^\"\\n])*\"|'(\\\\'|[^'\\n])*'|`(\\\\`|[^`\\n])*`", LiteralString, nil}, + {`(?:0x[0-9a-f]+|$0[0-9a-f]*|[0-9]+[0-9a-f]*h)`, LiteralNumberHex, nil}, + {`[0-7]+q`, LiteralNumberOct, nil}, + {`[01]+b`, LiteralNumberBin, nil}, + {`[0-9]+\.e?[0-9]+`, LiteralNumberFloat, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + Include("punctuation"), + {`r[0-9][0-5]?[bwd]|[a-d][lh]|[er]?[a-d]x|[er]?[sb]p|[er]?[sd]i|[c-gs]s|st[0-7]|mm[0-7]|cr[0-4]|dr[0-367]|tr[3-7]`, NameBuiltin, nil}, + {`[a-z$._?][\w$.?#@~]*`, NameVariable, nil}, + {`[\r\n]+`, Text, Pop(1)}, + Include("whitespace"), + }, + "preproc": { + {`[^;\n]+`, CommentPreproc, nil}, + {`;.*?\n`, CommentSingle, Pop(1)}, + {`\n`, CommentPreproc, Pop(1)}, + }, + "whitespace": { + {`\n`, Text, nil}, + {`[ \t]+`, Text, nil}, + {`;.*`, CommentSingle, nil}, + }, + "punctuation": { + {`[,():\[\]]+`, Punctuation, nil}, + {`[&|^<>+*/%~-]+`, Operator, nil}, + {`[$]+`, KeywordConstant, nil}, + {`seg|wrt|strict`, OperatorWord, nil}, + {`byte|[dq]?word`, KeywordType, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/n/newspeak.go b/vendor/github.com/alecthomas/chroma/lexers/n/newspeak.go new file mode 100644 index 0000000..c9d3ae0 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/n/newspeak.go @@ -0,0 +1,59 @@ +package n + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Newspeak lexer. +var Newspeak = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Newspeak", + Aliases: []string{"newspeak"}, + Filenames: []string{"*.ns2"}, + MimeTypes: []string{"text/x-newspeak"}, + }, + newspeakRules, +)) + +func newspeakRules() Rules { + return Rules{ + "root": { + {`\b(Newsqueak2)\b`, KeywordDeclaration, nil}, + {`'[^']*'`, LiteralString, nil}, + {`\b(class)(\s+)(\w+)(\s*)`, ByGroups(KeywordDeclaration, Text, NameClass, Text), nil}, + {`\b(mixin|self|super|private|public|protected|nil|true|false)\b`, Keyword, nil}, + {`(\w+\:)(\s*)([a-zA-Z_]\w+)`, ByGroups(NameFunction, Text, NameVariable), nil}, + {`(\w+)(\s*)(=)`, ByGroups(NameAttribute, Text, Operator), nil}, + {`<\w+>`, CommentSpecial, nil}, + Include("expressionstat"), + Include("whitespace"), + }, + "expressionstat": { + {`(\d+\.\d*|\.\d+|\d+[fF])[fF]?`, LiteralNumberFloat, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`:\w+`, NameVariable, nil}, + {`(\w+)(::)`, ByGroups(NameVariable, Operator), nil}, + {`\w+:`, NameFunction, nil}, + {`\w+`, NameVariable, nil}, + {`\(|\)`, Punctuation, nil}, + {`\[|\]`, Punctuation, nil}, + {`\{|\}`, Punctuation, nil}, + {`(\^|\+|\/|~|\*|<|>|=|@|%|\||&|\?|!|,|-|:)`, Operator, nil}, + {`\.|;`, Punctuation, nil}, + Include("whitespace"), + Include("literals"), + }, + "literals": { + {`\$.`, LiteralString, nil}, + {`'[^']*'`, LiteralString, nil}, + {`#'[^']*'`, LiteralStringSymbol, nil}, + {`#\w+:?`, LiteralStringSymbol, nil}, + {`#(\+|\/|~|\*|<|>|=|@|%|\||&|\?|!|,|-)+`, LiteralStringSymbol, nil}, + }, + "whitespace": { + {`\s+`, Text, nil}, + {`"[^"]*"`, Comment, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/n/nginx.go b/vendor/github.com/alecthomas/chroma/lexers/n/nginx.go new file mode 100644 index 0000000..6d80523 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/n/nginx.go @@ -0,0 +1,51 @@ +package n + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Nginx Configuration File lexer. +var Nginx = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Nginx configuration file", + Aliases: []string{"nginx"}, + Filenames: []string{"nginx.conf"}, + MimeTypes: []string{"text/x-nginx-conf"}, + }, + nginxRules, +)) + +func nginxRules() Rules { + return Rules{ + "root": { + {`(include)(\s+)([^\s;]+)`, ByGroups(Keyword, Text, Name), nil}, + {`[^\s;#]+`, Keyword, Push("stmt")}, + Include("base"), + }, + "block": { + {`\}`, Punctuation, Pop(2)}, + {`[^\s;#]+`, KeywordNamespace, Push("stmt")}, + Include("base"), + }, + "stmt": { + {`\{`, Punctuation, Push("block")}, + {`;`, Punctuation, Pop(1)}, + Include("base"), + }, + "base": { + {`#.*\n`, CommentSingle, nil}, + {`on|off`, NameConstant, nil}, + {`\$[^\s;#()]+`, NameVariable, nil}, + {`([a-z0-9.-]+)(:)([0-9]+)`, ByGroups(Name, Punctuation, LiteralNumberInteger), nil}, + {`[a-z-]+/[a-z-+]+`, LiteralString, nil}, + {`[0-9]+[km]?\b`, LiteralNumberInteger, nil}, + {`(~)(\s*)([^\s{]+)`, ByGroups(Punctuation, Text, LiteralStringRegex), nil}, + {`[:=~]`, Punctuation, nil}, + {`[^\s;#{}$]+`, LiteralString, nil}, + {`/[^\s;#]*`, Name, nil}, + {`\s+`, Text, nil}, + {`[$;]`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/n/nim.go b/vendor/github.com/alecthomas/chroma/lexers/n/nim.go new file mode 100644 index 0000000..3f98086 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/n/nim.go @@ -0,0 +1,97 @@ +package n + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Nim lexer. +var Nim = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Nim", + Aliases: []string{"nim", "nimrod"}, + Filenames: []string{"*.nim", "*.nimrod"}, + MimeTypes: []string{"text/x-nim"}, + CaseInsensitive: true, + }, + nimRules, +)) + +func nimRules() Rules { + return Rules{ + "root": { + {`#\[[\s\S]*?\]#`, CommentMultiline, nil}, + {`##.*$`, LiteralStringDoc, nil}, + {`#.*$`, Comment, nil}, + {`[*=><+\-/@$~&%!?|\\\[\]]`, Operator, nil}, + {"\\.\\.|\\.|,|\\[\\.|\\.\\]|\\{\\.|\\.\\}|\\(\\.|\\.\\)|\\{|\\}|\\(|\\)|:|\\^|`|;", Punctuation, nil}, + {`(?:[\w]+)"`, LiteralString, Push("rdqs")}, + {`"""`, LiteralString, Push("tdqs")}, + {`"`, LiteralString, Push("dqs")}, + {`'`, LiteralStringChar, Push("chars")}, + {`(a_?n_?d_?|o_?r_?|n_?o_?t_?|x_?o_?r_?|s_?h_?l_?|s_?h_?r_?|d_?i_?v_?|m_?o_?d_?|i_?n_?|n_?o_?t_?i_?n_?|i_?s_?|i_?s_?n_?o_?t_?)\b`, OperatorWord, nil}, + {`(p_?r_?o_?c_?\s)(?![(\[\]])`, Keyword, Push("funcname")}, + {`(a_?d_?d_?r_?|a_?n_?d_?|a_?s_?|a_?s_?m_?|a_?t_?o_?m_?i_?c_?|b_?i_?n_?d_?|b_?l_?o_?c_?k_?|b_?r_?e_?a_?k_?|c_?a_?s_?e_?|c_?a_?s_?t_?|c_?o_?n_?c_?e_?p_?t_?|c_?o_?n_?s_?t_?|c_?o_?n_?t_?i_?n_?u_?e_?|c_?o_?n_?v_?e_?r_?t_?e_?r_?|d_?e_?f_?e_?r_?|d_?i_?s_?c_?a_?r_?d_?|d_?i_?s_?t_?i_?n_?c_?t_?|d_?i_?v_?|d_?o_?|e_?l_?i_?f_?|e_?l_?s_?e_?|e_?n_?d_?|e_?n_?u_?m_?|e_?x_?c_?e_?p_?t_?|e_?x_?p_?o_?r_?t_?|f_?i_?n_?a_?l_?l_?y_?|f_?o_?r_?|f_?u_?n_?c_?|i_?f_?|i_?n_?|y_?i_?e_?l_?d_?|i_?n_?t_?e_?r_?f_?a_?c_?e_?|i_?s_?|i_?s_?n_?o_?t_?|i_?t_?e_?r_?a_?t_?o_?r_?|l_?e_?t_?|m_?a_?c_?r_?o_?|m_?e_?t_?h_?o_?d_?|m_?i_?x_?i_?n_?|m_?o_?d_?|n_?o_?t_?|n_?o_?t_?i_?n_?|o_?b_?j_?e_?c_?t_?|o_?f_?|o_?r_?|o_?u_?t_?|p_?r_?o_?c_?|p_?t_?r_?|r_?a_?i_?s_?e_?|r_?e_?f_?|r_?e_?t_?u_?r_?n_?|s_?h_?a_?r_?e_?d_?|s_?h_?l_?|s_?h_?r_?|s_?t_?a_?t_?i_?c_?|t_?e_?m_?p_?l_?a_?t_?e_?|t_?r_?y_?|t_?u_?p_?l_?e_?|t_?y_?p_?e_?|w_?h_?e_?n_?|w_?h_?i_?l_?e_?|w_?i_?t_?h_?|w_?i_?t_?h_?o_?u_?t_?|x_?o_?r_?)\b`, Keyword, nil}, + {`(f_?r_?o_?m_?|i_?m_?p_?o_?r_?t_?|i_?n_?c_?l_?u_?d_?e_?)\b`, KeywordNamespace, nil}, + {`(v_?a_?r)\b`, KeywordDeclaration, nil}, + {`(i_?n_?t_?|i_?n_?t_?8_?|i_?n_?t_?1_?6_?|i_?n_?t_?3_?2_?|i_?n_?t_?6_?4_?|f_?l_?o_?a_?t_?|f_?l_?o_?a_?t_?3_?2_?|f_?l_?o_?a_?t_?6_?4_?|b_?o_?o_?l_?|c_?h_?a_?r_?|r_?a_?n_?g_?e_?|a_?r_?r_?a_?y_?|s_?e_?q_?|s_?e_?t_?|s_?t_?r_?i_?n_?g_?)\b`, KeywordType, nil}, + {`(n_?i_?l_?|t_?r_?u_?e_?|f_?a_?l_?s_?e_?)\b`, KeywordPseudo, nil}, + {`\b_\b`, Name, nil}, // Standalone _ used as discardable variable identifier + {`\b((?![_\d])\w)(((?!_)\w)|(_(?!_)\w))*`, Name, nil}, + {`[0-9][0-9_]*(?=([e.]|\'f(32|64)))`, LiteralNumberFloat, Push("float-suffix", "float-number")}, + {`0x[a-f0-9][a-f0-9_]*`, LiteralNumberHex, Push("int-suffix")}, + {`0b[01][01_]*`, LiteralNumberBin, Push("int-suffix")}, + {`0o[0-7][0-7_]*`, LiteralNumberOct, Push("int-suffix")}, + {`[0-9][0-9_]*`, LiteralNumberInteger, Push("int-suffix")}, + {`\s+`, Text, nil}, + {`.+$`, Error, nil}, + }, + "chars": { + {`\\([\\abcefnrtvl"\']|x[a-f0-9]{2}|[0-9]{1,3})`, LiteralStringEscape, nil}, + {`'`, LiteralStringChar, Pop(1)}, + {`.`, LiteralStringChar, nil}, + }, + "strings": { + {`(? <= < >= > *")...), Operator, nil}, + {`[;:]`, Punctuation, nil}, + }, + "comment": { + {`\*/`, CommentMultiline, Pop(1)}, + {`.|\n`, CommentMultiline, nil}, + }, + "paren": { + {`\)`, Punctuation, Pop(1)}, + Include("root"), + }, + "list": { + {`\]`, Punctuation, Pop(1)}, + Include("root"), + }, + "qstring": { + {`"`, StringDouble, Pop(1)}, + {`\${`, StringInterpol, Push("interpol")}, + {`\\.`, StringEscape, nil}, + {`.|\n`, StringDouble, nil}, + }, + "istring": { + {`''\$`, StringEscape, nil}, // "$" + {`'''`, StringEscape, nil}, // "''" + {`''\\.`, StringEscape, nil}, // "\." + {`''`, StringSingle, Pop(1)}, + {`\${`, StringInterpol, Push("interpol")}, + // The next rule is important: "$" escapes any symbol except "{"! + {`\$.`, StringSingle, nil}, // "$." + {`.|\n`, StringSingle, nil}, + }, + "scope": { + {`}:`, Punctuation, Pop(1)}, + {`}`, Punctuation, Pop(1)}, + {`in` + nixb, Keyword, Pop(1)}, + {`\${`, StringInterpol, Push("interpol")}, + Include("root"), // "==" has to be above "=" + {Words(``, ``, strings.Fields("= ? ,")...), Operator, nil}, + }, + "interpol": { + {`}`, StringInterpol, Pop(1)}, + Include("root"), + }, + "id": { + {`[a-zA-Z_][a-zA-Z0-9_'-]*`, Name, nil}, + }, + "uri": { + {`[a-zA-Z][a-zA-Z0-9+.-]*:[a-zA-Z0-9%/?:@&=+$,_.!~*'-]+`, StringDoc, nil}, + }, + "path": { + {`[a-zA-Z0-9._+-]*(/[a-zA-Z0-9._+-]+)+`, StringRegex, nil}, + {`~(/[a-zA-Z0-9._+-]+)+/?`, StringRegex, nil}, + {`<[a-zA-Z0-9._+-]+(/[a-zA-Z0-9._+-]+)*>`, StringRegex, nil}, + }, + "int": { + {`-?[0-9]+` + nixb, NumberInteger, nil}, + }, + "float": { + {`-?(([1-9][0-9]*\.[0-9]*)|(0?\.[0-9]+))([Ee][+-]?[0-9]+)?` + nixb, NumberFloat, nil}, + }, + "space": { + {`[ \t\r\n]+`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/o/objectivec.go b/vendor/github.com/alecthomas/chroma/lexers/o/objectivec.go new file mode 100644 index 0000000..0ae3029 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/o/objectivec.go @@ -0,0 +1,169 @@ +package o + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Objective-C lexer. +var ObjectiveC = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Objective-C", + Aliases: []string{"objective-c", "objectivec", "obj-c", "objc"}, + Filenames: []string{"*.m", "*.h"}, + MimeTypes: []string{"text/x-objective-c"}, + }, + objectiveCRules, +)) + +func objectiveCRules() Rules { + return Rules{ + "statements": { + {`@"`, LiteralString, Push("string")}, + {`@(YES|NO)`, LiteralNumber, nil}, + {`@'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'`, LiteralStringChar, nil}, + {`@(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?`, LiteralNumberFloat, nil}, + {`@(\d+\.\d*|\.\d+|\d+[fF])[fF]?`, LiteralNumberFloat, nil}, + {`@0x[0-9a-fA-F]+[Ll]?`, LiteralNumberHex, nil}, + {`@0[0-7]+[Ll]?`, LiteralNumberOct, nil}, + {`@\d+[Ll]?`, LiteralNumberInteger, nil}, + {`@\(`, Literal, Push("literal_number")}, + {`@\[`, Literal, Push("literal_array")}, + {`@\{`, Literal, Push("literal_dictionary")}, + {Words(``, `\b`, `@selector`, `@private`, `@protected`, `@public`, `@encode`, `@synchronized`, `@try`, `@throw`, `@catch`, `@finally`, `@end`, `@property`, `@synthesize`, `__bridge`, `__bridge_transfer`, `__autoreleasing`, `__block`, `__weak`, `__strong`, `weak`, `strong`, `copy`, `retain`, `assign`, `unsafe_unretained`, `atomic`, `nonatomic`, `readonly`, `readwrite`, `setter`, `getter`, `typeof`, `in`, `out`, `inout`, `release`, `class`, `@dynamic`, `@optional`, `@required`, `@autoreleasepool`), Keyword, nil}, + {Words(``, `\b`, `id`, `instancetype`, `Class`, `IMP`, `SEL`, `BOOL`, `IBOutlet`, `IBAction`, `unichar`), KeywordType, nil}, + {`@(true|false|YES|NO)\n`, NameBuiltin, nil}, + {`(YES|NO|nil|self|super)\b`, NameBuiltin, nil}, + {`(Boolean|UInt8|SInt8|UInt16|SInt16|UInt32|SInt32)\b`, KeywordType, nil}, + {`(TRUE|FALSE)\b`, NameBuiltin, nil}, + {`(@interface|@implementation)(\s+)`, ByGroups(Keyword, Text), Push("#pop", "oc_classname")}, + {`(@class|@protocol)(\s+)`, ByGroups(Keyword, Text), Push("#pop", "oc_forward_classname")}, + {`@`, Punctuation, nil}, + {`(L?)(")`, ByGroups(LiteralStringAffix, LiteralString), Push("string")}, + {`(L?)(')(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])(')`, ByGroups(LiteralStringAffix, LiteralStringChar, LiteralStringChar, LiteralStringChar), nil}, + {`(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*`, LiteralNumberFloat, nil}, + {`(\d+\.\d*|\.\d+|\d+[fF])[fF]?`, LiteralNumberFloat, nil}, + {`0x[0-9a-fA-F]+[LlUu]*`, LiteralNumberHex, nil}, + {`0[0-7]+[LlUu]*`, LiteralNumberOct, nil}, + {`\d+[LlUu]*`, LiteralNumberInteger, nil}, + {`\*/`, Error, nil}, + {`[~!%^&*+=|?:<>/-]`, Operator, nil}, + {`[()\[\],.]`, Punctuation, nil}, + {Words(``, `\b`, `asm`, `auto`, `break`, `case`, `const`, `continue`, `default`, `do`, `else`, `enum`, `extern`, `for`, `goto`, `if`, `register`, `restricted`, `return`, `sizeof`, `static`, `struct`, `switch`, `typedef`, `union`, `volatile`, `while`), Keyword, nil}, + {`(bool|int|long|float|short|double|char|unsigned|signed|void)\b`, KeywordType, nil}, + {Words(``, `\b`, `inline`, `_inline`, `__inline`, `naked`, `restrict`, `thread`, `typename`), KeywordReserved, nil}, + {`(__m(128i|128d|128|64))\b`, KeywordReserved, nil}, + {Words(`__`, `\b`, `asm`, `int8`, `based`, `except`, `int16`, `stdcall`, `cdecl`, `fastcall`, `int32`, `declspec`, `finally`, `int64`, `try`, `leave`, `wchar_t`, `w64`, `unaligned`, `raise`, `noop`, `identifier`, `forceinline`, `assume`), KeywordReserved, nil}, + {`(true|false|NULL)\b`, NameBuiltin, nil}, + {`([a-zA-Z_]\w*)(\s*)(:)(?!:)`, ByGroups(NameLabel, Text, Punctuation), nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + }, + "oc_classname": { + {`([a-zA-Z$_][\w$]*)(\s*:\s*)([a-zA-Z$_][\w$]*)?(\s*)(\{)`, ByGroups(NameClass, Text, NameClass, Text, Punctuation), Push("#pop", "oc_ivars")}, + {`([a-zA-Z$_][\w$]*)(\s*:\s*)([a-zA-Z$_][\w$]*)?`, ByGroups(NameClass, Text, NameClass), Pop(1)}, + {`([a-zA-Z$_][\w$]*)(\s*)(\([a-zA-Z$_][\w$]*\))(\s*)(\{)`, ByGroups(NameClass, Text, NameLabel, Text, Punctuation), Push("#pop", "oc_ivars")}, + {`([a-zA-Z$_][\w$]*)(\s*)(\([a-zA-Z$_][\w$]*\))`, ByGroups(NameClass, Text, NameLabel), Pop(1)}, + {`([a-zA-Z$_][\w$]*)(\s*)(\{)`, ByGroups(NameClass, Text, Punctuation), Push("#pop", "oc_ivars")}, + {`([a-zA-Z$_][\w$]*)`, NameClass, Pop(1)}, + }, + "oc_forward_classname": { + {`([a-zA-Z$_][\w$]*)(\s*,\s*)`, ByGroups(NameClass, Text), Push("oc_forward_classname")}, + {`([a-zA-Z$_][\w$]*)(\s*;?)`, ByGroups(NameClass, Text), Pop(1)}, + }, + "oc_ivars": { + Include("whitespace"), + Include("statements"), + {`;`, Punctuation, nil}, + {`\{`, Punctuation, Push()}, + {`\}`, Punctuation, Pop(1)}, + }, + "root": { + {`^([-+])(\s*)(\(.*?\))?(\s*)([a-zA-Z$_][\w$]*:?)`, ByGroups(Punctuation, Text, UsingSelf("root"), Text, NameFunction), Push("method")}, + Include("whitespace"), + {`((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;{]*)(\{)`, ByGroups(UsingSelf("root"), NameFunction, UsingSelf("root"), UsingSelf("root"), Punctuation), Push("function")}, + {`((?:[\w*\s])+?(?:\s|[*]))([a-zA-Z_]\w*)(\s*\([^;]*?\))([^;]*)(;)`, ByGroups(UsingSelf("root"), NameFunction, UsingSelf("root"), UsingSelf("root"), Punctuation), nil}, + Default(Push("statement")), + }, + "method": { + Include("whitespace"), + {`,`, Punctuation, nil}, + {`\.\.\.`, Punctuation, nil}, + {`(\(.*?\))(\s*)([a-zA-Z$_][\w$]*)`, ByGroups(UsingSelf("root"), Text, NameVariable), nil}, + {`[a-zA-Z$_][\w$]*:`, NameFunction, nil}, + {`;`, Punctuation, Pop(1)}, + {`\{`, Punctuation, Push("function")}, + Default(Pop(1)), + }, + "literal_number": { + {`\(`, Punctuation, Push("literal_number_inner")}, + {`\)`, Literal, Pop(1)}, + Include("statement"), + }, + "literal_number_inner": { + {`\(`, Punctuation, Push()}, + {`\)`, Punctuation, Pop(1)}, + Include("statement"), + }, + "literal_array": { + {`\[`, Punctuation, Push("literal_array_inner")}, + {`\]`, Literal, Pop(1)}, + Include("statement"), + }, + "literal_array_inner": { + {`\[`, Punctuation, Push()}, + {`\]`, Punctuation, Pop(1)}, + Include("statement"), + }, + "literal_dictionary": { + {`\}`, Literal, Pop(1)}, + Include("statement"), + }, + "whitespace": { + {`^#if\s+0`, CommentPreproc, Push("if0")}, + {`^#`, CommentPreproc, Push("macro")}, + {`^(\s*(?:/[*].*?[*]/\s*)?)(#if\s+0)`, ByGroups(UsingSelf("root"), CommentPreproc), Push("if0")}, + {`^(\s*(?:/[*].*?[*]/\s*)?)(#)`, ByGroups(UsingSelf("root"), CommentPreproc), Push("macro")}, + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`\\\n`, Text, nil}, + {`//(\n|[\w\W]*?[^\\]\n)`, CommentSingle, nil}, + {`/(\\\n)?[*][\w\W]*?[*](\\\n)?/`, CommentMultiline, nil}, + {`/(\\\n)?[*][\w\W]*`, CommentMultiline, nil}, + }, + "statement": { + Include("whitespace"), + Include("statements"), + {`[{}]`, Punctuation, nil}, + {`;`, Punctuation, Pop(1)}, + }, + "function": { + Include("whitespace"), + Include("statements"), + {`;`, Punctuation, nil}, + {`\{`, Punctuation, Push()}, + {`\}`, Punctuation, Pop(1)}, + }, + "string": { + {`"`, LiteralString, Pop(1)}, + {`\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{8}|[0-7]{1,3})`, LiteralStringEscape, nil}, + {`[^\\"\n]+`, LiteralString, nil}, + {`\\\n`, LiteralString, nil}, + {`\\`, LiteralString, nil}, + }, + "macro": { + {`(include)(\s*(?:/[*].*?[*]/\s*)?)([^\n]+)`, ByGroups(CommentPreproc, Text, CommentPreprocFile), nil}, + {`[^/\n]+`, CommentPreproc, nil}, + {`/[*](.|\n)*?[*]/`, CommentMultiline, nil}, + {`//.*?\n`, CommentSingle, Pop(1)}, + {`/`, CommentPreproc, nil}, + {`(?<=\\)\n`, CommentPreproc, nil}, + {`\n`, CommentPreproc, Pop(1)}, + }, + "if0": { + {`^\s*#if.*?(?|\\[<|\\[|\\?\\?|\\?|>\\}|>]|>|=|<-|<|;;|;|:>|:=|::|:|\\.\\.|\\.|->|-\\.|-|,|\\+|\\*|\\)|\\(|&&|&|#|!=)", Operator, nil}, + {`([=<>@^|&+\*/$%-]|[!?~])?[!$%&*+\./:<=>?@^|~-]`, Operator, nil}, + {`\b(and|asr|land|lor|lsl|lxor|mod|or)\b`, OperatorWord, nil}, + {`\b(unit|int|float|bool|string|char|list|array)\b`, KeywordType, nil}, + {`[^\W\d][\w']*`, Name, nil}, + {`-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)`, LiteralNumberFloat, nil}, + {`0[xX][\da-fA-F][\da-fA-F_]*`, LiteralNumberHex, nil}, + {`0[oO][0-7][0-7_]*`, LiteralNumberOct, nil}, + {`0[bB][01][01_]*`, LiteralNumberBin, nil}, + {`\d[\d_]*`, LiteralNumberInteger, nil}, + {`'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'`, LiteralStringChar, nil}, + {`'.'`, LiteralStringChar, nil}, + {`'`, Keyword, nil}, + {`"`, LiteralStringDouble, Push("string")}, + {`[~?][a-z][\w\']*:`, NameVariable, nil}, + }, + "comment": { + {`[^(*)]+`, Comment, nil}, + {`\(\*`, Comment, Push()}, + {`\*\)`, Comment, Pop(1)}, + {`[(*)]`, Comment, nil}, + }, + "string": { + {`[^\\"]+`, LiteralStringDouble, nil}, + Include("escape-sequence"), + {`\\\n`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + "dotted": { + {`\s+`, Text, nil}, + {`\.`, Punctuation, nil}, + {`[A-Z][\w\']*(?=\s*\.)`, NameNamespace, nil}, + {`[A-Z][\w\']*`, NameClass, Pop(1)}, + {`[a-z_][\w\']*`, Name, Pop(1)}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/o/octave.go b/vendor/github.com/alecthomas/chroma/lexers/o/octave.go new file mode 100644 index 0000000..99fe298 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/o/octave.go @@ -0,0 +1,50 @@ +package o + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Octave lexer. +var Octave = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Octave", + Aliases: []string{"octave"}, + Filenames: []string{"*.m"}, + MimeTypes: []string{"text/octave"}, + }, + octaveRules, +)) + +func octaveRules() Rules { + return Rules{ + "root": { + {`[%#].*$`, Comment, nil}, + {`^\s*function`, Keyword, Push("deffunc")}, + {Words(``, `\b`, `__FILE__`, `__LINE__`, `break`, `case`, `catch`, `classdef`, `continue`, `do`, `else`, `elseif`, `end`, `end_try_catch`, `end_unwind_protect`, `endclassdef`, `endevents`, `endfor`, `endfunction`, `endif`, `endmethods`, `endproperties`, `endswitch`, `endwhile`, `events`, `for`, `function`, `get`, `global`, `if`, `methods`, `otherwise`, `persistent`, `properties`, `return`, `set`, `static`, `switch`, `try`, `until`, `unwind_protect`, `unwind_protect_cleanup`, `while`), Keyword, nil}, + {Words(``, `\b`, `addlistener`, `addpath`, `addproperty`, `all`, `and`, `any`, `argnames`, `argv`, `assignin`, `atexit`, `autoload`, `available_graphics_toolkits`, `beep_on_error`, `bitand`, `bitmax`, `bitor`, `bitshift`, `bitxor`, `cat`, `cell`, `cellstr`, `char`, `class`, `clc`, `columns`, `command_line_path`, `completion_append_char`, `completion_matches`, `complex`, `confirm_recursive_rmdir`, `cputime`, `crash_dumps_octave_core`, `ctranspose`, `cumprod`, `cumsum`, `debug_on_error`, `debug_on_interrupt`, `debug_on_warning`, `default_save_options`, `dellistener`, `diag`, `diff`, `disp`, `doc_cache_file`, `do_string_escapes`, `double`, `drawnow`, `e`, `echo_executing_commands`, `eps`, `eq`, `errno`, `errno_list`, `error`, `eval`, `evalin`, `exec`, `exist`, `exit`, `eye`, `false`, `fclear`, `fclose`, `fcntl`, `fdisp`, `feof`, `ferror`, `feval`, `fflush`, `fgetl`, `fgets`, `fieldnames`, `file_in_loadpath`, `file_in_path`, `filemarker`, `filesep`, `find_dir_in_path`, `fixed_point_format`, `fnmatch`, `fopen`, `fork`, `formula`, `fprintf`, `fputs`, `fread`, `freport`, `frewind`, `fscanf`, `fseek`, `fskipl`, `ftell`, `functions`, `fwrite`, `ge`, `genpath`, `get`, `getegid`, `getenv`, `geteuid`, `getgid`, `getpgrp`, `getpid`, `getppid`, `getuid`, `glob`, `gt`, `gui_mode`, `history_control`, `history_file`, `history_size`, `history_timestamp_format_string`, `home`, `horzcat`, `hypot`, `ifelse`, `ignore_function_time_stamp`, `inferiorto`, `info_file`, `info_program`, `inline`, `input`, `intmax`, `intmin`, `ipermute`, `is_absolute_filename`, `isargout`, `isbool`, `iscell`, `iscellstr`, `ischar`, `iscomplex`, `isempty`, `isfield`, `isfloat`, `isglobal`, `ishandle`, `isieee`, `isindex`, `isinteger`, `islogical`, `ismatrix`, `ismethod`, `isnull`, `isnumeric`, `isobject`, `isreal`, `is_rooted_relative_filename`, `issorted`, `isstruct`, `isvarname`, `kbhit`, `keyboard`, `kill`, `lasterr`, `lasterror`, `lastwarn`, `ldivide`, `le`, `length`, `link`, `linspace`, `logical`, `lstat`, `lt`, `make_absolute_filename`, `makeinfo_program`, `max_recursion_depth`, `merge`, `methods`, `mfilename`, `minus`, `mislocked`, `mkdir`, `mkfifo`, `mkstemp`, `mldivide`, `mlock`, `mouse_wheel_zoom`, `mpower`, `mrdivide`, `mtimes`, `munlock`, `nargin`, `nargout`, `native_float_format`, `ndims`, `ne`, `nfields`, `nnz`, `norm`, `not`, `numel`, `nzmax`, `octave_config_info`, `octave_core_file_limit`, `octave_core_file_name`, `octave_core_file_options`, `ones`, `or`, `output_max_field_width`, `output_precision`, `page_output_immediately`, `page_screen_output`, `path`, `pathsep`, `pause`, `pclose`, `permute`, `pi`, `pipe`, `plus`, `popen`, `power`, `print_empty_dimensions`, `printf`, `print_struct_array_contents`, `prod`, `program_invocation_name`, `program_name`, `putenv`, `puts`, `pwd`, `quit`, `rats`, `rdivide`, `readdir`, `readlink`, `read_readline_init_file`, `realmax`, `realmin`, `rehash`, `rename`, `repelems`, `re_read_readline_init_file`, `reset`, `reshape`, `resize`, `restoredefaultpath`, `rethrow`, `rmdir`, `rmfield`, `rmpath`, `rows`, `save_header_format_string`, `save_precision`, `saving_history`, `scanf`, `set`, `setenv`, `shell_cmd`, `sighup_dumps_octave_core`, `sigterm_dumps_octave_core`, `silent_functions`, `single`, `size`, `size_equal`, `sizemax`, `sizeof`, `sleep`, `source`, `sparse_auto_mutate`, `split_long_rows`, `sprintf`, `squeeze`, `sscanf`, `stat`, `stderr`, `stdin`, `stdout`, `strcmp`, `strcmpi`, `string_fill_char`, `strncmp`, `strncmpi`, `struct`, `struct_levels_to_print`, `strvcat`, `subsasgn`, `subsref`, `sum`, `sumsq`, `superiorto`, `suppress_verbose_help_message`, `symlink`, `system`, `tic`, `tilde_expand`, `times`, `tmpfile`, `tmpnam`, `toc`, `toupper`, `transpose`, `true`, `typeinfo`, `umask`, `uminus`, `uname`, `undo_string_escapes`, `unlink`, `uplus`, `upper`, `usage`, `usleep`, `vec`, `vectorize`, `vertcat`, `waitpid`, `warning`, `warranty`, `whos_line_format`, `yes_or_no`, `zeros`, `inf`, `Inf`, `nan`, `NaN`, `close`, `load`, `who`, `whos`, `accumarray`, `accumdim`, `acosd`, `acotd`, `acscd`, `addtodate`, `allchild`, `ancestor`, `anova`, `arch_fit`, `arch_rnd`, `arch_test`, `area`, `arma_rnd`, `arrayfun`, `ascii`, `asctime`, `asecd`, `asind`, `assert`, `atand`, `autoreg_matrix`, `autumn`, `axes`, `axis`, `bar`, `barh`, `bartlett`, `bartlett_test`, `beep`, `betacdf`, `betainv`, `betapdf`, `betarnd`, `bicgstab`, `bicubic`, `binary`, `binocdf`, `binoinv`, `binopdf`, `binornd`, `bitcmp`, `bitget`, `bitset`, `blackman`, `blanks`, `blkdiag`, `bone`, `box`, `brighten`, `calendar`, `cast`, `cauchy_cdf`, `cauchy_inv`, `cauchy_pdf`, `cauchy_rnd`, `caxis`, `celldisp`, `center`, `cgs`, `chisquare_test_homogeneity`, `chisquare_test_independence`, `circshift`, `cla`, `clabel`, `clf`, `clock`, `cloglog`, `closereq`, `colon`, `colorbar`, `colormap`, `colperm`, `comet`, `common_size`, `commutation_matrix`, `compan`, `compare_versions`, `compass`, `computer`, `cond`, `condest`, `contour`, `contourc`, `contourf`, `contrast`, `conv`, `convhull`, `cool`, `copper`, `copyfile`, `cor`, `corrcoef`, `cor_test`, `cosd`, `cotd`, `cov`, `cplxpair`, `cross`, `cscd`, `cstrcat`, `csvread`, `csvwrite`, `ctime`, `cumtrapz`, `curl`, `cut`, `cylinder`, `date`, `datenum`, `datestr`, `datetick`, `datevec`, `dblquad`, `deal`, `deblank`, `deconv`, `delaunay`, `delaunayn`, `delete`, `demo`, `detrend`, `diffpara`, `diffuse`, `dir`, `discrete_cdf`, `discrete_inv`, `discrete_pdf`, `discrete_rnd`, `display`, `divergence`, `dlmwrite`, `dos`, `dsearch`, `dsearchn`, `duplication_matrix`, `durbinlevinson`, `ellipsoid`, `empirical_cdf`, `empirical_inv`, `empirical_pdf`, `empirical_rnd`, `eomday`, `errorbar`, `etime`, `etreeplot`, `example`, `expcdf`, `expinv`, `expm`, `exppdf`, `exprnd`, `ezcontour`, `ezcontourf`, `ezmesh`, `ezmeshc`, `ezplot`, `ezpolar`, `ezsurf`, `ezsurfc`, `factor`, `factorial`, `fail`, `fcdf`, `feather`, `fftconv`, `fftfilt`, `fftshift`, `figure`, `fileattrib`, `fileparts`, `fill`, `findall`, `findobj`, `findstr`, `finv`, `flag`, `flipdim`, `fliplr`, `flipud`, `fpdf`, `fplot`, `fractdiff`, `freqz`, `freqz_plot`, `frnd`, `fsolve`, `f_test_regression`, `ftp`, `fullfile`, `fzero`, `gamcdf`, `gaminv`, `gampdf`, `gamrnd`, `gca`, `gcbf`, `gcbo`, `gcf`, `genvarname`, `geocdf`, `geoinv`, `geopdf`, `geornd`, `getfield`, `ginput`, `glpk`, `gls`, `gplot`, `gradient`, `graphics_toolkit`, `gray`, `grid`, `griddata`, `griddatan`, `gtext`, `gunzip`, `gzip`, `hadamard`, `hamming`, `hankel`, `hanning`, `hggroup`, `hidden`, `hilb`, `hist`, `histc`, `hold`, `hot`, `hotelling_test`, `housh`, `hsv`, `hurst`, `hygecdf`, `hygeinv`, `hygepdf`, `hygernd`, `idivide`, `ifftshift`, `image`, `imagesc`, `imfinfo`, `imread`, `imshow`, `imwrite`, `index`, `info`, `inpolygon`, `inputname`, `interpft`, `interpn`, `intersect`, `invhilb`, `iqr`, `isa`, `isdefinite`, `isdir`, `is_duplicate_entry`, `isequal`, `isequalwithequalnans`, `isfigure`, `ishermitian`, `ishghandle`, `is_leap_year`, `isletter`, `ismac`, `ismember`, `ispc`, `isprime`, `isprop`, `isscalar`, `issquare`, `isstrprop`, `issymmetric`, `isunix`, `is_valid_file_id`, `isvector`, `jet`, `kendall`, `kolmogorov_smirnov_cdf`, `kolmogorov_smirnov_test`, `kruskal_wallis_test`, `krylov`, `kurtosis`, `laplace_cdf`, `laplace_inv`, `laplace_pdf`, `laplace_rnd`, `legend`, `legendre`, `license`, `line`, `linkprop`, `list_primes`, `loadaudio`, `loadobj`, `logistic_cdf`, `logistic_inv`, `logistic_pdf`, `logistic_rnd`, `logit`, `loglog`, `loglogerr`, `logm`, `logncdf`, `logninv`, `lognpdf`, `lognrnd`, `logspace`, `lookfor`, `ls_command`, `lsqnonneg`, `magic`, `mahalanobis`, `manova`, `matlabroot`, `mcnemar_test`, `mean`, `meansq`, `median`, `menu`, `mesh`, `meshc`, `meshgrid`, `meshz`, `mexext`, `mget`, `mkpp`, `mode`, `moment`, `movefile`, `mpoles`, `mput`, `namelengthmax`, `nargchk`, `nargoutchk`, `nbincdf`, `nbininv`, `nbinpdf`, `nbinrnd`, `nchoosek`, `ndgrid`, `newplot`, `news`, `nonzeros`, `normcdf`, `normest`, `norminv`, `normpdf`, `normrnd`, `now`, `nthroot`, `null`, `ocean`, `ols`, `onenormest`, `optimget`, `optimset`, `orderfields`, `orient`, `orth`, `pack`, `pareto`, `parseparams`, `pascal`, `patch`, `pathdef`, `pcg`, `pchip`, `pcolor`, `pcr`, `peaks`, `periodogram`, `perl`, `perms`, `pie`, `pink`, `planerot`, `playaudio`, `plot`, `plotmatrix`, `plotyy`, `poisscdf`, `poissinv`, `poisspdf`, `poissrnd`, `polar`, `poly`, `polyaffine`, `polyarea`, `polyderiv`, `polyfit`, `polygcd`, `polyint`, `polyout`, `polyreduce`, `polyval`, `polyvalm`, `postpad`, `powerset`, `ppder`, `ppint`, `ppjumps`, `ppplot`, `ppval`, `pqpnonneg`, `prepad`, `primes`, `print`, `print_usage`, `prism`, `probit`, `qp`, `qqplot`, `quadcc`, `quadgk`, `quadl`, `quadv`, `quiver`, `qzhess`, `rainbow`, `randi`, `range`, `rank`, `ranks`, `rat`, `reallog`, `realpow`, `realsqrt`, `record`, `rectangle_lw`, `rectangle_sw`, `rectint`, `refresh`, `refreshdata`, `regexptranslate`, `repmat`, `residue`, `ribbon`, `rindex`, `roots`, `rose`, `rosser`, `rotdim`, `rref`, `run`, `run_count`, `rundemos`, `run_test`, `runtests`, `saveas`, `saveaudio`, `saveobj`, `savepath`, `scatter`, `secd`, `semilogx`, `semilogxerr`, `semilogy`, `semilogyerr`, `setaudio`, `setdiff`, `setfield`, `setxor`, `shading`, `shift`, `shiftdim`, `sign_test`, `sinc`, `sind`, `sinetone`, `sinewave`, `skewness`, `slice`, `sombrero`, `sortrows`, `spaugment`, `spconvert`, `spdiags`, `spearman`, `spectral_adf`, `spectral_xdf`, `specular`, `speed`, `spencer`, `speye`, `spfun`, `sphere`, `spinmap`, `spline`, `spones`, `sprand`, `sprandn`, `sprandsym`, `spring`, `spstats`, `spy`, `sqp`, `stairs`, `statistics`, `std`, `stdnormal_cdf`, `stdnormal_inv`, `stdnormal_pdf`, `stdnormal_rnd`, `stem`, `stft`, `strcat`, `strchr`, `strjust`, `strmatch`, `strread`, `strsplit`, `strtok`, `strtrim`, `strtrunc`, `structfun`, `studentize`, `subplot`, `subsindex`, `subspace`, `substr`, `substruct`, `summer`, `surf`, `surface`, `surfc`, `surfl`, `surfnorm`, `svds`, `swapbytes`, `sylvester_matrix`, `symvar`, `synthesis`, `table`, `tand`, `tar`, `tcdf`, `tempdir`, `tempname`, `test`, `text`, `textread`, `textscan`, `tinv`, `title`, `toeplitz`, `tpdf`, `trace`, `trapz`, `treelayout`, `treeplot`, `triangle_lw`, `triangle_sw`, `tril`, `trimesh`, `triplequad`, `triplot`, `trisurf`, `triu`, `trnd`, `tsearchn`, `t_test`, `t_test_regression`, `type`, `unidcdf`, `unidinv`, `unidpdf`, `unidrnd`, `unifcdf`, `unifinv`, `unifpdf`, `unifrnd`, `union`, `unique`, `unix`, `unmkpp`, `unpack`, `untabify`, `untar`, `unwrap`, `unzip`, `u_test`, `validatestring`, `vander`, `var`, `var_test`, `vech`, `ver`, `version`, `view`, `voronoi`, `voronoin`, `waitforbuttonpress`, `wavread`, `wavwrite`, `wblcdf`, `wblinv`, `wblpdf`, `wblrnd`, `weekday`, `welch_test`, `what`, `white`, `whitebg`, `wienrnd`, `wilcoxon_test`, `wilkinson`, `winter`, `xlabel`, `xlim`, `ylabel`, `yulewalker`, `zip`, `zlabel`, `z_test`, `airy`, `amd`, `balance`, `besselh`, `besseli`, `besselj`, `besselk`, `bessely`, `bitpack`, `bsxfun`, `builtin`, `ccolamd`, `cellfun`, `cellslices`, `chol`, `choldelete`, `cholinsert`, `cholinv`, `cholshift`, `cholupdate`, `colamd`, `colloc`, `convhulln`, `convn`, `csymamd`, `cummax`, `cummin`, `daspk`, `daspk_options`, `dasrt`, `dasrt_options`, `dassl`, `dassl_options`, `dbclear`, `dbdown`, `dbstack`, `dbstatus`, `dbstop`, `dbtype`, `dbup`, `dbwhere`, `det`, `dlmread`, `dmperm`, `dot`, `eig`, `eigs`, `endgrent`, `endpwent`, `etree`, `fft`, `fftn`, `fftw`, `filter`, `find`, `full`, `gcd`, `getgrent`, `getgrgid`, `getgrnam`, `getpwent`, `getpwnam`, `getpwuid`, `getrusage`, `givens`, `gmtime`, `gnuplot_binary`, `hess`, `ifft`, `ifftn`, `inv`, `isdebugmode`, `issparse`, `kron`, `localtime`, `lookup`, `lsode`, `lsode_options`, `lu`, `luinc`, `luupdate`, `matrix_type`, `max`, `min`, `mktime`, `pinv`, `qr`, `qrdelete`, `qrinsert`, `qrshift`, `qrupdate`, `quad`, `quad_options`, `qz`, `rand`, `rande`, `randg`, `randn`, `randp`, `randperm`, `rcond`, `regexp`, `regexpi`, `regexprep`, `schur`, `setgrent`, `setpwent`, `sort`, `spalloc`, `sparse`, `spparms`, `sprank`, `sqrtm`, `strfind`, `strftime`, `strptime`, `strrep`, `svd`, `svd_driver`, `syl`, `symamd`, `symbfact`, `symrcm`, `time`, `tsearch`, `typecast`, `urlread`, `urlwrite`, `abs`, `acos`, `acosh`, `acot`, `acoth`, `acsc`, `acsch`, `angle`, `arg`, `asec`, `asech`, `asin`, `asinh`, `atan`, `atanh`, `beta`, `betainc`, `betaln`, `bincoeff`, `cbrt`, `ceil`, `conj`, `cos`, `cosh`, `cot`, `coth`, `csc`, `csch`, `erf`, `erfc`, `erfcx`, `erfinv`, `exp`, `finite`, `fix`, `floor`, `fmod`, `gamma`, `gammainc`, `gammaln`, `imag`, `isalnum`, `isalpha`, `isascii`, `iscntrl`, `isdigit`, `isfinite`, `isgraph`, `isinf`, `islower`, `isna`, `isnan`, `isprint`, `ispunct`, `isspace`, `isupper`, `isxdigit`, `lcm`, `lgamma`, `log`, `lower`, `mod`, `real`, `rem`, `round`, `roundb`, `sec`, `sech`, `sign`, `sin`, `sinh`, `sqrt`, `tan`, `tanh`, `toascii`, `tolower`, `xor`), NameBuiltin, nil}, + {Words(``, `\b`, `EDITOR`, `EXEC_PATH`, `I`, `IMAGE_PATH`, `NA`, `OCTAVE_HOME`, `OCTAVE_VERSION`, `PAGER`, `PAGER_FLAGS`, `SEEK_CUR`, `SEEK_END`, `SEEK_SET`, `SIG`, `S_ISBLK`, `S_ISCHR`, `S_ISDIR`, `S_ISFIFO`, `S_ISLNK`, `S_ISREG`, `S_ISSOCK`, `WCONTINUE`, `WCOREDUMP`, `WEXITSTATUS`, `WIFCONTINUED`, `WIFEXITED`, `WIFSIGNALED`, `WIFSTOPPED`, `WNOHANG`, `WSTOPSIG`, `WTERMSIG`, `WUNTRACED`), NameConstant, nil}, + {`-=|!=|!|/=|--`, Operator, nil}, + {`-|==|~=|<|>|<=|>=|&&|&|~|\|\|?`, Operator, nil}, + {`\*=|\+=|\^=|\/=|\\=|\*\*|\+\+|\.\*\*`, Operator, nil}, + {`\.\*|\*|\+|\.\^|\.\\|\.\/|\/|\\`, Operator, nil}, + {`[\[\](){}:@.,]`, Punctuation, nil}, + {`=|:|;`, Punctuation, nil}, + {`"[^"]*"`, LiteralString, nil}, + {`(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`\d+[eEf][+-]?[0-9]+`, LiteralNumberFloat, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`(?<=[\w)\].])\'+`, Operator, nil}, + {`(?=|<=|<>|\+|-|=|>|<|\*|/|%)`, Operator, nil}, + {`(;|,|\)|\(|\.)`, Punctuation, nil}, + {Words(``, `\b`, `истина`, `true`, `ложь`, `false`, `и`, `and`, `или`, `or`, `не`, `not`), Operator, nil}, + {Words(``, `\b`, `если`, `if`, `тогда`, `then`, `иначе`, `else`, `иначеесли`, `elsif`, `конецесли`, `endif`), Operator, nil}, + {Words(``, `\b`, `для`, `for`, `каждого`, `each`, `из`, `in`, `цикл`, `do`, `пока`, `while`, `конеццикла`, `enddo`, `по`, `to`), Operator, nil}, + {Words(``, `\b`, `прервать`, `break`, `продолжить`, `continue`, `возврат`, `return`, `перейти`, `goto`), Operator, nil}, + {Words(``, `\b`, `процедура`, `procedure`, `конецпроцедуры`, `endprocedure`, `функция`, `function`, `конецфункции`, `endfunction`), Keyword, nil}, + {Words(``, `\b`, `новый`, `new`, `знач`, `val`, `экспорт`, `export`, `перем`, `var`), Keyword, nil}, + {Words(``, `\b`, `попытка`, `try`, `исключение`, `except`, `вызватьисключение`, `raise`, `конецпопытки`, `endtry`), Keyword, nil}, + {Words(``, `\b`, `выполнить`, `execute`, `вычислить`, `eval`), Keyword, nil}, + {`"`, LiteralString, Push("string")}, + {`[_а-яА-Я0-9][а-яА-Я0-9]*`, Name, nil}, + {`[_\w][\w]*`, Name, nil}, + }, + "string": { + {`""`, LiteralString, nil}, + {`"C?`, LiteralString, Pop(1)}, + {`[^"]+`, LiteralString, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/o/openedgeabl.go b/vendor/github.com/alecthomas/chroma/lexers/o/openedgeabl.go new file mode 100644 index 0000000..5561971 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/o/openedgeabl.go @@ -0,0 +1,50 @@ +package o + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// OpenedgeAbl lexer. +var OpenEdgeABL = internal.Register(MustNewLazyLexer( + &Config{ + Name: "OpenEdge ABL", + Aliases: []string{"openedge", "abl", "progress", "openedgeabl"}, + Filenames: []string{"*.p", "*.cls", "*.w", "*.i"}, + MimeTypes: []string{"text/x-openedge", "application/x-openedge"}, + }, + func() Rules { + return Rules{ + "root": { + {`/\*`, CommentMultiline, Push("comment")}, + {`//.*?$`, CommentSingle, nil}, + {`\{`, CommentPreproc, Push("preprocessor")}, + {`\s*&.*`, CommentPreproc, nil}, + {`0[xX][0-9a-fA-F]+[LlUu]*`, LiteralNumberHex, nil}, + {`(?i)(DEFINE|DEF|DEFI|DEFIN)\b`, KeywordDeclaration, nil}, + {`(?i)(^|(?<=[^\w\-]))(CHARACTER|CHAR|CHARA|CHARAC|CHARACT|CHARACTE|COM-HANDLE|DATE|DATETIME|DATETIME-TZ|DECIMAL|DEC|DECI|DECIM|DECIMA|HANDLE|INT64|INTEGER|INT|INTE|INTEG|INTEGE|LOGICAL|LONGCHAR|MEMPTR|RAW|RECID|ROWID)\s*($|(?=[^\w\-]))`, KeywordType, nil}, + {Words(`(?i)(^|(?<=[^\w\-]))`, `\s*($|(?=[^\w\-]))`, `ABS`, `ABSO`, `ABSOL`, `ABSOLU`, `ABSOLUT`, `ABSOLUTE`, `ABSTRACT`, `ACCELERATOR`, `ACCUM`, `ACCUMU`, `ACCUMUL`, `ACCUMULA`, `ACCUMULAT`, `ACCUMULATE`, `ACTIVE-FORM`, `ACTIVE-WINDOW`, `ADD`, `ADD-BUFFER`, `ADD-CALC-COLUMN`, `ADD-COLUMNS-FROM`, `ADD-EVENTS-PROCEDURE`, `ADD-FIELDS-FROM`, `ADD-FIRST`, `ADD-INDEX-FIELD`, `ADD-LAST`, `ADD-LIKE-COLUMN`, `ADD-LIKE-FIELD`, `ADD-LIKE-INDEX`, `ADD-NEW-FIELD`, `ADD-NEW-INDEX`, `ADD-SCHEMA-LOCATION`, `ADD-SUPER-PROCEDURE`, `ADM-DATA`, `ADVISE`, `ALERT-BOX`, `ALIAS`, `ALL`, `ALLOW-COLUMN-SEARCHING`, `ALLOW-REPLICATION`, `ALTER`, `ALWAYS-ON-TOP`, `AMBIG`, `AMBIGU`, `AMBIGUO`, `AMBIGUOU`, `AMBIGUOUS`, `ANALYZ`, `ANALYZE`, `AND`, `ANSI-ONLY`, `ANY`, `ANYWHERE`, `APPEND`, `APPL-ALERT`, `APPL-ALERT-`, `APPL-ALERT-B`, `APPL-ALERT-BO`, `APPL-ALERT-BOX`, `APPL-ALERT-BOXE`, `APPL-ALERT-BOXES`, `APPL-CONTEXT-ID`, `APPLICATION`, `APPLY`, `APPSERVER-INFO`, `APPSERVER-PASSWORD`, `APPSERVER-USERID`, `ARRAY-MESSAGE`, `AS`, `ASC`, `ASCE`, `ASCEN`, `ASCEND`, `ASCENDI`, `ASCENDIN`, `ASCENDING`, `ASK-OVERWRITE`, `ASSEMBLY`, `ASSIGN`, `ASYNC-REQUEST-COUNT`, `ASYNC-REQUEST-HANDLE`, `ASYNCHRONOUS`, `AT`, `ATTACHED-PAIRLIST`, `ATTR`, `ATTR-SPACE`, `ATTRI`, `ATTRIB`, `ATTRIBU`, `ATTRIBUT`, `AUDIT-CONTROL`, `AUDIT-ENABLED`, `AUDIT-EVENT-CONTEXT`, `AUDIT-POLICY`, `AUTHENTICATION-FAILED`, `AUTHORIZATION`, `AUTO-COMP`, `AUTO-COMPL`, `AUTO-COMPLE`, `AUTO-COMPLET`, `AUTO-COMPLETI`, `AUTO-COMPLETIO`, `AUTO-COMPLETION`, `AUTO-END-KEY`, `AUTO-ENDKEY`, `AUTO-GO`, `AUTO-IND`, `AUTO-INDE`, `AUTO-INDEN`, `AUTO-INDENT`, `AUTO-RESIZE`, `AUTO-RET`, `AUTO-RETU`, `AUTO-RETUR`, `AUTO-RETURN`, `AUTO-SYNCHRONIZE`, `AUTO-Z`, `AUTO-ZA`, `AUTO-ZAP`, `AUTOMATIC`, `AVAIL`, `AVAILA`, `AVAILAB`, `AVAILABL`, `AVAILABLE`, `AVAILABLE-FORMATS`, `AVE`, `AVER`, `AVERA`, `AVERAG`, `AVERAGE`, `AVG`, `BACK`, `BACKG`, `BACKGR`, `BACKGRO`, `BACKGROU`, `BACKGROUN`, `BACKGROUND`, `BACKWARD`, `BACKWARDS`, `BASE64-DECODE`, `BASE64-ENCODE`, `BASE-ADE`, `BASE-KEY`, `BATCH`, `BATCH-`, `BATCH-M`, `BATCH-MO`, `BATCH-MOD`, `BATCH-MODE`, `BATCH-SIZE`, `BEFORE-H`, `BEFORE-HI`, `BEFORE-HID`, `BEFORE-HIDE`, `BEGIN-EVENT-GROUP`, `BEGINS`, `BELL`, `BETWEEN`, `BGC`, `BGCO`, `BGCOL`, `BGCOLO`, `BGCOLOR`, `BIG-ENDIAN`, `BINARY`, `BIND`, `BIND-WHERE`, `BLANK`, `BLOCK-ITERATION-DISPLAY`, `BLOCK-LEVEL`, `BORDER-B`, `BORDER-BO`, `BORDER-BOT`, `BORDER-BOTT`, `BORDER-BOTTO`, `BORDER-BOTTOM-CHARS`, `BORDER-BOTTOM-P`, `BORDER-BOTTOM-PI`, `BORDER-BOTTOM-PIX`, `BORDER-BOTTOM-PIXE`, `BORDER-BOTTOM-PIXEL`, `BORDER-BOTTOM-PIXELS`, `BORDER-L`, `BORDER-LE`, `BORDER-LEF`, `BORDER-LEFT`, `BORDER-LEFT-`, `BORDER-LEFT-C`, `BORDER-LEFT-CH`, `BORDER-LEFT-CHA`, `BORDER-LEFT-CHAR`, `BORDER-LEFT-CHARS`, `BORDER-LEFT-P`, `BORDER-LEFT-PI`, `BORDER-LEFT-PIX`, `BORDER-LEFT-PIXE`, `BORDER-LEFT-PIXEL`, `BORDER-LEFT-PIXELS`, `BORDER-R`, `BORDER-RI`, `BORDER-RIG`, `BORDER-RIGH`, `BORDER-RIGHT`, `BORDER-RIGHT-`, `BORDER-RIGHT-C`, `BORDER-RIGHT-CH`, `BORDER-RIGHT-CHA`, `BORDER-RIGHT-CHAR`, `BORDER-RIGHT-CHARS`, `BORDER-RIGHT-P`, `BORDER-RIGHT-PI`, `BORDER-RIGHT-PIX`, `BORDER-RIGHT-PIXE`, `BORDER-RIGHT-PIXEL`, `BORDER-RIGHT-PIXELS`, `BORDER-T`, `BORDER-TO`, `BORDER-TOP`, `BORDER-TOP-`, `BORDER-TOP-C`, `BORDER-TOP-CH`, `BORDER-TOP-CHA`, `BORDER-TOP-CHAR`, `BORDER-TOP-CHARS`, `BORDER-TOP-P`, `BORDER-TOP-PI`, `BORDER-TOP-PIX`, `BORDER-TOP-PIXE`, `BORDER-TOP-PIXEL`, `BORDER-TOP-PIXELS`, `BOX`, `BOX-SELECT`, `BOX-SELECTA`, `BOX-SELECTAB`, `BOX-SELECTABL`, `BOX-SELECTABLE`, `BREAK`, `BROWSE`, `BUFFER`, `BUFFER-CHARS`, `BUFFER-COMPARE`, `BUFFER-COPY`, `BUFFER-CREATE`, `BUFFER-DELETE`, `BUFFER-FIELD`, `BUFFER-HANDLE`, `BUFFER-LINES`, `BUFFER-NAME`, `BUFFER-PARTITION-ID`, `BUFFER-RELEASE`, `BUFFER-VALUE`, `BUTTON`, `BUTTONS`, `BY`, `BY-POINTER`, `BY-VARIANT-POINTER`, `CACHE`, `CACHE-SIZE`, `CALL`, `CALL-NAME`, `CALL-TYPE`, `CAN-CREATE`, `CAN-DELETE`, `CAN-DO`, `CAN-DO-DOMAIN-SUPPORT`, `CAN-FIND`, `CAN-QUERY`, `CAN-READ`, `CAN-SET`, `CAN-WRITE`, `CANCEL-BREAK`, `CANCEL-BUTTON`, `CAPS`, `CAREFUL-PAINT`, `CASE`, `CASE-SEN`, `CASE-SENS`, `CASE-SENSI`, `CASE-SENSIT`, `CASE-SENSITI`, `CASE-SENSITIV`, `CASE-SENSITIVE`, `CAST`, `CATCH`, `CDECL`, `CENTER`, `CENTERE`, `CENTERED`, `CHAINED`, `CHARACTER`, `CHARACTER_LENGTH`, `CHARSET`, `CHECK`, `CHECKED`, `CHOOSE`, `CHR`, `CLASS`, `CLASS-TYPE`, `CLEAR`, `CLEAR-APPL-CONTEXT`, `CLEAR-LOG`, `CLEAR-SELECT`, `CLEAR-SELECTI`, `CLEAR-SELECTIO`, `CLEAR-SELECTION`, `CLEAR-SORT-ARROW`, `CLEAR-SORT-ARROWS`, `CLIENT-CONNECTION-ID`, `CLIENT-PRINCIPAL`, `CLIENT-TTY`, `CLIENT-TYPE`, `CLIENT-WORKSTATION`, `CLIPBOARD`, `CLOSE`, `CLOSE-LOG`, `CODE`, `CODEBASE-LOCATOR`, `CODEPAGE`, `CODEPAGE-CONVERT`, `COL`, `COL-OF`, `COLLATE`, `COLON`, `COLON-ALIGN`, `COLON-ALIGNE`, `COLON-ALIGNED`, `COLOR`, `COLOR-TABLE`, `COLU`, `COLUM`, `COLUMN`, `COLUMN-BGCOLOR`, `COLUMN-DCOLOR`, `COLUMN-FGCOLOR`, `COLUMN-FONT`, `COLUMN-LAB`, `COLUMN-LABE`, `COLUMN-LABEL`, `COLUMN-MOVABLE`, `COLUMN-OF`, `COLUMN-PFCOLOR`, `COLUMN-READ-ONLY`, `COLUMN-RESIZABLE`, `COLUMN-SCROLLING`, `COLUMNS`, `COM-HANDLE`, `COM-SELF`, `COMBO-BOX`, `COMMAND`, `COMPARES`, `COMPILE`, `COMPILER`, `COMPLETE`, `CONFIG-NAME`, `CONNECT`, `CONNECTED`, `CONSTRUCTOR`, `CONTAINS`, `CONTENTS`, `CONTEXT`, `CONTEXT-HELP`, `CONTEXT-HELP-FILE`, `CONTEXT-HELP-ID`, `CONTEXT-POPUP`, `CONTROL`, `CONTROL-BOX`, `CONTROL-FRAME`, `CONVERT`, `CONVERT-3D-COLORS`, `CONVERT-TO-OFFS`, `CONVERT-TO-OFFSE`, `CONVERT-TO-OFFSET`, `COPY-DATASET`, `COPY-LOB`, `COPY-SAX-ATTRIBUTES`, `COPY-TEMP-TABLE`, `COUNT`, `COUNT-OF`, `CPCASE`, `CPCOLL`, `CPINTERNAL`, `CPLOG`, `CPPRINT`, `CPRCODEIN`, `CPRCODEOUT`, `CPSTREAM`, `CPTERM`, `CRC-VALUE`, `CREATE`, `CREATE-LIKE`, `CREATE-LIKE-SEQUENTIAL`, `CREATE-NODE-NAMESPACE`, `CREATE-RESULT-LIST-ENTRY`, `CREATE-TEST-FILE`, `CURRENT`, `CURRENT-CHANGED`, `CURRENT-COLUMN`, `CURRENT-ENV`, `CURRENT-ENVI`, `CURRENT-ENVIR`, `CURRENT-ENVIRO`, `CURRENT-ENVIRON`, `CURRENT-ENVIRONM`, `CURRENT-ENVIRONME`, `CURRENT-ENVIRONMEN`, `CURRENT-ENVIRONMENT`, `CURRENT-ITERATION`, `CURRENT-LANG`, `CURRENT-LANGU`, `CURRENT-LANGUA`, `CURRENT-LANGUAG`, `CURRENT-LANGUAGE`, `CURRENT-QUERY`, `CURRENT-REQUEST-INFO`, `CURRENT-RESPONSE-INFO`, `CURRENT-RESULT-ROW`, `CURRENT-ROW-MODIFIED`, `CURRENT-VALUE`, `CURRENT-WINDOW`, `CURRENT_DATE`, `CURS`, `CURSO`, `CURSOR`, `CURSOR-CHAR`, `CURSOR-LINE`, `CURSOR-OFFSET`, `DATA-BIND`, `DATA-ENTRY-RET`, `DATA-ENTRY-RETU`, `DATA-ENTRY-RETUR`, `DATA-ENTRY-RETURN`, `DATA-REL`, `DATA-RELA`, `DATA-RELAT`, `DATA-RELATI`, `DATA-RELATIO`, `DATA-RELATION`, `DATA-SOURCE`, `DATA-SOURCE-COMPLETE-MAP`, `DATA-SOURCE-MODIFIED`, `DATA-SOURCE-ROWID`, `DATA-T`, `DATA-TY`, `DATA-TYP`, `DATA-TYPE`, `DATABASE`, `DATASERVERS`, `DATASET`, `DATASET-HANDLE`, `DATE`, `DATE-F`, `DATE-FO`, `DATE-FOR`, `DATE-FORM`, `DATE-FORMA`, `DATE-FORMAT`, `DAY`, `DB-CONTEXT`, `DB-REFERENCES`, `DBCODEPAGE`, `DBCOLLATION`, `DBNAME`, `DBPARAM`, `DBREST`, `DBRESTR`, `DBRESTRI`, `DBRESTRIC`, `DBRESTRICT`, `DBRESTRICTI`, `DBRESTRICTIO`, `DBRESTRICTION`, `DBRESTRICTIONS`, `DBTASKID`, `DBTYPE`, `DBVERS`, `DBVERSI`, `DBVERSIO`, `DBVERSION`, `DCOLOR`, `DDE`, `DDE-ERROR`, `DDE-I`, `DDE-ID`, `DDE-ITEM`, `DDE-NAME`, `DDE-TOPIC`, `DEBLANK`, `DEBU`, `DEBUG`, `DEBUG-ALERT`, `DEBUG-LIST`, `DEBUGGER`, `DECIMAL`, `DECIMALS`, `DECLARE`, `DECLARE-NAMESPACE`, `DECRYPT`, `DEFAULT`, `DEFAULT-B`, `DEFAULT-BU`, `DEFAULT-BUFFER-HANDLE`, `DEFAULT-BUT`, `DEFAULT-BUTT`, `DEFAULT-BUTTO`, `DEFAULT-BUTTON`, `DEFAULT-COMMIT`, `DEFAULT-EX`, `DEFAULT-EXT`, `DEFAULT-EXTE`, `DEFAULT-EXTEN`, `DEFAULT-EXTENS`, `DEFAULT-EXTENSI`, `DEFAULT-EXTENSIO`, `DEFAULT-EXTENSION`, `DEFAULT-NOXL`, `DEFAULT-NOXLA`, `DEFAULT-NOXLAT`, `DEFAULT-NOXLATE`, `DEFAULT-VALUE`, `DEFAULT-WINDOW`, `DEFINE`, `DEFINE-USER-EVENT-MANAGER`, `DEFINED`, `DEL`, `DELE`, `DELEGATE`, `DELET`, `DELETE PROCEDURE`, `DELETE`, `DELETE-CHAR`, `DELETE-CHARA`, `DELETE-CHARAC`, `DELETE-CHARACT`, `DELETE-CHARACTE`, `DELETE-CHARACTER`, `DELETE-CURRENT-ROW`, `DELETE-LINE`, `DELETE-RESULT-LIST-ENTRY`, `DELETE-SELECTED-ROW`, `DELETE-SELECTED-ROWS`, `DELIMITER`, `DESC`, `DESCE`, `DESCEN`, `DESCEND`, `DESCENDI`, `DESCENDIN`, `DESCENDING`, `DESELECT-FOCUSED-ROW`, `DESELECT-ROWS`, `DESELECT-SELECTED-ROW`, `DESELECTION`, `DESTRUCTOR`, `DIALOG-BOX`, `DICT`, `DICTI`, `DICTIO`, `DICTION`, `DICTIONA`, `DICTIONAR`, `DICTIONARY`, `DIR`, `DISABLE`, `DISABLE-AUTO-ZAP`, `DISABLE-DUMP-TRIGGERS`, `DISABLE-LOAD-TRIGGERS`, `DISABLED`, `DISCON`, `DISCONN`, `DISCONNE`, `DISCONNEC`, `DISCONNECT`, `DISP`, `DISPL`, `DISPLA`, `DISPLAY`, `DISPLAY-MESSAGE`, `DISPLAY-T`, `DISPLAY-TY`, `DISPLAY-TYP`, `DISPLAY-TYPE`, `DISTINCT`, `DO`, `DOMAIN-DESCRIPTION`, `DOMAIN-NAME`, `DOMAIN-TYPE`, `DOS`, `DOUBLE`, `DOWN`, `DRAG-ENABLED`, `DROP`, `DROP-DOWN`, `DROP-DOWN-LIST`, `DROP-FILE-NOTIFY`, `DROP-TARGET`, `DS-CLOSE-CURSOR`, `DSLOG-MANAGER`, `DUMP`, `DYNAMIC`, `DYNAMIC-ENUM`, `DYNAMIC-FUNCTION`, `DYNAMIC-INVOKE`, `EACH`, `ECHO`, `EDGE`, `EDGE-`, `EDGE-C`, `EDGE-CH`, `EDGE-CHA`, `EDGE-CHAR`, `EDGE-CHARS`, `EDGE-P`, `EDGE-PI`, `EDGE-PIX`, `EDGE-PIXE`, `EDGE-PIXEL`, `EDGE-PIXELS`, `EDIT-CAN-PASTE`, `EDIT-CAN-UNDO`, `EDIT-CLEAR`, `EDIT-COPY`, `EDIT-CUT`, `EDIT-PASTE`, `EDIT-UNDO`, `EDITING`, `EDITOR`, `ELSE`, `EMPTY`, `EMPTY-TEMP-TABLE`, `ENABLE`, `ENABLED-FIELDS`, `ENCODE`, `ENCRYPT`, `ENCRYPT-AUDIT-MAC-KEY`, `ENCRYPTION-SALT`, `END`, `END-DOCUMENT`, `END-ELEMENT`, `END-EVENT-GROUP`, `END-FILE-DROP`, `END-KEY`, `END-MOVE`, `END-RESIZE`, `END-ROW-RESIZE`, `END-USER-PROMPT`, `ENDKEY`, `ENTERED`, `ENTITY-EXPANSION-LIMIT`, `ENTRY`, `ENUM`, `EQ`, `ERROR`, `ERROR-COL`, `ERROR-COLU`, `ERROR-COLUM`, `ERROR-COLUMN`, `ERROR-ROW`, `ERROR-STACK-TRACE`, `ERROR-STAT`, `ERROR-STATU`, `ERROR-STATUS`, `ESCAPE`, `ETIME`, `EVENT`, `EVENT-GROUP-ID`, `EVENT-PROCEDURE`, `EVENT-PROCEDURE-CONTEXT`, `EVENT-T`, `EVENT-TY`, `EVENT-TYP`, `EVENT-TYPE`, `EVENTS`, `EXCEPT`, `EXCLUSIVE`, `EXCLUSIVE-`, `EXCLUSIVE-ID`, `EXCLUSIVE-L`, `EXCLUSIVE-LO`, `EXCLUSIVE-LOC`, `EXCLUSIVE-LOCK`, `EXCLUSIVE-WEB-USER`, `EXECUTE`, `EXISTS`, `EXP`, `EXPAND`, `EXPANDABLE`, `EXPLICIT`, `EXPORT`, `EXPORT-PRINCIPAL`, `EXTENDED`, `EXTENT`, `EXTERNAL`, `FALSE`, `FETCH`, `FETCH-SELECTED-ROW`, `FGC`, `FGCO`, `FGCOL`, `FGCOLO`, `FGCOLOR`, `FIELD`, `FIELDS`, `FILE`, `FILE-CREATE-DATE`, `FILE-CREATE-TIME`, `FILE-INFO`, `FILE-INFOR`, `FILE-INFORM`, `FILE-INFORMA`, `FILE-INFORMAT`, `FILE-INFORMATI`, `FILE-INFORMATIO`, `FILE-INFORMATION`, `FILE-MOD-DATE`, `FILE-MOD-TIME`, `FILE-NAME`, `FILE-OFF`, `FILE-OFFS`, `FILE-OFFSE`, `FILE-OFFSET`, `FILE-SIZE`, `FILE-TYPE`, `FILENAME`, `FILL`, `FILL-IN`, `FILLED`, `FILTERS`, `FINAL`, `FINALLY`, `FIND`, `FIND-BY-ROWID`, `FIND-CASE-SENSITIVE`, `FIND-CURRENT`, `FIND-FIRST`, `FIND-GLOBAL`, `FIND-LAST`, `FIND-NEXT-OCCURRENCE`, `FIND-PREV-OCCURRENCE`, `FIND-SELECT`, `FIND-UNIQUE`, `FIND-WRAP-AROUND`, `FINDER`, `FIRST`, `FIRST-ASYNCH-REQUEST`, `FIRST-CHILD`, `FIRST-COLUMN`, `FIRST-FORM`, `FIRST-OBJECT`, `FIRST-OF`, `FIRST-PROC`, `FIRST-PROCE`, `FIRST-PROCED`, `FIRST-PROCEDU`, `FIRST-PROCEDUR`, `FIRST-PROCEDURE`, `FIRST-SERVER`, `FIRST-TAB-I`, `FIRST-TAB-IT`, `FIRST-TAB-ITE`, `FIRST-TAB-ITEM`, `FIT-LAST-COLUMN`, `FIXED-ONLY`, `FLAT-BUTTON`, `FLOAT`, `FOCUS`, `FOCUSED-ROW`, `FOCUSED-ROW-SELECTED`, `FONT`, `FONT-TABLE`, `FOR`, `FORCE-FILE`, `FORE`, `FOREG`, `FOREGR`, `FOREGRO`, `FOREGROU`, `FOREGROUN`, `FOREGROUND`, `FORM INPUT`, `FORM`, `FORM-LONG-INPUT`, `FORMA`, `FORMAT`, `FORMATTE`, `FORMATTED`, `FORWARD`, `FORWARDS`, `FRAGMEN`, `FRAGMENT`, `FRAM`, `FRAME`, `FRAME-COL`, `FRAME-DB`, `FRAME-DOWN`, `FRAME-FIELD`, `FRAME-FILE`, `FRAME-INDE`, `FRAME-INDEX`, `FRAME-LINE`, `FRAME-NAME`, `FRAME-ROW`, `FRAME-SPA`, `FRAME-SPAC`, `FRAME-SPACI`, `FRAME-SPACIN`, `FRAME-SPACING`, `FRAME-VAL`, `FRAME-VALU`, `FRAME-VALUE`, `FRAME-X`, `FRAME-Y`, `FREQUENCY`, `FROM`, `FROM-C`, `FROM-CH`, `FROM-CHA`, `FROM-CHAR`, `FROM-CHARS`, `FROM-CUR`, `FROM-CURR`, `FROM-CURRE`, `FROM-CURREN`, `FROM-CURRENT`, `FROM-P`, `FROM-PI`, `FROM-PIX`, `FROM-PIXE`, `FROM-PIXEL`, `FROM-PIXELS`, `FULL-HEIGHT`, `FULL-HEIGHT-`, `FULL-HEIGHT-C`, `FULL-HEIGHT-CH`, `FULL-HEIGHT-CHA`, `FULL-HEIGHT-CHAR`, `FULL-HEIGHT-CHARS`, `FULL-HEIGHT-P`, `FULL-HEIGHT-PI`, `FULL-HEIGHT-PIX`, `FULL-HEIGHT-PIXE`, `FULL-HEIGHT-PIXEL`, `FULL-HEIGHT-PIXELS`, `FULL-PATHN`, `FULL-PATHNA`, `FULL-PATHNAM`, `FULL-PATHNAME`, `FULL-WIDTH`, `FULL-WIDTH-`, `FULL-WIDTH-C`, `FULL-WIDTH-CH`, `FULL-WIDTH-CHA`, `FULL-WIDTH-CHAR`, `FULL-WIDTH-CHARS`, `FULL-WIDTH-P`, `FULL-WIDTH-PI`, `FULL-WIDTH-PIX`, `FULL-WIDTH-PIXE`, `FULL-WIDTH-PIXEL`, `FULL-WIDTH-PIXELS`, `FUNCTION`, `FUNCTION-CALL-TYPE`, `GATEWAY`, `GATEWAYS`, `GE`, `GENERATE-MD5`, `GENERATE-PBE-KEY`, `GENERATE-PBE-SALT`, `GENERATE-RANDOM-KEY`, `GENERATE-UUID`, `GET`, `GET-ATTR-CALL-TYPE`, `GET-ATTRIBUTE-NODE`, `GET-BINARY-DATA`, `GET-BLUE`, `GET-BLUE-`, `GET-BLUE-V`, `GET-BLUE-VA`, `GET-BLUE-VAL`, `GET-BLUE-VALU`, `GET-BLUE-VALUE`, `GET-BROWSE-COLUMN`, `GET-BUFFER-HANDLE`, `GET-BYTE`, `GET-CALLBACK-PROC-CONTEXT`, `GET-CALLBACK-PROC-NAME`, `GET-CGI-LIST`, `GET-CGI-LONG-VALUE`, `GET-CGI-VALUE`, `GET-CLASS`, `GET-CODEPAGES`, `GET-COLLATIONS`, `GET-CONFIG-VALUE`, `GET-CURRENT`, `GET-DOUBLE`, `GET-DROPPED-FILE`, `GET-DYNAMIC`, `GET-ERROR-COLUMN`, `GET-ERROR-ROW`, `GET-FILE`, `GET-FILE-NAME`, `GET-FILE-OFFSE`, `GET-FILE-OFFSET`, `GET-FIRST`, `GET-FLOAT`, `GET-GREEN`, `GET-GREEN-`, `GET-GREEN-V`, `GET-GREEN-VA`, `GET-GREEN-VAL`, `GET-GREEN-VALU`, `GET-GREEN-VALUE`, `GET-INDEX-BY-NAMESPACE-NAME`, `GET-INDEX-BY-QNAME`, `GET-INT64`, `GET-ITERATION`, `GET-KEY-VAL`, `GET-KEY-VALU`, `GET-KEY-VALUE`, `GET-LAST`, `GET-LOCALNAME-BY-INDEX`, `GET-LONG`, `GET-MESSAGE`, `GET-NEXT`, `GET-NUMBER`, `GET-POINTER-VALUE`, `GET-PREV`, `GET-PRINTERS`, `GET-PROPERTY`, `GET-QNAME-BY-INDEX`, `GET-RED`, `GET-RED-`, `GET-RED-V`, `GET-RED-VA`, `GET-RED-VAL`, `GET-RED-VALU`, `GET-RED-VALUE`, `GET-REPOSITIONED-ROW`, `GET-RGB-VALUE`, `GET-SELECTED`, `GET-SELECTED-`, `GET-SELECTED-W`, `GET-SELECTED-WI`, `GET-SELECTED-WID`, `GET-SELECTED-WIDG`, `GET-SELECTED-WIDGE`, `GET-SELECTED-WIDGET`, `GET-SHORT`, `GET-SIGNATURE`, `GET-SIZE`, `GET-STRING`, `GET-TAB-ITEM`, `GET-TEXT-HEIGHT`, `GET-TEXT-HEIGHT-`, `GET-TEXT-HEIGHT-C`, `GET-TEXT-HEIGHT-CH`, `GET-TEXT-HEIGHT-CHA`, `GET-TEXT-HEIGHT-CHAR`, `GET-TEXT-HEIGHT-CHARS`, `GET-TEXT-HEIGHT-P`, `GET-TEXT-HEIGHT-PI`, `GET-TEXT-HEIGHT-PIX`, `GET-TEXT-HEIGHT-PIXE`, `GET-TEXT-HEIGHT-PIXEL`, `GET-TEXT-HEIGHT-PIXELS`, `GET-TEXT-WIDTH`, `GET-TEXT-WIDTH-`, `GET-TEXT-WIDTH-C`, `GET-TEXT-WIDTH-CH`, `GET-TEXT-WIDTH-CHA`, `GET-TEXT-WIDTH-CHAR`, `GET-TEXT-WIDTH-CHARS`, `GET-TEXT-WIDTH-P`, `GET-TEXT-WIDTH-PI`, `GET-TEXT-WIDTH-PIX`, `GET-TEXT-WIDTH-PIXE`, `GET-TEXT-WIDTH-PIXEL`, `GET-TEXT-WIDTH-PIXELS`, `GET-TYPE-BY-INDEX`, `GET-TYPE-BY-NAMESPACE-NAME`, `GET-TYPE-BY-QNAME`, `GET-UNSIGNED-LONG`, `GET-UNSIGNED-SHORT`, `GET-URI-BY-INDEX`, `GET-VALUE-BY-INDEX`, `GET-VALUE-BY-NAMESPACE-NAME`, `GET-VALUE-BY-QNAME`, `GET-WAIT-STATE`, `GETBYTE`, `GLOBAL`, `GO-ON`, `GO-PEND`, `GO-PENDI`, `GO-PENDIN`, `GO-PENDING`, `GRANT`, `GRAPHIC-E`, `GRAPHIC-ED`, `GRAPHIC-EDG`, `GRAPHIC-EDGE`, `GRID-FACTOR-H`, `GRID-FACTOR-HO`, `GRID-FACTOR-HOR`, `GRID-FACTOR-HORI`, `GRID-FACTOR-HORIZ`, `GRID-FACTOR-HORIZO`, `GRID-FACTOR-HORIZON`, `GRID-FACTOR-HORIZONT`, `GRID-FACTOR-HORIZONTA`, `GRID-FACTOR-HORIZONTAL`, `GRID-FACTOR-V`, `GRID-FACTOR-VE`, `GRID-FACTOR-VER`, `GRID-FACTOR-VERT`, `GRID-FACTOR-VERTI`, `GRID-FACTOR-VERTIC`, `GRID-FACTOR-VERTICA`, `GRID-FACTOR-VERTICAL`, `GRID-SNAP`, `GRID-UNIT-HEIGHT`, `GRID-UNIT-HEIGHT-`, `GRID-UNIT-HEIGHT-C`, `GRID-UNIT-HEIGHT-CH`, `GRID-UNIT-HEIGHT-CHA`, `GRID-UNIT-HEIGHT-CHARS`, `GRID-UNIT-HEIGHT-P`, `GRID-UNIT-HEIGHT-PI`, `GRID-UNIT-HEIGHT-PIX`, `GRID-UNIT-HEIGHT-PIXE`, `GRID-UNIT-HEIGHT-PIXEL`, `GRID-UNIT-HEIGHT-PIXELS`, `GRID-UNIT-WIDTH`, `GRID-UNIT-WIDTH-`, `GRID-UNIT-WIDTH-C`, `GRID-UNIT-WIDTH-CH`, `GRID-UNIT-WIDTH-CHA`, `GRID-UNIT-WIDTH-CHAR`, `GRID-UNIT-WIDTH-CHARS`, `GRID-UNIT-WIDTH-P`, `GRID-UNIT-WIDTH-PI`, `GRID-UNIT-WIDTH-PIX`, `GRID-UNIT-WIDTH-PIXE`, `GRID-UNIT-WIDTH-PIXEL`, `GRID-UNIT-WIDTH-PIXELS`, `GRID-VISIBLE`, `GROUP`, `GT`, `GUID`, `HANDLE`, `HANDLER`, `HAS-RECORDS`, `HAVING`, `HEADER`, `HEIGHT`, `HEIGHT-`, `HEIGHT-C`, `HEIGHT-CH`, `HEIGHT-CHA`, `HEIGHT-CHAR`, `HEIGHT-CHARS`, `HEIGHT-P`, `HEIGHT-PI`, `HEIGHT-PIX`, `HEIGHT-PIXE`, `HEIGHT-PIXEL`, `HEIGHT-PIXELS`, `HELP`, `HEX-DECODE`, `HEX-ENCODE`, `HIDDEN`, `HIDE`, `HORI`, `HORIZ`, `HORIZO`, `HORIZON`, `HORIZONT`, `HORIZONTA`, `HORIZONTAL`, `HOST-BYTE-ORDER`, `HTML-CHARSET`, `HTML-END-OF-LINE`, `HTML-END-OF-PAGE`, `HTML-FRAME-BEGIN`, `HTML-FRAME-END`, `HTML-HEADER-BEGIN`, `HTML-HEADER-END`, `HTML-TITLE-BEGIN`, `HTML-TITLE-END`, `HWND`, `ICON`, `IF`, `IMAGE`, `IMAGE-DOWN`, `IMAGE-INSENSITIVE`, `IMAGE-SIZE`, `IMAGE-SIZE-C`, `IMAGE-SIZE-CH`, `IMAGE-SIZE-CHA`, `IMAGE-SIZE-CHAR`, `IMAGE-SIZE-CHARS`, `IMAGE-SIZE-P`, `IMAGE-SIZE-PI`, `IMAGE-SIZE-PIX`, `IMAGE-SIZE-PIXE`, `IMAGE-SIZE-PIXEL`, `IMAGE-SIZE-PIXELS`, `IMAGE-UP`, `IMMEDIATE-DISPLAY`, `IMPLEMENTS`, `IMPORT`, `IMPORT-PRINCIPAL`, `IN`, `IN-HANDLE`, `INCREMENT-EXCLUSIVE-ID`, `INDEX`, `INDEX-HINT`, `INDEX-INFORMATION`, `INDEXED-REPOSITION`, `INDICATOR`, `INFO`, `INFOR`, `INFORM`, `INFORMA`, `INFORMAT`, `INFORMATI`, `INFORMATIO`, `INFORMATION`, `INHERIT-BGC`, `INHERIT-BGCO`, `INHERIT-BGCOL`, `INHERIT-BGCOLO`, `INHERIT-BGCOLOR`, `INHERIT-FGC`, `INHERIT-FGCO`, `INHERIT-FGCOL`, `INHERIT-FGCOLO`, `INHERIT-FGCOLOR`, `INHERITS`, `INIT`, `INITI`, `INITIA`, `INITIAL`, `INITIAL-DIR`, `INITIAL-FILTER`, `INITIALIZE-DOCUMENT-TYPE`, `INITIATE`, `INNER-CHARS`, `INNER-LINES`, `INPUT`, `INPUT-O`, `INPUT-OU`, `INPUT-OUT`, `INPUT-OUTP`, `INPUT-OUTPU`, `INPUT-OUTPUT`, `INPUT-VALUE`, `INSERT`, `INSERT-ATTRIBUTE`, `INSERT-B`, `INSERT-BA`, `INSERT-BAC`, `INSERT-BACK`, `INSERT-BACKT`, `INSERT-BACKTA`, `INSERT-BACKTAB`, `INSERT-FILE`, `INSERT-ROW`, `INSERT-STRING`, `INSERT-T`, `INSERT-TA`, `INSERT-TAB`, `INT64`, `INT`, `INTEGER`, `INTERFACE`, `INTERNAL-ENTRIES`, `INTO`, `INVOKE`, `IS`, `IS-ATTR`, `IS-ATTR-`, `IS-ATTR-S`, `IS-ATTR-SP`, `IS-ATTR-SPA`, `IS-ATTR-SPAC`, `IS-ATTR-SPACE`, `IS-CLASS`, `IS-JSON`, `IS-LEAD-BYTE`, `IS-OPEN`, `IS-PARAMETER-SET`, `IS-PARTITIONED`, `IS-ROW-SELECTED`, `IS-SELECTED`, `IS-XML`, `ITEM`, `ITEMS-PER-ROW`, `JOIN`, `JOIN-BY-SQLDB`, `KBLABEL`, `KEEP-CONNECTION-OPEN`, `KEEP-FRAME-Z`, `KEEP-FRAME-Z-`, `KEEP-FRAME-Z-O`, `KEEP-FRAME-Z-OR`, `KEEP-FRAME-Z-ORD`, `KEEP-FRAME-Z-ORDE`, `KEEP-FRAME-Z-ORDER`, `KEEP-MESSAGES`, `KEEP-SECURITY-CACHE`, `KEEP-TAB-ORDER`, `KEY`, `KEY-CODE`, `KEY-FUNC`, `KEY-FUNCT`, `KEY-FUNCTI`, `KEY-FUNCTIO`, `KEY-FUNCTION`, `KEY-LABEL`, `KEYCODE`, `KEYFUNC`, `KEYFUNCT`, `KEYFUNCTI`, `KEYFUNCTIO`, `KEYFUNCTION`, `KEYLABEL`, `KEYS`, `KEYWORD`, `KEYWORD-ALL`, `LABEL`, `LABEL-BGC`, `LABEL-BGCO`, `LABEL-BGCOL`, `LABEL-BGCOLO`, `LABEL-BGCOLOR`, `LABEL-DC`, `LABEL-DCO`, `LABEL-DCOL`, `LABEL-DCOLO`, `LABEL-DCOLOR`, `LABEL-FGC`, `LABEL-FGCO`, `LABEL-FGCOL`, `LABEL-FGCOLO`, `LABEL-FGCOLOR`, `LABEL-FONT`, `LABEL-PFC`, `LABEL-PFCO`, `LABEL-PFCOL`, `LABEL-PFCOLO`, `LABEL-PFCOLOR`, `LABELS`, `LABELS-HAVE-COLONS`, `LANDSCAPE`, `LANGUAGE`, `LANGUAGES`, `LARGE`, `LARGE-TO-SMALL`, `LAST`, `LAST-ASYNCH-REQUEST`, `LAST-BATCH`, `LAST-CHILD`, `LAST-EVEN`, `LAST-EVENT`, `LAST-FORM`, `LAST-KEY`, `LAST-OBJECT`, `LAST-OF`, `LAST-PROCE`, `LAST-PROCED`, `LAST-PROCEDU`, `LAST-PROCEDUR`, `LAST-PROCEDURE`, `LAST-SERVER`, `LAST-TAB-I`, `LAST-TAB-IT`, `LAST-TAB-ITE`, `LAST-TAB-ITEM`, `LASTKEY`, `LC`, `LDBNAME`, `LE`, `LEAVE`, `LEFT-ALIGN`, `LEFT-ALIGNE`, `LEFT-ALIGNED`, `LEFT-TRIM`, `LENGTH`, `LIBRARY`, `LIKE`, `LIKE-SEQUENTIAL`, `LINE`, `LINE-COUNT`, `LINE-COUNTE`, `LINE-COUNTER`, `LIST-EVENTS`, `LIST-ITEM-PAIRS`, `LIST-ITEMS`, `LIST-PROPERTY-NAMES`, `LIST-QUERY-ATTRS`, `LIST-SET-ATTRS`, `LIST-WIDGETS`, `LISTI`, `LISTIN`, `LISTING`, `LITERAL-QUESTION`, `LITTLE-ENDIAN`, `LOAD`, `LOAD-DOMAINS`, `LOAD-ICON`, `LOAD-IMAGE`, `LOAD-IMAGE-DOWN`, `LOAD-IMAGE-INSENSITIVE`, `LOAD-IMAGE-UP`, `LOAD-MOUSE-P`, `LOAD-MOUSE-PO`, `LOAD-MOUSE-POI`, `LOAD-MOUSE-POIN`, `LOAD-MOUSE-POINT`, `LOAD-MOUSE-POINTE`, `LOAD-MOUSE-POINTER`, `LOAD-PICTURE`, `LOAD-SMALL-ICON`, `LOCAL-NAME`, `LOCAL-VERSION-INFO`, `LOCATOR-COLUMN-NUMBER`, `LOCATOR-LINE-NUMBER`, `LOCATOR-PUBLIC-ID`, `LOCATOR-SYSTEM-ID`, `LOCATOR-TYPE`, `LOCK-REGISTRATION`, `LOCKED`, `LOG`, `LOG-AUDIT-EVENT`, `LOG-MANAGER`, `LOGICAL`, `LOGIN-EXPIRATION-TIMESTAMP`, `LOGIN-HOST`, `LOGIN-STATE`, `LOGOUT`, `LONGCHAR`, `LOOKAHEAD`, `LOOKUP`, `LT`, `MACHINE-CLASS`, `MANDATORY`, `MANUAL-HIGHLIGHT`, `MAP`, `MARGIN-EXTRA`, `MARGIN-HEIGHT`, `MARGIN-HEIGHT-`, `MARGIN-HEIGHT-C`, `MARGIN-HEIGHT-CH`, `MARGIN-HEIGHT-CHA`, `MARGIN-HEIGHT-CHAR`, `MARGIN-HEIGHT-CHARS`, `MARGIN-HEIGHT-P`, `MARGIN-HEIGHT-PI`, `MARGIN-HEIGHT-PIX`, `MARGIN-HEIGHT-PIXE`, `MARGIN-HEIGHT-PIXEL`, `MARGIN-HEIGHT-PIXELS`, `MARGIN-WIDTH`, `MARGIN-WIDTH-`, `MARGIN-WIDTH-C`, `MARGIN-WIDTH-CH`, `MARGIN-WIDTH-CHA`, `MARGIN-WIDTH-CHAR`, `MARGIN-WIDTH-CHARS`, `MARGIN-WIDTH-P`, `MARGIN-WIDTH-PI`, `MARGIN-WIDTH-PIX`, `MARGIN-WIDTH-PIXE`, `MARGIN-WIDTH-PIXEL`, `MARGIN-WIDTH-PIXELS`, `MARK-NEW`, `MARK-ROW-STATE`, `MATCHES`, `MAX`, `MAX-BUTTON`, `MAX-CHARS`, `MAX-DATA-GUESS`, `MAX-HEIGHT`, `MAX-HEIGHT-C`, `MAX-HEIGHT-CH`, `MAX-HEIGHT-CHA`, `MAX-HEIGHT-CHAR`, `MAX-HEIGHT-CHARS`, `MAX-HEIGHT-P`, `MAX-HEIGHT-PI`, `MAX-HEIGHT-PIX`, `MAX-HEIGHT-PIXE`, `MAX-HEIGHT-PIXEL`, `MAX-HEIGHT-PIXELS`, `MAX-ROWS`, `MAX-SIZE`, `MAX-VAL`, `MAX-VALU`, `MAX-VALUE`, `MAX-WIDTH`, `MAX-WIDTH-`, `MAX-WIDTH-C`, `MAX-WIDTH-CH`, `MAX-WIDTH-CHA`, `MAX-WIDTH-CHAR`, `MAX-WIDTH-CHARS`, `MAX-WIDTH-P`, `MAX-WIDTH-PI`, `MAX-WIDTH-PIX`, `MAX-WIDTH-PIXE`, `MAX-WIDTH-PIXEL`, `MAX-WIDTH-PIXELS`, `MAXI`, `MAXIM`, `MAXIMIZE`, `MAXIMU`, `MAXIMUM`, `MAXIMUM-LEVEL`, `MD5-DIGEST`, `MEMBER`, `MEMPTR-TO-NODE-VALUE`, `MENU`, `MENU-BAR`, `MENU-ITEM`, `MENU-K`, `MENU-KE`, `MENU-KEY`, `MENU-M`, `MENU-MO`, `MENU-MOU`, `MENU-MOUS`, `MENU-MOUSE`, `MENUBAR`, `MERGE-BY-FIELD`, `MESSAGE`, `MESSAGE-AREA`, `MESSAGE-AREA-FONT`, `MESSAGE-LINES`, `METHOD`, `MIN`, `MIN-BUTTON`, `MIN-COLUMN-WIDTH-C`, `MIN-COLUMN-WIDTH-CH`, `MIN-COLUMN-WIDTH-CHA`, `MIN-COLUMN-WIDTH-CHAR`, `MIN-COLUMN-WIDTH-CHARS`, `MIN-COLUMN-WIDTH-P`, `MIN-COLUMN-WIDTH-PI`, `MIN-COLUMN-WIDTH-PIX`, `MIN-COLUMN-WIDTH-PIXE`, `MIN-COLUMN-WIDTH-PIXEL`, `MIN-COLUMN-WIDTH-PIXELS`, `MIN-HEIGHT`, `MIN-HEIGHT-`, `MIN-HEIGHT-C`, `MIN-HEIGHT-CH`, `MIN-HEIGHT-CHA`, `MIN-HEIGHT-CHAR`, `MIN-HEIGHT-CHARS`, `MIN-HEIGHT-P`, `MIN-HEIGHT-PI`, `MIN-HEIGHT-PIX`, `MIN-HEIGHT-PIXE`, `MIN-HEIGHT-PIXEL`, `MIN-HEIGHT-PIXELS`, `MIN-SIZE`, `MIN-VAL`, `MIN-VALU`, `MIN-VALUE`, `MIN-WIDTH`, `MIN-WIDTH-`, `MIN-WIDTH-C`, `MIN-WIDTH-CH`, `MIN-WIDTH-CHA`, `MIN-WIDTH-CHAR`, `MIN-WIDTH-CHARS`, `MIN-WIDTH-P`, `MIN-WIDTH-PI`, `MIN-WIDTH-PIX`, `MIN-WIDTH-PIXE`, `MIN-WIDTH-PIXEL`, `MIN-WIDTH-PIXELS`, `MINI`, `MINIM`, `MINIMU`, `MINIMUM`, `MOD`, `MODIFIED`, `MODU`, `MODUL`, `MODULO`, `MONTH`, `MOUSE`, `MOUSE-P`, `MOUSE-PO`, `MOUSE-POI`, `MOUSE-POIN`, `MOUSE-POINT`, `MOUSE-POINTE`, `MOUSE-POINTER`, `MOVABLE`, `MOVE-AFTER`, `MOVE-AFTER-`, `MOVE-AFTER-T`, `MOVE-AFTER-TA`, `MOVE-AFTER-TAB`, `MOVE-AFTER-TAB-`, `MOVE-AFTER-TAB-I`, `MOVE-AFTER-TAB-IT`, `MOVE-AFTER-TAB-ITE`, `MOVE-AFTER-TAB-ITEM`, `MOVE-BEFOR`, `MOVE-BEFORE`, `MOVE-BEFORE-`, `MOVE-BEFORE-T`, `MOVE-BEFORE-TA`, `MOVE-BEFORE-TAB`, `MOVE-BEFORE-TAB-`, `MOVE-BEFORE-TAB-I`, `MOVE-BEFORE-TAB-IT`, `MOVE-BEFORE-TAB-ITE`, `MOVE-BEFORE-TAB-ITEM`, `MOVE-COL`, `MOVE-COLU`, `MOVE-COLUM`, `MOVE-COLUMN`, `MOVE-TO-B`, `MOVE-TO-BO`, `MOVE-TO-BOT`, `MOVE-TO-BOTT`, `MOVE-TO-BOTTO`, `MOVE-TO-BOTTOM`, `MOVE-TO-EOF`, `MOVE-TO-T`, `MOVE-TO-TO`, `MOVE-TO-TOP`, `MPE`, `MTIME`, `MULTI-COMPILE`, `MULTIPLE`, `MULTIPLE-KEY`, `MULTITASKING-INTERVAL`, `MUST-EXIST`, `NAME`, `NAMESPACE-PREFIX`, `NAMESPACE-URI`, `NATIVE`, `NE`, `NEEDS-APPSERVER-PROMPT`, `NEEDS-PROMPT`, `NEW`, `NEW-INSTANCE`, `NEW-ROW`, `NEXT`, `NEXT-COLUMN`, `NEXT-PROMPT`, `NEXT-ROWID`, `NEXT-SIBLING`, `NEXT-TAB-I`, `NEXT-TAB-IT`, `NEXT-TAB-ITE`, `NEXT-TAB-ITEM`, `NEXT-VALUE`, `NO`, `NO-APPLY`, `NO-ARRAY-MESSAGE`, `NO-ASSIGN`, `NO-ATTR`, `NO-ATTR-`, `NO-ATTR-L`, `NO-ATTR-LI`, `NO-ATTR-LIS`, `NO-ATTR-LIST`, `NO-ATTR-S`, `NO-ATTR-SP`, `NO-ATTR-SPA`, `NO-ATTR-SPAC`, `NO-ATTR-SPACE`, `NO-AUTO-VALIDATE`, `NO-BIND-WHERE`, `NO-BOX`, `NO-CONSOLE`, `NO-CONVERT`, `NO-CONVERT-3D-COLORS`, `NO-CURRENT-VALUE`, `NO-DEBUG`, `NO-DRAG`, `NO-ECHO`, `NO-EMPTY-SPACE`, `NO-ERROR`, `NO-F`, `NO-FI`, `NO-FIL`, `NO-FILL`, `NO-FOCUS`, `NO-HELP`, `NO-HIDE`, `NO-INDEX-HINT`, `NO-INHERIT-BGC`, `NO-INHERIT-BGCO`, `NO-INHERIT-BGCOLOR`, `NO-INHERIT-FGC`, `NO-INHERIT-FGCO`, `NO-INHERIT-FGCOL`, `NO-INHERIT-FGCOLO`, `NO-INHERIT-FGCOLOR`, `NO-JOIN-BY-SQLDB`, `NO-LABE`, `NO-LABELS`, `NO-LOBS`, `NO-LOCK`, `NO-LOOKAHEAD`, `NO-MAP`, `NO-MES`, `NO-MESS`, `NO-MESSA`, `NO-MESSAG`, `NO-MESSAGE`, `NO-PAUSE`, `NO-PREFE`, `NO-PREFET`, `NO-PREFETC`, `NO-PREFETCH`, `NO-ROW-MARKERS`, `NO-SCROLLBAR-VERTICAL`, `NO-SEPARATE-CONNECTION`, `NO-SEPARATORS`, `NO-TAB-STOP`, `NO-UND`, `NO-UNDE`, `NO-UNDER`, `NO-UNDERL`, `NO-UNDERLI`, `NO-UNDERLIN`, `NO-UNDERLINE`, `NO-UNDO`, `NO-VAL`, `NO-VALI`, `NO-VALID`, `NO-VALIDA`, `NO-VALIDAT`, `NO-VALIDATE`, `NO-WAIT`, `NO-WORD-WRAP`, `NODE-VALUE-TO-MEMPTR`, `NONAMESPACE-SCHEMA-LOCATION`, `NONE`, `NORMALIZE`, `NOT`, `NOT-ACTIVE`, `NOW`, `NULL`, `NUM-ALI`, `NUM-ALIA`, `NUM-ALIAS`, `NUM-ALIASE`, `NUM-ALIASES`, `NUM-BUFFERS`, `NUM-BUT`, `NUM-BUTT`, `NUM-BUTTO`, `NUM-BUTTON`, `NUM-BUTTONS`, `NUM-COL`, `NUM-COLU`, `NUM-COLUM`, `NUM-COLUMN`, `NUM-COLUMNS`, `NUM-COPIES`, `NUM-DBS`, `NUM-DROPPED-FILES`, `NUM-ENTRIES`, `NUM-FIELDS`, `NUM-FORMATS`, `NUM-ITEMS`, `NUM-ITERATIONS`, `NUM-LINES`, `NUM-LOCKED-COL`, `NUM-LOCKED-COLU`, `NUM-LOCKED-COLUM`, `NUM-LOCKED-COLUMN`, `NUM-LOCKED-COLUMNS`, `NUM-MESSAGES`, `NUM-PARAMETERS`, `NUM-REFERENCES`, `NUM-REPLACED`, `NUM-RESULTS`, `NUM-SELECTED`, `NUM-SELECTED-`, `NUM-SELECTED-ROWS`, `NUM-SELECTED-W`, `NUM-SELECTED-WI`, `NUM-SELECTED-WID`, `NUM-SELECTED-WIDG`, `NUM-SELECTED-WIDGE`, `NUM-SELECTED-WIDGET`, `NUM-SELECTED-WIDGETS`, `NUM-TABS`, `NUM-TO-RETAIN`, `NUM-VISIBLE-COLUMNS`, `NUMERIC`, `NUMERIC-F`, `NUMERIC-FO`, `NUMERIC-FOR`, `NUMERIC-FORM`, `NUMERIC-FORMA`, `NUMERIC-FORMAT`, `OCTET-LENGTH`, `OF`, `OFF`, `OK`, `OK-CANCEL`, `OLD`, `ON`, `ON-FRAME`, `ON-FRAME-`, `ON-FRAME-B`, `ON-FRAME-BO`, `ON-FRAME-BOR`, `ON-FRAME-BORD`, `ON-FRAME-BORDE`, `ON-FRAME-BORDER`, `OPEN`, `OPSYS`, `OPTION`, `OR`, `ORDERED-JOIN`, `ORDINAL`, `OS-APPEND`, `OS-COMMAND`, `OS-COPY`, `OS-CREATE-DIR`, `OS-DELETE`, `OS-DIR`, `OS-DRIVE`, `OS-DRIVES`, `OS-ERROR`, `OS-GETENV`, `OS-RENAME`, `OTHERWISE`, `OUTPUT`, `OVERLAY`, `OVERRIDE`, `OWNER`, `PAGE`, `PAGE-BOT`, `PAGE-BOTT`, `PAGE-BOTTO`, `PAGE-BOTTOM`, `PAGE-NUM`, `PAGE-NUMB`, `PAGE-NUMBE`, `PAGE-NUMBER`, `PAGE-SIZE`, `PAGE-TOP`, `PAGE-WID`, `PAGE-WIDT`, `PAGE-WIDTH`, `PAGED`, `PARAM`, `PARAME`, `PARAMET`, `PARAMETE`, `PARAMETER`, `PARENT`, `PARSE-STATUS`, `PARTIAL-KEY`, `PASCAL`, `PASSWORD-FIELD`, `PATHNAME`, `PAUSE`, `PBE-HASH-ALG`, `PBE-HASH-ALGO`, `PBE-HASH-ALGOR`, `PBE-HASH-ALGORI`, `PBE-HASH-ALGORIT`, `PBE-HASH-ALGORITH`, `PBE-HASH-ALGORITHM`, `PBE-KEY-ROUNDS`, `PDBNAME`, `PERSIST`, `PERSISTE`, `PERSISTEN`, `PERSISTENT`, `PERSISTENT-CACHE-DISABLED`, `PFC`, `PFCO`, `PFCOL`, `PFCOLO`, `PFCOLOR`, `PIXELS`, `PIXELS-PER-COL`, `PIXELS-PER-COLU`, `PIXELS-PER-COLUM`, `PIXELS-PER-COLUMN`, `PIXELS-PER-ROW`, `POPUP-M`, `POPUP-ME`, `POPUP-MEN`, `POPUP-MENU`, `POPUP-O`, `POPUP-ON`, `POPUP-ONL`, `POPUP-ONLY`, `PORTRAIT`, `POSITION`, `PRECISION`, `PREFER-DATASET`, `PREPARE-STRING`, `PREPARED`, `PREPROC`, `PREPROCE`, `PREPROCES`, `PREPROCESS`, `PRESEL`, `PRESELE`, `PRESELEC`, `PRESELECT`, `PREV`, `PREV-COLUMN`, `PREV-SIBLING`, `PREV-TAB-I`, `PREV-TAB-IT`, `PREV-TAB-ITE`, `PREV-TAB-ITEM`, `PRIMARY`, `PRINTER`, `PRINTER-CONTROL-HANDLE`, `PRINTER-HDC`, `PRINTER-NAME`, `PRINTER-PORT`, `PRINTER-SETUP`, `PRIVATE`, `PRIVATE-D`, `PRIVATE-DA`, `PRIVATE-DAT`, `PRIVATE-DATA`, `PRIVILEGES`, `PROC-HA`, `PROC-HAN`, `PROC-HAND`, `PROC-HANDL`, `PROC-HANDLE`, `PROC-ST`, `PROC-STA`, `PROC-STAT`, `PROC-STATU`, `PROC-STATUS`, `PROC-TEXT`, `PROC-TEXT-BUFFER`, `PROCE`, `PROCED`, `PROCEDU`, `PROCEDUR`, `PROCEDURE`, `PROCEDURE-CALL-TYPE`, `PROCEDURE-TYPE`, `PROCESS`, `PROFILER`, `PROGRAM-NAME`, `PROGRESS`, `PROGRESS-S`, `PROGRESS-SO`, `PROGRESS-SOU`, `PROGRESS-SOUR`, `PROGRESS-SOURC`, `PROGRESS-SOURCE`, `PROMPT`, `PROMPT-F`, `PROMPT-FO`, `PROMPT-FOR`, `PROMSGS`, `PROPATH`, `PROPERTY`, `PROTECTED`, `PROVERS`, `PROVERSI`, `PROVERSIO`, `PROVERSION`, `PROXY`, `PROXY-PASSWORD`, `PROXY-USERID`, `PUBLIC`, `PUBLIC-ID`, `PUBLISH`, `PUBLISHED-EVENTS`, `PUT`, `PUT-BYTE`, `PUT-DOUBLE`, `PUT-FLOAT`, `PUT-INT64`, `PUT-KEY-VAL`, `PUT-KEY-VALU`, `PUT-KEY-VALUE`, `PUT-LONG`, `PUT-SHORT`, `PUT-STRING`, `PUT-UNSIGNED-LONG`, `PUTBYTE`, `QUERY`, `QUERY-CLOSE`, `QUERY-OFF-END`, `QUERY-OPEN`, `QUERY-PREPARE`, `QUERY-TUNING`, `QUESTION`, `QUIT`, `QUOTER`, `R-INDEX`, `RADIO-BUTTONS`, `RADIO-SET`, `RANDOM`, `RAW`, `RAW-TRANSFER`, `RCODE-INFO`, `RCODE-INFOR`, `RCODE-INFORM`, `RCODE-INFORMA`, `RCODE-INFORMAT`, `RCODE-INFORMATI`, `RCODE-INFORMATIO`, `RCODE-INFORMATION`, `READ-AVAILABLE`, `READ-EXACT-NUM`, `READ-FILE`, `READ-JSON`, `READ-ONLY`, `READ-XML`, `READ-XMLSCHEMA`, `READKEY`, `REAL`, `RECID`, `RECORD-LENGTH`, `RECT`, `RECTA`, `RECTAN`, `RECTANG`, `RECTANGL`, `RECTANGLE`, `RECURSIVE`, `REFERENCE-ONLY`, `REFRESH`, `REFRESH-AUDIT-POLICY`, `REFRESHABLE`, `REGISTER-DOMAIN`, `RELEASE`, `REMOTE`, `REMOVE-EVENTS-PROCEDURE`, `REMOVE-SUPER-PROCEDURE`, `REPEAT`, `REPLACE`, `REPLACE-SELECTION-TEXT`, `REPOSITION`, `REPOSITION-BACKWARD`, `REPOSITION-FORWARD`, `REPOSITION-MODE`, `REPOSITION-TO-ROW`, `REPOSITION-TO-ROWID`, `REQUEST`, `REQUEST-INFO`, `RESET`, `RESIZA`, `RESIZAB`, `RESIZABL`, `RESIZABLE`, `RESIZE`, `RESPONSE-INFO`, `RESTART-ROW`, `RESTART-ROWID`, `RETAIN`, `RETAIN-SHAPE`, `RETRY`, `RETRY-CANCEL`, `RETURN`, `RETURN-ALIGN`, `RETURN-ALIGNE`, `RETURN-INS`, `RETURN-INSE`, `RETURN-INSER`, `RETURN-INSERT`, `RETURN-INSERTE`, `RETURN-INSERTED`, `RETURN-TO-START-DI`, `RETURN-TO-START-DIR`, `RETURN-VAL`, `RETURN-VALU`, `RETURN-VALUE`, `RETURN-VALUE-DATA-TYPE`, `RETURNS`, `REVERSE-FROM`, `REVERT`, `REVOKE`, `RGB-VALUE`, `RIGHT-ALIGNED`, `RIGHT-TRIM`, `ROLES`, `ROUND`, `ROUTINE-LEVEL`, `ROW`, `ROW-HEIGHT-CHARS`, `ROW-HEIGHT-PIXELS`, `ROW-MARKERS`, `ROW-OF`, `ROW-RESIZABLE`, `ROWID`, `RULE`, `RUN`, `RUN-PROCEDURE`, `SAVE CACHE`, `SAVE`, `SAVE-AS`, `SAVE-FILE`, `SAX-COMPLE`, `SAX-COMPLET`, `SAX-COMPLETE`, `SAX-PARSE`, `SAX-PARSE-FIRST`, `SAX-PARSE-NEXT`, `SAX-PARSER-ERROR`, `SAX-RUNNING`, `SAX-UNINITIALIZED`, `SAX-WRITE-BEGIN`, `SAX-WRITE-COMPLETE`, `SAX-WRITE-CONTENT`, `SAX-WRITE-ELEMENT`, `SAX-WRITE-ERROR`, `SAX-WRITE-IDLE`, `SAX-WRITE-TAG`, `SAX-WRITER`, `SCHEMA`, `SCHEMA-LOCATION`, `SCHEMA-MARSHAL`, `SCHEMA-PATH`, `SCREEN`, `SCREEN-IO`, `SCREEN-LINES`, `SCREEN-VAL`, `SCREEN-VALU`, `SCREEN-VALUE`, `SCROLL`, `SCROLL-BARS`, `SCROLL-DELTA`, `SCROLL-OFFSET`, `SCROLL-TO-CURRENT-ROW`, `SCROLL-TO-I`, `SCROLL-TO-IT`, `SCROLL-TO-ITE`, `SCROLL-TO-ITEM`, `SCROLL-TO-SELECTED-ROW`, `SCROLLABLE`, `SCROLLBAR-H`, `SCROLLBAR-HO`, `SCROLLBAR-HOR`, `SCROLLBAR-HORI`, `SCROLLBAR-HORIZ`, `SCROLLBAR-HORIZO`, `SCROLLBAR-HORIZON`, `SCROLLBAR-HORIZONT`, `SCROLLBAR-HORIZONTA`, `SCROLLBAR-HORIZONTAL`, `SCROLLBAR-V`, `SCROLLBAR-VE`, `SCROLLBAR-VER`, `SCROLLBAR-VERT`, `SCROLLBAR-VERTI`, `SCROLLBAR-VERTIC`, `SCROLLBAR-VERTICA`, `SCROLLBAR-VERTICAL`, `SCROLLED-ROW-POS`, `SCROLLED-ROW-POSI`, `SCROLLED-ROW-POSIT`, `SCROLLED-ROW-POSITI`, `SCROLLED-ROW-POSITIO`, `SCROLLED-ROW-POSITION`, `SCROLLING`, `SDBNAME`, `SEAL`, `SEAL-TIMESTAMP`, `SEARCH`, `SEARCH-SELF`, `SEARCH-TARGET`, `SECTION`, `SECURITY-POLICY`, `SEEK`, `SELECT`, `SELECT-ALL`, `SELECT-FOCUSED-ROW`, `SELECT-NEXT-ROW`, `SELECT-PREV-ROW`, `SELECT-ROW`, `SELECTABLE`, `SELECTED`, `SELECTION`, `SELECTION-END`, `SELECTION-LIST`, `SELECTION-START`, `SELECTION-TEXT`, `SELF`, `SEND`, `SEND-SQL-STATEMENT`, `SENSITIVE`, `SEPARATE-CONNECTION`, `SEPARATOR-FGCOLOR`, `SEPARATORS`, `SERIALIZABLE`, `SERIALIZE-HIDDEN`, `SERIALIZE-NAME`, `SERVER`, `SERVER-CONNECTION-BOUND`, `SERVER-CONNECTION-BOUND-REQUEST`, `SERVER-CONNECTION-CONTEXT`, `SERVER-CONNECTION-ID`, `SERVER-OPERATING-MODE`, `SESSION`, `SESSION-ID`, `SET`, `SET-APPL-CONTEXT`, `SET-ATTR-CALL-TYPE`, `SET-ATTRIBUTE-NODE`, `SET-BLUE`, `SET-BLUE-`, `SET-BLUE-V`, `SET-BLUE-VA`, `SET-BLUE-VAL`, `SET-BLUE-VALU`, `SET-BLUE-VALUE`, `SET-BREAK`, `SET-BUFFERS`, `SET-CALLBACK`, `SET-CLIENT`, `SET-COMMIT`, `SET-CONTENTS`, `SET-CURRENT-VALUE`, `SET-DB-CLIENT`, `SET-DYNAMIC`, `SET-EVENT-MANAGER-OPTION`, `SET-GREEN`, `SET-GREEN-`, `SET-GREEN-V`, `SET-GREEN-VA`, `SET-GREEN-VAL`, `SET-GREEN-VALU`, `SET-GREEN-VALUE`, `SET-INPUT-SOURCE`, `SET-OPTION`, `SET-OUTPUT-DESTINATION`, `SET-PARAMETER`, `SET-POINTER-VALUE`, `SET-PROPERTY`, `SET-RED`, `SET-RED-`, `SET-RED-V`, `SET-RED-VA`, `SET-RED-VAL`, `SET-RED-VALU`, `SET-RED-VALUE`, `SET-REPOSITIONED-ROW`, `SET-RGB-VALUE`, `SET-ROLLBACK`, `SET-SELECTION`, `SET-SIZE`, `SET-SORT-ARROW`, `SET-WAIT-STATE`, `SETUSER`, `SETUSERI`, `SETUSERID`, `SHA1-DIGEST`, `SHARE`, `SHARE-`, `SHARE-L`, `SHARE-LO`, `SHARE-LOC`, `SHARE-LOCK`, `SHARED`, `SHOW-IN-TASKBAR`, `SHOW-STAT`, `SHOW-STATS`, `SIDE-LAB`, `SIDE-LABE`, `SIDE-LABEL`, `SIDE-LABEL-H`, `SIDE-LABEL-HA`, `SIDE-LABEL-HAN`, `SIDE-LABEL-HAND`, `SIDE-LABEL-HANDL`, `SIDE-LABEL-HANDLE`, `SIDE-LABELS`, `SIGNATURE`, `SILENT`, `SIMPLE`, `SINGLE`, `SINGLE-RUN`, `SINGLETON`, `SIZE`, `SIZE-C`, `SIZE-CH`, `SIZE-CHA`, `SIZE-CHAR`, `SIZE-CHARS`, `SIZE-P`, `SIZE-PI`, `SIZE-PIX`, `SIZE-PIXE`, `SIZE-PIXEL`, `SIZE-PIXELS`, `SKIP`, `SKIP-DELETED-RECORD`, `SLIDER`, `SMALL-ICON`, `SMALL-TITLE`, `SMALLINT`, `SOME`, `SORT`, `SORT-ASCENDING`, `SORT-NUMBER`, `SOURCE`, `SOURCE-PROCEDURE`, `SPACE`, `SQL`, `SQRT`, `SSL-SERVER-NAME`, `STANDALONE`, `START`, `START-DOCUMENT`, `START-ELEMENT`, `START-MOVE`, `START-RESIZE`, `START-ROW-RESIZE`, `STATE-DETAIL`, `STATIC`, `STATUS`, `STATUS-AREA`, `STATUS-AREA-FONT`, `STDCALL`, `STOP`, `STOP-AFTER`, `STOP-PARSING`, `STOPPE`, `STOPPED`, `STORED-PROC`, `STORED-PROCE`, `STORED-PROCED`, `STORED-PROCEDU`, `STORED-PROCEDUR`, `STORED-PROCEDURE`, `STREAM`, `STREAM-HANDLE`, `STREAM-IO`, `STRETCH-TO-FIT`, `STRICT`, `STRICT-ENTITY-RESOLUTION`, `STRING`, `STRING-VALUE`, `STRING-XREF`, `SUB-AVE`, `SUB-AVER`, `SUB-AVERA`, `SUB-AVERAG`, `SUB-AVERAGE`, `SUB-COUNT`, `SUB-MAXIMUM`, `SUB-MENU`, `SUB-MIN`, `SUB-MINIMUM`, `SUB-TOTAL`, `SUBSCRIBE`, `SUBST`, `SUBSTI`, `SUBSTIT`, `SUBSTITU`, `SUBSTITUT`, `SUBSTITUTE`, `SUBSTR`, `SUBSTRI`, `SUBSTRIN`, `SUBSTRING`, `SUBTYPE`, `SUM`, `SUM-MAX`, `SUM-MAXI`, `SUM-MAXIM`, `SUM-MAXIMU`, `SUPER`, `SUPER-PROCEDURES`, `SUPPRESS-NAMESPACE-PROCESSING`, `SUPPRESS-W`, `SUPPRESS-WA`, `SUPPRESS-WAR`, `SUPPRESS-WARN`, `SUPPRESS-WARNI`, `SUPPRESS-WARNIN`, `SUPPRESS-WARNING`, `SUPPRESS-WARNINGS`, `SYMMETRIC-ENCRYPTION-ALGORITHM`, `SYMMETRIC-ENCRYPTION-IV`, `SYMMETRIC-ENCRYPTION-KEY`, `SYMMETRIC-SUPPORT`, `SYSTEM-ALERT`, `SYSTEM-ALERT-`, `SYSTEM-ALERT-B`, `SYSTEM-ALERT-BO`, `SYSTEM-ALERT-BOX`, `SYSTEM-ALERT-BOXE`, `SYSTEM-ALERT-BOXES`, `SYSTEM-DIALOG`, `SYSTEM-HELP`, `SYSTEM-ID`, `TAB-POSITION`, `TAB-STOP`, `TABLE`, `TABLE-HANDLE`, `TABLE-NUMBER`, `TABLE-SCAN`, `TARGET`, `TARGET-PROCEDURE`, `TEMP-DIR`, `TEMP-DIRE`, `TEMP-DIREC`, `TEMP-DIRECT`, `TEMP-DIRECTO`, `TEMP-DIRECTOR`, `TEMP-DIRECTORY`, `TEMP-TABLE`, `TEMP-TABLE-PREPARE`, `TERM`, `TERMI`, `TERMIN`, `TERMINA`, `TERMINAL`, `TERMINATE`, `TEXT`, `TEXT-CURSOR`, `TEXT-SEG-GROW`, `TEXT-SELECTED`, `THEN`, `THIS-OBJECT`, `THIS-PROCEDURE`, `THREAD-SAFE`, `THREE-D`, `THROUGH`, `THROW`, `THRU`, `TIC-MARKS`, `TIME`, `TIME-SOURCE`, `TITLE`, `TITLE-BGC`, `TITLE-BGCO`, `TITLE-BGCOL`, `TITLE-BGCOLO`, `TITLE-BGCOLOR`, `TITLE-DC`, `TITLE-DCO`, `TITLE-DCOL`, `TITLE-DCOLO`, `TITLE-DCOLOR`, `TITLE-FGC`, `TITLE-FGCO`, `TITLE-FGCOL`, `TITLE-FGCOLO`, `TITLE-FGCOLOR`, `TITLE-FO`, `TITLE-FON`, `TITLE-FONT`, `TO`, `TO-ROWID`, `TODAY`, `TOGGLE-BOX`, `TOOLTIP`, `TOOLTIPS`, `TOP-NAV-QUERY`, `TOP-ONLY`, `TOPIC`, `TOTAL`, `TRAILING`, `TRANS`, `TRANS-INIT-PROCEDURE`, `TRANSACTION`, `TRANSACTION-MODE`, `TRANSPARENT`, `TRIGGER`, `TRIGGERS`, `TRIM`, `TRUE`, `TRUNC`, `TRUNCA`, `TRUNCAT`, `TRUNCATE`, `TYPE`, `TYPE-OF`, `UNBOX`, `UNBUFF`, `UNBUFFE`, `UNBUFFER`, `UNBUFFERE`, `UNBUFFERED`, `UNDERL`, `UNDERLI`, `UNDERLIN`, `UNDERLINE`, `UNDO`, `UNFORM`, `UNFORMA`, `UNFORMAT`, `UNFORMATT`, `UNFORMATTE`, `UNFORMATTED`, `UNION`, `UNIQUE`, `UNIQUE-ID`, `UNIQUE-MATCH`, `UNIX`, `UNLESS-HIDDEN`, `UNLOAD`, `UNSIGNED-LONG`, `UNSUBSCRIBE`, `UP`, `UPDATE`, `UPDATE-ATTRIBUTE`, `URL`, `URL-DECODE`, `URL-ENCODE`, `URL-PASSWORD`, `URL-USERID`, `USE`, `USE-DICT-EXPS`, `USE-FILENAME`, `USE-INDEX`, `USE-REVVIDEO`, `USE-TEXT`, `USE-UNDERLINE`, `USE-WIDGET-POOL`, `USER`, `USER-ID`, `USERID`, `USING`, `V6DISPLAY`, `V6FRAME`, `VALID-EVENT`, `VALID-HANDLE`, `VALID-OBJECT`, `VALIDATE`, `VALIDATE-EXPRESSION`, `VALIDATE-MESSAGE`, `VALIDATE-SEAL`, `VALIDATION-ENABLED`, `VALUE`, `VALUE-CHANGED`, `VALUES`, `VAR`, `VARI`, `VARIA`, `VARIAB`, `VARIABL`, `VARIABLE`, `VERBOSE`, `VERSION`, `VERT`, `VERTI`, `VERTIC`, `VERTICA`, `VERTICAL`, `VIEW`, `VIEW-AS`, `VIEW-FIRST-COLUMN-ON-REOPEN`, `VIRTUAL-HEIGHT`, `VIRTUAL-HEIGHT-`, `VIRTUAL-HEIGHT-C`, `VIRTUAL-HEIGHT-CH`, `VIRTUAL-HEIGHT-CHA`, `VIRTUAL-HEIGHT-CHAR`, `VIRTUAL-HEIGHT-CHARS`, `VIRTUAL-HEIGHT-P`, `VIRTUAL-HEIGHT-PI`, `VIRTUAL-HEIGHT-PIX`, `VIRTUAL-HEIGHT-PIXE`, `VIRTUAL-HEIGHT-PIXEL`, `VIRTUAL-HEIGHT-PIXELS`, `VIRTUAL-WIDTH`, `VIRTUAL-WIDTH-`, `VIRTUAL-WIDTH-C`, `VIRTUAL-WIDTH-CH`, `VIRTUAL-WIDTH-CHA`, `VIRTUAL-WIDTH-CHAR`, `VIRTUAL-WIDTH-CHARS`, `VIRTUAL-WIDTH-P`, `VIRTUAL-WIDTH-PI`, `VIRTUAL-WIDTH-PIX`, `VIRTUAL-WIDTH-PIXE`, `VIRTUAL-WIDTH-PIXEL`, `VIRTUAL-WIDTH-PIXELS`, `VISIBLE`, `VOID`, `WAIT`, `WAIT-FOR`, `WARNING`, `WEB-CONTEXT`, `WEEKDAY`, `WHEN`, `WHERE`, `WHILE`, `WIDGET`, `WIDGET-E`, `WIDGET-EN`, `WIDGET-ENT`, `WIDGET-ENTE`, `WIDGET-ENTER`, `WIDGET-ID`, `WIDGET-L`, `WIDGET-LE`, `WIDGET-LEA`, `WIDGET-LEAV`, `WIDGET-LEAVE`, `WIDGET-POOL`, `WIDTH`, `WIDTH-`, `WIDTH-C`, `WIDTH-CH`, `WIDTH-CHA`, `WIDTH-CHAR`, `WIDTH-CHARS`, `WIDTH-P`, `WIDTH-PI`, `WIDTH-PIX`, `WIDTH-PIXE`, `WIDTH-PIXEL`, `WIDTH-PIXELS`, `WINDOW`, `WINDOW-MAXIM`, `WINDOW-MAXIMI`, `WINDOW-MAXIMIZ`, `WINDOW-MAXIMIZE`, `WINDOW-MAXIMIZED`, `WINDOW-MINIM`, `WINDOW-MINIMI`, `WINDOW-MINIMIZ`, `WINDOW-MINIMIZE`, `WINDOW-MINIMIZED`, `WINDOW-NAME`, `WINDOW-NORMAL`, `WINDOW-STA`, `WINDOW-STAT`, `WINDOW-STATE`, `WINDOW-SYSTEM`, `WITH`, `WORD-INDEX`, `WORD-WRAP`, `WORK-AREA-HEIGHT-PIXELS`, `WORK-AREA-WIDTH-PIXELS`, `WORK-AREA-X`, `WORK-AREA-Y`, `WORK-TAB`, `WORK-TABL`, `WORK-TABLE`, `WORKFILE`, `WRITE`, `WRITE-CDATA`, `WRITE-CHARACTERS`, `WRITE-COMMENT`, `WRITE-DATA-ELEMENT`, `WRITE-EMPTY-ELEMENT`, `WRITE-ENTITY-REF`, `WRITE-EXTERNAL-DTD`, `WRITE-FRAGMENT`, `WRITE-JSON`, `WRITE-MESSAGE`, `WRITE-PROCESSING-INSTRUCTION`, `WRITE-STATUS`, `WRITE-XML`, `WRITE-XMLSCHEMA`, `X`, `X-OF`, `XCODE`, `XML-DATA-TYPE`, `XML-ENTITY-EXPANSION-LIMIT`, `XML-NODE-TYPE`, `XML-SCHEMA-PATH`, `XML-STRICT-ENTITY-RESOLUTION`, `XML-SUPPRESS-NAMESPACE-PROCESSING`, `XREF`, `XREF-XML`, `Y`, `Y-OF`, `YEAR`, `YEAR-OFFSET`, `YES`, `YES-NO`, `YES-NO-CANCEL`), KeywordReserved, nil}, //nolint + {`"(\\\\|\\[^\\]|[^"\\])*"`, LiteralStringDouble, nil}, + {`'(\\\\|\\[^\\]|[^'\\])*'`, LiteralStringSingle, nil}, + {`[0-9][0-9]*\.[0-9]+([eE][0-9]+)?[fd]?`, LiteralNumberFloat, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`\s+`, Text, nil}, + {`[+*/=-]`, Operator, nil}, + {`[.:()]`, Punctuation, nil}, + {`.`, NameVariable, nil}, + }, + "comment": { + {`[^*/]`, CommentMultiline, nil}, + {`/\*`, CommentMultiline, Push()}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[*/]`, CommentMultiline, nil}, + {`\/\/`, CommentSingle, nil}, + }, + "preprocessor": { + {`[^{}]`, CommentPreproc, nil}, + {`\{`, CommentPreproc, Push()}, + {`\}`, CommentPreproc, Pop(1)}, + }, + } + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/o/openscad.go b/vendor/github.com/alecthomas/chroma/lexers/o/openscad.go new file mode 100644 index 0000000..d18b9ca --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/o/openscad.go @@ -0,0 +1,47 @@ +package o + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +var OpenSCAD = internal.Register(MustNewLazyLexer( + &Config{ + Name: "OpenSCAD", + Aliases: []string{"openscad"}, + Filenames: []string{"*.scad"}, + MimeTypes: []string{"text/x-scad"}, + }, + openSCADRules, +)) + +func openSCADRules() Rules { + return Rules{ + "root": { + {`[^\S\n]+`, Text, nil}, + {`\n`, Text, nil}, + {`//(\n|[\w\W]*?[^\\]\n)`, CommentSingle, nil}, + {`/(\\\n)?[*][\w\W]*?[*](\\\n)?/`, CommentMultiline, nil}, + {`/(\\\n)?[*][\w\W]*`, CommentMultiline, nil}, + {`[{}\[\]\(\),;:]`, Punctuation, nil}, + {`[*!#%\-+=?/]`, Operator, nil}, + {`<|<=|==|!=|>=|>|&&|\|\|`, Operator, nil}, + {`\$(f[asn]|t|vp[rtd]|children)`, NameVariableMagic, nil}, + {Words(``, `\b`, `PI`, `undef`), KeywordConstant, nil}, + {`(use|include)((?:\s|\\\\s)+)`, ByGroups(KeywordNamespace, Text), Push("includes")}, + {`(module)(\s*)([^\s\(]+)`, ByGroups(KeywordNamespace, Text, NameNamespace), nil}, + {`(function)(\s*)([^\s\(]+)`, ByGroups(KeywordDeclaration, Text, NameFunction), nil}, + {`\b(true|false)\b`, Literal, nil}, + {`\b(function|module|include|use|for|intersection_for|if|else|return)\b`, Keyword, nil}, + {`\b(circle|square|polygon|text|sphere|cube|cylinder|polyhedron|translate|rotate|scale|resize|mirror|multmatrix|color|offset|hull|minkowski|union|difference|intersection|abs|sign|sin|cos|tan|acos|asin|atan|atan2|floor|round|ceil|ln|log|pow|sqrt|exp|rands|min|max|concat|lookup|str|chr|search|version|version_num|norm|cross|parent_module|echo|import|import_dxf|dxf_linear_extrude|linear_extrude|rotate_extrude|surface|projection|render|dxf_cross|dxf_dim|let|assign|len)\b`, NameBuiltin, nil}, + {`\bchildren\b`, NameBuiltinPseudo, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`-?\d+(\.\d+)?(e[+-]?\d+)?`, Number, nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + }, + "includes": { + {"(<)([^>]*)(>)", ByGroups(Punctuation, CommentPreprocFile, Punctuation), nil}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/o/org.go b/vendor/github.com/alecthomas/chroma/lexers/o/org.go new file mode 100644 index 0000000..00f6df4 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/o/org.go @@ -0,0 +1,108 @@ +package o + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Org mode lexer. +var Org = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Org Mode", + Aliases: []string{"org", "orgmode"}, + Filenames: []string{"*.org"}, + MimeTypes: []string{"text/org"}, // https://lists.gnu.org/r/emacs-orgmode/2017-09/msg00087.html + }, + orgRules, +)) + +func orgRules() Rules { + return Rules{ + "root": { + {`^# .*$`, Comment, nil}, + // Headings + {`^(\*)( COMMENT)( .*)$`, ByGroups(GenericHeading, NameEntity, GenericStrong), nil}, + {`^(\*\*+)( COMMENT)( .*)$`, ByGroups(GenericSubheading, NameEntity, Text), nil}, + {`^(\*)( DONE)( .*)$`, ByGroups(GenericHeading, LiteralStringRegex, GenericStrong), nil}, + {`^(\*\*+)( DONE)( .*)$`, ByGroups(GenericSubheading, LiteralStringRegex, Text), nil}, + {`^(\*)( TODO)( .*)$`, ByGroups(GenericHeading, Error, GenericStrong), nil}, + {`^(\*\*+)( TODO)( .*)$`, ByGroups(GenericSubheading, Error, Text), nil}, + {`^(\*)( .+?)( :[a-zA-Z0-9_@:]+:)$`, ByGroups(GenericHeading, GenericStrong, GenericEmph), nil}, // Level 1 heading with tags + {`^(\*)( .+)$`, ByGroups(GenericHeading, GenericStrong), nil}, // // Level 1 heading with NO tags + {`^(\*\*+)( .+?)( :[a-zA-Z0-9_@:]+:)$`, ByGroups(GenericSubheading, Text, GenericEmph), nil}, // Level 2+ heading with tags + {`^(\*\*+)( .+)$`, ByGroups(GenericSubheading, Text), nil}, // Level 2+ heading with NO tags + // Checkbox lists + {`^( *)([+-] )(\[[ X]\])( .+)$`, ByGroups(Text, Keyword, Keyword, UsingSelf("inline")), nil}, + {`^( +)(\* )(\[[ X]\])( .+)$`, ByGroups(Text, Keyword, Keyword, UsingSelf("inline")), nil}, + // Definition lists + {`^( *)([+-] )([^ \n]+ ::)( .+)$`, ByGroups(Text, Keyword, Keyword, UsingSelf("inline")), nil}, + {`^( +)(\* )([^ \n]+ ::)( .+)$`, ByGroups(Text, Keyword, Keyword, UsingSelf("inline")), nil}, + // Unordered lists + {`^( *)([+-] )(.+)$`, ByGroups(Text, Keyword, UsingSelf("inline")), nil}, + {`^( +)(\* )(.+)$`, ByGroups(Text, Keyword, UsingSelf("inline")), nil}, + // Ordered lists + {`^( *)([0-9]+[.)])( \[@[0-9]+\])( .+)$`, ByGroups(Text, Keyword, GenericEmph, UsingSelf("inline")), nil}, + {`^( *)([0-9]+[.)])( .+)$`, ByGroups(Text, Keyword, UsingSelf("inline")), nil}, + // Dynamic Blocks + {`(?i)^( *#\+begin: )([^ ]+)([\w\W]*?\n)([\w\W]*?)(^ *#\+end: *$)`, ByGroups(Comment, CommentSpecial, Comment, UsingSelf("inline"), Comment), nil}, + // Blocks + // - Comment Blocks + {`(?i)^( *#\+begin_comment *\n)([\w\W]*?)(^ *#\+end_comment *$)`, ByGroups(Comment, Comment, Comment), nil}, + // - Src Blocks + { + `(?i)^( *#\+begin_src )([^ \n]+)(.*?\n)([\w\W]*?)(^ *#\+end_src *$)`, + UsingByGroup( + internal.Get, + 2, 4, + Comment, CommentSpecial, Comment, Text, Comment, + ), + nil, + }, + // - Export Blocks + { + `(?i)^( *#\+begin_export )(\w+)( *\n)([\w\W]*?)(^ *#\+end_export *$)`, + UsingByGroup( + internal.Get, + 2, 4, + Comment, CommentSpecial, Text, Text, Comment, + ), + nil, + }, + // - Org Special, Example, Verse, etc. Blocks + {`(?i)^( *#\+begin_)(\w+)( *\n)([\w\W]*?)(^ *#\+end_\2)( *$)`, ByGroups(Comment, Comment, Text, Text, Comment, Text), nil}, + // Keywords + {`^(#\+\w+)(:.*)$`, ByGroups(CommentSpecial, Comment), nil}, // Other Org keywords like #+title + // Properties and Drawers + {`(?i)^( *:\w+: *\n)([\w\W]*?)(^ *:end: *$)`, ByGroups(Comment, CommentSpecial, Comment), nil}, + // Line break operator + {`^(.*)(\\\\)$`, ByGroups(UsingSelf("inline"), Operator), nil}, + // Deadline/Scheduled + {`(?i)^( *(?:DEADLINE|SCHEDULED): )(<[^<>]+?> *)$`, ByGroups(Comment, CommentSpecial), nil}, // DEADLINE/SCHEDULED: + // DONE state CLOSED + {`(?i)^( *CLOSED: )(\[[^][]+?\] *)$`, ByGroups(Comment, CommentSpecial), nil}, // CLOSED: [datestamp] + // All other lines + Include("inline"), + }, + "inline": { + {`(\s)*(\*[^ \n*][^*]+?[^ \n*]\*)((?=\W|\n|$))`, ByGroups(Text, GenericStrong, Text), nil}, // Bold + {`(\s)*(/[^/]+?/)((?=\W|\n|$))`, ByGroups(Text, GenericEmph, Text), nil}, // Italic + {`(\s)*(=[^\n=]+?=)((?=\W|\n|$))`, ByGroups(Text, NameClass, Text), nil}, // Verbatim + {`(\s)*(~[^\n~]+?~)((?=\W|\n|$))`, ByGroups(Text, NameClass, Text), nil}, // Code + {`(\s)*(\+[^+]+?\+)((?=\W|\n|$))`, ByGroups(Text, GenericDeleted, Text), nil}, // Strikethrough + {`(\s)*(_[^_]+?_)((?=\W|\n|$))`, ByGroups(Text, GenericUnderline, Text), nil}, // Underline + {`(<)([^<>]+?)(>)`, ByGroups(Text, String, Text), nil}, // + {`[{]{3}[^}]+[}]{3}`, NameBuiltin, nil}, // {{{macro(foo,1)}}} + {`([^[])(\[fn:)([^]]+?)(\])([^]])`, ByGroups(Text, NameBuiltinPseudo, LiteralString, NameBuiltinPseudo, Text), nil}, // [fn:1] + // Links + {`(\[\[)([^][]+?)(\]\[)([^][]+)(\]\])`, ByGroups(Text, NameAttribute, Text, NameTag, Text), nil}, // [[link][descr]] + {`(\[\[)([^][]+?)(\]\])`, ByGroups(Text, NameAttribute, Text), nil}, // [[link]] + {`(<<)([^<>]+?)(>>)`, ByGroups(Text, NameAttribute, Text), nil}, // <> + // Tables + {`^( *)(\|[ -].*?[ -]\|)$`, ByGroups(Text, String), nil}, + // Blank lines, newlines + {`\n`, Text, nil}, + // Any other text + {`.`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/pacman.go b/vendor/github.com/alecthomas/chroma/lexers/p/pacman.go new file mode 100644 index 0000000..00c6255 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/pacman.go @@ -0,0 +1,30 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Pacmanconf lexer. +var Pacmanconf = internal.Register(MustNewLazyLexer( + &Config{ + Name: "PacmanConf", + Aliases: []string{"pacmanconf"}, + Filenames: []string{"pacman.conf"}, + MimeTypes: []string{}, + }, + pacmanconfRules, +)) + +func pacmanconfRules() Rules { + return Rules{ + "root": { + {`#.*$`, CommentSingle, nil}, + {`^\s*\[.*?\]\s*$`, Keyword, nil}, + {`(\w+)(\s*)(=)`, ByGroups(NameAttribute, Text, Operator), nil}, + {`^(\s*)(\w+)(\s*)$`, ByGroups(Text, NameAttribute, Text), nil}, + {Words(``, `\b`, `$repo`, `$arch`, `%o`, `%u`), NameVariable, nil}, + {`.`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/perl.go b/vendor/github.com/alecthomas/chroma/lexers/p/perl.go new file mode 100644 index 0000000..6aa338a --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/perl.go @@ -0,0 +1,142 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Perl lexer. +var Perl = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Perl", + Aliases: []string{"perl", "pl"}, + Filenames: []string{"*.pl", "*.pm", "*.t"}, + MimeTypes: []string{"text/x-perl", "application/x-perl"}, + DotAll: true, + }, + perlRules, +)) + +func perlRules() Rules { + return Rules{ + "balanced-regex": { + {`/(\\\\|\\[^\\]|[^\\/])*/[egimosx]*`, LiteralStringRegex, Pop(1)}, + {`!(\\\\|\\[^\\]|[^\\!])*![egimosx]*`, LiteralStringRegex, Pop(1)}, + {`\\(\\\\|[^\\])*\\[egimosx]*`, LiteralStringRegex, Pop(1)}, + {`\{(\\\\|\\[^\\]|[^\\}])*\}[egimosx]*`, LiteralStringRegex, Pop(1)}, + {`<(\\\\|\\[^\\]|[^\\>])*>[egimosx]*`, LiteralStringRegex, Pop(1)}, + {`\[(\\\\|\\[^\\]|[^\\\]])*\][egimosx]*`, LiteralStringRegex, Pop(1)}, + {`\((\\\\|\\[^\\]|[^\\)])*\)[egimosx]*`, LiteralStringRegex, Pop(1)}, + {`@(\\\\|\\[^\\]|[^\\@])*@[egimosx]*`, LiteralStringRegex, Pop(1)}, + {`%(\\\\|\\[^\\]|[^\\%])*%[egimosx]*`, LiteralStringRegex, Pop(1)}, + {`\$(\\\\|\\[^\\]|[^\\$])*\$[egimosx]*`, LiteralStringRegex, Pop(1)}, + }, + "root": { + {`\A\#!.+?$`, CommentHashbang, nil}, + {`\#.*?$`, CommentSingle, nil}, + {`^=[a-zA-Z0-9]+\s+.*?\n=cut`, CommentMultiline, nil}, + {Words(``, `\b`, `case`, `continue`, `do`, `else`, `elsif`, `for`, `foreach`, `if`, `last`, `my`, `next`, `our`, `redo`, `reset`, `then`, `unless`, `until`, `while`, `print`, `new`, `BEGIN`, `CHECK`, `INIT`, `END`, `return`), Keyword, nil}, + {`(format)(\s+)(\w+)(\s*)(=)(\s*\n)`, ByGroups(Keyword, Text, Name, Text, Punctuation, Text), Push("format")}, + {`(eq|lt|gt|le|ge|ne|not|and|or|cmp)\b`, OperatorWord, nil}, + {`s/(\\\\|\\[^\\]|[^\\/])*/(\\\\|\\[^\\]|[^\\/])*/[egimosx]*`, LiteralStringRegex, nil}, + {`s!(\\\\|\\!|[^!])*!(\\\\|\\!|[^!])*![egimosx]*`, LiteralStringRegex, nil}, + {`s\\(\\\\|[^\\])*\\(\\\\|[^\\])*\\[egimosx]*`, LiteralStringRegex, nil}, + {`s@(\\\\|\\[^\\]|[^\\@])*@(\\\\|\\[^\\]|[^\\@])*@[egimosx]*`, LiteralStringRegex, nil}, + {`s%(\\\\|\\[^\\]|[^\\%])*%(\\\\|\\[^\\]|[^\\%])*%[egimosx]*`, LiteralStringRegex, nil}, + {`s\{(\\\\|\\[^\\]|[^\\}])*\}\s*`, LiteralStringRegex, Push("balanced-regex")}, + {`s<(\\\\|\\[^\\]|[^\\>])*>\s*`, LiteralStringRegex, Push("balanced-regex")}, + {`s\[(\\\\|\\[^\\]|[^\\\]])*\]\s*`, LiteralStringRegex, Push("balanced-regex")}, + {`s\((\\\\|\\[^\\]|[^\\)])*\)\s*`, LiteralStringRegex, Push("balanced-regex")}, + {`m?/(\\\\|\\[^\\]|[^\\/\n])*/[gcimosx]*`, LiteralStringRegex, nil}, + {`m(?=[/!\\{<\[(@%$])`, LiteralStringRegex, Push("balanced-regex")}, + {`((?<==~)|(?<=\())\s*/(\\\\|\\[^\\]|[^\\/])*/[gcimosx]*`, LiteralStringRegex, nil}, + {`\s+`, Text, nil}, + {Words(``, `\b`, `abs`, `accept`, `alarm`, `atan2`, `bind`, `binmode`, `bless`, `caller`, `chdir`, `chmod`, `chomp`, `chop`, `chown`, `chr`, `chroot`, `close`, `closedir`, `connect`, `continue`, `cos`, `crypt`, `dbmclose`, `dbmopen`, `defined`, `delete`, `die`, `dump`, `each`, `endgrent`, `endhostent`, `endnetent`, `endprotoent`, `endpwent`, `endservent`, `eof`, `eval`, `exec`, `exists`, `exit`, `exp`, `fcntl`, `fileno`, `flock`, `fork`, `format`, `formline`, `getc`, `getgrent`, `getgrgid`, `getgrnam`, `gethostbyaddr`, `gethostbyname`, `gethostent`, `getlogin`, `getnetbyaddr`, `getnetbyname`, `getnetent`, `getpeername`, `getpgrp`, `getppid`, `getpriority`, `getprotobyname`, `getprotobynumber`, `getprotoent`, `getpwent`, `getpwnam`, `getpwuid`, `getservbyname`, `getservbyport`, `getservent`, `getsockname`, `getsockopt`, `glob`, `gmtime`, `goto`, `grep`, `hex`, `import`, `index`, `int`, `ioctl`, `join`, `keys`, `kill`, `last`, `lc`, `lcfirst`, `length`, `link`, `listen`, `local`, `localtime`, `log`, `lstat`, `map`, `mkdir`, `msgctl`, `msgget`, `msgrcv`, `msgsnd`, `my`, `next`, `oct`, `open`, `opendir`, `ord`, `our`, `pack`, `pipe`, `pop`, `pos`, `printf`, `prototype`, `push`, `quotemeta`, `rand`, `read`, `readdir`, `readline`, `readlink`, `readpipe`, `recv`, `redo`, `ref`, `rename`, `reverse`, `rewinddir`, `rindex`, `rmdir`, `scalar`, `seek`, `seekdir`, `select`, `semctl`, `semget`, `semop`, `send`, `setgrent`, `sethostent`, `setnetent`, `setpgrp`, `setpriority`, `setprotoent`, `setpwent`, `setservent`, `setsockopt`, `shift`, `shmctl`, `shmget`, `shmread`, `shmwrite`, `shutdown`, `sin`, `sleep`, `socket`, `socketpair`, `sort`, `splice`, `split`, `sprintf`, `sqrt`, `srand`, `stat`, `study`, `substr`, `symlink`, `syscall`, `sysopen`, `sysread`, `sysseek`, `system`, `syswrite`, `tell`, `telldir`, `tie`, `tied`, `time`, `times`, `tr`, `truncate`, `uc`, `ucfirst`, `umask`, `undef`, `unlink`, `unpack`, `unshift`, `untie`, `utime`, `values`, `vec`, `wait`, `waitpid`, `wantarray`, `warn`, `write`), NameBuiltin, nil}, + {`((__(DATA|DIE|WARN)__)|(STD(IN|OUT|ERR)))\b`, NameBuiltinPseudo, nil}, + {`(<<)([\'"]?)([a-zA-Z_]\w*)(\2;?\n.*?\n)(\3)(\n)`, ByGroups(LiteralString, LiteralString, LiteralStringDelimiter, LiteralString, LiteralStringDelimiter, Text), nil}, + {`__END__`, CommentPreproc, Push("end-part")}, + {`\$\^[ADEFHILMOPSTWX]`, NameVariableGlobal, nil}, + {"\\$[\\\\\\\"\\[\\]'&`+*.,;=%~?@$!<>(^|/-](?!\\w)", NameVariableGlobal, nil}, + {`[$@%#]+`, NameVariable, Push("varname")}, + {`0_?[0-7]+(_[0-7]+)*`, LiteralNumberOct, nil}, + {`0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*`, LiteralNumberHex, nil}, + {`0b[01]+(_[01]+)*`, LiteralNumberBin, nil}, + {`(?i)(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?`, LiteralNumberFloat, nil}, + {`(?i)\d+(_\d*)*e[+-]?\d+(_\d*)*`, LiteralNumberFloat, nil}, + {`\d+(_\d+)*`, LiteralNumberInteger, nil}, + {`'(\\\\|\\[^\\]|[^'\\])*'`, LiteralString, nil}, + {`"(\\\\|\\[^\\]|[^"\\])*"`, LiteralString, nil}, + {"`(\\\\\\\\|\\\\[^\\\\]|[^`\\\\])*`", LiteralStringBacktick, nil}, + {`<([^\s>]+)>`, LiteralStringRegex, nil}, + {`(q|qq|qw|qr|qx)\{`, LiteralStringOther, Push("cb-string")}, + {`(q|qq|qw|qr|qx)\(`, LiteralStringOther, Push("rb-string")}, + {`(q|qq|qw|qr|qx)\[`, LiteralStringOther, Push("sb-string")}, + {`(q|qq|qw|qr|qx)\<`, LiteralStringOther, Push("lt-string")}, + {`(q|qq|qw|qr|qx)([\W_])(.|\n)*?\2`, LiteralStringOther, nil}, + {`(package)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)`, ByGroups(Keyword, Text, NameNamespace), nil}, + {`(use|require|no)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)`, ByGroups(Keyword, Text, NameNamespace), nil}, + {`(sub)(\s+)`, ByGroups(Keyword, Text), Push("funcname")}, + {Words(``, `\b`, `no`, `package`, `require`, `use`), Keyword, nil}, + {`(\[\]|\*\*|::|<<|>>|>=|<=>|<=|={3}|!=|=~|!~|&&?|\|\||\.{1,3})`, Operator, nil}, + {`[-+/*%=<>&^|!\\~]=?`, Operator, nil}, + {`[()\[\]:;,<>/?{}]`, Punctuation, nil}, + {`(?=\w)`, Name, Push("name")}, + }, + "format": { + {`\.\n`, LiteralStringInterpol, Pop(1)}, + {`[^\n]*\n`, LiteralStringInterpol, nil}, + }, + "varname": { + {`\s+`, Text, nil}, + {`\{`, Punctuation, Pop(1)}, + {`\)|,`, Punctuation, Pop(1)}, + {`\w+::`, NameNamespace, nil}, + {`[\w:]+`, NameVariable, Pop(1)}, + }, + "name": { + {`[a-zA-Z_]\w*(::[a-zA-Z_]\w*)*(::)?(?=\s*->)`, NameNamespace, Pop(1)}, + {`[a-zA-Z_]\w*(::[a-zA-Z_]\w*)*::`, NameNamespace, Pop(1)}, + {`[\w:]+`, Name, Pop(1)}, + {`[A-Z_]+(?=\W)`, NameConstant, Pop(1)}, + {`(?=\W)`, Text, Pop(1)}, + }, + "funcname": { + {`[a-zA-Z_]\w*[!?]?`, NameFunction, nil}, + {`\s+`, Text, nil}, + {`(\([$@%]*\))(\s*)`, ByGroups(Punctuation, Text), nil}, + {`;`, Punctuation, Pop(1)}, + {`.*?\{`, Punctuation, Pop(1)}, + }, + "cb-string": { + {`\\[{}\\]`, LiteralStringOther, nil}, + {`\\`, LiteralStringOther, nil}, + {`\{`, LiteralStringOther, Push("cb-string")}, + {`\}`, LiteralStringOther, Pop(1)}, + {`[^{}\\]+`, LiteralStringOther, nil}, + }, + "rb-string": { + {`\\[()\\]`, LiteralStringOther, nil}, + {`\\`, LiteralStringOther, nil}, + {`\(`, LiteralStringOther, Push("rb-string")}, + {`\)`, LiteralStringOther, Pop(1)}, + {`[^()]+`, LiteralStringOther, nil}, + }, + "sb-string": { + {`\\[\[\]\\]`, LiteralStringOther, nil}, + {`\\`, LiteralStringOther, nil}, + {`\[`, LiteralStringOther, Push("sb-string")}, + {`\]`, LiteralStringOther, Pop(1)}, + {`[^\[\]]+`, LiteralStringOther, nil}, + }, + "lt-string": { + {`\\[<>\\]`, LiteralStringOther, nil}, + {`\\`, LiteralStringOther, nil}, + {`\<`, LiteralStringOther, Push("lt-string")}, + {`\>`, LiteralStringOther, Pop(1)}, + {`[^<>]+`, LiteralStringOther, nil}, + }, + "end-part": { + {`.+`, CommentPreproc, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/pig.go b/vendor/github.com/alecthomas/chroma/lexers/p/pig.go new file mode 100644 index 0000000..f2852c1 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/pig.go @@ -0,0 +1,61 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Pig lexer. +var Pig = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Pig", + Aliases: []string{"pig"}, + Filenames: []string{"*.pig"}, + MimeTypes: []string{"text/x-pig"}, + CaseInsensitive: true, + }, + pigRules, +)) + +func pigRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`--.*`, Comment, nil}, + {`/\*[\w\W]*?\*/`, CommentMultiline, nil}, + {`\\\n`, Text, nil}, + {`\\`, Text, nil}, + {`\'(?:\\[ntbrf\\\']|\\u[0-9a-f]{4}|[^\'\\\n\r])*\'`, LiteralString, nil}, + Include("keywords"), + Include("types"), + Include("builtins"), + Include("punct"), + Include("operators"), + {`[0-9]*\.[0-9]+(e[0-9]+)?[fd]?`, LiteralNumberFloat, nil}, + {`0x[0-9a-f]+`, LiteralNumberHex, nil}, + {`[0-9]+L?`, LiteralNumberInteger, nil}, + {`\n`, Text, nil}, + {`([a-z_]\w*)(\s*)(\()`, ByGroups(NameFunction, Text, Punctuation), nil}, + {`[()#:]`, Text, nil}, + {`[^(:#\'")\s]+`, Text, nil}, + {`\S+\s+`, Text, nil}, + }, + "keywords": { + {`(assert|and|any|all|arrange|as|asc|bag|by|cache|CASE|cat|cd|cp|%declare|%default|define|dense|desc|describe|distinct|du|dump|eval|exex|explain|filter|flatten|foreach|full|generate|group|help|if|illustrate|import|inner|input|into|is|join|kill|left|limit|load|ls|map|matches|mkdir|mv|not|null|onschema|or|order|outer|output|parallel|pig|pwd|quit|register|returns|right|rm|rmf|rollup|run|sample|set|ship|split|stderr|stdin|stdout|store|stream|through|union|using|void)\b`, Keyword, nil}, + }, + "builtins": { + {`(AVG|BinStorage|cogroup|CONCAT|copyFromLocal|copyToLocal|COUNT|cross|DIFF|MAX|MIN|PigDump|PigStorage|SIZE|SUM|TextLoader|TOKENIZE)\b`, NameBuiltin, nil}, + }, + "types": { + {`(bytearray|BIGINTEGER|BIGDECIMAL|chararray|datetime|double|float|int|long|tuple)\b`, KeywordType, nil}, + }, + "punct": { + {`[;(){}\[\]]`, Punctuation, nil}, + }, + "operators": { + {`[#=,./%+\-?]`, Operator, nil}, + {`(eq|gt|lt|gte|lte|neq|matches)\b`, Operator, nil}, + {`(==|<=|<|>=|>|!=)`, Operator, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/pkgconfig.go b/vendor/github.com/alecthomas/chroma/lexers/p/pkgconfig.go new file mode 100644 index 0000000..9e02410 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/pkgconfig.go @@ -0,0 +1,45 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Pkgconfig lexer. +var Pkgconfig = internal.Register(MustNewLazyLexer( + &Config{ + Name: "PkgConfig", + Aliases: []string{"pkgconfig"}, + Filenames: []string{"*.pc"}, + MimeTypes: []string{}, + }, + pkgconfigRules, +)) + +func pkgconfigRules() Rules { + return Rules{ + "root": { + {`#.*$`, CommentSingle, nil}, + {`^(\w+)(=)`, ByGroups(NameAttribute, Operator), nil}, + {`^([\w.]+)(:)`, ByGroups(NameTag, Punctuation), Push("spvalue")}, + Include("interp"), + {`[^${}#=:\n.]+`, Text, nil}, + {`.`, Text, nil}, + }, + "interp": { + {`\$\$`, Text, nil}, + {`\$\{`, LiteralStringInterpol, Push("curly")}, + }, + "curly": { + {`\}`, LiteralStringInterpol, Pop(1)}, + {`\w+`, NameAttribute, nil}, + }, + "spvalue": { + Include("interp"), + {`#.*$`, CommentSingle, Pop(1)}, + {`\n`, Text, Pop(1)}, + {`[^${}#\n]+`, Text, nil}, + {`.`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/plaintext.go b/vendor/github.com/alecthomas/chroma/lexers/p/plaintext.go new file mode 100644 index 0000000..058c02a --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/plaintext.go @@ -0,0 +1,17 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +var Plaintext = internal.Register(MustNewLazyLexer( + &Config{ + Name: "plaintext", + Aliases: []string{"text", "plain", "no-highlight"}, + Filenames: []string{"*.txt"}, + MimeTypes: []string{"text/plain"}, + Priority: 0.1, + }, + internal.PlaintextRules, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/plsql.go b/vendor/github.com/alecthomas/chroma/lexers/p/plsql.go new file mode 100644 index 0000000..324d3fe --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/plsql.go @@ -0,0 +1,62 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Pl/Pgsql lexer. +var PLpgSQL = internal.Register(MustNewLazyLexer( + &Config{ + Name: "PL/pgSQL", + Aliases: []string{"plpgsql"}, + Filenames: []string{}, + MimeTypes: []string{"text/x-plpgsql"}, + NotMultiline: true, + CaseInsensitive: true, + }, + plpgSQLRules, +)) + +func plpgSQLRules() Rules { + return Rules{ + "root": { + {`\%[a-z]\w*\b`, NameBuiltin, nil}, + {`:=`, Operator, nil}, + {`\<\<[a-z]\w*\>\>`, NameLabel, nil}, + {`\#[a-z]\w*\b`, KeywordPseudo, nil}, + {`\s+`, TextWhitespace, nil}, + {`--.*\n?`, CommentSingle, nil}, + {`/\*`, CommentMultiline, Push("multiline-comments")}, + {`(bigint|bigserial|bit|bit\s+varying|bool|boolean|box|bytea|char|character|character\s+varying|cidr|circle|date|decimal|double\s+precision|float4|float8|inet|int|int2|int4|int8|integer|interval|json|jsonb|line|lseg|macaddr|money|numeric|path|pg_lsn|point|polygon|real|serial|serial2|serial4|serial8|smallint|smallserial|text|time|timestamp|timestamptz|timetz|tsquery|tsvector|txid_snapshot|uuid|varbit|varchar|with\s+time\s+zone|without\s+time\s+zone|xml|anyarray|anyelement|anyenum|anynonarray|anyrange|cstring|fdw_handler|internal|language_handler|opaque|record|void)\b`, NameBuiltin, nil}, + {Words(``, `\b`, `ABORT`, `ABSOLUTE`, `ACCESS`, `ACTION`, `ADD`, `ADMIN`, `AFTER`, `AGGREGATE`, `ALL`, `ALSO`, `ALTER`, `ALWAYS`, `ANALYSE`, `ANALYZE`, `AND`, `ANY`, `ARRAY`, `AS`, `ASC`, `ASSERTION`, `ASSIGNMENT`, `ASYMMETRIC`, `AT`, `ATTRIBUTE`, `AUTHORIZATION`, `BACKWARD`, `BEFORE`, `BEGIN`, `BETWEEN`, `BIGINT`, `BINARY`, `BIT`, `BOOLEAN`, `BOTH`, `BY`, `CACHE`, `CALLED`, `CASCADE`, `CASCADED`, `CASE`, `CAST`, `CATALOG`, `CHAIN`, `CHAR`, `CHARACTER`, `CHARACTERISTICS`, `CHECK`, `CHECKPOINT`, `CLASS`, `CLOSE`, `CLUSTER`, `COALESCE`, `COLLATE`, `COLLATION`, `COLUMN`, `COMMENT`, `COMMENTS`, `COMMIT`, `COMMITTED`, `CONCURRENTLY`, `CONFIGURATION`, `CONNECTION`, `CONSTRAINT`, `CONSTRAINTS`, `CONTENT`, `CONTINUE`, `CONVERSION`, `COPY`, `COST`, `CREATE`, `CROSS`, `CSV`, `CURRENT`, `CURRENT_CATALOG`, `CURRENT_DATE`, `CURRENT_ROLE`, `CURRENT_SCHEMA`, `CURRENT_TIME`, `CURRENT_TIMESTAMP`, `CURRENT_USER`, `CURSOR`, `CYCLE`, `DATA`, `DATABASE`, `DAY`, `DEALLOCATE`, `DEC`, `DECIMAL`, `DECLARE`, `DEFAULT`, `DEFAULTS`, `DEFERRABLE`, `DEFERRED`, `DEFINER`, `DELETE`, `DELIMITER`, `DELIMITERS`, `DESC`, `DICTIONARY`, `DISABLE`, `DISCARD`, `DISTINCT`, `DO`, `DOCUMENT`, `DOMAIN`, `DOUBLE`, `DROP`, `EACH`, `ELSE`, `ENABLE`, `ENCODING`, `ENCRYPTED`, `END`, `ENUM`, `ESCAPE`, `EVENT`, `EXCEPT`, `EXCLUDE`, `EXCLUDING`, `EXCLUSIVE`, `EXECUTE`, `EXISTS`, `EXPLAIN`, `EXTENSION`, `EXTERNAL`, `EXTRACT`, `FALSE`, `FAMILY`, `FETCH`, `FILTER`, `FIRST`, `FLOAT`, `FOLLOWING`, `FOR`, `FORCE`, `FOREIGN`, `FORWARD`, `FREEZE`, `FROM`, `FULL`, `FUNCTION`, `FUNCTIONS`, `GLOBAL`, `GRANT`, `GRANTED`, `GREATEST`, `GROUP`, `HANDLER`, `HAVING`, `HEADER`, `HOLD`, `HOUR`, `IDENTITY`, `IF`, `ILIKE`, `IMMEDIATE`, `IMMUTABLE`, `IMPLICIT`, `IN`, `INCLUDING`, `INCREMENT`, `INDEX`, `INDEXES`, `INHERIT`, `INHERITS`, `INITIALLY`, `INLINE`, `INNER`, `INOUT`, `INPUT`, `INSENSITIVE`, `INSERT`, `INSTEAD`, `INT`, `INTEGER`, `INTERSECT`, `INTERVAL`, `INTO`, `INVOKER`, `IS`, `ISNULL`, `ISOLATION`, `JOIN`, `KEY`, `LABEL`, `LANGUAGE`, `LARGE`, `LAST`, `LATERAL`, `LC_COLLATE`, `LC_CTYPE`, `LEADING`, `LEAKPROOF`, `LEAST`, `LEFT`, `LEVEL`, `LIKE`, `LIMIT`, `LISTEN`, `LOAD`, `LOCAL`, `LOCALTIME`, `LOCALTIMESTAMP`, `LOCATION`, `LOCK`, `MAPPING`, `MATCH`, `MATERIALIZED`, `MAXVALUE`, `MINUTE`, `MINVALUE`, `MODE`, `MONTH`, `MOVE`, `NAME`, `NAMES`, `NATIONAL`, `NATURAL`, `NCHAR`, `NEXT`, `NO`, `NONE`, `NOT`, `NOTHING`, `NOTIFY`, `NOTNULL`, `NOWAIT`, `NULL`, `NULLIF`, `NULLS`, `NUMERIC`, `OBJECT`, `OF`, `OFF`, `OFFSET`, `OIDS`, `ON`, `ONLY`, `OPERATOR`, `OPTION`, `OPTIONS`, `OR`, `ORDER`, `ORDINALITY`, `OUT`, `OUTER`, `OVER`, `OVERLAPS`, `OVERLAY`, `OWNED`, `OWNER`, `PARSER`, `PARTIAL`, `PARTITION`, `PASSING`, `PASSWORD`, `PLACING`, `PLANS`, `POLICY`, `POSITION`, `PRECEDING`, `PRECISION`, `PREPARE`, `PREPARED`, `PRESERVE`, `PRIMARY`, `PRIOR`, `PRIVILEGES`, `PROCEDURAL`, `PROCEDURE`, `PROGRAM`, `QUOTE`, `RANGE`, `READ`, `REAL`, `REASSIGN`, `RECHECK`, `RECURSIVE`, `REF`, `REFERENCES`, `REFRESH`, `REINDEX`, `RELATIVE`, `RELEASE`, `RENAME`, `REPEATABLE`, `REPLACE`, `REPLICA`, `RESET`, `RESTART`, `RESTRICT`, `RETURNING`, `RETURNS`, `REVOKE`, `RIGHT`, `ROLE`, `ROLLBACK`, `ROW`, `ROWS`, `RULE`, `SAVEPOINT`, `SCHEMA`, `SCROLL`, `SEARCH`, `SECOND`, `SECURITY`, `SELECT`, `SEQUENCE`, `SEQUENCES`, `SERIALIZABLE`, `SERVER`, `SESSION`, `SESSION_USER`, `SET`, `SETOF`, `SHARE`, `SHOW`, `SIMILAR`, `SIMPLE`, `SMALLINT`, `SNAPSHOT`, `SOME`, `STABLE`, `STANDALONE`, `START`, `STATEMENT`, `STATISTICS`, `STDIN`, `STDOUT`, `STORAGE`, `STRICT`, `STRIP`, `SUBSTRING`, `SYMMETRIC`, `SYSID`, `SYSTEM`, `TABLE`, `TABLES`, `TABLESPACE`, `TEMP`, `TEMPLATE`, `TEMPORARY`, `TEXT`, `THEN`, `TIME`, `TIMESTAMP`, `TO`, `TRAILING`, `TRANSACTION`, `TREAT`, `TRIGGER`, `TRIM`, `TRUE`, `TRUNCATE`, `TRUSTED`, `TYPE`, `TYPES`, `UNBOUNDED`, `UNCOMMITTED`, `UNENCRYPTED`, `UNION`, `UNIQUE`, `UNKNOWN`, `UNLISTEN`, `UNLOGGED`, `UNTIL`, `UPDATE`, `USER`, `USING`, `VACUUM`, `VALID`, `VALIDATE`, `VALIDATOR`, `VALUE`, `VALUES`, `VARCHAR`, `VARIADIC`, `VARYING`, `VERBOSE`, `VERSION`, `VIEW`, `VIEWS`, `VOLATILE`, `WHEN`, `WHERE`, `WHITESPACE`, `WINDOW`, `WITH`, `WITHIN`, `WITHOUT`, `WORK`, `WRAPPER`, `WRITE`, `XML`, `XMLATTRIBUTES`, `XMLCONCAT`, `XMLELEMENT`, `XMLEXISTS`, `XMLFOREST`, `XMLPARSE`, `XMLPI`, `XMLROOT`, `XMLSERIALIZE`, `YEAR`, `YES`, `ZONE`, `ALIAS`, `CONSTANT`, `DIAGNOSTICS`, `ELSIF`, `EXCEPTION`, `EXIT`, `FOREACH`, `GET`, `LOOP`, `NOTICE`, `OPEN`, `PERFORM`, `QUERY`, `RAISE`, `RETURN`, `REVERSE`, `SQLSTATE`, `WHILE`), Keyword, nil}, + {"[+*/<>=~!@#%^&|`?-]+", Operator, nil}, + {`::`, Operator, nil}, + {`\$\d+`, NameVariable, nil}, + {`([0-9]*\.[0-9]*|[0-9]+)(e[+-]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`((?:E|U&)?)(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Push("string")}, + {`((?:U&)?)(")`, ByGroups(LiteralStringAffix, LiteralStringName), Push("quoted-ident")}, + // { `(?s)(\$)([^$]*)(\$)(.*?)(\$)(\2)(\$)`, ?? ??, nil }, + {`[a-z_]\w*`, Name, nil}, + {`:(['"]?)[a-z]\w*\b\1`, NameVariable, nil}, + {`[;:()\[\]{},.]`, Punctuation, nil}, + }, + "multiline-comments": { + {`/\*`, CommentMultiline, Push("multiline-comments")}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[^/*]+`, CommentMultiline, nil}, + {`[/*]`, CommentMultiline, nil}, + }, + "string": { + {`[^']+`, LiteralStringSingle, nil}, + {`''`, LiteralStringSingle, nil}, + {`'`, LiteralStringSingle, Pop(1)}, + }, + "quoted-ident": { + {`[^"]+`, LiteralStringName, nil}, + {`""`, LiteralStringName, nil}, + {`"`, LiteralStringName, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/plutus_core.go b/vendor/github.com/alecthomas/chroma/lexers/p/plutus_core.go new file mode 100644 index 0000000..b2ad4e1 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/plutus_core.go @@ -0,0 +1,76 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// nolint + +// Lexer for the Plutus Core Languages (version 2.1) +// +// including both Typed- and Untyped- versions +// based on “Formal Specification of the Plutus Core Language (version 2.1)”, published 6th April 2021: +// https://hydra.iohk.io/build/8205579/download/1/plutus-core-specification.pdf + +var PlutusCoreLang = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Plutus Core", + Aliases: []string{"plutus-core", "plc"}, + Filenames: []string{"*.plc"}, + MimeTypes: []string{"text/x-plutus-core", "application/x-plutus-core"}, + }, + plutusCoreRules, +)) + +func plutusCoreRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`(\(|\))`, Punctuation, nil}, + {`(\[|\])`, Punctuation, nil}, + {`({|})`, Punctuation, nil}, + + // Constants. Figure 1. + // For version, see handling of (program ...) below. + {`([+-]?\d+)`, LiteralNumberInteger, nil}, + {`(#([a-fA-F0-9][a-fA-F0-9])+)`, LiteralString, nil}, + {`(\(\))`, NameConstant, nil}, + {`(True|False)`, NameConstant, nil}, + + // Keywords. Figures 2 and 15. + // Special handling for program because it is followed by a version. + {`(con |abs |iwrap |unwrap |lam |builtin |delay |force |error)`, Keyword, nil}, + {`(fun |all |ifix |lam |con )`, Keyword, nil}, + {`(type|fun )`, Keyword, nil}, + {`(program )(\S+)`, ByGroups(Keyword, LiteralString), nil}, + + // Built-in Types. Figure 12. + {`(unit|bool|integer|bytestring|string)`, KeywordType, nil}, + + // Built-ins Functions. Figure 14 but, more importantly, implementation: + // https://github.com/input-output-hk/plutus/blob/6d759c4/plutus-core/plutus-core/src/PlutusCore/Default/Builtins.hs#L42-L111 + {`(addInteger |subtractInteger |multiplyInteger |divideInteger |quotientInteger |remainderInteger |modInteger |equalsInteger |lessThanInteger |lessThanEqualsInteger )`, NameBuiltin, nil}, + {`(appendByteString |consByteString |sliceByteString |lengthOfByteString |indexByteString |equalsByteString |lessThanByteString |lessThanEqualsByteString )`, NameBuiltin, nil}, + {`(sha2_256 |sha3_256 |blake2b_256 |verifySignature )`, NameBuiltin, nil}, + {`(appendString |equalsString |encodeUtf8 |decodeUtf8 )`, NameBuiltin, nil}, + {`(ifThenElse )`, NameBuiltin, nil}, + {`(chooseUnit )`, NameBuiltin, nil}, + {`(trace )`, NameBuiltin, nil}, + {`(fstPair |sndPair )`, NameBuiltin, nil}, + {`(chooseList |mkCons |headList |tailList |nullList )`, NameBuiltin, nil}, + {`(chooseData |constrData |mapData |listData |iData |bData |unConstrData |unMapData |unListData |unIData |unBData |equalsData )`, NameBuiltin, nil}, + {`(mkPairData |mkNilData |mkNilPairData )`, NameBuiltin, nil}, + + // Name. Figure 1. + {`([a-zA-Z][a-zA-Z0-9_']*)`, Name, nil}, + + // Unicode String. Not in the specification. + {`"`, LiteralStringDouble, Push("string")}, + }, + "string": { + {`[^\\"]+`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/pony.go b/vendor/github.com/alecthomas/chroma/lexers/p/pony.go new file mode 100644 index 0000000..41d5682 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/pony.go @@ -0,0 +1,63 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Pony lexer. +var Pony = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Pony", + Aliases: []string{"pony"}, + Filenames: []string{"*.pony"}, + MimeTypes: []string{}, + }, + ponyRules, +)) + +func ponyRules() Rules { + return Rules{ + "root": { + {`\n`, Text, nil}, + {`[^\S\n]+`, Text, nil}, + {`//.*\n`, CommentSingle, nil}, + {`/\*`, CommentMultiline, Push("nested_comment")}, + {`"""(?:.|\n)*?"""`, LiteralStringDoc, nil}, + {`"`, LiteralString, Push("string")}, + {`\'.*\'`, LiteralStringChar, nil}, + {`=>|[]{}:().~;,|&!^?[]`, Punctuation, nil}, + {Words(``, `\b`, `addressof`, `and`, `as`, `consume`, `digestof`, `is`, `isnt`, `not`, `or`), OperatorWord, nil}, + {`!=|==|<<|>>|[-+/*%=<>]`, Operator, nil}, + {Words(``, `\b`, `box`, `break`, `compile_error`, `compile_intrinsic`, `continue`, `do`, `else`, `elseif`, `embed`, `end`, `error`, `for`, `if`, `ifdef`, `in`, `iso`, `lambda`, `let`, `match`, `object`, `recover`, `ref`, `repeat`, `return`, `tag`, `then`, `this`, `trn`, `try`, `until`, `use`, `var`, `val`, `where`, `while`, `with`, `#any`, `#read`, `#send`, `#share`), Keyword, nil}, + {`(actor|class|struct|primitive|interface|trait|type)((?:\s)+)`, ByGroups(Keyword, Text), Push("typename")}, + {`(new|fun|be)((?:\s)+)`, ByGroups(Keyword, Text), Push("methodname")}, + {Words(``, `\b`, `U8`, `U16`, `U32`, `U64`, `ULong`, `USize`, `U128`, `Unsigned`, `Stringable`, `String`, `StringBytes`, `StringRunes`, `InputNotify`, `InputStream`, `Stdin`, `ByteSeq`, `ByteSeqIter`, `OutStream`, `StdStream`, `SourceLoc`, `I8`, `I16`, `I32`, `I64`, `ILong`, `ISize`, `I128`, `Signed`, `Seq`, `RuntimeOptions`, `Real`, `Integer`, `SignedInteger`, `UnsignedInteger`, `FloatingPoint`, `Number`, `Int`, `ReadSeq`, `ReadElement`, `Pointer`, `Platform`, `NullablePointer`, `None`, `Iterator`, `F32`, `F64`, `Float`, `Env`, `DoNotOptimise`, `DisposableActor`, `Less`, `Equal`, `Greater`, `Compare`, `HasEq`, `Equatable`, `Comparable`, `Bool`, `AsioEventID`, `AsioEventNotify`, `AsioEvent`, `Array`, `ArrayKeys`, `ArrayValues`, `ArrayPairs`, `Any`, `AmbientAuth`), KeywordType, nil}, + {`_?[A-Z]\w*`, NameClass, nil}, + {`string\(\)`, NameOther, nil}, + {`(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+`, LiteralNumberFloat, nil}, + {`0x[0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`(true|false)\b`, Keyword, nil}, + {`_\d*`, Name, nil}, + {`_?[a-z][\w\'_]*`, Name, nil}, + }, + "typename": { + {`(iso|trn|ref|val|box|tag)?((?:\s)*)(_?[A-Z]\w*)`, ByGroups(Keyword, Text, NameClass), Pop(1)}, + }, + "methodname": { + {`(iso|trn|ref|val|box|tag)?((?:\s)*)(_?[a-z]\w*)`, ByGroups(Keyword, Text, NameFunction), Pop(1)}, + }, + "nested_comment": { + {`[^*/]+`, CommentMultiline, nil}, + {`/\*`, CommentMultiline, Push()}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[*/]`, CommentMultiline, nil}, + }, + "string": { + {`"`, LiteralString, Pop(1)}, + {`\\"`, LiteralString, nil}, + {`[^\\"]+`, LiteralString, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/postgres.go b/vendor/github.com/alecthomas/chroma/lexers/p/postgres.go new file mode 100644 index 0000000..8977e2c --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/postgres.go @@ -0,0 +1,83 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Postgresql Sql Dialect lexer. +var PostgreSQL = internal.Register(MustNewLazyLexer( + &Config{ + Name: "PostgreSQL SQL dialect", + Aliases: []string{"postgresql", "postgres"}, + Filenames: []string{}, + MimeTypes: []string{"text/x-postgresql"}, + NotMultiline: true, + CaseInsensitive: true, + }, + postgreSQLRules, +)) + +func postgreSQLRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`--.*\n?`, CommentSingle, nil}, + {`/\*`, CommentMultiline, Push("multiline-comments")}, + {`(bigint|bigserial|bit|bit\s+varying|bool|boolean|box|bytea|char|character|character\s+varying|cidr|circle|date|decimal|double\s+precision|float4|float8|inet|int|int2|int4|int8|integer|interval|json|jsonb|line|lseg|macaddr|money|numeric|path|pg_lsn|point|polygon|real|serial|serial2|serial4|serial8|smallint|smallserial|text|time|timestamp|timestamptz|timetz|tsquery|tsvector|txid_snapshot|uuid|varbit|varchar|with\s+time\s+zone|without\s+time\s+zone|xml|anyarray|anyelement|anyenum|anynonarray|anyrange|cstring|fdw_handler|internal|language_handler|opaque|record|void)\b`, NameBuiltin, nil}, + { + `(?s)(DO)(\s+)(?:(LANGUAGE)?(\s+)('?)(\w+)?('?)(\s+))?(\$)([^$]*)(\$)(.*?)(\$)(\10)(\$)`, + UsingByGroup( + internal.Get, + 6, 12, + Keyword, Text, Keyword, Text, // DO LANGUAGE + StringSingle, StringSingle, StringSingle, Text, // 'plpgsql' + StringHeredoc, StringHeredoc, StringHeredoc, // $tag$ + StringHeredoc, // (code block) + StringHeredoc, StringHeredoc, StringHeredoc, // $tag$ + ), + nil, + }, + {Words(``, `\b`, `ABORT`, `ABSOLUTE`, `ACCESS`, `ACTION`, `ADD`, `ADMIN`, `AFTER`, `AGGREGATE`, `ALL`, `ALSO`, `ALTER`, `ALWAYS`, `ANALYSE`, `ANALYZE`, `AND`, `ANY`, `ARRAY`, `AS`, `ASC`, `ASSERTION`, `ASSIGNMENT`, `ASYMMETRIC`, `AT`, `ATTRIBUTE`, `AUTHORIZATION`, `BACKWARD`, `BEFORE`, `BEGIN`, `BETWEEN`, `BIGINT`, `BINARY`, `BIT`, `BOOLEAN`, `BOTH`, `BY`, `CACHE`, `CALLED`, `CASCADE`, `CASCADED`, `CASE`, `CAST`, `CATALOG`, `CHAIN`, `CHAR`, `CHARACTER`, `CHARACTERISTICS`, `CHECK`, `CHECKPOINT`, `CLASS`, `CLOSE`, `CLUSTER`, `COALESCE`, `COLLATE`, `COLLATION`, `COLUMN`, `COMMENT`, `COMMENTS`, `COMMIT`, `COMMITTED`, `CONCURRENTLY`, `CONFIGURATION`, `CONNECTION`, `CONSTRAINT`, `CONSTRAINTS`, `CONTENT`, `CONTINUE`, `CONVERSION`, `COPY`, `COST`, `CREATE`, `CROSS`, `CSV`, `CURRENT`, `CURRENT_CATALOG`, `CURRENT_DATE`, `CURRENT_ROLE`, `CURRENT_SCHEMA`, `CURRENT_TIME`, `CURRENT_TIMESTAMP`, `CURRENT_USER`, `CURSOR`, `CYCLE`, `DATA`, `DATABASE`, `DAY`, `DEALLOCATE`, `DEC`, `DECIMAL`, `DECLARE`, `DEFAULT`, `DEFAULTS`, `DEFERRABLE`, `DEFERRED`, `DEFINER`, `DELETE`, `DELIMITER`, `DELIMITERS`, `DESC`, `DICTIONARY`, `DISABLE`, `DISCARD`, `DISTINCT`, `DO`, `DOCUMENT`, `DOMAIN`, `DOUBLE`, `DROP`, `EACH`, `ELSE`, `ENABLE`, `ENCODING`, `ENCRYPTED`, `END`, `ENUM`, `ESCAPE`, `EVENT`, `EXCEPT`, `EXCLUDE`, `EXCLUDING`, `EXCLUSIVE`, `EXECUTE`, `EXISTS`, `EXPLAIN`, `EXTENSION`, `EXTERNAL`, `EXTRACT`, `FALSE`, `FAMILY`, `FETCH`, `FILTER`, `FIRST`, `FLOAT`, `FOLLOWING`, `FOR`, `FORCE`, `FOREIGN`, `FORWARD`, `FREEZE`, `FROM`, `FULL`, `FUNCTION`, `FUNCTIONS`, `GLOBAL`, `GRANT`, `GRANTED`, `GREATEST`, `GROUP`, `HANDLER`, `HAVING`, `HEADER`, `HOLD`, `HOUR`, `IDENTITY`, `IF`, `ILIKE`, `IMMEDIATE`, `IMMUTABLE`, `IMPLICIT`, `IN`, `INCLUDING`, `INCREMENT`, `INDEX`, `INDEXES`, `INHERIT`, `INHERITS`, `INITIALLY`, `INLINE`, `INNER`, `INOUT`, `INPUT`, `INSENSITIVE`, `INSERT`, `INSTEAD`, `INT`, `INTEGER`, `INTERSECT`, `INTERVAL`, `INTO`, `INVOKER`, `IS`, `ISNULL`, `ISOLATION`, `JOIN`, `KEY`, `LABEL`, `LANGUAGE`, `LARGE`, `LAST`, `LATERAL`, `LC_COLLATE`, `LC_CTYPE`, `LEADING`, `LEAKPROOF`, `LEAST`, `LEFT`, `LEVEL`, `LIKE`, `LIMIT`, `LISTEN`, `LOAD`, `LOCAL`, `LOCALTIME`, `LOCALTIMESTAMP`, `LOCATION`, `LOCK`, `MAPPING`, `MATCH`, `MATERIALIZED`, `MAXVALUE`, `MINUTE`, `MINVALUE`, `MODE`, `MONTH`, `MOVE`, `NAME`, `NAMES`, `NATIONAL`, `NATURAL`, `NCHAR`, `NEXT`, `NO`, `NONE`, `NOT`, `NOTHING`, `NOTIFY`, `NOTNULL`, `NOWAIT`, `NULL`, `NULLIF`, `NULLS`, `NUMERIC`, `OBJECT`, `OF`, `OFF`, `OFFSET`, `OIDS`, `ON`, `ONLY`, `OPERATOR`, `OPTION`, `OPTIONS`, `OR`, `ORDER`, `ORDINALITY`, `OUT`, `OUTER`, `OVER`, `OVERLAPS`, `OVERLAY`, `OWNED`, `OWNER`, `PARSER`, `PARTIAL`, `PARTITION`, `PASSING`, `PASSWORD`, `PLACING`, `PLANS`, `POLICY`, `POSITION`, `PRECEDING`, `PRECISION`, `PREPARE`, `PREPARED`, `PRESERVE`, `PRIMARY`, `PRIOR`, `PRIVILEGES`, `PROCEDURAL`, `PROCEDURE`, `PROGRAM`, `QUOTE`, `RANGE`, `READ`, `REAL`, `REASSIGN`, `RECHECK`, `RECURSIVE`, `REF`, `REFERENCES`, `REFRESH`, `REINDEX`, `RELATIVE`, `RELEASE`, `RENAME`, `REPEATABLE`, `REPLACE`, `REPLICA`, `RESET`, `RESTART`, `RESTRICT`, `RETURNING`, `RETURNS`, `REVOKE`, `RIGHT`, `ROLE`, `ROLLBACK`, `ROW`, `ROWS`, `RULE`, `SAVEPOINT`, `SCHEMA`, `SCROLL`, `SEARCH`, `SECOND`, `SECURITY`, `SELECT`, `SEQUENCE`, `SEQUENCES`, `SERIALIZABLE`, `SERVER`, `SESSION`, `SESSION_USER`, `SET`, `SETOF`, `SHARE`, `SHOW`, `SIMILAR`, `SIMPLE`, `SMALLINT`, `SNAPSHOT`, `SOME`, `STABLE`, `STANDALONE`, `START`, `STATEMENT`, `STATISTICS`, `STDIN`, `STDOUT`, `STORAGE`, `STRICT`, `STRIP`, `SUBSTRING`, `SYMMETRIC`, `SYSID`, `SYSTEM`, `TABLE`, `TABLES`, `TABLESPACE`, `TEMP`, `TEMPLATE`, `TEMPORARY`, `TEXT`, `THEN`, `TIME`, `TIMESTAMP`, `TO`, `TRAILING`, `TRANSACTION`, `TREAT`, `TRIGGER`, `TRIM`, `TRUE`, `TRUNCATE`, `TRUSTED`, `TYPE`, `TYPES`, `UNBOUNDED`, `UNCOMMITTED`, `UNENCRYPTED`, `UNION`, `UNIQUE`, `UNKNOWN`, `UNLISTEN`, `UNLOGGED`, `UNTIL`, `UPDATE`, `USER`, `USING`, `VACUUM`, `VALID`, `VALIDATE`, `VALIDATOR`, `VALUE`, `VALUES`, `VARCHAR`, `VARIADIC`, `VARYING`, `VERBOSE`, `VERSION`, `VIEW`, `VIEWS`, `VOLATILE`, `WHEN`, `WHERE`, `WHITESPACE`, `WINDOW`, `WITH`, `WITHIN`, `WITHOUT`, `WORK`, `WRAPPER`, `WRITE`, `XML`, `XMLATTRIBUTES`, `XMLCONCAT`, `XMLELEMENT`, `XMLEXISTS`, `XMLFOREST`, `XMLPARSE`, `XMLPI`, `XMLROOT`, `XMLSERIALIZE`, `YEAR`, `YES`, `ZONE`), Keyword, nil}, + {"[+*/<>=~!@#%^&|`?-]+", Operator, nil}, + {`::`, Operator, nil}, + {`\$\d+`, NameVariable, nil}, + {`([0-9]*\.[0-9]*|[0-9]+)(e[+-]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`((?:E|U&)?)(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Push("string")}, + {`((?:U&)?)(")`, ByGroups(LiteralStringAffix, LiteralStringName), Push("quoted-ident")}, + { + `(?s)(\$)([^$]*)(\$)(.*?)(\$)(\2)(\$)(\s+)(LANGUAGE)?(\s+)('?)(\w+)?('?)`, + UsingByGroup(internal.Get, + 12, 4, + StringHeredoc, StringHeredoc, StringHeredoc, // $tag$ + StringHeredoc, // (code block) + StringHeredoc, StringHeredoc, StringHeredoc, // $tag$ + Text, Keyword, Text, // LANGUAGE + StringSingle, StringSingle, StringSingle, // 'type' + ), + nil, + }, + {`(?s)(\$)([^$]*)(\$)(.*?)(\$)(\2)(\$)`, LiteralStringHeredoc, nil}, + {`[a-z_]\w*`, Name, nil}, + {`:(['"]?)[a-z]\w*\b\1`, NameVariable, nil}, + {`[;:()\[\]{},.]`, Punctuation, nil}, + }, + "multiline-comments": { + {`/\*`, CommentMultiline, Push("multiline-comments")}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[^/*]+`, CommentMultiline, nil}, + {`[/*]`, CommentMultiline, nil}, + }, + "string": { + {`[^']+`, LiteralStringSingle, nil}, + {`''`, LiteralStringSingle, nil}, + {`'`, LiteralStringSingle, Pop(1)}, + }, + "quoted-ident": { + {`[^"]+`, LiteralStringName, nil}, + {`""`, LiteralStringName, nil}, + {`"`, LiteralStringName, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/postscript.go b/vendor/github.com/alecthomas/chroma/lexers/p/postscript.go new file mode 100644 index 0000000..0b51ba5 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/postscript.go @@ -0,0 +1,50 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Postscript lexer. +var Postscript = internal.Register(MustNewLazyLexer( + &Config{ + Name: "PostScript", + Aliases: []string{"postscript", "postscr"}, + Filenames: []string{"*.ps", "*.eps"}, + MimeTypes: []string{"application/postscript"}, + }, + postscriptRules, +)) + +func postscriptRules() Rules { + return Rules{ + "root": { + {`^%!.+\n`, CommentPreproc, nil}, + {`%%.*\n`, CommentSpecial, nil}, + {`(^%.*\n){2,}`, CommentMultiline, nil}, + {`%.*\n`, CommentSingle, nil}, + {`\(`, LiteralString, Push("stringliteral")}, + {`[{}<>\[\]]`, Punctuation, nil}, + {`<[0-9A-Fa-f]+>(?=[()<>\[\]{}/%\s])`, LiteralNumberHex, nil}, + {`[0-9]+\#(\-|\+)?([0-9]+\.?|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)((e|E)[0-9]+)?(?=[()<>\[\]{}/%\s])`, LiteralNumberOct, nil}, + {`(\-|\+)?([0-9]+\.?|[0-9]*\.[0-9]+|[0-9]+\.[0-9]*)((e|E)[0-9]+)?(?=[()<>\[\]{}/%\s])`, LiteralNumberFloat, nil}, + {`(\-|\+)?[0-9]+(?=[()<>\[\]{}/%\s])`, LiteralNumberInteger, nil}, + {`\/[^()<>\[\]{}/%\s]+(?=[()<>\[\]{}/%\s])`, NameVariable, nil}, + {`[^()<>\[\]{}/%\s]+(?=[()<>\[\]{}/%\s])`, NameFunction, nil}, + {`(false|true)(?=[()<>\[\]{}/%\s])`, KeywordConstant, nil}, + {`(eq|ne|g[et]|l[et]|and|or|not|if(?:else)?|for(?:all)?)(?=[()<>\[\]{}/%\s])`, KeywordReserved, nil}, + {Words(``, `(?=[()<>\[\]{}/%\s])`, `abs`, `add`, `aload`, `arc`, `arcn`, `array`, `atan`, `begin`, `bind`, `ceiling`, `charpath`, `clip`, `closepath`, `concat`, `concatmatrix`, `copy`, `cos`, `currentlinewidth`, `currentmatrix`, `currentpoint`, `curveto`, `cvi`, `cvs`, `def`, `defaultmatrix`, `dict`, `dictstackoverflow`, `div`, `dtransform`, `dup`, `end`, `exch`, `exec`, `exit`, `exp`, `fill`, `findfont`, `floor`, `get`, `getinterval`, `grestore`, `gsave`, `gt`, `identmatrix`, `idiv`, `idtransform`, `index`, `invertmatrix`, `itransform`, `length`, `lineto`, `ln`, `load`, `log`, `loop`, `matrix`, `mod`, `moveto`, `mul`, `neg`, `newpath`, `pathforall`, `pathbbox`, `pop`, `print`, `pstack`, `put`, `quit`, `rand`, `rangecheck`, `rcurveto`, `repeat`, `restore`, `rlineto`, `rmoveto`, `roll`, `rotate`, `round`, `run`, `save`, `scale`, `scalefont`, `setdash`, `setfont`, `setgray`, `setlinecap`, `setlinejoin`, `setlinewidth`, `setmatrix`, `setrgbcolor`, `shfill`, `show`, `showpage`, `sin`, `sqrt`, `stack`, `stringwidth`, `stroke`, `strokepath`, `sub`, `syntaxerror`, `transform`, `translate`, `truncate`, `typecheck`, `undefined`, `undefinedfilename`, `undefinedresult`), NameBuiltin, nil}, + {`\s+`, Text, nil}, + }, + "stringliteral": { + {`[^()\\]+`, LiteralString, nil}, + {`\\`, LiteralStringEscape, Push("escape")}, + {`\(`, LiteralString, Push()}, + {`\)`, LiteralString, Pop(1)}, + }, + "escape": { + {`[0-8]{3}|n|r|t|b|f|\\|\(|\)`, LiteralStringEscape, Pop(1)}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/povray.go b/vendor/github.com/alecthomas/chroma/lexers/p/povray.go new file mode 100644 index 0000000..2d870f1 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/povray.go @@ -0,0 +1,39 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Povray lexer. +var Povray = internal.Register(MustNewLazyLexer( + &Config{ + Name: "POVRay", + Aliases: []string{"pov"}, + Filenames: []string{"*.pov", "*.inc"}, + MimeTypes: []string{"text/x-povray"}, + }, + povrayRules, +)) + +func povrayRules() Rules { + return Rules{ + "root": { + {`/\*[\w\W]*?\*/`, CommentMultiline, nil}, + {`//.*\n`, CommentSingle, nil}, + {`(?s)"(?:\\.|[^"\\])+"`, LiteralStringDouble, nil}, + {Words(`#`, `\b`, `break`, `case`, `debug`, `declare`, `default`, `define`, `else`, `elseif`, `end`, `error`, `fclose`, `fopen`, `for`, `if`, `ifdef`, `ifndef`, `include`, `local`, `macro`, `range`, `read`, `render`, `statistics`, `switch`, `undef`, `version`, `warning`, `while`, `write`), CommentPreproc, nil}, + {Words(`\b`, `\b`, `aa_level`, `aa_threshold`, `abs`, `acos`, `acosh`, `adaptive`, `adc_bailout`, `agate`, `agate_turb`, `all`, `alpha`, `ambient`, `ambient_light`, `angle`, `aperture`, `arc_angle`, `area_light`, `asc`, `asin`, `asinh`, `assumed_gamma`, `atan`, `atan2`, `atanh`, `atmosphere`, `atmospheric_attenuation`, `attenuating`, `average`, `background`, `black_hole`, `blue`, `blur_samples`, `bounded_by`, `box_mapping`, `bozo`, `break`, `brick`, `brick_size`, `brightness`, `brilliance`, `bumps`, `bumpy1`, `bumpy2`, `bumpy3`, `bump_map`, `bump_size`, `case`, `caustics`, `ceil`, `checker`, `chr`, `clipped_by`, `clock`, `color`, `color_map`, `colour`, `colour_map`, `component`, `composite`, `concat`, `confidence`, `conic_sweep`, `constant`, `control0`, `control1`, `cos`, `cosh`, `count`, `crackle`, `crand`, `cube`, `cubic_spline`, `cylindrical_mapping`, `debug`, `declare`, `default`, `degrees`, `dents`, `diffuse`, `direction`, `distance`, `distance_maximum`, `div`, `dust`, `dust_type`, `eccentricity`, `else`, `emitting`, `end`, `error`, `error_bound`, `exp`, `exponent`, `fade_distance`, `fade_power`, `falloff`, `falloff_angle`, `false`, `file_exists`, `filter`, `finish`, `fisheye`, `flatness`, `flip`, `floor`, `focal_point`, `fog`, `fog_alt`, `fog_offset`, `fog_type`, `frequency`, `gif`, `global_settings`, `glowing`, `gradient`, `granite`, `gray_threshold`, `green`, `halo`, `hexagon`, `hf_gray_16`, `hierarchy`, `hollow`, `hypercomplex`, `if`, `ifdef`, `iff`, `image_map`, `incidence`, `include`, `int`, `interpolate`, `inverse`, `ior`, `irid`, `irid_wavelength`, `jitter`, `lambda`, `leopard`, `linear`, `linear_spline`, `linear_sweep`, `location`, `log`, `looks_like`, `look_at`, `low_error_factor`, `mandel`, `map_type`, `marble`, `material_map`, `matrix`, `max`, `max_intersections`, `max_iteration`, `max_trace_level`, `max_value`, `metallic`, `min`, `minimum_reuse`, `mod`, `mortar`, `nearest_count`, `no`, `normal`, `normal_map`, `no_shadow`, `number_of_waves`, `octaves`, `off`, `offset`, `omega`, `omnimax`, `on`, `once`, `onion`, `open`, `orthographic`, `panoramic`, `pattern1`, `pattern2`, `pattern3`, `perspective`, `pgm`, `phase`, `phong`, `phong_size`, `pi`, `pigment`, `pigment_map`, `planar_mapping`, `png`, `point_at`, `pot`, `pow`, `ppm`, `precision`, `pwr`, `quadratic_spline`, `quaternion`, `quick_color`, `quick_colour`, `quilted`, `radial`, `radians`, `radiosity`, `radius`, `rainbow`, `ramp_wave`, `rand`, `range`, `reciprocal`, `recursion_limit`, `red`, `reflection`, `refraction`, `render`, `repeat`, `rgb`, `rgbf`, `rgbft`, `rgbt`, `right`, `ripples`, `rotate`, `roughness`, `samples`, `scale`, `scallop_wave`, `scattering`, `seed`, `shadowless`, `sin`, `sine_wave`, `sinh`, `sky`, `sky_sphere`, `slice`, `slope_map`, `smooth`, `specular`, `spherical_mapping`, `spiral`, `spiral1`, `spiral2`, `spotlight`, `spotted`, `sqr`, `sqrt`, `statistics`, `str`, `strcmp`, `strength`, `strlen`, `strlwr`, `strupr`, `sturm`, `substr`, `switch`, `sys`, `t`, `tan`, `tanh`, `test_camera_1`, `test_camera_2`, `test_camera_3`, `test_camera_4`, `texture`, `texture_map`, `tga`, `thickness`, `threshold`, `tightness`, `tile2`, `tiles`, `track`, `transform`, `translate`, `transmit`, `triangle_wave`, `true`, `ttf`, `turbulence`, `turb_depth`, `type`, `ultra_wide_angle`, `up`, `use_color`, `use_colour`, `use_index`, `u_steps`, `val`, `variance`, `vaxis_rotate`, `vcross`, `vdot`, `version`, `vlength`, `vnormalize`, `volume_object`, `volume_rendered`, `vol_with_light`, `vrotate`, `v_steps`, `warning`, `warp`, `water_level`, `waves`, `while`, `width`, `wood`, `wrinkles`, `yes`), Keyword, nil}, + {Words(``, `\b`, `bicubic_patch`, `blob`, `box`, `camera`, `cone`, `cubic`, `cylinder`, `difference`, `disc`, `height_field`, `intersection`, `julia_fractal`, `lathe`, `light_source`, `merge`, `mesh`, `object`, `plane`, `poly`, `polygon`, `prism`, `quadric`, `quartic`, `smooth_triangle`, `sor`, `sphere`, `superellipsoid`, `text`, `torus`, `triangle`, `union`), NameBuiltin, nil}, + {`[\[\](){}<>;,]`, Punctuation, nil}, + {`[-+*/=]`, Operator, nil}, + {`\b(x|y|z|u|v)\b`, NameBuiltinPseudo, nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + {`[0-9]+\.[0-9]*`, LiteralNumberFloat, nil}, + {`\.[0-9]+`, LiteralNumberFloat, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`\s+`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/powerquery.go b/vendor/github.com/alecthomas/chroma/lexers/p/powerquery.go new file mode 100644 index 0000000..0302420 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/powerquery.go @@ -0,0 +1,38 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// PowerQuery lexer. +var PowerQuery = internal.Register(MustNewLazyLexer( + &Config{ + Name: "PowerQuery", + Aliases: []string{"powerquery", "pq"}, + Filenames: []string{"*.pq"}, + MimeTypes: []string{"text/x-powerquery"}, + DotAll: true, + CaseInsensitive: true, + }, + powerqueryRules, +)) + +func powerqueryRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`(and|as|each|else|error|false|if|in|is|let|meta|not|null|or|otherwise|section|shared|then|true|try|type)\b`, Keyword, nil}, + {`(#binary|#date|#datetime|#datetimezone|#duration|#infinity|#nan|#sections|#shared|#table|#time)\b`, KeywordType, nil}, + {`(([a-zA-Z]|_)[\w|._]*|#"[^"]+")`, Name, nil}, + {`0[xX][0-9a-fA-F][0-9a-fA-F_]*[lL]?`, LiteralNumberHex, nil}, + {`([0-9]+\.[0-9]+|\.[0-9]+)([eE][0-9]+)?`, LiteralNumberFloat, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`[\(\)\[\]\{\}]`, Punctuation, nil}, + {`\.\.|\.\.\.|=>|<=|>=|<>|[@!?,;=<>\+\-\*\/&]`, Operator, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/powershell.go b/vendor/github.com/alecthomas/chroma/lexers/p/powershell.go new file mode 100644 index 0000000..9b7b56e --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/powershell.go @@ -0,0 +1,70 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Powershell lexer. +var Powershell = internal.Register(MustNewLazyLexer( + &Config{ + Name: "PowerShell", + Aliases: []string{"powershell", "posh", "ps1", "psm1", "psd1"}, + Filenames: []string{"*.ps1", "*.psm1", "*.psd1"}, + MimeTypes: []string{"text/x-powershell"}, + DotAll: true, + CaseInsensitive: true, + }, + powershellRules, +)) + +func powershellRules() Rules { + return Rules{ + "root": { + {`\(`, Punctuation, Push("child")}, + {`\s+`, Text, nil}, + {`^(\s*#[#\s]*)(\.(?:component|description|example|externalhelp|forwardhelpcategory|forwardhelptargetname|functionality|inputs|link|notes|outputs|parameter|remotehelprunspace|role|synopsis))([^\n]*$)`, ByGroups(Comment, LiteralStringDoc, Comment), nil}, + {`#[^\n]*?$`, Comment, nil}, + {`(<|<)#`, CommentMultiline, Push("multline")}, + {`(?i)([A-Z]:)`, Name, nil}, + {`@"\n`, LiteralStringHeredoc, Push("heredoc-double")}, + {`@'\n.*?\n'@`, LiteralStringHeredoc, nil}, + {"`[\\'\"$@-]", Punctuation, nil}, + {`"`, LiteralStringDouble, Push("string")}, + {`'([^']|'')*'`, LiteralStringSingle, nil}, + {`(\$|@@|@)((global|script|private|env):)?\w+`, NameVariable, nil}, + {`[a-z]\w*-[a-z]\w*\b`, NameBuiltin, nil}, + {`(while|validateset|validaterange|validatepattern|validatelength|validatecount|until|trap|switch|return|ref|process|param|parameter|in|if|global:|function|foreach|for|finally|filter|end|elseif|else|dynamicparam|do|default|continue|cmdletbinding|break|begin|alias|\?|%|#script|#private|#local|#global|mandatory|parametersetname|position|valuefrompipeline|valuefrompipelinebypropertyname|valuefromremainingarguments|helpmessage|try|catch|throw)\b`, Keyword, nil}, + {`-(and|as|band|bnot|bor|bxor|casesensitive|ccontains|ceq|cge|cgt|cle|clike|clt|cmatch|cne|cnotcontains|cnotlike|cnotmatch|contains|creplace|eq|exact|f|file|ge|gt|icontains|ieq|ige|igt|ile|ilike|ilt|imatch|ine|inotcontains|inotlike|inotmatch|ireplace|is|isnot|le|like|lt|match|ne|not|notcontains|notlike|notmatch|or|regex|replace|wildcard)\b`, Operator, nil}, + {`(ac|asnp|cat|cd|cfs|chdir|clc|clear|clhy|cli|clp|cls|clv|cnsn|compare|copy|cp|cpi|cpp|curl|cvpa|dbp|del|diff|dir|dnsn|ebp|echo|epal|epcsv|epsn|erase|etsn|exsn|fc|fhx|fl|foreach|ft|fw|gal|gbp|gc|gci|gcm|gcs|gdr|ghy|gi|gjb|gl|gm|gmo|gp|gps|gpv|group|gsn|gsnp|gsv|gu|gv|gwmi|h|history|icm|iex|ihy|ii|ipal|ipcsv|ipmo|ipsn|irm|ise|iwmi|iwr|kill|lp|ls|man|md|measure|mi|mount|move|mp|mv|nal|ndr|ni|nmo|npssc|nsn|nv|ogv|oh|popd|ps|pushd|pwd|r|rbp|rcjb|rcsn|rd|rdr|ren|ri|rjb|rm|rmdir|rmo|rni|rnp|rp|rsn|rsnp|rujb|rv|rvpa|rwmi|sajb|sal|saps|sasv|sbp|sc|select|set|shcm|si|sl|sleep|sls|sort|sp|spjb|spps|spsv|start|sujb|sv|swmi|tee|trcm|type|wget|where|wjb|write)\s`, NameBuiltin, nil}, + {"\\[[a-z_\\[][\\w. `,\\[\\]]*\\]", NameConstant, nil}, + {`-[a-z_]\w*`, Name, nil}, + {`\w+`, Name, nil}, + {"[.,;@{}\\[\\]$()=+*/\\\\&%!~?^`|<>-]|::", Punctuation, nil}, + }, + "child": { + {`\)`, Punctuation, Pop(1)}, + Include("root"), + }, + "multline": { + {`[^#&.]+`, CommentMultiline, nil}, + {`#(>|>)`, CommentMultiline, Pop(1)}, + {`\.(component|description|example|externalhelp|forwardhelpcategory|forwardhelptargetname|functionality|inputs|link|notes|outputs|parameter|remotehelprunspace|role|synopsis)`, LiteralStringDoc, nil}, + {`[#&.]`, CommentMultiline, nil}, + }, + "string": { + {"`[0abfnrtv'\\\"$`]", LiteralStringEscape, nil}, + {"[^$`\"]+", LiteralStringDouble, nil}, + {`\$\(`, Punctuation, Push("child")}, + {`""`, LiteralStringDouble, nil}, + {"[`$]", LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + "heredoc-double": { + {`\n"@`, LiteralStringHeredoc, Pop(1)}, + {`\$\(`, Punctuation, Push("child")}, + {`[^@\n]+"]`, LiteralStringHeredoc, nil}, + {`.`, LiteralStringHeredoc, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/prolog.go b/vendor/github.com/alecthomas/chroma/lexers/p/prolog.go new file mode 100644 index 0000000..a2f346b --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/prolog.go @@ -0,0 +1,54 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Prolog lexer. +var Prolog = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Prolog", + Aliases: []string{"prolog"}, + Filenames: []string{"*.ecl", "*.prolog", "*.pro", "*.pl"}, + MimeTypes: []string{"text/x-prolog"}, + }, + prologRules, +)) + +func prologRules() Rules { + return Rules{ + "root": { + {`/\*`, CommentMultiline, Push("nested-comment")}, + {`%.*`, CommentSingle, nil}, + {`0\'.`, LiteralStringChar, nil}, + {`0b[01]+`, LiteralNumberBin, nil}, + {`0o[0-7]+`, LiteralNumberOct, nil}, + {`0x[0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`\d\d?\'[a-zA-Z0-9]+`, LiteralNumberInteger, nil}, + {`(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`[\[\](){}|.,;!]`, Punctuation, nil}, + {`:-|-->`, Punctuation, nil}, + {`"(?:\\x[0-9a-fA-F]+\\|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|\\[0-7]+\\|\\["\nabcefnrstv]|[^\\"])*"`, LiteralStringDouble, nil}, + {`'(?:''|[^'])*'`, LiteralStringAtom, nil}, + {`is\b`, Operator, nil}, + {`(<|>|=<|>=|==|=:=|=|/|//|\*|\+|-)(?=\s|[a-zA-Z0-9\[])`, Operator, nil}, + {`(mod|div|not)\b`, Operator, nil}, + {`_`, Keyword, nil}, + {`([a-z]+)(:)`, ByGroups(NameNamespace, Punctuation), nil}, + {`([a-zÀ-῿぀-퟿-￯][\w$À-῿぀-퟿-￯]*)(\s*)(:-|-->)`, ByGroups(NameFunction, Text, Operator), nil}, + {`([a-zÀ-῿぀-퟿-￯][\w$À-῿぀-퟿-￯]*)(\s*)(\()`, ByGroups(NameFunction, Text, Punctuation), nil}, + {`[a-zÀ-῿぀-퟿-￯][\w$À-῿぀-퟿-￯]*`, LiteralStringAtom, nil}, + {`[#&*+\-./:<=>?@\\^~¡-¿‐-〿]+`, LiteralStringAtom, nil}, + {`[A-Z_]\w*`, NameVariable, nil}, + {`\s+|[ -‏￰-￾￯]`, Text, nil}, + }, + "nested-comment": { + {`\*/`, CommentMultiline, Pop(1)}, + {`/\*`, CommentMultiline, Push()}, + {`[^*/]+`, CommentMultiline, nil}, + {`[*/]`, CommentMultiline, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/promql.go b/vendor/github.com/alecthomas/chroma/lexers/p/promql.go new file mode 100644 index 0000000..e80b926 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/promql.go @@ -0,0 +1,59 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Promql lexer. +var Promql = internal.Register(MustNewLazyLexer( + &Config{ + Name: "PromQL", + Aliases: []string{"promql"}, + Filenames: []string{"*.promql"}, + MimeTypes: []string{}, + }, + promqlRules, +)) + +func promqlRules() Rules { + return Rules{ + "root": { + {`\n`, TextWhitespace, nil}, + {`\s+`, TextWhitespace, nil}, + {`,`, Punctuation, nil}, + {Words(``, `\b`, `bool`, `by`, `group_left`, `group_right`, `ignoring`, `offset`, `on`, `without`), Keyword, nil}, + {Words(``, `\b`, `sum`, `min`, `max`, `avg`, `group`, `stddev`, `stdvar`, `count`, `count_values`, `bottomk`, `topk`, `quantile`), Keyword, nil}, + {Words(``, `\b`, `abs`, `absent`, `absent_over_time`, `avg_over_time`, `ceil`, `changes`, `clamp_max`, `clamp_min`, `count_over_time`, `day_of_month`, `day_of_week`, `days_in_month`, `delta`, `deriv`, `exp`, `floor`, `histogram_quantile`, `holt_winters`, `hour`, `idelta`, `increase`, `irate`, `label_join`, `label_replace`, `ln`, `log10`, `log2`, `max_over_time`, `min_over_time`, `minute`, `month`, `predict_linear`, `quantile_over_time`, `rate`, `resets`, `round`, `scalar`, `sort`, `sort_desc`, `sqrt`, `stddev_over_time`, `stdvar_over_time`, `sum_over_time`, `time`, `timestamp`, `vector`, `year`), KeywordReserved, nil}, + {`[1-9][0-9]*[smhdwy]`, LiteralString, nil}, + {`-?[0-9]+\.[0-9]+`, LiteralNumberFloat, nil}, + {`-?[0-9]+`, LiteralNumberInteger, nil}, + {`#.*?$`, CommentSingle, nil}, + {`(\+|\-|\*|\/|\%|\^)`, Operator, nil}, + {`==|!=|>=|<=|<|>`, Operator, nil}, + {`and|or|unless`, OperatorWord, nil}, + {`[_a-zA-Z][a-zA-Z0-9_]+`, NameVariable, nil}, + {`(["\'])(.*?)(["\'])`, ByGroups(Punctuation, LiteralString, Punctuation), nil}, + {`\(`, Operator, Push("function")}, + {`\)`, Operator, nil}, + {`\{`, Punctuation, Push("labels")}, + {`\[`, Punctuation, Push("range")}, + }, + "labels": { + {`\}`, Punctuation, Pop(1)}, + {`\n`, TextWhitespace, nil}, + {`\s+`, TextWhitespace, nil}, + {`,`, Punctuation, nil}, + {`([_a-zA-Z][a-zA-Z0-9_]*?)(\s*?)(=~|!=|=|!~)(\s*?)("|')(.*?)("|')`, ByGroups(NameLabel, TextWhitespace, Operator, TextWhitespace, Punctuation, LiteralString, Punctuation), nil}, + }, + "range": { + {`\]`, Punctuation, Pop(1)}, + {`[1-9][0-9]*[smhdwy]`, LiteralString, nil}, + }, + "function": { + {`\)`, Operator, Pop(1)}, + {`\(`, Operator, Push()}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/protobuf.go b/vendor/github.com/alecthomas/chroma/lexers/p/protobuf.go new file mode 100644 index 0000000..76576cb --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/protobuf.go @@ -0,0 +1,57 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// ProtocolBuffer lexer. +var ProtocolBuffer = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Protocol Buffer", + Aliases: []string{"protobuf", "proto"}, + Filenames: []string{"*.proto"}, + MimeTypes: []string{}, + }, + protocolBufferRules, +)) + +func protocolBufferRules() Rules { + return Rules{ + "root": { + {`[ \t]+`, Text, nil}, + {`[,;{}\[\]()<>]`, Punctuation, nil}, + {`/(\\\n)?/(\n|(.|\n)*?[^\\]\n)`, CommentSingle, nil}, + {`/(\\\n)?\*(.|\n)*?\*(\\\n)?/`, CommentMultiline, nil}, + {Words(`\b`, `\b`, `import`, `option`, `optional`, `required`, `repeated`, `default`, `packed`, `ctype`, `extensions`, `to`, `max`, `rpc`, `returns`, `oneof`), Keyword, nil}, + {Words(``, `\b`, `int32`, `int64`, `uint32`, `uint64`, `sint32`, `sint64`, `fixed32`, `fixed64`, `sfixed32`, `sfixed64`, `float`, `double`, `bool`, `string`, `bytes`), KeywordType, nil}, + {`(true|false)\b`, KeywordConstant, nil}, + {`(package)(\s+)`, ByGroups(KeywordNamespace, Text), Push("package")}, + {`(message|extend)(\s+)`, ByGroups(KeywordDeclaration, Text), Push("message")}, + {`(enum|group|service)(\s+)`, ByGroups(KeywordDeclaration, Text), Push("type")}, + {`\".*?\"`, LiteralString, nil}, + {`\'.*?\'`, LiteralString, nil}, + {`(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*`, LiteralNumberFloat, nil}, + {`(\d+\.\d*|\.\d+|\d+[fF])[fF]?`, LiteralNumberFloat, nil}, + {`(\-?(inf|nan))\b`, LiteralNumberFloat, nil}, + {`0x[0-9a-fA-F]+[LlUu]*`, LiteralNumberHex, nil}, + {`0[0-7]+[LlUu]*`, LiteralNumberOct, nil}, + {`\d+[LlUu]*`, LiteralNumberInteger, nil}, + {`[+-=]`, Operator, nil}, + {`([a-zA-Z_][\w.]*)([ \t]*)(=)`, ByGroups(Name, Text, Operator), nil}, + {`[a-zA-Z_][\w.]*`, Name, nil}, + }, + "package": { + {`[a-zA-Z_]\w*`, NameNamespace, Pop(1)}, + Default(Pop(1)), + }, + "message": { + {`[a-zA-Z_]\w*`, NameClass, Pop(1)}, + Default(Pop(1)), + }, + "type": { + {`[a-zA-Z_]\w*`, Name, Pop(1)}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/puppet.go b/vendor/github.com/alecthomas/chroma/lexers/p/puppet.go new file mode 100644 index 0000000..b32caed --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/puppet.go @@ -0,0 +1,60 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Puppet lexer. +var Puppet = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Puppet", + Aliases: []string{"puppet"}, + Filenames: []string{"*.pp"}, + MimeTypes: []string{}, + }, + puppetRules, +)) + +func puppetRules() Rules { + return Rules{ + "root": { + Include("comments"), + Include("keywords"), + Include("names"), + Include("numbers"), + Include("operators"), + Include("strings"), + {`[]{}:(),;[]`, Punctuation, nil}, + {`[^\S\n]+`, Text, nil}, + }, + "comments": { + {`\s*#.*$`, Comment, nil}, + {`/(\\\n)?[*](.|\n)*?[*](\\\n)?/`, CommentMultiline, nil}, + }, + "operators": { + {`(=>|\?|<|>|=|\+|-|/|\*|~|!|\|)`, Operator, nil}, + {`(in|and|or|not)\b`, OperatorWord, nil}, + }, + "names": { + {`[a-zA-Z_]\w*`, NameAttribute, nil}, + {`(\$\S+)(\[)(\S+)(\])`, ByGroups(NameVariable, Punctuation, LiteralString, Punctuation), nil}, + {`\$\S+`, NameVariable, nil}, + }, + "numbers": { + {`(\d+\.\d*|\d*\.\d+)([eE][+-]?[0-9]+)?j?`, LiteralNumberFloat, nil}, + {`\d+[eE][+-]?[0-9]+j?`, LiteralNumberFloat, nil}, + {`0[0-7]+j?`, LiteralNumberOct, nil}, + {`0[xX][a-fA-F0-9]+`, LiteralNumberHex, nil}, + {`\d+L`, LiteralNumberIntegerLong, nil}, + {`\d+j?`, LiteralNumberInteger, nil}, + }, + "keywords": { + {Words(`(?i)`, `\b`, `absent`, `alert`, `alias`, `audit`, `augeas`, `before`, `case`, `check`, `class`, `computer`, `configured`, `contained`, `create_resources`, `crit`, `cron`, `debug`, `default`, `define`, `defined`, `directory`, `else`, `elsif`, `emerg`, `err`, `exec`, `extlookup`, `fail`, `false`, `file`, `filebucket`, `fqdn_rand`, `generate`, `host`, `if`, `import`, `include`, `info`, `inherits`, `inline_template`, `installed`, `interface`, `k5login`, `latest`, `link`, `loglevel`, `macauthorization`, `mailalias`, `maillist`, `mcx`, `md5`, `mount`, `mounted`, `nagios_command`, `nagios_contact`, `nagios_contactgroup`, `nagios_host`, `nagios_hostdependency`, `nagios_hostescalation`, `nagios_hostextinfo`, `nagios_hostgroup`, `nagios_service`, `nagios_servicedependency`, `nagios_serviceescalation`, `nagios_serviceextinfo`, `nagios_servicegroup`, `nagios_timeperiod`, `node`, `noop`, `notice`, `notify`, `package`, `present`, `purged`, `realize`, `regsubst`, `resources`, `role`, `router`, `running`, `schedule`, `scheduled_task`, `search`, `selboolean`, `selmodule`, `service`, `sha1`, `shellquote`, `split`, `sprintf`, `ssh_authorized_key`, `sshkey`, `stage`, `stopped`, `subscribe`, `tag`, `tagged`, `template`, `tidy`, `true`, `undef`, `unmounted`, `user`, `versioncmp`, `vlan`, `warning`, `yumrepo`, `zfs`, `zone`, `zpool`), Keyword, nil}, + }, + "strings": { + {`"([^"])*"`, LiteralString, nil}, + {`'(\\'|[^'])*'`, LiteralString, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/python.go b/vendor/github.com/alecthomas/chroma/lexers/p/python.go new file mode 100644 index 0000000..ad10a32 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/python.go @@ -0,0 +1,211 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Python lexer. +var Python = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Python", + Aliases: []string{"python", "py", "sage", "python3", "py3"}, + Filenames: []string{"*.py", "*.pyi", "*.pyw", "*.jy", "*.sage", "*.sc", "SConstruct", "SConscript", "*.bzl", "BUCK", "BUILD", "BUILD.bazel", "WORKSPACE", "*.tac"}, + MimeTypes: []string{"text/x-python", "application/x-python", "text/x-python3", "application/x-python3"}, + }, + pythonRules, +)) + +func pythonRules() Rules { + const pythonIdentifier = `[_\p{L}][_\p{L}\p{N}]*` + + return Rules{ + "root": { + {`\n`, Text, nil}, + {`^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")`, ByGroups(Text, LiteralStringAffix, LiteralStringDoc), nil}, + {`^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')`, ByGroups(Text, LiteralStringAffix, LiteralStringDoc), nil}, + {`\A#!.+$`, CommentHashbang, nil}, + {`#.*$`, CommentSingle, nil}, + {`\\\n`, Text, nil}, + {`\\`, Text, nil}, + Include("keywords"), + {`(def)((?:\s|\\\s)+)`, ByGroups(Keyword, Text), Push("funcname")}, + {`(class)((?:\s|\\\s)+)`, ByGroups(Keyword, Text), Push("classname")}, + {`(from)((?:\s|\\\s)+)`, ByGroups(KeywordNamespace, Text), Push("fromimport")}, + {`(import)((?:\s|\\\s)+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + Include("expr"), + }, + "expr": { + {`(?i)(rf|fr)(""")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Combined("rfstringescape", "tdqf")}, + {`(?i)(rf|fr)(''')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Combined("rfstringescape", "tsqf")}, + {`(?i)(rf|fr)(")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Combined("rfstringescape", "dqf")}, + {`(?i)(rf|fr)(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Combined("rfstringescape", "sqf")}, + {`([fF])(""")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Combined("fstringescape", "tdqf")}, + {`([fF])(''')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Combined("fstringescape", "tsqf")}, + {`([fF])(")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Combined("fstringescape", "dqf")}, + {`([fF])(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Combined("fstringescape", "sqf")}, + {`(?i)(rb|br|r)(""")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Push("tdqs")}, + {`(?i)(rb|br|r)(''')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Push("tsqs")}, + {`(?i)(rb|br|r)(")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Push("dqs")}, + {`(?i)(rb|br|r)(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Push("sqs")}, + {`([uUbB]?)(""")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Combined("stringescape", "tdqs")}, + {`([uUbB]?)(''')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Combined("stringescape", "tsqs")}, + {`([uUbB]?)(")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Combined("stringescape", "dqs")}, + {`([uUbB]?)(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Combined("stringescape", "sqs")}, + {`[^\S\n]+`, Text, nil}, + Include("numbers"), + {`!=|==|<<|>>|:=|[-~+/*%=<>&^|.]`, Operator, nil}, + {`[]{}:(),;[]`, Punctuation, nil}, + {`(in|is|and|or|not)\b`, OperatorWord, nil}, + Include("expr-keywords"), + Include("builtins"), + Include("magicfuncs"), + Include("magicvars"), + Include("name"), + }, + "expr-inside-fstring": { + {`[{([]`, Punctuation, Push("expr-inside-fstring-inner")}, + {`(=\s*)?(\![sraf])?\}`, LiteralStringInterpol, Pop(1)}, + {`(=\s*)?(\![sraf])?:`, LiteralStringInterpol, Pop(1)}, + {`\s+`, Text, nil}, + Include("expr"), + }, + "expr-inside-fstring-inner": { + {`[{([]`, Punctuation, Push("expr-inside-fstring-inner")}, + {`[])}]`, Punctuation, Pop(1)}, + {`\s+`, Text, nil}, + Include("expr"), + }, + "expr-keywords": { + {Words(``, `\b`, `async for`, `await`, `else`, `for`, `if`, `lambda`, `yield`, `yield from`), Keyword, nil}, + {Words(``, `\b`, `True`, `False`, `None`), KeywordConstant, nil}, + }, + "keywords": { + {Words(``, `\b`, `assert`, `async`, `await`, `break`, `continue`, `del`, `elif`, `else`, `except`, `finally`, `for`, `global`, `if`, `lambda`, `pass`, `raise`, `nonlocal`, `return`, `try`, `while`, `yield`, `yield from`, `as`, `with`), Keyword, nil}, + {Words(``, `\b`, `True`, `False`, `None`), KeywordConstant, nil}, + }, + "builtins": { + {Words(`(?=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?\}`, LiteralStringInterpol, nil}, + {`[^\\\'"%{\n]+`, LiteralStringSingle, nil}, + {`[\'"\\]`, LiteralStringSingle, nil}, + {`%|(\{{1,2})`, LiteralStringSingle, nil}, + }, + "strings-double": { + {`%(\(\w+\))?[-#0 +]*([0-9]+|[*])?(\.([0-9]+|[*]))?[hlL]?[E-GXc-giorsaux%]`, LiteralStringInterpol, nil}, + {`\{((\w+)((\.\w+)|(\[[^\]]+\]))*)?(\![sra])?(\:(.?[<>=\^])?[-+ ]?#?0?(\d+)?,?(\.\d+)?[E-GXb-gnosx%]?)?\}`, LiteralStringInterpol, nil}, + {`[^\\\'"%{\n]+`, LiteralStringDouble, nil}, + {`[\'"\\]`, LiteralStringDouble, nil}, + {`%|(\{{1,2})`, LiteralStringDouble, nil}, + }, + "dqf": { + {`"`, LiteralStringDouble, Pop(1)}, + {`\\\\|\\"|\\\n`, LiteralStringEscape, nil}, + Include("fstrings-double"), + }, + "sqf": { + {`'`, LiteralStringSingle, Pop(1)}, + {`\\\\|\\'|\\\n`, LiteralStringEscape, nil}, + Include("fstrings-single"), + }, + "dqs": { + {`"`, LiteralStringDouble, Pop(1)}, + {`\\\\|\\"|\\\n`, LiteralStringEscape, nil}, + Include("strings-double"), + }, + "sqs": { + {`'`, LiteralStringSingle, Pop(1)}, + {`\\\\|\\'|\\\n`, LiteralStringEscape, nil}, + Include("strings-single"), + }, + "tdqf": { + {`"""`, LiteralStringDouble, Pop(1)}, + Include("fstrings-double"), + {`\n`, LiteralStringDouble, nil}, + }, + "tsqf": { + {`'''`, LiteralStringSingle, Pop(1)}, + Include("fstrings-single"), + {`\n`, LiteralStringSingle, nil}, + }, + "tdqs": { + {`"""`, LiteralStringDouble, Pop(1)}, + Include("strings-double"), + {`\n`, LiteralStringDouble, nil}, + }, + "tsqs": { + {`'''`, LiteralStringSingle, Pop(1)}, + Include("strings-single"), + {`\n`, LiteralStringSingle, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/python2.go b/vendor/github.com/alecthomas/chroma/lexers/p/python2.go new file mode 100644 index 0000000..f1f6036 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/p/python2.go @@ -0,0 +1,141 @@ +package p + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Python2 lexer. +var Python2 = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Python 2", + Aliases: []string{"python2", "py2"}, + Filenames: []string{}, + MimeTypes: []string{"text/x-python2", "application/x-python2"}, + }, + python2Rules, +)) + +func python2Rules() Rules { + return Rules{ + "root": { + {`\n`, Text, nil}, + {`^(\s*)([rRuUbB]{,2})("""(?:.|\n)*?""")`, ByGroups(Text, LiteralStringAffix, LiteralStringDoc), nil}, + {`^(\s*)([rRuUbB]{,2})('''(?:.|\n)*?''')`, ByGroups(Text, LiteralStringAffix, LiteralStringDoc), nil}, + {`[^\S\n]+`, Text, nil}, + {`\A#!.+$`, CommentHashbang, nil}, + {`#.*$`, CommentSingle, nil}, + {`[]{}:(),;[]`, Punctuation, nil}, + {`\\\n`, Text, nil}, + {`\\`, Text, nil}, + {`(in|is|and|or|not)\b`, OperatorWord, nil}, + {`!=|==|<<|>>|[-~+/*%=<>&^|.]`, Operator, nil}, + Include("keywords"), + {`(def)((?:\s|\\\s)+)`, ByGroups(Keyword, Text), Push("funcname")}, + {`(class)((?:\s|\\\s)+)`, ByGroups(Keyword, Text), Push("classname")}, + {`(from)((?:\s|\\\s)+)`, ByGroups(KeywordNamespace, Text), Push("fromimport")}, + {`(import)((?:\s|\\\s)+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + Include("builtins"), + Include("magicfuncs"), + Include("magicvars"), + Include("backtick"), + {`([rR]|[uUbB][rR]|[rR][uUbB])(""")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Push("tdqs")}, + {`([rR]|[uUbB][rR]|[rR][uUbB])(''')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Push("tsqs")}, + {`([rR]|[uUbB][rR]|[rR][uUbB])(")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Push("dqs")}, + {`([rR]|[uUbB][rR]|[rR][uUbB])(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Push("sqs")}, + {`([uUbB]?)(""")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Combined("stringescape", "tdqs")}, + {`([uUbB]?)(''')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Combined("stringescape", "tsqs")}, + {`([uUbB]?)(")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Combined("stringescape", "dqs")}, + {`([uUbB]?)(')`, ByGroups(LiteralStringAffix, LiteralStringSingle), Combined("stringescape", "sqs")}, + Include("name"), + Include("numbers"), + }, + "keywords": { + {Words(``, `\b`, `assert`, `break`, `continue`, `del`, `elif`, `else`, `except`, `exec`, `finally`, `for`, `global`, `if`, `lambda`, `pass`, `print`, `raise`, `return`, `try`, `while`, `yield`, `yield from`, `as`, `with`), Keyword, nil}, + }, + "builtins": { + {Words(`(?>|[-~+/\\*%=<>&^|?:!.]`, Operator, nil}, + {`[\[\]{}(),;]`, Punctuation, nil}, + {`[\w]+`, NameVariableGlobal, nil}, + }, + "declarations": { + {`\b(DATA|LET)(?=\(|\b)`, KeywordDeclaration, nil}, + }, + "functions": { + {`\b(ABS|ASC|ATN|CDBL|CHR\$|CINT|CLNG|COMMAND\$|COS|CSNG|CSRLIN|CVD|CVDMBF|CVI|CVL|CVS|CVSMBF|DATE\$|ENVIRON\$|EOF|ERDEV|ERDEV\$|ERL|ERR|EXP|FILEATTR|FIX|FRE|FREEFILE|HEX\$|INKEY\$|INP|INPUT\$|INSTR|INT|IOCTL\$|LBOUND|LCASE\$|LEFT\$|LEN|LOC|LOF|LOG|LPOS|LTRIM\$|MID\$|MKD\$|MKDMBF\$|MKI\$|MKL\$|MKS\$|MKSMBF\$|OCT\$|PEEK|PEN|PLAY|PMAP|POINT|POS|RIGHT\$|RND|RTRIM\$|SADD|SCREEN|SEEK|SETMEM|SGN|SIN|SPACE\$|SPC|SQR|STICK|STR\$|STRIG|STRING\$|TAB|TAN|TIME\$|TIMER|UBOUND|UCASE\$|VAL|VARPTR|VARPTR\$|VARSEG)(?=\(|\b)`, KeywordReserved, nil}, + }, + "metacommands": { + {`\b(\$DYNAMIC|\$INCLUDE|\$STATIC)(?=\(|\b)`, KeywordConstant, nil}, + }, + "operators": { + {`\b(AND|EQV|IMP|NOT|OR|XOR)(?=\(|\b)`, OperatorWord, nil}, + }, + "statements": { + {`\b(BEEP|BLOAD|BSAVE|CALL|CALL\ ABSOLUTE|CALL\ INTERRUPT|CALLS|CHAIN|CHDIR|CIRCLE|CLEAR|CLOSE|CLS|COLOR|COM|COMMON|CONST|DATA|DATE\$|DECLARE|DEF\ FN|DEF\ SEG|DEFDBL|DEFINT|DEFLNG|DEFSNG|DEFSTR|DEF|DIM|DO|LOOP|DRAW|END|ENVIRON|ERASE|ERROR|EXIT|FIELD|FILES|FOR|NEXT|FUNCTION|GET|GOSUB|GOTO|IF|THEN|INPUT|INPUT\ \#|IOCTL|KEY|KEY|KILL|LET|LINE|LINE\ INPUT|LINE\ INPUT\ \#|LOCATE|LOCK|UNLOCK|LPRINT|LSET|MID\$|MKDIR|NAME|ON\ COM|ON\ ERROR|ON\ KEY|ON\ PEN|ON\ PLAY|ON\ STRIG|ON\ TIMER|ON\ UEVENT|ON|OPEN|OPEN\ COM|OPTION\ BASE|OUT|PAINT|PALETTE|PCOPY|PEN|PLAY|POKE|PRESET|PRINT|PRINT\ \#|PRINT\ USING|PSET|PUT|PUT|RANDOMIZE|READ|REDIM|REM|RESET|RESTORE|RESUME|RETURN|RMDIR|RSET|RUN|SCREEN|SEEK|SELECT\ CASE|SHARED|SHELL|SLEEP|SOUND|STATIC|STOP|STRIG|SUB|SWAP|SYSTEM|TIME\$|TIMER|TROFF|TRON|TYPE|UEVENT|UNLOCK|VIEW|WAIT|WHILE|WEND|WIDTH|WINDOW|WRITE)\b`, KeywordReserved, nil}, + }, + "keywords": { + {`\b(ACCESS|ALIAS|ANY|APPEND|AS|BASE|BINARY|BYVAL|CASE|CDECL|DOUBLE|ELSE|ELSEIF|ENDIF|INTEGER|IS|LIST|LOCAL|LONG|LOOP|MOD|NEXT|OFF|ON|OUTPUT|RANDOM|SIGNAL|SINGLE|STEP|STRING|THEN|TO|UNTIL|USING|WEND)\b`, Keyword, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/q/qml.go b/vendor/github.com/alecthomas/chroma/lexers/q/qml.go new file mode 100644 index 0000000..dfd3c75 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/q/qml.go @@ -0,0 +1,58 @@ +package q + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Qml lexer. +var Qml = internal.Register(MustNewLazyLexer( + &Config{ + Name: "QML", + Aliases: []string{"qml", "qbs"}, + Filenames: []string{"*.qml", "*.qbs"}, + MimeTypes: []string{"application/x-qml", "application/x-qt.qbs+qml"}, + DotAll: true, + }, + qmlRules, +)) + +func qmlRules() Rules { + return Rules{ + "commentsandwhitespace": { + {`\s+`, Text, nil}, + {``, `role`, `state`, `sub`, `no`, + `submethod`, `subset`, `succeed`, `supersede`, `try`, `unit`, `unless`, `until`, + `use`, `when`, `while`, `with`, `without`, `export`, `native`, `repr`, `required`, `rw`, + `symbol`, `default`, `cached`, `DEPRECATED`, `dynamic`, `hidden-from-backtrace`, `nodal`, + `pure`, `raw`, `start`, `react`, `supply`, `whenever`, `also`, `rule`, `token`, `regex`, + `dynamic-scope`, `built`, `temp`, + } + + keywordsPattern := Words(`(?)`, `(>=)`, `minmax`, `notandthen`, `S`, + } + + wordOperatorsPattern := Words(`(?<=^|\b|\s)`, `(?=$|\b|\s)`, wordOperators...) + + operators := []string{ + `++`, `--`, `-`, `**`, `!`, `+`, `~`, `?`, `+^`, `~^`, `?^`, `^`, `*`, `/`, `%`, `%%`, `+&`, + `+<`, `+>`, `~&`, `~<`, `~>`, `?&`, `+|`, `+^`, `~|`, `~^`, `?`, `?|`, `?^`, `&`, `^`, + `<=>`, `^…^`, `^…`, `…^`, `…`, `...`, `...^`, `^...`, `^...^`, `..`, `..^`, `^..`, `^..^`, + `::=`, `:=`, `!=`, `==`, `<=`, `<`, `>=`, `>`, `~~`, `===`, `&&`, `||`, `|`, `^^`, `//`, + `??`, `!!`, `^fff^`, `^ff^`, `<==`, `==>`, `<<==`, `==>>`, `=>`, `=`, `<<`, `«`, `>>`, `»`, + `,`, `>>.`, `».`, `.&`, `.=`, `.^`, `.?`, `.+`, `.*`, `.`, `∘`, `∩`, `⊍`, `∪`, `⊎`, `∖`, + `⊖`, `≠`, `≤`, `≥`, `=:=`, `=~=`, `≅`, `∈`, `∉`, `≡`, `≢`, `∋`, `∌`, `⊂`, `⊄`, `⊆`, `⊈`, + `⊃`, `⊅`, `⊇`, `⊉`, `:`, `!!!`, `???`, `¯`, `×`, `÷`, `−`, `⁺`, `⁻`, + } + + operatorsPattern := Words(``, ``, operators...) + + builtinTypes := []string{ + `False`, `True`, `Order`, `More`, `Less`, `Same`, `Any`, `Array`, `Associative`, `AST`, + `atomicint`, `Attribute`, `Backtrace`, `Backtrace::Frame`, `Bag`, `Baggy`, `BagHash`, + `Blob`, `Block`, `Bool`, `Buf`, `Callable`, `CallFrame`, `Cancellation`, `Capture`, + `CArray`, `Channel`, `Code`, `compiler`, `Complex`, `ComplexStr`, `CompUnit`, + `CompUnit::PrecompilationRepository`, `CompUnit::Repository`, `Empty`, + `CompUnit::Repository::FileSystem`, `CompUnit::Repository::Installation`, `Cool`, + `CurrentThreadScheduler`, `CX::Warn`, `CX::Take`, `CX::Succeed`, `CX::Return`, `CX::Redo`, + `CX::Proceed`, `CX::Next`, `CX::Last`, `CX::Emit`, `CX::Done`, `Cursor`, `Date`, `Dateish`, + `DateTime`, `Distribution`, `Distribution::Hash`, `Distribution::Locally`, + `Distribution::Path`, `Distribution::Resource`, `Distro`, `Duration`, `Encoding`, + `Encoding::Registry`, `Endian`, `Enumeration`, `Exception`, `Failure`, `FatRat`, `Grammar`, + `Hash`, `HyperWhatever`, `Instant`, `Int`, `int`, `int16`, `int32`, `int64`, `int8`, `str`, + `IntStr`, `IO`, `IO::ArgFiles`, `IO::CatHandle`, `IO::Handle`, `IO::Notification`, + `IO::Notification::Change`, `IO::Path`, `IO::Path::Cygwin`, `IO::Path::Parts`, + `IO::Path::QNX`, `IO::Path::Unix`, `IO::Path::Win32`, `IO::Pipe`, `IO::Socket`, + `IO::Socket::Async`, `IO::Socket::Async::ListenSocket`, `IO::Socket::INET`, `IO::Spec`, + `IO::Spec::Cygwin`, `IO::Spec::QNX`, `IO::Spec::Unix`, `IO::Spec::Win32`, `IO::Special`, + `Iterable`, `Iterator`, `Junction`, `Kernel`, `Label`, `List`, `Lock`, `Lock::Async`, + `Lock::ConditionVariable`, `long`, `longlong`, `Macro`, `Map`, `Match`, + `Metamodel::AttributeContainer`, `Metamodel::C3MRO`, `Metamodel::ClassHOW`, + `Metamodel::ConcreteRoleHOW`, `Metamodel::CurriedRoleHOW`, `Metamodel::DefiniteHOW`, + `Metamodel::Documenting`, `Metamodel::EnumHOW`, `Metamodel::Finalization`, + `Metamodel::MethodContainer`, `Metamodel::Mixins`, `Metamodel::MROBasedMethodDispatch`, + `Metamodel::MultipleInheritance`, `Metamodel::Naming`, `Metamodel::Primitives`, + `Metamodel::PrivateMethodContainer`, `Metamodel::RoleContainer`, `Metamodel::RolePunning`, + `Metamodel::Stashing`, `Metamodel::Trusting`, `Metamodel::Versioning`, `Method`, `Mix`, + `MixHash`, `Mixy`, `Mu`, `NFC`, `NFD`, `NFKC`, `NFKD`, `Nil`, `Num`, `num32`, `num64`, + `Numeric`, `NumStr`, `ObjAt`, `Order`, `Pair`, `Parameter`, `Perl`, `Pod::Block`, + `Pod::Block::Code`, `Pod::Block::Comment`, `Pod::Block::Declarator`, `Pod::Block::Named`, + `Pod::Block::Para`, `Pod::Block::Table`, `Pod::Heading`, `Pod::Item`, `Pointer`, + `Positional`, `PositionalBindFailover`, `Proc`, `Proc::Async`, `Promise`, `Proxy`, + `PseudoStash`, `QuantHash`, `RaceSeq`, `Raku`, `Range`, `Rat`, `Rational`, `RatStr`, + `Real`, `Regex`, `Routine`, `Routine::WrapHandle`, `Scalar`, `Scheduler`, `Semaphore`, + `Seq`, `Sequence`, `Set`, `SetHash`, `Setty`, `Signature`, `size_t`, `Slip`, `Stash`, + `Str`, `StrDistance`, `Stringy`, `Sub`, `Submethod`, `Supplier`, `Supplier::Preserving`, + `Supply`, `Systemic`, `Tap`, `Telemetry`, `Telemetry::Instrument::Thread`, + `Telemetry::Instrument::ThreadPool`, `Telemetry::Instrument::Usage`, `Telemetry::Period`, + `Telemetry::Sampler`, `Thread`, `Test`, `ThreadPoolScheduler`, `UInt`, `uint16`, `uint32`, + `uint64`, `uint8`, `Uni`, `utf8`, `ValueObjAt`, `Variable`, `Version`, `VM`, `Whatever`, + `WhateverCode`, `WrapHandle`, `NativeCall`, + // Pragmas + `precompilation`, `experimental`, `worries`, `MONKEY-TYPING`, `MONKEY-SEE-NO-EVAL`, + `MONKEY-GUTS`, `fatal`, `lib`, `isms`, `newline`, `nqp`, `soft`, + `strict`, `trace`, `variables`, + } + + builtinTypesPattern := Words(`(? 0 { + if tokenClass == rakuPod { + match, err := podRegex.FindRunesMatchStartingAt(text, searchPos+nChars) + if err == nil { + closingChars = match.Runes() + nextClosePos = match.Index + } else { + nextClosePos = -1 + } + } else { + nextClosePos = indexAt(text, closingChars, searchPos+nChars) + } + + nextOpenPos := indexAt(text, openingChars, searchPos+nChars) + + switch { + case nextClosePos == -1: + nextClosePos = len(text) + nestingLevel = 0 + case nextOpenPos != -1 && nextOpenPos < nextClosePos: + nestingLevel++ + nChars = len(openingChars) + searchPos = nextOpenPos + default: // next_close_pos < next_open_pos + nestingLevel-- + nChars = len(closingChars) + searchPos = nextClosePos + } + } + + endPos = nextClosePos + } + + if endPos < 0 { + // if we didn't find a closer, just highlight the + // rest of the text in this class + endPos = len(text) + } + + adverbre := regexp.MustCompile(`:to\b|:heredoc\b`) + var heredocTerminator []rune + var endHeredocPos int + if adverbre.MatchString(string(adverbs)) { + if endPos != len(text) { + heredocTerminator = text[state.Pos:endPos] + nChars = len(heredocTerminator) + } else { + endPos = state.Pos + 1 + heredocTerminator = []rune{} + nChars = 0 + } + + if nChars > 0 { + endHeredocPos = indexAt(text[endPos:], heredocTerminator, 0) + if endHeredocPos > -1 { + endPos += endHeredocPos + } else { + endPos = len(text) + } + } + } + + textBetweenBrackets := string(text[state.Pos:endPos]) + switch tokenClass { + case rakuPod, rakuPodDeclaration, rakuNameAttribute: + state.NamedGroups[`value`] = textBetweenBrackets + state.NamedGroups[`closing_delimiters`] = string(closingChars) + case rakuQuote: + if len(heredocTerminator) > 0 { + // Length of heredoc terminator + closing chars + `;` + heredocFristPunctuationLen := nChars + len(openingChars) + 1 + + state.NamedGroups[`opening_delimiters`] = string(openingChars) + + string(text[state.Pos:state.Pos+heredocFristPunctuationLen]) + + state.NamedGroups[`value`] = + string(text[state.Pos+heredocFristPunctuationLen : endPos]) + + if endHeredocPos > -1 { + state.NamedGroups[`closing_delimiters`] = string(heredocTerminator) + } + } else { + state.NamedGroups[`value`] = textBetweenBrackets + if nChars > 0 { + state.NamedGroups[`closing_delimiters`] = string(closingChars) + } + } + default: + state.Groups = []string{state.Groups[0] + string(text[state.Pos:endPos+nChars])} + } + + state.Pos = endPos + nChars + + return nil + } + } + + // Raku rules + // Empty capture groups are placeholders and will be replaced by mutators + // DO NOT REMOVE THEM! + return Rules{ + "root": { + // Placeholder, will be overwritten by mutators, DO NOT REMOVE! + {`\A\z`, nil, nil}, + Include("common"), + {`{`, Punctuation, Push(`root`)}, + {`\(`, Punctuation, Push(`root`)}, + {`[)}]`, Punctuation, Pop(1)}, + {`;`, Punctuation, nil}, + {`\[|\]`, Operator, nil}, + {`.+?`, Text, nil}, + }, + "common": { + {`^#![^\n]*$`, CommentHashbang, nil}, + Include("pod"), + // Multi-line, Embedded comment + { + "#`(?(?" + bracketsPattern + `)\k*)`, + CommentMultiline, + findBrackets(rakuMultilineComment), + }, + {`#[^\n]*$`, CommentSingle, nil}, + // /regex/ + { + `(?<=(?:^|\(|=|:|~~|\[|{|,|=>)\s*)(/)(?!\]|\))((?:\\\\|\\/|.)*?)((?>)(\S+?)(<<)`, ByGroups(Operator, UsingSelf("root"), Operator), nil}, + {`(»)(\S+?)(«)`, ByGroups(Operator, UsingSelf("root"), Operator), nil}, + // Hyperoperator | «*« + {`(<<)(\S+?)(<<)`, ByGroups(Operator, UsingSelf("root"), Operator), nil}, + {`(«)(\S+?)(«)`, ByGroups(Operator, UsingSelf("root"), Operator), nil}, + // Hyperoperator | »*» + {`(>>)(\S+?)(>>)`, ByGroups(Operator, UsingSelf("root"), Operator), nil}, + {`(»)(\S+?)(»)`, ByGroups(Operator, UsingSelf("root"), Operator), nil}, + // <> + {`(?>)[^\n])+?[},;] *\n)(?!(?:(?!>>).)+?>>\S+?>>)`, Punctuation, Push("<<")}, + // «quoted words» + {`(? operators | something < onething > something + { + `(?<=[$@%&]?\w[\w':-]* +)(<=?)( *[^ ]+? *)(>=?)(?= *[$@%&]?\w[\w':-]*)`, + ByGroups(Operator, UsingSelf("root"), Operator), + nil, + }, + // + { + `(?])+?)(>)(?!\s*(?:\d+|\.(?:Int|Numeric)|[$@%]\*?\w[\w':-]*[^(]|\s+\[))`, + ByGroups(Punctuation, String, Punctuation), + nil, + }, + {`C?X::['\w:-]+`, NameException, nil}, + Include("metaoperator"), + // Pair | key => value + { + `(\w[\w'-]*)(\s*)(=>)`, + ByGroups(String, Text, Operator), + nil, + }, + Include("colon-pair"), + // Token + { + `(?<=(?:^|\s)(?:regex|token|rule)(\s+))` + namePattern + colonPairLookahead + `\s*[({])`, + NameFunction, + Push("token", "name-adverb"), + }, + // Substitution + {`(?<=^|\b|\s)(?(?:qq|q|Q))(?(?::?(?:heredoc|to|qq|ww|q|w|s|a|h|f|c|b|to|v|x))*)(?\s*)(?(?[^0-9a-zA-Z:\s])\k*)`, + EmitterFunc(quote), + findBrackets(rakuQuote), + }, + // Function + { + `\b` + namePattern + colonPairLookahead + `\()`, + NameFunction, + Push("name-adverb"), + }, + // Method + { + `(?(?[^\w:\s])\k*)`, + ByGroupNames( + map[string]Emitter{ + `opening_delimiters`: Punctuation, + `delimiter`: nil, + }, + ), + findBrackets(rakuMatchRegex), + }, + }, + "substitution": { + Include("colon-pair-attribute"), + // Substitution | s{regex} = value + { + `(?(?` + bracketsPattern + `)\k*)`, + ByGroupNames(map[string]Emitter{ + `opening_delimiters`: Punctuation, + `delimiter`: nil, + }), + findBrackets(rakuMatchRegex), + }, + // Substitution | s/regex/string/ + { + `(?[^\w:\s])`, + Punctuation, + findBrackets(rakuSubstitutionRegex), + }, + }, + "number": { + {`0_?[0-7]+(_[0-7]+)*`, LiteralNumberOct, nil}, + {`0x[0-9A-Fa-f]+(_[0-9A-Fa-f]+)*`, LiteralNumberHex, nil}, + {`0b[01]+(_[01]+)*`, LiteralNumberBin, nil}, + { + `(?i)(\d*(_\d*)*\.\d+(_\d*)*|\d+(_\d*)*\.\d+(_\d*)*)(e[+-]?\d+)?`, + LiteralNumberFloat, + nil, + }, + {`(?i)\d+(_\d*)*e[+-]?\d+(_\d*)*`, LiteralNumberFloat, nil}, + {`(?<=\d+)i`, NameConstant, nil}, + {`\d+(_\d+)*`, LiteralNumberInteger, nil}, + }, + "name-adverb": { + Include("colon-pair-attribute-keyvalue"), + Default(Pop(1)), + }, + "colon-pair": { + // :key(value) + {colonPairPattern, colonPair(String), findBrackets(rakuNameAttribute)}, + // :123abc + { + `(:)(\d+)(\w[\w'-]*)`, + ByGroups(Punctuation, UsingSelf("number"), String), + nil, + }, + // :key + {`(:)(!?)(\w[\w'-]*)`, ByGroups(Punctuation, Operator, String), nil}, + {`\s+`, Text, nil}, + }, + "colon-pair-attribute": { + // :key(value) + {colonPairPattern, colonPair(NameAttribute), findBrackets(rakuNameAttribute)}, + // :123abc + { + `(:)(\d+)(\w[\w'-]*)`, + ByGroups(Punctuation, UsingSelf("number"), NameAttribute), + nil, + }, + // :key + {`(:)(!?)(\w[\w'-]*)`, ByGroups(Punctuation, Operator, NameAttribute), nil}, + {`\s+`, Text, nil}, + }, + "colon-pair-attribute-keyvalue": { + // :key(value) + {colonPairPattern, colonPair(NameAttribute), findBrackets(rakuNameAttribute)}, + }, + "escape-qq": { + { + `(? + { + `(?`), + tokenType: Punctuation, + stateName: `root`, + pushState: true, + }), + }, + // {code} + Include(`closure`), + // Properties + {`(:)(\w+)`, ByGroups(Punctuation, NameAttribute), nil}, + // Operator + {`\|\||\||&&|&|\.\.|\*\*|%%|%|:|!|<<|«|>>|»|\+|\*\*|\*|\?|=|~|<~~>`, Operator, nil}, + // Anchors + {`\^\^|\^|\$\$|\$`, NameEntity, nil}, + {`\.`, NameEntity, nil}, + {`#[^\n]*\n`, CommentSingle, nil}, + // Lookaround + { + `(?`), + tokenType: Punctuation, + stateName: `regex`, + pushState: true, + }), + }, + { + `(?)`, + ByGroups(Punctuation, Operator, OperatorWord, Punctuation), + nil, + }, + // <$variable> + { + `(?)`, + ByGroups(Punctuation, Operator, NameVariable, Punctuation), + nil, + }, + // Capture markers + {`(?`, Operator, nil}, + { + `(? + {`(?`, Punctuation, Pop(1)}, + // + { + `\(`, + Punctuation, + replaceRule(ruleReplacingConfig{ + delimiter: []rune(`)>`), + tokenType: Punctuation, + stateName: `root`, + popState: true, + pushState: true, + }), + }, + // + { + `\s+`, + StringRegex, + replaceRule(ruleReplacingConfig{ + delimiter: []rune(`>`), + tokenType: Punctuation, + stateName: `regex`, + popState: true, + pushState: true, + }), + }, + // + { + `:`, + Punctuation, + replaceRule(ruleReplacingConfig{ + delimiter: []rune(`>`), + tokenType: Punctuation, + stateName: `root`, + popState: true, + pushState: true, + }), + }, + }, + "regex-variable": { + Include(`regex-starting-operators`), + // + {`(&)?(\w[\w':-]*)(>)`, ByGroups(Operator, NameFunction, Punctuation), Pop(1)}, + // `, Punctuation, Pop(1)}, + Include("regex-class-builtin"), + Include("variable"), + Include(`regex-starting-operators`), + Include("colon-pair-attribute"), + {`(?] + { + `\b([RZX]+)\b(\[)([^\s\]]+?)(\])`, + ByGroups(OperatorWord, Punctuation, UsingSelf("root"), Punctuation), + nil, + }, + // Z=> + {`\b([RZX]+)\b([^\s\]]+)`, ByGroups(OperatorWord, UsingSelf("operator")), nil}, + }, + "operator": { + // Word Operator + {wordOperatorsPattern, OperatorWord, nil}, + // Operator + {operatorsPattern, Operator, nil}, + }, + "pod": { + // Single-line pod declaration + {`(#[|=])\s`, Keyword, Push("pod-single")}, + // Multi-line pod declaration + { + "(?#[|=])(?(?" + bracketsPattern + `)\k*)(?)(?)`, + ByGroupNames( + map[string]Emitter{ + `keyword`: Keyword, + `opening_delimiters`: Punctuation, + `delimiter`: nil, + `value`: UsingSelf("pod-declaration"), + `closing_delimiters`: Punctuation, + }), + findBrackets(rakuPodDeclaration), + }, + Include("pod-blocks"), + }, + "pod-blocks": { + // =begin code + { + `(?<=^ *)(? *)(?=begin)(? +)(?code)(?[^\n]*)(?.*?)(?^\k)(?=end)(? +)\k`, + EmitterFunc(podCode), + nil, + }, + // =begin + { + `(?<=^ *)(? *)(?=begin)(? +)(?!code)(?\w[\w'-]*)(?[^\n]*)(?)(?)`, + ByGroupNames( + map[string]Emitter{ + `ws`: Comment, + `keyword`: Keyword, + `ws2`: StringDoc, + `name`: Keyword, + `config`: EmitterFunc(podConfig), + `value`: UsingSelf("pod-begin"), + `closing_delimiters`: Keyword, + }), + findBrackets(rakuPod), + }, + // =for ... + { + `(?<=^ *)(? *)(?=(?:for|defn))(? +)(?\w[\w'-]*)(?[^\n]*\n)`, + ByGroups(Comment, Keyword, StringDoc, Keyword, EmitterFunc(podConfig)), + Push("pod-paragraph"), + }, + // =config + { + `(?<=^ *)(? *)(?=config)(? +)(?\w[\w'-]*)(?[^\n]*\n)`, + ByGroups(Comment, Keyword, StringDoc, Keyword, EmitterFunc(podConfig)), + nil, + }, + // =alias + { + `(?<=^ *)(? *)(?=alias)(? +)(?\w[\w'-]*)(?[^\n]*\n)`, + ByGroups(Comment, Keyword, StringDoc, Keyword, StringDoc), + nil, + }, + // =encoding + { + `(?<=^ *)(? *)(?=encoding)(? +)(?[^\n]+)`, + ByGroups(Comment, Keyword, StringDoc, Name), + nil, + }, + // =para ... + { + `(?<=^ *)(? *)(?=(?:para|table|pod))(?(? *)(?=head\d+)(? *)(?#?)`, + ByGroups(Comment, Keyword, GenericHeading, Keyword), + Push("pod-heading"), + }, + // =item ... + { + `(?<=^ *)(? *)(?=(?:item\d*|comment|data|[A-Z]+))(? *)(?#?)`, + ByGroups(Comment, Keyword, StringDoc, Keyword), + Push("pod-paragraph"), + }, + { + `(?<=^ *)(? *)(?=finish)(?[^\n]*)`, + ByGroups(Comment, Keyword, EmitterFunc(podConfig)), + Push("pod-finish"), + }, + // ={custom} ... + { + `(?<=^ *)(? *)(?=\w[\w'-]*)(? *)(?#?)`, + ByGroups(Comment, Name, StringDoc, Keyword), + Push("pod-paragraph"), + }, + // = podconfig + { + `(?<=^ *)(? *=)(? *)(?(?::\w[\w'-]*(?:` + colonPairOpeningBrackets + `.+?` + + colonPairClosingBrackets + `) *)*\n)`, + ByGroups(Keyword, StringDoc, EmitterFunc(podConfig)), + nil, + }, + }, + "pod-begin": { + Include("pod-blocks"), + Include("pre-pod-formatter"), + {`.+?`, StringDoc, nil}, + }, + "pod-declaration": { + Include("pre-pod-formatter"), + {`.+?`, StringDoc, nil}, + }, + "pod-paragraph": { + {`\n *\n|\n(?=^ *=)`, StringDoc, Pop(1)}, + Include("pre-pod-formatter"), + {`.+?`, StringDoc, nil}, + }, + "pod-single": { + {`\n`, StringDoc, Pop(1)}, + Include("pre-pod-formatter"), + {`.+?`, StringDoc, nil}, + }, + "pod-heading": { + {`\n *\n|\n(?=^ *=)`, GenericHeading, Pop(1)}, + Include("pre-pod-formatter"), + {`.+?`, GenericHeading, nil}, + }, + "pod-finish": { + {`\z`, nil, Pop(1)}, + Include("pre-pod-formatter"), + {`.+?`, StringDoc, nil}, + }, + "pre-pod-formatter": { + // C, B, ... + { + `(?[CBIUDTKRPAELZVMSXN])(?<+|«)`, + ByGroups(Keyword, Punctuation), + findBrackets(rakuPodFormatter), + }, + }, + "pod-formatter": { + // Placeholder rule, will be replaced by mutators. DO NOT REMOVE! + {`>`, Punctuation, Pop(1)}, + Include("pre-pod-formatter"), + // Placeholder rule, will be replaced by mutators. DO NOT REMOVE! + {`.+?`, StringOther, nil}, + }, + "variable": { + {variablePattern, NameVariable, Push("name-adverb")}, + {globalVariablePattern, NameVariableGlobal, Push("name-adverb")}, + {`[$@]<[^>]+>`, NameVariable, nil}, + {`\$[/!¢]`, NameVariable, nil}, + {`[$@%]`, NameVariable, nil}, + }, + "single-quote": { + {`(?>(?!\s*(?:\d+|\.(?:Int|Numeric)|[$@%]\*?[\w':-]+|\s+\[))`, Punctuation, Pop(1)}, + Include("ww"), + }, + "«": { + {`»(?!\s*(?:\d+|\.(?:Int|Numeric)|[$@%]\*?[\w':-]+|\s+\[))`, Punctuation, Pop(1)}, + Include("ww"), + }, + "ww": { + Include("single-quote"), + Include("qq"), + }, + "qq": { + Include("qq-variable"), + Include("closure"), + Include(`escape-char`), + Include("escape-hexadecimal"), + Include("escape-c-name"), + Include("escape-qq"), + {`.+?`, StringDouble, nil}, + }, + "qq-variable": { + { + `(?\.)(?` + namePattern + `)` + colonPairLookahead + `\()`, + ByGroupNames(map[string]Emitter{ + `operator`: Operator, + `method_name`: NameFunction, + }), + Push(`name-adverb`), + }, + // Function/Signature + { + `\(`, Punctuation, replaceRule( + ruleReplacingConfig{ + delimiter: []rune(`)`), + tokenType: Punctuation, + stateName: `root`, + pushState: true, + }), + }, + Default(Pop(1)), + }, + "Q": { + Include("escape-qq"), + {`.+?`, String, nil}, + }, + "Q-closure": { + Include("escape-qq"), + Include("closure"), + {`.+?`, String, nil}, + }, + "Q-variable": { + Include("escape-qq"), + Include("qq-variable"), + {`.+?`, String, nil}, + }, + "closure": { + {`(? -1 { + idx = utf8.RuneCountInString(text[:idx]) + + // Search again if the substr is escaped with backslash + if (idx > 1 && strFromPos[idx-1] == '\\' && strFromPos[idx-2] != '\\') || + (idx == 1 && strFromPos[idx-1] == '\\') { + idx = indexAt(str[pos:], substr, idx+1) + + idx = utf8.RuneCountInString(text[:idx]) + + if idx < 0 { + return idx + } + } + idx += pos + } + + return idx +} + +// Tells if an array of string contains a string +func contains(s []string, e string) bool { + for _, value := range s { + if value == e { + return true + } + } + return false +} + +type rulePosition int + +const ( + topRule rulePosition = 0 + bottomRule = -1 +) + +type ruleMakingConfig struct { + delimiter []rune + pattern string + tokenType Emitter + mutator Mutator + numberOfDelimiterChars int +} + +type ruleReplacingConfig struct { + delimiter []rune + pattern string + tokenType Emitter + numberOfDelimiterChars int + mutator Mutator + appendMutator Mutator + rulePosition rulePosition + stateName string + pop bool + popState bool + pushState bool +} + +// Pops rule from state-stack and replaces the rule with the previous rule +func popRule(rule ruleReplacingConfig) MutatorFunc { + return func(state *LexerState) error { + stackName := genStackName(rule.stateName, rule.rulePosition) + + stack, ok := state.Get(stackName).([]ruleReplacingConfig) + + if ok && len(stack) > 0 { + // Pop from stack + stack = stack[:len(stack)-1] + lastRule := stack[len(stack)-1] + lastRule.pushState = false + lastRule.popState = false + lastRule.pop = true + state.Set(stackName, stack) + + // Call replaceRule to use the last rule + err := replaceRule(lastRule)(state) + if err != nil { + panic(err) + } + } + + return nil + } +} + +// Replaces a state's rule based on the rule config and position +func replaceRule(rule ruleReplacingConfig) MutatorFunc { + return func(state *LexerState) error { + stateName := rule.stateName + stackName := genStackName(rule.stateName, rule.rulePosition) + + stack, ok := state.Get(stackName).([]ruleReplacingConfig) + if !ok { + stack = []ruleReplacingConfig{} + } + + // If state-stack is empty fill it with the placeholder rule + if len(stack) == 0 { + stack = []ruleReplacingConfig{ + { + // Placeholder, will be overwritten by mutators, DO NOT REMOVE! + pattern: `\A\z`, + tokenType: nil, + mutator: nil, + stateName: stateName, + rulePosition: rule.rulePosition, + }, + } + state.Set(stackName, stack) + } + + var mutator Mutator + mutators := []Mutator{} + + switch { + case rule.rulePosition == topRule && rule.mutator == nil: + // Default mutator for top rule + mutators = []Mutator{Pop(1), popRule(rule)} + case rule.rulePosition == topRule && rule.mutator != nil: + // Default mutator for top rule, when rule.mutator is set + mutators = []Mutator{rule.mutator, popRule(rule)} + case rule.mutator != nil: + mutators = []Mutator{rule.mutator} + } + + if rule.appendMutator != nil { + mutators = append(mutators, rule.appendMutator) + } + + if len(mutators) > 0 { + mutator = Mutators(mutators...) + } else { + mutator = nil + } + + ruleConfig := ruleMakingConfig{ + pattern: rule.pattern, + delimiter: rule.delimiter, + numberOfDelimiterChars: rule.numberOfDelimiterChars, + tokenType: rule.tokenType, + mutator: mutator, + } + + cRule := makeRule(ruleConfig) + + switch rule.rulePosition { + case topRule: + state.Rules[stateName][0] = cRule + case bottomRule: + state.Rules[stateName][len(state.Rules[stateName])-1] = cRule + } + + // Pop state name from stack if asked. State should be popped first before Pushing + if rule.popState { + err := Pop(1)(state) + if err != nil { + panic(err) + } + } + + // Push state name to stack if asked + if rule.pushState { + err := Push(stateName)(state) + if err != nil { + panic(err) + } + } + + if !rule.pop { + state.Set(stackName, append(stack, rule)) + } + + return nil + } +} + +// Generates rule replacing stack using state name and rule position +func genStackName(stateName string, rulePosition rulePosition) (stackName string) { + switch rulePosition { + case topRule: + stackName = stateName + `-top-stack` + case bottomRule: + stackName = stateName + `-bottom-stack` + } + return +} + +// Makes a compiled rule and returns it +func makeRule(config ruleMakingConfig) *CompiledRule { + var rePattern string + + if len(config.delimiter) > 0 { + delimiter := string(config.delimiter) + + if config.numberOfDelimiterChars > 1 { + delimiter = strings.Repeat(delimiter, config.numberOfDelimiterChars) + } + + rePattern = `(? 1 { + lang = langMatch[1] + } + + // Tokenise code based on lang property + sublexer := internal.Get(lang) + if sublexer != nil { + iterator, err := sublexer.Tokenise(nil, state.NamedGroups[`value`]) + + if err != nil { + panic(err) + } else { + iterators = append(iterators, iterator) + } + } else { + iterators = append(iterators, Literator(tokens[4])) + } + + // Append the rest of the tokens + iterators = append(iterators, Literator(tokens[5:]...)) + + return Concaterator(iterators...) +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/r/reasonml.go b/vendor/github.com/alecthomas/chroma/lexers/r/reasonml.go new file mode 100644 index 0000000..0ade569 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/r/reasonml.go @@ -0,0 +1,71 @@ +package r + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Reasonml lexer. +var Reasonml = internal.Register(MustNewLazyLexer( + &Config{ + Name: "ReasonML", + Aliases: []string{"reason", "reasonml"}, + Filenames: []string{"*.re", "*.rei"}, + MimeTypes: []string{"text/x-reasonml"}, + }, + reasonmlRules, +)) + +func reasonmlRules() Rules { + return Rules{ + "escape-sequence": { + {`\\[\\"\'ntbr]`, LiteralStringEscape, nil}, + {`\\[0-9]{3}`, LiteralStringEscape, nil}, + {`\\x[0-9a-fA-F]{2}`, LiteralStringEscape, nil}, + }, + "root": { + {`\s+`, Text, nil}, + {`false|true|\(\)|\[\]`, NameBuiltinPseudo, nil}, + {`\b([A-Z][\w\']*)(?=\s*\.)`, NameNamespace, Push("dotted")}, + {`\b([A-Z][\w\']*)`, NameClass, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`\/\*(?![\/])`, CommentMultiline, Push("comment")}, + {`\b(as|assert|begin|class|constraint|do|done|downto|else|end|exception|external|false|for|fun|esfun|function|functor|if|in|include|inherit|initializer|lazy|let|switch|module|pub|mutable|new|nonrec|object|of|open|pri|rec|sig|struct|then|to|true|try|type|val|virtual|when|while|with)\b`, Keyword, nil}, + {"(~|\\}|\\|]|\\||\\|\\||\\{<|\\{|`|_|]|\\[\\||\\[>|\\[<|\\[|\\?\\?|\\?|>\\}|>]|>|=|<-|<|;;|;|:>|:=|::|:|\\.\\.\\.|\\.\\.|\\.|=>|-\\.|-|,|\\+|\\*|\\)|\\(|&&|&|#|!=)", OperatorWord, nil}, + {`([=<>@^|&+\*/$%-]|[!?~])?[!$%&*+\./:<=>?@^|~-]`, Operator, nil}, + {`\b(and|asr|land|lor|lsl|lsr|lxor|mod|or)\b`, OperatorWord, nil}, + {`\b(unit|int|float|bool|string|char|list|array)\b`, KeywordType, nil}, + {`[^\W\d][\w']*`, Name, nil}, + {`-?\d[\d_]*(.[\d_]*)?([eE][+\-]?\d[\d_]*)`, LiteralNumberFloat, nil}, + {`0[xX][\da-fA-F][\da-fA-F_]*`, LiteralNumberHex, nil}, + {`0[oO][0-7][0-7_]*`, LiteralNumberOct, nil}, + {`0[bB][01][01_]*`, LiteralNumberBin, nil}, + {`\d[\d_]*`, LiteralNumberInteger, nil}, + {`'(?:(\\[\\\"'ntbr ])|(\\[0-9]{3})|(\\x[0-9a-fA-F]{2}))'`, LiteralStringChar, nil}, + {`'.'`, LiteralStringChar, nil}, + {`'`, Keyword, nil}, + {`"`, LiteralStringDouble, Push("string")}, + {`[~?][a-z][\w\']*:`, NameVariable, nil}, + }, + "comment": { + {`[^\/*]+`, CommentMultiline, nil}, + {`\/\*`, CommentMultiline, Push()}, + {`\*\/`, CommentMultiline, Pop(1)}, + {`[\*]`, CommentMultiline, nil}, + }, + "string": { + {`[^\\"]+`, LiteralStringDouble, nil}, + Include("escape-sequence"), + {`\\\n`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + "dotted": { + {`\s+`, Text, nil}, + {`\.`, Punctuation, nil}, + {`[A-Z][\w\']*(?=\s*\.)`, NameNamespace, nil}, + {`[A-Z][\w\']*`, NameClass, Pop(1)}, + {`[a-z_][\w\']*`, Name, Pop(1)}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/r/regedit.go b/vendor/github.com/alecthomas/chroma/lexers/r/regedit.go new file mode 100644 index 0000000..6177234 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/r/regedit.go @@ -0,0 +1,36 @@ +package r + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Reg lexer. +var Reg = internal.Register(MustNewLazyLexer( + &Config{ + Name: "reg", + Aliases: []string{"registry"}, + Filenames: []string{"*.reg"}, + MimeTypes: []string{"text/x-windows-registry"}, + }, + regRules, +)) + +func regRules() Rules { + return Rules{ + "root": { + {`Windows Registry Editor.*`, Text, nil}, + {`\s+`, Text, nil}, + {`[;#].*`, CommentSingle, nil}, + {`(\[)(-?)(HKEY_[A-Z_]+)(.*?\])$`, ByGroups(Keyword, Operator, NameBuiltin, Keyword), nil}, + {`("(?:\\"|\\\\|[^"])+")([ \t]*)(=)([ \t]*)`, ByGroups(NameAttribute, Text, Operator, Text), Push("value")}, + {`(.*?)([ \t]*)(=)([ \t]*)`, ByGroups(NameAttribute, Text, Operator, Text), Push("value")}, + }, + "value": { + {`-`, Operator, Pop(1)}, + {`(dword|hex(?:\([0-9a-fA-F]\))?)(:)([0-9a-fA-F,]+)`, ByGroups(NameVariable, Punctuation, LiteralNumber), Pop(1)}, + {`.+`, LiteralString, Pop(1)}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/r/rexx.go b/vendor/github.com/alecthomas/chroma/lexers/r/rexx.go new file mode 100644 index 0000000..38ca768 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/r/rexx.go @@ -0,0 +1,63 @@ +package r + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Rexx lexer. +var Rexx = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Rexx", + Aliases: []string{"rexx", "arexx"}, + Filenames: []string{"*.rexx", "*.rex", "*.rx", "*.arexx"}, + MimeTypes: []string{"text/x-rexx"}, + NotMultiline: true, + CaseInsensitive: true, + }, + rexxRules, +)) + +func rexxRules() Rules { + return Rules{ + "root": { + {`\s`, TextWhitespace, nil}, + {`/\*`, CommentMultiline, Push("comment")}, + {`"`, LiteralString, Push("string_double")}, + {`'`, LiteralString, Push("string_single")}, + {`[0-9]+(\.[0-9]+)?(e[+-]?[0-9])?`, LiteralNumber, nil}, + {`([a-z_]\w*)(\s*)(:)(\s*)(procedure)\b`, ByGroups(NameFunction, TextWhitespace, Operator, TextWhitespace, KeywordDeclaration), nil}, + {`([a-z_]\w*)(\s*)(:)`, ByGroups(NameLabel, TextWhitespace, Operator), nil}, + Include("function"), + Include("keyword"), + Include("operator"), + {`[a-z_]\w*`, Text, nil}, + }, + "function": { + {Words(``, `(\s*)(\()`, `abbrev`, `abs`, `address`, `arg`, `b2x`, `bitand`, `bitor`, `bitxor`, `c2d`, `c2x`, `center`, `charin`, `charout`, `chars`, `compare`, `condition`, `copies`, `d2c`, `d2x`, `datatype`, `date`, `delstr`, `delword`, `digits`, `errortext`, `form`, `format`, `fuzz`, `insert`, `lastpos`, `left`, `length`, `linein`, `lineout`, `lines`, `max`, `min`, `overlay`, `pos`, `queued`, `random`, `reverse`, `right`, `sign`, `sourceline`, `space`, `stream`, `strip`, `substr`, `subword`, `symbol`, `time`, `trace`, `translate`, `trunc`, `value`, `verify`, `word`, `wordindex`, `wordlength`, `wordpos`, `words`, `x2b`, `x2c`, `x2d`, `xrange`), ByGroups(NameBuiltin, TextWhitespace, Operator), nil}, + }, + "keyword": { + {`(address|arg|by|call|do|drop|else|end|exit|for|forever|if|interpret|iterate|leave|nop|numeric|off|on|options|parse|pull|push|queue|return|say|select|signal|to|then|trace|until|while)\b`, KeywordReserved, nil}, + }, + "operator": { + {`(-|//|/|\(|\)|\*\*|\*|\\<<|\\<|\\==|\\=|\\>>|\\>|\\|\|\||\||&&|&|%|\+|<<=|<<|<=|<>|<|==|=|><|>=|>>=|>>|>|¬<<|¬<|¬==|¬=|¬>>|¬>|¬|\.|,)`, Operator, nil}, + }, + "string_double": { + {`[^"\n]+`, LiteralString, nil}, + {`""`, LiteralString, nil}, + {`"`, LiteralString, Pop(1)}, + {`\n`, Text, Pop(1)}, + }, + "string_single": { + {`[^\'\n]`, LiteralString, nil}, + {`\'\'`, LiteralString, nil}, + {`\'`, LiteralString, Pop(1)}, + {`\n`, Text, Pop(1)}, + }, + "comment": { + {`[^*]+`, CommentMultiline, nil}, + {`\*/`, CommentMultiline, Pop(1)}, + {`\*`, CommentMultiline, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/r/rst.go b/vendor/github.com/alecthomas/chroma/lexers/r/rst.go new file mode 100644 index 0000000..2a87479 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/r/rst.go @@ -0,0 +1,90 @@ +package r + +import ( + "strings" + + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Restructuredtext lexer. +var Restructuredtext = internal.Register(MustNewLazyLexer( + &Config{ + Name: "reStructuredText", + Aliases: []string{"rst", "rest", "restructuredtext"}, + Filenames: []string{"*.rst", "*.rest"}, + MimeTypes: []string{"text/x-rst", "text/prs.fallenstein.rst"}, + }, + restructuredtextRules, +)) + +func restructuredtextRules() Rules { + return Rules{ + "root": { + {"^(=+|-+|`+|:+|\\.+|\\'+|\"+|~+|\\^+|_+|\\*+|\\++|#+)([ \\t]*\\n)(.+)(\\n)(\\1)(\\n)", ByGroups(GenericHeading, Text, GenericHeading, Text, GenericHeading, Text), nil}, + {"^(\\S.*)(\\n)(={3,}|-{3,}|`{3,}|:{3,}|\\.{3,}|\\'{3,}|\"{3,}|~{3,}|\\^{3,}|_{3,}|\\*{3,}|\\+{3,}|#{3,})(\\n)", ByGroups(GenericHeading, Text, GenericHeading, Text), nil}, + {`^(\s*)([-*+])( .+\n(?:\1 .+\n)*)`, ByGroups(Text, LiteralNumber, UsingSelf("inline")), nil}, + {`^(\s*)([0-9#ivxlcmIVXLCM]+\.)( .+\n(?:\1 .+\n)*)`, ByGroups(Text, LiteralNumber, UsingSelf("inline")), nil}, + {`^(\s*)(\(?[0-9#ivxlcmIVXLCM]+\))( .+\n(?:\1 .+\n)*)`, ByGroups(Text, LiteralNumber, UsingSelf("inline")), nil}, + {`^(\s*)([A-Z]+\.)( .+\n(?:\1 .+\n)+)`, ByGroups(Text, LiteralNumber, UsingSelf("inline")), nil}, + {`^(\s*)(\(?[A-Za-z]+\))( .+\n(?:\1 .+\n)+)`, ByGroups(Text, LiteralNumber, UsingSelf("inline")), nil}, + {`^(\s*)(\|)( .+\n(?:\| .+\n)*)`, ByGroups(Text, Operator, UsingSelf("inline")), nil}, + {`^( *\.\.)(\s*)((?:source)?code(?:-block)?)(::)([ \t]*)([^\n]+)(\n[ \t]*\n)([ \t]+)(.*)(\n)((?:(?:\8.*|)\n)+)`, EmitterFunc(rstCodeBlock), nil}, + {`^( *\.\.)(\s*)([\w:-]+?)(::)(?:([ \t]*)(.*))`, ByGroups(Punctuation, Text, OperatorWord, Punctuation, Text, UsingSelf("inline")), nil}, + {`^( *\.\.)(\s*)(_(?:[^:\\]|\\.)+:)(.*?)$`, ByGroups(Punctuation, Text, NameTag, UsingSelf("inline")), nil}, + {`^( *\.\.)(\s*)(\[.+\])(.*?)$`, ByGroups(Punctuation, Text, NameTag, UsingSelf("inline")), nil}, + {`^( *\.\.)(\s*)(\|.+\|)(\s*)([\w:-]+?)(::)(?:([ \t]*)(.*))`, ByGroups(Punctuation, Text, NameTag, Text, OperatorWord, Punctuation, Text, UsingSelf("inline")), nil}, + {`^ *\.\..*(\n( +.*\n|\n)+)?`, CommentPreproc, nil}, + {`^( *)(:[a-zA-Z-]+:)(\s*)$`, ByGroups(Text, NameClass, Text), nil}, + {`^( *)(:.*?:)([ \t]+)(.*?)$`, ByGroups(Text, NameClass, Text, NameFunction), nil}, + {`^(\S.*(?)(`__?)", ByGroups(LiteralString, LiteralStringInterpol, LiteralString), nil}, + {"`.+?`__?", LiteralString, nil}, + {"(`.+?`)(:[a-zA-Z0-9:-]+?:)?", ByGroups(NameVariable, NameAttribute), nil}, + {"(:[a-zA-Z0-9:-]+?:)(`.+?`)", ByGroups(NameAttribute, NameVariable), nil}, + {`\*\*.+?\*\*`, GenericStrong, nil}, + {`\*.+?\*`, GenericEmph, nil}, + {`\[.*?\]_`, LiteralString, nil}, + {`<.+?>`, NameTag, nil}, + {"[^\\\\\\n\\[*`:]+", Text, nil}, + {`.`, Text, nil}, + }, + "literal": { + {"[^`]+", LiteralString, nil}, + {"``((?=$)|(?=[-/:.,; \\n\\x00\\\u2010\\\u2011\\\u2012\\\u2013\\\u2014\\\u00a0\\'\\\"\\)\\]\\}\\>\\\u2019\\\u201d\\\u00bb\\!\\?]))", LiteralString, Pop(1)}, + {"`", LiteralString, nil}, + }, + } +} + +func rstCodeBlock(groups []string, state *LexerState) Iterator { + iterators := []Iterator{} + tokens := []Token{ + {Punctuation, groups[1]}, + {Text, groups[2]}, + {OperatorWord, groups[3]}, + {Punctuation, groups[4]}, + {Text, groups[5]}, + {Keyword, groups[6]}, + {Text, groups[7]}, + } + code := strings.Join(groups[8:], "") + lexer := internal.Get(groups[6]) + if lexer == nil { + tokens = append(tokens, Token{String, code}) + iterators = append(iterators, Literator(tokens...)) + } else { + sub, err := lexer.Tokenise(nil, code) + if err != nil { + panic(err) + } + iterators = append(iterators, Literator(tokens...), sub) + } + return Concaterator(iterators...) +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/r/ruby.go b/vendor/github.com/alecthomas/chroma/lexers/r/ruby.go new file mode 100644 index 0000000..296cae9 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/r/ruby.go @@ -0,0 +1,254 @@ +package r + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Ruby lexer. +var Ruby = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Ruby", + Aliases: []string{"rb", "ruby", "duby"}, + Filenames: []string{"*.rb", "*.rbw", "Rakefile", "*.rake", "*.gemspec", "*.rbx", "*.duby", "Gemfile"}, + MimeTypes: []string{"text/x-ruby", "application/x-ruby"}, + DotAll: true, + }, + rubyRules, +)) + +func rubyRules() Rules { + return Rules{ + "root": { + {`\A#!.+?$`, CommentHashbang, nil}, + {`#.*?$`, CommentSingle, nil}, + {`=begin\s.*?\n=end.*?$`, CommentMultiline, nil}, + {Words(``, `\b`, `BEGIN`, `END`, `alias`, `begin`, `break`, `case`, `defined?`, `do`, `else`, `elsif`, `end`, `ensure`, `for`, `if`, `in`, `next`, `redo`, `rescue`, `raise`, `retry`, `return`, `super`, `then`, `undef`, `unless`, `until`, `when`, `while`, `yield`), Keyword, nil}, + {`(module)(\s+)([a-zA-Z_]\w*(?:::[a-zA-Z_]\w*)*)`, ByGroups(Keyword, Text, NameNamespace), nil}, + {`(def)(\s+)`, ByGroups(Keyword, Text), Push("funcname")}, + {"def(?=[*%&^`~+-/\\[<>=])", Keyword, Push("funcname")}, + {`(class)(\s+)`, ByGroups(Keyword, Text), Push("classname")}, + {Words(``, `\b`, `initialize`, `new`, `loop`, `include`, `extend`, `raise`, `attr_reader`, `attr_writer`, `attr_accessor`, `attr`, `catch`, `throw`, `private`, `module_function`, `public`, `protected`, `true`, `false`, `nil`), KeywordPseudo, nil}, + {`(not|and|or)\b`, OperatorWord, nil}, + {Words(``, `\?`, `autoload`, `block_given`, `const_defined`, `eql`, `equal`, `frozen`, `include`, `instance_of`, `is_a`, `iterator`, `kind_of`, `method_defined`, `nil`, `private_method_defined`, `protected_method_defined`, `public_method_defined`, `respond_to`, `tainted`), NameBuiltin, nil}, + {`(chomp|chop|exit|gsub|sub)!`, NameBuiltin, nil}, + {Words(`(?~!:])|(?<=(?:\s|;)when\s)|(?<=(?:\s|;)or\s)|(?<=(?:\s|;)and\s)|(?<=\.index\s)|(?<=\.scan\s)|(?<=\.sub\s)|(?<=\.sub!\s)|(?<=\.gsub\s)|(?<=\.gsub!\s)|(?<=\.match\s)|(?<=(?:\s|;)if\s)|(?<=(?:\s|;)elsif\s)|(?<=^when\s)|(?<=^index\s)|(?<=^scan\s)|(?<=^sub\s)|(?<=^gsub\s)|(?<=^sub!\s)|(?<=^gsub!\s)|(?<=^match\s)|(?<=^if\s)|(?<=^elsif\s))(\s*)(/)`, ByGroups(Text, LiteralStringRegex), Push("multiline-regex")}, + {`(?<=\(|,|\[)/`, LiteralStringRegex, Push("multiline-regex")}, + {`(\s+)(/)(?![\s=])`, ByGroups(Text, LiteralStringRegex), Push("multiline-regex")}, + {`(0_?[0-7]+(?:_[0-7]+)*)(\s*)([/?])?`, ByGroups(LiteralNumberOct, Text, Operator), nil}, + {`(0x[0-9A-Fa-f]+(?:_[0-9A-Fa-f]+)*)(\s*)([/?])?`, ByGroups(LiteralNumberHex, Text, Operator), nil}, + {`(0b[01]+(?:_[01]+)*)(\s*)([/?])?`, ByGroups(LiteralNumberBin, Text, Operator), nil}, + {`([\d]+(?:[_e]\d+)*)(\s*)([/?])?`, ByGroups(LiteralNumberInteger, Text, Operator), nil}, + {`@@[a-zA-Z_]\w*`, NameVariableClass, nil}, + {`@[a-zA-Z_]\w*`, NameVariableInstance, nil}, + {`\$\w+`, NameVariableGlobal, nil}, + {"\\$[!@&`\\'+~=/\\\\,;.<>_*$?:\"^-]", NameVariableGlobal, nil}, + {`\$-[0adFiIlpvw]`, NameVariableGlobal, nil}, + {`::`, Operator, nil}, + Include("strings"), + {`\?(\\[MC]-)*(\\([\\abefnrstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})|\S)(?!\w)`, LiteralStringChar, nil}, + {`[A-Z]\w+`, NameConstant, nil}, + {Words(`(\.|::)`, ``, `*`, `**`, `-`, `+`, `-@`, `+@`, `/`, `%`, `&`, `|`, `^`, "`", `~`, `[]`, `[]=`, `<<`, `>>`, `<`, `<>`, `<=>`, `>`, `>=`, `==`, `===`), ByGroups(Operator, NameOperator), nil}, + {"(\\.|::)([a-zA-Z_]\\w*[!?]?|[*%&^`~+\\-/\\[<>=])", ByGroups(Operator, Name), nil}, + {`[a-zA-Z_]\w*[!?]?`, Name, nil}, + {`(\[|\]|\*\*|<>?|>=|<=|<=>|=~|={3}|!~|&&?|\|\||\.{1,3})`, Operator, nil}, + {`[-+/*%=<>&!^|~]=?`, Operator, nil}, + {`[(){};,/?:\\]`, Punctuation, nil}, + {`\s+`, Text, nil}, + }, + "funcname": { + {`\(`, Punctuation, Push("defexpr")}, + {"(?:([a-zA-Z_]\\w*)(\\.))?([a-zA-Z_]\\w*[!?]?|\\*\\*?|[-+]@?|[/%&|^`~]|\\[\\]=?|<<|>>|<=?>|>=?|===?)", ByGroups(NameClass, Operator, NameFunction), Pop(1)}, + Default(Pop(1)), + }, + "classname": { + {`\(`, Punctuation, Push("defexpr")}, + {`<<`, Operator, Pop(1)}, + {`[A-Z_]\w*`, NameClass, Pop(1)}, + Default(Pop(1)), + }, + "defexpr": { + {`(\))(\.|::)?`, ByGroups(Punctuation, Operator), Pop(1)}, + {`\(`, Operator, Push()}, + Include("root"), + }, + "in-intp": { + {`\{`, LiteralStringInterpol, Push()}, + {`\}`, LiteralStringInterpol, Pop(1)}, + Include("root"), + }, + "string-intp": { + {`#\{`, LiteralStringInterpol, Push("in-intp")}, + {`#@@?[a-zA-Z_]\w*`, LiteralStringInterpol, nil}, + {`#\$[a-zA-Z_]\w*`, LiteralStringInterpol, nil}, + }, + "string-intp-escaped": { + Include("string-intp"), + {`\\([\\abefnrstv#"\']|x[a-fA-F0-9]{1,2}|[0-7]{1,3})`, LiteralStringEscape, nil}, + }, + "interpolated-regex": { + Include("string-intp"), + {`[\\#]`, LiteralStringRegex, nil}, + {`[^\\#]+`, LiteralStringRegex, nil}, + }, + "interpolated-string": { + Include("string-intp"), + {`[\\#]`, LiteralStringOther, nil}, + {`[^\\#]+`, LiteralStringOther, nil}, + }, + "multiline-regex": { + Include("string-intp"), + {`\\\\`, LiteralStringRegex, nil}, + {`\\/`, LiteralStringRegex, nil}, + {`[\\#]`, LiteralStringRegex, nil}, + {`[^\\/#]+`, LiteralStringRegex, nil}, + {`/[mixounse]*`, LiteralStringRegex, Pop(1)}, + }, + "end-part": { + {`.+`, CommentPreproc, Pop(1)}, + }, + "strings": { + {`\:@{0,2}[a-zA-Z_]\w*[!?]?`, LiteralStringSymbol, nil}, + {Words(`\:@{0,2}`, ``, `*`, `**`, `-`, `+`, `-@`, `+@`, `/`, `%`, `&`, `|`, `^`, "`", `~`, `[]`, `[]=`, `<<`, `>>`, `<`, `<>`, `<=>`, `>`, `>=`, `==`, `===`), LiteralStringSymbol, nil}, + {`:'(\\\\|\\'|[^'])*'`, LiteralStringSymbol, nil}, + {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + {`:"`, LiteralStringSymbol, Push("simple-sym")}, + {`([a-zA-Z_]\w*)(:)(?!:)`, ByGroups(LiteralStringSymbol, Punctuation), nil}, + {`"`, LiteralStringDouble, Push("simple-string")}, + {"(?&!^|~,(])(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)`, ByGroups(Text, LiteralStringOther, None), nil}, + {`^(\s*)(%([\t ])(?:(?:\\\3|(?!\3).)*)\3)`, ByGroups(Text, LiteralStringOther, None), nil}, + {`(%([^a-zA-Z0-9\s]))((?:\\\2|(?!\2).)*)(\2)`, String, nil}, + }, + "simple-string": { + Include("string-intp-escaped"), + {`[^\\"#]+`, LiteralStringDouble, nil}, + {`[\\#]`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + "simple-sym": { + Include("string-intp-escaped"), + {`[^\\"#]+`, LiteralStringSymbol, nil}, + {`[\\#]`, LiteralStringSymbol, nil}, + {`"`, LiteralStringSymbol, Pop(1)}, + }, + "simple-backtick": { + Include("string-intp-escaped"), + {"[^\\\\`#]+", LiteralStringBacktick, nil}, + {`[\\#]`, LiteralStringBacktick, nil}, + {"`", LiteralStringBacktick, Pop(1)}, + }, + "cb-intp-string": { + {`\\[\\{}]`, LiteralStringOther, nil}, + {`\{`, LiteralStringOther, Push()}, + {`\}`, LiteralStringOther, Pop(1)}, + Include("string-intp-escaped"), + {`[\\#{}]`, LiteralStringOther, nil}, + {`[^\\#{}]+`, LiteralStringOther, nil}, + }, + "cb-string": { + {`\\[\\{}]`, LiteralStringOther, nil}, + {`\{`, LiteralStringOther, Push()}, + {`\}`, LiteralStringOther, Pop(1)}, + {`[\\#{}]`, LiteralStringOther, nil}, + {`[^\\#{}]+`, LiteralStringOther, nil}, + }, + "cb-regex": { + {`\\[\\{}]`, LiteralStringRegex, nil}, + {`\{`, LiteralStringRegex, Push()}, + {`\}[mixounse]*`, LiteralStringRegex, Pop(1)}, + Include("string-intp"), + {`[\\#{}]`, LiteralStringRegex, nil}, + {`[^\\#{}]+`, LiteralStringRegex, nil}, + }, + "sb-intp-string": { + {`\\[\\\[\]]`, LiteralStringOther, nil}, + {`\[`, LiteralStringOther, Push()}, + {`\]`, LiteralStringOther, Pop(1)}, + Include("string-intp-escaped"), + {`[\\#\[\]]`, LiteralStringOther, nil}, + {`[^\\#\[\]]+`, LiteralStringOther, nil}, + }, + "sb-string": { + {`\\[\\\[\]]`, LiteralStringOther, nil}, + {`\[`, LiteralStringOther, Push()}, + {`\]`, LiteralStringOther, Pop(1)}, + {`[\\#\[\]]`, LiteralStringOther, nil}, + {`[^\\#\[\]]+`, LiteralStringOther, nil}, + }, + "sb-regex": { + {`\\[\\\[\]]`, LiteralStringRegex, nil}, + {`\[`, LiteralStringRegex, Push()}, + {`\][mixounse]*`, LiteralStringRegex, Pop(1)}, + Include("string-intp"), + {`[\\#\[\]]`, LiteralStringRegex, nil}, + {`[^\\#\[\]]+`, LiteralStringRegex, nil}, + }, + "pa-intp-string": { + {`\\[\\()]`, LiteralStringOther, nil}, + {`\(`, LiteralStringOther, Push()}, + {`\)`, LiteralStringOther, Pop(1)}, + Include("string-intp-escaped"), + {`[\\#()]`, LiteralStringOther, nil}, + {`[^\\#()]+`, LiteralStringOther, nil}, + }, + "pa-string": { + {`\\[\\()]`, LiteralStringOther, nil}, + {`\(`, LiteralStringOther, Push()}, + {`\)`, LiteralStringOther, Pop(1)}, + {`[\\#()]`, LiteralStringOther, nil}, + {`[^\\#()]+`, LiteralStringOther, nil}, + }, + "pa-regex": { + {`\\[\\()]`, LiteralStringRegex, nil}, + {`\(`, LiteralStringRegex, Push()}, + {`\)[mixounse]*`, LiteralStringRegex, Pop(1)}, + Include("string-intp"), + {`[\\#()]`, LiteralStringRegex, nil}, + {`[^\\#()]+`, LiteralStringRegex, nil}, + }, + "ab-intp-string": { + {`\\[\\<>]`, LiteralStringOther, nil}, + {`<`, LiteralStringOther, Push()}, + {`>`, LiteralStringOther, Pop(1)}, + Include("string-intp-escaped"), + {`[\\#<>]`, LiteralStringOther, nil}, + {`[^\\#<>]+`, LiteralStringOther, nil}, + }, + "ab-string": { + {`\\[\\<>]`, LiteralStringOther, nil}, + {`<`, LiteralStringOther, Push()}, + {`>`, LiteralStringOther, Pop(1)}, + {`[\\#<>]`, LiteralStringOther, nil}, + {`[^\\#<>]+`, LiteralStringOther, nil}, + }, + "ab-regex": { + {`\\[\\<>]`, LiteralStringRegex, nil}, + {`<`, LiteralStringRegex, Push()}, + {`>[mixounse]*`, LiteralStringRegex, Pop(1)}, + Include("string-intp"), + {`[\\#<>]`, LiteralStringRegex, nil}, + {`[^\\#<>]+`, LiteralStringRegex, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/r/rust.go b/vendor/github.com/alecthomas/chroma/lexers/r/rust.go new file mode 100644 index 0000000..5399c9d --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/r/rust.go @@ -0,0 +1,133 @@ +package r + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Rust lexer. +var Rust = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Rust", + Aliases: []string{"rust", "rs"}, + Filenames: []string{"*.rs", "*.rs.in"}, + MimeTypes: []string{"text/rust", "text/x-rust"}, + EnsureNL: true, + }, + rustRules, +)) + +func rustRules() Rules { + return Rules{ + "root": { + {`#![^[\r\n].*$`, CommentPreproc, nil}, + Default(Push("base")), + }, + "base": { + {`\n`, TextWhitespace, nil}, + {`\s+`, TextWhitespace, nil}, + {`//!.*?\n`, LiteralStringDoc, nil}, + {`///(\n|[^/].*?\n)`, LiteralStringDoc, nil}, + {`//(.*?)\n`, CommentSingle, nil}, + {`/\*\*(\n|[^/*])`, LiteralStringDoc, Push("doccomment")}, + {`/\*!`, LiteralStringDoc, Push("doccomment")}, + {`/\*`, CommentMultiline, Push("comment")}, + {`r#*"(?:\\.|[^\\;])*"#*`, LiteralString, nil}, + {`"(?:\\.|[^\\"])*"`, LiteralString, nil}, + {`\$([a-zA-Z_]\w*|\(,?|\),?|,?)`, CommentPreproc, nil}, + {Words(``, `\b`, `as`, `async`, `await`, `box`, `const`, `crate`, `dyn`, `else`, `extern`, `for`, `if`, `impl`, `in`, `loop`, `match`, `move`, `mut`, `pub`, `ref`, `return`, `static`, `super`, `trait`, `unsafe`, `use`, `where`, `while`), Keyword, nil}, + {Words(``, `\b`, `abstract`, `become`, `do`, `final`, `macro`, `override`, `priv`, `typeof`, `try`, `unsized`, `virtual`, `yield`), KeywordReserved, nil}, + {`(true|false)\b`, KeywordConstant, nil}, + {`self\b`, NameBuiltinPseudo, nil}, + {`mod\b`, Keyword, Push("modname")}, + {`let\b`, KeywordDeclaration, nil}, + {`fn\b`, Keyword, Push("funcname")}, + {`(struct|enum|type|union)\b`, Keyword, Push("typename")}, + {`(default)(\s+)(type|fn)\b`, ByGroups(Keyword, Text, Keyword), nil}, + {Words(``, `\b`, `u8`, `u16`, `u32`, `u64`, `u128`, `i8`, `i16`, `i32`, `i64`, `i128`, `usize`, `isize`, `f32`, `f64`, `char`, `str`, `bool`), KeywordType, nil}, + {`[sS]elf\b`, NameBuiltinPseudo, nil}, + {Words(``, `\b`, `Copy`, `Send`, `Sized`, `Sync`, `Unpin`, `Drop`, `Fn`, `FnMut`, `FnOnce`, `drop`, `Box`, `ToOwned`, `Clone`, `PartialEq`, `PartialOrd`, `Eq`, `Ord`, `AsRef`, `AsMut`, `Into`, `From`, `Default`, `Iterator`, `Extend`, `IntoIterator`, `DoubleEndedIterator`, `ExactSizeIterator`, `Option`, `Some`, `None`, `Result`, `Ok`, `Err`, `String`, `ToString`, `Vec`), NameBuiltin, nil}, + {Words(``, `!`, `asm`, `assert`, `assert_eq`, `assert_ne`, `cfg`, `column`, `compile_error`, `concat`, `concat_idents`, `dbg`, `debug_assert`, `debug_assert_eq`, `debug_assert_ne`, `env`, `eprint`, `eprintln`, `file`, `format`, `format_args`, `format_args_nl`, `global_asm`, `include`, `include_bytes`, `include_str`, `is_aarch64_feature_detected`, `is_arm_feature_detected`, `is_mips64_feature_detected`, `is_mips_feature_detected`, `is_powerpc64_feature_detected`, `is_powerpc_feature_detected`, `is_x86_feature_detected`, `line`, `llvm_asm`, `log_syntax`, `macro_rules`, `matches`, `module_path`, `option_env`, `panic`, `print`, `println`, `stringify`, `thread_local`, `todo`, `trace_macros`, `unimplemented`, `unreachable`, `vec`, `write`, `writeln`), NameFunctionMagic, nil}, + {`::\b`, Text, nil}, + {`(?::|->)`, Text, Push("typename")}, + {`(break|continue)(\b\s*)(\'[A-Za-z_]\w*)?`, ByGroups(Keyword, TextWhitespace, NameLabel), nil}, + {`'(\\['"\\nrt]|\\x[0-7][0-9a-fA-F]|\\0|\\u\{[0-9a-fA-F]{1,6}\}|.)'`, LiteralStringChar, nil}, + {`b'(\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\0|\\u\{[0-9a-fA-F]{1,6}\}|.)'`, LiteralStringChar, nil}, + {`0b[01_]+`, LiteralNumberBin, Push("number_lit")}, + {`0o[0-7_]+`, LiteralNumberOct, Push("number_lit")}, + {`0[xX][0-9a-fA-F_]+`, LiteralNumberHex, Push("number_lit")}, + {`[0-9][0-9_]*(\.[0-9_]+[eE][+\-]?[0-9_]+|\.[0-9_]*(?!\.)|[eE][+\-]?[0-9_]+)`, LiteralNumberFloat, Push("number_lit")}, + {`[0-9][0-9_]*`, LiteralNumberInteger, Push("number_lit")}, + {`b"`, LiteralString, Push("bytestring")}, + {`(?s)b?r(#*)".*?"\1`, LiteralString, nil}, + {`'`, Operator, Push("lifetime")}, + {`\.\.=?`, Operator, nil}, + {`[{}()\[\],.;]`, Punctuation, nil}, + {`[+\-*/%&|<>^!~@=:?]`, Operator, nil}, + {`(r#)?[a-zA-Z_]\w*`, Name, nil}, + {`r#[a-zA-Z_]\w*`, Name, nil}, + {`#!?\[`, CommentPreproc, Push("attribute[")}, + {`#`, Text, nil}, + }, + "comment": { + {`[^*/]+`, CommentMultiline, nil}, + {`/\*`, CommentMultiline, Push()}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[*/]`, CommentMultiline, nil}, + }, + "doccomment": { + {`[^*/]+`, LiteralStringDoc, nil}, + {`/\*`, LiteralStringDoc, Push()}, + {`\*/`, LiteralStringDoc, Pop(1)}, + {`[*/]`, LiteralStringDoc, nil}, + }, + "modname": { + {`\s+`, Text, nil}, + {`[a-zA-Z_]\w*`, NameNamespace, Pop(1)}, + Default(Pop(1)), + }, + "funcname": { + {`\s+`, Text, nil}, + {`[a-zA-Z_]\w*`, NameFunction, Pop(1)}, + Default(Pop(1)), + }, + "typename": { + {`\s+`, Text, nil}, + {`&`, KeywordPseudo, nil}, + {`'`, Operator, Push("lifetime")}, + {Words(``, `\b`, `Copy`, `Send`, `Sized`, `Sync`, `Unpin`, `Drop`, `Fn`, `FnMut`, `FnOnce`, `drop`, `Box`, `ToOwned`, `Clone`, `PartialEq`, `PartialOrd`, `Eq`, `Ord`, `AsRef`, `AsMut`, `Into`, `From`, `Default`, `Iterator`, `Extend`, `IntoIterator`, `DoubleEndedIterator`, `ExactSizeIterator`, `Option`, `Some`, `None`, `Result`, `Ok`, `Err`, `String`, `ToString`, `Vec`), NameBuiltin, nil}, + {Words(``, `\b`, `u8`, `u16`, `u32`, `u64`, `u128`, `i8`, `i16`, `i32`, `i64`, `i128`, `usize`, `isize`, `f32`, `f64`, `char`, `str`, `bool`), KeywordType, nil}, + {`[a-zA-Z_]\w*`, NameClass, Pop(1)}, + Default(Pop(1)), + }, + "lifetime": { + {`(static|_)`, NameBuiltin, nil}, + {`[a-zA-Z_]+\w*`, NameAttribute, nil}, + Default(Pop(1)), + }, + "number_lit": { + {`[ui](8|16|32|64|size)`, Keyword, Pop(1)}, + {`f(32|64)`, Keyword, Pop(1)}, + Default(Pop(1)), + }, + "string": { + {`"`, LiteralString, Pop(1)}, + {`\\['"\\nrt]|\\x[0-7][0-9a-fA-F]|\\0|\\u\{[0-9a-fA-F]{1,6}\}`, LiteralStringEscape, nil}, + {`[^\\"]+`, LiteralString, nil}, + {`\\`, LiteralString, nil}, + }, + "bytestring": { + {`\\x[89a-fA-F][0-9a-fA-F]`, LiteralStringEscape, nil}, + Include("string"), + }, + "attribute_common": { + {`"`, LiteralString, Push("string")}, + {`\[`, CommentPreproc, Push("attribute[")}, + }, + "attribute[": { + Include("attribute_common"), + {`\]`, CommentPreproc, Pop(1)}, + {`[^"\]\[]+`, CommentPreproc, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/sas.go b/vendor/github.com/alecthomas/chroma/lexers/s/sas.go new file mode 100644 index 0000000..016a91b --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/sas.go @@ -0,0 +1,98 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Sas lexer. +var Sas = internal.Register(MustNewLazyLexer( + &Config{ + Name: "SAS", + Aliases: []string{"sas"}, + Filenames: []string{"*.SAS", "*.sas"}, + MimeTypes: []string{"text/x-sas", "text/sas", "application/x-sas"}, + CaseInsensitive: true, + }, + sasRules, +)) + +func sasRules() Rules { + return Rules{ + "root": { + Include("comments"), + Include("proc-data"), + Include("cards-datalines"), + Include("logs"), + Include("general"), + {`.`, Text, nil}, + {`\\\n`, Text, nil}, + {`\n`, Text, nil}, + }, + "comments": { + {`^\s*\*.*?;`, Comment, nil}, + {`/\*.*?\*/`, Comment, nil}, + {`^\s*\*(.|\n)*?;`, CommentMultiline, nil}, + {`/[*](.|\n)*?[*]/`, CommentMultiline, nil}, + }, + "proc-data": { + {`(^|;)\s*(proc \w+|data|run|quit)[\s;]`, KeywordReserved, nil}, + }, + "cards-datalines": { + {`^\s*(datalines|cards)\s*;\s*$`, Keyword, Push("data")}, + }, + "data": { + {`(.|\n)*^\s*;\s*$`, Other, Pop(1)}, + }, + "logs": { + {`\n?^\s*%?put `, Keyword, Push("log-messages")}, + }, + "log-messages": { + {`NOTE(:|-).*`, Generic, Pop(1)}, + {`WARNING(:|-).*`, GenericEmph, Pop(1)}, + {`ERROR(:|-).*`, GenericError, Pop(1)}, + Include("general"), + }, + "general": { + Include("keywords"), + Include("vars-strings"), + Include("special"), + Include("numbers"), + }, + "keywords": { + {Words(`\b`, `\b`, `abort`, `array`, `attrib`, `by`, `call`, `cards`, `cards4`, `catname`, `continue`, `datalines`, `datalines4`, `delete`, `delim`, `delimiter`, `display`, `dm`, `drop`, `endsas`, `error`, `file`, `filename`, `footnote`, `format`, `goto`, `in`, `infile`, `informat`, `input`, `keep`, `label`, `leave`, `length`, `libname`, `link`, `list`, `lostcard`, `merge`, `missing`, `modify`, `options`, `output`, `out`, `page`, `put`, `redirect`, `remove`, `rename`, `replace`, `retain`, `return`, `select`, `set`, `skip`, `startsas`, `stop`, `title`, `update`, `waitsas`, `where`, `window`, `x`, `systask`), Keyword, nil}, + {Words(`\b`, `\b`, `add`, `and`, `alter`, `as`, `cascade`, `check`, `create`, `delete`, `describe`, `distinct`, `drop`, `foreign`, `from`, `group`, `having`, `index`, `insert`, `into`, `in`, `key`, `like`, `message`, `modify`, `msgtype`, `not`, `null`, `on`, `or`, `order`, `primary`, `references`, `reset`, `restrict`, `select`, `set`, `table`, `unique`, `update`, `validate`, `view`, `where`), Keyword, nil}, + {Words(`\b`, `\b`, `do`, `if`, `then`, `else`, `end`, `until`, `while`), Keyword, nil}, + {Words(`%`, `\b`, `bquote`, `nrbquote`, `cmpres`, `qcmpres`, `compstor`, `datatyp`, `display`, `do`, `else`, `end`, `eval`, `global`, `goto`, `if`, `index`, `input`, `keydef`, `label`, `left`, `length`, `let`, `local`, `lowcase`, `macro`, `mend`, `nrquote`, `nrstr`, `put`, `qleft`, `qlowcase`, `qscan`, `qsubstr`, `qsysfunc`, `qtrim`, `quote`, `qupcase`, `scan`, `str`, `substr`, `superq`, `syscall`, `sysevalf`, `sysexec`, `sysfunc`, `sysget`, `syslput`, `sysprod`, `sysrc`, `sysrput`, `then`, `to`, `trim`, `unquote`, `until`, `upcase`, `verify`, `while`, `window`), NameBuiltin, nil}, + {Words(`\b`, `\(`, `abs`, `addr`, `airy`, `arcos`, `arsin`, `atan`, `attrc`, `attrn`, `band`, `betainv`, `blshift`, `bnot`, `bor`, `brshift`, `bxor`, `byte`, `cdf`, `ceil`, `cexist`, `cinv`, `close`, `cnonct`, `collate`, `compbl`, `compound`, `compress`, `cos`, `cosh`, `css`, `curobs`, `cv`, `daccdb`, `daccdbsl`, `daccsl`, `daccsyd`, `dacctab`, `dairy`, `date`, `datejul`, `datepart`, `datetime`, `day`, `dclose`, `depdb`, `depdbsl`, `depsl`, `depsyd`, `deptab`, `dequote`, `dhms`, `dif`, `digamma`, `dim`, `dinfo`, `dnum`, `dopen`, `doptname`, `doptnum`, `dread`, `dropnote`, `dsname`, `erf`, `erfc`, `exist`, `exp`, `fappend`, `fclose`, `fcol`, `fdelete`, `fetch`, `fetchobs`, `fexist`, `fget`, `fileexist`, `filename`, `fileref`, `finfo`, `finv`, `fipname`, `fipnamel`, `fipstate`, `floor`, `fnonct`, `fnote`, `fopen`, `foptname`, `foptnum`, `fpoint`, `fpos`, `fput`, `fread`, `frewind`, `frlen`, `fsep`, `fuzz`, `fwrite`, `gaminv`, `gamma`, `getoption`, `getvarc`, `getvarn`, `hbound`, `hms`, `hosthelp`, `hour`, `ibessel`, `index`, `indexc`, `indexw`, `input`, `inputc`, `inputn`, `int`, `intck`, `intnx`, `intrr`, `irr`, `jbessel`, `juldate`, `kurtosis`, `lag`, `lbound`, `left`, `length`, `lgamma`, `libname`, `libref`, `log`, `log10`, `log2`, `logpdf`, `logpmf`, `logsdf`, `lowcase`, `max`, `mdy`, `mean`, `min`, `minute`, `mod`, `month`, `mopen`, `mort`, `n`, `netpv`, `nmiss`, `normal`, `note`, `npv`, `open`, `ordinal`, `pathname`, `pdf`, `peek`, `peekc`, `pmf`, `point`, `poisson`, `poke`, `probbeta`, `probbnml`, `probchi`, `probf`, `probgam`, `probhypr`, `probit`, `probnegb`, `probnorm`, `probt`, `put`, `putc`, `putn`, `qtr`, `quote`, `ranbin`, `rancau`, `ranexp`, `rangam`, `range`, `rank`, `rannor`, `ranpoi`, `rantbl`, `rantri`, `ranuni`, `repeat`, `resolve`, `reverse`, `rewind`, `right`, `round`, `saving`, `scan`, `sdf`, `second`, `sign`, `sin`, `sinh`, `skewness`, `soundex`, `spedis`, `sqrt`, `std`, `stderr`, `stfips`, `stname`, `stnamel`, `substr`, `sum`, `symget`, `sysget`, `sysmsg`, `sysprod`, `sysrc`, `system`, `tan`, `tanh`, `time`, `timepart`, `tinv`, `tnonct`, `today`, `translate`, `tranwrd`, `trigamma`, `trim`, `trimn`, `trunc`, `uniform`, `upcase`, `uss`, `var`, `varfmt`, `varinfmt`, `varlabel`, `varlen`, `varname`, `varnum`, `varray`, `varrayx`, `vartype`, `verify`, `vformat`, `vformatd`, `vformatdx`, `vformatn`, `vformatnx`, `vformatw`, `vformatwx`, `vformatx`, `vinarray`, `vinarrayx`, `vinformat`, `vinformatd`, `vinformatdx`, `vinformatn`, `vinformatnx`, `vinformatw`, `vinformatwx`, `vinformatx`, `vlabel`, `vlabelx`, `vlength`, `vlengthx`, `vname`, `vnamex`, `vtype`, `vtypex`, `weekday`, `year`, `yyq`, `zipfips`, `zipname`, `zipnamel`, `zipstate`), NameBuiltin, nil}, + }, + "vars-strings": { + {`&[a-z_]\w{0,31}\.?`, NameVariable, nil}, + {`%[a-z_]\w{0,31}`, NameFunction, nil}, + {`\'`, LiteralString, Push("string_squote")}, + {`"`, LiteralString, Push("string_dquote")}, + }, + "string_squote": { + {`'`, LiteralString, Pop(1)}, + {`\\\\|\\"|\\\n`, LiteralStringEscape, nil}, + {`[^$\'\\]+`, LiteralString, nil}, + {`[$\'\\]`, LiteralString, nil}, + }, + "string_dquote": { + {`"`, LiteralString, Pop(1)}, + {`\\\\|\\"|\\\n`, LiteralStringEscape, nil}, + {`&`, NameVariable, Push("validvar")}, + {`[^$&"\\]+`, LiteralString, nil}, + {`[$"\\]`, LiteralString, nil}, + }, + "validvar": { + {`[a-z_]\w{0,31}\.?`, NameVariable, Pop(1)}, + }, + "numbers": { + {`\b[+-]?([0-9]+(\.[0-9]+)?|\.[0-9]+|\.)(E[+-]?[0-9]+)?i?\b`, LiteralNumber, nil}, + }, + "special": { + {`(null|missing|_all_|_automatic_|_character_|_n_|_infile_|_name_|_null_|_numeric_|_user_|_webout_)`, KeywordConstant, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/sass.go b/vendor/github.com/alecthomas/chroma/lexers/s/sass.go new file mode 100644 index 0000000..1b73377 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/sass.go @@ -0,0 +1,148 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Sass lexer. +var Sass = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Sass", + Aliases: []string{"sass"}, + Filenames: []string{"*.sass"}, + MimeTypes: []string{"text/x-sass"}, + CaseInsensitive: true, + }, + sassRules, +)) + +func sassRules() Rules { + return Rules{ + // "root": { + // }, + "root": { + {`[ \t]*\n`, Text, nil}, + // { `[ \t]*`, ?? ??, nil }, + // { `//[^\n]*`, ?? .callback at 0x106936048> ??, Push("root") }, + // { `/\*[^\n]*`, ?? .callback at 0x1069360d0> ??, Push("root") }, + {`@import`, Keyword, Push("import")}, + {`@for`, Keyword, Push("for")}, + {`@(debug|warn|if|while)`, Keyword, Push("value")}, + {`(@mixin)( [\w-]+)`, ByGroups(Keyword, NameFunction), Push("value")}, + {`(@include)( [\w-]+)`, ByGroups(Keyword, NameDecorator), Push("value")}, + {`@extend`, Keyword, Push("selector")}, + {`@[\w-]+`, Keyword, Push("selector")}, + {`=[\w-]+`, NameFunction, Push("value")}, + {`\+[\w-]+`, NameDecorator, Push("value")}, + {`([!$][\w-]\w*)([ \t]*(?:(?:\|\|)?=|:))`, ByGroups(NameVariable, Operator), Push("value")}, + {`:`, NameAttribute, Push("old-style-attr")}, + {`(?=.+?[=:]([^a-z]|$))`, NameAttribute, Push("new-style-attr")}, + Default(Push("selector")), + }, + "single-comment": { + {`.+`, CommentSingle, nil}, + {`\n`, Text, Push("root")}, + }, + "multi-comment": { + {`.+`, CommentMultiline, nil}, + {`\n`, Text, Push("root")}, + }, + "import": { + {`[ \t]+`, Text, nil}, + {`\S+`, LiteralString, nil}, + {`\n`, Text, Push("root")}, + }, + "old-style-attr": { + {`[^\s:="\[]+`, NameAttribute, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`[ \t]*=`, Operator, Push("value")}, + Default(Push("value")), + }, + "new-style-attr": { + {`[^\s:="\[]+`, NameAttribute, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`[ \t]*[=:]`, Operator, Push("value")}, + }, + "inline-comment": { + {`(\\#|#(?=[^\n{])|\*(?=[^\n/])|[^\n#*])+`, CommentMultiline, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`\*/`, Comment, Pop(1)}, + }, + "value": { + {`[ \t]+`, Text, nil}, + {`[!$][\w-]+`, NameVariable, nil}, + {`url\(`, LiteralStringOther, Push("string-url")}, + {`[a-z_-][\w-]*(?=\()`, NameFunction, nil}, + {Words(``, `\b`, `align-content`, `align-items`, `align-self`, `alignment-baseline`, `all`, `animation`, `animation-delay`, `animation-direction`, `animation-duration`, `animation-fill-mode`, `animation-iteration-count`, `animation-name`, `animation-play-state`, `animation-timing-function`, `appearance`, `azimuth`, `backface-visibility`, `background`, `background-attachment`, `background-blend-mode`, `background-clip`, `background-color`, `background-image`, `background-origin`, `background-position`, `background-repeat`, `background-size`, `baseline-shift`, `bookmark-label`, `bookmark-level`, `bookmark-state`, `border`, `border-bottom`, `border-bottom-color`, `border-bottom-left-radius`, `border-bottom-right-radius`, `border-bottom-style`, `border-bottom-width`, `border-boundary`, `border-collapse`, `border-color`, `border-image`, `border-image-outset`, `border-image-repeat`, `border-image-slice`, `border-image-source`, `border-image-width`, `border-left`, `border-left-color`, `border-left-style`, `border-left-width`, `border-radius`, `border-right`, `border-right-color`, `border-right-style`, `border-right-width`, `border-spacing`, `border-style`, `border-top`, `border-top-color`, `border-top-left-radius`, `border-top-right-radius`, `border-top-style`, `border-top-width`, `border-width`, `bottom`, `box-decoration-break`, `box-shadow`, `box-sizing`, `box-snap`, `box-suppress`, `break-after`, `break-before`, `break-inside`, `caption-side`, `caret`, `caret-animation`, `caret-color`, `caret-shape`, `chains`, `clear`, `clip`, `clip-path`, `clip-rule`, `color`, `color-interpolation-filters`, `column-count`, `column-fill`, `column-gap`, `column-rule`, `column-rule-color`, `column-rule-style`, `column-rule-width`, `column-span`, `column-width`, `columns`, `content`, `counter-increment`, `counter-reset`, `counter-set`, `crop`, `cue`, `cue-after`, `cue-before`, `cursor`, `direction`, `display`, `dominant-baseline`, `elevation`, `empty-cells`, `filter`, `flex`, `flex-basis`, `flex-direction`, `flex-flow`, `flex-grow`, `flex-shrink`, `flex-wrap`, `float`, `float-defer`, `float-offset`, `float-reference`, `flood-color`, `flood-opacity`, `flow`, `flow-from`, `flow-into`, `font`, `font-family`, `font-feature-settings`, `font-kerning`, `font-language-override`, `font-size`, `font-size-adjust`, `font-stretch`, `font-style`, `font-synthesis`, `font-variant`, `font-variant-alternates`, `font-variant-caps`, `font-variant-east-asian`, `font-variant-ligatures`, `font-variant-numeric`, `font-variant-position`, `font-weight`, `footnote-display`, `footnote-policy`, `glyph-orientation-vertical`, `grid`, `grid-area`, `grid-auto-columns`, `grid-auto-flow`, `grid-auto-rows`, `grid-column`, `grid-column-end`, `grid-column-gap`, `grid-column-start`, `grid-gap`, `grid-row`, `grid-row-end`, `grid-row-gap`, `grid-row-start`, `grid-template`, `grid-template-areas`, `grid-template-columns`, `grid-template-rows`, `hanging-punctuation`, `height`, `hyphenate-character`, `hyphenate-limit-chars`, `hyphenate-limit-last`, `hyphenate-limit-lines`, `hyphenate-limit-zone`, `hyphens`, `image-orientation`, `image-resolution`, `initial-letter`, `initial-letter-align`, `initial-letter-wrap`, `isolation`, `justify-content`, `justify-items`, `justify-self`, `left`, `letter-spacing`, `lighting-color`, `line-break`, `line-grid`, `line-height`, `line-snap`, `list-style`, `list-style-image`, `list-style-position`, `list-style-type`, `margin`, `margin-bottom`, `margin-left`, `margin-right`, `margin-top`, `marker-side`, `marquee-direction`, `marquee-loop`, `marquee-speed`, `marquee-style`, `mask`, `mask-border`, `mask-border-mode`, `mask-border-outset`, `mask-border-repeat`, `mask-border-slice`, `mask-border-source`, `mask-border-width`, `mask-clip`, `mask-composite`, `mask-image`, `mask-mode`, `mask-origin`, `mask-position`, `mask-repeat`, `mask-size`, `mask-type`, `max-height`, `max-lines`, `max-width`, `min-height`, `min-width`, `mix-blend-mode`, `motion`, `motion-offset`, `motion-path`, `motion-rotation`, `move-to`, `nav-down`, `nav-left`, `nav-right`, `nav-up`, `object-fit`, `object-position`, `offset-after`, `offset-before`, `offset-end`, `offset-start`, `opacity`, `order`, `orphans`, `outline`, `outline-color`, `outline-offset`, `outline-style`, `outline-width`, `overflow`, `overflow-style`, `overflow-wrap`, `overflow-x`, `overflow-y`, `padding`, `padding-bottom`, `padding-left`, `padding-right`, `padding-top`, `page`, `page-break-after`, `page-break-before`, `page-break-inside`, `page-policy`, `pause`, `pause-after`, `pause-before`, `perspective`, `perspective-origin`, `pitch`, `pitch-range`, `play-during`, `polar-angle`, `polar-distance`, `position`, `presentation-level`, `quotes`, `region-fragment`, `resize`, `rest`, `rest-after`, `rest-before`, `richness`, `right`, `rotation`, `rotation-point`, `ruby-align`, `ruby-merge`, `ruby-position`, `running`, `scroll-snap-coordinate`, `scroll-snap-destination`, `scroll-snap-points-x`, `scroll-snap-points-y`, `scroll-snap-type`, `shape-image-threshold`, `shape-inside`, `shape-margin`, `shape-outside`, `size`, `speak`, `speak-as`, `speak-header`, `speak-numeral`, `speak-punctuation`, `speech-rate`, `stress`, `string-set`, `tab-size`, `table-layout`, `text-align`, `text-align-last`, `text-combine-upright`, `text-decoration`, `text-decoration-color`, `text-decoration-line`, `text-decoration-skip`, `text-decoration-style`, `text-emphasis`, `text-emphasis-color`, `text-emphasis-position`, `text-emphasis-style`, `text-indent`, `text-justify`, `text-orientation`, `text-overflow`, `text-shadow`, `text-space-collapse`, `text-space-trim`, `text-spacing`, `text-transform`, `text-underline-position`, `text-wrap`, `top`, `transform`, `transform-origin`, `transform-style`, `transition`, `transition-delay`, `transition-duration`, `transition-property`, `transition-timing-function`, `unicode-bidi`, `user-select`, `vertical-align`, `visibility`, `voice-balance`, `voice-duration`, `voice-family`, `voice-pitch`, `voice-range`, `voice-rate`, `voice-stress`, `voice-volume`, `volume`, `white-space`, `widows`, `width`, `will-change`, `word-break`, `word-spacing`, `word-wrap`, `wrap-after`, `wrap-before`, `wrap-flow`, `wrap-inside`, `wrap-through`, `writing-mode`, `z-index`, `above`, `absolute`, `always`, `armenian`, `aural`, `auto`, `avoid`, `baseline`, `behind`, `below`, `bidi-override`, `blink`, `block`, `bold`, `bolder`, `both`, `capitalize`, `center-left`, `center-right`, `center`, `circle`, `cjk-ideographic`, `close-quote`, `collapse`, `condensed`, `continuous`, `crop`, `crosshair`, `cross`, `cursive`, `dashed`, `decimal-leading-zero`, `decimal`, `default`, `digits`, `disc`, `dotted`, `double`, `e-resize`, `embed`, `extra-condensed`, `extra-expanded`, `expanded`, `fantasy`, `far-left`, `far-right`, `faster`, `fast`, `fixed`, `georgian`, `groove`, `hebrew`, `help`, `hidden`, `hide`, `higher`, `high`, `hiragana-iroha`, `hiragana`, `icon`, `inherit`, `inline-table`, `inline`, `inset`, `inside`, `invert`, `italic`, `justify`, `katakana-iroha`, `katakana`, `landscape`, `larger`, `large`, `left-side`, `leftwards`, `level`, `lighter`, `line-through`, `list-item`, `loud`, `lower-alpha`, `lower-greek`, `lower-roman`, `lowercase`, `ltr`, `lower`, `low`, `medium`, `message-box`, `middle`, `mix`, `monospace`, `n-resize`, `narrower`, `ne-resize`, `no-close-quote`, `no-open-quote`, `no-repeat`, `none`, `normal`, `nowrap`, `nw-resize`, `oblique`, `once`, `open-quote`, `outset`, `outside`, `overline`, `pointer`, `portrait`, `px`, `relative`, `repeat-x`, `repeat-y`, `repeat`, `rgb`, `ridge`, `right-side`, `rightwards`, `s-resize`, `sans-serif`, `scroll`, `se-resize`, `semi-condensed`, `semi-expanded`, `separate`, `serif`, `show`, `silent`, `slow`, `slower`, `small-caps`, `small-caption`, `smaller`, `soft`, `solid`, `spell-out`, `square`, `static`, `status-bar`, `super`, `sw-resize`, `table-caption`, `table-cell`, `table-column`, `table-column-group`, `table-footer-group`, `table-header-group`, `table-row`, `table-row-group`, `text`, `text-bottom`, `text-top`, `thick`, `thin`, `transparent`, `ultra-condensed`, `ultra-expanded`, `underline`, `upper-alpha`, `upper-latin`, `upper-roman`, `uppercase`, `url`, `visible`, `w-resize`, `wait`, `wider`, `x-fast`, `x-high`, `x-large`, `x-loud`, `x-low`, `x-small`, `x-soft`, `xx-large`, `xx-small`, `yes`), NameConstant, nil}, + {Words(``, `\b`, `aliceblue`, `antiquewhite`, `aqua`, `aquamarine`, `azure`, `beige`, `bisque`, `black`, `blanchedalmond`, `blue`, `blueviolet`, `brown`, `burlywood`, `cadetblue`, `chartreuse`, `chocolate`, `coral`, `cornflowerblue`, `cornsilk`, `crimson`, `cyan`, `darkblue`, `darkcyan`, `darkgoldenrod`, `darkgray`, `darkgreen`, `darkgrey`, `darkkhaki`, `darkmagenta`, `darkolivegreen`, `darkorange`, `darkorchid`, `darkred`, `darksalmon`, `darkseagreen`, `darkslateblue`, `darkslategray`, `darkslategrey`, `darkturquoise`, `darkviolet`, `deeppink`, `deepskyblue`, `dimgray`, `dimgrey`, `dodgerblue`, `firebrick`, `floralwhite`, `forestgreen`, `fuchsia`, `gainsboro`, `ghostwhite`, `gold`, `goldenrod`, `gray`, `green`, `greenyellow`, `grey`, `honeydew`, `hotpink`, `indianred`, `indigo`, `ivory`, `khaki`, `lavender`, `lavenderblush`, `lawngreen`, `lemonchiffon`, `lightblue`, `lightcoral`, `lightcyan`, `lightgoldenrodyellow`, `lightgray`, `lightgreen`, `lightgrey`, `lightpink`, `lightsalmon`, `lightseagreen`, `lightskyblue`, `lightslategray`, `lightslategrey`, `lightsteelblue`, `lightyellow`, `lime`, `limegreen`, `linen`, `magenta`, `maroon`, `mediumaquamarine`, `mediumblue`, `mediumorchid`, `mediumpurple`, `mediumseagreen`, `mediumslateblue`, `mediumspringgreen`, `mediumturquoise`, `mediumvioletred`, `midnightblue`, `mintcream`, `mistyrose`, `moccasin`, `navajowhite`, `navy`, `oldlace`, `olive`, `olivedrab`, `orange`, `orangered`, `orchid`, `palegoldenrod`, `palegreen`, `paleturquoise`, `palevioletred`, `papayawhip`, `peachpuff`, `peru`, `pink`, `plum`, `powderblue`, `purple`, `rebeccapurple`, `red`, `rosybrown`, `royalblue`, `saddlebrown`, `salmon`, `sandybrown`, `seagreen`, `seashell`, `sienna`, `silver`, `skyblue`, `slateblue`, `slategray`, `slategrey`, `snow`, `springgreen`, `steelblue`, `tan`, `teal`, `thistle`, `tomato`, `turquoise`, `violet`, `wheat`, `white`, `whitesmoke`, `yellow`, `yellowgreen`, `transparent`), NameEntity, nil}, + {Words(``, `\b`, `black`, `silver`, `gray`, `white`, `maroon`, `red`, `purple`, `fuchsia`, `green`, `lime`, `olive`, `yellow`, `navy`, `blue`, `teal`, `aqua`), NameBuiltin, nil}, + {`\!(important|default)`, NameException, nil}, + {`(true|false)`, NamePseudo, nil}, + {`(and|or|not)`, OperatorWord, nil}, + {`/\*`, CommentMultiline, Push("inline-comment")}, + {`//[^\n]*`, CommentSingle, nil}, + {`\#[a-z0-9]{1,6}`, LiteralNumberHex, nil}, + {`(-?\d+)(\%|[a-z]+)?`, ByGroups(LiteralNumberInteger, KeywordType), nil}, + {`(-?\d*\.\d+)(\%|[a-z]+)?`, ByGroups(LiteralNumberFloat, KeywordType), nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`[~^*!&%<>|+=@:,./?-]+`, Operator, nil}, + {`[\[\]()]+`, Punctuation, nil}, + {`"`, LiteralStringDouble, Push("string-double")}, + {`'`, LiteralStringSingle, Push("string-single")}, + {`[a-z_-][\w-]*`, Name, nil}, + {`\n`, Text, Push("root")}, + }, + "interpolation": { + {`\}`, LiteralStringInterpol, Pop(1)}, + Include("value"), + }, + "selector": { + {`[ \t]+`, Text, nil}, + {`\:`, NameDecorator, Push("pseudo-class")}, + {`\.`, NameClass, Push("class")}, + {`\#`, NameNamespace, Push("id")}, + {`[\w-]+`, NameTag, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`&`, Keyword, nil}, + {`[~^*!&\[\]()<>|+=@:;,./?-]`, Operator, nil}, + {`"`, LiteralStringDouble, Push("string-double")}, + {`'`, LiteralStringSingle, Push("string-single")}, + {`\n`, Text, Push("root")}, + }, + "string-double": { + {`(\\.|#(?=[^\n{])|[^\n"#])+`, LiteralStringDouble, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + "string-single": { + {`(\\.|#(?=[^\n{])|[^\n'#])+`, LiteralStringSingle, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`'`, LiteralStringSingle, Pop(1)}, + }, + "string-url": { + {`(\\#|#(?=[^\n{])|[^\n#)])+`, LiteralStringOther, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`\)`, LiteralStringOther, Pop(1)}, + }, + "pseudo-class": { + {`[\w-]+`, NameDecorator, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + Default(Pop(1)), + }, + "class": { + {`[\w-]+`, NameClass, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + Default(Pop(1)), + }, + "id": { + {`[\w-]+`, NameNamespace, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + Default(Pop(1)), + }, + "for": { + {`(from|to|through)`, OperatorWord, nil}, + Include("value"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/scala.go b/vendor/github.com/alecthomas/chroma/lexers/s/scala.go new file mode 100644 index 0000000..6798c0c --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/scala.go @@ -0,0 +1,116 @@ +package s + +import ( + "fmt" + + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Scala lexer. +var Scala = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Scala", + Aliases: []string{"scala"}, + Filenames: []string{"*.scala"}, + MimeTypes: []string{"text/x-scala"}, + DotAll: true, + }, + scalaRules, +)) + +func scalaRules() Rules { + var ( + scalaOp = "[-~\\^\\*!%&\\\\<>\\|+=:/?@\xa6-\xa7\xa9\xac\xae\xb0-\xb1\xb6\xd7\xf7\u03f6\u0482\u0606-\u0608\u060e-\u060f\u06e9\u06fd-\u06fe\u07f6\u09fa\u0b70\u0bf3-\u0bf8\u0bfa\u0c7f\u0cf1-\u0cf2\u0d79\u0f01-\u0f03\u0f13-\u0f17\u0f1a-\u0f1f\u0f34\u0f36\u0f38\u0fbe-\u0fc5\u0fc7-\u0fcf\u109e-\u109f\u1360\u1390-\u1399\u1940\u19e0-\u19ff\u1b61-\u1b6a\u1b74-\u1b7c\u2044\u2052\u207a-\u207c\u208a-\u208c\u2100-\u2101\u2103-\u2106\u2108-\u2109\u2114\u2116-\u2118\u211e-\u2123\u2125\u2127\u2129\u212e\u213a-\u213b\u2140-\u2144\u214a-\u214d\u214f\u2190-\u2328\u232b-\u244a\u249c-\u24e9\u2500-\u2767\u2794-\u27c4\u27c7-\u27e5\u27f0-\u2982\u2999-\u29d7\u29dc-\u29fb\u29fe-\u2b54\u2ce5-\u2cea\u2e80-\u2ffb\u3004\u3012-\u3013\u3020\u3036-\u3037\u303e-\u303f\u3190-\u3191\u3196-\u319f\u31c0-\u31e3\u3200-\u321e\u322a-\u3250\u3260-\u327f\u328a-\u32b0\u32c0-\u33ff\u4dc0-\u4dff\ua490-\ua4c6\ua828-\ua82b\ufb29\ufdfd\ufe62\ufe64-\ufe66\uff0b\uff1c-\uff1e\uff5c\uff5e\uffe2\uffe4\uffe8-\uffee\ufffc-\ufffd]+" + scalaUpper = `[\\$_\p{Lu}]` + scalaLetter = `[\\$_\p{L}]` + scalaIDRest = fmt.Sprintf(`%s(?:%s|[0-9])*(?:(?<=_)%s)?`, scalaLetter, scalaLetter, scalaOp) + ) + + return Rules{ + "root": { + {`(class|trait|object)(\s+)`, ByGroups(Keyword, Text), Push("class")}, + {`[^\S\n]+`, Text, nil}, + {`//.*?\n`, CommentSingle, nil}, + {`/\*`, CommentMultiline, Push("comment")}, + {`@` + scalaIDRest, NameDecorator, nil}, + {`(abstract|ca(?:se|tch)|d(?:ef|o)|e(?:lse|xtends)|f(?:inal(?:ly)?|or(?:Some)?)|i(?:f|mplicit)|lazy|match|new|override|pr(?:ivate|otected)|re(?:quires|turn)|s(?:ealed|uper)|t(?:h(?:is|row)|ry)|va[lr]|w(?:hile|ith)|yield)\b|(<[%:-]|=>|>:|[#=@_⇒←])(\b|(?=\s)|$)`, Keyword, nil}, + {`:(?!` + scalaOp + `%s)`, Keyword, Push("type")}, + {fmt.Sprintf("%s%s\\b", scalaUpper, scalaIDRest), NameClass, nil}, + {`(true|false|null)\b`, KeywordConstant, nil}, + {`(import|package)(\s+)`, ByGroups(Keyword, Text), Push("import")}, + {`(type)(\s+)`, ByGroups(Keyword, Text), Push("type")}, + {`""".*?"""(?!")`, LiteralString, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'`, LiteralStringChar, nil}, + {"'" + scalaIDRest, TextSymbol, nil}, + {`[fs]"""`, LiteralString, Push("interptriplestring")}, + {`[fs]"`, LiteralString, Push("interpstring")}, + {`raw"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {scalaIDRest, Name, nil}, + {"`[^`]+`", Name, nil}, + {`\[`, Operator, Push("typeparam")}, + {`[(){};,.#]`, Operator, nil}, + {scalaOp, Operator, nil}, + {`([0-9][0-9]*\.[0-9]*|\.[0-9]+)([eE][+-]?[0-9]+)?[fFdD]?`, LiteralNumberFloat, nil}, + {`0x[0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`[0-9]+L?`, LiteralNumberInteger, nil}, + {`\n`, Text, nil}, + }, + "class": { + {fmt.Sprintf("(%s|%s|`[^`]+`)(\\s*)(\\[)", scalaIDRest, scalaOp), ByGroups(NameClass, Text, Operator), Push("typeparam")}, + {`\s+`, Text, nil}, + {`\{`, Operator, Pop(1)}, + {`\(`, Operator, Pop(1)}, + {`//.*?\n`, CommentSingle, Pop(1)}, + {fmt.Sprintf("%s|%s|`[^`]+`", scalaIDRest, scalaOp), NameClass, Pop(1)}, + }, + "type": { + {`\s+`, Text, nil}, + {`<[%:]|>:|[#_]|forSome|type`, Keyword, nil}, + {`([,);}]|=>|=|⇒)(\s*)`, ByGroups(Operator, Text), Pop(1)}, + {`[({]`, Operator, Push()}, + {fmt.Sprintf("((?:%s|%s|`[^`]+`)(?:\\.(?:%s|%s|`[^`]+`))*)(\\s*)(\\[)", scalaIDRest, scalaOp, scalaIDRest, scalaOp), ByGroups(KeywordType, Text, Operator), Push("#pop", "typeparam")}, + {fmt.Sprintf("((?:%s|%s|`[^`]+`)(?:\\.(?:%s|%s|`[^`]+`))*)(\\s*)$", scalaIDRest, scalaOp, scalaIDRest, scalaOp), ByGroups(KeywordType, Text), Pop(1)}, + {`//.*?\n`, CommentSingle, Pop(1)}, + {fmt.Sprintf("\\.|%s|%s|`[^`]+`", scalaIDRest, scalaOp), KeywordType, nil}, + }, + "typeparam": { + {`[\s,]+`, Text, nil}, + {`<[%:]|=>|>:|[#_⇒]|forSome|type`, Keyword, nil}, + {`([\])}])`, Operator, Pop(1)}, + {`[(\[{]`, Operator, Push()}, + {fmt.Sprintf("\\.|%s|%s|`[^`]+`", scalaIDRest, scalaOp), KeywordType, nil}, + }, + "comment": { + {`[^/*]+`, CommentMultiline, nil}, + {`/\*`, CommentMultiline, Push()}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[*/]`, CommentMultiline, nil}, + }, + "import": { + {fmt.Sprintf("(%s|\\.)+", scalaIDRest), NameNamespace, Pop(1)}, + }, + "interpstringcommon": { + {`[^"$\\]+`, LiteralString, nil}, + {`\$\$`, LiteralString, nil}, + {`\$` + scalaLetter + `(?:` + scalaLetter + `|\d)*`, LiteralStringInterpol, nil}, + {`\$\{`, LiteralStringInterpol, Push("interpbrace")}, + {`\\.`, LiteralString, nil}, + }, + "interptriplestring": { + {`"""(?!")`, LiteralString, Pop(1)}, + {`"`, LiteralString, nil}, + Include("interpstringcommon"), + }, + "interpstring": { + {`"`, LiteralString, Pop(1)}, + Include("interpstringcommon"), + }, + "interpbrace": { + {`\}`, LiteralStringInterpol, Pop(1)}, + {`\{`, LiteralStringInterpol, Push()}, + Include("root"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/scheme.go b/vendor/github.com/alecthomas/chroma/lexers/s/scheme.go new file mode 100644 index 0000000..72a99f6 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/scheme.go @@ -0,0 +1,57 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// nolint + +// Scheme lexer. +var SchemeLang = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Scheme", + Aliases: []string{"scheme", "scm"}, + Filenames: []string{"*.scm", "*.ss"}, + MimeTypes: []string{"text/x-scheme", "application/x-scheme"}, + }, + schemeLangRules, +)) + +func schemeLangRules() Rules { + return Rules{ + "root": { + {`;.*$`, CommentSingle, nil}, + {`#\|`, CommentMultiline, Push("multiline-comment")}, + {`#;\s*\(`, Comment, Push("commented-form")}, + {`#!r6rs`, Comment, nil}, + {`\s+`, Text, nil}, + {`-?\d+\.\d+`, LiteralNumberFloat, nil}, + {`-?\d+`, LiteralNumberInteger, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`'[\w!$%&*+,/:<=>?@^~|-]+`, LiteralStringSymbol, nil}, + {`#\\(alarm|backspace|delete|esc|linefeed|newline|page|return|space|tab|vtab|x[0-9a-zA-Z]{1,5}|.)`, LiteralStringChar, nil}, + {`(#t|#f)`, NameConstant, nil}, + {"('|#|`|,@|,|\\.)", Operator, nil}, + {`(lambda |define |if |else |cond |and |or |case |let |let\* |letrec |begin |do |delay |set\! |\=\> |quote |quasiquote |unquote |unquote\-splicing |define\-syntax |let\-syntax |letrec\-syntax |syntax\-rules )`, Keyword, nil}, + {`(?<='\()[\w!$%&*+,/:<=>?@^~|-]+`, NameVariable, nil}, + {`(?<=#\()[\w!$%&*+,/:<=>?@^~|-]+`, NameVariable, nil}, + {`(?<=\()(\* |\+ |\- |\/ |\< |\<\= |\= |\> |\>\= |abs |acos |angle |append |apply |asin |assoc |assq |assv |atan |boolean\? |caaaar |caaadr |caaar |caadar |caaddr |caadr |caar |cadaar |cadadr |cadar |caddar |cadddr |caddr |cadr |call\-with\-current\-continuation |call\-with\-input\-file |call\-with\-output\-file |call\-with\-values |call\/cc |car |cdaaar |cdaadr |cdaar |cdadar |cdaddr |cdadr |cdar |cddaar |cddadr |cddar |cdddar |cddddr |cdddr |cddr |cdr |ceiling |char\-\>integer |char\-alphabetic\? |char\-ci\<\=\? |char\-ci\<\? |char\-ci\=\? |char\-ci\>\=\? |char\-ci\>\? |char\-downcase |char\-lower\-case\? |char\-numeric\? |char\-ready\? |char\-upcase |char\-upper\-case\? |char\-whitespace\? |char\<\=\? |char\<\? |char\=\? |char\>\=\? |char\>\? |char\? |close\-input\-port |close\-output\-port |complex\? |cons |cos |current\-input\-port |current\-output\-port |denominator |display |dynamic\-wind |eof\-object\? |eq\? |equal\? |eqv\? |eval |even\? |exact\-\>inexact |exact\? |exp |expt |floor |for\-each |force |gcd |imag\-part |inexact\-\>exact |inexact\? |input\-port\? |integer\-\>char |integer\? |interaction\-environment |lcm |length |list |list\-\>string |list\-\>vector |list\-ref |list\-tail |list\? |load |log |magnitude |make\-polar |make\-rectangular |make\-string |make\-vector |map |max |member |memq |memv |min |modulo |negative\? |newline |not |null\-environment |null\? |number\-\>string |number\? |numerator |odd\? |open\-input\-file |open\-output\-file |output\-port\? |pair\? |peek\-char |port\? |positive\? |procedure\? |quotient |rational\? |rationalize |read |read\-char |real\-part |real\? |remainder |reverse |round |scheme\-report\-environment |set\-car\! |set\-cdr\! |sin |sqrt |string |string\-\>list |string\-\>number |string\-\>symbol |string\-append |string\-ci\<\=\? |string\-ci\<\? |string\-ci\=\? |string\-ci\>\=\? |string\-ci\>\? |string\-copy |string\-fill\! |string\-length |string\-ref |string\-set\! |string\<\=\? |string\<\? |string\=\? |string\>\=\? |string\>\? |string\? |substring |symbol\-\>string |symbol\? |tan |transcript\-off |transcript\-on |truncate |values |vector |vector\-\>list |vector\-fill\! |vector\-length |vector\-ref |vector\-set\! |vector\? |with\-input\-from\-file |with\-output\-to\-file |write |write\-char |zero\? )`, NameBuiltin, nil}, + {`(?<=\()[\w!$%&*+,/:<=>?@^~|-]+`, NameFunction, nil}, + {`[\w!$%&*+,/:<=>?@^~|-]+`, NameVariable, nil}, + {`(\(|\))`, Punctuation, nil}, + {`(\[|\])`, Punctuation, nil}, + }, + "multiline-comment": { + {`#\|`, CommentMultiline, Push()}, + {`\|#`, CommentMultiline, Pop(1)}, + {`[^|#]+`, CommentMultiline, nil}, + {`[|#]`, CommentMultiline, nil}, + }, + "commented-form": { + {`\(`, Comment, Push()}, + {`\)`, Comment, Pop(1)}, + {`[^()]+`, Comment, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/scilab.go b/vendor/github.com/alecthomas/chroma/lexers/s/scilab.go new file mode 100644 index 0000000..f816492 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/scilab.go @@ -0,0 +1,48 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Scilab lexer. +var Scilab = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Scilab", + Aliases: []string{"scilab"}, + Filenames: []string{"*.sci", "*.sce", "*.tst"}, + MimeTypes: []string{"text/scilab"}, + }, + scilabRules, +)) + +func scilabRules() Rules { + return Rules{ + "root": { + {`//.*?$`, CommentSingle, nil}, + {`^\s*function`, Keyword, Push("deffunc")}, + {Words(``, `\b`, `__FILE__`, `__LINE__`, `break`, `case`, `catch`, `classdef`, `continue`, `do`, `else`, `elseif`, `end`, `end_try_catch`, `end_unwind_protect`, `endclassdef`, `endevents`, `endfor`, `endfunction`, `endif`, `endmethods`, `endproperties`, `endswitch`, `endwhile`, `events`, `for`, `function`, `get`, `global`, `if`, `methods`, `otherwise`, `persistent`, `properties`, `return`, `set`, `static`, `switch`, `try`, `until`, `unwind_protect`, `unwind_protect_cleanup`, `while`), Keyword, nil}, + {Words(``, `\b`, `!!_invoke_`, `%H5Object_e`, `%H5Object_fieldnames`, `%H5Object_p`, `%XMLAttr_6`, `%XMLAttr_e`, `%XMLAttr_i_XMLElem`, `%XMLAttr_length`, `%XMLAttr_p`, `%XMLAttr_size`, `%XMLDoc_6`, `%XMLDoc_e`, `%XMLDoc_i_XMLList`, `%XMLDoc_p`, `%XMLElem_6`, `%XMLElem_e`, `%XMLElem_i_XMLDoc`, `%XMLElem_i_XMLElem`, `%XMLElem_i_XMLList`, `%XMLElem_p`, `%XMLList_6`, `%XMLList_e`, `%XMLList_i_XMLElem`, `%XMLList_i_XMLList`, `%XMLList_length`, `%XMLList_p`, `%XMLList_size`, `%XMLNs_6`, `%XMLNs_e`, `%XMLNs_i_XMLElem`, `%XMLNs_p`, `%XMLSet_6`, `%XMLSet_e`, `%XMLSet_length`, `%XMLSet_p`, `%XMLSet_size`, `%XMLValid_p`, `%_EClass_6`, `%_EClass_e`, `%_EClass_p`, `%_EObj_0`, `%_EObj_1__EObj`, `%_EObj_1_b`, `%_EObj_1_c`, `%_EObj_1_i`, `%_EObj_1_s`, `%_EObj_2__EObj`, `%_EObj_2_b`, `%_EObj_2_c`, `%_EObj_2_i`, `%_EObj_2_s`, `%_EObj_3__EObj`, `%_EObj_3_b`, `%_EObj_3_c`, `%_EObj_3_i`, `%_EObj_3_s`, `%_EObj_4__EObj`, `%_EObj_4_b`, `%_EObj_4_c`, `%_EObj_4_i`, `%_EObj_4_s`, `%_EObj_5`, `%_EObj_6`, `%_EObj_a__EObj`, `%_EObj_a_b`, `%_EObj_a_c`, `%_EObj_a_i`, `%_EObj_a_s`, `%_EObj_d__EObj`, `%_EObj_d_b`, `%_EObj_d_c`, `%_EObj_d_i`, `%_EObj_d_s`, `%_EObj_disp`, `%_EObj_e`, `%_EObj_g__EObj`, `%_EObj_g_b`, `%_EObj_g_c`, `%_EObj_g_i`, `%_EObj_g_s`, `%_EObj_h__EObj`, `%_EObj_h_b`, `%_EObj_h_c`, `%_EObj_h_i`, `%_EObj_h_s`, `%_EObj_i__EObj`, `%_EObj_j__EObj`, `%_EObj_j_b`, `%_EObj_j_c`, `%_EObj_j_i`, `%_EObj_j_s`, `%_EObj_k__EObj`, `%_EObj_k_b`, `%_EObj_k_c`, `%_EObj_k_i`, `%_EObj_k_s`, `%_EObj_l__EObj`, `%_EObj_l_b`, `%_EObj_l_c`, `%_EObj_l_i`, `%_EObj_l_s`, `%_EObj_m__EObj`, `%_EObj_m_b`, `%_EObj_m_c`, `%_EObj_m_i`, `%_EObj_m_s`, `%_EObj_n__EObj`, `%_EObj_n_b`, `%_EObj_n_c`, `%_EObj_n_i`, `%_EObj_n_s`, `%_EObj_o__EObj`, `%_EObj_o_b`, `%_EObj_o_c`, `%_EObj_o_i`, `%_EObj_o_s`, `%_EObj_p`, `%_EObj_p__EObj`, `%_EObj_p_b`, `%_EObj_p_c`, `%_EObj_p_i`, `%_EObj_p_s`, `%_EObj_q__EObj`, `%_EObj_q_b`, `%_EObj_q_c`, `%_EObj_q_i`, `%_EObj_q_s`, `%_EObj_r__EObj`, `%_EObj_r_b`, `%_EObj_r_c`, `%_EObj_r_i`, `%_EObj_r_s`, `%_EObj_s__EObj`, `%_EObj_s_b`, `%_EObj_s_c`, `%_EObj_s_i`, `%_EObj_s_s`, `%_EObj_t`, `%_EObj_x__EObj`, `%_EObj_x_b`, `%_EObj_x_c`, `%_EObj_x_i`, `%_EObj_x_s`, `%_EObj_y__EObj`, `%_EObj_y_b`, `%_EObj_y_c`, `%_EObj_y_i`, `%_EObj_y_s`, `%_EObj_z__EObj`, `%_EObj_z_b`, `%_EObj_z_c`, `%_EObj_z_i`, `%_EObj_z_s`, `%_eigs`, `%_load`, `%b_1__EObj`, `%b_2__EObj`, `%b_3__EObj`, `%b_4__EObj`, `%b_a__EObj`, `%b_d__EObj`, `%b_g__EObj`, `%b_h__EObj`, `%b_i_XMLList`, `%b_i__EObj`, `%b_j__EObj`, `%b_k__EObj`, `%b_l__EObj`, `%b_m__EObj`, `%b_n__EObj`, `%b_o__EObj`, `%b_p__EObj`, `%b_q__EObj`, `%b_r__EObj`, `%b_s__EObj`, `%b_x__EObj`, `%b_y__EObj`, `%b_z__EObj`, `%c_1__EObj`, `%c_2__EObj`, `%c_3__EObj`, `%c_4__EObj`, `%c_a__EObj`, `%c_d__EObj`, `%c_g__EObj`, `%c_h__EObj`, `%c_i_XMLAttr`, `%c_i_XMLDoc`, `%c_i_XMLElem`, `%c_i_XMLList`, `%c_i__EObj`, `%c_j__EObj`, `%c_k__EObj`, `%c_l__EObj`, `%c_m__EObj`, `%c_n__EObj`, `%c_o__EObj`, `%c_p__EObj`, `%c_q__EObj`, `%c_r__EObj`, `%c_s__EObj`, `%c_x__EObj`, `%c_y__EObj`, `%c_z__EObj`, `%ce_i_XMLList`, `%fptr_i_XMLList`, `%h_i_XMLList`, `%hm_i_XMLList`, `%i_1__EObj`, `%i_2__EObj`, `%i_3__EObj`, `%i_4__EObj`, `%i_a__EObj`, `%i_abs`, `%i_cumprod`, `%i_cumsum`, `%i_d__EObj`, `%i_diag`, `%i_g__EObj`, `%i_h__EObj`, `%i_i_XMLList`, `%i_i__EObj`, `%i_j__EObj`, `%i_k__EObj`, `%i_l__EObj`, `%i_m__EObj`, `%i_matrix`, `%i_max`, `%i_maxi`, `%i_min`, `%i_mini`, `%i_mput`, `%i_n__EObj`, `%i_o__EObj`, `%i_p`, `%i_p__EObj`, `%i_prod`, `%i_q__EObj`, `%i_r__EObj`, `%i_s__EObj`, `%i_sum`, `%i_tril`, `%i_triu`, `%i_x__EObj`, `%i_y__EObj`, `%i_z__EObj`, `%ip_i_XMLList`, `%l_i_XMLList`, `%l_i__EObj`, `%lss_i_XMLList`, `%mc_i_XMLList`, `%msp_full`, `%msp_i_XMLList`, `%msp_spget`, `%p_i_XMLList`, `%ptr_i_XMLList`, `%r_i_XMLList`, `%s_1__EObj`, `%s_2__EObj`, `%s_3__EObj`, `%s_4__EObj`, `%s_a__EObj`, `%s_d__EObj`, `%s_g__EObj`, `%s_h__EObj`, `%s_i_XMLList`, `%s_i__EObj`, `%s_j__EObj`, `%s_k__EObj`, `%s_l__EObj`, `%s_m__EObj`, `%s_n__EObj`, `%s_o__EObj`, `%s_p__EObj`, `%s_q__EObj`, `%s_r__EObj`, `%s_s__EObj`, `%s_x__EObj`, `%s_y__EObj`, `%s_z__EObj`, `%sp_i_XMLList`, `%spb_i_XMLList`, `%st_i_XMLList`, `Calendar`, `ClipBoard`, `Matplot`, `Matplot1`, `PlaySound`, `TCL_DeleteInterp`, `TCL_DoOneEvent`, `TCL_EvalFile`, `TCL_EvalStr`, `TCL_ExistArray`, `TCL_ExistInterp`, `TCL_ExistVar`, `TCL_GetVar`, `TCL_GetVersion`, `TCL_SetVar`, `TCL_UnsetVar`, `TCL_UpVar`, `_`, `_code2str`, `_d`, `_str2code`, `about`, `abs`, `acos`, `addModulePreferences`, `addcolor`, `addf`, `addhistory`, `addinter`, `addlocalizationdomain`, `amell`, `and`, `argn`, `arl2_ius`, `ascii`, `asin`, `atan`, `backslash`, `balanc`, `banner`, `base2dec`, `basename`, `bdiag`, `beep`, `besselh`, `besseli`, `besselj`, `besselk`, `bessely`, `beta`, `bezout`, `bfinit`, `blkfc1i`, `blkslvi`, `bool2s`, `browsehistory`, `browsevar`, `bsplin3val`, `buildDoc`, `buildouttb`, `bvode`, `c_link`, `call`, `callblk`, `captions`, `cd`, `cdfbet`, `cdfbin`, `cdfchi`, `cdfchn`, `cdff`, `cdffnc`, `cdfgam`, `cdfnbn`, `cdfnor`, `cdfpoi`, `cdft`, `ceil`, `champ`, `champ1`, `chdir`, `chol`, `clc`, `clean`, `clear`, `clearfun`, `clearglobal`, `closeEditor`, `closeEditvar`, `closeXcos`, `code2str`, `coeff`, `color`, `comp`, `completion`, `conj`, `contour2di`, `contr`, `conv2`, `convstr`, `copy`, `copyfile`, `corr`, `cos`, `coserror`, `createdir`, `cshep2d`, `csvDefault`, `csvIsnum`, `csvRead`, `csvStringToDouble`, `csvTextScan`, `csvWrite`, `ctree2`, `ctree3`, `ctree4`, `cumprod`, `cumsum`, `curblock`, `curblockc`, `daskr`, `dasrt`, `dassl`, `data2sig`, `datatipCreate`, `datatipManagerMode`, `datatipMove`, `datatipRemove`, `datatipSetDisplay`, `datatipSetInterp`, `datatipSetOrientation`, `datatipSetStyle`, `datatipToggle`, `dawson`, `dct`, `debug`, `dec2base`, `deff`, `definedfields`, `degree`, `delbpt`, `delete`, `deletefile`, `delip`, `delmenu`, `det`, `dgettext`, `dhinf`, `diag`, `diary`, `diffobjs`, `disp`, `dispbpt`, `displayhistory`, `disposefftwlibrary`, `dlgamma`, `dnaupd`, `dneupd`, `double`, `drawaxis`, `drawlater`, `drawnow`, `driver`, `dsaupd`, `dsearch`, `dseupd`, `dst`, `duplicate`, `editvar`, `emptystr`, `end_scicosim`, `ereduc`, `erf`, `erfc`, `erfcx`, `erfi`, `errcatch`, `errclear`, `error`, `eval_cshep2d`, `exec`, `execstr`, `exists`, `exit`, `exp`, `expm`, `exportUI`, `export_to_hdf5`, `eye`, `fadj2sp`, `fec`, `feval`, `fft`, `fftw`, `fftw_flags`, `fftw_forget_wisdom`, `fftwlibraryisloaded`, `figure`, `file`, `filebrowser`, `fileext`, `fileinfo`, `fileparts`, `filesep`, `find`, `findBD`, `findfiles`, `fire_closing_finished`, `floor`, `format`, `fort`, `fprintfMat`, `freq`, `frexp`, `fromc`, `fromjava`, `fscanfMat`, `fsolve`, `fstair`, `full`, `fullpath`, `funcprot`, `funptr`, `gamma`, `gammaln`, `geom3d`, `get`, `getURL`, `get_absolute_file_path`, `get_fftw_wisdom`, `getblocklabel`, `getcallbackobject`, `getdate`, `getdebuginfo`, `getdefaultlanguage`, `getdrives`, `getdynlibext`, `getenv`, `getfield`, `gethistory`, `gethistoryfile`, `getinstalledlookandfeels`, `getio`, `getlanguage`, `getlongpathname`, `getlookandfeel`, `getmd5`, `getmemory`, `getmodules`, `getos`, `getpid`, `getrelativefilename`, `getscicosvars`, `getscilabmode`, `getshortpathname`, `gettext`, `getvariablesonstack`, `getversion`, `glist`, `global`, `glue`, `grand`, `graphicfunction`, `grayplot`, `grep`, `gsort`, `gstacksize`, `h5attr`, `h5close`, `h5cp`, `h5dataset`, `h5dump`, `h5exists`, `h5flush`, `h5get`, `h5group`, `h5isArray`, `h5isAttr`, `h5isCompound`, `h5isFile`, `h5isGroup`, `h5isList`, `h5isRef`, `h5isSet`, `h5isSpace`, `h5isType`, `h5isVlen`, `h5label`, `h5ln`, `h5ls`, `h5mount`, `h5mv`, `h5open`, `h5read`, `h5readattr`, `h5rm`, `h5umount`, `h5write`, `h5writeattr`, `havewindow`, `helpbrowser`, `hess`, `hinf`, `historymanager`, `historysize`, `host`, `htmlDump`, `htmlRead`, `htmlReadStr`, `htmlWrite`, `iconvert`, `ieee`, `ilib_verbose`, `imag`, `impl`, `import_from_hdf5`, `imult`, `inpnvi`, `int`, `int16`, `int2d`, `int32`, `int3d`, `int8`, `interp`, `interp2d`, `interp3d`, `intg`, `intppty`, `inttype`, `inv`, `invoke_lu`, `is_handle_valid`, `is_hdf5_file`, `isalphanum`, `isascii`, `isdef`, `isdigit`, `isdir`, `isequal`, `isequalbitwise`, `iserror`, `isfile`, `isglobal`, `isletter`, `isnum`, `isreal`, `iswaitingforinput`, `jallowClassReloading`, `jarray`, `jautoTranspose`, `jautoUnwrap`, `javaclasspath`, `javalibrarypath`, `jcast`, `jcompile`, `jconvMatrixMethod`, `jcreatejar`, `jdeff`, `jdisableTrace`, `jenableTrace`, `jexists`, `jgetclassname`, `jgetfield`, `jgetfields`, `jgetinfo`, `jgetmethods`, `jimport`, `jinvoke`, `jinvoke_db`, `jnewInstance`, `jremove`, `jsetfield`, `junwrap`, `junwraprem`, `jwrap`, `jwrapinfloat`, `kron`, `lasterror`, `ldiv`, `ldivf`, `legendre`, `length`, `lib`, `librarieslist`, `libraryinfo`, `light`, `linear_interpn`, `lines`, `link`, `linmeq`, `list`, `listvar_in_hdf5`, `load`, `loadGui`, `loadScicos`, `loadXcos`, `loadfftwlibrary`, `loadhistory`, `log`, `log1p`, `lsq`, `lsq_splin`, `lsqrsolve`, `lsslist`, `lstcat`, `lstsize`, `ltitr`, `lu`, `ludel`, `lufact`, `luget`, `lusolve`, `macr2lst`, `macr2tree`, `matfile_close`, `matfile_listvar`, `matfile_open`, `matfile_varreadnext`, `matfile_varwrite`, `matrix`, `max`, `maxfiles`, `mclearerr`, `mclose`, `meof`, `merror`, `messagebox`, `mfprintf`, `mfscanf`, `mget`, `mgeti`, `mgetl`, `mgetstr`, `min`, `mlist`, `mode`, `model2blk`, `mopen`, `move`, `movefile`, `mprintf`, `mput`, `mputl`, `mputstr`, `mscanf`, `mseek`, `msprintf`, `msscanf`, `mtell`, `mtlb_mode`, `mtlb_sparse`, `mucomp`, `mulf`, `name2rgb`, `nearfloat`, `newaxes`, `newest`, `newfun`, `nnz`, `norm`, `notify`, `number_properties`, `ode`, `odedc`, `ones`, `openged`, `opentk`, `optim`, `or`, `ordmmd`, `parallel_concurrency`, `parallel_run`, `param3d`, `param3d1`, `part`, `pathconvert`, `pathsep`, `phase_simulation`, `plot2d`, `plot2d1`, `plot2d2`, `plot2d3`, `plot2d4`, `plot3d`, `plot3d1`, `plotbrowser`, `pointer_xproperty`, `poly`, `ppol`, `pppdiv`, `predef`, `preferences`, `print`, `printf`, `printfigure`, `printsetupbox`, `prod`, `progressionbar`, `prompt`, `pwd`, `qld`, `qp_solve`, `qr`, `raise_window`, `rand`, `rankqr`, `rat`, `rcond`, `rdivf`, `read`, `read4b`, `read_csv`, `readb`, `readgateway`, `readmps`, `real`, `realtime`, `realtimeinit`, `regexp`, `relocate_handle`, `remez`, `removeModulePreferences`, `removedir`, `removelinehistory`, `res_with_prec`, `resethistory`, `residu`, `resume`, `return`, `ricc`, `rlist`, `roots`, `rotate_axes`, `round`, `rpem`, `rtitr`, `rubberbox`, `save`, `saveGui`, `saveafterncommands`, `saveconsecutivecommands`, `savehistory`, `schur`, `sci_haltscicos`, `sci_tree2`, `sci_tree3`, `sci_tree4`, `sciargs`, `scicos_debug`, `scicos_debug_count`, `scicos_time`, `scicosim`, `scinotes`, `sctree`, `semidef`, `set`, `set_blockerror`, `set_fftw_wisdom`, `set_xproperty`, `setbpt`, `setdefaultlanguage`, `setenv`, `setfield`, `sethistoryfile`, `setlanguage`, `setlookandfeel`, `setmenu`, `sfact`, `sfinit`, `show_window`, `sident`, `sig2data`, `sign`, `simp`, `simp_mode`, `sin`, `size`, `slash`, `sleep`, `sorder`, `sparse`, `spchol`, `spcompack`, `spec`, `spget`, `splin`, `splin2d`, `splin3d`, `splitURL`, `spones`, `sprintf`, `sqrt`, `stacksize`, `str2code`, `strcat`, `strchr`, `strcmp`, `strcspn`, `strindex`, `string`, `stringbox`, `stripblanks`, `strncpy`, `strrchr`, `strrev`, `strsplit`, `strspn`, `strstr`, `strsubst`, `strtod`, `strtok`, `subf`, `sum`, `svd`, `swap_handles`, `symfcti`, `syredi`, `system_getproperty`, `system_setproperty`, `ta2lpd`, `tan`, `taucs_chdel`, `taucs_chfact`, `taucs_chget`, `taucs_chinfo`, `taucs_chsolve`, `tempname`, `testmatrix`, `timer`, `tlist`, `tohome`, `tokens`, `toolbar`, `toprint`, `tr_zer`, `tril`, `triu`, `type`, `typename`, `uiDisplayTree`, `uicontextmenu`, `uicontrol`, `uigetcolor`, `uigetdir`, `uigetfile`, `uigetfont`, `uimenu`, `uint16`, `uint32`, `uint8`, `uipopup`, `uiputfile`, `uiwait`, `ulink`, `umf_ludel`, `umf_lufact`, `umf_luget`, `umf_luinfo`, `umf_lusolve`, `umfpack`, `unglue`, `unix`, `unsetmenu`, `unzoom`, `updatebrowsevar`, `usecanvas`, `useeditor`, `user`, `var2vec`, `varn`, `vec2var`, `waitbar`, `warnBlockByUID`, `warning`, `what`, `where`, `whereis`, `who`, `winsid`, `with_module`, `writb`, `write`, `write4b`, `write_csv`, `x_choose`, `x_choose_modeless`, `x_dialog`, `x_mdialog`, `xarc`, `xarcs`, `xarrows`, `xchange`, `xchoicesi`, `xclick`, `xcos`, `xcosAddToolsMenu`, `xcosConfigureXmlFile`, `xcosDiagramToScilab`, `xcosPalCategoryAdd`, `xcosPalDelete`, `xcosPalDisable`, `xcosPalEnable`, `xcosPalGenerateIcon`, `xcosPalGet`, `xcosPalLoad`, `xcosPalMove`, `xcosSimulationStarted`, `xcosUpdateBlock`, `xdel`, `xend`, `xfarc`, `xfarcs`, `xfpoly`, `xfpolys`, `xfrect`, `xget`, `xgetmouse`, `xgraduate`, `xgrid`, `xinit`, `xlfont`, `xls_open`, `xls_read`, `xmlAddNs`, `xmlAppend`, `xmlAsNumber`, `xmlAsText`, `xmlDTD`, `xmlDelete`, `xmlDocument`, `xmlDump`, `xmlElement`, `xmlFormat`, `xmlGetNsByHref`, `xmlGetNsByPrefix`, `xmlGetOpenDocs`, `xmlIsValidObject`, `xmlName`, `xmlNs`, `xmlRead`, `xmlReadStr`, `xmlRelaxNG`, `xmlRemove`, `xmlSchema`, `xmlSetAttributes`, `xmlValidate`, `xmlWrite`, `xmlXPath`, `xname`, `xpause`, `xpoly`, `xpolys`, `xrect`, `xrects`, `xs2bmp`, `xs2emf`, `xs2eps`, `xs2gif`, `xs2jpg`, `xs2pdf`, `xs2png`, `xs2ppm`, `xs2ps`, `xs2svg`, `xsegs`, `xset`, `xstring`, `xstringb`, `xtitle`, `zeros`, `znaupd`, `zneupd`, `zoom_rect`, `abort`, `apropos`, `break`, `case`, `catch`, `continue`, `do`, `else`, `elseif`, `end`, `endfunction`, `for`, `function`, `help`, `if`, `pause`, `quit`, `select`, `then`, `try`, `while`, `!_deff_wrapper`, `%0_i_st`, `%3d_i_h`, `%Block_xcosUpdateBlock`, `%TNELDER_p`, `%TNELDER_string`, `%TNMPLOT_p`, `%TNMPLOT_string`, `%TOPTIM_p`, `%TOPTIM_string`, `%TSIMPLEX_p`, `%TSIMPLEX_string`, `%_EVoid_p`, `%_gsort`, `%_listvarinfile`, `%_rlist`, `%_save`, `%_sodload`, `%_strsplit`, `%_unwrap`, `%ar_p`, `%asn`, `%b_a_b`, `%b_a_s`, `%b_c_s`, `%b_c_spb`, `%b_cumprod`, `%b_cumsum`, `%b_d_s`, `%b_diag`, `%b_e`, `%b_f_s`, `%b_f_spb`, `%b_g_s`, `%b_g_spb`, `%b_grand`, `%b_h_s`, `%b_h_spb`, `%b_i_b`, `%b_i_ce`, `%b_i_h`, `%b_i_hm`, `%b_i_s`, `%b_i_sp`, `%b_i_spb`, `%b_i_st`, `%b_iconvert`, `%b_l_b`, `%b_l_s`, `%b_m_b`, `%b_m_s`, `%b_matrix`, `%b_n_hm`, `%b_o_hm`, `%b_p_s`, `%b_prod`, `%b_r_b`, `%b_r_s`, `%b_s_b`, `%b_s_s`, `%b_string`, `%b_sum`, `%b_tril`, `%b_triu`, `%b_x_b`, `%b_x_s`, `%bicg`, `%bicgstab`, `%c_a_c`, `%c_b_c`, `%c_b_s`, `%c_diag`, `%c_dsearch`, `%c_e`, `%c_eye`, `%c_f_s`, `%c_grand`, `%c_i_c`, `%c_i_ce`, `%c_i_h`, `%c_i_hm`, `%c_i_lss`, `%c_i_r`, `%c_i_s`, `%c_i_st`, `%c_matrix`, `%c_n_l`, `%c_n_st`, `%c_o_l`, `%c_o_st`, `%c_ones`, `%c_rand`, `%c_tril`, `%c_triu`, `%cblock_c_cblock`, `%cblock_c_s`, `%cblock_e`, `%cblock_f_cblock`, `%cblock_p`, `%cblock_size`, `%ce_6`, `%ce_c_ce`, `%ce_e`, `%ce_f_ce`, `%ce_i_ce`, `%ce_i_s`, `%ce_i_st`, `%ce_matrix`, `%ce_p`, `%ce_size`, `%ce_string`, `%ce_t`, `%cgs`, `%champdat_i_h`, `%choose`, `%diagram_xcos`, `%dir_p`, `%fptr_i_st`, `%grand_perm`, `%grayplot_i_h`, `%h_i_st`, `%hmS_k_hmS_generic`, `%hm_1_hm`, `%hm_1_s`, `%hm_2_hm`, `%hm_2_s`, `%hm_3_hm`, `%hm_3_s`, `%hm_4_hm`, `%hm_4_s`, `%hm_5`, `%hm_a_hm`, `%hm_a_r`, `%hm_a_s`, `%hm_abs`, `%hm_and`, `%hm_bool2s`, `%hm_c_hm`, `%hm_ceil`, `%hm_conj`, `%hm_cos`, `%hm_cumprod`, `%hm_cumsum`, `%hm_d_hm`, `%hm_d_s`, `%hm_degree`, `%hm_dsearch`, `%hm_e`, `%hm_exp`, `%hm_eye`, `%hm_f_hm`, `%hm_find`, `%hm_floor`, `%hm_g_hm`, `%hm_grand`, `%hm_gsort`, `%hm_h_hm`, `%hm_i_b`, `%hm_i_ce`, `%hm_i_h`, `%hm_i_hm`, `%hm_i_i`, `%hm_i_p`, `%hm_i_r`, `%hm_i_s`, `%hm_i_st`, `%hm_iconvert`, `%hm_imag`, `%hm_int`, `%hm_isnan`, `%hm_isreal`, `%hm_j_hm`, `%hm_j_s`, `%hm_k_hm`, `%hm_k_s`, `%hm_log`, `%hm_m_p`, `%hm_m_r`, `%hm_m_s`, `%hm_matrix`, `%hm_max`, `%hm_mean`, `%hm_median`, `%hm_min`, `%hm_n_b`, `%hm_n_c`, `%hm_n_hm`, `%hm_n_i`, `%hm_n_p`, `%hm_n_s`, `%hm_o_b`, `%hm_o_c`, `%hm_o_hm`, `%hm_o_i`, `%hm_o_p`, `%hm_o_s`, `%hm_ones`, `%hm_or`, `%hm_p`, `%hm_prod`, `%hm_q_hm`, `%hm_r_s`, `%hm_rand`, `%hm_real`, `%hm_round`, `%hm_s`, `%hm_s_hm`, `%hm_s_r`, `%hm_s_s`, `%hm_sign`, `%hm_sin`, `%hm_size`, `%hm_sqrt`, `%hm_stdev`, `%hm_string`, `%hm_sum`, `%hm_x_hm`, `%hm_x_p`, `%hm_x_s`, `%hm_zeros`, `%i_1_s`, `%i_2_s`, `%i_3_s`, `%i_4_s`, `%i_Matplot`, `%i_a_i`, `%i_a_s`, `%i_and`, `%i_ascii`, `%i_b_s`, `%i_bezout`, `%i_champ`, `%i_champ1`, `%i_contour`, `%i_contour2d`, `%i_d_i`, `%i_d_s`, `%i_dsearch`, `%i_e`, `%i_fft`, `%i_g_i`, `%i_gcd`, `%i_grand`, `%i_h_i`, `%i_i_ce`, `%i_i_h`, `%i_i_hm`, `%i_i_i`, `%i_i_s`, `%i_i_st`, `%i_j_i`, `%i_j_s`, `%i_l_s`, `%i_lcm`, `%i_length`, `%i_m_i`, `%i_m_s`, `%i_mfprintf`, `%i_mprintf`, `%i_msprintf`, `%i_n_s`, `%i_o_s`, `%i_or`, `%i_p_i`, `%i_p_s`, `%i_plot2d`, `%i_plot2d1`, `%i_plot2d2`, `%i_q_s`, `%i_r_i`, `%i_r_s`, `%i_round`, `%i_s_i`, `%i_s_s`, `%i_sign`, `%i_string`, `%i_x_i`, `%i_x_s`, `%ip_a_s`, `%ip_i_st`, `%ip_m_s`, `%ip_n_ip`, `%ip_o_ip`, `%ip_p`, `%ip_part`, `%ip_s_s`, `%ip_string`, `%k`, `%l_i_h`, `%l_i_s`, `%l_i_st`, `%l_isequal`, `%l_n_c`, `%l_n_l`, `%l_n_m`, `%l_n_p`, `%l_n_s`, `%l_n_st`, `%l_o_c`, `%l_o_l`, `%l_o_m`, `%l_o_p`, `%l_o_s`, `%l_o_st`, `%lss_a_lss`, `%lss_a_p`, `%lss_a_r`, `%lss_a_s`, `%lss_c_lss`, `%lss_c_p`, `%lss_c_r`, `%lss_c_s`, `%lss_e`, `%lss_eye`, `%lss_f_lss`, `%lss_f_p`, `%lss_f_r`, `%lss_f_s`, `%lss_i_ce`, `%lss_i_lss`, `%lss_i_p`, `%lss_i_r`, `%lss_i_s`, `%lss_i_st`, `%lss_inv`, `%lss_l_lss`, `%lss_l_p`, `%lss_l_r`, `%lss_l_s`, `%lss_m_lss`, `%lss_m_p`, `%lss_m_r`, `%lss_m_s`, `%lss_n_lss`, `%lss_n_p`, `%lss_n_r`, `%lss_n_s`, `%lss_norm`, `%lss_o_lss`, `%lss_o_p`, `%lss_o_r`, `%lss_o_s`, `%lss_ones`, `%lss_r_lss`, `%lss_r_p`, `%lss_r_r`, `%lss_r_s`, `%lss_rand`, `%lss_s`, `%lss_s_lss`, `%lss_s_p`, `%lss_s_r`, `%lss_s_s`, `%lss_size`, `%lss_t`, `%lss_v_lss`, `%lss_v_p`, `%lss_v_r`, `%lss_v_s`, `%lt_i_s`, `%m_n_l`, `%m_o_l`, `%mc_i_h`, `%mc_i_s`, `%mc_i_st`, `%mc_n_st`, `%mc_o_st`, `%mc_string`, `%mps_p`, `%mps_string`, `%msp_a_s`, `%msp_abs`, `%msp_e`, `%msp_find`, `%msp_i_s`, `%msp_i_st`, `%msp_length`, `%msp_m_s`, `%msp_maxi`, `%msp_n_msp`, `%msp_nnz`, `%msp_o_msp`, `%msp_p`, `%msp_sparse`, `%msp_spones`, `%msp_t`, `%p_a_lss`, `%p_a_r`, `%p_c_lss`, `%p_c_r`, `%p_cumprod`, `%p_cumsum`, `%p_d_p`, `%p_d_r`, `%p_d_s`, `%p_det`, `%p_e`, `%p_f_lss`, `%p_f_r`, `%p_grand`, `%p_i_ce`, `%p_i_h`, `%p_i_hm`, `%p_i_lss`, `%p_i_p`, `%p_i_r`, `%p_i_s`, `%p_i_st`, `%p_inv`, `%p_j_s`, `%p_k_p`, `%p_k_r`, `%p_k_s`, `%p_l_lss`, `%p_l_p`, `%p_l_r`, `%p_l_s`, `%p_m_hm`, `%p_m_lss`, `%p_m_r`, `%p_matrix`, `%p_n_l`, `%p_n_lss`, `%p_n_r`, `%p_o_l`, `%p_o_lss`, `%p_o_r`, `%p_o_sp`, `%p_p_s`, `%p_part`, `%p_prod`, `%p_q_p`, `%p_q_r`, `%p_q_s`, `%p_r_lss`, `%p_r_p`, `%p_r_r`, `%p_r_s`, `%p_s_lss`, `%p_s_r`, `%p_simp`, `%p_string`, `%p_sum`, `%p_v_lss`, `%p_v_p`, `%p_v_r`, `%p_v_s`, `%p_x_hm`, `%p_x_r`, `%p_y_p`, `%p_y_r`, `%p_y_s`, `%p_z_p`, `%p_z_r`, `%p_z_s`, `%pcg`, `%plist_p`, `%plist_string`, `%r_0`, `%r_a_hm`, `%r_a_lss`, `%r_a_p`, `%r_a_r`, `%r_a_s`, `%r_c_lss`, `%r_c_p`, `%r_c_r`, `%r_c_s`, `%r_clean`, `%r_cumprod`, `%r_cumsum`, `%r_d_p`, `%r_d_r`, `%r_d_s`, `%r_det`, `%r_diag`, `%r_e`, `%r_eye`, `%r_f_lss`, `%r_f_p`, `%r_f_r`, `%r_f_s`, `%r_i_ce`, `%r_i_hm`, `%r_i_lss`, `%r_i_p`, `%r_i_r`, `%r_i_s`, `%r_i_st`, `%r_inv`, `%r_j_s`, `%r_k_p`, `%r_k_r`, `%r_k_s`, `%r_l_lss`, `%r_l_p`, `%r_l_r`, `%r_l_s`, `%r_m_hm`, `%r_m_lss`, `%r_m_p`, `%r_m_r`, `%r_m_s`, `%r_matrix`, `%r_n_lss`, `%r_n_p`, `%r_n_r`, `%r_n_s`, `%r_norm`, `%r_o_lss`, `%r_o_p`, `%r_o_r`, `%r_o_s`, `%r_ones`, `%r_p`, `%r_p_s`, `%r_prod`, `%r_q_p`, `%r_q_r`, `%r_q_s`, `%r_r_lss`, `%r_r_p`, `%r_r_r`, `%r_r_s`, `%r_rand`, `%r_s`, `%r_s_hm`, `%r_s_lss`, `%r_s_p`, `%r_s_r`, `%r_s_s`, `%r_simp`, `%r_size`, `%r_string`, `%r_sum`, `%r_t`, `%r_tril`, `%r_triu`, `%r_v_lss`, `%r_v_p`, `%r_v_r`, `%r_v_s`, `%r_varn`, `%r_x_p`, `%r_x_r`, `%r_x_s`, `%r_y_p`, `%r_y_r`, `%r_y_s`, `%r_z_p`, `%r_z_r`, `%r_z_s`, `%s_1_hm`, `%s_1_i`, `%s_2_hm`, `%s_2_i`, `%s_3_hm`, `%s_3_i`, `%s_4_hm`, `%s_4_i`, `%s_5`, `%s_a_b`, `%s_a_hm`, `%s_a_i`, `%s_a_ip`, `%s_a_lss`, `%s_a_msp`, `%s_a_r`, `%s_a_sp`, `%s_and`, `%s_b_i`, `%s_b_s`, `%s_bezout`, `%s_c_b`, `%s_c_cblock`, `%s_c_lss`, `%s_c_r`, `%s_c_sp`, `%s_d_b`, `%s_d_i`, `%s_d_p`, `%s_d_r`, `%s_d_sp`, `%s_e`, `%s_f_b`, `%s_f_cblock`, `%s_f_lss`, `%s_f_r`, `%s_f_sp`, `%s_g_b`, `%s_g_s`, `%s_gcd`, `%s_grand`, `%s_h_b`, `%s_h_s`, `%s_i_b`, `%s_i_c`, `%s_i_ce`, `%s_i_h`, `%s_i_hm`, `%s_i_i`, `%s_i_lss`, `%s_i_p`, `%s_i_r`, `%s_i_s`, `%s_i_sp`, `%s_i_spb`, `%s_i_st`, `%s_j_i`, `%s_k_hm`, `%s_k_p`, `%s_k_r`, `%s_k_sp`, `%s_l_b`, `%s_l_hm`, `%s_l_i`, `%s_l_lss`, `%s_l_p`, `%s_l_r`, `%s_l_s`, `%s_l_sp`, `%s_lcm`, `%s_m_b`, `%s_m_hm`, `%s_m_i`, `%s_m_ip`, `%s_m_lss`, `%s_m_msp`, `%s_m_r`, `%s_matrix`, `%s_n_hm`, `%s_n_i`, `%s_n_l`, `%s_n_lss`, `%s_n_r`, `%s_n_st`, `%s_o_hm`, `%s_o_i`, `%s_o_l`, `%s_o_lss`, `%s_o_r`, `%s_o_st`, `%s_or`, `%s_p_b`, `%s_p_i`, `%s_pow`, `%s_q_hm`, `%s_q_i`, `%s_q_p`, `%s_q_r`, `%s_q_sp`, `%s_r_b`, `%s_r_i`, `%s_r_lss`, `%s_r_p`, `%s_r_r`, `%s_r_s`, `%s_r_sp`, `%s_s_b`, `%s_s_hm`, `%s_s_i`, `%s_s_ip`, `%s_s_lss`, `%s_s_r`, `%s_s_sp`, `%s_simp`, `%s_v_lss`, `%s_v_p`, `%s_v_r`, `%s_v_s`, `%s_x_b`, `%s_x_hm`, `%s_x_i`, `%s_x_r`, `%s_y_p`, `%s_y_r`, `%s_y_sp`, `%s_z_p`, `%s_z_r`, `%s_z_sp`, `%sn`, `%sp_a_s`, `%sp_a_sp`, `%sp_and`, `%sp_c_s`, `%sp_ceil`, `%sp_conj`, `%sp_cos`, `%sp_cumprod`, `%sp_cumsum`, `%sp_d_s`, `%sp_d_sp`, `%sp_det`, `%sp_diag`, `%sp_e`, `%sp_exp`, `%sp_f_s`, `%sp_floor`, `%sp_grand`, `%sp_gsort`, `%sp_i_ce`, `%sp_i_h`, `%sp_i_s`, `%sp_i_sp`, `%sp_i_st`, `%sp_int`, `%sp_inv`, `%sp_k_s`, `%sp_k_sp`, `%sp_l_s`, `%sp_l_sp`, `%sp_length`, `%sp_max`, `%sp_min`, `%sp_norm`, `%sp_or`, `%sp_p_s`, `%sp_prod`, `%sp_q_s`, `%sp_q_sp`, `%sp_r_s`, `%sp_r_sp`, `%sp_round`, `%sp_s_s`, `%sp_s_sp`, `%sp_sin`, `%sp_sqrt`, `%sp_string`, `%sp_sum`, `%sp_tril`, `%sp_triu`, `%sp_y_s`, `%sp_y_sp`, `%sp_z_s`, `%sp_z_sp`, `%spb_and`, `%spb_c_b`, `%spb_cumprod`, `%spb_cumsum`, `%spb_diag`, `%spb_e`, `%spb_f_b`, `%spb_g_b`, `%spb_g_spb`, `%spb_h_b`, `%spb_h_spb`, `%spb_i_b`, `%spb_i_ce`, `%spb_i_h`, `%spb_i_st`, `%spb_or`, `%spb_prod`, `%spb_sum`, `%spb_tril`, `%spb_triu`, `%st_6`, `%st_c_st`, `%st_e`, `%st_f_st`, `%st_i_b`, `%st_i_c`, `%st_i_fptr`, `%st_i_h`, `%st_i_i`, `%st_i_ip`, `%st_i_lss`, `%st_i_msp`, `%st_i_p`, `%st_i_r`, `%st_i_s`, `%st_i_sp`, `%st_i_spb`, `%st_i_st`, `%st_matrix`, `%st_n_c`, `%st_n_l`, `%st_n_mc`, `%st_n_p`, `%st_n_s`, `%st_o_c`, `%st_o_l`, `%st_o_mc`, `%st_o_p`, `%st_o_s`, `%st_o_tl`, `%st_p`, `%st_size`, `%st_string`, `%st_t`, `%ticks_i_h`, `%xls_e`, `%xls_p`, `%xlssheet_e`, `%xlssheet_p`, `%xlssheet_size`, `%xlssheet_string`, `DominationRank`, `G_make`, `IsAScalar`, `NDcost`, `OS_Version`, `PlotSparse`, `ReadHBSparse`, `TCL_CreateSlave`, `abcd`, `abinv`, `accept_func_default`, `accept_func_vfsa`, `acf`, `acosd`, `acosh`, `acoshm`, `acosm`, `acot`, `acotd`, `acoth`, `acsc`, `acscd`, `acsch`, `add_demo`, `add_help_chapter`, `add_module_help_chapter`, `add_param`, `add_profiling`, `adj2sp`, `aff2ab`, `ana_style`, `analpf`, `analyze`, `aplat`, `arhnk`, `arl2`, `arma2p`, `arma2ss`, `armac`, `armax`, `armax1`, `arobasestring2strings`, `arsimul`, `ascii2string`, `asciimat`, `asec`, `asecd`, `asech`, `asind`, `asinh`, `asinhm`, `asinm`, `assert_checkalmostequal`, `assert_checkequal`, `assert_checkerror`, `assert_checkfalse`, `assert_checkfilesequal`, `assert_checktrue`, `assert_comparecomplex`, `assert_computedigits`, `assert_cond2reltol`, `assert_cond2reqdigits`, `assert_generror`, `atand`, `atanh`, `atanhm`, `atanm`, `atomsAutoload`, `atomsAutoloadAdd`, `atomsAutoloadDel`, `atomsAutoloadList`, `atomsCategoryList`, `atomsCheckModule`, `atomsDepTreeShow`, `atomsGetConfig`, `atomsGetInstalled`, `atomsGetInstalledPath`, `atomsGetLoaded`, `atomsGetLoadedPath`, `atomsInstall`, `atomsIsInstalled`, `atomsIsLoaded`, `atomsList`, `atomsLoad`, `atomsQuit`, `atomsRemove`, `atomsRepositoryAdd`, `atomsRepositoryDel`, `atomsRepositoryList`, `atomsRestoreConfig`, `atomsSaveConfig`, `atomsSearch`, `atomsSetConfig`, `atomsShow`, `atomsSystemInit`, `atomsSystemUpdate`, `atomsTest`, `atomsUpdate`, `atomsVersion`, `augment`, `auread`, `auwrite`, `balreal`, `bench_run`, `bilin`, `bilt`, `bin2dec`, `binomial`, `bitand`, `bitcmp`, `bitget`, `bitor`, `bitset`, `bitxor`, `black`, `blanks`, `bloc2exp`, `bloc2ss`, `block_parameter_error`, `bode`, `bode_asymp`, `bstap`, `buttmag`, `bvodeS`, `bytecode`, `bytecodewalk`, `cainv`, `calendar`, `calerf`, `calfrq`, `canon`, `casc`, `cat`, `cat_code`, `cb_m2sci_gui`, `ccontrg`, `cell`, `cell2mat`, `cellstr`, `center`, `cepstrum`, `cfspec`, `char`, `chart`, `cheb1mag`, `cheb2mag`, `check_gateways`, `check_modules_xml`, `check_versions`, `chepol`, `chfact`, `chsolve`, `classmarkov`, `clean_help`, `clock`, `cls2dls`, `cmb_lin`, `cmndred`, `cmoment`, `coding_ga_binary`, `coding_ga_identity`, `coff`, `coffg`, `colcomp`, `colcompr`, `colinout`, `colregul`, `companion`, `complex`, `compute_initial_temp`, `cond`, `cond2sp`, `condestsp`, `configure_msifort`, `configure_msvc`, `conjgrad`, `cont_frm`, `cont_mat`, `contrss`, `conv`, `convert_to_float`, `convertindex`, `convol`, `convol2d`, `copfac`, `correl`, `cosd`, `cosh`, `coshm`, `cosm`, `cotd`, `cotg`, `coth`, `cothm`, `cov`, `covar`, `createXConfiguration`, `createfun`, `createstruct`, `cross`, `crossover_ga_binary`, `crossover_ga_default`, `csc`, `cscd`, `csch`, `csgn`, `csim`, `cspect`, `ctr_gram`, `czt`, `dae`, `daeoptions`, `damp`, `datafit`, `date`, `datenum`, `datevec`, `dbphi`, `dcf`, `ddp`, `dec2bin`, `dec2hex`, `dec2oct`, `del_help_chapter`, `del_module_help_chapter`, `demo_begin`, `demo_choose`, `demo_compiler`, `demo_end`, `demo_file_choice`, `demo_folder_choice`, `demo_function_choice`, `demo_gui`, `demo_run`, `demo_viewCode`, `denom`, `derivat`, `derivative`, `des2ss`, `des2tf`, `detectmsifort64tools`, `detectmsvc64tools`, `determ`, `detr`, `detrend`, `devtools_run_builder`, `dhnorm`, `diff`, `diophant`, `dir`, `dirname`, `dispfiles`, `dllinfo`, `dscr`, `dsimul`, `dt_ility`, `dtsi`, `edit`, `edit_error`, `editor`, `eigenmarkov`, `eigs`, `ell1mag`, `enlarge_shape`, `entropy`, `eomday`, `epred`, `eqfir`, `eqiir`, `equil`, `equil1`, `erfinv`, `etime`, `eval`, `evans`, `evstr`, `example_run`, `expression2code`, `extract_help_examples`, `factor`, `factorial`, `factors`, `faurre`, `ffilt`, `fft2`, `fftshift`, `fieldnames`, `filt_sinc`, `filter`, `findABCD`, `findAC`, `findBDK`, `findR`, `find_freq`, `find_links`, `find_scicos_version`, `findm`, `findmsifortcompiler`, `findmsvccompiler`, `findx0BD`, `firstnonsingleton`, `fix`, `fixedpointgcd`, `flipdim`, `flts`, `fminsearch`, `formatBlackTip`, `formatBodeMagTip`, `formatBodePhaseTip`, `formatGainplotTip`, `formatHallModuleTip`, `formatHallPhaseTip`, `formatNicholsGainTip`, `formatNicholsPhaseTip`, `formatNyquistTip`, `formatPhaseplotTip`, `formatSgridDampingTip`, `formatSgridFreqTip`, `formatZgridDampingTip`, `formatZgridFreqTip`, `format_txt`, `fourplan`, `frep2tf`, `freson`, `frfit`, `frmag`, `fseek_origin`, `fsfirlin`, `fspec`, `fspecg`, `fstabst`, `ftest`, `ftuneq`, `fullfile`, `fullrf`, `fullrfk`, `fun2string`, `g_margin`, `gainplot`, `gamitg`, `gcare`, `gcd`, `gencompilationflags_unix`, `generateBlockImage`, `generateBlockImages`, `generic_i_ce`, `generic_i_h`, `generic_i_hm`, `generic_i_s`, `generic_i_st`, `genlib`, `genmarkov`, `geomean`, `getDiagramVersion`, `getModelicaPath`, `getPreferencesValue`, `get_file_path`, `get_function_path`, `get_param`, `get_profile`, `get_scicos_version`, `getd`, `getscilabkeywords`, `getshell`, `gettklib`, `gfare`, `gfrancis`, `givens`, `glever`, `gmres`, `group`, `gschur`, `gspec`, `gtild`, `h2norm`, `h_cl`, `h_inf`, `h_inf_st`, `h_norm`, `hallchart`, `halt`, `hank`, `hankelsv`, `harmean`, `haveacompiler`, `head_comments`, `help_from_sci`, `help_skeleton`, `hermit`, `hex2dec`, `hilb`, `hilbert`, `histc`, `horner`, `householder`, `hrmt`, `htrianr`, `hypermat`, `idct`, `idst`, `ifft`, `ifftshift`, `iir`, `iirgroup`, `iirlp`, `iirmod`, `ilib_build`, `ilib_build_jar`, `ilib_compile`, `ilib_for_link`, `ilib_gen_Make`, `ilib_gen_Make_unix`, `ilib_gen_cleaner`, `ilib_gen_gateway`, `ilib_gen_loader`, `ilib_include_flag`, `ilib_mex_build`, `im_inv`, `importScicosDiagram`, `importScicosPal`, `importXcosDiagram`, `imrep2ss`, `ind2sub`, `inistate`, `init_ga_default`, `init_param`, `initial_scicos_tables`, `input`, `instruction2code`, `intc`, `intdec`, `integrate`, `interp1`, `interpln`, `intersect`, `intl`, `intsplin`, `inttrap`, `inv_coeff`, `invr`, `invrs`, `invsyslin`, `iqr`, `isLeapYear`, `is_absolute_path`, `is_param`, `iscell`, `iscellstr`, `iscolumn`, `isempty`, `isfield`, `isinf`, `ismatrix`, `isnan`, `isrow`, `isscalar`, `issparse`, `issquare`, `isstruct`, `isvector`, `jmat`, `justify`, `kalm`, `karmarkar`, `kernel`, `kpure`, `krac2`, `kroneck`, `lattn`, `lattp`, `launchtest`, `lcf`, `lcm`, `lcmdiag`, `leastsq`, `leqe`, `leqr`, `lev`, `levin`, `lex_sort`, `lft`, `lin`, `lin2mu`, `lincos`, `lindquist`, `linf`, `linfn`, `linsolve`, `linspace`, `list2vec`, `list_param`, `listfiles`, `listfunctions`, `listvarinfile`, `lmisolver`, `lmitool`, `loadXcosLibs`, `loadmatfile`, `loadwave`, `log10`, `log2`, `logm`, `logspace`, `lqe`, `lqg`, `lqg2stan`, `lqg_ltr`, `lqr`, `ls`, `lyap`, `m2sci_gui`, `m_circle`, `macglov`, `macrovar`, `mad`, `makecell`, `manedit`, `mapsound`, `markp2ss`, `matfile2sci`, `mdelete`, `mean`, `meanf`, `median`, `members`, `mese`, `meshgrid`, `mfft`, `mfile2sci`, `minreal`, `minss`, `mkdir`, `modulo`, `moment`, `mrfit`, `msd`, `mstr2sci`, `mtlb`, `mtlb_0`, `mtlb_a`, `mtlb_all`, `mtlb_any`, `mtlb_axes`, `mtlb_axis`, `mtlb_beta`, `mtlb_box`, `mtlb_choices`, `mtlb_close`, `mtlb_colordef`, `mtlb_cond`, `mtlb_cov`, `mtlb_cumprod`, `mtlb_cumsum`, `mtlb_dec2hex`, `mtlb_delete`, `mtlb_diag`, `mtlb_diff`, `mtlb_dir`, `mtlb_double`, `mtlb_e`, `mtlb_echo`, `mtlb_error`, `mtlb_eval`, `mtlb_exist`, `mtlb_eye`, `mtlb_false`, `mtlb_fft`, `mtlb_fftshift`, `mtlb_filter`, `mtlb_find`, `mtlb_findstr`, `mtlb_fliplr`, `mtlb_fopen`, `mtlb_format`, `mtlb_fprintf`, `mtlb_fread`, `mtlb_fscanf`, `mtlb_full`, `mtlb_fwrite`, `mtlb_get`, `mtlb_grid`, `mtlb_hold`, `mtlb_i`, `mtlb_ifft`, `mtlb_image`, `mtlb_imp`, `mtlb_int16`, `mtlb_int32`, `mtlb_int8`, `mtlb_is`, `mtlb_isa`, `mtlb_isfield`, `mtlb_isletter`, `mtlb_isspace`, `mtlb_l`, `mtlb_legendre`, `mtlb_linspace`, `mtlb_logic`, `mtlb_logical`, `mtlb_loglog`, `mtlb_lower`, `mtlb_max`, `mtlb_mean`, `mtlb_median`, `mtlb_mesh`, `mtlb_meshdom`, `mtlb_min`, `mtlb_more`, `mtlb_num2str`, `mtlb_ones`, `mtlb_pcolor`, `mtlb_plot`, `mtlb_prod`, `mtlb_qr`, `mtlb_qz`, `mtlb_rand`, `mtlb_randn`, `mtlb_rcond`, `mtlb_realmax`, `mtlb_realmin`, `mtlb_s`, `mtlb_semilogx`, `mtlb_semilogy`, `mtlb_setstr`, `mtlb_size`, `mtlb_sort`, `mtlb_sortrows`, `mtlb_sprintf`, `mtlb_sscanf`, `mtlb_std`, `mtlb_strcmp`, `mtlb_strcmpi`, `mtlb_strfind`, `mtlb_strrep`, `mtlb_subplot`, `mtlb_sum`, `mtlb_t`, `mtlb_toeplitz`, `mtlb_tril`, `mtlb_triu`, `mtlb_true`, `mtlb_type`, `mtlb_uint16`, `mtlb_uint32`, `mtlb_uint8`, `mtlb_upper`, `mtlb_var`, `mtlb_zeros`, `mu2lin`, `mutation_ga_binary`, `mutation_ga_default`, `mvcorrel`, `mvvacov`, `nancumsum`, `nand2mean`, `nanmax`, `nanmean`, `nanmeanf`, `nanmedian`, `nanmin`, `nanreglin`, `nanstdev`, `nansum`, `narsimul`, `ndgrid`, `ndims`, `nehari`, `neigh_func_csa`, `neigh_func_default`, `neigh_func_fsa`, `neigh_func_vfsa`, `neldermead_cget`, `neldermead_configure`, `neldermead_costf`, `neldermead_defaultoutput`, `neldermead_destroy`, `neldermead_function`, `neldermead_get`, `neldermead_log`, `neldermead_new`, `neldermead_restart`, `neldermead_search`, `neldermead_updatesimp`, `nextpow2`, `nfreq`, `nicholschart`, `nlev`, `nmplot_cget`, `nmplot_configure`, `nmplot_contour`, `nmplot_destroy`, `nmplot_function`, `nmplot_get`, `nmplot_historyplot`, `nmplot_log`, `nmplot_new`, `nmplot_outputcmd`, `nmplot_restart`, `nmplot_search`, `nmplot_simplexhistory`, `noisegen`, `nonreg_test_run`, `now`, `nthroot`, `null`, `num2cell`, `numderivative`, `numdiff`, `numer`, `nyquist`, `nyquistfrequencybounds`, `obs_gram`, `obscont`, `observer`, `obsv_mat`, `obsvss`, `oct2dec`, `odeoptions`, `optim_ga`, `optim_moga`, `optim_nsga`, `optim_nsga2`, `optim_sa`, `optimbase_cget`, `optimbase_checkbounds`, `optimbase_checkcostfun`, `optimbase_checkx0`, `optimbase_configure`, `optimbase_destroy`, `optimbase_function`, `optimbase_get`, `optimbase_hasbounds`, `optimbase_hasconstraints`, `optimbase_hasnlcons`, `optimbase_histget`, `optimbase_histset`, `optimbase_incriter`, `optimbase_isfeasible`, `optimbase_isinbounds`, `optimbase_isinnonlincons`, `optimbase_log`, `optimbase_logshutdown`, `optimbase_logstartup`, `optimbase_new`, `optimbase_outputcmd`, `optimbase_outstruct`, `optimbase_proj2bnds`, `optimbase_set`, `optimbase_stoplog`, `optimbase_terminate`, `optimget`, `optimplotfunccount`, `optimplotfval`, `optimplotx`, `optimset`, `optimsimplex_center`, `optimsimplex_check`, `optimsimplex_compsomefv`, `optimsimplex_computefv`, `optimsimplex_deltafv`, `optimsimplex_deltafvmax`, `optimsimplex_destroy`, `optimsimplex_dirmat`, `optimsimplex_fvmean`, `optimsimplex_fvstdev`, `optimsimplex_fvvariance`, `optimsimplex_getall`, `optimsimplex_getallfv`, `optimsimplex_getallx`, `optimsimplex_getfv`, `optimsimplex_getn`, `optimsimplex_getnbve`, `optimsimplex_getve`, `optimsimplex_getx`, `optimsimplex_gradientfv`, `optimsimplex_log`, `optimsimplex_new`, `optimsimplex_reflect`, `optimsimplex_setall`, `optimsimplex_setallfv`, `optimsimplex_setallx`, `optimsimplex_setfv`, `optimsimplex_setn`, `optimsimplex_setnbve`, `optimsimplex_setve`, `optimsimplex_setx`, `optimsimplex_shrink`, `optimsimplex_size`, `optimsimplex_sort`, `optimsimplex_xbar`, `orth`, `output_ga_default`, `output_moga_default`, `output_nsga2_default`, `output_nsga_default`, `p_margin`, `pack`, `pareto_filter`, `parrot`, `pbig`, `pca`, `pcg`, `pdiv`, `pen2ea`, `pencan`, `pencost`, `penlaur`, `perctl`, `perl`, `perms`, `permute`, `pertrans`, `pfactors`, `pfss`, `phasemag`, `phaseplot`, `phc`, `pinv`, `playsnd`, `plotprofile`, `plzr`, `pmodulo`, `pol2des`, `pol2str`, `polar`, `polfact`, `prbs_a`, `prettyprint`, `primes`, `princomp`, `profile`, `proj`, `projsl`, `projspec`, `psmall`, `pspect`, `qmr`, `qpsolve`, `quart`, `quaskro`, `rafiter`, `randpencil`, `range`, `rank`, `readxls`, `recompilefunction`, `recons`, `reglin`, `regress`, `remezb`, `remove_param`, `remove_profiling`, `repfreq`, `replace_Ix_by_Fx`, `repmat`, `reset_profiling`, `resize_matrix`, `returntoscilab`, `rhs2code`, `ric_desc`, `riccati`, `rmdir`, `routh_t`, `rowcomp`, `rowcompr`, `rowinout`, `rowregul`, `rowshuff`, `rref`, `sample`, `samplef`, `samwr`, `savematfile`, `savewave`, `scanf`, `sci2exp`, `sciGUI_init`, `sci_sparse`, `scicos_getvalue`, `scicos_simulate`, `scicos_workspace_init`, `scisptdemo`, `scitest`, `sdiff`, `sec`, `secd`, `sech`, `selection_ga_elitist`, `selection_ga_random`, `sensi`, `setPreferencesValue`, `set_param`, `setdiff`, `sgrid`, `show_margins`, `show_pca`, `showprofile`, `signm`, `sinc`, `sincd`, `sind`, `sinh`, `sinhm`, `sinm`, `sm2des`, `sm2ss`, `smga`, `smooth`, `solve`, `sound`, `soundsec`, `sp2adj`, `spaninter`, `spanplus`, `spantwo`, `specfact`, `speye`, `sprand`, `spzeros`, `sqroot`, `sqrtm`, `squarewave`, `squeeze`, `srfaur`, `srkf`, `ss2des`, `ss2ss`, `ss2tf`, `sskf`, `ssprint`, `ssrand`, `st_deviation`, `st_i_generic`, `st_ility`, `stabil`, `statgain`, `stdev`, `stdevf`, `steadycos`, `strange`, `strcmpi`, `struct`, `sub2ind`, `sva`, `svplot`, `sylm`, `sylv`, `sysconv`, `sysdiag`, `sysfact`, `syslin`, `syssize`, `system`, `systmat`, `tabul`, `tand`, `tanh`, `tanhm`, `tanm`, `tbx_build_blocks`, `tbx_build_cleaner`, `tbx_build_gateway`, `tbx_build_gateway_clean`, `tbx_build_gateway_loader`, `tbx_build_help`, `tbx_build_help_loader`, `tbx_build_loader`, `tbx_build_localization`, `tbx_build_macros`, `tbx_build_pal_loader`, `tbx_build_src`, `tbx_builder`, `tbx_builder_gateway`, `tbx_builder_gateway_lang`, `tbx_builder_help`, `tbx_builder_help_lang`, `tbx_builder_macros`, `tbx_builder_src`, `tbx_builder_src_lang`, `tbx_generate_pofile`, `temp_law_csa`, `temp_law_default`, `temp_law_fsa`, `temp_law_huang`, `temp_law_vfsa`, `test_clean`, `test_on_columns`, `test_run`, `test_run_level`, `testexamples`, `tf2des`, `tf2ss`, `thrownan`, `tic`, `time_id`, `toc`, `toeplitz`, `tokenpos`, `toolboxes`, `trace`, `trans`, `translatepaths`, `tree2code`, `trfmod`, `trianfml`, `trimmean`, `trisolve`, `trzeros`, `typeof`, `ui_observer`, `union`, `unique`, `unit_test_run`, `unix_g`, `unix_s`, `unix_w`, `unix_x`, `unobs`, `unpack`, `unwrap`, `variance`, `variancef`, `vec2list`, `vectorfind`, `ver`, `warnobsolete`, `wavread`, `wavwrite`, `wcenter`, `weekday`, `wfir`, `wfir_gui`, `whereami`, `who_user`, `whos`, `wiener`, `wigner`, `window`, `winlist`, `with_javasci`, `with_macros_source`, `with_modelica_compiler`, `with_tk`, `xcorr`, `xcosBlockEval`, `xcosBlockInterface`, `xcosCodeGeneration`, `xcosConfigureModelica`, `xcosPal`, `xcosPalAdd`, `xcosPalAddBlock`, `xcosPalExport`, `xcosPalGenerateAllIcons`, `xcosShowBlockWarning`, `xcosValidateBlockSet`, `xcosValidateCompareBlock`, `xcos_compile`, `xcos_debug_gui`, `xcos_run`, `xcos_simulate`, `xcov`, `xmltochm`, `xmltoformat`, `xmltohtml`, `xmltojar`, `xmltopdf`, `xmltops`, `xmltoweb`, `yulewalk`, `zeropen`, `zgrid`, `zpbutt`, `zpch1`, `zpch2`, `zpell`), NameBuiltin, nil}, + {Words(``, `\b`, `$`, `%F`, `%T`, `%e`, `%eps`, `%f`, `%fftw`, `%gui`, `%i`, `%inf`, `%io`, `%modalWarning`, `%nan`, `%pi`, `%s`, `%t`, `%tk`, `%toolboxes`, `%toolboxes_dir`, `%z`, `PWD`, `SCI`, `SCIHOME`, `TMPDIR`, `arnoldilib`, `assertlib`, `atomslib`, `cacsdlib`, `compatibility_functilib`, `corelib`, `data_structureslib`, `demo_toolslib`, `development_toolslib`, `differential_equationlib`, `dynamic_linklib`, `elementary_functionslib`, `enull`, `evoid`, `external_objectslib`, `fd`, `fileiolib`, `functionslib`, `genetic_algorithmslib`, `helptoolslib`, `home`, `integerlib`, `interpolationlib`, `iolib`, `jnull`, `jvoid`, `linear_algebralib`, `m2scilib`, `matiolib`, `modules_managerlib`, `neldermeadlib`, `optimbaselib`, `optimizationlib`, `optimsimplexlib`, `output_streamlib`, `overloadinglib`, `parameterslib`, `polynomialslib`, `preferenceslib`, `randliblib`, `scicos_autolib`, `scicos_utilslib`, `scinoteslib`, `signal_processinglib`, `simulated_annealinglib`, `soundlib`, `sparselib`, `special_functionslib`, `spreadsheetlib`, `statisticslib`, `stringlib`, `tclscilib`, `timelib`, `umfpacklib`, `xcoslib`), NameConstant, nil}, + {`-|==|~=|<|>|<=|>=|&&|&|~|\|\|?`, Operator, nil}, + {`\.\*|\*|\+|\.\^|\.\\|\.\/|\/|\\`, Operator, nil}, + {`[\[\](){}@.,=:;]`, Punctuation, nil}, + {`"[^"]*"`, LiteralString, nil}, + {`(?<=[\w)\].])\'+`, Operator, nil}, + {`(?|+=@:,./?-]+`, Operator, nil}, + {`[\[\]()]+`, Punctuation, nil}, + {`"`, LiteralStringDouble, Push("string-double")}, + {`'`, LiteralStringSingle, Push("string-single")}, + {`[a-z_-][\w-]*`, Name, nil}, + {`\n`, Text, nil}, + {`[;{}]`, Punctuation, Pop(1)}, + }, + "interpolation": { + {`\}`, LiteralStringInterpol, Pop(1)}, + Include("value"), + }, + "selector": { + {`[ \t]+`, Text, nil}, + {`\:`, NameDecorator, Push("pseudo-class")}, + {`\.`, NameClass, Push("class")}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`\#`, NameNamespace, Push("id")}, + {`&`, Keyword, nil}, + {`[~^*!&\[\]()<>|+=@:,./?-]`, Operator, nil}, + {`(%)([\w-]+)`, ByGroups(Operator, NameClass), nil}, + {`"`, LiteralStringDouble, Push("string-double")}, + {`'`, LiteralStringSingle, Push("string-single")}, + {`\n`, Text, nil}, + {`[;{}]`, Punctuation, Pop(1)}, + {`[\w-]+`, NameTag, nil}, + }, + "string-double": { + {`(\\.|#(?=[^\n{])|[^\n"#])+`, LiteralStringDouble, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + "string-single": { + {`(\\.|#(?=[^\n{])|[^\n'#])+`, LiteralStringSingle, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`'`, LiteralStringSingle, Pop(1)}, + }, + "string-url": { + {`(\\#|#(?=[^\n{])|[^\n#)])+`, LiteralStringOther, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + {`\)`, LiteralStringOther, Pop(1)}, + }, + "pseudo-class": { + {`[\w-]+`, NameDecorator, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + Default(Pop(1)), + }, + "class": { + {`[\w-]+`, NameClass, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + Default(Pop(1)), + }, + "id": { + {`[\w-]+`, NameNamespace, nil}, + {`#\{`, LiteralStringInterpol, Push("interpolation")}, + Default(Pop(1)), + }, + "for": { + {`(from|to|through)`, OperatorWord, nil}, + Include("value"), + }, + "each": { + {`in`, OperatorWord, nil}, + Include("value"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/sieve.go b/vendor/github.com/alecthomas/chroma/lexers/s/sieve.go new file mode 100644 index 0000000..ff5edf9 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/sieve.go @@ -0,0 +1,37 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Sieve lexer. +var Sieve = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Sieve", + Aliases: []string{"sieve"}, + Filenames: []string{"*.siv", "*.sieve"}, + MimeTypes: []string{}, + }, + func() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`[();,{}\[\]]`, Punctuation, nil}, + {`(?i)require`, KeywordNamespace, nil}, + {`(?i)(:)(addresses|all|contains|content|create|copy|comparator|count|days|detail|domain|fcc|flags|from|handle|importance|is|localpart|length|lowerfirst|lower|matches|message|mime|options|over|percent|quotewildcard|raw|regex|specialuse|subject|text|under|upperfirst|upper|value)`, ByGroups(NameTag, NameTag), nil}, + {`(?i)(address|addflag|allof|anyof|body|discard|elsif|else|envelope|ereject|exists|false|fileinto|if|hasflag|header|keep|notify_method_capability|notify|not|redirect|reject|removeflag|setflag|size|spamtest|stop|string|true|vacation|virustest)`, NameBuiltin, nil}, + {`(?i)set`, KeywordDeclaration, nil}, + {`([0-9.]+)([kmgKMG])?`, ByGroups(LiteralNumber, LiteralNumber), nil}, + {`#.*$`, CommentSingle, nil}, + {`/\*.*\*/`, CommentMultiline, nil}, + {`"[^"]*?"`, LiteralString, nil}, + {`text:`, NameTag, Push("text")}, + }, + "text": { + {`[^.].*?\n`, LiteralString, nil}, + {`^\.`, Punctuation, Pop(1)}, + }, + } + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/smalltalk.go b/vendor/github.com/alecthomas/chroma/lexers/s/smalltalk.go new file mode 100644 index 0000000..b4143d0 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/smalltalk.go @@ -0,0 +1,103 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Smalltalk lexer. +var Smalltalk = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Smalltalk", + Aliases: []string{"smalltalk", "squeak", "st"}, + Filenames: []string{"*.st"}, + MimeTypes: []string{"text/x-smalltalk"}, + }, + smalltalkRules, +)) + +func smalltalkRules() Rules { + return Rules{ + "root": { + {`(<)(\w+:)(.*?)(>)`, ByGroups(Text, Keyword, Text, Text), nil}, + Include("squeak fileout"), + Include("whitespaces"), + Include("method definition"), + {`(\|)([\w\s]*)(\|)`, ByGroups(Operator, NameVariable, Operator), nil}, + Include("objects"), + {`\^|:=|_`, Operator, nil}, + {`[\]({}.;!]`, Text, nil}, + }, + "method definition": { + {`([a-zA-Z]+\w*:)(\s*)(\w+)`, ByGroups(NameFunction, Text, NameVariable), nil}, + {`^(\b[a-zA-Z]+\w*\b)(\s*)$`, ByGroups(NameFunction, Text), nil}, + {`^([-+*/\\~<>=|&!?,@%]+)(\s*)(\w+)(\s*)$`, ByGroups(NameFunction, Text, NameVariable, Text), nil}, + }, + "blockvariables": { + Include("whitespaces"), + {`(:)(\s*)(\w+)`, ByGroups(Operator, Text, NameVariable), nil}, + {`\|`, Operator, Pop(1)}, + Default(Pop(1)), + }, + "literals": { + {`'(''|[^'])*'`, LiteralString, Push("afterobject")}, + {`\$.`, LiteralStringChar, Push("afterobject")}, + {`#\(`, LiteralStringSymbol, Push("parenth")}, + {`\)`, Text, Push("afterobject")}, + {`(\d+r)?-?\d+(\.\d+)?(e-?\d+)?`, LiteralNumber, Push("afterobject")}, + }, + "_parenth_helper": { + Include("whitespaces"), + {`(\d+r)?-?\d+(\.\d+)?(e-?\d+)?`, LiteralNumber, nil}, + {`[-+*/\\~<>=|&#!?,@%\w:]+`, LiteralStringSymbol, nil}, + {`'(''|[^'])*'`, LiteralString, nil}, + {`\$.`, LiteralStringChar, nil}, + {`#*\(`, LiteralStringSymbol, Push("inner_parenth")}, + }, + "parenth": { + {`\)`, LiteralStringSymbol, Push("root", "afterobject")}, + Include("_parenth_helper"), + }, + "inner_parenth": { + {`\)`, LiteralStringSymbol, Pop(1)}, + Include("_parenth_helper"), + }, + "whitespaces": { + {`\s+`, Text, nil}, + {`"(""|[^"])*"`, Comment, nil}, + }, + "objects": { + {`\[`, Text, Push("blockvariables")}, + {`\]`, Text, Push("afterobject")}, + {`\b(self|super|true|false|nil|thisContext)\b`, NameBuiltinPseudo, Push("afterobject")}, + {`\b[A-Z]\w*(?!:)\b`, NameClass, Push("afterobject")}, + {`\b[a-z]\w*(?!:)\b`, NameVariable, Push("afterobject")}, + {`#("(""|[^"])*"|[-+*/\\~<>=|&!?,@%]+|[\w:]+)`, LiteralStringSymbol, Push("afterobject")}, + Include("literals"), + }, + "afterobject": { + {`! !$`, Keyword, Pop(1)}, + Include("whitespaces"), + {`\b(ifTrue:|ifFalse:|whileTrue:|whileFalse:|timesRepeat:)`, NameBuiltin, Pop(1)}, + {`\b(new\b(?!:))`, NameBuiltin, nil}, + {`:=|_`, Operator, Pop(1)}, + {`\b[a-zA-Z]+\w*:`, NameFunction, Pop(1)}, + {`\b[a-zA-Z]+\w*`, NameFunction, nil}, + {`\w+:?|[-+*/\\~<>=|&!?,@%]+`, NameFunction, Pop(1)}, + {`\.`, Punctuation, Pop(1)}, + {`;`, Punctuation, nil}, + {`[\])}]`, Text, nil}, + {`[\[({]`, Text, Pop(1)}, + }, + "squeak fileout": { + {`^"(""|[^"])*"!`, Keyword, nil}, + {`^'(''|[^'])*'!`, Keyword, nil}, + {`^(!)(\w+)( commentStamp: )(.*?)( prior: .*?!\n)(.*?)(!)`, ByGroups(Keyword, NameClass, Keyword, LiteralString, Keyword, Text, Keyword), nil}, + {`^(!)(\w+(?: class)?)( methodsFor: )('(?:''|[^'])*')(.*?!)`, ByGroups(Keyword, NameClass, Keyword, LiteralString, Keyword), nil}, + {`^(\w+)( subclass: )(#\w+)(\s+instanceVariableNames: )(.*?)(\s+classVariableNames: )(.*?)(\s+poolDictionaries: )(.*?)(\s+category: )(.*?)(!)`, ByGroups(NameClass, Keyword, LiteralStringSymbol, Keyword, LiteralString, Keyword, LiteralString, Keyword, LiteralString, Keyword, LiteralString, Keyword), nil}, + {`^(\w+(?: class)?)(\s+instanceVariableNames: )(.*?)(!)`, ByGroups(NameClass, Keyword, LiteralString, Keyword), nil}, + {`(!\n)(\].*)(! !)$`, ByGroups(Keyword, Text, Keyword), nil}, + {`! !$`, Keyword, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/smarty.go b/vendor/github.com/alecthomas/chroma/lexers/s/smarty.go new file mode 100644 index 0000000..566efbb --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/smarty.go @@ -0,0 +1,44 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + . "github.com/alecthomas/chroma/lexers/circular" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Smarty lexer. +var Smarty = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Smarty", + Aliases: []string{"smarty"}, + Filenames: []string{"*.tpl"}, + MimeTypes: []string{"application/x-smarty"}, + DotAll: true, + }, + smartyRules, +)) + +func smartyRules() Rules { + return Rules{ + "root": { + {`[^{]+`, Other, nil}, + {`(\{)(\*.*?\*)(\})`, ByGroups(CommentPreproc, Comment, CommentPreproc), nil}, + {`(\{php\})(.*?)(\{/php\})`, ByGroups(CommentPreproc, Using(PHP), CommentPreproc), nil}, + {`(\{)(/?[a-zA-Z_]\w*)(\s*)`, ByGroups(CommentPreproc, NameFunction, Text), Push("smarty")}, + {`\{`, CommentPreproc, Push("smarty")}, + }, + "smarty": { + {`\s+`, Text, nil}, + {`\{`, CommentPreproc, Push()}, + {`\}`, CommentPreproc, Pop(1)}, + {`#[a-zA-Z_]\w*#`, NameVariable, nil}, + {`\$[a-zA-Z_]\w*(\.\w+)*`, NameVariable, nil}, + {`[~!%^&*()+=|\[\]:;,.<>/?@-]`, Operator, nil}, + {`(true|false|null)\b`, KeywordConstant, nil}, + {`[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?`, LiteralNumber, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + {`[a-zA-Z_]\w*`, NameAttribute, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/sml.go b/vendor/github.com/alecthomas/chroma/lexers/s/sml.go new file mode 100644 index 0000000..c795ea8 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/sml.go @@ -0,0 +1,204 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Standard ML lexer. +var StandardML = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Standard ML", + Aliases: []string{"sml"}, + Filenames: []string{"*.sml", "*.sig", "*.fun"}, + MimeTypes: []string{"text/x-standardml", "application/x-standardml"}, + }, + standardMLRules, +)) + +func standardMLRules() Rules { + return Rules{ + "whitespace": { + {`\s+`, Text, nil}, + {`\(\*`, CommentMultiline, Push("comment")}, + }, + "delimiters": { + {`\(|\[|\{`, Punctuation, Push("main")}, + {`\)|\]|\}`, Punctuation, Pop(1)}, + {`\b(let|if|local)\b(?!\')`, KeywordReserved, Push("main", "main")}, + {`\b(struct|sig|while)\b(?!\')`, KeywordReserved, Push("main")}, + {`\b(do|else|end|in|then)\b(?!\')`, KeywordReserved, Pop(1)}, + }, + "core": { + {`(_|\}|\{|\)|;|,|\[|\(|\]|\.\.\.)`, Punctuation, nil}, + {`#"`, LiteralStringChar, Push("char")}, + {`"`, LiteralStringDouble, Push("string")}, + {`~?0x[0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`0wx[0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`0w\d+`, LiteralNumberInteger, nil}, + {`~?\d+\.\d+[eE]~?\d+`, LiteralNumberFloat, nil}, + {`~?\d+\.\d+`, LiteralNumberFloat, nil}, + {`~?\d+[eE]~?\d+`, LiteralNumberFloat, nil}, + {`~?\d+`, LiteralNumberInteger, nil}, + {`#\s*[1-9][0-9]*`, NameLabel, nil}, + {`#\s*([a-zA-Z][\w']*)`, NameLabel, nil}, + {"#\\s+([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", NameLabel, nil}, + {`\b(datatype|abstype)\b(?!\')`, KeywordReserved, Push("dname")}, + {`(?=\b(exception)\b(?!\'))`, Text, Push("ename")}, + {`\b(functor|include|open|signature|structure)\b(?!\')`, KeywordReserved, Push("sname")}, + {`\b(type|eqtype)\b(?!\')`, KeywordReserved, Push("tname")}, + {`\'[\w\']*`, NameDecorator, nil}, + {`([a-zA-Z][\w']*)(\.)`, NameNamespace, Push("dotted")}, + {`\b(abstype|and|andalso|as|case|datatype|do|else|end|exception|fn|fun|handle|if|in|infix|infixr|let|local|nonfix|of|op|open|orelse|raise|rec|then|type|val|with|withtype|while|eqtype|functor|include|sharing|sig|signature|struct|structure|where)\b`, KeywordReserved, nil}, + {`([a-zA-Z][\w']*)`, Name, nil}, + {`\b(:|\|,=|=>|->|#|:>)\b`, KeywordReserved, nil}, + {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", Name, nil}, + }, + "dotted": { + {`([a-zA-Z][\w']*)(\.)`, NameNamespace, nil}, + // ignoring reserved words + {`([a-zA-Z][\w']*)`, Name, Pop(1)}, + // ignoring reserved words + {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", Name, Pop(1)}, + {`\s+`, Error, nil}, + {`\S+`, Error, nil}, + }, + "root": { + Default(Push("main")), + }, + "main": { + Include("whitespace"), + {`\b(val|and)\b(?!\')`, KeywordReserved, Push("vname")}, + {`\b(fun)\b(?!\')`, KeywordReserved, Push("#pop", "main-fun", "fname")}, + Include("delimiters"), + Include("core"), + {`\S+`, Error, nil}, + }, + "main-fun": { + Include("whitespace"), + {`\s`, Text, nil}, + {`\(\*`, CommentMultiline, Push("comment")}, + {`\b(fun|and)\b(?!\')`, KeywordReserved, Push("fname")}, + {`\b(val)\b(?!\')`, KeywordReserved, Push("#pop", "main", "vname")}, + {`\|`, Punctuation, Push("fname")}, + {`\b(case|handle)\b(?!\')`, KeywordReserved, Push("#pop", "main")}, + Include("delimiters"), + Include("core"), + {`\S+`, Error, nil}, + }, + "char": { + {`[^"\\]`, LiteralStringChar, nil}, + {`\\[\\"abtnvfr]`, LiteralStringEscape, nil}, + {`\\\^[\x40-\x5e]`, LiteralStringEscape, nil}, + {`\\[0-9]{3}`, LiteralStringEscape, nil}, + {`\\u[0-9a-fA-F]{4}`, LiteralStringEscape, nil}, + {`\\\s+\\`, LiteralStringInterpol, nil}, + {`"`, LiteralStringChar, Pop(1)}, + }, + "string": { + {`[^"\\]`, LiteralStringDouble, nil}, + {`\\[\\"abtnvfr]`, LiteralStringEscape, nil}, + {`\\\^[\x40-\x5e]`, LiteralStringEscape, nil}, + {`\\[0-9]{3}`, LiteralStringEscape, nil}, + {`\\u[0-9a-fA-F]{4}`, LiteralStringEscape, nil}, + {`\\\s+\\`, LiteralStringInterpol, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + "breakout": { + {`(?=\b(where|do|handle|if|sig|op|while|case|as|else|signature|andalso|struct|infixr|functor|in|structure|then|local|rec|end|fun|of|orelse|val|include|fn|with|exception|let|and|infix|sharing|datatype|type|abstype|withtype|eqtype|nonfix|raise|open)\b(?!\'))`, Text, Pop(1)}, + }, + "sname": { + Include("whitespace"), + Include("breakout"), + {`([a-zA-Z][\w']*)`, NameNamespace, nil}, + Default(Pop(1)), + }, + "fname": { + Include("whitespace"), + {`\'[\w\']*`, NameDecorator, nil}, + {`\(`, Punctuation, Push("tyvarseq")}, + {`([a-zA-Z][\w']*)`, NameFunction, Pop(1)}, + {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", NameFunction, Pop(1)}, + Default(Pop(1)), + }, + "vname": { + Include("whitespace"), + {`\'[\w\']*`, NameDecorator, nil}, + {`\(`, Punctuation, Push("tyvarseq")}, + {"([a-zA-Z][\\w']*)(\\s*)(=(?![!%&$#+\\-/:<=>?@\\\\~`^|*]+))", ByGroups(NameVariable, Text, Punctuation), Pop(1)}, + {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)(\\s*)(=(?![!%&$#+\\-/:<=>?@\\\\~`^|*]+))", ByGroups(NameVariable, Text, Punctuation), Pop(1)}, + {`([a-zA-Z][\w']*)`, NameVariable, Pop(1)}, + {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", NameVariable, Pop(1)}, + Default(Pop(1)), + }, + "tname": { + Include("whitespace"), + Include("breakout"), + {`\'[\w\']*`, NameDecorator, nil}, + {`\(`, Punctuation, Push("tyvarseq")}, + {"=(?![!%&$#+\\-/:<=>?@\\\\~`^|*]+)", Punctuation, Push("#pop", "typbind")}, + {`([a-zA-Z][\w']*)`, KeywordType, nil}, + {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", KeywordType, nil}, + {`\S+`, Error, Pop(1)}, + }, + "typbind": { + Include("whitespace"), + {`\b(and)\b(?!\')`, KeywordReserved, Push("#pop", "tname")}, + Include("breakout"), + Include("core"), + {`\S+`, Error, Pop(1)}, + }, + "dname": { + Include("whitespace"), + Include("breakout"), + {`\'[\w\']*`, NameDecorator, nil}, + {`\(`, Punctuation, Push("tyvarseq")}, + {`(=)(\s*)(datatype)`, ByGroups(Punctuation, Text, KeywordReserved), Pop(1)}, + {"=(?![!%&$#+\\-/:<=>?@\\\\~`^|*]+)", Punctuation, Push("#pop", "datbind", "datcon")}, + {`([a-zA-Z][\w']*)`, KeywordType, nil}, + {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", KeywordType, nil}, + {`\S+`, Error, Pop(1)}, + }, + "datbind": { + Include("whitespace"), + {`\b(and)\b(?!\')`, KeywordReserved, Push("#pop", "dname")}, + {`\b(withtype)\b(?!\')`, KeywordReserved, Push("#pop", "tname")}, + {`\b(of)\b(?!\')`, KeywordReserved, nil}, + {`(\|)(\s*)([a-zA-Z][\w']*)`, ByGroups(Punctuation, Text, NameClass), nil}, + {"(\\|)(\\s+)([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", ByGroups(Punctuation, Text, NameClass), nil}, + Include("breakout"), + Include("core"), + {`\S+`, Error, nil}, + }, + "ename": { + Include("whitespace"), + {`(exception|and)\b(\s+)([a-zA-Z][\w']*)`, ByGroups(KeywordReserved, Text, NameClass), nil}, + {"(exception|and)\\b(\\s*)([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", ByGroups(KeywordReserved, Text, NameClass), nil}, + {`\b(of)\b(?!\')`, KeywordReserved, nil}, + Include("breakout"), + Include("core"), + {`\S+`, Error, nil}, + }, + "datcon": { + Include("whitespace"), + {`([a-zA-Z][\w']*)`, NameClass, Pop(1)}, + {"([!%&$#+\\-/:<=>?@\\\\~`^|*]+)", NameClass, Pop(1)}, + {`\S+`, Error, Pop(1)}, + }, + "tyvarseq": { + {`\s`, Text, nil}, + {`\(\*`, CommentMultiline, Push("comment")}, + {`\'[\w\']*`, NameDecorator, nil}, + {`[a-zA-Z][\w']*`, Name, nil}, + {`,`, Punctuation, nil}, + {`\)`, Punctuation, Pop(1)}, + {"[!%&$#+\\-/:<=>?@\\\\~`^|*]+", Name, nil}, + }, + "comment": { + {`[^(*)]`, CommentMultiline, nil}, + {`\(\*`, CommentMultiline, Push()}, + {`\*\)`, CommentMultiline, Pop(1)}, + {`[(*)]`, CommentMultiline, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/snobol.go b/vendor/github.com/alecthomas/chroma/lexers/s/snobol.go new file mode 100644 index 0000000..4529034 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/snobol.go @@ -0,0 +1,52 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Snobol lexer. +var Snobol = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Snobol", + Aliases: []string{"snobol"}, + Filenames: []string{"*.snobol"}, + MimeTypes: []string{"text/x-snobol"}, + }, + snobolRules, +)) + +func snobolRules() Rules { + return Rules{ + "root": { + {`\*.*\n`, Comment, nil}, + {`[+.] `, Punctuation, Push("statement")}, + {`-.*\n`, Comment, nil}, + {`END\s*\n`, NameLabel, Push("heredoc")}, + {`[A-Za-z$][\w$]*`, NameLabel, Push("statement")}, + {`\s+`, Text, Push("statement")}, + }, + "statement": { + {`\s*\n`, Text, Pop(1)}, + {`\s+`, Text, nil}, + {`(?<=[^\w.])(LT|LE|EQ|NE|GE|GT|INTEGER|IDENT|DIFFER|LGT|SIZE|REPLACE|TRIM|DUPL|REMDR|DATE|TIME|EVAL|APPLY|OPSYN|LOAD|UNLOAD|LEN|SPAN|BREAK|ANY|NOTANY|TAB|RTAB|REM|POS|RPOS|FAIL|FENCE|ABORT|ARB|ARBNO|BAL|SUCCEED|INPUT|OUTPUT|TERMINAL)(?=[^\w.])`, NameBuiltin, nil}, + {`[A-Za-z][\w.]*`, Name, nil}, + {`\*\*|[?$.!%*/#+\-@|&\\=]`, Operator, nil}, + {`"[^"]*"`, LiteralString, nil}, + {`'[^']*'`, LiteralString, nil}, + {`[0-9]+(?=[^.EeDd])`, LiteralNumberInteger, nil}, + {`[0-9]+(\.[0-9]*)?([EDed][-+]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`:`, Punctuation, Push("goto")}, + {`[()<>,;]`, Punctuation, nil}, + }, + "goto": { + {`\s*\n`, Text, Pop(2)}, + {`\s+`, Text, nil}, + {`F|S`, Keyword, nil}, + {`(\()([A-Za-z][\w.]*)(\))`, ByGroups(Punctuation, NameLabel, Punctuation), nil}, + }, + "heredoc": { + {`.*\n`, LiteralStringHeredoc, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/solidity.go b/vendor/github.com/alecthomas/chroma/lexers/s/solidity.go new file mode 100644 index 0000000..62a3a40 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/solidity.go @@ -0,0 +1,118 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Solidity lexer. +var Solidity = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Solidity", + Aliases: []string{"sol", "solidity"}, + Filenames: []string{"*.sol"}, + MimeTypes: []string{}, + DotAll: true, + }, + solidityRules, +)) + +func solidityRules() Rules { + return Rules{ + "assembly": { + Include("comments"), + Include("numbers"), + Include("strings"), + Include("whitespace"), + {`\{`, Punctuation, Push()}, + {`\}`, Punctuation, Pop(1)}, + {`[(),]`, Punctuation, nil}, + {`:=|=:`, Operator, nil}, + {`(let)(\s*)(\w*\b)`, ByGroups(OperatorWord, Text, NameVariable), nil}, + {`(\w*\b)(\:[^=])`, ByGroups(NameLabel, Punctuation), nil}, + {`(stop|add|mul|sub|div|sdiv|mod|smod|addmod|mulmod|exp|signextend|lt|gt|slt|sgt|eq|iszero|and|or|xor|not|byte|keccak256|sha3|address|balance|origin|caller|callvalue|calldataload|calldatasize|calldatacopy|codesize|codecopy|gasprice|extcodesize|extcodecopy|blockhash|coinbase|timestamp|number|difficulty|gaslimit|pop|mload|mstore|mstore8|sload|sstore|for|switch|jump|jumpi|pc|msize|gas|jumpdest|push1|push2|push32|dup1|dup2|dup16|swap1|swap2|swap16|log0|log1|log4|create|call|callcode|return|delegatecall|suicide|returndatasize|returndatacopy|staticcall|revert|invalid)\b`, NameFunction, nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + }, + "comments": { + {`//([\w\W]*?\n)`, CommentSingle, nil}, + {`/[*][\w\W]*?[*]/`, CommentMultiline, nil}, + {`/[*][\w\W]*`, CommentMultiline, nil}, + }, + "keywords-other": { + {Words(``, `\b`, `for`, `in`, `while`, `do`, `break`, `return`, `returns`, `continue`, `if`, `else`, `try`, `catch`, `throw`, `_`, `new`, `delete`, `is`, `as`, `from`, `memory`, `storage`), Keyword, nil}, + {`assembly\b`, Keyword, Push("assembly")}, + {`(contract|interface|enum|event|struct)(\s+)([a-zA-Z_]\w*)`, ByGroups(KeywordDeclaration, Text, NameClass), nil}, + {`(function|modifier)(\s+)([a-zA-Z_]\w*)`, ByGroups(KeywordDeclaration, Text, NameFunction), nil}, + {Words(``, `\b`, `contract`, `interface`, `enum`, `event`, `constructor`, `function`, `library`, `mapping`, `modifier`, `struct`, `var`), KeywordDeclaration, nil}, + {Words(``, `\b`, `abstract`, `external`, `internal`, `private`, `public`), Keyword, nil}, + {Words(``, `\b`, `anonymous`, `constant`, `immutable`, `indexed`, `override`, `payable`, `pure`, `view`, `virtual`), Keyword, nil}, + {`(import|using)\b`, KeywordNamespace, nil}, + {`pragma (solidity|experimental)\b`, Keyword, nil}, + {Words(``, `\b`, `after`, `alias`, `apply`, `auto`, `case`, `copyof`, `default`, `define`, `final`, `implements`, `inline`, `let`, `macro`, `match`, `mutable`, `null`, `of`, `partial`, `promise`, `reference`, `relocatable`, `sealed`, `sizeof`, `static`, `supports`, `switch`, `typedef`, `typeof`, `unchecked`), KeywordReserved, nil}, + {`(true|false)\b`, KeywordConstant, nil}, + {`(wei|finney|szabo|ether)\b`, KeywordConstant, nil}, + {`(seconds|minutes|hours|days|weeks|years)\b`, KeywordConstant, nil}, + }, + "keywords-types": { + {Words(``, `\b`, `address`, `bool`, `byte`, `bytes`, `int`, `fixed`, `string`, `ufixed`, `uint`), KeywordType, nil}, + {Words(``, `\b`, `int8`, `int16`, `int24`, `int32`, `int40`, `int48`, `int56`, `int64`, `int72`, `int80`, `int88`, `int96`, `int104`, `int112`, `int120`, `int128`, `int136`, `int144`, `int152`, `int160`, `int168`, `int176`, `int184`, `int192`, `int200`, `int208`, `int216`, `int224`, `int232`, `int240`, `int248`, `int256`), KeywordType, nil}, + {Words(``, `\b`, `uint8`, `uint16`, `uint24`, `uint32`, `uint40`, `uint48`, `uint56`, `uint64`, `uint72`, `uint80`, `uint88`, `uint96`, `uint104`, `uint112`, `uint120`, `uint128`, `uint136`, `uint144`, `uint152`, `uint160`, `uint168`, `uint176`, `uint184`, `uint192`, `uint200`, `uint208`, `uint216`, `uint224`, `uint232`, `uint240`, `uint248`, `uint256`), KeywordType, nil}, + {Words(``, `\b`, `bytes1`, `bytes2`, `bytes3`, `bytes4`, `bytes5`, `bytes6`, `bytes7`, `bytes8`, `bytes9`, `bytes10`, `bytes11`, `bytes12`, `bytes13`, `bytes14`, `bytes15`, `bytes16`, `bytes17`, `bytes18`, `bytes19`, `bytes20`, `bytes21`, `bytes22`, `bytes23`, `bytes24`, `bytes25`, `bytes26`, `bytes27`, `bytes28`, `bytes29`, `bytes30`, `bytes31`, `bytes32`), KeywordType, nil}, + {Words(``, `\b`, `fixed8x0`, `fixed8x1`, `fixed8x2`, `fixed8x3`, `fixed8x4`, `fixed8x5`, `fixed8x6`, `fixed8x7`, `fixed8x8`, `fixed8x9`, `fixed8x10`, `fixed8x11`, `fixed8x12`, `fixed8x13`, `fixed8x14`, `fixed8x15`, `fixed8x16`, `fixed8x17`, `fixed8x18`, `fixed8x19`, `fixed8x20`, `fixed8x21`, `fixed8x22`, `fixed8x23`, `fixed8x24`, `fixed8x25`, `fixed8x26`, `fixed8x27`, `fixed8x28`, `fixed8x29`, `fixed8x30`, `fixed8x31`, `fixed8x32`, `fixed8x33`, `fixed8x34`, `fixed8x35`, `fixed8x36`, `fixed8x37`, `fixed8x38`, `fixed8x39`, `fixed8x40`, `fixed8x41`, `fixed8x42`, `fixed8x43`, `fixed8x44`, `fixed8x45`, `fixed8x46`, `fixed8x47`, `fixed8x48`, `fixed8x49`, `fixed8x50`, `fixed8x51`, `fixed8x52`, `fixed8x53`, `fixed8x54`, `fixed8x55`, `fixed8x56`, `fixed8x57`, `fixed8x58`, `fixed8x59`, `fixed8x60`, `fixed8x61`, `fixed8x62`, `fixed8x63`, `fixed8x64`, `fixed8x65`, `fixed8x66`, `fixed8x67`, `fixed8x68`, `fixed8x69`, `fixed8x70`, `fixed8x71`, `fixed8x72`, `fixed8x73`, `fixed8x74`, `fixed8x75`, `fixed8x76`, `fixed8x77`, `fixed8x78`, `fixed8x79`, `fixed8x80`, `fixed16x0`, `fixed16x1`, `fixed16x2`, `fixed16x3`, `fixed16x4`, `fixed16x5`, `fixed16x6`, `fixed16x7`, `fixed16x8`, `fixed16x9`, `fixed16x10`, `fixed16x11`, `fixed16x12`, `fixed16x13`, `fixed16x14`, `fixed16x15`, `fixed16x16`, `fixed16x17`, `fixed16x18`, `fixed16x19`, `fixed16x20`, `fixed16x21`, `fixed16x22`, `fixed16x23`, `fixed16x24`, `fixed16x25`, `fixed16x26`, `fixed16x27`, `fixed16x28`, `fixed16x29`, `fixed16x30`, `fixed16x31`, `fixed16x32`, `fixed16x33`, `fixed16x34`, `fixed16x35`, `fixed16x36`, `fixed16x37`, `fixed16x38`, `fixed16x39`, `fixed16x40`, `fixed16x41`, `fixed16x42`, `fixed16x43`, `fixed16x44`, `fixed16x45`, `fixed16x46`, `fixed16x47`, `fixed16x48`, `fixed16x49`, `fixed16x50`, `fixed16x51`, `fixed16x52`, `fixed16x53`, `fixed16x54`, `fixed16x55`, `fixed16x56`, `fixed16x57`, `fixed16x58`, `fixed16x59`, `fixed16x60`, `fixed16x61`, `fixed16x62`, `fixed16x63`, `fixed16x64`, `fixed16x65`, `fixed16x66`, `fixed16x67`, `fixed16x68`, `fixed16x69`, `fixed16x70`, `fixed16x71`, `fixed16x72`, `fixed16x73`, `fixed16x74`, `fixed16x75`, `fixed16x76`, `fixed16x77`, `fixed16x78`, `fixed16x79`, `fixed16x80`, `fixed24x0`, `fixed24x1`, `fixed24x2`, `fixed24x3`, `fixed24x4`, `fixed24x5`, `fixed24x6`, `fixed24x7`, `fixed24x8`, `fixed24x9`, `fixed24x10`, `fixed24x11`, `fixed24x12`, `fixed24x13`, `fixed24x14`, `fixed24x15`, `fixed24x16`, `fixed24x17`, `fixed24x18`, `fixed24x19`, `fixed24x20`, `fixed24x21`, `fixed24x22`, `fixed24x23`, `fixed24x24`, `fixed24x25`, `fixed24x26`, `fixed24x27`, `fixed24x28`, `fixed24x29`, `fixed24x30`, `fixed24x31`, `fixed24x32`, `fixed24x33`, `fixed24x34`, `fixed24x35`, `fixed24x36`, `fixed24x37`, `fixed24x38`, `fixed24x39`, `fixed24x40`, `fixed24x41`, `fixed24x42`, `fixed24x43`, `fixed24x44`, `fixed24x45`, `fixed24x46`, `fixed24x47`, `fixed24x48`, `fixed24x49`, `fixed24x50`, `fixed24x51`, `fixed24x52`, `fixed24x53`, `fixed24x54`, `fixed24x55`, `fixed24x56`, `fixed24x57`, `fixed24x58`, `fixed24x59`, `fixed24x60`, `fixed24x61`, `fixed24x62`, `fixed24x63`, `fixed24x64`, `fixed24x65`, `fixed24x66`, `fixed24x67`, `fixed24x68`, `fixed24x69`, `fixed24x70`, `fixed24x71`, `fixed24x72`, `fixed24x73`, `fixed24x74`, `fixed24x75`, `fixed24x76`, `fixed24x77`, `fixed24x78`, `fixed24x79`, `fixed24x80`, `fixed32x0`, `fixed32x1`, `fixed32x2`, `fixed32x3`, `fixed32x4`, `fixed32x5`, `fixed32x6`, `fixed32x7`, `fixed32x8`, `fixed32x9`, `fixed32x10`, `fixed32x11`, `fixed32x12`, `fixed32x13`, `fixed32x14`, `fixed32x15`, `fixed32x16`, `fixed32x17`, `fixed32x18`, `fixed32x19`, `fixed32x20`, `fixed32x21`, `fixed32x22`, `fixed32x23`, `fixed32x24`, `fixed32x25`, `fixed32x26`, `fixed32x27`, `fixed32x28`, `fixed32x29`, `fixed32x30`, `fixed32x31`, `fixed32x32`, `fixed32x33`, `fixed32x34`, `fixed32x35`, `fixed32x36`, `fixed32x37`, `fixed32x38`, `fixed32x39`, `fixed32x40`, `fixed32x41`, `fixed32x42`, `fixed32x43`, `fixed32x44`, `fixed32x45`, `fixed32x46`, `fixed32x47`, `fixed32x48`, `fixed32x49`, `fixed32x50`, `fixed32x51`, `fixed32x52`, `fixed32x53`, `fixed32x54`, `fixed32x55`, `fixed32x56`, `fixed32x57`, `fixed32x58`, `fixed32x59`, `fixed32x60`, `fixed32x61`, `fixed32x62`, `fixed32x63`, `fixed32x64`, `fixed32x65`, `fixed32x66`, `fixed32x67`, `fixed32x68`, `fixed32x69`, `fixed32x70`, `fixed32x71`, `fixed32x72`, `fixed32x73`, `fixed32x74`, `fixed32x75`, `fixed32x76`, `fixed32x77`, `fixed32x78`, `fixed32x79`, `fixed32x80`, `fixed40x0`, `fixed40x1`, `fixed40x2`, `fixed40x3`, `fixed40x4`, `fixed40x5`, `fixed40x6`, `fixed40x7`, `fixed40x8`, `fixed40x9`, `fixed40x10`, `fixed40x11`, `fixed40x12`, `fixed40x13`, `fixed40x14`, `fixed40x15`, `fixed40x16`, `fixed40x17`, `fixed40x18`, `fixed40x19`, `fixed40x20`, `fixed40x21`, `fixed40x22`, `fixed40x23`, `fixed40x24`, `fixed40x25`, `fixed40x26`, `fixed40x27`, `fixed40x28`, `fixed40x29`, `fixed40x30`, `fixed40x31`, `fixed40x32`, `fixed40x33`, `fixed40x34`, `fixed40x35`, `fixed40x36`, `fixed40x37`, `fixed40x38`, `fixed40x39`, `fixed40x40`, `fixed40x41`, `fixed40x42`, `fixed40x43`, `fixed40x44`, `fixed40x45`, `fixed40x46`, `fixed40x47`, `fixed40x48`, `fixed40x49`, `fixed40x50`, `fixed40x51`, `fixed40x52`, `fixed40x53`, `fixed40x54`, `fixed40x55`, `fixed40x56`, `fixed40x57`, `fixed40x58`, `fixed40x59`, `fixed40x60`, `fixed40x61`, `fixed40x62`, `fixed40x63`, `fixed40x64`, `fixed40x65`, `fixed40x66`, `fixed40x67`, `fixed40x68`, `fixed40x69`, `fixed40x70`, `fixed40x71`, `fixed40x72`, `fixed40x73`, `fixed40x74`, `fixed40x75`, `fixed40x76`, `fixed40x77`, `fixed40x78`, `fixed40x79`, `fixed40x80`, `fixed48x0`, `fixed48x1`, `fixed48x2`, `fixed48x3`, `fixed48x4`, `fixed48x5`, `fixed48x6`, `fixed48x7`, `fixed48x8`, `fixed48x9`, `fixed48x10`, `fixed48x11`, `fixed48x12`, `fixed48x13`, `fixed48x14`, `fixed48x15`, `fixed48x16`, `fixed48x17`, `fixed48x18`, `fixed48x19`, `fixed48x20`, `fixed48x21`, `fixed48x22`, `fixed48x23`, `fixed48x24`, `fixed48x25`, `fixed48x26`, `fixed48x27`, `fixed48x28`, `fixed48x29`, `fixed48x30`, `fixed48x31`, `fixed48x32`, `fixed48x33`, `fixed48x34`, `fixed48x35`, `fixed48x36`, `fixed48x37`, `fixed48x38`, `fixed48x39`, `fixed48x40`, `fixed48x41`, `fixed48x42`, `fixed48x43`, `fixed48x44`, `fixed48x45`, `fixed48x46`, `fixed48x47`, `fixed48x48`, `fixed48x49`, `fixed48x50`, `fixed48x51`, `fixed48x52`, `fixed48x53`, `fixed48x54`, `fixed48x55`, `fixed48x56`, `fixed48x57`, `fixed48x58`, `fixed48x59`, `fixed48x60`, `fixed48x61`, `fixed48x62`, `fixed48x63`, `fixed48x64`, `fixed48x65`, `fixed48x66`, `fixed48x67`, `fixed48x68`, `fixed48x69`, `fixed48x70`, `fixed48x71`, `fixed48x72`, `fixed48x73`, `fixed48x74`, `fixed48x75`, `fixed48x76`, `fixed48x77`, `fixed48x78`, `fixed48x79`, `fixed48x80`, `fixed56x0`, `fixed56x1`, `fixed56x2`, `fixed56x3`, `fixed56x4`, `fixed56x5`, `fixed56x6`, `fixed56x7`, `fixed56x8`, `fixed56x9`, `fixed56x10`, `fixed56x11`, `fixed56x12`, `fixed56x13`, `fixed56x14`, `fixed56x15`, `fixed56x16`, `fixed56x17`, `fixed56x18`, `fixed56x19`, `fixed56x20`, `fixed56x21`, `fixed56x22`, `fixed56x23`, `fixed56x24`, `fixed56x25`, `fixed56x26`, `fixed56x27`, `fixed56x28`, `fixed56x29`, `fixed56x30`, `fixed56x31`, `fixed56x32`, `fixed56x33`, `fixed56x34`, `fixed56x35`, `fixed56x36`, `fixed56x37`, `fixed56x38`, `fixed56x39`, `fixed56x40`, `fixed56x41`, `fixed56x42`, `fixed56x43`, `fixed56x44`, `fixed56x45`, `fixed56x46`, `fixed56x47`, `fixed56x48`, `fixed56x49`, `fixed56x50`, `fixed56x51`, `fixed56x52`, `fixed56x53`, `fixed56x54`, `fixed56x55`, `fixed56x56`, `fixed56x57`, `fixed56x58`, `fixed56x59`, `fixed56x60`, `fixed56x61`, `fixed56x62`, `fixed56x63`, `fixed56x64`, `fixed56x65`, `fixed56x66`, `fixed56x67`, `fixed56x68`, `fixed56x69`, `fixed56x70`, `fixed56x71`, `fixed56x72`, `fixed56x73`, `fixed56x74`, `fixed56x75`, `fixed56x76`, `fixed56x77`, `fixed56x78`, `fixed56x79`, `fixed56x80`, `fixed64x0`, `fixed64x1`, `fixed64x2`, `fixed64x3`, `fixed64x4`, `fixed64x5`, `fixed64x6`, `fixed64x7`, `fixed64x8`, `fixed64x9`, `fixed64x10`, `fixed64x11`, `fixed64x12`, `fixed64x13`, `fixed64x14`, `fixed64x15`, `fixed64x16`, `fixed64x17`, `fixed64x18`, `fixed64x19`, `fixed64x20`, `fixed64x21`, `fixed64x22`, `fixed64x23`, `fixed64x24`, `fixed64x25`, `fixed64x26`, `fixed64x27`, `fixed64x28`, `fixed64x29`, `fixed64x30`, `fixed64x31`, `fixed64x32`, `fixed64x33`, `fixed64x34`, `fixed64x35`, `fixed64x36`, `fixed64x37`, `fixed64x38`, `fixed64x39`, `fixed64x40`, `fixed64x41`, `fixed64x42`, `fixed64x43`, `fixed64x44`, `fixed64x45`, `fixed64x46`, `fixed64x47`, `fixed64x48`, `fixed64x49`, `fixed64x50`, `fixed64x51`, `fixed64x52`, `fixed64x53`, `fixed64x54`, `fixed64x55`, `fixed64x56`, `fixed64x57`, `fixed64x58`, `fixed64x59`, `fixed64x60`, `fixed64x61`, `fixed64x62`, `fixed64x63`, `fixed64x64`, `fixed64x65`, `fixed64x66`, `fixed64x67`, `fixed64x68`, `fixed64x69`, `fixed64x70`, `fixed64x71`, `fixed64x72`, `fixed64x73`, `fixed64x74`, `fixed64x75`, `fixed64x76`, `fixed64x77`, `fixed64x78`, `fixed64x79`, `fixed64x80`, `fixed72x0`, `fixed72x1`, `fixed72x2`, `fixed72x3`, `fixed72x4`, `fixed72x5`, `fixed72x6`, `fixed72x7`, `fixed72x8`, `fixed72x9`, `fixed72x10`, `fixed72x11`, `fixed72x12`, `fixed72x13`, `fixed72x14`, `fixed72x15`, `fixed72x16`, `fixed72x17`, `fixed72x18`, `fixed72x19`, `fixed72x20`, `fixed72x21`, `fixed72x22`, `fixed72x23`, `fixed72x24`, `fixed72x25`, `fixed72x26`, `fixed72x27`, `fixed72x28`, `fixed72x29`, `fixed72x30`, `fixed72x31`, `fixed72x32`, `fixed72x33`, `fixed72x34`, `fixed72x35`, `fixed72x36`, `fixed72x37`, `fixed72x38`, `fixed72x39`, `fixed72x40`, `fixed72x41`, `fixed72x42`, `fixed72x43`, `fixed72x44`, `fixed72x45`, `fixed72x46`, `fixed72x47`, `fixed72x48`, `fixed72x49`, `fixed72x50`, `fixed72x51`, `fixed72x52`, `fixed72x53`, `fixed72x54`, `fixed72x55`, `fixed72x56`, `fixed72x57`, `fixed72x58`, `fixed72x59`, `fixed72x60`, `fixed72x61`, `fixed72x62`, `fixed72x63`, `fixed72x64`, `fixed72x65`, `fixed72x66`, `fixed72x67`, `fixed72x68`, `fixed72x69`, `fixed72x70`, `fixed72x71`, `fixed72x72`, `fixed72x73`, `fixed72x74`, `fixed72x75`, `fixed72x76`, `fixed72x77`, `fixed72x78`, `fixed72x79`, `fixed72x80`, `fixed80x0`, `fixed80x1`, `fixed80x2`, `fixed80x3`, `fixed80x4`, `fixed80x5`, `fixed80x6`, `fixed80x7`, `fixed80x8`, `fixed80x9`, `fixed80x10`, `fixed80x11`, `fixed80x12`, `fixed80x13`, `fixed80x14`, `fixed80x15`, `fixed80x16`, `fixed80x17`, `fixed80x18`, `fixed80x19`, `fixed80x20`, `fixed80x21`, `fixed80x22`, `fixed80x23`, `fixed80x24`, `fixed80x25`, `fixed80x26`, `fixed80x27`, `fixed80x28`, `fixed80x29`, `fixed80x30`, `fixed80x31`, `fixed80x32`, `fixed80x33`, `fixed80x34`, `fixed80x35`, `fixed80x36`, `fixed80x37`, `fixed80x38`, `fixed80x39`, `fixed80x40`, `fixed80x41`, `fixed80x42`, `fixed80x43`, `fixed80x44`, `fixed80x45`, `fixed80x46`, `fixed80x47`, `fixed80x48`, `fixed80x49`, `fixed80x50`, `fixed80x51`, `fixed80x52`, `fixed80x53`, `fixed80x54`, `fixed80x55`, `fixed80x56`, `fixed80x57`, `fixed80x58`, `fixed80x59`, `fixed80x60`, `fixed80x61`, `fixed80x62`, `fixed80x63`, `fixed80x64`, `fixed80x65`, `fixed80x66`, `fixed80x67`, `fixed80x68`, `fixed80x69`, `fixed80x70`, `fixed80x71`, `fixed80x72`, `fixed80x73`, `fixed80x74`, `fixed80x75`, `fixed80x76`, `fixed80x77`, `fixed80x78`, `fixed80x79`, `fixed80x80`, `fixed88x0`, `fixed88x1`, `fixed88x2`, `fixed88x3`, `fixed88x4`, `fixed88x5`, `fixed88x6`, `fixed88x7`, `fixed88x8`, `fixed88x9`, `fixed88x10`, `fixed88x11`, `fixed88x12`, `fixed88x13`, `fixed88x14`, `fixed88x15`, `fixed88x16`, `fixed88x17`, `fixed88x18`, `fixed88x19`, `fixed88x20`, `fixed88x21`, `fixed88x22`, `fixed88x23`, `fixed88x24`, `fixed88x25`, `fixed88x26`, `fixed88x27`, `fixed88x28`, `fixed88x29`, `fixed88x30`, `fixed88x31`, `fixed88x32`, `fixed88x33`, `fixed88x34`, `fixed88x35`, `fixed88x36`, `fixed88x37`, `fixed88x38`, `fixed88x39`, `fixed88x40`, `fixed88x41`, `fixed88x42`, `fixed88x43`, `fixed88x44`, `fixed88x45`, `fixed88x46`, `fixed88x47`, `fixed88x48`, `fixed88x49`, `fixed88x50`, `fixed88x51`, `fixed88x52`, `fixed88x53`, `fixed88x54`, `fixed88x55`, `fixed88x56`, `fixed88x57`, `fixed88x58`, `fixed88x59`, `fixed88x60`, `fixed88x61`, `fixed88x62`, `fixed88x63`, `fixed88x64`, `fixed88x65`, `fixed88x66`, `fixed88x67`, `fixed88x68`, `fixed88x69`, `fixed88x70`, `fixed88x71`, `fixed88x72`, `fixed88x73`, `fixed88x74`, `fixed88x75`, `fixed88x76`, `fixed88x77`, `fixed88x78`, `fixed88x79`, `fixed88x80`, `fixed96x0`, `fixed96x1`, `fixed96x2`, `fixed96x3`, `fixed96x4`, `fixed96x5`, `fixed96x6`, `fixed96x7`, `fixed96x8`, `fixed96x9`, `fixed96x10`, `fixed96x11`, `fixed96x12`, `fixed96x13`, `fixed96x14`, `fixed96x15`, `fixed96x16`, `fixed96x17`, `fixed96x18`, `fixed96x19`, `fixed96x20`, `fixed96x21`, `fixed96x22`, `fixed96x23`, `fixed96x24`, `fixed96x25`, `fixed96x26`, `fixed96x27`, `fixed96x28`, `fixed96x29`, `fixed96x30`, `fixed96x31`, `fixed96x32`, `fixed96x33`, `fixed96x34`, `fixed96x35`, `fixed96x36`, `fixed96x37`, `fixed96x38`, `fixed96x39`, `fixed96x40`, `fixed96x41`, `fixed96x42`, `fixed96x43`, `fixed96x44`, `fixed96x45`, `fixed96x46`, `fixed96x47`, `fixed96x48`, `fixed96x49`, `fixed96x50`, `fixed96x51`, `fixed96x52`, `fixed96x53`, `fixed96x54`, `fixed96x55`, `fixed96x56`, `fixed96x57`, `fixed96x58`, `fixed96x59`, `fixed96x60`, `fixed96x61`, `fixed96x62`, `fixed96x63`, `fixed96x64`, `fixed96x65`, `fixed96x66`, `fixed96x67`, `fixed96x68`, `fixed96x69`, `fixed96x70`, `fixed96x71`, `fixed96x72`, `fixed96x73`, `fixed96x74`, `fixed96x75`, `fixed96x76`, `fixed96x77`, `fixed96x78`, `fixed96x79`, `fixed96x80`, `fixed104x0`, `fixed104x1`, `fixed104x2`, `fixed104x3`, `fixed104x4`, `fixed104x5`, `fixed104x6`, `fixed104x7`, `fixed104x8`, `fixed104x9`, `fixed104x10`, `fixed104x11`, `fixed104x12`, `fixed104x13`, `fixed104x14`, `fixed104x15`, `fixed104x16`, `fixed104x17`, `fixed104x18`, `fixed104x19`, `fixed104x20`, `fixed104x21`, `fixed104x22`, `fixed104x23`, `fixed104x24`, `fixed104x25`, `fixed104x26`, `fixed104x27`, `fixed104x28`, `fixed104x29`, `fixed104x30`, `fixed104x31`, `fixed104x32`, `fixed104x33`, `fixed104x34`, `fixed104x35`, `fixed104x36`, `fixed104x37`, `fixed104x38`, `fixed104x39`, `fixed104x40`, `fixed104x41`, `fixed104x42`, `fixed104x43`, `fixed104x44`, `fixed104x45`, `fixed104x46`, `fixed104x47`, `fixed104x48`, `fixed104x49`, `fixed104x50`, `fixed104x51`, `fixed104x52`, `fixed104x53`, `fixed104x54`, `fixed104x55`, `fixed104x56`, `fixed104x57`, `fixed104x58`, `fixed104x59`, `fixed104x60`, `fixed104x61`, `fixed104x62`, `fixed104x63`, `fixed104x64`, `fixed104x65`, `fixed104x66`, `fixed104x67`, `fixed104x68`, `fixed104x69`, `fixed104x70`, `fixed104x71`, `fixed104x72`, `fixed104x73`, `fixed104x74`, `fixed104x75`, `fixed104x76`, `fixed104x77`, `fixed104x78`, `fixed104x79`, `fixed104x80`, `fixed112x0`, `fixed112x1`, `fixed112x2`, `fixed112x3`, `fixed112x4`, `fixed112x5`, `fixed112x6`, `fixed112x7`, `fixed112x8`, `fixed112x9`, `fixed112x10`, `fixed112x11`, `fixed112x12`, `fixed112x13`, `fixed112x14`, `fixed112x15`, `fixed112x16`, `fixed112x17`, `fixed112x18`, `fixed112x19`, `fixed112x20`, `fixed112x21`, `fixed112x22`, `fixed112x23`, `fixed112x24`, `fixed112x25`, `fixed112x26`, `fixed112x27`, `fixed112x28`, `fixed112x29`, `fixed112x30`, `fixed112x31`, `fixed112x32`, `fixed112x33`, `fixed112x34`, `fixed112x35`, `fixed112x36`, `fixed112x37`, `fixed112x38`, `fixed112x39`, `fixed112x40`, `fixed112x41`, `fixed112x42`, `fixed112x43`, `fixed112x44`, `fixed112x45`, `fixed112x46`, `fixed112x47`, `fixed112x48`, `fixed112x49`, `fixed112x50`, `fixed112x51`, `fixed112x52`, `fixed112x53`, `fixed112x54`, `fixed112x55`, `fixed112x56`, `fixed112x57`, `fixed112x58`, `fixed112x59`, `fixed112x60`, `fixed112x61`, `fixed112x62`, `fixed112x63`, `fixed112x64`, `fixed112x65`, `fixed112x66`, `fixed112x67`, `fixed112x68`, `fixed112x69`, `fixed112x70`, `fixed112x71`, `fixed112x72`, `fixed112x73`, `fixed112x74`, `fixed112x75`, `fixed112x76`, `fixed112x77`, `fixed112x78`, `fixed112x79`, `fixed112x80`, `fixed120x0`, `fixed120x1`, `fixed120x2`, `fixed120x3`, `fixed120x4`, `fixed120x5`, `fixed120x6`, `fixed120x7`, `fixed120x8`, `fixed120x9`, `fixed120x10`, `fixed120x11`, `fixed120x12`, `fixed120x13`, `fixed120x14`, `fixed120x15`, `fixed120x16`, `fixed120x17`, `fixed120x18`, `fixed120x19`, `fixed120x20`, `fixed120x21`, `fixed120x22`, `fixed120x23`, `fixed120x24`, `fixed120x25`, `fixed120x26`, `fixed120x27`, `fixed120x28`, `fixed120x29`, `fixed120x30`, `fixed120x31`, `fixed120x32`, `fixed120x33`, `fixed120x34`, `fixed120x35`, `fixed120x36`, `fixed120x37`, `fixed120x38`, `fixed120x39`, `fixed120x40`, `fixed120x41`, `fixed120x42`, `fixed120x43`, `fixed120x44`, `fixed120x45`, `fixed120x46`, `fixed120x47`, `fixed120x48`, `fixed120x49`, `fixed120x50`, `fixed120x51`, `fixed120x52`, `fixed120x53`, `fixed120x54`, `fixed120x55`, `fixed120x56`, `fixed120x57`, `fixed120x58`, `fixed120x59`, `fixed120x60`, `fixed120x61`, `fixed120x62`, `fixed120x63`, `fixed120x64`, `fixed120x65`, `fixed120x66`, `fixed120x67`, `fixed120x68`, `fixed120x69`, `fixed120x70`, `fixed120x71`, `fixed120x72`, `fixed120x73`, `fixed120x74`, `fixed120x75`, `fixed120x76`, `fixed120x77`, `fixed120x78`, `fixed120x79`, `fixed120x80`, `fixed128x0`, `fixed128x1`, `fixed128x2`, `fixed128x3`, `fixed128x4`, `fixed128x5`, `fixed128x6`, `fixed128x7`, `fixed128x8`, `fixed128x9`, `fixed128x10`, `fixed128x11`, `fixed128x12`, `fixed128x13`, `fixed128x14`, `fixed128x15`, `fixed128x16`, `fixed128x17`, `fixed128x18`, `fixed128x19`, `fixed128x20`, `fixed128x21`, `fixed128x22`, `fixed128x23`, `fixed128x24`, `fixed128x25`, `fixed128x26`, `fixed128x27`, `fixed128x28`, `fixed128x29`, `fixed128x30`, `fixed128x31`, `fixed128x32`, `fixed128x33`, `fixed128x34`, `fixed128x35`, `fixed128x36`, `fixed128x37`, `fixed128x38`, `fixed128x39`, `fixed128x40`, `fixed128x41`, `fixed128x42`, `fixed128x43`, `fixed128x44`, `fixed128x45`, `fixed128x46`, `fixed128x47`, `fixed128x48`, `fixed128x49`, `fixed128x50`, `fixed128x51`, `fixed128x52`, `fixed128x53`, `fixed128x54`, `fixed128x55`, `fixed128x56`, `fixed128x57`, `fixed128x58`, `fixed128x59`, `fixed128x60`, `fixed128x61`, `fixed128x62`, `fixed128x63`, `fixed128x64`, `fixed128x65`, `fixed128x66`, `fixed128x67`, `fixed128x68`, `fixed128x69`, `fixed128x70`, `fixed128x71`, `fixed128x72`, `fixed128x73`, `fixed128x74`, `fixed128x75`, `fixed128x76`, `fixed128x77`, `fixed128x78`, `fixed128x79`, `fixed128x80`, `fixed136x0`, `fixed136x1`, `fixed136x2`, `fixed136x3`, `fixed136x4`, `fixed136x5`, `fixed136x6`, `fixed136x7`, `fixed136x8`, `fixed136x9`, `fixed136x10`, `fixed136x11`, `fixed136x12`, `fixed136x13`, `fixed136x14`, `fixed136x15`, `fixed136x16`, `fixed136x17`, `fixed136x18`, `fixed136x19`, `fixed136x20`, `fixed136x21`, `fixed136x22`, `fixed136x23`, `fixed136x24`, `fixed136x25`, `fixed136x26`, `fixed136x27`, `fixed136x28`, `fixed136x29`, `fixed136x30`, `fixed136x31`, `fixed136x32`, `fixed136x33`, `fixed136x34`, `fixed136x35`, `fixed136x36`, `fixed136x37`, `fixed136x38`, `fixed136x39`, `fixed136x40`, `fixed136x41`, `fixed136x42`, `fixed136x43`, `fixed136x44`, `fixed136x45`, `fixed136x46`, `fixed136x47`, `fixed136x48`, `fixed136x49`, `fixed136x50`, `fixed136x51`, `fixed136x52`, `fixed136x53`, `fixed136x54`, `fixed136x55`, `fixed136x56`, `fixed136x57`, `fixed136x58`, `fixed136x59`, `fixed136x60`, `fixed136x61`, `fixed136x62`, `fixed136x63`, `fixed136x64`, `fixed136x65`, `fixed136x66`, `fixed136x67`, `fixed136x68`, `fixed136x69`, `fixed136x70`, `fixed136x71`, `fixed136x72`, `fixed136x73`, `fixed136x74`, `fixed136x75`, `fixed136x76`, `fixed136x77`, `fixed136x78`, `fixed136x79`, `fixed136x80`, `fixed144x0`, `fixed144x1`, `fixed144x2`, `fixed144x3`, `fixed144x4`, `fixed144x5`, `fixed144x6`, `fixed144x7`, `fixed144x8`, `fixed144x9`, `fixed144x10`, `fixed144x11`, `fixed144x12`, `fixed144x13`, `fixed144x14`, `fixed144x15`, `fixed144x16`, `fixed144x17`, `fixed144x18`, `fixed144x19`, `fixed144x20`, `fixed144x21`, `fixed144x22`, `fixed144x23`, `fixed144x24`, `fixed144x25`, `fixed144x26`, `fixed144x27`, `fixed144x28`, `fixed144x29`, `fixed144x30`, `fixed144x31`, `fixed144x32`, `fixed144x33`, `fixed144x34`, `fixed144x35`, `fixed144x36`, `fixed144x37`, `fixed144x38`, `fixed144x39`, `fixed144x40`, `fixed144x41`, `fixed144x42`, `fixed144x43`, `fixed144x44`, `fixed144x45`, `fixed144x46`, `fixed144x47`, `fixed144x48`, `fixed144x49`, `fixed144x50`, `fixed144x51`, `fixed144x52`, `fixed144x53`, `fixed144x54`, `fixed144x55`, `fixed144x56`, `fixed144x57`, `fixed144x58`, `fixed144x59`, `fixed144x60`, `fixed144x61`, `fixed144x62`, `fixed144x63`, `fixed144x64`, `fixed144x65`, `fixed144x66`, `fixed144x67`, `fixed144x68`, `fixed144x69`, `fixed144x70`, `fixed144x71`, `fixed144x72`, `fixed144x73`, `fixed144x74`, `fixed144x75`, `fixed144x76`, `fixed144x77`, `fixed144x78`, `fixed144x79`, `fixed144x80`, `fixed152x0`, `fixed152x1`, `fixed152x2`, `fixed152x3`, `fixed152x4`, `fixed152x5`, `fixed152x6`, `fixed152x7`, `fixed152x8`, `fixed152x9`, `fixed152x10`, `fixed152x11`, `fixed152x12`, `fixed152x13`, `fixed152x14`, `fixed152x15`, `fixed152x16`, `fixed152x17`, `fixed152x18`, `fixed152x19`, `fixed152x20`, `fixed152x21`, `fixed152x22`, `fixed152x23`, `fixed152x24`, `fixed152x25`, `fixed152x26`, `fixed152x27`, `fixed152x28`, `fixed152x29`, `fixed152x30`, `fixed152x31`, `fixed152x32`, `fixed152x33`, `fixed152x34`, `fixed152x35`, `fixed152x36`, `fixed152x37`, `fixed152x38`, `fixed152x39`, `fixed152x40`, `fixed152x41`, `fixed152x42`, `fixed152x43`, `fixed152x44`, `fixed152x45`, `fixed152x46`, `fixed152x47`, `fixed152x48`, `fixed152x49`, `fixed152x50`, `fixed152x51`, `fixed152x52`, `fixed152x53`, `fixed152x54`, `fixed152x55`, `fixed152x56`, `fixed152x57`, `fixed152x58`, `fixed152x59`, `fixed152x60`, `fixed152x61`, `fixed152x62`, `fixed152x63`, `fixed152x64`, `fixed152x65`, `fixed152x66`, `fixed152x67`, `fixed152x68`, `fixed152x69`, `fixed152x70`, `fixed152x71`, `fixed152x72`, `fixed152x73`, `fixed152x74`, `fixed152x75`, `fixed152x76`, `fixed152x77`, `fixed152x78`, `fixed152x79`, `fixed152x80`, `fixed160x0`, `fixed160x1`, `fixed160x2`, `fixed160x3`, `fixed160x4`, `fixed160x5`, `fixed160x6`, `fixed160x7`, `fixed160x8`, `fixed160x9`, `fixed160x10`, `fixed160x11`, `fixed160x12`, `fixed160x13`, `fixed160x14`, `fixed160x15`, `fixed160x16`, `fixed160x17`, `fixed160x18`, `fixed160x19`, `fixed160x20`, `fixed160x21`, `fixed160x22`, `fixed160x23`, `fixed160x24`, `fixed160x25`, `fixed160x26`, `fixed160x27`, `fixed160x28`, `fixed160x29`, `fixed160x30`, `fixed160x31`, `fixed160x32`, `fixed160x33`, `fixed160x34`, `fixed160x35`, `fixed160x36`, `fixed160x37`, `fixed160x38`, `fixed160x39`, `fixed160x40`, `fixed160x41`, `fixed160x42`, `fixed160x43`, `fixed160x44`, `fixed160x45`, `fixed160x46`, `fixed160x47`, `fixed160x48`, `fixed160x49`, `fixed160x50`, `fixed160x51`, `fixed160x52`, `fixed160x53`, `fixed160x54`, `fixed160x55`, `fixed160x56`, `fixed160x57`, `fixed160x58`, `fixed160x59`, `fixed160x60`, `fixed160x61`, `fixed160x62`, `fixed160x63`, `fixed160x64`, `fixed160x65`, `fixed160x66`, `fixed160x67`, `fixed160x68`, `fixed160x69`, `fixed160x70`, `fixed160x71`, `fixed160x72`, `fixed160x73`, `fixed160x74`, `fixed160x75`, `fixed160x76`, `fixed160x77`, `fixed160x78`, `fixed160x79`, `fixed160x80`, `fixed168x0`, `fixed168x1`, `fixed168x2`, `fixed168x3`, `fixed168x4`, `fixed168x5`, `fixed168x6`, `fixed168x7`, `fixed168x8`, `fixed168x9`, `fixed168x10`, `fixed168x11`, `fixed168x12`, `fixed168x13`, `fixed168x14`, `fixed168x15`, `fixed168x16`, `fixed168x17`, `fixed168x18`, `fixed168x19`, `fixed168x20`, `fixed168x21`, `fixed168x22`, `fixed168x23`, `fixed168x24`, `fixed168x25`, `fixed168x26`, `fixed168x27`, `fixed168x28`, `fixed168x29`, `fixed168x30`, `fixed168x31`, `fixed168x32`, `fixed168x33`, `fixed168x34`, `fixed168x35`, `fixed168x36`, `fixed168x37`, `fixed168x38`, `fixed168x39`, `fixed168x40`, `fixed168x41`, `fixed168x42`, `fixed168x43`, `fixed168x44`, `fixed168x45`, `fixed168x46`, `fixed168x47`, `fixed168x48`, `fixed168x49`, `fixed168x50`, `fixed168x51`, `fixed168x52`, `fixed168x53`, `fixed168x54`, `fixed168x55`, `fixed168x56`, `fixed168x57`, `fixed168x58`, `fixed168x59`, `fixed168x60`, `fixed168x61`, `fixed168x62`, `fixed168x63`, `fixed168x64`, `fixed168x65`, `fixed168x66`, `fixed168x67`, `fixed168x68`, `fixed168x69`, `fixed168x70`, `fixed168x71`, `fixed168x72`, `fixed168x73`, `fixed168x74`, `fixed168x75`, `fixed168x76`, `fixed168x77`, `fixed168x78`, `fixed168x79`, `fixed168x80`, `fixed176x0`, `fixed176x1`, `fixed176x2`, `fixed176x3`, `fixed176x4`, `fixed176x5`, `fixed176x6`, `fixed176x7`, `fixed176x8`, `fixed176x9`, `fixed176x10`, `fixed176x11`, `fixed176x12`, `fixed176x13`, `fixed176x14`, `fixed176x15`, `fixed176x16`, `fixed176x17`, `fixed176x18`, `fixed176x19`, `fixed176x20`, `fixed176x21`, `fixed176x22`, `fixed176x23`, `fixed176x24`, `fixed176x25`, `fixed176x26`, `fixed176x27`, `fixed176x28`, `fixed176x29`, `fixed176x30`, `fixed176x31`, `fixed176x32`, `fixed176x33`, `fixed176x34`, `fixed176x35`, `fixed176x36`, `fixed176x37`, `fixed176x38`, `fixed176x39`, `fixed176x40`, `fixed176x41`, `fixed176x42`, `fixed176x43`, `fixed176x44`, `fixed176x45`, `fixed176x46`, `fixed176x47`, `fixed176x48`, `fixed176x49`, `fixed176x50`, `fixed176x51`, `fixed176x52`, `fixed176x53`, `fixed176x54`, `fixed176x55`, `fixed176x56`, `fixed176x57`, `fixed176x58`, `fixed176x59`, `fixed176x60`, `fixed176x61`, `fixed176x62`, `fixed176x63`, `fixed176x64`, `fixed176x65`, `fixed176x66`, `fixed176x67`, `fixed176x68`, `fixed176x69`, `fixed176x70`, `fixed176x71`, `fixed176x72`, `fixed176x73`, `fixed176x74`, `fixed176x75`, `fixed176x76`, `fixed176x77`, `fixed176x78`, `fixed176x79`, `fixed176x80`, `fixed184x0`, `fixed184x1`, `fixed184x2`, `fixed184x3`, `fixed184x4`, `fixed184x5`, `fixed184x6`, `fixed184x7`, `fixed184x8`, `fixed184x9`, `fixed184x10`, `fixed184x11`, `fixed184x12`, `fixed184x13`, `fixed184x14`, `fixed184x15`, `fixed184x16`, `fixed184x17`, `fixed184x18`, `fixed184x19`, `fixed184x20`, `fixed184x21`, `fixed184x22`, `fixed184x23`, `fixed184x24`, `fixed184x25`, `fixed184x26`, `fixed184x27`, `fixed184x28`, `fixed184x29`, `fixed184x30`, `fixed184x31`, `fixed184x32`, `fixed184x33`, `fixed184x34`, `fixed184x35`, `fixed184x36`, `fixed184x37`, `fixed184x38`, `fixed184x39`, `fixed184x40`, `fixed184x41`, `fixed184x42`, `fixed184x43`, `fixed184x44`, `fixed184x45`, `fixed184x46`, `fixed184x47`, `fixed184x48`, `fixed184x49`, `fixed184x50`, `fixed184x51`, `fixed184x52`, `fixed184x53`, `fixed184x54`, `fixed184x55`, `fixed184x56`, `fixed184x57`, `fixed184x58`, `fixed184x59`, `fixed184x60`, `fixed184x61`, `fixed184x62`, `fixed184x63`, `fixed184x64`, `fixed184x65`, `fixed184x66`, `fixed184x67`, `fixed184x68`, `fixed184x69`, `fixed184x70`, `fixed184x71`, `fixed184x72`, `fixed192x0`, `fixed192x1`, `fixed192x2`, `fixed192x3`, `fixed192x4`, `fixed192x5`, `fixed192x6`, `fixed192x7`, `fixed192x8`, `fixed192x9`, `fixed192x10`, `fixed192x11`, `fixed192x12`, `fixed192x13`, `fixed192x14`, `fixed192x15`, `fixed192x16`, `fixed192x17`, `fixed192x18`, `fixed192x19`, `fixed192x20`, `fixed192x21`, `fixed192x22`, `fixed192x23`, `fixed192x24`, `fixed192x25`, `fixed192x26`, `fixed192x27`, `fixed192x28`, `fixed192x29`, `fixed192x30`, `fixed192x31`, `fixed192x32`, `fixed192x33`, `fixed192x34`, `fixed192x35`, `fixed192x36`, `fixed192x37`, `fixed192x38`, `fixed192x39`, `fixed192x40`, `fixed192x41`, `fixed192x42`, `fixed192x43`, `fixed192x44`, `fixed192x45`, `fixed192x46`, `fixed192x47`, `fixed192x48`, `fixed192x49`, `fixed192x50`, `fixed192x51`, `fixed192x52`, `fixed192x53`, `fixed192x54`, `fixed192x55`, `fixed192x56`, `fixed192x57`, `fixed192x58`, `fixed192x59`, `fixed192x60`, `fixed192x61`, `fixed192x62`, `fixed192x63`, `fixed192x64`, `fixed200x0`, `fixed200x1`, `fixed200x2`, `fixed200x3`, `fixed200x4`, `fixed200x5`, `fixed200x6`, `fixed200x7`, `fixed200x8`, `fixed200x9`, `fixed200x10`, `fixed200x11`, `fixed200x12`, `fixed200x13`, `fixed200x14`, `fixed200x15`, `fixed200x16`, `fixed200x17`, `fixed200x18`, `fixed200x19`, `fixed200x20`, `fixed200x21`, `fixed200x22`, `fixed200x23`, `fixed200x24`, `fixed200x25`, `fixed200x26`, `fixed200x27`, `fixed200x28`, `fixed200x29`, `fixed200x30`, `fixed200x31`, `fixed200x32`, `fixed200x33`, `fixed200x34`, `fixed200x35`, `fixed200x36`, `fixed200x37`, `fixed200x38`, `fixed200x39`, `fixed200x40`, `fixed200x41`, `fixed200x42`, `fixed200x43`, `fixed200x44`, `fixed200x45`, `fixed200x46`, `fixed200x47`, `fixed200x48`, `fixed200x49`, `fixed200x50`, `fixed200x51`, `fixed200x52`, `fixed200x53`, `fixed200x54`, `fixed200x55`, `fixed200x56`, `fixed208x0`, `fixed208x1`, `fixed208x2`, `fixed208x3`, `fixed208x4`, `fixed208x5`, `fixed208x6`, `fixed208x7`, `fixed208x8`, `fixed208x9`, `fixed208x10`, `fixed208x11`, `fixed208x12`, `fixed208x13`, `fixed208x14`, `fixed208x15`, `fixed208x16`, `fixed208x17`, `fixed208x18`, `fixed208x19`, `fixed208x20`, `fixed208x21`, `fixed208x22`, `fixed208x23`, `fixed208x24`, `fixed208x25`, `fixed208x26`, `fixed208x27`, `fixed208x28`, `fixed208x29`, `fixed208x30`, `fixed208x31`, `fixed208x32`, `fixed208x33`, `fixed208x34`, `fixed208x35`, `fixed208x36`, `fixed208x37`, `fixed208x38`, `fixed208x39`, `fixed208x40`, `fixed208x41`, `fixed208x42`, `fixed208x43`, `fixed208x44`, `fixed208x45`, `fixed208x46`, `fixed208x47`, `fixed208x48`, `fixed216x0`, `fixed216x1`, `fixed216x2`, `fixed216x3`, `fixed216x4`, `fixed216x5`, `fixed216x6`, `fixed216x7`, `fixed216x8`, `fixed216x9`, `fixed216x10`, `fixed216x11`, `fixed216x12`, `fixed216x13`, `fixed216x14`, `fixed216x15`, `fixed216x16`, `fixed216x17`, `fixed216x18`, `fixed216x19`, `fixed216x20`, `fixed216x21`, `fixed216x22`, `fixed216x23`, `fixed216x24`, `fixed216x25`, `fixed216x26`, `fixed216x27`, `fixed216x28`, `fixed216x29`, `fixed216x30`, `fixed216x31`, `fixed216x32`, `fixed216x33`, `fixed216x34`, `fixed216x35`, `fixed216x36`, `fixed216x37`, `fixed216x38`, `fixed216x39`, `fixed216x40`, `fixed224x0`, `fixed224x1`, `fixed224x2`, `fixed224x3`, `fixed224x4`, `fixed224x5`, `fixed224x6`, `fixed224x7`, `fixed224x8`, `fixed224x9`, `fixed224x10`, `fixed224x11`, `fixed224x12`, `fixed224x13`, `fixed224x14`, `fixed224x15`, `fixed224x16`, `fixed224x17`, `fixed224x18`, `fixed224x19`, `fixed224x20`, `fixed224x21`, `fixed224x22`, `fixed224x23`, `fixed224x24`, `fixed224x25`, `fixed224x26`, `fixed224x27`, `fixed224x28`, `fixed224x29`, `fixed224x30`, `fixed224x31`, `fixed224x32`, `fixed232x0`, `fixed232x1`, `fixed232x2`, `fixed232x3`, `fixed232x4`, `fixed232x5`, `fixed232x6`, `fixed232x7`, `fixed232x8`, `fixed232x9`, `fixed232x10`, `fixed232x11`, `fixed232x12`, `fixed232x13`, `fixed232x14`, `fixed232x15`, `fixed232x16`, `fixed232x17`, `fixed232x18`, `fixed232x19`, `fixed232x20`, `fixed232x21`, `fixed232x22`, `fixed232x23`, `fixed232x24`, `fixed240x0`, `fixed240x1`, `fixed240x2`, `fixed240x3`, `fixed240x4`, `fixed240x5`, `fixed240x6`, `fixed240x7`, `fixed240x8`, `fixed240x9`, `fixed240x10`, `fixed240x11`, `fixed240x12`, `fixed240x13`, `fixed240x14`, `fixed240x15`, `fixed240x16`, `fixed248x0`, `fixed248x1`, `fixed248x2`, `fixed248x3`, `fixed248x4`, `fixed248x5`, `fixed248x6`, `fixed248x7`, `fixed248x8`, `fixed256x0`), KeywordType, nil}, + {Words(``, `\b`, `ufixed8x0`, `ufixed8x1`, `ufixed8x2`, `ufixed8x3`, `ufixed8x4`, `ufixed8x5`, `ufixed8x6`, `ufixed8x7`, `ufixed8x8`, `ufixed8x9`, `ufixed8x10`, `ufixed8x11`, `ufixed8x12`, `ufixed8x13`, `ufixed8x14`, `ufixed8x15`, `ufixed8x16`, `ufixed8x17`, `ufixed8x18`, `ufixed8x19`, `ufixed8x20`, `ufixed8x21`, `ufixed8x22`, `ufixed8x23`, `ufixed8x24`, `ufixed8x25`, `ufixed8x26`, `ufixed8x27`, `ufixed8x28`, `ufixed8x29`, `ufixed8x30`, `ufixed8x31`, `ufixed8x32`, `ufixed8x33`, `ufixed8x34`, `ufixed8x35`, `ufixed8x36`, `ufixed8x37`, `ufixed8x38`, `ufixed8x39`, `ufixed8x40`, `ufixed8x41`, `ufixed8x42`, `ufixed8x43`, `ufixed8x44`, `ufixed8x45`, `ufixed8x46`, `ufixed8x47`, `ufixed8x48`, `ufixed8x49`, `ufixed8x50`, `ufixed8x51`, `ufixed8x52`, `ufixed8x53`, `ufixed8x54`, `ufixed8x55`, `ufixed8x56`, `ufixed8x57`, `ufixed8x58`, `ufixed8x59`, `ufixed8x60`, `ufixed8x61`, `ufixed8x62`, `ufixed8x63`, `ufixed8x64`, `ufixed8x65`, `ufixed8x66`, `ufixed8x67`, `ufixed8x68`, `ufixed8x69`, `ufixed8x70`, `ufixed8x71`, `ufixed8x72`, `ufixed8x73`, `ufixed8x74`, `ufixed8x75`, `ufixed8x76`, `ufixed8x77`, `ufixed8x78`, `ufixed8x79`, `ufixed8x80`, `ufixed16x0`, `ufixed16x1`, `ufixed16x2`, `ufixed16x3`, `ufixed16x4`, `ufixed16x5`, `ufixed16x6`, `ufixed16x7`, `ufixed16x8`, `ufixed16x9`, `ufixed16x10`, `ufixed16x11`, `ufixed16x12`, `ufixed16x13`, `ufixed16x14`, `ufixed16x15`, `ufixed16x16`, `ufixed16x17`, `ufixed16x18`, `ufixed16x19`, `ufixed16x20`, `ufixed16x21`, `ufixed16x22`, `ufixed16x23`, `ufixed16x24`, `ufixed16x25`, `ufixed16x26`, `ufixed16x27`, `ufixed16x28`, `ufixed16x29`, `ufixed16x30`, `ufixed16x31`, `ufixed16x32`, `ufixed16x33`, `ufixed16x34`, `ufixed16x35`, `ufixed16x36`, `ufixed16x37`, `ufixed16x38`, `ufixed16x39`, `ufixed16x40`, `ufixed16x41`, `ufixed16x42`, `ufixed16x43`, `ufixed16x44`, `ufixed16x45`, `ufixed16x46`, `ufixed16x47`, `ufixed16x48`, `ufixed16x49`, `ufixed16x50`, `ufixed16x51`, `ufixed16x52`, `ufixed16x53`, `ufixed16x54`, `ufixed16x55`, `ufixed16x56`, `ufixed16x57`, `ufixed16x58`, `ufixed16x59`, `ufixed16x60`, `ufixed16x61`, `ufixed16x62`, `ufixed16x63`, `ufixed16x64`, `ufixed16x65`, `ufixed16x66`, `ufixed16x67`, `ufixed16x68`, `ufixed16x69`, `ufixed16x70`, `ufixed16x71`, `ufixed16x72`, `ufixed16x73`, `ufixed16x74`, `ufixed16x75`, `ufixed16x76`, `ufixed16x77`, `ufixed16x78`, `ufixed16x79`, `ufixed16x80`, `ufixed24x0`, `ufixed24x1`, `ufixed24x2`, `ufixed24x3`, `ufixed24x4`, `ufixed24x5`, `ufixed24x6`, `ufixed24x7`, `ufixed24x8`, `ufixed24x9`, `ufixed24x10`, `ufixed24x11`, `ufixed24x12`, `ufixed24x13`, `ufixed24x14`, `ufixed24x15`, `ufixed24x16`, `ufixed24x17`, `ufixed24x18`, `ufixed24x19`, `ufixed24x20`, `ufixed24x21`, `ufixed24x22`, `ufixed24x23`, `ufixed24x24`, `ufixed24x25`, `ufixed24x26`, `ufixed24x27`, `ufixed24x28`, `ufixed24x29`, `ufixed24x30`, `ufixed24x31`, `ufixed24x32`, `ufixed24x33`, `ufixed24x34`, `ufixed24x35`, `ufixed24x36`, `ufixed24x37`, `ufixed24x38`, `ufixed24x39`, `ufixed24x40`, `ufixed24x41`, `ufixed24x42`, `ufixed24x43`, `ufixed24x44`, `ufixed24x45`, `ufixed24x46`, `ufixed24x47`, `ufixed24x48`, `ufixed24x49`, `ufixed24x50`, `ufixed24x51`, `ufixed24x52`, `ufixed24x53`, `ufixed24x54`, `ufixed24x55`, `ufixed24x56`, `ufixed24x57`, `ufixed24x58`, `ufixed24x59`, `ufixed24x60`, `ufixed24x61`, `ufixed24x62`, `ufixed24x63`, `ufixed24x64`, `ufixed24x65`, `ufixed24x66`, `ufixed24x67`, `ufixed24x68`, `ufixed24x69`, `ufixed24x70`, `ufixed24x71`, `ufixed24x72`, `ufixed24x73`, `ufixed24x74`, `ufixed24x75`, `ufixed24x76`, `ufixed24x77`, `ufixed24x78`, `ufixed24x79`, `ufixed24x80`, `ufixed32x0`, `ufixed32x1`, `ufixed32x2`, `ufixed32x3`, `ufixed32x4`, `ufixed32x5`, `ufixed32x6`, `ufixed32x7`, `ufixed32x8`, `ufixed32x9`, `ufixed32x10`, `ufixed32x11`, `ufixed32x12`, `ufixed32x13`, `ufixed32x14`, `ufixed32x15`, `ufixed32x16`, `ufixed32x17`, `ufixed32x18`, `ufixed32x19`, `ufixed32x20`, `ufixed32x21`, `ufixed32x22`, `ufixed32x23`, `ufixed32x24`, `ufixed32x25`, `ufixed32x26`, `ufixed32x27`, `ufixed32x28`, `ufixed32x29`, `ufixed32x30`, `ufixed32x31`, `ufixed32x32`, `ufixed32x33`, `ufixed32x34`, `ufixed32x35`, `ufixed32x36`, `ufixed32x37`, `ufixed32x38`, `ufixed32x39`, `ufixed32x40`, `ufixed32x41`, `ufixed32x42`, `ufixed32x43`, `ufixed32x44`, `ufixed32x45`, `ufixed32x46`, `ufixed32x47`, `ufixed32x48`, `ufixed32x49`, `ufixed32x50`, `ufixed32x51`, `ufixed32x52`, `ufixed32x53`, `ufixed32x54`, `ufixed32x55`, `ufixed32x56`, `ufixed32x57`, `ufixed32x58`, `ufixed32x59`, `ufixed32x60`, `ufixed32x61`, `ufixed32x62`, `ufixed32x63`, `ufixed32x64`, `ufixed32x65`, `ufixed32x66`, `ufixed32x67`, `ufixed32x68`, `ufixed32x69`, `ufixed32x70`, `ufixed32x71`, `ufixed32x72`, `ufixed32x73`, `ufixed32x74`, `ufixed32x75`, `ufixed32x76`, `ufixed32x77`, `ufixed32x78`, `ufixed32x79`, `ufixed32x80`, `ufixed40x0`, `ufixed40x1`, `ufixed40x2`, `ufixed40x3`, `ufixed40x4`, `ufixed40x5`, `ufixed40x6`, `ufixed40x7`, `ufixed40x8`, `ufixed40x9`, `ufixed40x10`, `ufixed40x11`, `ufixed40x12`, `ufixed40x13`, `ufixed40x14`, `ufixed40x15`, `ufixed40x16`, `ufixed40x17`, `ufixed40x18`, `ufixed40x19`, `ufixed40x20`, `ufixed40x21`, `ufixed40x22`, `ufixed40x23`, `ufixed40x24`, `ufixed40x25`, `ufixed40x26`, `ufixed40x27`, `ufixed40x28`, `ufixed40x29`, `ufixed40x30`, `ufixed40x31`, `ufixed40x32`, `ufixed40x33`, `ufixed40x34`, `ufixed40x35`, `ufixed40x36`, `ufixed40x37`, `ufixed40x38`, `ufixed40x39`, `ufixed40x40`, `ufixed40x41`, `ufixed40x42`, `ufixed40x43`, `ufixed40x44`, `ufixed40x45`, `ufixed40x46`, `ufixed40x47`, `ufixed40x48`, `ufixed40x49`, `ufixed40x50`, `ufixed40x51`, `ufixed40x52`, `ufixed40x53`, `ufixed40x54`, `ufixed40x55`, `ufixed40x56`, `ufixed40x57`, `ufixed40x58`, `ufixed40x59`, `ufixed40x60`, `ufixed40x61`, `ufixed40x62`, `ufixed40x63`, `ufixed40x64`, `ufixed40x65`, `ufixed40x66`, `ufixed40x67`, `ufixed40x68`, `ufixed40x69`, `ufixed40x70`, `ufixed40x71`, `ufixed40x72`, `ufixed40x73`, `ufixed40x74`, `ufixed40x75`, `ufixed40x76`, `ufixed40x77`, `ufixed40x78`, `ufixed40x79`, `ufixed40x80`, `ufixed48x0`, `ufixed48x1`, `ufixed48x2`, `ufixed48x3`, `ufixed48x4`, `ufixed48x5`, `ufixed48x6`, `ufixed48x7`, `ufixed48x8`, `ufixed48x9`, `ufixed48x10`, `ufixed48x11`, `ufixed48x12`, `ufixed48x13`, `ufixed48x14`, `ufixed48x15`, `ufixed48x16`, `ufixed48x17`, `ufixed48x18`, `ufixed48x19`, `ufixed48x20`, `ufixed48x21`, `ufixed48x22`, `ufixed48x23`, `ufixed48x24`, `ufixed48x25`, `ufixed48x26`, `ufixed48x27`, `ufixed48x28`, `ufixed48x29`, `ufixed48x30`, `ufixed48x31`, `ufixed48x32`, `ufixed48x33`, `ufixed48x34`, `ufixed48x35`, `ufixed48x36`, `ufixed48x37`, `ufixed48x38`, `ufixed48x39`, `ufixed48x40`, `ufixed48x41`, `ufixed48x42`, `ufixed48x43`, `ufixed48x44`, `ufixed48x45`, `ufixed48x46`, `ufixed48x47`, `ufixed48x48`, `ufixed48x49`, `ufixed48x50`, `ufixed48x51`, `ufixed48x52`, `ufixed48x53`, `ufixed48x54`, `ufixed48x55`, `ufixed48x56`, `ufixed48x57`, `ufixed48x58`, `ufixed48x59`, `ufixed48x60`, `ufixed48x61`, `ufixed48x62`, `ufixed48x63`, `ufixed48x64`, `ufixed48x65`, `ufixed48x66`, `ufixed48x67`, `ufixed48x68`, `ufixed48x69`, `ufixed48x70`, `ufixed48x71`, `ufixed48x72`, `ufixed48x73`, `ufixed48x74`, `ufixed48x75`, `ufixed48x76`, `ufixed48x77`, `ufixed48x78`, `ufixed48x79`, `ufixed48x80`, `ufixed56x0`, `ufixed56x1`, `ufixed56x2`, `ufixed56x3`, `ufixed56x4`, `ufixed56x5`, `ufixed56x6`, `ufixed56x7`, `ufixed56x8`, `ufixed56x9`, `ufixed56x10`, `ufixed56x11`, `ufixed56x12`, `ufixed56x13`, `ufixed56x14`, `ufixed56x15`, `ufixed56x16`, `ufixed56x17`, `ufixed56x18`, `ufixed56x19`, `ufixed56x20`, `ufixed56x21`, `ufixed56x22`, `ufixed56x23`, `ufixed56x24`, `ufixed56x25`, `ufixed56x26`, `ufixed56x27`, `ufixed56x28`, `ufixed56x29`, `ufixed56x30`, `ufixed56x31`, `ufixed56x32`, `ufixed56x33`, `ufixed56x34`, `ufixed56x35`, `ufixed56x36`, `ufixed56x37`, `ufixed56x38`, `ufixed56x39`, `ufixed56x40`, `ufixed56x41`, `ufixed56x42`, `ufixed56x43`, `ufixed56x44`, `ufixed56x45`, `ufixed56x46`, `ufixed56x47`, `ufixed56x48`, `ufixed56x49`, `ufixed56x50`, `ufixed56x51`, `ufixed56x52`, `ufixed56x53`, `ufixed56x54`, `ufixed56x55`, `ufixed56x56`, `ufixed56x57`, `ufixed56x58`, `ufixed56x59`, `ufixed56x60`, `ufixed56x61`, `ufixed56x62`, `ufixed56x63`, `ufixed56x64`, `ufixed56x65`, `ufixed56x66`, `ufixed56x67`, `ufixed56x68`, `ufixed56x69`, `ufixed56x70`, `ufixed56x71`, `ufixed56x72`, `ufixed56x73`, `ufixed56x74`, `ufixed56x75`, `ufixed56x76`, `ufixed56x77`, `ufixed56x78`, `ufixed56x79`, `ufixed56x80`, `ufixed64x0`, `ufixed64x1`, `ufixed64x2`, `ufixed64x3`, `ufixed64x4`, `ufixed64x5`, `ufixed64x6`, `ufixed64x7`, `ufixed64x8`, `ufixed64x9`, `ufixed64x10`, `ufixed64x11`, `ufixed64x12`, `ufixed64x13`, `ufixed64x14`, `ufixed64x15`, `ufixed64x16`, `ufixed64x17`, `ufixed64x18`, `ufixed64x19`, `ufixed64x20`, `ufixed64x21`, `ufixed64x22`, `ufixed64x23`, `ufixed64x24`, `ufixed64x25`, `ufixed64x26`, `ufixed64x27`, `ufixed64x28`, `ufixed64x29`, `ufixed64x30`, `ufixed64x31`, `ufixed64x32`, `ufixed64x33`, `ufixed64x34`, `ufixed64x35`, `ufixed64x36`, `ufixed64x37`, `ufixed64x38`, `ufixed64x39`, `ufixed64x40`, `ufixed64x41`, `ufixed64x42`, `ufixed64x43`, `ufixed64x44`, `ufixed64x45`, `ufixed64x46`, `ufixed64x47`, `ufixed64x48`, `ufixed64x49`, `ufixed64x50`, `ufixed64x51`, `ufixed64x52`, `ufixed64x53`, `ufixed64x54`, `ufixed64x55`, `ufixed64x56`, `ufixed64x57`, `ufixed64x58`, `ufixed64x59`, `ufixed64x60`, `ufixed64x61`, `ufixed64x62`, `ufixed64x63`, `ufixed64x64`, `ufixed64x65`, `ufixed64x66`, `ufixed64x67`, `ufixed64x68`, `ufixed64x69`, `ufixed64x70`, `ufixed64x71`, `ufixed64x72`, `ufixed64x73`, `ufixed64x74`, `ufixed64x75`, `ufixed64x76`, `ufixed64x77`, `ufixed64x78`, `ufixed64x79`, `ufixed64x80`, `ufixed72x0`, `ufixed72x1`, `ufixed72x2`, `ufixed72x3`, `ufixed72x4`, `ufixed72x5`, `ufixed72x6`, `ufixed72x7`, `ufixed72x8`, `ufixed72x9`, `ufixed72x10`, `ufixed72x11`, `ufixed72x12`, `ufixed72x13`, `ufixed72x14`, `ufixed72x15`, `ufixed72x16`, `ufixed72x17`, `ufixed72x18`, `ufixed72x19`, `ufixed72x20`, `ufixed72x21`, `ufixed72x22`, `ufixed72x23`, `ufixed72x24`, `ufixed72x25`, `ufixed72x26`, `ufixed72x27`, `ufixed72x28`, `ufixed72x29`, `ufixed72x30`, `ufixed72x31`, `ufixed72x32`, `ufixed72x33`, `ufixed72x34`, `ufixed72x35`, `ufixed72x36`, `ufixed72x37`, `ufixed72x38`, `ufixed72x39`, `ufixed72x40`, `ufixed72x41`, `ufixed72x42`, `ufixed72x43`, `ufixed72x44`, `ufixed72x45`, `ufixed72x46`, `ufixed72x47`, `ufixed72x48`, `ufixed72x49`, `ufixed72x50`, `ufixed72x51`, `ufixed72x52`, `ufixed72x53`, `ufixed72x54`, `ufixed72x55`, `ufixed72x56`, `ufixed72x57`, `ufixed72x58`, `ufixed72x59`, `ufixed72x60`, `ufixed72x61`, `ufixed72x62`, `ufixed72x63`, `ufixed72x64`, `ufixed72x65`, `ufixed72x66`, `ufixed72x67`, `ufixed72x68`, `ufixed72x69`, `ufixed72x70`, `ufixed72x71`, `ufixed72x72`, `ufixed72x73`, `ufixed72x74`, `ufixed72x75`, `ufixed72x76`, `ufixed72x77`, `ufixed72x78`, `ufixed72x79`, `ufixed72x80`, `ufixed80x0`, `ufixed80x1`, `ufixed80x2`, `ufixed80x3`, `ufixed80x4`, `ufixed80x5`, `ufixed80x6`, `ufixed80x7`, `ufixed80x8`, `ufixed80x9`, `ufixed80x10`, `ufixed80x11`, `ufixed80x12`, `ufixed80x13`, `ufixed80x14`, `ufixed80x15`, `ufixed80x16`, `ufixed80x17`, `ufixed80x18`, `ufixed80x19`, `ufixed80x20`, `ufixed80x21`, `ufixed80x22`, `ufixed80x23`, `ufixed80x24`, `ufixed80x25`, `ufixed80x26`, `ufixed80x27`, `ufixed80x28`, `ufixed80x29`, `ufixed80x30`, `ufixed80x31`, `ufixed80x32`, `ufixed80x33`, `ufixed80x34`, `ufixed80x35`, `ufixed80x36`, `ufixed80x37`, `ufixed80x38`, `ufixed80x39`, `ufixed80x40`, `ufixed80x41`, `ufixed80x42`, `ufixed80x43`, `ufixed80x44`, `ufixed80x45`, `ufixed80x46`, `ufixed80x47`, `ufixed80x48`, `ufixed80x49`, `ufixed80x50`, `ufixed80x51`, `ufixed80x52`, `ufixed80x53`, `ufixed80x54`, `ufixed80x55`, `ufixed80x56`, `ufixed80x57`, `ufixed80x58`, `ufixed80x59`, `ufixed80x60`, `ufixed80x61`, `ufixed80x62`, `ufixed80x63`, `ufixed80x64`, `ufixed80x65`, `ufixed80x66`, `ufixed80x67`, `ufixed80x68`, `ufixed80x69`, `ufixed80x70`, `ufixed80x71`, `ufixed80x72`, `ufixed80x73`, `ufixed80x74`, `ufixed80x75`, `ufixed80x76`, `ufixed80x77`, `ufixed80x78`, `ufixed80x79`, `ufixed80x80`, `ufixed88x0`, `ufixed88x1`, `ufixed88x2`, `ufixed88x3`, `ufixed88x4`, `ufixed88x5`, `ufixed88x6`, `ufixed88x7`, `ufixed88x8`, `ufixed88x9`, `ufixed88x10`, `ufixed88x11`, `ufixed88x12`, `ufixed88x13`, `ufixed88x14`, `ufixed88x15`, `ufixed88x16`, `ufixed88x17`, `ufixed88x18`, `ufixed88x19`, `ufixed88x20`, `ufixed88x21`, `ufixed88x22`, `ufixed88x23`, `ufixed88x24`, `ufixed88x25`, `ufixed88x26`, `ufixed88x27`, `ufixed88x28`, `ufixed88x29`, `ufixed88x30`, `ufixed88x31`, `ufixed88x32`, `ufixed88x33`, `ufixed88x34`, `ufixed88x35`, `ufixed88x36`, `ufixed88x37`, `ufixed88x38`, `ufixed88x39`, `ufixed88x40`, `ufixed88x41`, `ufixed88x42`, `ufixed88x43`, `ufixed88x44`, `ufixed88x45`, `ufixed88x46`, `ufixed88x47`, `ufixed88x48`, `ufixed88x49`, `ufixed88x50`, `ufixed88x51`, `ufixed88x52`, `ufixed88x53`, `ufixed88x54`, `ufixed88x55`, `ufixed88x56`, `ufixed88x57`, `ufixed88x58`, `ufixed88x59`, `ufixed88x60`, `ufixed88x61`, `ufixed88x62`, `ufixed88x63`, `ufixed88x64`, `ufixed88x65`, `ufixed88x66`, `ufixed88x67`, `ufixed88x68`, `ufixed88x69`, `ufixed88x70`, `ufixed88x71`, `ufixed88x72`, `ufixed88x73`, `ufixed88x74`, `ufixed88x75`, `ufixed88x76`, `ufixed88x77`, `ufixed88x78`, `ufixed88x79`, `ufixed88x80`, `ufixed96x0`, `ufixed96x1`, `ufixed96x2`, `ufixed96x3`, `ufixed96x4`, `ufixed96x5`, `ufixed96x6`, `ufixed96x7`, `ufixed96x8`, `ufixed96x9`, `ufixed96x10`, `ufixed96x11`, `ufixed96x12`, `ufixed96x13`, `ufixed96x14`, `ufixed96x15`, `ufixed96x16`, `ufixed96x17`, `ufixed96x18`, `ufixed96x19`, `ufixed96x20`, `ufixed96x21`, `ufixed96x22`, `ufixed96x23`, `ufixed96x24`, `ufixed96x25`, `ufixed96x26`, `ufixed96x27`, `ufixed96x28`, `ufixed96x29`, `ufixed96x30`, `ufixed96x31`, `ufixed96x32`, `ufixed96x33`, `ufixed96x34`, `ufixed96x35`, `ufixed96x36`, `ufixed96x37`, `ufixed96x38`, `ufixed96x39`, `ufixed96x40`, `ufixed96x41`, `ufixed96x42`, `ufixed96x43`, `ufixed96x44`, `ufixed96x45`, `ufixed96x46`, `ufixed96x47`, `ufixed96x48`, `ufixed96x49`, `ufixed96x50`, `ufixed96x51`, `ufixed96x52`, `ufixed96x53`, `ufixed96x54`, `ufixed96x55`, `ufixed96x56`, `ufixed96x57`, `ufixed96x58`, `ufixed96x59`, `ufixed96x60`, `ufixed96x61`, `ufixed96x62`, `ufixed96x63`, `ufixed96x64`, `ufixed96x65`, `ufixed96x66`, `ufixed96x67`, `ufixed96x68`, `ufixed96x69`, `ufixed96x70`, `ufixed96x71`, `ufixed96x72`, `ufixed96x73`, `ufixed96x74`, `ufixed96x75`, `ufixed96x76`, `ufixed96x77`, `ufixed96x78`, `ufixed96x79`, `ufixed96x80`, `ufixed104x0`, `ufixed104x1`, `ufixed104x2`, `ufixed104x3`, `ufixed104x4`, `ufixed104x5`, `ufixed104x6`, `ufixed104x7`, `ufixed104x8`, `ufixed104x9`, `ufixed104x10`, `ufixed104x11`, `ufixed104x12`, `ufixed104x13`, `ufixed104x14`, `ufixed104x15`, `ufixed104x16`, `ufixed104x17`, `ufixed104x18`, `ufixed104x19`, `ufixed104x20`, `ufixed104x21`, `ufixed104x22`, `ufixed104x23`, `ufixed104x24`, `ufixed104x25`, `ufixed104x26`, `ufixed104x27`, `ufixed104x28`, `ufixed104x29`, `ufixed104x30`, `ufixed104x31`, `ufixed104x32`, `ufixed104x33`, `ufixed104x34`, `ufixed104x35`, `ufixed104x36`, `ufixed104x37`, `ufixed104x38`, `ufixed104x39`, `ufixed104x40`, `ufixed104x41`, `ufixed104x42`, `ufixed104x43`, `ufixed104x44`, `ufixed104x45`, `ufixed104x46`, `ufixed104x47`, `ufixed104x48`, `ufixed104x49`, `ufixed104x50`, `ufixed104x51`, `ufixed104x52`, `ufixed104x53`, `ufixed104x54`, `ufixed104x55`, `ufixed104x56`, `ufixed104x57`, `ufixed104x58`, `ufixed104x59`, `ufixed104x60`, `ufixed104x61`, `ufixed104x62`, `ufixed104x63`, `ufixed104x64`, `ufixed104x65`, `ufixed104x66`, `ufixed104x67`, `ufixed104x68`, `ufixed104x69`, `ufixed104x70`, `ufixed104x71`, `ufixed104x72`, `ufixed104x73`, `ufixed104x74`, `ufixed104x75`, `ufixed104x76`, `ufixed104x77`, `ufixed104x78`, `ufixed104x79`, `ufixed104x80`, `ufixed112x0`, `ufixed112x1`, `ufixed112x2`, `ufixed112x3`, `ufixed112x4`, `ufixed112x5`, `ufixed112x6`, `ufixed112x7`, `ufixed112x8`, `ufixed112x9`, `ufixed112x10`, `ufixed112x11`, `ufixed112x12`, `ufixed112x13`, `ufixed112x14`, `ufixed112x15`, `ufixed112x16`, `ufixed112x17`, `ufixed112x18`, `ufixed112x19`, `ufixed112x20`, `ufixed112x21`, `ufixed112x22`, `ufixed112x23`, `ufixed112x24`, `ufixed112x25`, `ufixed112x26`, `ufixed112x27`, `ufixed112x28`, `ufixed112x29`, `ufixed112x30`, `ufixed112x31`, `ufixed112x32`, `ufixed112x33`, `ufixed112x34`, `ufixed112x35`, `ufixed112x36`, `ufixed112x37`, `ufixed112x38`, `ufixed112x39`, `ufixed112x40`, `ufixed112x41`, `ufixed112x42`, `ufixed112x43`, `ufixed112x44`, `ufixed112x45`, `ufixed112x46`, `ufixed112x47`, `ufixed112x48`, `ufixed112x49`, `ufixed112x50`, `ufixed112x51`, `ufixed112x52`, `ufixed112x53`, `ufixed112x54`, `ufixed112x55`, `ufixed112x56`, `ufixed112x57`, `ufixed112x58`, `ufixed112x59`, `ufixed112x60`, `ufixed112x61`, `ufixed112x62`, `ufixed112x63`, `ufixed112x64`, `ufixed112x65`, `ufixed112x66`, `ufixed112x67`, `ufixed112x68`, `ufixed112x69`, `ufixed112x70`, `ufixed112x71`, `ufixed112x72`, `ufixed112x73`, `ufixed112x74`, `ufixed112x75`, `ufixed112x76`, `ufixed112x77`, `ufixed112x78`, `ufixed112x79`, `ufixed112x80`, `ufixed120x0`, `ufixed120x1`, `ufixed120x2`, `ufixed120x3`, `ufixed120x4`, `ufixed120x5`, `ufixed120x6`, `ufixed120x7`, `ufixed120x8`, `ufixed120x9`, `ufixed120x10`, `ufixed120x11`, `ufixed120x12`, `ufixed120x13`, `ufixed120x14`, `ufixed120x15`, `ufixed120x16`, `ufixed120x17`, `ufixed120x18`, `ufixed120x19`, `ufixed120x20`, `ufixed120x21`, `ufixed120x22`, `ufixed120x23`, `ufixed120x24`, `ufixed120x25`, `ufixed120x26`, `ufixed120x27`, `ufixed120x28`, `ufixed120x29`, `ufixed120x30`, `ufixed120x31`, `ufixed120x32`, `ufixed120x33`, `ufixed120x34`, `ufixed120x35`, `ufixed120x36`, `ufixed120x37`, `ufixed120x38`, `ufixed120x39`, `ufixed120x40`, `ufixed120x41`, `ufixed120x42`, `ufixed120x43`, `ufixed120x44`, `ufixed120x45`, `ufixed120x46`, `ufixed120x47`, `ufixed120x48`, `ufixed120x49`, `ufixed120x50`, `ufixed120x51`, `ufixed120x52`, `ufixed120x53`, `ufixed120x54`, `ufixed120x55`, `ufixed120x56`, `ufixed120x57`, `ufixed120x58`, `ufixed120x59`, `ufixed120x60`, `ufixed120x61`, `ufixed120x62`, `ufixed120x63`, `ufixed120x64`, `ufixed120x65`, `ufixed120x66`, `ufixed120x67`, `ufixed120x68`, `ufixed120x69`, `ufixed120x70`, `ufixed120x71`, `ufixed120x72`, `ufixed120x73`, `ufixed120x74`, `ufixed120x75`, `ufixed120x76`, `ufixed120x77`, `ufixed120x78`, `ufixed120x79`, `ufixed120x80`, `ufixed128x0`, `ufixed128x1`, `ufixed128x2`, `ufixed128x3`, `ufixed128x4`, `ufixed128x5`, `ufixed128x6`, `ufixed128x7`, `ufixed128x8`, `ufixed128x9`, `ufixed128x10`, `ufixed128x11`, `ufixed128x12`, `ufixed128x13`, `ufixed128x14`, `ufixed128x15`, `ufixed128x16`, `ufixed128x17`, `ufixed128x18`, `ufixed128x19`, `ufixed128x20`, `ufixed128x21`, `ufixed128x22`, `ufixed128x23`, `ufixed128x24`, `ufixed128x25`, `ufixed128x26`, `ufixed128x27`, `ufixed128x28`, `ufixed128x29`, `ufixed128x30`, `ufixed128x31`, `ufixed128x32`, `ufixed128x33`, `ufixed128x34`, `ufixed128x35`, `ufixed128x36`, `ufixed128x37`, `ufixed128x38`, `ufixed128x39`, `ufixed128x40`, `ufixed128x41`, `ufixed128x42`, `ufixed128x43`, `ufixed128x44`, `ufixed128x45`, `ufixed128x46`, `ufixed128x47`, `ufixed128x48`, `ufixed128x49`, `ufixed128x50`, `ufixed128x51`, `ufixed128x52`, `ufixed128x53`, `ufixed128x54`, `ufixed128x55`, `ufixed128x56`, `ufixed128x57`, `ufixed128x58`, `ufixed128x59`, `ufixed128x60`, `ufixed128x61`, `ufixed128x62`, `ufixed128x63`, `ufixed128x64`, `ufixed128x65`, `ufixed128x66`, `ufixed128x67`, `ufixed128x68`, `ufixed128x69`, `ufixed128x70`, `ufixed128x71`, `ufixed128x72`, `ufixed128x73`, `ufixed128x74`, `ufixed128x75`, `ufixed128x76`, `ufixed128x77`, `ufixed128x78`, `ufixed128x79`, `ufixed128x80`, `ufixed136x0`, `ufixed136x1`, `ufixed136x2`, `ufixed136x3`, `ufixed136x4`, `ufixed136x5`, `ufixed136x6`, `ufixed136x7`, `ufixed136x8`, `ufixed136x9`, `ufixed136x10`, `ufixed136x11`, `ufixed136x12`, `ufixed136x13`, `ufixed136x14`, `ufixed136x15`, `ufixed136x16`, `ufixed136x17`, `ufixed136x18`, `ufixed136x19`, `ufixed136x20`, `ufixed136x21`, `ufixed136x22`, `ufixed136x23`, `ufixed136x24`, `ufixed136x25`, `ufixed136x26`, `ufixed136x27`, `ufixed136x28`, `ufixed136x29`, `ufixed136x30`, `ufixed136x31`, `ufixed136x32`, `ufixed136x33`, `ufixed136x34`, `ufixed136x35`, `ufixed136x36`, `ufixed136x37`, `ufixed136x38`, `ufixed136x39`, `ufixed136x40`, `ufixed136x41`, `ufixed136x42`, `ufixed136x43`, `ufixed136x44`, `ufixed136x45`, `ufixed136x46`, `ufixed136x47`, `ufixed136x48`, `ufixed136x49`, `ufixed136x50`, `ufixed136x51`, `ufixed136x52`, `ufixed136x53`, `ufixed136x54`, `ufixed136x55`, `ufixed136x56`, `ufixed136x57`, `ufixed136x58`, `ufixed136x59`, `ufixed136x60`, `ufixed136x61`, `ufixed136x62`, `ufixed136x63`, `ufixed136x64`, `ufixed136x65`, `ufixed136x66`, `ufixed136x67`, `ufixed136x68`, `ufixed136x69`, `ufixed136x70`, `ufixed136x71`, `ufixed136x72`, `ufixed136x73`, `ufixed136x74`, `ufixed136x75`, `ufixed136x76`, `ufixed136x77`, `ufixed136x78`, `ufixed136x79`, `ufixed136x80`, `ufixed144x0`, `ufixed144x1`, `ufixed144x2`, `ufixed144x3`, `ufixed144x4`, `ufixed144x5`, `ufixed144x6`, `ufixed144x7`, `ufixed144x8`, `ufixed144x9`, `ufixed144x10`, `ufixed144x11`, `ufixed144x12`, `ufixed144x13`, `ufixed144x14`, `ufixed144x15`, `ufixed144x16`, `ufixed144x17`, `ufixed144x18`, `ufixed144x19`, `ufixed144x20`, `ufixed144x21`, `ufixed144x22`, `ufixed144x23`, `ufixed144x24`, `ufixed144x25`, `ufixed144x26`, `ufixed144x27`, `ufixed144x28`, `ufixed144x29`, `ufixed144x30`, `ufixed144x31`, `ufixed144x32`, `ufixed144x33`, `ufixed144x34`, `ufixed144x35`, `ufixed144x36`, `ufixed144x37`, `ufixed144x38`, `ufixed144x39`, `ufixed144x40`, `ufixed144x41`, `ufixed144x42`, `ufixed144x43`, `ufixed144x44`, `ufixed144x45`, `ufixed144x46`, `ufixed144x47`, `ufixed144x48`, `ufixed144x49`, `ufixed144x50`, `ufixed144x51`, `ufixed144x52`, `ufixed144x53`, `ufixed144x54`, `ufixed144x55`, `ufixed144x56`, `ufixed144x57`, `ufixed144x58`, `ufixed144x59`, `ufixed144x60`, `ufixed144x61`, `ufixed144x62`, `ufixed144x63`, `ufixed144x64`, `ufixed144x65`, `ufixed144x66`, `ufixed144x67`, `ufixed144x68`, `ufixed144x69`, `ufixed144x70`, `ufixed144x71`, `ufixed144x72`, `ufixed144x73`, `ufixed144x74`, `ufixed144x75`, `ufixed144x76`, `ufixed144x77`, `ufixed144x78`, `ufixed144x79`, `ufixed144x80`, `ufixed152x0`, `ufixed152x1`, `ufixed152x2`, `ufixed152x3`, `ufixed152x4`, `ufixed152x5`, `ufixed152x6`, `ufixed152x7`, `ufixed152x8`, `ufixed152x9`, `ufixed152x10`, `ufixed152x11`, `ufixed152x12`, `ufixed152x13`, `ufixed152x14`, `ufixed152x15`, `ufixed152x16`, `ufixed152x17`, `ufixed152x18`, `ufixed152x19`, `ufixed152x20`, `ufixed152x21`, `ufixed152x22`, `ufixed152x23`, `ufixed152x24`, `ufixed152x25`, `ufixed152x26`, `ufixed152x27`, `ufixed152x28`, `ufixed152x29`, `ufixed152x30`, `ufixed152x31`, `ufixed152x32`, `ufixed152x33`, `ufixed152x34`, `ufixed152x35`, `ufixed152x36`, `ufixed152x37`, `ufixed152x38`, `ufixed152x39`, `ufixed152x40`, `ufixed152x41`, `ufixed152x42`, `ufixed152x43`, `ufixed152x44`, `ufixed152x45`, `ufixed152x46`, `ufixed152x47`, `ufixed152x48`, `ufixed152x49`, `ufixed152x50`, `ufixed152x51`, `ufixed152x52`, `ufixed152x53`, `ufixed152x54`, `ufixed152x55`, `ufixed152x56`, `ufixed152x57`, `ufixed152x58`, `ufixed152x59`, `ufixed152x60`, `ufixed152x61`, `ufixed152x62`, `ufixed152x63`, `ufixed152x64`, `ufixed152x65`, `ufixed152x66`, `ufixed152x67`, `ufixed152x68`, `ufixed152x69`, `ufixed152x70`, `ufixed152x71`, `ufixed152x72`, `ufixed152x73`, `ufixed152x74`, `ufixed152x75`, `ufixed152x76`, `ufixed152x77`, `ufixed152x78`, `ufixed152x79`, `ufixed152x80`, `ufixed160x0`, `ufixed160x1`, `ufixed160x2`, `ufixed160x3`, `ufixed160x4`, `ufixed160x5`, `ufixed160x6`, `ufixed160x7`, `ufixed160x8`, `ufixed160x9`, `ufixed160x10`, `ufixed160x11`, `ufixed160x12`, `ufixed160x13`, `ufixed160x14`, `ufixed160x15`, `ufixed160x16`, `ufixed160x17`, `ufixed160x18`, `ufixed160x19`, `ufixed160x20`, `ufixed160x21`, `ufixed160x22`, `ufixed160x23`, `ufixed160x24`, `ufixed160x25`, `ufixed160x26`, `ufixed160x27`, `ufixed160x28`, `ufixed160x29`, `ufixed160x30`, `ufixed160x31`, `ufixed160x32`, `ufixed160x33`, `ufixed160x34`, `ufixed160x35`, `ufixed160x36`, `ufixed160x37`, `ufixed160x38`, `ufixed160x39`, `ufixed160x40`, `ufixed160x41`, `ufixed160x42`, `ufixed160x43`, `ufixed160x44`, `ufixed160x45`, `ufixed160x46`, `ufixed160x47`, `ufixed160x48`, `ufixed160x49`, `ufixed160x50`, `ufixed160x51`, `ufixed160x52`, `ufixed160x53`, `ufixed160x54`, `ufixed160x55`, `ufixed160x56`, `ufixed160x57`, `ufixed160x58`, `ufixed160x59`, `ufixed160x60`, `ufixed160x61`, `ufixed160x62`, `ufixed160x63`, `ufixed160x64`, `ufixed160x65`, `ufixed160x66`, `ufixed160x67`, `ufixed160x68`, `ufixed160x69`, `ufixed160x70`, `ufixed160x71`, `ufixed160x72`, `ufixed160x73`, `ufixed160x74`, `ufixed160x75`, `ufixed160x76`, `ufixed160x77`, `ufixed160x78`, `ufixed160x79`, `ufixed160x80`, `ufixed168x0`, `ufixed168x1`, `ufixed168x2`, `ufixed168x3`, `ufixed168x4`, `ufixed168x5`, `ufixed168x6`, `ufixed168x7`, `ufixed168x8`, `ufixed168x9`, `ufixed168x10`, `ufixed168x11`, `ufixed168x12`, `ufixed168x13`, `ufixed168x14`, `ufixed168x15`, `ufixed168x16`, `ufixed168x17`, `ufixed168x18`, `ufixed168x19`, `ufixed168x20`, `ufixed168x21`, `ufixed168x22`, `ufixed168x23`, `ufixed168x24`, `ufixed168x25`, `ufixed168x26`, `ufixed168x27`, `ufixed168x28`, `ufixed168x29`, `ufixed168x30`, `ufixed168x31`, `ufixed168x32`, `ufixed168x33`, `ufixed168x34`, `ufixed168x35`, `ufixed168x36`, `ufixed168x37`, `ufixed168x38`, `ufixed168x39`, `ufixed168x40`, `ufixed168x41`, `ufixed168x42`, `ufixed168x43`, `ufixed168x44`, `ufixed168x45`, `ufixed168x46`, `ufixed168x47`, `ufixed168x48`, `ufixed168x49`, `ufixed168x50`, `ufixed168x51`, `ufixed168x52`, `ufixed168x53`, `ufixed168x54`, `ufixed168x55`, `ufixed168x56`, `ufixed168x57`, `ufixed168x58`, `ufixed168x59`, `ufixed168x60`, `ufixed168x61`, `ufixed168x62`, `ufixed168x63`, `ufixed168x64`, `ufixed168x65`, `ufixed168x66`, `ufixed168x67`, `ufixed168x68`, `ufixed168x69`, `ufixed168x70`, `ufixed168x71`, `ufixed168x72`, `ufixed168x73`, `ufixed168x74`, `ufixed168x75`, `ufixed168x76`, `ufixed168x77`, `ufixed168x78`, `ufixed168x79`, `ufixed168x80`, `ufixed176x0`, `ufixed176x1`, `ufixed176x2`, `ufixed176x3`, `ufixed176x4`, `ufixed176x5`, `ufixed176x6`, `ufixed176x7`, `ufixed176x8`, `ufixed176x9`, `ufixed176x10`, `ufixed176x11`, `ufixed176x12`, `ufixed176x13`, `ufixed176x14`, `ufixed176x15`, `ufixed176x16`, `ufixed176x17`, `ufixed176x18`, `ufixed176x19`, `ufixed176x20`, `ufixed176x21`, `ufixed176x22`, `ufixed176x23`, `ufixed176x24`, `ufixed176x25`, `ufixed176x26`, `ufixed176x27`, `ufixed176x28`, `ufixed176x29`, `ufixed176x30`, `ufixed176x31`, `ufixed176x32`, `ufixed176x33`, `ufixed176x34`, `ufixed176x35`, `ufixed176x36`, `ufixed176x37`, `ufixed176x38`, `ufixed176x39`, `ufixed176x40`, `ufixed176x41`, `ufixed176x42`, `ufixed176x43`, `ufixed176x44`, `ufixed176x45`, `ufixed176x46`, `ufixed176x47`, `ufixed176x48`, `ufixed176x49`, `ufixed176x50`, `ufixed176x51`, `ufixed176x52`, `ufixed176x53`, `ufixed176x54`, `ufixed176x55`, `ufixed176x56`, `ufixed176x57`, `ufixed176x58`, `ufixed176x59`, `ufixed176x60`, `ufixed176x61`, `ufixed176x62`, `ufixed176x63`, `ufixed176x64`, `ufixed176x65`, `ufixed176x66`, `ufixed176x67`, `ufixed176x68`, `ufixed176x69`, `ufixed176x70`, `ufixed176x71`, `ufixed176x72`, `ufixed176x73`, `ufixed176x74`, `ufixed176x75`, `ufixed176x76`, `ufixed176x77`, `ufixed176x78`, `ufixed176x79`, `ufixed176x80`, `ufixed184x0`, `ufixed184x1`, `ufixed184x2`, `ufixed184x3`, `ufixed184x4`, `ufixed184x5`, `ufixed184x6`, `ufixed184x7`, `ufixed184x8`, `ufixed184x9`, `ufixed184x10`, `ufixed184x11`, `ufixed184x12`, `ufixed184x13`, `ufixed184x14`, `ufixed184x15`, `ufixed184x16`, `ufixed184x17`, `ufixed184x18`, `ufixed184x19`, `ufixed184x20`, `ufixed184x21`, `ufixed184x22`, `ufixed184x23`, `ufixed184x24`, `ufixed184x25`, `ufixed184x26`, `ufixed184x27`, `ufixed184x28`, `ufixed184x29`, `ufixed184x30`, `ufixed184x31`, `ufixed184x32`, `ufixed184x33`, `ufixed184x34`, `ufixed184x35`, `ufixed184x36`, `ufixed184x37`, `ufixed184x38`, `ufixed184x39`, `ufixed184x40`, `ufixed184x41`, `ufixed184x42`, `ufixed184x43`, `ufixed184x44`, `ufixed184x45`, `ufixed184x46`, `ufixed184x47`, `ufixed184x48`, `ufixed184x49`, `ufixed184x50`, `ufixed184x51`, `ufixed184x52`, `ufixed184x53`, `ufixed184x54`, `ufixed184x55`, `ufixed184x56`, `ufixed184x57`, `ufixed184x58`, `ufixed184x59`, `ufixed184x60`, `ufixed184x61`, `ufixed184x62`, `ufixed184x63`, `ufixed184x64`, `ufixed184x65`, `ufixed184x66`, `ufixed184x67`, `ufixed184x68`, `ufixed184x69`, `ufixed184x70`, `ufixed184x71`, `ufixed184x72`, `ufixed192x0`, `ufixed192x1`, `ufixed192x2`, `ufixed192x3`, `ufixed192x4`, `ufixed192x5`, `ufixed192x6`, `ufixed192x7`, `ufixed192x8`, `ufixed192x9`, `ufixed192x10`, `ufixed192x11`, `ufixed192x12`, `ufixed192x13`, `ufixed192x14`, `ufixed192x15`, `ufixed192x16`, `ufixed192x17`, `ufixed192x18`, `ufixed192x19`, `ufixed192x20`, `ufixed192x21`, `ufixed192x22`, `ufixed192x23`, `ufixed192x24`, `ufixed192x25`, `ufixed192x26`, `ufixed192x27`, `ufixed192x28`, `ufixed192x29`, `ufixed192x30`, `ufixed192x31`, `ufixed192x32`, `ufixed192x33`, `ufixed192x34`, `ufixed192x35`, `ufixed192x36`, `ufixed192x37`, `ufixed192x38`, `ufixed192x39`, `ufixed192x40`, `ufixed192x41`, `ufixed192x42`, `ufixed192x43`, `ufixed192x44`, `ufixed192x45`, `ufixed192x46`, `ufixed192x47`, `ufixed192x48`, `ufixed192x49`, `ufixed192x50`, `ufixed192x51`, `ufixed192x52`, `ufixed192x53`, `ufixed192x54`, `ufixed192x55`, `ufixed192x56`, `ufixed192x57`, `ufixed192x58`, `ufixed192x59`, `ufixed192x60`, `ufixed192x61`, `ufixed192x62`, `ufixed192x63`, `ufixed192x64`, `ufixed200x0`, `ufixed200x1`, `ufixed200x2`, `ufixed200x3`, `ufixed200x4`, `ufixed200x5`, `ufixed200x6`, `ufixed200x7`, `ufixed200x8`, `ufixed200x9`, `ufixed200x10`, `ufixed200x11`, `ufixed200x12`, `ufixed200x13`, `ufixed200x14`, `ufixed200x15`, `ufixed200x16`, `ufixed200x17`, `ufixed200x18`, `ufixed200x19`, `ufixed200x20`, `ufixed200x21`, `ufixed200x22`, `ufixed200x23`, `ufixed200x24`, `ufixed200x25`, `ufixed200x26`, `ufixed200x27`, `ufixed200x28`, `ufixed200x29`, `ufixed200x30`, `ufixed200x31`, `ufixed200x32`, `ufixed200x33`, `ufixed200x34`, `ufixed200x35`, `ufixed200x36`, `ufixed200x37`, `ufixed200x38`, `ufixed200x39`, `ufixed200x40`, `ufixed200x41`, `ufixed200x42`, `ufixed200x43`, `ufixed200x44`, `ufixed200x45`, `ufixed200x46`, `ufixed200x47`, `ufixed200x48`, `ufixed200x49`, `ufixed200x50`, `ufixed200x51`, `ufixed200x52`, `ufixed200x53`, `ufixed200x54`, `ufixed200x55`, `ufixed200x56`, `ufixed208x0`, `ufixed208x1`, `ufixed208x2`, `ufixed208x3`, `ufixed208x4`, `ufixed208x5`, `ufixed208x6`, `ufixed208x7`, `ufixed208x8`, `ufixed208x9`, `ufixed208x10`, `ufixed208x11`, `ufixed208x12`, `ufixed208x13`, `ufixed208x14`, `ufixed208x15`, `ufixed208x16`, `ufixed208x17`, `ufixed208x18`, `ufixed208x19`, `ufixed208x20`, `ufixed208x21`, `ufixed208x22`, `ufixed208x23`, `ufixed208x24`, `ufixed208x25`, `ufixed208x26`, `ufixed208x27`, `ufixed208x28`, `ufixed208x29`, `ufixed208x30`, `ufixed208x31`, `ufixed208x32`, `ufixed208x33`, `ufixed208x34`, `ufixed208x35`, `ufixed208x36`, `ufixed208x37`, `ufixed208x38`, `ufixed208x39`, `ufixed208x40`, `ufixed208x41`, `ufixed208x42`, `ufixed208x43`, `ufixed208x44`, `ufixed208x45`, `ufixed208x46`, `ufixed208x47`, `ufixed208x48`, `ufixed216x0`, `ufixed216x1`, `ufixed216x2`, `ufixed216x3`, `ufixed216x4`, `ufixed216x5`, `ufixed216x6`, `ufixed216x7`, `ufixed216x8`, `ufixed216x9`, `ufixed216x10`, `ufixed216x11`, `ufixed216x12`, `ufixed216x13`, `ufixed216x14`, `ufixed216x15`, `ufixed216x16`, `ufixed216x17`, `ufixed216x18`, `ufixed216x19`, `ufixed216x20`, `ufixed216x21`, `ufixed216x22`, `ufixed216x23`, `ufixed216x24`, `ufixed216x25`, `ufixed216x26`, `ufixed216x27`, `ufixed216x28`, `ufixed216x29`, `ufixed216x30`, `ufixed216x31`, `ufixed216x32`, `ufixed216x33`, `ufixed216x34`, `ufixed216x35`, `ufixed216x36`, `ufixed216x37`, `ufixed216x38`, `ufixed216x39`, `ufixed216x40`, `ufixed224x0`, `ufixed224x1`, `ufixed224x2`, `ufixed224x3`, `ufixed224x4`, `ufixed224x5`, `ufixed224x6`, `ufixed224x7`, `ufixed224x8`, `ufixed224x9`, `ufixed224x10`, `ufixed224x11`, `ufixed224x12`, `ufixed224x13`, `ufixed224x14`, `ufixed224x15`, `ufixed224x16`, `ufixed224x17`, `ufixed224x18`, `ufixed224x19`, `ufixed224x20`, `ufixed224x21`, `ufixed224x22`, `ufixed224x23`, `ufixed224x24`, `ufixed224x25`, `ufixed224x26`, `ufixed224x27`, `ufixed224x28`, `ufixed224x29`, `ufixed224x30`, `ufixed224x31`, `ufixed224x32`, `ufixed232x0`, `ufixed232x1`, `ufixed232x2`, `ufixed232x3`, `ufixed232x4`, `ufixed232x5`, `ufixed232x6`, `ufixed232x7`, `ufixed232x8`, `ufixed232x9`, `ufixed232x10`, `ufixed232x11`, `ufixed232x12`, `ufixed232x13`, `ufixed232x14`, `ufixed232x15`, `ufixed232x16`, `ufixed232x17`, `ufixed232x18`, `ufixed232x19`, `ufixed232x20`, `ufixed232x21`, `ufixed232x22`, `ufixed232x23`, `ufixed232x24`, `ufixed240x0`, `ufixed240x1`, `ufixed240x2`, `ufixed240x3`, `ufixed240x4`, `ufixed240x5`, `ufixed240x6`, `ufixed240x7`, `ufixed240x8`, `ufixed240x9`, `ufixed240x10`, `ufixed240x11`, `ufixed240x12`, `ufixed240x13`, `ufixed240x14`, `ufixed240x15`, `ufixed240x16`, `ufixed248x0`, `ufixed248x1`, `ufixed248x2`, `ufixed248x3`, `ufixed248x4`, `ufixed248x5`, `ufixed248x6`, `ufixed248x7`, `ufixed248x8`, `ufixed256x0`), KeywordType, nil}, + }, + "numbers": { + {`0[xX][0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + }, + "string-parse-common": { + {`\\(u[0-9a-fA-F]{4}|x..|[^x])`, LiteralStringEscape, nil}, + {`[^\\"\'\n]+`, LiteralString, nil}, + {`\\\n`, LiteralString, nil}, + {`\\`, LiteralString, nil}, + }, + "string-parse-double": { + {`"`, LiteralString, Pop(1)}, + {`'`, LiteralString, nil}, + }, + "string-parse-single": { + {`'`, LiteralString, Pop(1)}, + {`"`, LiteralString, nil}, + }, + "strings": { + {`hex'[0-9a-fA-F]+'`, LiteralString, nil}, + {`hex"[0-9a-fA-F]+"`, LiteralString, nil}, + {`"`, LiteralString, Combined("string-parse-common", "string-parse-double")}, + {`'`, LiteralString, Combined("string-parse-common", "string-parse-single")}, + }, + "whitespace": { + {`\s+`, Text, nil}, + }, + "root": { + Include("comments"), + Include("keywords-types"), + Include("keywords-other"), + Include("numbers"), + Include("strings"), + Include("whitespace"), + {`\+\+|--|\*\*|\?|:|~|&&|\|\||=>|==?|!=?|(<<|>>>?|[-<>+*%&|^/])=?`, Operator, nil}, + {`[{(\[;,]`, Punctuation, nil}, + {`[})\].]`, Punctuation, nil}, + {`(abi|block|msg|tx)\b`, NameBuiltin, nil}, + {`(?!abi\.)(decode|encode|encodePacked|encodeWithSelector|encodeWithSignature|encodeWithSelector)\b`, NameBuiltin, nil}, + {`(?!block\.)(chainid|coinbase|difficulty|gaslimit|number|timestamp)\b`, NameBuiltin, nil}, + {`(?!msg\.)(data|gas|sender|value)\b`, NameBuiltin, nil}, + {`(?!tx\.)(gasprice|origin)\b`, NameBuiltin, nil}, + {`(type)(\()([a-zA-Z_]\w*)(\))`, ByGroups(NameBuiltin, Punctuation, NameClass, Punctuation), nil}, + {`(?!type\([a-zA-Z_]\w*\)\.)(creationCode|interfaceId|max|min|name|runtimeCode)\b`, NameBuiltin, nil}, + {`(now|this|super|gasleft)\b`, NameBuiltin, nil}, + {`(selfdestruct|suicide)\b`, NameBuiltin, nil}, + {`(?!0x[0-9a-fA-F]+\.)(balance|code|codehash|send|transfer)\b`, NameBuiltin, nil}, + {`(assert|revert|require)\b`, NameBuiltin, nil}, + {`(call|callcode|delegatecall)\b`, NameBuiltin, nil}, + {`selector\b`, NameBuiltin, nil}, + {`(addmod|blockhash|ecrecover|keccak256|mulmod|ripemd160|sha256|sha3)\b`, NameBuiltin, nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/sparql.go b/vendor/github.com/alecthomas/chroma/lexers/s/sparql.go new file mode 100644 index 0000000..3f56f9c --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/sparql.go @@ -0,0 +1,73 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Sparql lexer. +var Sparql = internal.Register(MustNewLazyLexer( + &Config{ + Name: "SPARQL", + Aliases: []string{"sparql"}, + Filenames: []string{"*.rq", "*.sparql"}, + MimeTypes: []string{"application/sparql-query"}, + }, + sparqlRules, +)) + +func sparqlRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`((?i)select|construct|describe|ask|where|filter|group\s+by|minus|distinct|reduced|from\s+named|from|order\s+by|desc|asc|limit|offset|bindings|load|clear|drop|create|add|move|copy|insert\s+data|delete\s+data|delete\s+where|delete|insert|using\s+named|using|graph|default|named|all|optional|service|silent|bind|union|not\s+in|in|as|having|to|prefix|base)\b`, Keyword, nil}, + {`(a)\b`, Keyword, nil}, + {"(<(?:[^<>\"{}|^`\\\\\\x00-\\x20])*>)", NameLabel, nil}, + {`(_:[_\p{L}\p{N}](?:[-_.\p{L}\p{N}]*[-_\p{L}\p{N}])?)`, NameLabel, nil}, + {`[?$][_\p{L}\p{N}]+`, NameVariable, nil}, + {`([\p{L}][-_.\p{L}\p{N}]*)?(\:)((?:[_:\p{L}\p{N}]|(?:%[0-9A-Fa-f][0-9A-Fa-f])|(?:\\[ _~.\-!$&"()*+,;=/?#@%]))(?:(?:[-_:.\p{L}\p{N}]|(?:%[0-9A-Fa-f][0-9A-Fa-f])|(?:\\[ _~.\-!$&"()*+,;=/?#@%]))*(?:[-_:\p{L}\p{N}]|(?:%[0-9A-Fa-f][0-9A-Fa-f])|(?:\\[ _~.\-!$&"()*+,;=/?#@%])))?)?`, ByGroups(NameNamespace, Punctuation, NameTag), nil}, + {`((?i)str|lang|langmatches|datatype|bound|iri|uri|bnode|rand|abs|ceil|floor|round|concat|strlen|ucase|lcase|encode_for_uri|contains|strstarts|strends|strbefore|strafter|year|month|day|hours|minutes|seconds|timezone|tz|now|md5|sha1|sha256|sha384|sha512|coalesce|if|strlang|strdt|sameterm|isiri|isuri|isblank|isliteral|isnumeric|regex|substr|replace|exists|not\s+exists|count|sum|min|max|avg|sample|group_concat|separator)\b`, NameFunction, nil}, + {`(true|false)`, KeywordConstant, nil}, + {`[+\-]?(\d+\.\d*[eE][+-]?\d+|\.?\d+[eE][+-]?\d+)`, LiteralNumberFloat, nil}, + {`[+\-]?(\d+\.\d*|\.\d+)`, LiteralNumberFloat, nil}, + {`[+\-]?\d+`, LiteralNumberInteger, nil}, + {`(\|\||&&|=|\*|\-|\+|/|!=|<=|>=|!|<|>)`, Operator, nil}, + {`[(){}.;,:^\[\]]`, Punctuation, nil}, + {`#[^\n]*`, Comment, nil}, + {`"""`, LiteralString, Push("triple-double-quoted-string")}, + {`"`, LiteralString, Push("single-double-quoted-string")}, + {`'''`, LiteralString, Push("triple-single-quoted-string")}, + {`'`, LiteralString, Push("single-single-quoted-string")}, + }, + "triple-double-quoted-string": { + {`"""`, LiteralString, Push("end-of-string")}, + {`[^\\]+`, LiteralString, nil}, + {`\\`, LiteralString, Push("string-escape")}, + }, + "single-double-quoted-string": { + {`"`, LiteralString, Push("end-of-string")}, + {`[^"\\\n]+`, LiteralString, nil}, + {`\\`, LiteralString, Push("string-escape")}, + }, + "triple-single-quoted-string": { + {`'''`, LiteralString, Push("end-of-string")}, + {`[^\\]+`, LiteralString, nil}, + {`\\`, LiteralStringEscape, Push("string-escape")}, + }, + "single-single-quoted-string": { + {`'`, LiteralString, Push("end-of-string")}, + {`[^'\\\n]+`, LiteralString, nil}, + {`\\`, LiteralString, Push("string-escape")}, + }, + "string-escape": { + {`u[0-9A-Fa-f]{4}`, LiteralStringEscape, Pop(1)}, + {`U[0-9A-Fa-f]{8}`, LiteralStringEscape, Pop(1)}, + {`.`, LiteralStringEscape, Pop(1)}, + }, + "end-of-string": { + {`(@)([a-zA-Z]+(?:-[a-zA-Z0-9]+)*)`, ByGroups(Operator, NameFunction), Pop(2)}, + {`\^\^`, Operator, Pop(2)}, + Default(Pop(2)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/sql.go b/vendor/github.com/alecthomas/chroma/lexers/s/sql.go new file mode 100644 index 0000000..fb8c8ed --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/sql.go @@ -0,0 +1,53 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// SQL lexer. +var SQL = internal.Register(MustNewLazyLexer( + &Config{ + Name: "SQL", + Aliases: []string{"sql"}, + Filenames: []string{"*.sql"}, + MimeTypes: []string{"text/x-sql"}, + NotMultiline: true, + CaseInsensitive: true, + }, + sqlRules, +)) + +func sqlRules() Rules { + return Rules{ + "root": { + {`\s+`, TextWhitespace, nil}, + {`--.*\n?`, CommentSingle, nil}, + {`/\*`, CommentMultiline, Push("multiline-comments")}, + {`'`, LiteralStringSingle, Push("string")}, + {`"`, LiteralStringDouble, Push("double-string")}, + {Words(``, `\b`, `ABORT`, `ABS`, `ABSOLUTE`, `ACCESS`, `ADA`, `ADD`, `ADMIN`, `AFTER`, `AGGREGATE`, `ALIAS`, `ALL`, `ALLOCATE`, `ALTER`, `ANALYSE`, `ANALYZE`, `AND`, `ANY`, `ARE`, `AS`, `ASC`, `ASENSITIVE`, `ASSERTION`, `ASSIGNMENT`, `ASYMMETRIC`, `AT`, `ATOMIC`, `AUTHORIZATION`, `AVG`, `BACKWARD`, `BEFORE`, `BEGIN`, `BETWEEN`, `BITVAR`, `BIT_LENGTH`, `BOTH`, `BREADTH`, `BY`, `C`, `CACHE`, `CALL`, `CALLED`, `CARDINALITY`, `CASCADE`, `CASCADED`, `CASE`, `CAST`, `CATALOG`, `CATALOG_NAME`, `CHAIN`, `CHARACTERISTICS`, `CHARACTER_LENGTH`, `CHARACTER_SET_CATALOG`, `CHARACTER_SET_NAME`, `CHARACTER_SET_SCHEMA`, `CHAR_LENGTH`, `CHECK`, `CHECKED`, `CHECKPOINT`, `CLASS`, `CLASS_ORIGIN`, `CLOB`, `CLOSE`, `CLUSTER`, `COALSECE`, `COBOL`, `COLLATE`, `COLLATION`, `COLLATION_CATALOG`, `COLLATION_NAME`, `COLLATION_SCHEMA`, `COLUMN`, `COLUMN_NAME`, `COMMAND_FUNCTION`, `COMMAND_FUNCTION_CODE`, `COMMENT`, `COMMIT`, `COMMITTED`, `COMPLETION`, `CONDITION_NUMBER`, `CONNECT`, `CONNECTION`, `CONNECTION_NAME`, `CONSTRAINT`, `CONSTRAINTS`, `CONSTRAINT_CATALOG`, `CONSTRAINT_NAME`, `CONSTRAINT_SCHEMA`, `CONSTRUCTOR`, `CONTAINS`, `CONTINUE`, `CONVERSION`, `CONVERT`, `COPY`, `CORRESPONTING`, `COUNT`, `CREATE`, `CREATEDB`, `CREATEUSER`, `CROSS`, `CUBE`, `CURRENT`, `CURRENT_DATE`, `CURRENT_PATH`, `CURRENT_ROLE`, `CURRENT_TIME`, `CURRENT_TIMESTAMP`, `CURRENT_USER`, `CURSOR`, `CURSOR_NAME`, `CYCLE`, `DATA`, `DATABASE`, `DATETIME_INTERVAL_CODE`, `DATETIME_INTERVAL_PRECISION`, `DAY`, `DEALLOCATE`, `DECLARE`, `DEFAULT`, `DEFAULTS`, `DEFERRABLE`, `DEFERRED`, `DEFINED`, `DEFINER`, `DELETE`, `DELIMITER`, `DELIMITERS`, `DEREF`, `DESC`, `DESCRIBE`, `DESCRIPTOR`, `DESTROY`, `DESTRUCTOR`, `DETERMINISTIC`, `DIAGNOSTICS`, `DICTIONARY`, `DISCONNECT`, `DISPATCH`, `DISTINCT`, `DO`, `DOMAIN`, `DROP`, `DYNAMIC`, `DYNAMIC_FUNCTION`, `DYNAMIC_FUNCTION_CODE`, `EACH`, `ELSE`, `ELSIF`, `ENCODING`, `ENCRYPTED`, `END`, `END-EXEC`, `EQUALS`, `ESCAPE`, `EVERY`, `EXCEPTION`, `EXCEPT`, `EXCLUDING`, `EXCLUSIVE`, `EXEC`, `EXECUTE`, `EXISTING`, `EXISTS`, `EXPLAIN`, `EXTERNAL`, `EXTRACT`, `FALSE`, `FETCH`, `FINAL`, `FIRST`, `FOR`, `FORCE`, `FOREIGN`, `FORTRAN`, `FORWARD`, `FOUND`, `FREE`, `FREEZE`, `FROM`, `FULL`, `FUNCTION`, `G`, `GENERAL`, `GENERATED`, `GET`, `GLOBAL`, `GO`, `GOTO`, `GRANT`, `GRANTED`, `GROUP`, `GROUPING`, `HANDLER`, `HAVING`, `HIERARCHY`, `HOLD`, `HOST`, `IDENTITY`, `IF`, `IGNORE`, `ILIKE`, `IMMEDIATE`, `IMMUTABLE`, `IMPLEMENTATION`, `IMPLICIT`, `IN`, `INCLUDING`, `INCREMENT`, `INDEX`, `INDITCATOR`, `INFIX`, `INHERITS`, `INITIALIZE`, `INITIALLY`, `INNER`, `INOUT`, `INPUT`, `INSENSITIVE`, `INSERT`, `INSTANTIABLE`, `INSTEAD`, `INTERSECT`, `INTO`, `INVOKER`, `IS`, `ISNULL`, `ISOLATION`, `ITERATE`, `JOIN`, `KEY`, `KEY_MEMBER`, `KEY_TYPE`, `LANCOMPILER`, `LANGUAGE`, `LARGE`, `LAST`, `LATERAL`, `LEADING`, `LEFT`, `LENGTH`, `LESS`, `LEVEL`, `LIKE`, `LIMIT`, `LISTEN`, `LOAD`, `LOCAL`, `LOCALTIME`, `LOCALTIMESTAMP`, `LOCATION`, `LOCATOR`, `LOCK`, `LOWER`, `MAP`, `MATCH`, `MAX`, `MAXVALUE`, `MESSAGE_LENGTH`, `MESSAGE_OCTET_LENGTH`, `MESSAGE_TEXT`, `METHOD`, `MIN`, `MINUTE`, `MINVALUE`, `MOD`, `MODE`, `MODIFIES`, `MODIFY`, `MONTH`, `MORE`, `MOVE`, `MUMPS`, `NAMES`, `NATIONAL`, `NATURAL`, `NCHAR`, `NCLOB`, `NEW`, `NEXT`, `NO`, `NOCREATEDB`, `NOCREATEUSER`, `NONE`, `NOT`, `NOTHING`, `NOTIFY`, `NOTNULL`, `NULL`, `NULLABLE`, `NULLIF`, `OBJECT`, `OCTET_LENGTH`, `OF`, `OFF`, `OFFSET`, `OIDS`, `OLD`, `ON`, `ONLY`, `OPEN`, `OPERATION`, `OPERATOR`, `OPTION`, `OPTIONS`, `OR`, `ORDER`, `ORDINALITY`, `OUT`, `OUTER`, `OUTPUT`, `OVERLAPS`, `OVERLAY`, `OVERRIDING`, `OWNER`, `PAD`, `PARAMETER`, `PARAMETERS`, `PARAMETER_MODE`, `PARAMATER_NAME`, `PARAMATER_ORDINAL_POSITION`, `PARAMETER_SPECIFIC_CATALOG`, `PARAMETER_SPECIFIC_NAME`, `PARAMATER_SPECIFIC_SCHEMA`, `PARTIAL`, `PASCAL`, `PENDANT`, `PLACING`, `PLI`, `POSITION`, `POSTFIX`, `PRECISION`, `PREFIX`, `PREORDER`, `PREPARE`, `PRESERVE`, `PRIMARY`, `PRIOR`, `PRIVILEGES`, `PROCEDURAL`, `PROCEDURE`, `PUBLIC`, `READ`, `READS`, `RECHECK`, `RECURSIVE`, `REF`, `REFERENCES`, `REFERENCING`, `REINDEX`, `RELATIVE`, `RENAME`, `REPEATABLE`, `REPLACE`, `RESET`, `RESTART`, `RESTRICT`, `RESULT`, `RETURN`, `RETURNED_LENGTH`, `RETURNED_OCTET_LENGTH`, `RETURNED_SQLSTATE`, `RETURNS`, `REVOKE`, `RIGHT`, `ROLE`, `ROLLBACK`, `ROLLUP`, `ROUTINE`, `ROUTINE_CATALOG`, `ROUTINE_NAME`, `ROUTINE_SCHEMA`, `ROW`, `ROWS`, `ROW_COUNT`, `RULE`, `SAVE_POINT`, `SCALE`, `SCHEMA`, `SCHEMA_NAME`, `SCOPE`, `SCROLL`, `SEARCH`, `SECOND`, `SECURITY`, `SELECT`, `SELF`, `SENSITIVE`, `SERIALIZABLE`, `SERVER_NAME`, `SESSION`, `SESSION_USER`, `SET`, `SETOF`, `SETS`, `SHARE`, `SHOW`, `SIMILAR`, `SIMPLE`, `SIZE`, `SOME`, `SOURCE`, `SPACE`, `SPECIFIC`, `SPECIFICTYPE`, `SPECIFIC_NAME`, `SQL`, `SQLCODE`, `SQLERROR`, `SQLEXCEPTION`, `SQLSTATE`, `SQLWARNINIG`, `STABLE`, `START`, `STATE`, `STATEMENT`, `STATIC`, `STATISTICS`, `STDIN`, `STDOUT`, `STORAGE`, `STRICT`, `STRUCTURE`, `STYPE`, `SUBCLASS_ORIGIN`, `SUBLIST`, `SUBSTRING`, `SUM`, `SYMMETRIC`, `SYSID`, `SYSTEM`, `SYSTEM_USER`, `TABLE`, `TABLE_NAME`, ` TEMP`, `TEMPLATE`, `TEMPORARY`, `TERMINATE`, `THAN`, `THEN`, `TIMESTAMP`, `TIMEZONE_HOUR`, `TIMEZONE_MINUTE`, `TO`, `TOAST`, `TRAILING`, `TRANSACTION`, `TRANSACTIONS_COMMITTED`, `TRANSACTIONS_ROLLED_BACK`, `TRANSACTION_ACTIVE`, `TRANSFORM`, `TRANSFORMS`, `TRANSLATE`, `TRANSLATION`, `TREAT`, `TRIGGER`, `TRIGGER_CATALOG`, `TRIGGER_NAME`, `TRIGGER_SCHEMA`, `TRIM`, `TRUE`, `TRUNCATE`, `TRUSTED`, `TYPE`, `UNCOMMITTED`, `UNDER`, `UNENCRYPTED`, `UNION`, `UNIQUE`, `UNKNOWN`, `UNLISTEN`, `UNNAMED`, `UNNEST`, `UNTIL`, `UPDATE`, `UPPER`, `USAGE`, `USER`, `USER_DEFINED_TYPE_CATALOG`, `USER_DEFINED_TYPE_NAME`, `USER_DEFINED_TYPE_SCHEMA`, `USING`, `VACUUM`, `VALID`, `VALIDATOR`, `VALUES`, `VARIABLE`, `VERBOSE`, `VERSION`, `VIEW`, `VOLATILE`, `WHEN`, `WHENEVER`, `WHERE`, `WITH`, `WITHOUT`, `WORK`, `WRITE`, `YEAR`, `ZONE`), Keyword, nil}, + {Words(``, `\b`, `ARRAY`, `BIGINT`, `BINARY`, `BIT`, `BLOB`, `BOOLEAN`, `CHAR`, `CHARACTER`, `DATE`, `DEC`, `DECIMAL`, `FLOAT`, `INT`, `INTEGER`, `INTERVAL`, `NUMBER`, `NUMERIC`, `REAL`, `SERIAL`, `SMALLINT`, `VARCHAR`, `VARYING`, `INT8`, `SERIAL8`, `TEXT`), NameBuiltin, nil}, + {"[+*/<>=~!@#%^&|`?-]", Operator, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`[a-z_][\w$]*`, Name, nil}, + {`[;:()\[\],.]`, Punctuation, nil}, + }, + "multiline-comments": { + {`/\*`, CommentMultiline, Push("multiline-comments")}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[^/*]+`, CommentMultiline, nil}, + {`[/*]`, CommentMultiline, nil}, + }, + "string": { + {`[^']+`, LiteralStringSingle, nil}, + {`''`, LiteralStringSingle, nil}, + {`'`, LiteralStringSingle, Pop(1)}, + }, + "double-string": { + {`[^"]+`, LiteralStringDouble, nil}, + {`""`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/squid.go b/vendor/github.com/alecthomas/chroma/lexers/s/squid.go new file mode 100644 index 0000000..b4da3da --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/squid.go @@ -0,0 +1,42 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Squidconf lexer. +var Squidconf = internal.Register(MustNewLazyLexer( + &Config{ + Name: "SquidConf", + Aliases: []string{"squidconf", "squid.conf", "squid"}, + Filenames: []string{"squid.conf"}, + MimeTypes: []string{"text/x-squidconf"}, + NotMultiline: true, + CaseInsensitive: true, + }, + squidconfRules, +)) + +func squidconfRules() Rules { + return Rules{ + "root": { + {`\s+`, TextWhitespace, nil}, + {`#`, Comment, Push("comment")}, + {Words(`\b`, `\b`, `access_log`, `acl`, `always_direct`, `announce_host`, `announce_period`, `announce_port`, `announce_to`, `anonymize_headers`, `append_domain`, `as_whois_server`, `auth_param_basic`, `authenticate_children`, `authenticate_program`, `authenticate_ttl`, `broken_posts`, `buffered_logs`, `cache_access_log`, `cache_announce`, `cache_dir`, `cache_dns_program`, `cache_effective_group`, `cache_effective_user`, `cache_host`, `cache_host_acl`, `cache_host_domain`, `cache_log`, `cache_mem`, `cache_mem_high`, `cache_mem_low`, `cache_mgr`, `cachemgr_passwd`, `cache_peer`, `cache_peer_access`, `cahce_replacement_policy`, `cache_stoplist`, `cache_stoplist_pattern`, `cache_store_log`, `cache_swap`, `cache_swap_high`, `cache_swap_log`, `cache_swap_low`, `client_db`, `client_lifetime`, `client_netmask`, `connect_timeout`, `coredump_dir`, `dead_peer_timeout`, `debug_options`, `delay_access`, `delay_class`, `delay_initial_bucket_level`, `delay_parameters`, `delay_pools`, `deny_info`, `dns_children`, `dns_defnames`, `dns_nameservers`, `dns_testnames`, `emulate_httpd_log`, `err_html_text`, `fake_user_agent`, `firewall_ip`, `forwarded_for`, `forward_snmpd_port`, `fqdncache_size`, `ftpget_options`, `ftpget_program`, `ftp_list_width`, `ftp_passive`, `ftp_user`, `half_closed_clients`, `header_access`, `header_replace`, `hierarchy_stoplist`, `high_response_time_warning`, `high_page_fault_warning`, `hosts_file`, `htcp_port`, `http_access`, `http_anonymizer`, `httpd_accel`, `httpd_accel_host`, `httpd_accel_port`, `httpd_accel_uses_host_header`, `httpd_accel_with_proxy`, `http_port`, `http_reply_access`, `icp_access`, `icp_hit_stale`, `icp_port`, `icp_query_timeout`, `ident_lookup`, `ident_lookup_access`, `ident_timeout`, `incoming_http_average`, `incoming_icp_average`, `inside_firewall`, `ipcache_high`, `ipcache_low`, `ipcache_size`, `local_domain`, `local_ip`, `logfile_rotate`, `log_fqdn`, `log_icp_queries`, `log_mime_hdrs`, `maximum_object_size`, `maximum_single_addr_tries`, `mcast_groups`, `mcast_icp_query_timeout`, `mcast_miss_addr`, `mcast_miss_encode_key`, `mcast_miss_port`, `memory_pools`, `memory_pools_limit`, `memory_replacement_policy`, `mime_table`, `min_http_poll_cnt`, `min_icp_poll_cnt`, `minimum_direct_hops`, `minimum_object_size`, `minimum_retry_timeout`, `miss_access`, `negative_dns_ttl`, `negative_ttl`, `neighbor_timeout`, `neighbor_type_domain`, `netdb_high`, `netdb_low`, `netdb_ping_period`, `netdb_ping_rate`, `never_direct`, `no_cache`, `passthrough_proxy`, `pconn_timeout`, `pid_filename`, `pinger_program`, `positive_dns_ttl`, `prefer_direct`, `proxy_auth`, `proxy_auth_realm`, `query_icmp`, `quick_abort`, `quick_abort_max`, `quick_abort_min`, `quick_abort_pct`, `range_offset_limit`, `read_timeout`, `redirect_children`, `redirect_program`, `redirect_rewrites_host_header`, `reference_age`, `refresh_pattern`, `reload_into_ims`, `request_body_max_size`, `request_size`, `request_timeout`, `shutdown_lifetime`, `single_parent_bypass`, `siteselect_timeout`, `snmp_access`, `snmp_incoming_address`, `snmp_port`, `source_ping`, `ssl_proxy`, `store_avg_object_size`, `store_objects_per_bucket`, `strip_query_terms`, `swap_level1_dirs`, `swap_level2_dirs`, `tcp_incoming_address`, `tcp_outgoing_address`, `tcp_recv_bufsize`, `test_reachability`, `udp_hit_obj`, `udp_hit_obj_size`, `udp_incoming_address`, `udp_outgoing_address`, `unique_hostname`, `unlinkd_program`, `uri_whitespace`, `useragent_log`, `visible_hostname`, `wais_relay`, `wais_relay_host`, `wais_relay_port`), Keyword, nil}, + {Words(`\b`, `\b`, `proxy-only`, `weight`, `ttl`, `no-query`, `default`, `round-robin`, `multicast-responder`, `on`, `off`, `all`, `deny`, `allow`, `via`, `parent`, `no-digest`, `heap`, `lru`, `realm`, `children`, `q1`, `q2`, `credentialsttl`, `none`, `disable`, `offline_toggle`, `diskd`), NameConstant, nil}, + {Words(`\b`, `\b`, `shutdown`, `info`, `parameter`, `server_list`, `client_list`, `squid.conf`), LiteralString, nil}, + {Words(`stats/`, `\b`, `objects`, `vm_objects`, `utilization`, `ipcache`, `fqdncache`, `dns`, `redirector`, `io`, `reply_headers`, `filedescriptors`, `netdb`), LiteralString, nil}, + {Words(`log/`, `=`, `status`, `enable`, `disable`, `clear`), LiteralString, nil}, + {Words(`\b`, `\b`, `url_regex`, `urlpath_regex`, `referer_regex`, `port`, `proto`, `req_mime_type`, `rep_mime_type`, `method`, `browser`, `user`, `src`, `dst`, `time`, `dstdomain`, `ident`, `snmp_community`), Keyword, nil}, + {`(?:(?:(?:[3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}|0x0*[0-9a-f]{1,2}|0+[1-3]?[0-7]{0,2})(?:\.(?:[3-9]\d?|2(?:5[0-5]|[0-4]?\d)?|1\d{0,2}|0x0*[0-9a-f]{1,2}|0+[1-3]?[0-7]{0,2})){3})|(?!.*::.*::)(?:(?!:)|:(?=:))(?:[0-9a-f]{0,4}(?:(?<=::)|(?\=|\<|\>|\=\=|\!\=|\&\&|\|\||\=|\:\=|\?\=|\+\=|\-\=|\*\=|\/\=|\%\=|\?|\:)`, Operator, nil}, + {`\b(and|if unless|in|is|is a|is defined|is not|isnt|or|not)\b`, OperatorWord, nil}, + {`(\#[a-f0-9]{3,6})`, LiteralNumberHex, nil}, + {`\n`, Text, nil}, + }, + "inline-comment": { + {`\*/`, Comment, Pop(1)}, + }, + "atrule": { + {`\{`, Punctuation, Push("atcontent")}, + {`$`, Punctuation, Pop(1)}, + Include("root"), + }, + "atcontent": { + Include("root"), + {`\}`, Punctuation, Pop(2)}, + }, + "function-start": { + {`\)`, Punctuation, Pop(1)}, + Include("root"), + }, + "values": { + {`\s+`, Text, nil}, + {`(\#[a-f0-9]{3,6})`, LiteralNumberHex, nil}, + {Words(`\b`, `\b`, `absolute`, `alias`, `all`, `all-petite-caps`, `all-scroll`, `all-small-caps`, `allow-end`, `alpha`, `alternate`, `alternate-reverse`, `always`, `armenian`, `auto`, `avoid`, `avoid-column`, `avoid-page`, `backwards`, `balance`, `baseline`, `below`, `blink`, `block`, `bold`, `bolder`, `border-box`, `both`, `bottom`, `box-decoration`, `break-word`, `capitalize`, `cell`, `center`, `circle`, `clip`, `clone`, `close-quote`, `col-resize`, `collapse`, `color`, `color-burn`, `color-dodge`, `column`, `column-reverse`, `compact`, `condensed`, `contain`, `container`, `content-box`, `context-menu`, `copy`, `cover`, `crisp-edges`, `crosshair`, `currentColor`, `cursive`, `darken`, `dashed`, `decimal`, `decimal-leading-zero`, `default`, `descendants`, `difference`, `digits`, `disc`, `distribute`, `dot`, `dotted`, `double`, `double-circle`, `e-resize`, `each-line`, `ease`, `ease-in`, `ease-in-out`, `ease-out`, `edges`, `ellipsis`, `end`, `ew-resize`, `exclusion`, `expanded`, `extra-condensed`, `extra-expanded`, `fantasy`, `fill`, `fill-box`, `filled`, `first`, `fixed`, `flat`, `flex`, `flex-end`, `flex-start`, `flip`, `force-end`, `forwards`, `from-image`, `full-width`, `geometricPrecision`, `georgian`, `groove`, `hanging`, `hard-light`, `help`, `hidden`, `hide`, `horizontal`, `hue`, `icon`, `infinite`, `inherit`, `initial`, `ink`, `inline`, `inline-block`, `inline-flex`, `inline-table`, `inset`, `inside`, `inter-word`, `invert`, `isolate`, `italic`, `justify`, `large`, `larger`, `last`, `left`, `lighten`, `lighter`, `line-through`, `linear`, `list-item`, `local`, `loose`, `lower-alpha`, `lower-greek`, `lower-latin`, `lower-roman`, `lowercase`, `ltr`, `luminance`, `luminosity`, `mandatory`, `manipulation`, `manual`, `margin-box`, `match-parent`, `medium`, `mixed`, `monospace`, `move`, `multiply`, `n-resize`, `ne-resize`, `nesw-resize`, `no-close-quote`, `no-drop`, `no-open-quote`, `no-repeat`, `none`, `normal`, `not-allowed`, `nowrap`, `ns-resize`, `nw-resize`, `nwse-resize`, `objects`, `oblique`, `off`, `on`, `open`, `open-quote`, `optimizeLegibility`, `optimizeSpeed`, `outset`, `outside`, `over`, `overlay`, `overline`, `padding-box`, `page`, `pan-down`, `pan-left`, `pan-right`, `pan-up`, `pan-x`, `pan-y`, `paused`, `petite-caps`, `pixelated`, `pointer`, `preserve-3d`, `progress`, `proximity`, `relative`, `repeat`, `repeat no-repeat`, `repeat-x`, `repeat-y`, `reverse`, `ridge`, `right`, `round`, `row`, `row-resize`, `row-reverse`, `rtl`, `ruby`, `ruby-base`, `ruby-base-container`, `ruby-text`, `ruby-text-container`, `run-in`, `running`, `s-resize`, `sans-serif`, `saturation`, `scale-down`, `screen`, `scroll`, `se-resize`, `semi-condensed`, `semi-expanded`, `separate`, `serif`, `sesame`, `show`, `sideways`, `sideways-left`, `sideways-right`, `slice`, `small`, `small-caps`, `smaller`, `smooth`, `snap`, `soft-light`, `solid`, `space`, `space-around`, `space-between`, `spaces`, `square`, `start`, `static`, `step-end`, `step-start`, `sticky`, `stretch`, `strict`, `stroke-box`, `style`, `sw-resize`, `table`, `table-caption`, `table-cell`, `table-column`, `table-column-group`, `table-footer-group`, `table-header-group`, `table-row`, `table-row-group`, `text`, `thick`, `thin`, `titling-caps`, `to`, `top`, `triangle`, `ultra-condensed`, `ultra-expanded`, `under`, `underline`, `unicase`, `unset`, `upper-alpha`, `upper-latin`, `upper-roman`, `uppercase`, `upright`, `use-glyph-orientation`, `vertical`, `vertical-text`, `view-box`, `visible`, `w-resize`, `wait`, `wavy`, `weight`, `weight style`, `wrap`, `wrap-reverse`, `x-large`, `x-small`, `xx-large`, `xx-small`, `zoom-in`, `zoom-out`), KeywordConstant, nil}, + {`\;?`, Punctuation, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/svelte.go b/vendor/github.com/alecthomas/chroma/lexers/s/svelte.go new file mode 100644 index 0000000..1f91a21 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/svelte.go @@ -0,0 +1,73 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/h" + "github.com/alecthomas/chroma/lexers/internal" + "github.com/alecthomas/chroma/lexers/t" +) + +// Svelte lexer. +var Svelte = internal.Register(DelegatingLexer(h.HTML, MustNewLazyLexer( + &Config{ + Name: "Svelte", + Aliases: []string{"svelte"}, + Filenames: []string{"*.svelte"}, + MimeTypes: []string{"application/x-svelte"}, + DotAll: true, + }, + svelteRules, +))) + +func svelteRules() Rules { + return Rules{ + "root": { + // Let HTML handle the comments, including comments containing script and style tags + {``, Other, Pop(1)}, + {`.+?`, Other, nil}, + }, + "templates": { + {`}`, Punctuation, Pop(1)}, + // Let TypeScript handle strings and the curly braces inside them + {`(?|[<&?](?=\\w)|(?<=\\w)[>!?]", Punctuation, nil}, + {`[/=\-+!*%<>&|^?~]+`, Operator, nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + }, + "keywords": { + {Words(``, `\b`, `as`, `break`, `case`, `catch`, `continue`, `default`, `defer`, `do`, `else`, `fallthrough`, `for`, `guard`, `if`, `in`, `is`, `repeat`, `return`, `#selector`, `switch`, `throw`, `try`, `where`, `while`), Keyword, nil}, + {`@availability\([^)]+\)`, KeywordReserved, nil}, + {Words(``, `\b`, `associativity`, `convenience`, `dynamic`, `didSet`, `final`, `get`, `indirect`, `infix`, `inout`, `lazy`, `left`, `mutating`, `none`, `nonmutating`, `optional`, `override`, `postfix`, `precedence`, `prefix`, `Protocol`, `required`, `rethrows`, `right`, `set`, `throws`, `Type`, `unowned`, `weak`, `willSet`, `@availability`, `@autoclosure`, `@noreturn`, `@NSApplicationMain`, `@NSCopying`, `@NSManaged`, `@objc`, `@UIApplicationMain`, `@IBAction`, `@IBDesignable`, `@IBInspectable`, `@IBOutlet`), KeywordReserved, nil}, + {`(as|dynamicType|false|is|nil|self|Self|super|true|__COLUMN__|__FILE__|__FUNCTION__|__LINE__|_|#(?:file|line|column|function))\b`, KeywordConstant, nil}, + {`import\b`, KeywordDeclaration, Push("module")}, + {`(class|enum|extension|struct|protocol)(\s+)([a-zA-Z_]\w*)`, ByGroups(KeywordDeclaration, Text, NameClass), nil}, + {`(func)(\s+)([a-zA-Z_]\w*)`, ByGroups(KeywordDeclaration, Text, NameFunction), nil}, + {`(var|let)(\s+)([a-zA-Z_]\w*)`, ByGroups(KeywordDeclaration, Text, NameVariable), nil}, + {Words(``, `\b`, `class`, `deinit`, `enum`, `extension`, `func`, `import`, `init`, `internal`, `let`, `operator`, `private`, `protocol`, `public`, `static`, `struct`, `subscript`, `typealias`, `var`), KeywordDeclaration, nil}, + }, + "comment": { + {`:param: [a-zA-Z_]\w*|:returns?:|(FIXME|MARK|TODO):`, CommentSpecial, nil}, + }, + "comment-single": { + {`\n`, Text, Pop(1)}, + Include("comment"), + {`[^\n]`, CommentSingle, nil}, + }, + "comment-multi": { + Include("comment"), + {`[^*/]`, CommentMultiline, nil}, + {`/\*`, CommentMultiline, Push()}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[*/]`, CommentMultiline, nil}, + }, + "module": { + {`\n`, Text, Pop(1)}, + {`[a-zA-Z_]\w*`, NameClass, nil}, + Include("root"), + }, + "preproc": { + {`\n`, Text, Pop(1)}, + Include("keywords"), + {`[A-Za-z]\w*`, CommentPreproc, nil}, + Include("root"), + }, + "string": { + {`\\\(`, LiteralStringInterpol, Push("string-intp")}, + {`"`, LiteralString, Pop(1)}, + {`\\['"\\nrt]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}`, LiteralStringEscape, nil}, + {`[^\\"]+`, LiteralString, nil}, + {`\\`, LiteralString, nil}, + }, + "string-intp": { + {`\(`, LiteralStringInterpol, Push()}, + {`\)`, LiteralStringInterpol, Pop(1)}, + Include("root"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/systemd.go b/vendor/github.com/alecthomas/chroma/lexers/s/systemd.go new file mode 100644 index 0000000..0da9782 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/systemd.go @@ -0,0 +1,33 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +var SYSTEMD = internal.Register(MustNewLazyLexer( + &Config{ + Name: "SYSTEMD", + Aliases: []string{"systemd"}, + // Suspects: man systemd.index | grep -E 'systemd\..*configuration' + Filenames: []string{"*.automount", "*.device", "*.dnssd", "*.link", "*.mount", "*.netdev", "*.network", "*.path", "*.scope", "*.service", "*.slice", "*.socket", "*.swap", "*.target", "*.timer"}, + MimeTypes: []string{"text/plain"}, + }, + systemdRules, +)) + +func systemdRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`[;#].*`, Comment, nil}, + {`\[.*?\]$`, Keyword, nil}, + {`(.*?)(=)(.*)(\\\n)`, ByGroups(NameAttribute, Operator, LiteralString, Text), Push("continuation")}, + {`(.*?)(=)(.*)`, ByGroups(NameAttribute, Operator, LiteralString), nil}, + }, + "continuation": { + {`(.*?)(\\\n)`, ByGroups(LiteralString, Text), nil}, + {`(.*)`, LiteralString, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/systemverilog.go b/vendor/github.com/alecthomas/chroma/lexers/s/systemverilog.go new file mode 100644 index 0000000..a9a77f5 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/s/systemverilog.go @@ -0,0 +1,77 @@ +package s + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Systemverilog lexer. +var Systemverilog = internal.Register(MustNewLazyLexer( + &Config{ + Name: "systemverilog", + Aliases: []string{"systemverilog", "sv"}, + Filenames: []string{"*.sv", "*.svh"}, + MimeTypes: []string{"text/x-systemverilog"}, + EnsureNL: true, + }, + systemvarilogRules, +)) + +func systemvarilogRules() Rules { + return Rules{ + "root": { + {"^\\s*`define", CommentPreproc, Push("macro")}, + {`^(\s*)(package)(\s+)`, ByGroups(Text, KeywordNamespace, Text), nil}, + {`^(\s*)(import)(\s+)("DPI(?:-C)?")(\s+)`, ByGroups(Text, KeywordNamespace, Text, LiteralString, Text), nil}, + {`^(\s*)(import)(\s+)`, ByGroups(Text, KeywordNamespace, Text), Push("import")}, + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`\\\n`, Text, nil}, + {`/(\\\n)?/(\n|(.|\n)*?[^\\]\n)`, CommentSingle, nil}, + {`/(\\\n)?[*](.|\n)*?[*](\\\n)?/`, CommentMultiline, nil}, + {`[{}#@]`, Punctuation, nil}, + {`L?"`, LiteralString, Push("string")}, + {`L?'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])'`, LiteralStringChar, nil}, + {`(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[lL]?`, LiteralNumberFloat, nil}, + {`(\d+\.\d*|\.\d+|\d+[fF])[fF]?`, LiteralNumberFloat, nil}, + {`([0-9]+)|(\'h)[0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`([0-9]+)|(\'b)[01]+`, LiteralNumberBin, nil}, + {`([0-9]+)|(\'d)[0-9]+`, LiteralNumberInteger, nil}, + {`([0-9]+)|(\'o)[0-7]+`, LiteralNumberOct, nil}, + {`\'[01xz]`, LiteralNumber, nil}, + {`\d+[Ll]?`, LiteralNumberInteger, nil}, + {`\*/`, Error, nil}, + {`[~!%^&*+=|?:<>/-]`, Operator, nil}, + {`[()\[\],.;\']`, Punctuation, nil}, + {"`[a-zA-Z_]\\w*", NameConstant, nil}, + {Words(``, `\b`, `accept_on`, `alias`, `always`, `always_comb`, `always_ff`, `always_latch`, `and`, `assert`, `assign`, `assume`, `automatic`, `before`, `begin`, `bind`, `bins`, `binsof`, `bit`, `break`, `buf`, `bufif0`, `bufif1`, `byte`, `case`, `casex`, `casez`, `cell`, `chandle`, `checker`, `class`, `clocking`, `cmos`, `config`, `const`, `constraint`, `context`, `continue`, `cover`, `covergroup`, `coverpoint`, `cross`, `deassign`, `default`, `defparam`, `design`, `disable`, `dist`, `do`, `edge`, `else`, `end`, `endcase`, `endchecker`, `endclass`, `endclocking`, `endconfig`, `endfunction`, `endgenerate`, `endgroup`, `endinterface`, `endmodule`, `endpackage`, `endprimitive`, `endprogram`, `endproperty`, `endsequence`, `endspecify`, `endtable`, `endtask`, `enum`, `event`, `eventually`, `expect`, `export`, `extends`, `extern`, `final`, `first_match`, `for`, `force`, `foreach`, `forever`, `fork`, `forkjoin`, `function`, `generate`, `genvar`, `global`, `highz0`, `highz1`, `if`, `iff`, `ifnone`, `ignore_bins`, `illegal_bins`, `implies`, `import`, `incdir`, `include`, `initial`, `inout`, `input`, `inside`, `instance`, `int`, `integer`, `interface`, `intersect`, `join`, `join_any`, `join_none`, `large`, `let`, `liblist`, `library`, `local`, `localparam`, `logic`, `longint`, `macromodule`, `matches`, `medium`, `modport`, `module`, `nand`, `negedge`, `new`, `nexttime`, `nmos`, `nor`, `noshowcancelled`, `not`, `notif0`, `notif1`, `null`, `or`, `output`, `package`, `packed`, `parameter`, `pmos`, `posedge`, `primitive`, `priority`, `program`, `property`, `protected`, `pull0`, `pull1`, `pulldown`, `pullup`, `pulsestyle_ondetect`, `pulsestyle_onevent`, `pure`, `rand`, `randc`, `randcase`, `randsequence`, `rcmos`, `real`, `realtime`, `ref`, `reg`, `reject_on`, `release`, `repeat`, `restrict`, `return`, `rnmos`, `rpmos`, `rtran`, `rtranif0`, `rtranif1`, `s_always`, `s_eventually`, `s_nexttime`, `s_until`, `s_until_with`, `scalared`, `sequence`, `shortint`, `shortreal`, `showcancelled`, `signed`, `small`, `solve`, `specify`, `specparam`, `static`, `string`, `strong`, `strong0`, `strong1`, `struct`, `super`, `supply0`, `supply1`, `sync_accept_on`, `sync_reject_on`, `table`, `tagged`, `task`, `this`, `throughout`, `time`, `timeprecision`, `timeunit`, `tran`, `tranif0`, `tranif1`, `tri`, `tri0`, `tri1`, `triand`, `trior`, `trireg`, `type`, `typedef`, `union`, `unique`, `unique0`, `unsigned`, `until`, `until_with`, `untyped`, `use`, `uwire`, `var`, `vectored`, `virtual`, `void`, `wait`, `wait_order`, `wand`, `weak`, `weak0`, `weak1`, `while`, `wildcard`, `wire`, `with`, `within`, `wor`, `xnor`, `xor`), Keyword, nil}, + {Words(``, `\b`, "`__FILE__", "`__LINE__", "`begin_keywords", "`celldefine", "`default_nettype", "`define", "`else", "`elsif", "`end_keywords", "`endcelldefine", "`endif", "`ifdef", "`ifndef", "`include", "`line", "`nounconnected_drive", "`pragma", "`resetall", "`timescale", "`unconnected_drive", "`undef", "`undefineall"), CommentPreproc, nil}, + {Words(``, `\b`, `$display`, `$displayb`, `$displayh`, `$displayo`, `$dumpall`, `$dumpfile`, `$dumpflush`, `$dumplimit`, `$dumpoff`, `$dumpon`, `$dumpports`, `$dumpportsall`, `$dumpportsflush`, `$dumpportslimit`, `$dumpportsoff`, `$dumpportson`, `$dumpvars`, `$fclose`, `$fdisplay`, `$fdisplayb`, `$fdisplayh`, `$fdisplayo`, `$feof`, `$ferror`, `$fflush`, `$fgetc`, `$fgets`, `$finish`, `$fmonitor`, `$fmonitorb`, `$fmonitorh`, `$fmonitoro`, `$fopen`, `$fread`, `$fscanf`, `$fseek`, `$fstrobe`, `$fstrobeb`, `$fstrobeh`, `$fstrobeo`, `$ftell`, `$fwrite`, `$fwriteb`, `$fwriteh`, `$fwriteo`, `$monitor`, `$monitorb`, `$monitorh`, `$monitoro`, `$monitoroff`, `$monitoron`, `$plusargs`, `$random`, `$readmemb`, `$readmemh`, `$rewind`, `$sformat`, `$sformatf`, `$sscanf`, `$strobe`, `$strobeb`, `$strobeh`, `$strobeo`, `$swrite`, `$swriteb`, `$swriteh`, `$swriteo`, `$test`, `$ungetc`, `$value$plusargs`, `$write`, `$writeb`, `$writeh`, `$writememb`, `$writememh`, `$writeo`), NameBuiltin, nil}, + {`(class)(\s+)`, ByGroups(Keyword, Text), Push("classname")}, + {Words(``, `\b`, `byte`, `shortint`, `int`, `longint`, `integer`, `time`, `bit`, `logic`, `reg`, `supply0`, `supply1`, `tri`, `triand`, `trior`, `tri0`, `tri1`, `trireg`, `uwire`, `wire`, `wand`, `woshortreal`, `real`, `realtime`), KeywordType, nil}, + {`[a-zA-Z_]\w*:(?!:)`, NameLabel, nil}, + {`\$?[a-zA-Z_]\w*`, Name, nil}, + }, + "classname": { + {`[a-zA-Z_]\w*`, NameClass, Pop(1)}, + }, + "string": { + {`"`, LiteralString, Pop(1)}, + {`\\([\\abfnrtv"\']|x[a-fA-F0-9]{2,4}|[0-7]{1,3})`, LiteralStringEscape, nil}, + {`[^\\"\n]+`, LiteralString, nil}, + {`\\\n`, LiteralString, nil}, + {`\\`, LiteralString, nil}, + }, + "macro": { + {`[^/\n]+`, CommentPreproc, nil}, + {`/[*](.|\n)*?[*]/`, CommentMultiline, nil}, + {`//.*?\n`, CommentSingle, Pop(1)}, + {`/`, CommentPreproc, nil}, + {`(?<=\\)\n`, CommentPreproc, nil}, + {`\n`, CommentPreproc, Pop(1)}, + }, + "import": { + {`[\w:]+\*?`, NameNamespace, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/tablegen.go b/vendor/github.com/alecthomas/chroma/lexers/t/tablegen.go new file mode 100644 index 0000000..ca05ed3 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/tablegen.go @@ -0,0 +1,46 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// TableGen lexer. +var Tablegen = internal.Register(MustNewLazyLexer( + &Config{ + Name: "TableGen", + Aliases: []string{"tablegen"}, + Filenames: []string{"*.td"}, + MimeTypes: []string{"text/x-tablegen"}, + }, + tablegenRules, +)) + +func tablegenRules() Rules { + return Rules{ + "root": { + Include("macro"), + Include("whitespace"), + {`c?"[^"]*?"`, LiteralString, nil}, + Include("keyword"), + {`\$[_a-zA-Z][_\w]*`, NameVariable, nil}, + {`\d*[_a-zA-Z][_\w]*`, NameVariable, nil}, + {`\[\{[\w\W]*?\}\]`, LiteralString, nil}, + {`[+-]?\d+|0x[\da-fA-F]+|0b[01]+`, LiteralNumber, nil}, + {`[=<>{}\[\]()*.,!:;]`, Punctuation, nil}, + }, + "macro": { + {`(#include\s+)("[^"]*")`, ByGroups(CommentPreproc, LiteralString), nil}, + {`^\s*#(ifdef|ifndef)\s+[_\w][_\w\d]*`, CommentPreproc, nil}, + {`^\s*#define\s+[_\w][_\w\d]*`, CommentPreproc, nil}, + {`^\s*#endif`, CommentPreproc, nil}, + }, + "whitespace": { + {`(\n|\s)+`, Text, nil}, + {`//.*?\n`, Comment, nil}, + }, + "keyword": { + {Words(``, `\b`, `bit`, `bits`, `class`, `code`, `dag`, `def`, `defm`, `field`, `foreach`, `in`, `int`, `let`, `list`, `multiclass`, `string`), Keyword, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/tasm.go b/vendor/github.com/alecthomas/chroma/lexers/t/tasm.go new file mode 100644 index 0000000..0164a73 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/tasm.go @@ -0,0 +1,65 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Tasm lexer. +var Tasm = internal.Register(MustNewLazyLexer( + &Config{ + Name: "TASM", + Aliases: []string{"tasm"}, + Filenames: []string{"*.asm", "*.ASM", "*.tasm"}, + MimeTypes: []string{"text/x-tasm"}, + CaseInsensitive: true, + }, + tasmRules, +)) + +func tasmRules() Rules { + return Rules{ + "root": { + {`^\s*%`, CommentPreproc, Push("preproc")}, + Include("whitespace"), + {`[@a-z$._?][\w$.?#@~]*:`, NameLabel, nil}, + {`BITS|USE16|USE32|SECTION|SEGMENT|ABSOLUTE|EXTERN|GLOBAL|ORG|ALIGN|STRUC|ENDSTRUC|ENDS|COMMON|CPU|GROUP|UPPERCASE|INCLUDE|EXPORT|LIBRARY|MODULE|PROC|ENDP|USES|ARG|DATASEG|UDATASEG|END|IDEAL|P386|MODEL|ASSUME|CODESEG|SIZE`, Keyword, Push("instruction-args")}, + {`([@a-z$._?][\w$.?#@~]*)(\s+)(db|dd|dw|T[A-Z][a-z]+)`, ByGroups(NameConstant, KeywordDeclaration, KeywordDeclaration), Push("instruction-args")}, + {`(?:res|d)[bwdqt]|times`, KeywordDeclaration, Push("instruction-args")}, + {`[@a-z$._?][\w$.?#@~]*`, NameFunction, Push("instruction-args")}, + {`[\r\n]+`, Text, nil}, + }, + "instruction-args": { + {"\"(\\\\\"|[^\"\\n])*\"|'(\\\\'|[^'\\n])*'|`(\\\\`|[^`\\n])*`", LiteralString, nil}, + {`(?:0x[0-9a-f]+|$0[0-9a-f]*|[0-9]+[0-9a-f]*h)`, LiteralNumberHex, nil}, + {`[0-7]+q`, LiteralNumberOct, nil}, + {`[01]+b`, LiteralNumberBin, nil}, + {`[0-9]+\.e?[0-9]+`, LiteralNumberFloat, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + Include("punctuation"), + {`r[0-9][0-5]?[bwd]|[a-d][lh]|[er]?[a-d]x|[er]?[sb]p|[er]?[sd]i|[c-gs]s|st[0-7]|mm[0-7]|cr[0-4]|dr[0-367]|tr[3-7]`, NameBuiltin, nil}, + {`[@a-z$._?][\w$.?#@~]*`, NameVariable, nil}, + {`(\\\s*)(;.*)([\r\n])`, ByGroups(Text, CommentSingle, Text), nil}, + {`[\r\n]+`, Text, Pop(1)}, + Include("whitespace"), + }, + "preproc": { + {`[^;\n]+`, CommentPreproc, nil}, + {`;.*?\n`, CommentSingle, Pop(1)}, + {`\n`, CommentPreproc, Pop(1)}, + }, + "whitespace": { + {`[\n\r]`, Text, nil}, + {`\\[\n\r]`, Text, nil}, + {`[ \t]+`, Text, nil}, + {`;.*`, CommentSingle, nil}, + }, + "punctuation": { + {`[,():\[\]]+`, Punctuation, nil}, + {`[&|^<>+*=/%~-]+`, Operator, nil}, + {`[$]+`, KeywordConstant, nil}, + {`seg|wrt|strict`, OperatorWord, nil}, + {`byte|[dq]?word`, KeywordType, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/tcl.go b/vendor/github.com/alecthomas/chroma/lexers/t/tcl.go new file mode 100644 index 0000000..5f7030a --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/tcl.go @@ -0,0 +1,120 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Tcl lexer. +var Tcl = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Tcl", + Aliases: []string{"tcl"}, + Filenames: []string{"*.tcl", "*.rvt"}, + MimeTypes: []string{"text/x-tcl", "text/x-script.tcl", "application/x-tcl"}, + }, + tclRules, +)) + +func tclRules() Rules { + return Rules{ + "root": { + Include("command"), + Include("basic"), + Include("data"), + {`\}`, Keyword, nil}, + }, + "command": { + {Words(`\b`, `\b`, `after`, `apply`, `array`, `break`, `catch`, `continue`, `elseif`, `else`, `error`, `eval`, `expr`, `for`, `foreach`, `global`, `if`, `namespace`, `proc`, `rename`, `return`, `set`, `switch`, `then`, `trace`, `unset`, `update`, `uplevel`, `upvar`, `variable`, `vwait`, `while`), Keyword, Push("params")}, + {Words(`\b`, `\b`, `append`, `bgerror`, `binary`, `cd`, `chan`, `clock`, `close`, `concat`, `dde`, `dict`, `encoding`, `eof`, `exec`, `exit`, `fblocked`, `fconfigure`, `fcopy`, `file`, `fileevent`, `flush`, `format`, `gets`, `glob`, `history`, `http`, `incr`, `info`, `interp`, `join`, `lappend`, `lassign`, `lindex`, `linsert`, `list`, `llength`, `load`, `loadTk`, `lrange`, `lrepeat`, `lreplace`, `lreverse`, `lsearch`, `lset`, `lsort`, `mathfunc`, `mathop`, `memory`, `msgcat`, `open`, `package`, `pid`, `pkg::create`, `pkg_mkIndex`, `platform`, `platform::shell`, `puts`, `pwd`, `re_syntax`, `read`, `refchan`, `regexp`, `registry`, `regsub`, `scan`, `seek`, `socket`, `source`, `split`, `string`, `subst`, `tell`, `time`, `tm`, `unknown`, `unload`), NameBuiltin, Push("params")}, + {`([\w.-]+)`, NameVariable, Push("params")}, + {`#`, Comment, Push("comment")}, + }, + "command-in-brace": { + {Words(`\b`, `\b`, `after`, `apply`, `array`, `break`, `catch`, `continue`, `elseif`, `else`, `error`, `eval`, `expr`, `for`, `foreach`, `global`, `if`, `namespace`, `proc`, `rename`, `return`, `set`, `switch`, `then`, `trace`, `unset`, `update`, `uplevel`, `upvar`, `variable`, `vwait`, `while`), Keyword, Push("params-in-brace")}, + {Words(`\b`, `\b`, `append`, `bgerror`, `binary`, `cd`, `chan`, `clock`, `close`, `concat`, `dde`, `dict`, `encoding`, `eof`, `exec`, `exit`, `fblocked`, `fconfigure`, `fcopy`, `file`, `fileevent`, `flush`, `format`, `gets`, `glob`, `history`, `http`, `incr`, `info`, `interp`, `join`, `lappend`, `lassign`, `lindex`, `linsert`, `list`, `llength`, `load`, `loadTk`, `lrange`, `lrepeat`, `lreplace`, `lreverse`, `lsearch`, `lset`, `lsort`, `mathfunc`, `mathop`, `memory`, `msgcat`, `open`, `package`, `pid`, `pkg::create`, `pkg_mkIndex`, `platform`, `platform::shell`, `puts`, `pwd`, `re_syntax`, `read`, `refchan`, `regexp`, `registry`, `regsub`, `scan`, `seek`, `socket`, `source`, `split`, `string`, `subst`, `tell`, `time`, `tm`, `unknown`, `unload`), NameBuiltin, Push("params-in-brace")}, + {`([\w.-]+)`, NameVariable, Push("params-in-brace")}, + {`#`, Comment, Push("comment")}, + }, + "command-in-bracket": { + {Words(`\b`, `\b`, `after`, `apply`, `array`, `break`, `catch`, `continue`, `elseif`, `else`, `error`, `eval`, `expr`, `for`, `foreach`, `global`, `if`, `namespace`, `proc`, `rename`, `return`, `set`, `switch`, `then`, `trace`, `unset`, `update`, `uplevel`, `upvar`, `variable`, `vwait`, `while`), Keyword, Push("params-in-bracket")}, + {Words(`\b`, `\b`, `append`, `bgerror`, `binary`, `cd`, `chan`, `clock`, `close`, `concat`, `dde`, `dict`, `encoding`, `eof`, `exec`, `exit`, `fblocked`, `fconfigure`, `fcopy`, `file`, `fileevent`, `flush`, `format`, `gets`, `glob`, `history`, `http`, `incr`, `info`, `interp`, `join`, `lappend`, `lassign`, `lindex`, `linsert`, `list`, `llength`, `load`, `loadTk`, `lrange`, `lrepeat`, `lreplace`, `lreverse`, `lsearch`, `lset`, `lsort`, `mathfunc`, `mathop`, `memory`, `msgcat`, `open`, `package`, `pid`, `pkg::create`, `pkg_mkIndex`, `platform`, `platform::shell`, `puts`, `pwd`, `re_syntax`, `read`, `refchan`, `regexp`, `registry`, `regsub`, `scan`, `seek`, `socket`, `source`, `split`, `string`, `subst`, `tell`, `time`, `tm`, `unknown`, `unload`), NameBuiltin, Push("params-in-bracket")}, + {`([\w.-]+)`, NameVariable, Push("params-in-bracket")}, + {`#`, Comment, Push("comment")}, + }, + "command-in-paren": { + {Words(`\b`, `\b`, `after`, `apply`, `array`, `break`, `catch`, `continue`, `elseif`, `else`, `error`, `eval`, `expr`, `for`, `foreach`, `global`, `if`, `namespace`, `proc`, `rename`, `return`, `set`, `switch`, `then`, `trace`, `unset`, `update`, `uplevel`, `upvar`, `variable`, `vwait`, `while`), Keyword, Push("params-in-paren")}, + {Words(`\b`, `\b`, `append`, `bgerror`, `binary`, `cd`, `chan`, `clock`, `close`, `concat`, `dde`, `dict`, `encoding`, `eof`, `exec`, `exit`, `fblocked`, `fconfigure`, `fcopy`, `file`, `fileevent`, `flush`, `format`, `gets`, `glob`, `history`, `http`, `incr`, `info`, `interp`, `join`, `lappend`, `lassign`, `lindex`, `linsert`, `list`, `llength`, `load`, `loadTk`, `lrange`, `lrepeat`, `lreplace`, `lreverse`, `lsearch`, `lset`, `lsort`, `mathfunc`, `mathop`, `memory`, `msgcat`, `open`, `package`, `pid`, `pkg::create`, `pkg_mkIndex`, `platform`, `platform::shell`, `puts`, `pwd`, `re_syntax`, `read`, `refchan`, `regexp`, `registry`, `regsub`, `scan`, `seek`, `socket`, `source`, `split`, `string`, `subst`, `tell`, `time`, `tm`, `unknown`, `unload`), NameBuiltin, Push("params-in-paren")}, + {`([\w.-]+)`, NameVariable, Push("params-in-paren")}, + {`#`, Comment, Push("comment")}, + }, + "basic": { + {`\(`, Keyword, Push("paren")}, + {`\[`, Keyword, Push("bracket")}, + {`\{`, Keyword, Push("brace")}, + {`"`, LiteralStringDouble, Push("string")}, + {`(eq|ne|in|ni)\b`, OperatorWord, nil}, + {`!=|==|<<|>>|<=|>=|&&|\|\||\*\*|[-+~!*/%<>&^|?:]`, Operator, nil}, + }, + "data": { + {`\s+`, Text, nil}, + {`0x[a-fA-F0-9]+`, LiteralNumberHex, nil}, + {`0[0-7]+`, LiteralNumberOct, nil}, + {`\d+\.\d+`, LiteralNumberFloat, nil}, + {`\d+`, LiteralNumberInteger, nil}, + {`\$([\w.:-]+)`, NameVariable, nil}, + {`([\w.:-]+)`, Text, nil}, + }, + "params": { + {`;`, Keyword, Pop(1)}, + {`\n`, Text, Pop(1)}, + {`(else|elseif|then)\b`, Keyword, nil}, + Include("basic"), + Include("data"), + }, + "params-in-brace": { + {`\}`, Keyword, Push("#pop", "#pop")}, + Include("params"), + }, + "params-in-paren": { + {`\)`, Keyword, Push("#pop", "#pop")}, + Include("params"), + }, + "params-in-bracket": { + {`\]`, Keyword, Push("#pop", "#pop")}, + Include("params"), + }, + "string": { + {`\[`, LiteralStringDouble, Push("string-square")}, + {`(?s)(\\\\|\\[0-7]+|\\.|[^"\\])`, LiteralStringDouble, nil}, + {`"`, LiteralStringDouble, Pop(1)}, + }, + "string-square": { + {`\[`, LiteralStringDouble, Push("string-square")}, + {`(?s)(\\\\|\\[0-7]+|\\.|\\\n|[^\]\\])`, LiteralStringDouble, nil}, + {`\]`, LiteralStringDouble, Pop(1)}, + }, + "brace": { + {`\}`, Keyword, Pop(1)}, + Include("command-in-brace"), + Include("basic"), + Include("data"), + }, + "paren": { + {`\)`, Keyword, Pop(1)}, + Include("command-in-paren"), + Include("basic"), + Include("data"), + }, + "bracket": { + {`\]`, Keyword, Pop(1)}, + Include("command-in-bracket"), + Include("basic"), + Include("data"), + }, + "comment": { + {`.*[^\\]\n`, Comment, Pop(1)}, + {`.*\\\n`, Comment, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/tcsh.go b/vendor/github.com/alecthomas/chroma/lexers/t/tcsh.go new file mode 100644 index 0000000..fec0cb2 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/tcsh.go @@ -0,0 +1,63 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Tcsh lexer. +var Tcsh = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Tcsh", + Aliases: []string{"tcsh", "csh"}, + Filenames: []string{"*.tcsh", "*.csh"}, + MimeTypes: []string{"application/x-csh"}, + }, + tcshRules, +)) + +func tcshRules() Rules { + return Rules{ + "root": { + Include("basic"), + {`\$\(`, Keyword, Push("paren")}, + {`\$\{#?`, Keyword, Push("curly")}, + {"`", LiteralStringBacktick, Push("backticks")}, + Include("data"), + }, + "basic": { + {`\b(if|endif|else|while|then|foreach|case|default|continue|goto|breaksw|end|switch|endsw)\s*\b`, Keyword, nil}, + {`\b(alias|alloc|bg|bindkey|break|builtins|bye|caller|cd|chdir|complete|dirs|echo|echotc|eval|exec|exit|fg|filetest|getxvers|glob|getspath|hashstat|history|hup|inlib|jobs|kill|limit|log|login|logout|ls-F|migrate|newgrp|nice|nohup|notify|onintr|popd|printenv|pushd|rehash|repeat|rootnode|popd|pushd|set|shift|sched|setenv|setpath|settc|setty|setxvers|shift|source|stop|suspend|source|suspend|telltc|time|umask|unalias|uncomplete|unhash|universe|unlimit|unset|unsetenv|ver|wait|warp|watchlog|where|which)\s*\b`, NameBuiltin, nil}, + {`#.*`, Comment, nil}, + {`\\[\w\W]`, LiteralStringEscape, nil}, + {`(\b\w+)(\s*)(=)`, ByGroups(NameVariable, Text, Operator), nil}, + {`[\[\]{}()=]+`, Operator, nil}, + {`<<\s*(\'?)\\?(\w+)[\w\W]+?\2`, LiteralString, nil}, + {`;`, Punctuation, nil}, + }, + "data": { + {`(?s)"(\\\\|\\[0-7]+|\\.|[^"\\])*"`, LiteralStringDouble, nil}, + {`(?s)'(\\\\|\\[0-7]+|\\.|[^'\\])*'`, LiteralStringSingle, nil}, + {`\s+`, Text, nil}, + {"[^=\\s\\[\\]{}()$\"\\'`\\\\;#]+", Text, nil}, + {`\d+(?= |\Z)`, LiteralNumber, nil}, + {`\$#?(\w+|.)`, NameVariable, nil}, + }, + "curly": { + {`\}`, Keyword, Pop(1)}, + {`:-`, Keyword, nil}, + {`\w+`, NameVariable, nil}, + {"[^}:\"\\'`$]+", Punctuation, nil}, + {`:`, Punctuation, nil}, + Include("root"), + }, + "paren": { + {`\)`, Keyword, Pop(1)}, + Include("root"), + }, + "backticks": { + {"`", LiteralStringBacktick, Pop(1)}, + Include("root"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/termcap.go b/vendor/github.com/alecthomas/chroma/lexers/t/termcap.go new file mode 100644 index 0000000..8db20b5 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/termcap.go @@ -0,0 +1,46 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Termcap lexer. +var Termcap = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Termcap", + Aliases: []string{"termcap"}, + Filenames: []string{"termcap", "termcap.src"}, + MimeTypes: []string{}, + }, + termcapRules, +)) + +func termcapRules() Rules { + return Rules{ + "root": { + {`^#.*$`, Comment, nil}, + {`^[^\s#:|]+`, NameTag, Push("names")}, + }, + "names": { + {`\n`, Text, Pop(1)}, + {`:`, Punctuation, Push("defs")}, + {`\|`, Punctuation, nil}, + {`[^:|]+`, NameAttribute, nil}, + }, + "defs": { + {`\\\n[ \t]*`, Text, nil}, + {`\n[ \t]*`, Text, Pop(2)}, + {`(#)([0-9]+)`, ByGroups(Operator, LiteralNumber), nil}, + {`=`, Operator, Push("data")}, + {`:`, Punctuation, nil}, + {`[^\s:=#]+`, NameClass, nil}, + }, + "data": { + {`\\072`, Literal, nil}, + {`:`, Punctuation, Pop(1)}, + {`[^:\\]+`, Literal, nil}, + {`.`, Literal, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/terminfo.go b/vendor/github.com/alecthomas/chroma/lexers/t/terminfo.go new file mode 100644 index 0000000..b3f2735 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/terminfo.go @@ -0,0 +1,46 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Terminfo lexer. +var Terminfo = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Terminfo", + Aliases: []string{"terminfo"}, + Filenames: []string{"terminfo", "terminfo.src"}, + MimeTypes: []string{}, + }, + terminfoRules, +)) + +func terminfoRules() Rules { + return Rules{ + "root": { + {`^#.*$`, Comment, nil}, + {`^[^\s#,|]+`, NameTag, Push("names")}, + }, + "names": { + {`\n`, Text, Pop(1)}, + {`(,)([ \t]*)`, ByGroups(Punctuation, Text), Push("defs")}, + {`\|`, Punctuation, nil}, + {`[^,|]+`, NameAttribute, nil}, + }, + "defs": { + {`\n[ \t]+`, Text, nil}, + {`\n`, Text, Pop(2)}, + {`(#)([0-9]+)`, ByGroups(Operator, LiteralNumber), nil}, + {`=`, Operator, Push("data")}, + {`(,)([ \t]*)`, ByGroups(Punctuation, Text), nil}, + {`[^\s,=#]+`, NameClass, nil}, + }, + "data": { + {`\\[,\\]`, Literal, nil}, + {`(,)([ \t]*)`, ByGroups(Punctuation, Text), Pop(1)}, + {`[^\\,]+`, Literal, nil}, + {`.`, Literal, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/terraform.go b/vendor/github.com/alecthomas/chroma/lexers/t/terraform.go new file mode 100644 index 0000000..c9c0905 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/terraform.go @@ -0,0 +1,64 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Terraform lexer. +var Terraform = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Terraform", + Aliases: []string{"terraform", "tf"}, + Filenames: []string{"*.tf"}, + MimeTypes: []string{"application/x-tf", "application/x-terraform"}, + }, + terraformRules, +)) + +func terraformRules() Rules { + return Rules{ + "root": { + {`[\[\](),.{}]`, Punctuation, nil}, + {`-?[0-9]+`, LiteralNumber, nil}, + {`=>`, Punctuation, nil}, + {Words(``, `\b`, `true`, `false`), KeywordConstant, nil}, + {`/(?s)\*(((?!\*/).)*)\*/`, CommentMultiline, nil}, + {`\s*(#|//).*\n`, CommentSingle, nil}, + {`([a-zA-Z]\w*)(\s*)(=(?!>))`, ByGroups(NameAttribute, Text, Text), nil}, + {Words(`^\s*`, `\b`, `variable`, `data`, `resource`, `provider`, `provisioner`, `module`, `output`), KeywordReserved, nil}, + {Words(``, `\b`, `for`, `in`), Keyword, nil}, + {Words(``, ``, `count`, `data`, `var`, `module`, `each`), NameBuiltin, nil}, + {Words(``, `\b`, `abs`, `ceil`, `floor`, `log`, `max`, `min`, `parseint`, `pow`, `signum`), NameBuiltin, nil}, + {Words(``, `\b`, `chomp`, `format`, `formatlist`, `indent`, `join`, `lower`, `regex`, `regexall`, `replace`, `split`, `strrev`, `substr`, `title`, `trim`, `trimprefix`, `trimsuffix`, `trimspace`, `upper`), NameBuiltin, nil}, + {Words(`[^.]`, `\b`, `chunklist`, `coalesce`, `coalescelist`, `compact`, `concat`, `contains`, `distinct`, `element`, `flatten`, `index`, `keys`, `length`, `list`, `lookup`, `map`, `matchkeys`, `merge`, `range`, `reverse`, `setintersection`, `setproduct`, `setsubtract`, `setunion`, `slice`, `sort`, `transpose`, `values`, `zipmap`), NameBuiltin, nil}, + {Words(`[^.]`, `\b`, `base64decode`, `base64encode`, `base64gzip`, `csvdecode`, `jsondecode`, `jsonencode`, `urlencode`, `yamldecode`, `yamlencode`), NameBuiltin, nil}, + {Words(``, `\b`, `abspath`, `dirname`, `pathexpand`, `basename`, `file`, `fileexists`, `fileset`, `filebase64`, `templatefile`), NameBuiltin, nil}, + {Words(``, `\b`, `formatdate`, `timeadd`, `timestamp`), NameBuiltin, nil}, + {Words(``, `\b`, `base64sha256`, `base64sha512`, `bcrypt`, `filebase64sha256`, `filebase64sha512`, `filemd5`, `filesha1`, `filesha256`, `filesha512`, `md5`, `rsadecrypt`, `sha1`, `sha256`, `sha512`, `uuid`, `uuidv5`), NameBuiltin, nil}, + {Words(``, `\b`, `cidrhost`, `cidrnetmask`, `cidrsubnet`), NameBuiltin, nil}, + {Words(``, `\b`, `can`, `tobool`, `tolist`, `tomap`, `tonumber`, `toset`, `tostring`, `try`), NameBuiltin, nil}, + {`=(?!>)|\+|-|\*|\/|:|!|%|>|<(?!<)|>=|<=|==|!=|&&|\||\?`, Operator, nil}, + {`\n|\s+|\\\n`, Text, nil}, + {`[a-zA-Z]\w*`, NameOther, nil}, + {`"`, LiteralStringDouble, Push("string")}, + {`(?s)(<<-?)(\w+)(\n\s*(?:(?!\2).)*\s*\n\s*)(\2)`, ByGroups(Operator, Operator, String, Operator), nil}, + }, + "declaration": { + {`(\s*)("(?:\\\\|\\"|[^"])*")(\s*)`, ByGroups(Text, NameVariable, Text), nil}, + {`\{`, Punctuation, Pop(1)}, + }, + "string": { + {`"`, LiteralStringDouble, Pop(1)}, + {`\\\\`, LiteralStringDouble, nil}, + {`\\\\"`, LiteralStringDouble, nil}, + {`\$\{`, LiteralStringInterpol, Push("interp-inside")}, + {`\$`, LiteralStringDouble, nil}, + {`[^"\\\\$]+`, LiteralStringDouble, nil}, + }, + "interp-inside": { + {`\}`, LiteralStringInterpol, Pop(1)}, + Include("root"), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/tex.go b/vendor/github.com/alecthomas/chroma/lexers/t/tex.go new file mode 100644 index 0000000..f9413b3 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/tex.go @@ -0,0 +1,60 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Tex lexer. +var TeX = internal.Register(MustNewLazyLexer( + &Config{ + Name: "TeX", + Aliases: []string{"tex", "latex"}, + Filenames: []string{"*.tex", "*.aux", "*.toc"}, + MimeTypes: []string{"text/x-tex", "text/x-latex"}, + }, + texRules, +)) + +func texRules() Rules { + return Rules{ + "general": { + {`%.*?\n`, Comment, nil}, + {`[{}]`, NameBuiltin, nil}, + {`[&_^]`, NameBuiltin, nil}, + }, + "root": { + {`\\\[`, LiteralStringBacktick, Push("displaymath")}, + {`\\\(`, LiteralString, Push("inlinemath")}, + {`\$\$`, LiteralStringBacktick, Push("displaymath")}, + {`\$`, LiteralString, Push("inlinemath")}, + {`\\([a-zA-Z]+|.)`, Keyword, Push("command")}, + {`\\$`, Keyword, nil}, + Include("general"), + {`[^\\$%&_^{}]+`, Text, nil}, + }, + "math": { + {`\\([a-zA-Z]+|.)`, NameVariable, nil}, + Include("general"), + {`[0-9]+`, LiteralNumber, nil}, + {`[-=!+*/()\[\]]`, Operator, nil}, + {`[^=!+*/()\[\]\\$%&_^{}0-9-]+`, NameBuiltin, nil}, + }, + "inlinemath": { + {`\\\)`, LiteralString, Pop(1)}, + {`\$`, LiteralString, Pop(1)}, + Include("math"), + }, + "displaymath": { + {`\\\]`, LiteralString, Pop(1)}, + {`\$\$`, LiteralString, Pop(1)}, + {`\$`, NameBuiltin, nil}, + Include("math"), + }, + "command": { + {`\[.*?\]`, NameAttribute, nil}, + {`\*`, Keyword, nil}, + Default(Pop(1)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/thrift.go b/vendor/github.com/alecthomas/chroma/lexers/t/thrift.go new file mode 100644 index 0000000..61669d7 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/thrift.go @@ -0,0 +1,77 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Thrift lexer. +var Thrift = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Thrift", + Aliases: []string{"thrift"}, + Filenames: []string{"*.thrift"}, + MimeTypes: []string{"application/x-thrift"}, + }, + thriftRules, +)) + +func thriftRules() Rules { + return Rules{ + "root": { + Include("whitespace"), + Include("comments"), + {`"`, LiteralStringDouble, Combined("stringescape", "dqs")}, + {`\'`, LiteralStringSingle, Combined("stringescape", "sqs")}, + {`(namespace)(\s+)`, ByGroups(KeywordNamespace, TextWhitespace), Push("namespace")}, + {`(enum|union|struct|service|exception)(\s+)`, ByGroups(KeywordDeclaration, TextWhitespace), Push("class")}, + {`((?:(?:[^\W\d]|\$)[\w.\[\]$<>]*\s+)+?)((?:[^\W\d]|\$)[\w$]*)(\s*)(\()`, ByGroups(UsingSelf("root"), NameFunction, Text, Operator), nil}, + Include("keywords"), + Include("numbers"), + {`[&=]`, Operator, nil}, + {`[:;,{}()<>\[\]]`, Punctuation, nil}, + {`[a-zA-Z_](\.\w|\w)*`, Name, nil}, + }, + "whitespace": { + {`\n`, TextWhitespace, nil}, + {`\s+`, TextWhitespace, nil}, + }, + "comments": { + {`#.*$`, Comment, nil}, + {`//.*?\n`, Comment, nil}, + {`/\*[\w\W]*?\*/`, CommentMultiline, nil}, + }, + "stringescape": { + {`\\([\\nrt"\'])`, LiteralStringEscape, nil}, + }, + "dqs": { + {`"`, LiteralStringDouble, Pop(1)}, + {`[^\\"\n]+`, LiteralStringDouble, nil}, + }, + "sqs": { + {`'`, LiteralStringSingle, Pop(1)}, + {`[^\\\'\n]+`, LiteralStringSingle, nil}, + }, + "namespace": { + {`[a-z*](\.\w|\w)*`, NameNamespace, Pop(1)}, + Default(Pop(1)), + }, + "class": { + {`[a-zA-Z_]\w*`, NameClass, Pop(1)}, + Default(Pop(1)), + }, + "keywords": { + {`(async|oneway|extends|throws|required|optional)\b`, Keyword, nil}, + {`(true|false)\b`, KeywordConstant, nil}, + {`(const|typedef)\b`, KeywordDeclaration, nil}, + {Words(``, `\b`, `cpp_namespace`, `cpp_include`, `cpp_type`, `java_package`, `cocoa_prefix`, `csharp_namespace`, `delphi_namespace`, `php_namespace`, `py_module`, `perl_package`, `ruby_namespace`, `smalltalk_category`, `smalltalk_prefix`, `xsd_all`, `xsd_optional`, `xsd_nillable`, `xsd_namespace`, `xsd_attrs`, `include`), KeywordNamespace, nil}, + {Words(``, `\b`, `void`, `bool`, `byte`, `i16`, `i32`, `i64`, `double`, `string`, `binary`, `map`, `list`, `set`, `slist`, `senum`), KeywordType, nil}, + {Words(`\b`, `\b`, `BEGIN`, `END`, `__CLASS__`, `__DIR__`, `__FILE__`, `__FUNCTION__`, `__LINE__`, `__METHOD__`, `__NAMESPACE__`, `abstract`, `alias`, `and`, `args`, `as`, `assert`, `begin`, `break`, `case`, `catch`, `class`, `clone`, `continue`, `declare`, `def`, `default`, `del`, `delete`, `do`, `dynamic`, `elif`, `else`, `elseif`, `elsif`, `end`, `enddeclare`, `endfor`, `endforeach`, `endif`, `endswitch`, `endwhile`, `ensure`, `except`, `exec`, `finally`, `float`, `for`, `foreach`, `function`, `global`, `goto`, `if`, `implements`, `import`, `in`, `inline`, `instanceof`, `interface`, `is`, `lambda`, `module`, `native`, `new`, `next`, `nil`, `not`, `or`, `pass`, `public`, `print`, `private`, `protected`, `raise`, `redo`, `rescue`, `retry`, `register`, `return`, `self`, `sizeof`, `static`, `super`, `switch`, `synchronized`, `then`, `this`, `throw`, `transient`, `try`, `undef`, `unless`, `unsigned`, `until`, `use`, `var`, `virtual`, `volatile`, `when`, `while`, `with`, `xor`, `yield`), KeywordReserved, nil}, + }, + "numbers": { + {`[+-]?(\d+\.\d+([eE][+-]?\d+)?|\.?\d+[eE][+-]?\d+)`, LiteralNumberFloat, nil}, + {`[+-]?0x[0-9A-Fa-f]+`, LiteralNumberHex, nil}, + {`[+-]?[0-9]+`, LiteralNumberInteger, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/toml.go b/vendor/github.com/alecthomas/chroma/lexers/t/toml.go new file mode 100644 index 0000000..18a44c5 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/toml.go @@ -0,0 +1,33 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +var TOML = internal.Register(MustNewLazyLexer( + &Config{ + Name: "TOML", + Aliases: []string{"toml"}, + Filenames: []string{"*.toml"}, + MimeTypes: []string{"text/x-toml"}, + }, + tomlRules, +)) + +func tomlRules() Rules { + return Rules{ + "root": { + {`\s+`, Text, nil}, + {`#.*`, Comment, nil}, + {Words(``, `\b`, `true`, `false`), KeywordConstant, nil}, + {`\d\d\d\d-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(\.\d\+)?(Z|[+-]\d{2}:\d{2})`, LiteralDate, nil}, + {`[+-]?[0-9](_?\d)*\.\d+`, LiteralNumberFloat, nil}, + {`[+-]?[0-9](_?\d)*`, LiteralNumberInteger, nil}, + {`"(\\\\|\\"|[^"])*"`, StringDouble, nil}, + {`'(\\\\|\\'|[^'])*'`, StringSingle, nil}, + {`[.,=\[\]{}]`, Punctuation, nil}, + {`[A-Za-z0-9_-]+`, NameOther, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/tradingview.go b/vendor/github.com/alecthomas/chroma/lexers/t/tradingview.go new file mode 100644 index 0000000..bf303c6 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/tradingview.go @@ -0,0 +1,44 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// TradingView lexer +var TradingView = internal.Register(MustNewLazyLexer( + &Config{ + Name: "TradingView", + Aliases: []string{"tradingview", "tv"}, + Filenames: []string{"*.tv"}, + MimeTypes: []string{"text/x-tradingview"}, + DotAll: true, + EnsureNL: true, + }, + tradingViewRules, +)) + +func tradingViewRules() Rules { + return Rules{ + "root": { + {`[^\S\n]+|\n|[()]`, Text, nil}, + {`(//.*?)(\n)`, ByGroups(CommentSingle, Text), nil}, + {`>=|<=|==|!=|>|<|\?|-|\+|\*|\/|%|\[|\]`, Operator, nil}, + {`[:,.]`, Punctuation, nil}, + {`=`, KeywordPseudo, nil}, + {`"(\\\\|\\"|[^"\n])*["\n]`, LiteralString, nil}, + {`'\\.'|'[^\\]'`, LiteralString, nil}, + {`[0-9](\.[0-9]*)?([eE][+-][0-9]+)?`, LiteralNumber, nil}, + {`#[a-fA-F0-9]{8}|#[a-fA-F0-9]{6}|#[a-fA-F0-9]{3}`, LiteralStringOther, nil}, + {`(abs|acos|alertcondition|alma|asin|atan|atr|avg|barcolor|barssince|bgcolor|cci|ceil|change|cog|color\.new|correlation|cos|crossover|crossunder|cum|dev|ema|exp|falling|fill|fixnan|floor|heikinashi|highest|highestbars|hline|iff|kagi|label\.(delete|get_text|get_x|get_y|new|set_color|set_size|set_style|set_text|set_textcolor|set_x|set_xloc|set_xy|set_y|set_yloc)|line\.(new|delete|get_x1|get_x2|get_y1|get_y2|set_color|set_width|set_style|set_extend|set_xy1|set_xy2|set_x1|set_x2|set_y1|set_y2|set_xloc)|linebreak|linreg|log|log10|lowest|lowestbars|macd|max|max_bars_back|min|mom|nz|percentile_(linear_interpolation|nearest_rank)|percentrank|pivothigh|pivotlow|plot|plotarrow|plotbar|plotcandle|plotchar|plotshape|pointfigure|pow|renko|rising|rma|roc|round|rsi|sar|security|sign|sin|sma|sqrt|stdev|stoch|study|sum|swma|tan|timestamp|tostring|tsi|valuewhen|variance|vwma|wma|strategy\.(cancel|cancel_all|close|close_all|entry|exit|order|risk\.(allow_entry_in|max_cons_loss_days|max_drawdown|max_intraday_filled_orders|max_intraday_loss|max_position_size)))\b`, NameFunction, nil}, + {`\b(bool|color|cross|dayofmonth|dayofweek|float|hour|input|int|label|line|minute|month|na|offset|second|strategy|string|tickerid|time|tr|vwap|weekofyear|year)(\()`, ByGroups(NameFunction, Text), nil}, // functions that can also be variable + {`(accdist|adjustment\.(dividends|none|splits)|aqua|area|areabr|bar_index|black|blue|bool|circles|close|columns|currency\.(AUD|CAD|CHF|EUR|GBP|HKD|JPY|NOK|NONE|NZD|RUB|SEK|SGD|TRY|USD|ZAR)|color\.(aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|dashed|dotted|dayofweek\.(monday|tuesday|wednesday|thursday|friday|saturday|sunday)|extend\.(both|left|right|none)|float|format\.(inherit|price|volume)|friday|fuchsia|gray|green|high|histogram|hl2|hlc3|hline\.style_(dotted|solid|dashed)|input\.(bool|float|integer|resolution|session|source|string|symbol)|integer|interval|isdaily|isdwm|isintraday|ismonthly|isweekly|label\.style_(arrowdown|arrowup|circle|cross|diamond|flag|labeldown|labelup|none|square|triangledown|triangleup|xcross)|lime|line\.style_(dashed|dotted|solid|arrow_both|arrow_left|arrow_right)|linebr|location\.(abovebar|absolute|belowbar|bottom|top)|low|maroon|monday|n|navy|ohlc4|olive|open|orange|period|plot\.style_(area|areabr|circles|columns|cross|histogram|line|linebr|stepline)|purple|red|resolution|saturday|scale\.(left|none|right)|session|session\.(extended|regular)|silver|size\.(auto|huge|large|normal|small|tiny)|solid|source|stepline|string|sunday|symbol|syminfo\.(mintick|pointvalue|prefix|root|session|ticker|tickerid|timezone)|teal|thursday|ticker|timeframe\.(isdaily|isdwm|isintraday|ismonthly|isweekly|multiplier|period)|timenow|tuesday|volume|wednesday|white|yellow|strategy\.(cash|closedtrades|commission\.(cash_per_contract|cash_per_order|percent)|direction\.(all|long|short)|equity|eventrades|fixed|grossloss|grossprofit|initial_capital|long|losstrades|max_contracts_held_(all|long|short)|max_drawdown|netprofit|oca\.(cancel|none|reduce)|openprofit|opentrades|percent_of_equity|position_avg_price|position_entry_name|position_size|short|wintrades)|shape\.(arrowdown|arrowup|circle|cross|diamond|flag|labeldown|labelup|square|triangledown|triangleup|xcross)|barstate\.is(first|history|last|new|realtime)|barmerge\.(gaps_on|gaps_off|lookahead_on|lookahead_off)|xloc\.bar_(index|time)|yloc\.(abovebar|belowbar|price))\b`, NameVariable, nil}, + {`(cross|dayofmonth|dayofweek|hour|minute|month|na|second|tickerid|time|tr|vwap|weekofyear|year)(\b[^\(])`, ByGroups(NameVariable, Text), nil}, // variables that can also be function + {`(int|float|bool|color|string|label|line)(\b[^\(=.])`, ByGroups(KeywordType, Text), nil}, // types that can also be a function + {`(var)\b`, KeywordType, nil}, + {`(true|false)\b`, KeywordConstant, nil}, + {`(and|or|not|if|else|for|to)\b`, OperatorWord, nil}, + {`@?[_a-zA-Z]\w*`, Text, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/transactsql.go b/vendor/github.com/alecthomas/chroma/lexers/t/transactsql.go new file mode 100644 index 0000000..e5beb06 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/transactsql.go @@ -0,0 +1,64 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// TransactSQL lexer. +var TransactSQL = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Transact-SQL", + Aliases: []string{"tsql", "t-sql"}, + MimeTypes: []string{"text/x-tsql"}, + NotMultiline: true, + CaseInsensitive: true, + }, + transactSQLRules, +)) + +func transactSQLRules() Rules { + return Rules{ + "root": { + {`\s+`, TextWhitespace, nil}, + {`--(?m).*?$\n?`, CommentSingle, nil}, + {`/\*`, CommentMultiline, Push("multiline-comments")}, + {`'`, LiteralStringSingle, Push("string")}, + {`"`, LiteralStringName, Push("quoted-ident")}, + {Words(``, ``, `!<`, `!=`, `!>`, `<`, `<=`, `<>`, `=`, `>`, `>=`, `+`, `+=`, `-`, `-=`, `*`, `*=`, `/`, `/=`, `%`, `%=`, `&`, `&=`, `|`, `|=`, `^`, `^=`, `~`, `::`), Operator, nil}, + {Words(``, `\b`, `all`, `and`, `any`, `between`, `except`, `exists`, `in`, `intersect`, `like`, `not`, `or`, `some`, `union`), OperatorWord, nil}, + {Words(``, `\b`, `bigint`, `binary`, `bit`, `char`, `cursor`, `date`, `datetime`, `datetime2`, `datetimeoffset`, `decimal`, `float`, `hierarchyid`, `image`, `int`, `money`, `nchar`, `ntext`, `numeric`, `nvarchar`, `real`, `smalldatetime`, `smallint`, `smallmoney`, `sql_variant`, `table`, `text`, `time`, `timestamp`, `tinyint`, `uniqueidentifier`, `varbinary`, `varchar`, `xml`), NameClass, nil}, + {Words(``, `\b`, `$partition`, `abs`, `acos`, `app_name`, `applock_mode`, `applock_test`, `ascii`, `asin`, `assemblyproperty`, `atan`, `atn2`, `avg`, `binary_checksum`, `cast`, `ceiling`, `certencoded`, `certprivatekey`, `char`, `charindex`, `checksum`, `checksum_agg`, `choose`, `col_length`, `col_name`, `columnproperty`, `compress`, `concat`, `connectionproperty`, `context_info`, `convert`, `cos`, `cot`, `count`, `count_big`, `current_request_id`, `current_timestamp`, `current_transaction_id`, `current_user`, `cursor_status`, `database_principal_id`, `databasepropertyex`, `dateadd`, `datediff`, `datediff_big`, `datefromparts`, `datename`, `datepart`, `datetime2fromparts`, `datetimefromparts`, `datetimeoffsetfromparts`, `day`, `db_id`, `db_name`, `decompress`, `degrees`, `dense_rank`, `difference`, `eomonth`, `error_line`, `error_message`, `error_number`, `error_procedure`, `error_severity`, `error_state`, `exp`, `file_id`, `file_idex`, `file_name`, `filegroup_id`, `filegroup_name`, `filegroupproperty`, `fileproperty`, `floor`, `format`, `formatmessage`, `fulltextcatalogproperty`, `fulltextserviceproperty`, `get_filestream_transaction_context`, `getansinull`, `getdate`, `getutcdate`, `grouping`, `grouping_id`, `has_perms_by_name`, `host_id`, `host_name`, `iif`, `index_col`, `indexkey_property`, `indexproperty`, `is_member`, `is_rolemember`, `is_srvrolemember`, `isdate`, `isjson`, `isnull`, `isnumeric`, `json_modify`, `json_query`, `json_value`, `left`, `len`, `log`, `log10`, `lower`, `ltrim`, `max`, `min`, `min_active_rowversion`, `month`, `nchar`, `newid`, `newsequentialid`, `ntile`, `object_definition`, `object_id`, `object_name`, `object_schema_name`, `objectproperty`, `objectpropertyex`, `opendatasource`, `openjson`, `openquery`, `openrowset`, `openxml`, `original_db_name`, `original_login`, `parse`, `parsename`, `patindex`, `permissions`, `pi`, `power`, `pwdcompare`, `pwdencrypt`, `quotename`, `radians`, `rand`, `rank`, `replace`, `replicate`, `reverse`, `right`, `round`, `row_number`, `rowcount_big`, `rtrim`, `schema_id`, `schema_name`, `scope_identity`, `serverproperty`, `session_context`, `session_user`, `sign`, `sin`, `smalldatetimefromparts`, `soundex`, `sp_helplanguage`, `space`, `sqrt`, `square`, `stats_date`, `stdev`, `stdevp`, `str`, `string_escape`, `string_split`, `stuff`, `substring`, `sum`, `suser_id`, `suser_name`, `suser_sid`, `suser_sname`, `switchoffset`, `sysdatetime`, `sysdatetimeoffset`, `system_user`, `sysutcdatetime`, `tan`, `textptr`, `textvalid`, `timefromparts`, `todatetimeoffset`, `try_cast`, `try_convert`, `try_parse`, `type_id`, `type_name`, `typeproperty`, `unicode`, `upper`, `user_id`, `user_name`, `var`, `varp`, `xact_state`, `year`), NameFunction, nil}, + {`(goto)(\s+)(\w+\b)`, ByGroups(Keyword, TextWhitespace, NameLabel), nil}, + {Words(``, `\b`, `absolute`, `action`, `ada`, `add`, `admin`, `after`, `aggregate`, `alias`, `all`, `allocate`, `alter`, `and`, `any`, `are`, `array`, `as`, `asc`, `asensitive`, `assertion`, `asymmetric`, `at`, `atomic`, `authorization`, `avg`, `backup`, `before`, `begin`, `between`, `binary`, `bit`, `bit_length`, `blob`, `boolean`, `both`, `breadth`, `break`, `browse`, `bulk`, `by`, `call`, `called`, `cardinality`, `cascade`, `cascaded`, `case`, `cast`, `catalog`, `catch`, `char`, `char_length`, `character`, `character_length`, `check`, `checkpoint`, `class`, `clob`, `close`, `clustered`, `coalesce`, `collate`, `collation`, `collect`, `column`, `commit`, `completion`, `compute`, `condition`, `connect`, `connection`, `constraint`, `constraints`, `constructor`, `contains`, `containstable`, `continue`, `convert`, `corr`, `corresponding`, `count`, `covar_pop`, `covar_samp`, `create`, `cross`, `cube`, `cume_dist`, `current`, `current_catalog`, `current_date`, `current_default_transform_group`, `current_path`, `current_role`, `current_schema`, `current_time`, `current_timestamp`, `current_transform_group_for_type`, `current_user`, `cursor`, `cycle`, `data`, `database`, `date`, `day`, `dbcc`, `deallocate`, `dec`, `decimal`, `declare`, `default`, `deferrable`, `deferred`, `delete`, `deny`, `depth`, `deref`, `desc`, `describe`, `descriptor`, `destroy`, `destructor`, `deterministic`, `diagnostics`, `dictionary`, `disconnect`, `disk`, `distinct`, `distributed`, `domain`, `double`, `drop`, `dump`, `dynamic`, `each`, `element`, `else`, `end`, `end-exec`, `equals`, `errlvl`, `escape`, `every`, `except`, `exception`, `exec`, `execute`, `exists`, `exit`, `external`, `extract`, `false`, `fetch`, `file`, `fillfactor`, `filter`, `first`, `float`, `for`, `foreign`, `fortran`, `found`, `free`, `freetext`, `freetexttable`, `from`, `full`, `fulltexttable`, `function`, `fusion`, `general`, `get`, `global`, `go`, `goto`, `grant`, `group`, `grouping`, `having`, `hold`, `holdlock`, `host`, `hour`, `identity`, `identity_insert`, `identitycol`, `if`, `ignore`, `immediate`, `in`, `include`, `index`, `indicator`, `initialize`, `initially`, `inner`, `inout`, `input`, `insensitive`, `insert`, `int`, `integer`, `intersect`, `intersection`, `interval`, `into`, `is`, `isolation`, `iterate`, `join`, `key`, `kill`, `language`, `large`, `last`, `lateral`, `leading`, `left`, `less`, `level`, `like`, `like_regex`, `limit`, `lineno`, `ln`, `load`, `local`, `localtime`, `localtimestamp`, `locator`, `lower`, `map`, `match`, `max`, `member`, `merge`, `method`, `min`, `minute`, `mod`, `modifies`, `modify`, `module`, `month`, `multiset`, `names`, `national`, `natural`, `nchar`, `nclob`, `new`, `next`, `no`, `nocheck`, `nonclustered`, `none`, `normalize`, `not`, `null`, `nullif`, `numeric`, `object`, `occurrences_regex`, `octet_length`, `of`, `off`, `offsets`, `old`, `on`, `only`, `open`, `opendatasource`, `openquery`, `openrowset`, `openxml`, `operation`, `option`, `or`, `order`, `ordinality`, `out`, `outer`, `output`, `over`, `overlaps`, `overlay`, `pad`, `parameter`, `parameters`, `partial`, `partition`, `pascal`, `path`, `percent`, `percent_rank`, `percentile_cont`, `percentile_disc`, `pivot`, `plan`, `position`, `position_regex`, `postfix`, `precision`, `prefix`, `preorder`, `prepare`, `preserve`, `primary`, `print`, `prior`, `privileges`, `proc`, `procedure`, `public`, `raiserror`, `range`, `read`, `reads`, `readtext`, `real`, `reconfigure`, `recursive`, `ref`, `references`, `referencing`, `regr_avgx`, `regr_avgy`, `regr_count`, `regr_intercept`, `regr_r2`, `regr_slope`, `regr_sxx`, `regr_sxy`, `regr_syy`, `relative`, `release`, `replication`, `restore`, `restrict`, `result`, `return`, `returns`, `revert`, `revoke`, `right`, `role`, `rollback`, `rollup`, `routine`, `row`, `rowcount`, `rowguidcol`, `rows`, `rule`, `save`, `savepoint`, `schema`, `scope`, `scroll`, `search`, `second`, `section`, `securityaudit`, `select`, `semantickeyphrasetable`, `semanticsimilaritydetailstable`, `semanticsimilaritytable`, `sensitive`, `sequence`, `session`, `session_user`, `set`, `sets`, `setuser`, `shutdown`, `similar`, `size`, `smallint`, `some`, `space`, `specific`, `specifictype`, `sql`, `sqlca`, `sqlcode`, `sqlerror`, `sqlexception`, `sqlstate`, `sqlwarning`, `start`, `state`, `statement`, `static`, `statistics`, `stddev_pop`, `stddev_samp`, `structure`, `submultiset`, `substring`, `substring_regex`, `sum`, `symmetric`, `system`, `system_user`, `table`, `tablesample`, `temporary`, `terminate`, `textsize`, `than`, `then`, `throw`, `time`, `timestamp`, `timezone_hour`, `timezone_minute`, `to`, `top`, `trailing`, `tran`, `transaction`, `translate`, `translate_regex`, `translation`, `treat`, `trigger`, `trim`, `true`, `truncate`, `try`, `try_convert`, `tsequal`, `uescape`, `under`, `union`, `unique`, `unknown`, `unnest`, `unpivot`, `update`, `updatetext`, `upper`, `usage`, `use`, `user`, `using`, `value`, `values`, `var_pop`, `var_samp`, `varchar`, `variable`, `varying`, `view`, `waitfor`, `when`, `whenever`, `where`, `while`, `width_bucket`, `window`, `with`, `within`, `without`, `work`, `write`, `writetext`, `xmlagg`, `xmlattributes`, `xmlbinary`, `xmlcast`, `xmlcomment`, `xmlconcat`, `xmldocument`, `xmlelement`, `xmlexists`, `xmlforest`, `xmliterate`, `xmlnamespaces`, `xmlparse`, `xmlpi`, `xmlquery`, `xmlserialize`, `xmltable`, `xmltext`, `xmlvalidate`, `year`, `zone`), Keyword, nil}, + {`(\[)([^]]+)(\])`, ByGroups(Operator, Name, Operator), nil}, + {`0x[0-9a-f]+`, LiteralNumberHex, nil}, + {`[0-9]+\.[0-9]*(e[+-]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`\.[0-9]+(e[+-]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`[0-9]+e[+-]?[0-9]+`, LiteralNumberFloat, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`[;(),.]`, Punctuation, nil}, + {`@@\w+`, NameBuiltin, nil}, + {`@\w+`, NameVariable, nil}, + {`(\w+)(:)`, ByGroups(NameLabel, Punctuation), nil}, + {`#?#?\w+`, Name, nil}, + {`\?`, NameVariableMagic, nil}, + }, + "multiline-comments": { + {`/\*`, CommentMultiline, Push("multiline-comments")}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[^/*]+`, CommentMultiline, nil}, + {`[/*]`, CommentMultiline, nil}, + }, + "string": { + {`[^']+`, LiteralStringSingle, nil}, + {`''`, LiteralStringSingle, nil}, + {`'`, LiteralStringSingle, Pop(1)}, + }, + "quoted-ident": { + {`[^"]+`, LiteralStringName, nil}, + {`""`, LiteralStringName, nil}, + {`"`, LiteralStringName, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/turing.go b/vendor/github.com/alecthomas/chroma/lexers/t/turing.go new file mode 100644 index 0000000..e34a6c1 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/turing.go @@ -0,0 +1,47 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Turing lexer. +var Turing = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Turing", + Aliases: []string{"turing"}, + Filenames: []string{"*.turing", "*.tu"}, + MimeTypes: []string{"text/x-turing"}, + }, + turingRules, +)) + +func turingRules() Rules { + return Rules{ + "root": { + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`\\\n`, Text, nil}, + {`%(.*?)\n`, CommentSingle, nil}, + {`/(\\\n)?[*](.|\n)*?[*](\\\n)?/`, CommentMultiline, nil}, + {`(var|fcn|function|proc|procedure|process|class|end|record|type|begin|case|loop|for|const|union|monitor|module|handler)\b`, KeywordDeclaration, nil}, + {`(all|asm|assert|bind|bits|body|break|by|cheat|checked|close|condition|decreasing|def|deferred|else|elsif|exit|export|external|flexible|fork|forward|free|get|if|implement|import|include|inherit|init|invariant|label|new|objectclass|of|opaque|open|packed|pause|pervasive|post|pre|priority|put|quit|read|register|result|seek|self|set|signal|skip|tag|tell|then|timeout|to|unchecked|unqualified|wait|when|write)\b`, Keyword, nil}, + {`(true|false)\b`, KeywordConstant, nil}, + {Words(``, `\b`, `addressint`, `array`, `boolean`, `char`, `int`, `int1`, `int2`, `int4`, `int8`, `nat`, `nat1`, `nat2`, `nat4`, `nat8`, `pointer`, `real`, `real4`, `real8`, `string`, `enum`), KeywordType, nil}, + {`\d+i`, LiteralNumber, nil}, + {`\d+\.\d*([Ee][-+]\d+)?i`, LiteralNumber, nil}, + {`\.\d+([Ee][-+]\d+)?i`, LiteralNumber, nil}, + {`\d+[Ee][-+]\d+i`, LiteralNumber, nil}, + {`\d+(\.\d+[eE][+\-]?\d+|\.\d*|[eE][+\-]?\d+)`, LiteralNumberFloat, nil}, + {`\.\d+([eE][+\-]?\d+)?`, LiteralNumberFloat, nil}, + {`0[0-7]+`, LiteralNumberOct, nil}, + {`0[xX][0-9a-fA-F]+`, LiteralNumberHex, nil}, + {`(0|[1-9][0-9]*)`, LiteralNumberInteger, nil}, + {`(div|mod|rem|\*\*|=|<|>|>=|<=|not=|not|and|or|xor|=>|in|shl|shr|->|~|~=|~in|&|:=|\.\.|[\^+\-*/&#])`, Operator, nil}, + {`'(\\['"\\abfnrtv]|\\x[0-9a-fA-F]{2}|\\[0-7]{1,3}|\\u[0-9a-fA-F]{4}|\\U[0-9a-fA-F]{8}|[^\\])'`, LiteralStringChar, nil}, + {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, + {`[()\[\]{}.,:]`, Punctuation, nil}, + {`[^\W\d]\w*`, NameOther, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/turtle.go b/vendor/github.com/alecthomas/chroma/lexers/t/turtle.go new file mode 100644 index 0000000..437f375 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/turtle.go @@ -0,0 +1,71 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Turtle lexer. +var Turtle = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Turtle", + Aliases: []string{"turtle"}, + Filenames: []string{"*.ttl"}, + MimeTypes: []string{"text/turtle", "application/x-turtle"}, + NotMultiline: true, + CaseInsensitive: true, + }, + turtleRules, +)) + +func turtleRules() Rules { + return Rules{ + "root": { + {`\s+`, TextWhitespace, nil}, + {"(@base|BASE)(\\s+)(<[^<>\"{}|^`\\\\\\x00-\\x20]*>)(\\s*)(\\.?)", ByGroups(Keyword, TextWhitespace, NameVariable, TextWhitespace, Punctuation), nil}, + {"(@prefix|PREFIX)(\\s+)((?:[a-z][\\w-]*)?\\:)(\\s+)(<[^<>\"{}|^`\\\\\\x00-\\x20]*>)(\\s*)(\\.?)", ByGroups(Keyword, TextWhitespace, NameNamespace, TextWhitespace, NameVariable, TextWhitespace, Punctuation), nil}, + {`(?<=\s)a(?=\s)`, KeywordType, nil}, + {"(<[^<>\"{}|^`\\\\\\x00-\\x20]*>)", NameVariable, nil}, + {`((?:[a-z][\w-]*)?\:)([a-z][\w-]*)`, ByGroups(NameNamespace, NameTag), nil}, + {`#[^\n]+`, Comment, nil}, + {`\b(true|false)\b`, Literal, nil}, + {`[+\-]?\d*\.\d+`, LiteralNumberFloat, nil}, + {`[+\-]?\d*(:?\.\d+)?E[+\-]?\d+`, LiteralNumberFloat, nil}, + {`[+\-]?\d+`, LiteralNumberInteger, nil}, + {`[\[\](){}.;,:^]`, Punctuation, nil}, + {`"""`, LiteralString, Push("triple-double-quoted-string")}, + {`"`, LiteralString, Push("single-double-quoted-string")}, + {`'''`, LiteralString, Push("triple-single-quoted-string")}, + {`'`, LiteralString, Push("single-single-quoted-string")}, + }, + "triple-double-quoted-string": { + {`"""`, LiteralString, Push("end-of-string")}, + {`[^\\]+`, LiteralString, nil}, + {`\\`, LiteralString, Push("string-escape")}, + }, + "single-double-quoted-string": { + {`"`, LiteralString, Push("end-of-string")}, + {`[^"\\\n]+`, LiteralString, nil}, + {`\\`, LiteralString, Push("string-escape")}, + }, + "triple-single-quoted-string": { + {`'''`, LiteralString, Push("end-of-string")}, + {`[^\\]+`, LiteralString, nil}, + {`\\`, LiteralString, Push("string-escape")}, + }, + "single-single-quoted-string": { + {`'`, LiteralString, Push("end-of-string")}, + {`[^'\\\n]+`, LiteralString, nil}, + {`\\`, LiteralString, Push("string-escape")}, + }, + "string-escape": { + {`.`, LiteralString, Pop(1)}, + }, + "end-of-string": { + {`(@)([a-z]+(:?-[a-z0-9]+)*)`, ByGroups(Operator, GenericEmph, GenericEmph), Pop(2)}, + {"(\\^\\^)(<[^<>\"{}|^`\\\\\\x00-\\x20]*>)", ByGroups(Operator, GenericEmph), Pop(2)}, + {`(\^\^)((?:[a-z][\w-]*)?\:)([a-z][\w-]*)`, ByGroups(Operator, GenericEmph, GenericEmph), Pop(2)}, + Default(Pop(2)), + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/twig.go b/vendor/github.com/alecthomas/chroma/lexers/t/twig.go new file mode 100644 index 0000000..0e0c1f1 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/twig.go @@ -0,0 +1,58 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Twig lexer. +var Twig = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Twig", + Aliases: []string{"twig"}, + Filenames: []string{}, + MimeTypes: []string{"application/x-twig"}, + DotAll: true, + }, + twigRules, +)) + +func twigRules() Rules { + return Rules{ + "root": { + {`[^{]+`, Other, nil}, + {`\{\{`, CommentPreproc, Push("var")}, + {`\{\#.*?\#\}`, Comment, nil}, + {`(\{%)(-?\s*)(raw)(\s*-?)(%\})(.*?)(\{%)(-?\s*)(endraw)(\s*-?)(%\})`, ByGroups(CommentPreproc, Text, Keyword, Text, CommentPreproc, Other, CommentPreproc, Text, Keyword, Text, CommentPreproc), nil}, + {`(\{%)(-?\s*)(verbatim)(\s*-?)(%\})(.*?)(\{%)(-?\s*)(endverbatim)(\s*-?)(%\})`, ByGroups(CommentPreproc, Text, Keyword, Text, CommentPreproc, Other, CommentPreproc, Text, Keyword, Text, CommentPreproc), nil}, + {`(\{%)(-?\s*)(filter)(\s+)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*)`, ByGroups(CommentPreproc, Text, Keyword, Text, NameFunction), Push("tag")}, + {`(\{%)(-?\s*)([a-zA-Z_]\w*)`, ByGroups(CommentPreproc, Text, Keyword), Push("tag")}, + {`\{`, Other, nil}, + }, + "varnames": { + {`(\|)(\s*)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*)`, ByGroups(Operator, Text, NameFunction), nil}, + {`(is)(\s+)(not)?(\s*)((?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*)`, ByGroups(Keyword, Text, Keyword, Text, NameFunction), nil}, + {`(?i)(true|false|none|null)\b`, KeywordPseudo, nil}, + {`(in|not|and|b-and|or|b-or|b-xor|isif|elseif|else|importconstant|defined|divisibleby|empty|even|iterable|odd|sameasmatches|starts\s+with|ends\s+with)\b`, Keyword, nil}, + {`(loop|block|parent)\b`, NameBuiltin, nil}, + {`(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*`, NameVariable, nil}, + {`\.(?:[\\_a-z]|[^\x00-\x7f])(?:[\\\w-]|[^\x00-\x7f])*`, NameVariable, nil}, + {`\.[0-9]+`, LiteralNumber, nil}, + {`:?"(\\\\|\\"|[^"])*"`, LiteralStringDouble, nil}, + {`:?'(\\\\|\\'|[^'])*'`, LiteralStringSingle, nil}, + {`([{}()\[\]+\-*/,:~%]|\.\.|\?|:|\*\*|\/\/|!=|[><=]=?)`, Operator, nil}, + {`[0-9](\.[0-9]*)?(eE[+-][0-9])?[flFLdD]?|0[xX][0-9a-fA-F]+[Ll]?`, LiteralNumber, nil}, + }, + "var": { + {`\s+`, Text, nil}, + {`(-?)(\}\})`, ByGroups(Text, CommentPreproc), Pop(1)}, + Include("varnames"), + }, + "tag": { + {`\s+`, Text, nil}, + {`(-?)(%\})`, ByGroups(Text, CommentPreproc), Pop(1)}, + Include("varnames"), + {`.`, Punctuation, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/typescript.go b/vendor/github.com/alecthomas/chroma/lexers/t/typescript.go new file mode 100644 index 0000000..0625bb0 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/t/typescript.go @@ -0,0 +1,101 @@ +package t + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// TypeScript lexer. +var TypeScript = internal.Register(MustNewLazyLexer( + &Config{ + Name: "TypeScript", + Aliases: []string{"ts", "tsx", "typescript"}, + Filenames: []string{"*.ts", "*.tsx"}, + MimeTypes: []string{"text/x-typescript"}, + DotAll: true, + EnsureNL: true, + }, + typeScriptRules, +)) + +func typeScriptRules() Rules { + return Rules{ + "commentsandwhitespace": { + {`\s+`, Text, nil}, + {``, Comment, Pop(1)}, + {`-`, Comment, nil}, + }, + "tag": { + {`\s+`, Text, nil}, + {`[\w.:-]+\s*=`, NameAttribute, Push("attr")}, + {`/?\s*>`, NameTag, Pop(1)}, + }, + "attr": { + {`\s+`, Text, nil}, + {`".*?"`, LiteralString, Pop(1)}, + {`'.*?'`, LiteralString, Pop(1)}, + {`[^\s>]+`, LiteralString, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/x/xorg.go b/vendor/github.com/alecthomas/chroma/lexers/x/xorg.go new file mode 100644 index 0000000..7936a51 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/x/xorg.go @@ -0,0 +1,29 @@ +package x + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Xorg lexer. +var Xorg = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Xorg", + Aliases: []string{"xorg.conf"}, + Filenames: []string{"xorg.conf"}, + MimeTypes: []string{}, + }, + xorgRules, +)) + +func xorgRules() Rules { + return Rules{ + "root": { + {`\s+`, TextWhitespace, nil}, + {`#.*$`, Comment, nil}, + {`((|Sub)Section)(\s+)("\w+")`, ByGroups(KeywordNamespace, LiteralStringEscape, TextWhitespace, LiteralStringEscape), nil}, + {`(End(|Sub)Section)`, KeywordNamespace, nil}, + {`(\w+)(\s+)([^\n#]+)`, ByGroups(NameKeyword, TextWhitespace, LiteralString), nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/y/yaml.go b/vendor/github.com/alecthomas/chroma/lexers/y/yaml.go new file mode 100644 index 0000000..488f760 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/y/yaml.go @@ -0,0 +1,58 @@ +package y + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +var YAML = internal.Register(MustNewLazyLexer( + &Config{ + Name: "YAML", + Aliases: []string{"yaml"}, + Filenames: []string{"*.yaml", "*.yml"}, + MimeTypes: []string{"text/x-yaml"}, + }, + yamlRules, +)) + +func yamlRules() Rules { + return Rules{ + "root": { + Include("whitespace"), + {`^---`, NameNamespace, nil}, + {`^\.\.\.`, NameNamespace, nil}, + {`[\n?]?\s*- `, Text, nil}, + {`#.*$`, Comment, nil}, + {`!![^\s]+`, CommentPreproc, nil}, + {`&[^\s]+`, CommentPreproc, nil}, + {`\*[^\s]+`, CommentPreproc, nil}, + {`^%include\s+[^\n\r]+`, CommentPreproc, nil}, + Include("key"), + Include("value"), + {`[?:,\[\]]`, Punctuation, nil}, + {`.`, Text, nil}, + }, + "value": { + {`([>|](?:[+-])?)(\n(^ {1,})(?:.*\n*(?:^\3 *).*)*)`, ByGroups(Punctuation, StringDoc, Whitespace), nil}, + {Words(``, `\b`, "true", "True", "TRUE", "false", "False", "FALSE", "null", + "y", "Y", "yes", "Yes", "YES", "n", "N", "no", "No", "NO", + "on", "On", "ON", "off", "Off", "OFF"), KeywordConstant, nil}, + {`"(?:\\.|[^"])*"`, StringDouble, nil}, + {`'(?:\\.|[^'])*'`, StringSingle, nil}, + {`\d\d\d\d-\d\d-\d\d([T ]\d\d:\d\d:\d\d(\.\d+)?(Z|\s+[-+]\d+)?)?`, LiteralDate, nil}, + {`\b[+\-]?(0x[\da-f]+|0o[0-7]+|(\d+\.?\d*|\.?\d+)(e[\+\-]?\d+)?|\.inf|\.nan)\b`, Number, nil}, + {`([^\{\}\[\]\?,\:\!\-\*&\@].*)( )+(#.*)`, ByGroups(Literal, Whitespace, Comment), nil}, + {`[^\{\}\[\]\?,\:\!\-\*&\@].*`, Literal, nil}, + }, + "key": { + {`"[^"\n].*": `, NameTag, nil}, + {`(-)( )([^"\n{]*)(:)( )`, ByGroups(Punctuation, Whitespace, NameTag, Punctuation, Whitespace), nil}, + {`([^"\n{]*)(:)( )`, ByGroups(NameTag, Punctuation, Whitespace), nil}, + {`([^"\n{]*)(:)(\n)`, ByGroups(NameTag, Punctuation, Whitespace), nil}, + }, + "whitespace": { + {`\s+`, Whitespace, nil}, + {`\n+`, Whitespace, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/y/yang.go b/vendor/github.com/alecthomas/chroma/lexers/y/yang.go new file mode 100644 index 0000000..36349eb --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/y/yang.go @@ -0,0 +1,71 @@ +package y + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +var YANG = internal.Register(MustNewLazyLexer( + &Config{ + Name: "YANG", + Aliases: []string{"yang"}, + Filenames: []string{"*.yang"}, + MimeTypes: []string{"application/yang"}, + }, + yangRules, +)) + +func yangRules() Rules { + return Rules{ + "root": { + {`\s+`, Whitespace, nil}, + {`[\{\}\;]+`, Punctuation, nil}, + {`(?<|^!?/\-*&~:]`, Operator, nil}, + {`[{}()\[\],.;]`, Punctuation, nil}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/lexers/z/zig.go b/vendor/github.com/alecthomas/chroma/lexers/z/zig.go new file mode 100644 index 0000000..56f54fd --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/z/zig.go @@ -0,0 +1,58 @@ +package z + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Zig lexer. +var Zig = internal.Register(MustNewLazyLexer( + &Config{ + Name: "Zig", + Aliases: []string{"zig"}, + Filenames: []string{"*.zig"}, + MimeTypes: []string{"text/zig"}, + }, + zigRules, +)) + +func zigRules() Rules { + return Rules{ + "root": { + {`\n`, TextWhitespace, nil}, + {`\s+`, TextWhitespace, nil}, + {`//.*?\n`, CommentSingle, nil}, + {Words(``, `\b`, `break`, `return`, `continue`, `asm`, `defer`, `errdefer`, `unreachable`, `try`, `catch`, `async`, `await`, `suspend`, `resume`, `cancel`), Keyword, nil}, + {Words(``, `\b`, `const`, `var`, `extern`, `packed`, `export`, `pub`, `noalias`, `inline`, `comptime`, `nakedcc`, `stdcallcc`, `volatile`, `allowzero`, `align`, `linksection`, `threadlocal`), KeywordReserved, nil}, + {Words(``, `\b`, `struct`, `enum`, `union`, `error`), Keyword, nil}, + {Words(``, `\b`, `while`, `for`), Keyword, nil}, + {Words(``, `\b`, `bool`, `f16`, `f32`, `f64`, `f128`, `void`, `noreturn`, `type`, `anyerror`, `promise`, `i0`, `u0`, `isize`, `usize`, `comptime_int`, `comptime_float`, `c_short`, `c_ushort`, `c_int`, `c_uint`, `c_long`, `c_ulong`, `c_longlong`, `c_ulonglong`, `c_longdouble`, `c_voidi8`, `u8`, `i16`, `u16`, `i32`, `u32`, `i64`, `u64`, `i128`, `u128`), KeywordType, nil}, + {Words(``, `\b`, `true`, `false`, `null`, `undefined`), KeywordConstant, nil}, + {Words(``, `\b`, `if`, `else`, `switch`, `and`, `or`, `orelse`), Keyword, nil}, + {Words(``, `\b`, `fn`, `usingnamespace`, `test`), Keyword, nil}, + {`0x[0-9a-fA-F]+\.[0-9a-fA-F]+([pP][\-+]?[0-9a-fA-F]+)?`, LiteralNumberFloat, nil}, + {`0x[0-9a-fA-F]+\.?[pP][\-+]?[0-9a-fA-F]+`, LiteralNumberFloat, nil}, + {`[0-9]+\.[0-9]+([eE][-+]?[0-9]+)?`, LiteralNumberFloat, nil}, + {`[0-9]+\.?[eE][-+]?[0-9]+`, LiteralNumberFloat, nil}, + {`0b(?:_?[01])+`, LiteralNumberBin, nil}, + {`0o(?:_?[0-7])+`, LiteralNumberOct, nil}, + {`0x(?:_?[0-9a-fA-F])+`, LiteralNumberHex, nil}, + {`(?:_?[0-9])+`, LiteralNumberInteger, nil}, + {`@[a-zA-Z_]\w*`, NameBuiltin, nil}, + {`[a-zA-Z_]\w*`, Name, nil}, + {`\'\\\'\'`, LiteralStringEscape, nil}, + {`\'\\(|x[a-fA-F0-9]{2}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{6}|[nr\\t\'"])\'`, LiteralStringEscape, nil}, + {`\'[^\\\']\'`, LiteralString, nil}, + {`\\\\[^\n]*`, LiteralStringHeredoc, nil}, + {`c\\\\[^\n]*`, LiteralStringHeredoc, nil}, + {`c?"`, LiteralString, Push("string")}, + {`[+%=><|^!?/\-*&~:]`, Operator, nil}, + {`[{}()\[\],.;]`, Punctuation, nil}, + }, + "string": { + {`\\(x[a-fA-F0-9]{2}|u[a-fA-F0-9]{4}|U[a-fA-F0-9]{6}|[nr\\t\'"])`, LiteralStringEscape, nil}, + {`[^\\"\n]+`, LiteralString, nil}, + {`"`, LiteralString, Pop(1)}, + }, + } +} diff --git a/vendor/github.com/alecthomas/chroma/mutators.go b/vendor/github.com/alecthomas/chroma/mutators.go new file mode 100644 index 0000000..bd6d720 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/mutators.go @@ -0,0 +1,131 @@ +package chroma + +import ( + "fmt" + "strings" +) + +// A Mutator modifies the behaviour of the lexer. +type Mutator interface { + // Mutate the lexer state machine as it is processing. + Mutate(state *LexerState) error +} + +// A LexerMutator is an additional interface that a Mutator can implement +// to modify the lexer when it is compiled. +type LexerMutator interface { + // Rules are the lexer rules, state is the state key for the rule the mutator is associated with. + MutateLexer(rules CompiledRules, state string, rule int) error +} + +// A MutatorFunc is a Mutator that mutates the lexer state machine as it is processing. +type MutatorFunc func(state *LexerState) error + +func (m MutatorFunc) Mutate(state *LexerState) error { return m(state) } // nolint + +// Mutators applies a set of Mutators in order. +func Mutators(modifiers ...Mutator) MutatorFunc { + return func(state *LexerState) error { + for _, modifier := range modifiers { + if err := modifier.Mutate(state); err != nil { + return err + } + } + return nil + } +} + +type includeMutator struct { + state string +} + +// Include the given state. +func Include(state string) Rule { + return Rule{Mutator: &includeMutator{state}} +} + +func (i *includeMutator) Mutate(s *LexerState) error { + return fmt.Errorf("should never reach here Include(%q)", i.state) +} + +func (i *includeMutator) MutateLexer(rules CompiledRules, state string, rule int) error { + includedRules, ok := rules[i.state] + if !ok { + return fmt.Errorf("invalid include state %q", i.state) + } + rules[state] = append(rules[state][:rule], append(includedRules, rules[state][rule+1:]...)...) + return nil +} + +type combinedMutator struct { + states []string +} + +// Combined creates a new anonymous state from the given states, and pushes that state. +func Combined(states ...string) Mutator { + return &combinedMutator{states} +} + +func (c *combinedMutator) Mutate(s *LexerState) error { + return fmt.Errorf("should never reach here Combined(%v)", c.states) +} + +func (c *combinedMutator) MutateLexer(rules CompiledRules, state string, rule int) error { + name := "__combined_" + strings.Join(c.states, "__") + if _, ok := rules[name]; !ok { + combined := []*CompiledRule{} + for _, state := range c.states { + rules, ok := rules[state] + if !ok { + return fmt.Errorf("invalid combine state %q", state) + } + combined = append(combined, rules...) + } + rules[name] = combined + } + rules[state][rule].Mutator = Push(name) + return nil +} + +// Push states onto the stack. +func Push(states ...string) MutatorFunc { + return func(s *LexerState) error { + if len(states) == 0 { + s.Stack = append(s.Stack, s.State) + } else { + for _, state := range states { + if state == "#pop" { + s.Stack = s.Stack[:len(s.Stack)-1] + } else { + s.Stack = append(s.Stack, state) + } + } + } + return nil + } +} + +// Pop state from the stack when rule matches. +func Pop(n int) MutatorFunc { + return func(state *LexerState) error { + if len(state.Stack) == 0 { + return fmt.Errorf("nothing to pop") + } + state.Stack = state.Stack[:len(state.Stack)-n] + return nil + } +} + +// Default returns a Rule that applies a set of Mutators. +func Default(mutators ...Mutator) Rule { + return Rule{Mutator: Mutators(mutators...)} +} + +// Stringify returns the raw string for a set of tokens. +func Stringify(tokens ...Token) string { + out := []string{} + for _, t := range tokens { + out = append(out, t.Value) + } + return strings.Join(out, "") +} diff --git a/vendor/github.com/alecthomas/chroma/pygments-lexers.txt b/vendor/github.com/alecthomas/chroma/pygments-lexers.txt new file mode 100644 index 0000000..bf4d9de --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/pygments-lexers.txt @@ -0,0 +1,322 @@ +Generated with: + + g 'class.*RegexLexer' | pawk --strict -F: '"pygments.lexers.%s.%s" % (f[0].split(".")[0], f[2].split()[1].split("(")[0])' > lexers.txt + +kotlin: + invalid unicode escape sequences + FIXED: Have to disable wide Unicode characters in unistring.py + +pygments.lexers.ambient.AmbientTalkLexer +pygments.lexers.ampl.AmplLexer +pygments.lexers.actionscript.ActionScriptLexer +pygments.lexers.actionscript.ActionScript3Lexer +pygments.lexers.actionscript.MxmlLexer +pygments.lexers.algebra.GAPLexer +pygments.lexers.algebra.MathematicaLexer +pygments.lexers.algebra.MuPADLexer +pygments.lexers.algebra.BCLexer +pygments.lexers.apl.APLLexer +pygments.lexers.bibtex.BibTeXLexer +pygments.lexers.bibtex.BSTLexer +pygments.lexers.basic.BlitzMaxLexer +pygments.lexers.basic.BlitzBasicLexer +pygments.lexers.basic.MonkeyLexer +pygments.lexers.basic.CbmBasicV2Lexer +pygments.lexers.basic.QBasicLexer +pygments.lexers.automation.AutohotkeyLexer +pygments.lexers.automation.AutoItLexer +pygments.lexers.archetype.AtomsLexer +pygments.lexers.c_like.ClayLexer +pygments.lexers.c_like.ValaLexer +pygments.lexers.asm.GasLexer +pygments.lexers.asm.ObjdumpLexer +pygments.lexers.asm.HsailLexer +pygments.lexers.asm.LlvmLexer +pygments.lexers.asm.NasmLexer +pygments.lexers.asm.TasmLexer +pygments.lexers.asm.Ca65Lexer +pygments.lexers.business.CobolLexer +pygments.lexers.business.ABAPLexer +pygments.lexers.business.OpenEdgeLexer +pygments.lexers.business.GoodDataCLLexer +pygments.lexers.business.MaqlLexer +pygments.lexers.capnproto.CapnProtoLexer +pygments.lexers.chapel.ChapelLexer +pygments.lexers.clean.CleanLexer +pygments.lexers.c_cpp.CFamilyLexer +pygments.lexers.console.VCTreeStatusLexer +pygments.lexers.console.PyPyLogLexer +pygments.lexers.csound.CsoundLexer +pygments.lexers.csound.CsoundDocumentLexer +pygments.lexers.csound.CsoundDocumentLexer +pygments.lexers.crystal.CrystalLexer +pygments.lexers.dalvik.SmaliLexer +pygments.lexers.css.CssLexer +pygments.lexers.css.SassLexer +pygments.lexers.css.ScssLexer +pygments.lexers.configs.IniLexer +pygments.lexers.configs.RegeditLexer +pygments.lexers.configs.PropertiesLexer +pygments.lexers.configs.KconfigLexer +pygments.lexers.configs.Cfengine3Lexer +pygments.lexers.configs.ApacheConfLexer +pygments.lexers.configs.SquidConfLexer +pygments.lexers.configs.NginxConfLexer +pygments.lexers.configs.LighttpdConfLexer +pygments.lexers.configs.DockerLexer +pygments.lexers.configs.TerraformLexer +pygments.lexers.configs.TermcapLexer +pygments.lexers.configs.TerminfoLexer +pygments.lexers.configs.PkgConfigLexer +pygments.lexers.configs.PacmanConfLexer +pygments.lexers.data.YamlLexer +pygments.lexers.data.JsonLexer +pygments.lexers.diff.DiffLexer +pygments.lexers.diff.DarcsPatchLexer +pygments.lexers.diff.WDiffLexer +pygments.lexers.dotnet.CSharpLexer +pygments.lexers.dotnet.NemerleLexer +pygments.lexers.dotnet.BooLexer +pygments.lexers.dotnet.VbNetLexer +pygments.lexers.dotnet.GenericAspxLexer +pygments.lexers.dotnet.FSharpLexer +pygments.lexers.dylan.DylanLexer +pygments.lexers.dylan.DylanLidLexer +pygments.lexers.ecl.ECLLexer +pygments.lexers.eiffel.EiffelLexer +pygments.lexers.dsls.ProtoBufLexer +pygments.lexers.dsls.ThriftLexer +pygments.lexers.dsls.BroLexer +pygments.lexers.dsls.PuppetLexer +pygments.lexers.dsls.RslLexer +pygments.lexers.dsls.MscgenLexer +pygments.lexers.dsls.VGLLexer +pygments.lexers.dsls.AlloyLexer +pygments.lexers.dsls.PanLexer +pygments.lexers.dsls.CrmshLexer +pygments.lexers.dsls.FlatlineLexer +pygments.lexers.dsls.SnowballLexer +pygments.lexers.elm.ElmLexer +pygments.lexers.erlang.ErlangLexer +pygments.lexers.erlang.ElixirLexer +pygments.lexers.ezhil.EzhilLexer +pygments.lexers.esoteric.BrainfuckLexer +pygments.lexers.esoteric.BefungeLexer +pygments.lexers.esoteric.CAmkESLexer +pygments.lexers.esoteric.CapDLLexer +pygments.lexers.esoteric.RedcodeLexer +pygments.lexers.esoteric.AheuiLexer +pygments.lexers.factor.FactorLexer +pygments.lexers.fantom.FantomLexer +pygments.lexers.felix.FelixLexer +pygments.lexers.forth.ForthLexer +pygments.lexers.fortran.FortranLexer +pygments.lexers.fortran.FortranFixedLexer +pygments.lexers.go.GoLexer +pygments.lexers.foxpro.FoxProLexer +pygments.lexers.graph.CypherLexer +pygments.lexers.grammar_notation.BnfLexer +pygments.lexers.grammar_notation.AbnfLexer +pygments.lexers.grammar_notation.JsgfLexer +pygments.lexers.graphics.GLShaderLexer +pygments.lexers.graphics.PostScriptLexer +pygments.lexers.graphics.AsymptoteLexer +pygments.lexers.graphics.GnuplotLexer +pygments.lexers.graphics.PovrayLexer +pygments.lexers.hexdump.HexdumpLexer +pygments.lexers.haskell.HaskellLexer +pygments.lexers.haskell.IdrisLexer +pygments.lexers.haskell.AgdaLexer +pygments.lexers.haskell.CryptolLexer +pygments.lexers.haskell.KokaLexer +pygments.lexers.haxe.HaxeLexer +pygments.lexers.haxe.HxmlLexer +pygments.lexers.hdl.VerilogLexer +pygments.lexers.hdl.SystemVerilogLexer +pygments.lexers.hdl.VhdlLexer +pygments.lexers.idl.IDLLexer +pygments.lexers.inferno.LimboLexer +pygments.lexers.igor.IgorLexer +pygments.lexers.html.HtmlLexer +pygments.lexers.html.DtdLexer +pygments.lexers.html.XmlLexer +pygments.lexers.html.HamlLexer +pygments.lexers.html.ScamlLexer +pygments.lexers.html.PugLexer +pygments.lexers.installers.NSISLexer +pygments.lexers.installers.RPMSpecLexer +pygments.lexers.installers.SourcesListLexer +pygments.lexers.installers.DebianControlLexer +pygments.lexers.iolang.IoLexer +pygments.lexers.julia.JuliaLexer +pygments.lexers.int_fiction.Inform6Lexer +pygments.lexers.int_fiction.Inform7Lexer +pygments.lexers.int_fiction.Tads3Lexer +pygments.lexers.make.BaseMakefileLexer +pygments.lexers.make.CMakeLexer +pygments.lexers.javascript.JavascriptLexer +pygments.lexers.javascript.KalLexer +pygments.lexers.javascript.LiveScriptLexer +pygments.lexers.javascript.DartLexer +pygments.lexers.javascript.TypeScriptLexer +pygments.lexers.javascript.LassoLexer +pygments.lexers.javascript.ObjectiveJLexer +pygments.lexers.javascript.CoffeeScriptLexer +pygments.lexers.javascript.MaskLexer +pygments.lexers.javascript.EarlGreyLexer +pygments.lexers.javascript.JuttleLexer +pygments.lexers.jvm.JavaLexer +pygments.lexers.jvm.ScalaLexer +pygments.lexers.jvm.GosuLexer +pygments.lexers.jvm.GroovyLexer +pygments.lexers.jvm.IokeLexer +pygments.lexers.jvm.ClojureLexer +pygments.lexers.jvm.TeaLangLexer +pygments.lexers.jvm.CeylonLexer +pygments.lexers.jvm.KotlinLexer +pygments.lexers.jvm.XtendLexer +pygments.lexers.jvm.PigLexer +pygments.lexers.jvm.GoloLexer +pygments.lexers.jvm.JasminLexer +pygments.lexers.markup.BBCodeLexer +pygments.lexers.markup.MoinWikiLexer +pygments.lexers.markup.RstLexer +pygments.lexers.markup.TexLexer +pygments.lexers.markup.GroffLexer +pygments.lexers.markup.MozPreprocHashLexer +pygments.lexers.markup.MarkdownLexer +pygments.lexers.ml.SMLLexer +pygments.lexers.ml.OcamlLexer +pygments.lexers.ml.OpaLexer +pygments.lexers.modeling.ModelicaLexer +pygments.lexers.modeling.BugsLexer +pygments.lexers.modeling.JagsLexer +pygments.lexers.modeling.StanLexer +pygments.lexers.matlab.MatlabLexer +pygments.lexers.matlab.OctaveLexer +pygments.lexers.matlab.ScilabLexer +pygments.lexers.monte.MonteLexer +pygments.lexers.lisp.SchemeLexer +pygments.lexers.lisp.CommonLispLexer +pygments.lexers.lisp.HyLexer +pygments.lexers.lisp.RacketLexer +pygments.lexers.lisp.NewLispLexer +pygments.lexers.lisp.EmacsLispLexer +pygments.lexers.lisp.ShenLexer +pygments.lexers.lisp.XtlangLexer +pygments.lexers.modula2.Modula2Lexer +pygments.lexers.ncl.NCLLexer +pygments.lexers.nim.NimLexer +pygments.lexers.nit.NitLexer +pygments.lexers.nix.NixLexer +pygments.lexers.oberon.ComponentPascalLexer +pygments.lexers.ooc.OocLexer +pygments.lexers.objective.SwiftLexer +pygments.lexers.parasail.ParaSailLexer +pygments.lexers.pawn.SourcePawnLexer +pygments.lexers.pawn.PawnLexer +pygments.lexers.pascal.AdaLexer +pygments.lexers.parsers.RagelLexer +pygments.lexers.parsers.RagelEmbeddedLexer +pygments.lexers.parsers.AntlrLexer +pygments.lexers.parsers.TreetopBaseLexer +pygments.lexers.parsers.EbnfLexer +pygments.lexers.php.ZephirLexer +pygments.lexers.php.PhpLexer +pygments.lexers.perl.PerlLexer +pygments.lexers.perl.Perl6Lexer +pygments.lexers.praat.PraatLexer +pygments.lexers.prolog.PrologLexer +pygments.lexers.prolog.LogtalkLexer +pygments.lexers.qvt.QVToLexer +pygments.lexers.rdf.SparqlLexer +pygments.lexers.rdf.TurtleLexer +pygments.lexers.python.PythonLexer +pygments.lexers.python.Python3Lexer +pygments.lexers.python.PythonTracebackLexer +pygments.lexers.python.Python3TracebackLexer +pygments.lexers.python.CythonLexer +pygments.lexers.python.DgLexer +pygments.lexers.rebol.RebolLexer +pygments.lexers.rebol.RedLexer +pygments.lexers.resource.ResourceLexer +pygments.lexers.rnc.RNCCompactLexer +pygments.lexers.roboconf.RoboconfGraphLexer +pygments.lexers.roboconf.RoboconfInstancesLexer +pygments.lexers.rust.RustLexer +pygments.lexers.ruby.RubyLexer +pygments.lexers.ruby.FancyLexer +pygments.lexers.sas.SASLexer +pygments.lexers.smalltalk.SmalltalkLexer +pygments.lexers.smalltalk.NewspeakLexer +pygments.lexers.smv.NuSMVLexer +pygments.lexers.shell.BashLexer +pygments.lexers.shell.BatchLexer +pygments.lexers.shell.TcshLexer +pygments.lexers.shell.PowerShellLexer +pygments.lexers.shell.FishShellLexer +pygments.lexers.snobol.SnobolLexer +pygments.lexers.scripting.LuaLexer +pygments.lexers.scripting.ChaiscriptLexer +pygments.lexers.scripting.LSLLexer +pygments.lexers.scripting.AppleScriptLexer +pygments.lexers.scripting.RexxLexer +pygments.lexers.scripting.MOOCodeLexer +pygments.lexers.scripting.HybrisLexer +pygments.lexers.scripting.EasytrieveLexer +pygments.lexers.scripting.JclLexer +pygments.lexers.supercollider.SuperColliderLexer +pygments.lexers.stata.StataLexer +pygments.lexers.tcl.TclLexer +pygments.lexers.sql.PostgresLexer +pygments.lexers.sql.PlPgsqlLexer +pygments.lexers.sql.PsqlRegexLexer +pygments.lexers.sql.SqlLexer +pygments.lexers.sql.TransactSqlLexer +pygments.lexers.sql.MySqlLexer +pygments.lexers.sql.RqlLexer +pygments.lexers.testing.GherkinLexer +pygments.lexers.testing.TAPLexer +pygments.lexers.textedit.AwkLexer +pygments.lexers.textedit.VimLexer +pygments.lexers.textfmts.IrcLogsLexer +pygments.lexers.textfmts.GettextLexer +pygments.lexers.textfmts.HttpLexer +pygments.lexers.textfmts.TodotxtLexer +pygments.lexers.trafficscript.RtsLexer +pygments.lexers.theorem.CoqLexer +pygments.lexers.theorem.IsabelleLexer +pygments.lexers.theorem.LeanLexer +pygments.lexers.templates.SmartyLexer +pygments.lexers.templates.VelocityLexer +pygments.lexers.templates.DjangoLexer +pygments.lexers.templates.MyghtyLexer +pygments.lexers.templates.MasonLexer +pygments.lexers.templates.MakoLexer +pygments.lexers.templates.CheetahLexer +pygments.lexers.templates.GenshiTextLexer +pygments.lexers.templates.GenshiMarkupLexer +pygments.lexers.templates.JspRootLexer +pygments.lexers.templates.EvoqueLexer +pygments.lexers.templates.ColdfusionLexer +pygments.lexers.templates.ColdfusionMarkupLexer +pygments.lexers.templates.TeaTemplateRootLexer +pygments.lexers.templates.HandlebarsLexer +pygments.lexers.templates.LiquidLexer +pygments.lexers.templates.TwigLexer +pygments.lexers.templates.Angular2Lexer +pygments.lexers.urbi.UrbiscriptLexer +pygments.lexers.typoscript.TypoScriptCssDataLexer +pygments.lexers.typoscript.TypoScriptHtmlDataLexer +pygments.lexers.typoscript.TypoScriptLexer +pygments.lexers.varnish.VCLLexer +pygments.lexers.verification.BoogieLexer +pygments.lexers.verification.SilverLexer +pygments.lexers.x10.X10Lexer +pygments.lexers.whiley.WhileyLexer +pygments.lexers.xorg.XorgLexer +pygments.lexers.webmisc.DuelLexer +pygments.lexers.webmisc.XQueryLexer +pygments.lexers.webmisc.QmlLexer +pygments.lexers.webmisc.CirruLexer +pygments.lexers.webmisc.SlimLexer diff --git a/vendor/github.com/alecthomas/chroma/regexp.go b/vendor/github.com/alecthomas/chroma/regexp.go new file mode 100644 index 0000000..4096dfc --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/regexp.go @@ -0,0 +1,572 @@ +package chroma + +import ( + "fmt" + "os" + "path/filepath" + "regexp" + "sort" + "strings" + "sync" + "time" + "unicode/utf8" + + "github.com/dlclark/regexp2" +) + +// A Rule is the fundamental matching unit of the Regex lexer state machine. +type Rule struct { + Pattern string + Type Emitter + Mutator Mutator +} + +// An Emitter takes group matches and returns tokens. +type Emitter interface { + // Emit tokens for the given regex groups. + Emit(groups []string, state *LexerState) Iterator +} + +// EmitterFunc is a function that is an Emitter. +type EmitterFunc func(groups []string, state *LexerState) Iterator + +// Emit tokens for groups. +func (e EmitterFunc) Emit(groups []string, state *LexerState) Iterator { + return e(groups, state) +} + +// ByGroups emits a token for each matching group in the rule's regex. +func ByGroups(emitters ...Emitter) Emitter { + return EmitterFunc(func(groups []string, state *LexerState) Iterator { + iterators := make([]Iterator, 0, len(groups)-1) + if len(emitters) != len(groups)-1 { + iterators = append(iterators, Error.Emit(groups, state)) + // panic(errors.Errorf("number of groups %q does not match number of emitters %v", groups, emitters)) + } else { + for i, group := range groups[1:] { + if emitters[i] != nil { + iterators = append(iterators, emitters[i].Emit([]string{group}, state)) + } + } + } + return Concaterator(iterators...) + }) +} + +// ByGroupNames emits a token for each named matching group in the rule's regex. +func ByGroupNames(emitters map[string]Emitter) Emitter { + return EmitterFunc(func(groups []string, state *LexerState) Iterator { + iterators := make([]Iterator, 0, len(state.NamedGroups)-1) + if len(state.NamedGroups)-1 == 0 { + if emitter, ok := emitters[`0`]; ok { + iterators = append(iterators, emitter.Emit(groups, state)) + } else { + iterators = append(iterators, Error.Emit(groups, state)) + } + } else { + ruleRegex := state.Rules[state.State][state.Rule].Regexp + for i := 1; i < len(state.NamedGroups); i++ { + groupName := ruleRegex.GroupNameFromNumber(i) + group := state.NamedGroups[groupName] + if emitter, ok := emitters[groupName]; ok { + if emitter != nil { + iterators = append(iterators, emitter.Emit([]string{group}, state)) + } + } else { + iterators = append(iterators, Error.Emit([]string{group}, state)) + } + } + } + return Concaterator(iterators...) + }) +} + +// UsingByGroup emits tokens for the matched groups in the regex using a +// "sublexer". Used when lexing code blocks where the name of a sublexer is +// contained within the block, for example on a Markdown text block or SQL +// language block. +// +// The sublexer will be retrieved using sublexerGetFunc (typically +// internal.Get), using the captured value from the matched sublexerNameGroup. +// +// If sublexerGetFunc returns a non-nil lexer for the captured sublexerNameGroup, +// then tokens for the matched codeGroup will be emitted using the retrieved +// lexer. Otherwise, if the sublexer is nil, then tokens will be emitted from +// the passed emitter. +// +// Example: +// +// var Markdown = internal.Register(MustNewLexer( +// &Config{ +// Name: "markdown", +// Aliases: []string{"md", "mkd"}, +// Filenames: []string{"*.md", "*.mkd", "*.markdown"}, +// MimeTypes: []string{"text/x-markdown"}, +// }, +// Rules{ +// "root": { +// {"^(```)(\\w+)(\\n)([\\w\\W]*?)(^```$)", +// UsingByGroup( +// internal.Get, +// 2, 4, +// String, String, String, Text, String, +// ), +// nil, +// }, +// }, +// }, +// )) +// +// See the lexers/m/markdown.go for the complete example. +// +// Note: panic's if the number emitters does not equal the number of matched +// groups in the regex. +func UsingByGroup(sublexerGetFunc func(string) Lexer, sublexerNameGroup, codeGroup int, emitters ...Emitter) Emitter { + return EmitterFunc(func(groups []string, state *LexerState) Iterator { + // bounds check + if len(emitters) != len(groups)-1 { + panic("UsingByGroup expects number of emitters to be the same as len(groups)-1") + } + + // grab sublexer + sublexer := sublexerGetFunc(groups[sublexerNameGroup]) + + // build iterators + iterators := make([]Iterator, len(groups)-1) + for i, group := range groups[1:] { + if i == codeGroup-1 && sublexer != nil { + var err error + iterators[i], err = sublexer.Tokenise(nil, groups[codeGroup]) + if err != nil { + panic(err) + } + } else if emitters[i] != nil { + iterators[i] = emitters[i].Emit([]string{group}, state) + } + } + + return Concaterator(iterators...) + }) +} + +// Using returns an Emitter that uses a given Lexer for parsing and emitting. +func Using(lexer Lexer) Emitter { + return EmitterFunc(func(groups []string, _ *LexerState) Iterator { + it, err := lexer.Tokenise(&TokeniseOptions{State: "root", Nested: true}, groups[0]) + if err != nil { + panic(err) + } + return it + }) +} + +// UsingSelf is like Using, but uses the current Lexer. +func UsingSelf(stateName string) Emitter { + return EmitterFunc(func(groups []string, state *LexerState) Iterator { + it, err := state.Lexer.Tokenise(&TokeniseOptions{State: stateName, Nested: true}, groups[0]) + if err != nil { + panic(err) + } + return it + }) +} + +// Words creates a regex that matches any of the given literal words. +func Words(prefix, suffix string, words ...string) string { + sort.Slice(words, func(i, j int) bool { + return len(words[j]) < len(words[i]) + }) + for i, word := range words { + words[i] = regexp.QuoteMeta(word) + } + return prefix + `(` + strings.Join(words, `|`) + `)` + suffix +} + +// Tokenise text using lexer, returning tokens as a slice. +func Tokenise(lexer Lexer, options *TokeniseOptions, text string) ([]Token, error) { + var out []Token + it, err := lexer.Tokenise(options, text) + if err != nil { + return nil, err + } + for t := it(); t != EOF; t = it() { + out = append(out, t) + } + return out, nil +} + +// Rules maps from state to a sequence of Rules. +type Rules map[string][]Rule + +// Rename clones rules then a rule. +func (r Rules) Rename(oldRule, newRule string) Rules { + r = r.Clone() + r[newRule] = r[oldRule] + delete(r, oldRule) + return r +} + +// Clone returns a clone of the Rules. +func (r Rules) Clone() Rules { + out := map[string][]Rule{} + for key, rules := range r { + out[key] = make([]Rule, len(rules)) + copy(out[key], rules) + } + return out +} + +// Merge creates a clone of "r" then merges "rules" into the clone. +func (r Rules) Merge(rules Rules) Rules { + out := r.Clone() + for k, v := range rules.Clone() { + out[k] = v + } + return out +} + +// MustNewLazyLexer creates a new Lexer with deferred rules generation or panics. +func MustNewLazyLexer(config *Config, rulesFunc func() Rules) *RegexLexer { + lexer, err := NewLazyLexer(config, rulesFunc) + if err != nil { + panic(err) + } + return lexer +} + +// NewLazyLexer creates a new regex-based Lexer with deferred rules generation. +func NewLazyLexer(config *Config, rulesFunc func() Rules) (*RegexLexer, error) { + if config == nil { + config = &Config{} + } + for _, glob := range append(config.Filenames, config.AliasFilenames...) { + _, err := filepath.Match(glob, "") + if err != nil { + return nil, fmt.Errorf("%s: %q is not a valid glob: %w", config.Name, glob, err) + } + } + return &RegexLexer{ + config: config, + compilerFunc: rulesFunc, + }, nil +} + +// MustNewLexer creates a new Lexer or panics. +// +// Deprecated: Use MustNewLazyLexer instead. +func MustNewLexer(config *Config, rules Rules) *RegexLexer { // nolint: forbidigo + lexer, err := NewLexer(config, rules) // nolint: forbidigo + if err != nil { + panic(err) + } + return lexer +} + +// NewLexer creates a new regex-based Lexer. +// +// "rules" is a state machine transitition map. Each key is a state. Values are sets of rules +// that match input, optionally modify lexer state, and output tokens. +// +// Deprecated: Use NewLazyLexer instead. +func NewLexer(config *Config, rules Rules) (*RegexLexer, error) { // nolint: forbidigo + return NewLazyLexer(config, func() Rules { return rules }) +} + +// Trace enables debug tracing. +func (r *RegexLexer) Trace(trace bool) *RegexLexer { + r.trace = trace + return r +} + +// A CompiledRule is a Rule with a pre-compiled regex. +// +// Note that regular expressions are lazily compiled on first use of the lexer. +type CompiledRule struct { + Rule + Regexp *regexp2.Regexp + flags string +} + +// CompiledRules is a map of rule name to sequence of compiled rules in that rule. +type CompiledRules map[string][]*CompiledRule + +// LexerState contains the state for a single lex. +type LexerState struct { + Lexer *RegexLexer + Text []rune + Pos int + Rules CompiledRules + Stack []string + State string + Rule int + // Group matches. + Groups []string + // Named Group matches. + NamedGroups map[string]string + // Custum context for mutators. + MutatorContext map[interface{}]interface{} + iteratorStack []Iterator + options *TokeniseOptions + newlineAdded bool +} + +// Set mutator context. +func (l *LexerState) Set(key interface{}, value interface{}) { + l.MutatorContext[key] = value +} + +// Get mutator context. +func (l *LexerState) Get(key interface{}) interface{} { + return l.MutatorContext[key] +} + +// Iterator returns the next Token from the lexer. +func (l *LexerState) Iterator() Token { // nolint: gocognit + end := len(l.Text) + if l.newlineAdded { + end-- + } + for l.Pos < end && len(l.Stack) > 0 { + // Exhaust the iterator stack, if any. + for len(l.iteratorStack) > 0 { + n := len(l.iteratorStack) - 1 + t := l.iteratorStack[n]() + if t == EOF { + l.iteratorStack = l.iteratorStack[:n] + continue + } + return t + } + + l.State = l.Stack[len(l.Stack)-1] + if l.Lexer.trace { + fmt.Fprintf(os.Stderr, "%s: pos=%d, text=%q\n", l.State, l.Pos, string(l.Text[l.Pos:])) + } + selectedRule, ok := l.Rules[l.State] + if !ok { + panic("unknown state " + l.State) + } + ruleIndex, rule, groups, namedGroups := matchRules(l.Text, l.Pos, selectedRule) + // No match. + if groups == nil { + // From Pygments :\ + // + // If the RegexLexer encounters a newline that is flagged as an error token, the stack is + // emptied and the lexer continues scanning in the 'root' state. This can help producing + // error-tolerant highlighting for erroneous input, e.g. when a single-line string is not + // closed. + if l.Text[l.Pos] == '\n' && l.State != l.options.State { + l.Stack = []string{l.options.State} + continue + } + l.Pos++ + return Token{Error, string(l.Text[l.Pos-1 : l.Pos])} + } + l.Rule = ruleIndex + l.Groups = groups + l.NamedGroups = namedGroups + l.Pos += utf8.RuneCountInString(groups[0]) + if rule.Mutator != nil { + if err := rule.Mutator.Mutate(l); err != nil { + panic(err) + } + } + if rule.Type != nil { + l.iteratorStack = append(l.iteratorStack, rule.Type.Emit(l.Groups, l)) + } + } + // Exhaust the IteratorStack, if any. + // Duplicate code, but eh. + for len(l.iteratorStack) > 0 { + n := len(l.iteratorStack) - 1 + t := l.iteratorStack[n]() + if t == EOF { + l.iteratorStack = l.iteratorStack[:n] + continue + } + return t + } + + // If we get to here and we still have text, return it as an error. + if l.Pos != len(l.Text) && len(l.Stack) == 0 { + value := string(l.Text[l.Pos:]) + l.Pos = len(l.Text) + return Token{Type: Error, Value: value} + } + return EOF +} + +// RegexLexer is the default lexer implementation used in Chroma. +type RegexLexer struct { + config *Config + analyser func(text string) float32 + trace bool + + mu sync.Mutex + compiled bool + rules map[string][]*CompiledRule + compilerFunc func() Rules + compileOnce sync.Once +} + +// SetAnalyser sets the analyser function used to perform content inspection. +func (r *RegexLexer) SetAnalyser(analyser func(text string) float32) *RegexLexer { + r.analyser = analyser + return r +} + +func (r *RegexLexer) AnalyseText(text string) float32 { // nolint + if r.analyser != nil { + return r.analyser(text) + } + return 0.0 +} + +func (r *RegexLexer) Config() *Config { // nolint + return r.config +} + +// Regex compilation is deferred until the lexer is used. This is to avoid significant init() time costs. +func (r *RegexLexer) maybeCompile() (err error) { + r.mu.Lock() + defer r.mu.Unlock() + if r.compiled { + return nil + } + for state, rules := range r.rules { + for i, rule := range rules { + if rule.Regexp == nil { + pattern := "(?:" + rule.Pattern + ")" + if rule.flags != "" { + pattern = "(?" + rule.flags + ")" + pattern + } + pattern = `\G` + pattern + rule.Regexp, err = regexp2.Compile(pattern, regexp2.RE2) + if err != nil { + return fmt.Errorf("failed to compile rule %s.%d: %s", state, i, err) + } + rule.Regexp.MatchTimeout = time.Millisecond * 250 + } + } + } +restart: + seen := map[LexerMutator]bool{} + for state := range r.rules { + for i := 0; i < len(r.rules[state]); i++ { + rule := r.rules[state][i] + if compile, ok := rule.Mutator.(LexerMutator); ok { + if seen[compile] { + return fmt.Errorf("saw mutator %T twice; this should not happen", compile) + } + seen[compile] = true + if err := compile.MutateLexer(r.rules, state, i); err != nil { + return err + } + // Process the rules again in case the mutator added/removed rules. + // + // This sounds bad, but shouldn't be significant in practice. + goto restart + } + } + } + r.compiled = true + return nil +} + +func (r *RegexLexer) compileRules() error { + rules := r.compilerFunc() + if _, ok := rules["root"]; !ok { + return fmt.Errorf("no \"root\" state") + } + compiledRules := map[string][]*CompiledRule{} + for state, rules := range rules { + compiledRules[state] = nil + for _, rule := range rules { + flags := "" + if !r.config.NotMultiline { + flags += "m" + } + if r.config.CaseInsensitive { + flags += "i" + } + if r.config.DotAll { + flags += "s" + } + compiledRules[state] = append(compiledRules[state], &CompiledRule{Rule: rule, flags: flags}) + } + } + + r.rules = compiledRules + return nil +} + +func (r *RegexLexer) Tokenise(options *TokeniseOptions, text string) (Iterator, error) { // nolint + var err error + if r.compilerFunc != nil { + r.compileOnce.Do(func() { + err = r.compileRules() + }) + } + if err != nil { + return nil, err + } + if err := r.maybeCompile(); err != nil { + return nil, err + } + if options == nil { + options = defaultOptions + } + if options.EnsureLF { + text = ensureLF(text) + } + newlineAdded := false + if !options.Nested && r.config.EnsureNL && !strings.HasSuffix(text, "\n") { + text += "\n" + newlineAdded = true + } + state := &LexerState{ + newlineAdded: newlineAdded, + options: options, + Lexer: r, + Text: []rune(text), + Stack: []string{options.State}, + Rules: r.rules, + MutatorContext: map[interface{}]interface{}{}, + } + return state.Iterator, nil +} + +func matchRules(text []rune, pos int, rules []*CompiledRule) (int, *CompiledRule, []string, map[string]string) { + for i, rule := range rules { + match, err := rule.Regexp.FindRunesMatchStartingAt(text, pos) + if match != nil && err == nil && match.Index == pos { + groups := []string{} + namedGroups := make(map[string]string) + for _, g := range match.Groups() { + namedGroups[g.Name] = g.String() + groups = append(groups, g.String()) + } + return i, rule, groups, namedGroups + } + } + return 0, &CompiledRule{}, nil, nil +} + +// replace \r and \r\n with \n +// same as strings.ReplaceAll but more efficient +func ensureLF(text string) string { + buf := make([]byte, len(text)) + var j int + for i := 0; i < len(text); i++ { + c := text[i] + if c == '\r' { + if i < len(text)-1 && text[i+1] == '\n' { + continue + } + c = '\n' + } + buf[j] = c + j++ + } + return string(buf[:j]) +} diff --git a/vendor/github.com/alecthomas/chroma/remap.go b/vendor/github.com/alecthomas/chroma/remap.go new file mode 100644 index 0000000..cfb5c38 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/remap.go @@ -0,0 +1,80 @@ +package chroma + +type remappingLexer struct { + lexer Lexer + mapper func(Token) []Token +} + +// RemappingLexer remaps a token to a set of, potentially empty, tokens. +func RemappingLexer(lexer Lexer, mapper func(Token) []Token) Lexer { + return &remappingLexer{lexer, mapper} +} + +func (r *remappingLexer) Config() *Config { + return r.lexer.Config() +} + +func (r *remappingLexer) Tokenise(options *TokeniseOptions, text string) (Iterator, error) { + it, err := r.lexer.Tokenise(options, text) + if err != nil { + return nil, err + } + var buffer []Token + return func() Token { + for { + if len(buffer) > 0 { + t := buffer[0] + buffer = buffer[1:] + return t + } + t := it() + if t == EOF { + return t + } + buffer = r.mapper(t) + } + }, nil +} + +// TypeMapping defines type maps for the TypeRemappingLexer. +type TypeMapping []struct { + From, To TokenType + Words []string +} + +// TypeRemappingLexer remaps types of tokens coming from a parent Lexer. +// +// eg. Map "defvaralias" tokens of type NameVariable to NameFunction: +// +// mapping := TypeMapping{ +// {NameVariable, NameFunction, []string{"defvaralias"}, +// } +// lexer = TypeRemappingLexer(lexer, mapping) +func TypeRemappingLexer(lexer Lexer, mapping TypeMapping) Lexer { + // Lookup table for fast remapping. + lut := map[TokenType]map[string]TokenType{} + for _, rt := range mapping { + km, ok := lut[rt.From] + if !ok { + km = map[string]TokenType{} + lut[rt.From] = km + } + if len(rt.Words) == 0 { + km[""] = rt.To + } else { + for _, k := range rt.Words { + km[k] = rt.To + } + } + } + return RemappingLexer(lexer, func(t Token) []Token { + if k, ok := lut[t.Type]; ok { + if tt, ok := k[t.Value]; ok { + t.Type = tt + } else if tt, ok := k[""]; ok { + t.Type = tt + } + } + return []Token{t} + }) +} diff --git a/vendor/github.com/alecthomas/chroma/style.go b/vendor/github.com/alecthomas/chroma/style.go new file mode 100644 index 0000000..1319fc4 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/style.go @@ -0,0 +1,344 @@ +package chroma + +import ( + "fmt" + "strings" +) + +// Trilean value for StyleEntry value inheritance. +type Trilean uint8 + +// Trilean states. +const ( + Pass Trilean = iota + Yes + No +) + +func (t Trilean) String() string { + switch t { + case Yes: + return "Yes" + case No: + return "No" + default: + return "Pass" + } +} + +// Prefix returns s with "no" as a prefix if Trilean is no. +func (t Trilean) Prefix(s string) string { + if t == Yes { + return s + } else if t == No { + return "no" + s + } + return "" +} + +// A StyleEntry in the Style map. +type StyleEntry struct { + // Hex colours. + Colour Colour + Background Colour + Border Colour + + Bold Trilean + Italic Trilean + Underline Trilean + NoInherit bool +} + +func (s StyleEntry) String() string { + out := []string{} + if s.Bold != Pass { + out = append(out, s.Bold.Prefix("bold")) + } + if s.Italic != Pass { + out = append(out, s.Italic.Prefix("italic")) + } + if s.Underline != Pass { + out = append(out, s.Underline.Prefix("underline")) + } + if s.NoInherit { + out = append(out, "noinherit") + } + if s.Colour.IsSet() { + out = append(out, s.Colour.String()) + } + if s.Background.IsSet() { + out = append(out, "bg:"+s.Background.String()) + } + if s.Border.IsSet() { + out = append(out, "border:"+s.Border.String()) + } + return strings.Join(out, " ") +} + +// Sub subtracts e from s where elements match. +func (s StyleEntry) Sub(e StyleEntry) StyleEntry { + out := StyleEntry{} + if e.Colour != s.Colour { + out.Colour = s.Colour + } + if e.Background != s.Background { + out.Background = s.Background + } + if e.Bold != s.Bold { + out.Bold = s.Bold + } + if e.Italic != s.Italic { + out.Italic = s.Italic + } + if e.Underline != s.Underline { + out.Underline = s.Underline + } + if e.Border != s.Border { + out.Border = s.Border + } + return out +} + +// Inherit styles from ancestors. +// +// Ancestors should be provided from oldest to newest. +func (s StyleEntry) Inherit(ancestors ...StyleEntry) StyleEntry { + out := s + for i := len(ancestors) - 1; i >= 0; i-- { + if out.NoInherit { + return out + } + ancestor := ancestors[i] + if !out.Colour.IsSet() { + out.Colour = ancestor.Colour + } + if !out.Background.IsSet() { + out.Background = ancestor.Background + } + if !out.Border.IsSet() { + out.Border = ancestor.Border + } + if out.Bold == Pass { + out.Bold = ancestor.Bold + } + if out.Italic == Pass { + out.Italic = ancestor.Italic + } + if out.Underline == Pass { + out.Underline = ancestor.Underline + } + } + return out +} + +func (s StyleEntry) IsZero() bool { + return s.Colour == 0 && s.Background == 0 && s.Border == 0 && s.Bold == Pass && s.Italic == Pass && + s.Underline == Pass && !s.NoInherit +} + +// A StyleBuilder is a mutable structure for building styles. +// +// Once built, a Style is immutable. +type StyleBuilder struct { + entries map[TokenType]string + name string + parent *Style +} + +func NewStyleBuilder(name string) *StyleBuilder { + return &StyleBuilder{name: name, entries: map[TokenType]string{}} +} + +func (s *StyleBuilder) AddAll(entries StyleEntries) *StyleBuilder { + for ttype, entry := range entries { + s.entries[ttype] = entry + } + return s +} + +func (s *StyleBuilder) Get(ttype TokenType) StyleEntry { + // This is less than ideal, but it's the price for having to check errors on each Add(). + entry, _ := ParseStyleEntry(s.entries[ttype]) + return entry.Inherit(s.parent.Get(ttype)) +} + +// Add an entry to the Style map. +// +// See http://pygments.org/docs/styles/#style-rules for details. +func (s *StyleBuilder) Add(ttype TokenType, entry string) *StyleBuilder { // nolint: gocyclo + s.entries[ttype] = entry + return s +} + +func (s *StyleBuilder) AddEntry(ttype TokenType, entry StyleEntry) *StyleBuilder { + s.entries[ttype] = entry.String() + return s +} + +func (s *StyleBuilder) Build() (*Style, error) { + style := &Style{ + Name: s.name, + entries: map[TokenType]StyleEntry{}, + parent: s.parent, + } + for ttype, descriptor := range s.entries { + entry, err := ParseStyleEntry(descriptor) + if err != nil { + return nil, fmt.Errorf("invalid entry for %s: %s", ttype, err) + } + style.entries[ttype] = entry + } + return style, nil +} + +// StyleEntries mapping TokenType to colour definition. +type StyleEntries map[TokenType]string + +// NewStyle creates a new style definition. +func NewStyle(name string, entries StyleEntries) (*Style, error) { + return NewStyleBuilder(name).AddAll(entries).Build() +} + +// MustNewStyle creates a new style or panics. +func MustNewStyle(name string, entries StyleEntries) *Style { + style, err := NewStyle(name, entries) + if err != nil { + panic(err) + } + return style +} + +// A Style definition. +// +// See http://pygments.org/docs/styles/ for details. Semantics are intended to be identical. +type Style struct { + Name string + entries map[TokenType]StyleEntry + parent *Style +} + +// Types that are styled. +func (s *Style) Types() []TokenType { + dedupe := map[TokenType]bool{} + for tt := range s.entries { + dedupe[tt] = true + } + if s.parent != nil { + for _, tt := range s.parent.Types() { + dedupe[tt] = true + } + } + out := make([]TokenType, 0, len(dedupe)) + for tt := range dedupe { + out = append(out, tt) + } + return out +} + +// Builder creates a mutable builder from this Style. +// +// The builder can then be safely modified. This is a cheap operation. +func (s *Style) Builder() *StyleBuilder { + return &StyleBuilder{ + name: s.Name, + entries: map[TokenType]string{}, + parent: s, + } +} + +// Has checks if an exact style entry match exists for a token type. +// +// This is distinct from Get() which will merge parent tokens. +func (s *Style) Has(ttype TokenType) bool { + return !s.get(ttype).IsZero() || s.synthesisable(ttype) +} + +// Get a style entry. Will try sub-category or category if an exact match is not found, and +// finally return the Background. +func (s *Style) Get(ttype TokenType) StyleEntry { + return s.get(ttype).Inherit( + s.get(Background), + s.get(Text), + s.get(ttype.Category()), + s.get(ttype.SubCategory())) +} + +func (s *Style) get(ttype TokenType) StyleEntry { + out := s.entries[ttype] + if out.IsZero() && s.parent != nil { + return s.parent.get(ttype) + } + if out.IsZero() && s.synthesisable(ttype) { + out = s.synthesise(ttype) + } + return out +} + +func (s *Style) synthesise(ttype TokenType) StyleEntry { + bg := s.get(Background) + text := StyleEntry{Colour: bg.Colour} + text.Colour = text.Colour.BrightenOrDarken(0.5) + + switch ttype { + // If we don't have a line highlight colour, make one that is 10% brighter/darker than the background. + case LineHighlight: + return StyleEntry{Background: bg.Background.BrightenOrDarken(0.1)} + + // If we don't have line numbers, use the text colour but 20% brighter/darker + case LineNumbers, LineNumbersTable: + return text + + default: + return StyleEntry{} + } +} + +func (s *Style) synthesisable(ttype TokenType) bool { + return ttype == LineHighlight || ttype == LineNumbers || ttype == LineNumbersTable +} + +// ParseStyleEntry parses a Pygments style entry. +func ParseStyleEntry(entry string) (StyleEntry, error) { // nolint: gocyclo + out := StyleEntry{} + parts := strings.Fields(entry) + for _, part := range parts { + switch { + case part == "italic": + out.Italic = Yes + case part == "noitalic": + out.Italic = No + case part == "bold": + out.Bold = Yes + case part == "nobold": + out.Bold = No + case part == "underline": + out.Underline = Yes + case part == "nounderline": + out.Underline = No + case part == "inherit": + out.NoInherit = false + case part == "noinherit": + out.NoInherit = true + case part == "bg:": + out.Background = 0 + case strings.HasPrefix(part, "bg:#"): + out.Background = ParseColour(part[3:]) + if !out.Background.IsSet() { + return StyleEntry{}, fmt.Errorf("invalid background colour %q", part) + } + case strings.HasPrefix(part, "border:#"): + out.Border = ParseColour(part[7:]) + if !out.Border.IsSet() { + return StyleEntry{}, fmt.Errorf("invalid border colour %q", part) + } + case strings.HasPrefix(part, "#"): + out.Colour = ParseColour(part) + if !out.Colour.IsSet() { + return StyleEntry{}, fmt.Errorf("invalid colour %q", part) + } + default: + return StyleEntry{}, fmt.Errorf("unknown style element %q", part) + } + } + return out, nil +} diff --git a/vendor/github.com/alecthomas/chroma/styles/abap.go b/vendor/github.com/alecthomas/chroma/styles/abap.go new file mode 100644 index 0000000..b6d07fb --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/abap.go @@ -0,0 +1,18 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Abap style. +var Abap = Register(chroma.MustNewStyle("abap", chroma.StyleEntries{ + chroma.Comment: "italic #888", + chroma.CommentSpecial: "#888", + chroma.Keyword: "#00f", + chroma.OperatorWord: "#00f", + chroma.Name: "#000", + chroma.LiteralNumber: "#3af", + chroma.LiteralString: "#5a2", + chroma.Error: "#F00", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/algol.go b/vendor/github.com/alecthomas/chroma/styles/algol.go new file mode 100644 index 0000000..1e8a7b4 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/algol.go @@ -0,0 +1,25 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Algol style. +var Algol = Register(chroma.MustNewStyle("algol", chroma.StyleEntries{ + chroma.Comment: "italic #888", + chroma.CommentPreproc: "bold noitalic #888", + chroma.CommentSpecial: "bold noitalic #888", + chroma.Keyword: "underline bold", + chroma.KeywordDeclaration: "italic", + chroma.NameBuiltin: "bold italic", + chroma.NameBuiltinPseudo: "bold italic", + chroma.NameNamespace: "bold italic #666", + chroma.NameClass: "bold italic #666", + chroma.NameFunction: "bold italic #666", + chroma.NameVariable: "bold italic #666", + chroma.NameConstant: "bold italic #666", + chroma.OperatorWord: "bold", + chroma.LiteralString: "italic #666", + chroma.Error: "border:#FF0000", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/algol_nu.go b/vendor/github.com/alecthomas/chroma/styles/algol_nu.go new file mode 100644 index 0000000..f8c6f17 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/algol_nu.go @@ -0,0 +1,25 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// AlgolNu style. +var AlgolNu = Register(chroma.MustNewStyle("algol_nu", chroma.StyleEntries{ + chroma.Comment: "italic #888", + chroma.CommentPreproc: "bold noitalic #888", + chroma.CommentSpecial: "bold noitalic #888", + chroma.Keyword: "bold", + chroma.KeywordDeclaration: "italic", + chroma.NameBuiltin: "bold italic", + chroma.NameBuiltinPseudo: "bold italic", + chroma.NameNamespace: "bold italic #666", + chroma.NameClass: "bold italic #666", + chroma.NameFunction: "bold italic #666", + chroma.NameVariable: "bold italic #666", + chroma.NameConstant: "bold italic #666", + chroma.OperatorWord: "bold", + chroma.LiteralString: "italic #666", + chroma.Error: "border:#FF0000", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/api.go b/vendor/github.com/alecthomas/chroma/styles/api.go new file mode 100644 index 0000000..f3ce673 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/api.go @@ -0,0 +1,37 @@ +package styles + +import ( + "sort" + + "github.com/alecthomas/chroma" +) + +// Registry of Styles. +var Registry = map[string]*chroma.Style{} + +// Fallback style. Reassign to change the default fallback style. +var Fallback = SwapOff + +// Register a chroma.Style. +func Register(style *chroma.Style) *chroma.Style { + Registry[style.Name] = style + return style +} + +// Names of all available styles. +func Names() []string { + out := []string{} + for name := range Registry { + out = append(out, name) + } + sort.Strings(out) + return out +} + +// Get named style, or Fallback. +func Get(name string) *chroma.Style { + if style, ok := Registry[name]; ok { + return style + } + return Fallback +} diff --git a/vendor/github.com/alecthomas/chroma/styles/arduino.go b/vendor/github.com/alecthomas/chroma/styles/arduino.go new file mode 100644 index 0000000..9e48fb4 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/arduino.go @@ -0,0 +1,25 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Arduino style. +var Arduino = Register(chroma.MustNewStyle("arduino", chroma.StyleEntries{ + chroma.Error: "#a61717", + chroma.Comment: "#95a5a6", + chroma.CommentPreproc: "#728E00", + chroma.Keyword: "#728E00", + chroma.KeywordConstant: "#00979D", + chroma.KeywordPseudo: "#00979D", + chroma.KeywordReserved: "#00979D", + chroma.KeywordType: "#00979D", + chroma.Operator: "#728E00", + chroma.Name: "#434f54", + chroma.NameBuiltin: "#728E00", + chroma.NameFunction: "#D35400", + chroma.NameOther: "#728E00", + chroma.LiteralNumber: "#8A7B52", + chroma.LiteralString: "#7F8C8D", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/autumn.go b/vendor/github.com/alecthomas/chroma/styles/autumn.go new file mode 100644 index 0000000..3966372 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/autumn.go @@ -0,0 +1,43 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Autumn style. +var Autumn = Register(chroma.MustNewStyle("autumn", chroma.StyleEntries{ + chroma.TextWhitespace: "#bbbbbb", + chroma.Comment: "italic #aaaaaa", + chroma.CommentPreproc: "noitalic #4c8317", + chroma.CommentSpecial: "italic #0000aa", + chroma.Keyword: "#0000aa", + chroma.KeywordType: "#00aaaa", + chroma.OperatorWord: "#0000aa", + chroma.NameBuiltin: "#00aaaa", + chroma.NameFunction: "#00aa00", + chroma.NameClass: "underline #00aa00", + chroma.NameNamespace: "underline #00aaaa", + chroma.NameVariable: "#aa0000", + chroma.NameConstant: "#aa0000", + chroma.NameEntity: "bold #800", + chroma.NameAttribute: "#1e90ff", + chroma.NameTag: "bold #1e90ff", + chroma.NameDecorator: "#888888", + chroma.LiteralString: "#aa5500", + chroma.LiteralStringSymbol: "#0000aa", + chroma.LiteralStringRegex: "#009999", + chroma.LiteralNumber: "#009999", + chroma.GenericHeading: "bold #000080", + chroma.GenericSubheading: "bold #800080", + chroma.GenericDeleted: "#aa0000", + chroma.GenericInserted: "#00aa00", + chroma.GenericError: "#aa0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "#555555", + chroma.GenericOutput: "#888888", + chroma.GenericTraceback: "#aa0000", + chroma.GenericUnderline: "underline", + chroma.Error: "#F00 bg:#FAA", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/base16-snazzy.go b/vendor/github.com/alecthomas/chroma/styles/base16-snazzy.go new file mode 100644 index 0000000..160c75b --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/base16-snazzy.go @@ -0,0 +1,81 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Base16Snazzy style +var Base16Snazzy = Register(chroma.MustNewStyle("base16-snazzy", chroma.StyleEntries{ + chroma.Comment: "#78787e", + chroma.CommentHashbang: "#78787e", + chroma.CommentMultiline: "#78787e", + chroma.CommentPreproc: "#78787e", + chroma.CommentSingle: "#78787e", + chroma.CommentSpecial: "#78787e", + chroma.Generic: "#e2e4e5", + chroma.GenericDeleted: "#ff5c57", + chroma.GenericEmph: "#e2e4e5 underline", + chroma.GenericError: "#ff5c57", + chroma.GenericHeading: "#e2e4e5 bold", + chroma.GenericInserted: "#e2e4e5 bold", + chroma.GenericOutput: "#43454f", + chroma.GenericPrompt: "#e2e4e5", + chroma.GenericStrong: "#e2e4e5 italic", + chroma.GenericSubheading: "#e2e4e5 bold", + chroma.GenericTraceback: "#e2e4e5", + chroma.GenericUnderline: "underline", + chroma.Error: "#ff5c57", + chroma.Keyword: "#ff6ac1", + chroma.KeywordConstant: "#ff6ac1", + chroma.KeywordDeclaration: "#ff5c57", + chroma.KeywordNamespace: "#ff6ac1", + chroma.KeywordPseudo: "#ff6ac1", + chroma.KeywordReserved: "#ff6ac1", + chroma.KeywordType: "#9aedfe", + chroma.Literal: "#e2e4e5", + chroma.LiteralDate: "#e2e4e5", + chroma.Name: "#e2e4e5", + chroma.NameAttribute: "#57c7ff", + chroma.NameBuiltin: "#ff5c57", + chroma.NameBuiltinPseudo: "#e2e4e5", + chroma.NameClass: "#f3f99d", + chroma.NameConstant: "#ff9f43", + chroma.NameDecorator: "#ff9f43", + chroma.NameEntity: "#e2e4e5", + chroma.NameException: "#e2e4e5", + chroma.NameFunction: "#57c7ff", + chroma.NameLabel: "#ff5c57", + chroma.NameNamespace: "#e2e4e5", + chroma.NameOther: "#e2e4e5", + chroma.NameTag: "#ff6ac1", + chroma.NameVariable: "#ff5c57", + chroma.NameVariableClass: "#ff5c57", + chroma.NameVariableGlobal: "#ff5c57", + chroma.NameVariableInstance: "#ff5c57", + chroma.LiteralNumber: "#ff9f43", + chroma.LiteralNumberBin: "#ff9f43", + chroma.LiteralNumberFloat: "#ff9f43", + chroma.LiteralNumberHex: "#ff9f43", + chroma.LiteralNumberInteger: "#ff9f43", + chroma.LiteralNumberIntegerLong: "#ff9f43", + chroma.LiteralNumberOct: "#ff9f43", + chroma.Operator: "#ff6ac1", + chroma.OperatorWord: "#ff6ac1", + chroma.Other: "#e2e4e5", + chroma.Punctuation: "#e2e4e5", + chroma.LiteralString: "#5af78e", + chroma.LiteralStringBacktick: "#5af78e", + chroma.LiteralStringChar: "#5af78e", + chroma.LiteralStringDoc: "#5af78e", + chroma.LiteralStringDouble: "#5af78e", + chroma.LiteralStringEscape: "#5af78e", + chroma.LiteralStringHeredoc: "#5af78e", + chroma.LiteralStringInterpol: "#5af78e", + chroma.LiteralStringOther: "#5af78e", + chroma.LiteralStringRegex: "#5af78e", + chroma.LiteralStringSingle: "#5af78e", + chroma.LiteralStringSymbol: "#5af78e", + chroma.Text: "#e2e4e5", + chroma.TextWhitespace: "#e2e4e5", + chroma.Background: " bg:#282a36", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/borland.go b/vendor/github.com/alecthomas/chroma/styles/borland.go new file mode 100644 index 0000000..9c0fff6 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/borland.go @@ -0,0 +1,33 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Borland style. +var Borland = Register(chroma.MustNewStyle("borland", chroma.StyleEntries{ + chroma.TextWhitespace: "#bbbbbb", + chroma.Comment: "italic #008800", + chroma.CommentPreproc: "noitalic #008080", + chroma.CommentSpecial: "noitalic bold", + chroma.LiteralString: "#0000FF", + chroma.LiteralStringChar: "#800080", + chroma.LiteralNumber: "#0000FF", + chroma.Keyword: "bold #000080", + chroma.OperatorWord: "bold", + chroma.NameTag: "bold #000080", + chroma.NameAttribute: "#FF0000", + chroma.GenericHeading: "#999999", + chroma.GenericSubheading: "#aaaaaa", + chroma.GenericDeleted: "bg:#ffdddd #000000", + chroma.GenericInserted: "bg:#ddffdd #000000", + chroma.GenericError: "#aa0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "#555555", + chroma.GenericOutput: "#888888", + chroma.GenericTraceback: "#aa0000", + chroma.GenericUnderline: "underline", + chroma.Error: "bg:#e3d2d2 #a61717", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/bw.go b/vendor/github.com/alecthomas/chroma/styles/bw.go new file mode 100644 index 0000000..3e800d5 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/bw.go @@ -0,0 +1,30 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// BlackWhite style. +var BlackWhite = Register(chroma.MustNewStyle("bw", chroma.StyleEntries{ + chroma.Comment: "italic", + chroma.CommentPreproc: "noitalic", + chroma.Keyword: "bold", + chroma.KeywordPseudo: "nobold", + chroma.KeywordType: "nobold", + chroma.OperatorWord: "bold", + chroma.NameClass: "bold", + chroma.NameNamespace: "bold", + chroma.NameException: "bold", + chroma.NameEntity: "bold", + chroma.NameTag: "bold", + chroma.LiteralString: "italic", + chroma.LiteralStringInterpol: "bold", + chroma.LiteralStringEscape: "bold", + chroma.GenericHeading: "bold", + chroma.GenericSubheading: "bold", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "bold", + chroma.Error: "border:#FF0000", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/colorful.go b/vendor/github.com/alecthomas/chroma/styles/colorful.go new file mode 100644 index 0000000..dc77c5b --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/colorful.go @@ -0,0 +1,59 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Colorful style. +var Colorful = Register(chroma.MustNewStyle("colorful", chroma.StyleEntries{ + chroma.TextWhitespace: "#bbbbbb", + chroma.Comment: "#888", + chroma.CommentPreproc: "#579", + chroma.CommentSpecial: "bold #cc0000", + chroma.Keyword: "bold #080", + chroma.KeywordPseudo: "#038", + chroma.KeywordType: "#339", + chroma.Operator: "#333", + chroma.OperatorWord: "bold #000", + chroma.NameBuiltin: "#007020", + chroma.NameFunction: "bold #06B", + chroma.NameClass: "bold #B06", + chroma.NameNamespace: "bold #0e84b5", + chroma.NameException: "bold #F00", + chroma.NameVariable: "#963", + chroma.NameVariableInstance: "#33B", + chroma.NameVariableClass: "#369", + chroma.NameVariableGlobal: "bold #d70", + chroma.NameConstant: "bold #036", + chroma.NameLabel: "bold #970", + chroma.NameEntity: "bold #800", + chroma.NameAttribute: "#00C", + chroma.NameTag: "#070", + chroma.NameDecorator: "bold #555", + chroma.LiteralString: "bg:#fff0f0", + chroma.LiteralStringChar: "#04D bg:", + chroma.LiteralStringDoc: "#D42 bg:", + chroma.LiteralStringInterpol: "bg:#eee", + chroma.LiteralStringEscape: "bold #666", + chroma.LiteralStringRegex: "bg:#fff0ff #000", + chroma.LiteralStringSymbol: "#A60 bg:", + chroma.LiteralStringOther: "#D20", + chroma.LiteralNumber: "bold #60E", + chroma.LiteralNumberInteger: "bold #00D", + chroma.LiteralNumberFloat: "bold #60E", + chroma.LiteralNumberHex: "bold #058", + chroma.LiteralNumberOct: "bold #40E", + chroma.GenericHeading: "bold #000080", + chroma.GenericSubheading: "bold #800080", + chroma.GenericDeleted: "#A00000", + chroma.GenericInserted: "#00A000", + chroma.GenericError: "#FF0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "bold #c65d09", + chroma.GenericOutput: "#888", + chroma.GenericTraceback: "#04D", + chroma.GenericUnderline: "underline", + chroma.Error: "#F00 bg:#FAA", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/doom-one.go b/vendor/github.com/alecthomas/chroma/styles/doom-one.go new file mode 100644 index 0000000..6450455 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/doom-one.go @@ -0,0 +1,58 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Doom One style. Inspired by Atom One and Doom Emacs's Atom One theme +var DoomOne = Register(chroma.MustNewStyle("doom-one", chroma.StyleEntries{ + chroma.Text: "#b0c4de", + chroma.Error: "#b0c4de", + chroma.Comment: "italic #8a93a5", + chroma.CommentHashbang: "bold", + chroma.Keyword: "#c678dd", + chroma.KeywordType: "#ef8383", + chroma.KeywordConstant: "bold #b756ff", + chroma.Operator: "#c7bf54", + chroma.OperatorWord: "bold #b756ff", + chroma.Punctuation: "#b0c4de", + chroma.Name: "#c1abea", + chroma.NameAttribute: "#b3d23c", + chroma.NameBuiltin: "#ef8383", + chroma.NameClass: "#76a9f9", + chroma.NameConstant: "bold #b756ff", + chroma.NameDecorator: "#e5c07b", + chroma.NameEntity: "#bda26f", + chroma.NameException: "bold #fd7474", + chroma.NameFunction: "#00b1f7", + chroma.NameProperty: "#cebc3a", + chroma.NameLabel: "#f5a40d", + chroma.NameNamespace: "#76a9f9", + chroma.NameTag: "#e06c75", + chroma.NameVariable: "#DCAEEA", + chroma.NameVariableGlobal: "bold #DCAEEA", + chroma.NameVariableInstance: "#e06c75", + chroma.Literal: "#98c379", + chroma.Number: "#d19a66", + chroma.String: "#98c379", + chroma.StringDoc: "#7e97c3", + chroma.StringDouble: "#63c381", + chroma.StringEscape: "bold #d26464", + chroma.StringHeredoc: "#98c379", + chroma.StringInterpol: "#98c379", + chroma.StringOther: "#70b33f", + chroma.StringRegex: "#56b6c2", + chroma.StringSingle: "#98c379", + chroma.StringSymbol: "#56b6c2", + chroma.Generic: "#b0c4de", + chroma.GenericEmph: "italic", + chroma.GenericHeading: "bold #a2cbff", + chroma.GenericInserted: "#a6e22e", + chroma.GenericOutput: "#a6e22e", + chroma.GenericUnderline: "underline", + chroma.GenericPrompt: "#a6e22e", + chroma.GenericStrong: "bold", + chroma.GenericSubheading: "#a2cbff", + chroma.GenericTraceback: "#a2cbff", + chroma.Background: "#b0c4de bg:#282c34", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/doom-one2.go b/vendor/github.com/alecthomas/chroma/styles/doom-one2.go new file mode 100644 index 0000000..4654173 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/doom-one2.go @@ -0,0 +1,71 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Doom One 2 style. Inspired by Atom One and Doom Emacs's Atom One theme +var DoomOne2 = Register(chroma.MustNewStyle("doom-one2", chroma.StyleEntries{ + chroma.Text: "#b0c4de", + chroma.Error: "#b0c4de", + chroma.Comment: "italic #8a93a5", + chroma.CommentHashbang: "bold", + chroma.Keyword: "#76a9f9", + chroma.KeywordConstant: "#e5c07b", + chroma.KeywordType: "#e5c07b", + chroma.Operator: "#54b1c7", + chroma.OperatorWord: "bold #b756ff", + chroma.Punctuation: "#abb2bf", + chroma.Name: "#aa89ea", + chroma.NameAttribute: "#cebc3a", + chroma.NameBuiltin: "#e5c07b", + chroma.NameClass: "#ca72ff", + chroma.NameConstant: "bold", + chroma.NameDecorator: "#e5c07b", + chroma.NameEntity: "#bda26f", + chroma.NameException: "bold #fd7474", + chroma.NameFunction: "#00b1f7", + chroma.NameProperty: "#cebc3a", + chroma.NameLabel: "#f5a40d", + chroma.NameNamespace: "#ca72ff", + chroma.NameTag: "#76a9f9", + chroma.NameVariable: "#DCAEEA", + chroma.NameVariableClass: "#DCAEEA", + chroma.NameVariableGlobal: "bold #DCAEEA", + chroma.NameVariableInstance: "#e06c75", + chroma.NameVariableMagic: "#DCAEEA", + chroma.Literal: "#98c379", + chroma.LiteralDate: "#98c379", + chroma.Number: "#d19a66", + chroma.NumberBin: "#d19a66", + chroma.NumberFloat: "#d19a66", + chroma.NumberHex: "#d19a66", + chroma.NumberInteger: "#d19a66", + chroma.NumberIntegerLong: "#d19a66", + chroma.NumberOct: "#d19a66", + chroma.String: "#98c379", + chroma.StringAffix: "#98c379", + chroma.StringBacktick: "#98c379", + chroma.StringDelimiter: "#98c379", + chroma.StringDoc: "#7e97c3", + chroma.StringDouble: "#63c381", + chroma.StringEscape: "bold #d26464", + chroma.StringHeredoc: "#98c379", + chroma.StringInterpol: "#98c379", + chroma.StringOther: "#70b33f", + chroma.StringRegex: "#56b6c2", + chroma.StringSingle: "#98c379", + chroma.StringSymbol: "#56b6c2", + chroma.Generic: "#b0c4de", + chroma.GenericDeleted: "#b0c4de", + chroma.GenericEmph: "italic", + chroma.GenericHeading: "bold #a2cbff", + chroma.GenericInserted: "#a6e22e", + chroma.GenericOutput: "#a6e22e", + chroma.GenericUnderline: "underline", + chroma.GenericPrompt: "#a6e22e", + chroma.GenericStrong: "bold", + chroma.GenericSubheading: "#a2cbff", + chroma.GenericTraceback: "#a2cbff", + chroma.Background: "#b0c4de bg:#282c34", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/dracula.go b/vendor/github.com/alecthomas/chroma/styles/dracula.go new file mode 100644 index 0000000..d1542f2 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/dracula.go @@ -0,0 +1,81 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Dracula Style +var Dracula = Register(chroma.MustNewStyle("dracula", chroma.StyleEntries{ + chroma.Comment: "#6272a4", + chroma.CommentHashbang: "#6272a4", + chroma.CommentMultiline: "#6272a4", + chroma.CommentPreproc: "#ff79c6", + chroma.CommentSingle: "#6272a4", + chroma.CommentSpecial: "#6272a4", + chroma.Generic: "#f8f8f2", + chroma.GenericDeleted: "#ff5555", + chroma.GenericEmph: "#f8f8f2 underline", + chroma.GenericError: "#f8f8f2", + chroma.GenericHeading: "#f8f8f2 bold", + chroma.GenericInserted: "#50fa7b bold", + chroma.GenericOutput: "#44475a", + chroma.GenericPrompt: "#f8f8f2", + chroma.GenericStrong: "#f8f8f2", + chroma.GenericSubheading: "#f8f8f2 bold", + chroma.GenericTraceback: "#f8f8f2", + chroma.GenericUnderline: "underline", + chroma.Error: "#f8f8f2", + chroma.Keyword: "#ff79c6", + chroma.KeywordConstant: "#ff79c6", + chroma.KeywordDeclaration: "#8be9fd italic", + chroma.KeywordNamespace: "#ff79c6", + chroma.KeywordPseudo: "#ff79c6", + chroma.KeywordReserved: "#ff79c6", + chroma.KeywordType: "#8be9fd", + chroma.Literal: "#f8f8f2", + chroma.LiteralDate: "#f8f8f2", + chroma.Name: "#f8f8f2", + chroma.NameAttribute: "#50fa7b", + chroma.NameBuiltin: "#8be9fd italic", + chroma.NameBuiltinPseudo: "#f8f8f2", + chroma.NameClass: "#50fa7b", + chroma.NameConstant: "#f8f8f2", + chroma.NameDecorator: "#f8f8f2", + chroma.NameEntity: "#f8f8f2", + chroma.NameException: "#f8f8f2", + chroma.NameFunction: "#50fa7b", + chroma.NameLabel: "#8be9fd italic", + chroma.NameNamespace: "#f8f8f2", + chroma.NameOther: "#f8f8f2", + chroma.NameTag: "#ff79c6", + chroma.NameVariable: "#8be9fd italic", + chroma.NameVariableClass: "#8be9fd italic", + chroma.NameVariableGlobal: "#8be9fd italic", + chroma.NameVariableInstance: "#8be9fd italic", + chroma.LiteralNumber: "#bd93f9", + chroma.LiteralNumberBin: "#bd93f9", + chroma.LiteralNumberFloat: "#bd93f9", + chroma.LiteralNumberHex: "#bd93f9", + chroma.LiteralNumberInteger: "#bd93f9", + chroma.LiteralNumberIntegerLong: "#bd93f9", + chroma.LiteralNumberOct: "#bd93f9", + chroma.Operator: "#ff79c6", + chroma.OperatorWord: "#ff79c6", + chroma.Other: "#f8f8f2", + chroma.Punctuation: "#f8f8f2", + chroma.LiteralString: "#f1fa8c", + chroma.LiteralStringBacktick: "#f1fa8c", + chroma.LiteralStringChar: "#f1fa8c", + chroma.LiteralStringDoc: "#f1fa8c", + chroma.LiteralStringDouble: "#f1fa8c", + chroma.LiteralStringEscape: "#f1fa8c", + chroma.LiteralStringHeredoc: "#f1fa8c", + chroma.LiteralStringInterpol: "#f1fa8c", + chroma.LiteralStringOther: "#f1fa8c", + chroma.LiteralStringRegex: "#f1fa8c", + chroma.LiteralStringSingle: "#f1fa8c", + chroma.LiteralStringSymbol: "#f1fa8c", + chroma.Text: "#f8f8f2", + chroma.TextWhitespace: "#f8f8f2", + chroma.Background: " bg:#282a36", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/emacs.go b/vendor/github.com/alecthomas/chroma/styles/emacs.go new file mode 100644 index 0000000..4835abd --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/emacs.go @@ -0,0 +1,51 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Emacs style. +var Emacs = Register(chroma.MustNewStyle("emacs", chroma.StyleEntries{ + chroma.TextWhitespace: "#bbbbbb", + chroma.Comment: "italic #008800", + chroma.CommentPreproc: "noitalic", + chroma.CommentSpecial: "noitalic bold", + chroma.Keyword: "bold #AA22FF", + chroma.KeywordPseudo: "nobold", + chroma.KeywordType: "bold #00BB00", + chroma.Operator: "#666666", + chroma.OperatorWord: "bold #AA22FF", + chroma.NameBuiltin: "#AA22FF", + chroma.NameFunction: "#00A000", + chroma.NameClass: "#0000FF", + chroma.NameNamespace: "bold #0000FF", + chroma.NameException: "bold #D2413A", + chroma.NameVariable: "#B8860B", + chroma.NameConstant: "#880000", + chroma.NameLabel: "#A0A000", + chroma.NameEntity: "bold #999999", + chroma.NameAttribute: "#BB4444", + chroma.NameTag: "bold #008000", + chroma.NameDecorator: "#AA22FF", + chroma.LiteralString: "#BB4444", + chroma.LiteralStringDoc: "italic", + chroma.LiteralStringInterpol: "bold #BB6688", + chroma.LiteralStringEscape: "bold #BB6622", + chroma.LiteralStringRegex: "#BB6688", + chroma.LiteralStringSymbol: "#B8860B", + chroma.LiteralStringOther: "#008000", + chroma.LiteralNumber: "#666666", + chroma.GenericHeading: "bold #000080", + chroma.GenericSubheading: "bold #800080", + chroma.GenericDeleted: "#A00000", + chroma.GenericInserted: "#00A000", + chroma.GenericError: "#FF0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "bold #000080", + chroma.GenericOutput: "#888", + chroma.GenericTraceback: "#04D", + chroma.GenericUnderline: "underline", + chroma.Error: "border:#FF0000", + chroma.Background: " bg:#f8f8f8", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/friendly.go b/vendor/github.com/alecthomas/chroma/styles/friendly.go new file mode 100644 index 0000000..ad02341 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/friendly.go @@ -0,0 +1,51 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Friendly style. +var Friendly = Register(chroma.MustNewStyle("friendly", chroma.StyleEntries{ + chroma.TextWhitespace: "#bbbbbb", + chroma.Comment: "italic #60a0b0", + chroma.CommentPreproc: "noitalic #007020", + chroma.CommentSpecial: "noitalic bg:#fff0f0", + chroma.Keyword: "bold #007020", + chroma.KeywordPseudo: "nobold", + chroma.KeywordType: "nobold #902000", + chroma.Operator: "#666666", + chroma.OperatorWord: "bold #007020", + chroma.NameBuiltin: "#007020", + chroma.NameFunction: "#06287e", + chroma.NameClass: "bold #0e84b5", + chroma.NameNamespace: "bold #0e84b5", + chroma.NameException: "#007020", + chroma.NameVariable: "#bb60d5", + chroma.NameConstant: "#60add5", + chroma.NameLabel: "bold #002070", + chroma.NameEntity: "bold #d55537", + chroma.NameAttribute: "#4070a0", + chroma.NameTag: "bold #062873", + chroma.NameDecorator: "bold #555555", + chroma.LiteralString: "#4070a0", + chroma.LiteralStringDoc: "italic", + chroma.LiteralStringInterpol: "italic #70a0d0", + chroma.LiteralStringEscape: "bold #4070a0", + chroma.LiteralStringRegex: "#235388", + chroma.LiteralStringSymbol: "#517918", + chroma.LiteralStringOther: "#c65d09", + chroma.LiteralNumber: "#40a070", + chroma.GenericHeading: "bold #000080", + chroma.GenericSubheading: "bold #800080", + chroma.GenericDeleted: "#A00000", + chroma.GenericInserted: "#00A000", + chroma.GenericError: "#FF0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "bold #c65d09", + chroma.GenericOutput: "#888", + chroma.GenericTraceback: "#04D", + chroma.GenericUnderline: "underline", + chroma.Error: "border:#FF0000", + chroma.Background: " bg:#f0f0f0", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/fruity.go b/vendor/github.com/alecthomas/chroma/styles/fruity.go new file mode 100644 index 0000000..c2577fa --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/fruity.go @@ -0,0 +1,26 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Fruity style. +var Fruity = Register(chroma.MustNewStyle("fruity", chroma.StyleEntries{ + chroma.TextWhitespace: "#888888", + chroma.Background: "#ffffff bg:#111111", + chroma.GenericOutput: "#444444 bg:#222222", + chroma.Keyword: "#fb660a bold", + chroma.KeywordPseudo: "nobold", + chroma.LiteralNumber: "#0086f7 bold", + chroma.NameTag: "#fb660a bold", + chroma.NameVariable: "#fb660a", + chroma.Comment: "#008800 bg:#0f140f italic", + chroma.NameAttribute: "#ff0086 bold", + chroma.LiteralString: "#0086d2", + chroma.NameFunction: "#ff0086 bold", + chroma.GenericHeading: "#ffffff bold", + chroma.KeywordType: "#cdcaa9 bold", + chroma.GenericSubheading: "#ffffff bold", + chroma.NameConstant: "#0086d2", + chroma.CommentPreproc: "#ff0007 bold", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/github.go b/vendor/github.com/alecthomas/chroma/styles/github.go new file mode 100644 index 0000000..7ef2481 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/github.go @@ -0,0 +1,51 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// GitHub style. +var GitHub = Register(chroma.MustNewStyle("github", chroma.StyleEntries{ + chroma.CommentMultiline: "italic #999988", + chroma.CommentPreproc: "bold #999999", + chroma.CommentSingle: "italic #999988", + chroma.CommentSpecial: "bold italic #999999", + chroma.Comment: "italic #999988", + chroma.Error: "bg:#e3d2d2 #a61717", + chroma.GenericDeleted: "bg:#ffdddd #000000", + chroma.GenericEmph: "italic #000000", + chroma.GenericError: "#aa0000", + chroma.GenericHeading: "#999999", + chroma.GenericInserted: "bg:#ddffdd #000000", + chroma.GenericOutput: "#888888", + chroma.GenericPrompt: "#555555", + chroma.GenericStrong: "bold", + chroma.GenericSubheading: "#aaaaaa", + chroma.GenericTraceback: "#aa0000", + chroma.GenericUnderline: "underline", + chroma.KeywordType: "bold #445588", + chroma.Keyword: "bold #000000", + chroma.LiteralNumber: "#009999", + chroma.LiteralStringRegex: "#009926", + chroma.LiteralStringSymbol: "#990073", + chroma.LiteralString: "#d14", + chroma.NameAttribute: "#008080", + chroma.NameBuiltinPseudo: "#999999", + chroma.NameBuiltin: "#0086B3", + chroma.NameClass: "bold #445588", + chroma.NameConstant: "#008080", + chroma.NameDecorator: "bold #3c5d5d", + chroma.NameEntity: "#800080", + chroma.NameException: "bold #990000", + chroma.NameFunction: "bold #990000", + chroma.NameLabel: "bold #990000", + chroma.NameNamespace: "#555555", + chroma.NameTag: "#000080", + chroma.NameVariableClass: "#008080", + chroma.NameVariableGlobal: "#008080", + chroma.NameVariableInstance: "#008080", + chroma.NameVariable: "#008080", + chroma.Operator: "bold #000000", + chroma.TextWhitespace: "#bbbbbb", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/hr_dark.go b/vendor/github.com/alecthomas/chroma/styles/hr_dark.go new file mode 100644 index 0000000..10bb64f --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/hr_dark.go @@ -0,0 +1,17 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Theme based on HackerRank Dark Editor theme +var HrDark = Register(chroma.MustNewStyle("hrdark", chroma.StyleEntries{ + chroma.Comment: "italic #828b96", + chroma.Keyword: "#ff636f", + chroma.OperatorWord: "#ff636f", + chroma.Name: "#58a1dd", + chroma.Literal: "#a6be9d", + chroma.Operator: "#ff636f", + chroma.Background: "#1d2432", + chroma.Other: "#fff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/hr_high_contrast.go b/vendor/github.com/alecthomas/chroma/styles/hr_high_contrast.go new file mode 100644 index 0000000..d198858 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/hr_high_contrast.go @@ -0,0 +1,19 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Theme based on HackerRank High Contrast Editor Theme +var HrHighContrast = Register(chroma.MustNewStyle("hr_high_contrast", chroma.StyleEntries{ + chroma.Comment: "#5a8349", + chroma.Keyword: "#467faf", + chroma.OperatorWord: "#467faf", + chroma.Name: "#ffffff", + chroma.LiteralString: "#a87662", + chroma.LiteralNumber: "#fff", + chroma.LiteralStringBoolean: "#467faf", + chroma.Operator: "#e4e400", + chroma.Background: "#000", + chroma.Other: "#d5d500", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/igor.go b/vendor/github.com/alecthomas/chroma/styles/igor.go new file mode 100644 index 0000000..6a6d4cd --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/igor.go @@ -0,0 +1,16 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Igor style. +var Igor = Register(chroma.MustNewStyle("igor", chroma.StyleEntries{ + chroma.Comment: "italic #FF0000", + chroma.Keyword: "#0000FF", + chroma.NameFunction: "#C34E00", + chroma.NameDecorator: "#CC00A3", + chroma.NameClass: "#007575", + chroma.LiteralString: "#009C00", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/lovelace.go b/vendor/github.com/alecthomas/chroma/styles/lovelace.go new file mode 100644 index 0000000..074cc08 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/lovelace.go @@ -0,0 +1,60 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Lovelace style. +var Lovelace = Register(chroma.MustNewStyle("lovelace", chroma.StyleEntries{ + chroma.TextWhitespace: "#a89028", + chroma.Comment: "italic #888888", + chroma.CommentHashbang: "#287088", + chroma.CommentMultiline: "#888888", + chroma.CommentPreproc: "noitalic #289870", + chroma.Keyword: "#2838b0", + chroma.KeywordConstant: "italic #444444", + chroma.KeywordDeclaration: "italic", + chroma.KeywordType: "italic", + chroma.Operator: "#666666", + chroma.OperatorWord: "#a848a8", + chroma.Punctuation: "#888888", + chroma.NameAttribute: "#388038", + chroma.NameBuiltin: "#388038", + chroma.NameBuiltinPseudo: "italic", + chroma.NameClass: "#287088", + chroma.NameConstant: "#b85820", + chroma.NameDecorator: "#287088", + chroma.NameEntity: "#709030", + chroma.NameException: "#908828", + chroma.NameFunction: "#785840", + chroma.NameFunctionMagic: "#b85820", + chroma.NameLabel: "#289870", + chroma.NameNamespace: "#289870", + chroma.NameTag: "#2838b0", + chroma.NameVariable: "#b04040", + chroma.NameVariableGlobal: "#908828", + chroma.NameVariableMagic: "#b85820", + chroma.LiteralString: "#b83838", + chroma.LiteralStringAffix: "#444444", + chroma.LiteralStringChar: "#a848a8", + chroma.LiteralStringDelimiter: "#b85820", + chroma.LiteralStringDoc: "italic #b85820", + chroma.LiteralStringEscape: "#709030", + chroma.LiteralStringInterpol: "underline", + chroma.LiteralStringOther: "#a848a8", + chroma.LiteralStringRegex: "#a848a8", + chroma.LiteralNumber: "#444444", + chroma.GenericDeleted: "#c02828", + chroma.GenericEmph: "italic", + chroma.GenericError: "#c02828", + chroma.GenericHeading: "#666666", + chroma.GenericSubheading: "#444444", + chroma.GenericInserted: "#388038", + chroma.GenericOutput: "#666666", + chroma.GenericPrompt: "#444444", + chroma.GenericStrong: "bold", + chroma.GenericTraceback: "#2838b0", + chroma.GenericUnderline: "underline", + chroma.Error: "bg:#a848a8", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/manni.go b/vendor/github.com/alecthomas/chroma/styles/manni.go new file mode 100644 index 0000000..9942e7d --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/manni.go @@ -0,0 +1,51 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Manni style. +var Manni = Register(chroma.MustNewStyle("manni", chroma.StyleEntries{ + chroma.TextWhitespace: "#bbbbbb", + chroma.Comment: "italic #0099FF", + chroma.CommentPreproc: "noitalic #009999", + chroma.CommentSpecial: "bold", + chroma.Keyword: "bold #006699", + chroma.KeywordPseudo: "nobold", + chroma.KeywordType: "#007788", + chroma.Operator: "#555555", + chroma.OperatorWord: "bold #000000", + chroma.NameBuiltin: "#336666", + chroma.NameFunction: "#CC00FF", + chroma.NameClass: "bold #00AA88", + chroma.NameNamespace: "bold #00CCFF", + chroma.NameException: "bold #CC0000", + chroma.NameVariable: "#003333", + chroma.NameConstant: "#336600", + chroma.NameLabel: "#9999FF", + chroma.NameEntity: "bold #999999", + chroma.NameAttribute: "#330099", + chroma.NameTag: "bold #330099", + chroma.NameDecorator: "#9999FF", + chroma.LiteralString: "#CC3300", + chroma.LiteralStringDoc: "italic", + chroma.LiteralStringInterpol: "#AA0000", + chroma.LiteralStringEscape: "bold #CC3300", + chroma.LiteralStringRegex: "#33AAAA", + chroma.LiteralStringSymbol: "#FFCC33", + chroma.LiteralStringOther: "#CC3300", + chroma.LiteralNumber: "#FF6600", + chroma.GenericHeading: "bold #003300", + chroma.GenericSubheading: "bold #003300", + chroma.GenericDeleted: "border:#CC0000 bg:#FFCCCC", + chroma.GenericInserted: "border:#00CC00 bg:#CCFFCC", + chroma.GenericError: "#FF0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "bold #000099", + chroma.GenericOutput: "#AAAAAA", + chroma.GenericTraceback: "#99CC66", + chroma.GenericUnderline: "underline", + chroma.Error: "bg:#FFAAAA #AA0000", + chroma.Background: " bg:#f0f3f3", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/monokai.go b/vendor/github.com/alecthomas/chroma/styles/monokai.go new file mode 100644 index 0000000..2586795 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/monokai.go @@ -0,0 +1,36 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Monokai style. +var Monokai = Register(chroma.MustNewStyle("monokai", chroma.StyleEntries{ + chroma.Text: "#f8f8f2", + chroma.Error: "#960050 bg:#1e0010", + chroma.Comment: "#75715e", + chroma.Keyword: "#66d9ef", + chroma.KeywordNamespace: "#f92672", + chroma.Operator: "#f92672", + chroma.Punctuation: "#f8f8f2", + chroma.Name: "#f8f8f2", + chroma.NameAttribute: "#a6e22e", + chroma.NameClass: "#a6e22e", + chroma.NameConstant: "#66d9ef", + chroma.NameDecorator: "#a6e22e", + chroma.NameException: "#a6e22e", + chroma.NameFunction: "#a6e22e", + chroma.NameOther: "#a6e22e", + chroma.NameTag: "#f92672", + chroma.LiteralNumber: "#ae81ff", + chroma.Literal: "#ae81ff", + chroma.LiteralDate: "#e6db74", + chroma.LiteralString: "#e6db74", + chroma.LiteralStringEscape: "#ae81ff", + chroma.GenericDeleted: "#f92672", + chroma.GenericEmph: "italic", + chroma.GenericInserted: "#a6e22e", + chroma.GenericStrong: "bold", + chroma.GenericSubheading: "#75715e", + chroma.Background: "bg:#272822", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/monokailight.go b/vendor/github.com/alecthomas/chroma/styles/monokailight.go new file mode 100644 index 0000000..61818a6 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/monokailight.go @@ -0,0 +1,33 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// MonokaiLight style. +var MonokaiLight = Register(chroma.MustNewStyle("monokailight", chroma.StyleEntries{ + chroma.Text: "#272822", + chroma.Error: "#960050 bg:#1e0010", + chroma.Comment: "#75715e", + chroma.Keyword: "#00a8c8", + chroma.KeywordNamespace: "#f92672", + chroma.Operator: "#f92672", + chroma.Punctuation: "#111111", + chroma.Name: "#111111", + chroma.NameAttribute: "#75af00", + chroma.NameClass: "#75af00", + chroma.NameConstant: "#00a8c8", + chroma.NameDecorator: "#75af00", + chroma.NameException: "#75af00", + chroma.NameFunction: "#75af00", + chroma.NameOther: "#75af00", + chroma.NameTag: "#f92672", + chroma.LiteralNumber: "#ae81ff", + chroma.Literal: "#ae81ff", + chroma.LiteralDate: "#d88200", + chroma.LiteralString: "#d88200", + chroma.LiteralStringEscape: "#8045FF", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.Background: " bg:#fafafa", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/murphy.go b/vendor/github.com/alecthomas/chroma/styles/murphy.go new file mode 100644 index 0000000..90e83c7 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/murphy.go @@ -0,0 +1,59 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Murphy style. +var Murphy = Register(chroma.MustNewStyle("murphy", chroma.StyleEntries{ + chroma.TextWhitespace: "#bbbbbb", + chroma.Comment: "#666 italic", + chroma.CommentPreproc: "#579 noitalic", + chroma.CommentSpecial: "#c00 bold", + chroma.Keyword: "bold #289", + chroma.KeywordPseudo: "#08f", + chroma.KeywordType: "#66f", + chroma.Operator: "#333", + chroma.OperatorWord: "bold #000", + chroma.NameBuiltin: "#072", + chroma.NameFunction: "bold #5ed", + chroma.NameClass: "bold #e9e", + chroma.NameNamespace: "bold #0e84b5", + chroma.NameException: "bold #F00", + chroma.NameVariable: "#036", + chroma.NameVariableInstance: "#aaf", + chroma.NameVariableClass: "#ccf", + chroma.NameVariableGlobal: "#f84", + chroma.NameConstant: "bold #5ed", + chroma.NameLabel: "bold #970", + chroma.NameEntity: "#800", + chroma.NameAttribute: "#007", + chroma.NameTag: "#070", + chroma.NameDecorator: "bold #555", + chroma.LiteralString: "bg:#e0e0ff", + chroma.LiteralStringChar: "#88F bg:", + chroma.LiteralStringDoc: "#D42 bg:", + chroma.LiteralStringInterpol: "bg:#eee", + chroma.LiteralStringEscape: "bold #666", + chroma.LiteralStringRegex: "bg:#e0e0ff #000", + chroma.LiteralStringSymbol: "#fc8 bg:", + chroma.LiteralStringOther: "#f88", + chroma.LiteralNumber: "bold #60E", + chroma.LiteralNumberInteger: "bold #66f", + chroma.LiteralNumberFloat: "bold #60E", + chroma.LiteralNumberHex: "bold #058", + chroma.LiteralNumberOct: "bold #40E", + chroma.GenericHeading: "bold #000080", + chroma.GenericSubheading: "bold #800080", + chroma.GenericDeleted: "#A00000", + chroma.GenericInserted: "#00A000", + chroma.GenericError: "#FF0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "bold #c65d09", + chroma.GenericOutput: "#888", + chroma.GenericTraceback: "#04D", + chroma.GenericUnderline: "underline", + chroma.Error: "#F00 bg:#FAA", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/native.go b/vendor/github.com/alecthomas/chroma/styles/native.go new file mode 100644 index 0000000..9fae09a --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/native.go @@ -0,0 +1,42 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Native style. +var Native = Register(chroma.MustNewStyle("native", chroma.StyleEntries{ + chroma.Background: "#d0d0d0 bg:#202020", + chroma.TextWhitespace: "#666666", + chroma.Comment: "italic #999999", + chroma.CommentPreproc: "noitalic bold #cd2828", + chroma.CommentSpecial: "noitalic bold #e50808 bg:#520000", + chroma.Keyword: "bold #6ab825", + chroma.KeywordPseudo: "nobold", + chroma.OperatorWord: "bold #6ab825", + chroma.LiteralString: "#ed9d13", + chroma.LiteralStringOther: "#ffa500", + chroma.LiteralNumber: "#3677a9", + chroma.NameBuiltin: "#24909d", + chroma.NameVariable: "#40ffff", + chroma.NameConstant: "#40ffff", + chroma.NameClass: "underline #447fcf", + chroma.NameFunction: "#447fcf", + chroma.NameNamespace: "underline #447fcf", + chroma.NameException: "#bbbbbb", + chroma.NameTag: "bold #6ab825", + chroma.NameAttribute: "#bbbbbb", + chroma.NameDecorator: "#ffa500", + chroma.GenericHeading: "bold #ffffff", + chroma.GenericSubheading: "underline #ffffff", + chroma.GenericDeleted: "#d22323", + chroma.GenericInserted: "#589819", + chroma.GenericError: "#d22323", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "#aaaaaa", + chroma.GenericOutput: "#cccccc", + chroma.GenericTraceback: "#d22323", + chroma.GenericUnderline: "underline", + chroma.Error: "bg:#e3d2d2 #a61717", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/nord.go b/vendor/github.com/alecthomas/chroma/styles/nord.go new file mode 100644 index 0000000..0fcbc5d --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/nord.go @@ -0,0 +1,75 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +var ( + // colors and palettes based on https://www.nordtheme.com/docs/colors-and-palettes + nord0 = "#2e3440" + nord1 = "#3b4252" // nolint + nord2 = "#434c5e" // nolint + nord3 = "#4c566a" + nord3b = "#616e87" + + nord4 = "#d8dee9" + nord5 = "#e5e9f0" // nolint + nord6 = "#eceff4" + + nord7 = "#8fbcbb" + nord8 = "#88c0d0" + nord9 = "#81a1c1" + nord10 = "#5e81ac" + + nord11 = "#bf616a" + nord12 = "#d08770" + nord13 = "#ebcb8b" + nord14 = "#a3be8c" + nord15 = "#b48ead" +) + +// Nord, an arctic, north-bluish color palette +var Nord = Register(chroma.MustNewStyle("nord", chroma.StyleEntries{ + chroma.TextWhitespace: nord4, + chroma.Comment: "italic " + nord3b, + chroma.CommentPreproc: nord10, + chroma.Keyword: "bold " + nord9, + chroma.KeywordPseudo: "nobold " + nord9, + chroma.KeywordType: "nobold " + nord9, + chroma.Operator: nord9, + chroma.OperatorWord: "bold " + nord9, + chroma.Name: nord4, + chroma.NameBuiltin: nord9, + chroma.NameFunction: nord8, + chroma.NameClass: nord7, + chroma.NameNamespace: nord7, + chroma.NameException: nord11, + chroma.NameVariable: nord4, + chroma.NameConstant: nord7, + chroma.NameLabel: nord7, + chroma.NameEntity: nord12, + chroma.NameAttribute: nord7, + chroma.NameTag: nord9, + chroma.NameDecorator: nord12, + chroma.Punctuation: nord6, + chroma.LiteralString: nord14, + chroma.LiteralStringDoc: nord3b, + chroma.LiteralStringInterpol: nord14, + chroma.LiteralStringEscape: nord13, + chroma.LiteralStringRegex: nord13, + chroma.LiteralStringSymbol: nord14, + chroma.LiteralStringOther: nord14, + chroma.LiteralNumber: nord15, + chroma.GenericHeading: "bold " + nord8, + chroma.GenericSubheading: "bold " + nord8, + chroma.GenericDeleted: nord11, + chroma.GenericInserted: nord14, + chroma.GenericError: nord11, + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "bold " + nord3, + chroma.GenericOutput: nord4, + chroma.GenericTraceback: nord11, + chroma.Error: nord11, + chroma.Background: nord4 + " bg:" + nord0, +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/onesenterprise.go b/vendor/github.com/alecthomas/chroma/styles/onesenterprise.go new file mode 100644 index 0000000..9048e38 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/onesenterprise.go @@ -0,0 +1,17 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// 1S:Designer color palette +var OnesEnterprise = Register(chroma.MustNewStyle("onesenterprise", chroma.StyleEntries{ + chroma.Text: "#000000", + chroma.Comment: "#008000", + chroma.CommentPreproc: "#963200", + chroma.Operator: "#FF0000", + chroma.Keyword: "#FF0000", + chroma.Punctuation: "#FF0000", + chroma.LiteralString: "#000000", + chroma.Name: "#0000FF", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/paraiso-dark.go b/vendor/github.com/alecthomas/chroma/styles/paraiso-dark.go new file mode 100644 index 0000000..c8cf473 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/paraiso-dark.go @@ -0,0 +1,44 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// ParaisoDark style. +var ParaisoDark = Register(chroma.MustNewStyle("paraiso-dark", chroma.StyleEntries{ + chroma.Text: "#e7e9db", + chroma.Error: "#ef6155", + chroma.Comment: "#776e71", + chroma.Keyword: "#815ba4", + chroma.KeywordNamespace: "#5bc4bf", + chroma.KeywordType: "#fec418", + chroma.Operator: "#5bc4bf", + chroma.Punctuation: "#e7e9db", + chroma.Name: "#e7e9db", + chroma.NameAttribute: "#06b6ef", + chroma.NameClass: "#fec418", + chroma.NameConstant: "#ef6155", + chroma.NameDecorator: "#5bc4bf", + chroma.NameException: "#ef6155", + chroma.NameFunction: "#06b6ef", + chroma.NameNamespace: "#fec418", + chroma.NameOther: "#06b6ef", + chroma.NameTag: "#5bc4bf", + chroma.NameVariable: "#ef6155", + chroma.LiteralNumber: "#f99b15", + chroma.Literal: "#f99b15", + chroma.LiteralDate: "#48b685", + chroma.LiteralString: "#48b685", + chroma.LiteralStringChar: "#e7e9db", + chroma.LiteralStringDoc: "#776e71", + chroma.LiteralStringEscape: "#f99b15", + chroma.LiteralStringInterpol: "#f99b15", + chroma.GenericDeleted: "#ef6155", + chroma.GenericEmph: "italic", + chroma.GenericHeading: "bold #e7e9db", + chroma.GenericInserted: "#48b685", + chroma.GenericPrompt: "bold #776e71", + chroma.GenericStrong: "bold", + chroma.GenericSubheading: "bold #5bc4bf", + chroma.Background: "bg:#2f1e2e", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/paraiso-light.go b/vendor/github.com/alecthomas/chroma/styles/paraiso-light.go new file mode 100644 index 0000000..b514dfa --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/paraiso-light.go @@ -0,0 +1,44 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// ParaisoLight style. +var ParaisoLight = Register(chroma.MustNewStyle("paraiso-light", chroma.StyleEntries{ + chroma.Text: "#2f1e2e", + chroma.Error: "#ef6155", + chroma.Comment: "#8d8687", + chroma.Keyword: "#815ba4", + chroma.KeywordNamespace: "#5bc4bf", + chroma.KeywordType: "#fec418", + chroma.Operator: "#5bc4bf", + chroma.Punctuation: "#2f1e2e", + chroma.Name: "#2f1e2e", + chroma.NameAttribute: "#06b6ef", + chroma.NameClass: "#fec418", + chroma.NameConstant: "#ef6155", + chroma.NameDecorator: "#5bc4bf", + chroma.NameException: "#ef6155", + chroma.NameFunction: "#06b6ef", + chroma.NameNamespace: "#fec418", + chroma.NameOther: "#06b6ef", + chroma.NameTag: "#5bc4bf", + chroma.NameVariable: "#ef6155", + chroma.LiteralNumber: "#f99b15", + chroma.Literal: "#f99b15", + chroma.LiteralDate: "#48b685", + chroma.LiteralString: "#48b685", + chroma.LiteralStringChar: "#2f1e2e", + chroma.LiteralStringDoc: "#8d8687", + chroma.LiteralStringEscape: "#f99b15", + chroma.LiteralStringInterpol: "#f99b15", + chroma.GenericDeleted: "#ef6155", + chroma.GenericEmph: "italic", + chroma.GenericHeading: "bold #2f1e2e", + chroma.GenericInserted: "#48b685", + chroma.GenericPrompt: "bold #8d8687", + chroma.GenericStrong: "bold", + chroma.GenericSubheading: "bold #5bc4bf", + chroma.Background: "bg:#e7e9db", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/pastie.go b/vendor/github.com/alecthomas/chroma/styles/pastie.go new file mode 100644 index 0000000..9a68544 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/pastie.go @@ -0,0 +1,52 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Pastie style. +var Pastie = Register(chroma.MustNewStyle("pastie", chroma.StyleEntries{ + chroma.TextWhitespace: "#bbbbbb", + chroma.Comment: "#888888", + chroma.CommentPreproc: "bold #cc0000", + chroma.CommentSpecial: "bg:#fff0f0 bold #cc0000", + chroma.LiteralString: "bg:#fff0f0 #dd2200", + chroma.LiteralStringRegex: "bg:#fff0ff #008800", + chroma.LiteralStringOther: "bg:#f0fff0 #22bb22", + chroma.LiteralStringSymbol: "#aa6600", + chroma.LiteralStringInterpol: "#3333bb", + chroma.LiteralStringEscape: "#0044dd", + chroma.OperatorWord: "#008800", + chroma.Keyword: "bold #008800", + chroma.KeywordPseudo: "nobold", + chroma.KeywordType: "#888888", + chroma.NameClass: "bold #bb0066", + chroma.NameException: "bold #bb0066", + chroma.NameFunction: "bold #0066bb", + chroma.NameProperty: "bold #336699", + chroma.NameNamespace: "bold #bb0066", + chroma.NameBuiltin: "#003388", + chroma.NameVariable: "#336699", + chroma.NameVariableClass: "#336699", + chroma.NameVariableInstance: "#3333bb", + chroma.NameVariableGlobal: "#dd7700", + chroma.NameConstant: "bold #003366", + chroma.NameTag: "bold #bb0066", + chroma.NameAttribute: "#336699", + chroma.NameDecorator: "#555555", + chroma.NameLabel: "italic #336699", + chroma.LiteralNumber: "bold #0000DD", + chroma.GenericHeading: "#333", + chroma.GenericSubheading: "#666", + chroma.GenericDeleted: "bg:#ffdddd #000000", + chroma.GenericInserted: "bg:#ddffdd #000000", + chroma.GenericError: "#aa0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "#555555", + chroma.GenericOutput: "#888888", + chroma.GenericTraceback: "#aa0000", + chroma.GenericUnderline: "underline", + chroma.Error: "bg:#e3d2d2 #a61717", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/perldoc.go b/vendor/github.com/alecthomas/chroma/styles/perldoc.go new file mode 100644 index 0000000..e1372fd --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/perldoc.go @@ -0,0 +1,44 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Perldoc style. +var Perldoc = Register(chroma.MustNewStyle("perldoc", chroma.StyleEntries{ + chroma.TextWhitespace: "#bbbbbb", + chroma.Comment: "#228B22", + chroma.CommentPreproc: "#1e889b", + chroma.CommentSpecial: "#8B008B bold", + chroma.LiteralString: "#CD5555", + chroma.LiteralStringHeredoc: "#1c7e71 italic", + chroma.LiteralStringRegex: "#1c7e71", + chroma.LiteralStringOther: "#cb6c20", + chroma.LiteralNumber: "#B452CD", + chroma.OperatorWord: "#8B008B", + chroma.Keyword: "#8B008B bold", + chroma.KeywordType: "#00688B", + chroma.NameClass: "#008b45 bold", + chroma.NameException: "#008b45 bold", + chroma.NameFunction: "#008b45", + chroma.NameNamespace: "#008b45 underline", + chroma.NameVariable: "#00688B", + chroma.NameConstant: "#00688B", + chroma.NameDecorator: "#707a7c", + chroma.NameTag: "#8B008B bold", + chroma.NameAttribute: "#658b00", + chroma.NameBuiltin: "#658b00", + chroma.GenericHeading: "bold #000080", + chroma.GenericSubheading: "bold #800080", + chroma.GenericDeleted: "#aa0000", + chroma.GenericInserted: "#00aa00", + chroma.GenericError: "#aa0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "#555555", + chroma.GenericOutput: "#888888", + chroma.GenericTraceback: "#aa0000", + chroma.GenericUnderline: "underline", + chroma.Error: "bg:#e3d2d2 #a61717", + chroma.Background: " bg:#eeeedd", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/pygments.go b/vendor/github.com/alecthomas/chroma/styles/pygments.go new file mode 100644 index 0000000..327033b --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/pygments.go @@ -0,0 +1,55 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Pygments default theme. +var Pygments = Register(chroma.MustNewStyle("pygments", chroma.StyleEntries{ + chroma.Whitespace: "#bbbbbb", + chroma.Comment: "italic #408080", + chroma.CommentPreproc: "noitalic #BC7A00", + + chroma.Keyword: "bold #008000", + chroma.KeywordPseudo: "nobold", + chroma.KeywordType: "nobold #B00040", + + chroma.Operator: "#666666", + chroma.OperatorWord: "bold #AA22FF", + + chroma.NameBuiltin: "#008000", + chroma.NameFunction: "#0000FF", + chroma.NameClass: "bold #0000FF", + chroma.NameNamespace: "bold #0000FF", + chroma.NameException: "bold #D2413A", + chroma.NameVariable: "#19177C", + chroma.NameConstant: "#880000", + chroma.NameLabel: "#A0A000", + chroma.NameEntity: "bold #999999", + chroma.NameAttribute: "#7D9029", + chroma.NameTag: "bold #008000", + chroma.NameDecorator: "#AA22FF", + + chroma.String: "#BA2121", + chroma.StringDoc: "italic", + chroma.StringInterpol: "bold #BB6688", + chroma.StringEscape: "bold #BB6622", + chroma.StringRegex: "#BB6688", + chroma.StringSymbol: "#19177C", + chroma.StringOther: "#008000", + chroma.Number: "#666666", + + chroma.GenericHeading: "bold #000080", + chroma.GenericSubheading: "bold #800080", + chroma.GenericDeleted: "#A00000", + chroma.GenericInserted: "#00A000", + chroma.GenericError: "#FF0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "bold #000080", + chroma.GenericOutput: "#888", + chroma.GenericTraceback: "#04D", + chroma.GenericUnderline: "underline", + + chroma.Error: "border:#FF0000", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/rainbow_dash.go b/vendor/github.com/alecthomas/chroma/styles/rainbow_dash.go new file mode 100644 index 0000000..37d66ca --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/rainbow_dash.go @@ -0,0 +1,47 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// RainbowDash style. +var RainbowDash = Register(chroma.MustNewStyle("rainbow_dash", chroma.StyleEntries{ + chroma.Comment: "italic #0080ff", + chroma.CommentPreproc: "noitalic", + chroma.CommentSpecial: "bold", + chroma.Error: "bg:#cc0000 #ffffff", + chroma.GenericDeleted: "border:#c5060b bg:#ffcccc", + chroma.GenericEmph: "italic", + chroma.GenericError: "#ff0000", + chroma.GenericHeading: "bold #2c5dcd", + chroma.GenericInserted: "border:#00cc00 bg:#ccffcc", + chroma.GenericOutput: "#aaaaaa", + chroma.GenericPrompt: "bold #2c5dcd", + chroma.GenericStrong: "bold", + chroma.GenericSubheading: "bold #2c5dcd", + chroma.GenericTraceback: "#c5060b", + chroma.GenericUnderline: "underline", + chroma.Keyword: "bold #2c5dcd", + chroma.KeywordPseudo: "nobold", + chroma.KeywordType: "#5918bb", + chroma.NameAttribute: "italic #2c5dcd", + chroma.NameBuiltin: "bold #5918bb", + chroma.NameClass: "underline", + chroma.NameConstant: "#318495", + chroma.NameDecorator: "bold #ff8000", + chroma.NameEntity: "bold #5918bb", + chroma.NameException: "bold #5918bb", + chroma.NameFunction: "bold #ff8000", + chroma.NameTag: "bold #2c5dcd", + chroma.LiteralNumber: "bold #5918bb", + chroma.Operator: "#2c5dcd", + chroma.OperatorWord: "bold", + chroma.LiteralString: "#00cc66", + chroma.LiteralStringDoc: "italic", + chroma.LiteralStringEscape: "bold #c5060b", + chroma.LiteralStringOther: "#318495", + chroma.LiteralStringSymbol: "bold #c5060b", + chroma.Text: "#4d4d4d", + chroma.TextWhitespace: "#cbcbcb", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/rrt.go b/vendor/github.com/alecthomas/chroma/styles/rrt.go new file mode 100644 index 0000000..2ccf2ca --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/rrt.go @@ -0,0 +1,20 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Rrt style. +var Rrt = Register(chroma.MustNewStyle("rrt", chroma.StyleEntries{ + chroma.CommentPreproc: "#e5e5e5", + chroma.Comment: "#00ff00", + chroma.KeywordType: "#ee82ee", + chroma.Keyword: "#ff0000", + chroma.LiteralNumber: "#ff6600", + chroma.LiteralStringSymbol: "#ff6600", + chroma.LiteralString: "#87ceeb", + chroma.NameFunction: "#ffff00", + chroma.NameConstant: "#7fffd4", + chroma.NameVariable: "#eedd82", + chroma.Background: "#f8f8f2 bg:#000000", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/solarized-dark.go b/vendor/github.com/alecthomas/chroma/styles/solarized-dark.go new file mode 100644 index 0000000..2724df2 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/solarized-dark.go @@ -0,0 +1,46 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// SolarizedDark style. +var SolarizedDark = Register(chroma.MustNewStyle("solarized-dark", chroma.StyleEntries{ + chroma.Keyword: "#719e07", + chroma.KeywordConstant: "#CB4B16", + chroma.KeywordDeclaration: "#268BD2", + chroma.KeywordReserved: "#268BD2", + chroma.KeywordType: "#DC322F", + chroma.NameAttribute: "#93A1A1", + chroma.NameBuiltin: "#B58900", + chroma.NameBuiltinPseudo: "#268BD2", + chroma.NameClass: "#268BD2", + chroma.NameConstant: "#CB4B16", + chroma.NameDecorator: "#268BD2", + chroma.NameEntity: "#CB4B16", + chroma.NameException: "#CB4B16", + chroma.NameFunction: "#268BD2", + chroma.NameTag: "#268BD2", + chroma.NameVariable: "#268BD2", + chroma.LiteralString: "#2AA198", + chroma.LiteralStringBacktick: "#586E75", + chroma.LiteralStringChar: "#2AA198", + chroma.LiteralStringDoc: "#93A1A1", + chroma.LiteralStringEscape: "#CB4B16", + chroma.LiteralStringHeredoc: "#93A1A1", + chroma.LiteralStringRegex: "#DC322F", + chroma.LiteralNumber: "#2AA198", + chroma.Operator: "#719e07", + chroma.Comment: "#586E75", + chroma.CommentPreproc: "#719e07", + chroma.CommentSpecial: "#719e07", + chroma.GenericDeleted: "#DC322F", + chroma.GenericEmph: "italic", + chroma.GenericError: "#DC322F bold", + chroma.GenericHeading: "#CB4B16", + chroma.GenericInserted: "#719e07", + chroma.GenericStrong: "bold", + chroma.GenericSubheading: "#268BD2", + chroma.Background: "#93A1A1 bg:#002B36", + chroma.Other: "#CB4B16", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/solarized-dark256.go b/vendor/github.com/alecthomas/chroma/styles/solarized-dark256.go new file mode 100644 index 0000000..a24ddc1 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/solarized-dark256.go @@ -0,0 +1,48 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// SolarizedDark256 style. +var SolarizedDark256 = Register(chroma.MustNewStyle("solarized-dark256", chroma.StyleEntries{ + chroma.Keyword: "#5f8700", + chroma.KeywordConstant: "#d75f00", + chroma.KeywordDeclaration: "#0087ff", + chroma.KeywordNamespace: "#d75f00", + chroma.KeywordReserved: "#0087ff", + chroma.KeywordType: "#af0000", + chroma.NameAttribute: "#8a8a8a", + chroma.NameBuiltin: "#0087ff", + chroma.NameBuiltinPseudo: "#0087ff", + chroma.NameClass: "#0087ff", + chroma.NameConstant: "#d75f00", + chroma.NameDecorator: "#0087ff", + chroma.NameEntity: "#d75f00", + chroma.NameException: "#af8700", + chroma.NameFunction: "#0087ff", + chroma.NameTag: "#0087ff", + chroma.NameVariable: "#0087ff", + chroma.LiteralString: "#00afaf", + chroma.LiteralStringBacktick: "#4e4e4e", + chroma.LiteralStringChar: "#00afaf", + chroma.LiteralStringDoc: "#00afaf", + chroma.LiteralStringEscape: "#af0000", + chroma.LiteralStringHeredoc: "#00afaf", + chroma.LiteralStringRegex: "#af0000", + chroma.LiteralNumber: "#00afaf", + chroma.Operator: "#8a8a8a", + chroma.OperatorWord: "#5f8700", + chroma.Comment: "#4e4e4e", + chroma.CommentPreproc: "#5f8700", + chroma.CommentSpecial: "#5f8700", + chroma.GenericDeleted: "#af0000", + chroma.GenericEmph: "italic", + chroma.GenericError: "#af0000 bold", + chroma.GenericHeading: "#d75f00", + chroma.GenericInserted: "#5f8700", + chroma.GenericStrong: "bold", + chroma.GenericSubheading: "#0087ff", + chroma.Background: "#8a8a8a bg:#1c1c1c", + chroma.Other: "#d75f00", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/solarized-light.go b/vendor/github.com/alecthomas/chroma/styles/solarized-light.go new file mode 100644 index 0000000..b6d5234 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/solarized-light.go @@ -0,0 +1,24 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// SolarizedLight style. +var SolarizedLight = Register(chroma.MustNewStyle("solarized-light", chroma.StyleEntries{ + chroma.Text: "bg: #eee8d5 #586e75", + chroma.Keyword: "#859900", + chroma.KeywordConstant: "bold", + chroma.KeywordNamespace: "#dc322f bold", + chroma.KeywordType: "bold", + chroma.Name: "#268bd2", + chroma.NameBuiltin: "#cb4b16", + chroma.NameClass: "#cb4b16", + chroma.NameTag: "bold", + chroma.Literal: "#2aa198", + chroma.LiteralNumber: "bold", + chroma.OperatorWord: "#859900", + chroma.Comment: "#93a1a1 italic", + chroma.Generic: "#d33682", + chroma.Background: " bg:#eee8d5", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/swapoff.go b/vendor/github.com/alecthomas/chroma/styles/swapoff.go new file mode 100644 index 0000000..e4daae6 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/swapoff.go @@ -0,0 +1,25 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// SwapOff theme. +var SwapOff = Register(chroma.MustNewStyle("swapoff", chroma.StyleEntries{ + chroma.Background: "#lightgray bg:#black", + chroma.Number: "bold #ansiyellow", + chroma.Comment: "#ansiteal", + chroma.CommentPreproc: "bold #ansigreen", + chroma.String: "bold #ansiturquoise", + chroma.Keyword: "bold #ansiwhite", + chroma.NameKeyword: "bold #ansiwhite", + chroma.NameBuiltin: "bold #ansiwhite", + chroma.GenericHeading: "bold", + chroma.GenericSubheading: "bold", + chroma.GenericStrong: "bold", + chroma.GenericUnderline: "underline", + chroma.NameTag: "bold", + chroma.NameAttribute: "#ansiteal", + chroma.Error: "#ansired", + chroma.LiteralDate: "bold #ansiyellow", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/tango.go b/vendor/github.com/alecthomas/chroma/styles/tango.go new file mode 100644 index 0000000..ae1afe0 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/tango.go @@ -0,0 +1,79 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Tango style. +var Tango = Register(chroma.MustNewStyle("tango", chroma.StyleEntries{ + chroma.TextWhitespace: "underline #f8f8f8", + chroma.Error: "#a40000 border:#ef2929", + chroma.Other: "#000000", + chroma.Comment: "italic #8f5902", + chroma.CommentMultiline: "italic #8f5902", + chroma.CommentPreproc: "italic #8f5902", + chroma.CommentSingle: "italic #8f5902", + chroma.CommentSpecial: "italic #8f5902", + chroma.Keyword: "bold #204a87", + chroma.KeywordConstant: "bold #204a87", + chroma.KeywordDeclaration: "bold #204a87", + chroma.KeywordNamespace: "bold #204a87", + chroma.KeywordPseudo: "bold #204a87", + chroma.KeywordReserved: "bold #204a87", + chroma.KeywordType: "bold #204a87", + chroma.Operator: "bold #ce5c00", + chroma.OperatorWord: "bold #204a87", + chroma.Punctuation: "bold #000000", + chroma.Name: "#000000", + chroma.NameAttribute: "#c4a000", + chroma.NameBuiltin: "#204a87", + chroma.NameBuiltinPseudo: "#3465a4", + chroma.NameClass: "#000000", + chroma.NameConstant: "#000000", + chroma.NameDecorator: "bold #5c35cc", + chroma.NameEntity: "#ce5c00", + chroma.NameException: "bold #cc0000", + chroma.NameFunction: "#000000", + chroma.NameProperty: "#000000", + chroma.NameLabel: "#f57900", + chroma.NameNamespace: "#000000", + chroma.NameOther: "#000000", + chroma.NameTag: "bold #204a87", + chroma.NameVariable: "#000000", + chroma.NameVariableClass: "#000000", + chroma.NameVariableGlobal: "#000000", + chroma.NameVariableInstance: "#000000", + chroma.LiteralNumber: "bold #0000cf", + chroma.LiteralNumberFloat: "bold #0000cf", + chroma.LiteralNumberHex: "bold #0000cf", + chroma.LiteralNumberInteger: "bold #0000cf", + chroma.LiteralNumberIntegerLong: "bold #0000cf", + chroma.LiteralNumberOct: "bold #0000cf", + chroma.Literal: "#000000", + chroma.LiteralDate: "#000000", + chroma.LiteralString: "#4e9a06", + chroma.LiteralStringBacktick: "#4e9a06", + chroma.LiteralStringChar: "#4e9a06", + chroma.LiteralStringDoc: "italic #8f5902", + chroma.LiteralStringDouble: "#4e9a06", + chroma.LiteralStringEscape: "#4e9a06", + chroma.LiteralStringHeredoc: "#4e9a06", + chroma.LiteralStringInterpol: "#4e9a06", + chroma.LiteralStringOther: "#4e9a06", + chroma.LiteralStringRegex: "#4e9a06", + chroma.LiteralStringSingle: "#4e9a06", + chroma.LiteralStringSymbol: "#4e9a06", + chroma.Generic: "#000000", + chroma.GenericDeleted: "#a40000", + chroma.GenericEmph: "italic #000000", + chroma.GenericError: "#ef2929", + chroma.GenericHeading: "bold #000080", + chroma.GenericInserted: "#00A000", + chroma.GenericOutput: "italic #000000", + chroma.GenericPrompt: "#8f5902", + chroma.GenericStrong: "bold #000000", + chroma.GenericSubheading: "bold #800080", + chroma.GenericTraceback: "bold #a40000", + chroma.GenericUnderline: "underline", + chroma.Background: " bg:#f8f8f8", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/trac.go b/vendor/github.com/alecthomas/chroma/styles/trac.go new file mode 100644 index 0000000..3b09c44 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/trac.go @@ -0,0 +1,42 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Trac style. +var Trac = Register(chroma.MustNewStyle("trac", chroma.StyleEntries{ + chroma.TextWhitespace: "#bbbbbb", + chroma.Comment: "italic #999988", + chroma.CommentPreproc: "bold noitalic #999999", + chroma.CommentSpecial: "bold #999999", + chroma.Operator: "bold", + chroma.LiteralString: "#bb8844", + chroma.LiteralStringRegex: "#808000", + chroma.LiteralNumber: "#009999", + chroma.Keyword: "bold", + chroma.KeywordType: "#445588", + chroma.NameBuiltin: "#999999", + chroma.NameFunction: "bold #990000", + chroma.NameClass: "bold #445588", + chroma.NameException: "bold #990000", + chroma.NameNamespace: "#555555", + chroma.NameVariable: "#008080", + chroma.NameConstant: "#008080", + chroma.NameTag: "#000080", + chroma.NameAttribute: "#008080", + chroma.NameEntity: "#800080", + chroma.GenericHeading: "#999999", + chroma.GenericSubheading: "#aaaaaa", + chroma.GenericDeleted: "bg:#ffdddd #000000", + chroma.GenericInserted: "bg:#ddffdd #000000", + chroma.GenericError: "#aa0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "#555555", + chroma.GenericOutput: "#888888", + chroma.GenericTraceback: "#aa0000", + chroma.GenericUnderline: "underline", + chroma.Error: "bg:#e3d2d2 #a61717", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/vim.go b/vendor/github.com/alecthomas/chroma/styles/vim.go new file mode 100644 index 0000000..6296042 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/vim.go @@ -0,0 +1,36 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Vim style. +var Vim = Register(chroma.MustNewStyle("vim", chroma.StyleEntries{ + chroma.Background: "#cccccc bg:#000000", + chroma.Comment: "#000080", + chroma.CommentSpecial: "bold #cd0000", + chroma.Keyword: "#cdcd00", + chroma.KeywordDeclaration: "#00cd00", + chroma.KeywordNamespace: "#cd00cd", + chroma.KeywordType: "#00cd00", + chroma.Operator: "#3399cc", + chroma.OperatorWord: "#cdcd00", + chroma.NameClass: "#00cdcd", + chroma.NameBuiltin: "#cd00cd", + chroma.NameException: "bold #666699", + chroma.NameVariable: "#00cdcd", + chroma.LiteralString: "#cd0000", + chroma.LiteralNumber: "#cd00cd", + chroma.GenericHeading: "bold #000080", + chroma.GenericSubheading: "bold #800080", + chroma.GenericDeleted: "#cd0000", + chroma.GenericInserted: "#00cd00", + chroma.GenericError: "#FF0000", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "bold #000080", + chroma.GenericOutput: "#888", + chroma.GenericTraceback: "#04D", + chroma.GenericUnderline: "underline", + chroma.Error: "border:#FF0000", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/vs.go b/vendor/github.com/alecthomas/chroma/styles/vs.go new file mode 100644 index 0000000..acbcb91 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/vs.go @@ -0,0 +1,23 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// VisualStudio style. +var VisualStudio = Register(chroma.MustNewStyle("vs", chroma.StyleEntries{ + chroma.Comment: "#008000", + chroma.CommentPreproc: "#0000ff", + chroma.Keyword: "#0000ff", + chroma.OperatorWord: "#0000ff", + chroma.KeywordType: "#2b91af", + chroma.NameClass: "#2b91af", + chroma.LiteralString: "#a31515", + chroma.GenericHeading: "bold", + chroma.GenericSubheading: "bold", + chroma.GenericEmph: "italic", + chroma.GenericStrong: "bold", + chroma.GenericPrompt: "bold", + chroma.Error: "border:#FF0000", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/vulcan.go b/vendor/github.com/alecthomas/chroma/styles/vulcan.go new file mode 100644 index 0000000..82ad1a1 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/vulcan.go @@ -0,0 +1,95 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +var ( + // inspired by Doom Emacs's One Doom Theme + black = "#282C34" + grey = "#3E4460" + grey2 = "#43454f" + white = "#C9C9C9" + red = "#CF5967" + yellow = "#ECBE7B" + green = "#82CC6A" + cyan = "#56B6C2" + blue = "#7FBAF5" + blue2 = "#57C7FF" + purple = "#BC74C4" +) + +var Vulcan = Register(chroma.MustNewStyle("vulcan", chroma.StyleEntries{ + chroma.Comment: grey, + chroma.CommentHashbang: grey + " italic", + chroma.CommentMultiline: grey, + chroma.CommentPreproc: blue, + chroma.CommentSingle: grey, + chroma.CommentSpecial: purple + " italic", + chroma.Generic: white, + chroma.GenericDeleted: red, + chroma.GenericEmph: white + " underline", + chroma.GenericError: red + " bold", + chroma.GenericHeading: yellow + " bold", + chroma.GenericInserted: yellow, + chroma.GenericOutput: grey2, + chroma.GenericPrompt: white, + chroma.GenericStrong: red + " bold", + chroma.GenericSubheading: red + " italic", + chroma.GenericTraceback: white, + chroma.GenericUnderline: "underline", + chroma.Error: red, + chroma.Keyword: blue, + chroma.KeywordConstant: red + " bg:" + grey2, + chroma.KeywordDeclaration: blue, + chroma.KeywordNamespace: purple, + chroma.KeywordPseudo: purple, + chroma.KeywordReserved: blue, + chroma.KeywordType: blue2 + " bold", + chroma.Literal: white, + chroma.LiteralDate: blue2, + chroma.Name: white, + chroma.NameAttribute: purple, + chroma.NameBuiltin: blue, + chroma.NameBuiltinPseudo: blue, + chroma.NameClass: yellow, + chroma.NameConstant: yellow, + chroma.NameDecorator: yellow, + chroma.NameEntity: white, + chroma.NameException: red, + chroma.NameFunction: blue2, + chroma.NameLabel: red, + chroma.NameNamespace: white, + chroma.NameOther: white, + chroma.NameTag: purple, + chroma.NameVariable: purple + " italic", + chroma.NameVariableClass: blue2 + " bold", + chroma.NameVariableGlobal: yellow, + chroma.NameVariableInstance: blue2, + chroma.LiteralNumber: cyan, + chroma.LiteralNumberBin: blue2, + chroma.LiteralNumberFloat: cyan, + chroma.LiteralNumberHex: blue2, + chroma.LiteralNumberInteger: cyan, + chroma.LiteralNumberIntegerLong: cyan, + chroma.LiteralNumberOct: blue2, + chroma.Operator: purple, + chroma.OperatorWord: purple, + chroma.Other: white, + chroma.Punctuation: cyan, + chroma.LiteralString: green, + chroma.LiteralStringBacktick: blue2, + chroma.LiteralStringChar: blue2, + chroma.LiteralStringDoc: green, + chroma.LiteralStringDouble: green, + chroma.LiteralStringEscape: cyan, + chroma.LiteralStringHeredoc: cyan, + chroma.LiteralStringInterpol: green, + chroma.LiteralStringOther: green, + chroma.LiteralStringRegex: blue2, + chroma.LiteralStringSingle: green, + chroma.LiteralStringSymbol: green, + chroma.Text: white, + chroma.TextWhitespace: white, + chroma.Background: " bg: " + black, +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/witchhazel.go b/vendor/github.com/alecthomas/chroma/styles/witchhazel.go new file mode 100644 index 0000000..4aea278 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/witchhazel.go @@ -0,0 +1,52 @@ +// Copyright 2018 Alethea Katherine Flowers +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// WitchHazel Style +var WitchHazel = Register(chroma.MustNewStyle("witchhazel", chroma.StyleEntries{ + chroma.Text: "#F8F8F2", + chroma.Whitespace: "#A8757B", + chroma.Error: "#960050 bg:#1e0010", + chroma.Comment: "#b0bec5", + chroma.Keyword: "#C2FFDF", + chroma.KeywordNamespace: "#FFB8D1", + chroma.Operator: "#FFB8D1", + chroma.Punctuation: "#F8F8F2", + chroma.Name: "#F8F8F2", + chroma.NameAttribute: "#ceb1ff", + chroma.NameBuiltinPseudo: "#80cbc4", + chroma.NameClass: "#ceb1ff", + chroma.NameConstant: "#C5A3FF", + chroma.NameDecorator: "#ceb1ff", + chroma.NameException: "#ceb1ff", + chroma.NameFunction: "#ceb1ff", + chroma.NameProperty: "#F8F8F2", + chroma.NameTag: "#FFB8D1", + chroma.NameVariable: "#F8F8F2", + chroma.Number: "#C5A3FF", + chroma.Literal: "#ae81ff", + chroma.LiteralDate: "#e6db74", + chroma.String: "#1bc5e0", + chroma.GenericDeleted: "#f92672", + chroma.GenericEmph: "italic", + chroma.GenericInserted: "#a6e22e", + chroma.GenericStrong: "bold", + chroma.GenericSubheading: "#75715e", + chroma.Background: " bg:#433e56", +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/xcode-dark.go b/vendor/github.com/alecthomas/chroma/styles/xcode-dark.go new file mode 100644 index 0000000..9a9d757 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/xcode-dark.go @@ -0,0 +1,62 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +var ( + // Inspired by Apple's Xcode "Default (Dark)" Theme + background = "#1F1F24" + plainText = "#FFFFFF" + comments = "#6C7986" + strings = "#FC6A5D" + numbers = "#D0BF69" + keywords = "#FC5FA3" + preprocessorStatements = "#FD8F3F" + typeDeclarations = "#5DD8FF" + otherDeclarations = "#41A1C0" + otherFunctionAndMethodNames = "#A167E6" + otherTypeNames = "#D0A8FF" +) + +// Xcode dark style +var XcodeDark = Register(chroma.MustNewStyle("xcode-dark", chroma.StyleEntries{ + chroma.Background: plainText + " bg:" + background, + + chroma.Comment: comments, + chroma.CommentMultiline: comments, + chroma.CommentPreproc: preprocessorStatements, + chroma.CommentSingle: comments, + chroma.CommentSpecial: comments + " italic", + + chroma.Error: "#960050", + + chroma.Keyword: keywords, + chroma.KeywordConstant: keywords, + chroma.KeywordDeclaration: keywords, + chroma.KeywordReserved: keywords, + + chroma.LiteralNumber: numbers, + chroma.LiteralNumberBin: numbers, + chroma.LiteralNumberFloat: numbers, + chroma.LiteralNumberHex: numbers, + chroma.LiteralNumberInteger: numbers, + chroma.LiteralNumberOct: numbers, + + chroma.LiteralString: strings, + chroma.LiteralStringEscape: strings, + chroma.LiteralStringInterpol: plainText, + + chroma.Name: plainText, + chroma.NameBuiltin: otherTypeNames, + chroma.NameBuiltinPseudo: otherFunctionAndMethodNames, + chroma.NameClass: typeDeclarations, + chroma.NameFunction: otherDeclarations, + chroma.NameVariable: otherDeclarations, + + chroma.Operator: plainText, + + chroma.Punctuation: plainText, + + chroma.Text: plainText, +})) diff --git a/vendor/github.com/alecthomas/chroma/styles/xcode.go b/vendor/github.com/alecthomas/chroma/styles/xcode.go new file mode 100644 index 0000000..115cf71 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/styles/xcode.go @@ -0,0 +1,29 @@ +package styles + +import ( + "github.com/alecthomas/chroma" +) + +// Xcode style. +var Xcode = Register(chroma.MustNewStyle("xcode", chroma.StyleEntries{ + chroma.Comment: "#177500", + chroma.CommentPreproc: "#633820", + chroma.LiteralString: "#C41A16", + chroma.LiteralStringChar: "#2300CE", + chroma.Operator: "#000000", + chroma.Keyword: "#A90D91", + chroma.Name: "#000000", + chroma.NameAttribute: "#836C28", + chroma.NameClass: "#3F6E75", + chroma.NameFunction: "#000000", + chroma.NameBuiltin: "#A90D91", + chroma.NameBuiltinPseudo: "#5B269A", + chroma.NameVariable: "#000000", + chroma.NameTag: "#000000", + chroma.NameDecorator: "#000000", + chroma.NameLabel: "#000000", + chroma.Literal: "#1C01CE", + chroma.LiteralNumber: "#1C01CE", + chroma.Error: "#000000", + chroma.Background: " bg:#ffffff", +})) diff --git a/vendor/github.com/alecthomas/chroma/table.py b/vendor/github.com/alecthomas/chroma/table.py new file mode 100644 index 0000000..7794539 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/table.py @@ -0,0 +1,32 @@ +#!/usr/bin/env python3 +import re +from collections import defaultdict +from subprocess import check_output + +README_FILE = "README.md" + + +lines = check_output(["go", "run", "./cmd/chroma/main.go", "--list"]).decode("utf-8").splitlines() +lines = [line.strip() for line in lines if line.startswith(" ") and not line.startswith(" ")] +lines = sorted(lines, key=lambda l: l.lower()) + +table = defaultdict(list) + +for line in lines: + table[line[0].upper()].append(line) + +rows = [] +for key, value in table.items(): + rows.append("{} | {}".format(key, ", ".join(value))) +tbody = "\n".join(rows) + +with open(README_FILE, "r") as f: + content = f.read() + +with open(README_FILE, "w") as f: + marker = re.compile(r"(?P:----: \\| --------\n).*?(?P\n\n)", re.DOTALL) + replacement = r"\g%s\g" % tbody + updated_content = marker.sub(replacement, content) + f.write(updated_content) + +print(tbody) diff --git a/vendor/github.com/alecthomas/chroma/tokentype_string.go b/vendor/github.com/alecthomas/chroma/tokentype_string.go new file mode 100644 index 0000000..9c302f9 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/tokentype_string.go @@ -0,0 +1,219 @@ +// Code generated by "stringer -type TokenType"; DO NOT EDIT. + +package chroma + +import "strconv" + +func _() { + // An "invalid array index" compiler error signifies that the constant values have changed. + // Re-run the stringer command to generate them again. + var x [1]struct{} + _ = x[Background - -1] + _ = x[PreWrapper - -2] + _ = x[Line - -3] + _ = x[LineNumbers - -4] + _ = x[LineNumbersTable - -5] + _ = x[LineHighlight - -6] + _ = x[LineTable - -7] + _ = x[LineTableTD - -8] + _ = x[CodeLine - -9] + _ = x[Error - -10] + _ = x[Other - -11] + _ = x[None - -12] + _ = x[EOFType-0] + _ = x[Keyword-1000] + _ = x[KeywordConstant-1001] + _ = x[KeywordDeclaration-1002] + _ = x[KeywordNamespace-1003] + _ = x[KeywordPseudo-1004] + _ = x[KeywordReserved-1005] + _ = x[KeywordType-1006] + _ = x[Name-2000] + _ = x[NameAttribute-2001] + _ = x[NameBuiltin-2002] + _ = x[NameBuiltinPseudo-2003] + _ = x[NameClass-2004] + _ = x[NameConstant-2005] + _ = x[NameDecorator-2006] + _ = x[NameEntity-2007] + _ = x[NameException-2008] + _ = x[NameFunction-2009] + _ = x[NameFunctionMagic-2010] + _ = x[NameKeyword-2011] + _ = x[NameLabel-2012] + _ = x[NameNamespace-2013] + _ = x[NameOperator-2014] + _ = x[NameOther-2015] + _ = x[NamePseudo-2016] + _ = x[NameProperty-2017] + _ = x[NameTag-2018] + _ = x[NameVariable-2019] + _ = x[NameVariableAnonymous-2020] + _ = x[NameVariableClass-2021] + _ = x[NameVariableGlobal-2022] + _ = x[NameVariableInstance-2023] + _ = x[NameVariableMagic-2024] + _ = x[Literal-3000] + _ = x[LiteralDate-3001] + _ = x[LiteralOther-3002] + _ = x[LiteralString-3100] + _ = x[LiteralStringAffix-3101] + _ = x[LiteralStringAtom-3102] + _ = x[LiteralStringBacktick-3103] + _ = x[LiteralStringBoolean-3104] + _ = x[LiteralStringChar-3105] + _ = x[LiteralStringDelimiter-3106] + _ = x[LiteralStringDoc-3107] + _ = x[LiteralStringDouble-3108] + _ = x[LiteralStringEscape-3109] + _ = x[LiteralStringHeredoc-3110] + _ = x[LiteralStringInterpol-3111] + _ = x[LiteralStringName-3112] + _ = x[LiteralStringOther-3113] + _ = x[LiteralStringRegex-3114] + _ = x[LiteralStringSingle-3115] + _ = x[LiteralStringSymbol-3116] + _ = x[LiteralNumber-3200] + _ = x[LiteralNumberBin-3201] + _ = x[LiteralNumberFloat-3202] + _ = x[LiteralNumberHex-3203] + _ = x[LiteralNumberInteger-3204] + _ = x[LiteralNumberIntegerLong-3205] + _ = x[LiteralNumberOct-3206] + _ = x[Operator-4000] + _ = x[OperatorWord-4001] + _ = x[Punctuation-5000] + _ = x[Comment-6000] + _ = x[CommentHashbang-6001] + _ = x[CommentMultiline-6002] + _ = x[CommentSingle-6003] + _ = x[CommentSpecial-6004] + _ = x[CommentPreproc-6100] + _ = x[CommentPreprocFile-6101] + _ = x[Generic-7000] + _ = x[GenericDeleted-7001] + _ = x[GenericEmph-7002] + _ = x[GenericError-7003] + _ = x[GenericHeading-7004] + _ = x[GenericInserted-7005] + _ = x[GenericOutput-7006] + _ = x[GenericPrompt-7007] + _ = x[GenericStrong-7008] + _ = x[GenericSubheading-7009] + _ = x[GenericTraceback-7010] + _ = x[GenericUnderline-7011] + _ = x[Text-8000] + _ = x[TextWhitespace-8001] + _ = x[TextSymbol-8002] + _ = x[TextPunctuation-8003] +} + +const _TokenType_name = "NoneOtherErrorCodeLineLineTableTDLineTableLineHighlightLineNumbersTableLineNumbersLinePreWrapperBackgroundEOFTypeKeywordKeywordConstantKeywordDeclarationKeywordNamespaceKeywordPseudoKeywordReservedKeywordTypeNameNameAttributeNameBuiltinNameBuiltinPseudoNameClassNameConstantNameDecoratorNameEntityNameExceptionNameFunctionNameFunctionMagicNameKeywordNameLabelNameNamespaceNameOperatorNameOtherNamePseudoNamePropertyNameTagNameVariableNameVariableAnonymousNameVariableClassNameVariableGlobalNameVariableInstanceNameVariableMagicLiteralLiteralDateLiteralOtherLiteralStringLiteralStringAffixLiteralStringAtomLiteralStringBacktickLiteralStringBooleanLiteralStringCharLiteralStringDelimiterLiteralStringDocLiteralStringDoubleLiteralStringEscapeLiteralStringHeredocLiteralStringInterpolLiteralStringNameLiteralStringOtherLiteralStringRegexLiteralStringSingleLiteralStringSymbolLiteralNumberLiteralNumberBinLiteralNumberFloatLiteralNumberHexLiteralNumberIntegerLiteralNumberIntegerLongLiteralNumberOctOperatorOperatorWordPunctuationCommentCommentHashbangCommentMultilineCommentSingleCommentSpecialCommentPreprocCommentPreprocFileGenericGenericDeletedGenericEmphGenericErrorGenericHeadingGenericInsertedGenericOutputGenericPromptGenericStrongGenericSubheadingGenericTracebackGenericUnderlineTextTextWhitespaceTextSymbolTextPunctuation" + +var _TokenType_map = map[TokenType]string{ + -12: _TokenType_name[0:4], + -11: _TokenType_name[4:9], + -10: _TokenType_name[9:14], + -9: _TokenType_name[14:22], + -8: _TokenType_name[22:33], + -7: _TokenType_name[33:42], + -6: _TokenType_name[42:55], + -5: _TokenType_name[55:71], + -4: _TokenType_name[71:82], + -3: _TokenType_name[82:86], + -2: _TokenType_name[86:96], + -1: _TokenType_name[96:106], + 0: _TokenType_name[106:113], + 1000: _TokenType_name[113:120], + 1001: _TokenType_name[120:135], + 1002: _TokenType_name[135:153], + 1003: _TokenType_name[153:169], + 1004: _TokenType_name[169:182], + 1005: _TokenType_name[182:197], + 1006: _TokenType_name[197:208], + 2000: _TokenType_name[208:212], + 2001: _TokenType_name[212:225], + 2002: _TokenType_name[225:236], + 2003: _TokenType_name[236:253], + 2004: _TokenType_name[253:262], + 2005: _TokenType_name[262:274], + 2006: _TokenType_name[274:287], + 2007: _TokenType_name[287:297], + 2008: _TokenType_name[297:310], + 2009: _TokenType_name[310:322], + 2010: _TokenType_name[322:339], + 2011: _TokenType_name[339:350], + 2012: _TokenType_name[350:359], + 2013: _TokenType_name[359:372], + 2014: _TokenType_name[372:384], + 2015: _TokenType_name[384:393], + 2016: _TokenType_name[393:403], + 2017: _TokenType_name[403:415], + 2018: _TokenType_name[415:422], + 2019: _TokenType_name[422:434], + 2020: _TokenType_name[434:455], + 2021: _TokenType_name[455:472], + 2022: _TokenType_name[472:490], + 2023: _TokenType_name[490:510], + 2024: _TokenType_name[510:527], + 3000: _TokenType_name[527:534], + 3001: _TokenType_name[534:545], + 3002: _TokenType_name[545:557], + 3100: _TokenType_name[557:570], + 3101: _TokenType_name[570:588], + 3102: _TokenType_name[588:605], + 3103: _TokenType_name[605:626], + 3104: _TokenType_name[626:646], + 3105: _TokenType_name[646:663], + 3106: _TokenType_name[663:685], + 3107: _TokenType_name[685:701], + 3108: _TokenType_name[701:720], + 3109: _TokenType_name[720:739], + 3110: _TokenType_name[739:759], + 3111: _TokenType_name[759:780], + 3112: _TokenType_name[780:797], + 3113: _TokenType_name[797:815], + 3114: _TokenType_name[815:833], + 3115: _TokenType_name[833:852], + 3116: _TokenType_name[852:871], + 3200: _TokenType_name[871:884], + 3201: _TokenType_name[884:900], + 3202: _TokenType_name[900:918], + 3203: _TokenType_name[918:934], + 3204: _TokenType_name[934:954], + 3205: _TokenType_name[954:978], + 3206: _TokenType_name[978:994], + 4000: _TokenType_name[994:1002], + 4001: _TokenType_name[1002:1014], + 5000: _TokenType_name[1014:1025], + 6000: _TokenType_name[1025:1032], + 6001: _TokenType_name[1032:1047], + 6002: _TokenType_name[1047:1063], + 6003: _TokenType_name[1063:1076], + 6004: _TokenType_name[1076:1090], + 6100: _TokenType_name[1090:1104], + 6101: _TokenType_name[1104:1122], + 7000: _TokenType_name[1122:1129], + 7001: _TokenType_name[1129:1143], + 7002: _TokenType_name[1143:1154], + 7003: _TokenType_name[1154:1166], + 7004: _TokenType_name[1166:1180], + 7005: _TokenType_name[1180:1195], + 7006: _TokenType_name[1195:1208], + 7007: _TokenType_name[1208:1221], + 7008: _TokenType_name[1221:1234], + 7009: _TokenType_name[1234:1251], + 7010: _TokenType_name[1251:1267], + 7011: _TokenType_name[1267:1283], + 8000: _TokenType_name[1283:1287], + 8001: _TokenType_name[1287:1301], + 8002: _TokenType_name[1301:1311], + 8003: _TokenType_name[1311:1326], +} + +func (i TokenType) String() string { + if str, ok := _TokenType_map[i]; ok { + return str + } + return "TokenType(" + strconv.FormatInt(int64(i), 10) + ")" +} diff --git a/vendor/github.com/alecthomas/chroma/types.go b/vendor/github.com/alecthomas/chroma/types.go new file mode 100644 index 0000000..3f15be8 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/types.go @@ -0,0 +1,356 @@ +package chroma + +import ( + "encoding/json" + "fmt" +) + +//go:generate stringer -type TokenType + +// TokenType is the type of token to highlight. +// +// It is also an Emitter, emitting a single token of itself +type TokenType int + +func (t TokenType) MarshalJSON() ([]byte, error) { return json.Marshal(t.String()) } +func (t *TokenType) UnmarshalJSON(data []byte) error { + key := "" + err := json.Unmarshal(data, &key) + if err != nil { + return err + } + for tt, text := range _TokenType_map { + if text == key { + *t = tt + return nil + } + } + return fmt.Errorf("unknown TokenType %q", data) +} + +// Set of TokenTypes. +// +// Categories of types are grouped in ranges of 1000, while sub-categories are in ranges of 100. For +// example, the literal category is in the range 3000-3999. The sub-category for literal strings is +// in the range 3100-3199. + +// Meta token types. +const ( + // Default background style. + Background TokenType = -1 - iota + // PreWrapper style. + PreWrapper + // Line style. + Line + // Line numbers in output. + LineNumbers + // Line numbers in output when in table. + LineNumbersTable + // Line higlight style. + LineHighlight + // Line numbers table wrapper style. + LineTable + // Line numbers table TD wrapper style. + LineTableTD + // Code line wrapper style. + CodeLine + // Input that could not be tokenised. + Error + // Other is used by the Delegate lexer to indicate which tokens should be handled by the delegate. + Other + // No highlighting. + None + // Used as an EOF marker / nil token + EOFType TokenType = 0 +) + +// Keywords. +const ( + Keyword TokenType = 1000 + iota + KeywordConstant + KeywordDeclaration + KeywordNamespace + KeywordPseudo + KeywordReserved + KeywordType +) + +// Names. +const ( + Name TokenType = 2000 + iota + NameAttribute + NameBuiltin + NameBuiltinPseudo + NameClass + NameConstant + NameDecorator + NameEntity + NameException + NameFunction + NameFunctionMagic + NameKeyword + NameLabel + NameNamespace + NameOperator + NameOther + NamePseudo + NameProperty + NameTag + NameVariable + NameVariableAnonymous + NameVariableClass + NameVariableGlobal + NameVariableInstance + NameVariableMagic +) + +// Literals. +const ( + Literal TokenType = 3000 + iota + LiteralDate + LiteralOther +) + +// Strings. +const ( + LiteralString TokenType = 3100 + iota + LiteralStringAffix + LiteralStringAtom + LiteralStringBacktick + LiteralStringBoolean + LiteralStringChar + LiteralStringDelimiter + LiteralStringDoc + LiteralStringDouble + LiteralStringEscape + LiteralStringHeredoc + LiteralStringInterpol + LiteralStringName + LiteralStringOther + LiteralStringRegex + LiteralStringSingle + LiteralStringSymbol +) + +// Literals. +const ( + LiteralNumber TokenType = 3200 + iota + LiteralNumberBin + LiteralNumberFloat + LiteralNumberHex + LiteralNumberInteger + LiteralNumberIntegerLong + LiteralNumberOct +) + +// Operators. +const ( + Operator TokenType = 4000 + iota + OperatorWord +) + +// Punctuation. +const ( + Punctuation TokenType = 5000 + iota +) + +// Comments. +const ( + Comment TokenType = 6000 + iota + CommentHashbang + CommentMultiline + CommentSingle + CommentSpecial +) + +// Preprocessor "comments". +const ( + CommentPreproc TokenType = 6100 + iota + CommentPreprocFile +) + +// Generic tokens. +const ( + Generic TokenType = 7000 + iota + GenericDeleted + GenericEmph + GenericError + GenericHeading + GenericInserted + GenericOutput + GenericPrompt + GenericStrong + GenericSubheading + GenericTraceback + GenericUnderline +) + +// Text. +const ( + Text TokenType = 8000 + iota + TextWhitespace + TextSymbol + TextPunctuation +) + +// Aliases. +const ( + Whitespace = TextWhitespace + + Date = LiteralDate + + String = LiteralString + StringAffix = LiteralStringAffix + StringBacktick = LiteralStringBacktick + StringChar = LiteralStringChar + StringDelimiter = LiteralStringDelimiter + StringDoc = LiteralStringDoc + StringDouble = LiteralStringDouble + StringEscape = LiteralStringEscape + StringHeredoc = LiteralStringHeredoc + StringInterpol = LiteralStringInterpol + StringOther = LiteralStringOther + StringRegex = LiteralStringRegex + StringSingle = LiteralStringSingle + StringSymbol = LiteralStringSymbol + + Number = LiteralNumber + NumberBin = LiteralNumberBin + NumberFloat = LiteralNumberFloat + NumberHex = LiteralNumberHex + NumberInteger = LiteralNumberInteger + NumberIntegerLong = LiteralNumberIntegerLong + NumberOct = LiteralNumberOct +) + +var ( + StandardTypes = map[TokenType]string{ + Background: "bg", + PreWrapper: "chroma", + Line: "line", + LineNumbers: "ln", + LineNumbersTable: "lnt", + LineHighlight: "hl", + LineTable: "lntable", + LineTableTD: "lntd", + CodeLine: "cl", + Text: "", + Whitespace: "w", + Error: "err", + Other: "x", + // I have no idea what this is used for... + // Escape: "esc", + + Keyword: "k", + KeywordConstant: "kc", + KeywordDeclaration: "kd", + KeywordNamespace: "kn", + KeywordPseudo: "kp", + KeywordReserved: "kr", + KeywordType: "kt", + + Name: "n", + NameAttribute: "na", + NameBuiltin: "nb", + NameBuiltinPseudo: "bp", + NameClass: "nc", + NameConstant: "no", + NameDecorator: "nd", + NameEntity: "ni", + NameException: "ne", + NameFunction: "nf", + NameFunctionMagic: "fm", + NameProperty: "py", + NameLabel: "nl", + NameNamespace: "nn", + NameOther: "nx", + NameTag: "nt", + NameVariable: "nv", + NameVariableClass: "vc", + NameVariableGlobal: "vg", + NameVariableInstance: "vi", + NameVariableMagic: "vm", + + Literal: "l", + LiteralDate: "ld", + + String: "s", + StringAffix: "sa", + StringBacktick: "sb", + StringChar: "sc", + StringDelimiter: "dl", + StringDoc: "sd", + StringDouble: "s2", + StringEscape: "se", + StringHeredoc: "sh", + StringInterpol: "si", + StringOther: "sx", + StringRegex: "sr", + StringSingle: "s1", + StringSymbol: "ss", + + Number: "m", + NumberBin: "mb", + NumberFloat: "mf", + NumberHex: "mh", + NumberInteger: "mi", + NumberIntegerLong: "il", + NumberOct: "mo", + + Operator: "o", + OperatorWord: "ow", + + Punctuation: "p", + + Comment: "c", + CommentHashbang: "ch", + CommentMultiline: "cm", + CommentPreproc: "cp", + CommentPreprocFile: "cpf", + CommentSingle: "c1", + CommentSpecial: "cs", + + Generic: "g", + GenericDeleted: "gd", + GenericEmph: "ge", + GenericError: "gr", + GenericHeading: "gh", + GenericInserted: "gi", + GenericOutput: "go", + GenericPrompt: "gp", + GenericStrong: "gs", + GenericSubheading: "gu", + GenericTraceback: "gt", + GenericUnderline: "gl", + } +) + +func (t TokenType) Parent() TokenType { + if t%100 != 0 { + return t / 100 * 100 + } + if t%1000 != 0 { + return t / 1000 * 1000 + } + return 0 +} + +func (t TokenType) Category() TokenType { + return t / 1000 * 1000 +} + +func (t TokenType) SubCategory() TokenType { + return t / 100 * 100 +} + +func (t TokenType) InCategory(other TokenType) bool { + return t/1000 == other/1000 +} + +func (t TokenType) InSubCategory(other TokenType) bool { + return t/100 == other/100 +} + +func (t TokenType) Emit(groups []string, _ *LexerState) Iterator { + return Literator(Token{Type: t, Value: groups[0]}) +} diff --git a/vendor/github.com/dlclark/regexp2/.gitignore b/vendor/github.com/dlclark/regexp2/.gitignore new file mode 100644 index 0000000..fb844c3 --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/.gitignore @@ -0,0 +1,27 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test +*.prof +*.out + +.DS_Store diff --git a/vendor/github.com/dlclark/regexp2/.travis.yml b/vendor/github.com/dlclark/regexp2/.travis.yml new file mode 100644 index 0000000..a2da6be --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/.travis.yml @@ -0,0 +1,7 @@ +language: go +arch: + - AMD64 + - ppc64le +go: + - 1.9 + - tip diff --git a/vendor/github.com/dlclark/regexp2/ATTRIB b/vendor/github.com/dlclark/regexp2/ATTRIB new file mode 100644 index 0000000..cdf4560 --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/ATTRIB @@ -0,0 +1,133 @@ +============ +These pieces of code were ported from dotnet/corefx: + +syntax/charclass.go (from RegexCharClass.cs): ported to use the built-in Go unicode classes. Canonicalize is + a direct port, but most of the other code required large changes because the C# implementation + used a string to represent the CharSet data structure and I cleaned that up in my implementation. + +syntax/code.go (from RegexCode.cs): ported literally with various cleanups and layout to make it more Go-ish. + +syntax/escape.go (from RegexParser.cs): ported Escape method and added some optimizations. Unescape is inspired by + the C# implementation but couldn't be directly ported because of the lack of do-while syntax in Go. + +syntax/parser.go (from RegexpParser.cs and RegexOptions.cs): ported parser struct and associated methods as + literally as possible. Several language differences required changes. E.g. lack pre/post-fix increments as + expressions, lack of do-while loops, lack of overloads, etc. + +syntax/prefix.go (from RegexFCD.cs and RegexBoyerMoore.cs): ported as literally as possible and added support + for unicode chars that are longer than the 16-bit char in C# for the 32-bit rune in Go. + +syntax/replacerdata.go (from RegexReplacement.cs): conceptually ported and re-organized to handle differences + in charclass implementation, and fix odd code layout between RegexParser.cs, Regex.cs, and RegexReplacement.cs. + +syntax/tree.go (from RegexTree.cs and RegexNode.cs): ported literally as possible. + +syntax/writer.go (from RegexWriter.cs): ported literally with minor changes to make it more Go-ish. + +match.go (from RegexMatch.cs): ported, simplified, and changed to handle Go's lack of inheritence. + +regexp.go (from Regex.cs and RegexOptions.cs): conceptually serves the same "starting point", but is simplified + and changed to handle differences in C# strings and Go strings/runes. + +replace.go (from RegexReplacement.cs): ported closely and then cleaned up to combine the MatchEvaluator and + simple string replace implementations. + +runner.go (from RegexRunner.cs): ported literally as possible. + +regexp_test.go (from CaptureTests.cs and GroupNamesAndNumbers.cs): conceptually ported, but the code was + manually structured like Go tests. + +replace_test.go (from RegexReplaceStringTest0.cs): conceptually ported + +rtl_test.go (from RightToLeft.cs): conceptually ported +--- +dotnet/corefx was released under this license: + +The MIT License (MIT) + +Copyright (c) Microsoft Corporation + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + +============ +These pieces of code are copied from the Go framework: + +- The overall directory structure of regexp2 was inspired by the Go runtime regexp package. +- The optimization in the escape method of syntax/escape.go is from the Go runtime QuoteMeta() func in regexp/regexp.go +- The method signatures in regexp.go are designed to match the Go framework regexp methods closely +- func regexp2.MustCompile and func quote are almost identifical to the regexp package versions +- BenchmarkMatch* and TestProgramTooLong* funcs in regexp_performance_test.go were copied from the framework + regexp/exec_test.go +--- +The Go framework was released under this license: + +Copyright (c) 2012 The Go Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + +============ +Some test data were gathered from the Mono project. + +regexp_mono_test.go: ported from https://github.com/mono/mono/blob/master/mcs/class/System/Test/System.Text.RegularExpressions/PerlTrials.cs +--- +Mono tests released under this license: + +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +"Software"), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE +LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + diff --git a/vendor/github.com/dlclark/regexp2/LICENSE b/vendor/github.com/dlclark/regexp2/LICENSE new file mode 100644 index 0000000..fe83dfd --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) Doug Clark + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/dlclark/regexp2/README.md b/vendor/github.com/dlclark/regexp2/README.md new file mode 100644 index 0000000..9cbc1d8 --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/README.md @@ -0,0 +1,174 @@ +# regexp2 - full featured regular expressions for Go +Regexp2 is a feature-rich RegExp engine for Go. It doesn't have constant time guarantees like the built-in `regexp` package, but it allows backtracking and is compatible with Perl5 and .NET. You'll likely be better off with the RE2 engine from the `regexp` package and should only use this if you need to write very complex patterns or require compatibility with .NET. + +## Basis of the engine +The engine is ported from the .NET framework's System.Text.RegularExpressions.Regex engine. That engine was open sourced in 2015 under the MIT license. There are some fundamental differences between .NET strings and Go strings that required a bit of borrowing from the Go framework regex engine as well. I cleaned up a couple of the dirtier bits during the port (regexcharclass.cs was terrible), but the parse tree, code emmitted, and therefore patterns matched should be identical. + +## New Code Generation +For extra performance use `regexp2` with [`regexp2cg`](https://github.com/dlclark/regexp2cg). It is a code generation utility for `regexp2` and you can likely improve your regexp runtime performance by 3-10x in hot code paths. As always you should benchmark your specifics to confirm the results. Give it a try! + +## Installing +This is a go-gettable library, so install is easy: + + go get github.com/dlclark/regexp2 + +To use the new Code Generation (while it's in beta) you'll need to use the `code_gen` branch: + + go get github.com/dlclark/regexp2@code_gen + +## Usage +Usage is similar to the Go `regexp` package. Just like in `regexp`, you start by converting a regex into a state machine via the `Compile` or `MustCompile` methods. They ultimately do the same thing, but `MustCompile` will panic if the regex is invalid. You can then use the provided `Regexp` struct to find matches repeatedly. A `Regexp` struct is safe to use across goroutines. + +```go +re := regexp2.MustCompile(`Your pattern`, 0) +if isMatch, _ := re.MatchString(`Something to match`); isMatch { + //do something +} +``` + +The only error that the `*Match*` methods *should* return is a Timeout if you set the `re.MatchTimeout` field. Any other error is a bug in the `regexp2` package. If you need more details about capture groups in a match then use the `FindStringMatch` method, like so: + +```go +if m, _ := re.FindStringMatch(`Something to match`); m != nil { + // the whole match is always group 0 + fmt.Printf("Group 0: %v\n", m.String()) + + // you can get all the groups too + gps := m.Groups() + + // a group can be captured multiple times, so each cap is separately addressable + fmt.Printf("Group 1, first capture", gps[1].Captures[0].String()) + fmt.Printf("Group 1, second capture", gps[1].Captures[1].String()) +} +``` + +Group 0 is embedded in the Match. Group 0 is an automatically-assigned group that encompasses the whole pattern. This means that `m.String()` is the same as `m.Group.String()` and `m.Groups()[0].String()` + +The __last__ capture is embedded in each group, so `g.String()` will return the same thing as `g.Capture.String()` and `g.Captures[len(g.Captures)-1].String()`. + +If you want to find multiple matches from a single input string you should use the `FindNextMatch` method. For example, to implement a function similar to `regexp.FindAllString`: + +```go +func regexp2FindAllString(re *regexp2.Regexp, s string) []string { + var matches []string + m, _ := re.FindStringMatch(s) + for m != nil { + matches = append(matches, m.String()) + m, _ = re.FindNextMatch(m) + } + return matches +} +``` + +`FindNextMatch` is optmized so that it re-uses the underlying string/rune slice. + +The internals of `regexp2` always operate on `[]rune` so `Index` and `Length` data in a `Match` always reference a position in `rune`s rather than `byte`s (even if the input was given as a string). This is a dramatic difference between `regexp` and `regexp2`. It's advisable to use the provided `String()` methods to avoid having to work with indices. + +## Compare `regexp` and `regexp2` +| Category | regexp | regexp2 | +| --- | --- | --- | +| Catastrophic backtracking possible | no, constant execution time guarantees | yes, if your pattern is at risk you can use the `re.MatchTimeout` field | +| Python-style capture groups `(?Pre)` | yes | no (yes in RE2 compat mode) | +| .NET-style capture groups `(?re)` or `(?'name're)` | no | yes | +| comments `(?#comment)` | no | yes | +| branch numbering reset `(?\|a\|b)` | no | no | +| possessive match `(?>re)` | no | yes | +| positive lookahead `(?=re)` | no | yes | +| negative lookahead `(?!re)` | no | yes | +| positive lookbehind `(?<=re)` | no | yes | +| negative lookbehind `(?re)`) +* change singleline behavior for `$` to only match end of string (like RE2) (see [#24](https://github.com/dlclark/regexp2/issues/24)) +* change the character classes `\d` `\s` and `\w` to match the same characters as RE2. NOTE: if you also use the `ECMAScript` option then this will change the `\s` character class to match ECMAScript instead of RE2. ECMAScript allows more whitespace characters in `\s` than RE2 (but still fewer than the the default behavior). +* allow character escape sequences to have defaults. For example, by default `\_` isn't a known character escape and will fail to compile, but in RE2 mode it will match the literal character `_` + +```go +re := regexp2.MustCompile(`Your RE2-compatible pattern`, regexp2.RE2) +if isMatch, _ := re.MatchString(`Something to match`); isMatch { + //do something +} +``` + +This feature is a work in progress and I'm open to ideas for more things to put here (maybe more relaxed character escaping rules?). + +## Catastrophic Backtracking and Timeouts + +`regexp2` supports features that can lead to catastrophic backtracking. +`Regexp.MatchTimeout` can be set to to limit the impact of such behavior; the +match will fail with an error after approximately MatchTimeout. No timeout +checks are done by default. + +Timeout checking is not free. The current timeout checking implementation starts +a background worker that updates a clock value approximately once every 100 +milliseconds. The matching code compares this value against the precomputed +deadline for the match. The performance impact is as follows. + +1. A match with a timeout runs almost as fast as a match without a timeout. +2. If any live matches have a timeout, there will be a background CPU load + (`~0.15%` currently on a modern machine). This load will remain constant + regardless of the number of matches done including matches done in parallel. +3. If no live matches are using a timeout, the background load will remain + until the longest deadline (match timeout + the time when the match started) + is reached. E.g., if you set a timeout of one minute the load will persist + for approximately a minute even if the match finishes quickly. + +See [PR #58](https://github.com/dlclark/regexp2/pull/58) for more details and +alternatives considered. + +## Goroutine leak error +If you're using a library during unit tests (e.g. https://github.com/uber-go/goleak) that validates all goroutines are exited then you'll likely get an error if you or any of your dependencies use regex's with a MatchTimeout. +To remedy the problem you'll need to tell the unit test to wait until the backgroup timeout goroutine is exited. + +```go +func TestSomething(t *testing.T) { + defer goleak.VerifyNone(t) + defer regexp2.StopTimeoutClock() + + // ... test +} + +//or + +func TestMain(m *testing.M) { + // setup + // ... + + // run + m.Run() + + //tear down + regexp2.StopTimeoutClock() + goleak.VerifyNone(t) +} +``` + +This will add ~100ms runtime to each test (or TestMain). If that's too much time you can set the clock cycle rate of the timeout goroutine in an init function in a test file. `regexp2.SetTimeoutCheckPeriod` isn't threadsafe so it must be setup before starting any regex's with Timeouts. + +```go +func init() { + //speed up testing by making the timeout clock 1ms + regexp2.SetTimeoutCheckPeriod(time.Millisecond) +} +``` + +## ECMAScript compatibility mode +In this mode the engine provides compatibility with the [regex engine](https://tc39.es/ecma262/multipage/text-processing.html#sec-regexp-regular-expression-objects) described in the ECMAScript specification. + +Additionally a Unicode mode is provided which allows parsing of `\u{CodePoint}` syntax that is only when both are provided. + +## Library features that I'm still working on +- Regex split + +## Potential bugs +I've run a battery of tests against regexp2 from various sources and found the debug output matches the .NET engine, but .NET and Go handle strings very differently. I've attempted to handle these differences, but most of my testing deals with basic ASCII with a little bit of multi-byte Unicode. There's a chance that there are bugs in the string handling related to character sets with supplementary Unicode chars. Right-to-Left support is coded, but not well tested either. + +## Find a bug? +I'm open to new issues and pull requests with tests if you find something odd! diff --git a/vendor/github.com/dlclark/regexp2/fastclock.go b/vendor/github.com/dlclark/regexp2/fastclock.go new file mode 100644 index 0000000..caf2c9d --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/fastclock.go @@ -0,0 +1,129 @@ +package regexp2 + +import ( + "sync" + "sync/atomic" + "time" +) + +// fasttime holds a time value (ticks since clock initialization) +type fasttime int64 + +// fastclock provides a fast clock implementation. +// +// A background goroutine periodically stores the current time +// into an atomic variable. +// +// A deadline can be quickly checked for expiration by comparing +// its value to the clock stored in the atomic variable. +// +// The goroutine automatically stops once clockEnd is reached. +// (clockEnd covers the largest deadline seen so far + some +// extra time). This ensures that if regexp2 with timeouts +// stops being used we will stop background work. +type fastclock struct { + // instances of atomicTime must be at the start of the struct (or at least 64-bit aligned) + // otherwise 32-bit architectures will panic + + current atomicTime // Current time (approximate) + clockEnd atomicTime // When clock updater is supposed to stop (>= any existing deadline) + + // current and clockEnd can be read via atomic loads. + // Reads and writes of other fields require mu to be held. + mu sync.Mutex + start time.Time // Time corresponding to fasttime(0) + running bool // Is a clock updater running? +} + +var fast fastclock + +// reached returns true if current time is at or past t. +func (t fasttime) reached() bool { + return fast.current.read() >= t +} + +// makeDeadline returns a time that is approximately time.Now().Add(d) +func makeDeadline(d time.Duration) fasttime { + // Increase the deadline since the clock we are reading may be + // just about to tick forwards. + end := fast.current.read() + durationToTicks(d+clockPeriod) + + // Start or extend clock if necessary. + if end > fast.clockEnd.read() { + extendClock(end) + } + return end +} + +// extendClock ensures that clock is live and will run until at least end. +func extendClock(end fasttime) { + fast.mu.Lock() + defer fast.mu.Unlock() + + if fast.start.IsZero() { + fast.start = time.Now() + } + + // Extend the running time to cover end as well as a bit of slop. + if shutdown := end + durationToTicks(time.Second); shutdown > fast.clockEnd.read() { + fast.clockEnd.write(shutdown) + } + + // Start clock if necessary + if !fast.running { + fast.running = true + go runClock() + } +} + +// stop the timeout clock in the background +// should only used for unit tests to abandon the background goroutine +func stopClock() { + fast.mu.Lock() + if fast.running { + fast.clockEnd.write(fasttime(0)) + } + fast.mu.Unlock() + + // pause until not running + // get and release the lock + isRunning := true + for isRunning { + time.Sleep(clockPeriod / 2) + fast.mu.Lock() + isRunning = fast.running + fast.mu.Unlock() + } +} + +func durationToTicks(d time.Duration) fasttime { + // Downscale nanoseconds to approximately a millisecond so that we can avoid + // overflow even if the caller passes in math.MaxInt64. + return fasttime(d) >> 20 +} + +const DefaultClockPeriod = 100 * time.Millisecond + +// clockPeriod is the approximate interval between updates of approximateClock. +var clockPeriod = DefaultClockPeriod + +func runClock() { + fast.mu.Lock() + defer fast.mu.Unlock() + + for fast.current.read() <= fast.clockEnd.read() { + // Unlock while sleeping. + fast.mu.Unlock() + time.Sleep(clockPeriod) + fast.mu.Lock() + + newTime := durationToTicks(time.Since(fast.start)) + fast.current.write(newTime) + } + fast.running = false +} + +type atomicTime struct{ v int64 } // Should change to atomic.Int64 when we can use go 1.19 + +func (t *atomicTime) read() fasttime { return fasttime(atomic.LoadInt64(&t.v)) } +func (t *atomicTime) write(v fasttime) { atomic.StoreInt64(&t.v, int64(v)) } diff --git a/vendor/github.com/dlclark/regexp2/match.go b/vendor/github.com/dlclark/regexp2/match.go new file mode 100644 index 0000000..759cf8c --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/match.go @@ -0,0 +1,349 @@ +package regexp2 + +import ( + "bytes" + "fmt" +) + +// Match is a single regex result match that contains groups and repeated captures +// +// -Groups +// -Capture +type Match struct { + Group //embeded group 0 + + regex *Regexp + otherGroups []Group + + // input to the match + textpos int + textstart int + + capcount int + caps []int + sparseCaps map[int]int + + // output from the match + matches [][]int + matchcount []int + + // whether we've done any balancing with this match. If we + // have done balancing, we'll need to do extra work in Tidy(). + balancing bool +} + +// Group is an explicit or implit (group 0) matched group within the pattern +type Group struct { + Capture // the last capture of this group is embeded for ease of use + + Name string // group name + Captures []Capture // captures of this group +} + +// Capture is a single capture of text within the larger original string +type Capture struct { + // the original string + text []rune + // Index is the position in the underlying rune slice where the first character of + // captured substring was found. Even if you pass in a string this will be in Runes. + Index int + // Length is the number of runes in the captured substring. + Length int +} + +// String returns the captured text as a String +func (c *Capture) String() string { + return string(c.text[c.Index : c.Index+c.Length]) +} + +// Runes returns the captured text as a rune slice +func (c *Capture) Runes() []rune { + return c.text[c.Index : c.Index+c.Length] +} + +func newMatch(regex *Regexp, capcount int, text []rune, startpos int) *Match { + m := Match{ + regex: regex, + matchcount: make([]int, capcount), + matches: make([][]int, capcount), + textstart: startpos, + balancing: false, + } + m.Name = "0" + m.text = text + m.matches[0] = make([]int, 2) + return &m +} + +func newMatchSparse(regex *Regexp, caps map[int]int, capcount int, text []rune, startpos int) *Match { + m := newMatch(regex, capcount, text, startpos) + m.sparseCaps = caps + return m +} + +func (m *Match) reset(text []rune, textstart int) { + m.text = text + m.textstart = textstart + for i := 0; i < len(m.matchcount); i++ { + m.matchcount[i] = 0 + } + m.balancing = false +} + +func (m *Match) tidy(textpos int) { + + interval := m.matches[0] + m.Index = interval[0] + m.Length = interval[1] + m.textpos = textpos + m.capcount = m.matchcount[0] + //copy our root capture to the list + m.Group.Captures = []Capture{m.Group.Capture} + + if m.balancing { + // The idea here is that we want to compact all of our unbalanced captures. To do that we + // use j basically as a count of how many unbalanced captures we have at any given time + // (really j is an index, but j/2 is the count). First we skip past all of the real captures + // until we find a balance captures. Then we check each subsequent entry. If it's a balance + // capture (it's negative), we decrement j. If it's a real capture, we increment j and copy + // it down to the last free position. + for cap := 0; cap < len(m.matchcount); cap++ { + limit := m.matchcount[cap] * 2 + matcharray := m.matches[cap] + + var i, j int + + for i = 0; i < limit; i++ { + if matcharray[i] < 0 { + break + } + } + + for j = i; i < limit; i++ { + if matcharray[i] < 0 { + // skip negative values + j-- + } else { + // but if we find something positive (an actual capture), copy it back to the last + // unbalanced position. + if i != j { + matcharray[j] = matcharray[i] + } + j++ + } + } + + m.matchcount[cap] = j / 2 + } + + m.balancing = false + } +} + +// isMatched tells if a group was matched by capnum +func (m *Match) isMatched(cap int) bool { + return cap < len(m.matchcount) && m.matchcount[cap] > 0 && m.matches[cap][m.matchcount[cap]*2-1] != (-3+1) +} + +// matchIndex returns the index of the last specified matched group by capnum +func (m *Match) matchIndex(cap int) int { + i := m.matches[cap][m.matchcount[cap]*2-2] + if i >= 0 { + return i + } + + return m.matches[cap][-3-i] +} + +// matchLength returns the length of the last specified matched group by capnum +func (m *Match) matchLength(cap int) int { + i := m.matches[cap][m.matchcount[cap]*2-1] + if i >= 0 { + return i + } + + return m.matches[cap][-3-i] +} + +// Nonpublic builder: add a capture to the group specified by "c" +func (m *Match) addMatch(c, start, l int) { + + if m.matches[c] == nil { + m.matches[c] = make([]int, 2) + } + + capcount := m.matchcount[c] + + if capcount*2+2 > len(m.matches[c]) { + oldmatches := m.matches[c] + newmatches := make([]int, capcount*8) + copy(newmatches, oldmatches[:capcount*2]) + m.matches[c] = newmatches + } + + m.matches[c][capcount*2] = start + m.matches[c][capcount*2+1] = l + m.matchcount[c] = capcount + 1 + //log.Printf("addMatch: c=%v, i=%v, l=%v ... matches: %v", c, start, l, m.matches) +} + +// Nonpublic builder: Add a capture to balance the specified group. This is used by the +// +// balanced match construct. (?...) +// +// If there were no such thing as backtracking, this would be as simple as calling RemoveMatch(c). +// However, since we have backtracking, we need to keep track of everything. +func (m *Match) balanceMatch(c int) { + m.balancing = true + + // we'll look at the last capture first + capcount := m.matchcount[c] + target := capcount*2 - 2 + + // first see if it is negative, and therefore is a reference to the next available + // capture group for balancing. If it is, we'll reset target to point to that capture. + if m.matches[c][target] < 0 { + target = -3 - m.matches[c][target] + } + + // move back to the previous capture + target -= 2 + + // if the previous capture is a reference, just copy that reference to the end. Otherwise, point to it. + if target >= 0 && m.matches[c][target] < 0 { + m.addMatch(c, m.matches[c][target], m.matches[c][target+1]) + } else { + m.addMatch(c, -3-target, -4-target /* == -3 - (target + 1) */) + } +} + +// Nonpublic builder: removes a group match by capnum +func (m *Match) removeMatch(c int) { + m.matchcount[c]-- +} + +// GroupCount returns the number of groups this match has matched +func (m *Match) GroupCount() int { + return len(m.matchcount) +} + +// GroupByName returns a group based on the name of the group, or nil if the group name does not exist +func (m *Match) GroupByName(name string) *Group { + num := m.regex.GroupNumberFromName(name) + if num < 0 { + return nil + } + return m.GroupByNumber(num) +} + +// GroupByNumber returns a group based on the number of the group, or nil if the group number does not exist +func (m *Match) GroupByNumber(num int) *Group { + // check our sparse map + if m.sparseCaps != nil { + if newNum, ok := m.sparseCaps[num]; ok { + num = newNum + } + } + if num >= len(m.matchcount) || num < 0 { + return nil + } + + if num == 0 { + return &m.Group + } + + m.populateOtherGroups() + + return &m.otherGroups[num-1] +} + +// Groups returns all the capture groups, starting with group 0 (the full match) +func (m *Match) Groups() []Group { + m.populateOtherGroups() + g := make([]Group, len(m.otherGroups)+1) + g[0] = m.Group + copy(g[1:], m.otherGroups) + return g +} + +func (m *Match) populateOtherGroups() { + // Construct all the Group objects first time called + if m.otherGroups == nil { + m.otherGroups = make([]Group, len(m.matchcount)-1) + for i := 0; i < len(m.otherGroups); i++ { + m.otherGroups[i] = newGroup(m.regex.GroupNameFromNumber(i+1), m.text, m.matches[i+1], m.matchcount[i+1]) + } + } +} + +func (m *Match) groupValueAppendToBuf(groupnum int, buf *bytes.Buffer) { + c := m.matchcount[groupnum] + if c == 0 { + return + } + + matches := m.matches[groupnum] + + index := matches[(c-1)*2] + last := index + matches[(c*2)-1] + + for ; index < last; index++ { + buf.WriteRune(m.text[index]) + } +} + +func newGroup(name string, text []rune, caps []int, capcount int) Group { + g := Group{} + g.text = text + if capcount > 0 { + g.Index = caps[(capcount-1)*2] + g.Length = caps[(capcount*2)-1] + } + g.Name = name + g.Captures = make([]Capture, capcount) + for i := 0; i < capcount; i++ { + g.Captures[i] = Capture{ + text: text, + Index: caps[i*2], + Length: caps[i*2+1], + } + } + //log.Printf("newGroup! capcount %v, %+v", capcount, g) + + return g +} + +func (m *Match) dump() string { + buf := &bytes.Buffer{} + buf.WriteRune('\n') + if len(m.sparseCaps) > 0 { + for k, v := range m.sparseCaps { + fmt.Fprintf(buf, "Slot %v -> %v\n", k, v) + } + } + + for i, g := range m.Groups() { + fmt.Fprintf(buf, "Group %v (%v), %v caps:\n", i, g.Name, len(g.Captures)) + + for _, c := range g.Captures { + fmt.Fprintf(buf, " (%v, %v) %v\n", c.Index, c.Length, c.String()) + } + } + /* + for i := 0; i < len(m.matchcount); i++ { + fmt.Fprintf(buf, "\nGroup %v (%v):\n", i, m.regex.GroupNameFromNumber(i)) + + for j := 0; j < m.matchcount[i]; j++ { + text := "" + + if m.matches[i][j*2] >= 0 { + start := m.matches[i][j*2] + text = m.text[start : start+m.matches[i][j*2+1]] + } + + fmt.Fprintf(buf, " (%v, %v) %v\n", m.matches[i][j*2], m.matches[i][j*2+1], text) + } + } + */ + return buf.String() +} diff --git a/vendor/github.com/dlclark/regexp2/regexp.go b/vendor/github.com/dlclark/regexp2/regexp.go new file mode 100644 index 0000000..a7ddbaf --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/regexp.go @@ -0,0 +1,395 @@ +/* +Package regexp2 is a regexp package that has an interface similar to Go's framework regexp engine but uses a +more feature full regex engine behind the scenes. + +It doesn't have constant time guarantees, but it allows backtracking and is compatible with Perl5 and .NET. +You'll likely be better off with the RE2 engine from the regexp package and should only use this if you +need to write very complex patterns or require compatibility with .NET. +*/ +package regexp2 + +import ( + "errors" + "math" + "strconv" + "sync" + "time" + + "github.com/dlclark/regexp2/syntax" +) + +var ( + // DefaultMatchTimeout used when running regexp matches -- "forever" + DefaultMatchTimeout = time.Duration(math.MaxInt64) + // DefaultUnmarshalOptions used when unmarshaling a regex from text + DefaultUnmarshalOptions = None +) + +// Regexp is the representation of a compiled regular expression. +// A Regexp is safe for concurrent use by multiple goroutines. +type Regexp struct { + // A match will time out if it takes (approximately) more than + // MatchTimeout. This is a safety check in case the match + // encounters catastrophic backtracking. The default value + // (DefaultMatchTimeout) causes all time out checking to be + // suppressed. + MatchTimeout time.Duration + + // read-only after Compile + pattern string // as passed to Compile + options RegexOptions // options + + caps map[int]int // capnum->index + capnames map[string]int //capture group name -> index + capslist []string //sorted list of capture group names + capsize int // size of the capture array + + code *syntax.Code // compiled program + + // cache of machines for running regexp + muRun *sync.Mutex + runner []*runner +} + +// Compile parses a regular expression and returns, if successful, +// a Regexp object that can be used to match against text. +func Compile(expr string, opt RegexOptions) (*Regexp, error) { + // parse it + tree, err := syntax.Parse(expr, syntax.RegexOptions(opt)) + if err != nil { + return nil, err + } + + // translate it to code + code, err := syntax.Write(tree) + if err != nil { + return nil, err + } + + // return it + return &Regexp{ + pattern: expr, + options: opt, + caps: code.Caps, + capnames: tree.Capnames, + capslist: tree.Caplist, + capsize: code.Capsize, + code: code, + MatchTimeout: DefaultMatchTimeout, + muRun: &sync.Mutex{}, + }, nil +} + +// MustCompile is like Compile but panics if the expression cannot be parsed. +// It simplifies safe initialization of global variables holding compiled regular +// expressions. +func MustCompile(str string, opt RegexOptions) *Regexp { + regexp, error := Compile(str, opt) + if error != nil { + panic(`regexp2: Compile(` + quote(str) + `): ` + error.Error()) + } + return regexp +} + +// Escape adds backslashes to any special characters in the input string +func Escape(input string) string { + return syntax.Escape(input) +} + +// Unescape removes any backslashes from previously-escaped special characters in the input string +func Unescape(input string) (string, error) { + return syntax.Unescape(input) +} + +// SetTimeoutPeriod is a debug function that sets the frequency of the timeout goroutine's sleep cycle. +// Defaults to 100ms. The only benefit of setting this lower is that the 1 background goroutine that manages +// timeouts may exit slightly sooner after all the timeouts have expired. See Github issue #63 +func SetTimeoutCheckPeriod(d time.Duration) { + clockPeriod = d +} + +// StopTimeoutClock should only be used in unit tests to prevent the timeout clock goroutine +// from appearing like a leaking goroutine +func StopTimeoutClock() { + stopClock() +} + +// String returns the source text used to compile the regular expression. +func (re *Regexp) String() string { + return re.pattern +} + +func quote(s string) string { + if strconv.CanBackquote(s) { + return "`" + s + "`" + } + return strconv.Quote(s) +} + +// RegexOptions impact the runtime and parsing behavior +// for each specific regex. They are setable in code as well +// as in the regex pattern itself. +type RegexOptions int32 + +const ( + None RegexOptions = 0x0 + IgnoreCase = 0x0001 // "i" + Multiline = 0x0002 // "m" + ExplicitCapture = 0x0004 // "n" + Compiled = 0x0008 // "c" + Singleline = 0x0010 // "s" + IgnorePatternWhitespace = 0x0020 // "x" + RightToLeft = 0x0040 // "r" + Debug = 0x0080 // "d" + ECMAScript = 0x0100 // "e" + RE2 = 0x0200 // RE2 (regexp package) compatibility mode + Unicode = 0x0400 // "u" +) + +func (re *Regexp) RightToLeft() bool { + return re.options&RightToLeft != 0 +} + +func (re *Regexp) Debug() bool { + return re.options&Debug != 0 +} + +// Replace searches the input string and replaces each match found with the replacement text. +// Count will limit the number of matches attempted and startAt will allow +// us to skip past possible matches at the start of the input (left or right depending on RightToLeft option). +// Set startAt and count to -1 to go through the whole string +func (re *Regexp) Replace(input, replacement string, startAt, count int) (string, error) { + data, err := syntax.NewReplacerData(replacement, re.caps, re.capsize, re.capnames, syntax.RegexOptions(re.options)) + if err != nil { + return "", err + } + //TODO: cache ReplacerData + + return replace(re, data, nil, input, startAt, count) +} + +// ReplaceFunc searches the input string and replaces each match found using the string from the evaluator +// Count will limit the number of matches attempted and startAt will allow +// us to skip past possible matches at the start of the input (left or right depending on RightToLeft option). +// Set startAt and count to -1 to go through the whole string. +func (re *Regexp) ReplaceFunc(input string, evaluator MatchEvaluator, startAt, count int) (string, error) { + return replace(re, nil, evaluator, input, startAt, count) +} + +// FindStringMatch searches the input string for a Regexp match +func (re *Regexp) FindStringMatch(s string) (*Match, error) { + // convert string to runes + return re.run(false, -1, getRunes(s)) +} + +// FindRunesMatch searches the input rune slice for a Regexp match +func (re *Regexp) FindRunesMatch(r []rune) (*Match, error) { + return re.run(false, -1, r) +} + +// FindStringMatchStartingAt searches the input string for a Regexp match starting at the startAt index +func (re *Regexp) FindStringMatchStartingAt(s string, startAt int) (*Match, error) { + if startAt > len(s) { + return nil, errors.New("startAt must be less than the length of the input string") + } + r, startAt := re.getRunesAndStart(s, startAt) + if startAt == -1 { + // we didn't find our start index in the string -- that's a problem + return nil, errors.New("startAt must align to the start of a valid rune in the input string") + } + + return re.run(false, startAt, r) +} + +// FindRunesMatchStartingAt searches the input rune slice for a Regexp match starting at the startAt index +func (re *Regexp) FindRunesMatchStartingAt(r []rune, startAt int) (*Match, error) { + return re.run(false, startAt, r) +} + +// FindNextMatch returns the next match in the same input string as the match parameter. +// Will return nil if there is no next match or if given a nil match. +func (re *Regexp) FindNextMatch(m *Match) (*Match, error) { + if m == nil { + return nil, nil + } + + // If previous match was empty, advance by one before matching to prevent + // infinite loop + startAt := m.textpos + if m.Length == 0 { + if m.textpos == len(m.text) { + return nil, nil + } + + if re.RightToLeft() { + startAt-- + } else { + startAt++ + } + } + return re.run(false, startAt, m.text) +} + +// MatchString return true if the string matches the regex +// error will be set if a timeout occurs +func (re *Regexp) MatchString(s string) (bool, error) { + m, err := re.run(true, -1, getRunes(s)) + if err != nil { + return false, err + } + return m != nil, nil +} + +func (re *Regexp) getRunesAndStart(s string, startAt int) ([]rune, int) { + if startAt < 0 { + if re.RightToLeft() { + r := getRunes(s) + return r, len(r) + } + return getRunes(s), 0 + } + ret := make([]rune, len(s)) + i := 0 + runeIdx := -1 + for strIdx, r := range s { + if strIdx == startAt { + runeIdx = i + } + ret[i] = r + i++ + } + if startAt == len(s) { + runeIdx = i + } + return ret[:i], runeIdx +} + +func getRunes(s string) []rune { + return []rune(s) +} + +// MatchRunes return true if the runes matches the regex +// error will be set if a timeout occurs +func (re *Regexp) MatchRunes(r []rune) (bool, error) { + m, err := re.run(true, -1, r) + if err != nil { + return false, err + } + return m != nil, nil +} + +// GetGroupNames Returns the set of strings used to name capturing groups in the expression. +func (re *Regexp) GetGroupNames() []string { + var result []string + + if re.capslist == nil { + result = make([]string, re.capsize) + + for i := 0; i < len(result); i++ { + result[i] = strconv.Itoa(i) + } + } else { + result = make([]string, len(re.capslist)) + copy(result, re.capslist) + } + + return result +} + +// GetGroupNumbers returns the integer group numbers corresponding to a group name. +func (re *Regexp) GetGroupNumbers() []int { + var result []int + + if re.caps == nil { + result = make([]int, re.capsize) + + for i := 0; i < len(result); i++ { + result[i] = i + } + } else { + result = make([]int, len(re.caps)) + + for k, v := range re.caps { + result[v] = k + } + } + + return result +} + +// GroupNameFromNumber retrieves a group name that corresponds to a group number. +// It will return "" for and unknown group number. Unnamed groups automatically +// receive a name that is the decimal string equivalent of its number. +func (re *Regexp) GroupNameFromNumber(i int) string { + if re.capslist == nil { + if i >= 0 && i < re.capsize { + return strconv.Itoa(i) + } + + return "" + } + + if re.caps != nil { + var ok bool + if i, ok = re.caps[i]; !ok { + return "" + } + } + + if i >= 0 && i < len(re.capslist) { + return re.capslist[i] + } + + return "" +} + +// GroupNumberFromName returns a group number that corresponds to a group name. +// Returns -1 if the name is not a recognized group name. Numbered groups +// automatically get a group name that is the decimal string equivalent of its number. +func (re *Regexp) GroupNumberFromName(name string) int { + // look up name if we have a hashtable of names + if re.capnames != nil { + if k, ok := re.capnames[name]; ok { + return k + } + + return -1 + } + + // convert to an int if it looks like a number + result := 0 + for i := 0; i < len(name); i++ { + ch := name[i] + + if ch > '9' || ch < '0' { + return -1 + } + + result *= 10 + result += int(ch - '0') + } + + // return int if it's in range + if result >= 0 && result < re.capsize { + return result + } + + return -1 +} + +// MarshalText implements [encoding.TextMarshaler]. The output +// matches that of calling the [Regexp.String] method. +func (re *Regexp) MarshalText() ([]byte, error) { + return []byte(re.String()), nil +} + +// UnmarshalText implements [encoding.TextUnmarshaler] by calling +// [Compile] on the encoded value. +func (re *Regexp) UnmarshalText(text []byte) error { + newRE, err := Compile(string(text), DefaultUnmarshalOptions) + if err != nil { + return err + } + *re = *newRE + return nil +} diff --git a/vendor/github.com/dlclark/regexp2/replace.go b/vendor/github.com/dlclark/regexp2/replace.go new file mode 100644 index 0000000..0376bd9 --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/replace.go @@ -0,0 +1,177 @@ +package regexp2 + +import ( + "bytes" + "errors" + + "github.com/dlclark/regexp2/syntax" +) + +const ( + replaceSpecials = 4 + replaceLeftPortion = -1 + replaceRightPortion = -2 + replaceLastGroup = -3 + replaceWholeString = -4 +) + +// MatchEvaluator is a function that takes a match and returns a replacement string to be used +type MatchEvaluator func(Match) string + +// Three very similar algorithms appear below: replace (pattern), +// replace (evaluator), and split. + +// Replace Replaces all occurrences of the regex in the string with the +// replacement pattern. +// +// Note that the special case of no matches is handled on its own: +// with no matches, the input string is returned unchanged. +// The right-to-left case is split out because StringBuilder +// doesn't handle right-to-left string building directly very well. +func replace(regex *Regexp, data *syntax.ReplacerData, evaluator MatchEvaluator, input string, startAt, count int) (string, error) { + if count < -1 { + return "", errors.New("Count too small") + } + if count == 0 { + return "", nil + } + + m, err := regex.FindStringMatchStartingAt(input, startAt) + + if err != nil { + return "", err + } + if m == nil { + return input, nil + } + + buf := &bytes.Buffer{} + text := m.text + + if !regex.RightToLeft() { + prevat := 0 + for m != nil { + if m.Index != prevat { + buf.WriteString(string(text[prevat:m.Index])) + } + prevat = m.Index + m.Length + if evaluator == nil { + replacementImpl(data, buf, m) + } else { + buf.WriteString(evaluator(*m)) + } + + count-- + if count == 0 { + break + } + m, err = regex.FindNextMatch(m) + if err != nil { + return "", nil + } + } + + if prevat < len(text) { + buf.WriteString(string(text[prevat:])) + } + } else { + prevat := len(text) + var al []string + + for m != nil { + if m.Index+m.Length != prevat { + al = append(al, string(text[m.Index+m.Length:prevat])) + } + prevat = m.Index + if evaluator == nil { + replacementImplRTL(data, &al, m) + } else { + al = append(al, evaluator(*m)) + } + + count-- + if count == 0 { + break + } + m, err = regex.FindNextMatch(m) + if err != nil { + return "", nil + } + } + + if prevat > 0 { + buf.WriteString(string(text[:prevat])) + } + + for i := len(al) - 1; i >= 0; i-- { + buf.WriteString(al[i]) + } + } + + return buf.String(), nil +} + +// Given a Match, emits into the StringBuilder the evaluated +// substitution pattern. +func replacementImpl(data *syntax.ReplacerData, buf *bytes.Buffer, m *Match) { + for _, r := range data.Rules { + + if r >= 0 { // string lookup + buf.WriteString(data.Strings[r]) + } else if r < -replaceSpecials { // group lookup + m.groupValueAppendToBuf(-replaceSpecials-1-r, buf) + } else { + switch -replaceSpecials - 1 - r { // special insertion patterns + case replaceLeftPortion: + for i := 0; i < m.Index; i++ { + buf.WriteRune(m.text[i]) + } + case replaceRightPortion: + for i := m.Index + m.Length; i < len(m.text); i++ { + buf.WriteRune(m.text[i]) + } + case replaceLastGroup: + m.groupValueAppendToBuf(m.GroupCount()-1, buf) + case replaceWholeString: + for i := 0; i < len(m.text); i++ { + buf.WriteRune(m.text[i]) + } + } + } + } +} + +func replacementImplRTL(data *syntax.ReplacerData, al *[]string, m *Match) { + l := *al + buf := &bytes.Buffer{} + + for _, r := range data.Rules { + buf.Reset() + if r >= 0 { // string lookup + l = append(l, data.Strings[r]) + } else if r < -replaceSpecials { // group lookup + m.groupValueAppendToBuf(-replaceSpecials-1-r, buf) + l = append(l, buf.String()) + } else { + switch -replaceSpecials - 1 - r { // special insertion patterns + case replaceLeftPortion: + for i := 0; i < m.Index; i++ { + buf.WriteRune(m.text[i]) + } + case replaceRightPortion: + for i := m.Index + m.Length; i < len(m.text); i++ { + buf.WriteRune(m.text[i]) + } + case replaceLastGroup: + m.groupValueAppendToBuf(m.GroupCount()-1, buf) + case replaceWholeString: + for i := 0; i < len(m.text); i++ { + buf.WriteRune(m.text[i]) + } + } + l = append(l, buf.String()) + } + } + + *al = l +} diff --git a/vendor/github.com/dlclark/regexp2/runner.go b/vendor/github.com/dlclark/regexp2/runner.go new file mode 100644 index 0000000..56759f1 --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/runner.go @@ -0,0 +1,1613 @@ +package regexp2 + +import ( + "bytes" + "errors" + "fmt" + "math" + "strconv" + "strings" + "time" + "unicode" + + "github.com/dlclark/regexp2/syntax" +) + +type runner struct { + re *Regexp + code *syntax.Code + + runtextstart int // starting point for search + + runtext []rune // text to search + runtextpos int // current position in text + runtextend int + + // The backtracking stack. Opcodes use this to store data regarding + // what they have matched and where to backtrack to. Each "frame" on + // the stack takes the form of [CodePosition Data1 Data2...], where + // CodePosition is the position of the current opcode and + // the data values are all optional. The CodePosition can be negative, and + // these values (also called "back2") are used by the BranchMark family of opcodes + // to indicate whether they are backtracking after a successful or failed + // match. + // When we backtrack, we pop the CodePosition off the stack, set the current + // instruction pointer to that code position, and mark the opcode + // with a backtracking flag ("Back"). Each opcode then knows how to + // handle its own data. + runtrack []int + runtrackpos int + + // This stack is used to track text positions across different opcodes. + // For example, in /(a*b)+/, the parentheses result in a SetMark/CaptureMark + // pair. SetMark records the text position before we match a*b. Then + // CaptureMark uses that position to figure out where the capture starts. + // Opcodes which push onto this stack are always paired with other opcodes + // which will pop the value from it later. A successful match should mean + // that this stack is empty. + runstack []int + runstackpos int + + // The crawl stack is used to keep track of captures. Every time a group + // has a capture, we push its group number onto the runcrawl stack. In + // the case of a balanced match, we push BOTH groups onto the stack. + runcrawl []int + runcrawlpos int + + runtrackcount int // count of states that may do backtracking + + runmatch *Match // result object + + ignoreTimeout bool + timeout time.Duration // timeout in milliseconds (needed for actual) + deadline fasttime + + operator syntax.InstOp + codepos int + rightToLeft bool + caseInsensitive bool +} + +// run searches for matches and can continue from the previous match +// +// quick is usually false, but can be true to not return matches, just put it in caches +// textstart is -1 to start at the "beginning" (depending on Right-To-Left), otherwise an index in input +// input is the string to search for our regex pattern +func (re *Regexp) run(quick bool, textstart int, input []rune) (*Match, error) { + + // get a cached runner + runner := re.getRunner() + defer re.putRunner(runner) + + if textstart < 0 { + if re.RightToLeft() { + textstart = len(input) + } else { + textstart = 0 + } + } + + return runner.scan(input, textstart, quick, re.MatchTimeout) +} + +// Scans the string to find the first match. Uses the Match object +// both to feed text in and as a place to store matches that come out. +// +// All the action is in the Go() method. Our +// responsibility is to load up the class members before +// calling Go. +// +// The optimizer can compute a set of candidate starting characters, +// and we could use a separate method Skip() that will quickly scan past +// any characters that we know can't match. +func (r *runner) scan(rt []rune, textstart int, quick bool, timeout time.Duration) (*Match, error) { + r.timeout = timeout + r.ignoreTimeout = (time.Duration(math.MaxInt64) == timeout) + r.runtextstart = textstart + r.runtext = rt + r.runtextend = len(rt) + + stoppos := r.runtextend + bump := 1 + + if r.re.RightToLeft() { + bump = -1 + stoppos = 0 + } + + r.runtextpos = textstart + initted := false + + r.startTimeoutWatch() + for { + if r.re.Debug() { + //fmt.Printf("\nSearch content: %v\n", string(r.runtext)) + fmt.Printf("\nSearch range: from 0 to %v\n", r.runtextend) + fmt.Printf("Firstchar search starting at %v stopping at %v\n", r.runtextpos, stoppos) + } + + if r.findFirstChar() { + if err := r.checkTimeout(); err != nil { + return nil, err + } + + if !initted { + r.initMatch() + initted = true + } + + if r.re.Debug() { + fmt.Printf("Executing engine starting at %v\n\n", r.runtextpos) + } + + if err := r.execute(); err != nil { + return nil, err + } + + if r.runmatch.matchcount[0] > 0 { + // We'll return a match even if it touches a previous empty match + return r.tidyMatch(quick), nil + } + + // reset state for another go + r.runtrackpos = len(r.runtrack) + r.runstackpos = len(r.runstack) + r.runcrawlpos = len(r.runcrawl) + } + + // failure! + + if r.runtextpos == stoppos { + r.tidyMatch(true) + return nil, nil + } + + // Recognize leading []* and various anchors, and bump on failure accordingly + + // r.bump by one and start again + + r.runtextpos += bump + } + // We never get here +} + +func (r *runner) execute() error { + + r.goTo(0) + + for { + + if r.re.Debug() { + r.dumpState() + } + + if err := r.checkTimeout(); err != nil { + return err + } + + switch r.operator { + case syntax.Stop: + return nil + + case syntax.Nothing: + break + + case syntax.Goto: + r.goTo(r.operand(0)) + continue + + case syntax.Testref: + if !r.runmatch.isMatched(r.operand(0)) { + break + } + r.advance(1) + continue + + case syntax.Lazybranch: + r.trackPush1(r.textPos()) + r.advance(1) + continue + + case syntax.Lazybranch | syntax.Back: + r.trackPop() + r.textto(r.trackPeek()) + r.goTo(r.operand(0)) + continue + + case syntax.Setmark: + r.stackPush(r.textPos()) + r.trackPush() + r.advance(0) + continue + + case syntax.Nullmark: + r.stackPush(-1) + r.trackPush() + r.advance(0) + continue + + case syntax.Setmark | syntax.Back, syntax.Nullmark | syntax.Back: + r.stackPop() + break + + case syntax.Getmark: + r.stackPop() + r.trackPush1(r.stackPeek()) + r.textto(r.stackPeek()) + r.advance(0) + continue + + case syntax.Getmark | syntax.Back: + r.trackPop() + r.stackPush(r.trackPeek()) + break + + case syntax.Capturemark: + if r.operand(1) != -1 && !r.runmatch.isMatched(r.operand(1)) { + break + } + r.stackPop() + if r.operand(1) != -1 { + r.transferCapture(r.operand(0), r.operand(1), r.stackPeek(), r.textPos()) + } else { + r.capture(r.operand(0), r.stackPeek(), r.textPos()) + } + r.trackPush1(r.stackPeek()) + + r.advance(2) + + continue + + case syntax.Capturemark | syntax.Back: + r.trackPop() + r.stackPush(r.trackPeek()) + r.uncapture() + if r.operand(0) != -1 && r.operand(1) != -1 { + r.uncapture() + } + + break + + case syntax.Branchmark: + r.stackPop() + + matched := r.textPos() - r.stackPeek() + + if matched != 0 { // Nonempty match -> loop now + r.trackPush2(r.stackPeek(), r.textPos()) // Save old mark, textpos + r.stackPush(r.textPos()) // Make new mark + r.goTo(r.operand(0)) // Loop + } else { // Empty match -> straight now + r.trackPushNeg1(r.stackPeek()) // Save old mark + r.advance(1) // Straight + } + continue + + case syntax.Branchmark | syntax.Back: + r.trackPopN(2) + r.stackPop() + r.textto(r.trackPeekN(1)) // Recall position + r.trackPushNeg1(r.trackPeek()) // Save old mark + r.advance(1) // Straight + continue + + case syntax.Branchmark | syntax.Back2: + r.trackPop() + r.stackPush(r.trackPeek()) // Recall old mark + break // Backtrack + + case syntax.Lazybranchmark: + { + // We hit this the first time through a lazy loop and after each + // successful match of the inner expression. It simply continues + // on and doesn't loop. + r.stackPop() + + oldMarkPos := r.stackPeek() + + if r.textPos() != oldMarkPos { // Nonempty match -> try to loop again by going to 'back' state + if oldMarkPos != -1 { + r.trackPush2(oldMarkPos, r.textPos()) // Save old mark, textpos + } else { + r.trackPush2(r.textPos(), r.textPos()) + } + } else { + // The inner expression found an empty match, so we'll go directly to 'back2' if we + // backtrack. In this case, we need to push something on the stack, since back2 pops. + // However, in the case of ()+? or similar, this empty match may be legitimate, so push the text + // position associated with that empty match. + r.stackPush(oldMarkPos) + + r.trackPushNeg1(r.stackPeek()) // Save old mark + } + r.advance(1) + continue + } + + case syntax.Lazybranchmark | syntax.Back: + + // After the first time, Lazybranchmark | syntax.Back occurs + // with each iteration of the loop, and therefore with every attempted + // match of the inner expression. We'll try to match the inner expression, + // then go back to Lazybranchmark if successful. If the inner expression + // fails, we go to Lazybranchmark | syntax.Back2 + + r.trackPopN(2) + pos := r.trackPeekN(1) + r.trackPushNeg1(r.trackPeek()) // Save old mark + r.stackPush(pos) // Make new mark + r.textto(pos) // Recall position + r.goTo(r.operand(0)) // Loop + continue + + case syntax.Lazybranchmark | syntax.Back2: + // The lazy loop has failed. We'll do a true backtrack and + // start over before the lazy loop. + r.stackPop() + r.trackPop() + r.stackPush(r.trackPeek()) // Recall old mark + break + + case syntax.Setcount: + r.stackPush2(r.textPos(), r.operand(0)) + r.trackPush() + r.advance(1) + continue + + case syntax.Nullcount: + r.stackPush2(-1, r.operand(0)) + r.trackPush() + r.advance(1) + continue + + case syntax.Setcount | syntax.Back: + r.stackPopN(2) + break + + case syntax.Nullcount | syntax.Back: + r.stackPopN(2) + break + + case syntax.Branchcount: + // r.stackPush: + // 0: Mark + // 1: Count + + r.stackPopN(2) + mark := r.stackPeek() + count := r.stackPeekN(1) + matched := r.textPos() - mark + + if count >= r.operand(1) || (matched == 0 && count >= 0) { // Max loops or empty match -> straight now + r.trackPushNeg2(mark, count) // Save old mark, count + r.advance(2) // Straight + } else { // Nonempty match -> count+loop now + r.trackPush1(mark) // remember mark + r.stackPush2(r.textPos(), count+1) // Make new mark, incr count + r.goTo(r.operand(0)) // Loop + } + continue + + case syntax.Branchcount | syntax.Back: + // r.trackPush: + // 0: Previous mark + // r.stackPush: + // 0: Mark (= current pos, discarded) + // 1: Count + r.trackPop() + r.stackPopN(2) + if r.stackPeekN(1) > 0 { // Positive -> can go straight + r.textto(r.stackPeek()) // Zap to mark + r.trackPushNeg2(r.trackPeek(), r.stackPeekN(1)-1) // Save old mark, old count + r.advance(2) // Straight + continue + } + r.stackPush2(r.trackPeek(), r.stackPeekN(1)-1) // recall old mark, old count + break + + case syntax.Branchcount | syntax.Back2: + // r.trackPush: + // 0: Previous mark + // 1: Previous count + r.trackPopN(2) + r.stackPush2(r.trackPeek(), r.trackPeekN(1)) // Recall old mark, old count + break // Backtrack + + case syntax.Lazybranchcount: + // r.stackPush: + // 0: Mark + // 1: Count + + r.stackPopN(2) + mark := r.stackPeek() + count := r.stackPeekN(1) + + if count < 0 { // Negative count -> loop now + r.trackPushNeg1(mark) // Save old mark + r.stackPush2(r.textPos(), count+1) // Make new mark, incr count + r.goTo(r.operand(0)) // Loop + } else { // Nonneg count -> straight now + r.trackPush3(mark, count, r.textPos()) // Save mark, count, position + r.advance(2) // Straight + } + continue + + case syntax.Lazybranchcount | syntax.Back: + // r.trackPush: + // 0: Mark + // 1: Count + // 2: r.textPos + + r.trackPopN(3) + mark := r.trackPeek() + textpos := r.trackPeekN(2) + + if r.trackPeekN(1) < r.operand(1) && textpos != mark { // Under limit and not empty match -> loop + r.textto(textpos) // Recall position + r.stackPush2(textpos, r.trackPeekN(1)+1) // Make new mark, incr count + r.trackPushNeg1(mark) // Save old mark + r.goTo(r.operand(0)) // Loop + continue + } else { // Max loops or empty match -> backtrack + r.stackPush2(r.trackPeek(), r.trackPeekN(1)) // Recall old mark, count + break // backtrack + } + + case syntax.Lazybranchcount | syntax.Back2: + // r.trackPush: + // 0: Previous mark + // r.stackPush: + // 0: Mark (== current pos, discarded) + // 1: Count + r.trackPop() + r.stackPopN(2) + r.stackPush2(r.trackPeek(), r.stackPeekN(1)-1) // Recall old mark, count + break // Backtrack + + case syntax.Setjump: + r.stackPush2(r.trackpos(), r.crawlpos()) + r.trackPush() + r.advance(0) + continue + + case syntax.Setjump | syntax.Back: + r.stackPopN(2) + break + + case syntax.Backjump: + // r.stackPush: + // 0: Saved trackpos + // 1: r.crawlpos + r.stackPopN(2) + r.trackto(r.stackPeek()) + + for r.crawlpos() != r.stackPeekN(1) { + r.uncapture() + } + + break + + case syntax.Forejump: + // r.stackPush: + // 0: Saved trackpos + // 1: r.crawlpos + r.stackPopN(2) + r.trackto(r.stackPeek()) + r.trackPush1(r.stackPeekN(1)) + r.advance(0) + continue + + case syntax.Forejump | syntax.Back: + // r.trackPush: + // 0: r.crawlpos + r.trackPop() + + for r.crawlpos() != r.trackPeek() { + r.uncapture() + } + + break + + case syntax.Bol: + if r.leftchars() > 0 && r.charAt(r.textPos()-1) != '\n' { + break + } + r.advance(0) + continue + + case syntax.Eol: + if r.rightchars() > 0 && r.charAt(r.textPos()) != '\n' { + break + } + r.advance(0) + continue + + case syntax.Boundary: + if !r.isBoundary(r.textPos(), 0, r.runtextend) { + break + } + r.advance(0) + continue + + case syntax.Nonboundary: + if r.isBoundary(r.textPos(), 0, r.runtextend) { + break + } + r.advance(0) + continue + + case syntax.ECMABoundary: + if !r.isECMABoundary(r.textPos(), 0, r.runtextend) { + break + } + r.advance(0) + continue + + case syntax.NonECMABoundary: + if r.isECMABoundary(r.textPos(), 0, r.runtextend) { + break + } + r.advance(0) + continue + + case syntax.Beginning: + if r.leftchars() > 0 { + break + } + r.advance(0) + continue + + case syntax.Start: + if r.textPos() != r.textstart() { + break + } + r.advance(0) + continue + + case syntax.EndZ: + rchars := r.rightchars() + if rchars > 1 { + break + } + // RE2 and EcmaScript define $ as "asserts position at the end of the string" + // PCRE/.NET adds "or before the line terminator right at the end of the string (if any)" + if (r.re.options & (RE2 | ECMAScript)) != 0 { + // RE2/Ecmascript mode + if rchars > 0 { + break + } + } else if rchars == 1 && r.charAt(r.textPos()) != '\n' { + // "regular" mode + break + } + + r.advance(0) + continue + + case syntax.End: + if r.rightchars() > 0 { + break + } + r.advance(0) + continue + + case syntax.One: + if r.forwardchars() < 1 || r.forwardcharnext() != rune(r.operand(0)) { + break + } + + r.advance(1) + continue + + case syntax.Notone: + if r.forwardchars() < 1 || r.forwardcharnext() == rune(r.operand(0)) { + break + } + + r.advance(1) + continue + + case syntax.Set: + + if r.forwardchars() < 1 || !r.code.Sets[r.operand(0)].CharIn(r.forwardcharnext()) { + break + } + + r.advance(1) + continue + + case syntax.Multi: + if !r.runematch(r.code.Strings[r.operand(0)]) { + break + } + + r.advance(1) + continue + + case syntax.Ref: + + capnum := r.operand(0) + + if r.runmatch.isMatched(capnum) { + if !r.refmatch(r.runmatch.matchIndex(capnum), r.runmatch.matchLength(capnum)) { + break + } + } else { + if (r.re.options & ECMAScript) == 0 { + break + } + } + + r.advance(1) + continue + + case syntax.Onerep: + + c := r.operand(1) + + if r.forwardchars() < c { + break + } + + ch := rune(r.operand(0)) + + for c > 0 { + if r.forwardcharnext() != ch { + goto BreakBackward + } + c-- + } + + r.advance(2) + continue + + case syntax.Notonerep: + + c := r.operand(1) + + if r.forwardchars() < c { + break + } + ch := rune(r.operand(0)) + + for c > 0 { + if r.forwardcharnext() == ch { + goto BreakBackward + } + c-- + } + + r.advance(2) + continue + + case syntax.Setrep: + + c := r.operand(1) + + if r.forwardchars() < c { + break + } + + set := r.code.Sets[r.operand(0)] + + for c > 0 { + if !set.CharIn(r.forwardcharnext()) { + goto BreakBackward + } + c-- + } + + r.advance(2) + continue + + case syntax.Oneloop: + + c := r.operand(1) + + if c > r.forwardchars() { + c = r.forwardchars() + } + + ch := rune(r.operand(0)) + i := c + + for ; i > 0; i-- { + if r.forwardcharnext() != ch { + r.backwardnext() + break + } + } + + if c > i { + r.trackPush2(c-i-1, r.textPos()-r.bump()) + } + + r.advance(2) + continue + + case syntax.Notoneloop: + + c := r.operand(1) + + if c > r.forwardchars() { + c = r.forwardchars() + } + + ch := rune(r.operand(0)) + i := c + + for ; i > 0; i-- { + if r.forwardcharnext() == ch { + r.backwardnext() + break + } + } + + if c > i { + r.trackPush2(c-i-1, r.textPos()-r.bump()) + } + + r.advance(2) + continue + + case syntax.Setloop: + + c := r.operand(1) + + if c > r.forwardchars() { + c = r.forwardchars() + } + + set := r.code.Sets[r.operand(0)] + i := c + + for ; i > 0; i-- { + if !set.CharIn(r.forwardcharnext()) { + r.backwardnext() + break + } + } + + if c > i { + r.trackPush2(c-i-1, r.textPos()-r.bump()) + } + + r.advance(2) + continue + + case syntax.Oneloop | syntax.Back, syntax.Notoneloop | syntax.Back: + + r.trackPopN(2) + i := r.trackPeek() + pos := r.trackPeekN(1) + + r.textto(pos) + + if i > 0 { + r.trackPush2(i-1, pos-r.bump()) + } + + r.advance(2) + continue + + case syntax.Setloop | syntax.Back: + + r.trackPopN(2) + i := r.trackPeek() + pos := r.trackPeekN(1) + + r.textto(pos) + + if i > 0 { + r.trackPush2(i-1, pos-r.bump()) + } + + r.advance(2) + continue + + case syntax.Onelazy, syntax.Notonelazy: + + c := r.operand(1) + + if c > r.forwardchars() { + c = r.forwardchars() + } + + if c > 0 { + r.trackPush2(c-1, r.textPos()) + } + + r.advance(2) + continue + + case syntax.Setlazy: + + c := r.operand(1) + + if c > r.forwardchars() { + c = r.forwardchars() + } + + if c > 0 { + r.trackPush2(c-1, r.textPos()) + } + + r.advance(2) + continue + + case syntax.Onelazy | syntax.Back: + + r.trackPopN(2) + pos := r.trackPeekN(1) + r.textto(pos) + + if r.forwardcharnext() != rune(r.operand(0)) { + break + } + + i := r.trackPeek() + + if i > 0 { + r.trackPush2(i-1, pos+r.bump()) + } + + r.advance(2) + continue + + case syntax.Notonelazy | syntax.Back: + + r.trackPopN(2) + pos := r.trackPeekN(1) + r.textto(pos) + + if r.forwardcharnext() == rune(r.operand(0)) { + break + } + + i := r.trackPeek() + + if i > 0 { + r.trackPush2(i-1, pos+r.bump()) + } + + r.advance(2) + continue + + case syntax.Setlazy | syntax.Back: + + r.trackPopN(2) + pos := r.trackPeekN(1) + r.textto(pos) + + if !r.code.Sets[r.operand(0)].CharIn(r.forwardcharnext()) { + break + } + + i := r.trackPeek() + + if i > 0 { + r.trackPush2(i-1, pos+r.bump()) + } + + r.advance(2) + continue + + default: + return errors.New("unknown state in regex runner") + } + + BreakBackward: + ; + + // "break Backward" comes here: + r.backtrack() + } +} + +// increase the size of stack and track storage +func (r *runner) ensureStorage() { + if r.runstackpos < r.runtrackcount*4 { + doubleIntSlice(&r.runstack, &r.runstackpos) + } + if r.runtrackpos < r.runtrackcount*4 { + doubleIntSlice(&r.runtrack, &r.runtrackpos) + } +} + +func doubleIntSlice(s *[]int, pos *int) { + oldLen := len(*s) + newS := make([]int, oldLen*2) + + copy(newS[oldLen:], *s) + *pos += oldLen + *s = newS +} + +// Save a number on the longjump unrolling stack +func (r *runner) crawl(i int) { + if r.runcrawlpos == 0 { + doubleIntSlice(&r.runcrawl, &r.runcrawlpos) + } + r.runcrawlpos-- + r.runcrawl[r.runcrawlpos] = i +} + +// Remove a number from the longjump unrolling stack +func (r *runner) popcrawl() int { + val := r.runcrawl[r.runcrawlpos] + r.runcrawlpos++ + return val +} + +// Get the height of the stack +func (r *runner) crawlpos() int { + return len(r.runcrawl) - r.runcrawlpos +} + +func (r *runner) advance(i int) { + r.codepos += (i + 1) + r.setOperator(r.code.Codes[r.codepos]) +} + +func (r *runner) goTo(newpos int) { + // when branching backward or in place, ensure storage + if newpos <= r.codepos { + r.ensureStorage() + } + + r.setOperator(r.code.Codes[newpos]) + r.codepos = newpos +} + +func (r *runner) textto(newpos int) { + r.runtextpos = newpos +} + +func (r *runner) trackto(newpos int) { + r.runtrackpos = len(r.runtrack) - newpos +} + +func (r *runner) textstart() int { + return r.runtextstart +} + +func (r *runner) textPos() int { + return r.runtextpos +} + +// push onto the backtracking stack +func (r *runner) trackpos() int { + return len(r.runtrack) - r.runtrackpos +} + +func (r *runner) trackPush() { + r.runtrackpos-- + r.runtrack[r.runtrackpos] = r.codepos +} + +func (r *runner) trackPush1(I1 int) { + r.runtrackpos-- + r.runtrack[r.runtrackpos] = I1 + r.runtrackpos-- + r.runtrack[r.runtrackpos] = r.codepos +} + +func (r *runner) trackPush2(I1, I2 int) { + r.runtrackpos-- + r.runtrack[r.runtrackpos] = I1 + r.runtrackpos-- + r.runtrack[r.runtrackpos] = I2 + r.runtrackpos-- + r.runtrack[r.runtrackpos] = r.codepos +} + +func (r *runner) trackPush3(I1, I2, I3 int) { + r.runtrackpos-- + r.runtrack[r.runtrackpos] = I1 + r.runtrackpos-- + r.runtrack[r.runtrackpos] = I2 + r.runtrackpos-- + r.runtrack[r.runtrackpos] = I3 + r.runtrackpos-- + r.runtrack[r.runtrackpos] = r.codepos +} + +func (r *runner) trackPushNeg1(I1 int) { + r.runtrackpos-- + r.runtrack[r.runtrackpos] = I1 + r.runtrackpos-- + r.runtrack[r.runtrackpos] = -r.codepos +} + +func (r *runner) trackPushNeg2(I1, I2 int) { + r.runtrackpos-- + r.runtrack[r.runtrackpos] = I1 + r.runtrackpos-- + r.runtrack[r.runtrackpos] = I2 + r.runtrackpos-- + r.runtrack[r.runtrackpos] = -r.codepos +} + +func (r *runner) backtrack() { + newpos := r.runtrack[r.runtrackpos] + r.runtrackpos++ + + if r.re.Debug() { + if newpos < 0 { + fmt.Printf(" Backtracking (back2) to code position %v\n", -newpos) + } else { + fmt.Printf(" Backtracking to code position %v\n", newpos) + } + } + + if newpos < 0 { + newpos = -newpos + r.setOperator(r.code.Codes[newpos] | syntax.Back2) + } else { + r.setOperator(r.code.Codes[newpos] | syntax.Back) + } + + // When branching backward, ensure storage + if newpos < r.codepos { + r.ensureStorage() + } + + r.codepos = newpos +} + +func (r *runner) setOperator(op int) { + r.caseInsensitive = (0 != (op & syntax.Ci)) + r.rightToLeft = (0 != (op & syntax.Rtl)) + r.operator = syntax.InstOp(op & ^(syntax.Rtl | syntax.Ci)) +} + +func (r *runner) trackPop() { + r.runtrackpos++ +} + +// pop framesize items from the backtracking stack +func (r *runner) trackPopN(framesize int) { + r.runtrackpos += framesize +} + +// Technically we are actually peeking at items already popped. So if you want to +// get and pop the top item from the stack, you do +// r.trackPop(); +// r.trackPeek(); +func (r *runner) trackPeek() int { + return r.runtrack[r.runtrackpos-1] +} + +// get the ith element down on the backtracking stack +func (r *runner) trackPeekN(i int) int { + return r.runtrack[r.runtrackpos-i-1] +} + +// Push onto the grouping stack +func (r *runner) stackPush(I1 int) { + r.runstackpos-- + r.runstack[r.runstackpos] = I1 +} + +func (r *runner) stackPush2(I1, I2 int) { + r.runstackpos-- + r.runstack[r.runstackpos] = I1 + r.runstackpos-- + r.runstack[r.runstackpos] = I2 +} + +func (r *runner) stackPop() { + r.runstackpos++ +} + +// pop framesize items from the grouping stack +func (r *runner) stackPopN(framesize int) { + r.runstackpos += framesize +} + +// Technically we are actually peeking at items already popped. So if you want to +// get and pop the top item from the stack, you do +// r.stackPop(); +// r.stackPeek(); +func (r *runner) stackPeek() int { + return r.runstack[r.runstackpos-1] +} + +// get the ith element down on the grouping stack +func (r *runner) stackPeekN(i int) int { + return r.runstack[r.runstackpos-i-1] +} + +func (r *runner) operand(i int) int { + return r.code.Codes[r.codepos+i+1] +} + +func (r *runner) leftchars() int { + return r.runtextpos +} + +func (r *runner) rightchars() int { + return r.runtextend - r.runtextpos +} + +func (r *runner) bump() int { + if r.rightToLeft { + return -1 + } + return 1 +} + +func (r *runner) forwardchars() int { + if r.rightToLeft { + return r.runtextpos + } + return r.runtextend - r.runtextpos +} + +func (r *runner) forwardcharnext() rune { + var ch rune + if r.rightToLeft { + r.runtextpos-- + ch = r.runtext[r.runtextpos] + } else { + ch = r.runtext[r.runtextpos] + r.runtextpos++ + } + + if r.caseInsensitive { + return unicode.ToLower(ch) + } + return ch +} + +func (r *runner) runematch(str []rune) bool { + var pos int + + c := len(str) + if !r.rightToLeft { + if r.runtextend-r.runtextpos < c { + return false + } + + pos = r.runtextpos + c + } else { + if r.runtextpos-0 < c { + return false + } + + pos = r.runtextpos + } + + if !r.caseInsensitive { + for c != 0 { + c-- + pos-- + if str[c] != r.runtext[pos] { + return false + } + } + } else { + for c != 0 { + c-- + pos-- + if str[c] != unicode.ToLower(r.runtext[pos]) { + return false + } + } + } + + if !r.rightToLeft { + pos += len(str) + } + + r.runtextpos = pos + + return true +} + +func (r *runner) refmatch(index, len int) bool { + var c, pos, cmpos int + + if !r.rightToLeft { + if r.runtextend-r.runtextpos < len { + return false + } + + pos = r.runtextpos + len + } else { + if r.runtextpos-0 < len { + return false + } + + pos = r.runtextpos + } + cmpos = index + len + + c = len + + if !r.caseInsensitive { + for c != 0 { + c-- + cmpos-- + pos-- + if r.runtext[cmpos] != r.runtext[pos] { + return false + } + + } + } else { + for c != 0 { + c-- + cmpos-- + pos-- + + if unicode.ToLower(r.runtext[cmpos]) != unicode.ToLower(r.runtext[pos]) { + return false + } + } + } + + if !r.rightToLeft { + pos += len + } + + r.runtextpos = pos + + return true +} + +func (r *runner) backwardnext() { + if r.rightToLeft { + r.runtextpos++ + } else { + r.runtextpos-- + } +} + +func (r *runner) charAt(j int) rune { + return r.runtext[j] +} + +func (r *runner) findFirstChar() bool { + + if 0 != (r.code.Anchors & (syntax.AnchorBeginning | syntax.AnchorStart | syntax.AnchorEndZ | syntax.AnchorEnd)) { + if !r.code.RightToLeft { + if (0 != (r.code.Anchors&syntax.AnchorBeginning) && r.runtextpos > 0) || + (0 != (r.code.Anchors&syntax.AnchorStart) && r.runtextpos > r.runtextstart) { + r.runtextpos = r.runtextend + return false + } + if 0 != (r.code.Anchors&syntax.AnchorEndZ) && r.runtextpos < r.runtextend-1 { + r.runtextpos = r.runtextend - 1 + } else if 0 != (r.code.Anchors&syntax.AnchorEnd) && r.runtextpos < r.runtextend { + r.runtextpos = r.runtextend + } + } else { + if (0 != (r.code.Anchors&syntax.AnchorEnd) && r.runtextpos < r.runtextend) || + (0 != (r.code.Anchors&syntax.AnchorEndZ) && (r.runtextpos < r.runtextend-1 || + (r.runtextpos == r.runtextend-1 && r.charAt(r.runtextpos) != '\n'))) || + (0 != (r.code.Anchors&syntax.AnchorStart) && r.runtextpos < r.runtextstart) { + r.runtextpos = 0 + return false + } + if 0 != (r.code.Anchors&syntax.AnchorBeginning) && r.runtextpos > 0 { + r.runtextpos = 0 + } + } + + if r.code.BmPrefix != nil { + return r.code.BmPrefix.IsMatch(r.runtext, r.runtextpos, 0, r.runtextend) + } + + return true // found a valid start or end anchor + } else if r.code.BmPrefix != nil { + r.runtextpos = r.code.BmPrefix.Scan(r.runtext, r.runtextpos, 0, r.runtextend) + + if r.runtextpos == -1 { + if r.code.RightToLeft { + r.runtextpos = 0 + } else { + r.runtextpos = r.runtextend + } + return false + } + + return true + } else if r.code.FcPrefix == nil { + return true + } + + r.rightToLeft = r.code.RightToLeft + r.caseInsensitive = r.code.FcPrefix.CaseInsensitive + + set := r.code.FcPrefix.PrefixSet + if set.IsSingleton() { + ch := set.SingletonChar() + for i := r.forwardchars(); i > 0; i-- { + if ch == r.forwardcharnext() { + r.backwardnext() + return true + } + } + } else { + for i := r.forwardchars(); i > 0; i-- { + n := r.forwardcharnext() + //fmt.Printf("%v in %v: %v\n", string(n), set.String(), set.CharIn(n)) + if set.CharIn(n) { + r.backwardnext() + return true + } + } + } + + return false +} + +func (r *runner) initMatch() { + // Use a hashtable'ed Match object if the capture numbers are sparse + + if r.runmatch == nil { + if r.re.caps != nil { + r.runmatch = newMatchSparse(r.re, r.re.caps, r.re.capsize, r.runtext, r.runtextstart) + } else { + r.runmatch = newMatch(r.re, r.re.capsize, r.runtext, r.runtextstart) + } + } else { + r.runmatch.reset(r.runtext, r.runtextstart) + } + + // note we test runcrawl, because it is the last one to be allocated + // If there is an alloc failure in the middle of the three allocations, + // we may still return to reuse this instance, and we want to behave + // as if the allocations didn't occur. (we used to test _trackcount != 0) + + if r.runcrawl != nil { + r.runtrackpos = len(r.runtrack) + r.runstackpos = len(r.runstack) + r.runcrawlpos = len(r.runcrawl) + return + } + + r.initTrackCount() + + tracksize := r.runtrackcount * 8 + stacksize := r.runtrackcount * 8 + + if tracksize < 32 { + tracksize = 32 + } + if stacksize < 16 { + stacksize = 16 + } + + r.runtrack = make([]int, tracksize) + r.runtrackpos = tracksize + + r.runstack = make([]int, stacksize) + r.runstackpos = stacksize + + r.runcrawl = make([]int, 32) + r.runcrawlpos = 32 +} + +func (r *runner) tidyMatch(quick bool) *Match { + if !quick { + match := r.runmatch + + r.runmatch = nil + + match.tidy(r.runtextpos) + return match + } else { + // send back our match -- it's not leaving the package, so it's safe to not clean it up + // this reduces allocs for frequent calls to the "IsMatch" bool-only functions + return r.runmatch + } +} + +// capture captures a subexpression. Note that the +// capnum used here has already been mapped to a non-sparse +// index (by the code generator RegexWriter). +func (r *runner) capture(capnum, start, end int) { + if end < start { + T := end + end = start + start = T + } + + r.crawl(capnum) + r.runmatch.addMatch(capnum, start, end-start) +} + +// transferCapture captures a subexpression. Note that the +// capnum used here has already been mapped to a non-sparse +// index (by the code generator RegexWriter). +func (r *runner) transferCapture(capnum, uncapnum, start, end int) { + var start2, end2 int + + // these are the two intervals that are cancelling each other + + if end < start { + T := end + end = start + start = T + } + + start2 = r.runmatch.matchIndex(uncapnum) + end2 = start2 + r.runmatch.matchLength(uncapnum) + + // The new capture gets the innermost defined interval + + if start >= end2 { + end = start + start = end2 + } else if end <= start2 { + start = start2 + } else { + if end > end2 { + end = end2 + } + if start2 > start { + start = start2 + } + } + + r.crawl(uncapnum) + r.runmatch.balanceMatch(uncapnum) + + if capnum != -1 { + r.crawl(capnum) + r.runmatch.addMatch(capnum, start, end-start) + } +} + +// revert the last capture +func (r *runner) uncapture() { + capnum := r.popcrawl() + r.runmatch.removeMatch(capnum) +} + +//debug + +func (r *runner) dumpState() { + back := "" + if r.operator&syntax.Back != 0 { + back = " Back" + } + if r.operator&syntax.Back2 != 0 { + back += " Back2" + } + fmt.Printf("Text: %v\nTrack: %v\nStack: %v\n %s%s\n\n", + r.textposDescription(), + r.stackDescription(r.runtrack, r.runtrackpos), + r.stackDescription(r.runstack, r.runstackpos), + r.code.OpcodeDescription(r.codepos), + back) +} + +func (r *runner) stackDescription(a []int, index int) string { + buf := &bytes.Buffer{} + + fmt.Fprintf(buf, "%v/%v", len(a)-index, len(a)) + if buf.Len() < 8 { + buf.WriteString(strings.Repeat(" ", 8-buf.Len())) + } + + buf.WriteRune('(') + for i := index; i < len(a); i++ { + if i > index { + buf.WriteRune(' ') + } + + buf.WriteString(strconv.Itoa(a[i])) + } + + buf.WriteRune(')') + + return buf.String() +} + +func (r *runner) textposDescription() string { + buf := &bytes.Buffer{} + + buf.WriteString(strconv.Itoa(r.runtextpos)) + + if buf.Len() < 8 { + buf.WriteString(strings.Repeat(" ", 8-buf.Len())) + } + + if r.runtextpos > 0 { + buf.WriteString(syntax.CharDescription(r.runtext[r.runtextpos-1])) + } else { + buf.WriteRune('^') + } + + buf.WriteRune('>') + + for i := r.runtextpos; i < r.runtextend; i++ { + buf.WriteString(syntax.CharDescription(r.runtext[i])) + } + if buf.Len() >= 64 { + buf.Truncate(61) + buf.WriteString("...") + } else { + buf.WriteRune('$') + } + + return buf.String() +} + +// decide whether the pos +// at the specified index is a boundary or not. It's just not worth +// emitting inline code for this logic. +func (r *runner) isBoundary(index, startpos, endpos int) bool { + return (index > startpos && syntax.IsWordChar(r.runtext[index-1])) != + (index < endpos && syntax.IsWordChar(r.runtext[index])) +} + +func (r *runner) isECMABoundary(index, startpos, endpos int) bool { + return (index > startpos && syntax.IsECMAWordChar(r.runtext[index-1])) != + (index < endpos && syntax.IsECMAWordChar(r.runtext[index])) +} + +func (r *runner) startTimeoutWatch() { + if r.ignoreTimeout { + return + } + r.deadline = makeDeadline(r.timeout) +} + +func (r *runner) checkTimeout() error { + if r.ignoreTimeout || !r.deadline.reached() { + return nil + } + + if r.re.Debug() { + //Debug.WriteLine("") + //Debug.WriteLine("RegEx match timeout occurred!") + //Debug.WriteLine("Specified timeout: " + TimeSpan.FromMilliseconds(_timeout).ToString()) + //Debug.WriteLine("Timeout check frequency: " + TimeoutCheckFrequency) + //Debug.WriteLine("Search pattern: " + _runregex._pattern) + //Debug.WriteLine("Input: " + r.runtext) + //Debug.WriteLine("About to throw RegexMatchTimeoutException.") + } + + return fmt.Errorf("match timeout after %v on input `%v`", r.timeout, string(r.runtext)) +} + +func (r *runner) initTrackCount() { + r.runtrackcount = r.code.TrackCount +} + +// getRunner returns a run to use for matching re. +// It uses the re's runner cache if possible, to avoid +// unnecessary allocation. +func (re *Regexp) getRunner() *runner { + re.muRun.Lock() + if n := len(re.runner); n > 0 { + z := re.runner[n-1] + re.runner = re.runner[:n-1] + re.muRun.Unlock() + return z + } + re.muRun.Unlock() + z := &runner{ + re: re, + code: re.code, + } + return z +} + +// putRunner returns a runner to the re's cache. +// There is no attempt to limit the size of the cache, so it will +// grow to the maximum number of simultaneous matches +// run using re. (The cache empties when re gets garbage collected.) +func (re *Regexp) putRunner(r *runner) { + re.muRun.Lock() + r.runtext = nil + if r.runmatch != nil { + r.runmatch.text = nil + } + re.runner = append(re.runner, r) + re.muRun.Unlock() +} diff --git a/vendor/github.com/dlclark/regexp2/syntax/charclass.go b/vendor/github.com/dlclark/regexp2/syntax/charclass.go new file mode 100644 index 0000000..6881a0e --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/syntax/charclass.go @@ -0,0 +1,865 @@ +package syntax + +import ( + "bytes" + "encoding/binary" + "fmt" + "sort" + "unicode" + "unicode/utf8" +) + +// CharSet combines start-end rune ranges and unicode categories representing a set of characters +type CharSet struct { + ranges []singleRange + categories []category + sub *CharSet //optional subtractor + negate bool + anything bool +} + +type category struct { + negate bool + cat string +} + +type singleRange struct { + first rune + last rune +} + +const ( + spaceCategoryText = " " + wordCategoryText = "W" +) + +var ( + ecmaSpace = []rune{0x0009, 0x000e, 0x0020, 0x0021, 0x00a0, 0x00a1, 0x1680, 0x1681, 0x2000, 0x200b, 0x2028, 0x202a, 0x202f, 0x2030, 0x205f, 0x2060, 0x3000, 0x3001, 0xfeff, 0xff00} + ecmaWord = []rune{0x0030, 0x003a, 0x0041, 0x005b, 0x005f, 0x0060, 0x0061, 0x007b} + ecmaDigit = []rune{0x0030, 0x003a} + + re2Space = []rune{0x0009, 0x000b, 0x000c, 0x000e, 0x0020, 0x0021} +) + +var ( + AnyClass = getCharSetFromOldString([]rune{0}, false) + ECMAAnyClass = getCharSetFromOldString([]rune{0, 0x000a, 0x000b, 0x000d, 0x000e}, false) + NoneClass = getCharSetFromOldString(nil, false) + ECMAWordClass = getCharSetFromOldString(ecmaWord, false) + NotECMAWordClass = getCharSetFromOldString(ecmaWord, true) + ECMASpaceClass = getCharSetFromOldString(ecmaSpace, false) + NotECMASpaceClass = getCharSetFromOldString(ecmaSpace, true) + ECMADigitClass = getCharSetFromOldString(ecmaDigit, false) + NotECMADigitClass = getCharSetFromOldString(ecmaDigit, true) + + WordClass = getCharSetFromCategoryString(false, false, wordCategoryText) + NotWordClass = getCharSetFromCategoryString(true, false, wordCategoryText) + SpaceClass = getCharSetFromCategoryString(false, false, spaceCategoryText) + NotSpaceClass = getCharSetFromCategoryString(true, false, spaceCategoryText) + DigitClass = getCharSetFromCategoryString(false, false, "Nd") + NotDigitClass = getCharSetFromCategoryString(false, true, "Nd") + + RE2SpaceClass = getCharSetFromOldString(re2Space, false) + NotRE2SpaceClass = getCharSetFromOldString(re2Space, true) +) + +var unicodeCategories = func() map[string]*unicode.RangeTable { + retVal := make(map[string]*unicode.RangeTable) + for k, v := range unicode.Scripts { + retVal[k] = v + } + for k, v := range unicode.Categories { + retVal[k] = v + } + for k, v := range unicode.Properties { + retVal[k] = v + } + return retVal +}() + +func getCharSetFromCategoryString(negateSet bool, negateCat bool, cats ...string) func() *CharSet { + if negateCat && negateSet { + panic("BUG! You should only negate the set OR the category in a constant setup, but not both") + } + + c := CharSet{negate: negateSet} + + c.categories = make([]category, len(cats)) + for i, cat := range cats { + c.categories[i] = category{cat: cat, negate: negateCat} + } + return func() *CharSet { + //make a copy each time + local := c + //return that address + return &local + } +} + +func getCharSetFromOldString(setText []rune, negate bool) func() *CharSet { + c := CharSet{} + if len(setText) > 0 { + fillFirst := false + l := len(setText) + if negate { + if setText[0] == 0 { + setText = setText[1:] + } else { + l++ + fillFirst = true + } + } + + if l%2 == 0 { + c.ranges = make([]singleRange, l/2) + } else { + c.ranges = make([]singleRange, l/2+1) + } + + first := true + if fillFirst { + c.ranges[0] = singleRange{first: 0} + first = false + } + + i := 0 + for _, r := range setText { + if first { + // lower bound in a new range + c.ranges[i] = singleRange{first: r} + first = false + } else { + c.ranges[i].last = r - 1 + i++ + first = true + } + } + if !first { + c.ranges[i].last = utf8.MaxRune + } + } + + return func() *CharSet { + local := c + return &local + } +} + +// Copy makes a deep copy to prevent accidental mutation of a set +func (c CharSet) Copy() CharSet { + ret := CharSet{ + anything: c.anything, + negate: c.negate, + } + + ret.ranges = append(ret.ranges, c.ranges...) + ret.categories = append(ret.categories, c.categories...) + + if c.sub != nil { + sub := c.sub.Copy() + ret.sub = &sub + } + + return ret +} + +// gets a human-readable description for a set string +func (c CharSet) String() string { + buf := &bytes.Buffer{} + buf.WriteRune('[') + + if c.IsNegated() { + buf.WriteRune('^') + } + + for _, r := range c.ranges { + + buf.WriteString(CharDescription(r.first)) + if r.first != r.last { + if r.last-r.first != 1 { + //groups that are 1 char apart skip the dash + buf.WriteRune('-') + } + buf.WriteString(CharDescription(r.last)) + } + } + + for _, c := range c.categories { + buf.WriteString(c.String()) + } + + if c.sub != nil { + buf.WriteRune('-') + buf.WriteString(c.sub.String()) + } + + buf.WriteRune(']') + + return buf.String() +} + +// mapHashFill converts a charset into a buffer for use in maps +func (c CharSet) mapHashFill(buf *bytes.Buffer) { + if c.negate { + buf.WriteByte(0) + } else { + buf.WriteByte(1) + } + + binary.Write(buf, binary.LittleEndian, len(c.ranges)) + binary.Write(buf, binary.LittleEndian, len(c.categories)) + for _, r := range c.ranges { + buf.WriteRune(r.first) + buf.WriteRune(r.last) + } + for _, ct := range c.categories { + buf.WriteString(ct.cat) + if ct.negate { + buf.WriteByte(1) + } else { + buf.WriteByte(0) + } + } + + if c.sub != nil { + c.sub.mapHashFill(buf) + } +} + +// CharIn returns true if the rune is in our character set (either ranges or categories). +// It handles negations and subtracted sub-charsets. +func (c CharSet) CharIn(ch rune) bool { + val := false + // in s && !s.subtracted + + //check ranges + for _, r := range c.ranges { + if ch < r.first { + continue + } + if ch <= r.last { + val = true + break + } + } + + //check categories if we haven't already found a range + if !val && len(c.categories) > 0 { + for _, ct := range c.categories { + // special categories...then unicode + if ct.cat == spaceCategoryText { + if unicode.IsSpace(ch) { + // we found a space so we're done + // negate means this is a "bad" thing + val = !ct.negate + break + } else if ct.negate { + val = true + break + } + } else if ct.cat == wordCategoryText { + if IsWordChar(ch) { + val = !ct.negate + break + } else if ct.negate { + val = true + break + } + } else if unicode.Is(unicodeCategories[ct.cat], ch) { + // if we're in this unicode category then we're done + // if negate=true on this category then we "failed" our test + // otherwise we're good that we found it + val = !ct.negate + break + } else if ct.negate { + val = true + break + } + } + } + + // negate the whole char set + if c.negate { + val = !val + } + + // get subtracted recurse + if val && c.sub != nil { + val = !c.sub.CharIn(ch) + } + + //log.Printf("Char '%v' in %v == %v", string(ch), c.String(), val) + return val +} + +func (c category) String() string { + switch c.cat { + case spaceCategoryText: + if c.negate { + return "\\S" + } + return "\\s" + case wordCategoryText: + if c.negate { + return "\\W" + } + return "\\w" + } + if _, ok := unicodeCategories[c.cat]; ok { + + if c.negate { + return "\\P{" + c.cat + "}" + } + return "\\p{" + c.cat + "}" + } + return "Unknown category: " + c.cat +} + +// CharDescription Produces a human-readable description for a single character. +func CharDescription(ch rune) string { + /*if ch == '\\' { + return "\\\\" + } + + if ch > ' ' && ch <= '~' { + return string(ch) + } else if ch == '\n' { + return "\\n" + } else if ch == ' ' { + return "\\ " + }*/ + + b := &bytes.Buffer{} + escape(b, ch, false) //fmt.Sprintf("%U", ch) + return b.String() +} + +// According to UTS#18 Unicode Regular Expressions (http://www.unicode.org/reports/tr18/) +// RL 1.4 Simple Word Boundaries The class of includes all Alphabetic +// values from the Unicode character database, from UnicodeData.txt [UData], plus the U+200C +// ZERO WIDTH NON-JOINER and U+200D ZERO WIDTH JOINER. +func IsWordChar(r rune) bool { + //"L", "Mn", "Nd", "Pc" + return unicode.In(r, + unicode.Categories["L"], unicode.Categories["Mn"], + unicode.Categories["Nd"], unicode.Categories["Pc"]) || r == '\u200D' || r == '\u200C' + //return 'A' <= r && r <= 'Z' || 'a' <= r && r <= 'z' || '0' <= r && r <= '9' || r == '_' +} + +func IsECMAWordChar(r rune) bool { + return unicode.In(r, + unicode.Categories["L"], unicode.Categories["Mn"], + unicode.Categories["Nd"], unicode.Categories["Pc"]) + + //return 'A' <= r && r <= 'Z' || 'a' <= r && r <= 'z' || '0' <= r && r <= '9' || r == '_' +} + +// SingletonChar will return the char from the first range without validation. +// It assumes you have checked for IsSingleton or IsSingletonInverse and will panic given bad input +func (c CharSet) SingletonChar() rune { + return c.ranges[0].first +} + +func (c CharSet) IsSingleton() bool { + return !c.negate && //negated is multiple chars + len(c.categories) == 0 && len(c.ranges) == 1 && // multiple ranges and unicode classes represent multiple chars + c.sub == nil && // subtraction means we've got multiple chars + c.ranges[0].first == c.ranges[0].last // first and last equal means we're just 1 char +} + +func (c CharSet) IsSingletonInverse() bool { + return c.negate && //same as above, but requires negated + len(c.categories) == 0 && len(c.ranges) == 1 && // multiple ranges and unicode classes represent multiple chars + c.sub == nil && // subtraction means we've got multiple chars + c.ranges[0].first == c.ranges[0].last // first and last equal means we're just 1 char +} + +func (c CharSet) IsMergeable() bool { + return !c.IsNegated() && !c.HasSubtraction() +} + +func (c CharSet) IsNegated() bool { + return c.negate +} + +func (c CharSet) HasSubtraction() bool { + return c.sub != nil +} + +func (c CharSet) IsEmpty() bool { + return len(c.ranges) == 0 && len(c.categories) == 0 && c.sub == nil +} + +func (c *CharSet) addDigit(ecma, negate bool, pattern string) { + if ecma { + if negate { + c.addRanges(NotECMADigitClass().ranges) + } else { + c.addRanges(ECMADigitClass().ranges) + } + } else { + c.addCategories(category{cat: "Nd", negate: negate}) + } +} + +func (c *CharSet) addChar(ch rune) { + c.addRange(ch, ch) +} + +func (c *CharSet) addSpace(ecma, re2, negate bool) { + if ecma { + if negate { + c.addRanges(NotECMASpaceClass().ranges) + } else { + c.addRanges(ECMASpaceClass().ranges) + } + } else if re2 { + if negate { + c.addRanges(NotRE2SpaceClass().ranges) + } else { + c.addRanges(RE2SpaceClass().ranges) + } + } else { + c.addCategories(category{cat: spaceCategoryText, negate: negate}) + } +} + +func (c *CharSet) addWord(ecma, negate bool) { + if ecma { + if negate { + c.addRanges(NotECMAWordClass().ranges) + } else { + c.addRanges(ECMAWordClass().ranges) + } + } else { + c.addCategories(category{cat: wordCategoryText, negate: negate}) + } +} + +// Add set ranges and categories into ours -- no deduping or anything +func (c *CharSet) addSet(set CharSet) { + if c.anything { + return + } + if set.anything { + c.makeAnything() + return + } + // just append here to prevent double-canon + c.ranges = append(c.ranges, set.ranges...) + c.addCategories(set.categories...) + c.canonicalize() +} + +func (c *CharSet) makeAnything() { + c.anything = true + c.categories = []category{} + c.ranges = AnyClass().ranges +} + +func (c *CharSet) addCategories(cats ...category) { + // don't add dupes and remove positive+negative + if c.anything { + // if we've had a previous positive+negative group then + // just return, we're as broad as we can get + return + } + + for _, ct := range cats { + found := false + for _, ct2 := range c.categories { + if ct.cat == ct2.cat { + if ct.negate != ct2.negate { + // oposite negations...this mean we just + // take us as anything and move on + c.makeAnything() + return + } + found = true + break + } + } + + if !found { + c.categories = append(c.categories, ct) + } + } +} + +// Merges new ranges to our own +func (c *CharSet) addRanges(ranges []singleRange) { + if c.anything { + return + } + c.ranges = append(c.ranges, ranges...) + c.canonicalize() +} + +// Merges everything but the new ranges into our own +func (c *CharSet) addNegativeRanges(ranges []singleRange) { + if c.anything { + return + } + + var hi rune + + // convert incoming ranges into opposites, assume they are in order + for _, r := range ranges { + if hi < r.first { + c.ranges = append(c.ranges, singleRange{hi, r.first - 1}) + } + hi = r.last + 1 + } + + if hi < utf8.MaxRune { + c.ranges = append(c.ranges, singleRange{hi, utf8.MaxRune}) + } + + c.canonicalize() +} + +func isValidUnicodeCat(catName string) bool { + _, ok := unicodeCategories[catName] + return ok +} + +func (c *CharSet) addCategory(categoryName string, negate, caseInsensitive bool, pattern string) { + if !isValidUnicodeCat(categoryName) { + // unknown unicode category, script, or property "blah" + panic(fmt.Errorf("Unknown unicode category, script, or property '%v'", categoryName)) + + } + + if caseInsensitive && (categoryName == "Ll" || categoryName == "Lu" || categoryName == "Lt") { + // when RegexOptions.IgnoreCase is specified then {Ll} {Lu} and {Lt} cases should all match + c.addCategories( + category{cat: "Ll", negate: negate}, + category{cat: "Lu", negate: negate}, + category{cat: "Lt", negate: negate}) + } + c.addCategories(category{cat: categoryName, negate: negate}) +} + +func (c *CharSet) addSubtraction(sub *CharSet) { + c.sub = sub +} + +func (c *CharSet) addRange(chMin, chMax rune) { + c.ranges = append(c.ranges, singleRange{first: chMin, last: chMax}) + c.canonicalize() +} + +func (c *CharSet) addNamedASCII(name string, negate bool) bool { + var rs []singleRange + + switch name { + case "alnum": + rs = []singleRange{singleRange{'0', '9'}, singleRange{'A', 'Z'}, singleRange{'a', 'z'}} + case "alpha": + rs = []singleRange{singleRange{'A', 'Z'}, singleRange{'a', 'z'}} + case "ascii": + rs = []singleRange{singleRange{0, 0x7f}} + case "blank": + rs = []singleRange{singleRange{'\t', '\t'}, singleRange{' ', ' '}} + case "cntrl": + rs = []singleRange{singleRange{0, 0x1f}, singleRange{0x7f, 0x7f}} + case "digit": + c.addDigit(false, negate, "") + case "graph": + rs = []singleRange{singleRange{'!', '~'}} + case "lower": + rs = []singleRange{singleRange{'a', 'z'}} + case "print": + rs = []singleRange{singleRange{' ', '~'}} + case "punct": //[!-/:-@[-`{-~] + rs = []singleRange{singleRange{'!', '/'}, singleRange{':', '@'}, singleRange{'[', '`'}, singleRange{'{', '~'}} + case "space": + c.addSpace(true, false, negate) + case "upper": + rs = []singleRange{singleRange{'A', 'Z'}} + case "word": + c.addWord(true, negate) + case "xdigit": + rs = []singleRange{singleRange{'0', '9'}, singleRange{'A', 'F'}, singleRange{'a', 'f'}} + default: + return false + } + + if len(rs) > 0 { + if negate { + c.addNegativeRanges(rs) + } else { + c.addRanges(rs) + } + } + + return true +} + +type singleRangeSorter []singleRange + +func (p singleRangeSorter) Len() int { return len(p) } +func (p singleRangeSorter) Less(i, j int) bool { return p[i].first < p[j].first } +func (p singleRangeSorter) Swap(i, j int) { p[i], p[j] = p[j], p[i] } + +// Logic to reduce a character class to a unique, sorted form. +func (c *CharSet) canonicalize() { + var i, j int + var last rune + + // + // Find and eliminate overlapping or abutting ranges + // + + if len(c.ranges) > 1 { + sort.Sort(singleRangeSorter(c.ranges)) + + done := false + + for i, j = 1, 0; ; i++ { + for last = c.ranges[j].last; ; i++ { + if i == len(c.ranges) || last == utf8.MaxRune { + done = true + break + } + + CurrentRange := c.ranges[i] + if CurrentRange.first > last+1 { + break + } + + if last < CurrentRange.last { + last = CurrentRange.last + } + } + + c.ranges[j] = singleRange{first: c.ranges[j].first, last: last} + + j++ + + if done { + break + } + + if j < i { + c.ranges[j] = c.ranges[i] + } + } + + c.ranges = append(c.ranges[:j], c.ranges[len(c.ranges):]...) + } +} + +// Adds to the class any lowercase versions of characters already +// in the class. Used for case-insensitivity. +func (c *CharSet) addLowercase() { + if c.anything { + return + } + toAdd := []singleRange{} + for i := 0; i < len(c.ranges); i++ { + r := c.ranges[i] + if r.first == r.last { + lower := unicode.ToLower(r.first) + c.ranges[i] = singleRange{first: lower, last: lower} + } else { + toAdd = append(toAdd, r) + } + } + + for _, r := range toAdd { + c.addLowercaseRange(r.first, r.last) + } + c.canonicalize() +} + +/************************************************************************** + Let U be the set of Unicode character values and let L be the lowercase + function, mapping from U to U. To perform case insensitive matching of + character sets, we need to be able to map an interval I in U, say + + I = [chMin, chMax] = { ch : chMin <= ch <= chMax } + + to a set A such that A contains L(I) and A is contained in the union of + I and L(I). + + The table below partitions U into intervals on which L is non-decreasing. + Thus, for any interval J = [a, b] contained in one of these intervals, + L(J) is contained in [L(a), L(b)]. + + It is also true that for any such J, [L(a), L(b)] is contained in the + union of J and L(J). This does not follow from L being non-decreasing on + these intervals. It follows from the nature of the L on each interval. + On each interval, L has one of the following forms: + + (1) L(ch) = constant (LowercaseSet) + (2) L(ch) = ch + offset (LowercaseAdd) + (3) L(ch) = ch | 1 (LowercaseBor) + (4) L(ch) = ch + (ch & 1) (LowercaseBad) + + It is easy to verify that for any of these forms [L(a), L(b)] is + contained in the union of [a, b] and L([a, b]). +***************************************************************************/ + +const ( + LowercaseSet = 0 // Set to arg. + LowercaseAdd = 1 // Add arg. + LowercaseBor = 2 // Bitwise or with 1. + LowercaseBad = 3 // Bitwise and with 1 and add original. +) + +type lcMap struct { + chMin, chMax rune + op, data int32 +} + +var lcTable = []lcMap{ + lcMap{'\u0041', '\u005A', LowercaseAdd, 32}, + lcMap{'\u00C0', '\u00DE', LowercaseAdd, 32}, + lcMap{'\u0100', '\u012E', LowercaseBor, 0}, + lcMap{'\u0130', '\u0130', LowercaseSet, 0x0069}, + lcMap{'\u0132', '\u0136', LowercaseBor, 0}, + lcMap{'\u0139', '\u0147', LowercaseBad, 0}, + lcMap{'\u014A', '\u0176', LowercaseBor, 0}, + lcMap{'\u0178', '\u0178', LowercaseSet, 0x00FF}, + lcMap{'\u0179', '\u017D', LowercaseBad, 0}, + lcMap{'\u0181', '\u0181', LowercaseSet, 0x0253}, + lcMap{'\u0182', '\u0184', LowercaseBor, 0}, + lcMap{'\u0186', '\u0186', LowercaseSet, 0x0254}, + lcMap{'\u0187', '\u0187', LowercaseSet, 0x0188}, + lcMap{'\u0189', '\u018A', LowercaseAdd, 205}, + lcMap{'\u018B', '\u018B', LowercaseSet, 0x018C}, + lcMap{'\u018E', '\u018E', LowercaseSet, 0x01DD}, + lcMap{'\u018F', '\u018F', LowercaseSet, 0x0259}, + lcMap{'\u0190', '\u0190', LowercaseSet, 0x025B}, + lcMap{'\u0191', '\u0191', LowercaseSet, 0x0192}, + lcMap{'\u0193', '\u0193', LowercaseSet, 0x0260}, + lcMap{'\u0194', '\u0194', LowercaseSet, 0x0263}, + lcMap{'\u0196', '\u0196', LowercaseSet, 0x0269}, + lcMap{'\u0197', '\u0197', LowercaseSet, 0x0268}, + lcMap{'\u0198', '\u0198', LowercaseSet, 0x0199}, + lcMap{'\u019C', '\u019C', LowercaseSet, 0x026F}, + lcMap{'\u019D', '\u019D', LowercaseSet, 0x0272}, + lcMap{'\u019F', '\u019F', LowercaseSet, 0x0275}, + lcMap{'\u01A0', '\u01A4', LowercaseBor, 0}, + lcMap{'\u01A7', '\u01A7', LowercaseSet, 0x01A8}, + lcMap{'\u01A9', '\u01A9', LowercaseSet, 0x0283}, + lcMap{'\u01AC', '\u01AC', LowercaseSet, 0x01AD}, + lcMap{'\u01AE', '\u01AE', LowercaseSet, 0x0288}, + lcMap{'\u01AF', '\u01AF', LowercaseSet, 0x01B0}, + lcMap{'\u01B1', '\u01B2', LowercaseAdd, 217}, + lcMap{'\u01B3', '\u01B5', LowercaseBad, 0}, + lcMap{'\u01B7', '\u01B7', LowercaseSet, 0x0292}, + lcMap{'\u01B8', '\u01B8', LowercaseSet, 0x01B9}, + lcMap{'\u01BC', '\u01BC', LowercaseSet, 0x01BD}, + lcMap{'\u01C4', '\u01C5', LowercaseSet, 0x01C6}, + lcMap{'\u01C7', '\u01C8', LowercaseSet, 0x01C9}, + lcMap{'\u01CA', '\u01CB', LowercaseSet, 0x01CC}, + lcMap{'\u01CD', '\u01DB', LowercaseBad, 0}, + lcMap{'\u01DE', '\u01EE', LowercaseBor, 0}, + lcMap{'\u01F1', '\u01F2', LowercaseSet, 0x01F3}, + lcMap{'\u01F4', '\u01F4', LowercaseSet, 0x01F5}, + lcMap{'\u01FA', '\u0216', LowercaseBor, 0}, + lcMap{'\u0386', '\u0386', LowercaseSet, 0x03AC}, + lcMap{'\u0388', '\u038A', LowercaseAdd, 37}, + lcMap{'\u038C', '\u038C', LowercaseSet, 0x03CC}, + lcMap{'\u038E', '\u038F', LowercaseAdd, 63}, + lcMap{'\u0391', '\u03AB', LowercaseAdd, 32}, + lcMap{'\u03E2', '\u03EE', LowercaseBor, 0}, + lcMap{'\u0401', '\u040F', LowercaseAdd, 80}, + lcMap{'\u0410', '\u042F', LowercaseAdd, 32}, + lcMap{'\u0460', '\u0480', LowercaseBor, 0}, + lcMap{'\u0490', '\u04BE', LowercaseBor, 0}, + lcMap{'\u04C1', '\u04C3', LowercaseBad, 0}, + lcMap{'\u04C7', '\u04C7', LowercaseSet, 0x04C8}, + lcMap{'\u04CB', '\u04CB', LowercaseSet, 0x04CC}, + lcMap{'\u04D0', '\u04EA', LowercaseBor, 0}, + lcMap{'\u04EE', '\u04F4', LowercaseBor, 0}, + lcMap{'\u04F8', '\u04F8', LowercaseSet, 0x04F9}, + lcMap{'\u0531', '\u0556', LowercaseAdd, 48}, + lcMap{'\u10A0', '\u10C5', LowercaseAdd, 48}, + lcMap{'\u1E00', '\u1EF8', LowercaseBor, 0}, + lcMap{'\u1F08', '\u1F0F', LowercaseAdd, -8}, + lcMap{'\u1F18', '\u1F1F', LowercaseAdd, -8}, + lcMap{'\u1F28', '\u1F2F', LowercaseAdd, -8}, + lcMap{'\u1F38', '\u1F3F', LowercaseAdd, -8}, + lcMap{'\u1F48', '\u1F4D', LowercaseAdd, -8}, + lcMap{'\u1F59', '\u1F59', LowercaseSet, 0x1F51}, + lcMap{'\u1F5B', '\u1F5B', LowercaseSet, 0x1F53}, + lcMap{'\u1F5D', '\u1F5D', LowercaseSet, 0x1F55}, + lcMap{'\u1F5F', '\u1F5F', LowercaseSet, 0x1F57}, + lcMap{'\u1F68', '\u1F6F', LowercaseAdd, -8}, + lcMap{'\u1F88', '\u1F8F', LowercaseAdd, -8}, + lcMap{'\u1F98', '\u1F9F', LowercaseAdd, -8}, + lcMap{'\u1FA8', '\u1FAF', LowercaseAdd, -8}, + lcMap{'\u1FB8', '\u1FB9', LowercaseAdd, -8}, + lcMap{'\u1FBA', '\u1FBB', LowercaseAdd, -74}, + lcMap{'\u1FBC', '\u1FBC', LowercaseSet, 0x1FB3}, + lcMap{'\u1FC8', '\u1FCB', LowercaseAdd, -86}, + lcMap{'\u1FCC', '\u1FCC', LowercaseSet, 0x1FC3}, + lcMap{'\u1FD8', '\u1FD9', LowercaseAdd, -8}, + lcMap{'\u1FDA', '\u1FDB', LowercaseAdd, -100}, + lcMap{'\u1FE8', '\u1FE9', LowercaseAdd, -8}, + lcMap{'\u1FEA', '\u1FEB', LowercaseAdd, -112}, + lcMap{'\u1FEC', '\u1FEC', LowercaseSet, 0x1FE5}, + lcMap{'\u1FF8', '\u1FF9', LowercaseAdd, -128}, + lcMap{'\u1FFA', '\u1FFB', LowercaseAdd, -126}, + lcMap{'\u1FFC', '\u1FFC', LowercaseSet, 0x1FF3}, + lcMap{'\u2160', '\u216F', LowercaseAdd, 16}, + lcMap{'\u24B6', '\u24D0', LowercaseAdd, 26}, + lcMap{'\uFF21', '\uFF3A', LowercaseAdd, 32}, +} + +func (c *CharSet) addLowercaseRange(chMin, chMax rune) { + var i, iMax, iMid int + var chMinT, chMaxT rune + var lc lcMap + + for i, iMax = 0, len(lcTable); i < iMax; { + iMid = (i + iMax) / 2 + if lcTable[iMid].chMax < chMin { + i = iMid + 1 + } else { + iMax = iMid + } + } + + for ; i < len(lcTable); i++ { + lc = lcTable[i] + if lc.chMin > chMax { + return + } + chMinT = lc.chMin + if chMinT < chMin { + chMinT = chMin + } + + chMaxT = lc.chMax + if chMaxT > chMax { + chMaxT = chMax + } + + switch lc.op { + case LowercaseSet: + chMinT = rune(lc.data) + chMaxT = rune(lc.data) + break + case LowercaseAdd: + chMinT += lc.data + chMaxT += lc.data + break + case LowercaseBor: + chMinT |= 1 + chMaxT |= 1 + break + case LowercaseBad: + chMinT += (chMinT & 1) + chMaxT += (chMaxT & 1) + break + } + + if chMinT < chMin || chMaxT > chMax { + c.addRange(chMinT, chMaxT) + } + } +} diff --git a/vendor/github.com/dlclark/regexp2/syntax/code.go b/vendor/github.com/dlclark/regexp2/syntax/code.go new file mode 100644 index 0000000..686e822 --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/syntax/code.go @@ -0,0 +1,274 @@ +package syntax + +import ( + "bytes" + "fmt" + "math" +) + +// similar to prog.go in the go regex package...also with comment 'may not belong in this package' + +// File provides operator constants for use by the Builder and the Machine. + +// Implementation notes: +// +// Regexps are built into RegexCodes, which contain an operation array, +// a string table, and some constants. +// +// Each operation is one of the codes below, followed by the integer +// operands specified for each op. +// +// Strings and sets are indices into a string table. + +type InstOp int + +const ( + // lef/back operands description + + Onerep InstOp = 0 // lef,back char,min,max a {n} + Notonerep = 1 // lef,back char,min,max .{n} + Setrep = 2 // lef,back set,min,max [\d]{n} + + Oneloop = 3 // lef,back char,min,max a {,n} + Notoneloop = 4 // lef,back char,min,max .{,n} + Setloop = 5 // lef,back set,min,max [\d]{,n} + + Onelazy = 6 // lef,back char,min,max a {,n}? + Notonelazy = 7 // lef,back char,min,max .{,n}? + Setlazy = 8 // lef,back set,min,max [\d]{,n}? + + One = 9 // lef char a + Notone = 10 // lef char [^a] + Set = 11 // lef set [a-z\s] \w \s \d + + Multi = 12 // lef string abcd + Ref = 13 // lef group \# + + Bol = 14 // ^ + Eol = 15 // $ + Boundary = 16 // \b + Nonboundary = 17 // \B + Beginning = 18 // \A + Start = 19 // \G + EndZ = 20 // \Z + End = 21 // \Z + + Nothing = 22 // Reject! + + // Primitive control structures + + Lazybranch = 23 // back jump straight first + Branchmark = 24 // back jump branch first for loop + Lazybranchmark = 25 // back jump straight first for loop + Nullcount = 26 // back val set counter, null mark + Setcount = 27 // back val set counter, make mark + Branchcount = 28 // back jump,limit branch++ if zero<=c impl group slots + Capsize int // number of impl group slots + FcPrefix *Prefix // the set of candidate first characters (may be null) + BmPrefix *BmPrefix // the fixed prefix string as a Boyer-Moore machine (may be null) + Anchors AnchorLoc // the set of zero-length start anchors (RegexFCD.Bol, etc) + RightToLeft bool // true if right to left +} + +func opcodeBacktracks(op InstOp) bool { + op &= Mask + + switch op { + case Oneloop, Notoneloop, Setloop, Onelazy, Notonelazy, Setlazy, Lazybranch, Branchmark, Lazybranchmark, + Nullcount, Setcount, Branchcount, Lazybranchcount, Setmark, Capturemark, Getmark, Setjump, Backjump, + Forejump, Goto: + return true + + default: + return false + } +} + +func opcodeSize(op InstOp) int { + op &= Mask + + switch op { + case Nothing, Bol, Eol, Boundary, Nonboundary, ECMABoundary, NonECMABoundary, Beginning, Start, EndZ, + End, Nullmark, Setmark, Getmark, Setjump, Backjump, Forejump, Stop: + return 1 + + case One, Notone, Multi, Ref, Testref, Goto, Nullcount, Setcount, Lazybranch, Branchmark, Lazybranchmark, + Prune, Set: + return 2 + + case Capturemark, Branchcount, Lazybranchcount, Onerep, Notonerep, Oneloop, Notoneloop, Onelazy, Notonelazy, + Setlazy, Setrep, Setloop: + return 3 + + default: + panic(fmt.Errorf("Unexpected op code: %v", op)) + } +} + +var codeStr = []string{ + "Onerep", "Notonerep", "Setrep", + "Oneloop", "Notoneloop", "Setloop", + "Onelazy", "Notonelazy", "Setlazy", + "One", "Notone", "Set", + "Multi", "Ref", + "Bol", "Eol", "Boundary", "Nonboundary", "Beginning", "Start", "EndZ", "End", + "Nothing", + "Lazybranch", "Branchmark", "Lazybranchmark", + "Nullcount", "Setcount", "Branchcount", "Lazybranchcount", + "Nullmark", "Setmark", "Capturemark", "Getmark", + "Setjump", "Backjump", "Forejump", "Testref", "Goto", + "Prune", "Stop", + "ECMABoundary", "NonECMABoundary", +} + +func operatorDescription(op InstOp) string { + desc := codeStr[op&Mask] + if (op & Ci) != 0 { + desc += "-Ci" + } + if (op & Rtl) != 0 { + desc += "-Rtl" + } + if (op & Back) != 0 { + desc += "-Back" + } + if (op & Back2) != 0 { + desc += "-Back2" + } + + return desc +} + +// OpcodeDescription is a humman readable string of the specific offset +func (c *Code) OpcodeDescription(offset int) string { + buf := &bytes.Buffer{} + + op := InstOp(c.Codes[offset]) + fmt.Fprintf(buf, "%06d ", offset) + + if opcodeBacktracks(op & Mask) { + buf.WriteString("*") + } else { + buf.WriteString(" ") + } + buf.WriteString(operatorDescription(op)) + buf.WriteString("(") + op &= Mask + + switch op { + case One, Notone, Onerep, Notonerep, Oneloop, Notoneloop, Onelazy, Notonelazy: + buf.WriteString("Ch = ") + buf.WriteString(CharDescription(rune(c.Codes[offset+1]))) + + case Set, Setrep, Setloop, Setlazy: + buf.WriteString("Set = ") + buf.WriteString(c.Sets[c.Codes[offset+1]].String()) + + case Multi: + fmt.Fprintf(buf, "String = %s", string(c.Strings[c.Codes[offset+1]])) + + case Ref, Testref: + fmt.Fprintf(buf, "Index = %d", c.Codes[offset+1]) + + case Capturemark: + fmt.Fprintf(buf, "Index = %d", c.Codes[offset+1]) + if c.Codes[offset+2] != -1 { + fmt.Fprintf(buf, ", Unindex = %d", c.Codes[offset+2]) + } + + case Nullcount, Setcount: + fmt.Fprintf(buf, "Value = %d", c.Codes[offset+1]) + + case Goto, Lazybranch, Branchmark, Lazybranchmark, Branchcount, Lazybranchcount: + fmt.Fprintf(buf, "Addr = %d", c.Codes[offset+1]) + } + + switch op { + case Onerep, Notonerep, Oneloop, Notoneloop, Onelazy, Notonelazy, Setrep, Setloop, Setlazy: + buf.WriteString(", Rep = ") + if c.Codes[offset+2] == math.MaxInt32 { + buf.WriteString("inf") + } else { + fmt.Fprintf(buf, "%d", c.Codes[offset+2]) + } + + case Branchcount, Lazybranchcount: + buf.WriteString(", Limit = ") + if c.Codes[offset+2] == math.MaxInt32 { + buf.WriteString("inf") + } else { + fmt.Fprintf(buf, "%d", c.Codes[offset+2]) + } + + } + + buf.WriteString(")") + + return buf.String() +} + +func (c *Code) Dump() string { + buf := &bytes.Buffer{} + + if c.RightToLeft { + fmt.Fprintln(buf, "Direction: right-to-left") + } else { + fmt.Fprintln(buf, "Direction: left-to-right") + } + if c.FcPrefix == nil { + fmt.Fprintln(buf, "Firstchars: n/a") + } else { + fmt.Fprintf(buf, "Firstchars: %v\n", c.FcPrefix.PrefixSet.String()) + } + + if c.BmPrefix == nil { + fmt.Fprintln(buf, "Prefix: n/a") + } else { + fmt.Fprintf(buf, "Prefix: %v\n", Escape(c.BmPrefix.String())) + } + + fmt.Fprintf(buf, "Anchors: %v\n", c.Anchors) + fmt.Fprintln(buf) + + if c.BmPrefix != nil { + fmt.Fprintln(buf, "BoyerMoore:") + fmt.Fprintln(buf, c.BmPrefix.Dump(" ")) + } + for i := 0; i < len(c.Codes); i += opcodeSize(InstOp(c.Codes[i])) { + fmt.Fprintln(buf, c.OpcodeDescription(i)) + } + + return buf.String() +} diff --git a/vendor/github.com/dlclark/regexp2/syntax/escape.go b/vendor/github.com/dlclark/regexp2/syntax/escape.go new file mode 100644 index 0000000..609df10 --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/syntax/escape.go @@ -0,0 +1,94 @@ +package syntax + +import ( + "bytes" + "strconv" + "strings" + "unicode" +) + +func Escape(input string) string { + b := &bytes.Buffer{} + for _, r := range input { + escape(b, r, false) + } + return b.String() +} + +const meta = `\.+*?()|[]{}^$# ` + +func escape(b *bytes.Buffer, r rune, force bool) { + if unicode.IsPrint(r) { + if strings.IndexRune(meta, r) >= 0 || force { + b.WriteRune('\\') + } + b.WriteRune(r) + return + } + + switch r { + case '\a': + b.WriteString(`\a`) + case '\f': + b.WriteString(`\f`) + case '\n': + b.WriteString(`\n`) + case '\r': + b.WriteString(`\r`) + case '\t': + b.WriteString(`\t`) + case '\v': + b.WriteString(`\v`) + default: + if r < 0x100 { + b.WriteString(`\x`) + s := strconv.FormatInt(int64(r), 16) + if len(s) == 1 { + b.WriteRune('0') + } + b.WriteString(s) + break + } + b.WriteString(`\u`) + b.WriteString(strconv.FormatInt(int64(r), 16)) + } +} + +func Unescape(input string) (string, error) { + idx := strings.IndexRune(input, '\\') + // no slashes means no unescape needed + if idx == -1 { + return input, nil + } + + buf := bytes.NewBufferString(input[:idx]) + // get the runes for the rest of the string -- we're going full parser scan on this + + p := parser{} + p.setPattern(input[idx+1:]) + for { + if p.rightMost() { + return "", p.getErr(ErrIllegalEndEscape) + } + r, err := p.scanCharEscape() + if err != nil { + return "", err + } + buf.WriteRune(r) + // are we done? + if p.rightMost() { + return buf.String(), nil + } + + r = p.moveRightGetChar() + for r != '\\' { + buf.WriteRune(r) + if p.rightMost() { + // we're done, no more slashes + return buf.String(), nil + } + // keep scanning until we get another slash + r = p.moveRightGetChar() + } + } +} diff --git a/vendor/github.com/dlclark/regexp2/syntax/fuzz.go b/vendor/github.com/dlclark/regexp2/syntax/fuzz.go new file mode 100644 index 0000000..ee86386 --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/syntax/fuzz.go @@ -0,0 +1,20 @@ +// +build gofuzz + +package syntax + +// Fuzz is the input point for go-fuzz +func Fuzz(data []byte) int { + sdata := string(data) + tree, err := Parse(sdata, RegexOptions(0)) + if err != nil { + return 0 + } + + // translate it to code + _, err = Write(tree) + if err != nil { + panic(err) + } + + return 1 +} diff --git a/vendor/github.com/dlclark/regexp2/syntax/parser.go b/vendor/github.com/dlclark/regexp2/syntax/parser.go new file mode 100644 index 0000000..4ff0aaa --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/syntax/parser.go @@ -0,0 +1,2262 @@ +package syntax + +import ( + "fmt" + "math" + "os" + "sort" + "strconv" + "unicode" +) + +type RegexOptions int32 + +const ( + IgnoreCase RegexOptions = 0x0001 // "i" + Multiline = 0x0002 // "m" + ExplicitCapture = 0x0004 // "n" + Compiled = 0x0008 // "c" + Singleline = 0x0010 // "s" + IgnorePatternWhitespace = 0x0020 // "x" + RightToLeft = 0x0040 // "r" + Debug = 0x0080 // "d" + ECMAScript = 0x0100 // "e" + RE2 = 0x0200 // RE2 compat mode + Unicode = 0x0400 // "u" +) + +func optionFromCode(ch rune) RegexOptions { + // case-insensitive + switch ch { + case 'i', 'I': + return IgnoreCase + case 'r', 'R': + return RightToLeft + case 'm', 'M': + return Multiline + case 'n', 'N': + return ExplicitCapture + case 's', 'S': + return Singleline + case 'x', 'X': + return IgnorePatternWhitespace + case 'd', 'D': + return Debug + case 'e', 'E': + return ECMAScript + case 'u', 'U': + return Unicode + default: + return 0 + } +} + +// An Error describes a failure to parse a regular expression +// and gives the offending expression. +type Error struct { + Code ErrorCode + Expr string + Args []interface{} +} + +func (e *Error) Error() string { + if len(e.Args) == 0 { + return "error parsing regexp: " + e.Code.String() + " in `" + e.Expr + "`" + } + return "error parsing regexp: " + fmt.Sprintf(e.Code.String(), e.Args...) + " in `" + e.Expr + "`" +} + +// An ErrorCode describes a failure to parse a regular expression. +type ErrorCode string + +const ( + // internal issue + ErrInternalError ErrorCode = "regexp/syntax: internal error" + // Parser errors + ErrUnterminatedComment = "unterminated comment" + ErrInvalidCharRange = "invalid character class range" + ErrInvalidRepeatSize = "invalid repeat count" + ErrInvalidUTF8 = "invalid UTF-8" + ErrCaptureGroupOutOfRange = "capture group number out of range" + ErrUnexpectedParen = "unexpected )" + ErrMissingParen = "missing closing )" + ErrMissingBrace = "missing closing }" + ErrInvalidRepeatOp = "invalid nested repetition operator" + ErrMissingRepeatArgument = "missing argument to repetition operator" + ErrConditionalExpression = "illegal conditional (?(...)) expression" + ErrTooManyAlternates = "too many | in (?()|)" + ErrUnrecognizedGrouping = "unrecognized grouping construct: (%v" + ErrInvalidGroupName = "invalid group name: group names must begin with a word character and have a matching terminator" + ErrCapNumNotZero = "capture number cannot be zero" + ErrUndefinedBackRef = "reference to undefined group number %v" + ErrUndefinedNameRef = "reference to undefined group name %v" + ErrAlternationCantCapture = "alternation conditions do not capture and cannot be named" + ErrAlternationCantHaveComment = "alternation conditions cannot be comments" + ErrMalformedReference = "(?(%v) ) malformed" + ErrUndefinedReference = "(?(%v) ) reference to undefined group" + ErrIllegalEndEscape = "illegal \\ at end of pattern" + ErrMalformedSlashP = "malformed \\p{X} character escape" + ErrIncompleteSlashP = "incomplete \\p{X} character escape" + ErrUnknownSlashP = "unknown unicode category, script, or property '%v'" + ErrUnrecognizedEscape = "unrecognized escape sequence \\%v" + ErrMissingControl = "missing control character" + ErrUnrecognizedControl = "unrecognized control character" + ErrTooFewHex = "insufficient hexadecimal digits" + ErrInvalidHex = "hex values may not be larger than 0x10FFFF" + ErrMalformedNameRef = "malformed \\k<...> named back reference" + ErrBadClassInCharRange = "cannot include class \\%v in character range" + ErrUnterminatedBracket = "unterminated [] set" + ErrSubtractionMustBeLast = "a subtraction must be the last element in a character class" + ErrReversedCharRange = "[%c-%c] range in reverse order" +) + +func (e ErrorCode) String() string { + return string(e) +} + +type parser struct { + stack *regexNode + group *regexNode + alternation *regexNode + concatenation *regexNode + unit *regexNode + + patternRaw string + pattern []rune + + currentPos int + specialCase *unicode.SpecialCase + + autocap int + capcount int + captop int + capsize int + + caps map[int]int + capnames map[string]int + + capnumlist []int + capnamelist []string + + options RegexOptions + optionsStack []RegexOptions + ignoreNextParen bool +} + +const ( + maxValueDiv10 int = math.MaxInt32 / 10 + maxValueMod10 = math.MaxInt32 % 10 +) + +// Parse converts a regex string into a parse tree +func Parse(re string, op RegexOptions) (*RegexTree, error) { + p := parser{ + options: op, + caps: make(map[int]int), + } + p.setPattern(re) + + if err := p.countCaptures(); err != nil { + return nil, err + } + + p.reset(op) + root, err := p.scanRegex() + + if err != nil { + return nil, err + } + tree := &RegexTree{ + root: root, + caps: p.caps, + capnumlist: p.capnumlist, + captop: p.captop, + Capnames: p.capnames, + Caplist: p.capnamelist, + options: op, + } + + if tree.options&Debug > 0 { + os.Stdout.WriteString(tree.Dump()) + } + + return tree, nil +} + +func (p *parser) setPattern(pattern string) { + p.patternRaw = pattern + p.pattern = make([]rune, 0, len(pattern)) + + //populate our rune array to handle utf8 encoding + for _, r := range pattern { + p.pattern = append(p.pattern, r) + } +} +func (p *parser) getErr(code ErrorCode, args ...interface{}) error { + return &Error{Code: code, Expr: p.patternRaw, Args: args} +} + +func (p *parser) noteCaptureSlot(i, pos int) { + if _, ok := p.caps[i]; !ok { + // the rhs of the hashtable isn't used in the parser + p.caps[i] = pos + p.capcount++ + + if p.captop <= i { + if i == math.MaxInt32 { + p.captop = i + } else { + p.captop = i + 1 + } + } + } +} + +func (p *parser) noteCaptureName(name string, pos int) { + if p.capnames == nil { + p.capnames = make(map[string]int) + } + + if _, ok := p.capnames[name]; !ok { + p.capnames[name] = pos + p.capnamelist = append(p.capnamelist, name) + } +} + +func (p *parser) assignNameSlots() { + if p.capnames != nil { + for _, name := range p.capnamelist { + for p.isCaptureSlot(p.autocap) { + p.autocap++ + } + pos := p.capnames[name] + p.capnames[name] = p.autocap + p.noteCaptureSlot(p.autocap, pos) + + p.autocap++ + } + } + + // if the caps array has at least one gap, construct the list of used slots + if p.capcount < p.captop { + p.capnumlist = make([]int, p.capcount) + i := 0 + + for k := range p.caps { + p.capnumlist[i] = k + i++ + } + + sort.Ints(p.capnumlist) + } + + // merge capsnumlist into capnamelist + if p.capnames != nil || p.capnumlist != nil { + var oldcapnamelist []string + var next int + var k int + + if p.capnames == nil { + oldcapnamelist = nil + p.capnames = make(map[string]int) + p.capnamelist = []string{} + next = -1 + } else { + oldcapnamelist = p.capnamelist + p.capnamelist = []string{} + next = p.capnames[oldcapnamelist[0]] + } + + for i := 0; i < p.capcount; i++ { + j := i + if p.capnumlist != nil { + j = p.capnumlist[i] + } + + if next == j { + p.capnamelist = append(p.capnamelist, oldcapnamelist[k]) + k++ + + if k == len(oldcapnamelist) { + next = -1 + } else { + next = p.capnames[oldcapnamelist[k]] + } + + } else { + //feature: culture? + str := strconv.Itoa(j) + p.capnamelist = append(p.capnamelist, str) + p.capnames[str] = j + } + } + } +} + +func (p *parser) consumeAutocap() int { + r := p.autocap + p.autocap++ + return r +} + +// CountCaptures is a prescanner for deducing the slots used for +// captures by doing a partial tokenization of the pattern. +func (p *parser) countCaptures() error { + var ch rune + + p.noteCaptureSlot(0, 0) + + p.autocap = 1 + + for p.charsRight() > 0 { + pos := p.textpos() + ch = p.moveRightGetChar() + switch ch { + case '\\': + if p.charsRight() > 0 { + p.scanBackslash(true) + } + + case '#': + if p.useOptionX() { + p.moveLeft() + p.scanBlank() + } + + case '[': + p.scanCharSet(false, true) + + case ')': + if !p.emptyOptionsStack() { + p.popOptions() + } + + case '(': + if p.charsRight() >= 2 && p.rightChar(1) == '#' && p.rightChar(0) == '?' { + p.moveLeft() + p.scanBlank() + } else { + p.pushOptions() + if p.charsRight() > 0 && p.rightChar(0) == '?' { + // we have (?... + p.moveRight(1) + + if p.charsRight() > 1 && (p.rightChar(0) == '<' || p.rightChar(0) == '\'') { + // named group: (?<... or (?'... + + p.moveRight(1) + ch = p.rightChar(0) + + if ch != '0' && IsWordChar(ch) { + if ch >= '1' && ch <= '9' { + dec, err := p.scanDecimal() + if err != nil { + return err + } + p.noteCaptureSlot(dec, pos) + } else { + p.noteCaptureName(p.scanCapname(), pos) + } + } + } else if p.useRE2() && p.charsRight() > 2 && (p.rightChar(0) == 'P' && p.rightChar(1) == '<') { + // RE2-compat (?P<) + p.moveRight(2) + ch = p.rightChar(0) + if IsWordChar(ch) { + p.noteCaptureName(p.scanCapname(), pos) + } + + } else { + // (?... + + // get the options if it's an option construct (?cimsx-cimsx...) + p.scanOptions() + + if p.charsRight() > 0 { + if p.rightChar(0) == ')' { + // (?cimsx-cimsx) + p.moveRight(1) + p.popKeepOptions() + } else if p.rightChar(0) == '(' { + // alternation construct: (?(foo)yes|no) + // ignore the next paren so we don't capture the condition + p.ignoreNextParen = true + + // break from here so we don't reset ignoreNextParen + continue + } + } + } + } else { + if !p.useOptionN() && !p.ignoreNextParen { + p.noteCaptureSlot(p.consumeAutocap(), pos) + } + } + } + + p.ignoreNextParen = false + + } + } + + p.assignNameSlots() + return nil +} + +func (p *parser) reset(topopts RegexOptions) { + p.currentPos = 0 + p.autocap = 1 + p.ignoreNextParen = false + + if len(p.optionsStack) > 0 { + p.optionsStack = p.optionsStack[:0] + } + + p.options = topopts + p.stack = nil +} + +func (p *parser) scanRegex() (*regexNode, error) { + ch := '@' // nonspecial ch, means at beginning + isQuant := false + + p.startGroup(newRegexNodeMN(ntCapture, p.options, 0, -1)) + + for p.charsRight() > 0 { + wasPrevQuantifier := isQuant + isQuant = false + + if err := p.scanBlank(); err != nil { + return nil, err + } + + startpos := p.textpos() + + // move past all of the normal characters. We'll stop when we hit some kind of control character, + // or if IgnorePatternWhiteSpace is on, we'll stop when we see some whitespace. + if p.useOptionX() { + for p.charsRight() > 0 { + ch = p.rightChar(0) + //UGLY: clean up, this is ugly + if !(!isStopperX(ch) || (ch == '{' && !p.isTrueQuantifier())) { + break + } + p.moveRight(1) + } + } else { + for p.charsRight() > 0 { + ch = p.rightChar(0) + if !(!isSpecial(ch) || ch == '{' && !p.isTrueQuantifier()) { + break + } + p.moveRight(1) + } + } + + endpos := p.textpos() + + p.scanBlank() + + if p.charsRight() == 0 { + ch = '!' // nonspecial, means at end + } else if ch = p.rightChar(0); isSpecial(ch) { + isQuant = isQuantifier(ch) + p.moveRight(1) + } else { + ch = ' ' // nonspecial, means at ordinary char + } + + if startpos < endpos { + cchUnquantified := endpos - startpos + if isQuant { + cchUnquantified-- + } + wasPrevQuantifier = false + + if cchUnquantified > 0 { + p.addToConcatenate(startpos, cchUnquantified, false) + } + + if isQuant { + p.addUnitOne(p.charAt(endpos - 1)) + } + } + + switch ch { + case '!': + goto BreakOuterScan + + case ' ': + goto ContinueOuterScan + + case '[': + cc, err := p.scanCharSet(p.useOptionI(), false) + if err != nil { + return nil, err + } + p.addUnitSet(cc) + + case '(': + p.pushOptions() + + if grouper, err := p.scanGroupOpen(); err != nil { + return nil, err + } else if grouper == nil { + p.popKeepOptions() + } else { + p.pushGroup() + p.startGroup(grouper) + } + + continue + + case '|': + p.addAlternate() + goto ContinueOuterScan + + case ')': + if p.emptyStack() { + return nil, p.getErr(ErrUnexpectedParen) + } + + if err := p.addGroup(); err != nil { + return nil, err + } + if err := p.popGroup(); err != nil { + return nil, err + } + p.popOptions() + + if p.unit == nil { + goto ContinueOuterScan + } + + case '\\': + n, err := p.scanBackslash(false) + if err != nil { + return nil, err + } + p.addUnitNode(n) + + case '^': + if p.useOptionM() { + p.addUnitType(ntBol) + } else { + p.addUnitType(ntBeginning) + } + + case '$': + if p.useOptionM() { + p.addUnitType(ntEol) + } else { + p.addUnitType(ntEndZ) + } + + case '.': + if p.useOptionS() { + p.addUnitSet(AnyClass()) + } else if p.useOptionE() { + p.addUnitSet(ECMAAnyClass()) + } else { + p.addUnitNotone('\n') + } + + case '{', '*', '+', '?': + if p.unit == nil { + if wasPrevQuantifier { + return nil, p.getErr(ErrInvalidRepeatOp) + } else { + return nil, p.getErr(ErrMissingRepeatArgument) + } + } + p.moveLeft() + + default: + return nil, p.getErr(ErrInternalError) + } + + if err := p.scanBlank(); err != nil { + return nil, err + } + + if p.charsRight() > 0 { + isQuant = p.isTrueQuantifier() + } + if p.charsRight() == 0 || !isQuant { + //maintain odd C# assignment order -- not sure if required, could clean up? + p.addConcatenate() + goto ContinueOuterScan + } + + ch = p.moveRightGetChar() + + // Handle quantifiers + for p.unit != nil { + var min, max int + var lazy bool + + switch ch { + case '*': + min = 0 + max = math.MaxInt32 + + case '?': + min = 0 + max = 1 + + case '+': + min = 1 + max = math.MaxInt32 + + case '{': + { + var err error + startpos = p.textpos() + if min, err = p.scanDecimal(); err != nil { + return nil, err + } + max = min + if startpos < p.textpos() { + if p.charsRight() > 0 && p.rightChar(0) == ',' { + p.moveRight(1) + if p.charsRight() == 0 || p.rightChar(0) == '}' { + max = math.MaxInt32 + } else { + if max, err = p.scanDecimal(); err != nil { + return nil, err + } + } + } + } + + if startpos == p.textpos() || p.charsRight() == 0 || p.moveRightGetChar() != '}' { + p.addConcatenate() + p.textto(startpos - 1) + goto ContinueOuterScan + } + } + + default: + return nil, p.getErr(ErrInternalError) + } + + if err := p.scanBlank(); err != nil { + return nil, err + } + + if p.charsRight() == 0 || p.rightChar(0) != '?' { + lazy = false + } else { + p.moveRight(1) + lazy = true + } + + if min > max { + return nil, p.getErr(ErrInvalidRepeatSize) + } + + p.addConcatenate3(lazy, min, max) + } + + ContinueOuterScan: + } + +BreakOuterScan: + ; + + if !p.emptyStack() { + return nil, p.getErr(ErrMissingParen) + } + + if err := p.addGroup(); err != nil { + return nil, err + } + + return p.unit, nil + +} + +/* + * Simple parsing for replacement patterns + */ +func (p *parser) scanReplacement() (*regexNode, error) { + var c, startpos int + + p.concatenation = newRegexNode(ntConcatenate, p.options) + + for { + c = p.charsRight() + if c == 0 { + break + } + + startpos = p.textpos() + + for c > 0 && p.rightChar(0) != '$' { + p.moveRight(1) + c-- + } + + p.addToConcatenate(startpos, p.textpos()-startpos, true) + + if c > 0 { + if p.moveRightGetChar() == '$' { + n, err := p.scanDollar() + if err != nil { + return nil, err + } + p.addUnitNode(n) + } + p.addConcatenate() + } + } + + return p.concatenation, nil +} + +/* + * Scans $ patterns recognized within replacement patterns + */ +func (p *parser) scanDollar() (*regexNode, error) { + if p.charsRight() == 0 { + return newRegexNodeCh(ntOne, p.options, '$'), nil + } + + ch := p.rightChar(0) + angled := false + backpos := p.textpos() + lastEndPos := backpos + + // Note angle + + if ch == '{' && p.charsRight() > 1 { + angled = true + p.moveRight(1) + ch = p.rightChar(0) + } + + // Try to parse backreference: \1 or \{1} or \{cap} + + if ch >= '0' && ch <= '9' { + if !angled && p.useOptionE() { + capnum := -1 + newcapnum := int(ch - '0') + p.moveRight(1) + if p.isCaptureSlot(newcapnum) { + capnum = newcapnum + lastEndPos = p.textpos() + } + + for p.charsRight() > 0 { + ch = p.rightChar(0) + if ch < '0' || ch > '9' { + break + } + digit := int(ch - '0') + if newcapnum > maxValueDiv10 || (newcapnum == maxValueDiv10 && digit > maxValueMod10) { + return nil, p.getErr(ErrCaptureGroupOutOfRange) + } + + newcapnum = newcapnum*10 + digit + + p.moveRight(1) + if p.isCaptureSlot(newcapnum) { + capnum = newcapnum + lastEndPos = p.textpos() + } + } + p.textto(lastEndPos) + if capnum >= 0 { + return newRegexNodeM(ntRef, p.options, capnum), nil + } + } else { + capnum, err := p.scanDecimal() + if err != nil { + return nil, err + } + if !angled || p.charsRight() > 0 && p.moveRightGetChar() == '}' { + if p.isCaptureSlot(capnum) { + return newRegexNodeM(ntRef, p.options, capnum), nil + } + } + } + } else if angled && IsWordChar(ch) { + capname := p.scanCapname() + + if p.charsRight() > 0 && p.moveRightGetChar() == '}' { + if p.isCaptureName(capname) { + return newRegexNodeM(ntRef, p.options, p.captureSlotFromName(capname)), nil + } + } + } else if !angled { + capnum := 1 + + switch ch { + case '$': + p.moveRight(1) + return newRegexNodeCh(ntOne, p.options, '$'), nil + case '&': + capnum = 0 + case '`': + capnum = replaceLeftPortion + case '\'': + capnum = replaceRightPortion + case '+': + capnum = replaceLastGroup + case '_': + capnum = replaceWholeString + } + + if capnum != 1 { + p.moveRight(1) + return newRegexNodeM(ntRef, p.options, capnum), nil + } + } + + // unrecognized $: literalize + + p.textto(backpos) + return newRegexNodeCh(ntOne, p.options, '$'), nil +} + +// scanGroupOpen scans chars following a '(' (not counting the '('), and returns +// a RegexNode for the type of group scanned, or nil if the group +// simply changed options (?cimsx-cimsx) or was a comment (#...). +func (p *parser) scanGroupOpen() (*regexNode, error) { + var ch rune + var nt nodeType + var err error + close := '>' + start := p.textpos() + + // just return a RegexNode if we have: + // 1. "(" followed by nothing + // 2. "(x" where x != ? + // 3. "(?)" + if p.charsRight() == 0 || p.rightChar(0) != '?' || (p.rightChar(0) == '?' && (p.charsRight() > 1 && p.rightChar(1) == ')')) { + if p.useOptionN() || p.ignoreNextParen { + p.ignoreNextParen = false + return newRegexNode(ntGroup, p.options), nil + } + return newRegexNodeMN(ntCapture, p.options, p.consumeAutocap(), -1), nil + } + + p.moveRight(1) + + for { + if p.charsRight() == 0 { + break + } + + switch ch = p.moveRightGetChar(); ch { + case ':': + nt = ntGroup + + case '=': + p.options &= ^RightToLeft + nt = ntRequire + + case '!': + p.options &= ^RightToLeft + nt = ntPrevent + + case '>': + nt = ntGreedy + + case '\'': + close = '\'' + fallthrough + + case '<': + if p.charsRight() == 0 { + goto BreakRecognize + } + + switch ch = p.moveRightGetChar(); ch { + case '=': + if close == '\'' { + goto BreakRecognize + } + + p.options |= RightToLeft + nt = ntRequire + + case '!': + if close == '\'' { + goto BreakRecognize + } + + p.options |= RightToLeft + nt = ntPrevent + + default: + p.moveLeft() + capnum := -1 + uncapnum := -1 + proceed := false + + // grab part before - + + if ch >= '0' && ch <= '9' { + if capnum, err = p.scanDecimal(); err != nil { + return nil, err + } + + if !p.isCaptureSlot(capnum) { + capnum = -1 + } + + // check if we have bogus characters after the number + if p.charsRight() > 0 && !(p.rightChar(0) == close || p.rightChar(0) == '-') { + return nil, p.getErr(ErrInvalidGroupName) + } + if capnum == 0 { + return nil, p.getErr(ErrCapNumNotZero) + } + } else if IsWordChar(ch) { + capname := p.scanCapname() + + if p.isCaptureName(capname) { + capnum = p.captureSlotFromName(capname) + } + + // check if we have bogus character after the name + if p.charsRight() > 0 && !(p.rightChar(0) == close || p.rightChar(0) == '-') { + return nil, p.getErr(ErrInvalidGroupName) + } + } else if ch == '-' { + proceed = true + } else { + // bad group name - starts with something other than a word character and isn't a number + return nil, p.getErr(ErrInvalidGroupName) + } + + // grab part after - if any + + if (capnum != -1 || proceed == true) && p.charsRight() > 0 && p.rightChar(0) == '-' { + p.moveRight(1) + + //no more chars left, no closing char, etc + if p.charsRight() == 0 { + return nil, p.getErr(ErrInvalidGroupName) + } + + ch = p.rightChar(0) + if ch >= '0' && ch <= '9' { + if uncapnum, err = p.scanDecimal(); err != nil { + return nil, err + } + + if !p.isCaptureSlot(uncapnum) { + return nil, p.getErr(ErrUndefinedBackRef, uncapnum) + } + + // check if we have bogus characters after the number + if p.charsRight() > 0 && p.rightChar(0) != close { + return nil, p.getErr(ErrInvalidGroupName) + } + } else if IsWordChar(ch) { + uncapname := p.scanCapname() + + if !p.isCaptureName(uncapname) { + return nil, p.getErr(ErrUndefinedNameRef, uncapname) + } + uncapnum = p.captureSlotFromName(uncapname) + + // check if we have bogus character after the name + if p.charsRight() > 0 && p.rightChar(0) != close { + return nil, p.getErr(ErrInvalidGroupName) + } + } else { + // bad group name - starts with something other than a word character and isn't a number + return nil, p.getErr(ErrInvalidGroupName) + } + } + + // actually make the node + + if (capnum != -1 || uncapnum != -1) && p.charsRight() > 0 && p.moveRightGetChar() == close { + return newRegexNodeMN(ntCapture, p.options, capnum, uncapnum), nil + } + goto BreakRecognize + } + + case '(': + // alternation construct (?(...) | ) + + parenPos := p.textpos() + if p.charsRight() > 0 { + ch = p.rightChar(0) + + // check if the alternation condition is a backref + if ch >= '0' && ch <= '9' { + var capnum int + if capnum, err = p.scanDecimal(); err != nil { + return nil, err + } + if p.charsRight() > 0 && p.moveRightGetChar() == ')' { + if p.isCaptureSlot(capnum) { + return newRegexNodeM(ntTestref, p.options, capnum), nil + } + return nil, p.getErr(ErrUndefinedReference, capnum) + } + + return nil, p.getErr(ErrMalformedReference, capnum) + + } else if IsWordChar(ch) { + capname := p.scanCapname() + + if p.isCaptureName(capname) && p.charsRight() > 0 && p.moveRightGetChar() == ')' { + return newRegexNodeM(ntTestref, p.options, p.captureSlotFromName(capname)), nil + } + } + } + // not a backref + nt = ntTestgroup + p.textto(parenPos - 1) // jump to the start of the parentheses + p.ignoreNextParen = true // but make sure we don't try to capture the insides + + charsRight := p.charsRight() + if charsRight >= 3 && p.rightChar(1) == '?' { + rightchar2 := p.rightChar(2) + // disallow comments in the condition + if rightchar2 == '#' { + return nil, p.getErr(ErrAlternationCantHaveComment) + } + + // disallow named capture group (?<..>..) in the condition + if rightchar2 == '\'' { + return nil, p.getErr(ErrAlternationCantCapture) + } + + if charsRight >= 4 && (rightchar2 == '<' && p.rightChar(3) != '!' && p.rightChar(3) != '=') { + return nil, p.getErr(ErrAlternationCantCapture) + } + } + + case 'P': + if p.useRE2() { + // support for P syntax + if p.charsRight() < 3 { + goto BreakRecognize + } + + ch = p.moveRightGetChar() + if ch != '<' { + goto BreakRecognize + } + + ch = p.moveRightGetChar() + p.moveLeft() + + if IsWordChar(ch) { + capnum := -1 + capname := p.scanCapname() + + if p.isCaptureName(capname) { + capnum = p.captureSlotFromName(capname) + } + + // check if we have bogus character after the name + if p.charsRight() > 0 && p.rightChar(0) != '>' { + return nil, p.getErr(ErrInvalidGroupName) + } + + // actually make the node + + if capnum != -1 && p.charsRight() > 0 && p.moveRightGetChar() == '>' { + return newRegexNodeMN(ntCapture, p.options, capnum, -1), nil + } + goto BreakRecognize + + } else { + // bad group name - starts with something other than a word character and isn't a number + return nil, p.getErr(ErrInvalidGroupName) + } + } + // if we're not using RE2 compat mode then + // we just behave like normal + fallthrough + + default: + p.moveLeft() + + nt = ntGroup + // disallow options in the children of a testgroup node + if p.group.t != ntTestgroup { + p.scanOptions() + } + if p.charsRight() == 0 { + goto BreakRecognize + } + + if ch = p.moveRightGetChar(); ch == ')' { + return nil, nil + } + + if ch != ':' { + goto BreakRecognize + } + + } + + return newRegexNode(nt, p.options), nil + } + +BreakRecognize: + + // break Recognize comes here + + return nil, p.getErr(ErrUnrecognizedGrouping, string(p.pattern[start:p.textpos()])) +} + +// scans backslash specials and basics +func (p *parser) scanBackslash(scanOnly bool) (*regexNode, error) { + + if p.charsRight() == 0 { + return nil, p.getErr(ErrIllegalEndEscape) + } + + switch ch := p.rightChar(0); ch { + case 'b', 'B', 'A', 'G', 'Z', 'z': + p.moveRight(1) + return newRegexNode(p.typeFromCode(ch), p.options), nil + + case 'w': + p.moveRight(1) + if p.useOptionE() || p.useRE2() { + return newRegexNodeSet(ntSet, p.options, ECMAWordClass()), nil + } + return newRegexNodeSet(ntSet, p.options, WordClass()), nil + + case 'W': + p.moveRight(1) + if p.useOptionE() || p.useRE2() { + return newRegexNodeSet(ntSet, p.options, NotECMAWordClass()), nil + } + return newRegexNodeSet(ntSet, p.options, NotWordClass()), nil + + case 's': + p.moveRight(1) + if p.useOptionE() { + return newRegexNodeSet(ntSet, p.options, ECMASpaceClass()), nil + } else if p.useRE2() { + return newRegexNodeSet(ntSet, p.options, RE2SpaceClass()), nil + } + return newRegexNodeSet(ntSet, p.options, SpaceClass()), nil + + case 'S': + p.moveRight(1) + if p.useOptionE() { + return newRegexNodeSet(ntSet, p.options, NotECMASpaceClass()), nil + } else if p.useRE2() { + return newRegexNodeSet(ntSet, p.options, NotRE2SpaceClass()), nil + } + return newRegexNodeSet(ntSet, p.options, NotSpaceClass()), nil + + case 'd': + p.moveRight(1) + if p.useOptionE() || p.useRE2() { + return newRegexNodeSet(ntSet, p.options, ECMADigitClass()), nil + } + return newRegexNodeSet(ntSet, p.options, DigitClass()), nil + + case 'D': + p.moveRight(1) + if p.useOptionE() || p.useRE2() { + return newRegexNodeSet(ntSet, p.options, NotECMADigitClass()), nil + } + return newRegexNodeSet(ntSet, p.options, NotDigitClass()), nil + + case 'p', 'P': + p.moveRight(1) + prop, err := p.parseProperty() + if err != nil { + return nil, err + } + cc := &CharSet{} + cc.addCategory(prop, (ch != 'p'), p.useOptionI(), p.patternRaw) + if p.useOptionI() { + cc.addLowercase() + } + + return newRegexNodeSet(ntSet, p.options, cc), nil + + default: + return p.scanBasicBackslash(scanOnly) + } +} + +// Scans \-style backreferences and character escapes +func (p *parser) scanBasicBackslash(scanOnly bool) (*regexNode, error) { + if p.charsRight() == 0 { + return nil, p.getErr(ErrIllegalEndEscape) + } + angled := false + k := false + close := '\x00' + + backpos := p.textpos() + ch := p.rightChar(0) + + // Allow \k instead of \, which is now deprecated. + + // According to ECMAScript specification, \k is only parsed as a named group reference if + // there is at least one group name in the regexp. + // See https://www.ecma-international.org/ecma-262/#sec-isvalidregularexpressionliteral, step 7. + // Note, during the first (scanOnly) run we may not have all group names scanned, but that's ok. + if ch == 'k' && (!p.useOptionE() || len(p.capnames) > 0) { + if p.charsRight() >= 2 { + p.moveRight(1) + ch = p.moveRightGetChar() + + if ch == '<' || (!p.useOptionE() && ch == '\'') { // No support for \k'name' in ECMAScript + angled = true + if ch == '\'' { + close = '\'' + } else { + close = '>' + } + } + } + + if !angled || p.charsRight() <= 0 { + return nil, p.getErr(ErrMalformedNameRef) + } + + ch = p.rightChar(0) + k = true + + } else if !p.useOptionE() && (ch == '<' || ch == '\'') && p.charsRight() > 1 { // Note angle without \g + angled = true + if ch == '\'' { + close = '\'' + } else { + close = '>' + } + + p.moveRight(1) + ch = p.rightChar(0) + } + + // Try to parse backreference: \<1> or \ + + if angled && ch >= '0' && ch <= '9' { + capnum, err := p.scanDecimal() + if err != nil { + return nil, err + } + + if p.charsRight() > 0 && p.moveRightGetChar() == close { + if p.isCaptureSlot(capnum) { + return newRegexNodeM(ntRef, p.options, capnum), nil + } + return nil, p.getErr(ErrUndefinedBackRef, capnum) + } + } else if !angled && ch >= '1' && ch <= '9' { // Try to parse backreference or octal: \1 + capnum, err := p.scanDecimal() + if err != nil { + return nil, err + } + + if scanOnly { + return nil, nil + } + + if p.isCaptureSlot(capnum) { + return newRegexNodeM(ntRef, p.options, capnum), nil + } + if capnum <= 9 && !p.useOptionE() { + return nil, p.getErr(ErrUndefinedBackRef, capnum) + } + + } else if angled { + capname := p.scanCapname() + + if capname != "" && p.charsRight() > 0 && p.moveRightGetChar() == close { + + if scanOnly { + return nil, nil + } + + if p.isCaptureName(capname) { + return newRegexNodeM(ntRef, p.options, p.captureSlotFromName(capname)), nil + } + return nil, p.getErr(ErrUndefinedNameRef, capname) + } else { + if k { + return nil, p.getErr(ErrMalformedNameRef) + } + } + } + + // Not backreference: must be char code + + p.textto(backpos) + ch, err := p.scanCharEscape() + if err != nil { + return nil, err + } + + if scanOnly { + return nil, nil + } + + if p.useOptionI() { + ch = unicode.ToLower(ch) + } + + return newRegexNodeCh(ntOne, p.options, ch), nil +} + +// Scans X for \p{X} or \P{X} +func (p *parser) parseProperty() (string, error) { + // RE2 and PCRE supports \pX syntax (no {} and only 1 letter unicode cats supported) + // since this is purely additive syntax it's not behind a flag + if p.charsRight() >= 1 && p.rightChar(0) != '{' { + ch := string(p.moveRightGetChar()) + // check if it's a valid cat + if !isValidUnicodeCat(ch) { + return "", p.getErr(ErrUnknownSlashP, ch) + } + return ch, nil + } + + if p.charsRight() < 3 { + return "", p.getErr(ErrIncompleteSlashP) + } + ch := p.moveRightGetChar() + if ch != '{' { + return "", p.getErr(ErrMalformedSlashP) + } + + startpos := p.textpos() + for p.charsRight() > 0 { + ch = p.moveRightGetChar() + if !(IsWordChar(ch) || ch == '-') { + p.moveLeft() + break + } + } + capname := string(p.pattern[startpos:p.textpos()]) + + if p.charsRight() == 0 || p.moveRightGetChar() != '}' { + return "", p.getErr(ErrIncompleteSlashP) + } + + if !isValidUnicodeCat(capname) { + return "", p.getErr(ErrUnknownSlashP, capname) + } + + return capname, nil +} + +// Returns ReNode type for zero-length assertions with a \ code. +func (p *parser) typeFromCode(ch rune) nodeType { + switch ch { + case 'b': + if p.useOptionE() { + return ntECMABoundary + } + return ntBoundary + case 'B': + if p.useOptionE() { + return ntNonECMABoundary + } + return ntNonboundary + case 'A': + return ntBeginning + case 'G': + return ntStart + case 'Z': + return ntEndZ + case 'z': + return ntEnd + default: + return ntNothing + } +} + +// Scans whitespace or x-mode comments. +func (p *parser) scanBlank() error { + if p.useOptionX() { + for { + for p.charsRight() > 0 && isSpace(p.rightChar(0)) { + p.moveRight(1) + } + + if p.charsRight() == 0 { + break + } + + if p.rightChar(0) == '#' { + for p.charsRight() > 0 && p.rightChar(0) != '\n' { + p.moveRight(1) + } + } else if p.charsRight() >= 3 && p.rightChar(2) == '#' && + p.rightChar(1) == '?' && p.rightChar(0) == '(' { + for p.charsRight() > 0 && p.rightChar(0) != ')' { + p.moveRight(1) + } + if p.charsRight() == 0 { + return p.getErr(ErrUnterminatedComment) + } + p.moveRight(1) + } else { + break + } + } + } else { + for { + if p.charsRight() < 3 || p.rightChar(2) != '#' || + p.rightChar(1) != '?' || p.rightChar(0) != '(' { + return nil + } + + for p.charsRight() > 0 && p.rightChar(0) != ')' { + p.moveRight(1) + } + if p.charsRight() == 0 { + return p.getErr(ErrUnterminatedComment) + } + p.moveRight(1) + } + } + return nil +} + +func (p *parser) scanCapname() string { + startpos := p.textpos() + + for p.charsRight() > 0 { + if !IsWordChar(p.moveRightGetChar()) { + p.moveLeft() + break + } + } + + return string(p.pattern[startpos:p.textpos()]) +} + +// Scans contents of [] (not including []'s), and converts to a set. +func (p *parser) scanCharSet(caseInsensitive, scanOnly bool) (*CharSet, error) { + ch := '\x00' + chPrev := '\x00' + inRange := false + firstChar := true + closed := false + + var cc *CharSet + if !scanOnly { + cc = &CharSet{} + } + + if p.charsRight() > 0 && p.rightChar(0) == '^' { + p.moveRight(1) + if !scanOnly { + cc.negate = true + } + } + + for ; p.charsRight() > 0; firstChar = false { + fTranslatedChar := false + ch = p.moveRightGetChar() + if ch == ']' { + if !firstChar { + closed = true + break + } else if p.useOptionE() { + if !scanOnly { + cc.addRanges(NoneClass().ranges) + } + closed = true + break + } + + } else if ch == '\\' && p.charsRight() > 0 { + switch ch = p.moveRightGetChar(); ch { + case 'D', 'd': + if !scanOnly { + if inRange { + return nil, p.getErr(ErrBadClassInCharRange, ch) + } + cc.addDigit(p.useOptionE() || p.useRE2(), ch == 'D', p.patternRaw) + } + continue + + case 'S', 's': + if !scanOnly { + if inRange { + return nil, p.getErr(ErrBadClassInCharRange, ch) + } + cc.addSpace(p.useOptionE(), p.useRE2(), ch == 'S') + } + continue + + case 'W', 'w': + if !scanOnly { + if inRange { + return nil, p.getErr(ErrBadClassInCharRange, ch) + } + + cc.addWord(p.useOptionE() || p.useRE2(), ch == 'W') + } + continue + + case 'p', 'P': + if !scanOnly { + if inRange { + return nil, p.getErr(ErrBadClassInCharRange, ch) + } + prop, err := p.parseProperty() + if err != nil { + return nil, err + } + cc.addCategory(prop, (ch != 'p'), caseInsensitive, p.patternRaw) + } else { + p.parseProperty() + } + + continue + + case '-': + if !scanOnly { + cc.addRange(ch, ch) + } + continue + + default: + p.moveLeft() + var err error + ch, err = p.scanCharEscape() // non-literal character + if err != nil { + return nil, err + } + fTranslatedChar = true + break // this break will only break out of the switch + } + } else if ch == '[' { + // This is code for Posix style properties - [:Ll:] or [:IsTibetan:]. + // It currently doesn't do anything other than skip the whole thing! + if p.charsRight() > 0 && p.rightChar(0) == ':' && !inRange { + savePos := p.textpos() + + p.moveRight(1) + negate := false + if p.charsRight() > 1 && p.rightChar(0) == '^' { + negate = true + p.moveRight(1) + } + + nm := p.scanCapname() // snag the name + if !scanOnly && p.useRE2() { + // look up the name since these are valid for RE2 + // add the group based on the name + if ok := cc.addNamedASCII(nm, negate); !ok { + return nil, p.getErr(ErrInvalidCharRange) + } + } + if p.charsRight() < 2 || p.moveRightGetChar() != ':' || p.moveRightGetChar() != ']' { + p.textto(savePos) + } else if p.useRE2() { + // move on + continue + } + } + } + + if inRange { + inRange = false + if !scanOnly { + if ch == '[' && !fTranslatedChar && !firstChar { + // We thought we were in a range, but we're actually starting a subtraction. + // In that case, we'll add chPrev to our char class, skip the opening [, and + // scan the new character class recursively. + cc.addChar(chPrev) + sub, err := p.scanCharSet(caseInsensitive, false) + if err != nil { + return nil, err + } + cc.addSubtraction(sub) + + if p.charsRight() > 0 && p.rightChar(0) != ']' { + return nil, p.getErr(ErrSubtractionMustBeLast) + } + } else { + // a regular range, like a-z + if chPrev > ch { + return nil, p.getErr(ErrReversedCharRange, chPrev, ch) + } + cc.addRange(chPrev, ch) + } + } + } else if p.charsRight() >= 2 && p.rightChar(0) == '-' && p.rightChar(1) != ']' { + // this could be the start of a range + chPrev = ch + inRange = true + p.moveRight(1) + } else if p.charsRight() >= 1 && ch == '-' && !fTranslatedChar && p.rightChar(0) == '[' && !firstChar { + // we aren't in a range, and now there is a subtraction. Usually this happens + // only when a subtraction follows a range, like [a-z-[b]] + if !scanOnly { + p.moveRight(1) + sub, err := p.scanCharSet(caseInsensitive, false) + if err != nil { + return nil, err + } + cc.addSubtraction(sub) + + if p.charsRight() > 0 && p.rightChar(0) != ']' { + return nil, p.getErr(ErrSubtractionMustBeLast) + } + } else { + p.moveRight(1) + p.scanCharSet(caseInsensitive, true) + } + } else { + if !scanOnly { + cc.addRange(ch, ch) + } + } + } + + if !closed { + return nil, p.getErr(ErrUnterminatedBracket) + } + + if !scanOnly && caseInsensitive { + cc.addLowercase() + } + + return cc, nil +} + +// Scans any number of decimal digits (pegs value at 2^31-1 if too large) +func (p *parser) scanDecimal() (int, error) { + i := 0 + var d int + + for p.charsRight() > 0 { + d = int(p.rightChar(0) - '0') + if d < 0 || d > 9 { + break + } + p.moveRight(1) + + if i > maxValueDiv10 || (i == maxValueDiv10 && d > maxValueMod10) { + return 0, p.getErr(ErrCaptureGroupOutOfRange) + } + + i *= 10 + i += d + } + + return int(i), nil +} + +// Returns true for options allowed only at the top level +func isOnlyTopOption(option RegexOptions) bool { + return option == RightToLeft || option == ECMAScript || option == RE2 +} + +// Scans cimsx-cimsx option string, stops at the first unrecognized char. +func (p *parser) scanOptions() { + + for off := false; p.charsRight() > 0; p.moveRight(1) { + ch := p.rightChar(0) + + if ch == '-' { + off = true + } else if ch == '+' { + off = false + } else { + option := optionFromCode(ch) + if option == 0 || isOnlyTopOption(option) { + return + } + + if off { + p.options &= ^option + } else { + p.options |= option + } + } + } +} + +// Scans \ code for escape codes that map to single unicode chars. +func (p *parser) scanCharEscape() (r rune, err error) { + + ch := p.moveRightGetChar() + + if ch >= '0' && ch <= '7' { + p.moveLeft() + return p.scanOctal(), nil + } + + pos := p.textpos() + + switch ch { + case 'x': + // support for \x{HEX} syntax from Perl and PCRE + if p.charsRight() > 0 && p.rightChar(0) == '{' { + if p.useOptionE() { + return ch, nil + } + p.moveRight(1) + return p.scanHexUntilBrace() + } else { + r, err = p.scanHex(2) + } + case 'u': + // ECMAscript suppot \u{HEX} only if `u` is also set + if p.useOptionE() && p.useOptionU() && p.charsRight() > 0 && p.rightChar(0) == '{' { + p.moveRight(1) + return p.scanHexUntilBrace() + } else { + r, err = p.scanHex(4) + } + case 'a': + return '\u0007', nil + case 'b': + return '\b', nil + case 'e': + return '\u001B', nil + case 'f': + return '\f', nil + case 'n': + return '\n', nil + case 'r': + return '\r', nil + case 't': + return '\t', nil + case 'v': + return '\u000B', nil + case 'c': + r, err = p.scanControl() + default: + if !p.useOptionE() && !p.useRE2() && IsWordChar(ch) { + return 0, p.getErr(ErrUnrecognizedEscape, string(ch)) + } + return ch, nil + } + if err != nil && p.useOptionE() { + p.textto(pos) + return ch, nil + } + return +} + +// Grabs and converts an ascii control character +func (p *parser) scanControl() (rune, error) { + if p.charsRight() <= 0 { + return 0, p.getErr(ErrMissingControl) + } + + ch := p.moveRightGetChar() + + // \ca interpreted as \cA + + if ch >= 'a' && ch <= 'z' { + ch = (ch - ('a' - 'A')) + } + ch = (ch - '@') + if ch >= 0 && ch < ' ' { + return ch, nil + } + + return 0, p.getErr(ErrUnrecognizedControl) + +} + +// Scan hex digits until we hit a closing brace. +// Non-hex digits, hex value too large for UTF-8, or running out of chars are errors +func (p *parser) scanHexUntilBrace() (rune, error) { + // PCRE spec reads like unlimited hex digits are allowed, but unicode has a limit + // so we can enforce that + i := 0 + hasContent := false + + for p.charsRight() > 0 { + ch := p.moveRightGetChar() + if ch == '}' { + // hit our close brace, we're done here + // prevent \x{} + if !hasContent { + return 0, p.getErr(ErrTooFewHex) + } + return rune(i), nil + } + hasContent = true + // no brace needs to be hex digit + d := hexDigit(ch) + if d < 0 { + return 0, p.getErr(ErrMissingBrace) + } + + i *= 0x10 + i += d + + if i > unicode.MaxRune { + return 0, p.getErr(ErrInvalidHex) + } + } + + // we only make it here if we run out of digits without finding the brace + return 0, p.getErr(ErrMissingBrace) +} + +// Scans exactly c hex digits (c=2 for \xFF, c=4 for \uFFFF) +func (p *parser) scanHex(c int) (rune, error) { + + i := 0 + + if p.charsRight() >= c { + for c > 0 { + d := hexDigit(p.moveRightGetChar()) + if d < 0 { + break + } + i *= 0x10 + i += d + c-- + } + } + + if c > 0 { + return 0, p.getErr(ErrTooFewHex) + } + + return rune(i), nil +} + +// Returns n <= 0xF for a hex digit. +func hexDigit(ch rune) int { + + if d := uint(ch - '0'); d <= 9 { + return int(d) + } + + if d := uint(ch - 'a'); d <= 5 { + return int(d + 0xa) + } + + if d := uint(ch - 'A'); d <= 5 { + return int(d + 0xa) + } + + return -1 +} + +// Scans up to three octal digits (stops before exceeding 0377). +func (p *parser) scanOctal() rune { + // Consume octal chars only up to 3 digits and value 0377 + + c := 3 + + if c > p.charsRight() { + c = p.charsRight() + } + + //we know the first char is good because the caller had to check + i := 0 + d := int(p.rightChar(0) - '0') + for c > 0 && d <= 7 && d >= 0 { + if i >= 0x20 && p.useOptionE() { + break + } + i *= 8 + i += d + c-- + + p.moveRight(1) + if !p.rightMost() { + d = int(p.rightChar(0) - '0') + } + } + + // Octal codes only go up to 255. Any larger and the behavior that Perl follows + // is simply to truncate the high bits. + i &= 0xFF + + return rune(i) +} + +// Returns the current parsing position. +func (p *parser) textpos() int { + return p.currentPos +} + +// Zaps to a specific parsing position. +func (p *parser) textto(pos int) { + p.currentPos = pos +} + +// Returns the char at the right of the current parsing position and advances to the right. +func (p *parser) moveRightGetChar() rune { + ch := p.pattern[p.currentPos] + p.currentPos++ + return ch +} + +// Moves the current position to the right. +func (p *parser) moveRight(i int) { + // default would be 1 + p.currentPos += i +} + +// Moves the current parsing position one to the left. +func (p *parser) moveLeft() { + p.currentPos-- +} + +// Returns the char left of the current parsing position. +func (p *parser) charAt(i int) rune { + return p.pattern[i] +} + +// Returns the char i chars right of the current parsing position. +func (p *parser) rightChar(i int) rune { + // default would be 0 + return p.pattern[p.currentPos+i] +} + +// Number of characters to the right of the current parsing position. +func (p *parser) charsRight() int { + return len(p.pattern) - p.currentPos +} + +func (p *parser) rightMost() bool { + return p.currentPos == len(p.pattern) +} + +// Looks up the slot number for a given name +func (p *parser) captureSlotFromName(capname string) int { + return p.capnames[capname] +} + +// True if the capture slot was noted +func (p *parser) isCaptureSlot(i int) bool { + if p.caps != nil { + _, ok := p.caps[i] + return ok + } + + return (i >= 0 && i < p.capsize) +} + +// Looks up the slot number for a given name +func (p *parser) isCaptureName(capname string) bool { + if p.capnames == nil { + return false + } + + _, ok := p.capnames[capname] + return ok +} + +// option shortcuts + +// True if N option disabling '(' autocapture is on. +func (p *parser) useOptionN() bool { + return (p.options & ExplicitCapture) != 0 +} + +// True if I option enabling case-insensitivity is on. +func (p *parser) useOptionI() bool { + return (p.options & IgnoreCase) != 0 +} + +// True if M option altering meaning of $ and ^ is on. +func (p *parser) useOptionM() bool { + return (p.options & Multiline) != 0 +} + +// True if S option altering meaning of . is on. +func (p *parser) useOptionS() bool { + return (p.options & Singleline) != 0 +} + +// True if X option enabling whitespace/comment mode is on. +func (p *parser) useOptionX() bool { + return (p.options & IgnorePatternWhitespace) != 0 +} + +// True if E option enabling ECMAScript behavior on. +func (p *parser) useOptionE() bool { + return (p.options & ECMAScript) != 0 +} + +// true to use RE2 compatibility parsing behavior. +func (p *parser) useRE2() bool { + return (p.options & RE2) != 0 +} + +// True if U option enabling ECMAScript's Unicode behavior on. +func (p *parser) useOptionU() bool { + return (p.options & Unicode) != 0 +} + +// True if options stack is empty. +func (p *parser) emptyOptionsStack() bool { + return len(p.optionsStack) == 0 +} + +// Finish the current quantifiable (when a quantifier is not found or is not possible) +func (p *parser) addConcatenate() { + // The first (| inside a Testgroup group goes directly to the group + p.concatenation.addChild(p.unit) + p.unit = nil +} + +// Finish the current quantifiable (when a quantifier is found) +func (p *parser) addConcatenate3(lazy bool, min, max int) { + p.concatenation.addChild(p.unit.makeQuantifier(lazy, min, max)) + p.unit = nil +} + +// Sets the current unit to a single char node +func (p *parser) addUnitOne(ch rune) { + if p.useOptionI() { + ch = unicode.ToLower(ch) + } + + p.unit = newRegexNodeCh(ntOne, p.options, ch) +} + +// Sets the current unit to a single inverse-char node +func (p *parser) addUnitNotone(ch rune) { + if p.useOptionI() { + ch = unicode.ToLower(ch) + } + + p.unit = newRegexNodeCh(ntNotone, p.options, ch) +} + +// Sets the current unit to a single set node +func (p *parser) addUnitSet(set *CharSet) { + p.unit = newRegexNodeSet(ntSet, p.options, set) +} + +// Sets the current unit to a subtree +func (p *parser) addUnitNode(node *regexNode) { + p.unit = node +} + +// Sets the current unit to an assertion of the specified type +func (p *parser) addUnitType(t nodeType) { + p.unit = newRegexNode(t, p.options) +} + +// Finish the current group (in response to a ')' or end) +func (p *parser) addGroup() error { + if p.group.t == ntTestgroup || p.group.t == ntTestref { + p.group.addChild(p.concatenation.reverseLeft()) + if (p.group.t == ntTestref && len(p.group.children) > 2) || len(p.group.children) > 3 { + return p.getErr(ErrTooManyAlternates) + } + } else { + p.alternation.addChild(p.concatenation.reverseLeft()) + p.group.addChild(p.alternation) + } + + p.unit = p.group + return nil +} + +// Pops the option stack, but keeps the current options unchanged. +func (p *parser) popKeepOptions() { + lastIdx := len(p.optionsStack) - 1 + p.optionsStack = p.optionsStack[:lastIdx] +} + +// Recalls options from the stack. +func (p *parser) popOptions() { + lastIdx := len(p.optionsStack) - 1 + // get the last item on the stack and then remove it by reslicing + p.options = p.optionsStack[lastIdx] + p.optionsStack = p.optionsStack[:lastIdx] +} + +// Saves options on a stack. +func (p *parser) pushOptions() { + p.optionsStack = append(p.optionsStack, p.options) +} + +// Add a string to the last concatenate. +func (p *parser) addToConcatenate(pos, cch int, isReplacement bool) { + var node *regexNode + + if cch == 0 { + return + } + + if cch > 1 { + str := make([]rune, cch) + copy(str, p.pattern[pos:pos+cch]) + + if p.useOptionI() && !isReplacement { + // We do the ToLower character by character for consistency. With surrogate chars, doing + // a ToLower on the entire string could actually change the surrogate pair. This is more correct + // linguistically, but since Regex doesn't support surrogates, it's more important to be + // consistent. + for i := 0; i < len(str); i++ { + str[i] = unicode.ToLower(str[i]) + } + } + + node = newRegexNodeStr(ntMulti, p.options, str) + } else { + ch := p.charAt(pos) + + if p.useOptionI() && !isReplacement { + ch = unicode.ToLower(ch) + } + + node = newRegexNodeCh(ntOne, p.options, ch) + } + + p.concatenation.addChild(node) +} + +// Push the parser state (in response to an open paren) +func (p *parser) pushGroup() { + p.group.next = p.stack + p.alternation.next = p.group + p.concatenation.next = p.alternation + p.stack = p.concatenation +} + +// Remember the pushed state (in response to a ')') +func (p *parser) popGroup() error { + p.concatenation = p.stack + p.alternation = p.concatenation.next + p.group = p.alternation.next + p.stack = p.group.next + + // The first () inside a Testgroup group goes directly to the group + if p.group.t == ntTestgroup && len(p.group.children) == 0 { + if p.unit == nil { + return p.getErr(ErrConditionalExpression) + } + + p.group.addChild(p.unit) + p.unit = nil + } + return nil +} + +// True if the group stack is empty. +func (p *parser) emptyStack() bool { + return p.stack == nil +} + +// Start a new round for the parser state (in response to an open paren or string start) +func (p *parser) startGroup(openGroup *regexNode) { + p.group = openGroup + p.alternation = newRegexNode(ntAlternate, p.options) + p.concatenation = newRegexNode(ntConcatenate, p.options) +} + +// Finish the current concatenation (in response to a |) +func (p *parser) addAlternate() { + // The | parts inside a Testgroup group go directly to the group + + if p.group.t == ntTestgroup || p.group.t == ntTestref { + p.group.addChild(p.concatenation.reverseLeft()) + } else { + p.alternation.addChild(p.concatenation.reverseLeft()) + } + + p.concatenation = newRegexNode(ntConcatenate, p.options) +} + +// For categorizing ascii characters. + +const ( + Q byte = 5 // quantifier + S = 4 // ordinary stopper + Z = 3 // ScanBlank stopper + X = 2 // whitespace + E = 1 // should be escaped +) + +var _category = []byte{ + //01 2 3 4 5 6 7 8 9 A B C D E F 0 1 2 3 4 5 6 7 8 9 A B C D E F + 0, 0, 0, 0, 0, 0, 0, 0, 0, X, X, X, X, X, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + // ! " # $ % & ' ( ) * + , - . / 0 1 2 3 4 5 6 7 8 9 : ; < = > ? + X, 0, 0, Z, S, 0, 0, 0, S, S, Q, Q, 0, 0, S, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Q, + //@A B C D E F G H I J K L M N O P Q R S T U V W X Y Z [ \ ] ^ _ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, S, S, 0, S, 0, + //'a b c d e f g h i j k l m n o p q r s t u v w x y z { | } ~ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, Q, S, 0, 0, 0, +} + +func isSpace(ch rune) bool { + return (ch <= ' ' && _category[ch] == X) +} + +// Returns true for those characters that terminate a string of ordinary chars. +func isSpecial(ch rune) bool { + return (ch <= '|' && _category[ch] >= S) +} + +// Returns true for those characters that terminate a string of ordinary chars. +func isStopperX(ch rune) bool { + return (ch <= '|' && _category[ch] >= X) +} + +// Returns true for those characters that begin a quantifier. +func isQuantifier(ch rune) bool { + return (ch <= '{' && _category[ch] >= Q) +} + +func (p *parser) isTrueQuantifier() bool { + nChars := p.charsRight() + if nChars == 0 { + return false + } + + startpos := p.textpos() + ch := p.charAt(startpos) + if ch != '{' { + return ch <= '{' && _category[ch] >= Q + } + + //UGLY: this is ugly -- the original code was ugly too + pos := startpos + for { + nChars-- + if nChars <= 0 { + break + } + pos++ + ch = p.charAt(pos) + if ch < '0' || ch > '9' { + break + } + } + + if nChars == 0 || pos-startpos == 1 { + return false + } + if ch == '}' { + return true + } + if ch != ',' { + return false + } + for { + nChars-- + if nChars <= 0 { + break + } + pos++ + ch = p.charAt(pos) + if ch < '0' || ch > '9' { + break + } + } + + return nChars > 0 && ch == '}' +} diff --git a/vendor/github.com/dlclark/regexp2/syntax/prefix.go b/vendor/github.com/dlclark/regexp2/syntax/prefix.go new file mode 100644 index 0000000..f671688 --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/syntax/prefix.go @@ -0,0 +1,896 @@ +package syntax + +import ( + "bytes" + "fmt" + "strconv" + "unicode" + "unicode/utf8" +) + +type Prefix struct { + PrefixStr []rune + PrefixSet CharSet + CaseInsensitive bool +} + +// It takes a RegexTree and computes the set of chars that can start it. +func getFirstCharsPrefix(tree *RegexTree) *Prefix { + s := regexFcd{ + fcStack: make([]regexFc, 32), + intStack: make([]int, 32), + } + fc := s.regexFCFromRegexTree(tree) + + if fc == nil || fc.nullable || fc.cc.IsEmpty() { + return nil + } + fcSet := fc.getFirstChars() + return &Prefix{PrefixSet: fcSet, CaseInsensitive: fc.caseInsensitive} +} + +type regexFcd struct { + intStack []int + intDepth int + fcStack []regexFc + fcDepth int + skipAllChildren bool // don't process any more children at the current level + skipchild bool // don't process the current child. + failed bool +} + +/* + * The main FC computation. It does a shortcutted depth-first walk + * through the tree and calls CalculateFC to emits code before + * and after each child of an interior node, and at each leaf. + */ +func (s *regexFcd) regexFCFromRegexTree(tree *RegexTree) *regexFc { + curNode := tree.root + curChild := 0 + + for { + if len(curNode.children) == 0 { + // This is a leaf node + s.calculateFC(curNode.t, curNode, 0) + } else if curChild < len(curNode.children) && !s.skipAllChildren { + // This is an interior node, and we have more children to analyze + s.calculateFC(curNode.t|beforeChild, curNode, curChild) + + if !s.skipchild { + curNode = curNode.children[curChild] + // this stack is how we get a depth first walk of the tree. + s.pushInt(curChild) + curChild = 0 + } else { + curChild++ + s.skipchild = false + } + continue + } + + // This is an interior node where we've finished analyzing all the children, or + // the end of a leaf node. + s.skipAllChildren = false + + if s.intIsEmpty() { + break + } + + curChild = s.popInt() + curNode = curNode.next + + s.calculateFC(curNode.t|afterChild, curNode, curChild) + if s.failed { + return nil + } + + curChild++ + } + + if s.fcIsEmpty() { + return nil + } + + return s.popFC() +} + +// To avoid recursion, we use a simple integer stack. +// This is the push. +func (s *regexFcd) pushInt(I int) { + if s.intDepth >= len(s.intStack) { + expanded := make([]int, s.intDepth*2) + copy(expanded, s.intStack) + s.intStack = expanded + } + + s.intStack[s.intDepth] = I + s.intDepth++ +} + +// True if the stack is empty. +func (s *regexFcd) intIsEmpty() bool { + return s.intDepth == 0 +} + +// This is the pop. +func (s *regexFcd) popInt() int { + s.intDepth-- + return s.intStack[s.intDepth] +} + +// We also use a stack of RegexFC objects. +// This is the push. +func (s *regexFcd) pushFC(fc regexFc) { + if s.fcDepth >= len(s.fcStack) { + expanded := make([]regexFc, s.fcDepth*2) + copy(expanded, s.fcStack) + s.fcStack = expanded + } + + s.fcStack[s.fcDepth] = fc + s.fcDepth++ +} + +// True if the stack is empty. +func (s *regexFcd) fcIsEmpty() bool { + return s.fcDepth == 0 +} + +// This is the pop. +func (s *regexFcd) popFC() *regexFc { + s.fcDepth-- + return &s.fcStack[s.fcDepth] +} + +// This is the top. +func (s *regexFcd) topFC() *regexFc { + return &s.fcStack[s.fcDepth-1] +} + +// Called in Beforechild to prevent further processing of the current child +func (s *regexFcd) skipChild() { + s.skipchild = true +} + +// FC computation and shortcut cases for each node type +func (s *regexFcd) calculateFC(nt nodeType, node *regexNode, CurIndex int) { + //fmt.Printf("NodeType: %v, CurIndex: %v, Desc: %v\n", nt, CurIndex, node.description()) + ci := false + rtl := false + + if nt <= ntRef { + if (node.options & IgnoreCase) != 0 { + ci = true + } + if (node.options & RightToLeft) != 0 { + rtl = true + } + } + + switch nt { + case ntConcatenate | beforeChild, ntAlternate | beforeChild, ntTestref | beforeChild, ntLoop | beforeChild, ntLazyloop | beforeChild: + break + + case ntTestgroup | beforeChild: + if CurIndex == 0 { + s.skipChild() + } + break + + case ntEmpty: + s.pushFC(regexFc{nullable: true}) + break + + case ntConcatenate | afterChild: + if CurIndex != 0 { + child := s.popFC() + cumul := s.topFC() + + s.failed = !cumul.addFC(*child, true) + } + + fc := s.topFC() + if !fc.nullable { + s.skipAllChildren = true + } + break + + case ntTestgroup | afterChild: + if CurIndex > 1 { + child := s.popFC() + cumul := s.topFC() + + s.failed = !cumul.addFC(*child, false) + } + break + + case ntAlternate | afterChild, ntTestref | afterChild: + if CurIndex != 0 { + child := s.popFC() + cumul := s.topFC() + + s.failed = !cumul.addFC(*child, false) + } + break + + case ntLoop | afterChild, ntLazyloop | afterChild: + if node.m == 0 { + fc := s.topFC() + fc.nullable = true + } + break + + case ntGroup | beforeChild, ntGroup | afterChild, ntCapture | beforeChild, ntCapture | afterChild, ntGreedy | beforeChild, ntGreedy | afterChild: + break + + case ntRequire | beforeChild, ntPrevent | beforeChild: + s.skipChild() + s.pushFC(regexFc{nullable: true}) + break + + case ntRequire | afterChild, ntPrevent | afterChild: + break + + case ntOne, ntNotone: + s.pushFC(newRegexFc(node.ch, nt == ntNotone, false, ci)) + break + + case ntOneloop, ntOnelazy: + s.pushFC(newRegexFc(node.ch, false, node.m == 0, ci)) + break + + case ntNotoneloop, ntNotonelazy: + s.pushFC(newRegexFc(node.ch, true, node.m == 0, ci)) + break + + case ntMulti: + if len(node.str) == 0 { + s.pushFC(regexFc{nullable: true}) + } else if !rtl { + s.pushFC(newRegexFc(node.str[0], false, false, ci)) + } else { + s.pushFC(newRegexFc(node.str[len(node.str)-1], false, false, ci)) + } + break + + case ntSet: + s.pushFC(regexFc{cc: node.set.Copy(), nullable: false, caseInsensitive: ci}) + break + + case ntSetloop, ntSetlazy: + s.pushFC(regexFc{cc: node.set.Copy(), nullable: node.m == 0, caseInsensitive: ci}) + break + + case ntRef: + s.pushFC(regexFc{cc: *AnyClass(), nullable: true, caseInsensitive: false}) + break + + case ntNothing, ntBol, ntEol, ntBoundary, ntNonboundary, ntECMABoundary, ntNonECMABoundary, ntBeginning, ntStart, ntEndZ, ntEnd: + s.pushFC(regexFc{nullable: true}) + break + + default: + panic(fmt.Sprintf("unexpected op code: %v", nt)) + } +} + +type regexFc struct { + cc CharSet + nullable bool + caseInsensitive bool +} + +func newRegexFc(ch rune, not, nullable, caseInsensitive bool) regexFc { + r := regexFc{ + caseInsensitive: caseInsensitive, + nullable: nullable, + } + if not { + if ch > 0 { + r.cc.addRange('\x00', ch-1) + } + if ch < 0xFFFF { + r.cc.addRange(ch+1, utf8.MaxRune) + } + } else { + r.cc.addRange(ch, ch) + } + return r +} + +func (r *regexFc) getFirstChars() CharSet { + if r.caseInsensitive { + r.cc.addLowercase() + } + + return r.cc +} + +func (r *regexFc) addFC(fc regexFc, concatenate bool) bool { + if !r.cc.IsMergeable() || !fc.cc.IsMergeable() { + return false + } + + if concatenate { + if !r.nullable { + return true + } + + if !fc.nullable { + r.nullable = false + } + } else { + if fc.nullable { + r.nullable = true + } + } + + r.caseInsensitive = r.caseInsensitive || fc.caseInsensitive + r.cc.addSet(fc.cc) + + return true +} + +// This is a related computation: it takes a RegexTree and computes the +// leading substring if it sees one. It's quite trivial and gives up easily. +func getPrefix(tree *RegexTree) *Prefix { + var concatNode *regexNode + nextChild := 0 + + curNode := tree.root + + for { + switch curNode.t { + case ntConcatenate: + if len(curNode.children) > 0 { + concatNode = curNode + nextChild = 0 + } + + case ntGreedy, ntCapture: + curNode = curNode.children[0] + concatNode = nil + continue + + case ntOneloop, ntOnelazy: + if curNode.m > 0 { + return &Prefix{ + PrefixStr: repeat(curNode.ch, curNode.m), + CaseInsensitive: (curNode.options & IgnoreCase) != 0, + } + } + return nil + + case ntOne: + return &Prefix{ + PrefixStr: []rune{curNode.ch}, + CaseInsensitive: (curNode.options & IgnoreCase) != 0, + } + + case ntMulti: + return &Prefix{ + PrefixStr: curNode.str, + CaseInsensitive: (curNode.options & IgnoreCase) != 0, + } + + case ntBol, ntEol, ntBoundary, ntECMABoundary, ntBeginning, ntStart, + ntEndZ, ntEnd, ntEmpty, ntRequire, ntPrevent: + + default: + return nil + } + + if concatNode == nil || nextChild >= len(concatNode.children) { + return nil + } + + curNode = concatNode.children[nextChild] + nextChild++ + } +} + +// repeat the rune r, c times... up to the max of MaxPrefixSize +func repeat(r rune, c int) []rune { + if c > MaxPrefixSize { + c = MaxPrefixSize + } + + ret := make([]rune, c) + + // binary growth using copy for speed + ret[0] = r + bp := 1 + for bp < len(ret) { + copy(ret[bp:], ret[:bp]) + bp *= 2 + } + + return ret +} + +// BmPrefix precomputes the Boyer-Moore +// tables for fast string scanning. These tables allow +// you to scan for the first occurrence of a string within +// a large body of text without examining every character. +// The performance of the heuristic depends on the actual +// string and the text being searched, but usually, the longer +// the string that is being searched for, the fewer characters +// need to be examined. +type BmPrefix struct { + positive []int + negativeASCII []int + negativeUnicode [][]int + pattern []rune + lowASCII rune + highASCII rune + rightToLeft bool + caseInsensitive bool +} + +func newBmPrefix(pattern []rune, caseInsensitive, rightToLeft bool) *BmPrefix { + + b := &BmPrefix{ + rightToLeft: rightToLeft, + caseInsensitive: caseInsensitive, + pattern: pattern, + } + + if caseInsensitive { + for i := 0; i < len(b.pattern); i++ { + // We do the ToLower character by character for consistency. With surrogate chars, doing + // a ToLower on the entire string could actually change the surrogate pair. This is more correct + // linguistically, but since Regex doesn't support surrogates, it's more important to be + // consistent. + + b.pattern[i] = unicode.ToLower(b.pattern[i]) + } + } + + var beforefirst, last, bump int + var scan, match int + + if !rightToLeft { + beforefirst = -1 + last = len(b.pattern) - 1 + bump = 1 + } else { + beforefirst = len(b.pattern) + last = 0 + bump = -1 + } + + // PART I - the good-suffix shift table + // + // compute the positive requirement: + // if char "i" is the first one from the right that doesn't match, + // then we know the matcher can advance by _positive[i]. + // + // This algorithm is a simplified variant of the standard + // Boyer-Moore good suffix calculation. + + b.positive = make([]int, len(b.pattern)) + + examine := last + ch := b.pattern[examine] + b.positive[examine] = bump + examine -= bump + +Outerloop: + for { + // find an internal char (examine) that matches the tail + + for { + if examine == beforefirst { + break Outerloop + } + if b.pattern[examine] == ch { + break + } + examine -= bump + } + + match = last + scan = examine + + // find the length of the match + for { + if scan == beforefirst || b.pattern[match] != b.pattern[scan] { + // at the end of the match, note the difference in _positive + // this is not the length of the match, but the distance from the internal match + // to the tail suffix. + if b.positive[match] == 0 { + b.positive[match] = match - scan + } + + // System.Diagnostics.Debug.WriteLine("Set positive[" + match + "] to " + (match - scan)); + + break + } + + scan -= bump + match -= bump + } + + examine -= bump + } + + match = last - bump + + // scan for the chars for which there are no shifts that yield a different candidate + + // The inside of the if statement used to say + // "_positive[match] = last - beforefirst;" + // This is slightly less aggressive in how much we skip, but at worst it + // should mean a little more work rather than skipping a potential match. + for match != beforefirst { + if b.positive[match] == 0 { + b.positive[match] = bump + } + + match -= bump + } + + // PART II - the bad-character shift table + // + // compute the negative requirement: + // if char "ch" is the reject character when testing position "i", + // we can slide up by _negative[ch]; + // (_negative[ch] = str.Length - 1 - str.LastIndexOf(ch)) + // + // the lookup table is divided into ASCII and Unicode portions; + // only those parts of the Unicode 16-bit code set that actually + // appear in the string are in the table. (Maximum size with + // Unicode is 65K; ASCII only case is 512 bytes.) + + b.negativeASCII = make([]int, 128) + + for i := 0; i < len(b.negativeASCII); i++ { + b.negativeASCII[i] = last - beforefirst + } + + b.lowASCII = 127 + b.highASCII = 0 + + for examine = last; examine != beforefirst; examine -= bump { + ch = b.pattern[examine] + + switch { + case ch < 128: + if b.lowASCII > ch { + b.lowASCII = ch + } + + if b.highASCII < ch { + b.highASCII = ch + } + + if b.negativeASCII[ch] == last-beforefirst { + b.negativeASCII[ch] = last - examine + } + case ch <= 0xffff: + i, j := ch>>8, ch&0xFF + + if b.negativeUnicode == nil { + b.negativeUnicode = make([][]int, 256) + } + + if b.negativeUnicode[i] == nil { + newarray := make([]int, 256) + + for k := 0; k < len(newarray); k++ { + newarray[k] = last - beforefirst + } + + if i == 0 { + copy(newarray, b.negativeASCII) + //TODO: this line needed? + b.negativeASCII = newarray + } + + b.negativeUnicode[i] = newarray + } + + if b.negativeUnicode[i][j] == last-beforefirst { + b.negativeUnicode[i][j] = last - examine + } + default: + // we can't do the filter because this algo doesn't support + // unicode chars >0xffff + return nil + } + } + + return b +} + +func (b *BmPrefix) String() string { + return string(b.pattern) +} + +// Dump returns the contents of the filter as a human readable string +func (b *BmPrefix) Dump(indent string) string { + buf := &bytes.Buffer{} + + fmt.Fprintf(buf, "%sBM Pattern: %s\n%sPositive: ", indent, string(b.pattern), indent) + for i := 0; i < len(b.positive); i++ { + buf.WriteString(strconv.Itoa(b.positive[i])) + buf.WriteRune(' ') + } + buf.WriteRune('\n') + + if b.negativeASCII != nil { + buf.WriteString(indent) + buf.WriteString("Negative table\n") + for i := 0; i < len(b.negativeASCII); i++ { + if b.negativeASCII[i] != len(b.pattern) { + fmt.Fprintf(buf, "%s %s %s\n", indent, Escape(string(rune(i))), strconv.Itoa(b.negativeASCII[i])) + } + } + } + + return buf.String() +} + +// Scan uses the Boyer-Moore algorithm to find the first occurrence +// of the specified string within text, beginning at index, and +// constrained within beglimit and endlimit. +// +// The direction and case-sensitivity of the match is determined +// by the arguments to the RegexBoyerMoore constructor. +func (b *BmPrefix) Scan(text []rune, index, beglimit, endlimit int) int { + var ( + defadv, test, test2 int + match, startmatch, endmatch int + bump, advance int + chTest rune + unicodeLookup []int + ) + + if !b.rightToLeft { + defadv = len(b.pattern) + startmatch = len(b.pattern) - 1 + endmatch = 0 + test = index + defadv - 1 + bump = 1 + } else { + defadv = -len(b.pattern) + startmatch = 0 + endmatch = -defadv - 1 + test = index + defadv + bump = -1 + } + + chMatch := b.pattern[startmatch] + + for { + if test >= endlimit || test < beglimit { + return -1 + } + + chTest = text[test] + + if b.caseInsensitive { + chTest = unicode.ToLower(chTest) + } + + if chTest != chMatch { + if chTest < 128 { + advance = b.negativeASCII[chTest] + } else if chTest < 0xffff && len(b.negativeUnicode) > 0 { + unicodeLookup = b.negativeUnicode[chTest>>8] + if len(unicodeLookup) > 0 { + advance = unicodeLookup[chTest&0xFF] + } else { + advance = defadv + } + } else { + advance = defadv + } + + test += advance + } else { // if (chTest == chMatch) + test2 = test + match = startmatch + + for { + if match == endmatch { + if b.rightToLeft { + return test2 + 1 + } else { + return test2 + } + } + + match -= bump + test2 -= bump + + chTest = text[test2] + + if b.caseInsensitive { + chTest = unicode.ToLower(chTest) + } + + if chTest != b.pattern[match] { + advance = b.positive[match] + if chTest < 128 { + test2 = (match - startmatch) + b.negativeASCII[chTest] + } else if chTest < 0xffff && len(b.negativeUnicode) > 0 { + unicodeLookup = b.negativeUnicode[chTest>>8] + if len(unicodeLookup) > 0 { + test2 = (match - startmatch) + unicodeLookup[chTest&0xFF] + } else { + test += advance + break + } + } else { + test += advance + break + } + + if b.rightToLeft { + if test2 < advance { + advance = test2 + } + } else if test2 > advance { + advance = test2 + } + + test += advance + break + } + } + } + } +} + +// When a regex is anchored, we can do a quick IsMatch test instead of a Scan +func (b *BmPrefix) IsMatch(text []rune, index, beglimit, endlimit int) bool { + if !b.rightToLeft { + if index < beglimit || endlimit-index < len(b.pattern) { + return false + } + + return b.matchPattern(text, index) + } else { + if index > endlimit || index-beglimit < len(b.pattern) { + return false + } + + return b.matchPattern(text, index-len(b.pattern)) + } +} + +func (b *BmPrefix) matchPattern(text []rune, index int) bool { + if len(text)-index < len(b.pattern) { + return false + } + + if b.caseInsensitive { + for i := 0; i < len(b.pattern); i++ { + //Debug.Assert(textinfo.ToLower(_pattern[i]) == _pattern[i], "pattern should be converted to lower case in constructor!"); + if unicode.ToLower(text[index+i]) != b.pattern[i] { + return false + } + } + return true + } else { + for i := 0; i < len(b.pattern); i++ { + if text[index+i] != b.pattern[i] { + return false + } + } + return true + } +} + +type AnchorLoc int16 + +// where the regex can be pegged +const ( + AnchorBeginning AnchorLoc = 0x0001 + AnchorBol = 0x0002 + AnchorStart = 0x0004 + AnchorEol = 0x0008 + AnchorEndZ = 0x0010 + AnchorEnd = 0x0020 + AnchorBoundary = 0x0040 + AnchorECMABoundary = 0x0080 +) + +func getAnchors(tree *RegexTree) AnchorLoc { + + var concatNode *regexNode + nextChild, result := 0, AnchorLoc(0) + + curNode := tree.root + + for { + switch curNode.t { + case ntConcatenate: + if len(curNode.children) > 0 { + concatNode = curNode + nextChild = 0 + } + + case ntGreedy, ntCapture: + curNode = curNode.children[0] + concatNode = nil + continue + + case ntBol, ntEol, ntBoundary, ntECMABoundary, ntBeginning, + ntStart, ntEndZ, ntEnd: + return result | anchorFromType(curNode.t) + + case ntEmpty, ntRequire, ntPrevent: + + default: + return result + } + + if concatNode == nil || nextChild >= len(concatNode.children) { + return result + } + + curNode = concatNode.children[nextChild] + nextChild++ + } +} + +func anchorFromType(t nodeType) AnchorLoc { + switch t { + case ntBol: + return AnchorBol + case ntEol: + return AnchorEol + case ntBoundary: + return AnchorBoundary + case ntECMABoundary: + return AnchorECMABoundary + case ntBeginning: + return AnchorBeginning + case ntStart: + return AnchorStart + case ntEndZ: + return AnchorEndZ + case ntEnd: + return AnchorEnd + default: + return 0 + } +} + +// anchorDescription returns a human-readable description of the anchors +func (anchors AnchorLoc) String() string { + buf := &bytes.Buffer{} + + if 0 != (anchors & AnchorBeginning) { + buf.WriteString(", Beginning") + } + if 0 != (anchors & AnchorStart) { + buf.WriteString(", Start") + } + if 0 != (anchors & AnchorBol) { + buf.WriteString(", Bol") + } + if 0 != (anchors & AnchorBoundary) { + buf.WriteString(", Boundary") + } + if 0 != (anchors & AnchorECMABoundary) { + buf.WriteString(", ECMABoundary") + } + if 0 != (anchors & AnchorEol) { + buf.WriteString(", Eol") + } + if 0 != (anchors & AnchorEnd) { + buf.WriteString(", End") + } + if 0 != (anchors & AnchorEndZ) { + buf.WriteString(", EndZ") + } + + // trim off comma + if buf.Len() >= 2 { + return buf.String()[2:] + } + return "None" +} diff --git a/vendor/github.com/dlclark/regexp2/syntax/replacerdata.go b/vendor/github.com/dlclark/regexp2/syntax/replacerdata.go new file mode 100644 index 0000000..bcf4d3f --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/syntax/replacerdata.go @@ -0,0 +1,87 @@ +package syntax + +import ( + "bytes" + "errors" +) + +type ReplacerData struct { + Rep string + Strings []string + Rules []int +} + +const ( + replaceSpecials = 4 + replaceLeftPortion = -1 + replaceRightPortion = -2 + replaceLastGroup = -3 + replaceWholeString = -4 +) + +//ErrReplacementError is a general error during parsing the replacement text +var ErrReplacementError = errors.New("Replacement pattern error.") + +// NewReplacerData will populate a reusable replacer data struct based on the given replacement string +// and the capture group data from a regexp +func NewReplacerData(rep string, caps map[int]int, capsize int, capnames map[string]int, op RegexOptions) (*ReplacerData, error) { + p := parser{ + options: op, + caps: caps, + capsize: capsize, + capnames: capnames, + } + p.setPattern(rep) + concat, err := p.scanReplacement() + if err != nil { + return nil, err + } + + if concat.t != ntConcatenate { + panic(ErrReplacementError) + } + + sb := &bytes.Buffer{} + var ( + strings []string + rules []int + ) + + for _, child := range concat.children { + switch child.t { + case ntMulti: + child.writeStrToBuf(sb) + + case ntOne: + sb.WriteRune(child.ch) + + case ntRef: + if sb.Len() > 0 { + rules = append(rules, len(strings)) + strings = append(strings, sb.String()) + sb.Reset() + } + slot := child.m + + if len(caps) > 0 && slot >= 0 { + slot = caps[slot] + } + + rules = append(rules, -replaceSpecials-1-slot) + + default: + panic(ErrReplacementError) + } + } + + if sb.Len() > 0 { + rules = append(rules, len(strings)) + strings = append(strings, sb.String()) + } + + return &ReplacerData{ + Rep: rep, + Strings: strings, + Rules: rules, + }, nil +} diff --git a/vendor/github.com/dlclark/regexp2/syntax/tree.go b/vendor/github.com/dlclark/regexp2/syntax/tree.go new file mode 100644 index 0000000..ea28829 --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/syntax/tree.go @@ -0,0 +1,654 @@ +package syntax + +import ( + "bytes" + "fmt" + "math" + "strconv" +) + +type RegexTree struct { + root *regexNode + caps map[int]int + capnumlist []int + captop int + Capnames map[string]int + Caplist []string + options RegexOptions +} + +// It is built into a parsed tree for a regular expression. + +// Implementation notes: +// +// Since the node tree is a temporary data structure only used +// during compilation of the regexp to integer codes, it's +// designed for clarity and convenience rather than +// space efficiency. +// +// RegexNodes are built into a tree, linked by the n.children list. +// Each node also has a n.parent and n.ichild member indicating +// its parent and which child # it is in its parent's list. +// +// RegexNodes come in as many types as there are constructs in +// a regular expression, for example, "concatenate", "alternate", +// "one", "rept", "group". There are also node types for basic +// peephole optimizations, e.g., "onerep", "notsetrep", etc. +// +// Because perl 5 allows "lookback" groups that scan backwards, +// each node also gets a "direction". Normally the value of +// boolean n.backward = false. +// +// During parsing, top-level nodes are also stacked onto a parse +// stack (a stack of trees). For this purpose we have a n.next +// pointer. [Note that to save a few bytes, we could overload the +// n.parent pointer instead.] +// +// On the parse stack, each tree has a "role" - basically, the +// nonterminal in the grammar that the parser has currently +// assigned to the tree. That code is stored in n.role. +// +// Finally, some of the different kinds of nodes have data. +// Two integers (for the looping constructs) are stored in +// n.operands, an an object (either a string or a set) +// is stored in n.data +type regexNode struct { + t nodeType + children []*regexNode + str []rune + set *CharSet + ch rune + m int + n int + options RegexOptions + next *regexNode +} + +type nodeType int32 + +const ( + // The following are leaves, and correspond to primitive operations + + ntOnerep nodeType = 0 // lef,back char,min,max a {n} + ntNotonerep = 1 // lef,back char,min,max .{n} + ntSetrep = 2 // lef,back set,min,max [\d]{n} + ntOneloop = 3 // lef,back char,min,max a {,n} + ntNotoneloop = 4 // lef,back char,min,max .{,n} + ntSetloop = 5 // lef,back set,min,max [\d]{,n} + ntOnelazy = 6 // lef,back char,min,max a {,n}? + ntNotonelazy = 7 // lef,back char,min,max .{,n}? + ntSetlazy = 8 // lef,back set,min,max [\d]{,n}? + ntOne = 9 // lef char a + ntNotone = 10 // lef char [^a] + ntSet = 11 // lef set [a-z\s] \w \s \d + ntMulti = 12 // lef string abcd + ntRef = 13 // lef group \# + ntBol = 14 // ^ + ntEol = 15 // $ + ntBoundary = 16 // \b + ntNonboundary = 17 // \B + ntBeginning = 18 // \A + ntStart = 19 // \G + ntEndZ = 20 // \Z + ntEnd = 21 // \Z + + // Interior nodes do not correspond to primitive operations, but + // control structures compositing other operations + + // Concat and alternate take n children, and can run forward or backwards + + ntNothing = 22 // [] + ntEmpty = 23 // () + ntAlternate = 24 // a|b + ntConcatenate = 25 // ab + ntLoop = 26 // m,x * + ? {,} + ntLazyloop = 27 // m,x *? +? ?? {,}? + ntCapture = 28 // n () + ntGroup = 29 // (?:) + ntRequire = 30 // (?=) (?<=) + ntPrevent = 31 // (?!) (?) (?<) + ntTestref = 33 // (?(n) | ) + ntTestgroup = 34 // (?(...) | ) + + ntECMABoundary = 41 // \b + ntNonECMABoundary = 42 // \B +) + +func newRegexNode(t nodeType, opt RegexOptions) *regexNode { + return ®exNode{ + t: t, + options: opt, + } +} + +func newRegexNodeCh(t nodeType, opt RegexOptions, ch rune) *regexNode { + return ®exNode{ + t: t, + options: opt, + ch: ch, + } +} + +func newRegexNodeStr(t nodeType, opt RegexOptions, str []rune) *regexNode { + return ®exNode{ + t: t, + options: opt, + str: str, + } +} + +func newRegexNodeSet(t nodeType, opt RegexOptions, set *CharSet) *regexNode { + return ®exNode{ + t: t, + options: opt, + set: set, + } +} + +func newRegexNodeM(t nodeType, opt RegexOptions, m int) *regexNode { + return ®exNode{ + t: t, + options: opt, + m: m, + } +} +func newRegexNodeMN(t nodeType, opt RegexOptions, m, n int) *regexNode { + return ®exNode{ + t: t, + options: opt, + m: m, + n: n, + } +} + +func (n *regexNode) writeStrToBuf(buf *bytes.Buffer) { + for i := 0; i < len(n.str); i++ { + buf.WriteRune(n.str[i]) + } +} + +func (n *regexNode) addChild(child *regexNode) { + reduced := child.reduce() + n.children = append(n.children, reduced) + reduced.next = n +} + +func (n *regexNode) insertChildren(afterIndex int, nodes []*regexNode) { + newChildren := make([]*regexNode, 0, len(n.children)+len(nodes)) + n.children = append(append(append(newChildren, n.children[:afterIndex]...), nodes...), n.children[afterIndex:]...) +} + +// removes children including the start but not the end index +func (n *regexNode) removeChildren(startIndex, endIndex int) { + n.children = append(n.children[:startIndex], n.children[endIndex:]...) +} + +// Pass type as OneLazy or OneLoop +func (n *regexNode) makeRep(t nodeType, min, max int) { + n.t += (t - ntOne) + n.m = min + n.n = max +} + +func (n *regexNode) reduce() *regexNode { + switch n.t { + case ntAlternate: + return n.reduceAlternation() + + case ntConcatenate: + return n.reduceConcatenation() + + case ntLoop, ntLazyloop: + return n.reduceRep() + + case ntGroup: + return n.reduceGroup() + + case ntSet, ntSetloop: + return n.reduceSet() + + default: + return n + } +} + +// Basic optimization. Single-letter alternations can be replaced +// by faster set specifications, and nested alternations with no +// intervening operators can be flattened: +// +// a|b|c|def|g|h -> [a-c]|def|[gh] +// apple|(?:orange|pear)|grape -> apple|orange|pear|grape +func (n *regexNode) reduceAlternation() *regexNode { + if len(n.children) == 0 { + return newRegexNode(ntNothing, n.options) + } + + wasLastSet := false + lastNodeCannotMerge := false + var optionsLast RegexOptions + var i, j int + + for i, j = 0, 0; i < len(n.children); i, j = i+1, j+1 { + at := n.children[i] + + if j < i { + n.children[j] = at + } + + for { + if at.t == ntAlternate { + for k := 0; k < len(at.children); k++ { + at.children[k].next = n + } + n.insertChildren(i+1, at.children) + + j-- + } else if at.t == ntSet || at.t == ntOne { + // Cannot merge sets if L or I options differ, or if either are negated. + optionsAt := at.options & (RightToLeft | IgnoreCase) + + if at.t == ntSet { + if !wasLastSet || optionsLast != optionsAt || lastNodeCannotMerge || !at.set.IsMergeable() { + wasLastSet = true + lastNodeCannotMerge = !at.set.IsMergeable() + optionsLast = optionsAt + break + } + } else if !wasLastSet || optionsLast != optionsAt || lastNodeCannotMerge { + wasLastSet = true + lastNodeCannotMerge = false + optionsLast = optionsAt + break + } + + // The last node was a Set or a One, we're a Set or One and our options are the same. + // Merge the two nodes. + j-- + prev := n.children[j] + + var prevCharClass *CharSet + if prev.t == ntOne { + prevCharClass = &CharSet{} + prevCharClass.addChar(prev.ch) + } else { + prevCharClass = prev.set + } + + if at.t == ntOne { + prevCharClass.addChar(at.ch) + } else { + prevCharClass.addSet(*at.set) + } + + prev.t = ntSet + prev.set = prevCharClass + } else if at.t == ntNothing { + j-- + } else { + wasLastSet = false + lastNodeCannotMerge = false + } + break + } + } + + if j < i { + n.removeChildren(j, i) + } + + return n.stripEnation(ntNothing) +} + +// Basic optimization. Adjacent strings can be concatenated. +// +// (?:abc)(?:def) -> abcdef +func (n *regexNode) reduceConcatenation() *regexNode { + // Eliminate empties and concat adjacent strings/chars + + var optionsLast RegexOptions + var optionsAt RegexOptions + var i, j int + + if len(n.children) == 0 { + return newRegexNode(ntEmpty, n.options) + } + + wasLastString := false + + for i, j = 0, 0; i < len(n.children); i, j = i+1, j+1 { + var at, prev *regexNode + + at = n.children[i] + + if j < i { + n.children[j] = at + } + + if at.t == ntConcatenate && + ((at.options & RightToLeft) == (n.options & RightToLeft)) { + for k := 0; k < len(at.children); k++ { + at.children[k].next = n + } + + //insert at.children at i+1 index in n.children + n.insertChildren(i+1, at.children) + + j-- + } else if at.t == ntMulti || at.t == ntOne { + // Cannot merge strings if L or I options differ + optionsAt = at.options & (RightToLeft | IgnoreCase) + + if !wasLastString || optionsLast != optionsAt { + wasLastString = true + optionsLast = optionsAt + continue + } + + j-- + prev = n.children[j] + + if prev.t == ntOne { + prev.t = ntMulti + prev.str = []rune{prev.ch} + } + + if (optionsAt & RightToLeft) == 0 { + if at.t == ntOne { + prev.str = append(prev.str, at.ch) + } else { + prev.str = append(prev.str, at.str...) + } + } else { + if at.t == ntOne { + // insert at the front by expanding our slice, copying the data over, and then setting the value + prev.str = append(prev.str, 0) + copy(prev.str[1:], prev.str) + prev.str[0] = at.ch + } else { + //insert at the front...this one we'll make a new slice and copy both into it + merge := make([]rune, len(prev.str)+len(at.str)) + copy(merge, at.str) + copy(merge[len(at.str):], prev.str) + prev.str = merge + } + } + } else if at.t == ntEmpty { + j-- + } else { + wasLastString = false + } + } + + if j < i { + // remove indices j through i from the children + n.removeChildren(j, i) + } + + return n.stripEnation(ntEmpty) +} + +// Nested repeaters just get multiplied with each other if they're not +// too lumpy +func (n *regexNode) reduceRep() *regexNode { + + u := n + t := n.t + min := n.m + max := n.n + + for { + if len(u.children) == 0 { + break + } + + child := u.children[0] + + // multiply reps of the same type only + if child.t != t { + childType := child.t + + if !(childType >= ntOneloop && childType <= ntSetloop && t == ntLoop || + childType >= ntOnelazy && childType <= ntSetlazy && t == ntLazyloop) { + break + } + } + + // child can be too lumpy to blur, e.g., (a {100,105}) {3} or (a {2,})? + // [but things like (a {2,})+ are not too lumpy...] + if u.m == 0 && child.m > 1 || child.n < child.m*2 { + break + } + + u = child + if u.m > 0 { + if (math.MaxInt32-1)/u.m < min { + u.m = math.MaxInt32 + } else { + u.m = u.m * min + } + } + if u.n > 0 { + if (math.MaxInt32-1)/u.n < max { + u.n = math.MaxInt32 + } else { + u.n = u.n * max + } + } + } + + if math.MaxInt32 == min { + return newRegexNode(ntNothing, n.options) + } + return u + +} + +// Simple optimization. If a concatenation or alternation has only +// one child strip out the intermediate node. If it has zero children, +// turn it into an empty. +func (n *regexNode) stripEnation(emptyType nodeType) *regexNode { + switch len(n.children) { + case 0: + return newRegexNode(emptyType, n.options) + case 1: + return n.children[0] + default: + return n + } +} + +func (n *regexNode) reduceGroup() *regexNode { + u := n + + for u.t == ntGroup { + u = u.children[0] + } + + return u +} + +// Simple optimization. If a set is a singleton, an inverse singleton, +// or empty, it's transformed accordingly. +func (n *regexNode) reduceSet() *regexNode { + // Extract empty-set, one and not-one case as special + + if n.set == nil { + n.t = ntNothing + } else if n.set.IsSingleton() { + n.ch = n.set.SingletonChar() + n.set = nil + n.t += (ntOne - ntSet) + } else if n.set.IsSingletonInverse() { + n.ch = n.set.SingletonChar() + n.set = nil + n.t += (ntNotone - ntSet) + } + + return n +} + +func (n *regexNode) reverseLeft() *regexNode { + if n.options&RightToLeft != 0 && n.t == ntConcatenate && len(n.children) > 0 { + //reverse children order + for left, right := 0, len(n.children)-1; left < right; left, right = left+1, right-1 { + n.children[left], n.children[right] = n.children[right], n.children[left] + } + } + + return n +} + +func (n *regexNode) makeQuantifier(lazy bool, min, max int) *regexNode { + if min == 0 && max == 0 { + return newRegexNode(ntEmpty, n.options) + } + + if min == 1 && max == 1 { + return n + } + + switch n.t { + case ntOne, ntNotone, ntSet: + if lazy { + n.makeRep(Onelazy, min, max) + } else { + n.makeRep(Oneloop, min, max) + } + return n + + default: + var t nodeType + if lazy { + t = ntLazyloop + } else { + t = ntLoop + } + result := newRegexNodeMN(t, n.options, min, max) + result.addChild(n) + return result + } +} + +// debug functions + +var typeStr = []string{ + "Onerep", "Notonerep", "Setrep", + "Oneloop", "Notoneloop", "Setloop", + "Onelazy", "Notonelazy", "Setlazy", + "One", "Notone", "Set", + "Multi", "Ref", + "Bol", "Eol", "Boundary", "Nonboundary", + "Beginning", "Start", "EndZ", "End", + "Nothing", "Empty", + "Alternate", "Concatenate", + "Loop", "Lazyloop", + "Capture", "Group", "Require", "Prevent", "Greedy", + "Testref", "Testgroup", + "Unknown", "Unknown", "Unknown", + "Unknown", "Unknown", "Unknown", + "ECMABoundary", "NonECMABoundary", +} + +func (n *regexNode) description() string { + buf := &bytes.Buffer{} + + buf.WriteString(typeStr[n.t]) + + if (n.options & ExplicitCapture) != 0 { + buf.WriteString("-C") + } + if (n.options & IgnoreCase) != 0 { + buf.WriteString("-I") + } + if (n.options & RightToLeft) != 0 { + buf.WriteString("-L") + } + if (n.options & Multiline) != 0 { + buf.WriteString("-M") + } + if (n.options & Singleline) != 0 { + buf.WriteString("-S") + } + if (n.options & IgnorePatternWhitespace) != 0 { + buf.WriteString("-X") + } + if (n.options & ECMAScript) != 0 { + buf.WriteString("-E") + } + + switch n.t { + case ntOneloop, ntNotoneloop, ntOnelazy, ntNotonelazy, ntOne, ntNotone: + buf.WriteString("(Ch = " + CharDescription(n.ch) + ")") + break + case ntCapture: + buf.WriteString("(index = " + strconv.Itoa(n.m) + ", unindex = " + strconv.Itoa(n.n) + ")") + break + case ntRef, ntTestref: + buf.WriteString("(index = " + strconv.Itoa(n.m) + ")") + break + case ntMulti: + fmt.Fprintf(buf, "(String = %s)", string(n.str)) + break + case ntSet, ntSetloop, ntSetlazy: + buf.WriteString("(Set = " + n.set.String() + ")") + break + } + + switch n.t { + case ntOneloop, ntNotoneloop, ntOnelazy, ntNotonelazy, ntSetloop, ntSetlazy, ntLoop, ntLazyloop: + buf.WriteString("(Min = ") + buf.WriteString(strconv.Itoa(n.m)) + buf.WriteString(", Max = ") + if n.n == math.MaxInt32 { + buf.WriteString("inf") + } else { + buf.WriteString(strconv.Itoa(n.n)) + } + buf.WriteString(")") + + break + } + + return buf.String() +} + +var padSpace = []byte(" ") + +func (t *RegexTree) Dump() string { + return t.root.dump() +} + +func (n *regexNode) dump() string { + var stack []int + CurNode := n + CurChild := 0 + + buf := bytes.NewBufferString(CurNode.description()) + buf.WriteRune('\n') + + for { + if CurNode.children != nil && CurChild < len(CurNode.children) { + stack = append(stack, CurChild+1) + CurNode = CurNode.children[CurChild] + CurChild = 0 + + Depth := len(stack) + if Depth > 32 { + Depth = 32 + } + buf.Write(padSpace[:Depth]) + buf.WriteString(CurNode.description()) + buf.WriteRune('\n') + } else { + if len(stack) == 0 { + break + } + + CurChild = stack[len(stack)-1] + stack = stack[:len(stack)-1] + CurNode = CurNode.next + } + } + return buf.String() +} diff --git a/vendor/github.com/dlclark/regexp2/syntax/writer.go b/vendor/github.com/dlclark/regexp2/syntax/writer.go new file mode 100644 index 0000000..a5aa11c --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/syntax/writer.go @@ -0,0 +1,500 @@ +package syntax + +import ( + "bytes" + "fmt" + "math" + "os" +) + +func Write(tree *RegexTree) (*Code, error) { + w := writer{ + intStack: make([]int, 0, 32), + emitted: make([]int, 2), + stringhash: make(map[string]int), + sethash: make(map[string]int), + } + + code, err := w.codeFromTree(tree) + + if tree.options&Debug > 0 && code != nil { + os.Stdout.WriteString(code.Dump()) + os.Stdout.WriteString("\n") + } + + return code, err +} + +type writer struct { + emitted []int + + intStack []int + curpos int + stringhash map[string]int + stringtable [][]rune + sethash map[string]int + settable []*CharSet + counting bool + count int + trackcount int + caps map[int]int +} + +const ( + beforeChild nodeType = 64 + afterChild = 128 + //MaxPrefixSize is the largest number of runes we'll use for a BoyerMoyer prefix + MaxPrefixSize = 50 +) + +// The top level RegexCode generator. It does a depth-first walk +// through the tree and calls EmitFragment to emits code before +// and after each child of an interior node, and at each leaf. +// +// It runs two passes, first to count the size of the generated +// code, and second to generate the code. +// +// We should time it against the alternative, which is +// to just generate the code and grow the array as we go. +func (w *writer) codeFromTree(tree *RegexTree) (*Code, error) { + var ( + curNode *regexNode + curChild int + capsize int + ) + // construct sparse capnum mapping if some numbers are unused + + if tree.capnumlist == nil || tree.captop == len(tree.capnumlist) { + capsize = tree.captop + w.caps = nil + } else { + capsize = len(tree.capnumlist) + w.caps = tree.caps + for i := 0; i < len(tree.capnumlist); i++ { + w.caps[tree.capnumlist[i]] = i + } + } + + w.counting = true + + for { + if !w.counting { + w.emitted = make([]int, w.count) + } + + curNode = tree.root + curChild = 0 + + w.emit1(Lazybranch, 0) + + for { + if len(curNode.children) == 0 { + w.emitFragment(curNode.t, curNode, 0) + } else if curChild < len(curNode.children) { + w.emitFragment(curNode.t|beforeChild, curNode, curChild) + + curNode = curNode.children[curChild] + + w.pushInt(curChild) + curChild = 0 + continue + } + + if w.emptyStack() { + break + } + + curChild = w.popInt() + curNode = curNode.next + + w.emitFragment(curNode.t|afterChild, curNode, curChild) + curChild++ + } + + w.patchJump(0, w.curPos()) + w.emit(Stop) + + if !w.counting { + break + } + + w.counting = false + } + + fcPrefix := getFirstCharsPrefix(tree) + prefix := getPrefix(tree) + rtl := (tree.options & RightToLeft) != 0 + + var bmPrefix *BmPrefix + //TODO: benchmark string prefixes + if prefix != nil && len(prefix.PrefixStr) > 0 && MaxPrefixSize > 0 { + if len(prefix.PrefixStr) > MaxPrefixSize { + // limit prefix changes to 10k + prefix.PrefixStr = prefix.PrefixStr[:MaxPrefixSize] + } + bmPrefix = newBmPrefix(prefix.PrefixStr, prefix.CaseInsensitive, rtl) + } else { + bmPrefix = nil + } + + return &Code{ + Codes: w.emitted, + Strings: w.stringtable, + Sets: w.settable, + TrackCount: w.trackcount, + Caps: w.caps, + Capsize: capsize, + FcPrefix: fcPrefix, + BmPrefix: bmPrefix, + Anchors: getAnchors(tree), + RightToLeft: rtl, + }, nil +} + +// The main RegexCode generator. It does a depth-first walk +// through the tree and calls EmitFragment to emits code before +// and after each child of an interior node, and at each leaf. +func (w *writer) emitFragment(nodetype nodeType, node *regexNode, curIndex int) error { + bits := InstOp(0) + + if nodetype <= ntRef { + if (node.options & RightToLeft) != 0 { + bits |= Rtl + } + if (node.options & IgnoreCase) != 0 { + bits |= Ci + } + } + ntBits := nodeType(bits) + + switch nodetype { + case ntConcatenate | beforeChild, ntConcatenate | afterChild, ntEmpty: + break + + case ntAlternate | beforeChild: + if curIndex < len(node.children)-1 { + w.pushInt(w.curPos()) + w.emit1(Lazybranch, 0) + } + + case ntAlternate | afterChild: + if curIndex < len(node.children)-1 { + lbPos := w.popInt() + w.pushInt(w.curPos()) + w.emit1(Goto, 0) + w.patchJump(lbPos, w.curPos()) + } else { + for i := 0; i < curIndex; i++ { + w.patchJump(w.popInt(), w.curPos()) + } + } + break + + case ntTestref | beforeChild: + if curIndex == 0 { + w.emit(Setjump) + w.pushInt(w.curPos()) + w.emit1(Lazybranch, 0) + w.emit1(Testref, w.mapCapnum(node.m)) + w.emit(Forejump) + } + + case ntTestref | afterChild: + if curIndex == 0 { + branchpos := w.popInt() + w.pushInt(w.curPos()) + w.emit1(Goto, 0) + w.patchJump(branchpos, w.curPos()) + w.emit(Forejump) + if len(node.children) <= 1 { + w.patchJump(w.popInt(), w.curPos()) + } + } else if curIndex == 1 { + w.patchJump(w.popInt(), w.curPos()) + } + + case ntTestgroup | beforeChild: + if curIndex == 0 { + w.emit(Setjump) + w.emit(Setmark) + w.pushInt(w.curPos()) + w.emit1(Lazybranch, 0) + } + + case ntTestgroup | afterChild: + if curIndex == 0 { + w.emit(Getmark) + w.emit(Forejump) + } else if curIndex == 1 { + Branchpos := w.popInt() + w.pushInt(w.curPos()) + w.emit1(Goto, 0) + w.patchJump(Branchpos, w.curPos()) + w.emit(Getmark) + w.emit(Forejump) + if len(node.children) <= 2 { + w.patchJump(w.popInt(), w.curPos()) + } + } else if curIndex == 2 { + w.patchJump(w.popInt(), w.curPos()) + } + + case ntLoop | beforeChild, ntLazyloop | beforeChild: + + if node.n < math.MaxInt32 || node.m > 1 { + if node.m == 0 { + w.emit1(Nullcount, 0) + } else { + w.emit1(Setcount, 1-node.m) + } + } else if node.m == 0 { + w.emit(Nullmark) + } else { + w.emit(Setmark) + } + + if node.m == 0 { + w.pushInt(w.curPos()) + w.emit1(Goto, 0) + } + w.pushInt(w.curPos()) + + case ntLoop | afterChild, ntLazyloop | afterChild: + + startJumpPos := w.curPos() + lazy := (nodetype - (ntLoop | afterChild)) + + if node.n < math.MaxInt32 || node.m > 1 { + if node.n == math.MaxInt32 { + w.emit2(InstOp(Branchcount+lazy), w.popInt(), math.MaxInt32) + } else { + w.emit2(InstOp(Branchcount+lazy), w.popInt(), node.n-node.m) + } + } else { + w.emit1(InstOp(Branchmark+lazy), w.popInt()) + } + + if node.m == 0 { + w.patchJump(w.popInt(), startJumpPos) + } + + case ntGroup | beforeChild, ntGroup | afterChild: + + case ntCapture | beforeChild: + w.emit(Setmark) + + case ntCapture | afterChild: + w.emit2(Capturemark, w.mapCapnum(node.m), w.mapCapnum(node.n)) + + case ntRequire | beforeChild: + // NOTE: the following line causes lookahead/lookbehind to be + // NON-BACKTRACKING. It can be commented out with (*) + w.emit(Setjump) + + w.emit(Setmark) + + case ntRequire | afterChild: + w.emit(Getmark) + + // NOTE: the following line causes lookahead/lookbehind to be + // NON-BACKTRACKING. It can be commented out with (*) + w.emit(Forejump) + + case ntPrevent | beforeChild: + w.emit(Setjump) + w.pushInt(w.curPos()) + w.emit1(Lazybranch, 0) + + case ntPrevent | afterChild: + w.emit(Backjump) + w.patchJump(w.popInt(), w.curPos()) + w.emit(Forejump) + + case ntGreedy | beforeChild: + w.emit(Setjump) + + case ntGreedy | afterChild: + w.emit(Forejump) + + case ntOne, ntNotone: + w.emit1(InstOp(node.t|ntBits), int(node.ch)) + + case ntNotoneloop, ntNotonelazy, ntOneloop, ntOnelazy: + if node.m > 0 { + if node.t == ntOneloop || node.t == ntOnelazy { + w.emit2(Onerep|bits, int(node.ch), node.m) + } else { + w.emit2(Notonerep|bits, int(node.ch), node.m) + } + } + if node.n > node.m { + if node.n == math.MaxInt32 { + w.emit2(InstOp(node.t|ntBits), int(node.ch), math.MaxInt32) + } else { + w.emit2(InstOp(node.t|ntBits), int(node.ch), node.n-node.m) + } + } + + case ntSetloop, ntSetlazy: + if node.m > 0 { + w.emit2(Setrep|bits, w.setCode(node.set), node.m) + } + if node.n > node.m { + if node.n == math.MaxInt32 { + w.emit2(InstOp(node.t|ntBits), w.setCode(node.set), math.MaxInt32) + } else { + w.emit2(InstOp(node.t|ntBits), w.setCode(node.set), node.n-node.m) + } + } + + case ntMulti: + w.emit1(InstOp(node.t|ntBits), w.stringCode(node.str)) + + case ntSet: + w.emit1(InstOp(node.t|ntBits), w.setCode(node.set)) + + case ntRef: + w.emit1(InstOp(node.t|ntBits), w.mapCapnum(node.m)) + + case ntNothing, ntBol, ntEol, ntBoundary, ntNonboundary, ntECMABoundary, ntNonECMABoundary, ntBeginning, ntStart, ntEndZ, ntEnd: + w.emit(InstOp(node.t)) + + default: + return fmt.Errorf("unexpected opcode in regular expression generation: %v", nodetype) + } + + return nil +} + +// To avoid recursion, we use a simple integer stack. +// This is the push. +func (w *writer) pushInt(i int) { + w.intStack = append(w.intStack, i) +} + +// Returns true if the stack is empty. +func (w *writer) emptyStack() bool { + return len(w.intStack) == 0 +} + +// This is the pop. +func (w *writer) popInt() int { + //get our item + idx := len(w.intStack) - 1 + i := w.intStack[idx] + //trim our slice + w.intStack = w.intStack[:idx] + return i +} + +// Returns the current position in the emitted code. +func (w *writer) curPos() int { + return w.curpos +} + +// Fixes up a jump instruction at the specified offset +// so that it jumps to the specified jumpDest. +func (w *writer) patchJump(offset, jumpDest int) { + w.emitted[offset+1] = jumpDest +} + +// Returns an index in the set table for a charset +// uses a map to eliminate duplicates. +func (w *writer) setCode(set *CharSet) int { + if w.counting { + return 0 + } + + buf := &bytes.Buffer{} + + set.mapHashFill(buf) + hash := buf.String() + i, ok := w.sethash[hash] + if !ok { + i = len(w.sethash) + w.sethash[hash] = i + w.settable = append(w.settable, set) + } + return i +} + +// Returns an index in the string table for a string. +// uses a map to eliminate duplicates. +func (w *writer) stringCode(str []rune) int { + if w.counting { + return 0 + } + + hash := string(str) + i, ok := w.stringhash[hash] + if !ok { + i = len(w.stringhash) + w.stringhash[hash] = i + w.stringtable = append(w.stringtable, str) + } + + return i +} + +// When generating code on a regex that uses a sparse set +// of capture slots, we hash them to a dense set of indices +// for an array of capture slots. Instead of doing the hash +// at match time, it's done at compile time, here. +func (w *writer) mapCapnum(capnum int) int { + if capnum == -1 { + return -1 + } + + if w.caps != nil { + return w.caps[capnum] + } + + return capnum +} + +// Emits a zero-argument operation. Note that the emit +// functions all run in two modes: they can emit code, or +// they can just count the size of the code. +func (w *writer) emit(op InstOp) { + if w.counting { + w.count++ + if opcodeBacktracks(op) { + w.trackcount++ + } + return + } + w.emitted[w.curpos] = int(op) + w.curpos++ +} + +// Emits a one-argument operation. +func (w *writer) emit1(op InstOp, opd1 int) { + if w.counting { + w.count += 2 + if opcodeBacktracks(op) { + w.trackcount++ + } + return + } + w.emitted[w.curpos] = int(op) + w.curpos++ + w.emitted[w.curpos] = opd1 + w.curpos++ +} + +// Emits a two-argument operation. +func (w *writer) emit2(op InstOp, opd1, opd2 int) { + if w.counting { + w.count += 3 + if opcodeBacktracks(op) { + w.trackcount++ + } + return + } + w.emitted[w.curpos] = int(op) + w.curpos++ + w.emitted[w.curpos] = opd1 + w.curpos++ + w.emitted[w.curpos] = opd2 + w.curpos++ +} diff --git a/vendor/github.com/dlclark/regexp2/testoutput1 b/vendor/github.com/dlclark/regexp2/testoutput1 new file mode 100644 index 0000000..fbf63fd --- /dev/null +++ b/vendor/github.com/dlclark/regexp2/testoutput1 @@ -0,0 +1,7061 @@ +# This set of tests is for features that are compatible with all versions of +# Perl >= 5.10, in non-UTF mode. It should run clean for the 8-bit, 16-bit, and +# 32-bit PCRE libraries, and also using the perltest.pl script. + +#forbid_utf +#newline_default lf any anycrlf +#perltest + +/the quick brown fox/ + the quick brown fox + 0: the quick brown fox + What do you know about the quick brown fox? + 0: the quick brown fox +\= Expect no match + The quick brown FOX +No match + What do you know about THE QUICK BROWN FOX? +No match + +/The quick brown fox/i + the quick brown fox + 0: the quick brown fox + The quick brown FOX + 0: The quick brown FOX + What do you know about the quick brown fox? + 0: the quick brown fox + What do you know about THE QUICK BROWN FOX? + 0: THE QUICK BROWN FOX + +/abcd\t\n\r\f\a\e\071\x3b\$\\\?caxyz/ + abcd\t\n\r\f\a\e9;\$\\?caxyz + 0: abcd\x09\x0a\x0d\x0c\x07\x1b9;$\?caxyz + +/a*abc?xyz+pqr{3}ab{2,}xy{4,5}pq{0,6}AB{0,}zz/ + abxyzpqrrrabbxyyyypqAzz + 0: abxyzpqrrrabbxyyyypqAzz + abxyzpqrrrabbxyyyypqAzz + 0: abxyzpqrrrabbxyyyypqAzz + aabxyzpqrrrabbxyyyypqAzz + 0: aabxyzpqrrrabbxyyyypqAzz + aaabxyzpqrrrabbxyyyypqAzz + 0: aaabxyzpqrrrabbxyyyypqAzz + aaaabxyzpqrrrabbxyyyypqAzz + 0: aaaabxyzpqrrrabbxyyyypqAzz + abcxyzpqrrrabbxyyyypqAzz + 0: abcxyzpqrrrabbxyyyypqAzz + aabcxyzpqrrrabbxyyyypqAzz + 0: aabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypAzz + 0: aaabcxyzpqrrrabbxyyyypAzz + aaabcxyzpqrrrabbxyyyypqAzz + 0: aaabcxyzpqrrrabbxyyyypqAzz + aaabcxyzpqrrrabbxyyyypqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqAzz + aaabcxyzpqrrrabbxyyyypqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqqAzz + aaabcxyzpqrrrabbxyyyypqqqqqqAzz + 0: aaabcxyzpqrrrabbxyyyypqqqqqqAzz + aaaabcxyzpqrrrabbxyyyypqAzz + 0: aaaabcxyzpqrrrabbxyyyypqAzz + abxyzzpqrrrabbxyyyypqAzz + 0: abxyzzpqrrrabbxyyyypqAzz + aabxyzzzpqrrrabbxyyyypqAzz + 0: aabxyzzzpqrrrabbxyyyypqAzz + aaabxyzzzzpqrrrabbxyyyypqAzz + 0: aaabxyzzzzpqrrrabbxyyyypqAzz + aaaabxyzzzzpqrrrabbxyyyypqAzz + 0: aaaabxyzzzzpqrrrabbxyyyypqAzz + abcxyzzpqrrrabbxyyyypqAzz + 0: abcxyzzpqrrrabbxyyyypqAzz + aabcxyzzzpqrrrabbxyyyypqAzz + 0: aabcxyzzzpqrrrabbxyyyypqAzz + aaabcxyzzzzpqrrrabbxyyyypqAzz + 0: aaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbxyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbbxyyyypqAzz + aaaabcxyzzzzpqrrrabbbxyyyyypqAzz + 0: aaaabcxyzzzzpqrrrabbbxyyyyypqAzz + aaabcxyzpqrrrabbxyyyypABzz + 0: aaabcxyzpqrrrabbxyyyypABzz + aaabcxyzpqrrrabbxyyyypABBzz + 0: aaabcxyzpqrrrabbxyyyypABBzz + >>>aaabxyzpqrrrabbxyyyypqAzz + 0: aaabxyzpqrrrabbxyyyypqAzz + >aaaabxyzpqrrrabbxyyyypqAzz + 0: aaaabxyzpqrrrabbxyyyypqAzz + >>>>abcxyzpqrrrabbxyyyypqAzz + 0: abcxyzpqrrrabbxyyyypqAzz +\= Expect no match + abxyzpqrrabbxyyyypqAzz +No match + abxyzpqrrrrabbxyyyypqAzz +No match + abxyzpqrrrabxyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyyyyypqAzz +No match + aaaabcxyzzzzpqrrrabbbxyyypqAzz +No match + aaabcxyzpqrrrabbxyyyypqqqqqqqAzz +No match + +/^(abc){1,2}zz/ + abczz + 0: abczz + 1: abc + abcabczz + 0: abcabczz + 1: abc +\= Expect no match + zz +No match + abcabcabczz +No match + >>abczz +No match + +/^(b+?|a){1,2}?c/ + bc + 0: bc + 1: b + bbc + 0: bbc + 1: b + bbbc + 0: bbbc + 1: bb + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + aac + 0: aac + 1: a + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + 1: bbbbbbbbbbb + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + 1: a +\= Expect no match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}c/ + bc + 0: bc + 1: b + bbc + 0: bbc + 1: bb + bbbc + 0: bbbc + 1: bbb + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + aac + 0: aac + 1: a + abbbbbbbbbbbc + 0: abbbbbbbbbbbc + 1: bbbbbbbbbbb + bbbbbbbbbbbac + 0: bbbbbbbbbbbac + 1: a +\= Expect no match + aaac +No match + abbbbbbbbbbbac +No match + +/^(b+|a){1,2}?bc/ + bbc + 0: bbc + 1: b + +/^(b*|ba){1,2}?bc/ + babc + 0: babc + 1: ba + bbabc + 0: bbabc + 1: ba + bababc + 0: bababc + 1: ba +\= Expect no match + bababbc +No match + babababc +No match + +/^(ba|b*){1,2}?bc/ + babc + 0: babc + 1: ba + bbabc + 0: bbabc + 1: ba + bababc + 0: bababc + 1: ba +\= Expect no match + bababbc +No match + babababc +No match + +#/^\ca\cA\c[;\c:/ +# \x01\x01\e;z +# 0: \x01\x01\x1b;z + +/^[ab\]cde]/ + athing + 0: a + bthing + 0: b + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e +\= Expect no match + fthing +No match + [thing +No match + \\thing +No match + +/^[]cde]/ + ]thing + 0: ] + cthing + 0: c + dthing + 0: d + ething + 0: e +\= Expect no match + athing +No match + fthing +No match + +/^[^ab\]cde]/ + fthing + 0: f + [thing + 0: [ + \\thing + 0: \ +\= Expect no match + athing +No match + bthing +No match + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +/^[^]cde]/ + athing + 0: a + fthing + 0: f +\= Expect no match + ]thing +No match + cthing +No match + dthing +No match + ething +No match + +# DLC - I don't get this one +#/^\/ +#  +# 0: \x81 + +#updated to handle 16-bits utf8 +/^ÿ/ + ÿ + 0: \xc3\xbf + +/^[0-9]+$/ + 0 + 0: 0 + 1 + 0: 1 + 2 + 0: 2 + 3 + 0: 3 + 4 + 0: 4 + 5 + 0: 5 + 6 + 0: 6 + 7 + 0: 7 + 8 + 0: 8 + 9 + 0: 9 + 10 + 0: 10 + 100 + 0: 100 +\= Expect no match + abc +No match + +/^.*nter/ + enter + 0: enter + inter + 0: inter + uponter + 0: uponter + +/^xxx[0-9]+$/ + xxx0 + 0: xxx0 + xxx1234 + 0: xxx1234 +\= Expect no match + xxx +No match + +/^.+[0-9][0-9][0-9]$/ + x123 + 0: x123 + x1234 + 0: x1234 + xx123 + 0: xx123 + 123456 + 0: 123456 +\= Expect no match + 123 +No match + +/^.+?[0-9][0-9][0-9]$/ + x123 + 0: x123 + x1234 + 0: x1234 + xx123 + 0: xx123 + 123456 + 0: 123456 +\= Expect no match + 123 +No match + +/^([^!]+)!(.+)=apquxz\.ixr\.zzz\.ac\.uk$/ + abc!pqr=apquxz.ixr.zzz.ac.uk + 0: abc!pqr=apquxz.ixr.zzz.ac.uk + 1: abc + 2: pqr +\= Expect no match + !pqr=apquxz.ixr.zzz.ac.uk +No match + abc!=apquxz.ixr.zzz.ac.uk +No match + abc!pqr=apquxz:ixr.zzz.ac.uk +No match + abc!pqr=apquxz.ixr.zzz.ac.ukk +No match + +/:/ + Well, we need a colon: somewhere + 0: : +\= Expect no match + Fail without a colon +No match + +/([\da-f:]+)$/i + 0abc + 0: 0abc + 1: 0abc + abc + 0: abc + 1: abc + fed + 0: fed + 1: fed + E + 0: E + 1: E + :: + 0: :: + 1: :: + 5f03:12C0::932e + 0: 5f03:12C0::932e + 1: 5f03:12C0::932e + fed def + 0: def + 1: def + Any old stuff + 0: ff + 1: ff +\= Expect no match + 0zzz +No match + gzzz +No match + fed\x20 +No match + Any old rubbish +No match + +/^.*\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$/ + .1.2.3 + 0: .1.2.3 + 1: 1 + 2: 2 + 3: 3 + A.12.123.0 + 0: A.12.123.0 + 1: 12 + 2: 123 + 3: 0 +\= Expect no match + .1.2.3333 +No match + 1.2.3 +No match + 1234.2.3 +No match + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 0: 1 IN SOA non-sp1 non-sp2( + 1: 1 + 2: non-sp1 + 3: non-sp2 + 1 IN SOA non-sp1 non-sp2 ( + 0: 1 IN SOA non-sp1 non-sp2 ( + 1: 1 + 2: non-sp1 + 3: non-sp2 +\= Expect no match + 1IN SOA non-sp1 non-sp2( +No match + +/^[a-zA-Z\d][a-zA-Z\d\-]*(\.[a-zA-Z\d][a-zA-z\d\-]*)*\.$/ + a. + 0: a. + Z. + 0: Z. + 2. + 0: 2. + ab-c.pq-r. + 0: ab-c.pq-r. + 1: .pq-r + sxk.zzz.ac.uk. + 0: sxk.zzz.ac.uk. + 1: .uk + x-.y-. + 0: x-.y-. + 1: .y- +\= Expect no match + -abc.peq. +No match + +/^\*\.[a-z]([a-z\-\d]*[a-z\d]+)?(\.[a-z]([a-z\-\d]*[a-z\d]+)?)*$/ + *.a + 0: *.a + *.b0-a + 0: *.b0-a + 1: 0-a + *.c3-b.c + 0: *.c3-b.c + 1: 3-b + 2: .c + *.c-a.b-c + 0: *.c-a.b-c + 1: -a + 2: .b-c + 3: -c +\= Expect no match + *.0 +No match + *.a- +No match + *.a-b.c- +No match + *.c-a.0-c +No match + +/^(?=ab(de))(abd)(e)/ + abde + 0: abde + 1: de + 2: abd + 3: e + +/^(?!(ab)de|x)(abd)(f)/ + abdf + 0: abdf + 1: + 2: abd + 3: f + +/^(?=(ab(cd)))(ab)/ + abcd + 0: ab + 1: abcd + 2: cd + 3: ab + +/^[\da-f](\.[\da-f])*$/i + a.b.c.d + 0: a.b.c.d + 1: .d + A.B.C.D + 0: A.B.C.D + 1: .D + a.b.c.1.2.3.C + 0: a.b.c.1.2.3.C + 1: .C + +/^\".*\"\s*(;.*)?$/ + \"1234\" + 0: "1234" + \"abcd\" ; + 0: "abcd" ; + 1: ; + \"\" ; rhubarb + 0: "" ; rhubarb + 1: ; rhubarb +\= Expect no match + \"1234\" : things +No match + +/^$/ + \ + 0: +\= Expect no match + A non-empty line +No match + +/ ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/x + ab c + 0: ab c +\= Expect no match + abc +No match + ab cde +No match + +/(?x) ^ a (?# begins with a) b\sc (?# then b c) $ (?# then end)/ + ab c + 0: ab c +\= Expect no match + abc +No match + ab cde +No match + +/^ a\ b[c ]d $/x + a bcd + 0: a bcd + a b d + 0: a b d +\= Expect no match + abcd +No match + ab d +No match + +/^(a(b(c)))(d(e(f)))(h(i(j)))(k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + 1: abc + 2: bc + 3: c + 4: def + 5: ef + 6: f + 7: hij + 8: ij + 9: j +10: klm +11: lm +12: m + +/^(?:a(b(c)))(?:d(e(f)))(?:h(i(j)))(?:k(l(m)))$/ + abcdefhijklm + 0: abcdefhijklm + 1: bc + 2: c + 3: ef + 4: f + 5: ij + 6: j + 7: lm + 8: m + +#/^[\w][\W][\s][\S][\d][\D][\b][\n][\c]][\022]/ +# a+ Z0+\x08\n\x1d\x12 +# 0: a+ Z0+\x08\x0a\x1d\x12 + +/^[.^$|()*+?{,}]+/ + .^\$(*+)|{?,?} + 0: .^$(*+)|{?,?} + +/^a*\w/ + z + 0: z + az + 0: az + aaaz + 0: aaaz + a + 0: a + aa + 0: aa + aaaa + 0: aaaa + a+ + 0: a + aa+ + 0: aa + +/^a*?\w/ + z + 0: z + az + 0: a + aaaz + 0: a + a + 0: a + aa + 0: a + aaaa + 0: a + a+ + 0: a + aa+ + 0: a + +/^a+\w/ + az + 0: az + aaaz + 0: aaaz + aa + 0: aa + aaaa + 0: aaaa + aa+ + 0: aa + +/^a+?\w/ + az + 0: az + aaaz + 0: aa + aa + 0: aa + aaaa + 0: aa + aa+ + 0: aa + +/^\d{8}\w{2,}/ + 1234567890 + 0: 1234567890 + 12345678ab + 0: 12345678ab + 12345678__ + 0: 12345678__ +\= Expect no match + 1234567 +No match + +/^[aeiou\d]{4,5}$/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 12345 + aaaaa + 0: aaaaa +\= Expect no match + 123456 +No match + +/^[aeiou\d]{4,5}?/ + uoie + 0: uoie + 1234 + 0: 1234 + 12345 + 0: 1234 + aaaaa + 0: aaaa + 123456 + 0: 1234 + +/\A(abc|def)=(\1){2,3}\Z/ + abc=abcabc + 0: abc=abcabc + 1: abc + 2: abc + def=defdefdef + 0: def=defdefdef + 1: def + 2: def +\= Expect no match + abc=defdef +No match + +/^(a)(b)(c)(d)(e)(f)(g)(h)(i)(j)(k)\11*(\3\4)\1(?#)2$/ + abcdefghijkcda2 + 0: abcdefghijkcda2 + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: cd + abcdefghijkkkkcda2 + 0: abcdefghijkkkkcda2 + 1: a + 2: b + 3: c + 4: d + 5: e + 6: f + 7: g + 8: h + 9: i +10: j +11: k +12: cd + +/(cat(a(ract|tonic)|erpillar)) \1()2(3)/ + cataract cataract23 + 0: cataract cataract23 + 1: cataract + 2: aract + 3: ract + 4: + 5: 3 + catatonic catatonic23 + 0: catatonic catatonic23 + 1: catatonic + 2: atonic + 3: tonic + 4: + 5: 3 + caterpillar caterpillar23 + 0: caterpillar caterpillar23 + 1: caterpillar + 2: erpillar + 3: + 4: + 5: 3 + + +/^From +([^ ]+) +[a-zA-Z][a-zA-Z][a-zA-Z] +[a-zA-Z][a-zA-Z][a-zA-Z] +[0-9]?[0-9] +[0-9][0-9]:[0-9][0-9]/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + 1: abcd + +/^From\s+\S+\s+([a-zA-Z]{3}\s+){2}\d{1,2}\s+\d\d:\d\d/ + From abcd Mon Sep 01 12:33:02 1997 + 0: From abcd Mon Sep 01 12:33 + 1: Sep + From abcd Mon Sep 1 12:33:02 1997 + 0: From abcd Mon Sep 1 12:33 + 1: Sep +\= Expect no match + From abcd Sep 01 12:33:02 1997 +No match + +/^12.34/s + 12\n34 + 0: 12\x0a34 + 12\r34 + 0: 12\x0d34 + +/\w+(?=\t)/ + the quick brown\t fox + 0: brown + +/foo(?!bar)(.*)/ + foobar is foolish see? + 0: foolish see? + 1: lish see? + +/(?:(?!foo)...|^.{0,2})bar(.*)/ + foobar crowbar etc + 0: rowbar etc + 1: etc + barrel + 0: barrel + 1: rel + 2barrel + 0: 2barrel + 1: rel + A barrel + 0: A barrel + 1: rel + +/^(\D*)(?=\d)(?!123)/ + abc456 + 0: abc + 1: abc +\= Expect no match + abc123 +No match + +/^1234(?# test newlines + inside)/ + 1234 + 0: 1234 + +/^1234 #comment in extended re + /x + 1234 + 0: 1234 + +/#rhubarb + abcd/x + abcd + 0: abcd + +/^abcd#rhubarb/x + abcd + 0: abcd + +/^(a)\1{2,3}(.)/ + aaab + 0: aaab + 1: a + 2: b + aaaab + 0: aaaab + 1: a + 2: b + aaaaab + 0: aaaaa + 1: a + 2: a + aaaaaab + 0: aaaaa + 1: a + 2: a + +/(?!^)abc/ + the abc + 0: abc +\= Expect no match + abc +No match + +/(?=^)abc/ + abc + 0: abc +\= Expect no match + the abc +No match + +/^[ab]{1,3}(ab*|b)/ + aabbbbb + 0: aabb + 1: b + +/^[ab]{1,3}?(ab*|b)/ + aabbbbb + 0: aabbbbb + 1: abbbbb + +/^[ab]{1,3}?(ab*?|b)/ + aabbbbb + 0: aa + 1: a + +/^[ab]{1,3}(ab*?|b)/ + aabbbbb + 0: aabb + 1: b + +/ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional leading comment +(?: (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # one word, optionally followed by.... +(?: +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] | # atom and space parts, or... +\( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) | # comments, or... + +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +# quoted strings +)* +< (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # leading < +(?: @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* + +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* , (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +)* # further okay, if led by comma +: # closing colon +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* )? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) # initial word +(?: (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +" (?: # opening quote... +[^\\\x80-\xff\n\015"] # Anything except backslash and quote +| # or +\\ [^\x80-\xff] # Escaped something (something != CR) +)* " # closing quote +) )* # further okay, if led by a period +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* @ (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # initial subdomain +(?: # +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* \. # if led by a period... +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* (?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| \[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) # ...further okay +)* +# address spec +(?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* > # trailing > +# name and address +) (?: [\040\t] | \( +(?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] | \( (?: [^\\\x80-\xff\n\015()] | \\ [^\x80-\xff] )* \) )* +\) )* # optional trailing comment +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + user\@dom.ain + 0: user@dom.ain + \"A. Other\" (a comment) + 0: "A. Other" (a comment) + A. Other (a comment) + 0: Other (a comment) + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + A missing angle @,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address +| # or +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +# leading word +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # "normal" atoms and or spaces +(?: +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +| +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +) # "special" comment or quoted string +[^()<>@,;:".\\\[\]\x80-\xff\000-\010\012-\037] * # more "normal" +)* +< +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# < +(?: +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +(?: , +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +)* # additional domains +: +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)? # optional route +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +# Atom +| # or +" # " +[^\\\x80-\xff\n\015"] * # normal +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015"] * )* # ( special normal* )* +" # " +# Quoted string +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# additional words +)* +@ +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +(?: +\. +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +(?: +[^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]+ # some number of atom characters... +(?![^(\040)<>@,;:".\\\[\]\000-\037\x80-\xff]) # ..not followed by something that could be part of an atom +| +\[ # [ +(?: [^\\\x80-\xff\n\015\[\]] | \\ [^\x80-\xff] )* # stuff +\] # ] +) +[\040\t]* # Nab whitespace. +(?: +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: # ( +(?: \\ [^\x80-\xff] | +\( # ( +[^\\\x80-\xff\n\015()] * # normal* +(?: \\ [^\x80-\xff] [^\\\x80-\xff\n\015()] * )* # (special normal*)* +\) # ) +) # special +[^\\\x80-\xff\n\015()] * # normal* +)* # )* +\) # ) +[\040\t]* )* # If comment found, allow more spaces. +# optional trailing comments +)* +# address spec +> # > +# name and address +) +/x + Alan Other + 0: Alan Other + + 0: user@dom.ain + user\@dom.ain + 0: user@dom.ain + \"A. Other\" (a comment) + 0: "A. Other" + A. Other (a comment) + 0: Other + \"/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/\"\@x400-re.lay + 0: "/s=user/ou=host/o=place/prmd=uu.yy/admd= /c=gb/"@x400-re.lay + A missing angle ?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~\x7f + +/P[^*]TAIRE[^*]{1,6}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/P[^*]TAIRE[^*]{1,}?LL/ + xxxxxxxxxxxPSTAIREISLLxxxxxxxxx + 0: PSTAIREISLL + +/(\.\d\d[1-9]?)\d+/ + 1.230003938 + 0: .230003938 + 1: .23 + 1.875000282 + 0: .875000282 + 1: .875 + 1.235 + 0: .235 + 1: .23 + +/(\.\d\d((?=0)|\d(?=\d)))/ + 1.230003938 + 0: .23 + 1: .23 + 2: + 1.875000282 + 0: .875 + 1: .875 + 2: 5 +\= Expect no match + 1.235 +No match + +/\b(foo)\s+(\w+)/i + Food is on the foo table + 0: foo table + 1: foo + 2: table + +/foo(.*)bar/ + The food is under the bar in the barn. + 0: food is under the bar in the bar + 1: d is under the bar in the + +/foo(.*?)bar/ + The food is under the bar in the barn. + 0: food is under the bar + 1: d is under the + +/(.*)(\d*)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 53147 + 2: + +/(.*)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: 7 + +/(.*?)(\d*)/ + I have 2 numbers: 53147 + 0: + 1: + 2: + +/(.*?)(\d+)/ + I have 2 numbers: 53147 + 0: I have 2 + 1: I have + 2: 2 + +/(.*)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: 5314 + 2: 7 + +/(.*?)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/(.*)\b(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/(.*\D)(\d+)$/ + I have 2 numbers: 53147 + 0: I have 2 numbers: 53147 + 1: I have 2 numbers: + 2: 53147 + +/^\D*(?!123)/ + ABC123 + 0: AB + +/^(\D*)(?=\d)(?!123)/ + ABC445 + 0: ABC + 1: ABC +\= Expect no match + ABC123 +No match + +/^[W-]46]/ + W46]789 + 0: W46] + -46]789 + 0: -46] +\= Expect no match + Wall +No match + Zebra +No match + 42 +No match + [abcd] +No match + ]abcd[ +No match + +/^[W-\]46]/ + W46]789 + 0: W + Wall + 0: W + Zebra + 0: Z + Xylophone + 0: X + 42 + 0: 4 + [abcd] + 0: [ + ]abcd[ + 0: ] + \\backslash + 0: \ +\= Expect no match + -46]789 +No match + well +No match + +/\d\d\/\d\d\/\d\d\d\d/ + 01/01/2000 + 0: 01/01/2000 + +/word (?:[a-zA-Z0-9]+ ){0,10}otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword +\= Expect no match + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?:[a-zA-Z0-9]+ ){0,300}otherword/ +\= Expect no match + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/^(a){0,0}/ + bcd + 0: + abc + 0: + aab + 0: + +/^(a){0,1}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: a + 1: a + +/^(a){0,2}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + +/^(a){0,3}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + +/^(a){0,}/ + bcd + 0: + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + aaaaaaaa + 0: aaaaaaaa + 1: a + +/^(a){1,1}/ + abc + 0: a + 1: a + aab + 0: a + 1: a +\= Expect no match + bcd +No match + +/^(a){1,2}/ + abc + 0: a + 1: a + aab + 0: aa + 1: a +\= Expect no match + bcd +No match + +/^(a){1,3}/ + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a +\= Expect no match + bcd +No match + +/^(a){1,}/ + abc + 0: a + 1: a + aab + 0: aa + 1: a + aaa + 0: aaa + 1: a + aaaaaaaa + 0: aaaaaaaa + 1: a +\= Expect no match + bcd +No match + +/.*\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.{0,}\.gif/ + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/m + borfle\nbib.gif\nno + 0: bib.gif + +/.*\.gif/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*\.gif/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif + +/.*$/ + borfle\nbib.gif\nno + 0: no + +/.*$/m + borfle\nbib.gif\nno + 0: borfle + +/.*$/s + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + +/.*$/ms + borfle\nbib.gif\nno + 0: borfle\x0abib.gif\x0ano + +/.*$/ + borfle\nbib.gif\nno\n + 0: no + +/.*$/m + borfle\nbib.gif\nno\n + 0: borfle + +/.*$/s + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + +/.*$/ms + borfle\nbib.gif\nno\n + 0: borfle\x0abib.gif\x0ano\x0a + +/(.*X|^B)/ + abcde\n1234Xyz + 0: 1234X + 1: 1234X + BarFoo + 0: B + 1: B +\= Expect no match + abcde\nBar +No match + +/(.*X|^B)/m + abcde\n1234Xyz + 0: 1234X + 1: 1234X + BarFoo + 0: B + 1: B + abcde\nBar + 0: B + 1: B + +/(.*X|^B)/s + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B +\= Expect no match + abcde\nBar +No match + +/(.*X|^B)/ms + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B + abcde\nBar + 0: B + 1: B + +/(?s)(.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + 1: abcde\x0a1234X + BarFoo + 0: B + 1: B +\= Expect no match + abcde\nBar +No match + +/(?s:.*X|^B)/ + abcde\n1234Xyz + 0: abcde\x0a1234X + BarFoo + 0: B +\= Expect no match + abcde\nBar +No match + +/^.*B/ +\= Expect no match + abc\nB +No match + +/(?s)^.*B/ + abc\nB + 0: abc\x0aB + +/(?m)^.*B/ + abc\nB + 0: B + +/(?ms)^.*B/ + abc\nB + 0: abc\x0aB + +/(?ms)^B/ + abc\nB + 0: B + +/(?s)B$/ + B\n + 0: B + +/^[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/ + 123456654321 + 0: 123456654321 + +/^\d\d\d\d\d\d\d\d\d\d\d\d/ + 123456654321 + 0: 123456654321 + +/^[\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d][\d]/ + 123456654321 + 0: 123456654321 + +/^[abc]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^[a-c]{12}/ + abcabcabcabc + 0: abcabcabcabc + +/^(a|b|c){12}/ + abcabcabcabc + 0: abcabcabcabc + 1: c + +/^[abcdefghijklmnopqrstuvwxy0123456789]/ + n + 0: n +\= Expect no match + z +No match + +/abcde{0,0}/ + abcd + 0: abcd +\= Expect no match + abce +No match + +/ab[cd]{0,0}e/ + abe + 0: abe +\= Expect no match + abcde +No match + +/ab(c){0,0}d/ + abd + 0: abd +\= Expect no match + abcd +No match + +/a(b*)/ + a + 0: a + 1: + ab + 0: ab + 1: b + abbbb + 0: abbbb + 1: bbbb +\= Expect no match + bbbbb +No match + +/ab\d{0}e/ + abe + 0: abe +\= Expect no match + ab1e +No match + +/"([^\\"]+|\\.)*"/ + the \"quick\" brown fox + 0: "quick" + 1: quick + \"the \\\"quick\\\" brown fox\" + 0: "the \"quick\" brown fox" + 1: brown fox + +/]{0,})>]{0,})>([\d]{0,}\.)(.*)((
([\w\W\s\d][^<>]{0,})|[\s]{0,}))<\/a><\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD>]{0,})>([\w\W\s\d][^<>]{0,})<\/TD><\/TR>/is + 43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide + 0: 43.Word Processor
(N-1286)
Lega lstaff.comCA - Statewide + 1: BGCOLOR='#DBE9E9' + 2: align=left valign=top + 3: 43. + 4: Word Processor
(N-1286) + 5: + 6: + 7: + 8: align=left valign=top + 9: Lega lstaff.com +10: align=left valign=top +11: CA - Statewide + +/a[^a]b/ + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/ + acb + 0: acb +\= Expect no match + a\nb +No match + +/a[^a]b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/a.b/s + acb + 0: acb + a\nb + 0: a\x0ab + +/^(b+?|a){1,2}?c/ + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + bbbac + 0: bbbac + 1: a + bbbbac + 0: bbbbac + 1: a + bbbbbac + 0: bbbbbac + 1: a + +/^(b+|a){1,2}?c/ + bac + 0: bac + 1: a + bbac + 0: bbac + 1: a + bbbac + 0: bbbac + 1: a + bbbbac + 0: bbbbac + 1: a + bbbbbac + 0: bbbbbac + 1: a + +/(?!\A)x/m + a\bx\n + 0: x + a\nx\n + 0: x +\= Expect no match + x\nb\n +No match + +/(A|B)*?CD/ + CD + 0: CD + +/(A|B)*CD/ + CD + 0: CD + +/(AB)*?\1/ + ABABAB + 0: ABAB + 1: AB + +/(AB)*\1/ + ABABAB + 0: ABABAB + 1: AB + +/(?.*/)foo" + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo + 0: /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/and/foo +\= Expect no match + /this/is/a/very/long/line/in/deed/with/very/many/slashes/in/it/you/see/ +No match + +/(?>(\.\d\d[1-9]?))\d+/ + 1.230003938 + 0: .230003938 + 1: .23 + 1.875000282 + 0: .875000282 + 1: .875 +\= Expect no match + 1.235 +No match + +/^((?>\w+)|(?>\s+))*$/ + now is the time for all good men to come to the aid of the party + 0: now is the time for all good men to come to the aid of the party + 1: party +\= Expect no match + this is not a line with only words and spaces! +No match + +/(\d+)(\w)/ + 12345a + 0: 12345a + 1: 12345 + 2: a + 12345+ + 0: 12345 + 1: 1234 + 2: 5 + +/((?>\d+))(\w)/ + 12345a + 0: 12345a + 1: 12345 + 2: a +\= Expect no match + 12345+ +No match + +/(?>a+)b/ + aaab + 0: aaab + +/((?>a+)b)/ + aaab + 0: aaab + 1: aaab + +/(?>(a+))b/ + aaab + 0: aaab + 1: aaa + +/(?>b)+/ + aaabbbccc + 0: bbb + +/(?>a+|b+|c+)*c/ + aaabbbbccccd + 0: aaabbbbc + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: x + +/\(((?>[^()]+)|\([^()]+\))+\)/ + (abc) + 0: (abc) + 1: abc + (abc(def)xyz) + 0: (abc(def)xyz) + 1: xyz +\= Expect no match + ((()aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/a(?-i)b/i + ab + 0: ab + Ab + 0: Ab +\= Expect no match + aB +No match + AB +No match + +/(a (?x)b c)d e/ + a bcd e + 0: a bcd e + 1: a bc +\= Expect no match + a b cd e +No match + abcd e +No match + a bcde +No match + +/(a b(?x)c d (?-x)e f)/ + a bcde f + 0: a bcde f + 1: a bcde f +\= Expect no match + abcdef +No match + +/(a(?i)b)c/ + abc + 0: abc + 1: ab + aBc + 0: aBc + 1: aB +\= Expect no match + abC +No match + aBC +No match + Abc +No match + ABc +No match + ABC +No match + AbC +No match + +/a(?i:b)c/ + abc + 0: abc + aBc + 0: aBc +\= Expect no match + ABC +No match + abC +No match + aBC +No match + +/a(?i:b)*c/ + aBc + 0: aBc + aBBc + 0: aBBc +\= Expect no match + aBC +No match + aBBC +No match + +/a(?=b(?i)c)\w\wd/ + abcd + 0: abcd + abCd + 0: abCd +\= Expect no match + aBCd +No match + abcD +No match + +/(?s-i:more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million +\= Expect no match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?:(?s-i)more.*than).*million/i + more than million + 0: more than million + more than MILLION + 0: more than MILLION + more \n than Million + 0: more \x0a than Million +\= Expect no match + MORE THAN MILLION +No match + more \n than \n million +No match + +/(?>a(?i)b+)+c/ + abc + 0: abc + aBbc + 0: aBbc + aBBc + 0: aBBc +\= Expect no match + Abc +No match + abAb +No match + abbC +No match + +/(?=a(?i)b)\w\wc/ + abc + 0: abc + aBc + 0: aBc +\= Expect no match + Ab +No match + abC +No match + aBC +No match + +/(?<=a(?i)b)(\w\w)c/ + abxxc + 0: xxc + 1: xx + aBxxc + 0: xxc + 1: xx +\= Expect no match + Abxxc +No match + ABxxc +No match + abxxC +No match + +/(?:(a)|b)(?(1)A|B)/ + aA + 0: aA + 1: a + bB + 0: bB +\= Expect no match + aB +No match + bA +No match + +/^(a)?(?(1)a|b)+$/ + aa + 0: aa + 1: a + b + 0: b + bb + 0: bb +\= Expect no match + ab +No match + +# Perl gets this next one wrong if the pattern ends with $; in that case it +# fails to match "12". + +/^(?(?=abc)\w{3}:|\d\d)/ + abc: + 0: abc: + 12 + 0: 12 + 123 + 0: 12 +\= Expect no match + xyz +No match + +/^(?(?!abc)\d\d|\w{3}:)$/ + abc: + 0: abc: + 12 + 0: 12 +\= Expect no match + 123 +No match + xyz +No match + +/(?(?<=foo)bar|cat)/ + foobar + 0: bar + cat + 0: cat + fcat + 0: cat + focat + 0: cat +\= Expect no match + foocat +No match + +/(?(?a*)*/ + a + 0: a + aa + 0: aa + aaaa + 0: aaaa + +/(abc|)+/ + abc + 0: abc + 1: + abcabc + 0: abcabc + 1: + abcabcabc + 0: abcabcabc + 1: + xyz + 0: + 1: + +/([a]*)*/ + a + 0: a + 1: + aaaaa + 0: aaaaa + 1: + +/([ab]*)*/ + a + 0: a + 1: + b + 0: b + 1: + ababab + 0: ababab + 1: + aaaabcde + 0: aaaab + 1: + bbbb + 0: bbbb + 1: + +/([^a]*)*/ + b + 0: b + 1: + bbbb + 0: bbbb + 1: + aaa + 0: + 1: + +/([^ab]*)*/ + cccc + 0: cccc + 1: + abab + 0: + 1: + +/([a]*?)*/ + a + 0: + 1: + aaaa + 0: + 1: + +/([ab]*?)*/ + a + 0: + 1: + b + 0: + 1: + abab + 0: + 1: + baba + 0: + 1: + +/([^a]*?)*/ + b + 0: + 1: + bbbb + 0: + 1: + aaa + 0: + 1: + +/([^ab]*?)*/ + c + 0: + 1: + cccc + 0: + 1: + baba + 0: + 1: + +/(?>a*)*/ + a + 0: a + aaabcde + 0: aaa + +/((?>a*))*/ + aaaaa + 0: aaaaa + 1: + aabbaa + 0: aa + 1: + +/((?>a*?))*/ + aaaaa + 0: + 1: + aabbaa + 0: + 1: + +/(?(?=[^a-z]+[a-z]) \d{2}-[a-z]{3}-\d{2} | \d{2}-\d{2}-\d{2} ) /x + 12-sep-98 + 0: 12-sep-98 + 12-09-98 + 0: 12-09-98 +\= Expect no match + sep-12-98 +No match + +/(?<=(foo))bar\1/ + foobarfoo + 0: barfoo + 1: foo + foobarfootling + 0: barfoo + 1: foo +\= Expect no match + foobar +No match + barfoo +No match + +/(?i:saturday|sunday)/ + saturday + 0: saturday + sunday + 0: sunday + Saturday + 0: Saturday + Sunday + 0: Sunday + SATURDAY + 0: SATURDAY + SUNDAY + 0: SUNDAY + SunDay + 0: SunDay + +/(a(?i)bc|BB)x/ + abcx + 0: abcx + 1: abc + aBCx + 0: aBCx + 1: aBC + bbx + 0: bbx + 1: bb + BBx + 0: BBx + 1: BB +\= Expect no match + abcX +No match + aBCX +No match + bbX +No match + BBX +No match + +/^([ab](?i)[cd]|[ef])/ + ac + 0: ac + 1: ac + aC + 0: aC + 1: aC + bD + 0: bD + 1: bD + elephant + 0: e + 1: e + Europe + 0: E + 1: E + frog + 0: f + 1: f + France + 0: F + 1: F +\= Expect no match + Africa +No match + +/^(ab|a(?i)[b-c](?m-i)d|x(?i)y|z)/ + ab + 0: ab + 1: ab + aBd + 0: aBd + 1: aBd + xy + 0: xy + 1: xy + xY + 0: xY + 1: xY + zebra + 0: z + 1: z + Zambesi + 0: Z + 1: Z +\= Expect no match + aCD +No match + XY +No match + +/(?<=foo\n)^bar/m + foo\nbar + 0: bar +\= Expect no match + bar +No match + baz\nbar +No match + +/(?<=(?]&/ + <&OUT + 0: <& + +/^(a\1?){4}$/ + aaaaaaaaaa + 0: aaaaaaaaaa + 1: aaaa +\= Expect no match + AB +No match + aaaaaaaaa +No match + aaaaaaaaaaa +No match + +/^(a(?(1)\1)){4}$/ + aaaaaaaaaa + 0: aaaaaaaaaa + 1: aaaa +\= Expect no match + aaaaaaaaa +No match + aaaaaaaaaaa +No match + +/(?:(f)(o)(o)|(b)(a)(r))*/ + foobar + 0: foobar + 1: f + 2: o + 3: o + 4: b + 5: a + 6: r + +/(?<=a)b/ + ab + 0: b +\= Expect no match + cb +No match + b +No match + +/(? + 2: abcd + xy:z:::abcd + 0: xy:z:::abcd + 1: xy:z::: + 2: abcd + +/^[^bcd]*(c+)/ + aexycd + 0: aexyc + 1: c + +/(a*)b+/ + caab + 0: aab + 1: aa + +/([\w:]+::)?(\w+)$/ + abcd + 0: abcd + 1: + 2: abcd + xy:z:::abcd + 0: xy:z:::abcd + 1: xy:z::: + 2: abcd +\= Expect no match + abcd: +No match + abcd: +No match + +/^[^bcd]*(c+)/ + aexycd + 0: aexyc + 1: c + +/(>a+)ab/ + +/(?>a+)b/ + aaab + 0: aaab + +/([[:]+)/ + a:[b]: + 0: :[ + 1: :[ + +/([[=]+)/ + a=[b]= + 0: =[ + 1: =[ + +/([[.]+)/ + a.[b]. + 0: .[ + 1: .[ + +/((?>a+)b)/ + aaab + 0: aaab + 1: aaab + +/(?>(a+))b/ + aaab + 0: aaab + 1: aaa + +/((?>[^()]+)|\([^()]*\))+/ + ((abc(ade)ufh()()x + 0: abc(ade)ufh()()x + 1: x + +/a\Z/ +\= Expect no match + aaab +No match + a\nb\n +No match + +/b\Z/ + a\nb\n + 0: b + +/b\z/ + +/b\Z/ + a\nb + 0: b + +/b\z/ + a\nb + 0: b + +/^(?>(?(1)\.|())[^\W_](?>[a-z0-9-]*[^\W_])?)+$/ + a + 0: a + 1: + abc + 0: abc + 1: + a-b + 0: a-b + 1: + 0-9 + 0: 0-9 + 1: + a.b + 0: a.b + 1: + 5.6.7 + 0: 5.6.7 + 1: + the.quick.brown.fox + 0: the.quick.brown.fox + 1: + a100.b200.300c + 0: a100.b200.300c + 1: + 12-ab.1245 + 0: 12-ab.1245 + 1: +\= Expect no match + \ +No match + .a +No match + -a +No match + a- +No match + a. +No match + a_b +No match + a.- +No match + a.. +No match + ab..bc +No match + the.quick.brown.fox- +No match + the.quick.brown.fox. +No match + the.quick.brown.fox_ +No match + the.quick.brown.fox+ +No match + +/(?>.*)(?<=(abcd|wxyz))/ + alphabetabcd + 0: alphabetabcd + 1: abcd + endingwxyz + 0: endingwxyz + 1: wxyz +\= Expect no match + a rather long string that doesn't end with one of them +No match + +/word (?>(?:(?!otherword)[a-zA-Z0-9]+ ){0,30})otherword/ + word cat dog elephant mussel cow horse canary baboon snake shark otherword + 0: word cat dog elephant mussel cow horse canary baboon snake shark otherword +\= Expect no match + word cat dog elephant mussel cow horse canary baboon snake shark +No match + +/word (?>[a-zA-Z0-9]+ ){0,30}otherword/ +\= Expect no match + word cat dog elephant mussel cow horse canary baboon snake shark the quick brown fox and the lazy dog and several other words getting close to thirty by now I hope +No match + +/(?<=\d{3}(?!999))foo/ + 999foo + 0: foo + 123999foo + 0: foo +\= Expect no match + 123abcfoo +No match + +/(?<=(?!...999)\d{3})foo/ + 999foo + 0: foo + 123999foo + 0: foo +\= Expect no match + 123abcfoo +No match + +/(?<=\d{3}(?!999)...)foo/ + 123abcfoo + 0: foo + 123456foo + 0: foo +\= Expect no match + 123999foo +No match + +/(?<=\d{3}...)(? + 2: + 3: abcd +
+ 2: + 3: abcd + \s*)=(?>\s*) # find + 2: + 3: abcd + Z)+|A)*/ + ZABCDEFG + 0: ZA + 1: A + +/((?>)+|A)*/ + ZABCDEFG + 0: + 1: + +/^[\d-a]/ + abcde + 0: a + -things + 0: - + 0digit + 0: 0 +\= Expect no match + bcdef +No match + +/[\s]+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d\x0b + +/\s+/ + > \x09\x0a\x0c\x0d\x0b< + 0: \x09\x0a\x0c\x0d\x0b + +/a b/x + ab + 0: ab + +/(?!\A)x/m + a\nxb\n + 0: x + +/(?!^)x/m +\= Expect no match + a\nxb\n +No match + +#/abc\Qabc\Eabc/ +# abcabcabc +# 0: abcabcabc + +#/abc\Q(*+|\Eabc/ +# abc(*+|abc +# 0: abc(*+|abc + +#/ abc\Q abc\Eabc/x +# abc abcabc +# 0: abc abcabc +#\= Expect no match +# abcabcabc +#No match + +#/abc#comment +# \Q#not comment +# literal\E/x +# abc#not comment\n literal +# 0: abc#not comment\x0a literal + +#/abc#comment +# \Q#not comment +# literal/x +# abc#not comment\n literal +# 0: abc#not comment\x0a literal + +#/abc#comment +# \Q#not comment +# literal\E #more comment +# /x +# abc#not comment\n literal +# 0: abc#not comment\x0a literal + +#/abc#comment +# \Q#not comment +# literal\E #more comment/x +# abc#not comment\n literal +# 0: abc#not comment\x0a literal + +#/\Qabc\$xyz\E/ +# abc\\\$xyz +# 0: abc\$xyz + +#/\Qabc\E\$\Qxyz\E/ +# abc\$xyz +# 0: abc$xyz + +/\Gabc/ + abc + 0: abc +\= Expect no match + xyzabc +No match + +/a(?x: b c )d/ + XabcdY + 0: abcd +\= Expect no match + Xa b c d Y +No match + +/((?x)x y z | a b c)/ + XabcY + 0: abc + 1: abc + AxyzB + 0: xyz + 1: xyz + +/(?i)AB(?-i)C/ + XabCY + 0: abC +\= Expect no match + XabcY +No match + +/((?i)AB(?-i)C|D)E/ + abCE + 0: abCE + 1: abC + DE + 0: DE + 1: D +\= Expect no match + abcE +No match + abCe +No match + dE +No match + De +No match + +/(.*)\d+\1/ + abc123abc + 0: abc123abc + 1: abc + abc123bc + 0: bc123bc + 1: bc + +/(.*)\d+\1/s + abc123abc + 0: abc123abc + 1: abc + abc123bc + 0: bc123bc + 1: bc + +/((.*))\d+\1/ + abc123abc + 0: abc123abc + 1: abc + 2: abc + abc123bc + 0: bc123bc + 1: bc + 2: bc + +# This tests for an IPv6 address in the form where it can have up to +# eight components, one and only one of which is empty. This must be +# an internal component. + +/^(?!:) # colon disallowed at start + (?: # start of item + (?: [0-9a-f]{1,4} | # 1-4 hex digits or + (?(1)0 | () ) ) # if null previously matched, fail; else null + : # followed by colon + ){1,7} # end item; 1-7 of them required + [0-9a-f]{1,4} $ # final hex number at end of string + (?(1)|.) # check that there was an empty component + /ix + a123::a123 + 0: a123::a123 + 1: + a123:b342::abcd + 0: a123:b342::abcd + 1: + a123:b342::324e:abcd + 0: a123:b342::324e:abcd + 1: + a123:ddde:b342::324e:abcd + 0: a123:ddde:b342::324e:abcd + 1: + a123:ddde:b342::324e:dcba:abcd + 0: a123:ddde:b342::324e:dcba:abcd + 1: + a123:ddde:9999:b342::324e:dcba:abcd + 0: a123:ddde:9999:b342::324e:dcba:abcd + 1: +\= Expect no match + 1:2:3:4:5:6:7:8 +No match + a123:bce:ddde:9999:b342::324e:dcba:abcd +No match + a123::9999:b342::324e:dcba:abcd +No match + abcde:2:3:4:5:6:7:8 +No match + ::1 +No match + abcd:fee0:123:: +No match + :1 +No match + 1: +No match + +#/[z\Qa-d]\E]/ +# z +# 0: z +# a +# 0: a +# - +# 0: - +# d +# 0: d +# ] +# 0: ] +#\= Expect no match +# b +#No match + +#TODO: PCRE has an optimization to make this workable, .NET does not +#/(a+)*b/ +#\= Expect no match +# aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +#No match + +# All these had to be updated because we understand unicode +# and this looks like it's expecting single byte matches + +# .NET generates \xe4...not sure what's up, might just be different code pages +/(?i)reg(?:ul(?:[aä]|ae)r|ex)/ + REGular + 0: REGular + regulaer + 0: regulaer + Regex + 0: Regex + regulär + 0: regul\xc3\xa4r + +#/Åæåä[à-ÿÀ-ß]+/ +# Åæåäà +# 0: \xc5\xe6\xe5\xe4\xe0 +# Åæåäÿ +# 0: \xc5\xe6\xe5\xe4\xff +# ÅæåäÀ +# 0: \xc5\xe6\xe5\xe4\xc0 +# Åæåäß +# 0: \xc5\xe6\xe5\xe4\xdf + +/(?<=Z)X./ + \x84XAZXB + 0: XB + +/ab cd (?x) de fg/ + ab cd defg + 0: ab cd defg + +/ab cd(?x) de fg/ + ab cddefg + 0: ab cddefg +\= Expect no match + abcddefg +No match + +/(? + 2: + D + 0: D + 1: + 2: + +# this is really long with debug -- removing for now +#/(a|)*\d/ +# aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 +# 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 +# 1: +#\= Expect no match +# aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +#No match + +/(?>a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 +\= Expect no match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/(?:a|)*\d/ + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 + 0: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa4 +\= Expect no match + aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +No match + +/^(?s)(?>.*)(? + 2: a + +/(?>(a))b|(a)c/ + ac + 0: ac + 1: + 2: a + +/(?=(a))ab|(a)c/ + ac + 0: ac + 1: + 2: a + +/((?>(a))b|(a)c)/ + ac + 0: ac + 1: ac + 2: + 3: a + +/(?=(?>(a))b|(a)c)(..)/ + ac + 0: ac + 1: + 2: a + 3: ac + +/(?>(?>(a))b|(a)c)/ + ac + 0: ac + 1: + 2: a + +/((?>(a+)b)+(aabab))/ + aaaabaaabaabab + 0: aaaabaaabaabab + 1: aaaabaaabaabab + 2: aaa + 3: aabab + +/(?>a+|ab)+?c/ +\= Expect no match + aabc +No match + +/(?>a+|ab)+c/ +\= Expect no match + aabc +No match + +/(?:a+|ab)+c/ + aabc + 0: aabc + +/^(?:a|ab)+c/ + aaaabc + 0: aaaabc + +/(?=abc){0}xyz/ + xyz + 0: xyz + +/(?=abc){1}xyz/ +\= Expect no match + xyz +No match + +/(?=(a))?./ + ab + 0: a + 1: a + bc + 0: b + +/(?=(a))??./ + ab + 0: a + bc + 0: b + +/^(?!a){0}\w+/ + aaaaa + 0: aaaaa + +/(?<=(abc))?xyz/ + abcxyz + 0: xyz + 1: abc + pqrxyz + 0: xyz + +/^[g]+/ + ggg<<>> + 0: ggg<<>> +\= Expect no match + \\ga +No match + +/^[ga]+/ + gggagagaxyz + 0: gggagaga + +/[:a]xxx[b:]/ + :xxx: + 0: :xxx: + +/(?<=a{2})b/i + xaabc + 0: b +\= Expect no match + xabc +No match + +/(? +# 4: +# 5: c +# 6: d +# 7: Y + +#/^X(?7)(a)(?|(b|(?|(r)|(t))(s))|(q))(c)(d)(Y)/ +# XYabcdY +# 0: XYabcdY +# 1: a +# 2: b +# 3: +# 4: +# 5: c +# 6: d +# 7: Y + +/(?'abc'\w+):\k{2}/ + a:aaxyz + 0: a:aa + 1: a + ab:ababxyz + 0: ab:abab + 1: ab +\= Expect no match + a:axyz +No match + ab:abxyz +No match + +/^(?a)? (?(ab)b|c) (?(ab)d|e)/x + abd + 0: abd + 1: a + ce + 0: ce + +# .NET has more consistent grouping numbers with these dupe groups for the two options +/(?:a(? (?')|(?")) |b(? (?')|(?")) ) (?(quote)[a-z]+|[0-9]+)/x,dupnames + a\"aaaaa + 0: a"aaaaa + 1: " + 2: + 3: " + b\"aaaaa + 0: b"aaaaa + 1: " + 2: + 3: " +\= Expect no match + b\"11111 +No match + +#/(?P(?P0)(?P>L1)|(?P>L2))/ +# 0 +# 0: 0 +# 1: 0 +# 00 +# 0: 00 +# 1: 00 +# 2: 0 +# 0000 +# 0: 0000 +# 1: 0000 +# 2: 0 + +#/(?P(?P0)|(?P>L2)(?P>L1))/ +# 0 +# 0: 0 +# 1: 0 +# 2: 0 +# 00 +# 0: 0 +# 1: 0 +# 2: 0 +# 0000 +# 0: 0 +# 1: 0 +# 2: 0 + +# Check the use of names for failure + +# Check opening parens in comment when seeking forward reference. + +#/(?P(?P=abn)xxx|)+/ +# xxx +# 0: +# 1: + +#Posses +/^(a)?(\w)/ + aaaaX + 0: aa + 1: a + 2: a + YZ + 0: Y + 1: + 2: Y + +#Posses +/^(?:a)?(\w)/ + aaaaX + 0: aa + 1: a + YZ + 0: Y + 1: Y + +/\A.*?(a|bc)/ + ba + 0: ba + 1: a + +/\A.*?(?:a|bc|d)/ + ba + 0: ba + +# -------------------------- + +/(another)?(\1?)test/ + hello world test + 0: test + 1: + 2: + +/(another)?(\1+)test/ +\= Expect no match + hello world test +No match + +/((?:a?)*)*c/ + aac + 0: aac + 1: + +/((?>a?)*)*c/ + aac + 0: aac + 1: + +/(?>.*?a)(?<=ba)/ + aba + 0: ba + +/(?:.*?a)(?<=ba)/ + aba + 0: aba + +/(?>.*?a)b/s + aab + 0: ab + +/(?>.*?a)b/ + aab + 0: ab + +/(?>^a)b/s +\= Expect no match + aab +No match + +/(?>.*?)(?<=(abcd)|(wxyz))/ + alphabetabcd + 0: + 1: abcd + endingwxyz + 0: + 1: + 2: wxyz + +/(?>.*)(?<=(abcd)|(wxyz))/ + alphabetabcd + 0: alphabetabcd + 1: abcd + endingwxyz + 0: endingwxyz + 1: + 2: wxyz + +"(?>.*)foo" +\= Expect no match + abcdfooxyz +No match + +"(?>.*?)foo" + abcdfooxyz + 0: foo + +# Tests that try to figure out how Perl works. My hypothesis is that the first +# verb that is backtracked onto is the one that acts. This seems to be the case +# almost all the time, but there is one exception that is perhaps a bug. + +/a(?=bc).|abd/ + abd + 0: abd + abc + 0: ab + +/a(?>bc)d|abd/ + abceabd + 0: abd + +# These tests were formerly in test 2, but changes in PCRE and Perl have +# made them compatible. + +/^(a)?(?(1)a|b)+$/ +\= Expect no match + a +No match + +# ---- + +/^\d*\w{4}/ + 1234 + 0: 1234 +\= Expect no match + 123 +No match + +/^[^b]*\w{4}/ + aaaa + 0: aaaa +\= Expect no match + aaa +No match + +/^[^b]*\w{4}/i + aaaa + 0: aaaa +\= Expect no match + aaa +No match + +/^a*\w{4}/ + aaaa + 0: aaaa +\= Expect no match + aaa +No match + +/^a*\w{4}/i + aaaa + 0: aaaa +\= Expect no match + aaa +No match + +/(?:(?foo)|(?bar))\k/dupnames + foofoo + 0: foofoo + 1: foo + barbar + 0: barbar + 1: bar + +# A notable difference between PCRE and .NET. According to +# the PCRE docs: +# If you make a subroutine call to a non-unique named +# subpattern, the one that corresponds to the first +# occurrence of the name is used. In the absence of +# duplicate numbers (see the previous section) this is +# the one with the lowest number. +# .NET takes the most recently captured number according to MSDN: +# A backreference refers to the most recent definition of +# a group (the definition most immediately to the left, +# when matching left to right). When a group makes multiple +# captures, a backreference refers to the most recent capture. + +#/(?A)(?:(?foo)|(?bar))\k/dupnames +# AfooA +# 0: AfooA +# 1: A +# 2: foo +# AbarA +# 0: AbarA +# 1: A +# 2: +# 3: bar +#\= Expect no match +# Afoofoo +#No match +# Abarbar +#No match + +/^(\d+)\s+IN\s+SOA\s+(\S+)\s+(\S+)\s*\(\s*$/ + 1 IN SOA non-sp1 non-sp2( + 0: 1 IN SOA non-sp1 non-sp2( + 1: 1 + 2: non-sp1 + 3: non-sp2 + +# TODO: .NET's group number ordering here in the second example is a bit odd +/^ (?:(?A)|(?'B'B)(?A)) (?(A)x) (?(B)y)$/x,dupnames + Ax + 0: Ax + 1: A + BAxy + 0: BAxy + 1: A + 2: B + +/ ^ a + b $ /x + aaaab + 0: aaaab + +/ ^ a + #comment + b $ /x + aaaab + 0: aaaab + +/ ^ a + #comment + #comment + b $ /x + aaaab + 0: aaaab + +/ ^ (?> a + ) b $ /x + aaaab + 0: aaaab + +/ ^ ( a + ) + \w $ /x + aaaab + 0: aaaab + 1: aaaa + +/(?:x|(?:(xx|yy)+|x|x|x|x|x)|a|a|a)bc/ +\= Expect no match + acb +No match + +#Posses +#/\A(?:[^\"]+|\"(?:[^\"]*|\"\")*\")+/ +# NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED +# 0: NON QUOTED "QUOT""ED" AFTER + +#Posses +#/\A(?:[^\"]+|\"(?:[^\"]+|\"\")*\")+/ +# NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED +# 0: NON QUOTED "QUOT""ED" AFTER + +#Posses +#/\A(?:[^\"]+|\"(?:[^\"]+|\"\")+\")+/ +# NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED +# 0: NON QUOTED "QUOT""ED" AFTER + +#Posses +#/\A([^\"1]+|[\"2]([^\"3]*|[\"4][\"5])*[\"6])+/ +# NON QUOTED \"QUOT\"\"ED\" AFTER \"NOT MATCHED +# 0: NON QUOTED "QUOT""ED" AFTER +# 1: AFTER +# 2: + +/^\w+(?>\s*)(?<=\w)/ + test test + 0: tes + +#/(?Pa)?(?Pb)?(?()c|d)*l/ +# acl +# 0: acl +# 1: a +# bdl +# 0: bdl +# 1: +# 2: b +# adl +# 0: dl +# bcl +# 0: l + +/\sabc/ + \x0babc + 0: \x0babc + +#/[\Qa]\E]+/ +# aa]] +# 0: aa]] + +#/[\Q]a\E]+/ +# aa]] +# 0: aa]] + +/A((((((((a))))))))\8B/ + AaaB + 0: AaaB + 1: a + 2: a + 3: a + 4: a + 5: a + 6: a + 7: a + 8: a + +/A(((((((((a)))))))))\9B/ + AaaB + 0: AaaB + 1: a + 2: a + 3: a + 4: a + 5: a + 6: a + 7: a + 8: a + 9: a + +/(|ab)*?d/ + abd + 0: abd + 1: ab + xyd + 0: d + +/(\2|a)(\1)/ + aaa + 0: aa + 1: a + 2: a + +/(\2)(\1)/ + +"Z*(|d*){216}" + +/((((((((((((x))))))))))))\12/ + xx + 0: xx + 1: x + 2: x + 3: x + 4: x + 5: x + 6: x + 7: x + 8: x + 9: x +10: x +11: x +12: x + +#"(?|(\k'Pm')|(?'Pm'))" +# abcd +# 0: +# 1: + +#/(?|(aaa)|(b))\g{1}/ +# aaaaaa +# 0: aaaaaa +# 1: aaa +# bb +# 0: bb +# 1: b + +#/(?|(aaa)|(b))(?1)/ +# aaaaaa +# 0: aaaaaa +# 1: aaa +# baaa +# 0: baaa +# 1: b +#\= Expect no match +# bb +#No match + +#/(?|(aaa)|(b))/ +# xaaa +# 0: aaa +# 1: aaa +# xbc +# 0: b +# 1: b + +#/(?|(?'a'aaa)|(?'a'b))\k'a'/ +# aaaaaa +# 0: aaaaaa +# 1: aaa +# bb +# 0: bb +# 1: b + +#/(?|(?'a'aaa)|(?'a'b))(?'a'cccc)\k'a'/dupnames +# aaaccccaaa +# 0: aaaccccaaa +# 1: aaa +# 2: cccc +# bccccb +# 0: bccccb +# 1: b +# 2: cccc + +# End of testinput1 diff --git a/vendor/github.com/elliotchance/orderedmap/v2/LICENSE b/vendor/github.com/elliotchance/orderedmap/v2/LICENSE new file mode 100644 index 0000000..852bb97 --- /dev/null +++ b/vendor/github.com/elliotchance/orderedmap/v2/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2020 Elliot Chance + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/elliotchance/orderedmap/v2/iterator.go b/vendor/github.com/elliotchance/orderedmap/v2/iterator.go new file mode 100644 index 0000000..1987959 --- /dev/null +++ b/vendor/github.com/elliotchance/orderedmap/v2/iterator.go @@ -0,0 +1,26 @@ +//go:build go1.23 +// +build go1.23 + +package orderedmap + +import "iter" + +func (m *OrderedMap[K, V]) Iterator() iter.Seq2[K, V] { + return func(yield func(key K, value V) bool) { + for el := m.Front(); el != nil; el = el.Next() { + if !yield(el.Key, el.Value) { + return + } + } + } +} + +func (m *OrderedMap[K, V]) ReverseIterator() iter.Seq2[K, V] { + return func(yield func(key K, value V) bool) { + for el := m.Back(); el != nil; el = el.Prev() { + if !yield(el.Key, el.Value) { + return + } + } + } +} diff --git a/vendor/github.com/elliotchance/orderedmap/v2/list.go b/vendor/github.com/elliotchance/orderedmap/v2/list.go new file mode 100644 index 0000000..c2a571d --- /dev/null +++ b/vendor/github.com/elliotchance/orderedmap/v2/list.go @@ -0,0 +1,95 @@ +package orderedmap + +// Element is an element of a null terminated (non circular) intrusive doubly linked list that contains the key of the correspondent element in the ordered map too. +type Element[K comparable, V any] struct { + // Next and previous pointers in the doubly-linked list of elements. + // To simplify the implementation, internally a list l is implemented + // as a ring, such that &l.root is both the next element of the last + // list element (l.Back()) and the previous element of the first list + // element (l.Front()). + next, prev *Element[K, V] + + // The key that corresponds to this element in the ordered map. + Key K + + // The value stored with this element. + Value V +} + +// Next returns the next list element or nil. +func (e *Element[K, V]) Next() *Element[K, V] { + return e.next +} + +// Prev returns the previous list element or nil. +func (e *Element[K, V]) Prev() *Element[K, V] { + return e.prev +} + +// list represents a null terminated (non circular) intrusive doubly linked list. +// The list is immediately usable after instantiation without the need of a dedicated initialization. +type list[K comparable, V any] struct { + root Element[K, V] // list head and tail +} + +func (l *list[K, V]) IsEmpty() bool { + return l.root.next == nil +} + +// Front returns the first element of list l or nil if the list is empty. +func (l *list[K, V]) Front() *Element[K, V] { + return l.root.next +} + +// Back returns the last element of list l or nil if the list is empty. +func (l *list[K, V]) Back() *Element[K, V] { + return l.root.prev +} + +// Remove removes e from its list +func (l *list[K, V]) Remove(e *Element[K, V]) { + if e.prev == nil { + l.root.next = e.next + } else { + e.prev.next = e.next + } + if e.next == nil { + l.root.prev = e.prev + } else { + e.next.prev = e.prev + } + e.next = nil // avoid memory leaks + e.prev = nil // avoid memory leaks +} + +// PushFront inserts a new element e with value v at the front of list l and returns e. +func (l *list[K, V]) PushFront(key K, value V) *Element[K, V] { + e := &Element[K, V]{Key: key, Value: value} + if l.root.next == nil { + // It's the first element + l.root.next = e + l.root.prev = e + return e + } + + e.next = l.root.next + l.root.next.prev = e + l.root.next = e + return e +} + +// PushBack inserts a new element e with value v at the back of list l and returns e. +func (l *list[K, V]) PushBack(key K, value V) *Element[K, V] { + e := &Element[K, V]{Key: key, Value: value} + if l.root.prev == nil { + // It's the first element + l.root.next = e + l.root.prev = e + return e + } + + e.prev = l.root.prev + l.root.prev.next = e + l.root.prev = e + return e +} diff --git a/vendor/github.com/elliotchance/orderedmap/v2/orderedmap.go b/vendor/github.com/elliotchance/orderedmap/v2/orderedmap.go new file mode 100644 index 0000000..c28ecdf --- /dev/null +++ b/vendor/github.com/elliotchance/orderedmap/v2/orderedmap.go @@ -0,0 +1,124 @@ +package orderedmap + +type OrderedMap[K comparable, V any] struct { + kv map[K]*Element[K, V] + ll list[K, V] +} + +func NewOrderedMap[K comparable, V any]() *OrderedMap[K, V] { + return &OrderedMap[K, V]{ + kv: make(map[K]*Element[K, V]), + } +} + +// Get returns the value for a key. If the key does not exist, the second return +// parameter will be false and the value will be nil. +func (m *OrderedMap[K, V]) Get(key K) (value V, ok bool) { + v, ok := m.kv[key] + if ok { + value = v.Value + } + + return +} + +// Set will set (or replace) a value for a key. If the key was new, then true +// will be returned. The returned value will be false if the value was replaced +// (even if the value was the same). +func (m *OrderedMap[K, V]) Set(key K, value V) bool { + _, alreadyExist := m.kv[key] + if alreadyExist { + m.kv[key].Value = value + return false + } + + element := m.ll.PushBack(key, value) + m.kv[key] = element + return true +} + +// ReplaceKey replaces an existing key with a new key while preserving order of +// the value. This function will return true if the operation was successful, or +// false if 'originalKey' is not found OR 'newKey' already exists (which would be an overwrite). +func (m *OrderedMap[K, V]) ReplaceKey(originalKey, newKey K) bool { + element, originalExists := m.kv[originalKey] + _, newKeyExists := m.kv[newKey] + if originalExists && !newKeyExists { + delete(m.kv, originalKey) + m.kv[newKey] = element + element.Key = newKey + return true + } + return false +} + +// GetOrDefault returns the value for a key. If the key does not exist, returns +// the default value instead. +func (m *OrderedMap[K, V]) GetOrDefault(key K, defaultValue V) V { + if value, ok := m.kv[key]; ok { + return value.Value + } + + return defaultValue +} + +// GetElement returns the element for a key. If the key does not exist, the +// pointer will be nil. +func (m *OrderedMap[K, V]) GetElement(key K) *Element[K, V] { + element, ok := m.kv[key] + if ok { + return element + } + + return nil +} + +// Len returns the number of elements in the map. +func (m *OrderedMap[K, V]) Len() int { + return len(m.kv) +} + +// Keys returns all of the keys in the order they were inserted. If a key was +// replaced it will retain the same position. To ensure most recently set keys +// are always at the end you must always Delete before Set. +func (m *OrderedMap[K, V]) Keys() (keys []K) { + keys = make([]K, 0, m.Len()) + for el := m.Front(); el != nil; el = el.Next() { + keys = append(keys, el.Key) + } + return keys +} + +// Delete will remove a key from the map. It will return true if the key was +// removed (the key did exist). +func (m *OrderedMap[K, V]) Delete(key K) (didDelete bool) { + element, ok := m.kv[key] + if ok { + m.ll.Remove(element) + delete(m.kv, key) + } + + return ok +} + +// Front will return the element that is the first (oldest Set element). If +// there are no elements this will return nil. +func (m *OrderedMap[K, V]) Front() *Element[K, V] { + return m.ll.Front() +} + +// Back will return the element that is the last (most recent Set element). If +// there are no elements this will return nil. +func (m *OrderedMap[K, V]) Back() *Element[K, V] { + return m.ll.Back() +} + +// Copy returns a new OrderedMap with the same elements. +// Using Copy while there are concurrent writes may mangle the result. +func (m *OrderedMap[K, V]) Copy() *OrderedMap[K, V] { + m2 := NewOrderedMap[K, V]() + for el := m.Front(); el != nil; el = el.Next() { + m2.Set(el.Key, el.Value) + } + return m2 +} diff --git a/vendor/github.com/gorilla/feeds/.editorconfig b/vendor/github.com/gorilla/feeds/.editorconfig new file mode 100644 index 0000000..2940ec9 --- /dev/null +++ b/vendor/github.com/gorilla/feeds/.editorconfig @@ -0,0 +1,20 @@ +; https://editorconfig.org/ + +root = true + +[*] +insert_final_newline = true +charset = utf-8 +trim_trailing_whitespace = true +indent_style = space +indent_size = 2 + +[{Makefile,go.mod,go.sum,*.go,.gitmodules}] +indent_style = tab +indent_size = 4 + +[*.md] +indent_size = 4 +trim_trailing_whitespace = false + +eclint_indent_style = unset diff --git a/vendor/github.com/gorilla/feeds/.gitignore b/vendor/github.com/gorilla/feeds/.gitignore new file mode 100644 index 0000000..84039fe --- /dev/null +++ b/vendor/github.com/gorilla/feeds/.gitignore @@ -0,0 +1 @@ +coverage.coverprofile diff --git a/vendor/github.com/gorilla/feeds/LICENSE b/vendor/github.com/gorilla/feeds/LICENSE new file mode 100644 index 0000000..ee0d53c --- /dev/null +++ b/vendor/github.com/gorilla/feeds/LICENSE @@ -0,0 +1,28 @@ +Copyright (c) 2023 The Gorilla Authors. All rights reserved. + +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are +met: + + * Redistributions of source code must retain the above copyright +notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above +copyright notice, this list of conditions and the following disclaimer +in the documentation and/or other materials provided with the +distribution. + * Neither the name of Google Inc. nor the names of its +contributors may be used to endorse or promote products derived from +this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS +"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT +LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR +A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT +OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, +SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT +LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, +DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY +THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/vendor/github.com/gorilla/feeds/Makefile b/vendor/github.com/gorilla/feeds/Makefile new file mode 100644 index 0000000..ac37ffd --- /dev/null +++ b/vendor/github.com/gorilla/feeds/Makefile @@ -0,0 +1,34 @@ +GO_LINT=$(shell which golangci-lint 2> /dev/null || echo '') +GO_LINT_URI=github.com/golangci/golangci-lint/cmd/golangci-lint@latest + +GO_SEC=$(shell which gosec 2> /dev/null || echo '') +GO_SEC_URI=github.com/securego/gosec/v2/cmd/gosec@latest + +GO_VULNCHECK=$(shell which govulncheck 2> /dev/null || echo '') +GO_VULNCHECK_URI=golang.org/x/vuln/cmd/govulncheck@latest + +.PHONY: golangci-lint +golangci-lint: + $(if $(GO_LINT), ,go install $(GO_LINT_URI)) + @echo "##### Running golangci-lint" + golangci-lint run -v + +.PHONY: gosec +gosec: + $(if $(GO_SEC), ,go install $(GO_SEC_URI)) + @echo "##### Running gosec" + gosec ./... + +.PHONY: govulncheck +govulncheck: + $(if $(GO_VULNCHECK), ,go install $(GO_VULNCHECK_URI)) + @echo "##### Running govulncheck" + govulncheck ./... + +.PHONY: verify +verify: golangci-lint gosec govulncheck + +.PHONY: test +test: + @echo "##### Running tests" + go test -race -cover -coverprofile=coverage.coverprofile -covermode=atomic -v ./... diff --git a/vendor/github.com/gorilla/feeds/README.md b/vendor/github.com/gorilla/feeds/README.md new file mode 100644 index 0000000..7d7137b --- /dev/null +++ b/vendor/github.com/gorilla/feeds/README.md @@ -0,0 +1,198 @@ +## gorilla/feeds +![testing](https://github.com/gorilla/feeds/actions/workflows/test.yml/badge.svg) +[![codecov](https://codecov.io/github/gorilla/feeds/branch/main/graph/badge.svg)](https://codecov.io/github/gorilla/feeds) +[![godoc](https://godoc.org/github.com/gorilla/feeds?status.svg)](https://godoc.org/github.com/gorilla/feeds) +[![sourcegraph](https://sourcegraph.com/github.com/gorilla/feeds/-/badge.svg)](https://sourcegraph.com/github.com/gorilla/feeds?badge) + +![Gorilla Logo](https://github.com/gorilla/.github/assets/53367916/d92caabf-98e0-473e-bfbf-ab554ba435e5) + +feeds is a web feed generator library for generating RSS, Atom and JSON feeds from Go +applications. + +### Goals + + * Provide a simple interface to create both Atom & RSS 2.0 feeds + * Full support for [Atom][atom], [RSS 2.0][rss], and [JSON Feed Version 1][jsonfeed] spec elements + * Ability to modify particulars for each spec + +[atom]: https://tools.ietf.org/html/rfc4287 +[rss]: http://www.rssboard.org/rss-specification +[jsonfeed]: https://jsonfeed.org/version/1.1 + +### Usage + +```go +package main + +import ( + "fmt" + "log" + "time" + "github.com/gorilla/feeds" +) + +func main() { + now := time.Now() + feed := &feeds.Feed{ + Title: "jmoiron.net blog", + Link: &feeds.Link{Href: "http://jmoiron.net/blog"}, + Description: "discussion about tech, footie, photos", + Author: &feeds.Author{Name: "Jason Moiron", Email: "jmoiron@jmoiron.net"}, + Created: now, + } + + feed.Items = []*feeds.Item{ + &feeds.Item{ + Title: "Limiting Concurrency in Go", + Link: &feeds.Link{Href: "http://jmoiron.net/blog/limiting-concurrency-in-go/"}, + Description: "A discussion on controlled parallelism in golang", + Author: &feeds.Author{Name: "Jason Moiron", Email: "jmoiron@jmoiron.net"}, + Created: now, + }, + &feeds.Item{ + Title: "Logic-less Template Redux", + Link: &feeds.Link{Href: "http://jmoiron.net/blog/logicless-template-redux/"}, + Description: "More thoughts on logicless templates", + Created: now, + }, + &feeds.Item{ + Title: "Idiomatic Code Reuse in Go", + Link: &feeds.Link{Href: "http://jmoiron.net/blog/idiomatic-code-reuse-in-go/"}, + Description: "How to use interfaces effectively", + Created: now, + }, + } + + atom, err := feed.ToAtom() + if err != nil { + log.Fatal(err) + } + + rss, err := feed.ToRss() + if err != nil { + log.Fatal(err) + } + + json, err := feed.ToJSON() + if err != nil { + log.Fatal(err) + } + + fmt.Println(atom, "\n", rss, "\n", json) +} +``` + +Outputs: + +```xml + + + jmoiron.net blog + + http://jmoiron.net/blog + 2013-01-16T03:26:01-05:00 + discussion about tech, footie, photos + + Limiting Concurrency in Go + + 2013-01-16T03:26:01-05:00 + tag:jmoiron.net,2013-01-16:/blog/limiting-concurrency-in-go/ + A discussion on controlled parallelism in golang + + Jason Moiron + jmoiron@jmoiron.net + + + + Logic-less Template Redux + + 2013-01-16T03:26:01-05:00 + tag:jmoiron.net,2013-01-16:/blog/logicless-template-redux/ + More thoughts on logicless templates + + + + Idiomatic Code Reuse in Go + + 2013-01-16T03:26:01-05:00 + tag:jmoiron.net,2013-01-16:/blog/idiomatic-code-reuse-in-go/ + How to use interfaces <em>effectively</em> + + + + + + + + jmoiron.net blog + http://jmoiron.net/blog + discussion about tech, footie, photos + jmoiron@jmoiron.net (Jason Moiron) + 2013-01-16T03:22:24-05:00 + + Limiting Concurrency in Go + http://jmoiron.net/blog/limiting-concurrency-in-go/ + A discussion on controlled parallelism in golang + 2013-01-16T03:22:24-05:00 + + + Logic-less Template Redux + http://jmoiron.net/blog/logicless-template-redux/ + More thoughts on logicless templates + 2013-01-16T03:22:24-05:00 + + + Idiomatic Code Reuse in Go + http://jmoiron.net/blog/idiomatic-code-reuse-in-go/ + How to use interfaces <em>effectively</em> + 2013-01-16T03:22:24-05:00 + + + + +{ + "version": "https://jsonfeed.org/version/1.1", + "title": "jmoiron.net blog", + "home_page_url": "http://jmoiron.net/blog", + "description": "discussion about tech, footie, photos", + "author": { + "name": "Jason Moiron" + }, + "authors": [ + { + "name": "Jason Moiron" + } + ], + "items": [ + { + "id": "", + "url": "http://jmoiron.net/blog/limiting-concurrency-in-go/", + "title": "Limiting Concurrency in Go", + "summary": "A discussion on controlled parallelism in golang", + "date_published": "2013-01-16T03:22:24.530817846-05:00", + "author": { + "name": "Jason Moiron" + }, + "authors": [ + { + "name": "Jason Moiron" + } + ] + }, + { + "id": "", + "url": "http://jmoiron.net/blog/logicless-template-redux/", + "title": "Logic-less Template Redux", + "summary": "More thoughts on logicless templates", + "date_published": "2013-01-16T03:22:24.530817846-05:00" + }, + { + "id": "", + "url": "http://jmoiron.net/blog/idiomatic-code-reuse-in-go/", + "title": "Idiomatic Code Reuse in Go", + "summary": "How to use interfaces \u003cem\u003eeffectively\u003c/em\u003e", + "date_published": "2013-01-16T03:22:24.530817846-05:00" + } + ] +} +``` diff --git a/vendor/github.com/gorilla/feeds/atom.go b/vendor/github.com/gorilla/feeds/atom.go new file mode 100644 index 0000000..73de995 --- /dev/null +++ b/vendor/github.com/gorilla/feeds/atom.go @@ -0,0 +1,178 @@ +package feeds + +import ( + "encoding/xml" + "fmt" + "net/url" + "time" +) + +// Generates Atom feed as XML + +const ns = "http://www.w3.org/2005/Atom" + +type AtomPerson struct { + Name string `xml:"name,omitempty"` + Uri string `xml:"uri,omitempty"` + Email string `xml:"email,omitempty"` +} + +type AtomSummary struct { + XMLName xml.Name `xml:"summary"` + Content string `xml:",chardata"` + Type string `xml:"type,attr"` +} + +type AtomContent struct { + XMLName xml.Name `xml:"content"` + Content string `xml:",chardata"` + Type string `xml:"type,attr"` +} + +type AtomAuthor struct { + XMLName xml.Name `xml:"author"` + AtomPerson +} + +type AtomContributor struct { + XMLName xml.Name `xml:"contributor"` + AtomPerson +} + +type AtomEntry struct { + XMLName xml.Name `xml:"entry"` + Xmlns string `xml:"xmlns,attr,omitempty"` + Title string `xml:"title"` // required + Updated string `xml:"updated"` // required + Id string `xml:"id"` // required + Category string `xml:"category,omitempty"` + Content *AtomContent + Rights string `xml:"rights,omitempty"` + Source string `xml:"source,omitempty"` + Published string `xml:"published,omitempty"` + Contributor *AtomContributor + Links []AtomLink // required if no child 'content' elements + Summary *AtomSummary // required if content has src or content is base64 + Author *AtomAuthor // required if feed lacks an author +} + +// Multiple links with different rel can coexist +type AtomLink struct { + //Atom 1.0 + XMLName xml.Name `xml:"link"` + Href string `xml:"href,attr"` + Rel string `xml:"rel,attr,omitempty"` + Type string `xml:"type,attr,omitempty"` + Length string `xml:"length,attr,omitempty"` +} + +type AtomFeed struct { + XMLName xml.Name `xml:"feed"` + Xmlns string `xml:"xmlns,attr"` + Title string `xml:"title"` // required + Id string `xml:"id"` // required + Updated string `xml:"updated"` // required + Category string `xml:"category,omitempty"` + Icon string `xml:"icon,omitempty"` + Logo string `xml:"logo,omitempty"` + Rights string `xml:"rights,omitempty"` // copyright used + Subtitle string `xml:"subtitle,omitempty"` + Link *AtomLink + Author *AtomAuthor `xml:"author,omitempty"` + Contributor *AtomContributor + Entries []*AtomEntry `xml:"entry"` +} + +type Atom struct { + *Feed +} + +func newAtomEntry(i *Item) *AtomEntry { + id := i.Id + link := i.Link + if link == nil { + link = &Link{} + } + if len(id) == 0 { + // if there's no id set, try to create one, either from data or just a uuid + if len(link.Href) > 0 && (!i.Created.IsZero() || !i.Updated.IsZero()) { + dateStr := anyTimeFormat("2006-01-02", i.Updated, i.Created) + host, path := link.Href, "/invalid.html" + if url, err := url.Parse(link.Href); err == nil { + host, path = url.Host, url.Path + } + id = fmt.Sprintf("tag:%s,%s:%s", host, dateStr, path) + } else { + id = "urn:uuid:" + NewUUID().String() + } + } + var name, email string + if i.Author != nil { + name, email = i.Author.Name, i.Author.Email + } + + link_rel := link.Rel + if link_rel == "" { + link_rel = "alternate" + } + x := &AtomEntry{ + Title: i.Title, + Links: []AtomLink{{Href: link.Href, Rel: link_rel, Type: link.Type}}, + Id: id, + Updated: anyTimeFormat(time.RFC3339, i.Updated, i.Created), + } + + // if there's a description, assume it's html + if len(i.Description) > 0 { + x.Summary = &AtomSummary{Content: i.Description, Type: "html"} + } + + // if there's a content, assume it's html + if len(i.Content) > 0 { + x.Content = &AtomContent{Content: i.Content, Type: "html"} + } + + if i.Enclosure != nil && link_rel != "enclosure" { + x.Links = append(x.Links, AtomLink{Href: i.Enclosure.Url, Rel: "enclosure", Type: i.Enclosure.Type, Length: i.Enclosure.Length}) + } + + if len(name) > 0 || len(email) > 0 { + x.Author = &AtomAuthor{AtomPerson: AtomPerson{Name: name, Email: email}} + } + return x +} + +// create a new AtomFeed with a generic Feed struct's data +func (a *Atom) AtomFeed() *AtomFeed { + updated := anyTimeFormat(time.RFC3339, a.Updated, a.Created) + link := a.Link + if link == nil { + link = &Link{} + } + feed := &AtomFeed{ + Xmlns: ns, + Title: a.Title, + Link: &AtomLink{Href: link.Href, Rel: link.Rel}, + Subtitle: a.Description, + Id: link.Href, + Updated: updated, + Rights: a.Copyright, + } + if a.Author != nil { + feed.Author = &AtomAuthor{AtomPerson: AtomPerson{Name: a.Author.Name, Email: a.Author.Email}} + } + for _, e := range a.Items { + feed.Entries = append(feed.Entries, newAtomEntry(e)) + } + return feed +} + +// FeedXml returns an XML-Ready object for an Atom object +func (a *Atom) FeedXml() interface{} { + return a.AtomFeed() +} + +// FeedXml returns an XML-ready object for an AtomFeed object +func (a *AtomFeed) FeedXml() interface{} { + return a +} diff --git a/vendor/github.com/gorilla/feeds/doc.go b/vendor/github.com/gorilla/feeds/doc.go new file mode 100644 index 0000000..4e0759c --- /dev/null +++ b/vendor/github.com/gorilla/feeds/doc.go @@ -0,0 +1,73 @@ +/* +Syndication (feed) generator library for golang. + +Installing + + go get github.com/gorilla/feeds + +Feeds provides a simple, generic Feed interface with a generic Item object as well as RSS, Atom and JSON Feed specific RssFeed, AtomFeed and JSONFeed objects which allow access to all of each spec's defined elements. + +Examples + +Create a Feed and some Items in that feed using the generic interfaces: + + import ( + "time" + . "github.com/gorilla/feeds" + ) + + now = time.Now() + + feed := &Feed{ + Title: "jmoiron.net blog", + Link: &Link{Href: "http://jmoiron.net/blog"}, + Description: "discussion about tech, footie, photos", + Author: &Author{Name: "Jason Moiron", Email: "jmoiron@jmoiron.net"}, + Created: now, + Copyright: "This work is copyright © Benjamin Button", + } + + feed.Items = []*Item{ + &Item{ + Title: "Limiting Concurrency in Go", + Link: &Link{Href: "http://jmoiron.net/blog/limiting-concurrency-in-go/"}, + Description: "A discussion on controlled parallelism in golang", + Author: &Author{Name: "Jason Moiron", Email: "jmoiron@jmoiron.net"}, + Created: now, + }, + &Item{ + Title: "Logic-less Template Redux", + Link: &Link{Href: "http://jmoiron.net/blog/logicless-template-redux/"}, + Description: "More thoughts on logicless templates", + Created: now, + }, + &Item{ + Title: "Idiomatic Code Reuse in Go", + Link: &Link{Href: "http://jmoiron.net/blog/idiomatic-code-reuse-in-go/"}, + Description: "How to use interfaces effectively", + Created: now, + }, + } + +From here, you can output Atom, RSS, or JSON Feed versions of this feed easily + + atom, err := feed.ToAtom() + rss, err := feed.ToRss() + json, err := feed.ToJSON() + +You can also get access to the underlying objects that feeds uses to export its XML + + atomFeed := (&Atom{Feed: feed}).AtomFeed() + rssFeed := (&Rss{Feed: feed}).RssFeed() + jsonFeed := (&JSON{Feed: feed}).JSONFeed() + +From here, you can modify or add each syndication's specific fields before outputting + + atomFeed.Subtitle = "plays the blues" + atom, err := ToXML(atomFeed) + rssFeed.Generator = "gorilla/feeds v1.0 (github.com/gorilla/feeds)" + rss, err := ToXML(rssFeed) + jsonFeed.NextUrl = "https://www.example.com/feed.json?page=2" + json, err := jsonFeed.ToJSON() +*/ +package feeds diff --git a/vendor/github.com/gorilla/feeds/feed.go b/vendor/github.com/gorilla/feeds/feed.go new file mode 100644 index 0000000..929c226 --- /dev/null +++ b/vendor/github.com/gorilla/feeds/feed.go @@ -0,0 +1,146 @@ +package feeds + +import ( + "encoding/json" + "encoding/xml" + "io" + "sort" + "time" +) + +type Link struct { + Href, Rel, Type, Length string +} + +type Author struct { + Name, Email string +} + +type Image struct { + Url, Title, Link string + Width, Height int +} + +type Enclosure struct { + Url, Length, Type string +} + +type Item struct { + Title string + Link *Link + Source *Link + Author *Author + Description string // used as description in rss, summary in atom + Id string // used as guid in rss, id in atom + IsPermaLink string // an optional parameter for guid in rss + Updated time.Time + Created time.Time + Enclosure *Enclosure + Content string +} + +type Feed struct { + Title string + Link *Link + Description string + Author *Author + Updated time.Time + Created time.Time + Id string + Subtitle string + Items []*Item + Copyright string + Image *Image +} + +// add a new Item to a Feed +func (f *Feed) Add(item *Item) { + f.Items = append(f.Items, item) +} + +// returns the first non-zero time formatted as a string or "" +func anyTimeFormat(format string, times ...time.Time) string { + for _, t := range times { + if !t.IsZero() { + return t.Format(format) + } + } + return "" +} + +// interface used by ToXML to get a object suitable for exporting XML. +type XmlFeed interface { + FeedXml() interface{} +} + +// turn a feed object (either a Feed, AtomFeed, or RssFeed) into xml +// returns an error if xml marshaling fails +func ToXML(feed XmlFeed) (string, error) { + x := feed.FeedXml() + data, err := xml.MarshalIndent(x, "", " ") + if err != nil { + return "", err + } + // strip empty line from default xml header + s := xml.Header[:len(xml.Header)-1] + string(data) + return s, nil +} + +// WriteXML writes a feed object (either a Feed, AtomFeed, or RssFeed) as XML into +// the writer. Returns an error if XML marshaling fails. +func WriteXML(feed XmlFeed, w io.Writer) error { + x := feed.FeedXml() + // write default xml header, without the newline + if _, err := w.Write([]byte(xml.Header[:len(xml.Header)-1])); err != nil { + return err + } + e := xml.NewEncoder(w) + e.Indent("", " ") + return e.Encode(x) +} + +// creates an Atom representation of this feed +func (f *Feed) ToAtom() (string, error) { + a := &Atom{f} + return ToXML(a) +} + +// WriteAtom writes an Atom representation of this feed to the writer. +func (f *Feed) WriteAtom(w io.Writer) error { + return WriteXML(&Atom{f}, w) +} + +// creates an Rss representation of this feed +func (f *Feed) ToRss() (string, error) { + r := &Rss{f} + return ToXML(r) +} + +// WriteRss writes an RSS representation of this feed to the writer. +func (f *Feed) WriteRss(w io.Writer) error { + return WriteXML(&Rss{f}, w) +} + +// ToJSON creates a JSON Feed representation of this feed +func (f *Feed) ToJSON() (string, error) { + j := &JSON{f} + return j.ToJSON() +} + +// WriteJSON writes an JSON representation of this feed to the writer. +func (f *Feed) WriteJSON(w io.Writer) error { + j := &JSON{f} + feed := j.JSONFeed() + + e := json.NewEncoder(w) + e.SetIndent("", " ") + return e.Encode(feed) +} + +// Sort sorts the Items in the feed with the given less function. +func (f *Feed) Sort(less func(a, b *Item) bool) { + lessFunc := func(i, j int) bool { + return less(f.Items[i], f.Items[j]) + } + sort.SliceStable(f.Items, lessFunc) +} diff --git a/vendor/github.com/gorilla/feeds/json.go b/vendor/github.com/gorilla/feeds/json.go new file mode 100644 index 0000000..ae5deb7 --- /dev/null +++ b/vendor/github.com/gorilla/feeds/json.go @@ -0,0 +1,190 @@ +package feeds + +import ( + "encoding/json" + "strings" + "time" +) + +const jsonFeedVersion = "https://jsonfeed.org/version/1.1" + +// JSONAuthor represents the author of the feed or of an individual item +// in the feed +type JSONAuthor struct { + Name string `json:"name,omitempty"` + Url string `json:"url,omitempty"` + Avatar string `json:"avatar,omitempty"` +} + +// JSONAttachment represents a related resource. Podcasts, for instance, would +// include an attachment that’s an audio or video file. +type JSONAttachment struct { + Url string `json:"url,omitempty"` + MIMEType string `json:"mime_type,omitempty"` + Title string `json:"title,omitempty"` + Size int32 `json:"size,omitempty"` + Duration time.Duration `json:"duration_in_seconds,omitempty"` +} + +// MarshalJSON implements the json.Marshaler interface. +// The Duration field is marshaled in seconds, all other fields are marshaled +// based upon the definitions in struct tags. +func (a *JSONAttachment) MarshalJSON() ([]byte, error) { + type EmbeddedJSONAttachment JSONAttachment + return json.Marshal(&struct { + Duration float64 `json:"duration_in_seconds,omitempty"` + *EmbeddedJSONAttachment + }{ + EmbeddedJSONAttachment: (*EmbeddedJSONAttachment)(a), + Duration: a.Duration.Seconds(), + }) +} + +// UnmarshalJSON implements the json.Unmarshaler interface. +// The Duration field is expected to be in seconds, all other field types +// match the struct definition. +func (a *JSONAttachment) UnmarshalJSON(data []byte) error { + type EmbeddedJSONAttachment JSONAttachment + var raw struct { + Duration float64 `json:"duration_in_seconds,omitempty"` + *EmbeddedJSONAttachment + } + raw.EmbeddedJSONAttachment = (*EmbeddedJSONAttachment)(a) + + err := json.Unmarshal(data, &raw) + if err != nil { + return err + } + + if raw.Duration > 0 { + nsec := int64(raw.Duration * float64(time.Second)) + raw.EmbeddedJSONAttachment.Duration = time.Duration(nsec) + } + + return nil +} + +// JSONItem represents a single entry/post for the feed. +type JSONItem struct { + Id string `json:"id"` + Url string `json:"url,omitempty"` + ExternalUrl string `json:"external_url,omitempty"` + Title string `json:"title,omitempty"` + ContentHTML string `json:"content_html,omitempty"` + ContentText string `json:"content_text,omitempty"` + Summary string `json:"summary,omitempty"` + Image string `json:"image,omitempty"` + BannerImage string `json:"banner_,omitempty"` + PublishedDate *time.Time `json:"date_published,omitempty"` + ModifiedDate *time.Time `json:"date_modified,omitempty"` + Author *JSONAuthor `json:"author,omitempty"` // deprecated in JSON Feed v1.1, keeping for backwards compatibility + Authors []*JSONAuthor `json:"authors,omitempty"` + Tags []string `json:"tags,omitempty"` + Attachments []JSONAttachment `json:"attachments,omitempty"` +} + +// JSONHub describes an endpoint that can be used to subscribe to real-time +// notifications from the publisher of this feed. +type JSONHub struct { + Type string `json:"type"` + Url string `json:"url"` +} + +// JSONFeed represents a syndication feed in the JSON Feed Version 1 format. +// Matching the specification found here: https://jsonfeed.org/version/1. +type JSONFeed struct { + Version string `json:"version"` + Title string `json:"title"` + Language string `json:"language,omitempty"` + HomePageUrl string `json:"home_page_url,omitempty"` + FeedUrl string `json:"feed_url,omitempty"` + Description string `json:"description,omitempty"` + UserComment string `json:"user_comment,omitempty"` + NextUrl string `json:"next_url,omitempty"` + Icon string `json:"icon,omitempty"` + Favicon string `json:"favicon,omitempty"` + Author *JSONAuthor `json:"author,omitempty"` // deprecated in JSON Feed v1.1, keeping for backwards compatibility + Authors []*JSONAuthor `json:"authors,omitempty"` + Expired *bool `json:"expired,omitempty"` + Hubs []*JSONHub `json:"hubs,omitempty"` + Items []*JSONItem `json:"items,omitempty"` +} + +// JSON is used to convert a generic Feed to a JSONFeed. +type JSON struct { + *Feed +} + +// ToJSON encodes f into a JSON string. Returns an error if marshalling fails. +func (f *JSON) ToJSON() (string, error) { + return f.JSONFeed().ToJSON() +} + +// ToJSON encodes f into a JSON string. Returns an error if marshalling fails. +func (f *JSONFeed) ToJSON() (string, error) { + data, err := json.MarshalIndent(f, "", " ") + if err != nil { + return "", err + } + + return string(data), nil +} + +// JSONFeed creates a new JSONFeed with a generic Feed struct's data. +func (f *JSON) JSONFeed() *JSONFeed { + feed := &JSONFeed{ + Version: jsonFeedVersion, + Title: f.Title, + Description: f.Description, + } + + if f.Link != nil { + feed.HomePageUrl = f.Link.Href + } + if f.Author != nil { + author := &JSONAuthor{ + Name: f.Author.Name, + } + feed.Author = author + feed.Authors = []*JSONAuthor{author} + } + for _, e := range f.Items { + feed.Items = append(feed.Items, newJSONItem(e)) + } + return feed +} + +func newJSONItem(i *Item) *JSONItem { + item := &JSONItem{ + Id: i.Id, + Title: i.Title, + Summary: i.Description, + + ContentHTML: i.Content, + } + + if i.Link != nil { + item.Url = i.Link.Href + } + if i.Source != nil { + item.ExternalUrl = i.Source.Href + } + if i.Author != nil { + author := &JSONAuthor{ + Name: i.Author.Name, + } + item.Author = author + item.Authors = []*JSONAuthor{author} + } + if !i.Created.IsZero() { + item.PublishedDate = &i.Created + } + if !i.Updated.IsZero() { + item.ModifiedDate = &i.Updated + } + if i.Enclosure != nil && strings.HasPrefix(i.Enclosure.Type, "image/") { + item.Image = i.Enclosure.Url + } + + return item +} diff --git a/vendor/github.com/gorilla/feeds/rss.go b/vendor/github.com/gorilla/feeds/rss.go new file mode 100644 index 0000000..9326cef --- /dev/null +++ b/vendor/github.com/gorilla/feeds/rss.go @@ -0,0 +1,183 @@ +package feeds + +// rss support +// validation done according to spec here: +// http://cyber.law.harvard.edu/rss/rss.html + +import ( + "encoding/xml" + "fmt" + "time" +) + +// private wrapper around the RssFeed which gives us the .. xml +type RssFeedXml struct { + XMLName xml.Name `xml:"rss"` + Version string `xml:"version,attr"` + ContentNamespace string `xml:"xmlns:content,attr"` + Channel *RssFeed +} + +type RssContent struct { + XMLName xml.Name `xml:"content:encoded"` + Content string `xml:",cdata"` +} + +type RssImage struct { + XMLName xml.Name `xml:"image"` + Url string `xml:"url"` + Title string `xml:"title"` + Link string `xml:"link"` + Width int `xml:"width,omitempty"` + Height int `xml:"height,omitempty"` +} + +type RssTextInput struct { + XMLName xml.Name `xml:"textInput"` + Title string `xml:"title"` + Description string `xml:"description"` + Name string `xml:"name"` + Link string `xml:"link"` +} + +type RssFeed struct { + XMLName xml.Name `xml:"channel"` + Title string `xml:"title"` // required + Link string `xml:"link"` // required + Description string `xml:"description"` // required + Language string `xml:"language,omitempty"` + Copyright string `xml:"copyright,omitempty"` + ManagingEditor string `xml:"managingEditor,omitempty"` // Author used + WebMaster string `xml:"webMaster,omitempty"` + PubDate string `xml:"pubDate,omitempty"` // created or updated + LastBuildDate string `xml:"lastBuildDate,omitempty"` // updated used + Category string `xml:"category,omitempty"` + Generator string `xml:"generator,omitempty"` + Docs string `xml:"docs,omitempty"` + Cloud string `xml:"cloud,omitempty"` + Ttl int `xml:"ttl,omitempty"` + Rating string `xml:"rating,omitempty"` + SkipHours string `xml:"skipHours,omitempty"` + SkipDays string `xml:"skipDays,omitempty"` + Image *RssImage + TextInput *RssTextInput + Items []*RssItem `xml:"item"` +} + +type RssItem struct { + XMLName xml.Name `xml:"item"` + Title string `xml:"title"` // required + Link string `xml:"link"` // required + Description string `xml:"description"` // required + Content *RssContent + Author string `xml:"author,omitempty"` + Category string `xml:"category,omitempty"` + Comments string `xml:"comments,omitempty"` + Enclosure *RssEnclosure + Guid *RssGuid // Id used + PubDate string `xml:"pubDate,omitempty"` // created or updated + Source string `xml:"source,omitempty"` +} + +type RssEnclosure struct { + //RSS 2.0 + XMLName xml.Name `xml:"enclosure"` + Url string `xml:"url,attr"` + Length string `xml:"length,attr"` + Type string `xml:"type,attr"` +} + +type RssGuid struct { + //RSS 2.0 http://inessential.com/2002/09/01.php#a2 + XMLName xml.Name `xml:"guid"` + Id string `xml:",chardata"` + IsPermaLink string `xml:"isPermaLink,attr,omitempty"` // "true", "false", or an empty string +} + +type Rss struct { + *Feed +} + +// create a new RssItem with a generic Item struct's data +func newRssItem(i *Item) *RssItem { + item := &RssItem{ + Title: i.Title, + Description: i.Description, + PubDate: anyTimeFormat(time.RFC1123Z, i.Created, i.Updated), + } + if i.Id != "" { + item.Guid = &RssGuid{Id: i.Id, IsPermaLink: i.IsPermaLink} + } + if i.Link != nil { + item.Link = i.Link.Href + } + if len(i.Content) > 0 { + item.Content = &RssContent{Content: i.Content} + } + if i.Source != nil { + item.Source = i.Source.Href + } + + // Define a closure + if i.Enclosure != nil && i.Enclosure.Type != "" && i.Enclosure.Length != "" { + item.Enclosure = &RssEnclosure{Url: i.Enclosure.Url, Type: i.Enclosure.Type, Length: i.Enclosure.Length} + } + + if i.Author != nil { + item.Author = i.Author.Name + } + return item +} + +// create a new RssFeed with a generic Feed struct's data +func (r *Rss) RssFeed() *RssFeed { + pub := anyTimeFormat(time.RFC1123Z, r.Created, r.Updated) + build := anyTimeFormat(time.RFC1123Z, r.Updated) + author := "" + if r.Author != nil { + author = r.Author.Email + if len(r.Author.Name) > 0 { + author = fmt.Sprintf("%s (%s)", r.Author.Email, r.Author.Name) + } + } + + var image *RssImage + if r.Image != nil { + image = &RssImage{Url: r.Image.Url, Title: r.Image.Title, Link: r.Image.Link, Width: r.Image.Width, Height: r.Image.Height} + } + + var href string + if r.Link != nil { + href = r.Link.Href + } + channel := &RssFeed{ + Title: r.Title, + Link: href, + Description: r.Description, + ManagingEditor: author, + PubDate: pub, + LastBuildDate: build, + Copyright: r.Copyright, + Image: image, + } + for _, i := range r.Items { + channel.Items = append(channel.Items, newRssItem(i)) + } + return channel +} + +// FeedXml returns an XML-Ready object for an Rss object +func (r *Rss) FeedXml() interface{} { + // only generate version 2.0 feeds for now + return r.RssFeed().FeedXml() + +} + +// FeedXml returns an XML-ready object for an RssFeed object +func (r *RssFeed) FeedXml() interface{} { + return &RssFeedXml{ + Version: "2.0", + Channel: r, + ContentNamespace: "http://purl.org/rss/1.0/modules/content/", + } +} diff --git a/vendor/github.com/gorilla/feeds/test.atom b/vendor/github.com/gorilla/feeds/test.atom new file mode 100644 index 0000000..aa15214 --- /dev/null +++ b/vendor/github.com/gorilla/feeds/test.atom @@ -0,0 +1,92 @@ + + + <![CDATA[Lorem ipsum feed for an interval of 1 minutes]]> + + http://example.com/ + RSS for Node + Tue, 30 Oct 2018 23:22:37 GMT + + Tue, 30 Oct 2018 23:22:00 GMT + + 60 + + <![CDATA[Lorem ipsum 2018-10-30T23:22:00+00:00]]> + + http://example.com/test/1540941720 + http://example.com/test/1540941720 + + Tue, 30 Oct 2018 23:22:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:21:00+00:00]]> + + http://example.com/test/1540941660 + http://example.com/test/1540941660 + + Tue, 30 Oct 2018 23:21:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:20:00+00:00]]> + + http://example.com/test/1540941600 + http://example.com/test/1540941600 + + Tue, 30 Oct 2018 23:20:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:19:00+00:00]]> + + http://example.com/test/1540941540 + http://example.com/test/1540941540 + + Tue, 30 Oct 2018 23:19:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:18:00+00:00]]> + + http://example.com/test/1540941480 + http://example.com/test/1540941480 + + Tue, 30 Oct 2018 23:18:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:17:00+00:00]]> + + http://example.com/test/1540941420 + http://example.com/test/1540941420 + + Tue, 30 Oct 2018 23:17:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:16:00+00:00]]> + + http://example.com/test/1540941360 + http://example.com/test/1540941360 + + Tue, 30 Oct 2018 23:16:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:15:00+00:00]]> + + http://example.com/test/1540941300 + http://example.com/test/1540941300 + + Tue, 30 Oct 2018 23:15:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:14:00+00:00]]> + + http://example.com/test/1540941240 + http://example.com/test/1540941240 + + Tue, 30 Oct 2018 23:14:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:13:00+00:00]]> + + http://example.com/test/1540941180 + http://example.com/test/1540941180 + + Tue, 30 Oct 2018 23:13:00 GMT + + \ No newline at end of file diff --git a/vendor/github.com/gorilla/feeds/test.rss b/vendor/github.com/gorilla/feeds/test.rss new file mode 100644 index 0000000..8d912ab --- /dev/null +++ b/vendor/github.com/gorilla/feeds/test.rss @@ -0,0 +1,96 @@ + + + + <![CDATA[Lorem ipsum feed for an interval of 1 minutes]]> + + http://example.com/ + RSS for Node + Tue, 30 Oct 2018 23:22:37 GMT + + Tue, 30 Oct 2018 23:22:00 GMT + + 60 + + <![CDATA[Lorem ipsum 2018-10-30T23:22:00+00:00]]> + + http://example.com/test/1540941720 + http://example.com/test/1540941720 + + Tue, 30 Oct 2018 23:22:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:21:00+00:00]]> + + http://example.com/test/1540941660 + http://example.com/test/1540941660 + + Tue, 30 Oct 2018 23:21:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:20:00+00:00]]> + + http://example.com/test/1540941600 + http://example.com/test/1540941600 + + Tue, 30 Oct 2018 23:20:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:19:00+00:00]]> + + http://example.com/test/1540941540 + http://example.com/test/1540941540 + + Tue, 30 Oct 2018 23:19:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:18:00+00:00]]> + + http://example.com/test/1540941480 + http://example.com/test/1540941480 + + Tue, 30 Oct 2018 23:18:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:17:00+00:00]]> + + http://example.com/test/1540941420 + http://example.com/test/1540941420 + + Tue, 30 Oct 2018 23:17:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:16:00+00:00]]> + + http://example.com/test/1540941360 + http://example.com/test/1540941360 + + Tue, 30 Oct 2018 23:16:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:15:00+00:00]]> + + http://example.com/test/1540941300 + http://example.com/test/1540941300 + + Tue, 30 Oct 2018 23:15:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:14:00+00:00]]> + + http://example.com/test/1540941240 + http://example.com/test/1540941240 + + Tue, 30 Oct 2018 23:14:00 GMT + + + <![CDATA[Lorem ipsum 2018-10-30T23:13:00+00:00]]> + + http://example.com/test/1540941180 + http://example.com/test/1540941180 + + Tue, 30 Oct 2018 23:13:00 GMT + + + \ No newline at end of file diff --git a/vendor/github.com/gorilla/feeds/to-implement.md b/vendor/github.com/gorilla/feeds/to-implement.md new file mode 100644 index 0000000..45fd1e7 --- /dev/null +++ b/vendor/github.com/gorilla/feeds/to-implement.md @@ -0,0 +1,20 @@ +[Full iTunes list](https://help.apple.com/itc/podcasts_connect/#/itcb54353390) + +[Example of ideal iTunes RSS feed](https://help.apple.com/itc/podcasts_connect/#/itcbaf351599) + +``` + + + + + + + + + + + + + + +``` \ No newline at end of file diff --git a/vendor/github.com/gorilla/feeds/uuid.go b/vendor/github.com/gorilla/feeds/uuid.go new file mode 100644 index 0000000..51bbafe --- /dev/null +++ b/vendor/github.com/gorilla/feeds/uuid.go @@ -0,0 +1,27 @@ +package feeds + +// relevant bits from https://github.com/abneptis/GoUUID/blob/master/uuid.go + +import ( + "crypto/rand" + "fmt" +) + +type UUID [16]byte + +// create a new uuid v4 +func NewUUID() *UUID { + u := &UUID{} + _, err := rand.Read(u[:16]) + if err != nil { + panic(err) + } + + u[8] = (u[8] | 0x80) & 0xBf + u[6] = (u[6] | 0x40) & 0x4f + return u +} + +func (u *UUID) String() string { + return fmt.Sprintf("%x-%x-%x-%x-%x", u[:4], u[4:6], u[6:8], u[8:10], u[10:]) +} diff --git a/vendor/github.com/gosimple/slug/.gitignore b/vendor/github.com/gosimple/slug/.gitignore new file mode 100644 index 0000000..10a2442 --- /dev/null +++ b/vendor/github.com/gosimple/slug/.gitignore @@ -0,0 +1,3 @@ +_* +cover*.out +cover*.txt diff --git a/vendor/github.com/gosimple/slug/LICENSE b/vendor/github.com/gosimple/slug/LICENSE new file mode 100644 index 0000000..a612ad9 --- /dev/null +++ b/vendor/github.com/gosimple/slug/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/vendor/github.com/gosimple/slug/README.md b/vendor/github.com/gosimple/slug/README.md new file mode 100644 index 0000000..7732dbc --- /dev/null +++ b/vendor/github.com/gosimple/slug/README.md @@ -0,0 +1,98 @@ +# slug + +Package `slug` generate slug from Unicode string, URL-friendly slugify with +multiple languages support. + +[![Go Reference](https://pkg.go.dev/badge/github.com/gosimple/slug.svg)](https://pkg.go.dev/github.com/gosimple/slug) +[![Tests](https://github.com/gosimple/slug/actions/workflows/tests.yml/badge.svg)](https://github.com/gosimple/slug/actions/workflows/tests.yml) +[![codecov](https://codecov.io/gh/gosimple/slug/branch/master/graph/badge.svg?token=FT2kEZHQW7)](https://codecov.io/gh/gosimple/slug) +[![GitHub release (latest SemVer)](https://img.shields.io/github/v/release/gosimple/slug?logo=github&sort=semver)](https://github.com/gosimple/slug/releases) + +## Example + +```go +package main + +import ( + "fmt" + "github.com/gosimple/slug" +) + +func main() { + text := slug.Make("Hellö Wörld хелло ворлд") + fmt.Println(text) // Will print: "hello-world-khello-vorld" + + someText := slug.Make("影師") + fmt.Println(someText) // Will print: "ying-shi" + + enText := slug.MakeLang("This & that", "en") + fmt.Println(enText) // Will print: "this-and-that" + + deText := slug.MakeLang("Diese & Dass", "de") + fmt.Println(deText) // Will print: "diese-und-dass" + + slug.Lowercase = false // Keep uppercase characters + deUppercaseText := slug.MakeLang("Diese & Dass", "de") + fmt.Println(deUppercaseText) // Will print: "Diese-und-Dass" + + slug.CustomSub = map[string]string{ + "water": "sand", + } + textSub := slug.Make("water is hot") + fmt.Println(textSub) // Will print: "sand-is-hot" +} +``` + +## Design + +This library will always returns clean output from any Unicode string +containing only the following ASCII characters: + +* numbers: `0-9` +* small letters: `a-z` +* big letters: `A-Z` (only if you set `Lowercase` to `false`) +* minus sign: `-` +* underscore: `_` + +Minus sign and underscore characters will never appear at the beginning or +the end of the returned string. + +Thanks to context-insensitive transliteration of Unicode characters to ASCII +output returned string is safe for URL slugs and filenames. + +## Requests or bugs? + + + +If your language is missing you could add it in `languages_substitution.go` +file. + +In case of missing proper Unicode characters transliteration to ASCII you could +add them to underlying library: +. + +## Installation + +```shell +go get -u github.com/gosimple/slug +``` + +## Benchmarking + +```shell +go test -run=NONE -bench=. -benchmem -count=6 ./... > old.txt +# make changes +go test -run=NONE -bench=. -benchmem -count=6 ./... > new.txt + +go install golang.org/x/perf/cmd/benchstat@latest + +benchstat old.txt new.txt +``` + +## License + +The source files are distributed under the +[Mozilla Public License, version 2.0](http://mozilla.org/MPL/2.0/), +unless otherwise noted. +Please read the [FAQ](http://www.mozilla.org/MPL/2.0/FAQ.html) +if you have further questions regarding the license. diff --git a/vendor/github.com/gosimple/slug/codecov.yml b/vendor/github.com/gosimple/slug/codecov.yml new file mode 100644 index 0000000..bd46b3e --- /dev/null +++ b/vendor/github.com/gosimple/slug/codecov.yml @@ -0,0 +1,4 @@ +comment: + layout: "diff, files" + behavior: default + require_changes: false # if true: only post the comment if coverage changes diff --git a/vendor/github.com/gosimple/slug/doc.go b/vendor/github.com/gosimple/slug/doc.go new file mode 100644 index 0000000..f6f764e --- /dev/null +++ b/vendor/github.com/gosimple/slug/doc.go @@ -0,0 +1,47 @@ +// Copyright 2013 by Dobrosław Żybort. All rights reserved. +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +/* +Package slug generate slug from unicode string, URL-friendly slugify with +multiple languages support. + +Example: + + package main + + import( + "github.com/gosimple/slug" + "fmt" + ) + + func main () { + text := slug.Make("Hellö Wörld хелло ворлд") + fmt.Println(text) // Will print: "hello-world-khello-vorld" + + someText := slug.Make("影師") + fmt.Println(someText) // Will print: "ying-shi" + + enText := slug.MakeLang("This & that", "en") + fmt.Println(enText) // Will print: "this-and-that" + + deText := slug.MakeLang("Diese & Dass", "de") + fmt.Println(deText) // Will print: "diese-und-dass" + + slug.Lowercase = false // Keep uppercase characters + deUppercaseText := slug.MakeLang("Diese & Dass", "de") + fmt.Println(deUppercaseText) // Will print: "Diese-und-Dass" + + slug.CustomSub = map[string]string{ + "water": "sand", + } + textSub := slug.Make("water is hot") + fmt.Println(textSub) // Will print: "sand-is-hot" + } + +Requests or bugs? + +https://github.com/gosimple/slug/issues +*/ +package slug diff --git a/vendor/github.com/gosimple/slug/languages_substitution.go b/vendor/github.com/gosimple/slug/languages_substitution.go new file mode 100644 index 0000000..7661d6a --- /dev/null +++ b/vendor/github.com/gosimple/slug/languages_substitution.go @@ -0,0 +1,313 @@ +// Copyright 2013 by Dobrosław Żybort. All rights reserved. +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package slug + +func init() { + // Merge language subs with the default one. + // TODO: Find better way so all langs are merged automatically and better + // tested. + for _, sub := range []*map[rune]string{ + &bgSub, + &csSub, + &deSub, + &enSub, + &esSub, + &fiSub, + &frSub, + &grSub, + &huSub, + &idSub, + &itSub, + &kkSub, + &nbSub, + &nlSub, + &nnSub, + &plSub, + &ptSub, + &roSub, + &slSub, + &svSub, + &trSub, + } { + for key, value := range defaultSub { + (*sub)[key] = value + } + } +} + +var defaultSub = map[rune]string{ + '"': "", + '\'': "", + '’': "", + '‒': "-", // figure dash + '–': "-", // en dash + '—': "-", // em dash + '―': "-", // horizontal bar +} + +var csSub = map[rune]string{ + '&': "a", + '@': "zavinac", +} + +var deSub = map[rune]string{ + '&': "und", + '@': "an", + 'ä': "ae", + 'Ä': "Ae", + 'ö': "oe", + 'Ö': "Oe", + 'ü': "ue", + 'Ü': "Ue", +} + +var enSub = map[rune]string{ + '&': "and", + '@': "at", +} + +var esSub = map[rune]string{ + '&': "y", + '@': "en", +} + +var fiSub = map[rune]string{ + '&': "ja", + '@': "at", +} + +var frSub = map[rune]string{ + '&': "et", + '@': "arobase", +} + +var grSub = map[rune]string{ + '&': "kai", + 'β': "v", + 'Β': "V", + 'η': "i", + 'Η': "I", + 'ή': "i", + 'Ή': "I", + 'ι': "i", + 'Ι': "I", + 'ί': "i", + 'Ί': "I", + 'ϊ': "i", + 'Ϊ': "I", + 'ΐ': "i", + 'ξ': "x", + 'Ξ': "X", + 'υ': "y", + 'Υ': "Y", + 'ύ': "y", + 'Ύ': "Y", + 'ϋ': "y", + 'Ϋ': "Y", + 'ΰ': "y", + 'φ': "f", + 'Φ': "F", + 'χ': "ch", + 'Χ': "Ch", + 'ω': "o", + 'Ω': "O", + 'ώ': "o", + 'Ώ': "O", +} + +var huSub = map[rune]string{ + 'á': "a", + 'Á': "A", + 'é': "e", + 'É': "E", + 'í': "i", + 'Í': "I", + 'ó': "o", + 'Ó': "O", + 'ö': "o", + 'Ö': "O", + 'ő': "o", + 'Ő': "O", + 'ú': "u", + 'Ú': "U", + 'ü': "u", + 'Ü': "U", + 'ű': "u", + 'Ű': "U", +} + +var idSub = map[rune]string{ + '&': "dan", +} + +var itSub = map[rune]string{ + '&': "e", + '@': "chiocciola", +} + +var kkSub = map[rune]string{ + '&': "jane", + 'ә': "a", + 'ғ': "g", + 'қ': "q", + 'ң': "n", + 'ө': "o", + 'ұ': "u", + 'Ә': "A", + 'Ғ': "G", + 'Қ': "Q", + 'Ң': "N", + 'Ө': "O", + 'Ұ': "U", +} + +var nbSub = map[rune]string{ + '&': "og", + '@': "at", + 'æ': "ae", + 'ø': "oe", + 'å': "aa", + 'Æ': "Ae", + 'Ø': "Oe", + 'Å': "Aa", +} + +// Norwegian Nynorsk has the same rules +var nnSub = nbSub + +var nlSub = map[rune]string{ + '&': "en", + '@': "at", +} + +var plSub = map[rune]string{ + '&': "i", + '@': "na", +} + +var ptSub = map[rune]string{ + '&': "e", + '@': "em", + 'á': "a", + 'Á': "A", + 'é': "e", + 'É': "E", + 'í': "i", + 'Í': "I", + 'ó': "o", + 'Ó': "O", + 'ö': "o", + 'Ö': "O", + 'ú': "u", + 'Ú': "U", + 'ü': "u", + 'Ü': "U", +} + +var roSub = map[rune]string{ + '&': "si", + 'Ă': "A", + 'ă': "a", + 'Â': "A", + 'â': "a", + 'Î': "I", + 'î': "i", + 'Ș': "S", + 'ș': "s", + 'Ț': "T", + 'ț': "t", +} + +var slSub = map[rune]string{ + '&': "in", + 'Đ': "DZ", + 'đ': "dz", +} + +var svSub = map[rune]string{ + '&': "och", + '@': "snabel a", +} + +var trSub = map[rune]string{ + '&': "ve", + '@': "et", + 'ş': "s", + 'Ş': "S", + 'ü': "u", + 'Ü': "U", + 'ö': "o", + 'Ö': "O", + 'İ': "I", + 'ı': "i", + 'ğ': "g", + 'Ğ': "G", + 'ç': "c", + 'Ç': "C", +} + +var bgSub = map[rune]string{ + 'А': "A", + 'Б': "B", + 'В': "V", + 'Г': "G", + 'Д': "D", + 'Е': "E", + 'Ж': "Zh", + 'З': "Z", + 'И': "I", + 'Й': "Y", + 'К': "K", + 'Л': "L", + 'М': "M", + 'Н': "N", + 'О': "O", + 'П': "P", + 'Р': "R", + 'С': "S", + 'Т': "T", + 'У': "U", + 'Ф': "F", + 'Х': "H", + 'Ц': "Ts", + 'Ч': "Ch", + 'Ш': "Sh", + 'Щ': "Sht", + 'Ъ': "A", + 'Ь': "Y", + 'Ю': "Yu", + 'Я': "Ya", + 'а': "a", + 'б': "b", + 'в': "v", + 'г': "g", + 'д': "d", + 'е': "e", + 'ж': "zh", + 'з': "z", + 'и': "i", + 'й': "y", + 'к': "k", + 'л': "l", + 'м': "m", + 'н': "n", + 'о': "o", + 'п': "p", + 'р': "r", + 'с': "s", + 'т': "t", + 'у': "u", + 'ф': "f", + 'х': "h", + 'ц': "ts", + 'ч': "ch", + 'ш': "sh", + 'щ': "sht", + 'ъ': "a", + 'ь': "y", + 'ю': "yu", + 'я': "ya", +} diff --git a/vendor/github.com/gosimple/slug/slug.go b/vendor/github.com/gosimple/slug/slug.go new file mode 100644 index 0000000..7d9c13a --- /dev/null +++ b/vendor/github.com/gosimple/slug/slug.go @@ -0,0 +1,213 @@ +// Copyright 2013 by Dobrosław Żybort. All rights reserved. +// This Source Code Form is subject to the terms of the Mozilla Public +// License, v. 2.0. If a copy of the MPL was not distributed with this +// file, You can obtain one at http://mozilla.org/MPL/2.0/. + +package slug + +import ( + "bytes" + "regexp" + "sort" + "strconv" + "strings" + "time" + + "github.com/gosimple/unidecode" +) + +var ( + // CustomSub stores custom substitution map + CustomSub map[string]string + // CustomRuneSub stores custom rune substitution map + CustomRuneSub map[rune]string + + // MaxLength stores maximum slug length. + // By default slugs aren't shortened. + // If MaxLength is smaller than length of the first word, then returned + // slug will contain only substring from the first word truncated + // after MaxLength. + MaxLength int + + // EnableSmartTruncate defines if cutting with MaxLength is smart. + // Smart algorithm will cat slug after full word. + // Default is true. + EnableSmartTruncate = true + + // Lowercase defines if the resulting slug is transformed to lowercase. + // Default is true. + Lowercase = true + + // Append timestamp to the end in order to make slug unique + // Default is false + AppendTimestamp = false + + regexpNonAuthorizedChars = regexp.MustCompile("[^a-zA-Z0-9-_]") + regexpMultipleDashes = regexp.MustCompile("-+") +) + +//============================================================================= + +// Make returns slug generated from provided string. Will use "en" as language +// substitution. +func Make(s string) (slug string) { + return MakeLang(s, "en") +} + +// MakeLang returns slug generated from provided string and will use provided +// language for chars substitution. +func MakeLang(s string, lang string) (slug string) { + slug = strings.TrimSpace(s) + + // Custom substitutions + // Always substitute runes first + slug = SubstituteRune(slug, CustomRuneSub) + slug = Substitute(slug, CustomSub) + + // Process string with selected substitution language. + // Catch ISO 3166-1, ISO 639-1:2002 and ISO 639-3:2007. + switch strings.ToLower(lang) { + case "bg", "bgr": + slug = SubstituteRune(slug, bgSub) + case "cs", "ces": + slug = SubstituteRune(slug, csSub) + case "de", "deu": + slug = SubstituteRune(slug, deSub) + case "en", "eng": + slug = SubstituteRune(slug, enSub) + case "es", "spa": + slug = SubstituteRune(slug, esSub) + case "fi", "fin": + slug = SubstituteRune(slug, fiSub) + case "fr", "fra": + slug = SubstituteRune(slug, frSub) + case "gr", "el", "ell": + slug = SubstituteRune(slug, grSub) + case "hu", "hun": + slug = SubstituteRune(slug, huSub) + case "id", "idn", "ind": + slug = SubstituteRune(slug, idSub) + case "it", "ita": + slug = SubstituteRune(slug, itSub) + case "kz", "kk", "kaz": + slug = SubstituteRune(slug, kkSub) + case "nb", "nob": + slug = SubstituteRune(slug, nbSub) + case "nl", "nld": + slug = SubstituteRune(slug, nlSub) + case "nn", "nno": + slug = SubstituteRune(slug, nnSub) + case "pl", "pol": + slug = SubstituteRune(slug, plSub) + case "pt", "prt", "pt-br", "br", "bra", "por": + slug = SubstituteRune(slug, ptSub) + case "ro", "rou": + slug = SubstituteRune(slug, roSub) + case "sl", "slv": + slug = SubstituteRune(slug, slSub) + case "sv", "swe": + slug = SubstituteRune(slug, svSub) + case "tr", "tur": + slug = SubstituteRune(slug, trSub) + default: // fallback to "en" if lang not found + slug = SubstituteRune(slug, enSub) + } + + // Process all non ASCII symbols + slug = unidecode.Unidecode(slug) + + if Lowercase { + slug = strings.ToLower(slug) + } + + if !EnableSmartTruncate && len(slug) >= MaxLength { + slug = slug[:MaxLength] + } + + // Process all remaining symbols + slug = regexpNonAuthorizedChars.ReplaceAllString(slug, "-") + slug = regexpMultipleDashes.ReplaceAllString(slug, "-") + slug = strings.Trim(slug, "-_") + + if MaxLength > 0 && EnableSmartTruncate { + slug = smartTruncate(slug) + } + + if AppendTimestamp { + slug = slug + "-" + timestamp() + } + + return slug +} + +// Substitute returns string with superseded all substrings from +// provided substitution map. Substitution map will be applied in alphabetic +// order. Many passes, on one substitution another one could apply. +func Substitute(s string, sub map[string]string) (buf string) { + buf = s + var keys []string + for k := range sub { + keys = append(keys, k) + } + sort.Strings(keys) + + for _, key := range keys { + buf = strings.Replace(buf, key, sub[key], -1) + } + return +} + +// SubstituteRune substitutes string chars with provided rune +// substitution map. One pass. +func SubstituteRune(s string, sub map[rune]string) string { + var buf bytes.Buffer + for _, c := range s { + if d, ok := sub[c]; ok { + buf.WriteString(d) + } else { + buf.WriteRune(c) + } + } + return buf.String() +} + +func smartTruncate(text string) string { + if len(text) <= MaxLength { + return text + } + + // If slug is too long, we need to find the last '-' before MaxLength, and + // we cut there. + // If we don't find any, we have only one word, and we cut at MaxLength. + for i := MaxLength; i >= 0; i-- { + if text[i] == '-' { + return text[:i] + } + } + return text[:MaxLength] +} + +// timestamp returns current timestamp as string +func timestamp() string { + return strconv.FormatInt(time.Now().Unix(), 10) +} + +// IsSlug returns True if provided text does not contain white characters, +// punctuation, all letters are lower case and only from ASCII range. +// It could contain `-` and `_` but not at the beginning or end of the text. +// It should be in range of the MaxLength var if specified. +// All output from slug.Make(text) should pass this test. +func IsSlug(text string) bool { + if text == "" || + (MaxLength > 0 && len(text) > MaxLength) || + text[0] == '-' || text[0] == '_' || + text[len(text)-1] == '-' || text[len(text)-1] == '_' { + return false + } + for _, c := range text { + if (c < 'a' || c > 'z') && c != '-' && c != '_' && (c < '0' || c > '9') { + return false + } + } + return true +} diff --git a/vendor/github.com/gosimple/unidecode/.gitignore b/vendor/github.com/gosimple/unidecode/.gitignore new file mode 100644 index 0000000..8365624 --- /dev/null +++ b/vendor/github.com/gosimple/unidecode/.gitignore @@ -0,0 +1,23 @@ +# Compiled Object files, Static and Dynamic libs (Shared Objects) +*.o +*.a +*.so + +# Folders +_obj +_test + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +_testmain.go + +*.exe +*.test diff --git a/vendor/github.com/gosimple/unidecode/LICENSE b/vendor/github.com/gosimple/unidecode/LICENSE new file mode 100644 index 0000000..50802ea --- /dev/null +++ b/vendor/github.com/gosimple/unidecode/LICENSE @@ -0,0 +1,203 @@ +Copyright 2014 Rainy Cape S.L. + +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright {yyyy} {name of copyright owner} + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/gosimple/unidecode/README.md b/vendor/github.com/gosimple/unidecode/README.md new file mode 100644 index 0000000..3f95400 --- /dev/null +++ b/vendor/github.com/gosimple/unidecode/README.md @@ -0,0 +1,58 @@ +# unidecode + +[![Go Reference](https://pkg.go.dev/badge/github.com/gosimple/unidecode.svg)](https://pkg.go.dev/github.com/gosimple/unidecode) +[![Tests](https://github.com/gosimple/unidecode/actions/workflows/tests.yml/badge.svg)](https://github.com/gosimple/unidecode/actions/workflows/tests.yml) + +Unicode transliterator in Golang - Replaces non-ASCII characters with their +ASCII approximations. + +Fork of https://github.com/rainycape/unidecode + +## Example + +```go +package main + +import ( + "fmt" + + "github.com/gosimple/unidecode" +) + +func main() { + decoded := unidecode.Unidecode("Łódź") + fmt.Println(decoded) + // Output: Lodz +} +``` + +### Requests or bugs? + + + +## Installation + +```shell +go get -u github.com/gosimple/unidecode +``` + +## Benchmark + +```shell +go test -run=NONE -bench=. -benchmem -count=6 ./... > old.txt +# make changes +go test -run=NONE -bench=. -benchmem -count=6 ./... > new.txt + +go install golang.org/x/perf/cmd/benchstat@latest + +benchstat old.txt new.txt +``` + +## Add new characters + +1. Edit `table.txt` file. +2. Rebuild `table.go` file: + + ```go + go run ./make_table.go + ``` diff --git a/vendor/github.com/gosimple/unidecode/decode.go b/vendor/github.com/gosimple/unidecode/decode.go new file mode 100644 index 0000000..f99e0bb --- /dev/null +++ b/vendor/github.com/gosimple/unidecode/decode.go @@ -0,0 +1,44 @@ +package unidecode + +import ( + "compress/zlib" + "io" + "strings" +) + +const ( + dummyLenght = byte(0xff) +) + +var ( + transliterations [65536][]rune + transCount = rune(len(transliterations)) +) + +func decodeTransliterations() { + r, err := zlib.NewReader(strings.NewReader(tableData)) + if err != nil { + panic(err) + } + defer r.Close() + b := make([]byte, 0, 13) // 13 = longest transliteration, adjust if needed + lenB := b[:1] + chr := uint16(0xffff) // char counter, rely on overflow on first pass + for { + chr++ + if _, err := io.ReadFull(r, lenB); err != nil { + if err == io.EOF { + break + } + panic(err) + } + if lenB[0] == dummyLenght { + continue + } + b = b[:lenB[0]] // resize, preserving allocation + if _, err := io.ReadFull(r, b); err != nil { + panic(err) + } + transliterations[int(chr)] = []rune(string(b)) + } +} diff --git a/vendor/github.com/gosimple/unidecode/make_table.go b/vendor/github.com/gosimple/unidecode/make_table.go new file mode 100644 index 0000000..41a52e5 --- /dev/null +++ b/vendor/github.com/gosimple/unidecode/make_table.go @@ -0,0 +1,80 @@ +//go:build none +// +build none + +package main + +import ( + "bytes" + "compress/zlib" + "encoding/binary" + "fmt" + "go/format" + "io/ioutil" + "strconv" + "strings" +) + +func main() { + data, err := ioutil.ReadFile("table.txt") + if err != nil { + panic(err) + } + var buf bytes.Buffer + previousVal := int64(-1) + for _, line := range strings.Split(string(data), "\n") { + if strings.HasPrefix(line, "/*") || line == "" { + continue + } + sep := strings.IndexByte(line, ':') + if sep == -1 { + panic(line) + } + val, err := strconv.ParseInt(line[:sep], 0, 32) + if err != nil { + panic(err) + } + + if previousVal+1 != val { + rangechars := 0 + for i := previousVal + 1; i <= val-1; i++ { + if err := binary.Write(&buf, binary.LittleEndian, uint8(0xff)); err != nil { + panic(err) + } + rangechars++ + } + fmt.Printf("Filled dummy range: 0x%04x - 0x%04x (%4d chars)\n", previousVal+1, val-1, rangechars) + } + + s, err := strconv.Unquote(line[sep+2:]) + if err != nil { + panic(err) + } + if err := binary.Write(&buf, binary.LittleEndian, uint8(len(s))); err != nil { + panic(err) + } + previousVal = val + buf.WriteString(s) + } + var cbuf bytes.Buffer + w, err := zlib.NewWriterLevel(&cbuf, zlib.BestCompression) + if err != nil { + panic(err) + } + if _, err := w.Write(buf.Bytes()); err != nil { + panic(err) + } + if err := w.Close(); err != nil { + panic(err) + } + buf.Reset() + buf.WriteString("package unidecode\n") + buf.WriteString("// AUTOGENERATED - DO NOT EDIT!\n\n") + fmt.Fprintf(&buf, "const tableData = %q;\n", cbuf.String()) + dst, err := format.Source(buf.Bytes()) + if err != nil { + panic(err) + } + if err := ioutil.WriteFile("table.go", dst, 0644); err != nil { + panic(err) + } +} diff --git a/vendor/github.com/gosimple/unidecode/table.go b/vendor/github.com/gosimple/unidecode/table.go new file mode 100644 index 0000000..8f9441e --- /dev/null +++ b/vendor/github.com/gosimple/unidecode/table.go @@ -0,0 +1,5 @@ +package unidecode + +// AUTOGENERATED - DO NOT EDIT! + +const tableData = "x\xda\xec\xbd\t\u007f\x1bǕ/\xaa\xaajHN\xe6\xed\xfb\xfe\x10\xdf;C\xc92)\x91\x94,%\x93\xd8&\x00\x11\x10\xb1\b$ \x11\x80c\x87E\xa2\x84.bi\x12@\v\x02\xaf\xaf\xdfG\xcf\xfb\x9d\xad\xba)\xc9\x13;v\x96;!\xc1.l\x8d\xee\xea\xaaS\xe7\xfc\xcf\xda\xea\x96RJ+\xa3\"UP\xb7\xd5\x1d\xf5\x91\xfa\x85\xfa\xa5\xfa'\xf5_\xa9\xffZ\xfd7\xea\xbfU\xff\x9d\xfa\xef\xd5\xff\xa0\xfeG\xf5?\xa9\xffY\xfd/\xea\u007fU\xff\x9b\xfa\xdf\xd5\xff\xa1\xfeO\xf5\u007f\xa9\xff[\xfd?\xea\xffUE\xf5+\xf5\xb1\xfa\x0f\xea?\xaa\u007fV\xff\xa26\xd4]uO}\xa2\xee\xabOզ\xdaR\x0f\xd4C\xb5\xadvԮz\xa4\x1e\xab\xcf\xd4\x13\xf5T\xfdZ\xfdF\xfd\xab\xfa\xad\xfa\x9d\xfa\\}\xa1\xbeT{\xaa\xa4ʪ\xa2\x9e\xa9}UU5\xf5\\\x1d\xa8\xbaj\xa8\xa6j\xa9\x17\xaa\xad\x0eՑꨮz\xa9^\xa9c\xd5S}5P_\xab߫\xaf\xd57\xea\x0f\xeaDYu\xaa\xce\xd4P9\xf5Z\x8dT\xac\xbc:Wc5QS5S\x89\xbaP\x97j\xae\x16j\xa9R\xf5F\xad\xd4[\xb5VW\xea?\xa9o\xd5\u007fVߩ\xff\xef֟\xf8\x83\xeb\xd3\xe5\a\xba\xdd\xd1\xff\xf1\v\xdd\xff\x9d\xfaVw:\xeacs\xf7잲\xfa\xb7\xbfU\xbf\xbae\xee\xce\xef\xa9M3t#}\u007f\x13\xafuC\xa5\xaa\xad>Q\x9f\xaam\x95\xe8\xcf?7\xdb\x0f\x1e\x99\xed\a;f\xf7\xc1#\xf5\x85\xda\xcb\x1ez\xef\x99*\xabg\xfcxΏ\n^\xb9<ު\x17\xea%?\xfa\xba\x1b\xeb\xc5B\xd9졭Sg\xca\xf1\xc3\xf3c\x88\x17/\x8f\a*Q)?\xd6z\x19\xab\xb5\xdaS6leuvm\xab\xa8!nϔ{o\xab\xaaѵ\xad\xa6bܞ+\xff\ue99f\x1fh\u007f\xae\x0eԹ\xaa\xab\xb1\x1a\xab\x86\x9a\xbc\xb7\xb5\xd4L6\xbd1ӳ\x91nU\xd5\v\x95Ȧ_<ӉSGj\x1e\xb6\x8eZ\\ۺj\x19\xb6\x97*\xfd\xe0v\xacV\xaa\xaf\xd6HS\x9f\xa9\x17|\xf1\x15\xbc\xf8\xa1\xdaU_\"Q\xbeVUU\xd5\xf1\x1b\x9c\x9b:\xd2\xd6D\x1dc\xaf_P\x17\x9f\xebī\xb6\xba\xd0\xfd#\xb5\xa3vt\xa7\xa6\x17q\xe8\x15\x9c\xbf\xaf^\xe1\xf9\a\xeaJ\x0fj\xf0\u007f\x15\xeb\xabX\xed\xa8\xc7\xea\xb1^.\xd4J}\xab\xbf\xfdV\u007f\xfb;\xf5+]\x19\xe8ʕ\x1e^\xe9Ɓn\x9c\xebɹn\x1d\xe8ֹ\x9e\x9d\xe3t\xc1\xf0\xc2\xe8|\xe8:\xbf\x94I\xd5{π2d\x9a\xa0\xdb2\xa2xru\x1eN\x03;\xe8\xda+\xbe\xa4췰\xbf\x90\x88L\xbfL\xaf̐̉\x9c_\xe6\x03\xae\x15Ȣ\xa5\x86\xfa\xc5K\x9d\xa48\xder\xa4\xdc\xfc\xe2\x06{O\xd4L-չ\x1e\x9e\xea\xcb\v\xb5\x87s\xd1P]\xb5PW\xe6\xab/\xbe\x86M\x95\xd4K\xf5\r\x1e\x01\x88\xeaR]\xe2\xb9\xe1״\x18NU\x82\xac\x00\x98\xc1\x97\xea˰*\xceՈ\x1f0\x1312\t\xb8\x0e\x98ȉ\x9e\fԱ:F~\x01\x0f 9\xf5B\xed\xab\xf9\xb5Ǒ:Bz;W\x1d\xd5QKd(/\xd5\x1b\xf5\x8dZ!]]!M\r\xd4\x17\xf8(\xab/UI=C\x86v\x8e\xa4\u007f\t\x9fä\x0e\a\xd0.\x17z\xd9\xd1˲~\xddғ\x85\x9e\\\xe9\xe3c\xfd\xf5\xd7ع\xb1\x8a\xd5y81\x1c~C}\xacNԆ:\xc1\x16N\xf0[\xf5\xb9\xfaF\xbd\xc2mCm\xaa\a\xea\xf7\xeaS\xf5\a\xf5{\xf5@\xfdFm\xe1~\xf0\xdd}\xb5\xa9^\xa9-\xf5\xa5\xfaT}\xa7>VG\xaa\xa7\xaaj\xa2\x16\xea\xad\xfaB\x98\xdc+\xf5;\xf5\xb1\x8c\xf2\x9f\xbb\xfd\xf1\xd6\xcf\xfb\xf7S\xfb\x03\x1b\\\x9cE\xb6\b\f\x10H#VS5WK\xf5F\xbd}wg\xb5\xa1>}\xef\x00\xd7v\xf8\xe2\xc3\xe7P{\xea_\x89\x81\xe3^/\xb0}\xa9^\xa8\xe7(ܪ(\xdc\x06\xea\x99\xee\xc6\xc8AP\xb6\xe9\xfa\x02\xc5\xdb\x11\xee\x8d\x02N\xb7c]\x8fu{\x81?}\x89=\x87\xbe\xa7H\xda#$\xeb+倁\xfb \xe2ޢ\x90\x03\x11\x87BN_\xc4z\x1c닅J\xf0\x97p\xdd\t\x9e\xe2\x14~\x87bD_\xc4\xeaB\xfd\x8b\\\x80\xee,\xf5b\x89,\xf2P]\xea΅^\\\xe8N\f,l_\xbd\x86\x1e\x8d\x89\xc7\x03\x9f(\xd7\xf4Y\xac\xbb^/\xa1\vsu\xa6\xce\u007f\x14\x91\xe8\xe7N?Ot\xe5\\W\xcf\xe1u\xe5J=\xd7}\xaf\x90ӵ\xceMw\x11\xeb\xfa9\\\xbe\xa9\\\xc58~\xafh\x04\xf5 V\x03\xe6\xc1\x19:\x10l\xb0\x0f\xfd\xec.t9֝8\xea\xc4g\xb1\xdaP}\xb5\xa1\x9e\xe9\xe7\xa9~N\xdc\xe1\r\r\"\xb0\xbf+d\x01y\x9c (\xe15\x8c\xdfr\x01\x97\xb9\x88\xa3\x05\x1d\t\x96\xa0\xd3>\xd5\xdej\xef\xb4O\xf4\xf0\\\x8f\xce\xe1\xf5\xf0Jy\xbd\xf6\n\x19\xf5\xec\xdc,\x17\xb1\x1e\x9f\xc3\xe0\x9b\xe1U\x8c\xfc\xed\x99rp\xad\xde\xe5^\x01'~\x9e\xc0\x91\xea\v=^\xe8\xf6\x02&\r\xa4\rɩ5J\xeb \x05\x97:Y\xc2\xf4\xdc\xfed\xfb\xe1Ç\x9f\xc8\x02\xf9\x05\xbc݂O\xfe\xe9\x93mx\xc6ׁ`?V\x1f\xeb\xa3\r=\xdf\xd0\xd5\r=\xba֚A\xbca\xae\xe2\r=\xd8\xd0W\x1b\xba\xbe\xa1\xc7\x1fj[\x1bz\xb6\xa1[#\x90\xcc\xed\r}\xb1A\xf4\xa0;\x1bz\xb1\xa1\xbb\x1bz\xb9\x01\x8c_\xbf\xdc\xd0醩\xc7\x1bf\x1co\x98\xeera\x96˅)\xc7\x1b\xe6,ސg\xa0\"\x98\xa1\xb38|r\xa2\a \b\xe9l\x81\"\xf1\xac\xe1\x1d\xfd\"\xbf\x10\xad\b9\xa7\xad\f\xe8\x97\xf4\xa0㡠%\xe9\xf6\xae\xc8\xe2\tɋ\xcd\xebg\x80\xc1\xff \xed\xfe\x1c\x1c\xe9o\xbd]\xe7H\xc0\x93`\x06\xd4sՠ\x05\xa4\xea\xaa\x06\x03W\x85\x89RM\xd5W-݉\xd5\vS\x8eOT[\x1d\xe8\xa3Xu\xd4+\xd5UG\xa6\xbb8QǺ}\xa2\xeb' 0\xc3)~\xab6\xd4\x03\xf5+\xf5\xa9\xfaBm\xf1|\xe5\xf8\x17p\xb0\x13\x98#\xaf&\xb4\xd6@\xe2\x81P\x1c\xc14\xa8\xa9Z\xab\x19p\x9fĜ\xc5'\xeaB\x9d\xeby\xac\x16\xea\x8dZ\xaa\xb9Y.N\xd4J_\x9c\xe8\xf1\x89J\xd4k\xedVx\x86-\xb5\xf9o\b\x81\xf7%\xcbu\x94\x0fP\xc1\"\xc7t\xf8\xca2\xcfL\xd5\x06\xef\xf1\x9b\x1f%\x8fn\xf1\xf5\xc6ꍺ\x02\xf6\xb9Tk\x84\xc0\xc0n\bh,\x14\\\xda\x05\x02\x81\x05()\b\x19?8e\xaft\xb2V\x1e@\xc0\x0ff\xb3?\x9a,>\xfd\xb3\t\xea_\xdf\x17\x91 t7\xf4j\xe3\x96^o\xc0P|\xa9\x96 |\xceU\r\xc6b\xa8\x87\xb1\x9a\x03\xfc\x86K\uea0aꪁ:Q\xd5\x0f\x8f\xe4ku\x19\xf8t\xacV\xea;\xb5\xd6v\xa6ә\xf63eU\xaa\xbc:\xbeuKm\xa8\x8d\x1f\xdc\xe5\x0f)\xa5\xff\xac\xb6ԧ\xea\x93\xec\xbc\x1b\xf0\xb8\xa56\xf4\xc6Jo\xa4zc\xad\x97K\xb3\\\xc6\xea\x14Q\xfd\x85^\xc6\xfa4\xd6\x1b\xb1\xaa\xe9\xd9Z\x0f\xd7\nD\xa39;\x8b\xf5\x10\xf4\xa7\x8a\xae,\xf506\xc3a\xac\xe8\xfd\x9cP\xa4<\xceQxɣ\xab\xab5\xb5\x8f\x8f7\xea5\x88\xe8Cu\b\xc35VuU\xd73\xc0\xf0\x80\xe5[\xa0\x8d\xa8\xaaj\xf0\xa3\x15\x1e\xc8Z\xe35*d_\xaac\x9d8МR\xbd\x86\u007fu\xacޠ\\\xe9\xe3h\xad\xf5zCmi\xeb\xb2\x15\xf0\x1fr\xeb\xe1\x9b<\x00\xfb\xd0p\x01O\xa8\xe8j\xac\xfeEߟ\xfeQ?x\xa0\x1e\xa8OկԯԦ\xfaT}\xaa\xfeU}\xa1\xbeS\xffI\xfdg\x1a\xd1[j\x83\x96\xc4\b\xd19L㕪!\x8a^\xebu\x1c\xe6w!\xcbBu>\xb8$\x18\xe7\x93\xf6L\xd8\xfe\x19\nr\xd2m\x93[\x80{o\xddR=u\x88\xd2\xe0[u\xff\xdf\x03\xd3~\x8f\x80\x11\x9c\xcd\xd4\\\x9d\xaa\x86\x1a\xab\r\xf5FM\xd5k=\x8ca\x99M\xd4H\xcf\xd6j\xa1\x86\xea\n\x19\x0fpгX/\x97:Fٽ\x8c\xd5\x15\x1c\x00\xf6X\xaa+u\xa2G\xb1\xbaT+e\xb5\xb5\xcak\aT\x93$\xcai\xb7V\x89N\xec\xad\u007f\x8f\x83\xf8\xd7\xd8\xfe\xf8\x8f\xfe\x87\xd4\n̩F˗\b\xcc{\x95\xea4UG\xaa\xa1]\v\x11\x81\xf5:i\xa9D%ڦj\f|o\x04p`6Rg\x80\t\xce\xf5y\f\\\x96X\xb0\x1e\x0e\x81\xad\xeaٌ\x04\vJ\x94\x99\x99\xcdf\xea\x028\xe7\xa9>%\x181\a\x9e;Q\x133\x99L\xd4\x1b\xbd@\xe3\xd9B\xc59\x95o\xe3\x9d.飣\x0f\xf5)[\x02{/\x9b(\x1bN\xae\v\x1cui\xc6qlFq\xac\xae\xa2!\xf4n\x1e\xab\xd7z\xbd\x86\x036\x1a\xaa\xa1\x1b\rS|P\x8c\x8a\x0f\x1e\x14?(\x81\xb6~2[\xf8\xfe\x81\xd6GGa/\xb8\xb0\xf0槌7\xfc\xfe\x9d\xf1\xc6\xcf&\xf9N}h\xd0\xf1\xf3\x1f\xd1\xc1\x1f\xc4\u007f\xdeg\xf5z>\xd7s<\xed;\xd3\xf0o\t\xb6\xf9\x86\x9e\x9f\xe8\xa3\x05\xfco?\xd0;\x0f\xf4\xee\x03\xfd\xe8\xc1\x9d\xe2vq\xb3\xb8\xfd\xc0<\xd8\xfe\xec\xd6\xf7\xc2-\xd5\xca$յ\v|\xafk.\u007f\x91:\xf9\xb9\xa6\xe14?\rz\x823\x81\x84\x8f/\xfe\xedI\xf8!}\xfcq\x92 ,\b=\xa7.\xbd\xfeѰ\xac\xa5j\xb7nݮn=\xdbz\xb1\xf53\xae\a\xba\xbeV 7\x9d\xb4~\xee\xe5\xa0\xd7\xf6C\x13\xf1C9\xd0\a\xbbv\x8d\v\xfd\x14V\x91[n\u007fj\n~\x92\xfc\xfb\x93\xfc\xff\xafȕx\x16n\xfd\xa0I\xb86*?\x9e!\xa9\xfb?\x88\x1d\xfd\x90\xf1\xffY\xc0\xd7\xf7\xcc\xc0;W\x19\x16<\xa0>\x9a\x83k\x17\x00\xf3\x80_\x9f\xd3[\x9c\x89k;\xcc\xde\xc1\xeb,\x94\xaf}\x96\tf\x98\x11\x94\xcc$(\xae\xcdI8\xe6\x8f\xe9\xef\x9f)(~\x8a\xe2\x18\xdd\xdf~x\xbfp\u007f\xfb\xe1\xc3\xfb\xb7\xa1}x\xff/\xb3H><=?\xdb\x12\t\xf3\xf1=|\xea\x83\xd3\x11\xc4\xf6\x8f\x9e\x8b\x0f\xad\x8f\xef\xe1S?p\x99\xfcl\xba\xd5\xcd4\xe4\xb6\tu\xe5\xaf3\r\u007f\xfc;\x9b\x83\xefQ\x1a\xbeg\x0e\xde\xe5K\xb7~f\xa6\xf47^\n\xda:c\xad{\x87\xea\x10O\xcb\x15\xcb\x05_;F~^\xcc읹1糵\x99\xad\xcfߛ\xa3h6\x1b\x0eߝ(=\x1b^\x03X\xd3\xd3\xf7U\x8e\xfc\x84\xe9\xc9\xe4:\xe2\xbc\xf5\x81)\xbc~]\xf8!\xc9\x19u\xf4\xeeu\xa9\xc6\xcf5\xb2<\x97ŭ\xe2\x8f\x13\x120\x98\xd7\xfeg#48\xe6\xfe\xd5Z\xd1\xc0ѿ\x9a\xbd\xfb\xf6\x94\xc6\xf0uh\x90\xe8\xd5\x11\x06d\xac\xd0\x04\xb7P\xb1\x9a\xa8\x13\x15\xab\xef(\xc4\xc4j;\xc5\x11ҩ3i\xea\x88\x00\xde7\xb8\x96\xe2-\x00K\x0e@\x92\xc7\xffD\xddg\x9bb\xf3\x96)~\xf2A\xcd\x17U\xe2B\xf1\xc1\x83\aſKk\x1b\x8c:\xce\xda8\xceA!\xf6\x18\xa9E\xf6\xd9\xfa{\x0f1T<\x01\x84\x8a\xaeOB\x86\x8a2ZV\xab\xf0[f=\xea\xe4\x16Lǭ\xdcl\xa8\xb5^\xaf\x030R\x89\x9a\xe4\xfa\x00\xd4\v\xa4k\xd7\xc2*\xef\aLJj\xfe\x10\xfe\xa1㙎\xa7\u007f\x17v4\xd0w\xd88\x8d\xd4\x02\xa4tKm\x9a\"\xbcd\xa3JT܄\xe6>4\xbd\a\xc5\xdb\xc5\a\xbd\x1e\xd2U\xefAQ\u007fZ\xcc\xfb{>\xa4\xf8o=6\xdb[\x8f\xcd\xce\xd6c\xb3\xbb\xf5\xd8<\xdazl\x1eo=6\x9fm=6O\xb6\x1e\x9b\xa7[\x8f\xcd\xe6\xd6cu_}\xa2\xbeQ\u007f\xb8\xa5\xbe\xc3\xe1\xfbZ\u007f\xf5\x95\xfe\xfa\xeb[\xb7>$\x80r(\xf9{%\xd05\x8e\xb6\\\xa0\xfbxx\x85\xae\xe3\x159\xaa7p}N@\x89_\xa0\xd56V\u058c\x17\v\"\x97\x0f\xb2\x97\xf7\xd0AƧ\x91\x99\xa9\xa6\xaa\xe1\x1e\xdf\x1fn\xf1\u05f8\x1e\xe6\xd3|9\xab\xb0\x02z\x85\xe2oz\xbf\x81\xa9{\x81\x13\x98@\xfb\xfb\xe4\xf7\xc5B\xf1\xee\x8b{\xc5\xf7\xfa\xfc_\xb4}\xfa\x8f\xdf\x0f]\xcc\xec\x03\x83\xad\x97\xdf3\xda4\xac\xc8\xc2Q\xf4Y\x1cˌ\x0e\\P_ߧ\x91\xbc\x86ˢ\u007f\xe3\xdf\xf0y~\x90k\xc8:ԳO\xf4\xfc\x13=\xf9D\xbbOx\x923\x12\f\xafn\xdc\x03\u007f\xd2A\xffJ\rt\xf7\xe4z\xc0\x8b\x1e\xc4\x12\xf3B\x9ew]\xddP\x87\xba\x13\x9br|\xa2\xcb'z\xb0\xa1ʺ\x1c\xab\x9e:P5\xf5L\xf5ձ\xee\xc5\xfaų\x1f܁\xccY\xffF]\xe9\xe5\xc9\xf58\x19X\xc3s\x895:\xd1\xe3\x13=\xdaP\x97\xc0\x9c\xce\xe2\x13}v\xa2\xaf6\x88\x86ߪs\x15+\xa7\xd6j\xa5\xdf\xc6:q\xef[\xff\x88\x95_[\v#=\x1a\x01f\xd1á\x9a\xab)\xd94\x17z\xb1\xb8\x05\x8b\xe2\\\x9d\xa9\xb1Z\xaa\v\x05k\x05\x16\xc3l\xa8g\xa7z8\xd2\xf3\x19\xd9W\xf4\xbc\xa5\xa7\xa7z\xdaҧ#}:\xbb\xa5O\x17\xe6t12\xa7\x8b\xa59]\x9c\x9a\xd3\x05\xbc?ק\xe7\xfa\xf4L\x9f.\xf5\xe9\x85>m\x99\xd3Ӗ^\x8c\xf4b\xa6\x17C\xbd\x98\xeb\xc5T/N\xcd\xe2td\x16\xc0\xa4\xf4\xe2\\/\xce\xf4b\xac\x17K\xbd\xb8Ћ\x18\xe5\xc8\x00\aj\xaaN\xd5B\rn)\xe8\x1et\xae\xa5\xce\xe1k}6\xd6g\xf1\xad[\xfa\xe2T_\xb4t\x1c\xab\xc3\xef\t \x03\x14\xaa\xd7֬\xad\xd3.Qά]\xa2\xd7\xc0\xabW֬\xacӉ\xd3\xebD\xa5f\xe5\x12\xbdrz\xe5\xf5:\xd5.\xd5k\xaf\xbc\xb1\x9b\x89\xb1\x9bi\xb4\xb6\x9bIam7\xd7I\xe4\x92Ml҂K6]ZX\xc3\aئQ\xb2\xe9\x12\x93l\xba(\xd9\\;\x93l\u009b\xb4\xb0N6\xd7\xf66\xb6\x0e\x9f\\\x12\xad\xe1(\xebdӛt\xd3F\xe9\xa6uw\xd2M<`\x94\xc2oS8i\xbai\vk\xf8\x18^\xba\xdbk\xf8&)\xe0\x13|\x82{\xf8ȥЗ\x14~\xba\xf6\x9b\xa9\xf1\x9b6\xf2\x9bkk\xfcfb\xfcf\x1a\xf9M\a\x9f\xbeT/\xa3\x97\xd0\xc1\x97\x9b\xa9y\xb9\xe9\xf5˗\x1f$R\xa0\x13=Z\xa8\x99\x9e\x9d\xebY\xac\x86\xa0\xb2\x8d\xf4d\xaa'\xa7\x18P\xb9ԓ\v=\x89\x89\x84p\x06\x17\xc0^\xf3\x144\x9a\x98\xd1\x02#\x9b\x80\x8a\x16z6г%\xd0\xd2rb&\xa3\x85\x9e\xcc\xf4dh&\xcb\x18\x95\xc1\xe9\xc8L\xa6\v39\x85-6\xf3օ\x99,\x16z2Г\xb1\x9e\x1c\xea\xe9HO'Hz\v3],\xf4t\xa0\xa7gz\x1a#)N\x80\xcc.b \x03\xa0\xb2\xa1^L\xf4\xe2\x14\xe8\aH\x1b\xf8\u007fK\xb7\x16\xba5\x10Z\x99\xe9x\xa2㩎O?L4\u007fԱ\xd5q\xaacobkM윎\x9d\x8e1lEO\xac\x9e\xa4z\xe2\xcd\xc4Z3qNO\x9c\x9e$f\xb2\xb2&\x8eaKM\x1c\xfb(\x8e\xad\x8d\xe2\xd89\x13ǰ%Q\x1c\xaf\xac\x9eZ=M\xf5ԛ\xa9\xb5fꜞ:=M\xccte\xcd\xe2\n\xb6\xd4,\xae|\xb4\xb8\xb26Z\\9g\x16W\xb0%\xd1\xe2je\xf5\xdc\xeay\xaa\xe7\xdḙ5s\xe7\xf4\xdc\xe9yb\xe6+\xab\x17V/R\xbd\xf0fa\xadY8\xa7\x17N/\x12\xb3\x80\x03ǰ\xa5f\x11\xfbh\x01\xddZ@\xb7\x161lI\xb4\x80n]Z}\x99\xeaKo.\xad5\x97\xce\xe9K\xa7/\xf1z\xcd\xe5\xca\xf2\xb3\x8f.W\xd6F\x97+\xe7\xcc\xe5ʅ\x11\xbb\x8c\xad\xb9\x8cSs\x19\xfb\xe8\x12\x8e\u007f\tǿ\x8ca\xc3cD\x971\x1d\x04^\xf8\x02\xbc\xb3\xd0:\a\x1f\x84\x03\xe9S\xabOS}\xeaͩ\xb5\xe6\xd49}\xea\xf4ibNWV\xbf\xb1\xfaM\xaa\xdfx\xf3\xc6Z\xf3\xc69\xfd\xc6\xe97\x89y\xb3\xb2zi\xf52\xd5Ko\x96֚\xa5sz\xe9\xf421˕\xd5gV\x9f\xa5\xfa̛3k͙s\xfa\xcc\xe9\xb3Ĝ\xad\xac~k\xf5\xdbT\xbf\xf5歵\xe6\xads\xfa\xad\xd3o\xe9\x8a\xdf\xf2\x15\xbf]\xf9\xe8-\\\xf1[\xb8ⷹ\x8eά\x9e\xa5z\xe6\xcd\xccZ3sNϜ\x9e%f\xb6\xb2f\xb6\x86-5\xb3\xb5\x8ffkk\xa3\xd9\xda93[ÖD\xb3\xf5\xca\xea\r\xab7H\x8f߰\xd6l8\xa77\x9c\xdeH\xcc\xc6\xca\xea\xb1\xd5\xe3T\x8f\xbd\x19[k\xc6\xce\xe9\xb1\xd3c\xea֘\xbb5^\xf9h\f\xdd\x1aC\xb7ƹ\x89\x18\xbf\xb5f\xfc65\xe3\xb7>\x1a\xbf\x85=\xde\xc2\x1eoa\xa3\x89\x18\xf3\xb5\xc1\v_\x80w\x16Z\xe7\xe0\x83\xec\xfaVV\xafR\xbd\xf2fe\xadY9\x87l\x91\xc8\xff\xc4\xea\x93T\x9fxsb\xad9qN\x9f8}B_]Y}\x95\xea+o\xae\xac5W\xce\xe9+\xa7\xaf\x12s\xb5\xb2\xe6*\x86-5W\xb1\x8f\xae\x80D\xae\x80D\xaebؒ\xe8\nHpm1\x98ƛ\xb5\xb5f\xed\x9c^\x03[\xc6\x03\x0f\xad\x1e\xa6z\xe8\xcd\xd0Z3tN\x0f\x9d\x1e&f\xb8\xb2f8\x84-5á\x8f\x86Ck\xa3\xe1\xd093\x1c\u0096D\xc3\xe1\xca\xeas\xab\xcfS}\xee\u0379\xb5\xe6\xdc9}\xee\xf4yb\xceWV\x8f\xac\x1e\xa5z\xe4\xcd\xc8Z3rN\x8f\x9c\x1e\xd1h\x8fx\xb4G+\x1f\x8d`\xb4G0ڣ\xdch\x8fF\u058cF\xa9\x19\x8d|4\x1a\xc1\x1e#\xd8c\x04\x1b\x1dc\x19[\xb3\x8cS\xb3\x8c}\xb4\x84\xab^\xc2U/cؒh\t\x8b\xe2,\x86-5g\xb1\x8f\xce`\x973\xd8\xe5,\x86-\x89\xce`\x97\x8b\x18\xb6\xd4\\\xc4>\xba\x80].`\x97\x8b\x18\xb6$\xba\x80]\x96\v\xd8R\xb3\\\xf8h\xb9\x80\x13-\xe0D\vؒh\tL`y\x05[j\x96W>Z\x02wY\x02wY^\xc1F\xa3\xfc\xda\xeaש~\xed\xcdkk\xcdk\xe7\xf4k\xa7_'\xe6\xf5\xca\xea\v\xab/R}\xe1ͅ\xb5\xe6\xc29}\xe1\xf4Eb.V\xd6\xcc\xd7\xd6L\xd7ּ^\xdb\xef\x05=E\f\xff\xfaW\xf5\x1b\xf3\x9b\xdf\x14\xd5\x17\xfa\xc1\x83\x0f \xdc\xed\x87\xf7\xcd\xce\xc3\xfbf\xf7\xe1}\xf3\xe8\xe1}\xf3\xf8\xe1}\xf3\xd9\xc3\xfb\xe6\xc9\xc3\xfb\xe6\xe9\xc3\xfb\xe6\xd7\x0f\xefG\xdb\x0f\x1f\u07bf\xb3\xfd\xf0\xd3?\xc7\x13\xf0\x17ŕY\x1c\xfc\x1b \xaa\xb1EJ\xf2z\x94 \x81\xbdA\x81\xe2t\xecu\x9c\xa0dy\x83r\xc4\xe9\x89ד\x04\x05\xca\x1b\x94\rNO\xbd\x9e& $f\xd6\xc43kf6F\xf6\xe2\xf5,A\xae\xf3\xc6\\\xa6\xd6\\\xa6\xce\\\xa6\xde\\\xa6\x89\xb9LSs\x99\xbe\xd1\v\v\xa2\xd8\xe9\x85\u05cb\x04\xc5\xc1\x1bX;K\v\vf\xe9\xf4\xd0\xeb\xa5\xd7\xc3\x04W\xd3\x1b3\x9cX\xb3\xc4͙\xe5ě\xe5$1\xcbIj\x96\x937LQ@?\x1eh\x88\xa9\xeb\rr\x06\x84H\xab\x04Y\xc4\x1b\\\xb7N\xaf\xbd^'\xb8\x80\xdf\xfc8\xab\x9b3\xd6zR\x96\xd0\x12\x98$\xa0G{2\x8c\xad\x9c\x9c͛\x95\xc7\rO\x9c\x98U\x126\xec\x93%VE\x9b\xb6^\xadԆZ\xaa1\x85b\xcdԊ\xcd\xd1+u\xa6\xbeP\x13\xedf\xda\xcft2\xd3v\xa6/\\ta\xadG\xfa\xf6\x1e\t;\xa1\r%\xbf\xd7\x17\x96\b\u007f\xe5x\xf3\xb0E\x17+O\x8d\xb9X\xc1bH\xa2\x8bUB\r.\x8d\x8b\x95\x8d.\x80u\x84\x06\xa3\xefb\xbdt\xd1\x12N\b2\xcb{\x14V\tm\xc8ܼ^Z\x12f+Ǜ\x87-Z\xc2\t\xa11\xcb\x15\b\xb8$Z\xc2\t\xa1\x01q\a[\xb4\x84s\x85F\x81~\xeb\xcc\x12\xce\x04\xa7YZ=v\xd1\x18N\x0e2\xc6{\x10.\xe3\x047=\xb6$uV\x8e7ϲ\xc6Scƫ\x04\xb6h\fg\x85\x06e\xd2xeE\x1eq\x03J\xf7ʌ]l\xc6>6\xe3$6c\x1b\xeb3\x17\x9d\xc1\x89A\x1c{\x8fr8\xc1M\x9fY\x12\xd0+Ǜ\x87-:\x83\x13Cc\xceV \xb4\x93\xe8\fN\f\r\x88pآ38ghԙ^\xc6z\xea\xa2)\x9c\bP\x96\xf7\b\xaf\x12\xdc\xf4\xd4\x12\xeeZ9\xde\xe1\x16\xd1,6\xf0\xder\xab\x17\xb1\x06\x85\t.\x1c\x00\x86\afe\xd6\tn\xa4\x1aZ\xb3^9\xde\tR=\x93\xe1\u058c\xe2Ԍ\xe2Čb\x17\x8d\x00\x92\x8dboF1\xa9h\x89\x9e;\xd2\xd0O\xf4\xb9#\xd8\xed\xf1ߚ\xf3\xf3Ԝ\x03\x02?w\xd1\xf9\xb9s\xe6\x1c\xc0\xf99\xe9Չ\x9e8R\xab=\xf0\xbd\xe1$5\xc3Ib\x86\x13\x17\r'\x00\xed'\x1e\x81\xcb$Na\xca\rP\xda\x04\xaee\x12{\x9c\xfa\xe5$N\x03ٹ\x024\x19-Z\x068\x00t\xe0S'ȇT\x97D_9\xd2\\\xbc\xbe\xb2\xeaJ]\x99\xe1Uj\x86W\x89\x19^\xb9h\b\x90yx\xe5\xcd\xf0\x8a\xb4\xedD/\x1c)\xdb\x1e\xf9'*\xd9@\xaaNtl\xa0]\xe0?\f\xa0\x00H9A\xe7\x1eQ\x16\xa1\xff\x040\xbf\x80\u007f\x0fjA\xb4\\.Rh`\x89.\\\x01\x1a\x98w\x80\xf8˅U=\xb5e.-\xac hf#_\x80\x06_&\xf02Iॅ\x97\xd6\xfe \x10[T\xa7j\xa2^#^\x8a1|\xfdL]\xaa\xa9\x1a\xe9\xd9H]\xa99f\xf1\xa4\xb0^0\xe2=\xa6TǷ\xeaB\xfdV}~\xedH\xaf\xd5\x1b\x95\xea\xf5\x1c\xed\x93\xe4\x1b\xb5*\xd1\xf6\fݗ\x18\xf5\x9b8\x9d\xcc\xd4\\\x8d\xd1f\x84\xa7\x80\xc7\n\x93t\xe1A\tÞ2\x8c\xe1wV\xbbD]`f9<\xce0\x00\u007f\xa9\x86\xeaT\x9d\"\xb0r\x98\xff3E97\xc3#\x0eUb\x9c\x9d\x1b\x9f\xccѾ\x01\xffj\xa1\xd7s\xfaW\x97\xea\xad\xdaR\xbfQ\xf7\xf5\xf6\x13\xbd\xfdTo\xff\xfa'\x87W\xdcl\xff\xa0\xae\x85\xefu4)\xcal\xfaS\xfe<\xf60\xe5B,\xd4D]^\x8f\xd2\x19\xeb45i\xfaF\xcf\xd7f\xbe^\xeb\xc9\xdaL\xd6k\x8ed\x95@\n\n)\xb0\xef8\xb1uj\xd1\xd0m\xb5\xc7\xf0{\xf9\x8dMUSմ=\xb9u떚\xdfR\xbf\"'\xee\x16\x85\xd2\xc3Ҹ\u007f\xdf\x14?\xe1\x10\x02]?z'2\xff/\x18\"s}}\x15\xbf,\x16\x8a[[[E\xfdiQo\x15\xf5o\xc8!vKm\xd2\a\xc1i\xf9c\xba\x94S\xdc_\xa8\x97\xa0y\x02\x1aG~r\xa9F\xc8K\x16Tnb\x883\x8a\x93\xb4R\xaf\xd5\x18\xe4\xa6^.ԕ\x8a\xf5\xd5\\O0\xd1\xf6,V\x9b\xd7\x0ex\xedXr\x10\xf8\xd9Z\xad\x80\xed\xa9X\x9f\xaf1\xc3\xed\n\xf9\xaa_c\xca\xeclD_\xaa\v>\xb9:\xa7\x02,t\xc69\xf0\xdf+JT\x9f\xab\xd7\xfa*\xfeA\x14ZS=u\xac\x9a\xa6\xb8[,\x14www\x8b\xca\xc2!\x88^\x83'\x14ITQ0\x90^,ȭl\xd5\x12\xaeO\x88\xfb<\x06܁\xd9wK=\xc4\xdd\xceִg\xaa\xd6@\xce\x1b7<\xe1&\xe3\xe9\xe6\xef\xe6\xef\xe6\xefg\xfc\xbb\xf5W\xfcS\xa7j\xa8^cd\xc2\x05Z'\x16\x98\xcf:\xa2//\xc2\x0e\xa3\x10\xc0\x80e>n\xa97ꭺ\xba\xf5W\xfe\xfb#\xd6?*a\xcd)\xda\xf2Ŷ\xf2ۇ\noQ\x1d\xaa\xac\xe0V~\x93\x12\x17uL\x16\xa7\xed\xddB[M5\r[\xae\xe8\x16\x97\xb1\xba^\x8f\xa9\xad.p\xcbW\xdd\xfaP\xe5\xadw\xabo}_\x05\xaeW\xea\rn\xc7j\xf5\xde\xd6Soq\xe3\xeaXa\x03L\xb1\xc2\xcaN\x9d\xacP͂#d\xec\x8f\xda>4\x9c\xf9\xedC\x15B~\xc8\xf6}\xc5ƨ\xe0\xd7:\xbf}8\xf0˾\xf3\xd8{\xe7\xe1\xb2G@HϲG\x16\xe9\xf9\xce\xe3\xd9;\x0f\xff\xce\xe3\xf9;\x8f\xacR\\\x12\x8e\x99\x15\xa0{\x11>K\xaf?\xa8\xce\xd1\xfbm\xfex\xf8x\xf1\xce\xc3ri#\xa9X\x97p}\xba\xfc\xf9\u007f\xc4\xd8|\xf0\x9a\u007fH\x1f\xf0\x91+(#\x8f\r\xac\xb6\xf1\x9d\xfe\xf8\xbbl\xf0\xaf\x9fDo\x9c\xe8\x8d\r\xbd\xf1\x9d\x8ci\xe8wn|\xc9\x19\xbd\x81\xff߅a;RG\xf8,5\xfd\x8e\xf4\xc7'\xfa\xe3\ru\x92e\x98\xc9@\xbc\xd3\xf1\ru\xf2GU\xfc\xf0\x039\xde&=\xf4&\xfe\u007f\xfb\xad\xfa\x03f*\u007f\x8a\xf5\xc3>֟~\xaa>FeI}\xa2?\xf9\\m\xe9\xad-\xb3\xb5\xb5\xa5\xb6\xd4/\xf5/\u007f\xc9\xf5\x0e\xf5??4\xff\xfc\xf0\xa1\xda\xd0\x1b\x1bfccC\x9d\xe8\x93\x13srr\xa2\xbe\xc1\xa2c\x9f\xe8_\xfdJ\xff\xea\v\xb5\xa9\xfe\xa06\xd57\xe6\x93O>ћ\x9b\xea\x81\xde\xfcJ\u007f\x8d5X\xf4\x17\xb8\xc3\x13\xddn\xeb\xbb_\xeb\xaf\xee\xfd\xb51\xa8\x04\xf9B\x93\xcf%\xbd\xaf6\xd5\xef\xb0B\xe5샹\xa6\xe1\xfb\x9f\xa5#\xcf\xca/u\xb9\xa1\xcbs\xbd\xbf\xaf\x1af\xea'\xaae\xda˅>Z\xa8c\xddꨊ~\xf6R\xd5UWW\xe6\u007fk\xd4\xfe\x97\xaa\xbf\xf6\x17\xa8\x1d\xa7\xeaj\x8f_\xed\xff%\xba\x9a\xd51\x92\xadP\xdc~\x00\xea\xe8\x0e\xb6\xdb\x0f\x1e\xe3khw\xb1}\x84\xed\xf6\x83ϊ\x85\xe2cl\xb7\x1f<\xc5o\x9f\xe2'\xd0>y\xf0\xb4h\x8a\xdb\x0f\xd4s\xfd\xfc\xb9y\xfe\xfc\xb9~\xfeJ\xbdү\x9e\x9bWϟG\xaf\xf0\x83\x9e\xea\xe9\xdes\xd3{\xfe\\5\xb0\"j\x13\xed#\xc6{\xaf\xfd\x1b\xf5\x06C\x8b\xbc\x8f\xde\xe0\ao\xd5[\f\r\xf2^M\xb0\xb2\xddT߭\xe8ʽ\xc2ݻ\xdf\u07bb\xf7\xe3iXm\xaao\xc3\xf6{\xac'\xf8\x00\xd9\xc9w\xea\xbb\xdcw\x9bᵼ\x93\xcf\xf2\x8fo\xd4+\xf5{\xf5;\xacO\xb8\x99\xdb\x1b\x9e\u007f\x87\xdb\xefr\xaf\xe4\xf1m\xd8\xe4\xfc\xf0)\x9c\xff\xdb\\߮\xf7!{l\xaa߫߫oo,\xa27\xdb\xcdv\xb3\xdd,\xfe\x9b\xedf\xbb\xd9~\x1a\xe0\xfc+\x83\xef\xbf\x16\xb6\xff\x8b\x1a\xe5\xfe\x9c\x82\xfc\x0f\u007f\xfe\xac\xbawq\xa7<\xdf\xff\x1b?\xb2\xfe\xfcԾ\x00F\xee]\xc3\xed\xf9\xed?\xfc\xc0\xc7\xe6\x0f\xc7\xcc?\xe8x\xdf\xf0\xe3\xf3\xdc\xe3\x15?~\x9b{|\xf2\x93\x1f\xef\x9e\xf3Ż}\xf9\xd1\x1c௺~n\xf8\xf0\xcd\xf6g\x81ֿ,\xff\xfe\v\xd1\xfd\xfb\x87\xfc\x87\x9fKUTVm\xabS\xb5\xa1\xc6jGMԗ\xeaLy\xf5Z=PS\xb5P\x17\xeac\xe5Ԯ\x8aկU\xa2>Ss\xf5\rFY\x8c\xd4\xe7x\xaf\x8cK\xf5\xa9\xfaD=V\xbfU\x9b*UO\xd5\x1b\xb5\xa5\xfeY}\xa5\xfe\xa3\xba\xafު_\xa9\u007fQ\xff\xaa~\xa3\x1e\xa9߫\x87\xeaJ=Qw\xd5\x1f\xd4\x17j\xa5\x80\x8d\xaf\xd5=\xf5\xbb\xe8\xabᓯ\v_\r\xb7\xb1\xddy\xf2\xf5\xed\xaf\x86\xdb;\xf8f\x97\xde\xd0\xd3\xce\ue4ef\xef\xc0W\xbb\xf8\xdd#\xfa\x8e\x9ev\x1e\xf1w\xf4v\x97\xdf\xf2\xf3\x0e<\u007f\x84?}\x84\xbf}L\xbf\xa5\xa7\x9d\xc7\xfc[z\xbb\xcbo\xf9y\a\x9e\xe9\xb7\xf4\xfd#\xfe\x9e\x9fw\x1e\xc9\xf7\xfc\xc1\xae| /v\xf0\xc5/\xe8\xf4\x8f\xf1\xfc\x9f\xd1\xf9\xe9i\xe73>?\xbd\xdd\xe5\xb7\xfc\xbc\x03\xcft~\xfa\xfe\x11\u007f\xcf\xcf;\x8f\xe4{\xfe`W>\x90\x17;\xf8\x82\xcfO\xc7x\xcc\xc7\xe0\xe7\x9d\xc7r\f\xfe`W>\x90\x17;\xf8\x82\x8e\xc1\xfb<\x92}\xe4\xc5Σ\xb0\x8f|\xb4\x1b>\n\xafv\xe8\xd5/y8>{\xf2u\xf4\xd5\xf0)\xce?\xb6;Oi\xfe\xf1\xcd.\xbd\xa1\xa7\x9dݧ<\xff\xf8\xdd#\xfa\x8e\x9ev\x1e\xf1w\xf4v\x97\xdf\xf2\xf3\x0e<\xf3\xfc\xe3o\x1f\xd3o\xe9i\xe71\xff\x96\xde\xee\xf2[~ށg\x9e\xff\xa74\xffOy\xfe\x9f\xf2\xfc?\x95\xf9\u007f\xca\xf3\xffT\xe6\xff\xa9\xcc\xff\xd30\xffx\xfe\xcf\xe8\xfc\xf4\xb4\xf3\x19\x9f\x9f\xde\xee\xf2[~ށg\x9e\u007f:?\u007f\xcf\xcf;\x8f\xe4{\xfe`W>\x90\x17;\xf8B\xe6\xff)\xcd\xffS\x9e\xff\xa7<\xffOe\xfe\x9f\xf2\xfc?\x95\xf9\u007f*\xf3\xff4\xcc\xffS\x9e\xff\xa72\xffOe\xfe\x9f\x86\xf9\u007f*\xf3\xff4\xcc\xff\xd30\xffO\xb3\xf9\xc7\xf1xB\xe3AO;Ox<\xe8\xed.\xbf\xe5\xe7\x1dx\xa6\xf1\xa0\xef\x1f\xf1\xf7\xfc\xbc\xf3H\xbe\xe7\x0fv\xe5\x03y\xb1\x83/x<\xe8\x18\x8f\xf9\x18\xfc\xbc\xf3X\x8e\xc1\x1f\xec\xca\a\xf2b\a_\xf0x<\xe1\xf1x\"\xe3\xf1D\xc6\xe3I\x18\x8f'2\x1eO\xc2x<\t\xe3\xf1$\x1b\x0f\xea\xcfg\xdc\x1f~\xde\xf9L\xfa\xc3\x1f\xec\xca\a\xf2b\a_\xfc\x82\xd9\x04\xf5G\xf6\x91\x17;\x8f\xc2>\xf2\xd1n\xf8(\xbcڡW\xbf\x14v\x81\xc7z,ǒ\x17;\x8fñ\xe4\xa3\xdd\xf0Qx\xb5C\xaf~)l\x03\xf7{\x14\xf6\v\xafv\x1ee\xfb\x85\x0fw\xb3\x0f\xb3\x97;\xfc\xf2\x9f\x02\xfbxz\x13\xebu\xf3w\x13\xea\xf4\x97\xb4\xa4P\xecN[\x1d)\xab\x96\x18\xe9SWc5PW\xb7TS\xbc\xa0\u007f7\u007f7\xb5\xeeo\xf4\xd3\u007f\xe8-\xfaꋯ\x8b\u007f\xd3\xe6\xef\xa3\x177\xcdO\x9a\xc0\x1fl>\xb8\x19\xb0\x9b榹i~~\xd6\U000b7482\xefXG)iN}\\\xf8\xea\xe0y\xe7k\xf51\xdeN\xfc\xb7\xfa\xf3\xa2\xfe\xedo\xcd\xe7\x9f\x17\xd5W\xfa\xeb\xa2\xfaO\xfa?\x17\xf5Wwͽ\xaf\x8b\xeaKݣO\xf5W_\x99\xaf\xbf.\xea\xbbwͽ{\xe1\xddwE}\x82q\xbb\x9f~\xaa\xbe\xfc\xc0\x9d\x16\bu\u007f'\x0e\xb6[\xeaK*,{\u007f\xfb\xe1\xfd\xe8\xfe\x0e4\xbb\u05eb\xfap:\x9f\xc545\xba\r\x99S\x98?\x8c\x05v\xac\x1e{=\xf2z\x9c\xeaQ\xaa\xc7X\xbci\x9c\xe8Q\xa2\x17V_Y\xb3\x88\xbd\xbe\xf2z\x91\xea\xabT/\xb0\x1a\xd5\"\xd1W\t\xd6ñ\xe6,\xf6z\xe89/;\xd5\xc3\x14+\xe48\xbdL\xf4\x10\xf3\xfeg\x1esߝ\x9e%:\xb6\xfa\x14\xcb \xc5^\x9fz}\xe1u\x9c\xea\xd3T_\xa4:\xc62e\x17Nlj>M\xf4E\x82u|<&\xc9;=M\xb0@\x0e%\xc8S\x8e|\x82e\xdc<\x96\tpz\xce\xf5k\xb0*\x80ӫD\xcd\xf4\x9b\xf4C~2\xf5qv\x8f\xc2\u007f\xc8A\xc1\xe2h\x0eK\xc1y\xaa\xffF\x83\xf2A\xe5@\x95T[5\xd5>\xde\x01\xb1\xa5\x1a\xaa\xaaꪦ\x0eԡ\xea\xe9AM\x97k\xbaSSGj\xa0ʪ\xa3\xf6\xd4\v\xf5L?\xab\xe9\xbd\xe7\xfa\xd9s\xbd\xf7R\xbfx\xa9\xf7Z\xfaY\xcb쵪\xe6Y\xab\xaa\x9f\x1d\xa9\xe7\xea\xa5~\xfeR\xbdҭ\xaa\xae\xb6\xfet\xd9D\xac\xb3\xf9\x81ʉs\xae\x9c\x18\x8a'\xbe[\u007f\xf3\xa7լ\xbc%\xb5;\x17z6\xa0b\x8bC39\xa5r\x8a\x87TE\x11+(\xb6\xf4\xe9\xe8\x96\x14\xf0Ģ\x9d\xcb\xf7\xcbu\x9e\xeaŹ\x1a\xdc\xcaj(R\xb1\xcdk5-\xb1\x8e\xe5{\xd5)\xbdzi^n\xfa\x0f\xf9\xbbt\xe9\xa5\x1e<\xd7\a\xcfu\xf5\xa5~\xf6\xcc\x1a\xc4\xf8M?\xc1\xa7N\xec\xe0WM?\x1b\xe1\x8ex\xa8\xb2\xcd\xefٰ\t\x82f4\xb7\xd3_\xc0\x8b\xa9[\xba9~\xb4\xb2\xcbe\x04\x9f\u007f\x04Mq\x99\xcc>:\x9b\xa7W\xceϓ\xc2x\x9e\xcc\\tf\x17\xee\xf68\x99\xa73[8K6\x93\x8b\xc2\xd9\xfal\xe2\ue739\xd9\xd2O\xddG\x8b\xd8O&~6*\xe0\a\x11\xb4\x85ar\xe5f\xd1\xd0-\xfc\xeda2\x99عY&\xb3hfgI4\x9e%\xcb;\xb1\xf3\xa3x\xb9\xb8s\xe1\xe6\xb8?\x8c\xce\xe2\xf6\xa9\x9d\xcf\xdd\xe4΅\xb7\x8b\xa5\x9b\x17.\xfcY:\x89.\xfcY\xf2\xd1)\\\t\x9c㵝\xdba\xf4ڹ\xe5\xed\xd3t\x11\xbbI\xe1\xf5\xdc\xce\xce\xee\xc4\xeeli\xe7.\xbap\x8b\xe4\xce\xc5k7\x9b\xf9Q!v\xf3\xe5U\xe1\xc2\xcd\xce\\taG.:uK[\xb8H\xfcl\x19\xbdI&K\x13'\xb3\xc2E\x92ΆQl'\x93(N\xe6\xb3\xc2ԟ͓h\xea'.\x9aڳ8\x9a\xda\xf9\xf8\xce\xd4\xce\x16>\x99\xdd\xc6/a\x9f\xc9\xc4\u007f\x84\xed\xa9\x9dGS7\xb2w\xa0Y\xc2w0\xb4\xd1\xda·ܤvV\x98x\xf8p\xe2\xe7\xb60O/\x9c+\xcc\xd3Ӊ3s7\xfdh\x9e\xb8\xd9r\xe4f\x11̄~\x18\xeb\xedX\xef\xc4z7֏b\xfd8֟\xc5\xfaI\xac\x9f\xc6\xfaױ\xd9~\x18\x9b\xed\xed\xd8l\xef\xc4f{76ۏb\xb3\xfd86۟\xc5f\xfbIl\xb6\x9f\xc6f\xfbױ\xd9y\x18\x9b\x9d\xed\xd8\xec\xec\xc4fg76;\x8fbSk\xef\xe9\xa1\xd5{/ͩ\x9d\xeb䕾8{w\xb9ܮ9\xbfp\xfevg\x9d\xa4+{\xa7k\xfdb\x9d\xa4\x85\xa6\xf3\xe7>z>;\xdb\xd2\x17{z\xb6\xf7\x11\x8e\x82\x9d^\xe8\xe9\x9e\x1e\xef\xe9qI7K\xbaZ2gv\x12\x8d\xcf\xecD_\xec\xeb\xd9\xfe/q\xb7}\x98\xb0_\xe0K 0=\x1d\xe9\xf1H\u05ee̸ve\x9a\xb5+S\xad]\x99n\xed\x8a\xf6\xc6q\xd2Ӊ\x1eN\xf4x\xa2_O\xf5lJ\xdf\xe0\xb0\xea\xe9T\x9fM\xf5x\x1aM\xa7\xdf\xecDg\xd3ov\f\xbc\x18C3\x9d~\xf3\b>\xda5\xd3ov\xe1\xa3]3}\xb0(L\x1f,\xbe\xd9\xd1mk\xc6mk\x9amk\xaamk\xe6vX\x98\xdb\xe1\x83\xc5\x1dl\xbf\xd9\xd1\x17\v=[\xfc\x13\x9ej\xe1Β\xd9\x10\xa0\xe4\xc5+={E\x9d\az\xd1\xd3Wz\xfcJ7_\xe9\x8bc=;\xa6/pڦ\xc7z|\xac\x9b\xc7\xd1\xf8E<\x8d\x9a\xd0ح\xe9\x96.]\xea\xb33}6\x8c\xca\x0f\xc6#SN\xb6\xf4\xb0\xa4\xabk\xe0(\xb5\xb6\xf6\xb3\xa8\xbeU\xdf\xd2\xf5\xa6\x1e/\x11J\xcf\xcc$\x19\xe9\xc9[==5S?1\xd3d\xa2/j\xd1\xc5\xd6t˴\xdbM\xdd>ҋ\xb9\xee\xbc\xd1ǧ\x19k\x1cꝡ\xde\x1d\xeaGC\xfdx\xa8?\x1b\xea'C\xfdt\xa8\u007f=4\xdb\x0f\x87f{{h\xb6w\x86f{wh\xb6\x1f\r\xcd\xf6\xe3\xa1\xd9\xfelh\xb6\x9f\f\xcd\xf6ӡ\xd9\xfe\xf5\xd0\xec<\x1c\x9a\x9d\xed\xa1\xd9\xd9\x19\x9a\x9dݡ\xd9y44;\x8f\x87f糡\xd9y24;O\x87f\xe7\xd7C\xb3\xfbphv\xb7\x877>\xbc\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\x9b\xbf\u007fw\u007f7\x91\xa17\xcdM\xf3\x8f\x16\xa3\xfc_t\xa4\x1c\x8eT\xa1\xe2g\xa3bT\xb7I\xd1\x1c\xfa\xe2m\x8c\xf6)F=oy$\x9bI\xf1\xf6\x80>\xec\xd8ٵ\x1d́/\x9aRZ4\xfd\xb4Xhz;+FU닅r\x9c\xa4\xdc\xde\x1e\xc4)|~\xe8]Ѵ}1\xea\xc4\xd2\x1c\xfa\xb4X(\xc1\xd9M\xdf\x15\v\xe5d6*\x16*К\x8e/\xde.\xc7\x0e\xceS\xf1)\xedz\xbb\xe1m\xf8\xa0\x9fd\x1f\xf4팏S\xe8\xe0\a\xd5tV\x8c\x0e|Z4UW4}[\xbc}\x88{\xde\xc6\x00&\xecut\xe0]\xb1\xb0\x0fg(T\xa1\x83\xb7\xcb\xd8\xcfB9\x86\xde6\xfc\xacX\x18\xc4iR\x8c\x06qZ45[\x8c\x8e\xe1\x8b\n4\xc7\xce\xd3\xe7\x85\x03\xec}\xc3\x17\xcdAZ\x8c\xdap\x8d\xfb0\x1c\x1e\xb7\xa8eq@\xfd\xd4Q\u007f\xa8\x19\xc4\x0e:\x9d\xd0>H\xb2\x83\xd8\x17\xcd1~g\x8b\xa6\x96\x16;-\x9a\x86\x93.\x17\xdaxym\xb8\x8a¡\x87\xdf\xd6R\xecy\x18(~\xc2c\xf6\xfd\x8c\x0f\xdc\xf4|j\x98[\x18f\xd3\xf3\xc5\xdb=\x1a8\x98+\x1aΚ\x9d\xf0\x0f:pY\xddU:\xa1I\x82\xb1*\xb4p\xef\x03\xa0\x88\xba\xe3/\x886^L\x8aQ\x13f\xbc\x81\x93\\\xb6\x93\xa29J\x8bQ/u4/0\x1cQ\a.\xaaeᄳb\xd4I&E\xf3lR,\x94\xf1,xV\xfc\xa2\f\x87\xad\xa6\x9e\xde\xf2!a&\xf0\x9a\x0eRW,4\xf0қ\x16)\xee\xf6\x80($P\x94y6\x87\xa3\x10=\xca\x16\xf5\xd3\x19\r\xe9!\x8d1OZ\a~\x84's3j\x80R\xa2\x9e'\x92\xa1\xf1\"\x12\x8f\xba@\xce\xc78\xf8uhM\xd7\xc2al\x02#GsM\x84S\xa8\xe1\x1c4S\xba.\x1eh:c\xa1\v-\x13\xed\xb5o`^\xa2C\xb8\xd0RB\xa4\x8d\xdd@b\x83K\x06\xba\x03RD\xba;\x82\xeeB\x83\x8b\xafa\xb9c8F8\x12\xf8]\xc3\xf1\xc26\x03$\x80YѴeI\x9a\x92\r+\x1a\xbe\xa1\xb5@\v\xe8\bW\x04.E\xb3\x9fЊ\x8f\x1a\xb0\x9e:k[,\x94\xf1T\x03\x19\xefn8\x10\xccs\x01\xae\x89ۨ\x9b&\xc5B\ri\xb7\v-v\vHwFӋk\xa4\x02\xf4\x87\xe4\xe3\xf9\x12`\x18\x13\xa0e\t\x9c\x88E\x1b\xf0\x8f\x1aP,\xce+\xb0\xb7\xc2!J\x9a.\x10\x13q\x11\xb8氀\v=\x12e0\xcctau\x1a-\xcf\x1c\xbb\xc1,\x87\x18f=\xb5\xc5\xdb \xc2H\x10\x11\xef\xc7\xd5\xd9\xe4\xf1\x83\x19\xc4\xe13{\xc0\x19`\x19\xc1\x1b`\x96H#\xb4>˱\xe5#\x02\xb5\x14\xaaI\x98q\x1cϣ\xb0\x90\x10\x19\xa00\x18@G\x1ai\xd1\xd4\xe5B\n\x03$\x8e\xb2c)U\xa8\xa7\x84\a\xa0\xa5Ih%\xc2wP\xe0\xd5@\x90\x1f\xf8$\x93`t\f\x9c<\xe2W\xc4\x1a\xe1<\a\xa9\b\xa8w\x86\b\x19g\x8bh,\x81\x91'\x16Dk\bD\x9e)\xa7E\xfd\x8c\x80\x04\x8c\xc7\xed:\x8dX=\xa5n\x1c\xa4̒`M6\x88˥\"j\x1b\x9e\xe9$\xaa\xc1\xd0\x107'6\x87K\xb2\r\xe3\xd0Ii\xb1\xc3\xc9\x1a| \x94\xdaQ\tE=\xad\x17\x1a=\\\x8a\xc0\x11\xf0㮧\x95\xccW\x8b\x84\xd7'\xd9giNa\xc6i\xc1\xca\x14\xf0ɀ\xfe\x0f\x88\xf3&\xd4\x0f\xda\x03F !Y\x18\xed\x03\r\xef\x136\xb0H\x03Ȃ\x90\xbb\xf4P\xe8ȯ\x84s\x00\x15\x10\xf5F\x038]\x1f\x8f\x05\xb2\x12zD@\xa8\x81\xf3\x8a\x9cw\x90\xc8z@$\x85G\a\xea\x9e\xd1dQ\x83\x9c\xbb\x02\a\xea\"7N\xf1z\xd3@\xeem\x9cz\xe4\x86H\x138\x19 \x83\xbb\x82\a\x0exu9\x92\xdb\xd2Y\x02r\xf8\x12\x96H\xa1\x8e\x84{\x80K\x8czv\x90\xf2\xe2FƆ$O\xd0\x0e\x99a\x03謃?j\xb80\xc7\x04CAЕ܌\xb9yJ\x80.*g\xc3<\x88-\xc1*Z\x9e\x00t\n\x87\xd8O\x9c\xad\xbeϑ5M\x1d\x82\xd5V\x9a\xc9*\x18\x05\x96gtq\xc7\"mh\x06\x8e\x80\xbc\xbb\xcc\x13\v\xed\xec \xfbو\x99\xe3\x04\xa9\x1b\x996\x90\xd2\xed\x0eA#\xe0\x1c\xc4Gӄ\x968-\x1d\xa6\x00W\xbc]K\x19C'\xccS\x99\n\x91\x00\x91\xe7b\xbf\x91\x87 8-\xb3P+y\x1ep\x1cdB\xff(\xf1\xfa\"=\x80\x8f\xa0\x8c\xa8 \xb7\x05\xa6@\xec\xe1EJ\x90\x8a\x1a\xec\xca\xc0\x12g\n#\x80\xe2X\xe6\x18Aa'I\x19(wRV?`\x8d\xf5q\xa6\x8f\x12\x01\xe2G\f\xf9\xa2*PQ\xd3\x16\v%\x1bD\x90\x10\x18\xd0!\x9c\nV+\x88\x9d\x00M\x88.y\x15\xa4\xbc\xbe\x91\xa0q\x891\x1b\xe8\a:\xee\xa4\x02@P\x02\x94\x82\x04@\\\x83\x1c\x92ω˺\xe4g|\xe0\x16N\b\xae$\xb8ZX]|\xf0\x01NE\x92-\n$N\xb3\x97\x88\xd8G\xe2@ʋ\xca\xc0=Y\xec\x1f\xe6\x10%1r G\x14\xba\fҘ4\xfbL\x14Īx\x06\x80\xb2\x12\xe2\xcb\x049IP\x84\x91\x11X\a/\x91\xaci\x89\xb0z'p6\fe\"L\x1d\xb9p4H\t\x80\xc2)I\x8a\xd2̲\xe0b\\\u007f\b\xb4B\xe0,\x16\xa8\x83\xf2s\x1f9{\x86\x84x-U\xf8eB*N\xa1\xe3\x04\xc7qoa6\xf53\x91M\xb4dI\xda5\x18m\x03\xe6!\x99\xdf\x11\x00{\xfb\x80\xb4\xa3&j\x1e.`d+\xe2\xa0-\xfc\x94\xc5\xe3\x1e\f\xb5\xc8d\x10$$\xe3\xe8\"\x10\xd4VrZ\x00B\x0f\x96\x8bt\x19H\x0f\xb9k\xc1i\x1b\b\xcbG\x9aA\xc9\r\x94\xddͫ\xd7\x04\x06\x98\xaf\xe1\xcc\xd1T5\x91\xd9\x1f\v\xee\xb9}\xe8\x05\xf8\x04l\b\xcb\f\b\x0ff\x99e!ɩJ*\xc2c \xa8\x03\xe5\x16AS\x8b2\xd9\u0378E\xc9\xd8\xc5QG\xee\xd4Hd\xe1\xb0:tDf\x838eD\xdb`\x86K\a\x875\xc0\xab\xa3/+\x81\x94M\x00'(\x97q%\x0f\x90\xe8\x98\xce\x18)0\xa7\xba\xb7\x11(\x90\xb5M\x9a\x92(\x0f\xf4#\xf8\x96\xf9\"Q\r\xac!2?\xc1ņK\xac#\xefJiV\x91C!\xce\xeaĩe\x06\x82H\x0e\xe7\xa7.\xe7\x02\x88\x84\xaa3b%\x9c\x14\xfc\xf9\x01Ah>c\x03\x97'\x8c\r\\*\xad\xf62\xd0N\x0fF\xa4\xeeȠă\x19۬O\xd0U\x11W)]\x15\x82RP.\xa2v\"\f\x1fH?\x8c\xdd@\xd6\x1f\x99bJ\t\xcf\bp\xfd\f\x89\x10\x16g\x94\x89\xf6\xe4\x84!\xca\x01\x1bC\x18̊Ї\xbd\tQ\x82\x80\x80\x8e\xc1,]\xdb\t\x94\x11D\xab8\x10\xd2!V\nh\x06\xba)c\x1c\xa4\x83\xfdD\xa6\x96qP\x9d\x91o\u0097~H(\x03\xc8\x05\xc9\b\x0e\xce='\xb4t\x90\x92\xd5\t舴|\xf9\xb5\xcfXE\x0e\x81\xf2\xdcp\u007f\xfb\x01\f\xe0TS\x17\xcb\xd8\xc5&\x8d6i\xf2\r2J2\x15\x94\x82\x8c \xa3\xc3q\xca敆g\xd8R\xa8;\xb2ճ\x86\xc2|\x06\x8f\xd5b\xb8\x8df\x102\xbd\xf4Ů\xdd\fz/\xd3\r\\J\x03A\x14\x9e\xb9\x9e\x19c\x8e\xad\xa8\x9f\xc0\xfb\x05K\x1cx^Xh7AsD\xdd\xc9\xd1\x00F\xe047=\x9b}I\xe5&\x00\xcc-Ɏ:\xeb\x11M~K\x14\x16\xe1q\xb7\x81\x9f\x93\xfb\x8c\xaf\x9f\xfbWJY\x13Ǟ#\xb1\xa3\xf1\xae\xc1\xf0\x109ޱ\x9c!\x936\xa85\xefex\x9fL\x12\b\xf0\xfab\xfa\xe5u\x8e\x84\x8d\xfe\x94T.\x8b\x176\"\xa9\x9e\x98\xaaa\x1f\xb1d\x83\x1eu(\x90\x820j\x8dM 3\xfc\xb2+З\x1c\\5;\v\xfc\n=+\f\xaa\xc5V\x82\x1c\xb4\x1dTc4e\xf5-k\x1ce\xc7߁\x90\xc1c\xe2\x0fk\x89\xd8\xfe\xa2A\xeaYt\xed\a\xe0\x8a?\xeb\xe7\xf4Q\x92#\rY\xa4h\x9e\xa9d:ׁ\x17\xe3\xe2\x1esj\xfaA\x87\xce\x19\x94%9H\xd0\r\xf8t\x1d\x9fa\xf7\x19\xdb\x16\x0fy{9f\x05\xab\x12\xf4\xcaAΊ_~\xbfA=\x12\xad\x06\xa8k\xa1\x88?\xe0ww:\x02\u007f\x02\xa6'\xe7\x1f\xe8\x0f\xe8_8J\x93\xa0\xb2\b\r2gOd\xdd\xf1\xc4ZF+hP\xa9Z1\x84\xe1\xdb\nP\xd2\x11\xac2b$\xc0\xe8\xd1/p ^\x00B-]\x11\x92$V\xc4\xf8\x8b\x8c݊\xeb\t\x98w\xd7\xfa`\x8d\x90KÁj\v\x05\xa34\x00\x10\xdb\x15' {\xaf\x84RєV#M\x83ɳ\xd0\f\x86J4<\xa2RM>Ձg\xb3\xa8\x17$Y\x0eFnV\x1eо\xd8 P*\x94\x82h\x01\xd9T\xdf\xe1Z\xd3{\xe4h|\xc1\xee\xccL\xbb'\x03\x19Ny7\x15\xa8\x8e\xbc\xab\xc4\x02\x83\x1a\x14\xae\xa5\x94\xd0\x05\f\vy\x8e\x00\xc1\xeag\xbczȐ]c\xe3IJ\b\x8a/\x96Q\x9f\xd8\x1f\x8fSvx\x99\x96\xe3.\xf5<\x1bQI\x03=F7\x03\x9c\xec\x05\v\x8b*Ju\xcb\xf6\xed\x06\xda\xc0\x11\x1c\xa1\xae\xb2G&V\xf1\x1c\x87\x1f\xec\v\xf6\xe1\x8e\xc00\vC\x84s\xc3U\x8b\x9f\x1b)\x16\xcf\xd7\xf0\xac\x03\xf73\v\a\t\"\x12\x9fp|\xb8n\xe46$\xee\xdaNT\x9d\b\x1f\xb2\xac\xe0`\xe0bEIW\a\xbc\x8b>/\\\xe5tz`\xf0\xbdT|\x0fѱ\x15v\xd8`܈ܫ\xedg<\xaa\xbcސ~\x18\x88\xd0j\x85\x01\xa8\x89\xef\xa8OS\x8c\x8e\v\xf1\xab\xed\xb1\xbf,(\xe5\x16'\x86{Y\x12\xa5\x8d\x04Pj\x8b\xb7;v\x01\x1c\x8e\xe8\r'\n\xe5\t\x06.\x10\xd3@-:a\xf3\x15Q'Y\xaa\bD\x8a;\x0f\x88\xb3\x1c\a!\t\f\xa2Eh\x00\x19J]\xfc,b\t\x10\x14;\x88\x99\x00Į\x03K\x1dg\xa0\xc1\xbe\n\xe6\x00)/\xfa\x1a\x85\x9d8^\xf4\x04ʈ5\xa2\xfc\xa9\x12\xcf\xc5\xd5D\xcaq\x87\x9ca\xe2\xa4\xda\x13wk7x\xddk\xa9\xc8\xdb^09\xa3\xd1\x1f\x98-9\x8a1\xbeD\x18\x020\f$\xa7\n\xf3,`vQ\xd3Nd\xd1#G\xa9\xbb\x05\xdbk9֦Cƻ\x84OH\xb8\x9d\x02<\x0e\xd8\xcd\x00\u0604\xed\x04\xc0\x19%\xf4\x82\x04\x91\xa0\x10\x98\xb8\xcc\x16\x87Җ\xb9Ğp\xce~\"\x98\xac\x9f\x8a?\t\x1da\x1d&y\xf2\xfc\xd5\xc8\x02˼\xa1E\xbd\x0ej%\xb6l!GnRs\"\xd2\xf5\x1eϧ\x88\x00dk\xc7\xc2G\xd1\xdfՑp\x9cCb5$\xf7*\x01\xcb\xf5i\xbd!Y\xa2\t\xbf\x8c\xd3Y\xcbbH\x88:\x80\xf1\x88\xf1\a\xe7\x8bC\xa1,*ܨ\x8c\x1f\x06\xe1jږ~f:.\xa0\x86\x16)\xf9\t\xdbOņό\xb4\xcb\n6\t^֦H+C\xe9\xd9\xcd\xc4%\x00\xaa=Q-*\xacc\xb1\xeb\xe1\xd81R%]\x18]\x84ؑ\x868\xa7j\t\x131\"\x05\x8e\b K4\xf0\x04s\xe48\xe8\xc6\xcfr\xceC$\tR\xe8j\xac\xc2H\b\x03\xb0\x1c\xa6%\"\xe1^&\xbf\xd1\x12\"\x06\x16\xc2(8\xf5i\xb0\xae\x02\xf0\x87\x91!ޔ\xb3\xabr$\x18.g\xd2\xdd\xfb!|\v\xa5N9\xc0ӄ\x85?Rf\x93\xbc<8\x17\xb0_\xa1\x1d'\v6\xc9\xf4\xd8iJ\xba-\xac\x9f:z\x88\x12f\xce]a\xb55\aą\x9cR\xa8\xba#c\x8c~\x06Za=\xb6b\xe1\xa2\xc2\xe5W&\x87\r)\xcb\x18d\x84\x97Aď\xf6\xff\x8e\b\x11`om\x11\xab\xe2\x8cf8\x84\"\x80z\tk\xe0ر\x9e\x8e(\v\xb1\x18:\xc0:d4\xe4S\xd2[\x04.-\xd1\xdb\xcb~\xc1\xae\x8d\x16\xb1H\x8c\xe2\xaa\x00\xe7\xd9\x13`\xd6\x15U\x11@4l\x1c\xb1\x84\xeb\a\x89\xa7\x990\xb8Ħ+ާC\xc1\x8db\xcd'\x83I\xdd\n\x14d\xa0̝\xc4EN\xfc\x97Tt\x9c\x81*\xc9R\x96\x0e5\xd1\xd6`\xa1\x00(\xe1\xc56p\x81\xdb\xf4\bz\x9a\x8a#xפ\x05\x1e\xb0:\x1c\x91\x9d\xaa}\xc7\xe1-\xec\xf0\xeaX+]Fc3\xad/\xd4\x02Q\xc5C\u0602a\v\xed`V\xe0\x8e\x1d\x88a\x05\x01\x1c\x92\x13j0\xfcu\x87\xa7\x84\xa2\x0f\xc8ʀ_\xf4<\v\xdcnX\xe5̈́\x8c\b \xad\x06\xa9\x18tiVS\x16\xe9\xc1\x04W\x965\x0etۥe\xe7\xc2XK< \xf2\xa9\x9a\r\xb6,\x00\xd8\x15\xf6\x85sD\x89i\xa7\xacD!\x85\xa0)\x03ɤ\x91\xf3\x9b\xd08\xa1\x19\xa1\x92\xf9)\x13\xd6&Y\x1a\xf7S\x06\x1apV\xbc\b\xb1x\x1du\x86\x16lY$z>\xca\xfc\xe2(\x85\xba\x82\xb2x\x12P\x96\x11W&;lN\x14q\xffʖ}\x13\x1c9`9\xf8\xa5/\x81\x15\x14::@m\x99m3\x9d`\xed\x1dX\x0e\xf0j\x84ö\xae\x8f)q\xfd@\x85\xa49\x02\xb9\xb5|\xf0\x94\xe0\xb7H\x03\xb8K+Xw\xa9%ʨ\x93}1\xcd\\_\x12J\x81\x1a]\"\x86*\x14Gd\x17\xef\x93\x11\n\x97\xab\xecC\x8aE7\r\xb1#3\xde\xe5\x10\xb0\xc3Q\x88d\xac\xcaO\xbbV\xb8Q7\xcd\x1f\x12\xbbZ\x13\xafx_\x90!\x9d\x19CT\x0e\x83\xab_\x90A\b\x00 QE@\x96v\xab\xa7\xf9`\blA\xd3\xeb\xa6a\xe3\xc1h\x84\xd5\xd7\x0f\x87hd-\xee\xddg`I\xf1\xaa\xac\xf7\xb5\xc9\x02\x15=\x9f{\xb6\xd3Xѳ\xaa\x1cvw\xccF\xbb\x10\x04X\xf1b[;\xe4h\x99\f\x98\xd1R=\xf4\xb6xgo\x9c.\x17\xa8MM\xad\xc0~aׇ\x9e\xf9L3\x915h\x83\x01I\xccrȍ\xba\x12)F.\"\xd4\xd4\xc9\xfa\r|\x8fm\x96\xf8U\xc91/%\xbbp\x9bq+\xed\x8d\xd1P=\xe1\x12\xec\xcf\x05aK\xdc'|\xc6\xc4ו\xc5Yb\xfb\xfb>_\xa2'\vG;3\xf9\xd7S\n9\xa4Sc\xefQ\xb7\xac\x92\xd7!\v\x93D\f\xd8\xf2D<\xb8\xae\x99b9΄\xc4,y\x1apA4SRߪ\x89\xd8*J\x12ˇ\x16fҪ\xd1\xe8\x8fAcip3\xa4\x1cBL\xda'1\x97\x06{\xea\xbavM\xea.\x87\x8af~J4a֙\xf9\x97\x05S`\x1c\v\x1a\xa2\x89\xb8ќ\x94z1\v\xed\xa7Ag\xed[Q\xa9+\x12\x13I\xb1I\x14O\x89\x8cr\xdf\xd2\xf5\U00012a10\xdb\xd5\x11\xb8\x97\x01A\x95\x02\b\xbd&\x86=\x82V8\x13\xa0\xc7\x12\x13A5\xb6\x12\xbc\x95\x85\xaa\x1d\xb3Y\x00\x900_YN\x8d\xa2\x88!\xb2\x16\xc0\xbc\x86\x90\xfa\x9aHG2\xba\x94a\xaeQ\x8dCQE\xd1:Dh\xa8\xf2\x93\xec\xeaIx\x17\x8a\x1d\x8a\x96\xb7!\x12D\xd2\x1c\xfa\x14\xa3\tk\xa9\n\xac\xd7\xcfğQe\xb6F\xfez\n\x12\xbf\x1eĻ'9\x10Hd8\xdb\xdd4\x1b\xef\xc0\x80K\xe2R \xce\f\x94&\x92\xae\x96\x88\xfb%\xc4pVĦ\x8eq\x87G\xcci\x89\n\xc8\x15MA\x87\xfd\xa0\xa4\x00\xc6\xe9\a\r\xa4$p\xb0\xe9\x02\x86@5\xa6+b\x81tgQ{\x0e\xbc\x84\xcdI\xb6\n\xb3\xc7,\x0e\xeav{\r\xdf\xdc\xe9&s?t\x82\x02\xf8\xec4@\xe40\xcd\xc7|\x1f\xf8\x1c[c\xe0ֵ\x81Ԉt\xeb\x12\xd8\xdaI\xb3\x98b\xc4\t\xc7\xf9\x94\x93\xaeı#\xd9K\xc8F#,\x89\x12'\x0fy\xf6\xf7\x10[ \xa5\xe68\x9b\x12t\x8dUC\x94\xe0^\xb0\xae\xf7\x85Ws(L\x9f\x85\xa0xא\x13\xeeM-/,\x1eU99\a\x94a\\2\xbbQ^HD(\xd9A\x9b\x01\xdb\x04;;\x06t4\xc8\x0e\xef9\x0e\xae\xc4\xd8H\xe4\x12\xec\x03\xf4 \xb9\x14\xd8Cr^\x12/\"t6\x10\xa7\x11.U\xd2\a)\xfe\xb9\x12ҭ0\xb9\xa1\x1c\x1c\x100\xc2\x03\xc7\xe7\x91\xe4%\xb6\xc0\xe0\x1c\xa2\x80\xe1\x10kڱ\x17\x1cؤ\xba\x03\xdfj\x8bY\x8c\xd71j\n\xe8\xd3iJ\x1aCh\xb83\x94r\x15Xs7\xc4u\x04\xe1&Е\xf48\xb2\x97G\x9d\x18\x14|\x90\xdfH\xf8\xac\xf4\x1e\x04\xe5\xbb\xce\xd9\x12\b\rJ\x9e\a\x88\x1d\x85ȷH9.I\\e\x83Y\x13\x19\"9\x02\xeb(\x17\x87\x85̯\x917\x18\xec10\xa9X1\xf5\x1dQ\xc0\x10t\v\x19\xaa\x98\x14\x1b\x12\xdf\xda\r`\x8aN\x93\x13\x83\xe8\x04ah\x1e\x02ٺN\xce\x1c\xe2\xd5P\xd4r\xe6\x94d\xe7\xc0\xdb;\x03\xa2$y\x16\x1c\xd5g\x19\x80\x02\x1bD\xb2쀪A-e.\xd8'O(y\xaf\xd3\xe0\xf3i\xb2]/\x04v\x05n[\xe5@\x15\xf1Ē\x01\x0e\x1d\xb7e\xbb\x16\xc7+\x1a#\x01\xab2Nݗ\xec\nP{\xc4N\x8bW\x93\x19\xcd\xc5\xf6\x81\x06\x9e\\\x84\x182\x85@*8\x89\x84T_\xae\x17\x8cE\xaald$G=\xbb\xeb\x99\xf3J$!\xd2\xd0\xc0\x89\x85\x0f1Ͼ\xb8\xb7(.\x99\xe2\xd9j\x9c\xb3&~.\x86q\x9c\x9eE\v\xa7\xc4r\ae?\x85\xe1\"\x80_e\x91\t\xfd \x8e۶h\x9e\x05O2Y\x9f*b\xd7n\aW?aP+A\x9f\xc4r\x10\xe6U\x82\xb0a\x8d>I\xe58\x87\x12\x84\x83\xa6\xa5\x12\x93\xbf\x84\x96\" !V\x88_\xe5r\xf2ЛI~\xab^\x80\xb0\xac\xa4\xedq\x92\vq_\nR\xdbK\xc8;\xb4\x97\x84\xa9\xcfe\x8c\xa1\xa5\x8dO\x8a\x83\xb6/\x99(9\xb1\x87\xd3ע\x88\x10\xce\x06\xc5\xcb=̢VPQF\x8baKB\x83h\x89\x91\xe1i\x9f%\n[\xb3\x8f$\xeb\x80R\xe6\x10\x92\x052ߧ\xa8l2\xc5a\xaeھ\xe4\xe4\xd1ȓG\xdd咹l\ba\xa3\xe1\b\xe9R\x12\xb1\xccA\x11\x94\x04Ⴏ1u\xe1\xb4Q\xcb\v\x8d\xb4$\x01\x03\x13\xbeJ^\x8c#!3\x8c\xb4\xa2}1\xae\xe1ר\xd7Tȍ\x87\x10\x85,\x9fbd\xc6\xc8Y\xcb\xe3FK\x04s\x06\xc9e\x02\v\x14P\x80\b\x1b\xb4&\x97Ĺ\x87\x81\x10\bbɷ\t\xd0WR\x1b1@\x06\xb3\xb0\x9a\xa9X\x87\xc4\xd75\b\t\u007f\x81\xeb3\x80nJ\xbe\x1b\xa2\xa4\x8e(4\xa4\xad\r|>\x90\xad\xed%\xa1\x0eW\x1a\x1a\xf32\x82a\xbbG\xd5fy\xc1\xf5T\x82\x80$\xc0)!\r$\x1f\xe4\x84\xcae+\xc43\x05\xb0\xc1\x18\xdbe\x91ߨ\xa7\xd1r\xedgѝ\x18\xbf\x84\x13\x19\xd2\x10\xe8\x15j\t4j}\x9fO\x19\xe5\xa5:\xf0\x1co\xc9\\]\x92\xbb\xc8X\b\xd2\xe1(\xb3o\x90\xde\xdbΡ\xff\xe0\xf8\x11\x18D\xe6\x90f\b\x05DK\xed1\xab\xff\xc8\xc2)\x0f\x86TZԗ[b\xe5\xa7uĶ7\f\xf7\xc7+\xc28[\x1a\xc0N\xc0\a\xa4YT|\xa0W \x97\xb6\xe7$&\xb2\r4\x05/\x11\x19\x1fs8H\x9fO\x81Q\v}\xb2\x0e\x8b\xc6&\x81i\x14\a\xc067\xbeV\x82\x10\x95$\xa7l7ȕ\xa2\x9f\xe1\xe9\x1b\x89D\xf0\xb2\xed\xa3\x9d\xa4\x1c\xe7\x96p\x12\f1\x8b\xe3\f\x1c\xf58x*e\x9bbJ\xcc\x1c\xa8\xfbXD;\x86\f\xa2\xf9\x04\xb1mW\x82r8\xb0\x8aCIJD+bC\x15\x1f\x029Q0\xe2\xa4Zv\xbd l\x96\xa8\xf84ɳ\x94F&\xad\x11E\x8aÞr{\xc9m\x1d\x0e\x8e\x98\u007feɨ\xcbV\xb2rl3\xa7&\xe9\xc0A\x89\xc5\xd9@\x8ex\x14l\xe9]\x0e~\xc6i's\x11\xacф\x03\x84\xc9nw\xc49\xf1l\xbeB\x1b\xfe!c\xc6T\xe4\xeb>\xfb\x1a8ڱ\x97\xf9BPw`|Od\xb1\x17\xacz\xc4r\xb2\x88\xa0ff+\x1a0\xbb\xe1\x9c3d\xb4\xdd\x10\u0098ł#\xcb \xf3\x18^\xc013\u007f\xf2\xb5%\x92\x97\xc0\x17\x9a\x8b\xd6\x1a\xd0B\xa5\x1c\t4\x9e\xb2A\x8a\xec\x8d\t\aij\xbd\xc0ː\x04A\xd6d\xa5\x9f\xc4\xe9\xa1\xe4]\xa0\xce\xc8JP?Ŀ\x868\xc1`\xa1G>\xd3\xc1\xb4\x87L6\xa1\xac\xa5\xc4yrV\xb6\x82>\xb7\xc7\xe6\xe16瘓c\x01'\x0eS\x11z\x8cuXxs\x12M=\vUD\x1d\xb6\xc1N\xd4\x10?\x84\"I\x12cxi\x959\"*j9q\x1d7\xd9u,\xc0\x0fG\x16\xbe\x16\xf8\f\xa3\xd1\x16.~\x1c\xe2Q\xbb\xa9\xa4jQ\xe0}.\xeb\x1a\x8e\xc9\xfe\x83\x86\x0f!j\xc8\x1fɞO\xba\b\xe3F\xf8\x12Y\bZP\x8f\xc4ߐ\xb3\x13\xd3\tq\x8e\xb2\xb0\xf1\x9epx\xe2\xb1\xe4I\xd8\x17\x05\xb1\x14\u009d1I\xef0\aIؔܣ\xe0t\xb4\xc9H\xec\u007f\b\x80\x12\xf6\xd9r<\x02\x9c&[\x0en\x04ʕM9ؠ/q\x9e\x94\x9a\xd7\x17\b\xc9.\xbc\xb2\x95s\xa1\v\x92\xe8\x90xZݎ\xc9\xfd\xc3k\x9bXK\x8b\xc4<\xd9\xe3\xd9\x1a+Q_\xa2\x1cr\xc8>\xf9\xae\xa8\xbf\x94\xaeA3\x81'\x91}9Ђ\xc5S\x93C\xf9\x1bi\xc82\t\xf6\xef\xcci\x87n\x16\xf2x$\x82X\x83\xc4\xc7\x10\xf7\x0e\a\xe0p\xcca\xf0E\xe1\xd06CFvW\xa2BqaT9\xe6\xb7'\xe1\x13\xc1ʑ\x15p\x80\x03s\xecGӇ\x9a\x1c\x87!\x97Sr\x9a,u\xa8Ź\x80\x03V\x95\xc8\xf6\xc8\b\x10}\xf5\xe8\xf9@\xcb>\x8d}#\r\xa2\x8c\x1cb\xc4\x14\xbaB\xa6\x98\xd6&\xf1\xa7}\t_\xc3\xf4\xa7n\x1ad;r\\\xe15,\xe5\xfb\xc12K\xb6&\xc9~fݑJ\x11PZ]\x95\xb9a\x92\xe6E\x18\xd2a\xc9&\xb9\xcc\x1f1\x83Q\xa0P=\x04\x9a\x85P6F\xfb}\xcft*\t\xdc!0[l\x1b\x87YNu\x8f\xb3\xab\x82r e$h\xe5\xf5\xbcx<\x990)\xdf\n\xc7I\xdc\xdepmu\x0ez\x99q\x86\x18hce\x89\xe9A\xb4\xd5\x17C\x0f\t\xbc\xf0#\xd2\xd28(\xc9\x05̶\x1f\xf2\xe4)\x8b\x86V+.\xfe\xc3`\xfc\xecK(\x16\xc5(\x1d\x86D\x13\xb6\xf9\xb1\xbd\x8c:\x96\xdb\t\xb9\x1d\x854r\xd0>}\\c\xd6\xd6\b\xa3G\x93\x86t\xc0\x00\t\xc5\x18\b+\xbe\xdc\x1a\a\x01'l\xe5\x0fs\x90\xcd Fms\x96O)\xd4|\xa0\xc5S\x91\xa4\x19T\xe4ы\xd8\x10S5Q[;ɌpiVĄ2$$\xba\xf9@JʤYI\x18\t\xf0&\xf3Q\x85\u0096\xf3N`F\x98\xcf\xe6\xd9V\r\x89\x15\xbc\xc0\\V\xc9A\x8cC\t\xee&v\xad\x86\u007f\x87\xed\x13\xdc#e\x8br͐6\x83 Hx\xa14\xb3=\xf2-\x1c;g\x93\xcf\a]\xa0\xcaW\xe5\x98$\xaa\xd2ҕ\x02-\\\xcd%\xf6y,\x8ee\x84$\x1d\x91\x04\x04\xb1_Ώ(\x94\x9dd%\x95\xb8jN\x0e\x05\x1e22A\xdd\xe58\x14\xdc\xc82\xf1ڡ\xa4B\x8f\x92iX{f\x95\x8ca\x12\x97\xbe!\xd3,\xe1X\xfaa\xc8X\xc1\xf9\xc1\xf8\x8b.\x9b\x049\xba\x9a\xfb'\xc5\x06p\x97\x834_}FB\x89\x19~\x97c\t\x88l\x05ɗC\xdf\xc2\x15\v-\xbb\x14\\\xde\b\x19o\x87R\xae\xe5X\x1c\x80\xc4i\xfa\xa9\xa4\x1f3f\xe7\xa2\x00)\xd7\xe4\xa0\xd9ړ\xf0\xb8c\x1eE\x80\xd9\a\xa2\xb8\x93\x89\xa2\x1f\xac\x11\xe5P\u007f\x85\xde\xc66\x97\xfeQ\xcdE&\xa1o\xc9\xca\xd2(q\x90\"\xb9\xc8\xc8\x03u \xbf\xb8\xeeu\"i\xd4\x10^\x88\xe3\x16j\x00q\xfd\x13+ިnP\x88P\xbb\xabX\x9f\xb3\xd0P\xaf\x909\xb49M\x04\x11n7˘\xa3О~:\x0f\xd6Ͳ\x9b2p\xc4s5\x83>\x1b\xc2w\v\xf5tn9\x98\x8f\x83c`Ȱ{);\x99H\t\x9aQ\xdeU\xd5f\xd5:\xb24E\x81:{\x82\x8fš&\xf2\x1d'\xa1\x9bE-\xe1j\xecdU\xb3\x1ab\xd8\"\b\xc1\x8e\x97F\xa6T\x93\x06F\xb5L\xc8\x05\xc4vT\x14#d\xa5 \x8e\xd6b\x85\x95\xce\xd1\xcb\\`\xc4x\x90\x9c\xf2fz\xf2S\xa0\xd2\x1d\xc2\x1dX\x1f\x92\xc2\x17\xe4\xd0ጟ\x10~z\x18\xf0\b\xf3U~B\xd1\xdd\xf0\x8c5ɛd\x99h\xd1zQO\xb9\xc1@\xca*۹%+\x80\x13\xc4PKC\xb7w\xc3I\xbc\ar#1\x84\x04\xa79O6g\xb5\xbbl\x8cY\xeb !\xda\xc9|'T\xa0f k\xb8\"\x89\xc3\xcc\xd3B\xa9,\f\x12b\xf9*\xaa\x1b[\x1ei\xa81\x90\x12M\xe5]\x9f\x19^Yf\x89\xad\x12\x03ZbI9\n\x86\xe6\xa6c\xa6\x19L!\xb54\x84\u007f\x8b\xd9\x1d5\xb5C\x1fr\x95R\xc6+\xb4\x1a\x0f\xa4\xa4\x165ؽAV\xb9\x058\x05\x81\x84_\xf6\xed\xd4.b?\x13\x19\xdbO\x8b\xbf\xa8\xbb\x15|\xe6\xd9\x12\xd2e\xf1\x84,\xef8\xab\x87\x94\aK\xc4\x1d\xf6XSCv\xdcI\xb2\xfac\x12f\xcd\x0e\x96J\xc8\rdE\x96\x19!\xe3ն\x9d\xd4\xfd\x1b\x04ʥ\x94\xed\x12\x17}E(.\xc4߶\x14Z\xda\x15\x8fS\x8d\xbd\xbd\x15\x11j\xe8\x16\xa4l\b)܋\xd3)\x91\xed\xc8.\x0fB\xd4\x1f\x85Ւ\x01\xaa\xe5%_]Jd\x96\xb2dp1\xab3\xc5#\xc8\x11B\xeeI\xfd\x1dv(Rޟ\x9d\x15?\xaa's\xeb\xe6AG\xae\x04\x8d\xa8\x9e\xaf\x8ez\xe42\x93\xac\xcf\xca\xcfq\f\x02ǃ5\xd3\x009\x9c\bp\x04\"\x01YJ\x9e:{d\x90G\xd6Ē\x99\xf3z\xeb\x0e\a3`m\xf3\xbe\r945\x91<\x14z\xd4\xf7\xa1<\a\xc595\x82+x\xe0\xe5\xaa3x\x04s\x05\xec\xc7'\xd9m\xe2\xe9b\xd4ıPޅyEU\x9c,\xb0\xcdP\xb1\x80\xa3ԉ\x95\x1de\x86r\xd2\xdd$\x1a\x81\xeb\xe0\x87\xf0ޖ\xd4\xe0\xec\x06\xed\x96\xfd}\xb9\x96*Pp\xb9\xa7\\\xc9\xe7N\x16\xa3\xd1\xcbU\x8a\x91\xf2\xc9UQDĶP˩\x9ad\x9e\xaf\x84\xdb(P<6\x96\xa2s\x02\x84\x0e\x04\xcb\xd7\xc5\xde]O9\xe2\x94\xebI\xe2Q\x02\xcf\v'\xe4\x1a\x11i\xbe\xaevp\xe2\x06O\xb0T\xc8\x11k\x8ax\x15y\x93r4\xc8\xfa\x9a\x9cA\x8e\x96\x8e\xfdP키PHXHr~y1\xb2R\xc6E\x8d\x8d/\xec\x81\xc2Դ\xae\xc4dČ\tA\xf7A\xf8S\xe2\xb2&x\xc3\r\xa0\x81;5;\x05J\xees\x82̥ͥΛ$\x1a\xc5\xddoE\xaf:LCQDv\x97\xa3\x95\x82\x9cO\x838K\xfb\xb6\xe4\x88\xe6t\xbf\x86ͮ\x93f\xac\x9d\xddU\xa5eY\xc9`\xa8{\x90\xca=\x13\xa4\xba\x11\xbe\xdbc\x1f\n\xd9S\xdaV&\x93\xec\xbf%N~\xc5K:H9\x0e\xbc\x91!E6\x1e\x06\u007f%gڗ\x12\xa9nbلB\xfc\xb6\x13\xb3QY\xa6\x18\x13\xbaI\x95\xc9)4誐®\x03\xd2U\x04H\xa0c\xac,\x06ض\xc4\\\x8a/\xa6e\x89\xedr\x88\xb8d\r\xd7\xd3k\xb9\xa7\x83\x98\x81\x1c\xc6\x17\xb4\x92̞W\x15[\aښ+\x12\xbb\xca\x16ꆗ\xa2O\r\xae\x9aFQ\xb2\xa9+~\xd4L\x17\xb1\x9fs\x04\t\x92\x0f\xe5V\xf7-\x93,\xfa\xcc\x11\x83\xb5Bf\xea\xb5X\x00\xbaiHʖ'̒ܓta*\x1c\xcf\xf7\xbc`\xf3:\xdd\x10%s\xf5S-\x8fNHjΙgp\x8e۹R\xa9}\x9f\xddN#`\xd9\xe3\x80\x121\xd2v?W3B\xee\x96AE\xaeH\x8bD\x1f\u007f\x8d\xb3܅\x82\x12\xe1v6\xb0+\x189TL\bJ\x01at$s\x95\xd7\u007f\x88\xa9+\xa5\\6\xbe/a\x818\xd4TC$e\xb4B\x18\xb7\x94\xabwM\"\xb0\"i\xcbt%\x87\xc1\xa2H\x86T\x9c=2\t9\x89\xa4\xb4^\x8avR\xb0(\n}ʛEez\x90\x84\x13U\xb2n\x03\xaf\xc1PÒ\x80\x05\xba\x03HV\b\xa9c\xc5\xce\xddI%\xa8\x84g9\xe7\x89\x150\xc2Q\xa9\\9\x96\x8b(\x91\x97\x91\x02f\x1b\xb9\x12\xd3\xe5PJ\x1fW\\C\\\x8cl\x9e@\x83{\x8d\xef\xea\x12JdKuj˚y\xcbr~\xf4\x81\x0f^av\xc1\xe0\xe0\xed\x89\fmQ\x99c\xc9D#lE\xb7\xff\xc1\xbb\xe8p\x02\xa8S\x8ea惶C\xc0L\xb8\x1f\x9fL>\a\xe4\x1d\xfa\xec\xa69>\xa7\x8f1\n\x9d\xc9])}p\x9d\n\x8d\x1d\xdb|\xd2\x1dPV0\xa1\xf7\xd2\x00\r\xc9g>\xcbR\xd6%y\x81\x8a\xcbH\x94c\x1a\xeaІh>̚ne\xf7wi\xa5!\x1f;\xf3o\x12\xf6\xef\xc8]\x9a8i9W\xf0\x14\x15\x1d)\xaa\x14*\xdf\xd5l\xbe\xfe\xe3^.B\x8b\xac\xb8\x83̙'\xb70i\x8a+\n\xa9\x91\xcd\x06|\a\x8b\x84\xc1H/\u007f\xc3\xf3\\6\x99\x04\x98\xa1\xd6\x14\x82\x04\xbb\xec4\x96\x1b.e\x05\x80|\x06\xc0\x1al/`\xdac\xf7\x92\xe4\x0e\xb2%\xb1\xc6\xecQH\x91\x80]&\xdb\xc8\xecʒԳ\xa7F\xb0\x1e\x8dy3T\x8a⌏T\nPf%\xc3iEf\xa1\xe75F\xb8HNG\xb9\xa8\xf7\x16瞄Z\x10\xb46rw\xa4C\xd9EQ\xf4\x92\x94\xd4\x17e\x1c;VK\xe5\x0e7◂\xe6N+9M\xe6r\xffIJ\xcb\xf2\v\xba\x92\x91P\xceXLV\xdc\xd2I\x88\xb8T9Ǭ\x9e\xa3\xcc\x00Bzl\xa8\x03Bw\x1d8\x94pܖ\x98'YYff\x97\xe5\xbes\x1c{3\x17a\xc3l\xbe\x1b\x18\x1d\n\x9bCѳ\xd8\x1cp\x9c\xe3+\x8d\xac\f\x15\x056\x93]\xb1\x19\x8a\xc6\x1es\x99\x13\xaa\xd03\x88\xa5\xcag\xb8\xed4\xbd\xc2\xc47,Su\xcd\"[\x91\x8c&\t\xd4'kH\x89#\x829ܴ\xccŠo?;M\xe7dT焄\xc3`\x06\xaaJ`\aW\r\te\xa3\xf6%\xc5f\x10\xb0\x139\xcd%\xa6\f\xc3\xcf\xc8\\\x89\xcaWf\x81\xcb\xdfx\x82}.r\xf3\x9c잵D\xaa\xd5\x1cWo&ctKOm\xf1v79\x8b\xf9\x9e\xbe\x85N:\xf2!\xd8F\x92\xfe\xd9\x18\xd5\t\xe5\x13j\xf6zL\n\x15\x85HB9\xa4~\xb6\x82\x91`1j\xbfmÍ\x17\xb9\xe0M\xf0Rʍ\xe0\xd9\xf1Z\n\x19S\xe4\xb1I垗U\x89&oJI\x87R\xc0\x05{Y\xad\xc3}\x97\xdd;\x99\xbc\x8d\x9c\xd9\x10\n\xcdS\x12\x05\xa1\xf4>\x99\xcfg\x14l\"eq\x98CT\xc5&/\xeet\xbcW\x93\x1d\xb3sGt.\xa9\xf1\x0fsW\xb3W.\xbb\u007f1rЦ].2\x80)\x89r\xb3k\xe5\xfb)\x82<\xd8I{\x12\x80N\x9e\x92,\t\x9b\x9a\xaa\x84\xb7\x85\xdc\n'\x85\xcf|\xa6L\x04\xfd\x81\x01F)\xa0\xc3\x06\xdf\x1d\xa2-U\x14$\xc1\x16\xbd\x92e\x1fj{r.\a\xddFQ\x82\x1d\x8fB\xbe{3\xdcf\x85\xe7n\x10;\x91^ٽ\xd9\xc5\xc3C\xd1\u007f\xad\xe0\x8d\xe1H\xee\x10\xd50\x88\xa5\xe6xEn;\xd0\x16\xeb\xe3^v\x1f\x106\xe9Q!a\xc7q\xdd\x03\x0e\xe8$\xa8K\xf95\x03\xbec\x05\xad\xefP\x88\x89Q-\x9e($A\x11z\xed\x84B\xaeY5\x90Z\xb2\x96\x94&\xec r\x9a\x92ϒ\xb0\x90\xfcs\xf7ˠ\xf0\x0e\xbb\x96\x18\x96Ff\xe1\xa0<\xdf48\x92\x18\xe7;\x8e\xe3\xe0R\xc5Yp\x92\xc4vu$I\xbd\x1e\x10%1\x85^\xb0\xd3\xe0ےTcb\xff]?\x97*A\v\x8d\xef\xea\xc6\xf7\x1aŐu\xf2\xfa\x87\x14\x96z\xb8\xb7\x1a\xa9Br\x13\xf7\xdc\xddE\xaa\xa1N\x90\xdc\xf1\x86\xee,\xdc\b\xd9\xe9\aA\xd1!xеI\xc8\x028Ε\xbe;\xe2\xec\xd6=Ijb\xf7\x8a\x14\x89\xc6 \x05\n\xc6bvO\x15\xe8;\xf6\x1dC\x0fN_O\xd24\xb9\xe2m\x9f-\"\xb7\xebv\xe1\x82\bi\xdaE\x1a\xea\x16\xb2#\x8c\xacn$\xa0*A\x03;\f\x15\xd5ɆĶ\xc0Pċ\x029S\xbeG.3\x14\xbe\xddx\xee.\x85\x12q!\xd65\nk\xebf\xf7\xfc\xecI\rV\xa2\xde}\t\xce!\xc5\x19\xd1/.\xber\x1a<&\x87A\xf6\xb0\xee\xe8B^R#\xbb\xcdZȮ\xa9\b\xc8D3>\x968ߣ\xbb\r\xa3\xc2^\x91\x92O\x03\x9f\xf7\xcf\xe3\xa5Tݻެ\xe3\xe0\x97\xa3̦PM\xa0'\xa9\x1b\x1c,C\"\xab\xec$\xf1\x88\x82'\xc3\xed\x80\xc9$%w\v\xc2\xc4J23aY\xab\x83\\\xf2\xbd \xfe4\xc9\xd7\xfd\xa0x!\x0e\xfd\x96\x9c\x10\\\x02w\xf6\xd3i\xb2L\x8a\x1fub?\xf6SqP\r\x82\xa0k\xe4\xee\x80(\xb7M\x94;v\x1f\x86\x1b\xb7\xd2\rSsEG\xb8\xba\x91\xdc}\xa3L\xf9g\xc1i\xd1ur\aJ\x1br\xd40\x1c\xe0\xffg\xef߶\xd4H\x96\xadAxl\x02\x95j\xed\xf5\xfd\xef\xa07\xf9G\x02\x05,\b(H\xd8#\tz\xf4\x85\xa7\x14\x95\xb8RI \x12WA\xbe|\xf7p\xb39͜\xfa\xfa\xb6\xef\xfa\xa2\xa8\x10\xc9!\x88\xf0\x83\x1d\xe6\xc11\x83\x06\xccghc\xb2\xa4\x06\x0f\x9c\xa4\xd2\xf4]\xc3?\xec\xdeO\xbc\x99\x86*g\x1boO\xbbK\xaa\x85\x9bZ\xb7%\x15\x9b\x02ɞ\x88\x05\xc4\n\x04\x91*\x93\x10S餽k\xca)\xd6ml\xb7R\x03\xdcutV\xed\x13%k\x95\x88`\x96\xe6\x8dk\xd6\xeb\u007fv\t\x92\xf9\xb8\x18C\x16\f\x8ahzX:\x06\xcbR\xd3>\xdeQ2F\x91\x1e\xcf\x04\xa2\xcf\xd31\x871\x9f\x17\xdd[\xfcn\xea\xbd\x13Zf\x8cX\xc2\xe7\v?m\xbaW1e\x89\xdfX\xbd\xd4\xd6|\xfe\x85\x8b\x1bl\xed\xff⚱\xf2\xeb\r\x02qBĒ'\xc5_G33\x19\x9d\xa3D\xd4J\tfE\xff\x0e\x92\x11NEq\xee\xa9\tpɸ0_\xa7\xa7\x0erX\x8aZ7Ï]\x02\xbb\a\xf8I\x9a\xdc\rZ\xc0V\xb5\x01\x81\t\xa5t\xd3RDrkю\x9e\xdf\x02;\xbc\x96=\x81Q\"\xa1\xacu\xb2\x9b\xa9\xca\xf9J\xa43\xbdHk\x19\xbe\xcb\n\xbbbg\x10\xf1t\xcb6a\xa2똔M\xed\"\x8aP\xe1(\xfa\xcb5IUP{d7\x95^:h\xf4\xff6\r\x1f]\xfa\xf2\xfb\xf8\xdep\xfb\xdcs\x1f\xed\xf2J\xe4$Q\x83$-\xb5\xcdPYO\xf7\xe9=|\xf9\xb4L\xdfZiWj\x17iƾ\x91\nL\x91l\vМ\xb5l7.\xe0\x8cղ\xf0͉\xec\xf9%\x13\x1aR\v\xa1\x92\x1b3!\xc2oϙ\xb1f\xd3\xce$\xab\xb1\x05M\x9d\xe89c\xd3a\xd0Q\x9e\x9b\x9bm;\ua6f9c6\x96a3\xf3iX>u\xe3\xfc<\xa8\v\x8bq\x05l\x17E\x86\xc8m\x9e\x80c\xa1.\x8fZ\xfehT\xb7\xa2\xf1\xea%-\xd2t\x8a\x9d\xda6z/\x98\x86\xce\xe8\xcc\xd6d\xf8˸\xfb3q\xaac\x89\x92\x88\xa8aKV\x95\x92\x11jw\xc91\x1co]q2\xb0\xffN\x85\xa5\xed\xde\xe4\xc2L\xfciC\xc1t-I4l4h\x88\xe9\xb2T\xfd\xf9\xdf@\x8c\xef\\Q\t\x11\x83_E-)ȳ̐\x97TiGB@\x99\xf6B7\x1f\xba\xa3\x8c\xe2\x13\xbb{CG\xd86\x80\xa3\xfc\xa3W\r\x8c\x81dh\u007f\xbc!T\xa8]$\x11\xeaRB\xda^\x9aћ\xba\xf0o\xdfӫ\x8d\x8da,\xb5&\x8d̿&?\x84\xbd/^`(\x97E\xf7\xf3V\xec8\x8d\xab\x1b\xd3\xd1\xd7\xddb\x9e\f\x90$/|p/Ri\x8a\x0e\x0fё\x10\xb4.\xf0Cꞈ`\x86T\x19\x94Q\x1f\xe9\xbfl'\xcb6M4\x88\x91.\v\xb2\x93\xfd\x89\x18q\x1b\xcd:\x0f\xd6XNJ\xd4\x06 r\x11\x1a\xb3\x1dP\xa8\x98\a\x8b\xc2\xdc\xe8IF:\xf9Р\xea=\xc1\x00q\x00\x13\xcb'`%1\x15\xa4&\xb1i\xfd\x80\xc5-Q\x9b\xdfPG\u007f\x88\xf6\xbc\xfcc\x92hv\xa9G\n\"\xec\xda\xd0UU2\xfcykc&\xb8\xbd\x8f\xfeV`\xba\x1a\xb7I`\xe0\x85\xebG\x8e\xe1\xc0\x8bɺf\xff\xf7\xe6\x10/\xe1-~\x00\xf2\xbd\x04\v^\vF\x93d\x05:\xc0\xed9e\xf6\xad)\x8c\xbb\xb2\xe7\x88k\x9eF\b\n\x85\xa3\xf1\x99U\xa1L\x9bA¸\x85\xd5\xe8`5K\x0e\x84\xa1\xe0\xdcD[\xc7\xd6&*\x9c\u007fR*ޫCq\xfa\xf2y\xfb\x9e\xa4IS\x98\xa7Z\xf9\xd5\x03\x10Y<\x9f\x82\xb3\x06g\x1eM*\xf1\xacc\xa3\x14\x1b\xe1\x8c\xda'\xe0\xb6N\fq\n\x91\x01\xc5JA+@\x06\x89z\x83/#\xac4t(\x10ױ\x86r\xb5\xa0m\x1a\xcbJQ\tn̄\x06q\xc2\xc8\x02\x1aA3M\xc1!V\x02D\x9eY&S.\x164\x8b¡\xc7\xd9\xcc\xd0#!\xa1bE\x05oԑ\xf6\xd4\U000362be\xa26dG\xa1O\xb8 ߇E{\x86:\x8a\xb2\xec/\xd8b\xd7H֒\x01'\xabL\xb5\xe5\xac7AEP\xc0\xbd\xea\xcc+\xd85\xbd\xa44\xa0\x93\x94\xfe\xfe$\xe2\xc19\x8bZ\x9f:\x84\x1a\xb0\xd3xS\xf4\xde\r\xa0u!\xf9ݠ\xbdC\x1e\x89\xa4E\x03\xaf|\xdc\xf6\tӠ\x05\xbay\x92\xb7\xae\xac}9\xf6\xbd\x93ʻ\xccl\xb4\xb9\xbbB\xabA\xf6\xdeM\xc1\xbd\x91\x0e]\xde\x03\xb8\x0f\x16j\xe5\x82\xfaR.\x90\x01w|\x19\x98Y\x1e\xae\xa8\xfaAK}L7\u007f\xd3\xe5e\x00D\x91\x98\xa5\xee[s舆\x04\x99\x99\xe6\x8bY\x8fzr\xa6!\x8dr\xcbM\x04\x89\b\xca\xfc\xb1\x1b\xc0\x9a\xf2\x1a\xbf\xa3\x1c\x8b\xe2*\xad \xd8\xc4\xc2\xe7`\xae\x05eO\x90j\xb3\xfa~8\x96R\xe2\xd2;\xab\xe1\xf4^H\xf2\xcc(C,\xe1)\x05\xb3[J⨁R^k\xe6\xc9LZtf\xe4}'\x9f\xa7\xfe\xeeG\xdeEm,a\xae\x96\x19\xc2\xf4\x0e\xd6\xd4)\xc4\\\"\x10Q|y\x02ѫ.\xc7Ziv\xc0\x98`V2}7&v#\xa4\xa7U\xf8Qfe\xec\xc2\xd1\xd4,\x0f\xb5ei?w\x04\xd6U\x16_U+>\xb4\xa6\x04j$\x9a\x05Y\xfa@u\xaaVG\x87\x96\xc1\x93;쉙\x93\x95\x03kj<\xa0\xad2%\x96tBz#U\x9eYał\xd0`\x15\xddvt̥\x83>\xeaM\\z\x9e\x8cǤ\xc2\xf2\xb8*\xab6:A\xa0E\xbbE\xe8H+:\x19\x93X\xec\xb8\x14\x81\xe8+snK\xa3\xfe\xb27\xac\x9b\x15\x12*\x85F(\x11H\x12\xff-\x9a\bj\xa8\xb1A\x1a\x88mrK];\xd7O\xad\v#\x05\xae\xd2n6$!\xc9c2/7-\xfe\xe4(\x9a.H\xe6P(\xb5\x0362\x953\xe8,Q\x89N\xe7\x1dٹS.\x9a\x98\x18y\xc1|\x02\xedrR\xe8K\xc8`\xd9\x06s\xe5T\xadW\xe8\xfe\x90\xa6\x15Y0\xc7Zd\xee\xa6S\xabQl\x83c۴:5u]23\x04\x01`@\x16\xbd\x1a\xfa3ڭv\x06}\xdd\xc6;\xd2\xe5\xd8\xcb\xdb[sN\xa7\xbd\xb02,\x91\x19OX\x17 O\xdd\xfd?\"\n\x8a\x92\x89NM\xc8g\xe9\x03G\xf3\x04\xe2\x1b\x83\x8b\xffG4\x87\xbc\x9c\x80\xdcl\x1b\x8d8T,W\xb69\xb8I]\xf5\x886\x15\x03\xac\x04`1\xd8\xcf$\xf0|\xde\x1c\xe2s\x82\xe6\xdb\x1eF\x04\x12\x81̌\x83\xaf\x9a~\xe1\x88\x1fи\x8f\f\xd8\xc0\x8f\xa6J_\xf4\x9f\x01JkR\xd9\xc7\x144ӈ\xedO\xedt\f\xc0}{R\xd0\v[*0\x1f7ƥ\x89mL<Θz\aB\xb6\xe59P\x91X!\xcc\xc8\a/\\D\x87\xf6+\xfa\x92WZ\xf1\x05\xf3\x04\xf4\x808\xe1\x04\x93\x98\xba\xeb\a.Z\xfa\b\x16͋\xa1\x1b\x00/\\_f\x81dx\x16a\xec^\xda\x15My\x15J=Blu&r>sz\xfe\x9d\a\x1e2 \x02\xbeU\x10\x89piE\\\xac\x93\x8bP&\x8a\a\xa2ɶ\x8e&\xfb\xb7\xf5v\xb2\x12\xf3@w3l\xb6\\?\xea\xae&\x17\xbd\x19Zl\x03\xb8\xa1\x94\u007fD\xa1\xd7N\u007faM\xa1\xdf\x1e\x05\x1f\xa3\x97\xd8\xc7\x17\xe5\x1dQ;7|\xb8fm\x04\x9bj0\xefn\xcaJ\xefi\b%\xa4&墵~.\xbb\x1b\xf3\x96\xe8\xe3\x00\xfb\x9e\x98(d'o\x89\x06\xf9\xd8\x1c\xccCZ;.\x92k=\xb5\xac$\x04W\xec*\xf9Z\x02B\xde \xa2B˨%\xddJ\x12\x1aQ\x06\x97k\xfd\xd8\xd9\xf2G\xe5\x95ed\x15Vs\x03\x1dN+\x83UI9TE'\v\xc9d\xa9\xf4I\xf6\x88L\xdbu\xa3d\xf3\xdcGGܠ\xe4>vf_p\xc3~Y\x03\xb7-\v'\x92A\x17\nk\x13[Ȥ\xd8Y[ԡSK\no~\x8f\xb1\x90\xd5\xc0\xf1\x83\f\xa2\xbe=\xf1\xe8#W\x19/S\x88\xe4\fl1c\x9057T\x11\xeb,\xd0C\x148C\xedmJ\x1d\x9b\x0e\x13\x00\x00g\x92\\h\x85\x15\xbb\x15\xf1\vjM\x1b\xb9\xad\xec\x10\x12Rv\xb0v\x15\x17\x15F\xea\xd8n\x049%Xw\v\x92\xeaG\x90\x93f\x85\"\x8bH\xa6\xcbr \x05\x94\xadA7w\xb1\x90\xc5\x10\x8e\x1b\n7S\x1f\xcb5\xd82\xb2\xe1벯\\h\x87\x0e/\xac\x9b\xe8\xee@\x1a\x11\x90pl-\x1d\xfe\x0f\xdas\xbb\xa2\x8dՕ:\x16օP\xb2\x85l\\[\xc6\xf0\f\x0e\xb5\xbe\xaa7{ꑞB\x0f\x8b\x0e\xb0\x86<>\x93ww\xfa\xc1:\xa9V({\xe2f\xac\xcc.y\x9a\n7\x06\x91\x88\x9bqJ\xc8B\xb0\xc3\x12\xe6I\xf6.:\xd6vg\xfe\xeb\\0\x17\x11\x8d\x1e\xc9yj\x97\x1b.\x14\x1bu\xe31\x06\xdd\xd64#\xf4\a\xaa\x14u\x8e\xdb\xd5KcKd\xe9F\x15\x06J\x0f\"\xf7\xa5\xe7\x95\xd9ZS\xabf\x82\"\xb1\xd6\xc6\xd7vh|\x98\xd8\x18Ǩ\x86t\xc2\xe3\x9bP\x93\xc0y\x83\xfa\xf1\f}X#T[\u007f\xf3\xec\x9fB\x18\x02a\xe6,\xba_k^\xca\xfed\xf3[\xe3i\xaf\x95\x1b\ac\xefN\xd6O\xe0CX\xc9X\xf5\x9b\x0e4\x9c\xa8#u\x93dt6\xaea\xa8;d\xed\xb2&2\x1d\x1eX\x02F\xc7|hj\xc9Ng\xd4B#-\xde\xd9f_C\x98̀=\xc1\x9aV\x13\"\u07b5l\xb1i\xbd\xd7DI<\xfd\x10Dx#\x97\x92\x821\x12\xc1'5\x8b.\xa4`\xa4\xa2\a\x84\xa1\x0e\xb8Yk\x06\xbbk\x9e)\xb0\xf4\xb2\xaaKg쩔\xb9\x82\xdeOR(\xa6n\xbd\xb3X(\xef\x03\x89\xbe2q\x83\xa7\x16\xe7%\xf9\xfeڽ\xe9>M\xc5mVT&Ƭ\xd5}\x1a\b\xfcwf\x89\x00@/\xac1\x9a\u007fCc\xb2\xab\x1b\xc2|\x8dx\x00ܭ\xaaBD`I\x11\xfa\r\\qZ\x85\x89\x9c\x0f\xbfJ\xe5\xe0\x96\xd0\xdd\xdai\xf4(I\x85\xc3\x0f/\xa5i\xfe\x16\x89\x93\xa1\xc5biʣ\r\xa7)\xd3\xf3\xb2\xe3$\xe2Sc\x8a\xe3\xd4w!\x05~\x19H\x9fw\x00\xb1&\x9ahZMk6\xac\x8eJ=g\x01\x10\xd4șs'ǥOW\xe3$2\x04\xb9\x1b\xf7Vw\x99\xc0u\xba\x03'(4ӥ\xc6\x1a\xdf\xd5oF\x1a.\x18\x96\xc6\xcfXX\xe5qk\xdd,nE\x8e^\x9a\x9a\xab\n\x9d\xbf\xa0\x97\xe2z\u007fu\"T\x1d\xed\xba\xc6j\x85&\x9d;%3NT\xa3Px\x18yc\xb7\xa0\x03*^\xa2\xf3\x9ch\x1f\x9c\\\f\x12Y0\xb9\x0fkF\xaaC\x95\xad\x17\r\x8b\xd5\xec\xee\xc8\xfdY\xc6\xc4\x15S\xf3\x84\x15\xfaU5\xf1'*\x19\x19\xb8m\x98\xe0$\x88w\v\xb6\xe2\xb0\xd9ɶ27N\x021\xac\x86P\xc0\x13w\xd8\xd6R\xbdg\x046?i\xda\xd27\x9d\xb7\xac\x04\x8eUz\xc9\xf9\x06\xe8}\xea \x815\xba\xb5\x12\x82y뫴\xce\xd6\x14Y\a^*G\xedbj\x8d\x19\x01\v\x8d|\xb2oL\xcbME=\xb1\x17Rl\b\x88\x9d\xbad\x15\xa2u\x875E\xebW5&\x9b1\x8bX\xc22q5\xd6\xcb \x1aܘw\x92\x8aޙ\x17\x8e\xdeU\xb9\t\x1a9Դ\x80\xd6\x19\xac\x88\x02\xea\xc2vF\xa3qaq\xa9\x1dAy\x8f\xd1\xc5\xd8\x1dT\x1b\xfe\xb5\xa8\x9f˂\xfc\xd8\x16\xf8\xa0\xb1\x0f\x1d\xa1ɯ\nEm\xd1\f0k6\xedd(\x10\xb0\x0e\xa6U\xe3y\x9b\x8e[ŁM\xd9\xf2<\x00\xc3G\r\x9d\x82~\xef\x00\xc0|\xdb\f_<\x83\x11:|\x9f\xa2K\xdds\xee2͢9ڑ^\x19\x94\xa3\xf4e\x8b\xaa8\x05\x85JC\xb9'\x8b\tf`\x15<\xddǬ\x881\xd5]\x81\xf0\x134\x9b\xf9o'Ė\x9a\xdal_7\x06\xebzD\xc9DV~q\xfd\xdb\x1c\n\x9a\x19 \xc3\xfe\x13}}Vl\u07b4\xbds\x04C\x03RƊ\xac3\xe3\xd6\xfd\x1dw^\xacr\v\x0f\xe7\xc0\x0e\n\xe9\x88T*1\xa2\xb0\x93C\xc6e\xb2rE\x91\xd52&\x9b\x99/ {\x04\x81R\x9f\xad^\x12\xbb\\\x86\x8c\xb4\xd68\xd0\x1fO\xe6f)\xa5PA\xd3x]ZO͠\x1aڞ\x1fP/\x049d(/\xd3\xc0\xf5ط\x9e\x1b\xeb\x92&\xa3\xb4\xb7\x94\xba\n\xa7\xfd\x0e*\xb9n\xe0\x9b\xf42\xab\xffs4\xbd\xd4Ό\xb8U\x9f\a\xbf\xac1\x82\xef¶\xcd\xc6e\xd6e\x0e\xfc\xfeg\xf7\x91.D\xdds}\x94z3\xb4\x97I\xa8`\xd1\xdfbQ\xb2\x18\x04\xc06\xf6l\xb4\xb9CЃ\r\xdb$g\xea\xba\x1e\xc8Sk\xfe|S\".\x1e[\x9b\xeb\vn\x85\xa4\xab\xaay̾Фڹس\xf7\xa3\xcbœ>\x94\xa6,\xf6h3s\x17M\xf7B\xa5;\xe8\xcec\xd1\xd2\f\xe4D(Z\xd7n\xfa\x1a\r\xe2\xa7\xd3B\xe1\u05f6mI\xfeQ\xd3\xcf\t\x89\xa3\xf9N*%\xf3\x9f\xf1M\x93\n\xa7\x9f\x9a\fl\xe50\ri\x93\xaa\xba\xcdɴS\x1d5\xa9\xe3\x11\xba\xd4\xd6(k\x18{\x81W\x99\xe7\xe7V\x8a:\x9f\x96\xc9\xc42\x1emc\x98[\xf64+\x9d\x92ͭw\x8asèxd\xf0\xa7,>\x9a\x18h\xac\xaa*z\xda\xfb\x00sY702\xb2\x14\xec\xe4~y\x8d\xa1\x03\x8d\xb7\xe3\xf2\x1f\x8f\xe6\xf8VDd\xfa\xee\x02k\xa9WU6\t\x17\xb2td\x90\xba\xeaE\x1bK\xd0\"H\xe1\xcb\xffo\xfb\x9e\xde\xda\xd7p|\x13\x96\xe0\xcaゕ\xb7VP\x90}`T\xab^I&I8\xa6\v\x1b\xd4+\x955\x1dT㋱f\xf5Ǚ\xf3\xecN\xabro\x84Tb/%\xd24\xc3\a\xd7X\\\xd9\xf6Iǐ\xa0%`\xd3\x01\xdav\f.t\xcd\x19\x89\xbd\x19\xf5E\xede\xd2\xdf\xd5XH)xLes\xac\xf6\xfb\xff\xbc\x1f\xa2\x14\xc5V\x91\xd1߂\x92j\xd2\x02\x96,WX\vZ\xd0\x18\a\xb2\x9c%V\x9b\x98\xd1HC\xd9(1X1\x04\x8f\xba\xaau\xaa\xdb\xc1\xda\xdfBe\xccX)H\xf6(\xe5\xb1-(9\xa8\xa0\xb4\x1e\x8aS\x19d\x17\x9d\xbc\xb2\"\xd2y\xe2}y\xa9\xb8k\x98$ՅQ\xa2\xb7$\x11˶\xa7Z\xed=\x99\x98`*\xe4\xc7ULE\xfaခx\xddQ\u0590\xad\xa1j\xc9N\xfa\xcfk{\x84\xb3\x16\xbc\x83U\xf0\x06У\x01\x055u\xc2=\xb5\xa8nc\x1a\xeaYK\x92\x94G\x98\xedLP\x13\xa2~\xa9p\xdc\xf3y1XA(&\xa7٘\xf0\xa5v\xa9iv/\x95N\xd9\x00-\xc4i|\xdeʀ\xc0m)L3\x16\xf4\x15f\x8e\xbf4\x84\xbaF\xc1\xb2\x01j\x1b\xfe\x9e\x88\xbcB\x8f\xfa\xc1$a:t\xab\xa1\xac\x87\xfc`bV\x85\xcbB?h\xea\xda!Ӷ #k\"d\xd2^@\x04\xa9J\x9e\xb7\r\xe5\xca˙m\x0e\xf0\xb6f\x04+e\xce\xe4\x95z\xf7\x89@\x83\xab\x8e\x85\x11\xe2\xa7Mr\x03\x9f\x01\x9bQ,\xb2BAl\xea;\r\xe8\xf2!\x9a\xfa+\xb4Fװ%\x1d\x98#\x8d\xdax\xec\xe2?\xf0\xb2\xf3\xe4RĶ'/LK\xc26W\xfb=\x86\x9b\x95B\xf80\x99\xe8\xd8\x19>\x9f\n=\x9aR\xebK\xae\xe2\x93!\u007f\xd5\n\xbbЬ\x97Eta\xb6\x1e\xfc\x93\xf5Q\x8c\xb0\xe7\x84\f\xed\xea\x0f\xe2\x9d\xf3\x14\x1a9\xc6\xf3\xa4\x1a\x9c\xb5\u00ad\xad\xa6zO\xf6\xcf\x11\xedM\xf4\xde\x19\xbf\xd7J\xf8\xb6\xb8M\x89\xe6\xd7\xebNF\xc0\xc2M\x01\x87\xb4\x03\x94a8e\x01U\xf7r\u0558\x84\x1d\x12\x8a\xf4,\x06\x16}\xe8\xc6\xf2Q0\xe9\xd17\xfe[\x94f]\xd6\n\xe3gD\x04\xdd<\xb9a\xa6\xba\xcb\x06\xfbg2?\xe4\x15\xeb/B\xda X\x8cr\xa0\xcc\xe5\r)\xee\x1f\"\x9b\xdfc\xc1\xc4T4\xbdWr֬㖢\x86{/\xa9\xcb\f\xd8X-I\x96\x99I\xa0\xbd\"\xc4:՞\x92La\xacO\x13\xd6\n\xe4#fl?\x1ae}b\x0e%\xe3D\x1a\xa5\xec\x95\x01\xfc5\xa0\x9eZ\xdb\xee\xd5\xcf2\xd1\xd9\xf2ɽ\x8dd\x14\x8d\xd8\xea}\xb2 \x1e\x908\xb3\x947\xfet\xa3\x12 \x90c\x1f\x99\x9b\xf5\x8e:Y\xd2\xd7\x1cF,H\xf0\xd6F\xa5[P\xae\xf3VCH\xb6\xed6f\xe9\xb4';H4\xa76p\x81\xc4B\xa2\x95RhPJ\xac\x10ʶ\xc5]\xf6S;>d\x17\xdd\u007f|\xe2*-;\xf3\f\x11l\x97\xcc\xe1\r\xab\xdbR\xa0\x9b\x9b\x9b\xc9\x006\xd2$34\\\x98AQ\x80ʎ\xb9\xe3\x0f\b\x8d\xd4`Ia\xff\u007f\xb0\xe3\xfa\xa4\x02\x87f\x14\xeb\xfe\x1a\x8c\x1d\x04'\xb2\xa0\x02\x01\x04cw\x84s\xdc\t\x8b菑>\xf3ڗR\xa3\u0558\xde9\x9b0\xce\x04Ջ\xa6\xc1\xef&u_~\x1f\x1eb|\xb7\xaa\xe1\x93\xfbJ\xae\xbc7\xeb\x06\x02Mb2\u07b2s\xff\xd4:XX\x99\x81\x06\x81\xa6Lm\xeb\xb2\xe6SE)\xf4\xfe\x80\x80\x91+\xb1`\xe0>\x11)9,b\xd3&\x1c\u0379\xaa\xa5\xb2\xfc\x1a\xbdz\x91a\x00ۋ\xb2U\x02\nCbF\xe9\b\xf6\x03Q\xdd[P\x94\b`\x19P\x89\xa3\xbb\x8cD\xe6\xb8&\x96\xad?\xf0\xb1\xf0\xb9@\xc7:\x85\x02]Rԏj\x0f\xc6t\xe8\xa8\xe8\x96F\xc3\r\x8dI\xa7\xa9He\x98\xc4>&@\xbek\xb2\xf8ɁK\x9d9M\x1d\xe9Lͼ\x03\x15߀һT\xa9\xb7\x1c\x1c\xd8q]\xdeLjk\xa9\xf0M%(\xfc\x81\xf5\xf7\xad\xf1P\xf5\x9e\xe1\x17\x0em\x12*\x92\xd4\tM\xe0\xfd\x17\xccg\x1d\xabz\x89\x1fL!n\xe1h\x1c\xb7P-\xa5/\xe1\x84\b\x99\xfa]\x14\xee\xae\xc9\xd3HUy\x84\xbc\x9b2;\xbc\xe1\x1b\xbf\x92B\x93\xb5ʗ\x86\u007f3\xf2\xa3\xcc4\x17|\xeb\a\x80\x99\x87 U\x14\xfd 3\x9d=\x16\x9c'\x14?\xf2\x8d\xda$\x83JX_i\x06o\f\xed\xb0l\x10\x9e\x82W\xa49$z\xb2\xf4\x1cH\xd4\xd3Q|\x80\xa0\xecF\x89|\x14\x8cI\xa3u\xb0d!\xd5\u0089\x93\x01B\x816\xb4\x17C\xb6\x81M\x01\"1v\xd1\fe\xa8\xe0\x84\xd1-\x1a\xc6\x02M\x8bmQ\xa3Q\xe8P\xa4\x12\xba\xee\x97\x12\x9b?\x85/\xff\x1e\xb5\xaf\xe1%\x9dÛ#\xefᖮ\v$\xe5\nU\n鉠\xd5\xff5j\xdf\x0f\x11o\xfc\xf7\"\x9ey\xfci{\xe8\x8eE 즫y_\xf9\xf7\xb4}M\x97.\xbf\x16\xb1\x02\xc7\xea\xf0\x10\xbf|ބsxmy\x035\x0eX\x81\x02Ώ\xc1Ʃ\x9b\x85̋\u007fo\xda\xe3W=\x19H\x87\x98B\x16|D!\x1a-\xfd\xee\x05\f\xdd\n\r!U\xcd3Q\x00\xe2\xa9\x00j(\xe0:\x13\xeb\xb3h\xe1d\xeb\xb8'5\xe0\xd6\x1f\xc3Ms]\x98Y\xdfu^\xf3j\xc1Lp\x03~'\xf2`H\xd9\xd6P\xd8k\\1\x18\t۲0qk\x8a\xdd\xdb$\xf7m\xbbW\xa1\x93\x91{\xa6\xa0\x80,a\xe7\xd6\v\xe9ڬo鮸\xa6\xf8Ȏ\r[\xae\xfb\vV\xfc\xc6\f(&\xad\x9f\xcc̜\xf8\xd6n@4&\xfaX\x99\f\xe1\x04\x87Z\x84\xa9Oj\xfa\xa0\x88\x1e\xf9ҁ\a\x10\x92\x87.\xf0\xdf\x10\xceת\xaa9\x88\x90\xa2\x15=\x05\xe8:\xaaF\xe9J\xe5sߙ:\n\xa4\x84\xca\x06\vh\xb5\x9b&\xa1L\xfbQ4\xfdf\xb96\xa3\xc2%j\x86\xde;\x8d)\xef\x8b\xc5\xcaӭa\xa8\xaa\x8a.\xf9c?o\xc3EgC2\x156|\x00\xd1\nfS,\xb3u\x84\x14Y\x01\x9a#\xb6\xe7Ʉ\u0558\u0382~)\x82\x8e̫v\x16Y[B\xd89iM\a\xb4C\x16Ȯz\x1e\x16p\x003=\xb6\xf6H\xbf\xd8\xc0ۘZs\x80\vN\x1a\xd1F\x16E\xc0\r\x951v\xf6튮\xf3\x13\x96\x15\x86\xec\x1e\xac9\xad\xa0\xf2I\x97\xe9-\xf9\xaar\t)\xe0U2\xac\xa9\xe4\x14\n\x05\xa1;{'b\x85\xb1\xa0\xb8X\vh]\xb1p\xf5\xd2&Wc\x8b\x0e\x1c\x98\xedy\xabi\xc1\x9d\xd4\x04\xc0'Hk'$>\xceL\x8ce\xd5\xda\x1f\x1et\xc8O\xad\xc32\x884,=\x98`:\x99\xa9l\xbb\x14\xb8D\xc5 \xec[$OSG\n4J\xf8Чf\xd4,\xbek驀\x8e\x95\xe9\x80\x18\xa3f\xf2J\x11]\x1dMB\xa4\xc7&\x9azj\xdb&j\xf9\xe6 b\xb2\xa2\xf6\a\x88\t\x8c(\rmB\x842f\x06\xa6\x14G\x10\xc2\n=J\xbch\xaa\xfa7r\x93$Y\xcb\xe3\xf1\xc1\xf5c\x9a\x02\xf3\xabmRœ\x8d\xa9\x92\xaaQ\xe6\x8a!E>}'\x9bBk\xa9\xe0\xf8Y\xd6JMV\x16\xf2'\xe6\x01Q's+\xea\x98\x12\xc8\x1f&\x10dZ\xa4{\xf6\xfe\x8e\xcb.Xm\xf4\x99Ej\xa7\x04X\xa4\xfd\xa3D\x92\xf3\x8e,\xac\xb1\xb5\xbb47\\\x14Q\x99\xd6\xd7\xd4\xe0\xd3\xcfUe\x8d\x17\xee\x17\xadTO\xd5&\xb5\xc5\xfbO&zM!\xe7\r\xa7\xc2CK\x82\xfe\x88\xb2\\\x14\x1c\x9b%\xf7\xa9\xf2:\xf2\x82\x12\x91\xfbC\xba+\xa3\x80s62]\xa5\x11$\x8d\xa4\x8c\xa5Bk\x8a4\nLJ\x06L\x19Py\x91Lgd6\xd7\xf6\x01\u007f\x9c\xa9\xbb\xbaK\x86\xc5@\aK\xe9\x1d\v\x8b\xb1\xa1\xb3\xd1\x18\xbc]\xf0\xa1\x18s\x8bP\x8cB\xa7\xa5̒)pMC\xc9\xf1\xe0\xdd\x15e\u007f\xf9&ٰ\xfc\xd2\xee`\xaa\xaa|\x91\x02\x15\xc8X\xdb\xe4xuuظH\x9b\xd6\r\x9b\xc0&$k\xc45\x84\xb7\xf4j\xccHXg\n6*X\xbb\v\x1a\x83.\v\xbb\xf9Y\x84\v\fHO\r_\xb4\xa0[Ǝz\xbd\x9as\xb2SqW\xc5\xd3ʨ\xb9\xac\bE\x1a\xfen\x1dx\x92⬹SA<\xddg\x17\x85\xc1\xe7\x1c|;\xd0\u007f\xe66\x83\x80N\x10]\x15\xc6|\xbc$\vG\x93/\xecw\xe7\xe5Ψ2\xc62\xfd3ч˄\xc7\x14`<4\xc8\xfc*\xde;\x9a!O3ގ\xeeF;\xd3x_Q\xf9o\xe4\x95D|>\xe0\xbcf{\x01\x06\xbe\xca\x05\xa2\xf4\xac\xec5j\x0f3pj\xb5\xe21M\x94A\xf2^\x1b\x1a%k\"*\xf4\xc2\t\xa2~\x19\xef\xc4r\x15\xf3\xa7\xc8\xfc\x85\xd1\xcd1\xe3j\x9b\f\xff\xa8 \x17\x02\xba\xa5\xde+b\xb7\x05\xc7\xef\xd0\xd4m\xd4\xe4\xd6{\n\xb3x,\n\xec\x1bc\xb0I\xb8D\xa4\xbfet$\f\xeau\xd3U}f\xab\xe7\f\x80\xe8\x8el\xf5\x87x\xef\x9b){\xfd\x80&`H\x1a\xd6\x00\x96\xefc!\n\xbb\x85\xe4!\x11\xe4&\xf0\x86%adݵ\r\x152\xb5\xc6[\x97\x02\xd1K3\xbc\x9f\xdf-\xd6z\x11fT\xf4\xed\xfd\xa1\xf4\xeb\x15yw\r[\xff\xc4\xe1\t\xaexd\x12O\x8d\x99=\x8c\x19Y`\xbd\f\x90!\xa6\xa5\x8b\x93bG\xd4\xf9G\xca\xf1\xc0\xfcb\x91\xa8\x1fB\xfa\xb1H\x05k\x92\xbc\xfa'\xe3\xb4\x06\xe9s\x00$\xb8\x06\x9b\xfb\x00c\xab\x9a\vm\xd1\t\xcdO\xfe\xfep\x0e/\xe1HY1tq\x8d\x88\xc4\xc1\x95\xafU^\xfe\x96f#P3\x18|`\xfbu\xdeZk\xaaqե\x15\xfd\xb6\xf5\xbaL\v'$\xda\xf7\x98\xe9W\x1b\xcb\u007f\xe3d\xb4\x89\xb36\b)\xa0dS\x86\xa4\x06\xa8\v܀\xf5w\xfe\xc7 j\xf2\x90Ͼ6%4R\xcf\r)*\xa3e\xceB\xae~}x5D\xa4Q\x8f4\xd4\xdft\x8ew\x83\tNk\xbf[\xcb@j$=t\xf1@\xa7\xfb\xebB1c\x9bM\xd1\xd3\vӝ(\"\x9d\x1a\x16r\x1b\xb3\x1e\xd6;\xae\xfeP\x06\u007f\x86҇\xb2\xe6\xbcގV\xbbH+\xac\xa9\xb6\x8dj`cP\x84\x91i\xa4o\xd9D\xc75\x1aX\xd7}\xc0\x8eN\xa9P=*JЁ*\xd9K\vz\xf13FnI\x96\xf3\xfb\xf6\x153\xcdg\t6v\xb9\x17\"qa\x9d)\xb0=7b\xf9)9\xbaTC6\x86\xd7\x1a\x98\xef\x917\x9d6F\xe5\xa0)O\x8b\xd3,\xa4\xcdV\x06\xf3\x94R\xd1(a\x86˯\xad)_\xbb\x8e$\xc3X\x81\x9a\xfa\x91Rrֱ\x8d.\x9d\x8aĬcY\xae\x88\xd4n\x1a\x18]f\xd1A\x143\xdd\x0f\n4dd^\xce\f\x92\\c\x93\x00\xcejt\x8f\xb6b\x9ee\xfd3f\n\x12\t\xef9\xbb\xa4\xaaX\x93\x81\x88\xd5X:\x19H9\xd7\xf1އ\x89H\x1cU\xd1ׅR\xd3R\xc9\xf5\xe6X-$\x99\xd3\xf4\x94\x1b4Kf\xd4\x13ɓiEL\xff\x03\xe1\xab\xe6\xf9\x86\xe0xa(\x05\xb9Ɏh\x14\x92\xd60\xdc[.\xb8\x88\x13*\xfaH?\xc76\x8aV\x86z/\xd6=\xe8\x9d\xeb\x12i`\xf3Ir\xb9\"\x9b\x17n\x17\x91\xdf\xfe\xe8\x18t\x01El\xa0\x19\xb4\r\x8c\xab\x8c\x1a\xb23\x86\x8eY\x86\xa0\a5r0\xa65\xc9\x11ד\x19\x05\x85\xd815\xab\xd1Ɣ?m\x92E\xf8{蓠ln\x81\xfa\x86\xb9(lF\xa3\xf5\x8eY\x94\u007f2\xa1\xf9U$\xee_\v\xfc\x00\x11ө\xc0\xedQ'h\xa6Gà\xb1\xba\xa9\x8b刹\x97\xec\xe0ۂj\x8c++Zg\xb5\xd9(ђ\xf0X\xfaș\x8d\x15\x81\x1b\xc4!\x93ʮ\x89\xfe>\xdaP\xa4\xff\x966\xbd\x9e\f\x98\xd2p\x1dR\x8e\x17\x10N\xc6\xd86+\x1a\xabd\xfb\xefՎ\xd6F\xcbYB\x90Q\xe1-s\x0fo\x92s\xdd6&\x93\xb3\r\xe6\x9cE\xc9$TK\x96\xd1U\xf1\v\xc0\x9cz\tX)\xe9\x11a\xba9 Q\xd0\x02;\xc06\xa1\xff\xba\x81ڰ\x94\xb8\xf6,\xe3N\n\xed\x1f3QYF\xc3ɮ\xa3\x1b\x9b\v\x94bJe>A\xd7;\r\x1a\x94\xff\x01'U\x83\x118G\x17\xdaPBd\xbd\x88U\xe6\n\xba^z\x83\x17\x8e\xcd\xe3)\x98z\xc4\xde\xe4!\xf6\x87B&\xc4n\xaaXTP!\xd0I\x92SȆ\xf8\bpc0\xb9\x1a#\x83\xb1\x12ͱ$o\xcb\xf4'\xd0\xca\xceO\x89w\xe9\x01lm\xcd\xde\xc4Y\xcd\fY\xad\x99nN@\x1b\xea\xec*\xad\xb5\x86\xf4\xb0\xfc\xa0G艘T\xe9\x80\xca\x0e\xfeSE\x93\xb9\xf6 A.\xfc zy}\xef\b\x0fm\x0ep}\x90\xf4D7\xe1Y\x04\t\"\x9a\xa4\xb4\tv\x01-\xb4\xf3\x82Ĉ\x9d\\\xf0\xaf\xf6\xd1\x01 \xbb\xe4\xd6ǜ\xbc\xe6\xe9=\xa1(\xa2\xcc\xe0G\x97\x03k\x88ޛ\x1b\xfdCg삟d\x1c\xd0M*\r\xff`X\xa9t&\xfbeܧֱ\xa0\x96\xa1\x98\xb5JwB\xc6\x18\r\x1bs\x92\xf5{\xbc\xa1˦ή%\x8d\xc4\x06\x91v\xab\x89`\x02\xa3\x05Z\xf7AW#\x8b5\x1f]A\xc3{\x9b\xa2\xca\"\x06\xc11Y\x17\xd8\xd1\xfc\x10nh\x92\xb9\xa1\xb0\xb6\xe2\xda\xc4\t\xe2\x165eI\xb0\x916\x81\x8eE\x8a\xd4m̺Z\xbe\x90\"\x00\x1d\xc56G\xe6\xe2;IT3Η\xdd\U00063c88E\xab\x00\xf2\x0f($\xea\xc55\xcfRA\x12\xeb\xe2\x89\xf2\x91\xd8\x15+\xe3\x06fE\x029\x9a\xb8#\xe3\x88\bU0VT!E\x12$`8\xee\xc0\xee\xc5\t\xa9\xa2jc.\xb3\xfacff\x9e\x06\\\xbd|\x8dky\x1e<\x11\xd0BnI\xf0\x1c&\xeb\x17\xef\xcd@Q\xaf\x15\xcfB\xcew\xef\xac\xeb5ОJ\v\x97\xbdw\xdc\x15rx\xc6\xefX\x1b\xe4uR\xbaG%B\xb3fw\xdeހ0k\x901(\xfc\x15Y\xd91\xd3\xf9͝\xc0\x14!\xebEk\xc85\xb46\a\xf3VZ\xd3'\x008)\x97\x8c\xb7\xa0\xd4cC\xbd.\xc2\xed\xc3p\x9c;\xda\xd1\xec\\DB\xd7\xd4\xd4\xe1\xb5m.\xbe*\xa9\xfa?\x97\xf7\xf4\f\xb58\x17\xadϋ\xfd\xc64\xb1X\x014\xd4 \xbc\xb2Y\x06\x94\x06\xfb\xa4`=\ra\x93C\x96<6\xafQg\xe4 \x96\x1a%^\x1fѱb\x19衐\xe82C+\xe8\x81\r3ټ\xc7\xe8\u008a\x98\xb7d>\xa3`l~\xecS\xfbV\x1d\xe9\xc7ĺ\x8e\xcd-\u007f\xd2\xe2_\x10_\xd0d\xba\xbfio\x8e\xfe\xf4h\xf2\xb7M\x97^[\xcecI\x82'\x90+q\u05fc\xc2\xe7E\xf0\x8b\x18\x9dbz0*\xfcz%\xbeZ'\x9a\xf2\x8a\xe7\xc38Xлw\x1e\xf4L\u007f\x15jyCWnTg\xfc\xe0\\jJŚ4$T\xa6\x1a,K\xc2\r7\x14\x8f\f\xec\x89㎴ \n\x02\x1a#Dnқd\x97IǕ\x01.\xb1onyvD%t\f\x94&\xde\U000d81d7\xce\xf4H\xd2\xf1K\xef\xcf;\rMgú\xdc\xfe\x9dn\xe1\xa4u\xc7\\\xa0\x1b\xe9V\x80]L\v\xc6\xe8\xc3\u03a2\xe9\x89\xef\r\xa89\xe8(\xc6D\x18\xb1\xe6\xe6\xe3\xb2\xc11/\xfd?\xed5\xb0\b\x98\x14\b\xac!\x94\xa7`\xa1\xaf#UE\x91\x13\x96ZL\x86G\xf7\xc3fI\x9c7߭\xb6\x1c\x16\xb1?\xb4w\xee|ŵ\a\xbf\x96\xe1\xc9\x13\x9d\xef1i\xa9\xffk\x9et.\xdf2vQ\x12\x82M\x1cv\xafcnj\x8b\xa7\x94\xf8\x14v\xb5p\x05\x01\xdd\x12T\xf8%\xbe\xa2\x10Kv\x14]\xb9\xdc{zb\x16c\x8f\xc9K\xf12\r\xc5c\xbe\xbc\xfb\xba\xa8k)@y\xa7@-\x01\xc6i\x0e\x922\xd4\xd9(w\x0f!r\x9a\xad\xf0:H\xec-Fs\xf4\xa0g\x91#m6\xad%\xfcjQ\xa1\xfb̈\x15\xf5\x85\xc6^4\xc3G5\x1d\fک\xe9i\xe4\xd9(\x12\xa8\xab\"أ\x13\x9cF{\xd6C\xab)k\xa4\xc2,C\x15\x16\n\xef\xe1\fi5Y\xb2G\x84\x01\x86\xc2\xd2F\xc2\xf4\rg:\xaa\xd5#W\t0; \xf7\xc6St\x10\x02\x8bR\x19g\x93PsPĖ~\xc7\xc8ƚ\xddm\xb9*\xd3p\x816\x9a\xe9W\xeb\xfd!\xcbd`\xaa\a\x12\xbd\xcd\xdb{\x1bݚ\x1eEh&:Ѽv\x91x\xea\xe6M='\x155\x9a-:\f~U\xb5\xbc\x98\xcfI\xc1\x1a\x1c\xd0\xfa\xe1c\xe2\xd7Q\x92\x9e\xa7\xef&}\xb0-\xcb8\xb8V\"\xc2\xe5-L\x95\x04\x13\x92\xde\xe6\x10\x8f\xef\xce\r\xae\xdd\x06\xb8I\xb6\x14Kͦv\xc9H:\xa3\x92\xb8\xa0\x02d\xc9u\x96\fk*\x91\xd7\x02I\xeb\xd80\x10*حE]\xfa\xaeC@\xd0B\xfc%\x8d\xd0P\xbc\xd2\xd4\xf4\r\xf5\xbb\x01K\xe8\xb2\xfci\xdd[\xb0\xa8B\xa9\x1b\xd0\xff\xc0\xfa\xefy6\xfdk\x99^\xc3[|\xef\xbeT\x8f\xe0G\xd4\xe5\xed^\x15B\xbfKG\xbcь\t\xfb2\xdcbT纀\xbd\xe4s\x1e\xb6\xf6\xe3\xd9B1\xd2ˠ0\xbb=\xfaM\xfe\xbcI\xaf\xe9\xcdLQp\x01\xc6n\xfa3\U0010cb863\x1a\xcd*\xac\xf4&\x1fN\xa0\xa8B\xeb<\x10\x93\xd9\xfcۼ\xcbcD\xc9D\x1b3h\xc7*-\x82]賠\x17\x86\xf5$ܗ\x16瘝a\x163{sN0FEW\x9c\xb0fD;\x13\x9c\"\xaaK\xf5\a\a&\x1e\xad\xa5\x11W\xecU\xb7|\x05\x85-\x194\xefѫ\xd0Uz\vi\x15\x93n\xd3\b\x06\n2\xaaΊ\xa5]\xc8j\xcc\x1f)\x0eKw9\xbd\xf7V˗T_\xa8\xe3\x8f-\x00\xeeE\x06\xb9\f\x90\\\xd2\xcd\"A\xfcy\x16[\xb3;J\xb4a\x8c\xa8\xe9c\xfb\xb2\xda\xd6\u0604\xa0\x1fMZU\x90\x00\x1b\xf3\xbb\xddP\x81\xd8U\x16>\xcd\xe3\x91\xc8\xdb1\xb1n\xc3Xx\x88\xd9\xf7\x04\x14IA\x95\xd7\xea\xe0\xc6,\xaf4\x9e]\x1b\x03\v\x05<ͻ\x8f\x85\xa1\x9c\xae@\xb0\xc8vk\xf5\xcd\xc1Iݘ\xf9\xce\xc7\x1f\x98\xdcrGP^\x12\xeb\xbfK0\x95\xdb\xd6\xfc\x10v\x84B\x16ނdN\x83\x91B8\xc04iiQ\x91\x94\xf2\xa8`p\x19\xd5s\xcfU\x93!2jSf0k_\xc23&\xed\xbd23F\x93U\xcb\xf5\x9a\xadM\x1c]\xda\x1aҫ\xd0uccuf\x02*T\xf0\x88p@\x8a\xc4\x19^\x00j\xc5{\xda\xd60\x89\\\xd3\xc6\x032\x9a\xa5\v\xea\x93\x15\xb0&\xb8Z0ڒ)[*\x90\x1a\x80Ԫ%\xd2N\x98'\xdb|\x19\xb1\x19%\x8dI\xf9\xb85\x1f\x87\xee5O\xe5w#iבNI\xf5\x9dOI\xc9?\x04\x1d\xc6\xdd\xc2iv\xfe\xe4z\x87;g\x88k\xbfnM\x9b\xaf'k\x11A\ry@\xf57\xf7\xec\xe2L\xa8\x89\xb2-,\xb7\a-Y\x8eH\x81\xcd\x00\x02AoપX\x83=H\xea2i\x14\x9b\x84\x05\x1bRC\x91\xe0\x02v\x9d\xf5\xcdc\n\xee\xecҗ\xdf\xf2v\xf9\x83\v\xf7\xe7yx\x17\x86\xf0Ί\xdc\b\xf4\xe6V\x92\u007fLw\x86d\xba\x11s\x97\xa6\xb07\xe2Y\xf7\x06R`\xfa\x86\xeeI\x03\xb7u\xc3\x1c\x18vޏ'\x86\xd8ь\x93\x8e12I\xe0v-Ⱦ\xa3.\x9c\x8c)\x99u{\xa2|\x98b\xb9b\x8ev\xd9 \x8cc*d\xcb\xf0w\xf8\xf2\xf9\xcfoݻ\x15p\x01Ҏ%\x8d\x02\x15\x9d%\xbd\xd6d\xe3Y9<]7+镭S!\xc4\xe3\xba\t\xc4{\x9b\x13\xafV\xfa\x99I\x16\xbd\x02\xc9Ze\xa8\a\x82f1\xf17\x8e\x18\xb2O\xf84\xed\xce\x1d\xf8\x90\x03\xe39\x0e)\x8a\x95:WE\xe7\xach=SY\x1b\xe1Ù\x1d\v67\\y\n\x8b\x90Q*Q\xb8\xdc\x10@\x86\x1f\xa7\xa3_\x8b/\xa13TQgل\xe2y6\xed\x1b9\xa8\\\x15\xd4cf\xe7R\xe8\xeb\x02\xd9`uo~m(`\x15\x1a\xdfՔ0\xa5\xf4\xc1\f\xda\b]\x89\xc4ׯ\x82js`(\xb9s-\xbd\xffQ\xf0)\v(S\x1a\xb9m\xcc\xe8\x05\xdb?dF]kO\xaaK3\xe6\x13\x14i@3\xd7u$$\xc925\xceA\xb4[P3GW\xbfXs\xec\\\xb5\xa5 \x81\xaf\xec\xf2\n\xd65\x1aDOE0[\xe6O5\xd3)\f\xeaa\x88\xf7\xd91\f\xc9\x13+0\x92\x8d\x8d\x18\x9d\xe8\xa7\xeaX\xd8D\xe7B\"\x0e\xd5\t\xb0c\xbf\x1d\xa4g\x82鉅\x8b\x16\x8e\x10\x867\xed\\\xacq\x05E\x13p엁m\x81΄lǭ\xeb\xf6\x19U\xc5\xdc 4\x94\x91mh\xe7\xf2\xf2\x8c\x17Y\xc2O\xa5\t\u07be\x88\x024\x982\x87iMi \xe8cU\xc0\x919-b\x02ϰq\xcb0\xd3\xcduj\xe3Fwh\xd5\x13*e\xbb]l\x902\x0f\x8e\xd0\xc0v\xbb\x8b\xc9\xfd\x8et\x99\x98!]c\xf7\xa16\xb58\x19Lk\x9a锺\xc8\xdat/)\x80\v\xdfǰQi\xc0✴\xb5\xcfs\xecPF\xfc\x83ƽ&\xa1w;\x05\x96\xf0\x9aD\xbd\x05\x1b\xf5\x85\xaf\xfc\x86x\xfc\x91\x97ix\xab\x9c\xf7c\xc0A\xb6\x16\b\xe5l\\\xc7|\f!r]\bǭsi4\t\x18\xd2J\xb6\x10OS\x13\xc7h~hu{O\x83[\x108f[\r%lt\t\xba'Lɴ\x9f\xb2\xc6\xd7q\xe6\x8c;\x065Z\x8b\x93\u007fK/}\xac\xe6\x80\xe1\xb5=kU\v*\xeaSv\x03\x10B\x94Z~\x8a\x9b\x90=\x8b]`\xb4JKrfI\\\x92\xc5a\xcbۥ\xf5\xb4\xa7\"4)\xc2\x14\x95s\xd2:\x01\xfd8\x17j&\xa0\x8d9:\x10,X\x01\x94\xbb\xa0\xb3s\x00\xef\x1e\xb9\xd73\xf3\xe1\xad\xe3\xd1\xc0;tR\xd3\n\xad\xe6\xe4\rc\xfe\apB\x96f\xef\xb2\x01\xd2a\x11\xc80\x0ez.\xb5\xa1^\x9f\xa0n\xa95\xf3\xa2\xc5I\xb2 \xceĽ\xae\xe4\x87A\x02Qu\xf6\x9c\x00\xaa\xe5',\xfa[\x90A\x88y5N\xff\x186\xed:\xae\x1a\xee\xfb\xac\x8c\xed\xdd<\xd0\bpz\xe5F\xee\xa3w\xdf[~4]V\x15g]\x17V\xb7\xfb\x02\xf4\x18\xbf\xfc\xab\t\xef\x87x\f\xfeu\x8e*\x99\xb4\xb6\xe3\x14r\xc4\x06\xe3\xc3.9n\rK[\x9bo\x17\u07bb\xf4-\x99[\x95\xb9\xb97\xf1\x1f\xca\xf3\xf2A\xd3\xceh4C\xfa<\"7\v\xc0\xa27p\xfbn\xf4nR\x85<\U000bebd3\x8b\xe1\x14\x1cG3L\\\xbb\xe2\xaf\xeb\xf8\xc9\xd6;-\x9cJ\xe4\xe2BրQ\xf8\xe6\x10\x8a\xcaeY\x0fV,\xe4\xcaCG\x88\xaa%\x80-\xa9>\xa5d\x82\aF>p2'\xd7T'J$MR\x01A\x0f\x1d\xc2\xea\xc6N\xd8ɚ\x8d\xa9\xa6je\x97\f\b\x05H\xad\xc9\xc7\xf7\a\xe7\x86\xfdq\x96~y@\xd8-.\x85\xcb\xe0p\xc9\xdaX\xe8\x92\x04LZ\x13\xdd*\x80\t+\xa0\xb9\xd4d\x83\xfd:\xedQ\xa3D0<\x98V?\xfc\xe0P\x1f\xf9\x93U\xd5%\xcf\x0e\x85\xe3}\v\xfa\x8cT\xfa\r\xb1\"\xd1Ǣ\xa3\xba|>_)\xb4\xe996\xad6Z6(\x813n\x1f\x1eb!\xaf\x8ah`\xd2\x1ajA\xae\x9bq\xe4\x8c(H\xf8\x9e\xa1\xf0\xf3\x97?\x85;\xbe\x8eƊF\x9fT\xb9\x00u\xe4\x17u\xb3\x14L8\xc9\x04.i'\"\xf2\xa2\x91\xed>\xedB\xa0\x908I\xe4v\xef\xbc \xcdr\xe6k\xb8\xb0Ӻ5\xb9g\r\r\xe7)~\xf9\xef\xed{:\x87c^\xff\xa1\x80\xe3jWDx'\x135\xab\xdd\xc42\x0f3\x93f\xe8\x9c\xda)%\xe8el\r\x82`\x1a\x1b\xc4\x03\x80\xf8\xb9\xf5Ϊ\xd9\xc1icg\xe3j\xe1*\x04Υ\x13\v\xe8#s\xcd\x1a\x01\x9d\xa4\xfa\"\xc40\x84\r\xab\xd4\xfee\xf9\"E\xa6\x89wv\xf1\x8fV,n\xa8\x17\x82}\xe8ќb\xa4\x9eU=\x99g\x02v \xfa\x84\x8f\x13\xa6\xfa\x98\xedH(\x91C\xdc(\x98ܺ\x0e\x86e\xa0\t\x90\x9cꣵ?\xc0\xbd:\x9a\xdd-<\x05֥\xf0\x9a~\xd5ܡ\b[#\x01#XdtU\x14\xa5\x9eZ\xb2\x050\x8f\x8d\xd67\x80\xb3\xc0ڼy\xa4\x80%CPj\xf0\xfb\xe8\xee\xf3\x92^\xae8\xb3%\x12]\xb9;\xbf\x85\xea\x90nP\x8f\x90\xcd\xc1\xa7\xcc\x00JUD\xb6\t\x10\xb31[,3\x92\xd3\x06\x82\xf2D\xe6\x81\x15{\t\xbc\x13\x9b8\x90\x15\xd0\xe5\x9cڗ\xc2ȝ\xb4tϒi\xa6\x98\b\xd5\xec\xc3\xff\xf2t\xeb\xfdA\tO]|\x97-~\x16\xf59Z/Z\xb9q\xf0\x82\xf9\x8d\xfeS\xe2w\xb1E\x02$\xe8\xdf\u007f>\xc7[\b\xafn\xab\xafu\xd8M\xc0v,K\xab\x887,\bq\x81\xa6\xec\x13\x19l\x92>@\xe4ֽ\bf\xff\xf4v\x16ng\r\xb1m\xb33.\x84)6\xc0Īa\x88j+\x0f\x93ն\xe8\xdcT\xa8\xad\x89\x85\x99\x8c\xe7\x11u\xc7\xd4ᶿ\xecn.U)\xb1U\xcdŀ\xc3mH=rְ\xb4K\xb02\x99%1\x96Z\xb9\xc70\x84\xb6\x12W\a\x1d~K\xb3\xb0\xd7\xf4\x85\x1b\xf6\x03\r\xdb7\x90\xc0N\x05\x8cr\x86)\xc8,^\xe1\xd1F^t\xed&\x00\xa1\x9f\xa8@\xf9\x98\\z\x03\xb7\x99\x05R!\xa0\x8c _\xb3\x83\xb9\xb7\x86\x89\xb4<[\xb2\xc8\xc3\xde|\xbe=\xbd?\xd0\n\xdbB¯\x10\x97F\x02ސ+\xafD\x89\x81\xebI\x8d-S]\x9a\xd9\xea\x13\x9b]*b9\xf0@_\x1b\xc1\x01=/\x80\x1b-\x13\x9a8\xe1\x0e\x10\x9cY,\xbc\xbb'\xf49\x1e\xc0\xb1\x92\xe7P\xc3BF\xe7\x98\xfcV\xb6G\x19\xe2\x8cS\xa1\xcd/\xf5\ttJk\x1b\xaf\r᠀\xbd\x8a\xad\xf1\xf0`\xbe\x8eẃ%}\xbc]U\xbf\x14\xb1\xd7_?6簙\xa7?r+\xe5\xf5\x8f\xdeRG\xddǫd[\xe0\xb4@\x16\x81\x18\x94\xea\xa0o\xddjr@\xca+\xf9°\xaa\x80\x14Y0\x01\x1c\x11\x1cNG\xb7\x02\xd7nS\x84\x04\x90h\x99+\x8a\xb5\xe8\xf0\x0f\xdcVE\xc1N\xe6J/\x97\xc9_o\xee\x84x\xbb\x92[\xf3\x80\xd8\x17\x8e\xd8P\xe1sU\xaa\xbd\xb5\xb9\xa8?\xb7\xb7\xae\xcd\xd2t\x05\x1c\f\xab5fM\x8d}\xa3\x96u~\xc2r\x92n\x17\xa0\xdf'l6\x10U2qc\xe0\x8b -\x86\t\xd2\x15ѳ\xabS5\x14N\x86\x04 W\"\x01^\xe7\x87\xcfM\xf8֝\xdd}\x9bĂ\r\xe1\\X&F亯\f\xbf6\xd5=˜\x19aK- #W^\x16\x03\xc7I!Tܘ\xab=\xb6<\x1dh\x83⃦\x85\xda\xe2\x80\x00\xf4\xcf\xd3\xf6=\xbcz\x89\x06\xc6ޅ\x00\x96\xa4Z\xfb\x16\x15\xfe\x81\x01\x84&&\xfdc,\x1b\x84\x97\xabP\xf2h\xb4\v\x15:\xe3\xc1G\xab\xf9$2d\xb6\xaeʯ\x19\xa8\xd1Ȗ\xf4\xe5$\"D\xcb*e}z\xc1\xb2\x10\xe4r͌\xde*\xa4\xf0Q\x19\x92\x98\x0eɑ\xeeLt\xa3\xcc\xe2\xcfM\xf7W:\x92\"`)\xbe\xb1\x15\x8942\x8e\x9b*\xfd\x94\x95?\xabGOZs\xc0\xba\xf3\x01\xda\x00c\xa4QG\xe1[Dg\x11\x8d\xf9\x10\x0e\xe2\xbaHG\xf1!B\xa6\xa2\x00N\x02l\xe7\xcaQ\r1\xf5\x98\x10\x8b\b/\t\xa6ȩ\xe0\xc8\x11%\xbaM\x05\xe7d\xc1)\xa7\xc9\xdb&\xb1\x84\x87Lr\x10\xd9\xf23˱T0\x885'~\xb2\x99\xad\xd5H)\xd1\xcc\xd9\x00e\x83\x04\xc1.9\xd8nC:\bVGF/]&\x85ԒǦ\x0e*\x8b\xdbļZ\x9aDQ\xac\a\xba.KU\xa5\x81q\xa3r#0\t\x86fx\xaeʖ\x03+ l\xd2{pAμ\xcfh\x88\xe5\x05!L\x8e\x05\xc5fTb Q#\x18\xb3fk\xb7J\x82\xf7E)\xceT\x9b&\xc1\x1c\xae\x98\x12h\n\xb8vB\xc9-5\xae\x83@\xe6\n\x18$İ\xb0\x12\x1a\x10\x87\x8b\xcb.\x89\x83C\xf8T\xfae\xea..\x90\xb31?J\x993K\x0e\x117\x8fT6\xc2؈\xe9\xb2?\x90W\xe5\x95[\x9dxc\xfa\xb9AR\x8c\xe2\x94{\x10\x88\xe8Nd\x82\x1b3ϔt\xc2.\x9dV'\xbe\"M\xa1J.k\xf8\xc2\xe81\x8f~\xdf&6\xc60╯ې\x84\xb0\x8f\xd0I}J\x85\v\xfb\xb0\xb5U\x9dj}\xdcx\x16\xa6`\xe2\xaaz\b\xce\x1a^\xf5\xbd\xfb\x16)\xeb#2\xaf\x1aS74\xef\x9a,\xec,\xbcU[\x12j \xb9l6}\x92\x00\x14\riI䩖\xe2$ǡ\x05Вh?X\xafTr\xfcG\xe3\xfd\t7\x00\xab\xe5\xeaN\xf9N\xab\ty\x13\"VC4@Dm\xe41\xa83\xbf\xf0\x0e\xbcF\xa4\x8dH\xb3\x13(\\\xadX\x0eud\x90\x1bAn\xccJja\x1e\x00\x85g\x80\xe0\xb4\xd4J\xed\x800]\x16\x95ǶP\xf9P\xe0$\x01z#\x84\xa2\xe6\xf8\xed\x9dG\xca\xc0\rH\x936<\r\x00\x10Z7\xc9O\xd8Ϟ\xa1Nξz \x9aͫ\xddZ\x98m\xc9\xc7ƭИ^\xa8\x9a;R#\xc1!u\\\xb4f5Oĥj\x99SU\xe6r\xbc\xfc\xe4\x05\xd0e4\xf2\x86\x86W\xc6\xff\xe8\xfdA/Q\xd2|\x97T}\x9a\xd37\x90\x81\xdcA\xfdf~\xfb\x9f\xf7\xf0\x12]ܻ+\r\xf6q\x8f\x96\xe9+\x03\xd8B\x02B&Ó\xc1\xaf\xe5j\xaf\r\x9a\t\x88\x10\xccg%\x97\x01FIo⌆p\n$\x98\xaa\xd3\x02\xc8\xd0\x1d\x00\x87c\xa0#l\x15\x95}|\xc3\ue535\xea\x17\xed\x91mV\xcd\xcf\x04\xfc;\xa0\x17\xe4 @\xe3\x10\xe1\xec\x8e{Ȉ>R+\x93śE\xab\x92\xcbr<1\xbf%\xc1ɺ\xae\xb0\x16)\x1e\x8e\xffD\x17t\x84\aά\xf7\\\xd3\xdb\fnO\x91\xb5Hj;jя\x1d%\xb8\xe5\rZK\x8e0\xe5\xc7-\xf4\x13t\xd7u;\x06\xbd\xa4\xa3`\xa0\xa0T\x9a/`K!pB0i9*\xf8\xf7<]\xc2sy\x1c\xd2\xf8\xd2\rWs\xb3\x86\x95\xd2\xcd\x1cƓS\xeb/,\x00\x96F\xa7\xb6q\xa2\x92Ak\xa7Ʉ*\vV\x99\x17\x84\x8b\x94Ӟ{t\x8aBC6\xae\x16\x895ds\xa5I*L;{\\!\xf0ۻO/\x16\xb4\xfc;F\x80\xef\xcbǎ\xc8\xfd\x92\xdb,\x81\xde,Q\x06]\x01\xa2\xc4\x05\xa2\xbe\xcbz\xb43\xaf\xa2'7\xa1\xd4ha`8C\x94}\xe9\xe5)\xa73%#G[\xd7\xdc\xea\xcc\xcfO\n\xa0\xcb\x10\x01\x8cCp!\t\xc2\xc20\x8eO\xd6\xf9\xa5\xa7|bv\xba\xe90;\xffiu\xa8[\u0090f\x86\xda\xf9\xef\\\x02\x8fmlo\xc0*\x10o\x9dL\x04\x8b\x85\xae\xc4fY\xfe\x1d̒\x9aX*\xb7':\xa0 \xd7x2\xfc\x81L\xdf\x05T\xa7&\x89\xb2\xce\vs*c#D%0e\xaf\xfd\xd7<\xbc\x85\xd7x6\xb2\xa3\xae~\xec<-\x00v5\xaa\x8b\xac\xeej\xc6\xe0\x925t\xfbG=\x18\xadx\xf3\x93\xa7,\x12J!\x1cר\xc6u\x85+\x9f\x17\xf8\x91Y\x15\xedz%<(\xf9*/\xdcܸ%0۰|\x82\x02\xf5\xa80\xa7i\x8bv-K\xad\xa1\x94j\xf3\x84\x03NҴt\xc1@P\xc1\xac\x1aez]Fkە̭\x1da#e\xe21P\x81\"o)\xd0\\\xb8m\xa0\xa3#\xd3~@\x99mɯǦ\xffd@\x96E$d\x98k\xa1\f\xfa%{{#S:t\xbb\xeeB\xddL\xab\xebM\x8b:+3\xfa\xbc5\xaa\x8clS\xa0\xee\v/\x12\xd0\xec\xf2\xd4\x19\x1a\x9dF\xef\x97\xf9\xaa\x9a\xcf4\xef\xac\x10\x16D\\c\x89.\xbd\xb9\xd0\x01\xb08\xc7/\x95q隐\xaaF\xd28\xeb\xb4.\x94}\x9d\x01\x01\x00H\xed\xec\x14\x84\xd6A\xe75\xaa\xb9\x9d\x8d\x11{\x02bLS\x86\x00\xd6\xf0\x1b0\x96kL\xf7\x87\xddl\x80\xa4\x86\xdc,\xb5P2n\x8d\x1a\xa47i\x19l\xc2J\xd4\xf1\x18\vT]W\x8e\f]\x9e\x1fm\xde>\xb6X\xb8`\xaa\x93\x8e\xe5ڎ\xe1\xf7\xd0\xdd\x15E\x1e\t\x01P\xa8\x95\xdbfi\xe0\xbb2\xa0\xae\x94o\al\xffk\x83\x9d0YMV#\t\a\x8an\x0eV\xd4\x11\xf9\x1e\xfb\xc1\xaeX\xf5H\x85DUQ\v̭\x96\xac\xbc\x14,\x1d]\x14Z\xe8\t\xcbJ\xb0Db$\xe4.m\xf5\xb1U9G?\x8a\x1b\xc5L}\x1b\x8eT\xb4W\b\xb1\x17\xf3\\\xa1N\x9b\x82\x01\xfd\xc7\xff\x9e\x87\xb7\xf8~\x88oR\xaa|\xf5\x1eT\xd1U\xd3\xd8AАz]7\x84\x11\xd3&ʐ\x13\x14Z\x16\x90&c\xc6&\x12p\xda\xd2\xf6C%Ր(rX\xd9WC\xa8\xf9\x10\xf0\x9a\xfa\x1e\x13K\x9a,Z\xf7\xb8|\x83h\xee?f\xefW[4}\xd7\xd7Q\x0e\x8a\x8c]\x12\xbaaK#\x9d\xeeUK\"M\x93\n9\x1aZ\xb9\x8e\x92S\x87Ȅw\xa52\xd9\xe1\xe7\x84)K\x8c\x808\xc1\x96a+:h\x8b[d\xcdF\xc6\xf9\xd1Rꔵ\x19\x1d\xa5\x83\xa2\xd7\v>\xb9y\x92렑\x1c0\xef\xa3\u007f\x1c×ߦ\xf1ҵ\xecM2O\x18\x05\n\x1a!\xd2Hp\xc9Ud9r\xf2M\x82s\x90\x82($\xcf\x12%P\xbd\xf9F\x89l\v\xe2\x82\x0eH,\xf5\x83@\xe5\xaf\x03\x05\x8e\x89S\x91\xdf\xeb*\x8fZ\xef\xc1\x1a\x82|\x92\x03z\xd3⣰\xe1\xfc><\xc4C\xb8\x05\x935s)љ\xb1״q\n\xc9Nx\x8a\xda'h)j\xa0+\x8aq\x80\x80\xf8\xd7v\xeb\x84\x15\xe3B\x1c\x8dZ\xb9\x04\xafii\bj\x1c\aTf\xe4\x0fd\xefa\xc2Y3\xe2@\x00\xe1\x81\xce\b;\x96<\xbc\xf2\x82}h\xe7.F\xcc3d\xb1\xfa\xbc\r\xefyz\xaat\xc8Ƹپ\xba\x0eL\xec\xaa-\x9a\xa4Sù*lF\x96Ա\x99(L\xa8\xa7\xaa%*\xa5\xe2c=R\f=\x9e\x9d$\x93E\x188\xc8j\x14̧\x8e\x8b\x90\x8a,0\x0f\x1b\x9a\xa23q\xf05\xd1\xf1\xda\xcb\xf4Pm\x8f\ueb24\r{#g\xeaK\xf6\x05\xff\xc8!\xfaH\x90d\v\x1fD\xdcX\x02\xe1\xdd\xcf}\xef\xf4W(\x1aC\x99H'\x0e3XE@\xafL\xf4\x021\xdc\xc2\xccST\x95i̻\xa11\xce\xf0N\xea\x90\xca\xe3#d\xed\xb6)(\xdd\xdc0i\xfb\x00\xd04Z\xc7C\x96,HTy\xf0\xc8\xc2\x14\xb3\x85ź\xb7V\xd0S\x8b\x1a\x11~F\xc1\x9a\x85:\x8e\x96\xcb\x14\xc7\xeaŝ\xfd\xbdi\xd6\xc6T{\n\t3\xa5Z\xe9\xbc\xde\x1b]jD,\x96\xbf{\xe7*\xf1\xfa\x1eE\x04\xfb\xf0\xf4\xb6'J\x04C\xfe\n\xe0E\vIЩ\xf9U\xd8\bUm\x85\x81\xe9\xfe\xe8\xfe5\xa1\xd0\x05W\x0en|[\xd678\x1c\xa5z\xbf\xa0\xfc1M/e|\x15\x80\x80)\x94\x8a4`\xa8\tl\x06\xf0\x9fK\xf5:ze: t\x945\br\xed\n}A\x13hc\x82ɝ)\xb0\xac(\xb8S\xdez\x8d\xc9\xc6\xc9n o\xb3^\xe5=\xf1~\x10\xb1\xd9\x14\xba\\\x13j-z$\xbb\xf4\x14W\xa2}\x14ܧm\x11\x00\xb4\xe8[\xa3K\xdda\xe3\x05\xb9&\x91\x18EyL\xa7\xc39\xd0\xc2L\x8b\x86\xc4N\xae͋xh\xaeW\xbe\xd5J\xa2\xa75\xab\x11\xe4\xd1\\\xcc_\x15\xc0(\xb9O\xcd\x18\xeab\x8a\x1fĐ\xf5A-\xbe֤z\xa9L\xf301?\x10`\a@\xac\x05\xd7A\xb0\xda[\xf7\xeeV5\x9a\x1a\x05\xc1\x91\xa9\xc0\xcar\xb7-\xc4\xe4\x19\"\xac\xdd\x15\x02\xb5\xc9\xfcM[\xd6m\xf7\x16\x9d\xeeU\xdf]+\xdbpwP\xaf:I\"\xc6\xf7\xc6f\xa6J\xa6\x92\x04z!V\x81ZX&9\x04纀\xe0z\x19\xbdc\xb1\x80j\x84^湓&\x14\x89\xa4M\xabu\f\x85F\x93q\x88eiY\x91\x16\xa2\xd1pN'\x97\xd1@D\xc2N# Z٦\xbbhMd\xbd\x1b(P\x19\x01L\x8e)܀!3Oe\x04I\xbd.\x8f\x18t\x1fDy\xdf\"\x82\xad\xb9i\r\xac\xd8=B\x05\xcf|\xc1\xa5h\xbe\x05h\x11<\x89el\v\xb5n\x1dR\xa2\xa2\xb4 \x9e\x14P\t\x9a\x84;\x01۽\xf0\xe4\xeb=\xe7\u007f\xeaL\xb8\x83\x1df\xf9\xfe%Ʒ\\[\xda\xd5\xc0|F\x1b\x1e3B\xbb\x9eL\xc9^F\x99\xc8\xd5'W`\x11I罭\x92\xe0\x06\xaf\xec*\x11\xe7?rǫ\x06-*5\x12S~JS\xf4G\r]\x87M\x02\xea\x013\xc8>\x18\x94c\x86pjO\xd3\xfb\x95cc$ \xdf\xd2\xfdh\x9b\xec\xfd#2\xc4$\xc8\xda\x06W\xbar\x047U\xe8\x94V\xb5\xa0\x9b?\xb2ׁaf\xf4\xa2\xc9\x1d\x1b\x9a=\xe6(@\x92\x12\xbe\xafE\xf7\x8ch\xa6\x11\x91\x17\xfbB \a\x03K\x8d=\x03[9ۄ\x8a\x93\x16\xfc\x87\xc5&?&6Һ\xcd0\n\x94\xb5e\x9fJ8\x85\bI\xda\xc8t+S\xaa\xc0ˍ(\xd5\x16u\xad\bf\xa0\xe03QFla\x04g\x8a\x00\x92>\t:uY\x18zۼ\xa5\xa1<ʉ\xf21#g\xda\xd4&f[6\xcf\xf6\xee\xba&}\xb5GCV\xe8\x10ކ\xc2\xf7dXH\xa7\xf3\xda\xfb\xcfG\xf25\xb1\xc6\xfc\xe7M\xfb\x12κ\x8a\xcbP\x19\xd1\xe9\x1e\x8d\x06\x99m\xbf-\xdbs\xa0\x13\xfbC\xb4i\xacw[\xdcO^[\xda݄\xe3\x97\u007fm\x0eQ\x9f\x83\x05ҚJS5\xfb\xe3\xea\xc7ӄ\x97p\x81\xcdW\x1e\x94\xf6\x84*!\xb4Zܟ\x18\xf1\xc1\xc0\xbfJ\xcc\x1eYEp\x1c\\\xd6ĝ\x05ѼK\xbe\xa5)\x0eP\xf2\x825\x02\f`P\x94&^\xb4\x1c\xa7\x14(\xcfg\xcf2\xb8\xf9\xa2\xc8G\t\x0eA\x03\x8b\xc2VU\u0378u\xf6S\xbb\\\x16\xf8\x95\x01R\x1e\x01\x9f\x13\x8b\x18\xba\x83\xa3\x9fG1\x1f\xe4\xd7\xd05\x03疤\xe4\x19\x1b-\x94\xa8POEC\x1b\xe33\x83[\x88\x99\x9e\fRq\xa6\xf8\xa4\xf7%\x96}\x9e(\x0e\xb0\x8e\xae>\xb3\x8c.\xc6\xc0\x18\x80\x9fG\xaa>\xaaκQ\xab2\r\xeb>\xab\xd6E\x15'\xe9ȝpUtߤ\xc3]'\xb8H\xb0&\x80{CC\xad\xc2\a\x9f\xca\x0fCb\xeb\xa4\x0e۸\xba\xb8l/\xe3d\x12K\n\x1f\x1e\xb4̾]%jK\x0f/w\xbf$5\f\x02\x1a\x1a\x02q\xaf\x04M\xe3H\x01\x87\xe1\xa1u\x17.\xb7`\xe9\b\"6\x15\xdbI\xab\xfa\vs\xf7ζ\x1d:E\xa8\x97Y^>5\xf6\x88\u0087\xeah\xf2ֺ\xae\xdcM\x10\x14\xa3G\xac~鹲\xc8\x05eg\x1d\xd3\bo \xf6\xc9\xc1g\x86\x1cP\xfef{ه\xa1\x8f'\xfb\xb5V\u007fr\xc5\x1a-\xed\xba\xc3\x00W\xf2\xd6q\xb0\xa4\xb9\xbaJw\xea\xe0\xd3\xd7Q\x89\b\xb8>\x9d\xc2+Gj\xc8\xdd\xd1\xcb\\c\x91Ы!+\xc2\x04\xf5\xb6!\x00\xaf\xfbd\xaepB\x1aFp%\x95\xf0\x81\xeb\x93\x16\x8f\xd6C\x87v\x89\x84\xb0嫴h\xf3\x98\x88\x1dXv\xae\xdc\xc56J\xea\xbe|ޤ\xe7\xf6\x9c\xa8\xfaP~\xc3&\x9e\xbeT\xff9q\xdb4\xfc\xdd\xff\x83N\x86\"\xa4Xw\x99$Jd\xe5\xb8foD\xee\x99^\x13\xa3\xc4\xcbzڐ\v\xaf\xb5\x04\x95\xa1`#j$m\x13\x96g\x0f\xed\x97\xcf\xdb\xeeҾ\xd1Y\xa9)\xf6\xa4\xc8dE\xc7\xdb2\x96j^\xb01uе\xaf\xb32\x9aGJi\xc3yJ\xa8\xbboM̑A\xef\xbc=1\x00\x94\x85D\x99\x1e*7hb\xd33ȏ\xb8\x1a\x8a\xf6\xa3j\xe3\xe0I\x84\xb3\xb1.\xa1V\x8c\x95\xd19\xc5\"&۵\xb1V\x12[\xd3\xca\xf2\xef\f5(\xa5\x88-\xd3VM1F\xd14\x00\x00\x9c\xdcF\xfa\xdc0VS\xa1\x05,\xc9O\xc9\xc0\xc5T\xea\xd0\u0381 \x81\xc7%\x9e7Q\xeb@\xa4i\xc2k\x87LU\x8c\xb9\x86\xa6&\xa4\xe0\xa8\xc1\xfbh\xf4\x1b,\xae\xe4\x98>Y\xc8;+jnz\xf6\v\x82\u007f\xb4+4M^\xee\xd5\x16\xf4\x1fg*\xe8\x17k\x82\xaeN\xb6\xc85\xa6k˾\f8\x05\xe6\x90ݸ\v\x9c\xa3\xfd\x95\xab\xf1\xe8ނ\x82\x02\x862\xf78\xd1\xc8FD\x92\xc7\xeen%\x95ѝ\x87\x87\x83\xa2q8L,>*\xa6\x8d#[~\xb9\xb6\b\x02l\x86t\x9a\f\xb0]\xb9.L\x870\xe8)\x14M\x91\x06\xcb6c\xa6I\x8ae\ts\x9e\xc8(\x82\x00\x9b\xa3\xf1\x88\x01\x99v\xc9%1\x80\xea֏\x11G\x96\xdaWF!d#\a\xfb\xed\xcfK\xf7J\xee\x1cFwk\x06\x88\xccpe\vz\xa2\xeb\x1d\x15W\xcbτ4\xaf/\xb9\x03\x9c\xc1\xa0\xa5\xef+֕\x82\x9e\xb8\x8an\x93mNN[J[\x80\x18$\x92\f\xcbX\"U\x84\xbe\x8c$|Ĵ\xbfq\x8a\xa0\x01\xfa\x1b\xe3@<&\\v6Cf\x1c\xc1\xd0\xea\xee\xd2]ro\x98oS\xc0\x03\x0f`\xa7\xecL\xc5\x05\xedy\xfbfz}\xf8.\xfdH\xe3\xdfH´0/˱\xe5XM\xb4\xc8DB\r\x16f\\\xfdplΔҦ\x1a\x99Ѯl\uf0c8\xf4Oi)\xe8r-\x1c\x16/a֊\x9e^\v\xe2\xbcU\xb9F\xd5\xeat\xe1]XS\x9e\xed\xad\xdal\x88\n\xb0\x87\x16t\xfc\xb9\xbd\x15p\x10\xbf\xed\xa25P\xc2\xd1\r\u007f\xc1\xa0E\xe5\x91J\x9e\b\xa6\xad\xbe\x8fN\x02o\x9c\bi/\xe8H&\xf5\xf4mgai\x8e%\xff\xbd\t\xaf\xed\xb1{\xeb\xa8A\xabW\x9eROGT\x8c\xb6\x94\xaaХa\x02\x12\xfc\x8a\xb5\x125\x9cX\xb8z\x0e\xe3\x16*b\x17\xae\u0088\xb6g\xc4жl\xf8\xcaF\b\x06B\vt\xe8Ƅ\x8b%\x06\x96\x1f4\r\x05v췥\x03\x804\x90\xb5\xa2\xb6\xc4\x04\xb8J\xc1\xa8\xfe[S\xcc\xd6 q\b'b\xea\xcf\x1f\x8d\x86#\xe3eg2\x85\x8c\xdbY\xbf\x17\xfb\xad9\x98\xc9\x12V\xac\x93Y+\xea\xca\xdfX\x11FR8E\x04L\x03\xe9*DT\xac\n\xd5\xc4&\xd1\x01\x172\xd0w\xbe\xee\xa9\\\x9a\x04C\x9ao\xc1\x92\xea\xdbT\x9e\xa0\x9a\xa5]\x1e\x99p;+,\x94\n\x05\x80e\xf2:\xee\xe2\xb1\xf8\x0e\xe9N\x16\f\xa9a\xb8\xf3M\xbfsj7\xe6\xa3'\x86&\xd2dUsm\xda\xc3$\x8fz\xc1\xe8ӯ\x10'Im~|g\x94\xac6\xd7\xd6\x04\x11ѸQ!\xb5\xaf\xd3~ޙ\x02\xa8,,c.P\xaa\xb5\xe6r\xbe\xae\n\xf7\x88\x18\x8c\x14)S\x9bӟ\xb5\x05tqɎ\xea\xbf\xfe\xf3~\x88\xb7\xf4f\x85Ia\x18\xd1!{@57\x94v1x:\xda\xe8Q&\x8f\xadD\xb9\xda9\xac\x91z\x8a\x04I\x13\xaa\x90 \x16\x19\x84\x02\x81\x00,\x8b\x9aoQ\xf3\xc35\xe7LQu\xea\x9ab3\xaa\x98\xa0\x8b߱(\xaa;\xe1\xa3ѷ\x03\xed\xa5?Oó\xc8'\xfe眓\xd1ߖ/!\xbcbq\x18!\xadR&*G\xc0\x02\x89R\x0e\xd7t)\x1b\x90\xf1\xa5:k\xc1\x98X\xd2 U\xd2D\xf2\xe6\xe9\xd12\x8e\xb6\xf4\xff\xd7\xee\xa1\xfb\xfdnXx\xa0\xa9\xcc\xc1`\xeeh*RGb\xe8\xadK:\xed\xcbN\xbc\x0f:c\xb6n\x84\xc8\x1eG\xa4\x8f\x85\x8b\xedнne\n\xff\x03J\x01+|\x96%d\xc29\x16\xc8\t\xa4\x8a6b\x1bs\x01\\\xae\xe3\x0f\xc4C\vQ\xd4<\xa0I6+\xb87\x1a\x85L\xbd$\xad\xa7\x9f\x13\xa0\t鹸\xf6\x1d{\xdcv\xbbᛣ\xd5T\xebi\x92 \xa4\x8b錖\xfal\xc2\xeeIB\xa1T\xc0\xe6`\xfe];Xn\x98\x8c\x8f\x8c\xb4\xad1\x94\xa6*WJ\x84d\xa1ׇ\xaa\xa3P\x14f\x89\xb8κ\x90\xbc\x15ˢEt\xb5i&;\x0fR7\xe6\xfe\x81*\x87\x85ϲ\x16\xfc>\x0f\xef\xe9%\x00\x0552\xf4\x82J\x10HB17\xa71\xa3o\xb5$\xe5\x04\xa6\\C\xea3\x99u\x9e!\x1fdK\x11\x9eP\xed\xfd\xf3\x9dI\xd1\x0f\xa0\x16\xa9\xa2\x89\xa6X\xb2e\x00\xa7\xa7#c\x1b\xa65\x05Kxh\xfdV\xf4}\xac\xe6\x02d'\x80\xf0\x93\xce\xcc\xd1š\x9ew\":mf\xaa\x19XK\t\xecbLΌ\u007f\xbc5\x16\x9d\x10\x0ejh\n\xc9\xd5\xe2>\xc2\x19\x94\xb9e\x88\x1c \xc6w\x1e\xddi\x89\xc8\xe2M6\xb5Qj\x81\xddh\x18\x81F\xd4\xeaU\xa4R\xa5\x1f\x05bI\x93\n\xf3\x8aoY\xa91\xba>\xcek\t\xba\xa8\x19\xb1\vs{v\xb7\xcc22\xd0\xf2\x92\xc9\xef\xe9\xb8\\\x06(Z\xe5O\xffS/\x04\xf0L\xb2\xdc*=\xa6\xa0\xf7\xaaҧTU\x16\x10{\xf1\"\x92I\xd4\xc8\xf8];\x94\x98,\x12\xe9\x94\xcc\v5\x03\xed\xe4\xaf\x1d־u\bpSp\xb2\xc6nE\x0eX\x8c\x94\r\xeb\x8ed\xcda\xc1~\xdd;\xe0lH\x86\x9a\f\xf9\x1d\xa3%TwM\x80P+$X{9\xd1u\xb3#\xfa\x11w\u007f\xc5\xd2\xd0F\x8b!Iu^\xb8\x12\xcf\xc9\v\x97\xbb\xbb\x14<\xbbbGX\n*R[\xa4\x1e\x8d\xffp&\xd2n\x1a\xa6\x98\xe5\xdaD\x96\xb5\xa10\":R\xd3M#uQ<[\xf3\xe5\xc6\xc4\rF\xd6\xfe\x13\b\xf2\x16?lk\xb3E\xaeǨ\x90\xf0\x9d{\x9bY a\x1bӶ1R\x87\xcaf\xfb\x9a\xeb\xcb\xc0\xd16>\xb88\xe9.\xe6K\xc1\x88\xbd!\xa0-gt_\x1a!\xaer\x94\xb4\xf1ٱ9\xa9\xbfz\x01\xbd\xb1\x1e\xfe6\x00\x11\xa9\xb5\x95\x81\x91\xd5u\xbdZFz@\x16:؟\x9apfg\\\xf5F\xa8\xdf\xc0\x80\xeb\xcey\x8fq٪\x14\u007f\xf0ՠ3\x1f3F\xb8u*/p\xcd~_\x9dѭh^\xe8\xc9kZDE[Ib\x1a;g\xe0/4Y\x98\xa8\x9a\xab\xa8\fif#8\x1c5\xd66N\xc0\xc8BA\xcdx$\x83ޒ\xd4Y\x17\x84\x1d\xf8:F\xaa\x82\xde\x11U\x80\x9e\\\xa2\x1f5J\xb4.P\xab\xa8\x1a\xa6E\b\xf4\x1a@T\x9d>\x14\xb0=\xb1\xe1\x02\b\xfd֠\x17#\xb7\x03\x9e\a\xec\xfc:W\xa0\x0e\xa0뀙\f\x14\xf4B\xddz4\x1b\x81Ϗ\xe6\x05\\\x107mQ\x9b\xc0\xc0,\x95R\x14Q\x1d\x8f\x05\xff\xbc\x06\xa8Bn\x92\x942\xb7f\xe9:oK\x9aR\xc72\x84\xa7\x80\xd2ߒr\xeb6\"\xeeGM>ߛqk\f_\xdbBi\xff\x99\xb45\x01pК\x92\xfd\xbd\aW8L\x1dC\x97\xa1I\x87\xe7\xe0R\"\xc6Q\x8bdh\xee\x02\xc1Tմ\x12\x19\xf1\x99d\xb08\xa6\xcaT,$$.\xc2SJ{Z0\xb9\x87\xe1/\x17\xa8\xe0̞\r5u\x84b'k\xaa-뉲/\f%tI}@\xddWb\xa1\x1a\x1cC]\xb7\xa5&\xb7`,!\xe5\xe9IKCr][ܳ|\x19\xa80g\xa0w\xb4\xd9\x02\xd6\xd3\xc7\xcev\xe0b\xab\xd6K\xa3m\xa9\xc6-\xe1\xa5F\xb3\xb7\x98\xae6h\xfc,\x11\x05\xab9M\xc2\x0eE\x9c<\xf07\xb8 \xa3\xd6&6U\xd7l˩\xa9\x97\xafWKC\xf3:\xdc/\x9f\xb8\x91Li\x04#\xf9\x00\xab\x06؊\x83aŗ\xc8\x02\xb6\x80\x89\xaf9\xec\xc9),Z\xd2\a\x06\x84\x98\x0fh0?\xb7r\f{tjc\x93\xe8\x86_\xa4\xd7\xc6\x17p\xa8\xc1\x99NA2y\x97\xe6u\x03\x10\t\x82Wk#\xcb\xf7>\x02\xab\x0eLm\x0e\x01\xf3\u007f\xe3\x00XѴ\xb3\xb6\x8a\x14|6\x94!\xa8\x89\x17\xa1\t\xf7!\xa0\x9bC)\xb5B\xacBZ4F<\fp\xeaF\x9f\x81>\x90\xca\xd3,\x10\x15\x8cf\nn\xbf\xeb\xf4)\f#(\xdf\x0e\x88\x9e\b\x011uѬ\xc9\f\xca{\xe7\xe7\xd5\xe1\xef\xe40o\xdb\xf0\xe7\xd0.R\x0f\x91!d%4\xe1\x1b\xb1r\xaf\xf9\x8a\xff\x05\x92\x8b\xf3\x92\xfb\x87_\xbb\xb2\xb5U\xa7\xd66\xe0T-M\xbb\x1f\x13\x8du\xde\x06\x80*\xf0$\xf4\xb6\xbbt\xb2\x17\x86hr:\xb7\xb1\xe6w\\o\x95\xb8ΉOe<:\xa8G\xed:a`8OG6\rd6\x11\xb7\xae\xbd\x9dp\xb7|\xe9/\x98\xa6c\xc9\xe6\xb2\xc0cMb\x87]z\xd9\x02\xb6\x84p\xea\xdd(\xc0*\xb4\x89\xaaA\xbd\xd3Pfm\xf4ֆ\x8c,\xa9\x886\xa6,\xdb\xfb\xc3J}\x03\xc3\xeak\xad\xa71p\x8aVUVƆ\xd5\xcalc\x043\xb3\xcb1Ht\xde\xc1\xd7\xc9V\x1b)TBvMfK\xef\x81\x00܄Xf@\x86\x19\xd9\xf1\x10\x04*\xeb\xbf#\xcaN\t\xf1qV\x00\xc9F\x9e\x91\x93ZaMJ\x8c\x8a]\xb2\x18\u007f\x17\xdd\xf6x\x9c\xd8\xc4\nD\xa8\x15~n\x12\x92\x8f\xcc;\xcf,\x10\xbd\x14\xd4A\xdcH/\xd7\xce\b\x0f\xfa@\xafx\xac\xa5f\x96\xae\xd8mW\x04v\xafέ\x8b\x14\xd6\x05\xb9\xd1\xe47\v\xbe+\xf0+\x9bb\xf3\aC\b`\x03B\x02\x90\x83=Q\x81\r\x9e\x8etKȳ\x9d\xa5\x86\x99\xe5Dj\xa4\xc1\x0e\x91f\x17\x13\xaa\x9a3\xfd\x05\x89\xb6\xd6\xd6Rb8\xaf\xbbAG\x15raZɎ2\x01\x15\xd3\u007fY\xa1\xa6=(\xa5\xd8y*\xee\x18d\xe70\r\x0eI\xe7E\x82\xeeO\xf2^\x9a\t\x80̨3\xb1\x87@(L\xe8j:\xa8\xa1\xba\xa5w_^\xb0j\xdd%,Z\\\xadR\xcf\x1c\xfb\xa8z\xad\x8a\xaa\x91\xb2\x16\xa7\xa1P\xac٩uNYt_\xdf\xc1P\x9eؾv`\xdc\xc8ħVf}>\xa4\x11\x89.(SZ5\xf5\xfe\x90\xad\xf2\xa9u\xb1\xa2P\xb4P\xad\xf1\x85(\x05\xd0\xef\x95\u007fҘ\x8d\xd1m\xe7a)\v\xdc5\xe7>\x17\x15\xea;\xc0\xe7`\x1a\xdc\xc67\xd1\x16b\x15I\xf8ۢ\xa7$\xea;\x1a\x11\x8d\fk\xe5\x91<\x06\xfc\x1c\xf69ĵRE\x15n\xa4\x91\xbf\x15\x11\x8b\t5\xa2\x19iZR6\x02J\xb9]4\tFш6D\x8b\xcc\x13\xd2\\5\xb86{r-\xb7\xab\xb05\x81h\n\x90\x9a$\x0f8\xa9N\xab\xc8\xe8GK\x00\aN&Y1\xa5\xa8\x99H\xa1=\xfcϡ4\xfd\xe7P\xa2θr\x03&\xa8\xde\xc99\r\xac\x93\xe3c\t\x94 T\xcd\v\x13Zc\x8b\xf1\x82S\b\x17\a\x8e\xea\xf7\n\x12ۻ\xd2k_\x19|DS\u007f\xa0\x06Zs\xdc\xc7\xd6\xecj\xb9<\xe1<\xa0d\xaf3\xb0\x9b\xea'\x89\xba\xce!\xb1\xf7$\x01\xb6|\xdd\xcc\xe26!\xf0/\n\xea\x94^\xff\xad\x95ڷ\xa4J\xe6m\x11M$\xb9\xec\x0f\x91|\xafD\x1c\xb2\x02;V\x91\xca'Xb\x8d\xc0\xac\xf2r\xd11\xd0\xd8\x06\b\xd9\xd6u\xb9\x81h\x10\":mǯ<\x94ו\xedN\xb1g\x8a҅l\xe2\xeb\x82\xd5e\xb1\xa9B[6TD\xda\x1a\x9be\xd3\x15}Hg\xa1\xeb.\x16\\\xa8~G[0\xa2\xe2Agث\x1e\x87\xe1wI\xc8eb\xaf\xce\xc0\xf0v!\x93d\x01ᲡU\x90\x01nX'\xf2\x82\v|\x9e \b\x06\xaag\x80zEm\x1a\xee\x8a\x1aՆ\x88,`&\uf06dj\x1b) Qێ\x8a\xa6J\x03\xec\xaa\\\rQL\xd9\x1b8x\xd5ZQ\xbf-\x14\xebg\xc5/\xa3\xc5ݔ\xa6w\x88\v0\x9f]JK\xc1\x8b\xf9\xb7=b\xc90a\r\x13\x82\xd5\x1a*\x95\x9f\xf6dr\x89Ĺ6-#@\xaa;~\x89-\xb5\x1d\x10\xbe57lק\xe9JW\x12\xbd\f\xbbx,{\xbf\xf4ɘ\xb76\x96;\x92\xab\x86\xc6)\xd5Q\xa1#\x06\xe3S\xee\xa0CF\x81DF\x90\x95L\xfa\x0e0\u007f \xabx\xf1x='\xa9,pR\xd8\xca49\x156\xbe\xed(!5\x80\x02\x82S\xa7F\xd0\xf5\x96\x9f\xad\xf9\xeaD\x97n\xad\xf0k\xc1r\xd2\xda$\x92e;O\xc49n\x93\x94\xf8j,\x92\xb0\bZqS\x97\x82\xe1ܵ\x92\x16\x16*JF\xbe\fT\xe82\xae\x97\xa0\xc5du\x9f\x1b\xe3U-S\x1d\xd95\xf7Ú\x1a\x1a\x88\x13U6\x9cx|\x8a\xa8ҿƸ\f\xfa:9\xa51\xf5\"0f\xf7\xda\xdePm\xe3-\x84/\xa4\xa8\xb5\xa0\x8c\xf1\x1fgZ\\\xac\x13\xc9\xeb\xf2%\x13\x80ul\xcdל3\xa0\xe4'W\xbc\xe6\xef3C\x0f\xbcz\xd3y\xa7\x9b\xaci\xd7\xfc\xa1RB\x82\xafj\x1d\xd0?\\GǾ\xd8Ψ?e\xd1!\x1cZ\xf0\xe1Ӧ\xa5\xa0j\xedj\xda\xfa\xb8t\x94\x1c\x98)K\x83\xaf\xe8\xab\x1f\xad\x81\xa2\x0fK\x17\xd6݁z\xa8;\xb9\xbfd\x16\r\xe5i\x14R\x13m\a\xab\x9bjqXo\xeb\x88Z\r\x15p\x1a\xca\xc8/\b=^3\b\x9f'0\x9f\xb5\xf2H\xea\xc7.y\xc6ە8a[\xa4+L\x1e\xf0\x8f\xb3\x99\x06mSWXVA\xe0O\xd5\\\x03崶\xa5x>J\x12c7\x02\xa5\xcc\xd5\x13\xec\x13e3ؓ$\x80F\x01\x10\x1a\x9f\x97\xe1-|\bS\xe6\x9b\x02\xda\xe1`\x9f\\~\x8c͖\x84Xn\x1dI\xf2bC\b4g\xca[\x98\xeeI\xd3\xc1h@>f\xe9\x80n\xcd:)\x15\xaf\x92\x833-\xed|\x9e\x87\xef\xf15\x90\xbbC!\x14\x1a\xe9\x00\xf8͕\f\xfe\xddz+\xb6\x06\xb0B(B\xd3^dJ\rn\xe2 \x96w\x0f\xac\x00%\x9fGV\xe2$'\x19t\xe7\x90\x03\x95\va\xe0\x13!\xca+\xb8\x13\xabE\xe1\xbb\"\x151\xf5\x02\xa0\xc3ܲ\xa5\xba\xbc\xd0\xc5'\xe6uO\x87\x1b\xa0\xb6\xc7,]5TBR<\xa5\b\x12{\x97\xe1\u007f^\xf2\x00\u007fx\x0f\xe7\xf8\xe5\xbf7\xe99\xbc\x1f\xe29~\xf9\xd7<|$1\xc2DSd\x89BњL=\x86\xd2\xcb\xd6\xecFf\x86^_\xc3 \x11Dx\r\xfb\xa4\xa6$\xa2UK\xd43橐\x12`7\x1dE4s\x924)'\x9c\xf1\xde\x19Xr\xff?o\x0e\xe1\xeb!~\xf9m\xd4}\xefҗ\xdf7\xe9\xb5}'\xabDŽ!M\x1c\xd7ȑ\x1a\xff\xd6\f\xaf\xe4\xecK:\xbb.@kӓ\xbb\xdf\xd9\x04m-\x05\xd4Rx\xb1v\xed\xf8;\xddo\x9dC\xa2\xbfJʩ\x14\xcdL\xa9\x91J\xd5\xd3\xf4\xe5\xf7E:w\xe2\xfe\xfc\x98\xba/\x9f\xa7\xe1\x1c^\x83{\xf9P\x180G\x96:\xfd6V\x00X\x84\xb2\x18!]\xba=\x03\xbfm\tfz,x#\xebh\x06rݗ\u007fM\xc3%\x1c\u0085\xa0`u(\xa2\xe5\x8e\xf4\xdegnu]\x18\xfb\x11\xfd\xbaC)\x1dA\xcb\xcc\x04n\\\xcdVL\U000d09716(WO\xbb\xff*A@d\x9e$4\x98\x9a\x03\x1a\xa9\xc1\xcdǓ\xfe}\xb2\xc0E\xb3\xec\xb1\xe9\n\xd6\xf4\xe0Tn\xb1\x9c\xe0\x1f\xef9\x83\xbau\xc0X\"픡\xa1y՞\xf1<2\xef\t\xb7\x06\xaa\xd9Ն\x8c\xf1+\xf6ys\x88\xf1\x1c\xbe\xfc\xb6H\x97wuB\xe0\x8aˮ\xa3\xfc]\xc1\x94DU.\fҍ\x9f\t4$\xe0+u\xe9\b\xa9\x1d\xd8\x19ik[J3\x8d\xad\xe75\x05\fO\x16S\x9d\x1f\x96<\xea\xa28.\xb2H-\x8e\xac\x10\x91BN&biұ\x9eC\f]\xeb\xf2\x1c\xf0KT\xe8\xf9\xea\xe9\xed\x83{M\xf8\xc2\xe4\xee%:\v\xeah*\xe2f&,K\xd2S` ;\x8bN\xe1\xf5\xee\xdb\x1a\xed|4\xc3\n0\xda\x04*,K\xb725\xd9pҰ\x80\xfe\xa2v\xdb\xc0qM\x9bC4\x13ET\xb2\xf3\u07b8\x86j\x9cɥ\xa5\xa2=3\xb01/\xd3c\x1d1\xbb\"\x91\xaa\xe3\x02\xa2Z\xb7\f\t}`/\f\xf0\xd2\x184@A\xeb\xa9-\t\xbb\xcafR\xdbu\x0e\x06M|\x14\xb4\xb34\x8e\xf3\xb8T\xbb\x1b$\xa7\xe8\xf9Ώ\xba\xc42vT\x9a;8\xe97\x12\x95\xc4t\xf0\x10iᆞΘF\x93EQHƤ\xd8\xd04\xf1ΡKv\xe7i\x81\xd90\x9fM\xe9\xf2#\xb6\xd4\xcb4\x06mYű\xc59L\x12\xa5e2E8\xbaIJ&\xf6\xd4z\x96\xc63\x9d\x98\x9b\xef\x1e\x9a\xc2;S\xe20b\xb8\ue113\xe4\fO\x87r\x10u\x00\xa1O\x81~\xc4\x17\x92O\x80fxJķ\x04m\x14\x9b*,\x1aT33\x065#H\x94\xd6\xcc\xfa\xd3L\x89\xe8*\xa9EY,k\xf1NxF^\xfc\xfb\xf0\x10\xbf\xe5 \xe1Ӷ{\xcd3\xb55\f\xb3\\&\x80\x10\x00\x93\u0602\x92(ۃ1\xdbe\xc2K\x06\xab\x9a\x1e6\xda\xe0\xf2t\xa7ܡ\xd1!i}S|\xd6\xc6T\"\u007f\xff\xcfk8\xa7\x97\x90\xe3\xaa\xd7\xf6\x1d]\x8dU\xbc\x93\x16z8\x9a\xdbBk\xf5\x99\xb5\xe9\xdd`T\xd6\tJ\x86\x06\x06\x15\xa6jc2Ck J\x1aKj\xe7\x9d\xdd\x0f]\x05\xb0 \xaf\xe3]5\xc0\xfe\xb5\xa7,\xe9\xa8s\xfc\x83\xafO3\xa8X\xfd\xe7=\xbd\x86/\xffk\x1e_S\xbc\x84o\xe15\xba\x14\x9f6K%\x1e_\xa8ow\xa7\xbf\x10Vwp/\xd7K\xa7\xeb'34\x04F[NHs6B6.\xed\xd1\x05\xfcύ\x99p\xb4\xce\xf3\xef\xdb\xf7\xf4\",ݡ#\xbaݩ\x14\x9f\xb5s\x1fD\x9d\x96Sp\xe7\xcc\xd3:@\xf7@\xabf\x00\xd6X\xf9\x9d-Q4\x02\x85\xfa\xd9\u0604\x85\x8b=\xbaSs\xb2%\xb6ΞU\x8aM\xb4\xe4x[\xc8\x01ձ\xd0qm\xb5\xd8\xd0p\xd5\xfa\x93\x15g\x89\xe6\xb4\xc7\xf3رO\x9eǩ\xe1J\x94\xc3\xd6 \xceU\xd5h\xebQ\t\xe5Ъ\xce(4\x19s\xac\x88\x13\xc6\xee\x16X\x9b\u0082\xeevޚƆ\xb6\x85\x05\xb7,ºVD\xab%\xa5\xa2\x8d\x99 ؿ\xe2x\xa9\x8dng\xd1OK\x170\xb6\x155\x0e\\Yr+\xa5\xbf\x85-8\x8a\x89\x1e\x91\xb9۠\x05j\x14\n\x19I\x82N\xe1\x15RУ\xbe{B\xf2\x83\ueffeW\xe8\xfe0\xb3\x9e\xeb\xc2\b\xb8\xb2\xf6\xe6\x8974\x80*\x00\xd2\x13\x06\xf0\xead\x15X[i\n\xbc\xcf\x1e\x851JQ\xa5\xb6\xa8\f\x9b\x10\xb3\xaa\x9fƂ\xad\x825\x10\xa7\xa8\x19\xfcSBmͲ\xf3ir\xe5rS`|\xe2ڡa݃\xd5R\xda{Y\xb5r\xba\x17*9S\xbd\x86\xf9s'ɵR\x81\x0eO>\t0\xafl\xe6,\xad7\x00\xe9]L[\x919\xaa}h\x15vG\xd6\xfa\xdd\x15\x9a7\x8d\xddv\xe45r\xd3\xcar\xab25kG\xcbc\xc0\rSw\xc7\xd8\xd1A<\x04\xd7Fw\xb9a\xb2\x84\x06\xfa\x93\x03OeglA\xe0\x87@:A\x99\t\xd1\x14\xe5g\xc4}\xc9<_GOՔ\x9e=3\xb3d\x8a\x9dئ\x04\x1bJU\xd7C\xf3\xae\x8e\xf6\x9e\x99\x95\x00d\x85\x19r\xa6- jSȣ\x14h'\x88\xbb\xc2\x12՜\x99\xbd5SCF\x1d\xe0(A\xab)bk\x9c\x8a?\xa8\xf9i\a!s\x98\xbbB\xa9\x9fx=,\x18\x8e\xcb4B7\xd6\xc1\xad\x19ވz\a\xa4R\xa6\xad\xed\x825CR]\xe1\xa6-\x1e\xa0`\xa8JU\xa00m\x13:yR\x97\xe4\x1f)\x1a\xec\xea\x02\xea場\x14\xc0\x94\x85\xe0\xd0\x14\xb5p|\xf5\xc8T\xbb\x87\x06\xe9{pE\x91#\xb7\xe8־ʜ\x1a\xdbXx6\v\xca\xc7ܲƭ\x83\x9d\x15\xe6\xbe0U4\x19skSE~\nE\x9b\v,\x9e\x87΄K\xa1\x80\xdb$\xb76A\xa1\nb\x1e\x14\xc7`)t\x92\x8a\xa5H\xa3Q7;\xcc\v)#\xfa\tD\x85JZ(\xacf6\a\xea}\xc3Ĝ\xc0\xf2A0\xa6\xb7\x17w\xd6\x06\x00\xfe\x87T\b*,9,Z:bO\xcb\u007f3n\xf5[\xec\x93njט\x04\x8cib\x99#\xb1\x99 IF\xb6\x03\x10\v\x96\xa9$\xe0*\xbc\x13\xe2z42\x00\x1c`\x86\xbd{\xe6\x95I\xd9z\x86\x87{\xf1j]\xb5h\xd3\b\xacZg,o\xa4JC\xab\xae\xa8\x9a)\x965_\xf0U\xe7\xd5\x1dt\xe6$\xa3S\xb5\xa7s\xad5k-\x03q\xb5\xa4T\xc1\x1e\x06v2\xed\xb0\xb4\xff\xa9k\xfd\x93Q\xab\xf8B\xb0͆\a\x93s\v\xe5\xafS\x06@\x8b\x13\xae\xa3\xc1\x10\xb5T\xb1\a-\xddE\xe0d\x11y\xea\x88\xf1\\\xb9\xe7\x1b\xb1\xba\xa6\x03\x8fG-\xa7\xce)\xe3\xacy\xa9\x1c\xfd\xe3ϚH˽\x1dP\xbe\x9d\xfc\x11\xa2\xa2g\x149\x90\x19\xfb\u007f\xfc\xff\xff\xcf\xff\xef\xbf\xffw\xff\xfb\xbfz\xf1ҋ\xd7\xff\x8a\xbdx\xaab{\xa9b{\xedŶ\x8a\xed\xa9\x17.\xbdp\xfd\xaf\xd0\v\xa7*u\xd7^\xea\xaaԝzݥ\xd7]\xff\xab\xebu\xa7^{\xfd\xaf\xb6\xf7w\xaa\x9e\xe3\xa5z\x8e\xd7\xdes\xac\x9e\xe3\xa9\xff\x1c\xdbK~\xb8Vϱ\xcd\a\xa7\xea9\\\xaa\xe7p\xed=\x87\xea9\x9c\xfaϩ\xbbVϩ\xcb\a\xa7깻T\xcfݵ\xf7\xdcU\xcf\xf9\x9f\xed\xb5\xf7\xdcV\xcf\xf9m\xe9R=\xa7k\xef9U\xcf)\xbf\xed\x9c\xdfv\xae\x9eo\x97\xea\xf9v\xed=ߪ\xe7۩\xff|\xcb\xcf\xdf\xce\xd5)^\xaaS\xbc\xf6N\xb1:\xc5S\xff\x94\xcf\xe1\x14\xdb|p\xaaN\xe1R\x9dµw\n\xd5)\x9c\xfa\xa7|\x0e\xa7\xd4\xe5\x83Su\xea.թ\xbb\xf6N]u\xca\xffL\x97ꔮ\xbdS\xaaN)\xbf\xf6\x9c_{\xaeN\xb7Ku\xba]{\xa7[u\xba\x9d\xfa\xa7\xfcŧ۹\xff\xfc\x1c/\xf9\xe1Z=?\xc7|p\xfa\xf4\x9c/\x83<^\xf3\x13\xad\x1c\x9e\xfa\xcf\xcf!\xbf2\xe4W\x86|\x90_\x99\xba\xfc\x9a\xd4\xc9a~M\x97_\x93\xaf\xd1s\x97\x0f\xf2S\xf9r>\xb7\xf9 \xff+\xe5\x17\xa4\xfcT\xca\a\xf2!g\xf9\x90|2\xb7\xfc\xd7[\xfe\xeb-\x1f\x9c\xfa\xc7|~\xc7|~\xc7\xe7\x98\x0fN\x9f\x8erf\xf9Q\x0e\xf3kB~Mȯ\t\xf9 ?\xd5姺\xfcT\x97\x0f\xf2S)?\x95\xf2S)\x1f\xe4O\xca_\x9d\x1f\xfb\xc7\xfc\xd5\xc7\xfc\xd5\xc7\xe7[>\xc8\u007f\xbd\xc9_o\xe7\xfe\xe1-^\xf2õ:\xbc\xc5|p\xfatx\xcbg\x91\x1f\xe5\xf0\xd4?\xbc\x85\xfc\x9a\x90_\x13\xf2A~M\xbe>\xf9Q\x0e\xf3k\xba\xfc\x9a.\xbf\xa6\xcb\a\xf9\xa9\x94\x9fJ\xf9\xa9\x94\x0f\xe4mgy[\xfe\xe2[\xfe\xc3-\x1f\xe4?\xdc\xe4\x0f\xb7s\xf5\x16/\xd5[\xbc\xf6\xdeb\xf5\x16O\xfd|2\xd5[l\xf3\xc1\xa9z\v\x97\xea-\\{o\xa1z\v\xa7\xfe[\xea.\xf9\xe1Z\xbd\xa5.\x1f\x9c\xaa\xb7\xeeR\xbdu\xd7\xde[W\xbd\xe5\u007f\xb6\xd7\xde[[\xbd\xa5K\xf5\x96\xae\xbd\xb7T\xbd\xa5\xfc\xbes~˹z\xbb]\xaa\xb7۵\xf7v\xab\xden\xa7\xea\xafx\xa9\xfe\x8a\xd7\xde_\xb1\xfa+\x9e\xaa\xbf¥\xfa+\\{\u007f\x85\xea\xafp\xaa\xfeꮽ\xbf\xba\xea\xaf\xeeT\xfd\x95.\xd5_\xe9\xda\xfb+U\u007f\xa5S\xff\xaf\xfcy\u007f\xa5s\xf5\xd7\xedR\xfdu\xbb\xf6\xfe\xbaU\u007f\xddNկx\xa9~\xc5k\xefW\xac~\xc5S\xffW\x9e\x85\xbf\xf2\x0f\xfa\x15\xdb|p\xaa~\x85K\xf5+\\{\xbfB\xf5+\x9c\xaa_ݥ\xfa\xd5]{\xbf\xba\xeaWw\xaa~\xe5\x97\xe6W\xa5K\xf5+]{\xbfR\xf5+\x9d\xfa\xbf\xf2\xd7\xfdJ\xe7\xea\xd7\xedR\xfd\xba]{\xbfnկ۩\xff+\x8f\xfd_\xb7s\xf5-^\xaao\xf1\xda\xfb\x16\xabo\xf1\xd4\xff\x96\xbf\xf2[l\xf3\xc1\xa9\xfa\x16.շp\xed}\vշp\xea\u007f˗\xef[\xea\xaaoݥ\xfa\xd6]{\xdf\xf2\xe1\xa9\xfa\xd6^{\xdf\xda\xea[~G\xbaT\xdfҵ\xf7-U\xdfR~\xc79\xbf\xe3\\]⥺\xc4k\xef\x12\xabK<\xf5/\xf9k.\xb1\xcd\a\xa7\xea\x12.\xd5%\\{\x97P]©\u007fɷ꒿뒺|p\xaa.ݥ\xbat\xd7ޥ\xab.\xf9\x9f\xed\xb5wi\xabK~o\xbaT\x97t\xed]RuI\xf9\xbd\xe7\xfc\xb6s\xff۷x\xc9\x0f\xd7\xea۷\x98\x0fN\x9f\xbe\xe5\x1f\x97\x0f[9<\xf5\xbf}\v\xf95!\xbf&\xe4\x83\xfc\x9a\xc8\xffJ\xf9\x05)?\x95\xf2\x81|\xc8Y>\xe4\xdc?\xe6\xd38\xe6\xd38~\x8b\xf9\xe0\xf4\xe9(\xa7\x91\x1f\xfb\xc7|\x02\xc7|\x02\xc7o!\x1f\x9c\xfa\xc7\xfc}\xc7\xfc}\xc7o]>\xc8O\xb5\xf9_\xf9\xe5y\xa2\xe7\xef;\xe6\xef;~K\xf9 \u007f\xa2L\xe1\xfc}\x87c\x9e\xa4\xc7\x1d\x8ey)ˏ\xd7\xfcD+\x87\xa7\xfeᘧ\xea1O\xd5c\xc8\a\xf9\x952U\x8f\xa9\xeb\x1f\x8ey\x92\x1e\xe5\x9fy\x82\x1e\xdb\xfc\xba6\x1f\xe4\u007f\xa5Ku\x8c\xf9\xbfk\xef\x18\xabc<\xf5\xf3\xc7W\xc7\xfc\x9b\xf2\x1d=\x86k\xef\x18\xaac\xfeA\xf9F\xe6\x8f<\xe6\x1by\xec.ձ\xbb\xf6\x8e]u\xcc\xffl\xaf\xbdc[\x1d\xf3[\xf2g\xa6k\uf62ac\xcao;緝\xfb\x87\x1f\xf9\x17\xfdȿ\xe8G\xcc\a\xa7O\x87\x1f\xf2[~\xe4\xdf\xf2C~ˏ\xfc[~\xe4\xdf\xf2#\xe4\x83\xfc\x1a\xf9-?\xf2\xb2\xf3C\x96\x9d\x1fy\xc5\xf9\xd1\xe5\x83\xfc\xaf\xfc\x83~\xb4\xf9 \xff+\xaf??\xf2\xfa\xf3#\xe5\x03y\xffYޟ\xcf\xe0\x96\xff\x9a\x17\xa1\x1f\xb7|\x90\xff*\x8bЏ۹\xfa\x11/Տx\xed\xfd\x88Տx\xea\xff\xc8\x137\x9f_\xf5#\xb6\xf9\xe0T\xfd\b\x97\xeaG\xb8\xf6~\x84\xeaG8\xf5\u007f\xe4\xe1\x9dϮ\xfa\x91\xba|p\xaa~t\x97\xeaGw\xed\xfd\xe8\xaa\x1f\xf9\x9f\xed\xb5\xf7\xa3\xad~\xe4\xf7\xa6K\xf5#]{?R\xf5#\xe5\xf7\x9e\xf3\xdb\xceՏۥ\xfaq\xbb\xf6~ܪ\x1f\xb7S?\x9fN\x95\xcf\xe6%^\xaa\x97x\xed\xbd\xc4\xea%\x9e\xfa/\xf9l^\xf2ټ\xc46\x1f\x9c\xaa\x97p\xa9^µ\xf7\x12\xaa\x97p\xea\xbf\xe4\xb3y\xc9g\xf3\x92\xba|p\xaa^\xbaK\xf5\xd2]{/]\xf5\x92\xff\xd9^\xaa\x97\xf6\xda{i\xab\x97\xfc\xfet\xa9^ҵ\xf7\x92\xaa\x97\x94\xdf\u007f\xceo=W\xaf\xf1R\xbd\xc6k\xef5V\xaf\xf1\xd4\u007f\xcd_\xfa\x1a\xdb|p\xaa^åz\r\xd7\xdek\xa8^é\xff\x9a\xbf\xef5u\xf9\xe0T\xbdv\x97굻\xf6^\xbb\xea5\xff\xb3\xbdT\xaf\xed\xb5\xf7\xdaV\xaf\xf9\xad\xe9R\xbd\xa6k\xef5U\xaf)\xbf\xf5\x9c\xdfz\ueffc\xc4K~\xb8V//\xf1\xd3K\xfe\x91\xf9\x9f\xad\x1c\x9e\xfa//!\xff9\xe4?\x87|p\xfa\xf4\x92\u007f\xab<\xe6W\xa6N\x0e\xf3+\xf3\x15x\xc9W\xe0\xa5\xcb\a\xf9\xa9|\xd9^\xf2e{i\xf3A~*\xe5\xa7R~*\xe5\x03\xf9\xbc\xb3|\xd2\xf9ӛ|}~\xec\xbf\xe5/~\xcb_\xfc\xf6\x12\xf2\xc1\xe9ӛ|e~\x94\xc3S\xff-\u007f\xe5[\xfeʷ\x97.\x1f\xe4\xa7\xf2\xe6\xf5\x92\xdf\xdf\xe6\u007f\xa5\xfc\x82\x94\x9fJ\xf9@>\xe4,\x1fr\xee\x1f\xaeyJ\\\xf3\x94\xb8\xc6|p\xfat\xb8\xca$\xbf\xcaĸ\xe6\x89q\x95\x89q\xcd\x13\xe3\x9a'\xc65\xe4\x83\xfc\xca|\x15\xf2c~e\x9e\x1eW\x99\x1e\xd7<\xe1\xafy\x8e\\\xbb|\x90\x9f\xcas\xe4\xda\xe6\x83ӧ\xa3\xfc\xc4\xfc(\x87\xa7\xfe1\xff\xd0c\xfe\xa1Ǘ\x90\x0f\xf2k\xf2g\x1f\xe5\xe7\xe6\xc7\xfe1\xff\xd0c\xfe\xa1\xc7\x17\xf9W~[^(^\xda|p\xaa\x0e\xf9\x97\xe4\xa1r\x88mu\b\x97\xea\x10\xae\xbdC\xa8\x0e\xe1\xd4?\xe4\xa1y\xc8C\xe5\x90W\xa4\xe2\xb5\xf7\x11\xab\x8fx\xea\u007f\xe4\xd3\xf8\x88m>8U\x1f\xe1R}\x84k\xef#T\x1f\xe1\xd4\xffȟ\xf7\x91\xba|p\xaa>\xbaK\xf5\xd1]{\x1f]\xf5\x91\xff\xd9^{\x1fm\xf5\x91ߖ.\xd5G\xba\xf6>R\xf5\x91\xf2\xdb\xce\xf9m\xe7\xea\xe3v\xa9>n\xd7\xdeǭ\xfa\xb8\x9d\xfa\x1fy\xbe~\xdc\xce\xd5\xd7x\xa9\xbe\xc6k\xefk\xac\xbe\xc6S\xffk\x9e\xaf_\xf3\x89|\x8dm>8U_å\xfa\x1a\xae\xbd\xaf\xa1\xfa\x1aN\xfd\xaf\xf9D\xbe\xa6.\x1f\x9c\xaa\xafݥ\xfa\xda]{_\xbb\xeak\xfeg{\xed}m\xab\xaf\xf9m\xe9R}M\xd7\xde\xd7T}M\xf9m\xe7\xfc\xb6s\xf5\xf5v\xa9\xbeޮ\xbd\xaf\xb7\xea\xeb\xed\xd4\xff\x9aO\xe4\xeb\xed\xdc\xff\xf8\x88\x97\xfcp\xad>>b>8}\xfa\xf8\xc8c*?^\xf3\x13\xad\x1c\x9e\xfa\x1f\x1f!\xbf2\xe4W\x86|\x90\x9f\xcaW\xe7\xa3\xcb\a\xf9_\xf9B~\xb4\xf9 \xff+\xe5\u007f\xa5|\x90?3\x8f\xe2\xfc\xd8\xff\xf8\xb8\xe5Ϲ\xe5\xbf\xde\xf2A\xfe\xebM\xfez;\xf7\x8f\xf9|\x8e\xf9|\x8e\x1f1\x1f\x9c>\x1d\xe5L\xf2\xa3\x1c\x9e\xfa\xc7|&\xc7|&Ǐ\x90\x0f\xf2kd\xec\xe5;u\xfc\x90\xa3<\xe4\xf2\t\x1d?\xda\xfc|>H\xf9@^{\x96\xd7\xe6oˑo>\x97\xe3\xc7-\x1f\xe4\xbfJ\xe4\x9bo\xd2{\xbcT\xef\xf1\xda{\x8f\xd5{<\xf5\xdf\xf3\xfdy\x8fm>8U\xef\xe1R\xbd\x87k\xef=T\xef\xe1\xd4\u007f\xcf\xf7\xe7=u\xf9\xe0T\xbdw\x97꽻\xf6\u07bb\xea=\xff\xb3\xbd\xf6\xde\xdb\xea=\xbf-]\xaa\xf7t\xed\xbd\xa7\xea=川\xf3\xdb\xce\xd5\xfb\xedR\xbd߮\xbd\xf7[\xf5~;\xf5\xdf\xf3\xfdy\xbf\x9d\xfb\xef\xef\xf1\x92\x1f\xae\xd5\xfb{\xcc\a\xa7O\xef\xf9D\xf2a+\x87\xa7\xfe\xfb{ȯ\t\xf95!\x1f䧺\xfcT>\xa7\xf7.\x1f\xe4\xa7\xf2鿷\xf9 \xff+\xe5\x17\xa4\xfcT\xca\a\xf9\xa9[~ꖟ\xba\xe5\x83\xfcU\xf9b\xe4\xc7\xfe\xc7!\xdf\xfeC\xbe\xfd\x87\x90\x0fN\x9f>\xf2$\xed\xe7G9<\xf5?\x0e]~M\x1e\x14\x87.\x1f\xe4\xa7\xda\xfcT\x1e\x19\x876\x1f\xe4\xa7R~*\x0f\x8fC\xca\a\xf2Ig\xf9\xa4\xfc=yx\x1c\xf2\xf08\xdc\xf2A\xfe\xab\f\x8f\xc3\xed\xdc\xff\x9a\xcf\xe2k>\x8b\xaf\x87\x90\x0fN\x9f\xbe\xe6\xf5B\x1e\xaf\xfd\xfc(\x87\xa7\xfe\xd7|._\xf3\xb9|=t\xf9 ?\x95gY>\x97\xaf\x876\x1f\xe4\xa7R\xfeW\xca\a\xf2Qg\xf9\x90\xfcE\xb7\xfc\xda[\xfe\xeb-\x1f\xe4\xbf\xde䯷s\xff|\x0e\xd7\xea|\x0e\x9f\xce\xe7\xfc\xb5\xf9\xb1\u007f>w\x97\xfc\x90\xff \xff:\xf5\xcf\xe76?\xd5\xe6\xa7\xda|\x90\x9fJ\xf9\xa9\x94\x9fJ\xf9\xe0\x94?\xe3,\x9f\x91?\xf7\x96\xffz\xcb\u007f\xbd\xe5\x83\xfcכ\xfc5ύs\x1e\xf7\xf9\xab\x8f\xe7\x90\x0fN\xfdc\xfe\xbe\xe3\xb9\xcb\a\xf9_m~A\x1e\xf5\xe76\x1f\xe4\xa7rؘ\xbf\xefxN\xf9\xe0\xf4\xe9(ߗ\x1f\xfb\xc7\xfc}\xc7\xfc}\xc7\xf3-\x1f\xe4\xbf\xca\xf8\xcf\xdf\xf7\x9e/\xf6{\xbe\xd8\uf1d0\x0fN\x9f\xde\xe52\xe7G9<\xf5\xdf\xf3e~ϗ\xf9\xfd\xd0\xe5\x83\xfcT\x9b\x9fʣ\xed\xd0\xe6\x83\xfcT\x1em\xf9Z\xbf\x1fR>\x90O:\xcb'\xe5\xef\xc9\x03/_\xeb\xf7\xc3-\x1f\xe4\xbf\xca\xc0;\xdc\xce\xd59\\\xaas\xb8\xf6Ρʿ8_\xf0J\xaew\x9eh\xe7\xeeR\x9d\xbbk\xef\xdcU\xe7\xfc\xcf\xf6\xda;\xb7չ=U\xe7t\xa9\xce\xe9\xda;\xa7\xea\x9c\xf2\xdb\xce\xf9m\xe7\xea|\xbbT\xe7۵w\xbeU\xe7۩\x9f\u007fmu\xbe\x9d\xab\xef\xf1R}\x8f\xd7\xde\xf7X}\x8f\xa7\xfe\xf7\xbc\"\u007f\xcf3\xfe{l\xf3\xc1\xa9\xff=\xefK\xdf\xf3\xd7\u007fO]>8U\u07fbK\xf5\xbd\xbb\xf6\xbew\xd5\xf7\xfc\xcft\xa9\xbe\xa7k\xef{\xaa\xbe\xa7\xfc\x86s~\xed\xb9\xfa~\xbbT\xdfo\xd7\xde\xf7[\xf5\xfdv\xea\u007f\xcf\xdf\xf9\xfdv\xae~\xc6K\xf53^{?c\xf53\x9e\xfa?\xf3w\xfe\xcc\xdf\xf93\xb6\xf9\xe0\xd4\xff\x99\xbf\xf3g\xfeΟ\xa9\xcb\a\xa7\xeagw\xa9~v\xd7\xdeϮ\xfa\x99\xff\x99.\xd5\xcft\xed\xfdL\xd5ϔ\xdfpί=W?o\x97\xea\xe7\xed\xda\xfby\xab~\xdeN\xfd\x9f\xf9;\u007f\xde\xce\xfd\xef\xdf\xe3%?\\\xab\xef\xdfc>8}\xfa\x9e\u007f\xac<^\xf3\x13\xad\x1c\xe6\xa7\xf3\xbdΏrx\xea\u007f\xff\x9e/\xc0\xf7|\x01\xbew\xf9 ?\x95\xf2S)?\x95\xf2\x81\xbc\xed,o\xcb\xdfu\xcb\u007f\xbd\xe5\xbf\xde\xf2\xc1\xa9\u007f\xcc_\u007f\xcc_\u007f\xfc\x1e\xf3\xc1\xe9\xd3Q\xbe\xfe(_\x9f\x1f\xe50?-Kz\xbe\xd6\xc7\xfc\xc5\xc7\xfc\xc5\xc7\xef\xf2\xaf\xfc9yH\u007fO\xf9@^{\x96מ\xfb\xc7\xfc\x9d\xc7\xfc\x9d\xc7\xef\xb7|\x90\xff*C\xfa{\x9eB\xb7\xfc\xf5\xb7\xfc\xf5\xb7\x98\x0fN\x9f\x8e7\xf9\xfa\x9b|\xfd-\u007f\xfdM\xbe\xfe&_\u007fK\x9d\x1c\x9e\xfa\xc7[>\x89[>\x89[\x97\x0f\xf2Syr\xdd\xf2\x99\xdcR>8U\xd7x\xa9\xae\xf1ڻ\xc6\xea\x1aO\xfd\x1c\x9e\xe5\x87ku\x8dm_b\xb3\x1c\x81U\xd7\xd4U\xd7\xeeR]\xbbk\xef\x9a\x0fO\xd5\xf5v\xa9\xae\xb7k\xefz\xab\xae\xb7S\xff\x9ao\xd8\xf5v\xaen\xf1R\xdd\xe2\xb5w\x8b\xd5-\x9e\xfa\xf9l\xf3õ\xba\xc56\x1f\x9c\xfa\xb7\xef\xf0\xff\x9b\xf7\xf1_\xb1U\xfc\xdfw\xff\xbc\xfe\xc7|\xfd\x1f\x9f\xe3߱~\xfeW\xff\x86\xff\xbe\xbf\xe1\xbf\xd5\x1e\xfe\xaf\xfc\r\xffs\xde\xe1?\xfev\xf8\x9f\xf1\xf3\xfa_\xe7\xeb\xdf;?\xe7\xdf\xcb\x0e\xff\xb5\u007f\x8f\u007f/9\xbe\xfe\xcf\xfe\xfa/\xf3\xf8\x8f\xbfy\x87\xff-\xc7\u05ff\xed\xe3\xdfp\x0f\xfe-\u007f\x8e\xff\x86\r\xed\u007f`\x83\x89\xef\xfc\x1f\xd8<\xfe\xdb_\xfc\xf9_\xd8\xe2\xe0\xa5\xd7\xff?\xfe\xbf\xfe?\x16\xff\xf3\u007f\xff\xfc\xdf?\xff\xf7\xcf\xff\xfd\xf3\u007f\xff\xfc\xdf\xff\x17\xff\xa7\xff䙎t&\x86\x11\xd2َt\xb6\x82\xf0\x17\xd2\xe9!\x9dב\xce\vׯ\x8a`\b\x03\xe1\x8b\xf0A\xc0\xd4\x1a҉k\x86O\xc1\xf5\x81\xd0RHg\t\xe9\xfc\r\xe9|?\xff\xad\xf5\x13҉\xb7\xc4#\x9d1\xfd (\xe2\x1d\xb1Ꮽ0\xfe\xe1\x05G\xb8\xf0\xf5\xc5iWe4\xc6\xc1\xf8e\xfc0\xf2=H5r\x86\xf1C9m06\xfc,\x11?b\xfcEx#\xe0g\x89\xf8Y\xe2_H\xfb<\xd2>\xd3\x0f\x82\xe2\xc0\v\r\u007fDb\xfbDb\xfbt\x84\v__\x9c\x86\xc4\xf6\x89\xc4\xf6\x89\xc4\xf6\x89\xc4\xf6\x89\xc4\xf6y\xf1=\x15\x813\x8c\x1f\xcai\x83\x11\x89\xed\xb3 \xfc\"\xbc\x11\xbe\b\x1f\x04\xbe=bbL\xff`|\x06\xbe96~ъ\x86?\xbe\xe6\x8c\x17_\xba4\xfb\xaa\x1aL\xc3\xd0\xf0\xd5\xf0Ѡ7\U000c725ag\xfa\x1e\x9a=44\xfȇ\xf7#\xfe2\xbe\x19\xf93G\xfe̸\x9b\xb1\x1f)\xf6\xf4\x83\xa08\xf0B\xc3\x1fq7c\xc7\u074c\xdd\x11.|}q\x1a\xeef츛\xb1\xe3nƎ\xbb\x19;\xeef\xec\x17\xdfS\x118\xc3\xf8\xa1\x9c6\x18q7c/\b\xbf\bo\x84/\xc2\a\xe1O\xff\xf9\x1e\x93\x12\xc3\b)\xb6#E\x88?B\xfc\xd1C\x8aב\"\xc4\x1f!\xfe\b\xf1G\x88?B\xfc\x11\xe2\x8f\x10\u007f\xac!E\\\x83\xf8#\xaeC\xfc\x11\xe2\x8f%\xa4\xf8\x1bR|?}\x83OH\x11\x8f2\xf6\x1f\x04<\x15\xdc\x18\r\x83\xaf5~\xc1G\x89\x9b\xc3ל\xf1\xe2K\x97f\xf3Q\xe2\x0ei\x18\x1a\xbe\x1a>\x1a\xf4\xe6ʨy\xa6\xef\xa1\xd9C\x03\x1fe\xec\x85\xf1\x97\xf1\xcd\xf8e\xfc0baD$\xce\xc9I\x11\x1aƊ\xdd\\\xb1\x9b+vc\xc5n\xac\xd8\xcd\x15\xbb\xb9b7W\xec\xe6\x8a\xdd\\\xb1\x9b+vs\xc5n\xac\xd8\x1d9\x83\v#r\x1a\x17\x06W\xecƊ\xddX\xb1\x1b+vc\xc5n\xac\xd8\x1d\xffԘIG\xea\x89a\x84\xd4ۑ:\x1eeǣ\xec\x1eR\xbf\x8e\xd4\xf1(;\x1eeǣ\xecx\x94\x1d\x8f\xb2\xe3Qv<\xca^C긆G\xd9q\x1d\x8f\xb2\xe3Q\xf6\x12R\xff\r\xa9\xbf\x9f\x8e\xd0'$ܕu\x1ei\xc1.\x16\xedb\xd1.\x16\xecb\xd1.\x16\xedb\xc1.\x16\xecb\xd1.\x16\xedb\xd1.\x16\xedb\xd1.\x16\xedb\xd1.\x16\xecb\x9d\x9ca\xfcPN\x1b\x8c\xb8+\vv\xb1`\x17\vv\xb1`\x17\vv\xb1N\xbe=b\"\xecb\xc9.\x96\xecb\xd1.\x96\xecb\xc9.\x16\xedb\xd1.\x96\xecb\xc9.\x96\xecb\xc9.\x96\xecb\xc9.\x96\xecb\xd1.\x16\xedb\xc9.\x16\xedb\xc9.\x96\xecb\xd1.\x16\xedb\xd1.\x16\xedb\xd1.\x16\xed\xa2\xc7#uh\xacSc\x9d\x1a\xeb\xd0X\xa7\xc6:5֡\xb1\x0e\x8duj\xacSc\x9d\x1a\xeb\xd4X\xa7\xc6:5֩\xb1\x0e\x8d\xf5\xc8\x19\xc6\x0f\xe5\xb4\xc1\x88\xbb١\xb1\x0e\x8duh\xacCc\x1d\x1a\xeb\xac\n\xfdH\x1b>\xb6\xe9c\x9b>\xb6\xe1c\x9b>\xb6\xe9c\x1b>\xb6\xe1c\x9b>\xb6\xe9c\x9b>\xb6\xe9c\x9b>\xb6\xe9c\x9b>\xb6\xe1c\xbbs\x06\xc5\xdf9\x8d⧏m\xf8؆\x8fm\xf8؆\x8fm\xf8؆\x8f͐f:\xd2L\f#\xa4َ4!\xfe\t\xf1O\x0fi^G\x9a\x10\xff\x84\xf8'\xc4?!\xfe\t\xf1O\x88\u007fB\xfc\xb3\x864q\r⟸\x0e\xf1O\x88\u007f\x96\x90\xe6oH\xf3\xfd4\xb6\xe8cK>\xb6\xe4c\x8b>\xb6\xe4cK>\xb6\xe8c\x8b>\xb6\xe4cK>\xb6\xe4cK>\xb6\xe4cK>\xb6\xe4c\x8b>\xb6\xe8cK>\xb6\xe8cK>\xb6\xe4c\x8b>\xb6\xe8c\x8b>\xb6\xe8c\x8b>\xb6\xe8c+\"qNN\x8aX\\\xd0آ\xc6\x165\xb6\xa0\xb1\x05\x8d-jlQc\x8b\x1a[\xd4آ\xc6\x165\xb6\xa8\xb1\x05\x8d\xad\xc8\x19\\\xb1\x91Ӹb\xa9\xb1\x05\x8d-hlAc\v\x1a[\xd0\u0602\xc6V>\xd2\xca\xf8^9)\xe232\x12\xcbL,3\xb1\x8c\xc42\x12\xcbL,3\xb1\xcc\xc42\x13\xcbL,3\xb1\xcc\xc42\x12˜\xc1\xc42\xa71\xb1\xcc\xc42\x12\xcbH,#\xb1\x8c\xc42\x12\xcb\x10\xff<Ҟ\xd0\xf3L\x8a\xd0\xe9\x84\xf8'\xc5?)\xfe\t\xf1O\x88\u007fR\xfc\x93\xe2\x9f\x14\xff\xa4\xf8'\xc5?)\xfeI\xf1O\x88\u007fr\x06\xc5?9\x8d\xe2\x9f\x14\xff\x84\xf8'\xc4?!\xfe\t\xf1O\x88\u007f\xa2\xf4\xce#E$\x16\x99Xdb\x11\x89E&\x16\x99XDb\x11\x89E&\x16\x99Xdb\x91\x89E&\x16\x99Xdb\x11\x89\xc5\xc9\x19\xdc]LN\xe3\ue089E$\x16\x91XDb\x11\x89E$\x16\x91\xd8\xceG\xdax\x94\x9b\x8fr\xf3Qn<\xca\xcdG\xb9\xf9(7\x1e\xe5ƣ\xdc|\x94\x9b\x8fr\xf3Qn>\xca\xcdG\xb9\xf9(7\x1f\xe5ƣܙ3x\xc72\xa7\xf1\x8e\xf1Qn<ʍG\xb9\xf1(7\x1e\xe5ƣ\xdc\xf9O\a!ґrb\x18!\xe5v\xa4\f\xbbȰ\x8b\xec!\xe5\xebH\x19v\x91a\x17\x19v\x91a\x17\x19v\x91a\x17\x19v\x91kH\x19\xd7`\x17\x19\xd7a\x17\x19v\x91KH\xf97\xa4\xfc~N`|B\x82\x8et\xf4 \xfd (\x0e\xbc\xd0\xf0Gܕ\xc4Z\x99P+\x13jeb\xadL\xac\x95\x89\xb52\xb1V&\xd6\xca\xc4Z\x99X+\x13je:9\xc3\xf8\xa1\x9c6\x18qW\x12jeB\xadL\xa8\x95\xcfq\b\x1e\x8c\xe0\xdb#&\xa2V&\xd5ʤZ\x99X+\x93jeR\xadL\xac\x95\x89\xb52\xa9V&\xd5ʤZ\x99T+\x93jeR\xadL\xaa\x95\x89\xb52\xb1V&\xd5\xca\xc4Z\x99T+\x93jeb\xadL\xac\x95\x89\xb52\xb1V&\xd6J\x80ʑ\xd2>\u007f\x10\xf0\xfd\xc1*\x1a\x06_k\xfc\x82I\x83W\xf8\x9a3^|\xe9\xd2l&\rh\xd104|5|4\xe8͕Q\xf3L\xdfC\xb3\x87\x06&\xbd\xcf\xc2\xf8\xcb\xf8f\xfc2~\x18\xf5Q\x91o\x88\xe9_5\xfc\xe7\xa8ωM_\xb6\xf2\x8c\u007fz\xd95\\z\xf5z\xdet\xd5g\xb4g\x1c\xcf\xf8}\xc6\xcf3>\x9f\xa2\x1f7>\xb3\xed\xf9\x96ϛ\xc636ݛ\xa8\x9b\x17\u007f5\xbc5\xe8\xdeD\xdd\x1b>\x05\x94\xc0\xc4\x12\x98T\x02\x93J`b\tL*\x81I%0\xb1\x04&\x96\xc0\xa4\x12\x98T\x02\x93J`R\tL*\x81I%0\xa9\x04&\x96\xc0\xc4\x12\x98T\x02\x13K`R\tL*\x81\x89%0\xb1\x04&\x96\xc0\xc4\x12\x98X\x02\x13K\xa0\x8e\xf1prRĚA\tL,\x81\x89%0\xa1\x04&\x94\xc0\xc4\x12\x98X\x02\x13K`b\tL,\x81\x89%0\xb1\x04&\x94\xc0\x149\x83\v1r\x1a\x17\"K`B\tL(\x81\t%\xf09Z\xc4CF\x94G\xec\xff`\xe4\x13\xc6\r}ơ\x97\x9b\xbe\x94\xbd\xe9ӛ>\xbd\xe9ӛ>\xbd\xe9ӛ>ͳ\x95\x98\xcc\xfdm\xe2\xfe6a\u007f\x9b\xb8\xbfM\xdc\xdf&\xeco\x13\xf6\xb7\x89\xfb\xdb\xc4\xfdm\xe2\xfe6q\u007f\x9b\xb8\xbfM\xdc\xdf&\xeeo\x13\xf6\xb7ir\x06\x17\xe2\xe44.D\xeeo\x13\xf6\xb7\t\xfbۄ\xfd\xedsޓ'?\xa9i\xfa\xf4\x92O\xafǧ\xd7\xe3\xd3K>\xbd\x1e\x9f^\x8fO/\xf9\xf4\x92O\xafǧ\xd7\xe3\xd3\xeb\xf1\xe9\xf5\xf8\xf4z|z=>\xbd\x1e\x9f^\xf2\xe9%\x9f^\x8fO/\xf9\xf4z|z=>\xbd\xe4\xd3K>\xbd\xe4\xd3K>\xbd\xe4\xd3K>\xbd\"\u007f*\xbd)=\x03W=5\xbd\xa4\xe9%M/jzQ\xd3K\x9a^\xd2\xf4\x92\xa6\x974\xbd\xa4\xe9%M/izQ\xd3+j\x9e\x9c%j\xb6\x9cE\x9a^\xd4\xf4\xa2\xa6\x175\xbd\xa8\xe9EM/jze\xfc1\xf3\xfb\xe7\xf4\f\xfc\xc0̤\xb3\x92\xceJ:3\xe9̤\xb3\x92\xceJ:+鬤\xb3\x92\xceJ:+\xe9̤\xb3\xe6)\xe9\xac\xd9J:+\xe9̤3\x93\xceL:3\xe9̤3\x17ℼ'\xd7\xd4L\xcf\xc0E2\xb9\x10\xa7\x16\xe2\xd4B\x9c\\\x88\x93\vqj!N-ĩ\x858\xb5\x10\xa7\x16\xe2\xd4B\x9cZ\x88\x93\vqj\x9e\x16\xe2\xd4l-ĩ\x858\xb9\x10'\x17\xe2\xe4B\x9c\\\x88<ռ'\xb75H:2騤\xa3\x92\x8eL:*騤#\x93\x8eL:*騤\xa3\x92\x8eJ:*騤\xa3\x92\x8eL:N\xcd\xd3.oj\xb6vyJ:2\xe9Ȥ#\x93\x8eL:2\xe9Ȥ7\xe4\xb1)\x8f-yl\xc9cS\x1e[\xf2ؒǦ<6\xe5\xb1%\x8f-yl\xc9cK\x1e[\xf2ؒǖ<6屳\xe6\xe9Ng\xcd֝\x96<6\xe5\xb1)\x8fMyl\xcacS\x1e\x9b\x8c\x98\x8f\x94@Ή\xe4\x9cH\xce\t\xe4\x9cHΉ\xe4\x9c@\xce\t\xe4\x9cHΉ\xe4\x9cHΉ\xe4\x9cHΉ\xe4\x9cH\xce\t\xe4\x9c2g\xd0\xf22\xa7\xd1\xf2H\xce\t\xe4\x9c@\xce\t\xe4\xfc\x9c\xa8\x87\xe5\xe5?\xfd\xfd\x8dt\xb431\x8c\xd0\xcev\xb4\xb3\x15\x84\xbf\xd0N\x0f\xed\xbc\x8ev^\xb8~U\x04C\x18\b_\x84\x0f\x02\xa6\xd6\xd0N\\3|\n\xae\x0f\x84\x96B;Kh\xe7oh\xe7;\xb4\xf3\x1b\xda\xf9\t\xed\xc4[\xe2\xd1Θ~\x1a\xbbe\x8dݲvƆ?\xb6\xc2\xf8\x87\x17\x1c\xe1\xc2\xd7\x17\xa7]\x95\xd1\x18\a\xe3\x97\xf1\xc3\xc8\xf7 \xd5\xc8\x19\xc6\x0f\xe5\xb4\xc1\xd8\xf0\xb3D\xfc\x88\xf1\x17ፀ\x9f%\xe2g\x89\u007f\xa1\xed\xf3h\xfbL?\x8dݲ\xc6nY\xdbg\xc3\x1f\x91\x18\xbbem\x9f\x8ep\xe1\xeb\x8bӐ\x18\xbbe\x8dݲ\xc6nYc\xb7\xac\xb1[\xd6\xf6Y\x118\xc3\xf8\xa1\x9c6\x18\x91\xd8>\v\xc2/\xc2\x1b\xe1\x8b\xf0A\xe0\xdb#&\xc6\xf4\x8f\xa6nYS\xb7\xac\xb1[\xd6\xd4-k\xea\x965v\xcb\x1a\xbbeMݲ\xa6nYS\xb7\xac\xa9[\xd6\xd4-k\xea\x965u\xcb\x1a\xbbe\x8dݲ\xa6nYc\xb7\xac\xa9[\xd6\xd4-k\xec\x965v\xcb\x1a\xbbe\x8dݲ\xc6nYc\xb7\xac\xc5~\xb4\xd8\xd3Oc\xb7\xac\xb1[\xd6bo\xf8#\xee&\xbbe-vG\xb8\xf0\xf5\xc5i\xb8\x9b\xec\x965v\xcb\x1a\xbbe\x8dݲ\xc6nY\x8b\xbd\"p\x86\xf1C9m0\xe2n\xc6^\x10~\x11\xde\b_\x84\x0f\u009f\xfeR\x12&%\x86\x11ZlG\x8b\x10\u007f\x84\xf8\xa3\x87\x16\xaf\xa3E\x88?B\xfc\x11\xe2\x8f\x10\u007f\x84\xf8#\xc4\x1f!\xfeXC\x8b\xb8\x06\xf1G\\\x87\xf8#\xc4\x1fKh\xf17\xb4\xf8\x0e-~\xf5נ\"\x1ee\xec?\x8dݲ\xa6nYS\xb7\xac\xb1[\xd6\xd4-k\xea\x965v\xcb\x1a\xbbeMݲ\xa6nYS\xb7\xac\xa9[\xd6\xd4-k\xea\x965u\xcb\x1a\xbbe\x8dݲ\xa6nYc\xb7\xac\xa9[\xd6\xd4-k\xec\x965v\xcb\x1a\xbbe\x8dݲ\xc6nYc\xb7\xac\xed\x88\xc499)B\xc3X\xb1\xec\x965v\xcb\xdaƊ\xddX\xb1\xec\x965v\xcb\x1a\xbbe\x8dݲ\xc6nYc\xb7\xac\xb1[\xd66V쎜\xc1\x85\x119\x8d\v\x83+vc\xc5n\xac؍\x15\xbb\xb1b7V\xec\x8e\u007f\xfa\xabf\xe9h=1\x8c\xd0z;Zǣ\xecx\x94\xddC\xeb\xd7\xd1:\x1eeǣ\xecx\x94\x1d\x8f\xb2\xe3Qv<ʎG\xd9kh\x1d\xd7\xf0(;\xae\xe3Qv<\xca^B뿡\xf5\xf7\xf3w\xdc>\xa1ᮬ\xf3h\vv\xc1nYc\xb7\xac-\xd8\x05\xbbe\x8dݲ\xb6`\x17\vv\xc1nYc\xb7\xac\xb1[\xd6\xd8-k\xec\x965v\xcb\x1a\xbbem\xc1.\xd6\xc9\x19\xc6\x0f\xe5\xb4\xc1\x88\xbb\xb2`\x17\vv\xb1`\x17\vv\xb1`\x17\xeb\xe4\xdb#&\xc2.\xd4-k\xea\x965v˚\xbaeMݲ\xc6nYc\xb7\xac\xa9[\xd6\xd4-k\xea\x965u˚\xbaeMݲ\xa6nYc\xb7\xac\xb1[\xd6\xd4-k\xec\x965u˚\xbae\x8dݲ\xc6nYc\xb7\xac\xb1[\xd6\xd8-k억\x1e\x8f֡1v\xcb\x1a\xbbe\xadCc\xec\x965v\xcbZ\x87\xc6:4\xc6nYc\xb7\xac\xb1[\xd6\xd8-k\xec\x965v\xcb\x1a\xbbe\xadCc=r\x86\xf1C9m0\xe2nvh\xacCc\x1d\x1a\xeb\xd0X\x87\xc6:\xab\x02O\x02C\xcf\xf41v\xcbچ\x8f\xb1[\xd6\xd8-k\x1b>\xb6\xe1c\xec\x965v\xcb\x1a\xbbe\x8dݲ\xc6nYc\xb7\xac\xb1[\xd66|lwΠ\xf8;\xa7Q\xfc\xf4\xb1\r\x1f\xdb\xf0\xb1\r\x1f{N'\xf3\x9c\xf2\x9f\xfe6e:\xdaL\f#\xb4َ6!\xfe\t\xf1O\x0fm^G\x9b\x10\xff\x84\xf8'\xc4?!\xfe\t\xf1O\x88\u007fB\xfc\xb3\x866q\r⟸\x0e\xf1O\x88\u007f\x96\xd0\xe6oh\xf3\xfd\xfc5\xceOh\x13\x1a\x83\x8f\xb1[\xd6\xd4-k\xea\x965v˚\xbaeMݲ\xc6nYc\xb7\xac\xa9[\xd6\xd4-k\xea\x965u˚\xbaeMݲ\xa6nYc\xb7\xac\xb1[\xd6\xd4-k\xec\x965u˚\xbae\x8dݲ\xc6nYc\xb7\xac\xb1[\xd6\xd8-k억\x15\x918''E,.h\x8cݲ\xc6nY[\xd0\u0602\xc6\xd8-k\xec\x965v\xcb\x1a\xbbe\x8dݲ\xc6nYc\xb7\xac-hlE\xce\xe0\x8a\x8d\x9c\xc6\x15K\x8d-hlAc\v\x1a[\xd0\u0602\xc6\x164\xb6\xf2\xd1V\xc6\xf7\xcaI\x11\x9f\x91\x91Xfb\x99\x89e$\x96\x91Xfb\x99\x89e&\x96\x99Xfb\x99\x89e&\x96\x91X\xe6\f&\x969\x8d\x89e&\x96\x91XFb\x19\x89e$\x96\x91X\xfe\xfb\xcf3\xef\xd0\xf3L\x8a\xd0\xe9\x84\xf8'\xc5?)\xfe\t\xf1O\x88\u007fR\xfc\x93\xe2\x9f\x14\xff\xa4\xf8'\xc5?)\xfeI\xf1O\x88\u007fr\x06\xc5?9\x8d\xe2\x9f\x14\xff\x84\xf8'\xc4?\xdf\xff\xcf9|\x9e\xc8G\xe9\x9dG\x8bH\x8cݲ\xc6nY\x8bH\x8cݲ\xc6nY\x8bH,\"1v\xcb\x1a\xbbe\x8dݲ\xc6nYc\xb7\xac\xb1[\xd6\xd8-k\x11\x89\xc5\xc9\x19\xdc]LN\xe3\ue089E$\x16\x91XDb\x11\x89E$\x16\x91\x98\xfe\xce\x01n\x02\x1f%\xbbem\xe3Q\xb2[\xd6\xd8-k\x1b\x8fr\xe3Q\xb2[\xd6\xd8-k\xec\x965v\xcb\x1a\xbbe\x8dݲ\xc6nY\xdbx\x94;s\x06\xefX\xe64\xde1>ʍG\xb9\xf1(7\x1e\xe5\xf3\xf7 pǰ\xe7ϡ\xe5t\xb4\x9c\x18Fh\xb9\x1d-\xc3.2\xec\"{h\xf9:Z\x86]d\xd8E\x86]d\xd8E\x86]d\xd8E\x86]\xe4\x1aZ\xc65\xd8E\xc6u\xd8E\x86]\xe4\x12Z\xfe\r-\xbf\x9f\xbfE\xfe\t-\xff\xe9\xb7\f\xa4\xc3\x01\x1c\x0e\xe0\xf0\xb3\x1d\x0e\xe0p\x00\x87\x9f\x1e\xfc\xbc\x0e\ap8\x80\xc3\x01\x1c\x0e\xe0p\x00\x87\x038\x1c\xc0\xe1g\r~\xe2\x9a\xe1Sp} \xb4\x14\xfc,\xc1\xcf\xdf\xe0\xe7\xfb\xf9\xf5\x06\x9f\xe0'\xde\x12\x0f\ap8\x81\xc3\t\x1c\x0e\xe0p\x02\x87\x138\x1c\xc0\xe1\x00\x0e'p8\x81\xc3\t\x1cN\xe0p\x02\x87\x138\x9c\xc0\xe1\x00\x0e\ap8\x81\xc3\x01\x1cN\xe0p\x02\x87\x038\x1c\xc0\xe1\x00\x0e\ap8\x80\xc3Q\xf3|\x9f\x87\x038\x9c\xc0\xe1\x04\x0e\ap8\x81\xc3\t\x1c\x0e\xe0p\x00\x87\x138\x9c\xc0\xe1\x04\x0e'p8\x81\xc3\t\x1cN\xe0p\x00\x87\x038\x9c\xc0\xe1\x00\x0e'p8\x81\xc3\x01\x1c\x0e\xe0p\x00\x87\x038\x1c\xc0\xe1\x00\x0e\ap8\x81\xc3\x05\x1c.\xe0p\x02\x87\v8\\\xc0\xe1\x04\x0e'p\xb8\x80\xc3\x05\x1c.\xe0p\x01\x87\v8\\\xc0\xe1\x02\x0e'p8\x81\xc3\x05\x1cN\xe0p\x01\x87\v8\x9c\xc0\xe1\x04\x0e'p8\x81\xc3\t\x1cN\xe0\xf0\xd8\x0f\ap8\x81\xc3\t\x1c\x0e\xe0p\x02\x87\x138\x1c\xc0\xe1\x00\x0e'p8\x81\xc3\t\x1cN\xe0p\x02\x87\x138\x9c\xc0\xe1\x00\x0e\ap8\x81\xc3\x01\x1cN\xe0p\x02\x87\x038\x1c\xc0\xe1\x00\x0e\ap8\x80\xc3\x01\x1c\xfc\xfd\x19\x98\x94\x18F\xf0\xd8\x0e\ap8\x80ã\a\x8f\xd7\xe1\x00\x0e\ap8\x80\xc3\x01\x1c\x0e\xe0p\x00\x87\x038<\xd6\xe0\x11\xd7 \xfe\x88\xeb\x10?\x80\xc3c\t\x1e\u007f\x83\xc7w\xf0\xf8\xd5o\xec\x88x\x94\xb1\xff8\x81\xc3\x05\x1c.\xe0p\x02\x87\v8\\\xc0\xe1\x04\x0e'p\xb8\x80\xc3\x05\x1c.\xe0p\x01\x87\v8\\\xc0\xe1\x02\x0e'p8\x81\xc3\x05\x1cN\xe0p\x01\x87\v8\x9c\xc0\xe1\x04\x0e'p8\x81\xc3\t\x1cN\xe0\xf0\x1d\x918''Eh\x18+\x96\xc0\xe1\x04\x0e\ap8\x80\xc3\t\x1cN\xe0p\x02\x87\x138\x9c\xc0\xe1\x04\x0e'p8\x80\xc3\x01\x1cN\xe0p\x00\x87\x138\x9c\xc0\xe1\x00\x0e\ap8\x80\xc3\x01\x1c\x0e\xe0p\x00\a\u007f+J:\x1c\xc0\xe1\x00\x0e\xef\xedp\x00\x87\x038\xbc{\xf0~\x1d\x0e\xe0p\x00\x87\x038\x1c\xc0\xe1\x00\x0e\ap8\x80\xc3{\r\xdeq\r\x8f\xb2\xe3:\x1e%\x80\xc3{\t\xde\u007f\x83\xf7\xf7\xf3\xebX>\xc1qW\xd6y8\x80\xc3\t\x1cN\xe0p\x00\x87\x138\x9c\xc0\xe1\x00\x0e\ap8\x81\xc3\t\x1cN\xe0p\x02\x87\x138\x9c\xc0\xe1\x04\x0e\ap8\x80\xc3\t\x1c\x0e\xe0p\x02\x87\x138\x1c\xc0\xe1\x00\x0e\ap8\x80\xc3\x01\x1c\x0e\xe0p\x00\x87\x138\\\xc0\xe1\x02\x0e'p\xb8\x80\xc3\x05\x1cN\xe0p\x02\x87\v8\\\xc0\xe1\x02\x0e\x17p\xb8\x80\xc3\x05\x1c.\xe0p\x02\x87\x138\\\xc0\xe1\x04\x0e\x17p\xb8\x80\xc3\t\x1cN\xe0p\x02\x87\x138\x9c\xc0\xe1\x04\x0e\xef\xf1p\x00\x87\x138\x9c\xc0\xe1\x00\x0e'p8\x81\xc3\x01\x1c\x0e\xe0p\x02\x87\x138\x9c\xc0\xe1\x04\x0e'p8\x81\xc3\t\x1c\x0e\xe0p\x00\x87\x138\x1c\xc0\xe1\x04\x0e'p8\x80\xc3\x01\x1c\x0e\xe0p\x00\x87\x038\xbc\xb3*\xf4\xc3\x01\x1cN\xe0p\x02\x87\x038\x9c\xc0\xe1\x04\x0e\ap8\x80\xc3\t\x1cN\xe0p\x02\x87\x138\x9c\xc0\xe1\x04\x0e'p8\x80\xc3\x01\x1cN\xe0p\x00\x87\x138\x9c\xc0\xe1\x00\x0e\ap8\x80\xc3\x01\x1c\x0e\xe0p\x00\a\u007f\xf1O:\x1c\xc0\xe1\x00\x0e\x9f\xedp\x00\x87\x038|z\xf0y\x1d\x0e\xe0p\x00\x87\x038\x1c\xc0\xe1\x00\x0e\ap8\x80\xc3g\r>q\r⟸\x0e\xf1\x038|\x96\xe0\xf37\xf8|?\xbfq\xe8\x13|Bc\xf01\x02\x87\v8\\\xc0\xe1\x04\x0e\x17p\xb8\x80\xc3\t\x1cN\xe0p\x01\x87\v8\\\xc0\xe1\x02\x0e\x17p\xb8\x80\xc3\x05\x1cN\xe0p\x02\x87\v8\x9c\xc0\xe1\x02\x0e\x17p8\x81\xc3\t\x1cN\xe0p\x02\x87\x138\x9c\xc0\xe1+\"qNN\x8aX\\\xd0\x18\x81\xc3\t\x1c\x0e\xe0p\x00\x87\x138\x9c\xc0\xe1\x04\x0e'p8\x81\xc3\t\x1cN\xe0p\x00\x87\x038\x9c\xc0\xe1\x00\x0e'p8\x81\xc3\x01\x1c\x0e\xe0p\x00\x87\x038\x1c\xc0\xe1\x00\x0e_\xf9p\x00\x87\x138\x9c\xc0\xe1\x00\x0e'p8\x81\xc3\x01\x1c\x0e\xe0p\x02\x87\x138\x9c\xc0\xe1\x04\x0e'p8\x81\xc3\t\x1c\x0e\xe0p\x00\x87\x138\x1c\xc0\xe1\x04\x0e'p8\x80\xc3\x01\x1c\x0e\xe0p\x00\x87\x038\x1c\xc0\xe1{\x1e\x0e\xe0p\x02\x87\x138\x1c\xc0\xe1\x04\x0e'p8\x80\xc3\x01\x1cN\xe0p\x02\x87\x138\x9c\xc0\xe1\x04\x0e'p8\x81\xc3\x01\x1c\x0e\xe0p\x02\x87\x038\x9c\xc0\xe1\x04\x0e\ap8\x80\xc3\x01\x1c\x0e\xe0p\x00\x87\x038<\xce\xc3\x01\x1cN\xe0p\x02\x87\x038\x9c\xc0\xe1\x04\x0e\ap8\x80\xc3\t\x1cN\xe0p\x02\x87\x138\x9c\xc0\xe1\x04\x0e'p8\x80\xc3\x01\x1cN\xe0p\x00\x87\x138\x9c\xc0\xe1\x00\x0e\ap8\x80\xc3\x01\x1c\x0e\xe0p\x00\x87\xef|8\x80\xc3\t\x1cN\xe0p\x00\x87\x138\x9c\xc0\xe1\x00\x0e\ap8\x81\xc3\t\x1cN\xe0p\x02\x87\x138\x9c\xc0\xe1\x04\x0e\ap8\x80\xc3\t\x1c\x0e\xe0p\x02\x87\x138\x1c\xc0\xe1\x00\x0e\ap8\x80\xc3\x01\x1c\x0e\xe0\xe0\xaf\x1dK\x87\x038\x1c\xc0\xe1\xb9\x1d\x0e\xe0p\x00\x87g\x0f\x9e\xaf\xc3\x01\x1c\x0e\xe0p\x00\x87\x038\x1c\xc0\xe1\x00\x0e\apx\xae\xc13\xae\xc1.2\xae\xc3.\x00\x1c\x9eK\xf0\xfc\x1b<\xbf\x9f\xdfw\xf6\t\x0e\x1d\xe9\xb7~\xa5\x1f\x04Ł\x17\x1a\xfe\x88\xbb⬕\x8eZ騕\xceZ鬕\xceZ鬕\xceZ鬕\xceZ騕~r\x86\xf1C9m0\xe2\xae8j\xa5\xa3V:j\xe5\xf3\x9b\xc8\xf8;\xc9\xf8\xf6\x88\x89\xa8\x95\xaeZ骕\xceZ骕\xaeZ鬕\xceZ骕\xaeZ骕\xaeZ骕\xaeZ骕\xceZ鬕\xaeZ鬕\xaeZ骕\xceZ鬕\xceZ鬕\xceZ\tP9\xdc\xf7\xf9\x83\x80\xef\xcf\xe3y\x1c\x06_k\xfc\x82I\xf3x\x1e\x06g\xbc\xf8ҥ\xd9L\x9a\xc7\xf38\f\r_\r\x1f\rzse\xd4<\xd3\xf7\xd0졁I\xef\xb30\xfe2\xbe\x19\xbf\x8c\x1fF}T\xe4\x1bb\xfaW\r\xff9\xeasbӗ\xad<\xe3\x9f^v\r\x97^\xbd\x9e7]\xf5\x19\xed\x19\xc73~\x9f\xf1\xf3\x8cϧ\xe8Ǎ\xcfl{\xbe\xe5\xf3\xa6\xf1\x8cM\xf7&\xea\xe6\xc5_\ro\r\xba7Q\xf7\x86O\x01%\xd0Y\x02]%\xd0U\x02\x9d%\xd0U\x02]%\xd0Y\x02\x9d%\xd0U\x02]%\xd0U\x02]%\xd0U\x02]%\xd0U\x02\x9d%\xd0Y\x02]%\xd0Y\x02]%\xd0U\x02\x9d%\xd0Y\x02\x9d%\xd0Y\x02\x9d%\xd0Y\x02\xf5\xcb\xf489)b͠\x04:K\xa0\xb3\x04:J\xa0\xa3\x04:K\xa0\xb3\x04:K\xa0\xb3\x04:K\xa0\xb3\x04:K\xa0\xa3\x04z\xe4\f.\xc4\xc8i\\\x88,\x81\x8e\x12\xe8(\x81\x8e\x12\xe8(\x81\xfa\xbd~\x91\xf2\x88\xfd\x1f\x8c|\xc2<\xf6\xa1q\xe8\xe5\xa6/%\x0f\x1e\xfb\xe0\xe8\x1a.\xbdz=o\x92\xbd\x1e\x9f^\xf2\xe9\xf5\xf8\xf4z|zɧ\x97|z=>\xbd\x1e\x9f^\x8fO\xafǧ\xd7\xe3\xd3\xeb\xf1\xe9\xf5\xf8\xf4\x92O/\xf9\xf4z|zɧ\xd7\xe3\xd3\xeb\xf1\xe9%\x9f^\xf2\xe9%\x9f^\xf2\xe9%\x9f^\xf2\xe9\x15\xf9S\xe9M\xe9\x19\xb8\xea\xa9\xe9%M/izQӋ\x9a^\xd2\xf4\x92\xa6\x974\xbd\xa4\xe9%M/izIӋ\x9a^Q\xf3\xe4,Q\xb3\xe5,\xd2\xf4\xa2\xa6\x175\xbd\xa8\xe9EM/jzQ\xd3+㏙\xdf?\xa7g\xe0\af&\x9d\x95tVҙIg&\x9d\x95tV\xd2YIg%\x9d\x95tV\xd2YIg&\x9d5OIg\xcdV\xd2YIg&\x9d\x99tfҙI\xf3\xf7\x01\xaf̅8!\xef\xc955\xd33p\x91L.ĩ\x858\xb5\x10'\x17\xe2\xe4B\x9cZ\x88S\vqj!N-ĩ\x858\xb5\x10\xa7\x16\xe2\xe4B\x9c\x9a\xa7\x8585[\vqj!N.\xc4Ʌ8\xb9\x10'\x17\"\u007f\xb7\xf0\x9e\xdc\xd6 \xe9Ȥ\xa3\x92\x8eJ:2騤\xa3\x92\x8eL:2騤\xa3\x92\x8eJ:*騤\xa3\x92\x8eJ:2\xe985O\xbb\xbc\xa9\xd9\xda\xe5)\xe9Ȥ#\x93\x8eL:2\xe9Ȥ#\x93ސǦ<\xb6\xe4\xb1%\x8fMyl\xc9cK\x1e\x9b\xf2ؔǖ<\xb6\xe4\xb1%\x8f-yl\xc9cK\x1e[\xf2ؔ\xc7Κ\xa7;\x9d5[wZ\xf2ؔǦ<6\xe5\xb1)\x8fMyl2\"\u007f{4&\x93\x9c\x9d\xe4\xec g'9;\xc9\xd9A\xce\x0erv\x92\xb3\x93\x9c\x9d\xe4\xec$g'9;\xc9\xd9I\xce\x0er\xf6\xcc\x19\xb4\xbc\xcci\xb4<\x92\xb3\x83\x9c\x1d\xe4\xec \xe7\xe77Z\xc3\xf2\xf2\x9f~\r^:\xee31\x8cp\x9f\xed\xb8\xcfV\x10\xfe\xc2}z\xb8\xcf\xeb\xb8\xcf\vׯ\x8a`\b\x03\xe1\x8b\xf0A\xc0\xd4\x1a\xee\x13\xd7\f\x9f\x82\xeb\x03\xa1\xa5p\x9f%\xdc\xe7o\xb8\xcf\xf7\xf3\xfb\xf7>\xe1>\xf1\x96x\xdcgL?7\xbbe7\xbbe\xf7\x19\x1b\xfe\xd8\n\xe3\x1f^p\x84\v__\x9cvUFc\x1c\x8c_\xc6\x0f#߃T#g\x18?\x94\xd3\x06c\xc3\xcf\x12\xf1#\xc6_\x847\x02~\x96\x88\x9f%\xfe\x85{\x9fǽ\xcf\xf4s\xb3[v\xb3[v\xef\xb3\xe1\x8fH\x8cݲ{\x9f\x8ep\xe1\xeb\x8bӐ\x18\xbbe7\xbbe7\xbbe7\xbbe7\xbbe\xf7>+\x02g\x18?\x94\xd3\x06#\x12\xdbgA\xf8Ex#|\x11>\b|{\xc4Ę\xfeq\xab[v\xab[v\xb3[v\xab[v\xab[v\xb3[v\xb3[v\xab[v\xab[v\xab[v\xab[v\xab[v\xab[v\xab[v\xb3[v\xb3[v\xab[v\xb3[v\xab[v\xab[v\xb3[v\xb3[v\xb3[v\xb3[v\xb3[v\xb3[v\xc7~ܱ\xa7\x9f\x9bݲ\x9bݲ;\xf6\x86?\xe2n\xb2[v\xc7\xee\b\x17\xbe\xbe8\rw\x93ݲ\x9bݲ\x9bݲ\x9bݲ\x9bݲ;\xf6\x8a\xc0\x19\xc6\x0f\xe5\xb4\xc1\x88\xbb\x19{A\xf8Ex#|\x11>\b\u007f\xfaݎ\x98\x94\x18F\xb8c;\xee\b\xf1G\x88?z\xb8\xe3u\xdc\x11\xe2\x8f\x10\u007f\x84\xf8#\xc4\x1f!\xfe\b\xf1G\x88?\xd6pG\\\x83\xf8#\xaeC\xfc\x11\xe2\x8f%\xdc\xf17\xdc\xf1\x1d\xee\xf8\xd5o\x93\x8cx\x94\xb1\xff\xdc\xec\x96\xdd\xea\x96\xdd\xea\x96\xdd\xec\x96\xdd\xea\x96\xdd\xea\x96\xdd\xec\x96\xdd\xec\x96\xdd\xea\x96\xdd\xea\x96\xdd\xea\x96\xdd\xea\x96\xdd\xea\x96\xdd\xea\x96\xdd\xea\x96\xdd\xec\x96\xdd\xec\x96\xdd\xea\x96\xdd\xec\x96\xdd\xea\x96\xdd\xea\x96\xdd\xec\x96\xdd\xec\x96\xdd\xec\x96\xdd\xec\x96\xdd\xec\x96\xdd\xec\x96\xdd;\"qNN\x8a\xd00V,\xbbe7\xbbe\xf7Ɗ\xddX\xb1\xec\x96\xdd\xec\x96\xdd\xec\x96\xdd\xec\x96\xdd\xec\x96\xdd\xec\x96\xdd\xec\x96\xdd\x1b+vG\xce\xe0\u0088\x9cƅ\xc1\x15\xbb\xb1b7V\xecƊ\xddX\xb1\x1b+v\xc7?\xfd\xc6\xcet\xdc=1\x8cp\xf7v\xdc\x1d\x8f\xb2\xe3Qv\x0fw\xbf\x8e\xbb\xe3Qv<ʎG\xd9\xf1(;\x1eeǣ\xecx\x94\xbd\x86\xbb\xe3\x1a\x1ee\xc7u<ʎG\xd9K\xb8\xfbo\xb8\xfb\xfb\xf9U\xa1\x9fp㮬\xf3\xb8\x17\xec\x82ݲ\x9bݲ{\xc1.\xd8-\xbb\xd9-\xbb\x17\xecb\xc1.\xd8-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbb\x17\xecb\x9d\x9ca\xfcPN\x1b\x8c\xb8+\vv\xb1`\x17\vv\xb1`\x17\vv\xb1N\xbe=b\"\xecBݲ[ݲ\x9bݲ[ݲ[ݲ\x9bݲ\x9bݲ[ݲ[ݲ[ݲ[ݲ[ݲ[ݲ[ݲ\x9bݲ\x9bݲ[ݲ\x9bݲ[ݲ[ݲ\x9bݲ\x9bݲ\x9bݲ\x9bݲ\x9bݲ\x9bݲ\xbb\xc7\xe3\xee\xd0\x18\xbbe7\xbbew\x87\xc6\xd8-\xbb\xd9-\xbb;4֡1v\xcbnv\xcbnv\xcbnv\xcbnv\xcbnv\xcbnv\xcb\xee\x0e\x8d\xf5\xc8\x19\xc6\x0f\xe5\xb4\xc1\x88\xbb١\xb1\x0e\x8duh\xacCc\x1d\x1a\xeb\xac\n\xfd\xb87|\x8cݲ\x9bݲ{\xc3\xc7\xd8-\xbb\xd9-\xbb7|l\xc3\xc7\xd8-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbb7|lwΠ\xf8;\xa7Q\xfc\xf4\xb1\r\x1f\xdb\xf0\xb1\r\x1f\xdb\xf0\xb1\r\x1f\xdb\xf0\xb1\x19\ue64e{&\x86\x11\xeeَ{B\xfc\x13\xe2\x9f\x1e\xeey\x1d\xf7\x84\xf8'\xc4?!\xfe\t\xf1O\x88\u007fB\xfc\x13\xe2\x9f5\xdc\x13\xd7 \xfe\x89\xeb\x10\xff\x84\xf8g\t\xf7\xfc\r\xf7|?\xbf\r\xf7\x13\xee\t\x8d\xc1\xc7\xd8-\xbb\xd5-\xbb\xd5-\xbb\xd9-\xbb\xd5-\xbb\xd5-\xbb\xd9-\xbb\xd9-\xbb\xd5-\xbb\xd5-\xbb\xd5-\xbb\xd5-\xbb\xd5-\xbb\xd5-\xbb\xd5-\xbb\xd9-\xbb\xd9-\xbb\xd5-\xbb\xd9-\xbb\xd5-\xbb\xd5-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbb\xd9-\xbbWD✜\x14\xb1\xb8\xa01v\xcbnv\xcb\xee\x05\x8d-h\x8cݲ\x9bݲ\x9bݲ\x9bݲ\x9bݲ\x9bݲ\x9bݲ{Ac+r\x06Wl\xe44\xaeXjlAc\v\x1a[\xd0\u0602\xc6\x164\xb6\xa0\xb1\x95\x8f{e|\xaf\x9c\x14\xf1\x19\x19\x89e&\x96\x99XFb\x19\x89e&\x96\x99Xfb\x99\x89e&\x96\x99Xfb\x19\x89e\xce`b\x99ӘXfb\x19\x89e$\x96\x91XFb\x19\x89e\x88\u007f\x1e\xf7\x9e\xd0\xf3L\x8a\xd0\xe9\x84\xf8'\xc5?)\xfe\t\xf1O\x88\u007fR\xfc\x93\xe2\x9f\x14\xff\xa4\xf8'\xc5?)\xfeI\xf1O\x88\u007fr\x06\xc5?9\x8d\xe2\x9f\x14\xff\x84\xf8'\xc4?!\xfe\t\xf1O\x88\u007f\xa2\xf4\xce\xe3\x8eH\x8cݲ\x9bݲ;\"1v\xcbnv\xcb\xee\x88\xc4\"\x12c\xb7\xecf\xb7\xecf\xb7\xecf\xb7\xecf\xb7\xecf\xb7\xecf\xb7\xec\x8eH,N\xce\xe0\xeebr\x1aw\x17L,\"\xb1\x88\xc4\"\x12\x8bH,\"\xb1\x88\xc4v>\xee\x8dG\xc9n\xd9\xcdnٽ\xf1(\xd9-\xbb\xd9-\xbb7\x1e\xe5ƣd\xb7\xecf\xb7\xecf\xb7\xecf\xb7\xecf\xb7\xecf\xb7\xecf\xb7\xec\xdex\x94;s\x06\xefX\xe64\xde1>ʍG\xb9\xf1(7\x1e\xe5ƣ\xdcx\x94\x1b{\xfe\x1c\ue70e;'\x86\x11\xee\u070e;\xc3.2\xec\"{\xb8\xf3u\xdc\x19v\x91a\x17\x19v\x91a\x17\x19v\x91a\x17\x19v\x91k\xb83\xae\xc1.2\xae\xc3.2\xec\"\x97p\xe7\xdfp\xe7w\xb8\xf37\xdc\xf9\x13\xee\xfc\xa7\u007fH)\x1d\x15\xc0Q\x01\x1c\xf5lG\x05pT\x00G==\xd4\xf3:*\x80\xa3\x028*\x80\xa3\x028*\x80\xa3\x028*\x80\xa3\x9e5\xd4\x13\xd7\f\x9f\x82\xeb\x03\xa1\xa5P\xcf\x12\xea\xf9\x1b\xea\xf9~\xfe\x05\xa7O\xa8'\xde\x12\x8f\n\xe0\xa8\x04\x8eJ\xe0\xa8\x00\x8eJ\xe0\xa8\x04\x8e\n\xe0\xa8\x00\x8eJ\xe0\xa8\x04\x8eJ\xe0\xa8\x04\x8eJ\xe0\xa8\x04\x8eJ\xe0\xa8\x00\x8e\n\xe0\xa8\x04\x8e\n\xe0\xa8\x04\x8eJ\xe0\xa8\x00\x8e\n\xe0\xa8\x00\x8e\n\xe0\xa8\x00\x8e\x8a\x9aW\xf7yT\x00G%pT\x02G\x05pT\x02G%pT\x00G\x05pT\x02G%pT\x02G%pT\x02G%pT\x02G\x05pT\x00G%pT\x00G%pT\x02G\x05pT\x00G\x05pT\x00G\x05pT\x00G\x05pT\x02G\x15pT\x01G%pT\x01G\x15pT\x02G%pT\x01G\x15pT\x01G\x15pT\x01G\x15pT\x01G%pT\x02G\x15pT\x02G\x15pT\x01G%pT\x02G%pT\x02G%pT\x02G\x8d\xfd\xa8\x00\x8eJ\xe0\xa8\x04\x8e\n\xe0\xa8\x04\x8eJ\xe0\xa8\x00\x8e\n\xe0\xa8\x04\x8eJ\xe0\xa8\x04\x8eJ\xe0\xa8\x04\x8eJ\xe0\xa8\x04\x8e\n\xe0\xa8\x00\x8eJ\xe0\xa8\x00\x8eJ\xe0\xa8\x04\x8e\n\xe0\xa8\x00\x8e\n\xe0\xa8\x00\x8e\n\xe0\xa8\x00\x8e\x1aC\x8d\x98\x94\x18F\xa8\xb1\x1d\x15\xc0Q\x01\x1c5z\xa8\xf1:*\x80\xa3\x028*\x80\xa3\x028*\x80\xa3\x028*\x80\xa3\xc6\x1aj\xc45\x88?\xe2:\xc4\x0f\u0a31\x84\x1a\u007fC\x8d\xefP\xe37\xd4\xf8\t5\xe2Q\xc6\xfeS\t\x1cU\xc0Q\x05\x1c\x95\xc0Q\x05\x1cU\xc0Q\t\x1c\x95\xc0Q\x05\x1cU\xc0Q\x05\x1cU\xc0Q\x05\x1cU\xc0Q\x05\x1c\x95\xc0Q\t\x1cU\xc0Q\t\x1cU\xc0Q\x05\x1c\x95\xc0Q\t\x1c\x95\xc0Q\t\x1c\x95\xc0Q\t\x1cuG$\xce\xc9I\x11\x1aƊ%pT\x02G\x05pT\x00G%pT\x02G%pT\x02G%pT\x02G%pT\x00G\x05pT\x02G\x05pT\x02G%pT\x00G\x05pT\x00G\x05pT\x00G\x05p\xf0\x9f{KG\x05pT\x00G\xed\xed\xa8\x00\x8e\n\xe0\xa8\xddC\xed\xd7Q\x01\x1c\x15\xc0Q\x01\x1c\x15\xc0Q\x01\x1c\x15\xc0Q\x01\x1c\xb5\xd7P;\xae\xe1Qv\\ǣ\x04p\xd4^B\xed\xbf\xa1\xf6\xf7\xf3\xef\xcc}B\xc5]Y\xe7Q\x01\x1c\x95\xc0Q\t\x1c\x15\xc0Q\t\x1c\x95\xc0Q\x01\x1c\x15\xc0Q\t\x1c\x95\xc0Q\t\x1c\x95\xc0Q\t\x1c\x95\xc0Q\t\x1c\x15\xc0Q\x01\x1c\x95\xc0Q\x01\x1c\x95\xc0Q\t\x1c\x15\xc0Q\x01\x1c\x15\xc0Q\x01\x1c\x15\xc0Q\x01\x1c\x15\xc0Q\t\x1cU\xc0Q\x05\x1c\x95\xc0Q\x05\x1cU\xc0Q\t\x1c\x95\xc0Q\x05\x1cU\xc0Q\x05\x1cU\xc0Q\x05\x1cU\xc0Q\x05\x1c\x95\xc0Q\t\x1cU\xc0Q\t\x1cU\xc0Q\x05\x1c\x95\xc0Q\t\x1c\x95\xc0Q\t\x1c\x95\xc0Q\t\x1c\xb5ǣ\x028*\x81\xa3\x128*\x80\xa3\x128*\x81\xa3\x028*\x80\xa3\x128*\x81\xa3\x128*\x81\xa3\x128*\x81\xa3\x128*\x80\xa3\x028*\x81\xa3\x028*\x81\xa3\x128*\x80\xa3\x028*\x80\xa3\x028*\x80\xa3vV\x85~T\x00G%pT\x02G\x05pT\x02G%pT\x00G\x05pT\x02G%pT\x02G%pT\x02G%pT\x02G\x05pT\x00G%pT\x00G%pT\x02G\x05pT\x00G\x05pT\x00G\x05pT\x00\a\xffU\xc3tT\x00G\x05p\xd4َ\n\xe0\xa8\x00\x8e:=\xd4y\x1d\x15\xc0Q\x01\x1c\x15\xc0Q\x01\x1c\x15\xc0Q\x01\x1c\x15\xc0Qg\ru\xe2\x1a\xc4?q\x1d\xe2\ap\xd4YB\x9d\xbf\xa1\xce\xf7\xf3\xcf)~B\x9d\xd0\x18|\x8c\xc0Q\x05\x1cU\xc0Q\t\x1cU\xc0Q\x05\x1c\x95\xc0Q\t\x1cU\xc0Q\x05\x1cU\xc0Q\x05\x1cU\xc0Q\x05\x1cU\xc0Q\t\x1c\x95\xc0Q\x05\x1c\x95\xc0Q\x05\x1cU\xc0Q\t\x1c\x95\xc0Q\t\x1c\x95\xc0Q\t\x1c\x95\xc0QWD✜\x14\xb1\xb8\xa01\x02G%pT\x00G\x05pT\x02G%pT\x02G%pT\x02G%pT\x02G\x05pT\x00G%pT\x00G%pT\x02G\x05pT\x00G\x05pT\x00G\x05pT\x00G]\xf9\xa8\x00\x8eJ\xe0\xa8\x04\x8e\n\xe0\xa8\x04\x8eJ\xe0\xa8\x00\x8e\n\xe0\xa8\x04\x8eJ\xe0\xa8\x04\x8eJ\xe0\xa8\x04\x8eJ\xe0\xa8\x04\x8e\n\xe0\xa8\x00\x8eJ\xe0\xa8\x00\x8eJ\xe0\xa8\x04\x8e\n\xe0\xa8\x00\x8e\n\xe0\xa8\x00\x8e\n\xe0\xa8\x00\x8e\xba\xe7Q\x01\x1c\x95\xc0Q\t\x1c\x15\xc0Q\t\x1c\x95\xc0Q\x01\x1c\x15\xc0Q\t\x1c\x95\xc0Q\t\x1c\x95\xc0Q\t\x1c\x95\xc0Q\t\x1c\x15\xc0Q\x01\x1c\x95\xc0Q\x01\x1c\x95\xc0Q\t\x1c\x15\xc0Q\x01\x1c\x15\xc0Q\x01\x1c\x15\xc0Q\x01\x1c5Σ\x028*\x81\xa3\x128*\x80\xa3\x128*\x81\xa3\x028*\x80\xa3\x128*\x81\xa3\x128*\x81\xa3\x128*\x81\xa3\x128*\x80\xa3\x028*\x81\xa3\x028*\x81\xa3\x128*\x80\xa3\x028*\x80\xa3\x028*\x80\xa3\x028\xea\xceG\x05pT\x02G%pT\x00G%pT\x02G\x05pT\x00G%pT\x02G%pT\x02G%pT\x02G%pT\x00G\x05pT\x02G\x05pT\x02G%pT\x00G\x05pT\x00G\x05pT\x00G\x05p\xf0_VMG\x05pT\x00G\xcd\xed\xa8\x00\x8e\n\xe0\xa8\xd9C\xcd\xd7Q\x01\x1c\x15\xc0Q\x01\x1c\x15\xc0Q\x01\x1c\x15\xc0Q\x01\x1c5\xd7P3\xae\xc1.2\xae\xc3.\x00\x1c5\x97P\xf3o\xa8\xf9\xfd\xfc\x93\xae\x9fP\xf3\x9f\xfe\xb9\xe1t\x18\x80\xc3\x00\x1cv\xb6\xc3\x00\x1c\x06\xe0\xb0Ӄ\x9d\xd7a\x00\x0e\x03p\x18\x80\xc3\x00\x1c\x06\xe00\x00\x87\x018\xec\xac\xc1N\\3|\n\xae\x0f\x84\x96\x82\x9d%\xd8\xf9\x1b\xec|?\xff\xce\xf1'؉\xb7\xc4\xc3\x00\x1cF\xe00\x02\x87\x018\x8c\xc0a\x04\x0e\x03p\x18\x80\xc3\b\x1cF\xe00\x02\x87\x118\x8c\xc0a\x04\x0e#p\x18\x80\xc3\x00\x1cF\xe00\x00\x87\x118\x8c\xc0a\x00\x0e\x03p\x18\x80\xc3\x00\x1c\x06\xe00\xd4<\xdb\xe7a\x00\x0e#p\x18\x81\xc3\x00\x1cF\xe00\x02\x87\x018\f\xc0a\x04\x0e#p\x18\x81\xc3\b\x1cF\xe00\x02\x87\x118\f\xc0a\x00\x0e#p\x18\x80\xc3\b\x1cF\xe00\x00\x87\x018\f\xc0a\x00\x0e\x03p\x18\x80\xc3\x00\x1cF\xe00\x01\x87\t8\x8c\xc0a\x02\x0e\x13p\x18\x81\xc3\b\x1c&\xe00\x01\x87\t8L\xc0a\x02\x0e\x13p\x98\x80\xc3\b\x1cF\xe00\x01\x87\x118L\xc0a\x02\x0e#p\x18\x81\xc3\b\x1cF\xe00\x02\x87\x118,\xf6\xc3\x00\x1cF\xe00\x02\x87\x018\x8c\xc0a\x04\x0e\x03p\x18\x80\xc3\b\x1cF\xe00\x02\x87\x118\x8c\xc0a\x04\x0e#p\x18\x80\xc3\x00\x1cF\xe00\x00\x87\x118\x8c\xc0a\x00\x0e\x03p\x18\x80\xc3\x00\x1c\x06\xe00\x00\a\xff\rmLJ\f#Xl\x87\x018\f\xc0aу\xc5\xeb0\x00\x87\x018\f\xc0a\x00\x0e\x03p\x18\x80\xc3\x00\x1c\x16k\xb0\x88k\x10\u007f\xc4u\x88\x1f\xc0a\xb1\x04\x8b\xbf\xc1\xe2;X\xfc\xea_\xed\x8ex\x94\xb1\xff\x18\x81\xc3\x04\x1c&\xe00\x02\x87\t8L\xc0a\x04\x0e#p\x98\x80\xc3\x04\x1c&\xe00\x01\x87\t8L\xc0a\x02\x0e#p\x18\x81\xc3\x04\x1cF\xe00\x01\x87\t8\x8c\xc0a\x04\x0e#p\x18\x81\xc3\b\x1cF\xe0\xb0\x1d\x918''Eh\x18+\x96\xc0a\x04\x0e\x03p\x18\x80\xc3\b\x1cF\xe00\x02\x87\x118\x8c\xc0a\x04\x0e#p\x18\x80\xc3\x00\x1cF\xe00\x00\x87\x118\x8c\xc0a\x00\x0e\x03p\x18\x80\xc3\x00\x1c\x06\xe00\x00\a\xffe\xf4t\x18\x80\xc3\x00\x1c\xd6\xdba\x00\x0e\x03pX\xf7`\xfd:\f\xc0a\x00\x0e\x03p\x18\x80\xc3\x00\x1c\x06\xe00\x00\x87\xf5\x1a\xac\xe3\x1a\x1ee\xc7uE?n|f\xdb\xf3-\x9f7\x8dgl\xba7Q7/\xfejxkн\x89\xba7|\n(\x81\xc6\x12h*\x81\xa6\x12h,\x81\xa6\x12h*\x81\xc6\x12h,\x81\xa6\x12h*\x81\xa6\x12h*\x81\xa6\x12h*\x81\xa6\x12h,\x81\xc6\x12h*\x81\xc6\x12h*\x81\xa6\x12h,\x81\xc6\x12h,\x81\xc6\x12h,\x81\xc6\x12h\x11\x89srRĚA\t4\x96@c\t4\x94@C\t4\x96@c\t4\x96@c\t4\x96@c\t4\x96@C\t\xb4\xc8\x19\\\x88\x91Ӹ\x10Y\x02\r%\xd0P\x02\r%\xd0P\x02\r%\xd0\"\xe5\x11\xfb?\x18\xf9\x84y\xce\\\xe3\xd0\xcbM_J\x1e\xbd\xe5\xd3[>\xbd\xe9\xd3[>\xbd\xe5ӛ>\xbd\xe9\xd3[>\xbd\xe5\xd3[>\xbd\xe5\xd3[>\xbd\xe5\xd3[>\xbd\xe9ӻk\x9e\x16b\xd7l-D\xf9\xf4\xa6Oo\xfa\xf4\xa6Oo\xfa\xf4\xa6Oo\xfa\xf4<̰\xbf5\xeeo\x8d\xfb[\xc3\xfeָ\xbf5\xeeo\r\xfb[\xc3\xfeָ\xbf5\xeeo\x8d\xfb[\xe3\xfeָ\xbf5\xeeo\x8d\xfb[\xc3\xfe\xd6&gp!NN\xe3B\xe4\xfeְ\xbf5\xeco\r\xfb[\xc3\xfeְ\xbf\xb5IMӧ\x97|z=>\xbd\x1e\x9f^\xf2\xe9\xf5\xf8\xf4z|zɧ\x97|z=>\xbd\x1e\x9f^\x8fO\xafǧ\xd7\xe3\xd3\xeb\xf1\xe9\xf5\xf8\xf4\x92O/\xf9\xf4z|zɧ\xd7\xe3\xd3\xeb\xf1\xe9%\x9f^\xf2\xe9%\x9f^\xf2\xe9%\x9f^\xf2\xe9\x15\xf9S\xe9M\xe9\x19\xb8\xea\xa9\xe9%M/izQӋ\x9a^\xd2\xf4\x92\xa6\x974\xbd\xa4\xe9%M/izIӋ\x9a^Q\xf3\xe4,Q\xb3\xe5,\xd2\xf4\xa2\xa6\x175\xbd\xa8\xe9EM/jzQ\xd3+㏙\xdf?\xa7g\xe0\af&\x9d\x95tVҙIg&\x9d\x95tV\xd2YIg%\x9d\x95tV\xd2YIg&\x9d5OIg\xcdV\xd2YIg&\x9d\x99tfҙIg&\x9d\xb9\x10'\xe4=\xb9\xa6fz\x06.\x92Ʌ8\xb5\x10\xa7\x16\xe2\xe4B\x9c\\\x88S\vqj!N-ĩ\x858\xb5\x10\xa7\x16\xe2\xd4B\x9c\\\x88S\xf3\xb4\x10\xa7fk!N-\xc4Ʌ8\xb9\x10'\x17\xe2\xe4B\x9c\\\x88\x93\xdb\x1a$\x1d\x99tT\xd2QIG&\x1d\x95tTґIG&\x1d\x95tT\xd2QIG%\x1d\x95tT\xd2QIG&\x1d\xa7\xe6i\x9775[\xbb<%\x1d\x99tdґIG&\x1d\x99td\xd2\x1b\xf2ؔǖ<\xb6\xe4\xb1)\x8f-yl\xc9cS\x1e\x9b\xf2ؒǖ<\xb6\xe4\xb1%\x8f-yl\xc9cK\x1e\x9b\xf2\xd8Y\xf3t\xa7\xb3f\xebNK\x1e\x9b\xf2ؔǦ<6\xe5\xb1)\x8fMḞ\x19\xc8\xd9H\xceFr6\x90\xb3\x91\x9c\x8d\xe4l g\x039\x1b\xc9\xd9H\xceFr6\x92\xb3\x91\x9c\x8d\xe4l$g\x039[\xe6\fZ^\xe64Z\x1e\xc9\xd9@\xce\x06r6\x90\xb3\x81\x9c\r\xe4l\xf9\xef5\xce0\xcet\x8c31\x8c0\xcev\x8c\xb3\x15\x84\xbf0N\x0f㼎q^\xb8~U\x04C\x18\b_\x84\x0f\x02\xa6\xd60N\\3|\n\xae\x0f\x84\x96\xc28K\x18\xe7o\x18\xe7;\x8c\xf3\x1b\xc6\xf9\t\xe3\xc4[\xe21Θ~\x06\xbbe\x83ݲqƆ?\xb6\xc2\xf8\x87\x17\x1c\xe1\xc2\xd7\x17\xa7]\x95\xd1\x18\a\xe3\x97\xf1\xc3\xc8\xf7 \xd5\xc8\x19\xc6\x0f\xe5\xb4\xc1\xd8\xf0\xb3D\xfc\x88\xf1\x17ፀ\x9f%\xe2g\x89\u007fa\xec\xf3\x18\xfbL?\x83ݲ\xc1n\xd9\xd8g\xc3\x1f\x91\x18\xbbec\x9f\x8ep\xe1\xeb\x8bӐ\x18\xbbe\x83ݲ\xc1n\xd9`\xb7l\xb0[6\xf6Y\x118\xc3\xf8\xa1\x9c6\x18\x91\xd8>\v\xc2/\xc2\x1b\xe1\x8b\xf0A\xe0\xdb#&\xc6\xf4\x8f\xa1n\xd9P\xb7l\xb0[6\xd4-\x1b\xea\x96\rv\xcb\x06\xbbeCݲ\xa1n\xd9P\xb7l\xa8[6\xd4-\x1b\xea\x96\ru\xcb\x06\xbbe\x83ݲ\xa1n\xd9`\xb7l\xa8[6\xd4-\x1b\xec\x96\rv\xcb\x06\xbbe\x83ݲ\xc1n\xd9`\xb7l\xc4~\x8c\xd8\xd3\xcf`\xb7l\xb0[6bo\xf8#\xee&\xbbe#vG\xb8\xf0\xf5\xc5i\xb8\x9b\xec\x96\rv\xcb\x06\xbbe\x83ݲ\xc1nو\xbd\"p\x86\xf1C9m0\xe2n\xc6^\x10~\x11\xde\b_\x84\x0f\xc2\xdfk\xc40\"&%\x86\x11FlLj\x10\u007f\x84\xf8\xa3\x87\x11\xafcD\x88?B\xfc\x11\xe2\x8f\x10\u007f\x84\xf8#\xc4\x1f!\xfeXÈ\xb8\x06\xf1G\\\x87\xf8#\xc4\x1fK\x18\xf17\x8c\xf8\x0e#~È\x9f0\"\x1ee\xec?\x83ݲ\xa1n\xd9P\xb7l\xb0[6\xd4-\x1b\xea\x96\rv\xcb\x06\xbbeCݲ\xa1n\xd9P\xb7l\xa8[6\xd4-\x1b\xea\x96\ru\xcb\x06\xbbe\x83ݲ\xa1n\xd9`\xb7l\xa8[6\xd4-\x1b\xec\x96\rv\xcb\x06\xbbe\x83ݲ\xc1n\xd9`\xb7l\xec\x88\xc499)B\xc3X\xb1\xec\x96\rv\xcb\xc6Ɗ\xddX\xb1\xec\x96\rv\xcb\x06\xbbe\x83ݲ\xc1n\xd9`\xb7l\xb0[66V쎜\xc1\x85\x119\x8d\v\x83+vc\xc5n\xac؍\x15\xbb\xb1b7V\xec\x8e\u007f\xaf\xd1\xc3\xe8\xe9\x18=1\x8c0z;Fǣ\xecx\x94\xdd\xc3\xe8\xd71:\x1eeǣ\xecx\x94\x1d\x8f\xb2\xe3Qv<ʎG\xd9k\x18\x1d\xd7\xf0(;\xae\xe3Qv<\xca^\xc2\xe8\xbfa\xf4w\x18\xfd\x1bF\xff\x84\x81\xbb\xb2\xcec,\xd8\x05\xbbe\x83ݲ\xb1`\x17\xec\x96\rv\xcbƂ],\xd8\x05\xbbe\x83ݲ\xc1n\xd9`\xb7l\xb0[6\xd8-\x1b얍\x05\xbbX'g\x18?\x94\xd3\x06#\xeeʂ],\xd8ł],\xd8ł]\xac\x93o\x8f\x98\b\xbbP\xb7l\xa8[6\xd8-\x1b\xea\x96\ru\xcb\x06\xbbe\x83ݲ\xa1n\xd9P\xb7l\xa8[6\xd4-\x1b\xea\x96\ruˆ\xbae\x83ݲ\xc1n\xd9P\xb7l\xb0[6\xd4-\x1b\xea\x96\rv\xcb\x06\xbbe\x83ݲ\xc1n\xd9`\xb7l\xb0[6z\xc6n\xd9`\xb7ll\xf8\x18\xbbe\x83ݲ\xb1\xe1c\x1b>\xc6n\xd9`\xb7l\xb0[6\xd8-\x1b\xec\x96\rv\xcb\x06\xbbec\xc3\xc7v\xe7\f\x8a\xbfs\x1a\xc5O\x1f\xdb\xf0\xb1\r\x1f\xdb\xf0\xb1\r\x1f\xdb\xf0\xb1\r\x1f\x9ba\xcct\x8c\x99\x18F\x18\xb3\x1dcB\xfc\x13\xe2\x9f\x1eƼ\x8e1!\xfe\t\xf1O\x88\u007fB\xfc\x13\xe2\x9f\x10\xff\x84\xf8g\rc\xe2\x1a\xc4?q\x1d\xe2\x9f\x10\xff,a\xcc\xdf0\xe6;\x8c\xf9\rc~\u0098\xd0\x18|\x8cݲ\xa1n\xd9P\xb7l\xb0[6\xd4-\x1b\xea\x96\rv\xcb\x06\xbbeCݲ\xa1n\xd9P\xb7l\xa8[6\xd4-\x1b\xea\x96\ru\xcb\x06\xbbe\x83ݲ\xa1n\xd9`\xb7l\xa8[6\xd4-\x1b\xec\x96\rv\xcb\x06\xbbe\x83ݲ\xc1n\xd9`\xb7l\xac\x88\xc499)bqAc\xec\x96\rv\xcbƂ\xc6\x164\xc6n\xd9`\xb7l\xb0[6\xd8-\x1b\xec\x96\rv\xcb\x06\xbbecAc+r\x06Wl\xe44\xaeXjlAc\v\x1a[\xd0\u0602\xc6\x164\xb6\xa0\xb1\x95\x8f\xb12\xbeWN\x8a\xf8\x8c\x8c\xc42\x13\xcbL,#\xb1\x8c\xc42\x13\xcbL,3\xb1\xcc\xc42\x13\xcbL,3\xb1\x8c\xc42g0\xb1\xcciL,3\xb1\x8c\xc42\x12\xcbH,#\xb1\x8c\xc42\xc4?\x8f\xb1'\xf4<\x93\"t:!\xfeI\xf1O\x8a\u007fB\xfc\x13\xe2\x9f\x14\xff\xa4\xf8'\xc5?)\xfeI\xf1O\x8a\u007fR\xfc\x13⟜A\xf1ON\xa3\xf8'\xc5?!\xfe\t\xf1O\x88\u007fB\xfc\x13\xe2\x9f(\xbd\xf3\x18\x11\x89\xb1[6\xd8-\x1b\x11\x89\xb1[6\xd8-\x1b\x11\x89E$\xc6n\xd9`\xb7l\xb0[6\xd8-\x1b\xec\x96\rv\xcb\x06\xbbe#\"\xb189\x83\xbb\x8b\xc9i\xdc]0\xb1\x88\xc4\"\x12\x8bH,\"\xb1\x88\xc4\"\x12\xdb\xf9\x18\x1b\x8f\x92ݲ\xc1n\xd9\xd8x\x94\xec\x96\rv\xcb\xc6ƣ\xdcx\x94\xec\x96\rv\xcb\x06\xbbe\x83ݲ\xc1n\xd9`\xb7l\xb0[66\x1e\xe5Μ\xc1;\x969\x8dw\x8c\x8fr\xe3Qn<ʍG\xb9\xf1(7\x1e\xe5ƞ?\x87\x91\xd31rb\x18a\xe4v\x8c\f\xbbȰ\x8b\xeca\xe4\xeb\x18\x19v\x91a\x17\x19v\x91a\x17\x19v\x91a\x17\x19v\x91k\x18\x19\xd7`\x17\x19\xd7a\x17\x19v\x91K\x18\xf97\x8c\xfc\x0e#\u007f\xc3ȟ0\xa0\xa3q\x1ec\xa0V\x0e\xd6\xca\xc1Z9P+\ak\xe5`\xad\x1c\xa8\x95\x03\xb5r\xb0V\x0e\xd6\xca\xc1Z9X+\ak\xe5`\xad\x1c\xac\x95\x03\xb5r\x9c\x9ca\xfcPN\x1b\x8c\xb8+\x03\xb5r\xa0V\x0e\xd4ʁZ9P+\xc7ɷGLD\xad\x1c\xaa\x95C\xb5r\xb0V\x0e\xd5ʡZ9X+\ak\xe5P\xad\x1c\xaa\x95C\xb5r\xa8V\x0e\xd5ʡZ9T+\ak\xe5`\xad\x1c\xaa\x95\x83\xb5r\xa8V\x0e\xd5\xca\xc1Z9X+\ak\xe5`\xad\x1c\xac\x95\x00\x95c\x8c}\xfe \xe0\xfb\xb3[\xc6a\xf0\xb5\xc6/\x984\xbbe\x18\x9c\xf1\xe2K\x97f3iv\xcb8\f\r_\r\x1f\rzse\xd4<\xd3\xf7\xd0졁I\xef\xb30\xfe2\xbe\x19\xbf\x8c\x1fF}T\xe4\x1bb\xfaW\r\xff9\xeasbӗ\xad<\xe3\x9f^v\r\x97^\xbd\x9e7]\xf5\x19\xed\x19\xc73~\x9f\xf1\xf3\x8cϧ\xe8Ǎ\xcfl{\xbe\xe5\xf3\xa6\xf1\x8cM\xf7&\xea\xe6\xc5_\ro\r\xba7Q\xf7\x86O\x01%p\xb0\x04\x0e\x95\xc0\xa1\x128X\x02\x87J\xe0P\t\x1c,\x81\x83%p\xa8\x04\x0e\x95\xc0\xa1\x128T\x02\x87J\xe0P\t\x1c*\x81\x83%p\xb0\x04\x0e\x95\xc0\xc1\x128T\x02\x87J\xe0`\t\x1c,\x81\x83%p\xb0\x04\x0e\x96\xc0\xc1\x128\"\x12\xe7䤈5\x83\x128X\x02\aK\xe0@\t\x1c(\x81\x83%p\xb0\x04\x0e\x96\xc0\xc1\x128X\x02\aK\xe0`\t\x1c(\x81#r\x06\x17b\xe44.D\x96\xc0\x81\x128P\x02\aJ\xe0@\t\x1c(\x81#R\x1e\xb1\xff\x83\x91O\x98\xff\x15V\xe3\xd0\xcbM_J\x1e\xfc\xaf\xb0\x1c]åW\xaf\xe7M\x92\a\xff+\xac\xc6\xf1\x8c\xdfg\xfc<\xe3\xf3)U\xc33۞o\xf9\xbci<\xa3\xe4\x11{\xd1\xf0\xab\xe1\xad\xe1\xabᣁ\x8b4\xf2\xa7қ\xd23p\x01\xd1Y\xb6\x9ce\xcbY6\x9de\xd3Y\xb6\x9ce\xcbY\xb6\x9ce\xcbY\xb6\x9ce\xcbY\xb6\x9ce\xd3Yv\xd4<-Ҩ\xd9Z\xa4r\x96Mg\xd9t\x96Mg\xd9t\x96Mg\xd9؈\x8c~\x8c\x81\xcd\xee\xe0fwp\xb3;\xb0\xd9\x1d\xdc\xec\x0env\a6\xbb\x03\x9b\xdd\xc1\xcd\xee\xe0fwp\xb3;\xb8\xd9\x1d\xdc\xec\x0env\a7\xbb\x03\x9b\xdd\xd19\x83\xf2\xe8\x9cFyp\xb3;\xb0\xd9\x1d\xd8\xec\x0elv\a6\xbb\x03\x9b\xdd\xc1\xbb\xb9`y\x8b\x96\xb7dyK\x96\xb7hyK\x96\xb7dy\x8b\x96\xb7hyK\x96\xb7dyK\x96\xb7dyK\x96\xb7dyK\x96\xb7hy\xeb\xd4<\xd3\xf7\xd0졁ws\xd1\xf2\x16-o\xd1\xf2\x16-o\xd1\xf2֩\x8f\x8a|\x03-o=\x96\xb7\x1e\xcb[\xb2\xbc\xf5X\xdez,o\xc9\xf2\x96,o=\x96\xb7\x1e\xcb[\x8f\xe5\xad\xc7\xf2\xd6cy뱼\xf5Xޒ\xe5-Y\xdez,o\xc9\xf2\xd6cy뱼%\xcb[\xb2\xbc%\xcb[\xb2\xbc%\xcb[\xb2\xbc\x0eMwj\xbaK\xd3]\x9a\xee\xd4t\x97\xa6\xbb4ݩ\xe9NMwi\xbaK\xd3]\x9a\xee\xd2t\x97\xa6\xbb4ݥ\xe9NM\xf7\xa8y\xa6\xef\xa1\xd9C\x03\x9fB\xa7\xa6;5ݩ\xe9NMwj\xba\xabZ§7}z˧\xb7|zӧ\xb7|z˧7}zӧ\xb7|z˧\xb7|z˧\xb7|z˧\xb7|zӧw\xd7<-Į\xd9Z\x88\xf2\xe9M\x9f\xde\xf4\xe9M\x9f\xde\xf4\xe9M\x9f\xde\xf4\xe9y\x8c\x81\xfd\xed\xe0\xfevp\u007f;\xb0\xbf\x1d\xdc\xdf\x0e\xeeo\a\xf6\xb7\x03\xfb\xdb\xc1\xfd\xed\xe0\xfevp\u007f;\xb8\xbf\x1d\xdc\xdf\x0e\xeeo\a\xf7\xb7\x03\xfb\xdb19\x83\vqr\x1a\x17\"\xf7\xb7\x03\xfbہ\xfd\xed\xc0\xfev`\u007f;\xb0\xbf\x1d\x93\x9a\xa6O/\xf9\xf4z|z=>\xbd\xe4\xd3\xeb\xf1\xe9\xf5\xf8\xf4\x92O/\xf9\xf4z|z=>\xbd\x1e\x9f^\x8fO\xafǧ\xd7\xe3\xd3\xeb\xf1\xe9%\x9f^\xf2\xe9\xf5\xf8\xf4\x92O\xafǧ\xd7\xe3\xd3K>\xbd\xe4\xd3K>\xbd\xe4\xd3K>\xbd\xe4\xd3+\xf2\xa7қ\xd23p\xd5S\xd3K\x9a^\xd2\xf4\xa2\xa6\x175\xbd\xa4\xe9%M/izI\xd3K\x9a^\xd2\xf4\x92\xa6\x175\xbd\xa2\xe6\xc9Y\xa2f\xcbY\xa4\xe9EM/jzQӋ\x9a^\xd4\xf4\xa2\xa6W\xc6\x1f3\xbf\u007fN\xcf\xc0\x0f\xccL:+鬤3\x93\xceL:+鬤\xb3\x92\xceJ:+鬤\xb3\x92\xceL:k\x9e\x92Κ\xad\xa4\xb3\x92\xceL:3\xe9̤3\x93\xceL:s!N\xc8{rM\xcd\xf4\f\\$\x93\vqj!N-\xc4Ʌ8\xb9\x10\xa7\x16\xe2\xd4B\x9cZ\x88S\vqj!N-ĩ\x858\xb9\x10\xa7\xe6i!N\xcd\xd6B\x9cZ\x88\x93\vqr!N.\xc4Ʌ8\xb9\x10'\xb75H:2騤\xa3\x92\x8eL:*騤#\x93\x8eL:*騤\xa3\x92\x8eJ:*騤\xa3\x92\x8eL:N\xcd\xd3.oj\xb6vyJ:2\xe9Ȥ#\x93\x8eL:2\xe9Ȥ7\xe4\xb1)\x8f-yl\xc9cS\x1e[\xf2ؒǦ<6\xe5\xb1%\x8f-yl\xc9cK\x1e[\xf2ؒǖ<6屳\xe6\xe9Ng\xcd֝\x96<6\xe5\xb1)\x8fMyl\xcacS\x1e\x9b\x8c\x98\x8f1@\u0383\xe4\xc3>\xd3\x01\x8cD\x18a\x9f\xed\x00@\"\xfc\x85}z\xd8\xe7u\x00\x1c\x11*\x82!\f\x84/\xc2\a\x01Sk\xd8'\xae\x19>\x05\xd7\aBKa\x9f%\xec\xf37\xec\xf3\x1d\xf6\xf9\r\xfb\xfc\x84}\xe2-\xf1\x00\x01\xfe\x10\a\x19\xf1\x8e\xd8~\b\x82\x8c\u007fx\xc1\x11\xae\x1f\x02 ce4\xc6\xc1\xf8e\xfc0\xf2=H5r\x86\xf1C9m06\xfc,\x11?b\xfcEx#\xe0g\x89\xf8Y\xe2\xdf+\xf6\x10{:P\xdd\x10F\x88\xbd\x1d(j\b\u007f!v\x0f\xb1_\a\n\x19BE0\x84\x81\xf0E\xf8 `j\r\xb1\xe3\x9a\xe1Sp} \xb4\x14b/!\xf6\xdf\x10\xfb;\xc4\xfe\r\xb1\u007fB\xec\u007f\xff\x12_1\x85\x98\xf0\xff\xf1\x8a-\xc4VBl\u007f\xaf\xe8\xafx\x85x\xa5\x10\xaf\x1a\xe2e!^#\xc4\xeb\x1b\xe2\xf5\t\xf1\xfa{\xc5\xfa\x8a\x16\xa2\x8dW\x1c!\x8e\x11bK\xafX^\xf1\xf7\x15߯\xf8}\xc5\xcf+\xfe\x85\x1d\xfb\x01\xb2\xfa!f1\x0e\xbc\xd0~\bX\x8c\u007fx\xc1\x11\xae\x1f\x82\x15ce4\xc6\xc1\xf8e\xfc0\xf2=\x15\x813\x8c\x1f\xcai\x83\x11\xb7=\xf6\x82\xf0\x8b\xf0F\xf8\"|\x10\xfe^;\x86\x1d1)1\x8c\xb0c;\x00J\b\xc8\xdbÎ\xd7\x01@B\xc0\xb7\x82\x18\xb1\x12\x00F\b\xf8$\x881ְ#\xaeA\x8c\x11\xd7!F\xac\x84\x1dK\xd8\xf17\xec\xf8\x0e;~Î\x9f\xb0\xe3߿\xf4WO\xa1'\xfc\u007f\xbcz\v\xbd\x95\xd0\xdb߫\xfb\xab_\xa1_)\xf4\xab\x86~Y\xe8\xd7\b\xfd\xfa\x86~}B\xbf\xfe^\xbd\xbe\xba\x85n\xe3\xd5G\xe8c\x84\xdeҫ\x97W\xff}\xf5\xf7\xab\u007f_\xfd\xf3\xea\u007f\xafu\x86u\xa6\x03\xf8\x820\xc2:\xdb\x01pA\xf8\v\xeb\xf4\xb0\xce\xeb\x00\xb0 T\x04C\x18\b_\x84\x0f\x02\xa6ְN\\3|\n\xae\x0f\x84\x96\xc2:KX\xe7oX\xe7;\xac\xf3\x1b\xd6\xf9\t\xeb\xc4[\xe2\x01\xf2\xf8!\x860\xe2\x1d\xb1\xfd\x10@\x18\xff\xf0\x82#\\?\x04\x0f\xc6\xcah\x8c\x83\xf1\xcb\xf8a\xe4{\x90j\xe4\f\xe3\x87r\xda`l\xf8Y\"~\xc4\xf8\x8b\xf0F\xc0\xcf\x12\xf1\xb3ĿW\x8f\xa1\xc7t\x00'\x10F\xe8\xb1\x1d\x00\t\x84\xbfУ\x87\x1e\xaf\x03\x00\x81P\x11\fa |\x11>\b\x98ZC\x8f\xb8f\xf8\x14\\\x1f\b-\x85\x1eK\xe8\xf17\xf4\xf8\x0e=~C\x8f\x9f\xd0\xe1~=\xec\x9e\x0e`\x01\xc2\b\xbb\xb7\x03@\x80\xf0\x17v\xf7\xb0\xfbu\x00\x04\x10*\x82!\f\x84/\xc2\a\x01Sk\xd8\x1d\xd7 \xb8\x8e\xeb\x10\x1c\xd6\xf9\xee%\xec\xfe\x1bv\u007f\x87ݿa\xf7O\xd8\xfd\xef_\xe6k\xa60\x13\xfe?^\xb3\x85\xd9J\x98\xed\xef5\xfd5\xaf0\xaf\x14\xe6Uü,\xcck\x84y}ü>a^\u007f\xafY_\xd3´\xf1\x9a#\xcc1\xc2l\xe95\xcbk\xfe\xbe\xe6\xfb5\xbf\xaf\xf9yͿ\xb0b?\xb03\xff\xe16\x9dq\xe0\x85\xf6\xc3\r:\xe3\x1f^p\x84\xeb\x87\x1bs\xc6\xcah\x8c\x83\xf1\xcb\xf8a\xe4{*\x02g\x18?\x94\xd3\x06#\x9e9\xd696\xdf\bo\x84/\xc2\a\xe1\xef\xb5bX\x11\x93\x12\xc3\b+\xb6\x03\x1bm\x04\xe4\xeda\xc5\xeb\xc0\x06\x1b\x01\xdf\n+\x01\xcf\x1c\x1bk\x04|\x12VB\xacaE\\\xc3J\x88\xb8\x8e\x95\x80g\xbeb\t+\xfe\x86\x15\xdfa\xc5oX\xf1\x13V\xfc{\xad\x1cVN\a\xb6\xcd\b#\xac\xdc\x0el\x98\x11\xfe\xc2\xca\x1eV\xbe\x0el\x94\x11*\x82!\f\x84/\xc2\a\x01SkX\x19\xd7\xf0\xcd3\xae\xe3\x9bg|\xf3\\\xc2ʿa\xe5wX\xf9\x1bV\xfe\x84\x95\xff^{\x86=Ӂ\xed/\xc2\b{\xb6\x03\x1b_\x84\xbf\xb0\xa7\x87=\xaf\x03\x1b^\x84\x8a`\b\x03\xe1\x8b\xf0A\xc0\xd4\x1a\xf6\xc45\bn\xe2:\x047!\xb8Y\u009e\xbfa\xcfw\xd8\xf3\x1b\xf6\xfc\x84=\xff^q\x868Ӂm,\xc2\bq\xb6\x03\x1bX\x84\xbf\x10\xa7\x878\xaf\x03\x1bW\x84\x8a`\b\x03\xe1\x8b\xf0A\xc0\xd4\x1a\xe2\xc45T\xb5\x89\xeb\xa8j\xf8\xe6q\x96\x10\xe7o\x88\xf3\x1d\xe2\xfc\x868?!ο\xd7\xcea\xe7t`;\x8a0\xc2\xce\xed\xc0F\x14\xe1/\xec\xeca\xe7\xeb\xc0\x06\x14\xa1\"\x18\xc2@\xf8\"|\x100\xb5\x86\x9dq\r?y\xc6u\xfc\xe4\xb8\xed;\x97\xb0\xf3o\xd8\xf9\x1dv\xfe\x86\x9d?a\xe7\xbf\u007fɯ\x9cBN\xf8\xffx\xe5\x16r+!\xb7\xbfW\xf6W\xbeB\xbeR\xc8W\r\xf9\xb2\x90\xaf\x11\xf2\xf5\r\xf9\xfa\x84|\xfd\xbdr}e\v\xd9\xc6+\x8f\x90\xc7\b\xb9\xa5W.\xaf\xfc\xfb\xca\xefW\xfe\xbe\xf2\xe7\x95\xff^\xe5\f\xe5LG\x81\xb7\x17x{9\xdbQ\xe0\xed\x05\xde^N\x0f弎\x02o/\xf0\xf6\x02o/\xf0\xf6\x02o/\xf0\xf6\x02o/g\r\xe5\xc45ç\xe0\xfa@h)\x94\xb3\x84r\xfe\x86r\xbeC9\xbf\xa1\x9c\x9fPN\xbc%\x1e\x05\xde^\xe8\xed\x85\xde^\xe0\xed\x85\xde^\xe8\xed\x05\xde^\xe0\xed\x85\xde^\xe8\xed\x85\xde^\xe8\xed\x85\xde^\xe8\xed\x85\xde^\xe0\xed\x05\xde^\xe8\xed\x05\xde^\xe8\xed\x85\xde^\xe0\xed\x05\xde^\xe0\xed\x05\xde^\xe0\xed\xe5\x8c\u007f\xa1\xec\xf3(\xfbL?\x85G\xaa\n\x8fT\x95}6\xfc\x11\x89\xf1HU٧#\\\xf8\xfa\xe24$\xc6#U\x85G\xaa\n\x8fT\x15\x1e\xa9*\v\xc2/\xc2\x1b\xe1\x8b\xf0A\xe0\xdb#&\xc6\xf4\x8f\xa2#UEG\xaa\n\x8fT\x15\x1d\xa9*:RUx\xa4\xaa\xf0HUё\xaa\xa2#UEG\xaa\x8a\x8eT\x15\x1d\xa9*:RUt\xa4\xaa\xf0HUᑪ\xa2#U\x85G\xaa\x8a\x8eT\x15\x1d\xa9*\xc6#U\x85G\xaaʆ\x8f\xf1HUᑪ\xb2\xe1c\x1b>\xc6#U\x85G\xaa\n\x8fT\x15\x1e\xa9*\xc7\xe7\xd4[\xfcx돳į_\xe2t\x89\xdf^\x1eo\xba\\\x1f\xe7\xe7\xc7\xf9\xfe8\xfb\xe3l\x8f\xf3\xe3S\xe2\xeb\xd6\xc7\xe8\xe7ǟ|\xbc\xe9\xfe8\xdf\xe2\xdaԸx\xb5\xc4I\xe3\x14צƵ\xe1]\xc0\x16ع\x05\xf6\xd8\x02{l\x81\x9d[`\x8f-\xb0\xc7\x16ع\x05vn\x81=\xb6\xc0\x1e[`\x8f-\xb0\xc7\x16\xd8c\v\xec\xb1\x05\xf6\xd8\x02;\xb7\xc0\xce-\xb0\xc7\x16ع\x05\xf6\xd8\x02{l\x81\x9d[`\xe7\x16ع\x05vn\x81\x9d[`\xe7\x16\xd8+&\xce\xc1\xe7h\xb1f\xb0\x05vn\x81\x9d[`\xc7\x16ر\x05vn\x81\x9d[`\xe7\x16ع\x05vn\x81\x9d[`\xe7\x16ر\x05\xf6\xca\x11\\\x88\x95ø\x10\xb9\x05vl\x81\x1d[`\xc7\x16ر\x05vl\x81\xbd2<\xeax\x9b-\xef0K\xf5q\xbeǯo\xf1c\x84\aK\xf5<\xbf\xc4\xe9\x12\xbf\xbd<\xde\x14\xe1\xc1R}\x9c\uf3f3?\xce\xf68?>\xe5\x1a\xa7\xc7\xe8\xe7ǟ|\xbc\xe9\xfe8Gx\xd4\xd1\xe3T\xe2\xa4q\xf28Y\x9c\xb8H+\xbfU\xbc\xe9\xfc8q\x011\xb3\x1c\x91Y\x8e\xc8,\a3\xcb\xc1\xccrDf9\"\xb3\x1c\x91Y\x8e\xc8,Gd\x96#2\xcb\x11\x99\xe5`f9j\x8c\x8bEZct,\xd2\xc8,\a3\xcb\xc1\xccr0\xb3\x1c\xcc,\a3ˁ\a\x91>\xd6\xde\xf1\xb0\xdb\xf9\xb0\xdb\xf9\xb0\xdb\xf1\xb0\xdb\xf9\xb0\xdb\xf9\xb0\xdb\xf1\xb0\xdb\xf1\xb0\xdb\xf9\xb0\xdb\xf9\xb0\xdb\xf9\xb0\xdb\xf9\xb0\xdb\xf9\xb0\xdb\xf9\xb0\xdb\xf9\xb0\xdb\xf1\xb0\xdb\aG0<\x06\x871<\xf8\xb0\xdb\xf1\xb0\xdb\xf1\xb0\xdb\xf1\xb0\xdb\xf1\xb0\xdb\xf1\xb0\xdby5w\xa4\xbc\x9d)o\x8f\x94\xb7G\xcaۙ\xf2\xf6Hy{\xa4\xbc\x9d)og\xca\xdb#\xe5\xed\x91\xf2\xf6Hy{\xa4\xbc=R\xde\x1e)o\x8f\x94\xb73\xe5\xed[\x8c{\x8e\xbf\x11\xa3\xefq\xe2\xd5ܙ\xf2v\xa6\xbc\x9d)og\xcaۙ\xf2\xf6->\xaa\xf2\rLy\xfb#\xe5폔\xb7G\xca\xdb\x1f)o\u007f\xa4\xbc=R\xde\x1e)o\u007f\xa4\xbc\xfd\x91\xf2\xf6G\xca\xdb\x1f)o\u007f\xa4\xbc\xfd\x91\xf2\xf6G\xca\xdb#\xe5\xed\x91\xf2\xf6G\xca\xdb#\xe5폔\xb7?R\xde\x1e)o\x8f\x94\xb7G\xca\xdb#\xe5\xed\x91\xf2\xf6Hy\x031=\x18\xd3#bzDL\x0f\xc6\xf4\x88\x98\x1e\x11Ӄ1=\x18\xd3#bzDL\x8f\x88\xe9\x111=\"\xa6G\xc4\xf4\x88\x98\x1e\x8c\xe9Qc\xdcs\xfc\x8d\x18}\x8f\x13\xef\xc2`L\x0f\xc6\xf4`L\x0f\xc6\xf4`L\x8f\xd8-\x91\xa7\x0f\xe6\xe9#\xf2\xf4\x11y\xfa`\x9e>\"O\x1f\x91\xa7\x0f\xe6\xe9\x83y\xfa\x88<}D\x9e>\"O\x1f\x91\xa7\x8f\xc8\xd3G\xe4\xe9#\xf2\xf4\xc1<}\x8c\x18\x17\vq\xc4\xe8X\x88\x91\xa7\x0f\xe6\xe9\x83y\xfa`\x9e>\x98\xa7\x0f\xe6\xe9\x83yz\xae\xbd\xe3\xf9\xb6\xf3\xf9\xb6\xf3\xf9\xb6\xe3\xf9\xb6\xf3\xf9\xb6\xf3\xf9\xb6\xe3\xf9\xb6\xe3\xf9\xb6\xf3\xf9\xb6\xf3\xf9\xb6\xf3\xf9\xb6\xf3\xf9\xb6\xf3\xf9\xb6\xf3\xf9\xb6\xf3\xf9\xb6\xe3\xf9\xb6O\x8e\xe0B\x9c\x1cƅ\xc8\xe7ێ\xe7ێ\xe7ێ\xe7ێ\xe7ێ\xe7\xdb>\x19\xd3\xcc\xd3{\xe4\xe9\xfd\x91\xa7\xf7G\x9e\xde#O\xef\x8f<\xbd?\xf2\xf4\x1eyz\x8f<\xbd?\xf2\xf4\xfe\xc8\xd3\xfb#O\xef\x8f<\xbd?\xf2\xf4\xfe\xc8\xd3\xfb#O\uf467\xf7\xc8\xd3\xfb#O\uf467\xf7G\x9e\xde\x1fyz\x8f<\xbdG\x9e\xde#O\uf467\xf7\xc8\xd3{\xe4\xe9\xbd\xf2[śΏ\x13W=cz\x8f\x98\xde#\xa6w\xc6\xf4Θ\xde#\xa6\xf7\x88\xe9=bz\x8f\x98\xde#\xa6\xf7\x88\xe9=bzgL\xef5\xc6Ef\xa91:2K\xc4\xf4Θ\xde\x19\xd3;czgL\xef\x8c\xe9\x9d1\xbd7\xfc\xb3\xf1\xef\xb7\xf3\xe3\xc4\x0fl\x9ct\x8bI\xb7\x98t\xe3\xa4\x1b'\xddb\xd2-&\xddb\xd2-&\xddb\xd2-&\xddbҍ\x93n1.&\xddbtL\xbaŤ\x1b'\xdd8\xe9\xc6I7N\xbaqҍ\vq\"\xbc'\xd7\xd4\x04\u007fE?\x82\x1f\xe0\xf0ڳג\xbdj\xf6\xea٫e\xaf\xb8\x95u<9\xc1\xe1\x01\x0e\x0fp8\xc1\xe1\x01\x0e\x0fp8\xc1\xe1\x04\x87\a8<\xc0\xe1\x01\x0e\x0fpx\x80\xc3\x03\x1c\x1e\xe0p\x82\xc3\t\x0e\x0fp8\xc1\xe1\x01\x0e\x0fp8\xc1\xe1\x04\x87\x13\x1cNp8\xc1\xe1\x04\x87\x1f\x15\x13\xe7\xe0s\xb4\x88a\xacX\x82\xc3\t\x0e\a8\x1c\xe0p\x82\xc3\t\x0e'8\x9c\xe0p\x82\xc3\t\x0e'8\x1c\xe0p\x80\xc3\t\x0e\a8\x9c\xe0p\x82\xc3\x01\x0e\a8\x1c\xe0p\x80\xc3\x01\x0e\a8|d\x1f\xe7\xd5\x01\x0e\a8|\xdcV\a8\x1c\xe0\xf0\xf1\x92}\\V\a8\x1c\xe0p\x80\xc3\x01\x0e\a8\x1c\xe0p\x80\xc3\xc75\xfb@\x1fn\xe5@?n%\xc0\xe1\xa3g\x1f%\xfb\xd0\xecó\x0fˎ\xab\xb2o\xab\x03\x1cNp8\xc1\xe1\x00\x87\x13\x1cNp8\xc0\xe1\x00\x87\x13\x1cNp8\xc1\xe1\x04\x87\x13\x1cNp8\xc1\xe1\x00\x87\x03\x1cNp8\xc0\xe1\x04\x87\x13\x1c\x0ep8\xc0\xe1\x00\x87\x03\x1c\x0ep8\xc0\xe1\x00\x87\x13\x1c\x1e\xe0\xf0\x00\x87\x13\x1c\x1e\xe0\xf0\x00\x87\x13\x1cNpx\x80\xc3\x03\x1c\x1e\xe0\xf0\x00\x87\a8<\xc0\xe1\x01\x0e'8\x9c\xe0\xf0\x00\x87\x13\x1c\x1e\xe0\xf0\x00\x87\x13\x1cNp8\xc1\xe1\x04\x87\x13\x1cNp\xf8\xa8\xab\x03\x1cNp8\xc1\xe1\x00\x87\x13\x1cNp8\xc0\xe1\x00\x87\x13\x1cNp8\xc1\xe1\x04\x87\x13\x1cNp8\xc1\xe1\x00\x87\x03\x1cNp8\xc0\xe1\x04\x87\x13\x1c\x0ep8\xc0\xe1\x00\x87\x03\x1c\x0ep\xf8\xe0\xae0V\a8\x9c\xe0p\x82\xc3\x01\x0e'8\x9c\xe0p\x80\xc3\x01\x0e'8\x9c\xe0p\x82\xc3\t\x0e'8\x9c\xe0p\x82\xc3\x01\x0e\a8\x9c\xe0p\x80\xc3\t\x0e'8\x1c\xe0p\x80\xc3\x01\x0e\a8\x1c\xe0p\x80\xc3g\xf6y^\x1d\xe0p\x80\xc3\xe7mu\x80\xc3\x01\x0e\x9f/\xd9\xe7eu\x80\xc3\x01\x0e\a8\x1c\xe0p\x80\xc3\x01\x0e\a8|^\xb3O\xf4!\xf8'\xfa\x11\xfc\x00\x87Ϟ}\x96\xecS\xb3O\xcf>-\xfbD\x8c!\x8f\x11\x1c\x1e\xe0\xf0\x00\x87\x13\x1c\x1e\xe0\xf0\x00\x87\x13\x1cNpx\x80\xc3\x03\x1c\x1e\xe0\xf0\x00\x87\a8<\xc0\xe1\x01\x0e'8\x9c\xe0\xf0\x00\x87\x13\x1c\x1e\xe0\xf0\x00\x87\x13\x1cNp8\xc1\xe1\x04\x87\x13\x1cNp\xf8^1q\x0e>G\x8bŅ\x18#8\x9c\xe0p\x80\xc3\x01\x0e'8\x9c\xe0p\x82\xc3\t\x0e'8\x9c\xe0p\x82\xc3\x01\x0e\a8\x9c\xe0p\x80\xc3\t\x0e'8\x1c\xe0p\x80\xc3\x01\x0e\a8\x1c\xe0p\x80\xc3\xf7\xb6:\xc0\xe1\x04\x87\x13\x1c\x0ep8\xc1\xe1\x04\x87\x03\x1c\x0ep8\xc1\xe1\x04\x87\x13\x1cNp8\xc1\xe1\x04\x87\x13\x1c\x0ep8\xc0\xe1\x04\x87\x03\x1cNp8\xc1\xe1\x00\x87\x03\x1c\x0ep8\xc0\xe1\x00\x87\x03\x1c~\xcc\xd5\x01\x0e'8\x9c\xe0p\x80\xc3\t\x0e'8\x1c\xe0p\x80\xc3\t\x0e'8\x9c\xe0p\x82\xc3\t\x0e'8\x9c\xe0p\x80\xc3\x01\x0e'8\x1c\xe0p\x82\xc3\t\x0e\a8\x1c\xe0p\x80\xc3\x01\x0e\a8\x1c\xe0\xf0:W\a8\x9c\xe0p\x82\xc3\x01\x0e'8\x9c\xe0p\x80\xc3\x01\x0e'8\x9c\xe0p\x82\xc3\t\x0e'8\x9c\xe0p\x82\xc3\x01\x0e\a8\x9c\xe0p\x80\xc3\t\x0e'8\x1c\xe0p\x80\xc3\x01\x0e\a8\x1c\xe0p\x80Ï\xb6:\xc0\xe1\x04\x87\x13\x1c\x0ep8\xc1\xe1\x04\x87\x03\x1c\x0ep8\xc1\xe1\x04\x87\x13\x1cNp8\xc1\xe1\x04\x87\x13\x1c\x0ep8\xc0\xe1\x04\x87\x03\x1cNp8\xc1\xe1\x00\x87\x03\x1c\x0ep8\xc0\xe1\x00\x87\x03\x1c\u07b2\xb7\xf3\xea\x00\x87\x03\x1c\xden\xab\x03\x1c\x0epx{\xc9\xde.\xab\x03\x1c\x0ep8\xc0\xe1\x00\x87\x03\x1c\x0ep8\xc0\xe1횽\xa1\x0f颡\x1f\xe9\x02\xe0\xf0ֳ\xb7\x92\xbdi\xf6\xe6ٛeo\xb2ؖm;\xaf\x06p\x18\xc0a\xdbm5\x80\xc3\x00\x0e\xdb^\xb2m\x97\xd5\x00\x0e\x038\f\xe00\x80\xc3\x00\x0e\x038\f\xe0\xb0\xed\x9amC\xdf3>\x05\xfdw4\xb7s\xb6\xadg\xdbJ\xb6M\xb3m\x9em\xb3l\x1b\xdeRW\x038\x8c\xe00\x82\xc3\x00\x0e#8\x8c\xe00\x80\xc3\x00\x0e#8\x8c\xe00\x82\xc3\b\x0e#8\x8c\xe00\x82\xc3\x00\x0e\x038\x8c\xe00\x80\xc3\b\x0e#8\f\xe00\x80\xc3\x00\x0e\x038\f\xe00\xecyvl\xab\x01\x1cFp\x18\xc1a\x00\x87\x11\x1cFp\x18\xc0a\x00\x87\x11\x1cFp\x18\xc1a\x04\x87\x11\x1cFp\x18\xc1a\x00\x87\x01\x1cFp\x18\xc0a\x04\x87\x11\x1c\x06p\x18\xc0a\x00\x87\x01\x1c\x06p\x18\xc0a\x00\x87\x11\x1c\x16\xe0\xb0\x00\x87\x11\x1c\x16\xe0\xb0\x00\x87\x11\x1cFpX\x80\xc3\x02\x1c\x16\xe0\xb0\x00\x87\x058,\xc0a\x01\x0e#8\x8c\xe0\xb0\x00\x87\x11\x1c\x16\xe0\xb0\x00\x87\x11\x1cFp\x18\xc1a\x04\x87\x11\x1cFpX\x1d\xab\x01\x1cFp\x18\xc1a\x00\x87\x11\x1cFp\x18\xc0a\x00\x87\x11\x1cFp\x18\xc1a\x04\x87\x11\x1cFp\x18\xc1a\x00\x87\x01\x1cFp\x18\xc0a\x04\x87\x11\x1c\x06p\x18\xc0a\x00\x87\x01\x1c\x06p\x18\xc0a5[Š3\x9b{\xb6z[\r\xe00\x80\xc3\xeaK\xb6zY\r\xe00\x80\xc3\x00\x0e\x038\f\xe00\x80\xc3\x00\x0e\xab\xd7l\x15}\b\xfe\x8a~\x04?\xc0a\xb5g\xab%[\xd5lճU\xcbVq+\xebx2\x82\xc3\x02\x1c\x16\xe00\x82\xc3\x02\x1c\x16\xe00\x82\xc3\b\x0e\vpX\x80\xc3\x02\x1c\x16\xe0\xb0\x00\x87\x058,\xc0a\x04\x87\x11\x1c\x16\xe00\x82\xc3\x02\x1c\x16\xe00\x82\xc3\b\x0e#8\x8c\xe00\x82\xc3\b\x0e;*&\xce\xc1\xe7h\x11\xc3X\xb1\x04\x87\x11\x1c\x06p\x18\xc0a\x04\x87\x11\x1cFp\x18\xc1a\x04\x87\x11\x1cFp\x18\xc0a\x00\x87\x11\x1c\x06p\x18\xc1a\x04\x87\x01\x1c\x06p\x18\xc0a\x00\x87\x01\x1c\x06p\xd8\xc86Ϋ\x01\x1c\x06pظ\xad\x06p\x18\xc0a\xe3%۸\xac\x06p\x18\xc0a\x00\x87\x01\x1c\x06p\x18\xc0a\x00\x87\x8dk\xb6\x81>\xdcʁ~\xdcJ\x80\xc3F\xcf6J\xb6\xa1نg\x1b\x96\rWe\xdfV\x038\x8c\xe00\x82\xc3\x00\x0e#8\x8c\xe00\x80\xc3\x00\x0e#8\x8c\xe00\x82\xc3\b\x0e#8\x8c\xe00\x82\xc3\x00\x0e\x038\x8c\xe00\x80\xc3\b\x0e#8\f\xe00\x80\xc3\x00\x0e\x038\f\xe00\x80\xc3\x00\x0e#8,\xc0a\x01\x0e#8,\xc0a\x01\x0e#8\x8c\xe0\xb0\x00\x87\x058,\xc0a\x01\x0e\vpX\x80\xc3\x02\x1cFp\x18\xc1a\x01\x0e#8,\xc0a\x01\x0e#8\x8c\xe00\x82\xc3\b\x0e#8\x8c\xe0\xb0QW\x038\x8c\xe00\x82\xc3\x00\x0e#8\x8c\xe00\x80\xc3\x00\x0e#8\x8c\xe00\x82\xc3\b\x0e#8\x8c\xe00\x82\xc3\x00\x0e\x038\x8c\xe00\x80\xc3\b\x0e#8\f\xe00\x80\xc3\x00\x0e\x038\f\xe0\xb0\xc1]a\xac\x06p\x18\xc1a\x04\x87\x01\x1cFp\x18\xc1a\x00\x87\x01\x1cFp\x18\xc1a\x04\x87\x11\x1cFp\x18\xc1a\x04\x87\x01\x1c\x06p\x18\xc1a\x00\x87\x11\x1cFp\x18\xc0a\x00\x87\x01\x1c\x06p\x18\xc0a\x00\x87\xcdl\xf3\xbc\x1a\xc0a\x00\x87\xcd\xdbj\x00\x87\x01\x1c6_\xb2\xcd\xcbj\x00\x87\x01\x1c\x06p\x18\xc0a\x00\x87\x01\x1c\x06pؼf\x9b\xe8C\xf0O\xf4#\xf8\x01\x0e\x9b=\xdb,٦f\x9b\x9emZ\xb6\x89\x18C\x1e#8,\xc0a\x01\x0e#8,\xc0a\x01\x0e#8\x8c\xe0\xb0\x00\x87\x058,\xc0a\x01\x0e\vpX\x80\xc3\x02\x1cFp\x18\xc1a\x01\x0e#8,\xc0a\x01\x0e#8\x8c\xe00\x82\xc3\b\x0e#8\x8cఽb\xe2\x1c|\x8e\x16\x8b\v1Fp\x18\xc1a\x00\x87\x01\x1cFp\x18\xc1a\x04\x87\x11\x1cFp\x18\xc1a\x04\x87\x01\x1c\x06p\x18\xc1a\x00\x87\x11\x1cFp\x18\xc0a\x00\x87\x01\x1c\x06p\x18\xc0a\x00\x87\xedm5\x80\xc3\b\x0e#8\f\xe00\x82\xc3\b\x0e\x038\f\xe00\x82\xc3\b\x0e#8\x8c\xe00\x82\xc3\b\x0e#8\f\xe00\x80\xc3\b\x0e\x038\x8c\xe00\x82\xc3\x00\x0e\x038\f\xe00\x80\xc3\x00\x0e\x038옫\x01\x1cFp\x18\xc1a\x00\x87\x11\x1cFp\x18\xc0a\x00\x87\x11\x1cFp\x18\xc1a\x04\x87\x11\x1cFp\x18\xc1a\x00\x87\x01\x1cFp\x18\xc0a\x04\x87\x11\x1c\x06p\x18\xc0a\x00\x87\x01\x1c\x06p\x18\xc0au\xae\x06p\x18\xc1a\x04\x87\x01\x1cFp\x18\xc1a\x00\x87\x01\x1cFp\x18\xc1a\x04\x87\x11\x1cFp\x18\xc1a\x04\x87\x01\x1c\x06p\x18\xc1a\x00\x87\x11\x1cFp\x18\xc0a\x00\x87\x01\x1c\x06p\x18\xc0a\x00\x87\x1dm5\x80\xc3\b\x0e#8\f\xe00\x82\xc3\b\x0e\x038\f\xe00\x82\xc3\b\x0e#8\x8c\xe00\x82\xc3\b\x0e#8\f\xe00\x80\xc3\b\x0e\x038\x8c\xe00\x82\xc3\x00\x0e\x038\f\xe00\x80\xc3\x00\x0e\x038\xacek\xe7\xd5\x00\x0e\x038\xac\xddV\x038\f\xe0\xb0\xf6\x92\xad]V\x038\f\xe00\x80\xc3\x00\x0e\x038\f\xe00\x80\xc3\xda5[C\x1f\xd2EC?\xd2\x05\xc0a\xadgk%[\xd3lͳ5\xcb\xd6d\x91-\xcbv^\x05\xe0\x10\x80C\xb6\xdb*\x00\x87\x00\x1c\xb2\xbdd\xd9.\xab\x00\x1c\x02p\b\xc0!\x00\x87\x00\x1c\x02p\b\xc0!\xdb5ˆ\xbeg|\n\xfa\xefhn\xe7,[ϲ\x95,\x9bf\xd9<\xcbfY6\xbc\xa5\xae\x02p\b\xc1!\x04\x87\x00\x1cBp\b\xc1!\x00\x87\x00\x1cBp\b\xc1!\x04\x87\x10\x1cBp\b\xc1!\x04\x87\x00\x1c\x02p\b\xc1!\x00\x87\x10\x1cBp\b\xc0!\x00\x87\x00\x1c\x02p\b\xc0!\xd8\xf3\xe4\xd8V\x018\x84\xe0\x10\x82C\x00\x0e!8\x84\xe0\x10\x80C\x00\x0e!8\x84\xe0\x10\x82C\b\x0e!8\x84\xe0\x10\x82C\x00\x0e\x018\x84\xe0\x10\x80C\b\x0e!8\x04\xe0\x10\x80C\x00\x0e\x018\x04\xe0\x10\x80C\x00\x0e!8$\xc0!\x01\x0e!8$\xc0!\x01\x0e!8\x84\xe0\x90\x00\x87\x048$\xc0!\x01\x0e\tpH\x80C\x02\x1cBp\b\xc1!\x01\x0e!8$\xc0!\x01\x0e!8\x84\xe0\x10\x82C\b\x0e!8\x84\xe0\x90:V\x018\x84\xe0\x10\x82C\x00\x0e!8\x84\xe0\x10\x80C\x00\x0e!8\x84\xe0\x10\x82C\b\x0e!8\x84\xe0\x10\x82C\x00\x0e\x018\x84\xe0\x10\x80C\b\x0e!8\x04\xe0\x10\x80C\x00\x0e\x018\x04\xe0\x10\x80Cj\x96\x8aAg6\xf7,\xf5\xb6\n\xc0!\x00\x87ԗ,\xf5\xb2\n\xc0!\x00\x87\x00\x1c\x02p\b\xc0!\x00\x87\x00\x1cR\xafY*\xfa\x10\xfc\x15\xfd\b~\x80Cj\xcfRK\x96\xaaY\xaag\xa9\x96\xa5\xe2V\xd6\xf1$\x04\x87\x048$\xc0!\x04\x87\x048$\xc0!\x04\x87\x10\x1c\x12\xe0\x90\x00\x87\x048$\xc0!\x01\x0e\tpH\x80C\b\x0e!8$\xc0!\x04\x87\x048$\xc0!\x04\x87\x10\x1cBp\b\xc1!\x04\x87\x10\x1crTL\x9c\x83\xcf\xd1\"\x86\xb1b\t\x0e!8\x04\xe0\x10\x80C\b\x0e!8\x84\xe0\x10\x82C\b\x0e!8\x84\xe0\x10\x80C\x00\x0e!8\x04\xe0\x10\x82C\b\x0e\x018\x04\xe0\x10\x80C\x00\x0e\x018\x04\xe0\x90\x91e\x9cW\x018\x04\xe0\x90q[\x05\xe0\x10\x80C\xc6K\x96qY\x05\xe0\x10\x80C\x00\x0e\x018\x04\xe0\x10\x80C\x00\x0e\x19\xd7,\x03}\xb8\x95\x03\xfd\xb8\x95\x00\x87\x8c\x9ee\x94,C\xb3\f\xcf2,\v\xaeʾ\xad\x02p\b\xc1!\x04\x87\x00\x1cBp\b\xc1!\x00\x87\x00\x1cBp\b\xc1!\x04\x87\x10\x1cBp\b\xc1!\x04\x87\x00\x1c\x02p\b\xc1!\x00\x87\x10\x1cBp\b\xc0!\x00\x87\x00\x1c\x02p\b\xc0!\x00\x87\x00\x1cBpH\x80C\x02\x1cBpH\x80C\x02\x1cBp\b\xc1!\x01\x0e\tpH\x80C\x02\x1c\x12\xe0\x90\x00\x87\x048\x84\xe0\x10\x82C\x02\x1cBpH\x80C\x02\x1cBp\b\xc1!\x04\x87\x10\x1cBp\b\xc1!\xa3\xae\x02p\b\xc1!\x04\x87\x00\x1cBp\b\xc1!\x00\x87\x00\x1cBp\b\xc1!\x04\x87\x10\x1cBp\b\xc1!\x04\x87\x00\x1c\x02p\b\xc1!\x00\x87\x10\x1cBp\b\xc0!\x00\x87\x00\x1c\x02p\b\xc0!\x83\xbb\xc2X\x05\xe0\x10\x82C\b\x0e\x018\x84\xe0\x10\x82C\x00\x0e\x018\x84\xe0\x10\x82C\b\x0e!8\x84\xe0\x10\x82C\b\x0e\x018\x04\xe0\x10\x82C\x00\x0e!8\x84\xe0\x10\x80C\x00\x0e\x018\x04\xe0\x10\x80C\x00\x0e\x99Y\xe6y\x15\x80C\x00\x0e\x99\xb7U\x00\x0e\x018d\xbed\x99\x97U\x00\x0e\x018\x04\xe0\x10\x80C\x00\x0e\x018\x04\xe0\x90y\xcd2ч\xe0\x9f\xe8G\xf0\x03\x1c2{\x96Y\xb2L\xcd2=˴,\x131\x86\xa4\x8b\x86~\xa4\v\x80CZ\xcf\xd2J\x96\xa6Y\x9agi\x96\xa5I\xfe\xf8\x9b\x9f\xbc\xbe\xfe~^\u007f\xf5z\xbc\x1e\xaf\xc7\xeb\xf1z\xbc\x1e\xaf\xc7\xeb\xf1z\xbc\x1e\xaf\xc7\xeb\xf1z\xbc\x1e\xaf\xc7\xeb\xf1z\xbc\x1e\xaf\xc7\xeb\xf1z\xbc\x1e\xaf\xc7\xeb\xf1z\xbc\x1e\xaf\xc7\xeb\xf1z\xbc\x1e\xaf\xc7\xeb\xf1\xff\xfb\xb1\xbe\xb7\x1d\xa7\xb7\xdfێ\xdb\xf9\x94߫\xa7\xfc\xde8\xad\xef\x8d\v\x9arZ\xdf\xdb[4O\xef\x1d\xf3vZߛ\xe8\x99\xd7S\xfe`\xfb\xc9\xeb\xfd\xed\xa7\u007f~\xbc\xd6\x0f6\xfd?7\xb7\x9f\xdb\\\xbf\xa0\xb1\xcf5O\x1fl\xb7\xf3\xcfl\xd7\x0f\xf0\xed>\x88o\xf7\xc1\xf8\x85^\xeb\aC\u007fns;=}0\xf8\xa7\xfef\xbb~0\x8e\xff\xbd\xd9\xe7\x97k\xa6\xfe\xb8\xb9\x9e\x9e>\x98\xfc\xd8/n\xd7o\uf4d7\u007f}\x1f\x17\xf3\xd1\xdcNo\xbf\u007fT|\xe5\xf7\xc7\xe9\xe9\xfdc^N\xf9\xfdvZ?\xac\a\x9a\xdb\xe9\xe9ã\xdeN\xeb\x87\xfb<=}\xb8\xa3\xfb\xc3vZ?»\x1f\xcd\xf5\xf4\xf4\xd1v\xe8\xe9\xed\x8fx\xed֏\xaa\xa19NO\x1f\xed\xdbqZ?j74W4v\xcao\xb6\xd3\xfa\x06\xefD\xf3\xf4\x867\xe0K\xb7\xf9M\xfdү\xf5M\xd5/hn\u007f'\xcd\xe5\xe76ן\xd5\xd8\xe9\xe9M\xe5\xb7\xf9\xbbi\xd77\xb8O?\xdd,\u007fr\xcaoƗz=\xbda\b~\a\xcb\xf5;\xf5v\xcao\xe6\x97z\xado\x10s\x9fon_\xd0\\\xfef\xf3\xf4\x06\x81\xb8\xfcї\xfd/\xff\x91>^\xb7\x9f\xf3\xba~\xeee?~=\xbd\xcbE\xfdn\xd5S~\xb7\x9d\xd6w\x9b\x9d\xd6we;=\xbd+U\xd9\x1e\xa7\xa7o\v\x82\x90\xed\xdb\xdf\x16\xbc\x03\xa7\x83?\xf1\xd2|(\xe3\xf4\xf4\xa1\f==}\x8ba\xf8h\xb1(\x9e\xbe\xb5oz\xcaߙ\xa7\xf5[s\x9c֏\xbf\xf9I4o\u007f7ތ\u007f?\xfdi\xfb\xeb\u007f\xb2\xc9\u007f\xd6N\xebw\x05ױq\xa9=}$\xf5vz\xfb\xcf\x1a\xe3\xfb\x0f\xe6\xe9\xe9\x8f\xf1\x8ehy\xb1\xf91\xdf\xda\xce\xed\xf11x\xf7\xe7>\x10\x9f\xf3\xfb\x9f\xffM4\u007f\xb0\xddN\xf9\xa3vz\xfaÉ\u007f\xbd\xfe\x0f|\xaf\xaf\xd7\xd7\xdf\xfe\u007f\x02]>\xfdt\xf9\xb4-\x9f^\U000a77f6\xfc駗\xe5\xee\xcb\xdd\u007f\xd1\xcfY\xae\xb7\xe5Z\x97k[\xbe\u007f\xcbW\xfd\xc2\xff\x91w9\xda[\xcbv\xa4\xbfx+\xbd$I\x9a.隮\xc9\xd3o-wIw6iK\xdb[\xe99\x9d9\xe4\xfb\xe9/\xf1\xc6\xe4\xe9H\x8a7\xf0\xa7ho\xe9Ƴ%\xe3\x87\xfb}\xf1{\xfa\f\x9f\xe2\xcb\xf7GzN\x9a,]\xde\xfa\xbf~\xfc2\xdcƷ^\x8f\xbf\xbf\xe3\xff\xf5\xcd\xfa\xdb}\xce/{F\xfaYs\xfd\xab_\x82\x89\xa5\xff\xf9\v\xe7ů~uy\xe7\x9d\xf4N\xfa^\xfa^\xfa\xf5\xe57N\xe9\aˏN\xe9\xe3\xe5\x93\xd3\xf2\xf1\xaf\xe7\xdf\xf8\xe4\xb4|\xedk\xf9\x1b\xdf8\xa5\xaf-߈ߧ\x1f\xa4\x1f\xfd\x8c\x8b\x92\xbe\x92\xbe\x92\xbe\xfaV\xfa\xdd\xf4;\xe9\x9b\xe9W\xd2;\xe9\xd7\xd3o`<_\xbf\x9a~-\xfdf\xfa\xad\xf4N\xfaZ\xfaF\xfa\xfa[\xe9\xcf\xd3?J\xff8\xfd\xde\x17|\x18O\xbfD\x89\xe3\xc7ScJ\xff\x95\xf4\x0fӯr\uefd6\xfe\t\xbf\"\xbe\xd6W\xd2;\xe9\xab\xe9\xb7\xd3?M\xff,\xfd\xf3\xf4/ҿL\xff*\xfd\xeb\xf4oҿM\xff.\xfdN\xfa\xdd\xf4\xb5\xf4\xf5\xf4\x8d\xf4\xcd\xf4{\xe9ߧ\xff\x90\xdeM\xbf\x9f\xfec\xfa\x83\xf4\x87\xe9[\xe9\x8f\xd2\x1f\xa7\xf7\xd2\xfb\xe9?\xa5\x0fҟ\xa4\x0fӟ\xa6\xff\x9c>J\xdfN\xff%\xfd\xd7\xf4\x9d\xf4g\xe9M\xfan\xfa8\xfdy\xfa$\xfd\xb7\xf4\xbd\xf4\x17iKϩ\xa4\x97Tӧ\xe9\x9c$\xb5\xd4\x1f\xbb\xd5-\x8dd鿧\xcf\xd2=y\x9a\xe9\xfbiO\xff#\x1d\xe9/\xd3\x0f\xd2\x0fӏ~\x12\x1f\xe9\xab\xe9\xe3\xf4I\xfaJ\xfa\xcde\x1fiK-\xcdT\xd3X\x8em9\xe6r\x8c\xc5g\xfa\xad\xcf\xfd^\xb7EۢsѺ\xe8X\xee\xdbro\xcb}.\xf7\xba\xdc\xc7\xe2\xdb\xe2m\xf1\xb9x]|,\xb7m\xb9\xb5\xe56\x97[]nc\x91m\x91\xb6\xc8\\\xa4.2\x96\xeb\x86m\xf8:\xb9\x1f\u007f\xee/~\xb6-\x9f\xb5峹|V\x97\xcfƲo\xe9\x86\xeb\xf6V:/\xe7\xf3r\xbe\xa7\xdbr\xeb\xcbM\xd2\xcb\xf2\xf2\x92>[.\xe7\xe5r].\xcf\xcb\xe5\xbe\\|\xb9\xd8\xf2\x99\xa4kz^\x9e\x9f\x97\xe7;\xf6\xeb\xfb[\xa9/\xbd\xa7\x924y\xb2\xf4S\xbb~ږ\xad.ǖ\x8f\xad.u\xa4\xfa\xe3Σ\x8e\xe5\xc0\x97\u07b7\xbcou\x19\xf5'O\b#ͼױ\xecu\xd9\xdbr\xcc\x1f\xf7Թ\x1c-\xb5\x9fZ[\xbf\xfd\xee\xf2\xe1G\\\x06?\\\xde|}\xf9\xce\xd7\xf9w\u007f\x88\x9f\xf9\xfa\xd5\xf4'_v\x9d\xc6\xfdC(\xfe\xaf\x00\x00\x00\xff\xffky\xc4\xd8" diff --git a/vendor/github.com/gosimple/unidecode/table.txt b/vendor/github.com/gosimple/unidecode/table.txt new file mode 100644 index 0000000..9f5d59f --- /dev/null +++ b/vendor/github.com/gosimple/unidecode/table.txt @@ -0,0 +1,46731 @@ +/* x000 */ +0x0000: "\x00" +0x0001: "\x01" +0x0002: "\x02" +0x0003: "\x03" +0x0004: "\x04" +0x0005: "\x05" +0x0006: "\x06" +0x0007: "\x07" +0x0008: "\x08" +0x0009: "\t" +0x000a: "\n" +0x000b: "\x0b" +0x000c: "\x0c" +0x000d: "\r" +0x000e: "\x0e" +0x000f: "\x0f" +0x0010: "\x10" +0x0011: "\x11" +0x0012: "\x12" +0x0013: "\x13" +0x0014: "\x14" +0x0015: "\x15" +0x0016: "\x16" +0x0017: "\x17" +0x0018: "\x18" +0x0019: "\x19" +0x001a: "\x1a" +0x001b: "\x1b" +0x001c: "\x1c" +0x001d: "\x1d" +0x001e: "\x1e" +0x001f: "\x1f" +0x0020: " " +0x0021: "!" +0x0022: "\"" +0x0023: "#" +0x0024: "$" +0x0025: "%" +0x0026: "&" +0x0027: "'" +0x0028: "(" +0x0029: ")" +0x002a: "*" +0x002b: "+" +0x002c: "," +0x002d: "-" +0x002e: "." +0x002f: "/" +0x0030: "0" +0x0031: "1" +0x0032: "2" +0x0033: "3" +0x0034: "4" +0x0035: "5" +0x0036: "6" +0x0037: "7" +0x0038: "8" +0x0039: "9" +0x003a: ":" +0x003b: ";" +0x003c: "<" +0x003d: "=" +0x003e: ">" +0x003f: "?" +0x0040: "@" +0x0041: "A" +0x0042: "B" +0x0043: "C" +0x0044: "D" +0x0045: "E" +0x0046: "F" +0x0047: "G" +0x0048: "H" +0x0049: "I" +0x004a: "J" +0x004b: "K" +0x004c: "L" +0x004d: "M" +0x004e: "N" +0x004f: "O" +0x0050: "P" +0x0051: "Q" +0x0052: "R" +0x0053: "S" +0x0054: "T" +0x0055: "U" +0x0056: "V" +0x0057: "W" +0x0058: "X" +0x0059: "Y" +0x005a: "Z" +0x005b: "]" +0x005c: "\\" +0x005d: "]" +0x005e: "^" +0x005f: "_" +0x0060: "`" +0x0061: "a" +0x0062: "b" +0x0063: "c" +0x0064: "d" +0x0065: "e" +0x0066: "f" +0x0067: "g" +0x0068: "h" +0x0069: "i" +0x006a: "j" +0x006b: "k" +0x006c: "l" +0x006d: "m" +0x006e: "n" +0x006f: "o" +0x0070: "p" +0x0071: "q" +0x0072: "r" +0x0073: "s" +0x0074: "t" +0x0075: "u" +0x0076: "v" +0x0077: "w" +0x0078: "x" +0x0079: "y" +0x007a: "z" +0x007b: "{" +0x007c: "|" +0x007d: "}" +0x007e: "~" +0x007f: "\x7f" +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: "C/" +0x00a3: "PS" +0x00a4: "$?" +0x00a5: "Y=" +0x00a6: "|" +0x00a7: "SS" +0x00a8: "\"" +0x00a9: "(c)" +0x00aa: "a" +0x00ab: "<<" +0x00ac: "!" +0x00ad: "" +0x00ae: "(r)" +0x00af: "-" +0x00b0: "deg" +0x00b1: "+-" +0x00b2: "2" +0x00b3: "3" +0x00b4: "'" +0x00b5: "u" +0x00b6: "P" +0x00b7: "*" +0x00b8: "," +0x00b9: "1" +0x00ba: "o" +0x00bb: ">>" +0x00bc: "1/4" +0x00bd: "1/2" +0x00be: "3/4" +0x00bf: "?" +0x00c0: "A" +0x00c1: "A" +0x00c2: "A" +0x00c3: "A" +0x00c4: "A" +0x00c5: "A" +0x00c6: "AE" +0x00c7: "C" +0x00c8: "E" +0x00c9: "E" +0x00ca: "E" +0x00cb: "E" +0x00cc: "I" +0x00cd: "I" +0x00ce: "I" +0x00cf: "I" +0x00d0: "D" +0x00d1: "N" +0x00d2: "O" +0x00d3: "O" +0x00d4: "O" +0x00d5: "O" +0x00d6: "O" +0x00d7: "x" +0x00d8: "O" +0x00d9: "U" +0x00da: "U" +0x00db: "U" +0x00dc: "U" +0x00dd: "Y" +0x00de: "Th" +0x00df: "ss" +0x00e0: "a" +0x00e1: "a" +0x00e2: "a" +0x00e3: "a" +0x00e4: "a" +0x00e5: "a" +0x00e6: "ae" +0x00e7: "c" +0x00e8: "e" +0x00e9: "e" +0x00ea: "e" +0x00eb: "e" +0x00ec: "i" +0x00ed: "i" +0x00ee: "i" +0x00ef: "i" +0x00f0: "d" +0x00f1: "n" +0x00f2: "o" +0x00f3: "o" +0x00f4: "o" +0x00f5: "o" +0x00f6: "o" +0x00f7: "/" +0x00f8: "o" +0x00f9: "u" +0x00fa: "u" +0x00fb: "u" +0x00fc: "u" +0x00fd: "y" +0x00fe: "th" +0x00ff: "y" +/* x001 */ +0x0100: "A" +0x0101: "a" +0x0102: "A" +0x0103: "a" +0x0104: "A" +0x0105: "a" +0x0106: "C" +0x0107: "c" +0x0108: "C" +0x0109: "c" +0x010a: "C" +0x010b: "c" +0x010c: "C" +0x010d: "c" +0x010e: "D" +0x010f: "d" +0x0110: "D" +0x0111: "d" +0x0112: "E" +0x0113: "e" +0x0114: "E" +0x0115: "e" +0x0116: "E" +0x0117: "e" +0x0118: "E" +0x0119: "e" +0x011a: "E" +0x011b: "e" +0x011c: "G" +0x011d: "g" +0x011e: "G" +0x011f: "g" +0x0120: "G" +0x0121: "g" +0x0122: "G" +0x0123: "g" +0x0124: "H" +0x0125: "h" +0x0126: "H" +0x0127: "h" +0x0128: "I" +0x0129: "i" +0x012a: "I" +0x012b: "i" +0x012c: "I" +0x012d: "i" +0x012e: "I" +0x012f: "i" +0x0130: "I" +0x0131: "i" +0x0132: "IJ" +0x0133: "ij" +0x0134: "J" +0x0135: "j" +0x0136: "K" +0x0137: "k" +0x0138: "k" +0x0139: "L" +0x013a: "l" +0x013b: "L" +0x013c: "l" +0x013d: "L" +0x013e: "l" +0x013f: "L" +0x0140: "l" +0x0141: "L" +0x0142: "l" +0x0143: "N" +0x0144: "n" +0x0145: "N" +0x0146: "n" +0x0147: "N" +0x0148: "n" +0x0149: "'n" +0x014a: "ng" +0x014b: "NG" +0x014c: "O" +0x014d: "o" +0x014e: "O" +0x014f: "o" +0x0150: "O" +0x0151: "o" +0x0152: "OE" +0x0153: "oe" +0x0154: "R" +0x0155: "r" +0x0156: "R" +0x0157: "r" +0x0158: "R" +0x0159: "r" +0x015a: "S" +0x015b: "s" +0x015c: "S" +0x015d: "s" +0x015e: "S" +0x015f: "s" +0x0160: "S" +0x0161: "s" +0x0162: "T" +0x0163: "t" +0x0164: "T" +0x0165: "t" +0x0166: "T" +0x0167: "t" +0x0168: "U" +0x0169: "u" +0x016a: "U" +0x016b: "u" +0x016c: "U" +0x016d: "u" +0x016e: "U" +0x016f: "u" +0x0170: "U" +0x0171: "u" +0x0172: "U" +0x0173: "u" +0x0174: "W" +0x0175: "w" +0x0176: "Y" +0x0177: "y" +0x0178: "Y" +0x0179: "Z" +0x017a: "z" +0x017b: "Z" +0x017c: "z" +0x017d: "Z" +0x017e: "z" +0x017f: "s" +0x0180: "b" +0x0181: "B" +0x0182: "B" +0x0183: "b" +0x0184: "6" +0x0185: "6" +0x0186: "O" +0x0187: "C" +0x0188: "c" +0x0189: "D" +0x018a: "D" +0x018b: "D" +0x018c: "d" +0x018d: "d" +0x018e: "3" +0x018f: "@" +0x0190: "E" +0x0191: "F" +0x0192: "f" +0x0193: "G" +0x0194: "G" +0x0195: "hv" +0x0196: "I" +0x0197: "I" +0x0198: "K" +0x0199: "k" +0x019a: "l" +0x019b: "l" +0x019c: "W" +0x019d: "N" +0x019e: "n" +0x019f: "O" +0x01a0: "O" +0x01a1: "o" +0x01a2: "OI" +0x01a3: "oi" +0x01a4: "P" +0x01a5: "p" +0x01a6: "YR" +0x01a7: "2" +0x01a8: "2" +0x01a9: "SH" +0x01aa: "sh" +0x01ab: "t" +0x01ac: "T" +0x01ad: "t" +0x01ae: "T" +0x01af: "U" +0x01b0: "u" +0x01b1: "Y" +0x01b2: "V" +0x01b3: "Y" +0x01b4: "y" +0x01b5: "Z" +0x01b6: "z" +0x01b7: "ZH" +0x01b8: "ZH" +0x01b9: "zh" +0x01ba: "zh" +0x01bb: "2" +0x01bc: "5" +0x01bd: "5" +0x01be: "ts" +0x01bf: "w" +0x01c0: "|" +0x01c1: "||" +0x01c2: "|=" +0x01c3: "!" +0x01c4: "DZ" +0x01c5: "Dz" +0x01c6: "dz" +0x01c7: "LJ" +0x01c8: "Lj" +0x01c9: "lj" +0x01ca: "NJ" +0x01cb: "Nj" +0x01cc: "nj" +0x01cd: "A" +0x01ce: "a" +0x01cf: "I" +0x01d0: "i" +0x01d1: "O" +0x01d2: "o" +0x01d3: "U" +0x01d4: "u" +0x01d5: "U" +0x01d6: "u" +0x01d7: "U" +0x01d8: "u" +0x01d9: "U" +0x01da: "u" +0x01db: "U" +0x01dc: "u" +0x01dd: "@" +0x01de: "A" +0x01df: "a" +0x01e0: "A" +0x01e1: "a" +0x01e2: "AE" +0x01e3: "ae" +0x01e4: "G" +0x01e5: "g" +0x01e6: "G" +0x01e7: "g" +0x01e8: "K" +0x01e9: "k" +0x01ea: "O" +0x01eb: "o" +0x01ec: "O" +0x01ed: "o" +0x01ee: "ZH" +0x01ef: "zh" +0x01f0: "j" +0x01f1: "DZ" +0x01f2: "Dz" +0x01f3: "dz" +0x01f4: "G" +0x01f5: "g" +0x01f6: "HV" +0x01f7: "W" +0x01f8: "N" +0x01f9: "n" +0x01fa: "A" +0x01fb: "a" +0x01fc: "AE" +0x01fd: "ae" +0x01fe: "O" +0x01ff: "o" +/* x002 */ +0x0200: "A" +0x0201: "a" +0x0202: "A" +0x0203: "a" +0x0204: "E" +0x0205: "e" +0x0206: "E" +0x0207: "e" +0x0208: "I" +0x0209: "i" +0x020a: "I" +0x020b: "i" +0x020c: "O" +0x020d: "o" +0x020e: "O" +0x020f: "o" +0x0210: "R" +0x0211: "r" +0x0212: "R" +0x0213: "r" +0x0214: "U" +0x0215: "u" +0x0216: "U" +0x0217: "u" +0x0218: "S" +0x0219: "s" +0x021a: "T" +0x021b: "t" +0x021c: "Y" +0x021d: "y" +0x021e: "H" +0x021f: "h" +0x0220: "N" +0x0221: "d" +0x0222: "OU" +0x0223: "ou" +0x0224: "Z" +0x0225: "z" +0x0226: "A" +0x0227: "a" +0x0228: "E" +0x0229: "e" +0x022a: "O" +0x022b: "o" +0x022c: "O" +0x022d: "o" +0x022e: "O" +0x022f: "o" +0x0230: "O" +0x0231: "o" +0x0232: "Y" +0x0233: "y" +0x0234: "l" +0x0235: "n" +0x0236: "t" +0x0237: "j" +0x0238: "db" +0x0239: "qp" +0x023a: "A" +0x023b: "C" +0x023c: "c" +0x023d: "L" +0x023e: "T" +0x023f: "s" +0x0240: "z" +0x0241: "[?]" +0x0242: "[?]" +0x0243: "B" +0x0244: "U" +0x0245: "^" +0x0246: "E" +0x0247: "e" +0x0248: "J" +0x0249: "j" +0x024a: "q" +0x024b: "q" +0x024c: "R" +0x024d: "r" +0x024e: "Y" +0x024f: "y" +0x0250: "a" +0x0251: "a" +0x0252: "a" +0x0253: "b" +0x0254: "o" +0x0255: "c" +0x0256: "d" +0x0257: "d" +0x0258: "e" +0x0259: "@" +0x025a: "@" +0x025b: "e" +0x025c: "e" +0x025d: "e" +0x025e: "e" +0x025f: "j" +0x0260: "g" +0x0261: "g" +0x0262: "g" +0x0263: "g" +0x0264: "u" +0x0265: "Y" +0x0266: "h" +0x0267: "h" +0x0268: "i" +0x0269: "i" +0x026a: "I" +0x026b: "l" +0x026c: "l" +0x026d: "l" +0x026e: "lZ" +0x026f: "W" +0x0270: "W" +0x0271: "m" +0x0272: "n" +0x0273: "n" +0x0274: "n" +0x0275: "o" +0x0276: "OE" +0x0277: "O" +0x0278: "F" +0x0279: "r" +0x027a: "r" +0x027b: "r" +0x027c: "r" +0x027d: "r" +0x027e: "r" +0x027f: "r" +0x0280: "R" +0x0281: "R" +0x0282: "s" +0x0283: "S" +0x0284: "j" +0x0285: "S" +0x0286: "S" +0x0287: "t" +0x0288: "t" +0x0289: "u" +0x028a: "U" +0x028b: "v" +0x028c: "^" +0x028d: "w" +0x028e: "y" +0x028f: "Y" +0x0290: "z" +0x0291: "z" +0x0292: "Z" +0x0293: "Z" +0x0294: "?" +0x0295: "?" +0x0296: "?" +0x0297: "C" +0x0298: "@" +0x0299: "B" +0x029a: "E" +0x029b: "G" +0x029c: "H" +0x029d: "j" +0x029e: "k" +0x029f: "L" +0x02a0: "q" +0x02a1: "?" +0x02a2: "?" +0x02a3: "dz" +0x02a4: "dZ" +0x02a5: "dz" +0x02a6: "ts" +0x02a7: "tS" +0x02a8: "tC" +0x02a9: "fN" +0x02aa: "ls" +0x02ab: "lz" +0x02ac: "WW" +0x02ad: "]]" +0x02ae: "h" +0x02af: "h" +0x02b0: "k" +0x02b1: "h" +0x02b2: "j" +0x02b3: "r" +0x02b4: "r" +0x02b5: "r" +0x02b6: "r" +0x02b7: "w" +0x02b8: "y" +0x02b9: "'" +0x02ba: "\"" +0x02bb: "`" +0x02bc: "'" +0x02bd: "`" +0x02be: "`" +0x02bf: "'" +0x02c0: "?" +0x02c1: "?" +0x02c2: "<" +0x02c3: ">" +0x02c4: "^" +0x02c5: "V" +0x02c6: "^" +0x02c7: "V" +0x02c8: "'" +0x02c9: "-" +0x02ca: "/" +0x02cb: "\\" +0x02cc: "," +0x02cd: "_" +0x02ce: "\\" +0x02cf: "/" +0x02d0: ":" +0x02d1: "." +0x02d2: "`" +0x02d3: "'" +0x02d4: "^" +0x02d5: "V" +0x02d6: "+" +0x02d7: "-" +0x02d8: "V" +0x02d9: "." +0x02da: "@" +0x02db: "," +0x02dc: "~" +0x02dd: "\"" +0x02de: "R" +0x02df: "X" +0x02e0: "G" +0x02e1: "l" +0x02e2: "s" +0x02e3: "x" +0x02e4: "?" +0x02e5: "" +0x02e6: "" +0x02e7: "" +0x02e8: "" +0x02e9: "" +0x02ea: "" +0x02eb: "" +0x02ec: "V" +0x02ed: "=" +0x02ee: "\"" +0x02ef: "[?]" +0x02f0: "[?]" +0x02f1: "[?]" +0x02f2: "[?]" +0x02f3: "[?]" +0x02f4: "[?]" +0x02f5: "[?]" +0x02f6: "[?]" +0x02f7: "[?]" +0x02f8: "[?]" +0x02f9: "[?]" +0x02fa: "[?]" +0x02fb: "[?]" +0x02fc: "[?]" +0x02fd: "[?]" +0x02fe: "[?]" +/* x003 */ +0x0300: "" +0x0301: "" +0x0302: "" +0x0303: "" +0x0304: "" +0x0305: "" +0x0306: "" +0x0307: "" +0x0308: "" +0x0309: "" +0x030a: "" +0x030b: "" +0x030c: "" +0x030d: "" +0x030e: "" +0x030f: "" +0x0310: "" +0x0311: "" +0x0312: "" +0x0313: "" +0x0314: "" +0x0315: "" +0x0316: "" +0x0317: "" +0x0318: "" +0x0319: "" +0x031a: "" +0x031b: "" +0x031c: "" +0x031d: "" +0x031e: "" +0x031f: "" +0x0320: "" +0x0321: "" +0x0322: "" +0x0323: "" +0x0324: "" +0x0325: "" +0x0326: "" +0x0327: "" +0x0328: "" +0x0329: "" +0x032a: "" +0x032b: "" +0x032c: "" +0x032d: "" +0x032e: "" +0x032f: "" +0x0330: "" +0x0331: "" +0x0332: "" +0x0333: "" +0x0334: "" +0x0335: "" +0x0336: "" +0x0337: "" +0x0338: "" +0x0339: "" +0x033a: "" +0x033b: "" +0x033c: "" +0x033d: "" +0x033e: "" +0x033f: "" +0x0340: "" +0x0341: "" +0x0342: "" +0x0343: "" +0x0344: "" +0x0345: "" +0x0346: "" +0x0347: "" +0x0348: "" +0x0349: "" +0x034a: "" +0x034b: "" +0x034c: "" +0x034d: "" +0x034e: "" +0x034f: "[?]" +0x0350: "[?]" +0x0351: "[?]" +0x0352: "[?]" +0x0353: "[?]" +0x0354: "[?]" +0x0355: "[?]" +0x0356: "[?]" +0x0357: "[?]" +0x0358: "[?]" +0x0359: "[?]" +0x035a: "[?]" +0x035b: "[?]" +0x035c: "[?]" +0x035d: "[?]" +0x035e: "[?]" +0x035f: "[?]" +0x0360: "" +0x0361: "" +0x0362: "" +0x0363: "a" +0x0364: "e" +0x0365: "i" +0x0366: "o" +0x0367: "u" +0x0368: "c" +0x0369: "d" +0x036a: "h" +0x036b: "m" +0x036c: "r" +0x036d: "t" +0x036e: "v" +0x036f: "x" +0x0370: "[?]" +0x0371: "[?]" +0x0372: "[?]" +0x0373: "[?]" +0x0374: "'" +0x0375: "," +0x0376: "[?]" +0x0377: "[?]" +0x0378: "[?]" +0x0379: "[?]" +0x037a: "" +0x037b: "[?]" +0x037c: "[?]" +0x037d: "[?]" +0x037e: "?" +0x037f: "[?]" +0x0380: "[?]" +0x0381: "[?]" +0x0382: "[?]" +0x0383: "[?]" +0x0384: "" +0x0385: "" +0x0386: "A" +0x0387: ";" +0x0388: "E" +0x0389: "E" +0x038a: "I" +0x038b: "[?]" +0x038c: "O" +0x038d: "[?]" +0x038e: "U" +0x038f: "O" +0x0390: "I" +0x0391: "A" +0x0392: "B" +0x0393: "G" +0x0394: "D" +0x0395: "E" +0x0396: "Z" +0x0397: "E" +0x0398: "Th" +0x0399: "I" +0x039a: "K" +0x039b: "L" +0x039c: "M" +0x039d: "N" +0x039e: "Ks" +0x039f: "O" +0x03a0: "P" +0x03a1: "R" +0x03a2: "[?]" +0x03a3: "S" +0x03a4: "T" +0x03a5: "U" +0x03a6: "Ph" +0x03a7: "Kh" +0x03a8: "Ps" +0x03a9: "O" +0x03aa: "I" +0x03ab: "U" +0x03ac: "a" +0x03ad: "e" +0x03ae: "e" +0x03af: "i" +0x03b0: "u" +0x03b1: "a" +0x03b2: "b" +0x03b3: "g" +0x03b4: "d" +0x03b5: "e" +0x03b6: "z" +0x03b7: "e" +0x03b8: "th" +0x03b9: "i" +0x03ba: "k" +0x03bb: "l" +0x03bc: "m" +0x03bd: "n" +0x03be: "x" +0x03bf: "o" +0x03c0: "p" +0x03c1: "r" +0x03c2: "s" +0x03c3: "s" +0x03c4: "t" +0x03c5: "u" +0x03c6: "ph" +0x03c7: "kh" +0x03c8: "ps" +0x03c9: "o" +0x03ca: "i" +0x03cb: "u" +0x03cc: "o" +0x03cd: "u" +0x03ce: "o" +0x03cf: "[?]" +0x03d0: "b" +0x03d1: "th" +0x03d2: "U" +0x03d3: "U" +0x03d4: "U" +0x03d5: "ph" +0x03d6: "p" +0x03d7: "&" +0x03d8: "[?]" +0x03d9: "[?]" +0x03da: "St" +0x03db: "st" +0x03dc: "W" +0x03dd: "w" +0x03de: "Q" +0x03df: "q" +0x03e0: "Sp" +0x03e1: "sp" +0x03e2: "Sh" +0x03e3: "sh" +0x03e4: "F" +0x03e5: "f" +0x03e6: "Kh" +0x03e7: "kh" +0x03e8: "H" +0x03e9: "h" +0x03ea: "G" +0x03eb: "g" +0x03ec: "CH" +0x03ed: "ch" +0x03ee: "Ti" +0x03ef: "ti" +0x03f0: "k" +0x03f1: "r" +0x03f2: "c" +0x03f3: "j" +0x03f4: "[?]" +0x03f5: "[?]" +0x03f6: "[?]" +0x03f7: "[?]" +0x03f8: "[?]" +0x03f9: "[?]" +0x03fa: "[?]" +0x03fb: "[?]" +0x03fc: "[?]" +0x03fd: "[?]" +0x03fe: "[?]" +/* x004 */ +0x0400: "Ie" +0x0401: "Io" +0x0402: "Dj" +0x0403: "Gj" +0x0404: "Ie" +0x0405: "Dz" +0x0406: "I" +0x0407: "Yi" +0x0408: "J" +0x0409: "Lj" +0x040a: "Nj" +0x040b: "Tsh" +0x040c: "Kj" +0x040d: "I" +0x040e: "U" +0x040f: "Dzh" +0x0410: "A" +0x0411: "B" +0x0412: "V" +0x0413: "G" +0x0414: "D" +0x0415: "E" +0x0416: "Zh" +0x0417: "Z" +0x0418: "I" +0x0419: "I" +0x041a: "K" +0x041b: "L" +0x041c: "M" +0x041d: "N" +0x041e: "O" +0x041f: "P" +0x0420: "R" +0x0421: "S" +0x0422: "T" +0x0423: "U" +0x0424: "F" +0x0425: "Kh" +0x0426: "Ts" +0x0427: "Ch" +0x0428: "Sh" +0x0429: "Shch" +0x042a: "'" +0x042b: "Y" +0x042c: "'" +0x042d: "E" +0x042e: "Iu" +0x042f: "Ia" +0x0430: "a" +0x0431: "b" +0x0432: "v" +0x0433: "g" +0x0434: "d" +0x0435: "e" +0x0436: "zh" +0x0437: "z" +0x0438: "i" +0x0439: "i" +0x043a: "k" +0x043b: "l" +0x043c: "m" +0x043d: "n" +0x043e: "o" +0x043f: "p" +0x0440: "r" +0x0441: "s" +0x0442: "t" +0x0443: "u" +0x0444: "f" +0x0445: "kh" +0x0446: "ts" +0x0447: "ch" +0x0448: "sh" +0x0449: "shch" +0x044a: "'" +0x044b: "y" +0x044c: "'" +0x044d: "e" +0x044e: "iu" +0x044f: "ia" +0x0450: "ie" +0x0451: "io" +0x0452: "dj" +0x0453: "gj" +0x0454: "ie" +0x0455: "dz" +0x0456: "i" +0x0457: "yi" +0x0458: "j" +0x0459: "lj" +0x045a: "nj" +0x045b: "tsh" +0x045c: "kj" +0x045d: "i" +0x045e: "u" +0x045f: "dzh" +0x0460: "O" +0x0461: "o" +0x0462: "E" +0x0463: "e" +0x0464: "Ie" +0x0465: "ie" +0x0466: "E" +0x0467: "e" +0x0468: "Ie" +0x0469: "ie" +0x046a: "O" +0x046b: "o" +0x046c: "Io" +0x046d: "io" +0x046e: "Ks" +0x046f: "ks" +0x0470: "Ps" +0x0471: "ps" +0x0472: "F" +0x0473: "f" +0x0474: "Y" +0x0475: "y" +0x0476: "Y" +0x0477: "y" +0x0478: "u" +0x0479: "u" +0x047a: "O" +0x047b: "o" +0x047c: "O" +0x047d: "o" +0x047e: "Ot" +0x047f: "ot" +0x0480: "Q" +0x0481: "q" +0x0482: "*1000*" +0x0483: "" +0x0484: "" +0x0485: "" +0x0486: "" +0x0487: "[?]" +0x0488: "*100.000*" +0x0489: "*1.000.000*" +0x048a: "[?]" +0x048b: "[?]" +0x048c: "\"" +0x048d: "\"" +0x048e: "R'" +0x048f: "r'" +0x0490: "G'" +0x0491: "g'" +0x0492: "G'" +0x0493: "g'" +0x0494: "G'" +0x0495: "g'" +0x0496: "Zh'" +0x0497: "zh'" +0x0498: "Z'" +0x0499: "z'" +0x049a: "K'" +0x049b: "k'" +0x049c: "K'" +0x049d: "k'" +0x049e: "K'" +0x049f: "k'" +0x04a0: "K'" +0x04a1: "k'" +0x04a2: "N'" +0x04a3: "n'" +0x04a4: "Ng" +0x04a5: "ng" +0x04a6: "P'" +0x04a7: "p'" +0x04a8: "Kh" +0x04a9: "kh" +0x04aa: "S'" +0x04ab: "s'" +0x04ac: "T'" +0x04ad: "t'" +0x04ae: "U" +0x04af: "u" +0x04b0: "U'" +0x04b1: "u'" +0x04b2: "Kh'" +0x04b3: "kh'" +0x04b4: "Tts" +0x04b5: "tts" +0x04b6: "Ch'" +0x04b7: "ch'" +0x04b8: "Ch'" +0x04b9: "ch'" +0x04ba: "H" +0x04bb: "h" +0x04bc: "Ch" +0x04bd: "ch" +0x04be: "Ch'" +0x04bf: "ch'" +0x04c0: "`" +0x04c1: "Zh" +0x04c2: "zh" +0x04c3: "K'" +0x04c4: "k'" +0x04c5: "[?]" +0x04c6: "[?]" +0x04c7: "N'" +0x04c8: "n'" +0x04c9: "[?]" +0x04ca: "[?]" +0x04cb: "Ch" +0x04cc: "ch" +0x04cd: "[?]" +0x04ce: "[?]" +0x04cf: "[?]" +0x04d0: "a" +0x04d1: "a" +0x04d2: "A" +0x04d3: "a" +0x04d4: "Ae" +0x04d5: "ae" +0x04d6: "Ie" +0x04d7: "ie" +0x04d8: "@" +0x04d9: "@" +0x04da: "@" +0x04db: "@" +0x04dc: "Zh" +0x04dd: "zh" +0x04de: "Z" +0x04df: "z" +0x04e0: "Dz" +0x04e1: "dz" +0x04e2: "I" +0x04e3: "i" +0x04e4: "I" +0x04e5: "i" +0x04e6: "O" +0x04e7: "o" +0x04e8: "O" +0x04e9: "o" +0x04ea: "O" +0x04eb: "o" +0x04ec: "E" +0x04ed: "e" +0x04ee: "U" +0x04ef: "u" +0x04f0: "U" +0x04f1: "u" +0x04f2: "U" +0x04f3: "u" +0x04f4: "Ch" +0x04f5: "ch" +0x04f6: "[?]" +0x04f7: "[?]" +0x04f8: "Y" +0x04f9: "y" +0x04fa: "[?]" +0x04fb: "[?]" +0x04fc: "[?]" +0x04fd: "[?]" +0x04fe: "[?]" +/* x005 */ +0x0500: "[?]" +0x0501: "[?]" +0x0502: "[?]" +0x0503: "[?]" +0x0504: "[?]" +0x0505: "[?]" +0x0506: "[?]" +0x0507: "[?]" +0x0508: "[?]" +0x0509: "[?]" +0x050a: "[?]" +0x050b: "[?]" +0x050c: "[?]" +0x050d: "[?]" +0x050e: "[?]" +0x050f: "[?]" +0x0510: "[?]" +0x0511: "[?]" +0x0512: "[?]" +0x0513: "[?]" +0x0514: "[?]" +0x0515: "[?]" +0x0516: "[?]" +0x0517: "[?]" +0x0518: "[?]" +0x0519: "[?]" +0x051a: "[?]" +0x051b: "[?]" +0x051c: "[?]" +0x051d: "[?]" +0x051e: "[?]" +0x051f: "[?]" +0x0520: "[?]" +0x0521: "[?]" +0x0522: "[?]" +0x0523: "[?]" +0x0524: "[?]" +0x0525: "[?]" +0x0526: "[?]" +0x0527: "[?]" +0x0528: "[?]" +0x0529: "[?]" +0x052a: "[?]" +0x052b: "[?]" +0x052c: "[?]" +0x052d: "[?]" +0x052e: "[?]" +0x052f: "[?]" +0x0530: "[?]" +0x0531: "A" +0x0532: "B" +0x0533: "G" +0x0534: "D" +0x0535: "E" +0x0536: "Z" +0x0537: "E" +0x0538: "E" +0x0539: "T`" +0x053a: "Zh" +0x053b: "I" +0x053c: "L" +0x053d: "Kh" +0x053e: "Ts" +0x053f: "K" +0x0540: "H" +0x0541: "Dz" +0x0542: "Gh" +0x0543: "Ch" +0x0544: "M" +0x0545: "Y" +0x0546: "N" +0x0547: "Sh" +0x0548: "O" +0x0549: "Ch`" +0x054a: "P" +0x054b: "J" +0x054c: "Rh" +0x054d: "S" +0x054e: "V" +0x054f: "T" +0x0550: "R" +0x0551: "Ts`" +0x0552: "W" +0x0553: "P`" +0x0554: "K`" +0x0555: "O" +0x0556: "F" +0x0557: "[?]" +0x0558: "[?]" +0x0559: "<" +0x055a: "'" +0x055b: "/" +0x055c: "!" +0x055d: "," +0x055e: "?" +0x055f: "." +0x0560: "[?]" +0x0561: "a" +0x0562: "b" +0x0563: "g" +0x0564: "d" +0x0565: "e" +0x0566: "z" +0x0567: "e" +0x0568: "e" +0x0569: "t`" +0x056a: "zh" +0x056b: "i" +0x056c: "l" +0x056d: "kh" +0x056e: "ts" +0x056f: "k" +0x0570: "h" +0x0571: "dz" +0x0572: "gh" +0x0573: "ch" +0x0574: "m" +0x0575: "y" +0x0576: "n" +0x0577: "sh" +0x0578: "o" +0x0579: "ch`" +0x057a: "p" +0x057b: "j" +0x057c: "rh" +0x057d: "s" +0x057e: "v" +0x057f: "t" +0x0580: "r" +0x0581: "ts`" +0x0582: "w" +0x0583: "p`" +0x0584: "k`" +0x0585: "o" +0x0586: "f" +0x0587: "ew" +0x0588: "[?]" +0x0589: "." +0x058a: "-" +0x058b: "[?]" +0x058c: "[?]" +0x058d: "[?]" +0x058e: "[?]" +0x058f: "[?]" +0x0590: "[?]" +0x0591: "" +0x0592: "" +0x0593: "" +0x0594: "" +0x0595: "" +0x0596: "" +0x0597: "" +0x0598: "" +0x0599: "" +0x059a: "" +0x059b: "" +0x059c: "" +0x059d: "" +0x059e: "" +0x059f: "" +0x05a0: "" +0x05a1: "" +0x05a2: "[?]" +0x05a3: "" +0x05a4: "" +0x05a5: "" +0x05a6: "" +0x05a7: "" +0x05a8: "" +0x05a9: "" +0x05aa: "" +0x05ab: "" +0x05ac: "" +0x05ad: "" +0x05ae: "" +0x05af: "" +0x05b0: "@" +0x05b1: "e" +0x05b2: "a" +0x05b3: "o" +0x05b4: "i" +0x05b5: "e" +0x05b6: "e" +0x05b7: "a" +0x05b8: "a" +0x05b9: "o" +0x05ba: "[?]" +0x05bb: "u" +0x05bc: "'" +0x05bd: "" +0x05be: "" +0x05bf: "" +0x05c0: "" +0x05c1: "" +0x05c2: "" +0x05c3: ":" +0x05c4: "" +0x05c5: "[?]" +0x05c6: "[?]" +0x05c7: "[?]" +0x05c8: "[?]" +0x05c9: "[?]" +0x05ca: "[?]" +0x05cb: "[?]" +0x05cc: "[?]" +0x05cd: "[?]" +0x05ce: "[?]" +0x05cf: "[?]" +0x05d0: "" +0x05d1: "b" +0x05d2: "g" +0x05d3: "d" +0x05d4: "h" +0x05d5: "v" +0x05d6: "z" +0x05d7: "kh" +0x05d8: "t" +0x05d9: "y" +0x05da: "k" +0x05db: "k" +0x05dc: "l" +0x05dd: "m" +0x05de: "m" +0x05df: "n" +0x05e0: "n" +0x05e1: "s" +0x05e2: "`" +0x05e3: "p" +0x05e4: "p" +0x05e5: "ts" +0x05e6: "ts" +0x05e7: "q" +0x05e8: "r" +0x05e9: "sh" +0x05ea: "t" +0x05eb: "[?]" +0x05ec: "[?]" +0x05ed: "[?]" +0x05ee: "[?]" +0x05ef: "[?]" +0x05f0: "V" +0x05f1: "oy" +0x05f2: "i" +0x05f3: "'" +0x05f4: "\"" +0x05f5: "[?]" +0x05f6: "[?]" +0x05f7: "[?]" +0x05f8: "[?]" +0x05f9: "[?]" +0x05fa: "[?]" +0x05fb: "[?]" +0x05fc: "[?]" +0x05fd: "[?]" +0x05fe: "[?]" +/* x006 */ +0x0600: "[?]" +0x0601: "[?]" +0x0602: "[?]" +0x0603: "[?]" +0x0604: "[?]" +0x0605: "[?]" +0x0606: "[?]" +0x0607: "[?]" +0x0608: "[?]" +0x0609: "[?]" +0x060a: "[?]" +0x060b: "[?]" +0x060c: "," +0x060d: "[?]" +0x060e: "[?]" +0x060f: "[?]" +0x0610: "[?]" +0x0611: "[?]" +0x0612: "[?]" +0x0613: "[?]" +0x0614: "[?]" +0x0615: "[?]" +0x0616: "[?]" +0x0617: "[?]" +0x0618: "[?]" +0x0619: "[?]" +0x061a: "[?]" +0x061b: ";" +0x061c: "[?]" +0x061d: "[?]" +0x061e: "[?]" +0x061f: "?" +0x0620: "[?]" +0x0621: "" +0x0622: "a" +0x0623: "'" +0x0624: "w'" +0x0625: "" +0x0626: "y'" +0x0627: "" +0x0628: "b" +0x0629: "@" +0x062a: "t" +0x062b: "th" +0x062c: "j" +0x062d: "H" +0x062e: "kh" +0x062f: "d" +0x0630: "dh" +0x0631: "r" +0x0632: "z" +0x0633: "s" +0x0634: "sh" +0x0635: "S" +0x0636: "D" +0x0637: "T" +0x0638: "Z" +0x0639: "`" +0x063a: "G" +0x063b: "[?]" +0x063c: "[?]" +0x063d: "[?]" +0x063e: "[?]" +0x063f: "[?]" +0x0640: "" +0x0641: "f" +0x0642: "q" +0x0643: "k" +0x0644: "l" +0x0645: "m" +0x0646: "n" +0x0647: "h" +0x0648: "w" +0x0649: "~" +0x064a: "y" +0x064b: "an" +0x064c: "un" +0x064d: "in" +0x064e: "a" +0x064f: "u" +0x0650: "i" +0x0651: "W" +0x0652: "" +0x0653: "" +0x0654: "'" +0x0655: "'" +0x0656: "[?]" +0x0657: "[?]" +0x0658: "[?]" +0x0659: "[?]" +0x065a: "[?]" +0x065b: "[?]" +0x065c: "[?]" +0x065d: "[?]" +0x065e: "[?]" +0x065f: "[?]" +0x0660: "0" +0x0661: "1" +0x0662: "2" +0x0663: "3" +0x0664: "4" +0x0665: "5" +0x0666: "6" +0x0667: "7" +0x0668: "8" +0x0669: "9" +0x066a: "%" +0x066b: "." +0x066c: "," +0x066d: "*" +0x066e: "[?]" +0x066f: "[?]" +0x0670: "" +0x0671: "'" +0x0672: "'" +0x0673: "'" +0x0674: "" +0x0675: "'" +0x0676: "'w" +0x0677: "'u" +0x0678: "'y" +0x0679: "tt" +0x067a: "tth" +0x067b: "b" +0x067c: "t" +0x067d: "T" +0x067e: "p" +0x067f: "th" +0x0680: "bh" +0x0681: "'h" +0x0682: "H" +0x0683: "ny" +0x0684: "dy" +0x0685: "H" +0x0686: "ch" +0x0687: "cch" +0x0688: "dd" +0x0689: "D" +0x068a: "D" +0x068b: "Dt" +0x068c: "dh" +0x068d: "ddh" +0x068e: "d" +0x068f: "D" +0x0690: "D" +0x0691: "rr" +0x0692: "R" +0x0693: "R" +0x0694: "R" +0x0695: "R" +0x0696: "R" +0x0697: "R" +0x0698: "j" +0x0699: "R" +0x069a: "S" +0x069b: "S" +0x069c: "S" +0x069d: "S" +0x069e: "S" +0x069f: "T" +0x06a0: "GH" +0x06a1: "F" +0x06a2: "F" +0x06a3: "F" +0x06a4: "v" +0x06a5: "f" +0x06a6: "ph" +0x06a7: "Q" +0x06a8: "Q" +0x06a9: "kh" +0x06aa: "k" +0x06ab: "K" +0x06ac: "K" +0x06ad: "ng" +0x06ae: "K" +0x06af: "g" +0x06b0: "G" +0x06b1: "N" +0x06b2: "G" +0x06b3: "G" +0x06b4: "G" +0x06b5: "L" +0x06b6: "L" +0x06b7: "L" +0x06b8: "L" +0x06b9: "N" +0x06ba: "N" +0x06bb: "N" +0x06bc: "N" +0x06bd: "N" +0x06be: "h" +0x06bf: "Ch" +0x06c0: "hy" +0x06c1: "h" +0x06c2: "H" +0x06c3: "@" +0x06c4: "W" +0x06c5: "oe" +0x06c6: "oe" +0x06c7: "u" +0x06c8: "yu" +0x06c9: "yu" +0x06ca: "W" +0x06cb: "v" +0x06cc: "y" +0x06cd: "Y" +0x06ce: "Y" +0x06cf: "W" +0x06d0: "" +0x06d1: "" +0x06d2: "y" +0x06d3: "y'" +0x06d4: "." +0x06d5: "ae" +0x06d6: "" +0x06d7: "" +0x06d8: "" +0x06d9: "" +0x06da: "" +0x06db: "" +0x06dc: "" +0x06dd: "@" +0x06de: "#" +0x06df: "" +0x06e0: "" +0x06e1: "" +0x06e2: "" +0x06e3: "" +0x06e4: "" +0x06e5: "" +0x06e6: "" +0x06e7: "" +0x06e8: "" +0x06e9: "^" +0x06ea: "" +0x06eb: "" +0x06ec: "" +0x06ed: "" +0x06ee: "[?]" +0x06ef: "[?]" +0x06f0: "0" +0x06f1: "1" +0x06f2: "2" +0x06f3: "3" +0x06f4: "4" +0x06f5: "5" +0x06f6: "6" +0x06f7: "7" +0x06f8: "8" +0x06f9: "9" +0x06fa: "Sh" +0x06fb: "D" +0x06fc: "Gh" +0x06fd: "&" +0x06fe: "+m" +/* x007 */ +0x0700: "//" +0x0701: "/" +0x0702: "," +0x0703: "!" +0x0704: "!" +0x0705: "-" +0x0706: "," +0x0707: "," +0x0708: ";" +0x0709: "?" +0x070a: "~" +0x070b: "{" +0x070c: "}" +0x070d: "*" +0x070e: "[?]" +0x070f: "" +0x0710: "'" +0x0711: "" +0x0712: "b" +0x0713: "g" +0x0714: "g" +0x0715: "d" +0x0716: "d" +0x0717: "h" +0x0718: "w" +0x0719: "z" +0x071a: "H" +0x071b: "t" +0x071c: "t" +0x071d: "y" +0x071e: "yh" +0x071f: "k" +0x0720: "l" +0x0721: "m" +0x0722: "n" +0x0723: "s" +0x0724: "s" +0x0725: "`" +0x0726: "p" +0x0727: "p" +0x0728: "S" +0x0729: "q" +0x072a: "r" +0x072b: "sh" +0x072c: "t" +0x072d: "[?]" +0x072e: "[?]" +0x072f: "[?]" +0x0730: "a" +0x0731: "a" +0x0732: "a" +0x0733: "A" +0x0734: "A" +0x0735: "A" +0x0736: "e" +0x0737: "e" +0x0738: "e" +0x0739: "E" +0x073a: "i" +0x073b: "i" +0x073c: "u" +0x073d: "u" +0x073e: "u" +0x073f: "o" +0x0740: "" +0x0741: "`" +0x0742: "'" +0x0743: "" +0x0744: "" +0x0745: "X" +0x0746: "Q" +0x0747: "@" +0x0748: "@" +0x0749: "|" +0x074a: "+" +0x074b: "[?]" +0x074c: "[?]" +0x074d: "[?]" +0x074e: "[?]" +0x074f: "[?]" +0x0750: "[?]" +0x0751: "[?]" +0x0752: "[?]" +0x0753: "[?]" +0x0754: "[?]" +0x0755: "[?]" +0x0756: "[?]" +0x0757: "[?]" +0x0758: "[?]" +0x0759: "[?]" +0x075a: "[?]" +0x075b: "[?]" +0x075c: "[?]" +0x075d: "[?]" +0x075e: "[?]" +0x075f: "[?]" +0x0760: "[?]" +0x0761: "[?]" +0x0762: "[?]" +0x0763: "[?]" +0x0764: "[?]" +0x0765: "[?]" +0x0766: "[?]" +0x0767: "[?]" +0x0768: "[?]" +0x0769: "[?]" +0x076a: "[?]" +0x076b: "[?]" +0x076c: "[?]" +0x076d: "[?]" +0x076e: "[?]" +0x076f: "[?]" +0x0770: "[?]" +0x0771: "[?]" +0x0772: "[?]" +0x0773: "[?]" +0x0774: "[?]" +0x0775: "[?]" +0x0776: "[?]" +0x0777: "[?]" +0x0778: "[?]" +0x0779: "[?]" +0x077a: "[?]" +0x077b: "[?]" +0x077c: "[?]" +0x077d: "[?]" +0x077e: "[?]" +0x077f: "[?]" +0x0780: "h" +0x0781: "sh" +0x0782: "n" +0x0783: "r" +0x0784: "b" +0x0785: "L" +0x0786: "k" +0x0787: "'" +0x0788: "v" +0x0789: "m" +0x078a: "f" +0x078b: "dh" +0x078c: "th" +0x078d: "l" +0x078e: "g" +0x078f: "ny" +0x0790: "s" +0x0791: "d" +0x0792: "z" +0x0793: "t" +0x0794: "y" +0x0795: "p" +0x0796: "j" +0x0797: "ch" +0x0798: "tt" +0x0799: "hh" +0x079a: "kh" +0x079b: "th" +0x079c: "z" +0x079d: "sh" +0x079e: "s" +0x079f: "d" +0x07a0: "t" +0x07a1: "z" +0x07a2: "`" +0x07a3: "gh" +0x07a4: "q" +0x07a5: "w" +0x07a6: "a" +0x07a7: "aa" +0x07a8: "i" +0x07a9: "ee" +0x07aa: "u" +0x07ab: "oo" +0x07ac: "e" +0x07ad: "ey" +0x07ae: "o" +0x07af: "oa" +0x07b0: "" +0x07b1: "[?]" +0x07b2: "[?]" +0x07b3: "[?]" +0x07b4: "[?]" +0x07b5: "[?]" +0x07b6: "[?]" +0x07b7: "[?]" +0x07b8: "[?]" +0x07b9: "[?]" +0x07ba: "[?]" +0x07bb: "[?]" +0x07bc: "[?]" +0x07bd: "[?]" +0x07be: "[?]" +0x07bf: "[?]" +0x07c0: "[?]" +0x07c1: "[?]" +0x07c2: "[?]" +0x07c3: "[?]" +0x07c4: "[?]" +0x07c5: "[?]" +0x07c6: "[?]" +0x07c7: "[?]" +0x07c8: "[?]" +0x07c9: "[?]" +0x07ca: "[?]" +0x07cb: "[?]" +0x07cc: "[?]" +0x07cd: "[?]" +0x07ce: "[?]" +0x07cf: "[?]" +0x07d0: "[?]" +0x07d1: "[?]" +0x07d2: "[?]" +0x07d3: "[?]" +0x07d4: "[?]" +0x07d5: "[?]" +0x07d6: "[?]" +0x07d7: "[?]" +0x07d8: "[?]" +0x07d9: "[?]" +0x07da: "[?]" +0x07db: "[?]" +0x07dc: "[?]" +0x07dd: "[?]" +0x07de: "[?]" +0x07df: "[?]" +0x07e0: "[?]" +0x07e1: "[?]" +0x07e2: "[?]" +0x07e3: "[?]" +0x07e4: "[?]" +0x07e5: "[?]" +0x07e6: "[?]" +0x07e7: "[?]" +0x07e8: "[?]" +0x07e9: "[?]" +0x07ea: "[?]" +0x07eb: "[?]" +0x07ec: "[?]" +0x07ed: "[?]" +0x07ee: "[?]" +0x07ef: "[?]" +0x07f0: "[?]" +0x07f1: "[?]" +0x07f2: "[?]" +0x07f3: "[?]" +0x07f4: "[?]" +0x07f5: "[?]" +0x07f6: "[?]" +0x07f7: "[?]" +0x07f8: "[?]" +0x07f9: "[?]" +0x07fa: "[?]" +0x07fb: "[?]" +0x07fc: "[?]" +0x07fd: "[?]" +0x07fe: "[?]" +/* x009 */ +0x0900: "[?]" +0x0901: "N" +0x0902: "N" +0x0903: "H" +0x0904: "[?]" +0x0905: "a" +0x0906: "aa" +0x0907: "i" +0x0908: "ii" +0x0909: "u" +0x090a: "uu" +0x090b: "R" +0x090c: "L" +0x090d: "eN" +0x090e: "e" +0x090f: "e" +0x0910: "ai" +0x0911: "oN" +0x0912: "o" +0x0913: "o" +0x0914: "au" +0x0915: "k" +0x0916: "kh" +0x0917: "g" +0x0918: "gh" +0x0919: "ng" +0x091a: "c" +0x091b: "ch" +0x091c: "j" +0x091d: "jh" +0x091e: "ny" +0x091f: "tt" +0x0920: "tth" +0x0921: "dd" +0x0922: "ddh" +0x0923: "nn" +0x0924: "t" +0x0925: "th" +0x0926: "d" +0x0927: "dh" +0x0928: "n" +0x0929: "nnn" +0x092a: "p" +0x092b: "ph" +0x092c: "b" +0x092d: "bh" +0x092e: "m" +0x092f: "y" +0x0930: "r" +0x0931: "rr" +0x0932: "l" +0x0933: "l" +0x0934: "lll" +0x0935: "v" +0x0936: "sh" +0x0937: "ss" +0x0938: "s" +0x0939: "h" +0x093a: "[?]" +0x093b: "[?]" +0x093c: "'" +0x093d: "'" +0x093e: "aa" +0x093f: "i" +0x0940: "ii" +0x0941: "u" +0x0942: "uu" +0x0943: "R" +0x0944: "RR" +0x0945: "eN" +0x0946: "e" +0x0947: "e" +0x0948: "ai" +0x0949: "oN" +0x094a: "o" +0x094b: "o" +0x094c: "au" +0x094d: "" +0x094e: "[?]" +0x094f: "[?]" +0x0950: "AUM" +0x0951: "'" +0x0952: "'" +0x0953: "`" +0x0954: "'" +0x0955: "[?]" +0x0956: "[?]" +0x0957: "[?]" +0x0958: "q" +0x0959: "khh" +0x095a: "ghh" +0x095b: "z" +0x095c: "dddh" +0x095d: "rh" +0x095e: "f" +0x095f: "yy" +0x0960: "RR" +0x0961: "LL" +0x0962: "L" +0x0963: "LL" +0x0964: " / " +0x0965: " // " +0x0966: "0" +0x0967: "1" +0x0968: "2" +0x0969: "3" +0x096a: "4" +0x096b: "5" +0x096c: "6" +0x096d: "7" +0x096e: "8" +0x096f: "9" +0x0970: "." +0x0971: "[?]" +0x0972: "[?]" +0x0973: "[?]" +0x0974: "[?]" +0x0975: "[?]" +0x0976: "[?]" +0x0977: "[?]" +0x0978: "[?]" +0x0979: "[?]" +0x097a: "[?]" +0x097b: "[?]" +0x097c: "[?]" +0x097d: "[?]" +0x097e: "[?]" +0x097f: "[?]" +0x0980: "[?]" +0x0981: "N" +0x0982: "N" +0x0983: "H" +0x0984: "[?]" +0x0985: "a" +0x0986: "aa" +0x0987: "i" +0x0988: "ii" +0x0989: "u" +0x098a: "uu" +0x098b: "R" +0x098c: "RR" +0x098d: "[?]" +0x098e: "[?]" +0x098f: "e" +0x0990: "ai" +0x0991: "[?]" +0x0992: "[?]" +0x0993: "o" +0x0994: "au" +0x0995: "k" +0x0996: "kh" +0x0997: "g" +0x0998: "gh" +0x0999: "ng" +0x099a: "c" +0x099b: "ch" +0x099c: "j" +0x099d: "jh" +0x099e: "ny" +0x099f: "tt" +0x09a0: "tth" +0x09a1: "dd" +0x09a2: "ddh" +0x09a3: "nn" +0x09a4: "t" +0x09a5: "th" +0x09a6: "d" +0x09a7: "dh" +0x09a8: "n" +0x09a9: "[?]" +0x09aa: "p" +0x09ab: "ph" +0x09ac: "b" +0x09ad: "bh" +0x09ae: "m" +0x09af: "y" +0x09b0: "r" +0x09b1: "[?]" +0x09b2: "l" +0x09b3: "[?]" +0x09b4: "[?]" +0x09b5: "[?]" +0x09b6: "sh" +0x09b7: "ss" +0x09b8: "s" +0x09b9: "h" +0x09ba: "[?]" +0x09bb: "[?]" +0x09bc: "'" +0x09bd: "[?]" +0x09be: "aa" +0x09bf: "i" +0x09c0: "ii" +0x09c1: "u" +0x09c2: "uu" +0x09c3: "R" +0x09c4: "RR" +0x09c5: "[?]" +0x09c6: "[?]" +0x09c7: "e" +0x09c8: "ai" +0x09c9: "[?]" +0x09ca: "[?]" +0x09cb: "o" +0x09cc: "au" +0x09cd: "" +0x09ce: "[?]" +0x09cf: "[?]" +0x09d0: "[?]" +0x09d1: "[?]" +0x09d2: "[?]" +0x09d3: "[?]" +0x09d4: "[?]" +0x09d5: "[?]" +0x09d6: "[?]" +0x09d7: "+" +0x09d8: "[?]" +0x09d9: "[?]" +0x09da: "[?]" +0x09db: "[?]" +0x09dc: "rr" +0x09dd: "rh" +0x09de: "[?]" +0x09df: "yy" +0x09e0: "RR" +0x09e1: "LL" +0x09e2: "L" +0x09e3: "LL" +0x09e4: "[?]" +0x09e5: "[?]" +0x09e6: "0" +0x09e7: "1" +0x09e8: "2" +0x09e9: "3" +0x09ea: "4" +0x09eb: "5" +0x09ec: "6" +0x09ed: "7" +0x09ee: "8" +0x09ef: "9" +0x09f0: "r'" +0x09f1: "r`" +0x09f2: "Rs" +0x09f3: "Rs" +0x09f4: "1/" +0x09f5: "2/" +0x09f6: "3/" +0x09f7: "4/" +0x09f8: " 1 - 1/" +0x09f9: "/16" +0x09fa: "" +0x09fb: "[?]" +0x09fc: "[?]" +0x09fd: "[?]" +0x09fe: "[?]" +/* x00a */ +0x0a00: "[?]" +0x0a01: "[?]" +0x0a02: "N" +0x0a03: "[?]" +0x0a04: "[?]" +0x0a05: "a" +0x0a06: "aa" +0x0a07: "i" +0x0a08: "ii" +0x0a09: "u" +0x0a0a: "uu" +0x0a0b: "[?]" +0x0a0c: "[?]" +0x0a0d: "[?]" +0x0a0e: "[?]" +0x0a0f: "ee" +0x0a10: "ai" +0x0a11: "[?]" +0x0a12: "[?]" +0x0a13: "oo" +0x0a14: "au" +0x0a15: "k" +0x0a16: "kh" +0x0a17: "g" +0x0a18: "gh" +0x0a19: "ng" +0x0a1a: "c" +0x0a1b: "ch" +0x0a1c: "j" +0x0a1d: "jh" +0x0a1e: "ny" +0x0a1f: "tt" +0x0a20: "tth" +0x0a21: "dd" +0x0a22: "ddh" +0x0a23: "nn" +0x0a24: "t" +0x0a25: "th" +0x0a26: "d" +0x0a27: "dh" +0x0a28: "n" +0x0a29: "[?]" +0x0a2a: "p" +0x0a2b: "ph" +0x0a2c: "b" +0x0a2d: "bb" +0x0a2e: "m" +0x0a2f: "y" +0x0a30: "r" +0x0a31: "[?]" +0x0a32: "l" +0x0a33: "ll" +0x0a34: "[?]" +0x0a35: "v" +0x0a36: "sh" +0x0a37: "[?]" +0x0a38: "s" +0x0a39: "h" +0x0a3a: "[?]" +0x0a3b: "[?]" +0x0a3c: "'" +0x0a3d: "[?]" +0x0a3e: "aa" +0x0a3f: "i" +0x0a40: "ii" +0x0a41: "u" +0x0a42: "uu" +0x0a43: "[?]" +0x0a44: "[?]" +0x0a45: "[?]" +0x0a46: "[?]" +0x0a47: "ee" +0x0a48: "ai" +0x0a49: "[?]" +0x0a4a: "[?]" +0x0a4b: "oo" +0x0a4c: "au" +0x0a4d: "" +0x0a4e: "[?]" +0x0a4f: "[?]" +0x0a50: "[?]" +0x0a51: "[?]" +0x0a52: "[?]" +0x0a53: "[?]" +0x0a54: "[?]" +0x0a55: "[?]" +0x0a56: "[?]" +0x0a57: "[?]" +0x0a58: "[?]" +0x0a59: "khh" +0x0a5a: "ghh" +0x0a5b: "z" +0x0a5c: "rr" +0x0a5d: "[?]" +0x0a5e: "f" +0x0a5f: "[?]" +0x0a60: "[?]" +0x0a61: "[?]" +0x0a62: "[?]" +0x0a63: "[?]" +0x0a64: "[?]" +0x0a65: "[?]" +0x0a66: "0" +0x0a67: "1" +0x0a68: "2" +0x0a69: "3" +0x0a6a: "4" +0x0a6b: "5" +0x0a6c: "6" +0x0a6d: "7" +0x0a6e: "8" +0x0a6f: "9" +0x0a70: "N" +0x0a71: "H" +0x0a72: "" +0x0a73: "" +0x0a74: "G.E.O." +0x0a75: "[?]" +0x0a76: "[?]" +0x0a77: "[?]" +0x0a78: "[?]" +0x0a79: "[?]" +0x0a7a: "[?]" +0x0a7b: "[?]" +0x0a7c: "[?]" +0x0a7d: "[?]" +0x0a7e: "[?]" +0x0a7f: "[?]" +0x0a80: "[?]" +0x0a81: "N" +0x0a82: "N" +0x0a83: "H" +0x0a84: "[?]" +0x0a85: "a" +0x0a86: "aa" +0x0a87: "i" +0x0a88: "ii" +0x0a89: "u" +0x0a8a: "uu" +0x0a8b: "R" +0x0a8c: "[?]" +0x0a8d: "eN" +0x0a8e: "[?]" +0x0a8f: "e" +0x0a90: "ai" +0x0a91: "oN" +0x0a92: "[?]" +0x0a93: "o" +0x0a94: "au" +0x0a95: "k" +0x0a96: "kh" +0x0a97: "g" +0x0a98: "gh" +0x0a99: "ng" +0x0a9a: "c" +0x0a9b: "ch" +0x0a9c: "j" +0x0a9d: "jh" +0x0a9e: "ny" +0x0a9f: "tt" +0x0aa0: "tth" +0x0aa1: "dd" +0x0aa2: "ddh" +0x0aa3: "nn" +0x0aa4: "t" +0x0aa5: "th" +0x0aa6: "d" +0x0aa7: "dh" +0x0aa8: "n" +0x0aa9: "[?]" +0x0aaa: "p" +0x0aab: "ph" +0x0aac: "b" +0x0aad: "bh" +0x0aae: "m" +0x0aaf: "ya" +0x0ab0: "r" +0x0ab1: "[?]" +0x0ab2: "l" +0x0ab3: "ll" +0x0ab4: "[?]" +0x0ab5: "v" +0x0ab6: "sh" +0x0ab7: "ss" +0x0ab8: "s" +0x0ab9: "h" +0x0aba: "[?]" +0x0abb: "[?]" +0x0abc: "'" +0x0abd: "'" +0x0abe: "aa" +0x0abf: "i" +0x0ac0: "ii" +0x0ac1: "u" +0x0ac2: "uu" +0x0ac3: "R" +0x0ac4: "RR" +0x0ac5: "eN" +0x0ac6: "[?]" +0x0ac7: "e" +0x0ac8: "ai" +0x0ac9: "oN" +0x0aca: "[?]" +0x0acb: "o" +0x0acc: "au" +0x0acd: "" +0x0ace: "[?]" +0x0acf: "[?]" +0x0ad0: "AUM" +0x0ad1: "[?]" +0x0ad2: "[?]" +0x0ad3: "[?]" +0x0ad4: "[?]" +0x0ad5: "[?]" +0x0ad6: "[?]" +0x0ad7: "[?]" +0x0ad8: "[?]" +0x0ad9: "[?]" +0x0ada: "[?]" +0x0adb: "[?]" +0x0adc: "[?]" +0x0add: "[?]" +0x0ade: "[?]" +0x0adf: "[?]" +0x0ae0: "RR" +0x0ae1: "[?]" +0x0ae2: "[?]" +0x0ae3: "[?]" +0x0ae4: "[?]" +0x0ae5: "[?]" +0x0ae6: "0" +0x0ae7: "1" +0x0ae8: "2" +0x0ae9: "3" +0x0aea: "4" +0x0aeb: "5" +0x0aec: "6" +0x0aed: "7" +0x0aee: "8" +0x0aef: "9" +0x0af0: "[?]" +0x0af1: "[?]" +0x0af2: "[?]" +0x0af3: "[?]" +0x0af4: "[?]" +0x0af5: "[?]" +0x0af6: "[?]" +0x0af7: "[?]" +0x0af8: "[?]" +0x0af9: "[?]" +0x0afa: "[?]" +0x0afb: "[?]" +0x0afc: "[?]" +0x0afd: "[?]" +0x0afe: "[?]" +/* x00b */ +0x0b00: "[?]" +0x0b01: "N" +0x0b02: "N" +0x0b03: "H" +0x0b04: "[?]" +0x0b05: "a" +0x0b06: "aa" +0x0b07: "i" +0x0b08: "ii" +0x0b09: "u" +0x0b0a: "uu" +0x0b0b: "R" +0x0b0c: "L" +0x0b0d: "[?]" +0x0b0e: "[?]" +0x0b0f: "e" +0x0b10: "ai" +0x0b11: "[?]" +0x0b12: "[?]" +0x0b13: "o" +0x0b14: "au" +0x0b15: "k" +0x0b16: "kh" +0x0b17: "g" +0x0b18: "gh" +0x0b19: "ng" +0x0b1a: "c" +0x0b1b: "ch" +0x0b1c: "j" +0x0b1d: "jh" +0x0b1e: "ny" +0x0b1f: "tt" +0x0b20: "tth" +0x0b21: "dd" +0x0b22: "ddh" +0x0b23: "nn" +0x0b24: "t" +0x0b25: "th" +0x0b26: "d" +0x0b27: "dh" +0x0b28: "n" +0x0b29: "[?]" +0x0b2a: "p" +0x0b2b: "ph" +0x0b2c: "b" +0x0b2d: "bh" +0x0b2e: "m" +0x0b2f: "y" +0x0b30: "r" +0x0b31: "[?]" +0x0b32: "l" +0x0b33: "ll" +0x0b34: "[?]" +0x0b35: "" +0x0b36: "sh" +0x0b37: "ss" +0x0b38: "s" +0x0b39: "h" +0x0b3a: "[?]" +0x0b3b: "[?]" +0x0b3c: "'" +0x0b3d: "'" +0x0b3e: "aa" +0x0b3f: "i" +0x0b40: "ii" +0x0b41: "u" +0x0b42: "uu" +0x0b43: "R" +0x0b44: "[?]" +0x0b45: "[?]" +0x0b46: "[?]" +0x0b47: "e" +0x0b48: "ai" +0x0b49: "[?]" +0x0b4a: "[?]" +0x0b4b: "o" +0x0b4c: "au" +0x0b4d: "" +0x0b4e: "[?]" +0x0b4f: "[?]" +0x0b50: "[?]" +0x0b51: "[?]" +0x0b52: "[?]" +0x0b53: "[?]" +0x0b54: "[?]" +0x0b55: "[?]" +0x0b56: "+" +0x0b57: "+" +0x0b58: "[?]" +0x0b59: "[?]" +0x0b5a: "[?]" +0x0b5b: "[?]" +0x0b5c: "rr" +0x0b5d: "rh" +0x0b5e: "[?]" +0x0b5f: "yy" +0x0b60: "RR" +0x0b61: "LL" +0x0b62: "[?]" +0x0b63: "[?]" +0x0b64: "[?]" +0x0b65: "[?]" +0x0b66: "0" +0x0b67: "1" +0x0b68: "2" +0x0b69: "3" +0x0b6a: "4" +0x0b6b: "5" +0x0b6c: "6" +0x0b6d: "7" +0x0b6e: "8" +0x0b6f: "9" +0x0b70: "" +0x0b71: "[?]" +0x0b72: "[?]" +0x0b73: "[?]" +0x0b74: "[?]" +0x0b75: "[?]" +0x0b76: "[?]" +0x0b77: "[?]" +0x0b78: "[?]" +0x0b79: "[?]" +0x0b7a: "[?]" +0x0b7b: "[?]" +0x0b7c: "[?]" +0x0b7d: "[?]" +0x0b7e: "[?]" +0x0b7f: "[?]" +0x0b80: "[?]" +0x0b81: "[?]" +0x0b82: "N" +0x0b83: "H" +0x0b84: "[?]" +0x0b85: "a" +0x0b86: "aa" +0x0b87: "i" +0x0b88: "ii" +0x0b89: "u" +0x0b8a: "uu" +0x0b8b: "[?]" +0x0b8c: "[?]" +0x0b8d: "[?]" +0x0b8e: "e" +0x0b8f: "ee" +0x0b90: "ai" +0x0b91: "[?]" +0x0b92: "o" +0x0b93: "oo" +0x0b94: "au" +0x0b95: "k" +0x0b96: "[?]" +0x0b97: "[?]" +0x0b98: "[?]" +0x0b99: "ng" +0x0b9a: "c" +0x0b9b: "[?]" +0x0b9c: "j" +0x0b9d: "[?]" +0x0b9e: "ny" +0x0b9f: "tt" +0x0ba0: "[?]" +0x0ba1: "[?]" +0x0ba2: "[?]" +0x0ba3: "nn" +0x0ba4: "t" +0x0ba5: "[?]" +0x0ba6: "[?]" +0x0ba7: "[?]" +0x0ba8: "n" +0x0ba9: "nnn" +0x0baa: "p" +0x0bab: "[?]" +0x0bac: "[?]" +0x0bad: "[?]" +0x0bae: "m" +0x0baf: "y" +0x0bb0: "r" +0x0bb1: "rr" +0x0bb2: "l" +0x0bb3: "ll" +0x0bb4: "lll" +0x0bb5: "v" +0x0bb6: "[?]" +0x0bb7: "ss" +0x0bb8: "s" +0x0bb9: "h" +0x0bba: "[?]" +0x0bbb: "[?]" +0x0bbc: "[?]" +0x0bbd: "[?]" +0x0bbe: "aa" +0x0bbf: "i" +0x0bc0: "ii" +0x0bc1: "u" +0x0bc2: "uu" +0x0bc3: "[?]" +0x0bc4: "[?]" +0x0bc5: "[?]" +0x0bc6: "e" +0x0bc7: "ee" +0x0bc8: "ai" +0x0bc9: "[?]" +0x0bca: "o" +0x0bcb: "oo" +0x0bcc: "au" +0x0bcd: "" +0x0bce: "[?]" +0x0bcf: "[?]" +0x0bd0: "[?]" +0x0bd1: "[?]" +0x0bd2: "[?]" +0x0bd3: "[?]" +0x0bd4: "[?]" +0x0bd5: "[?]" +0x0bd6: "[?]" +0x0bd7: "+" +0x0bd8: "[?]" +0x0bd9: "[?]" +0x0bda: "[?]" +0x0bdb: "[?]" +0x0bdc: "[?]" +0x0bdd: "[?]" +0x0bde: "[?]" +0x0bdf: "[?]" +0x0be0: "[?]" +0x0be1: "[?]" +0x0be2: "[?]" +0x0be3: "[?]" +0x0be4: "[?]" +0x0be5: "[?]" +0x0be6: "0" +0x0be7: "1" +0x0be8: "2" +0x0be9: "3" +0x0bea: "4" +0x0beb: "5" +0x0bec: "6" +0x0bed: "7" +0x0bee: "8" +0x0bef: "9" +0x0bf0: "+10+" +0x0bf1: "+100+" +0x0bf2: "+1000+" +0x0bf3: "[?]" +0x0bf4: "[?]" +0x0bf5: "[?]" +0x0bf6: "[?]" +0x0bf7: "[?]" +0x0bf8: "[?]" +0x0bf9: "[?]" +0x0bfa: "[?]" +0x0bfb: "[?]" +0x0bfc: "[?]" +0x0bfd: "[?]" +0x0bfe: "[?]" +/* x00c */ +0x0c00: "[?]" +0x0c01: "N" +0x0c02: "N" +0x0c03: "H" +0x0c04: "[?]" +0x0c05: "a" +0x0c06: "aa" +0x0c07: "i" +0x0c08: "ii" +0x0c09: "u" +0x0c0a: "uu" +0x0c0b: "R" +0x0c0c: "L" +0x0c0d: "[?]" +0x0c0e: "e" +0x0c0f: "ee" +0x0c10: "ai" +0x0c11: "[?]" +0x0c12: "o" +0x0c13: "oo" +0x0c14: "au" +0x0c15: "k" +0x0c16: "kh" +0x0c17: "g" +0x0c18: "gh" +0x0c19: "ng" +0x0c1a: "c" +0x0c1b: "ch" +0x0c1c: "j" +0x0c1d: "jh" +0x0c1e: "ny" +0x0c1f: "tt" +0x0c20: "tth" +0x0c21: "dd" +0x0c22: "ddh" +0x0c23: "nn" +0x0c24: "t" +0x0c25: "th" +0x0c26: "d" +0x0c27: "dh" +0x0c28: "n" +0x0c29: "[?]" +0x0c2a: "p" +0x0c2b: "ph" +0x0c2c: "b" +0x0c2d: "bh" +0x0c2e: "m" +0x0c2f: "y" +0x0c30: "r" +0x0c31: "rr" +0x0c32: "l" +0x0c33: "ll" +0x0c34: "[?]" +0x0c35: "v" +0x0c36: "sh" +0x0c37: "ss" +0x0c38: "s" +0x0c39: "h" +0x0c3a: "[?]" +0x0c3b: "[?]" +0x0c3c: "[?]" +0x0c3d: "[?]" +0x0c3e: "aa" +0x0c3f: "i" +0x0c40: "ii" +0x0c41: "u" +0x0c42: "uu" +0x0c43: "R" +0x0c44: "RR" +0x0c45: "[?]" +0x0c46: "e" +0x0c47: "ee" +0x0c48: "ai" +0x0c49: "[?]" +0x0c4a: "o" +0x0c4b: "oo" +0x0c4c: "au" +0x0c4d: "" +0x0c4e: "[?]" +0x0c4f: "[?]" +0x0c50: "[?]" +0x0c51: "[?]" +0x0c52: "[?]" +0x0c53: "[?]" +0x0c54: "[?]" +0x0c55: "+" +0x0c56: "+" +0x0c57: "[?]" +0x0c58: "[?]" +0x0c59: "[?]" +0x0c5a: "[?]" +0x0c5b: "[?]" +0x0c5c: "[?]" +0x0c5d: "[?]" +0x0c5e: "[?]" +0x0c5f: "[?]" +0x0c60: "RR" +0x0c61: "LL" +0x0c62: "[?]" +0x0c63: "[?]" +0x0c64: "[?]" +0x0c65: "[?]" +0x0c66: "0" +0x0c67: "1" +0x0c68: "2" +0x0c69: "3" +0x0c6a: "4" +0x0c6b: "5" +0x0c6c: "6" +0x0c6d: "7" +0x0c6e: "8" +0x0c6f: "9" +0x0c70: "[?]" +0x0c71: "[?]" +0x0c72: "[?]" +0x0c73: "[?]" +0x0c74: "[?]" +0x0c75: "[?]" +0x0c76: "[?]" +0x0c77: "[?]" +0x0c78: "[?]" +0x0c79: "[?]" +0x0c7a: "[?]" +0x0c7b: "[?]" +0x0c7c: "[?]" +0x0c7d: "[?]" +0x0c7e: "[?]" +0x0c7f: "[?]" +0x0c80: "[?]" +0x0c81: "[?]" +0x0c82: "N" +0x0c83: "H" +0x0c84: "[?]" +0x0c85: "a" +0x0c86: "aa" +0x0c87: "i" +0x0c88: "ii" +0x0c89: "u" +0x0c8a: "uu" +0x0c8b: "R" +0x0c8c: "L" +0x0c8d: "[?]" +0x0c8e: "e" +0x0c8f: "ee" +0x0c90: "ai" +0x0c91: "[?]" +0x0c92: "o" +0x0c93: "oo" +0x0c94: "au" +0x0c95: "k" +0x0c96: "kh" +0x0c97: "g" +0x0c98: "gh" +0x0c99: "ng" +0x0c9a: "c" +0x0c9b: "ch" +0x0c9c: "j" +0x0c9d: "jh" +0x0c9e: "ny" +0x0c9f: "tt" +0x0ca0: "tth" +0x0ca1: "dd" +0x0ca2: "ddh" +0x0ca3: "nn" +0x0ca4: "t" +0x0ca5: "th" +0x0ca6: "d" +0x0ca7: "dh" +0x0ca8: "n" +0x0ca9: "[?]" +0x0caa: "p" +0x0cab: "ph" +0x0cac: "b" +0x0cad: "bh" +0x0cae: "m" +0x0caf: "y" +0x0cb0: "r" +0x0cb1: "rr" +0x0cb2: "l" +0x0cb3: "ll" +0x0cb4: "[?]" +0x0cb5: "v" +0x0cb6: "sh" +0x0cb7: "ss" +0x0cb8: "s" +0x0cb9: "h" +0x0cba: "[?]" +0x0cbb: "[?]" +0x0cbc: "[?]" +0x0cbd: "[?]" +0x0cbe: "aa" +0x0cbf: "i" +0x0cc0: "ii" +0x0cc1: "u" +0x0cc2: "uu" +0x0cc3: "R" +0x0cc4: "RR" +0x0cc5: "[?]" +0x0cc6: "e" +0x0cc7: "ee" +0x0cc8: "ai" +0x0cc9: "[?]" +0x0cca: "o" +0x0ccb: "oo" +0x0ccc: "au" +0x0ccd: "" +0x0cce: "[?]" +0x0ccf: "[?]" +0x0cd0: "[?]" +0x0cd1: "[?]" +0x0cd2: "[?]" +0x0cd3: "[?]" +0x0cd4: "[?]" +0x0cd5: "+" +0x0cd6: "+" +0x0cd7: "[?]" +0x0cd8: "[?]" +0x0cd9: "[?]" +0x0cda: "[?]" +0x0cdb: "[?]" +0x0cdc: "[?]" +0x0cdd: "[?]" +0x0cde: "lll" +0x0cdf: "[?]" +0x0ce0: "RR" +0x0ce1: "LL" +0x0ce2: "[?]" +0x0ce3: "[?]" +0x0ce4: "[?]" +0x0ce5: "[?]" +0x0ce6: "0" +0x0ce7: "1" +0x0ce8: "2" +0x0ce9: "3" +0x0cea: "4" +0x0ceb: "5" +0x0cec: "6" +0x0ced: "7" +0x0cee: "8" +0x0cef: "9" +0x0cf0: "[?]" +0x0cf1: "[?]" +0x0cf2: "[?]" +0x0cf3: "[?]" +0x0cf4: "[?]" +0x0cf5: "[?]" +0x0cf6: "[?]" +0x0cf7: "[?]" +0x0cf8: "[?]" +0x0cf9: "[?]" +0x0cfa: "[?]" +0x0cfb: "[?]" +0x0cfc: "[?]" +0x0cfd: "[?]" +0x0cfe: "[?]" +/* x00d */ +0x0d00: "[?]" +0x0d01: "[?]" +0x0d02: "N" +0x0d03: "H" +0x0d04: "[?]" +0x0d05: "a" +0x0d06: "aa" +0x0d07: "i" +0x0d08: "ii" +0x0d09: "u" +0x0d0a: "uu" +0x0d0b: "R" +0x0d0c: "L" +0x0d0d: "[?]" +0x0d0e: "e" +0x0d0f: "ee" +0x0d10: "ai" +0x0d11: "[?]" +0x0d12: "o" +0x0d13: "oo" +0x0d14: "au" +0x0d15: "k" +0x0d16: "kh" +0x0d17: "g" +0x0d18: "gh" +0x0d19: "ng" +0x0d1a: "c" +0x0d1b: "ch" +0x0d1c: "j" +0x0d1d: "jh" +0x0d1e: "ny" +0x0d1f: "tt" +0x0d20: "tth" +0x0d21: "dd" +0x0d22: "ddh" +0x0d23: "nn" +0x0d24: "t" +0x0d25: "th" +0x0d26: "d" +0x0d27: "dh" +0x0d28: "n" +0x0d29: "[?]" +0x0d2a: "p" +0x0d2b: "ph" +0x0d2c: "b" +0x0d2d: "bh" +0x0d2e: "m" +0x0d2f: "y" +0x0d30: "r" +0x0d31: "rr" +0x0d32: "l" +0x0d33: "ll" +0x0d34: "lll" +0x0d35: "v" +0x0d36: "sh" +0x0d37: "ss" +0x0d38: "s" +0x0d39: "h" +0x0d3a: "[?]" +0x0d3b: "[?]" +0x0d3c: "[?]" +0x0d3d: "[?]" +0x0d3e: "aa" +0x0d3f: "i" +0x0d40: "ii" +0x0d41: "u" +0x0d42: "uu" +0x0d43: "R" +0x0d44: "[?]" +0x0d45: "[?]" +0x0d46: "e" +0x0d47: "ee" +0x0d48: "ai" +0x0d49: "" +0x0d4a: "o" +0x0d4b: "oo" +0x0d4c: "au" +0x0d4d: "" +0x0d4e: "[?]" +0x0d4f: "[?]" +0x0d50: "[?]" +0x0d51: "[?]" +0x0d52: "[?]" +0x0d53: "[?]" +0x0d54: "[?]" +0x0d55: "[?]" +0x0d56: "[?]" +0x0d57: "+" +0x0d58: "[?]" +0x0d59: "[?]" +0x0d5a: "[?]" +0x0d5b: "[?]" +0x0d5c: "[?]" +0x0d5d: "[?]" +0x0d5e: "[?]" +0x0d5f: "[?]" +0x0d60: "RR" +0x0d61: "LL" +0x0d62: "[?]" +0x0d63: "[?]" +0x0d64: "[?]" +0x0d65: "[?]" +0x0d66: "0" +0x0d67: "1" +0x0d68: "2" +0x0d69: "3" +0x0d6a: "4" +0x0d6b: "5" +0x0d6c: "6" +0x0d6d: "7" +0x0d6e: "8" +0x0d6f: "9" +0x0d70: "[?]" +0x0d71: "[?]" +0x0d72: "[?]" +0x0d73: "[?]" +0x0d74: "[?]" +0x0d75: "[?]" +0x0d76: "[?]" +0x0d77: "[?]" +0x0d78: "[?]" +0x0d79: "[?]" +0x0d7a: "[?]" +0x0d7b: "[?]" +0x0d7c: "[?]" +0x0d7d: "[?]" +0x0d7e: "[?]" +0x0d7f: "[?]" +0x0d80: "[?]" +0x0d81: "[?]" +0x0d82: "N" +0x0d83: "H" +0x0d84: "[?]" +0x0d85: "a" +0x0d86: "aa" +0x0d87: "ae" +0x0d88: "aae" +0x0d89: "i" +0x0d8a: "ii" +0x0d8b: "u" +0x0d8c: "uu" +0x0d8d: "R" +0x0d8e: "RR" +0x0d8f: "L" +0x0d90: "LL" +0x0d91: "e" +0x0d92: "ee" +0x0d93: "ai" +0x0d94: "o" +0x0d95: "oo" +0x0d96: "au" +0x0d97: "[?]" +0x0d98: "[?]" +0x0d99: "[?]" +0x0d9a: "k" +0x0d9b: "kh" +0x0d9c: "g" +0x0d9d: "gh" +0x0d9e: "ng" +0x0d9f: "nng" +0x0da0: "c" +0x0da1: "ch" +0x0da2: "j" +0x0da3: "jh" +0x0da4: "ny" +0x0da5: "jny" +0x0da6: "nyj" +0x0da7: "tt" +0x0da8: "tth" +0x0da9: "dd" +0x0daa: "ddh" +0x0dab: "nn" +0x0dac: "nndd" +0x0dad: "t" +0x0dae: "th" +0x0daf: "d" +0x0db0: "dh" +0x0db1: "n" +0x0db2: "[?]" +0x0db3: "nd" +0x0db4: "p" +0x0db5: "ph" +0x0db6: "b" +0x0db7: "bh" +0x0db8: "m" +0x0db9: "mb" +0x0dba: "y" +0x0dbb: "r" +0x0dbc: "[?]" +0x0dbd: "l" +0x0dbe: "[?]" +0x0dbf: "[?]" +0x0dc0: "v" +0x0dc1: "sh" +0x0dc2: "ss" +0x0dc3: "s" +0x0dc4: "h" +0x0dc5: "ll" +0x0dc6: "f" +0x0dc7: "[?]" +0x0dc8: "[?]" +0x0dc9: "[?]" +0x0dca: "" +0x0dcb: "[?]" +0x0dcc: "[?]" +0x0dcd: "[?]" +0x0dce: "[?]" +0x0dcf: "aa" +0x0dd0: "ae" +0x0dd1: "aae" +0x0dd2: "i" +0x0dd3: "ii" +0x0dd4: "u" +0x0dd5: "[?]" +0x0dd6: "uu" +0x0dd7: "[?]" +0x0dd8: "R" +0x0dd9: "e" +0x0dda: "ee" +0x0ddb: "ai" +0x0ddc: "o" +0x0ddd: "oo" +0x0dde: "au" +0x0ddf: "L" +0x0de0: "[?]" +0x0de1: "[?]" +0x0de2: "[?]" +0x0de3: "[?]" +0x0de4: "[?]" +0x0de5: "[?]" +0x0de6: "[?]" +0x0de7: "[?]" +0x0de8: "[?]" +0x0de9: "[?]" +0x0dea: "[?]" +0x0deb: "[?]" +0x0dec: "[?]" +0x0ded: "[?]" +0x0dee: "[?]" +0x0def: "[?]" +0x0df0: "[?]" +0x0df1: "[?]" +0x0df2: "RR" +0x0df3: "LL" +0x0df4: " . " +0x0df5: "[?]" +0x0df6: "[?]" +0x0df7: "[?]" +0x0df8: "[?]" +0x0df9: "[?]" +0x0dfa: "[?]" +0x0dfb: "[?]" +0x0dfc: "[?]" +0x0dfd: "[?]" +0x0dfe: "[?]" +/* x00e */ +0x0e00: "[?]" +0x0e01: "k" +0x0e02: "kh" +0x0e03: "kh" +0x0e04: "kh" +0x0e05: "kh" +0x0e06: "kh" +0x0e07: "ng" +0x0e08: "cch" +0x0e09: "ch" +0x0e0a: "ch" +0x0e0b: "ch" +0x0e0c: "ch" +0x0e0d: "y" +0x0e0e: "d" +0x0e0f: "t" +0x0e10: "th" +0x0e11: "th" +0x0e12: "th" +0x0e13: "n" +0x0e14: "d" +0x0e15: "t" +0x0e16: "th" +0x0e17: "th" +0x0e18: "th" +0x0e19: "n" +0x0e1a: "b" +0x0e1b: "p" +0x0e1c: "ph" +0x0e1d: "f" +0x0e1e: "ph" +0x0e1f: "f" +0x0e20: "ph" +0x0e21: "m" +0x0e22: "y" +0x0e23: "r" +0x0e24: "R" +0x0e25: "l" +0x0e26: "L" +0x0e27: "w" +0x0e28: "s" +0x0e29: "s" +0x0e2a: "s" +0x0e2b: "h" +0x0e2c: "l" +0x0e2d: "`" +0x0e2e: "h" +0x0e2f: "~" +0x0e30: "a" +0x0e31: "a" +0x0e32: "aa" +0x0e33: "am" +0x0e34: "i" +0x0e35: "ii" +0x0e36: "ue" +0x0e37: "uue" +0x0e38: "u" +0x0e39: "uu" +0x0e3a: "'" +0x0e3b: "[?]" +0x0e3c: "[?]" +0x0e3d: "[?]" +0x0e3e: "[?]" +0x0e3f: "Bh." +0x0e40: "e" +0x0e41: "ae" +0x0e42: "o" +0x0e43: "ai" +0x0e44: "ai" +0x0e45: "ao" +0x0e46: "+" +0x0e47: "" +0x0e48: "" +0x0e49: "" +0x0e4a: "" +0x0e4b: "" +0x0e4c: "" +0x0e4d: "M" +0x0e4e: "" +0x0e4f: " * " +0x0e50: "0" +0x0e51: "1" +0x0e52: "2" +0x0e53: "3" +0x0e54: "4" +0x0e55: "5" +0x0e56: "6" +0x0e57: "7" +0x0e58: "8" +0x0e59: "9" +0x0e5a: " // " +0x0e5b: " /// " +0x0e5c: "[?]" +0x0e5d: "[?]" +0x0e5e: "[?]" +0x0e5f: "[?]" +0x0e60: "[?]" +0x0e61: "[?]" +0x0e62: "[?]" +0x0e63: "[?]" +0x0e64: "[?]" +0x0e65: "[?]" +0x0e66: "[?]" +0x0e67: "[?]" +0x0e68: "[?]" +0x0e69: "[?]" +0x0e6a: "[?]" +0x0e6b: "[?]" +0x0e6c: "[?]" +0x0e6d: "[?]" +0x0e6e: "[?]" +0x0e6f: "[?]" +0x0e70: "[?]" +0x0e71: "[?]" +0x0e72: "[?]" +0x0e73: "[?]" +0x0e74: "[?]" +0x0e75: "[?]" +0x0e76: "[?]" +0x0e77: "[?]" +0x0e78: "[?]" +0x0e79: "[?]" +0x0e7a: "[?]" +0x0e7b: "[?]" +0x0e7c: "[?]" +0x0e7d: "[?]" +0x0e7e: "[?]" +0x0e7f: "[?]" +0x0e80: "[?]" +0x0e81: "k" +0x0e82: "kh" +0x0e83: "[?]" +0x0e84: "kh" +0x0e85: "[?]" +0x0e86: "[?]" +0x0e87: "ng" +0x0e88: "ch" +0x0e89: "[?]" +0x0e8a: "s" +0x0e8b: "[?]" +0x0e8c: "[?]" +0x0e8d: "ny" +0x0e8e: "[?]" +0x0e8f: "[?]" +0x0e90: "[?]" +0x0e91: "[?]" +0x0e92: "[?]" +0x0e93: "[?]" +0x0e94: "d" +0x0e95: "h" +0x0e96: "th" +0x0e97: "th" +0x0e98: "[?]" +0x0e99: "n" +0x0e9a: "b" +0x0e9b: "p" +0x0e9c: "ph" +0x0e9d: "f" +0x0e9e: "ph" +0x0e9f: "f" +0x0ea0: "[?]" +0x0ea1: "m" +0x0ea2: "y" +0x0ea3: "r" +0x0ea4: "[?]" +0x0ea5: "l" +0x0ea6: "[?]" +0x0ea7: "w" +0x0ea8: "[?]" +0x0ea9: "[?]" +0x0eaa: "s" +0x0eab: "h" +0x0eac: "[?]" +0x0ead: "`" +0x0eae: "" +0x0eaf: "~" +0x0eb0: "a" +0x0eb1: "" +0x0eb2: "aa" +0x0eb3: "am" +0x0eb4: "i" +0x0eb5: "ii" +0x0eb6: "y" +0x0eb7: "yy" +0x0eb8: "u" +0x0eb9: "uu" +0x0eba: "[?]" +0x0ebb: "o" +0x0ebc: "l" +0x0ebd: "ny" +0x0ebe: "[?]" +0x0ebf: "[?]" +0x0ec0: "e" +0x0ec1: "ei" +0x0ec2: "o" +0x0ec3: "ay" +0x0ec4: "ai" +0x0ec5: "[?]" +0x0ec6: "+" +0x0ec7: "[?]" +0x0ec8: "" +0x0ec9: "" +0x0eca: "" +0x0ecb: "" +0x0ecc: "" +0x0ecd: "M" +0x0ece: "[?]" +0x0ecf: "[?]" +0x0ed0: "0" +0x0ed1: "1" +0x0ed2: "2" +0x0ed3: "3" +0x0ed4: "4" +0x0ed5: "5" +0x0ed6: "6" +0x0ed7: "7" +0x0ed8: "8" +0x0ed9: "9" +0x0eda: "[?]" +0x0edb: "[?]" +0x0edc: "hn" +0x0edd: "hm" +0x0ede: "[?]" +0x0edf: "[?]" +0x0ee0: "[?]" +0x0ee1: "[?]" +0x0ee2: "[?]" +0x0ee3: "[?]" +0x0ee4: "[?]" +0x0ee5: "[?]" +0x0ee6: "[?]" +0x0ee7: "[?]" +0x0ee8: "[?]" +0x0ee9: "[?]" +0x0eea: "[?]" +0x0eeb: "[?]" +0x0eec: "[?]" +0x0eed: "[?]" +0x0eee: "[?]" +0x0eef: "[?]" +0x0ef0: "[?]" +0x0ef1: "[?]" +0x0ef2: "[?]" +0x0ef3: "[?]" +0x0ef4: "[?]" +0x0ef5: "[?]" +0x0ef6: "[?]" +0x0ef7: "[?]" +0x0ef8: "[?]" +0x0ef9: "[?]" +0x0efa: "[?]" +0x0efb: "[?]" +0x0efc: "[?]" +0x0efd: "[?]" +0x0efe: "[?]" +/* x00f */ +0x0f00: "AUM" +0x0f01: "" +0x0f02: "" +0x0f03: "" +0x0f04: "" +0x0f05: "" +0x0f06: "" +0x0f07: "" +0x0f08: " // " +0x0f09: " * " +0x0f0a: "" +0x0f0b: "-" +0x0f0c: " / " +0x0f0d: " / " +0x0f0e: " // " +0x0f0f: " -/ " +0x0f10: " +/ " +0x0f11: " X/ " +0x0f12: " /XX/ " +0x0f13: " /X/ " +0x0f14: ", " +0x0f15: "" +0x0f16: "" +0x0f17: "" +0x0f18: "" +0x0f19: "" +0x0f1a: "" +0x0f1b: "" +0x0f1c: "" +0x0f1d: "" +0x0f1e: "" +0x0f1f: "" +0x0f20: "0" +0x0f21: "1" +0x0f22: "2" +0x0f23: "3" +0x0f24: "4" +0x0f25: "5" +0x0f26: "6" +0x0f27: "7" +0x0f28: "8" +0x0f29: "9" +0x0f2a: ".5" +0x0f2b: "1.5" +0x0f2c: "2.5" +0x0f2d: "3.5" +0x0f2e: "4.5" +0x0f2f: "5.5" +0x0f30: "6.5" +0x0f31: "7.5" +0x0f32: "8.5" +0x0f33: "-.5" +0x0f34: "+" +0x0f35: "*" +0x0f36: "^" +0x0f37: "_" +0x0f38: "" +0x0f39: "~" +0x0f3a: "[?]" +0x0f3b: "]" +0x0f3c: "[[" +0x0f3d: "]]" +0x0f3e: "" +0x0f3f: "" +0x0f40: "k" +0x0f41: "kh" +0x0f42: "g" +0x0f43: "gh" +0x0f44: "ng" +0x0f45: "c" +0x0f46: "ch" +0x0f47: "j" +0x0f48: "[?]" +0x0f49: "ny" +0x0f4a: "tt" +0x0f4b: "tth" +0x0f4c: "dd" +0x0f4d: "ddh" +0x0f4e: "nn" +0x0f4f: "t" +0x0f50: "th" +0x0f51: "d" +0x0f52: "dh" +0x0f53: "n" +0x0f54: "p" +0x0f55: "ph" +0x0f56: "b" +0x0f57: "bh" +0x0f58: "m" +0x0f59: "ts" +0x0f5a: "tsh" +0x0f5b: "dz" +0x0f5c: "dzh" +0x0f5d: "w" +0x0f5e: "zh" +0x0f5f: "z" +0x0f60: "'" +0x0f61: "y" +0x0f62: "r" +0x0f63: "l" +0x0f64: "sh" +0x0f65: "ssh" +0x0f66: "s" +0x0f67: "h" +0x0f68: "a" +0x0f69: "kss" +0x0f6a: "r" +0x0f6b: "[?]" +0x0f6c: "[?]" +0x0f6d: "[?]" +0x0f6e: "[?]" +0x0f6f: "[?]" +0x0f70: "[?]" +0x0f71: "aa" +0x0f72: "i" +0x0f73: "ii" +0x0f74: "u" +0x0f75: "uu" +0x0f76: "R" +0x0f77: "RR" +0x0f78: "L" +0x0f79: "LL" +0x0f7a: "e" +0x0f7b: "ee" +0x0f7c: "o" +0x0f7d: "oo" +0x0f7e: "M" +0x0f7f: "H" +0x0f80: "i" +0x0f81: "ii" +0x0f82: "" +0x0f83: "" +0x0f84: "" +0x0f85: "" +0x0f86: "" +0x0f87: "" +0x0f88: "" +0x0f89: "" +0x0f8a: "" +0x0f8b: "" +0x0f8c: "[?]" +0x0f8d: "[?]" +0x0f8e: "[?]" +0x0f8f: "[?]" +0x0f90: "k" +0x0f91: "kh" +0x0f92: "g" +0x0f93: "gh" +0x0f94: "ng" +0x0f95: "c" +0x0f96: "ch" +0x0f97: "j" +0x0f98: "[?]" +0x0f99: "ny" +0x0f9a: "tt" +0x0f9b: "tth" +0x0f9c: "dd" +0x0f9d: "ddh" +0x0f9e: "nn" +0x0f9f: "t" +0x0fa0: "th" +0x0fa1: "d" +0x0fa2: "dh" +0x0fa3: "n" +0x0fa4: "p" +0x0fa5: "ph" +0x0fa6: "b" +0x0fa7: "bh" +0x0fa8: "m" +0x0fa9: "ts" +0x0faa: "tsh" +0x0fab: "dz" +0x0fac: "dzh" +0x0fad: "w" +0x0fae: "zh" +0x0faf: "z" +0x0fb0: "'" +0x0fb1: "y" +0x0fb2: "r" +0x0fb3: "l" +0x0fb4: "sh" +0x0fb5: "ss" +0x0fb6: "s" +0x0fb7: "h" +0x0fb8: "a" +0x0fb9: "kss" +0x0fba: "w" +0x0fbb: "y" +0x0fbc: "r" +0x0fbd: "[?]" +0x0fbe: "X" +0x0fbf: " :X: " +0x0fc0: " /O/ " +0x0fc1: " /o/ " +0x0fc2: " \\o\\ " +0x0fc3: " (O) " +0x0fc4: "" +0x0fc5: "" +0x0fc6: "" +0x0fc7: "" +0x0fc8: "" +0x0fc9: "" +0x0fca: "" +0x0fcb: "" +0x0fcc: "" +0x0fcd: "[?]" +0x0fce: "[?]" +0x0fcf: "" +0x0fd0: "[?]" +0x0fd1: "[?]" +0x0fd2: "[?]" +0x0fd3: "[?]" +0x0fd4: "[?]" +0x0fd5: "[?]" +0x0fd6: "[?]" +0x0fd7: "[?]" +0x0fd8: "[?]" +0x0fd9: "[?]" +0x0fda: "[?]" +0x0fdb: "[?]" +0x0fdc: "[?]" +0x0fdd: "[?]" +0x0fde: "[?]" +0x0fdf: "[?]" +0x0fe0: "[?]" +0x0fe1: "[?]" +0x0fe2: "[?]" +0x0fe3: "[?]" +0x0fe4: "[?]" +0x0fe5: "[?]" +0x0fe6: "[?]" +0x0fe7: "[?]" +0x0fe8: "[?]" +0x0fe9: "[?]" +0x0fea: "[?]" +0x0feb: "[?]" +0x0fec: "[?]" +0x0fed: "[?]" +0x0fee: "[?]" +0x0fef: "[?]" +0x0ff0: "[?]" +0x0ff1: "[?]" +0x0ff2: "[?]" +0x0ff3: "[?]" +0x0ff4: "[?]" +0x0ff5: "[?]" +0x0ff6: "[?]" +0x0ff7: "[?]" +0x0ff8: "[?]" +0x0ff9: "[?]" +0x0ffa: "[?]" +0x0ffb: "[?]" +0x0ffc: "[?]" +0x0ffd: "[?]" +0x0ffe: "[?]" +/* x010 */ +0x1000: "k" +0x1001: "kh" +0x1002: "g" +0x1003: "gh" +0x1004: "ng" +0x1005: "c" +0x1006: "ch" +0x1007: "j" +0x1008: "jh" +0x1009: "ny" +0x100a: "nny" +0x100b: "tt" +0x100c: "tth" +0x100d: "dd" +0x100e: "ddh" +0x100f: "nn" +0x1010: "tt" +0x1011: "th" +0x1012: "d" +0x1013: "dh" +0x1014: "n" +0x1015: "p" +0x1016: "ph" +0x1017: "b" +0x1018: "bh" +0x1019: "m" +0x101a: "y" +0x101b: "r" +0x101c: "l" +0x101d: "w" +0x101e: "s" +0x101f: "h" +0x1020: "ll" +0x1021: "a" +0x1022: "[?]" +0x1023: "i" +0x1024: "ii" +0x1025: "u" +0x1026: "uu" +0x1027: "e" +0x1028: "[?]" +0x1029: "o" +0x102a: "au" +0x102b: "[?]" +0x102c: "aa" +0x102d: "i" +0x102e: "ii" +0x102f: "u" +0x1030: "uu" +0x1031: "e" +0x1032: "ai" +0x1033: "[?]" +0x1034: "[?]" +0x1035: "[?]" +0x1036: "N" +0x1037: "'" +0x1038: ":" +0x1039: "" +0x103a: "[?]" +0x103b: "[?]" +0x103c: "[?]" +0x103d: "[?]" +0x103e: "[?]" +0x103f: "[?]" +0x1040: "0" +0x1041: "1" +0x1042: "2" +0x1043: "3" +0x1044: "4" +0x1045: "5" +0x1046: "6" +0x1047: "7" +0x1048: "8" +0x1049: "9" +0x104a: " / " +0x104b: " // " +0x104c: "n*" +0x104d: "r*" +0x104e: "l*" +0x104f: "e*" +0x1050: "sh" +0x1051: "ss" +0x1052: "R" +0x1053: "RR" +0x1054: "L" +0x1055: "LL" +0x1056: "R" +0x1057: "RR" +0x1058: "L" +0x1059: "LL" +0x105a: "[?]" +0x105b: "[?]" +0x105c: "[?]" +0x105d: "[?]" +0x105e: "[?]" +0x105f: "[?]" +0x1060: "[?]" +0x1061: "[?]" +0x1062: "[?]" +0x1063: "[?]" +0x1064: "[?]" +0x1065: "[?]" +0x1066: "[?]" +0x1067: "[?]" +0x1068: "[?]" +0x1069: "[?]" +0x106a: "[?]" +0x106b: "[?]" +0x106c: "[?]" +0x106d: "[?]" +0x106e: "[?]" +0x106f: "[?]" +0x1070: "[?]" +0x1071: "[?]" +0x1072: "[?]" +0x1073: "[?]" +0x1074: "[?]" +0x1075: "[?]" +0x1076: "[?]" +0x1077: "[?]" +0x1078: "[?]" +0x1079: "[?]" +0x107a: "[?]" +0x107b: "[?]" +0x107c: "[?]" +0x107d: "[?]" +0x107e: "[?]" +0x107f: "[?]" +0x1080: "[?]" +0x1081: "[?]" +0x1082: "[?]" +0x1083: "[?]" +0x1084: "[?]" +0x1085: "[?]" +0x1086: "[?]" +0x1087: "[?]" +0x1088: "[?]" +0x1089: "[?]" +0x108a: "[?]" +0x108b: "[?]" +0x108c: "[?]" +0x108d: "[?]" +0x108e: "[?]" +0x108f: "[?]" +0x1090: "[?]" +0x1091: "[?]" +0x1092: "[?]" +0x1093: "[?]" +0x1094: "[?]" +0x1095: "[?]" +0x1096: "[?]" +0x1097: "[?]" +0x1098: "[?]" +0x1099: "[?]" +0x109a: "[?]" +0x109b: "[?]" +0x109c: "[?]" +0x109d: "[?]" +0x109e: "[?]" +0x109f: "[?]" +0x10a0: "A" +0x10a1: "B" +0x10a2: "G" +0x10a3: "D" +0x10a4: "E" +0x10a5: "V" +0x10a6: "Z" +0x10a7: "T`" +0x10a8: "I" +0x10a9: "K" +0x10aa: "L" +0x10ab: "M" +0x10ac: "N" +0x10ad: "O" +0x10ae: "P" +0x10af: "Zh" +0x10b0: "R" +0x10b1: "S" +0x10b2: "T" +0x10b3: "U" +0x10b4: "P`" +0x10b5: "K`" +0x10b6: "G'" +0x10b7: "Q" +0x10b8: "Sh" +0x10b9: "Ch`" +0x10ba: "C`" +0x10bb: "Z'" +0x10bc: "C" +0x10bd: "Ch" +0x10be: "X" +0x10bf: "J" +0x10c0: "H" +0x10c1: "E" +0x10c2: "Y" +0x10c3: "W" +0x10c4: "Xh" +0x10c5: "OE" +0x10c6: "[?]" +0x10c7: "[?]" +0x10c8: "[?]" +0x10c9: "[?]" +0x10ca: "[?]" +0x10cb: "[?]" +0x10cc: "[?]" +0x10cd: "[?]" +0x10ce: "[?]" +0x10cf: "[?]" +0x10d0: "a" +0x10d1: "b" +0x10d2: "g" +0x10d3: "d" +0x10d4: "e" +0x10d5: "v" +0x10d6: "z" +0x10d7: "t`" +0x10d8: "i" +0x10d9: "k" +0x10da: "l" +0x10db: "m" +0x10dc: "n" +0x10dd: "o" +0x10de: "p" +0x10df: "zh" +0x10e0: "r" +0x10e1: "s" +0x10e2: "t" +0x10e3: "u" +0x10e4: "p`" +0x10e5: "k`" +0x10e6: "g'" +0x10e7: "q" +0x10e8: "sh" +0x10e9: "ch`" +0x10ea: "c`" +0x10eb: "z'" +0x10ec: "c" +0x10ed: "ch" +0x10ee: "x" +0x10ef: "j" +0x10f0: "h" +0x10f1: "e" +0x10f2: "y" +0x10f3: "w" +0x10f4: "xh" +0x10f5: "oe" +0x10f6: "f" +0x10f7: "[?]" +0x10f8: "[?]" +0x10f9: "[?]" +0x10fa: "[?]" +0x10fb: " // " +0x10fc: "[?]" +0x10fd: "[?]" +0x10fe: "[?]" +/* x011 */ +0x1100: "g" +0x1101: "gg" +0x1102: "n" +0x1103: "d" +0x1104: "dd" +0x1105: "r" +0x1106: "m" +0x1107: "b" +0x1108: "bb" +0x1109: "s" +0x110a: "ss" +0x110b: "" +0x110c: "j" +0x110d: "jj" +0x110e: "c" +0x110f: "k" +0x1110: "t" +0x1111: "p" +0x1112: "h" +0x1113: "ng" +0x1114: "nn" +0x1115: "nd" +0x1116: "nb" +0x1117: "dg" +0x1118: "rn" +0x1119: "rr" +0x111a: "rh" +0x111b: "rN" +0x111c: "mb" +0x111d: "mN" +0x111e: "bg" +0x111f: "bn" +0x1120: "" +0x1121: "bs" +0x1122: "bsg" +0x1123: "bst" +0x1124: "bsb" +0x1125: "bss" +0x1126: "bsj" +0x1127: "bj" +0x1128: "bc" +0x1129: "bt" +0x112a: "bp" +0x112b: "bN" +0x112c: "bbN" +0x112d: "sg" +0x112e: "sn" +0x112f: "sd" +0x1130: "sr" +0x1131: "sm" +0x1132: "sb" +0x1133: "sbg" +0x1134: "sss" +0x1135: "s" +0x1136: "sj" +0x1137: "sc" +0x1138: "sk" +0x1139: "st" +0x113a: "sp" +0x113b: "sh" +0x113c: "" +0x113d: "" +0x113e: "" +0x113f: "" +0x1140: "Z" +0x1141: "g" +0x1142: "d" +0x1143: "m" +0x1144: "b" +0x1145: "s" +0x1146: "Z" +0x1147: "" +0x1148: "j" +0x1149: "c" +0x114a: "t" +0x114b: "p" +0x114c: "N" +0x114d: "j" +0x114e: "" +0x114f: "" +0x1150: "" +0x1151: "" +0x1152: "ck" +0x1153: "ch" +0x1154: "" +0x1155: "" +0x1156: "pb" +0x1157: "pN" +0x1158: "hh" +0x1159: "Q" +0x115a: "[?]" +0x115b: "[?]" +0x115c: "[?]" +0x115d: "[?]" +0x115e: "[?]" +0x115f: "" +0x1160: "" +0x1161: "a" +0x1162: "ae" +0x1163: "ya" +0x1164: "yae" +0x1165: "eo" +0x1166: "e" +0x1167: "yeo" +0x1168: "ye" +0x1169: "o" +0x116a: "wa" +0x116b: "wae" +0x116c: "oe" +0x116d: "yo" +0x116e: "u" +0x116f: "weo" +0x1170: "we" +0x1171: "wi" +0x1172: "yu" +0x1173: "eu" +0x1174: "yi" +0x1175: "i" +0x1176: "a-o" +0x1177: "a-u" +0x1178: "ya-o" +0x1179: "ya-yo" +0x117a: "eo-o" +0x117b: "eo-u" +0x117c: "eo-eu" +0x117d: "yeo-o" +0x117e: "yeo-u" +0x117f: "o-eo" +0x1180: "o-e" +0x1181: "o-ye" +0x1182: "o-o" +0x1183: "o-u" +0x1184: "yo-ya" +0x1185: "yo-yae" +0x1186: "yo-yeo" +0x1187: "yo-o" +0x1188: "yo-i" +0x1189: "u-a" +0x118a: "u-ae" +0x118b: "u-eo-eu" +0x118c: "u-ye" +0x118d: "u-u" +0x118e: "yu-a" +0x118f: "yu-eo" +0x1190: "yu-e" +0x1191: "yu-yeo" +0x1192: "yu-ye" +0x1193: "yu-u" +0x1194: "yu-i" +0x1195: "eu-u" +0x1196: "eu-eu" +0x1197: "yi-u" +0x1198: "i-a" +0x1199: "i-ya" +0x119a: "i-o" +0x119b: "i-u" +0x119c: "i-eu" +0x119d: "i-U" +0x119e: "U" +0x119f: "U-eo" +0x11a0: "U-u" +0x11a1: "U-i" +0x11a2: "UU" +0x11a3: "[?]" +0x11a4: "[?]" +0x11a5: "[?]" +0x11a6: "[?]" +0x11a7: "[?]" +0x11a8: "g" +0x11a9: "gg" +0x11aa: "gs" +0x11ab: "n" +0x11ac: "nj" +0x11ad: "nh" +0x11ae: "d" +0x11af: "l" +0x11b0: "lg" +0x11b1: "lm" +0x11b2: "lb" +0x11b3: "ls" +0x11b4: "lt" +0x11b5: "lp" +0x11b6: "lh" +0x11b7: "m" +0x11b8: "b" +0x11b9: "bs" +0x11ba: "s" +0x11bb: "ss" +0x11bc: "ng" +0x11bd: "j" +0x11be: "c" +0x11bf: "k" +0x11c0: "t" +0x11c1: "p" +0x11c2: "h" +0x11c3: "gl" +0x11c4: "gsg" +0x11c5: "ng" +0x11c6: "nd" +0x11c7: "ns" +0x11c8: "nZ" +0x11c9: "nt" +0x11ca: "dg" +0x11cb: "tl" +0x11cc: "lgs" +0x11cd: "ln" +0x11ce: "ld" +0x11cf: "lth" +0x11d0: "ll" +0x11d1: "lmg" +0x11d2: "lms" +0x11d3: "lbs" +0x11d4: "lbh" +0x11d5: "rNp" +0x11d6: "lss" +0x11d7: "lZ" +0x11d8: "lk" +0x11d9: "lQ" +0x11da: "mg" +0x11db: "ml" +0x11dc: "mb" +0x11dd: "ms" +0x11de: "mss" +0x11df: "mZ" +0x11e0: "mc" +0x11e1: "mh" +0x11e2: "mN" +0x11e3: "bl" +0x11e4: "bp" +0x11e5: "ph" +0x11e6: "pN" +0x11e7: "sg" +0x11e8: "sd" +0x11e9: "sl" +0x11ea: "sb" +0x11eb: "Z" +0x11ec: "g" +0x11ed: "ss" +0x11ee: "" +0x11ef: "kh" +0x11f0: "N" +0x11f1: "Ns" +0x11f2: "NZ" +0x11f3: "pb" +0x11f4: "pN" +0x11f5: "hn" +0x11f6: "hl" +0x11f7: "hm" +0x11f8: "hb" +0x11f9: "Q" +0x11fa: "[?]" +0x11fb: "[?]" +0x11fc: "[?]" +0x11fd: "[?]" +0x11fe: "[?]" +/* x012 */ +0x1200: "ha" +0x1201: "hu" +0x1202: "hi" +0x1203: "haa" +0x1204: "hee" +0x1205: "he" +0x1206: "ho" +0x1207: "[?]" +0x1208: "la" +0x1209: "lu" +0x120a: "li" +0x120b: "laa" +0x120c: "lee" +0x120d: "le" +0x120e: "lo" +0x120f: "lwa" +0x1210: "hha" +0x1211: "hhu" +0x1212: "hhi" +0x1213: "hhaa" +0x1214: "hhee" +0x1215: "hhe" +0x1216: "hho" +0x1217: "hhwa" +0x1218: "ma" +0x1219: "mu" +0x121a: "mi" +0x121b: "maa" +0x121c: "mee" +0x121d: "me" +0x121e: "mo" +0x121f: "mwa" +0x1220: "sza" +0x1221: "szu" +0x1222: "szi" +0x1223: "szaa" +0x1224: "szee" +0x1225: "sze" +0x1226: "szo" +0x1227: "szwa" +0x1228: "ra" +0x1229: "ru" +0x122a: "ri" +0x122b: "raa" +0x122c: "ree" +0x122d: "re" +0x122e: "ro" +0x122f: "rwa" +0x1230: "sa" +0x1231: "su" +0x1232: "si" +0x1233: "saa" +0x1234: "see" +0x1235: "se" +0x1236: "so" +0x1237: "swa" +0x1238: "sha" +0x1239: "shu" +0x123a: "shi" +0x123b: "shaa" +0x123c: "shee" +0x123d: "she" +0x123e: "sho" +0x123f: "shwa" +0x1240: "qa" +0x1241: "qu" +0x1242: "qi" +0x1243: "qaa" +0x1244: "qee" +0x1245: "qe" +0x1246: "qo" +0x1247: "[?]" +0x1248: "qwa" +0x1249: "[?]" +0x124a: "qwi" +0x124b: "qwaa" +0x124c: "qwee" +0x124d: "qwe" +0x124e: "[?]" +0x124f: "[?]" +0x1250: "qha" +0x1251: "qhu" +0x1252: "qhi" +0x1253: "qhaa" +0x1254: "qhee" +0x1255: "qhe" +0x1256: "qho" +0x1257: "[?]" +0x1258: "qhwa" +0x1259: "[?]" +0x125a: "qhwi" +0x125b: "qhwaa" +0x125c: "qhwee" +0x125d: "qhwe" +0x125e: "[?]" +0x125f: "[?]" +0x1260: "ba" +0x1261: "bu" +0x1262: "bi" +0x1263: "baa" +0x1264: "bee" +0x1265: "be" +0x1266: "bo" +0x1267: "bwa" +0x1268: "va" +0x1269: "vu" +0x126a: "vi" +0x126b: "vaa" +0x126c: "vee" +0x126d: "ve" +0x126e: "vo" +0x126f: "vwa" +0x1270: "ta" +0x1271: "tu" +0x1272: "ti" +0x1273: "taa" +0x1274: "tee" +0x1275: "te" +0x1276: "to" +0x1277: "twa" +0x1278: "ca" +0x1279: "cu" +0x127a: "ci" +0x127b: "caa" +0x127c: "cee" +0x127d: "ce" +0x127e: "co" +0x127f: "cwa" +0x1280: "xa" +0x1281: "xu" +0x1282: "xi" +0x1283: "xaa" +0x1284: "xee" +0x1285: "xe" +0x1286: "xo" +0x1287: "[?]" +0x1288: "xwa" +0x1289: "[?]" +0x128a: "xwi" +0x128b: "xwaa" +0x128c: "xwee" +0x128d: "xwe" +0x128e: "[?]" +0x128f: "[?]" +0x1290: "na" +0x1291: "nu" +0x1292: "ni" +0x1293: "naa" +0x1294: "nee" +0x1295: "ne" +0x1296: "no" +0x1297: "nwa" +0x1298: "nya" +0x1299: "nyu" +0x129a: "nyi" +0x129b: "nyaa" +0x129c: "nyee" +0x129d: "nye" +0x129e: "nyo" +0x129f: "nywa" +0x12a0: "'a" +0x12a1: "'u" +0x12a2: "[?]" +0x12a3: "'aa" +0x12a4: "'ee" +0x12a5: "'e" +0x12a6: "'o" +0x12a7: "'wa" +0x12a8: "ka" +0x12a9: "ku" +0x12aa: "ki" +0x12ab: "kaa" +0x12ac: "kee" +0x12ad: "ke" +0x12ae: "ko" +0x12af: "[?]" +0x12b0: "kwa" +0x12b1: "[?]" +0x12b2: "kwi" +0x12b3: "kwaa" +0x12b4: "kwee" +0x12b5: "kwe" +0x12b6: "[?]" +0x12b7: "[?]" +0x12b8: "kxa" +0x12b9: "kxu" +0x12ba: "kxi" +0x12bb: "kxaa" +0x12bc: "kxee" +0x12bd: "kxe" +0x12be: "kxo" +0x12bf: "[?]" +0x12c0: "kxwa" +0x12c1: "[?]" +0x12c2: "kxwi" +0x12c3: "kxwaa" +0x12c4: "kxwee" +0x12c5: "kxwe" +0x12c6: "[?]" +0x12c7: "[?]" +0x12c8: "wa" +0x12c9: "wu" +0x12ca: "wi" +0x12cb: "waa" +0x12cc: "wee" +0x12cd: "we" +0x12ce: "wo" +0x12cf: "[?]" +0x12d0: "`a" +0x12d1: "`u" +0x12d2: "`i" +0x12d3: "`aa" +0x12d4: "`ee" +0x12d5: "`e" +0x12d6: "`o" +0x12d7: "[?]" +0x12d8: "za" +0x12d9: "zu" +0x12da: "zi" +0x12db: "zaa" +0x12dc: "zee" +0x12dd: "ze" +0x12de: "zo" +0x12df: "zwa" +0x12e0: "zha" +0x12e1: "zhu" +0x12e2: "zhi" +0x12e3: "zhaa" +0x12e4: "zhee" +0x12e5: "zhe" +0x12e6: "zho" +0x12e7: "zhwa" +0x12e8: "ya" +0x12e9: "yu" +0x12ea: "yi" +0x12eb: "yaa" +0x12ec: "yee" +0x12ed: "ye" +0x12ee: "yo" +0x12ef: "[?]" +0x12f0: "da" +0x12f1: "du" +0x12f2: "di" +0x12f3: "daa" +0x12f4: "dee" +0x12f5: "de" +0x12f6: "do" +0x12f7: "dwa" +0x12f8: "dda" +0x12f9: "ddu" +0x12fa: "ddi" +0x12fb: "ddaa" +0x12fc: "ddee" +0x12fd: "dde" +0x12fe: "ddo" +0x12ff: "ddwa" +/* x013 */ +0x1300: "ja" +0x1301: "ju" +0x1302: "ji" +0x1303: "jaa" +0x1304: "jee" +0x1305: "je" +0x1306: "jo" +0x1307: "jwa" +0x1308: "ga" +0x1309: "gu" +0x130a: "gi" +0x130b: "gaa" +0x130c: "gee" +0x130d: "ge" +0x130e: "go" +0x130f: "[?]" +0x1310: "gwa" +0x1311: "[?]" +0x1312: "gwi" +0x1313: "gwaa" +0x1314: "gwee" +0x1315: "gwe" +0x1316: "[?]" +0x1317: "[?]" +0x1318: "gga" +0x1319: "ggu" +0x131a: "ggi" +0x131b: "ggaa" +0x131c: "ggee" +0x131d: "gge" +0x131e: "ggo" +0x131f: "[?]" +0x1320: "tha" +0x1321: "thu" +0x1322: "thi" +0x1323: "thaa" +0x1324: "thee" +0x1325: "the" +0x1326: "tho" +0x1327: "thwa" +0x1328: "cha" +0x1329: "chu" +0x132a: "chi" +0x132b: "chaa" +0x132c: "chee" +0x132d: "che" +0x132e: "cho" +0x132f: "chwa" +0x1330: "pha" +0x1331: "phu" +0x1332: "phi" +0x1333: "phaa" +0x1334: "phee" +0x1335: "phe" +0x1336: "pho" +0x1337: "phwa" +0x1338: "tsa" +0x1339: "tsu" +0x133a: "tsi" +0x133b: "tsaa" +0x133c: "tsee" +0x133d: "tse" +0x133e: "tso" +0x133f: "tswa" +0x1340: "tza" +0x1341: "tzu" +0x1342: "tzi" +0x1343: "tzaa" +0x1344: "tzee" +0x1345: "tze" +0x1346: "tzo" +0x1347: "[?]" +0x1348: "fa" +0x1349: "fu" +0x134a: "fi" +0x134b: "faa" +0x134c: "fee" +0x134d: "fe" +0x134e: "fo" +0x134f: "fwa" +0x1350: "pa" +0x1351: "pu" +0x1352: "pi" +0x1353: "paa" +0x1354: "pee" +0x1355: "pe" +0x1356: "po" +0x1357: "pwa" +0x1358: "rya" +0x1359: "mya" +0x135a: "fya" +0x135b: "[?]" +0x135c: "[?]" +0x135d: "[?]" +0x135e: "[?]" +0x135f: "[?]" +0x1360: "[?]" +0x1361: " " +0x1362: "." +0x1363: "," +0x1364: ";" +0x1365: ":" +0x1366: ":: " +0x1367: "?" +0x1368: "//" +0x1369: "1" +0x136a: "2" +0x136b: "3" +0x136c: "4" +0x136d: "5" +0x136e: "6" +0x136f: "7" +0x1370: "8" +0x1371: "9" +0x1372: "10+" +0x1373: "20+" +0x1374: "30+" +0x1375: "40+" +0x1376: "50+" +0x1377: "60+" +0x1378: "70+" +0x1379: "80+" +0x137a: "90+" +0x137b: "100+" +0x137c: "10,000+" +0x137d: "[?]" +0x137e: "[?]" +0x137f: "[?]" +0x1380: "[?]" +0x1381: "[?]" +0x1382: "[?]" +0x1383: "[?]" +0x1384: "[?]" +0x1385: "[?]" +0x1386: "[?]" +0x1387: "[?]" +0x1388: "[?]" +0x1389: "[?]" +0x138a: "[?]" +0x138b: "[?]" +0x138c: "[?]" +0x138d: "[?]" +0x138e: "[?]" +0x138f: "[?]" +0x1390: "[?]" +0x1391: "[?]" +0x1392: "[?]" +0x1393: "[?]" +0x1394: "[?]" +0x1395: "[?]" +0x1396: "[?]" +0x1397: "[?]" +0x1398: "[?]" +0x1399: "[?]" +0x139a: "[?]" +0x139b: "[?]" +0x139c: "[?]" +0x139d: "[?]" +0x139e: "[?]" +0x139f: "[?]" +0x13a0: "a" +0x13a1: "e" +0x13a2: "i" +0x13a3: "o" +0x13a4: "u" +0x13a5: "v" +0x13a6: "ga" +0x13a7: "ka" +0x13a8: "ge" +0x13a9: "gi" +0x13aa: "go" +0x13ab: "gu" +0x13ac: "gv" +0x13ad: "ha" +0x13ae: "he" +0x13af: "hi" +0x13b0: "ho" +0x13b1: "hu" +0x13b2: "hv" +0x13b3: "la" +0x13b4: "le" +0x13b5: "li" +0x13b6: "lo" +0x13b7: "lu" +0x13b8: "lv" +0x13b9: "ma" +0x13ba: "me" +0x13bb: "mi" +0x13bc: "mo" +0x13bd: "mu" +0x13be: "na" +0x13bf: "hna" +0x13c0: "nah" +0x13c1: "ne" +0x13c2: "ni" +0x13c3: "no" +0x13c4: "nu" +0x13c5: "nv" +0x13c6: "qua" +0x13c7: "que" +0x13c8: "qui" +0x13c9: "quo" +0x13ca: "quu" +0x13cb: "quv" +0x13cc: "sa" +0x13cd: "s" +0x13ce: "se" +0x13cf: "si" +0x13d0: "so" +0x13d1: "su" +0x13d2: "sv" +0x13d3: "da" +0x13d4: "ta" +0x13d5: "de" +0x13d6: "te" +0x13d7: "di" +0x13d8: "ti" +0x13d9: "do" +0x13da: "du" +0x13db: "dv" +0x13dc: "dla" +0x13dd: "tla" +0x13de: "tle" +0x13df: "tli" +0x13e0: "tlo" +0x13e1: "tlu" +0x13e2: "tlv" +0x13e3: "tsa" +0x13e4: "tse" +0x13e5: "tsi" +0x13e6: "tso" +0x13e7: "tsu" +0x13e8: "tsv" +0x13e9: "wa" +0x13ea: "we" +0x13eb: "wi" +0x13ec: "wo" +0x13ed: "wu" +0x13ee: "wv" +0x13ef: "ya" +0x13f0: "ye" +0x13f1: "yi" +0x13f2: "yo" +0x13f3: "yu" +0x13f4: "yv" +0x13f5: "[?]" +0x13f6: "[?]" +0x13f7: "[?]" +0x13f8: "[?]" +0x13f9: "[?]" +0x13fa: "[?]" +0x13fb: "[?]" +0x13fc: "[?]" +0x13fd: "[?]" +0x13fe: "[?]" +/* x014 */ +0x1400: "[?]" +0x1401: "e" +0x1402: "aai" +0x1403: "i" +0x1404: "ii" +0x1405: "o" +0x1406: "oo" +0x1407: "oo" +0x1408: "ee" +0x1409: "i" +0x140a: "a" +0x140b: "aa" +0x140c: "we" +0x140d: "we" +0x140e: "wi" +0x140f: "wi" +0x1410: "wii" +0x1411: "wii" +0x1412: "wo" +0x1413: "wo" +0x1414: "woo" +0x1415: "woo" +0x1416: "woo" +0x1417: "wa" +0x1418: "wa" +0x1419: "waa" +0x141a: "waa" +0x141b: "waa" +0x141c: "ai" +0x141d: "w" +0x141e: "'" +0x141f: "t" +0x1420: "k" +0x1421: "sh" +0x1422: "s" +0x1423: "n" +0x1424: "w" +0x1425: "n" +0x1426: "[?]" +0x1427: "w" +0x1428: "c" +0x1429: "?" +0x142a: "l" +0x142b: "en" +0x142c: "in" +0x142d: "on" +0x142e: "an" +0x142f: "pe" +0x1430: "paai" +0x1431: "pi" +0x1432: "pii" +0x1433: "po" +0x1434: "poo" +0x1435: "poo" +0x1436: "hee" +0x1437: "hi" +0x1438: "pa" +0x1439: "paa" +0x143a: "pwe" +0x143b: "pwe" +0x143c: "pwi" +0x143d: "pwi" +0x143e: "pwii" +0x143f: "pwii" +0x1440: "pwo" +0x1441: "pwo" +0x1442: "pwoo" +0x1443: "pwoo" +0x1444: "pwa" +0x1445: "pwa" +0x1446: "pwaa" +0x1447: "pwaa" +0x1448: "pwaa" +0x1449: "p" +0x144a: "p" +0x144b: "h" +0x144c: "te" +0x144d: "taai" +0x144e: "ti" +0x144f: "tii" +0x1450: "to" +0x1451: "too" +0x1452: "too" +0x1453: "dee" +0x1454: "di" +0x1455: "ta" +0x1456: "taa" +0x1457: "twe" +0x1458: "twe" +0x1459: "twi" +0x145a: "twi" +0x145b: "twii" +0x145c: "twii" +0x145d: "two" +0x145e: "two" +0x145f: "twoo" +0x1460: "twoo" +0x1461: "twa" +0x1462: "twa" +0x1463: "twaa" +0x1464: "twaa" +0x1465: "twaa" +0x1466: "t" +0x1467: "tte" +0x1468: "tti" +0x1469: "tto" +0x146a: "tta" +0x146b: "ke" +0x146c: "kaai" +0x146d: "ki" +0x146e: "kii" +0x146f: "ko" +0x1470: "koo" +0x1471: "koo" +0x1472: "ka" +0x1473: "kaa" +0x1474: "kwe" +0x1475: "kwe" +0x1476: "kwi" +0x1477: "kwi" +0x1478: "kwii" +0x1479: "kwii" +0x147a: "kwo" +0x147b: "kwo" +0x147c: "kwoo" +0x147d: "kwoo" +0x147e: "kwa" +0x147f: "kwa" +0x1480: "kwaa" +0x1481: "kwaa" +0x1482: "kwaa" +0x1483: "k" +0x1484: "kw" +0x1485: "keh" +0x1486: "kih" +0x1487: "koh" +0x1488: "kah" +0x1489: "ce" +0x148a: "caai" +0x148b: "ci" +0x148c: "cii" +0x148d: "co" +0x148e: "coo" +0x148f: "coo" +0x1490: "ca" +0x1491: "caa" +0x1492: "cwe" +0x1493: "cwe" +0x1494: "cwi" +0x1495: "cwi" +0x1496: "cwii" +0x1497: "cwii" +0x1498: "cwo" +0x1499: "cwo" +0x149a: "cwoo" +0x149b: "cwoo" +0x149c: "cwa" +0x149d: "cwa" +0x149e: "cwaa" +0x149f: "cwaa" +0x14a0: "cwaa" +0x14a1: "c" +0x14a2: "th" +0x14a3: "me" +0x14a4: "maai" +0x14a5: "mi" +0x14a6: "mii" +0x14a7: "mo" +0x14a8: "moo" +0x14a9: "moo" +0x14aa: "ma" +0x14ab: "maa" +0x14ac: "mwe" +0x14ad: "mwe" +0x14ae: "mwi" +0x14af: "mwi" +0x14b0: "mwii" +0x14b1: "mwii" +0x14b2: "mwo" +0x14b3: "mwo" +0x14b4: "mwoo" +0x14b5: "mwoo" +0x14b6: "mwa" +0x14b7: "mwa" +0x14b8: "mwaa" +0x14b9: "mwaa" +0x14ba: "mwaa" +0x14bb: "m" +0x14bc: "m" +0x14bd: "mh" +0x14be: "m" +0x14bf: "m" +0x14c0: "ne" +0x14c1: "naai" +0x14c2: "ni" +0x14c3: "nii" +0x14c4: "no" +0x14c5: "noo" +0x14c6: "noo" +0x14c7: "na" +0x14c8: "naa" +0x14c9: "nwe" +0x14ca: "nwe" +0x14cb: "nwa" +0x14cc: "nwa" +0x14cd: "nwaa" +0x14ce: "nwaa" +0x14cf: "nwaa" +0x14d0: "n" +0x14d1: "ng" +0x14d2: "nh" +0x14d3: "le" +0x14d4: "laai" +0x14d5: "li" +0x14d6: "lii" +0x14d7: "lo" +0x14d8: "loo" +0x14d9: "loo" +0x14da: "la" +0x14db: "laa" +0x14dc: "lwe" +0x14dd: "lwe" +0x14de: "lwi" +0x14df: "lwi" +0x14e0: "lwii" +0x14e1: "lwii" +0x14e2: "lwo" +0x14e3: "lwo" +0x14e4: "lwoo" +0x14e5: "lwoo" +0x14e6: "lwa" +0x14e7: "lwa" +0x14e8: "lwaa" +0x14e9: "lwaa" +0x14ea: "l" +0x14eb: "l" +0x14ec: "l" +0x14ed: "se" +0x14ee: "saai" +0x14ef: "si" +0x14f0: "sii" +0x14f1: "so" +0x14f2: "soo" +0x14f3: "soo" +0x14f4: "sa" +0x14f5: "saa" +0x14f6: "swe" +0x14f7: "swe" +0x14f8: "swi" +0x14f9: "swi" +0x14fa: "swii" +0x14fb: "swii" +0x14fc: "swo" +0x14fd: "swo" +0x14fe: "swoo" +0x14ff: "swoo" +/* x015 */ +0x1500: "swa" +0x1501: "swa" +0x1502: "swaa" +0x1503: "swaa" +0x1504: "swaa" +0x1505: "s" +0x1506: "s" +0x1507: "sw" +0x1508: "s" +0x1509: "sk" +0x150a: "skw" +0x150b: "sW" +0x150c: "spwa" +0x150d: "stwa" +0x150e: "skwa" +0x150f: "scwa" +0x1510: "she" +0x1511: "shi" +0x1512: "shii" +0x1513: "sho" +0x1514: "shoo" +0x1515: "sha" +0x1516: "shaa" +0x1517: "shwe" +0x1518: "shwe" +0x1519: "shwi" +0x151a: "shwi" +0x151b: "shwii" +0x151c: "shwii" +0x151d: "shwo" +0x151e: "shwo" +0x151f: "shwoo" +0x1520: "shwoo" +0x1521: "shwa" +0x1522: "shwa" +0x1523: "shwaa" +0x1524: "shwaa" +0x1525: "sh" +0x1526: "ye" +0x1527: "yaai" +0x1528: "yi" +0x1529: "yii" +0x152a: "yo" +0x152b: "yoo" +0x152c: "yoo" +0x152d: "ya" +0x152e: "yaa" +0x152f: "ywe" +0x1530: "ywe" +0x1531: "ywi" +0x1532: "ywi" +0x1533: "ywii" +0x1534: "ywii" +0x1535: "ywo" +0x1536: "ywo" +0x1537: "ywoo" +0x1538: "ywoo" +0x1539: "ywa" +0x153a: "ywa" +0x153b: "ywaa" +0x153c: "ywaa" +0x153d: "ywaa" +0x153e: "y" +0x153f: "y" +0x1540: "y" +0x1541: "yi" +0x1542: "re" +0x1543: "re" +0x1544: "le" +0x1545: "raai" +0x1546: "ri" +0x1547: "rii" +0x1548: "ro" +0x1549: "roo" +0x154a: "lo" +0x154b: "ra" +0x154c: "raa" +0x154d: "la" +0x154e: "rwaa" +0x154f: "rwaa" +0x1550: "r" +0x1551: "r" +0x1552: "r" +0x1553: "fe" +0x1554: "faai" +0x1555: "fi" +0x1556: "fii" +0x1557: "fo" +0x1558: "foo" +0x1559: "fa" +0x155a: "faa" +0x155b: "fwaa" +0x155c: "fwaa" +0x155d: "f" +0x155e: "the" +0x155f: "the" +0x1560: "thi" +0x1561: "thi" +0x1562: "thii" +0x1563: "thii" +0x1564: "tho" +0x1565: "thoo" +0x1566: "tha" +0x1567: "thaa" +0x1568: "thwaa" +0x1569: "thwaa" +0x156a: "th" +0x156b: "tthe" +0x156c: "tthi" +0x156d: "ttho" +0x156e: "ttha" +0x156f: "tth" +0x1570: "tye" +0x1571: "tyi" +0x1572: "tyo" +0x1573: "tya" +0x1574: "he" +0x1575: "hi" +0x1576: "hii" +0x1577: "ho" +0x1578: "hoo" +0x1579: "ha" +0x157a: "haa" +0x157b: "h" +0x157c: "h" +0x157d: "hk" +0x157e: "qaai" +0x157f: "qi" +0x1580: "qii" +0x1581: "qo" +0x1582: "qoo" +0x1583: "qa" +0x1584: "qaa" +0x1585: "q" +0x1586: "tlhe" +0x1587: "tlhi" +0x1588: "tlho" +0x1589: "tlha" +0x158a: "re" +0x158b: "ri" +0x158c: "ro" +0x158d: "ra" +0x158e: "ngaai" +0x158f: "ngi" +0x1590: "ngii" +0x1591: "ngo" +0x1592: "ngoo" +0x1593: "nga" +0x1594: "ngaa" +0x1595: "ng" +0x1596: "nng" +0x1597: "she" +0x1598: "shi" +0x1599: "sho" +0x159a: "sha" +0x159b: "the" +0x159c: "thi" +0x159d: "tho" +0x159e: "tha" +0x159f: "th" +0x15a0: "lhi" +0x15a1: "lhii" +0x15a2: "lho" +0x15a3: "lhoo" +0x15a4: "lha" +0x15a5: "lhaa" +0x15a6: "lh" +0x15a7: "the" +0x15a8: "thi" +0x15a9: "thii" +0x15aa: "tho" +0x15ab: "thoo" +0x15ac: "tha" +0x15ad: "thaa" +0x15ae: "th" +0x15af: "b" +0x15b0: "e" +0x15b1: "i" +0x15b2: "o" +0x15b3: "a" +0x15b4: "we" +0x15b5: "wi" +0x15b6: "wo" +0x15b7: "wa" +0x15b8: "ne" +0x15b9: "ni" +0x15ba: "no" +0x15bb: "na" +0x15bc: "ke" +0x15bd: "ki" +0x15be: "ko" +0x15bf: "ka" +0x15c0: "he" +0x15c1: "hi" +0x15c2: "ho" +0x15c3: "ha" +0x15c4: "ghu" +0x15c5: "gho" +0x15c6: "ghe" +0x15c7: "ghee" +0x15c8: "ghi" +0x15c9: "gha" +0x15ca: "ru" +0x15cb: "ro" +0x15cc: "re" +0x15cd: "ree" +0x15ce: "ri" +0x15cf: "ra" +0x15d0: "wu" +0x15d1: "wo" +0x15d2: "we" +0x15d3: "wee" +0x15d4: "wi" +0x15d5: "wa" +0x15d6: "hwu" +0x15d7: "hwo" +0x15d8: "hwe" +0x15d9: "hwee" +0x15da: "hwi" +0x15db: "hwa" +0x15dc: "thu" +0x15dd: "tho" +0x15de: "the" +0x15df: "thee" +0x15e0: "thi" +0x15e1: "tha" +0x15e2: "ttu" +0x15e3: "tto" +0x15e4: "tte" +0x15e5: "ttee" +0x15e6: "tti" +0x15e7: "tta" +0x15e8: "pu" +0x15e9: "po" +0x15ea: "pe" +0x15eb: "pee" +0x15ec: "pi" +0x15ed: "pa" +0x15ee: "p" +0x15ef: "gu" +0x15f0: "go" +0x15f1: "ge" +0x15f2: "gee" +0x15f3: "gi" +0x15f4: "ga" +0x15f5: "khu" +0x15f6: "kho" +0x15f7: "khe" +0x15f8: "khee" +0x15f9: "khi" +0x15fa: "kha" +0x15fb: "kku" +0x15fc: "kko" +0x15fd: "kke" +0x15fe: "kkee" +0x15ff: "kki" +/* x016 */ +0x1600: "kka" +0x1601: "kk" +0x1602: "nu" +0x1603: "no" +0x1604: "ne" +0x1605: "nee" +0x1606: "ni" +0x1607: "na" +0x1608: "mu" +0x1609: "mo" +0x160a: "me" +0x160b: "mee" +0x160c: "mi" +0x160d: "ma" +0x160e: "yu" +0x160f: "yo" +0x1610: "ye" +0x1611: "yee" +0x1612: "yi" +0x1613: "ya" +0x1614: "ju" +0x1615: "ju" +0x1616: "jo" +0x1617: "je" +0x1618: "jee" +0x1619: "ji" +0x161a: "ji" +0x161b: "ja" +0x161c: "jju" +0x161d: "jjo" +0x161e: "jje" +0x161f: "jjee" +0x1620: "jji" +0x1621: "jja" +0x1622: "lu" +0x1623: "lo" +0x1624: "le" +0x1625: "lee" +0x1626: "li" +0x1627: "la" +0x1628: "dlu" +0x1629: "dlo" +0x162a: "dle" +0x162b: "dlee" +0x162c: "dli" +0x162d: "dla" +0x162e: "lhu" +0x162f: "lho" +0x1630: "lhe" +0x1631: "lhee" +0x1632: "lhi" +0x1633: "lha" +0x1634: "tlhu" +0x1635: "tlho" +0x1636: "tlhe" +0x1637: "tlhee" +0x1638: "tlhi" +0x1639: "tlha" +0x163a: "tlu" +0x163b: "tlo" +0x163c: "tle" +0x163d: "tlee" +0x163e: "tli" +0x163f: "tla" +0x1640: "zu" +0x1641: "zo" +0x1642: "ze" +0x1643: "zee" +0x1644: "zi" +0x1645: "za" +0x1646: "z" +0x1647: "z" +0x1648: "dzu" +0x1649: "dzo" +0x164a: "dze" +0x164b: "dzee" +0x164c: "dzi" +0x164d: "dza" +0x164e: "su" +0x164f: "so" +0x1650: "se" +0x1651: "see" +0x1652: "si" +0x1653: "sa" +0x1654: "shu" +0x1655: "sho" +0x1656: "she" +0x1657: "shee" +0x1658: "shi" +0x1659: "sha" +0x165a: "sh" +0x165b: "tsu" +0x165c: "tso" +0x165d: "tse" +0x165e: "tsee" +0x165f: "tsi" +0x1660: "tsa" +0x1661: "chu" +0x1662: "cho" +0x1663: "che" +0x1664: "chee" +0x1665: "chi" +0x1666: "cha" +0x1667: "ttsu" +0x1668: "ttso" +0x1669: "ttse" +0x166a: "ttsee" +0x166b: "ttsi" +0x166c: "ttsa" +0x166d: "X" +0x166e: "." +0x166f: "qai" +0x1670: "ngai" +0x1671: "nngi" +0x1672: "nngii" +0x1673: "nngo" +0x1674: "nngoo" +0x1675: "nnga" +0x1676: "nngaa" +0x1677: "[?]" +0x1678: "[?]" +0x1679: "[?]" +0x167a: "[?]" +0x167b: "[?]" +0x167c: "[?]" +0x167d: "[?]" +0x167e: "[?]" +0x167f: "[?]" +0x1680: " " +0x1681: "b" +0x1682: "l" +0x1683: "f" +0x1684: "s" +0x1685: "n" +0x1686: "h" +0x1687: "d" +0x1688: "t" +0x1689: "c" +0x168a: "q" +0x168b: "m" +0x168c: "g" +0x168d: "ng" +0x168e: "z" +0x168f: "r" +0x1690: "a" +0x1691: "o" +0x1692: "u" +0x1693: "e" +0x1694: "i" +0x1695: "ch" +0x1696: "th" +0x1697: "ph" +0x1698: "p" +0x1699: "x" +0x169a: "p" +0x169b: "<" +0x169c: ">" +0x169d: "[?]" +0x169e: "[?]" +0x169f: "[?]" +0x16a0: "f" +0x16a1: "v" +0x16a2: "u" +0x16a3: "yr" +0x16a4: "y" +0x16a5: "w" +0x16a6: "th" +0x16a7: "th" +0x16a8: "a" +0x16a9: "o" +0x16aa: "ac" +0x16ab: "ae" +0x16ac: "o" +0x16ad: "o" +0x16ae: "o" +0x16af: "oe" +0x16b0: "on" +0x16b1: "r" +0x16b2: "k" +0x16b3: "c" +0x16b4: "k" +0x16b5: "g" +0x16b6: "ng" +0x16b7: "g" +0x16b8: "g" +0x16b9: "w" +0x16ba: "h" +0x16bb: "h" +0x16bc: "h" +0x16bd: "h" +0x16be: "n" +0x16bf: "n" +0x16c0: "n" +0x16c1: "i" +0x16c2: "e" +0x16c3: "j" +0x16c4: "g" +0x16c5: "ae" +0x16c6: "a" +0x16c7: "eo" +0x16c8: "p" +0x16c9: "z" +0x16ca: "s" +0x16cb: "s" +0x16cc: "s" +0x16cd: "c" +0x16ce: "z" +0x16cf: "t" +0x16d0: "t" +0x16d1: "d" +0x16d2: "b" +0x16d3: "b" +0x16d4: "p" +0x16d5: "p" +0x16d6: "e" +0x16d7: "m" +0x16d8: "m" +0x16d9: "m" +0x16da: "l" +0x16db: "l" +0x16dc: "ng" +0x16dd: "ng" +0x16de: "d" +0x16df: "o" +0x16e0: "ear" +0x16e1: "ior" +0x16e2: "qu" +0x16e3: "qu" +0x16e4: "qu" +0x16e5: "s" +0x16e6: "yr" +0x16e7: "yr" +0x16e8: "yr" +0x16e9: "q" +0x16ea: "x" +0x16eb: "." +0x16ec: ":" +0x16ed: "+" +0x16ee: "17" +0x16ef: "18" +0x16f0: "19" +0x16f1: "[?]" +0x16f2: "[?]" +0x16f3: "[?]" +0x16f4: "[?]" +0x16f5: "[?]" +0x16f6: "[?]" +0x16f7: "[?]" +0x16f8: "[?]" +0x16f9: "[?]" +0x16fa: "[?]" +0x16fb: "[?]" +0x16fc: "[?]" +0x16fd: "[?]" +0x16fe: "[?]" +/* x017 */ +0x1700: "[?]" +0x1701: "[?]" +0x1702: "[?]" +0x1703: "[?]" +0x1704: "[?]" +0x1705: "[?]" +0x1706: "[?]" +0x1707: "[?]" +0x1708: "[?]" +0x1709: "[?]" +0x170a: "[?]" +0x170b: "[?]" +0x170c: "[?]" +0x170d: "[?]" +0x170e: "[?]" +0x170f: "[?]" +0x1710: "[?]" +0x1711: "[?]" +0x1712: "[?]" +0x1713: "[?]" +0x1714: "[?]" +0x1715: "[?]" +0x1716: "[?]" +0x1717: "[?]" +0x1718: "[?]" +0x1719: "[?]" +0x171a: "[?]" +0x171b: "[?]" +0x171c: "[?]" +0x171d: "[?]" +0x171e: "[?]" +0x171f: "[?]" +0x1720: "[?]" +0x1721: "[?]" +0x1722: "[?]" +0x1723: "[?]" +0x1724: "[?]" +0x1725: "[?]" +0x1726: "[?]" +0x1727: "[?]" +0x1728: "[?]" +0x1729: "[?]" +0x172a: "[?]" +0x172b: "[?]" +0x172c: "[?]" +0x172d: "[?]" +0x172e: "[?]" +0x172f: "[?]" +0x1730: "[?]" +0x1731: "[?]" +0x1732: "[?]" +0x1733: "[?]" +0x1734: "[?]" +0x1735: "[?]" +0x1736: "[?]" +0x1737: "[?]" +0x1738: "[?]" +0x1739: "[?]" +0x173a: "[?]" +0x173b: "[?]" +0x173c: "[?]" +0x173d: "[?]" +0x173e: "[?]" +0x173f: "[?]" +0x1740: "[?]" +0x1741: "[?]" +0x1742: "[?]" +0x1743: "[?]" +0x1744: "[?]" +0x1745: "[?]" +0x1746: "[?]" +0x1747: "[?]" +0x1748: "[?]" +0x1749: "[?]" +0x174a: "[?]" +0x174b: "[?]" +0x174c: "[?]" +0x174d: "[?]" +0x174e: "[?]" +0x174f: "[?]" +0x1750: "[?]" +0x1751: "[?]" +0x1752: "[?]" +0x1753: "[?]" +0x1754: "[?]" +0x1755: "[?]" +0x1756: "[?]" +0x1757: "[?]" +0x1758: "[?]" +0x1759: "[?]" +0x175a: "[?]" +0x175b: "[?]" +0x175c: "[?]" +0x175d: "[?]" +0x175e: "[?]" +0x175f: "[?]" +0x1760: "[?]" +0x1761: "[?]" +0x1762: "[?]" +0x1763: "[?]" +0x1764: "[?]" +0x1765: "[?]" +0x1766: "[?]" +0x1767: "[?]" +0x1768: "[?]" +0x1769: "[?]" +0x176a: "[?]" +0x176b: "[?]" +0x176c: "[?]" +0x176d: "[?]" +0x176e: "[?]" +0x176f: "[?]" +0x1770: "[?]" +0x1771: "[?]" +0x1772: "[?]" +0x1773: "[?]" +0x1774: "[?]" +0x1775: "[?]" +0x1776: "[?]" +0x1777: "[?]" +0x1778: "[?]" +0x1779: "[?]" +0x177a: "[?]" +0x177b: "[?]" +0x177c: "[?]" +0x177d: "[?]" +0x177e: "[?]" +0x177f: "[?]" +0x1780: "k" +0x1781: "kh" +0x1782: "g" +0x1783: "gh" +0x1784: "ng" +0x1785: "c" +0x1786: "ch" +0x1787: "j" +0x1788: "jh" +0x1789: "ny" +0x178a: "t" +0x178b: "tth" +0x178c: "d" +0x178d: "ddh" +0x178e: "nn" +0x178f: "t" +0x1790: "th" +0x1791: "d" +0x1792: "dh" +0x1793: "n" +0x1794: "p" +0x1795: "ph" +0x1796: "b" +0x1797: "bh" +0x1798: "m" +0x1799: "y" +0x179a: "r" +0x179b: "l" +0x179c: "v" +0x179d: "sh" +0x179e: "ss" +0x179f: "s" +0x17a0: "h" +0x17a1: "l" +0x17a2: "q" +0x17a3: "a" +0x17a4: "aa" +0x17a5: "i" +0x17a6: "ii" +0x17a7: "u" +0x17a8: "uk" +0x17a9: "uu" +0x17aa: "uuv" +0x17ab: "ry" +0x17ac: "ryy" +0x17ad: "ly" +0x17ae: "lyy" +0x17af: "e" +0x17b0: "ai" +0x17b1: "oo" +0x17b2: "oo" +0x17b3: "au" +0x17b4: "a" +0x17b5: "aa" +0x17b6: "aa" +0x17b7: "i" +0x17b8: "ii" +0x17b9: "y" +0x17ba: "yy" +0x17bb: "u" +0x17bc: "uu" +0x17bd: "ua" +0x17be: "oe" +0x17bf: "ya" +0x17c0: "ie" +0x17c1: "e" +0x17c2: "ae" +0x17c3: "ai" +0x17c4: "oo" +0x17c5: "au" +0x17c6: "M" +0x17c7: "H" +0x17c8: "a`" +0x17c9: "" +0x17ca: "" +0x17cb: "" +0x17cc: "r" +0x17cd: "" +0x17ce: "!" +0x17cf: "" +0x17d0: "" +0x17d1: "" +0x17d2: "" +0x17d3: "" +0x17d4: "." +0x17d5: " // " +0x17d6: ":" +0x17d7: "+" +0x17d8: "++" +0x17d9: " * " +0x17da: " /// " +0x17db: "KR" +0x17dc: "'" +0x17dd: "[?]" +0x17de: "[?]" +0x17df: "[?]" +0x17e0: "0" +0x17e1: "1" +0x17e2: "2" +0x17e3: "3" +0x17e4: "4" +0x17e5: "5" +0x17e6: "6" +0x17e7: "7" +0x17e8: "8" +0x17e9: "9" +0x17ea: "[?]" +0x17eb: "[?]" +0x17ec: "[?]" +0x17ed: "[?]" +0x17ee: "[?]" +0x17ef: "[?]" +0x17f0: "[?]" +0x17f1: "[?]" +0x17f2: "[?]" +0x17f3: "[?]" +0x17f4: "[?]" +0x17f5: "[?]" +0x17f6: "[?]" +0x17f7: "[?]" +0x17f8: "[?]" +0x17f9: "[?]" +0x17fa: "[?]" +0x17fb: "[?]" +0x17fc: "[?]" +0x17fd: "[?]" +0x17fe: "[?]" +/* x018 */ +0x1800: " @ " +0x1801: " ... " +0x1802: ", " +0x1803: ". " +0x1804: ": " +0x1805: " // " +0x1806: "" +0x1807: "-" +0x1808: ", " +0x1809: ". " +0x180a: "" +0x180b: "" +0x180c: "" +0x180d: "" +0x180e: "" +0x180f: "[?]" +0x1810: "0" +0x1811: "1" +0x1812: "2" +0x1813: "3" +0x1814: "4" +0x1815: "5" +0x1816: "6" +0x1817: "7" +0x1818: "8" +0x1819: "9" +0x181a: "[?]" +0x181b: "[?]" +0x181c: "[?]" +0x181d: "[?]" +0x181e: "[?]" +0x181f: "[?]" +0x1820: "a" +0x1821: "e" +0x1822: "i" +0x1823: "o" +0x1824: "u" +0x1825: "O" +0x1826: "U" +0x1827: "ee" +0x1828: "n" +0x1829: "ng" +0x182a: "b" +0x182b: "p" +0x182c: "q" +0x182d: "g" +0x182e: "m" +0x182f: "l" +0x1830: "s" +0x1831: "sh" +0x1832: "t" +0x1833: "d" +0x1834: "ch" +0x1835: "j" +0x1836: "y" +0x1837: "r" +0x1838: "w" +0x1839: "f" +0x183a: "k" +0x183b: "kha" +0x183c: "ts" +0x183d: "z" +0x183e: "h" +0x183f: "zr" +0x1840: "lh" +0x1841: "zh" +0x1842: "ch" +0x1843: "-" +0x1844: "e" +0x1845: "i" +0x1846: "o" +0x1847: "u" +0x1848: "O" +0x1849: "U" +0x184a: "ng" +0x184b: "b" +0x184c: "p" +0x184d: "q" +0x184e: "g" +0x184f: "m" +0x1850: "t" +0x1851: "d" +0x1852: "ch" +0x1853: "j" +0x1854: "ts" +0x1855: "y" +0x1856: "w" +0x1857: "k" +0x1858: "g" +0x1859: "h" +0x185a: "jy" +0x185b: "ny" +0x185c: "dz" +0x185d: "e" +0x185e: "i" +0x185f: "iy" +0x1860: "U" +0x1861: "u" +0x1862: "ng" +0x1863: "k" +0x1864: "g" +0x1865: "h" +0x1866: "p" +0x1867: "sh" +0x1868: "t" +0x1869: "d" +0x186a: "j" +0x186b: "f" +0x186c: "g" +0x186d: "h" +0x186e: "ts" +0x186f: "z" +0x1870: "r" +0x1871: "ch" +0x1872: "zh" +0x1873: "i" +0x1874: "k" +0x1875: "r" +0x1876: "f" +0x1877: "zh" +0x1878: "[?]" +0x1879: "[?]" +0x187a: "[?]" +0x187b: "[?]" +0x187c: "[?]" +0x187d: "[?]" +0x187e: "[?]" +0x187f: "[?]" +0x1880: "[?]" +0x1881: "H" +0x1882: "X" +0x1883: "W" +0x1884: "M" +0x1885: " 3 " +0x1886: " 333 " +0x1887: "a" +0x1888: "i" +0x1889: "k" +0x188a: "ng" +0x188b: "c" +0x188c: "tt" +0x188d: "tth" +0x188e: "dd" +0x188f: "nn" +0x1890: "t" +0x1891: "d" +0x1892: "p" +0x1893: "ph" +0x1894: "ss" +0x1895: "zh" +0x1896: "z" +0x1897: "a" +0x1898: "t" +0x1899: "zh" +0x189a: "gh" +0x189b: "ng" +0x189c: "c" +0x189d: "jh" +0x189e: "tta" +0x189f: "ddh" +0x18a0: "t" +0x18a1: "dh" +0x18a2: "ss" +0x18a3: "cy" +0x18a4: "zh" +0x18a5: "z" +0x18a6: "u" +0x18a7: "y" +0x18a8: "bh" +0x18a9: "'" +0x18aa: "[?]" +0x18ab: "[?]" +0x18ac: "[?]" +0x18ad: "[?]" +0x18ae: "[?]" +0x18af: "[?]" +0x18b0: "[?]" +0x18b1: "[?]" +0x18b2: "[?]" +0x18b3: "[?]" +0x18b4: "[?]" +0x18b5: "[?]" +0x18b6: "[?]" +0x18b7: "[?]" +0x18b8: "[?]" +0x18b9: "[?]" +0x18ba: "[?]" +0x18bb: "[?]" +0x18bc: "[?]" +0x18bd: "[?]" +0x18be: "[?]" +0x18bf: "[?]" +0x18c0: "[?]" +0x18c1: "[?]" +0x18c2: "[?]" +0x18c3: "[?]" +0x18c4: "[?]" +0x18c5: "[?]" +0x18c6: "[?]" +0x18c7: "[?]" +0x18c8: "[?]" +0x18c9: "[?]" +0x18ca: "[?]" +0x18cb: "[?]" +0x18cc: "[?]" +0x18cd: "[?]" +0x18ce: "[?]" +0x18cf: "[?]" +0x18d0: "[?]" +0x18d1: "[?]" +0x18d2: "[?]" +0x18d3: "[?]" +0x18d4: "[?]" +0x18d5: "[?]" +0x18d6: "[?]" +0x18d7: "[?]" +0x18d8: "[?]" +0x18d9: "[?]" +0x18da: "[?]" +0x18db: "[?]" +0x18dc: "[?]" +0x18dd: "[?]" +0x18de: "[?]" +0x18df: "[?]" +0x18e0: "[?]" +0x18e1: "[?]" +0x18e2: "[?]" +0x18e3: "[?]" +0x18e4: "[?]" +0x18e5: "[?]" +0x18e6: "[?]" +0x18e7: "[?]" +0x18e8: "[?]" +0x18e9: "[?]" +0x18ea: "[?]" +0x18eb: "[?]" +0x18ec: "[?]" +0x18ed: "[?]" +0x18ee: "[?]" +0x18ef: "[?]" +0x18f0: "[?]" +0x18f1: "[?]" +0x18f2: "[?]" +0x18f3: "[?]" +0x18f4: "[?]" +0x18f5: "[?]" +0x18f6: "[?]" +0x18f7: "[?]" +0x18f8: "[?]" +0x18f9: "[?]" +0x18fa: "[?]" +0x18fb: "[?]" +0x18fc: "[?]" +0x18fd: "[?]" +0x18fe: "[?]" +/* x01d */ +0x1d00: "" +0x1d01: "" +0x1d02: "" +0x1d03: "" +0x1d04: "" +0x1d05: "" +0x1d06: "" +0x1d07: "" +0x1d08: "" +0x1d09: "" +0x1d0a: "" +0x1d0b: "" +0x1d0c: "" +0x1d0d: "" +0x1d0e: "" +0x1d0f: "" +0x1d10: "" +0x1d11: "" +0x1d12: "" +0x1d13: "" +0x1d14: "" +0x1d15: "" +0x1d16: "" +0x1d17: "" +0x1d18: "" +0x1d19: "" +0x1d1a: "" +0x1d1b: "" +0x1d1c: "" +0x1d1d: "" +0x1d1e: "" +0x1d1f: "" +0x1d20: "" +0x1d21: "" +0x1d22: "" +0x1d23: "" +0x1d24: "" +0x1d25: "" +0x1d26: "" +0x1d27: "" +0x1d28: "" +0x1d29: "" +0x1d2a: "" +0x1d2b: "" +0x1d2c: "" +0x1d2d: "" +0x1d2e: "" +0x1d2f: "" +0x1d30: "" +0x1d31: "" +0x1d32: "" +0x1d33: "" +0x1d34: "" +0x1d35: "" +0x1d36: "" +0x1d37: "" +0x1d38: "" +0x1d39: "" +0x1d3a: "" +0x1d3b: "" +0x1d3c: "" +0x1d3d: "" +0x1d3e: "" +0x1d3f: "" +0x1d40: "" +0x1d41: "" +0x1d42: "" +0x1d43: "" +0x1d44: "" +0x1d45: "" +0x1d46: "" +0x1d47: "" +0x1d48: "" +0x1d49: "" +0x1d4a: "" +0x1d4b: "" +0x1d4c: "" +0x1d4d: "" +0x1d4e: "" +0x1d4f: "" +0x1d50: "" +0x1d51: "" +0x1d52: "" +0x1d53: "" +0x1d54: "" +0x1d55: "" +0x1d56: "" +0x1d57: "" +0x1d58: "" +0x1d59: "" +0x1d5a: "" +0x1d5b: "" +0x1d5c: "" +0x1d5d: "" +0x1d5e: "" +0x1d5f: "" +0x1d60: "" +0x1d61: "" +0x1d62: "" +0x1d63: "" +0x1d64: "" +0x1d65: "" +0x1d66: "" +0x1d67: "" +0x1d68: "" +0x1d69: "" +0x1d6a: "" +0x1d6b: "" +0x1d6c: "b" +0x1d6d: "d" +0x1d6e: "f" +0x1d6f: "m" +0x1d70: "n" +0x1d71: "p" +0x1d72: "r" +0x1d73: "r" +0x1d74: "s" +0x1d75: "t" +0x1d76: "z" +0x1d77: "g" +0x1d78: "" +0x1d79: "" +0x1d7a: "" +0x1d7b: "" +0x1d7c: "" +0x1d7d: "p" +0x1d7e: "" +0x1d7f: "" +0x1d80: "b" +0x1d81: "d" +0x1d82: "f" +0x1d83: "g" +0x1d84: "k" +0x1d85: "l" +0x1d86: "m" +0x1d87: "n" +0x1d88: "p" +0x1d89: "r" +0x1d8a: "s" +0x1d8b: "" +0x1d8c: "v" +0x1d8d: "x" +0x1d8e: "z" +0x1d8f: "" +0x1d90: "" +0x1d91: "" +0x1d92: "" +0x1d93: "" +0x1d94: "" +0x1d95: "" +0x1d96: "" +0x1d97: "" +0x1d98: "" +0x1d99: "" +0x1d9a: "" +0x1d9b: "" +0x1d9c: "" +0x1d9d: "" +0x1d9e: "" +0x1d9f: "" +0x1da0: "" +0x1da1: "" +0x1da2: "" +0x1da3: "" +0x1da4: "" +0x1da5: "" +0x1da6: "" +0x1da7: "" +0x1da8: "" +0x1da9: "" +0x1daa: "" +0x1dab: "" +0x1dac: "" +0x1dad: "" +0x1dae: "" +0x1daf: "" +0x1db0: "" +0x1db1: "" +0x1db2: "" +0x1db3: "" +0x1db4: "" +0x1db5: "" +0x1db6: "" +0x1db7: "" +0x1db8: "" +0x1db9: "" +0x1dba: "" +0x1dbb: "" +0x1dbc: "" +0x1dbd: "" +0x1dbe: "" +0x1dbf: "" +0x1dc0: "" +0x1dc1: "" +0x1dc2: "" +0x1dc3: "" +0x1dc4: "" +0x1dc5: "" +0x1dc6: "" +0x1dc7: "" +0x1dc8: "" +0x1dc9: "" +0x1dca: "" +0x1dcb: "" +0x1dcc: "" +0x1dcd: "" +0x1dce: "" +0x1dcf: "" +0x1dd0: "" +0x1dd1: "" +0x1dd2: "" +0x1dd3: "" +0x1dd4: "" +0x1dd5: "" +0x1dd6: "" +0x1dd7: "" +0x1dd8: "" +0x1dd9: "" +0x1dda: "" +0x1ddb: "" +0x1ddc: "" +0x1ddd: "" +0x1dde: "" +0x1ddf: "" +0x1de0: "" +0x1de1: "" +0x1de2: "" +0x1de3: "" +0x1de4: "" +0x1de5: "" +0x1de6: "" +0x1de7: "" +0x1de8: "" +0x1de9: "" +0x1dea: "" +0x1deb: "" +0x1dec: "" +0x1ded: "" +0x1dee: "" +0x1def: "" +0x1df0: "" +0x1df1: "" +0x1df2: "" +0x1df3: "" +0x1df4: "" +0x1df5: "" +0x1df6: "" +0x1df7: "" +0x1df8: "" +0x1df9: "" +0x1dfa: "" +0x1dfb: "" +0x1dfc: "" +0x1dfd: "" +0x1dfe: "" +/* x01e */ +0x1e00: "A" +0x1e01: "a" +0x1e02: "B" +0x1e03: "b" +0x1e04: "B" +0x1e05: "b" +0x1e06: "B" +0x1e07: "b" +0x1e08: "C" +0x1e09: "c" +0x1e0a: "D" +0x1e0b: "d" +0x1e0c: "D" +0x1e0d: "d" +0x1e0e: "D" +0x1e0f: "d" +0x1e10: "D" +0x1e11: "d" +0x1e12: "D" +0x1e13: "d" +0x1e14: "E" +0x1e15: "e" +0x1e16: "E" +0x1e17: "e" +0x1e18: "E" +0x1e19: "e" +0x1e1a: "E" +0x1e1b: "e" +0x1e1c: "E" +0x1e1d: "e" +0x1e1e: "F" +0x1e1f: "f" +0x1e20: "G" +0x1e21: "g" +0x1e22: "H" +0x1e23: "h" +0x1e24: "H" +0x1e25: "h" +0x1e26: "H" +0x1e27: "h" +0x1e28: "H" +0x1e29: "h" +0x1e2a: "H" +0x1e2b: "h" +0x1e2c: "I" +0x1e2d: "i" +0x1e2e: "I" +0x1e2f: "i" +0x1e30: "K" +0x1e31: "k" +0x1e32: "K" +0x1e33: "k" +0x1e34: "K" +0x1e35: "k" +0x1e36: "L" +0x1e37: "l" +0x1e38: "L" +0x1e39: "l" +0x1e3a: "L" +0x1e3b: "l" +0x1e3c: "L" +0x1e3d: "l" +0x1e3e: "M" +0x1e3f: "m" +0x1e40: "M" +0x1e41: "m" +0x1e42: "M" +0x1e43: "m" +0x1e44: "N" +0x1e45: "n" +0x1e46: "N" +0x1e47: "n" +0x1e48: "N" +0x1e49: "n" +0x1e4a: "N" +0x1e4b: "n" +0x1e4c: "O" +0x1e4d: "o" +0x1e4e: "O" +0x1e4f: "o" +0x1e50: "O" +0x1e51: "o" +0x1e52: "O" +0x1e53: "o" +0x1e54: "P" +0x1e55: "p" +0x1e56: "P" +0x1e57: "p" +0x1e58: "R" +0x1e59: "r" +0x1e5a: "R" +0x1e5b: "r" +0x1e5c: "R" +0x1e5d: "r" +0x1e5e: "R" +0x1e5f: "r" +0x1e60: "S" +0x1e61: "s" +0x1e62: "S" +0x1e63: "s" +0x1e64: "S" +0x1e65: "s" +0x1e66: "S" +0x1e67: "s" +0x1e68: "S" +0x1e69: "s" +0x1e6a: "T" +0x1e6b: "t" +0x1e6c: "T" +0x1e6d: "t" +0x1e6e: "T" +0x1e6f: "t" +0x1e70: "T" +0x1e71: "t" +0x1e72: "U" +0x1e73: "u" +0x1e74: "U" +0x1e75: "u" +0x1e76: "U" +0x1e77: "u" +0x1e78: "U" +0x1e79: "u" +0x1e7a: "U" +0x1e7b: "u" +0x1e7c: "V" +0x1e7d: "v" +0x1e7e: "V" +0x1e7f: "v" +0x1e80: "W" +0x1e81: "w" +0x1e82: "W" +0x1e83: "w" +0x1e84: "W" +0x1e85: "w" +0x1e86: "W" +0x1e87: "w" +0x1e88: "W" +0x1e89: "w" +0x1e8a: "X" +0x1e8b: "x" +0x1e8c: "X" +0x1e8d: "x" +0x1e8e: "Y" +0x1e8f: "y" +0x1e90: "Z" +0x1e91: "z" +0x1e92: "Z" +0x1e93: "z" +0x1e94: "Z" +0x1e95: "z" +0x1e96: "h" +0x1e97: "t" +0x1e98: "w" +0x1e99: "y" +0x1e9a: "a" +0x1e9b: "S" +0x1e9c: "[?]" +0x1e9d: "[?]" +0x1e9e: "Ss" +0x1e9f: "[?]" +0x1ea0: "A" +0x1ea1: "a" +0x1ea2: "A" +0x1ea3: "a" +0x1ea4: "A" +0x1ea5: "a" +0x1ea6: "A" +0x1ea7: "a" +0x1ea8: "A" +0x1ea9: "a" +0x1eaa: "A" +0x1eab: "a" +0x1eac: "A" +0x1ead: "a" +0x1eae: "A" +0x1eaf: "a" +0x1eb0: "A" +0x1eb1: "a" +0x1eb2: "A" +0x1eb3: "a" +0x1eb4: "A" +0x1eb5: "a" +0x1eb6: "A" +0x1eb7: "a" +0x1eb8: "E" +0x1eb9: "e" +0x1eba: "E" +0x1ebb: "e" +0x1ebc: "E" +0x1ebd: "e" +0x1ebe: "E" +0x1ebf: "e" +0x1ec0: "E" +0x1ec1: "e" +0x1ec2: "E" +0x1ec3: "e" +0x1ec4: "E" +0x1ec5: "e" +0x1ec6: "E" +0x1ec7: "e" +0x1ec8: "I" +0x1ec9: "i" +0x1eca: "I" +0x1ecb: "i" +0x1ecc: "O" +0x1ecd: "o" +0x1ece: "O" +0x1ecf: "o" +0x1ed0: "O" +0x1ed1: "o" +0x1ed2: "O" +0x1ed3: "o" +0x1ed4: "O" +0x1ed5: "o" +0x1ed6: "O" +0x1ed7: "o" +0x1ed8: "O" +0x1ed9: "o" +0x1eda: "O" +0x1edb: "o" +0x1edc: "O" +0x1edd: "o" +0x1ede: "O" +0x1edf: "o" +0x1ee0: "O" +0x1ee1: "o" +0x1ee2: "O" +0x1ee3: "o" +0x1ee4: "U" +0x1ee5: "u" +0x1ee6: "U" +0x1ee7: "u" +0x1ee8: "U" +0x1ee9: "u" +0x1eea: "U" +0x1eeb: "u" +0x1eec: "U" +0x1eed: "u" +0x1eee: "U" +0x1eef: "u" +0x1ef0: "U" +0x1ef1: "u" +0x1ef2: "Y" +0x1ef3: "y" +0x1ef4: "Y" +0x1ef5: "y" +0x1ef6: "Y" +0x1ef7: "y" +0x1ef8: "Y" +0x1ef9: "y" +0x1efa: "[?]" +0x1efb: "[?]" +0x1efc: "[?]" +0x1efd: "[?]" +0x1efe: "[?]" +/* x01f */ +0x1f00: "a" +0x1f01: "a" +0x1f02: "a" +0x1f03: "a" +0x1f04: "a" +0x1f05: "a" +0x1f06: "a" +0x1f07: "a" +0x1f08: "A" +0x1f09: "A" +0x1f0a: "A" +0x1f0b: "A" +0x1f0c: "A" +0x1f0d: "A" +0x1f0e: "A" +0x1f0f: "A" +0x1f10: "e" +0x1f11: "e" +0x1f12: "e" +0x1f13: "e" +0x1f14: "e" +0x1f15: "e" +0x1f16: "[?]" +0x1f17: "[?]" +0x1f18: "E" +0x1f19: "E" +0x1f1a: "E" +0x1f1b: "E" +0x1f1c: "E" +0x1f1d: "E" +0x1f1e: "[?]" +0x1f1f: "[?]" +0x1f20: "e" +0x1f21: "e" +0x1f22: "e" +0x1f23: "e" +0x1f24: "e" +0x1f25: "e" +0x1f26: "e" +0x1f27: "e" +0x1f28: "E" +0x1f29: "E" +0x1f2a: "E" +0x1f2b: "E" +0x1f2c: "E" +0x1f2d: "E" +0x1f2e: "E" +0x1f2f: "E" +0x1f30: "i" +0x1f31: "i" +0x1f32: "i" +0x1f33: "i" +0x1f34: "i" +0x1f35: "i" +0x1f36: "i" +0x1f37: "i" +0x1f38: "I" +0x1f39: "I" +0x1f3a: "I" +0x1f3b: "I" +0x1f3c: "I" +0x1f3d: "I" +0x1f3e: "I" +0x1f3f: "I" +0x1f40: "o" +0x1f41: "o" +0x1f42: "o" +0x1f43: "o" +0x1f44: "o" +0x1f45: "o" +0x1f46: "[?]" +0x1f47: "[?]" +0x1f48: "O" +0x1f49: "O" +0x1f4a: "O" +0x1f4b: "O" +0x1f4c: "O" +0x1f4d: "O" +0x1f4e: "[?]" +0x1f4f: "[?]" +0x1f50: "u" +0x1f51: "u" +0x1f52: "u" +0x1f53: "u" +0x1f54: "u" +0x1f55: "u" +0x1f56: "u" +0x1f57: "u" +0x1f58: "[?]" +0x1f59: "U" +0x1f5a: "[?]" +0x1f5b: "U" +0x1f5c: "[?]" +0x1f5d: "U" +0x1f5e: "[?]" +0x1f5f: "U" +0x1f60: "o" +0x1f61: "o" +0x1f62: "o" +0x1f63: "o" +0x1f64: "o" +0x1f65: "o" +0x1f66: "o" +0x1f67: "o" +0x1f68: "O" +0x1f69: "O" +0x1f6a: "O" +0x1f6b: "O" +0x1f6c: "O" +0x1f6d: "O" +0x1f6e: "O" +0x1f6f: "O" +0x1f70: "a" +0x1f71: "a" +0x1f72: "e" +0x1f73: "e" +0x1f74: "e" +0x1f75: "e" +0x1f76: "i" +0x1f77: "i" +0x1f78: "o" +0x1f79: "o" +0x1f7a: "u" +0x1f7b: "u" +0x1f7c: "o" +0x1f7d: "o" +0x1f7e: "[?]" +0x1f7f: "[?]" +0x1f80: "a" +0x1f81: "a" +0x1f82: "a" +0x1f83: "a" +0x1f84: "a" +0x1f85: "a" +0x1f86: "a" +0x1f87: "a" +0x1f88: "A" +0x1f89: "A" +0x1f8a: "A" +0x1f8b: "A" +0x1f8c: "A" +0x1f8d: "A" +0x1f8e: "A" +0x1f8f: "A" +0x1f90: "e" +0x1f91: "e" +0x1f92: "e" +0x1f93: "e" +0x1f94: "e" +0x1f95: "e" +0x1f96: "e" +0x1f97: "e" +0x1f98: "E" +0x1f99: "E" +0x1f9a: "E" +0x1f9b: "E" +0x1f9c: "E" +0x1f9d: "E" +0x1f9e: "E" +0x1f9f: "E" +0x1fa0: "o" +0x1fa1: "o" +0x1fa2: "o" +0x1fa3: "o" +0x1fa4: "o" +0x1fa5: "o" +0x1fa6: "o" +0x1fa7: "o" +0x1fa8: "O" +0x1fa9: "O" +0x1faa: "O" +0x1fab: "O" +0x1fac: "O" +0x1fad: "O" +0x1fae: "O" +0x1faf: "O" +0x1fb0: "a" +0x1fb1: "a" +0x1fb2: "a" +0x1fb3: "a" +0x1fb4: "a" +0x1fb5: "[?]" +0x1fb6: "a" +0x1fb7: "a" +0x1fb8: "A" +0x1fb9: "A" +0x1fba: "A" +0x1fbb: "A" +0x1fbc: "A" +0x1fbd: "'" +0x1fbe: "i" +0x1fbf: "'" +0x1fc0: "~" +0x1fc1: "\"~" +0x1fc2: "e" +0x1fc3: "e" +0x1fc4: "e" +0x1fc5: "[?]" +0x1fc6: "e" +0x1fc7: "e" +0x1fc8: "E" +0x1fc9: "E" +0x1fca: "E" +0x1fcb: "E" +0x1fcc: "E" +0x1fcd: "'`" +0x1fce: "''" +0x1fcf: "'~" +0x1fd0: "i" +0x1fd1: "i" +0x1fd2: "i" +0x1fd3: "i" +0x1fd4: "[?]" +0x1fd5: "[?]" +0x1fd6: "i" +0x1fd7: "i" +0x1fd8: "I" +0x1fd9: "I" +0x1fda: "I" +0x1fdb: "I" +0x1fdc: "[?]" +0x1fdd: "`'" +0x1fde: "`'" +0x1fdf: "`~" +0x1fe0: "u" +0x1fe1: "u" +0x1fe2: "u" +0x1fe3: "u" +0x1fe4: "R" +0x1fe5: "R" +0x1fe6: "u" +0x1fe7: "u" +0x1fe8: "U" +0x1fe9: "U" +0x1fea: "U" +0x1feb: "U" +0x1fec: "R" +0x1fed: "\"`" +0x1fee: "\"'" +0x1fef: "`" +0x1ff0: "[?]" +0x1ff1: "[?]" +0x1ff2: "o" +0x1ff3: "o" +0x1ff4: "o" +0x1ff5: "[?]" +0x1ff6: "o" +0x1ff7: "o" +0x1ff8: "O" +0x1ff9: "O" +0x1ffa: "O" +0x1ffb: "O" +0x1ffc: "O" +0x1ffd: "'" +0x1ffe: "`" +/* x020 */ +0x2000: " " +0x2001: " " +0x2002: " " +0x2003: " " +0x2004: " " +0x2005: " " +0x2006: " " +0x2007: " " +0x2008: " " +0x2009: " " +0x200a: " " +0x200b: " " +0x200c: "" +0x200d: "" +0x200e: "" +0x200f: "" +0x2010: "-" +0x2011: "-" +0x2012: "-" +0x2013: "-" +0x2014: "--" +0x2015: "--" +0x2016: "||" +0x2017: "_" +0x2018: "'" +0x2019: "'" +0x201a: "," +0x201b: "'" +0x201c: "\"" +0x201d: "\"" +0x201e: ",," +0x201f: "\"" +0x2020: "+" +0x2021: "++" +0x2022: "*" +0x2023: "*>" +0x2024: "." +0x2025: ".." +0x2026: "..." +0x2027: "." +0x2028: "\n" +0x2029: "\n\n" +0x202a: "" +0x202b: "" +0x202c: "" +0x202d: "" +0x202e: "" +0x202f: " " +0x2030: "%0" +0x2031: "%00" +0x2032: "'" +0x2033: "''" +0x2034: "'''" +0x2035: "`" +0x2036: "``" +0x2037: "```" +0x2038: "^" +0x2039: "<" +0x203a: ">" +0x203b: "*" +0x203c: "!!" +0x203d: "!?" +0x203e: "-" +0x203f: "_" +0x2040: "-" +0x2041: "^" +0x2042: "***" +0x2043: "--" +0x2044: "/" +0x2045: "-[" +0x2046: "]-" +0x2047: "[?]" +0x2048: "?!" +0x2049: "!?" +0x204a: "7" +0x204b: "PP" +0x204c: "(]" +0x204d: "[)" +0x204e: "[?]" +0x204f: "[?]" +0x2050: "[?]" +0x2051: "[?]" +0x2052: "[?]" +0x2053: "[?]" +0x2054: "[?]" +0x2055: "[?]" +0x2056: "[?]" +0x2057: "[?]" +0x2058: "[?]" +0x2059: "[?]" +0x205a: "[?]" +0x205b: "[?]" +0x205c: "[?]" +0x205d: "[?]" +0x205e: "[?]" +0x205f: "[?]" +0x2060: "[?]" +0x2061: "[?]" +0x2062: "[?]" +0x2063: "[?]" +0x2064: "[?]" +0x2065: "[?]" +0x2066: "[?]" +0x2067: "[?]" +0x2068: "[?]" +0x2069: "[?]" +0x206a: "" +0x206b: "" +0x206c: "" +0x206d: "" +0x206e: "" +0x206f: "" +0x2070: "0" +0x2071: "" +0x2072: "" +0x2073: "" +0x2074: "4" +0x2075: "5" +0x2076: "6" +0x2077: "7" +0x2078: "8" +0x2079: "9" +0x207a: "+" +0x207b: "-" +0x207c: "=" +0x207d: "(" +0x207e: ")" +0x207f: "n" +0x2080: "0" +0x2081: "1" +0x2082: "2" +0x2083: "3" +0x2084: "4" +0x2085: "5" +0x2086: "6" +0x2087: "7" +0x2088: "8" +0x2089: "9" +0x208a: "+" +0x208b: "-" +0x208c: "=" +0x208d: "(" +0x208e: ")" +0x208f: "[?]" +0x2090: "[?]" +0x2091: "[?]" +0x2092: "[?]" +0x2093: "[?]" +0x2094: "[?]" +0x2095: "[?]" +0x2096: "[?]" +0x2097: "[?]" +0x2098: "[?]" +0x2099: "[?]" +0x209a: "[?]" +0x209b: "[?]" +0x209c: "[?]" +0x209d: "[?]" +0x209e: "[?]" +0x209f: "[?]" +0x20a0: "ECU" +0x20a1: "CL" +0x20a2: "Cr" +0x20a3: "FF" +0x20a4: "L" +0x20a5: "mil" +0x20a6: "N" +0x20a7: "Pts" +0x20a8: "Rs" +0x20a9: "W" +0x20aa: "NS" +0x20ab: "D" +0x20ac: "EU" +0x20ad: "K" +0x20ae: "T" +0x20af: "Dr" +0x20b0: "[?]" +0x20b1: "[?]" +0x20b2: "[?]" +0x20b3: "[?]" +0x20b4: "[?]" +0x20b5: "[?]" +0x20b6: "[?]" +0x20b7: "[?]" +0x20b8: "[?]" +0x20b9: "[?]" +0x20ba: "[?]" +0x20bb: "[?]" +0x20bc: "[?]" +0x20bd: "[?]" +0x20be: "[?]" +0x20bf: "[?]" +0x20c0: "[?]" +0x20c1: "[?]" +0x20c2: "[?]" +0x20c3: "[?]" +0x20c4: "[?]" +0x20c5: "[?]" +0x20c6: "[?]" +0x20c7: "[?]" +0x20c8: "[?]" +0x20c9: "[?]" +0x20ca: "[?]" +0x20cb: "[?]" +0x20cc: "[?]" +0x20cd: "[?]" +0x20ce: "[?]" +0x20cf: "[?]" +0x20d0: "" +0x20d1: "" +0x20d2: "" +0x20d3: "" +0x20d4: "" +0x20d5: "" +0x20d6: "" +0x20d7: "" +0x20d8: "" +0x20d9: "" +0x20da: "" +0x20db: "" +0x20dc: "" +0x20dd: "" +0x20de: "" +0x20df: "" +0x20e0: "" +0x20e1: "" +0x20e2: "" +0x20e3: "" +0x20e4: "[?]" +0x20e5: "[?]" +0x20e6: "[?]" +0x20e7: "[?]" +0x20e8: "[?]" +0x20e9: "[?]" +0x20ea: "[?]" +0x20eb: "[?]" +0x20ec: "[?]" +0x20ed: "[?]" +0x20ee: "[?]" +0x20ef: "[?]" +0x20f0: "[?]" +0x20f1: "[?]" +0x20f2: "[?]" +0x20f3: "[?]" +0x20f4: "[?]" +0x20f5: "[?]" +0x20f6: "[?]" +0x20f7: "[?]" +0x20f8: "[?]" +0x20f9: "[?]" +0x20fa: "[?]" +0x20fb: "[?]" +0x20fc: "[?]" +0x20fd: "[?]" +0x20fe: "[?]" +/* x021 */ +0x2100: "" +0x2101: "" +0x2102: "" +0x2103: "" +0x2104: "" +0x2105: "" +0x2106: "" +0x2107: "" +0x2108: "" +0x2109: "" +0x210a: "" +0x210b: "" +0x210c: "" +0x210d: "" +0x210e: "" +0x210f: "" +0x2110: "" +0x2111: "" +0x2112: "" +0x2113: "" +0x2114: "" +0x2115: "" +0x2116: "" +0x2117: "" +0x2118: "" +0x2119: "" +0x211a: "" +0x211b: "" +0x211c: "" +0x211d: "" +0x211e: "" +0x211f: "" +0x2120: "" +0x2121: "" +0x2122: "" +0x2123: "" +0x2124: "" +0x2125: "" +0x2126: "" +0x2127: "" +0x2128: "" +0x2129: "" +0x212a: "K" +0x212b: "A" +0x212c: "" +0x212d: "" +0x212e: "" +0x212f: "" +0x2130: "" +0x2131: "" +0x2132: "F" +0x2133: "" +0x2134: "" +0x2135: "" +0x2136: "" +0x2137: "" +0x2138: "" +0x2139: "" +0x213a: "" +0x213b: "[?]" +0x213c: "[?]" +0x213d: "[?]" +0x213e: "[?]" +0x213f: "[?]" +0x2140: "[?]" +0x2141: "[?]" +0x2142: "[?]" +0x2143: "[?]" +0x2144: "[?]" +0x2145: "[?]" +0x2146: "[?]" +0x2147: "[?]" +0x2148: "[?]" +0x2149: "[?]" +0x214a: "[?]" +0x214b: "[?]" +0x214c: "[?]" +0x214d: "[?]" +0x214e: "F" +0x214f: "[?]" +0x2150: "[?]" +0x2151: "[?]" +0x2152: "[?]" +0x2153: " 1/3 " +0x2154: " 2/3 " +0x2155: " 1/5 " +0x2156: " 2/5 " +0x2157: " 3/5 " +0x2158: " 4/5 " +0x2159: " 1/6 " +0x215a: " 5/6 " +0x215b: " 1/8 " +0x215c: " 3/8 " +0x215d: " 5/8 " +0x215e: " 7/8 " +0x215f: " 1/" +0x2160: "I" +0x2161: "II" +0x2162: "III" +0x2163: "IV" +0x2164: "V" +0x2165: "VI" +0x2166: "VII" +0x2167: "VIII" +0x2168: "IX" +0x2169: "X" +0x216a: "XI" +0x216b: "XII" +0x216c: "L" +0x216d: "C" +0x216e: "D" +0x216f: "M" +0x2170: "i" +0x2171: "ii" +0x2172: "iii" +0x2173: "iv" +0x2174: "v" +0x2175: "vi" +0x2176: "vii" +0x2177: "viii" +0x2178: "ix" +0x2179: "x" +0x217a: "xi" +0x217b: "xii" +0x217c: "l" +0x217d: "c" +0x217e: "d" +0x217f: "m" +0x2180: "(D" +0x2181: "D)" +0x2182: "((|))" +0x2183: ")" +0x2184: "[?]" +0x2185: "[?]" +0x2186: "[?]" +0x2187: "[?]" +0x2188: "[?]" +0x2189: "[?]" +0x218a: "[?]" +0x218b: "[?]" +0x218c: "[?]" +0x218d: "[?]" +0x218e: "[?]" +0x218f: "[?]" +0x2190: "-" +0x2191: "|" +0x2192: "-" +0x2193: "|" +0x2194: "-" +0x2195: "|" +0x2196: "\\" +0x2197: "/" +0x2198: "\\" +0x2199: "/" +0x219a: "-" +0x219b: "-" +0x219c: "~" +0x219d: "~" +0x219e: "-" +0x219f: "|" +0x21a0: "-" +0x21a1: "|" +0x21a2: "-" +0x21a3: "-" +0x21a4: "-" +0x21a5: "|" +0x21a6: "-" +0x21a7: "|" +0x21a8: "|" +0x21a9: "-" +0x21aa: "-" +0x21ab: "-" +0x21ac: "-" +0x21ad: "-" +0x21ae: "-" +0x21af: "|" +0x21b0: "|" +0x21b1: "|" +0x21b2: "|" +0x21b3: "|" +0x21b4: "|" +0x21b5: "|" +0x21b6: "^" +0x21b7: "V" +0x21b8: "\\" +0x21b9: "=" +0x21ba: "V" +0x21bb: "^" +0x21bc: "-" +0x21bd: "-" +0x21be: "|" +0x21bf: "|" +0x21c0: "-" +0x21c1: "-" +0x21c2: "|" +0x21c3: "|" +0x21c4: "=" +0x21c5: "|" +0x21c6: "=" +0x21c7: "=" +0x21c8: "|" +0x21c9: "=" +0x21ca: "|" +0x21cb: "=" +0x21cc: "=" +0x21cd: "=" +0x21ce: "=" +0x21cf: "=" +0x21d0: "=" +0x21d1: "|" +0x21d2: "=" +0x21d3: "|" +0x21d4: "=" +0x21d5: "|" +0x21d6: "\\" +0x21d7: "/" +0x21d8: "\\" +0x21d9: "/" +0x21da: "=" +0x21db: "=" +0x21dc: "~" +0x21dd: "~" +0x21de: "|" +0x21df: "|" +0x21e0: "-" +0x21e1: "|" +0x21e2: "-" +0x21e3: "|" +0x21e4: "-" +0x21e5: "-" +0x21e6: "-" +0x21e7: "|" +0x21e8: "-" +0x21e9: "|" +0x21ea: "|" +0x21eb: "|" +0x21ec: "|" +0x21ed: "|" +0x21ee: "|" +0x21ef: "|" +0x21f0: "-" +0x21f1: "\\" +0x21f2: "\\" +0x21f3: "|" +0x21f4: "[?]" +0x21f5: "[?]" +0x21f6: "[?]" +0x21f7: "[?]" +0x21f8: "[?]" +0x21f9: "[?]" +0x21fa: "[?]" +0x21fb: "[?]" +0x21fc: "[?]" +0x21fd: "[?]" +0x21fe: "[?]" +/* x022 */ +0x2200: "[?]" +0x2201: "[?]" +0x2202: "[?]" +0x2203: "[?]" +0x2204: "[?]" +0x2205: "[?]" +0x2206: "[?]" +0x2207: "[?]" +0x2208: "[?]" +0x2209: "[?]" +0x220a: "[?]" +0x220b: "[?]" +0x220c: "[?]" +0x220d: "[?]" +0x220e: "[?]" +0x220f: "[?]" +0x2210: "[?]" +0x2211: "[?]" +0x2212: "[?]" +0x2213: "[?]" +0x2214: "[?]" +0x2215: "[?]" +0x2216: "[?]" +0x2217: "[?]" +0x2218: "[?]" +0x2219: "[?]" +0x221a: "[?]" +0x221b: "[?]" +0x221c: "[?]" +0x221d: "[?]" +0x221e: "[?]" +0x221f: "[?]" +0x2220: "[?]" +0x2221: "[?]" +0x2222: "[?]" +0x2223: "[?]" +0x2224: "[?]" +0x2225: "[?]" +0x2226: "[?]" +0x2227: "[?]" +0x2228: "[?]" +0x2229: "[?]" +0x222a: "[?]" +0x222b: "[?]" +0x222c: "[?]" +0x222d: "[?]" +0x222e: "[?]" +0x222f: "[?]" +0x2230: "[?]" +0x2231: "[?]" +0x2232: "[?]" +0x2233: "[?]" +0x2234: "[?]" +0x2235: "[?]" +0x2236: "[?]" +0x2237: "[?]" +0x2238: "[?]" +0x2239: "[?]" +0x223a: "[?]" +0x223b: "[?]" +0x223c: "[?]" +0x223d: "[?]" +0x223e: "[?]" +0x223f: "[?]" +0x2240: "[?]" +0x2241: "[?]" +0x2242: "[?]" +0x2243: "[?]" +0x2244: "[?]" +0x2245: "[?]" +0x2246: "[?]" +0x2247: "[?]" +0x2248: "[?]" +0x2249: "[?]" +0x224a: "[?]" +0x224b: "[?]" +0x224c: "[?]" +0x224d: "[?]" +0x224e: "[?]" +0x224f: "[?]" +0x2250: "[?]" +0x2251: "[?]" +0x2252: "[?]" +0x2253: "[?]" +0x2254: "[?]" +0x2255: "[?]" +0x2256: "[?]" +0x2257: "[?]" +0x2258: "[?]" +0x2259: "[?]" +0x225a: "[?]" +0x225b: "[?]" +0x225c: "[?]" +0x225d: "[?]" +0x225e: "[?]" +0x225f: "[?]" +0x2260: "[?]" +0x2261: "[?]" +0x2262: "[?]" +0x2263: "[?]" +0x2264: "[?]" +0x2265: "[?]" +0x2266: "[?]" +0x2267: "[?]" +0x2268: "[?]" +0x2269: "[?]" +0x226a: "[?]" +0x226b: "[?]" +0x226c: "[?]" +0x226d: "[?]" +0x226e: "[?]" +0x226f: "[?]" +0x2270: "[?]" +0x2271: "[?]" +0x2272: "[?]" +0x2273: "[?]" +0x2274: "[?]" +0x2275: "[?]" +0x2276: "[?]" +0x2277: "[?]" +0x2278: "[?]" +0x2279: "[?]" +0x227a: "[?]" +0x227b: "[?]" +0x227c: "[?]" +0x227d: "[?]" +0x227e: "[?]" +0x227f: "[?]" +0x2280: "[?]" +0x2281: "[?]" +0x2282: "[?]" +0x2283: "[?]" +0x2284: "[?]" +0x2285: "[?]" +0x2286: "[?]" +0x2287: "[?]" +0x2288: "[?]" +0x2289: "[?]" +0x228a: "[?]" +0x228b: "[?]" +0x228c: "[?]" +0x228d: "[?]" +0x228e: "[?]" +0x228f: "[?]" +0x2290: "[?]" +0x2291: "[?]" +0x2292: "[?]" +0x2293: "[?]" +0x2294: "[?]" +0x2295: "[?]" +0x2296: "[?]" +0x2297: "[?]" +0x2298: "[?]" +0x2299: "[?]" +0x229a: "[?]" +0x229b: "[?]" +0x229c: "[?]" +0x229d: "[?]" +0x229e: "[?]" +0x229f: "[?]" +0x22a0: "[?]" +0x22a1: "[?]" +0x22a2: "[?]" +0x22a3: "[?]" +0x22a4: "[?]" +0x22a5: "[?]" +0x22a6: "[?]" +0x22a7: "[?]" +0x22a8: "[?]" +0x22a9: "[?]" +0x22aa: "[?]" +0x22ab: "[?]" +0x22ac: "[?]" +0x22ad: "[?]" +0x22ae: "[?]" +0x22af: "[?]" +0x22b0: "[?]" +0x22b1: "[?]" +0x22b2: "[?]" +0x22b3: "[?]" +0x22b4: "[?]" +0x22b5: "[?]" +0x22b6: "[?]" +0x22b7: "[?]" +0x22b8: "[?]" +0x22b9: "[?]" +0x22ba: "[?]" +0x22bb: "[?]" +0x22bc: "[?]" +0x22bd: "[?]" +0x22be: "[?]" +0x22bf: "[?]" +0x22c0: "[?]" +0x22c1: "[?]" +0x22c2: "[?]" +0x22c3: "[?]" +0x22c4: "[?]" +0x22c5: "[?]" +0x22c6: "[?]" +0x22c7: "[?]" +0x22c8: "[?]" +0x22c9: "[?]" +0x22ca: "[?]" +0x22cb: "[?]" +0x22cc: "[?]" +0x22cd: "[?]" +0x22ce: "[?]" +0x22cf: "[?]" +0x22d0: "[?]" +0x22d1: "[?]" +0x22d2: "[?]" +0x22d3: "[?]" +0x22d4: "[?]" +0x22d5: "[?]" +0x22d6: "[?]" +0x22d7: "[?]" +0x22d8: "[?]" +0x22d9: "[?]" +0x22da: "[?]" +0x22db: "[?]" +0x22dc: "[?]" +0x22dd: "[?]" +0x22de: "[?]" +0x22df: "[?]" +0x22e0: "[?]" +0x22e1: "[?]" +0x22e2: "[?]" +0x22e3: "[?]" +0x22e4: "[?]" +0x22e5: "[?]" +0x22e6: "[?]" +0x22e7: "[?]" +0x22e8: "[?]" +0x22e9: "[?]" +0x22ea: "[?]" +0x22eb: "[?]" +0x22ec: "[?]" +0x22ed: "[?]" +0x22ee: "[?]" +0x22ef: "[?]" +0x22f0: "[?]" +0x22f1: "[?]" +0x22f2: "[?]" +0x22f3: "[?]" +0x22f4: "[?]" +0x22f5: "[?]" +0x22f6: "[?]" +0x22f7: "[?]" +0x22f8: "[?]" +0x22f9: "[?]" +0x22fa: "[?]" +0x22fb: "[?]" +0x22fc: "[?]" +0x22fd: "[?]" +0x22fe: "[?]" +/* x023 */ +0x2300: "[?]" +0x2301: "[?]" +0x2302: "[?]" +0x2303: "[?]" +0x2304: "[?]" +0x2305: "[?]" +0x2306: "[?]" +0x2307: "[?]" +0x2308: "[?]" +0x2309: "[?]" +0x230a: "[?]" +0x230b: "[?]" +0x230c: "[?]" +0x230d: "[?]" +0x230e: "[?]" +0x230f: "[?]" +0x2310: "[?]" +0x2311: "[?]" +0x2312: "[?]" +0x2313: "[?]" +0x2314: "[?]" +0x2315: "[?]" +0x2316: "[?]" +0x2317: "[?]" +0x2318: "[?]" +0x2319: "[?]" +0x231a: "[?]" +0x231b: "[?]" +0x231c: "[?]" +0x231d: "[?]" +0x231e: "[?]" +0x231f: "[?]" +0x2320: "[?]" +0x2321: "[?]" +0x2322: "[?]" +0x2323: "[?]" +0x2324: "[?]" +0x2325: "[?]" +0x2326: "[?]" +0x2327: "[?]" +0x2328: "[?]" +0x2329: "[?]" +0x232a: "[?]" +0x232b: "[?]" +0x232c: "[?]" +0x232d: "[?]" +0x232e: "[?]" +0x232f: "[?]" +0x2330: "[?]" +0x2331: "[?]" +0x2332: "[?]" +0x2333: "[?]" +0x2334: "[?]" +0x2335: "[?]" +0x2336: "[?]" +0x2337: "[?]" +0x2338: "[?]" +0x2339: "[?]" +0x233a: "[?]" +0x233b: "[?]" +0x233c: "[?]" +0x233d: "[?]" +0x233e: "[?]" +0x233f: "[?]" +0x2340: "[?]" +0x2341: "[?]" +0x2342: "[?]" +0x2343: "[?]" +0x2344: "[?]" +0x2345: "[?]" +0x2346: "[?]" +0x2347: "[?]" +0x2348: "[?]" +0x2349: "[?]" +0x234a: "[?]" +0x234b: "[?]" +0x234c: "[?]" +0x234d: "[?]" +0x234e: "[?]" +0x234f: "[?]" +0x2350: "[?]" +0x2351: "[?]" +0x2352: "[?]" +0x2353: "[?]" +0x2354: "[?]" +0x2355: "[?]" +0x2356: "[?]" +0x2357: "[?]" +0x2358: "[?]" +0x2359: "[?]" +0x235a: "[?]" +0x235b: "[?]" +0x235c: "[?]" +0x235d: "[?]" +0x235e: "[?]" +0x235f: "[?]" +0x2360: "[?]" +0x2361: "[?]" +0x2362: "[?]" +0x2363: "[?]" +0x2364: "[?]" +0x2365: "[?]" +0x2366: "[?]" +0x2367: "[?]" +0x2368: "[?]" +0x2369: "[?]" +0x236a: "[?]" +0x236b: "[?]" +0x236c: "[?]" +0x236d: "[?]" +0x236e: "[?]" +0x236f: "[?]" +0x2370: "[?]" +0x2371: "[?]" +0x2372: "[?]" +0x2373: "[?]" +0x2374: "[?]" +0x2375: "[?]" +0x2376: "[?]" +0x2377: "[?]" +0x2378: "[?]" +0x2379: "[?]" +0x237a: "[?]" +0x237b: "[?]" +0x237c: "[?]" +0x237d: "[?]" +0x237e: "[?]" +0x237f: "[?]" +0x2380: "[?]" +0x2381: "[?]" +0x2382: "[?]" +0x2383: "[?]" +0x2384: "[?]" +0x2385: "[?]" +0x2386: "[?]" +0x2387: "[?]" +0x2388: "[?]" +0x2389: "[?]" +0x238a: "[?]" +0x238b: "[?]" +0x238c: "[?]" +0x238d: "[?]" +0x238e: "[?]" +0x238f: "[?]" +0x2390: "[?]" +0x2391: "[?]" +0x2392: "[?]" +0x2393: "[?]" +0x2394: "[?]" +0x2395: "[?]" +0x2396: "[?]" +0x2397: "[?]" +0x2398: "[?]" +0x2399: "[?]" +0x239a: "[?]" +0x239b: "[?]" +0x239c: "[?]" +0x239d: "[?]" +0x239e: "[?]" +0x239f: "[?]" +0x23a0: "[?]" +0x23a1: "[?]" +0x23a2: "[?]" +0x23a3: "[?]" +0x23a4: "[?]" +0x23a5: "[?]" +0x23a6: "[?]" +0x23a7: "[?]" +0x23a8: "[?]" +0x23a9: "[?]" +0x23aa: "[?]" +0x23ab: "[?]" +0x23ac: "[?]" +0x23ad: "[?]" +0x23ae: "[?]" +0x23af: "[?]" +0x23b0: "[?]" +0x23b1: "[?]" +0x23b2: "[?]" +0x23b3: "[?]" +0x23b4: "[?]" +0x23b5: "[?]" +0x23b6: "[?]" +0x23b7: "[?]" +0x23b8: "[?]" +0x23b9: "[?]" +0x23ba: "[?]" +0x23bb: "[?]" +0x23bc: "[?]" +0x23bd: "[?]" +0x23be: "[?]" +0x23bf: "[?]" +0x23c0: "[?]" +0x23c1: "[?]" +0x23c2: "[?]" +0x23c3: "[?]" +0x23c4: "[?]" +0x23c5: "[?]" +0x23c6: "[?]" +0x23c7: "[?]" +0x23c8: "[?]" +0x23c9: "[?]" +0x23ca: "[?]" +0x23cb: "[?]" +0x23cc: "[?]" +0x23cd: "[?]" +0x23ce: "[?]" +0x23cf: "[?]" +0x23d0: "[?]" +0x23d1: "[?]" +0x23d2: "[?]" +0x23d3: "[?]" +0x23d4: "[?]" +0x23d5: "[?]" +0x23d6: "[?]" +0x23d7: "[?]" +0x23d8: "[?]" +0x23d9: "[?]" +0x23da: "[?]" +0x23db: "[?]" +0x23dc: "[?]" +0x23dd: "[?]" +0x23de: "[?]" +0x23df: "[?]" +0x23e0: "[?]" +0x23e1: "[?]" +0x23e2: "[?]" +0x23e3: "[?]" +0x23e4: "[?]" +0x23e5: "[?]" +0x23e6: "[?]" +0x23e7: "[?]" +0x23e8: "[?]" +0x23e9: "[?]" +0x23ea: "[?]" +0x23eb: "[?]" +0x23ec: "[?]" +0x23ed: "[?]" +0x23ee: "[?]" +0x23ef: "[?]" +0x23f0: "[?]" +0x23f1: "[?]" +0x23f2: "[?]" +0x23f3: "[?]" +0x23f4: "[?]" +0x23f5: "[?]" +0x23f6: "[?]" +0x23f7: "[?]" +0x23f8: "[?]" +0x23f9: "[?]" +0x23fa: "[?]" +0x23fb: "[?]" +0x23fc: "[?]" +0x23fd: "[?]" +0x23fe: "[?]" +/* x024 */ +0x2400: "" +0x2401: "" +0x2402: "" +0x2403: "" +0x2404: "" +0x2405: "" +0x2406: "" +0x2407: "" +0x2408: "" +0x2409: "" +0x240a: "" +0x240b: "" +0x240c: "" +0x240d: "" +0x240e: "" +0x240f: "" +0x2410: "" +0x2411: "" +0x2412: "" +0x2413: "" +0x2414: "" +0x2415: "" +0x2416: "" +0x2417: "" +0x2418: "" +0x2419: "" +0x241a: "" +0x241b: "" +0x241c: "" +0x241d: "" +0x241e: "" +0x241f: "" +0x2420: "" +0x2421: "" +0x2422: "" +0x2423: "" +0x2424: "" +0x2425: "" +0x2426: "" +0x2427: "[?]" +0x2428: "[?]" +0x2429: "[?]" +0x242a: "[?]" +0x242b: "[?]" +0x242c: "[?]" +0x242d: "[?]" +0x242e: "[?]" +0x242f: "[?]" +0x2430: "[?]" +0x2431: "[?]" +0x2432: "[?]" +0x2433: "[?]" +0x2434: "[?]" +0x2435: "[?]" +0x2436: "[?]" +0x2437: "[?]" +0x2438: "[?]" +0x2439: "[?]" +0x243a: "[?]" +0x243b: "[?]" +0x243c: "[?]" +0x243d: "[?]" +0x243e: "[?]" +0x243f: "[?]" +0x2440: "" +0x2441: "" +0x2442: "" +0x2443: "" +0x2444: "" +0x2445: "" +0x2446: "" +0x2447: "" +0x2448: "" +0x2449: "" +0x244a: "" +0x244b: "[?]" +0x244c: "[?]" +0x244d: "[?]" +0x244e: "[?]" +0x244f: "[?]" +0x2450: "[?]" +0x2451: "[?]" +0x2452: "[?]" +0x2453: "[?]" +0x2454: "[?]" +0x2455: "[?]" +0x2456: "[?]" +0x2457: "[?]" +0x2458: "[?]" +0x2459: "[?]" +0x245a: "[?]" +0x245b: "[?]" +0x245c: "[?]" +0x245d: "[?]" +0x245e: "[?]" +0x245f: "[?]" +0x2460: "" +0x2461: "" +0x2462: "" +0x2463: "" +0x2464: "" +0x2465: "" +0x2466: "" +0x2467: "" +0x2468: "" +0x2469: "" +0x246a: "" +0x246b: "" +0x246c: "" +0x246d: "" +0x246e: "" +0x246f: "" +0x2470: "" +0x2471: "" +0x2472: "" +0x2473: "" +0x2474: "" +0x2475: "" +0x2476: "" +0x2477: "" +0x2478: "" +0x2479: "" +0x247a: "" +0x247b: "" +0x247c: "" +0x247d: "" +0x247e: "" +0x247f: "" +0x2480: "" +0x2481: "" +0x2482: "" +0x2483: "" +0x2484: "" +0x2485: "" +0x2486: "" +0x2487: "" +0x2488: "" +0x2489: "" +0x248a: "" +0x248b: "" +0x248c: "" +0x248d: "" +0x248e: "" +0x248f: "" +0x2490: "" +0x2491: "" +0x2492: "" +0x2493: "" +0x2494: "" +0x2495: "" +0x2496: "" +0x2497: "" +0x2498: "" +0x2499: "" +0x249a: "" +0x249b: "" +0x249c: "" +0x249d: "" +0x249e: "" +0x249f: "" +0x24a0: "" +0x24a1: "" +0x24a2: "" +0x24a3: "" +0x24a4: "" +0x24a5: "" +0x24a6: "" +0x24a7: "" +0x24a8: "" +0x24a9: "" +0x24aa: "" +0x24ab: "" +0x24ac: "" +0x24ad: "" +0x24ae: "" +0x24af: "" +0x24b0: "" +0x24b1: "" +0x24b2: "" +0x24b3: "" +0x24b4: "" +0x24b5: "" +0x24b6: "" +0x24b7: "" +0x24b8: "" +0x24b9: "" +0x24ba: "" +0x24bb: "" +0x24bc: "" +0x24bd: "" +0x24be: "" +0x24bf: "" +0x24c0: "" +0x24c1: "" +0x24c2: "" +0x24c3: "" +0x24c4: "" +0x24c5: "" +0x24c6: "" +0x24c7: "" +0x24c8: "" +0x24c9: "" +0x24ca: "" +0x24cb: "" +0x24cc: "" +0x24cd: "" +0x24ce: "" +0x24cf: "" +0x24d0: "a" +0x24d1: "b" +0x24d2: "c" +0x24d3: "d" +0x24d4: "e" +0x24d5: "f" +0x24d6: "g" +0x24d7: "h" +0x24d8: "i" +0x24d9: "j" +0x24da: "k" +0x24db: "l" +0x24dc: "m" +0x24dd: "n" +0x24de: "o" +0x24df: "p" +0x24e0: "q" +0x24e1: "r" +0x24e2: "s" +0x24e3: "t" +0x24e4: "u" +0x24e5: "v" +0x24e6: "w" +0x24e7: "x" +0x24e8: "y" +0x24e9: "z" +0x24ea: "0" +0x24eb: "[?]" +0x24ec: "[?]" +0x24ed: "[?]" +0x24ee: "[?]" +0x24ef: "[?]" +0x24f0: "[?]" +0x24f1: "[?]" +0x24f2: "[?]" +0x24f3: "[?]" +0x24f4: "[?]" +0x24f5: "[?]" +0x24f6: "[?]" +0x24f7: "[?]" +0x24f8: "[?]" +0x24f9: "[?]" +0x24fa: "[?]" +0x24fb: "[?]" +0x24fc: "[?]" +0x24fd: "[?]" +0x24fe: "[?]" +/* x025 */ +0x2500: "-" +0x2501: "-" +0x2502: "|" +0x2503: "|" +0x2504: "-" +0x2505: "-" +0x2506: "|" +0x2507: "|" +0x2508: "-" +0x2509: "-" +0x250a: "|" +0x250b: "|" +0x250c: "+" +0x250d: "+" +0x250e: "+" +0x250f: "+" +0x2510: "+" +0x2511: "+" +0x2512: "+" +0x2513: "+" +0x2514: "+" +0x2515: "+" +0x2516: "+" +0x2517: "+" +0x2518: "+" +0x2519: "+" +0x251a: "+" +0x251b: "+" +0x251c: "+" +0x251d: "+" +0x251e: "+" +0x251f: "+" +0x2520: "+" +0x2521: "+" +0x2522: "+" +0x2523: "+" +0x2524: "+" +0x2525: "+" +0x2526: "+" +0x2527: "+" +0x2528: "+" +0x2529: "+" +0x252a: "+" +0x252b: "+" +0x252c: "+" +0x252d: "+" +0x252e: "+" +0x252f: "+" +0x2530: "+" +0x2531: "+" +0x2532: "+" +0x2533: "+" +0x2534: "+" +0x2535: "+" +0x2536: "+" +0x2537: "+" +0x2538: "+" +0x2539: "+" +0x253a: "+" +0x253b: "+" +0x253c: "+" +0x253d: "+" +0x253e: "+" +0x253f: "+" +0x2540: "+" +0x2541: "+" +0x2542: "+" +0x2543: "+" +0x2544: "+" +0x2545: "+" +0x2546: "+" +0x2547: "+" +0x2548: "+" +0x2549: "+" +0x254a: "+" +0x254b: "+" +0x254c: "-" +0x254d: "-" +0x254e: "|" +0x254f: "|" +0x2550: "-" +0x2551: "|" +0x2552: "+" +0x2553: "+" +0x2554: "+" +0x2555: "+" +0x2556: "+" +0x2557: "+" +0x2558: "+" +0x2559: "+" +0x255a: "+" +0x255b: "+" +0x255c: "+" +0x255d: "+" +0x255e: "+" +0x255f: "+" +0x2560: "+" +0x2561: "+" +0x2562: "+" +0x2563: "+" +0x2564: "+" +0x2565: "+" +0x2566: "+" +0x2567: "+" +0x2568: "+" +0x2569: "+" +0x256a: "+" +0x256b: "+" +0x256c: "+" +0x256d: "+" +0x256e: "+" +0x256f: "+" +0x2570: "+" +0x2571: "/" +0x2572: "\\" +0x2573: "X" +0x2574: "-" +0x2575: "|" +0x2576: "-" +0x2577: "|" +0x2578: "-" +0x2579: "|" +0x257a: "-" +0x257b: "|" +0x257c: "-" +0x257d: "|" +0x257e: "-" +0x257f: "|" +0x2580: "#" +0x2581: "#" +0x2582: "#" +0x2583: "#" +0x2584: "#" +0x2585: "#" +0x2586: "#" +0x2587: "#" +0x2588: "#" +0x2589: "#" +0x258a: "#" +0x258b: "#" +0x258c: "#" +0x258d: "#" +0x258e: "#" +0x258f: "#" +0x2590: "#" +0x2591: "#" +0x2592: "#" +0x2593: "#" +0x2594: "-" +0x2595: "|" +0x2596: "[?]" +0x2597: "[?]" +0x2598: "[?]" +0x2599: "[?]" +0x259a: "[?]" +0x259b: "[?]" +0x259c: "[?]" +0x259d: "[?]" +0x259e: "[?]" +0x259f: "[?]" +0x25a0: "#" +0x25a1: "#" +0x25a2: "#" +0x25a3: "#" +0x25a4: "#" +0x25a5: "#" +0x25a6: "#" +0x25a7: "#" +0x25a8: "#" +0x25a9: "#" +0x25aa: "#" +0x25ab: "#" +0x25ac: "#" +0x25ad: "#" +0x25ae: "#" +0x25af: "#" +0x25b0: "#" +0x25b1: "#" +0x25b2: "^" +0x25b3: "^" +0x25b4: "^" +0x25b5: "^" +0x25b6: ">" +0x25b7: ">" +0x25b8: ">" +0x25b9: ">" +0x25ba: ">" +0x25bb: ">" +0x25bc: "V" +0x25bd: "V" +0x25be: "V" +0x25bf: "V" +0x25c0: "<" +0x25c1: "<" +0x25c2: "<" +0x25c3: "<" +0x25c4: "<" +0x25c5: "<" +0x25c6: "*" +0x25c7: "*" +0x25c8: "*" +0x25c9: "*" +0x25ca: "*" +0x25cb: "*" +0x25cc: "*" +0x25cd: "*" +0x25ce: "*" +0x25cf: "*" +0x25d0: "*" +0x25d1: "*" +0x25d2: "*" +0x25d3: "*" +0x25d4: "*" +0x25d5: "*" +0x25d6: "*" +0x25d7: "*" +0x25d8: "*" +0x25d9: "*" +0x25da: "*" +0x25db: "*" +0x25dc: "*" +0x25dd: "*" +0x25de: "*" +0x25df: "*" +0x25e0: "*" +0x25e1: "*" +0x25e2: "*" +0x25e3: "*" +0x25e4: "*" +0x25e5: "*" +0x25e6: "*" +0x25e7: "#" +0x25e8: "#" +0x25e9: "#" +0x25ea: "#" +0x25eb: "#" +0x25ec: "^" +0x25ed: "^" +0x25ee: "^" +0x25ef: "O" +0x25f0: "#" +0x25f1: "#" +0x25f2: "#" +0x25f3: "#" +0x25f4: "#" +0x25f5: "#" +0x25f6: "#" +0x25f7: "#" +0x25f8: "[?]" +0x25f9: "[?]" +0x25fa: "[?]" +0x25fb: "[?]" +0x25fc: "[?]" +0x25fd: "[?]" +0x25fe: "[?]" +/* x026 */ +0x2600: "" +0x2601: "" +0x2602: "" +0x2603: "" +0x2604: "" +0x2605: "" +0x2606: "" +0x2607: "" +0x2608: "" +0x2609: "" +0x260a: "" +0x260b: "" +0x260c: "" +0x260d: "" +0x260e: "" +0x260f: "" +0x2610: "" +0x2611: "" +0x2612: "" +0x2613: "" +0x2614: "[?]" +0x2615: "[?]" +0x2616: "[?]" +0x2617: "[?]" +0x2618: "[?]" +0x2619: "" +0x261a: "" +0x261b: "" +0x261c: "" +0x261d: "" +0x261e: "" +0x261f: "" +0x2620: "" +0x2621: "" +0x2622: "" +0x2623: "" +0x2624: "" +0x2625: "" +0x2626: "" +0x2627: "" +0x2628: "" +0x2629: "" +0x262a: "" +0x262b: "" +0x262c: "" +0x262d: "" +0x262e: "" +0x262f: "" +0x2630: "" +0x2631: "" +0x2632: "" +0x2633: "" +0x2634: "" +0x2635: "" +0x2636: "" +0x2637: "" +0x2638: "" +0x2639: "" +0x263a: "" +0x263b: "" +0x263c: "" +0x263d: "" +0x263e: "" +0x263f: "" +0x2640: "" +0x2641: "" +0x2642: "" +0x2643: "" +0x2644: "" +0x2645: "" +0x2646: "" +0x2647: "" +0x2648: "" +0x2649: "" +0x264a: "" +0x264b: "" +0x264c: "" +0x264d: "" +0x264e: "" +0x264f: "" +0x2650: "" +0x2651: "" +0x2652: "" +0x2653: "" +0x2654: "" +0x2655: "" +0x2656: "" +0x2657: "" +0x2658: "" +0x2659: "" +0x265a: "" +0x265b: "" +0x265c: "" +0x265d: "" +0x265e: "" +0x265f: "" +0x2660: "" +0x2661: "" +0x2662: "" +0x2663: "" +0x2664: "" +0x2665: "" +0x2666: "" +0x2667: "" +0x2668: "" +0x2669: "" +0x266a: "" +0x266b: "" +0x266c: "" +0x266d: "" +0x266e: "" +0x266f: "" +0x2670: "" +0x2671: "" +0x2672: "[?]" +0x2673: "[?]" +0x2674: "[?]" +0x2675: "[?]" +0x2676: "[?]" +0x2677: "[?]" +0x2678: "[?]" +0x2679: "[?]" +0x267a: "[?]" +0x267b: "[?]" +0x267c: "[?]" +0x267d: "[?]" +0x267e: "[?]" +0x267f: "[?]" +0x2680: "[?]" +0x2681: "[?]" +0x2682: "[?]" +0x2683: "[?]" +0x2684: "[?]" +0x2685: "[?]" +0x2686: "[?]" +0x2687: "[?]" +0x2688: "[?]" +0x2689: "[?]" +0x268a: "[?]" +0x268b: "[?]" +0x268c: "[?]" +0x268d: "[?]" +0x268e: "[?]" +0x268f: "[?]" +0x2690: "[?]" +0x2691: "[?]" +0x2692: "[?]" +0x2693: "[?]" +0x2694: "[?]" +0x2695: "[?]" +0x2696: "[?]" +0x2697: "[?]" +0x2698: "[?]" +0x2699: "[?]" +0x269a: "[?]" +0x269b: "[?]" +0x269c: "[?]" +0x269d: "[?]" +0x269e: "[?]" +0x269f: "[?]" +0x26a0: "[?]" +0x26a1: "[?]" +0x26a2: "[?]" +0x26a3: "[?]" +0x26a4: "[?]" +0x26a5: "[?]" +0x26a6: "[?]" +0x26a7: "[?]" +0x26a8: "[?]" +0x26a9: "[?]" +0x26aa: "[?]" +0x26ab: "[?]" +0x26ac: "[?]" +0x26ad: "[?]" +0x26ae: "[?]" +0x26af: "[?]" +0x26b0: "[?]" +0x26b1: "[?]" +0x26b2: "[?]" +0x26b3: "[?]" +0x26b4: "[?]" +0x26b5: "[?]" +0x26b6: "[?]" +0x26b7: "[?]" +0x26b8: "[?]" +0x26b9: "[?]" +0x26ba: "[?]" +0x26bb: "[?]" +0x26bc: "[?]" +0x26bd: "[?]" +0x26be: "[?]" +0x26bf: "[?]" +0x26c0: "[?]" +0x26c1: "[?]" +0x26c2: "[?]" +0x26c3: "[?]" +0x26c4: "[?]" +0x26c5: "[?]" +0x26c6: "[?]" +0x26c7: "[?]" +0x26c8: "[?]" +0x26c9: "[?]" +0x26ca: "[?]" +0x26cb: "[?]" +0x26cc: "[?]" +0x26cd: "[?]" +0x26ce: "[?]" +0x26cf: "[?]" +0x26d0: "[?]" +0x26d1: "[?]" +0x26d2: "[?]" +0x26d3: "[?]" +0x26d4: "[?]" +0x26d5: "[?]" +0x26d6: "[?]" +0x26d7: "[?]" +0x26d8: "[?]" +0x26d9: "[?]" +0x26da: "[?]" +0x26db: "[?]" +0x26dc: "[?]" +0x26dd: "[?]" +0x26de: "[?]" +0x26df: "[?]" +0x26e0: "[?]" +0x26e1: "[?]" +0x26e2: "[?]" +0x26e3: "[?]" +0x26e4: "[?]" +0x26e5: "[?]" +0x26e6: "[?]" +0x26e7: "[?]" +0x26e8: "[?]" +0x26e9: "[?]" +0x26ea: "[?]" +0x26eb: "[?]" +0x26ec: "[?]" +0x26ed: "[?]" +0x26ee: "[?]" +0x26ef: "[?]" +0x26f0: "[?]" +0x26f1: "[?]" +0x26f2: "[?]" +0x26f3: "[?]" +0x26f4: "[?]" +0x26f5: "[?]" +0x26f6: "[?]" +0x26f7: "[?]" +0x26f8: "[?]" +0x26f9: "[?]" +0x26fa: "[?]" +0x26fb: "[?]" +0x26fc: "[?]" +0x26fd: "[?]" +0x26fe: "[?]" +/* x027 */ +0x2700: "[?]" +0x2701: "" +0x2702: "" +0x2703: "" +0x2704: "" +0x2705: "" +0x2706: "" +0x2707: "" +0x2708: "" +0x2709: "" +0x270a: "" +0x270b: "" +0x270c: "" +0x270d: "" +0x270e: "" +0x270f: "" +0x2710: "" +0x2711: "" +0x2712: "" +0x2713: "" +0x2714: "" +0x2715: "" +0x2716: "" +0x2717: "" +0x2718: "" +0x2719: "" +0x271a: "" +0x271b: "" +0x271c: "" +0x271d: "" +0x271e: "" +0x271f: "" +0x2720: "" +0x2721: "" +0x2722: "" +0x2723: "" +0x2724: "" +0x2725: "" +0x2726: "" +0x2727: "" +0x2728: "" +0x2729: "" +0x272a: "" +0x272b: "" +0x272c: "" +0x272d: "" +0x272e: "" +0x272f: "" +0x2730: "" +0x2731: "" +0x2732: "" +0x2733: "" +0x2734: "" +0x2735: "" +0x2736: "" +0x2737: "" +0x2738: "" +0x2739: "" +0x273a: "" +0x273b: "" +0x273c: "" +0x273d: "" +0x273e: "" +0x273f: "" +0x2740: "" +0x2741: "" +0x2742: "" +0x2743: "" +0x2744: "" +0x2745: "" +0x2746: "" +0x2747: "" +0x2748: "" +0x2749: "" +0x274a: "" +0x274b: "" +0x274c: "" +0x274d: "" +0x274e: "" +0x274f: "" +0x2750: "" +0x2751: "" +0x2752: "" +0x2753: "" +0x2754: "" +0x2755: "" +0x2756: "" +0x2757: "" +0x2758: "" +0x2759: "" +0x275a: "" +0x275b: "" +0x275c: "" +0x275d: "" +0x275e: "" +0x275f: "[?]" +0x2760: "[?]" +0x2761: "" +0x2762: "" +0x2763: "" +0x2764: "" +0x2765: "" +0x2766: "" +0x2767: "" +0x2768: "" +0x2769: "" +0x276a: "" +0x276b: "" +0x276c: "" +0x276d: "" +0x276e: "" +0x276f: "" +0x2770: "" +0x2771: "" +0x2772: "" +0x2773: "" +0x2774: "" +0x2775: "" +0x2776: "" +0x2777: "" +0x2778: "" +0x2779: "" +0x277a: "" +0x277b: "" +0x277c: "" +0x277d: "" +0x277e: "" +0x277f: "" +0x2780: "" +0x2781: "" +0x2782: "" +0x2783: "" +0x2784: "" +0x2785: "" +0x2786: "" +0x2787: "" +0x2788: "" +0x2789: "" +0x278a: "" +0x278b: "" +0x278c: "" +0x278d: "" +0x278e: "" +0x278f: "" +0x2790: "" +0x2791: "" +0x2792: "" +0x2793: "" +0x2794: "" +0x2795: "" +0x2796: "" +0x2797: "" +0x2798: "" +0x2799: "" +0x279a: "" +0x279b: "" +0x279c: "" +0x279d: "" +0x279e: "" +0x279f: "" +0x27a0: "" +0x27a1: "" +0x27a2: "" +0x27a3: "" +0x27a4: "" +0x27a5: "" +0x27a6: "" +0x27a7: "" +0x27a8: "" +0x27a9: "" +0x27aa: "" +0x27ab: "" +0x27ac: "" +0x27ad: "" +0x27ae: "" +0x27af: "" +0x27b0: "[?]" +0x27b1: "" +0x27b2: "" +0x27b3: "" +0x27b4: "" +0x27b5: "" +0x27b6: "" +0x27b7: "" +0x27b8: "" +0x27b9: "" +0x27ba: "" +0x27bb: "" +0x27bc: "" +0x27bd: "" +0x27be: "" +0x27bf: "[?]" +0x27c0: "[?]" +0x27c1: "[?]" +0x27c2: "[?]" +0x27c3: "[?]" +0x27c4: "[?]" +0x27c5: "[?]" +0x27c6: "[?]" +0x27c7: "[?]" +0x27c8: "[?]" +0x27c9: "[?]" +0x27ca: "[?]" +0x27cb: "[?]" +0x27cc: "[?]" +0x27cd: "[?]" +0x27ce: "[?]" +0x27cf: "[?]" +0x27d0: "[?]" +0x27d1: "[?]" +0x27d2: "[?]" +0x27d3: "[?]" +0x27d4: "[?]" +0x27d5: "[?]" +0x27d6: "[?]" +0x27d7: "[?]" +0x27d8: "[?]" +0x27d9: "[?]" +0x27da: "[?]" +0x27db: "[?]" +0x27dc: "[?]" +0x27dd: "[?]" +0x27de: "[?]" +0x27df: "[?]" +0x27e0: "[?]" +0x27e1: "[?]" +0x27e2: "[?]" +0x27e3: "[?]" +0x27e4: "[?]" +0x27e5: "[?]" +0x27e6: "[?]" +0x27e7: "[?]" +0x27e8: "[?]" +0x27e9: "[?]" +0x27ea: "[?]" +0x27eb: "[?]" +0x27ec: "[?]" +0x27ed: "[?]" +0x27ee: "[?]" +0x27ef: "[?]" +0x27f0: "[?]" +0x27f1: "[?]" +0x27f2: "[?]" +0x27f3: "[?]" +0x27f4: "[?]" +0x27f5: "[?]" +0x27f6: "[?]" +0x27f7: "[?]" +0x27f8: "[?]" +0x27f9: "[?]" +0x27fa: "[?]" +0x27fb: "[?]" +0x27fc: "[?]" +0x27fd: "[?]" +0x27fe: "[?]" +/* x028 */ +0x2800: " " +0x2801: "a" +0x2802: "1" +0x2803: "b" +0x2804: "'" +0x2805: "k" +0x2806: "2" +0x2807: "l" +0x2808: "@" +0x2809: "c" +0x280a: "i" +0x280b: "f" +0x280c: "/" +0x280d: "m" +0x280e: "s" +0x280f: "p" +0x2810: "\"" +0x2811: "e" +0x2812: "3" +0x2813: "h" +0x2814: "9" +0x2815: "o" +0x2816: "6" +0x2817: "r" +0x2818: "^" +0x2819: "d" +0x281a: "j" +0x281b: "g" +0x281c: ">" +0x281d: "n" +0x281e: "t" +0x281f: "q" +0x2820: "," +0x2821: "*" +0x2822: "5" +0x2823: "<" +0x2824: "-" +0x2825: "u" +0x2826: "8" +0x2827: "v" +0x2828: "." +0x2829: "%" +0x282a: "[" +0x282b: "$" +0x282c: "+" +0x282d: "x" +0x282e: "!" +0x282f: "&" +0x2830: ";" +0x2831: ":" +0x2832: "4" +0x2833: "\\" +0x2834: "0" +0x2835: "z" +0x2836: "7" +0x2837: "(" +0x2838: "_" +0x2839: "?" +0x283a: "w" +0x283b: "]" +0x283c: "#" +0x283d: "y" +0x283e: ")" +0x283f: "=" +0x2840: "[d7]" +0x2841: "[d17]" +0x2842: "[d27]" +0x2843: "[d127]" +0x2844: "[d37]" +0x2845: "[d137]" +0x2846: "[d237]" +0x2847: "[d1237]" +0x2848: "[d47]" +0x2849: "[d147]" +0x284a: "[d247]" +0x284b: "[d1247]" +0x284c: "[d347]" +0x284d: "[d1347]" +0x284e: "[d2347]" +0x284f: "[d12347]" +0x2850: "[d57]" +0x2851: "[d157]" +0x2852: "[d257]" +0x2853: "[d1257]" +0x2854: "[d357]" +0x2855: "[d1357]" +0x2856: "[d2357]" +0x2857: "[d12357]" +0x2858: "[d457]" +0x2859: "[d1457]" +0x285a: "[d2457]" +0x285b: "[d12457]" +0x285c: "[d3457]" +0x285d: "[d13457]" +0x285e: "[d23457]" +0x285f: "[d123457]" +0x2860: "[d67]" +0x2861: "[d167]" +0x2862: "[d267]" +0x2863: "[d1267]" +0x2864: "[d367]" +0x2865: "[d1367]" +0x2866: "[d2367]" +0x2867: "[d12367]" +0x2868: "[d467]" +0x2869: "[d1467]" +0x286a: "[d2467]" +0x286b: "[d12467]" +0x286c: "[d3467]" +0x286d: "[d13467]" +0x286e: "[d23467]" +0x286f: "[d123467]" +0x2870: "[d567]" +0x2871: "[d1567]" +0x2872: "[d2567]" +0x2873: "[d12567]" +0x2874: "[d3567]" +0x2875: "[d13567]" +0x2876: "[d23567]" +0x2877: "[d123567]" +0x2878: "[d4567]" +0x2879: "[d14567]" +0x287a: "[d24567]" +0x287b: "[d124567]" +0x287c: "[d34567]" +0x287d: "[d134567]" +0x287e: "[d234567]" +0x287f: "[d1234567]" +0x2880: "[d8]" +0x2881: "[d18]" +0x2882: "[d28]" +0x2883: "[d128]" +0x2884: "[d38]" +0x2885: "[d138]" +0x2886: "[d238]" +0x2887: "[d1238]" +0x2888: "[d48]" +0x2889: "[d148]" +0x288a: "[d248]" +0x288b: "[d1248]" +0x288c: "[d348]" +0x288d: "[d1348]" +0x288e: "[d2348]" +0x288f: "[d12348]" +0x2890: "[d58]" +0x2891: "[d158]" +0x2892: "[d258]" +0x2893: "[d1258]" +0x2894: "[d358]" +0x2895: "[d1358]" +0x2896: "[d2358]" +0x2897: "[d12358]" +0x2898: "[d458]" +0x2899: "[d1458]" +0x289a: "[d2458]" +0x289b: "[d12458]" +0x289c: "[d3458]" +0x289d: "[d13458]" +0x289e: "[d23458]" +0x289f: "[d123458]" +0x28a0: "[d68]" +0x28a1: "[d168]" +0x28a2: "[d268]" +0x28a3: "[d1268]" +0x28a4: "[d368]" +0x28a5: "[d1368]" +0x28a6: "[d2368]" +0x28a7: "[d12368]" +0x28a8: "[d468]" +0x28a9: "[d1468]" +0x28aa: "[d2468]" +0x28ab: "[d12468]" +0x28ac: "[d3468]" +0x28ad: "[d13468]" +0x28ae: "[d23468]" +0x28af: "[d123468]" +0x28b0: "[d568]" +0x28b1: "[d1568]" +0x28b2: "[d2568]" +0x28b3: "[d12568]" +0x28b4: "[d3568]" +0x28b5: "[d13568]" +0x28b6: "[d23568]" +0x28b7: "[d123568]" +0x28b8: "[d4568]" +0x28b9: "[d14568]" +0x28ba: "[d24568]" +0x28bb: "[d124568]" +0x28bc: "[d34568]" +0x28bd: "[d134568]" +0x28be: "[d234568]" +0x28bf: "[d1234568]" +0x28c0: "[d78]" +0x28c1: "[d178]" +0x28c2: "[d278]" +0x28c3: "[d1278]" +0x28c4: "[d378]" +0x28c5: "[d1378]" +0x28c6: "[d2378]" +0x28c7: "[d12378]" +0x28c8: "[d478]" +0x28c9: "[d1478]" +0x28ca: "[d2478]" +0x28cb: "[d12478]" +0x28cc: "[d3478]" +0x28cd: "[d13478]" +0x28ce: "[d23478]" +0x28cf: "[d123478]" +0x28d0: "[d578]" +0x28d1: "[d1578]" +0x28d2: "[d2578]" +0x28d3: "[d12578]" +0x28d4: "[d3578]" +0x28d5: "[d13578]" +0x28d6: "[d23578]" +0x28d7: "[d123578]" +0x28d8: "[d4578]" +0x28d9: "[d14578]" +0x28da: "[d24578]" +0x28db: "[d124578]" +0x28dc: "[d34578]" +0x28dd: "[d134578]" +0x28de: "[d234578]" +0x28df: "[d1234578]" +0x28e0: "[d678]" +0x28e1: "[d1678]" +0x28e2: "[d2678]" +0x28e3: "[d12678]" +0x28e4: "[d3678]" +0x28e5: "[d13678]" +0x28e6: "[d23678]" +0x28e7: "[d123678]" +0x28e8: "[d4678]" +0x28e9: "[d14678]" +0x28ea: "[d24678]" +0x28eb: "[d124678]" +0x28ec: "[d34678]" +0x28ed: "[d134678]" +0x28ee: "[d234678]" +0x28ef: "[d1234678]" +0x28f0: "[d5678]" +0x28f1: "[d15678]" +0x28f2: "[d25678]" +0x28f3: "[d125678]" +0x28f4: "[d35678]" +0x28f5: "[d135678]" +0x28f6: "[d235678]" +0x28f7: "[d1235678]" +0x28f8: "[d45678]" +0x28f9: "[d145678]" +0x28fa: "[d245678]" +0x28fb: "[d1245678]" +0x28fc: "[d345678]" +0x28fd: "[d1345678]" +0x28fe: "[d2345678]" +0x28ff: "[d12345678]" +/* x02c */ +0x2c00: "" +0x2c01: "" +0x2c02: "" +0x2c03: "" +0x2c04: "" +0x2c05: "" +0x2c06: "" +0x2c07: "" +0x2c08: "" +0x2c09: "" +0x2c0a: "" +0x2c0b: "" +0x2c0c: "" +0x2c0d: "" +0x2c0e: "" +0x2c0f: "" +0x2c10: "" +0x2c11: "" +0x2c12: "" +0x2c13: "" +0x2c14: "" +0x2c15: "" +0x2c16: "" +0x2c17: "" +0x2c18: "" +0x2c19: "" +0x2c1a: "" +0x2c1b: "" +0x2c1c: "" +0x2c1d: "" +0x2c1e: "" +0x2c1f: "" +0x2c20: "" +0x2c21: "" +0x2c22: "" +0x2c23: "" +0x2c24: "" +0x2c25: "" +0x2c26: "" +0x2c27: "" +0x2c28: "" +0x2c29: "" +0x2c2a: "" +0x2c2b: "" +0x2c2c: "" +0x2c2d: "" +0x2c2e: "" +0x2c2f: "" +0x2c30: "" +0x2c31: "" +0x2c32: "" +0x2c33: "" +0x2c34: "" +0x2c35: "" +0x2c36: "" +0x2c37: "" +0x2c38: "" +0x2c39: "" +0x2c3a: "" +0x2c3b: "" +0x2c3c: "" +0x2c3d: "" +0x2c3e: "" +0x2c3f: "" +0x2c40: "" +0x2c41: "" +0x2c42: "" +0x2c43: "" +0x2c44: "" +0x2c45: "" +0x2c46: "" +0x2c47: "" +0x2c48: "" +0x2c49: "" +0x2c4a: "" +0x2c4b: "" +0x2c4c: "" +0x2c4d: "" +0x2c4e: "" +0x2c4f: "" +0x2c50: "" +0x2c51: "" +0x2c52: "" +0x2c53: "" +0x2c54: "" +0x2c55: "" +0x2c56: "" +0x2c57: "" +0x2c58: "" +0x2c59: "" +0x2c5a: "" +0x2c5b: "" +0x2c5c: "" +0x2c5d: "" +0x2c5e: "" +0x2c5f: "" +0x2c60: "L" +0x2c61: "l" +0x2c62: "L" +0x2c63: "P" +0x2c64: "R" +0x2c65: "a" +0x2c66: "t" +0x2c67: "H" +0x2c68: "h" +0x2c69: "K" +0x2c6a: "k" +0x2c6b: "Z" +0x2c6c: "z" +0x2c6d: "" +0x2c6e: "M" +0x2c6f: "A" +0x2c70: "" +0x2c71: "" +0x2c72: "" +0x2c73: "" +0x2c74: "" +0x2c75: "" +0x2c76: "" +0x2c77: "" +0x2c78: "" +0x2c79: "" +0x2c7a: "" +0x2c7b: "" +0x2c7c: "" +0x2c7d: "" +0x2c7e: "" +0x2c7f: "" +0x2c80: "" +0x2c81: "" +0x2c82: "" +0x2c83: "" +0x2c84: "" +0x2c85: "" +0x2c86: "" +0x2c87: "" +0x2c88: "" +0x2c89: "" +0x2c8a: "" +0x2c8b: "" +0x2c8c: "" +0x2c8d: "" +0x2c8e: "" +0x2c8f: "" +0x2c90: "" +0x2c91: "" +0x2c92: "" +0x2c93: "" +0x2c94: "" +0x2c95: "" +0x2c96: "" +0x2c97: "" +0x2c98: "" +0x2c99: "" +0x2c9a: "" +0x2c9b: "" +0x2c9c: "" +0x2c9d: "" +0x2c9e: "" +0x2c9f: "" +0x2ca0: "" +0x2ca1: "" +0x2ca2: "" +0x2ca3: "" +0x2ca4: "" +0x2ca5: "" +0x2ca6: "" +0x2ca7: "" +0x2ca8: "" +0x2ca9: "" +0x2caa: "" +0x2cab: "" +0x2cac: "" +0x2cad: "" +0x2cae: "" +0x2caf: "" +0x2cb0: "" +0x2cb1: "" +0x2cb2: "" +0x2cb3: "" +0x2cb4: "" +0x2cb5: "" +0x2cb6: "" +0x2cb7: "" +0x2cb8: "" +0x2cb9: "" +0x2cba: "" +0x2cbb: "" +0x2cbc: "" +0x2cbd: "" +0x2cbe: "" +0x2cbf: "" +0x2cc0: "" +0x2cc1: "" +0x2cc2: "" +0x2cc3: "" +0x2cc4: "" +0x2cc5: "" +0x2cc6: "" +0x2cc7: "" +0x2cc8: "" +0x2cc9: "" +0x2cca: "" +0x2ccb: "" +0x2ccc: "" +0x2ccd: "" +0x2cce: "" +0x2ccf: "" +0x2cd0: "" +0x2cd1: "" +0x2cd2: "" +0x2cd3: "" +0x2cd4: "" +0x2cd5: "" +0x2cd6: "" +0x2cd7: "" +0x2cd8: "" +0x2cd9: "" +0x2cda: "" +0x2cdb: "" +0x2cdc: "" +0x2cdd: "" +0x2cde: "" +0x2cdf: "" +0x2ce0: "" +0x2ce1: "" +0x2ce2: "" +0x2ce3: "" +0x2ce4: "" +0x2ce5: "" +0x2ce6: "" +0x2ce7: "" +0x2ce8: "" +0x2ce9: "" +0x2cea: "" +0x2ceb: "" +0x2cec: "" +0x2ced: "" +0x2cee: "" +0x2cef: "" +0x2cf0: "" +0x2cf1: "" +0x2cf2: "" +0x2cf3: "" +0x2cf4: "" +0x2cf5: "" +0x2cf6: "" +0x2cf7: "" +0x2cf8: "" +0x2cf9: "" +0x2cfa: "" +0x2cfb: "" +0x2cfc: "" +0x2cfd: "" +0x2cfe: "" +/* x02e */ +0x2e00: "[?]" +0x2e01: "[?]" +0x2e02: "[?]" +0x2e03: "[?]" +0x2e04: "[?]" +0x2e05: "[?]" +0x2e06: "[?]" +0x2e07: "[?]" +0x2e08: "[?]" +0x2e09: "[?]" +0x2e0a: "[?]" +0x2e0b: "[?]" +0x2e0c: "[?]" +0x2e0d: "[?]" +0x2e0e: "[?]" +0x2e0f: "[?]" +0x2e10: "[?]" +0x2e11: "[?]" +0x2e12: "[?]" +0x2e13: "[?]" +0x2e14: "[?]" +0x2e15: "[?]" +0x2e16: "[?]" +0x2e17: "[?]" +0x2e18: "[?]" +0x2e19: "[?]" +0x2e1a: "[?]" +0x2e1b: "[?]" +0x2e1c: "[?]" +0x2e1d: "[?]" +0x2e1e: "[?]" +0x2e1f: "[?]" +0x2e20: "[?]" +0x2e21: "[?]" +0x2e22: "[?]" +0x2e23: "[?]" +0x2e24: "[?]" +0x2e25: "[?]" +0x2e26: "[?]" +0x2e27: "[?]" +0x2e28: "[?]" +0x2e29: "[?]" +0x2e2a: "[?]" +0x2e2b: "[?]" +0x2e2c: "[?]" +0x2e2d: "[?]" +0x2e2e: "[?]" +0x2e2f: "[?]" +0x2e30: "[?]" +0x2e31: "[?]" +0x2e32: "[?]" +0x2e33: "[?]" +0x2e34: "[?]" +0x2e35: "[?]" +0x2e36: "[?]" +0x2e37: "[?]" +0x2e38: "[?]" +0x2e39: "[?]" +0x2e3a: "[?]" +0x2e3b: "[?]" +0x2e3c: "[?]" +0x2e3d: "[?]" +0x2e3e: "[?]" +0x2e3f: "[?]" +0x2e40: "[?]" +0x2e41: "[?]" +0x2e42: "[?]" +0x2e43: "[?]" +0x2e44: "[?]" +0x2e45: "[?]" +0x2e46: "[?]" +0x2e47: "[?]" +0x2e48: "[?]" +0x2e49: "[?]" +0x2e4a: "[?]" +0x2e4b: "[?]" +0x2e4c: "[?]" +0x2e4d: "[?]" +0x2e4e: "[?]" +0x2e4f: "[?]" +0x2e50: "[?]" +0x2e51: "[?]" +0x2e52: "[?]" +0x2e53: "[?]" +0x2e54: "[?]" +0x2e55: "[?]" +0x2e56: "[?]" +0x2e57: "[?]" +0x2e58: "[?]" +0x2e59: "[?]" +0x2e5a: "[?]" +0x2e5b: "[?]" +0x2e5c: "[?]" +0x2e5d: "[?]" +0x2e5e: "[?]" +0x2e5f: "[?]" +0x2e60: "[?]" +0x2e61: "[?]" +0x2e62: "[?]" +0x2e63: "[?]" +0x2e64: "[?]" +0x2e65: "[?]" +0x2e66: "[?]" +0x2e67: "[?]" +0x2e68: "[?]" +0x2e69: "[?]" +0x2e6a: "[?]" +0x2e6b: "[?]" +0x2e6c: "[?]" +0x2e6d: "[?]" +0x2e6e: "[?]" +0x2e6f: "[?]" +0x2e70: "[?]" +0x2e71: "[?]" +0x2e72: "[?]" +0x2e73: "[?]" +0x2e74: "[?]" +0x2e75: "[?]" +0x2e76: "[?]" +0x2e77: "[?]" +0x2e78: "[?]" +0x2e79: "[?]" +0x2e7a: "[?]" +0x2e7b: "[?]" +0x2e7c: "[?]" +0x2e7d: "[?]" +0x2e7e: "[?]" +0x2e7f: "[?]" +0x2e80: "[?] " +0x2e81: "[?] " +0x2e82: "[?] " +0x2e83: "[?] " +0x2e84: "[?] " +0x2e85: "[?] " +0x2e86: "[?] " +0x2e87: "[?] " +0x2e88: "[?] " +0x2e89: "[?] " +0x2e8a: "[?] " +0x2e8b: "[?] " +0x2e8c: "[?] " +0x2e8d: "[?] " +0x2e8e: "[?] " +0x2e8f: "[?] " +0x2e90: "[?] " +0x2e91: "[?] " +0x2e92: "[?] " +0x2e93: "[?] " +0x2e94: "[?] " +0x2e95: "[?] " +0x2e96: "[?] " +0x2e97: "[?] " +0x2e98: "[?] " +0x2e99: "[?] " +0x2e9a: "[?]" +0x2e9b: "[?] " +0x2e9c: "[?] " +0x2e9d: "[?] " +0x2e9e: "[?] " +0x2e9f: "[?] " +0x2ea0: "[?] " +0x2ea1: "[?] " +0x2ea2: "[?] " +0x2ea3: "[?] " +0x2ea4: "[?] " +0x2ea5: "[?] " +0x2ea6: "[?] " +0x2ea7: "[?] " +0x2ea8: "[?] " +0x2ea9: "[?] " +0x2eaa: "[?] " +0x2eab: "[?] " +0x2eac: "[?] " +0x2ead: "[?] " +0x2eae: "[?] " +0x2eaf: "[?] " +0x2eb0: "[?] " +0x2eb1: "[?] " +0x2eb2: "[?] " +0x2eb3: "[?] " +0x2eb4: "[?] " +0x2eb5: "[?] " +0x2eb6: "[?] " +0x2eb7: "[?] " +0x2eb8: "[?] " +0x2eb9: "[?] " +0x2eba: "[?] " +0x2ebb: "[?] " +0x2ebc: "[?] " +0x2ebd: "[?] " +0x2ebe: "[?] " +0x2ebf: "[?] " +0x2ec0: "[?] " +0x2ec1: "[?] " +0x2ec2: "[?] " +0x2ec3: "[?] " +0x2ec4: "[?] " +0x2ec5: "[?] " +0x2ec6: "[?] " +0x2ec7: "[?] " +0x2ec8: "[?] " +0x2ec9: "[?] " +0x2eca: "[?] " +0x2ecb: "[?] " +0x2ecc: "[?] " +0x2ecd: "[?] " +0x2ece: "[?] " +0x2ecf: "[?] " +0x2ed0: "[?] " +0x2ed1: "[?] " +0x2ed2: "[?] " +0x2ed3: "[?] " +0x2ed4: "[?] " +0x2ed5: "[?] " +0x2ed6: "[?] " +0x2ed7: "[?] " +0x2ed8: "[?] " +0x2ed9: "[?] " +0x2eda: "[?] " +0x2edb: "[?] " +0x2edc: "[?] " +0x2edd: "[?] " +0x2ede: "[?] " +0x2edf: "[?] " +0x2ee0: "[?] " +0x2ee1: "[?] " +0x2ee2: "[?] " +0x2ee3: "[?] " +0x2ee4: "[?] " +0x2ee5: "[?] " +0x2ee6: "[?] " +0x2ee7: "[?] " +0x2ee8: "[?] " +0x2ee9: "[?] " +0x2eea: "[?] " +0x2eeb: "[?] " +0x2eec: "[?] " +0x2eed: "[?] " +0x2eee: "[?] " +0x2eef: "[?] " +0x2ef0: "[?] " +0x2ef1: "[?] " +0x2ef2: "[?] " +0x2ef3: "[?] " +0x2ef4: "[?]" +0x2ef5: "[?]" +0x2ef6: "[?]" +0x2ef7: "[?]" +0x2ef8: "[?]" +0x2ef9: "[?]" +0x2efa: "[?]" +0x2efb: "[?]" +0x2efc: "[?]" +0x2efd: "[?]" +0x2efe: "[?]" +/* x02f */ +0x2f00: "[?] " +0x2f01: "[?] " +0x2f02: "[?] " +0x2f03: "[?] " +0x2f04: "[?] " +0x2f05: "[?] " +0x2f06: "[?] " +0x2f07: "[?] " +0x2f08: "[?] " +0x2f09: "[?] " +0x2f0a: "[?] " +0x2f0b: "[?] " +0x2f0c: "[?] " +0x2f0d: "[?] " +0x2f0e: "[?] " +0x2f0f: "[?] " +0x2f10: "[?] " +0x2f11: "[?] " +0x2f12: "[?] " +0x2f13: "[?] " +0x2f14: "[?] " +0x2f15: "[?] " +0x2f16: "[?] " +0x2f17: "[?] " +0x2f18: "[?] " +0x2f19: "[?] " +0x2f1a: "[?] " +0x2f1b: "[?] " +0x2f1c: "[?] " +0x2f1d: "[?] " +0x2f1e: "[?] " +0x2f1f: "[?] " +0x2f20: "[?] " +0x2f21: "[?] " +0x2f22: "[?] " +0x2f23: "[?] " +0x2f24: "[?] " +0x2f25: "[?] " +0x2f26: "[?] " +0x2f27: "[?] " +0x2f28: "[?] " +0x2f29: "[?] " +0x2f2a: "[?] " +0x2f2b: "[?] " +0x2f2c: "[?] " +0x2f2d: "[?] " +0x2f2e: "[?] " +0x2f2f: "[?] " +0x2f30: "[?] " +0x2f31: "[?] " +0x2f32: "[?] " +0x2f33: "[?] " +0x2f34: "[?] " +0x2f35: "[?] " +0x2f36: "[?] " +0x2f37: "[?] " +0x2f38: "[?] " +0x2f39: "[?] " +0x2f3a: "[?] " +0x2f3b: "[?] " +0x2f3c: "[?] " +0x2f3d: "[?] " +0x2f3e: "[?] " +0x2f3f: "[?] " +0x2f40: "[?] " +0x2f41: "[?] " +0x2f42: "[?] " +0x2f43: "[?] " +0x2f44: "[?] " +0x2f45: "[?] " +0x2f46: "[?] " +0x2f47: "[?] " +0x2f48: "[?] " +0x2f49: "[?] " +0x2f4a: "[?] " +0x2f4b: "[?] " +0x2f4c: "[?] " +0x2f4d: "[?] " +0x2f4e: "[?] " +0x2f4f: "[?] " +0x2f50: "[?] " +0x2f51: "[?] " +0x2f52: "[?] " +0x2f53: "[?] " +0x2f54: "[?] " +0x2f55: "[?] " +0x2f56: "[?] " +0x2f57: "[?] " +0x2f58: "[?] " +0x2f59: "[?] " +0x2f5a: "[?] " +0x2f5b: "[?] " +0x2f5c: "[?] " +0x2f5d: "[?] " +0x2f5e: "[?] " +0x2f5f: "[?] " +0x2f60: "[?] " +0x2f61: "[?] " +0x2f62: "[?] " +0x2f63: "[?] " +0x2f64: "[?] " +0x2f65: "[?] " +0x2f66: "[?] " +0x2f67: "[?] " +0x2f68: "[?] " +0x2f69: "[?] " +0x2f6a: "[?] " +0x2f6b: "[?] " +0x2f6c: "[?] " +0x2f6d: "[?] " +0x2f6e: "[?] " +0x2f6f: "[?] " +0x2f70: "[?] " +0x2f71: "[?] " +0x2f72: "[?] " +0x2f73: "[?] " +0x2f74: "[?] " +0x2f75: "[?] " +0x2f76: "[?] " +0x2f77: "[?] " +0x2f78: "[?] " +0x2f79: "[?] " +0x2f7a: "[?] " +0x2f7b: "[?] " +0x2f7c: "[?] " +0x2f7d: "[?] " +0x2f7e: "[?] " +0x2f7f: "[?] " +0x2f80: "[?] " +0x2f81: "[?] " +0x2f82: "[?] " +0x2f83: "[?] " +0x2f84: "[?] " +0x2f85: "[?] " +0x2f86: "[?] " +0x2f87: "[?] " +0x2f88: "[?] " +0x2f89: "[?] " +0x2f8a: "[?] " +0x2f8b: "[?] " +0x2f8c: "[?] " +0x2f8d: "[?] " +0x2f8e: "[?] " +0x2f8f: "[?] " +0x2f90: "[?] " +0x2f91: "[?] " +0x2f92: "[?] " +0x2f93: "[?] " +0x2f94: "[?] " +0x2f95: "[?] " +0x2f96: "[?] " +0x2f97: "[?] " +0x2f98: "[?] " +0x2f99: "[?] " +0x2f9a: "[?] " +0x2f9b: "[?] " +0x2f9c: "[?] " +0x2f9d: "[?] " +0x2f9e: "[?] " +0x2f9f: "[?] " +0x2fa0: "[?] " +0x2fa1: "[?] " +0x2fa2: "[?] " +0x2fa3: "[?] " +0x2fa4: "[?] " +0x2fa5: "[?] " +0x2fa6: "[?] " +0x2fa7: "[?] " +0x2fa8: "[?] " +0x2fa9: "[?] " +0x2faa: "[?] " +0x2fab: "[?] " +0x2fac: "[?] " +0x2fad: "[?] " +0x2fae: "[?] " +0x2faf: "[?] " +0x2fb0: "[?] " +0x2fb1: "[?] " +0x2fb2: "[?] " +0x2fb3: "[?] " +0x2fb4: "[?] " +0x2fb5: "[?] " +0x2fb6: "[?] " +0x2fb7: "[?] " +0x2fb8: "[?] " +0x2fb9: "[?] " +0x2fba: "[?] " +0x2fbb: "[?] " +0x2fbc: "[?] " +0x2fbd: "[?] " +0x2fbe: "[?] " +0x2fbf: "[?] " +0x2fc0: "[?] " +0x2fc1: "[?] " +0x2fc2: "[?] " +0x2fc3: "[?] " +0x2fc4: "[?] " +0x2fc5: "[?] " +0x2fc6: "[?] " +0x2fc7: "[?] " +0x2fc8: "[?] " +0x2fc9: "[?] " +0x2fca: "[?] " +0x2fcb: "[?] " +0x2fcc: "[?] " +0x2fcd: "[?] " +0x2fce: "[?] " +0x2fcf: "[?] " +0x2fd0: "[?] " +0x2fd1: "[?] " +0x2fd2: "[?] " +0x2fd3: "[?] " +0x2fd4: "[?] " +0x2fd5: "[?] " +0x2fd6: "[?]" +0x2fd7: "[?]" +0x2fd8: "[?]" +0x2fd9: "[?]" +0x2fda: "[?]" +0x2fdb: "[?]" +0x2fdc: "[?]" +0x2fdd: "[?]" +0x2fde: "[?]" +0x2fdf: "[?]" +0x2fe0: "[?]" +0x2fe1: "[?]" +0x2fe2: "[?]" +0x2fe3: "[?]" +0x2fe4: "[?]" +0x2fe5: "[?]" +0x2fe6: "[?]" +0x2fe7: "[?]" +0x2fe8: "[?]" +0x2fe9: "[?]" +0x2fea: "[?]" +0x2feb: "[?]" +0x2fec: "[?]" +0x2fed: "[?]" +0x2fee: "[?]" +0x2fef: "[?]" +0x2ff0: "[?] " +0x2ff1: "[?] " +0x2ff2: "[?] " +0x2ff3: "[?] " +0x2ff4: "[?] " +0x2ff5: "[?] " +0x2ff6: "[?] " +0x2ff7: "[?] " +0x2ff8: "[?] " +0x2ff9: "[?] " +0x2ffa: "[?] " +0x2ffb: "[?] " +0x2ffc: "[?]" +0x2ffd: "[?]" +0x2ffe: "[?]" +/* x030 */ +0x3000: " " +0x3001: ", " +0x3002: ". " +0x3003: "\"" +0x3004: "[JIS]" +0x3005: "\"" +0x3006: "/" +0x3007: "0" +0x3008: "<" +0x3009: "> " +0x300a: "<<" +0x300b: ">> " +0x300c: "[" +0x300d: "] " +0x300e: "{" +0x300f: "} " +0x3010: "[(" +0x3011: ")] " +0x3012: "@" +0x3013: "X " +0x3014: "[" +0x3015: "] " +0x3016: "[[" +0x3017: "]] " +0x3018: "((" +0x3019: ")) " +0x301a: "[[" +0x301b: "]] " +0x301c: "~ " +0x301d: "``" +0x301e: "''" +0x301f: ",," +0x3020: "@" +0x3021: "1" +0x3022: "2" +0x3023: "3" +0x3024: "4" +0x3025: "5" +0x3026: "6" +0x3027: "7" +0x3028: "8" +0x3029: "9" +0x302a: "" +0x302b: "" +0x302c: "" +0x302d: "" +0x302e: "" +0x302f: "" +0x3030: "~" +0x3031: "+" +0x3032: "+" +0x3033: "+" +0x3034: "+" +0x3035: "" +0x3036: "@" +0x3037: " // " +0x3038: "+10+" +0x3039: "+20+" +0x303a: "+30+" +0x303b: "[?]" +0x303c: "[?]" +0x303d: "[?]" +0x303e: "" +0x303f: "" +0x3040: "[?]" +0x3041: "a" +0x3042: "a" +0x3043: "i" +0x3044: "i" +0x3045: "u" +0x3046: "u" +0x3047: "e" +0x3048: "e" +0x3049: "o" +0x304a: "o" +0x304b: "ka" +0x304c: "ga" +0x304d: "ki" +0x304e: "gi" +0x304f: "ku" +0x3050: "gu" +0x3051: "ke" +0x3052: "ge" +0x3053: "ko" +0x3054: "go" +0x3055: "sa" +0x3056: "za" +0x3057: "shi" +0x3058: "zi" +0x3059: "su" +0x305a: "zu" +0x305b: "se" +0x305c: "ze" +0x305d: "so" +0x305e: "zo" +0x305f: "ta" +0x3060: "da" +0x3061: "chi" +0x3062: "di" +0x3063: "tsu" +0x3064: "tsu" +0x3065: "du" +0x3066: "te" +0x3067: "de" +0x3068: "to" +0x3069: "do" +0x306a: "na" +0x306b: "ni" +0x306c: "nu" +0x306d: "ne" +0x306e: "no" +0x306f: "ha" +0x3070: "ba" +0x3071: "pa" +0x3072: "hi" +0x3073: "bi" +0x3074: "pi" +0x3075: "hu" +0x3076: "bu" +0x3077: "pu" +0x3078: "he" +0x3079: "be" +0x307a: "pe" +0x307b: "ho" +0x307c: "bo" +0x307d: "po" +0x307e: "ma" +0x307f: "mi" +0x3080: "mu" +0x3081: "me" +0x3082: "mo" +0x3083: "ya" +0x3084: "ya" +0x3085: "yu" +0x3086: "yu" +0x3087: "yo" +0x3088: "yo" +0x3089: "ra" +0x308a: "ri" +0x308b: "ru" +0x308c: "re" +0x308d: "ro" +0x308e: "wa" +0x308f: "wa" +0x3090: "wi" +0x3091: "we" +0x3092: "wo" +0x3093: "n" +0x3094: "vu" +0x3095: "[?]" +0x3096: "[?]" +0x3097: "[?]" +0x3098: "[?]" +0x3099: "" +0x309a: "" +0x309b: "" +0x309c: "" +0x309d: "\"" +0x309e: "\"" +0x309f: "[?]" +0x30a0: "[?]" +0x30a1: "a" +0x30a2: "a" +0x30a3: "i" +0x30a4: "i" +0x30a5: "u" +0x30a6: "u" +0x30a7: "e" +0x30a8: "e" +0x30a9: "o" +0x30aa: "o" +0x30ab: "ka" +0x30ac: "ga" +0x30ad: "ki" +0x30ae: "gi" +0x30af: "ku" +0x30b0: "gu" +0x30b1: "ke" +0x30b2: "ge" +0x30b3: "ko" +0x30b4: "go" +0x30b5: "sa" +0x30b6: "za" +0x30b7: "shi" +0x30b8: "zi" +0x30b9: "su" +0x30ba: "zu" +0x30bb: "se" +0x30bc: "ze" +0x30bd: "so" +0x30be: "zo" +0x30bf: "ta" +0x30c0: "da" +0x30c1: "chi" +0x30c2: "di" +0x30c3: "tsu" +0x30c4: "tsu" +0x30c5: "du" +0x30c6: "te" +0x30c7: "de" +0x30c8: "to" +0x30c9: "do" +0x30ca: "na" +0x30cb: "ni" +0x30cc: "nu" +0x30cd: "ne" +0x30ce: "no" +0x30cf: "ha" +0x30d0: "ba" +0x30d1: "pa" +0x30d2: "hi" +0x30d3: "bi" +0x30d4: "pi" +0x30d5: "hu" +0x30d6: "bu" +0x30d7: "pu" +0x30d8: "he" +0x30d9: "be" +0x30da: "pe" +0x30db: "ho" +0x30dc: "bo" +0x30dd: "po" +0x30de: "ma" +0x30df: "mi" +0x30e0: "mu" +0x30e1: "me" +0x30e2: "mo" +0x30e3: "ya" +0x30e4: "ya" +0x30e5: "yu" +0x30e6: "yu" +0x30e7: "yo" +0x30e8: "yo" +0x30e9: "ra" +0x30ea: "ri" +0x30eb: "ru" +0x30ec: "re" +0x30ed: "ro" +0x30ee: "wa" +0x30ef: "wa" +0x30f0: "wi" +0x30f1: "we" +0x30f2: "wo" +0x30f3: "n" +0x30f4: "vu" +0x30f5: "ka" +0x30f6: "ke" +0x30f7: "va" +0x30f8: "vi" +0x30f9: "ve" +0x30fa: "vo" +0x30fb: "" +0x30fc: "" +0x30fd: "\"" +0x30fe: "\"" +/* x031 */ +0x3100: "[?]" +0x3101: "[?]" +0x3102: "[?]" +0x3103: "[?]" +0x3104: "[?]" +0x3105: "B" +0x3106: "P" +0x3107: "M" +0x3108: "F" +0x3109: "D" +0x310a: "T" +0x310b: "N" +0x310c: "L" +0x310d: "G" +0x310e: "K" +0x310f: "H" +0x3110: "J" +0x3111: "Q" +0x3112: "X" +0x3113: "ZH" +0x3114: "CH" +0x3115: "SH" +0x3116: "R" +0x3117: "Z" +0x3118: "C" +0x3119: "S" +0x311a: "A" +0x311b: "O" +0x311c: "E" +0x311d: "EH" +0x311e: "AI" +0x311f: "EI" +0x3120: "AU" +0x3121: "OU" +0x3122: "AN" +0x3123: "EN" +0x3124: "ANG" +0x3125: "ENG" +0x3126: "ER" +0x3127: "I" +0x3128: "U" +0x3129: "IU" +0x312a: "V" +0x312b: "NG" +0x312c: "GN" +0x312d: "[?]" +0x312e: "[?]" +0x312f: "[?]" +0x3130: "[?]" +0x3131: "g" +0x3132: "gg" +0x3133: "gs" +0x3134: "n" +0x3135: "nj" +0x3136: "nh" +0x3137: "d" +0x3138: "dd" +0x3139: "r" +0x313a: "lg" +0x313b: "lm" +0x313c: "lb" +0x313d: "ls" +0x313e: "lt" +0x313f: "lp" +0x3140: "rh" +0x3141: "m" +0x3142: "b" +0x3143: "bb" +0x3144: "bs" +0x3145: "s" +0x3146: "ss" +0x3147: "" +0x3148: "j" +0x3149: "jj" +0x314a: "c" +0x314b: "k" +0x314c: "t" +0x314d: "p" +0x314e: "h" +0x314f: "a" +0x3150: "ae" +0x3151: "ya" +0x3152: "yae" +0x3153: "eo" +0x3154: "e" +0x3155: "yeo" +0x3156: "ye" +0x3157: "o" +0x3158: "wa" +0x3159: "wae" +0x315a: "oe" +0x315b: "yo" +0x315c: "u" +0x315d: "weo" +0x315e: "we" +0x315f: "wi" +0x3160: "yu" +0x3161: "eu" +0x3162: "yi" +0x3163: "i" +0x3164: "" +0x3165: "nn" +0x3166: "nd" +0x3167: "ns" +0x3168: "nZ" +0x3169: "lgs" +0x316a: "ld" +0x316b: "lbs" +0x316c: "lZ" +0x316d: "lQ" +0x316e: "mb" +0x316f: "ms" +0x3170: "mZ" +0x3171: "mN" +0x3172: "bg" +0x3173: "" +0x3174: "bsg" +0x3175: "bst" +0x3176: "bj" +0x3177: "bt" +0x3178: "bN" +0x3179: "bbN" +0x317a: "sg" +0x317b: "sn" +0x317c: "sd" +0x317d: "sb" +0x317e: "sj" +0x317f: "Z" +0x3180: "" +0x3181: "N" +0x3182: "Ns" +0x3183: "NZ" +0x3184: "pN" +0x3185: "hh" +0x3186: "Q" +0x3187: "yo-ya" +0x3188: "yo-yae" +0x3189: "yo-i" +0x318a: "yu-yeo" +0x318b: "yu-ye" +0x318c: "yu-i" +0x318d: "U" +0x318e: "U-i" +0x318f: "[?]" +0x3190: "" +0x3191: "" +0x3192: "" +0x3193: "" +0x3194: "" +0x3195: "" +0x3196: "" +0x3197: "" +0x3198: "" +0x3199: "" +0x319a: "" +0x319b: "" +0x319c: "" +0x319d: "" +0x319e: "" +0x319f: "" +0x31a0: "BU" +0x31a1: "ZI" +0x31a2: "JI" +0x31a3: "GU" +0x31a4: "EE" +0x31a5: "ENN" +0x31a6: "OO" +0x31a7: "ONN" +0x31a8: "IR" +0x31a9: "ANN" +0x31aa: "INN" +0x31ab: "UNN" +0x31ac: "IM" +0x31ad: "NGG" +0x31ae: "AINN" +0x31af: "AUNN" +0x31b0: "AM" +0x31b1: "OM" +0x31b2: "ONG" +0x31b3: "INNN" +0x31b4: "P" +0x31b5: "T" +0x31b6: "K" +0x31b7: "H" +0x31b8: "[?]" +0x31b9: "[?]" +0x31ba: "[?]" +0x31bb: "[?]" +0x31bc: "[?]" +0x31bd: "[?]" +0x31be: "[?]" +0x31bf: "[?]" +0x31c0: "[?]" +0x31c1: "[?]" +0x31c2: "[?]" +0x31c3: "[?]" +0x31c4: "[?]" +0x31c5: "[?]" +0x31c6: "[?]" +0x31c7: "[?]" +0x31c8: "[?]" +0x31c9: "[?]" +0x31ca: "[?]" +0x31cb: "[?]" +0x31cc: "[?]" +0x31cd: "[?]" +0x31ce: "[?]" +0x31cf: "[?]" +0x31d0: "[?]" +0x31d1: "[?]" +0x31d2: "[?]" +0x31d3: "[?]" +0x31d4: "[?]" +0x31d5: "[?]" +0x31d6: "[?]" +0x31d7: "[?]" +0x31d8: "[?]" +0x31d9: "[?]" +0x31da: "[?]" +0x31db: "[?]" +0x31dc: "[?]" +0x31dd: "[?]" +0x31de: "[?]" +0x31df: "[?]" +0x31e0: "[?]" +0x31e1: "[?]" +0x31e2: "[?]" +0x31e3: "[?]" +0x31e4: "[?]" +0x31e5: "[?]" +0x31e6: "[?]" +0x31e7: "[?]" +0x31e8: "[?]" +0x31e9: "[?]" +0x31ea: "[?]" +0x31eb: "[?]" +0x31ec: "[?]" +0x31ed: "[?]" +0x31ee: "[?]" +0x31ef: "[?]" +0x31f0: "[?]" +0x31f1: "[?]" +0x31f2: "[?]" +0x31f3: "[?]" +0x31f4: "[?]" +0x31f5: "[?]" +0x31f6: "[?]" +0x31f7: "[?]" +0x31f8: "[?]" +0x31f9: "[?]" +0x31fa: "[?]" +0x31fb: "[?]" +0x31fc: "[?]" +0x31fd: "[?]" +0x31fe: "[?]" +/* x032 */ +0x3200: "(g)" +0x3201: "(n)" +0x3202: "(d)" +0x3203: "(r)" +0x3204: "(m)" +0x3205: "(b)" +0x3206: "(s)" +0x3207: "()" +0x3208: "(j)" +0x3209: "(c)" +0x320a: "(k)" +0x320b: "(t)" +0x320c: "(p)" +0x320d: "(h)" +0x320e: "(ga)" +0x320f: "(na)" +0x3210: "(da)" +0x3211: "(ra)" +0x3212: "(ma)" +0x3213: "(ba)" +0x3214: "(sa)" +0x3215: "(a)" +0x3216: "(ja)" +0x3217: "(ca)" +0x3218: "(ka)" +0x3219: "(ta)" +0x321a: "(pa)" +0x321b: "(ha)" +0x321c: "(ju)" +0x321d: "[?]" +0x321e: "[?]" +0x321f: "[?]" +0x3220: "(1) " +0x3221: "(2) " +0x3222: "(3) " +0x3223: "(4) " +0x3224: "(5) " +0x3225: "(6) " +0x3226: "(7) " +0x3227: "(8) " +0x3228: "(9) " +0x3229: "(10) " +0x322a: "(Yue) " +0x322b: "(Huo) " +0x322c: "(Shui) " +0x322d: "(Mu) " +0x322e: "(Jin) " +0x322f: "(Tu) " +0x3230: "(Ri) " +0x3231: "(Zhu) " +0x3232: "(You) " +0x3233: "(She) " +0x3234: "(Ming) " +0x3235: "(Te) " +0x3236: "(Cai) " +0x3237: "(Zhu) " +0x3238: "(Lao) " +0x3239: "(Dai) " +0x323a: "(Hu) " +0x323b: "(Xue) " +0x323c: "(Jian) " +0x323d: "(Qi) " +0x323e: "(Zi) " +0x323f: "(Xie) " +0x3240: "(Ji) " +0x3241: "(Xiu) " +0x3242: "<<" +0x3243: ">>" +0x3244: "[?]" +0x3245: "[?]" +0x3246: "[?]" +0x3247: "[?]" +0x3248: "[?]" +0x3249: "[?]" +0x324a: "[?]" +0x324b: "[?]" +0x324c: "[?]" +0x324d: "[?]" +0x324e: "[?]" +0x324f: "[?]" +0x3250: "[?]" +0x3251: "[?]" +0x3252: "[?]" +0x3253: "[?]" +0x3254: "[?]" +0x3255: "[?]" +0x3256: "[?]" +0x3257: "[?]" +0x3258: "[?]" +0x3259: "[?]" +0x325a: "[?]" +0x325b: "[?]" +0x325c: "[?]" +0x325d: "[?]" +0x325e: "[?]" +0x325f: "[?]" +0x3260: "(g)" +0x3261: "(n)" +0x3262: "(d)" +0x3263: "(r)" +0x3264: "(m)" +0x3265: "(b)" +0x3266: "(s)" +0x3267: "()" +0x3268: "(j)" +0x3269: "(c)" +0x326a: "(k)" +0x326b: "(t)" +0x326c: "(p)" +0x326d: "(h)" +0x326e: "(ga)" +0x326f: "(na)" +0x3270: "(da)" +0x3271: "(ra)" +0x3272: "(ma)" +0x3273: "(ba)" +0x3274: "(sa)" +0x3275: "(a)" +0x3276: "(ja)" +0x3277: "(ca)" +0x3278: "(ka)" +0x3279: "(ta)" +0x327a: "(pa)" +0x327b: "(ha)" +0x327c: "[?]" +0x327d: "[?]" +0x327e: "[?]" +0x327f: "KIS " +0x3280: "(1) " +0x3281: "(2) " +0x3282: "(3) " +0x3283: "(4) " +0x3284: "(5) " +0x3285: "(6) " +0x3286: "(7) " +0x3287: "(8) " +0x3288: "(9) " +0x3289: "(10) " +0x328a: "(Yue) " +0x328b: "(Huo) " +0x328c: "(Shui) " +0x328d: "(Mu) " +0x328e: "(Jin) " +0x328f: "(Tu) " +0x3290: "(Ri) " +0x3291: "(Zhu) " +0x3292: "(You) " +0x3293: "(She) " +0x3294: "(Ming) " +0x3295: "(Te) " +0x3296: "(Cai) " +0x3297: "(Zhu) " +0x3298: "(Lao) " +0x3299: "(Mi) " +0x329a: "(Nan) " +0x329b: "(Nu) " +0x329c: "(Shi) " +0x329d: "(You) " +0x329e: "(Yin) " +0x329f: "(Zhu) " +0x32a0: "(Xiang) " +0x32a1: "(Xiu) " +0x32a2: "(Xie) " +0x32a3: "(Zheng) " +0x32a4: "(Shang) " +0x32a5: "(Zhong) " +0x32a6: "(Xia) " +0x32a7: "(Zuo) " +0x32a8: "(You) " +0x32a9: "(Yi) " +0x32aa: "(Zong) " +0x32ab: "(Xue) " +0x32ac: "(Jian) " +0x32ad: "(Qi) " +0x32ae: "(Zi) " +0x32af: "(Xie) " +0x32b0: "(Ye) " +0x32b1: "[?]" +0x32b2: "[?]" +0x32b3: "[?]" +0x32b4: "[?]" +0x32b5: "[?]" +0x32b6: "[?]" +0x32b7: "[?]" +0x32b8: "[?]" +0x32b9: "[?]" +0x32ba: "[?]" +0x32bb: "[?]" +0x32bc: "[?]" +0x32bd: "[?]" +0x32be: "[?]" +0x32bf: "[?]" +0x32c0: "1M" +0x32c1: "2M" +0x32c2: "3M" +0x32c3: "4M" +0x32c4: "5M" +0x32c5: "6M" +0x32c6: "7M" +0x32c7: "8M" +0x32c8: "9M" +0x32c9: "10M" +0x32ca: "11M" +0x32cb: "12M" +0x32cc: "[?]" +0x32cd: "[?]" +0x32ce: "[?]" +0x32cf: "[?]" +0x32d0: "a" +0x32d1: "i" +0x32d2: "u" +0x32d3: "u" +0x32d4: "o" +0x32d5: "ka" +0x32d6: "ki" +0x32d7: "ku" +0x32d8: "ke" +0x32d9: "ko" +0x32da: "sa" +0x32db: "si" +0x32dc: "su" +0x32dd: "se" +0x32de: "so" +0x32df: "ta" +0x32e0: "ti" +0x32e1: "tu" +0x32e2: "te" +0x32e3: "to" +0x32e4: "na" +0x32e5: "ni" +0x32e6: "nu" +0x32e7: "ne" +0x32e8: "no" +0x32e9: "ha" +0x32ea: "hi" +0x32eb: "hu" +0x32ec: "he" +0x32ed: "ho" +0x32ee: "ma" +0x32ef: "mi" +0x32f0: "mu" +0x32f1: "me" +0x32f2: "mo" +0x32f3: "ya" +0x32f4: "yu" +0x32f5: "yo" +0x32f6: "ra" +0x32f7: "ri" +0x32f8: "ru" +0x32f9: "re" +0x32fa: "ro" +0x32fb: "wa" +0x32fc: "wi" +0x32fd: "we" +0x32fe: "wo" +/* x033 */ +0x3300: "apartment" +0x3301: "alpha" +0x3302: "ampere" +0x3303: "are" +0x3304: "inning" +0x3305: "inch" +0x3306: "won" +0x3307: "escudo" +0x3308: "acre" +0x3309: "ounce" +0x330a: "ohm" +0x330b: "kai-ri" +0x330c: "carat" +0x330d: "calorie" +0x330e: "gallon" +0x330f: "gamma" +0x3310: "giga" +0x3311: "guinea" +0x3312: "curie" +0x3313: "guilder" +0x3314: "kilo" +0x3315: "kilogram" +0x3316: "kilometer" +0x3317: "kilowatt" +0x3318: "gram" +0x3319: "gram ton" +0x331a: "cruzeiro" +0x331b: "krone" +0x331c: "case" +0x331d: "koruna" +0x331e: "co-op" +0x331f: "cycle" +0x3320: "centime" +0x3321: "shilling" +0x3322: "centi" +0x3323: "cent" +0x3324: "dozen" +0x3325: "desi" +0x3326: "dollar" +0x3327: "ton" +0x3328: "nano" +0x3329: "knot" +0x332a: "heights" +0x332b: "percent" +0x332c: "parts" +0x332d: "barrel" +0x332e: "piaster" +0x332f: "picul" +0x3330: "pico" +0x3331: "building" +0x3332: "farad" +0x3333: "feet" +0x3334: "bushel" +0x3335: "franc" +0x3336: "hectare" +0x3337: "peso" +0x3338: "pfennig" +0x3339: "hertz" +0x333a: "pence" +0x333b: "page" +0x333c: "beta" +0x333d: "point" +0x333e: "volt" +0x333f: "hon" +0x3340: "pound" +0x3341: "hall" +0x3342: "horn" +0x3343: "micro" +0x3344: "mile" +0x3345: "mach" +0x3346: "mark" +0x3347: "mansion" +0x3348: "micron" +0x3349: "milli" +0x334a: "millibar" +0x334b: "mega" +0x334c: "megaton" +0x334d: "meter" +0x334e: "yard" +0x334f: "yard" +0x3350: "yuan" +0x3351: "liter" +0x3352: "lira" +0x3353: "rupee" +0x3354: "ruble" +0x3355: "rem" +0x3356: "roentgen" +0x3357: "watt" +0x3358: "0h" +0x3359: "1h" +0x335a: "2h" +0x335b: "3h" +0x335c: "4h" +0x335d: "5h" +0x335e: "6h" +0x335f: "7h" +0x3360: "8h" +0x3361: "9h" +0x3362: "10h" +0x3363: "11h" +0x3364: "12h" +0x3365: "13h" +0x3366: "14h" +0x3367: "15h" +0x3368: "16h" +0x3369: "17h" +0x336a: "18h" +0x336b: "19h" +0x336c: "20h" +0x336d: "21h" +0x336e: "22h" +0x336f: "23h" +0x3370: "24h" +0x3371: "HPA" +0x3372: "da" +0x3373: "AU" +0x3374: "bar" +0x3375: "oV" +0x3376: "pc" +0x3377: "[?]" +0x3378: "[?]" +0x3379: "[?]" +0x337a: "[?]" +0x337b: "Heisei" +0x337c: "Syouwa" +0x337d: "Taisyou" +0x337e: "Meiji" +0x337f: "Inc." +0x3380: "pA" +0x3381: "nA" +0x3382: "microamp" +0x3383: "mA" +0x3384: "kA" +0x3385: "kB" +0x3386: "MB" +0x3387: "GB" +0x3388: "cal" +0x3389: "kcal" +0x338a: "pF" +0x338b: "nF" +0x338c: "microFarad" +0x338d: "microgram" +0x338e: "mg" +0x338f: "kg" +0x3390: "Hz" +0x3391: "kHz" +0x3392: "MHz" +0x3393: "GHz" +0x3394: "THz" +0x3395: "microliter" +0x3396: "ml" +0x3397: "dl" +0x3398: "kl" +0x3399: "fm" +0x339a: "nm" +0x339b: "micrometer" +0x339c: "mm" +0x339d: "cm" +0x339e: "km" +0x339f: "mm^2" +0x33a0: "cm^2" +0x33a1: "m^2" +0x33a2: "km^2" +0x33a3: "mm^4" +0x33a4: "cm^3" +0x33a5: "m^3" +0x33a6: "km^3" +0x33a7: "m/s" +0x33a8: "m/s^2" +0x33a9: "Pa" +0x33aa: "kPa" +0x33ab: "MPa" +0x33ac: "GPa" +0x33ad: "rad" +0x33ae: "rad/s" +0x33af: "rad/s^2" +0x33b0: "ps" +0x33b1: "ns" +0x33b2: "microsecond" +0x33b3: "ms" +0x33b4: "pV" +0x33b5: "nV" +0x33b6: "microvolt" +0x33b7: "mV" +0x33b8: "kV" +0x33b9: "MV" +0x33ba: "pW" +0x33bb: "nW" +0x33bc: "microwatt" +0x33bd: "mW" +0x33be: "kW" +0x33bf: "MW" +0x33c0: "kOhm" +0x33c1: "MOhm" +0x33c2: "a.m." +0x33c3: "Bq" +0x33c4: "cc" +0x33c5: "cd" +0x33c6: "C/kg" +0x33c7: "Co." +0x33c8: "dB" +0x33c9: "Gy" +0x33ca: "ha" +0x33cb: "HP" +0x33cc: "in" +0x33cd: "K.K." +0x33ce: "KM" +0x33cf: "kt" +0x33d0: "lm" +0x33d1: "ln" +0x33d2: "log" +0x33d3: "lx" +0x33d4: "mb" +0x33d5: "mil" +0x33d6: "mol" +0x33d7: "pH" +0x33d8: "p.m." +0x33d9: "PPM" +0x33da: "PR" +0x33db: "sr" +0x33dc: "Sv" +0x33dd: "Wb" +0x33de: "[?]" +0x33df: "[?]" +0x33e0: "1d" +0x33e1: "2d" +0x33e2: "3d" +0x33e3: "4d" +0x33e4: "5d" +0x33e5: "6d" +0x33e6: "7d" +0x33e7: "8d" +0x33e8: "9d" +0x33e9: "10d" +0x33ea: "11d" +0x33eb: "12d" +0x33ec: "13d" +0x33ed: "14d" +0x33ee: "15d" +0x33ef: "16d" +0x33f0: "17d" +0x33f1: "18d" +0x33f2: "19d" +0x33f3: "20d" +0x33f4: "21d" +0x33f5: "22d" +0x33f6: "23d" +0x33f7: "24d" +0x33f8: "25d" +0x33f9: "26d" +0x33fa: "27d" +0x33fb: "28d" +0x33fc: "29d" +0x33fd: "30d" +0x33fe: "31d" +/* x04d */ +0x4d00: "[?] " +0x4d01: "[?] " +0x4d02: "[?] " +0x4d03: "[?] " +0x4d04: "[?] " +0x4d05: "[?] " +0x4d06: "[?] " +0x4d07: "[?] " +0x4d08: "[?] " +0x4d09: "[?] " +0x4d0a: "[?] " +0x4d0b: "[?] " +0x4d0c: "[?] " +0x4d0d: "[?] " +0x4d0e: "[?] " +0x4d0f: "[?] " +0x4d10: "[?] " +0x4d11: "[?] " +0x4d12: "[?] " +0x4d13: "[?] " +0x4d14: "[?] " +0x4d15: "[?] " +0x4d16: "[?] " +0x4d17: "[?] " +0x4d18: "[?] " +0x4d19: "[?] " +0x4d1a: "[?] " +0x4d1b: "[?] " +0x4d1c: "[?] " +0x4d1d: "[?] " +0x4d1e: "[?] " +0x4d1f: "[?] " +0x4d20: "[?] " +0x4d21: "[?] " +0x4d22: "[?] " +0x4d23: "[?] " +0x4d24: "[?] " +0x4d25: "[?] " +0x4d26: "[?] " +0x4d27: "[?] " +0x4d28: "[?] " +0x4d29: "[?] " +0x4d2a: "[?] " +0x4d2b: "[?] " +0x4d2c: "[?] " +0x4d2d: "[?] " +0x4d2e: "[?] " +0x4d2f: "[?] " +0x4d30: "[?] " +0x4d31: "[?] " +0x4d32: "[?] " +0x4d33: "[?] " +0x4d34: "[?] " +0x4d35: "[?] " +0x4d36: "[?] " +0x4d37: "[?] " +0x4d38: "[?] " +0x4d39: "[?] " +0x4d3a: "[?] " +0x4d3b: "[?] " +0x4d3c: "[?] " +0x4d3d: "[?] " +0x4d3e: "[?] " +0x4d3f: "[?] " +0x4d40: "[?] " +0x4d41: "[?] " +0x4d42: "[?] " +0x4d43: "[?] " +0x4d44: "[?] " +0x4d45: "[?] " +0x4d46: "[?] " +0x4d47: "[?] " +0x4d48: "[?] " +0x4d49: "[?] " +0x4d4a: "[?] " +0x4d4b: "[?] " +0x4d4c: "[?] " +0x4d4d: "[?] " +0x4d4e: "[?] " +0x4d4f: "[?] " +0x4d50: "[?] " +0x4d51: "[?] " +0x4d52: "[?] " +0x4d53: "[?] " +0x4d54: "[?] " +0x4d55: "[?] " +0x4d56: "[?] " +0x4d57: "[?] " +0x4d58: "[?] " +0x4d59: "[?] " +0x4d5a: "[?] " +0x4d5b: "[?] " +0x4d5c: "[?] " +0x4d5d: "[?] " +0x4d5e: "[?] " +0x4d5f: "[?] " +0x4d60: "[?] " +0x4d61: "[?] " +0x4d62: "[?] " +0x4d63: "[?] " +0x4d64: "[?] " +0x4d65: "[?] " +0x4d66: "[?] " +0x4d67: "[?] " +0x4d68: "[?] " +0x4d69: "[?] " +0x4d6a: "[?] " +0x4d6b: "[?] " +0x4d6c: "[?] " +0x4d6d: "[?] " +0x4d6e: "[?] " +0x4d6f: "[?] " +0x4d70: "[?] " +0x4d71: "[?] " +0x4d72: "[?] " +0x4d73: "[?] " +0x4d74: "[?] " +0x4d75: "[?] " +0x4d76: "[?] " +0x4d77: "[?] " +0x4d78: "[?] " +0x4d79: "[?] " +0x4d7a: "[?] " +0x4d7b: "[?] " +0x4d7c: "[?] " +0x4d7d: "[?] " +0x4d7e: "[?] " +0x4d7f: "[?] " +0x4d80: "[?] " +0x4d81: "[?] " +0x4d82: "[?] " +0x4d83: "[?] " +0x4d84: "[?] " +0x4d85: "[?] " +0x4d86: "[?] " +0x4d87: "[?] " +0x4d88: "[?] " +0x4d89: "[?] " +0x4d8a: "[?] " +0x4d8b: "[?] " +0x4d8c: "[?] " +0x4d8d: "[?] " +0x4d8e: "[?] " +0x4d8f: "[?] " +0x4d90: "[?] " +0x4d91: "[?] " +0x4d92: "[?] " +0x4d93: "[?] " +0x4d94: "[?] " +0x4d95: "[?] " +0x4d96: "[?] " +0x4d97: "[?] " +0x4d98: "[?] " +0x4d99: "[?] " +0x4d9a: "[?] " +0x4d9b: "[?] " +0x4d9c: "[?] " +0x4d9d: "[?] " +0x4d9e: "[?] " +0x4d9f: "[?] " +0x4da0: "[?] " +0x4da1: "[?] " +0x4da2: "[?] " +0x4da3: "[?] " +0x4da4: "[?] " +0x4da5: "[?] " +0x4da6: "[?] " +0x4da7: "[?] " +0x4da8: "[?] " +0x4da9: "[?] " +0x4daa: "[?] " +0x4dab: "[?] " +0x4dac: "[?] " +0x4dad: "[?] " +0x4dae: "[?] " +0x4daf: "[?] " +0x4db0: "[?] " +0x4db1: "[?] " +0x4db2: "[?] " +0x4db3: "[?] " +0x4db4: "[?] " +0x4db5: "[?] " +0x4db6: "[?]" +0x4db7: "[?]" +0x4db8: "[?]" +0x4db9: "[?]" +0x4dba: "[?]" +0x4dbb: "[?]" +0x4dbc: "[?]" +0x4dbd: "[?]" +0x4dbe: "[?]" +0x4dbf: "[?]" +0x4dc0: "[?]" +0x4dc1: "[?]" +0x4dc2: "[?]" +0x4dc3: "[?]" +0x4dc4: "[?]" +0x4dc5: "[?]" +0x4dc6: "[?]" +0x4dc7: "[?]" +0x4dc8: "[?]" +0x4dc9: "[?]" +0x4dca: "[?]" +0x4dcb: "[?]" +0x4dcc: "[?]" +0x4dcd: "[?]" +0x4dce: "[?]" +0x4dcf: "[?]" +0x4dd0: "[?]" +0x4dd1: "[?]" +0x4dd2: "[?]" +0x4dd3: "[?]" +0x4dd4: "[?]" +0x4dd5: "[?]" +0x4dd6: "[?]" +0x4dd7: "[?]" +0x4dd8: "[?]" +0x4dd9: "[?]" +0x4dda: "[?]" +0x4ddb: "[?]" +0x4ddc: "[?]" +0x4ddd: "[?]" +0x4dde: "[?]" +0x4ddf: "[?]" +0x4de0: "[?]" +0x4de1: "[?]" +0x4de2: "[?]" +0x4de3: "[?]" +0x4de4: "[?]" +0x4de5: "[?]" +0x4de6: "[?]" +0x4de7: "[?]" +0x4de8: "[?]" +0x4de9: "[?]" +0x4dea: "[?]" +0x4deb: "[?]" +0x4dec: "[?]" +0x4ded: "[?]" +0x4dee: "[?]" +0x4def: "[?]" +0x4df0: "[?]" +0x4df1: "[?]" +0x4df2: "[?]" +0x4df3: "[?]" +0x4df4: "[?]" +0x4df5: "[?]" +0x4df6: "[?]" +0x4df7: "[?]" +0x4df8: "[?]" +0x4df9: "[?]" +0x4dfa: "[?]" +0x4dfb: "[?]" +0x4dfc: "[?]" +0x4dfd: "[?]" +0x4dfe: "[?]" +/* x04e */ +0x4e00: "[?] " +0x4e01: "Ding " +0x4e02: "Kao " +0x4e03: "Qi " +0x4e04: "Shang " +0x4e05: "Xia " +0x4e06: "[?] " +0x4e07: "Mo " +0x4e08: "Zhang " +0x4e09: "San " +0x4e0a: "Shang " +0x4e0b: "Xia " +0x4e0c: "Ji " +0x4e0d: "Bu " +0x4e0e: "Yu " +0x4e0f: "Mian " +0x4e10: "Gai " +0x4e11: "Chou " +0x4e12: "Chou " +0x4e13: "Zhuan " +0x4e14: "Qie " +0x4e15: "Pi " +0x4e16: "Shi " +0x4e17: "Shi " +0x4e18: "Qiu " +0x4e19: "Bing " +0x4e1a: "Ye " +0x4e1b: "Cong " +0x4e1c: "Dong " +0x4e1d: "Si " +0x4e1e: "Cheng " +0x4e1f: "Diu " +0x4e20: "Qiu " +0x4e21: "Liang " +0x4e22: "Diu " +0x4e23: "You " +0x4e24: "Liang " +0x4e25: "Yan " +0x4e26: "Bing " +0x4e27: "Sang " +0x4e28: "Gun " +0x4e29: "Jiu " +0x4e2a: "Ge " +0x4e2b: "Ya " +0x4e2c: "Qiang " +0x4e2d: "Zhong " +0x4e2e: "Ji " +0x4e2f: "Jie " +0x4e30: "Feng " +0x4e31: "Guan " +0x4e32: "Chuan " +0x4e33: "Chan " +0x4e34: "Lin " +0x4e35: "Zhuo " +0x4e36: "Zhu " +0x4e37: "Ha " +0x4e38: "Wan " +0x4e39: "Dan " +0x4e3a: "Wei " +0x4e3b: "Zhu " +0x4e3c: "Jing " +0x4e3d: "Li " +0x4e3e: "Ju " +0x4e3f: "Pie " +0x4e40: "Fu " +0x4e41: "Yi " +0x4e42: "Yi " +0x4e43: "Nai " +0x4e44: "Shime " +0x4e45: "Jiu " +0x4e46: "Jiu " +0x4e47: "Zhe " +0x4e48: "Yao " +0x4e49: "Yi " +0x4e4a: "[?] " +0x4e4b: "Zhi " +0x4e4c: "Wu " +0x4e4d: "Zha " +0x4e4e: "Hu " +0x4e4f: "Fa " +0x4e50: "Le " +0x4e51: "Zhong " +0x4e52: "Ping " +0x4e53: "Pang " +0x4e54: "Qiao " +0x4e55: "Hu " +0x4e56: "Guai " +0x4e57: "Cheng " +0x4e58: "Cheng " +0x4e59: "Yi " +0x4e5a: "Yin " +0x4e5b: "[?] " +0x4e5c: "Mie " +0x4e5d: "Jiu " +0x4e5e: "Qi " +0x4e5f: "Ye " +0x4e60: "Xi " +0x4e61: "Xiang " +0x4e62: "Gai " +0x4e63: "Diu " +0x4e64: "Hal " +0x4e65: "[?] " +0x4e66: "Shu " +0x4e67: "Twul " +0x4e68: "Shi " +0x4e69: "Ji " +0x4e6a: "Nang " +0x4e6b: "Jia " +0x4e6c: "Kel " +0x4e6d: "Shi " +0x4e6e: "[?] " +0x4e6f: "Ol " +0x4e70: "Mai " +0x4e71: "Luan " +0x4e72: "Cal " +0x4e73: "Ru " +0x4e74: "Xue " +0x4e75: "Yan " +0x4e76: "Fu " +0x4e77: "Sha " +0x4e78: "Na " +0x4e79: "Gan " +0x4e7a: "Sol " +0x4e7b: "El " +0x4e7c: "Cwul " +0x4e7d: "[?] " +0x4e7e: "Gan " +0x4e7f: "Chi " +0x4e80: "Gui " +0x4e81: "Gan " +0x4e82: "Luan " +0x4e83: "Lin " +0x4e84: "Yi " +0x4e85: "Jue " +0x4e86: "Liao " +0x4e87: "Ma " +0x4e88: "Yu " +0x4e89: "Zheng " +0x4e8a: "Shi " +0x4e8b: "Shi " +0x4e8c: "Er " +0x4e8d: "Chu " +0x4e8e: "Yu " +0x4e8f: "Yu " +0x4e90: "Yu " +0x4e91: "Yun " +0x4e92: "Hu " +0x4e93: "Qi " +0x4e94: "Wu " +0x4e95: "Jing " +0x4e96: "Si " +0x4e97: "Sui " +0x4e98: "Gen " +0x4e99: "Gen " +0x4e9a: "Ya " +0x4e9b: "Xie " +0x4e9c: "Ya " +0x4e9d: "Qi " +0x4e9e: "Ya " +0x4e9f: "Ji " +0x4ea0: "Tou " +0x4ea1: "Wang " +0x4ea2: "Kang " +0x4ea3: "Ta " +0x4ea4: "Jiao " +0x4ea5: "Hai " +0x4ea6: "Yi " +0x4ea7: "Chan " +0x4ea8: "Heng " +0x4ea9: "Mu " +0x4eaa: "[?] " +0x4eab: "Xiang " +0x4eac: "Jing " +0x4ead: "Ting " +0x4eae: "Liang " +0x4eaf: "Xiang " +0x4eb0: "Jing " +0x4eb1: "Ye " +0x4eb2: "Qin " +0x4eb3: "Bo " +0x4eb4: "You " +0x4eb5: "Xie " +0x4eb6: "Dan " +0x4eb7: "Lian " +0x4eb8: "Duo " +0x4eb9: "Wei " +0x4eba: "Ren " +0x4ebb: "Ren " +0x4ebc: "Ji " +0x4ebd: "La " +0x4ebe: "Wang " +0x4ebf: "Yi " +0x4ec0: "Shi " +0x4ec1: "Ren " +0x4ec2: "Le " +0x4ec3: "Ding " +0x4ec4: "Ze " +0x4ec5: "Jin " +0x4ec6: "Pu " +0x4ec7: "Chou " +0x4ec8: "Ba " +0x4ec9: "Zhang " +0x4eca: "Jin " +0x4ecb: "Jie " +0x4ecc: "Bing " +0x4ecd: "Reng " +0x4ece: "Cong " +0x4ecf: "Fo " +0x4ed0: "San " +0x4ed1: "Lun " +0x4ed2: "Sya " +0x4ed3: "Cang " +0x4ed4: "Zi " +0x4ed5: "Shi " +0x4ed6: "Ta " +0x4ed7: "Zhang " +0x4ed8: "Fu " +0x4ed9: "Xian " +0x4eda: "Xian " +0x4edb: "Tuo " +0x4edc: "Hong " +0x4edd: "Tong " +0x4ede: "Ren " +0x4edf: "Qian " +0x4ee0: "Gan " +0x4ee1: "Yi " +0x4ee2: "Di " +0x4ee3: "Dai " +0x4ee4: "Ling " +0x4ee5: "Yi " +0x4ee6: "Chao " +0x4ee7: "Chang " +0x4ee8: "Sa " +0x4ee9: "[?] " +0x4eea: "Yi " +0x4eeb: "Mu " +0x4eec: "Men " +0x4eed: "Ren " +0x4eee: "Jia " +0x4eef: "Chao " +0x4ef0: "Yang " +0x4ef1: "Qian " +0x4ef2: "Zhong " +0x4ef3: "Pi " +0x4ef4: "Wan " +0x4ef5: "Wu " +0x4ef6: "Jian " +0x4ef7: "Jie " +0x4ef8: "Yao " +0x4ef9: "Feng " +0x4efa: "Cang " +0x4efb: "Ren " +0x4efc: "Wang " +0x4efd: "Fen " +0x4efe: "Di " +0x4eff: "Fang " +/* x04f */ +0x4f00: "Zhong " +0x4f01: "Qi " +0x4f02: "Pei " +0x4f03: "Yu " +0x4f04: "Diao " +0x4f05: "Dun " +0x4f06: "Wen " +0x4f07: "Yi " +0x4f08: "Xin " +0x4f09: "Kang " +0x4f0a: "Yi " +0x4f0b: "Ji " +0x4f0c: "Ai " +0x4f0d: "Wu " +0x4f0e: "Ji " +0x4f0f: "Fu " +0x4f10: "Fa " +0x4f11: "Xiu " +0x4f12: "Jin " +0x4f13: "Bei " +0x4f14: "Dan " +0x4f15: "Fu " +0x4f16: "Tang " +0x4f17: "Zhong " +0x4f18: "You " +0x4f19: "Huo " +0x4f1a: "Hui " +0x4f1b: "Yu " +0x4f1c: "Cui " +0x4f1d: "Chuan " +0x4f1e: "San " +0x4f1f: "Wei " +0x4f20: "Chuan " +0x4f21: "Che " +0x4f22: "Ya " +0x4f23: "Xian " +0x4f24: "Shang " +0x4f25: "Chang " +0x4f26: "Lun " +0x4f27: "Cang " +0x4f28: "Xun " +0x4f29: "Xin " +0x4f2a: "Wei " +0x4f2b: "Zhu " +0x4f2c: "[?] " +0x4f2d: "Xuan " +0x4f2e: "Nu " +0x4f2f: "Bo " +0x4f30: "Gu " +0x4f31: "Ni " +0x4f32: "Ni " +0x4f33: "Xie " +0x4f34: "Ban " +0x4f35: "Xu " +0x4f36: "Ling " +0x4f37: "Zhou " +0x4f38: "Shen " +0x4f39: "Qu " +0x4f3a: "Si " +0x4f3b: "Beng " +0x4f3c: "Si " +0x4f3d: "Jia " +0x4f3e: "Pi " +0x4f3f: "Yi " +0x4f40: "Si " +0x4f41: "Ai " +0x4f42: "Zheng " +0x4f43: "Dian " +0x4f44: "Han " +0x4f45: "Mai " +0x4f46: "Dan " +0x4f47: "Zhu " +0x4f48: "Bu " +0x4f49: "Qu " +0x4f4a: "Bi " +0x4f4b: "Shao " +0x4f4c: "Ci " +0x4f4d: "Wei " +0x4f4e: "Di " +0x4f4f: "Zhu " +0x4f50: "Zuo " +0x4f51: "You " +0x4f52: "Yang " +0x4f53: "Ti " +0x4f54: "Zhan " +0x4f55: "He " +0x4f56: "Bi " +0x4f57: "Tuo " +0x4f58: "She " +0x4f59: "Yu " +0x4f5a: "Yi " +0x4f5b: "Fo " +0x4f5c: "Zuo " +0x4f5d: "Kou " +0x4f5e: "Ning " +0x4f5f: "Tong " +0x4f60: "Ni " +0x4f61: "Xuan " +0x4f62: "Qu " +0x4f63: "Yong " +0x4f64: "Wa " +0x4f65: "Qian " +0x4f66: "[?] " +0x4f67: "Ka " +0x4f68: "[?] " +0x4f69: "Pei " +0x4f6a: "Huai " +0x4f6b: "He " +0x4f6c: "Lao " +0x4f6d: "Xiang " +0x4f6e: "Ge " +0x4f6f: "Yang " +0x4f70: "Bai " +0x4f71: "Fa " +0x4f72: "Ming " +0x4f73: "Jia " +0x4f74: "Er " +0x4f75: "Bing " +0x4f76: "Ji " +0x4f77: "Hen " +0x4f78: "Huo " +0x4f79: "Gui " +0x4f7a: "Quan " +0x4f7b: "Tiao " +0x4f7c: "Jiao " +0x4f7d: "Ci " +0x4f7e: "Yi " +0x4f7f: "Shi " +0x4f80: "Xing " +0x4f81: "Shen " +0x4f82: "Tuo " +0x4f83: "Kan " +0x4f84: "Zhi " +0x4f85: "Gai " +0x4f86: "Lai " +0x4f87: "Yi " +0x4f88: "Chi " +0x4f89: "Kua " +0x4f8a: "Guang " +0x4f8b: "Li " +0x4f8c: "Yin " +0x4f8d: "Shi " +0x4f8e: "Mi " +0x4f8f: "Zhu " +0x4f90: "Xu " +0x4f91: "You " +0x4f92: "An " +0x4f93: "Lu " +0x4f94: "Mou " +0x4f95: "Er " +0x4f96: "Lun " +0x4f97: "Tong " +0x4f98: "Cha " +0x4f99: "Chi " +0x4f9a: "Xun " +0x4f9b: "Gong " +0x4f9c: "Zhou " +0x4f9d: "Yi " +0x4f9e: "Ru " +0x4f9f: "Jian " +0x4fa0: "Xia " +0x4fa1: "Jia " +0x4fa2: "Zai " +0x4fa3: "Lu " +0x4fa4: "Ko " +0x4fa5: "Jiao " +0x4fa6: "Zhen " +0x4fa7: "Ce " +0x4fa8: "Qiao " +0x4fa9: "Kuai " +0x4faa: "Chai " +0x4fab: "Ning " +0x4fac: "Nong " +0x4fad: "Jin " +0x4fae: "Wu " +0x4faf: "Hou " +0x4fb0: "Jiong " +0x4fb1: "Cheng " +0x4fb2: "Zhen " +0x4fb3: "Zuo " +0x4fb4: "Chou " +0x4fb5: "Qin " +0x4fb6: "Lu " +0x4fb7: "Ju " +0x4fb8: "Shu " +0x4fb9: "Ting " +0x4fba: "Shen " +0x4fbb: "Tuo " +0x4fbc: "Bo " +0x4fbd: "Nan " +0x4fbe: "Hao " +0x4fbf: "Bian " +0x4fc0: "Tui " +0x4fc1: "Yu " +0x4fc2: "Xi " +0x4fc3: "Cu " +0x4fc4: "E " +0x4fc5: "Qiu " +0x4fc6: "Xu " +0x4fc7: "Kuang " +0x4fc8: "Ku " +0x4fc9: "Wu " +0x4fca: "Jun " +0x4fcb: "Yi " +0x4fcc: "Fu " +0x4fcd: "Lang " +0x4fce: "Zu " +0x4fcf: "Qiao " +0x4fd0: "Li " +0x4fd1: "Yong " +0x4fd2: "Hun " +0x4fd3: "Jing " +0x4fd4: "Xian " +0x4fd5: "San " +0x4fd6: "Pai " +0x4fd7: "Su " +0x4fd8: "Fu " +0x4fd9: "Xi " +0x4fda: "Li " +0x4fdb: "Fu " +0x4fdc: "Ping " +0x4fdd: "Bao " +0x4fde: "Yu " +0x4fdf: "Si " +0x4fe0: "Xia " +0x4fe1: "Xin " +0x4fe2: "Xiu " +0x4fe3: "Yu " +0x4fe4: "Ti " +0x4fe5: "Che " +0x4fe6: "Chou " +0x4fe7: "[?] " +0x4fe8: "Yan " +0x4fe9: "Lia " +0x4fea: "Li " +0x4feb: "Lai " +0x4fec: "[?] " +0x4fed: "Jian " +0x4fee: "Xiu " +0x4fef: "Fu " +0x4ff0: "He " +0x4ff1: "Ju " +0x4ff2: "Xiao " +0x4ff3: "Pai " +0x4ff4: "Jian " +0x4ff5: "Biao " +0x4ff6: "Chu " +0x4ff7: "Fei " +0x4ff8: "Feng " +0x4ff9: "Ya " +0x4ffa: "An " +0x4ffb: "Bei " +0x4ffc: "Yu " +0x4ffd: "Xin " +0x4ffe: "Bi " +0x4fff: "Jian " +/* x050 */ +0x5000: "Chang " +0x5001: "Chi " +0x5002: "Bing " +0x5003: "Zan " +0x5004: "Yao " +0x5005: "Cui " +0x5006: "Lia " +0x5007: "Wan " +0x5008: "Lai " +0x5009: "Cang " +0x500a: "Zong " +0x500b: "Ge " +0x500c: "Guan " +0x500d: "Bei " +0x500e: "Tian " +0x500f: "Shu " +0x5010: "Shu " +0x5011: "Men " +0x5012: "Dao " +0x5013: "Tan " +0x5014: "Jue " +0x5015: "Chui " +0x5016: "Xing " +0x5017: "Peng " +0x5018: "Tang " +0x5019: "Hou " +0x501a: "Yi " +0x501b: "Qi " +0x501c: "Ti " +0x501d: "Gan " +0x501e: "Jing " +0x501f: "Jie " +0x5020: "Sui " +0x5021: "Chang " +0x5022: "Jie " +0x5023: "Fang " +0x5024: "Zhi " +0x5025: "Kong " +0x5026: "Juan " +0x5027: "Zong " +0x5028: "Ju " +0x5029: "Qian " +0x502a: "Ni " +0x502b: "Lun " +0x502c: "Zhuo " +0x502d: "Wei " +0x502e: "Luo " +0x502f: "Song " +0x5030: "Leng " +0x5031: "Hun " +0x5032: "Dong " +0x5033: "Zi " +0x5034: "Ben " +0x5035: "Wu " +0x5036: "Ju " +0x5037: "Nai " +0x5038: "Cai " +0x5039: "Jian " +0x503a: "Zhai " +0x503b: "Ye " +0x503c: "Zhi " +0x503d: "Sha " +0x503e: "Qing " +0x503f: "[?] " +0x5040: "Ying " +0x5041: "Cheng " +0x5042: "Jian " +0x5043: "Yan " +0x5044: "Nuan " +0x5045: "Zhong " +0x5046: "Chun " +0x5047: "Jia " +0x5048: "Jie " +0x5049: "Wei " +0x504a: "Yu " +0x504b: "Bing " +0x504c: "Ruo " +0x504d: "Ti " +0x504e: "Wei " +0x504f: "Pian " +0x5050: "Yan " +0x5051: "Feng " +0x5052: "Tang " +0x5053: "Wo " +0x5054: "E " +0x5055: "Xie " +0x5056: "Che " +0x5057: "Sheng " +0x5058: "Kan " +0x5059: "Di " +0x505a: "Zuo " +0x505b: "Cha " +0x505c: "Ting " +0x505d: "Bei " +0x505e: "Ye " +0x505f: "Huang " +0x5060: "Yao " +0x5061: "Zhan " +0x5062: "Chou " +0x5063: "Yan " +0x5064: "You " +0x5065: "Jian " +0x5066: "Xu " +0x5067: "Zha " +0x5068: "Ci " +0x5069: "Fu " +0x506a: "Bi " +0x506b: "Zhi " +0x506c: "Zong " +0x506d: "Mian " +0x506e: "Ji " +0x506f: "Yi " +0x5070: "Xie " +0x5071: "Xun " +0x5072: "Si " +0x5073: "Duan " +0x5074: "Ce " +0x5075: "Zhen " +0x5076: "Ou " +0x5077: "Tou " +0x5078: "Tou " +0x5079: "Bei " +0x507a: "Za " +0x507b: "Lu " +0x507c: "Jie " +0x507d: "Wei " +0x507e: "Fen " +0x507f: "Chang " +0x5080: "Gui " +0x5081: "Sou " +0x5082: "Zhi " +0x5083: "Su " +0x5084: "Xia " +0x5085: "Fu " +0x5086: "Yuan " +0x5087: "Rong " +0x5088: "Li " +0x5089: "Ru " +0x508a: "Yun " +0x508b: "Gou " +0x508c: "Ma " +0x508d: "Bang " +0x508e: "Dian " +0x508f: "Tang " +0x5090: "Hao " +0x5091: "Jie " +0x5092: "Xi " +0x5093: "Shan " +0x5094: "Qian " +0x5095: "Jue " +0x5096: "Cang " +0x5097: "Chu " +0x5098: "San " +0x5099: "Bei " +0x509a: "Xiao " +0x509b: "Yong " +0x509c: "Yao " +0x509d: "Tan " +0x509e: "Suo " +0x509f: "Yang " +0x50a0: "Fa " +0x50a1: "Bing " +0x50a2: "Jia " +0x50a3: "Dai " +0x50a4: "Zai " +0x50a5: "Tang " +0x50a6: "[?] " +0x50a7: "Bin " +0x50a8: "Chu " +0x50a9: "Nuo " +0x50aa: "Can " +0x50ab: "Lei " +0x50ac: "Cui " +0x50ad: "Yong " +0x50ae: "Zao " +0x50af: "Zong " +0x50b0: "Peng " +0x50b1: "Song " +0x50b2: "Ao " +0x50b3: "Chuan " +0x50b4: "Yu " +0x50b5: "Zhai " +0x50b6: "Cou " +0x50b7: "Shang " +0x50b8: "Qiang " +0x50b9: "Jing " +0x50ba: "Chi " +0x50bb: "Sha " +0x50bc: "Han " +0x50bd: "Zhang " +0x50be: "Qing " +0x50bf: "Yan " +0x50c0: "Di " +0x50c1: "Xi " +0x50c2: "Lu " +0x50c3: "Bei " +0x50c4: "Piao " +0x50c5: "Jin " +0x50c6: "Lian " +0x50c7: "Lu " +0x50c8: "Man " +0x50c9: "Qian " +0x50ca: "Xian " +0x50cb: "Tan " +0x50cc: "Ying " +0x50cd: "Dong " +0x50ce: "Zhuan " +0x50cf: "Xiang " +0x50d0: "Shan " +0x50d1: "Qiao " +0x50d2: "Jiong " +0x50d3: "Tui " +0x50d4: "Zun " +0x50d5: "Pu " +0x50d6: "Xi " +0x50d7: "Lao " +0x50d8: "Chang " +0x50d9: "Guang " +0x50da: "Liao " +0x50db: "Qi " +0x50dc: "Deng " +0x50dd: "Chan " +0x50de: "Wei " +0x50df: "Ji " +0x50e0: "Fan " +0x50e1: "Hui " +0x50e2: "Chuan " +0x50e3: "Jian " +0x50e4: "Dan " +0x50e5: "Jiao " +0x50e6: "Jiu " +0x50e7: "Seng " +0x50e8: "Fen " +0x50e9: "Xian " +0x50ea: "Jue " +0x50eb: "E " +0x50ec: "Jiao " +0x50ed: "Jian " +0x50ee: "Tong " +0x50ef: "Lin " +0x50f0: "Bo " +0x50f1: "Gu " +0x50f2: "[?] " +0x50f3: "Su " +0x50f4: "Xian " +0x50f5: "Jiang " +0x50f6: "Min " +0x50f7: "Ye " +0x50f8: "Jin " +0x50f9: "Jia " +0x50fa: "Qiao " +0x50fb: "Pi " +0x50fc: "Feng " +0x50fd: "Zhou " +0x50fe: "Ai " +0x50ff: "Sai " +/* x051 */ +0x5100: "Yi " +0x5101: "Jun " +0x5102: "Nong " +0x5103: "Chan " +0x5104: "Yi " +0x5105: "Dang " +0x5106: "Jing " +0x5107: "Xuan " +0x5108: "Kuai " +0x5109: "Jian " +0x510a: "Chu " +0x510b: "Dan " +0x510c: "Jiao " +0x510d: "Sha " +0x510e: "Zai " +0x510f: "[?] " +0x5110: "Bin " +0x5111: "An " +0x5112: "Ru " +0x5113: "Tai " +0x5114: "Chou " +0x5115: "Chai " +0x5116: "Lan " +0x5117: "Ni " +0x5118: "Jin " +0x5119: "Qian " +0x511a: "Meng " +0x511b: "Wu " +0x511c: "Ning " +0x511d: "Qiong " +0x511e: "Ni " +0x511f: "Chang " +0x5120: "Lie " +0x5121: "Lei " +0x5122: "Lu " +0x5123: "Kuang " +0x5124: "Bao " +0x5125: "Du " +0x5126: "Biao " +0x5127: "Zan " +0x5128: "Zhi " +0x5129: "Si " +0x512a: "You " +0x512b: "Hao " +0x512c: "Chen " +0x512d: "Chen " +0x512e: "Li " +0x512f: "Teng " +0x5130: "Wei " +0x5131: "Long " +0x5132: "Chu " +0x5133: "Chan " +0x5134: "Rang " +0x5135: "Shu " +0x5136: "Hui " +0x5137: "Li " +0x5138: "Luo " +0x5139: "Zan " +0x513a: "Nuo " +0x513b: "Tang " +0x513c: "Yan " +0x513d: "Lei " +0x513e: "Nang " +0x513f: "Er " +0x5140: "Wu " +0x5141: "Yun " +0x5142: "Zan " +0x5143: "Yuan " +0x5144: "Xiong " +0x5145: "Chong " +0x5146: "Zhao " +0x5147: "Xiong " +0x5148: "Xian " +0x5149: "Guang " +0x514a: "Dui " +0x514b: "Ke " +0x514c: "Dui " +0x514d: "Mian " +0x514e: "Tu " +0x514f: "Chang " +0x5150: "Er " +0x5151: "Dui " +0x5152: "Er " +0x5153: "Xin " +0x5154: "Tu " +0x5155: "Si " +0x5156: "Yan " +0x5157: "Yan " +0x5158: "Shi " +0x5159: "Shi " +0x515a: "Dang " +0x515b: "Qian " +0x515c: "Dou " +0x515d: "Fen " +0x515e: "Mao " +0x515f: "Shen " +0x5160: "Dou " +0x5161: "Bai " +0x5162: "Jing " +0x5163: "Li " +0x5164: "Huang " +0x5165: "Ru " +0x5166: "Wang " +0x5167: "Nei " +0x5168: "Quan " +0x5169: "Liang " +0x516a: "Yu " +0x516b: "Ba " +0x516c: "Gong " +0x516d: "Liu " +0x516e: "Xi " +0x516f: "[?] " +0x5170: "Lan " +0x5171: "Gong " +0x5172: "Tian " +0x5173: "Guan " +0x5174: "Xing " +0x5175: "Bing " +0x5176: "Qi " +0x5177: "Ju " +0x5178: "Dian " +0x5179: "Zi " +0x517a: "Ppwun " +0x517b: "Yang " +0x517c: "Jian " +0x517d: "Shou " +0x517e: "Ji " +0x517f: "Yi " +0x5180: "Ji " +0x5181: "Chan " +0x5182: "Jiong " +0x5183: "Mao " +0x5184: "Ran " +0x5185: "Nei " +0x5186: "Yuan " +0x5187: "Mao " +0x5188: "Gang " +0x5189: "Ran " +0x518a: "Ce " +0x518b: "Jiong " +0x518c: "Ce " +0x518d: "Zai " +0x518e: "Gua " +0x518f: "Jiong " +0x5190: "Mao " +0x5191: "Zhou " +0x5192: "Mou " +0x5193: "Gou " +0x5194: "Xu " +0x5195: "Mian " +0x5196: "Mi " +0x5197: "Rong " +0x5198: "Yin " +0x5199: "Xie " +0x519a: "Kan " +0x519b: "Jun " +0x519c: "Nong " +0x519d: "Yi " +0x519e: "Mi " +0x519f: "Shi " +0x51a0: "Guan " +0x51a1: "Meng " +0x51a2: "Zhong " +0x51a3: "Ju " +0x51a4: "Yuan " +0x51a5: "Ming " +0x51a6: "Kou " +0x51a7: "Lam " +0x51a8: "Fu " +0x51a9: "Xie " +0x51aa: "Mi " +0x51ab: "Bing " +0x51ac: "Dong " +0x51ad: "Tai " +0x51ae: "Gang " +0x51af: "Feng " +0x51b0: "Bing " +0x51b1: "Hu " +0x51b2: "Chong " +0x51b3: "Jue " +0x51b4: "Hu " +0x51b5: "Kuang " +0x51b6: "Ye " +0x51b7: "Leng " +0x51b8: "Pan " +0x51b9: "Fu " +0x51ba: "Min " +0x51bb: "Dong " +0x51bc: "Xian " +0x51bd: "Lie " +0x51be: "Xia " +0x51bf: "Jian " +0x51c0: "Jing " +0x51c1: "Shu " +0x51c2: "Mei " +0x51c3: "Tu " +0x51c4: "Qi " +0x51c5: "Gu " +0x51c6: "Zhun " +0x51c7: "Song " +0x51c8: "Jing " +0x51c9: "Liang " +0x51ca: "Qing " +0x51cb: "Diao " +0x51cc: "Ling " +0x51cd: "Dong " +0x51ce: "Gan " +0x51cf: "Jian " +0x51d0: "Yin " +0x51d1: "Cou " +0x51d2: "Yi " +0x51d3: "Li " +0x51d4: "Cang " +0x51d5: "Ming " +0x51d6: "Zhuen " +0x51d7: "Cui " +0x51d8: "Si " +0x51d9: "Duo " +0x51da: "Jin " +0x51db: "Lin " +0x51dc: "Lin " +0x51dd: "Ning " +0x51de: "Xi " +0x51df: "Du " +0x51e0: "Ji " +0x51e1: "Fan " +0x51e2: "Fan " +0x51e3: "Fan " +0x51e4: "Feng " +0x51e5: "Ju " +0x51e6: "Chu " +0x51e7: "Tako " +0x51e8: "Feng " +0x51e9: "Mok " +0x51ea: "Ci " +0x51eb: "Fu " +0x51ec: "Feng " +0x51ed: "Ping " +0x51ee: "Feng " +0x51ef: "Kai " +0x51f0: "Huang " +0x51f1: "Kai " +0x51f2: "Gan " +0x51f3: "Deng " +0x51f4: "Ping " +0x51f5: "Qu " +0x51f6: "Xiong " +0x51f7: "Kuai " +0x51f8: "Tu " +0x51f9: "Ao " +0x51fa: "Chu " +0x51fb: "Ji " +0x51fc: "Dang " +0x51fd: "Han " +0x51fe: "Han " +0x51ff: "Zao " +/* x052 */ +0x5200: "Dao " +0x5201: "Diao " +0x5202: "Dao " +0x5203: "Ren " +0x5204: "Ren " +0x5205: "Chuang " +0x5206: "Fen " +0x5207: "Qie " +0x5208: "Yi " +0x5209: "Ji " +0x520a: "Kan " +0x520b: "Qian " +0x520c: "Cun " +0x520d: "Chu " +0x520e: "Wen " +0x520f: "Ji " +0x5210: "Dan " +0x5211: "Xing " +0x5212: "Hua " +0x5213: "Wan " +0x5214: "Jue " +0x5215: "Li " +0x5216: "Yue " +0x5217: "Lie " +0x5218: "Liu " +0x5219: "Ze " +0x521a: "Gang " +0x521b: "Chuang " +0x521c: "Fu " +0x521d: "Chu " +0x521e: "Qu " +0x521f: "Ju " +0x5220: "Shan " +0x5221: "Min " +0x5222: "Ling " +0x5223: "Zhong " +0x5224: "Pan " +0x5225: "Bie " +0x5226: "Jie " +0x5227: "Jie " +0x5228: "Bao " +0x5229: "Li " +0x522a: "Shan " +0x522b: "Bie " +0x522c: "Chan " +0x522d: "Jing " +0x522e: "Gua " +0x522f: "Gen " +0x5230: "Dao " +0x5231: "Chuang " +0x5232: "Kui " +0x5233: "Ku " +0x5234: "Duo " +0x5235: "Er " +0x5236: "Zhi " +0x5237: "Shua " +0x5238: "Quan " +0x5239: "Cha " +0x523a: "Ci " +0x523b: "Ke " +0x523c: "Jie " +0x523d: "Gui " +0x523e: "Ci " +0x523f: "Gui " +0x5240: "Kai " +0x5241: "Duo " +0x5242: "Ji " +0x5243: "Ti " +0x5244: "Jing " +0x5245: "Lou " +0x5246: "Gen " +0x5247: "Ze " +0x5248: "Yuan " +0x5249: "Cuo " +0x524a: "Xue " +0x524b: "Ke " +0x524c: "La " +0x524d: "Qian " +0x524e: "Cha " +0x524f: "Chuang " +0x5250: "Gua " +0x5251: "Jian " +0x5252: "Cuo " +0x5253: "Li " +0x5254: "Ti " +0x5255: "Fei " +0x5256: "Pou " +0x5257: "Chan " +0x5258: "Qi " +0x5259: "Chuang " +0x525a: "Zi " +0x525b: "Gang " +0x525c: "Wan " +0x525d: "Bo " +0x525e: "Ji " +0x525f: "Duo " +0x5260: "Qing " +0x5261: "Yan " +0x5262: "Zhuo " +0x5263: "Jian " +0x5264: "Ji " +0x5265: "Bo " +0x5266: "Yan " +0x5267: "Ju " +0x5268: "Huo " +0x5269: "Sheng " +0x526a: "Jian " +0x526b: "Duo " +0x526c: "Duan " +0x526d: "Wu " +0x526e: "Gua " +0x526f: "Fu " +0x5270: "Sheng " +0x5271: "Jian " +0x5272: "Ge " +0x5273: "Zha " +0x5274: "Kai " +0x5275: "Chuang " +0x5276: "Juan " +0x5277: "Chan " +0x5278: "Tuan " +0x5279: "Lu " +0x527a: "Li " +0x527b: "Fou " +0x527c: "Shan " +0x527d: "Piao " +0x527e: "Kou " +0x527f: "Jiao " +0x5280: "Gua " +0x5281: "Qiao " +0x5282: "Jue " +0x5283: "Hua " +0x5284: "Zha " +0x5285: "Zhuo " +0x5286: "Lian " +0x5287: "Ju " +0x5288: "Pi " +0x5289: "Liu " +0x528a: "Gui " +0x528b: "Jiao " +0x528c: "Gui " +0x528d: "Jian " +0x528e: "Jian " +0x528f: "Tang " +0x5290: "Huo " +0x5291: "Ji " +0x5292: "Jian " +0x5293: "Yi " +0x5294: "Jian " +0x5295: "Zhi " +0x5296: "Chan " +0x5297: "Cuan " +0x5298: "Mo " +0x5299: "Li " +0x529a: "Zhu " +0x529b: "Li " +0x529c: "Ya " +0x529d: "Quan " +0x529e: "Ban " +0x529f: "Gong " +0x52a0: "Jia " +0x52a1: "Wu " +0x52a2: "Mai " +0x52a3: "Lie " +0x52a4: "Jin " +0x52a5: "Keng " +0x52a6: "Xie " +0x52a7: "Zhi " +0x52a8: "Dong " +0x52a9: "Zhu " +0x52aa: "Nu " +0x52ab: "Jie " +0x52ac: "Qu " +0x52ad: "Shao " +0x52ae: "Yi " +0x52af: "Zhu " +0x52b0: "Miao " +0x52b1: "Li " +0x52b2: "Jing " +0x52b3: "Lao " +0x52b4: "Lao " +0x52b5: "Juan " +0x52b6: "Kou " +0x52b7: "Yang " +0x52b8: "Wa " +0x52b9: "Xiao " +0x52ba: "Mou " +0x52bb: "Kuang " +0x52bc: "Jie " +0x52bd: "Lie " +0x52be: "He " +0x52bf: "Shi " +0x52c0: "Ke " +0x52c1: "Jing " +0x52c2: "Hao " +0x52c3: "Bo " +0x52c4: "Min " +0x52c5: "Chi " +0x52c6: "Lang " +0x52c7: "Yong " +0x52c8: "Yong " +0x52c9: "Mian " +0x52ca: "Ke " +0x52cb: "Xun " +0x52cc: "Juan " +0x52cd: "Qing " +0x52ce: "Lu " +0x52cf: "Pou " +0x52d0: "Meng " +0x52d1: "Lai " +0x52d2: "Le " +0x52d3: "Kai " +0x52d4: "Mian " +0x52d5: "Dong " +0x52d6: "Xu " +0x52d7: "Xu " +0x52d8: "Kan " +0x52d9: "Wu " +0x52da: "Yi " +0x52db: "Xun " +0x52dc: "Weng " +0x52dd: "Sheng " +0x52de: "Lao " +0x52df: "Mu " +0x52e0: "Lu " +0x52e1: "Piao " +0x52e2: "Shi " +0x52e3: "Ji " +0x52e4: "Qin " +0x52e5: "Qiang " +0x52e6: "Jiao " +0x52e7: "Quan " +0x52e8: "Yang " +0x52e9: "Yi " +0x52ea: "Jue " +0x52eb: "Fan " +0x52ec: "Juan " +0x52ed: "Tong " +0x52ee: "Ju " +0x52ef: "Dan " +0x52f0: "Xie " +0x52f1: "Mai " +0x52f2: "Xun " +0x52f3: "Xun " +0x52f4: "Lu " +0x52f5: "Li " +0x52f6: "Che " +0x52f7: "Rang " +0x52f8: "Quan " +0x52f9: "Bao " +0x52fa: "Shao " +0x52fb: "Yun " +0x52fc: "Jiu " +0x52fd: "Bao " +0x52fe: "Gou " +0x52ff: "Wu " +/* x053 */ +0x5300: "Yun " +0x5301: "Mwun " +0x5302: "Nay " +0x5303: "Gai " +0x5304: "Gai " +0x5305: "Bao " +0x5306: "Cong " +0x5307: "[?] " +0x5308: "Xiong " +0x5309: "Peng " +0x530a: "Ju " +0x530b: "Tao " +0x530c: "Ge " +0x530d: "Pu " +0x530e: "An " +0x530f: "Pao " +0x5310: "Fu " +0x5311: "Gong " +0x5312: "Da " +0x5313: "Jiu " +0x5314: "Qiong " +0x5315: "Bi " +0x5316: "Hua " +0x5317: "Bei " +0x5318: "Nao " +0x5319: "Chi " +0x531a: "Fang " +0x531b: "Jiu " +0x531c: "Yi " +0x531d: "Za " +0x531e: "Jiang " +0x531f: "Kang " +0x5320: "Jiang " +0x5321: "Kuang " +0x5322: "Hu " +0x5323: "Xia " +0x5324: "Qu " +0x5325: "Bian " +0x5326: "Gui " +0x5327: "Qie " +0x5328: "Zang " +0x5329: "Kuang " +0x532a: "Fei " +0x532b: "Hu " +0x532c: "Tou " +0x532d: "Gui " +0x532e: "Gui " +0x532f: "Hui " +0x5330: "Dan " +0x5331: "Gui " +0x5332: "Lian " +0x5333: "Lian " +0x5334: "Suan " +0x5335: "Du " +0x5336: "Jiu " +0x5337: "Qu " +0x5338: "Xi " +0x5339: "Pi " +0x533a: "Qu " +0x533b: "Yi " +0x533c: "Qia " +0x533d: "Yan " +0x533e: "Bian " +0x533f: "Ni " +0x5340: "Qu " +0x5341: "Shi " +0x5342: "Xin " +0x5343: "Qian " +0x5344: "Nian " +0x5345: "Sa " +0x5346: "Zu " +0x5347: "Sheng " +0x5348: "Wu " +0x5349: "Hui " +0x534a: "Ban " +0x534b: "Shi " +0x534c: "Xi " +0x534d: "Wan " +0x534e: "Hua " +0x534f: "Xie " +0x5350: "Wan " +0x5351: "Bei " +0x5352: "Zu " +0x5353: "Zhuo " +0x5354: "Xie " +0x5355: "Dan " +0x5356: "Mai " +0x5357: "Nan " +0x5358: "Dan " +0x5359: "Ji " +0x535a: "Bo " +0x535b: "Shuai " +0x535c: "Bu " +0x535d: "Kuang " +0x535e: "Bian " +0x535f: "Bu " +0x5360: "Zhan " +0x5361: "Qia " +0x5362: "Lu " +0x5363: "You " +0x5364: "Lu " +0x5365: "Xi " +0x5366: "Gua " +0x5367: "Wo " +0x5368: "Xie " +0x5369: "Jie " +0x536a: "Jie " +0x536b: "Wei " +0x536c: "Ang " +0x536d: "Qiong " +0x536e: "Zhi " +0x536f: "Mao " +0x5370: "Yin " +0x5371: "Wei " +0x5372: "Shao " +0x5373: "Ji " +0x5374: "Que " +0x5375: "Luan " +0x5376: "Shi " +0x5377: "Juan " +0x5378: "Xie " +0x5379: "Xu " +0x537a: "Jin " +0x537b: "Que " +0x537c: "Wu " +0x537d: "Ji " +0x537e: "E " +0x537f: "Qing " +0x5380: "Xi " +0x5381: "[?] " +0x5382: "Han " +0x5383: "Zhan " +0x5384: "E " +0x5385: "Ting " +0x5386: "Li " +0x5387: "Zhe " +0x5388: "Han " +0x5389: "Li " +0x538a: "Ya " +0x538b: "Ya " +0x538c: "Yan " +0x538d: "She " +0x538e: "Zhi " +0x538f: "Zha " +0x5390: "Pang " +0x5391: "[?] " +0x5392: "He " +0x5393: "Ya " +0x5394: "Zhi " +0x5395: "Ce " +0x5396: "Pang " +0x5397: "Ti " +0x5398: "Li " +0x5399: "She " +0x539a: "Hou " +0x539b: "Ting " +0x539c: "Zui " +0x539d: "Cuo " +0x539e: "Fei " +0x539f: "Yuan " +0x53a0: "Ce " +0x53a1: "Yuan " +0x53a2: "Xiang " +0x53a3: "Yan " +0x53a4: "Li " +0x53a5: "Jue " +0x53a6: "Sha " +0x53a7: "Dian " +0x53a8: "Chu " +0x53a9: "Jiu " +0x53aa: "Qin " +0x53ab: "Ao " +0x53ac: "Gui " +0x53ad: "Yan " +0x53ae: "Si " +0x53af: "Li " +0x53b0: "Chang " +0x53b1: "Lan " +0x53b2: "Li " +0x53b3: "Yan " +0x53b4: "Yan " +0x53b5: "Yuan " +0x53b6: "Si " +0x53b7: "Gong " +0x53b8: "Lin " +0x53b9: "Qiu " +0x53ba: "Qu " +0x53bb: "Qu " +0x53bc: "Uk " +0x53bd: "Lei " +0x53be: "Du " +0x53bf: "Xian " +0x53c0: "Zhuan " +0x53c1: "San " +0x53c2: "Can " +0x53c3: "Can " +0x53c4: "Can " +0x53c5: "Can " +0x53c6: "Ai " +0x53c7: "Dai " +0x53c8: "You " +0x53c9: "Cha " +0x53ca: "Ji " +0x53cb: "You " +0x53cc: "Shuang " +0x53cd: "Fan " +0x53ce: "Shou " +0x53cf: "Guai " +0x53d0: "Ba " +0x53d1: "Fa " +0x53d2: "Ruo " +0x53d3: "Shi " +0x53d4: "Shu " +0x53d5: "Zhuo " +0x53d6: "Qu " +0x53d7: "Shou " +0x53d8: "Bian " +0x53d9: "Xu " +0x53da: "Jia " +0x53db: "Pan " +0x53dc: "Sou " +0x53dd: "Gao " +0x53de: "Wei " +0x53df: "Sou " +0x53e0: "Die " +0x53e1: "Rui " +0x53e2: "Cong " +0x53e3: "Kou " +0x53e4: "Gu " +0x53e5: "Ju " +0x53e6: "Ling " +0x53e7: "Gua " +0x53e8: "Tao " +0x53e9: "Kou " +0x53ea: "Zhi " +0x53eb: "Jiao " +0x53ec: "Zhao " +0x53ed: "Ba " +0x53ee: "Ding " +0x53ef: "Ke " +0x53f0: "Tai " +0x53f1: "Chi " +0x53f2: "Shi " +0x53f3: "You " +0x53f4: "Qiu " +0x53f5: "Po " +0x53f6: "Xie " +0x53f7: "Hao " +0x53f8: "Si " +0x53f9: "Tan " +0x53fa: "Chi " +0x53fb: "Le " +0x53fc: "Diao " +0x53fd: "Ji " +0x53fe: "[?] " +0x53ff: "Hong " +/* x054 */ +0x5400: "Mie " +0x5401: "Xu " +0x5402: "Mang " +0x5403: "Chi " +0x5404: "Ge " +0x5405: "Xuan " +0x5406: "Yao " +0x5407: "Zi " +0x5408: "He " +0x5409: "Ji " +0x540a: "Diao " +0x540b: "Cun " +0x540c: "Tong " +0x540d: "Ming " +0x540e: "Hou " +0x540f: "Li " +0x5410: "Tu " +0x5411: "Xiang " +0x5412: "Zha " +0x5413: "Xia " +0x5414: "Ye " +0x5415: "Lu " +0x5416: "A " +0x5417: "Ma " +0x5418: "Ou " +0x5419: "Xue " +0x541a: "Yi " +0x541b: "Jun " +0x541c: "Chou " +0x541d: "Lin " +0x541e: "Tun " +0x541f: "Yin " +0x5420: "Fei " +0x5421: "Bi " +0x5422: "Qin " +0x5423: "Qin " +0x5424: "Jie " +0x5425: "Bu " +0x5426: "Fou " +0x5427: "Ba " +0x5428: "Dun " +0x5429: "Fen " +0x542a: "E " +0x542b: "Han " +0x542c: "Ting " +0x542d: "Hang " +0x542e: "Shun " +0x542f: "Qi " +0x5430: "Hong " +0x5431: "Zhi " +0x5432: "Shen " +0x5433: "Wu " +0x5434: "Wu " +0x5435: "Chao " +0x5436: "Ne " +0x5437: "Xue " +0x5438: "Xi " +0x5439: "Chui " +0x543a: "Dou " +0x543b: "Wen " +0x543c: "Hou " +0x543d: "Ou " +0x543e: "Wu " +0x543f: "Gao " +0x5440: "Ya " +0x5441: "Jun " +0x5442: "Lu " +0x5443: "E " +0x5444: "Ge " +0x5445: "Mei " +0x5446: "Ai " +0x5447: "Qi " +0x5448: "Cheng " +0x5449: "Wu " +0x544a: "Gao " +0x544b: "Fu " +0x544c: "Jiao " +0x544d: "Hong " +0x544e: "Chi " +0x544f: "Sheng " +0x5450: "Ne " +0x5451: "Tun " +0x5452: "Fu " +0x5453: "Yi " +0x5454: "Dai " +0x5455: "Ou " +0x5456: "Li " +0x5457: "Bai " +0x5458: "Yuan " +0x5459: "Kuai " +0x545a: "[?] " +0x545b: "Qiang " +0x545c: "Wu " +0x545d: "E " +0x545e: "Shi " +0x545f: "Quan " +0x5460: "Pen " +0x5461: "Wen " +0x5462: "Ni " +0x5463: "M " +0x5464: "Ling " +0x5465: "Ran " +0x5466: "You " +0x5467: "Di " +0x5468: "Zhou " +0x5469: "Shi " +0x546a: "Zhou " +0x546b: "Tie " +0x546c: "Xi " +0x546d: "Yi " +0x546e: "Qi " +0x546f: "Ping " +0x5470: "Zi " +0x5471: "Gu " +0x5472: "Zi " +0x5473: "Wei " +0x5474: "Xu " +0x5475: "He " +0x5476: "Nao " +0x5477: "Xia " +0x5478: "Pei " +0x5479: "Yi " +0x547a: "Xiao " +0x547b: "Shen " +0x547c: "Hu " +0x547d: "Ming " +0x547e: "Da " +0x547f: "Qu " +0x5480: "Ju " +0x5481: "Gem " +0x5482: "Za " +0x5483: "Tuo " +0x5484: "Duo " +0x5485: "Pou " +0x5486: "Pao " +0x5487: "Bi " +0x5488: "Fu " +0x5489: "Yang " +0x548a: "He " +0x548b: "Zha " +0x548c: "He " +0x548d: "Hai " +0x548e: "Jiu " +0x548f: "Yong " +0x5490: "Fu " +0x5491: "Que " +0x5492: "Zhou " +0x5493: "Wa " +0x5494: "Ka " +0x5495: "Gu " +0x5496: "Ka " +0x5497: "Zuo " +0x5498: "Bu " +0x5499: "Long " +0x549a: "Dong " +0x549b: "Ning " +0x549c: "Tha " +0x549d: "Si " +0x549e: "Xian " +0x549f: "Huo " +0x54a0: "Qi " +0x54a1: "Er " +0x54a2: "E " +0x54a3: "Guang " +0x54a4: "Zha " +0x54a5: "Xi " +0x54a6: "Yi " +0x54a7: "Lie " +0x54a8: "Zi " +0x54a9: "Mie " +0x54aa: "Mi " +0x54ab: "Zhi " +0x54ac: "Yao " +0x54ad: "Ji " +0x54ae: "Zhou " +0x54af: "Ge " +0x54b0: "Shuai " +0x54b1: "Zan " +0x54b2: "Xiao " +0x54b3: "Ke " +0x54b4: "Hui " +0x54b5: "Kua " +0x54b6: "Huai " +0x54b7: "Tao " +0x54b8: "Xian " +0x54b9: "E " +0x54ba: "Xuan " +0x54bb: "Xiu " +0x54bc: "Wai " +0x54bd: "Yan " +0x54be: "Lao " +0x54bf: "Yi " +0x54c0: "Ai " +0x54c1: "Pin " +0x54c2: "Shen " +0x54c3: "Tong " +0x54c4: "Hong " +0x54c5: "Xiong " +0x54c6: "Chi " +0x54c7: "Wa " +0x54c8: "Ha " +0x54c9: "Zai " +0x54ca: "Yu " +0x54cb: "Di " +0x54cc: "Pai " +0x54cd: "Xiang " +0x54ce: "Ai " +0x54cf: "Hen " +0x54d0: "Kuang " +0x54d1: "Ya " +0x54d2: "Da " +0x54d3: "Xiao " +0x54d4: "Bi " +0x54d5: "Yue " +0x54d6: "[?] " +0x54d7: "Hua " +0x54d8: "Sasou " +0x54d9: "Kuai " +0x54da: "Duo " +0x54db: "[?] " +0x54dc: "Ji " +0x54dd: "Nong " +0x54de: "Mou " +0x54df: "Yo " +0x54e0: "Hao " +0x54e1: "Yuan " +0x54e2: "Long " +0x54e3: "Pou " +0x54e4: "Mang " +0x54e5: "Ge " +0x54e6: "E " +0x54e7: "Chi " +0x54e8: "Shao " +0x54e9: "Li " +0x54ea: "Na " +0x54eb: "Zu " +0x54ec: "He " +0x54ed: "Ku " +0x54ee: "Xiao " +0x54ef: "Xian " +0x54f0: "Lao " +0x54f1: "Bo " +0x54f2: "Zhe " +0x54f3: "Zha " +0x54f4: "Liang " +0x54f5: "Ba " +0x54f6: "Mie " +0x54f7: "Le " +0x54f8: "Sui " +0x54f9: "Fou " +0x54fa: "Bu " +0x54fb: "Han " +0x54fc: "Heng " +0x54fd: "Geng " +0x54fe: "Shuo " +0x54ff: "Ge " +/* x055 */ +0x5500: "You " +0x5501: "Yan " +0x5502: "Gu " +0x5503: "Gu " +0x5504: "Bai " +0x5505: "Han " +0x5506: "Suo " +0x5507: "Chun " +0x5508: "Yi " +0x5509: "Ai " +0x550a: "Jia " +0x550b: "Tu " +0x550c: "Xian " +0x550d: "Huan " +0x550e: "Li " +0x550f: "Xi " +0x5510: "Tang " +0x5511: "Zuo " +0x5512: "Qiu " +0x5513: "Che " +0x5514: "Wu " +0x5515: "Zao " +0x5516: "Ya " +0x5517: "Dou " +0x5518: "Qi " +0x5519: "Di " +0x551a: "Qin " +0x551b: "Ma " +0x551c: "Mal " +0x551d: "Hong " +0x551e: "Dou " +0x551f: "Kes " +0x5520: "Lao " +0x5521: "Liang " +0x5522: "Suo " +0x5523: "Zao " +0x5524: "Huan " +0x5525: "Lang " +0x5526: "Sha " +0x5527: "Ji " +0x5528: "Zuo " +0x5529: "Wo " +0x552a: "Feng " +0x552b: "Yin " +0x552c: "Hu " +0x552d: "Qi " +0x552e: "Shou " +0x552f: "Wei " +0x5530: "Shua " +0x5531: "Chang " +0x5532: "Er " +0x5533: "Li " +0x5534: "Qiang " +0x5535: "An " +0x5536: "Jie " +0x5537: "Yo " +0x5538: "Nian " +0x5539: "Yu " +0x553a: "Tian " +0x553b: "Lai " +0x553c: "Sha " +0x553d: "Xi " +0x553e: "Tuo " +0x553f: "Hu " +0x5540: "Ai " +0x5541: "Zhou " +0x5542: "Nou " +0x5543: "Ken " +0x5544: "Zhuo " +0x5545: "Zhuo " +0x5546: "Shang " +0x5547: "Di " +0x5548: "Heng " +0x5549: "Lan " +0x554a: "A " +0x554b: "Xiao " +0x554c: "Xiang " +0x554d: "Tun " +0x554e: "Wu " +0x554f: "Wen " +0x5550: "Cui " +0x5551: "Sha " +0x5552: "Hu " +0x5553: "Qi " +0x5554: "Qi " +0x5555: "Tao " +0x5556: "Dan " +0x5557: "Dan " +0x5558: "Ye " +0x5559: "Zi " +0x555a: "Bi " +0x555b: "Cui " +0x555c: "Chuo " +0x555d: "He " +0x555e: "Ya " +0x555f: "Qi " +0x5560: "Zhe " +0x5561: "Pei " +0x5562: "Liang " +0x5563: "Xian " +0x5564: "Pi " +0x5565: "Sha " +0x5566: "La " +0x5567: "Ze " +0x5568: "Qing " +0x5569: "Gua " +0x556a: "Pa " +0x556b: "Zhe " +0x556c: "Se " +0x556d: "Zhuan " +0x556e: "Nie " +0x556f: "Guo " +0x5570: "Luo " +0x5571: "Yan " +0x5572: "Di " +0x5573: "Quan " +0x5574: "Tan " +0x5575: "Bo " +0x5576: "Ding " +0x5577: "Lang " +0x5578: "Xiao " +0x5579: "[?] " +0x557a: "Tang " +0x557b: "Chi " +0x557c: "Ti " +0x557d: "An " +0x557e: "Jiu " +0x557f: "Dan " +0x5580: "Ke " +0x5581: "Yong " +0x5582: "Wei " +0x5583: "Nan " +0x5584: "Shan " +0x5585: "Yu " +0x5586: "Zhe " +0x5587: "La " +0x5588: "Jie " +0x5589: "Hou " +0x558a: "Han " +0x558b: "Die " +0x558c: "Zhou " +0x558d: "Chai " +0x558e: "Wai " +0x558f: "Re " +0x5590: "Yu " +0x5591: "Yin " +0x5592: "Zan " +0x5593: "Yao " +0x5594: "Wo " +0x5595: "Mian " +0x5596: "Hu " +0x5597: "Yun " +0x5598: "Chuan " +0x5599: "Hui " +0x559a: "Huan " +0x559b: "Huan " +0x559c: "Xi " +0x559d: "He " +0x559e: "Ji " +0x559f: "Kui " +0x55a0: "Zhong " +0x55a1: "Wei " +0x55a2: "Sha " +0x55a3: "Xu " +0x55a4: "Huang " +0x55a5: "Du " +0x55a6: "Nie " +0x55a7: "Xuan " +0x55a8: "Liang " +0x55a9: "Yu " +0x55aa: "Sang " +0x55ab: "Chi " +0x55ac: "Qiao " +0x55ad: "Yan " +0x55ae: "Dan " +0x55af: "Pen " +0x55b0: "Can " +0x55b1: "Li " +0x55b2: "Yo " +0x55b3: "Zha " +0x55b4: "Wei " +0x55b5: "Miao " +0x55b6: "Ying " +0x55b7: "Pen " +0x55b8: "Phos " +0x55b9: "Kui " +0x55ba: "Xi " +0x55bb: "Yu " +0x55bc: "Jie " +0x55bd: "Lou " +0x55be: "Ku " +0x55bf: "Sao " +0x55c0: "Huo " +0x55c1: "Ti " +0x55c2: "Yao " +0x55c3: "He " +0x55c4: "A " +0x55c5: "Xiu " +0x55c6: "Qiang " +0x55c7: "Se " +0x55c8: "Yong " +0x55c9: "Su " +0x55ca: "Hong " +0x55cb: "Xie " +0x55cc: "Yi " +0x55cd: "Suo " +0x55ce: "Ma " +0x55cf: "Cha " +0x55d0: "Hai " +0x55d1: "Ke " +0x55d2: "Ta " +0x55d3: "Sang " +0x55d4: "Tian " +0x55d5: "Ru " +0x55d6: "Sou " +0x55d7: "Wa " +0x55d8: "Ji " +0x55d9: "Pang " +0x55da: "Wu " +0x55db: "Xian " +0x55dc: "Shi " +0x55dd: "Ge " +0x55de: "Zi " +0x55df: "Jie " +0x55e0: "Luo " +0x55e1: "Weng " +0x55e2: "Wa " +0x55e3: "Si " +0x55e4: "Chi " +0x55e5: "Hao " +0x55e6: "Suo " +0x55e7: "Jia " +0x55e8: "Hai " +0x55e9: "Suo " +0x55ea: "Qin " +0x55eb: "Nie " +0x55ec: "He " +0x55ed: "Cis " +0x55ee: "Sai " +0x55ef: "Ng " +0x55f0: "Ge " +0x55f1: "Na " +0x55f2: "Dia " +0x55f3: "Ai " +0x55f4: "[?] " +0x55f5: "Tong " +0x55f6: "Bi " +0x55f7: "Ao " +0x55f8: "Ao " +0x55f9: "Lian " +0x55fa: "Cui " +0x55fb: "Zhe " +0x55fc: "Mo " +0x55fd: "Sou " +0x55fe: "Sou " +0x55ff: "Tan " +/* x056 */ +0x5600: "Di " +0x5601: "Qi " +0x5602: "Jiao " +0x5603: "Chong " +0x5604: "Jiao " +0x5605: "Kai " +0x5606: "Tan " +0x5607: "San " +0x5608: "Cao " +0x5609: "Jia " +0x560a: "Ai " +0x560b: "Xiao " +0x560c: "Piao " +0x560d: "Lou " +0x560e: "Ga " +0x560f: "Gu " +0x5610: "Xiao " +0x5611: "Hu " +0x5612: "Hui " +0x5613: "Guo " +0x5614: "Ou " +0x5615: "Xian " +0x5616: "Ze " +0x5617: "Chang " +0x5618: "Xu " +0x5619: "Po " +0x561a: "De " +0x561b: "Ma " +0x561c: "Ma " +0x561d: "Hu " +0x561e: "Lei " +0x561f: "Du " +0x5620: "Ga " +0x5621: "Tang " +0x5622: "Ye " +0x5623: "Beng " +0x5624: "Ying " +0x5625: "Saai " +0x5626: "Jiao " +0x5627: "Mi " +0x5628: "Xiao " +0x5629: "Hua " +0x562a: "Mai " +0x562b: "Ran " +0x562c: "Zuo " +0x562d: "Peng " +0x562e: "Lao " +0x562f: "Xiao " +0x5630: "Ji " +0x5631: "Zhu " +0x5632: "Chao " +0x5633: "Kui " +0x5634: "Zui " +0x5635: "Xiao " +0x5636: "Si " +0x5637: "Hao " +0x5638: "Fu " +0x5639: "Liao " +0x563a: "Qiao " +0x563b: "Xi " +0x563c: "Xiu " +0x563d: "Tan " +0x563e: "Tan " +0x563f: "Mo " +0x5640: "Xun " +0x5641: "E " +0x5642: "Zun " +0x5643: "Fan " +0x5644: "Chi " +0x5645: "Hui " +0x5646: "Zan " +0x5647: "Chuang " +0x5648: "Cu " +0x5649: "Dan " +0x564a: "Yu " +0x564b: "Tun " +0x564c: "Cheng " +0x564d: "Jiao " +0x564e: "Ye " +0x564f: "Xi " +0x5650: "Qi " +0x5651: "Hao " +0x5652: "Lian " +0x5653: "Xu " +0x5654: "Deng " +0x5655: "Hui " +0x5656: "Yin " +0x5657: "Pu " +0x5658: "Jue " +0x5659: "Qin " +0x565a: "Xun " +0x565b: "Nie " +0x565c: "Lu " +0x565d: "Si " +0x565e: "Yan " +0x565f: "Ying " +0x5660: "Da " +0x5661: "Dan " +0x5662: "Yu " +0x5663: "Zhou " +0x5664: "Jin " +0x5665: "Nong " +0x5666: "Yue " +0x5667: "Hui " +0x5668: "Qi " +0x5669: "E " +0x566a: "Zao " +0x566b: "Yi " +0x566c: "Shi " +0x566d: "Jiao " +0x566e: "Yuan " +0x566f: "Ai " +0x5670: "Yong " +0x5671: "Jue " +0x5672: "Kuai " +0x5673: "Yu " +0x5674: "Pen " +0x5675: "Dao " +0x5676: "Ge " +0x5677: "Xin " +0x5678: "Dun " +0x5679: "Dang " +0x567a: "Sin " +0x567b: "Sai " +0x567c: "Pi " +0x567d: "Pi " +0x567e: "Yin " +0x567f: "Zui " +0x5680: "Ning " +0x5681: "Di " +0x5682: "Lan " +0x5683: "Ta " +0x5684: "Huo " +0x5685: "Ru " +0x5686: "Hao " +0x5687: "Xia " +0x5688: "Ya " +0x5689: "Duo " +0x568a: "Xi " +0x568b: "Chou " +0x568c: "Ji " +0x568d: "Jin " +0x568e: "Hao " +0x568f: "Ti " +0x5690: "Chang " +0x5691: "[?] " +0x5692: "[?] " +0x5693: "Ca " +0x5694: "Ti " +0x5695: "Lu " +0x5696: "Hui " +0x5697: "Bo " +0x5698: "You " +0x5699: "Nie " +0x569a: "Yin " +0x569b: "Hu " +0x569c: "Mo " +0x569d: "Huang " +0x569e: "Zhe " +0x569f: "Li " +0x56a0: "Liu " +0x56a1: "Haai " +0x56a2: "Nang " +0x56a3: "Xiao " +0x56a4: "Mo " +0x56a5: "Yan " +0x56a6: "Li " +0x56a7: "Lu " +0x56a8: "Long " +0x56a9: "Fu " +0x56aa: "Dan " +0x56ab: "Chen " +0x56ac: "Pin " +0x56ad: "Pi " +0x56ae: "Xiang " +0x56af: "Huo " +0x56b0: "Mo " +0x56b1: "Xi " +0x56b2: "Duo " +0x56b3: "Ku " +0x56b4: "Yan " +0x56b5: "Chan " +0x56b6: "Ying " +0x56b7: "Rang " +0x56b8: "Dian " +0x56b9: "La " +0x56ba: "Ta " +0x56bb: "Xiao " +0x56bc: "Jiao " +0x56bd: "Chuo " +0x56be: "Huan " +0x56bf: "Huo " +0x56c0: "Zhuan " +0x56c1: "Nie " +0x56c2: "Xiao " +0x56c3: "Ca " +0x56c4: "Li " +0x56c5: "Chan " +0x56c6: "Chai " +0x56c7: "Li " +0x56c8: "Yi " +0x56c9: "Luo " +0x56ca: "Nang " +0x56cb: "Zan " +0x56cc: "Su " +0x56cd: "Xi " +0x56ce: "So " +0x56cf: "Jian " +0x56d0: "Za " +0x56d1: "Zhu " +0x56d2: "Lan " +0x56d3: "Nie " +0x56d4: "Nang " +0x56d5: "[?] " +0x56d6: "[?] " +0x56d7: "Wei " +0x56d8: "Hui " +0x56d9: "Yin " +0x56da: "Qiu " +0x56db: "Si " +0x56dc: "Nin " +0x56dd: "Jian " +0x56de: "Hui " +0x56df: "Xin " +0x56e0: "Yin " +0x56e1: "Nan " +0x56e2: "Tuan " +0x56e3: "Tuan " +0x56e4: "Dun " +0x56e5: "Kang " +0x56e6: "Yuan " +0x56e7: "Jiong " +0x56e8: "Pian " +0x56e9: "Yun " +0x56ea: "Cong " +0x56eb: "Hu " +0x56ec: "Hui " +0x56ed: "Yuan " +0x56ee: "You " +0x56ef: "Guo " +0x56f0: "Kun " +0x56f1: "Cong " +0x56f2: "Wei " +0x56f3: "Tu " +0x56f4: "Wei " +0x56f5: "Lun " +0x56f6: "Guo " +0x56f7: "Qun " +0x56f8: "Ri " +0x56f9: "Ling " +0x56fa: "Gu " +0x56fb: "Guo " +0x56fc: "Tai " +0x56fd: "Guo " +0x56fe: "Tu " +0x56ff: "You " +/* x057 */ +0x5700: "Guo " +0x5701: "Yin " +0x5702: "Hun " +0x5703: "Pu " +0x5704: "Yu " +0x5705: "Han " +0x5706: "Yuan " +0x5707: "Lun " +0x5708: "Quan " +0x5709: "Yu " +0x570a: "Qing " +0x570b: "Guo " +0x570c: "Chuan " +0x570d: "Wei " +0x570e: "Yuan " +0x570f: "Quan " +0x5710: "Ku " +0x5711: "Fu " +0x5712: "Yuan " +0x5713: "Yuan " +0x5714: "E " +0x5715: "Tu " +0x5716: "Tu " +0x5717: "Tu " +0x5718: "Tuan " +0x5719: "Lue " +0x571a: "Hui " +0x571b: "Yi " +0x571c: "Yuan " +0x571d: "Luan " +0x571e: "Luan " +0x571f: "Tu " +0x5720: "Ya " +0x5721: "Tu " +0x5722: "Ting " +0x5723: "Sheng " +0x5724: "Pu " +0x5725: "Lu " +0x5726: "Iri " +0x5727: "Ya " +0x5728: "Zai " +0x5729: "Wei " +0x572a: "Ge " +0x572b: "Yu " +0x572c: "Wu " +0x572d: "Gui " +0x572e: "Pi " +0x572f: "Yi " +0x5730: "Di " +0x5731: "Qian " +0x5732: "Qian " +0x5733: "Zhen " +0x5734: "Zhuo " +0x5735: "Dang " +0x5736: "Qia " +0x5737: "Akutsu " +0x5738: "Yama " +0x5739: "Kuang " +0x573a: "Chang " +0x573b: "Qi " +0x573c: "Nie " +0x573d: "Mo " +0x573e: "Ji " +0x573f: "Jia " +0x5740: "Zhi " +0x5741: "Zhi " +0x5742: "Ban " +0x5743: "Xun " +0x5744: "Tou " +0x5745: "Qin " +0x5746: "Fen " +0x5747: "Jun " +0x5748: "Keng " +0x5749: "Tun " +0x574a: "Fang " +0x574b: "Fen " +0x574c: "Ben " +0x574d: "Tan " +0x574e: "Kan " +0x574f: "Pi " +0x5750: "Zuo " +0x5751: "Keng " +0x5752: "Bi " +0x5753: "Xing " +0x5754: "Di " +0x5755: "Jing " +0x5756: "Ji " +0x5757: "Kuai " +0x5758: "Di " +0x5759: "Jing " +0x575a: "Jian " +0x575b: "Tan " +0x575c: "Li " +0x575d: "Ba " +0x575e: "Wu " +0x575f: "Fen " +0x5760: "Zhui " +0x5761: "Po " +0x5762: "Pan " +0x5763: "Tang " +0x5764: "Kun " +0x5765: "Qu " +0x5766: "Tan " +0x5767: "Zhi " +0x5768: "Tuo " +0x5769: "Gan " +0x576a: "Ping " +0x576b: "Dian " +0x576c: "Gua " +0x576d: "Ni " +0x576e: "Tai " +0x576f: "Pi " +0x5770: "Jiong " +0x5771: "Yang " +0x5772: "Fo " +0x5773: "Ao " +0x5774: "Liu " +0x5775: "Qiu " +0x5776: "Mu " +0x5777: "Ke " +0x5778: "Gou " +0x5779: "Xue " +0x577a: "Ba " +0x577b: "Chi " +0x577c: "Che " +0x577d: "Ling " +0x577e: "Zhu " +0x577f: "Fu " +0x5780: "Hu " +0x5781: "Zhi " +0x5782: "Chui " +0x5783: "La " +0x5784: "Long " +0x5785: "Long " +0x5786: "Lu " +0x5787: "Ao " +0x5788: "Tay " +0x5789: "Pao " +0x578a: "[?] " +0x578b: "Xing " +0x578c: "Dong " +0x578d: "Ji " +0x578e: "Ke " +0x578f: "Lu " +0x5790: "Ci " +0x5791: "Chi " +0x5792: "Lei " +0x5793: "Gai " +0x5794: "Yin " +0x5795: "Hou " +0x5796: "Dui " +0x5797: "Zhao " +0x5798: "Fu " +0x5799: "Guang " +0x579a: "Yao " +0x579b: "Duo " +0x579c: "Duo " +0x579d: "Gui " +0x579e: "Cha " +0x579f: "Yang " +0x57a0: "Yin " +0x57a1: "Fa " +0x57a2: "Gou " +0x57a3: "Yuan " +0x57a4: "Die " +0x57a5: "Xie " +0x57a6: "Ken " +0x57a7: "Jiong " +0x57a8: "Shou " +0x57a9: "E " +0x57aa: "Ha " +0x57ab: "Dian " +0x57ac: "Hong " +0x57ad: "Wu " +0x57ae: "Kua " +0x57af: "[?] " +0x57b0: "Tao " +0x57b1: "Dang " +0x57b2: "Kai " +0x57b3: "Gake " +0x57b4: "Nao " +0x57b5: "An " +0x57b6: "Xing " +0x57b7: "Xian " +0x57b8: "Huan " +0x57b9: "Bang " +0x57ba: "Pei " +0x57bb: "Ba " +0x57bc: "Yi " +0x57bd: "Yin " +0x57be: "Han " +0x57bf: "Xu " +0x57c0: "Chui " +0x57c1: "Cen " +0x57c2: "Geng " +0x57c3: "Ai " +0x57c4: "Peng " +0x57c5: "Fang " +0x57c6: "Que " +0x57c7: "Yong " +0x57c8: "Xun " +0x57c9: "Jia " +0x57ca: "Di " +0x57cb: "Mai " +0x57cc: "Lang " +0x57cd: "Xuan " +0x57ce: "Cheng " +0x57cf: "Yan " +0x57d0: "Jin " +0x57d1: "Zhe " +0x57d2: "Lei " +0x57d3: "Lie " +0x57d4: "Bu " +0x57d5: "Cheng " +0x57d6: "Gomi " +0x57d7: "Bu " +0x57d8: "Shi " +0x57d9: "Xun " +0x57da: "Guo " +0x57db: "Jiong " +0x57dc: "Ye " +0x57dd: "Nian " +0x57de: "Di " +0x57df: "Yu " +0x57e0: "Bu " +0x57e1: "Ya " +0x57e2: "Juan " +0x57e3: "Sui " +0x57e4: "Pi " +0x57e5: "Cheng " +0x57e6: "Wan " +0x57e7: "Ju " +0x57e8: "Lun " +0x57e9: "Zheng " +0x57ea: "Kong " +0x57eb: "Chong " +0x57ec: "Dong " +0x57ed: "Dai " +0x57ee: "Tan " +0x57ef: "An " +0x57f0: "Cai " +0x57f1: "Shu " +0x57f2: "Beng " +0x57f3: "Kan " +0x57f4: "Zhi " +0x57f5: "Duo " +0x57f6: "Yi " +0x57f7: "Zhi " +0x57f8: "Yi " +0x57f9: "Pei " +0x57fa: "Ji " +0x57fb: "Zhun " +0x57fc: "Qi " +0x57fd: "Sao " +0x57fe: "Ju " +0x57ff: "Ni " +/* x058 */ +0x5800: "Ku " +0x5801: "Ke " +0x5802: "Tang " +0x5803: "Kun " +0x5804: "Ni " +0x5805: "Jian " +0x5806: "Dui " +0x5807: "Jin " +0x5808: "Gang " +0x5809: "Yu " +0x580a: "E " +0x580b: "Peng " +0x580c: "Gu " +0x580d: "Tu " +0x580e: "Leng " +0x580f: "[?] " +0x5810: "Ya " +0x5811: "Qian " +0x5812: "[?] " +0x5813: "An " +0x5814: "[?] " +0x5815: "Duo " +0x5816: "Nao " +0x5817: "Tu " +0x5818: "Cheng " +0x5819: "Yin " +0x581a: "Hun " +0x581b: "Bi " +0x581c: "Lian " +0x581d: "Guo " +0x581e: "Die " +0x581f: "Zhuan " +0x5820: "Hou " +0x5821: "Bao " +0x5822: "Bao " +0x5823: "Yu " +0x5824: "Di " +0x5825: "Mao " +0x5826: "Jie " +0x5827: "Ruan " +0x5828: "E " +0x5829: "Geng " +0x582a: "Kan " +0x582b: "Zong " +0x582c: "Yu " +0x582d: "Huang " +0x582e: "E " +0x582f: "Yao " +0x5830: "Yan " +0x5831: "Bao " +0x5832: "Ji " +0x5833: "Mei " +0x5834: "Chang " +0x5835: "Du " +0x5836: "Tuo " +0x5837: "Yin " +0x5838: "Feng " +0x5839: "Zhong " +0x583a: "Jie " +0x583b: "Zhen " +0x583c: "Feng " +0x583d: "Gang " +0x583e: "Chuan " +0x583f: "Jian " +0x5840: "Pyeng " +0x5841: "Toride " +0x5842: "Xiang " +0x5843: "Huang " +0x5844: "Leng " +0x5845: "Duan " +0x5846: "[?] " +0x5847: "Xuan " +0x5848: "Ji " +0x5849: "Ji " +0x584a: "Kuai " +0x584b: "Ying " +0x584c: "Ta " +0x584d: "Cheng " +0x584e: "Yong " +0x584f: "Kai " +0x5850: "Su " +0x5851: "Su " +0x5852: "Shi " +0x5853: "Mi " +0x5854: "Ta " +0x5855: "Weng " +0x5856: "Cheng " +0x5857: "Tu " +0x5858: "Tang " +0x5859: "Que " +0x585a: "Zhong " +0x585b: "Li " +0x585c: "Peng " +0x585d: "Bang " +0x585e: "Sai " +0x585f: "Zang " +0x5860: "Dui " +0x5861: "Tian " +0x5862: "Wu " +0x5863: "Cheng " +0x5864: "Xun " +0x5865: "Ge " +0x5866: "Zhen " +0x5867: "Ai " +0x5868: "Gong " +0x5869: "Yan " +0x586a: "Kan " +0x586b: "Tian " +0x586c: "Yuan " +0x586d: "Wen " +0x586e: "Xie " +0x586f: "Liu " +0x5870: "Ama " +0x5871: "Lang " +0x5872: "Chang " +0x5873: "Peng " +0x5874: "Beng " +0x5875: "Chen " +0x5876: "Cu " +0x5877: "Lu " +0x5878: "Ou " +0x5879: "Qian " +0x587a: "Mei " +0x587b: "Mo " +0x587c: "Zhuan " +0x587d: "Shuang " +0x587e: "Shu " +0x587f: "Lou " +0x5880: "Chi " +0x5881: "Man " +0x5882: "Biao " +0x5883: "Jing " +0x5884: "Qi " +0x5885: "Shu " +0x5886: "Di " +0x5887: "Zhang " +0x5888: "Kan " +0x5889: "Yong " +0x588a: "Dian " +0x588b: "Chen " +0x588c: "Zhi " +0x588d: "Xi " +0x588e: "Guo " +0x588f: "Qiang " +0x5890: "Jin " +0x5891: "Di " +0x5892: "Shang " +0x5893: "Mu " +0x5894: "Cui " +0x5895: "Yan " +0x5896: "Ta " +0x5897: "Zeng " +0x5898: "Qi " +0x5899: "Qiang " +0x589a: "Liang " +0x589b: "[?] " +0x589c: "Zhui " +0x589d: "Qiao " +0x589e: "Zeng " +0x589f: "Xu " +0x58a0: "Shan " +0x58a1: "Shan " +0x58a2: "Ba " +0x58a3: "Pu " +0x58a4: "Kuai " +0x58a5: "Dong " +0x58a6: "Fan " +0x58a7: "Que " +0x58a8: "Mo " +0x58a9: "Dun " +0x58aa: "Dun " +0x58ab: "Dun " +0x58ac: "Di " +0x58ad: "Sheng " +0x58ae: "Duo " +0x58af: "Duo " +0x58b0: "Tan " +0x58b1: "Deng " +0x58b2: "Wu " +0x58b3: "Fen " +0x58b4: "Huang " +0x58b5: "Tan " +0x58b6: "Da " +0x58b7: "Ye " +0x58b8: "Sho " +0x58b9: "Mama " +0x58ba: "Yu " +0x58bb: "Qiang " +0x58bc: "Ji " +0x58bd: "Qiao " +0x58be: "Ken " +0x58bf: "Yi " +0x58c0: "Pi " +0x58c1: "Bi " +0x58c2: "Dian " +0x58c3: "Jiang " +0x58c4: "Ye " +0x58c5: "Yong " +0x58c6: "Bo " +0x58c7: "Tan " +0x58c8: "Lan " +0x58c9: "Ju " +0x58ca: "Huai " +0x58cb: "Dang " +0x58cc: "Rang " +0x58cd: "Qian " +0x58ce: "Xun " +0x58cf: "Lan " +0x58d0: "Xi " +0x58d1: "He " +0x58d2: "Ai " +0x58d3: "Ya " +0x58d4: "Dao " +0x58d5: "Hao " +0x58d6: "Ruan " +0x58d7: "Mama " +0x58d8: "Lei " +0x58d9: "Kuang " +0x58da: "Lu " +0x58db: "Yan " +0x58dc: "Tan " +0x58dd: "Wei " +0x58de: "Huai " +0x58df: "Long " +0x58e0: "Long " +0x58e1: "Rui " +0x58e2: "Li " +0x58e3: "Lin " +0x58e4: "Rang " +0x58e5: "Ten " +0x58e6: "Xun " +0x58e7: "Yan " +0x58e8: "Lei " +0x58e9: "Ba " +0x58ea: "[?] " +0x58eb: "Shi " +0x58ec: "Ren " +0x58ed: "[?] " +0x58ee: "Zhuang " +0x58ef: "Zhuang " +0x58f0: "Sheng " +0x58f1: "Yi " +0x58f2: "Mai " +0x58f3: "Ke " +0x58f4: "Zhu " +0x58f5: "Zhuang " +0x58f6: "Hu " +0x58f7: "Hu " +0x58f8: "Kun " +0x58f9: "Yi " +0x58fa: "Hu " +0x58fb: "Xu " +0x58fc: "Kun " +0x58fd: "Shou " +0x58fe: "Mang " +0x58ff: "Zun " +/* x059 */ +0x5900: "Shou " +0x5901: "Yi " +0x5902: "Zhi " +0x5903: "Gu " +0x5904: "Chu " +0x5905: "Jiang " +0x5906: "Feng " +0x5907: "Bei " +0x5908: "Cay " +0x5909: "Bian " +0x590a: "Sui " +0x590b: "Qun " +0x590c: "Ling " +0x590d: "Fu " +0x590e: "Zuo " +0x590f: "Xia " +0x5910: "Xiong " +0x5911: "[?] " +0x5912: "Nao " +0x5913: "Xia " +0x5914: "Kui " +0x5915: "Xi " +0x5916: "Wai " +0x5917: "Yuan " +0x5918: "Mao " +0x5919: "Su " +0x591a: "Duo " +0x591b: "Duo " +0x591c: "Ye " +0x591d: "Qing " +0x591e: "Uys " +0x591f: "Gou " +0x5920: "Gou " +0x5921: "Qi " +0x5922: "Meng " +0x5923: "Meng " +0x5924: "Yin " +0x5925: "Huo " +0x5926: "Chen " +0x5927: "Da " +0x5928: "Ze " +0x5929: "Tian " +0x592a: "Tai " +0x592b: "Fu " +0x592c: "Guai " +0x592d: "Yao " +0x592e: "Yang " +0x592f: "Hang " +0x5930: "Gao " +0x5931: "Shi " +0x5932: "Ben " +0x5933: "Tai " +0x5934: "Tou " +0x5935: "Yan " +0x5936: "Bi " +0x5937: "Yi " +0x5938: "Kua " +0x5939: "Jia " +0x593a: "Duo " +0x593b: "Kwu " +0x593c: "Kuang " +0x593d: "Yun " +0x593e: "Jia " +0x593f: "Pa " +0x5940: "En " +0x5941: "Lian " +0x5942: "Huan " +0x5943: "Di " +0x5944: "Yan " +0x5945: "Pao " +0x5946: "Quan " +0x5947: "Qi " +0x5948: "Nai " +0x5949: "Feng " +0x594a: "Xie " +0x594b: "Fen " +0x594c: "Dian " +0x594d: "[?] " +0x594e: "Kui " +0x594f: "Zou " +0x5950: "Huan " +0x5951: "Qi " +0x5952: "Kai " +0x5953: "Zha " +0x5954: "Ben " +0x5955: "Yi " +0x5956: "Jiang " +0x5957: "Tao " +0x5958: "Zang " +0x5959: "Ben " +0x595a: "Xi " +0x595b: "Xiang " +0x595c: "Fei " +0x595d: "Diao " +0x595e: "Xun " +0x595f: "Keng " +0x5960: "Dian " +0x5961: "Ao " +0x5962: "She " +0x5963: "Weng " +0x5964: "Pan " +0x5965: "Ao " +0x5966: "Wu " +0x5967: "Ao " +0x5968: "Jiang " +0x5969: "Lian " +0x596a: "Duo " +0x596b: "Yun " +0x596c: "Jiang " +0x596d: "Shi " +0x596e: "Fen " +0x596f: "Huo " +0x5970: "Bi " +0x5971: "Lian " +0x5972: "Duo " +0x5973: "Nu " +0x5974: "Nu " +0x5975: "Ding " +0x5976: "Nai " +0x5977: "Qian " +0x5978: "Jian " +0x5979: "Ta " +0x597a: "Jiu " +0x597b: "Nan " +0x597c: "Cha " +0x597d: "Hao " +0x597e: "Xian " +0x597f: "Fan " +0x5980: "Ji " +0x5981: "Shuo " +0x5982: "Ru " +0x5983: "Fei " +0x5984: "Wang " +0x5985: "Hong " +0x5986: "Zhuang " +0x5987: "Fu " +0x5988: "Ma " +0x5989: "Dan " +0x598a: "Ren " +0x598b: "Fu " +0x598c: "Jing " +0x598d: "Yan " +0x598e: "Xie " +0x598f: "Wen " +0x5990: "Zhong " +0x5991: "Pa " +0x5992: "Du " +0x5993: "Ji " +0x5994: "Keng " +0x5995: "Zhong " +0x5996: "Yao " +0x5997: "Jin " +0x5998: "Yun " +0x5999: "Miao " +0x599a: "Pei " +0x599b: "Shi " +0x599c: "Yue " +0x599d: "Zhuang " +0x599e: "Niu " +0x599f: "Yan " +0x59a0: "Na " +0x59a1: "Xin " +0x59a2: "Fen " +0x59a3: "Bi " +0x59a4: "Yu " +0x59a5: "Tuo " +0x59a6: "Feng " +0x59a7: "Yuan " +0x59a8: "Fang " +0x59a9: "Wu " +0x59aa: "Yu " +0x59ab: "Gui " +0x59ac: "Du " +0x59ad: "Ba " +0x59ae: "Ni " +0x59af: "Zhou " +0x59b0: "Zhuo " +0x59b1: "Zhao " +0x59b2: "Da " +0x59b3: "Nai " +0x59b4: "Yuan " +0x59b5: "Tou " +0x59b6: "Xuan " +0x59b7: "Zhi " +0x59b8: "E " +0x59b9: "Mei " +0x59ba: "Mo " +0x59bb: "Qi " +0x59bc: "Bi " +0x59bd: "Shen " +0x59be: "Qie " +0x59bf: "E " +0x59c0: "He " +0x59c1: "Xu " +0x59c2: "Fa " +0x59c3: "Zheng " +0x59c4: "Min " +0x59c5: "Ban " +0x59c6: "Mu " +0x59c7: "Fu " +0x59c8: "Ling " +0x59c9: "Zi " +0x59ca: "Zi " +0x59cb: "Shi " +0x59cc: "Ran " +0x59cd: "Shan " +0x59ce: "Yang " +0x59cf: "Man " +0x59d0: "Jie " +0x59d1: "Gu " +0x59d2: "Si " +0x59d3: "Xing " +0x59d4: "Wei " +0x59d5: "Zi " +0x59d6: "Ju " +0x59d7: "Shan " +0x59d8: "Pin " +0x59d9: "Ren " +0x59da: "Yao " +0x59db: "Tong " +0x59dc: "Jiang " +0x59dd: "Shu " +0x59de: "Ji " +0x59df: "Gai " +0x59e0: "Shang " +0x59e1: "Kuo " +0x59e2: "Juan " +0x59e3: "Jiao " +0x59e4: "Gou " +0x59e5: "Mu " +0x59e6: "Jian " +0x59e7: "Jian " +0x59e8: "Yi " +0x59e9: "Nian " +0x59ea: "Zhi " +0x59eb: "Ji " +0x59ec: "Ji " +0x59ed: "Xian " +0x59ee: "Heng " +0x59ef: "Guang " +0x59f0: "Jun " +0x59f1: "Kua " +0x59f2: "Yan " +0x59f3: "Ming " +0x59f4: "Lie " +0x59f5: "Pei " +0x59f6: "Yan " +0x59f7: "You " +0x59f8: "Yan " +0x59f9: "Cha " +0x59fa: "Shen " +0x59fb: "Yin " +0x59fc: "Chi " +0x59fd: "Gui " +0x59fe: "Quan " +0x59ff: "Zi " +/* x05a */ +0x5a00: "Song " +0x5a01: "Wei " +0x5a02: "Hong " +0x5a03: "Wa " +0x5a04: "Lou " +0x5a05: "Ya " +0x5a06: "Rao " +0x5a07: "Jiao " +0x5a08: "Luan " +0x5a09: "Ping " +0x5a0a: "Xian " +0x5a0b: "Shao " +0x5a0c: "Li " +0x5a0d: "Cheng " +0x5a0e: "Xiao " +0x5a0f: "Mang " +0x5a10: "Fu " +0x5a11: "Suo " +0x5a12: "Wu " +0x5a13: "Wei " +0x5a14: "Ke " +0x5a15: "Lai " +0x5a16: "Chuo " +0x5a17: "Ding " +0x5a18: "Niang " +0x5a19: "Xing " +0x5a1a: "Nan " +0x5a1b: "Yu " +0x5a1c: "Nuo " +0x5a1d: "Pei " +0x5a1e: "Nei " +0x5a1f: "Juan " +0x5a20: "Shen " +0x5a21: "Zhi " +0x5a22: "Han " +0x5a23: "Di " +0x5a24: "Zhuang " +0x5a25: "E " +0x5a26: "Pin " +0x5a27: "Tui " +0x5a28: "Han " +0x5a29: "Mian " +0x5a2a: "Wu " +0x5a2b: "Yan " +0x5a2c: "Wu " +0x5a2d: "Xi " +0x5a2e: "Yan " +0x5a2f: "Yu " +0x5a30: "Si " +0x5a31: "Yu " +0x5a32: "Wa " +0x5a33: "[?] " +0x5a34: "Xian " +0x5a35: "Ju " +0x5a36: "Qu " +0x5a37: "Shui " +0x5a38: "Qi " +0x5a39: "Xian " +0x5a3a: "Zhui " +0x5a3b: "Dong " +0x5a3c: "Chang " +0x5a3d: "Lu " +0x5a3e: "Ai " +0x5a3f: "E " +0x5a40: "E " +0x5a41: "Lou " +0x5a42: "Mian " +0x5a43: "Cong " +0x5a44: "Pou " +0x5a45: "Ju " +0x5a46: "Po " +0x5a47: "Cai " +0x5a48: "Ding " +0x5a49: "Wan " +0x5a4a: "Biao " +0x5a4b: "Xiao " +0x5a4c: "Shu " +0x5a4d: "Qi " +0x5a4e: "Hui " +0x5a4f: "Fu " +0x5a50: "E " +0x5a51: "Wo " +0x5a52: "Tan " +0x5a53: "Fei " +0x5a54: "Wei " +0x5a55: "Jie " +0x5a56: "Tian " +0x5a57: "Ni " +0x5a58: "Quan " +0x5a59: "Jing " +0x5a5a: "Hun " +0x5a5b: "Jing " +0x5a5c: "Qian " +0x5a5d: "Dian " +0x5a5e: "Xing " +0x5a5f: "Hu " +0x5a60: "Wa " +0x5a61: "Lai " +0x5a62: "Bi " +0x5a63: "Yin " +0x5a64: "Chou " +0x5a65: "Chuo " +0x5a66: "Fu " +0x5a67: "Jing " +0x5a68: "Lun " +0x5a69: "Yan " +0x5a6a: "Lan " +0x5a6b: "Kun " +0x5a6c: "Yin " +0x5a6d: "Ya " +0x5a6e: "Ju " +0x5a6f: "Li " +0x5a70: "Dian " +0x5a71: "Xian " +0x5a72: "Hwa " +0x5a73: "Hua " +0x5a74: "Ying " +0x5a75: "Chan " +0x5a76: "Shen " +0x5a77: "Ting " +0x5a78: "Dang " +0x5a79: "Yao " +0x5a7a: "Wu " +0x5a7b: "Nan " +0x5a7c: "Ruo " +0x5a7d: "Jia " +0x5a7e: "Tou " +0x5a7f: "Xu " +0x5a80: "Yu " +0x5a81: "Wei " +0x5a82: "Ti " +0x5a83: "Rou " +0x5a84: "Mei " +0x5a85: "Dan " +0x5a86: "Ruan " +0x5a87: "Qin " +0x5a88: "Hui " +0x5a89: "Wu " +0x5a8a: "Qian " +0x5a8b: "Chun " +0x5a8c: "Mao " +0x5a8d: "Fu " +0x5a8e: "Jie " +0x5a8f: "Duan " +0x5a90: "Xi " +0x5a91: "Zhong " +0x5a92: "Mei " +0x5a93: "Huang " +0x5a94: "Mian " +0x5a95: "An " +0x5a96: "Ying " +0x5a97: "Xuan " +0x5a98: "Jie " +0x5a99: "Wei " +0x5a9a: "Mei " +0x5a9b: "Yuan " +0x5a9c: "Zhen " +0x5a9d: "Qiu " +0x5a9e: "Ti " +0x5a9f: "Xie " +0x5aa0: "Tuo " +0x5aa1: "Lian " +0x5aa2: "Mao " +0x5aa3: "Ran " +0x5aa4: "Si " +0x5aa5: "Pian " +0x5aa6: "Wei " +0x5aa7: "Wa " +0x5aa8: "Jiu " +0x5aa9: "Hu " +0x5aaa: "Ao " +0x5aab: "[?] " +0x5aac: "Bou " +0x5aad: "Xu " +0x5aae: "Tou " +0x5aaf: "Gui " +0x5ab0: "Zou " +0x5ab1: "Yao " +0x5ab2: "Pi " +0x5ab3: "Xi " +0x5ab4: "Yuan " +0x5ab5: "Ying " +0x5ab6: "Rong " +0x5ab7: "Ru " +0x5ab8: "Chi " +0x5ab9: "Liu " +0x5aba: "Mei " +0x5abb: "Pan " +0x5abc: "Ao " +0x5abd: "Ma " +0x5abe: "Gou " +0x5abf: "Kui " +0x5ac0: "Qin " +0x5ac1: "Jia " +0x5ac2: "Sao " +0x5ac3: "Zhen " +0x5ac4: "Yuan " +0x5ac5: "Cha " +0x5ac6: "Yong " +0x5ac7: "Ming " +0x5ac8: "Ying " +0x5ac9: "Ji " +0x5aca: "Su " +0x5acb: "Niao " +0x5acc: "Xian " +0x5acd: "Tao " +0x5ace: "Pang " +0x5acf: "Lang " +0x5ad0: "Nao " +0x5ad1: "Bao " +0x5ad2: "Ai " +0x5ad3: "Pi " +0x5ad4: "Pin " +0x5ad5: "Yi " +0x5ad6: "Piao " +0x5ad7: "Yu " +0x5ad8: "Lei " +0x5ad9: "Xuan " +0x5ada: "Man " +0x5adb: "Yi " +0x5adc: "Zhang " +0x5add: "Kang " +0x5ade: "Yong " +0x5adf: "Ni " +0x5ae0: "Li " +0x5ae1: "Di " +0x5ae2: "Gui " +0x5ae3: "Yan " +0x5ae4: "Jin " +0x5ae5: "Zhuan " +0x5ae6: "Chang " +0x5ae7: "Ce " +0x5ae8: "Han " +0x5ae9: "Nen " +0x5aea: "Lao " +0x5aeb: "Mo " +0x5aec: "Zhe " +0x5aed: "Hu " +0x5aee: "Hu " +0x5aef: "Ao " +0x5af0: "Nen " +0x5af1: "Qiang " +0x5af2: "Ma " +0x5af3: "Pie " +0x5af4: "Gu " +0x5af5: "Wu " +0x5af6: "Jiao " +0x5af7: "Tuo " +0x5af8: "Zhan " +0x5af9: "Mao " +0x5afa: "Xian " +0x5afb: "Xian " +0x5afc: "Mo " +0x5afd: "Liao " +0x5afe: "Lian " +0x5aff: "Hua " +/* x05b */ +0x5b00: "Gui " +0x5b01: "Deng " +0x5b02: "Zhi " +0x5b03: "Xu " +0x5b04: "Yi " +0x5b05: "Hua " +0x5b06: "Xi " +0x5b07: "Hui " +0x5b08: "Rao " +0x5b09: "Xi " +0x5b0a: "Yan " +0x5b0b: "Chan " +0x5b0c: "Jiao " +0x5b0d: "Mei " +0x5b0e: "Fan " +0x5b0f: "Fan " +0x5b10: "Xian " +0x5b11: "Yi " +0x5b12: "Wei " +0x5b13: "Jiao " +0x5b14: "Fu " +0x5b15: "Shi " +0x5b16: "Bi " +0x5b17: "Shan " +0x5b18: "Sui " +0x5b19: "Qiang " +0x5b1a: "Lian " +0x5b1b: "Huan " +0x5b1c: "Xin " +0x5b1d: "Niao " +0x5b1e: "Dong " +0x5b1f: "Yi " +0x5b20: "Can " +0x5b21: "Ai " +0x5b22: "Niang " +0x5b23: "Neng " +0x5b24: "Ma " +0x5b25: "Tiao " +0x5b26: "Chou " +0x5b27: "Jin " +0x5b28: "Ci " +0x5b29: "Yu " +0x5b2a: "Pin " +0x5b2b: "Yong " +0x5b2c: "Xu " +0x5b2d: "Nai " +0x5b2e: "Yan " +0x5b2f: "Tai " +0x5b30: "Ying " +0x5b31: "Can " +0x5b32: "Niao " +0x5b33: "Wo " +0x5b34: "Ying " +0x5b35: "Mian " +0x5b36: "Kaka " +0x5b37: "Ma " +0x5b38: "Shen " +0x5b39: "Xing " +0x5b3a: "Ni " +0x5b3b: "Du " +0x5b3c: "Liu " +0x5b3d: "Yuan " +0x5b3e: "Lan " +0x5b3f: "Yan " +0x5b40: "Shuang " +0x5b41: "Ling " +0x5b42: "Jiao " +0x5b43: "Niang " +0x5b44: "Lan " +0x5b45: "Xian " +0x5b46: "Ying " +0x5b47: "Shuang " +0x5b48: "Shuai " +0x5b49: "Quan " +0x5b4a: "Mi " +0x5b4b: "Li " +0x5b4c: "Luan " +0x5b4d: "Yan " +0x5b4e: "Zhu " +0x5b4f: "Lan " +0x5b50: "Zi " +0x5b51: "Jie " +0x5b52: "Jue " +0x5b53: "Jue " +0x5b54: "Kong " +0x5b55: "Yun " +0x5b56: "Zi " +0x5b57: "Zi " +0x5b58: "Cun " +0x5b59: "Sun " +0x5b5a: "Fu " +0x5b5b: "Bei " +0x5b5c: "Zi " +0x5b5d: "Xiao " +0x5b5e: "Xin " +0x5b5f: "Meng " +0x5b60: "Si " +0x5b61: "Tai " +0x5b62: "Bao " +0x5b63: "Ji " +0x5b64: "Gu " +0x5b65: "Nu " +0x5b66: "Xue " +0x5b67: "[?] " +0x5b68: "Zhuan " +0x5b69: "Hai " +0x5b6a: "Luan " +0x5b6b: "Sun " +0x5b6c: "Huai " +0x5b6d: "Mie " +0x5b6e: "Cong " +0x5b6f: "Qian " +0x5b70: "Shu " +0x5b71: "Chan " +0x5b72: "Ya " +0x5b73: "Zi " +0x5b74: "Ni " +0x5b75: "Fu " +0x5b76: "Zi " +0x5b77: "Li " +0x5b78: "Xue " +0x5b79: "Bo " +0x5b7a: "Ru " +0x5b7b: "Lai " +0x5b7c: "Nie " +0x5b7d: "Nie " +0x5b7e: "Ying " +0x5b7f: "Luan " +0x5b80: "Mian " +0x5b81: "Zhu " +0x5b82: "Rong " +0x5b83: "Ta " +0x5b84: "Gui " +0x5b85: "Zhai " +0x5b86: "Qiong " +0x5b87: "Yu " +0x5b88: "Shou " +0x5b89: "An " +0x5b8a: "Tu " +0x5b8b: "Song " +0x5b8c: "Wan " +0x5b8d: "Rou " +0x5b8e: "Yao " +0x5b8f: "Hong " +0x5b90: "Yi " +0x5b91: "Jing " +0x5b92: "Zhun " +0x5b93: "Mi " +0x5b94: "Zhu " +0x5b95: "Dang " +0x5b96: "Hong " +0x5b97: "Zong " +0x5b98: "Guan " +0x5b99: "Zhou " +0x5b9a: "Ding " +0x5b9b: "Wan " +0x5b9c: "Yi " +0x5b9d: "Bao " +0x5b9e: "Shi " +0x5b9f: "Shi " +0x5ba0: "Chong " +0x5ba1: "Shen " +0x5ba2: "Ke " +0x5ba3: "Xuan " +0x5ba4: "Shi " +0x5ba5: "You " +0x5ba6: "Huan " +0x5ba7: "Yi " +0x5ba8: "Tiao " +0x5ba9: "Shi " +0x5baa: "Xian " +0x5bab: "Gong " +0x5bac: "Cheng " +0x5bad: "Qun " +0x5bae: "Gong " +0x5baf: "Xiao " +0x5bb0: "Zai " +0x5bb1: "Zha " +0x5bb2: "Bao " +0x5bb3: "Hai " +0x5bb4: "Yan " +0x5bb5: "Xiao " +0x5bb6: "Jia " +0x5bb7: "Shen " +0x5bb8: "Chen " +0x5bb9: "Rong " +0x5bba: "Huang " +0x5bbb: "Mi " +0x5bbc: "Kou " +0x5bbd: "Kuan " +0x5bbe: "Bin " +0x5bbf: "Su " +0x5bc0: "Cai " +0x5bc1: "Zan " +0x5bc2: "Ji " +0x5bc3: "Yuan " +0x5bc4: "Ji " +0x5bc5: "Yin " +0x5bc6: "Mi " +0x5bc7: "Kou " +0x5bc8: "Qing " +0x5bc9: "Que " +0x5bca: "Zhen " +0x5bcb: "Jian " +0x5bcc: "Fu " +0x5bcd: "Ning " +0x5bce: "Bing " +0x5bcf: "Huan " +0x5bd0: "Mei " +0x5bd1: "Qin " +0x5bd2: "Han " +0x5bd3: "Yu " +0x5bd4: "Shi " +0x5bd5: "Ning " +0x5bd6: "Qin " +0x5bd7: "Ning " +0x5bd8: "Zhi " +0x5bd9: "Yu " +0x5bda: "Bao " +0x5bdb: "Kuan " +0x5bdc: "Ning " +0x5bdd: "Qin " +0x5bde: "Mo " +0x5bdf: "Cha " +0x5be0: "Ju " +0x5be1: "Gua " +0x5be2: "Qin " +0x5be3: "Hu " +0x5be4: "Wu " +0x5be5: "Liao " +0x5be6: "Shi " +0x5be7: "Zhu " +0x5be8: "Zhai " +0x5be9: "Shen " +0x5bea: "Wei " +0x5beb: "Xie " +0x5bec: "Kuan " +0x5bed: "Hui " +0x5bee: "Liao " +0x5bef: "Jun " +0x5bf0: "Huan " +0x5bf1: "Yi " +0x5bf2: "Yi " +0x5bf3: "Bao " +0x5bf4: "Qin " +0x5bf5: "Chong " +0x5bf6: "Bao " +0x5bf7: "Feng " +0x5bf8: "Cun " +0x5bf9: "Dui " +0x5bfa: "Si " +0x5bfb: "Xun " +0x5bfc: "Dao " +0x5bfd: "Lu " +0x5bfe: "Dui " +0x5bff: "Shou " +/* x05c */ +0x5c00: "Po " +0x5c01: "Feng " +0x5c02: "Zhuan " +0x5c03: "Fu " +0x5c04: "She " +0x5c05: "Ke " +0x5c06: "Jiang " +0x5c07: "Jiang " +0x5c08: "Zhuan " +0x5c09: "Wei " +0x5c0a: "Zun " +0x5c0b: "Xun " +0x5c0c: "Shu " +0x5c0d: "Dui " +0x5c0e: "Dao " +0x5c0f: "Xiao " +0x5c10: "Ji " +0x5c11: "Shao " +0x5c12: "Er " +0x5c13: "Er " +0x5c14: "Er " +0x5c15: "Ga " +0x5c16: "Jian " +0x5c17: "Shu " +0x5c18: "Chen " +0x5c19: "Shang " +0x5c1a: "Shang " +0x5c1b: "Mo " +0x5c1c: "Ga " +0x5c1d: "Chang " +0x5c1e: "Liao " +0x5c1f: "Xian " +0x5c20: "Xian " +0x5c21: "[?] " +0x5c22: "Wang " +0x5c23: "Wang " +0x5c24: "You " +0x5c25: "Liao " +0x5c26: "Liao " +0x5c27: "Yao " +0x5c28: "Mang " +0x5c29: "Wang " +0x5c2a: "Wang " +0x5c2b: "Wang " +0x5c2c: "Ga " +0x5c2d: "Yao " +0x5c2e: "Duo " +0x5c2f: "Kui " +0x5c30: "Zhong " +0x5c31: "Jiu " +0x5c32: "Gan " +0x5c33: "Gu " +0x5c34: "Gan " +0x5c35: "Tui " +0x5c36: "Gan " +0x5c37: "Gan " +0x5c38: "Shi " +0x5c39: "Yin " +0x5c3a: "Chi " +0x5c3b: "Kao " +0x5c3c: "Ni " +0x5c3d: "Jin " +0x5c3e: "Wei " +0x5c3f: "Niao " +0x5c40: "Ju " +0x5c41: "Pi " +0x5c42: "Ceng " +0x5c43: "Xi " +0x5c44: "Bi " +0x5c45: "Ju " +0x5c46: "Jie " +0x5c47: "Tian " +0x5c48: "Qu " +0x5c49: "Ti " +0x5c4a: "Jie " +0x5c4b: "Wu " +0x5c4c: "Diao " +0x5c4d: "Shi " +0x5c4e: "Shi " +0x5c4f: "Ping " +0x5c50: "Ji " +0x5c51: "Xie " +0x5c52: "Chen " +0x5c53: "Xi " +0x5c54: "Ni " +0x5c55: "Zhan " +0x5c56: "Xi " +0x5c57: "[?] " +0x5c58: "Man " +0x5c59: "E " +0x5c5a: "Lou " +0x5c5b: "Ping " +0x5c5c: "Ti " +0x5c5d: "Fei " +0x5c5e: "Shu " +0x5c5f: "Xie " +0x5c60: "Tu " +0x5c61: "Lu " +0x5c62: "Lu " +0x5c63: "Xi " +0x5c64: "Ceng " +0x5c65: "Lu " +0x5c66: "Ju " +0x5c67: "Xie " +0x5c68: "Ju " +0x5c69: "Jue " +0x5c6a: "Liao " +0x5c6b: "Jue " +0x5c6c: "Shu " +0x5c6d: "Xi " +0x5c6e: "Che " +0x5c6f: "Tun " +0x5c70: "Ni " +0x5c71: "Shan " +0x5c72: "[?] " +0x5c73: "Xian " +0x5c74: "Li " +0x5c75: "Xue " +0x5c76: "Nata " +0x5c77: "[?] " +0x5c78: "Long " +0x5c79: "Yi " +0x5c7a: "Qi " +0x5c7b: "Ren " +0x5c7c: "Wu " +0x5c7d: "Han " +0x5c7e: "Shen " +0x5c7f: "Yu " +0x5c80: "Chu " +0x5c81: "Sui " +0x5c82: "Qi " +0x5c83: "[?] " +0x5c84: "Yue " +0x5c85: "Ban " +0x5c86: "Yao " +0x5c87: "Ang " +0x5c88: "Ya " +0x5c89: "Wu " +0x5c8a: "Jie " +0x5c8b: "E " +0x5c8c: "Ji " +0x5c8d: "Qian " +0x5c8e: "Fen " +0x5c8f: "Yuan " +0x5c90: "Qi " +0x5c91: "Cen " +0x5c92: "Qian " +0x5c93: "Qi " +0x5c94: "Cha " +0x5c95: "Jie " +0x5c96: "Qu " +0x5c97: "Gang " +0x5c98: "Xian " +0x5c99: "Ao " +0x5c9a: "Lan " +0x5c9b: "Dao " +0x5c9c: "Ba " +0x5c9d: "Zuo " +0x5c9e: "Zuo " +0x5c9f: "Yang " +0x5ca0: "Ju " +0x5ca1: "Gang " +0x5ca2: "Ke " +0x5ca3: "Gou " +0x5ca4: "Xue " +0x5ca5: "Bei " +0x5ca6: "Li " +0x5ca7: "Tiao " +0x5ca8: "Ju " +0x5ca9: "Yan " +0x5caa: "Fu " +0x5cab: "Xiu " +0x5cac: "Jia " +0x5cad: "Ling " +0x5cae: "Tuo " +0x5caf: "Pei " +0x5cb0: "You " +0x5cb1: "Dai " +0x5cb2: "Kuang " +0x5cb3: "Yue " +0x5cb4: "Qu " +0x5cb5: "Hu " +0x5cb6: "Po " +0x5cb7: "Min " +0x5cb8: "An " +0x5cb9: "Tiao " +0x5cba: "Ling " +0x5cbb: "Chi " +0x5cbc: "Yuri " +0x5cbd: "Dong " +0x5cbe: "Cem " +0x5cbf: "Kui " +0x5cc0: "Xiu " +0x5cc1: "Mao " +0x5cc2: "Tong " +0x5cc3: "Xue " +0x5cc4: "Yi " +0x5cc5: "Kura " +0x5cc6: "He " +0x5cc7: "Ke " +0x5cc8: "Luo " +0x5cc9: "E " +0x5cca: "Fu " +0x5ccb: "Xun " +0x5ccc: "Die " +0x5ccd: "Lu " +0x5cce: "An " +0x5ccf: "Er " +0x5cd0: "Gai " +0x5cd1: "Quan " +0x5cd2: "Tong " +0x5cd3: "Yi " +0x5cd4: "Mu " +0x5cd5: "Shi " +0x5cd6: "An " +0x5cd7: "Wei " +0x5cd8: "Hu " +0x5cd9: "Zhi " +0x5cda: "Mi " +0x5cdb: "Li " +0x5cdc: "Ji " +0x5cdd: "Tong " +0x5cde: "Wei " +0x5cdf: "You " +0x5ce0: "Sang " +0x5ce1: "Xia " +0x5ce2: "Li " +0x5ce3: "Yao " +0x5ce4: "Jiao " +0x5ce5: "Zheng " +0x5ce6: "Luan " +0x5ce7: "Jiao " +0x5ce8: "E " +0x5ce9: "E " +0x5cea: "Yu " +0x5ceb: "Ye " +0x5cec: "Bu " +0x5ced: "Qiao " +0x5cee: "Qun " +0x5cef: "Feng " +0x5cf0: "Feng " +0x5cf1: "Nao " +0x5cf2: "Li " +0x5cf3: "You " +0x5cf4: "Xian " +0x5cf5: "Hong " +0x5cf6: "Dao " +0x5cf7: "Shen " +0x5cf8: "Cheng " +0x5cf9: "Tu " +0x5cfa: "Geng " +0x5cfb: "Jun " +0x5cfc: "Hao " +0x5cfd: "Xia " +0x5cfe: "Yin " +0x5cff: "Yu " +/* x05d */ +0x5d00: "Lang " +0x5d01: "Kan " +0x5d02: "Lao " +0x5d03: "Lai " +0x5d04: "Xian " +0x5d05: "Que " +0x5d06: "Kong " +0x5d07: "Chong " +0x5d08: "Chong " +0x5d09: "Ta " +0x5d0a: "Lin " +0x5d0b: "Hua " +0x5d0c: "Ju " +0x5d0d: "Lai " +0x5d0e: "Qi " +0x5d0f: "Min " +0x5d10: "Kun " +0x5d11: "Kun " +0x5d12: "Zu " +0x5d13: "Gu " +0x5d14: "Cui " +0x5d15: "Ya " +0x5d16: "Ya " +0x5d17: "Gang " +0x5d18: "Lun " +0x5d19: "Lun " +0x5d1a: "Leng " +0x5d1b: "Jue " +0x5d1c: "Duo " +0x5d1d: "Zheng " +0x5d1e: "Guo " +0x5d1f: "Yin " +0x5d20: "Dong " +0x5d21: "Han " +0x5d22: "Zheng " +0x5d23: "Wei " +0x5d24: "Yao " +0x5d25: "Pi " +0x5d26: "Yan " +0x5d27: "Song " +0x5d28: "Jie " +0x5d29: "Beng " +0x5d2a: "Zu " +0x5d2b: "Jue " +0x5d2c: "Dong " +0x5d2d: "Zhan " +0x5d2e: "Gu " +0x5d2f: "Yin " +0x5d30: "[?] " +0x5d31: "Ze " +0x5d32: "Huang " +0x5d33: "Yu " +0x5d34: "Wei " +0x5d35: "Yang " +0x5d36: "Feng " +0x5d37: "Qiu " +0x5d38: "Dun " +0x5d39: "Ti " +0x5d3a: "Yi " +0x5d3b: "Zhi " +0x5d3c: "Shi " +0x5d3d: "Zai " +0x5d3e: "Yao " +0x5d3f: "E " +0x5d40: "Zhu " +0x5d41: "Kan " +0x5d42: "Lu " +0x5d43: "Yan " +0x5d44: "Mei " +0x5d45: "Gan " +0x5d46: "Ji " +0x5d47: "Ji " +0x5d48: "Huan " +0x5d49: "Ting " +0x5d4a: "Sheng " +0x5d4b: "Mei " +0x5d4c: "Qian " +0x5d4d: "Wu " +0x5d4e: "Yu " +0x5d4f: "Zong " +0x5d50: "Lan " +0x5d51: "Jue " +0x5d52: "Yan " +0x5d53: "Yan " +0x5d54: "Wei " +0x5d55: "Zong " +0x5d56: "Cha " +0x5d57: "Sui " +0x5d58: "Rong " +0x5d59: "Yamashina " +0x5d5a: "Qin " +0x5d5b: "Yu " +0x5d5c: "Kewashii " +0x5d5d: "Lou " +0x5d5e: "Tu " +0x5d5f: "Dui " +0x5d60: "Xi " +0x5d61: "Weng " +0x5d62: "Cang " +0x5d63: "Dang " +0x5d64: "Hong " +0x5d65: "Jie " +0x5d66: "Ai " +0x5d67: "Liu " +0x5d68: "Wu " +0x5d69: "Song " +0x5d6a: "Qiao " +0x5d6b: "Zi " +0x5d6c: "Wei " +0x5d6d: "Beng " +0x5d6e: "Dian " +0x5d6f: "Cuo " +0x5d70: "Qian " +0x5d71: "Yong " +0x5d72: "Nie " +0x5d73: "Cuo " +0x5d74: "Ji " +0x5d75: "[?] " +0x5d76: "Tao " +0x5d77: "Song " +0x5d78: "Zong " +0x5d79: "Jiang " +0x5d7a: "Liao " +0x5d7b: "Kang " +0x5d7c: "Chan " +0x5d7d: "Die " +0x5d7e: "Cen " +0x5d7f: "Ding " +0x5d80: "Tu " +0x5d81: "Lou " +0x5d82: "Zhang " +0x5d83: "Zhan " +0x5d84: "Zhan " +0x5d85: "Ao " +0x5d86: "Cao " +0x5d87: "Qu " +0x5d88: "Qiang " +0x5d89: "Zui " +0x5d8a: "Zui " +0x5d8b: "Dao " +0x5d8c: "Dao " +0x5d8d: "Xi " +0x5d8e: "Yu " +0x5d8f: "Bo " +0x5d90: "Long " +0x5d91: "Xiang " +0x5d92: "Ceng " +0x5d93: "Bo " +0x5d94: "Qin " +0x5d95: "Jiao " +0x5d96: "Yan " +0x5d97: "Lao " +0x5d98: "Zhan " +0x5d99: "Lin " +0x5d9a: "Liao " +0x5d9b: "Liao " +0x5d9c: "Jin " +0x5d9d: "Deng " +0x5d9e: "Duo " +0x5d9f: "Zun " +0x5da0: "Jiao " +0x5da1: "Gui " +0x5da2: "Yao " +0x5da3: "Qiao " +0x5da4: "Yao " +0x5da5: "Jue " +0x5da6: "Zhan " +0x5da7: "Yi " +0x5da8: "Xue " +0x5da9: "Nao " +0x5daa: "Ye " +0x5dab: "Ye " +0x5dac: "Yi " +0x5dad: "E " +0x5dae: "Xian " +0x5daf: "Ji " +0x5db0: "Xie " +0x5db1: "Ke " +0x5db2: "Xi " +0x5db3: "Di " +0x5db4: "Ao " +0x5db5: "Zui " +0x5db6: "[?] " +0x5db7: "Ni " +0x5db8: "Rong " +0x5db9: "Dao " +0x5dba: "Ling " +0x5dbb: "Za " +0x5dbc: "Yu " +0x5dbd: "Yue " +0x5dbe: "Yin " +0x5dbf: "[?] " +0x5dc0: "Jie " +0x5dc1: "Li " +0x5dc2: "Sui " +0x5dc3: "Long " +0x5dc4: "Long " +0x5dc5: "Dian " +0x5dc6: "Ying " +0x5dc7: "Xi " +0x5dc8: "Ju " +0x5dc9: "Chan " +0x5dca: "Ying " +0x5dcb: "Kui " +0x5dcc: "Yan " +0x5dcd: "Wei " +0x5dce: "Nao " +0x5dcf: "Quan " +0x5dd0: "Chao " +0x5dd1: "Cuan " +0x5dd2: "Luan " +0x5dd3: "Dian " +0x5dd4: "Dian " +0x5dd5: "[?] " +0x5dd6: "Yan " +0x5dd7: "Yan " +0x5dd8: "Yan " +0x5dd9: "Nao " +0x5dda: "Yan " +0x5ddb: "Chuan " +0x5ddc: "Gui " +0x5ddd: "Chuan " +0x5dde: "Zhou " +0x5ddf: "Huang " +0x5de0: "Jing " +0x5de1: "Xun " +0x5de2: "Chao " +0x5de3: "Chao " +0x5de4: "Lie " +0x5de5: "Gong " +0x5de6: "Zuo " +0x5de7: "Qiao " +0x5de8: "Ju " +0x5de9: "Gong " +0x5dea: "Kek " +0x5deb: "Wu " +0x5dec: "Pwu " +0x5ded: "Pwu " +0x5dee: "Chai " +0x5def: "Qiu " +0x5df0: "Qiu " +0x5df1: "Ji " +0x5df2: "Yi " +0x5df3: "Si " +0x5df4: "Ba " +0x5df5: "Zhi " +0x5df6: "Zhao " +0x5df7: "Xiang " +0x5df8: "Yi " +0x5df9: "Jin " +0x5dfa: "Xun " +0x5dfb: "Juan " +0x5dfc: "Phas " +0x5dfd: "Xun " +0x5dfe: "Jin " +0x5dff: "Fu " +/* x05e */ +0x5e00: "Za " +0x5e01: "Bi " +0x5e02: "Shi " +0x5e03: "Bu " +0x5e04: "Ding " +0x5e05: "Shuai " +0x5e06: "Fan " +0x5e07: "Nie " +0x5e08: "Shi " +0x5e09: "Fen " +0x5e0a: "Pa " +0x5e0b: "Zhi " +0x5e0c: "Xi " +0x5e0d: "Hu " +0x5e0e: "Dan " +0x5e0f: "Wei " +0x5e10: "Zhang " +0x5e11: "Tang " +0x5e12: "Dai " +0x5e13: "Ma " +0x5e14: "Pei " +0x5e15: "Pa " +0x5e16: "Tie " +0x5e17: "Fu " +0x5e18: "Lian " +0x5e19: "Zhi " +0x5e1a: "Zhou " +0x5e1b: "Bo " +0x5e1c: "Zhi " +0x5e1d: "Di " +0x5e1e: "Mo " +0x5e1f: "Yi " +0x5e20: "Yi " +0x5e21: "Ping " +0x5e22: "Qia " +0x5e23: "Juan " +0x5e24: "Ru " +0x5e25: "Shuai " +0x5e26: "Dai " +0x5e27: "Zheng " +0x5e28: "Shui " +0x5e29: "Qiao " +0x5e2a: "Zhen " +0x5e2b: "Shi " +0x5e2c: "Qun " +0x5e2d: "Xi " +0x5e2e: "Bang " +0x5e2f: "Dai " +0x5e30: "Gui " +0x5e31: "Chou " +0x5e32: "Ping " +0x5e33: "Zhang " +0x5e34: "Sha " +0x5e35: "Wan " +0x5e36: "Dai " +0x5e37: "Wei " +0x5e38: "Chang " +0x5e39: "Sha " +0x5e3a: "Qi " +0x5e3b: "Ze " +0x5e3c: "Guo " +0x5e3d: "Mao " +0x5e3e: "Du " +0x5e3f: "Hou " +0x5e40: "Zheng " +0x5e41: "Xu " +0x5e42: "Mi " +0x5e43: "Wei " +0x5e44: "Wo " +0x5e45: "Fu " +0x5e46: "Yi " +0x5e47: "Bang " +0x5e48: "Ping " +0x5e49: "Tazuna " +0x5e4a: "Gong " +0x5e4b: "Pan " +0x5e4c: "Huang " +0x5e4d: "Dao " +0x5e4e: "Mi " +0x5e4f: "Jia " +0x5e50: "Teng " +0x5e51: "Hui " +0x5e52: "Zhong " +0x5e53: "Shan " +0x5e54: "Man " +0x5e55: "Mu " +0x5e56: "Biao " +0x5e57: "Guo " +0x5e58: "Ze " +0x5e59: "Mu " +0x5e5a: "Bang " +0x5e5b: "Zhang " +0x5e5c: "Jiong " +0x5e5d: "Chan " +0x5e5e: "Fu " +0x5e5f: "Zhi " +0x5e60: "Hu " +0x5e61: "Fan " +0x5e62: "Chuang " +0x5e63: "Bi " +0x5e64: "Hei " +0x5e65: "[?] " +0x5e66: "Mi " +0x5e67: "Qiao " +0x5e68: "Chan " +0x5e69: "Fen " +0x5e6a: "Meng " +0x5e6b: "Bang " +0x5e6c: "Chou " +0x5e6d: "Mie " +0x5e6e: "Chu " +0x5e6f: "Jie " +0x5e70: "Xian " +0x5e71: "Lan " +0x5e72: "Gan " +0x5e73: "Ping " +0x5e74: "Nian " +0x5e75: "Qian " +0x5e76: "Bing " +0x5e77: "Bing " +0x5e78: "Xing " +0x5e79: "Gan " +0x5e7a: "Yao " +0x5e7b: "Huan " +0x5e7c: "You " +0x5e7d: "You " +0x5e7e: "Ji " +0x5e7f: "Yan " +0x5e80: "Pi " +0x5e81: "Ting " +0x5e82: "Ze " +0x5e83: "Guang " +0x5e84: "Zhuang " +0x5e85: "Mo " +0x5e86: "Qing " +0x5e87: "Bi " +0x5e88: "Qin " +0x5e89: "Dun " +0x5e8a: "Chuang " +0x5e8b: "Gui " +0x5e8c: "Ya " +0x5e8d: "Bai " +0x5e8e: "Jie " +0x5e8f: "Xu " +0x5e90: "Lu " +0x5e91: "Wu " +0x5e92: "[?] " +0x5e93: "Ku " +0x5e94: "Ying " +0x5e95: "Di " +0x5e96: "Pao " +0x5e97: "Dian " +0x5e98: "Ya " +0x5e99: "Miao " +0x5e9a: "Geng " +0x5e9b: "Ci " +0x5e9c: "Fu " +0x5e9d: "Tong " +0x5e9e: "Pang " +0x5e9f: "Fei " +0x5ea0: "Xiang " +0x5ea1: "Yi " +0x5ea2: "Zhi " +0x5ea3: "Tiao " +0x5ea4: "Zhi " +0x5ea5: "Xiu " +0x5ea6: "Du " +0x5ea7: "Zuo " +0x5ea8: "Xiao " +0x5ea9: "Tu " +0x5eaa: "Gui " +0x5eab: "Ku " +0x5eac: "Pang " +0x5ead: "Ting " +0x5eae: "You " +0x5eaf: "Bu " +0x5eb0: "Ding " +0x5eb1: "Cheng " +0x5eb2: "Lai " +0x5eb3: "Bei " +0x5eb4: "Ji " +0x5eb5: "An " +0x5eb6: "Shu " +0x5eb7: "Kang " +0x5eb8: "Yong " +0x5eb9: "Tuo " +0x5eba: "Song " +0x5ebb: "Shu " +0x5ebc: "Qing " +0x5ebd: "Yu " +0x5ebe: "Yu " +0x5ebf: "Miao " +0x5ec0: "Sou " +0x5ec1: "Ce " +0x5ec2: "Xiang " +0x5ec3: "Fei " +0x5ec4: "Jiu " +0x5ec5: "He " +0x5ec6: "Hui " +0x5ec7: "Liu " +0x5ec8: "Sha " +0x5ec9: "Lian " +0x5eca: "Lang " +0x5ecb: "Sou " +0x5ecc: "Jian " +0x5ecd: "Pou " +0x5ece: "Qing " +0x5ecf: "Jiu " +0x5ed0: "Jiu " +0x5ed1: "Qin " +0x5ed2: "Ao " +0x5ed3: "Kuo " +0x5ed4: "Lou " +0x5ed5: "Yin " +0x5ed6: "Liao " +0x5ed7: "Dai " +0x5ed8: "Lu " +0x5ed9: "Yi " +0x5eda: "Chu " +0x5edb: "Chan " +0x5edc: "Tu " +0x5edd: "Si " +0x5ede: "Xin " +0x5edf: "Miao " +0x5ee0: "Chang " +0x5ee1: "Wu " +0x5ee2: "Fei " +0x5ee3: "Guang " +0x5ee4: "Koc " +0x5ee5: "Kuai " +0x5ee6: "Bi " +0x5ee7: "Qiang " +0x5ee8: "Xie " +0x5ee9: "Lin " +0x5eea: "Lin " +0x5eeb: "Liao " +0x5eec: "Lu " +0x5eed: "[?] " +0x5eee: "Ying " +0x5eef: "Xian " +0x5ef0: "Ting " +0x5ef1: "Yong " +0x5ef2: "Li " +0x5ef3: "Ting " +0x5ef4: "Yin " +0x5ef5: "Xun " +0x5ef6: "Yan " +0x5ef7: "Ting " +0x5ef8: "Di " +0x5ef9: "Po " +0x5efa: "Jian " +0x5efb: "Hui " +0x5efc: "Nai " +0x5efd: "Hui " +0x5efe: "Gong " +0x5eff: "Nian " +/* x05f */ +0x5f00: "Kai " +0x5f01: "Bian " +0x5f02: "Yi " +0x5f03: "Qi " +0x5f04: "Nong " +0x5f05: "Fen " +0x5f06: "Ju " +0x5f07: "Yan " +0x5f08: "Yi " +0x5f09: "Zang " +0x5f0a: "Bi " +0x5f0b: "Yi " +0x5f0c: "Yi " +0x5f0d: "Er " +0x5f0e: "San " +0x5f0f: "Shi " +0x5f10: "Er " +0x5f11: "Shi " +0x5f12: "Shi " +0x5f13: "Gong " +0x5f14: "Diao " +0x5f15: "Yin " +0x5f16: "Hu " +0x5f17: "Fu " +0x5f18: "Hong " +0x5f19: "Wu " +0x5f1a: "Tui " +0x5f1b: "Chi " +0x5f1c: "Jiang " +0x5f1d: "Ba " +0x5f1e: "Shen " +0x5f1f: "Di " +0x5f20: "Zhang " +0x5f21: "Jue " +0x5f22: "Tao " +0x5f23: "Fu " +0x5f24: "Di " +0x5f25: "Mi " +0x5f26: "Xian " +0x5f27: "Hu " +0x5f28: "Chao " +0x5f29: "Nu " +0x5f2a: "Jing " +0x5f2b: "Zhen " +0x5f2c: "Yi " +0x5f2d: "Mi " +0x5f2e: "Quan " +0x5f2f: "Wan " +0x5f30: "Shao " +0x5f31: "Ruo " +0x5f32: "Xuan " +0x5f33: "Jing " +0x5f34: "Dun " +0x5f35: "Zhang " +0x5f36: "Jiang " +0x5f37: "Qiang " +0x5f38: "Peng " +0x5f39: "Dan " +0x5f3a: "Qiang " +0x5f3b: "Bi " +0x5f3c: "Bi " +0x5f3d: "She " +0x5f3e: "Dan " +0x5f3f: "Jian " +0x5f40: "Gou " +0x5f41: "Sei " +0x5f42: "Fa " +0x5f43: "Bi " +0x5f44: "Kou " +0x5f45: "Nagi " +0x5f46: "Bie " +0x5f47: "Xiao " +0x5f48: "Dan " +0x5f49: "Kuo " +0x5f4a: "Qiang " +0x5f4b: "Hong " +0x5f4c: "Mi " +0x5f4d: "Kuo " +0x5f4e: "Wan " +0x5f4f: "Jue " +0x5f50: "Ji " +0x5f51: "Ji " +0x5f52: "Gui " +0x5f53: "Dang " +0x5f54: "Lu " +0x5f55: "Lu " +0x5f56: "Tuan " +0x5f57: "Hui " +0x5f58: "Zhi " +0x5f59: "Hui " +0x5f5a: "Hui " +0x5f5b: "Yi " +0x5f5c: "Yi " +0x5f5d: "Yi " +0x5f5e: "Yi " +0x5f5f: "Huo " +0x5f60: "Huo " +0x5f61: "Shan " +0x5f62: "Xing " +0x5f63: "Wen " +0x5f64: "Tong " +0x5f65: "Yan " +0x5f66: "Yan " +0x5f67: "Yu " +0x5f68: "Chi " +0x5f69: "Cai " +0x5f6a: "Biao " +0x5f6b: "Diao " +0x5f6c: "Bin " +0x5f6d: "Peng " +0x5f6e: "Yong " +0x5f6f: "Piao " +0x5f70: "Zhang " +0x5f71: "Ying " +0x5f72: "Chi " +0x5f73: "Chi " +0x5f74: "Zhuo " +0x5f75: "Tuo " +0x5f76: "Ji " +0x5f77: "Pang " +0x5f78: "Zhong " +0x5f79: "Yi " +0x5f7a: "Wang " +0x5f7b: "Che " +0x5f7c: "Bi " +0x5f7d: "Chi " +0x5f7e: "Ling " +0x5f7f: "Fu " +0x5f80: "Wang " +0x5f81: "Zheng " +0x5f82: "Cu " +0x5f83: "Wang " +0x5f84: "Jing " +0x5f85: "Dai " +0x5f86: "Xi " +0x5f87: "Xun " +0x5f88: "Hen " +0x5f89: "Yang " +0x5f8a: "Huai " +0x5f8b: "Lu " +0x5f8c: "Hou " +0x5f8d: "Wa " +0x5f8e: "Cheng " +0x5f8f: "Zhi " +0x5f90: "Xu " +0x5f91: "Jing " +0x5f92: "Tu " +0x5f93: "Cong " +0x5f94: "[?] " +0x5f95: "Lai " +0x5f96: "Cong " +0x5f97: "De " +0x5f98: "Pai " +0x5f99: "Xi " +0x5f9a: "[?] " +0x5f9b: "Qi " +0x5f9c: "Chang " +0x5f9d: "Zhi " +0x5f9e: "Cong " +0x5f9f: "Zhou " +0x5fa0: "Lai " +0x5fa1: "Yu " +0x5fa2: "Xie " +0x5fa3: "Jie " +0x5fa4: "Jian " +0x5fa5: "Chi " +0x5fa6: "Jia " +0x5fa7: "Bian " +0x5fa8: "Huang " +0x5fa9: "Fu " +0x5faa: "Xun " +0x5fab: "Wei " +0x5fac: "Pang " +0x5fad: "Yao " +0x5fae: "Wei " +0x5faf: "Xi " +0x5fb0: "Zheng " +0x5fb1: "Piao " +0x5fb2: "Chi " +0x5fb3: "De " +0x5fb4: "Zheng " +0x5fb5: "Zheng " +0x5fb6: "Bie " +0x5fb7: "De " +0x5fb8: "Chong " +0x5fb9: "Che " +0x5fba: "Jiao " +0x5fbb: "Wei " +0x5fbc: "Jiao " +0x5fbd: "Hui " +0x5fbe: "Mei " +0x5fbf: "Long " +0x5fc0: "Xiang " +0x5fc1: "Bao " +0x5fc2: "Qu " +0x5fc3: "Xin " +0x5fc4: "Shu " +0x5fc5: "Bi " +0x5fc6: "Yi " +0x5fc7: "Le " +0x5fc8: "Ren " +0x5fc9: "Dao " +0x5fca: "Ding " +0x5fcb: "Gai " +0x5fcc: "Ji " +0x5fcd: "Ren " +0x5fce: "Ren " +0x5fcf: "Chan " +0x5fd0: "Tan " +0x5fd1: "Te " +0x5fd2: "Te " +0x5fd3: "Gan " +0x5fd4: "Qi " +0x5fd5: "Shi " +0x5fd6: "Cun " +0x5fd7: "Zhi " +0x5fd8: "Wang " +0x5fd9: "Mang " +0x5fda: "Xi " +0x5fdb: "Fan " +0x5fdc: "Ying " +0x5fdd: "Tian " +0x5fde: "Min " +0x5fdf: "Min " +0x5fe0: "Zhong " +0x5fe1: "Chong " +0x5fe2: "Wu " +0x5fe3: "Ji " +0x5fe4: "Wu " +0x5fe5: "Xi " +0x5fe6: "Ye " +0x5fe7: "You " +0x5fe8: "Wan " +0x5fe9: "Cong " +0x5fea: "Zhong " +0x5feb: "Kuai " +0x5fec: "Yu " +0x5fed: "Bian " +0x5fee: "Zhi " +0x5fef: "Qi " +0x5ff0: "Cui " +0x5ff1: "Chen " +0x5ff2: "Tai " +0x5ff3: "Tun " +0x5ff4: "Qian " +0x5ff5: "Nian " +0x5ff6: "Hun " +0x5ff7: "Xiong " +0x5ff8: "Niu " +0x5ff9: "Wang " +0x5ffa: "Xian " +0x5ffb: "Xin " +0x5ffc: "Kang " +0x5ffd: "Hu " +0x5ffe: "Kai " +0x5fff: "Fen " +/* x060 */ +0x6000: "Huai " +0x6001: "Tai " +0x6002: "Song " +0x6003: "Wu " +0x6004: "Ou " +0x6005: "Chang " +0x6006: "Chuang " +0x6007: "Ju " +0x6008: "Yi " +0x6009: "Bao " +0x600a: "Chao " +0x600b: "Min " +0x600c: "Pei " +0x600d: "Zuo " +0x600e: "Zen " +0x600f: "Yang " +0x6010: "Kou " +0x6011: "Ban " +0x6012: "Nu " +0x6013: "Nao " +0x6014: "Zheng " +0x6015: "Pa " +0x6016: "Bu " +0x6017: "Tie " +0x6018: "Gu " +0x6019: "Hu " +0x601a: "Ju " +0x601b: "Da " +0x601c: "Lian " +0x601d: "Si " +0x601e: "Chou " +0x601f: "Di " +0x6020: "Dai " +0x6021: "Yi " +0x6022: "Tu " +0x6023: "You " +0x6024: "Fu " +0x6025: "Ji " +0x6026: "Peng " +0x6027: "Xing " +0x6028: "Yuan " +0x6029: "Ni " +0x602a: "Guai " +0x602b: "Fu " +0x602c: "Xi " +0x602d: "Bi " +0x602e: "You " +0x602f: "Qie " +0x6030: "Xuan " +0x6031: "Cong " +0x6032: "Bing " +0x6033: "Huang " +0x6034: "Xu " +0x6035: "Chu " +0x6036: "Pi " +0x6037: "Xi " +0x6038: "Xi " +0x6039: "Tan " +0x603a: "Koraeru " +0x603b: "Zong " +0x603c: "Dui " +0x603d: "[?] " +0x603e: "Ki " +0x603f: "Yi " +0x6040: "Chi " +0x6041: "Ren " +0x6042: "Xun " +0x6043: "Shi " +0x6044: "Xi " +0x6045: "Lao " +0x6046: "Heng " +0x6047: "Kuang " +0x6048: "Mu " +0x6049: "Zhi " +0x604a: "Xie " +0x604b: "Lian " +0x604c: "Tiao " +0x604d: "Huang " +0x604e: "Die " +0x604f: "Hao " +0x6050: "Kong " +0x6051: "Gui " +0x6052: "Heng " +0x6053: "Xi " +0x6054: "Xiao " +0x6055: "Shu " +0x6056: "S " +0x6057: "Kua " +0x6058: "Qiu " +0x6059: "Yang " +0x605a: "Hui " +0x605b: "Hui " +0x605c: "Chi " +0x605d: "Jia " +0x605e: "Yi " +0x605f: "Xiong " +0x6060: "Guai " +0x6061: "Lin " +0x6062: "Hui " +0x6063: "Zi " +0x6064: "Xu " +0x6065: "Chi " +0x6066: "Xiang " +0x6067: "Nu " +0x6068: "Hen " +0x6069: "En " +0x606a: "Ke " +0x606b: "Tong " +0x606c: "Tian " +0x606d: "Gong " +0x606e: "Quan " +0x606f: "Xi " +0x6070: "Qia " +0x6071: "Yue " +0x6072: "Peng " +0x6073: "Ken " +0x6074: "De " +0x6075: "Hui " +0x6076: "E " +0x6077: "Kyuu " +0x6078: "Tong " +0x6079: "Yan " +0x607a: "Kai " +0x607b: "Ce " +0x607c: "Nao " +0x607d: "Yun " +0x607e: "Mang " +0x607f: "Yong " +0x6080: "Yong " +0x6081: "Yuan " +0x6082: "Pi " +0x6083: "Kun " +0x6084: "Qiao " +0x6085: "Yue " +0x6086: "Yu " +0x6087: "Yu " +0x6088: "Jie " +0x6089: "Xi " +0x608a: "Zhe " +0x608b: "Lin " +0x608c: "Ti " +0x608d: "Han " +0x608e: "Hao " +0x608f: "Qie " +0x6090: "Ti " +0x6091: "Bu " +0x6092: "Yi " +0x6093: "Qian " +0x6094: "Hui " +0x6095: "Xi " +0x6096: "Bei " +0x6097: "Man " +0x6098: "Yi " +0x6099: "Heng " +0x609a: "Song " +0x609b: "Quan " +0x609c: "Cheng " +0x609d: "Hui " +0x609e: "Wu " +0x609f: "Wu " +0x60a0: "You " +0x60a1: "Li " +0x60a2: "Liang " +0x60a3: "Huan " +0x60a4: "Cong " +0x60a5: "Yi " +0x60a6: "Yue " +0x60a7: "Li " +0x60a8: "Nin " +0x60a9: "Nao " +0x60aa: "E " +0x60ab: "Que " +0x60ac: "Xuan " +0x60ad: "Qian " +0x60ae: "Wu " +0x60af: "Min " +0x60b0: "Cong " +0x60b1: "Fei " +0x60b2: "Bei " +0x60b3: "Duo " +0x60b4: "Cui " +0x60b5: "Chang " +0x60b6: "Men " +0x60b7: "Li " +0x60b8: "Ji " +0x60b9: "Guan " +0x60ba: "Guan " +0x60bb: "Xing " +0x60bc: "Dao " +0x60bd: "Qi " +0x60be: "Kong " +0x60bf: "Tian " +0x60c0: "Lun " +0x60c1: "Xi " +0x60c2: "Kan " +0x60c3: "Kun " +0x60c4: "Ni " +0x60c5: "Qing " +0x60c6: "Chou " +0x60c7: "Dun " +0x60c8: "Guo " +0x60c9: "Chan " +0x60ca: "Liang " +0x60cb: "Wan " +0x60cc: "Yuan " +0x60cd: "Jin " +0x60ce: "Ji " +0x60cf: "Lin " +0x60d0: "Yu " +0x60d1: "Huo " +0x60d2: "He " +0x60d3: "Quan " +0x60d4: "Tan " +0x60d5: "Ti " +0x60d6: "Ti " +0x60d7: "Nie " +0x60d8: "Wang " +0x60d9: "Chuo " +0x60da: "Bu " +0x60db: "Hun " +0x60dc: "Xi " +0x60dd: "Tang " +0x60de: "Xin " +0x60df: "Wei " +0x60e0: "Hui " +0x60e1: "E " +0x60e2: "Rui " +0x60e3: "Zong " +0x60e4: "Jian " +0x60e5: "Yong " +0x60e6: "Dian " +0x60e7: "Ju " +0x60e8: "Can " +0x60e9: "Cheng " +0x60ea: "De " +0x60eb: "Bei " +0x60ec: "Qie " +0x60ed: "Can " +0x60ee: "Dan " +0x60ef: "Guan " +0x60f0: "Duo " +0x60f1: "Nao " +0x60f2: "Yun " +0x60f3: "Xiang " +0x60f4: "Zhui " +0x60f5: "Die " +0x60f6: "Huang " +0x60f7: "Chun " +0x60f8: "Qiong " +0x60f9: "Re " +0x60fa: "Xing " +0x60fb: "Ce " +0x60fc: "Bian " +0x60fd: "Hun " +0x60fe: "Zong " +0x60ff: "Ti " +/* x061 */ +0x6100: "Qiao " +0x6101: "Chou " +0x6102: "Bei " +0x6103: "Xuan " +0x6104: "Wei " +0x6105: "Ge " +0x6106: "Qian " +0x6107: "Wei " +0x6108: "Yu " +0x6109: "Yu " +0x610a: "Bi " +0x610b: "Xuan " +0x610c: "Huan " +0x610d: "Min " +0x610e: "Bi " +0x610f: "Yi " +0x6110: "Mian " +0x6111: "Yong " +0x6112: "Kai " +0x6113: "Dang " +0x6114: "Yin " +0x6115: "E " +0x6116: "Chen " +0x6117: "Mou " +0x6118: "Ke " +0x6119: "Ke " +0x611a: "Yu " +0x611b: "Ai " +0x611c: "Qie " +0x611d: "Yan " +0x611e: "Nuo " +0x611f: "Gan " +0x6120: "Yun " +0x6121: "Zong " +0x6122: "Sai " +0x6123: "Leng " +0x6124: "Fen " +0x6125: "[?] " +0x6126: "Kui " +0x6127: "Kui " +0x6128: "Que " +0x6129: "Gong " +0x612a: "Yun " +0x612b: "Su " +0x612c: "Su " +0x612d: "Qi " +0x612e: "Yao " +0x612f: "Song " +0x6130: "Huang " +0x6131: "Ji " +0x6132: "Gu " +0x6133: "Ju " +0x6134: "Chuang " +0x6135: "Ni " +0x6136: "Xie " +0x6137: "Kai " +0x6138: "Zheng " +0x6139: "Yong " +0x613a: "Cao " +0x613b: "Sun " +0x613c: "Shen " +0x613d: "Bo " +0x613e: "Kai " +0x613f: "Yuan " +0x6140: "Xie " +0x6141: "Hun " +0x6142: "Yong " +0x6143: "Yang " +0x6144: "Li " +0x6145: "Sao " +0x6146: "Tao " +0x6147: "Yin " +0x6148: "Ci " +0x6149: "Xu " +0x614a: "Qian " +0x614b: "Tai " +0x614c: "Huang " +0x614d: "Yun " +0x614e: "Shen " +0x614f: "Ming " +0x6150: "[?] " +0x6151: "She " +0x6152: "Cong " +0x6153: "Piao " +0x6154: "Mo " +0x6155: "Mu " +0x6156: "Guo " +0x6157: "Chi " +0x6158: "Can " +0x6159: "Can " +0x615a: "Can " +0x615b: "Cui " +0x615c: "Min " +0x615d: "Te " +0x615e: "Zhang " +0x615f: "Tong " +0x6160: "Ao " +0x6161: "Shuang " +0x6162: "Man " +0x6163: "Guan " +0x6164: "Que " +0x6165: "Zao " +0x6166: "Jiu " +0x6167: "Hui " +0x6168: "Kai " +0x6169: "Lian " +0x616a: "Ou " +0x616b: "Song " +0x616c: "Jin " +0x616d: "Yin " +0x616e: "Lu " +0x616f: "Shang " +0x6170: "Wei " +0x6171: "Tuan " +0x6172: "Man " +0x6173: "Qian " +0x6174: "She " +0x6175: "Yong " +0x6176: "Qing " +0x6177: "Kang " +0x6178: "Di " +0x6179: "Zhi " +0x617a: "Lou " +0x617b: "Juan " +0x617c: "Qi " +0x617d: "Qi " +0x617e: "Yu " +0x617f: "Ping " +0x6180: "Liao " +0x6181: "Cong " +0x6182: "You " +0x6183: "Chong " +0x6184: "Zhi " +0x6185: "Tong " +0x6186: "Cheng " +0x6187: "Qi " +0x6188: "Qu " +0x6189: "Peng " +0x618a: "Bei " +0x618b: "Bie " +0x618c: "Chun " +0x618d: "Jiao " +0x618e: "Zeng " +0x618f: "Chi " +0x6190: "Lian " +0x6191: "Ping " +0x6192: "Kui " +0x6193: "Hui " +0x6194: "Qiao " +0x6195: "Cheng " +0x6196: "Yin " +0x6197: "Yin " +0x6198: "Xi " +0x6199: "Xi " +0x619a: "Dan " +0x619b: "Tan " +0x619c: "Duo " +0x619d: "Dui " +0x619e: "Dui " +0x619f: "Su " +0x61a0: "Jue " +0x61a1: "Ce " +0x61a2: "Xiao " +0x61a3: "Fan " +0x61a4: "Fen " +0x61a5: "Lao " +0x61a6: "Lao " +0x61a7: "Chong " +0x61a8: "Han " +0x61a9: "Qi " +0x61aa: "Xian " +0x61ab: "Min " +0x61ac: "Jing " +0x61ad: "Liao " +0x61ae: "Wu " +0x61af: "Can " +0x61b0: "Jue " +0x61b1: "Cu " +0x61b2: "Xian " +0x61b3: "Tan " +0x61b4: "Sheng " +0x61b5: "Pi " +0x61b6: "Yi " +0x61b7: "Chu " +0x61b8: "Xian " +0x61b9: "Nao " +0x61ba: "Dan " +0x61bb: "Tan " +0x61bc: "Jing " +0x61bd: "Song " +0x61be: "Han " +0x61bf: "Jiao " +0x61c0: "Wai " +0x61c1: "Huan " +0x61c2: "Dong " +0x61c3: "Qin " +0x61c4: "Qin " +0x61c5: "Qu " +0x61c6: "Cao " +0x61c7: "Ken " +0x61c8: "Xie " +0x61c9: "Ying " +0x61ca: "Ao " +0x61cb: "Mao " +0x61cc: "Yi " +0x61cd: "Lin " +0x61ce: "Se " +0x61cf: "Jun " +0x61d0: "Huai " +0x61d1: "Men " +0x61d2: "Lan " +0x61d3: "Ai " +0x61d4: "Lin " +0x61d5: "Yan " +0x61d6: "Gua " +0x61d7: "Xia " +0x61d8: "Chi " +0x61d9: "Yu " +0x61da: "Yin " +0x61db: "Dai " +0x61dc: "Meng " +0x61dd: "Ai " +0x61de: "Meng " +0x61df: "Dui " +0x61e0: "Qi " +0x61e1: "Mo " +0x61e2: "Lan " +0x61e3: "Men " +0x61e4: "Chou " +0x61e5: "Zhi " +0x61e6: "Nuo " +0x61e7: "Nuo " +0x61e8: "Yan " +0x61e9: "Yang " +0x61ea: "Bo " +0x61eb: "Zhi " +0x61ec: "Kuang " +0x61ed: "Kuang " +0x61ee: "You " +0x61ef: "Fu " +0x61f0: "Liu " +0x61f1: "Mie " +0x61f2: "Cheng " +0x61f3: "[?] " +0x61f4: "Chan " +0x61f5: "Meng " +0x61f6: "Lan " +0x61f7: "Huai " +0x61f8: "Xuan " +0x61f9: "Rang " +0x61fa: "Chan " +0x61fb: "Ji " +0x61fc: "Ju " +0x61fd: "Huan " +0x61fe: "She " +0x61ff: "Yi " +/* x062 */ +0x6200: "Lian " +0x6201: "Nan " +0x6202: "Mi " +0x6203: "Tang " +0x6204: "Jue " +0x6205: "Gang " +0x6206: "Gang " +0x6207: "Gang " +0x6208: "Ge " +0x6209: "Yue " +0x620a: "Wu " +0x620b: "Jian " +0x620c: "Xu " +0x620d: "Shu " +0x620e: "Rong " +0x620f: "Xi " +0x6210: "Cheng " +0x6211: "Wo " +0x6212: "Jie " +0x6213: "Ge " +0x6214: "Jian " +0x6215: "Qiang " +0x6216: "Huo " +0x6217: "Qiang " +0x6218: "Zhan " +0x6219: "Dong " +0x621a: "Qi " +0x621b: "Jia " +0x621c: "Die " +0x621d: "Zei " +0x621e: "Jia " +0x621f: "Ji " +0x6220: "Shi " +0x6221: "Kan " +0x6222: "Ji " +0x6223: "Kui " +0x6224: "Gai " +0x6225: "Deng " +0x6226: "Zhan " +0x6227: "Chuang " +0x6228: "Ge " +0x6229: "Jian " +0x622a: "Jie " +0x622b: "Yu " +0x622c: "Jian " +0x622d: "Yan " +0x622e: "Lu " +0x622f: "Xi " +0x6230: "Zhan " +0x6231: "Xi " +0x6232: "Xi " +0x6233: "Chuo " +0x6234: "Dai " +0x6235: "Qu " +0x6236: "Hu " +0x6237: "Hu " +0x6238: "Hu " +0x6239: "E " +0x623a: "Shi " +0x623b: "Li " +0x623c: "Mao " +0x623d: "Hu " +0x623e: "Li " +0x623f: "Fang " +0x6240: "Suo " +0x6241: "Bian " +0x6242: "Dian " +0x6243: "Jiong " +0x6244: "Shang " +0x6245: "Yi " +0x6246: "Yi " +0x6247: "Shan " +0x6248: "Hu " +0x6249: "Fei " +0x624a: "Yan " +0x624b: "Shou " +0x624c: "T " +0x624d: "Cai " +0x624e: "Zha " +0x624f: "Qiu " +0x6250: "Le " +0x6251: "Bu " +0x6252: "Ba " +0x6253: "Da " +0x6254: "Reng " +0x6255: "Fu " +0x6256: "Hameru " +0x6257: "Zai " +0x6258: "Tuo " +0x6259: "Zhang " +0x625a: "Diao " +0x625b: "Kang " +0x625c: "Yu " +0x625d: "Ku " +0x625e: "Han " +0x625f: "Shen " +0x6260: "Cha " +0x6261: "Yi " +0x6262: "Gu " +0x6263: "Kou " +0x6264: "Wu " +0x6265: "Tuo " +0x6266: "Qian " +0x6267: "Zhi " +0x6268: "Ren " +0x6269: "Kuo " +0x626a: "Men " +0x626b: "Sao " +0x626c: "Yang " +0x626d: "Niu " +0x626e: "Ban " +0x626f: "Che " +0x6270: "Rao " +0x6271: "Xi " +0x6272: "Qian " +0x6273: "Ban " +0x6274: "Jia " +0x6275: "Yu " +0x6276: "Fu " +0x6277: "Ao " +0x6278: "Xi " +0x6279: "Pi " +0x627a: "Zhi " +0x627b: "Zi " +0x627c: "E " +0x627d: "Dun " +0x627e: "Zhao " +0x627f: "Cheng " +0x6280: "Ji " +0x6281: "Yan " +0x6282: "Kuang " +0x6283: "Bian " +0x6284: "Chao " +0x6285: "Ju " +0x6286: "Wen " +0x6287: "Hu " +0x6288: "Yue " +0x6289: "Jue " +0x628a: "Ba " +0x628b: "Qin " +0x628c: "Zhen " +0x628d: "Zheng " +0x628e: "Yun " +0x628f: "Wan " +0x6290: "Nu " +0x6291: "Yi " +0x6292: "Shu " +0x6293: "Zhua " +0x6294: "Pou " +0x6295: "Tou " +0x6296: "Dou " +0x6297: "Kang " +0x6298: "Zhe " +0x6299: "Pou " +0x629a: "Fu " +0x629b: "Pao " +0x629c: "Ba " +0x629d: "Ao " +0x629e: "Ze " +0x629f: "Tuan " +0x62a0: "Kou " +0x62a1: "Lun " +0x62a2: "Qiang " +0x62a3: "[?] " +0x62a4: "Hu " +0x62a5: "Bao " +0x62a6: "Bing " +0x62a7: "Zhi " +0x62a8: "Peng " +0x62a9: "Tan " +0x62aa: "Pu " +0x62ab: "Pi " +0x62ac: "Tai " +0x62ad: "Yao " +0x62ae: "Zhen " +0x62af: "Zha " +0x62b0: "Yang " +0x62b1: "Bao " +0x62b2: "He " +0x62b3: "Ni " +0x62b4: "Yi " +0x62b5: "Di " +0x62b6: "Chi " +0x62b7: "Pi " +0x62b8: "Za " +0x62b9: "Mo " +0x62ba: "Mo " +0x62bb: "Shen " +0x62bc: "Ya " +0x62bd: "Chou " +0x62be: "Qu " +0x62bf: "Min " +0x62c0: "Chu " +0x62c1: "Jia " +0x62c2: "Fu " +0x62c3: "Zhan " +0x62c4: "Zhu " +0x62c5: "Dan " +0x62c6: "Chai " +0x62c7: "Mu " +0x62c8: "Nian " +0x62c9: "La " +0x62ca: "Fu " +0x62cb: "Pao " +0x62cc: "Ban " +0x62cd: "Pai " +0x62ce: "Ling " +0x62cf: "Na " +0x62d0: "Guai " +0x62d1: "Qian " +0x62d2: "Ju " +0x62d3: "Tuo " +0x62d4: "Ba " +0x62d5: "Tuo " +0x62d6: "Tuo " +0x62d7: "Ao " +0x62d8: "Ju " +0x62d9: "Zhuo " +0x62da: "Pan " +0x62db: "Zhao " +0x62dc: "Bai " +0x62dd: "Bai " +0x62de: "Di " +0x62df: "Ni " +0x62e0: "Ju " +0x62e1: "Kuo " +0x62e2: "Long " +0x62e3: "Jian " +0x62e4: "[?] " +0x62e5: "Yong " +0x62e6: "Lan " +0x62e7: "Ning " +0x62e8: "Bo " +0x62e9: "Ze " +0x62ea: "Qian " +0x62eb: "Hen " +0x62ec: "Gua " +0x62ed: "Shi " +0x62ee: "Jie " +0x62ef: "Zheng " +0x62f0: "Nin " +0x62f1: "Gong " +0x62f2: "Gong " +0x62f3: "Quan " +0x62f4: "Shuan " +0x62f5: "Cun " +0x62f6: "Zan " +0x62f7: "Kao " +0x62f8: "Chi " +0x62f9: "Xie " +0x62fa: "Ce " +0x62fb: "Hui " +0x62fc: "Pin " +0x62fd: "Zhuai " +0x62fe: "Shi " +0x62ff: "Na " +/* x063 */ +0x6300: "Bo " +0x6301: "Chi " +0x6302: "Gua " +0x6303: "Zhi " +0x6304: "Kuo " +0x6305: "Duo " +0x6306: "Duo " +0x6307: "Zhi " +0x6308: "Qie " +0x6309: "An " +0x630a: "Nong " +0x630b: "Zhen " +0x630c: "Ge " +0x630d: "Jiao " +0x630e: "Ku " +0x630f: "Dong " +0x6310: "Ru " +0x6311: "Tiao " +0x6312: "Lie " +0x6313: "Zha " +0x6314: "Lu " +0x6315: "Die " +0x6316: "Wa " +0x6317: "Jue " +0x6318: "Mushiru " +0x6319: "Ju " +0x631a: "Zhi " +0x631b: "Luan " +0x631c: "Ya " +0x631d: "Zhua " +0x631e: "Ta " +0x631f: "Xie " +0x6320: "Nao " +0x6321: "Dang " +0x6322: "Jiao " +0x6323: "Zheng " +0x6324: "Ji " +0x6325: "Hui " +0x6326: "Xun " +0x6327: "Ku " +0x6328: "Ai " +0x6329: "Tuo " +0x632a: "Nuo " +0x632b: "Cuo " +0x632c: "Bo " +0x632d: "Geng " +0x632e: "Ti " +0x632f: "Zhen " +0x6330: "Cheng " +0x6331: "Suo " +0x6332: "Suo " +0x6333: "Keng " +0x6334: "Mei " +0x6335: "Long " +0x6336: "Ju " +0x6337: "Peng " +0x6338: "Jian " +0x6339: "Yi " +0x633a: "Ting " +0x633b: "Shan " +0x633c: "Nuo " +0x633d: "Wan " +0x633e: "Xie " +0x633f: "Cha " +0x6340: "Feng " +0x6341: "Jiao " +0x6342: "Wu " +0x6343: "Jun " +0x6344: "Jiu " +0x6345: "Tong " +0x6346: "Kun " +0x6347: "Huo " +0x6348: "Tu " +0x6349: "Zhuo " +0x634a: "Pou " +0x634b: "Le " +0x634c: "Ba " +0x634d: "Han " +0x634e: "Shao " +0x634f: "Nie " +0x6350: "Juan " +0x6351: "Ze " +0x6352: "Song " +0x6353: "Ye " +0x6354: "Jue " +0x6355: "Bu " +0x6356: "Huan " +0x6357: "Bu " +0x6358: "Zun " +0x6359: "Yi " +0x635a: "Zhai " +0x635b: "Lu " +0x635c: "Sou " +0x635d: "Tuo " +0x635e: "Lao " +0x635f: "Sun " +0x6360: "Bang " +0x6361: "Jian " +0x6362: "Huan " +0x6363: "Dao " +0x6364: "[?] " +0x6365: "Wan " +0x6366: "Qin " +0x6367: "Peng " +0x6368: "She " +0x6369: "Lie " +0x636a: "Min " +0x636b: "Men " +0x636c: "Fu " +0x636d: "Bai " +0x636e: "Ju " +0x636f: "Dao " +0x6370: "Wo " +0x6371: "Ai " +0x6372: "Juan " +0x6373: "Yue " +0x6374: "Zong " +0x6375: "Chen " +0x6376: "Chui " +0x6377: "Jie " +0x6378: "Tu " +0x6379: "Ben " +0x637a: "Na " +0x637b: "Nian " +0x637c: "Nuo " +0x637d: "Zu " +0x637e: "Wo " +0x637f: "Xi " +0x6380: "Xian " +0x6381: "Cheng " +0x6382: "Dian " +0x6383: "Sao " +0x6384: "Lun " +0x6385: "Qing " +0x6386: "Gang " +0x6387: "Duo " +0x6388: "Shou " +0x6389: "Diao " +0x638a: "Pou " +0x638b: "Di " +0x638c: "Zhang " +0x638d: "Gun " +0x638e: "Ji " +0x638f: "Tao " +0x6390: "Qia " +0x6391: "Qi " +0x6392: "Pai " +0x6393: "Shu " +0x6394: "Qian " +0x6395: "Ling " +0x6396: "Yi " +0x6397: "Ya " +0x6398: "Jue " +0x6399: "Zheng " +0x639a: "Liang " +0x639b: "Gua " +0x639c: "Yi " +0x639d: "Huo " +0x639e: "Shan " +0x639f: "Zheng " +0x63a0: "Lue " +0x63a1: "Cai " +0x63a2: "Tan " +0x63a3: "Che " +0x63a4: "Bing " +0x63a5: "Jie " +0x63a6: "Ti " +0x63a7: "Kong " +0x63a8: "Tui " +0x63a9: "Yan " +0x63aa: "Cuo " +0x63ab: "Zou " +0x63ac: "Ju " +0x63ad: "Tian " +0x63ae: "Qian " +0x63af: "Ken " +0x63b0: "Bai " +0x63b1: "Shou " +0x63b2: "Jie " +0x63b3: "Lu " +0x63b4: "Guo " +0x63b5: "Haba " +0x63b6: "[?] " +0x63b7: "Zhi " +0x63b8: "Dan " +0x63b9: "Mang " +0x63ba: "Xian " +0x63bb: "Sao " +0x63bc: "Guan " +0x63bd: "Peng " +0x63be: "Yuan " +0x63bf: "Nuo " +0x63c0: "Jian " +0x63c1: "Zhen " +0x63c2: "Jiu " +0x63c3: "Jian " +0x63c4: "Yu " +0x63c5: "Yan " +0x63c6: "Kui " +0x63c7: "Nan " +0x63c8: "Hong " +0x63c9: "Rou " +0x63ca: "Pi " +0x63cb: "Wei " +0x63cc: "Sai " +0x63cd: "Zou " +0x63ce: "Xuan " +0x63cf: "Miao " +0x63d0: "Ti " +0x63d1: "Nie " +0x63d2: "Cha " +0x63d3: "Shi " +0x63d4: "Zong " +0x63d5: "Zhen " +0x63d6: "Yi " +0x63d7: "Shun " +0x63d8: "Heng " +0x63d9: "Bian " +0x63da: "Yang " +0x63db: "Huan " +0x63dc: "Yan " +0x63dd: "Zuan " +0x63de: "An " +0x63df: "Xu " +0x63e0: "Ya " +0x63e1: "Wo " +0x63e2: "Ke " +0x63e3: "Chuai " +0x63e4: "Ji " +0x63e5: "Ti " +0x63e6: "La " +0x63e7: "La " +0x63e8: "Cheng " +0x63e9: "Kai " +0x63ea: "Jiu " +0x63eb: "Jiu " +0x63ec: "Tu " +0x63ed: "Jie " +0x63ee: "Hui " +0x63ef: "Geng " +0x63f0: "Chong " +0x63f1: "Shuo " +0x63f2: "She " +0x63f3: "Xie " +0x63f4: "Yuan " +0x63f5: "Qian " +0x63f6: "Ye " +0x63f7: "Cha " +0x63f8: "Zha " +0x63f9: "Bei " +0x63fa: "Yao " +0x63fb: "[?] " +0x63fc: "[?] " +0x63fd: "Lan " +0x63fe: "Wen " +0x63ff: "Qin " +/* x064 */ +0x6400: "Chan " +0x6401: "Ge " +0x6402: "Lou " +0x6403: "Zong " +0x6404: "Geng " +0x6405: "Jiao " +0x6406: "Gou " +0x6407: "Qin " +0x6408: "Yong " +0x6409: "Que " +0x640a: "Chou " +0x640b: "Chi " +0x640c: "Zhan " +0x640d: "Sun " +0x640e: "Sun " +0x640f: "Bo " +0x6410: "Chu " +0x6411: "Rong " +0x6412: "Beng " +0x6413: "Cuo " +0x6414: "Sao " +0x6415: "Ke " +0x6416: "Yao " +0x6417: "Dao " +0x6418: "Zhi " +0x6419: "Nu " +0x641a: "Xie " +0x641b: "Jian " +0x641c: "Sou " +0x641d: "Qiu " +0x641e: "Gao " +0x641f: "Xian " +0x6420: "Shuo " +0x6421: "Sang " +0x6422: "Jin " +0x6423: "Mie " +0x6424: "E " +0x6425: "Chui " +0x6426: "Nuo " +0x6427: "Shan " +0x6428: "Ta " +0x6429: "Jie " +0x642a: "Tang " +0x642b: "Pan " +0x642c: "Ban " +0x642d: "Da " +0x642e: "Li " +0x642f: "Tao " +0x6430: "Hu " +0x6431: "Zhi " +0x6432: "Wa " +0x6433: "Xia " +0x6434: "Qian " +0x6435: "Wen " +0x6436: "Qiang " +0x6437: "Tian " +0x6438: "Zhen " +0x6439: "E " +0x643a: "Xi " +0x643b: "Nuo " +0x643c: "Quan " +0x643d: "Cha " +0x643e: "Zha " +0x643f: "Ge " +0x6440: "Wu " +0x6441: "En " +0x6442: "She " +0x6443: "Kang " +0x6444: "She " +0x6445: "Shu " +0x6446: "Bai " +0x6447: "Yao " +0x6448: "Bin " +0x6449: "Sou " +0x644a: "Tan " +0x644b: "Sa " +0x644c: "Chan " +0x644d: "Suo " +0x644e: "Liao " +0x644f: "Chong " +0x6450: "Chuang " +0x6451: "Guo " +0x6452: "Bing " +0x6453: "Feng " +0x6454: "Shuai " +0x6455: "Di " +0x6456: "Qi " +0x6457: "Sou " +0x6458: "Zhai " +0x6459: "Lian " +0x645a: "Tang " +0x645b: "Chi " +0x645c: "Guan " +0x645d: "Lu " +0x645e: "Luo " +0x645f: "Lou " +0x6460: "Zong " +0x6461: "Gai " +0x6462: "Hu " +0x6463: "Zha " +0x6464: "Chuang " +0x6465: "Tang " +0x6466: "Hua " +0x6467: "Cui " +0x6468: "Nai " +0x6469: "Mo " +0x646a: "Jiang " +0x646b: "Gui " +0x646c: "Ying " +0x646d: "Zhi " +0x646e: "Ao " +0x646f: "Zhi " +0x6470: "Nie " +0x6471: "Man " +0x6472: "Shan " +0x6473: "Kou " +0x6474: "Shu " +0x6475: "Suo " +0x6476: "Tuan " +0x6477: "Jiao " +0x6478: "Mo " +0x6479: "Mo " +0x647a: "Zhe " +0x647b: "Xian " +0x647c: "Keng " +0x647d: "Piao " +0x647e: "Jiang " +0x647f: "Yin " +0x6480: "Gou " +0x6481: "Qian " +0x6482: "Lue " +0x6483: "Ji " +0x6484: "Ying " +0x6485: "Jue " +0x6486: "Pie " +0x6487: "Pie " +0x6488: "Lao " +0x6489: "Dun " +0x648a: "Xian " +0x648b: "Ruan " +0x648c: "Kui " +0x648d: "Zan " +0x648e: "Yi " +0x648f: "Xun " +0x6490: "Cheng " +0x6491: "Cheng " +0x6492: "Sa " +0x6493: "Nao " +0x6494: "Heng " +0x6495: "Si " +0x6496: "Qian " +0x6497: "Huang " +0x6498: "Da " +0x6499: "Zun " +0x649a: "Nian " +0x649b: "Lin " +0x649c: "Zheng " +0x649d: "Hui " +0x649e: "Zhuang " +0x649f: "Jiao " +0x64a0: "Ji " +0x64a1: "Cao " +0x64a2: "Dan " +0x64a3: "Dan " +0x64a4: "Che " +0x64a5: "Bo " +0x64a6: "Che " +0x64a7: "Jue " +0x64a8: "Xiao " +0x64a9: "Liao " +0x64aa: "Ben " +0x64ab: "Fu " +0x64ac: "Qiao " +0x64ad: "Bo " +0x64ae: "Cuo " +0x64af: "Zhuo " +0x64b0: "Zhuan " +0x64b1: "Tuo " +0x64b2: "Pu " +0x64b3: "Qin " +0x64b4: "Dun " +0x64b5: "Nian " +0x64b6: "[?] " +0x64b7: "Xie " +0x64b8: "Lu " +0x64b9: "Jiao " +0x64ba: "Cuan " +0x64bb: "Ta " +0x64bc: "Han " +0x64bd: "Qiao " +0x64be: "Zhua " +0x64bf: "Jian " +0x64c0: "Gan " +0x64c1: "Yong " +0x64c2: "Lei " +0x64c3: "Kuo " +0x64c4: "Lu " +0x64c5: "Shan " +0x64c6: "Zhuo " +0x64c7: "Ze " +0x64c8: "Pu " +0x64c9: "Chuo " +0x64ca: "Ji " +0x64cb: "Dang " +0x64cc: "Suo " +0x64cd: "Cao " +0x64ce: "Qing " +0x64cf: "Jing " +0x64d0: "Huan " +0x64d1: "Jie " +0x64d2: "Qin " +0x64d3: "Kuai " +0x64d4: "Dan " +0x64d5: "Xi " +0x64d6: "Ge " +0x64d7: "Pi " +0x64d8: "Bo " +0x64d9: "Ao " +0x64da: "Ju " +0x64db: "Ye " +0x64dc: "[?] " +0x64dd: "Mang " +0x64de: "Sou " +0x64df: "Mi " +0x64e0: "Ji " +0x64e1: "Tai " +0x64e2: "Zhuo " +0x64e3: "Dao " +0x64e4: "Xing " +0x64e5: "Lan " +0x64e6: "Ca " +0x64e7: "Ju " +0x64e8: "Ye " +0x64e9: "Ru " +0x64ea: "Ye " +0x64eb: "Ye " +0x64ec: "Ni " +0x64ed: "Hu " +0x64ee: "Ji " +0x64ef: "Bin " +0x64f0: "Ning " +0x64f1: "Ge " +0x64f2: "Zhi " +0x64f3: "Jie " +0x64f4: "Kuo " +0x64f5: "Mo " +0x64f6: "Jian " +0x64f7: "Xie " +0x64f8: "Lie " +0x64f9: "Tan " +0x64fa: "Bai " +0x64fb: "Sou " +0x64fc: "Lu " +0x64fd: "Lue " +0x64fe: "Rao " +0x64ff: "Zhi " +/* x065 */ +0x6500: "Pan " +0x6501: "Yang " +0x6502: "Lei " +0x6503: "Sa " +0x6504: "Shu " +0x6505: "Zan " +0x6506: "Nian " +0x6507: "Xian " +0x6508: "Jun " +0x6509: "Huo " +0x650a: "Li " +0x650b: "La " +0x650c: "Han " +0x650d: "Ying " +0x650e: "Lu " +0x650f: "Long " +0x6510: "Qian " +0x6511: "Qian " +0x6512: "Zan " +0x6513: "Qian " +0x6514: "Lan " +0x6515: "San " +0x6516: "Ying " +0x6517: "Mei " +0x6518: "Rang " +0x6519: "Chan " +0x651a: "[?] " +0x651b: "Cuan " +0x651c: "Xi " +0x651d: "She " +0x651e: "Luo " +0x651f: "Jun " +0x6520: "Mi " +0x6521: "Li " +0x6522: "Zan " +0x6523: "Luan " +0x6524: "Tan " +0x6525: "Zuan " +0x6526: "Li " +0x6527: "Dian " +0x6528: "Wa " +0x6529: "Dang " +0x652a: "Jiao " +0x652b: "Jue " +0x652c: "Lan " +0x652d: "Li " +0x652e: "Nang " +0x652f: "Zhi " +0x6530: "Gui " +0x6531: "Gui " +0x6532: "Qi " +0x6533: "Xin " +0x6534: "Pu " +0x6535: "Sui " +0x6536: "Shou " +0x6537: "Kao " +0x6538: "You " +0x6539: "Gai " +0x653a: "Yi " +0x653b: "Gong " +0x653c: "Gan " +0x653d: "Ban " +0x653e: "Fang " +0x653f: "Zheng " +0x6540: "Bo " +0x6541: "Dian " +0x6542: "Kou " +0x6543: "Min " +0x6544: "Wu " +0x6545: "Gu " +0x6546: "He " +0x6547: "Ce " +0x6548: "Xiao " +0x6549: "Mi " +0x654a: "Chu " +0x654b: "Ge " +0x654c: "Di " +0x654d: "Xu " +0x654e: "Jiao " +0x654f: "Min " +0x6550: "Chen " +0x6551: "Jiu " +0x6552: "Zhen " +0x6553: "Duo " +0x6554: "Yu " +0x6555: "Chi " +0x6556: "Ao " +0x6557: "Bai " +0x6558: "Xu " +0x6559: "Jiao " +0x655a: "Duo " +0x655b: "Lian " +0x655c: "Nie " +0x655d: "Bi " +0x655e: "Chang " +0x655f: "Dian " +0x6560: "Duo " +0x6561: "Yi " +0x6562: "Gan " +0x6563: "San " +0x6564: "Ke " +0x6565: "Yan " +0x6566: "Dun " +0x6567: "Qi " +0x6568: "Dou " +0x6569: "Xiao " +0x656a: "Duo " +0x656b: "Jiao " +0x656c: "Jing " +0x656d: "Yang " +0x656e: "Xia " +0x656f: "Min " +0x6570: "Shu " +0x6571: "Ai " +0x6572: "Qiao " +0x6573: "Ai " +0x6574: "Zheng " +0x6575: "Di " +0x6576: "Zhen " +0x6577: "Fu " +0x6578: "Shu " +0x6579: "Liao " +0x657a: "Qu " +0x657b: "Xiong " +0x657c: "Xi " +0x657d: "Jiao " +0x657e: "Sen " +0x657f: "Jiao " +0x6580: "Zhuo " +0x6581: "Yi " +0x6582: "Lian " +0x6583: "Bi " +0x6584: "Li " +0x6585: "Xiao " +0x6586: "Xiao " +0x6587: "Wen " +0x6588: "Xue " +0x6589: "Qi " +0x658a: "Qi " +0x658b: "Zhai " +0x658c: "Bin " +0x658d: "Jue " +0x658e: "Zhai " +0x658f: "[?] " +0x6590: "Fei " +0x6591: "Ban " +0x6592: "Ban " +0x6593: "Lan " +0x6594: "Yu " +0x6595: "Lan " +0x6596: "Wei " +0x6597: "Dou " +0x6598: "Sheng " +0x6599: "Liao " +0x659a: "Jia " +0x659b: "Hu " +0x659c: "Xie " +0x659d: "Jia " +0x659e: "Yu " +0x659f: "Zhen " +0x65a0: "Jiao " +0x65a1: "Wo " +0x65a2: "Tou " +0x65a3: "Chu " +0x65a4: "Jin " +0x65a5: "Chi " +0x65a6: "Yin " +0x65a7: "Fu " +0x65a8: "Qiang " +0x65a9: "Zhan " +0x65aa: "Qu " +0x65ab: "Zhuo " +0x65ac: "Zhan " +0x65ad: "Duan " +0x65ae: "Zhuo " +0x65af: "Si " +0x65b0: "Xin " +0x65b1: "Zhuo " +0x65b2: "Zhuo " +0x65b3: "Qin " +0x65b4: "Lin " +0x65b5: "Zhuo " +0x65b6: "Chu " +0x65b7: "Duan " +0x65b8: "Zhu " +0x65b9: "Fang " +0x65ba: "Xie " +0x65bb: "Hang " +0x65bc: "Yu " +0x65bd: "Shi " +0x65be: "Pei " +0x65bf: "You " +0x65c0: "Mye " +0x65c1: "Pang " +0x65c2: "Qi " +0x65c3: "Zhan " +0x65c4: "Mao " +0x65c5: "Lu " +0x65c6: "Pei " +0x65c7: "Pi " +0x65c8: "Liu " +0x65c9: "Fu " +0x65ca: "Fang " +0x65cb: "Xuan " +0x65cc: "Jing " +0x65cd: "Jing " +0x65ce: "Ni " +0x65cf: "Zu " +0x65d0: "Zhao " +0x65d1: "Yi " +0x65d2: "Liu " +0x65d3: "Shao " +0x65d4: "Jian " +0x65d5: "Es " +0x65d6: "Yi " +0x65d7: "Qi " +0x65d8: "Zhi " +0x65d9: "Fan " +0x65da: "Piao " +0x65db: "Fan " +0x65dc: "Zhan " +0x65dd: "Guai " +0x65de: "Sui " +0x65df: "Yu " +0x65e0: "Wu " +0x65e1: "Ji " +0x65e2: "Ji " +0x65e3: "Ji " +0x65e4: "Huo " +0x65e5: "Ri " +0x65e6: "Dan " +0x65e7: "Jiu " +0x65e8: "Zhi " +0x65e9: "Zao " +0x65ea: "Xie " +0x65eb: "Tiao " +0x65ec: "Xun " +0x65ed: "Xu " +0x65ee: "Xu " +0x65ef: "Xu " +0x65f0: "Gan " +0x65f1: "Han " +0x65f2: "Tai " +0x65f3: "Di " +0x65f4: "Xu " +0x65f5: "Chan " +0x65f6: "Shi " +0x65f7: "Kuang " +0x65f8: "Yang " +0x65f9: "Shi " +0x65fa: "Wang " +0x65fb: "Min " +0x65fc: "Min " +0x65fd: "Tun " +0x65fe: "Chun " +0x65ff: "Wu " +/* x066 */ +0x6600: "Yun " +0x6601: "Bei " +0x6602: "Ang " +0x6603: "Ze " +0x6604: "Ban " +0x6605: "Jie " +0x6606: "Kun " +0x6607: "Sheng " +0x6608: "Hu " +0x6609: "Fang " +0x660a: "Hao " +0x660b: "Gui " +0x660c: "Chang " +0x660d: "Xuan " +0x660e: "Ming " +0x660f: "Hun " +0x6610: "Fen " +0x6611: "Qin " +0x6612: "Hu " +0x6613: "Yi " +0x6614: "Xi " +0x6615: "Xin " +0x6616: "Yan " +0x6617: "Ze " +0x6618: "Fang " +0x6619: "Tan " +0x661a: "Shen " +0x661b: "Ju " +0x661c: "Yang " +0x661d: "Zan " +0x661e: "Bing " +0x661f: "Xing " +0x6620: "Ying " +0x6621: "Xuan " +0x6622: "Pei " +0x6623: "Zhen " +0x6624: "Ling " +0x6625: "Chun " +0x6626: "Hao " +0x6627: "Mei " +0x6628: "Zuo " +0x6629: "Mo " +0x662a: "Bian " +0x662b: "Xu " +0x662c: "Hun " +0x662d: "Zhao " +0x662e: "Zong " +0x662f: "Shi " +0x6630: "Shi " +0x6631: "Yu " +0x6632: "Fei " +0x6633: "Die " +0x6634: "Mao " +0x6635: "Ni " +0x6636: "Chang " +0x6637: "Wen " +0x6638: "Dong " +0x6639: "Ai " +0x663a: "Bing " +0x663b: "Ang " +0x663c: "Zhou " +0x663d: "Long " +0x663e: "Xian " +0x663f: "Kuang " +0x6640: "Tiao " +0x6641: "Chao " +0x6642: "Shi " +0x6643: "Huang " +0x6644: "Huang " +0x6645: "Xuan " +0x6646: "Kui " +0x6647: "Xu " +0x6648: "Jiao " +0x6649: "Jin " +0x664a: "Zhi " +0x664b: "Jin " +0x664c: "Shang " +0x664d: "Tong " +0x664e: "Hong " +0x664f: "Yan " +0x6650: "Gai " +0x6651: "Xiang " +0x6652: "Shai " +0x6653: "Xiao " +0x6654: "Ye " +0x6655: "Yun " +0x6656: "Hui " +0x6657: "Han " +0x6658: "Han " +0x6659: "Jun " +0x665a: "Wan " +0x665b: "Xian " +0x665c: "Kun " +0x665d: "Zhou " +0x665e: "Xi " +0x665f: "Cheng " +0x6660: "Sheng " +0x6661: "Bu " +0x6662: "Zhe " +0x6663: "Zhe " +0x6664: "Wu " +0x6665: "Han " +0x6666: "Hui " +0x6667: "Hao " +0x6668: "Chen " +0x6669: "Wan " +0x666a: "Tian " +0x666b: "Zhuo " +0x666c: "Zui " +0x666d: "Zhou " +0x666e: "Pu " +0x666f: "Jing " +0x6670: "Xi " +0x6671: "Shan " +0x6672: "Yi " +0x6673: "Xi " +0x6674: "Qing " +0x6675: "Qi " +0x6676: "Jing " +0x6677: "Gui " +0x6678: "Zhen " +0x6679: "Yi " +0x667a: "Zhi " +0x667b: "An " +0x667c: "Wan " +0x667d: "Lin " +0x667e: "Liang " +0x667f: "Chang " +0x6680: "Wang " +0x6681: "Xiao " +0x6682: "Zan " +0x6683: "Hi " +0x6684: "Xuan " +0x6685: "Xuan " +0x6686: "Yi " +0x6687: "Xia " +0x6688: "Yun " +0x6689: "Hui " +0x668a: "Fu " +0x668b: "Min " +0x668c: "Kui " +0x668d: "He " +0x668e: "Ying " +0x668f: "Du " +0x6690: "Wei " +0x6691: "Shu " +0x6692: "Qing " +0x6693: "Mao " +0x6694: "Nan " +0x6695: "Jian " +0x6696: "Nuan " +0x6697: "An " +0x6698: "Yang " +0x6699: "Chun " +0x669a: "Yao " +0x669b: "Suo " +0x669c: "Jin " +0x669d: "Ming " +0x669e: "Jiao " +0x669f: "Kai " +0x66a0: "Gao " +0x66a1: "Weng " +0x66a2: "Chang " +0x66a3: "Qi " +0x66a4: "Hao " +0x66a5: "Yan " +0x66a6: "Li " +0x66a7: "Ai " +0x66a8: "Ji " +0x66a9: "Gui " +0x66aa: "Men " +0x66ab: "Zan " +0x66ac: "Xie " +0x66ad: "Hao " +0x66ae: "Mu " +0x66af: "Mo " +0x66b0: "Cong " +0x66b1: "Ni " +0x66b2: "Zhang " +0x66b3: "Hui " +0x66b4: "Bao " +0x66b5: "Han " +0x66b6: "Xuan " +0x66b7: "Chuan " +0x66b8: "Liao " +0x66b9: "Xian " +0x66ba: "Dan " +0x66bb: "Jing " +0x66bc: "Pie " +0x66bd: "Lin " +0x66be: "Tun " +0x66bf: "Xi " +0x66c0: "Yi " +0x66c1: "Ji " +0x66c2: "Huang " +0x66c3: "Tai " +0x66c4: "Ye " +0x66c5: "Ye " +0x66c6: "Li " +0x66c7: "Tan " +0x66c8: "Tong " +0x66c9: "Xiao " +0x66ca: "Fei " +0x66cb: "Qin " +0x66cc: "Zhao " +0x66cd: "Hao " +0x66ce: "Yi " +0x66cf: "Xiang " +0x66d0: "Xing " +0x66d1: "Sen " +0x66d2: "Jiao " +0x66d3: "Bao " +0x66d4: "Jing " +0x66d5: "Yian " +0x66d6: "Ai " +0x66d7: "Ye " +0x66d8: "Ru " +0x66d9: "Shu " +0x66da: "Meng " +0x66db: "Xun " +0x66dc: "Yao " +0x66dd: "Pu " +0x66de: "Li " +0x66df: "Chen " +0x66e0: "Kuang " +0x66e1: "Die " +0x66e2: "[?] " +0x66e3: "Yan " +0x66e4: "Huo " +0x66e5: "Lu " +0x66e6: "Xi " +0x66e7: "Rong " +0x66e8: "Long " +0x66e9: "Nang " +0x66ea: "Luo " +0x66eb: "Luan " +0x66ec: "Shai " +0x66ed: "Tang " +0x66ee: "Yan " +0x66ef: "Chu " +0x66f0: "Yue " +0x66f1: "Yue " +0x66f2: "Qu " +0x66f3: "Yi " +0x66f4: "Geng " +0x66f5: "Ye " +0x66f6: "Hu " +0x66f7: "He " +0x66f8: "Shu " +0x66f9: "Cao " +0x66fa: "Cao " +0x66fb: "Noboru " +0x66fc: "Man " +0x66fd: "Ceng " +0x66fe: "Ceng " +0x66ff: "Ti " +/* x067 */ +0x6700: "Zui " +0x6701: "Can " +0x6702: "Xu " +0x6703: "Hui " +0x6704: "Yin " +0x6705: "Qie " +0x6706: "Fen " +0x6707: "Pi " +0x6708: "Yue " +0x6709: "You " +0x670a: "Ruan " +0x670b: "Peng " +0x670c: "Ban " +0x670d: "Fu " +0x670e: "Ling " +0x670f: "Fei " +0x6710: "Qu " +0x6711: "[?] " +0x6712: "Nu " +0x6713: "Tiao " +0x6714: "Shuo " +0x6715: "Zhen " +0x6716: "Lang " +0x6717: "Lang " +0x6718: "Juan " +0x6719: "Ming " +0x671a: "Huang " +0x671b: "Wang " +0x671c: "Tun " +0x671d: "Zhao " +0x671e: "Ji " +0x671f: "Qi " +0x6720: "Ying " +0x6721: "Zong " +0x6722: "Wang " +0x6723: "Tong " +0x6724: "Lang " +0x6725: "[?] " +0x6726: "Meng " +0x6727: "Long " +0x6728: "Mu " +0x6729: "Deng " +0x672a: "Wei " +0x672b: "Mo " +0x672c: "Ben " +0x672d: "Zha " +0x672e: "Zhu " +0x672f: "Zhu " +0x6730: "[?] " +0x6731: "Zhu " +0x6732: "Ren " +0x6733: "Ba " +0x6734: "Po " +0x6735: "Duo " +0x6736: "Duo " +0x6737: "Dao " +0x6738: "Li " +0x6739: "Qiu " +0x673a: "Ji " +0x673b: "Jiu " +0x673c: "Bi " +0x673d: "Xiu " +0x673e: "Ting " +0x673f: "Ci " +0x6740: "Sha " +0x6741: "Eburi " +0x6742: "Za " +0x6743: "Quan " +0x6744: "Qian " +0x6745: "Yu " +0x6746: "Gan " +0x6747: "Wu " +0x6748: "Cha " +0x6749: "Shan " +0x674a: "Xun " +0x674b: "Fan " +0x674c: "Wu " +0x674d: "Zi " +0x674e: "Li " +0x674f: "Xing " +0x6750: "Cai " +0x6751: "Cun " +0x6752: "Ren " +0x6753: "Shao " +0x6754: "Tuo " +0x6755: "Di " +0x6756: "Zhang " +0x6757: "Mang " +0x6758: "Chi " +0x6759: "Yi " +0x675a: "Gu " +0x675b: "Gong " +0x675c: "Du " +0x675d: "Yi " +0x675e: "Qi " +0x675f: "Shu " +0x6760: "Gang " +0x6761: "Tiao " +0x6762: "Moku " +0x6763: "Soma " +0x6764: "Tochi " +0x6765: "Lai " +0x6766: "Sugi " +0x6767: "Mang " +0x6768: "Yang " +0x6769: "Ma " +0x676a: "Miao " +0x676b: "Si " +0x676c: "Yuan " +0x676d: "Hang " +0x676e: "Fei " +0x676f: "Bei " +0x6770: "Jie " +0x6771: "Dong " +0x6772: "Gao " +0x6773: "Yao " +0x6774: "Xian " +0x6775: "Chu " +0x6776: "Qun " +0x6777: "Pa " +0x6778: "Shu " +0x6779: "Hua " +0x677a: "Xin " +0x677b: "Chou " +0x677c: "Zhu " +0x677d: "Chou " +0x677e: "Song " +0x677f: "Ban " +0x6780: "Song " +0x6781: "Ji " +0x6782: "Yue " +0x6783: "Jin " +0x6784: "Gou " +0x6785: "Ji " +0x6786: "Mao " +0x6787: "Pi " +0x6788: "Bi " +0x6789: "Wang " +0x678a: "Ang " +0x678b: "Fang " +0x678c: "Fen " +0x678d: "Yi " +0x678e: "Fu " +0x678f: "Nan " +0x6790: "Xi " +0x6791: "Hu " +0x6792: "Ya " +0x6793: "Dou " +0x6794: "Xun " +0x6795: "Zhen " +0x6796: "Yao " +0x6797: "Lin " +0x6798: "Rui " +0x6799: "E " +0x679a: "Mei " +0x679b: "Zhao " +0x679c: "Guo " +0x679d: "Zhi " +0x679e: "Cong " +0x679f: "Yun " +0x67a0: "Waku " +0x67a1: "Dou " +0x67a2: "Shu " +0x67a3: "Zao " +0x67a4: "[?] " +0x67a5: "Li " +0x67a6: "Haze " +0x67a7: "Jian " +0x67a8: "Cheng " +0x67a9: "Matsu " +0x67aa: "Qiang " +0x67ab: "Feng " +0x67ac: "Nan " +0x67ad: "Xiao " +0x67ae: "Xian " +0x67af: "Ku " +0x67b0: "Ping " +0x67b1: "Yi " +0x67b2: "Xi " +0x67b3: "Zhi " +0x67b4: "Guai " +0x67b5: "Xiao " +0x67b6: "Jia " +0x67b7: "Jia " +0x67b8: "Gou " +0x67b9: "Fu " +0x67ba: "Mo " +0x67bb: "Yi " +0x67bc: "Ye " +0x67bd: "Ye " +0x67be: "Shi " +0x67bf: "Nie " +0x67c0: "Bi " +0x67c1: "Duo " +0x67c2: "Yi " +0x67c3: "Ling " +0x67c4: "Bing " +0x67c5: "Ni " +0x67c6: "La " +0x67c7: "He " +0x67c8: "Pan " +0x67c9: "Fan " +0x67ca: "Zhong " +0x67cb: "Dai " +0x67cc: "Ci " +0x67cd: "Yang " +0x67ce: "Fu " +0x67cf: "Bo " +0x67d0: "Mou " +0x67d1: "Gan " +0x67d2: "Qi " +0x67d3: "Ran " +0x67d4: "Rou " +0x67d5: "Mao " +0x67d6: "Zhao " +0x67d7: "Song " +0x67d8: "Zhe " +0x67d9: "Xia " +0x67da: "You " +0x67db: "Shen " +0x67dc: "Ju " +0x67dd: "Tuo " +0x67de: "Zuo " +0x67df: "Nan " +0x67e0: "Ning " +0x67e1: "Yong " +0x67e2: "Di " +0x67e3: "Zhi " +0x67e4: "Zha " +0x67e5: "Cha " +0x67e6: "Dan " +0x67e7: "Gu " +0x67e8: "Pu " +0x67e9: "Jiu " +0x67ea: "Ao " +0x67eb: "Fu " +0x67ec: "Jian " +0x67ed: "Bo " +0x67ee: "Duo " +0x67ef: "Ke " +0x67f0: "Nai " +0x67f1: "Zhu " +0x67f2: "Bi " +0x67f3: "Liu " +0x67f4: "Chai " +0x67f5: "Zha " +0x67f6: "Si " +0x67f7: "Zhu " +0x67f8: "Pei " +0x67f9: "Shi " +0x67fa: "Guai " +0x67fb: "Cha " +0x67fc: "Yao " +0x67fd: "Jue " +0x67fe: "Jiu " +0x67ff: "Shi " +/* x068 */ +0x6800: "Zhi " +0x6801: "Liu " +0x6802: "Mei " +0x6803: "Hoy " +0x6804: "Rong " +0x6805: "Zha " +0x6806: "[?] " +0x6807: "Biao " +0x6808: "Zhan " +0x6809: "Jie " +0x680a: "Long " +0x680b: "Dong " +0x680c: "Lu " +0x680d: "Sayng " +0x680e: "Li " +0x680f: "Lan " +0x6810: "Yong " +0x6811: "Shu " +0x6812: "Xun " +0x6813: "Shuan " +0x6814: "Qi " +0x6815: "Zhen " +0x6816: "Qi " +0x6817: "Li " +0x6818: "Yi " +0x6819: "Xiang " +0x681a: "Zhen " +0x681b: "Li " +0x681c: "Su " +0x681d: "Gua " +0x681e: "Kan " +0x681f: "Bing " +0x6820: "Ren " +0x6821: "Xiao " +0x6822: "Bo " +0x6823: "Ren " +0x6824: "Bing " +0x6825: "Zi " +0x6826: "Chou " +0x6827: "Yi " +0x6828: "Jie " +0x6829: "Xu " +0x682a: "Zhu " +0x682b: "Jian " +0x682c: "Zui " +0x682d: "Er " +0x682e: "Er " +0x682f: "You " +0x6830: "Fa " +0x6831: "Gong " +0x6832: "Kao " +0x6833: "Lao " +0x6834: "Zhan " +0x6835: "Li " +0x6836: "Yin " +0x6837: "Yang " +0x6838: "He " +0x6839: "Gen " +0x683a: "Zhi " +0x683b: "Chi " +0x683c: "Ge " +0x683d: "Zai " +0x683e: "Luan " +0x683f: "Fu " +0x6840: "Jie " +0x6841: "Hang " +0x6842: "Gui " +0x6843: "Tao " +0x6844: "Guang " +0x6845: "Wei " +0x6846: "Kuang " +0x6847: "Ru " +0x6848: "An " +0x6849: "An " +0x684a: "Juan " +0x684b: "Yi " +0x684c: "Zhuo " +0x684d: "Ku " +0x684e: "Zhi " +0x684f: "Qiong " +0x6850: "Tong " +0x6851: "Sang " +0x6852: "Sang " +0x6853: "Huan " +0x6854: "Jie " +0x6855: "Jiu " +0x6856: "Xue " +0x6857: "Duo " +0x6858: "Zhui " +0x6859: "Yu " +0x685a: "Zan " +0x685b: "Kasei " +0x685c: "Ying " +0x685d: "Masu " +0x685e: "[?] " +0x685f: "Zhan " +0x6860: "Ya " +0x6861: "Nao " +0x6862: "Zhen " +0x6863: "Dang " +0x6864: "Qi " +0x6865: "Qiao " +0x6866: "Hua " +0x6867: "Kuai " +0x6868: "Jiang " +0x6869: "Zhuang " +0x686a: "Xun " +0x686b: "Suo " +0x686c: "Sha " +0x686d: "Zhen " +0x686e: "Bei " +0x686f: "Ting " +0x6870: "Gua " +0x6871: "Jing " +0x6872: "Bo " +0x6873: "Ben " +0x6874: "Fu " +0x6875: "Rui " +0x6876: "Tong " +0x6877: "Jue " +0x6878: "Xi " +0x6879: "Lang " +0x687a: "Liu " +0x687b: "Feng " +0x687c: "Qi " +0x687d: "Wen " +0x687e: "Jun " +0x687f: "Gan " +0x6880: "Cu " +0x6881: "Liang " +0x6882: "Qiu " +0x6883: "Ting " +0x6884: "You " +0x6885: "Mei " +0x6886: "Bang " +0x6887: "Long " +0x6888: "Peng " +0x6889: "Zhuang " +0x688a: "Di " +0x688b: "Xuan " +0x688c: "Tu " +0x688d: "Zao " +0x688e: "Ao " +0x688f: "Gu " +0x6890: "Bi " +0x6891: "Di " +0x6892: "Han " +0x6893: "Zi " +0x6894: "Zhi " +0x6895: "Ren " +0x6896: "Bei " +0x6897: "Geng " +0x6898: "Jian " +0x6899: "Huan " +0x689a: "Wan " +0x689b: "Nuo " +0x689c: "Jia " +0x689d: "Tiao " +0x689e: "Ji " +0x689f: "Xiao " +0x68a0: "Lu " +0x68a1: "Huan " +0x68a2: "Shao " +0x68a3: "Cen " +0x68a4: "Fen " +0x68a5: "Song " +0x68a6: "Meng " +0x68a7: "Wu " +0x68a8: "Li " +0x68a9: "Li " +0x68aa: "Dou " +0x68ab: "Cen " +0x68ac: "Ying " +0x68ad: "Suo " +0x68ae: "Ju " +0x68af: "Ti " +0x68b0: "Jie " +0x68b1: "Kun " +0x68b2: "Zhuo " +0x68b3: "Shu " +0x68b4: "Chan " +0x68b5: "Fan " +0x68b6: "Wei " +0x68b7: "Jing " +0x68b8: "Li " +0x68b9: "Bing " +0x68ba: "Fumoto " +0x68bb: "Shikimi " +0x68bc: "Tao " +0x68bd: "Zhi " +0x68be: "Lai " +0x68bf: "Lian " +0x68c0: "Jian " +0x68c1: "Zhuo " +0x68c2: "Ling " +0x68c3: "Li " +0x68c4: "Qi " +0x68c5: "Bing " +0x68c6: "Zhun " +0x68c7: "Cong " +0x68c8: "Qian " +0x68c9: "Mian " +0x68ca: "Qi " +0x68cb: "Qi " +0x68cc: "Cai " +0x68cd: "Gun " +0x68ce: "Chan " +0x68cf: "Te " +0x68d0: "Fei " +0x68d1: "Pai " +0x68d2: "Bang " +0x68d3: "Pou " +0x68d4: "Hun " +0x68d5: "Zong " +0x68d6: "Cheng " +0x68d7: "Zao " +0x68d8: "Ji " +0x68d9: "Li " +0x68da: "Peng " +0x68db: "Yu " +0x68dc: "Yu " +0x68dd: "Gu " +0x68de: "Hun " +0x68df: "Dong " +0x68e0: "Tang " +0x68e1: "Gang " +0x68e2: "Wang " +0x68e3: "Di " +0x68e4: "Xi " +0x68e5: "Fan " +0x68e6: "Cheng " +0x68e7: "Zhan " +0x68e8: "Qi " +0x68e9: "Yuan " +0x68ea: "Yan " +0x68eb: "Yu " +0x68ec: "Quan " +0x68ed: "Yi " +0x68ee: "Sen " +0x68ef: "Ren " +0x68f0: "Chui " +0x68f1: "Leng " +0x68f2: "Qi " +0x68f3: "Zhuo " +0x68f4: "Fu " +0x68f5: "Ke " +0x68f6: "Lai " +0x68f7: "Zou " +0x68f8: "Zou " +0x68f9: "Zhuo " +0x68fa: "Guan " +0x68fb: "Fen " +0x68fc: "Fen " +0x68fd: "Chen " +0x68fe: "Qiong " +0x68ff: "Nie " +/* x069 */ +0x6900: "Wan " +0x6901: "Guo " +0x6902: "Lu " +0x6903: "Hao " +0x6904: "Jie " +0x6905: "Yi " +0x6906: "Chou " +0x6907: "Ju " +0x6908: "Ju " +0x6909: "Cheng " +0x690a: "Zuo " +0x690b: "Liang " +0x690c: "Qiang " +0x690d: "Zhi " +0x690e: "Zhui " +0x690f: "Ya " +0x6910: "Ju " +0x6911: "Bei " +0x6912: "Jiao " +0x6913: "Zhuo " +0x6914: "Zi " +0x6915: "Bin " +0x6916: "Peng " +0x6917: "Ding " +0x6918: "Chu " +0x6919: "Chang " +0x691a: "Kunugi " +0x691b: "Momiji " +0x691c: "Jian " +0x691d: "Gui " +0x691e: "Xi " +0x691f: "Du " +0x6920: "Qian " +0x6921: "Kunugi " +0x6922: "Soko " +0x6923: "Shide " +0x6924: "Luo " +0x6925: "Zhi " +0x6926: "Ken " +0x6927: "Myeng " +0x6928: "Tafu " +0x6929: "[?] " +0x692a: "Peng " +0x692b: "Zhan " +0x692c: "[?] " +0x692d: "Tuo " +0x692e: "Sen " +0x692f: "Duo " +0x6930: "Ye " +0x6931: "Fou " +0x6932: "Wei " +0x6933: "Wei " +0x6934: "Duan " +0x6935: "Jia " +0x6936: "Zong " +0x6937: "Jian " +0x6938: "Yi " +0x6939: "Shen " +0x693a: "Xi " +0x693b: "Yan " +0x693c: "Yan " +0x693d: "Chuan " +0x693e: "Zhan " +0x693f: "Chun " +0x6940: "Yu " +0x6941: "He " +0x6942: "Zha " +0x6943: "Wo " +0x6944: "Pian " +0x6945: "Bi " +0x6946: "Yao " +0x6947: "Huo " +0x6948: "Xu " +0x6949: "Ruo " +0x694a: "Yang " +0x694b: "La " +0x694c: "Yan " +0x694d: "Ben " +0x694e: "Hun " +0x694f: "Kui " +0x6950: "Jie " +0x6951: "Kui " +0x6952: "Si " +0x6953: "Feng " +0x6954: "Xie " +0x6955: "Tuo " +0x6956: "Zhi " +0x6957: "Jian " +0x6958: "Mu " +0x6959: "Mao " +0x695a: "Chu " +0x695b: "Hu " +0x695c: "Hu " +0x695d: "Lian " +0x695e: "Leng " +0x695f: "Ting " +0x6960: "Nan " +0x6961: "Yu " +0x6962: "You " +0x6963: "Mei " +0x6964: "Song " +0x6965: "Xuan " +0x6966: "Xuan " +0x6967: "Ying " +0x6968: "Zhen " +0x6969: "Pian " +0x696a: "Ye " +0x696b: "Ji " +0x696c: "Jie " +0x696d: "Ye " +0x696e: "Chu " +0x696f: "Shun " +0x6970: "Yu " +0x6971: "Cou " +0x6972: "Wei " +0x6973: "Mei " +0x6974: "Di " +0x6975: "Ji " +0x6976: "Jie " +0x6977: "Kai " +0x6978: "Qiu " +0x6979: "Ying " +0x697a: "Rou " +0x697b: "Heng " +0x697c: "Lou " +0x697d: "Le " +0x697e: "Hazou " +0x697f: "Katsura " +0x6980: "Pin " +0x6981: "Muro " +0x6982: "Gai " +0x6983: "Tan " +0x6984: "Lan " +0x6985: "Yun " +0x6986: "Yu " +0x6987: "Chen " +0x6988: "Lu " +0x6989: "Ju " +0x698a: "Sakaki " +0x698b: "[?] " +0x698c: "Pi " +0x698d: "Xie " +0x698e: "Jia " +0x698f: "Yi " +0x6990: "Zhan " +0x6991: "Fu " +0x6992: "Nai " +0x6993: "Mi " +0x6994: "Lang " +0x6995: "Rong " +0x6996: "Gu " +0x6997: "Jian " +0x6998: "Ju " +0x6999: "Ta " +0x699a: "Yao " +0x699b: "Zhen " +0x699c: "Bang " +0x699d: "Sha " +0x699e: "Yuan " +0x699f: "Zi " +0x69a0: "Ming " +0x69a1: "Su " +0x69a2: "Jia " +0x69a3: "Yao " +0x69a4: "Jie " +0x69a5: "Huang " +0x69a6: "Gan " +0x69a7: "Fei " +0x69a8: "Zha " +0x69a9: "Qian " +0x69aa: "Ma " +0x69ab: "Sun " +0x69ac: "Yuan " +0x69ad: "Xie " +0x69ae: "Rong " +0x69af: "Shi " +0x69b0: "Zhi " +0x69b1: "Cui " +0x69b2: "Yun " +0x69b3: "Ting " +0x69b4: "Liu " +0x69b5: "Rong " +0x69b6: "Tang " +0x69b7: "Que " +0x69b8: "Zhai " +0x69b9: "Si " +0x69ba: "Sheng " +0x69bb: "Ta " +0x69bc: "Ke " +0x69bd: "Xi " +0x69be: "Gu " +0x69bf: "Qi " +0x69c0: "Kao " +0x69c1: "Gao " +0x69c2: "Sun " +0x69c3: "Pan " +0x69c4: "Tao " +0x69c5: "Ge " +0x69c6: "Xun " +0x69c7: "Dian " +0x69c8: "Nou " +0x69c9: "Ji " +0x69ca: "Shuo " +0x69cb: "Gou " +0x69cc: "Chui " +0x69cd: "Qiang " +0x69ce: "Cha " +0x69cf: "Qian " +0x69d0: "Huai " +0x69d1: "Mei " +0x69d2: "Xu " +0x69d3: "Gang " +0x69d4: "Gao " +0x69d5: "Zhuo " +0x69d6: "Tuo " +0x69d7: "Hashi " +0x69d8: "Yang " +0x69d9: "Dian " +0x69da: "Jia " +0x69db: "Jian " +0x69dc: "Zui " +0x69dd: "Kashi " +0x69de: "Ori " +0x69df: "Bin " +0x69e0: "Zhu " +0x69e1: "[?] " +0x69e2: "Xi " +0x69e3: "Qi " +0x69e4: "Lian " +0x69e5: "Hui " +0x69e6: "Yong " +0x69e7: "Qian " +0x69e8: "Guo " +0x69e9: "Gai " +0x69ea: "Gai " +0x69eb: "Tuan " +0x69ec: "Hua " +0x69ed: "Cu " +0x69ee: "Sen " +0x69ef: "Cui " +0x69f0: "Beng " +0x69f1: "You " +0x69f2: "Hu " +0x69f3: "Jiang " +0x69f4: "Hu " +0x69f5: "Huan " +0x69f6: "Kui " +0x69f7: "Yi " +0x69f8: "Nie " +0x69f9: "Gao " +0x69fa: "Kang " +0x69fb: "Gui " +0x69fc: "Gui " +0x69fd: "Cao " +0x69fe: "Man " +0x69ff: "Jin " +/* x06a */ +0x6a00: "Di " +0x6a01: "Zhuang " +0x6a02: "Le " +0x6a03: "Lang " +0x6a04: "Chen " +0x6a05: "Cong " +0x6a06: "Li " +0x6a07: "Xiu " +0x6a08: "Qing " +0x6a09: "Shuang " +0x6a0a: "Fan " +0x6a0b: "Tong " +0x6a0c: "Guan " +0x6a0d: "Ji " +0x6a0e: "Suo " +0x6a0f: "Lei " +0x6a10: "Lu " +0x6a11: "Liang " +0x6a12: "Mi " +0x6a13: "Lou " +0x6a14: "Chao " +0x6a15: "Su " +0x6a16: "Ke " +0x6a17: "Shu " +0x6a18: "Tang " +0x6a19: "Biao " +0x6a1a: "Lu " +0x6a1b: "Jiu " +0x6a1c: "Shu " +0x6a1d: "Zha " +0x6a1e: "Shu " +0x6a1f: "Zhang " +0x6a20: "Men " +0x6a21: "Mo " +0x6a22: "Niao " +0x6a23: "Yang " +0x6a24: "Tiao " +0x6a25: "Peng " +0x6a26: "Zhu " +0x6a27: "Sha " +0x6a28: "Xi " +0x6a29: "Quan " +0x6a2a: "Heng " +0x6a2b: "Jian " +0x6a2c: "Cong " +0x6a2d: "[?] " +0x6a2e: "Hokuso " +0x6a2f: "Qiang " +0x6a30: "Tara " +0x6a31: "Ying " +0x6a32: "Er " +0x6a33: "Xin " +0x6a34: "Zhi " +0x6a35: "Qiao " +0x6a36: "Zui " +0x6a37: "Cong " +0x6a38: "Pu " +0x6a39: "Shu " +0x6a3a: "Hua " +0x6a3b: "Kui " +0x6a3c: "Zhen " +0x6a3d: "Zun " +0x6a3e: "Yue " +0x6a3f: "Zhan " +0x6a40: "Xi " +0x6a41: "Xun " +0x6a42: "Dian " +0x6a43: "Fa " +0x6a44: "Gan " +0x6a45: "Mo " +0x6a46: "Wu " +0x6a47: "Qiao " +0x6a48: "Nao " +0x6a49: "Lin " +0x6a4a: "Liu " +0x6a4b: "Qiao " +0x6a4c: "Xian " +0x6a4d: "Run " +0x6a4e: "Fan " +0x6a4f: "Zhan " +0x6a50: "Tuo " +0x6a51: "Lao " +0x6a52: "Yun " +0x6a53: "Shun " +0x6a54: "Tui " +0x6a55: "Cheng " +0x6a56: "Tang " +0x6a57: "Meng " +0x6a58: "Ju " +0x6a59: "Cheng " +0x6a5a: "Su " +0x6a5b: "Jue " +0x6a5c: "Jue " +0x6a5d: "Tan " +0x6a5e: "Hui " +0x6a5f: "Ji " +0x6a60: "Nuo " +0x6a61: "Xiang " +0x6a62: "Tuo " +0x6a63: "Ning " +0x6a64: "Rui " +0x6a65: "Zhu " +0x6a66: "Chuang " +0x6a67: "Zeng " +0x6a68: "Fen " +0x6a69: "Qiong " +0x6a6a: "Ran " +0x6a6b: "Heng " +0x6a6c: "Cen " +0x6a6d: "Gu " +0x6a6e: "Liu " +0x6a6f: "Lao " +0x6a70: "Gao " +0x6a71: "Chu " +0x6a72: "Zusa " +0x6a73: "Nude " +0x6a74: "Ca " +0x6a75: "San " +0x6a76: "Ji " +0x6a77: "Dou " +0x6a78: "Shou " +0x6a79: "Lu " +0x6a7a: "[?] " +0x6a7b: "[?] " +0x6a7c: "Yuan " +0x6a7d: "Ta " +0x6a7e: "Shu " +0x6a7f: "Jiang " +0x6a80: "Tan " +0x6a81: "Lin " +0x6a82: "Nong " +0x6a83: "Yin " +0x6a84: "Xi " +0x6a85: "Sui " +0x6a86: "Shan " +0x6a87: "Zui " +0x6a88: "Xuan " +0x6a89: "Cheng " +0x6a8a: "Gan " +0x6a8b: "Ju " +0x6a8c: "Zui " +0x6a8d: "Yi " +0x6a8e: "Qin " +0x6a8f: "Pu " +0x6a90: "Yan " +0x6a91: "Lei " +0x6a92: "Feng " +0x6a93: "Hui " +0x6a94: "Dang " +0x6a95: "Ji " +0x6a96: "Sui " +0x6a97: "Bo " +0x6a98: "Bi " +0x6a99: "Ding " +0x6a9a: "Chu " +0x6a9b: "Zhua " +0x6a9c: "Kuai " +0x6a9d: "Ji " +0x6a9e: "Jie " +0x6a9f: "Jia " +0x6aa0: "Qing " +0x6aa1: "Zhe " +0x6aa2: "Jian " +0x6aa3: "Qiang " +0x6aa4: "Dao " +0x6aa5: "Yi " +0x6aa6: "Biao " +0x6aa7: "Song " +0x6aa8: "She " +0x6aa9: "Lin " +0x6aaa: "Kunugi " +0x6aab: "Cha " +0x6aac: "Meng " +0x6aad: "Yin " +0x6aae: "Tao " +0x6aaf: "Tai " +0x6ab0: "Mian " +0x6ab1: "Qi " +0x6ab2: "Toan " +0x6ab3: "Bin " +0x6ab4: "Huo " +0x6ab5: "Ji " +0x6ab6: "Qian " +0x6ab7: "Mi " +0x6ab8: "Ning " +0x6ab9: "Yi " +0x6aba: "Gao " +0x6abb: "Jian " +0x6abc: "Yin " +0x6abd: "Er " +0x6abe: "Qing " +0x6abf: "Yan " +0x6ac0: "Qi " +0x6ac1: "Mi " +0x6ac2: "Zhao " +0x6ac3: "Gui " +0x6ac4: "Chun " +0x6ac5: "Ji " +0x6ac6: "Kui " +0x6ac7: "Po " +0x6ac8: "Deng " +0x6ac9: "Chu " +0x6aca: "[?] " +0x6acb: "Mian " +0x6acc: "You " +0x6acd: "Zhi " +0x6ace: "Guang " +0x6acf: "Qian " +0x6ad0: "Lei " +0x6ad1: "Lei " +0x6ad2: "Sa " +0x6ad3: "Lu " +0x6ad4: "Li " +0x6ad5: "Cuan " +0x6ad6: "Lu " +0x6ad7: "Mie " +0x6ad8: "Hui " +0x6ad9: "Ou " +0x6ada: "Lu " +0x6adb: "Jie " +0x6adc: "Gao " +0x6add: "Du " +0x6ade: "Yuan " +0x6adf: "Li " +0x6ae0: "Fei " +0x6ae1: "Zhuo " +0x6ae2: "Sou " +0x6ae3: "Lian " +0x6ae4: "Tamo " +0x6ae5: "Chu " +0x6ae6: "[?] " +0x6ae7: "Zhu " +0x6ae8: "Lu " +0x6ae9: "Yan " +0x6aea: "Li " +0x6aeb: "Zhu " +0x6aec: "Chen " +0x6aed: "Jie " +0x6aee: "E " +0x6aef: "Su " +0x6af0: "Huai " +0x6af1: "Nie " +0x6af2: "Yu " +0x6af3: "Long " +0x6af4: "Lai " +0x6af5: "[?] " +0x6af6: "Xian " +0x6af7: "Kwi " +0x6af8: "Ju " +0x6af9: "Xiao " +0x6afa: "Ling " +0x6afb: "Ying " +0x6afc: "Jian " +0x6afd: "Yin " +0x6afe: "You " +0x6aff: "Ying " +/* x06b */ +0x6b00: "Xiang " +0x6b01: "Nong " +0x6b02: "Bo " +0x6b03: "Chan " +0x6b04: "Lan " +0x6b05: "Ju " +0x6b06: "Shuang " +0x6b07: "She " +0x6b08: "Wei " +0x6b09: "Cong " +0x6b0a: "Quan " +0x6b0b: "Qu " +0x6b0c: "Cang " +0x6b0d: "[?] " +0x6b0e: "Yu " +0x6b0f: "Luo " +0x6b10: "Li " +0x6b11: "Zan " +0x6b12: "Luan " +0x6b13: "Dang " +0x6b14: "Jue " +0x6b15: "Em " +0x6b16: "Lan " +0x6b17: "Lan " +0x6b18: "Zhu " +0x6b19: "Lei " +0x6b1a: "Li " +0x6b1b: "Ba " +0x6b1c: "Nang " +0x6b1d: "Yu " +0x6b1e: "Ling " +0x6b1f: "Tsuki " +0x6b20: "Qian " +0x6b21: "Ci " +0x6b22: "Huan " +0x6b23: "Xin " +0x6b24: "Yu " +0x6b25: "Yu " +0x6b26: "Qian " +0x6b27: "Ou " +0x6b28: "Xu " +0x6b29: "Chao " +0x6b2a: "Chu " +0x6b2b: "Chi " +0x6b2c: "Kai " +0x6b2d: "Yi " +0x6b2e: "Jue " +0x6b2f: "Xi " +0x6b30: "Xu " +0x6b31: "Xia " +0x6b32: "Yu " +0x6b33: "Kuai " +0x6b34: "Lang " +0x6b35: "Kuan " +0x6b36: "Shuo " +0x6b37: "Xi " +0x6b38: "Ai " +0x6b39: "Yi " +0x6b3a: "Qi " +0x6b3b: "Hu " +0x6b3c: "Chi " +0x6b3d: "Qin " +0x6b3e: "Kuan " +0x6b3f: "Kan " +0x6b40: "Kuan " +0x6b41: "Kan " +0x6b42: "Chuan " +0x6b43: "Sha " +0x6b44: "Gua " +0x6b45: "Yin " +0x6b46: "Xin " +0x6b47: "Xie " +0x6b48: "Yu " +0x6b49: "Qian " +0x6b4a: "Xiao " +0x6b4b: "Yi " +0x6b4c: "Ge " +0x6b4d: "Wu " +0x6b4e: "Tan " +0x6b4f: "Jin " +0x6b50: "Ou " +0x6b51: "Hu " +0x6b52: "Ti " +0x6b53: "Huan " +0x6b54: "Xu " +0x6b55: "Pen " +0x6b56: "Xi " +0x6b57: "Xiao " +0x6b58: "Xu " +0x6b59: "Xi " +0x6b5a: "Sen " +0x6b5b: "Lian " +0x6b5c: "Chu " +0x6b5d: "Yi " +0x6b5e: "Kan " +0x6b5f: "Yu " +0x6b60: "Chuo " +0x6b61: "Huan " +0x6b62: "Zhi " +0x6b63: "Zheng " +0x6b64: "Ci " +0x6b65: "Bu " +0x6b66: "Wu " +0x6b67: "Qi " +0x6b68: "Bu " +0x6b69: "Bu " +0x6b6a: "Wai " +0x6b6b: "Ju " +0x6b6c: "Qian " +0x6b6d: "Chi " +0x6b6e: "Se " +0x6b6f: "Chi " +0x6b70: "Se " +0x6b71: "Zhong " +0x6b72: "Sui " +0x6b73: "Sui " +0x6b74: "Li " +0x6b75: "Cuo " +0x6b76: "Yu " +0x6b77: "Li " +0x6b78: "Gui " +0x6b79: "Dai " +0x6b7a: "Dai " +0x6b7b: "Si " +0x6b7c: "Jian " +0x6b7d: "Zhe " +0x6b7e: "Mo " +0x6b7f: "Mo " +0x6b80: "Yao " +0x6b81: "Mo " +0x6b82: "Cu " +0x6b83: "Yang " +0x6b84: "Tian " +0x6b85: "Sheng " +0x6b86: "Dai " +0x6b87: "Shang " +0x6b88: "Xu " +0x6b89: "Xun " +0x6b8a: "Shu " +0x6b8b: "Can " +0x6b8c: "Jue " +0x6b8d: "Piao " +0x6b8e: "Qia " +0x6b8f: "Qiu " +0x6b90: "Su " +0x6b91: "Qing " +0x6b92: "Yun " +0x6b93: "Lian " +0x6b94: "Yi " +0x6b95: "Fou " +0x6b96: "Zhi " +0x6b97: "Ye " +0x6b98: "Can " +0x6b99: "Hun " +0x6b9a: "Dan " +0x6b9b: "Ji " +0x6b9c: "Ye " +0x6b9d: "Zhen " +0x6b9e: "Yun " +0x6b9f: "Wen " +0x6ba0: "Chou " +0x6ba1: "Bin " +0x6ba2: "Ti " +0x6ba3: "Jin " +0x6ba4: "Shang " +0x6ba5: "Yin " +0x6ba6: "Diao " +0x6ba7: "Cu " +0x6ba8: "Hui " +0x6ba9: "Cuan " +0x6baa: "Yi " +0x6bab: "Dan " +0x6bac: "Du " +0x6bad: "Jiang " +0x6bae: "Lian " +0x6baf: "Bin " +0x6bb0: "Du " +0x6bb1: "Tsukusu " +0x6bb2: "Jian " +0x6bb3: "Shu " +0x6bb4: "Ou " +0x6bb5: "Duan " +0x6bb6: "Zhu " +0x6bb7: "Yin " +0x6bb8: "Qing " +0x6bb9: "Yi " +0x6bba: "Sha " +0x6bbb: "Que " +0x6bbc: "Ke " +0x6bbd: "Yao " +0x6bbe: "Jun " +0x6bbf: "Dian " +0x6bc0: "Hui " +0x6bc1: "Hui " +0x6bc2: "Gu " +0x6bc3: "Que " +0x6bc4: "Ji " +0x6bc5: "Yi " +0x6bc6: "Ou " +0x6bc7: "Hui " +0x6bc8: "Duan " +0x6bc9: "Yi " +0x6bca: "Xiao " +0x6bcb: "Wu " +0x6bcc: "Guan " +0x6bcd: "Mu " +0x6bce: "Mei " +0x6bcf: "Mei " +0x6bd0: "Ai " +0x6bd1: "Zuo " +0x6bd2: "Du " +0x6bd3: "Yu " +0x6bd4: "Bi " +0x6bd5: "Bi " +0x6bd6: "Bi " +0x6bd7: "Pi " +0x6bd8: "Pi " +0x6bd9: "Bi " +0x6bda: "Chan " +0x6bdb: "Mao " +0x6bdc: "[?] " +0x6bdd: "[?] " +0x6bde: "Pu " +0x6bdf: "Mushiru " +0x6be0: "Jia " +0x6be1: "Zhan " +0x6be2: "Sai " +0x6be3: "Mu " +0x6be4: "Tuo " +0x6be5: "Xun " +0x6be6: "Er " +0x6be7: "Rong " +0x6be8: "Xian " +0x6be9: "Ju " +0x6bea: "Mu " +0x6beb: "Hao " +0x6bec: "Qiu " +0x6bed: "Dou " +0x6bee: "Mushiru " +0x6bef: "Tan " +0x6bf0: "Pei " +0x6bf1: "Ju " +0x6bf2: "Duo " +0x6bf3: "Cui " +0x6bf4: "Bi " +0x6bf5: "San " +0x6bf6: "[?] " +0x6bf7: "Mao " +0x6bf8: "Sui " +0x6bf9: "Yu " +0x6bfa: "Yu " +0x6bfb: "Tuo " +0x6bfc: "He " +0x6bfd: "Jian " +0x6bfe: "Ta " +0x6bff: "San " +/* x06c */ +0x6c00: "Lu " +0x6c01: "Mu " +0x6c02: "Li " +0x6c03: "Tong " +0x6c04: "Rong " +0x6c05: "Chang " +0x6c06: "Pu " +0x6c07: "Luo " +0x6c08: "Zhan " +0x6c09: "Sao " +0x6c0a: "Zhan " +0x6c0b: "Meng " +0x6c0c: "Luo " +0x6c0d: "Qu " +0x6c0e: "Die " +0x6c0f: "Shi " +0x6c10: "Di " +0x6c11: "Min " +0x6c12: "Jue " +0x6c13: "Mang " +0x6c14: "Qi " +0x6c15: "Pie " +0x6c16: "Nai " +0x6c17: "Qi " +0x6c18: "Dao " +0x6c19: "Xian " +0x6c1a: "Chuan " +0x6c1b: "Fen " +0x6c1c: "Ri " +0x6c1d: "Nei " +0x6c1e: "[?] " +0x6c1f: "Fu " +0x6c20: "Shen " +0x6c21: "Dong " +0x6c22: "Qing " +0x6c23: "Qi " +0x6c24: "Yin " +0x6c25: "Xi " +0x6c26: "Hai " +0x6c27: "Yang " +0x6c28: "An " +0x6c29: "Ya " +0x6c2a: "Ke " +0x6c2b: "Qing " +0x6c2c: "Ya " +0x6c2d: "Dong " +0x6c2e: "Dan " +0x6c2f: "Lu " +0x6c30: "Qing " +0x6c31: "Yang " +0x6c32: "Yun " +0x6c33: "Yun " +0x6c34: "Shui " +0x6c35: "San " +0x6c36: "Zheng " +0x6c37: "Bing " +0x6c38: "Yong " +0x6c39: "Dang " +0x6c3a: "Shitamizu " +0x6c3b: "Le " +0x6c3c: "Ni " +0x6c3d: "Tun " +0x6c3e: "Fan " +0x6c3f: "Gui " +0x6c40: "Ting " +0x6c41: "Zhi " +0x6c42: "Qiu " +0x6c43: "Bin " +0x6c44: "Ze " +0x6c45: "Mian " +0x6c46: "Cuan " +0x6c47: "Hui " +0x6c48: "Diao " +0x6c49: "Yi " +0x6c4a: "Cha " +0x6c4b: "Zhuo " +0x6c4c: "Chuan " +0x6c4d: "Wan " +0x6c4e: "Fan " +0x6c4f: "Dai " +0x6c50: "Xi " +0x6c51: "Tuo " +0x6c52: "Mang " +0x6c53: "Qiu " +0x6c54: "Qi " +0x6c55: "Shan " +0x6c56: "Pai " +0x6c57: "Han " +0x6c58: "Qian " +0x6c59: "Wu " +0x6c5a: "Wu " +0x6c5b: "Xun " +0x6c5c: "Si " +0x6c5d: "Ru " +0x6c5e: "Gong " +0x6c5f: "Jiang " +0x6c60: "Chi " +0x6c61: "Wu " +0x6c62: "Tsuchi " +0x6c63: "[?] " +0x6c64: "Tang " +0x6c65: "Zhi " +0x6c66: "Chi " +0x6c67: "Qian " +0x6c68: "Mi " +0x6c69: "Yu " +0x6c6a: "Wang " +0x6c6b: "Qing " +0x6c6c: "Jing " +0x6c6d: "Rui " +0x6c6e: "Jun " +0x6c6f: "Hong " +0x6c70: "Tai " +0x6c71: "Quan " +0x6c72: "Ji " +0x6c73: "Bian " +0x6c74: "Bian " +0x6c75: "Gan " +0x6c76: "Wen " +0x6c77: "Zhong " +0x6c78: "Fang " +0x6c79: "Xiong " +0x6c7a: "Jue " +0x6c7b: "Hang " +0x6c7c: "Niou " +0x6c7d: "Qi " +0x6c7e: "Fen " +0x6c7f: "Xu " +0x6c80: "Xu " +0x6c81: "Qin " +0x6c82: "Yi " +0x6c83: "Wo " +0x6c84: "Yun " +0x6c85: "Yuan " +0x6c86: "Hang " +0x6c87: "Yan " +0x6c88: "Chen " +0x6c89: "Chen " +0x6c8a: "Dan " +0x6c8b: "You " +0x6c8c: "Dun " +0x6c8d: "Hu " +0x6c8e: "Huo " +0x6c8f: "Qie " +0x6c90: "Mu " +0x6c91: "Rou " +0x6c92: "Mei " +0x6c93: "Ta " +0x6c94: "Mian " +0x6c95: "Wu " +0x6c96: "Chong " +0x6c97: "Tian " +0x6c98: "Bi " +0x6c99: "Sha " +0x6c9a: "Zhi " +0x6c9b: "Pei " +0x6c9c: "Pan " +0x6c9d: "Zhui " +0x6c9e: "Za " +0x6c9f: "Gou " +0x6ca0: "Liu " +0x6ca1: "Mei " +0x6ca2: "Ze " +0x6ca3: "Feng " +0x6ca4: "Ou " +0x6ca5: "Li " +0x6ca6: "Lun " +0x6ca7: "Cang " +0x6ca8: "Feng " +0x6ca9: "Wei " +0x6caa: "Hu " +0x6cab: "Mo " +0x6cac: "Mei " +0x6cad: "Shu " +0x6cae: "Ju " +0x6caf: "Zan " +0x6cb0: "Tuo " +0x6cb1: "Tuo " +0x6cb2: "Tuo " +0x6cb3: "He " +0x6cb4: "Li " +0x6cb5: "Mi " +0x6cb6: "Yi " +0x6cb7: "Fa " +0x6cb8: "Fei " +0x6cb9: "You " +0x6cba: "Tian " +0x6cbb: "Zhi " +0x6cbc: "Zhao " +0x6cbd: "Gu " +0x6cbe: "Zhan " +0x6cbf: "Yan " +0x6cc0: "Si " +0x6cc1: "Kuang " +0x6cc2: "Jiong " +0x6cc3: "Ju " +0x6cc4: "Xie " +0x6cc5: "Qiu " +0x6cc6: "Yi " +0x6cc7: "Jia " +0x6cc8: "Zhong " +0x6cc9: "Quan " +0x6cca: "Bo " +0x6ccb: "Hui " +0x6ccc: "Mi " +0x6ccd: "Ben " +0x6cce: "Zhuo " +0x6ccf: "Chu " +0x6cd0: "Le " +0x6cd1: "You " +0x6cd2: "Gu " +0x6cd3: "Hong " +0x6cd4: "Gan " +0x6cd5: "Fa " +0x6cd6: "Mao " +0x6cd7: "Si " +0x6cd8: "Hu " +0x6cd9: "Ping " +0x6cda: "Ci " +0x6cdb: "Fan " +0x6cdc: "Chi " +0x6cdd: "Su " +0x6cde: "Ning " +0x6cdf: "Cheng " +0x6ce0: "Ling " +0x6ce1: "Pao " +0x6ce2: "Bo " +0x6ce3: "Qi " +0x6ce4: "Si " +0x6ce5: "Ni " +0x6ce6: "Ju " +0x6ce7: "Yue " +0x6ce8: "Zhu " +0x6ce9: "Sheng " +0x6cea: "Lei " +0x6ceb: "Xuan " +0x6cec: "Xue " +0x6ced: "Fu " +0x6cee: "Pan " +0x6cef: "Min " +0x6cf0: "Tai " +0x6cf1: "Yang " +0x6cf2: "Ji " +0x6cf3: "Yong " +0x6cf4: "Guan " +0x6cf5: "Beng " +0x6cf6: "Xue " +0x6cf7: "Long " +0x6cf8: "Lu " +0x6cf9: "[?] " +0x6cfa: "Bo " +0x6cfb: "Xie " +0x6cfc: "Po " +0x6cfd: "Ze " +0x6cfe: "Jing " +0x6cff: "Yin " +/* x06d */ +0x6d00: "Zhou " +0x6d01: "Ji " +0x6d02: "Yi " +0x6d03: "Hui " +0x6d04: "Hui " +0x6d05: "Zui " +0x6d06: "Cheng " +0x6d07: "Yin " +0x6d08: "Wei " +0x6d09: "Hou " +0x6d0a: "Jian " +0x6d0b: "Yang " +0x6d0c: "Lie " +0x6d0d: "Si " +0x6d0e: "Ji " +0x6d0f: "Er " +0x6d10: "Xing " +0x6d11: "Fu " +0x6d12: "Sa " +0x6d13: "Suo " +0x6d14: "Zhi " +0x6d15: "Yin " +0x6d16: "Wu " +0x6d17: "Xi " +0x6d18: "Kao " +0x6d19: "Zhu " +0x6d1a: "Jiang " +0x6d1b: "Luo " +0x6d1c: "[?] " +0x6d1d: "An " +0x6d1e: "Dong " +0x6d1f: "Yi " +0x6d20: "Mou " +0x6d21: "Lei " +0x6d22: "Yi " +0x6d23: "Mi " +0x6d24: "Quan " +0x6d25: "Jin " +0x6d26: "Mo " +0x6d27: "Wei " +0x6d28: "Xiao " +0x6d29: "Xie " +0x6d2a: "Hong " +0x6d2b: "Xu " +0x6d2c: "Shuo " +0x6d2d: "Kuang " +0x6d2e: "Tao " +0x6d2f: "Qie " +0x6d30: "Ju " +0x6d31: "Er " +0x6d32: "Zhou " +0x6d33: "Ru " +0x6d34: "Ping " +0x6d35: "Xun " +0x6d36: "Xiong " +0x6d37: "Zhi " +0x6d38: "Guang " +0x6d39: "Huan " +0x6d3a: "Ming " +0x6d3b: "Huo " +0x6d3c: "Wa " +0x6d3d: "Qia " +0x6d3e: "Pai " +0x6d3f: "Wu " +0x6d40: "Qu " +0x6d41: "Liu " +0x6d42: "Yi " +0x6d43: "Jia " +0x6d44: "Jing " +0x6d45: "Qian " +0x6d46: "Jiang " +0x6d47: "Jiao " +0x6d48: "Cheng " +0x6d49: "Shi " +0x6d4a: "Zhuo " +0x6d4b: "Ce " +0x6d4c: "Pal " +0x6d4d: "Kuai " +0x6d4e: "Ji " +0x6d4f: "Liu " +0x6d50: "Chan " +0x6d51: "Hun " +0x6d52: "Hu " +0x6d53: "Nong " +0x6d54: "Xun " +0x6d55: "Jin " +0x6d56: "Lie " +0x6d57: "Qiu " +0x6d58: "Wei " +0x6d59: "Zhe " +0x6d5a: "Jun " +0x6d5b: "Han " +0x6d5c: "Bang " +0x6d5d: "Mang " +0x6d5e: "Zhuo " +0x6d5f: "You " +0x6d60: "Xi " +0x6d61: "Bo " +0x6d62: "Dou " +0x6d63: "Wan " +0x6d64: "Hong " +0x6d65: "Yi " +0x6d66: "Pu " +0x6d67: "Ying " +0x6d68: "Lan " +0x6d69: "Hao " +0x6d6a: "Lang " +0x6d6b: "Han " +0x6d6c: "Li " +0x6d6d: "Geng " +0x6d6e: "Fu " +0x6d6f: "Wu " +0x6d70: "Lian " +0x6d71: "Chun " +0x6d72: "Feng " +0x6d73: "Yi " +0x6d74: "Yu " +0x6d75: "Tong " +0x6d76: "Lao " +0x6d77: "Hai " +0x6d78: "Jin " +0x6d79: "Jia " +0x6d7a: "Chong " +0x6d7b: "Weng " +0x6d7c: "Mei " +0x6d7d: "Sui " +0x6d7e: "Cheng " +0x6d7f: "Pei " +0x6d80: "Xian " +0x6d81: "Shen " +0x6d82: "Tu " +0x6d83: "Kun " +0x6d84: "Pin " +0x6d85: "Nie " +0x6d86: "Han " +0x6d87: "Jing " +0x6d88: "Xiao " +0x6d89: "She " +0x6d8a: "Nian " +0x6d8b: "Tu " +0x6d8c: "Yong " +0x6d8d: "Xiao " +0x6d8e: "Xian " +0x6d8f: "Ting " +0x6d90: "E " +0x6d91: "Su " +0x6d92: "Tun " +0x6d93: "Juan " +0x6d94: "Cen " +0x6d95: "Ti " +0x6d96: "Li " +0x6d97: "Shui " +0x6d98: "Si " +0x6d99: "Lei " +0x6d9a: "Shui " +0x6d9b: "Tao " +0x6d9c: "Du " +0x6d9d: "Lao " +0x6d9e: "Lai " +0x6d9f: "Lian " +0x6da0: "Wei " +0x6da1: "Wo " +0x6da2: "Yun " +0x6da3: "Huan " +0x6da4: "Di " +0x6da5: "[?] " +0x6da6: "Run " +0x6da7: "Jian " +0x6da8: "Zhang " +0x6da9: "Se " +0x6daa: "Fu " +0x6dab: "Guan " +0x6dac: "Xing " +0x6dad: "Shou " +0x6dae: "Shuan " +0x6daf: "Ya " +0x6db0: "Chuo " +0x6db1: "Zhang " +0x6db2: "Ye " +0x6db3: "Kong " +0x6db4: "Wo " +0x6db5: "Han " +0x6db6: "Tuo " +0x6db7: "Dong " +0x6db8: "He " +0x6db9: "Wo " +0x6dba: "Ju " +0x6dbb: "Gan " +0x6dbc: "Liang " +0x6dbd: "Hun " +0x6dbe: "Ta " +0x6dbf: "Zhuo " +0x6dc0: "Dian " +0x6dc1: "Qie " +0x6dc2: "De " +0x6dc3: "Juan " +0x6dc4: "Zi " +0x6dc5: "Xi " +0x6dc6: "Yao " +0x6dc7: "Qi " +0x6dc8: "Gu " +0x6dc9: "Guo " +0x6dca: "Han " +0x6dcb: "Lin " +0x6dcc: "Tang " +0x6dcd: "Zhou " +0x6dce: "Peng " +0x6dcf: "Hao " +0x6dd0: "Chang " +0x6dd1: "Shu " +0x6dd2: "Qi " +0x6dd3: "Fang " +0x6dd4: "Chi " +0x6dd5: "Lu " +0x6dd6: "Nao " +0x6dd7: "Ju " +0x6dd8: "Tao " +0x6dd9: "Cong " +0x6dda: "Lei " +0x6ddb: "Zhi " +0x6ddc: "Peng " +0x6ddd: "Fei " +0x6dde: "Song " +0x6ddf: "Tian " +0x6de0: "Pi " +0x6de1: "Dan " +0x6de2: "Yu " +0x6de3: "Ni " +0x6de4: "Yu " +0x6de5: "Lu " +0x6de6: "Gan " +0x6de7: "Mi " +0x6de8: "Jing " +0x6de9: "Ling " +0x6dea: "Lun " +0x6deb: "Yin " +0x6dec: "Cui " +0x6ded: "Qu " +0x6dee: "Huai " +0x6def: "Yu " +0x6df0: "Nian " +0x6df1: "Shen " +0x6df2: "Piao " +0x6df3: "Chun " +0x6df4: "Wa " +0x6df5: "Yuan " +0x6df6: "Lai " +0x6df7: "Hun " +0x6df8: "Qing " +0x6df9: "Yan " +0x6dfa: "Qian " +0x6dfb: "Tian " +0x6dfc: "Miao " +0x6dfd: "Zhi " +0x6dfe: "Yin " +0x6dff: "Mi " +/* x06e */ +0x6e00: "Ben " +0x6e01: "Yuan " +0x6e02: "Wen " +0x6e03: "Re " +0x6e04: "Fei " +0x6e05: "Qing " +0x6e06: "Yuan " +0x6e07: "Ke " +0x6e08: "Ji " +0x6e09: "She " +0x6e0a: "Yuan " +0x6e0b: "Shibui " +0x6e0c: "Lu " +0x6e0d: "Zi " +0x6e0e: "Du " +0x6e0f: "[?] " +0x6e10: "Jian " +0x6e11: "Min " +0x6e12: "Pi " +0x6e13: "Tani " +0x6e14: "Yu " +0x6e15: "Yuan " +0x6e16: "Shen " +0x6e17: "Shen " +0x6e18: "Rou " +0x6e19: "Huan " +0x6e1a: "Zhu " +0x6e1b: "Jian " +0x6e1c: "Nuan " +0x6e1d: "Yu " +0x6e1e: "Qiu " +0x6e1f: "Ting " +0x6e20: "Qu " +0x6e21: "Du " +0x6e22: "Feng " +0x6e23: "Zha " +0x6e24: "Bo " +0x6e25: "Wo " +0x6e26: "Wo " +0x6e27: "Di " +0x6e28: "Wei " +0x6e29: "Wen " +0x6e2a: "Ru " +0x6e2b: "Xie " +0x6e2c: "Ce " +0x6e2d: "Wei " +0x6e2e: "Ge " +0x6e2f: "Gang " +0x6e30: "Yan " +0x6e31: "Hong " +0x6e32: "Xuan " +0x6e33: "Mi " +0x6e34: "Ke " +0x6e35: "Mao " +0x6e36: "Ying " +0x6e37: "Yan " +0x6e38: "You " +0x6e39: "Hong " +0x6e3a: "Miao " +0x6e3b: "Xing " +0x6e3c: "Mei " +0x6e3d: "Zai " +0x6e3e: "Hun " +0x6e3f: "Nai " +0x6e40: "Kui " +0x6e41: "Shi " +0x6e42: "E " +0x6e43: "Pai " +0x6e44: "Mei " +0x6e45: "Lian " +0x6e46: "Qi " +0x6e47: "Qi " +0x6e48: "Mei " +0x6e49: "Tian " +0x6e4a: "Cou " +0x6e4b: "Wei " +0x6e4c: "Can " +0x6e4d: "Tuan " +0x6e4e: "Mian " +0x6e4f: "Hui " +0x6e50: "Mo " +0x6e51: "Xu " +0x6e52: "Ji " +0x6e53: "Pen " +0x6e54: "Jian " +0x6e55: "Jian " +0x6e56: "Hu " +0x6e57: "Feng " +0x6e58: "Xiang " +0x6e59: "Yi " +0x6e5a: "Yin " +0x6e5b: "Zhan " +0x6e5c: "Shi " +0x6e5d: "Jie " +0x6e5e: "Cheng " +0x6e5f: "Huang " +0x6e60: "Tan " +0x6e61: "Yu " +0x6e62: "Bi " +0x6e63: "Min " +0x6e64: "Shi " +0x6e65: "Tu " +0x6e66: "Sheng " +0x6e67: "Yong " +0x6e68: "Qu " +0x6e69: "Zhong " +0x6e6a: "Suei " +0x6e6b: "Jiu " +0x6e6c: "Jiao " +0x6e6d: "Qiou " +0x6e6e: "Yin " +0x6e6f: "Tang " +0x6e70: "Long " +0x6e71: "Huo " +0x6e72: "Yuan " +0x6e73: "Nan " +0x6e74: "Ban " +0x6e75: "You " +0x6e76: "Quan " +0x6e77: "Chui " +0x6e78: "Liang " +0x6e79: "Chan " +0x6e7a: "Yan " +0x6e7b: "Chun " +0x6e7c: "Nie " +0x6e7d: "Zi " +0x6e7e: "Wan " +0x6e7f: "Shi " +0x6e80: "Man " +0x6e81: "Ying " +0x6e82: "Ratsu " +0x6e83: "Kui " +0x6e84: "[?] " +0x6e85: "Jian " +0x6e86: "Xu " +0x6e87: "Lu " +0x6e88: "Gui " +0x6e89: "Gai " +0x6e8a: "[?] " +0x6e8b: "[?] " +0x6e8c: "Po " +0x6e8d: "Jin " +0x6e8e: "Gui " +0x6e8f: "Tang " +0x6e90: "Yuan " +0x6e91: "Suo " +0x6e92: "Yuan " +0x6e93: "Lian " +0x6e94: "Yao " +0x6e95: "Meng " +0x6e96: "Zhun " +0x6e97: "Sheng " +0x6e98: "Ke " +0x6e99: "Tai " +0x6e9a: "Da " +0x6e9b: "Wa " +0x6e9c: "Liu " +0x6e9d: "Gou " +0x6e9e: "Sao " +0x6e9f: "Ming " +0x6ea0: "Zha " +0x6ea1: "Shi " +0x6ea2: "Yi " +0x6ea3: "Lun " +0x6ea4: "Ma " +0x6ea5: "Pu " +0x6ea6: "Wei " +0x6ea7: "Li " +0x6ea8: "Cai " +0x6ea9: "Wu " +0x6eaa: "Xi " +0x6eab: "Wen " +0x6eac: "Qiang " +0x6ead: "Ze " +0x6eae: "Shi " +0x6eaf: "Su " +0x6eb0: "Yi " +0x6eb1: "Zhen " +0x6eb2: "Sou " +0x6eb3: "Yun " +0x6eb4: "Xiu " +0x6eb5: "Yin " +0x6eb6: "Rong " +0x6eb7: "Hun " +0x6eb8: "Su " +0x6eb9: "Su " +0x6eba: "Ni " +0x6ebb: "Ta " +0x6ebc: "Shi " +0x6ebd: "Ru " +0x6ebe: "Wei " +0x6ebf: "Pan " +0x6ec0: "Chu " +0x6ec1: "Chu " +0x6ec2: "Pang " +0x6ec3: "Weng " +0x6ec4: "Cang " +0x6ec5: "Mie " +0x6ec6: "He " +0x6ec7: "Dian " +0x6ec8: "Hao " +0x6ec9: "Huang " +0x6eca: "Xi " +0x6ecb: "Zi " +0x6ecc: "Di " +0x6ecd: "Zhi " +0x6ece: "Ying " +0x6ecf: "Fu " +0x6ed0: "Jie " +0x6ed1: "Hua " +0x6ed2: "Ge " +0x6ed3: "Zi " +0x6ed4: "Tao " +0x6ed5: "Teng " +0x6ed6: "Sui " +0x6ed7: "Bi " +0x6ed8: "Jiao " +0x6ed9: "Hui " +0x6eda: "Gun " +0x6edb: "Yin " +0x6edc: "Gao " +0x6edd: "Long " +0x6ede: "Zhi " +0x6edf: "Yan " +0x6ee0: "She " +0x6ee1: "Man " +0x6ee2: "Ying " +0x6ee3: "Chun " +0x6ee4: "Lu " +0x6ee5: "Lan " +0x6ee6: "Luan " +0x6ee7: "[?] " +0x6ee8: "Bin " +0x6ee9: "Tan " +0x6eea: "Yu " +0x6eeb: "Sou " +0x6eec: "Hu " +0x6eed: "Bi " +0x6eee: "Biao " +0x6eef: "Zhi " +0x6ef0: "Jiang " +0x6ef1: "Kou " +0x6ef2: "Shen " +0x6ef3: "Shang " +0x6ef4: "Di " +0x6ef5: "Mi " +0x6ef6: "Ao " +0x6ef7: "Lu " +0x6ef8: "Hu " +0x6ef9: "Hu " +0x6efa: "You " +0x6efb: "Chan " +0x6efc: "Fan " +0x6efd: "Yong " +0x6efe: "Gun " +0x6eff: "Man " +/* x06f */ +0x6f00: "Qing " +0x6f01: "Yu " +0x6f02: "Piao " +0x6f03: "Ji " +0x6f04: "Ya " +0x6f05: "Jiao " +0x6f06: "Qi " +0x6f07: "Xi " +0x6f08: "Ji " +0x6f09: "Lu " +0x6f0a: "Lu " +0x6f0b: "Long " +0x6f0c: "Jin " +0x6f0d: "Guo " +0x6f0e: "Cong " +0x6f0f: "Lou " +0x6f10: "Zhi " +0x6f11: "Gai " +0x6f12: "Qiang " +0x6f13: "Li " +0x6f14: "Yan " +0x6f15: "Cao " +0x6f16: "Jiao " +0x6f17: "Cong " +0x6f18: "Qun " +0x6f19: "Tuan " +0x6f1a: "Ou " +0x6f1b: "Teng " +0x6f1c: "Ye " +0x6f1d: "Xi " +0x6f1e: "Mi " +0x6f1f: "Tang " +0x6f20: "Mo " +0x6f21: "Shang " +0x6f22: "Han " +0x6f23: "Lian " +0x6f24: "Lan " +0x6f25: "Wa " +0x6f26: "Li " +0x6f27: "Qian " +0x6f28: "Feng " +0x6f29: "Xuan " +0x6f2a: "Yi " +0x6f2b: "Man " +0x6f2c: "Zi " +0x6f2d: "Mang " +0x6f2e: "Kang " +0x6f2f: "Lei " +0x6f30: "Peng " +0x6f31: "Shu " +0x6f32: "Zhang " +0x6f33: "Zhang " +0x6f34: "Chong " +0x6f35: "Xu " +0x6f36: "Huan " +0x6f37: "Kuo " +0x6f38: "Jian " +0x6f39: "Yan " +0x6f3a: "Chuang " +0x6f3b: "Liao " +0x6f3c: "Cui " +0x6f3d: "Ti " +0x6f3e: "Yang " +0x6f3f: "Jiang " +0x6f40: "Cong " +0x6f41: "Ying " +0x6f42: "Hong " +0x6f43: "Xun " +0x6f44: "Shu " +0x6f45: "Guan " +0x6f46: "Ying " +0x6f47: "Xiao " +0x6f48: "[?] " +0x6f49: "[?] " +0x6f4a: "Xu " +0x6f4b: "Lian " +0x6f4c: "Zhi " +0x6f4d: "Wei " +0x6f4e: "Pi " +0x6f4f: "Jue " +0x6f50: "Jiao " +0x6f51: "Po " +0x6f52: "Dang " +0x6f53: "Hui " +0x6f54: "Jie " +0x6f55: "Wu " +0x6f56: "Pa " +0x6f57: "Ji " +0x6f58: "Pan " +0x6f59: "Gui " +0x6f5a: "Xiao " +0x6f5b: "Qian " +0x6f5c: "Qian " +0x6f5d: "Xi " +0x6f5e: "Lu " +0x6f5f: "Xi " +0x6f60: "Xuan " +0x6f61: "Dun " +0x6f62: "Huang " +0x6f63: "Min " +0x6f64: "Run " +0x6f65: "Su " +0x6f66: "Liao " +0x6f67: "Zhen " +0x6f68: "Zhong " +0x6f69: "Yi " +0x6f6a: "Di " +0x6f6b: "Wan " +0x6f6c: "Dan " +0x6f6d: "Tan " +0x6f6e: "Chao " +0x6f6f: "Xun " +0x6f70: "Kui " +0x6f71: "Yie " +0x6f72: "Shao " +0x6f73: "Tu " +0x6f74: "Zhu " +0x6f75: "San " +0x6f76: "Hei " +0x6f77: "Bi " +0x6f78: "Shan " +0x6f79: "Chan " +0x6f7a: "Chan " +0x6f7b: "Shu " +0x6f7c: "Tong " +0x6f7d: "Pu " +0x6f7e: "Lin " +0x6f7f: "Wei " +0x6f80: "Se " +0x6f81: "Se " +0x6f82: "Cheng " +0x6f83: "Jiong " +0x6f84: "Cheng " +0x6f85: "Hua " +0x6f86: "Jiao " +0x6f87: "Lao " +0x6f88: "Che " +0x6f89: "Gan " +0x6f8a: "Cun " +0x6f8b: "Heng " +0x6f8c: "Si " +0x6f8d: "Shu " +0x6f8e: "Peng " +0x6f8f: "Han " +0x6f90: "Yun " +0x6f91: "Liu " +0x6f92: "Hong " +0x6f93: "Fu " +0x6f94: "Hao " +0x6f95: "He " +0x6f96: "Xian " +0x6f97: "Jian " +0x6f98: "Shan " +0x6f99: "Xi " +0x6f9a: "Oki " +0x6f9b: "[?] " +0x6f9c: "Lan " +0x6f9d: "[?] " +0x6f9e: "Yu " +0x6f9f: "Lin " +0x6fa0: "Min " +0x6fa1: "Zao " +0x6fa2: "Dang " +0x6fa3: "Wan " +0x6fa4: "Ze " +0x6fa5: "Xie " +0x6fa6: "Yu " +0x6fa7: "Li " +0x6fa8: "Shi " +0x6fa9: "Xue " +0x6faa: "Ling " +0x6fab: "Man " +0x6fac: "Zi " +0x6fad: "Yong " +0x6fae: "Kuai " +0x6faf: "Can " +0x6fb0: "Lian " +0x6fb1: "Dian " +0x6fb2: "Ye " +0x6fb3: "Ao " +0x6fb4: "Huan " +0x6fb5: "Zhen " +0x6fb6: "Chan " +0x6fb7: "Man " +0x6fb8: "Dan " +0x6fb9: "Dan " +0x6fba: "Yi " +0x6fbb: "Sui " +0x6fbc: "Pi " +0x6fbd: "Ju " +0x6fbe: "Ta " +0x6fbf: "Qin " +0x6fc0: "Ji " +0x6fc1: "Zhuo " +0x6fc2: "Lian " +0x6fc3: "Nong " +0x6fc4: "Guo " +0x6fc5: "Jin " +0x6fc6: "Fen " +0x6fc7: "Se " +0x6fc8: "Ji " +0x6fc9: "Sui " +0x6fca: "Hui " +0x6fcb: "Chu " +0x6fcc: "Ta " +0x6fcd: "Song " +0x6fce: "Ding " +0x6fcf: "[?] " +0x6fd0: "Zhu " +0x6fd1: "Lai " +0x6fd2: "Bin " +0x6fd3: "Lian " +0x6fd4: "Mi " +0x6fd5: "Shi " +0x6fd6: "Shu " +0x6fd7: "Mi " +0x6fd8: "Ning " +0x6fd9: "Ying " +0x6fda: "Ying " +0x6fdb: "Meng " +0x6fdc: "Jin " +0x6fdd: "Qi " +0x6fde: "Pi " +0x6fdf: "Ji " +0x6fe0: "Hao " +0x6fe1: "Ru " +0x6fe2: "Zui " +0x6fe3: "Wo " +0x6fe4: "Tao " +0x6fe5: "Yin " +0x6fe6: "Yin " +0x6fe7: "Dui " +0x6fe8: "Ci " +0x6fe9: "Huo " +0x6fea: "Jing " +0x6feb: "Lan " +0x6fec: "Jun " +0x6fed: "Ai " +0x6fee: "Pu " +0x6fef: "Zhuo " +0x6ff0: "Wei " +0x6ff1: "Bin " +0x6ff2: "Gu " +0x6ff3: "Qian " +0x6ff4: "Xing " +0x6ff5: "Hama " +0x6ff6: "Kuo " +0x6ff7: "Fei " +0x6ff8: "[?] " +0x6ff9: "Boku " +0x6ffa: "Jian " +0x6ffb: "Wei " +0x6ffc: "Luo " +0x6ffd: "Zan " +0x6ffe: "Lu " +0x6fff: "Li " +/* x070 */ +0x7000: "You " +0x7001: "Yang " +0x7002: "Lu " +0x7003: "Si " +0x7004: "Jie " +0x7005: "Ying " +0x7006: "Du " +0x7007: "Wang " +0x7008: "Hui " +0x7009: "Xie " +0x700a: "Pan " +0x700b: "Shen " +0x700c: "Biao " +0x700d: "Chan " +0x700e: "Mo " +0x700f: "Liu " +0x7010: "Jian " +0x7011: "Pu " +0x7012: "Se " +0x7013: "Cheng " +0x7014: "Gu " +0x7015: "Bin " +0x7016: "Huo " +0x7017: "Xian " +0x7018: "Lu " +0x7019: "Qin " +0x701a: "Han " +0x701b: "Ying " +0x701c: "Yong " +0x701d: "Li " +0x701e: "Jing " +0x701f: "Xiao " +0x7020: "Ying " +0x7021: "Sui " +0x7022: "Wei " +0x7023: "Xie " +0x7024: "Huai " +0x7025: "Hao " +0x7026: "Zhu " +0x7027: "Long " +0x7028: "Lai " +0x7029: "Dui " +0x702a: "Fan " +0x702b: "Hu " +0x702c: "Lai " +0x702d: "[?] " +0x702e: "[?] " +0x702f: "Ying " +0x7030: "Mi " +0x7031: "Ji " +0x7032: "Lian " +0x7033: "Jian " +0x7034: "Ying " +0x7035: "Fen " +0x7036: "Lin " +0x7037: "Yi " +0x7038: "Jian " +0x7039: "Yue " +0x703a: "Chan " +0x703b: "Dai " +0x703c: "Rang " +0x703d: "Jian " +0x703e: "Lan " +0x703f: "Fan " +0x7040: "Shuang " +0x7041: "Yuan " +0x7042: "Zhuo " +0x7043: "Feng " +0x7044: "She " +0x7045: "Lei " +0x7046: "Lan " +0x7047: "Cong " +0x7048: "Qu " +0x7049: "Yong " +0x704a: "Qian " +0x704b: "Fa " +0x704c: "Guan " +0x704d: "Que " +0x704e: "Yan " +0x704f: "Hao " +0x7050: "Hyeng " +0x7051: "Sa " +0x7052: "Zan " +0x7053: "Luan " +0x7054: "Yan " +0x7055: "Li " +0x7056: "Mi " +0x7057: "Shan " +0x7058: "Tan " +0x7059: "Dang " +0x705a: "Jiao " +0x705b: "Chan " +0x705c: "[?] " +0x705d: "Hao " +0x705e: "Ba " +0x705f: "Zhu " +0x7060: "Lan " +0x7061: "Lan " +0x7062: "Nang " +0x7063: "Wan " +0x7064: "Luan " +0x7065: "Xun " +0x7066: "Xian " +0x7067: "Yan " +0x7068: "Gan " +0x7069: "Yan " +0x706a: "Yu " +0x706b: "Huo " +0x706c: "Si " +0x706d: "Mie " +0x706e: "Guang " +0x706f: "Deng " +0x7070: "Hui " +0x7071: "Xiao " +0x7072: "Xiao " +0x7073: "Hu " +0x7074: "Hong " +0x7075: "Ling " +0x7076: "Zao " +0x7077: "Zhuan " +0x7078: "Jiu " +0x7079: "Zha " +0x707a: "Xie " +0x707b: "Chi " +0x707c: "Zhuo " +0x707d: "Zai " +0x707e: "Zai " +0x707f: "Can " +0x7080: "Yang " +0x7081: "Qi " +0x7082: "Zhong " +0x7083: "Fen " +0x7084: "Niu " +0x7085: "Jiong " +0x7086: "Wen " +0x7087: "Po " +0x7088: "Yi " +0x7089: "Lu " +0x708a: "Chui " +0x708b: "Pi " +0x708c: "Kai " +0x708d: "Pan " +0x708e: "Yan " +0x708f: "Kai " +0x7090: "Pang " +0x7091: "Mu " +0x7092: "Chao " +0x7093: "Liao " +0x7094: "Gui " +0x7095: "Kang " +0x7096: "Tun " +0x7097: "Guang " +0x7098: "Xin " +0x7099: "Zhi " +0x709a: "Guang " +0x709b: "Guang " +0x709c: "Wei " +0x709d: "Qiang " +0x709e: "[?] " +0x709f: "Da " +0x70a0: "Xia " +0x70a1: "Zheng " +0x70a2: "Zhu " +0x70a3: "Ke " +0x70a4: "Zhao " +0x70a5: "Fu " +0x70a6: "Ba " +0x70a7: "Duo " +0x70a8: "Duo " +0x70a9: "Ling " +0x70aa: "Zhuo " +0x70ab: "Xuan " +0x70ac: "Ju " +0x70ad: "Tan " +0x70ae: "Pao " +0x70af: "Jiong " +0x70b0: "Pao " +0x70b1: "Tai " +0x70b2: "Tai " +0x70b3: "Bing " +0x70b4: "Yang " +0x70b5: "Tong " +0x70b6: "Han " +0x70b7: "Zhu " +0x70b8: "Zha " +0x70b9: "Dian " +0x70ba: "Wei " +0x70bb: "Shi " +0x70bc: "Lian " +0x70bd: "Chi " +0x70be: "Huang " +0x70bf: "[?] " +0x70c0: "Hu " +0x70c1: "Shuo " +0x70c2: "Lan " +0x70c3: "Jing " +0x70c4: "Jiao " +0x70c5: "Xu " +0x70c6: "Xing " +0x70c7: "Quan " +0x70c8: "Lie " +0x70c9: "Huan " +0x70ca: "Yang " +0x70cb: "Xiao " +0x70cc: "Xiu " +0x70cd: "Xian " +0x70ce: "Yin " +0x70cf: "Wu " +0x70d0: "Zhou " +0x70d1: "Yao " +0x70d2: "Shi " +0x70d3: "Wei " +0x70d4: "Tong " +0x70d5: "Xue " +0x70d6: "Zai " +0x70d7: "Kai " +0x70d8: "Hong " +0x70d9: "Luo " +0x70da: "Xia " +0x70db: "Zhu " +0x70dc: "Xuan " +0x70dd: "Zheng " +0x70de: "Po " +0x70df: "Yan " +0x70e0: "Hui " +0x70e1: "Guang " +0x70e2: "Zhe " +0x70e3: "Hui " +0x70e4: "Kao " +0x70e5: "[?] " +0x70e6: "Fan " +0x70e7: "Shao " +0x70e8: "Ye " +0x70e9: "Hui " +0x70ea: "[?] " +0x70eb: "Tang " +0x70ec: "Jin " +0x70ed: "Re " +0x70ee: "[?] " +0x70ef: "Xi " +0x70f0: "Fu " +0x70f1: "Jiong " +0x70f2: "Che " +0x70f3: "Pu " +0x70f4: "Jing " +0x70f5: "Zhuo " +0x70f6: "Ting " +0x70f7: "Wan " +0x70f8: "Hai " +0x70f9: "Peng " +0x70fa: "Lang " +0x70fb: "Shan " +0x70fc: "Hu " +0x70fd: "Feng " +0x70fe: "Chi " +0x70ff: "Rong " +/* x071 */ +0x7100: "Hu " +0x7101: "Xi " +0x7102: "Shu " +0x7103: "He " +0x7104: "Xun " +0x7105: "Ku " +0x7106: "Jue " +0x7107: "Xiao " +0x7108: "Xi " +0x7109: "Yan " +0x710a: "Han " +0x710b: "Zhuang " +0x710c: "Jun " +0x710d: "Di " +0x710e: "Xie " +0x710f: "Ji " +0x7110: "Wu " +0x7111: "[?] " +0x7112: "[?] " +0x7113: "Han " +0x7114: "Yan " +0x7115: "Huan " +0x7116: "Men " +0x7117: "Ju " +0x7118: "Chou " +0x7119: "Bei " +0x711a: "Fen " +0x711b: "Lin " +0x711c: "Kun " +0x711d: "Hun " +0x711e: "Tun " +0x711f: "Xi " +0x7120: "Cui " +0x7121: "Wu " +0x7122: "Hong " +0x7123: "Ju " +0x7124: "Fu " +0x7125: "Wo " +0x7126: "Jiao " +0x7127: "Cong " +0x7128: "Feng " +0x7129: "Ping " +0x712a: "Qiong " +0x712b: "Ruo " +0x712c: "Xi " +0x712d: "Qiong " +0x712e: "Xin " +0x712f: "Zhuo " +0x7130: "Yan " +0x7131: "Yan " +0x7132: "Yi " +0x7133: "Jue " +0x7134: "Yu " +0x7135: "Gang " +0x7136: "Ran " +0x7137: "Pi " +0x7138: "Gu " +0x7139: "[?] " +0x713a: "Sheng " +0x713b: "Chang " +0x713c: "Shao " +0x713d: "[?] " +0x713e: "[?] " +0x713f: "[?] " +0x7140: "[?] " +0x7141: "Chen " +0x7142: "He " +0x7143: "Kui " +0x7144: "Zhong " +0x7145: "Duan " +0x7146: "Xia " +0x7147: "Hui " +0x7148: "Feng " +0x7149: "Lian " +0x714a: "Xuan " +0x714b: "Xing " +0x714c: "Huang " +0x714d: "Jiao " +0x714e: "Jian " +0x714f: "Bi " +0x7150: "Ying " +0x7151: "Zhu " +0x7152: "Wei " +0x7153: "Tuan " +0x7154: "Tian " +0x7155: "Xi " +0x7156: "Nuan " +0x7157: "Nuan " +0x7158: "Chan " +0x7159: "Yan " +0x715a: "Jiong " +0x715b: "Jiong " +0x715c: "Yu " +0x715d: "Mei " +0x715e: "Sha " +0x715f: "Wei " +0x7160: "Ye " +0x7161: "Xin " +0x7162: "Qiong " +0x7163: "Rou " +0x7164: "Mei " +0x7165: "Huan " +0x7166: "Xu " +0x7167: "Zhao " +0x7168: "Wei " +0x7169: "Fan " +0x716a: "Qiu " +0x716b: "Sui " +0x716c: "Yang " +0x716d: "Lie " +0x716e: "Zhu " +0x716f: "Jie " +0x7170: "Gao " +0x7171: "Gua " +0x7172: "Bao " +0x7173: "Hu " +0x7174: "Yun " +0x7175: "Xia " +0x7176: "[?] " +0x7177: "[?] " +0x7178: "Bian " +0x7179: "Gou " +0x717a: "Tui " +0x717b: "Tang " +0x717c: "Chao " +0x717d: "Shan " +0x717e: "N " +0x717f: "Bo " +0x7180: "Huang " +0x7181: "Xie " +0x7182: "Xi " +0x7183: "Wu " +0x7184: "Xi " +0x7185: "Yun " +0x7186: "He " +0x7187: "He " +0x7188: "Xi " +0x7189: "Yun " +0x718a: "Xiong " +0x718b: "Nai " +0x718c: "Shan " +0x718d: "Qiong " +0x718e: "Yao " +0x718f: "Xun " +0x7190: "Mi " +0x7191: "Lian " +0x7192: "Ying " +0x7193: "Wen " +0x7194: "Rong " +0x7195: "Oozutsu " +0x7196: "[?] " +0x7197: "Qiang " +0x7198: "Liu " +0x7199: "Xi " +0x719a: "Bi " +0x719b: "Biao " +0x719c: "Zong " +0x719d: "Lu " +0x719e: "Jian " +0x719f: "Shou " +0x71a0: "Yi " +0x71a1: "Lou " +0x71a2: "Feng " +0x71a3: "Sui " +0x71a4: "Yi " +0x71a5: "Tong " +0x71a6: "Jue " +0x71a7: "Zong " +0x71a8: "Yun " +0x71a9: "Hu " +0x71aa: "Yi " +0x71ab: "Zhi " +0x71ac: "Ao " +0x71ad: "Wei " +0x71ae: "Liao " +0x71af: "Han " +0x71b0: "Ou " +0x71b1: "Re " +0x71b2: "Jiong " +0x71b3: "Man " +0x71b4: "[?] " +0x71b5: "Shang " +0x71b6: "Cuan " +0x71b7: "Zeng " +0x71b8: "Jian " +0x71b9: "Xi " +0x71ba: "Xi " +0x71bb: "Xi " +0x71bc: "Yi " +0x71bd: "Xiao " +0x71be: "Chi " +0x71bf: "Huang " +0x71c0: "Chan " +0x71c1: "Ye " +0x71c2: "Qian " +0x71c3: "Ran " +0x71c4: "Yan " +0x71c5: "Xian " +0x71c6: "Qiao " +0x71c7: "Zun " +0x71c8: "Deng " +0x71c9: "Dun " +0x71ca: "Shen " +0x71cb: "Jiao " +0x71cc: "Fen " +0x71cd: "Si " +0x71ce: "Liao " +0x71cf: "Yu " +0x71d0: "Lin " +0x71d1: "Tong " +0x71d2: "Shao " +0x71d3: "Fen " +0x71d4: "Fan " +0x71d5: "Yan " +0x71d6: "Xun " +0x71d7: "Lan " +0x71d8: "Mei " +0x71d9: "Tang " +0x71da: "Yi " +0x71db: "Jing " +0x71dc: "Men " +0x71dd: "[?] " +0x71de: "[?] " +0x71df: "Ying " +0x71e0: "Yu " +0x71e1: "Yi " +0x71e2: "Xue " +0x71e3: "Lan " +0x71e4: "Tai " +0x71e5: "Zao " +0x71e6: "Can " +0x71e7: "Sui " +0x71e8: "Xi " +0x71e9: "Que " +0x71ea: "Cong " +0x71eb: "Lian " +0x71ec: "Hui " +0x71ed: "Zhu " +0x71ee: "Xie " +0x71ef: "Ling " +0x71f0: "Wei " +0x71f1: "Yi " +0x71f2: "Xie " +0x71f3: "Zhao " +0x71f4: "Hui " +0x71f5: "Tatsu " +0x71f6: "Nung " +0x71f7: "Lan " +0x71f8: "Ru " +0x71f9: "Xian " +0x71fa: "Kao " +0x71fb: "Xun " +0x71fc: "Jin " +0x71fd: "Chou " +0x71fe: "Chou " +0x71ff: "Yao " +/* x072 */ +0x7200: "He " +0x7201: "Lan " +0x7202: "Biao " +0x7203: "Rong " +0x7204: "Li " +0x7205: "Mo " +0x7206: "Bao " +0x7207: "Ruo " +0x7208: "Lu " +0x7209: "La " +0x720a: "Ao " +0x720b: "Xun " +0x720c: "Kuang " +0x720d: "Shuo " +0x720e: "[?] " +0x720f: "Li " +0x7210: "Lu " +0x7211: "Jue " +0x7212: "Liao " +0x7213: "Yan " +0x7214: "Xi " +0x7215: "Xie " +0x7216: "Long " +0x7217: "Ye " +0x7218: "[?] " +0x7219: "Rang " +0x721a: "Yue " +0x721b: "Lan " +0x721c: "Cong " +0x721d: "Jue " +0x721e: "Tong " +0x721f: "Guan " +0x7220: "[?] " +0x7221: "Che " +0x7222: "Mi " +0x7223: "Tang " +0x7224: "Lan " +0x7225: "Zhu " +0x7226: "[?] " +0x7227: "Ling " +0x7228: "Cuan " +0x7229: "Yu " +0x722a: "Zhua " +0x722b: "Tsumekanmuri " +0x722c: "Pa " +0x722d: "Zheng " +0x722e: "Pao " +0x722f: "Cheng " +0x7230: "Yuan " +0x7231: "Ai " +0x7232: "Wei " +0x7233: "[?] " +0x7234: "Jue " +0x7235: "Jue " +0x7236: "Fu " +0x7237: "Ye " +0x7238: "Ba " +0x7239: "Die " +0x723a: "Ye " +0x723b: "Yao " +0x723c: "Zu " +0x723d: "Shuang " +0x723e: "Er " +0x723f: "Qiang " +0x7240: "Chuang " +0x7241: "Ge " +0x7242: "Zang " +0x7243: "Die " +0x7244: "Qiang " +0x7245: "Yong " +0x7246: "Qiang " +0x7247: "Pian " +0x7248: "Ban " +0x7249: "Pan " +0x724a: "Shao " +0x724b: "Jian " +0x724c: "Pai " +0x724d: "Du " +0x724e: "Chuang " +0x724f: "Tou " +0x7250: "Zha " +0x7251: "Bian " +0x7252: "Die " +0x7253: "Bang " +0x7254: "Bo " +0x7255: "Chuang " +0x7256: "You " +0x7257: "[?] " +0x7258: "Du " +0x7259: "Ya " +0x725a: "Cheng " +0x725b: "Niu " +0x725c: "Ushihen " +0x725d: "Pin " +0x725e: "Jiu " +0x725f: "Mou " +0x7260: "Tuo " +0x7261: "Mu " +0x7262: "Lao " +0x7263: "Ren " +0x7264: "Mang " +0x7265: "Fang " +0x7266: "Mao " +0x7267: "Mu " +0x7268: "Gang " +0x7269: "Wu " +0x726a: "Yan " +0x726b: "Ge " +0x726c: "Bei " +0x726d: "Si " +0x726e: "Jian " +0x726f: "Gu " +0x7270: "You " +0x7271: "Ge " +0x7272: "Sheng " +0x7273: "Mu " +0x7274: "Di " +0x7275: "Qian " +0x7276: "Quan " +0x7277: "Quan " +0x7278: "Zi " +0x7279: "Te " +0x727a: "Xi " +0x727b: "Mang " +0x727c: "Keng " +0x727d: "Qian " +0x727e: "Wu " +0x727f: "Gu " +0x7280: "Xi " +0x7281: "Li " +0x7282: "Li " +0x7283: "Pou " +0x7284: "Ji " +0x7285: "Gang " +0x7286: "Zhi " +0x7287: "Ben " +0x7288: "Quan " +0x7289: "Run " +0x728a: "Du " +0x728b: "Ju " +0x728c: "Jia " +0x728d: "Jian " +0x728e: "Feng " +0x728f: "Pian " +0x7290: "Ke " +0x7291: "Ju " +0x7292: "Kao " +0x7293: "Chu " +0x7294: "Xi " +0x7295: "Bei " +0x7296: "Luo " +0x7297: "Jie " +0x7298: "Ma " +0x7299: "San " +0x729a: "Wei " +0x729b: "Li " +0x729c: "Dun " +0x729d: "Tong " +0x729e: "[?] " +0x729f: "Jiang " +0x72a0: "Ikenie " +0x72a1: "Li " +0x72a2: "Du " +0x72a3: "Lie " +0x72a4: "Pi " +0x72a5: "Piao " +0x72a6: "Bao " +0x72a7: "Xi " +0x72a8: "Chou " +0x72a9: "Wei " +0x72aa: "Kui " +0x72ab: "Chou " +0x72ac: "Quan " +0x72ad: "Fan " +0x72ae: "Ba " +0x72af: "Fan " +0x72b0: "Qiu " +0x72b1: "Ji " +0x72b2: "Cai " +0x72b3: "Chuo " +0x72b4: "An " +0x72b5: "Jie " +0x72b6: "Zhuang " +0x72b7: "Guang " +0x72b8: "Ma " +0x72b9: "You " +0x72ba: "Kang " +0x72bb: "Bo " +0x72bc: "Hou " +0x72bd: "Ya " +0x72be: "Yin " +0x72bf: "Huan " +0x72c0: "Zhuang " +0x72c1: "Yun " +0x72c2: "Kuang " +0x72c3: "Niu " +0x72c4: "Di " +0x72c5: "Qing " +0x72c6: "Zhong " +0x72c7: "Mu " +0x72c8: "Bei " +0x72c9: "Pi " +0x72ca: "Ju " +0x72cb: "Ni " +0x72cc: "Sheng " +0x72cd: "Pao " +0x72ce: "Xia " +0x72cf: "Tuo " +0x72d0: "Hu " +0x72d1: "Ling " +0x72d2: "Fei " +0x72d3: "Pi " +0x72d4: "Ni " +0x72d5: "Ao " +0x72d6: "You " +0x72d7: "Gou " +0x72d8: "Yue " +0x72d9: "Ju " +0x72da: "Dan " +0x72db: "Po " +0x72dc: "Gu " +0x72dd: "Xian " +0x72de: "Ning " +0x72df: "Huan " +0x72e0: "Hen " +0x72e1: "Jiao " +0x72e2: "He " +0x72e3: "Zhao " +0x72e4: "Ji " +0x72e5: "Xun " +0x72e6: "Shan " +0x72e7: "Ta " +0x72e8: "Rong " +0x72e9: "Shou " +0x72ea: "Tong " +0x72eb: "Lao " +0x72ec: "Du " +0x72ed: "Xia " +0x72ee: "Shi " +0x72ef: "Hua " +0x72f0: "Zheng " +0x72f1: "Yu " +0x72f2: "Sun " +0x72f3: "Yu " +0x72f4: "Bi " +0x72f5: "Mang " +0x72f6: "Xi " +0x72f7: "Juan " +0x72f8: "Li " +0x72f9: "Xia " +0x72fa: "Yin " +0x72fb: "Suan " +0x72fc: "Lang " +0x72fd: "Bei " +0x72fe: "Zhi " +0x72ff: "Yan " +/* x073 */ +0x7300: "Sha " +0x7301: "Li " +0x7302: "Han " +0x7303: "Xian " +0x7304: "Jing " +0x7305: "Pai " +0x7306: "Fei " +0x7307: "Yao " +0x7308: "Ba " +0x7309: "Qi " +0x730a: "Ni " +0x730b: "Biao " +0x730c: "Yin " +0x730d: "Lai " +0x730e: "Xi " +0x730f: "Jian " +0x7310: "Qiang " +0x7311: "Kun " +0x7312: "Yan " +0x7313: "Guo " +0x7314: "Zong " +0x7315: "Mi " +0x7316: "Chang " +0x7317: "Yi " +0x7318: "Zhi " +0x7319: "Zheng " +0x731a: "Ya " +0x731b: "Meng " +0x731c: "Cai " +0x731d: "Cu " +0x731e: "She " +0x731f: "Kari " +0x7320: "Cen " +0x7321: "Luo " +0x7322: "Hu " +0x7323: "Zong " +0x7324: "Ji " +0x7325: "Wei " +0x7326: "Feng " +0x7327: "Wo " +0x7328: "Yuan " +0x7329: "Xing " +0x732a: "Zhu " +0x732b: "Mao " +0x732c: "Wei " +0x732d: "Yuan " +0x732e: "Xian " +0x732f: "Tuan " +0x7330: "Ya " +0x7331: "Nao " +0x7332: "Xie " +0x7333: "Jia " +0x7334: "Hou " +0x7335: "Bian " +0x7336: "You " +0x7337: "You " +0x7338: "Mei " +0x7339: "Zha " +0x733a: "Yao " +0x733b: "Sun " +0x733c: "Bo " +0x733d: "Ming " +0x733e: "Hua " +0x733f: "Yuan " +0x7340: "Sou " +0x7341: "Ma " +0x7342: "Yuan " +0x7343: "Dai " +0x7344: "Yu " +0x7345: "Shi " +0x7346: "Hao " +0x7347: "[?] " +0x7348: "Yi " +0x7349: "Zhen " +0x734a: "Chuang " +0x734b: "Hao " +0x734c: "Man " +0x734d: "Jing " +0x734e: "Jiang " +0x734f: "Mu " +0x7350: "Zhang " +0x7351: "Chan " +0x7352: "Ao " +0x7353: "Ao " +0x7354: "Hao " +0x7355: "Cui " +0x7356: "Fen " +0x7357: "Jue " +0x7358: "Bi " +0x7359: "Bi " +0x735a: "Huang " +0x735b: "Pu " +0x735c: "Lin " +0x735d: "Yu " +0x735e: "Tong " +0x735f: "Yao " +0x7360: "Liao " +0x7361: "Shuo " +0x7362: "Xiao " +0x7363: "Swu " +0x7364: "Ton " +0x7365: "Xi " +0x7366: "Ge " +0x7367: "Juan " +0x7368: "Du " +0x7369: "Hui " +0x736a: "Kuai " +0x736b: "Xian " +0x736c: "Xie " +0x736d: "Ta " +0x736e: "Xian " +0x736f: "Xun " +0x7370: "Ning " +0x7371: "Pin " +0x7372: "Huo " +0x7373: "Nou " +0x7374: "Meng " +0x7375: "Lie " +0x7376: "Nao " +0x7377: "Guang " +0x7378: "Shou " +0x7379: "Lu " +0x737a: "Ta " +0x737b: "Xian " +0x737c: "Mi " +0x737d: "Rang " +0x737e: "Huan " +0x737f: "Nao " +0x7380: "Luo " +0x7381: "Xian " +0x7382: "Qi " +0x7383: "Jue " +0x7384: "Xuan " +0x7385: "Miao " +0x7386: "Zi " +0x7387: "Lu " +0x7388: "Lu " +0x7389: "Yu " +0x738a: "Su " +0x738b: "Wang " +0x738c: "Qiu " +0x738d: "Ga " +0x738e: "Ding " +0x738f: "Le " +0x7390: "Ba " +0x7391: "Ji " +0x7392: "Hong " +0x7393: "Di " +0x7394: "Quan " +0x7395: "Gan " +0x7396: "Jiu " +0x7397: "Yu " +0x7398: "Ji " +0x7399: "Yu " +0x739a: "Yang " +0x739b: "Ma " +0x739c: "Gong " +0x739d: "Wu " +0x739e: "Fu " +0x739f: "Wen " +0x73a0: "Jie " +0x73a1: "Ya " +0x73a2: "Fen " +0x73a3: "Bian " +0x73a4: "Beng " +0x73a5: "Yue " +0x73a6: "Jue " +0x73a7: "Yun " +0x73a8: "Jue " +0x73a9: "Wan " +0x73aa: "Jian " +0x73ab: "Mei " +0x73ac: "Dan " +0x73ad: "Pi " +0x73ae: "Wei " +0x73af: "Huan " +0x73b0: "Xian " +0x73b1: "Qiang " +0x73b2: "Ling " +0x73b3: "Dai " +0x73b4: "Yi " +0x73b5: "An " +0x73b6: "Ping " +0x73b7: "Dian " +0x73b8: "Fu " +0x73b9: "Xuan " +0x73ba: "Xi " +0x73bb: "Bo " +0x73bc: "Ci " +0x73bd: "Gou " +0x73be: "Jia " +0x73bf: "Shao " +0x73c0: "Po " +0x73c1: "Ci " +0x73c2: "Ke " +0x73c3: "Ran " +0x73c4: "Sheng " +0x73c5: "Shen " +0x73c6: "Yi " +0x73c7: "Zu " +0x73c8: "Jia " +0x73c9: "Min " +0x73ca: "Shan " +0x73cb: "Liu " +0x73cc: "Bi " +0x73cd: "Zhen " +0x73ce: "Zhen " +0x73cf: "Jue " +0x73d0: "Fa " +0x73d1: "Long " +0x73d2: "Jin " +0x73d3: "Jiao " +0x73d4: "Jian " +0x73d5: "Li " +0x73d6: "Guang " +0x73d7: "Xian " +0x73d8: "Zhou " +0x73d9: "Gong " +0x73da: "Yan " +0x73db: "Xiu " +0x73dc: "Yang " +0x73dd: "Xu " +0x73de: "Luo " +0x73df: "Su " +0x73e0: "Zhu " +0x73e1: "Qin " +0x73e2: "Ken " +0x73e3: "Xun " +0x73e4: "Bao " +0x73e5: "Er " +0x73e6: "Xiang " +0x73e7: "Yao " +0x73e8: "Xia " +0x73e9: "Heng " +0x73ea: "Gui " +0x73eb: "Chong " +0x73ec: "Xu " +0x73ed: "Ban " +0x73ee: "Pei " +0x73ef: "[?] " +0x73f0: "Dang " +0x73f1: "Ei " +0x73f2: "Hun " +0x73f3: "Wen " +0x73f4: "E " +0x73f5: "Cheng " +0x73f6: "Ti " +0x73f7: "Wu " +0x73f8: "Wu " +0x73f9: "Cheng " +0x73fa: "Jun " +0x73fb: "Mei " +0x73fc: "Bei " +0x73fd: "Ting " +0x73fe: "Xian " +0x73ff: "Chuo " +/* x074 */ +0x7400: "Han " +0x7401: "Xuan " +0x7402: "Yan " +0x7403: "Qiu " +0x7404: "Quan " +0x7405: "Lang " +0x7406: "Li " +0x7407: "Xiu " +0x7408: "Fu " +0x7409: "Liu " +0x740a: "Ye " +0x740b: "Xi " +0x740c: "Ling " +0x740d: "Li " +0x740e: "Jin " +0x740f: "Lian " +0x7410: "Suo " +0x7411: "Chiisai " +0x7412: "[?] " +0x7413: "Wan " +0x7414: "Dian " +0x7415: "Pin " +0x7416: "Zhan " +0x7417: "Cui " +0x7418: "Min " +0x7419: "Yu " +0x741a: "Ju " +0x741b: "Chen " +0x741c: "Lai " +0x741d: "Wen " +0x741e: "Sheng " +0x741f: "Wei " +0x7420: "Dian " +0x7421: "Chu " +0x7422: "Zhuo " +0x7423: "Pei " +0x7424: "Cheng " +0x7425: "Hu " +0x7426: "Qi " +0x7427: "E " +0x7428: "Kun " +0x7429: "Chang " +0x742a: "Qi " +0x742b: "Beng " +0x742c: "Wan " +0x742d: "Lu " +0x742e: "Cong " +0x742f: "Guan " +0x7430: "Yan " +0x7431: "Diao " +0x7432: "Bei " +0x7433: "Lin " +0x7434: "Qin " +0x7435: "Pi " +0x7436: "Pa " +0x7437: "Que " +0x7438: "Zhuo " +0x7439: "Qin " +0x743a: "Fa " +0x743b: "[?] " +0x743c: "Qiong " +0x743d: "Du " +0x743e: "Jie " +0x743f: "Hun " +0x7440: "Yu " +0x7441: "Mao " +0x7442: "Mei " +0x7443: "Chun " +0x7444: "Xuan " +0x7445: "Ti " +0x7446: "Xing " +0x7447: "Dai " +0x7448: "Rou " +0x7449: "Min " +0x744a: "Zhen " +0x744b: "Wei " +0x744c: "Ruan " +0x744d: "Huan " +0x744e: "Jie " +0x744f: "Chuan " +0x7450: "Jian " +0x7451: "Zhuan " +0x7452: "Yang " +0x7453: "Lian " +0x7454: "Quan " +0x7455: "Xia " +0x7456: "Duan " +0x7457: "Yuan " +0x7458: "Ye " +0x7459: "Nao " +0x745a: "Hu " +0x745b: "Ying " +0x745c: "Yu " +0x745d: "Huang " +0x745e: "Rui " +0x745f: "Se " +0x7460: "Liu " +0x7461: "Shi " +0x7462: "Rong " +0x7463: "Suo " +0x7464: "Yao " +0x7465: "Wen " +0x7466: "Wu " +0x7467: "Jin " +0x7468: "Jin " +0x7469: "Ying " +0x746a: "Ma " +0x746b: "Tao " +0x746c: "Liu " +0x746d: "Tang " +0x746e: "Li " +0x746f: "Lang " +0x7470: "Gui " +0x7471: "Zhen " +0x7472: "Qiang " +0x7473: "Cuo " +0x7474: "Jue " +0x7475: "Zhao " +0x7476: "Yao " +0x7477: "Ai " +0x7478: "Bin " +0x7479: "Tu " +0x747a: "Chang " +0x747b: "Kun " +0x747c: "Zhuan " +0x747d: "Cong " +0x747e: "Jin " +0x747f: "Yi " +0x7480: "Cui " +0x7481: "Cong " +0x7482: "Qi " +0x7483: "Li " +0x7484: "Ying " +0x7485: "Suo " +0x7486: "Qiu " +0x7487: "Xuan " +0x7488: "Ao " +0x7489: "Lian " +0x748a: "Man " +0x748b: "Zhang " +0x748c: "Yin " +0x748d: "[?] " +0x748e: "Ying " +0x748f: "Zhi " +0x7490: "Lu " +0x7491: "Wu " +0x7492: "Deng " +0x7493: "Xiou " +0x7494: "Zeng " +0x7495: "Xun " +0x7496: "Qu " +0x7497: "Dang " +0x7498: "Lin " +0x7499: "Liao " +0x749a: "Qiong " +0x749b: "Su " +0x749c: "Huang " +0x749d: "Gui " +0x749e: "Pu " +0x749f: "Jing " +0x74a0: "Fan " +0x74a1: "Jin " +0x74a2: "Liu " +0x74a3: "Ji " +0x74a4: "[?] " +0x74a5: "Jing " +0x74a6: "Ai " +0x74a7: "Bi " +0x74a8: "Can " +0x74a9: "Qu " +0x74aa: "Zao " +0x74ab: "Dang " +0x74ac: "Jiao " +0x74ad: "Gun " +0x74ae: "Tan " +0x74af: "Hui " +0x74b0: "Huan " +0x74b1: "Se " +0x74b2: "Sui " +0x74b3: "Tian " +0x74b4: "[?] " +0x74b5: "Yu " +0x74b6: "Jin " +0x74b7: "Lu " +0x74b8: "Bin " +0x74b9: "Shou " +0x74ba: "Wen " +0x74bb: "Zui " +0x74bc: "Lan " +0x74bd: "Xi " +0x74be: "Ji " +0x74bf: "Xuan " +0x74c0: "Ruan " +0x74c1: "Huo " +0x74c2: "Gai " +0x74c3: "Lei " +0x74c4: "Du " +0x74c5: "Li " +0x74c6: "Zhi " +0x74c7: "Rou " +0x74c8: "Li " +0x74c9: "Zan " +0x74ca: "Qiong " +0x74cb: "Zhe " +0x74cc: "Gui " +0x74cd: "Sui " +0x74ce: "La " +0x74cf: "Long " +0x74d0: "Lu " +0x74d1: "Li " +0x74d2: "Zan " +0x74d3: "Lan " +0x74d4: "Ying " +0x74d5: "Mi " +0x74d6: "Xiang " +0x74d7: "Xi " +0x74d8: "Guan " +0x74d9: "Dao " +0x74da: "Zan " +0x74db: "Huan " +0x74dc: "Gua " +0x74dd: "Bo " +0x74de: "Die " +0x74df: "Bao " +0x74e0: "Hu " +0x74e1: "Zhi " +0x74e2: "Piao " +0x74e3: "Ban " +0x74e4: "Rang " +0x74e5: "Li " +0x74e6: "Wa " +0x74e7: "Dekaguramu " +0x74e8: "Jiang " +0x74e9: "Qian " +0x74ea: "Fan " +0x74eb: "Pen " +0x74ec: "Fang " +0x74ed: "Dan " +0x74ee: "Weng " +0x74ef: "Ou " +0x74f0: "Deshiguramu " +0x74f1: "Miriguramu " +0x74f2: "Thon " +0x74f3: "Hu " +0x74f4: "Ling " +0x74f5: "Yi " +0x74f6: "Ping " +0x74f7: "Ci " +0x74f8: "Hekutogura " +0x74f9: "Juan " +0x74fa: "Chang " +0x74fb: "Chi " +0x74fc: "Sarake " +0x74fd: "Dang " +0x74fe: "Meng " +0x74ff: "Pou " +/* x075 */ +0x7500: "Zhui " +0x7501: "Ping " +0x7502: "Bian " +0x7503: "Zhou " +0x7504: "Zhen " +0x7505: "Senchigura " +0x7506: "Ci " +0x7507: "Ying " +0x7508: "Qi " +0x7509: "Xian " +0x750a: "Lou " +0x750b: "Di " +0x750c: "Ou " +0x750d: "Meng " +0x750e: "Zhuan " +0x750f: "Peng " +0x7510: "Lin " +0x7511: "Zeng " +0x7512: "Wu " +0x7513: "Pi " +0x7514: "Dan " +0x7515: "Weng " +0x7516: "Ying " +0x7517: "Yan " +0x7518: "Gan " +0x7519: "Dai " +0x751a: "Shen " +0x751b: "Tian " +0x751c: "Tian " +0x751d: "Han " +0x751e: "Chang " +0x751f: "Sheng " +0x7520: "Qing " +0x7521: "Sheng " +0x7522: "Chan " +0x7523: "Chan " +0x7524: "Rui " +0x7525: "Sheng " +0x7526: "Su " +0x7527: "Sen " +0x7528: "Yong " +0x7529: "Shuai " +0x752a: "Lu " +0x752b: "Fu " +0x752c: "Yong " +0x752d: "Beng " +0x752e: "Feng " +0x752f: "Ning " +0x7530: "Tian " +0x7531: "You " +0x7532: "Jia " +0x7533: "Shen " +0x7534: "Zha " +0x7535: "Dian " +0x7536: "Fu " +0x7537: "Nan " +0x7538: "Dian " +0x7539: "Ping " +0x753a: "Ting " +0x753b: "Hua " +0x753c: "Ting " +0x753d: "Quan " +0x753e: "Zi " +0x753f: "Meng " +0x7540: "Bi " +0x7541: "Qi " +0x7542: "Liu " +0x7543: "Xun " +0x7544: "Liu " +0x7545: "Chang " +0x7546: "Mu " +0x7547: "Yun " +0x7548: "Fan " +0x7549: "Fu " +0x754a: "Geng " +0x754b: "Tian " +0x754c: "Jie " +0x754d: "Jie " +0x754e: "Quan " +0x754f: "Wei " +0x7550: "Fu " +0x7551: "Tian " +0x7552: "Mu " +0x7553: "Tap " +0x7554: "Pan " +0x7555: "Jiang " +0x7556: "Wa " +0x7557: "Da " +0x7558: "Nan " +0x7559: "Liu " +0x755a: "Ben " +0x755b: "Zhen " +0x755c: "Chu " +0x755d: "Mu " +0x755e: "Mu " +0x755f: "Ce " +0x7560: "Cen " +0x7561: "Gai " +0x7562: "Bi " +0x7563: "Da " +0x7564: "Zhi " +0x7565: "Lue " +0x7566: "Qi " +0x7567: "Lue " +0x7568: "Pan " +0x7569: "Kesa " +0x756a: "Fan " +0x756b: "Hua " +0x756c: "Yu " +0x756d: "Yu " +0x756e: "Mu " +0x756f: "Jun " +0x7570: "Yi " +0x7571: "Liu " +0x7572: "Yu " +0x7573: "Die " +0x7574: "Chou " +0x7575: "Hua " +0x7576: "Dang " +0x7577: "Chuo " +0x7578: "Ji " +0x7579: "Wan " +0x757a: "Jiang " +0x757b: "Sheng " +0x757c: "Chang " +0x757d: "Tuan " +0x757e: "Lei " +0x757f: "Ji " +0x7580: "Cha " +0x7581: "Liu " +0x7582: "Tatamu " +0x7583: "Tuan " +0x7584: "Lin " +0x7585: "Jiang " +0x7586: "Jiang " +0x7587: "Chou " +0x7588: "Bo " +0x7589: "Die " +0x758a: "Die " +0x758b: "Pi " +0x758c: "Nie " +0x758d: "Dan " +0x758e: "Shu " +0x758f: "Shu " +0x7590: "Zhi " +0x7591: "Yi " +0x7592: "Chuang " +0x7593: "Nai " +0x7594: "Ding " +0x7595: "Bi " +0x7596: "Jie " +0x7597: "Liao " +0x7598: "Gong " +0x7599: "Ge " +0x759a: "Jiu " +0x759b: "Zhou " +0x759c: "Xia " +0x759d: "Shan " +0x759e: "Xu " +0x759f: "Nue " +0x75a0: "Li " +0x75a1: "Yang " +0x75a2: "Chen " +0x75a3: "You " +0x75a4: "Ba " +0x75a5: "Jie " +0x75a6: "Jue " +0x75a7: "Zhi " +0x75a8: "Xia " +0x75a9: "Cui " +0x75aa: "Bi " +0x75ab: "Yi " +0x75ac: "Li " +0x75ad: "Zong " +0x75ae: "Chuang " +0x75af: "Feng " +0x75b0: "Zhu " +0x75b1: "Pao " +0x75b2: "Pi " +0x75b3: "Gan " +0x75b4: "Ke " +0x75b5: "Ci " +0x75b6: "Xie " +0x75b7: "Qi " +0x75b8: "Dan " +0x75b9: "Zhen " +0x75ba: "Fa " +0x75bb: "Zhi " +0x75bc: "Teng " +0x75bd: "Ju " +0x75be: "Ji " +0x75bf: "Fei " +0x75c0: "Qu " +0x75c1: "Dian " +0x75c2: "Jia " +0x75c3: "Xian " +0x75c4: "Cha " +0x75c5: "Bing " +0x75c6: "Ni " +0x75c7: "Zheng " +0x75c8: "Yong " +0x75c9: "Jing " +0x75ca: "Quan " +0x75cb: "Chong " +0x75cc: "Tong " +0x75cd: "Yi " +0x75ce: "Kai " +0x75cf: "Wei " +0x75d0: "Hui " +0x75d1: "Duo " +0x75d2: "Yang " +0x75d3: "Chi " +0x75d4: "Zhi " +0x75d5: "Hen " +0x75d6: "Ya " +0x75d7: "Mei " +0x75d8: "Dou " +0x75d9: "Jing " +0x75da: "Xiao " +0x75db: "Tong " +0x75dc: "Tu " +0x75dd: "Mang " +0x75de: "Pi " +0x75df: "Xiao " +0x75e0: "Suan " +0x75e1: "Pu " +0x75e2: "Li " +0x75e3: "Zhi " +0x75e4: "Cuo " +0x75e5: "Duo " +0x75e6: "Wu " +0x75e7: "Sha " +0x75e8: "Lao " +0x75e9: "Shou " +0x75ea: "Huan " +0x75eb: "Xian " +0x75ec: "Yi " +0x75ed: "Peng " +0x75ee: "Zhang " +0x75ef: "Guan " +0x75f0: "Tan " +0x75f1: "Fei " +0x75f2: "Ma " +0x75f3: "Lin " +0x75f4: "Chi " +0x75f5: "Ji " +0x75f6: "Dian " +0x75f7: "An " +0x75f8: "Chi " +0x75f9: "Bi " +0x75fa: "Bei " +0x75fb: "Min " +0x75fc: "Gu " +0x75fd: "Dui " +0x75fe: "E " +0x75ff: "Wei " +/* x076 */ +0x7600: "Yu " +0x7601: "Cui " +0x7602: "Ya " +0x7603: "Zhu " +0x7604: "Cu " +0x7605: "Dan " +0x7606: "Shen " +0x7607: "Zhung " +0x7608: "Ji " +0x7609: "Yu " +0x760a: "Hou " +0x760b: "Feng " +0x760c: "La " +0x760d: "Yang " +0x760e: "Shen " +0x760f: "Tu " +0x7610: "Yu " +0x7611: "Gua " +0x7612: "Wen " +0x7613: "Huan " +0x7614: "Ku " +0x7615: "Jia " +0x7616: "Yin " +0x7617: "Yi " +0x7618: "Lu " +0x7619: "Sao " +0x761a: "Jue " +0x761b: "Chi " +0x761c: "Xi " +0x761d: "Guan " +0x761e: "Yi " +0x761f: "Wen " +0x7620: "Ji " +0x7621: "Chuang " +0x7622: "Ban " +0x7623: "Lei " +0x7624: "Liu " +0x7625: "Chai " +0x7626: "Shou " +0x7627: "Nue " +0x7628: "Dian " +0x7629: "Da " +0x762a: "Pie " +0x762b: "Tan " +0x762c: "Zhang " +0x762d: "Biao " +0x762e: "Shen " +0x762f: "Cu " +0x7630: "Luo " +0x7631: "Yi " +0x7632: "Zong " +0x7633: "Chou " +0x7634: "Zhang " +0x7635: "Zhai " +0x7636: "Sou " +0x7637: "Suo " +0x7638: "Que " +0x7639: "Diao " +0x763a: "Lou " +0x763b: "Lu " +0x763c: "Mo " +0x763d: "Jin " +0x763e: "Yin " +0x763f: "Ying " +0x7640: "Huang " +0x7641: "Fu " +0x7642: "Liao " +0x7643: "Long " +0x7644: "Qiao " +0x7645: "Liu " +0x7646: "Lao " +0x7647: "Xian " +0x7648: "Fei " +0x7649: "Dan " +0x764a: "Yin " +0x764b: "He " +0x764c: "Yan " +0x764d: "Ban " +0x764e: "Xian " +0x764f: "Guan " +0x7650: "Guai " +0x7651: "Nong " +0x7652: "Yu " +0x7653: "Wei " +0x7654: "Yi " +0x7655: "Yong " +0x7656: "Pi " +0x7657: "Lei " +0x7658: "Li " +0x7659: "Shu " +0x765a: "Dan " +0x765b: "Lin " +0x765c: "Dian " +0x765d: "Lin " +0x765e: "Lai " +0x765f: "Pie " +0x7660: "Ji " +0x7661: "Chi " +0x7662: "Yang " +0x7663: "Xian " +0x7664: "Jie " +0x7665: "Zheng " +0x7666: "[?] " +0x7667: "Li " +0x7668: "Huo " +0x7669: "Lai " +0x766a: "Shaku " +0x766b: "Dian " +0x766c: "Xian " +0x766d: "Ying " +0x766e: "Yin " +0x766f: "Qu " +0x7670: "Yong " +0x7671: "Tan " +0x7672: "Dian " +0x7673: "Luo " +0x7674: "Luan " +0x7675: "Luan " +0x7676: "Bo " +0x7677: "[?] " +0x7678: "Gui " +0x7679: "Po " +0x767a: "Fa " +0x767b: "Deng " +0x767c: "Fa " +0x767d: "Bai " +0x767e: "Bai " +0x767f: "Qie " +0x7680: "Bi " +0x7681: "Zao " +0x7682: "Zao " +0x7683: "Mao " +0x7684: "De " +0x7685: "Pa " +0x7686: "Jie " +0x7687: "Huang " +0x7688: "Gui " +0x7689: "Ci " +0x768a: "Ling " +0x768b: "Gao " +0x768c: "Mo " +0x768d: "Ji " +0x768e: "Jiao " +0x768f: "Peng " +0x7690: "Gao " +0x7691: "Ai " +0x7692: "E " +0x7693: "Hao " +0x7694: "Han " +0x7695: "Bi " +0x7696: "Wan " +0x7697: "Chou " +0x7698: "Qian " +0x7699: "Xi " +0x769a: "Ai " +0x769b: "Jiong " +0x769c: "Hao " +0x769d: "Huang " +0x769e: "Hao " +0x769f: "Ze " +0x76a0: "Cui " +0x76a1: "Hao " +0x76a2: "Xiao " +0x76a3: "Ye " +0x76a4: "Po " +0x76a5: "Hao " +0x76a6: "Jiao " +0x76a7: "Ai " +0x76a8: "Xing " +0x76a9: "Huang " +0x76aa: "Li " +0x76ab: "Piao " +0x76ac: "He " +0x76ad: "Jiao " +0x76ae: "Pi " +0x76af: "Gan " +0x76b0: "Pao " +0x76b1: "Zhou " +0x76b2: "Jun " +0x76b3: "Qiu " +0x76b4: "Cun " +0x76b5: "Que " +0x76b6: "Zha " +0x76b7: "Gu " +0x76b8: "Jun " +0x76b9: "Jun " +0x76ba: "Zhou " +0x76bb: "Zha " +0x76bc: "Gu " +0x76bd: "Zhan " +0x76be: "Du " +0x76bf: "Min " +0x76c0: "Qi " +0x76c1: "Ying " +0x76c2: "Yu " +0x76c3: "Bei " +0x76c4: "Zhao " +0x76c5: "Zhong " +0x76c6: "Pen " +0x76c7: "He " +0x76c8: "Ying " +0x76c9: "He " +0x76ca: "Yi " +0x76cb: "Bo " +0x76cc: "Wan " +0x76cd: "He " +0x76ce: "Ang " +0x76cf: "Zhan " +0x76d0: "Yan " +0x76d1: "Jian " +0x76d2: "He " +0x76d3: "Yu " +0x76d4: "Kui " +0x76d5: "Fan " +0x76d6: "Gai " +0x76d7: "Dao " +0x76d8: "Pan " +0x76d9: "Fu " +0x76da: "Qiu " +0x76db: "Sheng " +0x76dc: "Dao " +0x76dd: "Lu " +0x76de: "Zhan " +0x76df: "Meng " +0x76e0: "Li " +0x76e1: "Jin " +0x76e2: "Xu " +0x76e3: "Jian " +0x76e4: "Pan " +0x76e5: "Guan " +0x76e6: "An " +0x76e7: "Lu " +0x76e8: "Shu " +0x76e9: "Zhou " +0x76ea: "Dang " +0x76eb: "An " +0x76ec: "Gu " +0x76ed: "Li " +0x76ee: "Mu " +0x76ef: "Cheng " +0x76f0: "Gan " +0x76f1: "Xu " +0x76f2: "Mang " +0x76f3: "Mang " +0x76f4: "Zhi " +0x76f5: "Qi " +0x76f6: "Ruan " +0x76f7: "Tian " +0x76f8: "Xiang " +0x76f9: "Dun " +0x76fa: "Xin " +0x76fb: "Xi " +0x76fc: "Pan " +0x76fd: "Feng " +0x76fe: "Dun " +0x76ff: "Min " +/* x077 */ +0x7700: "Ming " +0x7701: "Sheng " +0x7702: "Shi " +0x7703: "Yun " +0x7704: "Mian " +0x7705: "Pan " +0x7706: "Fang " +0x7707: "Miao " +0x7708: "Dan " +0x7709: "Mei " +0x770a: "Mao " +0x770b: "Kan " +0x770c: "Xian " +0x770d: "Ou " +0x770e: "Shi " +0x770f: "Yang " +0x7710: "Zheng " +0x7711: "Yao " +0x7712: "Shen " +0x7713: "Huo " +0x7714: "Da " +0x7715: "Zhen " +0x7716: "Kuang " +0x7717: "Ju " +0x7718: "Shen " +0x7719: "Chi " +0x771a: "Sheng " +0x771b: "Mei " +0x771c: "Mo " +0x771d: "Zhu " +0x771e: "Zhen " +0x771f: "Zhen " +0x7720: "Mian " +0x7721: "Di " +0x7722: "Yuan " +0x7723: "Die " +0x7724: "Yi " +0x7725: "Zi " +0x7726: "Zi " +0x7727: "Chao " +0x7728: "Zha " +0x7729: "Xuan " +0x772a: "Bing " +0x772b: "Mi " +0x772c: "Long " +0x772d: "Sui " +0x772e: "Dong " +0x772f: "Mi " +0x7730: "Die " +0x7731: "Yi " +0x7732: "Er " +0x7733: "Ming " +0x7734: "Xuan " +0x7735: "Chi " +0x7736: "Kuang " +0x7737: "Juan " +0x7738: "Mou " +0x7739: "Zhen " +0x773a: "Tiao " +0x773b: "Yang " +0x773c: "Yan " +0x773d: "Mo " +0x773e: "Zhong " +0x773f: "Mai " +0x7740: "Zhao " +0x7741: "Zheng " +0x7742: "Mei " +0x7743: "Jun " +0x7744: "Shao " +0x7745: "Han " +0x7746: "Huan " +0x7747: "Di " +0x7748: "Cheng " +0x7749: "Cuo " +0x774a: "Juan " +0x774b: "E " +0x774c: "Wan " +0x774d: "Xian " +0x774e: "Xi " +0x774f: "Kun " +0x7750: "Lai " +0x7751: "Jian " +0x7752: "Shan " +0x7753: "Tian " +0x7754: "Hun " +0x7755: "Wan " +0x7756: "Ling " +0x7757: "Shi " +0x7758: "Qiong " +0x7759: "Lie " +0x775a: "Yai " +0x775b: "Jing " +0x775c: "Zheng " +0x775d: "Li " +0x775e: "Lai " +0x775f: "Sui " +0x7760: "Juan " +0x7761: "Shui " +0x7762: "Sui " +0x7763: "Du " +0x7764: "Bi " +0x7765: "Bi " +0x7766: "Mu " +0x7767: "Hun " +0x7768: "Ni " +0x7769: "Lu " +0x776a: "Yi " +0x776b: "Jie " +0x776c: "Cai " +0x776d: "Zhou " +0x776e: "Yu " +0x776f: "Hun " +0x7770: "Ma " +0x7771: "Xia " +0x7772: "Xing " +0x7773: "Xi " +0x7774: "Gun " +0x7775: "Cai " +0x7776: "Chun " +0x7777: "Jian " +0x7778: "Mei " +0x7779: "Du " +0x777a: "Hou " +0x777b: "Xuan " +0x777c: "Ti " +0x777d: "Kui " +0x777e: "Gao " +0x777f: "Rui " +0x7780: "Mou " +0x7781: "Xu " +0x7782: "Fa " +0x7783: "Wen " +0x7784: "Miao " +0x7785: "Chou " +0x7786: "Kui " +0x7787: "Mi " +0x7788: "Weng " +0x7789: "Kou " +0x778a: "Dang " +0x778b: "Chen " +0x778c: "Ke " +0x778d: "Sou " +0x778e: "Xia " +0x778f: "Qiong " +0x7790: "Mao " +0x7791: "Ming " +0x7792: "Man " +0x7793: "Shui " +0x7794: "Ze " +0x7795: "Zhang " +0x7796: "Yi " +0x7797: "Diao " +0x7798: "Ou " +0x7799: "Mo " +0x779a: "Shun " +0x779b: "Cong " +0x779c: "Lou " +0x779d: "Chi " +0x779e: "Man " +0x779f: "Piao " +0x77a0: "Cheng " +0x77a1: "Ji " +0x77a2: "Meng " +0x77a3: "[?] " +0x77a4: "Run " +0x77a5: "Pie " +0x77a6: "Xi " +0x77a7: "Qiao " +0x77a8: "Pu " +0x77a9: "Zhu " +0x77aa: "Deng " +0x77ab: "Shen " +0x77ac: "Shun " +0x77ad: "Liao " +0x77ae: "Che " +0x77af: "Xian " +0x77b0: "Kan " +0x77b1: "Ye " +0x77b2: "Xu " +0x77b3: "Tong " +0x77b4: "Mou " +0x77b5: "Lin " +0x77b6: "Kui " +0x77b7: "Xian " +0x77b8: "Ye " +0x77b9: "Ai " +0x77ba: "Hui " +0x77bb: "Zhan " +0x77bc: "Jian " +0x77bd: "Gu " +0x77be: "Zhao " +0x77bf: "Qu " +0x77c0: "Wei " +0x77c1: "Chou " +0x77c2: "Sao " +0x77c3: "Ning " +0x77c4: "Xun " +0x77c5: "Yao " +0x77c6: "Huo " +0x77c7: "Meng " +0x77c8: "Mian " +0x77c9: "Bin " +0x77ca: "Mian " +0x77cb: "Li " +0x77cc: "Kuang " +0x77cd: "Jue " +0x77ce: "Xuan " +0x77cf: "Mian " +0x77d0: "Huo " +0x77d1: "Lu " +0x77d2: "Meng " +0x77d3: "Long " +0x77d4: "Guan " +0x77d5: "Man " +0x77d6: "Xi " +0x77d7: "Chu " +0x77d8: "Tang " +0x77d9: "Kan " +0x77da: "Zhu " +0x77db: "Mao " +0x77dc: "Jin " +0x77dd: "Lin " +0x77de: "Yu " +0x77df: "Shuo " +0x77e0: "Ce " +0x77e1: "Jue " +0x77e2: "Shi " +0x77e3: "Yi " +0x77e4: "Shen " +0x77e5: "Zhi " +0x77e6: "Hou " +0x77e7: "Shen " +0x77e8: "Ying " +0x77e9: "Ju " +0x77ea: "Zhou " +0x77eb: "Jiao " +0x77ec: "Cuo " +0x77ed: "Duan " +0x77ee: "Ai " +0x77ef: "Jiao " +0x77f0: "Zeng " +0x77f1: "Huo " +0x77f2: "Bai " +0x77f3: "Shi " +0x77f4: "Ding " +0x77f5: "Qi " +0x77f6: "Ji " +0x77f7: "Zi " +0x77f8: "Gan " +0x77f9: "Wu " +0x77fa: "Tuo " +0x77fb: "Ku " +0x77fc: "Qiang " +0x77fd: "Xi " +0x77fe: "Fan " +0x77ff: "Kuang " +/* x078 */ +0x7800: "Dang " +0x7801: "Ma " +0x7802: "Sha " +0x7803: "Dan " +0x7804: "Jue " +0x7805: "Li " +0x7806: "Fu " +0x7807: "Min " +0x7808: "Nuo " +0x7809: "Huo " +0x780a: "Kang " +0x780b: "Zhi " +0x780c: "Qi " +0x780d: "Kan " +0x780e: "Jie " +0x780f: "Fen " +0x7810: "E " +0x7811: "Ya " +0x7812: "Pi " +0x7813: "Zhe " +0x7814: "Yan " +0x7815: "Sui " +0x7816: "Zhuan " +0x7817: "Che " +0x7818: "Dun " +0x7819: "Pan " +0x781a: "Yan " +0x781b: "[?] " +0x781c: "Feng " +0x781d: "Fa " +0x781e: "Mo " +0x781f: "Zha " +0x7820: "Qu " +0x7821: "Yu " +0x7822: "Luo " +0x7823: "Tuo " +0x7824: "Tuo " +0x7825: "Di " +0x7826: "Zhai " +0x7827: "Zhen " +0x7828: "Ai " +0x7829: "Fei " +0x782a: "Mu " +0x782b: "Zhu " +0x782c: "Li " +0x782d: "Bian " +0x782e: "Nu " +0x782f: "Ping " +0x7830: "Peng " +0x7831: "Ling " +0x7832: "Pao " +0x7833: "Le " +0x7834: "Po " +0x7835: "Bo " +0x7836: "Po " +0x7837: "Shen " +0x7838: "Za " +0x7839: "Nuo " +0x783a: "Li " +0x783b: "Long " +0x783c: "Tong " +0x783d: "[?] " +0x783e: "Li " +0x783f: "Aragane " +0x7840: "Chu " +0x7841: "Keng " +0x7842: "Quan " +0x7843: "Zhu " +0x7844: "Kuang " +0x7845: "Huo " +0x7846: "E " +0x7847: "Nao " +0x7848: "Jia " +0x7849: "Lu " +0x784a: "Wei " +0x784b: "Ai " +0x784c: "Luo " +0x784d: "Ken " +0x784e: "Xing " +0x784f: "Yan " +0x7850: "Tong " +0x7851: "Peng " +0x7852: "Xi " +0x7853: "[?] " +0x7854: "Hong " +0x7855: "Shuo " +0x7856: "Xia " +0x7857: "Qiao " +0x7858: "[?] " +0x7859: "Wei " +0x785a: "Qiao " +0x785b: "[?] " +0x785c: "Keng " +0x785d: "Xiao " +0x785e: "Que " +0x785f: "Chan " +0x7860: "Lang " +0x7861: "Hong " +0x7862: "Yu " +0x7863: "Xiao " +0x7864: "Xia " +0x7865: "Mang " +0x7866: "Long " +0x7867: "Iong " +0x7868: "Che " +0x7869: "Che " +0x786a: "E " +0x786b: "Liu " +0x786c: "Ying " +0x786d: "Mang " +0x786e: "Que " +0x786f: "Yan " +0x7870: "Sha " +0x7871: "Kun " +0x7872: "Yu " +0x7873: "[?] " +0x7874: "Kaki " +0x7875: "Lu " +0x7876: "Chen " +0x7877: "Jian " +0x7878: "Nue " +0x7879: "Song " +0x787a: "Zhuo " +0x787b: "Keng " +0x787c: "Peng " +0x787d: "Yan " +0x787e: "Zhui " +0x787f: "Kong " +0x7880: "Ceng " +0x7881: "Qi " +0x7882: "Zong " +0x7883: "Qing " +0x7884: "Lin " +0x7885: "Jun " +0x7886: "Bo " +0x7887: "Ding " +0x7888: "Min " +0x7889: "Diao " +0x788a: "Jian " +0x788b: "He " +0x788c: "Lu " +0x788d: "Ai " +0x788e: "Sui " +0x788f: "Que " +0x7890: "Ling " +0x7891: "Bei " +0x7892: "Yin " +0x7893: "Dui " +0x7894: "Wu " +0x7895: "Qi " +0x7896: "Lun " +0x7897: "Wan " +0x7898: "Dian " +0x7899: "Gang " +0x789a: "Pei " +0x789b: "Qi " +0x789c: "Chen " +0x789d: "Ruan " +0x789e: "Yan " +0x789f: "Die " +0x78a0: "Ding " +0x78a1: "Du " +0x78a2: "Tuo " +0x78a3: "Jie " +0x78a4: "Ying " +0x78a5: "Bian " +0x78a6: "Ke " +0x78a7: "Bi " +0x78a8: "Wei " +0x78a9: "Shuo " +0x78aa: "Zhen " +0x78ab: "Duan " +0x78ac: "Xia " +0x78ad: "Dang " +0x78ae: "Ti " +0x78af: "Nao " +0x78b0: "Peng " +0x78b1: "Jian " +0x78b2: "Di " +0x78b3: "Tan " +0x78b4: "Cha " +0x78b5: "Seki " +0x78b6: "Qi " +0x78b7: "[?] " +0x78b8: "Feng " +0x78b9: "Xuan " +0x78ba: "Que " +0x78bb: "Que " +0x78bc: "Ma " +0x78bd: "Gong " +0x78be: "Nian " +0x78bf: "Su " +0x78c0: "E " +0x78c1: "Ci " +0x78c2: "Liu " +0x78c3: "Si " +0x78c4: "Tang " +0x78c5: "Bang " +0x78c6: "Hua " +0x78c7: "Pi " +0x78c8: "Wei " +0x78c9: "Sang " +0x78ca: "Lei " +0x78cb: "Cuo " +0x78cc: "Zhen " +0x78cd: "Xia " +0x78ce: "Qi " +0x78cf: "Lian " +0x78d0: "Pan " +0x78d1: "Wei " +0x78d2: "Yun " +0x78d3: "Dui " +0x78d4: "Zhe " +0x78d5: "Ke " +0x78d6: "La " +0x78d7: "[?] " +0x78d8: "Qing " +0x78d9: "Gun " +0x78da: "Zhuan " +0x78db: "Chan " +0x78dc: "Qi " +0x78dd: "Ao " +0x78de: "Peng " +0x78df: "Lu " +0x78e0: "Lu " +0x78e1: "Kan " +0x78e2: "Qiang " +0x78e3: "Chen " +0x78e4: "Yin " +0x78e5: "Lei " +0x78e6: "Biao " +0x78e7: "Qi " +0x78e8: "Mo " +0x78e9: "Qi " +0x78ea: "Cui " +0x78eb: "Zong " +0x78ec: "Qing " +0x78ed: "Chuo " +0x78ee: "[?] " +0x78ef: "Ji " +0x78f0: "Shan " +0x78f1: "Lao " +0x78f2: "Qu " +0x78f3: "Zeng " +0x78f4: "Deng " +0x78f5: "Jian " +0x78f6: "Xi " +0x78f7: "Lin " +0x78f8: "Ding " +0x78f9: "Dian " +0x78fa: "Huang " +0x78fb: "Pan " +0x78fc: "Za " +0x78fd: "Qiao " +0x78fe: "Di " +0x78ff: "Li " +/* x079 */ +0x7900: "Tani " +0x7901: "Jiao " +0x7902: "[?] " +0x7903: "Zhang " +0x7904: "Qiao " +0x7905: "Dun " +0x7906: "Xian " +0x7907: "Yu " +0x7908: "Zhui " +0x7909: "He " +0x790a: "Huo " +0x790b: "Zhai " +0x790c: "Lei " +0x790d: "Ke " +0x790e: "Chu " +0x790f: "Ji " +0x7910: "Que " +0x7911: "Dang " +0x7912: "Yi " +0x7913: "Jiang " +0x7914: "Pi " +0x7915: "Pi " +0x7916: "Yu " +0x7917: "Pin " +0x7918: "Qi " +0x7919: "Ai " +0x791a: "Kai " +0x791b: "Jian " +0x791c: "Yu " +0x791d: "Ruan " +0x791e: "Meng " +0x791f: "Pao " +0x7920: "Ci " +0x7921: "[?] " +0x7922: "[?] " +0x7923: "Mie " +0x7924: "Ca " +0x7925: "Xian " +0x7926: "Kuang " +0x7927: "Lei " +0x7928: "Lei " +0x7929: "Zhi " +0x792a: "Li " +0x792b: "Li " +0x792c: "Fan " +0x792d: "Que " +0x792e: "Pao " +0x792f: "Ying " +0x7930: "Li " +0x7931: "Long " +0x7932: "Long " +0x7933: "Mo " +0x7934: "Bo " +0x7935: "Shuang " +0x7936: "Guan " +0x7937: "Lan " +0x7938: "Zan " +0x7939: "Yan " +0x793a: "Shi " +0x793b: "Shi " +0x793c: "Li " +0x793d: "Reng " +0x793e: "She " +0x793f: "Yue " +0x7940: "Si " +0x7941: "Qi " +0x7942: "Ta " +0x7943: "Ma " +0x7944: "Xie " +0x7945: "Xian " +0x7946: "Xian " +0x7947: "Zhi " +0x7948: "Qi " +0x7949: "Zhi " +0x794a: "Beng " +0x794b: "Dui " +0x794c: "Zhong " +0x794d: "[?] " +0x794e: "Yi " +0x794f: "Shi " +0x7950: "You " +0x7951: "Zhi " +0x7952: "Tiao " +0x7953: "Fu " +0x7954: "Fu " +0x7955: "Mi " +0x7956: "Zu " +0x7957: "Zhi " +0x7958: "Suan " +0x7959: "Mei " +0x795a: "Zuo " +0x795b: "Qu " +0x795c: "Hu " +0x795d: "Zhu " +0x795e: "Shen " +0x795f: "Sui " +0x7960: "Ci " +0x7961: "Chai " +0x7962: "Mi " +0x7963: "Lu " +0x7964: "Yu " +0x7965: "Xiang " +0x7966: "Wu " +0x7967: "Tiao " +0x7968: "Piao " +0x7969: "Zhu " +0x796a: "Gui " +0x796b: "Xia " +0x796c: "Zhi " +0x796d: "Ji " +0x796e: "Gao " +0x796f: "Zhen " +0x7970: "Gao " +0x7971: "Shui " +0x7972: "Jin " +0x7973: "Chen " +0x7974: "Gai " +0x7975: "Kun " +0x7976: "Di " +0x7977: "Dao " +0x7978: "Huo " +0x7979: "Tao " +0x797a: "Qi " +0x797b: "Gu " +0x797c: "Guan " +0x797d: "Zui " +0x797e: "Ling " +0x797f: "Lu " +0x7980: "Bing " +0x7981: "Jin " +0x7982: "Dao " +0x7983: "Zhi " +0x7984: "Lu " +0x7985: "Shan " +0x7986: "Bei " +0x7987: "Zhe " +0x7988: "Hui " +0x7989: "You " +0x798a: "Xi " +0x798b: "Yin " +0x798c: "Zi " +0x798d: "Huo " +0x798e: "Zhen " +0x798f: "Fu " +0x7990: "Yuan " +0x7991: "Wu " +0x7992: "Xian " +0x7993: "Yang " +0x7994: "Ti " +0x7995: "Yi " +0x7996: "Mei " +0x7997: "Si " +0x7998: "Di " +0x7999: "[?] " +0x799a: "Zhuo " +0x799b: "Zhen " +0x799c: "Yong " +0x799d: "Ji " +0x799e: "Gao " +0x799f: "Tang " +0x79a0: "Si " +0x79a1: "Ma " +0x79a2: "Ta " +0x79a3: "[?] " +0x79a4: "Xuan " +0x79a5: "Qi " +0x79a6: "Yu " +0x79a7: "Xi " +0x79a8: "Ji " +0x79a9: "Si " +0x79aa: "Chan " +0x79ab: "Tan " +0x79ac: "Kuai " +0x79ad: "Sui " +0x79ae: "Li " +0x79af: "Nong " +0x79b0: "Ni " +0x79b1: "Dao " +0x79b2: "Li " +0x79b3: "Rang " +0x79b4: "Yue " +0x79b5: "Ti " +0x79b6: "Zan " +0x79b7: "Lei " +0x79b8: "Rou " +0x79b9: "Yu " +0x79ba: "Yu " +0x79bb: "Chi " +0x79bc: "Xie " +0x79bd: "Qin " +0x79be: "He " +0x79bf: "Tu " +0x79c0: "Xiu " +0x79c1: "Si " +0x79c2: "Ren " +0x79c3: "Tu " +0x79c4: "Zi " +0x79c5: "Cha " +0x79c6: "Gan " +0x79c7: "Yi " +0x79c8: "Xian " +0x79c9: "Bing " +0x79ca: "Nian " +0x79cb: "Qiu " +0x79cc: "Qiu " +0x79cd: "Chong " +0x79ce: "Fen " +0x79cf: "Hao " +0x79d0: "Yun " +0x79d1: "Ke " +0x79d2: "Miao " +0x79d3: "Zhi " +0x79d4: "Geng " +0x79d5: "Bi " +0x79d6: "Zhi " +0x79d7: "Yu " +0x79d8: "Mi " +0x79d9: "Ku " +0x79da: "Ban " +0x79db: "Pi " +0x79dc: "Ni " +0x79dd: "Li " +0x79de: "You " +0x79df: "Zu " +0x79e0: "Pi " +0x79e1: "Ba " +0x79e2: "Ling " +0x79e3: "Mo " +0x79e4: "Cheng " +0x79e5: "Nian " +0x79e6: "Qin " +0x79e7: "Yang " +0x79e8: "Zuo " +0x79e9: "Zhi " +0x79ea: "Zhi " +0x79eb: "Shu " +0x79ec: "Ju " +0x79ed: "Zi " +0x79ee: "Huo " +0x79ef: "Ji " +0x79f0: "Cheng " +0x79f1: "Tong " +0x79f2: "Zhi " +0x79f3: "Huo " +0x79f4: "He " +0x79f5: "Yin " +0x79f6: "Zi " +0x79f7: "Zhi " +0x79f8: "Jie " +0x79f9: "Ren " +0x79fa: "Du " +0x79fb: "Yi " +0x79fc: "Zhu " +0x79fd: "Hui " +0x79fe: "Nong " +0x79ff: "Fu " +/* x07a */ +0x7a00: "Xi " +0x7a01: "Kao " +0x7a02: "Lang " +0x7a03: "Fu " +0x7a04: "Ze " +0x7a05: "Shui " +0x7a06: "Lu " +0x7a07: "Kun " +0x7a08: "Gan " +0x7a09: "Geng " +0x7a0a: "Ti " +0x7a0b: "Cheng " +0x7a0c: "Tu " +0x7a0d: "Shao " +0x7a0e: "Shui " +0x7a0f: "Ya " +0x7a10: "Lun " +0x7a11: "Lu " +0x7a12: "Gu " +0x7a13: "Zuo " +0x7a14: "Ren " +0x7a15: "Zhun " +0x7a16: "Bang " +0x7a17: "Bai " +0x7a18: "Ji " +0x7a19: "Zhi " +0x7a1a: "Zhi " +0x7a1b: "Kun " +0x7a1c: "Leng " +0x7a1d: "Peng " +0x7a1e: "Ke " +0x7a1f: "Bing " +0x7a20: "Chou " +0x7a21: "Zu " +0x7a22: "Yu " +0x7a23: "Su " +0x7a24: "Lue " +0x7a25: "[?] " +0x7a26: "Yi " +0x7a27: "Xi " +0x7a28: "Bian " +0x7a29: "Ji " +0x7a2a: "Fu " +0x7a2b: "Bi " +0x7a2c: "Nuo " +0x7a2d: "Jie " +0x7a2e: "Zhong " +0x7a2f: "Zong " +0x7a30: "Xu " +0x7a31: "Cheng " +0x7a32: "Dao " +0x7a33: "Wen " +0x7a34: "Lian " +0x7a35: "Zi " +0x7a36: "Yu " +0x7a37: "Ji " +0x7a38: "Xu " +0x7a39: "Zhen " +0x7a3a: "Zhi " +0x7a3b: "Dao " +0x7a3c: "Jia " +0x7a3d: "Ji " +0x7a3e: "Gao " +0x7a3f: "Gao " +0x7a40: "Gu " +0x7a41: "Rong " +0x7a42: "Sui " +0x7a43: "You " +0x7a44: "Ji " +0x7a45: "Kang " +0x7a46: "Mu " +0x7a47: "Shan " +0x7a48: "Men " +0x7a49: "Zhi " +0x7a4a: "Ji " +0x7a4b: "Lu " +0x7a4c: "Su " +0x7a4d: "Ji " +0x7a4e: "Ying " +0x7a4f: "Wen " +0x7a50: "Qiu " +0x7a51: "Se " +0x7a52: "[?] " +0x7a53: "Yi " +0x7a54: "Huang " +0x7a55: "Qie " +0x7a56: "Ji " +0x7a57: "Sui " +0x7a58: "Xiao " +0x7a59: "Pu " +0x7a5a: "Jiao " +0x7a5b: "Zhuo " +0x7a5c: "Tong " +0x7a5d: "Sai " +0x7a5e: "Lu " +0x7a5f: "Sui " +0x7a60: "Nong " +0x7a61: "Se " +0x7a62: "Hui " +0x7a63: "Rang " +0x7a64: "Nuo " +0x7a65: "Yu " +0x7a66: "Bin " +0x7a67: "Ji " +0x7a68: "Tui " +0x7a69: "Wen " +0x7a6a: "Cheng " +0x7a6b: "Huo " +0x7a6c: "Gong " +0x7a6d: "Lu " +0x7a6e: "Biao " +0x7a6f: "[?] " +0x7a70: "Rang " +0x7a71: "Zhuo " +0x7a72: "Li " +0x7a73: "Zan " +0x7a74: "Xue " +0x7a75: "Wa " +0x7a76: "Jiu " +0x7a77: "Qiong " +0x7a78: "Xi " +0x7a79: "Qiong " +0x7a7a: "Kong " +0x7a7b: "Yu " +0x7a7c: "Sen " +0x7a7d: "Jing " +0x7a7e: "Yao " +0x7a7f: "Chuan " +0x7a80: "Zhun " +0x7a81: "Tu " +0x7a82: "Lao " +0x7a83: "Qie " +0x7a84: "Zhai " +0x7a85: "Yao " +0x7a86: "Bian " +0x7a87: "Bao " +0x7a88: "Yao " +0x7a89: "Bing " +0x7a8a: "Wa " +0x7a8b: "Zhu " +0x7a8c: "Jiao " +0x7a8d: "Qiao " +0x7a8e: "Diao " +0x7a8f: "Wu " +0x7a90: "Gui " +0x7a91: "Yao " +0x7a92: "Zhi " +0x7a93: "Chuang " +0x7a94: "Yao " +0x7a95: "Tiao " +0x7a96: "Jiao " +0x7a97: "Chuang " +0x7a98: "Jiong " +0x7a99: "Xiao " +0x7a9a: "Cheng " +0x7a9b: "Kou " +0x7a9c: "Cuan " +0x7a9d: "Wo " +0x7a9e: "Dan " +0x7a9f: "Ku " +0x7aa0: "Ke " +0x7aa1: "Zhui " +0x7aa2: "Xu " +0x7aa3: "Su " +0x7aa4: "Guan " +0x7aa5: "Kui " +0x7aa6: "Dou " +0x7aa7: "[?] " +0x7aa8: "Yin " +0x7aa9: "Wo " +0x7aaa: "Wa " +0x7aab: "Ya " +0x7aac: "Yu " +0x7aad: "Ju " +0x7aae: "Qiong " +0x7aaf: "Yao " +0x7ab0: "Yao " +0x7ab1: "Tiao " +0x7ab2: "Chao " +0x7ab3: "Yu " +0x7ab4: "Tian " +0x7ab5: "Diao " +0x7ab6: "Ju " +0x7ab7: "Liao " +0x7ab8: "Xi " +0x7ab9: "Wu " +0x7aba: "Kui " +0x7abb: "Chuang " +0x7abc: "Zhao " +0x7abd: "[?] " +0x7abe: "Kuan " +0x7abf: "Long " +0x7ac0: "Cheng " +0x7ac1: "Cui " +0x7ac2: "Piao " +0x7ac3: "Zao " +0x7ac4: "Cuan " +0x7ac5: "Qiao " +0x7ac6: "Qiong " +0x7ac7: "Dou " +0x7ac8: "Zao " +0x7ac9: "Long " +0x7aca: "Qie " +0x7acb: "Li " +0x7acc: "Chu " +0x7acd: "Shi " +0x7ace: "Fou " +0x7acf: "Qian " +0x7ad0: "Chu " +0x7ad1: "Hong " +0x7ad2: "Qi " +0x7ad3: "Qian " +0x7ad4: "Gong " +0x7ad5: "Shi " +0x7ad6: "Shu " +0x7ad7: "Miao " +0x7ad8: "Ju " +0x7ad9: "Zhan " +0x7ada: "Zhu " +0x7adb: "Ling " +0x7adc: "Long " +0x7add: "Bing " +0x7ade: "Jing " +0x7adf: "Jing " +0x7ae0: "Zhang " +0x7ae1: "Yi " +0x7ae2: "Si " +0x7ae3: "Jun " +0x7ae4: "Hong " +0x7ae5: "Tong " +0x7ae6: "Song " +0x7ae7: "Jing " +0x7ae8: "Diao " +0x7ae9: "Yi " +0x7aea: "Shu " +0x7aeb: "Jing " +0x7aec: "Qu " +0x7aed: "Jie " +0x7aee: "Ping " +0x7aef: "Duan " +0x7af0: "Shao " +0x7af1: "Zhuan " +0x7af2: "Ceng " +0x7af3: "Deng " +0x7af4: "Cui " +0x7af5: "Huai " +0x7af6: "Jing " +0x7af7: "Kan " +0x7af8: "Jing " +0x7af9: "Zhu " +0x7afa: "Zhu " +0x7afb: "Le " +0x7afc: "Peng " +0x7afd: "Yu " +0x7afe: "Chi " +0x7aff: "Gan " +/* x07b */ +0x7b00: "Mang " +0x7b01: "Zhu " +0x7b02: "Utsubo " +0x7b03: "Du " +0x7b04: "Ji " +0x7b05: "Xiao " +0x7b06: "Ba " +0x7b07: "Suan " +0x7b08: "Ji " +0x7b09: "Zhen " +0x7b0a: "Zhao " +0x7b0b: "Sun " +0x7b0c: "Ya " +0x7b0d: "Zhui " +0x7b0e: "Yuan " +0x7b0f: "Hu " +0x7b10: "Gang " +0x7b11: "Xiao " +0x7b12: "Cen " +0x7b13: "Pi " +0x7b14: "Bi " +0x7b15: "Jian " +0x7b16: "Yi " +0x7b17: "Dong " +0x7b18: "Shan " +0x7b19: "Sheng " +0x7b1a: "Xia " +0x7b1b: "Di " +0x7b1c: "Zhu " +0x7b1d: "Na " +0x7b1e: "Chi " +0x7b1f: "Gu " +0x7b20: "Li " +0x7b21: "Qie " +0x7b22: "Min " +0x7b23: "Bao " +0x7b24: "Tiao " +0x7b25: "Si " +0x7b26: "Fu " +0x7b27: "Ce " +0x7b28: "Ben " +0x7b29: "Pei " +0x7b2a: "Da " +0x7b2b: "Zi " +0x7b2c: "Di " +0x7b2d: "Ling " +0x7b2e: "Ze " +0x7b2f: "Nu " +0x7b30: "Fu " +0x7b31: "Gou " +0x7b32: "Fan " +0x7b33: "Jia " +0x7b34: "Ge " +0x7b35: "Fan " +0x7b36: "Shi " +0x7b37: "Mao " +0x7b38: "Po " +0x7b39: "Sey " +0x7b3a: "Jian " +0x7b3b: "Qiong " +0x7b3c: "Long " +0x7b3d: "Souke " +0x7b3e: "Bian " +0x7b3f: "Luo " +0x7b40: "Gui " +0x7b41: "Qu " +0x7b42: "Chi " +0x7b43: "Yin " +0x7b44: "Yao " +0x7b45: "Xian " +0x7b46: "Bi " +0x7b47: "Qiong " +0x7b48: "Gua " +0x7b49: "Deng " +0x7b4a: "Jiao " +0x7b4b: "Jin " +0x7b4c: "Quan " +0x7b4d: "Sun " +0x7b4e: "Ru " +0x7b4f: "Fa " +0x7b50: "Kuang " +0x7b51: "Zhu " +0x7b52: "Tong " +0x7b53: "Ji " +0x7b54: "Da " +0x7b55: "Xing " +0x7b56: "Ce " +0x7b57: "Zhong " +0x7b58: "Kou " +0x7b59: "Lai " +0x7b5a: "Bi " +0x7b5b: "Shai " +0x7b5c: "Dang " +0x7b5d: "Zheng " +0x7b5e: "Ce " +0x7b5f: "Fu " +0x7b60: "Yun " +0x7b61: "Tu " +0x7b62: "Pa " +0x7b63: "Li " +0x7b64: "Lang " +0x7b65: "Ju " +0x7b66: "Guan " +0x7b67: "Jian " +0x7b68: "Han " +0x7b69: "Tong " +0x7b6a: "Xia " +0x7b6b: "Zhi " +0x7b6c: "Cheng " +0x7b6d: "Suan " +0x7b6e: "Shi " +0x7b6f: "Zhu " +0x7b70: "Zuo " +0x7b71: "Xiao " +0x7b72: "Shao " +0x7b73: "Ting " +0x7b74: "Ce " +0x7b75: "Yan " +0x7b76: "Gao " +0x7b77: "Kuai " +0x7b78: "Gan " +0x7b79: "Chou " +0x7b7a: "Kago " +0x7b7b: "Gang " +0x7b7c: "Yun " +0x7b7d: "O " +0x7b7e: "Qian " +0x7b7f: "Xiao " +0x7b80: "Jian " +0x7b81: "Pu " +0x7b82: "Lai " +0x7b83: "Zou " +0x7b84: "Bi " +0x7b85: "Bi " +0x7b86: "Bi " +0x7b87: "Ge " +0x7b88: "Chi " +0x7b89: "Guai " +0x7b8a: "Yu " +0x7b8b: "Jian " +0x7b8c: "Zhao " +0x7b8d: "Gu " +0x7b8e: "Chi " +0x7b8f: "Zheng " +0x7b90: "Jing " +0x7b91: "Sha " +0x7b92: "Zhou " +0x7b93: "Lu " +0x7b94: "Bo " +0x7b95: "Ji " +0x7b96: "Lin " +0x7b97: "Suan " +0x7b98: "Jun " +0x7b99: "Fu " +0x7b9a: "Zha " +0x7b9b: "Gu " +0x7b9c: "Kong " +0x7b9d: "Qian " +0x7b9e: "Quan " +0x7b9f: "Jun " +0x7ba0: "Chui " +0x7ba1: "Guan " +0x7ba2: "Yuan " +0x7ba3: "Ce " +0x7ba4: "Ju " +0x7ba5: "Bo " +0x7ba6: "Ze " +0x7ba7: "Qie " +0x7ba8: "Tuo " +0x7ba9: "Luo " +0x7baa: "Dan " +0x7bab: "Xiao " +0x7bac: "Ruo " +0x7bad: "Jian " +0x7bae: "Xuan " +0x7baf: "Bian " +0x7bb0: "Sun " +0x7bb1: "Xiang " +0x7bb2: "Xian " +0x7bb3: "Ping " +0x7bb4: "Zhen " +0x7bb5: "Sheng " +0x7bb6: "Hu " +0x7bb7: "Shi " +0x7bb8: "Zhu " +0x7bb9: "Yue " +0x7bba: "Chun " +0x7bbb: "Lu " +0x7bbc: "Wu " +0x7bbd: "Dong " +0x7bbe: "Xiao " +0x7bbf: "Ji " +0x7bc0: "Jie " +0x7bc1: "Huang " +0x7bc2: "Xing " +0x7bc3: "Mei " +0x7bc4: "Fan " +0x7bc5: "Chui " +0x7bc6: "Zhuan " +0x7bc7: "Pian " +0x7bc8: "Feng " +0x7bc9: "Zhu " +0x7bca: "Hong " +0x7bcb: "Qie " +0x7bcc: "Hou " +0x7bcd: "Qiu " +0x7bce: "Miao " +0x7bcf: "Qian " +0x7bd0: "[?] " +0x7bd1: "Kui " +0x7bd2: "Sik " +0x7bd3: "Lou " +0x7bd4: "Yun " +0x7bd5: "He " +0x7bd6: "Tang " +0x7bd7: "Yue " +0x7bd8: "Chou " +0x7bd9: "Gao " +0x7bda: "Fei " +0x7bdb: "Ruo " +0x7bdc: "Zheng " +0x7bdd: "Gou " +0x7bde: "Nie " +0x7bdf: "Qian " +0x7be0: "Xiao " +0x7be1: "Cuan " +0x7be2: "Gong " +0x7be3: "Pang " +0x7be4: "Du " +0x7be5: "Li " +0x7be6: "Bi " +0x7be7: "Zhuo " +0x7be8: "Chu " +0x7be9: "Shai " +0x7bea: "Chi " +0x7beb: "Zhu " +0x7bec: "Qiang " +0x7bed: "Long " +0x7bee: "Lan " +0x7bef: "Jian " +0x7bf0: "Bu " +0x7bf1: "Li " +0x7bf2: "Hui " +0x7bf3: "Bi " +0x7bf4: "Di " +0x7bf5: "Cong " +0x7bf6: "Yan " +0x7bf7: "Peng " +0x7bf8: "Sen " +0x7bf9: "Zhuan " +0x7bfa: "Pai " +0x7bfb: "Piao " +0x7bfc: "Dou " +0x7bfd: "Yu " +0x7bfe: "Mie " +0x7bff: "Zhuan " +/* x07c */ +0x7c00: "Ze " +0x7c01: "Xi " +0x7c02: "Guo " +0x7c03: "Yi " +0x7c04: "Hu " +0x7c05: "Chan " +0x7c06: "Kou " +0x7c07: "Cu " +0x7c08: "Ping " +0x7c09: "Chou " +0x7c0a: "Ji " +0x7c0b: "Gui " +0x7c0c: "Su " +0x7c0d: "Lou " +0x7c0e: "Zha " +0x7c0f: "Lu " +0x7c10: "Nian " +0x7c11: "Suo " +0x7c12: "Cuan " +0x7c13: "Sasara " +0x7c14: "Suo " +0x7c15: "Le " +0x7c16: "Duan " +0x7c17: "Yana " +0x7c18: "Xiao " +0x7c19: "Bo " +0x7c1a: "Mi " +0x7c1b: "Si " +0x7c1c: "Dang " +0x7c1d: "Liao " +0x7c1e: "Dan " +0x7c1f: "Dian " +0x7c20: "Fu " +0x7c21: "Jian " +0x7c22: "Min " +0x7c23: "Kui " +0x7c24: "Dai " +0x7c25: "Qiao " +0x7c26: "Deng " +0x7c27: "Huang " +0x7c28: "Sun " +0x7c29: "Lao " +0x7c2a: "Zan " +0x7c2b: "Xiao " +0x7c2c: "Du " +0x7c2d: "Shi " +0x7c2e: "Zan " +0x7c2f: "[?] " +0x7c30: "Pai " +0x7c31: "Hata " +0x7c32: "Pai " +0x7c33: "Gan " +0x7c34: "Ju " +0x7c35: "Du " +0x7c36: "Lu " +0x7c37: "Yan " +0x7c38: "Bo " +0x7c39: "Dang " +0x7c3a: "Sai " +0x7c3b: "Ke " +0x7c3c: "Long " +0x7c3d: "Qian " +0x7c3e: "Lian " +0x7c3f: "Bo " +0x7c40: "Zhou " +0x7c41: "Lai " +0x7c42: "[?] " +0x7c43: "Lan " +0x7c44: "Kui " +0x7c45: "Yu " +0x7c46: "Yue " +0x7c47: "Hao " +0x7c48: "Zhen " +0x7c49: "Tai " +0x7c4a: "Ti " +0x7c4b: "Mi " +0x7c4c: "Chou " +0x7c4d: "Ji " +0x7c4e: "[?] " +0x7c4f: "Hata " +0x7c50: "Teng " +0x7c51: "Zhuan " +0x7c52: "Zhou " +0x7c53: "Fan " +0x7c54: "Sou " +0x7c55: "Zhou " +0x7c56: "Kuji " +0x7c57: "Zhuo " +0x7c58: "Teng " +0x7c59: "Lu " +0x7c5a: "Lu " +0x7c5b: "Jian " +0x7c5c: "Tuo " +0x7c5d: "Ying " +0x7c5e: "Yu " +0x7c5f: "Lai " +0x7c60: "Long " +0x7c61: "Shinshi " +0x7c62: "Lian " +0x7c63: "Lan " +0x7c64: "Qian " +0x7c65: "Yue " +0x7c66: "Zhong " +0x7c67: "Qu " +0x7c68: "Lian " +0x7c69: "Bian " +0x7c6a: "Duan " +0x7c6b: "Zuan " +0x7c6c: "Li " +0x7c6d: "Si " +0x7c6e: "Luo " +0x7c6f: "Ying " +0x7c70: "Yue " +0x7c71: "Zhuo " +0x7c72: "Xu " +0x7c73: "Mi " +0x7c74: "Di " +0x7c75: "Fan " +0x7c76: "Shen " +0x7c77: "Zhe " +0x7c78: "Shen " +0x7c79: "Nu " +0x7c7a: "Xie " +0x7c7b: "Lei " +0x7c7c: "Xian " +0x7c7d: "Zi " +0x7c7e: "Ni " +0x7c7f: "Cun " +0x7c80: "[?] " +0x7c81: "Qian " +0x7c82: "Kume " +0x7c83: "Bi " +0x7c84: "Ban " +0x7c85: "Wu " +0x7c86: "Sha " +0x7c87: "Kang " +0x7c88: "Rou " +0x7c89: "Fen " +0x7c8a: "Bi " +0x7c8b: "Cui " +0x7c8c: "[?] " +0x7c8d: "Li " +0x7c8e: "Chi " +0x7c8f: "Nukamiso " +0x7c90: "Ro " +0x7c91: "Ba " +0x7c92: "Li " +0x7c93: "Gan " +0x7c94: "Ju " +0x7c95: "Po " +0x7c96: "Mo " +0x7c97: "Cu " +0x7c98: "Nian " +0x7c99: "Zhou " +0x7c9a: "Li " +0x7c9b: "Su " +0x7c9c: "Tiao " +0x7c9d: "Li " +0x7c9e: "Qi " +0x7c9f: "Su " +0x7ca0: "Hong " +0x7ca1: "Tong " +0x7ca2: "Zi " +0x7ca3: "Ce " +0x7ca4: "Yue " +0x7ca5: "Zhou " +0x7ca6: "Lin " +0x7ca7: "Zhuang " +0x7ca8: "Bai " +0x7ca9: "[?] " +0x7caa: "Fen " +0x7cab: "Ji " +0x7cac: "[?] " +0x7cad: "Sukumo " +0x7cae: "Liang " +0x7caf: "Xian " +0x7cb0: "Fu " +0x7cb1: "Liang " +0x7cb2: "Can " +0x7cb3: "Geng " +0x7cb4: "Li " +0x7cb5: "Yue " +0x7cb6: "Lu " +0x7cb7: "Ju " +0x7cb8: "Qi " +0x7cb9: "Cui " +0x7cba: "Bai " +0x7cbb: "Zhang " +0x7cbc: "Lin " +0x7cbd: "Zong " +0x7cbe: "Jing " +0x7cbf: "Guo " +0x7cc0: "Kouji " +0x7cc1: "San " +0x7cc2: "San " +0x7cc3: "Tang " +0x7cc4: "Bian " +0x7cc5: "Rou " +0x7cc6: "Mian " +0x7cc7: "Hou " +0x7cc8: "Xu " +0x7cc9: "Zong " +0x7cca: "Hu " +0x7ccb: "Jian " +0x7ccc: "Zan " +0x7ccd: "Ci " +0x7cce: "Li " +0x7ccf: "Xie " +0x7cd0: "Fu " +0x7cd1: "Ni " +0x7cd2: "Bei " +0x7cd3: "Gu " +0x7cd4: "Xiu " +0x7cd5: "Gao " +0x7cd6: "Tang " +0x7cd7: "Qiu " +0x7cd8: "Sukumo " +0x7cd9: "Cao " +0x7cda: "Zhuang " +0x7cdb: "Tang " +0x7cdc: "Mi " +0x7cdd: "San " +0x7cde: "Fen " +0x7cdf: "Zao " +0x7ce0: "Kang " +0x7ce1: "Jiang " +0x7ce2: "Mo " +0x7ce3: "San " +0x7ce4: "San " +0x7ce5: "Nuo " +0x7ce6: "Xi " +0x7ce7: "Liang " +0x7ce8: "Jiang " +0x7ce9: "Kuai " +0x7cea: "Bo " +0x7ceb: "Huan " +0x7cec: "[?] " +0x7ced: "Zong " +0x7cee: "Xian " +0x7cef: "Nuo " +0x7cf0: "Tuan " +0x7cf1: "Nie " +0x7cf2: "Li " +0x7cf3: "Zuo " +0x7cf4: "Di " +0x7cf5: "Nie " +0x7cf6: "Tiao " +0x7cf7: "Lan " +0x7cf8: "Mi " +0x7cf9: "Jiao " +0x7cfa: "Jiu " +0x7cfb: "Xi " +0x7cfc: "Gong " +0x7cfd: "Zheng " +0x7cfe: "Jiu " +0x7cff: "You " +/* x07d */ +0x7d00: "Ji " +0x7d01: "Cha " +0x7d02: "Zhou " +0x7d03: "Xun " +0x7d04: "Yue " +0x7d05: "Hong " +0x7d06: "Yu " +0x7d07: "He " +0x7d08: "Wan " +0x7d09: "Ren " +0x7d0a: "Wen " +0x7d0b: "Wen " +0x7d0c: "Qiu " +0x7d0d: "Na " +0x7d0e: "Zi " +0x7d0f: "Tou " +0x7d10: "Niu " +0x7d11: "Fou " +0x7d12: "Jie " +0x7d13: "Shu " +0x7d14: "Chun " +0x7d15: "Pi " +0x7d16: "Yin " +0x7d17: "Sha " +0x7d18: "Hong " +0x7d19: "Zhi " +0x7d1a: "Ji " +0x7d1b: "Fen " +0x7d1c: "Yun " +0x7d1d: "Ren " +0x7d1e: "Dan " +0x7d1f: "Jin " +0x7d20: "Su " +0x7d21: "Fang " +0x7d22: "Suo " +0x7d23: "Cui " +0x7d24: "Jiu " +0x7d25: "Zha " +0x7d26: "Kinu " +0x7d27: "Jin " +0x7d28: "Fu " +0x7d29: "Zhi " +0x7d2a: "Ci " +0x7d2b: "Zi " +0x7d2c: "Chou " +0x7d2d: "Hong " +0x7d2e: "Zha " +0x7d2f: "Lei " +0x7d30: "Xi " +0x7d31: "Fu " +0x7d32: "Xie " +0x7d33: "Shen " +0x7d34: "Bei " +0x7d35: "Zhu " +0x7d36: "Qu " +0x7d37: "Ling " +0x7d38: "Zhu " +0x7d39: "Shao " +0x7d3a: "Gan " +0x7d3b: "Yang " +0x7d3c: "Fu " +0x7d3d: "Tuo " +0x7d3e: "Zhen " +0x7d3f: "Dai " +0x7d40: "Zhuo " +0x7d41: "Shi " +0x7d42: "Zhong " +0x7d43: "Xian " +0x7d44: "Zu " +0x7d45: "Jiong " +0x7d46: "Ban " +0x7d47: "Ju " +0x7d48: "Mo " +0x7d49: "Shu " +0x7d4a: "Zui " +0x7d4b: "Wata " +0x7d4c: "Jing " +0x7d4d: "Ren " +0x7d4e: "Heng " +0x7d4f: "Xie " +0x7d50: "Jie " +0x7d51: "Zhu " +0x7d52: "Chou " +0x7d53: "Gua " +0x7d54: "Bai " +0x7d55: "Jue " +0x7d56: "Kuang " +0x7d57: "Hu " +0x7d58: "Ci " +0x7d59: "Geng " +0x7d5a: "Geng " +0x7d5b: "Tao " +0x7d5c: "Xie " +0x7d5d: "Ku " +0x7d5e: "Jiao " +0x7d5f: "Quan " +0x7d60: "Gai " +0x7d61: "Luo " +0x7d62: "Xuan " +0x7d63: "Bing " +0x7d64: "Xian " +0x7d65: "Fu " +0x7d66: "Gei " +0x7d67: "Tong " +0x7d68: "Rong " +0x7d69: "Tiao " +0x7d6a: "Yin " +0x7d6b: "Lei " +0x7d6c: "Xie " +0x7d6d: "Quan " +0x7d6e: "Xu " +0x7d6f: "Lun " +0x7d70: "Die " +0x7d71: "Tong " +0x7d72: "Si " +0x7d73: "Jiang " +0x7d74: "Xiang " +0x7d75: "Hui " +0x7d76: "Jue " +0x7d77: "Zhi " +0x7d78: "Jian " +0x7d79: "Juan " +0x7d7a: "Chi " +0x7d7b: "Mian " +0x7d7c: "Zhen " +0x7d7d: "Lu " +0x7d7e: "Cheng " +0x7d7f: "Qiu " +0x7d80: "Shu " +0x7d81: "Bang " +0x7d82: "Tong " +0x7d83: "Xiao " +0x7d84: "Wan " +0x7d85: "Qin " +0x7d86: "Geng " +0x7d87: "Xiu " +0x7d88: "Ti " +0x7d89: "Xiu " +0x7d8a: "Xie " +0x7d8b: "Hong " +0x7d8c: "Xi " +0x7d8d: "Fu " +0x7d8e: "Ting " +0x7d8f: "Sui " +0x7d90: "Dui " +0x7d91: "Kun " +0x7d92: "Fu " +0x7d93: "Jing " +0x7d94: "Hu " +0x7d95: "Zhi " +0x7d96: "Yan " +0x7d97: "Jiong " +0x7d98: "Feng " +0x7d99: "Ji " +0x7d9a: "Sok " +0x7d9b: "Kase " +0x7d9c: "Zong " +0x7d9d: "Lin " +0x7d9e: "Duo " +0x7d9f: "Li " +0x7da0: "Lu " +0x7da1: "Liang " +0x7da2: "Chou " +0x7da3: "Quan " +0x7da4: "Shao " +0x7da5: "Qi " +0x7da6: "Qi " +0x7da7: "Zhun " +0x7da8: "Qi " +0x7da9: "Wan " +0x7daa: "Qian " +0x7dab: "Xian " +0x7dac: "Shou " +0x7dad: "Wei " +0x7dae: "Qi " +0x7daf: "Tao " +0x7db0: "Wan " +0x7db1: "Gang " +0x7db2: "Wang " +0x7db3: "Beng " +0x7db4: "Zhui " +0x7db5: "Cai " +0x7db6: "Guo " +0x7db7: "Cui " +0x7db8: "Lun " +0x7db9: "Liu " +0x7dba: "Qi " +0x7dbb: "Zhan " +0x7dbc: "Bei " +0x7dbd: "Chuo " +0x7dbe: "Ling " +0x7dbf: "Mian " +0x7dc0: "Qi " +0x7dc1: "Qie " +0x7dc2: "Tan " +0x7dc3: "Zong " +0x7dc4: "Gun " +0x7dc5: "Zou " +0x7dc6: "Yi " +0x7dc7: "Zi " +0x7dc8: "Xing " +0x7dc9: "Liang " +0x7dca: "Jin " +0x7dcb: "Fei " +0x7dcc: "Rui " +0x7dcd: "Min " +0x7dce: "Yu " +0x7dcf: "Zong " +0x7dd0: "Fan " +0x7dd1: "Lu " +0x7dd2: "Xu " +0x7dd3: "Yingl " +0x7dd4: "Zhang " +0x7dd5: "Kasuri " +0x7dd6: "Xu " +0x7dd7: "Xiang " +0x7dd8: "Jian " +0x7dd9: "Ke " +0x7dda: "Xian " +0x7ddb: "Ruan " +0x7ddc: "Mian " +0x7ddd: "Qi " +0x7dde: "Duan " +0x7ddf: "Zhong " +0x7de0: "Di " +0x7de1: "Min " +0x7de2: "Miao " +0x7de3: "Yuan " +0x7de4: "Xie " +0x7de5: "Bao " +0x7de6: "Si " +0x7de7: "Qiu " +0x7de8: "Bian " +0x7de9: "Huan " +0x7dea: "Geng " +0x7deb: "Cong " +0x7dec: "Mian " +0x7ded: "Wei " +0x7dee: "Fu " +0x7def: "Wei " +0x7df0: "Yu " +0x7df1: "Gou " +0x7df2: "Miao " +0x7df3: "Xie " +0x7df4: "Lian " +0x7df5: "Zong " +0x7df6: "Bian " +0x7df7: "Yun " +0x7df8: "Yin " +0x7df9: "Ti " +0x7dfa: "Gua " +0x7dfb: "Zhi " +0x7dfc: "Yun " +0x7dfd: "Cheng " +0x7dfe: "Chan " +0x7dff: "Dai " +/* x07e */ +0x7e00: "Xia " +0x7e01: "Yuan " +0x7e02: "Zong " +0x7e03: "Xu " +0x7e04: "Nawa " +0x7e05: "Odoshi " +0x7e06: "Geng " +0x7e07: "Sen " +0x7e08: "Ying " +0x7e09: "Jin " +0x7e0a: "Yi " +0x7e0b: "Zhui " +0x7e0c: "Ni " +0x7e0d: "Bang " +0x7e0e: "Gu " +0x7e0f: "Pan " +0x7e10: "Zhou " +0x7e11: "Jian " +0x7e12: "Cuo " +0x7e13: "Quan " +0x7e14: "Shuang " +0x7e15: "Yun " +0x7e16: "Xia " +0x7e17: "Shuai " +0x7e18: "Xi " +0x7e19: "Rong " +0x7e1a: "Tao " +0x7e1b: "Fu " +0x7e1c: "Yun " +0x7e1d: "Zhen " +0x7e1e: "Gao " +0x7e1f: "Ru " +0x7e20: "Hu " +0x7e21: "Zai " +0x7e22: "Teng " +0x7e23: "Xian " +0x7e24: "Su " +0x7e25: "Zhen " +0x7e26: "Zong " +0x7e27: "Tao " +0x7e28: "Horo " +0x7e29: "Cai " +0x7e2a: "Bi " +0x7e2b: "Feng " +0x7e2c: "Cu " +0x7e2d: "Li " +0x7e2e: "Suo " +0x7e2f: "Yin " +0x7e30: "Xi " +0x7e31: "Zong " +0x7e32: "Lei " +0x7e33: "Zhuan " +0x7e34: "Qian " +0x7e35: "Man " +0x7e36: "Zhi " +0x7e37: "Lu " +0x7e38: "Mo " +0x7e39: "Piao " +0x7e3a: "Lian " +0x7e3b: "Mi " +0x7e3c: "Xuan " +0x7e3d: "Zong " +0x7e3e: "Ji " +0x7e3f: "Shan " +0x7e40: "Sui " +0x7e41: "Fan " +0x7e42: "Shuai " +0x7e43: "Beng " +0x7e44: "Yi " +0x7e45: "Sao " +0x7e46: "Mou " +0x7e47: "Zhou " +0x7e48: "Qiang " +0x7e49: "Hun " +0x7e4a: "Sem " +0x7e4b: "Xi " +0x7e4c: "Jung " +0x7e4d: "Xiu " +0x7e4e: "Ran " +0x7e4f: "Xuan " +0x7e50: "Hui " +0x7e51: "Qiao " +0x7e52: "Zeng " +0x7e53: "Zuo " +0x7e54: "Zhi " +0x7e55: "Shan " +0x7e56: "San " +0x7e57: "Lin " +0x7e58: "Yu " +0x7e59: "Fan " +0x7e5a: "Liao " +0x7e5b: "Chuo " +0x7e5c: "Zun " +0x7e5d: "Jian " +0x7e5e: "Rao " +0x7e5f: "Chan " +0x7e60: "Rui " +0x7e61: "Xiu " +0x7e62: "Hui " +0x7e63: "Hua " +0x7e64: "Zuan " +0x7e65: "Xi " +0x7e66: "Qiang " +0x7e67: "Un " +0x7e68: "Da " +0x7e69: "Sheng " +0x7e6a: "Hui " +0x7e6b: "Xi " +0x7e6c: "Se " +0x7e6d: "Jian " +0x7e6e: "Jiang " +0x7e6f: "Huan " +0x7e70: "Zao " +0x7e71: "Cong " +0x7e72: "Jie " +0x7e73: "Jiao " +0x7e74: "Bo " +0x7e75: "Chan " +0x7e76: "Yi " +0x7e77: "Nao " +0x7e78: "Sui " +0x7e79: "Yi " +0x7e7a: "Shai " +0x7e7b: "Xu " +0x7e7c: "Ji " +0x7e7d: "Bin " +0x7e7e: "Qian " +0x7e7f: "Lan " +0x7e80: "Pu " +0x7e81: "Xun " +0x7e82: "Zuan " +0x7e83: "Qi " +0x7e84: "Peng " +0x7e85: "Li " +0x7e86: "Mo " +0x7e87: "Lei " +0x7e88: "Xie " +0x7e89: "Zuan " +0x7e8a: "Kuang " +0x7e8b: "You " +0x7e8c: "Xu " +0x7e8d: "Lei " +0x7e8e: "Xian " +0x7e8f: "Chan " +0x7e90: "Kou " +0x7e91: "Lu " +0x7e92: "Chan " +0x7e93: "Ying " +0x7e94: "Cai " +0x7e95: "Xiang " +0x7e96: "Xian " +0x7e97: "Zui " +0x7e98: "Zuan " +0x7e99: "Luo " +0x7e9a: "Xi " +0x7e9b: "Dao " +0x7e9c: "Lan " +0x7e9d: "Lei " +0x7e9e: "Lian " +0x7e9f: "Si " +0x7ea0: "Jiu " +0x7ea1: "Yu " +0x7ea2: "Hong " +0x7ea3: "Zhou " +0x7ea4: "Xian " +0x7ea5: "He " +0x7ea6: "Yue " +0x7ea7: "Ji " +0x7ea8: "Wan " +0x7ea9: "Kuang " +0x7eaa: "Ji " +0x7eab: "Ren " +0x7eac: "Wei " +0x7ead: "Yun " +0x7eae: "Hong " +0x7eaf: "Chun " +0x7eb0: "Pi " +0x7eb1: "Sha " +0x7eb2: "Gang " +0x7eb3: "Na " +0x7eb4: "Ren " +0x7eb5: "Zong " +0x7eb6: "Lun " +0x7eb7: "Fen " +0x7eb8: "Zhi " +0x7eb9: "Wen " +0x7eba: "Fang " +0x7ebb: "Zhu " +0x7ebc: "Yin " +0x7ebd: "Niu " +0x7ebe: "Shu " +0x7ebf: "Xian " +0x7ec0: "Gan " +0x7ec1: "Xie " +0x7ec2: "Fu " +0x7ec3: "Lian " +0x7ec4: "Zu " +0x7ec5: "Shen " +0x7ec6: "Xi " +0x7ec7: "Zhi " +0x7ec8: "Zhong " +0x7ec9: "Zhou " +0x7eca: "Ban " +0x7ecb: "Fu " +0x7ecc: "Zhuo " +0x7ecd: "Shao " +0x7ece: "Yi " +0x7ecf: "Jing " +0x7ed0: "Dai " +0x7ed1: "Bang " +0x7ed2: "Rong " +0x7ed3: "Jie " +0x7ed4: "Ku " +0x7ed5: "Rao " +0x7ed6: "Die " +0x7ed7: "Heng " +0x7ed8: "Hui " +0x7ed9: "Gei " +0x7eda: "Xuan " +0x7edb: "Jiang " +0x7edc: "Luo " +0x7edd: "Jue " +0x7ede: "Jiao " +0x7edf: "Tong " +0x7ee0: "Geng " +0x7ee1: "Xiao " +0x7ee2: "Juan " +0x7ee3: "Xiu " +0x7ee4: "Xi " +0x7ee5: "Sui " +0x7ee6: "Tao " +0x7ee7: "Ji " +0x7ee8: "Ti " +0x7ee9: "Ji " +0x7eea: "Xu " +0x7eeb: "Ling " +0x7eec: "[?] " +0x7eed: "Xu " +0x7eee: "Qi " +0x7eef: "Fei " +0x7ef0: "Chuo " +0x7ef1: "Zhang " +0x7ef2: "Gun " +0x7ef3: "Sheng " +0x7ef4: "Wei " +0x7ef5: "Mian " +0x7ef6: "Shou " +0x7ef7: "Beng " +0x7ef8: "Chou " +0x7ef9: "Tao " +0x7efa: "Liu " +0x7efb: "Quan " +0x7efc: "Zong " +0x7efd: "Zhan " +0x7efe: "Wan " +0x7eff: "Lu " +/* x07f */ +0x7f00: "Zhui " +0x7f01: "Zi " +0x7f02: "Ke " +0x7f03: "Xiang " +0x7f04: "Jian " +0x7f05: "Mian " +0x7f06: "Lan " +0x7f07: "Ti " +0x7f08: "Miao " +0x7f09: "Qi " +0x7f0a: "Yun " +0x7f0b: "Hui " +0x7f0c: "Si " +0x7f0d: "Duo " +0x7f0e: "Duan " +0x7f0f: "Bian " +0x7f10: "Xian " +0x7f11: "Gou " +0x7f12: "Zhui " +0x7f13: "Huan " +0x7f14: "Di " +0x7f15: "Lu " +0x7f16: "Bian " +0x7f17: "Min " +0x7f18: "Yuan " +0x7f19: "Jin " +0x7f1a: "Fu " +0x7f1b: "Ru " +0x7f1c: "Zhen " +0x7f1d: "Feng " +0x7f1e: "Shuai " +0x7f1f: "Gao " +0x7f20: "Chan " +0x7f21: "Li " +0x7f22: "Yi " +0x7f23: "Jian " +0x7f24: "Bin " +0x7f25: "Piao " +0x7f26: "Man " +0x7f27: "Lei " +0x7f28: "Ying " +0x7f29: "Suo " +0x7f2a: "Mou " +0x7f2b: "Sao " +0x7f2c: "Xie " +0x7f2d: "Liao " +0x7f2e: "Shan " +0x7f2f: "Zeng " +0x7f30: "Jiang " +0x7f31: "Qian " +0x7f32: "Zao " +0x7f33: "Huan " +0x7f34: "Jiao " +0x7f35: "Zuan " +0x7f36: "Fou " +0x7f37: "Xie " +0x7f38: "Gang " +0x7f39: "Fou " +0x7f3a: "Que " +0x7f3b: "Fou " +0x7f3c: "Kaakeru " +0x7f3d: "Bo " +0x7f3e: "Ping " +0x7f3f: "Hou " +0x7f40: "[?] " +0x7f41: "Gang " +0x7f42: "Ying " +0x7f43: "Ying " +0x7f44: "Qing " +0x7f45: "Xia " +0x7f46: "Guan " +0x7f47: "Zun " +0x7f48: "Tan " +0x7f49: "Chang " +0x7f4a: "Qi " +0x7f4b: "Weng " +0x7f4c: "Ying " +0x7f4d: "Lei " +0x7f4e: "Tan " +0x7f4f: "Lu " +0x7f50: "Guan " +0x7f51: "Wang " +0x7f52: "Wang " +0x7f53: "Gang " +0x7f54: "Wang " +0x7f55: "Han " +0x7f56: "[?] " +0x7f57: "Luo " +0x7f58: "Fu " +0x7f59: "Mi " +0x7f5a: "Fa " +0x7f5b: "Gu " +0x7f5c: "Zhu " +0x7f5d: "Ju " +0x7f5e: "Mao " +0x7f5f: "Gu " +0x7f60: "Min " +0x7f61: "Gang " +0x7f62: "Ba " +0x7f63: "Gua " +0x7f64: "Ti " +0x7f65: "Juan " +0x7f66: "Fu " +0x7f67: "Lin " +0x7f68: "Yan " +0x7f69: "Zhao " +0x7f6a: "Zui " +0x7f6b: "Gua " +0x7f6c: "Zhuo " +0x7f6d: "Yu " +0x7f6e: "Zhi " +0x7f6f: "An " +0x7f70: "Fa " +0x7f71: "Nan " +0x7f72: "Shu " +0x7f73: "Si " +0x7f74: "Pi " +0x7f75: "Ma " +0x7f76: "Liu " +0x7f77: "Ba " +0x7f78: "Fa " +0x7f79: "Li " +0x7f7a: "Chao " +0x7f7b: "Wei " +0x7f7c: "Bi " +0x7f7d: "Ji " +0x7f7e: "Zeng " +0x7f7f: "Tong " +0x7f80: "Liu " +0x7f81: "Ji " +0x7f82: "Juan " +0x7f83: "Mi " +0x7f84: "Zhao " +0x7f85: "Luo " +0x7f86: "Pi " +0x7f87: "Ji " +0x7f88: "Ji " +0x7f89: "Luan " +0x7f8a: "Yang " +0x7f8b: "Mie " +0x7f8c: "Qiang " +0x7f8d: "Ta " +0x7f8e: "Mei " +0x7f8f: "Yang " +0x7f90: "You " +0x7f91: "You " +0x7f92: "Fen " +0x7f93: "Ba " +0x7f94: "Gao " +0x7f95: "Yang " +0x7f96: "Gu " +0x7f97: "Qiang " +0x7f98: "Zang " +0x7f99: "Gao " +0x7f9a: "Ling " +0x7f9b: "Yi " +0x7f9c: "Zhu " +0x7f9d: "Di " +0x7f9e: "Xiu " +0x7f9f: "Qian " +0x7fa0: "Yi " +0x7fa1: "Xian " +0x7fa2: "Rong " +0x7fa3: "Qun " +0x7fa4: "Qun " +0x7fa5: "Qian " +0x7fa6: "Huan " +0x7fa7: "Zui " +0x7fa8: "Xian " +0x7fa9: "Yi " +0x7faa: "Yashinau " +0x7fab: "Qiang " +0x7fac: "Xian " +0x7fad: "Yu " +0x7fae: "Geng " +0x7faf: "Jie " +0x7fb0: "Tang " +0x7fb1: "Yuan " +0x7fb2: "Xi " +0x7fb3: "Fan " +0x7fb4: "Shan " +0x7fb5: "Fen " +0x7fb6: "Shan " +0x7fb7: "Lian " +0x7fb8: "Lei " +0x7fb9: "Geng " +0x7fba: "Nou " +0x7fbb: "Qiang " +0x7fbc: "Chan " +0x7fbd: "Yu " +0x7fbe: "Gong " +0x7fbf: "Yi " +0x7fc0: "Chong " +0x7fc1: "Weng " +0x7fc2: "Fen " +0x7fc3: "Hong " +0x7fc4: "Chi " +0x7fc5: "Chi " +0x7fc6: "Cui " +0x7fc7: "Fu " +0x7fc8: "Xia " +0x7fc9: "Pen " +0x7fca: "Yi " +0x7fcb: "La " +0x7fcc: "Yi " +0x7fcd: "Pi " +0x7fce: "Ling " +0x7fcf: "Liu " +0x7fd0: "Zhi " +0x7fd1: "Qu " +0x7fd2: "Xi " +0x7fd3: "Xie " +0x7fd4: "Xiang " +0x7fd5: "Xi " +0x7fd6: "Xi " +0x7fd7: "Qi " +0x7fd8: "Qiao " +0x7fd9: "Hui " +0x7fda: "Hui " +0x7fdb: "Xiao " +0x7fdc: "Se " +0x7fdd: "Hong " +0x7fde: "Jiang " +0x7fdf: "Di " +0x7fe0: "Cui " +0x7fe1: "Fei " +0x7fe2: "Tao " +0x7fe3: "Sha " +0x7fe4: "Chi " +0x7fe5: "Zhu " +0x7fe6: "Jian " +0x7fe7: "Xuan " +0x7fe8: "Shi " +0x7fe9: "Pian " +0x7fea: "Zong " +0x7feb: "Wan " +0x7fec: "Hui " +0x7fed: "Hou " +0x7fee: "He " +0x7fef: "He " +0x7ff0: "Han " +0x7ff1: "Ao " +0x7ff2: "Piao " +0x7ff3: "Yi " +0x7ff4: "Lian " +0x7ff5: "Qu " +0x7ff6: "[?] " +0x7ff7: "Lin " +0x7ff8: "Pen " +0x7ff9: "Qiao " +0x7ffa: "Ao " +0x7ffb: "Fan " +0x7ffc: "Yi " +0x7ffd: "Hui " +0x7ffe: "Xuan " +0x7fff: "Dao " +/* x080 */ +0x8000: "Yao " +0x8001: "Lao " +0x8002: "[?] " +0x8003: "Kao " +0x8004: "Mao " +0x8005: "Zhe " +0x8006: "Qi " +0x8007: "Gou " +0x8008: "Gou " +0x8009: "Gou " +0x800a: "Die " +0x800b: "Die " +0x800c: "Er " +0x800d: "Shua " +0x800e: "Ruan " +0x800f: "Er " +0x8010: "Nai " +0x8011: "Zhuan " +0x8012: "Lei " +0x8013: "Ting " +0x8014: "Zi " +0x8015: "Geng " +0x8016: "Chao " +0x8017: "Hao " +0x8018: "Yun " +0x8019: "Pa " +0x801a: "Pi " +0x801b: "Chi " +0x801c: "Si " +0x801d: "Chu " +0x801e: "Jia " +0x801f: "Ju " +0x8020: "He " +0x8021: "Chu " +0x8022: "Lao " +0x8023: "Lun " +0x8024: "Ji " +0x8025: "Tang " +0x8026: "Ou " +0x8027: "Lou " +0x8028: "Nou " +0x8029: "Gou " +0x802a: "Pang " +0x802b: "Ze " +0x802c: "Lou " +0x802d: "Ji " +0x802e: "Lao " +0x802f: "Huo " +0x8030: "You " +0x8031: "Mo " +0x8032: "Huai " +0x8033: "Er " +0x8034: "Zhe " +0x8035: "Ting " +0x8036: "Ye " +0x8037: "Da " +0x8038: "Song " +0x8039: "Qin " +0x803a: "Yun " +0x803b: "Chi " +0x803c: "Dan " +0x803d: "Dan " +0x803e: "Hong " +0x803f: "Geng " +0x8040: "Zhi " +0x8041: "[?] " +0x8042: "Nie " +0x8043: "Dan " +0x8044: "Zhen " +0x8045: "Che " +0x8046: "Ling " +0x8047: "Zheng " +0x8048: "You " +0x8049: "Wa " +0x804a: "Liao " +0x804b: "Long " +0x804c: "Zhi " +0x804d: "Ning " +0x804e: "Tiao " +0x804f: "Er " +0x8050: "Ya " +0x8051: "Die " +0x8052: "Gua " +0x8053: "[?] " +0x8054: "Lian " +0x8055: "Hao " +0x8056: "Sheng " +0x8057: "Lie " +0x8058: "Pin " +0x8059: "Jing " +0x805a: "Ju " +0x805b: "Bi " +0x805c: "Di " +0x805d: "Guo " +0x805e: "Wen " +0x805f: "Xu " +0x8060: "Ping " +0x8061: "Cong " +0x8062: "Shikato " +0x8063: "[?] " +0x8064: "Ting " +0x8065: "Yu " +0x8066: "Cong " +0x8067: "Kui " +0x8068: "Tsuraneru " +0x8069: "Kui " +0x806a: "Cong " +0x806b: "Lian " +0x806c: "Weng " +0x806d: "Kui " +0x806e: "Lian " +0x806f: "Lian " +0x8070: "Cong " +0x8071: "Ao " +0x8072: "Sheng " +0x8073: "Song " +0x8074: "Ting " +0x8075: "Kui " +0x8076: "Nie " +0x8077: "Zhi " +0x8078: "Dan " +0x8079: "Ning " +0x807a: "Qie " +0x807b: "Ji " +0x807c: "Ting " +0x807d: "Ting " +0x807e: "Long " +0x807f: "Yu " +0x8080: "Yu " +0x8081: "Zhao " +0x8082: "Si " +0x8083: "Su " +0x8084: "Yi " +0x8085: "Su " +0x8086: "Si " +0x8087: "Zhao " +0x8088: "Zhao " +0x8089: "Rou " +0x808a: "Yi " +0x808b: "Le " +0x808c: "Ji " +0x808d: "Qiu " +0x808e: "Ken " +0x808f: "Cao " +0x8090: "Ge " +0x8091: "Di " +0x8092: "Huan " +0x8093: "Huang " +0x8094: "Yi " +0x8095: "Ren " +0x8096: "Xiao " +0x8097: "Ru " +0x8098: "Zhou " +0x8099: "Yuan " +0x809a: "Du " +0x809b: "Gang " +0x809c: "Rong " +0x809d: "Gan " +0x809e: "Cha " +0x809f: "Wo " +0x80a0: "Chang " +0x80a1: "Gu " +0x80a2: "Zhi " +0x80a3: "Han " +0x80a4: "Fu " +0x80a5: "Fei " +0x80a6: "Fen " +0x80a7: "Pei " +0x80a8: "Pang " +0x80a9: "Jian " +0x80aa: "Fang " +0x80ab: "Zhun " +0x80ac: "You " +0x80ad: "Na " +0x80ae: "Hang " +0x80af: "Ken " +0x80b0: "Ran " +0x80b1: "Gong " +0x80b2: "Yu " +0x80b3: "Wen " +0x80b4: "Yao " +0x80b5: "Jin " +0x80b6: "Pi " +0x80b7: "Qian " +0x80b8: "Xi " +0x80b9: "Xi " +0x80ba: "Fei " +0x80bb: "Ken " +0x80bc: "Jing " +0x80bd: "Tai " +0x80be: "Shen " +0x80bf: "Zhong " +0x80c0: "Zhang " +0x80c1: "Xie " +0x80c2: "Shen " +0x80c3: "Wei " +0x80c4: "Zhou " +0x80c5: "Die " +0x80c6: "Dan " +0x80c7: "Fei " +0x80c8: "Ba " +0x80c9: "Bo " +0x80ca: "Qu " +0x80cb: "Tian " +0x80cc: "Bei " +0x80cd: "Gua " +0x80ce: "Tai " +0x80cf: "Zi " +0x80d0: "Ku " +0x80d1: "Zhi " +0x80d2: "Ni " +0x80d3: "Ping " +0x80d4: "Zi " +0x80d5: "Fu " +0x80d6: "Pang " +0x80d7: "Zhen " +0x80d8: "Xian " +0x80d9: "Zuo " +0x80da: "Pei " +0x80db: "Jia " +0x80dc: "Sheng " +0x80dd: "Zhi " +0x80de: "Bao " +0x80df: "Mu " +0x80e0: "Qu " +0x80e1: "Hu " +0x80e2: "Ke " +0x80e3: "Yi " +0x80e4: "Yin " +0x80e5: "Xu " +0x80e6: "Yang " +0x80e7: "Long " +0x80e8: "Dong " +0x80e9: "Ka " +0x80ea: "Lu " +0x80eb: "Jing " +0x80ec: "Nu " +0x80ed: "Yan " +0x80ee: "Pang " +0x80ef: "Kua " +0x80f0: "Yi " +0x80f1: "Guang " +0x80f2: "Gai " +0x80f3: "Ge " +0x80f4: "Dong " +0x80f5: "Zhi " +0x80f6: "Xiao " +0x80f7: "Xiong " +0x80f8: "Xiong " +0x80f9: "Er " +0x80fa: "E " +0x80fb: "Xing " +0x80fc: "Pian " +0x80fd: "Neng " +0x80fe: "Zi " +0x80ff: "Gui " +/* x081 */ +0x8100: "Cheng " +0x8101: "Tiao " +0x8102: "Zhi " +0x8103: "Cui " +0x8104: "Mei " +0x8105: "Xie " +0x8106: "Cui " +0x8107: "Xie " +0x8108: "Mo " +0x8109: "Mai " +0x810a: "Ji " +0x810b: "Obiyaakasu " +0x810c: "[?] " +0x810d: "Kuai " +0x810e: "Sa " +0x810f: "Zang " +0x8110: "Qi " +0x8111: "Nao " +0x8112: "Mi " +0x8113: "Nong " +0x8114: "Luan " +0x8115: "Wan " +0x8116: "Bo " +0x8117: "Wen " +0x8118: "Guan " +0x8119: "Qiu " +0x811a: "Jiao " +0x811b: "Jing " +0x811c: "Rou " +0x811d: "Heng " +0x811e: "Cuo " +0x811f: "Lie " +0x8120: "Shan " +0x8121: "Ting " +0x8122: "Mei " +0x8123: "Chun " +0x8124: "Shen " +0x8125: "Xie " +0x8126: "De " +0x8127: "Zui " +0x8128: "Cu " +0x8129: "Xiu " +0x812a: "Xin " +0x812b: "Tuo " +0x812c: "Pao " +0x812d: "Cheng " +0x812e: "Nei " +0x812f: "Fu " +0x8130: "Dou " +0x8131: "Tuo " +0x8132: "Niao " +0x8133: "Noy " +0x8134: "Pi " +0x8135: "Gu " +0x8136: "Gua " +0x8137: "Li " +0x8138: "Lian " +0x8139: "Zhang " +0x813a: "Cui " +0x813b: "Jie " +0x813c: "Liang " +0x813d: "Zhou " +0x813e: "Pi " +0x813f: "Biao " +0x8140: "Lun " +0x8141: "Pian " +0x8142: "Guo " +0x8143: "Kui " +0x8144: "Chui " +0x8145: "Dan " +0x8146: "Tian " +0x8147: "Nei " +0x8148: "Jing " +0x8149: "Jie " +0x814a: "La " +0x814b: "Yi " +0x814c: "An " +0x814d: "Ren " +0x814e: "Shen " +0x814f: "Chuo " +0x8150: "Fu " +0x8151: "Fu " +0x8152: "Ju " +0x8153: "Fei " +0x8154: "Qiang " +0x8155: "Wan " +0x8156: "Dong " +0x8157: "Pi " +0x8158: "Guo " +0x8159: "Zong " +0x815a: "Ding " +0x815b: "Wu " +0x815c: "Mei " +0x815d: "Ruan " +0x815e: "Zhuan " +0x815f: "Zhi " +0x8160: "Cou " +0x8161: "Gua " +0x8162: "Ou " +0x8163: "Di " +0x8164: "An " +0x8165: "Xing " +0x8166: "Nao " +0x8167: "Yu " +0x8168: "Chuan " +0x8169: "Nan " +0x816a: "Yun " +0x816b: "Zhong " +0x816c: "Rou " +0x816d: "E " +0x816e: "Sai " +0x816f: "Tu " +0x8170: "Yao " +0x8171: "Jian " +0x8172: "Wei " +0x8173: "Jiao " +0x8174: "Yu " +0x8175: "Jia " +0x8176: "Duan " +0x8177: "Bi " +0x8178: "Chang " +0x8179: "Fu " +0x817a: "Xian " +0x817b: "Ni " +0x817c: "Mian " +0x817d: "Wa " +0x817e: "Teng " +0x817f: "Tui " +0x8180: "Bang " +0x8181: "Qian " +0x8182: "Lu " +0x8183: "Wa " +0x8184: "Sou " +0x8185: "Tang " +0x8186: "Su " +0x8187: "Zhui " +0x8188: "Ge " +0x8189: "Yi " +0x818a: "Bo " +0x818b: "Liao " +0x818c: "Ji " +0x818d: "Pi " +0x818e: "Xie " +0x818f: "Gao " +0x8190: "Lu " +0x8191: "Bin " +0x8192: "Ou " +0x8193: "Chang " +0x8194: "Lu " +0x8195: "Guo " +0x8196: "Pang " +0x8197: "Chuai " +0x8198: "Piao " +0x8199: "Jiang " +0x819a: "Fu " +0x819b: "Tang " +0x819c: "Mo " +0x819d: "Xi " +0x819e: "Zhuan " +0x819f: "Lu " +0x81a0: "Jiao " +0x81a1: "Ying " +0x81a2: "Lu " +0x81a3: "Zhi " +0x81a4: "Tara " +0x81a5: "Chun " +0x81a6: "Lian " +0x81a7: "Tong " +0x81a8: "Peng " +0x81a9: "Ni " +0x81aa: "Zha " +0x81ab: "Liao " +0x81ac: "Cui " +0x81ad: "Gui " +0x81ae: "Xiao " +0x81af: "Teng " +0x81b0: "Fan " +0x81b1: "Zhi " +0x81b2: "Jiao " +0x81b3: "Shan " +0x81b4: "Wu " +0x81b5: "Cui " +0x81b6: "Run " +0x81b7: "Xiang " +0x81b8: "Sui " +0x81b9: "Fen " +0x81ba: "Ying " +0x81bb: "Tan " +0x81bc: "Zhua " +0x81bd: "Dan " +0x81be: "Kuai " +0x81bf: "Nong " +0x81c0: "Tun " +0x81c1: "Lian " +0x81c2: "Bi " +0x81c3: "Yong " +0x81c4: "Jue " +0x81c5: "Chu " +0x81c6: "Yi " +0x81c7: "Juan " +0x81c8: "La " +0x81c9: "Lian " +0x81ca: "Sao " +0x81cb: "Tun " +0x81cc: "Gu " +0x81cd: "Qi " +0x81ce: "Cui " +0x81cf: "Bin " +0x81d0: "Xun " +0x81d1: "Ru " +0x81d2: "Huo " +0x81d3: "Zang " +0x81d4: "Xian " +0x81d5: "Biao " +0x81d6: "Xing " +0x81d7: "Kuan " +0x81d8: "La " +0x81d9: "Yan " +0x81da: "Lu " +0x81db: "Huo " +0x81dc: "Zang " +0x81dd: "Luo " +0x81de: "Qu " +0x81df: "Zang " +0x81e0: "Luan " +0x81e1: "Ni " +0x81e2: "Zang " +0x81e3: "Chen " +0x81e4: "Qian " +0x81e5: "Wo " +0x81e6: "Guang " +0x81e7: "Zang " +0x81e8: "Lin " +0x81e9: "Guang " +0x81ea: "Zi " +0x81eb: "Jiao " +0x81ec: "Nie " +0x81ed: "Chou " +0x81ee: "Ji " +0x81ef: "Gao " +0x81f0: "Chou " +0x81f1: "Mian " +0x81f2: "Nie " +0x81f3: "Zhi " +0x81f4: "Zhi " +0x81f5: "Ge " +0x81f6: "Jian " +0x81f7: "Die " +0x81f8: "Zhi " +0x81f9: "Xiu " +0x81fa: "Tai " +0x81fb: "Zhen " +0x81fc: "Jiu " +0x81fd: "Xian " +0x81fe: "Yu " +0x81ff: "Cha " +/* x082 */ +0x8200: "Yao " +0x8201: "Yu " +0x8202: "Chong " +0x8203: "Xi " +0x8204: "Xi " +0x8205: "Jiu " +0x8206: "Yu " +0x8207: "Yu " +0x8208: "Xing " +0x8209: "Ju " +0x820a: "Jiu " +0x820b: "Xin " +0x820c: "She " +0x820d: "She " +0x820e: "Yadoru " +0x820f: "Jiu " +0x8210: "Shi " +0x8211: "Tan " +0x8212: "Shu " +0x8213: "Shi " +0x8214: "Tian " +0x8215: "Dan " +0x8216: "Pu " +0x8217: "Pu " +0x8218: "Guan " +0x8219: "Hua " +0x821a: "Tan " +0x821b: "Chuan " +0x821c: "Shun " +0x821d: "Xia " +0x821e: "Wu " +0x821f: "Zhou " +0x8220: "Dao " +0x8221: "Gang " +0x8222: "Shan " +0x8223: "Yi " +0x8224: "[?] " +0x8225: "Pa " +0x8226: "Tai " +0x8227: "Fan " +0x8228: "Ban " +0x8229: "Chuan " +0x822a: "Hang " +0x822b: "Fang " +0x822c: "Ban " +0x822d: "Que " +0x822e: "Hesaki " +0x822f: "Zhong " +0x8230: "Jian " +0x8231: "Cang " +0x8232: "Ling " +0x8233: "Zhu " +0x8234: "Ze " +0x8235: "Duo " +0x8236: "Bo " +0x8237: "Xian " +0x8238: "Ge " +0x8239: "Chuan " +0x823a: "Jia " +0x823b: "Lu " +0x823c: "Hong " +0x823d: "Pang " +0x823e: "Xi " +0x823f: "[?] " +0x8240: "Fu " +0x8241: "Zao " +0x8242: "Feng " +0x8243: "Li " +0x8244: "Shao " +0x8245: "Yu " +0x8246: "Lang " +0x8247: "Ting " +0x8248: "[?] " +0x8249: "Wei " +0x824a: "Bo " +0x824b: "Meng " +0x824c: "Nian " +0x824d: "Ju " +0x824e: "Huang " +0x824f: "Shou " +0x8250: "Zong " +0x8251: "Bian " +0x8252: "Mao " +0x8253: "Die " +0x8254: "[?] " +0x8255: "Bang " +0x8256: "Cha " +0x8257: "Yi " +0x8258: "Sao " +0x8259: "Cang " +0x825a: "Cao " +0x825b: "Lou " +0x825c: "Dai " +0x825d: "Sori " +0x825e: "Yao " +0x825f: "Tong " +0x8260: "Yofune " +0x8261: "Dang " +0x8262: "Tan " +0x8263: "Lu " +0x8264: "Yi " +0x8265: "Jie " +0x8266: "Jian " +0x8267: "Huo " +0x8268: "Meng " +0x8269: "Qi " +0x826a: "Lu " +0x826b: "Lu " +0x826c: "Chan " +0x826d: "Shuang " +0x826e: "Gen " +0x826f: "Liang " +0x8270: "Jian " +0x8271: "Jian " +0x8272: "Se " +0x8273: "Yan " +0x8274: "Fu " +0x8275: "Ping " +0x8276: "Yan " +0x8277: "Yan " +0x8278: "Cao " +0x8279: "Cao " +0x827a: "Yi " +0x827b: "Le " +0x827c: "Ting " +0x827d: "Qiu " +0x827e: "Ai " +0x827f: "Nai " +0x8280: "Tiao " +0x8281: "Jiao " +0x8282: "Jie " +0x8283: "Peng " +0x8284: "Wan " +0x8285: "Yi " +0x8286: "Chai " +0x8287: "Mian " +0x8288: "Mie " +0x8289: "Gan " +0x828a: "Qian " +0x828b: "Yu " +0x828c: "Yu " +0x828d: "Shuo " +0x828e: "Qiong " +0x828f: "Tu " +0x8290: "Xia " +0x8291: "Qi " +0x8292: "Mang " +0x8293: "Zi " +0x8294: "Hui " +0x8295: "Sui " +0x8296: "Zhi " +0x8297: "Xiang " +0x8298: "Bi " +0x8299: "Fu " +0x829a: "Tun " +0x829b: "Wei " +0x829c: "Wu " +0x829d: "Zhi " +0x829e: "Qi " +0x829f: "Shan " +0x82a0: "Wen " +0x82a1: "Qian " +0x82a2: "Ren " +0x82a3: "Fou " +0x82a4: "Kou " +0x82a5: "Jie " +0x82a6: "Lu " +0x82a7: "Xu " +0x82a8: "Ji " +0x82a9: "Qin " +0x82aa: "Qi " +0x82ab: "Yuan " +0x82ac: "Fen " +0x82ad: "Ba " +0x82ae: "Rui " +0x82af: "Xin " +0x82b0: "Ji " +0x82b1: "Hua " +0x82b2: "Hua " +0x82b3: "Fang " +0x82b4: "Wu " +0x82b5: "Jue " +0x82b6: "Gou " +0x82b7: "Zhi " +0x82b8: "Yun " +0x82b9: "Qin " +0x82ba: "Ao " +0x82bb: "Chu " +0x82bc: "Mao " +0x82bd: "Ya " +0x82be: "Fei " +0x82bf: "Reng " +0x82c0: "Hang " +0x82c1: "Cong " +0x82c2: "Yin " +0x82c3: "You " +0x82c4: "Bian " +0x82c5: "Yi " +0x82c6: "Susa " +0x82c7: "Wei " +0x82c8: "Li " +0x82c9: "Pi " +0x82ca: "E " +0x82cb: "Xian " +0x82cc: "Chang " +0x82cd: "Cang " +0x82ce: "Meng " +0x82cf: "Su " +0x82d0: "Yi " +0x82d1: "Yuan " +0x82d2: "Ran " +0x82d3: "Ling " +0x82d4: "Tai " +0x82d5: "Tiao " +0x82d6: "Di " +0x82d7: "Miao " +0x82d8: "Qiong " +0x82d9: "Li " +0x82da: "Yong " +0x82db: "Ke " +0x82dc: "Mu " +0x82dd: "Pei " +0x82de: "Bao " +0x82df: "Gou " +0x82e0: "Min " +0x82e1: "Yi " +0x82e2: "Yi " +0x82e3: "Ju " +0x82e4: "Pi " +0x82e5: "Ruo " +0x82e6: "Ku " +0x82e7: "Zhu " +0x82e8: "Ni " +0x82e9: "Bo " +0x82ea: "Bing " +0x82eb: "Shan " +0x82ec: "Qiu " +0x82ed: "Yao " +0x82ee: "Xian " +0x82ef: "Ben " +0x82f0: "Hong " +0x82f1: "Ying " +0x82f2: "Zha " +0x82f3: "Dong " +0x82f4: "Ju " +0x82f5: "Die " +0x82f6: "Nie " +0x82f7: "Gan " +0x82f8: "Hu " +0x82f9: "Ping " +0x82fa: "Mei " +0x82fb: "Fu " +0x82fc: "Sheng " +0x82fd: "Gu " +0x82fe: "Bi " +0x82ff: "Wei " +/* x083 */ +0x8300: "Fu " +0x8301: "Zhuo " +0x8302: "Mao " +0x8303: "Fan " +0x8304: "Qie " +0x8305: "Mao " +0x8306: "Mao " +0x8307: "Ba " +0x8308: "Zi " +0x8309: "Mo " +0x830a: "Zi " +0x830b: "Di " +0x830c: "Chi " +0x830d: "Ji " +0x830e: "Jing " +0x830f: "Long " +0x8310: "[?] " +0x8311: "Niao " +0x8312: "[?] " +0x8313: "Xue " +0x8314: "Ying " +0x8315: "Qiong " +0x8316: "Ge " +0x8317: "Ming " +0x8318: "Li " +0x8319: "Rong " +0x831a: "Yin " +0x831b: "Gen " +0x831c: "Qian " +0x831d: "Chai " +0x831e: "Chen " +0x831f: "Yu " +0x8320: "Xiu " +0x8321: "Zi " +0x8322: "Lie " +0x8323: "Wu " +0x8324: "Ji " +0x8325: "Kui " +0x8326: "Ce " +0x8327: "Chong " +0x8328: "Ci " +0x8329: "Gou " +0x832a: "Guang " +0x832b: "Mang " +0x832c: "Chi " +0x832d: "Jiao " +0x832e: "Jiao " +0x832f: "Fu " +0x8330: "Yu " +0x8331: "Zhu " +0x8332: "Zi " +0x8333: "Jiang " +0x8334: "Hui " +0x8335: "Yin " +0x8336: "Cha " +0x8337: "Fa " +0x8338: "Rong " +0x8339: "Ru " +0x833a: "Chong " +0x833b: "Mang " +0x833c: "Tong " +0x833d: "Zhong " +0x833e: "[?] " +0x833f: "Zhu " +0x8340: "Xun " +0x8341: "Huan " +0x8342: "Kua " +0x8343: "Quan " +0x8344: "Gai " +0x8345: "Da " +0x8346: "Jing " +0x8347: "Xing " +0x8348: "Quan " +0x8349: "Cao " +0x834a: "Jing " +0x834b: "Er " +0x834c: "An " +0x834d: "Shou " +0x834e: "Chi " +0x834f: "Ren " +0x8350: "Jian " +0x8351: "Ti " +0x8352: "Huang " +0x8353: "Ping " +0x8354: "Li " +0x8355: "Jin " +0x8356: "Lao " +0x8357: "Shu " +0x8358: "Zhuang " +0x8359: "Da " +0x835a: "Jia " +0x835b: "Rao " +0x835c: "Bi " +0x835d: "Ze " +0x835e: "Qiao " +0x835f: "Hui " +0x8360: "Qi " +0x8361: "Dang " +0x8362: "[?] " +0x8363: "Rong " +0x8364: "Hun " +0x8365: "Ying " +0x8366: "Luo " +0x8367: "Ying " +0x8368: "Xun " +0x8369: "Jin " +0x836a: "Sun " +0x836b: "Yin " +0x836c: "Mai " +0x836d: "Hong " +0x836e: "Zhou " +0x836f: "Yao " +0x8370: "Du " +0x8371: "Wei " +0x8372: "Chu " +0x8373: "Dou " +0x8374: "Fu " +0x8375: "Ren " +0x8376: "Yin " +0x8377: "He " +0x8378: "Bi " +0x8379: "Bu " +0x837a: "Yun " +0x837b: "Di " +0x837c: "Tu " +0x837d: "Sui " +0x837e: "Sui " +0x837f: "Cheng " +0x8380: "Chen " +0x8381: "Wu " +0x8382: "Bie " +0x8383: "Xi " +0x8384: "Geng " +0x8385: "Li " +0x8386: "Fu " +0x8387: "Zhu " +0x8388: "Mo " +0x8389: "Li " +0x838a: "Zhuang " +0x838b: "Ji " +0x838c: "Duo " +0x838d: "Qiu " +0x838e: "Sha " +0x838f: "Suo " +0x8390: "Chen " +0x8391: "Feng " +0x8392: "Ju " +0x8393: "Mei " +0x8394: "Meng " +0x8395: "Xing " +0x8396: "Jing " +0x8397: "Che " +0x8398: "Xin " +0x8399: "Jun " +0x839a: "Yan " +0x839b: "Ting " +0x839c: "Diao " +0x839d: "Cuo " +0x839e: "Wan " +0x839f: "Han " +0x83a0: "You " +0x83a1: "Cuo " +0x83a2: "Jia " +0x83a3: "Wang " +0x83a4: "You " +0x83a5: "Niu " +0x83a6: "Shao " +0x83a7: "Xian " +0x83a8: "Lang " +0x83a9: "Fu " +0x83aa: "E " +0x83ab: "Mo " +0x83ac: "Wen " +0x83ad: "Jie " +0x83ae: "Nan " +0x83af: "Mu " +0x83b0: "Kan " +0x83b1: "Lai " +0x83b2: "Lian " +0x83b3: "Shi " +0x83b4: "Wo " +0x83b5: "Usagi " +0x83b6: "Lian " +0x83b7: "Huo " +0x83b8: "You " +0x83b9: "Ying " +0x83ba: "Ying " +0x83bb: "Nuc " +0x83bc: "Chun " +0x83bd: "Mang " +0x83be: "Mang " +0x83bf: "Ci " +0x83c0: "Wan " +0x83c1: "Jing " +0x83c2: "Di " +0x83c3: "Qu " +0x83c4: "Dong " +0x83c5: "Jian " +0x83c6: "Zou " +0x83c7: "Gu " +0x83c8: "La " +0x83c9: "Lu " +0x83ca: "Ju " +0x83cb: "Wei " +0x83cc: "Jun " +0x83cd: "Nie " +0x83ce: "Kun " +0x83cf: "He " +0x83d0: "Pu " +0x83d1: "Zi " +0x83d2: "Gao " +0x83d3: "Guo " +0x83d4: "Fu " +0x83d5: "Lun " +0x83d6: "Chang " +0x83d7: "Chou " +0x83d8: "Song " +0x83d9: "Chui " +0x83da: "Zhan " +0x83db: "Men " +0x83dc: "Cai " +0x83dd: "Ba " +0x83de: "Li " +0x83df: "Tu " +0x83e0: "Bo " +0x83e1: "Han " +0x83e2: "Bao " +0x83e3: "Qin " +0x83e4: "Juan " +0x83e5: "Xi " +0x83e6: "Qin " +0x83e7: "Di " +0x83e8: "Jie " +0x83e9: "Pu " +0x83ea: "Dang " +0x83eb: "Jin " +0x83ec: "Zhao " +0x83ed: "Tai " +0x83ee: "Geng " +0x83ef: "Hua " +0x83f0: "Gu " +0x83f1: "Ling " +0x83f2: "Fei " +0x83f3: "Jin " +0x83f4: "An " +0x83f5: "Wang " +0x83f6: "Beng " +0x83f7: "Zhou " +0x83f8: "Yan " +0x83f9: "Ju " +0x83fa: "Jian " +0x83fb: "Lin " +0x83fc: "Tan " +0x83fd: "Shu " +0x83fe: "Tian " +0x83ff: "Dao " +/* x084 */ +0x8400: "Hu " +0x8401: "Qi " +0x8402: "He " +0x8403: "Cui " +0x8404: "Tao " +0x8405: "Chun " +0x8406: "Bei " +0x8407: "Chang " +0x8408: "Huan " +0x8409: "Fei " +0x840a: "Lai " +0x840b: "Qi " +0x840c: "Meng " +0x840d: "Ping " +0x840e: "Wei " +0x840f: "Dan " +0x8410: "Sha " +0x8411: "Huan " +0x8412: "Yan " +0x8413: "Yi " +0x8414: "Tiao " +0x8415: "Qi " +0x8416: "Wan " +0x8417: "Ce " +0x8418: "Nai " +0x8419: "Kutabireru " +0x841a: "Tuo " +0x841b: "Jiu " +0x841c: "Tie " +0x841d: "Luo " +0x841e: "[?] " +0x841f: "[?] " +0x8420: "Meng " +0x8421: "[?] " +0x8422: "Yaji " +0x8423: "[?] " +0x8424: "Ying " +0x8425: "Ying " +0x8426: "Ying " +0x8427: "Xiao " +0x8428: "Sa " +0x8429: "Qiu " +0x842a: "Ke " +0x842b: "Xiang " +0x842c: "Wan " +0x842d: "Yu " +0x842e: "Yu " +0x842f: "Fu " +0x8430: "Lian " +0x8431: "Xuan " +0x8432: "Yuan " +0x8433: "Nan " +0x8434: "Ze " +0x8435: "Wo " +0x8436: "Chun " +0x8437: "Xiao " +0x8438: "Yu " +0x8439: "Pian " +0x843a: "Mao " +0x843b: "An " +0x843c: "E " +0x843d: "Luo " +0x843e: "Ying " +0x843f: "Huo " +0x8440: "Gua " +0x8441: "Jiang " +0x8442: "Mian " +0x8443: "Zuo " +0x8444: "Zuo " +0x8445: "Ju " +0x8446: "Bao " +0x8447: "Rou " +0x8448: "Xi " +0x8449: "Xie " +0x844a: "An " +0x844b: "Qu " +0x844c: "Jian " +0x844d: "Fu " +0x844e: "Lu " +0x844f: "Jing " +0x8450: "Pen " +0x8451: "Feng " +0x8452: "Hong " +0x8453: "Hong " +0x8454: "Hou " +0x8455: "Yan " +0x8456: "Tu " +0x8457: "Zhu " +0x8458: "Zi " +0x8459: "Xiang " +0x845a: "Shen " +0x845b: "Ge " +0x845c: "Jie " +0x845d: "Jing " +0x845e: "Mi " +0x845f: "Huang " +0x8460: "Shen " +0x8461: "Pu " +0x8462: "Gai " +0x8463: "Dong " +0x8464: "Zhou " +0x8465: "Qian " +0x8466: "Wei " +0x8467: "Bo " +0x8468: "Wei " +0x8469: "Pa " +0x846a: "Ji " +0x846b: "Hu " +0x846c: "Zang " +0x846d: "Jia " +0x846e: "Duan " +0x846f: "Yao " +0x8470: "Jun " +0x8471: "Cong " +0x8472: "Quan " +0x8473: "Wei " +0x8474: "Xian " +0x8475: "Kui " +0x8476: "Ting " +0x8477: "Hun " +0x8478: "Xi " +0x8479: "Shi " +0x847a: "Qi " +0x847b: "Lan " +0x847c: "Zong " +0x847d: "Yao " +0x847e: "Yuan " +0x847f: "Mei " +0x8480: "Yun " +0x8481: "Shu " +0x8482: "Di " +0x8483: "Zhuan " +0x8484: "Guan " +0x8485: "Sukumo " +0x8486: "Xue " +0x8487: "Chan " +0x8488: "Kai " +0x8489: "Kui " +0x848a: "[?] " +0x848b: "Jiang " +0x848c: "Lou " +0x848d: "Wei " +0x848e: "Pai " +0x848f: "[?] " +0x8490: "Sou " +0x8491: "Yin " +0x8492: "Shi " +0x8493: "Chun " +0x8494: "Shi " +0x8495: "Yun " +0x8496: "Zhen " +0x8497: "Lang " +0x8498: "Nu " +0x8499: "Meng " +0x849a: "He " +0x849b: "Que " +0x849c: "Suan " +0x849d: "Yuan " +0x849e: "Li " +0x849f: "Ju " +0x84a0: "Xi " +0x84a1: "Pang " +0x84a2: "Chu " +0x84a3: "Xu " +0x84a4: "Tu " +0x84a5: "Liu " +0x84a6: "Wo " +0x84a7: "Zhen " +0x84a8: "Qian " +0x84a9: "Zu " +0x84aa: "Po " +0x84ab: "Cuo " +0x84ac: "Yuan " +0x84ad: "Chu " +0x84ae: "Yu " +0x84af: "Kuai " +0x84b0: "Pan " +0x84b1: "Pu " +0x84b2: "Pu " +0x84b3: "Na " +0x84b4: "Shuo " +0x84b5: "Xi " +0x84b6: "Fen " +0x84b7: "Yun " +0x84b8: "Zheng " +0x84b9: "Jian " +0x84ba: "Ji " +0x84bb: "Ruo " +0x84bc: "Cang " +0x84bd: "En " +0x84be: "Mi " +0x84bf: "Hao " +0x84c0: "Sun " +0x84c1: "Zhen " +0x84c2: "Ming " +0x84c3: "Sou " +0x84c4: "Xu " +0x84c5: "Liu " +0x84c6: "Xi " +0x84c7: "Gu " +0x84c8: "Lang " +0x84c9: "Rong " +0x84ca: "Weng " +0x84cb: "Gai " +0x84cc: "Cuo " +0x84cd: "Shi " +0x84ce: "Tang " +0x84cf: "Luo " +0x84d0: "Ru " +0x84d1: "Suo " +0x84d2: "Xian " +0x84d3: "Bei " +0x84d4: "Yao " +0x84d5: "Gui " +0x84d6: "Bi " +0x84d7: "Zong " +0x84d8: "Gun " +0x84d9: "Za " +0x84da: "Xiu " +0x84db: "Ce " +0x84dc: "Hai " +0x84dd: "Lan " +0x84de: "[?] " +0x84df: "Ji " +0x84e0: "Li " +0x84e1: "Can " +0x84e2: "Lang " +0x84e3: "Yu " +0x84e4: "[?] " +0x84e5: "Ying " +0x84e6: "Mo " +0x84e7: "Diao " +0x84e8: "Tiao " +0x84e9: "Mao " +0x84ea: "Tong " +0x84eb: "Zhu " +0x84ec: "Peng " +0x84ed: "An " +0x84ee: "Lian " +0x84ef: "Cong " +0x84f0: "Xi " +0x84f1: "Ping " +0x84f2: "Qiu " +0x84f3: "Jin " +0x84f4: "Chun " +0x84f5: "Jie " +0x84f6: "Wei " +0x84f7: "Tui " +0x84f8: "Cao " +0x84f9: "Yu " +0x84fa: "Yi " +0x84fb: "Ji " +0x84fc: "Liao " +0x84fd: "Bi " +0x84fe: "Lu " +0x84ff: "Su " +/* x085 */ +0x8500: "Bu " +0x8501: "Zhang " +0x8502: "Luo " +0x8503: "Jiang " +0x8504: "Man " +0x8505: "Yan " +0x8506: "Ling " +0x8507: "Ji " +0x8508: "Piao " +0x8509: "Gun " +0x850a: "Han " +0x850b: "Di " +0x850c: "Su " +0x850d: "Lu " +0x850e: "She " +0x850f: "Shang " +0x8510: "Di " +0x8511: "Mie " +0x8512: "Xun " +0x8513: "Man " +0x8514: "Bo " +0x8515: "Di " +0x8516: "Cuo " +0x8517: "Zhe " +0x8518: "Sen " +0x8519: "Xuan " +0x851a: "Wei " +0x851b: "Hu " +0x851c: "Ao " +0x851d: "Mi " +0x851e: "Lou " +0x851f: "Cu " +0x8520: "Zhong " +0x8521: "Cai " +0x8522: "Po " +0x8523: "Jiang " +0x8524: "Mi " +0x8525: "Cong " +0x8526: "Niao " +0x8527: "Hui " +0x8528: "Jun " +0x8529: "Yin " +0x852a: "Jian " +0x852b: "Yan " +0x852c: "Shu " +0x852d: "Yin " +0x852e: "Kui " +0x852f: "Chen " +0x8530: "Hu " +0x8531: "Sha " +0x8532: "Kou " +0x8533: "Qian " +0x8534: "Ma " +0x8535: "Zang " +0x8536: "Sonoko " +0x8537: "Qiang " +0x8538: "Dou " +0x8539: "Lian " +0x853a: "Lin " +0x853b: "Kou " +0x853c: "Ai " +0x853d: "Bi " +0x853e: "Li " +0x853f: "Wei " +0x8540: "Ji " +0x8541: "Xun " +0x8542: "Sheng " +0x8543: "Fan " +0x8544: "Meng " +0x8545: "Ou " +0x8546: "Chan " +0x8547: "Dian " +0x8548: "Xun " +0x8549: "Jiao " +0x854a: "Rui " +0x854b: "Rui " +0x854c: "Lei " +0x854d: "Yu " +0x854e: "Qiao " +0x854f: "Chu " +0x8550: "Hua " +0x8551: "Jian " +0x8552: "Mai " +0x8553: "Yun " +0x8554: "Bao " +0x8555: "You " +0x8556: "Qu " +0x8557: "Lu " +0x8558: "Rao " +0x8559: "Hui " +0x855a: "E " +0x855b: "Teng " +0x855c: "Fei " +0x855d: "Jue " +0x855e: "Zui " +0x855f: "Fa " +0x8560: "Ru " +0x8561: "Fen " +0x8562: "Kui " +0x8563: "Shun " +0x8564: "Rui " +0x8565: "Ya " +0x8566: "Xu " +0x8567: "Fu " +0x8568: "Jue " +0x8569: "Dang " +0x856a: "Wu " +0x856b: "Tong " +0x856c: "Si " +0x856d: "Xiao " +0x856e: "Xi " +0x856f: "Long " +0x8570: "Yun " +0x8571: "[?] " +0x8572: "Qi " +0x8573: "Jian " +0x8574: "Yun " +0x8575: "Sun " +0x8576: "Ling " +0x8577: "Yu " +0x8578: "Xia " +0x8579: "Yong " +0x857a: "Ji " +0x857b: "Hong " +0x857c: "Si " +0x857d: "Nong " +0x857e: "Lei " +0x857f: "Xuan " +0x8580: "Yun " +0x8581: "Yu " +0x8582: "Xi " +0x8583: "Hao " +0x8584: "Bo " +0x8585: "Hao " +0x8586: "Ai " +0x8587: "Wei " +0x8588: "Hui " +0x8589: "Wei " +0x858a: "Ji " +0x858b: "Ci " +0x858c: "Xiang " +0x858d: "Luan " +0x858e: "Mie " +0x858f: "Yi " +0x8590: "Leng " +0x8591: "Jiang " +0x8592: "Can " +0x8593: "Shen " +0x8594: "Qiang " +0x8595: "Lian " +0x8596: "Ke " +0x8597: "Yuan " +0x8598: "Da " +0x8599: "Ti " +0x859a: "Tang " +0x859b: "Xie " +0x859c: "Bi " +0x859d: "Zhan " +0x859e: "Sun " +0x859f: "Lian " +0x85a0: "Fan " +0x85a1: "Ding " +0x85a2: "Jie " +0x85a3: "Gu " +0x85a4: "Xie " +0x85a5: "Shu " +0x85a6: "Jian " +0x85a7: "Kao " +0x85a8: "Hong " +0x85a9: "Sa " +0x85aa: "Xin " +0x85ab: "Xun " +0x85ac: "Yao " +0x85ad: "Hie " +0x85ae: "Sou " +0x85af: "Shu " +0x85b0: "Xun " +0x85b1: "Dui " +0x85b2: "Pin " +0x85b3: "Wei " +0x85b4: "Neng " +0x85b5: "Chou " +0x85b6: "Mai " +0x85b7: "Ru " +0x85b8: "Piao " +0x85b9: "Tai " +0x85ba: "Qi " +0x85bb: "Zao " +0x85bc: "Chen " +0x85bd: "Zhen " +0x85be: "Er " +0x85bf: "Ni " +0x85c0: "Ying " +0x85c1: "Gao " +0x85c2: "Cong " +0x85c3: "Xiao " +0x85c4: "Qi " +0x85c5: "Fa " +0x85c6: "Jian " +0x85c7: "Xu " +0x85c8: "Kui " +0x85c9: "Jie " +0x85ca: "Bian " +0x85cb: "Diao " +0x85cc: "Mi " +0x85cd: "Lan " +0x85ce: "Jin " +0x85cf: "Cang " +0x85d0: "Miao " +0x85d1: "Qiong " +0x85d2: "Qie " +0x85d3: "Xian " +0x85d4: "[?] " +0x85d5: "Ou " +0x85d6: "Xian " +0x85d7: "Su " +0x85d8: "Lu " +0x85d9: "Yi " +0x85da: "Xu " +0x85db: "Xie " +0x85dc: "Li " +0x85dd: "Yi " +0x85de: "La " +0x85df: "Lei " +0x85e0: "Xiao " +0x85e1: "Di " +0x85e2: "Zhi " +0x85e3: "Bei " +0x85e4: "Teng " +0x85e5: "Yao " +0x85e6: "Mo " +0x85e7: "Huan " +0x85e8: "Piao " +0x85e9: "Fan " +0x85ea: "Sou " +0x85eb: "Tan " +0x85ec: "Tui " +0x85ed: "Qiong " +0x85ee: "Qiao " +0x85ef: "Wei " +0x85f0: "Liu " +0x85f1: "Hui " +0x85f2: "[?] " +0x85f3: "Gao " +0x85f4: "Yun " +0x85f5: "[?] " +0x85f6: "Li " +0x85f7: "Shu " +0x85f8: "Chu " +0x85f9: "Ai " +0x85fa: "Lin " +0x85fb: "Zao " +0x85fc: "Xuan " +0x85fd: "Chen " +0x85fe: "Lai " +0x85ff: "Huo " +/* x086 */ +0x8600: "Tuo " +0x8601: "Wu " +0x8602: "Rui " +0x8603: "Rui " +0x8604: "Qi " +0x8605: "Heng " +0x8606: "Lu " +0x8607: "Su " +0x8608: "Tui " +0x8609: "Mang " +0x860a: "Yun " +0x860b: "Pin " +0x860c: "Yu " +0x860d: "Xun " +0x860e: "Ji " +0x860f: "Jiong " +0x8610: "Xian " +0x8611: "Mo " +0x8612: "Hagi " +0x8613: "Su " +0x8614: "Jiong " +0x8615: "[?] " +0x8616: "Nie " +0x8617: "Bo " +0x8618: "Rang " +0x8619: "Yi " +0x861a: "Xian " +0x861b: "Yu " +0x861c: "Ju " +0x861d: "Lian " +0x861e: "Lian " +0x861f: "Yin " +0x8620: "Qiang " +0x8621: "Ying " +0x8622: "Long " +0x8623: "Tong " +0x8624: "Wei " +0x8625: "Yue " +0x8626: "Ling " +0x8627: "Qu " +0x8628: "Yao " +0x8629: "Fan " +0x862a: "Mi " +0x862b: "Lan " +0x862c: "Kui " +0x862d: "Lan " +0x862e: "Ji " +0x862f: "Dang " +0x8630: "Katsura " +0x8631: "Lei " +0x8632: "Lei " +0x8633: "Hua " +0x8634: "Feng " +0x8635: "Zhi " +0x8636: "Wei " +0x8637: "Kui " +0x8638: "Zhan " +0x8639: "Huai " +0x863a: "Li " +0x863b: "Ji " +0x863c: "Mi " +0x863d: "Lei " +0x863e: "Huai " +0x863f: "Luo " +0x8640: "Ji " +0x8641: "Kui " +0x8642: "Lu " +0x8643: "Jian " +0x8644: "San " +0x8645: "[?] " +0x8646: "Lei " +0x8647: "Quan " +0x8648: "Xiao " +0x8649: "Yi " +0x864a: "Luan " +0x864b: "Men " +0x864c: "Bie " +0x864d: "Hu " +0x864e: "Hu " +0x864f: "Lu " +0x8650: "Nue " +0x8651: "Lu " +0x8652: "Si " +0x8653: "Xiao " +0x8654: "Qian " +0x8655: "Chu " +0x8656: "Hu " +0x8657: "Xu " +0x8658: "Cuo " +0x8659: "Fu " +0x865a: "Xu " +0x865b: "Xu " +0x865c: "Lu " +0x865d: "Hu " +0x865e: "Yu " +0x865f: "Hao " +0x8660: "Jiao " +0x8661: "Ju " +0x8662: "Guo " +0x8663: "Bao " +0x8664: "Yan " +0x8665: "Zhan " +0x8666: "Zhan " +0x8667: "Kui " +0x8668: "Ban " +0x8669: "Xi " +0x866a: "Shu " +0x866b: "Chong " +0x866c: "Qiu " +0x866d: "Diao " +0x866e: "Ji " +0x866f: "Qiu " +0x8670: "Cheng " +0x8671: "Shi " +0x8672: "[?] " +0x8673: "Di " +0x8674: "Zhe " +0x8675: "She " +0x8676: "Yu " +0x8677: "Gan " +0x8678: "Zi " +0x8679: "Hong " +0x867a: "Hui " +0x867b: "Meng " +0x867c: "Ge " +0x867d: "Sui " +0x867e: "Xia " +0x867f: "Chai " +0x8680: "Shi " +0x8681: "Yi " +0x8682: "Ma " +0x8683: "Xiang " +0x8684: "Fang " +0x8685: "E " +0x8686: "Pa " +0x8687: "Chi " +0x8688: "Qian " +0x8689: "Wen " +0x868a: "Wen " +0x868b: "Rui " +0x868c: "Bang " +0x868d: "Bi " +0x868e: "Yue " +0x868f: "Yue " +0x8690: "Jun " +0x8691: "Qi " +0x8692: "Ran " +0x8693: "Yin " +0x8694: "Qi " +0x8695: "Tian " +0x8696: "Yuan " +0x8697: "Jue " +0x8698: "Hui " +0x8699: "Qin " +0x869a: "Qi " +0x869b: "Zhong " +0x869c: "Ya " +0x869d: "Ci " +0x869e: "Mu " +0x869f: "Wang " +0x86a0: "Fen " +0x86a1: "Fen " +0x86a2: "Hang " +0x86a3: "Gong " +0x86a4: "Zao " +0x86a5: "Fu " +0x86a6: "Ran " +0x86a7: "Jie " +0x86a8: "Fu " +0x86a9: "Chi " +0x86aa: "Dou " +0x86ab: "Piao " +0x86ac: "Xian " +0x86ad: "Ni " +0x86ae: "Te " +0x86af: "Qiu " +0x86b0: "You " +0x86b1: "Zha " +0x86b2: "Ping " +0x86b3: "Chi " +0x86b4: "You " +0x86b5: "He " +0x86b6: "Han " +0x86b7: "Ju " +0x86b8: "Li " +0x86b9: "Fu " +0x86ba: "Ran " +0x86bb: "Zha " +0x86bc: "Gou " +0x86bd: "Pi " +0x86be: "Bo " +0x86bf: "Xian " +0x86c0: "Zhu " +0x86c1: "Diao " +0x86c2: "Bie " +0x86c3: "Bing " +0x86c4: "Gu " +0x86c5: "Ran " +0x86c6: "Qu " +0x86c7: "She " +0x86c8: "Tie " +0x86c9: "Ling " +0x86ca: "Gu " +0x86cb: "Dan " +0x86cc: "Gu " +0x86cd: "Ying " +0x86ce: "Li " +0x86cf: "Cheng " +0x86d0: "Qu " +0x86d1: "Mou " +0x86d2: "Ge " +0x86d3: "Ci " +0x86d4: "Hui " +0x86d5: "Hui " +0x86d6: "Mang " +0x86d7: "Fu " +0x86d8: "Yang " +0x86d9: "Wa " +0x86da: "Lie " +0x86db: "Zhu " +0x86dc: "Yi " +0x86dd: "Xian " +0x86de: "Kuo " +0x86df: "Jiao " +0x86e0: "Li " +0x86e1: "Yi " +0x86e2: "Ping " +0x86e3: "Ji " +0x86e4: "Ha " +0x86e5: "She " +0x86e6: "Yi " +0x86e7: "Wang " +0x86e8: "Mo " +0x86e9: "Qiong " +0x86ea: "Qie " +0x86eb: "Gui " +0x86ec: "Gong " +0x86ed: "Zhi " +0x86ee: "Man " +0x86ef: "Ebi " +0x86f0: "Zhi " +0x86f1: "Jia " +0x86f2: "Rao " +0x86f3: "Si " +0x86f4: "Qi " +0x86f5: "Xing " +0x86f6: "Lie " +0x86f7: "Qiu " +0x86f8: "Shao " +0x86f9: "Yong " +0x86fa: "Jia " +0x86fb: "Shui " +0x86fc: "Che " +0x86fd: "Bai " +0x86fe: "E " +0x86ff: "Han " +/* x087 */ +0x8700: "Shu " +0x8701: "Xuan " +0x8702: "Feng " +0x8703: "Shen " +0x8704: "Zhen " +0x8705: "Fu " +0x8706: "Xian " +0x8707: "Zhe " +0x8708: "Wu " +0x8709: "Fu " +0x870a: "Li " +0x870b: "Lang " +0x870c: "Bi " +0x870d: "Chu " +0x870e: "Yuan " +0x870f: "You " +0x8710: "Jie " +0x8711: "Dan " +0x8712: "Yan " +0x8713: "Ting " +0x8714: "Dian " +0x8715: "Shui " +0x8716: "Hui " +0x8717: "Gua " +0x8718: "Zhi " +0x8719: "Song " +0x871a: "Fei " +0x871b: "Ju " +0x871c: "Mi " +0x871d: "Qi " +0x871e: "Qi " +0x871f: "Yu " +0x8720: "Jun " +0x8721: "Zha " +0x8722: "Meng " +0x8723: "Qiang " +0x8724: "Si " +0x8725: "Xi " +0x8726: "Lun " +0x8727: "Li " +0x8728: "Die " +0x8729: "Tiao " +0x872a: "Tao " +0x872b: "Kun " +0x872c: "Gan " +0x872d: "Han " +0x872e: "Yu " +0x872f: "Bang " +0x8730: "Fei " +0x8731: "Pi " +0x8732: "Wei " +0x8733: "Dun " +0x8734: "Yi " +0x8735: "Yuan " +0x8736: "Su " +0x8737: "Quan " +0x8738: "Qian " +0x8739: "Rui " +0x873a: "Ni " +0x873b: "Qing " +0x873c: "Wei " +0x873d: "Liang " +0x873e: "Guo " +0x873f: "Wan " +0x8740: "Dong " +0x8741: "E " +0x8742: "Ban " +0x8743: "Di " +0x8744: "Wang " +0x8745: "Can " +0x8746: "Yang " +0x8747: "Ying " +0x8748: "Guo " +0x8749: "Chan " +0x874a: "[?] " +0x874b: "La " +0x874c: "Ke " +0x874d: "Ji " +0x874e: "He " +0x874f: "Ting " +0x8750: "Mai " +0x8751: "Xu " +0x8752: "Mian " +0x8753: "Yu " +0x8754: "Jie " +0x8755: "Shi " +0x8756: "Xuan " +0x8757: "Huang " +0x8758: "Yan " +0x8759: "Bian " +0x875a: "Rou " +0x875b: "Wei " +0x875c: "Fu " +0x875d: "Yuan " +0x875e: "Mei " +0x875f: "Wei " +0x8760: "Fu " +0x8761: "Ruan " +0x8762: "Xie " +0x8763: "You " +0x8764: "Qiu " +0x8765: "Mao " +0x8766: "Xia " +0x8767: "Ying " +0x8768: "Shi " +0x8769: "Chong " +0x876a: "Tang " +0x876b: "Zhu " +0x876c: "Zong " +0x876d: "Ti " +0x876e: "Fu " +0x876f: "Yuan " +0x8770: "Hui " +0x8771: "Meng " +0x8772: "La " +0x8773: "Du " +0x8774: "Hu " +0x8775: "Qiu " +0x8776: "Die " +0x8777: "Li " +0x8778: "Gua " +0x8779: "Yun " +0x877a: "Ju " +0x877b: "Nan " +0x877c: "Lou " +0x877d: "Qun " +0x877e: "Rong " +0x877f: "Ying " +0x8780: "Jiang " +0x8781: "[?] " +0x8782: "Lang " +0x8783: "Pang " +0x8784: "Si " +0x8785: "Xi " +0x8786: "Ci " +0x8787: "Xi " +0x8788: "Yuan " +0x8789: "Weng " +0x878a: "Lian " +0x878b: "Sou " +0x878c: "Ban " +0x878d: "Rong " +0x878e: "Rong " +0x878f: "Ji " +0x8790: "Wu " +0x8791: "Qiu " +0x8792: "Han " +0x8793: "Qin " +0x8794: "Yi " +0x8795: "Bi " +0x8796: "Hua " +0x8797: "Tang " +0x8798: "Yi " +0x8799: "Du " +0x879a: "Nai " +0x879b: "He " +0x879c: "Hu " +0x879d: "Hui " +0x879e: "Ma " +0x879f: "Ming " +0x87a0: "Yi " +0x87a1: "Wen " +0x87a2: "Ying " +0x87a3: "Teng " +0x87a4: "Yu " +0x87a5: "Cang " +0x87a6: "So " +0x87a7: "Ebi " +0x87a8: "Man " +0x87a9: "[?] " +0x87aa: "Shang " +0x87ab: "Zhe " +0x87ac: "Cao " +0x87ad: "Chi " +0x87ae: "Di " +0x87af: "Ao " +0x87b0: "Lu " +0x87b1: "Wei " +0x87b2: "Zhi " +0x87b3: "Tang " +0x87b4: "Chen " +0x87b5: "Piao " +0x87b6: "Qu " +0x87b7: "Pi " +0x87b8: "Yu " +0x87b9: "Jian " +0x87ba: "Luo " +0x87bb: "Lou " +0x87bc: "Qin " +0x87bd: "Zhong " +0x87be: "Yin " +0x87bf: "Jiang " +0x87c0: "Shuai " +0x87c1: "Wen " +0x87c2: "Jiao " +0x87c3: "Wan " +0x87c4: "Zhi " +0x87c5: "Zhe " +0x87c6: "Ma " +0x87c7: "Ma " +0x87c8: "Guo " +0x87c9: "Liu " +0x87ca: "Mao " +0x87cb: "Xi " +0x87cc: "Cong " +0x87cd: "Li " +0x87ce: "Man " +0x87cf: "Xiao " +0x87d0: "Kamakiri " +0x87d1: "Zhang " +0x87d2: "Mang " +0x87d3: "Xiang " +0x87d4: "Mo " +0x87d5: "Zui " +0x87d6: "Si " +0x87d7: "Qiu " +0x87d8: "Te " +0x87d9: "Zhi " +0x87da: "Peng " +0x87db: "Peng " +0x87dc: "Jiao " +0x87dd: "Qu " +0x87de: "Bie " +0x87df: "Liao " +0x87e0: "Pan " +0x87e1: "Gui " +0x87e2: "Xi " +0x87e3: "Ji " +0x87e4: "Zhuan " +0x87e5: "Huang " +0x87e6: "Fei " +0x87e7: "Lao " +0x87e8: "Jue " +0x87e9: "Jue " +0x87ea: "Hui " +0x87eb: "Yin " +0x87ec: "Chan " +0x87ed: "Jiao " +0x87ee: "Shan " +0x87ef: "Rao " +0x87f0: "Xiao " +0x87f1: "Mou " +0x87f2: "Chong " +0x87f3: "Xun " +0x87f4: "Si " +0x87f5: "[?] " +0x87f6: "Cheng " +0x87f7: "Dang " +0x87f8: "Li " +0x87f9: "Xie " +0x87fa: "Shan " +0x87fb: "Yi " +0x87fc: "Jing " +0x87fd: "Da " +0x87fe: "Chan " +0x87ff: "Qi " +/* x088 */ +0x8800: "Ci " +0x8801: "Xiang " +0x8802: "She " +0x8803: "Luo " +0x8804: "Qin " +0x8805: "Ying " +0x8806: "Chai " +0x8807: "Li " +0x8808: "Ze " +0x8809: "Xuan " +0x880a: "Lian " +0x880b: "Zhu " +0x880c: "Ze " +0x880d: "Xie " +0x880e: "Mang " +0x880f: "Xie " +0x8810: "Qi " +0x8811: "Rong " +0x8812: "Jian " +0x8813: "Meng " +0x8814: "Hao " +0x8815: "Ruan " +0x8816: "Huo " +0x8817: "Zhuo " +0x8818: "Jie " +0x8819: "Bin " +0x881a: "He " +0x881b: "Mie " +0x881c: "Fan " +0x881d: "Lei " +0x881e: "Jie " +0x881f: "La " +0x8820: "Mi " +0x8821: "Li " +0x8822: "Chun " +0x8823: "Li " +0x8824: "Qiu " +0x8825: "Nie " +0x8826: "Lu " +0x8827: "Du " +0x8828: "Xiao " +0x8829: "Zhu " +0x882a: "Long " +0x882b: "Li " +0x882c: "Long " +0x882d: "Feng " +0x882e: "Ye " +0x882f: "Beng " +0x8830: "Shang " +0x8831: "Gu " +0x8832: "Juan " +0x8833: "Ying " +0x8834: "[?] " +0x8835: "Xi " +0x8836: "Can " +0x8837: "Qu " +0x8838: "Quan " +0x8839: "Du " +0x883a: "Can " +0x883b: "Man " +0x883c: "Jue " +0x883d: "Jie " +0x883e: "Zhu " +0x883f: "Zha " +0x8840: "Xie " +0x8841: "Huang " +0x8842: "Niu " +0x8843: "Pei " +0x8844: "Nu " +0x8845: "Xin " +0x8846: "Zhong " +0x8847: "Mo " +0x8848: "Er " +0x8849: "Ke " +0x884a: "Mie " +0x884b: "Xi " +0x884c: "Xing " +0x884d: "Yan " +0x884e: "Kan " +0x884f: "Yuan " +0x8850: "[?] " +0x8851: "Ling " +0x8852: "Xuan " +0x8853: "Shu " +0x8854: "Xian " +0x8855: "Tong " +0x8856: "Long " +0x8857: "Jie " +0x8858: "Xian " +0x8859: "Ya " +0x885a: "Hu " +0x885b: "Wei " +0x885c: "Dao " +0x885d: "Chong " +0x885e: "Wei " +0x885f: "Dao " +0x8860: "Zhun " +0x8861: "Heng " +0x8862: "Qu " +0x8863: "Yi " +0x8864: "Yi " +0x8865: "Bu " +0x8866: "Gan " +0x8867: "Yu " +0x8868: "Biao " +0x8869: "Cha " +0x886a: "Yi " +0x886b: "Shan " +0x886c: "Chen " +0x886d: "Fu " +0x886e: "Gun " +0x886f: "Fen " +0x8870: "Shuai " +0x8871: "Jie " +0x8872: "Na " +0x8873: "Zhong " +0x8874: "Dan " +0x8875: "Ri " +0x8876: "Zhong " +0x8877: "Zhong " +0x8878: "Xie " +0x8879: "Qi " +0x887a: "Xie " +0x887b: "Ran " +0x887c: "Zhi " +0x887d: "Ren " +0x887e: "Qin " +0x887f: "Jin " +0x8880: "Jun " +0x8881: "Yuan " +0x8882: "Mei " +0x8883: "Chai " +0x8884: "Ao " +0x8885: "Niao " +0x8886: "Hui " +0x8887: "Ran " +0x8888: "Jia " +0x8889: "Tuo " +0x888a: "Ling " +0x888b: "Dai " +0x888c: "Bao " +0x888d: "Pao " +0x888e: "Yao " +0x888f: "Zuo " +0x8890: "Bi " +0x8891: "Shao " +0x8892: "Tan " +0x8893: "Ju " +0x8894: "He " +0x8895: "Shu " +0x8896: "Xiu " +0x8897: "Zhen " +0x8898: "Yi " +0x8899: "Pa " +0x889a: "Bo " +0x889b: "Di " +0x889c: "Wa " +0x889d: "Fu " +0x889e: "Gun " +0x889f: "Zhi " +0x88a0: "Zhi " +0x88a1: "Ran " +0x88a2: "Pan " +0x88a3: "Yi " +0x88a4: "Mao " +0x88a5: "Tuo " +0x88a6: "Na " +0x88a7: "Kou " +0x88a8: "Xian " +0x88a9: "Chan " +0x88aa: "Qu " +0x88ab: "Bei " +0x88ac: "Gun " +0x88ad: "Xi " +0x88ae: "Ne " +0x88af: "Bo " +0x88b0: "Horo " +0x88b1: "Fu " +0x88b2: "Yi " +0x88b3: "Chi " +0x88b4: "Ku " +0x88b5: "Ren " +0x88b6: "Jiang " +0x88b7: "Jia " +0x88b8: "Cun " +0x88b9: "Mo " +0x88ba: "Jie " +0x88bb: "Er " +0x88bc: "Luo " +0x88bd: "Ru " +0x88be: "Zhu " +0x88bf: "Gui " +0x88c0: "Yin " +0x88c1: "Cai " +0x88c2: "Lie " +0x88c3: "Kamishimo " +0x88c4: "Yuki " +0x88c5: "Zhuang " +0x88c6: "Dang " +0x88c7: "[?] " +0x88c8: "Kun " +0x88c9: "Ken " +0x88ca: "Niao " +0x88cb: "Shu " +0x88cc: "Jia " +0x88cd: "Kun " +0x88ce: "Cheng " +0x88cf: "Li " +0x88d0: "Juan " +0x88d1: "Shen " +0x88d2: "Pou " +0x88d3: "Ge " +0x88d4: "Yi " +0x88d5: "Yu " +0x88d6: "Zhen " +0x88d7: "Liu " +0x88d8: "Qiu " +0x88d9: "Qun " +0x88da: "Ji " +0x88db: "Yi " +0x88dc: "Bu " +0x88dd: "Zhuang " +0x88de: "Shui " +0x88df: "Sha " +0x88e0: "Qun " +0x88e1: "Li " +0x88e2: "Lian " +0x88e3: "Lian " +0x88e4: "Ku " +0x88e5: "Jian " +0x88e6: "Fou " +0x88e7: "Chan " +0x88e8: "Bi " +0x88e9: "Gun " +0x88ea: "Tao " +0x88eb: "Yuan " +0x88ec: "Ling " +0x88ed: "Chi " +0x88ee: "Chang " +0x88ef: "Chou " +0x88f0: "Duo " +0x88f1: "Biao " +0x88f2: "Liang " +0x88f3: "Chang " +0x88f4: "Pei " +0x88f5: "Pei " +0x88f6: "Fei " +0x88f7: "Yuan " +0x88f8: "Luo " +0x88f9: "Guo " +0x88fa: "Yan " +0x88fb: "Du " +0x88fc: "Xi " +0x88fd: "Zhi " +0x88fe: "Ju " +0x88ff: "Qi " +/* x089 */ +0x8900: "Ji " +0x8901: "Zhi " +0x8902: "Gua " +0x8903: "Ken " +0x8904: "Che " +0x8905: "Ti " +0x8906: "Ti " +0x8907: "Fu " +0x8908: "Chong " +0x8909: "Xie " +0x890a: "Bian " +0x890b: "Die " +0x890c: "Kun " +0x890d: "Duan " +0x890e: "Xiu " +0x890f: "Xiu " +0x8910: "He " +0x8911: "Yuan " +0x8912: "Bao " +0x8913: "Bao " +0x8914: "Fu " +0x8915: "Yu " +0x8916: "Tuan " +0x8917: "Yan " +0x8918: "Hui " +0x8919: "Bei " +0x891a: "Chu " +0x891b: "Lu " +0x891c: "Ena " +0x891d: "Hitoe " +0x891e: "Yun " +0x891f: "Da " +0x8920: "Gou " +0x8921: "Da " +0x8922: "Huai " +0x8923: "Rong " +0x8924: "Yuan " +0x8925: "Ru " +0x8926: "Nai " +0x8927: "Jiong " +0x8928: "Suo " +0x8929: "Ban " +0x892a: "Tun " +0x892b: "Chi " +0x892c: "Sang " +0x892d: "Niao " +0x892e: "Ying " +0x892f: "Jie " +0x8930: "Qian " +0x8931: "Huai " +0x8932: "Ku " +0x8933: "Lian " +0x8934: "Bao " +0x8935: "Li " +0x8936: "Zhe " +0x8937: "Shi " +0x8938: "Lu " +0x8939: "Yi " +0x893a: "Die " +0x893b: "Xie " +0x893c: "Xian " +0x893d: "Wei " +0x893e: "Biao " +0x893f: "Cao " +0x8940: "Ji " +0x8941: "Jiang " +0x8942: "Sen " +0x8943: "Bao " +0x8944: "Xiang " +0x8945: "Chihaya " +0x8946: "Pu " +0x8947: "Jian " +0x8948: "Zhuan " +0x8949: "Jian " +0x894a: "Zui " +0x894b: "Ji " +0x894c: "Dan " +0x894d: "Za " +0x894e: "Fan " +0x894f: "Bo " +0x8950: "Xiang " +0x8951: "Xin " +0x8952: "Bie " +0x8953: "Rao " +0x8954: "Man " +0x8955: "Lan " +0x8956: "Ao " +0x8957: "Duo " +0x8958: "Gui " +0x8959: "Cao " +0x895a: "Sui " +0x895b: "Nong " +0x895c: "Chan " +0x895d: "Lian " +0x895e: "Bi " +0x895f: "Jin " +0x8960: "Dang " +0x8961: "Shu " +0x8962: "Tan " +0x8963: "Bi " +0x8964: "Lan " +0x8965: "Pu " +0x8966: "Ru " +0x8967: "Zhi " +0x8968: "[?] " +0x8969: "Shu " +0x896a: "Wa " +0x896b: "Shi " +0x896c: "Bai " +0x896d: "Xie " +0x896e: "Bo " +0x896f: "Chen " +0x8970: "Lai " +0x8971: "Long " +0x8972: "Xi " +0x8973: "Xian " +0x8974: "Lan " +0x8975: "Zhe " +0x8976: "Dai " +0x8977: "Tasuki " +0x8978: "Zan " +0x8979: "Shi " +0x897a: "Jian " +0x897b: "Pan " +0x897c: "Yi " +0x897d: "Ran " +0x897e: "Ya " +0x897f: "Xi " +0x8980: "Xi " +0x8981: "Yao " +0x8982: "Feng " +0x8983: "Tan " +0x8984: "[?] " +0x8985: "Biao " +0x8986: "Fu " +0x8987: "Ba " +0x8988: "He " +0x8989: "Ji " +0x898a: "Ji " +0x898b: "Jian " +0x898c: "Guan " +0x898d: "Bian " +0x898e: "Yan " +0x898f: "Gui " +0x8990: "Jue " +0x8991: "Pian " +0x8992: "Mao " +0x8993: "Mi " +0x8994: "Mi " +0x8995: "Mie " +0x8996: "Shi " +0x8997: "Si " +0x8998: "Zhan " +0x8999: "Luo " +0x899a: "Jue " +0x899b: "Mi " +0x899c: "Tiao " +0x899d: "Lian " +0x899e: "Yao " +0x899f: "Zhi " +0x89a0: "Jun " +0x89a1: "Xi " +0x89a2: "Shan " +0x89a3: "Wei " +0x89a4: "Xi " +0x89a5: "Tian " +0x89a6: "Yu " +0x89a7: "Lan " +0x89a8: "E " +0x89a9: "Du " +0x89aa: "Qin " +0x89ab: "Pang " +0x89ac: "Ji " +0x89ad: "Ming " +0x89ae: "Ying " +0x89af: "Gou " +0x89b0: "Qu " +0x89b1: "Zhan " +0x89b2: "Jin " +0x89b3: "Guan " +0x89b4: "Deng " +0x89b5: "Jian " +0x89b6: "Luo " +0x89b7: "Qu " +0x89b8: "Jian " +0x89b9: "Wei " +0x89ba: "Jue " +0x89bb: "Qu " +0x89bc: "Luo " +0x89bd: "Lan " +0x89be: "Shen " +0x89bf: "Di " +0x89c0: "Guan " +0x89c1: "Jian " +0x89c2: "Guan " +0x89c3: "Yan " +0x89c4: "Gui " +0x89c5: "Mi " +0x89c6: "Shi " +0x89c7: "Zhan " +0x89c8: "Lan " +0x89c9: "Jue " +0x89ca: "Ji " +0x89cb: "Xi " +0x89cc: "Di " +0x89cd: "Tian " +0x89ce: "Yu " +0x89cf: "Gou " +0x89d0: "Jin " +0x89d1: "Qu " +0x89d2: "Jiao " +0x89d3: "Jiu " +0x89d4: "Jin " +0x89d5: "Cu " +0x89d6: "Jue " +0x89d7: "Zhi " +0x89d8: "Chao " +0x89d9: "Ji " +0x89da: "Gu " +0x89db: "Dan " +0x89dc: "Zui " +0x89dd: "Di " +0x89de: "Shang " +0x89df: "Hua " +0x89e0: "Quan " +0x89e1: "Ge " +0x89e2: "Chi " +0x89e3: "Jie " +0x89e4: "Gui " +0x89e5: "Gong " +0x89e6: "Hong " +0x89e7: "Jie " +0x89e8: "Hun " +0x89e9: "Qiu " +0x89ea: "Xing " +0x89eb: "Su " +0x89ec: "Ni " +0x89ed: "Ji " +0x89ee: "Lu " +0x89ef: "Zhi " +0x89f0: "Zha " +0x89f1: "Bi " +0x89f2: "Xing " +0x89f3: "Hu " +0x89f4: "Shang " +0x89f5: "Gong " +0x89f6: "Zhi " +0x89f7: "Xue " +0x89f8: "Chu " +0x89f9: "Xi " +0x89fa: "Yi " +0x89fb: "Lu " +0x89fc: "Jue " +0x89fd: "Xi " +0x89fe: "Yan " +0x89ff: "Xi " +/* x08a */ +0x8a00: "Yan " +0x8a01: "Yan " +0x8a02: "Ding " +0x8a03: "Fu " +0x8a04: "Qiu " +0x8a05: "Qiu " +0x8a06: "Jiao " +0x8a07: "Hong " +0x8a08: "Ji " +0x8a09: "Fan " +0x8a0a: "Xun " +0x8a0b: "Diao " +0x8a0c: "Hong " +0x8a0d: "Cha " +0x8a0e: "Tao " +0x8a0f: "Xu " +0x8a10: "Jie " +0x8a11: "Yi " +0x8a12: "Ren " +0x8a13: "Xun " +0x8a14: "Yin " +0x8a15: "Shan " +0x8a16: "Qi " +0x8a17: "Tuo " +0x8a18: "Ji " +0x8a19: "Xun " +0x8a1a: "Yin " +0x8a1b: "E " +0x8a1c: "Fen " +0x8a1d: "Ya " +0x8a1e: "Yao " +0x8a1f: "Song " +0x8a20: "Shen " +0x8a21: "Yin " +0x8a22: "Xin " +0x8a23: "Jue " +0x8a24: "Xiao " +0x8a25: "Ne " +0x8a26: "Chen " +0x8a27: "You " +0x8a28: "Zhi " +0x8a29: "Xiong " +0x8a2a: "Fang " +0x8a2b: "Xin " +0x8a2c: "Chao " +0x8a2d: "She " +0x8a2e: "Xian " +0x8a2f: "Sha " +0x8a30: "Tun " +0x8a31: "Xu " +0x8a32: "Yi " +0x8a33: "Yi " +0x8a34: "Su " +0x8a35: "Chi " +0x8a36: "He " +0x8a37: "Shen " +0x8a38: "He " +0x8a39: "Xu " +0x8a3a: "Zhen " +0x8a3b: "Zhu " +0x8a3c: "Zheng " +0x8a3d: "Gou " +0x8a3e: "Zi " +0x8a3f: "Zi " +0x8a40: "Zhan " +0x8a41: "Gu " +0x8a42: "Fu " +0x8a43: "Quan " +0x8a44: "Die " +0x8a45: "Ling " +0x8a46: "Di " +0x8a47: "Yang " +0x8a48: "Li " +0x8a49: "Nao " +0x8a4a: "Pan " +0x8a4b: "Zhou " +0x8a4c: "Gan " +0x8a4d: "Yi " +0x8a4e: "Ju " +0x8a4f: "Ao " +0x8a50: "Zha " +0x8a51: "Tuo " +0x8a52: "Yi " +0x8a53: "Qu " +0x8a54: "Zhao " +0x8a55: "Ping " +0x8a56: "Bi " +0x8a57: "Xiong " +0x8a58: "Qu " +0x8a59: "Ba " +0x8a5a: "Da " +0x8a5b: "Zu " +0x8a5c: "Tao " +0x8a5d: "Zhu " +0x8a5e: "Ci " +0x8a5f: "Zhe " +0x8a60: "Yong " +0x8a61: "Xu " +0x8a62: "Xun " +0x8a63: "Yi " +0x8a64: "Huang " +0x8a65: "He " +0x8a66: "Shi " +0x8a67: "Cha " +0x8a68: "Jiao " +0x8a69: "Shi " +0x8a6a: "Hen " +0x8a6b: "Cha " +0x8a6c: "Gou " +0x8a6d: "Gui " +0x8a6e: "Quan " +0x8a6f: "Hui " +0x8a70: "Jie " +0x8a71: "Hua " +0x8a72: "Gai " +0x8a73: "Xiang " +0x8a74: "Wei " +0x8a75: "Shen " +0x8a76: "Chou " +0x8a77: "Tong " +0x8a78: "Mi " +0x8a79: "Zhan " +0x8a7a: "Ming " +0x8a7b: "E " +0x8a7c: "Hui " +0x8a7d: "Yan " +0x8a7e: "Xiong " +0x8a7f: "Gua " +0x8a80: "Er " +0x8a81: "Beng " +0x8a82: "Tiao " +0x8a83: "Chi " +0x8a84: "Lei " +0x8a85: "Zhu " +0x8a86: "Kuang " +0x8a87: "Kua " +0x8a88: "Wu " +0x8a89: "Yu " +0x8a8a: "Teng " +0x8a8b: "Ji " +0x8a8c: "Zhi " +0x8a8d: "Ren " +0x8a8e: "Su " +0x8a8f: "Lang " +0x8a90: "E " +0x8a91: "Kuang " +0x8a92: "E " +0x8a93: "Shi " +0x8a94: "Ting " +0x8a95: "Dan " +0x8a96: "Bo " +0x8a97: "Chan " +0x8a98: "You " +0x8a99: "Heng " +0x8a9a: "Qiao " +0x8a9b: "Qin " +0x8a9c: "Shua " +0x8a9d: "An " +0x8a9e: "Yu " +0x8a9f: "Xiao " +0x8aa0: "Cheng " +0x8aa1: "Jie " +0x8aa2: "Xian " +0x8aa3: "Wu " +0x8aa4: "Wu " +0x8aa5: "Gao " +0x8aa6: "Song " +0x8aa7: "Pu " +0x8aa8: "Hui " +0x8aa9: "Jing " +0x8aaa: "Shuo " +0x8aab: "Zhen " +0x8aac: "Shuo " +0x8aad: "Du " +0x8aae: "Yasashi " +0x8aaf: "Chang " +0x8ab0: "Shui " +0x8ab1: "Jie " +0x8ab2: "Ke " +0x8ab3: "Qu " +0x8ab4: "Cong " +0x8ab5: "Xiao " +0x8ab6: "Sui " +0x8ab7: "Wang " +0x8ab8: "Xuan " +0x8ab9: "Fei " +0x8aba: "Chi " +0x8abb: "Ta " +0x8abc: "Yi " +0x8abd: "Na " +0x8abe: "Yin " +0x8abf: "Diao " +0x8ac0: "Pi " +0x8ac1: "Chuo " +0x8ac2: "Chan " +0x8ac3: "Chen " +0x8ac4: "Zhun " +0x8ac5: "Ji " +0x8ac6: "Qi " +0x8ac7: "Tan " +0x8ac8: "Zhui " +0x8ac9: "Wei " +0x8aca: "Ju " +0x8acb: "Qing " +0x8acc: "Jian " +0x8acd: "Zheng " +0x8ace: "Ze " +0x8acf: "Zou " +0x8ad0: "Qian " +0x8ad1: "Zhuo " +0x8ad2: "Liang " +0x8ad3: "Jian " +0x8ad4: "Zhu " +0x8ad5: "Hao " +0x8ad6: "Lun " +0x8ad7: "Shen " +0x8ad8: "Biao " +0x8ad9: "Huai " +0x8ada: "Pian " +0x8adb: "Yu " +0x8adc: "Die " +0x8add: "Xu " +0x8ade: "Pian " +0x8adf: "Shi " +0x8ae0: "Xuan " +0x8ae1: "Shi " +0x8ae2: "Hun " +0x8ae3: "Hua " +0x8ae4: "E " +0x8ae5: "Zhong " +0x8ae6: "Di " +0x8ae7: "Xie " +0x8ae8: "Fu " +0x8ae9: "Pu " +0x8aea: "Ting " +0x8aeb: "Jian " +0x8aec: "Qi " +0x8aed: "Yu " +0x8aee: "Zi " +0x8aef: "Chuan " +0x8af0: "Xi " +0x8af1: "Hui " +0x8af2: "Yin " +0x8af3: "An " +0x8af4: "Xian " +0x8af5: "Nan " +0x8af6: "Chen " +0x8af7: "Feng " +0x8af8: "Zhu " +0x8af9: "Yang " +0x8afa: "Yan " +0x8afb: "Heng " +0x8afc: "Xuan " +0x8afd: "Ge " +0x8afe: "Nuo " +0x8aff: "Qi " +/* x08b */ +0x8b00: "Mou " +0x8b01: "Ye " +0x8b02: "Wei " +0x8b03: "[?] " +0x8b04: "Teng " +0x8b05: "Zou " +0x8b06: "Shan " +0x8b07: "Jian " +0x8b08: "Bo " +0x8b09: "Ku " +0x8b0a: "Huang " +0x8b0b: "Huo " +0x8b0c: "Ge " +0x8b0d: "Ying " +0x8b0e: "Mi " +0x8b0f: "Xiao " +0x8b10: "Mi " +0x8b11: "Xi " +0x8b12: "Qiang " +0x8b13: "Chen " +0x8b14: "Nue " +0x8b15: "Ti " +0x8b16: "Su " +0x8b17: "Bang " +0x8b18: "Chi " +0x8b19: "Qian " +0x8b1a: "Shi " +0x8b1b: "Jiang " +0x8b1c: "Yuan " +0x8b1d: "Xie " +0x8b1e: "Xue " +0x8b1f: "Tao " +0x8b20: "Yao " +0x8b21: "Yao " +0x8b22: "[?] " +0x8b23: "Yu " +0x8b24: "Biao " +0x8b25: "Cong " +0x8b26: "Qing " +0x8b27: "Li " +0x8b28: "Mo " +0x8b29: "Mo " +0x8b2a: "Shang " +0x8b2b: "Zhe " +0x8b2c: "Miu " +0x8b2d: "Jian " +0x8b2e: "Ze " +0x8b2f: "Jie " +0x8b30: "Lian " +0x8b31: "Lou " +0x8b32: "Can " +0x8b33: "Ou " +0x8b34: "Guan " +0x8b35: "Xi " +0x8b36: "Zhuo " +0x8b37: "Ao " +0x8b38: "Ao " +0x8b39: "Jin " +0x8b3a: "Zhe " +0x8b3b: "Yi " +0x8b3c: "Hu " +0x8b3d: "Jiang " +0x8b3e: "Man " +0x8b3f: "Chao " +0x8b40: "Han " +0x8b41: "Hua " +0x8b42: "Chan " +0x8b43: "Xu " +0x8b44: "Zeng " +0x8b45: "Se " +0x8b46: "Xi " +0x8b47: "She " +0x8b48: "Dui " +0x8b49: "Zheng " +0x8b4a: "Nao " +0x8b4b: "Lan " +0x8b4c: "E " +0x8b4d: "Ying " +0x8b4e: "Jue " +0x8b4f: "Ji " +0x8b50: "Zun " +0x8b51: "Jiao " +0x8b52: "Bo " +0x8b53: "Hui " +0x8b54: "Zhuan " +0x8b55: "Mu " +0x8b56: "Zen " +0x8b57: "Zha " +0x8b58: "Shi " +0x8b59: "Qiao " +0x8b5a: "Tan " +0x8b5b: "Zen " +0x8b5c: "Pu " +0x8b5d: "Sheng " +0x8b5e: "Xuan " +0x8b5f: "Zao " +0x8b60: "Tan " +0x8b61: "Dang " +0x8b62: "Sui " +0x8b63: "Qian " +0x8b64: "Ji " +0x8b65: "Jiao " +0x8b66: "Jing " +0x8b67: "Lian " +0x8b68: "Nou " +0x8b69: "Yi " +0x8b6a: "Ai " +0x8b6b: "Zhan " +0x8b6c: "Pi " +0x8b6d: "Hui " +0x8b6e: "Hua " +0x8b6f: "Yi " +0x8b70: "Yi " +0x8b71: "Shan " +0x8b72: "Rang " +0x8b73: "Nou " +0x8b74: "Qian " +0x8b75: "Zhui " +0x8b76: "Ta " +0x8b77: "Hu " +0x8b78: "Zhou " +0x8b79: "Hao " +0x8b7a: "Ye " +0x8b7b: "Ying " +0x8b7c: "Jian " +0x8b7d: "Yu " +0x8b7e: "Jian " +0x8b7f: "Hui " +0x8b80: "Du " +0x8b81: "Zhe " +0x8b82: "Xuan " +0x8b83: "Zan " +0x8b84: "Lei " +0x8b85: "Shen " +0x8b86: "Wei " +0x8b87: "Chan " +0x8b88: "Li " +0x8b89: "Yi " +0x8b8a: "Bian " +0x8b8b: "Zhe " +0x8b8c: "Yan " +0x8b8d: "E " +0x8b8e: "Chou " +0x8b8f: "Wei " +0x8b90: "Chou " +0x8b91: "Yao " +0x8b92: "Chan " +0x8b93: "Rang " +0x8b94: "Yin " +0x8b95: "Lan " +0x8b96: "Chen " +0x8b97: "Huo " +0x8b98: "Zhe " +0x8b99: "Huan " +0x8b9a: "Zan " +0x8b9b: "Yi " +0x8b9c: "Dang " +0x8b9d: "Zhan " +0x8b9e: "Yan " +0x8b9f: "Du " +0x8ba0: "Yan " +0x8ba1: "Ji " +0x8ba2: "Ding " +0x8ba3: "Fu " +0x8ba4: "Ren " +0x8ba5: "Ji " +0x8ba6: "Jie " +0x8ba7: "Hong " +0x8ba8: "Tao " +0x8ba9: "Rang " +0x8baa: "Shan " +0x8bab: "Qi " +0x8bac: "Tuo " +0x8bad: "Xun " +0x8bae: "Yi " +0x8baf: "Xun " +0x8bb0: "Ji " +0x8bb1: "Ren " +0x8bb2: "Jiang " +0x8bb3: "Hui " +0x8bb4: "Ou " +0x8bb5: "Ju " +0x8bb6: "Ya " +0x8bb7: "Ne " +0x8bb8: "Xu " +0x8bb9: "E " +0x8bba: "Lun " +0x8bbb: "Xiong " +0x8bbc: "Song " +0x8bbd: "Feng " +0x8bbe: "She " +0x8bbf: "Fang " +0x8bc0: "Jue " +0x8bc1: "Zheng " +0x8bc2: "Gu " +0x8bc3: "He " +0x8bc4: "Ping " +0x8bc5: "Zu " +0x8bc6: "Shi " +0x8bc7: "Xiong " +0x8bc8: "Zha " +0x8bc9: "Su " +0x8bca: "Zhen " +0x8bcb: "Di " +0x8bcc: "Zou " +0x8bcd: "Ci " +0x8bce: "Qu " +0x8bcf: "Zhao " +0x8bd0: "Bi " +0x8bd1: "Yi " +0x8bd2: "Yi " +0x8bd3: "Kuang " +0x8bd4: "Lei " +0x8bd5: "Shi " +0x8bd6: "Gua " +0x8bd7: "Shi " +0x8bd8: "Jie " +0x8bd9: "Hui " +0x8bda: "Cheng " +0x8bdb: "Zhu " +0x8bdc: "Shen " +0x8bdd: "Hua " +0x8bde: "Dan " +0x8bdf: "Gou " +0x8be0: "Quan " +0x8be1: "Gui " +0x8be2: "Xun " +0x8be3: "Yi " +0x8be4: "Zheng " +0x8be5: "Gai " +0x8be6: "Xiang " +0x8be7: "Cha " +0x8be8: "Hun " +0x8be9: "Xu " +0x8bea: "Zhou " +0x8beb: "Jie " +0x8bec: "Wu " +0x8bed: "Yu " +0x8bee: "Qiao " +0x8bef: "Wu " +0x8bf0: "Gao " +0x8bf1: "You " +0x8bf2: "Hui " +0x8bf3: "Kuang " +0x8bf4: "Shuo " +0x8bf5: "Song " +0x8bf6: "Ai " +0x8bf7: "Qing " +0x8bf8: "Zhu " +0x8bf9: "Zou " +0x8bfa: "Nuo " +0x8bfb: "Du " +0x8bfc: "Zhuo " +0x8bfd: "Fei " +0x8bfe: "Ke " +0x8bff: "Wei " +/* x08c */ +0x8c00: "Yu " +0x8c01: "Shui " +0x8c02: "Shen " +0x8c03: "Diao " +0x8c04: "Chan " +0x8c05: "Liang " +0x8c06: "Zhun " +0x8c07: "Sui " +0x8c08: "Tan " +0x8c09: "Shen " +0x8c0a: "Yi " +0x8c0b: "Mou " +0x8c0c: "Chen " +0x8c0d: "Die " +0x8c0e: "Huang " +0x8c0f: "Jian " +0x8c10: "Xie " +0x8c11: "Nue " +0x8c12: "Ye " +0x8c13: "Wei " +0x8c14: "E " +0x8c15: "Yu " +0x8c16: "Xuan " +0x8c17: "Chan " +0x8c18: "Zi " +0x8c19: "An " +0x8c1a: "Yan " +0x8c1b: "Di " +0x8c1c: "Mi " +0x8c1d: "Pian " +0x8c1e: "Xu " +0x8c1f: "Mo " +0x8c20: "Dang " +0x8c21: "Su " +0x8c22: "Xie " +0x8c23: "Yao " +0x8c24: "Bang " +0x8c25: "Shi " +0x8c26: "Qian " +0x8c27: "Mi " +0x8c28: "Jin " +0x8c29: "Man " +0x8c2a: "Zhe " +0x8c2b: "Jian " +0x8c2c: "Miu " +0x8c2d: "Tan " +0x8c2e: "Zen " +0x8c2f: "Qiao " +0x8c30: "Lan " +0x8c31: "Pu " +0x8c32: "Jue " +0x8c33: "Yan " +0x8c34: "Qian " +0x8c35: "Zhan " +0x8c36: "Chen " +0x8c37: "Gu " +0x8c38: "Qian " +0x8c39: "Hong " +0x8c3a: "Xia " +0x8c3b: "Jue " +0x8c3c: "Hong " +0x8c3d: "Han " +0x8c3e: "Hong " +0x8c3f: "Xi " +0x8c40: "Xi " +0x8c41: "Huo " +0x8c42: "Liao " +0x8c43: "Han " +0x8c44: "Du " +0x8c45: "Long " +0x8c46: "Dou " +0x8c47: "Jiang " +0x8c48: "Qi " +0x8c49: "Shi " +0x8c4a: "Li " +0x8c4b: "Deng " +0x8c4c: "Wan " +0x8c4d: "Bi " +0x8c4e: "Shu " +0x8c4f: "Xian " +0x8c50: "Feng " +0x8c51: "Zhi " +0x8c52: "Zhi " +0x8c53: "Yan " +0x8c54: "Yan " +0x8c55: "Shi " +0x8c56: "Chu " +0x8c57: "Hui " +0x8c58: "Tun " +0x8c59: "Yi " +0x8c5a: "Tun " +0x8c5b: "Yi " +0x8c5c: "Jian " +0x8c5d: "Ba " +0x8c5e: "Hou " +0x8c5f: "E " +0x8c60: "Cu " +0x8c61: "Xiang " +0x8c62: "Huan " +0x8c63: "Jian " +0x8c64: "Ken " +0x8c65: "Gai " +0x8c66: "Qu " +0x8c67: "Fu " +0x8c68: "Xi " +0x8c69: "Bin " +0x8c6a: "Hao " +0x8c6b: "Yu " +0x8c6c: "Zhu " +0x8c6d: "Jia " +0x8c6e: "[?] " +0x8c6f: "Xi " +0x8c70: "Bo " +0x8c71: "Wen " +0x8c72: "Huan " +0x8c73: "Bin " +0x8c74: "Di " +0x8c75: "Zong " +0x8c76: "Fen " +0x8c77: "Yi " +0x8c78: "Zhi " +0x8c79: "Bao " +0x8c7a: "Chai " +0x8c7b: "Han " +0x8c7c: "Pi " +0x8c7d: "Na " +0x8c7e: "Pi " +0x8c7f: "Gou " +0x8c80: "Na " +0x8c81: "You " +0x8c82: "Diao " +0x8c83: "Mo " +0x8c84: "Si " +0x8c85: "Xiu " +0x8c86: "Huan " +0x8c87: "Kun " +0x8c88: "He " +0x8c89: "He " +0x8c8a: "Mo " +0x8c8b: "Han " +0x8c8c: "Mao " +0x8c8d: "Li " +0x8c8e: "Ni " +0x8c8f: "Bi " +0x8c90: "Yu " +0x8c91: "Jia " +0x8c92: "Tuan " +0x8c93: "Mao " +0x8c94: "Pi " +0x8c95: "Xi " +0x8c96: "E " +0x8c97: "Ju " +0x8c98: "Mo " +0x8c99: "Chu " +0x8c9a: "Tan " +0x8c9b: "Huan " +0x8c9c: "Jue " +0x8c9d: "Bei " +0x8c9e: "Zhen " +0x8c9f: "Yuan " +0x8ca0: "Fu " +0x8ca1: "Cai " +0x8ca2: "Gong " +0x8ca3: "Te " +0x8ca4: "Yi " +0x8ca5: "Hang " +0x8ca6: "Wan " +0x8ca7: "Pin " +0x8ca8: "Huo " +0x8ca9: "Fan " +0x8caa: "Tan " +0x8cab: "Guan " +0x8cac: "Ze " +0x8cad: "Zhi " +0x8cae: "Er " +0x8caf: "Zhu " +0x8cb0: "Shi " +0x8cb1: "Bi " +0x8cb2: "Zi " +0x8cb3: "Er " +0x8cb4: "Gui " +0x8cb5: "Pian " +0x8cb6: "Bian " +0x8cb7: "Mai " +0x8cb8: "Dai " +0x8cb9: "Sheng " +0x8cba: "Kuang " +0x8cbb: "Fei " +0x8cbc: "Tie " +0x8cbd: "Yi " +0x8cbe: "Chi " +0x8cbf: "Mao " +0x8cc0: "He " +0x8cc1: "Bi " +0x8cc2: "Lu " +0x8cc3: "Ren " +0x8cc4: "Hui " +0x8cc5: "Gai " +0x8cc6: "Pian " +0x8cc7: "Zi " +0x8cc8: "Jia " +0x8cc9: "Xu " +0x8cca: "Zei " +0x8ccb: "Jiao " +0x8ccc: "Gai " +0x8ccd: "Zang " +0x8cce: "Jian " +0x8ccf: "Ying " +0x8cd0: "Xun " +0x8cd1: "Zhen " +0x8cd2: "She " +0x8cd3: "Bin " +0x8cd4: "Bin " +0x8cd5: "Qiu " +0x8cd6: "She " +0x8cd7: "Chuan " +0x8cd8: "Zang " +0x8cd9: "Zhou " +0x8cda: "Lai " +0x8cdb: "Zan " +0x8cdc: "Si " +0x8cdd: "Chen " +0x8cde: "Shang " +0x8cdf: "Tian " +0x8ce0: "Pei " +0x8ce1: "Geng " +0x8ce2: "Xian " +0x8ce3: "Mai " +0x8ce4: "Jian " +0x8ce5: "Sui " +0x8ce6: "Fu " +0x8ce7: "Tan " +0x8ce8: "Cong " +0x8ce9: "Cong " +0x8cea: "Zhi " +0x8ceb: "Ji " +0x8cec: "Zhang " +0x8ced: "Du " +0x8cee: "Jin " +0x8cef: "Xiong " +0x8cf0: "Shun " +0x8cf1: "Yun " +0x8cf2: "Bao " +0x8cf3: "Zai " +0x8cf4: "Lai " +0x8cf5: "Feng " +0x8cf6: "Cang " +0x8cf7: "Ji " +0x8cf8: "Sheng " +0x8cf9: "Ai " +0x8cfa: "Zhuan " +0x8cfb: "Fu " +0x8cfc: "Gou " +0x8cfd: "Sai " +0x8cfe: "Ze " +0x8cff: "Liao " +/* x08d */ +0x8d00: "Wei " +0x8d01: "Bai " +0x8d02: "Chen " +0x8d03: "Zhuan " +0x8d04: "Zhi " +0x8d05: "Zhui " +0x8d06: "Biao " +0x8d07: "Yun " +0x8d08: "Zeng " +0x8d09: "Tan " +0x8d0a: "Zan " +0x8d0b: "Yan " +0x8d0c: "[?] " +0x8d0d: "Shan " +0x8d0e: "Wan " +0x8d0f: "Ying " +0x8d10: "Jin " +0x8d11: "Gan " +0x8d12: "Xian " +0x8d13: "Zang " +0x8d14: "Bi " +0x8d15: "Du " +0x8d16: "Shu " +0x8d17: "Yan " +0x8d18: "[?] " +0x8d19: "Xuan " +0x8d1a: "Long " +0x8d1b: "Gan " +0x8d1c: "Zang " +0x8d1d: "Bei " +0x8d1e: "Zhen " +0x8d1f: "Fu " +0x8d20: "Yuan " +0x8d21: "Gong " +0x8d22: "Cai " +0x8d23: "Ze " +0x8d24: "Xian " +0x8d25: "Bai " +0x8d26: "Zhang " +0x8d27: "Huo " +0x8d28: "Zhi " +0x8d29: "Fan " +0x8d2a: "Tan " +0x8d2b: "Pin " +0x8d2c: "Bian " +0x8d2d: "Gou " +0x8d2e: "Zhu " +0x8d2f: "Guan " +0x8d30: "Er " +0x8d31: "Jian " +0x8d32: "Bi " +0x8d33: "Shi " +0x8d34: "Tie " +0x8d35: "Gui " +0x8d36: "Kuang " +0x8d37: "Dai " +0x8d38: "Mao " +0x8d39: "Fei " +0x8d3a: "He " +0x8d3b: "Yi " +0x8d3c: "Zei " +0x8d3d: "Zhi " +0x8d3e: "Jia " +0x8d3f: "Hui " +0x8d40: "Zi " +0x8d41: "Ren " +0x8d42: "Lu " +0x8d43: "Zang " +0x8d44: "Zi " +0x8d45: "Gai " +0x8d46: "Jin " +0x8d47: "Qiu " +0x8d48: "Zhen " +0x8d49: "Lai " +0x8d4a: "She " +0x8d4b: "Fu " +0x8d4c: "Du " +0x8d4d: "Ji " +0x8d4e: "Shu " +0x8d4f: "Shang " +0x8d50: "Si " +0x8d51: "Bi " +0x8d52: "Zhou " +0x8d53: "Geng " +0x8d54: "Pei " +0x8d55: "Tan " +0x8d56: "Lai " +0x8d57: "Feng " +0x8d58: "Zhui " +0x8d59: "Fu " +0x8d5a: "Zhuan " +0x8d5b: "Sai " +0x8d5c: "Ze " +0x8d5d: "Yan " +0x8d5e: "Zan " +0x8d5f: "Yun " +0x8d60: "Zeng " +0x8d61: "Shan " +0x8d62: "Ying " +0x8d63: "Gan " +0x8d64: "Chi " +0x8d65: "Xi " +0x8d66: "She " +0x8d67: "Nan " +0x8d68: "Xiong " +0x8d69: "Xi " +0x8d6a: "Cheng " +0x8d6b: "He " +0x8d6c: "Cheng " +0x8d6d: "Zhe " +0x8d6e: "Xia " +0x8d6f: "Tang " +0x8d70: "Zou " +0x8d71: "Zou " +0x8d72: "Li " +0x8d73: "Jiu " +0x8d74: "Fu " +0x8d75: "Zhao " +0x8d76: "Gan " +0x8d77: "Qi " +0x8d78: "Shan " +0x8d79: "Qiong " +0x8d7a: "Qin " +0x8d7b: "Xian " +0x8d7c: "Ci " +0x8d7d: "Jue " +0x8d7e: "Qin " +0x8d7f: "Chi " +0x8d80: "Ci " +0x8d81: "Chen " +0x8d82: "Chen " +0x8d83: "Die " +0x8d84: "Ju " +0x8d85: "Chao " +0x8d86: "Di " +0x8d87: "Se " +0x8d88: "Zhan " +0x8d89: "Zhu " +0x8d8a: "Yue " +0x8d8b: "Qu " +0x8d8c: "Jie " +0x8d8d: "Chi " +0x8d8e: "Chu " +0x8d8f: "Gua " +0x8d90: "Xue " +0x8d91: "Ci " +0x8d92: "Tiao " +0x8d93: "Duo " +0x8d94: "Lie " +0x8d95: "Gan " +0x8d96: "Suo " +0x8d97: "Cu " +0x8d98: "Xi " +0x8d99: "Zhao " +0x8d9a: "Su " +0x8d9b: "Yin " +0x8d9c: "Ju " +0x8d9d: "Jian " +0x8d9e: "Que " +0x8d9f: "Tang " +0x8da0: "Chuo " +0x8da1: "Cui " +0x8da2: "Lu " +0x8da3: "Qu " +0x8da4: "Dang " +0x8da5: "Qiu " +0x8da6: "Zi " +0x8da7: "Ti " +0x8da8: "Qu " +0x8da9: "Chi " +0x8daa: "Huang " +0x8dab: "Qiao " +0x8dac: "Qiao " +0x8dad: "Yao " +0x8dae: "Zao " +0x8daf: "Ti " +0x8db0: "[?] " +0x8db1: "Zan " +0x8db2: "Zan " +0x8db3: "Zu " +0x8db4: "Pa " +0x8db5: "Bao " +0x8db6: "Ku " +0x8db7: "Ke " +0x8db8: "Dun " +0x8db9: "Jue " +0x8dba: "Fu " +0x8dbb: "Chen " +0x8dbc: "Jian " +0x8dbd: "Fang " +0x8dbe: "Zhi " +0x8dbf: "Sa " +0x8dc0: "Yue " +0x8dc1: "Pa " +0x8dc2: "Qi " +0x8dc3: "Yue " +0x8dc4: "Qiang " +0x8dc5: "Tuo " +0x8dc6: "Tai " +0x8dc7: "Yi " +0x8dc8: "Nian " +0x8dc9: "Ling " +0x8dca: "Mei " +0x8dcb: "Ba " +0x8dcc: "Die " +0x8dcd: "Ku " +0x8dce: "Tuo " +0x8dcf: "Jia " +0x8dd0: "Ci " +0x8dd1: "Pao " +0x8dd2: "Qia " +0x8dd3: "Zhu " +0x8dd4: "Ju " +0x8dd5: "Die " +0x8dd6: "Zhi " +0x8dd7: "Fu " +0x8dd8: "Pan " +0x8dd9: "Ju " +0x8dda: "Shan " +0x8ddb: "Bo " +0x8ddc: "Ni " +0x8ddd: "Ju " +0x8dde: "Li " +0x8ddf: "Gen " +0x8de0: "Yi " +0x8de1: "Ji " +0x8de2: "Dai " +0x8de3: "Xian " +0x8de4: "Jiao " +0x8de5: "Duo " +0x8de6: "Zhu " +0x8de7: "Zhuan " +0x8de8: "Kua " +0x8de9: "Zhuai " +0x8dea: "Gui " +0x8deb: "Qiong " +0x8dec: "Kui " +0x8ded: "Xiang " +0x8dee: "Chi " +0x8def: "Lu " +0x8df0: "Beng " +0x8df1: "Zhi " +0x8df2: "Jia " +0x8df3: "Tiao " +0x8df4: "Cai " +0x8df5: "Jian " +0x8df6: "Ta " +0x8df7: "Qiao " +0x8df8: "Bi " +0x8df9: "Xian " +0x8dfa: "Duo " +0x8dfb: "Ji " +0x8dfc: "Ju " +0x8dfd: "Ji " +0x8dfe: "Shu " +0x8dff: "Tu " +/* x08e */ +0x8e00: "Chu " +0x8e01: "Jing " +0x8e02: "Nie " +0x8e03: "Xiao " +0x8e04: "Bo " +0x8e05: "Chi " +0x8e06: "Qun " +0x8e07: "Mou " +0x8e08: "Shu " +0x8e09: "Lang " +0x8e0a: "Yong " +0x8e0b: "Jiao " +0x8e0c: "Chou " +0x8e0d: "Qiao " +0x8e0e: "[?] " +0x8e0f: "Ta " +0x8e10: "Jian " +0x8e11: "Qi " +0x8e12: "Wo " +0x8e13: "Wei " +0x8e14: "Zhuo " +0x8e15: "Jie " +0x8e16: "Ji " +0x8e17: "Nie " +0x8e18: "Ju " +0x8e19: "Ju " +0x8e1a: "Lun " +0x8e1b: "Lu " +0x8e1c: "Leng " +0x8e1d: "Huai " +0x8e1e: "Ju " +0x8e1f: "Chi " +0x8e20: "Wan " +0x8e21: "Quan " +0x8e22: "Ti " +0x8e23: "Bo " +0x8e24: "Zu " +0x8e25: "Qie " +0x8e26: "Ji " +0x8e27: "Cu " +0x8e28: "Zong " +0x8e29: "Cai " +0x8e2a: "Zong " +0x8e2b: "Peng " +0x8e2c: "Zhi " +0x8e2d: "Zheng " +0x8e2e: "Dian " +0x8e2f: "Zhi " +0x8e30: "Yu " +0x8e31: "Duo " +0x8e32: "Dun " +0x8e33: "Chun " +0x8e34: "Yong " +0x8e35: "Zhong " +0x8e36: "Di " +0x8e37: "Zhe " +0x8e38: "Chen " +0x8e39: "Chuai " +0x8e3a: "Jian " +0x8e3b: "Gua " +0x8e3c: "Tang " +0x8e3d: "Ju " +0x8e3e: "Fu " +0x8e3f: "Zu " +0x8e40: "Die " +0x8e41: "Pian " +0x8e42: "Rou " +0x8e43: "Nuo " +0x8e44: "Ti " +0x8e45: "Cha " +0x8e46: "Tui " +0x8e47: "Jian " +0x8e48: "Dao " +0x8e49: "Cuo " +0x8e4a: "Xi " +0x8e4b: "Ta " +0x8e4c: "Qiang " +0x8e4d: "Zhan " +0x8e4e: "Dian " +0x8e4f: "Ti " +0x8e50: "Ji " +0x8e51: "Nie " +0x8e52: "Man " +0x8e53: "Liu " +0x8e54: "Zhan " +0x8e55: "Bi " +0x8e56: "Chong " +0x8e57: "Lu " +0x8e58: "Liao " +0x8e59: "Cu " +0x8e5a: "Tang " +0x8e5b: "Dai " +0x8e5c: "Suo " +0x8e5d: "Xi " +0x8e5e: "Kui " +0x8e5f: "Ji " +0x8e60: "Zhi " +0x8e61: "Qiang " +0x8e62: "Di " +0x8e63: "Man " +0x8e64: "Zong " +0x8e65: "Lian " +0x8e66: "Beng " +0x8e67: "Zao " +0x8e68: "Nian " +0x8e69: "Bie " +0x8e6a: "Tui " +0x8e6b: "Ju " +0x8e6c: "Deng " +0x8e6d: "Ceng " +0x8e6e: "Xian " +0x8e6f: "Fan " +0x8e70: "Chu " +0x8e71: "Zhong " +0x8e72: "Dun " +0x8e73: "Bo " +0x8e74: "Cu " +0x8e75: "Zu " +0x8e76: "Jue " +0x8e77: "Jue " +0x8e78: "Lin " +0x8e79: "Ta " +0x8e7a: "Qiao " +0x8e7b: "Qiao " +0x8e7c: "Pu " +0x8e7d: "Liao " +0x8e7e: "Dun " +0x8e7f: "Cuan " +0x8e80: "Kuang " +0x8e81: "Zao " +0x8e82: "Ta " +0x8e83: "Bi " +0x8e84: "Bi " +0x8e85: "Zhu " +0x8e86: "Ju " +0x8e87: "Chu " +0x8e88: "Qiao " +0x8e89: "Dun " +0x8e8a: "Chou " +0x8e8b: "Ji " +0x8e8c: "Wu " +0x8e8d: "Yue " +0x8e8e: "Nian " +0x8e8f: "Lin " +0x8e90: "Lie " +0x8e91: "Zhi " +0x8e92: "Li " +0x8e93: "Zhi " +0x8e94: "Chan " +0x8e95: "Chu " +0x8e96: "Duan " +0x8e97: "Wei " +0x8e98: "Long " +0x8e99: "Lin " +0x8e9a: "Xian " +0x8e9b: "Wei " +0x8e9c: "Zuan " +0x8e9d: "Lan " +0x8e9e: "Xie " +0x8e9f: "Rang " +0x8ea0: "Xie " +0x8ea1: "Nie " +0x8ea2: "Ta " +0x8ea3: "Qu " +0x8ea4: "Jie " +0x8ea5: "Cuan " +0x8ea6: "Zuan " +0x8ea7: "Xi " +0x8ea8: "Kui " +0x8ea9: "Jue " +0x8eaa: "Lin " +0x8eab: "Shen " +0x8eac: "Gong " +0x8ead: "Dan " +0x8eae: "Segare " +0x8eaf: "Qu " +0x8eb0: "Ti " +0x8eb1: "Duo " +0x8eb2: "Duo " +0x8eb3: "Gong " +0x8eb4: "Lang " +0x8eb5: "Nerau " +0x8eb6: "Luo " +0x8eb7: "Ai " +0x8eb8: "Ji " +0x8eb9: "Ju " +0x8eba: "Tang " +0x8ebb: "Utsuke " +0x8ebc: "[?] " +0x8ebd: "Yan " +0x8ebe: "Shitsuke " +0x8ebf: "Kang " +0x8ec0: "Qu " +0x8ec1: "Lou " +0x8ec2: "Lao " +0x8ec3: "Tuo " +0x8ec4: "Zhi " +0x8ec5: "Yagate " +0x8ec6: "Ti " +0x8ec7: "Dao " +0x8ec8: "Yagate " +0x8ec9: "Yu " +0x8eca: "Che " +0x8ecb: "Ya " +0x8ecc: "Gui " +0x8ecd: "Jun " +0x8ece: "Wei " +0x8ecf: "Yue " +0x8ed0: "Xin " +0x8ed1: "Di " +0x8ed2: "Xuan " +0x8ed3: "Fan " +0x8ed4: "Ren " +0x8ed5: "Shan " +0x8ed6: "Qiang " +0x8ed7: "Shu " +0x8ed8: "Tun " +0x8ed9: "Chen " +0x8eda: "Dai " +0x8edb: "E " +0x8edc: "Na " +0x8edd: "Qi " +0x8ede: "Mao " +0x8edf: "Ruan " +0x8ee0: "Ren " +0x8ee1: "Fan " +0x8ee2: "Zhuan " +0x8ee3: "Hong " +0x8ee4: "Hu " +0x8ee5: "Qu " +0x8ee6: "Huang " +0x8ee7: "Di " +0x8ee8: "Ling " +0x8ee9: "Dai " +0x8eea: "Ao " +0x8eeb: "Zhen " +0x8eec: "Fan " +0x8eed: "Kuang " +0x8eee: "Ang " +0x8eef: "Peng " +0x8ef0: "Bei " +0x8ef1: "Gu " +0x8ef2: "Ku " +0x8ef3: "Pao " +0x8ef4: "Zhu " +0x8ef5: "Rong " +0x8ef6: "E " +0x8ef7: "Ba " +0x8ef8: "Zhou " +0x8ef9: "Zhi " +0x8efa: "Yao " +0x8efb: "Ke " +0x8efc: "Yi " +0x8efd: "Qing " +0x8efe: "Shi " +0x8eff: "Ping " +/* x08f */ +0x8f00: "Er " +0x8f01: "Qiong " +0x8f02: "Ju " +0x8f03: "Jiao " +0x8f04: "Guang " +0x8f05: "Lu " +0x8f06: "Kai " +0x8f07: "Quan " +0x8f08: "Zhou " +0x8f09: "Zai " +0x8f0a: "Zhi " +0x8f0b: "She " +0x8f0c: "Liang " +0x8f0d: "Yu " +0x8f0e: "Shao " +0x8f0f: "You " +0x8f10: "Huan " +0x8f11: "Yun " +0x8f12: "Zhe " +0x8f13: "Wan " +0x8f14: "Fu " +0x8f15: "Qing " +0x8f16: "Zhou " +0x8f17: "Ni " +0x8f18: "Ling " +0x8f19: "Zhe " +0x8f1a: "Zhan " +0x8f1b: "Liang " +0x8f1c: "Zi " +0x8f1d: "Hui " +0x8f1e: "Wang " +0x8f1f: "Chuo " +0x8f20: "Guo " +0x8f21: "Kan " +0x8f22: "Yi " +0x8f23: "Peng " +0x8f24: "Qian " +0x8f25: "Gun " +0x8f26: "Nian " +0x8f27: "Pian " +0x8f28: "Guan " +0x8f29: "Bei " +0x8f2a: "Lun " +0x8f2b: "Pai " +0x8f2c: "Liang " +0x8f2d: "Ruan " +0x8f2e: "Rou " +0x8f2f: "Ji " +0x8f30: "Yang " +0x8f31: "Xian " +0x8f32: "Chuan " +0x8f33: "Cou " +0x8f34: "Qun " +0x8f35: "Ge " +0x8f36: "You " +0x8f37: "Hong " +0x8f38: "Shu " +0x8f39: "Fu " +0x8f3a: "Zi " +0x8f3b: "Fu " +0x8f3c: "Wen " +0x8f3d: "Ben " +0x8f3e: "Zhan " +0x8f3f: "Yu " +0x8f40: "Wen " +0x8f41: "Tao " +0x8f42: "Gu " +0x8f43: "Zhen " +0x8f44: "Xia " +0x8f45: "Yuan " +0x8f46: "Lu " +0x8f47: "Jiu " +0x8f48: "Chao " +0x8f49: "Zhuan " +0x8f4a: "Wei " +0x8f4b: "Hun " +0x8f4c: "Sori " +0x8f4d: "Che " +0x8f4e: "Jiao " +0x8f4f: "Zhan " +0x8f50: "Pu " +0x8f51: "Lao " +0x8f52: "Fen " +0x8f53: "Fan " +0x8f54: "Lin " +0x8f55: "Ge " +0x8f56: "Se " +0x8f57: "Kan " +0x8f58: "Huan " +0x8f59: "Yi " +0x8f5a: "Ji " +0x8f5b: "Dui " +0x8f5c: "Er " +0x8f5d: "Yu " +0x8f5e: "Xian " +0x8f5f: "Hong " +0x8f60: "Lei " +0x8f61: "Pei " +0x8f62: "Li " +0x8f63: "Li " +0x8f64: "Lu " +0x8f65: "Lin " +0x8f66: "Che " +0x8f67: "Ya " +0x8f68: "Gui " +0x8f69: "Xuan " +0x8f6a: "Di " +0x8f6b: "Ren " +0x8f6c: "Zhuan " +0x8f6d: "E " +0x8f6e: "Lun " +0x8f6f: "Ruan " +0x8f70: "Hong " +0x8f71: "Ku " +0x8f72: "Ke " +0x8f73: "Lu " +0x8f74: "Zhou " +0x8f75: "Zhi " +0x8f76: "Yi " +0x8f77: "Hu " +0x8f78: "Zhen " +0x8f79: "Li " +0x8f7a: "Yao " +0x8f7b: "Qing " +0x8f7c: "Shi " +0x8f7d: "Zai " +0x8f7e: "Zhi " +0x8f7f: "Jiao " +0x8f80: "Zhou " +0x8f81: "Quan " +0x8f82: "Lu " +0x8f83: "Jiao " +0x8f84: "Zhe " +0x8f85: "Fu " +0x8f86: "Liang " +0x8f87: "Nian " +0x8f88: "Bei " +0x8f89: "Hui " +0x8f8a: "Gun " +0x8f8b: "Wang " +0x8f8c: "Liang " +0x8f8d: "Chuo " +0x8f8e: "Zi " +0x8f8f: "Cou " +0x8f90: "Fu " +0x8f91: "Ji " +0x8f92: "Wen " +0x8f93: "Shu " +0x8f94: "Pei " +0x8f95: "Yuan " +0x8f96: "Xia " +0x8f97: "Zhan " +0x8f98: "Lu " +0x8f99: "Che " +0x8f9a: "Lin " +0x8f9b: "Xin " +0x8f9c: "Gu " +0x8f9d: "Ci " +0x8f9e: "Ci " +0x8f9f: "Pi " +0x8fa0: "Zui " +0x8fa1: "Bian " +0x8fa2: "La " +0x8fa3: "La " +0x8fa4: "Ci " +0x8fa5: "Xue " +0x8fa6: "Ban " +0x8fa7: "Bian " +0x8fa8: "Bian " +0x8fa9: "Bian " +0x8faa: "[?] " +0x8fab: "Bian " +0x8fac: "Ban " +0x8fad: "Ci " +0x8fae: "Bian " +0x8faf: "Bian " +0x8fb0: "Chen " +0x8fb1: "Ru " +0x8fb2: "Nong " +0x8fb3: "Nong " +0x8fb4: "Zhen " +0x8fb5: "Chuo " +0x8fb6: "Chuo " +0x8fb7: "Suberu " +0x8fb8: "Reng " +0x8fb9: "Bian " +0x8fba: "Bian " +0x8fbb: "Sip " +0x8fbc: "Ip " +0x8fbd: "Liao " +0x8fbe: "Da " +0x8fbf: "Chan " +0x8fc0: "Gan " +0x8fc1: "Qian " +0x8fc2: "Yu " +0x8fc3: "Yu " +0x8fc4: "Qi " +0x8fc5: "Xun " +0x8fc6: "Yi " +0x8fc7: "Guo " +0x8fc8: "Mai " +0x8fc9: "Qi " +0x8fca: "Za " +0x8fcb: "Wang " +0x8fcc: "Jia " +0x8fcd: "Zhun " +0x8fce: "Ying " +0x8fcf: "Ti " +0x8fd0: "Yun " +0x8fd1: "Jin " +0x8fd2: "Hang " +0x8fd3: "Ya " +0x8fd4: "Fan " +0x8fd5: "Wu " +0x8fd6: "Da " +0x8fd7: "E " +0x8fd8: "Huan " +0x8fd9: "Zhe " +0x8fda: "Totemo " +0x8fdb: "Jin " +0x8fdc: "Yuan " +0x8fdd: "Wei " +0x8fde: "Lian " +0x8fdf: "Chi " +0x8fe0: "Che " +0x8fe1: "Ni " +0x8fe2: "Tiao " +0x8fe3: "Zhi " +0x8fe4: "Yi " +0x8fe5: "Jiong " +0x8fe6: "Jia " +0x8fe7: "Chen " +0x8fe8: "Dai " +0x8fe9: "Er " +0x8fea: "Di " +0x8feb: "Po " +0x8fec: "Wang " +0x8fed: "Die " +0x8fee: "Ze " +0x8fef: "Tao " +0x8ff0: "Shu " +0x8ff1: "Tuo " +0x8ff2: "Kep " +0x8ff3: "Jing " +0x8ff4: "Hui " +0x8ff5: "Tong " +0x8ff6: "You " +0x8ff7: "Mi " +0x8ff8: "Beng " +0x8ff9: "Ji " +0x8ffa: "Nai " +0x8ffb: "Yi " +0x8ffc: "Jie " +0x8ffd: "Zhui " +0x8ffe: "Lie " +0x8fff: "Xun " +/* x090 */ +0x9000: "Tui " +0x9001: "Song " +0x9002: "Gua " +0x9003: "Tao " +0x9004: "Pang " +0x9005: "Hou " +0x9006: "Ni " +0x9007: "Dun " +0x9008: "Jiong " +0x9009: "Xuan " +0x900a: "Xun " +0x900b: "Bu " +0x900c: "You " +0x900d: "Xiao " +0x900e: "Qiu " +0x900f: "Tou " +0x9010: "Zhu " +0x9011: "Qiu " +0x9012: "Di " +0x9013: "Di " +0x9014: "Tu " +0x9015: "Jing " +0x9016: "Ti " +0x9017: "Dou " +0x9018: "Yi " +0x9019: "Zhe " +0x901a: "Tong " +0x901b: "Guang " +0x901c: "Wu " +0x901d: "Shi " +0x901e: "Cheng " +0x901f: "Su " +0x9020: "Zao " +0x9021: "Qun " +0x9022: "Feng " +0x9023: "Lian " +0x9024: "Suo " +0x9025: "Hui " +0x9026: "Li " +0x9027: "Sako " +0x9028: "Lai " +0x9029: "Ben " +0x902a: "Cuo " +0x902b: "Jue " +0x902c: "Beng " +0x902d: "Huan " +0x902e: "Dai " +0x902f: "Lu " +0x9030: "You " +0x9031: "Zhou " +0x9032: "Jin " +0x9033: "Yu " +0x9034: "Chuo " +0x9035: "Kui " +0x9036: "Wei " +0x9037: "Ti " +0x9038: "Yi " +0x9039: "Da " +0x903a: "Yuan " +0x903b: "Luo " +0x903c: "Bi " +0x903d: "Nuo " +0x903e: "Yu " +0x903f: "Dang " +0x9040: "Sui " +0x9041: "Dun " +0x9042: "Sui " +0x9043: "Yan " +0x9044: "Chuan " +0x9045: "Chi " +0x9046: "Ti " +0x9047: "Yu " +0x9048: "Shi " +0x9049: "Zhen " +0x904a: "You " +0x904b: "Yun " +0x904c: "E " +0x904d: "Bian " +0x904e: "Guo " +0x904f: "E " +0x9050: "Xia " +0x9051: "Huang " +0x9052: "Qiu " +0x9053: "Dao " +0x9054: "Da " +0x9055: "Wei " +0x9056: "Appare " +0x9057: "Yi " +0x9058: "Gou " +0x9059: "Yao " +0x905a: "Chu " +0x905b: "Liu " +0x905c: "Xun " +0x905d: "Ta " +0x905e: "Di " +0x905f: "Chi " +0x9060: "Yuan " +0x9061: "Su " +0x9062: "Ta " +0x9063: "Qian " +0x9064: "[?] " +0x9065: "Yao " +0x9066: "Guan " +0x9067: "Zhang " +0x9068: "Ao " +0x9069: "Shi " +0x906a: "Ce " +0x906b: "Chi " +0x906c: "Su " +0x906d: "Zao " +0x906e: "Zhe " +0x906f: "Dun " +0x9070: "Di " +0x9071: "Lou " +0x9072: "Chi " +0x9073: "Cuo " +0x9074: "Lin " +0x9075: "Zun " +0x9076: "Rao " +0x9077: "Qian " +0x9078: "Xuan " +0x9079: "Yu " +0x907a: "Yi " +0x907b: "Wu " +0x907c: "Liao " +0x907d: "Ju " +0x907e: "Shi " +0x907f: "Bi " +0x9080: "Yao " +0x9081: "Mai " +0x9082: "Xie " +0x9083: "Sui " +0x9084: "Huan " +0x9085: "Zhan " +0x9086: "Teng " +0x9087: "Er " +0x9088: "Miao " +0x9089: "Bian " +0x908a: "Bian " +0x908b: "La " +0x908c: "Li " +0x908d: "Yuan " +0x908e: "Yao " +0x908f: "Luo " +0x9090: "Li " +0x9091: "Yi " +0x9092: "Ting " +0x9093: "Deng " +0x9094: "Qi " +0x9095: "Yong " +0x9096: "Shan " +0x9097: "Han " +0x9098: "Yu " +0x9099: "Mang " +0x909a: "Ru " +0x909b: "Qiong " +0x909c: "[?] " +0x909d: "Kuang " +0x909e: "Fu " +0x909f: "Kang " +0x90a0: "Bin " +0x90a1: "Fang " +0x90a2: "Xing " +0x90a3: "Na " +0x90a4: "Xin " +0x90a5: "Shen " +0x90a6: "Bang " +0x90a7: "Yuan " +0x90a8: "Cun " +0x90a9: "Huo " +0x90aa: "Xie " +0x90ab: "Bang " +0x90ac: "Wu " +0x90ad: "Ju " +0x90ae: "You " +0x90af: "Han " +0x90b0: "Tai " +0x90b1: "Qiu " +0x90b2: "Bi " +0x90b3: "Pei " +0x90b4: "Bing " +0x90b5: "Shao " +0x90b6: "Bei " +0x90b7: "Wa " +0x90b8: "Di " +0x90b9: "Zou " +0x90ba: "Ye " +0x90bb: "Lin " +0x90bc: "Kuang " +0x90bd: "Gui " +0x90be: "Zhu " +0x90bf: "Shi " +0x90c0: "Ku " +0x90c1: "Yu " +0x90c2: "Gai " +0x90c3: "Ge " +0x90c4: "Xi " +0x90c5: "Zhi " +0x90c6: "Ji " +0x90c7: "Xun " +0x90c8: "Hou " +0x90c9: "Xing " +0x90ca: "Jiao " +0x90cb: "Xi " +0x90cc: "Gui " +0x90cd: "Nuo " +0x90ce: "Lang " +0x90cf: "Jia " +0x90d0: "Kuai " +0x90d1: "Zheng " +0x90d2: "Otoko " +0x90d3: "Yun " +0x90d4: "Yan " +0x90d5: "Cheng " +0x90d6: "Dou " +0x90d7: "Chi " +0x90d8: "Lu " +0x90d9: "Fu " +0x90da: "Wu " +0x90db: "Fu " +0x90dc: "Gao " +0x90dd: "Hao " +0x90de: "Lang " +0x90df: "Jia " +0x90e0: "Geng " +0x90e1: "Jun " +0x90e2: "Ying " +0x90e3: "Bo " +0x90e4: "Xi " +0x90e5: "Bei " +0x90e6: "Li " +0x90e7: "Yun " +0x90e8: "Bu " +0x90e9: "Xiao " +0x90ea: "Qi " +0x90eb: "Pi " +0x90ec: "Qing " +0x90ed: "Guo " +0x90ee: "Zhou " +0x90ef: "Tan " +0x90f0: "Zou " +0x90f1: "Ping " +0x90f2: "Lai " +0x90f3: "Ni " +0x90f4: "Chen " +0x90f5: "You " +0x90f6: "Bu " +0x90f7: "Xiang " +0x90f8: "Dan " +0x90f9: "Ju " +0x90fa: "Yong " +0x90fb: "Qiao " +0x90fc: "Yi " +0x90fd: "Du " +0x90fe: "Yan " +0x90ff: "Mei " +/* x091 */ +0x9100: "Ruo " +0x9101: "Bei " +0x9102: "E " +0x9103: "Yu " +0x9104: "Juan " +0x9105: "Yu " +0x9106: "Yun " +0x9107: "Hou " +0x9108: "Kui " +0x9109: "Xiang " +0x910a: "Xiang " +0x910b: "Sou " +0x910c: "Tang " +0x910d: "Ming " +0x910e: "Xi " +0x910f: "Ru " +0x9110: "Chu " +0x9111: "Zi " +0x9112: "Zou " +0x9113: "Ju " +0x9114: "Wu " +0x9115: "Xiang " +0x9116: "Yun " +0x9117: "Hao " +0x9118: "Yong " +0x9119: "Bi " +0x911a: "Mo " +0x911b: "Chao " +0x911c: "Fu " +0x911d: "Liao " +0x911e: "Yin " +0x911f: "Zhuan " +0x9120: "Hu " +0x9121: "Qiao " +0x9122: "Yan " +0x9123: "Zhang " +0x9124: "Fan " +0x9125: "Qiao " +0x9126: "Xu " +0x9127: "Deng " +0x9128: "Bi " +0x9129: "Xin " +0x912a: "Bi " +0x912b: "Ceng " +0x912c: "Wei " +0x912d: "Zheng " +0x912e: "Mao " +0x912f: "Shan " +0x9130: "Lin " +0x9131: "Po " +0x9132: "Dan " +0x9133: "Meng " +0x9134: "Ye " +0x9135: "Cao " +0x9136: "Kuai " +0x9137: "Feng " +0x9138: "Meng " +0x9139: "Zou " +0x913a: "Kuang " +0x913b: "Lian " +0x913c: "Zan " +0x913d: "Chan " +0x913e: "You " +0x913f: "Qi " +0x9140: "Yan " +0x9141: "Chan " +0x9142: "Zan " +0x9143: "Ling " +0x9144: "Huan " +0x9145: "Xi " +0x9146: "Feng " +0x9147: "Zan " +0x9148: "Li " +0x9149: "You " +0x914a: "Ding " +0x914b: "Qiu " +0x914c: "Zhuo " +0x914d: "Pei " +0x914e: "Zhou " +0x914f: "Yi " +0x9150: "Hang " +0x9151: "Yu " +0x9152: "Jiu " +0x9153: "Yan " +0x9154: "Zui " +0x9155: "Mao " +0x9156: "Dan " +0x9157: "Xu " +0x9158: "Tou " +0x9159: "Zhen " +0x915a: "Fen " +0x915b: "Sakenomoto " +0x915c: "[?] " +0x915d: "Yun " +0x915e: "Tai " +0x915f: "Tian " +0x9160: "Qia " +0x9161: "Tuo " +0x9162: "Zuo " +0x9163: "Han " +0x9164: "Gu " +0x9165: "Su " +0x9166: "Po " +0x9167: "Chou " +0x9168: "Zai " +0x9169: "Ming " +0x916a: "Luo " +0x916b: "Chuo " +0x916c: "Chou " +0x916d: "You " +0x916e: "Tong " +0x916f: "Zhi " +0x9170: "Xian " +0x9171: "Jiang " +0x9172: "Cheng " +0x9173: "Yin " +0x9174: "Tu " +0x9175: "Xiao " +0x9176: "Mei " +0x9177: "Ku " +0x9178: "Suan " +0x9179: "Lei " +0x917a: "Pu " +0x917b: "Zui " +0x917c: "Hai " +0x917d: "Yan " +0x917e: "Xi " +0x917f: "Niang " +0x9180: "Wei " +0x9181: "Lu " +0x9182: "Lan " +0x9183: "Yan " +0x9184: "Tao " +0x9185: "Pei " +0x9186: "Zhan " +0x9187: "Chun " +0x9188: "Tan " +0x9189: "Zui " +0x918a: "Chuo " +0x918b: "Cu " +0x918c: "Kun " +0x918d: "Ti " +0x918e: "Mian " +0x918f: "Du " +0x9190: "Hu " +0x9191: "Xu " +0x9192: "Xing " +0x9193: "Tan " +0x9194: "Jiu " +0x9195: "Chun " +0x9196: "Yun " +0x9197: "Po " +0x9198: "Ke " +0x9199: "Sou " +0x919a: "Mi " +0x919b: "Quan " +0x919c: "Chou " +0x919d: "Cuo " +0x919e: "Yun " +0x919f: "Yong " +0x91a0: "Ang " +0x91a1: "Zha " +0x91a2: "Hai " +0x91a3: "Tang " +0x91a4: "Jiang " +0x91a5: "Piao " +0x91a6: "Shan " +0x91a7: "Yu " +0x91a8: "Li " +0x91a9: "Zao " +0x91aa: "Lao " +0x91ab: "Yi " +0x91ac: "Jiang " +0x91ad: "Pu " +0x91ae: "Jiao " +0x91af: "Xi " +0x91b0: "Tan " +0x91b1: "Po " +0x91b2: "Nong " +0x91b3: "Yi " +0x91b4: "Li " +0x91b5: "Ju " +0x91b6: "Jiao " +0x91b7: "Yi " +0x91b8: "Niang " +0x91b9: "Ru " +0x91ba: "Xun " +0x91bb: "Chou " +0x91bc: "Yan " +0x91bd: "Ling " +0x91be: "Mi " +0x91bf: "Mi " +0x91c0: "Niang " +0x91c1: "Xin " +0x91c2: "Jiao " +0x91c3: "Xi " +0x91c4: "Mi " +0x91c5: "Yan " +0x91c6: "Bian " +0x91c7: "Cai " +0x91c8: "Shi " +0x91c9: "You " +0x91ca: "Shi " +0x91cb: "Shi " +0x91cc: "Li " +0x91cd: "Zhong " +0x91ce: "Ye " +0x91cf: "Liang " +0x91d0: "Li " +0x91d1: "Jin " +0x91d2: "Jin " +0x91d3: "Qiu " +0x91d4: "Yi " +0x91d5: "Diao " +0x91d6: "Dao " +0x91d7: "Zhao " +0x91d8: "Ding " +0x91d9: "Po " +0x91da: "Qiu " +0x91db: "He " +0x91dc: "Fu " +0x91dd: "Zhen " +0x91de: "Zhi " +0x91df: "Ba " +0x91e0: "Luan " +0x91e1: "Fu " +0x91e2: "Nai " +0x91e3: "Diao " +0x91e4: "Shan " +0x91e5: "Qiao " +0x91e6: "Kou " +0x91e7: "Chuan " +0x91e8: "Zi " +0x91e9: "Fan " +0x91ea: "Yu " +0x91eb: "Hua " +0x91ec: "Han " +0x91ed: "Gong " +0x91ee: "Qi " +0x91ef: "Mang " +0x91f0: "Ri " +0x91f1: "Di " +0x91f2: "Si " +0x91f3: "Xi " +0x91f4: "Yi " +0x91f5: "Chai " +0x91f6: "Shi " +0x91f7: "Tu " +0x91f8: "Xi " +0x91f9: "Nu " +0x91fa: "Qian " +0x91fb: "Ishiyumi " +0x91fc: "Jian " +0x91fd: "Pi " +0x91fe: "Ye " +0x91ff: "Yin " +/* x092 */ +0x9200: "Ba " +0x9201: "Fang " +0x9202: "Chen " +0x9203: "Xing " +0x9204: "Tou " +0x9205: "Yue " +0x9206: "Yan " +0x9207: "Fu " +0x9208: "Pi " +0x9209: "Na " +0x920a: "Xin " +0x920b: "E " +0x920c: "Jue " +0x920d: "Dun " +0x920e: "Gou " +0x920f: "Yin " +0x9210: "Qian " +0x9211: "Ban " +0x9212: "Ji " +0x9213: "Ren " +0x9214: "Chao " +0x9215: "Niu " +0x9216: "Fen " +0x9217: "Yun " +0x9218: "Ji " +0x9219: "Qin " +0x921a: "Pi " +0x921b: "Guo " +0x921c: "Hong " +0x921d: "Yin " +0x921e: "Jun " +0x921f: "Shi " +0x9220: "Yi " +0x9221: "Zhong " +0x9222: "Nie " +0x9223: "Gai " +0x9224: "Ri " +0x9225: "Huo " +0x9226: "Tai " +0x9227: "Kang " +0x9228: "Habaki " +0x9229: "Irori " +0x922a: "Ngaak " +0x922b: "[?] " +0x922c: "Duo " +0x922d: "Zi " +0x922e: "Ni " +0x922f: "Tu " +0x9230: "Shi " +0x9231: "Min " +0x9232: "Gu " +0x9233: "E " +0x9234: "Ling " +0x9235: "Bing " +0x9236: "Yi " +0x9237: "Gu " +0x9238: "Ba " +0x9239: "Pi " +0x923a: "Yu " +0x923b: "Si " +0x923c: "Zuo " +0x923d: "Bu " +0x923e: "You " +0x923f: "Dian " +0x9240: "Jia " +0x9241: "Zhen " +0x9242: "Shi " +0x9243: "Shi " +0x9244: "Tie " +0x9245: "Ju " +0x9246: "Zhan " +0x9247: "Shi " +0x9248: "She " +0x9249: "Xuan " +0x924a: "Zhao " +0x924b: "Bao " +0x924c: "He " +0x924d: "Bi " +0x924e: "Sheng " +0x924f: "Chu " +0x9250: "Shi " +0x9251: "Bo " +0x9252: "Zhu " +0x9253: "Chi " +0x9254: "Za " +0x9255: "Po " +0x9256: "Tong " +0x9257: "Qian " +0x9258: "Fu " +0x9259: "Zhai " +0x925a: "Liu " +0x925b: "Qian " +0x925c: "Fu " +0x925d: "Li " +0x925e: "Yue " +0x925f: "Pi " +0x9260: "Yang " +0x9261: "Ban " +0x9262: "Bo " +0x9263: "Jie " +0x9264: "Gou " +0x9265: "Shu " +0x9266: "Zheng " +0x9267: "Mu " +0x9268: "Ni " +0x9269: "Nie " +0x926a: "Di " +0x926b: "Jia " +0x926c: "Mu " +0x926d: "Dan " +0x926e: "Shen " +0x926f: "Yi " +0x9270: "Si " +0x9271: "Kuang " +0x9272: "Ka " +0x9273: "Bei " +0x9274: "Jian " +0x9275: "Tong " +0x9276: "Xing " +0x9277: "Hong " +0x9278: "Jiao " +0x9279: "Chi " +0x927a: "Er " +0x927b: "Ge " +0x927c: "Bing " +0x927d: "Shi " +0x927e: "Mou " +0x927f: "Jia " +0x9280: "Yin " +0x9281: "Jun " +0x9282: "Zhou " +0x9283: "Chong " +0x9284: "Shang " +0x9285: "Tong " +0x9286: "Mo " +0x9287: "Lei " +0x9288: "Ji " +0x9289: "Yu " +0x928a: "Xu " +0x928b: "Ren " +0x928c: "Zun " +0x928d: "Zhi " +0x928e: "Qiong " +0x928f: "Shan " +0x9290: "Chi " +0x9291: "Xian " +0x9292: "Xing " +0x9293: "Quan " +0x9294: "Pi " +0x9295: "Tie " +0x9296: "Zhu " +0x9297: "Hou " +0x9298: "Ming " +0x9299: "Kua " +0x929a: "Yao " +0x929b: "Xian " +0x929c: "Xian " +0x929d: "Xiu " +0x929e: "Jun " +0x929f: "Cha " +0x92a0: "Lao " +0x92a1: "Ji " +0x92a2: "Pi " +0x92a3: "Ru " +0x92a4: "Mi " +0x92a5: "Yi " +0x92a6: "Yin " +0x92a7: "Guang " +0x92a8: "An " +0x92a9: "Diou " +0x92aa: "You " +0x92ab: "Se " +0x92ac: "Kao " +0x92ad: "Qian " +0x92ae: "Luan " +0x92af: "Kasugai " +0x92b0: "Ai " +0x92b1: "Diao " +0x92b2: "Han " +0x92b3: "Rui " +0x92b4: "Shi " +0x92b5: "Keng " +0x92b6: "Qiu " +0x92b7: "Xiao " +0x92b8: "Zhe " +0x92b9: "Xiu " +0x92ba: "Zang " +0x92bb: "Ti " +0x92bc: "Cuo " +0x92bd: "Gua " +0x92be: "Gong " +0x92bf: "Zhong " +0x92c0: "Dou " +0x92c1: "Lu " +0x92c2: "Mei " +0x92c3: "Lang " +0x92c4: "Wan " +0x92c5: "Xin " +0x92c6: "Yun " +0x92c7: "Bei " +0x92c8: "Wu " +0x92c9: "Su " +0x92ca: "Yu " +0x92cb: "Chan " +0x92cc: "Ting " +0x92cd: "Bo " +0x92ce: "Han " +0x92cf: "Jia " +0x92d0: "Hong " +0x92d1: "Cuan " +0x92d2: "Feng " +0x92d3: "Chan " +0x92d4: "Wan " +0x92d5: "Zhi " +0x92d6: "Si " +0x92d7: "Xuan " +0x92d8: "Wu " +0x92d9: "Wu " +0x92da: "Tiao " +0x92db: "Gong " +0x92dc: "Zhuo " +0x92dd: "Lue " +0x92de: "Xing " +0x92df: "Qian " +0x92e0: "Shen " +0x92e1: "Han " +0x92e2: "Lue " +0x92e3: "Xie " +0x92e4: "Chu " +0x92e5: "Zheng " +0x92e6: "Ju " +0x92e7: "Xian " +0x92e8: "Tie " +0x92e9: "Mang " +0x92ea: "Pu " +0x92eb: "Li " +0x92ec: "Pan " +0x92ed: "Rui " +0x92ee: "Cheng " +0x92ef: "Gao " +0x92f0: "Li " +0x92f1: "Te " +0x92f2: "Pyeng " +0x92f3: "Zhu " +0x92f4: "[?] " +0x92f5: "Tu " +0x92f6: "Liu " +0x92f7: "Zui " +0x92f8: "Ju " +0x92f9: "Chang " +0x92fa: "Yuan " +0x92fb: "Jian " +0x92fc: "Gang " +0x92fd: "Diao " +0x92fe: "Tao " +0x92ff: "Chang " +/* x093 */ +0x9300: "Lun " +0x9301: "Kua " +0x9302: "Ling " +0x9303: "Bei " +0x9304: "Lu " +0x9305: "Li " +0x9306: "Qiang " +0x9307: "Pou " +0x9308: "Juan " +0x9309: "Min " +0x930a: "Zui " +0x930b: "Peng " +0x930c: "An " +0x930d: "Pi " +0x930e: "Xian " +0x930f: "Ya " +0x9310: "Zhui " +0x9311: "Lei " +0x9312: "A " +0x9313: "Kong " +0x9314: "Ta " +0x9315: "Kun " +0x9316: "Du " +0x9317: "Wei " +0x9318: "Chui " +0x9319: "Zi " +0x931a: "Zheng " +0x931b: "Ben " +0x931c: "Nie " +0x931d: "Cong " +0x931e: "Qun " +0x931f: "Tan " +0x9320: "Ding " +0x9321: "Qi " +0x9322: "Qian " +0x9323: "Zhuo " +0x9324: "Qi " +0x9325: "Yu " +0x9326: "Jin " +0x9327: "Guan " +0x9328: "Mao " +0x9329: "Chang " +0x932a: "Tian " +0x932b: "Xi " +0x932c: "Lian " +0x932d: "Tao " +0x932e: "Gu " +0x932f: "Cuo " +0x9330: "Shu " +0x9331: "Zhen " +0x9332: "Lu " +0x9333: "Meng " +0x9334: "Lu " +0x9335: "Hua " +0x9336: "Biao " +0x9337: "Ga " +0x9338: "Lai " +0x9339: "Ken " +0x933a: "Kazari " +0x933b: "Bu " +0x933c: "Nai " +0x933d: "Wan " +0x933e: "Zan " +0x933f: "[?] " +0x9340: "De " +0x9341: "Xian " +0x9342: "[?] " +0x9343: "Huo " +0x9344: "Liang " +0x9345: "[?] " +0x9346: "Men " +0x9347: "Kai " +0x9348: "Ying " +0x9349: "Di " +0x934a: "Lian " +0x934b: "Guo " +0x934c: "Xian " +0x934d: "Du " +0x934e: "Tu " +0x934f: "Wei " +0x9350: "Cong " +0x9351: "Fu " +0x9352: "Rou " +0x9353: "Ji " +0x9354: "E " +0x9355: "Rou " +0x9356: "Chen " +0x9357: "Ti " +0x9358: "Zha " +0x9359: "Hong " +0x935a: "Yang " +0x935b: "Duan " +0x935c: "Xia " +0x935d: "Yu " +0x935e: "Keng " +0x935f: "Xing " +0x9360: "Huang " +0x9361: "Wei " +0x9362: "Fu " +0x9363: "Zhao " +0x9364: "Cha " +0x9365: "Qie " +0x9366: "She " +0x9367: "Hong " +0x9368: "Kui " +0x9369: "Tian " +0x936a: "Mou " +0x936b: "Qiao " +0x936c: "Qiao " +0x936d: "Hou " +0x936e: "Tou " +0x936f: "Cong " +0x9370: "Huan " +0x9371: "Ye " +0x9372: "Min " +0x9373: "Jian " +0x9374: "Duan " +0x9375: "Jian " +0x9376: "Song " +0x9377: "Kui " +0x9378: "Hu " +0x9379: "Xuan " +0x937a: "Duo " +0x937b: "Jie " +0x937c: "Zhen " +0x937d: "Bian " +0x937e: "Zhong " +0x937f: "Zi " +0x9380: "Xiu " +0x9381: "Ye " +0x9382: "Mei " +0x9383: "Pai " +0x9384: "Ai " +0x9385: "Jie " +0x9386: "[?] " +0x9387: "Mei " +0x9388: "Chuo " +0x9389: "Ta " +0x938a: "Bang " +0x938b: "Xia " +0x938c: "Lian " +0x938d: "Suo " +0x938e: "Xi " +0x938f: "Liu " +0x9390: "Zu " +0x9391: "Ye " +0x9392: "Nou " +0x9393: "Weng " +0x9394: "Rong " +0x9395: "Tang " +0x9396: "Suo " +0x9397: "Qiang " +0x9398: "Ge " +0x9399: "Shuo " +0x939a: "Chui " +0x939b: "Bo " +0x939c: "Pan " +0x939d: "Sa " +0x939e: "Bi " +0x939f: "Sang " +0x93a0: "Gang " +0x93a1: "Zi " +0x93a2: "Wu " +0x93a3: "Ying " +0x93a4: "Huang " +0x93a5: "Tiao " +0x93a6: "Liu " +0x93a7: "Kai " +0x93a8: "Sun " +0x93a9: "Sha " +0x93aa: "Sou " +0x93ab: "Wan " +0x93ac: "Hao " +0x93ad: "Zhen " +0x93ae: "Zhen " +0x93af: "Luo " +0x93b0: "Yi " +0x93b1: "Yuan " +0x93b2: "Tang " +0x93b3: "Nie " +0x93b4: "Xi " +0x93b5: "Jia " +0x93b6: "Ge " +0x93b7: "Ma " +0x93b8: "Juan " +0x93b9: "Kasugai " +0x93ba: "Habaki " +0x93bb: "Suo " +0x93bc: "[?] " +0x93bd: "[?] " +0x93be: "[?] " +0x93bf: "Na " +0x93c0: "Lu " +0x93c1: "Suo " +0x93c2: "Ou " +0x93c3: "Zu " +0x93c4: "Tuan " +0x93c5: "Xiu " +0x93c6: "Guan " +0x93c7: "Xuan " +0x93c8: "Lian " +0x93c9: "Shou " +0x93ca: "Ao " +0x93cb: "Man " +0x93cc: "Mo " +0x93cd: "Luo " +0x93ce: "Bi " +0x93cf: "Wei " +0x93d0: "Liu " +0x93d1: "Di " +0x93d2: "Qiao " +0x93d3: "Cong " +0x93d4: "Yi " +0x93d5: "Lu " +0x93d6: "Ao " +0x93d7: "Keng " +0x93d8: "Qiang " +0x93d9: "Cui " +0x93da: "Qi " +0x93db: "Chang " +0x93dc: "Tang " +0x93dd: "Man " +0x93de: "Yong " +0x93df: "Chan " +0x93e0: "Feng " +0x93e1: "Jing " +0x93e2: "Biao " +0x93e3: "Shu " +0x93e4: "Lou " +0x93e5: "Xiu " +0x93e6: "Cong " +0x93e7: "Long " +0x93e8: "Zan " +0x93e9: "Jian " +0x93ea: "Cao " +0x93eb: "Li " +0x93ec: "Xia " +0x93ed: "Xi " +0x93ee: "Kang " +0x93ef: "[?] " +0x93f0: "Beng " +0x93f1: "[?] " +0x93f2: "[?] " +0x93f3: "Zheng " +0x93f4: "Lu " +0x93f5: "Hua " +0x93f6: "Ji " +0x93f7: "Pu " +0x93f8: "Hui " +0x93f9: "Qiang " +0x93fa: "Po " +0x93fb: "Lin " +0x93fc: "Suo " +0x93fd: "Xiu " +0x93fe: "San " +0x93ff: "Cheng " +/* x094 */ +0x9400: "Kui " +0x9401: "Si " +0x9402: "Liu " +0x9403: "Nao " +0x9404: "Heng " +0x9405: "Pie " +0x9406: "Sui " +0x9407: "Fan " +0x9408: "Qiao " +0x9409: "Quan " +0x940a: "Yang " +0x940b: "Tang " +0x940c: "Xiang " +0x940d: "Jue " +0x940e: "Jiao " +0x940f: "Zun " +0x9410: "Liao " +0x9411: "Jie " +0x9412: "Lao " +0x9413: "Dui " +0x9414: "Tan " +0x9415: "Zan " +0x9416: "Ji " +0x9417: "Jian " +0x9418: "Zhong " +0x9419: "Deng " +0x941a: "Ya " +0x941b: "Ying " +0x941c: "Dui " +0x941d: "Jue " +0x941e: "Nou " +0x941f: "Ti " +0x9420: "Pu " +0x9421: "Tie " +0x9422: "[?] " +0x9423: "[?] " +0x9424: "Ding " +0x9425: "Shan " +0x9426: "Kai " +0x9427: "Jian " +0x9428: "Fei " +0x9429: "Sui " +0x942a: "Lu " +0x942b: "Juan " +0x942c: "Hui " +0x942d: "Yu " +0x942e: "Lian " +0x942f: "Zhuo " +0x9430: "Qiao " +0x9431: "Qian " +0x9432: "Zhuo " +0x9433: "Lei " +0x9434: "Bi " +0x9435: "Tie " +0x9436: "Huan " +0x9437: "Ye " +0x9438: "Duo " +0x9439: "Guo " +0x943a: "Dang " +0x943b: "Ju " +0x943c: "Fen " +0x943d: "Da " +0x943e: "Bei " +0x943f: "Yi " +0x9440: "Ai " +0x9441: "Zong " +0x9442: "Xun " +0x9443: "Diao " +0x9444: "Zhu " +0x9445: "Heng " +0x9446: "Zhui " +0x9447: "Ji " +0x9448: "Nie " +0x9449: "Ta " +0x944a: "Huo " +0x944b: "Qing " +0x944c: "Bin " +0x944d: "Ying " +0x944e: "Kui " +0x944f: "Ning " +0x9450: "Xu " +0x9451: "Jian " +0x9452: "Jian " +0x9453: "Yari " +0x9454: "Cha " +0x9455: "Zhi " +0x9456: "Mie " +0x9457: "Li " +0x9458: "Lei " +0x9459: "Ji " +0x945a: "Zuan " +0x945b: "Kuang " +0x945c: "Shang " +0x945d: "Peng " +0x945e: "La " +0x945f: "Du " +0x9460: "Shuo " +0x9461: "Chuo " +0x9462: "Lu " +0x9463: "Biao " +0x9464: "Bao " +0x9465: "Lu " +0x9466: "[?] " +0x9467: "[?] " +0x9468: "Long " +0x9469: "E " +0x946a: "Lu " +0x946b: "Xin " +0x946c: "Jian " +0x946d: "Lan " +0x946e: "Bo " +0x946f: "Jian " +0x9470: "Yao " +0x9471: "Chan " +0x9472: "Xiang " +0x9473: "Jian " +0x9474: "Xi " +0x9475: "Guan " +0x9476: "Cang " +0x9477: "Nie " +0x9478: "Lei " +0x9479: "Cuan " +0x947a: "Qu " +0x947b: "Pan " +0x947c: "Luo " +0x947d: "Zuan " +0x947e: "Luan " +0x947f: "Zao " +0x9480: "Nie " +0x9481: "Jue " +0x9482: "Tang " +0x9483: "Shu " +0x9484: "Lan " +0x9485: "Jin " +0x9486: "Qiu " +0x9487: "Yi " +0x9488: "Zhen " +0x9489: "Ding " +0x948a: "Zhao " +0x948b: "Po " +0x948c: "Diao " +0x948d: "Tu " +0x948e: "Qian " +0x948f: "Chuan " +0x9490: "Shan " +0x9491: "Ji " +0x9492: "Fan " +0x9493: "Diao " +0x9494: "Men " +0x9495: "Nu " +0x9496: "Xi " +0x9497: "Chai " +0x9498: "Xing " +0x9499: "Gai " +0x949a: "Bu " +0x949b: "Tai " +0x949c: "Ju " +0x949d: "Dun " +0x949e: "Chao " +0x949f: "Zhong " +0x94a0: "Na " +0x94a1: "Bei " +0x94a2: "Gang " +0x94a3: "Ban " +0x94a4: "Qian " +0x94a5: "Yao " +0x94a6: "Qin " +0x94a7: "Jun " +0x94a8: "Wu " +0x94a9: "Gou " +0x94aa: "Kang " +0x94ab: "Fang " +0x94ac: "Huo " +0x94ad: "Tou " +0x94ae: "Niu " +0x94af: "Ba " +0x94b0: "Yu " +0x94b1: "Qian " +0x94b2: "Zheng " +0x94b3: "Qian " +0x94b4: "Gu " +0x94b5: "Bo " +0x94b6: "E " +0x94b7: "Po " +0x94b8: "Bu " +0x94b9: "Ba " +0x94ba: "Yue " +0x94bb: "Zuan " +0x94bc: "Mu " +0x94bd: "Dan " +0x94be: "Jia " +0x94bf: "Dian " +0x94c0: "You " +0x94c1: "Tie " +0x94c2: "Bo " +0x94c3: "Ling " +0x94c4: "Shuo " +0x94c5: "Qian " +0x94c6: "Liu " +0x94c7: "Bao " +0x94c8: "Shi " +0x94c9: "Xuan " +0x94ca: "She " +0x94cb: "Bi " +0x94cc: "Ni " +0x94cd: "Pi " +0x94ce: "Duo " +0x94cf: "Xing " +0x94d0: "Kao " +0x94d1: "Lao " +0x94d2: "Er " +0x94d3: "Mang " +0x94d4: "Ya " +0x94d5: "You " +0x94d6: "Cheng " +0x94d7: "Jia " +0x94d8: "Ye " +0x94d9: "Nao " +0x94da: "Zhi " +0x94db: "Dang " +0x94dc: "Tong " +0x94dd: "Lu " +0x94de: "Diao " +0x94df: "Yin " +0x94e0: "Kai " +0x94e1: "Zha " +0x94e2: "Zhu " +0x94e3: "Xian " +0x94e4: "Ting " +0x94e5: "Diu " +0x94e6: "Xian " +0x94e7: "Hua " +0x94e8: "Quan " +0x94e9: "Sha " +0x94ea: "Jia " +0x94eb: "Yao " +0x94ec: "Ge " +0x94ed: "Ming " +0x94ee: "Zheng " +0x94ef: "Se " +0x94f0: "Jiao " +0x94f1: "Yi " +0x94f2: "Chan " +0x94f3: "Chong " +0x94f4: "Tang " +0x94f5: "An " +0x94f6: "Yin " +0x94f7: "Ru " +0x94f8: "Zhu " +0x94f9: "Lao " +0x94fa: "Pu " +0x94fb: "Wu " +0x94fc: "Lai " +0x94fd: "Te " +0x94fe: "Lian " +0x94ff: "Keng " +/* x095 */ +0x9500: "Xiao " +0x9501: "Suo " +0x9502: "Li " +0x9503: "Zheng " +0x9504: "Chu " +0x9505: "Guo " +0x9506: "Gao " +0x9507: "Tie " +0x9508: "Xiu " +0x9509: "Cuo " +0x950a: "Lue " +0x950b: "Feng " +0x950c: "Xin " +0x950d: "Liu " +0x950e: "Kai " +0x950f: "Jian " +0x9510: "Rui " +0x9511: "Ti " +0x9512: "Lang " +0x9513: "Qian " +0x9514: "Ju " +0x9515: "A " +0x9516: "Qiang " +0x9517: "Duo " +0x9518: "Tian " +0x9519: "Cuo " +0x951a: "Mao " +0x951b: "Ben " +0x951c: "Qi " +0x951d: "De " +0x951e: "Kua " +0x951f: "Kun " +0x9520: "Chang " +0x9521: "Xi " +0x9522: "Gu " +0x9523: "Luo " +0x9524: "Chui " +0x9525: "Zhui " +0x9526: "Jin " +0x9527: "Zhi " +0x9528: "Xian " +0x9529: "Juan " +0x952a: "Huo " +0x952b: "Pou " +0x952c: "Tan " +0x952d: "Ding " +0x952e: "Jian " +0x952f: "Ju " +0x9530: "Meng " +0x9531: "Zi " +0x9532: "Qie " +0x9533: "Ying " +0x9534: "Kai " +0x9535: "Qiang " +0x9536: "Song " +0x9537: "E " +0x9538: "Cha " +0x9539: "Qiao " +0x953a: "Zhong " +0x953b: "Duan " +0x953c: "Sou " +0x953d: "Huang " +0x953e: "Huan " +0x953f: "Ai " +0x9540: "Du " +0x9541: "Mei " +0x9542: "Lou " +0x9543: "Zi " +0x9544: "Fei " +0x9545: "Mei " +0x9546: "Mo " +0x9547: "Zhen " +0x9548: "Bo " +0x9549: "Ge " +0x954a: "Nie " +0x954b: "Tang " +0x954c: "Juan " +0x954d: "Nie " +0x954e: "Na " +0x954f: "Liu " +0x9550: "Hao " +0x9551: "Bang " +0x9552: "Yi " +0x9553: "Jia " +0x9554: "Bin " +0x9555: "Rong " +0x9556: "Biao " +0x9557: "Tang " +0x9558: "Man " +0x9559: "Luo " +0x955a: "Beng " +0x955b: "Yong " +0x955c: "Jing " +0x955d: "Di " +0x955e: "Zu " +0x955f: "Xuan " +0x9560: "Liu " +0x9561: "Tan " +0x9562: "Jue " +0x9563: "Liao " +0x9564: "Pu " +0x9565: "Lu " +0x9566: "Dui " +0x9567: "Lan " +0x9568: "Pu " +0x9569: "Cuan " +0x956a: "Qiang " +0x956b: "Deng " +0x956c: "Huo " +0x956d: "Lei " +0x956e: "Huan " +0x956f: "Zhuo " +0x9570: "Lian " +0x9571: "Yi " +0x9572: "Cha " +0x9573: "Biao " +0x9574: "La " +0x9575: "Chan " +0x9576: "Xiang " +0x9577: "Chang " +0x9578: "Chang " +0x9579: "Jiu " +0x957a: "Ao " +0x957b: "Die " +0x957c: "Qu " +0x957d: "Liao " +0x957e: "Mi " +0x957f: "Chang " +0x9580: "Men " +0x9581: "Ma " +0x9582: "Shuan " +0x9583: "Shan " +0x9584: "Huo " +0x9585: "Men " +0x9586: "Yan " +0x9587: "Bi " +0x9588: "Han " +0x9589: "Bi " +0x958a: "San " +0x958b: "Kai " +0x958c: "Kang " +0x958d: "Beng " +0x958e: "Hong " +0x958f: "Run " +0x9590: "San " +0x9591: "Xian " +0x9592: "Xian " +0x9593: "Jian " +0x9594: "Min " +0x9595: "Xia " +0x9596: "Yuru " +0x9597: "Dou " +0x9598: "Zha " +0x9599: "Nao " +0x959a: "Jian " +0x959b: "Peng " +0x959c: "Xia " +0x959d: "Ling " +0x959e: "Bian " +0x959f: "Bi " +0x95a0: "Run " +0x95a1: "He " +0x95a2: "Guan " +0x95a3: "Ge " +0x95a4: "Ge " +0x95a5: "Fa " +0x95a6: "Chu " +0x95a7: "Hong " +0x95a8: "Gui " +0x95a9: "Min " +0x95aa: "Se " +0x95ab: "Kun " +0x95ac: "Lang " +0x95ad: "Lu " +0x95ae: "Ting " +0x95af: "Sha " +0x95b0: "Ju " +0x95b1: "Yue " +0x95b2: "Yue " +0x95b3: "Chan " +0x95b4: "Qu " +0x95b5: "Lin " +0x95b6: "Chang " +0x95b7: "Shai " +0x95b8: "Kun " +0x95b9: "Yan " +0x95ba: "Min " +0x95bb: "Yan " +0x95bc: "E " +0x95bd: "Hun " +0x95be: "Yu " +0x95bf: "Wen " +0x95c0: "Xiang " +0x95c1: "Bao " +0x95c2: "Xiang " +0x95c3: "Qu " +0x95c4: "Yao " +0x95c5: "Wen " +0x95c6: "Ban " +0x95c7: "An " +0x95c8: "Wei " +0x95c9: "Yin " +0x95ca: "Kuo " +0x95cb: "Que " +0x95cc: "Lan " +0x95cd: "Du " +0x95ce: "[?] " +0x95cf: "Phwung " +0x95d0: "Tian " +0x95d1: "Nie " +0x95d2: "Ta " +0x95d3: "Kai " +0x95d4: "He " +0x95d5: "Que " +0x95d6: "Chuang " +0x95d7: "Guan " +0x95d8: "Dou " +0x95d9: "Qi " +0x95da: "Kui " +0x95db: "Tang " +0x95dc: "Guan " +0x95dd: "Piao " +0x95de: "Kan " +0x95df: "Xi " +0x95e0: "Hui " +0x95e1: "Chan " +0x95e2: "Pi " +0x95e3: "Dang " +0x95e4: "Huan " +0x95e5: "Ta " +0x95e6: "Wen " +0x95e7: "[?] " +0x95e8: "Men " +0x95e9: "Shuan " +0x95ea: "Shan " +0x95eb: "Yan " +0x95ec: "Han " +0x95ed: "Bi " +0x95ee: "Wen " +0x95ef: "Chuang " +0x95f0: "Run " +0x95f1: "Wei " +0x95f2: "Xian " +0x95f3: "Hong " +0x95f4: "Jian " +0x95f5: "Min " +0x95f6: "Kang " +0x95f7: "Men " +0x95f8: "Zha " +0x95f9: "Nao " +0x95fa: "Gui " +0x95fb: "Wen " +0x95fc: "Ta " +0x95fd: "Min " +0x95fe: "Lu " +0x95ff: "Kai " +/* x096 */ +0x9600: "Fa " +0x9601: "Ge " +0x9602: "He " +0x9603: "Kun " +0x9604: "Jiu " +0x9605: "Yue " +0x9606: "Lang " +0x9607: "Du " +0x9608: "Yu " +0x9609: "Yan " +0x960a: "Chang " +0x960b: "Xi " +0x960c: "Wen " +0x960d: "Hun " +0x960e: "Yan " +0x960f: "E " +0x9610: "Chan " +0x9611: "Lan " +0x9612: "Qu " +0x9613: "Hui " +0x9614: "Kuo " +0x9615: "Que " +0x9616: "Ge " +0x9617: "Tian " +0x9618: "Ta " +0x9619: "Que " +0x961a: "Kan " +0x961b: "Huan " +0x961c: "Fu " +0x961d: "Fu " +0x961e: "Le " +0x961f: "Dui " +0x9620: "Xin " +0x9621: "Qian " +0x9622: "Wu " +0x9623: "Yi " +0x9624: "Tuo " +0x9625: "Yin " +0x9626: "Yang " +0x9627: "Dou " +0x9628: "E " +0x9629: "Sheng " +0x962a: "Ban " +0x962b: "Pei " +0x962c: "Keng " +0x962d: "Yun " +0x962e: "Ruan " +0x962f: "Zhi " +0x9630: "Pi " +0x9631: "Jing " +0x9632: "Fang " +0x9633: "Yang " +0x9634: "Yin " +0x9635: "Zhen " +0x9636: "Jie " +0x9637: "Cheng " +0x9638: "E " +0x9639: "Qu " +0x963a: "Di " +0x963b: "Zu " +0x963c: "Zuo " +0x963d: "Dian " +0x963e: "Ling " +0x963f: "A " +0x9640: "Tuo " +0x9641: "Tuo " +0x9642: "Po " +0x9643: "Bing " +0x9644: "Fu " +0x9645: "Ji " +0x9646: "Lu " +0x9647: "Long " +0x9648: "Chen " +0x9649: "Xing " +0x964a: "Duo " +0x964b: "Lou " +0x964c: "Mo " +0x964d: "Jiang " +0x964e: "Shu " +0x964f: "Duo " +0x9650: "Xian " +0x9651: "Er " +0x9652: "Gui " +0x9653: "Yu " +0x9654: "Gai " +0x9655: "Shan " +0x9656: "Xun " +0x9657: "Qiao " +0x9658: "Xing " +0x9659: "Chun " +0x965a: "Fu " +0x965b: "Bi " +0x965c: "Xia " +0x965d: "Shan " +0x965e: "Sheng " +0x965f: "Zhi " +0x9660: "Pu " +0x9661: "Dou " +0x9662: "Yuan " +0x9663: "Zhen " +0x9664: "Chu " +0x9665: "Xian " +0x9666: "Tou " +0x9667: "Nie " +0x9668: "Yun " +0x9669: "Xian " +0x966a: "Pei " +0x966b: "Pei " +0x966c: "Zou " +0x966d: "Yi " +0x966e: "Dui " +0x966f: "Lun " +0x9670: "Yin " +0x9671: "Ju " +0x9672: "Chui " +0x9673: "Chen " +0x9674: "Pi " +0x9675: "Ling " +0x9676: "Tao " +0x9677: "Xian " +0x9678: "Lu " +0x9679: "Sheng " +0x967a: "Xian " +0x967b: "Yin " +0x967c: "Zhu " +0x967d: "Yang " +0x967e: "Reng " +0x967f: "Shan " +0x9680: "Chong " +0x9681: "Yan " +0x9682: "Yin " +0x9683: "Yu " +0x9684: "Ti " +0x9685: "Yu " +0x9686: "Long " +0x9687: "Wei " +0x9688: "Wei " +0x9689: "Nie " +0x968a: "Dui " +0x968b: "Sui " +0x968c: "An " +0x968d: "Huang " +0x968e: "Jie " +0x968f: "Sui " +0x9690: "Yin " +0x9691: "Gai " +0x9692: "Yan " +0x9693: "Hui " +0x9694: "Ge " +0x9695: "Yun " +0x9696: "Wu " +0x9697: "Wei " +0x9698: "Ai " +0x9699: "Xi " +0x969a: "Tang " +0x969b: "Ji " +0x969c: "Zhang " +0x969d: "Dao " +0x969e: "Ao " +0x969f: "Xi " +0x96a0: "Yin " +0x96a1: "[?] " +0x96a2: "Rao " +0x96a3: "Lin " +0x96a4: "Tui " +0x96a5: "Deng " +0x96a6: "Pi " +0x96a7: "Sui " +0x96a8: "Sui " +0x96a9: "Yu " +0x96aa: "Xian " +0x96ab: "Fen " +0x96ac: "Ni " +0x96ad: "Er " +0x96ae: "Ji " +0x96af: "Dao " +0x96b0: "Xi " +0x96b1: "Yin " +0x96b2: "E " +0x96b3: "Hui " +0x96b4: "Long " +0x96b5: "Xi " +0x96b6: "Li " +0x96b7: "Li " +0x96b8: "Li " +0x96b9: "Zhui " +0x96ba: "He " +0x96bb: "Zhi " +0x96bc: "Zhun " +0x96bd: "Jun " +0x96be: "Nan " +0x96bf: "Yi " +0x96c0: "Que " +0x96c1: "Yan " +0x96c2: "Qian " +0x96c3: "Ya " +0x96c4: "Xiong " +0x96c5: "Ya " +0x96c6: "Ji " +0x96c7: "Gu " +0x96c8: "Huan " +0x96c9: "Zhi " +0x96ca: "Gou " +0x96cb: "Jun " +0x96cc: "Ci " +0x96cd: "Yong " +0x96ce: "Ju " +0x96cf: "Chu " +0x96d0: "Hu " +0x96d1: "Za " +0x96d2: "Luo " +0x96d3: "Yu " +0x96d4: "Chou " +0x96d5: "Diao " +0x96d6: "Sui " +0x96d7: "Han " +0x96d8: "Huo " +0x96d9: "Shuang " +0x96da: "Guan " +0x96db: "Chu " +0x96dc: "Za " +0x96dd: "Yong " +0x96de: "Ji " +0x96df: "Xi " +0x96e0: "Chou " +0x96e1: "Liu " +0x96e2: "Li " +0x96e3: "Nan " +0x96e4: "Xue " +0x96e5: "Za " +0x96e6: "Ji " +0x96e7: "Ji " +0x96e8: "Yu " +0x96e9: "Yu " +0x96ea: "Xue " +0x96eb: "Na " +0x96ec: "Fou " +0x96ed: "Se " +0x96ee: "Mu " +0x96ef: "Wen " +0x96f0: "Fen " +0x96f1: "Pang " +0x96f2: "Yun " +0x96f3: "Li " +0x96f4: "Li " +0x96f5: "Ang " +0x96f6: "Ling " +0x96f7: "Lei " +0x96f8: "An " +0x96f9: "Bao " +0x96fa: "Meng " +0x96fb: "Dian " +0x96fc: "Dang " +0x96fd: "Xing " +0x96fe: "Wu " +0x96ff: "Zhao " +/* x097 */ +0x9700: "Xu " +0x9701: "Ji " +0x9702: "Mu " +0x9703: "Chen " +0x9704: "Xiao " +0x9705: "Zha " +0x9706: "Ting " +0x9707: "Zhen " +0x9708: "Pei " +0x9709: "Mei " +0x970a: "Ling " +0x970b: "Qi " +0x970c: "Chou " +0x970d: "Huo " +0x970e: "Sha " +0x970f: "Fei " +0x9710: "Weng " +0x9711: "Zhan " +0x9712: "Yin " +0x9713: "Ni " +0x9714: "Chou " +0x9715: "Tun " +0x9716: "Lin " +0x9717: "[?] " +0x9718: "Dong " +0x9719: "Ying " +0x971a: "Wu " +0x971b: "Ling " +0x971c: "Shuang " +0x971d: "Ling " +0x971e: "Xia " +0x971f: "Hong " +0x9720: "Yin " +0x9721: "Mo " +0x9722: "Mai " +0x9723: "Yun " +0x9724: "Liu " +0x9725: "Meng " +0x9726: "Bin " +0x9727: "Wu " +0x9728: "Wei " +0x9729: "Huo " +0x972a: "Yin " +0x972b: "Xi " +0x972c: "Yi " +0x972d: "Ai " +0x972e: "Dan " +0x972f: "Deng " +0x9730: "Xian " +0x9731: "Yu " +0x9732: "Lu " +0x9733: "Long " +0x9734: "Dai " +0x9735: "Ji " +0x9736: "Pang " +0x9737: "Yang " +0x9738: "Ba " +0x9739: "Pi " +0x973a: "Wei " +0x973b: "[?] " +0x973c: "Xi " +0x973d: "Ji " +0x973e: "Mai " +0x973f: "Meng " +0x9740: "Meng " +0x9741: "Lei " +0x9742: "Li " +0x9743: "Huo " +0x9744: "Ai " +0x9745: "Fei " +0x9746: "Dai " +0x9747: "Long " +0x9748: "Ling " +0x9749: "Ai " +0x974a: "Feng " +0x974b: "Li " +0x974c: "Bao " +0x974d: "[?] " +0x974e: "He " +0x974f: "He " +0x9750: "Bing " +0x9751: "Qing " +0x9752: "Qing " +0x9753: "Jing " +0x9754: "Tian " +0x9755: "Zhen " +0x9756: "Jing " +0x9757: "Cheng " +0x9758: "Qing " +0x9759: "Jing " +0x975a: "Jing " +0x975b: "Dian " +0x975c: "Jing " +0x975d: "Tian " +0x975e: "Fei " +0x975f: "Fei " +0x9760: "Kao " +0x9761: "Mi " +0x9762: "Mian " +0x9763: "Mian " +0x9764: "Pao " +0x9765: "Ye " +0x9766: "Tian " +0x9767: "Hui " +0x9768: "Ye " +0x9769: "Ge " +0x976a: "Ding " +0x976b: "Cha " +0x976c: "Jian " +0x976d: "Ren " +0x976e: "Di " +0x976f: "Du " +0x9770: "Wu " +0x9771: "Ren " +0x9772: "Qin " +0x9773: "Jin " +0x9774: "Xue " +0x9775: "Niu " +0x9776: "Ba " +0x9777: "Yin " +0x9778: "Sa " +0x9779: "Na " +0x977a: "Mo " +0x977b: "Zu " +0x977c: "Da " +0x977d: "Ban " +0x977e: "Yi " +0x977f: "Yao " +0x9780: "Tao " +0x9781: "Tuo " +0x9782: "Jia " +0x9783: "Hong " +0x9784: "Pao " +0x9785: "Yang " +0x9786: "Tomo " +0x9787: "Yin " +0x9788: "Jia " +0x9789: "Tao " +0x978a: "Ji " +0x978b: "Xie " +0x978c: "An " +0x978d: "An " +0x978e: "Hen " +0x978f: "Gong " +0x9790: "Kohaze " +0x9791: "Da " +0x9792: "Qiao " +0x9793: "Ting " +0x9794: "Wan " +0x9795: "Ying " +0x9796: "Sui " +0x9797: "Tiao " +0x9798: "Qiao " +0x9799: "Xuan " +0x979a: "Kong " +0x979b: "Beng " +0x979c: "Ta " +0x979d: "Zhang " +0x979e: "Bing " +0x979f: "Kuo " +0x97a0: "Ju " +0x97a1: "La " +0x97a2: "Xie " +0x97a3: "Rou " +0x97a4: "Bang " +0x97a5: "Yi " +0x97a6: "Qiu " +0x97a7: "Qiu " +0x97a8: "He " +0x97a9: "Xiao " +0x97aa: "Mu " +0x97ab: "Ju " +0x97ac: "Jian " +0x97ad: "Bian " +0x97ae: "Di " +0x97af: "Jian " +0x97b0: "On " +0x97b1: "Tao " +0x97b2: "Gou " +0x97b3: "Ta " +0x97b4: "Bei " +0x97b5: "Xie " +0x97b6: "Pan " +0x97b7: "Ge " +0x97b8: "Bi " +0x97b9: "Kuo " +0x97ba: "Tang " +0x97bb: "Lou " +0x97bc: "Gui " +0x97bd: "Qiao " +0x97be: "Xue " +0x97bf: "Ji " +0x97c0: "Jian " +0x97c1: "Jiang " +0x97c2: "Chan " +0x97c3: "Da " +0x97c4: "Huo " +0x97c5: "Xian " +0x97c6: "Qian " +0x97c7: "Du " +0x97c8: "Wa " +0x97c9: "Jian " +0x97ca: "Lan " +0x97cb: "Wei " +0x97cc: "Ren " +0x97cd: "Fu " +0x97ce: "Mei " +0x97cf: "Juan " +0x97d0: "Ge " +0x97d1: "Wei " +0x97d2: "Qiao " +0x97d3: "Han " +0x97d4: "Chang " +0x97d5: "[?] " +0x97d6: "Rou " +0x97d7: "Xun " +0x97d8: "She " +0x97d9: "Wei " +0x97da: "Ge " +0x97db: "Bei " +0x97dc: "Tao " +0x97dd: "Gou " +0x97de: "Yun " +0x97df: "[?] " +0x97e0: "Bi " +0x97e1: "Wei " +0x97e2: "Hui " +0x97e3: "Du " +0x97e4: "Wa " +0x97e5: "Du " +0x97e6: "Wei " +0x97e7: "Ren " +0x97e8: "Fu " +0x97e9: "Han " +0x97ea: "Wei " +0x97eb: "Yun " +0x97ec: "Tao " +0x97ed: "Jiu " +0x97ee: "Jiu " +0x97ef: "Xian " +0x97f0: "Xie " +0x97f1: "Xian " +0x97f2: "Ji " +0x97f3: "Yin " +0x97f4: "Za " +0x97f5: "Yun " +0x97f6: "Shao " +0x97f7: "Le " +0x97f8: "Peng " +0x97f9: "Heng " +0x97fa: "Ying " +0x97fb: "Yun " +0x97fc: "Peng " +0x97fd: "Yin " +0x97fe: "Yin " +0x97ff: "Xiang " +/* x098 */ +0x9800: "Hu " +0x9801: "Ye " +0x9802: "Ding " +0x9803: "Qing " +0x9804: "Pan " +0x9805: "Xiang " +0x9806: "Shun " +0x9807: "Han " +0x9808: "Xu " +0x9809: "Yi " +0x980a: "Xu " +0x980b: "Gu " +0x980c: "Song " +0x980d: "Kui " +0x980e: "Qi " +0x980f: "Hang " +0x9810: "Yu " +0x9811: "Wan " +0x9812: "Ban " +0x9813: "Dun " +0x9814: "Di " +0x9815: "Dan " +0x9816: "Pan " +0x9817: "Po " +0x9818: "Ling " +0x9819: "Ce " +0x981a: "Jing " +0x981b: "Lei " +0x981c: "He " +0x981d: "Qiao " +0x981e: "E " +0x981f: "E " +0x9820: "Wei " +0x9821: "Jie " +0x9822: "Gua " +0x9823: "Shen " +0x9824: "Yi " +0x9825: "Shen " +0x9826: "Hai " +0x9827: "Dui " +0x9828: "Pian " +0x9829: "Ping " +0x982a: "Lei " +0x982b: "Fu " +0x982c: "Jia " +0x982d: "Tou " +0x982e: "Hui " +0x982f: "Kui " +0x9830: "Jia " +0x9831: "Le " +0x9832: "Tian " +0x9833: "Cheng " +0x9834: "Ying " +0x9835: "Jun " +0x9836: "Hu " +0x9837: "Han " +0x9838: "Jing " +0x9839: "Tui " +0x983a: "Tui " +0x983b: "Pin " +0x983c: "Lai " +0x983d: "Tui " +0x983e: "Zi " +0x983f: "Zi " +0x9840: "Chui " +0x9841: "Ding " +0x9842: "Lai " +0x9843: "Yan " +0x9844: "Han " +0x9845: "Jian " +0x9846: "Ke " +0x9847: "Cui " +0x9848: "Jiong " +0x9849: "Qin " +0x984a: "Yi " +0x984b: "Sai " +0x984c: "Ti " +0x984d: "E " +0x984e: "E " +0x984f: "Yan " +0x9850: "Hun " +0x9851: "Kan " +0x9852: "Yong " +0x9853: "Zhuan " +0x9854: "Yan " +0x9855: "Xian " +0x9856: "Xin " +0x9857: "Yi " +0x9858: "Yuan " +0x9859: "Sang " +0x985a: "Dian " +0x985b: "Dian " +0x985c: "Jiang " +0x985d: "Ku " +0x985e: "Lei " +0x985f: "Liao " +0x9860: "Piao " +0x9861: "Yi " +0x9862: "Man " +0x9863: "Qi " +0x9864: "Rao " +0x9865: "Hao " +0x9866: "Qiao " +0x9867: "Gu " +0x9868: "Xun " +0x9869: "Qian " +0x986a: "Hui " +0x986b: "Zhan " +0x986c: "Ru " +0x986d: "Hong " +0x986e: "Bin " +0x986f: "Xian " +0x9870: "Pin " +0x9871: "Lu " +0x9872: "Lan " +0x9873: "Nie " +0x9874: "Quan " +0x9875: "Ye " +0x9876: "Ding " +0x9877: "Qing " +0x9878: "Han " +0x9879: "Xiang " +0x987a: "Shun " +0x987b: "Xu " +0x987c: "Xu " +0x987d: "Wan " +0x987e: "Gu " +0x987f: "Dun " +0x9880: "Qi " +0x9881: "Ban " +0x9882: "Song " +0x9883: "Hang " +0x9884: "Yu " +0x9885: "Lu " +0x9886: "Ling " +0x9887: "Po " +0x9888: "Jing " +0x9889: "Jie " +0x988a: "Jia " +0x988b: "Tian " +0x988c: "Han " +0x988d: "Ying " +0x988e: "Jiong " +0x988f: "Hai " +0x9890: "Yi " +0x9891: "Pin " +0x9892: "Hui " +0x9893: "Tui " +0x9894: "Han " +0x9895: "Ying " +0x9896: "Ying " +0x9897: "Ke " +0x9898: "Ti " +0x9899: "Yong " +0x989a: "E " +0x989b: "Zhuan " +0x989c: "Yan " +0x989d: "E " +0x989e: "Nie " +0x989f: "Man " +0x98a0: "Dian " +0x98a1: "Sang " +0x98a2: "Hao " +0x98a3: "Lei " +0x98a4: "Zhan " +0x98a5: "Ru " +0x98a6: "Pin " +0x98a7: "Quan " +0x98a8: "Feng " +0x98a9: "Biao " +0x98aa: "Oroshi " +0x98ab: "Fu " +0x98ac: "Xia " +0x98ad: "Zhan " +0x98ae: "Biao " +0x98af: "Sa " +0x98b0: "Ba " +0x98b1: "Tai " +0x98b2: "Lie " +0x98b3: "Gua " +0x98b4: "Xuan " +0x98b5: "Shao " +0x98b6: "Ju " +0x98b7: "Bi " +0x98b8: "Si " +0x98b9: "Wei " +0x98ba: "Yang " +0x98bb: "Yao " +0x98bc: "Sou " +0x98bd: "Kai " +0x98be: "Sao " +0x98bf: "Fan " +0x98c0: "Liu " +0x98c1: "Xi " +0x98c2: "Liao " +0x98c3: "Piao " +0x98c4: "Piao " +0x98c5: "Liu " +0x98c6: "Biao " +0x98c7: "Biao " +0x98c8: "Biao " +0x98c9: "Liao " +0x98ca: "[?] " +0x98cb: "Se " +0x98cc: "Feng " +0x98cd: "Biao " +0x98ce: "Feng " +0x98cf: "Yang " +0x98d0: "Zhan " +0x98d1: "Biao " +0x98d2: "Sa " +0x98d3: "Ju " +0x98d4: "Si " +0x98d5: "Sou " +0x98d6: "Yao " +0x98d7: "Liu " +0x98d8: "Piao " +0x98d9: "Biao " +0x98da: "Biao " +0x98db: "Fei " +0x98dc: "Fan " +0x98dd: "Fei " +0x98de: "Fei " +0x98df: "Shi " +0x98e0: "Shi " +0x98e1: "Can " +0x98e2: "Ji " +0x98e3: "Ding " +0x98e4: "Si " +0x98e5: "Tuo " +0x98e6: "Zhan " +0x98e7: "Sun " +0x98e8: "Xiang " +0x98e9: "Tun " +0x98ea: "Ren " +0x98eb: "Yu " +0x98ec: "Juan " +0x98ed: "Chi " +0x98ee: "Yin " +0x98ef: "Fan " +0x98f0: "Fan " +0x98f1: "Sun " +0x98f2: "Yin " +0x98f3: "Zhu " +0x98f4: "Yi " +0x98f5: "Zhai " +0x98f6: "Bi " +0x98f7: "Jie " +0x98f8: "Tao " +0x98f9: "Liu " +0x98fa: "Ci " +0x98fb: "Tie " +0x98fc: "Si " +0x98fd: "Bao " +0x98fe: "Shi " +0x98ff: "Duo " +/* x099 */ +0x9900: "Hai " +0x9901: "Ren " +0x9902: "Tian " +0x9903: "Jiao " +0x9904: "Jia " +0x9905: "Bing " +0x9906: "Yao " +0x9907: "Tong " +0x9908: "Ci " +0x9909: "Xiang " +0x990a: "Yang " +0x990b: "Yang " +0x990c: "Er " +0x990d: "Yan " +0x990e: "Le " +0x990f: "Yi " +0x9910: "Can " +0x9911: "Bo " +0x9912: "Nei " +0x9913: "E " +0x9914: "Bu " +0x9915: "Jun " +0x9916: "Dou " +0x9917: "Su " +0x9918: "Yu " +0x9919: "Shi " +0x991a: "Yao " +0x991b: "Hun " +0x991c: "Guo " +0x991d: "Shi " +0x991e: "Jian " +0x991f: "Zhui " +0x9920: "Bing " +0x9921: "Xian " +0x9922: "Bu " +0x9923: "Ye " +0x9924: "Tan " +0x9925: "Fei " +0x9926: "Zhang " +0x9927: "Wei " +0x9928: "Guan " +0x9929: "E " +0x992a: "Nuan " +0x992b: "Hun " +0x992c: "Hu " +0x992d: "Huang " +0x992e: "Tie " +0x992f: "Hui " +0x9930: "Jian " +0x9931: "Hou " +0x9932: "He " +0x9933: "Xing " +0x9934: "Fen " +0x9935: "Wei " +0x9936: "Gu " +0x9937: "Cha " +0x9938: "Song " +0x9939: "Tang " +0x993a: "Bo " +0x993b: "Gao " +0x993c: "Xi " +0x993d: "Kui " +0x993e: "Liu " +0x993f: "Sou " +0x9940: "Tao " +0x9941: "Ye " +0x9942: "Yun " +0x9943: "Mo " +0x9944: "Tang " +0x9945: "Man " +0x9946: "Bi " +0x9947: "Yu " +0x9948: "Xiu " +0x9949: "Jin " +0x994a: "San " +0x994b: "Kui " +0x994c: "Zhuan " +0x994d: "Shan " +0x994e: "Chi " +0x994f: "Dan " +0x9950: "Yi " +0x9951: "Ji " +0x9952: "Rao " +0x9953: "Cheng " +0x9954: "Yong " +0x9955: "Tao " +0x9956: "Hui " +0x9957: "Xiang " +0x9958: "Zhan " +0x9959: "Fen " +0x995a: "Hai " +0x995b: "Meng " +0x995c: "Yan " +0x995d: "Mo " +0x995e: "Chan " +0x995f: "Xiang " +0x9960: "Luo " +0x9961: "Zuan " +0x9962: "Nang " +0x9963: "Shi " +0x9964: "Ding " +0x9965: "Ji " +0x9966: "Tuo " +0x9967: "Xing " +0x9968: "Tun " +0x9969: "Xi " +0x996a: "Ren " +0x996b: "Yu " +0x996c: "Chi " +0x996d: "Fan " +0x996e: "Yin " +0x996f: "Jian " +0x9970: "Shi " +0x9971: "Bao " +0x9972: "Si " +0x9973: "Duo " +0x9974: "Yi " +0x9975: "Er " +0x9976: "Rao " +0x9977: "Xiang " +0x9978: "Jia " +0x9979: "Le " +0x997a: "Jiao " +0x997b: "Yi " +0x997c: "Bing " +0x997d: "Bo " +0x997e: "Dou " +0x997f: "E " +0x9980: "Yu " +0x9981: "Nei " +0x9982: "Jun " +0x9983: "Guo " +0x9984: "Hun " +0x9985: "Xian " +0x9986: "Guan " +0x9987: "Cha " +0x9988: "Kui " +0x9989: "Gu " +0x998a: "Sou " +0x998b: "Chan " +0x998c: "Ye " +0x998d: "Mo " +0x998e: "Bo " +0x998f: "Liu " +0x9990: "Xiu " +0x9991: "Jin " +0x9992: "Man " +0x9993: "San " +0x9994: "Zhuan " +0x9995: "Nang " +0x9996: "Shou " +0x9997: "Kui " +0x9998: "Guo " +0x9999: "Xiang " +0x999a: "Fen " +0x999b: "Ba " +0x999c: "Ni " +0x999d: "Bi " +0x999e: "Bo " +0x999f: "Tu " +0x99a0: "Han " +0x99a1: "Fei " +0x99a2: "Jian " +0x99a3: "An " +0x99a4: "Ai " +0x99a5: "Fu " +0x99a6: "Xian " +0x99a7: "Wen " +0x99a8: "Xin " +0x99a9: "Fen " +0x99aa: "Bin " +0x99ab: "Xing " +0x99ac: "Ma " +0x99ad: "Yu " +0x99ae: "Feng " +0x99af: "Han " +0x99b0: "Di " +0x99b1: "Tuo " +0x99b2: "Tuo " +0x99b3: "Chi " +0x99b4: "Xun " +0x99b5: "Zhu " +0x99b6: "Zhi " +0x99b7: "Pei " +0x99b8: "Xin " +0x99b9: "Ri " +0x99ba: "Sa " +0x99bb: "Yin " +0x99bc: "Wen " +0x99bd: "Zhi " +0x99be: "Dan " +0x99bf: "Lu " +0x99c0: "You " +0x99c1: "Bo " +0x99c2: "Bao " +0x99c3: "Kuai " +0x99c4: "Tuo " +0x99c5: "Yi " +0x99c6: "Qu " +0x99c7: "[?] " +0x99c8: "Qu " +0x99c9: "Jiong " +0x99ca: "Bo " +0x99cb: "Zhao " +0x99cc: "Yuan " +0x99cd: "Peng " +0x99ce: "Zhou " +0x99cf: "Ju " +0x99d0: "Zhu " +0x99d1: "Nu " +0x99d2: "Ju " +0x99d3: "Pi " +0x99d4: "Zang " +0x99d5: "Jia " +0x99d6: "Ling " +0x99d7: "Zhen " +0x99d8: "Tai " +0x99d9: "Fu " +0x99da: "Yang " +0x99db: "Shi " +0x99dc: "Bi " +0x99dd: "Tuo " +0x99de: "Tuo " +0x99df: "Si " +0x99e0: "Liu " +0x99e1: "Ma " +0x99e2: "Pian " +0x99e3: "Tao " +0x99e4: "Zhi " +0x99e5: "Rong " +0x99e6: "Teng " +0x99e7: "Dong " +0x99e8: "Xun " +0x99e9: "Quan " +0x99ea: "Shen " +0x99eb: "Jiong " +0x99ec: "Er " +0x99ed: "Hai " +0x99ee: "Bo " +0x99ef: "Zhu " +0x99f0: "Yin " +0x99f1: "Luo " +0x99f2: "Shuu " +0x99f3: "Dan " +0x99f4: "Xie " +0x99f5: "Liu " +0x99f6: "Ju " +0x99f7: "Song " +0x99f8: "Qin " +0x99f9: "Mang " +0x99fa: "Liang " +0x99fb: "Han " +0x99fc: "Tu " +0x99fd: "Xuan " +0x99fe: "Tui " +0x99ff: "Jun " +/* x09a */ +0x9a00: "E " +0x9a01: "Cheng " +0x9a02: "Xin " +0x9a03: "Ai " +0x9a04: "Lu " +0x9a05: "Zhui " +0x9a06: "Zhou " +0x9a07: "She " +0x9a08: "Pian " +0x9a09: "Kun " +0x9a0a: "Tao " +0x9a0b: "Lai " +0x9a0c: "Zong " +0x9a0d: "Ke " +0x9a0e: "Qi " +0x9a0f: "Qi " +0x9a10: "Yan " +0x9a11: "Fei " +0x9a12: "Sao " +0x9a13: "Yan " +0x9a14: "Jie " +0x9a15: "Yao " +0x9a16: "Wu " +0x9a17: "Pian " +0x9a18: "Cong " +0x9a19: "Pian " +0x9a1a: "Qian " +0x9a1b: "Fei " +0x9a1c: "Huang " +0x9a1d: "Jian " +0x9a1e: "Huo " +0x9a1f: "Yu " +0x9a20: "Ti " +0x9a21: "Quan " +0x9a22: "Xia " +0x9a23: "Zong " +0x9a24: "Kui " +0x9a25: "Rou " +0x9a26: "Si " +0x9a27: "Gua " +0x9a28: "Tuo " +0x9a29: "Kui " +0x9a2a: "Sou " +0x9a2b: "Qian " +0x9a2c: "Cheng " +0x9a2d: "Zhi " +0x9a2e: "Liu " +0x9a2f: "Pang " +0x9a30: "Teng " +0x9a31: "Xi " +0x9a32: "Cao " +0x9a33: "Du " +0x9a34: "Yan " +0x9a35: "Yuan " +0x9a36: "Zou " +0x9a37: "Sao " +0x9a38: "Shan " +0x9a39: "Li " +0x9a3a: "Zhi " +0x9a3b: "Shuang " +0x9a3c: "Lu " +0x9a3d: "Xi " +0x9a3e: "Luo " +0x9a3f: "Zhang " +0x9a40: "Mo " +0x9a41: "Ao " +0x9a42: "Can " +0x9a43: "Piao " +0x9a44: "Cong " +0x9a45: "Qu " +0x9a46: "Bi " +0x9a47: "Zhi " +0x9a48: "Yu " +0x9a49: "Xu " +0x9a4a: "Hua " +0x9a4b: "Bo " +0x9a4c: "Su " +0x9a4d: "Xiao " +0x9a4e: "Lin " +0x9a4f: "Chan " +0x9a50: "Dun " +0x9a51: "Liu " +0x9a52: "Tuo " +0x9a53: "Zeng " +0x9a54: "Tan " +0x9a55: "Jiao " +0x9a56: "Tie " +0x9a57: "Yan " +0x9a58: "Luo " +0x9a59: "Zhan " +0x9a5a: "Jing " +0x9a5b: "Yi " +0x9a5c: "Ye " +0x9a5d: "Tuo " +0x9a5e: "Bin " +0x9a5f: "Zou " +0x9a60: "Yan " +0x9a61: "Peng " +0x9a62: "Lu " +0x9a63: "Teng " +0x9a64: "Xiang " +0x9a65: "Ji " +0x9a66: "Shuang " +0x9a67: "Ju " +0x9a68: "Xi " +0x9a69: "Huan " +0x9a6a: "Li " +0x9a6b: "Biao " +0x9a6c: "Ma " +0x9a6d: "Yu " +0x9a6e: "Tuo " +0x9a6f: "Xun " +0x9a70: "Chi " +0x9a71: "Qu " +0x9a72: "Ri " +0x9a73: "Bo " +0x9a74: "Lu " +0x9a75: "Zang " +0x9a76: "Shi " +0x9a77: "Si " +0x9a78: "Fu " +0x9a79: "Ju " +0x9a7a: "Zou " +0x9a7b: "Zhu " +0x9a7c: "Tuo " +0x9a7d: "Nu " +0x9a7e: "Jia " +0x9a7f: "Yi " +0x9a80: "Tai " +0x9a81: "Xiao " +0x9a82: "Ma " +0x9a83: "Yin " +0x9a84: "Jiao " +0x9a85: "Hua " +0x9a86: "Luo " +0x9a87: "Hai " +0x9a88: "Pian " +0x9a89: "Biao " +0x9a8a: "Li " +0x9a8b: "Cheng " +0x9a8c: "Yan " +0x9a8d: "Xin " +0x9a8e: "Qin " +0x9a8f: "Jun " +0x9a90: "Qi " +0x9a91: "Qi " +0x9a92: "Ke " +0x9a93: "Zhui " +0x9a94: "Zong " +0x9a95: "Su " +0x9a96: "Can " +0x9a97: "Pian " +0x9a98: "Zhi " +0x9a99: "Kui " +0x9a9a: "Sao " +0x9a9b: "Wu " +0x9a9c: "Ao " +0x9a9d: "Liu " +0x9a9e: "Qian " +0x9a9f: "Shan " +0x9aa0: "Piao " +0x9aa1: "Luo " +0x9aa2: "Cong " +0x9aa3: "Chan " +0x9aa4: "Zou " +0x9aa5: "Ji " +0x9aa6: "Shuang " +0x9aa7: "Xiang " +0x9aa8: "Gu " +0x9aa9: "Wei " +0x9aaa: "Wei " +0x9aab: "Wei " +0x9aac: "Yu " +0x9aad: "Gan " +0x9aae: "Yi " +0x9aaf: "Ang " +0x9ab0: "Tou " +0x9ab1: "Xie " +0x9ab2: "Bao " +0x9ab3: "Bi " +0x9ab4: "Chi " +0x9ab5: "Ti " +0x9ab6: "Di " +0x9ab7: "Ku " +0x9ab8: "Hai " +0x9ab9: "Qiao " +0x9aba: "Gou " +0x9abb: "Kua " +0x9abc: "Ge " +0x9abd: "Tui " +0x9abe: "Geng " +0x9abf: "Pian " +0x9ac0: "Bi " +0x9ac1: "Ke " +0x9ac2: "Ka " +0x9ac3: "Yu " +0x9ac4: "Sui " +0x9ac5: "Lou " +0x9ac6: "Bo " +0x9ac7: "Xiao " +0x9ac8: "Pang " +0x9ac9: "Bo " +0x9aca: "Ci " +0x9acb: "Kuan " +0x9acc: "Bin " +0x9acd: "Mo " +0x9ace: "Liao " +0x9acf: "Lou " +0x9ad0: "Nao " +0x9ad1: "Du " +0x9ad2: "Zang " +0x9ad3: "Sui " +0x9ad4: "Ti " +0x9ad5: "Bin " +0x9ad6: "Kuan " +0x9ad7: "Lu " +0x9ad8: "Gao " +0x9ad9: "Gao " +0x9ada: "Qiao " +0x9adb: "Kao " +0x9adc: "Qiao " +0x9add: "Lao " +0x9ade: "Zao " +0x9adf: "Biao " +0x9ae0: "Kun " +0x9ae1: "Kun " +0x9ae2: "Ti " +0x9ae3: "Fang " +0x9ae4: "Xiu " +0x9ae5: "Ran " +0x9ae6: "Mao " +0x9ae7: "Dan " +0x9ae8: "Kun " +0x9ae9: "Bin " +0x9aea: "Fa " +0x9aeb: "Tiao " +0x9aec: "Peng " +0x9aed: "Zi " +0x9aee: "Fa " +0x9aef: "Ran " +0x9af0: "Ti " +0x9af1: "Pao " +0x9af2: "Pi " +0x9af3: "Mao " +0x9af4: "Fu " +0x9af5: "Er " +0x9af6: "Rong " +0x9af7: "Qu " +0x9af8: "Gong " +0x9af9: "Xiu " +0x9afa: "Gua " +0x9afb: "Ji " +0x9afc: "Peng " +0x9afd: "Zhua " +0x9afe: "Shao " +0x9aff: "Sha " +/* x09b */ +0x9b00: "Ti " +0x9b01: "Li " +0x9b02: "Bin " +0x9b03: "Zong " +0x9b04: "Ti " +0x9b05: "Peng " +0x9b06: "Song " +0x9b07: "Zheng " +0x9b08: "Quan " +0x9b09: "Zong " +0x9b0a: "Shun " +0x9b0b: "Jian " +0x9b0c: "Duo " +0x9b0d: "Hu " +0x9b0e: "La " +0x9b0f: "Jiu " +0x9b10: "Qi " +0x9b11: "Lian " +0x9b12: "Zhen " +0x9b13: "Bin " +0x9b14: "Peng " +0x9b15: "Mo " +0x9b16: "San " +0x9b17: "Man " +0x9b18: "Man " +0x9b19: "Seng " +0x9b1a: "Xu " +0x9b1b: "Lie " +0x9b1c: "Qian " +0x9b1d: "Qian " +0x9b1e: "Nong " +0x9b1f: "Huan " +0x9b20: "Kuai " +0x9b21: "Ning " +0x9b22: "Bin " +0x9b23: "Lie " +0x9b24: "Rang " +0x9b25: "Dou " +0x9b26: "Dou " +0x9b27: "Nao " +0x9b28: "Hong " +0x9b29: "Xi " +0x9b2a: "Dou " +0x9b2b: "Han " +0x9b2c: "Dou " +0x9b2d: "Dou " +0x9b2e: "Jiu " +0x9b2f: "Chang " +0x9b30: "Yu " +0x9b31: "Yu " +0x9b32: "Li " +0x9b33: "Juan " +0x9b34: "Fu " +0x9b35: "Qian " +0x9b36: "Gui " +0x9b37: "Zong " +0x9b38: "Liu " +0x9b39: "Gui " +0x9b3a: "Shang " +0x9b3b: "Yu " +0x9b3c: "Gui " +0x9b3d: "Mei " +0x9b3e: "Ji " +0x9b3f: "Qi " +0x9b40: "Jie " +0x9b41: "Kui " +0x9b42: "Hun " +0x9b43: "Ba " +0x9b44: "Po " +0x9b45: "Mei " +0x9b46: "Xu " +0x9b47: "Yan " +0x9b48: "Xiao " +0x9b49: "Liang " +0x9b4a: "Yu " +0x9b4b: "Tui " +0x9b4c: "Qi " +0x9b4d: "Wang " +0x9b4e: "Liang " +0x9b4f: "Wei " +0x9b50: "Jian " +0x9b51: "Chi " +0x9b52: "Piao " +0x9b53: "Bi " +0x9b54: "Mo " +0x9b55: "Ji " +0x9b56: "Xu " +0x9b57: "Chou " +0x9b58: "Yan " +0x9b59: "Zhan " +0x9b5a: "Yu " +0x9b5b: "Dao " +0x9b5c: "Ren " +0x9b5d: "Ji " +0x9b5e: "Eri " +0x9b5f: "Gong " +0x9b60: "Tuo " +0x9b61: "Diao " +0x9b62: "Ji " +0x9b63: "Xu " +0x9b64: "E " +0x9b65: "E " +0x9b66: "Sha " +0x9b67: "Hang " +0x9b68: "Tun " +0x9b69: "Mo " +0x9b6a: "Jie " +0x9b6b: "Shen " +0x9b6c: "Fan " +0x9b6d: "Yuan " +0x9b6e: "Bi " +0x9b6f: "Lu " +0x9b70: "Wen " +0x9b71: "Hu " +0x9b72: "Lu " +0x9b73: "Za " +0x9b74: "Fang " +0x9b75: "Fen " +0x9b76: "Na " +0x9b77: "You " +0x9b78: "Namazu " +0x9b79: "Todo " +0x9b7a: "He " +0x9b7b: "Xia " +0x9b7c: "Qu " +0x9b7d: "Han " +0x9b7e: "Pi " +0x9b7f: "Ling " +0x9b80: "Tuo " +0x9b81: "Bo " +0x9b82: "Qiu " +0x9b83: "Ping " +0x9b84: "Fu " +0x9b85: "Bi " +0x9b86: "Ji " +0x9b87: "Wei " +0x9b88: "Ju " +0x9b89: "Diao " +0x9b8a: "Bo " +0x9b8b: "You " +0x9b8c: "Gun " +0x9b8d: "Pi " +0x9b8e: "Nian " +0x9b8f: "Xing " +0x9b90: "Tai " +0x9b91: "Bao " +0x9b92: "Fu " +0x9b93: "Zha " +0x9b94: "Ju " +0x9b95: "Gu " +0x9b96: "Kajika " +0x9b97: "Tong " +0x9b98: "[?] " +0x9b99: "Ta " +0x9b9a: "Jie " +0x9b9b: "Shu " +0x9b9c: "Hou " +0x9b9d: "Xiang " +0x9b9e: "Er " +0x9b9f: "An " +0x9ba0: "Wei " +0x9ba1: "Tiao " +0x9ba2: "Zhu " +0x9ba3: "Yin " +0x9ba4: "Lie " +0x9ba5: "Luo " +0x9ba6: "Tong " +0x9ba7: "Yi " +0x9ba8: "Qi " +0x9ba9: "Bing " +0x9baa: "Wei " +0x9bab: "Jiao " +0x9bac: "Bu " +0x9bad: "Gui " +0x9bae: "Xian " +0x9baf: "Ge " +0x9bb0: "Hui " +0x9bb1: "Bora " +0x9bb2: "Mate " +0x9bb3: "Kao " +0x9bb4: "Gori " +0x9bb5: "Duo " +0x9bb6: "Jun " +0x9bb7: "Ti " +0x9bb8: "Man " +0x9bb9: "Xiao " +0x9bba: "Za " +0x9bbb: "Sha " +0x9bbc: "Qin " +0x9bbd: "Yu " +0x9bbe: "Nei " +0x9bbf: "Zhe " +0x9bc0: "Gun " +0x9bc1: "Geng " +0x9bc2: "Su " +0x9bc3: "Wu " +0x9bc4: "Qiu " +0x9bc5: "Ting " +0x9bc6: "Fu " +0x9bc7: "Wan " +0x9bc8: "You " +0x9bc9: "Li " +0x9bca: "Sha " +0x9bcb: "Sha " +0x9bcc: "Gao " +0x9bcd: "Meng " +0x9bce: "Ugui " +0x9bcf: "Asari " +0x9bd0: "Subashiri " +0x9bd1: "Kazunoko " +0x9bd2: "Yong " +0x9bd3: "Ni " +0x9bd4: "Zi " +0x9bd5: "Qi " +0x9bd6: "Qing " +0x9bd7: "Xiang " +0x9bd8: "Nei " +0x9bd9: "Chun " +0x9bda: "Ji " +0x9bdb: "Diao " +0x9bdc: "Qie " +0x9bdd: "Gu " +0x9bde: "Zhou " +0x9bdf: "Dong " +0x9be0: "Lai " +0x9be1: "Fei " +0x9be2: "Ni " +0x9be3: "Yi " +0x9be4: "Kun " +0x9be5: "Lu " +0x9be6: "Jiu " +0x9be7: "Chang " +0x9be8: "Jing " +0x9be9: "Lun " +0x9bea: "Ling " +0x9beb: "Zou " +0x9bec: "Li " +0x9bed: "Meng " +0x9bee: "Zong " +0x9bef: "Zhi " +0x9bf0: "Nian " +0x9bf1: "Shachi " +0x9bf2: "Dojou " +0x9bf3: "Sukesou " +0x9bf4: "Shi " +0x9bf5: "Shen " +0x9bf6: "Hun " +0x9bf7: "Shi " +0x9bf8: "Hou " +0x9bf9: "Xing " +0x9bfa: "Zhu " +0x9bfb: "La " +0x9bfc: "Zong " +0x9bfd: "Ji " +0x9bfe: "Bian " +0x9bff: "Bian " +/* x09c */ +0x9c00: "Huan " +0x9c01: "Quan " +0x9c02: "Ze " +0x9c03: "Wei " +0x9c04: "Wei " +0x9c05: "Yu " +0x9c06: "Qun " +0x9c07: "Rou " +0x9c08: "Die " +0x9c09: "Huang " +0x9c0a: "Lian " +0x9c0b: "Yan " +0x9c0c: "Qiu " +0x9c0d: "Qiu " +0x9c0e: "Jian " +0x9c0f: "Bi " +0x9c10: "E " +0x9c11: "Yang " +0x9c12: "Fu " +0x9c13: "Sai " +0x9c14: "Jian " +0x9c15: "Xia " +0x9c16: "Tuo " +0x9c17: "Hu " +0x9c18: "Muroaji " +0x9c19: "Ruo " +0x9c1a: "Haraka " +0x9c1b: "Wen " +0x9c1c: "Jian " +0x9c1d: "Hao " +0x9c1e: "Wu " +0x9c1f: "Fang " +0x9c20: "Sao " +0x9c21: "Liu " +0x9c22: "Ma " +0x9c23: "Shi " +0x9c24: "Shi " +0x9c25: "Yin " +0x9c26: "Z " +0x9c27: "Teng " +0x9c28: "Ta " +0x9c29: "Yao " +0x9c2a: "Ge " +0x9c2b: "Rong " +0x9c2c: "Qian " +0x9c2d: "Qi " +0x9c2e: "Wen " +0x9c2f: "Ruo " +0x9c30: "Hatahata " +0x9c31: "Lian " +0x9c32: "Ao " +0x9c33: "Le " +0x9c34: "Hui " +0x9c35: "Min " +0x9c36: "Ji " +0x9c37: "Tiao " +0x9c38: "Qu " +0x9c39: "Jian " +0x9c3a: "Sao " +0x9c3b: "Man " +0x9c3c: "Xi " +0x9c3d: "Qiu " +0x9c3e: "Biao " +0x9c3f: "Ji " +0x9c40: "Ji " +0x9c41: "Zhu " +0x9c42: "Jiang " +0x9c43: "Qiu " +0x9c44: "Zhuan " +0x9c45: "Yong " +0x9c46: "Zhang " +0x9c47: "Kang " +0x9c48: "Xue " +0x9c49: "Bie " +0x9c4a: "Jue " +0x9c4b: "Qu " +0x9c4c: "Xiang " +0x9c4d: "Bo " +0x9c4e: "Jiao " +0x9c4f: "Xun " +0x9c50: "Su " +0x9c51: "Huang " +0x9c52: "Zun " +0x9c53: "Shan " +0x9c54: "Shan " +0x9c55: "Fan " +0x9c56: "Jue " +0x9c57: "Lin " +0x9c58: "Xun " +0x9c59: "Miao " +0x9c5a: "Xi " +0x9c5b: "Eso " +0x9c5c: "Kyou " +0x9c5d: "Fen " +0x9c5e: "Guan " +0x9c5f: "Hou " +0x9c60: "Kuai " +0x9c61: "Zei " +0x9c62: "Sao " +0x9c63: "Zhan " +0x9c64: "Gan " +0x9c65: "Gui " +0x9c66: "Sheng " +0x9c67: "Li " +0x9c68: "Chang " +0x9c69: "Hatahata " +0x9c6a: "Shiira " +0x9c6b: "Mutsu " +0x9c6c: "Ru " +0x9c6d: "Ji " +0x9c6e: "Xu " +0x9c6f: "Huo " +0x9c70: "Shiira " +0x9c71: "Li " +0x9c72: "Lie " +0x9c73: "Li " +0x9c74: "Mie " +0x9c75: "Zhen " +0x9c76: "Xiang " +0x9c77: "E " +0x9c78: "Lu " +0x9c79: "Guan " +0x9c7a: "Li " +0x9c7b: "Xian " +0x9c7c: "Yu " +0x9c7d: "Dao " +0x9c7e: "Ji " +0x9c7f: "You " +0x9c80: "Tun " +0x9c81: "Lu " +0x9c82: "Fang " +0x9c83: "Ba " +0x9c84: "He " +0x9c85: "Bo " +0x9c86: "Ping " +0x9c87: "Nian " +0x9c88: "Lu " +0x9c89: "You " +0x9c8a: "Zha " +0x9c8b: "Fu " +0x9c8c: "Bo " +0x9c8d: "Bao " +0x9c8e: "Hou " +0x9c8f: "Pi " +0x9c90: "Tai " +0x9c91: "Gui " +0x9c92: "Jie " +0x9c93: "Kao " +0x9c94: "Wei " +0x9c95: "Er " +0x9c96: "Tong " +0x9c97: "Ze " +0x9c98: "Hou " +0x9c99: "Kuai " +0x9c9a: "Ji " +0x9c9b: "Jiao " +0x9c9c: "Xian " +0x9c9d: "Za " +0x9c9e: "Xiang " +0x9c9f: "Xun " +0x9ca0: "Geng " +0x9ca1: "Li " +0x9ca2: "Lian " +0x9ca3: "Jian " +0x9ca4: "Li " +0x9ca5: "Shi " +0x9ca6: "Tiao " +0x9ca7: "Gun " +0x9ca8: "Sha " +0x9ca9: "Wan " +0x9caa: "Jun " +0x9cab: "Ji " +0x9cac: "Yong " +0x9cad: "Qing " +0x9cae: "Ling " +0x9caf: "Qi " +0x9cb0: "Zou " +0x9cb1: "Fei " +0x9cb2: "Kun " +0x9cb3: "Chang " +0x9cb4: "Gu " +0x9cb5: "Ni " +0x9cb6: "Nian " +0x9cb7: "Diao " +0x9cb8: "Jing " +0x9cb9: "Shen " +0x9cba: "Shi " +0x9cbb: "Zi " +0x9cbc: "Fen " +0x9cbd: "Die " +0x9cbe: "Bi " +0x9cbf: "Chang " +0x9cc0: "Shi " +0x9cc1: "Wen " +0x9cc2: "Wei " +0x9cc3: "Sai " +0x9cc4: "E " +0x9cc5: "Qiu " +0x9cc6: "Fu " +0x9cc7: "Huang " +0x9cc8: "Quan " +0x9cc9: "Jiang " +0x9cca: "Bian " +0x9ccb: "Sao " +0x9ccc: "Ao " +0x9ccd: "Qi " +0x9cce: "Ta " +0x9ccf: "Yin " +0x9cd0: "Yao " +0x9cd1: "Fang " +0x9cd2: "Jian " +0x9cd3: "Le " +0x9cd4: "Biao " +0x9cd5: "Xue " +0x9cd6: "Bie " +0x9cd7: "Man " +0x9cd8: "Min " +0x9cd9: "Yong " +0x9cda: "Wei " +0x9cdb: "Xi " +0x9cdc: "Jue " +0x9cdd: "Shan " +0x9cde: "Lin " +0x9cdf: "Zun " +0x9ce0: "Huo " +0x9ce1: "Gan " +0x9ce2: "Li " +0x9ce3: "Zhan " +0x9ce4: "Guan " +0x9ce5: "Niao " +0x9ce6: "Yi " +0x9ce7: "Fu " +0x9ce8: "Li " +0x9ce9: "Jiu " +0x9cea: "Bu " +0x9ceb: "Yan " +0x9cec: "Fu " +0x9ced: "Diao " +0x9cee: "Ji " +0x9cef: "Feng " +0x9cf0: "Nio " +0x9cf1: "Gan " +0x9cf2: "Shi " +0x9cf3: "Feng " +0x9cf4: "Ming " +0x9cf5: "Bao " +0x9cf6: "Yuan " +0x9cf7: "Zhi " +0x9cf8: "Hu " +0x9cf9: "Qin " +0x9cfa: "Fu " +0x9cfb: "Fen " +0x9cfc: "Wen " +0x9cfd: "Jian " +0x9cfe: "Shi " +0x9cff: "Yu " +/* x09d */ +0x9d00: "Fou " +0x9d01: "Yiao " +0x9d02: "Jue " +0x9d03: "Jue " +0x9d04: "Pi " +0x9d05: "Huan " +0x9d06: "Zhen " +0x9d07: "Bao " +0x9d08: "Yan " +0x9d09: "Ya " +0x9d0a: "Zheng " +0x9d0b: "Fang " +0x9d0c: "Feng " +0x9d0d: "Wen " +0x9d0e: "Ou " +0x9d0f: "Te " +0x9d10: "Jia " +0x9d11: "Nu " +0x9d12: "Ling " +0x9d13: "Mie " +0x9d14: "Fu " +0x9d15: "Tuo " +0x9d16: "Wen " +0x9d17: "Li " +0x9d18: "Bian " +0x9d19: "Zhi " +0x9d1a: "Ge " +0x9d1b: "Yuan " +0x9d1c: "Zi " +0x9d1d: "Qu " +0x9d1e: "Xiao " +0x9d1f: "Zhi " +0x9d20: "Dan " +0x9d21: "Ju " +0x9d22: "You " +0x9d23: "Gu " +0x9d24: "Zhong " +0x9d25: "Yu " +0x9d26: "Yang " +0x9d27: "Rong " +0x9d28: "Ya " +0x9d29: "Tie " +0x9d2a: "Yu " +0x9d2b: "Shigi " +0x9d2c: "Ying " +0x9d2d: "Zhui " +0x9d2e: "Wu " +0x9d2f: "Er " +0x9d30: "Gua " +0x9d31: "Ai " +0x9d32: "Zhi " +0x9d33: "Yan " +0x9d34: "Heng " +0x9d35: "Jiao " +0x9d36: "Ji " +0x9d37: "Lie " +0x9d38: "Zhu " +0x9d39: "Ren " +0x9d3a: "Yi " +0x9d3b: "Hong " +0x9d3c: "Luo " +0x9d3d: "Ru " +0x9d3e: "Mou " +0x9d3f: "Ge " +0x9d40: "Ren " +0x9d41: "Jiao " +0x9d42: "Xiu " +0x9d43: "Zhou " +0x9d44: "Zhi " +0x9d45: "Luo " +0x9d46: "Chidori " +0x9d47: "Toki " +0x9d48: "Ten " +0x9d49: "Luan " +0x9d4a: "Jia " +0x9d4b: "Ji " +0x9d4c: "Yu " +0x9d4d: "Huan " +0x9d4e: "Tuo " +0x9d4f: "Bu " +0x9d50: "Wu " +0x9d51: "Juan " +0x9d52: "Yu " +0x9d53: "Bo " +0x9d54: "Xun " +0x9d55: "Xun " +0x9d56: "Bi " +0x9d57: "Xi " +0x9d58: "Jun " +0x9d59: "Ju " +0x9d5a: "Tu " +0x9d5b: "Jing " +0x9d5c: "Ti " +0x9d5d: "E " +0x9d5e: "E " +0x9d5f: "Kuang " +0x9d60: "Hu " +0x9d61: "Wu " +0x9d62: "Shen " +0x9d63: "Lai " +0x9d64: "Ikaruga " +0x9d65: "Kakesu " +0x9d66: "Lu " +0x9d67: "Ping " +0x9d68: "Shu " +0x9d69: "Fu " +0x9d6a: "An " +0x9d6b: "Zhao " +0x9d6c: "Peng " +0x9d6d: "Qin " +0x9d6e: "Qian " +0x9d6f: "Bei " +0x9d70: "Diao " +0x9d71: "Lu " +0x9d72: "Que " +0x9d73: "Jian " +0x9d74: "Ju " +0x9d75: "Tu " +0x9d76: "Ya " +0x9d77: "Yuan " +0x9d78: "Qi " +0x9d79: "Li " +0x9d7a: "Ye " +0x9d7b: "Zhui " +0x9d7c: "Kong " +0x9d7d: "Zhui " +0x9d7e: "Kun " +0x9d7f: "Sheng " +0x9d80: "Qi " +0x9d81: "Jing " +0x9d82: "Yi " +0x9d83: "Yi " +0x9d84: "Jing " +0x9d85: "Zi " +0x9d86: "Lai " +0x9d87: "Dong " +0x9d88: "Qi " +0x9d89: "Chun " +0x9d8a: "Geng " +0x9d8b: "Ju " +0x9d8c: "Qu " +0x9d8d: "Isuka " +0x9d8e: "Kikuitadaki " +0x9d8f: "Ji " +0x9d90: "Shu " +0x9d91: "[?] " +0x9d92: "Chi " +0x9d93: "Miao " +0x9d94: "Rou " +0x9d95: "An " +0x9d96: "Qiu " +0x9d97: "Ti " +0x9d98: "Hu " +0x9d99: "Ti " +0x9d9a: "E " +0x9d9b: "Jie " +0x9d9c: "Mao " +0x9d9d: "Fu " +0x9d9e: "Chun " +0x9d9f: "Tu " +0x9da0: "Yan " +0x9da1: "He " +0x9da2: "Yuan " +0x9da3: "Pian " +0x9da4: "Yun " +0x9da5: "Mei " +0x9da6: "Hu " +0x9da7: "Ying " +0x9da8: "Dun " +0x9da9: "Mu " +0x9daa: "Ju " +0x9dab: "Tsugumi " +0x9dac: "Cang " +0x9dad: "Fang " +0x9dae: "Gu " +0x9daf: "Ying " +0x9db0: "Yuan " +0x9db1: "Xuan " +0x9db2: "Weng " +0x9db3: "Shi " +0x9db4: "He " +0x9db5: "Chu " +0x9db6: "Tang " +0x9db7: "Xia " +0x9db8: "Ruo " +0x9db9: "Liu " +0x9dba: "Ji " +0x9dbb: "Gu " +0x9dbc: "Jian " +0x9dbd: "Zhun " +0x9dbe: "Han " +0x9dbf: "Zi " +0x9dc0: "Zi " +0x9dc1: "Ni " +0x9dc2: "Yao " +0x9dc3: "Yan " +0x9dc4: "Ji " +0x9dc5: "Li " +0x9dc6: "Tian " +0x9dc7: "Kou " +0x9dc8: "Ti " +0x9dc9: "Ti " +0x9dca: "Ni " +0x9dcb: "Tu " +0x9dcc: "Ma " +0x9dcd: "Jiao " +0x9dce: "Gao " +0x9dcf: "Tian " +0x9dd0: "Chen " +0x9dd1: "Li " +0x9dd2: "Zhuan " +0x9dd3: "Zhe " +0x9dd4: "Ao " +0x9dd5: "Yao " +0x9dd6: "Yi " +0x9dd7: "Ou " +0x9dd8: "Chi " +0x9dd9: "Zhi " +0x9dda: "Liao " +0x9ddb: "Rong " +0x9ddc: "Lou " +0x9ddd: "Bi " +0x9dde: "Shuang " +0x9ddf: "Zhuo " +0x9de0: "Yu " +0x9de1: "Wu " +0x9de2: "Jue " +0x9de3: "Yin " +0x9de4: "Quan " +0x9de5: "Si " +0x9de6: "Jiao " +0x9de7: "Yi " +0x9de8: "Hua " +0x9de9: "Bi " +0x9dea: "Ying " +0x9deb: "Su " +0x9dec: "Huang " +0x9ded: "Fan " +0x9dee: "Jiao " +0x9def: "Liao " +0x9df0: "Yan " +0x9df1: "Kao " +0x9df2: "Jiu " +0x9df3: "Xian " +0x9df4: "Xian " +0x9df5: "Tu " +0x9df6: "Mai " +0x9df7: "Zun " +0x9df8: "Yu " +0x9df9: "Ying " +0x9dfa: "Lu " +0x9dfb: "Tuan " +0x9dfc: "Xian " +0x9dfd: "Xue " +0x9dfe: "Yi " +0x9dff: "Pi " +/* x09e */ +0x9e00: "Shu " +0x9e01: "Luo " +0x9e02: "Qi " +0x9e03: "Yi " +0x9e04: "Ji " +0x9e05: "Zhe " +0x9e06: "Yu " +0x9e07: "Zhan " +0x9e08: "Ye " +0x9e09: "Yang " +0x9e0a: "Pi " +0x9e0b: "Ning " +0x9e0c: "Huo " +0x9e0d: "Mi " +0x9e0e: "Ying " +0x9e0f: "Meng " +0x9e10: "Di " +0x9e11: "Yue " +0x9e12: "Yu " +0x9e13: "Lei " +0x9e14: "Bao " +0x9e15: "Lu " +0x9e16: "He " +0x9e17: "Long " +0x9e18: "Shuang " +0x9e19: "Yue " +0x9e1a: "Ying " +0x9e1b: "Guan " +0x9e1c: "Qu " +0x9e1d: "Li " +0x9e1e: "Luan " +0x9e1f: "Niao " +0x9e20: "Jiu " +0x9e21: "Ji " +0x9e22: "Yuan " +0x9e23: "Ming " +0x9e24: "Shi " +0x9e25: "Ou " +0x9e26: "Ya " +0x9e27: "Cang " +0x9e28: "Bao " +0x9e29: "Zhen " +0x9e2a: "Gu " +0x9e2b: "Dong " +0x9e2c: "Lu " +0x9e2d: "Ya " +0x9e2e: "Xiao " +0x9e2f: "Yang " +0x9e30: "Ling " +0x9e31: "Zhi " +0x9e32: "Qu " +0x9e33: "Yuan " +0x9e34: "Xue " +0x9e35: "Tuo " +0x9e36: "Si " +0x9e37: "Zhi " +0x9e38: "Er " +0x9e39: "Gua " +0x9e3a: "Xiu " +0x9e3b: "Heng " +0x9e3c: "Zhou " +0x9e3d: "Ge " +0x9e3e: "Luan " +0x9e3f: "Hong " +0x9e40: "Wu " +0x9e41: "Bo " +0x9e42: "Li " +0x9e43: "Juan " +0x9e44: "Hu " +0x9e45: "E " +0x9e46: "Yu " +0x9e47: "Xian " +0x9e48: "Ti " +0x9e49: "Wu " +0x9e4a: "Que " +0x9e4b: "Miao " +0x9e4c: "An " +0x9e4d: "Kun " +0x9e4e: "Bei " +0x9e4f: "Peng " +0x9e50: "Qian " +0x9e51: "Chun " +0x9e52: "Geng " +0x9e53: "Yuan " +0x9e54: "Su " +0x9e55: "Hu " +0x9e56: "He " +0x9e57: "E " +0x9e58: "Gu " +0x9e59: "Qiu " +0x9e5a: "Zi " +0x9e5b: "Mei " +0x9e5c: "Mu " +0x9e5d: "Ni " +0x9e5e: "Yao " +0x9e5f: "Weng " +0x9e60: "Liu " +0x9e61: "Ji " +0x9e62: "Ni " +0x9e63: "Jian " +0x9e64: "He " +0x9e65: "Yi " +0x9e66: "Ying " +0x9e67: "Zhe " +0x9e68: "Liao " +0x9e69: "Liao " +0x9e6a: "Jiao " +0x9e6b: "Jiu " +0x9e6c: "Yu " +0x9e6d: "Lu " +0x9e6e: "Xuan " +0x9e6f: "Zhan " +0x9e70: "Ying " +0x9e71: "Huo " +0x9e72: "Meng " +0x9e73: "Guan " +0x9e74: "Shuang " +0x9e75: "Lu " +0x9e76: "Jin " +0x9e77: "Ling " +0x9e78: "Jian " +0x9e79: "Xian " +0x9e7a: "Cuo " +0x9e7b: "Jian " +0x9e7c: "Jian " +0x9e7d: "Yan " +0x9e7e: "Cuo " +0x9e7f: "Lu " +0x9e80: "You " +0x9e81: "Cu " +0x9e82: "Ji " +0x9e83: "Biao " +0x9e84: "Cu " +0x9e85: "Biao " +0x9e86: "Zhu " +0x9e87: "Jun " +0x9e88: "Zhu " +0x9e89: "Jian " +0x9e8a: "Mi " +0x9e8b: "Mi " +0x9e8c: "Wu " +0x9e8d: "Liu " +0x9e8e: "Chen " +0x9e8f: "Jun " +0x9e90: "Lin " +0x9e91: "Ni " +0x9e92: "Qi " +0x9e93: "Lu " +0x9e94: "Jiu " +0x9e95: "Jun " +0x9e96: "Jing " +0x9e97: "Li " +0x9e98: "Xiang " +0x9e99: "Yan " +0x9e9a: "Jia " +0x9e9b: "Mi " +0x9e9c: "Li " +0x9e9d: "She " +0x9e9e: "Zhang " +0x9e9f: "Lin " +0x9ea0: "Jing " +0x9ea1: "Ji " +0x9ea2: "Ling " +0x9ea3: "Yan " +0x9ea4: "Cu " +0x9ea5: "Mai " +0x9ea6: "Mai " +0x9ea7: "Ge " +0x9ea8: "Chao " +0x9ea9: "Fu " +0x9eaa: "Mian " +0x9eab: "Mian " +0x9eac: "Fu " +0x9ead: "Pao " +0x9eae: "Qu " +0x9eaf: "Qu " +0x9eb0: "Mou " +0x9eb1: "Fu " +0x9eb2: "Xian " +0x9eb3: "Lai " +0x9eb4: "Qu " +0x9eb5: "Mian " +0x9eb6: "[?] " +0x9eb7: "Feng " +0x9eb8: "Fu " +0x9eb9: "Qu " +0x9eba: "Mian " +0x9ebb: "Ma " +0x9ebc: "Mo " +0x9ebd: "Mo " +0x9ebe: "Hui " +0x9ebf: "Ma " +0x9ec0: "Zou " +0x9ec1: "Nen " +0x9ec2: "Fen " +0x9ec3: "Huang " +0x9ec4: "Huang " +0x9ec5: "Jin " +0x9ec6: "Guang " +0x9ec7: "Tian " +0x9ec8: "Tou " +0x9ec9: "Heng " +0x9eca: "Xi " +0x9ecb: "Kuang " +0x9ecc: "Heng " +0x9ecd: "Shu " +0x9ece: "Li " +0x9ecf: "Nian " +0x9ed0: "Chi " +0x9ed1: "Hei " +0x9ed2: "Hei " +0x9ed3: "Yi " +0x9ed4: "Qian " +0x9ed5: "Dan " +0x9ed6: "Xi " +0x9ed7: "Tuan " +0x9ed8: "Mo " +0x9ed9: "Mo " +0x9eda: "Qian " +0x9edb: "Dai " +0x9edc: "Chu " +0x9edd: "You " +0x9ede: "Dian " +0x9edf: "Yi " +0x9ee0: "Xia " +0x9ee1: "Yan " +0x9ee2: "Qu " +0x9ee3: "Mei " +0x9ee4: "Yan " +0x9ee5: "Jing " +0x9ee6: "Yu " +0x9ee7: "Li " +0x9ee8: "Dang " +0x9ee9: "Du " +0x9eea: "Can " +0x9eeb: "Yin " +0x9eec: "An " +0x9eed: "Yan " +0x9eee: "Tan " +0x9eef: "An " +0x9ef0: "Zhen " +0x9ef1: "Dai " +0x9ef2: "Can " +0x9ef3: "Yi " +0x9ef4: "Mei " +0x9ef5: "Dan " +0x9ef6: "Yan " +0x9ef7: "Du " +0x9ef8: "Lu " +0x9ef9: "Zhi " +0x9efa: "Fen " +0x9efb: "Fu " +0x9efc: "Fu " +0x9efd: "Min " +0x9efe: "Min " +0x9eff: "Yuan " +/* x09f */ +0x9f00: "Cu " +0x9f01: "Qu " +0x9f02: "Chao " +0x9f03: "Wa " +0x9f04: "Zhu " +0x9f05: "Zhi " +0x9f06: "Mang " +0x9f07: "Ao " +0x9f08: "Bie " +0x9f09: "Tuo " +0x9f0a: "Bi " +0x9f0b: "Yuan " +0x9f0c: "Chao " +0x9f0d: "Tuo " +0x9f0e: "Ding " +0x9f0f: "Mi " +0x9f10: "Nai " +0x9f11: "Ding " +0x9f12: "Zi " +0x9f13: "Gu " +0x9f14: "Gu " +0x9f15: "Dong " +0x9f16: "Fen " +0x9f17: "Tao " +0x9f18: "Yuan " +0x9f19: "Pi " +0x9f1a: "Chang " +0x9f1b: "Gao " +0x9f1c: "Qi " +0x9f1d: "Yuan " +0x9f1e: "Tang " +0x9f1f: "Teng " +0x9f20: "Shu " +0x9f21: "Shu " +0x9f22: "Fen " +0x9f23: "Fei " +0x9f24: "Wen " +0x9f25: "Ba " +0x9f26: "Diao " +0x9f27: "Tuo " +0x9f28: "Tong " +0x9f29: "Qu " +0x9f2a: "Sheng " +0x9f2b: "Shi " +0x9f2c: "You " +0x9f2d: "Shi " +0x9f2e: "Ting " +0x9f2f: "Wu " +0x9f30: "Nian " +0x9f31: "Jing " +0x9f32: "Hun " +0x9f33: "Ju " +0x9f34: "Yan " +0x9f35: "Tu " +0x9f36: "Ti " +0x9f37: "Xi " +0x9f38: "Xian " +0x9f39: "Yan " +0x9f3a: "Lei " +0x9f3b: "Bi " +0x9f3c: "Yao " +0x9f3d: "Qiu " +0x9f3e: "Han " +0x9f3f: "Wu " +0x9f40: "Wu " +0x9f41: "Hou " +0x9f42: "Xi " +0x9f43: "Ge " +0x9f44: "Zha " +0x9f45: "Xiu " +0x9f46: "Weng " +0x9f47: "Zha " +0x9f48: "Nong " +0x9f49: "Nang " +0x9f4a: "Qi " +0x9f4b: "Zhai " +0x9f4c: "Ji " +0x9f4d: "Zi " +0x9f4e: "Ji " +0x9f4f: "Ji " +0x9f50: "Qi " +0x9f51: "Ji " +0x9f52: "Chi " +0x9f53: "Chen " +0x9f54: "Chen " +0x9f55: "He " +0x9f56: "Ya " +0x9f57: "Ken " +0x9f58: "Xie " +0x9f59: "Pao " +0x9f5a: "Cuo " +0x9f5b: "Shi " +0x9f5c: "Zi " +0x9f5d: "Chi " +0x9f5e: "Nian " +0x9f5f: "Ju " +0x9f60: "Tiao " +0x9f61: "Ling " +0x9f62: "Ling " +0x9f63: "Chu " +0x9f64: "Quan " +0x9f65: "Xie " +0x9f66: "Ken " +0x9f67: "Nie " +0x9f68: "Jiu " +0x9f69: "Yao " +0x9f6a: "Chuo " +0x9f6b: "Kun " +0x9f6c: "Yu " +0x9f6d: "Chu " +0x9f6e: "Yi " +0x9f6f: "Ni " +0x9f70: "Cuo " +0x9f71: "Zou " +0x9f72: "Qu " +0x9f73: "Nen " +0x9f74: "Xian " +0x9f75: "Ou " +0x9f76: "E " +0x9f77: "Wo " +0x9f78: "Yi " +0x9f79: "Chuo " +0x9f7a: "Zou " +0x9f7b: "Dian " +0x9f7c: "Chu " +0x9f7d: "Jin " +0x9f7e: "Ya " +0x9f7f: "Chi " +0x9f80: "Chen " +0x9f81: "He " +0x9f82: "Ken " +0x9f83: "Ju " +0x9f84: "Ling " +0x9f85: "Pao " +0x9f86: "Tiao " +0x9f87: "Zi " +0x9f88: "Ken " +0x9f89: "Yu " +0x9f8a: "Chuo " +0x9f8b: "Qu " +0x9f8c: "Wo " +0x9f8d: "Long " +0x9f8e: "Pang " +0x9f8f: "Gong " +0x9f90: "Pang " +0x9f91: "Yan " +0x9f92: "Long " +0x9f93: "Long " +0x9f94: "Gong " +0x9f95: "Kan " +0x9f96: "Ta " +0x9f97: "Ling " +0x9f98: "Ta " +0x9f99: "Long " +0x9f9a: "Gong " +0x9f9b: "Kan " +0x9f9c: "Gui " +0x9f9d: "Qiu " +0x9f9e: "Bie " +0x9f9f: "Gui " +0x9fa0: "Yue " +0x9fa1: "Chui " +0x9fa2: "He " +0x9fa3: "Jue " +0x9fa4: "Xie " +0x9fa5: "Yu " +0x9fa6: "[?]" +0x9fa7: "[?]" +0x9fa8: "[?]" +0x9fa9: "[?]" +0x9faa: "[?]" +0x9fab: "[?]" +0x9fac: "[?]" +0x9fad: "[?]" +0x9fae: "[?]" +0x9faf: "[?]" +0x9fb0: "[?]" +0x9fb1: "[?]" +0x9fb2: "[?]" +0x9fb3: "[?]" +0x9fb4: "[?]" +0x9fb5: "[?]" +0x9fb6: "[?]" +0x9fb7: "[?]" +0x9fb8: "[?]" +0x9fb9: "[?]" +0x9fba: "[?]" +0x9fbb: "[?]" +0x9fbc: "[?]" +0x9fbd: "[?]" +0x9fbe: "[?]" +0x9fbf: "[?]" +0x9fc0: "[?]" +0x9fc1: "[?]" +0x9fc2: "[?]" +0x9fc3: "[?]" +0x9fc4: "[?]" +0x9fc5: "[?]" +0x9fc6: "[?]" +0x9fc7: "[?]" +0x9fc8: "[?]" +0x9fc9: "[?]" +0x9fca: "[?]" +0x9fcb: "[?]" +0x9fcc: "[?]" +0x9fcd: "[?]" +0x9fce: "[?]" +0x9fcf: "[?]" +0x9fd0: "[?]" +0x9fd1: "[?]" +0x9fd2: "[?]" +0x9fd3: "[?]" +0x9fd4: "[?]" +0x9fd5: "[?]" +0x9fd6: "[?]" +0x9fd7: "[?]" +0x9fd8: "[?]" +0x9fd9: "[?]" +0x9fda: "[?]" +0x9fdb: "[?]" +0x9fdc: "[?]" +0x9fdd: "[?]" +0x9fde: "[?]" +0x9fdf: "[?]" +0x9fe0: "[?]" +0x9fe1: "[?]" +0x9fe2: "[?]" +0x9fe3: "[?]" +0x9fe4: "[?]" +0x9fe5: "[?]" +0x9fe6: "[?]" +0x9fe7: "[?]" +0x9fe8: "[?]" +0x9fe9: "[?]" +0x9fea: "[?]" +0x9feb: "[?]" +0x9fec: "[?]" +0x9fed: "[?]" +0x9fee: "[?]" +0x9fef: "[?]" +0x9ff0: "[?]" +0x9ff1: "[?]" +0x9ff2: "[?]" +0x9ff3: "[?]" +0x9ff4: "[?]" +0x9ff5: "[?]" +0x9ff6: "[?]" +0x9ff7: "[?]" +0x9ff8: "[?]" +0x9ff9: "[?]" +0x9ffa: "[?]" +0x9ffb: "[?]" +0x9ffc: "[?]" +0x9ffd: "[?]" +0x9ffe: "[?]" +/* x0a0 */ +0xa000: "it" +0xa001: "ix" +0xa002: "i" +0xa003: "ip" +0xa004: "iet" +0xa005: "iex" +0xa006: "ie" +0xa007: "iep" +0xa008: "at" +0xa009: "ax" +0xa00a: "a" +0xa00b: "ap" +0xa00c: "uox" +0xa00d: "uo" +0xa00e: "uop" +0xa00f: "ot" +0xa010: "ox" +0xa011: "o" +0xa012: "op" +0xa013: "ex" +0xa014: "e" +0xa015: "wu" +0xa016: "bit" +0xa017: "bix" +0xa018: "bi" +0xa019: "bip" +0xa01a: "biet" +0xa01b: "biex" +0xa01c: "bie" +0xa01d: "biep" +0xa01e: "bat" +0xa01f: "bax" +0xa020: "ba" +0xa021: "bap" +0xa022: "buox" +0xa023: "buo" +0xa024: "buop" +0xa025: "bot" +0xa026: "box" +0xa027: "bo" +0xa028: "bop" +0xa029: "bex" +0xa02a: "be" +0xa02b: "bep" +0xa02c: "but" +0xa02d: "bux" +0xa02e: "bu" +0xa02f: "bup" +0xa030: "burx" +0xa031: "bur" +0xa032: "byt" +0xa033: "byx" +0xa034: "by" +0xa035: "byp" +0xa036: "byrx" +0xa037: "byr" +0xa038: "pit" +0xa039: "pix" +0xa03a: "pi" +0xa03b: "pip" +0xa03c: "piex" +0xa03d: "pie" +0xa03e: "piep" +0xa03f: "pat" +0xa040: "pax" +0xa041: "pa" +0xa042: "pap" +0xa043: "puox" +0xa044: "puo" +0xa045: "puop" +0xa046: "pot" +0xa047: "pox" +0xa048: "po" +0xa049: "pop" +0xa04a: "put" +0xa04b: "pux" +0xa04c: "pu" +0xa04d: "pup" +0xa04e: "purx" +0xa04f: "pur" +0xa050: "pyt" +0xa051: "pyx" +0xa052: "py" +0xa053: "pyp" +0xa054: "pyrx" +0xa055: "pyr" +0xa056: "bbit" +0xa057: "bbix" +0xa058: "bbi" +0xa059: "bbip" +0xa05a: "bbiet" +0xa05b: "bbiex" +0xa05c: "bbie" +0xa05d: "bbiep" +0xa05e: "bbat" +0xa05f: "bbax" +0xa060: "bba" +0xa061: "bbap" +0xa062: "bbuox" +0xa063: "bbuo" +0xa064: "bbuop" +0xa065: "bbot" +0xa066: "bbox" +0xa067: "bbo" +0xa068: "bbop" +0xa069: "bbex" +0xa06a: "bbe" +0xa06b: "bbep" +0xa06c: "bbut" +0xa06d: "bbux" +0xa06e: "bbu" +0xa06f: "bbup" +0xa070: "bburx" +0xa071: "bbur" +0xa072: "bbyt" +0xa073: "bbyx" +0xa074: "bby" +0xa075: "bbyp" +0xa076: "nbit" +0xa077: "nbix" +0xa078: "nbi" +0xa079: "nbip" +0xa07a: "nbiex" +0xa07b: "nbie" +0xa07c: "nbiep" +0xa07d: "nbat" +0xa07e: "nbax" +0xa07f: "nba" +0xa080: "nbap" +0xa081: "nbot" +0xa082: "nbox" +0xa083: "nbo" +0xa084: "nbop" +0xa085: "nbut" +0xa086: "nbux" +0xa087: "nbu" +0xa088: "nbup" +0xa089: "nburx" +0xa08a: "nbur" +0xa08b: "nbyt" +0xa08c: "nbyx" +0xa08d: "nby" +0xa08e: "nbyp" +0xa08f: "nbyrx" +0xa090: "nbyr" +0xa091: "hmit" +0xa092: "hmix" +0xa093: "hmi" +0xa094: "hmip" +0xa095: "hmiex" +0xa096: "hmie" +0xa097: "hmiep" +0xa098: "hmat" +0xa099: "hmax" +0xa09a: "hma" +0xa09b: "hmap" +0xa09c: "hmuox" +0xa09d: "hmuo" +0xa09e: "hmuop" +0xa09f: "hmot" +0xa0a0: "hmox" +0xa0a1: "hmo" +0xa0a2: "hmop" +0xa0a3: "hmut" +0xa0a4: "hmux" +0xa0a5: "hmu" +0xa0a6: "hmup" +0xa0a7: "hmurx" +0xa0a8: "hmur" +0xa0a9: "hmyx" +0xa0aa: "hmy" +0xa0ab: "hmyp" +0xa0ac: "hmyrx" +0xa0ad: "hmyr" +0xa0ae: "mit" +0xa0af: "mix" +0xa0b0: "mi" +0xa0b1: "mip" +0xa0b2: "miex" +0xa0b3: "mie" +0xa0b4: "miep" +0xa0b5: "mat" +0xa0b6: "max" +0xa0b7: "ma" +0xa0b8: "map" +0xa0b9: "muot" +0xa0ba: "muox" +0xa0bb: "muo" +0xa0bc: "muop" +0xa0bd: "mot" +0xa0be: "mox" +0xa0bf: "mo" +0xa0c0: "mop" +0xa0c1: "mex" +0xa0c2: "me" +0xa0c3: "mut" +0xa0c4: "mux" +0xa0c5: "mu" +0xa0c6: "mup" +0xa0c7: "murx" +0xa0c8: "mur" +0xa0c9: "myt" +0xa0ca: "myx" +0xa0cb: "my" +0xa0cc: "myp" +0xa0cd: "fit" +0xa0ce: "fix" +0xa0cf: "fi" +0xa0d0: "fip" +0xa0d1: "fat" +0xa0d2: "fax" +0xa0d3: "fa" +0xa0d4: "fap" +0xa0d5: "fox" +0xa0d6: "fo" +0xa0d7: "fop" +0xa0d8: "fut" +0xa0d9: "fux" +0xa0da: "fu" +0xa0db: "fup" +0xa0dc: "furx" +0xa0dd: "fur" +0xa0de: "fyt" +0xa0df: "fyx" +0xa0e0: "fy" +0xa0e1: "fyp" +0xa0e2: "vit" +0xa0e3: "vix" +0xa0e4: "vi" +0xa0e5: "vip" +0xa0e6: "viet" +0xa0e7: "viex" +0xa0e8: "vie" +0xa0e9: "viep" +0xa0ea: "vat" +0xa0eb: "vax" +0xa0ec: "va" +0xa0ed: "vap" +0xa0ee: "vot" +0xa0ef: "vox" +0xa0f0: "vo" +0xa0f1: "vop" +0xa0f2: "vex" +0xa0f3: "vep" +0xa0f4: "vut" +0xa0f5: "vux" +0xa0f6: "vu" +0xa0f7: "vup" +0xa0f8: "vurx" +0xa0f9: "vur" +0xa0fa: "vyt" +0xa0fb: "vyx" +0xa0fc: "vy" +0xa0fd: "vyp" +0xa0fe: "vyrx" +0xa0ff: "vyr" +/* x0a1 */ +0xa100: "dit" +0xa101: "dix" +0xa102: "di" +0xa103: "dip" +0xa104: "diex" +0xa105: "die" +0xa106: "diep" +0xa107: "dat" +0xa108: "dax" +0xa109: "da" +0xa10a: "dap" +0xa10b: "duox" +0xa10c: "duo" +0xa10d: "dot" +0xa10e: "dox" +0xa10f: "do" +0xa110: "dop" +0xa111: "dex" +0xa112: "de" +0xa113: "dep" +0xa114: "dut" +0xa115: "dux" +0xa116: "du" +0xa117: "dup" +0xa118: "durx" +0xa119: "dur" +0xa11a: "tit" +0xa11b: "tix" +0xa11c: "ti" +0xa11d: "tip" +0xa11e: "tiex" +0xa11f: "tie" +0xa120: "tiep" +0xa121: "tat" +0xa122: "tax" +0xa123: "ta" +0xa124: "tap" +0xa125: "tuot" +0xa126: "tuox" +0xa127: "tuo" +0xa128: "tuop" +0xa129: "tot" +0xa12a: "tox" +0xa12b: "to" +0xa12c: "top" +0xa12d: "tex" +0xa12e: "te" +0xa12f: "tep" +0xa130: "tut" +0xa131: "tux" +0xa132: "tu" +0xa133: "tup" +0xa134: "turx" +0xa135: "tur" +0xa136: "ddit" +0xa137: "ddix" +0xa138: "ddi" +0xa139: "ddip" +0xa13a: "ddiex" +0xa13b: "ddie" +0xa13c: "ddiep" +0xa13d: "ddat" +0xa13e: "ddax" +0xa13f: "dda" +0xa140: "ddap" +0xa141: "dduox" +0xa142: "dduo" +0xa143: "dduop" +0xa144: "ddot" +0xa145: "ddox" +0xa146: "ddo" +0xa147: "ddop" +0xa148: "ddex" +0xa149: "dde" +0xa14a: "ddep" +0xa14b: "ddut" +0xa14c: "ddux" +0xa14d: "ddu" +0xa14e: "ddup" +0xa14f: "ddurx" +0xa150: "ddur" +0xa151: "ndit" +0xa152: "ndix" +0xa153: "ndi" +0xa154: "ndip" +0xa155: "ndiex" +0xa156: "ndie" +0xa157: "ndat" +0xa158: "ndax" +0xa159: "nda" +0xa15a: "ndap" +0xa15b: "ndot" +0xa15c: "ndox" +0xa15d: "ndo" +0xa15e: "ndop" +0xa15f: "ndex" +0xa160: "nde" +0xa161: "ndep" +0xa162: "ndut" +0xa163: "ndux" +0xa164: "ndu" +0xa165: "ndup" +0xa166: "ndurx" +0xa167: "ndur" +0xa168: "hnit" +0xa169: "hnix" +0xa16a: "hni" +0xa16b: "hnip" +0xa16c: "hniet" +0xa16d: "hniex" +0xa16e: "hnie" +0xa16f: "hniep" +0xa170: "hnat" +0xa171: "hnax" +0xa172: "hna" +0xa173: "hnap" +0xa174: "hnuox" +0xa175: "hnuo" +0xa176: "hnot" +0xa177: "hnox" +0xa178: "hnop" +0xa179: "hnex" +0xa17a: "hne" +0xa17b: "hnep" +0xa17c: "hnut" +0xa17d: "nit" +0xa17e: "nix" +0xa17f: "ni" +0xa180: "nip" +0xa181: "niex" +0xa182: "nie" +0xa183: "niep" +0xa184: "nax" +0xa185: "na" +0xa186: "nap" +0xa187: "nuox" +0xa188: "nuo" +0xa189: "nuop" +0xa18a: "not" +0xa18b: "nox" +0xa18c: "no" +0xa18d: "nop" +0xa18e: "nex" +0xa18f: "ne" +0xa190: "nep" +0xa191: "nut" +0xa192: "nux" +0xa193: "nu" +0xa194: "nup" +0xa195: "nurx" +0xa196: "nur" +0xa197: "hlit" +0xa198: "hlix" +0xa199: "hli" +0xa19a: "hlip" +0xa19b: "hliex" +0xa19c: "hlie" +0xa19d: "hliep" +0xa19e: "hlat" +0xa19f: "hlax" +0xa1a0: "hla" +0xa1a1: "hlap" +0xa1a2: "hluox" +0xa1a3: "hluo" +0xa1a4: "hluop" +0xa1a5: "hlox" +0xa1a6: "hlo" +0xa1a7: "hlop" +0xa1a8: "hlex" +0xa1a9: "hle" +0xa1aa: "hlep" +0xa1ab: "hlut" +0xa1ac: "hlux" +0xa1ad: "hlu" +0xa1ae: "hlup" +0xa1af: "hlurx" +0xa1b0: "hlur" +0xa1b1: "hlyt" +0xa1b2: "hlyx" +0xa1b3: "hly" +0xa1b4: "hlyp" +0xa1b5: "hlyrx" +0xa1b6: "hlyr" +0xa1b7: "lit" +0xa1b8: "lix" +0xa1b9: "li" +0xa1ba: "lip" +0xa1bb: "liet" +0xa1bc: "liex" +0xa1bd: "lie" +0xa1be: "liep" +0xa1bf: "lat" +0xa1c0: "lax" +0xa1c1: "la" +0xa1c2: "lap" +0xa1c3: "luot" +0xa1c4: "luox" +0xa1c5: "luo" +0xa1c6: "luop" +0xa1c7: "lot" +0xa1c8: "lox" +0xa1c9: "lo" +0xa1ca: "lop" +0xa1cb: "lex" +0xa1cc: "le" +0xa1cd: "lep" +0xa1ce: "lut" +0xa1cf: "lux" +0xa1d0: "lu" +0xa1d1: "lup" +0xa1d2: "lurx" +0xa1d3: "lur" +0xa1d4: "lyt" +0xa1d5: "lyx" +0xa1d6: "ly" +0xa1d7: "lyp" +0xa1d8: "lyrx" +0xa1d9: "lyr" +0xa1da: "git" +0xa1db: "gix" +0xa1dc: "gi" +0xa1dd: "gip" +0xa1de: "giet" +0xa1df: "giex" +0xa1e0: "gie" +0xa1e1: "giep" +0xa1e2: "gat" +0xa1e3: "gax" +0xa1e4: "ga" +0xa1e5: "gap" +0xa1e6: "guot" +0xa1e7: "guox" +0xa1e8: "guo" +0xa1e9: "guop" +0xa1ea: "got" +0xa1eb: "gox" +0xa1ec: "go" +0xa1ed: "gop" +0xa1ee: "get" +0xa1ef: "gex" +0xa1f0: "ge" +0xa1f1: "gep" +0xa1f2: "gut" +0xa1f3: "gux" +0xa1f4: "gu" +0xa1f5: "gup" +0xa1f6: "gurx" +0xa1f7: "gur" +0xa1f8: "kit" +0xa1f9: "kix" +0xa1fa: "ki" +0xa1fb: "kip" +0xa1fc: "kiex" +0xa1fd: "kie" +0xa1fe: "kiep" +0xa1ff: "kat" +/* x0a2 */ +0xa200: "kax" +0xa201: "ka" +0xa202: "kap" +0xa203: "kuox" +0xa204: "kuo" +0xa205: "kuop" +0xa206: "kot" +0xa207: "kox" +0xa208: "ko" +0xa209: "kop" +0xa20a: "ket" +0xa20b: "kex" +0xa20c: "ke" +0xa20d: "kep" +0xa20e: "kut" +0xa20f: "kux" +0xa210: "ku" +0xa211: "kup" +0xa212: "kurx" +0xa213: "kur" +0xa214: "ggit" +0xa215: "ggix" +0xa216: "ggi" +0xa217: "ggiex" +0xa218: "ggie" +0xa219: "ggiep" +0xa21a: "ggat" +0xa21b: "ggax" +0xa21c: "gga" +0xa21d: "ggap" +0xa21e: "gguot" +0xa21f: "gguox" +0xa220: "gguo" +0xa221: "gguop" +0xa222: "ggot" +0xa223: "ggox" +0xa224: "ggo" +0xa225: "ggop" +0xa226: "gget" +0xa227: "ggex" +0xa228: "gge" +0xa229: "ggep" +0xa22a: "ggut" +0xa22b: "ggux" +0xa22c: "ggu" +0xa22d: "ggup" +0xa22e: "ggurx" +0xa22f: "ggur" +0xa230: "mgiex" +0xa231: "mgie" +0xa232: "mgat" +0xa233: "mgax" +0xa234: "mga" +0xa235: "mgap" +0xa236: "mguox" +0xa237: "mguo" +0xa238: "mguop" +0xa239: "mgot" +0xa23a: "mgox" +0xa23b: "mgo" +0xa23c: "mgop" +0xa23d: "mgex" +0xa23e: "mge" +0xa23f: "mgep" +0xa240: "mgut" +0xa241: "mgux" +0xa242: "mgu" +0xa243: "mgup" +0xa244: "mgurx" +0xa245: "mgur" +0xa246: "hxit" +0xa247: "hxix" +0xa248: "hxi" +0xa249: "hxip" +0xa24a: "hxiet" +0xa24b: "hxiex" +0xa24c: "hxie" +0xa24d: "hxiep" +0xa24e: "hxat" +0xa24f: "hxax" +0xa250: "hxa" +0xa251: "hxap" +0xa252: "hxuot" +0xa253: "hxuox" +0xa254: "hxuo" +0xa255: "hxuop" +0xa256: "hxot" +0xa257: "hxox" +0xa258: "hxo" +0xa259: "hxop" +0xa25a: "hxex" +0xa25b: "hxe" +0xa25c: "hxep" +0xa25d: "ngiex" +0xa25e: "ngie" +0xa25f: "ngiep" +0xa260: "ngat" +0xa261: "ngax" +0xa262: "nga" +0xa263: "ngap" +0xa264: "nguot" +0xa265: "nguox" +0xa266: "nguo" +0xa267: "ngot" +0xa268: "ngox" +0xa269: "ngo" +0xa26a: "ngop" +0xa26b: "ngex" +0xa26c: "nge" +0xa26d: "ngep" +0xa26e: "hit" +0xa26f: "hiex" +0xa270: "hie" +0xa271: "hat" +0xa272: "hax" +0xa273: "ha" +0xa274: "hap" +0xa275: "huot" +0xa276: "huox" +0xa277: "huo" +0xa278: "huop" +0xa279: "hot" +0xa27a: "hox" +0xa27b: "ho" +0xa27c: "hop" +0xa27d: "hex" +0xa27e: "he" +0xa27f: "hep" +0xa280: "wat" +0xa281: "wax" +0xa282: "wa" +0xa283: "wap" +0xa284: "wuox" +0xa285: "wuo" +0xa286: "wuop" +0xa287: "wox" +0xa288: "wo" +0xa289: "wop" +0xa28a: "wex" +0xa28b: "we" +0xa28c: "wep" +0xa28d: "zit" +0xa28e: "zix" +0xa28f: "zi" +0xa290: "zip" +0xa291: "ziex" +0xa292: "zie" +0xa293: "ziep" +0xa294: "zat" +0xa295: "zax" +0xa296: "za" +0xa297: "zap" +0xa298: "zuox" +0xa299: "zuo" +0xa29a: "zuop" +0xa29b: "zot" +0xa29c: "zox" +0xa29d: "zo" +0xa29e: "zop" +0xa29f: "zex" +0xa2a0: "ze" +0xa2a1: "zep" +0xa2a2: "zut" +0xa2a3: "zux" +0xa2a4: "zu" +0xa2a5: "zup" +0xa2a6: "zurx" +0xa2a7: "zur" +0xa2a8: "zyt" +0xa2a9: "zyx" +0xa2aa: "zy" +0xa2ab: "zyp" +0xa2ac: "zyrx" +0xa2ad: "zyr" +0xa2ae: "cit" +0xa2af: "cix" +0xa2b0: "ci" +0xa2b1: "cip" +0xa2b2: "ciet" +0xa2b3: "ciex" +0xa2b4: "cie" +0xa2b5: "ciep" +0xa2b6: "cat" +0xa2b7: "cax" +0xa2b8: "ca" +0xa2b9: "cap" +0xa2ba: "cuox" +0xa2bb: "cuo" +0xa2bc: "cuop" +0xa2bd: "cot" +0xa2be: "cox" +0xa2bf: "co" +0xa2c0: "cop" +0xa2c1: "cex" +0xa2c2: "ce" +0xa2c3: "cep" +0xa2c4: "cut" +0xa2c5: "cux" +0xa2c6: "cu" +0xa2c7: "cup" +0xa2c8: "curx" +0xa2c9: "cur" +0xa2ca: "cyt" +0xa2cb: "cyx" +0xa2cc: "cy" +0xa2cd: "cyp" +0xa2ce: "cyrx" +0xa2cf: "cyr" +0xa2d0: "zzit" +0xa2d1: "zzix" +0xa2d2: "zzi" +0xa2d3: "zzip" +0xa2d4: "zziet" +0xa2d5: "zziex" +0xa2d6: "zzie" +0xa2d7: "zziep" +0xa2d8: "zzat" +0xa2d9: "zzax" +0xa2da: "zza" +0xa2db: "zzap" +0xa2dc: "zzox" +0xa2dd: "zzo" +0xa2de: "zzop" +0xa2df: "zzex" +0xa2e0: "zze" +0xa2e1: "zzep" +0xa2e2: "zzux" +0xa2e3: "zzu" +0xa2e4: "zzup" +0xa2e5: "zzurx" +0xa2e6: "zzur" +0xa2e7: "zzyt" +0xa2e8: "zzyx" +0xa2e9: "zzy" +0xa2ea: "zzyp" +0xa2eb: "zzyrx" +0xa2ec: "zzyr" +0xa2ed: "nzit" +0xa2ee: "nzix" +0xa2ef: "nzi" +0xa2f0: "nzip" +0xa2f1: "nziex" +0xa2f2: "nzie" +0xa2f3: "nziep" +0xa2f4: "nzat" +0xa2f5: "nzax" +0xa2f6: "nza" +0xa2f7: "nzap" +0xa2f8: "nzuox" +0xa2f9: "nzuo" +0xa2fa: "nzox" +0xa2fb: "nzop" +0xa2fc: "nzex" +0xa2fd: "nze" +0xa2fe: "nzux" +0xa2ff: "nzu" +/* x0a3 */ +0xa300: "nzup" +0xa301: "nzurx" +0xa302: "nzur" +0xa303: "nzyt" +0xa304: "nzyx" +0xa305: "nzy" +0xa306: "nzyp" +0xa307: "nzyrx" +0xa308: "nzyr" +0xa309: "sit" +0xa30a: "six" +0xa30b: "si" +0xa30c: "sip" +0xa30d: "siex" +0xa30e: "sie" +0xa30f: "siep" +0xa310: "sat" +0xa311: "sax" +0xa312: "sa" +0xa313: "sap" +0xa314: "suox" +0xa315: "suo" +0xa316: "suop" +0xa317: "sot" +0xa318: "sox" +0xa319: "so" +0xa31a: "sop" +0xa31b: "sex" +0xa31c: "se" +0xa31d: "sep" +0xa31e: "sut" +0xa31f: "sux" +0xa320: "su" +0xa321: "sup" +0xa322: "surx" +0xa323: "sur" +0xa324: "syt" +0xa325: "syx" +0xa326: "sy" +0xa327: "syp" +0xa328: "syrx" +0xa329: "syr" +0xa32a: "ssit" +0xa32b: "ssix" +0xa32c: "ssi" +0xa32d: "ssip" +0xa32e: "ssiex" +0xa32f: "ssie" +0xa330: "ssiep" +0xa331: "ssat" +0xa332: "ssax" +0xa333: "ssa" +0xa334: "ssap" +0xa335: "ssot" +0xa336: "ssox" +0xa337: "sso" +0xa338: "ssop" +0xa339: "ssex" +0xa33a: "sse" +0xa33b: "ssep" +0xa33c: "ssut" +0xa33d: "ssux" +0xa33e: "ssu" +0xa33f: "ssup" +0xa340: "ssyt" +0xa341: "ssyx" +0xa342: "ssy" +0xa343: "ssyp" +0xa344: "ssyrx" +0xa345: "ssyr" +0xa346: "zhat" +0xa347: "zhax" +0xa348: "zha" +0xa349: "zhap" +0xa34a: "zhuox" +0xa34b: "zhuo" +0xa34c: "zhuop" +0xa34d: "zhot" +0xa34e: "zhox" +0xa34f: "zho" +0xa350: "zhop" +0xa351: "zhet" +0xa352: "zhex" +0xa353: "zhe" +0xa354: "zhep" +0xa355: "zhut" +0xa356: "zhux" +0xa357: "zhu" +0xa358: "zhup" +0xa359: "zhurx" +0xa35a: "zhur" +0xa35b: "zhyt" +0xa35c: "zhyx" +0xa35d: "zhy" +0xa35e: "zhyp" +0xa35f: "zhyrx" +0xa360: "zhyr" +0xa361: "chat" +0xa362: "chax" +0xa363: "cha" +0xa364: "chap" +0xa365: "chuot" +0xa366: "chuox" +0xa367: "chuo" +0xa368: "chuop" +0xa369: "chot" +0xa36a: "chox" +0xa36b: "cho" +0xa36c: "chop" +0xa36d: "chet" +0xa36e: "chex" +0xa36f: "che" +0xa370: "chep" +0xa371: "chux" +0xa372: "chu" +0xa373: "chup" +0xa374: "churx" +0xa375: "chur" +0xa376: "chyt" +0xa377: "chyx" +0xa378: "chy" +0xa379: "chyp" +0xa37a: "chyrx" +0xa37b: "chyr" +0xa37c: "rrax" +0xa37d: "rra" +0xa37e: "rruox" +0xa37f: "rruo" +0xa380: "rrot" +0xa381: "rrox" +0xa382: "rro" +0xa383: "rrop" +0xa384: "rret" +0xa385: "rrex" +0xa386: "rre" +0xa387: "rrep" +0xa388: "rrut" +0xa389: "rrux" +0xa38a: "rru" +0xa38b: "rrup" +0xa38c: "rrurx" +0xa38d: "rrur" +0xa38e: "rryt" +0xa38f: "rryx" +0xa390: "rry" +0xa391: "rryp" +0xa392: "rryrx" +0xa393: "rryr" +0xa394: "nrat" +0xa395: "nrax" +0xa396: "nra" +0xa397: "nrap" +0xa398: "nrox" +0xa399: "nro" +0xa39a: "nrop" +0xa39b: "nret" +0xa39c: "nrex" +0xa39d: "nre" +0xa39e: "nrep" +0xa39f: "nrut" +0xa3a0: "nrux" +0xa3a1: "nru" +0xa3a2: "nrup" +0xa3a3: "nrurx" +0xa3a4: "nrur" +0xa3a5: "nryt" +0xa3a6: "nryx" +0xa3a7: "nry" +0xa3a8: "nryp" +0xa3a9: "nryrx" +0xa3aa: "nryr" +0xa3ab: "shat" +0xa3ac: "shax" +0xa3ad: "sha" +0xa3ae: "shap" +0xa3af: "shuox" +0xa3b0: "shuo" +0xa3b1: "shuop" +0xa3b2: "shot" +0xa3b3: "shox" +0xa3b4: "sho" +0xa3b5: "shop" +0xa3b6: "shet" +0xa3b7: "shex" +0xa3b8: "she" +0xa3b9: "shep" +0xa3ba: "shut" +0xa3bb: "shux" +0xa3bc: "shu" +0xa3bd: "shup" +0xa3be: "shurx" +0xa3bf: "shur" +0xa3c0: "shyt" +0xa3c1: "shyx" +0xa3c2: "shy" +0xa3c3: "shyp" +0xa3c4: "shyrx" +0xa3c5: "shyr" +0xa3c6: "rat" +0xa3c7: "rax" +0xa3c8: "ra" +0xa3c9: "rap" +0xa3ca: "ruox" +0xa3cb: "ruo" +0xa3cc: "ruop" +0xa3cd: "rot" +0xa3ce: "rox" +0xa3cf: "ro" +0xa3d0: "rop" +0xa3d1: "rex" +0xa3d2: "re" +0xa3d3: "rep" +0xa3d4: "rut" +0xa3d5: "rux" +0xa3d6: "ru" +0xa3d7: "rup" +0xa3d8: "rurx" +0xa3d9: "rur" +0xa3da: "ryt" +0xa3db: "ryx" +0xa3dc: "ry" +0xa3dd: "ryp" +0xa3de: "ryrx" +0xa3df: "ryr" +0xa3e0: "jit" +0xa3e1: "jix" +0xa3e2: "ji" +0xa3e3: "jip" +0xa3e4: "jiet" +0xa3e5: "jiex" +0xa3e6: "jie" +0xa3e7: "jiep" +0xa3e8: "juot" +0xa3e9: "juox" +0xa3ea: "juo" +0xa3eb: "juop" +0xa3ec: "jot" +0xa3ed: "jox" +0xa3ee: "jo" +0xa3ef: "jop" +0xa3f0: "jut" +0xa3f1: "jux" +0xa3f2: "ju" +0xa3f3: "jup" +0xa3f4: "jurx" +0xa3f5: "jur" +0xa3f6: "jyt" +0xa3f7: "jyx" +0xa3f8: "jy" +0xa3f9: "jyp" +0xa3fa: "jyrx" +0xa3fb: "jyr" +0xa3fc: "qit" +0xa3fd: "qix" +0xa3fe: "qi" +0xa3ff: "qip" +/* x0a4 */ +0xa400: "qiet" +0xa401: "qiex" +0xa402: "qie" +0xa403: "qiep" +0xa404: "quot" +0xa405: "quox" +0xa406: "quo" +0xa407: "quop" +0xa408: "qot" +0xa409: "qox" +0xa40a: "qo" +0xa40b: "qop" +0xa40c: "qut" +0xa40d: "qux" +0xa40e: "qu" +0xa40f: "qup" +0xa410: "qurx" +0xa411: "qur" +0xa412: "qyt" +0xa413: "qyx" +0xa414: "qy" +0xa415: "qyp" +0xa416: "qyrx" +0xa417: "qyr" +0xa418: "jjit" +0xa419: "jjix" +0xa41a: "jji" +0xa41b: "jjip" +0xa41c: "jjiet" +0xa41d: "jjiex" +0xa41e: "jjie" +0xa41f: "jjiep" +0xa420: "jjuox" +0xa421: "jjuo" +0xa422: "jjuop" +0xa423: "jjot" +0xa424: "jjox" +0xa425: "jjo" +0xa426: "jjop" +0xa427: "jjut" +0xa428: "jjux" +0xa429: "jju" +0xa42a: "jjup" +0xa42b: "jjurx" +0xa42c: "jjur" +0xa42d: "jjyt" +0xa42e: "jjyx" +0xa42f: "jjy" +0xa430: "jjyp" +0xa431: "njit" +0xa432: "njix" +0xa433: "nji" +0xa434: "njip" +0xa435: "njiet" +0xa436: "njiex" +0xa437: "njie" +0xa438: "njiep" +0xa439: "njuox" +0xa43a: "njuo" +0xa43b: "njot" +0xa43c: "njox" +0xa43d: "njo" +0xa43e: "njop" +0xa43f: "njux" +0xa440: "nju" +0xa441: "njup" +0xa442: "njurx" +0xa443: "njur" +0xa444: "njyt" +0xa445: "njyx" +0xa446: "njy" +0xa447: "njyp" +0xa448: "njyrx" +0xa449: "njyr" +0xa44a: "nyit" +0xa44b: "nyix" +0xa44c: "nyi" +0xa44d: "nyip" +0xa44e: "nyiet" +0xa44f: "nyiex" +0xa450: "nyie" +0xa451: "nyiep" +0xa452: "nyuox" +0xa453: "nyuo" +0xa454: "nyuop" +0xa455: "nyot" +0xa456: "nyox" +0xa457: "nyo" +0xa458: "nyop" +0xa459: "nyut" +0xa45a: "nyux" +0xa45b: "nyu" +0xa45c: "nyup" +0xa45d: "xit" +0xa45e: "xix" +0xa45f: "xi" +0xa460: "xip" +0xa461: "xiet" +0xa462: "xiex" +0xa463: "xie" +0xa464: "xiep" +0xa465: "xuox" +0xa466: "xuo" +0xa467: "xot" +0xa468: "xox" +0xa469: "xo" +0xa46a: "xop" +0xa46b: "xyt" +0xa46c: "xyx" +0xa46d: "xy" +0xa46e: "xyp" +0xa46f: "xyrx" +0xa470: "xyr" +0xa471: "yit" +0xa472: "yix" +0xa473: "yi" +0xa474: "yip" +0xa475: "yiet" +0xa476: "yiex" +0xa477: "yie" +0xa478: "yiep" +0xa479: "yuot" +0xa47a: "yuox" +0xa47b: "yuo" +0xa47c: "yuop" +0xa47d: "yot" +0xa47e: "yox" +0xa47f: "yo" +0xa480: "yop" +0xa481: "yut" +0xa482: "yux" +0xa483: "yu" +0xa484: "yup" +0xa485: "yurx" +0xa486: "yur" +0xa487: "yyt" +0xa488: "yyx" +0xa489: "yy" +0xa48a: "yyp" +0xa48b: "yyrx" +0xa48c: "yyr" +0xa48d: "[?]" +0xa48e: "[?]" +0xa48f: "[?]" +0xa490: "Qot" +0xa491: "Li" +0xa492: "Kit" +0xa493: "Nyip" +0xa494: "Cyp" +0xa495: "Ssi" +0xa496: "Ggop" +0xa497: "Gep" +0xa498: "Mi" +0xa499: "Hxit" +0xa49a: "Lyr" +0xa49b: "Bbut" +0xa49c: "Mop" +0xa49d: "Yo" +0xa49e: "Put" +0xa49f: "Hxuo" +0xa4a0: "Tat" +0xa4a1: "Ga" +0xa4a2: "[?]" +0xa4a3: "[?]" +0xa4a4: "Ddur" +0xa4a5: "Bur" +0xa4a6: "Gguo" +0xa4a7: "Nyop" +0xa4a8: "Tu" +0xa4a9: "Op" +0xa4aa: "Jjut" +0xa4ab: "Zot" +0xa4ac: "Pyt" +0xa4ad: "Hmo" +0xa4ae: "Yit" +0xa4af: "Vur" +0xa4b0: "Shy" +0xa4b1: "Vep" +0xa4b2: "Za" +0xa4b3: "Jo" +0xa4b4: "[?]" +0xa4b5: "Jjy" +0xa4b6: "Got" +0xa4b7: "Jjie" +0xa4b8: "Wo" +0xa4b9: "Du" +0xa4ba: "Shur" +0xa4bb: "Lie" +0xa4bc: "Cy" +0xa4bd: "Cuop" +0xa4be: "Cip" +0xa4bf: "Hxop" +0xa4c0: "Shat" +0xa4c1: "[?]" +0xa4c2: "Shop" +0xa4c3: "Che" +0xa4c4: "Zziet" +0xa4c5: "[?]" +0xa4c6: "Ke" +0xa4c7: "[?]" +0xa4c8: "[?]" +0xa4c9: "[?]" +0xa4ca: "[?]" +0xa4cb: "[?]" +0xa4cc: "[?]" +0xa4cd: "[?]" +0xa4ce: "[?]" +0xa4cf: "[?]" +0xa4d0: "[?]" +0xa4d1: "[?]" +0xa4d2: "[?]" +0xa4d3: "[?]" +0xa4d4: "[?]" +0xa4d5: "[?]" +0xa4d6: "[?]" +0xa4d7: "[?]" +0xa4d8: "[?]" +0xa4d9: "[?]" +0xa4da: "[?]" +0xa4db: "[?]" +0xa4dc: "[?]" +0xa4dd: "[?]" +0xa4de: "[?]" +0xa4df: "[?]" +0xa4e0: "[?]" +0xa4e1: "[?]" +0xa4e2: "[?]" +0xa4e3: "[?]" +0xa4e4: "[?]" +0xa4e5: "[?]" +0xa4e6: "[?]" +0xa4e7: "[?]" +0xa4e8: "[?]" +0xa4e9: "[?]" +0xa4ea: "[?]" +0xa4eb: "[?]" +0xa4ec: "[?]" +0xa4ed: "[?]" +0xa4ee: "[?]" +0xa4ef: "[?]" +0xa4f0: "[?]" +0xa4f1: "[?]" +0xa4f2: "[?]" +0xa4f3: "[?]" +0xa4f4: "[?]" +0xa4f5: "[?]" +0xa4f6: "[?]" +0xa4f7: "[?]" +0xa4f8: "[?]" +0xa4f9: "[?]" +0xa4fa: "[?]" +0xa4fb: "[?]" +0xa4fc: "[?]" +0xa4fd: "[?]" +0xa4fe: "[?]" +/* x0ac */ +0xac00: "ga" +0xac01: "gag" +0xac02: "gagg" +0xac03: "gags" +0xac04: "gan" +0xac05: "ganj" +0xac06: "ganh" +0xac07: "gad" +0xac08: "gal" +0xac09: "galg" +0xac0a: "galm" +0xac0b: "galb" +0xac0c: "gals" +0xac0d: "galt" +0xac0e: "galp" +0xac0f: "galh" +0xac10: "gam" +0xac11: "gab" +0xac12: "gabs" +0xac13: "gas" +0xac14: "gass" +0xac15: "gang" +0xac16: "gaj" +0xac17: "gac" +0xac18: "gak" +0xac19: "gat" +0xac1a: "gap" +0xac1b: "gah" +0xac1c: "gae" +0xac1d: "gaeg" +0xac1e: "gaegg" +0xac1f: "gaegs" +0xac20: "gaen" +0xac21: "gaenj" +0xac22: "gaenh" +0xac23: "gaed" +0xac24: "gael" +0xac25: "gaelg" +0xac26: "gaelm" +0xac27: "gaelb" +0xac28: "gaels" +0xac29: "gaelt" +0xac2a: "gaelp" +0xac2b: "gaelh" +0xac2c: "gaem" +0xac2d: "gaeb" +0xac2e: "gaebs" +0xac2f: "gaes" +0xac30: "gaess" +0xac31: "gaeng" +0xac32: "gaej" +0xac33: "gaec" +0xac34: "gaek" +0xac35: "gaet" +0xac36: "gaep" +0xac37: "gaeh" +0xac38: "gya" +0xac39: "gyag" +0xac3a: "gyagg" +0xac3b: "gyags" +0xac3c: "gyan" +0xac3d: "gyanj" +0xac3e: "gyanh" +0xac3f: "gyad" +0xac40: "gyal" +0xac41: "gyalg" +0xac42: "gyalm" +0xac43: "gyalb" +0xac44: "gyals" +0xac45: "gyalt" +0xac46: "gyalp" +0xac47: "gyalh" +0xac48: "gyam" +0xac49: "gyab" +0xac4a: "gyabs" +0xac4b: "gyas" +0xac4c: "gyass" +0xac4d: "gyang" +0xac4e: "gyaj" +0xac4f: "gyac" +0xac50: "gyak" +0xac51: "gyat" +0xac52: "gyap" +0xac53: "gyah" +0xac54: "gyae" +0xac55: "gyaeg" +0xac56: "gyaegg" +0xac57: "gyaegs" +0xac58: "gyaen" +0xac59: "gyaenj" +0xac5a: "gyaenh" +0xac5b: "gyaed" +0xac5c: "gyael" +0xac5d: "gyaelg" +0xac5e: "gyaelm" +0xac5f: "gyaelb" +0xac60: "gyaels" +0xac61: "gyaelt" +0xac62: "gyaelp" +0xac63: "gyaelh" +0xac64: "gyaem" +0xac65: "gyaeb" +0xac66: "gyaebs" +0xac67: "gyaes" +0xac68: "gyaess" +0xac69: "gyaeng" +0xac6a: "gyaej" +0xac6b: "gyaec" +0xac6c: "gyaek" +0xac6d: "gyaet" +0xac6e: "gyaep" +0xac6f: "gyaeh" +0xac70: "geo" +0xac71: "geog" +0xac72: "geogg" +0xac73: "geogs" +0xac74: "geon" +0xac75: "geonj" +0xac76: "geonh" +0xac77: "geod" +0xac78: "geol" +0xac79: "geolg" +0xac7a: "geolm" +0xac7b: "geolb" +0xac7c: "geols" +0xac7d: "geolt" +0xac7e: "geolp" +0xac7f: "geolh" +0xac80: "geom" +0xac81: "geob" +0xac82: "geobs" +0xac83: "geos" +0xac84: "geoss" +0xac85: "geong" +0xac86: "geoj" +0xac87: "geoc" +0xac88: "geok" +0xac89: "geot" +0xac8a: "geop" +0xac8b: "geoh" +0xac8c: "ge" +0xac8d: "geg" +0xac8e: "gegg" +0xac8f: "gegs" +0xac90: "gen" +0xac91: "genj" +0xac92: "genh" +0xac93: "ged" +0xac94: "gel" +0xac95: "gelg" +0xac96: "gelm" +0xac97: "gelb" +0xac98: "gels" +0xac99: "gelt" +0xac9a: "gelp" +0xac9b: "gelh" +0xac9c: "gem" +0xac9d: "geb" +0xac9e: "gebs" +0xac9f: "ges" +0xaca0: "gess" +0xaca1: "geng" +0xaca2: "gej" +0xaca3: "gec" +0xaca4: "gek" +0xaca5: "get" +0xaca6: "gep" +0xaca7: "geh" +0xaca8: "gyeo" +0xaca9: "gyeog" +0xacaa: "gyeogg" +0xacab: "gyeogs" +0xacac: "gyeon" +0xacad: "gyeonj" +0xacae: "gyeonh" +0xacaf: "gyeod" +0xacb0: "gyeol" +0xacb1: "gyeolg" +0xacb2: "gyeolm" +0xacb3: "gyeolb" +0xacb4: "gyeols" +0xacb5: "gyeolt" +0xacb6: "gyeolp" +0xacb7: "gyeolh" +0xacb8: "gyeom" +0xacb9: "gyeob" +0xacba: "gyeobs" +0xacbb: "gyeos" +0xacbc: "gyeoss" +0xacbd: "gyeong" +0xacbe: "gyeoj" +0xacbf: "gyeoc" +0xacc0: "gyeok" +0xacc1: "gyeot" +0xacc2: "gyeop" +0xacc3: "gyeoh" +0xacc4: "gye" +0xacc5: "gyeg" +0xacc6: "gyegg" +0xacc7: "gyegs" +0xacc8: "gyen" +0xacc9: "gyenj" +0xacca: "gyenh" +0xaccb: "gyed" +0xaccc: "gyel" +0xaccd: "gyelg" +0xacce: "gyelm" +0xaccf: "gyelb" +0xacd0: "gyels" +0xacd1: "gyelt" +0xacd2: "gyelp" +0xacd3: "gyelh" +0xacd4: "gyem" +0xacd5: "gyeb" +0xacd6: "gyebs" +0xacd7: "gyes" +0xacd8: "gyess" +0xacd9: "gyeng" +0xacda: "gyej" +0xacdb: "gyec" +0xacdc: "gyek" +0xacdd: "gyet" +0xacde: "gyep" +0xacdf: "gyeh" +0xace0: "go" +0xace1: "gog" +0xace2: "gogg" +0xace3: "gogs" +0xace4: "gon" +0xace5: "gonj" +0xace6: "gonh" +0xace7: "god" +0xace8: "gol" +0xace9: "golg" +0xacea: "golm" +0xaceb: "golb" +0xacec: "gols" +0xaced: "golt" +0xacee: "golp" +0xacef: "golh" +0xacf0: "gom" +0xacf1: "gob" +0xacf2: "gobs" +0xacf3: "gos" +0xacf4: "goss" +0xacf5: "gong" +0xacf6: "goj" +0xacf7: "goc" +0xacf8: "gok" +0xacf9: "got" +0xacfa: "gop" +0xacfb: "goh" +0xacfc: "gwa" +0xacfd: "gwag" +0xacfe: "gwagg" +0xacff: "gwags" +/* x0ad */ +0xad00: "gwan" +0xad01: "gwanj" +0xad02: "gwanh" +0xad03: "gwad" +0xad04: "gwal" +0xad05: "gwalg" +0xad06: "gwalm" +0xad07: "gwalb" +0xad08: "gwals" +0xad09: "gwalt" +0xad0a: "gwalp" +0xad0b: "gwalh" +0xad0c: "gwam" +0xad0d: "gwab" +0xad0e: "gwabs" +0xad0f: "gwas" +0xad10: "gwass" +0xad11: "gwang" +0xad12: "gwaj" +0xad13: "gwac" +0xad14: "gwak" +0xad15: "gwat" +0xad16: "gwap" +0xad17: "gwah" +0xad18: "gwae" +0xad19: "gwaeg" +0xad1a: "gwaegg" +0xad1b: "gwaegs" +0xad1c: "gwaen" +0xad1d: "gwaenj" +0xad1e: "gwaenh" +0xad1f: "gwaed" +0xad20: "gwael" +0xad21: "gwaelg" +0xad22: "gwaelm" +0xad23: "gwaelb" +0xad24: "gwaels" +0xad25: "gwaelt" +0xad26: "gwaelp" +0xad27: "gwaelh" +0xad28: "gwaem" +0xad29: "gwaeb" +0xad2a: "gwaebs" +0xad2b: "gwaes" +0xad2c: "gwaess" +0xad2d: "gwaeng" +0xad2e: "gwaej" +0xad2f: "gwaec" +0xad30: "gwaek" +0xad31: "gwaet" +0xad32: "gwaep" +0xad33: "gwaeh" +0xad34: "goe" +0xad35: "goeg" +0xad36: "goegg" +0xad37: "goegs" +0xad38: "goen" +0xad39: "goenj" +0xad3a: "goenh" +0xad3b: "goed" +0xad3c: "goel" +0xad3d: "goelg" +0xad3e: "goelm" +0xad3f: "goelb" +0xad40: "goels" +0xad41: "goelt" +0xad42: "goelp" +0xad43: "goelh" +0xad44: "goem" +0xad45: "goeb" +0xad46: "goebs" +0xad47: "goes" +0xad48: "goess" +0xad49: "goeng" +0xad4a: "goej" +0xad4b: "goec" +0xad4c: "goek" +0xad4d: "goet" +0xad4e: "goep" +0xad4f: "goeh" +0xad50: "gyo" +0xad51: "gyog" +0xad52: "gyogg" +0xad53: "gyogs" +0xad54: "gyon" +0xad55: "gyonj" +0xad56: "gyonh" +0xad57: "gyod" +0xad58: "gyol" +0xad59: "gyolg" +0xad5a: "gyolm" +0xad5b: "gyolb" +0xad5c: "gyols" +0xad5d: "gyolt" +0xad5e: "gyolp" +0xad5f: "gyolh" +0xad60: "gyom" +0xad61: "gyob" +0xad62: "gyobs" +0xad63: "gyos" +0xad64: "gyoss" +0xad65: "gyong" +0xad66: "gyoj" +0xad67: "gyoc" +0xad68: "gyok" +0xad69: "gyot" +0xad6a: "gyop" +0xad6b: "gyoh" +0xad6c: "gu" +0xad6d: "gug" +0xad6e: "gugg" +0xad6f: "gugs" +0xad70: "gun" +0xad71: "gunj" +0xad72: "gunh" +0xad73: "gud" +0xad74: "gul" +0xad75: "gulg" +0xad76: "gulm" +0xad77: "gulb" +0xad78: "guls" +0xad79: "gult" +0xad7a: "gulp" +0xad7b: "gulh" +0xad7c: "gum" +0xad7d: "gub" +0xad7e: "gubs" +0xad7f: "gus" +0xad80: "guss" +0xad81: "gung" +0xad82: "guj" +0xad83: "guc" +0xad84: "guk" +0xad85: "gut" +0xad86: "gup" +0xad87: "guh" +0xad88: "gweo" +0xad89: "gweog" +0xad8a: "gweogg" +0xad8b: "gweogs" +0xad8c: "gweon" +0xad8d: "gweonj" +0xad8e: "gweonh" +0xad8f: "gweod" +0xad90: "gweol" +0xad91: "gweolg" +0xad92: "gweolm" +0xad93: "gweolb" +0xad94: "gweols" +0xad95: "gweolt" +0xad96: "gweolp" +0xad97: "gweolh" +0xad98: "gweom" +0xad99: "gweob" +0xad9a: "gweobs" +0xad9b: "gweos" +0xad9c: "gweoss" +0xad9d: "gweong" +0xad9e: "gweoj" +0xad9f: "gweoc" +0xada0: "gweok" +0xada1: "gweot" +0xada2: "gweop" +0xada3: "gweoh" +0xada4: "gwe" +0xada5: "gweg" +0xada6: "gwegg" +0xada7: "gwegs" +0xada8: "gwen" +0xada9: "gwenj" +0xadaa: "gwenh" +0xadab: "gwed" +0xadac: "gwel" +0xadad: "gwelg" +0xadae: "gwelm" +0xadaf: "gwelb" +0xadb0: "gwels" +0xadb1: "gwelt" +0xadb2: "gwelp" +0xadb3: "gwelh" +0xadb4: "gwem" +0xadb5: "gweb" +0xadb6: "gwebs" +0xadb7: "gwes" +0xadb8: "gwess" +0xadb9: "gweng" +0xadba: "gwej" +0xadbb: "gwec" +0xadbc: "gwek" +0xadbd: "gwet" +0xadbe: "gwep" +0xadbf: "gweh" +0xadc0: "gwi" +0xadc1: "gwig" +0xadc2: "gwigg" +0xadc3: "gwigs" +0xadc4: "gwin" +0xadc5: "gwinj" +0xadc6: "gwinh" +0xadc7: "gwid" +0xadc8: "gwil" +0xadc9: "gwilg" +0xadca: "gwilm" +0xadcb: "gwilb" +0xadcc: "gwils" +0xadcd: "gwilt" +0xadce: "gwilp" +0xadcf: "gwilh" +0xadd0: "gwim" +0xadd1: "gwib" +0xadd2: "gwibs" +0xadd3: "gwis" +0xadd4: "gwiss" +0xadd5: "gwing" +0xadd6: "gwij" +0xadd7: "gwic" +0xadd8: "gwik" +0xadd9: "gwit" +0xadda: "gwip" +0xaddb: "gwih" +0xaddc: "gyu" +0xaddd: "gyug" +0xadde: "gyugg" +0xaddf: "gyugs" +0xade0: "gyun" +0xade1: "gyunj" +0xade2: "gyunh" +0xade3: "gyud" +0xade4: "gyul" +0xade5: "gyulg" +0xade6: "gyulm" +0xade7: "gyulb" +0xade8: "gyuls" +0xade9: "gyult" +0xadea: "gyulp" +0xadeb: "gyulh" +0xadec: "gyum" +0xaded: "gyub" +0xadee: "gyubs" +0xadef: "gyus" +0xadf0: "gyuss" +0xadf1: "gyung" +0xadf2: "gyuj" +0xadf3: "gyuc" +0xadf4: "gyuk" +0xadf5: "gyut" +0xadf6: "gyup" +0xadf7: "gyuh" +0xadf8: "geu" +0xadf9: "geug" +0xadfa: "geugg" +0xadfb: "geugs" +0xadfc: "geun" +0xadfd: "geunj" +0xadfe: "geunh" +0xadff: "geud" +/* x0ae */ +0xae00: "geul" +0xae01: "geulg" +0xae02: "geulm" +0xae03: "geulb" +0xae04: "geuls" +0xae05: "geult" +0xae06: "geulp" +0xae07: "geulh" +0xae08: "geum" +0xae09: "geub" +0xae0a: "geubs" +0xae0b: "geus" +0xae0c: "geuss" +0xae0d: "geung" +0xae0e: "geuj" +0xae0f: "geuc" +0xae10: "geuk" +0xae11: "geut" +0xae12: "geup" +0xae13: "geuh" +0xae14: "gyi" +0xae15: "gyig" +0xae16: "gyigg" +0xae17: "gyigs" +0xae18: "gyin" +0xae19: "gyinj" +0xae1a: "gyinh" +0xae1b: "gyid" +0xae1c: "gyil" +0xae1d: "gyilg" +0xae1e: "gyilm" +0xae1f: "gyilb" +0xae20: "gyils" +0xae21: "gyilt" +0xae22: "gyilp" +0xae23: "gyilh" +0xae24: "gyim" +0xae25: "gyib" +0xae26: "gyibs" +0xae27: "gyis" +0xae28: "gyiss" +0xae29: "gying" +0xae2a: "gyij" +0xae2b: "gyic" +0xae2c: "gyik" +0xae2d: "gyit" +0xae2e: "gyip" +0xae2f: "gyih" +0xae30: "gi" +0xae31: "gig" +0xae32: "gigg" +0xae33: "gigs" +0xae34: "gin" +0xae35: "ginj" +0xae36: "ginh" +0xae37: "gid" +0xae38: "gil" +0xae39: "gilg" +0xae3a: "gilm" +0xae3b: "gilb" +0xae3c: "gils" +0xae3d: "gilt" +0xae3e: "gilp" +0xae3f: "gilh" +0xae40: "gim" +0xae41: "gib" +0xae42: "gibs" +0xae43: "gis" +0xae44: "giss" +0xae45: "ging" +0xae46: "gij" +0xae47: "gic" +0xae48: "gik" +0xae49: "git" +0xae4a: "gip" +0xae4b: "gih" +0xae4c: "gga" +0xae4d: "ggag" +0xae4e: "ggagg" +0xae4f: "ggags" +0xae50: "ggan" +0xae51: "gganj" +0xae52: "gganh" +0xae53: "ggad" +0xae54: "ggal" +0xae55: "ggalg" +0xae56: "ggalm" +0xae57: "ggalb" +0xae58: "ggals" +0xae59: "ggalt" +0xae5a: "ggalp" +0xae5b: "ggalh" +0xae5c: "ggam" +0xae5d: "ggab" +0xae5e: "ggabs" +0xae5f: "ggas" +0xae60: "ggass" +0xae61: "ggang" +0xae62: "ggaj" +0xae63: "ggac" +0xae64: "ggak" +0xae65: "ggat" +0xae66: "ggap" +0xae67: "ggah" +0xae68: "ggae" +0xae69: "ggaeg" +0xae6a: "ggaegg" +0xae6b: "ggaegs" +0xae6c: "ggaen" +0xae6d: "ggaenj" +0xae6e: "ggaenh" +0xae6f: "ggaed" +0xae70: "ggael" +0xae71: "ggaelg" +0xae72: "ggaelm" +0xae73: "ggaelb" +0xae74: "ggaels" +0xae75: "ggaelt" +0xae76: "ggaelp" +0xae77: "ggaelh" +0xae78: "ggaem" +0xae79: "ggaeb" +0xae7a: "ggaebs" +0xae7b: "ggaes" +0xae7c: "ggaess" +0xae7d: "ggaeng" +0xae7e: "ggaej" +0xae7f: "ggaec" +0xae80: "ggaek" +0xae81: "ggaet" +0xae82: "ggaep" +0xae83: "ggaeh" +0xae84: "ggya" +0xae85: "ggyag" +0xae86: "ggyagg" +0xae87: "ggyags" +0xae88: "ggyan" +0xae89: "ggyanj" +0xae8a: "ggyanh" +0xae8b: "ggyad" +0xae8c: "ggyal" +0xae8d: "ggyalg" +0xae8e: "ggyalm" +0xae8f: "ggyalb" +0xae90: "ggyals" +0xae91: "ggyalt" +0xae92: "ggyalp" +0xae93: "ggyalh" +0xae94: "ggyam" +0xae95: "ggyab" +0xae96: "ggyabs" +0xae97: "ggyas" +0xae98: "ggyass" +0xae99: "ggyang" +0xae9a: "ggyaj" +0xae9b: "ggyac" +0xae9c: "ggyak" +0xae9d: "ggyat" +0xae9e: "ggyap" +0xae9f: "ggyah" +0xaea0: "ggyae" +0xaea1: "ggyaeg" +0xaea2: "ggyaegg" +0xaea3: "ggyaegs" +0xaea4: "ggyaen" +0xaea5: "ggyaenj" +0xaea6: "ggyaenh" +0xaea7: "ggyaed" +0xaea8: "ggyael" +0xaea9: "ggyaelg" +0xaeaa: "ggyaelm" +0xaeab: "ggyaelb" +0xaeac: "ggyaels" +0xaead: "ggyaelt" +0xaeae: "ggyaelp" +0xaeaf: "ggyaelh" +0xaeb0: "ggyaem" +0xaeb1: "ggyaeb" +0xaeb2: "ggyaebs" +0xaeb3: "ggyaes" +0xaeb4: "ggyaess" +0xaeb5: "ggyaeng" +0xaeb6: "ggyaej" +0xaeb7: "ggyaec" +0xaeb8: "ggyaek" +0xaeb9: "ggyaet" +0xaeba: "ggyaep" +0xaebb: "ggyaeh" +0xaebc: "ggeo" +0xaebd: "ggeog" +0xaebe: "ggeogg" +0xaebf: "ggeogs" +0xaec0: "ggeon" +0xaec1: "ggeonj" +0xaec2: "ggeonh" +0xaec3: "ggeod" +0xaec4: "ggeol" +0xaec5: "ggeolg" +0xaec6: "ggeolm" +0xaec7: "ggeolb" +0xaec8: "ggeols" +0xaec9: "ggeolt" +0xaeca: "ggeolp" +0xaecb: "ggeolh" +0xaecc: "ggeom" +0xaecd: "ggeob" +0xaece: "ggeobs" +0xaecf: "ggeos" +0xaed0: "ggeoss" +0xaed1: "ggeong" +0xaed2: "ggeoj" +0xaed3: "ggeoc" +0xaed4: "ggeok" +0xaed5: "ggeot" +0xaed6: "ggeop" +0xaed7: "ggeoh" +0xaed8: "gge" +0xaed9: "ggeg" +0xaeda: "ggegg" +0xaedb: "ggegs" +0xaedc: "ggen" +0xaedd: "ggenj" +0xaede: "ggenh" +0xaedf: "gged" +0xaee0: "ggel" +0xaee1: "ggelg" +0xaee2: "ggelm" +0xaee3: "ggelb" +0xaee4: "ggels" +0xaee5: "ggelt" +0xaee6: "ggelp" +0xaee7: "ggelh" +0xaee8: "ggem" +0xaee9: "ggeb" +0xaeea: "ggebs" +0xaeeb: "gges" +0xaeec: "ggess" +0xaeed: "ggeng" +0xaeee: "ggej" +0xaeef: "ggec" +0xaef0: "ggek" +0xaef1: "gget" +0xaef2: "ggep" +0xaef3: "ggeh" +0xaef4: "ggyeo" +0xaef5: "ggyeog" +0xaef6: "ggyeogg" +0xaef7: "ggyeogs" +0xaef8: "ggyeon" +0xaef9: "ggyeonj" +0xaefa: "ggyeonh" +0xaefb: "ggyeod" +0xaefc: "ggyeol" +0xaefd: "ggyeolg" +0xaefe: "ggyeolm" +0xaeff: "ggyeolb" +/* x0af */ +0xaf00: "ggyeols" +0xaf01: "ggyeolt" +0xaf02: "ggyeolp" +0xaf03: "ggyeolh" +0xaf04: "ggyeom" +0xaf05: "ggyeob" +0xaf06: "ggyeobs" +0xaf07: "ggyeos" +0xaf08: "ggyeoss" +0xaf09: "ggyeong" +0xaf0a: "ggyeoj" +0xaf0b: "ggyeoc" +0xaf0c: "ggyeok" +0xaf0d: "ggyeot" +0xaf0e: "ggyeop" +0xaf0f: "ggyeoh" +0xaf10: "ggye" +0xaf11: "ggyeg" +0xaf12: "ggyegg" +0xaf13: "ggyegs" +0xaf14: "ggyen" +0xaf15: "ggyenj" +0xaf16: "ggyenh" +0xaf17: "ggyed" +0xaf18: "ggyel" +0xaf19: "ggyelg" +0xaf1a: "ggyelm" +0xaf1b: "ggyelb" +0xaf1c: "ggyels" +0xaf1d: "ggyelt" +0xaf1e: "ggyelp" +0xaf1f: "ggyelh" +0xaf20: "ggyem" +0xaf21: "ggyeb" +0xaf22: "ggyebs" +0xaf23: "ggyes" +0xaf24: "ggyess" +0xaf25: "ggyeng" +0xaf26: "ggyej" +0xaf27: "ggyec" +0xaf28: "ggyek" +0xaf29: "ggyet" +0xaf2a: "ggyep" +0xaf2b: "ggyeh" +0xaf2c: "ggo" +0xaf2d: "ggog" +0xaf2e: "ggogg" +0xaf2f: "ggogs" +0xaf30: "ggon" +0xaf31: "ggonj" +0xaf32: "ggonh" +0xaf33: "ggod" +0xaf34: "ggol" +0xaf35: "ggolg" +0xaf36: "ggolm" +0xaf37: "ggolb" +0xaf38: "ggols" +0xaf39: "ggolt" +0xaf3a: "ggolp" +0xaf3b: "ggolh" +0xaf3c: "ggom" +0xaf3d: "ggob" +0xaf3e: "ggobs" +0xaf3f: "ggos" +0xaf40: "ggoss" +0xaf41: "ggong" +0xaf42: "ggoj" +0xaf43: "ggoc" +0xaf44: "ggok" +0xaf45: "ggot" +0xaf46: "ggop" +0xaf47: "ggoh" +0xaf48: "ggwa" +0xaf49: "ggwag" +0xaf4a: "ggwagg" +0xaf4b: "ggwags" +0xaf4c: "ggwan" +0xaf4d: "ggwanj" +0xaf4e: "ggwanh" +0xaf4f: "ggwad" +0xaf50: "ggwal" +0xaf51: "ggwalg" +0xaf52: "ggwalm" +0xaf53: "ggwalb" +0xaf54: "ggwals" +0xaf55: "ggwalt" +0xaf56: "ggwalp" +0xaf57: "ggwalh" +0xaf58: "ggwam" +0xaf59: "ggwab" +0xaf5a: "ggwabs" +0xaf5b: "ggwas" +0xaf5c: "ggwass" +0xaf5d: "ggwang" +0xaf5e: "ggwaj" +0xaf5f: "ggwac" +0xaf60: "ggwak" +0xaf61: "ggwat" +0xaf62: "ggwap" +0xaf63: "ggwah" +0xaf64: "ggwae" +0xaf65: "ggwaeg" +0xaf66: "ggwaegg" +0xaf67: "ggwaegs" +0xaf68: "ggwaen" +0xaf69: "ggwaenj" +0xaf6a: "ggwaenh" +0xaf6b: "ggwaed" +0xaf6c: "ggwael" +0xaf6d: "ggwaelg" +0xaf6e: "ggwaelm" +0xaf6f: "ggwaelb" +0xaf70: "ggwaels" +0xaf71: "ggwaelt" +0xaf72: "ggwaelp" +0xaf73: "ggwaelh" +0xaf74: "ggwaem" +0xaf75: "ggwaeb" +0xaf76: "ggwaebs" +0xaf77: "ggwaes" +0xaf78: "ggwaess" +0xaf79: "ggwaeng" +0xaf7a: "ggwaej" +0xaf7b: "ggwaec" +0xaf7c: "ggwaek" +0xaf7d: "ggwaet" +0xaf7e: "ggwaep" +0xaf7f: "ggwaeh" +0xaf80: "ggoe" +0xaf81: "ggoeg" +0xaf82: "ggoegg" +0xaf83: "ggoegs" +0xaf84: "ggoen" +0xaf85: "ggoenj" +0xaf86: "ggoenh" +0xaf87: "ggoed" +0xaf88: "ggoel" +0xaf89: "ggoelg" +0xaf8a: "ggoelm" +0xaf8b: "ggoelb" +0xaf8c: "ggoels" +0xaf8d: "ggoelt" +0xaf8e: "ggoelp" +0xaf8f: "ggoelh" +0xaf90: "ggoem" +0xaf91: "ggoeb" +0xaf92: "ggoebs" +0xaf93: "ggoes" +0xaf94: "ggoess" +0xaf95: "ggoeng" +0xaf96: "ggoej" +0xaf97: "ggoec" +0xaf98: "ggoek" +0xaf99: "ggoet" +0xaf9a: "ggoep" +0xaf9b: "ggoeh" +0xaf9c: "ggyo" +0xaf9d: "ggyog" +0xaf9e: "ggyogg" +0xaf9f: "ggyogs" +0xafa0: "ggyon" +0xafa1: "ggyonj" +0xafa2: "ggyonh" +0xafa3: "ggyod" +0xafa4: "ggyol" +0xafa5: "ggyolg" +0xafa6: "ggyolm" +0xafa7: "ggyolb" +0xafa8: "ggyols" +0xafa9: "ggyolt" +0xafaa: "ggyolp" +0xafab: "ggyolh" +0xafac: "ggyom" +0xafad: "ggyob" +0xafae: "ggyobs" +0xafaf: "ggyos" +0xafb0: "ggyoss" +0xafb1: "ggyong" +0xafb2: "ggyoj" +0xafb3: "ggyoc" +0xafb4: "ggyok" +0xafb5: "ggyot" +0xafb6: "ggyop" +0xafb7: "ggyoh" +0xafb8: "ggu" +0xafb9: "ggug" +0xafba: "ggugg" +0xafbb: "ggugs" +0xafbc: "ggun" +0xafbd: "ggunj" +0xafbe: "ggunh" +0xafbf: "ggud" +0xafc0: "ggul" +0xafc1: "ggulg" +0xafc2: "ggulm" +0xafc3: "ggulb" +0xafc4: "gguls" +0xafc5: "ggult" +0xafc6: "ggulp" +0xafc7: "ggulh" +0xafc8: "ggum" +0xafc9: "ggub" +0xafca: "ggubs" +0xafcb: "ggus" +0xafcc: "gguss" +0xafcd: "ggung" +0xafce: "gguj" +0xafcf: "gguc" +0xafd0: "gguk" +0xafd1: "ggut" +0xafd2: "ggup" +0xafd3: "gguh" +0xafd4: "ggweo" +0xafd5: "ggweog" +0xafd6: "ggweogg" +0xafd7: "ggweogs" +0xafd8: "ggweon" +0xafd9: "ggweonj" +0xafda: "ggweonh" +0xafdb: "ggweod" +0xafdc: "ggweol" +0xafdd: "ggweolg" +0xafde: "ggweolm" +0xafdf: "ggweolb" +0xafe0: "ggweols" +0xafe1: "ggweolt" +0xafe2: "ggweolp" +0xafe3: "ggweolh" +0xafe4: "ggweom" +0xafe5: "ggweob" +0xafe6: "ggweobs" +0xafe7: "ggweos" +0xafe8: "ggweoss" +0xafe9: "ggweong" +0xafea: "ggweoj" +0xafeb: "ggweoc" +0xafec: "ggweok" +0xafed: "ggweot" +0xafee: "ggweop" +0xafef: "ggweoh" +0xaff0: "ggwe" +0xaff1: "ggweg" +0xaff2: "ggwegg" +0xaff3: "ggwegs" +0xaff4: "ggwen" +0xaff5: "ggwenj" +0xaff6: "ggwenh" +0xaff7: "ggwed" +0xaff8: "ggwel" +0xaff9: "ggwelg" +0xaffa: "ggwelm" +0xaffb: "ggwelb" +0xaffc: "ggwels" +0xaffd: "ggwelt" +0xaffe: "ggwelp" +0xafff: "ggwelh" +/* x0b0 */ +0xb000: "ggwem" +0xb001: "ggweb" +0xb002: "ggwebs" +0xb003: "ggwes" +0xb004: "ggwess" +0xb005: "ggweng" +0xb006: "ggwej" +0xb007: "ggwec" +0xb008: "ggwek" +0xb009: "ggwet" +0xb00a: "ggwep" +0xb00b: "ggweh" +0xb00c: "ggwi" +0xb00d: "ggwig" +0xb00e: "ggwigg" +0xb00f: "ggwigs" +0xb010: "ggwin" +0xb011: "ggwinj" +0xb012: "ggwinh" +0xb013: "ggwid" +0xb014: "ggwil" +0xb015: "ggwilg" +0xb016: "ggwilm" +0xb017: "ggwilb" +0xb018: "ggwils" +0xb019: "ggwilt" +0xb01a: "ggwilp" +0xb01b: "ggwilh" +0xb01c: "ggwim" +0xb01d: "ggwib" +0xb01e: "ggwibs" +0xb01f: "ggwis" +0xb020: "ggwiss" +0xb021: "ggwing" +0xb022: "ggwij" +0xb023: "ggwic" +0xb024: "ggwik" +0xb025: "ggwit" +0xb026: "ggwip" +0xb027: "ggwih" +0xb028: "ggyu" +0xb029: "ggyug" +0xb02a: "ggyugg" +0xb02b: "ggyugs" +0xb02c: "ggyun" +0xb02d: "ggyunj" +0xb02e: "ggyunh" +0xb02f: "ggyud" +0xb030: "ggyul" +0xb031: "ggyulg" +0xb032: "ggyulm" +0xb033: "ggyulb" +0xb034: "ggyuls" +0xb035: "ggyult" +0xb036: "ggyulp" +0xb037: "ggyulh" +0xb038: "ggyum" +0xb039: "ggyub" +0xb03a: "ggyubs" +0xb03b: "ggyus" +0xb03c: "ggyuss" +0xb03d: "ggyung" +0xb03e: "ggyuj" +0xb03f: "ggyuc" +0xb040: "ggyuk" +0xb041: "ggyut" +0xb042: "ggyup" +0xb043: "ggyuh" +0xb044: "ggeu" +0xb045: "ggeug" +0xb046: "ggeugg" +0xb047: "ggeugs" +0xb048: "ggeun" +0xb049: "ggeunj" +0xb04a: "ggeunh" +0xb04b: "ggeud" +0xb04c: "ggeul" +0xb04d: "ggeulg" +0xb04e: "ggeulm" +0xb04f: "ggeulb" +0xb050: "ggeuls" +0xb051: "ggeult" +0xb052: "ggeulp" +0xb053: "ggeulh" +0xb054: "ggeum" +0xb055: "ggeub" +0xb056: "ggeubs" +0xb057: "ggeus" +0xb058: "ggeuss" +0xb059: "ggeung" +0xb05a: "ggeuj" +0xb05b: "ggeuc" +0xb05c: "ggeuk" +0xb05d: "ggeut" +0xb05e: "ggeup" +0xb05f: "ggeuh" +0xb060: "ggyi" +0xb061: "ggyig" +0xb062: "ggyigg" +0xb063: "ggyigs" +0xb064: "ggyin" +0xb065: "ggyinj" +0xb066: "ggyinh" +0xb067: "ggyid" +0xb068: "ggyil" +0xb069: "ggyilg" +0xb06a: "ggyilm" +0xb06b: "ggyilb" +0xb06c: "ggyils" +0xb06d: "ggyilt" +0xb06e: "ggyilp" +0xb06f: "ggyilh" +0xb070: "ggyim" +0xb071: "ggyib" +0xb072: "ggyibs" +0xb073: "ggyis" +0xb074: "ggyiss" +0xb075: "ggying" +0xb076: "ggyij" +0xb077: "ggyic" +0xb078: "ggyik" +0xb079: "ggyit" +0xb07a: "ggyip" +0xb07b: "ggyih" +0xb07c: "ggi" +0xb07d: "ggig" +0xb07e: "ggigg" +0xb07f: "ggigs" +0xb080: "ggin" +0xb081: "gginj" +0xb082: "gginh" +0xb083: "ggid" +0xb084: "ggil" +0xb085: "ggilg" +0xb086: "ggilm" +0xb087: "ggilb" +0xb088: "ggils" +0xb089: "ggilt" +0xb08a: "ggilp" +0xb08b: "ggilh" +0xb08c: "ggim" +0xb08d: "ggib" +0xb08e: "ggibs" +0xb08f: "ggis" +0xb090: "ggiss" +0xb091: "gging" +0xb092: "ggij" +0xb093: "ggic" +0xb094: "ggik" +0xb095: "ggit" +0xb096: "ggip" +0xb097: "ggih" +0xb098: "na" +0xb099: "nag" +0xb09a: "nagg" +0xb09b: "nags" +0xb09c: "nan" +0xb09d: "nanj" +0xb09e: "nanh" +0xb09f: "nad" +0xb0a0: "nal" +0xb0a1: "nalg" +0xb0a2: "nalm" +0xb0a3: "nalb" +0xb0a4: "nals" +0xb0a5: "nalt" +0xb0a6: "nalp" +0xb0a7: "nalh" +0xb0a8: "nam" +0xb0a9: "nab" +0xb0aa: "nabs" +0xb0ab: "nas" +0xb0ac: "nass" +0xb0ad: "nang" +0xb0ae: "naj" +0xb0af: "nac" +0xb0b0: "nak" +0xb0b1: "nat" +0xb0b2: "nap" +0xb0b3: "nah" +0xb0b4: "nae" +0xb0b5: "naeg" +0xb0b6: "naegg" +0xb0b7: "naegs" +0xb0b8: "naen" +0xb0b9: "naenj" +0xb0ba: "naenh" +0xb0bb: "naed" +0xb0bc: "nael" +0xb0bd: "naelg" +0xb0be: "naelm" +0xb0bf: "naelb" +0xb0c0: "naels" +0xb0c1: "naelt" +0xb0c2: "naelp" +0xb0c3: "naelh" +0xb0c4: "naem" +0xb0c5: "naeb" +0xb0c6: "naebs" +0xb0c7: "naes" +0xb0c8: "naess" +0xb0c9: "naeng" +0xb0ca: "naej" +0xb0cb: "naec" +0xb0cc: "naek" +0xb0cd: "naet" +0xb0ce: "naep" +0xb0cf: "naeh" +0xb0d0: "nya" +0xb0d1: "nyag" +0xb0d2: "nyagg" +0xb0d3: "nyags" +0xb0d4: "nyan" +0xb0d5: "nyanj" +0xb0d6: "nyanh" +0xb0d7: "nyad" +0xb0d8: "nyal" +0xb0d9: "nyalg" +0xb0da: "nyalm" +0xb0db: "nyalb" +0xb0dc: "nyals" +0xb0dd: "nyalt" +0xb0de: "nyalp" +0xb0df: "nyalh" +0xb0e0: "nyam" +0xb0e1: "nyab" +0xb0e2: "nyabs" +0xb0e3: "nyas" +0xb0e4: "nyass" +0xb0e5: "nyang" +0xb0e6: "nyaj" +0xb0e7: "nyac" +0xb0e8: "nyak" +0xb0e9: "nyat" +0xb0ea: "nyap" +0xb0eb: "nyah" +0xb0ec: "nyae" +0xb0ed: "nyaeg" +0xb0ee: "nyaegg" +0xb0ef: "nyaegs" +0xb0f0: "nyaen" +0xb0f1: "nyaenj" +0xb0f2: "nyaenh" +0xb0f3: "nyaed" +0xb0f4: "nyael" +0xb0f5: "nyaelg" +0xb0f6: "nyaelm" +0xb0f7: "nyaelb" +0xb0f8: "nyaels" +0xb0f9: "nyaelt" +0xb0fa: "nyaelp" +0xb0fb: "nyaelh" +0xb0fc: "nyaem" +0xb0fd: "nyaeb" +0xb0fe: "nyaebs" +0xb0ff: "nyaes" +/* x0b1 */ +0xb100: "nyaess" +0xb101: "nyaeng" +0xb102: "nyaej" +0xb103: "nyaec" +0xb104: "nyaek" +0xb105: "nyaet" +0xb106: "nyaep" +0xb107: "nyaeh" +0xb108: "neo" +0xb109: "neog" +0xb10a: "neogg" +0xb10b: "neogs" +0xb10c: "neon" +0xb10d: "neonj" +0xb10e: "neonh" +0xb10f: "neod" +0xb110: "neol" +0xb111: "neolg" +0xb112: "neolm" +0xb113: "neolb" +0xb114: "neols" +0xb115: "neolt" +0xb116: "neolp" +0xb117: "neolh" +0xb118: "neom" +0xb119: "neob" +0xb11a: "neobs" +0xb11b: "neos" +0xb11c: "neoss" +0xb11d: "neong" +0xb11e: "neoj" +0xb11f: "neoc" +0xb120: "neok" +0xb121: "neot" +0xb122: "neop" +0xb123: "neoh" +0xb124: "ne" +0xb125: "neg" +0xb126: "negg" +0xb127: "negs" +0xb128: "nen" +0xb129: "nenj" +0xb12a: "nenh" +0xb12b: "ned" +0xb12c: "nel" +0xb12d: "nelg" +0xb12e: "nelm" +0xb12f: "nelb" +0xb130: "nels" +0xb131: "nelt" +0xb132: "nelp" +0xb133: "nelh" +0xb134: "nem" +0xb135: "neb" +0xb136: "nebs" +0xb137: "nes" +0xb138: "ness" +0xb139: "neng" +0xb13a: "nej" +0xb13b: "nec" +0xb13c: "nek" +0xb13d: "net" +0xb13e: "nep" +0xb13f: "neh" +0xb140: "nyeo" +0xb141: "nyeog" +0xb142: "nyeogg" +0xb143: "nyeogs" +0xb144: "nyeon" +0xb145: "nyeonj" +0xb146: "nyeonh" +0xb147: "nyeod" +0xb148: "nyeol" +0xb149: "nyeolg" +0xb14a: "nyeolm" +0xb14b: "nyeolb" +0xb14c: "nyeols" +0xb14d: "nyeolt" +0xb14e: "nyeolp" +0xb14f: "nyeolh" +0xb150: "nyeom" +0xb151: "nyeob" +0xb152: "nyeobs" +0xb153: "nyeos" +0xb154: "nyeoss" +0xb155: "nyeong" +0xb156: "nyeoj" +0xb157: "nyeoc" +0xb158: "nyeok" +0xb159: "nyeot" +0xb15a: "nyeop" +0xb15b: "nyeoh" +0xb15c: "nye" +0xb15d: "nyeg" +0xb15e: "nyegg" +0xb15f: "nyegs" +0xb160: "nyen" +0xb161: "nyenj" +0xb162: "nyenh" +0xb163: "nyed" +0xb164: "nyel" +0xb165: "nyelg" +0xb166: "nyelm" +0xb167: "nyelb" +0xb168: "nyels" +0xb169: "nyelt" +0xb16a: "nyelp" +0xb16b: "nyelh" +0xb16c: "nyem" +0xb16d: "nyeb" +0xb16e: "nyebs" +0xb16f: "nyes" +0xb170: "nyess" +0xb171: "nyeng" +0xb172: "nyej" +0xb173: "nyec" +0xb174: "nyek" +0xb175: "nyet" +0xb176: "nyep" +0xb177: "nyeh" +0xb178: "no" +0xb179: "nog" +0xb17a: "nogg" +0xb17b: "nogs" +0xb17c: "non" +0xb17d: "nonj" +0xb17e: "nonh" +0xb17f: "nod" +0xb180: "nol" +0xb181: "nolg" +0xb182: "nolm" +0xb183: "nolb" +0xb184: "nols" +0xb185: "nolt" +0xb186: "nolp" +0xb187: "nolh" +0xb188: "nom" +0xb189: "nob" +0xb18a: "nobs" +0xb18b: "nos" +0xb18c: "noss" +0xb18d: "nong" +0xb18e: "noj" +0xb18f: "noc" +0xb190: "nok" +0xb191: "not" +0xb192: "nop" +0xb193: "noh" +0xb194: "nwa" +0xb195: "nwag" +0xb196: "nwagg" +0xb197: "nwags" +0xb198: "nwan" +0xb199: "nwanj" +0xb19a: "nwanh" +0xb19b: "nwad" +0xb19c: "nwal" +0xb19d: "nwalg" +0xb19e: "nwalm" +0xb19f: "nwalb" +0xb1a0: "nwals" +0xb1a1: "nwalt" +0xb1a2: "nwalp" +0xb1a3: "nwalh" +0xb1a4: "nwam" +0xb1a5: "nwab" +0xb1a6: "nwabs" +0xb1a7: "nwas" +0xb1a8: "nwass" +0xb1a9: "nwang" +0xb1aa: "nwaj" +0xb1ab: "nwac" +0xb1ac: "nwak" +0xb1ad: "nwat" +0xb1ae: "nwap" +0xb1af: "nwah" +0xb1b0: "nwae" +0xb1b1: "nwaeg" +0xb1b2: "nwaegg" +0xb1b3: "nwaegs" +0xb1b4: "nwaen" +0xb1b5: "nwaenj" +0xb1b6: "nwaenh" +0xb1b7: "nwaed" +0xb1b8: "nwael" +0xb1b9: "nwaelg" +0xb1ba: "nwaelm" +0xb1bb: "nwaelb" +0xb1bc: "nwaels" +0xb1bd: "nwaelt" +0xb1be: "nwaelp" +0xb1bf: "nwaelh" +0xb1c0: "nwaem" +0xb1c1: "nwaeb" +0xb1c2: "nwaebs" +0xb1c3: "nwaes" +0xb1c4: "nwaess" +0xb1c5: "nwaeng" +0xb1c6: "nwaej" +0xb1c7: "nwaec" +0xb1c8: "nwaek" +0xb1c9: "nwaet" +0xb1ca: "nwaep" +0xb1cb: "nwaeh" +0xb1cc: "noe" +0xb1cd: "noeg" +0xb1ce: "noegg" +0xb1cf: "noegs" +0xb1d0: "noen" +0xb1d1: "noenj" +0xb1d2: "noenh" +0xb1d3: "noed" +0xb1d4: "noel" +0xb1d5: "noelg" +0xb1d6: "noelm" +0xb1d7: "noelb" +0xb1d8: "noels" +0xb1d9: "noelt" +0xb1da: "noelp" +0xb1db: "noelh" +0xb1dc: "noem" +0xb1dd: "noeb" +0xb1de: "noebs" +0xb1df: "noes" +0xb1e0: "noess" +0xb1e1: "noeng" +0xb1e2: "noej" +0xb1e3: "noec" +0xb1e4: "noek" +0xb1e5: "noet" +0xb1e6: "noep" +0xb1e7: "noeh" +0xb1e8: "nyo" +0xb1e9: "nyog" +0xb1ea: "nyogg" +0xb1eb: "nyogs" +0xb1ec: "nyon" +0xb1ed: "nyonj" +0xb1ee: "nyonh" +0xb1ef: "nyod" +0xb1f0: "nyol" +0xb1f1: "nyolg" +0xb1f2: "nyolm" +0xb1f3: "nyolb" +0xb1f4: "nyols" +0xb1f5: "nyolt" +0xb1f6: "nyolp" +0xb1f7: "nyolh" +0xb1f8: "nyom" +0xb1f9: "nyob" +0xb1fa: "nyobs" +0xb1fb: "nyos" +0xb1fc: "nyoss" +0xb1fd: "nyong" +0xb1fe: "nyoj" +0xb1ff: "nyoc" +/* x0b2 */ +0xb200: "nyok" +0xb201: "nyot" +0xb202: "nyop" +0xb203: "nyoh" +0xb204: "nu" +0xb205: "nug" +0xb206: "nugg" +0xb207: "nugs" +0xb208: "nun" +0xb209: "nunj" +0xb20a: "nunh" +0xb20b: "nud" +0xb20c: "nul" +0xb20d: "nulg" +0xb20e: "nulm" +0xb20f: "nulb" +0xb210: "nuls" +0xb211: "nult" +0xb212: "nulp" +0xb213: "nulh" +0xb214: "num" +0xb215: "nub" +0xb216: "nubs" +0xb217: "nus" +0xb218: "nuss" +0xb219: "nung" +0xb21a: "nuj" +0xb21b: "nuc" +0xb21c: "nuk" +0xb21d: "nut" +0xb21e: "nup" +0xb21f: "nuh" +0xb220: "nweo" +0xb221: "nweog" +0xb222: "nweogg" +0xb223: "nweogs" +0xb224: "nweon" +0xb225: "nweonj" +0xb226: "nweonh" +0xb227: "nweod" +0xb228: "nweol" +0xb229: "nweolg" +0xb22a: "nweolm" +0xb22b: "nweolb" +0xb22c: "nweols" +0xb22d: "nweolt" +0xb22e: "nweolp" +0xb22f: "nweolh" +0xb230: "nweom" +0xb231: "nweob" +0xb232: "nweobs" +0xb233: "nweos" +0xb234: "nweoss" +0xb235: "nweong" +0xb236: "nweoj" +0xb237: "nweoc" +0xb238: "nweok" +0xb239: "nweot" +0xb23a: "nweop" +0xb23b: "nweoh" +0xb23c: "nwe" +0xb23d: "nweg" +0xb23e: "nwegg" +0xb23f: "nwegs" +0xb240: "nwen" +0xb241: "nwenj" +0xb242: "nwenh" +0xb243: "nwed" +0xb244: "nwel" +0xb245: "nwelg" +0xb246: "nwelm" +0xb247: "nwelb" +0xb248: "nwels" +0xb249: "nwelt" +0xb24a: "nwelp" +0xb24b: "nwelh" +0xb24c: "nwem" +0xb24d: "nweb" +0xb24e: "nwebs" +0xb24f: "nwes" +0xb250: "nwess" +0xb251: "nweng" +0xb252: "nwej" +0xb253: "nwec" +0xb254: "nwek" +0xb255: "nwet" +0xb256: "nwep" +0xb257: "nweh" +0xb258: "nwi" +0xb259: "nwig" +0xb25a: "nwigg" +0xb25b: "nwigs" +0xb25c: "nwin" +0xb25d: "nwinj" +0xb25e: "nwinh" +0xb25f: "nwid" +0xb260: "nwil" +0xb261: "nwilg" +0xb262: "nwilm" +0xb263: "nwilb" +0xb264: "nwils" +0xb265: "nwilt" +0xb266: "nwilp" +0xb267: "nwilh" +0xb268: "nwim" +0xb269: "nwib" +0xb26a: "nwibs" +0xb26b: "nwis" +0xb26c: "nwiss" +0xb26d: "nwing" +0xb26e: "nwij" +0xb26f: "nwic" +0xb270: "nwik" +0xb271: "nwit" +0xb272: "nwip" +0xb273: "nwih" +0xb274: "nyu" +0xb275: "nyug" +0xb276: "nyugg" +0xb277: "nyugs" +0xb278: "nyun" +0xb279: "nyunj" +0xb27a: "nyunh" +0xb27b: "nyud" +0xb27c: "nyul" +0xb27d: "nyulg" +0xb27e: "nyulm" +0xb27f: "nyulb" +0xb280: "nyuls" +0xb281: "nyult" +0xb282: "nyulp" +0xb283: "nyulh" +0xb284: "nyum" +0xb285: "nyub" +0xb286: "nyubs" +0xb287: "nyus" +0xb288: "nyuss" +0xb289: "nyung" +0xb28a: "nyuj" +0xb28b: "nyuc" +0xb28c: "nyuk" +0xb28d: "nyut" +0xb28e: "nyup" +0xb28f: "nyuh" +0xb290: "neu" +0xb291: "neug" +0xb292: "neugg" +0xb293: "neugs" +0xb294: "neun" +0xb295: "neunj" +0xb296: "neunh" +0xb297: "neud" +0xb298: "neul" +0xb299: "neulg" +0xb29a: "neulm" +0xb29b: "neulb" +0xb29c: "neuls" +0xb29d: "neult" +0xb29e: "neulp" +0xb29f: "neulh" +0xb2a0: "neum" +0xb2a1: "neub" +0xb2a2: "neubs" +0xb2a3: "neus" +0xb2a4: "neuss" +0xb2a5: "neung" +0xb2a6: "neuj" +0xb2a7: "neuc" +0xb2a8: "neuk" +0xb2a9: "neut" +0xb2aa: "neup" +0xb2ab: "neuh" +0xb2ac: "nyi" +0xb2ad: "nyig" +0xb2ae: "nyigg" +0xb2af: "nyigs" +0xb2b0: "nyin" +0xb2b1: "nyinj" +0xb2b2: "nyinh" +0xb2b3: "nyid" +0xb2b4: "nyil" +0xb2b5: "nyilg" +0xb2b6: "nyilm" +0xb2b7: "nyilb" +0xb2b8: "nyils" +0xb2b9: "nyilt" +0xb2ba: "nyilp" +0xb2bb: "nyilh" +0xb2bc: "nyim" +0xb2bd: "nyib" +0xb2be: "nyibs" +0xb2bf: "nyis" +0xb2c0: "nyiss" +0xb2c1: "nying" +0xb2c2: "nyij" +0xb2c3: "nyic" +0xb2c4: "nyik" +0xb2c5: "nyit" +0xb2c6: "nyip" +0xb2c7: "nyih" +0xb2c8: "ni" +0xb2c9: "nig" +0xb2ca: "nigg" +0xb2cb: "nigs" +0xb2cc: "nin" +0xb2cd: "ninj" +0xb2ce: "ninh" +0xb2cf: "nid" +0xb2d0: "nil" +0xb2d1: "nilg" +0xb2d2: "nilm" +0xb2d3: "nilb" +0xb2d4: "nils" +0xb2d5: "nilt" +0xb2d6: "nilp" +0xb2d7: "nilh" +0xb2d8: "nim" +0xb2d9: "nib" +0xb2da: "nibs" +0xb2db: "nis" +0xb2dc: "niss" +0xb2dd: "ning" +0xb2de: "nij" +0xb2df: "nic" +0xb2e0: "nik" +0xb2e1: "nit" +0xb2e2: "nip" +0xb2e3: "nih" +0xb2e4: "da" +0xb2e5: "dag" +0xb2e6: "dagg" +0xb2e7: "dags" +0xb2e8: "dan" +0xb2e9: "danj" +0xb2ea: "danh" +0xb2eb: "dad" +0xb2ec: "dal" +0xb2ed: "dalg" +0xb2ee: "dalm" +0xb2ef: "dalb" +0xb2f0: "dals" +0xb2f1: "dalt" +0xb2f2: "dalp" +0xb2f3: "dalh" +0xb2f4: "dam" +0xb2f5: "dab" +0xb2f6: "dabs" +0xb2f7: "das" +0xb2f8: "dass" +0xb2f9: "dang" +0xb2fa: "daj" +0xb2fb: "dac" +0xb2fc: "dak" +0xb2fd: "dat" +0xb2fe: "dap" +0xb2ff: "dah" +/* x0b3 */ +0xb300: "dae" +0xb301: "daeg" +0xb302: "daegg" +0xb303: "daegs" +0xb304: "daen" +0xb305: "daenj" +0xb306: "daenh" +0xb307: "daed" +0xb308: "dael" +0xb309: "daelg" +0xb30a: "daelm" +0xb30b: "daelb" +0xb30c: "daels" +0xb30d: "daelt" +0xb30e: "daelp" +0xb30f: "daelh" +0xb310: "daem" +0xb311: "daeb" +0xb312: "daebs" +0xb313: "daes" +0xb314: "daess" +0xb315: "daeng" +0xb316: "daej" +0xb317: "daec" +0xb318: "daek" +0xb319: "daet" +0xb31a: "daep" +0xb31b: "daeh" +0xb31c: "dya" +0xb31d: "dyag" +0xb31e: "dyagg" +0xb31f: "dyags" +0xb320: "dyan" +0xb321: "dyanj" +0xb322: "dyanh" +0xb323: "dyad" +0xb324: "dyal" +0xb325: "dyalg" +0xb326: "dyalm" +0xb327: "dyalb" +0xb328: "dyals" +0xb329: "dyalt" +0xb32a: "dyalp" +0xb32b: "dyalh" +0xb32c: "dyam" +0xb32d: "dyab" +0xb32e: "dyabs" +0xb32f: "dyas" +0xb330: "dyass" +0xb331: "dyang" +0xb332: "dyaj" +0xb333: "dyac" +0xb334: "dyak" +0xb335: "dyat" +0xb336: "dyap" +0xb337: "dyah" +0xb338: "dyae" +0xb339: "dyaeg" +0xb33a: "dyaegg" +0xb33b: "dyaegs" +0xb33c: "dyaen" +0xb33d: "dyaenj" +0xb33e: "dyaenh" +0xb33f: "dyaed" +0xb340: "dyael" +0xb341: "dyaelg" +0xb342: "dyaelm" +0xb343: "dyaelb" +0xb344: "dyaels" +0xb345: "dyaelt" +0xb346: "dyaelp" +0xb347: "dyaelh" +0xb348: "dyaem" +0xb349: "dyaeb" +0xb34a: "dyaebs" +0xb34b: "dyaes" +0xb34c: "dyaess" +0xb34d: "dyaeng" +0xb34e: "dyaej" +0xb34f: "dyaec" +0xb350: "dyaek" +0xb351: "dyaet" +0xb352: "dyaep" +0xb353: "dyaeh" +0xb354: "deo" +0xb355: "deog" +0xb356: "deogg" +0xb357: "deogs" +0xb358: "deon" +0xb359: "deonj" +0xb35a: "deonh" +0xb35b: "deod" +0xb35c: "deol" +0xb35d: "deolg" +0xb35e: "deolm" +0xb35f: "deolb" +0xb360: "deols" +0xb361: "deolt" +0xb362: "deolp" +0xb363: "deolh" +0xb364: "deom" +0xb365: "deob" +0xb366: "deobs" +0xb367: "deos" +0xb368: "deoss" +0xb369: "deong" +0xb36a: "deoj" +0xb36b: "deoc" +0xb36c: "deok" +0xb36d: "deot" +0xb36e: "deop" +0xb36f: "deoh" +0xb370: "de" +0xb371: "deg" +0xb372: "degg" +0xb373: "degs" +0xb374: "den" +0xb375: "denj" +0xb376: "denh" +0xb377: "ded" +0xb378: "del" +0xb379: "delg" +0xb37a: "delm" +0xb37b: "delb" +0xb37c: "dels" +0xb37d: "delt" +0xb37e: "delp" +0xb37f: "delh" +0xb380: "dem" +0xb381: "deb" +0xb382: "debs" +0xb383: "des" +0xb384: "dess" +0xb385: "deng" +0xb386: "dej" +0xb387: "dec" +0xb388: "dek" +0xb389: "det" +0xb38a: "dep" +0xb38b: "deh" +0xb38c: "dyeo" +0xb38d: "dyeog" +0xb38e: "dyeogg" +0xb38f: "dyeogs" +0xb390: "dyeon" +0xb391: "dyeonj" +0xb392: "dyeonh" +0xb393: "dyeod" +0xb394: "dyeol" +0xb395: "dyeolg" +0xb396: "dyeolm" +0xb397: "dyeolb" +0xb398: "dyeols" +0xb399: "dyeolt" +0xb39a: "dyeolp" +0xb39b: "dyeolh" +0xb39c: "dyeom" +0xb39d: "dyeob" +0xb39e: "dyeobs" +0xb39f: "dyeos" +0xb3a0: "dyeoss" +0xb3a1: "dyeong" +0xb3a2: "dyeoj" +0xb3a3: "dyeoc" +0xb3a4: "dyeok" +0xb3a5: "dyeot" +0xb3a6: "dyeop" +0xb3a7: "dyeoh" +0xb3a8: "dye" +0xb3a9: "dyeg" +0xb3aa: "dyegg" +0xb3ab: "dyegs" +0xb3ac: "dyen" +0xb3ad: "dyenj" +0xb3ae: "dyenh" +0xb3af: "dyed" +0xb3b0: "dyel" +0xb3b1: "dyelg" +0xb3b2: "dyelm" +0xb3b3: "dyelb" +0xb3b4: "dyels" +0xb3b5: "dyelt" +0xb3b6: "dyelp" +0xb3b7: "dyelh" +0xb3b8: "dyem" +0xb3b9: "dyeb" +0xb3ba: "dyebs" +0xb3bb: "dyes" +0xb3bc: "dyess" +0xb3bd: "dyeng" +0xb3be: "dyej" +0xb3bf: "dyec" +0xb3c0: "dyek" +0xb3c1: "dyet" +0xb3c2: "dyep" +0xb3c3: "dyeh" +0xb3c4: "do" +0xb3c5: "dog" +0xb3c6: "dogg" +0xb3c7: "dogs" +0xb3c8: "don" +0xb3c9: "donj" +0xb3ca: "donh" +0xb3cb: "dod" +0xb3cc: "dol" +0xb3cd: "dolg" +0xb3ce: "dolm" +0xb3cf: "dolb" +0xb3d0: "dols" +0xb3d1: "dolt" +0xb3d2: "dolp" +0xb3d3: "dolh" +0xb3d4: "dom" +0xb3d5: "dob" +0xb3d6: "dobs" +0xb3d7: "dos" +0xb3d8: "doss" +0xb3d9: "dong" +0xb3da: "doj" +0xb3db: "doc" +0xb3dc: "dok" +0xb3dd: "dot" +0xb3de: "dop" +0xb3df: "doh" +0xb3e0: "dwa" +0xb3e1: "dwag" +0xb3e2: "dwagg" +0xb3e3: "dwags" +0xb3e4: "dwan" +0xb3e5: "dwanj" +0xb3e6: "dwanh" +0xb3e7: "dwad" +0xb3e8: "dwal" +0xb3e9: "dwalg" +0xb3ea: "dwalm" +0xb3eb: "dwalb" +0xb3ec: "dwals" +0xb3ed: "dwalt" +0xb3ee: "dwalp" +0xb3ef: "dwalh" +0xb3f0: "dwam" +0xb3f1: "dwab" +0xb3f2: "dwabs" +0xb3f3: "dwas" +0xb3f4: "dwass" +0xb3f5: "dwang" +0xb3f6: "dwaj" +0xb3f7: "dwac" +0xb3f8: "dwak" +0xb3f9: "dwat" +0xb3fa: "dwap" +0xb3fb: "dwah" +0xb3fc: "dwae" +0xb3fd: "dwaeg" +0xb3fe: "dwaegg" +0xb3ff: "dwaegs" +/* x0b4 */ +0xb400: "dwaen" +0xb401: "dwaenj" +0xb402: "dwaenh" +0xb403: "dwaed" +0xb404: "dwael" +0xb405: "dwaelg" +0xb406: "dwaelm" +0xb407: "dwaelb" +0xb408: "dwaels" +0xb409: "dwaelt" +0xb40a: "dwaelp" +0xb40b: "dwaelh" +0xb40c: "dwaem" +0xb40d: "dwaeb" +0xb40e: "dwaebs" +0xb40f: "dwaes" +0xb410: "dwaess" +0xb411: "dwaeng" +0xb412: "dwaej" +0xb413: "dwaec" +0xb414: "dwaek" +0xb415: "dwaet" +0xb416: "dwaep" +0xb417: "dwaeh" +0xb418: "doe" +0xb419: "doeg" +0xb41a: "doegg" +0xb41b: "doegs" +0xb41c: "doen" +0xb41d: "doenj" +0xb41e: "doenh" +0xb41f: "doed" +0xb420: "doel" +0xb421: "doelg" +0xb422: "doelm" +0xb423: "doelb" +0xb424: "doels" +0xb425: "doelt" +0xb426: "doelp" +0xb427: "doelh" +0xb428: "doem" +0xb429: "doeb" +0xb42a: "doebs" +0xb42b: "does" +0xb42c: "doess" +0xb42d: "doeng" +0xb42e: "doej" +0xb42f: "doec" +0xb430: "doek" +0xb431: "doet" +0xb432: "doep" +0xb433: "doeh" +0xb434: "dyo" +0xb435: "dyog" +0xb436: "dyogg" +0xb437: "dyogs" +0xb438: "dyon" +0xb439: "dyonj" +0xb43a: "dyonh" +0xb43b: "dyod" +0xb43c: "dyol" +0xb43d: "dyolg" +0xb43e: "dyolm" +0xb43f: "dyolb" +0xb440: "dyols" +0xb441: "dyolt" +0xb442: "dyolp" +0xb443: "dyolh" +0xb444: "dyom" +0xb445: "dyob" +0xb446: "dyobs" +0xb447: "dyos" +0xb448: "dyoss" +0xb449: "dyong" +0xb44a: "dyoj" +0xb44b: "dyoc" +0xb44c: "dyok" +0xb44d: "dyot" +0xb44e: "dyop" +0xb44f: "dyoh" +0xb450: "du" +0xb451: "dug" +0xb452: "dugg" +0xb453: "dugs" +0xb454: "dun" +0xb455: "dunj" +0xb456: "dunh" +0xb457: "dud" +0xb458: "dul" +0xb459: "dulg" +0xb45a: "dulm" +0xb45b: "dulb" +0xb45c: "duls" +0xb45d: "dult" +0xb45e: "dulp" +0xb45f: "dulh" +0xb460: "dum" +0xb461: "dub" +0xb462: "dubs" +0xb463: "dus" +0xb464: "duss" +0xb465: "dung" +0xb466: "duj" +0xb467: "duc" +0xb468: "duk" +0xb469: "dut" +0xb46a: "dup" +0xb46b: "duh" +0xb46c: "dweo" +0xb46d: "dweog" +0xb46e: "dweogg" +0xb46f: "dweogs" +0xb470: "dweon" +0xb471: "dweonj" +0xb472: "dweonh" +0xb473: "dweod" +0xb474: "dweol" +0xb475: "dweolg" +0xb476: "dweolm" +0xb477: "dweolb" +0xb478: "dweols" +0xb479: "dweolt" +0xb47a: "dweolp" +0xb47b: "dweolh" +0xb47c: "dweom" +0xb47d: "dweob" +0xb47e: "dweobs" +0xb47f: "dweos" +0xb480: "dweoss" +0xb481: "dweong" +0xb482: "dweoj" +0xb483: "dweoc" +0xb484: "dweok" +0xb485: "dweot" +0xb486: "dweop" +0xb487: "dweoh" +0xb488: "dwe" +0xb489: "dweg" +0xb48a: "dwegg" +0xb48b: "dwegs" +0xb48c: "dwen" +0xb48d: "dwenj" +0xb48e: "dwenh" +0xb48f: "dwed" +0xb490: "dwel" +0xb491: "dwelg" +0xb492: "dwelm" +0xb493: "dwelb" +0xb494: "dwels" +0xb495: "dwelt" +0xb496: "dwelp" +0xb497: "dwelh" +0xb498: "dwem" +0xb499: "dweb" +0xb49a: "dwebs" +0xb49b: "dwes" +0xb49c: "dwess" +0xb49d: "dweng" +0xb49e: "dwej" +0xb49f: "dwec" +0xb4a0: "dwek" +0xb4a1: "dwet" +0xb4a2: "dwep" +0xb4a3: "dweh" +0xb4a4: "dwi" +0xb4a5: "dwig" +0xb4a6: "dwigg" +0xb4a7: "dwigs" +0xb4a8: "dwin" +0xb4a9: "dwinj" +0xb4aa: "dwinh" +0xb4ab: "dwid" +0xb4ac: "dwil" +0xb4ad: "dwilg" +0xb4ae: "dwilm" +0xb4af: "dwilb" +0xb4b0: "dwils" +0xb4b1: "dwilt" +0xb4b2: "dwilp" +0xb4b3: "dwilh" +0xb4b4: "dwim" +0xb4b5: "dwib" +0xb4b6: "dwibs" +0xb4b7: "dwis" +0xb4b8: "dwiss" +0xb4b9: "dwing" +0xb4ba: "dwij" +0xb4bb: "dwic" +0xb4bc: "dwik" +0xb4bd: "dwit" +0xb4be: "dwip" +0xb4bf: "dwih" +0xb4c0: "dyu" +0xb4c1: "dyug" +0xb4c2: "dyugg" +0xb4c3: "dyugs" +0xb4c4: "dyun" +0xb4c5: "dyunj" +0xb4c6: "dyunh" +0xb4c7: "dyud" +0xb4c8: "dyul" +0xb4c9: "dyulg" +0xb4ca: "dyulm" +0xb4cb: "dyulb" +0xb4cc: "dyuls" +0xb4cd: "dyult" +0xb4ce: "dyulp" +0xb4cf: "dyulh" +0xb4d0: "dyum" +0xb4d1: "dyub" +0xb4d2: "dyubs" +0xb4d3: "dyus" +0xb4d4: "dyuss" +0xb4d5: "dyung" +0xb4d6: "dyuj" +0xb4d7: "dyuc" +0xb4d8: "dyuk" +0xb4d9: "dyut" +0xb4da: "dyup" +0xb4db: "dyuh" +0xb4dc: "deu" +0xb4dd: "deug" +0xb4de: "deugg" +0xb4df: "deugs" +0xb4e0: "deun" +0xb4e1: "deunj" +0xb4e2: "deunh" +0xb4e3: "deud" +0xb4e4: "deul" +0xb4e5: "deulg" +0xb4e6: "deulm" +0xb4e7: "deulb" +0xb4e8: "deuls" +0xb4e9: "deult" +0xb4ea: "deulp" +0xb4eb: "deulh" +0xb4ec: "deum" +0xb4ed: "deub" +0xb4ee: "deubs" +0xb4ef: "deus" +0xb4f0: "deuss" +0xb4f1: "deung" +0xb4f2: "deuj" +0xb4f3: "deuc" +0xb4f4: "deuk" +0xb4f5: "deut" +0xb4f6: "deup" +0xb4f7: "deuh" +0xb4f8: "dyi" +0xb4f9: "dyig" +0xb4fa: "dyigg" +0xb4fb: "dyigs" +0xb4fc: "dyin" +0xb4fd: "dyinj" +0xb4fe: "dyinh" +0xb4ff: "dyid" +/* x0b5 */ +0xb500: "dyil" +0xb501: "dyilg" +0xb502: "dyilm" +0xb503: "dyilb" +0xb504: "dyils" +0xb505: "dyilt" +0xb506: "dyilp" +0xb507: "dyilh" +0xb508: "dyim" +0xb509: "dyib" +0xb50a: "dyibs" +0xb50b: "dyis" +0xb50c: "dyiss" +0xb50d: "dying" +0xb50e: "dyij" +0xb50f: "dyic" +0xb510: "dyik" +0xb511: "dyit" +0xb512: "dyip" +0xb513: "dyih" +0xb514: "di" +0xb515: "dig" +0xb516: "digg" +0xb517: "digs" +0xb518: "din" +0xb519: "dinj" +0xb51a: "dinh" +0xb51b: "did" +0xb51c: "dil" +0xb51d: "dilg" +0xb51e: "dilm" +0xb51f: "dilb" +0xb520: "dils" +0xb521: "dilt" +0xb522: "dilp" +0xb523: "dilh" +0xb524: "dim" +0xb525: "dib" +0xb526: "dibs" +0xb527: "dis" +0xb528: "diss" +0xb529: "ding" +0xb52a: "dij" +0xb52b: "dic" +0xb52c: "dik" +0xb52d: "dit" +0xb52e: "dip" +0xb52f: "dih" +0xb530: "dda" +0xb531: "ddag" +0xb532: "ddagg" +0xb533: "ddags" +0xb534: "ddan" +0xb535: "ddanj" +0xb536: "ddanh" +0xb537: "ddad" +0xb538: "ddal" +0xb539: "ddalg" +0xb53a: "ddalm" +0xb53b: "ddalb" +0xb53c: "ddals" +0xb53d: "ddalt" +0xb53e: "ddalp" +0xb53f: "ddalh" +0xb540: "ddam" +0xb541: "ddab" +0xb542: "ddabs" +0xb543: "ddas" +0xb544: "ddass" +0xb545: "ddang" +0xb546: "ddaj" +0xb547: "ddac" +0xb548: "ddak" +0xb549: "ddat" +0xb54a: "ddap" +0xb54b: "ddah" +0xb54c: "ddae" +0xb54d: "ddaeg" +0xb54e: "ddaegg" +0xb54f: "ddaegs" +0xb550: "ddaen" +0xb551: "ddaenj" +0xb552: "ddaenh" +0xb553: "ddaed" +0xb554: "ddael" +0xb555: "ddaelg" +0xb556: "ddaelm" +0xb557: "ddaelb" +0xb558: "ddaels" +0xb559: "ddaelt" +0xb55a: "ddaelp" +0xb55b: "ddaelh" +0xb55c: "ddaem" +0xb55d: "ddaeb" +0xb55e: "ddaebs" +0xb55f: "ddaes" +0xb560: "ddaess" +0xb561: "ddaeng" +0xb562: "ddaej" +0xb563: "ddaec" +0xb564: "ddaek" +0xb565: "ddaet" +0xb566: "ddaep" +0xb567: "ddaeh" +0xb568: "ddya" +0xb569: "ddyag" +0xb56a: "ddyagg" +0xb56b: "ddyags" +0xb56c: "ddyan" +0xb56d: "ddyanj" +0xb56e: "ddyanh" +0xb56f: "ddyad" +0xb570: "ddyal" +0xb571: "ddyalg" +0xb572: "ddyalm" +0xb573: "ddyalb" +0xb574: "ddyals" +0xb575: "ddyalt" +0xb576: "ddyalp" +0xb577: "ddyalh" +0xb578: "ddyam" +0xb579: "ddyab" +0xb57a: "ddyabs" +0xb57b: "ddyas" +0xb57c: "ddyass" +0xb57d: "ddyang" +0xb57e: "ddyaj" +0xb57f: "ddyac" +0xb580: "ddyak" +0xb581: "ddyat" +0xb582: "ddyap" +0xb583: "ddyah" +0xb584: "ddyae" +0xb585: "ddyaeg" +0xb586: "ddyaegg" +0xb587: "ddyaegs" +0xb588: "ddyaen" +0xb589: "ddyaenj" +0xb58a: "ddyaenh" +0xb58b: "ddyaed" +0xb58c: "ddyael" +0xb58d: "ddyaelg" +0xb58e: "ddyaelm" +0xb58f: "ddyaelb" +0xb590: "ddyaels" +0xb591: "ddyaelt" +0xb592: "ddyaelp" +0xb593: "ddyaelh" +0xb594: "ddyaem" +0xb595: "ddyaeb" +0xb596: "ddyaebs" +0xb597: "ddyaes" +0xb598: "ddyaess" +0xb599: "ddyaeng" +0xb59a: "ddyaej" +0xb59b: "ddyaec" +0xb59c: "ddyaek" +0xb59d: "ddyaet" +0xb59e: "ddyaep" +0xb59f: "ddyaeh" +0xb5a0: "ddeo" +0xb5a1: "ddeog" +0xb5a2: "ddeogg" +0xb5a3: "ddeogs" +0xb5a4: "ddeon" +0xb5a5: "ddeonj" +0xb5a6: "ddeonh" +0xb5a7: "ddeod" +0xb5a8: "ddeol" +0xb5a9: "ddeolg" +0xb5aa: "ddeolm" +0xb5ab: "ddeolb" +0xb5ac: "ddeols" +0xb5ad: "ddeolt" +0xb5ae: "ddeolp" +0xb5af: "ddeolh" +0xb5b0: "ddeom" +0xb5b1: "ddeob" +0xb5b2: "ddeobs" +0xb5b3: "ddeos" +0xb5b4: "ddeoss" +0xb5b5: "ddeong" +0xb5b6: "ddeoj" +0xb5b7: "ddeoc" +0xb5b8: "ddeok" +0xb5b9: "ddeot" +0xb5ba: "ddeop" +0xb5bb: "ddeoh" +0xb5bc: "dde" +0xb5bd: "ddeg" +0xb5be: "ddegg" +0xb5bf: "ddegs" +0xb5c0: "dden" +0xb5c1: "ddenj" +0xb5c2: "ddenh" +0xb5c3: "dded" +0xb5c4: "ddel" +0xb5c5: "ddelg" +0xb5c6: "ddelm" +0xb5c7: "ddelb" +0xb5c8: "ddels" +0xb5c9: "ddelt" +0xb5ca: "ddelp" +0xb5cb: "ddelh" +0xb5cc: "ddem" +0xb5cd: "ddeb" +0xb5ce: "ddebs" +0xb5cf: "ddes" +0xb5d0: "ddess" +0xb5d1: "ddeng" +0xb5d2: "ddej" +0xb5d3: "ddec" +0xb5d4: "ddek" +0xb5d5: "ddet" +0xb5d6: "ddep" +0xb5d7: "ddeh" +0xb5d8: "ddyeo" +0xb5d9: "ddyeog" +0xb5da: "ddyeogg" +0xb5db: "ddyeogs" +0xb5dc: "ddyeon" +0xb5dd: "ddyeonj" +0xb5de: "ddyeonh" +0xb5df: "ddyeod" +0xb5e0: "ddyeol" +0xb5e1: "ddyeolg" +0xb5e2: "ddyeolm" +0xb5e3: "ddyeolb" +0xb5e4: "ddyeols" +0xb5e5: "ddyeolt" +0xb5e6: "ddyeolp" +0xb5e7: "ddyeolh" +0xb5e8: "ddyeom" +0xb5e9: "ddyeob" +0xb5ea: "ddyeobs" +0xb5eb: "ddyeos" +0xb5ec: "ddyeoss" +0xb5ed: "ddyeong" +0xb5ee: "ddyeoj" +0xb5ef: "ddyeoc" +0xb5f0: "ddyeok" +0xb5f1: "ddyeot" +0xb5f2: "ddyeop" +0xb5f3: "ddyeoh" +0xb5f4: "ddye" +0xb5f5: "ddyeg" +0xb5f6: "ddyegg" +0xb5f7: "ddyegs" +0xb5f8: "ddyen" +0xb5f9: "ddyenj" +0xb5fa: "ddyenh" +0xb5fb: "ddyed" +0xb5fc: "ddyel" +0xb5fd: "ddyelg" +0xb5fe: "ddyelm" +0xb5ff: "ddyelb" +/* x0b6 */ +0xb600: "ddyels" +0xb601: "ddyelt" +0xb602: "ddyelp" +0xb603: "ddyelh" +0xb604: "ddyem" +0xb605: "ddyeb" +0xb606: "ddyebs" +0xb607: "ddyes" +0xb608: "ddyess" +0xb609: "ddyeng" +0xb60a: "ddyej" +0xb60b: "ddyec" +0xb60c: "ddyek" +0xb60d: "ddyet" +0xb60e: "ddyep" +0xb60f: "ddyeh" +0xb610: "ddo" +0xb611: "ddog" +0xb612: "ddogg" +0xb613: "ddogs" +0xb614: "ddon" +0xb615: "ddonj" +0xb616: "ddonh" +0xb617: "ddod" +0xb618: "ddol" +0xb619: "ddolg" +0xb61a: "ddolm" +0xb61b: "ddolb" +0xb61c: "ddols" +0xb61d: "ddolt" +0xb61e: "ddolp" +0xb61f: "ddolh" +0xb620: "ddom" +0xb621: "ddob" +0xb622: "ddobs" +0xb623: "ddos" +0xb624: "ddoss" +0xb625: "ddong" +0xb626: "ddoj" +0xb627: "ddoc" +0xb628: "ddok" +0xb629: "ddot" +0xb62a: "ddop" +0xb62b: "ddoh" +0xb62c: "ddwa" +0xb62d: "ddwag" +0xb62e: "ddwagg" +0xb62f: "ddwags" +0xb630: "ddwan" +0xb631: "ddwanj" +0xb632: "ddwanh" +0xb633: "ddwad" +0xb634: "ddwal" +0xb635: "ddwalg" +0xb636: "ddwalm" +0xb637: "ddwalb" +0xb638: "ddwals" +0xb639: "ddwalt" +0xb63a: "ddwalp" +0xb63b: "ddwalh" +0xb63c: "ddwam" +0xb63d: "ddwab" +0xb63e: "ddwabs" +0xb63f: "ddwas" +0xb640: "ddwass" +0xb641: "ddwang" +0xb642: "ddwaj" +0xb643: "ddwac" +0xb644: "ddwak" +0xb645: "ddwat" +0xb646: "ddwap" +0xb647: "ddwah" +0xb648: "ddwae" +0xb649: "ddwaeg" +0xb64a: "ddwaegg" +0xb64b: "ddwaegs" +0xb64c: "ddwaen" +0xb64d: "ddwaenj" +0xb64e: "ddwaenh" +0xb64f: "ddwaed" +0xb650: "ddwael" +0xb651: "ddwaelg" +0xb652: "ddwaelm" +0xb653: "ddwaelb" +0xb654: "ddwaels" +0xb655: "ddwaelt" +0xb656: "ddwaelp" +0xb657: "ddwaelh" +0xb658: "ddwaem" +0xb659: "ddwaeb" +0xb65a: "ddwaebs" +0xb65b: "ddwaes" +0xb65c: "ddwaess" +0xb65d: "ddwaeng" +0xb65e: "ddwaej" +0xb65f: "ddwaec" +0xb660: "ddwaek" +0xb661: "ddwaet" +0xb662: "ddwaep" +0xb663: "ddwaeh" +0xb664: "ddoe" +0xb665: "ddoeg" +0xb666: "ddoegg" +0xb667: "ddoegs" +0xb668: "ddoen" +0xb669: "ddoenj" +0xb66a: "ddoenh" +0xb66b: "ddoed" +0xb66c: "ddoel" +0xb66d: "ddoelg" +0xb66e: "ddoelm" +0xb66f: "ddoelb" +0xb670: "ddoels" +0xb671: "ddoelt" +0xb672: "ddoelp" +0xb673: "ddoelh" +0xb674: "ddoem" +0xb675: "ddoeb" +0xb676: "ddoebs" +0xb677: "ddoes" +0xb678: "ddoess" +0xb679: "ddoeng" +0xb67a: "ddoej" +0xb67b: "ddoec" +0xb67c: "ddoek" +0xb67d: "ddoet" +0xb67e: "ddoep" +0xb67f: "ddoeh" +0xb680: "ddyo" +0xb681: "ddyog" +0xb682: "ddyogg" +0xb683: "ddyogs" +0xb684: "ddyon" +0xb685: "ddyonj" +0xb686: "ddyonh" +0xb687: "ddyod" +0xb688: "ddyol" +0xb689: "ddyolg" +0xb68a: "ddyolm" +0xb68b: "ddyolb" +0xb68c: "ddyols" +0xb68d: "ddyolt" +0xb68e: "ddyolp" +0xb68f: "ddyolh" +0xb690: "ddyom" +0xb691: "ddyob" +0xb692: "ddyobs" +0xb693: "ddyos" +0xb694: "ddyoss" +0xb695: "ddyong" +0xb696: "ddyoj" +0xb697: "ddyoc" +0xb698: "ddyok" +0xb699: "ddyot" +0xb69a: "ddyop" +0xb69b: "ddyoh" +0xb69c: "ddu" +0xb69d: "ddug" +0xb69e: "ddugg" +0xb69f: "ddugs" +0xb6a0: "ddun" +0xb6a1: "ddunj" +0xb6a2: "ddunh" +0xb6a3: "ddud" +0xb6a4: "ddul" +0xb6a5: "ddulg" +0xb6a6: "ddulm" +0xb6a7: "ddulb" +0xb6a8: "dduls" +0xb6a9: "ddult" +0xb6aa: "ddulp" +0xb6ab: "ddulh" +0xb6ac: "ddum" +0xb6ad: "ddub" +0xb6ae: "ddubs" +0xb6af: "ddus" +0xb6b0: "dduss" +0xb6b1: "ddung" +0xb6b2: "dduj" +0xb6b3: "dduc" +0xb6b4: "dduk" +0xb6b5: "ddut" +0xb6b6: "ddup" +0xb6b7: "dduh" +0xb6b8: "ddweo" +0xb6b9: "ddweog" +0xb6ba: "ddweogg" +0xb6bb: "ddweogs" +0xb6bc: "ddweon" +0xb6bd: "ddweonj" +0xb6be: "ddweonh" +0xb6bf: "ddweod" +0xb6c0: "ddweol" +0xb6c1: "ddweolg" +0xb6c2: "ddweolm" +0xb6c3: "ddweolb" +0xb6c4: "ddweols" +0xb6c5: "ddweolt" +0xb6c6: "ddweolp" +0xb6c7: "ddweolh" +0xb6c8: "ddweom" +0xb6c9: "ddweob" +0xb6ca: "ddweobs" +0xb6cb: "ddweos" +0xb6cc: "ddweoss" +0xb6cd: "ddweong" +0xb6ce: "ddweoj" +0xb6cf: "ddweoc" +0xb6d0: "ddweok" +0xb6d1: "ddweot" +0xb6d2: "ddweop" +0xb6d3: "ddweoh" +0xb6d4: "ddwe" +0xb6d5: "ddweg" +0xb6d6: "ddwegg" +0xb6d7: "ddwegs" +0xb6d8: "ddwen" +0xb6d9: "ddwenj" +0xb6da: "ddwenh" +0xb6db: "ddwed" +0xb6dc: "ddwel" +0xb6dd: "ddwelg" +0xb6de: "ddwelm" +0xb6df: "ddwelb" +0xb6e0: "ddwels" +0xb6e1: "ddwelt" +0xb6e2: "ddwelp" +0xb6e3: "ddwelh" +0xb6e4: "ddwem" +0xb6e5: "ddweb" +0xb6e6: "ddwebs" +0xb6e7: "ddwes" +0xb6e8: "ddwess" +0xb6e9: "ddweng" +0xb6ea: "ddwej" +0xb6eb: "ddwec" +0xb6ec: "ddwek" +0xb6ed: "ddwet" +0xb6ee: "ddwep" +0xb6ef: "ddweh" +0xb6f0: "ddwi" +0xb6f1: "ddwig" +0xb6f2: "ddwigg" +0xb6f3: "ddwigs" +0xb6f4: "ddwin" +0xb6f5: "ddwinj" +0xb6f6: "ddwinh" +0xb6f7: "ddwid" +0xb6f8: "ddwil" +0xb6f9: "ddwilg" +0xb6fa: "ddwilm" +0xb6fb: "ddwilb" +0xb6fc: "ddwils" +0xb6fd: "ddwilt" +0xb6fe: "ddwilp" +0xb6ff: "ddwilh" +/* x0b7 */ +0xb700: "ddwim" +0xb701: "ddwib" +0xb702: "ddwibs" +0xb703: "ddwis" +0xb704: "ddwiss" +0xb705: "ddwing" +0xb706: "ddwij" +0xb707: "ddwic" +0xb708: "ddwik" +0xb709: "ddwit" +0xb70a: "ddwip" +0xb70b: "ddwih" +0xb70c: "ddyu" +0xb70d: "ddyug" +0xb70e: "ddyugg" +0xb70f: "ddyugs" +0xb710: "ddyun" +0xb711: "ddyunj" +0xb712: "ddyunh" +0xb713: "ddyud" +0xb714: "ddyul" +0xb715: "ddyulg" +0xb716: "ddyulm" +0xb717: "ddyulb" +0xb718: "ddyuls" +0xb719: "ddyult" +0xb71a: "ddyulp" +0xb71b: "ddyulh" +0xb71c: "ddyum" +0xb71d: "ddyub" +0xb71e: "ddyubs" +0xb71f: "ddyus" +0xb720: "ddyuss" +0xb721: "ddyung" +0xb722: "ddyuj" +0xb723: "ddyuc" +0xb724: "ddyuk" +0xb725: "ddyut" +0xb726: "ddyup" +0xb727: "ddyuh" +0xb728: "ddeu" +0xb729: "ddeug" +0xb72a: "ddeugg" +0xb72b: "ddeugs" +0xb72c: "ddeun" +0xb72d: "ddeunj" +0xb72e: "ddeunh" +0xb72f: "ddeud" +0xb730: "ddeul" +0xb731: "ddeulg" +0xb732: "ddeulm" +0xb733: "ddeulb" +0xb734: "ddeuls" +0xb735: "ddeult" +0xb736: "ddeulp" +0xb737: "ddeulh" +0xb738: "ddeum" +0xb739: "ddeub" +0xb73a: "ddeubs" +0xb73b: "ddeus" +0xb73c: "ddeuss" +0xb73d: "ddeung" +0xb73e: "ddeuj" +0xb73f: "ddeuc" +0xb740: "ddeuk" +0xb741: "ddeut" +0xb742: "ddeup" +0xb743: "ddeuh" +0xb744: "ddyi" +0xb745: "ddyig" +0xb746: "ddyigg" +0xb747: "ddyigs" +0xb748: "ddyin" +0xb749: "ddyinj" +0xb74a: "ddyinh" +0xb74b: "ddyid" +0xb74c: "ddyil" +0xb74d: "ddyilg" +0xb74e: "ddyilm" +0xb74f: "ddyilb" +0xb750: "ddyils" +0xb751: "ddyilt" +0xb752: "ddyilp" +0xb753: "ddyilh" +0xb754: "ddyim" +0xb755: "ddyib" +0xb756: "ddyibs" +0xb757: "ddyis" +0xb758: "ddyiss" +0xb759: "ddying" +0xb75a: "ddyij" +0xb75b: "ddyic" +0xb75c: "ddyik" +0xb75d: "ddyit" +0xb75e: "ddyip" +0xb75f: "ddyih" +0xb760: "ddi" +0xb761: "ddig" +0xb762: "ddigg" +0xb763: "ddigs" +0xb764: "ddin" +0xb765: "ddinj" +0xb766: "ddinh" +0xb767: "ddid" +0xb768: "ddil" +0xb769: "ddilg" +0xb76a: "ddilm" +0xb76b: "ddilb" +0xb76c: "ddils" +0xb76d: "ddilt" +0xb76e: "ddilp" +0xb76f: "ddilh" +0xb770: "ddim" +0xb771: "ddib" +0xb772: "ddibs" +0xb773: "ddis" +0xb774: "ddiss" +0xb775: "dding" +0xb776: "ddij" +0xb777: "ddic" +0xb778: "ddik" +0xb779: "ddit" +0xb77a: "ddip" +0xb77b: "ddih" +0xb77c: "ra" +0xb77d: "rag" +0xb77e: "ragg" +0xb77f: "rags" +0xb780: "ran" +0xb781: "ranj" +0xb782: "ranh" +0xb783: "rad" +0xb784: "ral" +0xb785: "ralg" +0xb786: "ralm" +0xb787: "ralb" +0xb788: "rals" +0xb789: "ralt" +0xb78a: "ralp" +0xb78b: "ralh" +0xb78c: "ram" +0xb78d: "rab" +0xb78e: "rabs" +0xb78f: "ras" +0xb790: "rass" +0xb791: "rang" +0xb792: "raj" +0xb793: "rac" +0xb794: "rak" +0xb795: "rat" +0xb796: "rap" +0xb797: "rah" +0xb798: "rae" +0xb799: "raeg" +0xb79a: "raegg" +0xb79b: "raegs" +0xb79c: "raen" +0xb79d: "raenj" +0xb79e: "raenh" +0xb79f: "raed" +0xb7a0: "rael" +0xb7a1: "raelg" +0xb7a2: "raelm" +0xb7a3: "raelb" +0xb7a4: "raels" +0xb7a5: "raelt" +0xb7a6: "raelp" +0xb7a7: "raelh" +0xb7a8: "raem" +0xb7a9: "raeb" +0xb7aa: "raebs" +0xb7ab: "raes" +0xb7ac: "raess" +0xb7ad: "raeng" +0xb7ae: "raej" +0xb7af: "raec" +0xb7b0: "raek" +0xb7b1: "raet" +0xb7b2: "raep" +0xb7b3: "raeh" +0xb7b4: "rya" +0xb7b5: "ryag" +0xb7b6: "ryagg" +0xb7b7: "ryags" +0xb7b8: "ryan" +0xb7b9: "ryanj" +0xb7ba: "ryanh" +0xb7bb: "ryad" +0xb7bc: "ryal" +0xb7bd: "ryalg" +0xb7be: "ryalm" +0xb7bf: "ryalb" +0xb7c0: "ryals" +0xb7c1: "ryalt" +0xb7c2: "ryalp" +0xb7c3: "ryalh" +0xb7c4: "ryam" +0xb7c5: "ryab" +0xb7c6: "ryabs" +0xb7c7: "ryas" +0xb7c8: "ryass" +0xb7c9: "ryang" +0xb7ca: "ryaj" +0xb7cb: "ryac" +0xb7cc: "ryak" +0xb7cd: "ryat" +0xb7ce: "ryap" +0xb7cf: "ryah" +0xb7d0: "ryae" +0xb7d1: "ryaeg" +0xb7d2: "ryaegg" +0xb7d3: "ryaegs" +0xb7d4: "ryaen" +0xb7d5: "ryaenj" +0xb7d6: "ryaenh" +0xb7d7: "ryaed" +0xb7d8: "ryael" +0xb7d9: "ryaelg" +0xb7da: "ryaelm" +0xb7db: "ryaelb" +0xb7dc: "ryaels" +0xb7dd: "ryaelt" +0xb7de: "ryaelp" +0xb7df: "ryaelh" +0xb7e0: "ryaem" +0xb7e1: "ryaeb" +0xb7e2: "ryaebs" +0xb7e3: "ryaes" +0xb7e4: "ryaess" +0xb7e5: "ryaeng" +0xb7e6: "ryaej" +0xb7e7: "ryaec" +0xb7e8: "ryaek" +0xb7e9: "ryaet" +0xb7ea: "ryaep" +0xb7eb: "ryaeh" +0xb7ec: "reo" +0xb7ed: "reog" +0xb7ee: "reogg" +0xb7ef: "reogs" +0xb7f0: "reon" +0xb7f1: "reonj" +0xb7f2: "reonh" +0xb7f3: "reod" +0xb7f4: "reol" +0xb7f5: "reolg" +0xb7f6: "reolm" +0xb7f7: "reolb" +0xb7f8: "reols" +0xb7f9: "reolt" +0xb7fa: "reolp" +0xb7fb: "reolh" +0xb7fc: "reom" +0xb7fd: "reob" +0xb7fe: "reobs" +0xb7ff: "reos" +/* x0b8 */ +0xb800: "reoss" +0xb801: "reong" +0xb802: "reoj" +0xb803: "reoc" +0xb804: "reok" +0xb805: "reot" +0xb806: "reop" +0xb807: "reoh" +0xb808: "re" +0xb809: "reg" +0xb80a: "regg" +0xb80b: "regs" +0xb80c: "ren" +0xb80d: "renj" +0xb80e: "renh" +0xb80f: "red" +0xb810: "rel" +0xb811: "relg" +0xb812: "relm" +0xb813: "relb" +0xb814: "rels" +0xb815: "relt" +0xb816: "relp" +0xb817: "relh" +0xb818: "rem" +0xb819: "reb" +0xb81a: "rebs" +0xb81b: "res" +0xb81c: "ress" +0xb81d: "reng" +0xb81e: "rej" +0xb81f: "rec" +0xb820: "rek" +0xb821: "ret" +0xb822: "rep" +0xb823: "reh" +0xb824: "ryeo" +0xb825: "ryeog" +0xb826: "ryeogg" +0xb827: "ryeogs" +0xb828: "ryeon" +0xb829: "ryeonj" +0xb82a: "ryeonh" +0xb82b: "ryeod" +0xb82c: "ryeol" +0xb82d: "ryeolg" +0xb82e: "ryeolm" +0xb82f: "ryeolb" +0xb830: "ryeols" +0xb831: "ryeolt" +0xb832: "ryeolp" +0xb833: "ryeolh" +0xb834: "ryeom" +0xb835: "ryeob" +0xb836: "ryeobs" +0xb837: "ryeos" +0xb838: "ryeoss" +0xb839: "ryeong" +0xb83a: "ryeoj" +0xb83b: "ryeoc" +0xb83c: "ryeok" +0xb83d: "ryeot" +0xb83e: "ryeop" +0xb83f: "ryeoh" +0xb840: "rye" +0xb841: "ryeg" +0xb842: "ryegg" +0xb843: "ryegs" +0xb844: "ryen" +0xb845: "ryenj" +0xb846: "ryenh" +0xb847: "ryed" +0xb848: "ryel" +0xb849: "ryelg" +0xb84a: "ryelm" +0xb84b: "ryelb" +0xb84c: "ryels" +0xb84d: "ryelt" +0xb84e: "ryelp" +0xb84f: "ryelh" +0xb850: "ryem" +0xb851: "ryeb" +0xb852: "ryebs" +0xb853: "ryes" +0xb854: "ryess" +0xb855: "ryeng" +0xb856: "ryej" +0xb857: "ryec" +0xb858: "ryek" +0xb859: "ryet" +0xb85a: "ryep" +0xb85b: "ryeh" +0xb85c: "ro" +0xb85d: "rog" +0xb85e: "rogg" +0xb85f: "rogs" +0xb860: "ron" +0xb861: "ronj" +0xb862: "ronh" +0xb863: "rod" +0xb864: "rol" +0xb865: "rolg" +0xb866: "rolm" +0xb867: "rolb" +0xb868: "rols" +0xb869: "rolt" +0xb86a: "rolp" +0xb86b: "rolh" +0xb86c: "rom" +0xb86d: "rob" +0xb86e: "robs" +0xb86f: "ros" +0xb870: "ross" +0xb871: "rong" +0xb872: "roj" +0xb873: "roc" +0xb874: "rok" +0xb875: "rot" +0xb876: "rop" +0xb877: "roh" +0xb878: "rwa" +0xb879: "rwag" +0xb87a: "rwagg" +0xb87b: "rwags" +0xb87c: "rwan" +0xb87d: "rwanj" +0xb87e: "rwanh" +0xb87f: "rwad" +0xb880: "rwal" +0xb881: "rwalg" +0xb882: "rwalm" +0xb883: "rwalb" +0xb884: "rwals" +0xb885: "rwalt" +0xb886: "rwalp" +0xb887: "rwalh" +0xb888: "rwam" +0xb889: "rwab" +0xb88a: "rwabs" +0xb88b: "rwas" +0xb88c: "rwass" +0xb88d: "rwang" +0xb88e: "rwaj" +0xb88f: "rwac" +0xb890: "rwak" +0xb891: "rwat" +0xb892: "rwap" +0xb893: "rwah" +0xb894: "rwae" +0xb895: "rwaeg" +0xb896: "rwaegg" +0xb897: "rwaegs" +0xb898: "rwaen" +0xb899: "rwaenj" +0xb89a: "rwaenh" +0xb89b: "rwaed" +0xb89c: "rwael" +0xb89d: "rwaelg" +0xb89e: "rwaelm" +0xb89f: "rwaelb" +0xb8a0: "rwaels" +0xb8a1: "rwaelt" +0xb8a2: "rwaelp" +0xb8a3: "rwaelh" +0xb8a4: "rwaem" +0xb8a5: "rwaeb" +0xb8a6: "rwaebs" +0xb8a7: "rwaes" +0xb8a8: "rwaess" +0xb8a9: "rwaeng" +0xb8aa: "rwaej" +0xb8ab: "rwaec" +0xb8ac: "rwaek" +0xb8ad: "rwaet" +0xb8ae: "rwaep" +0xb8af: "rwaeh" +0xb8b0: "roe" +0xb8b1: "roeg" +0xb8b2: "roegg" +0xb8b3: "roegs" +0xb8b4: "roen" +0xb8b5: "roenj" +0xb8b6: "roenh" +0xb8b7: "roed" +0xb8b8: "roel" +0xb8b9: "roelg" +0xb8ba: "roelm" +0xb8bb: "roelb" +0xb8bc: "roels" +0xb8bd: "roelt" +0xb8be: "roelp" +0xb8bf: "roelh" +0xb8c0: "roem" +0xb8c1: "roeb" +0xb8c2: "roebs" +0xb8c3: "roes" +0xb8c4: "roess" +0xb8c5: "roeng" +0xb8c6: "roej" +0xb8c7: "roec" +0xb8c8: "roek" +0xb8c9: "roet" +0xb8ca: "roep" +0xb8cb: "roeh" +0xb8cc: "ryo" +0xb8cd: "ryog" +0xb8ce: "ryogg" +0xb8cf: "ryogs" +0xb8d0: "ryon" +0xb8d1: "ryonj" +0xb8d2: "ryonh" +0xb8d3: "ryod" +0xb8d4: "ryol" +0xb8d5: "ryolg" +0xb8d6: "ryolm" +0xb8d7: "ryolb" +0xb8d8: "ryols" +0xb8d9: "ryolt" +0xb8da: "ryolp" +0xb8db: "ryolh" +0xb8dc: "ryom" +0xb8dd: "ryob" +0xb8de: "ryobs" +0xb8df: "ryos" +0xb8e0: "ryoss" +0xb8e1: "ryong" +0xb8e2: "ryoj" +0xb8e3: "ryoc" +0xb8e4: "ryok" +0xb8e5: "ryot" +0xb8e6: "ryop" +0xb8e7: "ryoh" +0xb8e8: "ru" +0xb8e9: "rug" +0xb8ea: "rugg" +0xb8eb: "rugs" +0xb8ec: "run" +0xb8ed: "runj" +0xb8ee: "runh" +0xb8ef: "rud" +0xb8f0: "rul" +0xb8f1: "rulg" +0xb8f2: "rulm" +0xb8f3: "rulb" +0xb8f4: "ruls" +0xb8f5: "rult" +0xb8f6: "rulp" +0xb8f7: "rulh" +0xb8f8: "rum" +0xb8f9: "rub" +0xb8fa: "rubs" +0xb8fb: "rus" +0xb8fc: "russ" +0xb8fd: "rung" +0xb8fe: "ruj" +0xb8ff: "ruc" +/* x0b9 */ +0xb900: "ruk" +0xb901: "rut" +0xb902: "rup" +0xb903: "ruh" +0xb904: "rweo" +0xb905: "rweog" +0xb906: "rweogg" +0xb907: "rweogs" +0xb908: "rweon" +0xb909: "rweonj" +0xb90a: "rweonh" +0xb90b: "rweod" +0xb90c: "rweol" +0xb90d: "rweolg" +0xb90e: "rweolm" +0xb90f: "rweolb" +0xb910: "rweols" +0xb911: "rweolt" +0xb912: "rweolp" +0xb913: "rweolh" +0xb914: "rweom" +0xb915: "rweob" +0xb916: "rweobs" +0xb917: "rweos" +0xb918: "rweoss" +0xb919: "rweong" +0xb91a: "rweoj" +0xb91b: "rweoc" +0xb91c: "rweok" +0xb91d: "rweot" +0xb91e: "rweop" +0xb91f: "rweoh" +0xb920: "rwe" +0xb921: "rweg" +0xb922: "rwegg" +0xb923: "rwegs" +0xb924: "rwen" +0xb925: "rwenj" +0xb926: "rwenh" +0xb927: "rwed" +0xb928: "rwel" +0xb929: "rwelg" +0xb92a: "rwelm" +0xb92b: "rwelb" +0xb92c: "rwels" +0xb92d: "rwelt" +0xb92e: "rwelp" +0xb92f: "rwelh" +0xb930: "rwem" +0xb931: "rweb" +0xb932: "rwebs" +0xb933: "rwes" +0xb934: "rwess" +0xb935: "rweng" +0xb936: "rwej" +0xb937: "rwec" +0xb938: "rwek" +0xb939: "rwet" +0xb93a: "rwep" +0xb93b: "rweh" +0xb93c: "rwi" +0xb93d: "rwig" +0xb93e: "rwigg" +0xb93f: "rwigs" +0xb940: "rwin" +0xb941: "rwinj" +0xb942: "rwinh" +0xb943: "rwid" +0xb944: "rwil" +0xb945: "rwilg" +0xb946: "rwilm" +0xb947: "rwilb" +0xb948: "rwils" +0xb949: "rwilt" +0xb94a: "rwilp" +0xb94b: "rwilh" +0xb94c: "rwim" +0xb94d: "rwib" +0xb94e: "rwibs" +0xb94f: "rwis" +0xb950: "rwiss" +0xb951: "rwing" +0xb952: "rwij" +0xb953: "rwic" +0xb954: "rwik" +0xb955: "rwit" +0xb956: "rwip" +0xb957: "rwih" +0xb958: "ryu" +0xb959: "ryug" +0xb95a: "ryugg" +0xb95b: "ryugs" +0xb95c: "ryun" +0xb95d: "ryunj" +0xb95e: "ryunh" +0xb95f: "ryud" +0xb960: "ryul" +0xb961: "ryulg" +0xb962: "ryulm" +0xb963: "ryulb" +0xb964: "ryuls" +0xb965: "ryult" +0xb966: "ryulp" +0xb967: "ryulh" +0xb968: "ryum" +0xb969: "ryub" +0xb96a: "ryubs" +0xb96b: "ryus" +0xb96c: "ryuss" +0xb96d: "ryung" +0xb96e: "ryuj" +0xb96f: "ryuc" +0xb970: "ryuk" +0xb971: "ryut" +0xb972: "ryup" +0xb973: "ryuh" +0xb974: "reu" +0xb975: "reug" +0xb976: "reugg" +0xb977: "reugs" +0xb978: "reun" +0xb979: "reunj" +0xb97a: "reunh" +0xb97b: "reud" +0xb97c: "reul" +0xb97d: "reulg" +0xb97e: "reulm" +0xb97f: "reulb" +0xb980: "reuls" +0xb981: "reult" +0xb982: "reulp" +0xb983: "reulh" +0xb984: "reum" +0xb985: "reub" +0xb986: "reubs" +0xb987: "reus" +0xb988: "reuss" +0xb989: "reung" +0xb98a: "reuj" +0xb98b: "reuc" +0xb98c: "reuk" +0xb98d: "reut" +0xb98e: "reup" +0xb98f: "reuh" +0xb990: "ryi" +0xb991: "ryig" +0xb992: "ryigg" +0xb993: "ryigs" +0xb994: "ryin" +0xb995: "ryinj" +0xb996: "ryinh" +0xb997: "ryid" +0xb998: "ryil" +0xb999: "ryilg" +0xb99a: "ryilm" +0xb99b: "ryilb" +0xb99c: "ryils" +0xb99d: "ryilt" +0xb99e: "ryilp" +0xb99f: "ryilh" +0xb9a0: "ryim" +0xb9a1: "ryib" +0xb9a2: "ryibs" +0xb9a3: "ryis" +0xb9a4: "ryiss" +0xb9a5: "rying" +0xb9a6: "ryij" +0xb9a7: "ryic" +0xb9a8: "ryik" +0xb9a9: "ryit" +0xb9aa: "ryip" +0xb9ab: "ryih" +0xb9ac: "ri" +0xb9ad: "rig" +0xb9ae: "rigg" +0xb9af: "rigs" +0xb9b0: "rin" +0xb9b1: "rinj" +0xb9b2: "rinh" +0xb9b3: "rid" +0xb9b4: "ril" +0xb9b5: "rilg" +0xb9b6: "rilm" +0xb9b7: "rilb" +0xb9b8: "rils" +0xb9b9: "rilt" +0xb9ba: "rilp" +0xb9bb: "rilh" +0xb9bc: "rim" +0xb9bd: "rib" +0xb9be: "ribs" +0xb9bf: "ris" +0xb9c0: "riss" +0xb9c1: "ring" +0xb9c2: "rij" +0xb9c3: "ric" +0xb9c4: "rik" +0xb9c5: "rit" +0xb9c6: "rip" +0xb9c7: "rih" +0xb9c8: "ma" +0xb9c9: "mag" +0xb9ca: "magg" +0xb9cb: "mags" +0xb9cc: "man" +0xb9cd: "manj" +0xb9ce: "manh" +0xb9cf: "mad" +0xb9d0: "mal" +0xb9d1: "malg" +0xb9d2: "malm" +0xb9d3: "malb" +0xb9d4: "mals" +0xb9d5: "malt" +0xb9d6: "malp" +0xb9d7: "malh" +0xb9d8: "mam" +0xb9d9: "mab" +0xb9da: "mabs" +0xb9db: "mas" +0xb9dc: "mass" +0xb9dd: "mang" +0xb9de: "maj" +0xb9df: "mac" +0xb9e0: "mak" +0xb9e1: "mat" +0xb9e2: "map" +0xb9e3: "mah" +0xb9e4: "mae" +0xb9e5: "maeg" +0xb9e6: "maegg" +0xb9e7: "maegs" +0xb9e8: "maen" +0xb9e9: "maenj" +0xb9ea: "maenh" +0xb9eb: "maed" +0xb9ec: "mael" +0xb9ed: "maelg" +0xb9ee: "maelm" +0xb9ef: "maelb" +0xb9f0: "maels" +0xb9f1: "maelt" +0xb9f2: "maelp" +0xb9f3: "maelh" +0xb9f4: "maem" +0xb9f5: "maeb" +0xb9f6: "maebs" +0xb9f7: "maes" +0xb9f8: "maess" +0xb9f9: "maeng" +0xb9fa: "maej" +0xb9fb: "maec" +0xb9fc: "maek" +0xb9fd: "maet" +0xb9fe: "maep" +0xb9ff: "maeh" +/* x0ba */ +0xba00: "mya" +0xba01: "myag" +0xba02: "myagg" +0xba03: "myags" +0xba04: "myan" +0xba05: "myanj" +0xba06: "myanh" +0xba07: "myad" +0xba08: "myal" +0xba09: "myalg" +0xba0a: "myalm" +0xba0b: "myalb" +0xba0c: "myals" +0xba0d: "myalt" +0xba0e: "myalp" +0xba0f: "myalh" +0xba10: "myam" +0xba11: "myab" +0xba12: "myabs" +0xba13: "myas" +0xba14: "myass" +0xba15: "myang" +0xba16: "myaj" +0xba17: "myac" +0xba18: "myak" +0xba19: "myat" +0xba1a: "myap" +0xba1b: "myah" +0xba1c: "myae" +0xba1d: "myaeg" +0xba1e: "myaegg" +0xba1f: "myaegs" +0xba20: "myaen" +0xba21: "myaenj" +0xba22: "myaenh" +0xba23: "myaed" +0xba24: "myael" +0xba25: "myaelg" +0xba26: "myaelm" +0xba27: "myaelb" +0xba28: "myaels" +0xba29: "myaelt" +0xba2a: "myaelp" +0xba2b: "myaelh" +0xba2c: "myaem" +0xba2d: "myaeb" +0xba2e: "myaebs" +0xba2f: "myaes" +0xba30: "myaess" +0xba31: "myaeng" +0xba32: "myaej" +0xba33: "myaec" +0xba34: "myaek" +0xba35: "myaet" +0xba36: "myaep" +0xba37: "myaeh" +0xba38: "meo" +0xba39: "meog" +0xba3a: "meogg" +0xba3b: "meogs" +0xba3c: "meon" +0xba3d: "meonj" +0xba3e: "meonh" +0xba3f: "meod" +0xba40: "meol" +0xba41: "meolg" +0xba42: "meolm" +0xba43: "meolb" +0xba44: "meols" +0xba45: "meolt" +0xba46: "meolp" +0xba47: "meolh" +0xba48: "meom" +0xba49: "meob" +0xba4a: "meobs" +0xba4b: "meos" +0xba4c: "meoss" +0xba4d: "meong" +0xba4e: "meoj" +0xba4f: "meoc" +0xba50: "meok" +0xba51: "meot" +0xba52: "meop" +0xba53: "meoh" +0xba54: "me" +0xba55: "meg" +0xba56: "megg" +0xba57: "megs" +0xba58: "men" +0xba59: "menj" +0xba5a: "menh" +0xba5b: "med" +0xba5c: "mel" +0xba5d: "melg" +0xba5e: "melm" +0xba5f: "melb" +0xba60: "mels" +0xba61: "melt" +0xba62: "melp" +0xba63: "melh" +0xba64: "mem" +0xba65: "meb" +0xba66: "mebs" +0xba67: "mes" +0xba68: "mess" +0xba69: "meng" +0xba6a: "mej" +0xba6b: "mec" +0xba6c: "mek" +0xba6d: "met" +0xba6e: "mep" +0xba6f: "meh" +0xba70: "myeo" +0xba71: "myeog" +0xba72: "myeogg" +0xba73: "myeogs" +0xba74: "myeon" +0xba75: "myeonj" +0xba76: "myeonh" +0xba77: "myeod" +0xba78: "myeol" +0xba79: "myeolg" +0xba7a: "myeolm" +0xba7b: "myeolb" +0xba7c: "myeols" +0xba7d: "myeolt" +0xba7e: "myeolp" +0xba7f: "myeolh" +0xba80: "myeom" +0xba81: "myeob" +0xba82: "myeobs" +0xba83: "myeos" +0xba84: "myeoss" +0xba85: "myeong" +0xba86: "myeoj" +0xba87: "myeoc" +0xba88: "myeok" +0xba89: "myeot" +0xba8a: "myeop" +0xba8b: "myeoh" +0xba8c: "mye" +0xba8d: "myeg" +0xba8e: "myegg" +0xba8f: "myegs" +0xba90: "myen" +0xba91: "myenj" +0xba92: "myenh" +0xba93: "myed" +0xba94: "myel" +0xba95: "myelg" +0xba96: "myelm" +0xba97: "myelb" +0xba98: "myels" +0xba99: "myelt" +0xba9a: "myelp" +0xba9b: "myelh" +0xba9c: "myem" +0xba9d: "myeb" +0xba9e: "myebs" +0xba9f: "myes" +0xbaa0: "myess" +0xbaa1: "myeng" +0xbaa2: "myej" +0xbaa3: "myec" +0xbaa4: "myek" +0xbaa5: "myet" +0xbaa6: "myep" +0xbaa7: "myeh" +0xbaa8: "mo" +0xbaa9: "mog" +0xbaaa: "mogg" +0xbaab: "mogs" +0xbaac: "mon" +0xbaad: "monj" +0xbaae: "monh" +0xbaaf: "mod" +0xbab0: "mol" +0xbab1: "molg" +0xbab2: "molm" +0xbab3: "molb" +0xbab4: "mols" +0xbab5: "molt" +0xbab6: "molp" +0xbab7: "molh" +0xbab8: "mom" +0xbab9: "mob" +0xbaba: "mobs" +0xbabb: "mos" +0xbabc: "moss" +0xbabd: "mong" +0xbabe: "moj" +0xbabf: "moc" +0xbac0: "mok" +0xbac1: "mot" +0xbac2: "mop" +0xbac3: "moh" +0xbac4: "mwa" +0xbac5: "mwag" +0xbac6: "mwagg" +0xbac7: "mwags" +0xbac8: "mwan" +0xbac9: "mwanj" +0xbaca: "mwanh" +0xbacb: "mwad" +0xbacc: "mwal" +0xbacd: "mwalg" +0xbace: "mwalm" +0xbacf: "mwalb" +0xbad0: "mwals" +0xbad1: "mwalt" +0xbad2: "mwalp" +0xbad3: "mwalh" +0xbad4: "mwam" +0xbad5: "mwab" +0xbad6: "mwabs" +0xbad7: "mwas" +0xbad8: "mwass" +0xbad9: "mwang" +0xbada: "mwaj" +0xbadb: "mwac" +0xbadc: "mwak" +0xbadd: "mwat" +0xbade: "mwap" +0xbadf: "mwah" +0xbae0: "mwae" +0xbae1: "mwaeg" +0xbae2: "mwaegg" +0xbae3: "mwaegs" +0xbae4: "mwaen" +0xbae5: "mwaenj" +0xbae6: "mwaenh" +0xbae7: "mwaed" +0xbae8: "mwael" +0xbae9: "mwaelg" +0xbaea: "mwaelm" +0xbaeb: "mwaelb" +0xbaec: "mwaels" +0xbaed: "mwaelt" +0xbaee: "mwaelp" +0xbaef: "mwaelh" +0xbaf0: "mwaem" +0xbaf1: "mwaeb" +0xbaf2: "mwaebs" +0xbaf3: "mwaes" +0xbaf4: "mwaess" +0xbaf5: "mwaeng" +0xbaf6: "mwaej" +0xbaf7: "mwaec" +0xbaf8: "mwaek" +0xbaf9: "mwaet" +0xbafa: "mwaep" +0xbafb: "mwaeh" +0xbafc: "moe" +0xbafd: "moeg" +0xbafe: "moegg" +0xbaff: "moegs" +/* x0bb */ +0xbb00: "moen" +0xbb01: "moenj" +0xbb02: "moenh" +0xbb03: "moed" +0xbb04: "moel" +0xbb05: "moelg" +0xbb06: "moelm" +0xbb07: "moelb" +0xbb08: "moels" +0xbb09: "moelt" +0xbb0a: "moelp" +0xbb0b: "moelh" +0xbb0c: "moem" +0xbb0d: "moeb" +0xbb0e: "moebs" +0xbb0f: "moes" +0xbb10: "moess" +0xbb11: "moeng" +0xbb12: "moej" +0xbb13: "moec" +0xbb14: "moek" +0xbb15: "moet" +0xbb16: "moep" +0xbb17: "moeh" +0xbb18: "myo" +0xbb19: "myog" +0xbb1a: "myogg" +0xbb1b: "myogs" +0xbb1c: "myon" +0xbb1d: "myonj" +0xbb1e: "myonh" +0xbb1f: "myod" +0xbb20: "myol" +0xbb21: "myolg" +0xbb22: "myolm" +0xbb23: "myolb" +0xbb24: "myols" +0xbb25: "myolt" +0xbb26: "myolp" +0xbb27: "myolh" +0xbb28: "myom" +0xbb29: "myob" +0xbb2a: "myobs" +0xbb2b: "myos" +0xbb2c: "myoss" +0xbb2d: "myong" +0xbb2e: "myoj" +0xbb2f: "myoc" +0xbb30: "myok" +0xbb31: "myot" +0xbb32: "myop" +0xbb33: "myoh" +0xbb34: "mu" +0xbb35: "mug" +0xbb36: "mugg" +0xbb37: "mugs" +0xbb38: "mun" +0xbb39: "munj" +0xbb3a: "munh" +0xbb3b: "mud" +0xbb3c: "mul" +0xbb3d: "mulg" +0xbb3e: "mulm" +0xbb3f: "mulb" +0xbb40: "muls" +0xbb41: "mult" +0xbb42: "mulp" +0xbb43: "mulh" +0xbb44: "mum" +0xbb45: "mub" +0xbb46: "mubs" +0xbb47: "mus" +0xbb48: "muss" +0xbb49: "mung" +0xbb4a: "muj" +0xbb4b: "muc" +0xbb4c: "muk" +0xbb4d: "mut" +0xbb4e: "mup" +0xbb4f: "muh" +0xbb50: "mweo" +0xbb51: "mweog" +0xbb52: "mweogg" +0xbb53: "mweogs" +0xbb54: "mweon" +0xbb55: "mweonj" +0xbb56: "mweonh" +0xbb57: "mweod" +0xbb58: "mweol" +0xbb59: "mweolg" +0xbb5a: "mweolm" +0xbb5b: "mweolb" +0xbb5c: "mweols" +0xbb5d: "mweolt" +0xbb5e: "mweolp" +0xbb5f: "mweolh" +0xbb60: "mweom" +0xbb61: "mweob" +0xbb62: "mweobs" +0xbb63: "mweos" +0xbb64: "mweoss" +0xbb65: "mweong" +0xbb66: "mweoj" +0xbb67: "mweoc" +0xbb68: "mweok" +0xbb69: "mweot" +0xbb6a: "mweop" +0xbb6b: "mweoh" +0xbb6c: "mwe" +0xbb6d: "mweg" +0xbb6e: "mwegg" +0xbb6f: "mwegs" +0xbb70: "mwen" +0xbb71: "mwenj" +0xbb72: "mwenh" +0xbb73: "mwed" +0xbb74: "mwel" +0xbb75: "mwelg" +0xbb76: "mwelm" +0xbb77: "mwelb" +0xbb78: "mwels" +0xbb79: "mwelt" +0xbb7a: "mwelp" +0xbb7b: "mwelh" +0xbb7c: "mwem" +0xbb7d: "mweb" +0xbb7e: "mwebs" +0xbb7f: "mwes" +0xbb80: "mwess" +0xbb81: "mweng" +0xbb82: "mwej" +0xbb83: "mwec" +0xbb84: "mwek" +0xbb85: "mwet" +0xbb86: "mwep" +0xbb87: "mweh" +0xbb88: "mwi" +0xbb89: "mwig" +0xbb8a: "mwigg" +0xbb8b: "mwigs" +0xbb8c: "mwin" +0xbb8d: "mwinj" +0xbb8e: "mwinh" +0xbb8f: "mwid" +0xbb90: "mwil" +0xbb91: "mwilg" +0xbb92: "mwilm" +0xbb93: "mwilb" +0xbb94: "mwils" +0xbb95: "mwilt" +0xbb96: "mwilp" +0xbb97: "mwilh" +0xbb98: "mwim" +0xbb99: "mwib" +0xbb9a: "mwibs" +0xbb9b: "mwis" +0xbb9c: "mwiss" +0xbb9d: "mwing" +0xbb9e: "mwij" +0xbb9f: "mwic" +0xbba0: "mwik" +0xbba1: "mwit" +0xbba2: "mwip" +0xbba3: "mwih" +0xbba4: "myu" +0xbba5: "myug" +0xbba6: "myugg" +0xbba7: "myugs" +0xbba8: "myun" +0xbba9: "myunj" +0xbbaa: "myunh" +0xbbab: "myud" +0xbbac: "myul" +0xbbad: "myulg" +0xbbae: "myulm" +0xbbaf: "myulb" +0xbbb0: "myuls" +0xbbb1: "myult" +0xbbb2: "myulp" +0xbbb3: "myulh" +0xbbb4: "myum" +0xbbb5: "myub" +0xbbb6: "myubs" +0xbbb7: "myus" +0xbbb8: "myuss" +0xbbb9: "myung" +0xbbba: "myuj" +0xbbbb: "myuc" +0xbbbc: "myuk" +0xbbbd: "myut" +0xbbbe: "myup" +0xbbbf: "myuh" +0xbbc0: "meu" +0xbbc1: "meug" +0xbbc2: "meugg" +0xbbc3: "meugs" +0xbbc4: "meun" +0xbbc5: "meunj" +0xbbc6: "meunh" +0xbbc7: "meud" +0xbbc8: "meul" +0xbbc9: "meulg" +0xbbca: "meulm" +0xbbcb: "meulb" +0xbbcc: "meuls" +0xbbcd: "meult" +0xbbce: "meulp" +0xbbcf: "meulh" +0xbbd0: "meum" +0xbbd1: "meub" +0xbbd2: "meubs" +0xbbd3: "meus" +0xbbd4: "meuss" +0xbbd5: "meung" +0xbbd6: "meuj" +0xbbd7: "meuc" +0xbbd8: "meuk" +0xbbd9: "meut" +0xbbda: "meup" +0xbbdb: "meuh" +0xbbdc: "myi" +0xbbdd: "myig" +0xbbde: "myigg" +0xbbdf: "myigs" +0xbbe0: "myin" +0xbbe1: "myinj" +0xbbe2: "myinh" +0xbbe3: "myid" +0xbbe4: "myil" +0xbbe5: "myilg" +0xbbe6: "myilm" +0xbbe7: "myilb" +0xbbe8: "myils" +0xbbe9: "myilt" +0xbbea: "myilp" +0xbbeb: "myilh" +0xbbec: "myim" +0xbbed: "myib" +0xbbee: "myibs" +0xbbef: "myis" +0xbbf0: "myiss" +0xbbf1: "mying" +0xbbf2: "myij" +0xbbf3: "myic" +0xbbf4: "myik" +0xbbf5: "myit" +0xbbf6: "myip" +0xbbf7: "myih" +0xbbf8: "mi" +0xbbf9: "mig" +0xbbfa: "migg" +0xbbfb: "migs" +0xbbfc: "min" +0xbbfd: "minj" +0xbbfe: "minh" +0xbbff: "mid" +/* x0bc */ +0xbc00: "mil" +0xbc01: "milg" +0xbc02: "milm" +0xbc03: "milb" +0xbc04: "mils" +0xbc05: "milt" +0xbc06: "milp" +0xbc07: "milh" +0xbc08: "mim" +0xbc09: "mib" +0xbc0a: "mibs" +0xbc0b: "mis" +0xbc0c: "miss" +0xbc0d: "ming" +0xbc0e: "mij" +0xbc0f: "mic" +0xbc10: "mik" +0xbc11: "mit" +0xbc12: "mip" +0xbc13: "mih" +0xbc14: "ba" +0xbc15: "bag" +0xbc16: "bagg" +0xbc17: "bags" +0xbc18: "ban" +0xbc19: "banj" +0xbc1a: "banh" +0xbc1b: "bad" +0xbc1c: "bal" +0xbc1d: "balg" +0xbc1e: "balm" +0xbc1f: "balb" +0xbc20: "bals" +0xbc21: "balt" +0xbc22: "balp" +0xbc23: "balh" +0xbc24: "bam" +0xbc25: "bab" +0xbc26: "babs" +0xbc27: "bas" +0xbc28: "bass" +0xbc29: "bang" +0xbc2a: "baj" +0xbc2b: "bac" +0xbc2c: "bak" +0xbc2d: "bat" +0xbc2e: "bap" +0xbc2f: "bah" +0xbc30: "bae" +0xbc31: "baeg" +0xbc32: "baegg" +0xbc33: "baegs" +0xbc34: "baen" +0xbc35: "baenj" +0xbc36: "baenh" +0xbc37: "baed" +0xbc38: "bael" +0xbc39: "baelg" +0xbc3a: "baelm" +0xbc3b: "baelb" +0xbc3c: "baels" +0xbc3d: "baelt" +0xbc3e: "baelp" +0xbc3f: "baelh" +0xbc40: "baem" +0xbc41: "baeb" +0xbc42: "baebs" +0xbc43: "baes" +0xbc44: "baess" +0xbc45: "baeng" +0xbc46: "baej" +0xbc47: "baec" +0xbc48: "baek" +0xbc49: "baet" +0xbc4a: "baep" +0xbc4b: "baeh" +0xbc4c: "bya" +0xbc4d: "byag" +0xbc4e: "byagg" +0xbc4f: "byags" +0xbc50: "byan" +0xbc51: "byanj" +0xbc52: "byanh" +0xbc53: "byad" +0xbc54: "byal" +0xbc55: "byalg" +0xbc56: "byalm" +0xbc57: "byalb" +0xbc58: "byals" +0xbc59: "byalt" +0xbc5a: "byalp" +0xbc5b: "byalh" +0xbc5c: "byam" +0xbc5d: "byab" +0xbc5e: "byabs" +0xbc5f: "byas" +0xbc60: "byass" +0xbc61: "byang" +0xbc62: "byaj" +0xbc63: "byac" +0xbc64: "byak" +0xbc65: "byat" +0xbc66: "byap" +0xbc67: "byah" +0xbc68: "byae" +0xbc69: "byaeg" +0xbc6a: "byaegg" +0xbc6b: "byaegs" +0xbc6c: "byaen" +0xbc6d: "byaenj" +0xbc6e: "byaenh" +0xbc6f: "byaed" +0xbc70: "byael" +0xbc71: "byaelg" +0xbc72: "byaelm" +0xbc73: "byaelb" +0xbc74: "byaels" +0xbc75: "byaelt" +0xbc76: "byaelp" +0xbc77: "byaelh" +0xbc78: "byaem" +0xbc79: "byaeb" +0xbc7a: "byaebs" +0xbc7b: "byaes" +0xbc7c: "byaess" +0xbc7d: "byaeng" +0xbc7e: "byaej" +0xbc7f: "byaec" +0xbc80: "byaek" +0xbc81: "byaet" +0xbc82: "byaep" +0xbc83: "byaeh" +0xbc84: "beo" +0xbc85: "beog" +0xbc86: "beogg" +0xbc87: "beogs" +0xbc88: "beon" +0xbc89: "beonj" +0xbc8a: "beonh" +0xbc8b: "beod" +0xbc8c: "beol" +0xbc8d: "beolg" +0xbc8e: "beolm" +0xbc8f: "beolb" +0xbc90: "beols" +0xbc91: "beolt" +0xbc92: "beolp" +0xbc93: "beolh" +0xbc94: "beom" +0xbc95: "beob" +0xbc96: "beobs" +0xbc97: "beos" +0xbc98: "beoss" +0xbc99: "beong" +0xbc9a: "beoj" +0xbc9b: "beoc" +0xbc9c: "beok" +0xbc9d: "beot" +0xbc9e: "beop" +0xbc9f: "beoh" +0xbca0: "be" +0xbca1: "beg" +0xbca2: "begg" +0xbca3: "begs" +0xbca4: "ben" +0xbca5: "benj" +0xbca6: "benh" +0xbca7: "bed" +0xbca8: "bel" +0xbca9: "belg" +0xbcaa: "belm" +0xbcab: "belb" +0xbcac: "bels" +0xbcad: "belt" +0xbcae: "belp" +0xbcaf: "belh" +0xbcb0: "bem" +0xbcb1: "beb" +0xbcb2: "bebs" +0xbcb3: "bes" +0xbcb4: "bess" +0xbcb5: "beng" +0xbcb6: "bej" +0xbcb7: "bec" +0xbcb8: "bek" +0xbcb9: "bet" +0xbcba: "bep" +0xbcbb: "beh" +0xbcbc: "byeo" +0xbcbd: "byeog" +0xbcbe: "byeogg" +0xbcbf: "byeogs" +0xbcc0: "byeon" +0xbcc1: "byeonj" +0xbcc2: "byeonh" +0xbcc3: "byeod" +0xbcc4: "byeol" +0xbcc5: "byeolg" +0xbcc6: "byeolm" +0xbcc7: "byeolb" +0xbcc8: "byeols" +0xbcc9: "byeolt" +0xbcca: "byeolp" +0xbccb: "byeolh" +0xbccc: "byeom" +0xbccd: "byeob" +0xbcce: "byeobs" +0xbccf: "byeos" +0xbcd0: "byeoss" +0xbcd1: "byeong" +0xbcd2: "byeoj" +0xbcd3: "byeoc" +0xbcd4: "byeok" +0xbcd5: "byeot" +0xbcd6: "byeop" +0xbcd7: "byeoh" +0xbcd8: "bye" +0xbcd9: "byeg" +0xbcda: "byegg" +0xbcdb: "byegs" +0xbcdc: "byen" +0xbcdd: "byenj" +0xbcde: "byenh" +0xbcdf: "byed" +0xbce0: "byel" +0xbce1: "byelg" +0xbce2: "byelm" +0xbce3: "byelb" +0xbce4: "byels" +0xbce5: "byelt" +0xbce6: "byelp" +0xbce7: "byelh" +0xbce8: "byem" +0xbce9: "byeb" +0xbcea: "byebs" +0xbceb: "byes" +0xbcec: "byess" +0xbced: "byeng" +0xbcee: "byej" +0xbcef: "byec" +0xbcf0: "byek" +0xbcf1: "byet" +0xbcf2: "byep" +0xbcf3: "byeh" +0xbcf4: "bo" +0xbcf5: "bog" +0xbcf6: "bogg" +0xbcf7: "bogs" +0xbcf8: "bon" +0xbcf9: "bonj" +0xbcfa: "bonh" +0xbcfb: "bod" +0xbcfc: "bol" +0xbcfd: "bolg" +0xbcfe: "bolm" +0xbcff: "bolb" +/* x0bd */ +0xbd00: "bols" +0xbd01: "bolt" +0xbd02: "bolp" +0xbd03: "bolh" +0xbd04: "bom" +0xbd05: "bob" +0xbd06: "bobs" +0xbd07: "bos" +0xbd08: "boss" +0xbd09: "bong" +0xbd0a: "boj" +0xbd0b: "boc" +0xbd0c: "bok" +0xbd0d: "bot" +0xbd0e: "bop" +0xbd0f: "boh" +0xbd10: "bwa" +0xbd11: "bwag" +0xbd12: "bwagg" +0xbd13: "bwags" +0xbd14: "bwan" +0xbd15: "bwanj" +0xbd16: "bwanh" +0xbd17: "bwad" +0xbd18: "bwal" +0xbd19: "bwalg" +0xbd1a: "bwalm" +0xbd1b: "bwalb" +0xbd1c: "bwals" +0xbd1d: "bwalt" +0xbd1e: "bwalp" +0xbd1f: "bwalh" +0xbd20: "bwam" +0xbd21: "bwab" +0xbd22: "bwabs" +0xbd23: "bwas" +0xbd24: "bwass" +0xbd25: "bwang" +0xbd26: "bwaj" +0xbd27: "bwac" +0xbd28: "bwak" +0xbd29: "bwat" +0xbd2a: "bwap" +0xbd2b: "bwah" +0xbd2c: "bwae" +0xbd2d: "bwaeg" +0xbd2e: "bwaegg" +0xbd2f: "bwaegs" +0xbd30: "bwaen" +0xbd31: "bwaenj" +0xbd32: "bwaenh" +0xbd33: "bwaed" +0xbd34: "bwael" +0xbd35: "bwaelg" +0xbd36: "bwaelm" +0xbd37: "bwaelb" +0xbd38: "bwaels" +0xbd39: "bwaelt" +0xbd3a: "bwaelp" +0xbd3b: "bwaelh" +0xbd3c: "bwaem" +0xbd3d: "bwaeb" +0xbd3e: "bwaebs" +0xbd3f: "bwaes" +0xbd40: "bwaess" +0xbd41: "bwaeng" +0xbd42: "bwaej" +0xbd43: "bwaec" +0xbd44: "bwaek" +0xbd45: "bwaet" +0xbd46: "bwaep" +0xbd47: "bwaeh" +0xbd48: "boe" +0xbd49: "boeg" +0xbd4a: "boegg" +0xbd4b: "boegs" +0xbd4c: "boen" +0xbd4d: "boenj" +0xbd4e: "boenh" +0xbd4f: "boed" +0xbd50: "boel" +0xbd51: "boelg" +0xbd52: "boelm" +0xbd53: "boelb" +0xbd54: "boels" +0xbd55: "boelt" +0xbd56: "boelp" +0xbd57: "boelh" +0xbd58: "boem" +0xbd59: "boeb" +0xbd5a: "boebs" +0xbd5b: "boes" +0xbd5c: "boess" +0xbd5d: "boeng" +0xbd5e: "boej" +0xbd5f: "boec" +0xbd60: "boek" +0xbd61: "boet" +0xbd62: "boep" +0xbd63: "boeh" +0xbd64: "byo" +0xbd65: "byog" +0xbd66: "byogg" +0xbd67: "byogs" +0xbd68: "byon" +0xbd69: "byonj" +0xbd6a: "byonh" +0xbd6b: "byod" +0xbd6c: "byol" +0xbd6d: "byolg" +0xbd6e: "byolm" +0xbd6f: "byolb" +0xbd70: "byols" +0xbd71: "byolt" +0xbd72: "byolp" +0xbd73: "byolh" +0xbd74: "byom" +0xbd75: "byob" +0xbd76: "byobs" +0xbd77: "byos" +0xbd78: "byoss" +0xbd79: "byong" +0xbd7a: "byoj" +0xbd7b: "byoc" +0xbd7c: "byok" +0xbd7d: "byot" +0xbd7e: "byop" +0xbd7f: "byoh" +0xbd80: "bu" +0xbd81: "bug" +0xbd82: "bugg" +0xbd83: "bugs" +0xbd84: "bun" +0xbd85: "bunj" +0xbd86: "bunh" +0xbd87: "bud" +0xbd88: "bul" +0xbd89: "bulg" +0xbd8a: "bulm" +0xbd8b: "bulb" +0xbd8c: "buls" +0xbd8d: "bult" +0xbd8e: "bulp" +0xbd8f: "bulh" +0xbd90: "bum" +0xbd91: "bub" +0xbd92: "bubs" +0xbd93: "bus" +0xbd94: "buss" +0xbd95: "bung" +0xbd96: "buj" +0xbd97: "buc" +0xbd98: "buk" +0xbd99: "but" +0xbd9a: "bup" +0xbd9b: "buh" +0xbd9c: "bweo" +0xbd9d: "bweog" +0xbd9e: "bweogg" +0xbd9f: "bweogs" +0xbda0: "bweon" +0xbda1: "bweonj" +0xbda2: "bweonh" +0xbda3: "bweod" +0xbda4: "bweol" +0xbda5: "bweolg" +0xbda6: "bweolm" +0xbda7: "bweolb" +0xbda8: "bweols" +0xbda9: "bweolt" +0xbdaa: "bweolp" +0xbdab: "bweolh" +0xbdac: "bweom" +0xbdad: "bweob" +0xbdae: "bweobs" +0xbdaf: "bweos" +0xbdb0: "bweoss" +0xbdb1: "bweong" +0xbdb2: "bweoj" +0xbdb3: "bweoc" +0xbdb4: "bweok" +0xbdb5: "bweot" +0xbdb6: "bweop" +0xbdb7: "bweoh" +0xbdb8: "bwe" +0xbdb9: "bweg" +0xbdba: "bwegg" +0xbdbb: "bwegs" +0xbdbc: "bwen" +0xbdbd: "bwenj" +0xbdbe: "bwenh" +0xbdbf: "bwed" +0xbdc0: "bwel" +0xbdc1: "bwelg" +0xbdc2: "bwelm" +0xbdc3: "bwelb" +0xbdc4: "bwels" +0xbdc5: "bwelt" +0xbdc6: "bwelp" +0xbdc7: "bwelh" +0xbdc8: "bwem" +0xbdc9: "bweb" +0xbdca: "bwebs" +0xbdcb: "bwes" +0xbdcc: "bwess" +0xbdcd: "bweng" +0xbdce: "bwej" +0xbdcf: "bwec" +0xbdd0: "bwek" +0xbdd1: "bwet" +0xbdd2: "bwep" +0xbdd3: "bweh" +0xbdd4: "bwi" +0xbdd5: "bwig" +0xbdd6: "bwigg" +0xbdd7: "bwigs" +0xbdd8: "bwin" +0xbdd9: "bwinj" +0xbdda: "bwinh" +0xbddb: "bwid" +0xbddc: "bwil" +0xbddd: "bwilg" +0xbdde: "bwilm" +0xbddf: "bwilb" +0xbde0: "bwils" +0xbde1: "bwilt" +0xbde2: "bwilp" +0xbde3: "bwilh" +0xbde4: "bwim" +0xbde5: "bwib" +0xbde6: "bwibs" +0xbde7: "bwis" +0xbde8: "bwiss" +0xbde9: "bwing" +0xbdea: "bwij" +0xbdeb: "bwic" +0xbdec: "bwik" +0xbded: "bwit" +0xbdee: "bwip" +0xbdef: "bwih" +0xbdf0: "byu" +0xbdf1: "byug" +0xbdf2: "byugg" +0xbdf3: "byugs" +0xbdf4: "byun" +0xbdf5: "byunj" +0xbdf6: "byunh" +0xbdf7: "byud" +0xbdf8: "byul" +0xbdf9: "byulg" +0xbdfa: "byulm" +0xbdfb: "byulb" +0xbdfc: "byuls" +0xbdfd: "byult" +0xbdfe: "byulp" +0xbdff: "byulh" +/* x0be */ +0xbe00: "byum" +0xbe01: "byub" +0xbe02: "byubs" +0xbe03: "byus" +0xbe04: "byuss" +0xbe05: "byung" +0xbe06: "byuj" +0xbe07: "byuc" +0xbe08: "byuk" +0xbe09: "byut" +0xbe0a: "byup" +0xbe0b: "byuh" +0xbe0c: "beu" +0xbe0d: "beug" +0xbe0e: "beugg" +0xbe0f: "beugs" +0xbe10: "beun" +0xbe11: "beunj" +0xbe12: "beunh" +0xbe13: "beud" +0xbe14: "beul" +0xbe15: "beulg" +0xbe16: "beulm" +0xbe17: "beulb" +0xbe18: "beuls" +0xbe19: "beult" +0xbe1a: "beulp" +0xbe1b: "beulh" +0xbe1c: "beum" +0xbe1d: "beub" +0xbe1e: "beubs" +0xbe1f: "beus" +0xbe20: "beuss" +0xbe21: "beung" +0xbe22: "beuj" +0xbe23: "beuc" +0xbe24: "beuk" +0xbe25: "beut" +0xbe26: "beup" +0xbe27: "beuh" +0xbe28: "byi" +0xbe29: "byig" +0xbe2a: "byigg" +0xbe2b: "byigs" +0xbe2c: "byin" +0xbe2d: "byinj" +0xbe2e: "byinh" +0xbe2f: "byid" +0xbe30: "byil" +0xbe31: "byilg" +0xbe32: "byilm" +0xbe33: "byilb" +0xbe34: "byils" +0xbe35: "byilt" +0xbe36: "byilp" +0xbe37: "byilh" +0xbe38: "byim" +0xbe39: "byib" +0xbe3a: "byibs" +0xbe3b: "byis" +0xbe3c: "byiss" +0xbe3d: "bying" +0xbe3e: "byij" +0xbe3f: "byic" +0xbe40: "byik" +0xbe41: "byit" +0xbe42: "byip" +0xbe43: "byih" +0xbe44: "bi" +0xbe45: "big" +0xbe46: "bigg" +0xbe47: "bigs" +0xbe48: "bin" +0xbe49: "binj" +0xbe4a: "binh" +0xbe4b: "bid" +0xbe4c: "bil" +0xbe4d: "bilg" +0xbe4e: "bilm" +0xbe4f: "bilb" +0xbe50: "bils" +0xbe51: "bilt" +0xbe52: "bilp" +0xbe53: "bilh" +0xbe54: "bim" +0xbe55: "bib" +0xbe56: "bibs" +0xbe57: "bis" +0xbe58: "biss" +0xbe59: "bing" +0xbe5a: "bij" +0xbe5b: "bic" +0xbe5c: "bik" +0xbe5d: "bit" +0xbe5e: "bip" +0xbe5f: "bih" +0xbe60: "bba" +0xbe61: "bbag" +0xbe62: "bbagg" +0xbe63: "bbags" +0xbe64: "bban" +0xbe65: "bbanj" +0xbe66: "bbanh" +0xbe67: "bbad" +0xbe68: "bbal" +0xbe69: "bbalg" +0xbe6a: "bbalm" +0xbe6b: "bbalb" +0xbe6c: "bbals" +0xbe6d: "bbalt" +0xbe6e: "bbalp" +0xbe6f: "bbalh" +0xbe70: "bbam" +0xbe71: "bbab" +0xbe72: "bbabs" +0xbe73: "bbas" +0xbe74: "bbass" +0xbe75: "bbang" +0xbe76: "bbaj" +0xbe77: "bbac" +0xbe78: "bbak" +0xbe79: "bbat" +0xbe7a: "bbap" +0xbe7b: "bbah" +0xbe7c: "bbae" +0xbe7d: "bbaeg" +0xbe7e: "bbaegg" +0xbe7f: "bbaegs" +0xbe80: "bbaen" +0xbe81: "bbaenj" +0xbe82: "bbaenh" +0xbe83: "bbaed" +0xbe84: "bbael" +0xbe85: "bbaelg" +0xbe86: "bbaelm" +0xbe87: "bbaelb" +0xbe88: "bbaels" +0xbe89: "bbaelt" +0xbe8a: "bbaelp" +0xbe8b: "bbaelh" +0xbe8c: "bbaem" +0xbe8d: "bbaeb" +0xbe8e: "bbaebs" +0xbe8f: "bbaes" +0xbe90: "bbaess" +0xbe91: "bbaeng" +0xbe92: "bbaej" +0xbe93: "bbaec" +0xbe94: "bbaek" +0xbe95: "bbaet" +0xbe96: "bbaep" +0xbe97: "bbaeh" +0xbe98: "bbya" +0xbe99: "bbyag" +0xbe9a: "bbyagg" +0xbe9b: "bbyags" +0xbe9c: "bbyan" +0xbe9d: "bbyanj" +0xbe9e: "bbyanh" +0xbe9f: "bbyad" +0xbea0: "bbyal" +0xbea1: "bbyalg" +0xbea2: "bbyalm" +0xbea3: "bbyalb" +0xbea4: "bbyals" +0xbea5: "bbyalt" +0xbea6: "bbyalp" +0xbea7: "bbyalh" +0xbea8: "bbyam" +0xbea9: "bbyab" +0xbeaa: "bbyabs" +0xbeab: "bbyas" +0xbeac: "bbyass" +0xbead: "bbyang" +0xbeae: "bbyaj" +0xbeaf: "bbyac" +0xbeb0: "bbyak" +0xbeb1: "bbyat" +0xbeb2: "bbyap" +0xbeb3: "bbyah" +0xbeb4: "bbyae" +0xbeb5: "bbyaeg" +0xbeb6: "bbyaegg" +0xbeb7: "bbyaegs" +0xbeb8: "bbyaen" +0xbeb9: "bbyaenj" +0xbeba: "bbyaenh" +0xbebb: "bbyaed" +0xbebc: "bbyael" +0xbebd: "bbyaelg" +0xbebe: "bbyaelm" +0xbebf: "bbyaelb" +0xbec0: "bbyaels" +0xbec1: "bbyaelt" +0xbec2: "bbyaelp" +0xbec3: "bbyaelh" +0xbec4: "bbyaem" +0xbec5: "bbyaeb" +0xbec6: "bbyaebs" +0xbec7: "bbyaes" +0xbec8: "bbyaess" +0xbec9: "bbyaeng" +0xbeca: "bbyaej" +0xbecb: "bbyaec" +0xbecc: "bbyaek" +0xbecd: "bbyaet" +0xbece: "bbyaep" +0xbecf: "bbyaeh" +0xbed0: "bbeo" +0xbed1: "bbeog" +0xbed2: "bbeogg" +0xbed3: "bbeogs" +0xbed4: "bbeon" +0xbed5: "bbeonj" +0xbed6: "bbeonh" +0xbed7: "bbeod" +0xbed8: "bbeol" +0xbed9: "bbeolg" +0xbeda: "bbeolm" +0xbedb: "bbeolb" +0xbedc: "bbeols" +0xbedd: "bbeolt" +0xbede: "bbeolp" +0xbedf: "bbeolh" +0xbee0: "bbeom" +0xbee1: "bbeob" +0xbee2: "bbeobs" +0xbee3: "bbeos" +0xbee4: "bbeoss" +0xbee5: "bbeong" +0xbee6: "bbeoj" +0xbee7: "bbeoc" +0xbee8: "bbeok" +0xbee9: "bbeot" +0xbeea: "bbeop" +0xbeeb: "bbeoh" +0xbeec: "bbe" +0xbeed: "bbeg" +0xbeee: "bbegg" +0xbeef: "bbegs" +0xbef0: "bben" +0xbef1: "bbenj" +0xbef2: "bbenh" +0xbef3: "bbed" +0xbef4: "bbel" +0xbef5: "bbelg" +0xbef6: "bbelm" +0xbef7: "bbelb" +0xbef8: "bbels" +0xbef9: "bbelt" +0xbefa: "bbelp" +0xbefb: "bbelh" +0xbefc: "bbem" +0xbefd: "bbeb" +0xbefe: "bbebs" +0xbeff: "bbes" +/* x0bf */ +0xbf00: "bbess" +0xbf01: "bbeng" +0xbf02: "bbej" +0xbf03: "bbec" +0xbf04: "bbek" +0xbf05: "bbet" +0xbf06: "bbep" +0xbf07: "bbeh" +0xbf08: "bbyeo" +0xbf09: "bbyeog" +0xbf0a: "bbyeogg" +0xbf0b: "bbyeogs" +0xbf0c: "bbyeon" +0xbf0d: "bbyeonj" +0xbf0e: "bbyeonh" +0xbf0f: "bbyeod" +0xbf10: "bbyeol" +0xbf11: "bbyeolg" +0xbf12: "bbyeolm" +0xbf13: "bbyeolb" +0xbf14: "bbyeols" +0xbf15: "bbyeolt" +0xbf16: "bbyeolp" +0xbf17: "bbyeolh" +0xbf18: "bbyeom" +0xbf19: "bbyeob" +0xbf1a: "bbyeobs" +0xbf1b: "bbyeos" +0xbf1c: "bbyeoss" +0xbf1d: "bbyeong" +0xbf1e: "bbyeoj" +0xbf1f: "bbyeoc" +0xbf20: "bbyeok" +0xbf21: "bbyeot" +0xbf22: "bbyeop" +0xbf23: "bbyeoh" +0xbf24: "bbye" +0xbf25: "bbyeg" +0xbf26: "bbyegg" +0xbf27: "bbyegs" +0xbf28: "bbyen" +0xbf29: "bbyenj" +0xbf2a: "bbyenh" +0xbf2b: "bbyed" +0xbf2c: "bbyel" +0xbf2d: "bbyelg" +0xbf2e: "bbyelm" +0xbf2f: "bbyelb" +0xbf30: "bbyels" +0xbf31: "bbyelt" +0xbf32: "bbyelp" +0xbf33: "bbyelh" +0xbf34: "bbyem" +0xbf35: "bbyeb" +0xbf36: "bbyebs" +0xbf37: "bbyes" +0xbf38: "bbyess" +0xbf39: "bbyeng" +0xbf3a: "bbyej" +0xbf3b: "bbyec" +0xbf3c: "bbyek" +0xbf3d: "bbyet" +0xbf3e: "bbyep" +0xbf3f: "bbyeh" +0xbf40: "bbo" +0xbf41: "bbog" +0xbf42: "bbogg" +0xbf43: "bbogs" +0xbf44: "bbon" +0xbf45: "bbonj" +0xbf46: "bbonh" +0xbf47: "bbod" +0xbf48: "bbol" +0xbf49: "bbolg" +0xbf4a: "bbolm" +0xbf4b: "bbolb" +0xbf4c: "bbols" +0xbf4d: "bbolt" +0xbf4e: "bbolp" +0xbf4f: "bbolh" +0xbf50: "bbom" +0xbf51: "bbob" +0xbf52: "bbobs" +0xbf53: "bbos" +0xbf54: "bboss" +0xbf55: "bbong" +0xbf56: "bboj" +0xbf57: "bboc" +0xbf58: "bbok" +0xbf59: "bbot" +0xbf5a: "bbop" +0xbf5b: "bboh" +0xbf5c: "bbwa" +0xbf5d: "bbwag" +0xbf5e: "bbwagg" +0xbf5f: "bbwags" +0xbf60: "bbwan" +0xbf61: "bbwanj" +0xbf62: "bbwanh" +0xbf63: "bbwad" +0xbf64: "bbwal" +0xbf65: "bbwalg" +0xbf66: "bbwalm" +0xbf67: "bbwalb" +0xbf68: "bbwals" +0xbf69: "bbwalt" +0xbf6a: "bbwalp" +0xbf6b: "bbwalh" +0xbf6c: "bbwam" +0xbf6d: "bbwab" +0xbf6e: "bbwabs" +0xbf6f: "bbwas" +0xbf70: "bbwass" +0xbf71: "bbwang" +0xbf72: "bbwaj" +0xbf73: "bbwac" +0xbf74: "bbwak" +0xbf75: "bbwat" +0xbf76: "bbwap" +0xbf77: "bbwah" +0xbf78: "bbwae" +0xbf79: "bbwaeg" +0xbf7a: "bbwaegg" +0xbf7b: "bbwaegs" +0xbf7c: "bbwaen" +0xbf7d: "bbwaenj" +0xbf7e: "bbwaenh" +0xbf7f: "bbwaed" +0xbf80: "bbwael" +0xbf81: "bbwaelg" +0xbf82: "bbwaelm" +0xbf83: "bbwaelb" +0xbf84: "bbwaels" +0xbf85: "bbwaelt" +0xbf86: "bbwaelp" +0xbf87: "bbwaelh" +0xbf88: "bbwaem" +0xbf89: "bbwaeb" +0xbf8a: "bbwaebs" +0xbf8b: "bbwaes" +0xbf8c: "bbwaess" +0xbf8d: "bbwaeng" +0xbf8e: "bbwaej" +0xbf8f: "bbwaec" +0xbf90: "bbwaek" +0xbf91: "bbwaet" +0xbf92: "bbwaep" +0xbf93: "bbwaeh" +0xbf94: "bboe" +0xbf95: "bboeg" +0xbf96: "bboegg" +0xbf97: "bboegs" +0xbf98: "bboen" +0xbf99: "bboenj" +0xbf9a: "bboenh" +0xbf9b: "bboed" +0xbf9c: "bboel" +0xbf9d: "bboelg" +0xbf9e: "bboelm" +0xbf9f: "bboelb" +0xbfa0: "bboels" +0xbfa1: "bboelt" +0xbfa2: "bboelp" +0xbfa3: "bboelh" +0xbfa4: "bboem" +0xbfa5: "bboeb" +0xbfa6: "bboebs" +0xbfa7: "bboes" +0xbfa8: "bboess" +0xbfa9: "bboeng" +0xbfaa: "bboej" +0xbfab: "bboec" +0xbfac: "bboek" +0xbfad: "bboet" +0xbfae: "bboep" +0xbfaf: "bboeh" +0xbfb0: "bbyo" +0xbfb1: "bbyog" +0xbfb2: "bbyogg" +0xbfb3: "bbyogs" +0xbfb4: "bbyon" +0xbfb5: "bbyonj" +0xbfb6: "bbyonh" +0xbfb7: "bbyod" +0xbfb8: "bbyol" +0xbfb9: "bbyolg" +0xbfba: "bbyolm" +0xbfbb: "bbyolb" +0xbfbc: "bbyols" +0xbfbd: "bbyolt" +0xbfbe: "bbyolp" +0xbfbf: "bbyolh" +0xbfc0: "bbyom" +0xbfc1: "bbyob" +0xbfc2: "bbyobs" +0xbfc3: "bbyos" +0xbfc4: "bbyoss" +0xbfc5: "bbyong" +0xbfc6: "bbyoj" +0xbfc7: "bbyoc" +0xbfc8: "bbyok" +0xbfc9: "bbyot" +0xbfca: "bbyop" +0xbfcb: "bbyoh" +0xbfcc: "bbu" +0xbfcd: "bbug" +0xbfce: "bbugg" +0xbfcf: "bbugs" +0xbfd0: "bbun" +0xbfd1: "bbunj" +0xbfd2: "bbunh" +0xbfd3: "bbud" +0xbfd4: "bbul" +0xbfd5: "bbulg" +0xbfd6: "bbulm" +0xbfd7: "bbulb" +0xbfd8: "bbuls" +0xbfd9: "bbult" +0xbfda: "bbulp" +0xbfdb: "bbulh" +0xbfdc: "bbum" +0xbfdd: "bbub" +0xbfde: "bbubs" +0xbfdf: "bbus" +0xbfe0: "bbuss" +0xbfe1: "bbung" +0xbfe2: "bbuj" +0xbfe3: "bbuc" +0xbfe4: "bbuk" +0xbfe5: "bbut" +0xbfe6: "bbup" +0xbfe7: "bbuh" +0xbfe8: "bbweo" +0xbfe9: "bbweog" +0xbfea: "bbweogg" +0xbfeb: "bbweogs" +0xbfec: "bbweon" +0xbfed: "bbweonj" +0xbfee: "bbweonh" +0xbfef: "bbweod" +0xbff0: "bbweol" +0xbff1: "bbweolg" +0xbff2: "bbweolm" +0xbff3: "bbweolb" +0xbff4: "bbweols" +0xbff5: "bbweolt" +0xbff6: "bbweolp" +0xbff7: "bbweolh" +0xbff8: "bbweom" +0xbff9: "bbweob" +0xbffa: "bbweobs" +0xbffb: "bbweos" +0xbffc: "bbweoss" +0xbffd: "bbweong" +0xbffe: "bbweoj" +0xbfff: "bbweoc" +/* x0c0 */ +0xc000: "bbweok" +0xc001: "bbweot" +0xc002: "bbweop" +0xc003: "bbweoh" +0xc004: "bbwe" +0xc005: "bbweg" +0xc006: "bbwegg" +0xc007: "bbwegs" +0xc008: "bbwen" +0xc009: "bbwenj" +0xc00a: "bbwenh" +0xc00b: "bbwed" +0xc00c: "bbwel" +0xc00d: "bbwelg" +0xc00e: "bbwelm" +0xc00f: "bbwelb" +0xc010: "bbwels" +0xc011: "bbwelt" +0xc012: "bbwelp" +0xc013: "bbwelh" +0xc014: "bbwem" +0xc015: "bbweb" +0xc016: "bbwebs" +0xc017: "bbwes" +0xc018: "bbwess" +0xc019: "bbweng" +0xc01a: "bbwej" +0xc01b: "bbwec" +0xc01c: "bbwek" +0xc01d: "bbwet" +0xc01e: "bbwep" +0xc01f: "bbweh" +0xc020: "bbwi" +0xc021: "bbwig" +0xc022: "bbwigg" +0xc023: "bbwigs" +0xc024: "bbwin" +0xc025: "bbwinj" +0xc026: "bbwinh" +0xc027: "bbwid" +0xc028: "bbwil" +0xc029: "bbwilg" +0xc02a: "bbwilm" +0xc02b: "bbwilb" +0xc02c: "bbwils" +0xc02d: "bbwilt" +0xc02e: "bbwilp" +0xc02f: "bbwilh" +0xc030: "bbwim" +0xc031: "bbwib" +0xc032: "bbwibs" +0xc033: "bbwis" +0xc034: "bbwiss" +0xc035: "bbwing" +0xc036: "bbwij" +0xc037: "bbwic" +0xc038: "bbwik" +0xc039: "bbwit" +0xc03a: "bbwip" +0xc03b: "bbwih" +0xc03c: "bbyu" +0xc03d: "bbyug" +0xc03e: "bbyugg" +0xc03f: "bbyugs" +0xc040: "bbyun" +0xc041: "bbyunj" +0xc042: "bbyunh" +0xc043: "bbyud" +0xc044: "bbyul" +0xc045: "bbyulg" +0xc046: "bbyulm" +0xc047: "bbyulb" +0xc048: "bbyuls" +0xc049: "bbyult" +0xc04a: "bbyulp" +0xc04b: "bbyulh" +0xc04c: "bbyum" +0xc04d: "bbyub" +0xc04e: "bbyubs" +0xc04f: "bbyus" +0xc050: "bbyuss" +0xc051: "bbyung" +0xc052: "bbyuj" +0xc053: "bbyuc" +0xc054: "bbyuk" +0xc055: "bbyut" +0xc056: "bbyup" +0xc057: "bbyuh" +0xc058: "bbeu" +0xc059: "bbeug" +0xc05a: "bbeugg" +0xc05b: "bbeugs" +0xc05c: "bbeun" +0xc05d: "bbeunj" +0xc05e: "bbeunh" +0xc05f: "bbeud" +0xc060: "bbeul" +0xc061: "bbeulg" +0xc062: "bbeulm" +0xc063: "bbeulb" +0xc064: "bbeuls" +0xc065: "bbeult" +0xc066: "bbeulp" +0xc067: "bbeulh" +0xc068: "bbeum" +0xc069: "bbeub" +0xc06a: "bbeubs" +0xc06b: "bbeus" +0xc06c: "bbeuss" +0xc06d: "bbeung" +0xc06e: "bbeuj" +0xc06f: "bbeuc" +0xc070: "bbeuk" +0xc071: "bbeut" +0xc072: "bbeup" +0xc073: "bbeuh" +0xc074: "bbyi" +0xc075: "bbyig" +0xc076: "bbyigg" +0xc077: "bbyigs" +0xc078: "bbyin" +0xc079: "bbyinj" +0xc07a: "bbyinh" +0xc07b: "bbyid" +0xc07c: "bbyil" +0xc07d: "bbyilg" +0xc07e: "bbyilm" +0xc07f: "bbyilb" +0xc080: "bbyils" +0xc081: "bbyilt" +0xc082: "bbyilp" +0xc083: "bbyilh" +0xc084: "bbyim" +0xc085: "bbyib" +0xc086: "bbyibs" +0xc087: "bbyis" +0xc088: "bbyiss" +0xc089: "bbying" +0xc08a: "bbyij" +0xc08b: "bbyic" +0xc08c: "bbyik" +0xc08d: "bbyit" +0xc08e: "bbyip" +0xc08f: "bbyih" +0xc090: "bbi" +0xc091: "bbig" +0xc092: "bbigg" +0xc093: "bbigs" +0xc094: "bbin" +0xc095: "bbinj" +0xc096: "bbinh" +0xc097: "bbid" +0xc098: "bbil" +0xc099: "bbilg" +0xc09a: "bbilm" +0xc09b: "bbilb" +0xc09c: "bbils" +0xc09d: "bbilt" +0xc09e: "bbilp" +0xc09f: "bbilh" +0xc0a0: "bbim" +0xc0a1: "bbib" +0xc0a2: "bbibs" +0xc0a3: "bbis" +0xc0a4: "bbiss" +0xc0a5: "bbing" +0xc0a6: "bbij" +0xc0a7: "bbic" +0xc0a8: "bbik" +0xc0a9: "bbit" +0xc0aa: "bbip" +0xc0ab: "bbih" +0xc0ac: "sa" +0xc0ad: "sag" +0xc0ae: "sagg" +0xc0af: "sags" +0xc0b0: "san" +0xc0b1: "sanj" +0xc0b2: "sanh" +0xc0b3: "sad" +0xc0b4: "sal" +0xc0b5: "salg" +0xc0b6: "salm" +0xc0b7: "salb" +0xc0b8: "sals" +0xc0b9: "salt" +0xc0ba: "salp" +0xc0bb: "salh" +0xc0bc: "sam" +0xc0bd: "sab" +0xc0be: "sabs" +0xc0bf: "sas" +0xc0c0: "sass" +0xc0c1: "sang" +0xc0c2: "saj" +0xc0c3: "sac" +0xc0c4: "sak" +0xc0c5: "sat" +0xc0c6: "sap" +0xc0c7: "sah" +0xc0c8: "sae" +0xc0c9: "saeg" +0xc0ca: "saegg" +0xc0cb: "saegs" +0xc0cc: "saen" +0xc0cd: "saenj" +0xc0ce: "saenh" +0xc0cf: "saed" +0xc0d0: "sael" +0xc0d1: "saelg" +0xc0d2: "saelm" +0xc0d3: "saelb" +0xc0d4: "saels" +0xc0d5: "saelt" +0xc0d6: "saelp" +0xc0d7: "saelh" +0xc0d8: "saem" +0xc0d9: "saeb" +0xc0da: "saebs" +0xc0db: "saes" +0xc0dc: "saess" +0xc0dd: "saeng" +0xc0de: "saej" +0xc0df: "saec" +0xc0e0: "saek" +0xc0e1: "saet" +0xc0e2: "saep" +0xc0e3: "saeh" +0xc0e4: "sya" +0xc0e5: "syag" +0xc0e6: "syagg" +0xc0e7: "syags" +0xc0e8: "syan" +0xc0e9: "syanj" +0xc0ea: "syanh" +0xc0eb: "syad" +0xc0ec: "syal" +0xc0ed: "syalg" +0xc0ee: "syalm" +0xc0ef: "syalb" +0xc0f0: "syals" +0xc0f1: "syalt" +0xc0f2: "syalp" +0xc0f3: "syalh" +0xc0f4: "syam" +0xc0f5: "syab" +0xc0f6: "syabs" +0xc0f7: "syas" +0xc0f8: "syass" +0xc0f9: "syang" +0xc0fa: "syaj" +0xc0fb: "syac" +0xc0fc: "syak" +0xc0fd: "syat" +0xc0fe: "syap" +0xc0ff: "syah" +/* x0c1 */ +0xc100: "syae" +0xc101: "syaeg" +0xc102: "syaegg" +0xc103: "syaegs" +0xc104: "syaen" +0xc105: "syaenj" +0xc106: "syaenh" +0xc107: "syaed" +0xc108: "syael" +0xc109: "syaelg" +0xc10a: "syaelm" +0xc10b: "syaelb" +0xc10c: "syaels" +0xc10d: "syaelt" +0xc10e: "syaelp" +0xc10f: "syaelh" +0xc110: "syaem" +0xc111: "syaeb" +0xc112: "syaebs" +0xc113: "syaes" +0xc114: "syaess" +0xc115: "syaeng" +0xc116: "syaej" +0xc117: "syaec" +0xc118: "syaek" +0xc119: "syaet" +0xc11a: "syaep" +0xc11b: "syaeh" +0xc11c: "seo" +0xc11d: "seog" +0xc11e: "seogg" +0xc11f: "seogs" +0xc120: "seon" +0xc121: "seonj" +0xc122: "seonh" +0xc123: "seod" +0xc124: "seol" +0xc125: "seolg" +0xc126: "seolm" +0xc127: "seolb" +0xc128: "seols" +0xc129: "seolt" +0xc12a: "seolp" +0xc12b: "seolh" +0xc12c: "seom" +0xc12d: "seob" +0xc12e: "seobs" +0xc12f: "seos" +0xc130: "seoss" +0xc131: "seong" +0xc132: "seoj" +0xc133: "seoc" +0xc134: "seok" +0xc135: "seot" +0xc136: "seop" +0xc137: "seoh" +0xc138: "se" +0xc139: "seg" +0xc13a: "segg" +0xc13b: "segs" +0xc13c: "sen" +0xc13d: "senj" +0xc13e: "senh" +0xc13f: "sed" +0xc140: "sel" +0xc141: "selg" +0xc142: "selm" +0xc143: "selb" +0xc144: "sels" +0xc145: "selt" +0xc146: "selp" +0xc147: "selh" +0xc148: "sem" +0xc149: "seb" +0xc14a: "sebs" +0xc14b: "ses" +0xc14c: "sess" +0xc14d: "seng" +0xc14e: "sej" +0xc14f: "sec" +0xc150: "sek" +0xc151: "set" +0xc152: "sep" +0xc153: "seh" +0xc154: "syeo" +0xc155: "syeog" +0xc156: "syeogg" +0xc157: "syeogs" +0xc158: "syeon" +0xc159: "syeonj" +0xc15a: "syeonh" +0xc15b: "syeod" +0xc15c: "syeol" +0xc15d: "syeolg" +0xc15e: "syeolm" +0xc15f: "syeolb" +0xc160: "syeols" +0xc161: "syeolt" +0xc162: "syeolp" +0xc163: "syeolh" +0xc164: "syeom" +0xc165: "syeob" +0xc166: "syeobs" +0xc167: "syeos" +0xc168: "syeoss" +0xc169: "syeong" +0xc16a: "syeoj" +0xc16b: "syeoc" +0xc16c: "syeok" +0xc16d: "syeot" +0xc16e: "syeop" +0xc16f: "syeoh" +0xc170: "sye" +0xc171: "syeg" +0xc172: "syegg" +0xc173: "syegs" +0xc174: "syen" +0xc175: "syenj" +0xc176: "syenh" +0xc177: "syed" +0xc178: "syel" +0xc179: "syelg" +0xc17a: "syelm" +0xc17b: "syelb" +0xc17c: "syels" +0xc17d: "syelt" +0xc17e: "syelp" +0xc17f: "syelh" +0xc180: "syem" +0xc181: "syeb" +0xc182: "syebs" +0xc183: "syes" +0xc184: "syess" +0xc185: "syeng" +0xc186: "syej" +0xc187: "syec" +0xc188: "syek" +0xc189: "syet" +0xc18a: "syep" +0xc18b: "syeh" +0xc18c: "so" +0xc18d: "sog" +0xc18e: "sogg" +0xc18f: "sogs" +0xc190: "son" +0xc191: "sonj" +0xc192: "sonh" +0xc193: "sod" +0xc194: "sol" +0xc195: "solg" +0xc196: "solm" +0xc197: "solb" +0xc198: "sols" +0xc199: "solt" +0xc19a: "solp" +0xc19b: "solh" +0xc19c: "som" +0xc19d: "sob" +0xc19e: "sobs" +0xc19f: "sos" +0xc1a0: "soss" +0xc1a1: "song" +0xc1a2: "soj" +0xc1a3: "soc" +0xc1a4: "sok" +0xc1a5: "sot" +0xc1a6: "sop" +0xc1a7: "soh" +0xc1a8: "swa" +0xc1a9: "swag" +0xc1aa: "swagg" +0xc1ab: "swags" +0xc1ac: "swan" +0xc1ad: "swanj" +0xc1ae: "swanh" +0xc1af: "swad" +0xc1b0: "swal" +0xc1b1: "swalg" +0xc1b2: "swalm" +0xc1b3: "swalb" +0xc1b4: "swals" +0xc1b5: "swalt" +0xc1b6: "swalp" +0xc1b7: "swalh" +0xc1b8: "swam" +0xc1b9: "swab" +0xc1ba: "swabs" +0xc1bb: "swas" +0xc1bc: "swass" +0xc1bd: "swang" +0xc1be: "swaj" +0xc1bf: "swac" +0xc1c0: "swak" +0xc1c1: "swat" +0xc1c2: "swap" +0xc1c3: "swah" +0xc1c4: "swae" +0xc1c5: "swaeg" +0xc1c6: "swaegg" +0xc1c7: "swaegs" +0xc1c8: "swaen" +0xc1c9: "swaenj" +0xc1ca: "swaenh" +0xc1cb: "swaed" +0xc1cc: "swael" +0xc1cd: "swaelg" +0xc1ce: "swaelm" +0xc1cf: "swaelb" +0xc1d0: "swaels" +0xc1d1: "swaelt" +0xc1d2: "swaelp" +0xc1d3: "swaelh" +0xc1d4: "swaem" +0xc1d5: "swaeb" +0xc1d6: "swaebs" +0xc1d7: "swaes" +0xc1d8: "swaess" +0xc1d9: "swaeng" +0xc1da: "swaej" +0xc1db: "swaec" +0xc1dc: "swaek" +0xc1dd: "swaet" +0xc1de: "swaep" +0xc1df: "swaeh" +0xc1e0: "soe" +0xc1e1: "soeg" +0xc1e2: "soegg" +0xc1e3: "soegs" +0xc1e4: "soen" +0xc1e5: "soenj" +0xc1e6: "soenh" +0xc1e7: "soed" +0xc1e8: "soel" +0xc1e9: "soelg" +0xc1ea: "soelm" +0xc1eb: "soelb" +0xc1ec: "soels" +0xc1ed: "soelt" +0xc1ee: "soelp" +0xc1ef: "soelh" +0xc1f0: "soem" +0xc1f1: "soeb" +0xc1f2: "soebs" +0xc1f3: "soes" +0xc1f4: "soess" +0xc1f5: "soeng" +0xc1f6: "soej" +0xc1f7: "soec" +0xc1f8: "soek" +0xc1f9: "soet" +0xc1fa: "soep" +0xc1fb: "soeh" +0xc1fc: "syo" +0xc1fd: "syog" +0xc1fe: "syogg" +0xc1ff: "syogs" +/* x0c2 */ +0xc200: "syon" +0xc201: "syonj" +0xc202: "syonh" +0xc203: "syod" +0xc204: "syol" +0xc205: "syolg" +0xc206: "syolm" +0xc207: "syolb" +0xc208: "syols" +0xc209: "syolt" +0xc20a: "syolp" +0xc20b: "syolh" +0xc20c: "syom" +0xc20d: "syob" +0xc20e: "syobs" +0xc20f: "syos" +0xc210: "syoss" +0xc211: "syong" +0xc212: "syoj" +0xc213: "syoc" +0xc214: "syok" +0xc215: "syot" +0xc216: "syop" +0xc217: "syoh" +0xc218: "su" +0xc219: "sug" +0xc21a: "sugg" +0xc21b: "sugs" +0xc21c: "sun" +0xc21d: "sunj" +0xc21e: "sunh" +0xc21f: "sud" +0xc220: "sul" +0xc221: "sulg" +0xc222: "sulm" +0xc223: "sulb" +0xc224: "suls" +0xc225: "sult" +0xc226: "sulp" +0xc227: "sulh" +0xc228: "sum" +0xc229: "sub" +0xc22a: "subs" +0xc22b: "sus" +0xc22c: "suss" +0xc22d: "sung" +0xc22e: "suj" +0xc22f: "suc" +0xc230: "suk" +0xc231: "sut" +0xc232: "sup" +0xc233: "suh" +0xc234: "sweo" +0xc235: "sweog" +0xc236: "sweogg" +0xc237: "sweogs" +0xc238: "sweon" +0xc239: "sweonj" +0xc23a: "sweonh" +0xc23b: "sweod" +0xc23c: "sweol" +0xc23d: "sweolg" +0xc23e: "sweolm" +0xc23f: "sweolb" +0xc240: "sweols" +0xc241: "sweolt" +0xc242: "sweolp" +0xc243: "sweolh" +0xc244: "sweom" +0xc245: "sweob" +0xc246: "sweobs" +0xc247: "sweos" +0xc248: "sweoss" +0xc249: "sweong" +0xc24a: "sweoj" +0xc24b: "sweoc" +0xc24c: "sweok" +0xc24d: "sweot" +0xc24e: "sweop" +0xc24f: "sweoh" +0xc250: "swe" +0xc251: "sweg" +0xc252: "swegg" +0xc253: "swegs" +0xc254: "swen" +0xc255: "swenj" +0xc256: "swenh" +0xc257: "swed" +0xc258: "swel" +0xc259: "swelg" +0xc25a: "swelm" +0xc25b: "swelb" +0xc25c: "swels" +0xc25d: "swelt" +0xc25e: "swelp" +0xc25f: "swelh" +0xc260: "swem" +0xc261: "sweb" +0xc262: "swebs" +0xc263: "swes" +0xc264: "swess" +0xc265: "sweng" +0xc266: "swej" +0xc267: "swec" +0xc268: "swek" +0xc269: "swet" +0xc26a: "swep" +0xc26b: "sweh" +0xc26c: "swi" +0xc26d: "swig" +0xc26e: "swigg" +0xc26f: "swigs" +0xc270: "swin" +0xc271: "swinj" +0xc272: "swinh" +0xc273: "swid" +0xc274: "swil" +0xc275: "swilg" +0xc276: "swilm" +0xc277: "swilb" +0xc278: "swils" +0xc279: "swilt" +0xc27a: "swilp" +0xc27b: "swilh" +0xc27c: "swim" +0xc27d: "swib" +0xc27e: "swibs" +0xc27f: "swis" +0xc280: "swiss" +0xc281: "swing" +0xc282: "swij" +0xc283: "swic" +0xc284: "swik" +0xc285: "swit" +0xc286: "swip" +0xc287: "swih" +0xc288: "syu" +0xc289: "syug" +0xc28a: "syugg" +0xc28b: "syugs" +0xc28c: "syun" +0xc28d: "syunj" +0xc28e: "syunh" +0xc28f: "syud" +0xc290: "syul" +0xc291: "syulg" +0xc292: "syulm" +0xc293: "syulb" +0xc294: "syuls" +0xc295: "syult" +0xc296: "syulp" +0xc297: "syulh" +0xc298: "syum" +0xc299: "syub" +0xc29a: "syubs" +0xc29b: "syus" +0xc29c: "syuss" +0xc29d: "syung" +0xc29e: "syuj" +0xc29f: "syuc" +0xc2a0: "syuk" +0xc2a1: "syut" +0xc2a2: "syup" +0xc2a3: "syuh" +0xc2a4: "seu" +0xc2a5: "seug" +0xc2a6: "seugg" +0xc2a7: "seugs" +0xc2a8: "seun" +0xc2a9: "seunj" +0xc2aa: "seunh" +0xc2ab: "seud" +0xc2ac: "seul" +0xc2ad: "seulg" +0xc2ae: "seulm" +0xc2af: "seulb" +0xc2b0: "seuls" +0xc2b1: "seult" +0xc2b2: "seulp" +0xc2b3: "seulh" +0xc2b4: "seum" +0xc2b5: "seub" +0xc2b6: "seubs" +0xc2b7: "seus" +0xc2b8: "seuss" +0xc2b9: "seung" +0xc2ba: "seuj" +0xc2bb: "seuc" +0xc2bc: "seuk" +0xc2bd: "seut" +0xc2be: "seup" +0xc2bf: "seuh" +0xc2c0: "syi" +0xc2c1: "syig" +0xc2c2: "syigg" +0xc2c3: "syigs" +0xc2c4: "syin" +0xc2c5: "syinj" +0xc2c6: "syinh" +0xc2c7: "syid" +0xc2c8: "syil" +0xc2c9: "syilg" +0xc2ca: "syilm" +0xc2cb: "syilb" +0xc2cc: "syils" +0xc2cd: "syilt" +0xc2ce: "syilp" +0xc2cf: "syilh" +0xc2d0: "syim" +0xc2d1: "syib" +0xc2d2: "syibs" +0xc2d3: "syis" +0xc2d4: "syiss" +0xc2d5: "sying" +0xc2d6: "syij" +0xc2d7: "syic" +0xc2d8: "syik" +0xc2d9: "syit" +0xc2da: "syip" +0xc2db: "syih" +0xc2dc: "si" +0xc2dd: "sig" +0xc2de: "sigg" +0xc2df: "sigs" +0xc2e0: "sin" +0xc2e1: "sinj" +0xc2e2: "sinh" +0xc2e3: "sid" +0xc2e4: "sil" +0xc2e5: "silg" +0xc2e6: "silm" +0xc2e7: "silb" +0xc2e8: "sils" +0xc2e9: "silt" +0xc2ea: "silp" +0xc2eb: "silh" +0xc2ec: "sim" +0xc2ed: "sib" +0xc2ee: "sibs" +0xc2ef: "sis" +0xc2f0: "siss" +0xc2f1: "sing" +0xc2f2: "sij" +0xc2f3: "sic" +0xc2f4: "sik" +0xc2f5: "sit" +0xc2f6: "sip" +0xc2f7: "sih" +0xc2f8: "ssa" +0xc2f9: "ssag" +0xc2fa: "ssagg" +0xc2fb: "ssags" +0xc2fc: "ssan" +0xc2fd: "ssanj" +0xc2fe: "ssanh" +0xc2ff: "ssad" +/* x0c3 */ +0xc300: "ssal" +0xc301: "ssalg" +0xc302: "ssalm" +0xc303: "ssalb" +0xc304: "ssals" +0xc305: "ssalt" +0xc306: "ssalp" +0xc307: "ssalh" +0xc308: "ssam" +0xc309: "ssab" +0xc30a: "ssabs" +0xc30b: "ssas" +0xc30c: "ssass" +0xc30d: "ssang" +0xc30e: "ssaj" +0xc30f: "ssac" +0xc310: "ssak" +0xc311: "ssat" +0xc312: "ssap" +0xc313: "ssah" +0xc314: "ssae" +0xc315: "ssaeg" +0xc316: "ssaegg" +0xc317: "ssaegs" +0xc318: "ssaen" +0xc319: "ssaenj" +0xc31a: "ssaenh" +0xc31b: "ssaed" +0xc31c: "ssael" +0xc31d: "ssaelg" +0xc31e: "ssaelm" +0xc31f: "ssaelb" +0xc320: "ssaels" +0xc321: "ssaelt" +0xc322: "ssaelp" +0xc323: "ssaelh" +0xc324: "ssaem" +0xc325: "ssaeb" +0xc326: "ssaebs" +0xc327: "ssaes" +0xc328: "ssaess" +0xc329: "ssaeng" +0xc32a: "ssaej" +0xc32b: "ssaec" +0xc32c: "ssaek" +0xc32d: "ssaet" +0xc32e: "ssaep" +0xc32f: "ssaeh" +0xc330: "ssya" +0xc331: "ssyag" +0xc332: "ssyagg" +0xc333: "ssyags" +0xc334: "ssyan" +0xc335: "ssyanj" +0xc336: "ssyanh" +0xc337: "ssyad" +0xc338: "ssyal" +0xc339: "ssyalg" +0xc33a: "ssyalm" +0xc33b: "ssyalb" +0xc33c: "ssyals" +0xc33d: "ssyalt" +0xc33e: "ssyalp" +0xc33f: "ssyalh" +0xc340: "ssyam" +0xc341: "ssyab" +0xc342: "ssyabs" +0xc343: "ssyas" +0xc344: "ssyass" +0xc345: "ssyang" +0xc346: "ssyaj" +0xc347: "ssyac" +0xc348: "ssyak" +0xc349: "ssyat" +0xc34a: "ssyap" +0xc34b: "ssyah" +0xc34c: "ssyae" +0xc34d: "ssyaeg" +0xc34e: "ssyaegg" +0xc34f: "ssyaegs" +0xc350: "ssyaen" +0xc351: "ssyaenj" +0xc352: "ssyaenh" +0xc353: "ssyaed" +0xc354: "ssyael" +0xc355: "ssyaelg" +0xc356: "ssyaelm" +0xc357: "ssyaelb" +0xc358: "ssyaels" +0xc359: "ssyaelt" +0xc35a: "ssyaelp" +0xc35b: "ssyaelh" +0xc35c: "ssyaem" +0xc35d: "ssyaeb" +0xc35e: "ssyaebs" +0xc35f: "ssyaes" +0xc360: "ssyaess" +0xc361: "ssyaeng" +0xc362: "ssyaej" +0xc363: "ssyaec" +0xc364: "ssyaek" +0xc365: "ssyaet" +0xc366: "ssyaep" +0xc367: "ssyaeh" +0xc368: "sseo" +0xc369: "sseog" +0xc36a: "sseogg" +0xc36b: "sseogs" +0xc36c: "sseon" +0xc36d: "sseonj" +0xc36e: "sseonh" +0xc36f: "sseod" +0xc370: "sseol" +0xc371: "sseolg" +0xc372: "sseolm" +0xc373: "sseolb" +0xc374: "sseols" +0xc375: "sseolt" +0xc376: "sseolp" +0xc377: "sseolh" +0xc378: "sseom" +0xc379: "sseob" +0xc37a: "sseobs" +0xc37b: "sseos" +0xc37c: "sseoss" +0xc37d: "sseong" +0xc37e: "sseoj" +0xc37f: "sseoc" +0xc380: "sseok" +0xc381: "sseot" +0xc382: "sseop" +0xc383: "sseoh" +0xc384: "sse" +0xc385: "sseg" +0xc386: "ssegg" +0xc387: "ssegs" +0xc388: "ssen" +0xc389: "ssenj" +0xc38a: "ssenh" +0xc38b: "ssed" +0xc38c: "ssel" +0xc38d: "sselg" +0xc38e: "sselm" +0xc38f: "sselb" +0xc390: "ssels" +0xc391: "sselt" +0xc392: "sselp" +0xc393: "sselh" +0xc394: "ssem" +0xc395: "sseb" +0xc396: "ssebs" +0xc397: "sses" +0xc398: "ssess" +0xc399: "sseng" +0xc39a: "ssej" +0xc39b: "ssec" +0xc39c: "ssek" +0xc39d: "sset" +0xc39e: "ssep" +0xc39f: "sseh" +0xc3a0: "ssyeo" +0xc3a1: "ssyeog" +0xc3a2: "ssyeogg" +0xc3a3: "ssyeogs" +0xc3a4: "ssyeon" +0xc3a5: "ssyeonj" +0xc3a6: "ssyeonh" +0xc3a7: "ssyeod" +0xc3a8: "ssyeol" +0xc3a9: "ssyeolg" +0xc3aa: "ssyeolm" +0xc3ab: "ssyeolb" +0xc3ac: "ssyeols" +0xc3ad: "ssyeolt" +0xc3ae: "ssyeolp" +0xc3af: "ssyeolh" +0xc3b0: "ssyeom" +0xc3b1: "ssyeob" +0xc3b2: "ssyeobs" +0xc3b3: "ssyeos" +0xc3b4: "ssyeoss" +0xc3b5: "ssyeong" +0xc3b6: "ssyeoj" +0xc3b7: "ssyeoc" +0xc3b8: "ssyeok" +0xc3b9: "ssyeot" +0xc3ba: "ssyeop" +0xc3bb: "ssyeoh" +0xc3bc: "ssye" +0xc3bd: "ssyeg" +0xc3be: "ssyegg" +0xc3bf: "ssyegs" +0xc3c0: "ssyen" +0xc3c1: "ssyenj" +0xc3c2: "ssyenh" +0xc3c3: "ssyed" +0xc3c4: "ssyel" +0xc3c5: "ssyelg" +0xc3c6: "ssyelm" +0xc3c7: "ssyelb" +0xc3c8: "ssyels" +0xc3c9: "ssyelt" +0xc3ca: "ssyelp" +0xc3cb: "ssyelh" +0xc3cc: "ssyem" +0xc3cd: "ssyeb" +0xc3ce: "ssyebs" +0xc3cf: "ssyes" +0xc3d0: "ssyess" +0xc3d1: "ssyeng" +0xc3d2: "ssyej" +0xc3d3: "ssyec" +0xc3d4: "ssyek" +0xc3d5: "ssyet" +0xc3d6: "ssyep" +0xc3d7: "ssyeh" +0xc3d8: "sso" +0xc3d9: "ssog" +0xc3da: "ssogg" +0xc3db: "ssogs" +0xc3dc: "sson" +0xc3dd: "ssonj" +0xc3de: "ssonh" +0xc3df: "ssod" +0xc3e0: "ssol" +0xc3e1: "ssolg" +0xc3e2: "ssolm" +0xc3e3: "ssolb" +0xc3e4: "ssols" +0xc3e5: "ssolt" +0xc3e6: "ssolp" +0xc3e7: "ssolh" +0xc3e8: "ssom" +0xc3e9: "ssob" +0xc3ea: "ssobs" +0xc3eb: "ssos" +0xc3ec: "ssoss" +0xc3ed: "ssong" +0xc3ee: "ssoj" +0xc3ef: "ssoc" +0xc3f0: "ssok" +0xc3f1: "ssot" +0xc3f2: "ssop" +0xc3f3: "ssoh" +0xc3f4: "sswa" +0xc3f5: "sswag" +0xc3f6: "sswagg" +0xc3f7: "sswags" +0xc3f8: "sswan" +0xc3f9: "sswanj" +0xc3fa: "sswanh" +0xc3fb: "sswad" +0xc3fc: "sswal" +0xc3fd: "sswalg" +0xc3fe: "sswalm" +0xc3ff: "sswalb" +/* x0c4 */ +0xc400: "sswals" +0xc401: "sswalt" +0xc402: "sswalp" +0xc403: "sswalh" +0xc404: "sswam" +0xc405: "sswab" +0xc406: "sswabs" +0xc407: "sswas" +0xc408: "sswass" +0xc409: "sswang" +0xc40a: "sswaj" +0xc40b: "sswac" +0xc40c: "sswak" +0xc40d: "sswat" +0xc40e: "sswap" +0xc40f: "sswah" +0xc410: "sswae" +0xc411: "sswaeg" +0xc412: "sswaegg" +0xc413: "sswaegs" +0xc414: "sswaen" +0xc415: "sswaenj" +0xc416: "sswaenh" +0xc417: "sswaed" +0xc418: "sswael" +0xc419: "sswaelg" +0xc41a: "sswaelm" +0xc41b: "sswaelb" +0xc41c: "sswaels" +0xc41d: "sswaelt" +0xc41e: "sswaelp" +0xc41f: "sswaelh" +0xc420: "sswaem" +0xc421: "sswaeb" +0xc422: "sswaebs" +0xc423: "sswaes" +0xc424: "sswaess" +0xc425: "sswaeng" +0xc426: "sswaej" +0xc427: "sswaec" +0xc428: "sswaek" +0xc429: "sswaet" +0xc42a: "sswaep" +0xc42b: "sswaeh" +0xc42c: "ssoe" +0xc42d: "ssoeg" +0xc42e: "ssoegg" +0xc42f: "ssoegs" +0xc430: "ssoen" +0xc431: "ssoenj" +0xc432: "ssoenh" +0xc433: "ssoed" +0xc434: "ssoel" +0xc435: "ssoelg" +0xc436: "ssoelm" +0xc437: "ssoelb" +0xc438: "ssoels" +0xc439: "ssoelt" +0xc43a: "ssoelp" +0xc43b: "ssoelh" +0xc43c: "ssoem" +0xc43d: "ssoeb" +0xc43e: "ssoebs" +0xc43f: "ssoes" +0xc440: "ssoess" +0xc441: "ssoeng" +0xc442: "ssoej" +0xc443: "ssoec" +0xc444: "ssoek" +0xc445: "ssoet" +0xc446: "ssoep" +0xc447: "ssoeh" +0xc448: "ssyo" +0xc449: "ssyog" +0xc44a: "ssyogg" +0xc44b: "ssyogs" +0xc44c: "ssyon" +0xc44d: "ssyonj" +0xc44e: "ssyonh" +0xc44f: "ssyod" +0xc450: "ssyol" +0xc451: "ssyolg" +0xc452: "ssyolm" +0xc453: "ssyolb" +0xc454: "ssyols" +0xc455: "ssyolt" +0xc456: "ssyolp" +0xc457: "ssyolh" +0xc458: "ssyom" +0xc459: "ssyob" +0xc45a: "ssyobs" +0xc45b: "ssyos" +0xc45c: "ssyoss" +0xc45d: "ssyong" +0xc45e: "ssyoj" +0xc45f: "ssyoc" +0xc460: "ssyok" +0xc461: "ssyot" +0xc462: "ssyop" +0xc463: "ssyoh" +0xc464: "ssu" +0xc465: "ssug" +0xc466: "ssugg" +0xc467: "ssugs" +0xc468: "ssun" +0xc469: "ssunj" +0xc46a: "ssunh" +0xc46b: "ssud" +0xc46c: "ssul" +0xc46d: "ssulg" +0xc46e: "ssulm" +0xc46f: "ssulb" +0xc470: "ssuls" +0xc471: "ssult" +0xc472: "ssulp" +0xc473: "ssulh" +0xc474: "ssum" +0xc475: "ssub" +0xc476: "ssubs" +0xc477: "ssus" +0xc478: "ssuss" +0xc479: "ssung" +0xc47a: "ssuj" +0xc47b: "ssuc" +0xc47c: "ssuk" +0xc47d: "ssut" +0xc47e: "ssup" +0xc47f: "ssuh" +0xc480: "ssweo" +0xc481: "ssweog" +0xc482: "ssweogg" +0xc483: "ssweogs" +0xc484: "ssweon" +0xc485: "ssweonj" +0xc486: "ssweonh" +0xc487: "ssweod" +0xc488: "ssweol" +0xc489: "ssweolg" +0xc48a: "ssweolm" +0xc48b: "ssweolb" +0xc48c: "ssweols" +0xc48d: "ssweolt" +0xc48e: "ssweolp" +0xc48f: "ssweolh" +0xc490: "ssweom" +0xc491: "ssweob" +0xc492: "ssweobs" +0xc493: "ssweos" +0xc494: "ssweoss" +0xc495: "ssweong" +0xc496: "ssweoj" +0xc497: "ssweoc" +0xc498: "ssweok" +0xc499: "ssweot" +0xc49a: "ssweop" +0xc49b: "ssweoh" +0xc49c: "sswe" +0xc49d: "ssweg" +0xc49e: "sswegg" +0xc49f: "sswegs" +0xc4a0: "sswen" +0xc4a1: "sswenj" +0xc4a2: "sswenh" +0xc4a3: "sswed" +0xc4a4: "sswel" +0xc4a5: "sswelg" +0xc4a6: "sswelm" +0xc4a7: "sswelb" +0xc4a8: "sswels" +0xc4a9: "sswelt" +0xc4aa: "sswelp" +0xc4ab: "sswelh" +0xc4ac: "sswem" +0xc4ad: "ssweb" +0xc4ae: "sswebs" +0xc4af: "sswes" +0xc4b0: "sswess" +0xc4b1: "ssweng" +0xc4b2: "sswej" +0xc4b3: "sswec" +0xc4b4: "sswek" +0xc4b5: "sswet" +0xc4b6: "sswep" +0xc4b7: "ssweh" +0xc4b8: "sswi" +0xc4b9: "sswig" +0xc4ba: "sswigg" +0xc4bb: "sswigs" +0xc4bc: "sswin" +0xc4bd: "sswinj" +0xc4be: "sswinh" +0xc4bf: "sswid" +0xc4c0: "sswil" +0xc4c1: "sswilg" +0xc4c2: "sswilm" +0xc4c3: "sswilb" +0xc4c4: "sswils" +0xc4c5: "sswilt" +0xc4c6: "sswilp" +0xc4c7: "sswilh" +0xc4c8: "sswim" +0xc4c9: "sswib" +0xc4ca: "sswibs" +0xc4cb: "sswis" +0xc4cc: "sswiss" +0xc4cd: "sswing" +0xc4ce: "sswij" +0xc4cf: "sswic" +0xc4d0: "sswik" +0xc4d1: "sswit" +0xc4d2: "sswip" +0xc4d3: "sswih" +0xc4d4: "ssyu" +0xc4d5: "ssyug" +0xc4d6: "ssyugg" +0xc4d7: "ssyugs" +0xc4d8: "ssyun" +0xc4d9: "ssyunj" +0xc4da: "ssyunh" +0xc4db: "ssyud" +0xc4dc: "ssyul" +0xc4dd: "ssyulg" +0xc4de: "ssyulm" +0xc4df: "ssyulb" +0xc4e0: "ssyuls" +0xc4e1: "ssyult" +0xc4e2: "ssyulp" +0xc4e3: "ssyulh" +0xc4e4: "ssyum" +0xc4e5: "ssyub" +0xc4e6: "ssyubs" +0xc4e7: "ssyus" +0xc4e8: "ssyuss" +0xc4e9: "ssyung" +0xc4ea: "ssyuj" +0xc4eb: "ssyuc" +0xc4ec: "ssyuk" +0xc4ed: "ssyut" +0xc4ee: "ssyup" +0xc4ef: "ssyuh" +0xc4f0: "sseu" +0xc4f1: "sseug" +0xc4f2: "sseugg" +0xc4f3: "sseugs" +0xc4f4: "sseun" +0xc4f5: "sseunj" +0xc4f6: "sseunh" +0xc4f7: "sseud" +0xc4f8: "sseul" +0xc4f9: "sseulg" +0xc4fa: "sseulm" +0xc4fb: "sseulb" +0xc4fc: "sseuls" +0xc4fd: "sseult" +0xc4fe: "sseulp" +0xc4ff: "sseulh" +/* x0c5 */ +0xc500: "sseum" +0xc501: "sseub" +0xc502: "sseubs" +0xc503: "sseus" +0xc504: "sseuss" +0xc505: "sseung" +0xc506: "sseuj" +0xc507: "sseuc" +0xc508: "sseuk" +0xc509: "sseut" +0xc50a: "sseup" +0xc50b: "sseuh" +0xc50c: "ssyi" +0xc50d: "ssyig" +0xc50e: "ssyigg" +0xc50f: "ssyigs" +0xc510: "ssyin" +0xc511: "ssyinj" +0xc512: "ssyinh" +0xc513: "ssyid" +0xc514: "ssyil" +0xc515: "ssyilg" +0xc516: "ssyilm" +0xc517: "ssyilb" +0xc518: "ssyils" +0xc519: "ssyilt" +0xc51a: "ssyilp" +0xc51b: "ssyilh" +0xc51c: "ssyim" +0xc51d: "ssyib" +0xc51e: "ssyibs" +0xc51f: "ssyis" +0xc520: "ssyiss" +0xc521: "ssying" +0xc522: "ssyij" +0xc523: "ssyic" +0xc524: "ssyik" +0xc525: "ssyit" +0xc526: "ssyip" +0xc527: "ssyih" +0xc528: "ssi" +0xc529: "ssig" +0xc52a: "ssigg" +0xc52b: "ssigs" +0xc52c: "ssin" +0xc52d: "ssinj" +0xc52e: "ssinh" +0xc52f: "ssid" +0xc530: "ssil" +0xc531: "ssilg" +0xc532: "ssilm" +0xc533: "ssilb" +0xc534: "ssils" +0xc535: "ssilt" +0xc536: "ssilp" +0xc537: "ssilh" +0xc538: "ssim" +0xc539: "ssib" +0xc53a: "ssibs" +0xc53b: "ssis" +0xc53c: "ssiss" +0xc53d: "ssing" +0xc53e: "ssij" +0xc53f: "ssic" +0xc540: "ssik" +0xc541: "ssit" +0xc542: "ssip" +0xc543: "ssih" +0xc544: "a" +0xc545: "ag" +0xc546: "agg" +0xc547: "ags" +0xc548: "an" +0xc549: "anj" +0xc54a: "anh" +0xc54b: "ad" +0xc54c: "al" +0xc54d: "alg" +0xc54e: "alm" +0xc54f: "alb" +0xc550: "als" +0xc551: "alt" +0xc552: "alp" +0xc553: "alh" +0xc554: "am" +0xc555: "ab" +0xc556: "abs" +0xc557: "as" +0xc558: "ass" +0xc559: "ang" +0xc55a: "aj" +0xc55b: "ac" +0xc55c: "ak" +0xc55d: "at" +0xc55e: "ap" +0xc55f: "ah" +0xc560: "ae" +0xc561: "aeg" +0xc562: "aegg" +0xc563: "aegs" +0xc564: "aen" +0xc565: "aenj" +0xc566: "aenh" +0xc567: "aed" +0xc568: "ael" +0xc569: "aelg" +0xc56a: "aelm" +0xc56b: "aelb" +0xc56c: "aels" +0xc56d: "aelt" +0xc56e: "aelp" +0xc56f: "aelh" +0xc570: "aem" +0xc571: "aeb" +0xc572: "aebs" +0xc573: "aes" +0xc574: "aess" +0xc575: "aeng" +0xc576: "aej" +0xc577: "aec" +0xc578: "aek" +0xc579: "aet" +0xc57a: "aep" +0xc57b: "aeh" +0xc57c: "ya" +0xc57d: "yag" +0xc57e: "yagg" +0xc57f: "yags" +0xc580: "yan" +0xc581: "yanj" +0xc582: "yanh" +0xc583: "yad" +0xc584: "yal" +0xc585: "yalg" +0xc586: "yalm" +0xc587: "yalb" +0xc588: "yals" +0xc589: "yalt" +0xc58a: "yalp" +0xc58b: "yalh" +0xc58c: "yam" +0xc58d: "yab" +0xc58e: "yabs" +0xc58f: "yas" +0xc590: "yass" +0xc591: "yang" +0xc592: "yaj" +0xc593: "yac" +0xc594: "yak" +0xc595: "yat" +0xc596: "yap" +0xc597: "yah" +0xc598: "yae" +0xc599: "yaeg" +0xc59a: "yaegg" +0xc59b: "yaegs" +0xc59c: "yaen" +0xc59d: "yaenj" +0xc59e: "yaenh" +0xc59f: "yaed" +0xc5a0: "yael" +0xc5a1: "yaelg" +0xc5a2: "yaelm" +0xc5a3: "yaelb" +0xc5a4: "yaels" +0xc5a5: "yaelt" +0xc5a6: "yaelp" +0xc5a7: "yaelh" +0xc5a8: "yaem" +0xc5a9: "yaeb" +0xc5aa: "yaebs" +0xc5ab: "yaes" +0xc5ac: "yaess" +0xc5ad: "yaeng" +0xc5ae: "yaej" +0xc5af: "yaec" +0xc5b0: "yaek" +0xc5b1: "yaet" +0xc5b2: "yaep" +0xc5b3: "yaeh" +0xc5b4: "eo" +0xc5b5: "eog" +0xc5b6: "eogg" +0xc5b7: "eogs" +0xc5b8: "eon" +0xc5b9: "eonj" +0xc5ba: "eonh" +0xc5bb: "eod" +0xc5bc: "eol" +0xc5bd: "eolg" +0xc5be: "eolm" +0xc5bf: "eolb" +0xc5c0: "eols" +0xc5c1: "eolt" +0xc5c2: "eolp" +0xc5c3: "eolh" +0xc5c4: "eom" +0xc5c5: "eob" +0xc5c6: "eobs" +0xc5c7: "eos" +0xc5c8: "eoss" +0xc5c9: "eong" +0xc5ca: "eoj" +0xc5cb: "eoc" +0xc5cc: "eok" +0xc5cd: "eot" +0xc5ce: "eop" +0xc5cf: "eoh" +0xc5d0: "e" +0xc5d1: "eg" +0xc5d2: "egg" +0xc5d3: "egs" +0xc5d4: "en" +0xc5d5: "enj" +0xc5d6: "enh" +0xc5d7: "ed" +0xc5d8: "el" +0xc5d9: "elg" +0xc5da: "elm" +0xc5db: "elb" +0xc5dc: "els" +0xc5dd: "elt" +0xc5de: "elp" +0xc5df: "elh" +0xc5e0: "em" +0xc5e1: "eb" +0xc5e2: "ebs" +0xc5e3: "es" +0xc5e4: "ess" +0xc5e5: "eng" +0xc5e6: "ej" +0xc5e7: "ec" +0xc5e8: "ek" +0xc5e9: "et" +0xc5ea: "ep" +0xc5eb: "eh" +0xc5ec: "yeo" +0xc5ed: "yeog" +0xc5ee: "yeogg" +0xc5ef: "yeogs" +0xc5f0: "yeon" +0xc5f1: "yeonj" +0xc5f2: "yeonh" +0xc5f3: "yeod" +0xc5f4: "yeol" +0xc5f5: "yeolg" +0xc5f6: "yeolm" +0xc5f7: "yeolb" +0xc5f8: "yeols" +0xc5f9: "yeolt" +0xc5fa: "yeolp" +0xc5fb: "yeolh" +0xc5fc: "yeom" +0xc5fd: "yeob" +0xc5fe: "yeobs" +0xc5ff: "yeos" +/* x0c6 */ +0xc600: "yeoss" +0xc601: "yeong" +0xc602: "yeoj" +0xc603: "yeoc" +0xc604: "yeok" +0xc605: "yeot" +0xc606: "yeop" +0xc607: "yeoh" +0xc608: "ye" +0xc609: "yeg" +0xc60a: "yegg" +0xc60b: "yegs" +0xc60c: "yen" +0xc60d: "yenj" +0xc60e: "yenh" +0xc60f: "yed" +0xc610: "yel" +0xc611: "yelg" +0xc612: "yelm" +0xc613: "yelb" +0xc614: "yels" +0xc615: "yelt" +0xc616: "yelp" +0xc617: "yelh" +0xc618: "yem" +0xc619: "yeb" +0xc61a: "yebs" +0xc61b: "yes" +0xc61c: "yess" +0xc61d: "yeng" +0xc61e: "yej" +0xc61f: "yec" +0xc620: "yek" +0xc621: "yet" +0xc622: "yep" +0xc623: "yeh" +0xc624: "o" +0xc625: "og" +0xc626: "ogg" +0xc627: "ogs" +0xc628: "on" +0xc629: "onj" +0xc62a: "onh" +0xc62b: "od" +0xc62c: "ol" +0xc62d: "olg" +0xc62e: "olm" +0xc62f: "olb" +0xc630: "ols" +0xc631: "olt" +0xc632: "olp" +0xc633: "olh" +0xc634: "om" +0xc635: "ob" +0xc636: "obs" +0xc637: "os" +0xc638: "oss" +0xc639: "ong" +0xc63a: "oj" +0xc63b: "oc" +0xc63c: "ok" +0xc63d: "ot" +0xc63e: "op" +0xc63f: "oh" +0xc640: "wa" +0xc641: "wag" +0xc642: "wagg" +0xc643: "wags" +0xc644: "wan" +0xc645: "wanj" +0xc646: "wanh" +0xc647: "wad" +0xc648: "wal" +0xc649: "walg" +0xc64a: "walm" +0xc64b: "walb" +0xc64c: "wals" +0xc64d: "walt" +0xc64e: "walp" +0xc64f: "walh" +0xc650: "wam" +0xc651: "wab" +0xc652: "wabs" +0xc653: "was" +0xc654: "wass" +0xc655: "wang" +0xc656: "waj" +0xc657: "wac" +0xc658: "wak" +0xc659: "wat" +0xc65a: "wap" +0xc65b: "wah" +0xc65c: "wae" +0xc65d: "waeg" +0xc65e: "waegg" +0xc65f: "waegs" +0xc660: "waen" +0xc661: "waenj" +0xc662: "waenh" +0xc663: "waed" +0xc664: "wael" +0xc665: "waelg" +0xc666: "waelm" +0xc667: "waelb" +0xc668: "waels" +0xc669: "waelt" +0xc66a: "waelp" +0xc66b: "waelh" +0xc66c: "waem" +0xc66d: "waeb" +0xc66e: "waebs" +0xc66f: "waes" +0xc670: "waess" +0xc671: "waeng" +0xc672: "waej" +0xc673: "waec" +0xc674: "waek" +0xc675: "waet" +0xc676: "waep" +0xc677: "waeh" +0xc678: "oe" +0xc679: "oeg" +0xc67a: "oegg" +0xc67b: "oegs" +0xc67c: "oen" +0xc67d: "oenj" +0xc67e: "oenh" +0xc67f: "oed" +0xc680: "oel" +0xc681: "oelg" +0xc682: "oelm" +0xc683: "oelb" +0xc684: "oels" +0xc685: "oelt" +0xc686: "oelp" +0xc687: "oelh" +0xc688: "oem" +0xc689: "oeb" +0xc68a: "oebs" +0xc68b: "oes" +0xc68c: "oess" +0xc68d: "oeng" +0xc68e: "oej" +0xc68f: "oec" +0xc690: "oek" +0xc691: "oet" +0xc692: "oep" +0xc693: "oeh" +0xc694: "yo" +0xc695: "yog" +0xc696: "yogg" +0xc697: "yogs" +0xc698: "yon" +0xc699: "yonj" +0xc69a: "yonh" +0xc69b: "yod" +0xc69c: "yol" +0xc69d: "yolg" +0xc69e: "yolm" +0xc69f: "yolb" +0xc6a0: "yols" +0xc6a1: "yolt" +0xc6a2: "yolp" +0xc6a3: "yolh" +0xc6a4: "yom" +0xc6a5: "yob" +0xc6a6: "yobs" +0xc6a7: "yos" +0xc6a8: "yoss" +0xc6a9: "yong" +0xc6aa: "yoj" +0xc6ab: "yoc" +0xc6ac: "yok" +0xc6ad: "yot" +0xc6ae: "yop" +0xc6af: "yoh" +0xc6b0: "u" +0xc6b1: "ug" +0xc6b2: "ugg" +0xc6b3: "ugs" +0xc6b4: "un" +0xc6b5: "unj" +0xc6b6: "unh" +0xc6b7: "ud" +0xc6b8: "ul" +0xc6b9: "ulg" +0xc6ba: "ulm" +0xc6bb: "ulb" +0xc6bc: "uls" +0xc6bd: "ult" +0xc6be: "ulp" +0xc6bf: "ulh" +0xc6c0: "um" +0xc6c1: "ub" +0xc6c2: "ubs" +0xc6c3: "us" +0xc6c4: "uss" +0xc6c5: "ung" +0xc6c6: "uj" +0xc6c7: "uc" +0xc6c8: "uk" +0xc6c9: "ut" +0xc6ca: "up" +0xc6cb: "uh" +0xc6cc: "weo" +0xc6cd: "weog" +0xc6ce: "weogg" +0xc6cf: "weogs" +0xc6d0: "weon" +0xc6d1: "weonj" +0xc6d2: "weonh" +0xc6d3: "weod" +0xc6d4: "weol" +0xc6d5: "weolg" +0xc6d6: "weolm" +0xc6d7: "weolb" +0xc6d8: "weols" +0xc6d9: "weolt" +0xc6da: "weolp" +0xc6db: "weolh" +0xc6dc: "weom" +0xc6dd: "weob" +0xc6de: "weobs" +0xc6df: "weos" +0xc6e0: "weoss" +0xc6e1: "weong" +0xc6e2: "weoj" +0xc6e3: "weoc" +0xc6e4: "weok" +0xc6e5: "weot" +0xc6e6: "weop" +0xc6e7: "weoh" +0xc6e8: "we" +0xc6e9: "weg" +0xc6ea: "wegg" +0xc6eb: "wegs" +0xc6ec: "wen" +0xc6ed: "wenj" +0xc6ee: "wenh" +0xc6ef: "wed" +0xc6f0: "wel" +0xc6f1: "welg" +0xc6f2: "welm" +0xc6f3: "welb" +0xc6f4: "wels" +0xc6f5: "welt" +0xc6f6: "welp" +0xc6f7: "welh" +0xc6f8: "wem" +0xc6f9: "web" +0xc6fa: "webs" +0xc6fb: "wes" +0xc6fc: "wess" +0xc6fd: "weng" +0xc6fe: "wej" +0xc6ff: "wec" +/* x0c7 */ +0xc700: "wek" +0xc701: "wet" +0xc702: "wep" +0xc703: "weh" +0xc704: "wi" +0xc705: "wig" +0xc706: "wigg" +0xc707: "wigs" +0xc708: "win" +0xc709: "winj" +0xc70a: "winh" +0xc70b: "wid" +0xc70c: "wil" +0xc70d: "wilg" +0xc70e: "wilm" +0xc70f: "wilb" +0xc710: "wils" +0xc711: "wilt" +0xc712: "wilp" +0xc713: "wilh" +0xc714: "wim" +0xc715: "wib" +0xc716: "wibs" +0xc717: "wis" +0xc718: "wiss" +0xc719: "wing" +0xc71a: "wij" +0xc71b: "wic" +0xc71c: "wik" +0xc71d: "wit" +0xc71e: "wip" +0xc71f: "wih" +0xc720: "yu" +0xc721: "yug" +0xc722: "yugg" +0xc723: "yugs" +0xc724: "yun" +0xc725: "yunj" +0xc726: "yunh" +0xc727: "yud" +0xc728: "yul" +0xc729: "yulg" +0xc72a: "yulm" +0xc72b: "yulb" +0xc72c: "yuls" +0xc72d: "yult" +0xc72e: "yulp" +0xc72f: "yulh" +0xc730: "yum" +0xc731: "yub" +0xc732: "yubs" +0xc733: "yus" +0xc734: "yuss" +0xc735: "yung" +0xc736: "yuj" +0xc737: "yuc" +0xc738: "yuk" +0xc739: "yut" +0xc73a: "yup" +0xc73b: "yuh" +0xc73c: "eu" +0xc73d: "eug" +0xc73e: "eugg" +0xc73f: "eugs" +0xc740: "eun" +0xc741: "eunj" +0xc742: "eunh" +0xc743: "eud" +0xc744: "eul" +0xc745: "eulg" +0xc746: "eulm" +0xc747: "eulb" +0xc748: "euls" +0xc749: "eult" +0xc74a: "eulp" +0xc74b: "eulh" +0xc74c: "eum" +0xc74d: "eub" +0xc74e: "eubs" +0xc74f: "eus" +0xc750: "euss" +0xc751: "eung" +0xc752: "euj" +0xc753: "euc" +0xc754: "euk" +0xc755: "eut" +0xc756: "eup" +0xc757: "euh" +0xc758: "yi" +0xc759: "yig" +0xc75a: "yigg" +0xc75b: "yigs" +0xc75c: "yin" +0xc75d: "yinj" +0xc75e: "yinh" +0xc75f: "yid" +0xc760: "yil" +0xc761: "yilg" +0xc762: "yilm" +0xc763: "yilb" +0xc764: "yils" +0xc765: "yilt" +0xc766: "yilp" +0xc767: "yilh" +0xc768: "yim" +0xc769: "yib" +0xc76a: "yibs" +0xc76b: "yis" +0xc76c: "yiss" +0xc76d: "ying" +0xc76e: "yij" +0xc76f: "yic" +0xc770: "yik" +0xc771: "yit" +0xc772: "yip" +0xc773: "yih" +0xc774: "i" +0xc775: "ig" +0xc776: "igg" +0xc777: "igs" +0xc778: "in" +0xc779: "inj" +0xc77a: "inh" +0xc77b: "id" +0xc77c: "il" +0xc77d: "ilg" +0xc77e: "ilm" +0xc77f: "ilb" +0xc780: "ils" +0xc781: "ilt" +0xc782: "ilp" +0xc783: "ilh" +0xc784: "im" +0xc785: "ib" +0xc786: "ibs" +0xc787: "is" +0xc788: "iss" +0xc789: "ing" +0xc78a: "ij" +0xc78b: "ic" +0xc78c: "ik" +0xc78d: "it" +0xc78e: "ip" +0xc78f: "ih" +0xc790: "ja" +0xc791: "jag" +0xc792: "jagg" +0xc793: "jags" +0xc794: "jan" +0xc795: "janj" +0xc796: "janh" +0xc797: "jad" +0xc798: "jal" +0xc799: "jalg" +0xc79a: "jalm" +0xc79b: "jalb" +0xc79c: "jals" +0xc79d: "jalt" +0xc79e: "jalp" +0xc79f: "jalh" +0xc7a0: "jam" +0xc7a1: "jab" +0xc7a2: "jabs" +0xc7a3: "jas" +0xc7a4: "jass" +0xc7a5: "jang" +0xc7a6: "jaj" +0xc7a7: "jac" +0xc7a8: "jak" +0xc7a9: "jat" +0xc7aa: "jap" +0xc7ab: "jah" +0xc7ac: "jae" +0xc7ad: "jaeg" +0xc7ae: "jaegg" +0xc7af: "jaegs" +0xc7b0: "jaen" +0xc7b1: "jaenj" +0xc7b2: "jaenh" +0xc7b3: "jaed" +0xc7b4: "jael" +0xc7b5: "jaelg" +0xc7b6: "jaelm" +0xc7b7: "jaelb" +0xc7b8: "jaels" +0xc7b9: "jaelt" +0xc7ba: "jaelp" +0xc7bb: "jaelh" +0xc7bc: "jaem" +0xc7bd: "jaeb" +0xc7be: "jaebs" +0xc7bf: "jaes" +0xc7c0: "jaess" +0xc7c1: "jaeng" +0xc7c2: "jaej" +0xc7c3: "jaec" +0xc7c4: "jaek" +0xc7c5: "jaet" +0xc7c6: "jaep" +0xc7c7: "jaeh" +0xc7c8: "jya" +0xc7c9: "jyag" +0xc7ca: "jyagg" +0xc7cb: "jyags" +0xc7cc: "jyan" +0xc7cd: "jyanj" +0xc7ce: "jyanh" +0xc7cf: "jyad" +0xc7d0: "jyal" +0xc7d1: "jyalg" +0xc7d2: "jyalm" +0xc7d3: "jyalb" +0xc7d4: "jyals" +0xc7d5: "jyalt" +0xc7d6: "jyalp" +0xc7d7: "jyalh" +0xc7d8: "jyam" +0xc7d9: "jyab" +0xc7da: "jyabs" +0xc7db: "jyas" +0xc7dc: "jyass" +0xc7dd: "jyang" +0xc7de: "jyaj" +0xc7df: "jyac" +0xc7e0: "jyak" +0xc7e1: "jyat" +0xc7e2: "jyap" +0xc7e3: "jyah" +0xc7e4: "jyae" +0xc7e5: "jyaeg" +0xc7e6: "jyaegg" +0xc7e7: "jyaegs" +0xc7e8: "jyaen" +0xc7e9: "jyaenj" +0xc7ea: "jyaenh" +0xc7eb: "jyaed" +0xc7ec: "jyael" +0xc7ed: "jyaelg" +0xc7ee: "jyaelm" +0xc7ef: "jyaelb" +0xc7f0: "jyaels" +0xc7f1: "jyaelt" +0xc7f2: "jyaelp" +0xc7f3: "jyaelh" +0xc7f4: "jyaem" +0xc7f5: "jyaeb" +0xc7f6: "jyaebs" +0xc7f7: "jyaes" +0xc7f8: "jyaess" +0xc7f9: "jyaeng" +0xc7fa: "jyaej" +0xc7fb: "jyaec" +0xc7fc: "jyaek" +0xc7fd: "jyaet" +0xc7fe: "jyaep" +0xc7ff: "jyaeh" +/* x0c8 */ +0xc800: "jeo" +0xc801: "jeog" +0xc802: "jeogg" +0xc803: "jeogs" +0xc804: "jeon" +0xc805: "jeonj" +0xc806: "jeonh" +0xc807: "jeod" +0xc808: "jeol" +0xc809: "jeolg" +0xc80a: "jeolm" +0xc80b: "jeolb" +0xc80c: "jeols" +0xc80d: "jeolt" +0xc80e: "jeolp" +0xc80f: "jeolh" +0xc810: "jeom" +0xc811: "jeob" +0xc812: "jeobs" +0xc813: "jeos" +0xc814: "jeoss" +0xc815: "jeong" +0xc816: "jeoj" +0xc817: "jeoc" +0xc818: "jeok" +0xc819: "jeot" +0xc81a: "jeop" +0xc81b: "jeoh" +0xc81c: "je" +0xc81d: "jeg" +0xc81e: "jegg" +0xc81f: "jegs" +0xc820: "jen" +0xc821: "jenj" +0xc822: "jenh" +0xc823: "jed" +0xc824: "jel" +0xc825: "jelg" +0xc826: "jelm" +0xc827: "jelb" +0xc828: "jels" +0xc829: "jelt" +0xc82a: "jelp" +0xc82b: "jelh" +0xc82c: "jem" +0xc82d: "jeb" +0xc82e: "jebs" +0xc82f: "jes" +0xc830: "jess" +0xc831: "jeng" +0xc832: "jej" +0xc833: "jec" +0xc834: "jek" +0xc835: "jet" +0xc836: "jep" +0xc837: "jeh" +0xc838: "jyeo" +0xc839: "jyeog" +0xc83a: "jyeogg" +0xc83b: "jyeogs" +0xc83c: "jyeon" +0xc83d: "jyeonj" +0xc83e: "jyeonh" +0xc83f: "jyeod" +0xc840: "jyeol" +0xc841: "jyeolg" +0xc842: "jyeolm" +0xc843: "jyeolb" +0xc844: "jyeols" +0xc845: "jyeolt" +0xc846: "jyeolp" +0xc847: "jyeolh" +0xc848: "jyeom" +0xc849: "jyeob" +0xc84a: "jyeobs" +0xc84b: "jyeos" +0xc84c: "jyeoss" +0xc84d: "jyeong" +0xc84e: "jyeoj" +0xc84f: "jyeoc" +0xc850: "jyeok" +0xc851: "jyeot" +0xc852: "jyeop" +0xc853: "jyeoh" +0xc854: "jye" +0xc855: "jyeg" +0xc856: "jyegg" +0xc857: "jyegs" +0xc858: "jyen" +0xc859: "jyenj" +0xc85a: "jyenh" +0xc85b: "jyed" +0xc85c: "jyel" +0xc85d: "jyelg" +0xc85e: "jyelm" +0xc85f: "jyelb" +0xc860: "jyels" +0xc861: "jyelt" +0xc862: "jyelp" +0xc863: "jyelh" +0xc864: "jyem" +0xc865: "jyeb" +0xc866: "jyebs" +0xc867: "jyes" +0xc868: "jyess" +0xc869: "jyeng" +0xc86a: "jyej" +0xc86b: "jyec" +0xc86c: "jyek" +0xc86d: "jyet" +0xc86e: "jyep" +0xc86f: "jyeh" +0xc870: "jo" +0xc871: "jog" +0xc872: "jogg" +0xc873: "jogs" +0xc874: "jon" +0xc875: "jonj" +0xc876: "jonh" +0xc877: "jod" +0xc878: "jol" +0xc879: "jolg" +0xc87a: "jolm" +0xc87b: "jolb" +0xc87c: "jols" +0xc87d: "jolt" +0xc87e: "jolp" +0xc87f: "jolh" +0xc880: "jom" +0xc881: "job" +0xc882: "jobs" +0xc883: "jos" +0xc884: "joss" +0xc885: "jong" +0xc886: "joj" +0xc887: "joc" +0xc888: "jok" +0xc889: "jot" +0xc88a: "jop" +0xc88b: "joh" +0xc88c: "jwa" +0xc88d: "jwag" +0xc88e: "jwagg" +0xc88f: "jwags" +0xc890: "jwan" +0xc891: "jwanj" +0xc892: "jwanh" +0xc893: "jwad" +0xc894: "jwal" +0xc895: "jwalg" +0xc896: "jwalm" +0xc897: "jwalb" +0xc898: "jwals" +0xc899: "jwalt" +0xc89a: "jwalp" +0xc89b: "jwalh" +0xc89c: "jwam" +0xc89d: "jwab" +0xc89e: "jwabs" +0xc89f: "jwas" +0xc8a0: "jwass" +0xc8a1: "jwang" +0xc8a2: "jwaj" +0xc8a3: "jwac" +0xc8a4: "jwak" +0xc8a5: "jwat" +0xc8a6: "jwap" +0xc8a7: "jwah" +0xc8a8: "jwae" +0xc8a9: "jwaeg" +0xc8aa: "jwaegg" +0xc8ab: "jwaegs" +0xc8ac: "jwaen" +0xc8ad: "jwaenj" +0xc8ae: "jwaenh" +0xc8af: "jwaed" +0xc8b0: "jwael" +0xc8b1: "jwaelg" +0xc8b2: "jwaelm" +0xc8b3: "jwaelb" +0xc8b4: "jwaels" +0xc8b5: "jwaelt" +0xc8b6: "jwaelp" +0xc8b7: "jwaelh" +0xc8b8: "jwaem" +0xc8b9: "jwaeb" +0xc8ba: "jwaebs" +0xc8bb: "jwaes" +0xc8bc: "jwaess" +0xc8bd: "jwaeng" +0xc8be: "jwaej" +0xc8bf: "jwaec" +0xc8c0: "jwaek" +0xc8c1: "jwaet" +0xc8c2: "jwaep" +0xc8c3: "jwaeh" +0xc8c4: "joe" +0xc8c5: "joeg" +0xc8c6: "joegg" +0xc8c7: "joegs" +0xc8c8: "joen" +0xc8c9: "joenj" +0xc8ca: "joenh" +0xc8cb: "joed" +0xc8cc: "joel" +0xc8cd: "joelg" +0xc8ce: "joelm" +0xc8cf: "joelb" +0xc8d0: "joels" +0xc8d1: "joelt" +0xc8d2: "joelp" +0xc8d3: "joelh" +0xc8d4: "joem" +0xc8d5: "joeb" +0xc8d6: "joebs" +0xc8d7: "joes" +0xc8d8: "joess" +0xc8d9: "joeng" +0xc8da: "joej" +0xc8db: "joec" +0xc8dc: "joek" +0xc8dd: "joet" +0xc8de: "joep" +0xc8df: "joeh" +0xc8e0: "jyo" +0xc8e1: "jyog" +0xc8e2: "jyogg" +0xc8e3: "jyogs" +0xc8e4: "jyon" +0xc8e5: "jyonj" +0xc8e6: "jyonh" +0xc8e7: "jyod" +0xc8e8: "jyol" +0xc8e9: "jyolg" +0xc8ea: "jyolm" +0xc8eb: "jyolb" +0xc8ec: "jyols" +0xc8ed: "jyolt" +0xc8ee: "jyolp" +0xc8ef: "jyolh" +0xc8f0: "jyom" +0xc8f1: "jyob" +0xc8f2: "jyobs" +0xc8f3: "jyos" +0xc8f4: "jyoss" +0xc8f5: "jyong" +0xc8f6: "jyoj" +0xc8f7: "jyoc" +0xc8f8: "jyok" +0xc8f9: "jyot" +0xc8fa: "jyop" +0xc8fb: "jyoh" +0xc8fc: "ju" +0xc8fd: "jug" +0xc8fe: "jugg" +0xc8ff: "jugs" +/* x0c9 */ +0xc900: "jun" +0xc901: "junj" +0xc902: "junh" +0xc903: "jud" +0xc904: "jul" +0xc905: "julg" +0xc906: "julm" +0xc907: "julb" +0xc908: "juls" +0xc909: "jult" +0xc90a: "julp" +0xc90b: "julh" +0xc90c: "jum" +0xc90d: "jub" +0xc90e: "jubs" +0xc90f: "jus" +0xc910: "juss" +0xc911: "jung" +0xc912: "juj" +0xc913: "juc" +0xc914: "juk" +0xc915: "jut" +0xc916: "jup" +0xc917: "juh" +0xc918: "jweo" +0xc919: "jweog" +0xc91a: "jweogg" +0xc91b: "jweogs" +0xc91c: "jweon" +0xc91d: "jweonj" +0xc91e: "jweonh" +0xc91f: "jweod" +0xc920: "jweol" +0xc921: "jweolg" +0xc922: "jweolm" +0xc923: "jweolb" +0xc924: "jweols" +0xc925: "jweolt" +0xc926: "jweolp" +0xc927: "jweolh" +0xc928: "jweom" +0xc929: "jweob" +0xc92a: "jweobs" +0xc92b: "jweos" +0xc92c: "jweoss" +0xc92d: "jweong" +0xc92e: "jweoj" +0xc92f: "jweoc" +0xc930: "jweok" +0xc931: "jweot" +0xc932: "jweop" +0xc933: "jweoh" +0xc934: "jwe" +0xc935: "jweg" +0xc936: "jwegg" +0xc937: "jwegs" +0xc938: "jwen" +0xc939: "jwenj" +0xc93a: "jwenh" +0xc93b: "jwed" +0xc93c: "jwel" +0xc93d: "jwelg" +0xc93e: "jwelm" +0xc93f: "jwelb" +0xc940: "jwels" +0xc941: "jwelt" +0xc942: "jwelp" +0xc943: "jwelh" +0xc944: "jwem" +0xc945: "jweb" +0xc946: "jwebs" +0xc947: "jwes" +0xc948: "jwess" +0xc949: "jweng" +0xc94a: "jwej" +0xc94b: "jwec" +0xc94c: "jwek" +0xc94d: "jwet" +0xc94e: "jwep" +0xc94f: "jweh" +0xc950: "jwi" +0xc951: "jwig" +0xc952: "jwigg" +0xc953: "jwigs" +0xc954: "jwin" +0xc955: "jwinj" +0xc956: "jwinh" +0xc957: "jwid" +0xc958: "jwil" +0xc959: "jwilg" +0xc95a: "jwilm" +0xc95b: "jwilb" +0xc95c: "jwils" +0xc95d: "jwilt" +0xc95e: "jwilp" +0xc95f: "jwilh" +0xc960: "jwim" +0xc961: "jwib" +0xc962: "jwibs" +0xc963: "jwis" +0xc964: "jwiss" +0xc965: "jwing" +0xc966: "jwij" +0xc967: "jwic" +0xc968: "jwik" +0xc969: "jwit" +0xc96a: "jwip" +0xc96b: "jwih" +0xc96c: "jyu" +0xc96d: "jyug" +0xc96e: "jyugg" +0xc96f: "jyugs" +0xc970: "jyun" +0xc971: "jyunj" +0xc972: "jyunh" +0xc973: "jyud" +0xc974: "jyul" +0xc975: "jyulg" +0xc976: "jyulm" +0xc977: "jyulb" +0xc978: "jyuls" +0xc979: "jyult" +0xc97a: "jyulp" +0xc97b: "jyulh" +0xc97c: "jyum" +0xc97d: "jyub" +0xc97e: "jyubs" +0xc97f: "jyus" +0xc980: "jyuss" +0xc981: "jyung" +0xc982: "jyuj" +0xc983: "jyuc" +0xc984: "jyuk" +0xc985: "jyut" +0xc986: "jyup" +0xc987: "jyuh" +0xc988: "jeu" +0xc989: "jeug" +0xc98a: "jeugg" +0xc98b: "jeugs" +0xc98c: "jeun" +0xc98d: "jeunj" +0xc98e: "jeunh" +0xc98f: "jeud" +0xc990: "jeul" +0xc991: "jeulg" +0xc992: "jeulm" +0xc993: "jeulb" +0xc994: "jeuls" +0xc995: "jeult" +0xc996: "jeulp" +0xc997: "jeulh" +0xc998: "jeum" +0xc999: "jeub" +0xc99a: "jeubs" +0xc99b: "jeus" +0xc99c: "jeuss" +0xc99d: "jeung" +0xc99e: "jeuj" +0xc99f: "jeuc" +0xc9a0: "jeuk" +0xc9a1: "jeut" +0xc9a2: "jeup" +0xc9a3: "jeuh" +0xc9a4: "jyi" +0xc9a5: "jyig" +0xc9a6: "jyigg" +0xc9a7: "jyigs" +0xc9a8: "jyin" +0xc9a9: "jyinj" +0xc9aa: "jyinh" +0xc9ab: "jyid" +0xc9ac: "jyil" +0xc9ad: "jyilg" +0xc9ae: "jyilm" +0xc9af: "jyilb" +0xc9b0: "jyils" +0xc9b1: "jyilt" +0xc9b2: "jyilp" +0xc9b3: "jyilh" +0xc9b4: "jyim" +0xc9b5: "jyib" +0xc9b6: "jyibs" +0xc9b7: "jyis" +0xc9b8: "jyiss" +0xc9b9: "jying" +0xc9ba: "jyij" +0xc9bb: "jyic" +0xc9bc: "jyik" +0xc9bd: "jyit" +0xc9be: "jyip" +0xc9bf: "jyih" +0xc9c0: "ji" +0xc9c1: "jig" +0xc9c2: "jigg" +0xc9c3: "jigs" +0xc9c4: "jin" +0xc9c5: "jinj" +0xc9c6: "jinh" +0xc9c7: "jid" +0xc9c8: "jil" +0xc9c9: "jilg" +0xc9ca: "jilm" +0xc9cb: "jilb" +0xc9cc: "jils" +0xc9cd: "jilt" +0xc9ce: "jilp" +0xc9cf: "jilh" +0xc9d0: "jim" +0xc9d1: "jib" +0xc9d2: "jibs" +0xc9d3: "jis" +0xc9d4: "jiss" +0xc9d5: "jing" +0xc9d6: "jij" +0xc9d7: "jic" +0xc9d8: "jik" +0xc9d9: "jit" +0xc9da: "jip" +0xc9db: "jih" +0xc9dc: "jja" +0xc9dd: "jjag" +0xc9de: "jjagg" +0xc9df: "jjags" +0xc9e0: "jjan" +0xc9e1: "jjanj" +0xc9e2: "jjanh" +0xc9e3: "jjad" +0xc9e4: "jjal" +0xc9e5: "jjalg" +0xc9e6: "jjalm" +0xc9e7: "jjalb" +0xc9e8: "jjals" +0xc9e9: "jjalt" +0xc9ea: "jjalp" +0xc9eb: "jjalh" +0xc9ec: "jjam" +0xc9ed: "jjab" +0xc9ee: "jjabs" +0xc9ef: "jjas" +0xc9f0: "jjass" +0xc9f1: "jjang" +0xc9f2: "jjaj" +0xc9f3: "jjac" +0xc9f4: "jjak" +0xc9f5: "jjat" +0xc9f6: "jjap" +0xc9f7: "jjah" +0xc9f8: "jjae" +0xc9f9: "jjaeg" +0xc9fa: "jjaegg" +0xc9fb: "jjaegs" +0xc9fc: "jjaen" +0xc9fd: "jjaenj" +0xc9fe: "jjaenh" +0xc9ff: "jjaed" +/* x0ca */ +0xca00: "jjael" +0xca01: "jjaelg" +0xca02: "jjaelm" +0xca03: "jjaelb" +0xca04: "jjaels" +0xca05: "jjaelt" +0xca06: "jjaelp" +0xca07: "jjaelh" +0xca08: "jjaem" +0xca09: "jjaeb" +0xca0a: "jjaebs" +0xca0b: "jjaes" +0xca0c: "jjaess" +0xca0d: "jjaeng" +0xca0e: "jjaej" +0xca0f: "jjaec" +0xca10: "jjaek" +0xca11: "jjaet" +0xca12: "jjaep" +0xca13: "jjaeh" +0xca14: "jjya" +0xca15: "jjyag" +0xca16: "jjyagg" +0xca17: "jjyags" +0xca18: "jjyan" +0xca19: "jjyanj" +0xca1a: "jjyanh" +0xca1b: "jjyad" +0xca1c: "jjyal" +0xca1d: "jjyalg" +0xca1e: "jjyalm" +0xca1f: "jjyalb" +0xca20: "jjyals" +0xca21: "jjyalt" +0xca22: "jjyalp" +0xca23: "jjyalh" +0xca24: "jjyam" +0xca25: "jjyab" +0xca26: "jjyabs" +0xca27: "jjyas" +0xca28: "jjyass" +0xca29: "jjyang" +0xca2a: "jjyaj" +0xca2b: "jjyac" +0xca2c: "jjyak" +0xca2d: "jjyat" +0xca2e: "jjyap" +0xca2f: "jjyah" +0xca30: "jjyae" +0xca31: "jjyaeg" +0xca32: "jjyaegg" +0xca33: "jjyaegs" +0xca34: "jjyaen" +0xca35: "jjyaenj" +0xca36: "jjyaenh" +0xca37: "jjyaed" +0xca38: "jjyael" +0xca39: "jjyaelg" +0xca3a: "jjyaelm" +0xca3b: "jjyaelb" +0xca3c: "jjyaels" +0xca3d: "jjyaelt" +0xca3e: "jjyaelp" +0xca3f: "jjyaelh" +0xca40: "jjyaem" +0xca41: "jjyaeb" +0xca42: "jjyaebs" +0xca43: "jjyaes" +0xca44: "jjyaess" +0xca45: "jjyaeng" +0xca46: "jjyaej" +0xca47: "jjyaec" +0xca48: "jjyaek" +0xca49: "jjyaet" +0xca4a: "jjyaep" +0xca4b: "jjyaeh" +0xca4c: "jjeo" +0xca4d: "jjeog" +0xca4e: "jjeogg" +0xca4f: "jjeogs" +0xca50: "jjeon" +0xca51: "jjeonj" +0xca52: "jjeonh" +0xca53: "jjeod" +0xca54: "jjeol" +0xca55: "jjeolg" +0xca56: "jjeolm" +0xca57: "jjeolb" +0xca58: "jjeols" +0xca59: "jjeolt" +0xca5a: "jjeolp" +0xca5b: "jjeolh" +0xca5c: "jjeom" +0xca5d: "jjeob" +0xca5e: "jjeobs" +0xca5f: "jjeos" +0xca60: "jjeoss" +0xca61: "jjeong" +0xca62: "jjeoj" +0xca63: "jjeoc" +0xca64: "jjeok" +0xca65: "jjeot" +0xca66: "jjeop" +0xca67: "jjeoh" +0xca68: "jje" +0xca69: "jjeg" +0xca6a: "jjegg" +0xca6b: "jjegs" +0xca6c: "jjen" +0xca6d: "jjenj" +0xca6e: "jjenh" +0xca6f: "jjed" +0xca70: "jjel" +0xca71: "jjelg" +0xca72: "jjelm" +0xca73: "jjelb" +0xca74: "jjels" +0xca75: "jjelt" +0xca76: "jjelp" +0xca77: "jjelh" +0xca78: "jjem" +0xca79: "jjeb" +0xca7a: "jjebs" +0xca7b: "jjes" +0xca7c: "jjess" +0xca7d: "jjeng" +0xca7e: "jjej" +0xca7f: "jjec" +0xca80: "jjek" +0xca81: "jjet" +0xca82: "jjep" +0xca83: "jjeh" +0xca84: "jjyeo" +0xca85: "jjyeog" +0xca86: "jjyeogg" +0xca87: "jjyeogs" +0xca88: "jjyeon" +0xca89: "jjyeonj" +0xca8a: "jjyeonh" +0xca8b: "jjyeod" +0xca8c: "jjyeol" +0xca8d: "jjyeolg" +0xca8e: "jjyeolm" +0xca8f: "jjyeolb" +0xca90: "jjyeols" +0xca91: "jjyeolt" +0xca92: "jjyeolp" +0xca93: "jjyeolh" +0xca94: "jjyeom" +0xca95: "jjyeob" +0xca96: "jjyeobs" +0xca97: "jjyeos" +0xca98: "jjyeoss" +0xca99: "jjyeong" +0xca9a: "jjyeoj" +0xca9b: "jjyeoc" +0xca9c: "jjyeok" +0xca9d: "jjyeot" +0xca9e: "jjyeop" +0xca9f: "jjyeoh" +0xcaa0: "jjye" +0xcaa1: "jjyeg" +0xcaa2: "jjyegg" +0xcaa3: "jjyegs" +0xcaa4: "jjyen" +0xcaa5: "jjyenj" +0xcaa6: "jjyenh" +0xcaa7: "jjyed" +0xcaa8: "jjyel" +0xcaa9: "jjyelg" +0xcaaa: "jjyelm" +0xcaab: "jjyelb" +0xcaac: "jjyels" +0xcaad: "jjyelt" +0xcaae: "jjyelp" +0xcaaf: "jjyelh" +0xcab0: "jjyem" +0xcab1: "jjyeb" +0xcab2: "jjyebs" +0xcab3: "jjyes" +0xcab4: "jjyess" +0xcab5: "jjyeng" +0xcab6: "jjyej" +0xcab7: "jjyec" +0xcab8: "jjyek" +0xcab9: "jjyet" +0xcaba: "jjyep" +0xcabb: "jjyeh" +0xcabc: "jjo" +0xcabd: "jjog" +0xcabe: "jjogg" +0xcabf: "jjogs" +0xcac0: "jjon" +0xcac1: "jjonj" +0xcac2: "jjonh" +0xcac3: "jjod" +0xcac4: "jjol" +0xcac5: "jjolg" +0xcac6: "jjolm" +0xcac7: "jjolb" +0xcac8: "jjols" +0xcac9: "jjolt" +0xcaca: "jjolp" +0xcacb: "jjolh" +0xcacc: "jjom" +0xcacd: "jjob" +0xcace: "jjobs" +0xcacf: "jjos" +0xcad0: "jjoss" +0xcad1: "jjong" +0xcad2: "jjoj" +0xcad3: "jjoc" +0xcad4: "jjok" +0xcad5: "jjot" +0xcad6: "jjop" +0xcad7: "jjoh" +0xcad8: "jjwa" +0xcad9: "jjwag" +0xcada: "jjwagg" +0xcadb: "jjwags" +0xcadc: "jjwan" +0xcadd: "jjwanj" +0xcade: "jjwanh" +0xcadf: "jjwad" +0xcae0: "jjwal" +0xcae1: "jjwalg" +0xcae2: "jjwalm" +0xcae3: "jjwalb" +0xcae4: "jjwals" +0xcae5: "jjwalt" +0xcae6: "jjwalp" +0xcae7: "jjwalh" +0xcae8: "jjwam" +0xcae9: "jjwab" +0xcaea: "jjwabs" +0xcaeb: "jjwas" +0xcaec: "jjwass" +0xcaed: "jjwang" +0xcaee: "jjwaj" +0xcaef: "jjwac" +0xcaf0: "jjwak" +0xcaf1: "jjwat" +0xcaf2: "jjwap" +0xcaf3: "jjwah" +0xcaf4: "jjwae" +0xcaf5: "jjwaeg" +0xcaf6: "jjwaegg" +0xcaf7: "jjwaegs" +0xcaf8: "jjwaen" +0xcaf9: "jjwaenj" +0xcafa: "jjwaenh" +0xcafb: "jjwaed" +0xcafc: "jjwael" +0xcafd: "jjwaelg" +0xcafe: "jjwaelm" +0xcaff: "jjwaelb" +/* x0cb */ +0xcb00: "jjwaels" +0xcb01: "jjwaelt" +0xcb02: "jjwaelp" +0xcb03: "jjwaelh" +0xcb04: "jjwaem" +0xcb05: "jjwaeb" +0xcb06: "jjwaebs" +0xcb07: "jjwaes" +0xcb08: "jjwaess" +0xcb09: "jjwaeng" +0xcb0a: "jjwaej" +0xcb0b: "jjwaec" +0xcb0c: "jjwaek" +0xcb0d: "jjwaet" +0xcb0e: "jjwaep" +0xcb0f: "jjwaeh" +0xcb10: "jjoe" +0xcb11: "jjoeg" +0xcb12: "jjoegg" +0xcb13: "jjoegs" +0xcb14: "jjoen" +0xcb15: "jjoenj" +0xcb16: "jjoenh" +0xcb17: "jjoed" +0xcb18: "jjoel" +0xcb19: "jjoelg" +0xcb1a: "jjoelm" +0xcb1b: "jjoelb" +0xcb1c: "jjoels" +0xcb1d: "jjoelt" +0xcb1e: "jjoelp" +0xcb1f: "jjoelh" +0xcb20: "jjoem" +0xcb21: "jjoeb" +0xcb22: "jjoebs" +0xcb23: "jjoes" +0xcb24: "jjoess" +0xcb25: "jjoeng" +0xcb26: "jjoej" +0xcb27: "jjoec" +0xcb28: "jjoek" +0xcb29: "jjoet" +0xcb2a: "jjoep" +0xcb2b: "jjoeh" +0xcb2c: "jjyo" +0xcb2d: "jjyog" +0xcb2e: "jjyogg" +0xcb2f: "jjyogs" +0xcb30: "jjyon" +0xcb31: "jjyonj" +0xcb32: "jjyonh" +0xcb33: "jjyod" +0xcb34: "jjyol" +0xcb35: "jjyolg" +0xcb36: "jjyolm" +0xcb37: "jjyolb" +0xcb38: "jjyols" +0xcb39: "jjyolt" +0xcb3a: "jjyolp" +0xcb3b: "jjyolh" +0xcb3c: "jjyom" +0xcb3d: "jjyob" +0xcb3e: "jjyobs" +0xcb3f: "jjyos" +0xcb40: "jjyoss" +0xcb41: "jjyong" +0xcb42: "jjyoj" +0xcb43: "jjyoc" +0xcb44: "jjyok" +0xcb45: "jjyot" +0xcb46: "jjyop" +0xcb47: "jjyoh" +0xcb48: "jju" +0xcb49: "jjug" +0xcb4a: "jjugg" +0xcb4b: "jjugs" +0xcb4c: "jjun" +0xcb4d: "jjunj" +0xcb4e: "jjunh" +0xcb4f: "jjud" +0xcb50: "jjul" +0xcb51: "jjulg" +0xcb52: "jjulm" +0xcb53: "jjulb" +0xcb54: "jjuls" +0xcb55: "jjult" +0xcb56: "jjulp" +0xcb57: "jjulh" +0xcb58: "jjum" +0xcb59: "jjub" +0xcb5a: "jjubs" +0xcb5b: "jjus" +0xcb5c: "jjuss" +0xcb5d: "jjung" +0xcb5e: "jjuj" +0xcb5f: "jjuc" +0xcb60: "jjuk" +0xcb61: "jjut" +0xcb62: "jjup" +0xcb63: "jjuh" +0xcb64: "jjweo" +0xcb65: "jjweog" +0xcb66: "jjweogg" +0xcb67: "jjweogs" +0xcb68: "jjweon" +0xcb69: "jjweonj" +0xcb6a: "jjweonh" +0xcb6b: "jjweod" +0xcb6c: "jjweol" +0xcb6d: "jjweolg" +0xcb6e: "jjweolm" +0xcb6f: "jjweolb" +0xcb70: "jjweols" +0xcb71: "jjweolt" +0xcb72: "jjweolp" +0xcb73: "jjweolh" +0xcb74: "jjweom" +0xcb75: "jjweob" +0xcb76: "jjweobs" +0xcb77: "jjweos" +0xcb78: "jjweoss" +0xcb79: "jjweong" +0xcb7a: "jjweoj" +0xcb7b: "jjweoc" +0xcb7c: "jjweok" +0xcb7d: "jjweot" +0xcb7e: "jjweop" +0xcb7f: "jjweoh" +0xcb80: "jjwe" +0xcb81: "jjweg" +0xcb82: "jjwegg" +0xcb83: "jjwegs" +0xcb84: "jjwen" +0xcb85: "jjwenj" +0xcb86: "jjwenh" +0xcb87: "jjwed" +0xcb88: "jjwel" +0xcb89: "jjwelg" +0xcb8a: "jjwelm" +0xcb8b: "jjwelb" +0xcb8c: "jjwels" +0xcb8d: "jjwelt" +0xcb8e: "jjwelp" +0xcb8f: "jjwelh" +0xcb90: "jjwem" +0xcb91: "jjweb" +0xcb92: "jjwebs" +0xcb93: "jjwes" +0xcb94: "jjwess" +0xcb95: "jjweng" +0xcb96: "jjwej" +0xcb97: "jjwec" +0xcb98: "jjwek" +0xcb99: "jjwet" +0xcb9a: "jjwep" +0xcb9b: "jjweh" +0xcb9c: "jjwi" +0xcb9d: "jjwig" +0xcb9e: "jjwigg" +0xcb9f: "jjwigs" +0xcba0: "jjwin" +0xcba1: "jjwinj" +0xcba2: "jjwinh" +0xcba3: "jjwid" +0xcba4: "jjwil" +0xcba5: "jjwilg" +0xcba6: "jjwilm" +0xcba7: "jjwilb" +0xcba8: "jjwils" +0xcba9: "jjwilt" +0xcbaa: "jjwilp" +0xcbab: "jjwilh" +0xcbac: "jjwim" +0xcbad: "jjwib" +0xcbae: "jjwibs" +0xcbaf: "jjwis" +0xcbb0: "jjwiss" +0xcbb1: "jjwing" +0xcbb2: "jjwij" +0xcbb3: "jjwic" +0xcbb4: "jjwik" +0xcbb5: "jjwit" +0xcbb6: "jjwip" +0xcbb7: "jjwih" +0xcbb8: "jjyu" +0xcbb9: "jjyug" +0xcbba: "jjyugg" +0xcbbb: "jjyugs" +0xcbbc: "jjyun" +0xcbbd: "jjyunj" +0xcbbe: "jjyunh" +0xcbbf: "jjyud" +0xcbc0: "jjyul" +0xcbc1: "jjyulg" +0xcbc2: "jjyulm" +0xcbc3: "jjyulb" +0xcbc4: "jjyuls" +0xcbc5: "jjyult" +0xcbc6: "jjyulp" +0xcbc7: "jjyulh" +0xcbc8: "jjyum" +0xcbc9: "jjyub" +0xcbca: "jjyubs" +0xcbcb: "jjyus" +0xcbcc: "jjyuss" +0xcbcd: "jjyung" +0xcbce: "jjyuj" +0xcbcf: "jjyuc" +0xcbd0: "jjyuk" +0xcbd1: "jjyut" +0xcbd2: "jjyup" +0xcbd3: "jjyuh" +0xcbd4: "jjeu" +0xcbd5: "jjeug" +0xcbd6: "jjeugg" +0xcbd7: "jjeugs" +0xcbd8: "jjeun" +0xcbd9: "jjeunj" +0xcbda: "jjeunh" +0xcbdb: "jjeud" +0xcbdc: "jjeul" +0xcbdd: "jjeulg" +0xcbde: "jjeulm" +0xcbdf: "jjeulb" +0xcbe0: "jjeuls" +0xcbe1: "jjeult" +0xcbe2: "jjeulp" +0xcbe3: "jjeulh" +0xcbe4: "jjeum" +0xcbe5: "jjeub" +0xcbe6: "jjeubs" +0xcbe7: "jjeus" +0xcbe8: "jjeuss" +0xcbe9: "jjeung" +0xcbea: "jjeuj" +0xcbeb: "jjeuc" +0xcbec: "jjeuk" +0xcbed: "jjeut" +0xcbee: "jjeup" +0xcbef: "jjeuh" +0xcbf0: "jjyi" +0xcbf1: "jjyig" +0xcbf2: "jjyigg" +0xcbf3: "jjyigs" +0xcbf4: "jjyin" +0xcbf5: "jjyinj" +0xcbf6: "jjyinh" +0xcbf7: "jjyid" +0xcbf8: "jjyil" +0xcbf9: "jjyilg" +0xcbfa: "jjyilm" +0xcbfb: "jjyilb" +0xcbfc: "jjyils" +0xcbfd: "jjyilt" +0xcbfe: "jjyilp" +0xcbff: "jjyilh" +/* x0cc */ +0xcc00: "jjyim" +0xcc01: "jjyib" +0xcc02: "jjyibs" +0xcc03: "jjyis" +0xcc04: "jjyiss" +0xcc05: "jjying" +0xcc06: "jjyij" +0xcc07: "jjyic" +0xcc08: "jjyik" +0xcc09: "jjyit" +0xcc0a: "jjyip" +0xcc0b: "jjyih" +0xcc0c: "jji" +0xcc0d: "jjig" +0xcc0e: "jjigg" +0xcc0f: "jjigs" +0xcc10: "jjin" +0xcc11: "jjinj" +0xcc12: "jjinh" +0xcc13: "jjid" +0xcc14: "jjil" +0xcc15: "jjilg" +0xcc16: "jjilm" +0xcc17: "jjilb" +0xcc18: "jjils" +0xcc19: "jjilt" +0xcc1a: "jjilp" +0xcc1b: "jjilh" +0xcc1c: "jjim" +0xcc1d: "jjib" +0xcc1e: "jjibs" +0xcc1f: "jjis" +0xcc20: "jjiss" +0xcc21: "jjing" +0xcc22: "jjij" +0xcc23: "jjic" +0xcc24: "jjik" +0xcc25: "jjit" +0xcc26: "jjip" +0xcc27: "jjih" +0xcc28: "ca" +0xcc29: "cag" +0xcc2a: "cagg" +0xcc2b: "cags" +0xcc2c: "can" +0xcc2d: "canj" +0xcc2e: "canh" +0xcc2f: "cad" +0xcc30: "cal" +0xcc31: "calg" +0xcc32: "calm" +0xcc33: "calb" +0xcc34: "cals" +0xcc35: "calt" +0xcc36: "calp" +0xcc37: "calh" +0xcc38: "cam" +0xcc39: "cab" +0xcc3a: "cabs" +0xcc3b: "cas" +0xcc3c: "cass" +0xcc3d: "cang" +0xcc3e: "caj" +0xcc3f: "cac" +0xcc40: "cak" +0xcc41: "cat" +0xcc42: "cap" +0xcc43: "cah" +0xcc44: "cae" +0xcc45: "caeg" +0xcc46: "caegg" +0xcc47: "caegs" +0xcc48: "caen" +0xcc49: "caenj" +0xcc4a: "caenh" +0xcc4b: "caed" +0xcc4c: "cael" +0xcc4d: "caelg" +0xcc4e: "caelm" +0xcc4f: "caelb" +0xcc50: "caels" +0xcc51: "caelt" +0xcc52: "caelp" +0xcc53: "caelh" +0xcc54: "caem" +0xcc55: "caeb" +0xcc56: "caebs" +0xcc57: "caes" +0xcc58: "caess" +0xcc59: "caeng" +0xcc5a: "caej" +0xcc5b: "caec" +0xcc5c: "caek" +0xcc5d: "caet" +0xcc5e: "caep" +0xcc5f: "caeh" +0xcc60: "cya" +0xcc61: "cyag" +0xcc62: "cyagg" +0xcc63: "cyags" +0xcc64: "cyan" +0xcc65: "cyanj" +0xcc66: "cyanh" +0xcc67: "cyad" +0xcc68: "cyal" +0xcc69: "cyalg" +0xcc6a: "cyalm" +0xcc6b: "cyalb" +0xcc6c: "cyals" +0xcc6d: "cyalt" +0xcc6e: "cyalp" +0xcc6f: "cyalh" +0xcc70: "cyam" +0xcc71: "cyab" +0xcc72: "cyabs" +0xcc73: "cyas" +0xcc74: "cyass" +0xcc75: "cyang" +0xcc76: "cyaj" +0xcc77: "cyac" +0xcc78: "cyak" +0xcc79: "cyat" +0xcc7a: "cyap" +0xcc7b: "cyah" +0xcc7c: "cyae" +0xcc7d: "cyaeg" +0xcc7e: "cyaegg" +0xcc7f: "cyaegs" +0xcc80: "cyaen" +0xcc81: "cyaenj" +0xcc82: "cyaenh" +0xcc83: "cyaed" +0xcc84: "cyael" +0xcc85: "cyaelg" +0xcc86: "cyaelm" +0xcc87: "cyaelb" +0xcc88: "cyaels" +0xcc89: "cyaelt" +0xcc8a: "cyaelp" +0xcc8b: "cyaelh" +0xcc8c: "cyaem" +0xcc8d: "cyaeb" +0xcc8e: "cyaebs" +0xcc8f: "cyaes" +0xcc90: "cyaess" +0xcc91: "cyaeng" +0xcc92: "cyaej" +0xcc93: "cyaec" +0xcc94: "cyaek" +0xcc95: "cyaet" +0xcc96: "cyaep" +0xcc97: "cyaeh" +0xcc98: "ceo" +0xcc99: "ceog" +0xcc9a: "ceogg" +0xcc9b: "ceogs" +0xcc9c: "ceon" +0xcc9d: "ceonj" +0xcc9e: "ceonh" +0xcc9f: "ceod" +0xcca0: "ceol" +0xcca1: "ceolg" +0xcca2: "ceolm" +0xcca3: "ceolb" +0xcca4: "ceols" +0xcca5: "ceolt" +0xcca6: "ceolp" +0xcca7: "ceolh" +0xcca8: "ceom" +0xcca9: "ceob" +0xccaa: "ceobs" +0xccab: "ceos" +0xccac: "ceoss" +0xccad: "ceong" +0xccae: "ceoj" +0xccaf: "ceoc" +0xccb0: "ceok" +0xccb1: "ceot" +0xccb2: "ceop" +0xccb3: "ceoh" +0xccb4: "ce" +0xccb5: "ceg" +0xccb6: "cegg" +0xccb7: "cegs" +0xccb8: "cen" +0xccb9: "cenj" +0xccba: "cenh" +0xccbb: "ced" +0xccbc: "cel" +0xccbd: "celg" +0xccbe: "celm" +0xccbf: "celb" +0xccc0: "cels" +0xccc1: "celt" +0xccc2: "celp" +0xccc3: "celh" +0xccc4: "cem" +0xccc5: "ceb" +0xccc6: "cebs" +0xccc7: "ces" +0xccc8: "cess" +0xccc9: "ceng" +0xccca: "cej" +0xcccb: "cec" +0xcccc: "cek" +0xcccd: "cet" +0xccce: "cep" +0xcccf: "ceh" +0xccd0: "cyeo" +0xccd1: "cyeog" +0xccd2: "cyeogg" +0xccd3: "cyeogs" +0xccd4: "cyeon" +0xccd5: "cyeonj" +0xccd6: "cyeonh" +0xccd7: "cyeod" +0xccd8: "cyeol" +0xccd9: "cyeolg" +0xccda: "cyeolm" +0xccdb: "cyeolb" +0xccdc: "cyeols" +0xccdd: "cyeolt" +0xccde: "cyeolp" +0xccdf: "cyeolh" +0xcce0: "cyeom" +0xcce1: "cyeob" +0xcce2: "cyeobs" +0xcce3: "cyeos" +0xcce4: "cyeoss" +0xcce5: "cyeong" +0xcce6: "cyeoj" +0xcce7: "cyeoc" +0xcce8: "cyeok" +0xcce9: "cyeot" +0xccea: "cyeop" +0xcceb: "cyeoh" +0xccec: "cye" +0xcced: "cyeg" +0xccee: "cyegg" +0xccef: "cyegs" +0xccf0: "cyen" +0xccf1: "cyenj" +0xccf2: "cyenh" +0xccf3: "cyed" +0xccf4: "cyel" +0xccf5: "cyelg" +0xccf6: "cyelm" +0xccf7: "cyelb" +0xccf8: "cyels" +0xccf9: "cyelt" +0xccfa: "cyelp" +0xccfb: "cyelh" +0xccfc: "cyem" +0xccfd: "cyeb" +0xccfe: "cyebs" +0xccff: "cyes" +/* x0cd */ +0xcd00: "cyess" +0xcd01: "cyeng" +0xcd02: "cyej" +0xcd03: "cyec" +0xcd04: "cyek" +0xcd05: "cyet" +0xcd06: "cyep" +0xcd07: "cyeh" +0xcd08: "co" +0xcd09: "cog" +0xcd0a: "cogg" +0xcd0b: "cogs" +0xcd0c: "con" +0xcd0d: "conj" +0xcd0e: "conh" +0xcd0f: "cod" +0xcd10: "col" +0xcd11: "colg" +0xcd12: "colm" +0xcd13: "colb" +0xcd14: "cols" +0xcd15: "colt" +0xcd16: "colp" +0xcd17: "colh" +0xcd18: "com" +0xcd19: "cob" +0xcd1a: "cobs" +0xcd1b: "cos" +0xcd1c: "coss" +0xcd1d: "cong" +0xcd1e: "coj" +0xcd1f: "coc" +0xcd20: "cok" +0xcd21: "cot" +0xcd22: "cop" +0xcd23: "coh" +0xcd24: "cwa" +0xcd25: "cwag" +0xcd26: "cwagg" +0xcd27: "cwags" +0xcd28: "cwan" +0xcd29: "cwanj" +0xcd2a: "cwanh" +0xcd2b: "cwad" +0xcd2c: "cwal" +0xcd2d: "cwalg" +0xcd2e: "cwalm" +0xcd2f: "cwalb" +0xcd30: "cwals" +0xcd31: "cwalt" +0xcd32: "cwalp" +0xcd33: "cwalh" +0xcd34: "cwam" +0xcd35: "cwab" +0xcd36: "cwabs" +0xcd37: "cwas" +0xcd38: "cwass" +0xcd39: "cwang" +0xcd3a: "cwaj" +0xcd3b: "cwac" +0xcd3c: "cwak" +0xcd3d: "cwat" +0xcd3e: "cwap" +0xcd3f: "cwah" +0xcd40: "cwae" +0xcd41: "cwaeg" +0xcd42: "cwaegg" +0xcd43: "cwaegs" +0xcd44: "cwaen" +0xcd45: "cwaenj" +0xcd46: "cwaenh" +0xcd47: "cwaed" +0xcd48: "cwael" +0xcd49: "cwaelg" +0xcd4a: "cwaelm" +0xcd4b: "cwaelb" +0xcd4c: "cwaels" +0xcd4d: "cwaelt" +0xcd4e: "cwaelp" +0xcd4f: "cwaelh" +0xcd50: "cwaem" +0xcd51: "cwaeb" +0xcd52: "cwaebs" +0xcd53: "cwaes" +0xcd54: "cwaess" +0xcd55: "cwaeng" +0xcd56: "cwaej" +0xcd57: "cwaec" +0xcd58: "cwaek" +0xcd59: "cwaet" +0xcd5a: "cwaep" +0xcd5b: "cwaeh" +0xcd5c: "coe" +0xcd5d: "coeg" +0xcd5e: "coegg" +0xcd5f: "coegs" +0xcd60: "coen" +0xcd61: "coenj" +0xcd62: "coenh" +0xcd63: "coed" +0xcd64: "coel" +0xcd65: "coelg" +0xcd66: "coelm" +0xcd67: "coelb" +0xcd68: "coels" +0xcd69: "coelt" +0xcd6a: "coelp" +0xcd6b: "coelh" +0xcd6c: "coem" +0xcd6d: "coeb" +0xcd6e: "coebs" +0xcd6f: "coes" +0xcd70: "coess" +0xcd71: "coeng" +0xcd72: "coej" +0xcd73: "coec" +0xcd74: "coek" +0xcd75: "coet" +0xcd76: "coep" +0xcd77: "coeh" +0xcd78: "cyo" +0xcd79: "cyog" +0xcd7a: "cyogg" +0xcd7b: "cyogs" +0xcd7c: "cyon" +0xcd7d: "cyonj" +0xcd7e: "cyonh" +0xcd7f: "cyod" +0xcd80: "cyol" +0xcd81: "cyolg" +0xcd82: "cyolm" +0xcd83: "cyolb" +0xcd84: "cyols" +0xcd85: "cyolt" +0xcd86: "cyolp" +0xcd87: "cyolh" +0xcd88: "cyom" +0xcd89: "cyob" +0xcd8a: "cyobs" +0xcd8b: "cyos" +0xcd8c: "cyoss" +0xcd8d: "cyong" +0xcd8e: "cyoj" +0xcd8f: "cyoc" +0xcd90: "cyok" +0xcd91: "cyot" +0xcd92: "cyop" +0xcd93: "cyoh" +0xcd94: "cu" +0xcd95: "cug" +0xcd96: "cugg" +0xcd97: "cugs" +0xcd98: "cun" +0xcd99: "cunj" +0xcd9a: "cunh" +0xcd9b: "cud" +0xcd9c: "cul" +0xcd9d: "culg" +0xcd9e: "culm" +0xcd9f: "culb" +0xcda0: "culs" +0xcda1: "cult" +0xcda2: "culp" +0xcda3: "culh" +0xcda4: "cum" +0xcda5: "cub" +0xcda6: "cubs" +0xcda7: "cus" +0xcda8: "cuss" +0xcda9: "cung" +0xcdaa: "cuj" +0xcdab: "cuc" +0xcdac: "cuk" +0xcdad: "cut" +0xcdae: "cup" +0xcdaf: "cuh" +0xcdb0: "cweo" +0xcdb1: "cweog" +0xcdb2: "cweogg" +0xcdb3: "cweogs" +0xcdb4: "cweon" +0xcdb5: "cweonj" +0xcdb6: "cweonh" +0xcdb7: "cweod" +0xcdb8: "cweol" +0xcdb9: "cweolg" +0xcdba: "cweolm" +0xcdbb: "cweolb" +0xcdbc: "cweols" +0xcdbd: "cweolt" +0xcdbe: "cweolp" +0xcdbf: "cweolh" +0xcdc0: "cweom" +0xcdc1: "cweob" +0xcdc2: "cweobs" +0xcdc3: "cweos" +0xcdc4: "cweoss" +0xcdc5: "cweong" +0xcdc6: "cweoj" +0xcdc7: "cweoc" +0xcdc8: "cweok" +0xcdc9: "cweot" +0xcdca: "cweop" +0xcdcb: "cweoh" +0xcdcc: "cwe" +0xcdcd: "cweg" +0xcdce: "cwegg" +0xcdcf: "cwegs" +0xcdd0: "cwen" +0xcdd1: "cwenj" +0xcdd2: "cwenh" +0xcdd3: "cwed" +0xcdd4: "cwel" +0xcdd5: "cwelg" +0xcdd6: "cwelm" +0xcdd7: "cwelb" +0xcdd8: "cwels" +0xcdd9: "cwelt" +0xcdda: "cwelp" +0xcddb: "cwelh" +0xcddc: "cwem" +0xcddd: "cweb" +0xcdde: "cwebs" +0xcddf: "cwes" +0xcde0: "cwess" +0xcde1: "cweng" +0xcde2: "cwej" +0xcde3: "cwec" +0xcde4: "cwek" +0xcde5: "cwet" +0xcde6: "cwep" +0xcde7: "cweh" +0xcde8: "cwi" +0xcde9: "cwig" +0xcdea: "cwigg" +0xcdeb: "cwigs" +0xcdec: "cwin" +0xcded: "cwinj" +0xcdee: "cwinh" +0xcdef: "cwid" +0xcdf0: "cwil" +0xcdf1: "cwilg" +0xcdf2: "cwilm" +0xcdf3: "cwilb" +0xcdf4: "cwils" +0xcdf5: "cwilt" +0xcdf6: "cwilp" +0xcdf7: "cwilh" +0xcdf8: "cwim" +0xcdf9: "cwib" +0xcdfa: "cwibs" +0xcdfb: "cwis" +0xcdfc: "cwiss" +0xcdfd: "cwing" +0xcdfe: "cwij" +0xcdff: "cwic" +/* x0ce */ +0xce00: "cwik" +0xce01: "cwit" +0xce02: "cwip" +0xce03: "cwih" +0xce04: "cyu" +0xce05: "cyug" +0xce06: "cyugg" +0xce07: "cyugs" +0xce08: "cyun" +0xce09: "cyunj" +0xce0a: "cyunh" +0xce0b: "cyud" +0xce0c: "cyul" +0xce0d: "cyulg" +0xce0e: "cyulm" +0xce0f: "cyulb" +0xce10: "cyuls" +0xce11: "cyult" +0xce12: "cyulp" +0xce13: "cyulh" +0xce14: "cyum" +0xce15: "cyub" +0xce16: "cyubs" +0xce17: "cyus" +0xce18: "cyuss" +0xce19: "cyung" +0xce1a: "cyuj" +0xce1b: "cyuc" +0xce1c: "cyuk" +0xce1d: "cyut" +0xce1e: "cyup" +0xce1f: "cyuh" +0xce20: "ceu" +0xce21: "ceug" +0xce22: "ceugg" +0xce23: "ceugs" +0xce24: "ceun" +0xce25: "ceunj" +0xce26: "ceunh" +0xce27: "ceud" +0xce28: "ceul" +0xce29: "ceulg" +0xce2a: "ceulm" +0xce2b: "ceulb" +0xce2c: "ceuls" +0xce2d: "ceult" +0xce2e: "ceulp" +0xce2f: "ceulh" +0xce30: "ceum" +0xce31: "ceub" +0xce32: "ceubs" +0xce33: "ceus" +0xce34: "ceuss" +0xce35: "ceung" +0xce36: "ceuj" +0xce37: "ceuc" +0xce38: "ceuk" +0xce39: "ceut" +0xce3a: "ceup" +0xce3b: "ceuh" +0xce3c: "cyi" +0xce3d: "cyig" +0xce3e: "cyigg" +0xce3f: "cyigs" +0xce40: "cyin" +0xce41: "cyinj" +0xce42: "cyinh" +0xce43: "cyid" +0xce44: "cyil" +0xce45: "cyilg" +0xce46: "cyilm" +0xce47: "cyilb" +0xce48: "cyils" +0xce49: "cyilt" +0xce4a: "cyilp" +0xce4b: "cyilh" +0xce4c: "cyim" +0xce4d: "cyib" +0xce4e: "cyibs" +0xce4f: "cyis" +0xce50: "cyiss" +0xce51: "cying" +0xce52: "cyij" +0xce53: "cyic" +0xce54: "cyik" +0xce55: "cyit" +0xce56: "cyip" +0xce57: "cyih" +0xce58: "ci" +0xce59: "cig" +0xce5a: "cigg" +0xce5b: "cigs" +0xce5c: "cin" +0xce5d: "cinj" +0xce5e: "cinh" +0xce5f: "cid" +0xce60: "cil" +0xce61: "cilg" +0xce62: "cilm" +0xce63: "cilb" +0xce64: "cils" +0xce65: "cilt" +0xce66: "cilp" +0xce67: "cilh" +0xce68: "cim" +0xce69: "cib" +0xce6a: "cibs" +0xce6b: "cis" +0xce6c: "ciss" +0xce6d: "cing" +0xce6e: "cij" +0xce6f: "cic" +0xce70: "cik" +0xce71: "cit" +0xce72: "cip" +0xce73: "cih" +0xce74: "ka" +0xce75: "kag" +0xce76: "kagg" +0xce77: "kags" +0xce78: "kan" +0xce79: "kanj" +0xce7a: "kanh" +0xce7b: "kad" +0xce7c: "kal" +0xce7d: "kalg" +0xce7e: "kalm" +0xce7f: "kalb" +0xce80: "kals" +0xce81: "kalt" +0xce82: "kalp" +0xce83: "kalh" +0xce84: "kam" +0xce85: "kab" +0xce86: "kabs" +0xce87: "kas" +0xce88: "kass" +0xce89: "kang" +0xce8a: "kaj" +0xce8b: "kac" +0xce8c: "kak" +0xce8d: "kat" +0xce8e: "kap" +0xce8f: "kah" +0xce90: "kae" +0xce91: "kaeg" +0xce92: "kaegg" +0xce93: "kaegs" +0xce94: "kaen" +0xce95: "kaenj" +0xce96: "kaenh" +0xce97: "kaed" +0xce98: "kael" +0xce99: "kaelg" +0xce9a: "kaelm" +0xce9b: "kaelb" +0xce9c: "kaels" +0xce9d: "kaelt" +0xce9e: "kaelp" +0xce9f: "kaelh" +0xcea0: "kaem" +0xcea1: "kaeb" +0xcea2: "kaebs" +0xcea3: "kaes" +0xcea4: "kaess" +0xcea5: "kaeng" +0xcea6: "kaej" +0xcea7: "kaec" +0xcea8: "kaek" +0xcea9: "kaet" +0xceaa: "kaep" +0xceab: "kaeh" +0xceac: "kya" +0xcead: "kyag" +0xceae: "kyagg" +0xceaf: "kyags" +0xceb0: "kyan" +0xceb1: "kyanj" +0xceb2: "kyanh" +0xceb3: "kyad" +0xceb4: "kyal" +0xceb5: "kyalg" +0xceb6: "kyalm" +0xceb7: "kyalb" +0xceb8: "kyals" +0xceb9: "kyalt" +0xceba: "kyalp" +0xcebb: "kyalh" +0xcebc: "kyam" +0xcebd: "kyab" +0xcebe: "kyabs" +0xcebf: "kyas" +0xcec0: "kyass" +0xcec1: "kyang" +0xcec2: "kyaj" +0xcec3: "kyac" +0xcec4: "kyak" +0xcec5: "kyat" +0xcec6: "kyap" +0xcec7: "kyah" +0xcec8: "kyae" +0xcec9: "kyaeg" +0xceca: "kyaegg" +0xcecb: "kyaegs" +0xcecc: "kyaen" +0xcecd: "kyaenj" +0xcece: "kyaenh" +0xcecf: "kyaed" +0xced0: "kyael" +0xced1: "kyaelg" +0xced2: "kyaelm" +0xced3: "kyaelb" +0xced4: "kyaels" +0xced5: "kyaelt" +0xced6: "kyaelp" +0xced7: "kyaelh" +0xced8: "kyaem" +0xced9: "kyaeb" +0xceda: "kyaebs" +0xcedb: "kyaes" +0xcedc: "kyaess" +0xcedd: "kyaeng" +0xcede: "kyaej" +0xcedf: "kyaec" +0xcee0: "kyaek" +0xcee1: "kyaet" +0xcee2: "kyaep" +0xcee3: "kyaeh" +0xcee4: "keo" +0xcee5: "keog" +0xcee6: "keogg" +0xcee7: "keogs" +0xcee8: "keon" +0xcee9: "keonj" +0xceea: "keonh" +0xceeb: "keod" +0xceec: "keol" +0xceed: "keolg" +0xceee: "keolm" +0xceef: "keolb" +0xcef0: "keols" +0xcef1: "keolt" +0xcef2: "keolp" +0xcef3: "keolh" +0xcef4: "keom" +0xcef5: "keob" +0xcef6: "keobs" +0xcef7: "keos" +0xcef8: "keoss" +0xcef9: "keong" +0xcefa: "keoj" +0xcefb: "keoc" +0xcefc: "keok" +0xcefd: "keot" +0xcefe: "keop" +0xceff: "keoh" +/* x0cf */ +0xcf00: "ke" +0xcf01: "keg" +0xcf02: "kegg" +0xcf03: "kegs" +0xcf04: "ken" +0xcf05: "kenj" +0xcf06: "kenh" +0xcf07: "ked" +0xcf08: "kel" +0xcf09: "kelg" +0xcf0a: "kelm" +0xcf0b: "kelb" +0xcf0c: "kels" +0xcf0d: "kelt" +0xcf0e: "kelp" +0xcf0f: "kelh" +0xcf10: "kem" +0xcf11: "keb" +0xcf12: "kebs" +0xcf13: "kes" +0xcf14: "kess" +0xcf15: "keng" +0xcf16: "kej" +0xcf17: "kec" +0xcf18: "kek" +0xcf19: "ket" +0xcf1a: "kep" +0xcf1b: "keh" +0xcf1c: "kyeo" +0xcf1d: "kyeog" +0xcf1e: "kyeogg" +0xcf1f: "kyeogs" +0xcf20: "kyeon" +0xcf21: "kyeonj" +0xcf22: "kyeonh" +0xcf23: "kyeod" +0xcf24: "kyeol" +0xcf25: "kyeolg" +0xcf26: "kyeolm" +0xcf27: "kyeolb" +0xcf28: "kyeols" +0xcf29: "kyeolt" +0xcf2a: "kyeolp" +0xcf2b: "kyeolh" +0xcf2c: "kyeom" +0xcf2d: "kyeob" +0xcf2e: "kyeobs" +0xcf2f: "kyeos" +0xcf30: "kyeoss" +0xcf31: "kyeong" +0xcf32: "kyeoj" +0xcf33: "kyeoc" +0xcf34: "kyeok" +0xcf35: "kyeot" +0xcf36: "kyeop" +0xcf37: "kyeoh" +0xcf38: "kye" +0xcf39: "kyeg" +0xcf3a: "kyegg" +0xcf3b: "kyegs" +0xcf3c: "kyen" +0xcf3d: "kyenj" +0xcf3e: "kyenh" +0xcf3f: "kyed" +0xcf40: "kyel" +0xcf41: "kyelg" +0xcf42: "kyelm" +0xcf43: "kyelb" +0xcf44: "kyels" +0xcf45: "kyelt" +0xcf46: "kyelp" +0xcf47: "kyelh" +0xcf48: "kyem" +0xcf49: "kyeb" +0xcf4a: "kyebs" +0xcf4b: "kyes" +0xcf4c: "kyess" +0xcf4d: "kyeng" +0xcf4e: "kyej" +0xcf4f: "kyec" +0xcf50: "kyek" +0xcf51: "kyet" +0xcf52: "kyep" +0xcf53: "kyeh" +0xcf54: "ko" +0xcf55: "kog" +0xcf56: "kogg" +0xcf57: "kogs" +0xcf58: "kon" +0xcf59: "konj" +0xcf5a: "konh" +0xcf5b: "kod" +0xcf5c: "kol" +0xcf5d: "kolg" +0xcf5e: "kolm" +0xcf5f: "kolb" +0xcf60: "kols" +0xcf61: "kolt" +0xcf62: "kolp" +0xcf63: "kolh" +0xcf64: "kom" +0xcf65: "kob" +0xcf66: "kobs" +0xcf67: "kos" +0xcf68: "koss" +0xcf69: "kong" +0xcf6a: "koj" +0xcf6b: "koc" +0xcf6c: "kok" +0xcf6d: "kot" +0xcf6e: "kop" +0xcf6f: "koh" +0xcf70: "kwa" +0xcf71: "kwag" +0xcf72: "kwagg" +0xcf73: "kwags" +0xcf74: "kwan" +0xcf75: "kwanj" +0xcf76: "kwanh" +0xcf77: "kwad" +0xcf78: "kwal" +0xcf79: "kwalg" +0xcf7a: "kwalm" +0xcf7b: "kwalb" +0xcf7c: "kwals" +0xcf7d: "kwalt" +0xcf7e: "kwalp" +0xcf7f: "kwalh" +0xcf80: "kwam" +0xcf81: "kwab" +0xcf82: "kwabs" +0xcf83: "kwas" +0xcf84: "kwass" +0xcf85: "kwang" +0xcf86: "kwaj" +0xcf87: "kwac" +0xcf88: "kwak" +0xcf89: "kwat" +0xcf8a: "kwap" +0xcf8b: "kwah" +0xcf8c: "kwae" +0xcf8d: "kwaeg" +0xcf8e: "kwaegg" +0xcf8f: "kwaegs" +0xcf90: "kwaen" +0xcf91: "kwaenj" +0xcf92: "kwaenh" +0xcf93: "kwaed" +0xcf94: "kwael" +0xcf95: "kwaelg" +0xcf96: "kwaelm" +0xcf97: "kwaelb" +0xcf98: "kwaels" +0xcf99: "kwaelt" +0xcf9a: "kwaelp" +0xcf9b: "kwaelh" +0xcf9c: "kwaem" +0xcf9d: "kwaeb" +0xcf9e: "kwaebs" +0xcf9f: "kwaes" +0xcfa0: "kwaess" +0xcfa1: "kwaeng" +0xcfa2: "kwaej" +0xcfa3: "kwaec" +0xcfa4: "kwaek" +0xcfa5: "kwaet" +0xcfa6: "kwaep" +0xcfa7: "kwaeh" +0xcfa8: "koe" +0xcfa9: "koeg" +0xcfaa: "koegg" +0xcfab: "koegs" +0xcfac: "koen" +0xcfad: "koenj" +0xcfae: "koenh" +0xcfaf: "koed" +0xcfb0: "koel" +0xcfb1: "koelg" +0xcfb2: "koelm" +0xcfb3: "koelb" +0xcfb4: "koels" +0xcfb5: "koelt" +0xcfb6: "koelp" +0xcfb7: "koelh" +0xcfb8: "koem" +0xcfb9: "koeb" +0xcfba: "koebs" +0xcfbb: "koes" +0xcfbc: "koess" +0xcfbd: "koeng" +0xcfbe: "koej" +0xcfbf: "koec" +0xcfc0: "koek" +0xcfc1: "koet" +0xcfc2: "koep" +0xcfc3: "koeh" +0xcfc4: "kyo" +0xcfc5: "kyog" +0xcfc6: "kyogg" +0xcfc7: "kyogs" +0xcfc8: "kyon" +0xcfc9: "kyonj" +0xcfca: "kyonh" +0xcfcb: "kyod" +0xcfcc: "kyol" +0xcfcd: "kyolg" +0xcfce: "kyolm" +0xcfcf: "kyolb" +0xcfd0: "kyols" +0xcfd1: "kyolt" +0xcfd2: "kyolp" +0xcfd3: "kyolh" +0xcfd4: "kyom" +0xcfd5: "kyob" +0xcfd6: "kyobs" +0xcfd7: "kyos" +0xcfd8: "kyoss" +0xcfd9: "kyong" +0xcfda: "kyoj" +0xcfdb: "kyoc" +0xcfdc: "kyok" +0xcfdd: "kyot" +0xcfde: "kyop" +0xcfdf: "kyoh" +0xcfe0: "ku" +0xcfe1: "kug" +0xcfe2: "kugg" +0xcfe3: "kugs" +0xcfe4: "kun" +0xcfe5: "kunj" +0xcfe6: "kunh" +0xcfe7: "kud" +0xcfe8: "kul" +0xcfe9: "kulg" +0xcfea: "kulm" +0xcfeb: "kulb" +0xcfec: "kuls" +0xcfed: "kult" +0xcfee: "kulp" +0xcfef: "kulh" +0xcff0: "kum" +0xcff1: "kub" +0xcff2: "kubs" +0xcff3: "kus" +0xcff4: "kuss" +0xcff5: "kung" +0xcff6: "kuj" +0xcff7: "kuc" +0xcff8: "kuk" +0xcff9: "kut" +0xcffa: "kup" +0xcffb: "kuh" +0xcffc: "kweo" +0xcffd: "kweog" +0xcffe: "kweogg" +0xcfff: "kweogs" +/* x0d0 */ +0xd000: "kweon" +0xd001: "kweonj" +0xd002: "kweonh" +0xd003: "kweod" +0xd004: "kweol" +0xd005: "kweolg" +0xd006: "kweolm" +0xd007: "kweolb" +0xd008: "kweols" +0xd009: "kweolt" +0xd00a: "kweolp" +0xd00b: "kweolh" +0xd00c: "kweom" +0xd00d: "kweob" +0xd00e: "kweobs" +0xd00f: "kweos" +0xd010: "kweoss" +0xd011: "kweong" +0xd012: "kweoj" +0xd013: "kweoc" +0xd014: "kweok" +0xd015: "kweot" +0xd016: "kweop" +0xd017: "kweoh" +0xd018: "kwe" +0xd019: "kweg" +0xd01a: "kwegg" +0xd01b: "kwegs" +0xd01c: "kwen" +0xd01d: "kwenj" +0xd01e: "kwenh" +0xd01f: "kwed" +0xd020: "kwel" +0xd021: "kwelg" +0xd022: "kwelm" +0xd023: "kwelb" +0xd024: "kwels" +0xd025: "kwelt" +0xd026: "kwelp" +0xd027: "kwelh" +0xd028: "kwem" +0xd029: "kweb" +0xd02a: "kwebs" +0xd02b: "kwes" +0xd02c: "kwess" +0xd02d: "kweng" +0xd02e: "kwej" +0xd02f: "kwec" +0xd030: "kwek" +0xd031: "kwet" +0xd032: "kwep" +0xd033: "kweh" +0xd034: "kwi" +0xd035: "kwig" +0xd036: "kwigg" +0xd037: "kwigs" +0xd038: "kwin" +0xd039: "kwinj" +0xd03a: "kwinh" +0xd03b: "kwid" +0xd03c: "kwil" +0xd03d: "kwilg" +0xd03e: "kwilm" +0xd03f: "kwilb" +0xd040: "kwils" +0xd041: "kwilt" +0xd042: "kwilp" +0xd043: "kwilh" +0xd044: "kwim" +0xd045: "kwib" +0xd046: "kwibs" +0xd047: "kwis" +0xd048: "kwiss" +0xd049: "kwing" +0xd04a: "kwij" +0xd04b: "kwic" +0xd04c: "kwik" +0xd04d: "kwit" +0xd04e: "kwip" +0xd04f: "kwih" +0xd050: "kyu" +0xd051: "kyug" +0xd052: "kyugg" +0xd053: "kyugs" +0xd054: "kyun" +0xd055: "kyunj" +0xd056: "kyunh" +0xd057: "kyud" +0xd058: "kyul" +0xd059: "kyulg" +0xd05a: "kyulm" +0xd05b: "kyulb" +0xd05c: "kyuls" +0xd05d: "kyult" +0xd05e: "kyulp" +0xd05f: "kyulh" +0xd060: "kyum" +0xd061: "kyub" +0xd062: "kyubs" +0xd063: "kyus" +0xd064: "kyuss" +0xd065: "kyung" +0xd066: "kyuj" +0xd067: "kyuc" +0xd068: "kyuk" +0xd069: "kyut" +0xd06a: "kyup" +0xd06b: "kyuh" +0xd06c: "keu" +0xd06d: "keug" +0xd06e: "keugg" +0xd06f: "keugs" +0xd070: "keun" +0xd071: "keunj" +0xd072: "keunh" +0xd073: "keud" +0xd074: "keul" +0xd075: "keulg" +0xd076: "keulm" +0xd077: "keulb" +0xd078: "keuls" +0xd079: "keult" +0xd07a: "keulp" +0xd07b: "keulh" +0xd07c: "keum" +0xd07d: "keub" +0xd07e: "keubs" +0xd07f: "keus" +0xd080: "keuss" +0xd081: "keung" +0xd082: "keuj" +0xd083: "keuc" +0xd084: "keuk" +0xd085: "keut" +0xd086: "keup" +0xd087: "keuh" +0xd088: "kyi" +0xd089: "kyig" +0xd08a: "kyigg" +0xd08b: "kyigs" +0xd08c: "kyin" +0xd08d: "kyinj" +0xd08e: "kyinh" +0xd08f: "kyid" +0xd090: "kyil" +0xd091: "kyilg" +0xd092: "kyilm" +0xd093: "kyilb" +0xd094: "kyils" +0xd095: "kyilt" +0xd096: "kyilp" +0xd097: "kyilh" +0xd098: "kyim" +0xd099: "kyib" +0xd09a: "kyibs" +0xd09b: "kyis" +0xd09c: "kyiss" +0xd09d: "kying" +0xd09e: "kyij" +0xd09f: "kyic" +0xd0a0: "kyik" +0xd0a1: "kyit" +0xd0a2: "kyip" +0xd0a3: "kyih" +0xd0a4: "ki" +0xd0a5: "kig" +0xd0a6: "kigg" +0xd0a7: "kigs" +0xd0a8: "kin" +0xd0a9: "kinj" +0xd0aa: "kinh" +0xd0ab: "kid" +0xd0ac: "kil" +0xd0ad: "kilg" +0xd0ae: "kilm" +0xd0af: "kilb" +0xd0b0: "kils" +0xd0b1: "kilt" +0xd0b2: "kilp" +0xd0b3: "kilh" +0xd0b4: "kim" +0xd0b5: "kib" +0xd0b6: "kibs" +0xd0b7: "kis" +0xd0b8: "kiss" +0xd0b9: "king" +0xd0ba: "kij" +0xd0bb: "kic" +0xd0bc: "kik" +0xd0bd: "kit" +0xd0be: "kip" +0xd0bf: "kih" +0xd0c0: "ta" +0xd0c1: "tag" +0xd0c2: "tagg" +0xd0c3: "tags" +0xd0c4: "tan" +0xd0c5: "tanj" +0xd0c6: "tanh" +0xd0c7: "tad" +0xd0c8: "tal" +0xd0c9: "talg" +0xd0ca: "talm" +0xd0cb: "talb" +0xd0cc: "tals" +0xd0cd: "talt" +0xd0ce: "talp" +0xd0cf: "talh" +0xd0d0: "tam" +0xd0d1: "tab" +0xd0d2: "tabs" +0xd0d3: "tas" +0xd0d4: "tass" +0xd0d5: "tang" +0xd0d6: "taj" +0xd0d7: "tac" +0xd0d8: "tak" +0xd0d9: "tat" +0xd0da: "tap" +0xd0db: "tah" +0xd0dc: "tae" +0xd0dd: "taeg" +0xd0de: "taegg" +0xd0df: "taegs" +0xd0e0: "taen" +0xd0e1: "taenj" +0xd0e2: "taenh" +0xd0e3: "taed" +0xd0e4: "tael" +0xd0e5: "taelg" +0xd0e6: "taelm" +0xd0e7: "taelb" +0xd0e8: "taels" +0xd0e9: "taelt" +0xd0ea: "taelp" +0xd0eb: "taelh" +0xd0ec: "taem" +0xd0ed: "taeb" +0xd0ee: "taebs" +0xd0ef: "taes" +0xd0f0: "taess" +0xd0f1: "taeng" +0xd0f2: "taej" +0xd0f3: "taec" +0xd0f4: "taek" +0xd0f5: "taet" +0xd0f6: "taep" +0xd0f7: "taeh" +0xd0f8: "tya" +0xd0f9: "tyag" +0xd0fa: "tyagg" +0xd0fb: "tyags" +0xd0fc: "tyan" +0xd0fd: "tyanj" +0xd0fe: "tyanh" +0xd0ff: "tyad" +/* x0d1 */ +0xd100: "tyal" +0xd101: "tyalg" +0xd102: "tyalm" +0xd103: "tyalb" +0xd104: "tyals" +0xd105: "tyalt" +0xd106: "tyalp" +0xd107: "tyalh" +0xd108: "tyam" +0xd109: "tyab" +0xd10a: "tyabs" +0xd10b: "tyas" +0xd10c: "tyass" +0xd10d: "tyang" +0xd10e: "tyaj" +0xd10f: "tyac" +0xd110: "tyak" +0xd111: "tyat" +0xd112: "tyap" +0xd113: "tyah" +0xd114: "tyae" +0xd115: "tyaeg" +0xd116: "tyaegg" +0xd117: "tyaegs" +0xd118: "tyaen" +0xd119: "tyaenj" +0xd11a: "tyaenh" +0xd11b: "tyaed" +0xd11c: "tyael" +0xd11d: "tyaelg" +0xd11e: "tyaelm" +0xd11f: "tyaelb" +0xd120: "tyaels" +0xd121: "tyaelt" +0xd122: "tyaelp" +0xd123: "tyaelh" +0xd124: "tyaem" +0xd125: "tyaeb" +0xd126: "tyaebs" +0xd127: "tyaes" +0xd128: "tyaess" +0xd129: "tyaeng" +0xd12a: "tyaej" +0xd12b: "tyaec" +0xd12c: "tyaek" +0xd12d: "tyaet" +0xd12e: "tyaep" +0xd12f: "tyaeh" +0xd130: "teo" +0xd131: "teog" +0xd132: "teogg" +0xd133: "teogs" +0xd134: "teon" +0xd135: "teonj" +0xd136: "teonh" +0xd137: "teod" +0xd138: "teol" +0xd139: "teolg" +0xd13a: "teolm" +0xd13b: "teolb" +0xd13c: "teols" +0xd13d: "teolt" +0xd13e: "teolp" +0xd13f: "teolh" +0xd140: "teom" +0xd141: "teob" +0xd142: "teobs" +0xd143: "teos" +0xd144: "teoss" +0xd145: "teong" +0xd146: "teoj" +0xd147: "teoc" +0xd148: "teok" +0xd149: "teot" +0xd14a: "teop" +0xd14b: "teoh" +0xd14c: "te" +0xd14d: "teg" +0xd14e: "tegg" +0xd14f: "tegs" +0xd150: "ten" +0xd151: "tenj" +0xd152: "tenh" +0xd153: "ted" +0xd154: "tel" +0xd155: "telg" +0xd156: "telm" +0xd157: "telb" +0xd158: "tels" +0xd159: "telt" +0xd15a: "telp" +0xd15b: "telh" +0xd15c: "tem" +0xd15d: "teb" +0xd15e: "tebs" +0xd15f: "tes" +0xd160: "tess" +0xd161: "teng" +0xd162: "tej" +0xd163: "tec" +0xd164: "tek" +0xd165: "tet" +0xd166: "tep" +0xd167: "teh" +0xd168: "tyeo" +0xd169: "tyeog" +0xd16a: "tyeogg" +0xd16b: "tyeogs" +0xd16c: "tyeon" +0xd16d: "tyeonj" +0xd16e: "tyeonh" +0xd16f: "tyeod" +0xd170: "tyeol" +0xd171: "tyeolg" +0xd172: "tyeolm" +0xd173: "tyeolb" +0xd174: "tyeols" +0xd175: "tyeolt" +0xd176: "tyeolp" +0xd177: "tyeolh" +0xd178: "tyeom" +0xd179: "tyeob" +0xd17a: "tyeobs" +0xd17b: "tyeos" +0xd17c: "tyeoss" +0xd17d: "tyeong" +0xd17e: "tyeoj" +0xd17f: "tyeoc" +0xd180: "tyeok" +0xd181: "tyeot" +0xd182: "tyeop" +0xd183: "tyeoh" +0xd184: "tye" +0xd185: "tyeg" +0xd186: "tyegg" +0xd187: "tyegs" +0xd188: "tyen" +0xd189: "tyenj" +0xd18a: "tyenh" +0xd18b: "tyed" +0xd18c: "tyel" +0xd18d: "tyelg" +0xd18e: "tyelm" +0xd18f: "tyelb" +0xd190: "tyels" +0xd191: "tyelt" +0xd192: "tyelp" +0xd193: "tyelh" +0xd194: "tyem" +0xd195: "tyeb" +0xd196: "tyebs" +0xd197: "tyes" +0xd198: "tyess" +0xd199: "tyeng" +0xd19a: "tyej" +0xd19b: "tyec" +0xd19c: "tyek" +0xd19d: "tyet" +0xd19e: "tyep" +0xd19f: "tyeh" +0xd1a0: "to" +0xd1a1: "tog" +0xd1a2: "togg" +0xd1a3: "togs" +0xd1a4: "ton" +0xd1a5: "tonj" +0xd1a6: "tonh" +0xd1a7: "tod" +0xd1a8: "tol" +0xd1a9: "tolg" +0xd1aa: "tolm" +0xd1ab: "tolb" +0xd1ac: "tols" +0xd1ad: "tolt" +0xd1ae: "tolp" +0xd1af: "tolh" +0xd1b0: "tom" +0xd1b1: "tob" +0xd1b2: "tobs" +0xd1b3: "tos" +0xd1b4: "toss" +0xd1b5: "tong" +0xd1b6: "toj" +0xd1b7: "toc" +0xd1b8: "tok" +0xd1b9: "tot" +0xd1ba: "top" +0xd1bb: "toh" +0xd1bc: "twa" +0xd1bd: "twag" +0xd1be: "twagg" +0xd1bf: "twags" +0xd1c0: "twan" +0xd1c1: "twanj" +0xd1c2: "twanh" +0xd1c3: "twad" +0xd1c4: "twal" +0xd1c5: "twalg" +0xd1c6: "twalm" +0xd1c7: "twalb" +0xd1c8: "twals" +0xd1c9: "twalt" +0xd1ca: "twalp" +0xd1cb: "twalh" +0xd1cc: "twam" +0xd1cd: "twab" +0xd1ce: "twabs" +0xd1cf: "twas" +0xd1d0: "twass" +0xd1d1: "twang" +0xd1d2: "twaj" +0xd1d3: "twac" +0xd1d4: "twak" +0xd1d5: "twat" +0xd1d6: "twap" +0xd1d7: "twah" +0xd1d8: "twae" +0xd1d9: "twaeg" +0xd1da: "twaegg" +0xd1db: "twaegs" +0xd1dc: "twaen" +0xd1dd: "twaenj" +0xd1de: "twaenh" +0xd1df: "twaed" +0xd1e0: "twael" +0xd1e1: "twaelg" +0xd1e2: "twaelm" +0xd1e3: "twaelb" +0xd1e4: "twaels" +0xd1e5: "twaelt" +0xd1e6: "twaelp" +0xd1e7: "twaelh" +0xd1e8: "twaem" +0xd1e9: "twaeb" +0xd1ea: "twaebs" +0xd1eb: "twaes" +0xd1ec: "twaess" +0xd1ed: "twaeng" +0xd1ee: "twaej" +0xd1ef: "twaec" +0xd1f0: "twaek" +0xd1f1: "twaet" +0xd1f2: "twaep" +0xd1f3: "twaeh" +0xd1f4: "toe" +0xd1f5: "toeg" +0xd1f6: "toegg" +0xd1f7: "toegs" +0xd1f8: "toen" +0xd1f9: "toenj" +0xd1fa: "toenh" +0xd1fb: "toed" +0xd1fc: "toel" +0xd1fd: "toelg" +0xd1fe: "toelm" +0xd1ff: "toelb" +/* x0d2 */ +0xd200: "toels" +0xd201: "toelt" +0xd202: "toelp" +0xd203: "toelh" +0xd204: "toem" +0xd205: "toeb" +0xd206: "toebs" +0xd207: "toes" +0xd208: "toess" +0xd209: "toeng" +0xd20a: "toej" +0xd20b: "toec" +0xd20c: "toek" +0xd20d: "toet" +0xd20e: "toep" +0xd20f: "toeh" +0xd210: "tyo" +0xd211: "tyog" +0xd212: "tyogg" +0xd213: "tyogs" +0xd214: "tyon" +0xd215: "tyonj" +0xd216: "tyonh" +0xd217: "tyod" +0xd218: "tyol" +0xd219: "tyolg" +0xd21a: "tyolm" +0xd21b: "tyolb" +0xd21c: "tyols" +0xd21d: "tyolt" +0xd21e: "tyolp" +0xd21f: "tyolh" +0xd220: "tyom" +0xd221: "tyob" +0xd222: "tyobs" +0xd223: "tyos" +0xd224: "tyoss" +0xd225: "tyong" +0xd226: "tyoj" +0xd227: "tyoc" +0xd228: "tyok" +0xd229: "tyot" +0xd22a: "tyop" +0xd22b: "tyoh" +0xd22c: "tu" +0xd22d: "tug" +0xd22e: "tugg" +0xd22f: "tugs" +0xd230: "tun" +0xd231: "tunj" +0xd232: "tunh" +0xd233: "tud" +0xd234: "tul" +0xd235: "tulg" +0xd236: "tulm" +0xd237: "tulb" +0xd238: "tuls" +0xd239: "tult" +0xd23a: "tulp" +0xd23b: "tulh" +0xd23c: "tum" +0xd23d: "tub" +0xd23e: "tubs" +0xd23f: "tus" +0xd240: "tuss" +0xd241: "tung" +0xd242: "tuj" +0xd243: "tuc" +0xd244: "tuk" +0xd245: "tut" +0xd246: "tup" +0xd247: "tuh" +0xd248: "tweo" +0xd249: "tweog" +0xd24a: "tweogg" +0xd24b: "tweogs" +0xd24c: "tweon" +0xd24d: "tweonj" +0xd24e: "tweonh" +0xd24f: "tweod" +0xd250: "tweol" +0xd251: "tweolg" +0xd252: "tweolm" +0xd253: "tweolb" +0xd254: "tweols" +0xd255: "tweolt" +0xd256: "tweolp" +0xd257: "tweolh" +0xd258: "tweom" +0xd259: "tweob" +0xd25a: "tweobs" +0xd25b: "tweos" +0xd25c: "tweoss" +0xd25d: "tweong" +0xd25e: "tweoj" +0xd25f: "tweoc" +0xd260: "tweok" +0xd261: "tweot" +0xd262: "tweop" +0xd263: "tweoh" +0xd264: "twe" +0xd265: "tweg" +0xd266: "twegg" +0xd267: "twegs" +0xd268: "twen" +0xd269: "twenj" +0xd26a: "twenh" +0xd26b: "twed" +0xd26c: "twel" +0xd26d: "twelg" +0xd26e: "twelm" +0xd26f: "twelb" +0xd270: "twels" +0xd271: "twelt" +0xd272: "twelp" +0xd273: "twelh" +0xd274: "twem" +0xd275: "tweb" +0xd276: "twebs" +0xd277: "twes" +0xd278: "twess" +0xd279: "tweng" +0xd27a: "twej" +0xd27b: "twec" +0xd27c: "twek" +0xd27d: "twet" +0xd27e: "twep" +0xd27f: "tweh" +0xd280: "twi" +0xd281: "twig" +0xd282: "twigg" +0xd283: "twigs" +0xd284: "twin" +0xd285: "twinj" +0xd286: "twinh" +0xd287: "twid" +0xd288: "twil" +0xd289: "twilg" +0xd28a: "twilm" +0xd28b: "twilb" +0xd28c: "twils" +0xd28d: "twilt" +0xd28e: "twilp" +0xd28f: "twilh" +0xd290: "twim" +0xd291: "twib" +0xd292: "twibs" +0xd293: "twis" +0xd294: "twiss" +0xd295: "twing" +0xd296: "twij" +0xd297: "twic" +0xd298: "twik" +0xd299: "twit" +0xd29a: "twip" +0xd29b: "twih" +0xd29c: "tyu" +0xd29d: "tyug" +0xd29e: "tyugg" +0xd29f: "tyugs" +0xd2a0: "tyun" +0xd2a1: "tyunj" +0xd2a2: "tyunh" +0xd2a3: "tyud" +0xd2a4: "tyul" +0xd2a5: "tyulg" +0xd2a6: "tyulm" +0xd2a7: "tyulb" +0xd2a8: "tyuls" +0xd2a9: "tyult" +0xd2aa: "tyulp" +0xd2ab: "tyulh" +0xd2ac: "tyum" +0xd2ad: "tyub" +0xd2ae: "tyubs" +0xd2af: "tyus" +0xd2b0: "tyuss" +0xd2b1: "tyung" +0xd2b2: "tyuj" +0xd2b3: "tyuc" +0xd2b4: "tyuk" +0xd2b5: "tyut" +0xd2b6: "tyup" +0xd2b7: "tyuh" +0xd2b8: "teu" +0xd2b9: "teug" +0xd2ba: "teugg" +0xd2bb: "teugs" +0xd2bc: "teun" +0xd2bd: "teunj" +0xd2be: "teunh" +0xd2bf: "teud" +0xd2c0: "teul" +0xd2c1: "teulg" +0xd2c2: "teulm" +0xd2c3: "teulb" +0xd2c4: "teuls" +0xd2c5: "teult" +0xd2c6: "teulp" +0xd2c7: "teulh" +0xd2c8: "teum" +0xd2c9: "teub" +0xd2ca: "teubs" +0xd2cb: "teus" +0xd2cc: "teuss" +0xd2cd: "teung" +0xd2ce: "teuj" +0xd2cf: "teuc" +0xd2d0: "teuk" +0xd2d1: "teut" +0xd2d2: "teup" +0xd2d3: "teuh" +0xd2d4: "tyi" +0xd2d5: "tyig" +0xd2d6: "tyigg" +0xd2d7: "tyigs" +0xd2d8: "tyin" +0xd2d9: "tyinj" +0xd2da: "tyinh" +0xd2db: "tyid" +0xd2dc: "tyil" +0xd2dd: "tyilg" +0xd2de: "tyilm" +0xd2df: "tyilb" +0xd2e0: "tyils" +0xd2e1: "tyilt" +0xd2e2: "tyilp" +0xd2e3: "tyilh" +0xd2e4: "tyim" +0xd2e5: "tyib" +0xd2e6: "tyibs" +0xd2e7: "tyis" +0xd2e8: "tyiss" +0xd2e9: "tying" +0xd2ea: "tyij" +0xd2eb: "tyic" +0xd2ec: "tyik" +0xd2ed: "tyit" +0xd2ee: "tyip" +0xd2ef: "tyih" +0xd2f0: "ti" +0xd2f1: "tig" +0xd2f2: "tigg" +0xd2f3: "tigs" +0xd2f4: "tin" +0xd2f5: "tinj" +0xd2f6: "tinh" +0xd2f7: "tid" +0xd2f8: "til" +0xd2f9: "tilg" +0xd2fa: "tilm" +0xd2fb: "tilb" +0xd2fc: "tils" +0xd2fd: "tilt" +0xd2fe: "tilp" +0xd2ff: "tilh" +/* x0d3 */ +0xd300: "tim" +0xd301: "tib" +0xd302: "tibs" +0xd303: "tis" +0xd304: "tiss" +0xd305: "ting" +0xd306: "tij" +0xd307: "tic" +0xd308: "tik" +0xd309: "tit" +0xd30a: "tip" +0xd30b: "tih" +0xd30c: "pa" +0xd30d: "pag" +0xd30e: "pagg" +0xd30f: "pags" +0xd310: "pan" +0xd311: "panj" +0xd312: "panh" +0xd313: "pad" +0xd314: "pal" +0xd315: "palg" +0xd316: "palm" +0xd317: "palb" +0xd318: "pals" +0xd319: "palt" +0xd31a: "palp" +0xd31b: "palh" +0xd31c: "pam" +0xd31d: "pab" +0xd31e: "pabs" +0xd31f: "pas" +0xd320: "pass" +0xd321: "pang" +0xd322: "paj" +0xd323: "pac" +0xd324: "pak" +0xd325: "pat" +0xd326: "pap" +0xd327: "pah" +0xd328: "pae" +0xd329: "paeg" +0xd32a: "paegg" +0xd32b: "paegs" +0xd32c: "paen" +0xd32d: "paenj" +0xd32e: "paenh" +0xd32f: "paed" +0xd330: "pael" +0xd331: "paelg" +0xd332: "paelm" +0xd333: "paelb" +0xd334: "paels" +0xd335: "paelt" +0xd336: "paelp" +0xd337: "paelh" +0xd338: "paem" +0xd339: "paeb" +0xd33a: "paebs" +0xd33b: "paes" +0xd33c: "paess" +0xd33d: "paeng" +0xd33e: "paej" +0xd33f: "paec" +0xd340: "paek" +0xd341: "paet" +0xd342: "paep" +0xd343: "paeh" +0xd344: "pya" +0xd345: "pyag" +0xd346: "pyagg" +0xd347: "pyags" +0xd348: "pyan" +0xd349: "pyanj" +0xd34a: "pyanh" +0xd34b: "pyad" +0xd34c: "pyal" +0xd34d: "pyalg" +0xd34e: "pyalm" +0xd34f: "pyalb" +0xd350: "pyals" +0xd351: "pyalt" +0xd352: "pyalp" +0xd353: "pyalh" +0xd354: "pyam" +0xd355: "pyab" +0xd356: "pyabs" +0xd357: "pyas" +0xd358: "pyass" +0xd359: "pyang" +0xd35a: "pyaj" +0xd35b: "pyac" +0xd35c: "pyak" +0xd35d: "pyat" +0xd35e: "pyap" +0xd35f: "pyah" +0xd360: "pyae" +0xd361: "pyaeg" +0xd362: "pyaegg" +0xd363: "pyaegs" +0xd364: "pyaen" +0xd365: "pyaenj" +0xd366: "pyaenh" +0xd367: "pyaed" +0xd368: "pyael" +0xd369: "pyaelg" +0xd36a: "pyaelm" +0xd36b: "pyaelb" +0xd36c: "pyaels" +0xd36d: "pyaelt" +0xd36e: "pyaelp" +0xd36f: "pyaelh" +0xd370: "pyaem" +0xd371: "pyaeb" +0xd372: "pyaebs" +0xd373: "pyaes" +0xd374: "pyaess" +0xd375: "pyaeng" +0xd376: "pyaej" +0xd377: "pyaec" +0xd378: "pyaek" +0xd379: "pyaet" +0xd37a: "pyaep" +0xd37b: "pyaeh" +0xd37c: "peo" +0xd37d: "peog" +0xd37e: "peogg" +0xd37f: "peogs" +0xd380: "peon" +0xd381: "peonj" +0xd382: "peonh" +0xd383: "peod" +0xd384: "peol" +0xd385: "peolg" +0xd386: "peolm" +0xd387: "peolb" +0xd388: "peols" +0xd389: "peolt" +0xd38a: "peolp" +0xd38b: "peolh" +0xd38c: "peom" +0xd38d: "peob" +0xd38e: "peobs" +0xd38f: "peos" +0xd390: "peoss" +0xd391: "peong" +0xd392: "peoj" +0xd393: "peoc" +0xd394: "peok" +0xd395: "peot" +0xd396: "peop" +0xd397: "peoh" +0xd398: "pe" +0xd399: "peg" +0xd39a: "pegg" +0xd39b: "pegs" +0xd39c: "pen" +0xd39d: "penj" +0xd39e: "penh" +0xd39f: "ped" +0xd3a0: "pel" +0xd3a1: "pelg" +0xd3a2: "pelm" +0xd3a3: "pelb" +0xd3a4: "pels" +0xd3a5: "pelt" +0xd3a6: "pelp" +0xd3a7: "pelh" +0xd3a8: "pem" +0xd3a9: "peb" +0xd3aa: "pebs" +0xd3ab: "pes" +0xd3ac: "pess" +0xd3ad: "peng" +0xd3ae: "pej" +0xd3af: "pec" +0xd3b0: "pek" +0xd3b1: "pet" +0xd3b2: "pep" +0xd3b3: "peh" +0xd3b4: "pyeo" +0xd3b5: "pyeog" +0xd3b6: "pyeogg" +0xd3b7: "pyeogs" +0xd3b8: "pyeon" +0xd3b9: "pyeonj" +0xd3ba: "pyeonh" +0xd3bb: "pyeod" +0xd3bc: "pyeol" +0xd3bd: "pyeolg" +0xd3be: "pyeolm" +0xd3bf: "pyeolb" +0xd3c0: "pyeols" +0xd3c1: "pyeolt" +0xd3c2: "pyeolp" +0xd3c3: "pyeolh" +0xd3c4: "pyeom" +0xd3c5: "pyeob" +0xd3c6: "pyeobs" +0xd3c7: "pyeos" +0xd3c8: "pyeoss" +0xd3c9: "pyeong" +0xd3ca: "pyeoj" +0xd3cb: "pyeoc" +0xd3cc: "pyeok" +0xd3cd: "pyeot" +0xd3ce: "pyeop" +0xd3cf: "pyeoh" +0xd3d0: "pye" +0xd3d1: "pyeg" +0xd3d2: "pyegg" +0xd3d3: "pyegs" +0xd3d4: "pyen" +0xd3d5: "pyenj" +0xd3d6: "pyenh" +0xd3d7: "pyed" +0xd3d8: "pyel" +0xd3d9: "pyelg" +0xd3da: "pyelm" +0xd3db: "pyelb" +0xd3dc: "pyels" +0xd3dd: "pyelt" +0xd3de: "pyelp" +0xd3df: "pyelh" +0xd3e0: "pyem" +0xd3e1: "pyeb" +0xd3e2: "pyebs" +0xd3e3: "pyes" +0xd3e4: "pyess" +0xd3e5: "pyeng" +0xd3e6: "pyej" +0xd3e7: "pyec" +0xd3e8: "pyek" +0xd3e9: "pyet" +0xd3ea: "pyep" +0xd3eb: "pyeh" +0xd3ec: "po" +0xd3ed: "pog" +0xd3ee: "pogg" +0xd3ef: "pogs" +0xd3f0: "pon" +0xd3f1: "ponj" +0xd3f2: "ponh" +0xd3f3: "pod" +0xd3f4: "pol" +0xd3f5: "polg" +0xd3f6: "polm" +0xd3f7: "polb" +0xd3f8: "pols" +0xd3f9: "polt" +0xd3fa: "polp" +0xd3fb: "polh" +0xd3fc: "pom" +0xd3fd: "pob" +0xd3fe: "pobs" +0xd3ff: "pos" +/* x0d4 */ +0xd400: "poss" +0xd401: "pong" +0xd402: "poj" +0xd403: "poc" +0xd404: "pok" +0xd405: "pot" +0xd406: "pop" +0xd407: "poh" +0xd408: "pwa" +0xd409: "pwag" +0xd40a: "pwagg" +0xd40b: "pwags" +0xd40c: "pwan" +0xd40d: "pwanj" +0xd40e: "pwanh" +0xd40f: "pwad" +0xd410: "pwal" +0xd411: "pwalg" +0xd412: "pwalm" +0xd413: "pwalb" +0xd414: "pwals" +0xd415: "pwalt" +0xd416: "pwalp" +0xd417: "pwalh" +0xd418: "pwam" +0xd419: "pwab" +0xd41a: "pwabs" +0xd41b: "pwas" +0xd41c: "pwass" +0xd41d: "pwang" +0xd41e: "pwaj" +0xd41f: "pwac" +0xd420: "pwak" +0xd421: "pwat" +0xd422: "pwap" +0xd423: "pwah" +0xd424: "pwae" +0xd425: "pwaeg" +0xd426: "pwaegg" +0xd427: "pwaegs" +0xd428: "pwaen" +0xd429: "pwaenj" +0xd42a: "pwaenh" +0xd42b: "pwaed" +0xd42c: "pwael" +0xd42d: "pwaelg" +0xd42e: "pwaelm" +0xd42f: "pwaelb" +0xd430: "pwaels" +0xd431: "pwaelt" +0xd432: "pwaelp" +0xd433: "pwaelh" +0xd434: "pwaem" +0xd435: "pwaeb" +0xd436: "pwaebs" +0xd437: "pwaes" +0xd438: "pwaess" +0xd439: "pwaeng" +0xd43a: "pwaej" +0xd43b: "pwaec" +0xd43c: "pwaek" +0xd43d: "pwaet" +0xd43e: "pwaep" +0xd43f: "pwaeh" +0xd440: "poe" +0xd441: "poeg" +0xd442: "poegg" +0xd443: "poegs" +0xd444: "poen" +0xd445: "poenj" +0xd446: "poenh" +0xd447: "poed" +0xd448: "poel" +0xd449: "poelg" +0xd44a: "poelm" +0xd44b: "poelb" +0xd44c: "poels" +0xd44d: "poelt" +0xd44e: "poelp" +0xd44f: "poelh" +0xd450: "poem" +0xd451: "poeb" +0xd452: "poebs" +0xd453: "poes" +0xd454: "poess" +0xd455: "poeng" +0xd456: "poej" +0xd457: "poec" +0xd458: "poek" +0xd459: "poet" +0xd45a: "poep" +0xd45b: "poeh" +0xd45c: "pyo" +0xd45d: "pyog" +0xd45e: "pyogg" +0xd45f: "pyogs" +0xd460: "pyon" +0xd461: "pyonj" +0xd462: "pyonh" +0xd463: "pyod" +0xd464: "pyol" +0xd465: "pyolg" +0xd466: "pyolm" +0xd467: "pyolb" +0xd468: "pyols" +0xd469: "pyolt" +0xd46a: "pyolp" +0xd46b: "pyolh" +0xd46c: "pyom" +0xd46d: "pyob" +0xd46e: "pyobs" +0xd46f: "pyos" +0xd470: "pyoss" +0xd471: "pyong" +0xd472: "pyoj" +0xd473: "pyoc" +0xd474: "pyok" +0xd475: "pyot" +0xd476: "pyop" +0xd477: "pyoh" +0xd478: "pu" +0xd479: "pug" +0xd47a: "pugg" +0xd47b: "pugs" +0xd47c: "pun" +0xd47d: "punj" +0xd47e: "punh" +0xd47f: "pud" +0xd480: "pul" +0xd481: "pulg" +0xd482: "pulm" +0xd483: "pulb" +0xd484: "puls" +0xd485: "pult" +0xd486: "pulp" +0xd487: "pulh" +0xd488: "pum" +0xd489: "pub" +0xd48a: "pubs" +0xd48b: "pus" +0xd48c: "puss" +0xd48d: "pung" +0xd48e: "puj" +0xd48f: "puc" +0xd490: "puk" +0xd491: "put" +0xd492: "pup" +0xd493: "puh" +0xd494: "pweo" +0xd495: "pweog" +0xd496: "pweogg" +0xd497: "pweogs" +0xd498: "pweon" +0xd499: "pweonj" +0xd49a: "pweonh" +0xd49b: "pweod" +0xd49c: "pweol" +0xd49d: "pweolg" +0xd49e: "pweolm" +0xd49f: "pweolb" +0xd4a0: "pweols" +0xd4a1: "pweolt" +0xd4a2: "pweolp" +0xd4a3: "pweolh" +0xd4a4: "pweom" +0xd4a5: "pweob" +0xd4a6: "pweobs" +0xd4a7: "pweos" +0xd4a8: "pweoss" +0xd4a9: "pweong" +0xd4aa: "pweoj" +0xd4ab: "pweoc" +0xd4ac: "pweok" +0xd4ad: "pweot" +0xd4ae: "pweop" +0xd4af: "pweoh" +0xd4b0: "pwe" +0xd4b1: "pweg" +0xd4b2: "pwegg" +0xd4b3: "pwegs" +0xd4b4: "pwen" +0xd4b5: "pwenj" +0xd4b6: "pwenh" +0xd4b7: "pwed" +0xd4b8: "pwel" +0xd4b9: "pwelg" +0xd4ba: "pwelm" +0xd4bb: "pwelb" +0xd4bc: "pwels" +0xd4bd: "pwelt" +0xd4be: "pwelp" +0xd4bf: "pwelh" +0xd4c0: "pwem" +0xd4c1: "pweb" +0xd4c2: "pwebs" +0xd4c3: "pwes" +0xd4c4: "pwess" +0xd4c5: "pweng" +0xd4c6: "pwej" +0xd4c7: "pwec" +0xd4c8: "pwek" +0xd4c9: "pwet" +0xd4ca: "pwep" +0xd4cb: "pweh" +0xd4cc: "pwi" +0xd4cd: "pwig" +0xd4ce: "pwigg" +0xd4cf: "pwigs" +0xd4d0: "pwin" +0xd4d1: "pwinj" +0xd4d2: "pwinh" +0xd4d3: "pwid" +0xd4d4: "pwil" +0xd4d5: "pwilg" +0xd4d6: "pwilm" +0xd4d7: "pwilb" +0xd4d8: "pwils" +0xd4d9: "pwilt" +0xd4da: "pwilp" +0xd4db: "pwilh" +0xd4dc: "pwim" +0xd4dd: "pwib" +0xd4de: "pwibs" +0xd4df: "pwis" +0xd4e0: "pwiss" +0xd4e1: "pwing" +0xd4e2: "pwij" +0xd4e3: "pwic" +0xd4e4: "pwik" +0xd4e5: "pwit" +0xd4e6: "pwip" +0xd4e7: "pwih" +0xd4e8: "pyu" +0xd4e9: "pyug" +0xd4ea: "pyugg" +0xd4eb: "pyugs" +0xd4ec: "pyun" +0xd4ed: "pyunj" +0xd4ee: "pyunh" +0xd4ef: "pyud" +0xd4f0: "pyul" +0xd4f1: "pyulg" +0xd4f2: "pyulm" +0xd4f3: "pyulb" +0xd4f4: "pyuls" +0xd4f5: "pyult" +0xd4f6: "pyulp" +0xd4f7: "pyulh" +0xd4f8: "pyum" +0xd4f9: "pyub" +0xd4fa: "pyubs" +0xd4fb: "pyus" +0xd4fc: "pyuss" +0xd4fd: "pyung" +0xd4fe: "pyuj" +0xd4ff: "pyuc" +/* x0d5 */ +0xd500: "pyuk" +0xd501: "pyut" +0xd502: "pyup" +0xd503: "pyuh" +0xd504: "peu" +0xd505: "peug" +0xd506: "peugg" +0xd507: "peugs" +0xd508: "peun" +0xd509: "peunj" +0xd50a: "peunh" +0xd50b: "peud" +0xd50c: "peul" +0xd50d: "peulg" +0xd50e: "peulm" +0xd50f: "peulb" +0xd510: "peuls" +0xd511: "peult" +0xd512: "peulp" +0xd513: "peulh" +0xd514: "peum" +0xd515: "peub" +0xd516: "peubs" +0xd517: "peus" +0xd518: "peuss" +0xd519: "peung" +0xd51a: "peuj" +0xd51b: "peuc" +0xd51c: "peuk" +0xd51d: "peut" +0xd51e: "peup" +0xd51f: "peuh" +0xd520: "pyi" +0xd521: "pyig" +0xd522: "pyigg" +0xd523: "pyigs" +0xd524: "pyin" +0xd525: "pyinj" +0xd526: "pyinh" +0xd527: "pyid" +0xd528: "pyil" +0xd529: "pyilg" +0xd52a: "pyilm" +0xd52b: "pyilb" +0xd52c: "pyils" +0xd52d: "pyilt" +0xd52e: "pyilp" +0xd52f: "pyilh" +0xd530: "pyim" +0xd531: "pyib" +0xd532: "pyibs" +0xd533: "pyis" +0xd534: "pyiss" +0xd535: "pying" +0xd536: "pyij" +0xd537: "pyic" +0xd538: "pyik" +0xd539: "pyit" +0xd53a: "pyip" +0xd53b: "pyih" +0xd53c: "pi" +0xd53d: "pig" +0xd53e: "pigg" +0xd53f: "pigs" +0xd540: "pin" +0xd541: "pinj" +0xd542: "pinh" +0xd543: "pid" +0xd544: "pil" +0xd545: "pilg" +0xd546: "pilm" +0xd547: "pilb" +0xd548: "pils" +0xd549: "pilt" +0xd54a: "pilp" +0xd54b: "pilh" +0xd54c: "pim" +0xd54d: "pib" +0xd54e: "pibs" +0xd54f: "pis" +0xd550: "piss" +0xd551: "ping" +0xd552: "pij" +0xd553: "pic" +0xd554: "pik" +0xd555: "pit" +0xd556: "pip" +0xd557: "pih" +0xd558: "ha" +0xd559: "hag" +0xd55a: "hagg" +0xd55b: "hags" +0xd55c: "han" +0xd55d: "hanj" +0xd55e: "hanh" +0xd55f: "had" +0xd560: "hal" +0xd561: "halg" +0xd562: "halm" +0xd563: "halb" +0xd564: "hals" +0xd565: "halt" +0xd566: "halp" +0xd567: "halh" +0xd568: "ham" +0xd569: "hab" +0xd56a: "habs" +0xd56b: "has" +0xd56c: "hass" +0xd56d: "hang" +0xd56e: "haj" +0xd56f: "hac" +0xd570: "hak" +0xd571: "hat" +0xd572: "hap" +0xd573: "hah" +0xd574: "hae" +0xd575: "haeg" +0xd576: "haegg" +0xd577: "haegs" +0xd578: "haen" +0xd579: "haenj" +0xd57a: "haenh" +0xd57b: "haed" +0xd57c: "hael" +0xd57d: "haelg" +0xd57e: "haelm" +0xd57f: "haelb" +0xd580: "haels" +0xd581: "haelt" +0xd582: "haelp" +0xd583: "haelh" +0xd584: "haem" +0xd585: "haeb" +0xd586: "haebs" +0xd587: "haes" +0xd588: "haess" +0xd589: "haeng" +0xd58a: "haej" +0xd58b: "haec" +0xd58c: "haek" +0xd58d: "haet" +0xd58e: "haep" +0xd58f: "haeh" +0xd590: "hya" +0xd591: "hyag" +0xd592: "hyagg" +0xd593: "hyags" +0xd594: "hyan" +0xd595: "hyanj" +0xd596: "hyanh" +0xd597: "hyad" +0xd598: "hyal" +0xd599: "hyalg" +0xd59a: "hyalm" +0xd59b: "hyalb" +0xd59c: "hyals" +0xd59d: "hyalt" +0xd59e: "hyalp" +0xd59f: "hyalh" +0xd5a0: "hyam" +0xd5a1: "hyab" +0xd5a2: "hyabs" +0xd5a3: "hyas" +0xd5a4: "hyass" +0xd5a5: "hyang" +0xd5a6: "hyaj" +0xd5a7: "hyac" +0xd5a8: "hyak" +0xd5a9: "hyat" +0xd5aa: "hyap" +0xd5ab: "hyah" +0xd5ac: "hyae" +0xd5ad: "hyaeg" +0xd5ae: "hyaegg" +0xd5af: "hyaegs" +0xd5b0: "hyaen" +0xd5b1: "hyaenj" +0xd5b2: "hyaenh" +0xd5b3: "hyaed" +0xd5b4: "hyael" +0xd5b5: "hyaelg" +0xd5b6: "hyaelm" +0xd5b7: "hyaelb" +0xd5b8: "hyaels" +0xd5b9: "hyaelt" +0xd5ba: "hyaelp" +0xd5bb: "hyaelh" +0xd5bc: "hyaem" +0xd5bd: "hyaeb" +0xd5be: "hyaebs" +0xd5bf: "hyaes" +0xd5c0: "hyaess" +0xd5c1: "hyaeng" +0xd5c2: "hyaej" +0xd5c3: "hyaec" +0xd5c4: "hyaek" +0xd5c5: "hyaet" +0xd5c6: "hyaep" +0xd5c7: "hyaeh" +0xd5c8: "heo" +0xd5c9: "heog" +0xd5ca: "heogg" +0xd5cb: "heogs" +0xd5cc: "heon" +0xd5cd: "heonj" +0xd5ce: "heonh" +0xd5cf: "heod" +0xd5d0: "heol" +0xd5d1: "heolg" +0xd5d2: "heolm" +0xd5d3: "heolb" +0xd5d4: "heols" +0xd5d5: "heolt" +0xd5d6: "heolp" +0xd5d7: "heolh" +0xd5d8: "heom" +0xd5d9: "heob" +0xd5da: "heobs" +0xd5db: "heos" +0xd5dc: "heoss" +0xd5dd: "heong" +0xd5de: "heoj" +0xd5df: "heoc" +0xd5e0: "heok" +0xd5e1: "heot" +0xd5e2: "heop" +0xd5e3: "heoh" +0xd5e4: "he" +0xd5e5: "heg" +0xd5e6: "hegg" +0xd5e7: "hegs" +0xd5e8: "hen" +0xd5e9: "henj" +0xd5ea: "henh" +0xd5eb: "hed" +0xd5ec: "hel" +0xd5ed: "helg" +0xd5ee: "helm" +0xd5ef: "helb" +0xd5f0: "hels" +0xd5f1: "helt" +0xd5f2: "help" +0xd5f3: "helh" +0xd5f4: "hem" +0xd5f5: "heb" +0xd5f6: "hebs" +0xd5f7: "hes" +0xd5f8: "hess" +0xd5f9: "heng" +0xd5fa: "hej" +0xd5fb: "hec" +0xd5fc: "hek" +0xd5fd: "het" +0xd5fe: "hep" +0xd5ff: "heh" +/* x0d6 */ +0xd600: "hyeo" +0xd601: "hyeog" +0xd602: "hyeogg" +0xd603: "hyeogs" +0xd604: "hyeon" +0xd605: "hyeonj" +0xd606: "hyeonh" +0xd607: "hyeod" +0xd608: "hyeol" +0xd609: "hyeolg" +0xd60a: "hyeolm" +0xd60b: "hyeolb" +0xd60c: "hyeols" +0xd60d: "hyeolt" +0xd60e: "hyeolp" +0xd60f: "hyeolh" +0xd610: "hyeom" +0xd611: "hyeob" +0xd612: "hyeobs" +0xd613: "hyeos" +0xd614: "hyeoss" +0xd615: "hyeong" +0xd616: "hyeoj" +0xd617: "hyeoc" +0xd618: "hyeok" +0xd619: "hyeot" +0xd61a: "hyeop" +0xd61b: "hyeoh" +0xd61c: "hye" +0xd61d: "hyeg" +0xd61e: "hyegg" +0xd61f: "hyegs" +0xd620: "hyen" +0xd621: "hyenj" +0xd622: "hyenh" +0xd623: "hyed" +0xd624: "hyel" +0xd625: "hyelg" +0xd626: "hyelm" +0xd627: "hyelb" +0xd628: "hyels" +0xd629: "hyelt" +0xd62a: "hyelp" +0xd62b: "hyelh" +0xd62c: "hyem" +0xd62d: "hyeb" +0xd62e: "hyebs" +0xd62f: "hyes" +0xd630: "hyess" +0xd631: "hyeng" +0xd632: "hyej" +0xd633: "hyec" +0xd634: "hyek" +0xd635: "hyet" +0xd636: "hyep" +0xd637: "hyeh" +0xd638: "ho" +0xd639: "hog" +0xd63a: "hogg" +0xd63b: "hogs" +0xd63c: "hon" +0xd63d: "honj" +0xd63e: "honh" +0xd63f: "hod" +0xd640: "hol" +0xd641: "holg" +0xd642: "holm" +0xd643: "holb" +0xd644: "hols" +0xd645: "holt" +0xd646: "holp" +0xd647: "holh" +0xd648: "hom" +0xd649: "hob" +0xd64a: "hobs" +0xd64b: "hos" +0xd64c: "hoss" +0xd64d: "hong" +0xd64e: "hoj" +0xd64f: "hoc" +0xd650: "hok" +0xd651: "hot" +0xd652: "hop" +0xd653: "hoh" +0xd654: "hwa" +0xd655: "hwag" +0xd656: "hwagg" +0xd657: "hwags" +0xd658: "hwan" +0xd659: "hwanj" +0xd65a: "hwanh" +0xd65b: "hwad" +0xd65c: "hwal" +0xd65d: "hwalg" +0xd65e: "hwalm" +0xd65f: "hwalb" +0xd660: "hwals" +0xd661: "hwalt" +0xd662: "hwalp" +0xd663: "hwalh" +0xd664: "hwam" +0xd665: "hwab" +0xd666: "hwabs" +0xd667: "hwas" +0xd668: "hwass" +0xd669: "hwang" +0xd66a: "hwaj" +0xd66b: "hwac" +0xd66c: "hwak" +0xd66d: "hwat" +0xd66e: "hwap" +0xd66f: "hwah" +0xd670: "hwae" +0xd671: "hwaeg" +0xd672: "hwaegg" +0xd673: "hwaegs" +0xd674: "hwaen" +0xd675: "hwaenj" +0xd676: "hwaenh" +0xd677: "hwaed" +0xd678: "hwael" +0xd679: "hwaelg" +0xd67a: "hwaelm" +0xd67b: "hwaelb" +0xd67c: "hwaels" +0xd67d: "hwaelt" +0xd67e: "hwaelp" +0xd67f: "hwaelh" +0xd680: "hwaem" +0xd681: "hwaeb" +0xd682: "hwaebs" +0xd683: "hwaes" +0xd684: "hwaess" +0xd685: "hwaeng" +0xd686: "hwaej" +0xd687: "hwaec" +0xd688: "hwaek" +0xd689: "hwaet" +0xd68a: "hwaep" +0xd68b: "hwaeh" +0xd68c: "hoe" +0xd68d: "hoeg" +0xd68e: "hoegg" +0xd68f: "hoegs" +0xd690: "hoen" +0xd691: "hoenj" +0xd692: "hoenh" +0xd693: "hoed" +0xd694: "hoel" +0xd695: "hoelg" +0xd696: "hoelm" +0xd697: "hoelb" +0xd698: "hoels" +0xd699: "hoelt" +0xd69a: "hoelp" +0xd69b: "hoelh" +0xd69c: "hoem" +0xd69d: "hoeb" +0xd69e: "hoebs" +0xd69f: "hoes" +0xd6a0: "hoess" +0xd6a1: "hoeng" +0xd6a2: "hoej" +0xd6a3: "hoec" +0xd6a4: "hoek" +0xd6a5: "hoet" +0xd6a6: "hoep" +0xd6a7: "hoeh" +0xd6a8: "hyo" +0xd6a9: "hyog" +0xd6aa: "hyogg" +0xd6ab: "hyogs" +0xd6ac: "hyon" +0xd6ad: "hyonj" +0xd6ae: "hyonh" +0xd6af: "hyod" +0xd6b0: "hyol" +0xd6b1: "hyolg" +0xd6b2: "hyolm" +0xd6b3: "hyolb" +0xd6b4: "hyols" +0xd6b5: "hyolt" +0xd6b6: "hyolp" +0xd6b7: "hyolh" +0xd6b8: "hyom" +0xd6b9: "hyob" +0xd6ba: "hyobs" +0xd6bb: "hyos" +0xd6bc: "hyoss" +0xd6bd: "hyong" +0xd6be: "hyoj" +0xd6bf: "hyoc" +0xd6c0: "hyok" +0xd6c1: "hyot" +0xd6c2: "hyop" +0xd6c3: "hyoh" +0xd6c4: "hu" +0xd6c5: "hug" +0xd6c6: "hugg" +0xd6c7: "hugs" +0xd6c8: "hun" +0xd6c9: "hunj" +0xd6ca: "hunh" +0xd6cb: "hud" +0xd6cc: "hul" +0xd6cd: "hulg" +0xd6ce: "hulm" +0xd6cf: "hulb" +0xd6d0: "huls" +0xd6d1: "hult" +0xd6d2: "hulp" +0xd6d3: "hulh" +0xd6d4: "hum" +0xd6d5: "hub" +0xd6d6: "hubs" +0xd6d7: "hus" +0xd6d8: "huss" +0xd6d9: "hung" +0xd6da: "huj" +0xd6db: "huc" +0xd6dc: "huk" +0xd6dd: "hut" +0xd6de: "hup" +0xd6df: "huh" +0xd6e0: "hweo" +0xd6e1: "hweog" +0xd6e2: "hweogg" +0xd6e3: "hweogs" +0xd6e4: "hweon" +0xd6e5: "hweonj" +0xd6e6: "hweonh" +0xd6e7: "hweod" +0xd6e8: "hweol" +0xd6e9: "hweolg" +0xd6ea: "hweolm" +0xd6eb: "hweolb" +0xd6ec: "hweols" +0xd6ed: "hweolt" +0xd6ee: "hweolp" +0xd6ef: "hweolh" +0xd6f0: "hweom" +0xd6f1: "hweob" +0xd6f2: "hweobs" +0xd6f3: "hweos" +0xd6f4: "hweoss" +0xd6f5: "hweong" +0xd6f6: "hweoj" +0xd6f7: "hweoc" +0xd6f8: "hweok" +0xd6f9: "hweot" +0xd6fa: "hweop" +0xd6fb: "hweoh" +0xd6fc: "hwe" +0xd6fd: "hweg" +0xd6fe: "hwegg" +0xd6ff: "hwegs" +/* x0d7 */ +0xd700: "hwen" +0xd701: "hwenj" +0xd702: "hwenh" +0xd703: "hwed" +0xd704: "hwel" +0xd705: "hwelg" +0xd706: "hwelm" +0xd707: "hwelb" +0xd708: "hwels" +0xd709: "hwelt" +0xd70a: "hwelp" +0xd70b: "hwelh" +0xd70c: "hwem" +0xd70d: "hweb" +0xd70e: "hwebs" +0xd70f: "hwes" +0xd710: "hwess" +0xd711: "hweng" +0xd712: "hwej" +0xd713: "hwec" +0xd714: "hwek" +0xd715: "hwet" +0xd716: "hwep" +0xd717: "hweh" +0xd718: "hwi" +0xd719: "hwig" +0xd71a: "hwigg" +0xd71b: "hwigs" +0xd71c: "hwin" +0xd71d: "hwinj" +0xd71e: "hwinh" +0xd71f: "hwid" +0xd720: "hwil" +0xd721: "hwilg" +0xd722: "hwilm" +0xd723: "hwilb" +0xd724: "hwils" +0xd725: "hwilt" +0xd726: "hwilp" +0xd727: "hwilh" +0xd728: "hwim" +0xd729: "hwib" +0xd72a: "hwibs" +0xd72b: "hwis" +0xd72c: "hwiss" +0xd72d: "hwing" +0xd72e: "hwij" +0xd72f: "hwic" +0xd730: "hwik" +0xd731: "hwit" +0xd732: "hwip" +0xd733: "hwih" +0xd734: "hyu" +0xd735: "hyug" +0xd736: "hyugg" +0xd737: "hyugs" +0xd738: "hyun" +0xd739: "hyunj" +0xd73a: "hyunh" +0xd73b: "hyud" +0xd73c: "hyul" +0xd73d: "hyulg" +0xd73e: "hyulm" +0xd73f: "hyulb" +0xd740: "hyuls" +0xd741: "hyult" +0xd742: "hyulp" +0xd743: "hyulh" +0xd744: "hyum" +0xd745: "hyub" +0xd746: "hyubs" +0xd747: "hyus" +0xd748: "hyuss" +0xd749: "hyung" +0xd74a: "hyuj" +0xd74b: "hyuc" +0xd74c: "hyuk" +0xd74d: "hyut" +0xd74e: "hyup" +0xd74f: "hyuh" +0xd750: "heu" +0xd751: "heug" +0xd752: "heugg" +0xd753: "heugs" +0xd754: "heun" +0xd755: "heunj" +0xd756: "heunh" +0xd757: "heud" +0xd758: "heul" +0xd759: "heulg" +0xd75a: "heulm" +0xd75b: "heulb" +0xd75c: "heuls" +0xd75d: "heult" +0xd75e: "heulp" +0xd75f: "heulh" +0xd760: "heum" +0xd761: "heub" +0xd762: "heubs" +0xd763: "heus" +0xd764: "heuss" +0xd765: "heung" +0xd766: "heuj" +0xd767: "heuc" +0xd768: "heuk" +0xd769: "heut" +0xd76a: "heup" +0xd76b: "heuh" +0xd76c: "hyi" +0xd76d: "hyig" +0xd76e: "hyigg" +0xd76f: "hyigs" +0xd770: "hyin" +0xd771: "hyinj" +0xd772: "hyinh" +0xd773: "hyid" +0xd774: "hyil" +0xd775: "hyilg" +0xd776: "hyilm" +0xd777: "hyilb" +0xd778: "hyils" +0xd779: "hyilt" +0xd77a: "hyilp" +0xd77b: "hyilh" +0xd77c: "hyim" +0xd77d: "hyib" +0xd77e: "hyibs" +0xd77f: "hyis" +0xd780: "hyiss" +0xd781: "hying" +0xd782: "hyij" +0xd783: "hyic" +0xd784: "hyik" +0xd785: "hyit" +0xd786: "hyip" +0xd787: "hyih" +0xd788: "hi" +0xd789: "hig" +0xd78a: "higg" +0xd78b: "higs" +0xd78c: "hin" +0xd78d: "hinj" +0xd78e: "hinh" +0xd78f: "hid" +0xd790: "hil" +0xd791: "hilg" +0xd792: "hilm" +0xd793: "hilb" +0xd794: "hils" +0xd795: "hilt" +0xd796: "hilp" +0xd797: "hilh" +0xd798: "him" +0xd799: "hib" +0xd79a: "hibs" +0xd79b: "his" +0xd79c: "hiss" +0xd79d: "hing" +0xd79e: "hij" +0xd79f: "hic" +0xd7a0: "hik" +0xd7a1: "hit" +0xd7a2: "hip" +0xd7a3: "hih" +0xd7a4: "[?]" +0xd7a5: "[?]" +0xd7a6: "[?]" +0xd7a7: "[?]" +0xd7a8: "[?]" +0xd7a9: "[?]" +0xd7aa: "[?]" +0xd7ab: "[?]" +0xd7ac: "[?]" +0xd7ad: "[?]" +0xd7ae: "[?]" +0xd7af: "[?]" +0xd7b0: "[?]" +0xd7b1: "[?]" +0xd7b2: "[?]" +0xd7b3: "[?]" +0xd7b4: "[?]" +0xd7b5: "[?]" +0xd7b6: "[?]" +0xd7b7: "[?]" +0xd7b8: "[?]" +0xd7b9: "[?]" +0xd7ba: "[?]" +0xd7bb: "[?]" +0xd7bc: "[?]" +0xd7bd: "[?]" +0xd7be: "[?]" +0xd7bf: "[?]" +0xd7c0: "[?]" +0xd7c1: "[?]" +0xd7c2: "[?]" +0xd7c3: "[?]" +0xd7c4: "[?]" +0xd7c5: "[?]" +0xd7c6: "[?]" +0xd7c7: "[?]" +0xd7c8: "[?]" +0xd7c9: "[?]" +0xd7ca: "[?]" +0xd7cb: "[?]" +0xd7cc: "[?]" +0xd7cd: "[?]" +0xd7ce: "[?]" +0xd7cf: "[?]" +0xd7d0: "[?]" +0xd7d1: "[?]" +0xd7d2: "[?]" +0xd7d3: "[?]" +0xd7d4: "[?]" +0xd7d5: "[?]" +0xd7d6: "[?]" +0xd7d7: "[?]" +0xd7d8: "[?]" +0xd7d9: "[?]" +0xd7da: "[?]" +0xd7db: "[?]" +0xd7dc: "[?]" +0xd7dd: "[?]" +0xd7de: "[?]" +0xd7df: "[?]" +0xd7e0: "[?]" +0xd7e1: "[?]" +0xd7e2: "[?]" +0xd7e3: "[?]" +0xd7e4: "[?]" +0xd7e5: "[?]" +0xd7e6: "[?]" +0xd7e7: "[?]" +0xd7e8: "[?]" +0xd7e9: "[?]" +0xd7ea: "[?]" +0xd7eb: "[?]" +0xd7ec: "[?]" +0xd7ed: "[?]" +0xd7ee: "[?]" +0xd7ef: "[?]" +0xd7f0: "[?]" +0xd7f1: "[?]" +0xd7f2: "[?]" +0xd7f3: "[?]" +0xd7f4: "[?]" +0xd7f5: "[?]" +0xd7f6: "[?]" +0xd7f7: "[?]" +0xd7f8: "[?]" +0xd7f9: "[?]" +0xd7fa: "[?]" +0xd7fb: "[?]" +0xd7fc: "[?]" +0xd7fd: "[?]" +0xd7fe: "[?]" +/* x0f9 */ +0xf900: "Kay " +0xf901: "Kayng " +0xf902: "Ke " +0xf903: "Ko " +0xf904: "Kol " +0xf905: "Koc " +0xf906: "Kwi " +0xf907: "Kwi " +0xf908: "Kyun " +0xf909: "Kul " +0xf90a: "Kum " +0xf90b: "Na " +0xf90c: "Na " +0xf90d: "Na " +0xf90e: "La " +0xf90f: "Na " +0xf910: "Na " +0xf911: "Na " +0xf912: "Na " +0xf913: "Na " +0xf914: "Nak " +0xf915: "Nak " +0xf916: "Nak " +0xf917: "Nak " +0xf918: "Nak " +0xf919: "Nak " +0xf91a: "Nak " +0xf91b: "Nan " +0xf91c: "Nan " +0xf91d: "Nan " +0xf91e: "Nan " +0xf91f: "Nan " +0xf920: "Nan " +0xf921: "Nam " +0xf922: "Nam " +0xf923: "Nam " +0xf924: "Nam " +0xf925: "Nap " +0xf926: "Nap " +0xf927: "Nap " +0xf928: "Nang " +0xf929: "Nang " +0xf92a: "Nang " +0xf92b: "Nang " +0xf92c: "Nang " +0xf92d: "Nay " +0xf92e: "Nayng " +0xf92f: "No " +0xf930: "No " +0xf931: "No " +0xf932: "No " +0xf933: "No " +0xf934: "No " +0xf935: "No " +0xf936: "No " +0xf937: "No " +0xf938: "No " +0xf939: "No " +0xf93a: "No " +0xf93b: "Nok " +0xf93c: "Nok " +0xf93d: "Nok " +0xf93e: "Nok " +0xf93f: "Nok " +0xf940: "Nok " +0xf941: "Non " +0xf942: "Nong " +0xf943: "Nong " +0xf944: "Nong " +0xf945: "Nong " +0xf946: "Noy " +0xf947: "Noy " +0xf948: "Noy " +0xf949: "Noy " +0xf94a: "Nwu " +0xf94b: "Nwu " +0xf94c: "Nwu " +0xf94d: "Nwu " +0xf94e: "Nwu " +0xf94f: "Nwu " +0xf950: "Nwu " +0xf951: "Nwu " +0xf952: "Nuk " +0xf953: "Nuk " +0xf954: "Num " +0xf955: "Nung " +0xf956: "Nung " +0xf957: "Nung " +0xf958: "Nung " +0xf959: "Nung " +0xf95a: "Twu " +0xf95b: "La " +0xf95c: "Lak " +0xf95d: "Lak " +0xf95e: "Lan " +0xf95f: "Lyeng " +0xf960: "Lo " +0xf961: "Lyul " +0xf962: "Li " +0xf963: "Pey " +0xf964: "Pen " +0xf965: "Pyen " +0xf966: "Pwu " +0xf967: "Pwul " +0xf968: "Pi " +0xf969: "Sak " +0xf96a: "Sak " +0xf96b: "Sam " +0xf96c: "Sayk " +0xf96d: "Sayng " +0xf96e: "Sep " +0xf96f: "Sey " +0xf970: "Sway " +0xf971: "Sin " +0xf972: "Sim " +0xf973: "Sip " +0xf974: "Ya " +0xf975: "Yak " +0xf976: "Yak " +0xf977: "Yang " +0xf978: "Yang " +0xf979: "Yang " +0xf97a: "Yang " +0xf97b: "Yang " +0xf97c: "Yang " +0xf97d: "Yang " +0xf97e: "Yang " +0xf97f: "Ye " +0xf980: "Ye " +0xf981: "Ye " +0xf982: "Ye " +0xf983: "Ye " +0xf984: "Ye " +0xf985: "Ye " +0xf986: "Ye " +0xf987: "Ye " +0xf988: "Ye " +0xf989: "Ye " +0xf98a: "Yek " +0xf98b: "Yek " +0xf98c: "Yek " +0xf98d: "Yek " +0xf98e: "Yen " +0xf98f: "Yen " +0xf990: "Yen " +0xf991: "Yen " +0xf992: "Yen " +0xf993: "Yen " +0xf994: "Yen " +0xf995: "Yen " +0xf996: "Yen " +0xf997: "Yen " +0xf998: "Yen " +0xf999: "Yen " +0xf99a: "Yen " +0xf99b: "Yen " +0xf99c: "Yel " +0xf99d: "Yel " +0xf99e: "Yel " +0xf99f: "Yel " +0xf9a0: "Yel " +0xf9a1: "Yel " +0xf9a2: "Yem " +0xf9a3: "Yem " +0xf9a4: "Yem " +0xf9a5: "Yem " +0xf9a6: "Yem " +0xf9a7: "Yep " +0xf9a8: "Yeng " +0xf9a9: "Yeng " +0xf9aa: "Yeng " +0xf9ab: "Yeng " +0xf9ac: "Yeng " +0xf9ad: "Yeng " +0xf9ae: "Yeng " +0xf9af: "Yeng " +0xf9b0: "Yeng " +0xf9b1: "Yeng " +0xf9b2: "Yeng " +0xf9b3: "Yeng " +0xf9b4: "Yeng " +0xf9b5: "Yey " +0xf9b6: "Yey " +0xf9b7: "Yey " +0xf9b8: "Yey " +0xf9b9: "O " +0xf9ba: "Yo " +0xf9bb: "Yo " +0xf9bc: "Yo " +0xf9bd: "Yo " +0xf9be: "Yo " +0xf9bf: "Yo " +0xf9c0: "Yo " +0xf9c1: "Yo " +0xf9c2: "Yo " +0xf9c3: "Yo " +0xf9c4: "Yong " +0xf9c5: "Wun " +0xf9c6: "Wen " +0xf9c7: "Yu " +0xf9c8: "Yu " +0xf9c9: "Yu " +0xf9ca: "Yu " +0xf9cb: "Yu " +0xf9cc: "Yu " +0xf9cd: "Yu " +0xf9ce: "Yu " +0xf9cf: "Yu " +0xf9d0: "Yu " +0xf9d1: "Yuk " +0xf9d2: "Yuk " +0xf9d3: "Yuk " +0xf9d4: "Yun " +0xf9d5: "Yun " +0xf9d6: "Yun " +0xf9d7: "Yun " +0xf9d8: "Yul " +0xf9d9: "Yul " +0xf9da: "Yul " +0xf9db: "Yul " +0xf9dc: "Yung " +0xf9dd: "I " +0xf9de: "I " +0xf9df: "I " +0xf9e0: "I " +0xf9e1: "I " +0xf9e2: "I " +0xf9e3: "I " +0xf9e4: "I " +0xf9e5: "I " +0xf9e6: "I " +0xf9e7: "I " +0xf9e8: "I " +0xf9e9: "I " +0xf9ea: "I " +0xf9eb: "Ik " +0xf9ec: "Ik " +0xf9ed: "In " +0xf9ee: "In " +0xf9ef: "In " +0xf9f0: "In " +0xf9f1: "In " +0xf9f2: "In " +0xf9f3: "In " +0xf9f4: "Im " +0xf9f5: "Im " +0xf9f6: "Im " +0xf9f7: "Ip " +0xf9f8: "Ip " +0xf9f9: "Ip " +0xf9fa: "Cang " +0xf9fb: "Cek " +0xf9fc: "Ci " +0xf9fd: "Cip " +0xf9fe: "Cha " +0xf9ff: "Chek " +/* x0fa */ +0xfa00: "Chey " +0xfa01: "Thak " +0xfa02: "Thak " +0xfa03: "Thang " +0xfa04: "Thayk " +0xfa05: "Thong " +0xfa06: "Pho " +0xfa07: "Phok " +0xfa08: "Hang " +0xfa09: "Hang " +0xfa0a: "Hyen " +0xfa0b: "Hwak " +0xfa0c: "Wu " +0xfa0d: "Huo " +0xfa0e: "[?] " +0xfa0f: "[?] " +0xfa10: "Zhong " +0xfa11: "[?] " +0xfa12: "Qing " +0xfa13: "[?] " +0xfa14: "[?] " +0xfa15: "Xi " +0xfa16: "Zhu " +0xfa17: "Yi " +0xfa18: "Li " +0xfa19: "Shen " +0xfa1a: "Xiang " +0xfa1b: "Fu " +0xfa1c: "Jing " +0xfa1d: "Jing " +0xfa1e: "Yu " +0xfa1f: "[?] " +0xfa20: "Hagi " +0xfa21: "[?] " +0xfa22: "Zhu " +0xfa23: "[?] " +0xfa24: "[?] " +0xfa25: "Yi " +0xfa26: "Du " +0xfa27: "[?] " +0xfa28: "[?] " +0xfa29: "[?] " +0xfa2a: "Fan " +0xfa2b: "Si " +0xfa2c: "Guan " +0xfa2d: "[?]" +0xfa2e: "[?]" +0xfa2f: "[?]" +0xfa30: "[?]" +0xfa31: "[?]" +0xfa32: "[?]" +0xfa33: "[?]" +0xfa34: "[?]" +0xfa35: "[?]" +0xfa36: "[?]" +0xfa37: "[?]" +0xfa38: "[?]" +0xfa39: "[?]" +0xfa3a: "[?]" +0xfa3b: "[?]" +0xfa3c: "[?]" +0xfa3d: "[?]" +0xfa3e: "[?]" +0xfa3f: "[?]" +0xfa40: "[?]" +0xfa41: "[?]" +0xfa42: "[?]" +0xfa43: "[?]" +0xfa44: "[?]" +0xfa45: "[?]" +0xfa46: "[?]" +0xfa47: "[?]" +0xfa48: "[?]" +0xfa49: "[?]" +0xfa4a: "[?]" +0xfa4b: "[?]" +0xfa4c: "[?]" +0xfa4d: "[?]" +0xfa4e: "[?]" +0xfa4f: "[?]" +0xfa50: "[?]" +0xfa51: "[?]" +0xfa52: "[?]" +0xfa53: "[?]" +0xfa54: "[?]" +0xfa55: "[?]" +0xfa56: "[?]" +0xfa57: "[?]" +0xfa58: "[?]" +0xfa59: "[?]" +0xfa5a: "[?]" +0xfa5b: "[?]" +0xfa5c: "[?]" +0xfa5d: "[?]" +0xfa5e: "[?]" +0xfa5f: "[?]" +0xfa60: "[?]" +0xfa61: "[?]" +0xfa62: "[?]" +0xfa63: "[?]" +0xfa64: "[?]" +0xfa65: "[?]" +0xfa66: "[?]" +0xfa67: "[?]" +0xfa68: "[?]" +0xfa69: "[?]" +0xfa6a: "[?]" +0xfa6b: "[?]" +0xfa6c: "[?]" +0xfa6d: "[?]" +0xfa6e: "[?]" +0xfa6f: "[?]" +0xfa70: "[?]" +0xfa71: "[?]" +0xfa72: "[?]" +0xfa73: "[?]" +0xfa74: "[?]" +0xfa75: "[?]" +0xfa76: "[?]" +0xfa77: "[?]" +0xfa78: "[?]" +0xfa79: "[?]" +0xfa7a: "[?]" +0xfa7b: "[?]" +0xfa7c: "[?]" +0xfa7d: "[?]" +0xfa7e: "[?]" +0xfa7f: "[?]" +0xfa80: "[?]" +0xfa81: "[?]" +0xfa82: "[?]" +0xfa83: "[?]" +0xfa84: "[?]" +0xfa85: "[?]" +0xfa86: "[?]" +0xfa87: "[?]" +0xfa88: "[?]" +0xfa89: "[?]" +0xfa8a: "[?]" +0xfa8b: "[?]" +0xfa8c: "[?]" +0xfa8d: "[?]" +0xfa8e: "[?]" +0xfa8f: "[?]" +0xfa90: "[?]" +0xfa91: "[?]" +0xfa92: "[?]" +0xfa93: "[?]" +0xfa94: "[?]" +0xfa95: "[?]" +0xfa96: "[?]" +0xfa97: "[?]" +0xfa98: "[?]" +0xfa99: "[?]" +0xfa9a: "[?]" +0xfa9b: "[?]" +0xfa9c: "[?]" +0xfa9d: "[?]" +0xfa9e: "[?]" +0xfa9f: "[?]" +0xfaa0: "[?]" +0xfaa1: "[?]" +0xfaa2: "[?]" +0xfaa3: "[?]" +0xfaa4: "[?]" +0xfaa5: "[?]" +0xfaa6: "[?]" +0xfaa7: "[?]" +0xfaa8: "[?]" +0xfaa9: "[?]" +0xfaaa: "[?]" +0xfaab: "[?]" +0xfaac: "[?]" +0xfaad: "[?]" +0xfaae: "[?]" +0xfaaf: "[?]" +0xfab0: "[?]" +0xfab1: "[?]" +0xfab2: "[?]" +0xfab3: "[?]" +0xfab4: "[?]" +0xfab5: "[?]" +0xfab6: "[?]" +0xfab7: "[?]" +0xfab8: "[?]" +0xfab9: "[?]" +0xfaba: "[?]" +0xfabb: "[?]" +0xfabc: "[?]" +0xfabd: "[?]" +0xfabe: "[?]" +0xfabf: "[?]" +0xfac0: "[?]" +0xfac1: "[?]" +0xfac2: "[?]" +0xfac3: "[?]" +0xfac4: "[?]" +0xfac5: "[?]" +0xfac6: "[?]" +0xfac7: "[?]" +0xfac8: "[?]" +0xfac9: "[?]" +0xfaca: "[?]" +0xfacb: "[?]" +0xfacc: "[?]" +0xfacd: "[?]" +0xface: "[?]" +0xfacf: "[?]" +0xfad0: "[?]" +0xfad1: "[?]" +0xfad2: "[?]" +0xfad3: "[?]" +0xfad4: "[?]" +0xfad5: "[?]" +0xfad6: "[?]" +0xfad7: "[?]" +0xfad8: "[?]" +0xfad9: "[?]" +0xfada: "[?]" +0xfadb: "[?]" +0xfadc: "[?]" +0xfadd: "[?]" +0xfade: "[?]" +0xfadf: "[?]" +0xfae0: "[?]" +0xfae1: "[?]" +0xfae2: "[?]" +0xfae3: "[?]" +0xfae4: "[?]" +0xfae5: "[?]" +0xfae6: "[?]" +0xfae7: "[?]" +0xfae8: "[?]" +0xfae9: "[?]" +0xfaea: "[?]" +0xfaeb: "[?]" +0xfaec: "[?]" +0xfaed: "[?]" +0xfaee: "[?]" +0xfaef: "[?]" +0xfaf0: "[?]" +0xfaf1: "[?]" +0xfaf2: "[?]" +0xfaf3: "[?]" +0xfaf4: "[?]" +0xfaf5: "[?]" +0xfaf6: "[?]" +0xfaf7: "[?]" +0xfaf8: "[?]" +0xfaf9: "[?]" +0xfafa: "[?]" +0xfafb: "[?]" +0xfafc: "[?]" +0xfafd: "[?]" +0xfafe: "[?]" +/* x0fb */ +0xfb00: "ff" +0xfb01: "fi" +0xfb02: "fl" +0xfb03: "ffi" +0xfb04: "ffl" +0xfb05: "st" +0xfb06: "st" +0xfb07: "[?]" +0xfb08: "[?]" +0xfb09: "[?]" +0xfb0a: "[?]" +0xfb0b: "[?]" +0xfb0c: "[?]" +0xfb0d: "[?]" +0xfb0e: "[?]" +0xfb0f: "[?]" +0xfb10: "[?]" +0xfb11: "[?]" +0xfb12: "[?]" +0xfb13: "mn" +0xfb14: "me" +0xfb15: "mi" +0xfb16: "vn" +0xfb17: "mkh" +0xfb18: "[?]" +0xfb19: "[?]" +0xfb1a: "[?]" +0xfb1b: "[?]" +0xfb1c: "[?]" +0xfb1d: "yi" +0xfb1e: "" +0xfb1f: "ay" +0xfb20: "`" +0xfb21: "" +0xfb22: "d" +0xfb23: "h" +0xfb24: "k" +0xfb25: "l" +0xfb26: "m" +0xfb27: "m" +0xfb28: "t" +0xfb29: "+" +0xfb2a: "sh" +0xfb2b: "s" +0xfb2c: "sh" +0xfb2d: "s" +0xfb2e: "a" +0xfb2f: "a" +0xfb30: "" +0xfb31: "b" +0xfb32: "g" +0xfb33: "d" +0xfb34: "h" +0xfb35: "v" +0xfb36: "z" +0xfb37: "[?]" +0xfb38: "t" +0xfb39: "y" +0xfb3a: "k" +0xfb3b: "k" +0xfb3c: "l" +0xfb3d: "[?]" +0xfb3e: "l" +0xfb3f: "[?]" +0xfb40: "n" +0xfb41: "n" +0xfb42: "[?]" +0xfb43: "p" +0xfb44: "p" +0xfb45: "[?]" +0xfb46: "ts" +0xfb47: "ts" +0xfb48: "r" +0xfb49: "sh" +0xfb4a: "t" +0xfb4b: "vo" +0xfb4c: "b" +0xfb4d: "k" +0xfb4e: "p" +0xfb4f: "l" +0xfb50: "" +0xfb51: "" +0xfb52: "" +0xfb53: "" +0xfb54: "" +0xfb55: "" +0xfb56: "" +0xfb57: "" +0xfb58: "" +0xfb59: "" +0xfb5a: "" +0xfb5b: "" +0xfb5c: "" +0xfb5d: "" +0xfb5e: "" +0xfb5f: "" +0xfb60: "" +0xfb61: "" +0xfb62: "" +0xfb63: "" +0xfb64: "" +0xfb65: "" +0xfb66: "" +0xfb67: "" +0xfb68: "" +0xfb69: "" +0xfb6a: "" +0xfb6b: "" +0xfb6c: "" +0xfb6d: "" +0xfb6e: "" +0xfb6f: "" +0xfb70: "" +0xfb71: "" +0xfb72: "" +0xfb73: "" +0xfb74: "" +0xfb75: "" +0xfb76: "" +0xfb77: "" +0xfb78: "" +0xfb79: "" +0xfb7a: "" +0xfb7b: "" +0xfb7c: "" +0xfb7d: "" +0xfb7e: "" +0xfb7f: "" +0xfb80: "" +0xfb81: "" +0xfb82: "" +0xfb83: "" +0xfb84: "" +0xfb85: "" +0xfb86: "" +0xfb87: "" +0xfb88: "" +0xfb89: "" +0xfb8a: "" +0xfb8b: "" +0xfb8c: "" +0xfb8d: "" +0xfb8e: "" +0xfb8f: "" +0xfb90: "" +0xfb91: "" +0xfb92: "" +0xfb93: "" +0xfb94: "" +0xfb95: "" +0xfb96: "" +0xfb97: "" +0xfb98: "" +0xfb99: "" +0xfb9a: "" +0xfb9b: "" +0xfb9c: "" +0xfb9d: "" +0xfb9e: "" +0xfb9f: "" +0xfba0: "" +0xfba1: "" +0xfba2: "" +0xfba3: "" +0xfba4: "" +0xfba5: "" +0xfba6: "" +0xfba7: "" +0xfba8: "" +0xfba9: "" +0xfbaa: "" +0xfbab: "" +0xfbac: "" +0xfbad: "" +0xfbae: "" +0xfbaf: "" +0xfbb0: "" +0xfbb1: "" +0xfbb2: "[?]" +0xfbb3: "[?]" +0xfbb4: "[?]" +0xfbb5: "[?]" +0xfbb6: "[?]" +0xfbb7: "[?]" +0xfbb8: "[?]" +0xfbb9: "[?]" +0xfbba: "[?]" +0xfbbb: "[?]" +0xfbbc: "[?]" +0xfbbd: "[?]" +0xfbbe: "[?]" +0xfbbf: "[?]" +0xfbc0: "[?]" +0xfbc1: "[?]" +0xfbc2: "[?]" +0xfbc3: "[?]" +0xfbc4: "[?]" +0xfbc5: "[?]" +0xfbc6: "[?]" +0xfbc7: "[?]" +0xfbc8: "[?]" +0xfbc9: "[?]" +0xfbca: "[?]" +0xfbcb: "[?]" +0xfbcc: "[?]" +0xfbcd: "[?]" +0xfbce: "[?]" +0xfbcf: "[?]" +0xfbd0: "[?]" +0xfbd1: "[?]" +0xfbd2: "[?]" +0xfbd3: "" +0xfbd4: "" +0xfbd5: "" +0xfbd6: "" +0xfbd7: "" +0xfbd8: "" +0xfbd9: "" +0xfbda: "" +0xfbdb: "" +0xfbdc: "" +0xfbdd: "" +0xfbde: "" +0xfbdf: "" +0xfbe0: "" +0xfbe1: "" +0xfbe2: "" +0xfbe3: "" +0xfbe4: "" +0xfbe5: "" +0xfbe6: "" +0xfbe7: "" +0xfbe8: "" +0xfbe9: "" +0xfbea: "" +0xfbeb: "" +0xfbec: "" +0xfbed: "" +0xfbee: "" +0xfbef: "" +0xfbf0: "" +0xfbf1: "" +0xfbf2: "" +0xfbf3: "" +0xfbf4: "" +0xfbf5: "" +0xfbf6: "" +0xfbf7: "" +0xfbf8: "" +0xfbf9: "" +0xfbfa: "" +0xfbfb: "" +0xfbfc: "" +0xfbfd: "" +0xfbfe: "" +0xfbff: "" +/* x0fc */ +0xfc00: "" +0xfc01: "" +0xfc02: "" +0xfc03: "" +0xfc04: "" +0xfc05: "" +0xfc06: "" +0xfc07: "" +0xfc08: "" +0xfc09: "" +0xfc0a: "" +0xfc0b: "" +0xfc0c: "" +0xfc0d: "" +0xfc0e: "" +0xfc0f: "" +0xfc10: "" +0xfc11: "" +0xfc12: "" +0xfc13: "" +0xfc14: "" +0xfc15: "" +0xfc16: "" +0xfc17: "" +0xfc18: "" +0xfc19: "" +0xfc1a: "" +0xfc1b: "" +0xfc1c: "" +0xfc1d: "" +0xfc1e: "" +0xfc1f: "" +0xfc20: "" +0xfc21: "" +0xfc22: "" +0xfc23: "" +0xfc24: "" +0xfc25: "" +0xfc26: "" +0xfc27: "" +0xfc28: "" +0xfc29: "" +0xfc2a: "" +0xfc2b: "" +0xfc2c: "" +0xfc2d: "" +0xfc2e: "" +0xfc2f: "" +0xfc30: "" +0xfc31: "" +0xfc32: "" +0xfc33: "" +0xfc34: "" +0xfc35: "" +0xfc36: "" +0xfc37: "" +0xfc38: "" +0xfc39: "" +0xfc3a: "" +0xfc3b: "" +0xfc3c: "" +0xfc3d: "" +0xfc3e: "" +0xfc3f: "" +0xfc40: "" +0xfc41: "" +0xfc42: "" +0xfc43: "" +0xfc44: "" +0xfc45: "" +0xfc46: "" +0xfc47: "" +0xfc48: "" +0xfc49: "" +0xfc4a: "" +0xfc4b: "" +0xfc4c: "" +0xfc4d: "" +0xfc4e: "" +0xfc4f: "" +0xfc50: "" +0xfc51: "" +0xfc52: "" +0xfc53: "" +0xfc54: "" +0xfc55: "" +0xfc56: "" +0xfc57: "" +0xfc58: "" +0xfc59: "" +0xfc5a: "" +0xfc5b: "" +0xfc5c: "" +0xfc5d: "" +0xfc5e: "" +0xfc5f: "" +0xfc60: "" +0xfc61: "" +0xfc62: "" +0xfc63: "" +0xfc64: "" +0xfc65: "" +0xfc66: "" +0xfc67: "" +0xfc68: "" +0xfc69: "" +0xfc6a: "" +0xfc6b: "" +0xfc6c: "" +0xfc6d: "" +0xfc6e: "" +0xfc6f: "" +0xfc70: "" +0xfc71: "" +0xfc72: "" +0xfc73: "" +0xfc74: "" +0xfc75: "" +0xfc76: "" +0xfc77: "" +0xfc78: "" +0xfc79: "" +0xfc7a: "" +0xfc7b: "" +0xfc7c: "" +0xfc7d: "" +0xfc7e: "" +0xfc7f: "" +0xfc80: "" +0xfc81: "" +0xfc82: "" +0xfc83: "" +0xfc84: "" +0xfc85: "" +0xfc86: "" +0xfc87: "" +0xfc88: "" +0xfc89: "" +0xfc8a: "" +0xfc8b: "" +0xfc8c: "" +0xfc8d: "" +0xfc8e: "" +0xfc8f: "" +0xfc90: "" +0xfc91: "" +0xfc92: "" +0xfc93: "" +0xfc94: "" +0xfc95: "" +0xfc96: "" +0xfc97: "" +0xfc98: "" +0xfc99: "" +0xfc9a: "" +0xfc9b: "" +0xfc9c: "" +0xfc9d: "" +0xfc9e: "" +0xfc9f: "" +0xfca0: "" +0xfca1: "" +0xfca2: "" +0xfca3: "" +0xfca4: "" +0xfca5: "" +0xfca6: "" +0xfca7: "" +0xfca8: "" +0xfca9: "" +0xfcaa: "" +0xfcab: "" +0xfcac: "" +0xfcad: "" +0xfcae: "" +0xfcaf: "" +0xfcb0: "" +0xfcb1: "" +0xfcb2: "" +0xfcb3: "" +0xfcb4: "" +0xfcb5: "" +0xfcb6: "" +0xfcb7: "" +0xfcb8: "" +0xfcb9: "" +0xfcba: "" +0xfcbb: "" +0xfcbc: "" +0xfcbd: "" +0xfcbe: "" +0xfcbf: "" +0xfcc0: "" +0xfcc1: "" +0xfcc2: "" +0xfcc3: "" +0xfcc4: "" +0xfcc5: "" +0xfcc6: "" +0xfcc7: "" +0xfcc8: "" +0xfcc9: "" +0xfcca: "" +0xfccb: "" +0xfccc: "" +0xfccd: "" +0xfcce: "" +0xfccf: "" +0xfcd0: "" +0xfcd1: "" +0xfcd2: "" +0xfcd3: "" +0xfcd4: "" +0xfcd5: "" +0xfcd6: "" +0xfcd7: "" +0xfcd8: "" +0xfcd9: "" +0xfcda: "" +0xfcdb: "" +0xfcdc: "" +0xfcdd: "" +0xfcde: "" +0xfcdf: "" +0xfce0: "" +0xfce1: "" +0xfce2: "" +0xfce3: "" +0xfce4: "" +0xfce5: "" +0xfce6: "" +0xfce7: "" +0xfce8: "" +0xfce9: "" +0xfcea: "" +0xfceb: "" +0xfcec: "" +0xfced: "" +0xfcee: "" +0xfcef: "" +0xfcf0: "" +0xfcf1: "" +0xfcf2: "" +0xfcf3: "" +0xfcf4: "" +0xfcf5: "" +0xfcf6: "" +0xfcf7: "" +0xfcf8: "" +0xfcf9: "" +0xfcfa: "" +0xfcfb: "" +0xfcfc: "" +0xfcfd: "" +0xfcfe: "" +0xfcff: "" +/* x0fd */ +0xfd00: "" +0xfd01: "" +0xfd02: "" +0xfd03: "" +0xfd04: "" +0xfd05: "" +0xfd06: "" +0xfd07: "" +0xfd08: "" +0xfd09: "" +0xfd0a: "" +0xfd0b: "" +0xfd0c: "" +0xfd0d: "" +0xfd0e: "" +0xfd0f: "" +0xfd10: "" +0xfd11: "" +0xfd12: "" +0xfd13: "" +0xfd14: "" +0xfd15: "" +0xfd16: "" +0xfd17: "" +0xfd18: "" +0xfd19: "" +0xfd1a: "" +0xfd1b: "" +0xfd1c: "" +0xfd1d: "" +0xfd1e: "" +0xfd1f: "" +0xfd20: "" +0xfd21: "" +0xfd22: "" +0xfd23: "" +0xfd24: "" +0xfd25: "" +0xfd26: "" +0xfd27: "" +0xfd28: "" +0xfd29: "" +0xfd2a: "" +0xfd2b: "" +0xfd2c: "" +0xfd2d: "" +0xfd2e: "" +0xfd2f: "" +0xfd30: "" +0xfd31: "" +0xfd32: "" +0xfd33: "" +0xfd34: "" +0xfd35: "" +0xfd36: "" +0xfd37: "" +0xfd38: "" +0xfd39: "" +0xfd3a: "" +0xfd3b: "" +0xfd3c: "" +0xfd3d: "" +0xfd3e: "" +0xfd3f: "" +0xfd40: "[?]" +0xfd41: "[?]" +0xfd42: "[?]" +0xfd43: "[?]" +0xfd44: "[?]" +0xfd45: "[?]" +0xfd46: "[?]" +0xfd47: "[?]" +0xfd48: "[?]" +0xfd49: "[?]" +0xfd4a: "[?]" +0xfd4b: "[?]" +0xfd4c: "[?]" +0xfd4d: "[?]" +0xfd4e: "[?]" +0xfd4f: "[?]" +0xfd50: "" +0xfd51: "" +0xfd52: "" +0xfd53: "" +0xfd54: "" +0xfd55: "" +0xfd56: "" +0xfd57: "" +0xfd58: "" +0xfd59: "" +0xfd5a: "" +0xfd5b: "" +0xfd5c: "" +0xfd5d: "" +0xfd5e: "" +0xfd5f: "" +0xfd60: "" +0xfd61: "" +0xfd62: "" +0xfd63: "" +0xfd64: "" +0xfd65: "" +0xfd66: "" +0xfd67: "" +0xfd68: "" +0xfd69: "" +0xfd6a: "" +0xfd6b: "" +0xfd6c: "" +0xfd6d: "" +0xfd6e: "" +0xfd6f: "" +0xfd70: "" +0xfd71: "" +0xfd72: "" +0xfd73: "" +0xfd74: "" +0xfd75: "" +0xfd76: "" +0xfd77: "" +0xfd78: "" +0xfd79: "" +0xfd7a: "" +0xfd7b: "" +0xfd7c: "" +0xfd7d: "" +0xfd7e: "" +0xfd7f: "" +0xfd80: "" +0xfd81: "" +0xfd82: "" +0xfd83: "" +0xfd84: "" +0xfd85: "" +0xfd86: "" +0xfd87: "" +0xfd88: "" +0xfd89: "" +0xfd8a: "" +0xfd8b: "" +0xfd8c: "" +0xfd8d: "" +0xfd8e: "" +0xfd8f: "" +0xfd90: "[?]" +0xfd91: "[?]" +0xfd92: "" +0xfd93: "" +0xfd94: "" +0xfd95: "" +0xfd96: "" +0xfd97: "" +0xfd98: "" +0xfd99: "" +0xfd9a: "" +0xfd9b: "" +0xfd9c: "" +0xfd9d: "" +0xfd9e: "" +0xfd9f: "" +0xfda0: "" +0xfda1: "" +0xfda2: "" +0xfda3: "" +0xfda4: "" +0xfda5: "" +0xfda6: "" +0xfda7: "" +0xfda8: "" +0xfda9: "" +0xfdaa: "" +0xfdab: "" +0xfdac: "" +0xfdad: "" +0xfdae: "" +0xfdaf: "" +0xfdb0: "" +0xfdb1: "" +0xfdb2: "" +0xfdb3: "" +0xfdb4: "" +0xfdb5: "" +0xfdb6: "" +0xfdb7: "" +0xfdb8: "" +0xfdb9: "" +0xfdba: "" +0xfdbb: "" +0xfdbc: "" +0xfdbd: "" +0xfdbe: "" +0xfdbf: "" +0xfdc0: "" +0xfdc1: "" +0xfdc2: "" +0xfdc3: "" +0xfdc4: "" +0xfdc5: "" +0xfdc6: "" +0xfdc7: "" +0xfdc8: "[?]" +0xfdc9: "[?]" +0xfdca: "[?]" +0xfdcb: "[?]" +0xfdcc: "[?]" +0xfdcd: "[?]" +0xfdce: "[?]" +0xfdcf: "[?]" +0xfdd0: "[?]" +0xfdd1: "[?]" +0xfdd2: "[?]" +0xfdd3: "[?]" +0xfdd4: "[?]" +0xfdd5: "[?]" +0xfdd6: "[?]" +0xfdd7: "[?]" +0xfdd8: "[?]" +0xfdd9: "[?]" +0xfdda: "[?]" +0xfddb: "[?]" +0xfddc: "[?]" +0xfddd: "[?]" +0xfdde: "[?]" +0xfddf: "[?]" +0xfde0: "[?]" +0xfde1: "[?]" +0xfde2: "[?]" +0xfde3: "[?]" +0xfde4: "[?]" +0xfde5: "[?]" +0xfde6: "[?]" +0xfde7: "[?]" +0xfde8: "[?]" +0xfde9: "[?]" +0xfdea: "[?]" +0xfdeb: "[?]" +0xfdec: "[?]" +0xfded: "[?]" +0xfdee: "[?]" +0xfdef: "[?]" +0xfdf0: "" +0xfdf1: "" +0xfdf2: "" +0xfdf3: "" +0xfdf4: "" +0xfdf5: "" +0xfdf6: "" +0xfdf7: "" +0xfdf8: "" +0xfdf9: "" +0xfdfa: "" +0xfdfb: "" +0xfdfc: "[?]" +0xfdfd: "[?]" +0xfdfe: "[?]" +/* x0fe */ +0xfe00: "[?]" +0xfe01: "[?]" +0xfe02: "[?]" +0xfe03: "[?]" +0xfe04: "[?]" +0xfe05: "[?]" +0xfe06: "[?]" +0xfe07: "[?]" +0xfe08: "[?]" +0xfe09: "[?]" +0xfe0a: "[?]" +0xfe0b: "[?]" +0xfe0c: "[?]" +0xfe0d: "[?]" +0xfe0e: "[?]" +0xfe0f: "[?]" +0xfe10: "[?]" +0xfe11: "[?]" +0xfe12: "[?]" +0xfe13: "[?]" +0xfe14: "[?]" +0xfe15: "[?]" +0xfe16: "[?]" +0xfe17: "[?]" +0xfe18: "[?]" +0xfe19: "[?]" +0xfe1a: "[?]" +0xfe1b: "[?]" +0xfe1c: "[?]" +0xfe1d: "[?]" +0xfe1e: "[?]" +0xfe1f: "[?]" +0xfe20: "" +0xfe21: "" +0xfe22: "" +0xfe23: "~" +0xfe24: "[?]" +0xfe25: "[?]" +0xfe26: "[?]" +0xfe27: "[?]" +0xfe28: "[?]" +0xfe29: "[?]" +0xfe2a: "[?]" +0xfe2b: "[?]" +0xfe2c: "[?]" +0xfe2d: "[?]" +0xfe2e: "[?]" +0xfe2f: "[?]" +0xfe30: ".." +0xfe31: "--" +0xfe32: "-" +0xfe33: "_" +0xfe34: "_" +0xfe35: "(" +0xfe36: ") " +0xfe37: "{" +0xfe38: "} " +0xfe39: "[" +0xfe3a: "] " +0xfe3b: "[(" +0xfe3c: ")] " +0xfe3d: "<<" +0xfe3e: ">> " +0xfe3f: "<" +0xfe40: "> " +0xfe41: "[" +0xfe42: "] " +0xfe43: "{" +0xfe44: "}" +0xfe45: "[?]" +0xfe46: "[?]" +0xfe47: "[?]" +0xfe48: "[?]" +0xfe49: "" +0xfe4a: "" +0xfe4b: "" +0xfe4c: "" +0xfe4d: "" +0xfe4e: "" +0xfe4f: "" +0xfe50: "," +0xfe51: "," +0xfe52: "." +0xfe53: "" +0xfe54: ";" +0xfe55: ":" +0xfe56: "?" +0xfe57: "!" +0xfe58: "-" +0xfe59: "(" +0xfe5a: ")" +0xfe5b: "{" +0xfe5c: "}" +0xfe5d: "{" +0xfe5e: "}" +0xfe5f: "#" +0xfe60: "&" +0xfe61: "*" +0xfe62: "+" +0xfe63: "-" +0xfe64: "<" +0xfe65: ">" +0xfe66: "=" +0xfe67: "" +0xfe68: "\\" +0xfe69: "$" +0xfe6a: "%" +0xfe6b: "@" +0xfe6c: "[?]" +0xfe6d: "[?]" +0xfe6e: "[?]" +0xfe6f: "[?]" +0xfe70: "" +0xfe71: "" +0xfe72: "" +0xfe73: "[?]" +0xfe74: "" +0xfe75: "[?]" +0xfe76: "" +0xfe77: "" +0xfe78: "" +0xfe79: "" +0xfe7a: "" +0xfe7b: "" +0xfe7c: "" +0xfe7d: "" +0xfe7e: "" +0xfe7f: "" +0xfe80: "" +0xfe81: "" +0xfe82: "" +0xfe83: "" +0xfe84: "" +0xfe85: "" +0xfe86: "" +0xfe87: "" +0xfe88: "" +0xfe89: "" +0xfe8a: "" +0xfe8b: "" +0xfe8c: "" +0xfe8d: "" +0xfe8e: "" +0xfe8f: "" +0xfe90: "" +0xfe91: "" +0xfe92: "" +0xfe93: "" +0xfe94: "" +0xfe95: "" +0xfe96: "" +0xfe97: "" +0xfe98: "" +0xfe99: "" +0xfe9a: "" +0xfe9b: "" +0xfe9c: "" +0xfe9d: "" +0xfe9e: "" +0xfe9f: "" +0xfea0: "" +0xfea1: "" +0xfea2: "" +0xfea3: "" +0xfea4: "" +0xfea5: "" +0xfea6: "" +0xfea7: "" +0xfea8: "" +0xfea9: "" +0xfeaa: "" +0xfeab: "" +0xfeac: "" +0xfead: "" +0xfeae: "" +0xfeaf: "" +0xfeb0: "" +0xfeb1: "" +0xfeb2: "" +0xfeb3: "" +0xfeb4: "" +0xfeb5: "" +0xfeb6: "" +0xfeb7: "" +0xfeb8: "" +0xfeb9: "" +0xfeba: "" +0xfebb: "" +0xfebc: "" +0xfebd: "" +0xfebe: "" +0xfebf: "" +0xfec0: "" +0xfec1: "" +0xfec2: "" +0xfec3: "" +0xfec4: "" +0xfec5: "" +0xfec6: "" +0xfec7: "" +0xfec8: "" +0xfec9: "" +0xfeca: "" +0xfecb: "" +0xfecc: "" +0xfecd: "" +0xfece: "" +0xfecf: "" +0xfed0: "" +0xfed1: "" +0xfed2: "" +0xfed3: "" +0xfed4: "" +0xfed5: "" +0xfed6: "" +0xfed7: "" +0xfed8: "" +0xfed9: "" +0xfeda: "" +0xfedb: "" +0xfedc: "" +0xfedd: "" +0xfede: "" +0xfedf: "" +0xfee0: "" +0xfee1: "" +0xfee2: "" +0xfee3: "" +0xfee4: "" +0xfee5: "" +0xfee6: "" +0xfee7: "" +0xfee8: "" +0xfee9: "" +0xfeea: "" +0xfeeb: "" +0xfeec: "" +0xfeed: "" +0xfeee: "" +0xfeef: "" +0xfef0: "" +0xfef1: "" +0xfef2: "" +0xfef3: "" +0xfef4: "" +0xfef5: "" +0xfef6: "" +0xfef7: "" +0xfef8: "" +0xfef9: "" +0xfefa: "" +0xfefb: "" +0xfefc: "" +0xfefd: "[?]" +0xfefe: "[?]" +0xfeff: "" +/* x0ff */ +0xff00: "[?]" +0xff01: "!" +0xff02: "\"" +0xff03: "#" +0xff04: "$" +0xff05: "%" +0xff06: "&" +0xff07: "'" +0xff08: "(" +0xff09: ")" +0xff0a: "*" +0xff0b: "+" +0xff0c: "," +0xff0d: "-" +0xff0e: "." +0xff0f: "/" +0xff10: "0" +0xff11: "1" +0xff12: "2" +0xff13: "3" +0xff14: "4" +0xff15: "5" +0xff16: "6" +0xff17: "7" +0xff18: "8" +0xff19: "9" +0xff1a: ":" +0xff1b: ";" +0xff1c: "<" +0xff1d: "=" +0xff1e: ">" +0xff1f: "?" +0xff20: "@" +0xff21: "A" +0xff22: "B" +0xff23: "C" +0xff24: "D" +0xff25: "E" +0xff26: "F" +0xff27: "G" +0xff28: "H" +0xff29: "I" +0xff2a: "J" +0xff2b: "K" +0xff2c: "L" +0xff2d: "M" +0xff2e: "N" +0xff2f: "O" +0xff30: "P" +0xff31: "Q" +0xff32: "R" +0xff33: "S" +0xff34: "T" +0xff35: "U" +0xff36: "V" +0xff37: "W" +0xff38: "X" +0xff39: "Y" +0xff3a: "Z" +0xff3b: "[" +0xff3c: "\\" +0xff3d: "]" +0xff3e: "^" +0xff3f: "_" +0xff40: "`" +0xff41: "a" +0xff42: "b" +0xff43: "c" +0xff44: "d" +0xff45: "e" +0xff46: "f" +0xff47: "g" +0xff48: "h" +0xff49: "i" +0xff4a: "j" +0xff4b: "k" +0xff4c: "l" +0xff4d: "m" +0xff4e: "n" +0xff4f: "o" +0xff50: "p" +0xff51: "q" +0xff52: "r" +0xff53: "s" +0xff54: "t" +0xff55: "u" +0xff56: "v" +0xff57: "w" +0xff58: "x" +0xff59: "y" +0xff5a: "z" +0xff5b: "{" +0xff5c: "|" +0xff5d: "}" +0xff5e: "~" +0xff5f: "[?]" +0xff60: "[?]" +0xff61: "." +0xff62: "[" +0xff63: "]" +0xff64: "," +0xff65: "*" +0xff66: "wo" +0xff67: "a" +0xff68: "i" +0xff69: "u" +0xff6a: "e" +0xff6b: "o" +0xff6c: "ya" +0xff6d: "yu" +0xff6e: "yo" +0xff6f: "tu" +0xff70: "+" +0xff71: "a" +0xff72: "i" +0xff73: "u" +0xff74: "e" +0xff75: "o" +0xff76: "ka" +0xff77: "ki" +0xff78: "ku" +0xff79: "ke" +0xff7a: "ko" +0xff7b: "sa" +0xff7c: "si" +0xff7d: "su" +0xff7e: "se" +0xff7f: "so" +0xff80: "ta" +0xff81: "ti" +0xff82: "tu" +0xff83: "te" +0xff84: "to" +0xff85: "na" +0xff86: "ni" +0xff87: "nu" +0xff88: "ne" +0xff89: "no" +0xff8a: "ha" +0xff8b: "hi" +0xff8c: "hu" +0xff8d: "he" +0xff8e: "ho" +0xff8f: "ma" +0xff90: "mi" +0xff91: "mu" +0xff92: "me" +0xff93: "mo" +0xff94: "ya" +0xff95: "yu" +0xff96: "yo" +0xff97: "ra" +0xff98: "ri" +0xff99: "ru" +0xff9a: "re" +0xff9b: "ro" +0xff9c: "wa" +0xff9d: "n" +0xff9e: ":" +0xff9f: ";" +0xffa0: "" +0xffa1: "g" +0xffa2: "gg" +0xffa3: "gs" +0xffa4: "n" +0xffa5: "nj" +0xffa6: "nh" +0xffa7: "d" +0xffa8: "dd" +0xffa9: "r" +0xffaa: "lg" +0xffab: "lm" +0xffac: "lb" +0xffad: "ls" +0xffae: "lt" +0xffaf: "lp" +0xffb0: "rh" +0xffb1: "m" +0xffb2: "b" +0xffb3: "bb" +0xffb4: "bs" +0xffb5: "s" +0xffb6: "ss" +0xffb7: "" +0xffb8: "j" +0xffb9: "jj" +0xffba: "c" +0xffbb: "k" +0xffbc: "t" +0xffbd: "p" +0xffbe: "h" +0xffbf: "[?]" +0xffc0: "[?]" +0xffc1: "[?]" +0xffc2: "a" +0xffc3: "ae" +0xffc4: "ya" +0xffc5: "yae" +0xffc6: "eo" +0xffc7: "e" +0xffc8: "[?]" +0xffc9: "[?]" +0xffca: "yeo" +0xffcb: "ye" +0xffcc: "o" +0xffcd: "wa" +0xffce: "wae" +0xffcf: "oe" +0xffd0: "[?]" +0xffd1: "[?]" +0xffd2: "yo" +0xffd3: "u" +0xffd4: "weo" +0xffd5: "we" +0xffd6: "wi" +0xffd7: "yu" +0xffd8: "[?]" +0xffd9: "[?]" +0xffda: "eu" +0xffdb: "yi" +0xffdc: "i" +0xffdd: "[?]" +0xffde: "[?]" +0xffdf: "[?]" +0xffe0: "/C" +0xffe1: "PS" +0xffe2: "!" +0xffe3: "-" +0xffe4: "|" +0xffe5: "Y=" +0xffe6: "W=" +0xffe7: "[?]" +0xffe8: "|" +0xffe9: "-" +0xffea: "|" +0xffeb: "-" +0xffec: "|" +0xffed: "#" +0xffee: "O" +0xffef: "[?]" +0xfff0: "[?]" +0xfff1: "[?]" +0xfff2: "[?]" +0xfff3: "[?]" +0xfff4: "[?]" +0xfff5: "[?]" +0xfff6: "[?]" +0xfff7: "[?]" +0xfff8: "[?]" +0xfff9: "{" +0xfffa: "|" +0xfffb: "}" +0xfffc: "" +0xfffd: "" +0xfffe: "" +0xffff: "" diff --git a/vendor/github.com/gosimple/unidecode/unidecode.go b/vendor/github.com/gosimple/unidecode/unidecode.go new file mode 100644 index 0000000..bc5f8a1 --- /dev/null +++ b/vendor/github.com/gosimple/unidecode/unidecode.go @@ -0,0 +1,58 @@ +// Package unidecode implements a unicode transliterator +// which replaces non-ASCII characters with their ASCII +// approximations. +package unidecode + +//go:generate go run make_table.go + +import ( + "sync" + "unicode" +) + +const pooledCapacity = 64 + +var ( + slicePool sync.Pool + decodingOnce sync.Once +) + +// Unidecode implements a unicode transliterator, which +// replaces non-ASCII characters with their ASCII +// counterparts. +// Given an unicode encoded string, returns +// another string with non-ASCII characters replaced +// with their closest ASCII counterparts. +// e.g. Unicode("áéíóú") => "aeiou" +func Unidecode(s string) string { + decodingOnce.Do(decodeTransliterations) + l := len(s) + var r []rune + if l > pooledCapacity { + r = make([]rune, 0, len(s)) + } else { + if x := slicePool.Get(); x != nil { + r = x.([]rune)[:0] + } else { + r = make([]rune, 0, pooledCapacity) + } + } + for _, c := range s { + if c <= unicode.MaxASCII { + r = append(r, c) + continue + } + if c > unicode.MaxRune || c >= transCount { + /* Ignore reserved chars */ + continue + } + if d := transliterations[c]; d != nil { + r = append(r, d...) + } + } + res := string(r) + if l <= pooledCapacity { + slicePool.Put(r) + } + return res +} diff --git a/vendor/github.com/teekennedy/goldmark-markdown/.gitignore b/vendor/github.com/teekennedy/goldmark-markdown/.gitignore new file mode 100644 index 0000000..6350e98 --- /dev/null +++ b/vendor/github.com/teekennedy/goldmark-markdown/.gitignore @@ -0,0 +1 @@ +.coverage diff --git a/vendor/github.com/teekennedy/goldmark-markdown/LICENSE b/vendor/github.com/teekennedy/goldmark-markdown/LICENSE new file mode 100644 index 0000000..14c4584 --- /dev/null +++ b/vendor/github.com/teekennedy/goldmark-markdown/LICENSE @@ -0,0 +1,25 @@ +MIT License +----------- + +Copyright (c) 2021 Terrance Kennedy +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + diff --git a/vendor/github.com/teekennedy/goldmark-markdown/README.md b/vendor/github.com/teekennedy/goldmark-markdown/README.md new file mode 100644 index 0000000..bc49543 --- /dev/null +++ b/vendor/github.com/teekennedy/goldmark-markdown/README.md @@ -0,0 +1,177 @@ +# goldmark-markdown + +[![GoDoc](https://godoc.org/github.com/teekennedy/goldmark-markdown?status.svg)](https://godoc.org/github.com/teekennedy/goldmark-markdown) ![Go Version](https://img.shields.io/github/go-mod/go-version/teekennedy/goldmark-markdown) [![latest](https://img.shields.io/github/v/tag/teekennedy/goldmark-markdown)](https://github.com/teekennedy/goldmark-markdown/tags) [![test](https://github.com/teekennedy/goldmark-markdown/actions/workflows/test.yml/badge.svg)](https://github.com/teekennedy/goldmark-markdown/actions/workflows/test.yml) [![Coverage Status](https://coveralls.io/repos/github/teekennedy/goldmark-markdown/badge.svg?branch=main)](https://coveralls.io/github/teekennedy/goldmark-markdown?branch=main) + +Goldmark-markdown is a [goldmark] renderer that renders to markdown. It can be used directly as an +auto-formatter for markdown source, or extended via goldmark's powerful [AST] transformers to +programmatically transform markdown files. + +This module was created for my [update-a-changelog] GitHub Action, to allow it to intelligently +merge new changelog entries from Pull Requests into CHANGELOG.md, as well as add new versions to +CHANGELOG.md when the corresponding tag is pushed. + +## As a formatter + +You can use goldmark-markdown to format existing markdown documents. It removes extraneous +whitespace, and enforces consistent style for things like indentation, headings, and lists. + +```go +// Create goldmark converter with markdown renderer object +// Can pass functional Options as arguments. This example converts headings to ATX style. +renderer := markdown.NewRenderer(markdown.WithHeadingStyle(markdown.HeadingStyleATX)) +md := goldmark.New(goldmark.WithRenderer(renderer)) + +// "Convert" markdown to formatted markdown +source := ` +My Document Title +================= +` +buf := bytes.Buffer{} +err := md.Convert([]byte(source), &buf) +if err != nil { + log.Fatal(err) +} +log.Print(buf.String()) // # My Document Title +``` + +### Options + +You can control the style of various markdown elements via functional options that are passed to +the renderer. + +| Functional Option | Type | Description | +| ----------------- | ---- | ----------- | +| WithIndentStyle | markdown.IndentStyle | Indent nested blocks with spaces or tabs. | +| WithHeadingStyle | markdown.HeadingStyle | Render markdown headings as ATX (`#`-based), Setext (underlined with `===` or `---`), or variants thereof. | +| WithThematicBreakStyle | markdown.ThematicBreakStyle | Render thematic breaks with `-`, `*`, or `_`. | +| WithThematicBreakLength | markdown.ThematicBreakLength | Number of characters to use in a thematic break (minimum 3). | +| WithSubListLength | markdown.SubListLength | Number of characters to use in a sub list indentation (minimum 1). | + +## As a markdown transformer + +Goldmark supports writing transformers that can inspect and modify the parsed markdown [AST] before +it gets sent to the renderer for output. You can use transformers in conjunction with +goldmark-markdown's renderer to make changes to markdown sources while preserving valid syntax. + +For example, you can scan the AST for text that matches a pattern for an external resource, and +transform that text into a link to the resource, similar to GitHub's [custom autolinks] feature. +Start by adding a struct that holds a regexp pattern to scan text for and a URL replacement for the +pattern: + + +```go +// RegexpLinkTransformer is an AST Transformer that transforms markdown text that matches a regex +// pattern into a link. +type RegexpLinkTransformer struct { + LinkPattern *regexp.Regexp + ReplUrl []byte +} +``` + +Next, implement a `Transform` function that walks the AST and calls a `LinkifyText` function on any +Text nodes encountered: + +```go +// Transform implements goldmark.parser.ASTTransformer +func (t *RegexpLinkTransformer) Transform(node *ast.Document, reader text.Reader, pc parser.Context) { + source := reader.Source() + + // Walk the AST in depth-first fashion and apply transformations + err := ast.Walk(node, func(node ast.Node, entering bool) (ast.WalkStatus, error) { + // Each node will be visited twice, once when it is first encountered (entering), and again + // after all the node's children have been visited (if any). Skip the latter. + if !entering { + return ast.WalkContinue, nil + } + // Skip the children of existing links to prevent double-transformation. + if node.Kind() == ast.KindLink || node.Kind() == ast.KindAutoLink { + return ast.WalkSkipChildren, nil + } + // Linkify any Text nodes encountered + if node.Kind() == ast.KindText { + textNode := node.(*ast.Text) + t.LinkifyText(textNode, source) + } + + return ast.WalkContinue, nil + }) + + if err != nil { + log.Fatal("Error encountered while transforming AST:", err) + } +} +``` + +The function passed to ast.Walk will be called for every node visited. The function controls which +node is visited next via its return value. `ast.WalkContinue` causes the walk to continue to the +next child, sibling, or parent node, depending on whether such nodes exist. `ast.WalkSkipChildren` +continues only to sibling or parent nodes. Both `ast.WalkStop` and returning a non-nil error cause +the walk to end. + +For this example, we are only interested in linkifying Text nodes that are not already part of a +link, and continue past everything else. + +In order to "linkify" the Text nodes, the transformer will replace the original Text node with +nodes for before and after the link, as well as the node for the link itself: + +```go +// LinkifyText finds all LinkPattern matches in the given Text node and replaces them with Link +// nodes that point to ReplUrl. +func (t *RegexpLinkTransformer) LinkifyText(node *ast.Text, source []byte) { + parent := node.Parent() + tSegment := node.Segment + match := t.LinkPattern.FindIndex(tSegment.Value(source)) + if match == nil { + return + } + // Create a text.Segment for the link text. + lSegment := text.NewSegment(tSegment.Start+match[0], tSegment.Start+match[1]) + + // Insert node for any text before the link + if lSegment.Start != tSegment.Start { + bText := ast.NewTextSegment(tSegment.WithStop(lSegment.Start)) + parent.InsertBefore(parent, node, bText) + } + + // Insert Link node + link := ast.NewLink() + link.AppendChild(link, ast.NewTextSegment(lSegment)) + link.Destination = t.LinkPattern.ReplaceAll(lSegment.Value(source), t.ReplUrl) + parent.InsertBefore(parent, node, link) + + // Update original node to represent the text after the link (may be empty) + node.Segment = tSegment.WithStart(lSegment.Stop) + + // Linkify remaining text if not empty + if node.Segment.Len() > 0 { + t.LinkifyText(node, source) + } +} +``` + +To use this transformer, we'll need to instantiate one or more RegexpLinkTransformer structs, then +prioritize them and add them to the parser configuration of the goldmark object. The +transformation(s) will then be automatically applied to all markdown documents converted by the +goldmark object. + +```go +transformer := RegexpLinkTransformer{ + LinkPattern: regexp.MustCompile(`TICKET-\d+`), + ReplUrl: []byte("https://example.com/TICKET?query=$0"), +} +// Goldmark supports multiple AST transformers and runs them sequentially in order of priority. +prioritizedTransformer := util.Prioritized(&transformer, 0) +// Setup goldmark with the markdown renderer and our transformer +gm := goldmark.New( + goldmark.WithRenderer(markdown.NewRenderer()), + goldmark.WithParserOptions(parser.WithASTTransformers(prioritizedTransformer)), +) +``` + +The complete example can be found in [autolink_example_test.go], or in the go doc for this package. + +[AST]: https://pkg.go.dev/github.com/yuin/goldmark/ast +[autolink_example_test.go]: /autolink_example_test.go +[custom autolinks]: https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/autolinked-references-and-urls#custom-autolinks-to-external-resources +[goldmark]: https://github.com/yuin/goldmark +[update-a-changelog]: https://github.com/teekennedy/update-a-changelog diff --git a/vendor/github.com/teekennedy/goldmark-markdown/options.go b/vendor/github.com/teekennedy/goldmark-markdown/options.go new file mode 100644 index 0000000..b90f685 --- /dev/null +++ b/vendor/github.com/teekennedy/goldmark-markdown/options.go @@ -0,0 +1,271 @@ +package markdown + +import ( + "github.com/yuin/goldmark/renderer" +) + +// Config struct holds configurations for the markdown based renderer. +type Config struct { + IndentStyle + HeadingStyle + ThematicBreakStyle + ThematicBreakLength + SubListLength +} + +// NewConfig returns a new Config with defaults and the given options. +func NewConfig(options ...Option) *Config { + c := &Config{ + IndentStyle: IndentStyle(IndentStyleSpaces), + HeadingStyle: HeadingStyle(HeadingStyleATX), + ThematicBreakStyle: ThematicBreakStyle(ThematicBreakStyleDashed), + ThematicBreakLength: ThematicBreakLength(ThematicBreakLengthMinimum), + SubListLength: SubListLength(SubListLengthMinimum), + } + for _, opt := range options { + opt.SetMarkdownOption(c) + } + return c +} + +// SetOption implements renderer.SetOptioner.SetOption. +func (c *Config) SetOption(name renderer.OptionName, value interface{}) { + switch name { + case optIndentStyle: + c.IndentStyle = value.(IndentStyle) + case optHeadingStyle: + c.HeadingStyle = value.(HeadingStyle) + case optThematicBreakStyle: + c.ThematicBreakStyle = value.(ThematicBreakStyle) + case optThematicBreakLength: + c.ThematicBreakLength = value.(ThematicBreakLength) + case optSubListLength: + c.SubListLength = value.(SubListLength) + } +} + +// Option is an interface that sets options for Markdown based renderers. +type Option interface { + renderer.Option + // SetMarkDownOption sets this option on the markdown renderer config + SetMarkdownOption(*Config) +} + +// ============================================================================ +// IndentStyle Option +// ============================================================================ + +// optIndentStyle is an option name used in WithIndentStyle +const optIndentStyle renderer.OptionName = "IndentStyle" + +// IndentStyle is an enum expressing how markdown blocks should be indented. +type IndentStyle int + +const ( + // IndentStyleSpaces indents with 4 spaces. This is the default as well as the zero-value. + IndentStyleSpaces = iota + // IndentStyleTabs indents with tabs. + IndentStyleTabs +) + +// String returns the string representation of the indent style +func (i IndentStyle) Bytes() []byte { + return [...][]byte{[]byte(" "), []byte("\t")}[i] +} + +type withIndentStyle struct { + value IndentStyle +} + +// SetConfig implements renderer.Option.SetConfig +func (o *withIndentStyle) SetConfig(c *renderer.Config) { + c.Options[optIndentStyle] = o.value +} + +// SetMarkdownOption implements Option +func (o *withIndentStyle) SetMarkdownOption(c *Config) { + c.IndentStyle = o.value +} + +// WithIndentStyle is a functional option that sets the string used to indent markdown blocks. +func WithIndentStyle(style IndentStyle) interface { + renderer.Option + Option +} { + return &withIndentStyle{style} +} + +// ============================================================================ +// HeadingStyle Option +// ============================================================================ + +// optHeadingStyle is an option name used in WithHeadingStyle +const optHeadingStyle renderer.OptionName = "HeadingStyle" + +// HeadingStyle is an enum expressing how markdown headings should look. +type HeadingStyle int + +const ( + // HeadingStyleATX is the #-based style. This is the default heading style and zero value. + // Ex: ## Foo + HeadingStyleATX = iota + // HeadingStyleATXSurround adds closing #s after your header. + // Ex: ## Foo ## + HeadingStyleATXSurround + // HeadingStyleSetext uses setext heading underlines ('===' or '---') for heading levels 1 and + // 2, respectively. Other header levels continue to use ATX headings. + // Ex: Foo Bar + // --- + HeadingStyleSetext + // HeadingStyleFullWidthSetext extends setext heading underlines to the full width of the + // header text. + // Ex: Foo Bar + // ------- + HeadingStyleFullWidthSetext +) + +// IsSetext returns true if heading style is one of the Setext options +func (i HeadingStyle) IsSetext() bool { + return i == HeadingStyleSetext || i == HeadingStyleFullWidthSetext +} + +type withHeadingStyle struct { + value HeadingStyle +} + +func (o *withHeadingStyle) SetConfig(c *renderer.Config) { + c.Options[optHeadingStyle] = o.value +} + +// SetMarkdownOption implements renderer.Option +func (o *withHeadingStyle) SetMarkdownOption(c *Config) { + c.HeadingStyle = o.value +} + +// WithHeadingStyle is a functional option that sets the style of markdown headings. +func WithHeadingStyle(style HeadingStyle) interface { + renderer.Option + Option +} { + return &withHeadingStyle{style} +} + +// ============================================================================ +// ThematicBreakStyle Option +// ============================================================================ + +// optThematicBreakStyle is an option name used in WithThematicBreakStyle +const optThematicBreakStyle renderer.OptionName = "ThematicBreakStyle" + +// ThematicBreakStyle is an enum expressing the character used for thematic breaks. +type ThematicBreakStyle int + +const ( + // ThematicBreakStyleDashed uses '-' character for thematic breaks. This is the default and + // zero value. + // Ex: --- + ThematicBreakStyleDashed = iota + // ThematicBreakStyleStarred uses '*' character for thematic breaks. + // Ex: *** + ThematicBreakStyleStarred + // ThematicBreakStyleUnderlined uses '_' character for thematic breaks. + // Ex: ___ + ThematicBreakStyleUnderlined +) + +type withThematicBreakStyle struct { + value ThematicBreakStyle +} + +func (o *withThematicBreakStyle) SetConfig(c *renderer.Config) { + c.Options[optThematicBreakStyle] = o.value +} + +// SetMarkdownOption implements renderer.Option +func (o *withThematicBreakStyle) SetMarkdownOption(c *Config) { + c.ThematicBreakStyle = o.value +} + +// WithThematicBreakStyle is a functional option that sets the character used for thematic breaks. +func WithThematicBreakStyle(style ThematicBreakStyle) interface { + renderer.Option + Option +} { + return &withThematicBreakStyle{style} +} + +// ============================================================================ +// ThematicBreakLength Option +// ============================================================================ + +// optThematicBreakLength is an option name used in WithThematicBreakLength +const optThematicBreakLength renderer.OptionName = "ThematicBreakLength" + +// ThematicBreakLength configures the character length of thematic breaks +type ThematicBreakLength int + +const ( + // ThematicBreakLengthMinimum is the minimum length of a thematic break. This is the default. + // Any lengths less than this minimum are converted to the minimum. + // Ex: --- + ThematicBreakLengthMinimum = 3 +) + +type withThematicBreakLength struct { + value ThematicBreakLength +} + +func (o *withThematicBreakLength) SetConfig(c *renderer.Config) { + c.Options[optThematicBreakLength] = o.value +} + +// SetMarkdownOption implements renderer.Option +func (o *withThematicBreakLength) SetMarkdownOption(c *Config) { + c.ThematicBreakLength = o.value +} + +// WithThematicBreakLength is a functional option that sets the length of thematic breaks. +func WithThematicBreakLength(style ThematicBreakLength) interface { + renderer.Option + Option +} { + return &withThematicBreakLength{style} +} + +// ============================================================================ +// SubListLength Option +// ============================================================================ + +// optSubListLength is an option name used in WithSubListLength +const optSubListLength renderer.OptionName = "SubListLength" + +// SubListLength configures the character length of sublist indentation +type SubListLength int + +const ( + // SubListLengthMinimum is the minimum length of a sublist length. This is the default. + // Any lengths less than this minimum are converted to the minimum. + // Ex: --- + SubListLengthMinimum = 1 +) + +type withSubListLength struct { + value SubListLength +} + +func (o *withSubListLength) SetConfig(c *renderer.Config) { + c.Options[optSubListLength] = o.value +} + +// SetMarkdownOption implements renderer.Option +func (o *withSubListLength) SetMarkdownOption(c *Config) { + c.SubListLength = o.value +} + +// WithSubListLength is a functional option that sets the length of sub lists indentation. +func WithSubListLength(style SubListLength) interface { + renderer.Option + Option +} { + return &withSubListLength{style} +} diff --git a/vendor/github.com/teekennedy/goldmark-markdown/renderer.go b/vendor/github.com/teekennedy/goldmark-markdown/renderer.go new file mode 100644 index 0000000..9281964 --- /dev/null +++ b/vendor/github.com/teekennedy/goldmark-markdown/renderer.go @@ -0,0 +1,406 @@ +// Package markdown is a goldmark renderer that outputs markdown. +package markdown + +import ( + "bytes" + "fmt" + "io" + "sync" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/text" +) + +// NewRenderer returns a new markdown Renderer that is configured by default values. +func NewRenderer(options ...Option) *Renderer { + r := &Renderer{ + config: NewConfig(), + rc: renderContext{}, + maxKind: 20, // a random number slightly larger than the number of default ast kinds + nodeRendererFuncsTmp: map[ast.NodeKind]renderer.NodeRendererFunc{}, + } + for _, opt := range options { + opt.SetMarkdownOption(r.config) + } + return r +} + +// Renderer is an implementation of renderer.Renderer that renders nodes as Markdown +type Renderer struct { + config *Config + rc renderContext + nodeRendererFuncsTmp map[ast.NodeKind]renderer.NodeRendererFunc + maxKind int + nodeRendererFuncs []nodeRenderer + initSync sync.Once +} + +var _ renderer.Renderer = &Renderer{} + +// AddOptions implements renderer.Renderer.AddOptions +func (r *Renderer) AddOptions(opts ...renderer.Option) { + config := renderer.NewConfig() + for _, opt := range opts { + opt.SetConfig(config) + } + for name, value := range config.Options { + r.config.SetOption(name, value) + } + + // handle any config.NodeRenderers set by opts + config.NodeRenderers.Sort() + l := len(config.NodeRenderers) + for i := l - 1; i >= 0; i-- { + v := config.NodeRenderers[i] + nr, _ := v.Value.(renderer.NodeRenderer) + nr.RegisterFuncs(r) + } +} + +func (r *Renderer) Register(kind ast.NodeKind, fun renderer.NodeRendererFunc) { + r.nodeRendererFuncsTmp[kind] = fun + if int(kind) > r.maxKind { + r.maxKind = int(kind) + } +} + +// Render implements renderer.Renderer.Render +func (r *Renderer) Render(w io.Writer, source []byte, n ast.Node) error { + r.rc = newRenderContext(w, source, r.config) + r.initSync.Do(func() { + r.nodeRendererFuncs = make([]nodeRenderer, r.maxKind+1) + // add default functions + // blocks + r.nodeRendererFuncs[ast.KindDocument] = r.renderBlockSeparator + r.nodeRendererFuncs[ast.KindHeading] = r.chainRenderers(r.renderBlockSeparator, r.renderHeading) + r.nodeRendererFuncs[ast.KindBlockquote] = r.chainRenderers(r.renderBlockSeparator, r.renderBlockquote) + r.nodeRendererFuncs[ast.KindCodeBlock] = r.chainRenderers(r.renderBlockSeparator, r.renderCodeBlock) + r.nodeRendererFuncs[ast.KindFencedCodeBlock] = r.chainRenderers(r.renderBlockSeparator, r.renderFencedCodeBlock) + r.nodeRendererFuncs[ast.KindHTMLBlock] = r.chainRenderers(r.renderBlockSeparator, r.renderHTMLBlock) + r.nodeRendererFuncs[ast.KindList] = r.chainRenderers(r.renderBlockSeparator, r.renderList) + r.nodeRendererFuncs[ast.KindListItem] = r.chainRenderers(r.renderBlockSeparator, r.renderListItem) + r.nodeRendererFuncs[ast.KindParagraph] = r.renderBlockSeparator + r.nodeRendererFuncs[ast.KindTextBlock] = r.renderBlockSeparator + r.nodeRendererFuncs[ast.KindThematicBreak] = r.chainRenderers(r.renderBlockSeparator, r.renderThematicBreak) + + // inlines + r.nodeRendererFuncs[ast.KindAutoLink] = r.renderAutoLink + r.nodeRendererFuncs[ast.KindCodeSpan] = r.renderCodeSpan + r.nodeRendererFuncs[ast.KindEmphasis] = r.renderEmphasis + r.nodeRendererFuncs[ast.KindImage] = r.renderImage + r.nodeRendererFuncs[ast.KindLink] = r.renderLink + r.nodeRendererFuncs[ast.KindRawHTML] = r.renderRawHTML + r.nodeRendererFuncs[ast.KindText] = r.renderText + // TODO: add KindString + // r.nodeRendererFuncs[ast.KindString] = r.renderString + + for kind, fun := range r.nodeRendererFuncsTmp { + r.nodeRendererFuncs[kind] = r.transform(fun) + } + r.nodeRendererFuncsTmp = nil + }) + return ast.Walk(n, func(n ast.Node, entering bool) (ast.WalkStatus, error) { + return r.nodeRendererFuncs[n.Kind()](n, entering), r.rc.writer.Err() + }) +} + +// transform wraps a renderer.NodeRendererFunc to match the nodeRenderer function signature +func (r *Renderer) transform(fn renderer.NodeRendererFunc) nodeRenderer { + return func(n ast.Node, entering bool) ast.WalkStatus { + status, _ := fn(r.rc.writer, r.rc.source, n, entering) + return status + } +} + +// nodeRenderer is a markdown node renderer func. +type nodeRenderer func(ast.Node, bool) ast.WalkStatus + +func (r *Renderer) chainRenderers(renderers ...nodeRenderer) nodeRenderer { + return func(node ast.Node, entering bool) ast.WalkStatus { + var walkStatus ast.WalkStatus + for i := range renderers { + // go through renderers in reverse when exiting + if !entering { + i = len(renderers) - 1 - i + } + walkStatus = renderers[i](node, entering) + } + return walkStatus + } +} + +func (r *Renderer) renderBlockSeparator(node ast.Node, entering bool) ast.WalkStatus { + if entering { + // Add blank previous line if applicable + if node.PreviousSibling() != nil && node.HasBlankPreviousLines() { + r.rc.writer.EndLine() + } + } else { + // Flush line buffer to complete line written by previous block + r.rc.writer.FlushLine() + } + return ast.WalkContinue +} + +func (r *Renderer) renderAutoLink(node ast.Node, entering bool) ast.WalkStatus { + n := node.(*ast.AutoLink) + if entering { + r.rc.writer.WriteBytes([]byte("<")) + r.rc.writer.WriteBytes(n.URL(r.rc.source)) + } else { + r.rc.writer.WriteBytes([]byte(">")) + } + return ast.WalkContinue +} + +func (r *Renderer) renderBlockquote(node ast.Node, entering bool) ast.WalkStatus { + if entering { + r.rc.writer.PushPrefix([]byte("> ")) + } else { + r.rc.writer.PopPrefix() + } + return ast.WalkContinue +} + +func (r *Renderer) renderHeading(node ast.Node, entering bool) ast.WalkStatus { + n := node.(*ast.Heading) + // Empty headings or headings above level 2 can only be ATX + if !n.HasChildren() || n.Level > 2 { + return r.renderATXHeading(n, entering) + } + // Multiline headings can only be Setext + if n.Lines().Len() > 1 { + return r.renderSetextHeading(n, entering) + } + // Otherwise it's up to the configuration + if r.config.HeadingStyle.IsSetext() { + return r.renderSetextHeading(n, entering) + } + return r.renderATXHeading(n, entering) +} + +func (r *Renderer) renderATXHeading(node *ast.Heading, entering bool) ast.WalkStatus { + if entering { + r.rc.writer.WriteBytes(bytes.Repeat([]byte("#"), node.Level)) + // Only print space after heading if non-empty + if node.HasChildren() { + r.rc.writer.WriteBytes([]byte(" ")) + } + } else { + if r.config.HeadingStyle == HeadingStyleATXSurround { + r.rc.writer.WriteBytes([]byte(" ")) + r.rc.writer.WriteBytes(bytes.Repeat([]byte("#"), node.Level)) + } + } + return ast.WalkContinue +} + +func (r *Renderer) renderSetextHeading(node *ast.Heading, entering bool) ast.WalkStatus { + if entering { + return ast.WalkContinue + } + underlineChar := [...][]byte{[]byte(""), []byte("="), []byte("-")}[node.Level] + underlineWidth := 3 + if r.config.HeadingStyle == HeadingStyleFullWidthSetext { + lines := node.Lines() + for i := 0; i < lines.Len(); i++ { + line := lines.At(i) + lineWidth := line.Len() + + if lineWidth > underlineWidth { + underlineWidth = lineWidth + } + } + } + r.rc.writer.WriteBytes([]byte("\n")) + r.rc.writer.WriteBytes(bytes.Repeat(underlineChar, underlineWidth)) + return ast.WalkContinue +} + +func (r *Renderer) renderThematicBreak(node ast.Node, entering bool) ast.WalkStatus { + if entering { + breakChars := []byte{'-', '*', '_'} + breakChar := breakChars[r.config.ThematicBreakStyle : r.config.ThematicBreakStyle+1] + breakLen := int(max(r.config.ThematicBreakLength, ThematicBreakLengthMinimum)) + r.rc.writer.WriteBytes(bytes.Repeat(breakChar, breakLen)) + } + return ast.WalkContinue +} + +func (r *Renderer) renderCodeBlock(node ast.Node, entering bool) ast.WalkStatus { + if entering { + r.rc.writer.PushPrefix(r.config.IndentStyle.Bytes()) + r.renderLines(node, entering) + } else { + r.rc.writer.PopPrefix() + } + return ast.WalkContinue +} + +func (r *Renderer) renderFencedCodeBlock(node ast.Node, entering bool) ast.WalkStatus { + n := node.(*ast.FencedCodeBlock) + r.rc.writer.WriteBytes([]byte("```")) + if entering { + if info := n.Info; info != nil { + r.rc.writer.WriteBytes(info.Text(r.rc.source)) + } + r.rc.writer.FlushLine() + r.renderLines(node, entering) + } + return ast.WalkContinue +} + +func (r *Renderer) renderHTMLBlock(node ast.Node, entering bool) ast.WalkStatus { + n := node.(*ast.HTMLBlock) + if entering { + r.renderLines(node, entering) + } else { + if n.HasClosure() { + r.rc.writer.WriteLine(n.ClosureLine.Value(r.rc.source)) + } + } + return ast.WalkContinue +} + +func (r *Renderer) renderList(node ast.Node, entering bool) ast.WalkStatus { + if entering { + n := node.(*ast.List) + r.rc.lists = append(r.rc.lists, listContext{ + list: n, + num: n.Start, + }) + } else { + r.rc.lists = r.rc.lists[:len(r.rc.lists)-1] + } + return ast.WalkContinue +} + +func (r *Renderer) renderListItem(node ast.Node, entering bool) ast.WalkStatus { + if entering { + var itemPrefix []byte + l := r.rc.lists[len(r.rc.lists)-1] + + if l.list.IsOrdered() { + itemPrefix = append(itemPrefix, []byte(fmt.Sprint(l.num))...) + r.rc.lists[len(r.rc.lists)-1].num += 1 + } + itemPrefix = append(itemPrefix, l.list.Marker, ' ') + // Prefix the current line with the item prefix + r.rc.writer.PushPrefix(itemPrefix, 0, 0) + // Prefix subsequent lines with padding the same length as the item prefix + indentLen := int(max(r.config.SubListLength, SubListLengthMinimum)) + indent := bytes.Repeat([]byte{' '}, indentLen) + r.rc.writer.PushPrefix(bytes.Repeat(indent, len(itemPrefix)), 1) + } else { + r.rc.writer.PopPrefix() + r.rc.writer.PopPrefix() + } + return ast.WalkContinue +} + +func (r *Renderer) renderRawHTML(node ast.Node, entering bool) ast.WalkStatus { + n := node.(*ast.RawHTML) + if entering { + r.renderSegments(n.Segments, false) + } + return ast.WalkContinue +} + +func (r *Renderer) renderText(node ast.Node, entering bool) ast.WalkStatus { + n := node.(*ast.Text) + if entering { + text := n.Text(r.rc.source) + + r.rc.writer.WriteBytes(text) + if n.SoftLineBreak() { + r.rc.writer.EndLine() + } + } + return ast.WalkContinue +} + +func (r *Renderer) renderSegments(segments *text.Segments, asLines bool) { + for i := 0; i < segments.Len(); i++ { + segment := segments.At(i) + value := segment.Value(r.rc.source) + r.rc.writer.WriteBytes(value) + if asLines { + r.rc.writer.FlushLine() + } + } +} + +func (r *Renderer) renderLines(node ast.Node, entering bool) ast.WalkStatus { + if entering { + lines := node.Lines() + r.renderSegments(lines, true) + } + return ast.WalkContinue +} + +func (r *Renderer) renderLink(node ast.Node, entering bool) ast.WalkStatus { + n := node.(*ast.Link) + return r.renderLinkCommon(n.Title, n.Destination, entering) +} + +func (r *Renderer) renderImage(node ast.Node, entering bool) ast.WalkStatus { + n := node.(*ast.Image) + if entering { + r.rc.writer.WriteBytes([]byte("!")) + } + return r.renderLinkCommon(n.Title, n.Destination, entering) +} + +func (r *Renderer) renderLinkCommon(title, destination []byte, entering bool) ast.WalkStatus { + if entering { + r.rc.writer.WriteBytes([]byte("[")) + } else { + r.rc.writer.WriteBytes([]byte("](")) + r.rc.writer.WriteBytes(destination) + if len(title) > 0 { + r.rc.writer.WriteBytes([]byte(" \"")) + r.rc.writer.WriteBytes(title) + r.rc.writer.WriteBytes([]byte("\"")) + } + r.rc.writer.WriteBytes([]byte(")")) + } + return ast.WalkContinue +} + +func (r *Renderer) renderCodeSpan(node ast.Node, entering bool) ast.WalkStatus { + if bytes.Count(node.Text(r.rc.source), []byte("`"))%2 != 0 { + r.rc.writer.WriteBytes([]byte("``")) + } else { + r.rc.writer.WriteBytes([]byte("`")) + } + + return ast.WalkContinue +} + +func (r *Renderer) renderEmphasis(node ast.Node, entering bool) ast.WalkStatus { + n := node.(*ast.Emphasis) + r.rc.writer.WriteBytes(bytes.Repeat([]byte{'*'}, n.Level)) + return ast.WalkContinue +} + +type renderContext struct { + writer *markdownWriter + // source is the markdown source + source []byte + // listMarkers is the marker character used for the current list + lists []listContext +} + +type listContext struct { + list *ast.List + num int +} + +// newRenderContext returns a new renderContext object +func newRenderContext(writer io.Writer, source []byte, config *Config) renderContext { + return renderContext{ + writer: newMarkdownWriter(writer, config), + source: source, + } +} diff --git a/vendor/github.com/teekennedy/goldmark-markdown/writer.go b/vendor/github.com/teekennedy/goldmark-markdown/writer.go new file mode 100644 index 0000000..4c9ca02 --- /dev/null +++ b/vendor/github.com/teekennedy/goldmark-markdown/writer.go @@ -0,0 +1,173 @@ +package markdown + +import ( + "bytes" + "io" + "unicode" + + "github.com/yuin/goldmark/util" +) + +// Line delimiter +const lineDelim byte = '\n' + +// linePrefix associates a line prefix with its starting line. +type linePrefix struct { + // startLine and endLine are the line numbers the prefix starts and ends on + startLine, endLine int + // bytes is the bytes of the prefix + bytes []byte +} + +// markdownWriter provides an interface similar to io.Writer for writing markdown files. It handles +// errors returned by the underlying writer, and manages output of some rendering contexts like +// container block prefixes. +type markdownWriter struct { + buf *bytes.Buffer + config *Config + // output holds the underlying output writer + output io.Writer + // prefixes holds the current line prefixes + prefixes []linePrefix + // line is the current line number + line int + // err holds the last write error. If non-nil, all write operations become no-ops + err error +} + +var _ util.BufWriter = &markdownWriter{} + +// newMarkdownWriter returns a new markdownWriter +func newMarkdownWriter(w io.Writer, config *Config) *markdownWriter { + result := &markdownWriter{ + config: config, + buf: &bytes.Buffer{}, + } + // Reset initializes the rest of the struct + result.Reset(w) + return result +} + +// Reset resets all internal state and switches writes to the given writer. +func (m *markdownWriter) Reset(w io.Writer) { + m.buf.Reset() + m.output = w + m.prefixes = make([]linePrefix, 0) + m.line = 0 + m.err = nil +} + +// WriteLine writes the given bytes as a finished line, regardless of trailing newline. +func (m *markdownWriter) WriteLine(line []byte) (n int) { + n, _ = m.Write(line) + m.FlushLine() + + return n +} + +// FlushLine ends the current buffered line if non-empty, flushing the contents to the underlying +// writer. +func (m *markdownWriter) FlushLine() { + if m.buf.Len() > 0 { + m.EndLine() + } +} + +// EndLine ends the current line, flushing the line buffer regardless of whether it's empty. +func (m *markdownWriter) EndLine() { + _, _ = m.Write([]byte{lineDelim}) +} + +// PushPrefix adds the given bytes as a prefix for lines written to the output. The prefix +// will be added to the current line and all subsequent lines by default, but can optionally be +// given a start line relative to the current line, and an end line relative to the start line. +func (p *markdownWriter) PushPrefix(bytes []byte, lineRanges ...int) { + prefix := linePrefix{ + endLine: -1, + bytes: bytes, + } + if len(lineRanges) > 0 { + prefix.startLine = p.line + lineRanges[0] + if len(lineRanges) > 1 { + prefix.endLine = prefix.startLine + lineRanges[1] + } + } + p.prefixes = append(p.prefixes, prefix) +} + +// PopPrefix removes the most recently pushed line prefix from future lines. +func (p *markdownWriter) PopPrefix() { + p.prefixes = p.prefixes[0 : len(p.prefixes)-1] +} + +// Write writes the given data to an internal buffer, then writes any complete lines to the +// underlying writer. +func (m *markdownWriter) Write(data []byte) (n int, err error) { + return m.WriteBytes(data), m.err +} + +func (m *markdownWriter) WriteBytes(data []byte) (n int) { + if m.err != nil { + return 0 + } + // Writing to a bytes.Buffer always returns a nil error + n, _ = m.buf.Write(data) + prefixedLine := bytes.Buffer{} + for bytes.Contains(m.buf.Bytes(), []byte{lineDelim}) { + // err will only be non-nil if lineDelim is not in m.buf, which we already checked for. + line, _ := m.buf.ReadBytes(lineDelim) + // build the prefix for the line + for _, prefix := range m.prefixes { + if prefix.startLine <= m.line && (prefix.endLine == -1 || m.line <= prefix.endLine) { + prefixedLine.Write(prefix.bytes) + } + } + prefixedLine.Write(line) + // trim whitespace off the end of the line + trimmedSlice := bytes.TrimRightFunc(prefixedLine.Bytes(), unicode.IsSpace) + prefixedLine.Truncate(len(trimmedSlice)) + prefixedLine.WriteByte(lineDelim) + + _, err := m.output.Write(prefixedLine.Bytes()) + if err != nil { + m.err = err + return 0 + } + m.line += 1 + prefixedLine.Reset() + } + return n +} + +// Err returns the last write error, or nil. +func (m *markdownWriter) Err() error { + return m.err +} + +// Available returns how many bytes are unused in the buffer. +func (m *markdownWriter) Available() int { + return m.buf.Available() +} + +// Buffered returns the number of bytes that have been written into the current buffer. +func (m *markdownWriter) Buffered() int { + return m.buf.Len() +} + +// Flush flushes the contents of the buffer to the output. +func (m *markdownWriter) Flush() error { + m.FlushLine() + return nil +} + +func (m *markdownWriter) WriteByte(c byte) error { + return m.buf.WriteByte(c) +} + +func (m *markdownWriter) WriteRune(r rune) (size int, err error) { + return m.buf.WriteRune(r) +} + +func (m *markdownWriter) WriteString(s string) (n int, err error) { + return m.buf.WriteString(s) +} diff --git a/vendor/github.com/yuin/goldmark-highlighting/.gitignore b/vendor/github.com/yuin/goldmark-highlighting/.gitignore new file mode 100644 index 0000000..6e4db92 --- /dev/null +++ b/vendor/github.com/yuin/goldmark-highlighting/.gitignore @@ -0,0 +1,13 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test +*.pprof + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out diff --git a/vendor/github.com/yuin/goldmark-highlighting/LICENSE b/vendor/github.com/yuin/goldmark-highlighting/LICENSE new file mode 100644 index 0000000..dc5b2a6 --- /dev/null +++ b/vendor/github.com/yuin/goldmark-highlighting/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Yusuke Inuzuka + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/yuin/goldmark-highlighting/README.md b/vendor/github.com/yuin/goldmark-highlighting/README.md new file mode 100644 index 0000000..857b61b --- /dev/null +++ b/vendor/github.com/yuin/goldmark-highlighting/README.md @@ -0,0 +1,66 @@ +goldmark-highlighting +========================= + +goldmark-highlighting is an extension for the [goldmark](http://github.com/yuin/goldmark) +that adds syntax-highlighting to the fenced code blocks. + +goldmark-highlighting uses [chroma](https://github.com/alecthomas/chroma) as a +syntax highlighter. + +Installation +-------------------- + +``` +go get github.com/yuin/goldmark-highlighting +``` + +Usage +-------------------- + +```go +import ( + "bytes" + "fmt" + "github.com/alecthomas/chroma/formatters/html" + "github.com/yuin/goldmark" + "github.com/yuin/goldmark/extension" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark-highlighting" + +) + +func main() { + markdown := goldmark.New( + goldmark.WithExtensions( + highlighting.Highlighting, + ), + ) + var buf bytes.Buffer + if err := markdown.Convert([]byte(source), &buf); err != nil { + panic(err) + } + fmt.Print(title) +} +``` + + +```go + markdown := goldmark.New( + goldmark.WithExtensions( + highlighting.NewHighlighting( + highlighting.WithStyle("monokai"), + highlighting.WithFormatOptions( + html.WithLineNumbers(), + ), + ), + ), + ) +``` + +License +-------------------- +MIT + +Author +-------------------- +Yusuke Inuzuka diff --git a/vendor/github.com/yuin/goldmark-highlighting/highlighting.go b/vendor/github.com/yuin/goldmark-highlighting/highlighting.go new file mode 100644 index 0000000..ffdaaed --- /dev/null +++ b/vendor/github.com/yuin/goldmark-highlighting/highlighting.go @@ -0,0 +1,578 @@ +// package highlighting is a extension for the goldmark(http://github.com/yuin/goldmark). +// +// This extension adds syntax-highlighting to the fenced code blocks using +// chroma(https://github.com/alecthomas/chroma). +package highlighting + +import ( + "bytes" + "io" + "strconv" + "strings" + + "github.com/yuin/goldmark" + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/renderer/html" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" + + "github.com/alecthomas/chroma" + chromahtml "github.com/alecthomas/chroma/formatters/html" + "github.com/alecthomas/chroma/lexers" + "github.com/alecthomas/chroma/styles" +) + +// ImmutableAttributes is a read-only interface for ast.Attributes. +type ImmutableAttributes interface { + // Get returns (value, true) if an attribute associated with given + // name exists, otherwise (nil, false) + Get(name []byte) (interface{}, bool) + + // GetString returns (value, true) if an attribute associated with given + // name exists, otherwise (nil, false) + GetString(name string) (interface{}, bool) + + // All returns all attributes. + All() []ast.Attribute +} + +type immutableAttributes struct { + n ast.Node +} + +func (a *immutableAttributes) Get(name []byte) (interface{}, bool) { + return a.n.Attribute(name) +} + +func (a *immutableAttributes) GetString(name string) (interface{}, bool) { + return a.n.AttributeString(name) +} + +func (a *immutableAttributes) All() []ast.Attribute { + if a.n.Attributes() == nil { + return []ast.Attribute{} + } + return a.n.Attributes() +} + +// CodeBlockContext holds contextual information of code highlighting. +type CodeBlockContext interface { + // Language returns (language, true) if specified, otherwise (nil, false). + Language() ([]byte, bool) + + // Highlighted returns true if this code block can be highlighted, otherwise false. + Highlighted() bool + + // Attributes return attributes of the code block. + Attributes() ImmutableAttributes +} + +type codeBlockContext struct { + language []byte + highlighted bool + attributes ImmutableAttributes +} + +func newCodeBlockContext(language []byte, highlighted bool, attrs ImmutableAttributes) CodeBlockContext { + return &codeBlockContext{ + language: language, + highlighted: highlighted, + attributes: attrs, + } +} + +func (c *codeBlockContext) Language() ([]byte, bool) { + if c.language != nil { + return c.language, true + } + return nil, false +} + +func (c *codeBlockContext) Highlighted() bool { + return c.highlighted +} + +func (c *codeBlockContext) Attributes() ImmutableAttributes { + return c.attributes +} + +// WrapperRenderer renders wrapper elements like div, pre, etc. +type WrapperRenderer func(w util.BufWriter, context CodeBlockContext, entering bool) + +// CodeBlockOptions creates Chroma options per code block. +type CodeBlockOptions func(ctx CodeBlockContext) []chromahtml.Option + +// Config struct holds options for the extension. +type Config struct { + html.Config + + // Style is a highlighting style. + // Supported styles are defined under https://github.com/alecthomas/chroma/tree/master/formatters. + Style string + + // Pass in a custom Chroma style. If this is not nil, the Style string will be ignored + CustomStyle *chroma.Style + + // If set, will try to guess language if none provided. + // If the guessing fails, we will fall back to a text lexer. + // Note that while Chroma's API supports language guessing, the implementation + // is not there yet, so you will currently always get the basic text lexer. + GuessLanguage bool + + // FormatOptions is a option related to output formats. + // See https://github.com/alecthomas/chroma#the-html-formatter for details. + FormatOptions []chromahtml.Option + + // CSSWriter is an io.Writer that will be used as CSS data output buffer. + // If WithClasses() is enabled, you can get CSS data corresponds to the style. + CSSWriter io.Writer + + // CodeBlockOptions allows set Chroma options per code block. + CodeBlockOptions CodeBlockOptions + + // WrapperRenderer allows you to change wrapper elements. + WrapperRenderer WrapperRenderer +} + +// NewConfig returns a new Config with defaults. +func NewConfig() Config { + return Config{ + Config: html.NewConfig(), + Style: "github", + FormatOptions: []chromahtml.Option{}, + CSSWriter: nil, + WrapperRenderer: nil, + CodeBlockOptions: nil, + } +} + +// SetOption implements renderer.SetOptioner. +func (c *Config) SetOption(name renderer.OptionName, value interface{}) { + switch name { + case optStyle: + c.Style = value.(string) + case optCustomStyle: + c.CustomStyle = value.(*chroma.Style) + case optFormatOptions: + if value != nil { + c.FormatOptions = value.([]chromahtml.Option) + } + case optCSSWriter: + c.CSSWriter = value.(io.Writer) + case optWrapperRenderer: + c.WrapperRenderer = value.(WrapperRenderer) + case optCodeBlockOptions: + c.CodeBlockOptions = value.(CodeBlockOptions) + case optGuessLanguage: + c.GuessLanguage = value.(bool) + default: + c.Config.SetOption(name, value) + } +} + +// Option interface is a functional option interface for the extension. +type Option interface { + renderer.Option + // SetHighlightingOption sets given option to the extension. + SetHighlightingOption(*Config) +} + +type withHTMLOptions struct { + value []html.Option +} + +func (o *withHTMLOptions) SetConfig(c *renderer.Config) { + if o.value != nil { + for _, v := range o.value { + v.(renderer.Option).SetConfig(c) + } + } +} + +func (o *withHTMLOptions) SetHighlightingOption(c *Config) { + if o.value != nil { + for _, v := range o.value { + v.SetHTMLOption(&c.Config) + } + } +} + +// WithHTMLOptions is functional option that wraps goldmark HTMLRenderer options. +func WithHTMLOptions(opts ...html.Option) Option { + return &withHTMLOptions{opts} +} + +const optStyle renderer.OptionName = "HighlightingStyle" +const optCustomStyle renderer.OptionName = "HighlightingCustomStyle" + +var highlightLinesAttrName = []byte("hl_lines") + +var styleAttrName = []byte("hl_style") +var nohlAttrName = []byte("nohl") +var linenosAttrName = []byte("linenos") +var linenosTableAttrValue = []byte("table") +var linenosInlineAttrValue = []byte("inline") +var linenostartAttrName = []byte("linenostart") + +type withStyle struct { + value string +} + +func (o *withStyle) SetConfig(c *renderer.Config) { + c.Options[optStyle] = o.value +} + +func (o *withStyle) SetHighlightingOption(c *Config) { + c.Style = o.value +} + +// WithStyle is a functional option that changes highlighting style. +func WithStyle(style string) Option { + return &withStyle{style} +} + +type withCustomStyle struct { + value *chroma.Style +} + +func (o *withCustomStyle) SetConfig(c *renderer.Config) { + c.Options[optCustomStyle] = o.value +} + +func (o *withCustomStyle) SetHighlightingOption(c *Config) { + c.CustomStyle = o.value +} + +// WithStyle is a functional option that changes highlighting style. +func WithCustomStyle(style *chroma.Style) Option { + return &withCustomStyle{style} +} + +const optCSSWriter renderer.OptionName = "HighlightingCSSWriter" + +type withCSSWriter struct { + value io.Writer +} + +func (o *withCSSWriter) SetConfig(c *renderer.Config) { + c.Options[optCSSWriter] = o.value +} + +func (o *withCSSWriter) SetHighlightingOption(c *Config) { + c.CSSWriter = o.value +} + +// WithCSSWriter is a functional option that sets io.Writer for CSS data. +func WithCSSWriter(w io.Writer) Option { + return &withCSSWriter{w} +} + +const optGuessLanguage renderer.OptionName = "HighlightingGuessLanguage" + +type withGuessLanguage struct { + value bool +} + +func (o *withGuessLanguage) SetConfig(c *renderer.Config) { + c.Options[optGuessLanguage] = o.value +} + +func (o *withGuessLanguage) SetHighlightingOption(c *Config) { + c.GuessLanguage = o.value +} + +// WithGuessLanguage is a functional option that toggles language guessing +// if none provided. +func WithGuessLanguage(b bool) Option { + return &withGuessLanguage{value: b} +} + +const optWrapperRenderer renderer.OptionName = "HighlightingWrapperRenderer" + +type withWrapperRenderer struct { + value WrapperRenderer +} + +func (o *withWrapperRenderer) SetConfig(c *renderer.Config) { + c.Options[optWrapperRenderer] = o.value +} + +func (o *withWrapperRenderer) SetHighlightingOption(c *Config) { + c.WrapperRenderer = o.value +} + +// WithWrapperRenderer is a functional option that sets WrapperRenderer that +// renders wrapper elements like div, pre, etc. +func WithWrapperRenderer(w WrapperRenderer) Option { + return &withWrapperRenderer{w} +} + +const optCodeBlockOptions renderer.OptionName = "HighlightingCodeBlockOptions" + +type withCodeBlockOptions struct { + value CodeBlockOptions +} + +func (o *withCodeBlockOptions) SetConfig(c *renderer.Config) { + c.Options[optWrapperRenderer] = o.value +} + +func (o *withCodeBlockOptions) SetHighlightingOption(c *Config) { + c.CodeBlockOptions = o.value +} + +// WithCodeBlockOptions is a functional option that sets CodeBlockOptions that +// allows setting Chroma options per code block. +func WithCodeBlockOptions(c CodeBlockOptions) Option { + return &withCodeBlockOptions{value: c} +} + +const optFormatOptions renderer.OptionName = "HighlightingFormatOptions" + +type withFormatOptions struct { + value []chromahtml.Option +} + +func (o *withFormatOptions) SetConfig(c *renderer.Config) { + if _, ok := c.Options[optFormatOptions]; !ok { + c.Options[optFormatOptions] = []chromahtml.Option{} + } + c.Options[optFormatOptions] = append(c.Options[optFormatOptions].([]chromahtml.Option), o.value...) +} + +func (o *withFormatOptions) SetHighlightingOption(c *Config) { + c.FormatOptions = append(c.FormatOptions, o.value...) +} + +// WithFormatOptions is a functional option that wraps chroma HTML formatter options. +func WithFormatOptions(opts ...chromahtml.Option) Option { + return &withFormatOptions{opts} +} + +// HTMLRenderer struct is a renderer.NodeRenderer implementation for the extension. +type HTMLRenderer struct { + Config +} + +// NewHTMLRenderer builds a new HTMLRenderer with given options and returns it. +func NewHTMLRenderer(opts ...Option) renderer.NodeRenderer { + r := &HTMLRenderer{ + Config: NewConfig(), + } + for _, opt := range opts { + opt.SetHighlightingOption(&r.Config) + } + return r +} + +// RegisterFuncs implements NodeRenderer.RegisterFuncs. +func (r *HTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { + reg.Register(ast.KindFencedCodeBlock, r.renderFencedCodeBlock) +} + +func getAttributes(node *ast.FencedCodeBlock, infostr []byte) ImmutableAttributes { + if node.Attributes() != nil { + return &immutableAttributes{node} + } + if infostr != nil { + attrStartIdx := -1 + + for idx, char := range infostr { + if char == '{' { + attrStartIdx = idx + break + } + } + if attrStartIdx > 0 { + n := ast.NewTextBlock() // dummy node for storing attributes + attrStr := infostr[attrStartIdx:] + if attrs, hasAttr := parser.ParseAttributes(text.NewReader(attrStr)); hasAttr { + for _, attr := range attrs { + n.SetAttribute(attr.Name, attr.Value) + } + return &immutableAttributes{n} + } + } + } + return nil +} + +func (r *HTMLRenderer) renderFencedCodeBlock(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + n := node.(*ast.FencedCodeBlock) + if !entering { + return ast.WalkContinue, nil + } + language := n.Language(source) + + chromaFormatterOptions := make([]chromahtml.Option, len(r.FormatOptions)) + copy(chromaFormatterOptions, r.FormatOptions) + + style := r.CustomStyle + if style == nil { + style = styles.Get(r.Style) + } + nohl := false + + var info []byte + if n.Info != nil { + info = n.Info.Segment.Value(source) + } + attrs := getAttributes(n, info) + if attrs != nil { + baseLineNumber := 1 + if linenostartAttr, ok := attrs.Get(linenostartAttrName); ok { + if linenostart, ok := linenostartAttr.(float64); ok { + baseLineNumber = int(linenostart) + chromaFormatterOptions = append(chromaFormatterOptions, chromahtml.BaseLineNumber(baseLineNumber)) + } + } + if linesAttr, hasLinesAttr := attrs.Get(highlightLinesAttrName); hasLinesAttr { + if lines, ok := linesAttr.([]interface{}); ok { + var hlRanges [][2]int + for _, l := range lines { + if ln, ok := l.(float64); ok { + hlRanges = append(hlRanges, [2]int{int(ln) + baseLineNumber - 1, int(ln) + baseLineNumber - 1}) + } + if rng, ok := l.([]uint8); ok { + slices := strings.Split(string([]byte(rng)), "-") + lhs, err := strconv.Atoi(slices[0]) + if err != nil { + continue + } + rhs := lhs + if len(slices) > 1 { + rhs, err = strconv.Atoi(slices[1]) + if err != nil { + continue + } + } + hlRanges = append(hlRanges, [2]int{lhs + baseLineNumber - 1, rhs + baseLineNumber - 1}) + } + } + chromaFormatterOptions = append(chromaFormatterOptions, chromahtml.HighlightLines(hlRanges)) + } + } + if styleAttr, hasStyleAttr := attrs.Get(styleAttrName); hasStyleAttr { + if st, ok := styleAttr.([]uint8); ok { + styleStr := string([]byte(st)) + style = styles.Get(styleStr) + } + } + if _, hasNohlAttr := attrs.Get(nohlAttrName); hasNohlAttr { + nohl = true + } + + if linenosAttr, ok := attrs.Get(linenosAttrName); ok { + switch v := linenosAttr.(type) { + case bool: + chromaFormatterOptions = append(chromaFormatterOptions, chromahtml.WithLineNumbers(v)) + case []uint8: + if v != nil { + chromaFormatterOptions = append(chromaFormatterOptions, chromahtml.WithLineNumbers(true)) + } + if bytes.Equal(v, linenosTableAttrValue) { + chromaFormatterOptions = append(chromaFormatterOptions, chromahtml.LineNumbersInTable(true)) + } else if bytes.Equal(v, linenosInlineAttrValue) { + chromaFormatterOptions = append(chromaFormatterOptions, chromahtml.LineNumbersInTable(false)) + } + } + } + } + + var lexer chroma.Lexer + if language != nil { + lexer = lexers.Get(string(language)) + } + if !nohl && (lexer != nil || r.GuessLanguage) { + if style == nil { + style = styles.Fallback + } + var buffer bytes.Buffer + l := n.Lines().Len() + for i := 0; i < l; i++ { + line := n.Lines().At(i) + buffer.Write(line.Value(source)) + } + + if lexer == nil { + lexer = lexers.Analyse(buffer.String()) + if lexer == nil { + lexer = lexers.Fallback + } + language = []byte(strings.ToLower(lexer.Config().Name)) + } + lexer = chroma.Coalesce(lexer) + + iterator, err := lexer.Tokenise(nil, buffer.String()) + if err == nil { + c := newCodeBlockContext(language, true, attrs) + + if r.CodeBlockOptions != nil { + chromaFormatterOptions = append(chromaFormatterOptions, r.CodeBlockOptions(c)...) + } + formatter := chromahtml.New(chromaFormatterOptions...) + if r.WrapperRenderer != nil { + r.WrapperRenderer(w, c, true) + } + _ = formatter.Format(w, style, iterator) == nil + if r.WrapperRenderer != nil { + r.WrapperRenderer(w, c, false) + } + if r.CSSWriter != nil { + _ = formatter.WriteCSS(r.CSSWriter, style) + } + return ast.WalkContinue, nil + } + } + + var c CodeBlockContext + if r.WrapperRenderer != nil { + c = newCodeBlockContext(language, false, attrs) + r.WrapperRenderer(w, c, true) + } else { + _, _ = w.WriteString("\n") + } + return ast.WalkContinue, nil +} + +type highlighting struct { + options []Option +} + +// Highlighting is a goldmark.Extender implementation. +var Highlighting = &highlighting{ + options: []Option{}, +} + +// NewHighlighting returns a new extension with given options. +func NewHighlighting(opts ...Option) goldmark.Extender { + return &highlighting{ + options: opts, + } +} + +// Extend implements goldmark.Extender. +func (e *highlighting) Extend(m goldmark.Markdown) { + m.Renderer().AddOptions(renderer.WithNodeRenderers( + util.Prioritized(NewHTMLRenderer(e.options...), 200), + )) +} diff --git a/vendor/github.com/yuin/goldmark/.gitignore b/vendor/github.com/yuin/goldmark/.gitignore new file mode 100644 index 0000000..06c135f --- /dev/null +++ b/vendor/github.com/yuin/goldmark/.gitignore @@ -0,0 +1,19 @@ +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Test binary, build with `go test -c` +*.test +*.pprof + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +.DS_Store +fuzz/corpus +fuzz/crashers +fuzz/suppressions +fuzz/fuzz-fuzz.zip diff --git a/vendor/github.com/yuin/goldmark/.golangci.yml b/vendor/github.com/yuin/goldmark/.golangci.yml new file mode 100644 index 0000000..39fe61d --- /dev/null +++ b/vendor/github.com/yuin/goldmark/.golangci.yml @@ -0,0 +1,105 @@ +run: + deadline: 10m + +issues: + exclude-use-default: false + exclude-rules: + - path: _test.go + linters: + - errcheck + - lll + exclude: + - "Package util" + +linters: + disable-all: true + enable: + - errcheck + - gosimple + - govet + - ineffassign + - staticcheck + - typecheck + - unused + - gofmt + - godot + - makezero + - misspell + - revive + - wastedassign + - lll + +linters-settings: + revive: + severity: "warning" + confidence: 0.8 + rules: + - name: blank-imports + severity: warning + disabled: false + - name: context-as-argument + severity: warning + disabled: false + - name: context-keys-type + severity: warning + disabled: false + - name: dot-imports + severity: warning + disabled: true + - name: error-return + severity: warning + disabled: false + - name: error-strings + severity: warning + disabled: false + - name: error-naming + severity: warning + disabled: false + - name: exported + severity: warning + disabled: false + - name: increment-decrement + severity: warning + disabled: false + - name: var-naming + severity: warning + disabled: false + - name: var-declaration + severity: warning + disabled: false + - name: package-comments + severity: warning + disabled: false + - name: range + severity: warning + disabled: false + - name: receiver-naming + severity: warning + disabled: false + - name: time-naming + severity: warning + disabled: false + - name: unexported-return + severity: warning + disabled: false + - name: indent-error-flow + severity: warning + disabled: false + - name: errorf + severity: warning + disabled: false + - name: empty-block + severity: warning + disabled: true + - name: superfluous-else + severity: warning + disabled: false + - name: unused-parameter + severity: warning + disabled: true + - name: unreachable-code + severity: warning + disabled: false + - name: redefines-builtin-id + severity: warning + disabled: false diff --git a/vendor/github.com/yuin/goldmark/LICENSE b/vendor/github.com/yuin/goldmark/LICENSE new file mode 100644 index 0000000..dc5b2a6 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2019 Yusuke Inuzuka + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/vendor/github.com/yuin/goldmark/Makefile b/vendor/github.com/yuin/goldmark/Makefile new file mode 100644 index 0000000..b0bb052 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/Makefile @@ -0,0 +1,13 @@ +.PHONY: test fuzz lint + +lint: + golangci-lint run -c .golangci.yml ./... + +test: + go test -coverprofile=profile.out -coverpkg=github.com/yuin/goldmark,github.com/yuin/goldmark/ast,github.com/yuin/goldmark/extension,github.com/yuin/goldmark/extension/ast,github.com/yuin/goldmark/parser,github.com/yuin/goldmark/renderer,github.com/yuin/goldmark/renderer/html,github.com/yuin/goldmark/text,github.com/yuin/goldmark/util ./... + +cov: test + go tool cover -html=profile.out + +fuzz: + cd ./fuzz && go test -fuzz=Fuzz diff --git a/vendor/github.com/yuin/goldmark/README.md b/vendor/github.com/yuin/goldmark/README.md new file mode 100644 index 0000000..286ef3c --- /dev/null +++ b/vendor/github.com/yuin/goldmark/README.md @@ -0,0 +1,568 @@ +goldmark +========================================== + +[![https://pkg.go.dev/github.com/yuin/goldmark](https://pkg.go.dev/badge/github.com/yuin/goldmark.svg)](https://pkg.go.dev/github.com/yuin/goldmark) +[![https://github.com/yuin/goldmark/actions?query=workflow:test](https://github.com/yuin/goldmark/workflows/test/badge.svg?branch=master&event=push)](https://github.com/yuin/goldmark/actions?query=workflow:test) +[![https://coveralls.io/github/yuin/goldmark](https://coveralls.io/repos/github/yuin/goldmark/badge.svg?branch=master)](https://coveralls.io/github/yuin/goldmark) +[![https://goreportcard.com/report/github.com/yuin/goldmark](https://goreportcard.com/badge/github.com/yuin/goldmark)](https://goreportcard.com/report/github.com/yuin/goldmark) + +> A Markdown parser written in Go. Easy to extend, standards-compliant, well-structured. + +goldmark is compliant with CommonMark 0.31.2. + +- [goldmark playground](https://yuin.github.io/goldmark/playground/) : Try goldmark online. This playground is built with WASM(5-10MB). + +Motivation +---------------------- +I needed a Markdown parser for Go that satisfies the following requirements: + +- Easy to extend. + - Markdown is poor in document expressions compared to other light markup languages such as reStructuredText. + - We have extensions to the Markdown syntax, e.g. PHP Markdown Extra, GitHub Flavored Markdown. +- Standards-compliant. + - Markdown has many dialects. + - GitHub-Flavored Markdown is widely used and is based upon CommonMark, effectively mooting the question of whether or not CommonMark is an ideal specification. + - CommonMark is complicated and hard to implement. +- Well-structured. + - AST-based; preserves source position of nodes. +- Written in pure Go. + +[golang-commonmark](https://gitlab.com/golang-commonmark/markdown) may be a good choice, but it seems to be a copy of [markdown-it](https://github.com/markdown-it). + +[blackfriday.v2](https://github.com/russross/blackfriday/tree/v2) is a fast and widely-used implementation, but is not CommonMark-compliant and cannot be extended from outside of the package, since its AST uses structs instead of interfaces. + +Furthermore, its behavior differs from other implementations in some cases, especially regarding lists: [Deep nested lists don't output correctly #329](https://github.com/russross/blackfriday/issues/329), [List block cannot have a second line #244](https://github.com/russross/blackfriday/issues/244), etc. + +This behavior sometimes causes problems. If you migrate your Markdown text from GitHub to blackfriday-based wikis, many lists will immediately be broken. + +As mentioned above, CommonMark is complicated and hard to implement, so Markdown parsers based on CommonMark are few and far between. + +Features +---------------------- + +- **Standards-compliant.** goldmark is fully compliant with the latest [CommonMark](https://commonmark.org/) specification. +- **Extensible.** Do you want to add a `@username` mention syntax to Markdown? + You can easily do so in goldmark. You can add your AST nodes, + parsers for block-level elements, parsers for inline-level elements, + transformers for paragraphs, transformers for the whole AST structure, and + renderers. +- **Performance.** goldmark's performance is on par with that of cmark, + the CommonMark reference implementation written in C. +- **Robust.** goldmark is tested with `go test --fuzz`. +- **Built-in extensions.** goldmark ships with common extensions like tables, strikethrough, + task lists, and definition lists. +- **Depends only on standard libraries.** + +Installation +---------------------- +```bash +$ go get github.com/yuin/goldmark +``` + + +Usage +---------------------- +Import packages: + +```go +import ( + "bytes" + "github.com/yuin/goldmark" +) +``` + + +Convert Markdown documents with the CommonMark-compliant mode: + +```go +var buf bytes.Buffer +if err := goldmark.Convert(source, &buf); err != nil { + panic(err) +} +``` + +With options +------------------------------ + +```go +var buf bytes.Buffer +if err := goldmark.Convert(source, &buf, parser.WithContext(ctx)); err != nil { + panic(err) +} +``` + +| Functional option | Type | Description | +| ----------------- | ---- | ----------- | +| `parser.WithContext` | A `parser.Context` | Context for the parsing phase. | + +Context options +---------------------- + +| Functional option | Type | Description | +| ----------------- | ---- | ----------- | +| `parser.WithIDs` | A `parser.IDs` | `IDs` allows you to change logics that are related to element id(ex: Auto heading id generation). | + + +Custom parser and renderer +-------------------------- +```go +import ( + "bytes" + "github.com/yuin/goldmark" + "github.com/yuin/goldmark/extension" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/renderer/html" +) + +md := goldmark.New( + goldmark.WithExtensions(extension.GFM), + goldmark.WithParserOptions( + parser.WithAutoHeadingID(), + ), + goldmark.WithRendererOptions( + html.WithHardWraps(), + html.WithXHTML(), + ), + ) +var buf bytes.Buffer +if err := md.Convert(source, &buf); err != nil { + panic(err) +} +``` + +| Functional option | Type | Description | +| ----------------- | ---- | ----------- | +| `goldmark.WithParser` | `parser.Parser` | This option must be passed before `goldmark.WithParserOptions` and `goldmark.WithExtensions` | +| `goldmark.WithRenderer` | `renderer.Renderer` | This option must be passed before `goldmark.WithRendererOptions` and `goldmark.WithExtensions` | +| `goldmark.WithParserOptions` | `...parser.Option` | | +| `goldmark.WithRendererOptions` | `...renderer.Option` | | +| `goldmark.WithExtensions` | `...goldmark.Extender` | | + +Parser and Renderer options +------------------------------ + +### Parser options + +| Functional option | Type | Description | +| ----------------- | ---- | ----------- | +| `parser.WithBlockParsers` | A `util.PrioritizedSlice` whose elements are `parser.BlockParser` | Parsers for parsing block level elements. | +| `parser.WithInlineParsers` | A `util.PrioritizedSlice` whose elements are `parser.InlineParser` | Parsers for parsing inline level elements. | +| `parser.WithParagraphTransformers` | A `util.PrioritizedSlice` whose elements are `parser.ParagraphTransformer` | Transformers for transforming paragraph nodes. | +| `parser.WithASTTransformers` | A `util.PrioritizedSlice` whose elements are `parser.ASTTransformer` | Transformers for transforming an AST. | +| `parser.WithAutoHeadingID` | `-` | Enables auto heading ids. | +| `parser.WithAttribute` | `-` | Enables custom attributes. Currently only headings supports attributes. | + +### HTML Renderer options + +| Functional option | Type | Description | +| ----------------- | ---- | ----------- | +| `html.WithWriter` | `html.Writer` | `html.Writer` for writing contents to an `io.Writer`. | +| `html.WithHardWraps` | `-` | Render newlines as `
`.| +| `html.WithXHTML` | `-` | Render as XHTML. | +| `html.WithUnsafe` | `-` | By default, goldmark does not render raw HTML or potentially dangerous links. With this option, goldmark renders such content as written. | + +### Built-in extensions + +- `extension.Table` + - [GitHub Flavored Markdown: Tables](https://github.github.com/gfm/#tables-extension-) +- `extension.Strikethrough` + - [GitHub Flavored Markdown: Strikethrough](https://github.github.com/gfm/#strikethrough-extension-) +- `extension.Linkify` + - [GitHub Flavored Markdown: Autolinks](https://github.github.com/gfm/#autolinks-extension-) +- `extension.TaskList` + - [GitHub Flavored Markdown: Task list items](https://github.github.com/gfm/#task-list-items-extension-) +- `extension.GFM` + - This extension enables Table, Strikethrough, Linkify and TaskList. + - This extension does not filter tags defined in [6.11: Disallowed Raw HTML (extension)](https://github.github.com/gfm/#disallowed-raw-html-extension-). + If you need to filter HTML tags, see [Security](#security). + - If you need to parse github emojis, you can use [goldmark-emoji](https://github.com/yuin/goldmark-emoji) extension. +- `extension.DefinitionList` + - [PHP Markdown Extra: Definition lists](https://michelf.ca/projects/php-markdown/extra/#def-list) +- `extension.Footnote` + - [PHP Markdown Extra: Footnotes](https://michelf.ca/projects/php-markdown/extra/#footnotes) +- `extension.Typographer` + - This extension substitutes punctuations with typographic entities like [smartypants](https://daringfireball.net/projects/smartypants/). +- `extension.CJK` + - This extension is a shortcut for CJK related functionalities. + +### Attributes +The `parser.WithAttribute` option allows you to define attributes on some elements. + +Currently only headings support attributes. + +**Attributes are being discussed in the +[CommonMark forum](https://talk.commonmark.org/t/consistent-attribute-syntax/272). +This syntax may possibly change in the future.** + + +#### Headings + +``` +## heading ## {#id .className attrName=attrValue class="class1 class2"} + +## heading {#id .className attrName=attrValue class="class1 class2"} +``` + +``` +heading {#id .className attrName=attrValue} +============ +``` + +### Table extension +The Table extension implements [Table(extension)](https://github.github.com/gfm/#tables-extension-), as +defined in [GitHub Flavored Markdown Spec](https://github.github.com/gfm/). + +Specs are defined for XHTML, so specs use some deprecated attributes for HTML5. + +You can override alignment rendering method via options. + +| Functional option | Type | Description | +| ----------------- | ---- | ----------- | +| `extension.WithTableCellAlignMethod` | `extension.TableCellAlignMethod` | Option indicates how are table cells aligned. | + +### Typographer extension + +The Typographer extension translates plain ASCII punctuation characters into typographic-punctuation HTML entities. + +Default substitutions are: + +| Punctuation | Default entity | +| ------------ | ---------- | +| `'` | `‘`, `’` | +| `"` | `“`, `”` | +| `--` | `–` | +| `---` | `—` | +| `...` | `…` | +| `<<` | `«` | +| `>>` | `»` | + +You can override the default substitutions via `extensions.WithTypographicSubstitutions`: + +```go +markdown := goldmark.New( + goldmark.WithExtensions( + extension.NewTypographer( + extension.WithTypographicSubstitutions(extension.TypographicSubstitutions{ + extension.LeftSingleQuote: []byte("‚"), + extension.RightSingleQuote: nil, // nil disables a substitution + }), + ), + ), +) +``` + +### Linkify extension + +The Linkify extension implements [Autolinks(extension)](https://github.github.com/gfm/#autolinks-extension-), as +defined in [GitHub Flavored Markdown Spec](https://github.github.com/gfm/). + +Since the spec does not define details about URLs, there are numerous ambiguous cases. + +You can override autolinking patterns via options. + +| Functional option | Type | Description | +| ----------------- | ---- | ----------- | +| `extension.WithLinkifyAllowedProtocols` | `[][]byte \| []string` | List of allowed protocols such as `[]string{ "http:" }` | +| `extension.WithLinkifyURLRegexp` | `*regexp.Regexp` | Regexp that defines URLs, including protocols | +| `extension.WithLinkifyWWWRegexp` | `*regexp.Regexp` | Regexp that defines URL starting with `www.`. This pattern corresponds to [the extended www autolink](https://github.github.com/gfm/#extended-www-autolink) | +| `extension.WithLinkifyEmailRegexp` | `*regexp.Regexp` | Regexp that defines email addresses` | + +Example, using [xurls](https://github.com/mvdan/xurls): + +```go +import "mvdan.cc/xurls/v2" + +markdown := goldmark.New( + goldmark.WithRendererOptions( + html.WithXHTML(), + html.WithUnsafe(), + ), + goldmark.WithExtensions( + extension.NewLinkify( + extension.WithLinkifyAllowedProtocols([]string{ + "http:", + "https:", + }), + extension.WithLinkifyURLRegexp( + xurls.Strict(), + ), + ), + ), +) +``` + +### Footnotes extension + +The Footnote extension implements [PHP Markdown Extra: Footnotes](https://michelf.ca/projects/php-markdown/extra/#footnotes). + +This extension has some options: + +| Functional option | Type | Description | +| ----------------- | ---- | ----------- | +| `extension.WithFootnoteIDPrefix` | `[]byte \| string` | a prefix for the id attributes.| +| `extension.WithFootnoteIDPrefixFunction` | `func(gast.Node) []byte` | a function that determines the id attribute for given Node.| +| `extension.WithFootnoteLinkTitle` | `[]byte \| string` | an optional title attribute for footnote links.| +| `extension.WithFootnoteBacklinkTitle` | `[]byte \| string` | an optional title attribute for footnote backlinks. | +| `extension.WithFootnoteLinkClass` | `[]byte \| string` | a class for footnote links. This defaults to `footnote-ref`. | +| `extension.WithFootnoteBacklinkClass` | `[]byte \| string` | a class for footnote backlinks. This defaults to `footnote-backref`. | +| `extension.WithFootnoteBacklinkHTML` | `[]byte \| string` | a class for footnote backlinks. This defaults to `↩︎`. | + +Some options can have special substitutions. Occurrences of “^^” in the string will be replaced by the corresponding footnote number in the HTML output. Occurrences of “%%” will be replaced by a number for the reference (footnotes can have multiple references). + +`extension.WithFootnoteIDPrefix` and `extension.WithFootnoteIDPrefixFunction` are useful if you have multiple Markdown documents displayed inside one HTML document to avoid footnote ids to clash each other. + +`extension.WithFootnoteIDPrefix` sets fixed id prefix, so you may write codes like the following: + +```go +for _, path := range files { + source := readAll(path) + prefix := getPrefix(path) + + markdown := goldmark.New( + goldmark.WithExtensions( + NewFootnote( + WithFootnoteIDPrefix(path), + ), + ), + ) + var b bytes.Buffer + err := markdown.Convert(source, &b) + if err != nil { + t.Error(err.Error()) + } +} +``` + +`extension.WithFootnoteIDPrefixFunction` determines an id prefix by calling given function, so you may write codes like the following: + +```go +markdown := goldmark.New( + goldmark.WithExtensions( + NewFootnote( + WithFootnoteIDPrefixFunction(func(n gast.Node) []byte { + v, ok := n.OwnerDocument().Meta()["footnote-prefix"] + if ok { + return util.StringToReadOnlyBytes(v.(string)) + } + return nil + }), + ), + ), +) + +for _, path := range files { + source := readAll(path) + var b bytes.Buffer + + doc := markdown.Parser().Parse(text.NewReader(source)) + doc.Meta()["footnote-prefix"] = getPrefix(path) + err := markdown.Renderer().Render(&b, source, doc) +} +``` + +You can use [goldmark-meta](https://github.com/yuin/goldmark-meta) to define a id prefix in the markdown document: + + +```markdown +--- +title: document title +slug: article1 +footnote-prefix: article1 +--- + +# My article + +``` + +### CJK extension +CommonMark gives compatibilities a high priority and original markdown was designed by westerners. So CommonMark lacks considerations for languages like CJK. + +This extension provides additional options for CJK users. + +| Functional option | Type | Description | +| ----------------- | ---- | ----------- | +| `extension.WithEastAsianLineBreaks` | `...extension.EastAsianLineBreaksStyle` | Soft line breaks are rendered as a newline. Some asian users will see it as an unnecessary space. With this option, soft line breaks between east asian wide characters will be ignored. This defaults to `EastAsianLineBreaksStyleSimple`. | +| `extension.WithEscapedSpace` | `-` | Without spaces around an emphasis started with east asian punctuations, it is not interpreted as an emphasis(as defined in CommonMark spec). With this option, you can avoid this inconvenient behavior by putting 'not rendered' spaces around an emphasis like `太郎は\ **「こんにちわ」**\ といった`. | + +#### Styles of Line Breaking + +| Style | Description | +| ----- | ----------- | +| `EastAsianLineBreaksStyleSimple` | Soft line breaks are ignored if both sides of the break are east asian wide character. This behavior is the same as [`east_asian_line_breaks`](https://pandoc.org/MANUAL.html#extension-east_asian_line_breaks) in Pandoc. | +| `EastAsianLineBreaksCSS3Draft` | This option implements CSS text level3 [Segment Break Transformation Rules](https://drafts.csswg.org/css-text-3/#line-break-transform) with [some enhancements](https://github.com/w3c/csswg-drafts/issues/5086). | + +#### Example of `EastAsianLineBreaksStyleSimple` + +Input Markdown: + +```md +私はプログラマーです。 +東京の会社に勤めています。 +GoでWebアプリケーションを開発しています。 +``` + +Output: + +```html +

私はプログラマーです。東京の会社に勤めています。\nGoでWebアプリケーションを開発しています。

+``` + +#### Example of `EastAsianLineBreaksCSS3Draft` + +Input Markdown: + +```md +私はプログラマーです。 +東京の会社に勤めています。 +GoでWebアプリケーションを開発しています。 +``` + +Output: + +```html +

私はプログラマーです。東京の会社に勤めています。GoでWebアプリケーションを開発しています。

+``` + +Security +-------------------- +By default, goldmark does not render raw HTML or potentially-dangerous URLs. +If you need to gain more control over untrusted contents, it is recommended that you +use an HTML sanitizer such as [bluemonday](https://github.com/microcosm-cc/bluemonday). + +Benchmark +-------------------- +You can run this benchmark in the `_benchmark` directory. + +### against other golang libraries + +blackfriday v2 seems to be the fastest, but as it is not CommonMark compliant, its performance cannot be directly compared to that of the CommonMark-compliant libraries. + +goldmark, meanwhile, builds a clean, extensible AST structure, achieves full compliance with +CommonMark, and consumes less memory, all while being reasonably fast. + +- MBP 2019 13″(i5, 16GB), Go1.17 + +``` +BenchmarkMarkdown/Blackfriday-v2-8 302 3743747 ns/op 3290445 B/op 20050 allocs/op +BenchmarkMarkdown/GoldMark-8 280 4200974 ns/op 2559738 B/op 13435 allocs/op +BenchmarkMarkdown/CommonMark-8 226 5283686 ns/op 2702490 B/op 20792 allocs/op +BenchmarkMarkdown/Lute-8 12 92652857 ns/op 10602649 B/op 40555 allocs/op +BenchmarkMarkdown/GoMarkdown-8 13 81380167 ns/op 2245002 B/op 22889 allocs/op +``` + +### against cmark (CommonMark reference implementation written in C) + +- MBP 2019 13″(i5, 16GB), Go1.17 + +``` +----------- cmark ----------- +file: _data.md +iteration: 50 +average: 0.0044073057 sec +------- goldmark ------- +file: _data.md +iteration: 50 +average: 0.0041611990 sec +``` + +As you can see, goldmark's performance is on par with cmark's. + +Extensions +-------------------- +### List of extensions + +- [goldmark-meta](https://github.com/yuin/goldmark-meta): A YAML metadata + extension for the goldmark Markdown parser. +- [goldmark-highlighting](https://github.com/yuin/goldmark-highlighting): A syntax-highlighting extension + for the goldmark markdown parser. +- [goldmark-emoji](https://github.com/yuin/goldmark-emoji): An emoji + extension for the goldmark Markdown parser. +- [goldmark-mathjax](https://github.com/litao91/goldmark-mathjax): Mathjax support for the goldmark markdown parser +- [goldmark-pdf](https://github.com/stephenafamo/goldmark-pdf): A PDF renderer that can be passed to `goldmark.WithRenderer()`. +- [goldmark-hashtag](https://github.com/abhinav/goldmark-hashtag): Adds support for `#hashtag`-based tagging to goldmark. +- [goldmark-wikilink](https://github.com/abhinav/goldmark-wikilink): Adds support for `[[wiki]]`-style links to goldmark. +- [goldmark-anchor](https://github.com/abhinav/goldmark-anchor): Adds anchors (permalinks) next to all headers in a document. +- [goldmark-figure](https://github.com/mangoumbrella/goldmark-figure): Adds support for rendering paragraphs starting with an image to `
` elements. +- [goldmark-frontmatter](https://github.com/abhinav/goldmark-frontmatter): Adds support for YAML, TOML, and custom front matter to documents. +- [goldmark-toc](https://github.com/abhinav/goldmark-toc): Adds support for generating tables-of-contents for goldmark documents. +- [goldmark-mermaid](https://github.com/abhinav/goldmark-mermaid): Adds support for rendering [Mermaid](https://mermaid-js.github.io/mermaid/) diagrams in goldmark documents. +- [goldmark-pikchr](https://github.com/jchenry/goldmark-pikchr): Adds support for rendering [Pikchr](https://pikchr.org/home/doc/trunk/homepage.md) diagrams in goldmark documents. +- [goldmark-embed](https://github.com/13rac1/goldmark-embed): Adds support for rendering embeds from YouTube links. +- [goldmark-latex](https://github.com/soypat/goldmark-latex): A $\LaTeX$ renderer that can be passed to `goldmark.WithRenderer()`. +- [goldmark-fences](https://github.com/stefanfritsch/goldmark-fences): Support for pandoc-style [fenced divs](https://pandoc.org/MANUAL.html#divs-and-spans) in goldmark. +- [goldmark-d2](https://github.com/FurqanSoftware/goldmark-d2): Adds support for [D2](https://d2lang.com/) diagrams. +- [goldmark-katex](https://github.com/FurqanSoftware/goldmark-katex): Adds support for [KaTeX](https://katex.org/) math and equations. +- [goldmark-img64](https://github.com/tenkoh/goldmark-img64): Adds support for embedding images into the document as DataURL (base64 encoded). +- [goldmark-enclave](https://github.com/quail-ink/goldmark-enclave): Adds support for embedding youtube/bilibili video, X's [oembed tweet](https://publish.twitter.com/), [tradingview](https://www.tradingview.com/widget/)'s chart, [quail](https://quail.ink)'s widget into the document. +- [goldmark-wiki-table](https://github.com/movsb/goldmark-wiki-table): Adds support for embedding Wiki Tables. +- [goldmark-tgmd](https://github.com/Mad-Pixels/goldmark-tgmd): A Telegram markdown renderer that can be passed to `goldmark.WithRenderer()`. + +### Loading extensions at runtime +[goldmark-dynamic](https://github.com/yuin/goldmark-dynamic) allows you to write a goldmark extension in Lua and load it at runtime without re-compilation. + +Please refer to [goldmark-dynamic](https://github.com/yuin/goldmark-dynamic) for details. + + +goldmark internal(for extension developers) +---------------------------------------------- +### Overview +goldmark's Markdown processing is outlined in the diagram below. + +``` + + | + V + +-------- parser.Parser --------------------------- + | 1. Parse block elements into AST + | 1. If a parsed block is a paragraph, apply + | ast.ParagraphTransformer + | 2. Traverse AST and parse blocks. + | 1. Process delimiters(emphasis) at the end of + | block parsing + | 3. Apply parser.ASTTransformers to AST + | + V + + | + V + +------- renderer.Renderer ------------------------ + | 1. Traverse AST and apply renderer.NodeRenderer + | corespond to the node type + + | + V + +``` + +### Parsing +Markdown documents are read through `text.Reader` interface. + +AST nodes do not have concrete text. AST nodes have segment information of the documents, represented by `text.Segment` . + +`text.Segment` has 3 attributes: `Start`, `End`, `Padding` . + +(TBC) + +**TODO** + +See `extension` directory for examples of extensions. + +Summary: + +1. Define AST Node as a struct in which `ast.BaseBlock` or `ast.BaseInline` is embedded. +2. Write a parser that implements `parser.BlockParser` or `parser.InlineParser`. +3. Write a renderer that implements `renderer.NodeRenderer`. +4. Define your goldmark extension that implements `goldmark.Extender`. + + +Donation +-------------------- +BTC: 1NEDSyUmo4SMTDP83JJQSWi1MvQUGGNMZB + +License +-------------------- +MIT + +Author +-------------------- +Yusuke Inuzuka diff --git a/vendor/github.com/yuin/goldmark/ast/ast.go b/vendor/github.com/yuin/goldmark/ast/ast.go new file mode 100644 index 0000000..67bb0da --- /dev/null +++ b/vendor/github.com/yuin/goldmark/ast/ast.go @@ -0,0 +1,508 @@ +// Package ast defines AST nodes that represent markdown elements. +package ast + +import ( + "bytes" + "fmt" + "strings" + + textm "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +// A NodeType indicates what type a node belongs to. +type NodeType int + +const ( + // TypeBlock indicates that a node is kind of block nodes. + TypeBlock NodeType = iota + 1 + // TypeInline indicates that a node is kind of inline nodes. + TypeInline + // TypeDocument indicates that a node is kind of document nodes. + TypeDocument +) + +// NodeKind indicates more specific type than NodeType. +type NodeKind int + +func (k NodeKind) String() string { + return kindNames[k] +} + +var kindMax NodeKind +var kindNames = []string{""} + +// NewNodeKind returns a new Kind value. +func NewNodeKind(name string) NodeKind { + kindMax++ + kindNames = append(kindNames, name) + return kindMax +} + +// An Attribute is an attribute of the Node. +type Attribute struct { + Name []byte + Value interface{} +} + +// A Node interface defines basic AST node functionalities. +type Node interface { + // Type returns a type of this node. + Type() NodeType + + // Kind returns a kind of this node. + Kind() NodeKind + + // NextSibling returns a next sibling node of this node. + NextSibling() Node + + // PreviousSibling returns a previous sibling node of this node. + PreviousSibling() Node + + // Parent returns a parent node of this node. + Parent() Node + + // SetParent sets a parent node to this node. + SetParent(Node) + + // SetPreviousSibling sets a previous sibling node to this node. + SetPreviousSibling(Node) + + // SetNextSibling sets a next sibling node to this node. + SetNextSibling(Node) + + // HasChildren returns true if this node has any children, otherwise false. + HasChildren() bool + + // ChildCount returns a total number of children. + ChildCount() int + + // FirstChild returns a first child of this node. + FirstChild() Node + + // LastChild returns a last child of this node. + LastChild() Node + + // AppendChild append a node child to the tail of the children. + AppendChild(self, child Node) + + // RemoveChild removes a node child from this node. + // If a node child is not children of this node, RemoveChild nothing to do. + RemoveChild(self, child Node) + + // RemoveChildren removes all children from this node. + RemoveChildren(self Node) + + // SortChildren sorts childrens by comparator. + SortChildren(comparator func(n1, n2 Node) int) + + // ReplaceChild replace a node v1 with a node insertee. + // If v1 is not children of this node, ReplaceChild append a insetee to the + // tail of the children. + ReplaceChild(self, v1, insertee Node) + + // InsertBefore inserts a node insertee before a node v1. + // If v1 is not children of this node, InsertBefore append a insetee to the + // tail of the children. + InsertBefore(self, v1, insertee Node) + + // InsertAfterinserts a node insertee after a node v1. + // If v1 is not children of this node, InsertBefore append a insetee to the + // tail of the children. + InsertAfter(self, v1, insertee Node) + + // OwnerDocument returns this node's owner document. + // If this node is not a child of the Document node, OwnerDocument + // returns nil. + OwnerDocument() *Document + + // Dump dumps an AST tree structure to stdout. + // This function completely aimed for debugging. + // level is a indent level. Implementer should indent informations with + // 2 * level spaces. + Dump(source []byte, level int) + + // Text returns text values of this node. + Text(source []byte) []byte + + // HasBlankPreviousLines returns true if the row before this node is blank, + // otherwise false. + // This method is valid only for block nodes. + HasBlankPreviousLines() bool + + // SetBlankPreviousLines sets whether the row before this node is blank. + // This method is valid only for block nodes. + SetBlankPreviousLines(v bool) + + // Lines returns text segments that hold positions in a source. + // This method is valid only for block nodes. + Lines() *textm.Segments + + // SetLines sets text segments that hold positions in a source. + // This method is valid only for block nodes. + SetLines(*textm.Segments) + + // IsRaw returns true if contents should be rendered as 'raw' contents. + IsRaw() bool + + // SetAttribute sets the given value to the attributes. + SetAttribute(name []byte, value interface{}) + + // SetAttributeString sets the given value to the attributes. + SetAttributeString(name string, value interface{}) + + // Attribute returns a (attribute value, true) if an attribute + // associated with the given name is found, otherwise + // (nil, false) + Attribute(name []byte) (interface{}, bool) + + // AttributeString returns a (attribute value, true) if an attribute + // associated with the given name is found, otherwise + // (nil, false) + AttributeString(name string) (interface{}, bool) + + // Attributes returns a list of attributes. + // This may be a nil if there are no attributes. + Attributes() []Attribute + + // RemoveAttributes removes all attributes from this node. + RemoveAttributes() +} + +// A BaseNode struct implements the Node interface partialliy. +type BaseNode struct { + firstChild Node + lastChild Node + parent Node + next Node + prev Node + childCount int + attributes []Attribute +} + +func ensureIsolated(v Node) { + if p := v.Parent(); p != nil { + p.RemoveChild(p, v) + } +} + +// HasChildren implements Node.HasChildren . +func (n *BaseNode) HasChildren() bool { + return n.firstChild != nil +} + +// SetPreviousSibling implements Node.SetPreviousSibling . +func (n *BaseNode) SetPreviousSibling(v Node) { + n.prev = v +} + +// SetNextSibling implements Node.SetNextSibling . +func (n *BaseNode) SetNextSibling(v Node) { + n.next = v +} + +// PreviousSibling implements Node.PreviousSibling . +func (n *BaseNode) PreviousSibling() Node { + return n.prev +} + +// NextSibling implements Node.NextSibling . +func (n *BaseNode) NextSibling() Node { + return n.next +} + +// RemoveChild implements Node.RemoveChild . +func (n *BaseNode) RemoveChild(self, v Node) { + if v.Parent() != self { + return + } + n.childCount-- + prev := v.PreviousSibling() + next := v.NextSibling() + if prev != nil { + prev.SetNextSibling(next) + } else { + n.firstChild = next + } + if next != nil { + next.SetPreviousSibling(prev) + } else { + n.lastChild = prev + } + v.SetParent(nil) + v.SetPreviousSibling(nil) + v.SetNextSibling(nil) +} + +// RemoveChildren implements Node.RemoveChildren . +func (n *BaseNode) RemoveChildren(self Node) { + for c := n.firstChild; c != nil; { + c.SetParent(nil) + c.SetPreviousSibling(nil) + next := c.NextSibling() + c.SetNextSibling(nil) + c = next + } + n.firstChild = nil + n.lastChild = nil + n.childCount = 0 +} + +// SortChildren implements Node.SortChildren. +func (n *BaseNode) SortChildren(comparator func(n1, n2 Node) int) { + var sorted Node + current := n.firstChild + for current != nil { + next := current.NextSibling() + if sorted == nil || comparator(sorted, current) >= 0 { + current.SetNextSibling(sorted) + if sorted != nil { + sorted.SetPreviousSibling(current) + } + sorted = current + sorted.SetPreviousSibling(nil) + } else { + c := sorted + for c.NextSibling() != nil && comparator(c.NextSibling(), current) < 0 { + c = c.NextSibling() + } + current.SetNextSibling(c.NextSibling()) + current.SetPreviousSibling(c) + if c.NextSibling() != nil { + c.NextSibling().SetPreviousSibling(current) + } + c.SetNextSibling(current) + } + current = next + } + n.firstChild = sorted + for c := n.firstChild; c != nil; c = c.NextSibling() { + n.lastChild = c + } +} + +// FirstChild implements Node.FirstChild . +func (n *BaseNode) FirstChild() Node { + return n.firstChild +} + +// LastChild implements Node.LastChild . +func (n *BaseNode) LastChild() Node { + return n.lastChild +} + +// ChildCount implements Node.ChildCount . +func (n *BaseNode) ChildCount() int { + return n.childCount +} + +// Parent implements Node.Parent . +func (n *BaseNode) Parent() Node { + return n.parent +} + +// SetParent implements Node.SetParent . +func (n *BaseNode) SetParent(v Node) { + n.parent = v +} + +// AppendChild implements Node.AppendChild . +func (n *BaseNode) AppendChild(self, v Node) { + ensureIsolated(v) + if n.firstChild == nil { + n.firstChild = v + v.SetNextSibling(nil) + v.SetPreviousSibling(nil) + } else { + last := n.lastChild + last.SetNextSibling(v) + v.SetPreviousSibling(last) + } + v.SetParent(self) + n.lastChild = v + n.childCount++ +} + +// ReplaceChild implements Node.ReplaceChild . +func (n *BaseNode) ReplaceChild(self, v1, insertee Node) { + n.InsertBefore(self, v1, insertee) + n.RemoveChild(self, v1) +} + +// InsertAfter implements Node.InsertAfter . +func (n *BaseNode) InsertAfter(self, v1, insertee Node) { + n.InsertBefore(self, v1.NextSibling(), insertee) +} + +// InsertBefore implements Node.InsertBefore . +func (n *BaseNode) InsertBefore(self, v1, insertee Node) { + n.childCount++ + if v1 == nil { + n.AppendChild(self, insertee) + return + } + ensureIsolated(insertee) + if v1.Parent() == self { + c := v1 + prev := c.PreviousSibling() + if prev != nil { + prev.SetNextSibling(insertee) + insertee.SetPreviousSibling(prev) + } else { + n.firstChild = insertee + insertee.SetPreviousSibling(nil) + } + insertee.SetNextSibling(c) + c.SetPreviousSibling(insertee) + insertee.SetParent(self) + } +} + +// OwnerDocument implements Node.OwnerDocument. +func (n *BaseNode) OwnerDocument() *Document { + d := n.Parent() + for { + p := d.Parent() + if p == nil { + if v, ok := d.(*Document); ok { + return v + } + break + } + d = p + } + return nil +} + +// Text implements Node.Text . +func (n *BaseNode) Text(source []byte) []byte { + var buf bytes.Buffer + for c := n.firstChild; c != nil; c = c.NextSibling() { + buf.Write(c.Text(source)) + } + return buf.Bytes() +} + +// SetAttribute implements Node.SetAttribute. +func (n *BaseNode) SetAttribute(name []byte, value interface{}) { + if n.attributes == nil { + n.attributes = make([]Attribute, 0, 10) + } else { + for i, a := range n.attributes { + if bytes.Equal(a.Name, name) { + n.attributes[i].Name = name + n.attributes[i].Value = value + return + } + } + } + n.attributes = append(n.attributes, Attribute{name, value}) +} + +// SetAttributeString implements Node.SetAttributeString. +func (n *BaseNode) SetAttributeString(name string, value interface{}) { + n.SetAttribute(util.StringToReadOnlyBytes(name), value) +} + +// Attribute implements Node.Attribute. +func (n *BaseNode) Attribute(name []byte) (interface{}, bool) { + if n.attributes == nil { + return nil, false + } + for i, a := range n.attributes { + if bytes.Equal(a.Name, name) { + return n.attributes[i].Value, true + } + } + return nil, false +} + +// AttributeString implements Node.AttributeString. +func (n *BaseNode) AttributeString(s string) (interface{}, bool) { + return n.Attribute(util.StringToReadOnlyBytes(s)) +} + +// Attributes implements Node.Attributes. +func (n *BaseNode) Attributes() []Attribute { + return n.attributes +} + +// RemoveAttributes implements Node.RemoveAttributes. +func (n *BaseNode) RemoveAttributes() { + n.attributes = nil +} + +// DumpHelper is a helper function to implement Node.Dump. +// kv is pairs of an attribute name and an attribute value. +// cb is a function called after wrote a name and attributes. +func DumpHelper(v Node, source []byte, level int, kv map[string]string, cb func(int)) { + name := v.Kind().String() + indent := strings.Repeat(" ", level) + fmt.Printf("%s%s {\n", indent, name) + indent2 := strings.Repeat(" ", level+1) + if v.Type() == TypeBlock { + fmt.Printf("%sRawText: \"", indent2) + for i := 0; i < v.Lines().Len(); i++ { + line := v.Lines().At(i) + fmt.Printf("%s", line.Value(source)) + } + fmt.Printf("\"\n") + fmt.Printf("%sHasBlankPreviousLines: %v\n", indent2, v.HasBlankPreviousLines()) + } + for name, value := range kv { + fmt.Printf("%s%s: %s\n", indent2, name, value) + } + if cb != nil { + cb(level + 1) + } + for c := v.FirstChild(); c != nil; c = c.NextSibling() { + c.Dump(source, level+1) + } + fmt.Printf("%s}\n", indent) +} + +// WalkStatus represents a current status of the Walk function. +type WalkStatus int + +const ( + // WalkStop indicates no more walking needed. + WalkStop WalkStatus = iota + 1 + + // WalkSkipChildren indicates that Walk wont walk on children of current + // node. + WalkSkipChildren + + // WalkContinue indicates that Walk can continue to walk. + WalkContinue +) + +// Walker is a function that will be called when Walk find a +// new node. +// entering is set true before walks children, false after walked children. +// If Walker returns error, Walk function immediately stop walking. +type Walker func(n Node, entering bool) (WalkStatus, error) + +// Walk walks a AST tree by the depth first search algorithm. +func Walk(n Node, walker Walker) error { + _, err := walkHelper(n, walker) + return err +} + +func walkHelper(n Node, walker Walker) (WalkStatus, error) { + status, err := walker(n, true) + if err != nil || status == WalkStop { + return status, err + } + if status != WalkSkipChildren { + for c := n.FirstChild(); c != nil; c = c.NextSibling() { + if st, err := walkHelper(c, walker); err != nil || st == WalkStop { + return WalkStop, err + } + } + } + status, err = walker(n, false) + if err != nil || status == WalkStop { + return WalkStop, err + } + return WalkContinue, nil +} diff --git a/vendor/github.com/yuin/goldmark/ast/block.go b/vendor/github.com/yuin/goldmark/ast/block.go new file mode 100644 index 0000000..c5d4738 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/ast/block.go @@ -0,0 +1,508 @@ +package ast + +import ( + "fmt" + "strings" + + textm "github.com/yuin/goldmark/text" +) + +// A BaseBlock struct implements the Node interface partialliy. +type BaseBlock struct { + BaseNode + blankPreviousLines bool + lines *textm.Segments +} + +// Type implements Node.Type. +func (b *BaseBlock) Type() NodeType { + return TypeBlock +} + +// IsRaw implements Node.IsRaw. +func (b *BaseBlock) IsRaw() bool { + return false +} + +// HasBlankPreviousLines implements Node.HasBlankPreviousLines. +func (b *BaseBlock) HasBlankPreviousLines() bool { + return b.blankPreviousLines +} + +// SetBlankPreviousLines implements Node.SetBlankPreviousLines. +func (b *BaseBlock) SetBlankPreviousLines(v bool) { + b.blankPreviousLines = v +} + +// Lines implements Node.Lines. +func (b *BaseBlock) Lines() *textm.Segments { + if b.lines == nil { + b.lines = textm.NewSegments() + } + return b.lines +} + +// SetLines implements Node.SetLines. +func (b *BaseBlock) SetLines(v *textm.Segments) { + b.lines = v +} + +// A Document struct is a root node of Markdown text. +type Document struct { + BaseBlock + + meta map[string]interface{} +} + +// KindDocument is a NodeKind of the Document node. +var KindDocument = NewNodeKind("Document") + +// Dump implements Node.Dump . +func (n *Document) Dump(source []byte, level int) { + DumpHelper(n, source, level, nil, nil) +} + +// Type implements Node.Type . +func (n *Document) Type() NodeType { + return TypeDocument +} + +// Kind implements Node.Kind. +func (n *Document) Kind() NodeKind { + return KindDocument +} + +// OwnerDocument implements Node.OwnerDocument. +func (n *Document) OwnerDocument() *Document { + return n +} + +// Meta returns metadata of this document. +func (n *Document) Meta() map[string]interface{} { + if n.meta == nil { + n.meta = map[string]interface{}{} + } + return n.meta +} + +// SetMeta sets given metadata to this document. +func (n *Document) SetMeta(meta map[string]interface{}) { + if n.meta == nil { + n.meta = map[string]interface{}{} + } + for k, v := range meta { + n.meta[k] = v + } +} + +// AddMeta adds given metadata to this document. +func (n *Document) AddMeta(key string, value interface{}) { + if n.meta == nil { + n.meta = map[string]interface{}{} + } + n.meta[key] = value +} + +// NewDocument returns a new Document node. +func NewDocument() *Document { + return &Document{ + BaseBlock: BaseBlock{}, + meta: nil, + } +} + +// A TextBlock struct is a node whose lines +// should be rendered without any containers. +type TextBlock struct { + BaseBlock +} + +// Dump implements Node.Dump . +func (n *TextBlock) Dump(source []byte, level int) { + DumpHelper(n, source, level, nil, nil) +} + +// KindTextBlock is a NodeKind of the TextBlock node. +var KindTextBlock = NewNodeKind("TextBlock") + +// Kind implements Node.Kind. +func (n *TextBlock) Kind() NodeKind { + return KindTextBlock +} + +// NewTextBlock returns a new TextBlock node. +func NewTextBlock() *TextBlock { + return &TextBlock{ + BaseBlock: BaseBlock{}, + } +} + +// A Paragraph struct represents a paragraph of Markdown text. +type Paragraph struct { + BaseBlock +} + +// Dump implements Node.Dump . +func (n *Paragraph) Dump(source []byte, level int) { + DumpHelper(n, source, level, nil, nil) +} + +// KindParagraph is a NodeKind of the Paragraph node. +var KindParagraph = NewNodeKind("Paragraph") + +// Kind implements Node.Kind. +func (n *Paragraph) Kind() NodeKind { + return KindParagraph +} + +// NewParagraph returns a new Paragraph node. +func NewParagraph() *Paragraph { + return &Paragraph{ + BaseBlock: BaseBlock{}, + } +} + +// IsParagraph returns true if the given node implements the Paragraph interface, +// otherwise false. +func IsParagraph(node Node) bool { + _, ok := node.(*Paragraph) + return ok +} + +// A Heading struct represents headings like SetextHeading and ATXHeading. +type Heading struct { + BaseBlock + // Level returns a level of this heading. + // This value is between 1 and 6. + Level int +} + +// Dump implements Node.Dump . +func (n *Heading) Dump(source []byte, level int) { + m := map[string]string{ + "Level": fmt.Sprintf("%d", n.Level), + } + DumpHelper(n, source, level, m, nil) +} + +// KindHeading is a NodeKind of the Heading node. +var KindHeading = NewNodeKind("Heading") + +// Kind implements Node.Kind. +func (n *Heading) Kind() NodeKind { + return KindHeading +} + +// NewHeading returns a new Heading node. +func NewHeading(level int) *Heading { + return &Heading{ + BaseBlock: BaseBlock{}, + Level: level, + } +} + +// A ThematicBreak struct represents a thematic break of Markdown text. +type ThematicBreak struct { + BaseBlock +} + +// Dump implements Node.Dump . +func (n *ThematicBreak) Dump(source []byte, level int) { + DumpHelper(n, source, level, nil, nil) +} + +// KindThematicBreak is a NodeKind of the ThematicBreak node. +var KindThematicBreak = NewNodeKind("ThematicBreak") + +// Kind implements Node.Kind. +func (n *ThematicBreak) Kind() NodeKind { + return KindThematicBreak +} + +// NewThematicBreak returns a new ThematicBreak node. +func NewThematicBreak() *ThematicBreak { + return &ThematicBreak{ + BaseBlock: BaseBlock{}, + } +} + +// A CodeBlock interface represents an indented code block of Markdown text. +type CodeBlock struct { + BaseBlock +} + +// IsRaw implements Node.IsRaw. +func (n *CodeBlock) IsRaw() bool { + return true +} + +// Dump implements Node.Dump . +func (n *CodeBlock) Dump(source []byte, level int) { + DumpHelper(n, source, level, nil, nil) +} + +// KindCodeBlock is a NodeKind of the CodeBlock node. +var KindCodeBlock = NewNodeKind("CodeBlock") + +// Kind implements Node.Kind. +func (n *CodeBlock) Kind() NodeKind { + return KindCodeBlock +} + +// NewCodeBlock returns a new CodeBlock node. +func NewCodeBlock() *CodeBlock { + return &CodeBlock{ + BaseBlock: BaseBlock{}, + } +} + +// A FencedCodeBlock struct represents a fenced code block of Markdown text. +type FencedCodeBlock struct { + BaseBlock + // Info returns a info text of this fenced code block. + Info *Text + + language []byte +} + +// Language returns an language in an info string. +// Language returns nil if this node does not have an info string. +func (n *FencedCodeBlock) Language(source []byte) []byte { + if n.language == nil && n.Info != nil { + segment := n.Info.Segment + info := segment.Value(source) + i := 0 + for ; i < len(info); i++ { + if info[i] == ' ' { + break + } + } + n.language = info[:i] + } + return n.language +} + +// IsRaw implements Node.IsRaw. +func (n *FencedCodeBlock) IsRaw() bool { + return true +} + +// Dump implements Node.Dump . +func (n *FencedCodeBlock) Dump(source []byte, level int) { + m := map[string]string{} + if n.Info != nil { + m["Info"] = fmt.Sprintf("\"%s\"", n.Info.Text(source)) + } + DumpHelper(n, source, level, m, nil) +} + +// KindFencedCodeBlock is a NodeKind of the FencedCodeBlock node. +var KindFencedCodeBlock = NewNodeKind("FencedCodeBlock") + +// Kind implements Node.Kind. +func (n *FencedCodeBlock) Kind() NodeKind { + return KindFencedCodeBlock +} + +// NewFencedCodeBlock return a new FencedCodeBlock node. +func NewFencedCodeBlock(info *Text) *FencedCodeBlock { + return &FencedCodeBlock{ + BaseBlock: BaseBlock{}, + Info: info, + } +} + +// A Blockquote struct represents an blockquote block of Markdown text. +type Blockquote struct { + BaseBlock +} + +// Dump implements Node.Dump . +func (n *Blockquote) Dump(source []byte, level int) { + DumpHelper(n, source, level, nil, nil) +} + +// KindBlockquote is a NodeKind of the Blockquote node. +var KindBlockquote = NewNodeKind("Blockquote") + +// Kind implements Node.Kind. +func (n *Blockquote) Kind() NodeKind { + return KindBlockquote +} + +// NewBlockquote returns a new Blockquote node. +func NewBlockquote() *Blockquote { + return &Blockquote{ + BaseBlock: BaseBlock{}, + } +} + +// A List struct represents a list of Markdown text. +type List struct { + BaseBlock + + // Marker is a marker character like '-', '+', ')' and '.'. + Marker byte + + // IsTight is a true if this list is a 'tight' list. + // See https://spec.commonmark.org/0.30/#loose for details. + IsTight bool + + // Start is an initial number of this ordered list. + // If this list is not an ordered list, Start is 0. + Start int +} + +// IsOrdered returns true if this list is an ordered list, otherwise false. +func (l *List) IsOrdered() bool { + return l.Marker == '.' || l.Marker == ')' +} + +// CanContinue returns true if this list can continue with +// the given mark and a list type, otherwise false. +func (l *List) CanContinue(marker byte, isOrdered bool) bool { + return marker == l.Marker && isOrdered == l.IsOrdered() +} + +// Dump implements Node.Dump. +func (l *List) Dump(source []byte, level int) { + m := map[string]string{ + "Ordered": fmt.Sprintf("%v", l.IsOrdered()), + "Marker": fmt.Sprintf("%c", l.Marker), + "Tight": fmt.Sprintf("%v", l.IsTight), + } + if l.IsOrdered() { + m["Start"] = fmt.Sprintf("%d", l.Start) + } + DumpHelper(l, source, level, m, nil) +} + +// KindList is a NodeKind of the List node. +var KindList = NewNodeKind("List") + +// Kind implements Node.Kind. +func (l *List) Kind() NodeKind { + return KindList +} + +// NewList returns a new List node. +func NewList(marker byte) *List { + return &List{ + BaseBlock: BaseBlock{}, + Marker: marker, + IsTight: true, + } +} + +// A ListItem struct represents a list item of Markdown text. +type ListItem struct { + BaseBlock + + // Offset is an offset position of this item. + Offset int +} + +// Dump implements Node.Dump. +func (n *ListItem) Dump(source []byte, level int) { + m := map[string]string{ + "Offset": fmt.Sprintf("%d", n.Offset), + } + DumpHelper(n, source, level, m, nil) +} + +// KindListItem is a NodeKind of the ListItem node. +var KindListItem = NewNodeKind("ListItem") + +// Kind implements Node.Kind. +func (n *ListItem) Kind() NodeKind { + return KindListItem +} + +// NewListItem returns a new ListItem node. +func NewListItem(offset int) *ListItem { + return &ListItem{ + BaseBlock: BaseBlock{}, + Offset: offset, + } +} + +// HTMLBlockType represents kinds of an html blocks. +// See https://spec.commonmark.org/0.30/#html-blocks +type HTMLBlockType int + +const ( + // HTMLBlockType1 represents type 1 html blocks. + HTMLBlockType1 HTMLBlockType = iota + 1 + // HTMLBlockType2 represents type 2 html blocks. + HTMLBlockType2 + // HTMLBlockType3 represents type 3 html blocks. + HTMLBlockType3 + // HTMLBlockType4 represents type 4 html blocks. + HTMLBlockType4 + // HTMLBlockType5 represents type 5 html blocks. + HTMLBlockType5 + // HTMLBlockType6 represents type 6 html blocks. + HTMLBlockType6 + // HTMLBlockType7 represents type 7 html blocks. + HTMLBlockType7 +) + +// An HTMLBlock struct represents an html block of Markdown text. +type HTMLBlock struct { + BaseBlock + + // Type is a type of this html block. + HTMLBlockType HTMLBlockType + + // ClosureLine is a line that closes this html block. + ClosureLine textm.Segment +} + +// IsRaw implements Node.IsRaw. +func (n *HTMLBlock) IsRaw() bool { + return true +} + +// HasClosure returns true if this html block has a closure line, +// otherwise false. +func (n *HTMLBlock) HasClosure() bool { + return n.ClosureLine.Start >= 0 +} + +// Dump implements Node.Dump. +func (n *HTMLBlock) Dump(source []byte, level int) { + indent := strings.Repeat(" ", level) + fmt.Printf("%s%s {\n", indent, "HTMLBlock") + indent2 := strings.Repeat(" ", level+1) + fmt.Printf("%sRawText: \"", indent2) + for i := 0; i < n.Lines().Len(); i++ { + s := n.Lines().At(i) + fmt.Print(string(source[s.Start:s.Stop])) + } + fmt.Printf("\"\n") + for c := n.FirstChild(); c != nil; c = c.NextSibling() { + c.Dump(source, level+1) + } + if n.HasClosure() { + cl := n.ClosureLine + fmt.Printf("%sClosure: \"%s\"\n", indent2, string(cl.Value(source))) + } + fmt.Printf("%s}\n", indent) +} + +// KindHTMLBlock is a NodeKind of the HTMLBlock node. +var KindHTMLBlock = NewNodeKind("HTMLBlock") + +// Kind implements Node.Kind. +func (n *HTMLBlock) Kind() NodeKind { + return KindHTMLBlock +} + +// NewHTMLBlock returns a new HTMLBlock node. +func NewHTMLBlock(typ HTMLBlockType) *HTMLBlock { + return &HTMLBlock{ + BaseBlock: BaseBlock{}, + HTMLBlockType: typ, + ClosureLine: textm.NewSegment(-1, -1), + } +} diff --git a/vendor/github.com/yuin/goldmark/ast/inline.go b/vendor/github.com/yuin/goldmark/ast/inline.go new file mode 100644 index 0000000..7e4c51f --- /dev/null +++ b/vendor/github.com/yuin/goldmark/ast/inline.go @@ -0,0 +1,549 @@ +package ast + +import ( + "fmt" + "strings" + + textm "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +// A BaseInline struct implements the Node interface partialliy. +type BaseInline struct { + BaseNode +} + +// Type implements Node.Type. +func (b *BaseInline) Type() NodeType { + return TypeInline +} + +// IsRaw implements Node.IsRaw. +func (b *BaseInline) IsRaw() bool { + return false +} + +// HasBlankPreviousLines implements Node.HasBlankPreviousLines. +func (b *BaseInline) HasBlankPreviousLines() bool { + panic("can not call with inline nodes.") +} + +// SetBlankPreviousLines implements Node.SetBlankPreviousLines. +func (b *BaseInline) SetBlankPreviousLines(v bool) { + panic("can not call with inline nodes.") +} + +// Lines implements Node.Lines. +func (b *BaseInline) Lines() *textm.Segments { + panic("can not call with inline nodes.") +} + +// SetLines implements Node.SetLines. +func (b *BaseInline) SetLines(v *textm.Segments) { + panic("can not call with inline nodes.") +} + +// A Text struct represents a textual content of the Markdown text. +type Text struct { + BaseInline + // Segment is a position in a source text. + Segment textm.Segment + + flags uint8 +} + +const ( + textSoftLineBreak = 1 << iota + textHardLineBreak + textRaw + textCode +) + +func textFlagsString(flags uint8) string { + buf := []string{} + if flags&textSoftLineBreak != 0 { + buf = append(buf, "SoftLineBreak") + } + if flags&textHardLineBreak != 0 { + buf = append(buf, "HardLineBreak") + } + if flags&textRaw != 0 { + buf = append(buf, "Raw") + } + if flags&textCode != 0 { + buf = append(buf, "Code") + } + return strings.Join(buf, ", ") +} + +// Inline implements Inline.Inline. +func (n *Text) Inline() { +} + +// SoftLineBreak returns true if this node ends with a new line, +// otherwise false. +func (n *Text) SoftLineBreak() bool { + return n.flags&textSoftLineBreak != 0 +} + +// SetSoftLineBreak sets whether this node ends with a new line. +func (n *Text) SetSoftLineBreak(v bool) { + if v { + n.flags |= textSoftLineBreak + } else { + n.flags = n.flags &^ textSoftLineBreak + } +} + +// IsRaw returns true if this text should be rendered without unescaping +// back slash escapes and resolving references. +func (n *Text) IsRaw() bool { + return n.flags&textRaw != 0 +} + +// SetRaw sets whether this text should be rendered as raw contents. +func (n *Text) SetRaw(v bool) { + if v { + n.flags |= textRaw + } else { + n.flags = n.flags &^ textRaw + } +} + +// HardLineBreak returns true if this node ends with a hard line break. +// See https://spec.commonmark.org/0.30/#hard-line-breaks for details. +func (n *Text) HardLineBreak() bool { + return n.flags&textHardLineBreak != 0 +} + +// SetHardLineBreak sets whether this node ends with a hard line break. +func (n *Text) SetHardLineBreak(v bool) { + if v { + n.flags |= textHardLineBreak + } else { + n.flags = n.flags &^ textHardLineBreak + } +} + +// Merge merges a Node n into this node. +// Merge returns true if the given node has been merged, otherwise false. +func (n *Text) Merge(node Node, source []byte) bool { + t, ok := node.(*Text) + if !ok { + return false + } + if n.Segment.Stop != t.Segment.Start || t.Segment.Padding != 0 || + source[n.Segment.Stop-1] == '\n' || t.IsRaw() != n.IsRaw() { + return false + } + n.Segment.Stop = t.Segment.Stop + n.SetSoftLineBreak(t.SoftLineBreak()) + n.SetHardLineBreak(t.HardLineBreak()) + return true +} + +// Text implements Node.Text. +func (n *Text) Text(source []byte) []byte { + return n.Segment.Value(source) +} + +// Dump implements Node.Dump. +func (n *Text) Dump(source []byte, level int) { + fs := textFlagsString(n.flags) + if len(fs) != 0 { + fs = "(" + fs + ")" + } + fmt.Printf("%sText%s: \"%s\"\n", strings.Repeat(" ", level), fs, strings.TrimRight(string(n.Text(source)), "\n")) +} + +// KindText is a NodeKind of the Text node. +var KindText = NewNodeKind("Text") + +// Kind implements Node.Kind. +func (n *Text) Kind() NodeKind { + return KindText +} + +// NewText returns a new Text node. +func NewText() *Text { + return &Text{ + BaseInline: BaseInline{}, + } +} + +// NewTextSegment returns a new Text node with the given source position. +func NewTextSegment(v textm.Segment) *Text { + return &Text{ + BaseInline: BaseInline{}, + Segment: v, + } +} + +// NewRawTextSegment returns a new Text node with the given source position. +// The new node should be rendered as raw contents. +func NewRawTextSegment(v textm.Segment) *Text { + t := &Text{ + BaseInline: BaseInline{}, + Segment: v, + } + t.SetRaw(true) + return t +} + +// MergeOrAppendTextSegment merges a given s into the last child of the parent if +// it can be merged, otherwise creates a new Text node and appends it to after current +// last child. +func MergeOrAppendTextSegment(parent Node, s textm.Segment) { + last := parent.LastChild() + t, ok := last.(*Text) + if ok && t.Segment.Stop == s.Start && !t.SoftLineBreak() { + t.Segment = t.Segment.WithStop(s.Stop) + } else { + parent.AppendChild(parent, NewTextSegment(s)) + } +} + +// MergeOrReplaceTextSegment merges a given s into a previous sibling of the node n +// if a previous sibling of the node n is *Text, otherwise replaces Node n with s. +func MergeOrReplaceTextSegment(parent Node, n Node, s textm.Segment) { + prev := n.PreviousSibling() + if t, ok := prev.(*Text); ok && t.Segment.Stop == s.Start && !t.SoftLineBreak() { + t.Segment = t.Segment.WithStop(s.Stop) + parent.RemoveChild(parent, n) + } else { + parent.ReplaceChild(parent, n, NewTextSegment(s)) + } +} + +// A String struct is a textual content that has a concrete value. +type String struct { + BaseInline + + Value []byte + flags uint8 +} + +// Inline implements Inline.Inline. +func (n *String) Inline() { +} + +// IsRaw returns true if this text should be rendered without unescaping +// back slash escapes and resolving references. +func (n *String) IsRaw() bool { + return n.flags&textRaw != 0 +} + +// SetRaw sets whether this text should be rendered as raw contents. +func (n *String) SetRaw(v bool) { + if v { + n.flags |= textRaw + } else { + n.flags = n.flags &^ textRaw + } +} + +// IsCode returns true if this text should be rendered without any +// modifications. +func (n *String) IsCode() bool { + return n.flags&textCode != 0 +} + +// SetCode sets whether this text should be rendered without any modifications. +func (n *String) SetCode(v bool) { + if v { + n.flags |= textCode + } else { + n.flags = n.flags &^ textCode + } +} + +// Text implements Node.Text. +func (n *String) Text(source []byte) []byte { + return n.Value +} + +// Dump implements Node.Dump. +func (n *String) Dump(source []byte, level int) { + fs := textFlagsString(n.flags) + if len(fs) != 0 { + fs = "(" + fs + ")" + } + fmt.Printf("%sString%s: \"%s\"\n", strings.Repeat(" ", level), fs, strings.TrimRight(string(n.Value), "\n")) +} + +// KindString is a NodeKind of the String node. +var KindString = NewNodeKind("String") + +// Kind implements Node.Kind. +func (n *String) Kind() NodeKind { + return KindString +} + +// NewString returns a new String node. +func NewString(v []byte) *String { + return &String{ + Value: v, + } +} + +// A CodeSpan struct represents a code span of Markdown text. +type CodeSpan struct { + BaseInline +} + +// Inline implements Inline.Inline . +func (n *CodeSpan) Inline() { +} + +// IsBlank returns true if this node consists of spaces, otherwise false. +func (n *CodeSpan) IsBlank(source []byte) bool { + for c := n.FirstChild(); c != nil; c = c.NextSibling() { + text := c.(*Text).Segment + if !util.IsBlank(text.Value(source)) { + return false + } + } + return true +} + +// Dump implements Node.Dump. +func (n *CodeSpan) Dump(source []byte, level int) { + DumpHelper(n, source, level, nil, nil) +} + +// KindCodeSpan is a NodeKind of the CodeSpan node. +var KindCodeSpan = NewNodeKind("CodeSpan") + +// Kind implements Node.Kind. +func (n *CodeSpan) Kind() NodeKind { + return KindCodeSpan +} + +// NewCodeSpan returns a new CodeSpan node. +func NewCodeSpan() *CodeSpan { + return &CodeSpan{ + BaseInline: BaseInline{}, + } +} + +// An Emphasis struct represents an emphasis of Markdown text. +type Emphasis struct { + BaseInline + + // Level is a level of the emphasis. + Level int +} + +// Dump implements Node.Dump. +func (n *Emphasis) Dump(source []byte, level int) { + m := map[string]string{ + "Level": fmt.Sprintf("%v", n.Level), + } + DumpHelper(n, source, level, m, nil) +} + +// KindEmphasis is a NodeKind of the Emphasis node. +var KindEmphasis = NewNodeKind("Emphasis") + +// Kind implements Node.Kind. +func (n *Emphasis) Kind() NodeKind { + return KindEmphasis +} + +// NewEmphasis returns a new Emphasis node with the given level. +func NewEmphasis(level int) *Emphasis { + return &Emphasis{ + BaseInline: BaseInline{}, + Level: level, + } +} + +type baseLink struct { + BaseInline + + // Destination is a destination(URL) of this link. + Destination []byte + + // Title is a title of this link. + Title []byte +} + +// Inline implements Inline.Inline. +func (n *baseLink) Inline() { +} + +// A Link struct represents a link of the Markdown text. +type Link struct { + baseLink +} + +// Dump implements Node.Dump. +func (n *Link) Dump(source []byte, level int) { + m := map[string]string{} + m["Destination"] = string(n.Destination) + m["Title"] = string(n.Title) + DumpHelper(n, source, level, m, nil) +} + +// KindLink is a NodeKind of the Link node. +var KindLink = NewNodeKind("Link") + +// Kind implements Node.Kind. +func (n *Link) Kind() NodeKind { + return KindLink +} + +// NewLink returns a new Link node. +func NewLink() *Link { + c := &Link{ + baseLink: baseLink{ + BaseInline: BaseInline{}, + }, + } + return c +} + +// An Image struct represents an image of the Markdown text. +type Image struct { + baseLink +} + +// Dump implements Node.Dump. +func (n *Image) Dump(source []byte, level int) { + m := map[string]string{} + m["Destination"] = string(n.Destination) + m["Title"] = string(n.Title) + DumpHelper(n, source, level, m, nil) +} + +// KindImage is a NodeKind of the Image node. +var KindImage = NewNodeKind("Image") + +// Kind implements Node.Kind. +func (n *Image) Kind() NodeKind { + return KindImage +} + +// NewImage returns a new Image node. +func NewImage(link *Link) *Image { + c := &Image{ + baseLink: baseLink{ + BaseInline: BaseInline{}, + }, + } + c.Destination = link.Destination + c.Title = link.Title + for n := link.FirstChild(); n != nil; { + next := n.NextSibling() + link.RemoveChild(link, n) + c.AppendChild(c, n) + n = next + } + + return c +} + +// AutoLinkType defines kind of auto links. +type AutoLinkType int + +const ( + // AutoLinkEmail indicates that an autolink is an email address. + AutoLinkEmail AutoLinkType = iota + 1 + // AutoLinkURL indicates that an autolink is a generic URL. + AutoLinkURL +) + +// An AutoLink struct represents an autolink of the Markdown text. +type AutoLink struct { + BaseInline + // Type is a type of this autolink. + AutoLinkType AutoLinkType + + // Protocol specified a protocol of the link. + Protocol []byte + + value *Text +} + +// Inline implements Inline.Inline. +func (n *AutoLink) Inline() {} + +// Dump implements Node.Dump. +func (n *AutoLink) Dump(source []byte, level int) { + segment := n.value.Segment + m := map[string]string{ + "Value": string(segment.Value(source)), + } + DumpHelper(n, source, level, m, nil) +} + +// KindAutoLink is a NodeKind of the AutoLink node. +var KindAutoLink = NewNodeKind("AutoLink") + +// Kind implements Node.Kind. +func (n *AutoLink) Kind() NodeKind { + return KindAutoLink +} + +// URL returns an url of this node. +func (n *AutoLink) URL(source []byte) []byte { + if n.Protocol != nil { + s := n.value.Segment + ret := make([]byte, 0, len(n.Protocol)+s.Len()+3) + ret = append(ret, n.Protocol...) + ret = append(ret, ':', '/', '/') + ret = append(ret, n.value.Text(source)...) + return ret + } + return n.value.Text(source) +} + +// Label returns a label of this node. +func (n *AutoLink) Label(source []byte) []byte { + return n.value.Text(source) +} + +// NewAutoLink returns a new AutoLink node. +func NewAutoLink(typ AutoLinkType, value *Text) *AutoLink { + return &AutoLink{ + BaseInline: BaseInline{}, + value: value, + AutoLinkType: typ, + } +} + +// A RawHTML struct represents an inline raw HTML of the Markdown text. +type RawHTML struct { + BaseInline + Segments *textm.Segments +} + +// Inline implements Inline.Inline. +func (n *RawHTML) Inline() {} + +// Dump implements Node.Dump. +func (n *RawHTML) Dump(source []byte, level int) { + m := map[string]string{} + t := []string{} + for i := 0; i < n.Segments.Len(); i++ { + segment := n.Segments.At(i) + t = append(t, string(segment.Value(source))) + } + m["RawText"] = strings.Join(t, "") + DumpHelper(n, source, level, m, nil) +} + +// KindRawHTML is a NodeKind of the RawHTML node. +var KindRawHTML = NewNodeKind("RawHTML") + +// Kind implements Node.Kind. +func (n *RawHTML) Kind() NodeKind { + return KindRawHTML +} + +// NewRawHTML returns a new RawHTML node. +func NewRawHTML() *RawHTML { + return &RawHTML{ + Segments: textm.NewSegments(), + } +} diff --git a/vendor/github.com/yuin/goldmark/extension/ast/definition_list.go b/vendor/github.com/yuin/goldmark/extension/ast/definition_list.go new file mode 100644 index 0000000..1beffb3 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/ast/definition_list.go @@ -0,0 +1,83 @@ +package ast + +import ( + gast "github.com/yuin/goldmark/ast" +) + +// A DefinitionList struct represents a definition list of Markdown +// (PHPMarkdownExtra) text. +type DefinitionList struct { + gast.BaseBlock + Offset int + TemporaryParagraph *gast.Paragraph +} + +// Dump implements Node.Dump. +func (n *DefinitionList) Dump(source []byte, level int) { + gast.DumpHelper(n, source, level, nil, nil) +} + +// KindDefinitionList is a NodeKind of the DefinitionList node. +var KindDefinitionList = gast.NewNodeKind("DefinitionList") + +// Kind implements Node.Kind. +func (n *DefinitionList) Kind() gast.NodeKind { + return KindDefinitionList +} + +// NewDefinitionList returns a new DefinitionList node. +func NewDefinitionList(offset int, para *gast.Paragraph) *DefinitionList { + return &DefinitionList{ + Offset: offset, + TemporaryParagraph: para, + } +} + +// A DefinitionTerm struct represents a definition list term of Markdown +// (PHPMarkdownExtra) text. +type DefinitionTerm struct { + gast.BaseBlock +} + +// Dump implements Node.Dump. +func (n *DefinitionTerm) Dump(source []byte, level int) { + gast.DumpHelper(n, source, level, nil, nil) +} + +// KindDefinitionTerm is a NodeKind of the DefinitionTerm node. +var KindDefinitionTerm = gast.NewNodeKind("DefinitionTerm") + +// Kind implements Node.Kind. +func (n *DefinitionTerm) Kind() gast.NodeKind { + return KindDefinitionTerm +} + +// NewDefinitionTerm returns a new DefinitionTerm node. +func NewDefinitionTerm() *DefinitionTerm { + return &DefinitionTerm{} +} + +// A DefinitionDescription struct represents a definition list description of Markdown +// (PHPMarkdownExtra) text. +type DefinitionDescription struct { + gast.BaseBlock + IsTight bool +} + +// Dump implements Node.Dump. +func (n *DefinitionDescription) Dump(source []byte, level int) { + gast.DumpHelper(n, source, level, nil, nil) +} + +// KindDefinitionDescription is a NodeKind of the DefinitionDescription node. +var KindDefinitionDescription = gast.NewNodeKind("DefinitionDescription") + +// Kind implements Node.Kind. +func (n *DefinitionDescription) Kind() gast.NodeKind { + return KindDefinitionDescription +} + +// NewDefinitionDescription returns a new DefinitionDescription node. +func NewDefinitionDescription() *DefinitionDescription { + return &DefinitionDescription{} +} diff --git a/vendor/github.com/yuin/goldmark/extension/ast/footnote.go b/vendor/github.com/yuin/goldmark/extension/ast/footnote.go new file mode 100644 index 0000000..b24eafe --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/ast/footnote.go @@ -0,0 +1,138 @@ +package ast + +import ( + "fmt" + + gast "github.com/yuin/goldmark/ast" +) + +// A FootnoteLink struct represents a link to a footnote of Markdown +// (PHP Markdown Extra) text. +type FootnoteLink struct { + gast.BaseInline + Index int + RefCount int + RefIndex int +} + +// Dump implements Node.Dump. +func (n *FootnoteLink) Dump(source []byte, level int) { + m := map[string]string{} + m["Index"] = fmt.Sprintf("%v", n.Index) + m["RefCount"] = fmt.Sprintf("%v", n.RefCount) + m["RefIndex"] = fmt.Sprintf("%v", n.RefIndex) + gast.DumpHelper(n, source, level, m, nil) +} + +// KindFootnoteLink is a NodeKind of the FootnoteLink node. +var KindFootnoteLink = gast.NewNodeKind("FootnoteLink") + +// Kind implements Node.Kind. +func (n *FootnoteLink) Kind() gast.NodeKind { + return KindFootnoteLink +} + +// NewFootnoteLink returns a new FootnoteLink node. +func NewFootnoteLink(index int) *FootnoteLink { + return &FootnoteLink{ + Index: index, + RefCount: 0, + RefIndex: 0, + } +} + +// A FootnoteBacklink struct represents a link to a footnote of Markdown +// (PHP Markdown Extra) text. +type FootnoteBacklink struct { + gast.BaseInline + Index int + RefCount int + RefIndex int +} + +// Dump implements Node.Dump. +func (n *FootnoteBacklink) Dump(source []byte, level int) { + m := map[string]string{} + m["Index"] = fmt.Sprintf("%v", n.Index) + m["RefCount"] = fmt.Sprintf("%v", n.RefCount) + m["RefIndex"] = fmt.Sprintf("%v", n.RefIndex) + gast.DumpHelper(n, source, level, m, nil) +} + +// KindFootnoteBacklink is a NodeKind of the FootnoteBacklink node. +var KindFootnoteBacklink = gast.NewNodeKind("FootnoteBacklink") + +// Kind implements Node.Kind. +func (n *FootnoteBacklink) Kind() gast.NodeKind { + return KindFootnoteBacklink +} + +// NewFootnoteBacklink returns a new FootnoteBacklink node. +func NewFootnoteBacklink(index int) *FootnoteBacklink { + return &FootnoteBacklink{ + Index: index, + RefCount: 0, + RefIndex: 0, + } +} + +// A Footnote struct represents a footnote of Markdown +// (PHP Markdown Extra) text. +type Footnote struct { + gast.BaseBlock + Ref []byte + Index int +} + +// Dump implements Node.Dump. +func (n *Footnote) Dump(source []byte, level int) { + m := map[string]string{} + m["Index"] = fmt.Sprintf("%v", n.Index) + m["Ref"] = string(n.Ref) + gast.DumpHelper(n, source, level, m, nil) +} + +// KindFootnote is a NodeKind of the Footnote node. +var KindFootnote = gast.NewNodeKind("Footnote") + +// Kind implements Node.Kind. +func (n *Footnote) Kind() gast.NodeKind { + return KindFootnote +} + +// NewFootnote returns a new Footnote node. +func NewFootnote(ref []byte) *Footnote { + return &Footnote{ + Ref: ref, + Index: -1, + } +} + +// A FootnoteList struct represents footnotes of Markdown +// (PHP Markdown Extra) text. +type FootnoteList struct { + gast.BaseBlock + Count int +} + +// Dump implements Node.Dump. +func (n *FootnoteList) Dump(source []byte, level int) { + m := map[string]string{} + m["Count"] = fmt.Sprintf("%v", n.Count) + gast.DumpHelper(n, source, level, m, nil) +} + +// KindFootnoteList is a NodeKind of the FootnoteList node. +var KindFootnoteList = gast.NewNodeKind("FootnoteList") + +// Kind implements Node.Kind. +func (n *FootnoteList) Kind() gast.NodeKind { + return KindFootnoteList +} + +// NewFootnoteList returns a new FootnoteList node. +func NewFootnoteList() *FootnoteList { + return &FootnoteList{ + Count: 0, + } +} diff --git a/vendor/github.com/yuin/goldmark/extension/ast/strikethrough.go b/vendor/github.com/yuin/goldmark/extension/ast/strikethrough.go new file mode 100644 index 0000000..a9216b7 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/ast/strikethrough.go @@ -0,0 +1,29 @@ +// Package ast defines AST nodes that represents extension's elements +package ast + +import ( + gast "github.com/yuin/goldmark/ast" +) + +// A Strikethrough struct represents a strikethrough of GFM text. +type Strikethrough struct { + gast.BaseInline +} + +// Dump implements Node.Dump. +func (n *Strikethrough) Dump(source []byte, level int) { + gast.DumpHelper(n, source, level, nil, nil) +} + +// KindStrikethrough is a NodeKind of the Strikethrough node. +var KindStrikethrough = gast.NewNodeKind("Strikethrough") + +// Kind implements Node.Kind. +func (n *Strikethrough) Kind() gast.NodeKind { + return KindStrikethrough +} + +// NewStrikethrough returns a new Strikethrough node. +func NewStrikethrough() *Strikethrough { + return &Strikethrough{} +} diff --git a/vendor/github.com/yuin/goldmark/extension/ast/table.go b/vendor/github.com/yuin/goldmark/extension/ast/table.go new file mode 100644 index 0000000..4142e33 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/ast/table.go @@ -0,0 +1,158 @@ +package ast + +import ( + "fmt" + "strings" + + gast "github.com/yuin/goldmark/ast" +) + +// Alignment is a text alignment of table cells. +type Alignment int + +const ( + // AlignLeft indicates text should be left justified. + AlignLeft Alignment = iota + 1 + + // AlignRight indicates text should be right justified. + AlignRight + + // AlignCenter indicates text should be centered. + AlignCenter + + // AlignNone indicates text should be aligned by default manner. + AlignNone +) + +func (a Alignment) String() string { + switch a { + case AlignLeft: + return "left" + case AlignRight: + return "right" + case AlignCenter: + return "center" + case AlignNone: + return "none" + } + return "" +} + +// A Table struct represents a table of Markdown(GFM) text. +type Table struct { + gast.BaseBlock + + // Alignments returns alignments of the columns. + Alignments []Alignment +} + +// Dump implements Node.Dump. +func (n *Table) Dump(source []byte, level int) { + gast.DumpHelper(n, source, level, nil, func(level int) { + indent := strings.Repeat(" ", level) + fmt.Printf("%sAlignments {\n", indent) + for i, alignment := range n.Alignments { + indent2 := strings.Repeat(" ", level+1) + fmt.Printf("%s%s", indent2, alignment.String()) + if i != len(n.Alignments)-1 { + fmt.Println("") + } + } + fmt.Printf("\n%s}\n", indent) + }) +} + +// KindTable is a NodeKind of the Table node. +var KindTable = gast.NewNodeKind("Table") + +// Kind implements Node.Kind. +func (n *Table) Kind() gast.NodeKind { + return KindTable +} + +// NewTable returns a new Table node. +func NewTable() *Table { + return &Table{ + Alignments: []Alignment{}, + } +} + +// A TableRow struct represents a table row of Markdown(GFM) text. +type TableRow struct { + gast.BaseBlock + Alignments []Alignment +} + +// Dump implements Node.Dump. +func (n *TableRow) Dump(source []byte, level int) { + gast.DumpHelper(n, source, level, nil, nil) +} + +// KindTableRow is a NodeKind of the TableRow node. +var KindTableRow = gast.NewNodeKind("TableRow") + +// Kind implements Node.Kind. +func (n *TableRow) Kind() gast.NodeKind { + return KindTableRow +} + +// NewTableRow returns a new TableRow node. +func NewTableRow(alignments []Alignment) *TableRow { + return &TableRow{Alignments: alignments} +} + +// A TableHeader struct represents a table header of Markdown(GFM) text. +type TableHeader struct { + gast.BaseBlock + Alignments []Alignment +} + +// KindTableHeader is a NodeKind of the TableHeader node. +var KindTableHeader = gast.NewNodeKind("TableHeader") + +// Kind implements Node.Kind. +func (n *TableHeader) Kind() gast.NodeKind { + return KindTableHeader +} + +// Dump implements Node.Dump. +func (n *TableHeader) Dump(source []byte, level int) { + gast.DumpHelper(n, source, level, nil, nil) +} + +// NewTableHeader returns a new TableHeader node. +func NewTableHeader(row *TableRow) *TableHeader { + n := &TableHeader{} + for c := row.FirstChild(); c != nil; { + next := c.NextSibling() + n.AppendChild(n, c) + c = next + } + return n +} + +// A TableCell struct represents a table cell of a Markdown(GFM) text. +type TableCell struct { + gast.BaseBlock + Alignment Alignment +} + +// Dump implements Node.Dump. +func (n *TableCell) Dump(source []byte, level int) { + gast.DumpHelper(n, source, level, nil, nil) +} + +// KindTableCell is a NodeKind of the TableCell node. +var KindTableCell = gast.NewNodeKind("TableCell") + +// Kind implements Node.Kind. +func (n *TableCell) Kind() gast.NodeKind { + return KindTableCell +} + +// NewTableCell returns a new TableCell node. +func NewTableCell() *TableCell { + return &TableCell{ + Alignment: AlignNone, + } +} diff --git a/vendor/github.com/yuin/goldmark/extension/ast/tasklist.go b/vendor/github.com/yuin/goldmark/extension/ast/tasklist.go new file mode 100644 index 0000000..670cc14 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/ast/tasklist.go @@ -0,0 +1,35 @@ +package ast + +import ( + "fmt" + gast "github.com/yuin/goldmark/ast" +) + +// A TaskCheckBox struct represents a checkbox of a task list. +type TaskCheckBox struct { + gast.BaseInline + IsChecked bool +} + +// Dump implements Node.Dump. +func (n *TaskCheckBox) Dump(source []byte, level int) { + m := map[string]string{ + "Checked": fmt.Sprintf("%v", n.IsChecked), + } + gast.DumpHelper(n, source, level, m, nil) +} + +// KindTaskCheckBox is a NodeKind of the TaskCheckBox node. +var KindTaskCheckBox = gast.NewNodeKind("TaskCheckBox") + +// Kind implements Node.Kind. +func (n *TaskCheckBox) Kind() gast.NodeKind { + return KindTaskCheckBox +} + +// NewTaskCheckBox returns a new TaskCheckBox node. +func NewTaskCheckBox(checked bool) *TaskCheckBox { + return &TaskCheckBox{ + IsChecked: checked, + } +} diff --git a/vendor/github.com/yuin/goldmark/extension/cjk.go b/vendor/github.com/yuin/goldmark/extension/cjk.go new file mode 100644 index 0000000..a3238c2 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/cjk.go @@ -0,0 +1,72 @@ +package extension + +import ( + "github.com/yuin/goldmark" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/renderer/html" +) + +// A CJKOption sets options for CJK support mostly for HTML based renderers. +type CJKOption func(*cjk) + +// A EastAsianLineBreaks is a style of east asian line breaks. +type EastAsianLineBreaks int + +const ( + //EastAsianLineBreaksNone renders line breaks as it is. + EastAsianLineBreaksNone EastAsianLineBreaks = iota + // EastAsianLineBreaksSimple is a style where soft line breaks are ignored + // if both sides of the break are east asian wide characters. + EastAsianLineBreaksSimple + // EastAsianLineBreaksCSS3Draft is a style where soft line breaks are ignored + // even if only one side of the break is an east asian wide character. + EastAsianLineBreaksCSS3Draft +) + +// WithEastAsianLineBreaks is a functional option that indicates whether softline breaks +// between east asian wide characters should be ignored. +// style defauts to [EastAsianLineBreaksSimple] . +func WithEastAsianLineBreaks(style ...EastAsianLineBreaks) CJKOption { + return func(c *cjk) { + if len(style) == 0 { + c.EastAsianLineBreaks = EastAsianLineBreaksSimple + return + } + c.EastAsianLineBreaks = style[0] + } +} + +// WithEscapedSpace is a functional option that indicates that a '\' escaped half-space(0x20) should not be rendered. +func WithEscapedSpace() CJKOption { + return func(c *cjk) { + c.EscapedSpace = true + } +} + +type cjk struct { + EastAsianLineBreaks EastAsianLineBreaks + EscapedSpace bool +} + +// CJK is a goldmark extension that provides functionalities for CJK languages. +var CJK = NewCJK(WithEastAsianLineBreaks(), WithEscapedSpace()) + +// NewCJK returns a new extension with given options. +func NewCJK(opts ...CJKOption) goldmark.Extender { + e := &cjk{ + EastAsianLineBreaks: EastAsianLineBreaksNone, + } + for _, opt := range opts { + opt(e) + } + return e +} + +func (e *cjk) Extend(m goldmark.Markdown) { + m.Renderer().AddOptions(html.WithEastAsianLineBreaks( + html.EastAsianLineBreaks(e.EastAsianLineBreaks))) + if e.EscapedSpace { + m.Renderer().AddOptions(html.WithWriter(html.NewWriter(html.WithEscapedSpace()))) + m.Parser().AddOptions(parser.WithEscapedSpace()) + } +} diff --git a/vendor/github.com/yuin/goldmark/extension/definition_list.go b/vendor/github.com/yuin/goldmark/extension/definition_list.go new file mode 100644 index 0000000..3e64dcf --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/definition_list.go @@ -0,0 +1,274 @@ +package extension + +import ( + "github.com/yuin/goldmark" + gast "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/extension/ast" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/renderer/html" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type definitionListParser struct { +} + +var defaultDefinitionListParser = &definitionListParser{} + +// NewDefinitionListParser return a new parser.BlockParser that +// can parse PHP Markdown Extra Definition lists. +func NewDefinitionListParser() parser.BlockParser { + return defaultDefinitionListParser +} + +func (b *definitionListParser) Trigger() []byte { + return []byte{':'} +} + +func (b *definitionListParser) Open(parent gast.Node, reader text.Reader, pc parser.Context) (gast.Node, parser.State) { + if _, ok := parent.(*ast.DefinitionList); ok { + return nil, parser.NoChildren + } + line, _ := reader.PeekLine() + pos := pc.BlockOffset() + indent := pc.BlockIndent() + if pos < 0 || line[pos] != ':' || indent != 0 { + return nil, parser.NoChildren + } + + last := parent.LastChild() + // need 1 or more spaces after ':' + w, _ := util.IndentWidth(line[pos+1:], pos+1) + if w < 1 { + return nil, parser.NoChildren + } + if w >= 8 { // starts with indented code + w = 5 + } + w += pos + 1 /* 1 = ':' */ + + para, lastIsParagraph := last.(*gast.Paragraph) + var list *ast.DefinitionList + status := parser.HasChildren + var ok bool + if lastIsParagraph { + list, ok = last.PreviousSibling().(*ast.DefinitionList) + if ok { // is not first item + list.Offset = w + list.TemporaryParagraph = para + } else { // is first item + list = ast.NewDefinitionList(w, para) + status |= parser.RequireParagraph + } + } else if list, ok = last.(*ast.DefinitionList); ok { // multiple description + list.Offset = w + list.TemporaryParagraph = nil + } else { + return nil, parser.NoChildren + } + + return list, status +} + +func (b *definitionListParser) Continue(node gast.Node, reader text.Reader, pc parser.Context) parser.State { + line, _ := reader.PeekLine() + if util.IsBlank(line) { + return parser.Continue | parser.HasChildren + } + list, _ := node.(*ast.DefinitionList) + w, _ := util.IndentWidth(line, reader.LineOffset()) + if w < list.Offset { + return parser.Close + } + pos, padding := util.IndentPosition(line, reader.LineOffset(), list.Offset) + reader.AdvanceAndSetPadding(pos, padding) + return parser.Continue | parser.HasChildren +} + +func (b *definitionListParser) Close(node gast.Node, reader text.Reader, pc parser.Context) { + // nothing to do +} + +func (b *definitionListParser) CanInterruptParagraph() bool { + return true +} + +func (b *definitionListParser) CanAcceptIndentedLine() bool { + return false +} + +type definitionDescriptionParser struct { +} + +var defaultDefinitionDescriptionParser = &definitionDescriptionParser{} + +// NewDefinitionDescriptionParser return a new parser.BlockParser that +// can parse definition description starts with ':'. +func NewDefinitionDescriptionParser() parser.BlockParser { + return defaultDefinitionDescriptionParser +} + +func (b *definitionDescriptionParser) Trigger() []byte { + return []byte{':'} +} + +func (b *definitionDescriptionParser) Open( + parent gast.Node, reader text.Reader, pc parser.Context) (gast.Node, parser.State) { + line, _ := reader.PeekLine() + pos := pc.BlockOffset() + indent := pc.BlockIndent() + if pos < 0 || line[pos] != ':' || indent != 0 { + return nil, parser.NoChildren + } + list, _ := parent.(*ast.DefinitionList) + if list == nil { + return nil, parser.NoChildren + } + para := list.TemporaryParagraph + list.TemporaryParagraph = nil + if para != nil { + lines := para.Lines() + l := lines.Len() + for i := 0; i < l; i++ { + term := ast.NewDefinitionTerm() + segment := lines.At(i) + term.Lines().Append(segment.TrimRightSpace(reader.Source())) + list.AppendChild(list, term) + } + para.Parent().RemoveChild(para.Parent(), para) + } + cpos, padding := util.IndentPosition(line[pos+1:], pos+1, list.Offset-pos-1) + reader.AdvanceAndSetPadding(cpos+1, padding) + + return ast.NewDefinitionDescription(), parser.HasChildren +} + +func (b *definitionDescriptionParser) Continue(node gast.Node, reader text.Reader, pc parser.Context) parser.State { + // definitionListParser detects end of the description. + // so this method will never be called. + return parser.Continue | parser.HasChildren +} + +func (b *definitionDescriptionParser) Close(node gast.Node, reader text.Reader, pc parser.Context) { + desc := node.(*ast.DefinitionDescription) + desc.IsTight = !desc.HasBlankPreviousLines() + if desc.IsTight { + for gc := desc.FirstChild(); gc != nil; gc = gc.NextSibling() { + paragraph, ok := gc.(*gast.Paragraph) + if ok { + textBlock := gast.NewTextBlock() + textBlock.SetLines(paragraph.Lines()) + desc.ReplaceChild(desc, paragraph, textBlock) + } + } + } +} + +func (b *definitionDescriptionParser) CanInterruptParagraph() bool { + return true +} + +func (b *definitionDescriptionParser) CanAcceptIndentedLine() bool { + return false +} + +// DefinitionListHTMLRenderer is a renderer.NodeRenderer implementation that +// renders DefinitionList nodes. +type DefinitionListHTMLRenderer struct { + html.Config +} + +// NewDefinitionListHTMLRenderer returns a new DefinitionListHTMLRenderer. +func NewDefinitionListHTMLRenderer(opts ...html.Option) renderer.NodeRenderer { + r := &DefinitionListHTMLRenderer{ + Config: html.NewConfig(), + } + for _, opt := range opts { + opt.SetHTMLOption(&r.Config) + } + return r +} + +// RegisterFuncs implements renderer.NodeRenderer.RegisterFuncs. +func (r *DefinitionListHTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { + reg.Register(ast.KindDefinitionList, r.renderDefinitionList) + reg.Register(ast.KindDefinitionTerm, r.renderDefinitionTerm) + reg.Register(ast.KindDefinitionDescription, r.renderDefinitionDescription) +} + +// DefinitionListAttributeFilter defines attribute names which dl elements can have. +var DefinitionListAttributeFilter = html.GlobalAttributeFilter + +func (r *DefinitionListHTMLRenderer) renderDefinitionList( + w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) { + if entering { + if n.Attributes() != nil { + _, _ = w.WriteString("\n") + } else { + _, _ = w.WriteString("
\n") + } + } else { + _, _ = w.WriteString("
\n") + } + return gast.WalkContinue, nil +} + +// DefinitionTermAttributeFilter defines attribute names which dd elements can have. +var DefinitionTermAttributeFilter = html.GlobalAttributeFilter + +func (r *DefinitionListHTMLRenderer) renderDefinitionTerm( + w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) { + if entering { + if n.Attributes() != nil { + _, _ = w.WriteString("') + } else { + _, _ = w.WriteString("
") + } + } else { + _, _ = w.WriteString("
\n") + } + return gast.WalkContinue, nil +} + +// DefinitionDescriptionAttributeFilter defines attribute names which dd elements can have. +var DefinitionDescriptionAttributeFilter = html.GlobalAttributeFilter + +func (r *DefinitionListHTMLRenderer) renderDefinitionDescription( + w util.BufWriter, source []byte, node gast.Node, entering bool) (gast.WalkStatus, error) { + if entering { + n := node.(*ast.DefinitionDescription) + _, _ = w.WriteString("") + } else { + _, _ = w.WriteString(">\n") + } + } else { + _, _ = w.WriteString("\n") + } + return gast.WalkContinue, nil +} + +type definitionList struct { +} + +// DefinitionList is an extension that allow you to use PHP Markdown Extra Definition lists. +var DefinitionList = &definitionList{} + +func (e *definitionList) Extend(m goldmark.Markdown) { + m.Parser().AddOptions(parser.WithBlockParsers( + util.Prioritized(NewDefinitionListParser(), 101), + util.Prioritized(NewDefinitionDescriptionParser(), 102), + )) + m.Renderer().AddOptions(renderer.WithNodeRenderers( + util.Prioritized(NewDefinitionListHTMLRenderer(), 500), + )) +} diff --git a/vendor/github.com/yuin/goldmark/extension/footnote.go b/vendor/github.com/yuin/goldmark/extension/footnote.go new file mode 100644 index 0000000..2e22526 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/footnote.go @@ -0,0 +1,691 @@ +package extension + +import ( + "bytes" + "fmt" + "strconv" + + "github.com/yuin/goldmark" + gast "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/extension/ast" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/renderer/html" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +var footnoteListKey = parser.NewContextKey() +var footnoteLinkListKey = parser.NewContextKey() + +type footnoteBlockParser struct { +} + +var defaultFootnoteBlockParser = &footnoteBlockParser{} + +// NewFootnoteBlockParser returns a new parser.BlockParser that can parse +// footnotes of the Markdown(PHP Markdown Extra) text. +func NewFootnoteBlockParser() parser.BlockParser { + return defaultFootnoteBlockParser +} + +func (b *footnoteBlockParser) Trigger() []byte { + return []byte{'['} +} + +func (b *footnoteBlockParser) Open(parent gast.Node, reader text.Reader, pc parser.Context) (gast.Node, parser.State) { + line, segment := reader.PeekLine() + pos := pc.BlockOffset() + if pos < 0 || line[pos] != '[' { + return nil, parser.NoChildren + } + pos++ + if pos > len(line)-1 || line[pos] != '^' { + return nil, parser.NoChildren + } + open := pos + 1 + var closes int + closure := util.FindClosure(line[pos+1:], '[', ']', false, false) //nolint:staticcheck + closes = pos + 1 + closure + next := closes + 1 + if closure > -1 { + if next >= len(line) || line[next] != ':' { + return nil, parser.NoChildren + } + } else { + return nil, parser.NoChildren + } + padding := segment.Padding + label := reader.Value(text.NewSegment(segment.Start+open-padding, segment.Start+closes-padding)) + if util.IsBlank(label) { + return nil, parser.NoChildren + } + item := ast.NewFootnote(label) + + pos = next + 1 - padding + if pos >= len(line) { + reader.Advance(pos) + return item, parser.NoChildren + } + reader.AdvanceAndSetPadding(pos, padding) + return item, parser.HasChildren +} + +func (b *footnoteBlockParser) Continue(node gast.Node, reader text.Reader, pc parser.Context) parser.State { + line, _ := reader.PeekLine() + if util.IsBlank(line) { + return parser.Continue | parser.HasChildren + } + childpos, padding := util.IndentPosition(line, reader.LineOffset(), 4) + if childpos < 0 { + return parser.Close + } + reader.AdvanceAndSetPadding(childpos, padding) + return parser.Continue | parser.HasChildren +} + +func (b *footnoteBlockParser) Close(node gast.Node, reader text.Reader, pc parser.Context) { + var list *ast.FootnoteList + if tlist := pc.Get(footnoteListKey); tlist != nil { + list = tlist.(*ast.FootnoteList) + } else { + list = ast.NewFootnoteList() + pc.Set(footnoteListKey, list) + node.Parent().InsertBefore(node.Parent(), node, list) + } + node.Parent().RemoveChild(node.Parent(), node) + list.AppendChild(list, node) +} + +func (b *footnoteBlockParser) CanInterruptParagraph() bool { + return true +} + +func (b *footnoteBlockParser) CanAcceptIndentedLine() bool { + return false +} + +type footnoteParser struct { +} + +var defaultFootnoteParser = &footnoteParser{} + +// NewFootnoteParser returns a new parser.InlineParser that can parse +// footnote links of the Markdown(PHP Markdown Extra) text. +func NewFootnoteParser() parser.InlineParser { + return defaultFootnoteParser +} + +func (s *footnoteParser) Trigger() []byte { + // footnote syntax probably conflict with the image syntax. + // So we need trigger this parser with '!'. + return []byte{'!', '['} +} + +func (s *footnoteParser) Parse(parent gast.Node, block text.Reader, pc parser.Context) gast.Node { + line, segment := block.PeekLine() + pos := 1 + if len(line) > 0 && line[0] == '!' { + pos++ + } + if pos >= len(line) || line[pos] != '^' { + return nil + } + pos++ + if pos >= len(line) { + return nil + } + open := pos + closure := util.FindClosure(line[pos:], '[', ']', false, false) //nolint:staticcheck + if closure < 0 { + return nil + } + closes := pos + closure + value := block.Value(text.NewSegment(segment.Start+open, segment.Start+closes)) + block.Advance(closes + 1) + + var list *ast.FootnoteList + if tlist := pc.Get(footnoteListKey); tlist != nil { + list = tlist.(*ast.FootnoteList) + } + if list == nil { + return nil + } + index := 0 + for def := list.FirstChild(); def != nil; def = def.NextSibling() { + d := def.(*ast.Footnote) + if bytes.Equal(d.Ref, value) { + if d.Index < 0 { + list.Count++ + d.Index = list.Count + } + index = d.Index + break + } + } + if index == 0 { + return nil + } + + fnlink := ast.NewFootnoteLink(index) + var fnlist []*ast.FootnoteLink + if tmp := pc.Get(footnoteLinkListKey); tmp != nil { + fnlist = tmp.([]*ast.FootnoteLink) + } else { + fnlist = []*ast.FootnoteLink{} + pc.Set(footnoteLinkListKey, fnlist) + } + pc.Set(footnoteLinkListKey, append(fnlist, fnlink)) + if line[0] == '!' { + parent.AppendChild(parent, gast.NewTextSegment(text.NewSegment(segment.Start, segment.Start+1))) + } + + return fnlink +} + +type footnoteASTTransformer struct { +} + +var defaultFootnoteASTTransformer = &footnoteASTTransformer{} + +// NewFootnoteASTTransformer returns a new parser.ASTTransformer that +// insert a footnote list to the last of the document. +func NewFootnoteASTTransformer() parser.ASTTransformer { + return defaultFootnoteASTTransformer +} + +func (a *footnoteASTTransformer) Transform(node *gast.Document, reader text.Reader, pc parser.Context) { + var list *ast.FootnoteList + var fnlist []*ast.FootnoteLink + if tmp := pc.Get(footnoteListKey); tmp != nil { + list = tmp.(*ast.FootnoteList) + } + if tmp := pc.Get(footnoteLinkListKey); tmp != nil { + fnlist = tmp.([]*ast.FootnoteLink) + } + + pc.Set(footnoteListKey, nil) + pc.Set(footnoteLinkListKey, nil) + + if list == nil { + return + } + + counter := map[int]int{} + if fnlist != nil { + for _, fnlink := range fnlist { + if fnlink.Index >= 0 { + counter[fnlink.Index]++ + } + } + refCounter := map[int]int{} + for _, fnlink := range fnlist { + fnlink.RefCount = counter[fnlink.Index] + if _, ok := refCounter[fnlink.Index]; !ok { + refCounter[fnlink.Index] = 0 + } + fnlink.RefIndex = refCounter[fnlink.Index] + refCounter[fnlink.Index]++ + } + } + for footnote := list.FirstChild(); footnote != nil; { + var container gast.Node = footnote + next := footnote.NextSibling() + if fc := container.LastChild(); fc != nil && gast.IsParagraph(fc) { + container = fc + } + fn := footnote.(*ast.Footnote) + index := fn.Index + if index < 0 { + list.RemoveChild(list, footnote) + } else { + refCount := counter[index] + backLink := ast.NewFootnoteBacklink(index) + backLink.RefCount = refCount + backLink.RefIndex = 0 + container.AppendChild(container, backLink) + if refCount > 1 { + for i := 1; i < refCount; i++ { + backLink := ast.NewFootnoteBacklink(index) + backLink.RefCount = refCount + backLink.RefIndex = i + container.AppendChild(container, backLink) + } + } + } + footnote = next + } + list.SortChildren(func(n1, n2 gast.Node) int { + if n1.(*ast.Footnote).Index < n2.(*ast.Footnote).Index { + return -1 + } + return 1 + }) + if list.Count <= 0 { + list.Parent().RemoveChild(list.Parent(), list) + return + } + + node.AppendChild(node, list) +} + +// FootnoteConfig holds configuration values for the footnote extension. +// +// Link* and Backlink* configurations have some variables: +// Occurrences of “^^” in the string will be replaced by the +// corresponding footnote number in the HTML output. +// Occurrences of “%%” will be replaced by a number for the +// reference (footnotes can have multiple references). +type FootnoteConfig struct { + html.Config + + // IDPrefix is a prefix for the id attributes generated by footnotes. + IDPrefix []byte + + // IDPrefix is a function that determines the id attribute for given Node. + IDPrefixFunction func(gast.Node) []byte + + // LinkTitle is an optional title attribute for footnote links. + LinkTitle []byte + + // BacklinkTitle is an optional title attribute for footnote backlinks. + BacklinkTitle []byte + + // LinkClass is a class for footnote links. + LinkClass []byte + + // BacklinkClass is a class for footnote backlinks. + BacklinkClass []byte + + // BacklinkHTML is an HTML content for footnote backlinks. + BacklinkHTML []byte +} + +// FootnoteOption interface is a functional option interface for the extension. +type FootnoteOption interface { + renderer.Option + // SetFootnoteOption sets given option to the extension. + SetFootnoteOption(*FootnoteConfig) +} + +// NewFootnoteConfig returns a new Config with defaults. +func NewFootnoteConfig() FootnoteConfig { + return FootnoteConfig{ + Config: html.NewConfig(), + LinkTitle: []byte(""), + BacklinkTitle: []byte(""), + LinkClass: []byte("footnote-ref"), + BacklinkClass: []byte("footnote-backref"), + BacklinkHTML: []byte("↩︎"), + } +} + +// SetOption implements renderer.SetOptioner. +func (c *FootnoteConfig) SetOption(name renderer.OptionName, value interface{}) { + switch name { + case optFootnoteIDPrefixFunction: + c.IDPrefixFunction = value.(func(gast.Node) []byte) + case optFootnoteIDPrefix: + c.IDPrefix = value.([]byte) + case optFootnoteLinkTitle: + c.LinkTitle = value.([]byte) + case optFootnoteBacklinkTitle: + c.BacklinkTitle = value.([]byte) + case optFootnoteLinkClass: + c.LinkClass = value.([]byte) + case optFootnoteBacklinkClass: + c.BacklinkClass = value.([]byte) + case optFootnoteBacklinkHTML: + c.BacklinkHTML = value.([]byte) + default: + c.Config.SetOption(name, value) + } +} + +type withFootnoteHTMLOptions struct { + value []html.Option +} + +func (o *withFootnoteHTMLOptions) SetConfig(c *renderer.Config) { + if o.value != nil { + for _, v := range o.value { + v.(renderer.Option).SetConfig(c) + } + } +} + +func (o *withFootnoteHTMLOptions) SetFootnoteOption(c *FootnoteConfig) { + if o.value != nil { + for _, v := range o.value { + v.SetHTMLOption(&c.Config) + } + } +} + +// WithFootnoteHTMLOptions is functional option that wraps goldmark HTMLRenderer options. +func WithFootnoteHTMLOptions(opts ...html.Option) FootnoteOption { + return &withFootnoteHTMLOptions{opts} +} + +const optFootnoteIDPrefix renderer.OptionName = "FootnoteIDPrefix" + +type withFootnoteIDPrefix struct { + value []byte +} + +func (o *withFootnoteIDPrefix) SetConfig(c *renderer.Config) { + c.Options[optFootnoteIDPrefix] = o.value +} + +func (o *withFootnoteIDPrefix) SetFootnoteOption(c *FootnoteConfig) { + c.IDPrefix = o.value +} + +// WithFootnoteIDPrefix is a functional option that is a prefix for the id attributes generated by footnotes. +func WithFootnoteIDPrefix[T []byte | string](a T) FootnoteOption { + return &withFootnoteIDPrefix{[]byte(a)} +} + +const optFootnoteIDPrefixFunction renderer.OptionName = "FootnoteIDPrefixFunction" + +type withFootnoteIDPrefixFunction struct { + value func(gast.Node) []byte +} + +func (o *withFootnoteIDPrefixFunction) SetConfig(c *renderer.Config) { + c.Options[optFootnoteIDPrefixFunction] = o.value +} + +func (o *withFootnoteIDPrefixFunction) SetFootnoteOption(c *FootnoteConfig) { + c.IDPrefixFunction = o.value +} + +// WithFootnoteIDPrefixFunction is a functional option that is a prefix for the id attributes generated by footnotes. +func WithFootnoteIDPrefixFunction(a func(gast.Node) []byte) FootnoteOption { + return &withFootnoteIDPrefixFunction{a} +} + +const optFootnoteLinkTitle renderer.OptionName = "FootnoteLinkTitle" + +type withFootnoteLinkTitle struct { + value []byte +} + +func (o *withFootnoteLinkTitle) SetConfig(c *renderer.Config) { + c.Options[optFootnoteLinkTitle] = o.value +} + +func (o *withFootnoteLinkTitle) SetFootnoteOption(c *FootnoteConfig) { + c.LinkTitle = o.value +} + +// WithFootnoteLinkTitle is a functional option that is an optional title attribute for footnote links. +func WithFootnoteLinkTitle[T []byte | string](a T) FootnoteOption { + return &withFootnoteLinkTitle{[]byte(a)} +} + +const optFootnoteBacklinkTitle renderer.OptionName = "FootnoteBacklinkTitle" + +type withFootnoteBacklinkTitle struct { + value []byte +} + +func (o *withFootnoteBacklinkTitle) SetConfig(c *renderer.Config) { + c.Options[optFootnoteBacklinkTitle] = o.value +} + +func (o *withFootnoteBacklinkTitle) SetFootnoteOption(c *FootnoteConfig) { + c.BacklinkTitle = o.value +} + +// WithFootnoteBacklinkTitle is a functional option that is an optional title attribute for footnote backlinks. +func WithFootnoteBacklinkTitle[T []byte | string](a T) FootnoteOption { + return &withFootnoteBacklinkTitle{[]byte(a)} +} + +const optFootnoteLinkClass renderer.OptionName = "FootnoteLinkClass" + +type withFootnoteLinkClass struct { + value []byte +} + +func (o *withFootnoteLinkClass) SetConfig(c *renderer.Config) { + c.Options[optFootnoteLinkClass] = o.value +} + +func (o *withFootnoteLinkClass) SetFootnoteOption(c *FootnoteConfig) { + c.LinkClass = o.value +} + +// WithFootnoteLinkClass is a functional option that is a class for footnote links. +func WithFootnoteLinkClass[T []byte | string](a T) FootnoteOption { + return &withFootnoteLinkClass{[]byte(a)} +} + +const optFootnoteBacklinkClass renderer.OptionName = "FootnoteBacklinkClass" + +type withFootnoteBacklinkClass struct { + value []byte +} + +func (o *withFootnoteBacklinkClass) SetConfig(c *renderer.Config) { + c.Options[optFootnoteBacklinkClass] = o.value +} + +func (o *withFootnoteBacklinkClass) SetFootnoteOption(c *FootnoteConfig) { + c.BacklinkClass = o.value +} + +// WithFootnoteBacklinkClass is a functional option that is a class for footnote backlinks. +func WithFootnoteBacklinkClass[T []byte | string](a T) FootnoteOption { + return &withFootnoteBacklinkClass{[]byte(a)} +} + +const optFootnoteBacklinkHTML renderer.OptionName = "FootnoteBacklinkHTML" + +type withFootnoteBacklinkHTML struct { + value []byte +} + +func (o *withFootnoteBacklinkHTML) SetConfig(c *renderer.Config) { + c.Options[optFootnoteBacklinkHTML] = o.value +} + +func (o *withFootnoteBacklinkHTML) SetFootnoteOption(c *FootnoteConfig) { + c.BacklinkHTML = o.value +} + +// WithFootnoteBacklinkHTML is an HTML content for footnote backlinks. +func WithFootnoteBacklinkHTML[T []byte | string](a T) FootnoteOption { + return &withFootnoteBacklinkHTML{[]byte(a)} +} + +// FootnoteHTMLRenderer is a renderer.NodeRenderer implementation that +// renders FootnoteLink nodes. +type FootnoteHTMLRenderer struct { + FootnoteConfig +} + +// NewFootnoteHTMLRenderer returns a new FootnoteHTMLRenderer. +func NewFootnoteHTMLRenderer(opts ...FootnoteOption) renderer.NodeRenderer { + r := &FootnoteHTMLRenderer{ + FootnoteConfig: NewFootnoteConfig(), + } + for _, opt := range opts { + opt.SetFootnoteOption(&r.FootnoteConfig) + } + return r +} + +// RegisterFuncs implements renderer.NodeRenderer.RegisterFuncs. +func (r *FootnoteHTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { + reg.Register(ast.KindFootnoteLink, r.renderFootnoteLink) + reg.Register(ast.KindFootnoteBacklink, r.renderFootnoteBacklink) + reg.Register(ast.KindFootnote, r.renderFootnote) + reg.Register(ast.KindFootnoteList, r.renderFootnoteList) +} + +func (r *FootnoteHTMLRenderer) renderFootnoteLink( + w util.BufWriter, source []byte, node gast.Node, entering bool) (gast.WalkStatus, error) { + if entering { + n := node.(*ast.FootnoteLink) + is := strconv.Itoa(n.Index) + _, _ = w.WriteString(``) + + _, _ = w.WriteString(is) + _, _ = w.WriteString(``) + } + return gast.WalkContinue, nil +} + +func (r *FootnoteHTMLRenderer) renderFootnoteBacklink( + w util.BufWriter, source []byte, node gast.Node, entering bool) (gast.WalkStatus, error) { + if entering { + n := node.(*ast.FootnoteBacklink) + is := strconv.Itoa(n.Index) + _, _ = w.WriteString(` `) + _, _ = w.Write(applyFootnoteTemplate(r.FootnoteConfig.BacklinkHTML, n.Index, n.RefCount)) + _, _ = w.WriteString(``) + } + return gast.WalkContinue, nil +} + +func (r *FootnoteHTMLRenderer) renderFootnote( + w util.BufWriter, source []byte, node gast.Node, entering bool) (gast.WalkStatus, error) { + n := node.(*ast.Footnote) + is := strconv.Itoa(n.Index) + if entering { + _, _ = w.WriteString(`
  • \n") + } else { + _, _ = w.WriteString("
  • \n") + } + return gast.WalkContinue, nil +} + +func (r *FootnoteHTMLRenderer) renderFootnoteList( + w util.BufWriter, source []byte, node gast.Node, entering bool) (gast.WalkStatus, error) { + if entering { + _, _ = w.WriteString(`
    ') + if r.Config.XHTML { + _, _ = w.WriteString("\n
    \n") + } else { + _, _ = w.WriteString("\n
    \n") + } + _, _ = w.WriteString("
      \n") + } else { + _, _ = w.WriteString("
    \n") + _, _ = w.WriteString("
    \n") + } + return gast.WalkContinue, nil +} + +func (r *FootnoteHTMLRenderer) idPrefix(node gast.Node) []byte { + if r.FootnoteConfig.IDPrefix != nil { + return r.FootnoteConfig.IDPrefix + } + if r.FootnoteConfig.IDPrefixFunction != nil { + return r.FootnoteConfig.IDPrefixFunction(node) + } + return []byte("") +} + +func applyFootnoteTemplate(b []byte, index, refCount int) []byte { + fast := true + for i, c := range b { + if i != 0 { + if b[i-1] == '^' && c == '^' { + fast = false + break + } + if b[i-1] == '%' && c == '%' { + fast = false + break + } + } + } + if fast { + return b + } + is := []byte(strconv.Itoa(index)) + rs := []byte(strconv.Itoa(refCount)) + ret := bytes.Replace(b, []byte("^^"), is, -1) + return bytes.Replace(ret, []byte("%%"), rs, -1) +} + +type footnote struct { + options []FootnoteOption +} + +// Footnote is an extension that allow you to use PHP Markdown Extra Footnotes. +var Footnote = &footnote{ + options: []FootnoteOption{}, +} + +// NewFootnote returns a new extension with given options. +func NewFootnote(opts ...FootnoteOption) goldmark.Extender { + return &footnote{ + options: opts, + } +} + +func (e *footnote) Extend(m goldmark.Markdown) { + m.Parser().AddOptions( + parser.WithBlockParsers( + util.Prioritized(NewFootnoteBlockParser(), 999), + ), + parser.WithInlineParsers( + util.Prioritized(NewFootnoteParser(), 101), + ), + parser.WithASTTransformers( + util.Prioritized(NewFootnoteASTTransformer(), 999), + ), + ) + m.Renderer().AddOptions(renderer.WithNodeRenderers( + util.Prioritized(NewFootnoteHTMLRenderer(e.options...), 500), + )) +} diff --git a/vendor/github.com/yuin/goldmark/extension/gfm.go b/vendor/github.com/yuin/goldmark/extension/gfm.go new file mode 100644 index 0000000..a570fbd --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/gfm.go @@ -0,0 +1,18 @@ +package extension + +import ( + "github.com/yuin/goldmark" +) + +type gfm struct { +} + +// GFM is an extension that provides Github Flavored markdown functionalities. +var GFM = &gfm{} + +func (e *gfm) Extend(m goldmark.Markdown) { + Linkify.Extend(m) + Table.Extend(m) + Strikethrough.Extend(m) + TaskList.Extend(m) +} diff --git a/vendor/github.com/yuin/goldmark/extension/linkify.go b/vendor/github.com/yuin/goldmark/extension/linkify.go new file mode 100644 index 0000000..ad88933 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/linkify.go @@ -0,0 +1,322 @@ +package extension + +import ( + "bytes" + "regexp" + + "github.com/yuin/goldmark" + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +var wwwURLRegxp = regexp.MustCompile(`^www\.[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-z]+(?:[/#?][-a-zA-Z0-9@:%_\+.~#!?&/=\(\);,'">\^{}\[\]` + "`" + `]*)?`) //nolint:golint,lll + +var urlRegexp = regexp.MustCompile(`^(?:http|https|ftp)://[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-z]+(?::\d+)?(?:[/#?][-a-zA-Z0-9@:%_+.~#$!?&/=\(\);,'">\^{}\[\]` + "`" + `]*)?`) //nolint:golint,lll + +// An LinkifyConfig struct is a data structure that holds configuration of the +// Linkify extension. +type LinkifyConfig struct { + AllowedProtocols [][]byte + URLRegexp *regexp.Regexp + WWWRegexp *regexp.Regexp + EmailRegexp *regexp.Regexp +} + +const ( + optLinkifyAllowedProtocols parser.OptionName = "LinkifyAllowedProtocols" + optLinkifyURLRegexp parser.OptionName = "LinkifyURLRegexp" + optLinkifyWWWRegexp parser.OptionName = "LinkifyWWWRegexp" + optLinkifyEmailRegexp parser.OptionName = "LinkifyEmailRegexp" +) + +// SetOption implements SetOptioner. +func (c *LinkifyConfig) SetOption(name parser.OptionName, value interface{}) { + switch name { + case optLinkifyAllowedProtocols: + c.AllowedProtocols = value.([][]byte) + case optLinkifyURLRegexp: + c.URLRegexp = value.(*regexp.Regexp) + case optLinkifyWWWRegexp: + c.WWWRegexp = value.(*regexp.Regexp) + case optLinkifyEmailRegexp: + c.EmailRegexp = value.(*regexp.Regexp) + } +} + +// A LinkifyOption interface sets options for the LinkifyOption. +type LinkifyOption interface { + parser.Option + SetLinkifyOption(*LinkifyConfig) +} + +type withLinkifyAllowedProtocols struct { + value [][]byte +} + +func (o *withLinkifyAllowedProtocols) SetParserOption(c *parser.Config) { + c.Options[optLinkifyAllowedProtocols] = o.value +} + +func (o *withLinkifyAllowedProtocols) SetLinkifyOption(p *LinkifyConfig) { + p.AllowedProtocols = o.value +} + +// WithLinkifyAllowedProtocols is a functional option that specify allowed +// protocols in autolinks. Each protocol must end with ':' like +// 'http:' . +func WithLinkifyAllowedProtocols[T []byte | string](value []T) LinkifyOption { + opt := &withLinkifyAllowedProtocols{} + for _, v := range value { + opt.value = append(opt.value, []byte(v)) + } + return opt +} + +type withLinkifyURLRegexp struct { + value *regexp.Regexp +} + +func (o *withLinkifyURLRegexp) SetParserOption(c *parser.Config) { + c.Options[optLinkifyURLRegexp] = o.value +} + +func (o *withLinkifyURLRegexp) SetLinkifyOption(p *LinkifyConfig) { + p.URLRegexp = o.value +} + +// WithLinkifyURLRegexp is a functional option that specify +// a pattern of the URL including a protocol. +func WithLinkifyURLRegexp(value *regexp.Regexp) LinkifyOption { + return &withLinkifyURLRegexp{ + value: value, + } +} + +type withLinkifyWWWRegexp struct { + value *regexp.Regexp +} + +func (o *withLinkifyWWWRegexp) SetParserOption(c *parser.Config) { + c.Options[optLinkifyWWWRegexp] = o.value +} + +func (o *withLinkifyWWWRegexp) SetLinkifyOption(p *LinkifyConfig) { + p.WWWRegexp = o.value +} + +// WithLinkifyWWWRegexp is a functional option that specify +// a pattern of the URL without a protocol. +// This pattern must start with 'www.' . +func WithLinkifyWWWRegexp(value *regexp.Regexp) LinkifyOption { + return &withLinkifyWWWRegexp{ + value: value, + } +} + +type withLinkifyEmailRegexp struct { + value *regexp.Regexp +} + +func (o *withLinkifyEmailRegexp) SetParserOption(c *parser.Config) { + c.Options[optLinkifyEmailRegexp] = o.value +} + +func (o *withLinkifyEmailRegexp) SetLinkifyOption(p *LinkifyConfig) { + p.EmailRegexp = o.value +} + +// WithLinkifyEmailRegexp is a functional otpion that specify +// a pattern of the email address. +func WithLinkifyEmailRegexp(value *regexp.Regexp) LinkifyOption { + return &withLinkifyEmailRegexp{ + value: value, + } +} + +type linkifyParser struct { + LinkifyConfig +} + +// NewLinkifyParser return a new InlineParser can parse +// text that seems like a URL. +func NewLinkifyParser(opts ...LinkifyOption) parser.InlineParser { + p := &linkifyParser{ + LinkifyConfig: LinkifyConfig{ + AllowedProtocols: nil, + URLRegexp: urlRegexp, + WWWRegexp: wwwURLRegxp, + }, + } + for _, o := range opts { + o.SetLinkifyOption(&p.LinkifyConfig) + } + return p +} + +func (s *linkifyParser) Trigger() []byte { + // ' ' indicates any white spaces and a line head + return []byte{' ', '*', '_', '~', '('} +} + +var ( + protoHTTP = []byte("http:") + protoHTTPS = []byte("https:") + protoFTP = []byte("ftp:") + domainWWW = []byte("www.") +) + +func (s *linkifyParser) Parse(parent ast.Node, block text.Reader, pc parser.Context) ast.Node { + if pc.IsInLinkLabel() { + return nil + } + line, segment := block.PeekLine() + consumes := 0 + start := segment.Start + c := line[0] + // advance if current position is not a line head. + if c == ' ' || c == '*' || c == '_' || c == '~' || c == '(' { + consumes++ + start++ + line = line[1:] + } + + var m []int + var protocol []byte + var typ ast.AutoLinkType = ast.AutoLinkURL + if s.LinkifyConfig.AllowedProtocols == nil { + if bytes.HasPrefix(line, protoHTTP) || bytes.HasPrefix(line, protoHTTPS) || bytes.HasPrefix(line, protoFTP) { + m = s.LinkifyConfig.URLRegexp.FindSubmatchIndex(line) + } + } else { + for _, prefix := range s.LinkifyConfig.AllowedProtocols { + if bytes.HasPrefix(line, prefix) { + m = s.LinkifyConfig.URLRegexp.FindSubmatchIndex(line) + break + } + } + } + if m == nil && bytes.HasPrefix(line, domainWWW) { + m = s.LinkifyConfig.WWWRegexp.FindSubmatchIndex(line) + protocol = []byte("http") + } + if m != nil && m[0] != 0 { + m = nil + } + if m != nil && m[0] == 0 { + lastChar := line[m[1]-1] + if lastChar == '.' { + m[1]-- + } else if lastChar == ')' { + closing := 0 + for i := m[1] - 1; i >= m[0]; i-- { + if line[i] == ')' { + closing++ + } else if line[i] == '(' { + closing-- + } + } + if closing > 0 { + m[1] -= closing + } + } else if lastChar == ';' { + i := m[1] - 2 + for ; i >= m[0]; i-- { + if util.IsAlphaNumeric(line[i]) { + continue + } + break + } + if i != m[1]-2 { + if line[i] == '&' { + m[1] -= m[1] - i + } + } + } + } + if m == nil { + if len(line) > 0 && util.IsPunct(line[0]) { + return nil + } + typ = ast.AutoLinkEmail + stop := -1 + if s.LinkifyConfig.EmailRegexp == nil { + stop = util.FindEmailIndex(line) + } else { + m := s.LinkifyConfig.EmailRegexp.FindSubmatchIndex(line) + if m != nil && m[0] == 0 { + stop = m[1] + } + } + if stop < 0 { + return nil + } + at := bytes.IndexByte(line, '@') + m = []int{0, stop, at, stop - 1} + if m == nil || bytes.IndexByte(line[m[2]:m[3]], '.') < 0 { + return nil + } + lastChar := line[m[1]-1] + if lastChar == '.' { + m[1]-- + } + if m[1] < len(line) { + nextChar := line[m[1]] + if nextChar == '-' || nextChar == '_' { + return nil + } + } + } + if m == nil { + return nil + } + if consumes != 0 { + s := segment.WithStop(segment.Start + 1) + ast.MergeOrAppendTextSegment(parent, s) + } + i := m[1] - 1 + for ; i > 0; i-- { + c := line[i] + switch c { + case '?', '!', '.', ',', ':', '*', '_', '~': + default: + goto endfor + } + } +endfor: + i++ + consumes += i + block.Advance(consumes) + n := ast.NewTextSegment(text.NewSegment(start, start+i)) + link := ast.NewAutoLink(typ, n) + link.Protocol = protocol + return link +} + +func (s *linkifyParser) CloseBlock(parent ast.Node, pc parser.Context) { + // nothing to do +} + +type linkify struct { + options []LinkifyOption +} + +// Linkify is an extension that allow you to parse text that seems like a URL. +var Linkify = &linkify{} + +// NewLinkify creates a new [goldmark.Extender] that +// allow you to parse text that seems like a URL. +func NewLinkify(opts ...LinkifyOption) goldmark.Extender { + return &linkify{ + options: opts, + } +} + +func (e *linkify) Extend(m goldmark.Markdown) { + m.Parser().AddOptions( + parser.WithInlineParsers( + util.Prioritized(NewLinkifyParser(e.options...), 999), + ), + ) +} diff --git a/vendor/github.com/yuin/goldmark/extension/package.go b/vendor/github.com/yuin/goldmark/extension/package.go new file mode 100644 index 0000000..2ec1d1e --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/package.go @@ -0,0 +1,2 @@ +// Package extension is a collection of builtin extensions. +package extension diff --git a/vendor/github.com/yuin/goldmark/extension/strikethrough.go b/vendor/github.com/yuin/goldmark/extension/strikethrough.go new file mode 100644 index 0000000..9fc0bec --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/strikethrough.go @@ -0,0 +1,118 @@ +package extension + +import ( + "github.com/yuin/goldmark" + gast "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/extension/ast" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/renderer/html" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type strikethroughDelimiterProcessor struct { +} + +func (p *strikethroughDelimiterProcessor) IsDelimiter(b byte) bool { + return b == '~' +} + +func (p *strikethroughDelimiterProcessor) CanOpenCloser(opener, closer *parser.Delimiter) bool { + return opener.Char == closer.Char +} + +func (p *strikethroughDelimiterProcessor) OnMatch(consumes int) gast.Node { + return ast.NewStrikethrough() +} + +var defaultStrikethroughDelimiterProcessor = &strikethroughDelimiterProcessor{} + +type strikethroughParser struct { +} + +var defaultStrikethroughParser = &strikethroughParser{} + +// NewStrikethroughParser return a new InlineParser that parses +// strikethrough expressions. +func NewStrikethroughParser() parser.InlineParser { + return defaultStrikethroughParser +} + +func (s *strikethroughParser) Trigger() []byte { + return []byte{'~'} +} + +func (s *strikethroughParser) Parse(parent gast.Node, block text.Reader, pc parser.Context) gast.Node { + before := block.PrecendingCharacter() + line, segment := block.PeekLine() + node := parser.ScanDelimiter(line, before, 1, defaultStrikethroughDelimiterProcessor) + if node == nil || node.OriginalLength > 2 || before == '~' { + return nil + } + + node.Segment = segment.WithStop(segment.Start + node.OriginalLength) + block.Advance(node.OriginalLength) + pc.PushDelimiter(node) + return node +} + +func (s *strikethroughParser) CloseBlock(parent gast.Node, pc parser.Context) { + // nothing to do +} + +// StrikethroughHTMLRenderer is a renderer.NodeRenderer implementation that +// renders Strikethrough nodes. +type StrikethroughHTMLRenderer struct { + html.Config +} + +// NewStrikethroughHTMLRenderer returns a new StrikethroughHTMLRenderer. +func NewStrikethroughHTMLRenderer(opts ...html.Option) renderer.NodeRenderer { + r := &StrikethroughHTMLRenderer{ + Config: html.NewConfig(), + } + for _, opt := range opts { + opt.SetHTMLOption(&r.Config) + } + return r +} + +// RegisterFuncs implements renderer.NodeRenderer.RegisterFuncs. +func (r *StrikethroughHTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { + reg.Register(ast.KindStrikethrough, r.renderStrikethrough) +} + +// StrikethroughAttributeFilter defines attribute names which dd elements can have. +var StrikethroughAttributeFilter = html.GlobalAttributeFilter + +func (r *StrikethroughHTMLRenderer) renderStrikethrough( + w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) { + if entering { + if n.Attributes() != nil { + _, _ = w.WriteString("') + } else { + _, _ = w.WriteString("") + } + } else { + _, _ = w.WriteString("") + } + return gast.WalkContinue, nil +} + +type strikethrough struct { +} + +// Strikethrough is an extension that allow you to use strikethrough expression like '~~text~~' . +var Strikethrough = &strikethrough{} + +func (e *strikethrough) Extend(m goldmark.Markdown) { + m.Parser().AddOptions(parser.WithInlineParsers( + util.Prioritized(NewStrikethroughParser(), 500), + )) + m.Renderer().AddOptions(renderer.WithNodeRenderers( + util.Prioritized(NewStrikethroughHTMLRenderer(), 500), + )) +} diff --git a/vendor/github.com/yuin/goldmark/extension/table.go b/vendor/github.com/yuin/goldmark/extension/table.go new file mode 100644 index 0000000..617c7a3 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/table.go @@ -0,0 +1,564 @@ +package extension + +import ( + "bytes" + "fmt" + "regexp" + + "github.com/yuin/goldmark" + gast "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/extension/ast" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/renderer/html" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +var escapedPipeCellListKey = parser.NewContextKey() + +type escapedPipeCell struct { + Cell *ast.TableCell + Pos []int + Transformed bool +} + +// TableCellAlignMethod indicates how are table cells aligned in HTML format. +type TableCellAlignMethod int + +const ( + // TableCellAlignDefault renders alignments by default method. + // With XHTML, alignments are rendered as an align attribute. + // With HTML5, alignments are rendered as a style attribute. + TableCellAlignDefault TableCellAlignMethod = iota + + // TableCellAlignAttribute renders alignments as an align attribute. + TableCellAlignAttribute + + // TableCellAlignStyle renders alignments as a style attribute. + TableCellAlignStyle + + // TableCellAlignNone does not care about alignments. + // If you using classes or other styles, you can add these attributes + // in an ASTTransformer. + TableCellAlignNone +) + +// TableConfig struct holds options for the extension. +type TableConfig struct { + html.Config + + // TableCellAlignMethod indicates how are table celss aligned. + TableCellAlignMethod TableCellAlignMethod +} + +// TableOption interface is a functional option interface for the extension. +type TableOption interface { + renderer.Option + // SetTableOption sets given option to the extension. + SetTableOption(*TableConfig) +} + +// NewTableConfig returns a new Config with defaults. +func NewTableConfig() TableConfig { + return TableConfig{ + Config: html.NewConfig(), + TableCellAlignMethod: TableCellAlignDefault, + } +} + +// SetOption implements renderer.SetOptioner. +func (c *TableConfig) SetOption(name renderer.OptionName, value interface{}) { + switch name { + case optTableCellAlignMethod: + c.TableCellAlignMethod = value.(TableCellAlignMethod) + default: + c.Config.SetOption(name, value) + } +} + +type withTableHTMLOptions struct { + value []html.Option +} + +func (o *withTableHTMLOptions) SetConfig(c *renderer.Config) { + if o.value != nil { + for _, v := range o.value { + v.(renderer.Option).SetConfig(c) + } + } +} + +func (o *withTableHTMLOptions) SetTableOption(c *TableConfig) { + if o.value != nil { + for _, v := range o.value { + v.SetHTMLOption(&c.Config) + } + } +} + +// WithTableHTMLOptions is functional option that wraps goldmark HTMLRenderer options. +func WithTableHTMLOptions(opts ...html.Option) TableOption { + return &withTableHTMLOptions{opts} +} + +const optTableCellAlignMethod renderer.OptionName = "TableTableCellAlignMethod" + +type withTableCellAlignMethod struct { + value TableCellAlignMethod +} + +func (o *withTableCellAlignMethod) SetConfig(c *renderer.Config) { + c.Options[optTableCellAlignMethod] = o.value +} + +func (o *withTableCellAlignMethod) SetTableOption(c *TableConfig) { + c.TableCellAlignMethod = o.value +} + +// WithTableCellAlignMethod is a functional option that indicates how are table cells aligned in HTML format. +func WithTableCellAlignMethod(a TableCellAlignMethod) TableOption { + return &withTableCellAlignMethod{a} +} + +func isTableDelim(bs []byte) bool { + if w, _ := util.IndentWidth(bs, 0); w > 3 { + return false + } + for _, b := range bs { + if !(util.IsSpace(b) || b == '-' || b == '|' || b == ':') { + return false + } + } + return true +} + +var tableDelimLeft = regexp.MustCompile(`^\s*\:\-+\s*$`) +var tableDelimRight = regexp.MustCompile(`^\s*\-+\:\s*$`) +var tableDelimCenter = regexp.MustCompile(`^\s*\:\-+\:\s*$`) +var tableDelimNone = regexp.MustCompile(`^\s*\-+\s*$`) + +type tableParagraphTransformer struct { +} + +var defaultTableParagraphTransformer = &tableParagraphTransformer{} + +// NewTableParagraphTransformer returns a new ParagraphTransformer +// that can transform paragraphs into tables. +func NewTableParagraphTransformer() parser.ParagraphTransformer { + return defaultTableParagraphTransformer +} + +func (b *tableParagraphTransformer) Transform(node *gast.Paragraph, reader text.Reader, pc parser.Context) { + lines := node.Lines() + if lines.Len() < 2 { + return + } + for i := 1; i < lines.Len(); i++ { + alignments := b.parseDelimiter(lines.At(i), reader) + if alignments == nil { + continue + } + header := b.parseRow(lines.At(i-1), alignments, true, reader, pc) + if header == nil || len(alignments) != header.ChildCount() { + return + } + table := ast.NewTable() + table.Alignments = alignments + table.AppendChild(table, ast.NewTableHeader(header)) + for j := i + 1; j < lines.Len(); j++ { + table.AppendChild(table, b.parseRow(lines.At(j), alignments, false, reader, pc)) + } + node.Lines().SetSliced(0, i-1) + node.Parent().InsertAfter(node.Parent(), node, table) + if node.Lines().Len() == 0 { + node.Parent().RemoveChild(node.Parent(), node) + } else { + last := node.Lines().At(i - 2) + last.Stop = last.Stop - 1 // trim last newline(\n) + node.Lines().Set(i-2, last) + } + } +} + +func (b *tableParagraphTransformer) parseRow(segment text.Segment, + alignments []ast.Alignment, isHeader bool, reader text.Reader, pc parser.Context) *ast.TableRow { + source := reader.Source() + line := segment.Value(source) + pos := 0 + pos += util.TrimLeftSpaceLength(line) + limit := len(line) + limit -= util.TrimRightSpaceLength(line) + row := ast.NewTableRow(alignments) + if len(line) > 0 && line[pos] == '|' { + pos++ + } + if len(line) > 0 && line[limit-1] == '|' { + limit-- + } + i := 0 + for ; pos < limit; i++ { + alignment := ast.AlignNone + if i >= len(alignments) { + if !isHeader { + return row + } + } else { + alignment = alignments[i] + } + + var escapedCell *escapedPipeCell + node := ast.NewTableCell() + node.Alignment = alignment + hasBacktick := false + closure := pos + for ; closure < limit; closure++ { + if line[closure] == '`' { + hasBacktick = true + } + if line[closure] == '|' { + if closure == 0 || line[closure-1] != '\\' { + break + } else if hasBacktick { + if escapedCell == nil { + escapedCell = &escapedPipeCell{node, []int{}, false} + escapedList := pc.ComputeIfAbsent(escapedPipeCellListKey, + func() interface{} { + return []*escapedPipeCell{} + }).([]*escapedPipeCell) + escapedList = append(escapedList, escapedCell) + pc.Set(escapedPipeCellListKey, escapedList) + } + escapedCell.Pos = append(escapedCell.Pos, segment.Start+closure-1) + } + } + } + seg := text.NewSegment(segment.Start+pos, segment.Start+closure) + seg = seg.TrimLeftSpace(source) + seg = seg.TrimRightSpace(source) + node.Lines().Append(seg) + row.AppendChild(row, node) + pos = closure + 1 + } + for ; i < len(alignments); i++ { + row.AppendChild(row, ast.NewTableCell()) + } + return row +} + +func (b *tableParagraphTransformer) parseDelimiter(segment text.Segment, reader text.Reader) []ast.Alignment { + + line := segment.Value(reader.Source()) + if !isTableDelim(line) { + return nil + } + cols := bytes.Split(line, []byte{'|'}) + if util.IsBlank(cols[0]) { + cols = cols[1:] + } + if len(cols) > 0 && util.IsBlank(cols[len(cols)-1]) { + cols = cols[:len(cols)-1] + } + + var alignments []ast.Alignment + for _, col := range cols { + if tableDelimLeft.Match(col) { + alignments = append(alignments, ast.AlignLeft) + } else if tableDelimRight.Match(col) { + alignments = append(alignments, ast.AlignRight) + } else if tableDelimCenter.Match(col) { + alignments = append(alignments, ast.AlignCenter) + } else if tableDelimNone.Match(col) { + alignments = append(alignments, ast.AlignNone) + } else { + return nil + } + } + return alignments +} + +type tableASTTransformer struct { +} + +var defaultTableASTTransformer = &tableASTTransformer{} + +// NewTableASTTransformer returns a parser.ASTTransformer for tables. +func NewTableASTTransformer() parser.ASTTransformer { + return defaultTableASTTransformer +} + +func (a *tableASTTransformer) Transform(node *gast.Document, reader text.Reader, pc parser.Context) { + lst := pc.Get(escapedPipeCellListKey) + if lst == nil { + return + } + pc.Set(escapedPipeCellListKey, nil) + for _, v := range lst.([]*escapedPipeCell) { + if v.Transformed { + continue + } + _ = gast.Walk(v.Cell, func(n gast.Node, entering bool) (gast.WalkStatus, error) { + if !entering || n.Kind() != gast.KindCodeSpan { + return gast.WalkContinue, nil + } + + for c := n.FirstChild(); c != nil; { + next := c.NextSibling() + if c.Kind() != gast.KindText { + c = next + continue + } + parent := c.Parent() + ts := &c.(*gast.Text).Segment + n := c + for _, v := range lst.([]*escapedPipeCell) { + for _, pos := range v.Pos { + if ts.Start <= pos && pos < ts.Stop { + segment := n.(*gast.Text).Segment + n1 := gast.NewRawTextSegment(segment.WithStop(pos)) + n2 := gast.NewRawTextSegment(segment.WithStart(pos + 1)) + parent.InsertAfter(parent, n, n1) + parent.InsertAfter(parent, n1, n2) + parent.RemoveChild(parent, n) + n = n2 + v.Transformed = true + } + } + } + c = next + } + return gast.WalkContinue, nil + }) + } +} + +// TableHTMLRenderer is a renderer.NodeRenderer implementation that +// renders Table nodes. +type TableHTMLRenderer struct { + TableConfig +} + +// NewTableHTMLRenderer returns a new TableHTMLRenderer. +func NewTableHTMLRenderer(opts ...TableOption) renderer.NodeRenderer { + r := &TableHTMLRenderer{ + TableConfig: NewTableConfig(), + } + for _, opt := range opts { + opt.SetTableOption(&r.TableConfig) + } + return r +} + +// RegisterFuncs implements renderer.NodeRenderer.RegisterFuncs. +func (r *TableHTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { + reg.Register(ast.KindTable, r.renderTable) + reg.Register(ast.KindTableHeader, r.renderTableHeader) + reg.Register(ast.KindTableRow, r.renderTableRow) + reg.Register(ast.KindTableCell, r.renderTableCell) +} + +// TableAttributeFilter defines attribute names which table elements can have. +var TableAttributeFilter = html.GlobalAttributeFilter.Extend( + []byte("align"), // [Deprecated] + []byte("bgcolor"), // [Deprecated] + []byte("border"), // [Deprecated] + []byte("cellpadding"), // [Deprecated] + []byte("cellspacing"), // [Deprecated] + []byte("frame"), // [Deprecated] + []byte("rules"), // [Deprecated] + []byte("summary"), // [Deprecated] + []byte("width"), // [Deprecated] +) + +func (r *TableHTMLRenderer) renderTable( + w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) { + if entering { + _, _ = w.WriteString("\n") + } else { + _, _ = w.WriteString("\n") + } + return gast.WalkContinue, nil +} + +// TableHeaderAttributeFilter defines attribute names which elements can have. +var TableHeaderAttributeFilter = html.GlobalAttributeFilter.Extend( + []byte("align"), // [Deprecated since HTML4] [Obsolete since HTML5] + []byte("bgcolor"), // [Not Standardized] + []byte("char"), // [Deprecated since HTML4] [Obsolete since HTML5] + []byte("charoff"), // [Deprecated since HTML4] [Obsolete since HTML5] + []byte("valign"), // [Deprecated since HTML4] [Obsolete since HTML5] +) + +func (r *TableHTMLRenderer) renderTableHeader( + w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) { + if entering { + _, _ = w.WriteString("\n") + _, _ = w.WriteString("\n") // Header has no separate handle + } else { + _, _ = w.WriteString("\n") + _, _ = w.WriteString("\n") + if n.NextSibling() != nil { + _, _ = w.WriteString("\n") + } + } + return gast.WalkContinue, nil +} + +// TableRowAttributeFilter defines attribute names which elements can have. +var TableRowAttributeFilter = html.GlobalAttributeFilter.Extend( + []byte("align"), // [Obsolete since HTML5] + []byte("bgcolor"), // [Obsolete since HTML5] + []byte("char"), // [Obsolete since HTML5] + []byte("charoff"), // [Obsolete since HTML5] + []byte("valign"), // [Obsolete since HTML5] +) + +func (r *TableHTMLRenderer) renderTableRow( + w util.BufWriter, source []byte, n gast.Node, entering bool) (gast.WalkStatus, error) { + if entering { + _, _ = w.WriteString("\n") + } else { + _, _ = w.WriteString("\n") + if n.Parent().LastChild() == n { + _, _ = w.WriteString("\n") + } + } + return gast.WalkContinue, nil +} + +// TableThCellAttributeFilter defines attribute names which table cells can have. +var TableThCellAttributeFilter = html.GlobalAttributeFilter.Extend( + []byte("abbr"), // [OK] Contains a short abbreviated description of the cell's content [NOT OK in ] + + []byte("align"), // [Obsolete since HTML5] + []byte("axis"), // [Obsolete since HTML5] + []byte("bgcolor"), // [Not Standardized] + []byte("char"), // [Obsolete since HTML5] + []byte("charoff"), // [Obsolete since HTML5] + + []byte("colspan"), // [OK] Number of columns that the cell is to span + []byte("headers"), // [OK] This attribute contains a list of space-separated + // strings, each corresponding to the id attribute of the elements that apply to this element + + []byte("height"), // [Deprecated since HTML4] [Obsolete since HTML5] + + []byte("rowspan"), // [OK] Number of rows that the cell is to span + []byte("scope"), // [OK] This enumerated attribute defines the cells that + // the header (defined in the ) element relates to [NOT OK in ] + + []byte("valign"), // [Obsolete since HTML5] + []byte("width"), // [Deprecated since HTML4] [Obsolete since HTML5] +) + +// TableTdCellAttributeFilter defines attribute names which table cells can have. +var TableTdCellAttributeFilter = html.GlobalAttributeFilter.Extend( + []byte("abbr"), // [Obsolete since HTML5] [OK in ] + []byte("align"), // [Obsolete since HTML5] + []byte("axis"), // [Obsolete since HTML5] + []byte("bgcolor"), // [Not Standardized] + []byte("char"), // [Obsolete since HTML5] + []byte("charoff"), // [Obsolete since HTML5] + + []byte("colspan"), // [OK] Number of columns that the cell is to span + []byte("headers"), // [OK] This attribute contains a list of space-separated + // strings, each corresponding to the id attribute of the elements that apply to this element + + []byte("height"), // [Deprecated since HTML4] [Obsolete since HTML5] + + []byte("rowspan"), // [OK] Number of rows that the cell is to span + + []byte("scope"), // [Obsolete since HTML5] [OK in ] + []byte("valign"), // [Obsolete since HTML5] + []byte("width"), // [Deprecated since HTML4] [Obsolete since HTML5] +) + +func (r *TableHTMLRenderer) renderTableCell( + w util.BufWriter, source []byte, node gast.Node, entering bool) (gast.WalkStatus, error) { + n := node.(*ast.TableCell) + tag := "td" + if n.Parent().Kind() == ast.KindTableHeader { + tag = "th" + } + if entering { + _, _ = fmt.Fprintf(w, "<%s", tag) + if n.Alignment != ast.AlignNone { + amethod := r.TableConfig.TableCellAlignMethod + if amethod == TableCellAlignDefault { + if r.Config.XHTML { + amethod = TableCellAlignAttribute + } else { + amethod = TableCellAlignStyle + } + } + switch amethod { + case TableCellAlignAttribute: + if _, ok := n.AttributeString("align"); !ok { // Skip align render if overridden + _, _ = fmt.Fprintf(w, ` align="%s"`, n.Alignment.String()) + } + case TableCellAlignStyle: + v, ok := n.AttributeString("style") + var cob util.CopyOnWriteBuffer + if ok { + cob = util.NewCopyOnWriteBuffer(v.([]byte)) + cob.AppendByte(';') + } + style := fmt.Sprintf("text-align:%s", n.Alignment.String()) + cob.AppendString(style) + n.SetAttributeString("style", cob.Bytes()) + } + } + if n.Attributes() != nil { + if tag == "td" { + html.RenderAttributes(w, n, TableTdCellAttributeFilter) // + } else { + html.RenderAttributes(w, n, TableThCellAttributeFilter) // + } + } + _ = w.WriteByte('>') + } else { + _, _ = fmt.Fprintf(w, "\n", tag) + } + return gast.WalkContinue, nil +} + +type table struct { + options []TableOption +} + +// Table is an extension that allow you to use GFM tables . +var Table = &table{ + options: []TableOption{}, +} + +// NewTable returns a new extension with given options. +func NewTable(opts ...TableOption) goldmark.Extender { + return &table{ + options: opts, + } +} + +func (e *table) Extend(m goldmark.Markdown) { + m.Parser().AddOptions( + parser.WithParagraphTransformers( + util.Prioritized(NewTableParagraphTransformer(), 200), + ), + parser.WithASTTransformers( + util.Prioritized(defaultTableASTTransformer, 0), + ), + ) + m.Renderer().AddOptions(renderer.WithNodeRenderers( + util.Prioritized(NewTableHTMLRenderer(e.options...), 500), + )) +} diff --git a/vendor/github.com/yuin/goldmark/extension/tasklist.go b/vendor/github.com/yuin/goldmark/extension/tasklist.go new file mode 100644 index 0000000..4467ebf --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/tasklist.go @@ -0,0 +1,120 @@ +package extension + +import ( + "regexp" + + "github.com/yuin/goldmark" + gast "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/extension/ast" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/renderer/html" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +var taskListRegexp = regexp.MustCompile(`^\[([\sxX])\]\s*`) + +type taskCheckBoxParser struct { +} + +var defaultTaskCheckBoxParser = &taskCheckBoxParser{} + +// NewTaskCheckBoxParser returns a new InlineParser that can parse +// checkboxes in list items. +// This parser must take precedence over the parser.LinkParser. +func NewTaskCheckBoxParser() parser.InlineParser { + return defaultTaskCheckBoxParser +} + +func (s *taskCheckBoxParser) Trigger() []byte { + return []byte{'['} +} + +func (s *taskCheckBoxParser) Parse(parent gast.Node, block text.Reader, pc parser.Context) gast.Node { + // Given AST structure must be like + // - List + // - ListItem : parent.Parent + // - TextBlock : parent + // (current line) + if parent.Parent() == nil || parent.Parent().FirstChild() != parent { + return nil + } + + if parent.HasChildren() { + return nil + } + if _, ok := parent.Parent().(*gast.ListItem); !ok { + return nil + } + line, _ := block.PeekLine() + m := taskListRegexp.FindSubmatchIndex(line) + if m == nil { + return nil + } + value := line[m[2]:m[3]][0] + block.Advance(m[1]) + checked := value == 'x' || value == 'X' + return ast.NewTaskCheckBox(checked) +} + +func (s *taskCheckBoxParser) CloseBlock(parent gast.Node, pc parser.Context) { + // nothing to do +} + +// TaskCheckBoxHTMLRenderer is a renderer.NodeRenderer implementation that +// renders checkboxes in list items. +type TaskCheckBoxHTMLRenderer struct { + html.Config +} + +// NewTaskCheckBoxHTMLRenderer returns a new TaskCheckBoxHTMLRenderer. +func NewTaskCheckBoxHTMLRenderer(opts ...html.Option) renderer.NodeRenderer { + r := &TaskCheckBoxHTMLRenderer{ + Config: html.NewConfig(), + } + for _, opt := range opts { + opt.SetHTMLOption(&r.Config) + } + return r +} + +// RegisterFuncs implements renderer.NodeRenderer.RegisterFuncs. +func (r *TaskCheckBoxHTMLRenderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { + reg.Register(ast.KindTaskCheckBox, r.renderTaskCheckBox) +} + +func (r *TaskCheckBoxHTMLRenderer) renderTaskCheckBox( + w util.BufWriter, source []byte, node gast.Node, entering bool) (gast.WalkStatus, error) { + if !entering { + return gast.WalkContinue, nil + } + n := node.(*ast.TaskCheckBox) + + if n.IsChecked { + _, _ = w.WriteString(` ") + } else { + _, _ = w.WriteString("> ") + } + return gast.WalkContinue, nil +} + +type taskList struct { +} + +// TaskList is an extension that allow you to use GFM task lists. +var TaskList = &taskList{} + +func (e *taskList) Extend(m goldmark.Markdown) { + m.Parser().AddOptions(parser.WithInlineParsers( + util.Prioritized(NewTaskCheckBoxParser(), 0), + )) + m.Renderer().AddOptions(renderer.WithNodeRenderers( + util.Prioritized(NewTaskCheckBoxHTMLRenderer(), 500), + )) +} diff --git a/vendor/github.com/yuin/goldmark/extension/typographer.go b/vendor/github.com/yuin/goldmark/extension/typographer.go new file mode 100644 index 0000000..44c15eb --- /dev/null +++ b/vendor/github.com/yuin/goldmark/extension/typographer.go @@ -0,0 +1,348 @@ +package extension + +import ( + "unicode" + + "github.com/yuin/goldmark" + gast "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +var uncloseCounterKey = parser.NewContextKey() + +type unclosedCounter struct { + Single int + Double int +} + +func (u *unclosedCounter) Reset() { + u.Single = 0 + u.Double = 0 +} + +func getUnclosedCounter(pc parser.Context) *unclosedCounter { + v := pc.Get(uncloseCounterKey) + if v == nil { + v = &unclosedCounter{} + pc.Set(uncloseCounterKey, v) + } + return v.(*unclosedCounter) +} + +// TypographicPunctuation is a key of the punctuations that can be replaced with +// typographic entities. +type TypographicPunctuation int + +const ( + // LeftSingleQuote is ' . + LeftSingleQuote TypographicPunctuation = iota + 1 + // RightSingleQuote is ' . + RightSingleQuote + // LeftDoubleQuote is " . + LeftDoubleQuote + // RightDoubleQuote is " . + RightDoubleQuote + // EnDash is -- . + EnDash + // EmDash is --- . + EmDash + // Ellipsis is ... . + Ellipsis + // LeftAngleQuote is << . + LeftAngleQuote + // RightAngleQuote is >> . + RightAngleQuote + // Apostrophe is ' . + Apostrophe + + typographicPunctuationMax +) + +// An TypographerConfig struct is a data structure that holds configuration of the +// Typographer extension. +type TypographerConfig struct { + Substitutions [][]byte +} + +func newDefaultSubstitutions() [][]byte { + replacements := make([][]byte, typographicPunctuationMax) + replacements[LeftSingleQuote] = []byte("‘") + replacements[RightSingleQuote] = []byte("’") + replacements[LeftDoubleQuote] = []byte("“") + replacements[RightDoubleQuote] = []byte("”") + replacements[EnDash] = []byte("–") + replacements[EmDash] = []byte("—") + replacements[Ellipsis] = []byte("…") + replacements[LeftAngleQuote] = []byte("«") + replacements[RightAngleQuote] = []byte("»") + replacements[Apostrophe] = []byte("’") + + return replacements +} + +// SetOption implements SetOptioner. +func (b *TypographerConfig) SetOption(name parser.OptionName, value interface{}) { + switch name { + case optTypographicSubstitutions: + b.Substitutions = value.([][]byte) + } +} + +// A TypographerOption interface sets options for the TypographerParser. +type TypographerOption interface { + parser.Option + SetTypographerOption(*TypographerConfig) +} + +const optTypographicSubstitutions parser.OptionName = "TypographicSubstitutions" + +// TypographicSubstitutions is a list of the substitutions for the Typographer extension. +type TypographicSubstitutions map[TypographicPunctuation][]byte + +type withTypographicSubstitutions struct { + value [][]byte +} + +func (o *withTypographicSubstitutions) SetParserOption(c *parser.Config) { + c.Options[optTypographicSubstitutions] = o.value +} + +func (o *withTypographicSubstitutions) SetTypographerOption(p *TypographerConfig) { + p.Substitutions = o.value +} + +// WithTypographicSubstitutions is a functional otpion that specify replacement text +// for punctuations. +func WithTypographicSubstitutions[T []byte | string](values map[TypographicPunctuation]T) TypographerOption { + replacements := newDefaultSubstitutions() + for k, v := range values { + replacements[k] = []byte(v) + } + + return &withTypographicSubstitutions{replacements} +} + +type typographerDelimiterProcessor struct { +} + +func (p *typographerDelimiterProcessor) IsDelimiter(b byte) bool { + return b == '\'' || b == '"' +} + +func (p *typographerDelimiterProcessor) CanOpenCloser(opener, closer *parser.Delimiter) bool { + return opener.Char == closer.Char +} + +func (p *typographerDelimiterProcessor) OnMatch(consumes int) gast.Node { + return nil +} + +var defaultTypographerDelimiterProcessor = &typographerDelimiterProcessor{} + +type typographerParser struct { + TypographerConfig +} + +// NewTypographerParser return a new InlineParser that parses +// typographer expressions. +func NewTypographerParser(opts ...TypographerOption) parser.InlineParser { + p := &typographerParser{ + TypographerConfig: TypographerConfig{ + Substitutions: newDefaultSubstitutions(), + }, + } + for _, o := range opts { + o.SetTypographerOption(&p.TypographerConfig) + } + return p +} + +func (s *typographerParser) Trigger() []byte { + return []byte{'\'', '"', '-', '.', ',', '<', '>', '*', '['} +} + +func (s *typographerParser) Parse(parent gast.Node, block text.Reader, pc parser.Context) gast.Node { + line, _ := block.PeekLine() + c := line[0] + if len(line) > 2 { + if c == '-' { + if s.Substitutions[EmDash] != nil && line[1] == '-' && line[2] == '-' { // --- + node := gast.NewString(s.Substitutions[EmDash]) + node.SetCode(true) + block.Advance(3) + return node + } + } else if c == '.' { + if s.Substitutions[Ellipsis] != nil && line[1] == '.' && line[2] == '.' { // ... + node := gast.NewString(s.Substitutions[Ellipsis]) + node.SetCode(true) + block.Advance(3) + return node + } + return nil + } + } + if len(line) > 1 { + if c == '<' { + if s.Substitutions[LeftAngleQuote] != nil && line[1] == '<' { // << + node := gast.NewString(s.Substitutions[LeftAngleQuote]) + node.SetCode(true) + block.Advance(2) + return node + } + return nil + } else if c == '>' { + if s.Substitutions[RightAngleQuote] != nil && line[1] == '>' { // >> + node := gast.NewString(s.Substitutions[RightAngleQuote]) + node.SetCode(true) + block.Advance(2) + return node + } + return nil + } else if s.Substitutions[EnDash] != nil && c == '-' && line[1] == '-' { // -- + node := gast.NewString(s.Substitutions[EnDash]) + node.SetCode(true) + block.Advance(2) + return node + } + } + if c == '\'' || c == '"' { + before := block.PrecendingCharacter() + d := parser.ScanDelimiter(line, before, 1, defaultTypographerDelimiterProcessor) + if d == nil { + return nil + } + counter := getUnclosedCounter(pc) + if c == '\'' { + if s.Substitutions[Apostrophe] != nil { + // Handle decade abbrevations such as '90s + if d.CanOpen && !d.CanClose && len(line) > 3 && + util.IsNumeric(line[1]) && util.IsNumeric(line[2]) && line[3] == 's' { + after := rune(' ') + if len(line) > 4 { + after = util.ToRune(line, 4) + } + if len(line) == 3 || util.IsSpaceRune(after) || util.IsPunctRune(after) { + node := gast.NewString(s.Substitutions[Apostrophe]) + node.SetCode(true) + block.Advance(1) + return node + } + } + // special cases: 'twas, 'em, 'net + if len(line) > 1 && (unicode.IsPunct(before) || unicode.IsSpace(before)) && + (line[1] == 't' || line[1] == 'e' || line[1] == 'n' || line[1] == 'l') { + node := gast.NewString(s.Substitutions[Apostrophe]) + node.SetCode(true) + block.Advance(1) + return node + } + // Convert normal apostrophes. This is probably more flexible than necessary but + // converts any apostrophe in between two alphanumerics. + if len(line) > 1 && (unicode.IsDigit(before) || unicode.IsLetter(before)) && + (unicode.IsLetter(util.ToRune(line, 1))) { + node := gast.NewString(s.Substitutions[Apostrophe]) + node.SetCode(true) + block.Advance(1) + return node + } + } + if s.Substitutions[LeftSingleQuote] != nil && d.CanOpen && !d.CanClose { + nt := LeftSingleQuote + // special cases: Alice's, I'm, Don't, You'd + if len(line) > 1 && (line[1] == 's' || line[1] == 'm' || line[1] == 't' || line[1] == 'd') && + (len(line) < 3 || util.IsPunct(line[2]) || util.IsSpace(line[2])) { + nt = RightSingleQuote + } + // special cases: I've, I'll, You're + if len(line) > 2 && ((line[1] == 'v' && line[2] == 'e') || + (line[1] == 'l' && line[2] == 'l') || (line[1] == 'r' && line[2] == 'e')) && + (len(line) < 4 || util.IsPunct(line[3]) || util.IsSpace(line[3])) { + nt = RightSingleQuote + } + if nt == LeftSingleQuote { + counter.Single++ + } + + node := gast.NewString(s.Substitutions[nt]) + node.SetCode(true) + block.Advance(1) + return node + } + if s.Substitutions[RightSingleQuote] != nil { + // plural possesive and abbreviations: Smiths', doin' + if len(line) > 1 && unicode.IsSpace(util.ToRune(line, 0)) || unicode.IsPunct(util.ToRune(line, 0)) && + (len(line) > 2 && !unicode.IsDigit(util.ToRune(line, 1))) { + node := gast.NewString(s.Substitutions[RightSingleQuote]) + node.SetCode(true) + block.Advance(1) + return node + } + } + if s.Substitutions[RightSingleQuote] != nil && counter.Single > 0 { + isClose := d.CanClose && !d.CanOpen + maybeClose := d.CanClose && d.CanOpen && len(line) > 1 && unicode.IsPunct(util.ToRune(line, 1)) && + (len(line) == 2 || (len(line) > 2 && util.IsPunct(line[2]) || util.IsSpace(line[2]))) + if isClose || maybeClose { + node := gast.NewString(s.Substitutions[RightSingleQuote]) + node.SetCode(true) + block.Advance(1) + counter.Single-- + return node + } + } + } + if c == '"' { + if s.Substitutions[LeftDoubleQuote] != nil && d.CanOpen && !d.CanClose { + node := gast.NewString(s.Substitutions[LeftDoubleQuote]) + node.SetCode(true) + block.Advance(1) + counter.Double++ + return node + } + if s.Substitutions[RightDoubleQuote] != nil && counter.Double > 0 { + isClose := d.CanClose && !d.CanOpen + maybeClose := d.CanClose && d.CanOpen && len(line) > 1 && (unicode.IsPunct(util.ToRune(line, 1))) && + (len(line) == 2 || (len(line) > 2 && util.IsPunct(line[2]) || util.IsSpace(line[2]))) + if isClose || maybeClose { + // special case: "Monitor 21"" + if len(line) > 1 && line[1] == '"' && unicode.IsDigit(before) { + return nil + } + node := gast.NewString(s.Substitutions[RightDoubleQuote]) + node.SetCode(true) + block.Advance(1) + counter.Double-- + return node + } + } + } + } + return nil +} + +func (s *typographerParser) CloseBlock(parent gast.Node, pc parser.Context) { + getUnclosedCounter(pc).Reset() +} + +type typographer struct { + options []TypographerOption +} + +// Typographer is an extension that replaces punctuations with typographic entities. +var Typographer = &typographer{} + +// NewTypographer returns a new Extender that replaces punctuations with typographic entities. +func NewTypographer(opts ...TypographerOption) goldmark.Extender { + return &typographer{ + options: opts, + } +} + +func (e *typographer) Extend(m goldmark.Markdown) { + m.Parser().AddOptions(parser.WithInlineParsers( + util.Prioritized(NewTypographerParser(e.options...), 9999), + )) +} diff --git a/vendor/github.com/yuin/goldmark/markdown.go b/vendor/github.com/yuin/goldmark/markdown.go new file mode 100644 index 0000000..8ebaa5a --- /dev/null +++ b/vendor/github.com/yuin/goldmark/markdown.go @@ -0,0 +1,141 @@ +// Package goldmark implements functions to convert markdown text to a desired format. +package goldmark + +import ( + "io" + + "github.com/yuin/goldmark/parser" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/renderer/html" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +// DefaultParser returns a new Parser that is configured by default values. +func DefaultParser() parser.Parser { + return parser.NewParser(parser.WithBlockParsers(parser.DefaultBlockParsers()...), + parser.WithInlineParsers(parser.DefaultInlineParsers()...), + parser.WithParagraphTransformers(parser.DefaultParagraphTransformers()...), + ) +} + +// DefaultRenderer returns a new Renderer that is configured by default values. +func DefaultRenderer() renderer.Renderer { + return renderer.NewRenderer(renderer.WithNodeRenderers(util.Prioritized(html.NewRenderer(), 1000))) +} + +var defaultMarkdown = New() + +// Convert interprets a UTF-8 bytes source in Markdown and +// write rendered contents to a writer w. +func Convert(source []byte, w io.Writer, opts ...parser.ParseOption) error { + return defaultMarkdown.Convert(source, w, opts...) +} + +// A Markdown interface offers functions to convert Markdown text to +// a desired format. +type Markdown interface { + // Convert interprets a UTF-8 bytes source in Markdown and write rendered + // contents to a writer w. + Convert(source []byte, writer io.Writer, opts ...parser.ParseOption) error + + // Parser returns a Parser that will be used for conversion. + Parser() parser.Parser + + // SetParser sets a Parser to this object. + SetParser(parser.Parser) + + // Parser returns a Renderer that will be used for conversion. + Renderer() renderer.Renderer + + // SetRenderer sets a Renderer to this object. + SetRenderer(renderer.Renderer) +} + +// Option is a functional option type for Markdown objects. +type Option func(*markdown) + +// WithExtensions adds extensions. +func WithExtensions(ext ...Extender) Option { + return func(m *markdown) { + m.extensions = append(m.extensions, ext...) + } +} + +// WithParser allows you to override the default parser. +func WithParser(p parser.Parser) Option { + return func(m *markdown) { + m.parser = p + } +} + +// WithParserOptions applies options for the parser. +func WithParserOptions(opts ...parser.Option) Option { + return func(m *markdown) { + m.parser.AddOptions(opts...) + } +} + +// WithRenderer allows you to override the default renderer. +func WithRenderer(r renderer.Renderer) Option { + return func(m *markdown) { + m.renderer = r + } +} + +// WithRendererOptions applies options for the renderer. +func WithRendererOptions(opts ...renderer.Option) Option { + return func(m *markdown) { + m.renderer.AddOptions(opts...) + } +} + +type markdown struct { + parser parser.Parser + renderer renderer.Renderer + extensions []Extender +} + +// New returns a new Markdown with given options. +func New(options ...Option) Markdown { + md := &markdown{ + parser: DefaultParser(), + renderer: DefaultRenderer(), + extensions: []Extender{}, + } + for _, opt := range options { + opt(md) + } + for _, e := range md.extensions { + e.Extend(md) + } + return md +} + +func (m *markdown) Convert(source []byte, writer io.Writer, opts ...parser.ParseOption) error { + reader := text.NewReader(source) + doc := m.parser.Parse(reader, opts...) + return m.renderer.Render(writer, source, doc) +} + +func (m *markdown) Parser() parser.Parser { + return m.parser +} + +func (m *markdown) SetParser(v parser.Parser) { + m.parser = v +} + +func (m *markdown) Renderer() renderer.Renderer { + return m.renderer +} + +func (m *markdown) SetRenderer(v renderer.Renderer) { + m.renderer = v +} + +// An Extender interface is used for extending Markdown. +type Extender interface { + // Extend extends the Markdown. + Extend(Markdown) +} diff --git a/vendor/github.com/yuin/goldmark/parser/attribute.go b/vendor/github.com/yuin/goldmark/parser/attribute.go new file mode 100644 index 0000000..42985f4 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/attribute.go @@ -0,0 +1,329 @@ +package parser + +import ( + "bytes" + "io" + "strconv" + + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +var attrNameID = []byte("id") +var attrNameClass = []byte("class") + +// An Attribute is an attribute of the markdown elements. +type Attribute struct { + Name []byte + Value interface{} +} + +// An Attributes is a collection of attributes. +type Attributes []Attribute + +// Find returns a (value, true) if an attribute correspond with given name is found, otherwise (nil, false). +func (as Attributes) Find(name []byte) (interface{}, bool) { + for _, a := range as { + if bytes.Equal(a.Name, name) { + return a.Value, true + } + } + return nil, false +} + +func (as Attributes) findUpdate(name []byte, cb func(v interface{}) interface{}) bool { + for i, a := range as { + if bytes.Equal(a.Name, name) { + as[i].Value = cb(a.Value) + return true + } + } + return false +} + +// ParseAttributes parses attributes into a map. +// ParseAttributes returns a parsed attributes and true if could parse +// attributes, otherwise nil and false. +func ParseAttributes(reader text.Reader) (Attributes, bool) { + savedLine, savedPosition := reader.Position() + reader.SkipSpaces() + if reader.Peek() != '{' { + reader.SetPosition(savedLine, savedPosition) + return nil, false + } + reader.Advance(1) + attrs := Attributes{} + for { + if reader.Peek() == '}' { + reader.Advance(1) + return attrs, true + } + attr, ok := parseAttribute(reader) + if !ok { + reader.SetPosition(savedLine, savedPosition) + return nil, false + } + if bytes.Equal(attr.Name, attrNameClass) { + if !attrs.findUpdate(attrNameClass, func(v interface{}) interface{} { + ret := make([]byte, 0, len(v.([]byte))+1+len(attr.Value.([]byte))) + ret = append(ret, v.([]byte)...) + return append(append(ret, ' '), attr.Value.([]byte)...) + }) { + attrs = append(attrs, attr) + } + } else { + attrs = append(attrs, attr) + } + reader.SkipSpaces() + if reader.Peek() == ',' { + reader.Advance(1) + reader.SkipSpaces() + } + } +} + +func parseAttribute(reader text.Reader) (Attribute, bool) { + reader.SkipSpaces() + c := reader.Peek() + if c == '#' || c == '.' { + reader.Advance(1) + line, _ := reader.PeekLine() + i := 0 + // HTML5 allows any kind of characters as id, but XHTML restricts characters for id. + // CommonMark is basically defined for XHTML(even though it is legacy). + // So we restrict id characters. + for ; i < len(line) && !util.IsSpace(line[i]) && + (!util.IsPunct(line[i]) || line[i] == '_' || + line[i] == '-' || line[i] == ':' || line[i] == '.'); i++ { + } + name := attrNameClass + if c == '#' { + name = attrNameID + } + reader.Advance(i) + return Attribute{Name: name, Value: line[0:i]}, true + } + line, _ := reader.PeekLine() + if len(line) == 0 { + return Attribute{}, false + } + c = line[0] + if !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || + c == '_' || c == ':') { + return Attribute{}, false + } + i := 0 + for ; i < len(line); i++ { + c = line[i] + if !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || + c == '_' || c == ':' || c == '.' || c == '-') { + break + } + } + name := line[:i] + reader.Advance(i) + reader.SkipSpaces() + c = reader.Peek() + if c != '=' { + return Attribute{}, false + } + reader.Advance(1) + reader.SkipSpaces() + value, ok := parseAttributeValue(reader) + if !ok { + return Attribute{}, false + } + if bytes.Equal(name, attrNameClass) { + if _, ok = value.([]byte); !ok { + return Attribute{}, false + } + } + return Attribute{Name: name, Value: value}, true +} + +func parseAttributeValue(reader text.Reader) (interface{}, bool) { + reader.SkipSpaces() + c := reader.Peek() + var value interface{} + var ok bool + switch c { + case text.EOF: + return Attribute{}, false + case '{': + value, ok = ParseAttributes(reader) + case '[': + value, ok = parseAttributeArray(reader) + case '"': + value, ok = parseAttributeString(reader) + default: + if c == '-' || c == '+' || util.IsNumeric(c) { + value, ok = parseAttributeNumber(reader) + } else { + value, ok = parseAttributeOthers(reader) + } + } + if !ok { + return nil, false + } + return value, true +} + +func parseAttributeArray(reader text.Reader) ([]interface{}, bool) { + reader.Advance(1) // skip [ + ret := []interface{}{} + for i := 0; ; i++ { + c := reader.Peek() + comma := false + if i != 0 && c == ',' { + reader.Advance(1) + comma = true + } + if c == ']' { + if !comma { + reader.Advance(1) + return ret, true + } + return nil, false + } + reader.SkipSpaces() + value, ok := parseAttributeValue(reader) + if !ok { + return nil, false + } + ret = append(ret, value) + reader.SkipSpaces() + } +} + +func parseAttributeString(reader text.Reader) ([]byte, bool) { + reader.Advance(1) // skip " + line, _ := reader.PeekLine() + i := 0 + l := len(line) + var buf bytes.Buffer + for i < l { + c := line[i] + if c == '\\' && i != l-1 { + n := line[i+1] + switch n { + case '"', '/', '\\': + buf.WriteByte(n) + i += 2 + case 'b': + buf.WriteString("\b") + i += 2 + case 'f': + buf.WriteString("\f") + i += 2 + case 'n': + buf.WriteString("\n") + i += 2 + case 'r': + buf.WriteString("\r") + i += 2 + case 't': + buf.WriteString("\t") + i += 2 + default: + buf.WriteByte('\\') + i++ + } + continue + } + if c == '"' { + reader.Advance(i + 1) + return buf.Bytes(), true + } + buf.WriteByte(c) + i++ + } + return nil, false +} + +func scanAttributeDecimal(reader text.Reader, w io.ByteWriter) { + for { + c := reader.Peek() + if util.IsNumeric(c) { + _ = w.WriteByte(c) + } else { + return + } + reader.Advance(1) + } +} + +func parseAttributeNumber(reader text.Reader) (float64, bool) { + sign := 1 + c := reader.Peek() + if c == '-' { + sign = -1 + reader.Advance(1) + } else if c == '+' { + reader.Advance(1) + } + var buf bytes.Buffer + if !util.IsNumeric(reader.Peek()) { + return 0, false + } + scanAttributeDecimal(reader, &buf) + if buf.Len() == 0 { + return 0, false + } + c = reader.Peek() + if c == '.' { + buf.WriteByte(c) + reader.Advance(1) + scanAttributeDecimal(reader, &buf) + } + c = reader.Peek() + if c == 'e' || c == 'E' { + buf.WriteByte(c) + reader.Advance(1) + c = reader.Peek() + if c == '-' || c == '+' { + buf.WriteByte(c) + reader.Advance(1) + } + scanAttributeDecimal(reader, &buf) + } + f, err := strconv.ParseFloat(buf.String(), 64) + if err != nil { + return 0, false + } + return float64(sign) * f, true +} + +var bytesTrue = []byte("true") +var bytesFalse = []byte("false") +var bytesNull = []byte("null") + +func parseAttributeOthers(reader text.Reader) (interface{}, bool) { + line, _ := reader.PeekLine() + c := line[0] + if !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || + c == '_' || c == ':') { + return nil, false + } + i := 0 + for ; i < len(line); i++ { + c := line[i] + if !((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || + (c >= '0' && c <= '9') || + c == '_' || c == ':' || c == '.' || c == '-') { + break + } + } + value := line[:i] + reader.Advance(i) + if bytes.Equal(value, bytesTrue) { + return true, true + } + if bytes.Equal(value, bytesFalse) { + return false, true + } + if bytes.Equal(value, bytesNull) { + return nil, true + } + return value, true +} diff --git a/vendor/github.com/yuin/goldmark/parser/atx_heading.go b/vendor/github.com/yuin/goldmark/parser/atx_heading.go new file mode 100644 index 0000000..dae5e84 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/atx_heading.go @@ -0,0 +1,248 @@ +package parser + +import ( + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +// A HeadingConfig struct is a data structure that holds configuration of the renderers related to headings. +type HeadingConfig struct { + AutoHeadingID bool + Attribute bool +} + +// SetOption implements SetOptioner. +func (b *HeadingConfig) SetOption(name OptionName, _ interface{}) { + switch name { + case optAutoHeadingID: + b.AutoHeadingID = true + case optAttribute: + b.Attribute = true + } +} + +// A HeadingOption interface sets options for heading parsers. +type HeadingOption interface { + Option + SetHeadingOption(*HeadingConfig) +} + +// AutoHeadingID is an option name that enables auto IDs for headings. +const optAutoHeadingID OptionName = "AutoHeadingID" + +type withAutoHeadingID struct { +} + +func (o *withAutoHeadingID) SetParserOption(c *Config) { + c.Options[optAutoHeadingID] = true +} + +func (o *withAutoHeadingID) SetHeadingOption(p *HeadingConfig) { + p.AutoHeadingID = true +} + +// WithAutoHeadingID is a functional option that enables custom heading ids and +// auto generated heading ids. +func WithAutoHeadingID() HeadingOption { + return &withAutoHeadingID{} +} + +type withHeadingAttribute struct { + Option +} + +func (o *withHeadingAttribute) SetHeadingOption(p *HeadingConfig) { + p.Attribute = true +} + +// WithHeadingAttribute is a functional option that enables custom heading attributes. +func WithHeadingAttribute() HeadingOption { + return &withHeadingAttribute{WithAttribute()} +} + +type atxHeadingParser struct { + HeadingConfig +} + +// NewATXHeadingParser return a new BlockParser that can parse ATX headings. +func NewATXHeadingParser(opts ...HeadingOption) BlockParser { + p := &atxHeadingParser{} + for _, o := range opts { + o.SetHeadingOption(&p.HeadingConfig) + } + return p +} + +func (b *atxHeadingParser) Trigger() []byte { + return []byte{'#'} +} + +func (b *atxHeadingParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { + line, segment := reader.PeekLine() + pos := pc.BlockOffset() + if pos < 0 { + return nil, NoChildren + } + i := pos + for ; i < len(line) && line[i] == '#'; i++ { + } + level := i - pos + if i == pos || level > 6 { + return nil, NoChildren + } + if i == len(line) { // alone '#' (without a new line character) + return ast.NewHeading(level), NoChildren + } + l := util.TrimLeftSpaceLength(line[i:]) + if l == 0 { + return nil, NoChildren + } + start := i + l + if start >= len(line) { + start = len(line) - 1 + } + origstart := start + stop := len(line) - util.TrimRightSpaceLength(line) + + node := ast.NewHeading(level) + parsed := false + if b.Attribute { // handles special case like ### heading ### {#id} + start-- + closureClose := -1 + closureOpen := -1 + for j := start; j < stop; { + c := line[j] + if util.IsEscapedPunctuation(line, j) { + j += 2 + } else if util.IsSpace(c) && j < stop-1 && line[j+1] == '#' { + closureOpen = j + 1 + k := j + 1 + for ; k < stop && line[k] == '#'; k++ { + } + closureClose = k + break + } else { + j++ + } + } + if closureClose > 0 { + reader.Advance(closureClose) + attrs, ok := ParseAttributes(reader) + rest, _ := reader.PeekLine() + parsed = ok && util.IsBlank(rest) + if parsed { + for _, attr := range attrs { + node.SetAttribute(attr.Name, attr.Value) + } + node.Lines().Append(text.NewSegment( + segment.Start+start+1-segment.Padding, + segment.Start+closureOpen-segment.Padding)) + } + } + } + if !parsed { + start = origstart + stop := len(line) - util.TrimRightSpaceLength(line) + if stop <= start { // empty headings like '##[space]' + stop = start + } else { + i = stop - 1 + for ; line[i] == '#' && i >= start; i-- { + } + if i != stop-1 && !util.IsSpace(line[i]) { + i = stop - 1 + } + i++ + stop = i + } + + if len(util.TrimRight(line[start:stop], []byte{'#'})) != 0 { // empty heading like '### ###' + node.Lines().Append(text.NewSegment(segment.Start+start-segment.Padding, segment.Start+stop-segment.Padding)) + } + } + return node, NoChildren +} + +func (b *atxHeadingParser) Continue(node ast.Node, reader text.Reader, pc Context) State { + return Close +} + +func (b *atxHeadingParser) Close(node ast.Node, reader text.Reader, pc Context) { + if b.Attribute { + _, ok := node.AttributeString("id") + if !ok { + parseLastLineAttributes(node, reader, pc) + } + } + + if b.AutoHeadingID { + id, ok := node.AttributeString("id") + if !ok { + generateAutoHeadingID(node.(*ast.Heading), reader, pc) + } else { + pc.IDs().Put(id.([]byte)) + } + } +} + +func (b *atxHeadingParser) CanInterruptParagraph() bool { + return true +} + +func (b *atxHeadingParser) CanAcceptIndentedLine() bool { + return false +} + +func generateAutoHeadingID(node *ast.Heading, reader text.Reader, pc Context) { + var line []byte + lastIndex := node.Lines().Len() - 1 + if lastIndex > -1 { + lastLine := node.Lines().At(lastIndex) + line = lastLine.Value(reader.Source()) + } + headingID := pc.IDs().Generate(line, ast.KindHeading) + node.SetAttribute(attrNameID, headingID) +} + +func parseLastLineAttributes(node ast.Node, reader text.Reader, pc Context) { + lastIndex := node.Lines().Len() - 1 + if lastIndex < 0 { // empty headings + return + } + lastLine := node.Lines().At(lastIndex) + line := lastLine.Value(reader.Source()) + lr := text.NewReader(line) + var attrs Attributes + var ok bool + var start text.Segment + var sl int + var end text.Segment + for { + c := lr.Peek() + if c == text.EOF { + break + } + if c == '\\' { + lr.Advance(1) + if lr.Peek() == '{' { + lr.Advance(1) + } + continue + } + if c == '{' { + sl, start = lr.Position() + attrs, ok = ParseAttributes(lr) + _, end = lr.Position() + lr.SetPosition(sl, start) + } + lr.Advance(1) + } + if ok && util.IsBlank(line[end.Start:]) { + for _, attr := range attrs { + node.SetAttribute(attr.Name, attr.Value) + } + lastLine.Stop = lastLine.Start + start.Start + node.Lines().Set(lastIndex, lastLine) + } +} diff --git a/vendor/github.com/yuin/goldmark/parser/auto_link.go b/vendor/github.com/yuin/goldmark/parser/auto_link.go new file mode 100644 index 0000000..726a505 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/auto_link.go @@ -0,0 +1,42 @@ +package parser + +import ( + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type autoLinkParser struct { +} + +var defaultAutoLinkParser = &autoLinkParser{} + +// NewAutoLinkParser returns a new InlineParser that parses autolinks +// surrounded by '<' and '>' . +func NewAutoLinkParser() InlineParser { + return defaultAutoLinkParser +} + +func (s *autoLinkParser) Trigger() []byte { + return []byte{'<'} +} + +func (s *autoLinkParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.Node { + line, segment := block.PeekLine() + stop := util.FindEmailIndex(line[1:]) + typ := ast.AutoLinkType(ast.AutoLinkEmail) + if stop < 0 { + stop = util.FindURLIndex(line[1:]) + typ = ast.AutoLinkURL + } + if stop < 0 { + return nil + } + stop++ + if stop >= len(line) || line[stop] != '>' { + return nil + } + value := ast.NewTextSegment(text.NewSegment(segment.Start+1, segment.Start+stop)) + block.Advance(stop + 1) + return ast.NewAutoLink(typ, value) +} diff --git a/vendor/github.com/yuin/goldmark/parser/blockquote.go b/vendor/github.com/yuin/goldmark/parser/blockquote.go new file mode 100644 index 0000000..e7778dc --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/blockquote.go @@ -0,0 +1,69 @@ +package parser + +import ( + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type blockquoteParser struct { +} + +var defaultBlockquoteParser = &blockquoteParser{} + +// NewBlockquoteParser returns a new BlockParser that +// parses blockquotes. +func NewBlockquoteParser() BlockParser { + return defaultBlockquoteParser +} + +func (b *blockquoteParser) process(reader text.Reader) bool { + line, _ := reader.PeekLine() + w, pos := util.IndentWidth(line, reader.LineOffset()) + if w > 3 || pos >= len(line) || line[pos] != '>' { + return false + } + pos++ + if pos >= len(line) || line[pos] == '\n' { + reader.Advance(pos) + return true + } + if line[pos] == ' ' || line[pos] == '\t' { + pos++ + } + reader.Advance(pos) + if line[pos-1] == '\t' { + reader.SetPadding(2) + } + return true +} + +func (b *blockquoteParser) Trigger() []byte { + return []byte{'>'} +} + +func (b *blockquoteParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { + if b.process(reader) { + return ast.NewBlockquote(), HasChildren + } + return nil, NoChildren +} + +func (b *blockquoteParser) Continue(node ast.Node, reader text.Reader, pc Context) State { + if b.process(reader) { + return Continue | HasChildren + } + return Close +} + +func (b *blockquoteParser) Close(node ast.Node, reader text.Reader, pc Context) { + // nothing to do +} + +func (b *blockquoteParser) CanInterruptParagraph() bool { + return true +} + +func (b *blockquoteParser) CanAcceptIndentedLine() bool { + return false +} diff --git a/vendor/github.com/yuin/goldmark/parser/code_block.go b/vendor/github.com/yuin/goldmark/parser/code_block.go new file mode 100644 index 0000000..732f18c --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/code_block.go @@ -0,0 +1,100 @@ +package parser + +import ( + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type codeBlockParser struct { +} + +// CodeBlockParser is a BlockParser implementation that parses indented code blocks. +var defaultCodeBlockParser = &codeBlockParser{} + +// NewCodeBlockParser returns a new BlockParser that +// parses code blocks. +func NewCodeBlockParser() BlockParser { + return defaultCodeBlockParser +} + +func (b *codeBlockParser) Trigger() []byte { + return nil +} + +func (b *codeBlockParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { + line, segment := reader.PeekLine() + pos, padding := util.IndentPosition(line, reader.LineOffset(), 4) + if pos < 0 || util.IsBlank(line) { + return nil, NoChildren + } + node := ast.NewCodeBlock() + reader.AdvanceAndSetPadding(pos, padding) + _, segment = reader.PeekLine() + // if code block line starts with a tab, keep a tab as it is. + if segment.Padding != 0 { + preserveLeadingTabInCodeBlock(&segment, reader, 0) + } + node.Lines().Append(segment) + reader.Advance(segment.Len() - 1) + return node, NoChildren + +} + +func (b *codeBlockParser) Continue(node ast.Node, reader text.Reader, pc Context) State { + line, segment := reader.PeekLine() + if util.IsBlank(line) { + node.Lines().Append(segment.TrimLeftSpaceWidth(4, reader.Source())) + return Continue | NoChildren + } + pos, padding := util.IndentPosition(line, reader.LineOffset(), 4) + if pos < 0 { + return Close + } + reader.AdvanceAndSetPadding(pos, padding) + _, segment = reader.PeekLine() + + // if code block line starts with a tab, keep a tab as it is. + if segment.Padding != 0 { + preserveLeadingTabInCodeBlock(&segment, reader, 0) + } + + node.Lines().Append(segment) + reader.Advance(segment.Len() - 1) + return Continue | NoChildren +} + +func (b *codeBlockParser) Close(node ast.Node, reader text.Reader, pc Context) { + // trim trailing blank lines + lines := node.Lines() + length := lines.Len() - 1 + source := reader.Source() + for length >= 0 { + line := lines.At(length) + if util.IsBlank(line.Value(source)) { + length-- + } else { + break + } + } + lines.SetSliced(0, length+1) +} + +func (b *codeBlockParser) CanInterruptParagraph() bool { + return false +} + +func (b *codeBlockParser) CanAcceptIndentedLine() bool { + return true +} + +func preserveLeadingTabInCodeBlock(segment *text.Segment, reader text.Reader, indent int) { + offsetWithPadding := reader.LineOffset() + indent + sl, ss := reader.Position() + reader.SetPosition(sl, text.NewSegment(ss.Start-1, ss.Stop)) + if offsetWithPadding == reader.LineOffset() { + segment.Padding = 0 + segment.Start-- + } + reader.SetPosition(sl, ss) +} diff --git a/vendor/github.com/yuin/goldmark/parser/code_span.go b/vendor/github.com/yuin/goldmark/parser/code_span.go new file mode 100644 index 0000000..a74b09b --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/code_span.go @@ -0,0 +1,84 @@ +package parser + +import ( + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" +) + +type codeSpanParser struct { +} + +var defaultCodeSpanParser = &codeSpanParser{} + +// NewCodeSpanParser return a new InlineParser that parses inline codes +// surrounded by '`' . +func NewCodeSpanParser() InlineParser { + return defaultCodeSpanParser +} + +func (s *codeSpanParser) Trigger() []byte { + return []byte{'`'} +} + +func (s *codeSpanParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.Node { + line, startSegment := block.PeekLine() + opener := 0 + for ; opener < len(line) && line[opener] == '`'; opener++ { + } + block.Advance(opener) + l, pos := block.Position() + node := ast.NewCodeSpan() + for { + line, segment := block.PeekLine() + if line == nil { + block.SetPosition(l, pos) + return ast.NewTextSegment(startSegment.WithStop(startSegment.Start + opener)) + } + for i := 0; i < len(line); i++ { + c := line[i] + if c == '`' { + oldi := i + for ; i < len(line) && line[i] == '`'; i++ { + } + closure := i - oldi + if closure == opener && (i >= len(line) || line[i] != '`') { + segment = segment.WithStop(segment.Start + i - closure) + if !segment.IsEmpty() { + node.AppendChild(node, ast.NewRawTextSegment(segment)) + } + block.Advance(i) + goto end + } + } + } + node.AppendChild(node, ast.NewRawTextSegment(segment)) + block.AdvanceLine() + } +end: + if !node.IsBlank(block.Source()) { + // trim first halfspace and last halfspace + segment := node.FirstChild().(*ast.Text).Segment + shouldTrimmed := true + if !(!segment.IsEmpty() && isSpaceOrNewline(block.Source()[segment.Start])) { + shouldTrimmed = false + } + segment = node.LastChild().(*ast.Text).Segment + if !(!segment.IsEmpty() && isSpaceOrNewline(block.Source()[segment.Stop-1])) { + shouldTrimmed = false + } + if shouldTrimmed { + t := node.FirstChild().(*ast.Text) + segment := t.Segment + t.Segment = segment.WithStart(segment.Start + 1) + t = node.LastChild().(*ast.Text) + segment = node.LastChild().(*ast.Text).Segment + t.Segment = segment.WithStop(segment.Stop - 1) + } + + } + return node +} + +func isSpaceOrNewline(c byte) bool { + return c == ' ' || c == '\n' +} diff --git a/vendor/github.com/yuin/goldmark/parser/delimiter.go b/vendor/github.com/yuin/goldmark/parser/delimiter.go new file mode 100644 index 0000000..d097e3f --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/delimiter.go @@ -0,0 +1,238 @@ +package parser + +import ( + "fmt" + "strings" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +// A DelimiterProcessor interface provides a set of functions about +// Delimiter nodes. +type DelimiterProcessor interface { + // IsDelimiter returns true if given character is a delimiter, otherwise false. + IsDelimiter(byte) bool + + // CanOpenCloser returns true if given opener can close given closer, otherwise false. + CanOpenCloser(opener, closer *Delimiter) bool + + // OnMatch will be called when new matched delimiter found. + // OnMatch should return a new Node correspond to the matched delimiter. + OnMatch(consumes int) ast.Node +} + +// A Delimiter struct represents a delimiter like '*' of the Markdown text. +type Delimiter struct { + ast.BaseInline + + Segment text.Segment + + // CanOpen is set true if this delimiter can open a span for a new node. + // See https://spec.commonmark.org/0.30/#can-open-emphasis for details. + CanOpen bool + + // CanClose is set true if this delimiter can close a span for a new node. + // See https://spec.commonmark.org/0.30/#can-open-emphasis for details. + CanClose bool + + // Length is a remaining length of this delimiter. + Length int + + // OriginalLength is a original length of this delimiter. + OriginalLength int + + // Char is a character of this delimiter. + Char byte + + // PreviousDelimiter is a previous sibling delimiter node of this delimiter. + PreviousDelimiter *Delimiter + + // NextDelimiter is a next sibling delimiter node of this delimiter. + NextDelimiter *Delimiter + + // Processor is a DelimiterProcessor associated with this delimiter. + Processor DelimiterProcessor +} + +// Inline implements Inline.Inline. +func (d *Delimiter) Inline() {} + +// Dump implements Node.Dump. +func (d *Delimiter) Dump(source []byte, level int) { + fmt.Printf("%sDelimiter: \"%s\"\n", strings.Repeat(" ", level), string(d.Text(source))) +} + +var kindDelimiter = ast.NewNodeKind("Delimiter") + +// Kind implements Node.Kind. +func (d *Delimiter) Kind() ast.NodeKind { + return kindDelimiter +} + +// Text implements Node.Text. +func (d *Delimiter) Text(source []byte) []byte { + return d.Segment.Value(source) +} + +// ConsumeCharacters consumes delimiters. +func (d *Delimiter) ConsumeCharacters(n int) { + d.Length -= n + d.Segment = d.Segment.WithStop(d.Segment.Start + d.Length) +} + +// CalcComsumption calculates how many characters should be used for opening +// a new span correspond to given closer. +func (d *Delimiter) CalcComsumption(closer *Delimiter) int { + if (d.CanClose || closer.CanOpen) && (d.OriginalLength+closer.OriginalLength)%3 == 0 && closer.OriginalLength%3 != 0 { + return 0 + } + if d.Length >= 2 && closer.Length >= 2 { + return 2 + } + return 1 +} + +// NewDelimiter returns a new Delimiter node. +func NewDelimiter(canOpen, canClose bool, length int, char byte, processor DelimiterProcessor) *Delimiter { + c := &Delimiter{ + BaseInline: ast.BaseInline{}, + CanOpen: canOpen, + CanClose: canClose, + Length: length, + OriginalLength: length, + Char: char, + PreviousDelimiter: nil, + NextDelimiter: nil, + Processor: processor, + } + return c +} + +// ScanDelimiter scans a delimiter by given DelimiterProcessor. +func ScanDelimiter(line []byte, before rune, min int, processor DelimiterProcessor) *Delimiter { + i := 0 + c := line[i] + j := i + if !processor.IsDelimiter(c) { + return nil + } + for ; j < len(line) && c == line[j]; j++ { + } + if (j - i) >= min { + after := rune(' ') + if j != len(line) { + after = util.ToRune(line, j) + } + + var canOpen, canClose bool + beforeIsPunctuation := util.IsPunctRune(before) + beforeIsWhitespace := util.IsSpaceRune(before) + afterIsPunctuation := util.IsPunctRune(after) + afterIsWhitespace := util.IsSpaceRune(after) + + isLeft := !afterIsWhitespace && + (!afterIsPunctuation || beforeIsWhitespace || beforeIsPunctuation) + isRight := !beforeIsWhitespace && + (!beforeIsPunctuation || afterIsWhitespace || afterIsPunctuation) + + if line[i] == '_' { + canOpen = isLeft && (!isRight || beforeIsPunctuation) + canClose = isRight && (!isLeft || afterIsPunctuation) + } else { + canOpen = isLeft + canClose = isRight + } + return NewDelimiter(canOpen, canClose, j-i, c, processor) + } + return nil +} + +// ProcessDelimiters processes the delimiter list in the context. +// Processing will be stop when reaching the bottom. +// +// If you implement an inline parser that can have other inline nodes as +// children, you should call this function when nesting span has closed. +func ProcessDelimiters(bottom ast.Node, pc Context) { + lastDelimiter := pc.LastDelimiter() + if lastDelimiter == nil { + return + } + var closer *Delimiter + if bottom != nil { + if bottom != lastDelimiter { + for c := lastDelimiter.PreviousSibling(); c != nil && c != bottom; { + if d, ok := c.(*Delimiter); ok { + closer = d + } + c = c.PreviousSibling() + } + } + } else { + closer = pc.FirstDelimiter() + } + if closer == nil { + pc.ClearDelimiters(bottom) + return + } + for closer != nil { + if !closer.CanClose { + closer = closer.NextDelimiter + continue + } + consume := 0 + found := false + maybeOpener := false + var opener *Delimiter + for opener = closer.PreviousDelimiter; opener != nil && opener != bottom; opener = opener.PreviousDelimiter { + if opener.CanOpen && opener.Processor.CanOpenCloser(opener, closer) { + maybeOpener = true + consume = opener.CalcComsumption(closer) + if consume > 0 { + found = true + break + } + } + } + if !found { + next := closer.NextDelimiter + if !maybeOpener && !closer.CanOpen { + pc.RemoveDelimiter(closer) + } + closer = next + continue + } + opener.ConsumeCharacters(consume) + closer.ConsumeCharacters(consume) + + node := opener.Processor.OnMatch(consume) + + parent := opener.Parent() + child := opener.NextSibling() + + for child != nil && child != closer { + next := child.NextSibling() + node.AppendChild(node, child) + child = next + } + parent.InsertAfter(parent, opener, node) + + for c := opener.NextDelimiter; c != nil && c != closer; { + next := c.NextDelimiter + pc.RemoveDelimiter(c) + c = next + } + + if opener.Length == 0 { + pc.RemoveDelimiter(opener) + } + + if closer.Length == 0 { + next := closer.NextDelimiter + pc.RemoveDelimiter(closer) + closer = next + } + } + pc.ClearDelimiters(bottom) +} diff --git a/vendor/github.com/yuin/goldmark/parser/emphasis.go b/vendor/github.com/yuin/goldmark/parser/emphasis.go new file mode 100644 index 0000000..4886471 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/emphasis.go @@ -0,0 +1,50 @@ +package parser + +import ( + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" +) + +type emphasisDelimiterProcessor struct { +} + +func (p *emphasisDelimiterProcessor) IsDelimiter(b byte) bool { + return b == '*' || b == '_' +} + +func (p *emphasisDelimiterProcessor) CanOpenCloser(opener, closer *Delimiter) bool { + return opener.Char == closer.Char +} + +func (p *emphasisDelimiterProcessor) OnMatch(consumes int) ast.Node { + return ast.NewEmphasis(consumes) +} + +var defaultEmphasisDelimiterProcessor = &emphasisDelimiterProcessor{} + +type emphasisParser struct { +} + +var defaultEmphasisParser = &emphasisParser{} + +// NewEmphasisParser return a new InlineParser that parses emphasises. +func NewEmphasisParser() InlineParser { + return defaultEmphasisParser +} + +func (s *emphasisParser) Trigger() []byte { + return []byte{'*', '_'} +} + +func (s *emphasisParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.Node { + before := block.PrecendingCharacter() + line, segment := block.PeekLine() + node := ScanDelimiter(line, before, 1, defaultEmphasisDelimiterProcessor) + if node == nil { + return nil + } + node.Segment = segment.WithStop(segment.Start + node.OriginalLength) + block.Advance(node.OriginalLength) + pc.PushDelimiter(node) + return node +} diff --git a/vendor/github.com/yuin/goldmark/parser/fcode_block.go b/vendor/github.com/yuin/goldmark/parser/fcode_block.go new file mode 100644 index 0000000..e51a35a --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/fcode_block.go @@ -0,0 +1,121 @@ +package parser + +import ( + "bytes" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type fencedCodeBlockParser struct { +} + +var defaultFencedCodeBlockParser = &fencedCodeBlockParser{} + +// NewFencedCodeBlockParser returns a new BlockParser that +// parses fenced code blocks. +func NewFencedCodeBlockParser() BlockParser { + return defaultFencedCodeBlockParser +} + +type fenceData struct { + char byte + indent int + length int + node ast.Node +} + +var fencedCodeBlockInfoKey = NewContextKey() + +func (b *fencedCodeBlockParser) Trigger() []byte { + return []byte{'~', '`'} +} + +func (b *fencedCodeBlockParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { + line, segment := reader.PeekLine() + pos := pc.BlockOffset() + if pos < 0 || (line[pos] != '`' && line[pos] != '~') { + return nil, NoChildren + } + findent := pos + fenceChar := line[pos] + i := pos + for ; i < len(line) && line[i] == fenceChar; i++ { + } + oFenceLength := i - pos + if oFenceLength < 3 { + return nil, NoChildren + } + var info *ast.Text + if i < len(line)-1 { + rest := line[i:] + left := util.TrimLeftSpaceLength(rest) + right := util.TrimRightSpaceLength(rest) + if left < len(rest)-right { + infoStart, infoStop := segment.Start-segment.Padding+i+left, segment.Stop-right + value := rest[left : len(rest)-right] + if fenceChar == '`' && bytes.IndexByte(value, '`') > -1 { + return nil, NoChildren + } else if infoStart != infoStop { + info = ast.NewTextSegment(text.NewSegment(infoStart, infoStop)) + } + } + } + node := ast.NewFencedCodeBlock(info) + pc.Set(fencedCodeBlockInfoKey, &fenceData{fenceChar, findent, oFenceLength, node}) + return node, NoChildren + +} + +func (b *fencedCodeBlockParser) Continue(node ast.Node, reader text.Reader, pc Context) State { + line, segment := reader.PeekLine() + fdata := pc.Get(fencedCodeBlockInfoKey).(*fenceData) + + w, pos := util.IndentWidth(line, reader.LineOffset()) + if w < 4 { + i := pos + for ; i < len(line) && line[i] == fdata.char; i++ { + } + length := i - pos + if length >= fdata.length && util.IsBlank(line[i:]) { + newline := 1 + if line[len(line)-1] != '\n' { + newline = 0 + } + reader.Advance(segment.Stop - segment.Start - newline + segment.Padding) + return Close + } + } + pos, padding := util.IndentPositionPadding(line, reader.LineOffset(), segment.Padding, fdata.indent) + if pos < 0 { + pos = util.FirstNonSpacePosition(line) + if pos < 0 { + pos = 0 + } + padding = 0 + } + seg := text.NewSegmentPadding(segment.Start+pos, segment.Stop, padding) + // if code block line starts with a tab, keep a tab as it is. + if padding != 0 { + preserveLeadingTabInCodeBlock(&seg, reader, fdata.indent) + } + node.Lines().Append(seg) + reader.AdvanceAndSetPadding(segment.Stop-segment.Start-pos-1, padding) + return Continue | NoChildren +} + +func (b *fencedCodeBlockParser) Close(node ast.Node, reader text.Reader, pc Context) { + fdata := pc.Get(fencedCodeBlockInfoKey).(*fenceData) + if fdata.node == node { + pc.Set(fencedCodeBlockInfoKey, nil) + } +} + +func (b *fencedCodeBlockParser) CanInterruptParagraph() bool { + return true +} + +func (b *fencedCodeBlockParser) CanAcceptIndentedLine() bool { + return false +} diff --git a/vendor/github.com/yuin/goldmark/parser/html_block.go b/vendor/github.com/yuin/goldmark/parser/html_block.go new file mode 100644 index 0000000..09dc21f --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/html_block.go @@ -0,0 +1,229 @@ +package parser + +import ( + "bytes" + "regexp" + "strings" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +var allowedBlockTags = map[string]bool{ + "address": true, + "article": true, + "aside": true, + "base": true, + "basefont": true, + "blockquote": true, + "body": true, + "caption": true, + "center": true, + "col": true, + "colgroup": true, + "dd": true, + "details": true, + "dialog": true, + "dir": true, + "div": true, + "dl": true, + "dt": true, + "fieldset": true, + "figcaption": true, + "figure": true, + "footer": true, + "form": true, + "frame": true, + "frameset": true, + "h1": true, + "h2": true, + "h3": true, + "h4": true, + "h5": true, + "h6": true, + "head": true, + "header": true, + "hr": true, + "html": true, + "iframe": true, + "legend": true, + "li": true, + "link": true, + "main": true, + "menu": true, + "menuitem": true, + "meta": true, + "nav": true, + "noframes": true, + "ol": true, + "optgroup": true, + "option": true, + "p": true, + "param": true, + "search": true, + "section": true, + "summary": true, + "table": true, + "tbody": true, + "td": true, + "tfoot": true, + "th": true, + "thead": true, + "title": true, + "tr": true, + "track": true, + "ul": true, +} + +var htmlBlockType1OpenRegexp = regexp.MustCompile(`(?i)^[ ]{0,3}<(script|pre|style|textarea)(?:\s.*|>.*|/>.*|)(?:\r\n|\n)?$`) //nolint:golint,lll +var htmlBlockType1CloseRegexp = regexp.MustCompile(`(?i)^.*.*`) + +var htmlBlockType2OpenRegexp = regexp.MustCompile(`^[ ]{0,3}'} + +var htmlBlockType3OpenRegexp = regexp.MustCompile(`^[ ]{0,3}<\?`) +var htmlBlockType3Close = []byte{'?', '>'} + +var htmlBlockType4OpenRegexp = regexp.MustCompile(`^[ ]{0,3}'} + +var htmlBlockType5OpenRegexp = regexp.MustCompile(`^[ ]{0,3}<\!\[CDATA\[`) +var htmlBlockType5Close = []byte{']', ']', '>'} + +var htmlBlockType6Regexp = regexp.MustCompile(`^[ ]{0,3}<(?:/[ ]*)?([a-zA-Z]+[a-zA-Z0-9\-]*)(?:[ ].*|>.*|/>.*|)(?:\r\n|\n)?$`) //nolint:golint,lll + +var htmlBlockType7Regexp = regexp.MustCompile(`^[ ]{0,3}<(/[ ]*)?([a-zA-Z]+[a-zA-Z0-9\-]*)(` + attributePattern + `*)[ ]*(?:>|/>)[ ]*(?:\r\n|\n)?$`) //nolint:golint,lll + +type htmlBlockParser struct { +} + +var defaultHTMLBlockParser = &htmlBlockParser{} + +// NewHTMLBlockParser return a new BlockParser that can parse html +// blocks. +func NewHTMLBlockParser() BlockParser { + return defaultHTMLBlockParser +} + +func (b *htmlBlockParser) Trigger() []byte { + return []byte{'<'} +} + +func (b *htmlBlockParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { + var node *ast.HTMLBlock + line, segment := reader.PeekLine() + last := pc.LastOpenedBlock().Node + if pos := pc.BlockOffset(); pos < 0 || line[pos] != '<' { + return nil, NoChildren + } + + if m := htmlBlockType1OpenRegexp.FindSubmatchIndex(line); m != nil { + node = ast.NewHTMLBlock(ast.HTMLBlockType1) + } else if htmlBlockType2OpenRegexp.Match(line) { + node = ast.NewHTMLBlock(ast.HTMLBlockType2) + } else if htmlBlockType3OpenRegexp.Match(line) { + node = ast.NewHTMLBlock(ast.HTMLBlockType3) + } else if htmlBlockType4OpenRegexp.Match(line) { + node = ast.NewHTMLBlock(ast.HTMLBlockType4) + } else if htmlBlockType5OpenRegexp.Match(line) { + node = ast.NewHTMLBlock(ast.HTMLBlockType5) + } else if match := htmlBlockType7Regexp.FindSubmatchIndex(line); match != nil { + isCloseTag := match[2] > -1 && bytes.Equal(line[match[2]:match[3]], []byte("/")) + hasAttr := match[6] != match[7] + tagName := strings.ToLower(string(line[match[4]:match[5]])) + _, ok := allowedBlockTags[tagName] + if ok { + node = ast.NewHTMLBlock(ast.HTMLBlockType6) + } else if tagName != "script" && tagName != "style" && + tagName != "pre" && !ast.IsParagraph(last) && !(isCloseTag && hasAttr) { // type 7 can not interrupt paragraph + node = ast.NewHTMLBlock(ast.HTMLBlockType7) + } + } + if node == nil { + if match := htmlBlockType6Regexp.FindSubmatchIndex(line); match != nil { + tagName := string(line[match[2]:match[3]]) + _, ok := allowedBlockTags[strings.ToLower(tagName)] + if ok { + node = ast.NewHTMLBlock(ast.HTMLBlockType6) + } + } + } + if node != nil { + reader.Advance(segment.Len() - util.TrimRightSpaceLength(line)) + node.Lines().Append(segment) + return node, NoChildren + } + return nil, NoChildren +} + +func (b *htmlBlockParser) Continue(node ast.Node, reader text.Reader, pc Context) State { + htmlBlock := node.(*ast.HTMLBlock) + lines := htmlBlock.Lines() + line, segment := reader.PeekLine() + var closurePattern []byte + + switch htmlBlock.HTMLBlockType { + case ast.HTMLBlockType1: + if lines.Len() == 1 { + firstLine := lines.At(0) + if htmlBlockType1CloseRegexp.Match(firstLine.Value(reader.Source())) { + return Close + } + } + if htmlBlockType1CloseRegexp.Match(line) { + htmlBlock.ClosureLine = segment + reader.Advance(segment.Len() - util.TrimRightSpaceLength(line)) + return Close + } + case ast.HTMLBlockType2: + closurePattern = htmlBlockType2Close + fallthrough + case ast.HTMLBlockType3: + if closurePattern == nil { + closurePattern = htmlBlockType3Close + } + fallthrough + case ast.HTMLBlockType4: + if closurePattern == nil { + closurePattern = htmlBlockType4Close + } + fallthrough + case ast.HTMLBlockType5: + if closurePattern == nil { + closurePattern = htmlBlockType5Close + } + + if lines.Len() == 1 { + firstLine := lines.At(0) + if bytes.Contains(firstLine.Value(reader.Source()), closurePattern) { + return Close + } + } + if bytes.Contains(line, closurePattern) { + htmlBlock.ClosureLine = segment + reader.Advance(segment.Len()) + return Close + } + + case ast.HTMLBlockType6, ast.HTMLBlockType7: + if util.IsBlank(line) { + return Close + } + } + node.Lines().Append(segment) + reader.Advance(segment.Len() - util.TrimRightSpaceLength(line)) + return Continue | NoChildren +} + +func (b *htmlBlockParser) Close(node ast.Node, reader text.Reader, pc Context) { + // nothing to do +} + +func (b *htmlBlockParser) CanInterruptParagraph() bool { + return true +} + +func (b *htmlBlockParser) CanAcceptIndentedLine() bool { + return false +} diff --git a/vendor/github.com/yuin/goldmark/parser/link.go b/vendor/github.com/yuin/goldmark/parser/link.go new file mode 100644 index 0000000..7390d7b --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/link.go @@ -0,0 +1,449 @@ +package parser + +import ( + "fmt" + "strings" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +var linkLabelStateKey = NewContextKey() + +type linkLabelState struct { + ast.BaseInline + + Segment text.Segment + + IsImage bool + + Prev *linkLabelState + + Next *linkLabelState + + First *linkLabelState + + Last *linkLabelState +} + +func newLinkLabelState(segment text.Segment, isImage bool) *linkLabelState { + return &linkLabelState{ + Segment: segment, + IsImage: isImage, + } +} + +func (s *linkLabelState) Text(source []byte) []byte { + return s.Segment.Value(source) +} + +func (s *linkLabelState) Dump(source []byte, level int) { + fmt.Printf("%slinkLabelState: \"%s\"\n", strings.Repeat(" ", level), s.Text(source)) +} + +var kindLinkLabelState = ast.NewNodeKind("LinkLabelState") + +func (s *linkLabelState) Kind() ast.NodeKind { + return kindLinkLabelState +} + +func linkLabelStateLength(v *linkLabelState) int { + if v == nil || v.Last == nil || v.First == nil { + return 0 + } + return v.Last.Segment.Stop - v.First.Segment.Start +} + +func pushLinkLabelState(pc Context, v *linkLabelState) { + tlist := pc.Get(linkLabelStateKey) + var list *linkLabelState + if tlist == nil { + list = v + v.First = v + v.Last = v + pc.Set(linkLabelStateKey, list) + } else { + list = tlist.(*linkLabelState) + l := list.Last + list.Last = v + l.Next = v + v.Prev = l + } +} + +func removeLinkLabelState(pc Context, d *linkLabelState) { + tlist := pc.Get(linkLabelStateKey) + var list *linkLabelState + if tlist == nil { + return + } + list = tlist.(*linkLabelState) + + if d.Prev == nil { + list = d.Next + if list != nil { + list.First = d + list.Last = d.Last + list.Prev = nil + pc.Set(linkLabelStateKey, list) + } else { + pc.Set(linkLabelStateKey, nil) + } + } else { + d.Prev.Next = d.Next + if d.Next != nil { + d.Next.Prev = d.Prev + } + } + if list != nil && d.Next == nil { + list.Last = d.Prev + } + d.Next = nil + d.Prev = nil + d.First = nil + d.Last = nil +} + +type linkParser struct { +} + +var defaultLinkParser = &linkParser{} + +// NewLinkParser return a new InlineParser that parses links. +func NewLinkParser() InlineParser { + return defaultLinkParser +} + +func (s *linkParser) Trigger() []byte { + return []byte{'!', '[', ']'} +} + +var linkBottom = NewContextKey() + +func (s *linkParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.Node { + line, segment := block.PeekLine() + if line[0] == '!' { + if len(line) > 1 && line[1] == '[' { + block.Advance(1) + pushLinkBottom(pc) + return processLinkLabelOpen(block, segment.Start+1, true, pc) + } + return nil + } + if line[0] == '[' { + pushLinkBottom(pc) + return processLinkLabelOpen(block, segment.Start, false, pc) + } + + // line[0] == ']' + tlist := pc.Get(linkLabelStateKey) + if tlist == nil { + return nil + } + last := tlist.(*linkLabelState).Last + if last == nil { + _ = popLinkBottom(pc) + return nil + } + block.Advance(1) + removeLinkLabelState(pc, last) + // CommonMark spec says: + // > A link label can have at most 999 characters inside the square brackets. + if linkLabelStateLength(tlist.(*linkLabelState)) > 998 { + ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment) + _ = popLinkBottom(pc) + return nil + } + + if !last.IsImage && s.containsLink(last) { // a link in a link text is not allowed + ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment) + _ = popLinkBottom(pc) + return nil + } + + c := block.Peek() + l, pos := block.Position() + var link *ast.Link + var hasValue bool + if c == '(' { // normal link + link = s.parseLink(parent, last, block, pc) + } else if c == '[' { // reference link + link, hasValue = s.parseReferenceLink(parent, last, block, pc) + if link == nil && hasValue { + ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment) + _ = popLinkBottom(pc) + return nil + } + } + + if link == nil { + // maybe shortcut reference link + block.SetPosition(l, pos) + ssegment := text.NewSegment(last.Segment.Stop, segment.Start) + maybeReference := block.Value(ssegment) + // CommonMark spec says: + // > A link label can have at most 999 characters inside the square brackets. + if len(maybeReference) > 999 { + ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment) + _ = popLinkBottom(pc) + return nil + } + + ref, ok := pc.Reference(util.ToLinkReference(maybeReference)) + if !ok { + ast.MergeOrReplaceTextSegment(last.Parent(), last, last.Segment) + _ = popLinkBottom(pc) + return nil + } + link = ast.NewLink() + s.processLinkLabel(parent, link, last, pc) + link.Title = ref.Title() + link.Destination = ref.Destination() + } + if last.IsImage { + last.Parent().RemoveChild(last.Parent(), last) + return ast.NewImage(link) + } + last.Parent().RemoveChild(last.Parent(), last) + return link +} + +func (s *linkParser) containsLink(n ast.Node) bool { + if n == nil { + return false + } + for c := n; c != nil; c = c.NextSibling() { + if _, ok := c.(*ast.Link); ok { + return true + } + if s.containsLink(c.FirstChild()) { + return true + } + } + return false +} + +func processLinkLabelOpen(block text.Reader, pos int, isImage bool, pc Context) *linkLabelState { + start := pos + if isImage { + start-- + } + state := newLinkLabelState(text.NewSegment(start, pos+1), isImage) + pushLinkLabelState(pc, state) + block.Advance(1) + return state +} + +func (s *linkParser) processLinkLabel(parent ast.Node, link *ast.Link, last *linkLabelState, pc Context) { + bottom := popLinkBottom(pc) + ProcessDelimiters(bottom, pc) + for c := last.NextSibling(); c != nil; { + next := c.NextSibling() + parent.RemoveChild(parent, c) + link.AppendChild(link, c) + c = next + } +} + +var linkFindClosureOptions text.FindClosureOptions = text.FindClosureOptions{ + Nesting: false, + Newline: true, + Advance: true, +} + +func (s *linkParser) parseReferenceLink(parent ast.Node, last *linkLabelState, + block text.Reader, pc Context) (*ast.Link, bool) { + _, orgpos := block.Position() + block.Advance(1) // skip '[' + segments, found := block.FindClosure('[', ']', linkFindClosureOptions) + if !found { + return nil, false + } + + var maybeReference []byte + if segments.Len() == 1 { // avoid allocate a new byte slice + maybeReference = block.Value(segments.At(0)) + } else { + maybeReference = []byte{} + for i := 0; i < segments.Len(); i++ { + s := segments.At(i) + maybeReference = append(maybeReference, block.Value(s)...) + } + } + if util.IsBlank(maybeReference) { // collapsed reference link + s := text.NewSegment(last.Segment.Stop, orgpos.Start-1) + maybeReference = block.Value(s) + } + // CommonMark spec says: + // > A link label can have at most 999 characters inside the square brackets. + if len(maybeReference) > 999 { + return nil, true + } + + ref, ok := pc.Reference(util.ToLinkReference(maybeReference)) + if !ok { + return nil, true + } + + link := ast.NewLink() + s.processLinkLabel(parent, link, last, pc) + link.Title = ref.Title() + link.Destination = ref.Destination() + return link, true +} + +func (s *linkParser) parseLink(parent ast.Node, last *linkLabelState, block text.Reader, pc Context) *ast.Link { + block.Advance(1) // skip '(' + block.SkipSpaces() + var title []byte + var destination []byte + var ok bool + if block.Peek() == ')' { // empty link like '[link]()' + block.Advance(1) + } else { + destination, ok = parseLinkDestination(block) + if !ok { + return nil + } + block.SkipSpaces() + if block.Peek() == ')' { + block.Advance(1) + } else { + title, ok = parseLinkTitle(block) + if !ok { + return nil + } + block.SkipSpaces() + if block.Peek() == ')' { + block.Advance(1) + } else { + return nil + } + } + } + + link := ast.NewLink() + s.processLinkLabel(parent, link, last, pc) + link.Destination = destination + link.Title = title + return link +} + +func parseLinkDestination(block text.Reader) ([]byte, bool) { + block.SkipSpaces() + line, _ := block.PeekLine() + if block.Peek() == '<' { + i := 1 + for i < len(line) { + c := line[i] + if c == '\\' && i < len(line)-1 && util.IsPunct(line[i+1]) { + i += 2 + continue + } else if c == '>' { + block.Advance(i + 1) + return line[1:i], true + } + i++ + } + return nil, false + } + opened := 0 + i := 0 + for i < len(line) { + c := line[i] + if c == '\\' && i < len(line)-1 && util.IsPunct(line[i+1]) { + i += 2 + continue + } else if c == '(' { + opened++ + } else if c == ')' { + opened-- + if opened < 0 { + break + } + } else if util.IsSpace(c) { + break + } + i++ + } + block.Advance(i) + return line[:i], len(line[:i]) != 0 +} + +func parseLinkTitle(block text.Reader) ([]byte, bool) { + block.SkipSpaces() + opener := block.Peek() + if opener != '"' && opener != '\'' && opener != '(' { + return nil, false + } + closer := opener + if opener == '(' { + closer = ')' + } + block.Advance(1) + segments, found := block.FindClosure(opener, closer, linkFindClosureOptions) + if found { + if segments.Len() == 1 { + return block.Value(segments.At(0)), true + } + var title []byte + for i := 0; i < segments.Len(); i++ { + s := segments.At(i) + title = append(title, block.Value(s)...) + } + return title, true + } + return nil, false +} + +func pushLinkBottom(pc Context) { + bottoms := pc.Get(linkBottom) + b := pc.LastDelimiter() + if bottoms == nil { + pc.Set(linkBottom, b) + return + } + if s, ok := bottoms.([]ast.Node); ok { + pc.Set(linkBottom, append(s, b)) + return + } + pc.Set(linkBottom, []ast.Node{bottoms.(ast.Node), b}) +} + +func popLinkBottom(pc Context) ast.Node { + bottoms := pc.Get(linkBottom) + if bottoms == nil { + return nil + } + if v, ok := bottoms.(ast.Node); ok { + pc.Set(linkBottom, nil) + return v + } + s := bottoms.([]ast.Node) + v := s[len(s)-1] + n := s[0 : len(s)-1] + switch len(n) { + case 0: + pc.Set(linkBottom, nil) + case 1: + pc.Set(linkBottom, n[0]) + default: + pc.Set(linkBottom, s[0:len(s)-1]) + } + return v +} + +func (s *linkParser) CloseBlock(parent ast.Node, block text.Reader, pc Context) { + pc.Set(linkBottom, nil) + tlist := pc.Get(linkLabelStateKey) + if tlist == nil { + return + } + for s := tlist.(*linkLabelState); s != nil; { + next := s.Next + removeLinkLabelState(pc, s) + s.Parent().ReplaceChild(s.Parent(), s, ast.NewTextSegment(s.Segment)) + s = next + } +} diff --git a/vendor/github.com/yuin/goldmark/parser/link_ref.go b/vendor/github.com/yuin/goldmark/parser/link_ref.go new file mode 100644 index 0000000..ea3f654 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/link_ref.go @@ -0,0 +1,152 @@ +package parser + +import ( + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type linkReferenceParagraphTransformer struct { +} + +// LinkReferenceParagraphTransformer is a ParagraphTransformer implementation +// that parses and extracts link reference from paragraphs. +var LinkReferenceParagraphTransformer = &linkReferenceParagraphTransformer{} + +func (p *linkReferenceParagraphTransformer) Transform(node *ast.Paragraph, reader text.Reader, pc Context) { + lines := node.Lines() + block := text.NewBlockReader(reader.Source(), lines) + removes := [][2]int{} + for { + start, end := parseLinkReferenceDefinition(block, pc) + if start > -1 { + if start == end { + end++ + } + removes = append(removes, [2]int{start, end}) + continue + } + break + } + + offset := 0 + for _, remove := range removes { + if lines.Len() == 0 { + break + } + s := lines.Sliced(remove[1]-offset, lines.Len()) + lines.SetSliced(0, remove[0]-offset) + lines.AppendAll(s) + offset = remove[1] + } + + if lines.Len() == 0 { + t := ast.NewTextBlock() + t.SetBlankPreviousLines(node.HasBlankPreviousLines()) + node.Parent().ReplaceChild(node.Parent(), node, t) + return + } + + node.SetLines(lines) +} + +func parseLinkReferenceDefinition(block text.Reader, pc Context) (int, int) { + block.SkipSpaces() + line, _ := block.PeekLine() + if line == nil { + return -1, -1 + } + startLine, _ := block.Position() + width, pos := util.IndentWidth(line, 0) + if width > 3 { + return -1, -1 + } + if width != 0 { + pos++ + } + if line[pos] != '[' { + return -1, -1 + } + block.Advance(pos + 1) + segments, found := block.FindClosure('[', ']', linkFindClosureOptions) + if !found { + return -1, -1 + } + var label []byte + if segments.Len() == 1 { + label = block.Value(segments.At(0)) + } else { + for i := 0; i < segments.Len(); i++ { + s := segments.At(i) + label = append(label, block.Value(s)...) + } + } + if util.IsBlank(label) { + return -1, -1 + } + if block.Peek() != ':' { + return -1, -1 + } + block.Advance(1) + block.SkipSpaces() + destination, ok := parseLinkDestination(block) + if !ok { + return -1, -1 + } + line, _ = block.PeekLine() + isNewLine := line == nil || util.IsBlank(line) + + endLine, _ := block.Position() + _, spaces, _ := block.SkipSpaces() + opener := block.Peek() + if opener != '"' && opener != '\'' && opener != '(' { + if !isNewLine { + return -1, -1 + } + ref := NewReference(label, destination, nil) + pc.AddReference(ref) + return startLine, endLine + 1 + } + if spaces == 0 { + return -1, -1 + } + block.Advance(1) + closer := opener + if opener == '(' { + closer = ')' + } + segments, found = block.FindClosure(opener, closer, linkFindClosureOptions) + if !found { + if !isNewLine { + return -1, -1 + } + ref := NewReference(label, destination, nil) + pc.AddReference(ref) + block.AdvanceLine() + return startLine, endLine + 1 + } + var title []byte + if segments.Len() == 1 { + title = block.Value(segments.At(0)) + } else { + for i := 0; i < segments.Len(); i++ { + s := segments.At(i) + title = append(title, block.Value(s)...) + } + } + + line, _ = block.PeekLine() + if line != nil && !util.IsBlank(line) { + if !isNewLine { + return -1, -1 + } + ref := NewReference(label, destination, title) + pc.AddReference(ref) + return startLine, endLine + } + + endLine, _ = block.Position() + ref := NewReference(label, destination, title) + pc.AddReference(ref) + return startLine, endLine + 1 +} diff --git a/vendor/github.com/yuin/goldmark/parser/list.go b/vendor/github.com/yuin/goldmark/parser/list.go new file mode 100644 index 0000000..3e0eea6 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/list.go @@ -0,0 +1,287 @@ +package parser + +import ( + "strconv" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type listItemType int + +const ( + notList listItemType = iota + bulletList + orderedList +) + +var skipListParserKey = NewContextKey() +var emptyListItemWithBlankLines = NewContextKey() +var listItemFlagValue interface{} = true + +// Same as +// `^(([ ]*)([\-\*\+]))(\s+.*)?\n?$`.FindSubmatchIndex or +// `^(([ ]*)(\d{1,9}[\.\)]))(\s+.*)?\n?$`.FindSubmatchIndex. +func parseListItem(line []byte) ([6]int, listItemType) { + i := 0 + l := len(line) + ret := [6]int{} + for ; i < l && line[i] == ' '; i++ { + c := line[i] + if c == '\t' { + return ret, notList + } + } + if i > 3 { + return ret, notList + } + ret[0] = 0 + ret[1] = i + ret[2] = i + var typ listItemType + if i < l && (line[i] == '-' || line[i] == '*' || line[i] == '+') { + i++ + ret[3] = i + typ = bulletList + } else if i < l { + for ; i < l && util.IsNumeric(line[i]); i++ { + } + ret[3] = i + if ret[3] == ret[2] || ret[3]-ret[2] > 9 { + return ret, notList + } + if i < l && (line[i] == '.' || line[i] == ')') { + i++ + ret[3] = i + } else { + return ret, notList + } + typ = orderedList + } else { + return ret, notList + } + if i < l && line[i] != '\n' { + w, _ := util.IndentWidth(line[i:], 0) + if w == 0 { + return ret, notList + } + } + if i >= l { + ret[4] = -1 + ret[5] = -1 + return ret, typ + } + ret[4] = i + ret[5] = len(line) + if line[ret[5]-1] == '\n' && line[i] != '\n' { + ret[5]-- + } + return ret, typ +} + +func matchesListItem(source []byte, strict bool) ([6]int, listItemType) { + m, typ := parseListItem(source) + if typ != notList && (!strict || strict && m[1] < 4) { + return m, typ + } + return m, notList +} + +func calcListOffset(source []byte, match [6]int) int { + var offset int + if match[4] < 0 || util.IsBlank(source[match[4]:]) { // list item starts with a blank line + offset = 1 + } else { + offset, _ = util.IndentWidth(source[match[4]:], match[4]) + if offset > 4 { // offseted codeblock + offset = 1 + } + } + return offset +} + +func lastOffset(node ast.Node) int { + lastChild := node.LastChild() + if lastChild != nil { + return lastChild.(*ast.ListItem).Offset + } + return 0 +} + +type listParser struct { +} + +var defaultListParser = &listParser{} + +// NewListParser returns a new BlockParser that +// parses lists. +// This parser must take precedence over the ListItemParser. +func NewListParser() BlockParser { + return defaultListParser +} + +func (b *listParser) Trigger() []byte { + return []byte{'-', '+', '*', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'} +} + +func (b *listParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { + last := pc.LastOpenedBlock().Node + if _, lok := last.(*ast.List); lok || pc.Get(skipListParserKey) != nil { + pc.Set(skipListParserKey, nil) + return nil, NoChildren + } + line, _ := reader.PeekLine() + match, typ := matchesListItem(line, true) + if typ == notList { + return nil, NoChildren + } + start := -1 + if typ == orderedList { + number := line[match[2] : match[3]-1] + start, _ = strconv.Atoi(string(number)) + } + + if ast.IsParagraph(last) && last.Parent() == parent { + // we allow only lists starting with 1 to interrupt paragraphs. + if typ == orderedList && start != 1 { + return nil, NoChildren + } + //an empty list item cannot interrupt a paragraph: + if match[4] < 0 || util.IsBlank(line[match[4]:match[5]]) { + return nil, NoChildren + } + } + + marker := line[match[3]-1] + node := ast.NewList(marker) + if start > -1 { + node.Start = start + } + pc.Set(emptyListItemWithBlankLines, nil) + return node, HasChildren +} + +func (b *listParser) Continue(node ast.Node, reader text.Reader, pc Context) State { + list := node.(*ast.List) + line, _ := reader.PeekLine() + if util.IsBlank(line) { + if node.LastChild().ChildCount() == 0 { + pc.Set(emptyListItemWithBlankLines, listItemFlagValue) + } + return Continue | HasChildren + } + + // "offset" means a width that bar indicates. + // - aaaaaaaa + // |----| + // + // If the indent is less than the last offset like + // - a + // - b <--- current line + // it maybe a new child of the list. + // + // Empty list items can have multiple blanklines + // + // - <--- 1st item is an empty thus "offset" is unknown + // + // + // - <--- current line + // + // -> 1 list with 2 blank items + // + // So if the last item is an empty, it maybe a new child of the list. + // + offset := lastOffset(node) + lastIsEmpty := node.LastChild().ChildCount() == 0 + indent, _ := util.IndentWidth(line, reader.LineOffset()) + + if indent < offset || lastIsEmpty { + if indent < 4 { + match, typ := matchesListItem(line, false) // may have a leading spaces more than 3 + if typ != notList && match[1]-offset < 4 { + marker := line[match[3]-1] + if !list.CanContinue(marker, typ == orderedList) { + return Close + } + // Thematic Breaks take precedence over lists + if isThematicBreak(line[match[3]-1:], 0) { + isHeading := false + last := pc.LastOpenedBlock().Node + if ast.IsParagraph(last) { + c, ok := matchesSetextHeadingBar(line[match[3]-1:]) + if ok && c == '-' { + isHeading = true + } + } + if !isHeading { + return Close + } + } + return Continue | HasChildren + } + } + if !lastIsEmpty { + return Close + } + } + + if lastIsEmpty && indent < offset { + return Close + } + + // Non empty items can not exist next to an empty list item + // with blank lines. So we need to close the current list + // + // - + // + // foo + // + // -> 1 list with 1 blank items and 1 paragraph + if pc.Get(emptyListItemWithBlankLines) != nil { + return Close + } + return Continue | HasChildren +} + +func (b *listParser) Close(node ast.Node, reader text.Reader, pc Context) { + list := node.(*ast.List) + + for c := node.FirstChild(); c != nil && list.IsTight; c = c.NextSibling() { + if c.FirstChild() != nil && c.FirstChild() != c.LastChild() { + for c1 := c.FirstChild().NextSibling(); c1 != nil; c1 = c1.NextSibling() { + if c1.HasBlankPreviousLines() { + list.IsTight = false + break + } + } + } + if c != node.FirstChild() { + if c.HasBlankPreviousLines() { + list.IsTight = false + } + } + } + + if list.IsTight { + for child := node.FirstChild(); child != nil; child = child.NextSibling() { + for gc := child.FirstChild(); gc != nil; { + paragraph, ok := gc.(*ast.Paragraph) + gc = gc.NextSibling() + if ok { + textBlock := ast.NewTextBlock() + textBlock.SetLines(paragraph.Lines()) + child.ReplaceChild(child, paragraph, textBlock) + } + } + } + } +} + +func (b *listParser) CanInterruptParagraph() bool { + return true +} + +func (b *listParser) CanAcceptIndentedLine() bool { + return false +} diff --git a/vendor/github.com/yuin/goldmark/parser/list_item.go b/vendor/github.com/yuin/goldmark/parser/list_item.go new file mode 100644 index 0000000..81357a9 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/list_item.go @@ -0,0 +1,90 @@ +package parser + +import ( + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type listItemParser struct { +} + +var defaultListItemParser = &listItemParser{} + +// NewListItemParser returns a new BlockParser that +// parses list items. +func NewListItemParser() BlockParser { + return defaultListItemParser +} + +func (b *listItemParser) Trigger() []byte { + return []byte{'-', '+', '*', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9'} +} + +func (b *listItemParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { + list, lok := parent.(*ast.List) + if !lok { // list item must be a child of a list + return nil, NoChildren + } + offset := lastOffset(list) + line, _ := reader.PeekLine() + match, typ := matchesListItem(line, false) + if typ == notList { + return nil, NoChildren + } + if match[1]-offset > 3 { + return nil, NoChildren + } + + pc.Set(emptyListItemWithBlankLines, nil) + + itemOffset := calcListOffset(line, match) + node := ast.NewListItem(match[3] + itemOffset) + if match[4] < 0 || util.IsBlank(line[match[4]:match[5]]) { + return node, NoChildren + } + + pos, padding := util.IndentPosition(line[match[4]:], match[4], itemOffset) + child := match[3] + pos + reader.AdvanceAndSetPadding(child, padding) + return node, HasChildren +} + +func (b *listItemParser) Continue(node ast.Node, reader text.Reader, pc Context) State { + line, _ := reader.PeekLine() + if util.IsBlank(line) { + reader.Advance(len(line) - 1) + return Continue | HasChildren + } + + offset := lastOffset(node.Parent()) + isEmpty := node.ChildCount() == 0 + indent, _ := util.IndentWidth(line, reader.LineOffset()) + if (isEmpty || indent < offset) && indent < 4 { + _, typ := matchesListItem(line, true) + // new list item found + if typ != notList { + pc.Set(skipListParserKey, listItemFlagValue) + return Close + } + if !isEmpty { + return Close + } + } + pos, padding := util.IndentPosition(line, reader.LineOffset(), offset) + reader.AdvanceAndSetPadding(pos, padding) + + return Continue | HasChildren +} + +func (b *listItemParser) Close(node ast.Node, reader text.Reader, pc Context) { + // nothing to do +} + +func (b *listItemParser) CanInterruptParagraph() bool { + return true +} + +func (b *listItemParser) CanAcceptIndentedLine() bool { + return false +} diff --git a/vendor/github.com/yuin/goldmark/parser/paragraph.go b/vendor/github.com/yuin/goldmark/parser/paragraph.go new file mode 100644 index 0000000..9d3fa38 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/paragraph.go @@ -0,0 +1,72 @@ +package parser + +import ( + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type paragraphParser struct { +} + +var defaultParagraphParser = ¶graphParser{} + +// NewParagraphParser returns a new BlockParser that +// parses paragraphs. +func NewParagraphParser() BlockParser { + return defaultParagraphParser +} + +func (b *paragraphParser) Trigger() []byte { + return nil +} + +func (b *paragraphParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { + _, segment := reader.PeekLine() + segment = segment.TrimLeftSpace(reader.Source()) + if segment.IsEmpty() { + return nil, NoChildren + } + node := ast.NewParagraph() + node.Lines().Append(segment) + reader.Advance(segment.Len() - 1) + return node, NoChildren +} + +func (b *paragraphParser) Continue(node ast.Node, reader text.Reader, pc Context) State { + line, segment := reader.PeekLine() + if util.IsBlank(line) { + return Close + } + node.Lines().Append(segment) + reader.Advance(segment.Len() - 1) + return Continue | NoChildren +} + +func (b *paragraphParser) Close(node ast.Node, reader text.Reader, pc Context) { + lines := node.Lines() + if lines.Len() != 0 { + // trim leading spaces + for i := 0; i < lines.Len(); i++ { + l := lines.At(i) + lines.Set(i, l.TrimLeftSpace(reader.Source())) + } + + // trim trailing spaces + length := lines.Len() + lastLine := node.Lines().At(length - 1) + node.Lines().Set(length-1, lastLine.TrimRightSpace(reader.Source())) + } + if lines.Len() == 0 { + node.Parent().RemoveChild(node.Parent(), node) + return + } +} + +func (b *paragraphParser) CanInterruptParagraph() bool { + return false +} + +func (b *paragraphParser) CanAcceptIndentedLine() bool { + return false +} diff --git a/vendor/github.com/yuin/goldmark/parser/parser.go b/vendor/github.com/yuin/goldmark/parser/parser.go new file mode 100644 index 0000000..5cc2175 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/parser.go @@ -0,0 +1,1259 @@ +// Package parser contains stuff that are related to parsing a Markdown text. +package parser + +import ( + "fmt" + "strings" + "sync" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +// A Reference interface represents a link reference in Markdown text. +type Reference interface { + // String implements Stringer. + String() string + + // Label returns a label of the reference. + Label() []byte + + // Destination returns a destination(URL) of the reference. + Destination() []byte + + // Title returns a title of the reference. + Title() []byte +} + +type reference struct { + label []byte + destination []byte + title []byte +} + +// NewReference returns a new Reference. +func NewReference(label, destination, title []byte) Reference { + return &reference{label, destination, title} +} + +func (r *reference) Label() []byte { + return r.label +} + +func (r *reference) Destination() []byte { + return r.destination +} + +func (r *reference) Title() []byte { + return r.title +} + +func (r *reference) String() string { + return fmt.Sprintf("Reference{Label:%s, Destination:%s, Title:%s}", r.label, r.destination, r.title) +} + +// An IDs interface is a collection of the element ids. +type IDs interface { + // Generate generates a new element id. + Generate(value []byte, kind ast.NodeKind) []byte + + // Put puts a given element id to the used ids table. + Put(value []byte) +} + +type ids struct { + values map[string]bool +} + +func newIDs() IDs { + return &ids{ + values: map[string]bool{}, + } +} + +func (s *ids) Generate(value []byte, kind ast.NodeKind) []byte { + value = util.TrimLeftSpace(value) + value = util.TrimRightSpace(value) + result := []byte{} + for i := 0; i < len(value); { + v := value[i] + l := util.UTF8Len(v) + i += int(l) + if l != 1 { + continue + } + if util.IsAlphaNumeric(v) { + if 'A' <= v && v <= 'Z' { + v += 'a' - 'A' + } + result = append(result, v) + } else if util.IsSpace(v) || v == '-' || v == '_' { + result = append(result, '-') + } + } + if len(result) == 0 { + if kind == ast.KindHeading { + result = []byte("heading") + } else { + result = []byte("id") + } + } + if _, ok := s.values[util.BytesToReadOnlyString(result)]; !ok { + s.values[util.BytesToReadOnlyString(result)] = true + return result + } + for i := 1; ; i++ { + newResult := fmt.Sprintf("%s-%d", result, i) + if _, ok := s.values[newResult]; !ok { + s.values[newResult] = true + return []byte(newResult) + } + + } +} + +func (s *ids) Put(value []byte) { + s.values[util.BytesToReadOnlyString(value)] = true +} + +// ContextKey is a key that is used to set arbitrary values to the context. +type ContextKey int + +// ContextKeyMax is a maximum value of the ContextKey. +var ContextKeyMax ContextKey + +// NewContextKey return a new ContextKey value. +func NewContextKey() ContextKey { + ContextKeyMax++ + return ContextKeyMax +} + +// A Context interface holds a information that are necessary to parse +// Markdown text. +type Context interface { + // String implements Stringer. + String() string + + // Get returns a value associated with the given key. + Get(ContextKey) interface{} + + // ComputeIfAbsent computes a value if a value associated with the given key is absent and returns the value. + ComputeIfAbsent(ContextKey, func() interface{}) interface{} + + // Set sets the given value to the context. + Set(ContextKey, interface{}) + + // AddReference adds the given reference to this context. + AddReference(Reference) + + // Reference returns (a reference, true) if a reference associated with + // the given label exists, otherwise (nil, false). + Reference(label string) (Reference, bool) + + // References returns a list of references. + References() []Reference + + // IDs returns a collection of the element ids. + IDs() IDs + + // BlockOffset returns a first non-space character position on current line. + // This value is valid only for BlockParser.Open. + // BlockOffset returns -1 if current line is blank. + BlockOffset() int + + // BlockOffset sets a first non-space character position on current line. + // This value is valid only for BlockParser.Open. + SetBlockOffset(int) + + // BlockIndent returns an indent width on current line. + // This value is valid only for BlockParser.Open. + // BlockIndent returns -1 if current line is blank. + BlockIndent() int + + // BlockIndent sets an indent width on current line. + // This value is valid only for BlockParser.Open. + SetBlockIndent(int) + + // FirstDelimiter returns a first delimiter of the current delimiter list. + FirstDelimiter() *Delimiter + + // LastDelimiter returns a last delimiter of the current delimiter list. + LastDelimiter() *Delimiter + + // PushDelimiter appends the given delimiter to the tail of the current + // delimiter list. + PushDelimiter(delimiter *Delimiter) + + // RemoveDelimiter removes the given delimiter from the current delimiter list. + RemoveDelimiter(d *Delimiter) + + // ClearDelimiters clears the current delimiter list. + ClearDelimiters(bottom ast.Node) + + // OpenedBlocks returns a list of nodes that are currently in parsing. + OpenedBlocks() []Block + + // SetOpenedBlocks sets a list of nodes that are currently in parsing. + SetOpenedBlocks([]Block) + + // LastOpenedBlock returns a last node that is currently in parsing. + LastOpenedBlock() Block + + // IsInLinkLabel returns true if current position seems to be in link label. + IsInLinkLabel() bool +} + +// A ContextConfig struct is a data structure that holds configuration of the Context. +type ContextConfig struct { + IDs IDs +} + +// An ContextOption is a functional option type for the Context. +type ContextOption func(*ContextConfig) + +// WithIDs is a functional option for the Context. +func WithIDs(ids IDs) ContextOption { + return func(c *ContextConfig) { + c.IDs = ids + } +} + +type parseContext struct { + store []interface{} + ids IDs + refs map[string]Reference + blockOffset int + blockIndent int + delimiters *Delimiter + lastDelimiter *Delimiter + openedBlocks []Block +} + +// NewContext returns a new Context. +func NewContext(options ...ContextOption) Context { + cfg := &ContextConfig{ + IDs: newIDs(), + } + for _, option := range options { + option(cfg) + } + + return &parseContext{ + store: make([]interface{}, ContextKeyMax+1), + refs: map[string]Reference{}, + ids: cfg.IDs, + blockOffset: -1, + blockIndent: -1, + delimiters: nil, + lastDelimiter: nil, + openedBlocks: []Block{}, + } +} + +func (p *parseContext) Get(key ContextKey) interface{} { + return p.store[key] +} + +func (p *parseContext) ComputeIfAbsent(key ContextKey, f func() interface{}) interface{} { + v := p.store[key] + if v == nil { + v = f() + p.store[key] = v + } + return v +} + +func (p *parseContext) Set(key ContextKey, value interface{}) { + p.store[key] = value +} + +func (p *parseContext) IDs() IDs { + return p.ids +} + +func (p *parseContext) BlockOffset() int { + return p.blockOffset +} + +func (p *parseContext) SetBlockOffset(v int) { + p.blockOffset = v +} + +func (p *parseContext) BlockIndent() int { + return p.blockIndent +} + +func (p *parseContext) SetBlockIndent(v int) { + p.blockIndent = v +} + +func (p *parseContext) LastDelimiter() *Delimiter { + return p.lastDelimiter +} + +func (p *parseContext) FirstDelimiter() *Delimiter { + return p.delimiters +} + +func (p *parseContext) PushDelimiter(d *Delimiter) { + if p.delimiters == nil { + p.delimiters = d + p.lastDelimiter = d + } else { + l := p.lastDelimiter + p.lastDelimiter = d + l.NextDelimiter = d + d.PreviousDelimiter = l + } +} + +func (p *parseContext) RemoveDelimiter(d *Delimiter) { + if d.PreviousDelimiter == nil { + p.delimiters = d.NextDelimiter + } else { + d.PreviousDelimiter.NextDelimiter = d.NextDelimiter + if d.NextDelimiter != nil { + d.NextDelimiter.PreviousDelimiter = d.PreviousDelimiter + } + } + if d.NextDelimiter == nil { + p.lastDelimiter = d.PreviousDelimiter + } + if p.delimiters != nil { + p.delimiters.PreviousDelimiter = nil + } + if p.lastDelimiter != nil { + p.lastDelimiter.NextDelimiter = nil + } + d.NextDelimiter = nil + d.PreviousDelimiter = nil + if d.Length != 0 { + ast.MergeOrReplaceTextSegment(d.Parent(), d, d.Segment) + } else { + d.Parent().RemoveChild(d.Parent(), d) + } +} + +func (p *parseContext) ClearDelimiters(bottom ast.Node) { + if p.lastDelimiter == nil { + return + } + var c ast.Node + for c = p.lastDelimiter; c != nil && c != bottom; { + prev := c.PreviousSibling() + if d, ok := c.(*Delimiter); ok { + p.RemoveDelimiter(d) + } + c = prev + } +} + +func (p *parseContext) AddReference(ref Reference) { + key := util.ToLinkReference(ref.Label()) + if _, ok := p.refs[key]; !ok { + p.refs[key] = ref + } +} + +func (p *parseContext) Reference(label string) (Reference, bool) { + v, ok := p.refs[label] + return v, ok +} + +func (p *parseContext) References() []Reference { + ret := make([]Reference, 0, len(p.refs)) + for _, v := range p.refs { + ret = append(ret, v) + } + return ret +} + +func (p *parseContext) String() string { + refs := []string{} + for _, r := range p.refs { + refs = append(refs, r.String()) + } + + return fmt.Sprintf("Context{Store:%#v, Refs:%s}", p.store, strings.Join(refs, ",")) +} + +func (p *parseContext) OpenedBlocks() []Block { + return p.openedBlocks +} + +func (p *parseContext) SetOpenedBlocks(v []Block) { + p.openedBlocks = v +} + +func (p *parseContext) LastOpenedBlock() Block { + if l := len(p.openedBlocks); l != 0 { + return p.openedBlocks[l-1] + } + return Block{} +} + +func (p *parseContext) IsInLinkLabel() bool { + tlist := p.Get(linkLabelStateKey) + return tlist != nil +} + +// State represents parser's state. +// State is designed to use as a bit flag. +type State int + +const ( + // None is a default value of the [State]. + None State = 1 << iota + + // Continue indicates parser can continue parsing. + Continue + + // Close indicates parser cannot parse anymore. + Close + + // HasChildren indicates parser may have child blocks. + HasChildren + + // NoChildren indicates parser does not have child blocks. + NoChildren + + // RequireParagraph indicates parser requires that the last node + // must be a paragraph and is not converted to other nodes by + // ParagraphTransformers. + RequireParagraph +) + +// A Config struct is a data structure that holds configuration of the Parser. +type Config struct { + Options map[OptionName]interface{} + BlockParsers util.PrioritizedSlice /**/ + InlineParsers util.PrioritizedSlice /**/ + ParagraphTransformers util.PrioritizedSlice /**/ + ASTTransformers util.PrioritizedSlice /**/ + EscapedSpace bool +} + +// NewConfig returns a new Config. +func NewConfig() *Config { + return &Config{ + Options: map[OptionName]interface{}{}, + BlockParsers: util.PrioritizedSlice{}, + InlineParsers: util.PrioritizedSlice{}, + ParagraphTransformers: util.PrioritizedSlice{}, + ASTTransformers: util.PrioritizedSlice{}, + } +} + +// An Option interface is a functional option type for the Parser. +type Option interface { + SetParserOption(*Config) +} + +// OptionName is a name of parser options. +type OptionName string + +// Attribute is an option name that spacify attributes of elements. +const optAttribute OptionName = "Attribute" + +type withAttribute struct { +} + +func (o *withAttribute) SetParserOption(c *Config) { + c.Options[optAttribute] = true +} + +// WithAttribute is a functional option that enables custom attributes. +func WithAttribute() Option { + return &withAttribute{} +} + +// A Parser interface parses Markdown text into AST nodes. +type Parser interface { + // Parse parses the given Markdown text into AST nodes. + Parse(reader text.Reader, opts ...ParseOption) ast.Node + + // AddOption adds the given option to this parser. + AddOptions(...Option) +} + +// A SetOptioner interface sets the given option to the object. +type SetOptioner interface { + // SetOption sets the given option to the object. + // Unacceptable options may be passed. + // Thus implementations must ignore unacceptable options. + SetOption(name OptionName, value interface{}) +} + +// A BlockParser interface parses a block level element like Paragraph, List, +// Blockquote etc. +type BlockParser interface { + // Trigger returns a list of characters that triggers Parse method of + // this parser. + // If Trigger returns a nil, Open will be called with any lines. + Trigger() []byte + + // Open parses the current line and returns a result of parsing. + // + // Open must not parse beyond the current line. + // If Open has been able to parse the current line, Open must advance a reader + // position by consumed byte length. + // + // If Open has not been able to parse the current line, Open should returns + // (nil, NoChildren). If Open has been able to parse the current line, Open + // should returns a new Block node and returns HasChildren or NoChildren. + Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) + + // Continue parses the current line and returns a result of parsing. + // + // Continue must not parse beyond the current line. + // If Continue has been able to parse the current line, Continue must advance + // a reader position by consumed byte length. + // + // If Continue has not been able to parse the current line, Continue should + // returns Close. If Continue has been able to parse the current line, + // Continue should returns (Continue | NoChildren) or + // (Continue | HasChildren) + Continue(node ast.Node, reader text.Reader, pc Context) State + + // Close will be called when the parser returns Close. + Close(node ast.Node, reader text.Reader, pc Context) + + // CanInterruptParagraph returns true if the parser can interrupt paragraphs, + // otherwise false. + CanInterruptParagraph() bool + + // CanAcceptIndentedLine returns true if the parser can open new node when + // the given line is being indented more than 3 spaces. + CanAcceptIndentedLine() bool +} + +// An InlineParser interface parses an inline level element like CodeSpan, Link etc. +type InlineParser interface { + // Trigger returns a list of characters that triggers Parse method of + // this parser. + // Trigger characters must be a punctuation or a halfspace. + // Halfspaces triggers this parser when character is any spaces characters or + // a head of line + Trigger() []byte + + // Parse parse the given block into an inline node. + // + // Parse can parse beyond the current line. + // If Parse has been able to parse the current line, it must advance a reader + // position by consumed byte length. + Parse(parent ast.Node, block text.Reader, pc Context) ast.Node +} + +// A CloseBlocker interface is a callback function that will be +// called when block is closed in the inline parsing. +type CloseBlocker interface { + // CloseBlock will be called when a block is closed. + CloseBlock(parent ast.Node, block text.Reader, pc Context) +} + +// A ParagraphTransformer transforms parsed Paragraph nodes. +// For example, link references are searched in parsed Paragraphs. +type ParagraphTransformer interface { + // Transform transforms the given paragraph. + Transform(node *ast.Paragraph, reader text.Reader, pc Context) +} + +// ASTTransformer transforms entire Markdown document AST tree. +type ASTTransformer interface { + // Transform transforms the given AST tree. + Transform(node *ast.Document, reader text.Reader, pc Context) +} + +// DefaultBlockParsers returns a new list of default BlockParsers. +// Priorities of default BlockParsers are: +// +// SetextHeadingParser, 100 +// ThematicBreakParser, 200 +// ListParser, 300 +// ListItemParser, 400 +// CodeBlockParser, 500 +// ATXHeadingParser, 600 +// FencedCodeBlockParser, 700 +// BlockquoteParser, 800 +// HTMLBlockParser, 900 +// ParagraphParser, 1000 +func DefaultBlockParsers() []util.PrioritizedValue { + return []util.PrioritizedValue{ + util.Prioritized(NewSetextHeadingParser(), 100), + util.Prioritized(NewThematicBreakParser(), 200), + util.Prioritized(NewListParser(), 300), + util.Prioritized(NewListItemParser(), 400), + util.Prioritized(NewCodeBlockParser(), 500), + util.Prioritized(NewATXHeadingParser(), 600), + util.Prioritized(NewFencedCodeBlockParser(), 700), + util.Prioritized(NewBlockquoteParser(), 800), + util.Prioritized(NewHTMLBlockParser(), 900), + util.Prioritized(NewParagraphParser(), 1000), + } +} + +// DefaultInlineParsers returns a new list of default InlineParsers. +// Priorities of default InlineParsers are: +// +// CodeSpanParser, 100 +// LinkParser, 200 +// AutoLinkParser, 300 +// RawHTMLParser, 400 +// EmphasisParser, 500 +func DefaultInlineParsers() []util.PrioritizedValue { + return []util.PrioritizedValue{ + util.Prioritized(NewCodeSpanParser(), 100), + util.Prioritized(NewLinkParser(), 200), + util.Prioritized(NewAutoLinkParser(), 300), + util.Prioritized(NewRawHTMLParser(), 400), + util.Prioritized(NewEmphasisParser(), 500), + } +} + +// DefaultParagraphTransformers returns a new list of default ParagraphTransformers. +// Priorities of default ParagraphTransformers are: +// +// LinkReferenceParagraphTransformer, 100 +func DefaultParagraphTransformers() []util.PrioritizedValue { + return []util.PrioritizedValue{ + util.Prioritized(LinkReferenceParagraphTransformer, 100), + } +} + +// A Block struct holds a node and correspond parser pair. +type Block struct { + // Node is a BlockNode. + Node ast.Node + // Parser is a BlockParser. + Parser BlockParser +} + +type parser struct { + options map[OptionName]interface{} + blockParsers [256][]BlockParser + freeBlockParsers []BlockParser + inlineParsers [256][]InlineParser + closeBlockers []CloseBlocker + paragraphTransformers []ParagraphTransformer + astTransformers []ASTTransformer + escapedSpace bool + config *Config + initSync sync.Once +} + +type withBlockParsers struct { + value []util.PrioritizedValue +} + +func (o *withBlockParsers) SetParserOption(c *Config) { + c.BlockParsers = append(c.BlockParsers, o.value...) +} + +// WithBlockParsers is a functional option that allow you to add +// BlockParsers to the parser. +func WithBlockParsers(bs ...util.PrioritizedValue) Option { + return &withBlockParsers{bs} +} + +type withInlineParsers struct { + value []util.PrioritizedValue +} + +func (o *withInlineParsers) SetParserOption(c *Config) { + c.InlineParsers = append(c.InlineParsers, o.value...) +} + +// WithInlineParsers is a functional option that allow you to add +// InlineParsers to the parser. +func WithInlineParsers(bs ...util.PrioritizedValue) Option { + return &withInlineParsers{bs} +} + +type withParagraphTransformers struct { + value []util.PrioritizedValue +} + +func (o *withParagraphTransformers) SetParserOption(c *Config) { + c.ParagraphTransformers = append(c.ParagraphTransformers, o.value...) +} + +// WithParagraphTransformers is a functional option that allow you to add +// ParagraphTransformers to the parser. +func WithParagraphTransformers(ps ...util.PrioritizedValue) Option { + return &withParagraphTransformers{ps} +} + +type withASTTransformers struct { + value []util.PrioritizedValue +} + +func (o *withASTTransformers) SetParserOption(c *Config) { + c.ASTTransformers = append(c.ASTTransformers, o.value...) +} + +// WithASTTransformers is a functional option that allow you to add +// ASTTransformers to the parser. +func WithASTTransformers(ps ...util.PrioritizedValue) Option { + return &withASTTransformers{ps} +} + +type withEscapedSpace struct { +} + +func (o *withEscapedSpace) SetParserOption(c *Config) { + c.EscapedSpace = true +} + +// WithEscapedSpace is a functional option indicates that a '\' escaped half-space(0x20) should not trigger parsers. +func WithEscapedSpace() Option { + return &withEscapedSpace{} +} + +type withOption struct { + name OptionName + value interface{} +} + +func (o *withOption) SetParserOption(c *Config) { + c.Options[o.name] = o.value +} + +// WithOption is a functional option that allow you to set +// an arbitrary option to the parser. +func WithOption(name OptionName, value interface{}) Option { + return &withOption{name, value} +} + +// NewParser returns a new Parser with given options. +func NewParser(options ...Option) Parser { + config := NewConfig() + for _, opt := range options { + opt.SetParserOption(config) + } + + p := &parser{ + options: map[OptionName]interface{}{}, + config: config, + } + + return p +} + +func (p *parser) AddOptions(opts ...Option) { + for _, opt := range opts { + opt.SetParserOption(p.config) + } +} + +func (p *parser) addBlockParser(v util.PrioritizedValue, options map[OptionName]interface{}) { + bp, ok := v.Value.(BlockParser) + if !ok { + panic(fmt.Sprintf("%v is not a BlockParser", v.Value)) + } + tcs := bp.Trigger() + so, ok := v.Value.(SetOptioner) + if ok { + for oname, ovalue := range options { + so.SetOption(oname, ovalue) + } + } + if tcs == nil { + p.freeBlockParsers = append(p.freeBlockParsers, bp) + } else { + for _, tc := range tcs { + if p.blockParsers[tc] == nil { + p.blockParsers[tc] = []BlockParser{} + } + p.blockParsers[tc] = append(p.blockParsers[tc], bp) + } + } +} + +func (p *parser) addInlineParser(v util.PrioritizedValue, options map[OptionName]interface{}) { + ip, ok := v.Value.(InlineParser) + if !ok { + panic(fmt.Sprintf("%v is not a InlineParser", v.Value)) + } + tcs := ip.Trigger() + so, ok := v.Value.(SetOptioner) + if ok { + for oname, ovalue := range options { + so.SetOption(oname, ovalue) + } + } + if cb, ok := ip.(CloseBlocker); ok { + p.closeBlockers = append(p.closeBlockers, cb) + } + for _, tc := range tcs { + if p.inlineParsers[tc] == nil { + p.inlineParsers[tc] = []InlineParser{} + } + p.inlineParsers[tc] = append(p.inlineParsers[tc], ip) + } +} + +func (p *parser) addParagraphTransformer(v util.PrioritizedValue, options map[OptionName]interface{}) { + pt, ok := v.Value.(ParagraphTransformer) + if !ok { + panic(fmt.Sprintf("%v is not a ParagraphTransformer", v.Value)) + } + so, ok := v.Value.(SetOptioner) + if ok { + for oname, ovalue := range options { + so.SetOption(oname, ovalue) + } + } + p.paragraphTransformers = append(p.paragraphTransformers, pt) +} + +func (p *parser) addASTTransformer(v util.PrioritizedValue, options map[OptionName]interface{}) { + at, ok := v.Value.(ASTTransformer) + if !ok { + panic(fmt.Sprintf("%v is not a ASTTransformer", v.Value)) + } + so, ok := v.Value.(SetOptioner) + if ok { + for oname, ovalue := range options { + so.SetOption(oname, ovalue) + } + } + p.astTransformers = append(p.astTransformers, at) +} + +// A ParseConfig struct is a data structure that holds configuration of the Parser.Parse. +type ParseConfig struct { + Context Context +} + +// A ParseOption is a functional option type for the Parser.Parse. +type ParseOption func(c *ParseConfig) + +// WithContext is a functional option that allow you to override +// a default context. +func WithContext(context Context) ParseOption { + return func(c *ParseConfig) { + c.Context = context + } +} + +func (p *parser) Parse(reader text.Reader, opts ...ParseOption) ast.Node { + p.initSync.Do(func() { + p.config.BlockParsers.Sort() + for _, v := range p.config.BlockParsers { + p.addBlockParser(v, p.config.Options) + } + for i := range p.blockParsers { + if p.blockParsers[i] != nil { + p.blockParsers[i] = append(p.blockParsers[i], p.freeBlockParsers...) + } + } + + p.config.InlineParsers.Sort() + for _, v := range p.config.InlineParsers { + p.addInlineParser(v, p.config.Options) + } + p.config.ParagraphTransformers.Sort() + for _, v := range p.config.ParagraphTransformers { + p.addParagraphTransformer(v, p.config.Options) + } + p.config.ASTTransformers.Sort() + for _, v := range p.config.ASTTransformers { + p.addASTTransformer(v, p.config.Options) + } + p.escapedSpace = p.config.EscapedSpace + p.config = nil + }) + c := &ParseConfig{} + for _, opt := range opts { + opt(c) + } + if c.Context == nil { + c.Context = NewContext() + } + pc := c.Context + root := ast.NewDocument() + p.parseBlocks(root, reader, pc) + + blockReader := text.NewBlockReader(reader.Source(), nil) + p.walkBlock(root, func(node ast.Node) { + p.parseBlock(blockReader, node, pc) + }) + for _, at := range p.astTransformers { + at.Transform(root, reader, pc) + } + // root.Dump(reader.Source(), 0) + return root +} + +func (p *parser) transformParagraph(node *ast.Paragraph, reader text.Reader, pc Context) bool { + for _, pt := range p.paragraphTransformers { + pt.Transform(node, reader, pc) + if node.Parent() == nil { + return true + } + } + return false +} + +func (p *parser) closeBlocks(from, to int, reader text.Reader, pc Context) { + blocks := pc.OpenedBlocks() + for i := from; i >= to; i-- { + node := blocks[i].Node + paragraph, ok := node.(*ast.Paragraph) + if ok && node.Parent() != nil { + p.transformParagraph(paragraph, reader, pc) + } + if node.Parent() != nil { // closes only if node has not been transformed + blocks[i].Parser.Close(blocks[i].Node, reader, pc) + } + } + if from == len(blocks)-1 { + blocks = blocks[0:to] + } else { + blocks = append(blocks[0:to], blocks[from+1:]...) + } + pc.SetOpenedBlocks(blocks) +} + +type blockOpenResult int + +const ( + paragraphContinuation blockOpenResult = iota + 1 + newBlocksOpened + noBlocksOpened +) + +func (p *parser) openBlocks(parent ast.Node, blankLine bool, reader text.Reader, pc Context) blockOpenResult { + result := blockOpenResult(noBlocksOpened) + continuable := false + lastBlock := pc.LastOpenedBlock() + if lastBlock.Node != nil { + continuable = ast.IsParagraph(lastBlock.Node) + } +retry: + var bps []BlockParser + line, _ := reader.PeekLine() + w, pos := util.IndentWidth(line, reader.LineOffset()) + if w >= len(line) { + pc.SetBlockOffset(-1) + pc.SetBlockIndent(-1) + } else { + pc.SetBlockOffset(pos) + pc.SetBlockIndent(w) + } + if line == nil || line[0] == '\n' { + goto continuable + } + bps = p.freeBlockParsers + if pos < len(line) { + bps = p.blockParsers[line[pos]] + if bps == nil { + bps = p.freeBlockParsers + } + } + if bps == nil { + goto continuable + } + + for _, bp := range bps { + if continuable && result == noBlocksOpened && !bp.CanInterruptParagraph() { + continue + } + if w > 3 && !bp.CanAcceptIndentedLine() { + continue + } + lastBlock = pc.LastOpenedBlock() + last := lastBlock.Node + node, state := bp.Open(parent, reader, pc) + if node != nil { + // Parser requires last node to be a paragraph. + // With table extension: + // + // 0 + // -: + // - + // + // '-' on 3rd line seems a Setext heading because 1st and 2nd lines + // are being paragraph when the Settext heading parser tries to parse the 3rd + // line. + // But 1st line and 2nd line are a table. Thus this paragraph will be transformed + // by a paragraph transformer. So this text should be converted to a table and + // an empty list. + if state&RequireParagraph != 0 { + if last == parent.LastChild() { + // Opened paragraph may be transformed by ParagraphTransformers in + // closeBlocks(). + lastBlock.Parser.Close(last, reader, pc) + blocks := pc.OpenedBlocks() + pc.SetOpenedBlocks(blocks[0 : len(blocks)-1]) + if p.transformParagraph(last.(*ast.Paragraph), reader, pc) { + // Paragraph has been transformed. + // So this parser is considered as failing. + continuable = false + goto retry + } + } + } + node.SetBlankPreviousLines(blankLine) + if last != nil && last.Parent() == nil { + lastPos := len(pc.OpenedBlocks()) - 1 + p.closeBlocks(lastPos, lastPos, reader, pc) + } + parent.AppendChild(parent, node) + result = newBlocksOpened + be := Block{node, bp} + pc.SetOpenedBlocks(append(pc.OpenedBlocks(), be)) + if state&HasChildren != 0 { + parent = node + goto retry // try child block + } + break // no children, can not open more blocks on this line + } + } + +continuable: + if result == noBlocksOpened && continuable { + state := lastBlock.Parser.Continue(lastBlock.Node, reader, pc) + if state&Continue != 0 { + result = paragraphContinuation + } + } + return result +} + +type lineStat struct { + lineNum int + level int + isBlank bool +} + +func isBlankLine(lineNum, level int, stats []lineStat) bool { + ret := true + for i := len(stats) - 1 - level; i >= 0; i-- { + ret = false + s := stats[i] + if s.lineNum == lineNum { + if s.level < level && s.isBlank { + return true + } else if s.level == level { + return s.isBlank + } + } + if s.lineNum < lineNum { + return ret + } + } + return ret +} + +func (p *parser) parseBlocks(parent ast.Node, reader text.Reader, pc Context) { + pc.SetOpenedBlocks([]Block{}) + blankLines := make([]lineStat, 0, 128) + var isBlank bool + for { // process blocks separated by blank lines + _, lines, ok := reader.SkipBlankLines() + if !ok { + return + } + lineNum, _ := reader.Position() + if lines != 0 { + blankLines = blankLines[0:0] + l := len(pc.OpenedBlocks()) + for i := 0; i < l; i++ { + blankLines = append(blankLines, lineStat{lineNum - 1, i, lines != 0}) + } + } + isBlank = isBlankLine(lineNum-1, 0, blankLines) + // first, we try to open blocks + if p.openBlocks(parent, isBlank, reader, pc) != newBlocksOpened { + return + } + reader.AdvanceLine() + for { // process opened blocks line by line + openedBlocks := pc.OpenedBlocks() + l := len(openedBlocks) + if l == 0 { + break + } + lastIndex := l - 1 + for i := 0; i < l; i++ { + be := openedBlocks[i] + line, _ := reader.PeekLine() + if line == nil { + p.closeBlocks(lastIndex, 0, reader, pc) + reader.AdvanceLine() + return + } + lineNum, _ := reader.Position() + blankLines = append(blankLines, lineStat{lineNum, i, util.IsBlank(line)}) + // If node is a paragraph, p.openBlocks determines whether it is continuable. + // So we do not process paragraphs here. + if !ast.IsParagraph(be.Node) { + state := be.Parser.Continue(be.Node, reader, pc) + if state&Continue != 0 { + // When current node is a container block and has no children, + // we try to open new child nodes + if state&HasChildren != 0 && i == lastIndex { + isBlank = isBlankLine(lineNum-1, i, blankLines) + p.openBlocks(be.Node, isBlank, reader, pc) + break + } + continue + } + } + // current node may be closed or lazy continuation + isBlank = isBlankLine(lineNum-1, i, blankLines) + thisParent := parent + if i != 0 { + thisParent = openedBlocks[i-1].Node + } + lastNode := openedBlocks[lastIndex].Node + result := p.openBlocks(thisParent, isBlank, reader, pc) + if result != paragraphContinuation { + // lastNode is a paragraph and was transformed by the paragraph + // transformers. + if openedBlocks[lastIndex].Node != lastNode { + lastIndex-- + } + p.closeBlocks(lastIndex, i, reader, pc) + } + break + } + + reader.AdvanceLine() + } + } +} + +func (p *parser) walkBlock(block ast.Node, cb func(node ast.Node)) { + for c := block.FirstChild(); c != nil; c = c.NextSibling() { + p.walkBlock(c, cb) + } + cb(block) +} + +const ( + lineBreakHard uint8 = 1 << iota + lineBreakSoft + lineBreakVisible +) + +func (p *parser) parseBlock(block text.BlockReader, parent ast.Node, pc Context) { + if parent.IsRaw() { + return + } + escaped := false + source := block.Source() + block.Reset(parent.Lines()) + for { + retry: + line, _ := block.PeekLine() + if line == nil { + break + } + lineLength := len(line) + var lineBreakFlags uint8 + hasNewLine := line[lineLength-1] == '\n' + if ((lineLength >= 3 && line[lineLength-2] == '\\' && + line[lineLength-3] != '\\') || (lineLength == 2 && line[lineLength-2] == '\\')) && hasNewLine { // ends with \\n + lineLength -= 2 + lineBreakFlags |= lineBreakHard | lineBreakVisible + } else if ((lineLength >= 4 && line[lineLength-3] == '\\' && line[lineLength-2] == '\r' && + line[lineLength-4] != '\\') || (lineLength == 3 && line[lineLength-3] == '\\' && line[lineLength-2] == '\r')) && + hasNewLine { // ends with \\r\n + lineLength -= 3 + lineBreakFlags |= lineBreakHard | lineBreakVisible + } else if lineLength >= 3 && line[lineLength-3] == ' ' && line[lineLength-2] == ' ' && + hasNewLine { // ends with [space][space]\n + lineLength -= 3 + lineBreakFlags |= lineBreakHard + } else if lineLength >= 4 && line[lineLength-4] == ' ' && line[lineLength-3] == ' ' && + line[lineLength-2] == '\r' && hasNewLine { // ends with [space][space]\r\n + lineLength -= 4 + lineBreakFlags |= lineBreakHard + } else if hasNewLine { + // If the line ends with a newline character, but it is not a hardlineBreak, then it is a softLinebreak + // If the line ends with a hardlineBreak, then it cannot end with a softLinebreak + // See https://spec.commonmark.org/0.30/#soft-line-breaks + lineBreakFlags |= lineBreakSoft + } + + l, startPosition := block.Position() + n := 0 + for i := 0; i < lineLength; i++ { + c := line[i] + if c == '\n' { + break + } + isSpace := util.IsSpace(c) && c != '\r' && c != '\n' + isPunct := util.IsPunct(c) + if (isPunct && !escaped) || isSpace && !(escaped && p.escapedSpace) || i == 0 { + parserChar := c + if isSpace || (i == 0 && !isPunct) { + parserChar = ' ' + } + ips := p.inlineParsers[parserChar] + if ips != nil { + block.Advance(n) + n = 0 + savedLine, savedPosition := block.Position() + if i != 0 { + _, currentPosition := block.Position() + ast.MergeOrAppendTextSegment(parent, startPosition.Between(currentPosition)) + _, startPosition = block.Position() + } + var inlineNode ast.Node + for _, ip := range ips { + inlineNode = ip.Parse(parent, block, pc) + if inlineNode != nil { + break + } + block.SetPosition(savedLine, savedPosition) + } + if inlineNode != nil { + parent.AppendChild(parent, inlineNode) + goto retry + } + } + } + if escaped { + escaped = false + n++ + continue + } + + if c == '\\' { + escaped = true + n++ + continue + } + + escaped = false + n++ + } + if n != 0 { + block.Advance(n) + } + currentL, currentPosition := block.Position() + if l != currentL { + continue + } + diff := startPosition.Between(currentPosition) + var text *ast.Text + if lineBreakFlags&(lineBreakHard|lineBreakVisible) == lineBreakHard|lineBreakVisible { + text = ast.NewTextSegment(diff) + } else { + text = ast.NewTextSegment(diff.TrimRightSpace(source)) + } + text.SetSoftLineBreak(lineBreakFlags&lineBreakSoft != 0) + text.SetHardLineBreak(lineBreakFlags&lineBreakHard != 0) + parent.AppendChild(parent, text) + block.AdvanceLine() + } + + ProcessDelimiters(nil, pc) + for _, ip := range p.closeBlockers { + ip.CloseBlock(parent, block, pc) + } +} diff --git a/vendor/github.com/yuin/goldmark/parser/raw_html.go b/vendor/github.com/yuin/goldmark/parser/raw_html.go new file mode 100644 index 0000000..1d582a7 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/raw_html.go @@ -0,0 +1,153 @@ +package parser + +import ( + "bytes" + "regexp" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type rawHTMLParser struct { +} + +var defaultRawHTMLParser = &rawHTMLParser{} + +// NewRawHTMLParser return a new InlineParser that can parse +// inline htmls. +func NewRawHTMLParser() InlineParser { + return defaultRawHTMLParser +} + +func (s *rawHTMLParser) Trigger() []byte { + return []byte{'<'} +} + +func (s *rawHTMLParser) Parse(parent ast.Node, block text.Reader, pc Context) ast.Node { + line, _ := block.PeekLine() + if len(line) > 1 && util.IsAlphaNumeric(line[1]) { + return s.parseMultiLineRegexp(openTagRegexp, block, pc) + } + if len(line) > 2 && line[1] == '/' && util.IsAlphaNumeric(line[2]) { + return s.parseMultiLineRegexp(closeTagRegexp, block, pc) + } + if bytes.HasPrefix(line, openComment) { + return s.parseComment(block, pc) + } + if bytes.HasPrefix(line, openProcessingInstruction) { + return s.parseUntil(block, closeProcessingInstruction, pc) + } + if len(line) > 2 && line[1] == '!' && line[2] >= 'A' && line[2] <= 'Z' { + return s.parseUntil(block, closeDecl, pc) + } + if bytes.HasPrefix(line, openCDATA) { + return s.parseUntil(block, closeCDATA, pc) + } + return nil +} + +var tagnamePattern = `([A-Za-z][A-Za-z0-9-]*)` +var spaceOrOneNewline = `(?:[ \t]|(?:\r\n|\n){0,1})` +var attributePattern = `(?:[\r\n \t]+[a-zA-Z_:][a-zA-Z0-9:._-]*(?:[\r\n \t]*=[\r\n \t]*(?:[^\"'=<>` + "`" + `\x00-\x20]+|'[^']*'|"[^"]*"))?)` //nolint:golint,lll +var openTagRegexp = regexp.MustCompile("^<" + tagnamePattern + attributePattern + `*` + spaceOrOneNewline + `*/?>`) +var closeTagRegexp = regexp.MustCompile("^`) + +var openProcessingInstruction = []byte("") +var openCDATA = []byte("") +var closeDecl = []byte(">") +var emptyComment1 = []byte("") +var emptyComment2 = []byte("") +var openComment = []byte("") + +func (s *rawHTMLParser) parseComment(block text.Reader, pc Context) ast.Node { + savedLine, savedSegment := block.Position() + node := ast.NewRawHTML() + line, segment := block.PeekLine() + if bytes.HasPrefix(line, emptyComment1) { + node.Segments.Append(segment.WithStop(segment.Start + len(emptyComment1))) + block.Advance(len(emptyComment1)) + return node + } + if bytes.HasPrefix(line, emptyComment2) { + node.Segments.Append(segment.WithStop(segment.Start + len(emptyComment2))) + block.Advance(len(emptyComment2)) + return node + } + offset := len(openComment) + line = line[offset:] + for { + index := bytes.Index(line, closeComment) + if index > -1 { + node.Segments.Append(segment.WithStop(segment.Start + offset + index + len(closeComment))) + block.Advance(offset + index + len(closeComment)) + return node + } + offset = 0 + node.Segments.Append(segment) + block.AdvanceLine() + line, segment = block.PeekLine() + if line == nil { + break + } + } + block.SetPosition(savedLine, savedSegment) + return nil +} + +func (s *rawHTMLParser) parseUntil(block text.Reader, closer []byte, pc Context) ast.Node { + savedLine, savedSegment := block.Position() + node := ast.NewRawHTML() + for { + line, segment := block.PeekLine() + if line == nil { + break + } + index := bytes.Index(line, closer) + if index > -1 { + node.Segments.Append(segment.WithStop(segment.Start + index + len(closer))) + block.Advance(index + len(closer)) + return node + } + node.Segments.Append(segment) + block.AdvanceLine() + } + block.SetPosition(savedLine, savedSegment) + return nil +} + +func (s *rawHTMLParser) parseMultiLineRegexp(reg *regexp.Regexp, block text.Reader, pc Context) ast.Node { + sline, ssegment := block.Position() + if block.Match(reg) { + node := ast.NewRawHTML() + eline, esegment := block.Position() + block.SetPosition(sline, ssegment) + for { + line, segment := block.PeekLine() + if line == nil { + break + } + l, _ := block.Position() + start := segment.Start + if l == sline { + start = ssegment.Start + } + end := segment.Stop + if l == eline { + end = esegment.Start + } + + node.Segments.Append(text.NewSegment(start, end)) + if l == eline { + block.Advance(end - start) + break + } + block.AdvanceLine() + } + return node + } + return nil +} diff --git a/vendor/github.com/yuin/goldmark/parser/setext_headings.go b/vendor/github.com/yuin/goldmark/parser/setext_headings.go new file mode 100644 index 0000000..915bcc1 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/setext_headings.go @@ -0,0 +1,126 @@ +package parser + +import ( + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +var temporaryParagraphKey = NewContextKey() + +type setextHeadingParser struct { + HeadingConfig +} + +func matchesSetextHeadingBar(line []byte) (byte, bool) { + start := 0 + end := len(line) + space := util.TrimLeftLength(line, []byte{' '}) + if space > 3 { + return 0, false + } + start += space + level1 := util.TrimLeftLength(line[start:end], []byte{'='}) + c := byte('=') + var level2 int + if level1 == 0 { + level2 = util.TrimLeftLength(line[start:end], []byte{'-'}) + c = '-' + } + if util.IsSpace(line[end-1]) { + end -= util.TrimRightSpaceLength(line[start:end]) + } + if !((level1 > 0 && start+level1 == end) || (level2 > 0 && start+level2 == end)) { + return 0, false + } + return c, true +} + +// NewSetextHeadingParser return a new BlockParser that can parse Setext headings. +func NewSetextHeadingParser(opts ...HeadingOption) BlockParser { + p := &setextHeadingParser{} + for _, o := range opts { + o.SetHeadingOption(&p.HeadingConfig) + } + return p +} + +func (b *setextHeadingParser) Trigger() []byte { + return []byte{'-', '='} +} + +func (b *setextHeadingParser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { + last := pc.LastOpenedBlock().Node + if last == nil { + return nil, NoChildren + } + paragraph, ok := last.(*ast.Paragraph) + if !ok || paragraph.Parent() != parent { + return nil, NoChildren + } + line, segment := reader.PeekLine() + c, ok := matchesSetextHeadingBar(line) + if !ok { + return nil, NoChildren + } + level := 1 + if c == '-' { + level = 2 + } + node := ast.NewHeading(level) + node.Lines().Append(segment) + pc.Set(temporaryParagraphKey, last) + return node, NoChildren | RequireParagraph +} + +func (b *setextHeadingParser) Continue(node ast.Node, reader text.Reader, pc Context) State { + return Close +} + +func (b *setextHeadingParser) Close(node ast.Node, reader text.Reader, pc Context) { + heading := node.(*ast.Heading) + segment := node.Lines().At(0) + heading.Lines().Clear() + tmp := pc.Get(temporaryParagraphKey).(*ast.Paragraph) + pc.Set(temporaryParagraphKey, nil) + if tmp.Lines().Len() == 0 { + next := heading.NextSibling() + segment = segment.TrimLeftSpace(reader.Source()) + if next == nil || !ast.IsParagraph(next) { + para := ast.NewParagraph() + para.Lines().Append(segment) + heading.Parent().InsertAfter(heading.Parent(), heading, para) + } else { + next.Lines().Unshift(segment) + } + heading.Parent().RemoveChild(heading.Parent(), heading) + } else { + heading.SetLines(tmp.Lines()) + heading.SetBlankPreviousLines(tmp.HasBlankPreviousLines()) + tp := tmp.Parent() + if tp != nil { + tp.RemoveChild(tp, tmp) + } + } + + if b.Attribute { + parseLastLineAttributes(node, reader, pc) + } + + if b.AutoHeadingID { + id, ok := node.AttributeString("id") + if !ok { + generateAutoHeadingID(heading, reader, pc) + } else { + pc.IDs().Put(id.([]byte)) + } + } +} + +func (b *setextHeadingParser) CanInterruptParagraph() bool { + return true +} + +func (b *setextHeadingParser) CanAcceptIndentedLine() bool { + return false +} diff --git a/vendor/github.com/yuin/goldmark/parser/thematic_break.go b/vendor/github.com/yuin/goldmark/parser/thematic_break.go new file mode 100644 index 0000000..db20a1e --- /dev/null +++ b/vendor/github.com/yuin/goldmark/parser/thematic_break.go @@ -0,0 +1,75 @@ +package parser + +import ( + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/text" + "github.com/yuin/goldmark/util" +) + +type thematicBreakPraser struct { +} + +var defaultThematicBreakPraser = &thematicBreakPraser{} + +// NewThematicBreakParser returns a new BlockParser that +// parses thematic breaks. +func NewThematicBreakParser() BlockParser { + return defaultThematicBreakPraser +} + +func isThematicBreak(line []byte, offset int) bool { + w, pos := util.IndentWidth(line, offset) + if w > 3 { + return false + } + mark := byte(0) + count := 0 + for i := pos; i < len(line); i++ { + c := line[i] + if util.IsSpace(c) { + continue + } + if mark == 0 { + mark = c + count = 1 + if mark == '*' || mark == '-' || mark == '_' { + continue + } + return false + } + if c != mark { + return false + } + count++ + } + return count > 2 +} + +func (b *thematicBreakPraser) Trigger() []byte { + return []byte{'-', '*', '_'} +} + +func (b *thematicBreakPraser) Open(parent ast.Node, reader text.Reader, pc Context) (ast.Node, State) { + line, segment := reader.PeekLine() + if isThematicBreak(line, reader.LineOffset()) { + reader.Advance(segment.Len() - 1) + return ast.NewThematicBreak(), NoChildren + } + return nil, NoChildren +} + +func (b *thematicBreakPraser) Continue(node ast.Node, reader text.Reader, pc Context) State { + return Close +} + +func (b *thematicBreakPraser) Close(node ast.Node, reader text.Reader, pc Context) { + // nothing to do +} + +func (b *thematicBreakPraser) CanInterruptParagraph() bool { + return true +} + +func (b *thematicBreakPraser) CanAcceptIndentedLine() bool { + return false +} diff --git a/vendor/github.com/yuin/goldmark/renderer/html/html.go b/vendor/github.com/yuin/goldmark/renderer/html/html.go new file mode 100644 index 0000000..9ebd0a3 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/renderer/html/html.go @@ -0,0 +1,1026 @@ +// Package html implements renderer that outputs HTMLs. +package html + +import ( + "bytes" + "fmt" + "strconv" + "unicode" + "unicode/utf8" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/renderer" + "github.com/yuin/goldmark/util" +) + +// A Config struct has configurations for the HTML based renderers. +type Config struct { + Writer Writer + HardWraps bool + EastAsianLineBreaks EastAsianLineBreaks + XHTML bool + Unsafe bool +} + +// NewConfig returns a new Config with defaults. +func NewConfig() Config { + return Config{ + Writer: DefaultWriter, + HardWraps: false, + EastAsianLineBreaks: EastAsianLineBreaksNone, + XHTML: false, + Unsafe: false, + } +} + +// SetOption implements renderer.NodeRenderer.SetOption. +func (c *Config) SetOption(name renderer.OptionName, value interface{}) { + switch name { + case optHardWraps: + c.HardWraps = value.(bool) + case optEastAsianLineBreaks: + c.EastAsianLineBreaks = value.(EastAsianLineBreaks) + case optXHTML: + c.XHTML = value.(bool) + case optUnsafe: + c.Unsafe = value.(bool) + case optTextWriter: + c.Writer = value.(Writer) + } +} + +// An Option interface sets options for HTML based renderers. +type Option interface { + SetHTMLOption(*Config) +} + +// TextWriter is an option name used in WithWriter. +const optTextWriter renderer.OptionName = "Writer" + +type withWriter struct { + value Writer +} + +func (o *withWriter) SetConfig(c *renderer.Config) { + c.Options[optTextWriter] = o.value +} + +func (o *withWriter) SetHTMLOption(c *Config) { + c.Writer = o.value +} + +// WithWriter is a functional option that allow you to set the given writer to +// the renderer. +func WithWriter(writer Writer) interface { + renderer.Option + Option +} { + return &withWriter{writer} +} + +// HardWraps is an option name used in WithHardWraps. +const optHardWraps renderer.OptionName = "HardWraps" + +type withHardWraps struct { +} + +func (o *withHardWraps) SetConfig(c *renderer.Config) { + c.Options[optHardWraps] = true +} + +func (o *withHardWraps) SetHTMLOption(c *Config) { + c.HardWraps = true +} + +// WithHardWraps is a functional option that indicates whether softline breaks +// should be rendered as '
    '. +func WithHardWraps() interface { + renderer.Option + Option +} { + return &withHardWraps{} +} + +// EastAsianLineBreaks is an option name used in WithEastAsianLineBreaks. +const optEastAsianLineBreaks renderer.OptionName = "EastAsianLineBreaks" + +// A EastAsianLineBreaks is a style of east asian line breaks. +type EastAsianLineBreaks int + +const ( + //EastAsianLineBreaksNone renders line breaks as it is. + EastAsianLineBreaksNone EastAsianLineBreaks = iota + // EastAsianLineBreaksSimple follows east_asian_line_breaks in Pandoc. + EastAsianLineBreaksSimple + // EastAsianLineBreaksCSS3Draft follows CSS text level3 "Segment Break Transformation Rules" with some enhancements. + EastAsianLineBreaksCSS3Draft +) + +func (b EastAsianLineBreaks) softLineBreak(thisLastRune rune, siblingFirstRune rune) bool { + switch b { + case EastAsianLineBreaksNone: + return false + case EastAsianLineBreaksSimple: + return !(util.IsEastAsianWideRune(thisLastRune) && util.IsEastAsianWideRune(siblingFirstRune)) + case EastAsianLineBreaksCSS3Draft: + return eastAsianLineBreaksCSS3DraftSoftLineBreak(thisLastRune, siblingFirstRune) + } + return false +} + +func eastAsianLineBreaksCSS3DraftSoftLineBreak(thisLastRune rune, siblingFirstRune rune) bool { + // Implements CSS text level3 Segment Break Transformation Rules with some enhancements. + // References: + // - https://www.w3.org/TR/2020/WD-css-text-3-20200429/#line-break-transform + // - https://github.com/w3c/csswg-drafts/issues/5086 + + // Rule1: + // If the character immediately before or immediately after the segment break is + // the zero-width space character (U+200B), then the break is removed, leaving behind the zero-width space. + if thisLastRune == '\u200B' || siblingFirstRune == '\u200B' { + return false + } + + // Rule2: + // Otherwise, if the East Asian Width property of both the character before and after the segment break is + // F, W, or H (not A), and neither side is Hangul, then the segment break is removed. + thisLastRuneEastAsianWidth := util.EastAsianWidth(thisLastRune) + siblingFirstRuneEastAsianWidth := util.EastAsianWidth(siblingFirstRune) + if (thisLastRuneEastAsianWidth == "F" || + thisLastRuneEastAsianWidth == "W" || + thisLastRuneEastAsianWidth == "H") && + (siblingFirstRuneEastAsianWidth == "F" || + siblingFirstRuneEastAsianWidth == "W" || + siblingFirstRuneEastAsianWidth == "H") { + return unicode.Is(unicode.Hangul, thisLastRune) || unicode.Is(unicode.Hangul, siblingFirstRune) + } + + // Rule3: + // Otherwise, if either the character before or after the segment break belongs to + // the space-discarding character set and it is a Unicode Punctuation (P*) or U+3000, + // then the segment break is removed. + if util.IsSpaceDiscardingUnicodeRune(thisLastRune) || + unicode.IsPunct(thisLastRune) || + thisLastRune == '\u3000' || + util.IsSpaceDiscardingUnicodeRune(siblingFirstRune) || + unicode.IsPunct(siblingFirstRune) || + siblingFirstRune == '\u3000' { + return false + } + + // Rule4: + // Otherwise, the segment break is converted to a space (U+0020). + return true +} + +type withEastAsianLineBreaks struct { + eastAsianLineBreaksStyle EastAsianLineBreaks +} + +func (o *withEastAsianLineBreaks) SetConfig(c *renderer.Config) { + c.Options[optEastAsianLineBreaks] = o.eastAsianLineBreaksStyle +} + +func (o *withEastAsianLineBreaks) SetHTMLOption(c *Config) { + c.EastAsianLineBreaks = o.eastAsianLineBreaksStyle +} + +// WithEastAsianLineBreaks is a functional option that indicates whether softline breaks +// between east asian wide characters should be ignored. +func WithEastAsianLineBreaks(e EastAsianLineBreaks) interface { + renderer.Option + Option +} { + return &withEastAsianLineBreaks{e} +} + +// XHTML is an option name used in WithXHTML. +const optXHTML renderer.OptionName = "XHTML" + +type withXHTML struct { +} + +func (o *withXHTML) SetConfig(c *renderer.Config) { + c.Options[optXHTML] = true +} + +func (o *withXHTML) SetHTMLOption(c *Config) { + c.XHTML = true +} + +// WithXHTML is a functional option indicates that nodes should be rendered in +// xhtml instead of HTML5. +func WithXHTML() interface { + Option + renderer.Option +} { + return &withXHTML{} +} + +// Unsafe is an option name used in WithUnsafe. +const optUnsafe renderer.OptionName = "Unsafe" + +type withUnsafe struct { +} + +func (o *withUnsafe) SetConfig(c *renderer.Config) { + c.Options[optUnsafe] = true +} + +func (o *withUnsafe) SetHTMLOption(c *Config) { + c.Unsafe = true +} + +// WithUnsafe is a functional option that renders dangerous contents +// (raw htmls and potentially dangerous links) as it is. +func WithUnsafe() interface { + renderer.Option + Option +} { + return &withUnsafe{} +} + +// A Renderer struct is an implementation of renderer.NodeRenderer that renders +// nodes as (X)HTML. +type Renderer struct { + Config +} + +// NewRenderer returns a new Renderer with given options. +func NewRenderer(opts ...Option) renderer.NodeRenderer { + r := &Renderer{ + Config: NewConfig(), + } + + for _, opt := range opts { + opt.SetHTMLOption(&r.Config) + } + return r +} + +// RegisterFuncs implements NodeRenderer.RegisterFuncs . +func (r *Renderer) RegisterFuncs(reg renderer.NodeRendererFuncRegisterer) { + // blocks + + reg.Register(ast.KindDocument, r.renderDocument) + reg.Register(ast.KindHeading, r.renderHeading) + reg.Register(ast.KindBlockquote, r.renderBlockquote) + reg.Register(ast.KindCodeBlock, r.renderCodeBlock) + reg.Register(ast.KindFencedCodeBlock, r.renderFencedCodeBlock) + reg.Register(ast.KindHTMLBlock, r.renderHTMLBlock) + reg.Register(ast.KindList, r.renderList) + reg.Register(ast.KindListItem, r.renderListItem) + reg.Register(ast.KindParagraph, r.renderParagraph) + reg.Register(ast.KindTextBlock, r.renderTextBlock) + reg.Register(ast.KindThematicBreak, r.renderThematicBreak) + + // inlines + + reg.Register(ast.KindAutoLink, r.renderAutoLink) + reg.Register(ast.KindCodeSpan, r.renderCodeSpan) + reg.Register(ast.KindEmphasis, r.renderEmphasis) + reg.Register(ast.KindImage, r.renderImage) + reg.Register(ast.KindLink, r.renderLink) + reg.Register(ast.KindRawHTML, r.renderRawHTML) + reg.Register(ast.KindText, r.renderText) + reg.Register(ast.KindString, r.renderString) +} + +func (r *Renderer) writeLines(w util.BufWriter, source []byte, n ast.Node) { + l := n.Lines().Len() + for i := 0; i < l; i++ { + line := n.Lines().At(i) + r.Writer.RawWrite(w, line.Value(source)) + } +} + +// GlobalAttributeFilter defines attribute names which any elements can have. +var GlobalAttributeFilter = util.NewBytesFilter( + []byte("accesskey"), + []byte("autocapitalize"), + []byte("autofocus"), + []byte("class"), + []byte("contenteditable"), + []byte("dir"), + []byte("draggable"), + []byte("enterkeyhint"), + []byte("hidden"), + []byte("id"), + []byte("inert"), + []byte("inputmode"), + []byte("is"), + []byte("itemid"), + []byte("itemprop"), + []byte("itemref"), + []byte("itemscope"), + []byte("itemtype"), + []byte("lang"), + []byte("part"), + []byte("role"), + []byte("slot"), + []byte("spellcheck"), + []byte("style"), + []byte("tabindex"), + []byte("title"), + []byte("translate"), +) + +func (r *Renderer) renderDocument( + w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + // nothing to do + return ast.WalkContinue, nil +} + +// HeadingAttributeFilter defines attribute names which heading elements can have. +var HeadingAttributeFilter = GlobalAttributeFilter + +func (r *Renderer) renderHeading( + w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + n := node.(*ast.Heading) + if entering { + _, _ = w.WriteString("') + } else { + _, _ = w.WriteString("\n") + } + return ast.WalkContinue, nil +} + +// BlockquoteAttributeFilter defines attribute names which blockquote elements can have. +var BlockquoteAttributeFilter = GlobalAttributeFilter.Extend( + []byte("cite"), +) + +func (r *Renderer) renderBlockquote( + w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) { + if entering { + if n.Attributes() != nil { + _, _ = w.WriteString("') + } else { + _, _ = w.WriteString("
    \n") + } + } else { + _, _ = w.WriteString("
    \n") + } + return ast.WalkContinue, nil +} + +func (r *Renderer) renderCodeBlock(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) { + if entering { + _, _ = w.WriteString("
    ")
    +		r.writeLines(w, source, n)
    +	} else {
    +		_, _ = w.WriteString("
    \n") + } + return ast.WalkContinue, nil +} + +func (r *Renderer) renderFencedCodeBlock( + w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + n := node.(*ast.FencedCodeBlock) + if entering { + _, _ = w.WriteString("
    ')
    +		r.writeLines(w, source, n)
    +	} else {
    +		_, _ = w.WriteString("
    \n") + } + return ast.WalkContinue, nil +} + +func (r *Renderer) renderHTMLBlock( + w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + n := node.(*ast.HTMLBlock) + if entering { + if r.Unsafe { + l := n.Lines().Len() + for i := 0; i < l; i++ { + line := n.Lines().At(i) + r.Writer.SecureWrite(w, line.Value(source)) + } + } else { + _, _ = w.WriteString("\n") + } + } else { + if n.HasClosure() { + if r.Unsafe { + closure := n.ClosureLine + r.Writer.SecureWrite(w, closure.Value(source)) + } else { + _, _ = w.WriteString("\n") + } + } + } + return ast.WalkContinue, nil +} + +// ListAttributeFilter defines attribute names which list elements can have. +var ListAttributeFilter = GlobalAttributeFilter.Extend( + []byte("start"), + []byte("reversed"), + []byte("type"), +) + +func (r *Renderer) renderList(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + n := node.(*ast.List) + tag := "ul" + if n.IsOrdered() { + tag = "ol" + } + if entering { + _ = w.WriteByte('<') + _, _ = w.WriteString(tag) + if n.IsOrdered() && n.Start != 1 { + _, _ = fmt.Fprintf(w, " start=\"%d\"", n.Start) + } + if n.Attributes() != nil { + RenderAttributes(w, n, ListAttributeFilter) + } + _, _ = w.WriteString(">\n") + } else { + _, _ = w.WriteString("\n") + } + return ast.WalkContinue, nil +} + +// ListItemAttributeFilter defines attribute names which list item elements can have. +var ListItemAttributeFilter = GlobalAttributeFilter.Extend( + []byte("value"), +) + +func (r *Renderer) renderListItem(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) { + if entering { + if n.Attributes() != nil { + _, _ = w.WriteString("') + } else { + _, _ = w.WriteString("
  • ") + } + fc := n.FirstChild() + if fc != nil { + if _, ok := fc.(*ast.TextBlock); !ok { + _ = w.WriteByte('\n') + } + } + } else { + _, _ = w.WriteString("
  • \n") + } + return ast.WalkContinue, nil +} + +// ParagraphAttributeFilter defines attribute names which paragraph elements can have. +var ParagraphAttributeFilter = GlobalAttributeFilter + +func (r *Renderer) renderParagraph(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) { + if entering { + if n.Attributes() != nil { + _, _ = w.WriteString("') + } else { + _, _ = w.WriteString("

    ") + } + } else { + _, _ = w.WriteString("

    \n") + } + return ast.WalkContinue, nil +} + +func (r *Renderer) renderTextBlock(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) { + if !entering { + if n.NextSibling() != nil && n.FirstChild() != nil { + _ = w.WriteByte('\n') + } + } + return ast.WalkContinue, nil +} + +// ThematicAttributeFilter defines attribute names which hr elements can have. +var ThematicAttributeFilter = GlobalAttributeFilter.Extend( + []byte("align"), // [Deprecated] + []byte("color"), // [Not Standardized] + []byte("noshade"), // [Deprecated] + []byte("size"), // [Deprecated] + []byte("width"), // [Deprecated] +) + +func (r *Renderer) renderThematicBreak( + w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) { + if !entering { + return ast.WalkContinue, nil + } + _, _ = w.WriteString("\n") + } else { + _, _ = w.WriteString(">\n") + } + return ast.WalkContinue, nil +} + +// LinkAttributeFilter defines attribute names which link elements can have. +var LinkAttributeFilter = GlobalAttributeFilter.Extend( + []byte("download"), + // []byte("href"), + []byte("hreflang"), + []byte("media"), + []byte("ping"), + []byte("referrerpolicy"), + []byte("rel"), + []byte("shape"), + []byte("target"), +) + +func (r *Renderer) renderAutoLink( + w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + n := node.(*ast.AutoLink) + if !entering { + return ast.WalkContinue, nil + } + _, _ = w.WriteString(`') + } else { + _, _ = w.WriteString(`">`) + } + _, _ = w.Write(util.EscapeHTML(label)) + _, _ = w.WriteString(``) + return ast.WalkContinue, nil +} + +// CodeAttributeFilter defines attribute names which code elements can have. +var CodeAttributeFilter = GlobalAttributeFilter + +func (r *Renderer) renderCodeSpan(w util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) { + if entering { + if n.Attributes() != nil { + _, _ = w.WriteString("') + } else { + _, _ = w.WriteString("") + } + for c := n.FirstChild(); c != nil; c = c.NextSibling() { + segment := c.(*ast.Text).Segment + value := segment.Value(source) + if bytes.HasSuffix(value, []byte("\n")) { + r.Writer.RawWrite(w, value[:len(value)-1]) + r.Writer.RawWrite(w, []byte(" ")) + } else { + r.Writer.RawWrite(w, value) + } + } + return ast.WalkSkipChildren, nil + } + _, _ = w.WriteString("") + return ast.WalkContinue, nil +} + +// EmphasisAttributeFilter defines attribute names which emphasis elements can have. +var EmphasisAttributeFilter = GlobalAttributeFilter + +func (r *Renderer) renderEmphasis( + w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + n := node.(*ast.Emphasis) + tag := "em" + if n.Level == 2 { + tag = "strong" + } + if entering { + _ = w.WriteByte('<') + _, _ = w.WriteString(tag) + if n.Attributes() != nil { + RenderAttributes(w, n, EmphasisAttributeFilter) + } + _ = w.WriteByte('>') + } else { + _, _ = w.WriteString("') + } + return ast.WalkContinue, nil +} + +func (r *Renderer) renderLink(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + n := node.(*ast.Link) + if entering { + _, _ = w.WriteString("') + } else { + _, _ = w.WriteString("") + } + return ast.WalkContinue, nil +} + +// ImageAttributeFilter defines attribute names which image elements can have. +var ImageAttributeFilter = GlobalAttributeFilter.Extend( + []byte("align"), + []byte("border"), + []byte("crossorigin"), + []byte("decoding"), + []byte("height"), + []byte("importance"), + []byte("intrinsicsize"), + []byte("ismap"), + []byte("loading"), + []byte("referrerpolicy"), + []byte("sizes"), + []byte("srcset"), + []byte("usemap"), + []byte("width"), +) + +func (r *Renderer) renderImage(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + if !entering { + return ast.WalkContinue, nil + } + n := node.(*ast.Image) + _, _ = w.WriteString("`)
+	r.renderAttribute(w, source, n)
+	_ = w.WriteByte('") + } else { + _, _ = w.WriteString(">") + } + return ast.WalkSkipChildren, nil +} + +func (r *Renderer) renderRawHTML( + w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + if !entering { + return ast.WalkSkipChildren, nil + } + if r.Unsafe { + n := node.(*ast.RawHTML) + l := n.Segments.Len() + for i := 0; i < l; i++ { + segment := n.Segments.At(i) + _, _ = w.Write(segment.Value(source)) + } + return ast.WalkSkipChildren, nil + } + _, _ = w.WriteString("") + return ast.WalkSkipChildren, nil +} + +func (r *Renderer) renderText(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + if !entering { + return ast.WalkContinue, nil + } + n := node.(*ast.Text) + segment := n.Segment + if n.IsRaw() { + r.Writer.RawWrite(w, segment.Value(source)) + } else { + value := segment.Value(source) + r.Writer.Write(w, value) + if n.HardLineBreak() || (n.SoftLineBreak() && r.HardWraps) { + if r.XHTML { + _, _ = w.WriteString("
    \n") + } else { + _, _ = w.WriteString("
    \n") + } + } else if n.SoftLineBreak() { + if r.EastAsianLineBreaks != EastAsianLineBreaksNone && len(value) != 0 { + sibling := node.NextSibling() + if sibling != nil && sibling.Kind() == ast.KindText { + if siblingText := sibling.(*ast.Text).Text(source); len(siblingText) != 0 { + thisLastRune := util.ToRune(value, len(value)-1) + siblingFirstRune, _ := utf8.DecodeRune(siblingText) + if r.EastAsianLineBreaks.softLineBreak(thisLastRune, siblingFirstRune) { + _ = w.WriteByte('\n') + } + } + } + } else { + _ = w.WriteByte('\n') + } + } + } + return ast.WalkContinue, nil +} + +func (r *Renderer) renderString(w util.BufWriter, source []byte, node ast.Node, entering bool) (ast.WalkStatus, error) { + if !entering { + return ast.WalkContinue, nil + } + n := node.(*ast.String) + if n.IsCode() { + _, _ = w.Write(n.Value) + } else { + if n.IsRaw() { + r.Writer.RawWrite(w, n.Value) + } else { + r.Writer.Write(w, n.Value) + } + } + return ast.WalkContinue, nil +} + +func (r *Renderer) renderAttribute(w util.BufWriter, source []byte, n ast.Node) { + for c := n.FirstChild(); c != nil; c = c.NextSibling() { + if s, ok := c.(*ast.String); ok { + _, _ = r.renderString(w, source, s, true) + } else if t, ok := c.(*ast.String); ok { + _, _ = r.renderText(w, source, t, true) + } else if !c.HasChildren() { + r.Writer.Write(w, c.Text(source)) + if t, ok := c.(*ast.Text); ok && t.SoftLineBreak() { + _ = w.WriteByte('\n') + } + } else { + r.renderAttribute(w, source, c) + } + } +} + +var dataPrefix = []byte("data-") + +// RenderAttributes renders given node's attributes. +// You can specify attribute names to render by the filter. +// If filter is nil, RenderAttributes renders all attributes. +func RenderAttributes(w util.BufWriter, node ast.Node, filter util.BytesFilter) { + for _, attr := range node.Attributes() { + if filter != nil && !filter.Contains(attr.Name) { + if !bytes.HasPrefix(attr.Name, dataPrefix) { + continue + } + } + _, _ = w.WriteString(" ") + _, _ = w.Write(attr.Name) + _, _ = w.WriteString(`="`) + // TODO: convert numeric values to strings + var value []byte + switch typed := attr.Value.(type) { + case []byte: + value = typed + case string: + value = util.StringToReadOnlyBytes(typed) + } + _, _ = w.Write(util.EscapeHTML(value)) + _ = w.WriteByte('"') + } +} + +// A Writer interface writes textual contents to a writer. +type Writer interface { + // Write writes the given source to writer with resolving references and unescaping + // backslash escaped characters. + Write(writer util.BufWriter, source []byte) + + // RawWrite writes the given source to writer without resolving references and + // unescaping backslash escaped characters. + RawWrite(writer util.BufWriter, source []byte) + + // SecureWrite writes the given source to writer with replacing insecure characters. + SecureWrite(writer util.BufWriter, source []byte) +} + +var replacementCharacter = []byte("\ufffd") + +// A WriterConfig struct has configurations for the HTML based writers. +type WriterConfig struct { + // EscapedSpace is an option that indicates that a '\' escaped half-space(0x20) should not be rendered. + EscapedSpace bool +} + +// A WriterOption interface sets options for HTML based writers. +type WriterOption func(*WriterConfig) + +// WithEscapedSpace is a WriterOption indicates that a '\' escaped half-space(0x20) should not be rendered. +func WithEscapedSpace() WriterOption { + return func(c *WriterConfig) { + c.EscapedSpace = true + } +} + +type defaultWriter struct { + WriterConfig +} + +// NewWriter returns a new Writer. +func NewWriter(opts ...WriterOption) Writer { + w := &defaultWriter{} + for _, opt := range opts { + opt(&w.WriterConfig) + } + return w +} + +func escapeRune(writer util.BufWriter, r rune) { + if r < 256 { + v := util.EscapeHTMLByte(byte(r)) + if v != nil { + _, _ = writer.Write(v) + return + } + } + _, _ = writer.WriteRune(util.ToValidRune(r)) +} + +func (d *defaultWriter) SecureWrite(writer util.BufWriter, source []byte) { + n := 0 + l := len(source) + for i := 0; i < l; i++ { + if source[i] == '\u0000' { + _, _ = writer.Write(source[i-n : i]) + n = 0 + _, _ = writer.Write(replacementCharacter) + continue + } + n++ + } + if n != 0 { + _, _ = writer.Write(source[l-n:]) + } +} + +func (d *defaultWriter) RawWrite(writer util.BufWriter, source []byte) { + n := 0 + l := len(source) + for i := 0; i < l; i++ { + v := util.EscapeHTMLByte(source[i]) + if v != nil { + _, _ = writer.Write(source[i-n : i]) + n = 0 + _, _ = writer.Write(v) + continue + } + n++ + } + if n != 0 { + _, _ = writer.Write(source[l-n:]) + } +} + +func (d *defaultWriter) Write(writer util.BufWriter, source []byte) { + escaped := false + var ok bool + limit := len(source) + n := 0 + for i := 0; i < limit; i++ { + c := source[i] + if escaped { + if util.IsPunct(c) { + d.RawWrite(writer, source[n:i-1]) + n = i + escaped = false + continue + } + if d.EscapedSpace && c == ' ' { + d.RawWrite(writer, source[n:i-1]) + n = i + 1 + escaped = false + continue + } + } + if c == '\x00' { + d.RawWrite(writer, source[n:i]) + d.RawWrite(writer, replacementCharacter) + n = i + 1 + escaped = false + continue + } + if c == '&' { + pos := i + next := i + 1 + if next < limit && source[next] == '#' { + nnext := next + 1 + if nnext < limit { + nc := source[nnext] + // code point like #x22; + if nnext < limit && nc == 'x' || nc == 'X' { + start := nnext + 1 + i, ok = util.ReadWhile(source, [2]int{start, limit}, util.IsHexDecimal) + if ok && i < limit && source[i] == ';' && i-start < 7 { + v, _ := strconv.ParseUint(util.BytesToReadOnlyString(source[start:i]), 16, 32) + d.RawWrite(writer, source[n:pos]) + n = i + 1 + escapeRune(writer, rune(v)) + continue + } + // code point like #1234; + } else if nc >= '0' && nc <= '9' { + start := nnext + i, ok = util.ReadWhile(source, [2]int{start, limit}, util.IsNumeric) + if ok && i < limit && i-start < 8 && source[i] == ';' { + v, _ := strconv.ParseUint(util.BytesToReadOnlyString(source[start:i]), 10, 32) + d.RawWrite(writer, source[n:pos]) + n = i + 1 + escapeRune(writer, rune(v)) + continue + } + } + } + } else { + start := next + i, ok = util.ReadWhile(source, [2]int{start, limit}, util.IsAlphaNumeric) + // entity reference + if ok && i < limit && source[i] == ';' { + name := util.BytesToReadOnlyString(source[start:i]) + entity, ok := util.LookUpHTML5EntityByName(name) + if ok { + d.RawWrite(writer, source[n:pos]) + n = i + 1 + d.RawWrite(writer, entity.Characters) + continue + } + } + } + i = next - 1 + } + if c == '\\' { + escaped = true + continue + } + escaped = false + } + d.RawWrite(writer, source[n:]) +} + +// DefaultWriter is a default instance of the Writer. +var DefaultWriter = NewWriter() + +var bDataImage = []byte("data:image/") +var bPng = []byte("png;") +var bGif = []byte("gif;") +var bJpeg = []byte("jpeg;") +var bWebp = []byte("webp;") +var bSvg = []byte("svg+xml;") +var bJs = []byte("javascript:") +var bVb = []byte("vbscript:") +var bFile = []byte("file:") +var bData = []byte("data:") + +func hasPrefix(s, prefix []byte) bool { + return len(s) >= len(prefix) && bytes.Equal(bytes.ToLower(s[0:len(prefix)]), bytes.ToLower(prefix)) +} + +// IsDangerousURL returns true if the given url seems a potentially dangerous url, +// otherwise false. +func IsDangerousURL(url []byte) bool { + if hasPrefix(url, bDataImage) && len(url) >= 11 { + v := url[11:] + if hasPrefix(v, bPng) || hasPrefix(v, bGif) || + hasPrefix(v, bJpeg) || hasPrefix(v, bWebp) || + hasPrefix(v, bSvg) { + return false + } + return true + } + return hasPrefix(url, bJs) || hasPrefix(url, bVb) || + hasPrefix(url, bFile) || hasPrefix(url, bData) +} diff --git a/vendor/github.com/yuin/goldmark/renderer/renderer.go b/vendor/github.com/yuin/goldmark/renderer/renderer.go new file mode 100644 index 0000000..5b40465 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/renderer/renderer.go @@ -0,0 +1,174 @@ +// Package renderer renders the given AST to certain formats. +package renderer + +import ( + "bufio" + "io" + "sync" + + "github.com/yuin/goldmark/ast" + "github.com/yuin/goldmark/util" +) + +// A Config struct is a data structure that holds configuration of the Renderer. +type Config struct { + Options map[OptionName]interface{} + NodeRenderers util.PrioritizedSlice +} + +// NewConfig returns a new Config. +func NewConfig() *Config { + return &Config{ + Options: map[OptionName]interface{}{}, + NodeRenderers: util.PrioritizedSlice{}, + } +} + +// An OptionName is a name of the option. +type OptionName string + +// An Option interface is a functional option type for the Renderer. +type Option interface { + SetConfig(*Config) +} + +type withNodeRenderers struct { + value []util.PrioritizedValue +} + +func (o *withNodeRenderers) SetConfig(c *Config) { + c.NodeRenderers = append(c.NodeRenderers, o.value...) +} + +// WithNodeRenderers is a functional option that allow you to add +// NodeRenderers to the renderer. +func WithNodeRenderers(ps ...util.PrioritizedValue) Option { + return &withNodeRenderers{ps} +} + +type withOption struct { + name OptionName + value interface{} +} + +func (o *withOption) SetConfig(c *Config) { + c.Options[o.name] = o.value +} + +// WithOption is a functional option that allow you to set +// an arbitrary option to the parser. +func WithOption(name OptionName, value interface{}) Option { + return &withOption{name, value} +} + +// A SetOptioner interface sets given option to the object. +type SetOptioner interface { + // SetOption sets given option to the object. + // Unacceptable options may be passed. + // Thus implementations must ignore unacceptable options. + SetOption(name OptionName, value interface{}) +} + +// NodeRendererFunc is a function that renders a given node. +type NodeRendererFunc func(writer util.BufWriter, source []byte, n ast.Node, entering bool) (ast.WalkStatus, error) + +// A NodeRenderer interface offers NodeRendererFuncs. +type NodeRenderer interface { + // RendererFuncs registers NodeRendererFuncs to given NodeRendererFuncRegisterer. + RegisterFuncs(NodeRendererFuncRegisterer) +} + +// A NodeRendererFuncRegisterer registers given NodeRendererFunc to this object. +type NodeRendererFuncRegisterer interface { + // Register registers given NodeRendererFunc to this object. + Register(ast.NodeKind, NodeRendererFunc) +} + +// A Renderer interface renders given AST node to given +// writer with given Renderer. +type Renderer interface { + Render(w io.Writer, source []byte, n ast.Node) error + + // AddOptions adds given option to this renderer. + AddOptions(...Option) +} + +type renderer struct { + config *Config + options map[OptionName]interface{} + nodeRendererFuncsTmp map[ast.NodeKind]NodeRendererFunc + maxKind int + nodeRendererFuncs []NodeRendererFunc + initSync sync.Once +} + +// NewRenderer returns a new Renderer with given options. +func NewRenderer(options ...Option) Renderer { + config := NewConfig() + for _, opt := range options { + opt.SetConfig(config) + } + + r := &renderer{ + options: map[OptionName]interface{}{}, + config: config, + nodeRendererFuncsTmp: map[ast.NodeKind]NodeRendererFunc{}, + } + + return r +} + +func (r *renderer) AddOptions(opts ...Option) { + for _, opt := range opts { + opt.SetConfig(r.config) + } +} + +func (r *renderer) Register(kind ast.NodeKind, v NodeRendererFunc) { + r.nodeRendererFuncsTmp[kind] = v + if int(kind) > r.maxKind { + r.maxKind = int(kind) + } +} + +// Render renders the given AST node to the given writer with the given Renderer. +func (r *renderer) Render(w io.Writer, source []byte, n ast.Node) error { + r.initSync.Do(func() { + r.options = r.config.Options + r.config.NodeRenderers.Sort() + l := len(r.config.NodeRenderers) + for i := l - 1; i >= 0; i-- { + v := r.config.NodeRenderers[i] + nr, _ := v.Value.(NodeRenderer) + if se, ok := v.Value.(SetOptioner); ok { + for oname, ovalue := range r.options { + se.SetOption(oname, ovalue) + } + } + nr.RegisterFuncs(r) + } + r.nodeRendererFuncs = make([]NodeRendererFunc, r.maxKind+1) + for kind, nr := range r.nodeRendererFuncsTmp { + r.nodeRendererFuncs[kind] = nr + } + r.config = nil + r.nodeRendererFuncsTmp = nil + }) + writer, ok := w.(util.BufWriter) + if !ok { + writer = bufio.NewWriter(w) + } + err := ast.Walk(n, func(n ast.Node, entering bool) (ast.WalkStatus, error) { + s := ast.WalkStatus(ast.WalkContinue) + var err error + f := r.nodeRendererFuncs[n.Kind()] + if f != nil { + s, err = f(writer, source, n, entering) + } + return s, err + }) + if err != nil { + return err + } + return writer.Flush() +} diff --git a/vendor/github.com/yuin/goldmark/text/package.go b/vendor/github.com/yuin/goldmark/text/package.go new file mode 100644 index 0000000..d241ac6 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/text/package.go @@ -0,0 +1,2 @@ +// Package text provides functionalities to manipulate texts. +package text diff --git a/vendor/github.com/yuin/goldmark/text/reader.go b/vendor/github.com/yuin/goldmark/text/reader.go new file mode 100644 index 0000000..b3f97fb --- /dev/null +++ b/vendor/github.com/yuin/goldmark/text/reader.go @@ -0,0 +1,660 @@ +package text + +import ( + "bytes" + "io" + "regexp" + "unicode/utf8" + + "github.com/yuin/goldmark/util" +) + +const invalidValue = -1 + +// EOF indicates the end of file. +const EOF = byte(0xff) + +// A Reader interface provides abstracted method for reading text. +type Reader interface { + io.RuneReader + + // Source returns a source of the reader. + Source() []byte + + // ResetPosition resets positions. + ResetPosition() + + // Peek returns a byte at current position without advancing the internal pointer. + Peek() byte + + // PeekLine returns the current line without advancing the internal pointer. + PeekLine() ([]byte, Segment) + + // PrecendingCharacter returns a character just before current internal pointer. + PrecendingCharacter() rune + + // Value returns a value of the given segment. + Value(Segment) []byte + + // LineOffset returns a distance from the line head to current position. + LineOffset() int + + // Position returns current line number and position. + Position() (int, Segment) + + // SetPosition sets current line number and position. + SetPosition(int, Segment) + + // SetPadding sets padding to the reader. + SetPadding(int) + + // Advance advances the internal pointer. + Advance(int) + + // AdvanceAndSetPadding advances the internal pointer and add padding to the + // reader. + AdvanceAndSetPadding(int, int) + + // AdvanceLine advances the internal pointer to the next line head. + AdvanceLine() + + // SkipSpaces skips space characters and returns a non-blank line. + // If it reaches EOF, returns false. + SkipSpaces() (Segment, int, bool) + + // SkipSpaces skips blank lines and returns a non-blank line. + // If it reaches EOF, returns false. + SkipBlankLines() (Segment, int, bool) + + // Match performs regular expression matching to current line. + Match(reg *regexp.Regexp) bool + + // Match performs regular expression searching to current line. + FindSubMatch(reg *regexp.Regexp) [][]byte + + // FindClosure finds corresponding closure. + FindClosure(opener, closer byte, options FindClosureOptions) (*Segments, bool) +} + +// FindClosureOptions is options for Reader.FindClosure. +type FindClosureOptions struct { + // CodeSpan is a flag for the FindClosure. If this is set to true, + // FindClosure ignores closers in codespans. + CodeSpan bool + + // Nesting is a flag for the FindClosure. If this is set to true, + // FindClosure allows nesting. + Nesting bool + + // Newline is a flag for the FindClosure. If this is set to true, + // FindClosure searches for a closer over multiple lines. + Newline bool + + // Advance is a flag for the FindClosure. If this is set to true, + // FindClosure advances pointers when closer is found. + Advance bool +} + +type reader struct { + source []byte + sourceLength int + line int + peekedLine []byte + pos Segment + head int + lineOffset int +} + +// NewReader return a new Reader that can read UTF-8 bytes . +func NewReader(source []byte) Reader { + r := &reader{ + source: source, + sourceLength: len(source), + } + r.ResetPosition() + return r +} + +func (r *reader) FindClosure(opener, closer byte, options FindClosureOptions) (*Segments, bool) { + return findClosureReader(r, opener, closer, options) +} + +func (r *reader) ResetPosition() { + r.line = -1 + r.head = 0 + r.lineOffset = -1 + r.AdvanceLine() +} + +func (r *reader) Source() []byte { + return r.source +} + +func (r *reader) Value(seg Segment) []byte { + return seg.Value(r.source) +} + +func (r *reader) Peek() byte { + if r.pos.Start >= 0 && r.pos.Start < r.sourceLength { + if r.pos.Padding != 0 { + return space[0] + } + return r.source[r.pos.Start] + } + return EOF +} + +func (r *reader) PeekLine() ([]byte, Segment) { + if r.pos.Start >= 0 && r.pos.Start < r.sourceLength { + if r.peekedLine == nil { + r.peekedLine = r.pos.Value(r.Source()) + } + return r.peekedLine, r.pos + } + return nil, r.pos +} + +// io.RuneReader interface. +func (r *reader) ReadRune() (rune, int, error) { + return readRuneReader(r) +} + +func (r *reader) LineOffset() int { + if r.lineOffset < 0 { + v := 0 + for i := r.head; i < r.pos.Start; i++ { + if r.source[i] == '\t' { + v += util.TabWidth(v) + } else { + v++ + } + } + r.lineOffset = v - r.pos.Padding + } + return r.lineOffset +} + +func (r *reader) PrecendingCharacter() rune { + if r.pos.Start <= 0 { + if r.pos.Padding != 0 { + return rune(' ') + } + return rune('\n') + } + i := r.pos.Start - 1 + for ; i >= 0; i-- { + if utf8.RuneStart(r.source[i]) { + break + } + } + rn, _ := utf8.DecodeRune(r.source[i:]) + return rn +} + +func (r *reader) Advance(n int) { + r.lineOffset = -1 + if n < len(r.peekedLine) && r.pos.Padding == 0 { + r.pos.Start += n + r.peekedLine = nil + return + } + r.peekedLine = nil + l := r.sourceLength + for ; n > 0 && r.pos.Start < l; n-- { + if r.pos.Padding != 0 { + r.pos.Padding-- + continue + } + if r.source[r.pos.Start] == '\n' { + r.AdvanceLine() + continue + } + r.pos.Start++ + } +} + +func (r *reader) AdvanceAndSetPadding(n, padding int) { + r.Advance(n) + if padding > r.pos.Padding { + r.SetPadding(padding) + } +} + +func (r *reader) AdvanceLine() { + r.lineOffset = -1 + r.peekedLine = nil + r.pos.Start = r.pos.Stop + r.head = r.pos.Start + if r.pos.Start < 0 { + return + } + r.pos.Stop = r.sourceLength + for i := r.pos.Start; i < r.sourceLength; i++ { + c := r.source[i] + if c == '\n' { + r.pos.Stop = i + 1 + break + } + } + r.line++ + r.pos.Padding = 0 +} + +func (r *reader) Position() (int, Segment) { + return r.line, r.pos +} + +func (r *reader) SetPosition(line int, pos Segment) { + r.lineOffset = -1 + r.line = line + r.pos = pos +} + +func (r *reader) SetPadding(v int) { + r.pos.Padding = v +} + +func (r *reader) SkipSpaces() (Segment, int, bool) { + return skipSpacesReader(r) +} + +func (r *reader) SkipBlankLines() (Segment, int, bool) { + return skipBlankLinesReader(r) +} + +func (r *reader) Match(reg *regexp.Regexp) bool { + return matchReader(r, reg) +} + +func (r *reader) FindSubMatch(reg *regexp.Regexp) [][]byte { + return findSubMatchReader(r, reg) +} + +// A BlockReader interface is a reader that is optimized for Blocks. +type BlockReader interface { + Reader + // Reset resets current state and sets new segments to the reader. + Reset(segment *Segments) +} + +type blockReader struct { + source []byte + segments *Segments + segmentsLength int + line int + pos Segment + head int + last int + lineOffset int +} + +// NewBlockReader returns a new BlockReader. +func NewBlockReader(source []byte, segments *Segments) BlockReader { + r := &blockReader{ + source: source, + } + if segments != nil { + r.Reset(segments) + } + return r +} + +func (r *blockReader) FindClosure(opener, closer byte, options FindClosureOptions) (*Segments, bool) { + return findClosureReader(r, opener, closer, options) +} + +func (r *blockReader) ResetPosition() { + r.line = -1 + r.head = 0 + r.last = 0 + r.lineOffset = -1 + r.pos.Start = -1 + r.pos.Stop = -1 + r.pos.Padding = 0 + if r.segmentsLength > 0 { + last := r.segments.At(r.segmentsLength - 1) + r.last = last.Stop + } + r.AdvanceLine() +} + +func (r *blockReader) Reset(segments *Segments) { + r.segments = segments + r.segmentsLength = segments.Len() + r.ResetPosition() +} + +func (r *blockReader) Source() []byte { + return r.source +} + +func (r *blockReader) Value(seg Segment) []byte { + line := r.segmentsLength - 1 + ret := make([]byte, 0, seg.Stop-seg.Start+1) + for ; line >= 0; line-- { + if seg.Start >= r.segments.At(line).Start { + break + } + } + i := seg.Start + for ; line < r.segmentsLength; line++ { + s := r.segments.At(line) + if i < 0 { + i = s.Start + } + ret = s.ConcatPadding(ret) + for ; i < seg.Stop && i < s.Stop; i++ { + ret = append(ret, r.source[i]) + } + i = -1 + if s.Stop > seg.Stop { + break + } + } + return ret +} + +// io.RuneReader interface. +func (r *blockReader) ReadRune() (rune, int, error) { + return readRuneReader(r) +} + +func (r *blockReader) PrecendingCharacter() rune { + if r.pos.Padding != 0 { + return rune(' ') + } + if r.segments.Len() < 1 { + return rune('\n') + } + firstSegment := r.segments.At(0) + if r.line == 0 && r.pos.Start <= firstSegment.Start { + return rune('\n') + } + l := len(r.source) + i := r.pos.Start - 1 + for ; i < l && i >= 0; i-- { + if utf8.RuneStart(r.source[i]) { + break + } + } + if i < 0 || i >= l { + return rune('\n') + } + rn, _ := utf8.DecodeRune(r.source[i:]) + return rn +} + +func (r *blockReader) LineOffset() int { + if r.lineOffset < 0 { + v := 0 + for i := r.head; i < r.pos.Start; i++ { + if r.source[i] == '\t' { + v += util.TabWidth(v) + } else { + v++ + } + } + r.lineOffset = v - r.pos.Padding + } + return r.lineOffset +} + +func (r *blockReader) Peek() byte { + if r.line < r.segmentsLength && r.pos.Start >= 0 && r.pos.Start < r.last { + if r.pos.Padding != 0 { + return space[0] + } + return r.source[r.pos.Start] + } + return EOF +} + +func (r *blockReader) PeekLine() ([]byte, Segment) { + if r.line < r.segmentsLength && r.pos.Start >= 0 && r.pos.Start < r.last { + return r.pos.Value(r.source), r.pos + } + return nil, r.pos +} + +func (r *blockReader) Advance(n int) { + r.lineOffset = -1 + + if n < r.pos.Stop-r.pos.Start && r.pos.Padding == 0 { + r.pos.Start += n + return + } + + for ; n > 0; n-- { + if r.pos.Padding != 0 { + r.pos.Padding-- + continue + } + if r.pos.Start >= r.pos.Stop-1 && r.pos.Stop < r.last { + r.AdvanceLine() + continue + } + r.pos.Start++ + } +} + +func (r *blockReader) AdvanceAndSetPadding(n, padding int) { + r.Advance(n) + if padding > r.pos.Padding { + r.SetPadding(padding) + } +} + +func (r *blockReader) AdvanceLine() { + r.SetPosition(r.line+1, NewSegment(invalidValue, invalidValue)) + r.head = r.pos.Start +} + +func (r *blockReader) Position() (int, Segment) { + return r.line, r.pos +} + +func (r *blockReader) SetPosition(line int, pos Segment) { + r.lineOffset = -1 + r.line = line + if pos.Start == invalidValue { + if r.line < r.segmentsLength { + s := r.segments.At(line) + r.head = s.Start + r.pos = s + } + } else { + r.pos = pos + if r.line < r.segmentsLength { + s := r.segments.At(line) + r.head = s.Start + } + } +} + +func (r *blockReader) SetPadding(v int) { + r.lineOffset = -1 + r.pos.Padding = v +} + +func (r *blockReader) SkipSpaces() (Segment, int, bool) { + return skipSpacesReader(r) +} + +func (r *blockReader) SkipBlankLines() (Segment, int, bool) { + return skipBlankLinesReader(r) +} + +func (r *blockReader) Match(reg *regexp.Regexp) bool { + return matchReader(r, reg) +} + +func (r *blockReader) FindSubMatch(reg *regexp.Regexp) [][]byte { + return findSubMatchReader(r, reg) +} + +func skipBlankLinesReader(r Reader) (Segment, int, bool) { + lines := 0 + for { + line, seg := r.PeekLine() + if line == nil { + return seg, lines, false + } + if util.IsBlank(line) { + lines++ + r.AdvanceLine() + } else { + return seg, lines, true + } + } +} + +func skipSpacesReader(r Reader) (Segment, int, bool) { + chars := 0 + for { + line, segment := r.PeekLine() + if line == nil { + return segment, chars, false + } + for i, c := range line { + if util.IsSpace(c) { + chars++ + r.Advance(1) + continue + } + return segment.WithStart(segment.Start + i + 1), chars, true + } + } +} + +func matchReader(r Reader, reg *regexp.Regexp) bool { + oldline, oldseg := r.Position() + match := reg.FindReaderSubmatchIndex(r) + r.SetPosition(oldline, oldseg) + if match == nil { + return false + } + r.Advance(match[1] - match[0]) + return true +} + +func findSubMatchReader(r Reader, reg *regexp.Regexp) [][]byte { + oldLine, oldSeg := r.Position() + match := reg.FindReaderSubmatchIndex(r) + r.SetPosition(oldLine, oldSeg) + if match == nil { + return nil + } + var bb bytes.Buffer + bb.Grow(match[1] - match[0]) + for i := 0; i < match[1]; { + r, size, _ := readRuneReader(r) + i += size + bb.WriteRune(r) + } + bs := bb.Bytes() + var result [][]byte + for i := 0; i < len(match); i += 2 { + if match[i] < 0 { + result = append(result, []byte{}) + continue + } + result = append(result, bs[match[i]:match[i+1]]) + } + + r.SetPosition(oldLine, oldSeg) + r.Advance(match[1] - match[0]) + return result +} + +func readRuneReader(r Reader) (rune, int, error) { + line, _ := r.PeekLine() + if line == nil { + return 0, 0, io.EOF + } + rn, size := utf8.DecodeRune(line) + if rn == utf8.RuneError { + return 0, 0, io.EOF + } + r.Advance(size) + return rn, size, nil +} + +func findClosureReader(r Reader, opener, closer byte, opts FindClosureOptions) (*Segments, bool) { + opened := 1 + codeSpanOpener := 0 + closed := false + orgline, orgpos := r.Position() + var ret *Segments + + for { + bs, seg := r.PeekLine() + if bs == nil { + goto end + } + i := 0 + for i < len(bs) { + c := bs[i] + if opts.CodeSpan && codeSpanOpener != 0 && c == '`' { + codeSpanCloser := 0 + for ; i < len(bs); i++ { + if bs[i] == '`' { + codeSpanCloser++ + } else { + i-- + break + } + } + if codeSpanCloser == codeSpanOpener { + codeSpanOpener = 0 + } + } else if codeSpanOpener == 0 && c == '\\' && i < len(bs)-1 && util.IsPunct(bs[i+1]) { + i += 2 + continue + } else if opts.CodeSpan && codeSpanOpener == 0 && c == '`' { + for ; i < len(bs); i++ { + if bs[i] == '`' { + codeSpanOpener++ + } else { + i-- + break + } + } + } else if (opts.CodeSpan && codeSpanOpener == 0) || !opts.CodeSpan { + if c == closer { + opened-- + if opened == 0 { + if ret == nil { + ret = NewSegments() + } + ret.Append(seg.WithStop(seg.Start + i)) + r.Advance(i + 1) + closed = true + goto end + } + } else if c == opener { + if !opts.Nesting { + goto end + } + opened++ + } + } + i++ + } + if !opts.Newline { + goto end + } + r.AdvanceLine() + if ret == nil { + ret = NewSegments() + } + ret.Append(seg) + } +end: + if !opts.Advance { + r.SetPosition(orgline, orgpos) + } + if closed { + return ret, true + } + return nil, false +} diff --git a/vendor/github.com/yuin/goldmark/text/segment.go b/vendor/github.com/yuin/goldmark/text/segment.go new file mode 100644 index 0000000..badd4bc --- /dev/null +++ b/vendor/github.com/yuin/goldmark/text/segment.go @@ -0,0 +1,209 @@ +package text + +import ( + "bytes" + "github.com/yuin/goldmark/util" +) + +var space = []byte(" ") + +// A Segment struct holds information about source positions. +type Segment struct { + // Start is a start position of the segment. + Start int + + // Stop is a stop position of the segment. + // This value should be excluded. + Stop int + + // Padding is a padding length of the segment. + Padding int +} + +// NewSegment return a new Segment. +func NewSegment(start, stop int) Segment { + return Segment{ + Start: start, + Stop: stop, + Padding: 0, + } +} + +// NewSegmentPadding returns a new Segment with the given padding. +func NewSegmentPadding(start, stop, n int) Segment { + return Segment{ + Start: start, + Stop: stop, + Padding: n, + } +} + +// Value returns a value of the segment. +func (t *Segment) Value(buffer []byte) []byte { + if t.Padding == 0 { + return buffer[t.Start:t.Stop] + } + result := make([]byte, 0, t.Padding+t.Stop-t.Start+1) + result = append(result, bytes.Repeat(space, t.Padding)...) + return append(result, buffer[t.Start:t.Stop]...) +} + +// Len returns a length of the segment. +func (t *Segment) Len() int { + return t.Stop - t.Start + t.Padding +} + +// Between returns a segment between this segment and the given segment. +func (t *Segment) Between(other Segment) Segment { + if t.Stop != other.Stop { + panic("invalid state") + } + return NewSegmentPadding( + t.Start, + other.Start, + t.Padding-other.Padding, + ) +} + +// IsEmpty returns true if this segment is empty, otherwise false. +func (t *Segment) IsEmpty() bool { + return t.Start >= t.Stop && t.Padding == 0 +} + +// TrimRightSpace returns a new segment by slicing off all trailing +// space characters. +func (t *Segment) TrimRightSpace(buffer []byte) Segment { + v := buffer[t.Start:t.Stop] + l := util.TrimRightSpaceLength(v) + if l == len(v) { + return NewSegment(t.Start, t.Start) + } + return NewSegmentPadding(t.Start, t.Stop-l, t.Padding) +} + +// TrimLeftSpace returns a new segment by slicing off all leading +// space characters including padding. +func (t *Segment) TrimLeftSpace(buffer []byte) Segment { + v := buffer[t.Start:t.Stop] + l := util.TrimLeftSpaceLength(v) + return NewSegment(t.Start+l, t.Stop) +} + +// TrimLeftSpaceWidth returns a new segment by slicing off leading space +// characters until the given width. +func (t *Segment) TrimLeftSpaceWidth(width int, buffer []byte) Segment { + padding := t.Padding + for ; width > 0; width-- { + if padding == 0 { + break + } + padding-- + } + if width == 0 { + return NewSegmentPadding(t.Start, t.Stop, padding) + } + text := buffer[t.Start:t.Stop] + start := t.Start + for _, c := range text { + if start >= t.Stop-1 || width <= 0 { + break + } + if c == ' ' { + width-- + } else if c == '\t' { + width -= 4 + } else { + break + } + start++ + } + if width < 0 { + padding = width * -1 + } + return NewSegmentPadding(start, t.Stop, padding) +} + +// WithStart returns a new Segment with same value except Start. +func (t *Segment) WithStart(v int) Segment { + return NewSegmentPadding(v, t.Stop, t.Padding) +} + +// WithStop returns a new Segment with same value except Stop. +func (t *Segment) WithStop(v int) Segment { + return NewSegmentPadding(t.Start, v, t.Padding) +} + +// ConcatPadding concats the padding to the given slice. +func (t *Segment) ConcatPadding(v []byte) []byte { + if t.Padding > 0 { + return append(v, bytes.Repeat(space, t.Padding)...) + } + return v +} + +// Segments is a collection of the Segment. +type Segments struct { + values []Segment +} + +// NewSegments return a new Segments. +func NewSegments() *Segments { + return &Segments{ + values: nil, + } +} + +// Append appends the given segment after the tail of the collection. +func (s *Segments) Append(t Segment) { + if s.values == nil { + s.values = make([]Segment, 0, 20) + } + s.values = append(s.values, t) +} + +// AppendAll appends all elements of given segments after the tail of the collection. +func (s *Segments) AppendAll(t []Segment) { + if s.values == nil { + s.values = make([]Segment, 0, 20) + } + s.values = append(s.values, t...) +} + +// Len returns the length of the collection. +func (s *Segments) Len() int { + if s.values == nil { + return 0 + } + return len(s.values) +} + +// At returns a segment at the given index. +func (s *Segments) At(i int) Segment { + return s.values[i] +} + +// Set sets the given Segment. +func (s *Segments) Set(i int, v Segment) { + s.values[i] = v +} + +// SetSliced replace the collection with a subsliced value. +func (s *Segments) SetSliced(lo, hi int) { + s.values = s.values[lo:hi] +} + +// Sliced returns a subslice of the collection. +func (s *Segments) Sliced(lo, hi int) []Segment { + return s.values[lo:hi] +} + +// Clear delete all element of the collection. +func (s *Segments) Clear() { + s.values = nil +} + +// Unshift insert the given Segment to head of the collection. +func (s *Segments) Unshift(v Segment) { + s.values = append(s.values[0:1], s.values[0:]...) + s.values[0] = v +} diff --git a/vendor/github.com/yuin/goldmark/util/html5entities.go b/vendor/github.com/yuin/goldmark/util/html5entities.go new file mode 100644 index 0000000..dbb5f4f --- /dev/null +++ b/vendor/github.com/yuin/goldmark/util/html5entities.go @@ -0,0 +1,2143 @@ +//nolint:golint,lll,misspell +package util + +// An HTML5Entity struct represents HTML5 entitites. +type HTML5Entity struct { + Name string + CodePoints []int + Characters []byte +} + +// LookUpHTML5EntityByName returns (an HTML5Entity, true) if an entity named +// given name is found, otherwise (nil, false). +func LookUpHTML5EntityByName(name string) (*HTML5Entity, bool) { + v, ok := html5entities[name] + return v, ok +} + +var html5entities = map[string]*HTML5Entity{ + "AElig": {Name: "AElig", CodePoints: []int{198}, Characters: []byte{0xc3, 0x86}}, + "AMP": {Name: "AMP", CodePoints: []int{38}, Characters: []byte{0x26}}, + "Aacute": {Name: "Aacute", CodePoints: []int{193}, Characters: []byte{0xc3, 0x81}}, + "Acirc": {Name: "Acirc", CodePoints: []int{194}, Characters: []byte{0xc3, 0x82}}, + "Acy": {Name: "Acy", CodePoints: []int{1040}, Characters: []byte{0xd0, 0x90}}, + "Afr": {Name: "Afr", CodePoints: []int{120068}, Characters: []byte{0xf0, 0x9d, 0x94, 0x84}}, + "Agrave": {Name: "Agrave", CodePoints: []int{192}, Characters: []byte{0xc3, 0x80}}, + "Alpha": {Name: "Alpha", CodePoints: []int{913}, Characters: []byte{0xce, 0x91}}, + "Amacr": {Name: "Amacr", CodePoints: []int{256}, Characters: []byte{0xc4, 0x80}}, + "And": {Name: "And", CodePoints: []int{10835}, Characters: []byte{0xe2, 0xa9, 0x93}}, + "Aogon": {Name: "Aogon", CodePoints: []int{260}, Characters: []byte{0xc4, 0x84}}, + "Aopf": {Name: "Aopf", CodePoints: []int{120120}, Characters: []byte{0xf0, 0x9d, 0x94, 0xb8}}, + "ApplyFunction": {Name: "ApplyFunction", CodePoints: []int{8289}, Characters: []byte{0xe2, 0x81, 0xa1}}, + "Aring": {Name: "Aring", CodePoints: []int{197}, Characters: []byte{0xc3, 0x85}}, + "Ascr": {Name: "Ascr", CodePoints: []int{119964}, Characters: []byte{0xf0, 0x9d, 0x92, 0x9c}}, + "Assign": {Name: "Assign", CodePoints: []int{8788}, Characters: []byte{0xe2, 0x89, 0x94}}, + "Atilde": {Name: "Atilde", CodePoints: []int{195}, Characters: []byte{0xc3, 0x83}}, + "Auml": {Name: "Auml", CodePoints: []int{196}, Characters: []byte{0xc3, 0x84}}, + "Backslash": {Name: "Backslash", CodePoints: []int{8726}, Characters: []byte{0xe2, 0x88, 0x96}}, + "Barv": {Name: "Barv", CodePoints: []int{10983}, Characters: []byte{0xe2, 0xab, 0xa7}}, + "Barwed": {Name: "Barwed", CodePoints: []int{8966}, Characters: []byte{0xe2, 0x8c, 0x86}}, + "Bcy": {Name: "Bcy", CodePoints: []int{1041}, Characters: []byte{0xd0, 0x91}}, + "Because": {Name: "Because", CodePoints: []int{8757}, Characters: []byte{0xe2, 0x88, 0xb5}}, + "Bernoullis": {Name: "Bernoullis", CodePoints: []int{8492}, Characters: []byte{0xe2, 0x84, 0xac}}, + "Beta": {Name: "Beta", CodePoints: []int{914}, Characters: []byte{0xce, 0x92}}, + "Bfr": {Name: "Bfr", CodePoints: []int{120069}, Characters: []byte{0xf0, 0x9d, 0x94, 0x85}}, + "Bopf": {Name: "Bopf", CodePoints: []int{120121}, Characters: []byte{0xf0, 0x9d, 0x94, 0xb9}}, + "Breve": {Name: "Breve", CodePoints: []int{728}, Characters: []byte{0xcb, 0x98}}, + "Bscr": {Name: "Bscr", CodePoints: []int{8492}, Characters: []byte{0xe2, 0x84, 0xac}}, + "Bumpeq": {Name: "Bumpeq", CodePoints: []int{8782}, Characters: []byte{0xe2, 0x89, 0x8e}}, + "CHcy": {Name: "CHcy", CodePoints: []int{1063}, Characters: []byte{0xd0, 0xa7}}, + "COPY": {Name: "COPY", CodePoints: []int{169}, Characters: []byte{0xc2, 0xa9}}, + "Cacute": {Name: "Cacute", CodePoints: []int{262}, Characters: []byte{0xc4, 0x86}}, + "Cap": {Name: "Cap", CodePoints: []int{8914}, Characters: []byte{0xe2, 0x8b, 0x92}}, + "CapitalDifferentialD": {Name: "CapitalDifferentialD", CodePoints: []int{8517}, Characters: []byte{0xe2, 0x85, 0x85}}, + "Cayleys": {Name: "Cayleys", CodePoints: []int{8493}, Characters: []byte{0xe2, 0x84, 0xad}}, + "Ccaron": {Name: "Ccaron", CodePoints: []int{268}, Characters: []byte{0xc4, 0x8c}}, + "Ccedil": {Name: "Ccedil", CodePoints: []int{199}, Characters: []byte{0xc3, 0x87}}, + "Ccirc": {Name: "Ccirc", CodePoints: []int{264}, Characters: []byte{0xc4, 0x88}}, + "Cconint": {Name: "Cconint", CodePoints: []int{8752}, Characters: []byte{0xe2, 0x88, 0xb0}}, + "Cdot": {Name: "Cdot", CodePoints: []int{266}, Characters: []byte{0xc4, 0x8a}}, + "Cedilla": {Name: "Cedilla", CodePoints: []int{184}, Characters: []byte{0xc2, 0xb8}}, + "CenterDot": {Name: "CenterDot", CodePoints: []int{183}, Characters: []byte{0xc2, 0xb7}}, + "Cfr": {Name: "Cfr", CodePoints: []int{8493}, Characters: []byte{0xe2, 0x84, 0xad}}, + "Chi": {Name: "Chi", CodePoints: []int{935}, Characters: []byte{0xce, 0xa7}}, + "CircleDot": {Name: "CircleDot", CodePoints: []int{8857}, Characters: []byte{0xe2, 0x8a, 0x99}}, + "CircleMinus": {Name: "CircleMinus", CodePoints: []int{8854}, Characters: []byte{0xe2, 0x8a, 0x96}}, + "CirclePlus": {Name: "CirclePlus", CodePoints: []int{8853}, Characters: []byte{0xe2, 0x8a, 0x95}}, + "CircleTimes": {Name: "CircleTimes", CodePoints: []int{8855}, Characters: []byte{0xe2, 0x8a, 0x97}}, + "ClockwiseContourIntegral": {Name: "ClockwiseContourIntegral", CodePoints: []int{8754}, Characters: []byte{0xe2, 0x88, 0xb2}}, + "CloseCurlyDoubleQuote": {Name: "CloseCurlyDoubleQuote", CodePoints: []int{8221}, Characters: []byte{0xe2, 0x80, 0x9d}}, + "CloseCurlyQuote": {Name: "CloseCurlyQuote", CodePoints: []int{8217}, Characters: []byte{0xe2, 0x80, 0x99}}, + "Colon": {Name: "Colon", CodePoints: []int{8759}, Characters: []byte{0xe2, 0x88, 0xb7}}, + "Colone": {Name: "Colone", CodePoints: []int{10868}, Characters: []byte{0xe2, 0xa9, 0xb4}}, + "Congruent": {Name: "Congruent", CodePoints: []int{8801}, Characters: []byte{0xe2, 0x89, 0xa1}}, + "Conint": {Name: "Conint", CodePoints: []int{8751}, Characters: []byte{0xe2, 0x88, 0xaf}}, + "ContourIntegral": {Name: "ContourIntegral", CodePoints: []int{8750}, Characters: []byte{0xe2, 0x88, 0xae}}, + "Copf": {Name: "Copf", CodePoints: []int{8450}, Characters: []byte{0xe2, 0x84, 0x82}}, + "Coproduct": {Name: "Coproduct", CodePoints: []int{8720}, Characters: []byte{0xe2, 0x88, 0x90}}, + "CounterClockwiseContourIntegral": {Name: "CounterClockwiseContourIntegral", CodePoints: []int{8755}, Characters: []byte{0xe2, 0x88, 0xb3}}, + "Cross": {Name: "Cross", CodePoints: []int{10799}, Characters: []byte{0xe2, 0xa8, 0xaf}}, + "Cscr": {Name: "Cscr", CodePoints: []int{119966}, Characters: []byte{0xf0, 0x9d, 0x92, 0x9e}}, + "Cup": {Name: "Cup", CodePoints: []int{8915}, Characters: []byte{0xe2, 0x8b, 0x93}}, + "CupCap": {Name: "CupCap", CodePoints: []int{8781}, Characters: []byte{0xe2, 0x89, 0x8d}}, + "DD": {Name: "DD", CodePoints: []int{8517}, Characters: []byte{0xe2, 0x85, 0x85}}, + "DDotrahd": {Name: "DDotrahd", CodePoints: []int{10513}, Characters: []byte{0xe2, 0xa4, 0x91}}, + "DJcy": {Name: "DJcy", CodePoints: []int{1026}, Characters: []byte{0xd0, 0x82}}, + "DScy": {Name: "DScy", CodePoints: []int{1029}, Characters: []byte{0xd0, 0x85}}, + "DZcy": {Name: "DZcy", CodePoints: []int{1039}, Characters: []byte{0xd0, 0x8f}}, + "Dagger": {Name: "Dagger", CodePoints: []int{8225}, Characters: []byte{0xe2, 0x80, 0xa1}}, + "Darr": {Name: "Darr", CodePoints: []int{8609}, Characters: []byte{0xe2, 0x86, 0xa1}}, + "Dashv": {Name: "Dashv", CodePoints: []int{10980}, Characters: []byte{0xe2, 0xab, 0xa4}}, + "Dcaron": {Name: "Dcaron", CodePoints: []int{270}, Characters: []byte{0xc4, 0x8e}}, + "Dcy": {Name: "Dcy", CodePoints: []int{1044}, Characters: []byte{0xd0, 0x94}}, + "Del": {Name: "Del", CodePoints: []int{8711}, Characters: []byte{0xe2, 0x88, 0x87}}, + "Delta": {Name: "Delta", CodePoints: []int{916}, Characters: []byte{0xce, 0x94}}, + "Dfr": {Name: "Dfr", CodePoints: []int{120071}, Characters: []byte{0xf0, 0x9d, 0x94, 0x87}}, + "DiacriticalAcute": {Name: "DiacriticalAcute", CodePoints: []int{180}, Characters: []byte{0xc2, 0xb4}}, + "DiacriticalDot": {Name: "DiacriticalDot", CodePoints: []int{729}, Characters: []byte{0xcb, 0x99}}, + "DiacriticalDoubleAcute": {Name: "DiacriticalDoubleAcute", CodePoints: []int{733}, Characters: []byte{0xcb, 0x9d}}, + "DiacriticalGrave": {Name: "DiacriticalGrave", CodePoints: []int{96}, Characters: []byte{0x60}}, + "DiacriticalTilde": {Name: "DiacriticalTilde", CodePoints: []int{732}, Characters: []byte{0xcb, 0x9c}}, + "Diamond": {Name: "Diamond", CodePoints: []int{8900}, Characters: []byte{0xe2, 0x8b, 0x84}}, + "DifferentialD": {Name: "DifferentialD", CodePoints: []int{8518}, Characters: []byte{0xe2, 0x85, 0x86}}, + "Dopf": {Name: "Dopf", CodePoints: []int{120123}, Characters: []byte{0xf0, 0x9d, 0x94, 0xbb}}, + "Dot": {Name: "Dot", CodePoints: []int{168}, Characters: []byte{0xc2, 0xa8}}, + "DotDot": {Name: "DotDot", CodePoints: []int{8412}, Characters: []byte{0xe2, 0x83, 0x9c}}, + "DotEqual": {Name: "DotEqual", CodePoints: []int{8784}, Characters: []byte{0xe2, 0x89, 0x90}}, + "DoubleContourIntegral": {Name: "DoubleContourIntegral", CodePoints: []int{8751}, Characters: []byte{0xe2, 0x88, 0xaf}}, + "DoubleDot": {Name: "DoubleDot", CodePoints: []int{168}, Characters: []byte{0xc2, 0xa8}}, + "DoubleDownArrow": {Name: "DoubleDownArrow", CodePoints: []int{8659}, Characters: []byte{0xe2, 0x87, 0x93}}, + "DoubleLeftArrow": {Name: "DoubleLeftArrow", CodePoints: []int{8656}, Characters: []byte{0xe2, 0x87, 0x90}}, + "DoubleLeftRightArrow": {Name: "DoubleLeftRightArrow", CodePoints: []int{8660}, Characters: []byte{0xe2, 0x87, 0x94}}, + "DoubleLeftTee": {Name: "DoubleLeftTee", CodePoints: []int{10980}, Characters: []byte{0xe2, 0xab, 0xa4}}, + "DoubleLongLeftArrow": {Name: "DoubleLongLeftArrow", CodePoints: []int{10232}, Characters: []byte{0xe2, 0x9f, 0xb8}}, + "DoubleLongLeftRightArrow": {Name: "DoubleLongLeftRightArrow", CodePoints: []int{10234}, Characters: []byte{0xe2, 0x9f, 0xba}}, + "DoubleLongRightArrow": {Name: "DoubleLongRightArrow", CodePoints: []int{10233}, Characters: []byte{0xe2, 0x9f, 0xb9}}, + "DoubleRightArrow": {Name: "DoubleRightArrow", CodePoints: []int{8658}, Characters: []byte{0xe2, 0x87, 0x92}}, + "DoubleRightTee": {Name: "DoubleRightTee", CodePoints: []int{8872}, Characters: []byte{0xe2, 0x8a, 0xa8}}, + "DoubleUpArrow": {Name: "DoubleUpArrow", CodePoints: []int{8657}, Characters: []byte{0xe2, 0x87, 0x91}}, + "DoubleUpDownArrow": {Name: "DoubleUpDownArrow", CodePoints: []int{8661}, Characters: []byte{0xe2, 0x87, 0x95}}, + "DoubleVerticalBar": {Name: "DoubleVerticalBar", CodePoints: []int{8741}, Characters: []byte{0xe2, 0x88, 0xa5}}, + "DownArrow": {Name: "DownArrow", CodePoints: []int{8595}, Characters: []byte{0xe2, 0x86, 0x93}}, + "DownArrowBar": {Name: "DownArrowBar", CodePoints: []int{10515}, Characters: []byte{0xe2, 0xa4, 0x93}}, + "DownArrowUpArrow": {Name: "DownArrowUpArrow", CodePoints: []int{8693}, Characters: []byte{0xe2, 0x87, 0xb5}}, + "DownBreve": {Name: "DownBreve", CodePoints: []int{785}, Characters: []byte{0xcc, 0x91}}, + "DownLeftRightVector": {Name: "DownLeftRightVector", CodePoints: []int{10576}, Characters: []byte{0xe2, 0xa5, 0x90}}, + "DownLeftTeeVector": {Name: "DownLeftTeeVector", CodePoints: []int{10590}, Characters: []byte{0xe2, 0xa5, 0x9e}}, + "DownLeftVector": {Name: "DownLeftVector", CodePoints: []int{8637}, Characters: []byte{0xe2, 0x86, 0xbd}}, + "DownLeftVectorBar": {Name: "DownLeftVectorBar", CodePoints: []int{10582}, Characters: []byte{0xe2, 0xa5, 0x96}}, + "DownRightTeeVector": {Name: "DownRightTeeVector", CodePoints: []int{10591}, Characters: []byte{0xe2, 0xa5, 0x9f}}, + "DownRightVector": {Name: "DownRightVector", CodePoints: []int{8641}, Characters: []byte{0xe2, 0x87, 0x81}}, + "DownRightVectorBar": {Name: "DownRightVectorBar", CodePoints: []int{10583}, Characters: []byte{0xe2, 0xa5, 0x97}}, + "DownTee": {Name: "DownTee", CodePoints: []int{8868}, Characters: []byte{0xe2, 0x8a, 0xa4}}, + "DownTeeArrow": {Name: "DownTeeArrow", CodePoints: []int{8615}, Characters: []byte{0xe2, 0x86, 0xa7}}, + "Downarrow": {Name: "Downarrow", CodePoints: []int{8659}, Characters: []byte{0xe2, 0x87, 0x93}}, + "Dscr": {Name: "Dscr", CodePoints: []int{119967}, Characters: []byte{0xf0, 0x9d, 0x92, 0x9f}}, + "Dstrok": {Name: "Dstrok", CodePoints: []int{272}, Characters: []byte{0xc4, 0x90}}, + "ENG": {Name: "ENG", CodePoints: []int{330}, Characters: []byte{0xc5, 0x8a}}, + "ETH": {Name: "ETH", CodePoints: []int{208}, Characters: []byte{0xc3, 0x90}}, + "Eacute": {Name: "Eacute", CodePoints: []int{201}, Characters: []byte{0xc3, 0x89}}, + "Ecaron": {Name: "Ecaron", CodePoints: []int{282}, Characters: []byte{0xc4, 0x9a}}, + "Ecirc": {Name: "Ecirc", CodePoints: []int{202}, Characters: []byte{0xc3, 0x8a}}, + "Ecy": {Name: "Ecy", CodePoints: []int{1069}, Characters: []byte{0xd0, 0xad}}, + "Edot": {Name: "Edot", CodePoints: []int{278}, Characters: []byte{0xc4, 0x96}}, + "Efr": {Name: "Efr", CodePoints: []int{120072}, Characters: []byte{0xf0, 0x9d, 0x94, 0x88}}, + "Egrave": {Name: "Egrave", CodePoints: []int{200}, Characters: []byte{0xc3, 0x88}}, + "Element": {Name: "Element", CodePoints: []int{8712}, Characters: []byte{0xe2, 0x88, 0x88}}, + "Emacr": {Name: "Emacr", CodePoints: []int{274}, Characters: []byte{0xc4, 0x92}}, + "EmptySmallSquare": {Name: "EmptySmallSquare", CodePoints: []int{9723}, Characters: []byte{0xe2, 0x97, 0xbb}}, + "EmptyVerySmallSquare": {Name: "EmptyVerySmallSquare", CodePoints: []int{9643}, Characters: []byte{0xe2, 0x96, 0xab}}, + "Eogon": {Name: "Eogon", CodePoints: []int{280}, Characters: []byte{0xc4, 0x98}}, + "Eopf": {Name: "Eopf", CodePoints: []int{120124}, Characters: []byte{0xf0, 0x9d, 0x94, 0xbc}}, + "Epsilon": {Name: "Epsilon", CodePoints: []int{917}, Characters: []byte{0xce, 0x95}}, + "Equal": {Name: "Equal", CodePoints: []int{10869}, Characters: []byte{0xe2, 0xa9, 0xb5}}, + "EqualTilde": {Name: "EqualTilde", CodePoints: []int{8770}, Characters: []byte{0xe2, 0x89, 0x82}}, + "Equilibrium": {Name: "Equilibrium", CodePoints: []int{8652}, Characters: []byte{0xe2, 0x87, 0x8c}}, + "Escr": {Name: "Escr", CodePoints: []int{8496}, Characters: []byte{0xe2, 0x84, 0xb0}}, + "Esim": {Name: "Esim", CodePoints: []int{10867}, Characters: []byte{0xe2, 0xa9, 0xb3}}, + "Eta": {Name: "Eta", CodePoints: []int{919}, Characters: []byte{0xce, 0x97}}, + "Euml": {Name: "Euml", CodePoints: []int{203}, Characters: []byte{0xc3, 0x8b}}, + "Exists": {Name: "Exists", CodePoints: []int{8707}, Characters: []byte{0xe2, 0x88, 0x83}}, + "ExponentialE": {Name: "ExponentialE", CodePoints: []int{8519}, Characters: []byte{0xe2, 0x85, 0x87}}, + "Fcy": {Name: "Fcy", CodePoints: []int{1060}, Characters: []byte{0xd0, 0xa4}}, + "Ffr": {Name: "Ffr", CodePoints: []int{120073}, Characters: []byte{0xf0, 0x9d, 0x94, 0x89}}, + "FilledSmallSquare": {Name: "FilledSmallSquare", CodePoints: []int{9724}, Characters: []byte{0xe2, 0x97, 0xbc}}, + "FilledVerySmallSquare": {Name: "FilledVerySmallSquare", CodePoints: []int{9642}, Characters: []byte{0xe2, 0x96, 0xaa}}, + "Fopf": {Name: "Fopf", CodePoints: []int{120125}, Characters: []byte{0xf0, 0x9d, 0x94, 0xbd}}, + "ForAll": {Name: "ForAll", CodePoints: []int{8704}, Characters: []byte{0xe2, 0x88, 0x80}}, + "Fouriertrf": {Name: "Fouriertrf", CodePoints: []int{8497}, Characters: []byte{0xe2, 0x84, 0xb1}}, + "Fscr": {Name: "Fscr", CodePoints: []int{8497}, Characters: []byte{0xe2, 0x84, 0xb1}}, + "GJcy": {Name: "GJcy", CodePoints: []int{1027}, Characters: []byte{0xd0, 0x83}}, + "GT": {Name: "GT", CodePoints: []int{62}, Characters: []byte{0x3e}}, + "Gamma": {Name: "Gamma", CodePoints: []int{915}, Characters: []byte{0xce, 0x93}}, + "Gammad": {Name: "Gammad", CodePoints: []int{988}, Characters: []byte{0xcf, 0x9c}}, + "Gbreve": {Name: "Gbreve", CodePoints: []int{286}, Characters: []byte{0xc4, 0x9e}}, + "Gcedil": {Name: "Gcedil", CodePoints: []int{290}, Characters: []byte{0xc4, 0xa2}}, + "Gcirc": {Name: "Gcirc", CodePoints: []int{284}, Characters: []byte{0xc4, 0x9c}}, + "Gcy": {Name: "Gcy", CodePoints: []int{1043}, Characters: []byte{0xd0, 0x93}}, + "Gdot": {Name: "Gdot", CodePoints: []int{288}, Characters: []byte{0xc4, 0xa0}}, + "Gfr": {Name: "Gfr", CodePoints: []int{120074}, Characters: []byte{0xf0, 0x9d, 0x94, 0x8a}}, + "Gg": {Name: "Gg", CodePoints: []int{8921}, Characters: []byte{0xe2, 0x8b, 0x99}}, + "Gopf": {Name: "Gopf", CodePoints: []int{120126}, Characters: []byte{0xf0, 0x9d, 0x94, 0xbe}}, + "GreaterEqual": {Name: "GreaterEqual", CodePoints: []int{8805}, Characters: []byte{0xe2, 0x89, 0xa5}}, + "GreaterEqualLess": {Name: "GreaterEqualLess", CodePoints: []int{8923}, Characters: []byte{0xe2, 0x8b, 0x9b}}, + "GreaterFullEqual": {Name: "GreaterFullEqual", CodePoints: []int{8807}, Characters: []byte{0xe2, 0x89, 0xa7}}, + "GreaterGreater": {Name: "GreaterGreater", CodePoints: []int{10914}, Characters: []byte{0xe2, 0xaa, 0xa2}}, + "GreaterLess": {Name: "GreaterLess", CodePoints: []int{8823}, Characters: []byte{0xe2, 0x89, 0xb7}}, + "GreaterSlantEqual": {Name: "GreaterSlantEqual", CodePoints: []int{10878}, Characters: []byte{0xe2, 0xa9, 0xbe}}, + "GreaterTilde": {Name: "GreaterTilde", CodePoints: []int{8819}, Characters: []byte{0xe2, 0x89, 0xb3}}, + "Gscr": {Name: "Gscr", CodePoints: []int{119970}, Characters: []byte{0xf0, 0x9d, 0x92, 0xa2}}, + "Gt": {Name: "Gt", CodePoints: []int{8811}, Characters: []byte{0xe2, 0x89, 0xab}}, + "HARDcy": {Name: "HARDcy", CodePoints: []int{1066}, Characters: []byte{0xd0, 0xaa}}, + "Hacek": {Name: "Hacek", CodePoints: []int{711}, Characters: []byte{0xcb, 0x87}}, + "Hat": {Name: "Hat", CodePoints: []int{94}, Characters: []byte{0x5e}}, + "Hcirc": {Name: "Hcirc", CodePoints: []int{292}, Characters: []byte{0xc4, 0xa4}}, + "Hfr": {Name: "Hfr", CodePoints: []int{8460}, Characters: []byte{0xe2, 0x84, 0x8c}}, + "HilbertSpace": {Name: "HilbertSpace", CodePoints: []int{8459}, Characters: []byte{0xe2, 0x84, 0x8b}}, + "Hopf": {Name: "Hopf", CodePoints: []int{8461}, Characters: []byte{0xe2, 0x84, 0x8d}}, + "HorizontalLine": {Name: "HorizontalLine", CodePoints: []int{9472}, Characters: []byte{0xe2, 0x94, 0x80}}, + "Hscr": {Name: "Hscr", CodePoints: []int{8459}, Characters: []byte{0xe2, 0x84, 0x8b}}, + "Hstrok": {Name: "Hstrok", CodePoints: []int{294}, Characters: []byte{0xc4, 0xa6}}, + "HumpDownHump": {Name: "HumpDownHump", CodePoints: []int{8782}, Characters: []byte{0xe2, 0x89, 0x8e}}, + "HumpEqual": {Name: "HumpEqual", CodePoints: []int{8783}, Characters: []byte{0xe2, 0x89, 0x8f}}, + "IEcy": {Name: "IEcy", CodePoints: []int{1045}, Characters: []byte{0xd0, 0x95}}, + "IJlig": {Name: "IJlig", CodePoints: []int{306}, Characters: []byte{0xc4, 0xb2}}, + "IOcy": {Name: "IOcy", CodePoints: []int{1025}, Characters: []byte{0xd0, 0x81}}, + "Iacute": {Name: "Iacute", CodePoints: []int{205}, Characters: []byte{0xc3, 0x8d}}, + "Icirc": {Name: "Icirc", CodePoints: []int{206}, Characters: []byte{0xc3, 0x8e}}, + "Icy": {Name: "Icy", CodePoints: []int{1048}, Characters: []byte{0xd0, 0x98}}, + "Idot": {Name: "Idot", CodePoints: []int{304}, Characters: []byte{0xc4, 0xb0}}, + "Ifr": {Name: "Ifr", CodePoints: []int{8465}, Characters: []byte{0xe2, 0x84, 0x91}}, + "Igrave": {Name: "Igrave", CodePoints: []int{204}, Characters: []byte{0xc3, 0x8c}}, + "Im": {Name: "Im", CodePoints: []int{8465}, Characters: []byte{0xe2, 0x84, 0x91}}, + "Imacr": {Name: "Imacr", CodePoints: []int{298}, Characters: []byte{0xc4, 0xaa}}, + "ImaginaryI": {Name: "ImaginaryI", CodePoints: []int{8520}, Characters: []byte{0xe2, 0x85, 0x88}}, + "Implies": {Name: "Implies", CodePoints: []int{8658}, Characters: []byte{0xe2, 0x87, 0x92}}, + "Int": {Name: "Int", CodePoints: []int{8748}, Characters: []byte{0xe2, 0x88, 0xac}}, + "Integral": {Name: "Integral", CodePoints: []int{8747}, Characters: []byte{0xe2, 0x88, 0xab}}, + "Intersection": {Name: "Intersection", CodePoints: []int{8898}, Characters: []byte{0xe2, 0x8b, 0x82}}, + "InvisibleComma": {Name: "InvisibleComma", CodePoints: []int{8291}, Characters: []byte{0xe2, 0x81, 0xa3}}, + "InvisibleTimes": {Name: "InvisibleTimes", CodePoints: []int{8290}, Characters: []byte{0xe2, 0x81, 0xa2}}, + "Iogon": {Name: "Iogon", CodePoints: []int{302}, Characters: []byte{0xc4, 0xae}}, + "Iopf": {Name: "Iopf", CodePoints: []int{120128}, Characters: []byte{0xf0, 0x9d, 0x95, 0x80}}, + "Iota": {Name: "Iota", CodePoints: []int{921}, Characters: []byte{0xce, 0x99}}, + "Iscr": {Name: "Iscr", CodePoints: []int{8464}, Characters: []byte{0xe2, 0x84, 0x90}}, + "Itilde": {Name: "Itilde", CodePoints: []int{296}, Characters: []byte{0xc4, 0xa8}}, + "Iukcy": {Name: "Iukcy", CodePoints: []int{1030}, Characters: []byte{0xd0, 0x86}}, + "Iuml": {Name: "Iuml", CodePoints: []int{207}, Characters: []byte{0xc3, 0x8f}}, + "Jcirc": {Name: "Jcirc", CodePoints: []int{308}, Characters: []byte{0xc4, 0xb4}}, + "Jcy": {Name: "Jcy", CodePoints: []int{1049}, Characters: []byte{0xd0, 0x99}}, + "Jfr": {Name: "Jfr", CodePoints: []int{120077}, Characters: []byte{0xf0, 0x9d, 0x94, 0x8d}}, + "Jopf": {Name: "Jopf", CodePoints: []int{120129}, Characters: []byte{0xf0, 0x9d, 0x95, 0x81}}, + "Jscr": {Name: "Jscr", CodePoints: []int{119973}, Characters: []byte{0xf0, 0x9d, 0x92, 0xa5}}, + "Jsercy": {Name: "Jsercy", CodePoints: []int{1032}, Characters: []byte{0xd0, 0x88}}, + "Jukcy": {Name: "Jukcy", CodePoints: []int{1028}, Characters: []byte{0xd0, 0x84}}, + "KHcy": {Name: "KHcy", CodePoints: []int{1061}, Characters: []byte{0xd0, 0xa5}}, + "KJcy": {Name: "KJcy", CodePoints: []int{1036}, Characters: []byte{0xd0, 0x8c}}, + "Kappa": {Name: "Kappa", CodePoints: []int{922}, Characters: []byte{0xce, 0x9a}}, + "Kcedil": {Name: "Kcedil", CodePoints: []int{310}, Characters: []byte{0xc4, 0xb6}}, + "Kcy": {Name: "Kcy", CodePoints: []int{1050}, Characters: []byte{0xd0, 0x9a}}, + "Kfr": {Name: "Kfr", CodePoints: []int{120078}, Characters: []byte{0xf0, 0x9d, 0x94, 0x8e}}, + "Kopf": {Name: "Kopf", CodePoints: []int{120130}, Characters: []byte{0xf0, 0x9d, 0x95, 0x82}}, + "Kscr": {Name: "Kscr", CodePoints: []int{119974}, Characters: []byte{0xf0, 0x9d, 0x92, 0xa6}}, + "LJcy": {Name: "LJcy", CodePoints: []int{1033}, Characters: []byte{0xd0, 0x89}}, + "LT": {Name: "LT", CodePoints: []int{60}, Characters: []byte{0x3c}}, + "Lacute": {Name: "Lacute", CodePoints: []int{313}, Characters: []byte{0xc4, 0xb9}}, + "Lambda": {Name: "Lambda", CodePoints: []int{923}, Characters: []byte{0xce, 0x9b}}, + "Lang": {Name: "Lang", CodePoints: []int{10218}, Characters: []byte{0xe2, 0x9f, 0xaa}}, + "Laplacetrf": {Name: "Laplacetrf", CodePoints: []int{8466}, Characters: []byte{0xe2, 0x84, 0x92}}, + "Larr": {Name: "Larr", CodePoints: []int{8606}, Characters: []byte{0xe2, 0x86, 0x9e}}, + "Lcaron": {Name: "Lcaron", CodePoints: []int{317}, Characters: []byte{0xc4, 0xbd}}, + "Lcedil": {Name: "Lcedil", CodePoints: []int{315}, Characters: []byte{0xc4, 0xbb}}, + "Lcy": {Name: "Lcy", CodePoints: []int{1051}, Characters: []byte{0xd0, 0x9b}}, + "LeftAngleBracket": {Name: "LeftAngleBracket", CodePoints: []int{10216}, Characters: []byte{0xe2, 0x9f, 0xa8}}, + "LeftArrow": {Name: "LeftArrow", CodePoints: []int{8592}, Characters: []byte{0xe2, 0x86, 0x90}}, + "LeftArrowBar": {Name: "LeftArrowBar", CodePoints: []int{8676}, Characters: []byte{0xe2, 0x87, 0xa4}}, + "LeftArrowRightArrow": {Name: "LeftArrowRightArrow", CodePoints: []int{8646}, Characters: []byte{0xe2, 0x87, 0x86}}, + "LeftCeiling": {Name: "LeftCeiling", CodePoints: []int{8968}, Characters: []byte{0xe2, 0x8c, 0x88}}, + "LeftDoubleBracket": {Name: "LeftDoubleBracket", CodePoints: []int{10214}, Characters: []byte{0xe2, 0x9f, 0xa6}}, + "LeftDownTeeVector": {Name: "LeftDownTeeVector", CodePoints: []int{10593}, Characters: []byte{0xe2, 0xa5, 0xa1}}, + "LeftDownVector": {Name: "LeftDownVector", CodePoints: []int{8643}, Characters: []byte{0xe2, 0x87, 0x83}}, + "LeftDownVectorBar": {Name: "LeftDownVectorBar", CodePoints: []int{10585}, Characters: []byte{0xe2, 0xa5, 0x99}}, + "LeftFloor": {Name: "LeftFloor", CodePoints: []int{8970}, Characters: []byte{0xe2, 0x8c, 0x8a}}, + "LeftRightArrow": {Name: "LeftRightArrow", CodePoints: []int{8596}, Characters: []byte{0xe2, 0x86, 0x94}}, + "LeftRightVector": {Name: "LeftRightVector", CodePoints: []int{10574}, Characters: []byte{0xe2, 0xa5, 0x8e}}, + "LeftTee": {Name: "LeftTee", CodePoints: []int{8867}, Characters: []byte{0xe2, 0x8a, 0xa3}}, + "LeftTeeArrow": {Name: "LeftTeeArrow", CodePoints: []int{8612}, Characters: []byte{0xe2, 0x86, 0xa4}}, + "LeftTeeVector": {Name: "LeftTeeVector", CodePoints: []int{10586}, Characters: []byte{0xe2, 0xa5, 0x9a}}, + "LeftTriangle": {Name: "LeftTriangle", CodePoints: []int{8882}, Characters: []byte{0xe2, 0x8a, 0xb2}}, + "LeftTriangleBar": {Name: "LeftTriangleBar", CodePoints: []int{10703}, Characters: []byte{0xe2, 0xa7, 0x8f}}, + "LeftTriangleEqual": {Name: "LeftTriangleEqual", CodePoints: []int{8884}, Characters: []byte{0xe2, 0x8a, 0xb4}}, + "LeftUpDownVector": {Name: "LeftUpDownVector", CodePoints: []int{10577}, Characters: []byte{0xe2, 0xa5, 0x91}}, + "LeftUpTeeVector": {Name: "LeftUpTeeVector", CodePoints: []int{10592}, Characters: []byte{0xe2, 0xa5, 0xa0}}, + "LeftUpVector": {Name: "LeftUpVector", CodePoints: []int{8639}, Characters: []byte{0xe2, 0x86, 0xbf}}, + "LeftUpVectorBar": {Name: "LeftUpVectorBar", CodePoints: []int{10584}, Characters: []byte{0xe2, 0xa5, 0x98}}, + "LeftVector": {Name: "LeftVector", CodePoints: []int{8636}, Characters: []byte{0xe2, 0x86, 0xbc}}, + "LeftVectorBar": {Name: "LeftVectorBar", CodePoints: []int{10578}, Characters: []byte{0xe2, 0xa5, 0x92}}, + "Leftarrow": {Name: "Leftarrow", CodePoints: []int{8656}, Characters: []byte{0xe2, 0x87, 0x90}}, + "Leftrightarrow": {Name: "Leftrightarrow", CodePoints: []int{8660}, Characters: []byte{0xe2, 0x87, 0x94}}, + "LessEqualGreater": {Name: "LessEqualGreater", CodePoints: []int{8922}, Characters: []byte{0xe2, 0x8b, 0x9a}}, + "LessFullEqual": {Name: "LessFullEqual", CodePoints: []int{8806}, Characters: []byte{0xe2, 0x89, 0xa6}}, + "LessGreater": {Name: "LessGreater", CodePoints: []int{8822}, Characters: []byte{0xe2, 0x89, 0xb6}}, + "LessLess": {Name: "LessLess", CodePoints: []int{10913}, Characters: []byte{0xe2, 0xaa, 0xa1}}, + "LessSlantEqual": {Name: "LessSlantEqual", CodePoints: []int{10877}, Characters: []byte{0xe2, 0xa9, 0xbd}}, + "LessTilde": {Name: "LessTilde", CodePoints: []int{8818}, Characters: []byte{0xe2, 0x89, 0xb2}}, + "Lfr": {Name: "Lfr", CodePoints: []int{120079}, Characters: []byte{0xf0, 0x9d, 0x94, 0x8f}}, + "Ll": {Name: "Ll", CodePoints: []int{8920}, Characters: []byte{0xe2, 0x8b, 0x98}}, + "Lleftarrow": {Name: "Lleftarrow", CodePoints: []int{8666}, Characters: []byte{0xe2, 0x87, 0x9a}}, + "Lmidot": {Name: "Lmidot", CodePoints: []int{319}, Characters: []byte{0xc4, 0xbf}}, + "LongLeftArrow": {Name: "LongLeftArrow", CodePoints: []int{10229}, Characters: []byte{0xe2, 0x9f, 0xb5}}, + "LongLeftRightArrow": {Name: "LongLeftRightArrow", CodePoints: []int{10231}, Characters: []byte{0xe2, 0x9f, 0xb7}}, + "LongRightArrow": {Name: "LongRightArrow", CodePoints: []int{10230}, Characters: []byte{0xe2, 0x9f, 0xb6}}, + "Longleftarrow": {Name: "Longleftarrow", CodePoints: []int{10232}, Characters: []byte{0xe2, 0x9f, 0xb8}}, + "Longleftrightarrow": {Name: "Longleftrightarrow", CodePoints: []int{10234}, Characters: []byte{0xe2, 0x9f, 0xba}}, + "Longrightarrow": {Name: "Longrightarrow", CodePoints: []int{10233}, Characters: []byte{0xe2, 0x9f, 0xb9}}, + "Lopf": {Name: "Lopf", CodePoints: []int{120131}, Characters: []byte{0xf0, 0x9d, 0x95, 0x83}}, + "LowerLeftArrow": {Name: "LowerLeftArrow", CodePoints: []int{8601}, Characters: []byte{0xe2, 0x86, 0x99}}, + "LowerRightArrow": {Name: "LowerRightArrow", CodePoints: []int{8600}, Characters: []byte{0xe2, 0x86, 0x98}}, + "Lscr": {Name: "Lscr", CodePoints: []int{8466}, Characters: []byte{0xe2, 0x84, 0x92}}, + "Lsh": {Name: "Lsh", CodePoints: []int{8624}, Characters: []byte{0xe2, 0x86, 0xb0}}, + "Lstrok": {Name: "Lstrok", CodePoints: []int{321}, Characters: []byte{0xc5, 0x81}}, + "Lt": {Name: "Lt", CodePoints: []int{8810}, Characters: []byte{0xe2, 0x89, 0xaa}}, + "Map": {Name: "Map", CodePoints: []int{10501}, Characters: []byte{0xe2, 0xa4, 0x85}}, + "Mcy": {Name: "Mcy", CodePoints: []int{1052}, Characters: []byte{0xd0, 0x9c}}, + "MediumSpace": {Name: "MediumSpace", CodePoints: []int{8287}, Characters: []byte{0xe2, 0x81, 0x9f}}, + "Mellintrf": {Name: "Mellintrf", CodePoints: []int{8499}, Characters: []byte{0xe2, 0x84, 0xb3}}, + "Mfr": {Name: "Mfr", CodePoints: []int{120080}, Characters: []byte{0xf0, 0x9d, 0x94, 0x90}}, + "MinusPlus": {Name: "MinusPlus", CodePoints: []int{8723}, Characters: []byte{0xe2, 0x88, 0x93}}, + "Mopf": {Name: "Mopf", CodePoints: []int{120132}, Characters: []byte{0xf0, 0x9d, 0x95, 0x84}}, + "Mscr": {Name: "Mscr", CodePoints: []int{8499}, Characters: []byte{0xe2, 0x84, 0xb3}}, + "Mu": {Name: "Mu", CodePoints: []int{924}, Characters: []byte{0xce, 0x9c}}, + "NJcy": {Name: "NJcy", CodePoints: []int{1034}, Characters: []byte{0xd0, 0x8a}}, + "Nacute": {Name: "Nacute", CodePoints: []int{323}, Characters: []byte{0xc5, 0x83}}, + "Ncaron": {Name: "Ncaron", CodePoints: []int{327}, Characters: []byte{0xc5, 0x87}}, + "Ncedil": {Name: "Ncedil", CodePoints: []int{325}, Characters: []byte{0xc5, 0x85}}, + "Ncy": {Name: "Ncy", CodePoints: []int{1053}, Characters: []byte{0xd0, 0x9d}}, + "NegativeMediumSpace": {Name: "NegativeMediumSpace", CodePoints: []int{8203}, Characters: []byte{0xe2, 0x80, 0x8b}}, + "NegativeThickSpace": {Name: "NegativeThickSpace", CodePoints: []int{8203}, Characters: []byte{0xe2, 0x80, 0x8b}}, + "NegativeThinSpace": {Name: "NegativeThinSpace", CodePoints: []int{8203}, Characters: []byte{0xe2, 0x80, 0x8b}}, + "NegativeVeryThinSpace": {Name: "NegativeVeryThinSpace", CodePoints: []int{8203}, Characters: []byte{0xe2, 0x80, 0x8b}}, + "NestedGreaterGreater": {Name: "NestedGreaterGreater", CodePoints: []int{8811}, Characters: []byte{0xe2, 0x89, 0xab}}, + "NestedLessLess": {Name: "NestedLessLess", CodePoints: []int{8810}, Characters: []byte{0xe2, 0x89, 0xaa}}, + "NewLine": {Name: "NewLine", CodePoints: []int{10}, Characters: []byte{0xa}}, + "Nfr": {Name: "Nfr", CodePoints: []int{120081}, Characters: []byte{0xf0, 0x9d, 0x94, 0x91}}, + "NoBreak": {Name: "NoBreak", CodePoints: []int{8288}, Characters: []byte{0xe2, 0x81, 0xa0}}, + "NonBreakingSpace": {Name: "NonBreakingSpace", CodePoints: []int{160}, Characters: []byte{0xc2, 0xa0}}, + "Nopf": {Name: "Nopf", CodePoints: []int{8469}, Characters: []byte{0xe2, 0x84, 0x95}}, + "Not": {Name: "Not", CodePoints: []int{10988}, Characters: []byte{0xe2, 0xab, 0xac}}, + "NotCongruent": {Name: "NotCongruent", CodePoints: []int{8802}, Characters: []byte{0xe2, 0x89, 0xa2}}, + "NotCupCap": {Name: "NotCupCap", CodePoints: []int{8813}, Characters: []byte{0xe2, 0x89, 0xad}}, + "NotDoubleVerticalBar": {Name: "NotDoubleVerticalBar", CodePoints: []int{8742}, Characters: []byte{0xe2, 0x88, 0xa6}}, + "NotElement": {Name: "NotElement", CodePoints: []int{8713}, Characters: []byte{0xe2, 0x88, 0x89}}, + "NotEqual": {Name: "NotEqual", CodePoints: []int{8800}, Characters: []byte{0xe2, 0x89, 0xa0}}, + "NotEqualTilde": {Name: "NotEqualTilde", CodePoints: []int{8770, 824}, Characters: []byte{0xe2, 0x89, 0x82, 0xcc, 0xb8}}, + "NotExists": {Name: "NotExists", CodePoints: []int{8708}, Characters: []byte{0xe2, 0x88, 0x84}}, + "NotGreater": {Name: "NotGreater", CodePoints: []int{8815}, Characters: []byte{0xe2, 0x89, 0xaf}}, + "NotGreaterEqual": {Name: "NotGreaterEqual", CodePoints: []int{8817}, Characters: []byte{0xe2, 0x89, 0xb1}}, + "NotGreaterFullEqual": {Name: "NotGreaterFullEqual", CodePoints: []int{8807, 824}, Characters: []byte{0xe2, 0x89, 0xa7, 0xcc, 0xb8}}, + "NotGreaterGreater": {Name: "NotGreaterGreater", CodePoints: []int{8811, 824}, Characters: []byte{0xe2, 0x89, 0xab, 0xcc, 0xb8}}, + "NotGreaterLess": {Name: "NotGreaterLess", CodePoints: []int{8825}, Characters: []byte{0xe2, 0x89, 0xb9}}, + "NotGreaterSlantEqual": {Name: "NotGreaterSlantEqual", CodePoints: []int{10878, 824}, Characters: []byte{0xe2, 0xa9, 0xbe, 0xcc, 0xb8}}, + "NotGreaterTilde": {Name: "NotGreaterTilde", CodePoints: []int{8821}, Characters: []byte{0xe2, 0x89, 0xb5}}, + "NotHumpDownHump": {Name: "NotHumpDownHump", CodePoints: []int{8782, 824}, Characters: []byte{0xe2, 0x89, 0x8e, 0xcc, 0xb8}}, + "NotHumpEqual": {Name: "NotHumpEqual", CodePoints: []int{8783, 824}, Characters: []byte{0xe2, 0x89, 0x8f, 0xcc, 0xb8}}, + "NotLeftTriangle": {Name: "NotLeftTriangle", CodePoints: []int{8938}, Characters: []byte{0xe2, 0x8b, 0xaa}}, + "NotLeftTriangleBar": {Name: "NotLeftTriangleBar", CodePoints: []int{10703, 824}, Characters: []byte{0xe2, 0xa7, 0x8f, 0xcc, 0xb8}}, + "NotLeftTriangleEqual": {Name: "NotLeftTriangleEqual", CodePoints: []int{8940}, Characters: []byte{0xe2, 0x8b, 0xac}}, + "NotLess": {Name: "NotLess", CodePoints: []int{8814}, Characters: []byte{0xe2, 0x89, 0xae}}, + "NotLessEqual": {Name: "NotLessEqual", CodePoints: []int{8816}, Characters: []byte{0xe2, 0x89, 0xb0}}, + "NotLessGreater": {Name: "NotLessGreater", CodePoints: []int{8824}, Characters: []byte{0xe2, 0x89, 0xb8}}, + "NotLessLess": {Name: "NotLessLess", CodePoints: []int{8810, 824}, Characters: []byte{0xe2, 0x89, 0xaa, 0xcc, 0xb8}}, + "NotLessSlantEqual": {Name: "NotLessSlantEqual", CodePoints: []int{10877, 824}, Characters: []byte{0xe2, 0xa9, 0xbd, 0xcc, 0xb8}}, + "NotLessTilde": {Name: "NotLessTilde", CodePoints: []int{8820}, Characters: []byte{0xe2, 0x89, 0xb4}}, + "NotNestedGreaterGreater": {Name: "NotNestedGreaterGreater", CodePoints: []int{10914, 824}, Characters: []byte{0xe2, 0xaa, 0xa2, 0xcc, 0xb8}}, + "NotNestedLessLess": {Name: "NotNestedLessLess", CodePoints: []int{10913, 824}, Characters: []byte{0xe2, 0xaa, 0xa1, 0xcc, 0xb8}}, + "NotPrecedes": {Name: "NotPrecedes", CodePoints: []int{8832}, Characters: []byte{0xe2, 0x8a, 0x80}}, + "NotPrecedesEqual": {Name: "NotPrecedesEqual", CodePoints: []int{10927, 824}, Characters: []byte{0xe2, 0xaa, 0xaf, 0xcc, 0xb8}}, + "NotPrecedesSlantEqual": {Name: "NotPrecedesSlantEqual", CodePoints: []int{8928}, Characters: []byte{0xe2, 0x8b, 0xa0}}, + "NotReverseElement": {Name: "NotReverseElement", CodePoints: []int{8716}, Characters: []byte{0xe2, 0x88, 0x8c}}, + "NotRightTriangle": {Name: "NotRightTriangle", CodePoints: []int{8939}, Characters: []byte{0xe2, 0x8b, 0xab}}, + "NotRightTriangleBar": {Name: "NotRightTriangleBar", CodePoints: []int{10704, 824}, Characters: []byte{0xe2, 0xa7, 0x90, 0xcc, 0xb8}}, + "NotRightTriangleEqual": {Name: "NotRightTriangleEqual", CodePoints: []int{8941}, Characters: []byte{0xe2, 0x8b, 0xad}}, + "NotSquareSubset": {Name: "NotSquareSubset", CodePoints: []int{8847, 824}, Characters: []byte{0xe2, 0x8a, 0x8f, 0xcc, 0xb8}}, + "NotSquareSubsetEqual": {Name: "NotSquareSubsetEqual", CodePoints: []int{8930}, Characters: []byte{0xe2, 0x8b, 0xa2}}, + "NotSquareSuperset": {Name: "NotSquareSuperset", CodePoints: []int{8848, 824}, Characters: []byte{0xe2, 0x8a, 0x90, 0xcc, 0xb8}}, + "NotSquareSupersetEqual": {Name: "NotSquareSupersetEqual", CodePoints: []int{8931}, Characters: []byte{0xe2, 0x8b, 0xa3}}, + "NotSubset": {Name: "NotSubset", CodePoints: []int{8834, 8402}, Characters: []byte{0xe2, 0x8a, 0x82, 0xe2, 0x83, 0x92}}, + "NotSubsetEqual": {Name: "NotSubsetEqual", CodePoints: []int{8840}, Characters: []byte{0xe2, 0x8a, 0x88}}, + "NotSucceeds": {Name: "NotSucceeds", CodePoints: []int{8833}, Characters: []byte{0xe2, 0x8a, 0x81}}, + "NotSucceedsEqual": {Name: "NotSucceedsEqual", CodePoints: []int{10928, 824}, Characters: []byte{0xe2, 0xaa, 0xb0, 0xcc, 0xb8}}, + "NotSucceedsSlantEqual": {Name: "NotSucceedsSlantEqual", CodePoints: []int{8929}, Characters: []byte{0xe2, 0x8b, 0xa1}}, + "NotSucceedsTilde": {Name: "NotSucceedsTilde", CodePoints: []int{8831, 824}, Characters: []byte{0xe2, 0x89, 0xbf, 0xcc, 0xb8}}, + "NotSuperset": {Name: "NotSuperset", CodePoints: []int{8835, 8402}, Characters: []byte{0xe2, 0x8a, 0x83, 0xe2, 0x83, 0x92}}, + "NotSupersetEqual": {Name: "NotSupersetEqual", CodePoints: []int{8841}, Characters: []byte{0xe2, 0x8a, 0x89}}, + "NotTilde": {Name: "NotTilde", CodePoints: []int{8769}, Characters: []byte{0xe2, 0x89, 0x81}}, + "NotTildeEqual": {Name: "NotTildeEqual", CodePoints: []int{8772}, Characters: []byte{0xe2, 0x89, 0x84}}, + "NotTildeFullEqual": {Name: "NotTildeFullEqual", CodePoints: []int{8775}, Characters: []byte{0xe2, 0x89, 0x87}}, + "NotTildeTilde": {Name: "NotTildeTilde", CodePoints: []int{8777}, Characters: []byte{0xe2, 0x89, 0x89}}, + "NotVerticalBar": {Name: "NotVerticalBar", CodePoints: []int{8740}, Characters: []byte{0xe2, 0x88, 0xa4}}, + "Nscr": {Name: "Nscr", CodePoints: []int{119977}, Characters: []byte{0xf0, 0x9d, 0x92, 0xa9}}, + "Ntilde": {Name: "Ntilde", CodePoints: []int{209}, Characters: []byte{0xc3, 0x91}}, + "Nu": {Name: "Nu", CodePoints: []int{925}, Characters: []byte{0xce, 0x9d}}, + "OElig": {Name: "OElig", CodePoints: []int{338}, Characters: []byte{0xc5, 0x92}}, + "Oacute": {Name: "Oacute", CodePoints: []int{211}, Characters: []byte{0xc3, 0x93}}, + "Ocirc": {Name: "Ocirc", CodePoints: []int{212}, Characters: []byte{0xc3, 0x94}}, + "Ocy": {Name: "Ocy", CodePoints: []int{1054}, Characters: []byte{0xd0, 0x9e}}, + "Odblac": {Name: "Odblac", CodePoints: []int{336}, Characters: []byte{0xc5, 0x90}}, + "Ofr": {Name: "Ofr", CodePoints: []int{120082}, Characters: []byte{0xf0, 0x9d, 0x94, 0x92}}, + "Ograve": {Name: "Ograve", CodePoints: []int{210}, Characters: []byte{0xc3, 0x92}}, + "Omacr": {Name: "Omacr", CodePoints: []int{332}, Characters: []byte{0xc5, 0x8c}}, + "Omega": {Name: "Omega", CodePoints: []int{937}, Characters: []byte{0xce, 0xa9}}, + "Omicron": {Name: "Omicron", CodePoints: []int{927}, Characters: []byte{0xce, 0x9f}}, + "Oopf": {Name: "Oopf", CodePoints: []int{120134}, Characters: []byte{0xf0, 0x9d, 0x95, 0x86}}, + "OpenCurlyDoubleQuote": {Name: "OpenCurlyDoubleQuote", CodePoints: []int{8220}, Characters: []byte{0xe2, 0x80, 0x9c}}, + "OpenCurlyQuote": {Name: "OpenCurlyQuote", CodePoints: []int{8216}, Characters: []byte{0xe2, 0x80, 0x98}}, + "Or": {Name: "Or", CodePoints: []int{10836}, Characters: []byte{0xe2, 0xa9, 0x94}}, + "Oscr": {Name: "Oscr", CodePoints: []int{119978}, Characters: []byte{0xf0, 0x9d, 0x92, 0xaa}}, + "Oslash": {Name: "Oslash", CodePoints: []int{216}, Characters: []byte{0xc3, 0x98}}, + "Otilde": {Name: "Otilde", CodePoints: []int{213}, Characters: []byte{0xc3, 0x95}}, + "Otimes": {Name: "Otimes", CodePoints: []int{10807}, Characters: []byte{0xe2, 0xa8, 0xb7}}, + "Ouml": {Name: "Ouml", CodePoints: []int{214}, Characters: []byte{0xc3, 0x96}}, + "OverBar": {Name: "OverBar", CodePoints: []int{8254}, Characters: []byte{0xe2, 0x80, 0xbe}}, + "OverBrace": {Name: "OverBrace", CodePoints: []int{9182}, Characters: []byte{0xe2, 0x8f, 0x9e}}, + "OverBracket": {Name: "OverBracket", CodePoints: []int{9140}, Characters: []byte{0xe2, 0x8e, 0xb4}}, + "OverParenthesis": {Name: "OverParenthesis", CodePoints: []int{9180}, Characters: []byte{0xe2, 0x8f, 0x9c}}, + "PartialD": {Name: "PartialD", CodePoints: []int{8706}, Characters: []byte{0xe2, 0x88, 0x82}}, + "Pcy": {Name: "Pcy", CodePoints: []int{1055}, Characters: []byte{0xd0, 0x9f}}, + "Pfr": {Name: "Pfr", CodePoints: []int{120083}, Characters: []byte{0xf0, 0x9d, 0x94, 0x93}}, + "Phi": {Name: "Phi", CodePoints: []int{934}, Characters: []byte{0xce, 0xa6}}, + "Pi": {Name: "Pi", CodePoints: []int{928}, Characters: []byte{0xce, 0xa0}}, + "PlusMinus": {Name: "PlusMinus", CodePoints: []int{177}, Characters: []byte{0xc2, 0xb1}}, + "Poincareplane": {Name: "Poincareplane", CodePoints: []int{8460}, Characters: []byte{0xe2, 0x84, 0x8c}}, + "Popf": {Name: "Popf", CodePoints: []int{8473}, Characters: []byte{0xe2, 0x84, 0x99}}, + "Pr": {Name: "Pr", CodePoints: []int{10939}, Characters: []byte{0xe2, 0xaa, 0xbb}}, + "Precedes": {Name: "Precedes", CodePoints: []int{8826}, Characters: []byte{0xe2, 0x89, 0xba}}, + "PrecedesEqual": {Name: "PrecedesEqual", CodePoints: []int{10927}, Characters: []byte{0xe2, 0xaa, 0xaf}}, + "PrecedesSlantEqual": {Name: "PrecedesSlantEqual", CodePoints: []int{8828}, Characters: []byte{0xe2, 0x89, 0xbc}}, + "PrecedesTilde": {Name: "PrecedesTilde", CodePoints: []int{8830}, Characters: []byte{0xe2, 0x89, 0xbe}}, + "Prime": {Name: "Prime", CodePoints: []int{8243}, Characters: []byte{0xe2, 0x80, 0xb3}}, + "Product": {Name: "Product", CodePoints: []int{8719}, Characters: []byte{0xe2, 0x88, 0x8f}}, + "Proportion": {Name: "Proportion", CodePoints: []int{8759}, Characters: []byte{0xe2, 0x88, 0xb7}}, + "Proportional": {Name: "Proportional", CodePoints: []int{8733}, Characters: []byte{0xe2, 0x88, 0x9d}}, + "Pscr": {Name: "Pscr", CodePoints: []int{119979}, Characters: []byte{0xf0, 0x9d, 0x92, 0xab}}, + "Psi": {Name: "Psi", CodePoints: []int{936}, Characters: []byte{0xce, 0xa8}}, + "QUOT": {Name: "QUOT", CodePoints: []int{34}, Characters: []byte{0x22}}, + "Qfr": {Name: "Qfr", CodePoints: []int{120084}, Characters: []byte{0xf0, 0x9d, 0x94, 0x94}}, + "Qopf": {Name: "Qopf", CodePoints: []int{8474}, Characters: []byte{0xe2, 0x84, 0x9a}}, + "Qscr": {Name: "Qscr", CodePoints: []int{119980}, Characters: []byte{0xf0, 0x9d, 0x92, 0xac}}, + "RBarr": {Name: "RBarr", CodePoints: []int{10512}, Characters: []byte{0xe2, 0xa4, 0x90}}, + "REG": {Name: "REG", CodePoints: []int{174}, Characters: []byte{0xc2, 0xae}}, + "Racute": {Name: "Racute", CodePoints: []int{340}, Characters: []byte{0xc5, 0x94}}, + "Rang": {Name: "Rang", CodePoints: []int{10219}, Characters: []byte{0xe2, 0x9f, 0xab}}, + "Rarr": {Name: "Rarr", CodePoints: []int{8608}, Characters: []byte{0xe2, 0x86, 0xa0}}, + "Rarrtl": {Name: "Rarrtl", CodePoints: []int{10518}, Characters: []byte{0xe2, 0xa4, 0x96}}, + "Rcaron": {Name: "Rcaron", CodePoints: []int{344}, Characters: []byte{0xc5, 0x98}}, + "Rcedil": {Name: "Rcedil", CodePoints: []int{342}, Characters: []byte{0xc5, 0x96}}, + "Rcy": {Name: "Rcy", CodePoints: []int{1056}, Characters: []byte{0xd0, 0xa0}}, + "Re": {Name: "Re", CodePoints: []int{8476}, Characters: []byte{0xe2, 0x84, 0x9c}}, + "ReverseElement": {Name: "ReverseElement", CodePoints: []int{8715}, Characters: []byte{0xe2, 0x88, 0x8b}}, + "ReverseEquilibrium": {Name: "ReverseEquilibrium", CodePoints: []int{8651}, Characters: []byte{0xe2, 0x87, 0x8b}}, + "ReverseUpEquilibrium": {Name: "ReverseUpEquilibrium", CodePoints: []int{10607}, Characters: []byte{0xe2, 0xa5, 0xaf}}, + "Rfr": {Name: "Rfr", CodePoints: []int{8476}, Characters: []byte{0xe2, 0x84, 0x9c}}, + "Rho": {Name: "Rho", CodePoints: []int{929}, Characters: []byte{0xce, 0xa1}}, + "RightAngleBracket": {Name: "RightAngleBracket", CodePoints: []int{10217}, Characters: []byte{0xe2, 0x9f, 0xa9}}, + "RightArrow": {Name: "RightArrow", CodePoints: []int{8594}, Characters: []byte{0xe2, 0x86, 0x92}}, + "RightArrowBar": {Name: "RightArrowBar", CodePoints: []int{8677}, Characters: []byte{0xe2, 0x87, 0xa5}}, + "RightArrowLeftArrow": {Name: "RightArrowLeftArrow", CodePoints: []int{8644}, Characters: []byte{0xe2, 0x87, 0x84}}, + "RightCeiling": {Name: "RightCeiling", CodePoints: []int{8969}, Characters: []byte{0xe2, 0x8c, 0x89}}, + "RightDoubleBracket": {Name: "RightDoubleBracket", CodePoints: []int{10215}, Characters: []byte{0xe2, 0x9f, 0xa7}}, + "RightDownTeeVector": {Name: "RightDownTeeVector", CodePoints: []int{10589}, Characters: []byte{0xe2, 0xa5, 0x9d}}, + "RightDownVector": {Name: "RightDownVector", CodePoints: []int{8642}, Characters: []byte{0xe2, 0x87, 0x82}}, + "RightDownVectorBar": {Name: "RightDownVectorBar", CodePoints: []int{10581}, Characters: []byte{0xe2, 0xa5, 0x95}}, + "RightFloor": {Name: "RightFloor", CodePoints: []int{8971}, Characters: []byte{0xe2, 0x8c, 0x8b}}, + "RightTee": {Name: "RightTee", CodePoints: []int{8866}, Characters: []byte{0xe2, 0x8a, 0xa2}}, + "RightTeeArrow": {Name: "RightTeeArrow", CodePoints: []int{8614}, Characters: []byte{0xe2, 0x86, 0xa6}}, + "RightTeeVector": {Name: "RightTeeVector", CodePoints: []int{10587}, Characters: []byte{0xe2, 0xa5, 0x9b}}, + "RightTriangle": {Name: "RightTriangle", CodePoints: []int{8883}, Characters: []byte{0xe2, 0x8a, 0xb3}}, + "RightTriangleBar": {Name: "RightTriangleBar", CodePoints: []int{10704}, Characters: []byte{0xe2, 0xa7, 0x90}}, + "RightTriangleEqual": {Name: "RightTriangleEqual", CodePoints: []int{8885}, Characters: []byte{0xe2, 0x8a, 0xb5}}, + "RightUpDownVector": {Name: "RightUpDownVector", CodePoints: []int{10575}, Characters: []byte{0xe2, 0xa5, 0x8f}}, + "RightUpTeeVector": {Name: "RightUpTeeVector", CodePoints: []int{10588}, Characters: []byte{0xe2, 0xa5, 0x9c}}, + "RightUpVector": {Name: "RightUpVector", CodePoints: []int{8638}, Characters: []byte{0xe2, 0x86, 0xbe}}, + "RightUpVectorBar": {Name: "RightUpVectorBar", CodePoints: []int{10580}, Characters: []byte{0xe2, 0xa5, 0x94}}, + "RightVector": {Name: "RightVector", CodePoints: []int{8640}, Characters: []byte{0xe2, 0x87, 0x80}}, + "RightVectorBar": {Name: "RightVectorBar", CodePoints: []int{10579}, Characters: []byte{0xe2, 0xa5, 0x93}}, + "Rightarrow": {Name: "Rightarrow", CodePoints: []int{8658}, Characters: []byte{0xe2, 0x87, 0x92}}, + "Ropf": {Name: "Ropf", CodePoints: []int{8477}, Characters: []byte{0xe2, 0x84, 0x9d}}, + "RoundImplies": {Name: "RoundImplies", CodePoints: []int{10608}, Characters: []byte{0xe2, 0xa5, 0xb0}}, + "Rrightarrow": {Name: "Rrightarrow", CodePoints: []int{8667}, Characters: []byte{0xe2, 0x87, 0x9b}}, + "Rscr": {Name: "Rscr", CodePoints: []int{8475}, Characters: []byte{0xe2, 0x84, 0x9b}}, + "Rsh": {Name: "Rsh", CodePoints: []int{8625}, Characters: []byte{0xe2, 0x86, 0xb1}}, + "RuleDelayed": {Name: "RuleDelayed", CodePoints: []int{10740}, Characters: []byte{0xe2, 0xa7, 0xb4}}, + "SHCHcy": {Name: "SHCHcy", CodePoints: []int{1065}, Characters: []byte{0xd0, 0xa9}}, + "SHcy": {Name: "SHcy", CodePoints: []int{1064}, Characters: []byte{0xd0, 0xa8}}, + "SOFTcy": {Name: "SOFTcy", CodePoints: []int{1068}, Characters: []byte{0xd0, 0xac}}, + "Sacute": {Name: "Sacute", CodePoints: []int{346}, Characters: []byte{0xc5, 0x9a}}, + "Sc": {Name: "Sc", CodePoints: []int{10940}, Characters: []byte{0xe2, 0xaa, 0xbc}}, + "Scaron": {Name: "Scaron", CodePoints: []int{352}, Characters: []byte{0xc5, 0xa0}}, + "Scedil": {Name: "Scedil", CodePoints: []int{350}, Characters: []byte{0xc5, 0x9e}}, + "Scirc": {Name: "Scirc", CodePoints: []int{348}, Characters: []byte{0xc5, 0x9c}}, + "Scy": {Name: "Scy", CodePoints: []int{1057}, Characters: []byte{0xd0, 0xa1}}, + "Sfr": {Name: "Sfr", CodePoints: []int{120086}, Characters: []byte{0xf0, 0x9d, 0x94, 0x96}}, + "ShortDownArrow": {Name: "ShortDownArrow", CodePoints: []int{8595}, Characters: []byte{0xe2, 0x86, 0x93}}, + "ShortLeftArrow": {Name: "ShortLeftArrow", CodePoints: []int{8592}, Characters: []byte{0xe2, 0x86, 0x90}}, + "ShortRightArrow": {Name: "ShortRightArrow", CodePoints: []int{8594}, Characters: []byte{0xe2, 0x86, 0x92}}, + "ShortUpArrow": {Name: "ShortUpArrow", CodePoints: []int{8593}, Characters: []byte{0xe2, 0x86, 0x91}}, + "Sigma": {Name: "Sigma", CodePoints: []int{931}, Characters: []byte{0xce, 0xa3}}, + "SmallCircle": {Name: "SmallCircle", CodePoints: []int{8728}, Characters: []byte{0xe2, 0x88, 0x98}}, + "Sopf": {Name: "Sopf", CodePoints: []int{120138}, Characters: []byte{0xf0, 0x9d, 0x95, 0x8a}}, + "Sqrt": {Name: "Sqrt", CodePoints: []int{8730}, Characters: []byte{0xe2, 0x88, 0x9a}}, + "Square": {Name: "Square", CodePoints: []int{9633}, Characters: []byte{0xe2, 0x96, 0xa1}}, + "SquareIntersection": {Name: "SquareIntersection", CodePoints: []int{8851}, Characters: []byte{0xe2, 0x8a, 0x93}}, + "SquareSubset": {Name: "SquareSubset", CodePoints: []int{8847}, Characters: []byte{0xe2, 0x8a, 0x8f}}, + "SquareSubsetEqual": {Name: "SquareSubsetEqual", CodePoints: []int{8849}, Characters: []byte{0xe2, 0x8a, 0x91}}, + "SquareSuperset": {Name: "SquareSuperset", CodePoints: []int{8848}, Characters: []byte{0xe2, 0x8a, 0x90}}, + "SquareSupersetEqual": {Name: "SquareSupersetEqual", CodePoints: []int{8850}, Characters: []byte{0xe2, 0x8a, 0x92}}, + "SquareUnion": {Name: "SquareUnion", CodePoints: []int{8852}, Characters: []byte{0xe2, 0x8a, 0x94}}, + "Sscr": {Name: "Sscr", CodePoints: []int{119982}, Characters: []byte{0xf0, 0x9d, 0x92, 0xae}}, + "Star": {Name: "Star", CodePoints: []int{8902}, Characters: []byte{0xe2, 0x8b, 0x86}}, + "Sub": {Name: "Sub", CodePoints: []int{8912}, Characters: []byte{0xe2, 0x8b, 0x90}}, + "Subset": {Name: "Subset", CodePoints: []int{8912}, Characters: []byte{0xe2, 0x8b, 0x90}}, + "SubsetEqual": {Name: "SubsetEqual", CodePoints: []int{8838}, Characters: []byte{0xe2, 0x8a, 0x86}}, + "Succeeds": {Name: "Succeeds", CodePoints: []int{8827}, Characters: []byte{0xe2, 0x89, 0xbb}}, + "SucceedsEqual": {Name: "SucceedsEqual", CodePoints: []int{10928}, Characters: []byte{0xe2, 0xaa, 0xb0}}, + "SucceedsSlantEqual": {Name: "SucceedsSlantEqual", CodePoints: []int{8829}, Characters: []byte{0xe2, 0x89, 0xbd}}, + "SucceedsTilde": {Name: "SucceedsTilde", CodePoints: []int{8831}, Characters: []byte{0xe2, 0x89, 0xbf}}, + "SuchThat": {Name: "SuchThat", CodePoints: []int{8715}, Characters: []byte{0xe2, 0x88, 0x8b}}, + "Sum": {Name: "Sum", CodePoints: []int{8721}, Characters: []byte{0xe2, 0x88, 0x91}}, + "Sup": {Name: "Sup", CodePoints: []int{8913}, Characters: []byte{0xe2, 0x8b, 0x91}}, + "Superset": {Name: "Superset", CodePoints: []int{8835}, Characters: []byte{0xe2, 0x8a, 0x83}}, + "SupersetEqual": {Name: "SupersetEqual", CodePoints: []int{8839}, Characters: []byte{0xe2, 0x8a, 0x87}}, + "Supset": {Name: "Supset", CodePoints: []int{8913}, Characters: []byte{0xe2, 0x8b, 0x91}}, + "THORN": {Name: "THORN", CodePoints: []int{222}, Characters: []byte{0xc3, 0x9e}}, + "TRADE": {Name: "TRADE", CodePoints: []int{8482}, Characters: []byte{0xe2, 0x84, 0xa2}}, + "TSHcy": {Name: "TSHcy", CodePoints: []int{1035}, Characters: []byte{0xd0, 0x8b}}, + "TScy": {Name: "TScy", CodePoints: []int{1062}, Characters: []byte{0xd0, 0xa6}}, + "Tab": {Name: "Tab", CodePoints: []int{9}, Characters: []byte{0x9}}, + "Tau": {Name: "Tau", CodePoints: []int{932}, Characters: []byte{0xce, 0xa4}}, + "Tcaron": {Name: "Tcaron", CodePoints: []int{356}, Characters: []byte{0xc5, 0xa4}}, + "Tcedil": {Name: "Tcedil", CodePoints: []int{354}, Characters: []byte{0xc5, 0xa2}}, + "Tcy": {Name: "Tcy", CodePoints: []int{1058}, Characters: []byte{0xd0, 0xa2}}, + "Tfr": {Name: "Tfr", CodePoints: []int{120087}, Characters: []byte{0xf0, 0x9d, 0x94, 0x97}}, + "Therefore": {Name: "Therefore", CodePoints: []int{8756}, Characters: []byte{0xe2, 0x88, 0xb4}}, + "Theta": {Name: "Theta", CodePoints: []int{920}, Characters: []byte{0xce, 0x98}}, + "ThickSpace": {Name: "ThickSpace", CodePoints: []int{8287, 8202}, Characters: []byte{0xe2, 0x81, 0x9f, 0xe2, 0x80, 0x8a}}, + "ThinSpace": {Name: "ThinSpace", CodePoints: []int{8201}, Characters: []byte{0xe2, 0x80, 0x89}}, + "Tilde": {Name: "Tilde", CodePoints: []int{8764}, Characters: []byte{0xe2, 0x88, 0xbc}}, + "TildeEqual": {Name: "TildeEqual", CodePoints: []int{8771}, Characters: []byte{0xe2, 0x89, 0x83}}, + "TildeFullEqual": {Name: "TildeFullEqual", CodePoints: []int{8773}, Characters: []byte{0xe2, 0x89, 0x85}}, + "TildeTilde": {Name: "TildeTilde", CodePoints: []int{8776}, Characters: []byte{0xe2, 0x89, 0x88}}, + "Topf": {Name: "Topf", CodePoints: []int{120139}, Characters: []byte{0xf0, 0x9d, 0x95, 0x8b}}, + "TripleDot": {Name: "TripleDot", CodePoints: []int{8411}, Characters: []byte{0xe2, 0x83, 0x9b}}, + "Tscr": {Name: "Tscr", CodePoints: []int{119983}, Characters: []byte{0xf0, 0x9d, 0x92, 0xaf}}, + "Tstrok": {Name: "Tstrok", CodePoints: []int{358}, Characters: []byte{0xc5, 0xa6}}, + "Uacute": {Name: "Uacute", CodePoints: []int{218}, Characters: []byte{0xc3, 0x9a}}, + "Uarr": {Name: "Uarr", CodePoints: []int{8607}, Characters: []byte{0xe2, 0x86, 0x9f}}, + "Uarrocir": {Name: "Uarrocir", CodePoints: []int{10569}, Characters: []byte{0xe2, 0xa5, 0x89}}, + "Ubrcy": {Name: "Ubrcy", CodePoints: []int{1038}, Characters: []byte{0xd0, 0x8e}}, + "Ubreve": {Name: "Ubreve", CodePoints: []int{364}, Characters: []byte{0xc5, 0xac}}, + "Ucirc": {Name: "Ucirc", CodePoints: []int{219}, Characters: []byte{0xc3, 0x9b}}, + "Ucy": {Name: "Ucy", CodePoints: []int{1059}, Characters: []byte{0xd0, 0xa3}}, + "Udblac": {Name: "Udblac", CodePoints: []int{368}, Characters: []byte{0xc5, 0xb0}}, + "Ufr": {Name: "Ufr", CodePoints: []int{120088}, Characters: []byte{0xf0, 0x9d, 0x94, 0x98}}, + "Ugrave": {Name: "Ugrave", CodePoints: []int{217}, Characters: []byte{0xc3, 0x99}}, + "Umacr": {Name: "Umacr", CodePoints: []int{362}, Characters: []byte{0xc5, 0xaa}}, + "UnderBar": {Name: "UnderBar", CodePoints: []int{95}, Characters: []byte{0x5f}}, + "UnderBrace": {Name: "UnderBrace", CodePoints: []int{9183}, Characters: []byte{0xe2, 0x8f, 0x9f}}, + "UnderBracket": {Name: "UnderBracket", CodePoints: []int{9141}, Characters: []byte{0xe2, 0x8e, 0xb5}}, + "UnderParenthesis": {Name: "UnderParenthesis", CodePoints: []int{9181}, Characters: []byte{0xe2, 0x8f, 0x9d}}, + "Union": {Name: "Union", CodePoints: []int{8899}, Characters: []byte{0xe2, 0x8b, 0x83}}, + "UnionPlus": {Name: "UnionPlus", CodePoints: []int{8846}, Characters: []byte{0xe2, 0x8a, 0x8e}}, + "Uogon": {Name: "Uogon", CodePoints: []int{370}, Characters: []byte{0xc5, 0xb2}}, + "Uopf": {Name: "Uopf", CodePoints: []int{120140}, Characters: []byte{0xf0, 0x9d, 0x95, 0x8c}}, + "UpArrow": {Name: "UpArrow", CodePoints: []int{8593}, Characters: []byte{0xe2, 0x86, 0x91}}, + "UpArrowBar": {Name: "UpArrowBar", CodePoints: []int{10514}, Characters: []byte{0xe2, 0xa4, 0x92}}, + "UpArrowDownArrow": {Name: "UpArrowDownArrow", CodePoints: []int{8645}, Characters: []byte{0xe2, 0x87, 0x85}}, + "UpDownArrow": {Name: "UpDownArrow", CodePoints: []int{8597}, Characters: []byte{0xe2, 0x86, 0x95}}, + "UpEquilibrium": {Name: "UpEquilibrium", CodePoints: []int{10606}, Characters: []byte{0xe2, 0xa5, 0xae}}, + "UpTee": {Name: "UpTee", CodePoints: []int{8869}, Characters: []byte{0xe2, 0x8a, 0xa5}}, + "UpTeeArrow": {Name: "UpTeeArrow", CodePoints: []int{8613}, Characters: []byte{0xe2, 0x86, 0xa5}}, + "Uparrow": {Name: "Uparrow", CodePoints: []int{8657}, Characters: []byte{0xe2, 0x87, 0x91}}, + "Updownarrow": {Name: "Updownarrow", CodePoints: []int{8661}, Characters: []byte{0xe2, 0x87, 0x95}}, + "UpperLeftArrow": {Name: "UpperLeftArrow", CodePoints: []int{8598}, Characters: []byte{0xe2, 0x86, 0x96}}, + "UpperRightArrow": {Name: "UpperRightArrow", CodePoints: []int{8599}, Characters: []byte{0xe2, 0x86, 0x97}}, + "Upsi": {Name: "Upsi", CodePoints: []int{978}, Characters: []byte{0xcf, 0x92}}, + "Upsilon": {Name: "Upsilon", CodePoints: []int{933}, Characters: []byte{0xce, 0xa5}}, + "Uring": {Name: "Uring", CodePoints: []int{366}, Characters: []byte{0xc5, 0xae}}, + "Uscr": {Name: "Uscr", CodePoints: []int{119984}, Characters: []byte{0xf0, 0x9d, 0x92, 0xb0}}, + "Utilde": {Name: "Utilde", CodePoints: []int{360}, Characters: []byte{0xc5, 0xa8}}, + "Uuml": {Name: "Uuml", CodePoints: []int{220}, Characters: []byte{0xc3, 0x9c}}, + "VDash": {Name: "VDash", CodePoints: []int{8875}, Characters: []byte{0xe2, 0x8a, 0xab}}, + "Vbar": {Name: "Vbar", CodePoints: []int{10987}, Characters: []byte{0xe2, 0xab, 0xab}}, + "Vcy": {Name: "Vcy", CodePoints: []int{1042}, Characters: []byte{0xd0, 0x92}}, + "Vdash": {Name: "Vdash", CodePoints: []int{8873}, Characters: []byte{0xe2, 0x8a, 0xa9}}, + "Vdashl": {Name: "Vdashl", CodePoints: []int{10982}, Characters: []byte{0xe2, 0xab, 0xa6}}, + "Vee": {Name: "Vee", CodePoints: []int{8897}, Characters: []byte{0xe2, 0x8b, 0x81}}, + "Verbar": {Name: "Verbar", CodePoints: []int{8214}, Characters: []byte{0xe2, 0x80, 0x96}}, + "Vert": {Name: "Vert", CodePoints: []int{8214}, Characters: []byte{0xe2, 0x80, 0x96}}, + "VerticalBar": {Name: "VerticalBar", CodePoints: []int{8739}, Characters: []byte{0xe2, 0x88, 0xa3}}, + "VerticalLine": {Name: "VerticalLine", CodePoints: []int{124}, Characters: []byte{0x7c}}, + "VerticalSeparator": {Name: "VerticalSeparator", CodePoints: []int{10072}, Characters: []byte{0xe2, 0x9d, 0x98}}, + "VerticalTilde": {Name: "VerticalTilde", CodePoints: []int{8768}, Characters: []byte{0xe2, 0x89, 0x80}}, + "VeryThinSpace": {Name: "VeryThinSpace", CodePoints: []int{8202}, Characters: []byte{0xe2, 0x80, 0x8a}}, + "Vfr": {Name: "Vfr", CodePoints: []int{120089}, Characters: []byte{0xf0, 0x9d, 0x94, 0x99}}, + "Vopf": {Name: "Vopf", CodePoints: []int{120141}, Characters: []byte{0xf0, 0x9d, 0x95, 0x8d}}, + "Vscr": {Name: "Vscr", CodePoints: []int{119985}, Characters: []byte{0xf0, 0x9d, 0x92, 0xb1}}, + "Vvdash": {Name: "Vvdash", CodePoints: []int{8874}, Characters: []byte{0xe2, 0x8a, 0xaa}}, + "Wcirc": {Name: "Wcirc", CodePoints: []int{372}, Characters: []byte{0xc5, 0xb4}}, + "Wedge": {Name: "Wedge", CodePoints: []int{8896}, Characters: []byte{0xe2, 0x8b, 0x80}}, + "Wfr": {Name: "Wfr", CodePoints: []int{120090}, Characters: []byte{0xf0, 0x9d, 0x94, 0x9a}}, + "Wopf": {Name: "Wopf", CodePoints: []int{120142}, Characters: []byte{0xf0, 0x9d, 0x95, 0x8e}}, + "Wscr": {Name: "Wscr", CodePoints: []int{119986}, Characters: []byte{0xf0, 0x9d, 0x92, 0xb2}}, + "Xfr": {Name: "Xfr", CodePoints: []int{120091}, Characters: []byte{0xf0, 0x9d, 0x94, 0x9b}}, + "Xi": {Name: "Xi", CodePoints: []int{926}, Characters: []byte{0xce, 0x9e}}, + "Xopf": {Name: "Xopf", CodePoints: []int{120143}, Characters: []byte{0xf0, 0x9d, 0x95, 0x8f}}, + "Xscr": {Name: "Xscr", CodePoints: []int{119987}, Characters: []byte{0xf0, 0x9d, 0x92, 0xb3}}, + "YAcy": {Name: "YAcy", CodePoints: []int{1071}, Characters: []byte{0xd0, 0xaf}}, + "YIcy": {Name: "YIcy", CodePoints: []int{1031}, Characters: []byte{0xd0, 0x87}}, + "YUcy": {Name: "YUcy", CodePoints: []int{1070}, Characters: []byte{0xd0, 0xae}}, + "Yacute": {Name: "Yacute", CodePoints: []int{221}, Characters: []byte{0xc3, 0x9d}}, + "Ycirc": {Name: "Ycirc", CodePoints: []int{374}, Characters: []byte{0xc5, 0xb6}}, + "Ycy": {Name: "Ycy", CodePoints: []int{1067}, Characters: []byte{0xd0, 0xab}}, + "Yfr": {Name: "Yfr", CodePoints: []int{120092}, Characters: []byte{0xf0, 0x9d, 0x94, 0x9c}}, + "Yopf": {Name: "Yopf", CodePoints: []int{120144}, Characters: []byte{0xf0, 0x9d, 0x95, 0x90}}, + "Yscr": {Name: "Yscr", CodePoints: []int{119988}, Characters: []byte{0xf0, 0x9d, 0x92, 0xb4}}, + "Yuml": {Name: "Yuml", CodePoints: []int{376}, Characters: []byte{0xc5, 0xb8}}, + "ZHcy": {Name: "ZHcy", CodePoints: []int{1046}, Characters: []byte{0xd0, 0x96}}, + "Zacute": {Name: "Zacute", CodePoints: []int{377}, Characters: []byte{0xc5, 0xb9}}, + "Zcaron": {Name: "Zcaron", CodePoints: []int{381}, Characters: []byte{0xc5, 0xbd}}, + "Zcy": {Name: "Zcy", CodePoints: []int{1047}, Characters: []byte{0xd0, 0x97}}, + "Zdot": {Name: "Zdot", CodePoints: []int{379}, Characters: []byte{0xc5, 0xbb}}, + "ZeroWidthSpace": {Name: "ZeroWidthSpace", CodePoints: []int{8203}, Characters: []byte{0xe2, 0x80, 0x8b}}, + "Zeta": {Name: "Zeta", CodePoints: []int{918}, Characters: []byte{0xce, 0x96}}, + "Zfr": {Name: "Zfr", CodePoints: []int{8488}, Characters: []byte{0xe2, 0x84, 0xa8}}, + "Zopf": {Name: "Zopf", CodePoints: []int{8484}, Characters: []byte{0xe2, 0x84, 0xa4}}, + "Zscr": {Name: "Zscr", CodePoints: []int{119989}, Characters: []byte{0xf0, 0x9d, 0x92, 0xb5}}, + "aacute": {Name: "aacute", CodePoints: []int{225}, Characters: []byte{0xc3, 0xa1}}, + "abreve": {Name: "abreve", CodePoints: []int{259}, Characters: []byte{0xc4, 0x83}}, + "ac": {Name: "ac", CodePoints: []int{8766}, Characters: []byte{0xe2, 0x88, 0xbe}}, + "acE": {Name: "acE", CodePoints: []int{8766, 819}, Characters: []byte{0xe2, 0x88, 0xbe, 0xcc, 0xb3}}, + "acd": {Name: "acd", CodePoints: []int{8767}, Characters: []byte{0xe2, 0x88, 0xbf}}, + "acirc": {Name: "acirc", CodePoints: []int{226}, Characters: []byte{0xc3, 0xa2}}, + "acute": {Name: "acute", CodePoints: []int{180}, Characters: []byte{0xc2, 0xb4}}, + "acy": {Name: "acy", CodePoints: []int{1072}, Characters: []byte{0xd0, 0xb0}}, + "aelig": {Name: "aelig", CodePoints: []int{230}, Characters: []byte{0xc3, 0xa6}}, + "af": {Name: "af", CodePoints: []int{8289}, Characters: []byte{0xe2, 0x81, 0xa1}}, + "afr": {Name: "afr", CodePoints: []int{120094}, Characters: []byte{0xf0, 0x9d, 0x94, 0x9e}}, + "agrave": {Name: "agrave", CodePoints: []int{224}, Characters: []byte{0xc3, 0xa0}}, + "alefsym": {Name: "alefsym", CodePoints: []int{8501}, Characters: []byte{0xe2, 0x84, 0xb5}}, + "aleph": {Name: "aleph", CodePoints: []int{8501}, Characters: []byte{0xe2, 0x84, 0xb5}}, + "alpha": {Name: "alpha", CodePoints: []int{945}, Characters: []byte{0xce, 0xb1}}, + "amacr": {Name: "amacr", CodePoints: []int{257}, Characters: []byte{0xc4, 0x81}}, + "amalg": {Name: "amalg", CodePoints: []int{10815}, Characters: []byte{0xe2, 0xa8, 0xbf}}, + "amp": {Name: "amp", CodePoints: []int{38}, Characters: []byte{0x26}}, + "and": {Name: "and", CodePoints: []int{8743}, Characters: []byte{0xe2, 0x88, 0xa7}}, + "andand": {Name: "andand", CodePoints: []int{10837}, Characters: []byte{0xe2, 0xa9, 0x95}}, + "andd": {Name: "andd", CodePoints: []int{10844}, Characters: []byte{0xe2, 0xa9, 0x9c}}, + "andslope": {Name: "andslope", CodePoints: []int{10840}, Characters: []byte{0xe2, 0xa9, 0x98}}, + "andv": {Name: "andv", CodePoints: []int{10842}, Characters: []byte{0xe2, 0xa9, 0x9a}}, + "ang": {Name: "ang", CodePoints: []int{8736}, Characters: []byte{0xe2, 0x88, 0xa0}}, + "ange": {Name: "ange", CodePoints: []int{10660}, Characters: []byte{0xe2, 0xa6, 0xa4}}, + "angle": {Name: "angle", CodePoints: []int{8736}, Characters: []byte{0xe2, 0x88, 0xa0}}, + "angmsd": {Name: "angmsd", CodePoints: []int{8737}, Characters: []byte{0xe2, 0x88, 0xa1}}, + "angmsdaa": {Name: "angmsdaa", CodePoints: []int{10664}, Characters: []byte{0xe2, 0xa6, 0xa8}}, + "angmsdab": {Name: "angmsdab", CodePoints: []int{10665}, Characters: []byte{0xe2, 0xa6, 0xa9}}, + "angmsdac": {Name: "angmsdac", CodePoints: []int{10666}, Characters: []byte{0xe2, 0xa6, 0xaa}}, + "angmsdad": {Name: "angmsdad", CodePoints: []int{10667}, Characters: []byte{0xe2, 0xa6, 0xab}}, + "angmsdae": {Name: "angmsdae", CodePoints: []int{10668}, Characters: []byte{0xe2, 0xa6, 0xac}}, + "angmsdaf": {Name: "angmsdaf", CodePoints: []int{10669}, Characters: []byte{0xe2, 0xa6, 0xad}}, + "angmsdag": {Name: "angmsdag", CodePoints: []int{10670}, Characters: []byte{0xe2, 0xa6, 0xae}}, + "angmsdah": {Name: "angmsdah", CodePoints: []int{10671}, Characters: []byte{0xe2, 0xa6, 0xaf}}, + "angrt": {Name: "angrt", CodePoints: []int{8735}, Characters: []byte{0xe2, 0x88, 0x9f}}, + "angrtvb": {Name: "angrtvb", CodePoints: []int{8894}, Characters: []byte{0xe2, 0x8a, 0xbe}}, + "angrtvbd": {Name: "angrtvbd", CodePoints: []int{10653}, Characters: []byte{0xe2, 0xa6, 0x9d}}, + "angsph": {Name: "angsph", CodePoints: []int{8738}, Characters: []byte{0xe2, 0x88, 0xa2}}, + "angst": {Name: "angst", CodePoints: []int{197}, Characters: []byte{0xc3, 0x85}}, + "angzarr": {Name: "angzarr", CodePoints: []int{9084}, Characters: []byte{0xe2, 0x8d, 0xbc}}, + "aogon": {Name: "aogon", CodePoints: []int{261}, Characters: []byte{0xc4, 0x85}}, + "aopf": {Name: "aopf", CodePoints: []int{120146}, Characters: []byte{0xf0, 0x9d, 0x95, 0x92}}, + "ap": {Name: "ap", CodePoints: []int{8776}, Characters: []byte{0xe2, 0x89, 0x88}}, + "apE": {Name: "apE", CodePoints: []int{10864}, Characters: []byte{0xe2, 0xa9, 0xb0}}, + "apacir": {Name: "apacir", CodePoints: []int{10863}, Characters: []byte{0xe2, 0xa9, 0xaf}}, + "ape": {Name: "ape", CodePoints: []int{8778}, Characters: []byte{0xe2, 0x89, 0x8a}}, + "apid": {Name: "apid", CodePoints: []int{8779}, Characters: []byte{0xe2, 0x89, 0x8b}}, + "apos": {Name: "apos", CodePoints: []int{39}, Characters: []byte{0x27}}, + "approx": {Name: "approx", CodePoints: []int{8776}, Characters: []byte{0xe2, 0x89, 0x88}}, + "approxeq": {Name: "approxeq", CodePoints: []int{8778}, Characters: []byte{0xe2, 0x89, 0x8a}}, + "aring": {Name: "aring", CodePoints: []int{229}, Characters: []byte{0xc3, 0xa5}}, + "ascr": {Name: "ascr", CodePoints: []int{119990}, Characters: []byte{0xf0, 0x9d, 0x92, 0xb6}}, + "ast": {Name: "ast", CodePoints: []int{42}, Characters: []byte{0x2a}}, + "asymp": {Name: "asymp", CodePoints: []int{8776}, Characters: []byte{0xe2, 0x89, 0x88}}, + "asympeq": {Name: "asympeq", CodePoints: []int{8781}, Characters: []byte{0xe2, 0x89, 0x8d}}, + "atilde": {Name: "atilde", CodePoints: []int{227}, Characters: []byte{0xc3, 0xa3}}, + "auml": {Name: "auml", CodePoints: []int{228}, Characters: []byte{0xc3, 0xa4}}, + "awconint": {Name: "awconint", CodePoints: []int{8755}, Characters: []byte{0xe2, 0x88, 0xb3}}, + "awint": {Name: "awint", CodePoints: []int{10769}, Characters: []byte{0xe2, 0xa8, 0x91}}, + "bNot": {Name: "bNot", CodePoints: []int{10989}, Characters: []byte{0xe2, 0xab, 0xad}}, + "backcong": {Name: "backcong", CodePoints: []int{8780}, Characters: []byte{0xe2, 0x89, 0x8c}}, + "backepsilon": {Name: "backepsilon", CodePoints: []int{1014}, Characters: []byte{0xcf, 0xb6}}, + "backprime": {Name: "backprime", CodePoints: []int{8245}, Characters: []byte{0xe2, 0x80, 0xb5}}, + "backsim": {Name: "backsim", CodePoints: []int{8765}, Characters: []byte{0xe2, 0x88, 0xbd}}, + "backsimeq": {Name: "backsimeq", CodePoints: []int{8909}, Characters: []byte{0xe2, 0x8b, 0x8d}}, + "barvee": {Name: "barvee", CodePoints: []int{8893}, Characters: []byte{0xe2, 0x8a, 0xbd}}, + "barwed": {Name: "barwed", CodePoints: []int{8965}, Characters: []byte{0xe2, 0x8c, 0x85}}, + "barwedge": {Name: "barwedge", CodePoints: []int{8965}, Characters: []byte{0xe2, 0x8c, 0x85}}, + "bbrk": {Name: "bbrk", CodePoints: []int{9141}, Characters: []byte{0xe2, 0x8e, 0xb5}}, + "bbrktbrk": {Name: "bbrktbrk", CodePoints: []int{9142}, Characters: []byte{0xe2, 0x8e, 0xb6}}, + "bcong": {Name: "bcong", CodePoints: []int{8780}, Characters: []byte{0xe2, 0x89, 0x8c}}, + "bcy": {Name: "bcy", CodePoints: []int{1073}, Characters: []byte{0xd0, 0xb1}}, + "bdquo": {Name: "bdquo", CodePoints: []int{8222}, Characters: []byte{0xe2, 0x80, 0x9e}}, + "becaus": {Name: "becaus", CodePoints: []int{8757}, Characters: []byte{0xe2, 0x88, 0xb5}}, + "because": {Name: "because", CodePoints: []int{8757}, Characters: []byte{0xe2, 0x88, 0xb5}}, + "bemptyv": {Name: "bemptyv", CodePoints: []int{10672}, Characters: []byte{0xe2, 0xa6, 0xb0}}, + "bepsi": {Name: "bepsi", CodePoints: []int{1014}, Characters: []byte{0xcf, 0xb6}}, + "bernou": {Name: "bernou", CodePoints: []int{8492}, Characters: []byte{0xe2, 0x84, 0xac}}, + "beta": {Name: "beta", CodePoints: []int{946}, Characters: []byte{0xce, 0xb2}}, + "beth": {Name: "beth", CodePoints: []int{8502}, Characters: []byte{0xe2, 0x84, 0xb6}}, + "between": {Name: "between", CodePoints: []int{8812}, Characters: []byte{0xe2, 0x89, 0xac}}, + "bfr": {Name: "bfr", CodePoints: []int{120095}, Characters: []byte{0xf0, 0x9d, 0x94, 0x9f}}, + "bigcap": {Name: "bigcap", CodePoints: []int{8898}, Characters: []byte{0xe2, 0x8b, 0x82}}, + "bigcirc": {Name: "bigcirc", CodePoints: []int{9711}, Characters: []byte{0xe2, 0x97, 0xaf}}, + "bigcup": {Name: "bigcup", CodePoints: []int{8899}, Characters: []byte{0xe2, 0x8b, 0x83}}, + "bigodot": {Name: "bigodot", CodePoints: []int{10752}, Characters: []byte{0xe2, 0xa8, 0x80}}, + "bigoplus": {Name: "bigoplus", CodePoints: []int{10753}, Characters: []byte{0xe2, 0xa8, 0x81}}, + "bigotimes": {Name: "bigotimes", CodePoints: []int{10754}, Characters: []byte{0xe2, 0xa8, 0x82}}, + "bigsqcup": {Name: "bigsqcup", CodePoints: []int{10758}, Characters: []byte{0xe2, 0xa8, 0x86}}, + "bigstar": {Name: "bigstar", CodePoints: []int{9733}, Characters: []byte{0xe2, 0x98, 0x85}}, + "bigtriangledown": {Name: "bigtriangledown", CodePoints: []int{9661}, Characters: []byte{0xe2, 0x96, 0xbd}}, + "bigtriangleup": {Name: "bigtriangleup", CodePoints: []int{9651}, Characters: []byte{0xe2, 0x96, 0xb3}}, + "biguplus": {Name: "biguplus", CodePoints: []int{10756}, Characters: []byte{0xe2, 0xa8, 0x84}}, + "bigvee": {Name: "bigvee", CodePoints: []int{8897}, Characters: []byte{0xe2, 0x8b, 0x81}}, + "bigwedge": {Name: "bigwedge", CodePoints: []int{8896}, Characters: []byte{0xe2, 0x8b, 0x80}}, + "bkarow": {Name: "bkarow", CodePoints: []int{10509}, Characters: []byte{0xe2, 0xa4, 0x8d}}, + "blacklozenge": {Name: "blacklozenge", CodePoints: []int{10731}, Characters: []byte{0xe2, 0xa7, 0xab}}, + "blacksquare": {Name: "blacksquare", CodePoints: []int{9642}, Characters: []byte{0xe2, 0x96, 0xaa}}, + "blacktriangle": {Name: "blacktriangle", CodePoints: []int{9652}, Characters: []byte{0xe2, 0x96, 0xb4}}, + "blacktriangledown": {Name: "blacktriangledown", CodePoints: []int{9662}, Characters: []byte{0xe2, 0x96, 0xbe}}, + "blacktriangleleft": {Name: "blacktriangleleft", CodePoints: []int{9666}, Characters: []byte{0xe2, 0x97, 0x82}}, + "blacktriangleright": {Name: "blacktriangleright", CodePoints: []int{9656}, Characters: []byte{0xe2, 0x96, 0xb8}}, + "blank": {Name: "blank", CodePoints: []int{9251}, Characters: []byte{0xe2, 0x90, 0xa3}}, + "blk12": {Name: "blk12", CodePoints: []int{9618}, Characters: []byte{0xe2, 0x96, 0x92}}, + "blk14": {Name: "blk14", CodePoints: []int{9617}, Characters: []byte{0xe2, 0x96, 0x91}}, + "blk34": {Name: "blk34", CodePoints: []int{9619}, Characters: []byte{0xe2, 0x96, 0x93}}, + "block": {Name: "block", CodePoints: []int{9608}, Characters: []byte{0xe2, 0x96, 0x88}}, + "bne": {Name: "bne", CodePoints: []int{61, 8421}, Characters: []byte{0x3d, 0xe2, 0x83, 0xa5}}, + "bnequiv": {Name: "bnequiv", CodePoints: []int{8801, 8421}, Characters: []byte{0xe2, 0x89, 0xa1, 0xe2, 0x83, 0xa5}}, + "bnot": {Name: "bnot", CodePoints: []int{8976}, Characters: []byte{0xe2, 0x8c, 0x90}}, + "bopf": {Name: "bopf", CodePoints: []int{120147}, Characters: []byte{0xf0, 0x9d, 0x95, 0x93}}, + "bot": {Name: "bot", CodePoints: []int{8869}, Characters: []byte{0xe2, 0x8a, 0xa5}}, + "bottom": {Name: "bottom", CodePoints: []int{8869}, Characters: []byte{0xe2, 0x8a, 0xa5}}, + "bowtie": {Name: "bowtie", CodePoints: []int{8904}, Characters: []byte{0xe2, 0x8b, 0x88}}, + "boxDL": {Name: "boxDL", CodePoints: []int{9559}, Characters: []byte{0xe2, 0x95, 0x97}}, + "boxDR": {Name: "boxDR", CodePoints: []int{9556}, Characters: []byte{0xe2, 0x95, 0x94}}, + "boxDl": {Name: "boxDl", CodePoints: []int{9558}, Characters: []byte{0xe2, 0x95, 0x96}}, + "boxDr": {Name: "boxDr", CodePoints: []int{9555}, Characters: []byte{0xe2, 0x95, 0x93}}, + "boxH": {Name: "boxH", CodePoints: []int{9552}, Characters: []byte{0xe2, 0x95, 0x90}}, + "boxHD": {Name: "boxHD", CodePoints: []int{9574}, Characters: []byte{0xe2, 0x95, 0xa6}}, + "boxHU": {Name: "boxHU", CodePoints: []int{9577}, Characters: []byte{0xe2, 0x95, 0xa9}}, + "boxHd": {Name: "boxHd", CodePoints: []int{9572}, Characters: []byte{0xe2, 0x95, 0xa4}}, + "boxHu": {Name: "boxHu", CodePoints: []int{9575}, Characters: []byte{0xe2, 0x95, 0xa7}}, + "boxUL": {Name: "boxUL", CodePoints: []int{9565}, Characters: []byte{0xe2, 0x95, 0x9d}}, + "boxUR": {Name: "boxUR", CodePoints: []int{9562}, Characters: []byte{0xe2, 0x95, 0x9a}}, + "boxUl": {Name: "boxUl", CodePoints: []int{9564}, Characters: []byte{0xe2, 0x95, 0x9c}}, + "boxUr": {Name: "boxUr", CodePoints: []int{9561}, Characters: []byte{0xe2, 0x95, 0x99}}, + "boxV": {Name: "boxV", CodePoints: []int{9553}, Characters: []byte{0xe2, 0x95, 0x91}}, + "boxVH": {Name: "boxVH", CodePoints: []int{9580}, Characters: []byte{0xe2, 0x95, 0xac}}, + "boxVL": {Name: "boxVL", CodePoints: []int{9571}, Characters: []byte{0xe2, 0x95, 0xa3}}, + "boxVR": {Name: "boxVR", CodePoints: []int{9568}, Characters: []byte{0xe2, 0x95, 0xa0}}, + "boxVh": {Name: "boxVh", CodePoints: []int{9579}, Characters: []byte{0xe2, 0x95, 0xab}}, + "boxVl": {Name: "boxVl", CodePoints: []int{9570}, Characters: []byte{0xe2, 0x95, 0xa2}}, + "boxVr": {Name: "boxVr", CodePoints: []int{9567}, Characters: []byte{0xe2, 0x95, 0x9f}}, + "boxbox": {Name: "boxbox", CodePoints: []int{10697}, Characters: []byte{0xe2, 0xa7, 0x89}}, + "boxdL": {Name: "boxdL", CodePoints: []int{9557}, Characters: []byte{0xe2, 0x95, 0x95}}, + "boxdR": {Name: "boxdR", CodePoints: []int{9554}, Characters: []byte{0xe2, 0x95, 0x92}}, + "boxdl": {Name: "boxdl", CodePoints: []int{9488}, Characters: []byte{0xe2, 0x94, 0x90}}, + "boxdr": {Name: "boxdr", CodePoints: []int{9484}, Characters: []byte{0xe2, 0x94, 0x8c}}, + "boxh": {Name: "boxh", CodePoints: []int{9472}, Characters: []byte{0xe2, 0x94, 0x80}}, + "boxhD": {Name: "boxhD", CodePoints: []int{9573}, Characters: []byte{0xe2, 0x95, 0xa5}}, + "boxhU": {Name: "boxhU", CodePoints: []int{9576}, Characters: []byte{0xe2, 0x95, 0xa8}}, + "boxhd": {Name: "boxhd", CodePoints: []int{9516}, Characters: []byte{0xe2, 0x94, 0xac}}, + "boxhu": {Name: "boxhu", CodePoints: []int{9524}, Characters: []byte{0xe2, 0x94, 0xb4}}, + "boxminus": {Name: "boxminus", CodePoints: []int{8863}, Characters: []byte{0xe2, 0x8a, 0x9f}}, + "boxplus": {Name: "boxplus", CodePoints: []int{8862}, Characters: []byte{0xe2, 0x8a, 0x9e}}, + "boxtimes": {Name: "boxtimes", CodePoints: []int{8864}, Characters: []byte{0xe2, 0x8a, 0xa0}}, + "boxuL": {Name: "boxuL", CodePoints: []int{9563}, Characters: []byte{0xe2, 0x95, 0x9b}}, + "boxuR": {Name: "boxuR", CodePoints: []int{9560}, Characters: []byte{0xe2, 0x95, 0x98}}, + "boxul": {Name: "boxul", CodePoints: []int{9496}, Characters: []byte{0xe2, 0x94, 0x98}}, + "boxur": {Name: "boxur", CodePoints: []int{9492}, Characters: []byte{0xe2, 0x94, 0x94}}, + "boxv": {Name: "boxv", CodePoints: []int{9474}, Characters: []byte{0xe2, 0x94, 0x82}}, + "boxvH": {Name: "boxvH", CodePoints: []int{9578}, Characters: []byte{0xe2, 0x95, 0xaa}}, + "boxvL": {Name: "boxvL", CodePoints: []int{9569}, Characters: []byte{0xe2, 0x95, 0xa1}}, + "boxvR": {Name: "boxvR", CodePoints: []int{9566}, Characters: []byte{0xe2, 0x95, 0x9e}}, + "boxvh": {Name: "boxvh", CodePoints: []int{9532}, Characters: []byte{0xe2, 0x94, 0xbc}}, + "boxvl": {Name: "boxvl", CodePoints: []int{9508}, Characters: []byte{0xe2, 0x94, 0xa4}}, + "boxvr": {Name: "boxvr", CodePoints: []int{9500}, Characters: []byte{0xe2, 0x94, 0x9c}}, + "bprime": {Name: "bprime", CodePoints: []int{8245}, Characters: []byte{0xe2, 0x80, 0xb5}}, + "breve": {Name: "breve", CodePoints: []int{728}, Characters: []byte{0xcb, 0x98}}, + "brvbar": {Name: "brvbar", CodePoints: []int{166}, Characters: []byte{0xc2, 0xa6}}, + "bscr": {Name: "bscr", CodePoints: []int{119991}, Characters: []byte{0xf0, 0x9d, 0x92, 0xb7}}, + "bsemi": {Name: "bsemi", CodePoints: []int{8271}, Characters: []byte{0xe2, 0x81, 0x8f}}, + "bsim": {Name: "bsim", CodePoints: []int{8765}, Characters: []byte{0xe2, 0x88, 0xbd}}, + "bsime": {Name: "bsime", CodePoints: []int{8909}, Characters: []byte{0xe2, 0x8b, 0x8d}}, + "bsol": {Name: "bsol", CodePoints: []int{92}, Characters: []byte{0x5c}}, + "bsolb": {Name: "bsolb", CodePoints: []int{10693}, Characters: []byte{0xe2, 0xa7, 0x85}}, + "bsolhsub": {Name: "bsolhsub", CodePoints: []int{10184}, Characters: []byte{0xe2, 0x9f, 0x88}}, + "bull": {Name: "bull", CodePoints: []int{8226}, Characters: []byte{0xe2, 0x80, 0xa2}}, + "bullet": {Name: "bullet", CodePoints: []int{8226}, Characters: []byte{0xe2, 0x80, 0xa2}}, + "bump": {Name: "bump", CodePoints: []int{8782}, Characters: []byte{0xe2, 0x89, 0x8e}}, + "bumpE": {Name: "bumpE", CodePoints: []int{10926}, Characters: []byte{0xe2, 0xaa, 0xae}}, + "bumpe": {Name: "bumpe", CodePoints: []int{8783}, Characters: []byte{0xe2, 0x89, 0x8f}}, + "bumpeq": {Name: "bumpeq", CodePoints: []int{8783}, Characters: []byte{0xe2, 0x89, 0x8f}}, + "cacute": {Name: "cacute", CodePoints: []int{263}, Characters: []byte{0xc4, 0x87}}, + "cap": {Name: "cap", CodePoints: []int{8745}, Characters: []byte{0xe2, 0x88, 0xa9}}, + "capand": {Name: "capand", CodePoints: []int{10820}, Characters: []byte{0xe2, 0xa9, 0x84}}, + "capbrcup": {Name: "capbrcup", CodePoints: []int{10825}, Characters: []byte{0xe2, 0xa9, 0x89}}, + "capcap": {Name: "capcap", CodePoints: []int{10827}, Characters: []byte{0xe2, 0xa9, 0x8b}}, + "capcup": {Name: "capcup", CodePoints: []int{10823}, Characters: []byte{0xe2, 0xa9, 0x87}}, + "capdot": {Name: "capdot", CodePoints: []int{10816}, Characters: []byte{0xe2, 0xa9, 0x80}}, + "caps": {Name: "caps", CodePoints: []int{8745, 65024}, Characters: []byte{0xe2, 0x88, 0xa9, 0xef, 0xb8, 0x80}}, + "caret": {Name: "caret", CodePoints: []int{8257}, Characters: []byte{0xe2, 0x81, 0x81}}, + "caron": {Name: "caron", CodePoints: []int{711}, Characters: []byte{0xcb, 0x87}}, + "ccaps": {Name: "ccaps", CodePoints: []int{10829}, Characters: []byte{0xe2, 0xa9, 0x8d}}, + "ccaron": {Name: "ccaron", CodePoints: []int{269}, Characters: []byte{0xc4, 0x8d}}, + "ccedil": {Name: "ccedil", CodePoints: []int{231}, Characters: []byte{0xc3, 0xa7}}, + "ccirc": {Name: "ccirc", CodePoints: []int{265}, Characters: []byte{0xc4, 0x89}}, + "ccups": {Name: "ccups", CodePoints: []int{10828}, Characters: []byte{0xe2, 0xa9, 0x8c}}, + "ccupssm": {Name: "ccupssm", CodePoints: []int{10832}, Characters: []byte{0xe2, 0xa9, 0x90}}, + "cdot": {Name: "cdot", CodePoints: []int{267}, Characters: []byte{0xc4, 0x8b}}, + "cedil": {Name: "cedil", CodePoints: []int{184}, Characters: []byte{0xc2, 0xb8}}, + "cemptyv": {Name: "cemptyv", CodePoints: []int{10674}, Characters: []byte{0xe2, 0xa6, 0xb2}}, + "cent": {Name: "cent", CodePoints: []int{162}, Characters: []byte{0xc2, 0xa2}}, + "centerdot": {Name: "centerdot", CodePoints: []int{183}, Characters: []byte{0xc2, 0xb7}}, + "cfr": {Name: "cfr", CodePoints: []int{120096}, Characters: []byte{0xf0, 0x9d, 0x94, 0xa0}}, + "chcy": {Name: "chcy", CodePoints: []int{1095}, Characters: []byte{0xd1, 0x87}}, + "check": {Name: "check", CodePoints: []int{10003}, Characters: []byte{0xe2, 0x9c, 0x93}}, + "checkmark": {Name: "checkmark", CodePoints: []int{10003}, Characters: []byte{0xe2, 0x9c, 0x93}}, + "chi": {Name: "chi", CodePoints: []int{967}, Characters: []byte{0xcf, 0x87}}, + "cir": {Name: "cir", CodePoints: []int{9675}, Characters: []byte{0xe2, 0x97, 0x8b}}, + "cirE": {Name: "cirE", CodePoints: []int{10691}, Characters: []byte{0xe2, 0xa7, 0x83}}, + "circ": {Name: "circ", CodePoints: []int{710}, Characters: []byte{0xcb, 0x86}}, + "circeq": {Name: "circeq", CodePoints: []int{8791}, Characters: []byte{0xe2, 0x89, 0x97}}, + "circlearrowleft": {Name: "circlearrowleft", CodePoints: []int{8634}, Characters: []byte{0xe2, 0x86, 0xba}}, + "circlearrowright": {Name: "circlearrowright", CodePoints: []int{8635}, Characters: []byte{0xe2, 0x86, 0xbb}}, + "circledR": {Name: "circledR", CodePoints: []int{174}, Characters: []byte{0xc2, 0xae}}, + "circledS": {Name: "circledS", CodePoints: []int{9416}, Characters: []byte{0xe2, 0x93, 0x88}}, + "circledast": {Name: "circledast", CodePoints: []int{8859}, Characters: []byte{0xe2, 0x8a, 0x9b}}, + "circledcirc": {Name: "circledcirc", CodePoints: []int{8858}, Characters: []byte{0xe2, 0x8a, 0x9a}}, + "circleddash": {Name: "circleddash", CodePoints: []int{8861}, Characters: []byte{0xe2, 0x8a, 0x9d}}, + "cire": {Name: "cire", CodePoints: []int{8791}, Characters: []byte{0xe2, 0x89, 0x97}}, + "cirfnint": {Name: "cirfnint", CodePoints: []int{10768}, Characters: []byte{0xe2, 0xa8, 0x90}}, + "cirmid": {Name: "cirmid", CodePoints: []int{10991}, Characters: []byte{0xe2, 0xab, 0xaf}}, + "cirscir": {Name: "cirscir", CodePoints: []int{10690}, Characters: []byte{0xe2, 0xa7, 0x82}}, + "clubs": {Name: "clubs", CodePoints: []int{9827}, Characters: []byte{0xe2, 0x99, 0xa3}}, + "clubsuit": {Name: "clubsuit", CodePoints: []int{9827}, Characters: []byte{0xe2, 0x99, 0xa3}}, + "colon": {Name: "colon", CodePoints: []int{58}, Characters: []byte{0x3a}}, + "colone": {Name: "colone", CodePoints: []int{8788}, Characters: []byte{0xe2, 0x89, 0x94}}, + "coloneq": {Name: "coloneq", CodePoints: []int{8788}, Characters: []byte{0xe2, 0x89, 0x94}}, + "comma": {Name: "comma", CodePoints: []int{44}, Characters: []byte{0x2c}}, + "commat": {Name: "commat", CodePoints: []int{64}, Characters: []byte{0x40}}, + "comp": {Name: "comp", CodePoints: []int{8705}, Characters: []byte{0xe2, 0x88, 0x81}}, + "compfn": {Name: "compfn", CodePoints: []int{8728}, Characters: []byte{0xe2, 0x88, 0x98}}, + "complement": {Name: "complement", CodePoints: []int{8705}, Characters: []byte{0xe2, 0x88, 0x81}}, + "complexes": {Name: "complexes", CodePoints: []int{8450}, Characters: []byte{0xe2, 0x84, 0x82}}, + "cong": {Name: "cong", CodePoints: []int{8773}, Characters: []byte{0xe2, 0x89, 0x85}}, + "congdot": {Name: "congdot", CodePoints: []int{10861}, Characters: []byte{0xe2, 0xa9, 0xad}}, + "conint": {Name: "conint", CodePoints: []int{8750}, Characters: []byte{0xe2, 0x88, 0xae}}, + "copf": {Name: "copf", CodePoints: []int{120148}, Characters: []byte{0xf0, 0x9d, 0x95, 0x94}}, + "coprod": {Name: "coprod", CodePoints: []int{8720}, Characters: []byte{0xe2, 0x88, 0x90}}, + "copy": {Name: "copy", CodePoints: []int{169}, Characters: []byte{0xc2, 0xa9}}, + "copysr": {Name: "copysr", CodePoints: []int{8471}, Characters: []byte{0xe2, 0x84, 0x97}}, + "crarr": {Name: "crarr", CodePoints: []int{8629}, Characters: []byte{0xe2, 0x86, 0xb5}}, + "cross": {Name: "cross", CodePoints: []int{10007}, Characters: []byte{0xe2, 0x9c, 0x97}}, + "cscr": {Name: "cscr", CodePoints: []int{119992}, Characters: []byte{0xf0, 0x9d, 0x92, 0xb8}}, + "csub": {Name: "csub", CodePoints: []int{10959}, Characters: []byte{0xe2, 0xab, 0x8f}}, + "csube": {Name: "csube", CodePoints: []int{10961}, Characters: []byte{0xe2, 0xab, 0x91}}, + "csup": {Name: "csup", CodePoints: []int{10960}, Characters: []byte{0xe2, 0xab, 0x90}}, + "csupe": {Name: "csupe", CodePoints: []int{10962}, Characters: []byte{0xe2, 0xab, 0x92}}, + "ctdot": {Name: "ctdot", CodePoints: []int{8943}, Characters: []byte{0xe2, 0x8b, 0xaf}}, + "cudarrl": {Name: "cudarrl", CodePoints: []int{10552}, Characters: []byte{0xe2, 0xa4, 0xb8}}, + "cudarrr": {Name: "cudarrr", CodePoints: []int{10549}, Characters: []byte{0xe2, 0xa4, 0xb5}}, + "cuepr": {Name: "cuepr", CodePoints: []int{8926}, Characters: []byte{0xe2, 0x8b, 0x9e}}, + "cuesc": {Name: "cuesc", CodePoints: []int{8927}, Characters: []byte{0xe2, 0x8b, 0x9f}}, + "cularr": {Name: "cularr", CodePoints: []int{8630}, Characters: []byte{0xe2, 0x86, 0xb6}}, + "cularrp": {Name: "cularrp", CodePoints: []int{10557}, Characters: []byte{0xe2, 0xa4, 0xbd}}, + "cup": {Name: "cup", CodePoints: []int{8746}, Characters: []byte{0xe2, 0x88, 0xaa}}, + "cupbrcap": {Name: "cupbrcap", CodePoints: []int{10824}, Characters: []byte{0xe2, 0xa9, 0x88}}, + "cupcap": {Name: "cupcap", CodePoints: []int{10822}, Characters: []byte{0xe2, 0xa9, 0x86}}, + "cupcup": {Name: "cupcup", CodePoints: []int{10826}, Characters: []byte{0xe2, 0xa9, 0x8a}}, + "cupdot": {Name: "cupdot", CodePoints: []int{8845}, Characters: []byte{0xe2, 0x8a, 0x8d}}, + "cupor": {Name: "cupor", CodePoints: []int{10821}, Characters: []byte{0xe2, 0xa9, 0x85}}, + "cups": {Name: "cups", CodePoints: []int{8746, 65024}, Characters: []byte{0xe2, 0x88, 0xaa, 0xef, 0xb8, 0x80}}, + "curarr": {Name: "curarr", CodePoints: []int{8631}, Characters: []byte{0xe2, 0x86, 0xb7}}, + "curarrm": {Name: "curarrm", CodePoints: []int{10556}, Characters: []byte{0xe2, 0xa4, 0xbc}}, + "curlyeqprec": {Name: "curlyeqprec", CodePoints: []int{8926}, Characters: []byte{0xe2, 0x8b, 0x9e}}, + "curlyeqsucc": {Name: "curlyeqsucc", CodePoints: []int{8927}, Characters: []byte{0xe2, 0x8b, 0x9f}}, + "curlyvee": {Name: "curlyvee", CodePoints: []int{8910}, Characters: []byte{0xe2, 0x8b, 0x8e}}, + "curlywedge": {Name: "curlywedge", CodePoints: []int{8911}, Characters: []byte{0xe2, 0x8b, 0x8f}}, + "curren": {Name: "curren", CodePoints: []int{164}, Characters: []byte{0xc2, 0xa4}}, + "curvearrowleft": {Name: "curvearrowleft", CodePoints: []int{8630}, Characters: []byte{0xe2, 0x86, 0xb6}}, + "curvearrowright": {Name: "curvearrowright", CodePoints: []int{8631}, Characters: []byte{0xe2, 0x86, 0xb7}}, + "cuvee": {Name: "cuvee", CodePoints: []int{8910}, Characters: []byte{0xe2, 0x8b, 0x8e}}, + "cuwed": {Name: "cuwed", CodePoints: []int{8911}, Characters: []byte{0xe2, 0x8b, 0x8f}}, + "cwconint": {Name: "cwconint", CodePoints: []int{8754}, Characters: []byte{0xe2, 0x88, 0xb2}}, + "cwint": {Name: "cwint", CodePoints: []int{8753}, Characters: []byte{0xe2, 0x88, 0xb1}}, + "cylcty": {Name: "cylcty", CodePoints: []int{9005}, Characters: []byte{0xe2, 0x8c, 0xad}}, + "dArr": {Name: "dArr", CodePoints: []int{8659}, Characters: []byte{0xe2, 0x87, 0x93}}, + "dHar": {Name: "dHar", CodePoints: []int{10597}, Characters: []byte{0xe2, 0xa5, 0xa5}}, + "dagger": {Name: "dagger", CodePoints: []int{8224}, Characters: []byte{0xe2, 0x80, 0xa0}}, + "daleth": {Name: "daleth", CodePoints: []int{8504}, Characters: []byte{0xe2, 0x84, 0xb8}}, + "darr": {Name: "darr", CodePoints: []int{8595}, Characters: []byte{0xe2, 0x86, 0x93}}, + "dash": {Name: "dash", CodePoints: []int{8208}, Characters: []byte{0xe2, 0x80, 0x90}}, + "dashv": {Name: "dashv", CodePoints: []int{8867}, Characters: []byte{0xe2, 0x8a, 0xa3}}, + "dbkarow": {Name: "dbkarow", CodePoints: []int{10511}, Characters: []byte{0xe2, 0xa4, 0x8f}}, + "dblac": {Name: "dblac", CodePoints: []int{733}, Characters: []byte{0xcb, 0x9d}}, + "dcaron": {Name: "dcaron", CodePoints: []int{271}, Characters: []byte{0xc4, 0x8f}}, + "dcy": {Name: "dcy", CodePoints: []int{1076}, Characters: []byte{0xd0, 0xb4}}, + "dd": {Name: "dd", CodePoints: []int{8518}, Characters: []byte{0xe2, 0x85, 0x86}}, + "ddagger": {Name: "ddagger", CodePoints: []int{8225}, Characters: []byte{0xe2, 0x80, 0xa1}}, + "ddarr": {Name: "ddarr", CodePoints: []int{8650}, Characters: []byte{0xe2, 0x87, 0x8a}}, + "ddotseq": {Name: "ddotseq", CodePoints: []int{10871}, Characters: []byte{0xe2, 0xa9, 0xb7}}, + "deg": {Name: "deg", CodePoints: []int{176}, Characters: []byte{0xc2, 0xb0}}, + "delta": {Name: "delta", CodePoints: []int{948}, Characters: []byte{0xce, 0xb4}}, + "demptyv": {Name: "demptyv", CodePoints: []int{10673}, Characters: []byte{0xe2, 0xa6, 0xb1}}, + "dfisht": {Name: "dfisht", CodePoints: []int{10623}, Characters: []byte{0xe2, 0xa5, 0xbf}}, + "dfr": {Name: "dfr", CodePoints: []int{120097}, Characters: []byte{0xf0, 0x9d, 0x94, 0xa1}}, + "dharl": {Name: "dharl", CodePoints: []int{8643}, Characters: []byte{0xe2, 0x87, 0x83}}, + "dharr": {Name: "dharr", CodePoints: []int{8642}, Characters: []byte{0xe2, 0x87, 0x82}}, + "diam": {Name: "diam", CodePoints: []int{8900}, Characters: []byte{0xe2, 0x8b, 0x84}}, + "diamond": {Name: "diamond", CodePoints: []int{8900}, Characters: []byte{0xe2, 0x8b, 0x84}}, + "diamondsuit": {Name: "diamondsuit", CodePoints: []int{9830}, Characters: []byte{0xe2, 0x99, 0xa6}}, + "diams": {Name: "diams", CodePoints: []int{9830}, Characters: []byte{0xe2, 0x99, 0xa6}}, + "die": {Name: "die", CodePoints: []int{168}, Characters: []byte{0xc2, 0xa8}}, + "digamma": {Name: "digamma", CodePoints: []int{989}, Characters: []byte{0xcf, 0x9d}}, + "disin": {Name: "disin", CodePoints: []int{8946}, Characters: []byte{0xe2, 0x8b, 0xb2}}, + "div": {Name: "div", CodePoints: []int{247}, Characters: []byte{0xc3, 0xb7}}, + "divide": {Name: "divide", CodePoints: []int{247}, Characters: []byte{0xc3, 0xb7}}, + "divideontimes": {Name: "divideontimes", CodePoints: []int{8903}, Characters: []byte{0xe2, 0x8b, 0x87}}, + "divonx": {Name: "divonx", CodePoints: []int{8903}, Characters: []byte{0xe2, 0x8b, 0x87}}, + "djcy": {Name: "djcy", CodePoints: []int{1106}, Characters: []byte{0xd1, 0x92}}, + "dlcorn": {Name: "dlcorn", CodePoints: []int{8990}, Characters: []byte{0xe2, 0x8c, 0x9e}}, + "dlcrop": {Name: "dlcrop", CodePoints: []int{8973}, Characters: []byte{0xe2, 0x8c, 0x8d}}, + "dollar": {Name: "dollar", CodePoints: []int{36}, Characters: []byte{0x24}}, + "dopf": {Name: "dopf", CodePoints: []int{120149}, Characters: []byte{0xf0, 0x9d, 0x95, 0x95}}, + "dot": {Name: "dot", CodePoints: []int{729}, Characters: []byte{0xcb, 0x99}}, + "doteq": {Name: "doteq", CodePoints: []int{8784}, Characters: []byte{0xe2, 0x89, 0x90}}, + "doteqdot": {Name: "doteqdot", CodePoints: []int{8785}, Characters: []byte{0xe2, 0x89, 0x91}}, + "dotminus": {Name: "dotminus", CodePoints: []int{8760}, Characters: []byte{0xe2, 0x88, 0xb8}}, + "dotplus": {Name: "dotplus", CodePoints: []int{8724}, Characters: []byte{0xe2, 0x88, 0x94}}, + "dotsquare": {Name: "dotsquare", CodePoints: []int{8865}, Characters: []byte{0xe2, 0x8a, 0xa1}}, + "doublebarwedge": {Name: "doublebarwedge", CodePoints: []int{8966}, Characters: []byte{0xe2, 0x8c, 0x86}}, + "downarrow": {Name: "downarrow", CodePoints: []int{8595}, Characters: []byte{0xe2, 0x86, 0x93}}, + "downdownarrows": {Name: "downdownarrows", CodePoints: []int{8650}, Characters: []byte{0xe2, 0x87, 0x8a}}, + "downharpoonleft": {Name: "downharpoonleft", CodePoints: []int{8643}, Characters: []byte{0xe2, 0x87, 0x83}}, + "downharpoonright": {Name: "downharpoonright", CodePoints: []int{8642}, Characters: []byte{0xe2, 0x87, 0x82}}, + "drbkarow": {Name: "drbkarow", CodePoints: []int{10512}, Characters: []byte{0xe2, 0xa4, 0x90}}, + "drcorn": {Name: "drcorn", CodePoints: []int{8991}, Characters: []byte{0xe2, 0x8c, 0x9f}}, + "drcrop": {Name: "drcrop", CodePoints: []int{8972}, Characters: []byte{0xe2, 0x8c, 0x8c}}, + "dscr": {Name: "dscr", CodePoints: []int{119993}, Characters: []byte{0xf0, 0x9d, 0x92, 0xb9}}, + "dscy": {Name: "dscy", CodePoints: []int{1109}, Characters: []byte{0xd1, 0x95}}, + "dsol": {Name: "dsol", CodePoints: []int{10742}, Characters: []byte{0xe2, 0xa7, 0xb6}}, + "dstrok": {Name: "dstrok", CodePoints: []int{273}, Characters: []byte{0xc4, 0x91}}, + "dtdot": {Name: "dtdot", CodePoints: []int{8945}, Characters: []byte{0xe2, 0x8b, 0xb1}}, + "dtri": {Name: "dtri", CodePoints: []int{9663}, Characters: []byte{0xe2, 0x96, 0xbf}}, + "dtrif": {Name: "dtrif", CodePoints: []int{9662}, Characters: []byte{0xe2, 0x96, 0xbe}}, + "duarr": {Name: "duarr", CodePoints: []int{8693}, Characters: []byte{0xe2, 0x87, 0xb5}}, + "duhar": {Name: "duhar", CodePoints: []int{10607}, Characters: []byte{0xe2, 0xa5, 0xaf}}, + "dwangle": {Name: "dwangle", CodePoints: []int{10662}, Characters: []byte{0xe2, 0xa6, 0xa6}}, + "dzcy": {Name: "dzcy", CodePoints: []int{1119}, Characters: []byte{0xd1, 0x9f}}, + "dzigrarr": {Name: "dzigrarr", CodePoints: []int{10239}, Characters: []byte{0xe2, 0x9f, 0xbf}}, + "eDDot": {Name: "eDDot", CodePoints: []int{10871}, Characters: []byte{0xe2, 0xa9, 0xb7}}, + "eDot": {Name: "eDot", CodePoints: []int{8785}, Characters: []byte{0xe2, 0x89, 0x91}}, + "eacute": {Name: "eacute", CodePoints: []int{233}, Characters: []byte{0xc3, 0xa9}}, + "easter": {Name: "easter", CodePoints: []int{10862}, Characters: []byte{0xe2, 0xa9, 0xae}}, + "ecaron": {Name: "ecaron", CodePoints: []int{283}, Characters: []byte{0xc4, 0x9b}}, + "ecir": {Name: "ecir", CodePoints: []int{8790}, Characters: []byte{0xe2, 0x89, 0x96}}, + "ecirc": {Name: "ecirc", CodePoints: []int{234}, Characters: []byte{0xc3, 0xaa}}, + "ecolon": {Name: "ecolon", CodePoints: []int{8789}, Characters: []byte{0xe2, 0x89, 0x95}}, + "ecy": {Name: "ecy", CodePoints: []int{1101}, Characters: []byte{0xd1, 0x8d}}, + "edot": {Name: "edot", CodePoints: []int{279}, Characters: []byte{0xc4, 0x97}}, + "ee": {Name: "ee", CodePoints: []int{8519}, Characters: []byte{0xe2, 0x85, 0x87}}, + "efDot": {Name: "efDot", CodePoints: []int{8786}, Characters: []byte{0xe2, 0x89, 0x92}}, + "efr": {Name: "efr", CodePoints: []int{120098}, Characters: []byte{0xf0, 0x9d, 0x94, 0xa2}}, + "eg": {Name: "eg", CodePoints: []int{10906}, Characters: []byte{0xe2, 0xaa, 0x9a}}, + "egrave": {Name: "egrave", CodePoints: []int{232}, Characters: []byte{0xc3, 0xa8}}, + "egs": {Name: "egs", CodePoints: []int{10902}, Characters: []byte{0xe2, 0xaa, 0x96}}, + "egsdot": {Name: "egsdot", CodePoints: []int{10904}, Characters: []byte{0xe2, 0xaa, 0x98}}, + "el": {Name: "el", CodePoints: []int{10905}, Characters: []byte{0xe2, 0xaa, 0x99}}, + "elinters": {Name: "elinters", CodePoints: []int{9191}, Characters: []byte{0xe2, 0x8f, 0xa7}}, + "ell": {Name: "ell", CodePoints: []int{8467}, Characters: []byte{0xe2, 0x84, 0x93}}, + "els": {Name: "els", CodePoints: []int{10901}, Characters: []byte{0xe2, 0xaa, 0x95}}, + "elsdot": {Name: "elsdot", CodePoints: []int{10903}, Characters: []byte{0xe2, 0xaa, 0x97}}, + "emacr": {Name: "emacr", CodePoints: []int{275}, Characters: []byte{0xc4, 0x93}}, + "empty": {Name: "empty", CodePoints: []int{8709}, Characters: []byte{0xe2, 0x88, 0x85}}, + "emptyset": {Name: "emptyset", CodePoints: []int{8709}, Characters: []byte{0xe2, 0x88, 0x85}}, + "emptyv": {Name: "emptyv", CodePoints: []int{8709}, Characters: []byte{0xe2, 0x88, 0x85}}, + "emsp": {Name: "emsp", CodePoints: []int{8195}, Characters: []byte{0xe2, 0x80, 0x83}}, + "emsp13": {Name: "emsp13", CodePoints: []int{8196}, Characters: []byte{0xe2, 0x80, 0x84}}, + "emsp14": {Name: "emsp14", CodePoints: []int{8197}, Characters: []byte{0xe2, 0x80, 0x85}}, + "eng": {Name: "eng", CodePoints: []int{331}, Characters: []byte{0xc5, 0x8b}}, + "ensp": {Name: "ensp", CodePoints: []int{8194}, Characters: []byte{0xe2, 0x80, 0x82}}, + "eogon": {Name: "eogon", CodePoints: []int{281}, Characters: []byte{0xc4, 0x99}}, + "eopf": {Name: "eopf", CodePoints: []int{120150}, Characters: []byte{0xf0, 0x9d, 0x95, 0x96}}, + "epar": {Name: "epar", CodePoints: []int{8917}, Characters: []byte{0xe2, 0x8b, 0x95}}, + "eparsl": {Name: "eparsl", CodePoints: []int{10723}, Characters: []byte{0xe2, 0xa7, 0xa3}}, + "eplus": {Name: "eplus", CodePoints: []int{10865}, Characters: []byte{0xe2, 0xa9, 0xb1}}, + "epsi": {Name: "epsi", CodePoints: []int{949}, Characters: []byte{0xce, 0xb5}}, + "epsilon": {Name: "epsilon", CodePoints: []int{949}, Characters: []byte{0xce, 0xb5}}, + "epsiv": {Name: "epsiv", CodePoints: []int{1013}, Characters: []byte{0xcf, 0xb5}}, + "eqcirc": {Name: "eqcirc", CodePoints: []int{8790}, Characters: []byte{0xe2, 0x89, 0x96}}, + "eqcolon": {Name: "eqcolon", CodePoints: []int{8789}, Characters: []byte{0xe2, 0x89, 0x95}}, + "eqsim": {Name: "eqsim", CodePoints: []int{8770}, Characters: []byte{0xe2, 0x89, 0x82}}, + "eqslantgtr": {Name: "eqslantgtr", CodePoints: []int{10902}, Characters: []byte{0xe2, 0xaa, 0x96}}, + "eqslantless": {Name: "eqslantless", CodePoints: []int{10901}, Characters: []byte{0xe2, 0xaa, 0x95}}, + "equals": {Name: "equals", CodePoints: []int{61}, Characters: []byte{0x3d}}, + "equest": {Name: "equest", CodePoints: []int{8799}, Characters: []byte{0xe2, 0x89, 0x9f}}, + "equiv": {Name: "equiv", CodePoints: []int{8801}, Characters: []byte{0xe2, 0x89, 0xa1}}, + "equivDD": {Name: "equivDD", CodePoints: []int{10872}, Characters: []byte{0xe2, 0xa9, 0xb8}}, + "eqvparsl": {Name: "eqvparsl", CodePoints: []int{10725}, Characters: []byte{0xe2, 0xa7, 0xa5}}, + "erDot": {Name: "erDot", CodePoints: []int{8787}, Characters: []byte{0xe2, 0x89, 0x93}}, + "erarr": {Name: "erarr", CodePoints: []int{10609}, Characters: []byte{0xe2, 0xa5, 0xb1}}, + "escr": {Name: "escr", CodePoints: []int{8495}, Characters: []byte{0xe2, 0x84, 0xaf}}, + "esdot": {Name: "esdot", CodePoints: []int{8784}, Characters: []byte{0xe2, 0x89, 0x90}}, + "esim": {Name: "esim", CodePoints: []int{8770}, Characters: []byte{0xe2, 0x89, 0x82}}, + "eta": {Name: "eta", CodePoints: []int{951}, Characters: []byte{0xce, 0xb7}}, + "eth": {Name: "eth", CodePoints: []int{240}, Characters: []byte{0xc3, 0xb0}}, + "euml": {Name: "euml", CodePoints: []int{235}, Characters: []byte{0xc3, 0xab}}, + "euro": {Name: "euro", CodePoints: []int{8364}, Characters: []byte{0xe2, 0x82, 0xac}}, + "excl": {Name: "excl", CodePoints: []int{33}, Characters: []byte{0x21}}, + "exist": {Name: "exist", CodePoints: []int{8707}, Characters: []byte{0xe2, 0x88, 0x83}}, + "expectation": {Name: "expectation", CodePoints: []int{8496}, Characters: []byte{0xe2, 0x84, 0xb0}}, + "exponentiale": {Name: "exponentiale", CodePoints: []int{8519}, Characters: []byte{0xe2, 0x85, 0x87}}, + "fallingdotseq": {Name: "fallingdotseq", CodePoints: []int{8786}, Characters: []byte{0xe2, 0x89, 0x92}}, + "fcy": {Name: "fcy", CodePoints: []int{1092}, Characters: []byte{0xd1, 0x84}}, + "female": {Name: "female", CodePoints: []int{9792}, Characters: []byte{0xe2, 0x99, 0x80}}, + "ffilig": {Name: "ffilig", CodePoints: []int{64259}, Characters: []byte{0xef, 0xac, 0x83}}, + "fflig": {Name: "fflig", CodePoints: []int{64256}, Characters: []byte{0xef, 0xac, 0x80}}, + "ffllig": {Name: "ffllig", CodePoints: []int{64260}, Characters: []byte{0xef, 0xac, 0x84}}, + "ffr": {Name: "ffr", CodePoints: []int{120099}, Characters: []byte{0xf0, 0x9d, 0x94, 0xa3}}, + "filig": {Name: "filig", CodePoints: []int{64257}, Characters: []byte{0xef, 0xac, 0x81}}, + "fjlig": {Name: "fjlig", CodePoints: []int{102, 106}, Characters: []byte{0x66, 0x6a}}, + "flat": {Name: "flat", CodePoints: []int{9837}, Characters: []byte{0xe2, 0x99, 0xad}}, + "fllig": {Name: "fllig", CodePoints: []int{64258}, Characters: []byte{0xef, 0xac, 0x82}}, + "fltns": {Name: "fltns", CodePoints: []int{9649}, Characters: []byte{0xe2, 0x96, 0xb1}}, + "fnof": {Name: "fnof", CodePoints: []int{402}, Characters: []byte{0xc6, 0x92}}, + "fopf": {Name: "fopf", CodePoints: []int{120151}, Characters: []byte{0xf0, 0x9d, 0x95, 0x97}}, + "forall": {Name: "forall", CodePoints: []int{8704}, Characters: []byte{0xe2, 0x88, 0x80}}, + "fork": {Name: "fork", CodePoints: []int{8916}, Characters: []byte{0xe2, 0x8b, 0x94}}, + "forkv": {Name: "forkv", CodePoints: []int{10969}, Characters: []byte{0xe2, 0xab, 0x99}}, + "fpartint": {Name: "fpartint", CodePoints: []int{10765}, Characters: []byte{0xe2, 0xa8, 0x8d}}, + "frac12": {Name: "frac12", CodePoints: []int{189}, Characters: []byte{0xc2, 0xbd}}, + "frac13": {Name: "frac13", CodePoints: []int{8531}, Characters: []byte{0xe2, 0x85, 0x93}}, + "frac14": {Name: "frac14", CodePoints: []int{188}, Characters: []byte{0xc2, 0xbc}}, + "frac15": {Name: "frac15", CodePoints: []int{8533}, Characters: []byte{0xe2, 0x85, 0x95}}, + "frac16": {Name: "frac16", CodePoints: []int{8537}, Characters: []byte{0xe2, 0x85, 0x99}}, + "frac18": {Name: "frac18", CodePoints: []int{8539}, Characters: []byte{0xe2, 0x85, 0x9b}}, + "frac23": {Name: "frac23", CodePoints: []int{8532}, Characters: []byte{0xe2, 0x85, 0x94}}, + "frac25": {Name: "frac25", CodePoints: []int{8534}, Characters: []byte{0xe2, 0x85, 0x96}}, + "frac34": {Name: "frac34", CodePoints: []int{190}, Characters: []byte{0xc2, 0xbe}}, + "frac35": {Name: "frac35", CodePoints: []int{8535}, Characters: []byte{0xe2, 0x85, 0x97}}, + "frac38": {Name: "frac38", CodePoints: []int{8540}, Characters: []byte{0xe2, 0x85, 0x9c}}, + "frac45": {Name: "frac45", CodePoints: []int{8536}, Characters: []byte{0xe2, 0x85, 0x98}}, + "frac56": {Name: "frac56", CodePoints: []int{8538}, Characters: []byte{0xe2, 0x85, 0x9a}}, + "frac58": {Name: "frac58", CodePoints: []int{8541}, Characters: []byte{0xe2, 0x85, 0x9d}}, + "frac78": {Name: "frac78", CodePoints: []int{8542}, Characters: []byte{0xe2, 0x85, 0x9e}}, + "frasl": {Name: "frasl", CodePoints: []int{8260}, Characters: []byte{0xe2, 0x81, 0x84}}, + "frown": {Name: "frown", CodePoints: []int{8994}, Characters: []byte{0xe2, 0x8c, 0xa2}}, + "fscr": {Name: "fscr", CodePoints: []int{119995}, Characters: []byte{0xf0, 0x9d, 0x92, 0xbb}}, + "gE": {Name: "gE", CodePoints: []int{8807}, Characters: []byte{0xe2, 0x89, 0xa7}}, + "gEl": {Name: "gEl", CodePoints: []int{10892}, Characters: []byte{0xe2, 0xaa, 0x8c}}, + "gacute": {Name: "gacute", CodePoints: []int{501}, Characters: []byte{0xc7, 0xb5}}, + "gamma": {Name: "gamma", CodePoints: []int{947}, Characters: []byte{0xce, 0xb3}}, + "gammad": {Name: "gammad", CodePoints: []int{989}, Characters: []byte{0xcf, 0x9d}}, + "gap": {Name: "gap", CodePoints: []int{10886}, Characters: []byte{0xe2, 0xaa, 0x86}}, + "gbreve": {Name: "gbreve", CodePoints: []int{287}, Characters: []byte{0xc4, 0x9f}}, + "gcirc": {Name: "gcirc", CodePoints: []int{285}, Characters: []byte{0xc4, 0x9d}}, + "gcy": {Name: "gcy", CodePoints: []int{1075}, Characters: []byte{0xd0, 0xb3}}, + "gdot": {Name: "gdot", CodePoints: []int{289}, Characters: []byte{0xc4, 0xa1}}, + "ge": {Name: "ge", CodePoints: []int{8805}, Characters: []byte{0xe2, 0x89, 0xa5}}, + "gel": {Name: "gel", CodePoints: []int{8923}, Characters: []byte{0xe2, 0x8b, 0x9b}}, + "geq": {Name: "geq", CodePoints: []int{8805}, Characters: []byte{0xe2, 0x89, 0xa5}}, + "geqq": {Name: "geqq", CodePoints: []int{8807}, Characters: []byte{0xe2, 0x89, 0xa7}}, + "geqslant": {Name: "geqslant", CodePoints: []int{10878}, Characters: []byte{0xe2, 0xa9, 0xbe}}, + "ges": {Name: "ges", CodePoints: []int{10878}, Characters: []byte{0xe2, 0xa9, 0xbe}}, + "gescc": {Name: "gescc", CodePoints: []int{10921}, Characters: []byte{0xe2, 0xaa, 0xa9}}, + "gesdot": {Name: "gesdot", CodePoints: []int{10880}, Characters: []byte{0xe2, 0xaa, 0x80}}, + "gesdoto": {Name: "gesdoto", CodePoints: []int{10882}, Characters: []byte{0xe2, 0xaa, 0x82}}, + "gesdotol": {Name: "gesdotol", CodePoints: []int{10884}, Characters: []byte{0xe2, 0xaa, 0x84}}, + "gesl": {Name: "gesl", CodePoints: []int{8923, 65024}, Characters: []byte{0xe2, 0x8b, 0x9b, 0xef, 0xb8, 0x80}}, + "gesles": {Name: "gesles", CodePoints: []int{10900}, Characters: []byte{0xe2, 0xaa, 0x94}}, + "gfr": {Name: "gfr", CodePoints: []int{120100}, Characters: []byte{0xf0, 0x9d, 0x94, 0xa4}}, + "gg": {Name: "gg", CodePoints: []int{8811}, Characters: []byte{0xe2, 0x89, 0xab}}, + "ggg": {Name: "ggg", CodePoints: []int{8921}, Characters: []byte{0xe2, 0x8b, 0x99}}, + "gimel": {Name: "gimel", CodePoints: []int{8503}, Characters: []byte{0xe2, 0x84, 0xb7}}, + "gjcy": {Name: "gjcy", CodePoints: []int{1107}, Characters: []byte{0xd1, 0x93}}, + "gl": {Name: "gl", CodePoints: []int{8823}, Characters: []byte{0xe2, 0x89, 0xb7}}, + "glE": {Name: "glE", CodePoints: []int{10898}, Characters: []byte{0xe2, 0xaa, 0x92}}, + "gla": {Name: "gla", CodePoints: []int{10917}, Characters: []byte{0xe2, 0xaa, 0xa5}}, + "glj": {Name: "glj", CodePoints: []int{10916}, Characters: []byte{0xe2, 0xaa, 0xa4}}, + "gnE": {Name: "gnE", CodePoints: []int{8809}, Characters: []byte{0xe2, 0x89, 0xa9}}, + "gnap": {Name: "gnap", CodePoints: []int{10890}, Characters: []byte{0xe2, 0xaa, 0x8a}}, + "gnapprox": {Name: "gnapprox", CodePoints: []int{10890}, Characters: []byte{0xe2, 0xaa, 0x8a}}, + "gne": {Name: "gne", CodePoints: []int{10888}, Characters: []byte{0xe2, 0xaa, 0x88}}, + "gneq": {Name: "gneq", CodePoints: []int{10888}, Characters: []byte{0xe2, 0xaa, 0x88}}, + "gneqq": {Name: "gneqq", CodePoints: []int{8809}, Characters: []byte{0xe2, 0x89, 0xa9}}, + "gnsim": {Name: "gnsim", CodePoints: []int{8935}, Characters: []byte{0xe2, 0x8b, 0xa7}}, + "gopf": {Name: "gopf", CodePoints: []int{120152}, Characters: []byte{0xf0, 0x9d, 0x95, 0x98}}, + "grave": {Name: "grave", CodePoints: []int{96}, Characters: []byte{0x60}}, + "gscr": {Name: "gscr", CodePoints: []int{8458}, Characters: []byte{0xe2, 0x84, 0x8a}}, + "gsim": {Name: "gsim", CodePoints: []int{8819}, Characters: []byte{0xe2, 0x89, 0xb3}}, + "gsime": {Name: "gsime", CodePoints: []int{10894}, Characters: []byte{0xe2, 0xaa, 0x8e}}, + "gsiml": {Name: "gsiml", CodePoints: []int{10896}, Characters: []byte{0xe2, 0xaa, 0x90}}, + "gt": {Name: "gt", CodePoints: []int{62}, Characters: []byte{0x3e}}, + "gtcc": {Name: "gtcc", CodePoints: []int{10919}, Characters: []byte{0xe2, 0xaa, 0xa7}}, + "gtcir": {Name: "gtcir", CodePoints: []int{10874}, Characters: []byte{0xe2, 0xa9, 0xba}}, + "gtdot": {Name: "gtdot", CodePoints: []int{8919}, Characters: []byte{0xe2, 0x8b, 0x97}}, + "gtlPar": {Name: "gtlPar", CodePoints: []int{10645}, Characters: []byte{0xe2, 0xa6, 0x95}}, + "gtquest": {Name: "gtquest", CodePoints: []int{10876}, Characters: []byte{0xe2, 0xa9, 0xbc}}, + "gtrapprox": {Name: "gtrapprox", CodePoints: []int{10886}, Characters: []byte{0xe2, 0xaa, 0x86}}, + "gtrarr": {Name: "gtrarr", CodePoints: []int{10616}, Characters: []byte{0xe2, 0xa5, 0xb8}}, + "gtrdot": {Name: "gtrdot", CodePoints: []int{8919}, Characters: []byte{0xe2, 0x8b, 0x97}}, + "gtreqless": {Name: "gtreqless", CodePoints: []int{8923}, Characters: []byte{0xe2, 0x8b, 0x9b}}, + "gtreqqless": {Name: "gtreqqless", CodePoints: []int{10892}, Characters: []byte{0xe2, 0xaa, 0x8c}}, + "gtrless": {Name: "gtrless", CodePoints: []int{8823}, Characters: []byte{0xe2, 0x89, 0xb7}}, + "gtrsim": {Name: "gtrsim", CodePoints: []int{8819}, Characters: []byte{0xe2, 0x89, 0xb3}}, + "gvertneqq": {Name: "gvertneqq", CodePoints: []int{8809, 65024}, Characters: []byte{0xe2, 0x89, 0xa9, 0xef, 0xb8, 0x80}}, + "gvnE": {Name: "gvnE", CodePoints: []int{8809, 65024}, Characters: []byte{0xe2, 0x89, 0xa9, 0xef, 0xb8, 0x80}}, + "hArr": {Name: "hArr", CodePoints: []int{8660}, Characters: []byte{0xe2, 0x87, 0x94}}, + "hairsp": {Name: "hairsp", CodePoints: []int{8202}, Characters: []byte{0xe2, 0x80, 0x8a}}, + "half": {Name: "half", CodePoints: []int{189}, Characters: []byte{0xc2, 0xbd}}, + "hamilt": {Name: "hamilt", CodePoints: []int{8459}, Characters: []byte{0xe2, 0x84, 0x8b}}, + "hardcy": {Name: "hardcy", CodePoints: []int{1098}, Characters: []byte{0xd1, 0x8a}}, + "harr": {Name: "harr", CodePoints: []int{8596}, Characters: []byte{0xe2, 0x86, 0x94}}, + "harrcir": {Name: "harrcir", CodePoints: []int{10568}, Characters: []byte{0xe2, 0xa5, 0x88}}, + "harrw": {Name: "harrw", CodePoints: []int{8621}, Characters: []byte{0xe2, 0x86, 0xad}}, + "hbar": {Name: "hbar", CodePoints: []int{8463}, Characters: []byte{0xe2, 0x84, 0x8f}}, + "hcirc": {Name: "hcirc", CodePoints: []int{293}, Characters: []byte{0xc4, 0xa5}}, + "hearts": {Name: "hearts", CodePoints: []int{9829}, Characters: []byte{0xe2, 0x99, 0xa5}}, + "heartsuit": {Name: "heartsuit", CodePoints: []int{9829}, Characters: []byte{0xe2, 0x99, 0xa5}}, + "hellip": {Name: "hellip", CodePoints: []int{8230}, Characters: []byte{0xe2, 0x80, 0xa6}}, + "hercon": {Name: "hercon", CodePoints: []int{8889}, Characters: []byte{0xe2, 0x8a, 0xb9}}, + "hfr": {Name: "hfr", CodePoints: []int{120101}, Characters: []byte{0xf0, 0x9d, 0x94, 0xa5}}, + "hksearow": {Name: "hksearow", CodePoints: []int{10533}, Characters: []byte{0xe2, 0xa4, 0xa5}}, + "hkswarow": {Name: "hkswarow", CodePoints: []int{10534}, Characters: []byte{0xe2, 0xa4, 0xa6}}, + "hoarr": {Name: "hoarr", CodePoints: []int{8703}, Characters: []byte{0xe2, 0x87, 0xbf}}, + "homtht": {Name: "homtht", CodePoints: []int{8763}, Characters: []byte{0xe2, 0x88, 0xbb}}, + "hookleftarrow": {Name: "hookleftarrow", CodePoints: []int{8617}, Characters: []byte{0xe2, 0x86, 0xa9}}, + "hookrightarrow": {Name: "hookrightarrow", CodePoints: []int{8618}, Characters: []byte{0xe2, 0x86, 0xaa}}, + "hopf": {Name: "hopf", CodePoints: []int{120153}, Characters: []byte{0xf0, 0x9d, 0x95, 0x99}}, + "horbar": {Name: "horbar", CodePoints: []int{8213}, Characters: []byte{0xe2, 0x80, 0x95}}, + "hscr": {Name: "hscr", CodePoints: []int{119997}, Characters: []byte{0xf0, 0x9d, 0x92, 0xbd}}, + "hslash": {Name: "hslash", CodePoints: []int{8463}, Characters: []byte{0xe2, 0x84, 0x8f}}, + "hstrok": {Name: "hstrok", CodePoints: []int{295}, Characters: []byte{0xc4, 0xa7}}, + "hybull": {Name: "hybull", CodePoints: []int{8259}, Characters: []byte{0xe2, 0x81, 0x83}}, + "hyphen": {Name: "hyphen", CodePoints: []int{8208}, Characters: []byte{0xe2, 0x80, 0x90}}, + "iacute": {Name: "iacute", CodePoints: []int{237}, Characters: []byte{0xc3, 0xad}}, + "ic": {Name: "ic", CodePoints: []int{8291}, Characters: []byte{0xe2, 0x81, 0xa3}}, + "icirc": {Name: "icirc", CodePoints: []int{238}, Characters: []byte{0xc3, 0xae}}, + "icy": {Name: "icy", CodePoints: []int{1080}, Characters: []byte{0xd0, 0xb8}}, + "iecy": {Name: "iecy", CodePoints: []int{1077}, Characters: []byte{0xd0, 0xb5}}, + "iexcl": {Name: "iexcl", CodePoints: []int{161}, Characters: []byte{0xc2, 0xa1}}, + "iff": {Name: "iff", CodePoints: []int{8660}, Characters: []byte{0xe2, 0x87, 0x94}}, + "ifr": {Name: "ifr", CodePoints: []int{120102}, Characters: []byte{0xf0, 0x9d, 0x94, 0xa6}}, + "igrave": {Name: "igrave", CodePoints: []int{236}, Characters: []byte{0xc3, 0xac}}, + "ii": {Name: "ii", CodePoints: []int{8520}, Characters: []byte{0xe2, 0x85, 0x88}}, + "iiiint": {Name: "iiiint", CodePoints: []int{10764}, Characters: []byte{0xe2, 0xa8, 0x8c}}, + "iiint": {Name: "iiint", CodePoints: []int{8749}, Characters: []byte{0xe2, 0x88, 0xad}}, + "iinfin": {Name: "iinfin", CodePoints: []int{10716}, Characters: []byte{0xe2, 0xa7, 0x9c}}, + "iiota": {Name: "iiota", CodePoints: []int{8489}, Characters: []byte{0xe2, 0x84, 0xa9}}, + "ijlig": {Name: "ijlig", CodePoints: []int{307}, Characters: []byte{0xc4, 0xb3}}, + "imacr": {Name: "imacr", CodePoints: []int{299}, Characters: []byte{0xc4, 0xab}}, + "image": {Name: "image", CodePoints: []int{8465}, Characters: []byte{0xe2, 0x84, 0x91}}, + "imagline": {Name: "imagline", CodePoints: []int{8464}, Characters: []byte{0xe2, 0x84, 0x90}}, + "imagpart": {Name: "imagpart", CodePoints: []int{8465}, Characters: []byte{0xe2, 0x84, 0x91}}, + "imath": {Name: "imath", CodePoints: []int{305}, Characters: []byte{0xc4, 0xb1}}, + "imof": {Name: "imof", CodePoints: []int{8887}, Characters: []byte{0xe2, 0x8a, 0xb7}}, + "imped": {Name: "imped", CodePoints: []int{437}, Characters: []byte{0xc6, 0xb5}}, + "in": {Name: "in", CodePoints: []int{8712}, Characters: []byte{0xe2, 0x88, 0x88}}, + "incare": {Name: "incare", CodePoints: []int{8453}, Characters: []byte{0xe2, 0x84, 0x85}}, + "infin": {Name: "infin", CodePoints: []int{8734}, Characters: []byte{0xe2, 0x88, 0x9e}}, + "infintie": {Name: "infintie", CodePoints: []int{10717}, Characters: []byte{0xe2, 0xa7, 0x9d}}, + "inodot": {Name: "inodot", CodePoints: []int{305}, Characters: []byte{0xc4, 0xb1}}, + "int": {Name: "int", CodePoints: []int{8747}, Characters: []byte{0xe2, 0x88, 0xab}}, + "intcal": {Name: "intcal", CodePoints: []int{8890}, Characters: []byte{0xe2, 0x8a, 0xba}}, + "integers": {Name: "integers", CodePoints: []int{8484}, Characters: []byte{0xe2, 0x84, 0xa4}}, + "intercal": {Name: "intercal", CodePoints: []int{8890}, Characters: []byte{0xe2, 0x8a, 0xba}}, + "intlarhk": {Name: "intlarhk", CodePoints: []int{10775}, Characters: []byte{0xe2, 0xa8, 0x97}}, + "intprod": {Name: "intprod", CodePoints: []int{10812}, Characters: []byte{0xe2, 0xa8, 0xbc}}, + "iocy": {Name: "iocy", CodePoints: []int{1105}, Characters: []byte{0xd1, 0x91}}, + "iogon": {Name: "iogon", CodePoints: []int{303}, Characters: []byte{0xc4, 0xaf}}, + "iopf": {Name: "iopf", CodePoints: []int{120154}, Characters: []byte{0xf0, 0x9d, 0x95, 0x9a}}, + "iota": {Name: "iota", CodePoints: []int{953}, Characters: []byte{0xce, 0xb9}}, + "iprod": {Name: "iprod", CodePoints: []int{10812}, Characters: []byte{0xe2, 0xa8, 0xbc}}, + "iquest": {Name: "iquest", CodePoints: []int{191}, Characters: []byte{0xc2, 0xbf}}, + "iscr": {Name: "iscr", CodePoints: []int{119998}, Characters: []byte{0xf0, 0x9d, 0x92, 0xbe}}, + "isin": {Name: "isin", CodePoints: []int{8712}, Characters: []byte{0xe2, 0x88, 0x88}}, + "isinE": {Name: "isinE", CodePoints: []int{8953}, Characters: []byte{0xe2, 0x8b, 0xb9}}, + "isindot": {Name: "isindot", CodePoints: []int{8949}, Characters: []byte{0xe2, 0x8b, 0xb5}}, + "isins": {Name: "isins", CodePoints: []int{8948}, Characters: []byte{0xe2, 0x8b, 0xb4}}, + "isinsv": {Name: "isinsv", CodePoints: []int{8947}, Characters: []byte{0xe2, 0x8b, 0xb3}}, + "isinv": {Name: "isinv", CodePoints: []int{8712}, Characters: []byte{0xe2, 0x88, 0x88}}, + "it": {Name: "it", CodePoints: []int{8290}, Characters: []byte{0xe2, 0x81, 0xa2}}, + "itilde": {Name: "itilde", CodePoints: []int{297}, Characters: []byte{0xc4, 0xa9}}, + "iukcy": {Name: "iukcy", CodePoints: []int{1110}, Characters: []byte{0xd1, 0x96}}, + "iuml": {Name: "iuml", CodePoints: []int{239}, Characters: []byte{0xc3, 0xaf}}, + "jcirc": {Name: "jcirc", CodePoints: []int{309}, Characters: []byte{0xc4, 0xb5}}, + "jcy": {Name: "jcy", CodePoints: []int{1081}, Characters: []byte{0xd0, 0xb9}}, + "jfr": {Name: "jfr", CodePoints: []int{120103}, Characters: []byte{0xf0, 0x9d, 0x94, 0xa7}}, + "jmath": {Name: "jmath", CodePoints: []int{567}, Characters: []byte{0xc8, 0xb7}}, + "jopf": {Name: "jopf", CodePoints: []int{120155}, Characters: []byte{0xf0, 0x9d, 0x95, 0x9b}}, + "jscr": {Name: "jscr", CodePoints: []int{119999}, Characters: []byte{0xf0, 0x9d, 0x92, 0xbf}}, + "jsercy": {Name: "jsercy", CodePoints: []int{1112}, Characters: []byte{0xd1, 0x98}}, + "jukcy": {Name: "jukcy", CodePoints: []int{1108}, Characters: []byte{0xd1, 0x94}}, + "kappa": {Name: "kappa", CodePoints: []int{954}, Characters: []byte{0xce, 0xba}}, + "kappav": {Name: "kappav", CodePoints: []int{1008}, Characters: []byte{0xcf, 0xb0}}, + "kcedil": {Name: "kcedil", CodePoints: []int{311}, Characters: []byte{0xc4, 0xb7}}, + "kcy": {Name: "kcy", CodePoints: []int{1082}, Characters: []byte{0xd0, 0xba}}, + "kfr": {Name: "kfr", CodePoints: []int{120104}, Characters: []byte{0xf0, 0x9d, 0x94, 0xa8}}, + "kgreen": {Name: "kgreen", CodePoints: []int{312}, Characters: []byte{0xc4, 0xb8}}, + "khcy": {Name: "khcy", CodePoints: []int{1093}, Characters: []byte{0xd1, 0x85}}, + "kjcy": {Name: "kjcy", CodePoints: []int{1116}, Characters: []byte{0xd1, 0x9c}}, + "kopf": {Name: "kopf", CodePoints: []int{120156}, Characters: []byte{0xf0, 0x9d, 0x95, 0x9c}}, + "kscr": {Name: "kscr", CodePoints: []int{120000}, Characters: []byte{0xf0, 0x9d, 0x93, 0x80}}, + "lAarr": {Name: "lAarr", CodePoints: []int{8666}, Characters: []byte{0xe2, 0x87, 0x9a}}, + "lArr": {Name: "lArr", CodePoints: []int{8656}, Characters: []byte{0xe2, 0x87, 0x90}}, + "lAtail": {Name: "lAtail", CodePoints: []int{10523}, Characters: []byte{0xe2, 0xa4, 0x9b}}, + "lBarr": {Name: "lBarr", CodePoints: []int{10510}, Characters: []byte{0xe2, 0xa4, 0x8e}}, + "lE": {Name: "lE", CodePoints: []int{8806}, Characters: []byte{0xe2, 0x89, 0xa6}}, + "lEg": {Name: "lEg", CodePoints: []int{10891}, Characters: []byte{0xe2, 0xaa, 0x8b}}, + "lHar": {Name: "lHar", CodePoints: []int{10594}, Characters: []byte{0xe2, 0xa5, 0xa2}}, + "lacute": {Name: "lacute", CodePoints: []int{314}, Characters: []byte{0xc4, 0xba}}, + "laemptyv": {Name: "laemptyv", CodePoints: []int{10676}, Characters: []byte{0xe2, 0xa6, 0xb4}}, + "lagran": {Name: "lagran", CodePoints: []int{8466}, Characters: []byte{0xe2, 0x84, 0x92}}, + "lambda": {Name: "lambda", CodePoints: []int{955}, Characters: []byte{0xce, 0xbb}}, + "lang": {Name: "lang", CodePoints: []int{10216}, Characters: []byte{0xe2, 0x9f, 0xa8}}, + "langd": {Name: "langd", CodePoints: []int{10641}, Characters: []byte{0xe2, 0xa6, 0x91}}, + "langle": {Name: "langle", CodePoints: []int{10216}, Characters: []byte{0xe2, 0x9f, 0xa8}}, + "lap": {Name: "lap", CodePoints: []int{10885}, Characters: []byte{0xe2, 0xaa, 0x85}}, + "laquo": {Name: "laquo", CodePoints: []int{171}, Characters: []byte{0xc2, 0xab}}, + "larr": {Name: "larr", CodePoints: []int{8592}, Characters: []byte{0xe2, 0x86, 0x90}}, + "larrb": {Name: "larrb", CodePoints: []int{8676}, Characters: []byte{0xe2, 0x87, 0xa4}}, + "larrbfs": {Name: "larrbfs", CodePoints: []int{10527}, Characters: []byte{0xe2, 0xa4, 0x9f}}, + "larrfs": {Name: "larrfs", CodePoints: []int{10525}, Characters: []byte{0xe2, 0xa4, 0x9d}}, + "larrhk": {Name: "larrhk", CodePoints: []int{8617}, Characters: []byte{0xe2, 0x86, 0xa9}}, + "larrlp": {Name: "larrlp", CodePoints: []int{8619}, Characters: []byte{0xe2, 0x86, 0xab}}, + "larrpl": {Name: "larrpl", CodePoints: []int{10553}, Characters: []byte{0xe2, 0xa4, 0xb9}}, + "larrsim": {Name: "larrsim", CodePoints: []int{10611}, Characters: []byte{0xe2, 0xa5, 0xb3}}, + "larrtl": {Name: "larrtl", CodePoints: []int{8610}, Characters: []byte{0xe2, 0x86, 0xa2}}, + "lat": {Name: "lat", CodePoints: []int{10923}, Characters: []byte{0xe2, 0xaa, 0xab}}, + "latail": {Name: "latail", CodePoints: []int{10521}, Characters: []byte{0xe2, 0xa4, 0x99}}, + "late": {Name: "late", CodePoints: []int{10925}, Characters: []byte{0xe2, 0xaa, 0xad}}, + "lates": {Name: "lates", CodePoints: []int{10925, 65024}, Characters: []byte{0xe2, 0xaa, 0xad, 0xef, 0xb8, 0x80}}, + "lbarr": {Name: "lbarr", CodePoints: []int{10508}, Characters: []byte{0xe2, 0xa4, 0x8c}}, + "lbbrk": {Name: "lbbrk", CodePoints: []int{10098}, Characters: []byte{0xe2, 0x9d, 0xb2}}, + "lbrace": {Name: "lbrace", CodePoints: []int{123}, Characters: []byte{0x7b}}, + "lbrack": {Name: "lbrack", CodePoints: []int{91}, Characters: []byte{0x5b}}, + "lbrke": {Name: "lbrke", CodePoints: []int{10635}, Characters: []byte{0xe2, 0xa6, 0x8b}}, + "lbrksld": {Name: "lbrksld", CodePoints: []int{10639}, Characters: []byte{0xe2, 0xa6, 0x8f}}, + "lbrkslu": {Name: "lbrkslu", CodePoints: []int{10637}, Characters: []byte{0xe2, 0xa6, 0x8d}}, + "lcaron": {Name: "lcaron", CodePoints: []int{318}, Characters: []byte{0xc4, 0xbe}}, + "lcedil": {Name: "lcedil", CodePoints: []int{316}, Characters: []byte{0xc4, 0xbc}}, + "lceil": {Name: "lceil", CodePoints: []int{8968}, Characters: []byte{0xe2, 0x8c, 0x88}}, + "lcub": {Name: "lcub", CodePoints: []int{123}, Characters: []byte{0x7b}}, + "lcy": {Name: "lcy", CodePoints: []int{1083}, Characters: []byte{0xd0, 0xbb}}, + "ldca": {Name: "ldca", CodePoints: []int{10550}, Characters: []byte{0xe2, 0xa4, 0xb6}}, + "ldquo": {Name: "ldquo", CodePoints: []int{8220}, Characters: []byte{0xe2, 0x80, 0x9c}}, + "ldquor": {Name: "ldquor", CodePoints: []int{8222}, Characters: []byte{0xe2, 0x80, 0x9e}}, + "ldrdhar": {Name: "ldrdhar", CodePoints: []int{10599}, Characters: []byte{0xe2, 0xa5, 0xa7}}, + "ldrushar": {Name: "ldrushar", CodePoints: []int{10571}, Characters: []byte{0xe2, 0xa5, 0x8b}}, + "ldsh": {Name: "ldsh", CodePoints: []int{8626}, Characters: []byte{0xe2, 0x86, 0xb2}}, + "le": {Name: "le", CodePoints: []int{8804}, Characters: []byte{0xe2, 0x89, 0xa4}}, + "leftarrow": {Name: "leftarrow", CodePoints: []int{8592}, Characters: []byte{0xe2, 0x86, 0x90}}, + "leftarrowtail": {Name: "leftarrowtail", CodePoints: []int{8610}, Characters: []byte{0xe2, 0x86, 0xa2}}, + "leftharpoondown": {Name: "leftharpoondown", CodePoints: []int{8637}, Characters: []byte{0xe2, 0x86, 0xbd}}, + "leftharpoonup": {Name: "leftharpoonup", CodePoints: []int{8636}, Characters: []byte{0xe2, 0x86, 0xbc}}, + "leftleftarrows": {Name: "leftleftarrows", CodePoints: []int{8647}, Characters: []byte{0xe2, 0x87, 0x87}}, + "leftrightarrow": {Name: "leftrightarrow", CodePoints: []int{8596}, Characters: []byte{0xe2, 0x86, 0x94}}, + "leftrightarrows": {Name: "leftrightarrows", CodePoints: []int{8646}, Characters: []byte{0xe2, 0x87, 0x86}}, + "leftrightharpoons": {Name: "leftrightharpoons", CodePoints: []int{8651}, Characters: []byte{0xe2, 0x87, 0x8b}}, + "leftrightsquigarrow": {Name: "leftrightsquigarrow", CodePoints: []int{8621}, Characters: []byte{0xe2, 0x86, 0xad}}, + "leftthreetimes": {Name: "leftthreetimes", CodePoints: []int{8907}, Characters: []byte{0xe2, 0x8b, 0x8b}}, + "leg": {Name: "leg", CodePoints: []int{8922}, Characters: []byte{0xe2, 0x8b, 0x9a}}, + "leq": {Name: "leq", CodePoints: []int{8804}, Characters: []byte{0xe2, 0x89, 0xa4}}, + "leqq": {Name: "leqq", CodePoints: []int{8806}, Characters: []byte{0xe2, 0x89, 0xa6}}, + "leqslant": {Name: "leqslant", CodePoints: []int{10877}, Characters: []byte{0xe2, 0xa9, 0xbd}}, + "les": {Name: "les", CodePoints: []int{10877}, Characters: []byte{0xe2, 0xa9, 0xbd}}, + "lescc": {Name: "lescc", CodePoints: []int{10920}, Characters: []byte{0xe2, 0xaa, 0xa8}}, + "lesdot": {Name: "lesdot", CodePoints: []int{10879}, Characters: []byte{0xe2, 0xa9, 0xbf}}, + "lesdoto": {Name: "lesdoto", CodePoints: []int{10881}, Characters: []byte{0xe2, 0xaa, 0x81}}, + "lesdotor": {Name: "lesdotor", CodePoints: []int{10883}, Characters: []byte{0xe2, 0xaa, 0x83}}, + "lesg": {Name: "lesg", CodePoints: []int{8922, 65024}, Characters: []byte{0xe2, 0x8b, 0x9a, 0xef, 0xb8, 0x80}}, + "lesges": {Name: "lesges", CodePoints: []int{10899}, Characters: []byte{0xe2, 0xaa, 0x93}}, + "lessapprox": {Name: "lessapprox", CodePoints: []int{10885}, Characters: []byte{0xe2, 0xaa, 0x85}}, + "lessdot": {Name: "lessdot", CodePoints: []int{8918}, Characters: []byte{0xe2, 0x8b, 0x96}}, + "lesseqgtr": {Name: "lesseqgtr", CodePoints: []int{8922}, Characters: []byte{0xe2, 0x8b, 0x9a}}, + "lesseqqgtr": {Name: "lesseqqgtr", CodePoints: []int{10891}, Characters: []byte{0xe2, 0xaa, 0x8b}}, + "lessgtr": {Name: "lessgtr", CodePoints: []int{8822}, Characters: []byte{0xe2, 0x89, 0xb6}}, + "lesssim": {Name: "lesssim", CodePoints: []int{8818}, Characters: []byte{0xe2, 0x89, 0xb2}}, + "lfisht": {Name: "lfisht", CodePoints: []int{10620}, Characters: []byte{0xe2, 0xa5, 0xbc}}, + "lfloor": {Name: "lfloor", CodePoints: []int{8970}, Characters: []byte{0xe2, 0x8c, 0x8a}}, + "lfr": {Name: "lfr", CodePoints: []int{120105}, Characters: []byte{0xf0, 0x9d, 0x94, 0xa9}}, + "lg": {Name: "lg", CodePoints: []int{8822}, Characters: []byte{0xe2, 0x89, 0xb6}}, + "lgE": {Name: "lgE", CodePoints: []int{10897}, Characters: []byte{0xe2, 0xaa, 0x91}}, + "lhard": {Name: "lhard", CodePoints: []int{8637}, Characters: []byte{0xe2, 0x86, 0xbd}}, + "lharu": {Name: "lharu", CodePoints: []int{8636}, Characters: []byte{0xe2, 0x86, 0xbc}}, + "lharul": {Name: "lharul", CodePoints: []int{10602}, Characters: []byte{0xe2, 0xa5, 0xaa}}, + "lhblk": {Name: "lhblk", CodePoints: []int{9604}, Characters: []byte{0xe2, 0x96, 0x84}}, + "ljcy": {Name: "ljcy", CodePoints: []int{1113}, Characters: []byte{0xd1, 0x99}}, + "ll": {Name: "ll", CodePoints: []int{8810}, Characters: []byte{0xe2, 0x89, 0xaa}}, + "llarr": {Name: "llarr", CodePoints: []int{8647}, Characters: []byte{0xe2, 0x87, 0x87}}, + "llcorner": {Name: "llcorner", CodePoints: []int{8990}, Characters: []byte{0xe2, 0x8c, 0x9e}}, + "llhard": {Name: "llhard", CodePoints: []int{10603}, Characters: []byte{0xe2, 0xa5, 0xab}}, + "lltri": {Name: "lltri", CodePoints: []int{9722}, Characters: []byte{0xe2, 0x97, 0xba}}, + "lmidot": {Name: "lmidot", CodePoints: []int{320}, Characters: []byte{0xc5, 0x80}}, + "lmoust": {Name: "lmoust", CodePoints: []int{9136}, Characters: []byte{0xe2, 0x8e, 0xb0}}, + "lmoustache": {Name: "lmoustache", CodePoints: []int{9136}, Characters: []byte{0xe2, 0x8e, 0xb0}}, + "lnE": {Name: "lnE", CodePoints: []int{8808}, Characters: []byte{0xe2, 0x89, 0xa8}}, + "lnap": {Name: "lnap", CodePoints: []int{10889}, Characters: []byte{0xe2, 0xaa, 0x89}}, + "lnapprox": {Name: "lnapprox", CodePoints: []int{10889}, Characters: []byte{0xe2, 0xaa, 0x89}}, + "lne": {Name: "lne", CodePoints: []int{10887}, Characters: []byte{0xe2, 0xaa, 0x87}}, + "lneq": {Name: "lneq", CodePoints: []int{10887}, Characters: []byte{0xe2, 0xaa, 0x87}}, + "lneqq": {Name: "lneqq", CodePoints: []int{8808}, Characters: []byte{0xe2, 0x89, 0xa8}}, + "lnsim": {Name: "lnsim", CodePoints: []int{8934}, Characters: []byte{0xe2, 0x8b, 0xa6}}, + "loang": {Name: "loang", CodePoints: []int{10220}, Characters: []byte{0xe2, 0x9f, 0xac}}, + "loarr": {Name: "loarr", CodePoints: []int{8701}, Characters: []byte{0xe2, 0x87, 0xbd}}, + "lobrk": {Name: "lobrk", CodePoints: []int{10214}, Characters: []byte{0xe2, 0x9f, 0xa6}}, + "longleftarrow": {Name: "longleftarrow", CodePoints: []int{10229}, Characters: []byte{0xe2, 0x9f, 0xb5}}, + "longleftrightarrow": {Name: "longleftrightarrow", CodePoints: []int{10231}, Characters: []byte{0xe2, 0x9f, 0xb7}}, + "longmapsto": {Name: "longmapsto", CodePoints: []int{10236}, Characters: []byte{0xe2, 0x9f, 0xbc}}, + "longrightarrow": {Name: "longrightarrow", CodePoints: []int{10230}, Characters: []byte{0xe2, 0x9f, 0xb6}}, + "looparrowleft": {Name: "looparrowleft", CodePoints: []int{8619}, Characters: []byte{0xe2, 0x86, 0xab}}, + "looparrowright": {Name: "looparrowright", CodePoints: []int{8620}, Characters: []byte{0xe2, 0x86, 0xac}}, + "lopar": {Name: "lopar", CodePoints: []int{10629}, Characters: []byte{0xe2, 0xa6, 0x85}}, + "lopf": {Name: "lopf", CodePoints: []int{120157}, Characters: []byte{0xf0, 0x9d, 0x95, 0x9d}}, + "loplus": {Name: "loplus", CodePoints: []int{10797}, Characters: []byte{0xe2, 0xa8, 0xad}}, + "lotimes": {Name: "lotimes", CodePoints: []int{10804}, Characters: []byte{0xe2, 0xa8, 0xb4}}, + "lowast": {Name: "lowast", CodePoints: []int{8727}, Characters: []byte{0xe2, 0x88, 0x97}}, + "lowbar": {Name: "lowbar", CodePoints: []int{95}, Characters: []byte{0x5f}}, + "loz": {Name: "loz", CodePoints: []int{9674}, Characters: []byte{0xe2, 0x97, 0x8a}}, + "lozenge": {Name: "lozenge", CodePoints: []int{9674}, Characters: []byte{0xe2, 0x97, 0x8a}}, + "lozf": {Name: "lozf", CodePoints: []int{10731}, Characters: []byte{0xe2, 0xa7, 0xab}}, + "lpar": {Name: "lpar", CodePoints: []int{40}, Characters: []byte{0x28}}, + "lparlt": {Name: "lparlt", CodePoints: []int{10643}, Characters: []byte{0xe2, 0xa6, 0x93}}, + "lrarr": {Name: "lrarr", CodePoints: []int{8646}, Characters: []byte{0xe2, 0x87, 0x86}}, + "lrcorner": {Name: "lrcorner", CodePoints: []int{8991}, Characters: []byte{0xe2, 0x8c, 0x9f}}, + "lrhar": {Name: "lrhar", CodePoints: []int{8651}, Characters: []byte{0xe2, 0x87, 0x8b}}, + "lrhard": {Name: "lrhard", CodePoints: []int{10605}, Characters: []byte{0xe2, 0xa5, 0xad}}, + "lrm": {Name: "lrm", CodePoints: []int{8206}, Characters: []byte{0xe2, 0x80, 0x8e}}, + "lrtri": {Name: "lrtri", CodePoints: []int{8895}, Characters: []byte{0xe2, 0x8a, 0xbf}}, + "lsaquo": {Name: "lsaquo", CodePoints: []int{8249}, Characters: []byte{0xe2, 0x80, 0xb9}}, + "lscr": {Name: "lscr", CodePoints: []int{120001}, Characters: []byte{0xf0, 0x9d, 0x93, 0x81}}, + "lsh": {Name: "lsh", CodePoints: []int{8624}, Characters: []byte{0xe2, 0x86, 0xb0}}, + "lsim": {Name: "lsim", CodePoints: []int{8818}, Characters: []byte{0xe2, 0x89, 0xb2}}, + "lsime": {Name: "lsime", CodePoints: []int{10893}, Characters: []byte{0xe2, 0xaa, 0x8d}}, + "lsimg": {Name: "lsimg", CodePoints: []int{10895}, Characters: []byte{0xe2, 0xaa, 0x8f}}, + "lsqb": {Name: "lsqb", CodePoints: []int{91}, Characters: []byte{0x5b}}, + "lsquo": {Name: "lsquo", CodePoints: []int{8216}, Characters: []byte{0xe2, 0x80, 0x98}}, + "lsquor": {Name: "lsquor", CodePoints: []int{8218}, Characters: []byte{0xe2, 0x80, 0x9a}}, + "lstrok": {Name: "lstrok", CodePoints: []int{322}, Characters: []byte{0xc5, 0x82}}, + "lt": {Name: "lt", CodePoints: []int{60}, Characters: []byte{0x3c}}, + "ltcc": {Name: "ltcc", CodePoints: []int{10918}, Characters: []byte{0xe2, 0xaa, 0xa6}}, + "ltcir": {Name: "ltcir", CodePoints: []int{10873}, Characters: []byte{0xe2, 0xa9, 0xb9}}, + "ltdot": {Name: "ltdot", CodePoints: []int{8918}, Characters: []byte{0xe2, 0x8b, 0x96}}, + "lthree": {Name: "lthree", CodePoints: []int{8907}, Characters: []byte{0xe2, 0x8b, 0x8b}}, + "ltimes": {Name: "ltimes", CodePoints: []int{8905}, Characters: []byte{0xe2, 0x8b, 0x89}}, + "ltlarr": {Name: "ltlarr", CodePoints: []int{10614}, Characters: []byte{0xe2, 0xa5, 0xb6}}, + "ltquest": {Name: "ltquest", CodePoints: []int{10875}, Characters: []byte{0xe2, 0xa9, 0xbb}}, + "ltrPar": {Name: "ltrPar", CodePoints: []int{10646}, Characters: []byte{0xe2, 0xa6, 0x96}}, + "ltri": {Name: "ltri", CodePoints: []int{9667}, Characters: []byte{0xe2, 0x97, 0x83}}, + "ltrie": {Name: "ltrie", CodePoints: []int{8884}, Characters: []byte{0xe2, 0x8a, 0xb4}}, + "ltrif": {Name: "ltrif", CodePoints: []int{9666}, Characters: []byte{0xe2, 0x97, 0x82}}, + "lurdshar": {Name: "lurdshar", CodePoints: []int{10570}, Characters: []byte{0xe2, 0xa5, 0x8a}}, + "luruhar": {Name: "luruhar", CodePoints: []int{10598}, Characters: []byte{0xe2, 0xa5, 0xa6}}, + "lvertneqq": {Name: "lvertneqq", CodePoints: []int{8808, 65024}, Characters: []byte{0xe2, 0x89, 0xa8, 0xef, 0xb8, 0x80}}, + "lvnE": {Name: "lvnE", CodePoints: []int{8808, 65024}, Characters: []byte{0xe2, 0x89, 0xa8, 0xef, 0xb8, 0x80}}, + "mDDot": {Name: "mDDot", CodePoints: []int{8762}, Characters: []byte{0xe2, 0x88, 0xba}}, + "macr": {Name: "macr", CodePoints: []int{175}, Characters: []byte{0xc2, 0xaf}}, + "male": {Name: "male", CodePoints: []int{9794}, Characters: []byte{0xe2, 0x99, 0x82}}, + "malt": {Name: "malt", CodePoints: []int{10016}, Characters: []byte{0xe2, 0x9c, 0xa0}}, + "maltese": {Name: "maltese", CodePoints: []int{10016}, Characters: []byte{0xe2, 0x9c, 0xa0}}, + "map": {Name: "map", CodePoints: []int{8614}, Characters: []byte{0xe2, 0x86, 0xa6}}, + "mapsto": {Name: "mapsto", CodePoints: []int{8614}, Characters: []byte{0xe2, 0x86, 0xa6}}, + "mapstodown": {Name: "mapstodown", CodePoints: []int{8615}, Characters: []byte{0xe2, 0x86, 0xa7}}, + "mapstoleft": {Name: "mapstoleft", CodePoints: []int{8612}, Characters: []byte{0xe2, 0x86, 0xa4}}, + "mapstoup": {Name: "mapstoup", CodePoints: []int{8613}, Characters: []byte{0xe2, 0x86, 0xa5}}, + "marker": {Name: "marker", CodePoints: []int{9646}, Characters: []byte{0xe2, 0x96, 0xae}}, + "mcomma": {Name: "mcomma", CodePoints: []int{10793}, Characters: []byte{0xe2, 0xa8, 0xa9}}, + "mcy": {Name: "mcy", CodePoints: []int{1084}, Characters: []byte{0xd0, 0xbc}}, + "mdash": {Name: "mdash", CodePoints: []int{8212}, Characters: []byte{0xe2, 0x80, 0x94}}, + "measuredangle": {Name: "measuredangle", CodePoints: []int{8737}, Characters: []byte{0xe2, 0x88, 0xa1}}, + "mfr": {Name: "mfr", CodePoints: []int{120106}, Characters: []byte{0xf0, 0x9d, 0x94, 0xaa}}, + "mho": {Name: "mho", CodePoints: []int{8487}, Characters: []byte{0xe2, 0x84, 0xa7}}, + "micro": {Name: "micro", CodePoints: []int{181}, Characters: []byte{0xc2, 0xb5}}, + "mid": {Name: "mid", CodePoints: []int{8739}, Characters: []byte{0xe2, 0x88, 0xa3}}, + "midast": {Name: "midast", CodePoints: []int{42}, Characters: []byte{0x2a}}, + "midcir": {Name: "midcir", CodePoints: []int{10992}, Characters: []byte{0xe2, 0xab, 0xb0}}, + "middot": {Name: "middot", CodePoints: []int{183}, Characters: []byte{0xc2, 0xb7}}, + "minus": {Name: "minus", CodePoints: []int{8722}, Characters: []byte{0xe2, 0x88, 0x92}}, + "minusb": {Name: "minusb", CodePoints: []int{8863}, Characters: []byte{0xe2, 0x8a, 0x9f}}, + "minusd": {Name: "minusd", CodePoints: []int{8760}, Characters: []byte{0xe2, 0x88, 0xb8}}, + "minusdu": {Name: "minusdu", CodePoints: []int{10794}, Characters: []byte{0xe2, 0xa8, 0xaa}}, + "mlcp": {Name: "mlcp", CodePoints: []int{10971}, Characters: []byte{0xe2, 0xab, 0x9b}}, + "mldr": {Name: "mldr", CodePoints: []int{8230}, Characters: []byte{0xe2, 0x80, 0xa6}}, + "mnplus": {Name: "mnplus", CodePoints: []int{8723}, Characters: []byte{0xe2, 0x88, 0x93}}, + "models": {Name: "models", CodePoints: []int{8871}, Characters: []byte{0xe2, 0x8a, 0xa7}}, + "mopf": {Name: "mopf", CodePoints: []int{120158}, Characters: []byte{0xf0, 0x9d, 0x95, 0x9e}}, + "mp": {Name: "mp", CodePoints: []int{8723}, Characters: []byte{0xe2, 0x88, 0x93}}, + "mscr": {Name: "mscr", CodePoints: []int{120002}, Characters: []byte{0xf0, 0x9d, 0x93, 0x82}}, + "mstpos": {Name: "mstpos", CodePoints: []int{8766}, Characters: []byte{0xe2, 0x88, 0xbe}}, + "mu": {Name: "mu", CodePoints: []int{956}, Characters: []byte{0xce, 0xbc}}, + "multimap": {Name: "multimap", CodePoints: []int{8888}, Characters: []byte{0xe2, 0x8a, 0xb8}}, + "mumap": {Name: "mumap", CodePoints: []int{8888}, Characters: []byte{0xe2, 0x8a, 0xb8}}, + "nGg": {Name: "nGg", CodePoints: []int{8921, 824}, Characters: []byte{0xe2, 0x8b, 0x99, 0xcc, 0xb8}}, + "nGt": {Name: "nGt", CodePoints: []int{8811, 8402}, Characters: []byte{0xe2, 0x89, 0xab, 0xe2, 0x83, 0x92}}, + "nGtv": {Name: "nGtv", CodePoints: []int{8811, 824}, Characters: []byte{0xe2, 0x89, 0xab, 0xcc, 0xb8}}, + "nLeftarrow": {Name: "nLeftarrow", CodePoints: []int{8653}, Characters: []byte{0xe2, 0x87, 0x8d}}, + "nLeftrightarrow": {Name: "nLeftrightarrow", CodePoints: []int{8654}, Characters: []byte{0xe2, 0x87, 0x8e}}, + "nLl": {Name: "nLl", CodePoints: []int{8920, 824}, Characters: []byte{0xe2, 0x8b, 0x98, 0xcc, 0xb8}}, + "nLt": {Name: "nLt", CodePoints: []int{8810, 8402}, Characters: []byte{0xe2, 0x89, 0xaa, 0xe2, 0x83, 0x92}}, + "nLtv": {Name: "nLtv", CodePoints: []int{8810, 824}, Characters: []byte{0xe2, 0x89, 0xaa, 0xcc, 0xb8}}, + "nRightarrow": {Name: "nRightarrow", CodePoints: []int{8655}, Characters: []byte{0xe2, 0x87, 0x8f}}, + "nVDash": {Name: "nVDash", CodePoints: []int{8879}, Characters: []byte{0xe2, 0x8a, 0xaf}}, + "nVdash": {Name: "nVdash", CodePoints: []int{8878}, Characters: []byte{0xe2, 0x8a, 0xae}}, + "nabla": {Name: "nabla", CodePoints: []int{8711}, Characters: []byte{0xe2, 0x88, 0x87}}, + "nacute": {Name: "nacute", CodePoints: []int{324}, Characters: []byte{0xc5, 0x84}}, + "nang": {Name: "nang", CodePoints: []int{8736, 8402}, Characters: []byte{0xe2, 0x88, 0xa0, 0xe2, 0x83, 0x92}}, + "nap": {Name: "nap", CodePoints: []int{8777}, Characters: []byte{0xe2, 0x89, 0x89}}, + "napE": {Name: "napE", CodePoints: []int{10864, 824}, Characters: []byte{0xe2, 0xa9, 0xb0, 0xcc, 0xb8}}, + "napid": {Name: "napid", CodePoints: []int{8779, 824}, Characters: []byte{0xe2, 0x89, 0x8b, 0xcc, 0xb8}}, + "napos": {Name: "napos", CodePoints: []int{329}, Characters: []byte{0xc5, 0x89}}, + "napprox": {Name: "napprox", CodePoints: []int{8777}, Characters: []byte{0xe2, 0x89, 0x89}}, + "natur": {Name: "natur", CodePoints: []int{9838}, Characters: []byte{0xe2, 0x99, 0xae}}, + "natural": {Name: "natural", CodePoints: []int{9838}, Characters: []byte{0xe2, 0x99, 0xae}}, + "naturals": {Name: "naturals", CodePoints: []int{8469}, Characters: []byte{0xe2, 0x84, 0x95}}, + "nbsp": {Name: "nbsp", CodePoints: []int{160}, Characters: []byte{0xc2, 0xa0}}, + "nbump": {Name: "nbump", CodePoints: []int{8782, 824}, Characters: []byte{0xe2, 0x89, 0x8e, 0xcc, 0xb8}}, + "nbumpe": {Name: "nbumpe", CodePoints: []int{8783, 824}, Characters: []byte{0xe2, 0x89, 0x8f, 0xcc, 0xb8}}, + "ncap": {Name: "ncap", CodePoints: []int{10819}, Characters: []byte{0xe2, 0xa9, 0x83}}, + "ncaron": {Name: "ncaron", CodePoints: []int{328}, Characters: []byte{0xc5, 0x88}}, + "ncedil": {Name: "ncedil", CodePoints: []int{326}, Characters: []byte{0xc5, 0x86}}, + "ncong": {Name: "ncong", CodePoints: []int{8775}, Characters: []byte{0xe2, 0x89, 0x87}}, + "ncongdot": {Name: "ncongdot", CodePoints: []int{10861, 824}, Characters: []byte{0xe2, 0xa9, 0xad, 0xcc, 0xb8}}, + "ncup": {Name: "ncup", CodePoints: []int{10818}, Characters: []byte{0xe2, 0xa9, 0x82}}, + "ncy": {Name: "ncy", CodePoints: []int{1085}, Characters: []byte{0xd0, 0xbd}}, + "ndash": {Name: "ndash", CodePoints: []int{8211}, Characters: []byte{0xe2, 0x80, 0x93}}, + "ne": {Name: "ne", CodePoints: []int{8800}, Characters: []byte{0xe2, 0x89, 0xa0}}, + "neArr": {Name: "neArr", CodePoints: []int{8663}, Characters: []byte{0xe2, 0x87, 0x97}}, + "nearhk": {Name: "nearhk", CodePoints: []int{10532}, Characters: []byte{0xe2, 0xa4, 0xa4}}, + "nearr": {Name: "nearr", CodePoints: []int{8599}, Characters: []byte{0xe2, 0x86, 0x97}}, + "nearrow": {Name: "nearrow", CodePoints: []int{8599}, Characters: []byte{0xe2, 0x86, 0x97}}, + "nedot": {Name: "nedot", CodePoints: []int{8784, 824}, Characters: []byte{0xe2, 0x89, 0x90, 0xcc, 0xb8}}, + "nequiv": {Name: "nequiv", CodePoints: []int{8802}, Characters: []byte{0xe2, 0x89, 0xa2}}, + "nesear": {Name: "nesear", CodePoints: []int{10536}, Characters: []byte{0xe2, 0xa4, 0xa8}}, + "nesim": {Name: "nesim", CodePoints: []int{8770, 824}, Characters: []byte{0xe2, 0x89, 0x82, 0xcc, 0xb8}}, + "nexist": {Name: "nexist", CodePoints: []int{8708}, Characters: []byte{0xe2, 0x88, 0x84}}, + "nexists": {Name: "nexists", CodePoints: []int{8708}, Characters: []byte{0xe2, 0x88, 0x84}}, + "nfr": {Name: "nfr", CodePoints: []int{120107}, Characters: []byte{0xf0, 0x9d, 0x94, 0xab}}, + "ngE": {Name: "ngE", CodePoints: []int{8807, 824}, Characters: []byte{0xe2, 0x89, 0xa7, 0xcc, 0xb8}}, + "nge": {Name: "nge", CodePoints: []int{8817}, Characters: []byte{0xe2, 0x89, 0xb1}}, + "ngeq": {Name: "ngeq", CodePoints: []int{8817}, Characters: []byte{0xe2, 0x89, 0xb1}}, + "ngeqq": {Name: "ngeqq", CodePoints: []int{8807, 824}, Characters: []byte{0xe2, 0x89, 0xa7, 0xcc, 0xb8}}, + "ngeqslant": {Name: "ngeqslant", CodePoints: []int{10878, 824}, Characters: []byte{0xe2, 0xa9, 0xbe, 0xcc, 0xb8}}, + "nges": {Name: "nges", CodePoints: []int{10878, 824}, Characters: []byte{0xe2, 0xa9, 0xbe, 0xcc, 0xb8}}, + "ngsim": {Name: "ngsim", CodePoints: []int{8821}, Characters: []byte{0xe2, 0x89, 0xb5}}, + "ngt": {Name: "ngt", CodePoints: []int{8815}, Characters: []byte{0xe2, 0x89, 0xaf}}, + "ngtr": {Name: "ngtr", CodePoints: []int{8815}, Characters: []byte{0xe2, 0x89, 0xaf}}, + "nhArr": {Name: "nhArr", CodePoints: []int{8654}, Characters: []byte{0xe2, 0x87, 0x8e}}, + "nharr": {Name: "nharr", CodePoints: []int{8622}, Characters: []byte{0xe2, 0x86, 0xae}}, + "nhpar": {Name: "nhpar", CodePoints: []int{10994}, Characters: []byte{0xe2, 0xab, 0xb2}}, + "ni": {Name: "ni", CodePoints: []int{8715}, Characters: []byte{0xe2, 0x88, 0x8b}}, + "nis": {Name: "nis", CodePoints: []int{8956}, Characters: []byte{0xe2, 0x8b, 0xbc}}, + "nisd": {Name: "nisd", CodePoints: []int{8954}, Characters: []byte{0xe2, 0x8b, 0xba}}, + "niv": {Name: "niv", CodePoints: []int{8715}, Characters: []byte{0xe2, 0x88, 0x8b}}, + "njcy": {Name: "njcy", CodePoints: []int{1114}, Characters: []byte{0xd1, 0x9a}}, + "nlArr": {Name: "nlArr", CodePoints: []int{8653}, Characters: []byte{0xe2, 0x87, 0x8d}}, + "nlE": {Name: "nlE", CodePoints: []int{8806, 824}, Characters: []byte{0xe2, 0x89, 0xa6, 0xcc, 0xb8}}, + "nlarr": {Name: "nlarr", CodePoints: []int{8602}, Characters: []byte{0xe2, 0x86, 0x9a}}, + "nldr": {Name: "nldr", CodePoints: []int{8229}, Characters: []byte{0xe2, 0x80, 0xa5}}, + "nle": {Name: "nle", CodePoints: []int{8816}, Characters: []byte{0xe2, 0x89, 0xb0}}, + "nleftarrow": {Name: "nleftarrow", CodePoints: []int{8602}, Characters: []byte{0xe2, 0x86, 0x9a}}, + "nleftrightarrow": {Name: "nleftrightarrow", CodePoints: []int{8622}, Characters: []byte{0xe2, 0x86, 0xae}}, + "nleq": {Name: "nleq", CodePoints: []int{8816}, Characters: []byte{0xe2, 0x89, 0xb0}}, + "nleqq": {Name: "nleqq", CodePoints: []int{8806, 824}, Characters: []byte{0xe2, 0x89, 0xa6, 0xcc, 0xb8}}, + "nleqslant": {Name: "nleqslant", CodePoints: []int{10877, 824}, Characters: []byte{0xe2, 0xa9, 0xbd, 0xcc, 0xb8}}, + "nles": {Name: "nles", CodePoints: []int{10877, 824}, Characters: []byte{0xe2, 0xa9, 0xbd, 0xcc, 0xb8}}, + "nless": {Name: "nless", CodePoints: []int{8814}, Characters: []byte{0xe2, 0x89, 0xae}}, + "nlsim": {Name: "nlsim", CodePoints: []int{8820}, Characters: []byte{0xe2, 0x89, 0xb4}}, + "nlt": {Name: "nlt", CodePoints: []int{8814}, Characters: []byte{0xe2, 0x89, 0xae}}, + "nltri": {Name: "nltri", CodePoints: []int{8938}, Characters: []byte{0xe2, 0x8b, 0xaa}}, + "nltrie": {Name: "nltrie", CodePoints: []int{8940}, Characters: []byte{0xe2, 0x8b, 0xac}}, + "nmid": {Name: "nmid", CodePoints: []int{8740}, Characters: []byte{0xe2, 0x88, 0xa4}}, + "nopf": {Name: "nopf", CodePoints: []int{120159}, Characters: []byte{0xf0, 0x9d, 0x95, 0x9f}}, + "not": {Name: "not", CodePoints: []int{172}, Characters: []byte{0xc2, 0xac}}, + "notin": {Name: "notin", CodePoints: []int{8713}, Characters: []byte{0xe2, 0x88, 0x89}}, + "notinE": {Name: "notinE", CodePoints: []int{8953, 824}, Characters: []byte{0xe2, 0x8b, 0xb9, 0xcc, 0xb8}}, + "notindot": {Name: "notindot", CodePoints: []int{8949, 824}, Characters: []byte{0xe2, 0x8b, 0xb5, 0xcc, 0xb8}}, + "notinva": {Name: "notinva", CodePoints: []int{8713}, Characters: []byte{0xe2, 0x88, 0x89}}, + "notinvb": {Name: "notinvb", CodePoints: []int{8951}, Characters: []byte{0xe2, 0x8b, 0xb7}}, + "notinvc": {Name: "notinvc", CodePoints: []int{8950}, Characters: []byte{0xe2, 0x8b, 0xb6}}, + "notni": {Name: "notni", CodePoints: []int{8716}, Characters: []byte{0xe2, 0x88, 0x8c}}, + "notniva": {Name: "notniva", CodePoints: []int{8716}, Characters: []byte{0xe2, 0x88, 0x8c}}, + "notnivb": {Name: "notnivb", CodePoints: []int{8958}, Characters: []byte{0xe2, 0x8b, 0xbe}}, + "notnivc": {Name: "notnivc", CodePoints: []int{8957}, Characters: []byte{0xe2, 0x8b, 0xbd}}, + "npar": {Name: "npar", CodePoints: []int{8742}, Characters: []byte{0xe2, 0x88, 0xa6}}, + "nparallel": {Name: "nparallel", CodePoints: []int{8742}, Characters: []byte{0xe2, 0x88, 0xa6}}, + "nparsl": {Name: "nparsl", CodePoints: []int{11005, 8421}, Characters: []byte{0xe2, 0xab, 0xbd, 0xe2, 0x83, 0xa5}}, + "npart": {Name: "npart", CodePoints: []int{8706, 824}, Characters: []byte{0xe2, 0x88, 0x82, 0xcc, 0xb8}}, + "npolint": {Name: "npolint", CodePoints: []int{10772}, Characters: []byte{0xe2, 0xa8, 0x94}}, + "npr": {Name: "npr", CodePoints: []int{8832}, Characters: []byte{0xe2, 0x8a, 0x80}}, + "nprcue": {Name: "nprcue", CodePoints: []int{8928}, Characters: []byte{0xe2, 0x8b, 0xa0}}, + "npre": {Name: "npre", CodePoints: []int{10927, 824}, Characters: []byte{0xe2, 0xaa, 0xaf, 0xcc, 0xb8}}, + "nprec": {Name: "nprec", CodePoints: []int{8832}, Characters: []byte{0xe2, 0x8a, 0x80}}, + "npreceq": {Name: "npreceq", CodePoints: []int{10927, 824}, Characters: []byte{0xe2, 0xaa, 0xaf, 0xcc, 0xb8}}, + "nrArr": {Name: "nrArr", CodePoints: []int{8655}, Characters: []byte{0xe2, 0x87, 0x8f}}, + "nrarr": {Name: "nrarr", CodePoints: []int{8603}, Characters: []byte{0xe2, 0x86, 0x9b}}, + "nrarrc": {Name: "nrarrc", CodePoints: []int{10547, 824}, Characters: []byte{0xe2, 0xa4, 0xb3, 0xcc, 0xb8}}, + "nrarrw": {Name: "nrarrw", CodePoints: []int{8605, 824}, Characters: []byte{0xe2, 0x86, 0x9d, 0xcc, 0xb8}}, + "nrightarrow": {Name: "nrightarrow", CodePoints: []int{8603}, Characters: []byte{0xe2, 0x86, 0x9b}}, + "nrtri": {Name: "nrtri", CodePoints: []int{8939}, Characters: []byte{0xe2, 0x8b, 0xab}}, + "nrtrie": {Name: "nrtrie", CodePoints: []int{8941}, Characters: []byte{0xe2, 0x8b, 0xad}}, + "nsc": {Name: "nsc", CodePoints: []int{8833}, Characters: []byte{0xe2, 0x8a, 0x81}}, + "nsccue": {Name: "nsccue", CodePoints: []int{8929}, Characters: []byte{0xe2, 0x8b, 0xa1}}, + "nsce": {Name: "nsce", CodePoints: []int{10928, 824}, Characters: []byte{0xe2, 0xaa, 0xb0, 0xcc, 0xb8}}, + "nscr": {Name: "nscr", CodePoints: []int{120003}, Characters: []byte{0xf0, 0x9d, 0x93, 0x83}}, + "nshortmid": {Name: "nshortmid", CodePoints: []int{8740}, Characters: []byte{0xe2, 0x88, 0xa4}}, + "nshortparallel": {Name: "nshortparallel", CodePoints: []int{8742}, Characters: []byte{0xe2, 0x88, 0xa6}}, + "nsim": {Name: "nsim", CodePoints: []int{8769}, Characters: []byte{0xe2, 0x89, 0x81}}, + "nsime": {Name: "nsime", CodePoints: []int{8772}, Characters: []byte{0xe2, 0x89, 0x84}}, + "nsimeq": {Name: "nsimeq", CodePoints: []int{8772}, Characters: []byte{0xe2, 0x89, 0x84}}, + "nsmid": {Name: "nsmid", CodePoints: []int{8740}, Characters: []byte{0xe2, 0x88, 0xa4}}, + "nspar": {Name: "nspar", CodePoints: []int{8742}, Characters: []byte{0xe2, 0x88, 0xa6}}, + "nsqsube": {Name: "nsqsube", CodePoints: []int{8930}, Characters: []byte{0xe2, 0x8b, 0xa2}}, + "nsqsupe": {Name: "nsqsupe", CodePoints: []int{8931}, Characters: []byte{0xe2, 0x8b, 0xa3}}, + "nsub": {Name: "nsub", CodePoints: []int{8836}, Characters: []byte{0xe2, 0x8a, 0x84}}, + "nsubE": {Name: "nsubE", CodePoints: []int{10949, 824}, Characters: []byte{0xe2, 0xab, 0x85, 0xcc, 0xb8}}, + "nsube": {Name: "nsube", CodePoints: []int{8840}, Characters: []byte{0xe2, 0x8a, 0x88}}, + "nsubset": {Name: "nsubset", CodePoints: []int{8834, 8402}, Characters: []byte{0xe2, 0x8a, 0x82, 0xe2, 0x83, 0x92}}, + "nsubseteq": {Name: "nsubseteq", CodePoints: []int{8840}, Characters: []byte{0xe2, 0x8a, 0x88}}, + "nsubseteqq": {Name: "nsubseteqq", CodePoints: []int{10949, 824}, Characters: []byte{0xe2, 0xab, 0x85, 0xcc, 0xb8}}, + "nsucc": {Name: "nsucc", CodePoints: []int{8833}, Characters: []byte{0xe2, 0x8a, 0x81}}, + "nsucceq": {Name: "nsucceq", CodePoints: []int{10928, 824}, Characters: []byte{0xe2, 0xaa, 0xb0, 0xcc, 0xb8}}, + "nsup": {Name: "nsup", CodePoints: []int{8837}, Characters: []byte{0xe2, 0x8a, 0x85}}, + "nsupE": {Name: "nsupE", CodePoints: []int{10950, 824}, Characters: []byte{0xe2, 0xab, 0x86, 0xcc, 0xb8}}, + "nsupe": {Name: "nsupe", CodePoints: []int{8841}, Characters: []byte{0xe2, 0x8a, 0x89}}, + "nsupset": {Name: "nsupset", CodePoints: []int{8835, 8402}, Characters: []byte{0xe2, 0x8a, 0x83, 0xe2, 0x83, 0x92}}, + "nsupseteq": {Name: "nsupseteq", CodePoints: []int{8841}, Characters: []byte{0xe2, 0x8a, 0x89}}, + "nsupseteqq": {Name: "nsupseteqq", CodePoints: []int{10950, 824}, Characters: []byte{0xe2, 0xab, 0x86, 0xcc, 0xb8}}, + "ntgl": {Name: "ntgl", CodePoints: []int{8825}, Characters: []byte{0xe2, 0x89, 0xb9}}, + "ntilde": {Name: "ntilde", CodePoints: []int{241}, Characters: []byte{0xc3, 0xb1}}, + "ntlg": {Name: "ntlg", CodePoints: []int{8824}, Characters: []byte{0xe2, 0x89, 0xb8}}, + "ntriangleleft": {Name: "ntriangleleft", CodePoints: []int{8938}, Characters: []byte{0xe2, 0x8b, 0xaa}}, + "ntrianglelefteq": {Name: "ntrianglelefteq", CodePoints: []int{8940}, Characters: []byte{0xe2, 0x8b, 0xac}}, + "ntriangleright": {Name: "ntriangleright", CodePoints: []int{8939}, Characters: []byte{0xe2, 0x8b, 0xab}}, + "ntrianglerighteq": {Name: "ntrianglerighteq", CodePoints: []int{8941}, Characters: []byte{0xe2, 0x8b, 0xad}}, + "nu": {Name: "nu", CodePoints: []int{957}, Characters: []byte{0xce, 0xbd}}, + "num": {Name: "num", CodePoints: []int{35}, Characters: []byte{0x23}}, + "numero": {Name: "numero", CodePoints: []int{8470}, Characters: []byte{0xe2, 0x84, 0x96}}, + "numsp": {Name: "numsp", CodePoints: []int{8199}, Characters: []byte{0xe2, 0x80, 0x87}}, + "nvDash": {Name: "nvDash", CodePoints: []int{8877}, Characters: []byte{0xe2, 0x8a, 0xad}}, + "nvHarr": {Name: "nvHarr", CodePoints: []int{10500}, Characters: []byte{0xe2, 0xa4, 0x84}}, + "nvap": {Name: "nvap", CodePoints: []int{8781, 8402}, Characters: []byte{0xe2, 0x89, 0x8d, 0xe2, 0x83, 0x92}}, + "nvdash": {Name: "nvdash", CodePoints: []int{8876}, Characters: []byte{0xe2, 0x8a, 0xac}}, + "nvge": {Name: "nvge", CodePoints: []int{8805, 8402}, Characters: []byte{0xe2, 0x89, 0xa5, 0xe2, 0x83, 0x92}}, + "nvgt": {Name: "nvgt", CodePoints: []int{62, 8402}, Characters: []byte{0x3e, 0xe2, 0x83, 0x92}}, + "nvinfin": {Name: "nvinfin", CodePoints: []int{10718}, Characters: []byte{0xe2, 0xa7, 0x9e}}, + "nvlArr": {Name: "nvlArr", CodePoints: []int{10498}, Characters: []byte{0xe2, 0xa4, 0x82}}, + "nvle": {Name: "nvle", CodePoints: []int{8804, 8402}, Characters: []byte{0xe2, 0x89, 0xa4, 0xe2, 0x83, 0x92}}, + "nvlt": {Name: "nvlt", CodePoints: []int{60, 8402}, Characters: []byte{0x3c, 0xe2, 0x83, 0x92}}, + "nvltrie": {Name: "nvltrie", CodePoints: []int{8884, 8402}, Characters: []byte{0xe2, 0x8a, 0xb4, 0xe2, 0x83, 0x92}}, + "nvrArr": {Name: "nvrArr", CodePoints: []int{10499}, Characters: []byte{0xe2, 0xa4, 0x83}}, + "nvrtrie": {Name: "nvrtrie", CodePoints: []int{8885, 8402}, Characters: []byte{0xe2, 0x8a, 0xb5, 0xe2, 0x83, 0x92}}, + "nvsim": {Name: "nvsim", CodePoints: []int{8764, 8402}, Characters: []byte{0xe2, 0x88, 0xbc, 0xe2, 0x83, 0x92}}, + "nwArr": {Name: "nwArr", CodePoints: []int{8662}, Characters: []byte{0xe2, 0x87, 0x96}}, + "nwarhk": {Name: "nwarhk", CodePoints: []int{10531}, Characters: []byte{0xe2, 0xa4, 0xa3}}, + "nwarr": {Name: "nwarr", CodePoints: []int{8598}, Characters: []byte{0xe2, 0x86, 0x96}}, + "nwarrow": {Name: "nwarrow", CodePoints: []int{8598}, Characters: []byte{0xe2, 0x86, 0x96}}, + "nwnear": {Name: "nwnear", CodePoints: []int{10535}, Characters: []byte{0xe2, 0xa4, 0xa7}}, + "oS": {Name: "oS", CodePoints: []int{9416}, Characters: []byte{0xe2, 0x93, 0x88}}, + "oacute": {Name: "oacute", CodePoints: []int{243}, Characters: []byte{0xc3, 0xb3}}, + "oast": {Name: "oast", CodePoints: []int{8859}, Characters: []byte{0xe2, 0x8a, 0x9b}}, + "ocir": {Name: "ocir", CodePoints: []int{8858}, Characters: []byte{0xe2, 0x8a, 0x9a}}, + "ocirc": {Name: "ocirc", CodePoints: []int{244}, Characters: []byte{0xc3, 0xb4}}, + "ocy": {Name: "ocy", CodePoints: []int{1086}, Characters: []byte{0xd0, 0xbe}}, + "odash": {Name: "odash", CodePoints: []int{8861}, Characters: []byte{0xe2, 0x8a, 0x9d}}, + "odblac": {Name: "odblac", CodePoints: []int{337}, Characters: []byte{0xc5, 0x91}}, + "odiv": {Name: "odiv", CodePoints: []int{10808}, Characters: []byte{0xe2, 0xa8, 0xb8}}, + "odot": {Name: "odot", CodePoints: []int{8857}, Characters: []byte{0xe2, 0x8a, 0x99}}, + "odsold": {Name: "odsold", CodePoints: []int{10684}, Characters: []byte{0xe2, 0xa6, 0xbc}}, + "oelig": {Name: "oelig", CodePoints: []int{339}, Characters: []byte{0xc5, 0x93}}, + "ofcir": {Name: "ofcir", CodePoints: []int{10687}, Characters: []byte{0xe2, 0xa6, 0xbf}}, + "ofr": {Name: "ofr", CodePoints: []int{120108}, Characters: []byte{0xf0, 0x9d, 0x94, 0xac}}, + "ogon": {Name: "ogon", CodePoints: []int{731}, Characters: []byte{0xcb, 0x9b}}, + "ograve": {Name: "ograve", CodePoints: []int{242}, Characters: []byte{0xc3, 0xb2}}, + "ogt": {Name: "ogt", CodePoints: []int{10689}, Characters: []byte{0xe2, 0xa7, 0x81}}, + "ohbar": {Name: "ohbar", CodePoints: []int{10677}, Characters: []byte{0xe2, 0xa6, 0xb5}}, + "ohm": {Name: "ohm", CodePoints: []int{937}, Characters: []byte{0xce, 0xa9}}, + "oint": {Name: "oint", CodePoints: []int{8750}, Characters: []byte{0xe2, 0x88, 0xae}}, + "olarr": {Name: "olarr", CodePoints: []int{8634}, Characters: []byte{0xe2, 0x86, 0xba}}, + "olcir": {Name: "olcir", CodePoints: []int{10686}, Characters: []byte{0xe2, 0xa6, 0xbe}}, + "olcross": {Name: "olcross", CodePoints: []int{10683}, Characters: []byte{0xe2, 0xa6, 0xbb}}, + "oline": {Name: "oline", CodePoints: []int{8254}, Characters: []byte{0xe2, 0x80, 0xbe}}, + "olt": {Name: "olt", CodePoints: []int{10688}, Characters: []byte{0xe2, 0xa7, 0x80}}, + "omacr": {Name: "omacr", CodePoints: []int{333}, Characters: []byte{0xc5, 0x8d}}, + "omega": {Name: "omega", CodePoints: []int{969}, Characters: []byte{0xcf, 0x89}}, + "omicron": {Name: "omicron", CodePoints: []int{959}, Characters: []byte{0xce, 0xbf}}, + "omid": {Name: "omid", CodePoints: []int{10678}, Characters: []byte{0xe2, 0xa6, 0xb6}}, + "ominus": {Name: "ominus", CodePoints: []int{8854}, Characters: []byte{0xe2, 0x8a, 0x96}}, + "oopf": {Name: "oopf", CodePoints: []int{120160}, Characters: []byte{0xf0, 0x9d, 0x95, 0xa0}}, + "opar": {Name: "opar", CodePoints: []int{10679}, Characters: []byte{0xe2, 0xa6, 0xb7}}, + "operp": {Name: "operp", CodePoints: []int{10681}, Characters: []byte{0xe2, 0xa6, 0xb9}}, + "oplus": {Name: "oplus", CodePoints: []int{8853}, Characters: []byte{0xe2, 0x8a, 0x95}}, + "or": {Name: "or", CodePoints: []int{8744}, Characters: []byte{0xe2, 0x88, 0xa8}}, + "orarr": {Name: "orarr", CodePoints: []int{8635}, Characters: []byte{0xe2, 0x86, 0xbb}}, + "ord": {Name: "ord", CodePoints: []int{10845}, Characters: []byte{0xe2, 0xa9, 0x9d}}, + "order": {Name: "order", CodePoints: []int{8500}, Characters: []byte{0xe2, 0x84, 0xb4}}, + "orderof": {Name: "orderof", CodePoints: []int{8500}, Characters: []byte{0xe2, 0x84, 0xb4}}, + "ordf": {Name: "ordf", CodePoints: []int{170}, Characters: []byte{0xc2, 0xaa}}, + "ordm": {Name: "ordm", CodePoints: []int{186}, Characters: []byte{0xc2, 0xba}}, + "origof": {Name: "origof", CodePoints: []int{8886}, Characters: []byte{0xe2, 0x8a, 0xb6}}, + "oror": {Name: "oror", CodePoints: []int{10838}, Characters: []byte{0xe2, 0xa9, 0x96}}, + "orslope": {Name: "orslope", CodePoints: []int{10839}, Characters: []byte{0xe2, 0xa9, 0x97}}, + "orv": {Name: "orv", CodePoints: []int{10843}, Characters: []byte{0xe2, 0xa9, 0x9b}}, + "oscr": {Name: "oscr", CodePoints: []int{8500}, Characters: []byte{0xe2, 0x84, 0xb4}}, + "oslash": {Name: "oslash", CodePoints: []int{248}, Characters: []byte{0xc3, 0xb8}}, + "osol": {Name: "osol", CodePoints: []int{8856}, Characters: []byte{0xe2, 0x8a, 0x98}}, + "otilde": {Name: "otilde", CodePoints: []int{245}, Characters: []byte{0xc3, 0xb5}}, + "otimes": {Name: "otimes", CodePoints: []int{8855}, Characters: []byte{0xe2, 0x8a, 0x97}}, + "otimesas": {Name: "otimesas", CodePoints: []int{10806}, Characters: []byte{0xe2, 0xa8, 0xb6}}, + "ouml": {Name: "ouml", CodePoints: []int{246}, Characters: []byte{0xc3, 0xb6}}, + "ovbar": {Name: "ovbar", CodePoints: []int{9021}, Characters: []byte{0xe2, 0x8c, 0xbd}}, + "par": {Name: "par", CodePoints: []int{8741}, Characters: []byte{0xe2, 0x88, 0xa5}}, + "para": {Name: "para", CodePoints: []int{182}, Characters: []byte{0xc2, 0xb6}}, + "parallel": {Name: "parallel", CodePoints: []int{8741}, Characters: []byte{0xe2, 0x88, 0xa5}}, + "parsim": {Name: "parsim", CodePoints: []int{10995}, Characters: []byte{0xe2, 0xab, 0xb3}}, + "parsl": {Name: "parsl", CodePoints: []int{11005}, Characters: []byte{0xe2, 0xab, 0xbd}}, + "part": {Name: "part", CodePoints: []int{8706}, Characters: []byte{0xe2, 0x88, 0x82}}, + "pcy": {Name: "pcy", CodePoints: []int{1087}, Characters: []byte{0xd0, 0xbf}}, + "percnt": {Name: "percnt", CodePoints: []int{37}, Characters: []byte{0x25}}, + "period": {Name: "period", CodePoints: []int{46}, Characters: []byte{0x2e}}, + "permil": {Name: "permil", CodePoints: []int{8240}, Characters: []byte{0xe2, 0x80, 0xb0}}, + "perp": {Name: "perp", CodePoints: []int{8869}, Characters: []byte{0xe2, 0x8a, 0xa5}}, + "pertenk": {Name: "pertenk", CodePoints: []int{8241}, Characters: []byte{0xe2, 0x80, 0xb1}}, + "pfr": {Name: "pfr", CodePoints: []int{120109}, Characters: []byte{0xf0, 0x9d, 0x94, 0xad}}, + "phi": {Name: "phi", CodePoints: []int{966}, Characters: []byte{0xcf, 0x86}}, + "phiv": {Name: "phiv", CodePoints: []int{981}, Characters: []byte{0xcf, 0x95}}, + "phmmat": {Name: "phmmat", CodePoints: []int{8499}, Characters: []byte{0xe2, 0x84, 0xb3}}, + "phone": {Name: "phone", CodePoints: []int{9742}, Characters: []byte{0xe2, 0x98, 0x8e}}, + "pi": {Name: "pi", CodePoints: []int{960}, Characters: []byte{0xcf, 0x80}}, + "pitchfork": {Name: "pitchfork", CodePoints: []int{8916}, Characters: []byte{0xe2, 0x8b, 0x94}}, + "piv": {Name: "piv", CodePoints: []int{982}, Characters: []byte{0xcf, 0x96}}, + "planck": {Name: "planck", CodePoints: []int{8463}, Characters: []byte{0xe2, 0x84, 0x8f}}, + "planckh": {Name: "planckh", CodePoints: []int{8462}, Characters: []byte{0xe2, 0x84, 0x8e}}, + "plankv": {Name: "plankv", CodePoints: []int{8463}, Characters: []byte{0xe2, 0x84, 0x8f}}, + "plus": {Name: "plus", CodePoints: []int{43}, Characters: []byte{0x2b}}, + "plusacir": {Name: "plusacir", CodePoints: []int{10787}, Characters: []byte{0xe2, 0xa8, 0xa3}}, + "plusb": {Name: "plusb", CodePoints: []int{8862}, Characters: []byte{0xe2, 0x8a, 0x9e}}, + "pluscir": {Name: "pluscir", CodePoints: []int{10786}, Characters: []byte{0xe2, 0xa8, 0xa2}}, + "plusdo": {Name: "plusdo", CodePoints: []int{8724}, Characters: []byte{0xe2, 0x88, 0x94}}, + "plusdu": {Name: "plusdu", CodePoints: []int{10789}, Characters: []byte{0xe2, 0xa8, 0xa5}}, + "pluse": {Name: "pluse", CodePoints: []int{10866}, Characters: []byte{0xe2, 0xa9, 0xb2}}, + "plusmn": {Name: "plusmn", CodePoints: []int{177}, Characters: []byte{0xc2, 0xb1}}, + "plussim": {Name: "plussim", CodePoints: []int{10790}, Characters: []byte{0xe2, 0xa8, 0xa6}}, + "plustwo": {Name: "plustwo", CodePoints: []int{10791}, Characters: []byte{0xe2, 0xa8, 0xa7}}, + "pm": {Name: "pm", CodePoints: []int{177}, Characters: []byte{0xc2, 0xb1}}, + "pointint": {Name: "pointint", CodePoints: []int{10773}, Characters: []byte{0xe2, 0xa8, 0x95}}, + "popf": {Name: "popf", CodePoints: []int{120161}, Characters: []byte{0xf0, 0x9d, 0x95, 0xa1}}, + "pound": {Name: "pound", CodePoints: []int{163}, Characters: []byte{0xc2, 0xa3}}, + "pr": {Name: "pr", CodePoints: []int{8826}, Characters: []byte{0xe2, 0x89, 0xba}}, + "prE": {Name: "prE", CodePoints: []int{10931}, Characters: []byte{0xe2, 0xaa, 0xb3}}, + "prap": {Name: "prap", CodePoints: []int{10935}, Characters: []byte{0xe2, 0xaa, 0xb7}}, + "prcue": {Name: "prcue", CodePoints: []int{8828}, Characters: []byte{0xe2, 0x89, 0xbc}}, + "pre": {Name: "pre", CodePoints: []int{10927}, Characters: []byte{0xe2, 0xaa, 0xaf}}, + "prec": {Name: "prec", CodePoints: []int{8826}, Characters: []byte{0xe2, 0x89, 0xba}}, + "precapprox": {Name: "precapprox", CodePoints: []int{10935}, Characters: []byte{0xe2, 0xaa, 0xb7}}, + "preccurlyeq": {Name: "preccurlyeq", CodePoints: []int{8828}, Characters: []byte{0xe2, 0x89, 0xbc}}, + "preceq": {Name: "preceq", CodePoints: []int{10927}, Characters: []byte{0xe2, 0xaa, 0xaf}}, + "precnapprox": {Name: "precnapprox", CodePoints: []int{10937}, Characters: []byte{0xe2, 0xaa, 0xb9}}, + "precneqq": {Name: "precneqq", CodePoints: []int{10933}, Characters: []byte{0xe2, 0xaa, 0xb5}}, + "precnsim": {Name: "precnsim", CodePoints: []int{8936}, Characters: []byte{0xe2, 0x8b, 0xa8}}, + "precsim": {Name: "precsim", CodePoints: []int{8830}, Characters: []byte{0xe2, 0x89, 0xbe}}, + "prime": {Name: "prime", CodePoints: []int{8242}, Characters: []byte{0xe2, 0x80, 0xb2}}, + "primes": {Name: "primes", CodePoints: []int{8473}, Characters: []byte{0xe2, 0x84, 0x99}}, + "prnE": {Name: "prnE", CodePoints: []int{10933}, Characters: []byte{0xe2, 0xaa, 0xb5}}, + "prnap": {Name: "prnap", CodePoints: []int{10937}, Characters: []byte{0xe2, 0xaa, 0xb9}}, + "prnsim": {Name: "prnsim", CodePoints: []int{8936}, Characters: []byte{0xe2, 0x8b, 0xa8}}, + "prod": {Name: "prod", CodePoints: []int{8719}, Characters: []byte{0xe2, 0x88, 0x8f}}, + "profalar": {Name: "profalar", CodePoints: []int{9006}, Characters: []byte{0xe2, 0x8c, 0xae}}, + "profline": {Name: "profline", CodePoints: []int{8978}, Characters: []byte{0xe2, 0x8c, 0x92}}, + "profsurf": {Name: "profsurf", CodePoints: []int{8979}, Characters: []byte{0xe2, 0x8c, 0x93}}, + "prop": {Name: "prop", CodePoints: []int{8733}, Characters: []byte{0xe2, 0x88, 0x9d}}, + "propto": {Name: "propto", CodePoints: []int{8733}, Characters: []byte{0xe2, 0x88, 0x9d}}, + "prsim": {Name: "prsim", CodePoints: []int{8830}, Characters: []byte{0xe2, 0x89, 0xbe}}, + "prurel": {Name: "prurel", CodePoints: []int{8880}, Characters: []byte{0xe2, 0x8a, 0xb0}}, + "pscr": {Name: "pscr", CodePoints: []int{120005}, Characters: []byte{0xf0, 0x9d, 0x93, 0x85}}, + "psi": {Name: "psi", CodePoints: []int{968}, Characters: []byte{0xcf, 0x88}}, + "puncsp": {Name: "puncsp", CodePoints: []int{8200}, Characters: []byte{0xe2, 0x80, 0x88}}, + "qfr": {Name: "qfr", CodePoints: []int{120110}, Characters: []byte{0xf0, 0x9d, 0x94, 0xae}}, + "qint": {Name: "qint", CodePoints: []int{10764}, Characters: []byte{0xe2, 0xa8, 0x8c}}, + "qopf": {Name: "qopf", CodePoints: []int{120162}, Characters: []byte{0xf0, 0x9d, 0x95, 0xa2}}, + "qprime": {Name: "qprime", CodePoints: []int{8279}, Characters: []byte{0xe2, 0x81, 0x97}}, + "qscr": {Name: "qscr", CodePoints: []int{120006}, Characters: []byte{0xf0, 0x9d, 0x93, 0x86}}, + "quaternions": {Name: "quaternions", CodePoints: []int{8461}, Characters: []byte{0xe2, 0x84, 0x8d}}, + "quatint": {Name: "quatint", CodePoints: []int{10774}, Characters: []byte{0xe2, 0xa8, 0x96}}, + "quest": {Name: "quest", CodePoints: []int{63}, Characters: []byte{0x3f}}, + "questeq": {Name: "questeq", CodePoints: []int{8799}, Characters: []byte{0xe2, 0x89, 0x9f}}, + "quot": {Name: "quot", CodePoints: []int{34}, Characters: []byte{0x22}}, + "rAarr": {Name: "rAarr", CodePoints: []int{8667}, Characters: []byte{0xe2, 0x87, 0x9b}}, + "rArr": {Name: "rArr", CodePoints: []int{8658}, Characters: []byte{0xe2, 0x87, 0x92}}, + "rAtail": {Name: "rAtail", CodePoints: []int{10524}, Characters: []byte{0xe2, 0xa4, 0x9c}}, + "rBarr": {Name: "rBarr", CodePoints: []int{10511}, Characters: []byte{0xe2, 0xa4, 0x8f}}, + "rHar": {Name: "rHar", CodePoints: []int{10596}, Characters: []byte{0xe2, 0xa5, 0xa4}}, + "race": {Name: "race", CodePoints: []int{8765, 817}, Characters: []byte{0xe2, 0x88, 0xbd, 0xcc, 0xb1}}, + "racute": {Name: "racute", CodePoints: []int{341}, Characters: []byte{0xc5, 0x95}}, + "radic": {Name: "radic", CodePoints: []int{8730}, Characters: []byte{0xe2, 0x88, 0x9a}}, + "raemptyv": {Name: "raemptyv", CodePoints: []int{10675}, Characters: []byte{0xe2, 0xa6, 0xb3}}, + "rang": {Name: "rang", CodePoints: []int{10217}, Characters: []byte{0xe2, 0x9f, 0xa9}}, + "rangd": {Name: "rangd", CodePoints: []int{10642}, Characters: []byte{0xe2, 0xa6, 0x92}}, + "range": {Name: "range", CodePoints: []int{10661}, Characters: []byte{0xe2, 0xa6, 0xa5}}, + "rangle": {Name: "rangle", CodePoints: []int{10217}, Characters: []byte{0xe2, 0x9f, 0xa9}}, + "raquo": {Name: "raquo", CodePoints: []int{187}, Characters: []byte{0xc2, 0xbb}}, + "rarr": {Name: "rarr", CodePoints: []int{8594}, Characters: []byte{0xe2, 0x86, 0x92}}, + "rarrap": {Name: "rarrap", CodePoints: []int{10613}, Characters: []byte{0xe2, 0xa5, 0xb5}}, + "rarrb": {Name: "rarrb", CodePoints: []int{8677}, Characters: []byte{0xe2, 0x87, 0xa5}}, + "rarrbfs": {Name: "rarrbfs", CodePoints: []int{10528}, Characters: []byte{0xe2, 0xa4, 0xa0}}, + "rarrc": {Name: "rarrc", CodePoints: []int{10547}, Characters: []byte{0xe2, 0xa4, 0xb3}}, + "rarrfs": {Name: "rarrfs", CodePoints: []int{10526}, Characters: []byte{0xe2, 0xa4, 0x9e}}, + "rarrhk": {Name: "rarrhk", CodePoints: []int{8618}, Characters: []byte{0xe2, 0x86, 0xaa}}, + "rarrlp": {Name: "rarrlp", CodePoints: []int{8620}, Characters: []byte{0xe2, 0x86, 0xac}}, + "rarrpl": {Name: "rarrpl", CodePoints: []int{10565}, Characters: []byte{0xe2, 0xa5, 0x85}}, + "rarrsim": {Name: "rarrsim", CodePoints: []int{10612}, Characters: []byte{0xe2, 0xa5, 0xb4}}, + "rarrtl": {Name: "rarrtl", CodePoints: []int{8611}, Characters: []byte{0xe2, 0x86, 0xa3}}, + "rarrw": {Name: "rarrw", CodePoints: []int{8605}, Characters: []byte{0xe2, 0x86, 0x9d}}, + "ratail": {Name: "ratail", CodePoints: []int{10522}, Characters: []byte{0xe2, 0xa4, 0x9a}}, + "ratio": {Name: "ratio", CodePoints: []int{8758}, Characters: []byte{0xe2, 0x88, 0xb6}}, + "rationals": {Name: "rationals", CodePoints: []int{8474}, Characters: []byte{0xe2, 0x84, 0x9a}}, + "rbarr": {Name: "rbarr", CodePoints: []int{10509}, Characters: []byte{0xe2, 0xa4, 0x8d}}, + "rbbrk": {Name: "rbbrk", CodePoints: []int{10099}, Characters: []byte{0xe2, 0x9d, 0xb3}}, + "rbrace": {Name: "rbrace", CodePoints: []int{125}, Characters: []byte{0x7d}}, + "rbrack": {Name: "rbrack", CodePoints: []int{93}, Characters: []byte{0x5d}}, + "rbrke": {Name: "rbrke", CodePoints: []int{10636}, Characters: []byte{0xe2, 0xa6, 0x8c}}, + "rbrksld": {Name: "rbrksld", CodePoints: []int{10638}, Characters: []byte{0xe2, 0xa6, 0x8e}}, + "rbrkslu": {Name: "rbrkslu", CodePoints: []int{10640}, Characters: []byte{0xe2, 0xa6, 0x90}}, + "rcaron": {Name: "rcaron", CodePoints: []int{345}, Characters: []byte{0xc5, 0x99}}, + "rcedil": {Name: "rcedil", CodePoints: []int{343}, Characters: []byte{0xc5, 0x97}}, + "rceil": {Name: "rceil", CodePoints: []int{8969}, Characters: []byte{0xe2, 0x8c, 0x89}}, + "rcub": {Name: "rcub", CodePoints: []int{125}, Characters: []byte{0x7d}}, + "rcy": {Name: "rcy", CodePoints: []int{1088}, Characters: []byte{0xd1, 0x80}}, + "rdca": {Name: "rdca", CodePoints: []int{10551}, Characters: []byte{0xe2, 0xa4, 0xb7}}, + "rdldhar": {Name: "rdldhar", CodePoints: []int{10601}, Characters: []byte{0xe2, 0xa5, 0xa9}}, + "rdquo": {Name: "rdquo", CodePoints: []int{8221}, Characters: []byte{0xe2, 0x80, 0x9d}}, + "rdquor": {Name: "rdquor", CodePoints: []int{8221}, Characters: []byte{0xe2, 0x80, 0x9d}}, + "rdsh": {Name: "rdsh", CodePoints: []int{8627}, Characters: []byte{0xe2, 0x86, 0xb3}}, + "real": {Name: "real", CodePoints: []int{8476}, Characters: []byte{0xe2, 0x84, 0x9c}}, + "realine": {Name: "realine", CodePoints: []int{8475}, Characters: []byte{0xe2, 0x84, 0x9b}}, + "realpart": {Name: "realpart", CodePoints: []int{8476}, Characters: []byte{0xe2, 0x84, 0x9c}}, + "reals": {Name: "reals", CodePoints: []int{8477}, Characters: []byte{0xe2, 0x84, 0x9d}}, + "rect": {Name: "rect", CodePoints: []int{9645}, Characters: []byte{0xe2, 0x96, 0xad}}, + "reg": {Name: "reg", CodePoints: []int{174}, Characters: []byte{0xc2, 0xae}}, + "rfisht": {Name: "rfisht", CodePoints: []int{10621}, Characters: []byte{0xe2, 0xa5, 0xbd}}, + "rfloor": {Name: "rfloor", CodePoints: []int{8971}, Characters: []byte{0xe2, 0x8c, 0x8b}}, + "rfr": {Name: "rfr", CodePoints: []int{120111}, Characters: []byte{0xf0, 0x9d, 0x94, 0xaf}}, + "rhard": {Name: "rhard", CodePoints: []int{8641}, Characters: []byte{0xe2, 0x87, 0x81}}, + "rharu": {Name: "rharu", CodePoints: []int{8640}, Characters: []byte{0xe2, 0x87, 0x80}}, + "rharul": {Name: "rharul", CodePoints: []int{10604}, Characters: []byte{0xe2, 0xa5, 0xac}}, + "rho": {Name: "rho", CodePoints: []int{961}, Characters: []byte{0xcf, 0x81}}, + "rhov": {Name: "rhov", CodePoints: []int{1009}, Characters: []byte{0xcf, 0xb1}}, + "rightarrow": {Name: "rightarrow", CodePoints: []int{8594}, Characters: []byte{0xe2, 0x86, 0x92}}, + "rightarrowtail": {Name: "rightarrowtail", CodePoints: []int{8611}, Characters: []byte{0xe2, 0x86, 0xa3}}, + "rightharpoondown": {Name: "rightharpoondown", CodePoints: []int{8641}, Characters: []byte{0xe2, 0x87, 0x81}}, + "rightharpoonup": {Name: "rightharpoonup", CodePoints: []int{8640}, Characters: []byte{0xe2, 0x87, 0x80}}, + "rightleftarrows": {Name: "rightleftarrows", CodePoints: []int{8644}, Characters: []byte{0xe2, 0x87, 0x84}}, + "rightleftharpoons": {Name: "rightleftharpoons", CodePoints: []int{8652}, Characters: []byte{0xe2, 0x87, 0x8c}}, + "rightrightarrows": {Name: "rightrightarrows", CodePoints: []int{8649}, Characters: []byte{0xe2, 0x87, 0x89}}, + "rightsquigarrow": {Name: "rightsquigarrow", CodePoints: []int{8605}, Characters: []byte{0xe2, 0x86, 0x9d}}, + "rightthreetimes": {Name: "rightthreetimes", CodePoints: []int{8908}, Characters: []byte{0xe2, 0x8b, 0x8c}}, + "ring": {Name: "ring", CodePoints: []int{730}, Characters: []byte{0xcb, 0x9a}}, + "risingdotseq": {Name: "risingdotseq", CodePoints: []int{8787}, Characters: []byte{0xe2, 0x89, 0x93}}, + "rlarr": {Name: "rlarr", CodePoints: []int{8644}, Characters: []byte{0xe2, 0x87, 0x84}}, + "rlhar": {Name: "rlhar", CodePoints: []int{8652}, Characters: []byte{0xe2, 0x87, 0x8c}}, + "rlm": {Name: "rlm", CodePoints: []int{8207}, Characters: []byte{0xe2, 0x80, 0x8f}}, + "rmoust": {Name: "rmoust", CodePoints: []int{9137}, Characters: []byte{0xe2, 0x8e, 0xb1}}, + "rmoustache": {Name: "rmoustache", CodePoints: []int{9137}, Characters: []byte{0xe2, 0x8e, 0xb1}}, + "rnmid": {Name: "rnmid", CodePoints: []int{10990}, Characters: []byte{0xe2, 0xab, 0xae}}, + "roang": {Name: "roang", CodePoints: []int{10221}, Characters: []byte{0xe2, 0x9f, 0xad}}, + "roarr": {Name: "roarr", CodePoints: []int{8702}, Characters: []byte{0xe2, 0x87, 0xbe}}, + "robrk": {Name: "robrk", CodePoints: []int{10215}, Characters: []byte{0xe2, 0x9f, 0xa7}}, + "ropar": {Name: "ropar", CodePoints: []int{10630}, Characters: []byte{0xe2, 0xa6, 0x86}}, + "ropf": {Name: "ropf", CodePoints: []int{120163}, Characters: []byte{0xf0, 0x9d, 0x95, 0xa3}}, + "roplus": {Name: "roplus", CodePoints: []int{10798}, Characters: []byte{0xe2, 0xa8, 0xae}}, + "rotimes": {Name: "rotimes", CodePoints: []int{10805}, Characters: []byte{0xe2, 0xa8, 0xb5}}, + "rpar": {Name: "rpar", CodePoints: []int{41}, Characters: []byte{0x29}}, + "rpargt": {Name: "rpargt", CodePoints: []int{10644}, Characters: []byte{0xe2, 0xa6, 0x94}}, + "rppolint": {Name: "rppolint", CodePoints: []int{10770}, Characters: []byte{0xe2, 0xa8, 0x92}}, + "rrarr": {Name: "rrarr", CodePoints: []int{8649}, Characters: []byte{0xe2, 0x87, 0x89}}, + "rsaquo": {Name: "rsaquo", CodePoints: []int{8250}, Characters: []byte{0xe2, 0x80, 0xba}}, + "rscr": {Name: "rscr", CodePoints: []int{120007}, Characters: []byte{0xf0, 0x9d, 0x93, 0x87}}, + "rsh": {Name: "rsh", CodePoints: []int{8625}, Characters: []byte{0xe2, 0x86, 0xb1}}, + "rsqb": {Name: "rsqb", CodePoints: []int{93}, Characters: []byte{0x5d}}, + "rsquo": {Name: "rsquo", CodePoints: []int{8217}, Characters: []byte{0xe2, 0x80, 0x99}}, + "rsquor": {Name: "rsquor", CodePoints: []int{8217}, Characters: []byte{0xe2, 0x80, 0x99}}, + "rthree": {Name: "rthree", CodePoints: []int{8908}, Characters: []byte{0xe2, 0x8b, 0x8c}}, + "rtimes": {Name: "rtimes", CodePoints: []int{8906}, Characters: []byte{0xe2, 0x8b, 0x8a}}, + "rtri": {Name: "rtri", CodePoints: []int{9657}, Characters: []byte{0xe2, 0x96, 0xb9}}, + "rtrie": {Name: "rtrie", CodePoints: []int{8885}, Characters: []byte{0xe2, 0x8a, 0xb5}}, + "rtrif": {Name: "rtrif", CodePoints: []int{9656}, Characters: []byte{0xe2, 0x96, 0xb8}}, + "rtriltri": {Name: "rtriltri", CodePoints: []int{10702}, Characters: []byte{0xe2, 0xa7, 0x8e}}, + "ruluhar": {Name: "ruluhar", CodePoints: []int{10600}, Characters: []byte{0xe2, 0xa5, 0xa8}}, + "rx": {Name: "rx", CodePoints: []int{8478}, Characters: []byte{0xe2, 0x84, 0x9e}}, + "sacute": {Name: "sacute", CodePoints: []int{347}, Characters: []byte{0xc5, 0x9b}}, + "sbquo": {Name: "sbquo", CodePoints: []int{8218}, Characters: []byte{0xe2, 0x80, 0x9a}}, + "sc": {Name: "sc", CodePoints: []int{8827}, Characters: []byte{0xe2, 0x89, 0xbb}}, + "scE": {Name: "scE", CodePoints: []int{10932}, Characters: []byte{0xe2, 0xaa, 0xb4}}, + "scap": {Name: "scap", CodePoints: []int{10936}, Characters: []byte{0xe2, 0xaa, 0xb8}}, + "scaron": {Name: "scaron", CodePoints: []int{353}, Characters: []byte{0xc5, 0xa1}}, + "sccue": {Name: "sccue", CodePoints: []int{8829}, Characters: []byte{0xe2, 0x89, 0xbd}}, + "sce": {Name: "sce", CodePoints: []int{10928}, Characters: []byte{0xe2, 0xaa, 0xb0}}, + "scedil": {Name: "scedil", CodePoints: []int{351}, Characters: []byte{0xc5, 0x9f}}, + "scirc": {Name: "scirc", CodePoints: []int{349}, Characters: []byte{0xc5, 0x9d}}, + "scnE": {Name: "scnE", CodePoints: []int{10934}, Characters: []byte{0xe2, 0xaa, 0xb6}}, + "scnap": {Name: "scnap", CodePoints: []int{10938}, Characters: []byte{0xe2, 0xaa, 0xba}}, + "scnsim": {Name: "scnsim", CodePoints: []int{8937}, Characters: []byte{0xe2, 0x8b, 0xa9}}, + "scpolint": {Name: "scpolint", CodePoints: []int{10771}, Characters: []byte{0xe2, 0xa8, 0x93}}, + "scsim": {Name: "scsim", CodePoints: []int{8831}, Characters: []byte{0xe2, 0x89, 0xbf}}, + "scy": {Name: "scy", CodePoints: []int{1089}, Characters: []byte{0xd1, 0x81}}, + "sdot": {Name: "sdot", CodePoints: []int{8901}, Characters: []byte{0xe2, 0x8b, 0x85}}, + "sdotb": {Name: "sdotb", CodePoints: []int{8865}, Characters: []byte{0xe2, 0x8a, 0xa1}}, + "sdote": {Name: "sdote", CodePoints: []int{10854}, Characters: []byte{0xe2, 0xa9, 0xa6}}, + "seArr": {Name: "seArr", CodePoints: []int{8664}, Characters: []byte{0xe2, 0x87, 0x98}}, + "searhk": {Name: "searhk", CodePoints: []int{10533}, Characters: []byte{0xe2, 0xa4, 0xa5}}, + "searr": {Name: "searr", CodePoints: []int{8600}, Characters: []byte{0xe2, 0x86, 0x98}}, + "searrow": {Name: "searrow", CodePoints: []int{8600}, Characters: []byte{0xe2, 0x86, 0x98}}, + "sect": {Name: "sect", CodePoints: []int{167}, Characters: []byte{0xc2, 0xa7}}, + "semi": {Name: "semi", CodePoints: []int{59}, Characters: []byte{0x3b}}, + "seswar": {Name: "seswar", CodePoints: []int{10537}, Characters: []byte{0xe2, 0xa4, 0xa9}}, + "setminus": {Name: "setminus", CodePoints: []int{8726}, Characters: []byte{0xe2, 0x88, 0x96}}, + "setmn": {Name: "setmn", CodePoints: []int{8726}, Characters: []byte{0xe2, 0x88, 0x96}}, + "sext": {Name: "sext", CodePoints: []int{10038}, Characters: []byte{0xe2, 0x9c, 0xb6}}, + "sfr": {Name: "sfr", CodePoints: []int{120112}, Characters: []byte{0xf0, 0x9d, 0x94, 0xb0}}, + "sfrown": {Name: "sfrown", CodePoints: []int{8994}, Characters: []byte{0xe2, 0x8c, 0xa2}}, + "sharp": {Name: "sharp", CodePoints: []int{9839}, Characters: []byte{0xe2, 0x99, 0xaf}}, + "shchcy": {Name: "shchcy", CodePoints: []int{1097}, Characters: []byte{0xd1, 0x89}}, + "shcy": {Name: "shcy", CodePoints: []int{1096}, Characters: []byte{0xd1, 0x88}}, + "shortmid": {Name: "shortmid", CodePoints: []int{8739}, Characters: []byte{0xe2, 0x88, 0xa3}}, + "shortparallel": {Name: "shortparallel", CodePoints: []int{8741}, Characters: []byte{0xe2, 0x88, 0xa5}}, + "shy": {Name: "shy", CodePoints: []int{173}, Characters: []byte{0xc2, 0xad}}, + "sigma": {Name: "sigma", CodePoints: []int{963}, Characters: []byte{0xcf, 0x83}}, + "sigmaf": {Name: "sigmaf", CodePoints: []int{962}, Characters: []byte{0xcf, 0x82}}, + "sigmav": {Name: "sigmav", CodePoints: []int{962}, Characters: []byte{0xcf, 0x82}}, + "sim": {Name: "sim", CodePoints: []int{8764}, Characters: []byte{0xe2, 0x88, 0xbc}}, + "simdot": {Name: "simdot", CodePoints: []int{10858}, Characters: []byte{0xe2, 0xa9, 0xaa}}, + "sime": {Name: "sime", CodePoints: []int{8771}, Characters: []byte{0xe2, 0x89, 0x83}}, + "simeq": {Name: "simeq", CodePoints: []int{8771}, Characters: []byte{0xe2, 0x89, 0x83}}, + "simg": {Name: "simg", CodePoints: []int{10910}, Characters: []byte{0xe2, 0xaa, 0x9e}}, + "simgE": {Name: "simgE", CodePoints: []int{10912}, Characters: []byte{0xe2, 0xaa, 0xa0}}, + "siml": {Name: "siml", CodePoints: []int{10909}, Characters: []byte{0xe2, 0xaa, 0x9d}}, + "simlE": {Name: "simlE", CodePoints: []int{10911}, Characters: []byte{0xe2, 0xaa, 0x9f}}, + "simne": {Name: "simne", CodePoints: []int{8774}, Characters: []byte{0xe2, 0x89, 0x86}}, + "simplus": {Name: "simplus", CodePoints: []int{10788}, Characters: []byte{0xe2, 0xa8, 0xa4}}, + "simrarr": {Name: "simrarr", CodePoints: []int{10610}, Characters: []byte{0xe2, 0xa5, 0xb2}}, + "slarr": {Name: "slarr", CodePoints: []int{8592}, Characters: []byte{0xe2, 0x86, 0x90}}, + "smallsetminus": {Name: "smallsetminus", CodePoints: []int{8726}, Characters: []byte{0xe2, 0x88, 0x96}}, + "smashp": {Name: "smashp", CodePoints: []int{10803}, Characters: []byte{0xe2, 0xa8, 0xb3}}, + "smeparsl": {Name: "smeparsl", CodePoints: []int{10724}, Characters: []byte{0xe2, 0xa7, 0xa4}}, + "smid": {Name: "smid", CodePoints: []int{8739}, Characters: []byte{0xe2, 0x88, 0xa3}}, + "smile": {Name: "smile", CodePoints: []int{8995}, Characters: []byte{0xe2, 0x8c, 0xa3}}, + "smt": {Name: "smt", CodePoints: []int{10922}, Characters: []byte{0xe2, 0xaa, 0xaa}}, + "smte": {Name: "smte", CodePoints: []int{10924}, Characters: []byte{0xe2, 0xaa, 0xac}}, + "smtes": {Name: "smtes", CodePoints: []int{10924, 65024}, Characters: []byte{0xe2, 0xaa, 0xac, 0xef, 0xb8, 0x80}}, + "softcy": {Name: "softcy", CodePoints: []int{1100}, Characters: []byte{0xd1, 0x8c}}, + "sol": {Name: "sol", CodePoints: []int{47}, Characters: []byte{0x2f}}, + "solb": {Name: "solb", CodePoints: []int{10692}, Characters: []byte{0xe2, 0xa7, 0x84}}, + "solbar": {Name: "solbar", CodePoints: []int{9023}, Characters: []byte{0xe2, 0x8c, 0xbf}}, + "sopf": {Name: "sopf", CodePoints: []int{120164}, Characters: []byte{0xf0, 0x9d, 0x95, 0xa4}}, + "spades": {Name: "spades", CodePoints: []int{9824}, Characters: []byte{0xe2, 0x99, 0xa0}}, + "spadesuit": {Name: "spadesuit", CodePoints: []int{9824}, Characters: []byte{0xe2, 0x99, 0xa0}}, + "spar": {Name: "spar", CodePoints: []int{8741}, Characters: []byte{0xe2, 0x88, 0xa5}}, + "sqcap": {Name: "sqcap", CodePoints: []int{8851}, Characters: []byte{0xe2, 0x8a, 0x93}}, + "sqcaps": {Name: "sqcaps", CodePoints: []int{8851, 65024}, Characters: []byte{0xe2, 0x8a, 0x93, 0xef, 0xb8, 0x80}}, + "sqcup": {Name: "sqcup", CodePoints: []int{8852}, Characters: []byte{0xe2, 0x8a, 0x94}}, + "sqcups": {Name: "sqcups", CodePoints: []int{8852, 65024}, Characters: []byte{0xe2, 0x8a, 0x94, 0xef, 0xb8, 0x80}}, + "sqsub": {Name: "sqsub", CodePoints: []int{8847}, Characters: []byte{0xe2, 0x8a, 0x8f}}, + "sqsube": {Name: "sqsube", CodePoints: []int{8849}, Characters: []byte{0xe2, 0x8a, 0x91}}, + "sqsubset": {Name: "sqsubset", CodePoints: []int{8847}, Characters: []byte{0xe2, 0x8a, 0x8f}}, + "sqsubseteq": {Name: "sqsubseteq", CodePoints: []int{8849}, Characters: []byte{0xe2, 0x8a, 0x91}}, + "sqsup": {Name: "sqsup", CodePoints: []int{8848}, Characters: []byte{0xe2, 0x8a, 0x90}}, + "sqsupe": {Name: "sqsupe", CodePoints: []int{8850}, Characters: []byte{0xe2, 0x8a, 0x92}}, + "sqsupset": {Name: "sqsupset", CodePoints: []int{8848}, Characters: []byte{0xe2, 0x8a, 0x90}}, + "sqsupseteq": {Name: "sqsupseteq", CodePoints: []int{8850}, Characters: []byte{0xe2, 0x8a, 0x92}}, + "squ": {Name: "squ", CodePoints: []int{9633}, Characters: []byte{0xe2, 0x96, 0xa1}}, + "square": {Name: "square", CodePoints: []int{9633}, Characters: []byte{0xe2, 0x96, 0xa1}}, + "squarf": {Name: "squarf", CodePoints: []int{9642}, Characters: []byte{0xe2, 0x96, 0xaa}}, + "squf": {Name: "squf", CodePoints: []int{9642}, Characters: []byte{0xe2, 0x96, 0xaa}}, + "srarr": {Name: "srarr", CodePoints: []int{8594}, Characters: []byte{0xe2, 0x86, 0x92}}, + "sscr": {Name: "sscr", CodePoints: []int{120008}, Characters: []byte{0xf0, 0x9d, 0x93, 0x88}}, + "ssetmn": {Name: "ssetmn", CodePoints: []int{8726}, Characters: []byte{0xe2, 0x88, 0x96}}, + "ssmile": {Name: "ssmile", CodePoints: []int{8995}, Characters: []byte{0xe2, 0x8c, 0xa3}}, + "sstarf": {Name: "sstarf", CodePoints: []int{8902}, Characters: []byte{0xe2, 0x8b, 0x86}}, + "star": {Name: "star", CodePoints: []int{9734}, Characters: []byte{0xe2, 0x98, 0x86}}, + "starf": {Name: "starf", CodePoints: []int{9733}, Characters: []byte{0xe2, 0x98, 0x85}}, + "straightepsilon": {Name: "straightepsilon", CodePoints: []int{1013}, Characters: []byte{0xcf, 0xb5}}, + "straightphi": {Name: "straightphi", CodePoints: []int{981}, Characters: []byte{0xcf, 0x95}}, + "strns": {Name: "strns", CodePoints: []int{175}, Characters: []byte{0xc2, 0xaf}}, + "sub": {Name: "sub", CodePoints: []int{8834}, Characters: []byte{0xe2, 0x8a, 0x82}}, + "subE": {Name: "subE", CodePoints: []int{10949}, Characters: []byte{0xe2, 0xab, 0x85}}, + "subdot": {Name: "subdot", CodePoints: []int{10941}, Characters: []byte{0xe2, 0xaa, 0xbd}}, + "sube": {Name: "sube", CodePoints: []int{8838}, Characters: []byte{0xe2, 0x8a, 0x86}}, + "subedot": {Name: "subedot", CodePoints: []int{10947}, Characters: []byte{0xe2, 0xab, 0x83}}, + "submult": {Name: "submult", CodePoints: []int{10945}, Characters: []byte{0xe2, 0xab, 0x81}}, + "subnE": {Name: "subnE", CodePoints: []int{10955}, Characters: []byte{0xe2, 0xab, 0x8b}}, + "subne": {Name: "subne", CodePoints: []int{8842}, Characters: []byte{0xe2, 0x8a, 0x8a}}, + "subplus": {Name: "subplus", CodePoints: []int{10943}, Characters: []byte{0xe2, 0xaa, 0xbf}}, + "subrarr": {Name: "subrarr", CodePoints: []int{10617}, Characters: []byte{0xe2, 0xa5, 0xb9}}, + "subset": {Name: "subset", CodePoints: []int{8834}, Characters: []byte{0xe2, 0x8a, 0x82}}, + "subseteq": {Name: "subseteq", CodePoints: []int{8838}, Characters: []byte{0xe2, 0x8a, 0x86}}, + "subseteqq": {Name: "subseteqq", CodePoints: []int{10949}, Characters: []byte{0xe2, 0xab, 0x85}}, + "subsetneq": {Name: "subsetneq", CodePoints: []int{8842}, Characters: []byte{0xe2, 0x8a, 0x8a}}, + "subsetneqq": {Name: "subsetneqq", CodePoints: []int{10955}, Characters: []byte{0xe2, 0xab, 0x8b}}, + "subsim": {Name: "subsim", CodePoints: []int{10951}, Characters: []byte{0xe2, 0xab, 0x87}}, + "subsub": {Name: "subsub", CodePoints: []int{10965}, Characters: []byte{0xe2, 0xab, 0x95}}, + "subsup": {Name: "subsup", CodePoints: []int{10963}, Characters: []byte{0xe2, 0xab, 0x93}}, + "succ": {Name: "succ", CodePoints: []int{8827}, Characters: []byte{0xe2, 0x89, 0xbb}}, + "succapprox": {Name: "succapprox", CodePoints: []int{10936}, Characters: []byte{0xe2, 0xaa, 0xb8}}, + "succcurlyeq": {Name: "succcurlyeq", CodePoints: []int{8829}, Characters: []byte{0xe2, 0x89, 0xbd}}, + "succeq": {Name: "succeq", CodePoints: []int{10928}, Characters: []byte{0xe2, 0xaa, 0xb0}}, + "succnapprox": {Name: "succnapprox", CodePoints: []int{10938}, Characters: []byte{0xe2, 0xaa, 0xba}}, + "succneqq": {Name: "succneqq", CodePoints: []int{10934}, Characters: []byte{0xe2, 0xaa, 0xb6}}, + "succnsim": {Name: "succnsim", CodePoints: []int{8937}, Characters: []byte{0xe2, 0x8b, 0xa9}}, + "succsim": {Name: "succsim", CodePoints: []int{8831}, Characters: []byte{0xe2, 0x89, 0xbf}}, + "sum": {Name: "sum", CodePoints: []int{8721}, Characters: []byte{0xe2, 0x88, 0x91}}, + "sung": {Name: "sung", CodePoints: []int{9834}, Characters: []byte{0xe2, 0x99, 0xaa}}, + "sup": {Name: "sup", CodePoints: []int{8835}, Characters: []byte{0xe2, 0x8a, 0x83}}, + "sup1": {Name: "sup1", CodePoints: []int{185}, Characters: []byte{0xc2, 0xb9}}, + "sup2": {Name: "sup2", CodePoints: []int{178}, Characters: []byte{0xc2, 0xb2}}, + "sup3": {Name: "sup3", CodePoints: []int{179}, Characters: []byte{0xc2, 0xb3}}, + "supE": {Name: "supE", CodePoints: []int{10950}, Characters: []byte{0xe2, 0xab, 0x86}}, + "supdot": {Name: "supdot", CodePoints: []int{10942}, Characters: []byte{0xe2, 0xaa, 0xbe}}, + "supdsub": {Name: "supdsub", CodePoints: []int{10968}, Characters: []byte{0xe2, 0xab, 0x98}}, + "supe": {Name: "supe", CodePoints: []int{8839}, Characters: []byte{0xe2, 0x8a, 0x87}}, + "supedot": {Name: "supedot", CodePoints: []int{10948}, Characters: []byte{0xe2, 0xab, 0x84}}, + "suphsol": {Name: "suphsol", CodePoints: []int{10185}, Characters: []byte{0xe2, 0x9f, 0x89}}, + "suphsub": {Name: "suphsub", CodePoints: []int{10967}, Characters: []byte{0xe2, 0xab, 0x97}}, + "suplarr": {Name: "suplarr", CodePoints: []int{10619}, Characters: []byte{0xe2, 0xa5, 0xbb}}, + "supmult": {Name: "supmult", CodePoints: []int{10946}, Characters: []byte{0xe2, 0xab, 0x82}}, + "supnE": {Name: "supnE", CodePoints: []int{10956}, Characters: []byte{0xe2, 0xab, 0x8c}}, + "supne": {Name: "supne", CodePoints: []int{8843}, Characters: []byte{0xe2, 0x8a, 0x8b}}, + "supplus": {Name: "supplus", CodePoints: []int{10944}, Characters: []byte{0xe2, 0xab, 0x80}}, + "supset": {Name: "supset", CodePoints: []int{8835}, Characters: []byte{0xe2, 0x8a, 0x83}}, + "supseteq": {Name: "supseteq", CodePoints: []int{8839}, Characters: []byte{0xe2, 0x8a, 0x87}}, + "supseteqq": {Name: "supseteqq", CodePoints: []int{10950}, Characters: []byte{0xe2, 0xab, 0x86}}, + "supsetneq": {Name: "supsetneq", CodePoints: []int{8843}, Characters: []byte{0xe2, 0x8a, 0x8b}}, + "supsetneqq": {Name: "supsetneqq", CodePoints: []int{10956}, Characters: []byte{0xe2, 0xab, 0x8c}}, + "supsim": {Name: "supsim", CodePoints: []int{10952}, Characters: []byte{0xe2, 0xab, 0x88}}, + "supsub": {Name: "supsub", CodePoints: []int{10964}, Characters: []byte{0xe2, 0xab, 0x94}}, + "supsup": {Name: "supsup", CodePoints: []int{10966}, Characters: []byte{0xe2, 0xab, 0x96}}, + "swArr": {Name: "swArr", CodePoints: []int{8665}, Characters: []byte{0xe2, 0x87, 0x99}}, + "swarhk": {Name: "swarhk", CodePoints: []int{10534}, Characters: []byte{0xe2, 0xa4, 0xa6}}, + "swarr": {Name: "swarr", CodePoints: []int{8601}, Characters: []byte{0xe2, 0x86, 0x99}}, + "swarrow": {Name: "swarrow", CodePoints: []int{8601}, Characters: []byte{0xe2, 0x86, 0x99}}, + "swnwar": {Name: "swnwar", CodePoints: []int{10538}, Characters: []byte{0xe2, 0xa4, 0xaa}}, + "szlig": {Name: "szlig", CodePoints: []int{223}, Characters: []byte{0xc3, 0x9f}}, + "target": {Name: "target", CodePoints: []int{8982}, Characters: []byte{0xe2, 0x8c, 0x96}}, + "tau": {Name: "tau", CodePoints: []int{964}, Characters: []byte{0xcf, 0x84}}, + "tbrk": {Name: "tbrk", CodePoints: []int{9140}, Characters: []byte{0xe2, 0x8e, 0xb4}}, + "tcaron": {Name: "tcaron", CodePoints: []int{357}, Characters: []byte{0xc5, 0xa5}}, + "tcedil": {Name: "tcedil", CodePoints: []int{355}, Characters: []byte{0xc5, 0xa3}}, + "tcy": {Name: "tcy", CodePoints: []int{1090}, Characters: []byte{0xd1, 0x82}}, + "tdot": {Name: "tdot", CodePoints: []int{8411}, Characters: []byte{0xe2, 0x83, 0x9b}}, + "telrec": {Name: "telrec", CodePoints: []int{8981}, Characters: []byte{0xe2, 0x8c, 0x95}}, + "tfr": {Name: "tfr", CodePoints: []int{120113}, Characters: []byte{0xf0, 0x9d, 0x94, 0xb1}}, + "there4": {Name: "there4", CodePoints: []int{8756}, Characters: []byte{0xe2, 0x88, 0xb4}}, + "therefore": {Name: "therefore", CodePoints: []int{8756}, Characters: []byte{0xe2, 0x88, 0xb4}}, + "theta": {Name: "theta", CodePoints: []int{952}, Characters: []byte{0xce, 0xb8}}, + "thetasym": {Name: "thetasym", CodePoints: []int{977}, Characters: []byte{0xcf, 0x91}}, + "thetav": {Name: "thetav", CodePoints: []int{977}, Characters: []byte{0xcf, 0x91}}, + "thickapprox": {Name: "thickapprox", CodePoints: []int{8776}, Characters: []byte{0xe2, 0x89, 0x88}}, + "thicksim": {Name: "thicksim", CodePoints: []int{8764}, Characters: []byte{0xe2, 0x88, 0xbc}}, + "thinsp": {Name: "thinsp", CodePoints: []int{8201}, Characters: []byte{0xe2, 0x80, 0x89}}, + "thkap": {Name: "thkap", CodePoints: []int{8776}, Characters: []byte{0xe2, 0x89, 0x88}}, + "thksim": {Name: "thksim", CodePoints: []int{8764}, Characters: []byte{0xe2, 0x88, 0xbc}}, + "thorn": {Name: "thorn", CodePoints: []int{254}, Characters: []byte{0xc3, 0xbe}}, + "tilde": {Name: "tilde", CodePoints: []int{732}, Characters: []byte{0xcb, 0x9c}}, + "times": {Name: "times", CodePoints: []int{215}, Characters: []byte{0xc3, 0x97}}, + "timesb": {Name: "timesb", CodePoints: []int{8864}, Characters: []byte{0xe2, 0x8a, 0xa0}}, + "timesbar": {Name: "timesbar", CodePoints: []int{10801}, Characters: []byte{0xe2, 0xa8, 0xb1}}, + "timesd": {Name: "timesd", CodePoints: []int{10800}, Characters: []byte{0xe2, 0xa8, 0xb0}}, + "tint": {Name: "tint", CodePoints: []int{8749}, Characters: []byte{0xe2, 0x88, 0xad}}, + "toea": {Name: "toea", CodePoints: []int{10536}, Characters: []byte{0xe2, 0xa4, 0xa8}}, + "top": {Name: "top", CodePoints: []int{8868}, Characters: []byte{0xe2, 0x8a, 0xa4}}, + "topbot": {Name: "topbot", CodePoints: []int{9014}, Characters: []byte{0xe2, 0x8c, 0xb6}}, + "topcir": {Name: "topcir", CodePoints: []int{10993}, Characters: []byte{0xe2, 0xab, 0xb1}}, + "topf": {Name: "topf", CodePoints: []int{120165}, Characters: []byte{0xf0, 0x9d, 0x95, 0xa5}}, + "topfork": {Name: "topfork", CodePoints: []int{10970}, Characters: []byte{0xe2, 0xab, 0x9a}}, + "tosa": {Name: "tosa", CodePoints: []int{10537}, Characters: []byte{0xe2, 0xa4, 0xa9}}, + "tprime": {Name: "tprime", CodePoints: []int{8244}, Characters: []byte{0xe2, 0x80, 0xb4}}, + "trade": {Name: "trade", CodePoints: []int{8482}, Characters: []byte{0xe2, 0x84, 0xa2}}, + "triangle": {Name: "triangle", CodePoints: []int{9653}, Characters: []byte{0xe2, 0x96, 0xb5}}, + "triangledown": {Name: "triangledown", CodePoints: []int{9663}, Characters: []byte{0xe2, 0x96, 0xbf}}, + "triangleleft": {Name: "triangleleft", CodePoints: []int{9667}, Characters: []byte{0xe2, 0x97, 0x83}}, + "trianglelefteq": {Name: "trianglelefteq", CodePoints: []int{8884}, Characters: []byte{0xe2, 0x8a, 0xb4}}, + "triangleq": {Name: "triangleq", CodePoints: []int{8796}, Characters: []byte{0xe2, 0x89, 0x9c}}, + "triangleright": {Name: "triangleright", CodePoints: []int{9657}, Characters: []byte{0xe2, 0x96, 0xb9}}, + "trianglerighteq": {Name: "trianglerighteq", CodePoints: []int{8885}, Characters: []byte{0xe2, 0x8a, 0xb5}}, + "tridot": {Name: "tridot", CodePoints: []int{9708}, Characters: []byte{0xe2, 0x97, 0xac}}, + "trie": {Name: "trie", CodePoints: []int{8796}, Characters: []byte{0xe2, 0x89, 0x9c}}, + "triminus": {Name: "triminus", CodePoints: []int{10810}, Characters: []byte{0xe2, 0xa8, 0xba}}, + "triplus": {Name: "triplus", CodePoints: []int{10809}, Characters: []byte{0xe2, 0xa8, 0xb9}}, + "trisb": {Name: "trisb", CodePoints: []int{10701}, Characters: []byte{0xe2, 0xa7, 0x8d}}, + "tritime": {Name: "tritime", CodePoints: []int{10811}, Characters: []byte{0xe2, 0xa8, 0xbb}}, + "trpezium": {Name: "trpezium", CodePoints: []int{9186}, Characters: []byte{0xe2, 0x8f, 0xa2}}, + "tscr": {Name: "tscr", CodePoints: []int{120009}, Characters: []byte{0xf0, 0x9d, 0x93, 0x89}}, + "tscy": {Name: "tscy", CodePoints: []int{1094}, Characters: []byte{0xd1, 0x86}}, + "tshcy": {Name: "tshcy", CodePoints: []int{1115}, Characters: []byte{0xd1, 0x9b}}, + "tstrok": {Name: "tstrok", CodePoints: []int{359}, Characters: []byte{0xc5, 0xa7}}, + "twixt": {Name: "twixt", CodePoints: []int{8812}, Characters: []byte{0xe2, 0x89, 0xac}}, + "twoheadleftarrow": {Name: "twoheadleftarrow", CodePoints: []int{8606}, Characters: []byte{0xe2, 0x86, 0x9e}}, + "twoheadrightarrow": {Name: "twoheadrightarrow", CodePoints: []int{8608}, Characters: []byte{0xe2, 0x86, 0xa0}}, + "uArr": {Name: "uArr", CodePoints: []int{8657}, Characters: []byte{0xe2, 0x87, 0x91}}, + "uHar": {Name: "uHar", CodePoints: []int{10595}, Characters: []byte{0xe2, 0xa5, 0xa3}}, + "uacute": {Name: "uacute", CodePoints: []int{250}, Characters: []byte{0xc3, 0xba}}, + "uarr": {Name: "uarr", CodePoints: []int{8593}, Characters: []byte{0xe2, 0x86, 0x91}}, + "ubrcy": {Name: "ubrcy", CodePoints: []int{1118}, Characters: []byte{0xd1, 0x9e}}, + "ubreve": {Name: "ubreve", CodePoints: []int{365}, Characters: []byte{0xc5, 0xad}}, + "ucirc": {Name: "ucirc", CodePoints: []int{251}, Characters: []byte{0xc3, 0xbb}}, + "ucy": {Name: "ucy", CodePoints: []int{1091}, Characters: []byte{0xd1, 0x83}}, + "udarr": {Name: "udarr", CodePoints: []int{8645}, Characters: []byte{0xe2, 0x87, 0x85}}, + "udblac": {Name: "udblac", CodePoints: []int{369}, Characters: []byte{0xc5, 0xb1}}, + "udhar": {Name: "udhar", CodePoints: []int{10606}, Characters: []byte{0xe2, 0xa5, 0xae}}, + "ufisht": {Name: "ufisht", CodePoints: []int{10622}, Characters: []byte{0xe2, 0xa5, 0xbe}}, + "ufr": {Name: "ufr", CodePoints: []int{120114}, Characters: []byte{0xf0, 0x9d, 0x94, 0xb2}}, + "ugrave": {Name: "ugrave", CodePoints: []int{249}, Characters: []byte{0xc3, 0xb9}}, + "uharl": {Name: "uharl", CodePoints: []int{8639}, Characters: []byte{0xe2, 0x86, 0xbf}}, + "uharr": {Name: "uharr", CodePoints: []int{8638}, Characters: []byte{0xe2, 0x86, 0xbe}}, + "uhblk": {Name: "uhblk", CodePoints: []int{9600}, Characters: []byte{0xe2, 0x96, 0x80}}, + "ulcorn": {Name: "ulcorn", CodePoints: []int{8988}, Characters: []byte{0xe2, 0x8c, 0x9c}}, + "ulcorner": {Name: "ulcorner", CodePoints: []int{8988}, Characters: []byte{0xe2, 0x8c, 0x9c}}, + "ulcrop": {Name: "ulcrop", CodePoints: []int{8975}, Characters: []byte{0xe2, 0x8c, 0x8f}}, + "ultri": {Name: "ultri", CodePoints: []int{9720}, Characters: []byte{0xe2, 0x97, 0xb8}}, + "umacr": {Name: "umacr", CodePoints: []int{363}, Characters: []byte{0xc5, 0xab}}, + "uml": {Name: "uml", CodePoints: []int{168}, Characters: []byte{0xc2, 0xa8}}, + "uogon": {Name: "uogon", CodePoints: []int{371}, Characters: []byte{0xc5, 0xb3}}, + "uopf": {Name: "uopf", CodePoints: []int{120166}, Characters: []byte{0xf0, 0x9d, 0x95, 0xa6}}, + "uparrow": {Name: "uparrow", CodePoints: []int{8593}, Characters: []byte{0xe2, 0x86, 0x91}}, + "updownarrow": {Name: "updownarrow", CodePoints: []int{8597}, Characters: []byte{0xe2, 0x86, 0x95}}, + "upharpoonleft": {Name: "upharpoonleft", CodePoints: []int{8639}, Characters: []byte{0xe2, 0x86, 0xbf}}, + "upharpoonright": {Name: "upharpoonright", CodePoints: []int{8638}, Characters: []byte{0xe2, 0x86, 0xbe}}, + "uplus": {Name: "uplus", CodePoints: []int{8846}, Characters: []byte{0xe2, 0x8a, 0x8e}}, + "upsi": {Name: "upsi", CodePoints: []int{965}, Characters: []byte{0xcf, 0x85}}, + "upsih": {Name: "upsih", CodePoints: []int{978}, Characters: []byte{0xcf, 0x92}}, + "upsilon": {Name: "upsilon", CodePoints: []int{965}, Characters: []byte{0xcf, 0x85}}, + "upuparrows": {Name: "upuparrows", CodePoints: []int{8648}, Characters: []byte{0xe2, 0x87, 0x88}}, + "urcorn": {Name: "urcorn", CodePoints: []int{8989}, Characters: []byte{0xe2, 0x8c, 0x9d}}, + "urcorner": {Name: "urcorner", CodePoints: []int{8989}, Characters: []byte{0xe2, 0x8c, 0x9d}}, + "urcrop": {Name: "urcrop", CodePoints: []int{8974}, Characters: []byte{0xe2, 0x8c, 0x8e}}, + "uring": {Name: "uring", CodePoints: []int{367}, Characters: []byte{0xc5, 0xaf}}, + "urtri": {Name: "urtri", CodePoints: []int{9721}, Characters: []byte{0xe2, 0x97, 0xb9}}, + "uscr": {Name: "uscr", CodePoints: []int{120010}, Characters: []byte{0xf0, 0x9d, 0x93, 0x8a}}, + "utdot": {Name: "utdot", CodePoints: []int{8944}, Characters: []byte{0xe2, 0x8b, 0xb0}}, + "utilde": {Name: "utilde", CodePoints: []int{361}, Characters: []byte{0xc5, 0xa9}}, + "utri": {Name: "utri", CodePoints: []int{9653}, Characters: []byte{0xe2, 0x96, 0xb5}}, + "utrif": {Name: "utrif", CodePoints: []int{9652}, Characters: []byte{0xe2, 0x96, 0xb4}}, + "uuarr": {Name: "uuarr", CodePoints: []int{8648}, Characters: []byte{0xe2, 0x87, 0x88}}, + "uuml": {Name: "uuml", CodePoints: []int{252}, Characters: []byte{0xc3, 0xbc}}, + "uwangle": {Name: "uwangle", CodePoints: []int{10663}, Characters: []byte{0xe2, 0xa6, 0xa7}}, + "vArr": {Name: "vArr", CodePoints: []int{8661}, Characters: []byte{0xe2, 0x87, 0x95}}, + "vBar": {Name: "vBar", CodePoints: []int{10984}, Characters: []byte{0xe2, 0xab, 0xa8}}, + "vBarv": {Name: "vBarv", CodePoints: []int{10985}, Characters: []byte{0xe2, 0xab, 0xa9}}, + "vDash": {Name: "vDash", CodePoints: []int{8872}, Characters: []byte{0xe2, 0x8a, 0xa8}}, + "vangrt": {Name: "vangrt", CodePoints: []int{10652}, Characters: []byte{0xe2, 0xa6, 0x9c}}, + "varepsilon": {Name: "varepsilon", CodePoints: []int{1013}, Characters: []byte{0xcf, 0xb5}}, + "varkappa": {Name: "varkappa", CodePoints: []int{1008}, Characters: []byte{0xcf, 0xb0}}, + "varnothing": {Name: "varnothing", CodePoints: []int{8709}, Characters: []byte{0xe2, 0x88, 0x85}}, + "varphi": {Name: "varphi", CodePoints: []int{981}, Characters: []byte{0xcf, 0x95}}, + "varpi": {Name: "varpi", CodePoints: []int{982}, Characters: []byte{0xcf, 0x96}}, + "varpropto": {Name: "varpropto", CodePoints: []int{8733}, Characters: []byte{0xe2, 0x88, 0x9d}}, + "varr": {Name: "varr", CodePoints: []int{8597}, Characters: []byte{0xe2, 0x86, 0x95}}, + "varrho": {Name: "varrho", CodePoints: []int{1009}, Characters: []byte{0xcf, 0xb1}}, + "varsigma": {Name: "varsigma", CodePoints: []int{962}, Characters: []byte{0xcf, 0x82}}, + "varsubsetneq": {Name: "varsubsetneq", CodePoints: []int{8842, 65024}, Characters: []byte{0xe2, 0x8a, 0x8a, 0xef, 0xb8, 0x80}}, + "varsubsetneqq": {Name: "varsubsetneqq", CodePoints: []int{10955, 65024}, Characters: []byte{0xe2, 0xab, 0x8b, 0xef, 0xb8, 0x80}}, + "varsupsetneq": {Name: "varsupsetneq", CodePoints: []int{8843, 65024}, Characters: []byte{0xe2, 0x8a, 0x8b, 0xef, 0xb8, 0x80}}, + "varsupsetneqq": {Name: "varsupsetneqq", CodePoints: []int{10956, 65024}, Characters: []byte{0xe2, 0xab, 0x8c, 0xef, 0xb8, 0x80}}, + "vartheta": {Name: "vartheta", CodePoints: []int{977}, Characters: []byte{0xcf, 0x91}}, + "vartriangleleft": {Name: "vartriangleleft", CodePoints: []int{8882}, Characters: []byte{0xe2, 0x8a, 0xb2}}, + "vartriangleright": {Name: "vartriangleright", CodePoints: []int{8883}, Characters: []byte{0xe2, 0x8a, 0xb3}}, + "vcy": {Name: "vcy", CodePoints: []int{1074}, Characters: []byte{0xd0, 0xb2}}, + "vdash": {Name: "vdash", CodePoints: []int{8866}, Characters: []byte{0xe2, 0x8a, 0xa2}}, + "vee": {Name: "vee", CodePoints: []int{8744}, Characters: []byte{0xe2, 0x88, 0xa8}}, + "veebar": {Name: "veebar", CodePoints: []int{8891}, Characters: []byte{0xe2, 0x8a, 0xbb}}, + "veeeq": {Name: "veeeq", CodePoints: []int{8794}, Characters: []byte{0xe2, 0x89, 0x9a}}, + "vellip": {Name: "vellip", CodePoints: []int{8942}, Characters: []byte{0xe2, 0x8b, 0xae}}, + "verbar": {Name: "verbar", CodePoints: []int{124}, Characters: []byte{0x7c}}, + "vert": {Name: "vert", CodePoints: []int{124}, Characters: []byte{0x7c}}, + "vfr": {Name: "vfr", CodePoints: []int{120115}, Characters: []byte{0xf0, 0x9d, 0x94, 0xb3}}, + "vltri": {Name: "vltri", CodePoints: []int{8882}, Characters: []byte{0xe2, 0x8a, 0xb2}}, + "vnsub": {Name: "vnsub", CodePoints: []int{8834, 8402}, Characters: []byte{0xe2, 0x8a, 0x82, 0xe2, 0x83, 0x92}}, + "vnsup": {Name: "vnsup", CodePoints: []int{8835, 8402}, Characters: []byte{0xe2, 0x8a, 0x83, 0xe2, 0x83, 0x92}}, + "vopf": {Name: "vopf", CodePoints: []int{120167}, Characters: []byte{0xf0, 0x9d, 0x95, 0xa7}}, + "vprop": {Name: "vprop", CodePoints: []int{8733}, Characters: []byte{0xe2, 0x88, 0x9d}}, + "vrtri": {Name: "vrtri", CodePoints: []int{8883}, Characters: []byte{0xe2, 0x8a, 0xb3}}, + "vscr": {Name: "vscr", CodePoints: []int{120011}, Characters: []byte{0xf0, 0x9d, 0x93, 0x8b}}, + "vsubnE": {Name: "vsubnE", CodePoints: []int{10955, 65024}, Characters: []byte{0xe2, 0xab, 0x8b, 0xef, 0xb8, 0x80}}, + "vsubne": {Name: "vsubne", CodePoints: []int{8842, 65024}, Characters: []byte{0xe2, 0x8a, 0x8a, 0xef, 0xb8, 0x80}}, + "vsupnE": {Name: "vsupnE", CodePoints: []int{10956, 65024}, Characters: []byte{0xe2, 0xab, 0x8c, 0xef, 0xb8, 0x80}}, + "vsupne": {Name: "vsupne", CodePoints: []int{8843, 65024}, Characters: []byte{0xe2, 0x8a, 0x8b, 0xef, 0xb8, 0x80}}, + "vzigzag": {Name: "vzigzag", CodePoints: []int{10650}, Characters: []byte{0xe2, 0xa6, 0x9a}}, + "wcirc": {Name: "wcirc", CodePoints: []int{373}, Characters: []byte{0xc5, 0xb5}}, + "wedbar": {Name: "wedbar", CodePoints: []int{10847}, Characters: []byte{0xe2, 0xa9, 0x9f}}, + "wedge": {Name: "wedge", CodePoints: []int{8743}, Characters: []byte{0xe2, 0x88, 0xa7}}, + "wedgeq": {Name: "wedgeq", CodePoints: []int{8793}, Characters: []byte{0xe2, 0x89, 0x99}}, + "weierp": {Name: "weierp", CodePoints: []int{8472}, Characters: []byte{0xe2, 0x84, 0x98}}, + "wfr": {Name: "wfr", CodePoints: []int{120116}, Characters: []byte{0xf0, 0x9d, 0x94, 0xb4}}, + "wopf": {Name: "wopf", CodePoints: []int{120168}, Characters: []byte{0xf0, 0x9d, 0x95, 0xa8}}, + "wp": {Name: "wp", CodePoints: []int{8472}, Characters: []byte{0xe2, 0x84, 0x98}}, + "wr": {Name: "wr", CodePoints: []int{8768}, Characters: []byte{0xe2, 0x89, 0x80}}, + "wreath": {Name: "wreath", CodePoints: []int{8768}, Characters: []byte{0xe2, 0x89, 0x80}}, + "wscr": {Name: "wscr", CodePoints: []int{120012}, Characters: []byte{0xf0, 0x9d, 0x93, 0x8c}}, + "xcap": {Name: "xcap", CodePoints: []int{8898}, Characters: []byte{0xe2, 0x8b, 0x82}}, + "xcirc": {Name: "xcirc", CodePoints: []int{9711}, Characters: []byte{0xe2, 0x97, 0xaf}}, + "xcup": {Name: "xcup", CodePoints: []int{8899}, Characters: []byte{0xe2, 0x8b, 0x83}}, + "xdtri": {Name: "xdtri", CodePoints: []int{9661}, Characters: []byte{0xe2, 0x96, 0xbd}}, + "xfr": {Name: "xfr", CodePoints: []int{120117}, Characters: []byte{0xf0, 0x9d, 0x94, 0xb5}}, + "xhArr": {Name: "xhArr", CodePoints: []int{10234}, Characters: []byte{0xe2, 0x9f, 0xba}}, + "xharr": {Name: "xharr", CodePoints: []int{10231}, Characters: []byte{0xe2, 0x9f, 0xb7}}, + "xi": {Name: "xi", CodePoints: []int{958}, Characters: []byte{0xce, 0xbe}}, + "xlArr": {Name: "xlArr", CodePoints: []int{10232}, Characters: []byte{0xe2, 0x9f, 0xb8}}, + "xlarr": {Name: "xlarr", CodePoints: []int{10229}, Characters: []byte{0xe2, 0x9f, 0xb5}}, + "xmap": {Name: "xmap", CodePoints: []int{10236}, Characters: []byte{0xe2, 0x9f, 0xbc}}, + "xnis": {Name: "xnis", CodePoints: []int{8955}, Characters: []byte{0xe2, 0x8b, 0xbb}}, + "xodot": {Name: "xodot", CodePoints: []int{10752}, Characters: []byte{0xe2, 0xa8, 0x80}}, + "xopf": {Name: "xopf", CodePoints: []int{120169}, Characters: []byte{0xf0, 0x9d, 0x95, 0xa9}}, + "xoplus": {Name: "xoplus", CodePoints: []int{10753}, Characters: []byte{0xe2, 0xa8, 0x81}}, + "xotime": {Name: "xotime", CodePoints: []int{10754}, Characters: []byte{0xe2, 0xa8, 0x82}}, + "xrArr": {Name: "xrArr", CodePoints: []int{10233}, Characters: []byte{0xe2, 0x9f, 0xb9}}, + "xrarr": {Name: "xrarr", CodePoints: []int{10230}, Characters: []byte{0xe2, 0x9f, 0xb6}}, + "xscr": {Name: "xscr", CodePoints: []int{120013}, Characters: []byte{0xf0, 0x9d, 0x93, 0x8d}}, + "xsqcup": {Name: "xsqcup", CodePoints: []int{10758}, Characters: []byte{0xe2, 0xa8, 0x86}}, + "xuplus": {Name: "xuplus", CodePoints: []int{10756}, Characters: []byte{0xe2, 0xa8, 0x84}}, + "xutri": {Name: "xutri", CodePoints: []int{9651}, Characters: []byte{0xe2, 0x96, 0xb3}}, + "xvee": {Name: "xvee", CodePoints: []int{8897}, Characters: []byte{0xe2, 0x8b, 0x81}}, + "xwedge": {Name: "xwedge", CodePoints: []int{8896}, Characters: []byte{0xe2, 0x8b, 0x80}}, + "yacute": {Name: "yacute", CodePoints: []int{253}, Characters: []byte{0xc3, 0xbd}}, + "yacy": {Name: "yacy", CodePoints: []int{1103}, Characters: []byte{0xd1, 0x8f}}, + "ycirc": {Name: "ycirc", CodePoints: []int{375}, Characters: []byte{0xc5, 0xb7}}, + "ycy": {Name: "ycy", CodePoints: []int{1099}, Characters: []byte{0xd1, 0x8b}}, + "yen": {Name: "yen", CodePoints: []int{165}, Characters: []byte{0xc2, 0xa5}}, + "yfr": {Name: "yfr", CodePoints: []int{120118}, Characters: []byte{0xf0, 0x9d, 0x94, 0xb6}}, + "yicy": {Name: "yicy", CodePoints: []int{1111}, Characters: []byte{0xd1, 0x97}}, + "yopf": {Name: "yopf", CodePoints: []int{120170}, Characters: []byte{0xf0, 0x9d, 0x95, 0xaa}}, + "yscr": {Name: "yscr", CodePoints: []int{120014}, Characters: []byte{0xf0, 0x9d, 0x93, 0x8e}}, + "yucy": {Name: "yucy", CodePoints: []int{1102}, Characters: []byte{0xd1, 0x8e}}, + "yuml": {Name: "yuml", CodePoints: []int{255}, Characters: []byte{0xc3, 0xbf}}, + "zacute": {Name: "zacute", CodePoints: []int{378}, Characters: []byte{0xc5, 0xba}}, + "zcaron": {Name: "zcaron", CodePoints: []int{382}, Characters: []byte{0xc5, 0xbe}}, + "zcy": {Name: "zcy", CodePoints: []int{1079}, Characters: []byte{0xd0, 0xb7}}, + "zdot": {Name: "zdot", CodePoints: []int{380}, Characters: []byte{0xc5, 0xbc}}, + "zeetrf": {Name: "zeetrf", CodePoints: []int{8488}, Characters: []byte{0xe2, 0x84, 0xa8}}, + "zeta": {Name: "zeta", CodePoints: []int{950}, Characters: []byte{0xce, 0xb6}}, + "zfr": {Name: "zfr", CodePoints: []int{120119}, Characters: []byte{0xf0, 0x9d, 0x94, 0xb7}}, + "zhcy": {Name: "zhcy", CodePoints: []int{1078}, Characters: []byte{0xd0, 0xb6}}, + "zigrarr": {Name: "zigrarr", CodePoints: []int{8669}, Characters: []byte{0xe2, 0x87, 0x9d}}, + "zopf": {Name: "zopf", CodePoints: []int{120171}, Characters: []byte{0xf0, 0x9d, 0x95, 0xab}}, + "zscr": {Name: "zscr", CodePoints: []int{120015}, Characters: []byte{0xf0, 0x9d, 0x93, 0x8f}}, + "zwj": {Name: "zwj", CodePoints: []int{8205}, Characters: []byte{0xe2, 0x80, 0x8d}}, + "zwnj": {Name: "zwnj", CodePoints: []int{8204}, Characters: []byte{0xe2, 0x80, 0x8c}}, +} diff --git a/vendor/github.com/yuin/goldmark/util/unicode_case_folding.go b/vendor/github.com/yuin/goldmark/util/unicode_case_folding.go new file mode 100644 index 0000000..ab93ba4 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/util/unicode_case_folding.go @@ -0,0 +1,1535 @@ +//nolint:all +package util + +var unicodeCaseFoldings = map[rune][]rune{ + 0x41: []int32{97}, + 0x42: []int32{98}, + 0x43: []int32{99}, + 0x44: []int32{100}, + 0x45: []int32{101}, + 0x46: []int32{102}, + 0x47: []int32{103}, + 0x48: []int32{104}, + 0x49: []int32{105}, + 0x4a: []int32{106}, + 0x4b: []int32{107}, + 0x4c: []int32{108}, + 0x4d: []int32{109}, + 0x4e: []int32{110}, + 0x4f: []int32{111}, + 0x50: []int32{112}, + 0x51: []int32{113}, + 0x52: []int32{114}, + 0x53: []int32{115}, + 0x54: []int32{116}, + 0x55: []int32{117}, + 0x56: []int32{118}, + 0x57: []int32{119}, + 0x58: []int32{120}, + 0x59: []int32{121}, + 0x5a: []int32{122}, + 0xb5: []int32{956}, + 0xc0: []int32{224}, + 0xc1: []int32{225}, + 0xc2: []int32{226}, + 0xc3: []int32{227}, + 0xc4: []int32{228}, + 0xc5: []int32{229}, + 0xc6: []int32{230}, + 0xc7: []int32{231}, + 0xc8: []int32{232}, + 0xc9: []int32{233}, + 0xca: []int32{234}, + 0xcb: []int32{235}, + 0xcc: []int32{236}, + 0xcd: []int32{237}, + 0xce: []int32{238}, + 0xcf: []int32{239}, + 0xd0: []int32{240}, + 0xd1: []int32{241}, + 0xd2: []int32{242}, + 0xd3: []int32{243}, + 0xd4: []int32{244}, + 0xd5: []int32{245}, + 0xd6: []int32{246}, + 0xd8: []int32{248}, + 0xd9: []int32{249}, + 0xda: []int32{250}, + 0xdb: []int32{251}, + 0xdc: []int32{252}, + 0xdd: []int32{253}, + 0xde: []int32{254}, + 0xdf: []int32{115, 115}, + 0x100: []int32{257}, + 0x102: []int32{259}, + 0x104: []int32{261}, + 0x106: []int32{263}, + 0x108: []int32{265}, + 0x10a: []int32{267}, + 0x10c: []int32{269}, + 0x10e: []int32{271}, + 0x110: []int32{273}, + 0x112: []int32{275}, + 0x114: []int32{277}, + 0x116: []int32{279}, + 0x118: []int32{281}, + 0x11a: []int32{283}, + 0x11c: []int32{285}, + 0x11e: []int32{287}, + 0x120: []int32{289}, + 0x122: []int32{291}, + 0x124: []int32{293}, + 0x126: []int32{295}, + 0x128: []int32{297}, + 0x12a: []int32{299}, + 0x12c: []int32{301}, + 0x12e: []int32{303}, + 0x130: []int32{105, 775}, + 0x132: []int32{307}, + 0x134: []int32{309}, + 0x136: []int32{311}, + 0x139: []int32{314}, + 0x13b: []int32{316}, + 0x13d: []int32{318}, + 0x13f: []int32{320}, + 0x141: []int32{322}, + 0x143: []int32{324}, + 0x145: []int32{326}, + 0x147: []int32{328}, + 0x149: []int32{700, 110}, + 0x14a: []int32{331}, + 0x14c: []int32{333}, + 0x14e: []int32{335}, + 0x150: []int32{337}, + 0x152: []int32{339}, + 0x154: []int32{341}, + 0x156: []int32{343}, + 0x158: []int32{345}, + 0x15a: []int32{347}, + 0x15c: []int32{349}, + 0x15e: []int32{351}, + 0x160: []int32{353}, + 0x162: []int32{355}, + 0x164: []int32{357}, + 0x166: []int32{359}, + 0x168: []int32{361}, + 0x16a: []int32{363}, + 0x16c: []int32{365}, + 0x16e: []int32{367}, + 0x170: []int32{369}, + 0x172: []int32{371}, + 0x174: []int32{373}, + 0x176: []int32{375}, + 0x178: []int32{255}, + 0x179: []int32{378}, + 0x17b: []int32{380}, + 0x17d: []int32{382}, + 0x17f: []int32{115}, + 0x181: []int32{595}, + 0x182: []int32{387}, + 0x184: []int32{389}, + 0x186: []int32{596}, + 0x187: []int32{392}, + 0x189: []int32{598}, + 0x18a: []int32{599}, + 0x18b: []int32{396}, + 0x18e: []int32{477}, + 0x18f: []int32{601}, + 0x190: []int32{603}, + 0x191: []int32{402}, + 0x193: []int32{608}, + 0x194: []int32{611}, + 0x196: []int32{617}, + 0x197: []int32{616}, + 0x198: []int32{409}, + 0x19c: []int32{623}, + 0x19d: []int32{626}, + 0x19f: []int32{629}, + 0x1a0: []int32{417}, + 0x1a2: []int32{419}, + 0x1a4: []int32{421}, + 0x1a6: []int32{640}, + 0x1a7: []int32{424}, + 0x1a9: []int32{643}, + 0x1ac: []int32{429}, + 0x1ae: []int32{648}, + 0x1af: []int32{432}, + 0x1b1: []int32{650}, + 0x1b2: []int32{651}, + 0x1b3: []int32{436}, + 0x1b5: []int32{438}, + 0x1b7: []int32{658}, + 0x1b8: []int32{441}, + 0x1bc: []int32{445}, + 0x1c4: []int32{454}, + 0x1c5: []int32{454}, + 0x1c7: []int32{457}, + 0x1c8: []int32{457}, + 0x1ca: []int32{460}, + 0x1cb: []int32{460}, + 0x1cd: []int32{462}, + 0x1cf: []int32{464}, + 0x1d1: []int32{466}, + 0x1d3: []int32{468}, + 0x1d5: []int32{470}, + 0x1d7: []int32{472}, + 0x1d9: []int32{474}, + 0x1db: []int32{476}, + 0x1de: []int32{479}, + 0x1e0: []int32{481}, + 0x1e2: []int32{483}, + 0x1e4: []int32{485}, + 0x1e6: []int32{487}, + 0x1e8: []int32{489}, + 0x1ea: []int32{491}, + 0x1ec: []int32{493}, + 0x1ee: []int32{495}, + 0x1f0: []int32{106, 780}, + 0x1f1: []int32{499}, + 0x1f2: []int32{499}, + 0x1f4: []int32{501}, + 0x1f6: []int32{405}, + 0x1f7: []int32{447}, + 0x1f8: []int32{505}, + 0x1fa: []int32{507}, + 0x1fc: []int32{509}, + 0x1fe: []int32{511}, + 0x200: []int32{513}, + 0x202: []int32{515}, + 0x204: []int32{517}, + 0x206: []int32{519}, + 0x208: []int32{521}, + 0x20a: []int32{523}, + 0x20c: []int32{525}, + 0x20e: []int32{527}, + 0x210: []int32{529}, + 0x212: []int32{531}, + 0x214: []int32{533}, + 0x216: []int32{535}, + 0x218: []int32{537}, + 0x21a: []int32{539}, + 0x21c: []int32{541}, + 0x21e: []int32{543}, + 0x220: []int32{414}, + 0x222: []int32{547}, + 0x224: []int32{549}, + 0x226: []int32{551}, + 0x228: []int32{553}, + 0x22a: []int32{555}, + 0x22c: []int32{557}, + 0x22e: []int32{559}, + 0x230: []int32{561}, + 0x232: []int32{563}, + 0x23a: []int32{11365}, + 0x23b: []int32{572}, + 0x23d: []int32{410}, + 0x23e: []int32{11366}, + 0x241: []int32{578}, + 0x243: []int32{384}, + 0x244: []int32{649}, + 0x245: []int32{652}, + 0x246: []int32{583}, + 0x248: []int32{585}, + 0x24a: []int32{587}, + 0x24c: []int32{589}, + 0x24e: []int32{591}, + 0x345: []int32{953}, + 0x370: []int32{881}, + 0x372: []int32{883}, + 0x376: []int32{887}, + 0x37f: []int32{1011}, + 0x386: []int32{940}, + 0x388: []int32{941}, + 0x389: []int32{942}, + 0x38a: []int32{943}, + 0x38c: []int32{972}, + 0x38e: []int32{973}, + 0x38f: []int32{974}, + 0x390: []int32{953, 776, 769}, + 0x391: []int32{945}, + 0x392: []int32{946}, + 0x393: []int32{947}, + 0x394: []int32{948}, + 0x395: []int32{949}, + 0x396: []int32{950}, + 0x397: []int32{951}, + 0x398: []int32{952}, + 0x399: []int32{953}, + 0x39a: []int32{954}, + 0x39b: []int32{955}, + 0x39c: []int32{956}, + 0x39d: []int32{957}, + 0x39e: []int32{958}, + 0x39f: []int32{959}, + 0x3a0: []int32{960}, + 0x3a1: []int32{961}, + 0x3a3: []int32{963}, + 0x3a4: []int32{964}, + 0x3a5: []int32{965}, + 0x3a6: []int32{966}, + 0x3a7: []int32{967}, + 0x3a8: []int32{968}, + 0x3a9: []int32{969}, + 0x3aa: []int32{970}, + 0x3ab: []int32{971}, + 0x3b0: []int32{965, 776, 769}, + 0x3c2: []int32{963}, + 0x3cf: []int32{983}, + 0x3d0: []int32{946}, + 0x3d1: []int32{952}, + 0x3d5: []int32{966}, + 0x3d6: []int32{960}, + 0x3d8: []int32{985}, + 0x3da: []int32{987}, + 0x3dc: []int32{989}, + 0x3de: []int32{991}, + 0x3e0: []int32{993}, + 0x3e2: []int32{995}, + 0x3e4: []int32{997}, + 0x3e6: []int32{999}, + 0x3e8: []int32{1001}, + 0x3ea: []int32{1003}, + 0x3ec: []int32{1005}, + 0x3ee: []int32{1007}, + 0x3f0: []int32{954}, + 0x3f1: []int32{961}, + 0x3f4: []int32{952}, + 0x3f5: []int32{949}, + 0x3f7: []int32{1016}, + 0x3f9: []int32{1010}, + 0x3fa: []int32{1019}, + 0x3fd: []int32{891}, + 0x3fe: []int32{892}, + 0x3ff: []int32{893}, + 0x400: []int32{1104}, + 0x401: []int32{1105}, + 0x402: []int32{1106}, + 0x403: []int32{1107}, + 0x404: []int32{1108}, + 0x405: []int32{1109}, + 0x406: []int32{1110}, + 0x407: []int32{1111}, + 0x408: []int32{1112}, + 0x409: []int32{1113}, + 0x40a: []int32{1114}, + 0x40b: []int32{1115}, + 0x40c: []int32{1116}, + 0x40d: []int32{1117}, + 0x40e: []int32{1118}, + 0x40f: []int32{1119}, + 0x410: []int32{1072}, + 0x411: []int32{1073}, + 0x412: []int32{1074}, + 0x413: []int32{1075}, + 0x414: []int32{1076}, + 0x415: []int32{1077}, + 0x416: []int32{1078}, + 0x417: []int32{1079}, + 0x418: []int32{1080}, + 0x419: []int32{1081}, + 0x41a: []int32{1082}, + 0x41b: []int32{1083}, + 0x41c: []int32{1084}, + 0x41d: []int32{1085}, + 0x41e: []int32{1086}, + 0x41f: []int32{1087}, + 0x420: []int32{1088}, + 0x421: []int32{1089}, + 0x422: []int32{1090}, + 0x423: []int32{1091}, + 0x424: []int32{1092}, + 0x425: []int32{1093}, + 0x426: []int32{1094}, + 0x427: []int32{1095}, + 0x428: []int32{1096}, + 0x429: []int32{1097}, + 0x42a: []int32{1098}, + 0x42b: []int32{1099}, + 0x42c: []int32{1100}, + 0x42d: []int32{1101}, + 0x42e: []int32{1102}, + 0x42f: []int32{1103}, + 0x460: []int32{1121}, + 0x462: []int32{1123}, + 0x464: []int32{1125}, + 0x466: []int32{1127}, + 0x468: []int32{1129}, + 0x46a: []int32{1131}, + 0x46c: []int32{1133}, + 0x46e: []int32{1135}, + 0x470: []int32{1137}, + 0x472: []int32{1139}, + 0x474: []int32{1141}, + 0x476: []int32{1143}, + 0x478: []int32{1145}, + 0x47a: []int32{1147}, + 0x47c: []int32{1149}, + 0x47e: []int32{1151}, + 0x480: []int32{1153}, + 0x48a: []int32{1163}, + 0x48c: []int32{1165}, + 0x48e: []int32{1167}, + 0x490: []int32{1169}, + 0x492: []int32{1171}, + 0x494: []int32{1173}, + 0x496: []int32{1175}, + 0x498: []int32{1177}, + 0x49a: []int32{1179}, + 0x49c: []int32{1181}, + 0x49e: []int32{1183}, + 0x4a0: []int32{1185}, + 0x4a2: []int32{1187}, + 0x4a4: []int32{1189}, + 0x4a6: []int32{1191}, + 0x4a8: []int32{1193}, + 0x4aa: []int32{1195}, + 0x4ac: []int32{1197}, + 0x4ae: []int32{1199}, + 0x4b0: []int32{1201}, + 0x4b2: []int32{1203}, + 0x4b4: []int32{1205}, + 0x4b6: []int32{1207}, + 0x4b8: []int32{1209}, + 0x4ba: []int32{1211}, + 0x4bc: []int32{1213}, + 0x4be: []int32{1215}, + 0x4c0: []int32{1231}, + 0x4c1: []int32{1218}, + 0x4c3: []int32{1220}, + 0x4c5: []int32{1222}, + 0x4c7: []int32{1224}, + 0x4c9: []int32{1226}, + 0x4cb: []int32{1228}, + 0x4cd: []int32{1230}, + 0x4d0: []int32{1233}, + 0x4d2: []int32{1235}, + 0x4d4: []int32{1237}, + 0x4d6: []int32{1239}, + 0x4d8: []int32{1241}, + 0x4da: []int32{1243}, + 0x4dc: []int32{1245}, + 0x4de: []int32{1247}, + 0x4e0: []int32{1249}, + 0x4e2: []int32{1251}, + 0x4e4: []int32{1253}, + 0x4e6: []int32{1255}, + 0x4e8: []int32{1257}, + 0x4ea: []int32{1259}, + 0x4ec: []int32{1261}, + 0x4ee: []int32{1263}, + 0x4f0: []int32{1265}, + 0x4f2: []int32{1267}, + 0x4f4: []int32{1269}, + 0x4f6: []int32{1271}, + 0x4f8: []int32{1273}, + 0x4fa: []int32{1275}, + 0x4fc: []int32{1277}, + 0x4fe: []int32{1279}, + 0x500: []int32{1281}, + 0x502: []int32{1283}, + 0x504: []int32{1285}, + 0x506: []int32{1287}, + 0x508: []int32{1289}, + 0x50a: []int32{1291}, + 0x50c: []int32{1293}, + 0x50e: []int32{1295}, + 0x510: []int32{1297}, + 0x512: []int32{1299}, + 0x514: []int32{1301}, + 0x516: []int32{1303}, + 0x518: []int32{1305}, + 0x51a: []int32{1307}, + 0x51c: []int32{1309}, + 0x51e: []int32{1311}, + 0x520: []int32{1313}, + 0x522: []int32{1315}, + 0x524: []int32{1317}, + 0x526: []int32{1319}, + 0x528: []int32{1321}, + 0x52a: []int32{1323}, + 0x52c: []int32{1325}, + 0x52e: []int32{1327}, + 0x531: []int32{1377}, + 0x532: []int32{1378}, + 0x533: []int32{1379}, + 0x534: []int32{1380}, + 0x535: []int32{1381}, + 0x536: []int32{1382}, + 0x537: []int32{1383}, + 0x538: []int32{1384}, + 0x539: []int32{1385}, + 0x53a: []int32{1386}, + 0x53b: []int32{1387}, + 0x53c: []int32{1388}, + 0x53d: []int32{1389}, + 0x53e: []int32{1390}, + 0x53f: []int32{1391}, + 0x540: []int32{1392}, + 0x541: []int32{1393}, + 0x542: []int32{1394}, + 0x543: []int32{1395}, + 0x544: []int32{1396}, + 0x545: []int32{1397}, + 0x546: []int32{1398}, + 0x547: []int32{1399}, + 0x548: []int32{1400}, + 0x549: []int32{1401}, + 0x54a: []int32{1402}, + 0x54b: []int32{1403}, + 0x54c: []int32{1404}, + 0x54d: []int32{1405}, + 0x54e: []int32{1406}, + 0x54f: []int32{1407}, + 0x550: []int32{1408}, + 0x551: []int32{1409}, + 0x552: []int32{1410}, + 0x553: []int32{1411}, + 0x554: []int32{1412}, + 0x555: []int32{1413}, + 0x556: []int32{1414}, + 0x587: []int32{1381, 1410}, + 0x10a0: []int32{11520}, + 0x10a1: []int32{11521}, + 0x10a2: []int32{11522}, + 0x10a3: []int32{11523}, + 0x10a4: []int32{11524}, + 0x10a5: []int32{11525}, + 0x10a6: []int32{11526}, + 0x10a7: []int32{11527}, + 0x10a8: []int32{11528}, + 0x10a9: []int32{11529}, + 0x10aa: []int32{11530}, + 0x10ab: []int32{11531}, + 0x10ac: []int32{11532}, + 0x10ad: []int32{11533}, + 0x10ae: []int32{11534}, + 0x10af: []int32{11535}, + 0x10b0: []int32{11536}, + 0x10b1: []int32{11537}, + 0x10b2: []int32{11538}, + 0x10b3: []int32{11539}, + 0x10b4: []int32{11540}, + 0x10b5: []int32{11541}, + 0x10b6: []int32{11542}, + 0x10b7: []int32{11543}, + 0x10b8: []int32{11544}, + 0x10b9: []int32{11545}, + 0x10ba: []int32{11546}, + 0x10bb: []int32{11547}, + 0x10bc: []int32{11548}, + 0x10bd: []int32{11549}, + 0x10be: []int32{11550}, + 0x10bf: []int32{11551}, + 0x10c0: []int32{11552}, + 0x10c1: []int32{11553}, + 0x10c2: []int32{11554}, + 0x10c3: []int32{11555}, + 0x10c4: []int32{11556}, + 0x10c5: []int32{11557}, + 0x10c7: []int32{11559}, + 0x10cd: []int32{11565}, + 0x13f8: []int32{5104}, + 0x13f9: []int32{5105}, + 0x13fa: []int32{5106}, + 0x13fb: []int32{5107}, + 0x13fc: []int32{5108}, + 0x13fd: []int32{5109}, + 0x1c80: []int32{1074}, + 0x1c81: []int32{1076}, + 0x1c82: []int32{1086}, + 0x1c83: []int32{1089}, + 0x1c84: []int32{1090}, + 0x1c85: []int32{1090}, + 0x1c86: []int32{1098}, + 0x1c87: []int32{1123}, + 0x1c88: []int32{42571}, + 0x1c90: []int32{4304}, + 0x1c91: []int32{4305}, + 0x1c92: []int32{4306}, + 0x1c93: []int32{4307}, + 0x1c94: []int32{4308}, + 0x1c95: []int32{4309}, + 0x1c96: []int32{4310}, + 0x1c97: []int32{4311}, + 0x1c98: []int32{4312}, + 0x1c99: []int32{4313}, + 0x1c9a: []int32{4314}, + 0x1c9b: []int32{4315}, + 0x1c9c: []int32{4316}, + 0x1c9d: []int32{4317}, + 0x1c9e: []int32{4318}, + 0x1c9f: []int32{4319}, + 0x1ca0: []int32{4320}, + 0x1ca1: []int32{4321}, + 0x1ca2: []int32{4322}, + 0x1ca3: []int32{4323}, + 0x1ca4: []int32{4324}, + 0x1ca5: []int32{4325}, + 0x1ca6: []int32{4326}, + 0x1ca7: []int32{4327}, + 0x1ca8: []int32{4328}, + 0x1ca9: []int32{4329}, + 0x1caa: []int32{4330}, + 0x1cab: []int32{4331}, + 0x1cac: []int32{4332}, + 0x1cad: []int32{4333}, + 0x1cae: []int32{4334}, + 0x1caf: []int32{4335}, + 0x1cb0: []int32{4336}, + 0x1cb1: []int32{4337}, + 0x1cb2: []int32{4338}, + 0x1cb3: []int32{4339}, + 0x1cb4: []int32{4340}, + 0x1cb5: []int32{4341}, + 0x1cb6: []int32{4342}, + 0x1cb7: []int32{4343}, + 0x1cb8: []int32{4344}, + 0x1cb9: []int32{4345}, + 0x1cba: []int32{4346}, + 0x1cbd: []int32{4349}, + 0x1cbe: []int32{4350}, + 0x1cbf: []int32{4351}, + 0x1e00: []int32{7681}, + 0x1e02: []int32{7683}, + 0x1e04: []int32{7685}, + 0x1e06: []int32{7687}, + 0x1e08: []int32{7689}, + 0x1e0a: []int32{7691}, + 0x1e0c: []int32{7693}, + 0x1e0e: []int32{7695}, + 0x1e10: []int32{7697}, + 0x1e12: []int32{7699}, + 0x1e14: []int32{7701}, + 0x1e16: []int32{7703}, + 0x1e18: []int32{7705}, + 0x1e1a: []int32{7707}, + 0x1e1c: []int32{7709}, + 0x1e1e: []int32{7711}, + 0x1e20: []int32{7713}, + 0x1e22: []int32{7715}, + 0x1e24: []int32{7717}, + 0x1e26: []int32{7719}, + 0x1e28: []int32{7721}, + 0x1e2a: []int32{7723}, + 0x1e2c: []int32{7725}, + 0x1e2e: []int32{7727}, + 0x1e30: []int32{7729}, + 0x1e32: []int32{7731}, + 0x1e34: []int32{7733}, + 0x1e36: []int32{7735}, + 0x1e38: []int32{7737}, + 0x1e3a: []int32{7739}, + 0x1e3c: []int32{7741}, + 0x1e3e: []int32{7743}, + 0x1e40: []int32{7745}, + 0x1e42: []int32{7747}, + 0x1e44: []int32{7749}, + 0x1e46: []int32{7751}, + 0x1e48: []int32{7753}, + 0x1e4a: []int32{7755}, + 0x1e4c: []int32{7757}, + 0x1e4e: []int32{7759}, + 0x1e50: []int32{7761}, + 0x1e52: []int32{7763}, + 0x1e54: []int32{7765}, + 0x1e56: []int32{7767}, + 0x1e58: []int32{7769}, + 0x1e5a: []int32{7771}, + 0x1e5c: []int32{7773}, + 0x1e5e: []int32{7775}, + 0x1e60: []int32{7777}, + 0x1e62: []int32{7779}, + 0x1e64: []int32{7781}, + 0x1e66: []int32{7783}, + 0x1e68: []int32{7785}, + 0x1e6a: []int32{7787}, + 0x1e6c: []int32{7789}, + 0x1e6e: []int32{7791}, + 0x1e70: []int32{7793}, + 0x1e72: []int32{7795}, + 0x1e74: []int32{7797}, + 0x1e76: []int32{7799}, + 0x1e78: []int32{7801}, + 0x1e7a: []int32{7803}, + 0x1e7c: []int32{7805}, + 0x1e7e: []int32{7807}, + 0x1e80: []int32{7809}, + 0x1e82: []int32{7811}, + 0x1e84: []int32{7813}, + 0x1e86: []int32{7815}, + 0x1e88: []int32{7817}, + 0x1e8a: []int32{7819}, + 0x1e8c: []int32{7821}, + 0x1e8e: []int32{7823}, + 0x1e90: []int32{7825}, + 0x1e92: []int32{7827}, + 0x1e94: []int32{7829}, + 0x1e96: []int32{104, 817}, + 0x1e97: []int32{116, 776}, + 0x1e98: []int32{119, 778}, + 0x1e99: []int32{121, 778}, + 0x1e9a: []int32{97, 702}, + 0x1e9b: []int32{7777}, + 0x1e9e: []int32{115, 115}, + 0x1ea0: []int32{7841}, + 0x1ea2: []int32{7843}, + 0x1ea4: []int32{7845}, + 0x1ea6: []int32{7847}, + 0x1ea8: []int32{7849}, + 0x1eaa: []int32{7851}, + 0x1eac: []int32{7853}, + 0x1eae: []int32{7855}, + 0x1eb0: []int32{7857}, + 0x1eb2: []int32{7859}, + 0x1eb4: []int32{7861}, + 0x1eb6: []int32{7863}, + 0x1eb8: []int32{7865}, + 0x1eba: []int32{7867}, + 0x1ebc: []int32{7869}, + 0x1ebe: []int32{7871}, + 0x1ec0: []int32{7873}, + 0x1ec2: []int32{7875}, + 0x1ec4: []int32{7877}, + 0x1ec6: []int32{7879}, + 0x1ec8: []int32{7881}, + 0x1eca: []int32{7883}, + 0x1ecc: []int32{7885}, + 0x1ece: []int32{7887}, + 0x1ed0: []int32{7889}, + 0x1ed2: []int32{7891}, + 0x1ed4: []int32{7893}, + 0x1ed6: []int32{7895}, + 0x1ed8: []int32{7897}, + 0x1eda: []int32{7899}, + 0x1edc: []int32{7901}, + 0x1ede: []int32{7903}, + 0x1ee0: []int32{7905}, + 0x1ee2: []int32{7907}, + 0x1ee4: []int32{7909}, + 0x1ee6: []int32{7911}, + 0x1ee8: []int32{7913}, + 0x1eea: []int32{7915}, + 0x1eec: []int32{7917}, + 0x1eee: []int32{7919}, + 0x1ef0: []int32{7921}, + 0x1ef2: []int32{7923}, + 0x1ef4: []int32{7925}, + 0x1ef6: []int32{7927}, + 0x1ef8: []int32{7929}, + 0x1efa: []int32{7931}, + 0x1efc: []int32{7933}, + 0x1efe: []int32{7935}, + 0x1f08: []int32{7936}, + 0x1f09: []int32{7937}, + 0x1f0a: []int32{7938}, + 0x1f0b: []int32{7939}, + 0x1f0c: []int32{7940}, + 0x1f0d: []int32{7941}, + 0x1f0e: []int32{7942}, + 0x1f0f: []int32{7943}, + 0x1f18: []int32{7952}, + 0x1f19: []int32{7953}, + 0x1f1a: []int32{7954}, + 0x1f1b: []int32{7955}, + 0x1f1c: []int32{7956}, + 0x1f1d: []int32{7957}, + 0x1f28: []int32{7968}, + 0x1f29: []int32{7969}, + 0x1f2a: []int32{7970}, + 0x1f2b: []int32{7971}, + 0x1f2c: []int32{7972}, + 0x1f2d: []int32{7973}, + 0x1f2e: []int32{7974}, + 0x1f2f: []int32{7975}, + 0x1f38: []int32{7984}, + 0x1f39: []int32{7985}, + 0x1f3a: []int32{7986}, + 0x1f3b: []int32{7987}, + 0x1f3c: []int32{7988}, + 0x1f3d: []int32{7989}, + 0x1f3e: []int32{7990}, + 0x1f3f: []int32{7991}, + 0x1f48: []int32{8000}, + 0x1f49: []int32{8001}, + 0x1f4a: []int32{8002}, + 0x1f4b: []int32{8003}, + 0x1f4c: []int32{8004}, + 0x1f4d: []int32{8005}, + 0x1f50: []int32{965, 787}, + 0x1f52: []int32{965, 787, 768}, + 0x1f54: []int32{965, 787, 769}, + 0x1f56: []int32{965, 787, 834}, + 0x1f59: []int32{8017}, + 0x1f5b: []int32{8019}, + 0x1f5d: []int32{8021}, + 0x1f5f: []int32{8023}, + 0x1f68: []int32{8032}, + 0x1f69: []int32{8033}, + 0x1f6a: []int32{8034}, + 0x1f6b: []int32{8035}, + 0x1f6c: []int32{8036}, + 0x1f6d: []int32{8037}, + 0x1f6e: []int32{8038}, + 0x1f6f: []int32{8039}, + 0x1f80: []int32{7936, 953}, + 0x1f81: []int32{7937, 953}, + 0x1f82: []int32{7938, 953}, + 0x1f83: []int32{7939, 953}, + 0x1f84: []int32{7940, 953}, + 0x1f85: []int32{7941, 953}, + 0x1f86: []int32{7942, 953}, + 0x1f87: []int32{7943, 953}, + 0x1f88: []int32{7936, 953}, + 0x1f89: []int32{7937, 953}, + 0x1f8a: []int32{7938, 953}, + 0x1f8b: []int32{7939, 953}, + 0x1f8c: []int32{7940, 953}, + 0x1f8d: []int32{7941, 953}, + 0x1f8e: []int32{7942, 953}, + 0x1f8f: []int32{7943, 953}, + 0x1f90: []int32{7968, 953}, + 0x1f91: []int32{7969, 953}, + 0x1f92: []int32{7970, 953}, + 0x1f93: []int32{7971, 953}, + 0x1f94: []int32{7972, 953}, + 0x1f95: []int32{7973, 953}, + 0x1f96: []int32{7974, 953}, + 0x1f97: []int32{7975, 953}, + 0x1f98: []int32{7968, 953}, + 0x1f99: []int32{7969, 953}, + 0x1f9a: []int32{7970, 953}, + 0x1f9b: []int32{7971, 953}, + 0x1f9c: []int32{7972, 953}, + 0x1f9d: []int32{7973, 953}, + 0x1f9e: []int32{7974, 953}, + 0x1f9f: []int32{7975, 953}, + 0x1fa0: []int32{8032, 953}, + 0x1fa1: []int32{8033, 953}, + 0x1fa2: []int32{8034, 953}, + 0x1fa3: []int32{8035, 953}, + 0x1fa4: []int32{8036, 953}, + 0x1fa5: []int32{8037, 953}, + 0x1fa6: []int32{8038, 953}, + 0x1fa7: []int32{8039, 953}, + 0x1fa8: []int32{8032, 953}, + 0x1fa9: []int32{8033, 953}, + 0x1faa: []int32{8034, 953}, + 0x1fab: []int32{8035, 953}, + 0x1fac: []int32{8036, 953}, + 0x1fad: []int32{8037, 953}, + 0x1fae: []int32{8038, 953}, + 0x1faf: []int32{8039, 953}, + 0x1fb2: []int32{8048, 953}, + 0x1fb3: []int32{945, 953}, + 0x1fb4: []int32{940, 953}, + 0x1fb6: []int32{945, 834}, + 0x1fb7: []int32{945, 834, 953}, + 0x1fb8: []int32{8112}, + 0x1fb9: []int32{8113}, + 0x1fba: []int32{8048}, + 0x1fbb: []int32{8049}, + 0x1fbc: []int32{945, 953}, + 0x1fbe: []int32{953}, + 0x1fc2: []int32{8052, 953}, + 0x1fc3: []int32{951, 953}, + 0x1fc4: []int32{942, 953}, + 0x1fc6: []int32{951, 834}, + 0x1fc7: []int32{951, 834, 953}, + 0x1fc8: []int32{8050}, + 0x1fc9: []int32{8051}, + 0x1fca: []int32{8052}, + 0x1fcb: []int32{8053}, + 0x1fcc: []int32{951, 953}, + 0x1fd2: []int32{953, 776, 768}, + 0x1fd3: []int32{953, 776, 769}, + 0x1fd6: []int32{953, 834}, + 0x1fd7: []int32{953, 776, 834}, + 0x1fd8: []int32{8144}, + 0x1fd9: []int32{8145}, + 0x1fda: []int32{8054}, + 0x1fdb: []int32{8055}, + 0x1fe2: []int32{965, 776, 768}, + 0x1fe3: []int32{965, 776, 769}, + 0x1fe4: []int32{961, 787}, + 0x1fe6: []int32{965, 834}, + 0x1fe7: []int32{965, 776, 834}, + 0x1fe8: []int32{8160}, + 0x1fe9: []int32{8161}, + 0x1fea: []int32{8058}, + 0x1feb: []int32{8059}, + 0x1fec: []int32{8165}, + 0x1ff2: []int32{8060, 953}, + 0x1ff3: []int32{969, 953}, + 0x1ff4: []int32{974, 953}, + 0x1ff6: []int32{969, 834}, + 0x1ff7: []int32{969, 834, 953}, + 0x1ff8: []int32{8056}, + 0x1ff9: []int32{8057}, + 0x1ffa: []int32{8060}, + 0x1ffb: []int32{8061}, + 0x1ffc: []int32{969, 953}, + 0x2126: []int32{969}, + 0x212a: []int32{107}, + 0x212b: []int32{229}, + 0x2132: []int32{8526}, + 0x2160: []int32{8560}, + 0x2161: []int32{8561}, + 0x2162: []int32{8562}, + 0x2163: []int32{8563}, + 0x2164: []int32{8564}, + 0x2165: []int32{8565}, + 0x2166: []int32{8566}, + 0x2167: []int32{8567}, + 0x2168: []int32{8568}, + 0x2169: []int32{8569}, + 0x216a: []int32{8570}, + 0x216b: []int32{8571}, + 0x216c: []int32{8572}, + 0x216d: []int32{8573}, + 0x216e: []int32{8574}, + 0x216f: []int32{8575}, + 0x2183: []int32{8580}, + 0x24b6: []int32{9424}, + 0x24b7: []int32{9425}, + 0x24b8: []int32{9426}, + 0x24b9: []int32{9427}, + 0x24ba: []int32{9428}, + 0x24bb: []int32{9429}, + 0x24bc: []int32{9430}, + 0x24bd: []int32{9431}, + 0x24be: []int32{9432}, + 0x24bf: []int32{9433}, + 0x24c0: []int32{9434}, + 0x24c1: []int32{9435}, + 0x24c2: []int32{9436}, + 0x24c3: []int32{9437}, + 0x24c4: []int32{9438}, + 0x24c5: []int32{9439}, + 0x24c6: []int32{9440}, + 0x24c7: []int32{9441}, + 0x24c8: []int32{9442}, + 0x24c9: []int32{9443}, + 0x24ca: []int32{9444}, + 0x24cb: []int32{9445}, + 0x24cc: []int32{9446}, + 0x24cd: []int32{9447}, + 0x24ce: []int32{9448}, + 0x24cf: []int32{9449}, + 0x2c00: []int32{11312}, + 0x2c01: []int32{11313}, + 0x2c02: []int32{11314}, + 0x2c03: []int32{11315}, + 0x2c04: []int32{11316}, + 0x2c05: []int32{11317}, + 0x2c06: []int32{11318}, + 0x2c07: []int32{11319}, + 0x2c08: []int32{11320}, + 0x2c09: []int32{11321}, + 0x2c0a: []int32{11322}, + 0x2c0b: []int32{11323}, + 0x2c0c: []int32{11324}, + 0x2c0d: []int32{11325}, + 0x2c0e: []int32{11326}, + 0x2c0f: []int32{11327}, + 0x2c10: []int32{11328}, + 0x2c11: []int32{11329}, + 0x2c12: []int32{11330}, + 0x2c13: []int32{11331}, + 0x2c14: []int32{11332}, + 0x2c15: []int32{11333}, + 0x2c16: []int32{11334}, + 0x2c17: []int32{11335}, + 0x2c18: []int32{11336}, + 0x2c19: []int32{11337}, + 0x2c1a: []int32{11338}, + 0x2c1b: []int32{11339}, + 0x2c1c: []int32{11340}, + 0x2c1d: []int32{11341}, + 0x2c1e: []int32{11342}, + 0x2c1f: []int32{11343}, + 0x2c20: []int32{11344}, + 0x2c21: []int32{11345}, + 0x2c22: []int32{11346}, + 0x2c23: []int32{11347}, + 0x2c24: []int32{11348}, + 0x2c25: []int32{11349}, + 0x2c26: []int32{11350}, + 0x2c27: []int32{11351}, + 0x2c28: []int32{11352}, + 0x2c29: []int32{11353}, + 0x2c2a: []int32{11354}, + 0x2c2b: []int32{11355}, + 0x2c2c: []int32{11356}, + 0x2c2d: []int32{11357}, + 0x2c2e: []int32{11358}, + 0x2c2f: []int32{11359}, + 0x2c60: []int32{11361}, + 0x2c62: []int32{619}, + 0x2c63: []int32{7549}, + 0x2c64: []int32{637}, + 0x2c67: []int32{11368}, + 0x2c69: []int32{11370}, + 0x2c6b: []int32{11372}, + 0x2c6d: []int32{593}, + 0x2c6e: []int32{625}, + 0x2c6f: []int32{592}, + 0x2c70: []int32{594}, + 0x2c72: []int32{11379}, + 0x2c75: []int32{11382}, + 0x2c7e: []int32{575}, + 0x2c7f: []int32{576}, + 0x2c80: []int32{11393}, + 0x2c82: []int32{11395}, + 0x2c84: []int32{11397}, + 0x2c86: []int32{11399}, + 0x2c88: []int32{11401}, + 0x2c8a: []int32{11403}, + 0x2c8c: []int32{11405}, + 0x2c8e: []int32{11407}, + 0x2c90: []int32{11409}, + 0x2c92: []int32{11411}, + 0x2c94: []int32{11413}, + 0x2c96: []int32{11415}, + 0x2c98: []int32{11417}, + 0x2c9a: []int32{11419}, + 0x2c9c: []int32{11421}, + 0x2c9e: []int32{11423}, + 0x2ca0: []int32{11425}, + 0x2ca2: []int32{11427}, + 0x2ca4: []int32{11429}, + 0x2ca6: []int32{11431}, + 0x2ca8: []int32{11433}, + 0x2caa: []int32{11435}, + 0x2cac: []int32{11437}, + 0x2cae: []int32{11439}, + 0x2cb0: []int32{11441}, + 0x2cb2: []int32{11443}, + 0x2cb4: []int32{11445}, + 0x2cb6: []int32{11447}, + 0x2cb8: []int32{11449}, + 0x2cba: []int32{11451}, + 0x2cbc: []int32{11453}, + 0x2cbe: []int32{11455}, + 0x2cc0: []int32{11457}, + 0x2cc2: []int32{11459}, + 0x2cc4: []int32{11461}, + 0x2cc6: []int32{11463}, + 0x2cc8: []int32{11465}, + 0x2cca: []int32{11467}, + 0x2ccc: []int32{11469}, + 0x2cce: []int32{11471}, + 0x2cd0: []int32{11473}, + 0x2cd2: []int32{11475}, + 0x2cd4: []int32{11477}, + 0x2cd6: []int32{11479}, + 0x2cd8: []int32{11481}, + 0x2cda: []int32{11483}, + 0x2cdc: []int32{11485}, + 0x2cde: []int32{11487}, + 0x2ce0: []int32{11489}, + 0x2ce2: []int32{11491}, + 0x2ceb: []int32{11500}, + 0x2ced: []int32{11502}, + 0x2cf2: []int32{11507}, + 0xa640: []int32{42561}, + 0xa642: []int32{42563}, + 0xa644: []int32{42565}, + 0xa646: []int32{42567}, + 0xa648: []int32{42569}, + 0xa64a: []int32{42571}, + 0xa64c: []int32{42573}, + 0xa64e: []int32{42575}, + 0xa650: []int32{42577}, + 0xa652: []int32{42579}, + 0xa654: []int32{42581}, + 0xa656: []int32{42583}, + 0xa658: []int32{42585}, + 0xa65a: []int32{42587}, + 0xa65c: []int32{42589}, + 0xa65e: []int32{42591}, + 0xa660: []int32{42593}, + 0xa662: []int32{42595}, + 0xa664: []int32{42597}, + 0xa666: []int32{42599}, + 0xa668: []int32{42601}, + 0xa66a: []int32{42603}, + 0xa66c: []int32{42605}, + 0xa680: []int32{42625}, + 0xa682: []int32{42627}, + 0xa684: []int32{42629}, + 0xa686: []int32{42631}, + 0xa688: []int32{42633}, + 0xa68a: []int32{42635}, + 0xa68c: []int32{42637}, + 0xa68e: []int32{42639}, + 0xa690: []int32{42641}, + 0xa692: []int32{42643}, + 0xa694: []int32{42645}, + 0xa696: []int32{42647}, + 0xa698: []int32{42649}, + 0xa69a: []int32{42651}, + 0xa722: []int32{42787}, + 0xa724: []int32{42789}, + 0xa726: []int32{42791}, + 0xa728: []int32{42793}, + 0xa72a: []int32{42795}, + 0xa72c: []int32{42797}, + 0xa72e: []int32{42799}, + 0xa732: []int32{42803}, + 0xa734: []int32{42805}, + 0xa736: []int32{42807}, + 0xa738: []int32{42809}, + 0xa73a: []int32{42811}, + 0xa73c: []int32{42813}, + 0xa73e: []int32{42815}, + 0xa740: []int32{42817}, + 0xa742: []int32{42819}, + 0xa744: []int32{42821}, + 0xa746: []int32{42823}, + 0xa748: []int32{42825}, + 0xa74a: []int32{42827}, + 0xa74c: []int32{42829}, + 0xa74e: []int32{42831}, + 0xa750: []int32{42833}, + 0xa752: []int32{42835}, + 0xa754: []int32{42837}, + 0xa756: []int32{42839}, + 0xa758: []int32{42841}, + 0xa75a: []int32{42843}, + 0xa75c: []int32{42845}, + 0xa75e: []int32{42847}, + 0xa760: []int32{42849}, + 0xa762: []int32{42851}, + 0xa764: []int32{42853}, + 0xa766: []int32{42855}, + 0xa768: []int32{42857}, + 0xa76a: []int32{42859}, + 0xa76c: []int32{42861}, + 0xa76e: []int32{42863}, + 0xa779: []int32{42874}, + 0xa77b: []int32{42876}, + 0xa77d: []int32{7545}, + 0xa77e: []int32{42879}, + 0xa780: []int32{42881}, + 0xa782: []int32{42883}, + 0xa784: []int32{42885}, + 0xa786: []int32{42887}, + 0xa78b: []int32{42892}, + 0xa78d: []int32{613}, + 0xa790: []int32{42897}, + 0xa792: []int32{42899}, + 0xa796: []int32{42903}, + 0xa798: []int32{42905}, + 0xa79a: []int32{42907}, + 0xa79c: []int32{42909}, + 0xa79e: []int32{42911}, + 0xa7a0: []int32{42913}, + 0xa7a2: []int32{42915}, + 0xa7a4: []int32{42917}, + 0xa7a6: []int32{42919}, + 0xa7a8: []int32{42921}, + 0xa7aa: []int32{614}, + 0xa7ab: []int32{604}, + 0xa7ac: []int32{609}, + 0xa7ad: []int32{620}, + 0xa7ae: []int32{618}, + 0xa7b0: []int32{670}, + 0xa7b1: []int32{647}, + 0xa7b2: []int32{669}, + 0xa7b3: []int32{43859}, + 0xa7b4: []int32{42933}, + 0xa7b6: []int32{42935}, + 0xa7b8: []int32{42937}, + 0xa7ba: []int32{42939}, + 0xa7bc: []int32{42941}, + 0xa7be: []int32{42943}, + 0xa7c0: []int32{42945}, + 0xa7c2: []int32{42947}, + 0xa7c4: []int32{42900}, + 0xa7c5: []int32{642}, + 0xa7c6: []int32{7566}, + 0xa7c7: []int32{42952}, + 0xa7c9: []int32{42954}, + 0xa7d0: []int32{42961}, + 0xa7d6: []int32{42967}, + 0xa7d8: []int32{42969}, + 0xa7f5: []int32{42998}, + 0xab70: []int32{5024}, + 0xab71: []int32{5025}, + 0xab72: []int32{5026}, + 0xab73: []int32{5027}, + 0xab74: []int32{5028}, + 0xab75: []int32{5029}, + 0xab76: []int32{5030}, + 0xab77: []int32{5031}, + 0xab78: []int32{5032}, + 0xab79: []int32{5033}, + 0xab7a: []int32{5034}, + 0xab7b: []int32{5035}, + 0xab7c: []int32{5036}, + 0xab7d: []int32{5037}, + 0xab7e: []int32{5038}, + 0xab7f: []int32{5039}, + 0xab80: []int32{5040}, + 0xab81: []int32{5041}, + 0xab82: []int32{5042}, + 0xab83: []int32{5043}, + 0xab84: []int32{5044}, + 0xab85: []int32{5045}, + 0xab86: []int32{5046}, + 0xab87: []int32{5047}, + 0xab88: []int32{5048}, + 0xab89: []int32{5049}, + 0xab8a: []int32{5050}, + 0xab8b: []int32{5051}, + 0xab8c: []int32{5052}, + 0xab8d: []int32{5053}, + 0xab8e: []int32{5054}, + 0xab8f: []int32{5055}, + 0xab90: []int32{5056}, + 0xab91: []int32{5057}, + 0xab92: []int32{5058}, + 0xab93: []int32{5059}, + 0xab94: []int32{5060}, + 0xab95: []int32{5061}, + 0xab96: []int32{5062}, + 0xab97: []int32{5063}, + 0xab98: []int32{5064}, + 0xab99: []int32{5065}, + 0xab9a: []int32{5066}, + 0xab9b: []int32{5067}, + 0xab9c: []int32{5068}, + 0xab9d: []int32{5069}, + 0xab9e: []int32{5070}, + 0xab9f: []int32{5071}, + 0xaba0: []int32{5072}, + 0xaba1: []int32{5073}, + 0xaba2: []int32{5074}, + 0xaba3: []int32{5075}, + 0xaba4: []int32{5076}, + 0xaba5: []int32{5077}, + 0xaba6: []int32{5078}, + 0xaba7: []int32{5079}, + 0xaba8: []int32{5080}, + 0xaba9: []int32{5081}, + 0xabaa: []int32{5082}, + 0xabab: []int32{5083}, + 0xabac: []int32{5084}, + 0xabad: []int32{5085}, + 0xabae: []int32{5086}, + 0xabaf: []int32{5087}, + 0xabb0: []int32{5088}, + 0xabb1: []int32{5089}, + 0xabb2: []int32{5090}, + 0xabb3: []int32{5091}, + 0xabb4: []int32{5092}, + 0xabb5: []int32{5093}, + 0xabb6: []int32{5094}, + 0xabb7: []int32{5095}, + 0xabb8: []int32{5096}, + 0xabb9: []int32{5097}, + 0xabba: []int32{5098}, + 0xabbb: []int32{5099}, + 0xabbc: []int32{5100}, + 0xabbd: []int32{5101}, + 0xabbe: []int32{5102}, + 0xabbf: []int32{5103}, + 0xfb00: []int32{102, 102}, + 0xfb01: []int32{102, 105}, + 0xfb02: []int32{102, 108}, + 0xfb03: []int32{102, 102, 105}, + 0xfb04: []int32{102, 102, 108}, + 0xfb05: []int32{115, 116}, + 0xfb06: []int32{115, 116}, + 0xfb13: []int32{1396, 1398}, + 0xfb14: []int32{1396, 1381}, + 0xfb15: []int32{1396, 1387}, + 0xfb16: []int32{1406, 1398}, + 0xfb17: []int32{1396, 1389}, + 0xff21: []int32{65345}, + 0xff22: []int32{65346}, + 0xff23: []int32{65347}, + 0xff24: []int32{65348}, + 0xff25: []int32{65349}, + 0xff26: []int32{65350}, + 0xff27: []int32{65351}, + 0xff28: []int32{65352}, + 0xff29: []int32{65353}, + 0xff2a: []int32{65354}, + 0xff2b: []int32{65355}, + 0xff2c: []int32{65356}, + 0xff2d: []int32{65357}, + 0xff2e: []int32{65358}, + 0xff2f: []int32{65359}, + 0xff30: []int32{65360}, + 0xff31: []int32{65361}, + 0xff32: []int32{65362}, + 0xff33: []int32{65363}, + 0xff34: []int32{65364}, + 0xff35: []int32{65365}, + 0xff36: []int32{65366}, + 0xff37: []int32{65367}, + 0xff38: []int32{65368}, + 0xff39: []int32{65369}, + 0xff3a: []int32{65370}, + 0x10400: []int32{66600}, + 0x10401: []int32{66601}, + 0x10402: []int32{66602}, + 0x10403: []int32{66603}, + 0x10404: []int32{66604}, + 0x10405: []int32{66605}, + 0x10406: []int32{66606}, + 0x10407: []int32{66607}, + 0x10408: []int32{66608}, + 0x10409: []int32{66609}, + 0x1040a: []int32{66610}, + 0x1040b: []int32{66611}, + 0x1040c: []int32{66612}, + 0x1040d: []int32{66613}, + 0x1040e: []int32{66614}, + 0x1040f: []int32{66615}, + 0x10410: []int32{66616}, + 0x10411: []int32{66617}, + 0x10412: []int32{66618}, + 0x10413: []int32{66619}, + 0x10414: []int32{66620}, + 0x10415: []int32{66621}, + 0x10416: []int32{66622}, + 0x10417: []int32{66623}, + 0x10418: []int32{66624}, + 0x10419: []int32{66625}, + 0x1041a: []int32{66626}, + 0x1041b: []int32{66627}, + 0x1041c: []int32{66628}, + 0x1041d: []int32{66629}, + 0x1041e: []int32{66630}, + 0x1041f: []int32{66631}, + 0x10420: []int32{66632}, + 0x10421: []int32{66633}, + 0x10422: []int32{66634}, + 0x10423: []int32{66635}, + 0x10424: []int32{66636}, + 0x10425: []int32{66637}, + 0x10426: []int32{66638}, + 0x10427: []int32{66639}, + 0x104b0: []int32{66776}, + 0x104b1: []int32{66777}, + 0x104b2: []int32{66778}, + 0x104b3: []int32{66779}, + 0x104b4: []int32{66780}, + 0x104b5: []int32{66781}, + 0x104b6: []int32{66782}, + 0x104b7: []int32{66783}, + 0x104b8: []int32{66784}, + 0x104b9: []int32{66785}, + 0x104ba: []int32{66786}, + 0x104bb: []int32{66787}, + 0x104bc: []int32{66788}, + 0x104bd: []int32{66789}, + 0x104be: []int32{66790}, + 0x104bf: []int32{66791}, + 0x104c0: []int32{66792}, + 0x104c1: []int32{66793}, + 0x104c2: []int32{66794}, + 0x104c3: []int32{66795}, + 0x104c4: []int32{66796}, + 0x104c5: []int32{66797}, + 0x104c6: []int32{66798}, + 0x104c7: []int32{66799}, + 0x104c8: []int32{66800}, + 0x104c9: []int32{66801}, + 0x104ca: []int32{66802}, + 0x104cb: []int32{66803}, + 0x104cc: []int32{66804}, + 0x104cd: []int32{66805}, + 0x104ce: []int32{66806}, + 0x104cf: []int32{66807}, + 0x104d0: []int32{66808}, + 0x104d1: []int32{66809}, + 0x104d2: []int32{66810}, + 0x104d3: []int32{66811}, + 0x10570: []int32{66967}, + 0x10571: []int32{66968}, + 0x10572: []int32{66969}, + 0x10573: []int32{66970}, + 0x10574: []int32{66971}, + 0x10575: []int32{66972}, + 0x10576: []int32{66973}, + 0x10577: []int32{66974}, + 0x10578: []int32{66975}, + 0x10579: []int32{66976}, + 0x1057a: []int32{66977}, + 0x1057c: []int32{66979}, + 0x1057d: []int32{66980}, + 0x1057e: []int32{66981}, + 0x1057f: []int32{66982}, + 0x10580: []int32{66983}, + 0x10581: []int32{66984}, + 0x10582: []int32{66985}, + 0x10583: []int32{66986}, + 0x10584: []int32{66987}, + 0x10585: []int32{66988}, + 0x10586: []int32{66989}, + 0x10587: []int32{66990}, + 0x10588: []int32{66991}, + 0x10589: []int32{66992}, + 0x1058a: []int32{66993}, + 0x1058c: []int32{66995}, + 0x1058d: []int32{66996}, + 0x1058e: []int32{66997}, + 0x1058f: []int32{66998}, + 0x10590: []int32{66999}, + 0x10591: []int32{67000}, + 0x10592: []int32{67001}, + 0x10594: []int32{67003}, + 0x10595: []int32{67004}, + 0x10c80: []int32{68800}, + 0x10c81: []int32{68801}, + 0x10c82: []int32{68802}, + 0x10c83: []int32{68803}, + 0x10c84: []int32{68804}, + 0x10c85: []int32{68805}, + 0x10c86: []int32{68806}, + 0x10c87: []int32{68807}, + 0x10c88: []int32{68808}, + 0x10c89: []int32{68809}, + 0x10c8a: []int32{68810}, + 0x10c8b: []int32{68811}, + 0x10c8c: []int32{68812}, + 0x10c8d: []int32{68813}, + 0x10c8e: []int32{68814}, + 0x10c8f: []int32{68815}, + 0x10c90: []int32{68816}, + 0x10c91: []int32{68817}, + 0x10c92: []int32{68818}, + 0x10c93: []int32{68819}, + 0x10c94: []int32{68820}, + 0x10c95: []int32{68821}, + 0x10c96: []int32{68822}, + 0x10c97: []int32{68823}, + 0x10c98: []int32{68824}, + 0x10c99: []int32{68825}, + 0x10c9a: []int32{68826}, + 0x10c9b: []int32{68827}, + 0x10c9c: []int32{68828}, + 0x10c9d: []int32{68829}, + 0x10c9e: []int32{68830}, + 0x10c9f: []int32{68831}, + 0x10ca0: []int32{68832}, + 0x10ca1: []int32{68833}, + 0x10ca2: []int32{68834}, + 0x10ca3: []int32{68835}, + 0x10ca4: []int32{68836}, + 0x10ca5: []int32{68837}, + 0x10ca6: []int32{68838}, + 0x10ca7: []int32{68839}, + 0x10ca8: []int32{68840}, + 0x10ca9: []int32{68841}, + 0x10caa: []int32{68842}, + 0x10cab: []int32{68843}, + 0x10cac: []int32{68844}, + 0x10cad: []int32{68845}, + 0x10cae: []int32{68846}, + 0x10caf: []int32{68847}, + 0x10cb0: []int32{68848}, + 0x10cb1: []int32{68849}, + 0x10cb2: []int32{68850}, + 0x118a0: []int32{71872}, + 0x118a1: []int32{71873}, + 0x118a2: []int32{71874}, + 0x118a3: []int32{71875}, + 0x118a4: []int32{71876}, + 0x118a5: []int32{71877}, + 0x118a6: []int32{71878}, + 0x118a7: []int32{71879}, + 0x118a8: []int32{71880}, + 0x118a9: []int32{71881}, + 0x118aa: []int32{71882}, + 0x118ab: []int32{71883}, + 0x118ac: []int32{71884}, + 0x118ad: []int32{71885}, + 0x118ae: []int32{71886}, + 0x118af: []int32{71887}, + 0x118b0: []int32{71888}, + 0x118b1: []int32{71889}, + 0x118b2: []int32{71890}, + 0x118b3: []int32{71891}, + 0x118b4: []int32{71892}, + 0x118b5: []int32{71893}, + 0x118b6: []int32{71894}, + 0x118b7: []int32{71895}, + 0x118b8: []int32{71896}, + 0x118b9: []int32{71897}, + 0x118ba: []int32{71898}, + 0x118bb: []int32{71899}, + 0x118bc: []int32{71900}, + 0x118bd: []int32{71901}, + 0x118be: []int32{71902}, + 0x118bf: []int32{71903}, + 0x16e40: []int32{93792}, + 0x16e41: []int32{93793}, + 0x16e42: []int32{93794}, + 0x16e43: []int32{93795}, + 0x16e44: []int32{93796}, + 0x16e45: []int32{93797}, + 0x16e46: []int32{93798}, + 0x16e47: []int32{93799}, + 0x16e48: []int32{93800}, + 0x16e49: []int32{93801}, + 0x16e4a: []int32{93802}, + 0x16e4b: []int32{93803}, + 0x16e4c: []int32{93804}, + 0x16e4d: []int32{93805}, + 0x16e4e: []int32{93806}, + 0x16e4f: []int32{93807}, + 0x16e50: []int32{93808}, + 0x16e51: []int32{93809}, + 0x16e52: []int32{93810}, + 0x16e53: []int32{93811}, + 0x16e54: []int32{93812}, + 0x16e55: []int32{93813}, + 0x16e56: []int32{93814}, + 0x16e57: []int32{93815}, + 0x16e58: []int32{93816}, + 0x16e59: []int32{93817}, + 0x16e5a: []int32{93818}, + 0x16e5b: []int32{93819}, + 0x16e5c: []int32{93820}, + 0x16e5d: []int32{93821}, + 0x16e5e: []int32{93822}, + 0x16e5f: []int32{93823}, + 0x1e900: []int32{125218}, + 0x1e901: []int32{125219}, + 0x1e902: []int32{125220}, + 0x1e903: []int32{125221}, + 0x1e904: []int32{125222}, + 0x1e905: []int32{125223}, + 0x1e906: []int32{125224}, + 0x1e907: []int32{125225}, + 0x1e908: []int32{125226}, + 0x1e909: []int32{125227}, + 0x1e90a: []int32{125228}, + 0x1e90b: []int32{125229}, + 0x1e90c: []int32{125230}, + 0x1e90d: []int32{125231}, + 0x1e90e: []int32{125232}, + 0x1e90f: []int32{125233}, + 0x1e910: []int32{125234}, + 0x1e911: []int32{125235}, + 0x1e912: []int32{125236}, + 0x1e913: []int32{125237}, + 0x1e914: []int32{125238}, + 0x1e915: []int32{125239}, + 0x1e916: []int32{125240}, + 0x1e917: []int32{125241}, + 0x1e918: []int32{125242}, + 0x1e919: []int32{125243}, + 0x1e91a: []int32{125244}, + 0x1e91b: []int32{125245}, + 0x1e91c: []int32{125246}, + 0x1e91d: []int32{125247}, + 0x1e91e: []int32{125248}, + 0x1e91f: []int32{125249}, + 0x1e920: []int32{125250}, + 0x1e921: []int32{125251}, +} diff --git a/vendor/github.com/yuin/goldmark/util/util.go b/vendor/github.com/yuin/goldmark/util/util.go new file mode 100644 index 0000000..e2c92c6 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/util/util.go @@ -0,0 +1,982 @@ +// Package util provides utility functions for the goldmark. +package util + +import ( + "bytes" + "io" + "net/url" + "regexp" + "sort" + "strconv" + "unicode" + "unicode/utf8" +) + +// A CopyOnWriteBuffer is a byte buffer that copies buffer when +// it need to be changed. +type CopyOnWriteBuffer struct { + buffer []byte + copied bool +} + +// NewCopyOnWriteBuffer returns a new CopyOnWriteBuffer. +func NewCopyOnWriteBuffer(buffer []byte) CopyOnWriteBuffer { + return CopyOnWriteBuffer{ + buffer: buffer, + copied: false, + } +} + +// Write writes given bytes to the buffer. +// Write allocate new buffer and clears it at the first time. +func (b *CopyOnWriteBuffer) Write(value []byte) { + if !b.copied { + b.buffer = make([]byte, 0, len(b.buffer)+20) + b.copied = true + } + b.buffer = append(b.buffer, value...) +} + +// WriteString writes given string to the buffer. +// WriteString allocate new buffer and clears it at the first time. +func (b *CopyOnWriteBuffer) WriteString(value string) { + b.Write(StringToReadOnlyBytes(value)) +} + +// Append appends given bytes to the buffer. +// Append copy buffer at the first time. +func (b *CopyOnWriteBuffer) Append(value []byte) { + if !b.copied { + tmp := make([]byte, len(b.buffer), len(b.buffer)+20) + copy(tmp, b.buffer) + b.buffer = tmp + b.copied = true + } + b.buffer = append(b.buffer, value...) +} + +// AppendString appends given string to the buffer. +// AppendString copy buffer at the first time. +func (b *CopyOnWriteBuffer) AppendString(value string) { + b.Append(StringToReadOnlyBytes(value)) +} + +// WriteByte writes the given byte to the buffer. +// WriteByte allocate new buffer and clears it at the first time. +func (b *CopyOnWriteBuffer) WriteByte(c byte) error { + if !b.copied { + b.buffer = make([]byte, 0, len(b.buffer)+20) + b.copied = true + } + b.buffer = append(b.buffer, c) + return nil +} + +// AppendByte appends given bytes to the buffer. +// AppendByte copy buffer at the first time. +func (b *CopyOnWriteBuffer) AppendByte(c byte) { + if !b.copied { + tmp := make([]byte, len(b.buffer), len(b.buffer)+20) + copy(tmp, b.buffer) + b.buffer = tmp + b.copied = true + } + b.buffer = append(b.buffer, c) +} + +// Bytes returns bytes of this buffer. +func (b *CopyOnWriteBuffer) Bytes() []byte { + return b.buffer +} + +// IsCopied returns true if buffer has been copied, otherwise false. +func (b *CopyOnWriteBuffer) IsCopied() bool { + return b.copied +} + +// IsEscapedPunctuation returns true if character at a given index i +// is an escaped punctuation, otherwise false. +func IsEscapedPunctuation(source []byte, i int) bool { + return source[i] == '\\' && i < len(source)-1 && IsPunct(source[i+1]) +} + +// ReadWhile read the given source while pred is true. +func ReadWhile(source []byte, index [2]int, pred func(byte) bool) (int, bool) { + j := index[0] + ok := false + for ; j < index[1]; j++ { + c1 := source[j] + if pred(c1) { + ok = true + continue + } + break + } + return j, ok +} + +// IsBlank returns true if the given string is all space characters. +func IsBlank(bs []byte) bool { + for _, b := range bs { + if !IsSpace(b) { + return false + } + } + return true +} + +// VisualizeSpaces visualize invisible space characters. +func VisualizeSpaces(bs []byte) []byte { + bs = bytes.Replace(bs, []byte(" "), []byte("[SPACE]"), -1) + bs = bytes.Replace(bs, []byte("\t"), []byte("[TAB]"), -1) + bs = bytes.Replace(bs, []byte("\n"), []byte("[NEWLINE]\n"), -1) + bs = bytes.Replace(bs, []byte("\r"), []byte("[CR]"), -1) + bs = bytes.Replace(bs, []byte("\v"), []byte("[VTAB]"), -1) + bs = bytes.Replace(bs, []byte("\x00"), []byte("[NUL]"), -1) + bs = bytes.Replace(bs, []byte("\ufffd"), []byte("[U+FFFD]"), -1) + return bs +} + +// TabWidth calculates actual width of a tab at the given position. +func TabWidth(currentPos int) int { + return 4 - currentPos%4 +} + +// IndentPosition searches an indent position with the given width for the given line. +// If the line contains tab characters, paddings may be not zero. +// currentPos==0 and width==2: +// +// position: 0 1 +// [TAB]aaaa +// width: 1234 5678 +// +// width=2 is in the tab character. In this case, IndentPosition returns +// (pos=1, padding=2). +func IndentPosition(bs []byte, currentPos, width int) (pos, padding int) { + return IndentPositionPadding(bs, currentPos, 0, width) +} + +// IndentPositionPadding searches an indent position with the given width for the given line. +// This function is mostly same as IndentPosition except this function +// takes account into additional paddings. +func IndentPositionPadding(bs []byte, currentPos, paddingv, width int) (pos, padding int) { + if width == 0 { + return 0, paddingv + } + w := 0 + i := 0 + l := len(bs) + for ; i < l; i++ { + if bs[i] == '\t' && w < width { + w += TabWidth(currentPos + w) + } else if bs[i] == ' ' && w < width { + w++ + } else { + break + } + } + if w >= width { + return i - paddingv, w - width + } + return -1, -1 +} + +// DedentPosition dedents lines by the given width. +// +// Deprecated: This function has bugs. Use util.IndentPositionPadding and util.FirstNonSpacePosition. +func DedentPosition(bs []byte, currentPos, width int) (pos, padding int) { + if width == 0 { + return 0, 0 + } + w := 0 + l := len(bs) + i := 0 + for ; i < l; i++ { + if bs[i] == '\t' { + w += TabWidth(currentPos + w) + } else if bs[i] == ' ' { + w++ + } else { + break + } + } + if w >= width { + return i, w - width + } + return i, 0 +} + +// DedentPositionPadding dedents lines by the given width. +// This function is mostly same as DedentPosition except this function +// takes account into additional paddings. +// +// Deprecated: This function has bugs. Use util.IndentPositionPadding and util.FirstNonSpacePosition. +func DedentPositionPadding(bs []byte, currentPos, paddingv, width int) (pos, padding int) { + if width == 0 { + return 0, paddingv + } + + w := 0 + i := 0 + l := len(bs) + for ; i < l; i++ { + if bs[i] == '\t' { + w += TabWidth(currentPos + w) + } else if bs[i] == ' ' { + w++ + } else { + break + } + } + if w >= width { + return i - paddingv, w - width + } + return i - paddingv, 0 +} + +// IndentWidth calculate an indent width for the given line. +func IndentWidth(bs []byte, currentPos int) (width, pos int) { + l := len(bs) + for i := 0; i < l; i++ { + b := bs[i] + if b == ' ' { + width++ + pos++ + } else if b == '\t' { + width += TabWidth(currentPos + width) + pos++ + } else { + break + } + } + return +} + +// FirstNonSpacePosition returns a position line that is a first nonspace +// character. +func FirstNonSpacePosition(bs []byte) int { + i := 0 + for ; i < len(bs); i++ { + c := bs[i] + if c == ' ' || c == '\t' { + continue + } + if c == '\n' { + return -1 + } + return i + } + return -1 +} + +// FindClosure returns a position that closes the given opener. +// If codeSpan is set true, it ignores characters in code spans. +// If allowNesting is set true, closures correspond to nested opener will be +// ignored. +// +// Deprecated: This function can not handle newlines. Many elements +// can be existed over multiple lines(e.g. link labels). +// Use text.Reader.FindClosure. +func FindClosure(bs []byte, opener, closure byte, codeSpan, allowNesting bool) int { + i := 0 + opened := 1 + codeSpanOpener := 0 + for i < len(bs) { + c := bs[i] + if codeSpan && codeSpanOpener != 0 && c == '`' { + codeSpanCloser := 0 + for ; i < len(bs); i++ { + if bs[i] == '`' { + codeSpanCloser++ + } else { + i-- + break + } + } + if codeSpanCloser == codeSpanOpener { + codeSpanOpener = 0 + } + } else if codeSpanOpener == 0 && c == '\\' && i < len(bs)-1 && IsPunct(bs[i+1]) { + i += 2 + continue + } else if codeSpan && codeSpanOpener == 0 && c == '`' { + for ; i < len(bs); i++ { + if bs[i] == '`' { + codeSpanOpener++ + } else { + i-- + break + } + } + } else if (codeSpan && codeSpanOpener == 0) || !codeSpan { + if c == closure { + opened-- + if opened == 0 { + return i + } + } else if c == opener { + if !allowNesting { + return -1 + } + opened++ + } + } + i++ + } + return -1 +} + +// TrimLeft trims characters in the given s from head of the source. +// bytes.TrimLeft offers same functionalities, but bytes.TrimLeft +// allocates new buffer for the result. +func TrimLeft(source, b []byte) []byte { + i := 0 + for ; i < len(source); i++ { + c := source[i] + found := false + for j := 0; j < len(b); j++ { + if c == b[j] { + found = true + break + } + } + if !found { + break + } + } + return source[i:] +} + +// TrimRight trims characters in the given s from tail of the source. +func TrimRight(source, b []byte) []byte { + i := len(source) - 1 + for ; i >= 0; i-- { + c := source[i] + found := false + for j := 0; j < len(b); j++ { + if c == b[j] { + found = true + break + } + } + if !found { + break + } + } + return source[:i+1] +} + +// TrimLeftLength returns a length of leading specified characters. +func TrimLeftLength(source, s []byte) int { + return len(source) - len(TrimLeft(source, s)) +} + +// TrimRightLength returns a length of trailing specified characters. +func TrimRightLength(source, s []byte) int { + return len(source) - len(TrimRight(source, s)) +} + +// TrimLeftSpaceLength returns a length of leading space characters. +func TrimLeftSpaceLength(source []byte) int { + i := 0 + for ; i < len(source); i++ { + if !IsSpace(source[i]) { + break + } + } + return i +} + +// TrimRightSpaceLength returns a length of trailing space characters. +func TrimRightSpaceLength(source []byte) int { + l := len(source) + i := l - 1 + for ; i >= 0; i-- { + if !IsSpace(source[i]) { + break + } + } + if i < 0 { + return l + } + return l - 1 - i +} + +// TrimLeftSpace returns a subslice of the given string by slicing off all leading +// space characters. +func TrimLeftSpace(source []byte) []byte { + return TrimLeft(source, spaces) +} + +// TrimRightSpace returns a subslice of the given string by slicing off all trailing +// space characters. +func TrimRightSpace(source []byte) []byte { + return TrimRight(source, spaces) +} + +// DoFullUnicodeCaseFolding performs full unicode case folding to given bytes. +func DoFullUnicodeCaseFolding(v []byte) []byte { + var rbuf []byte + cob := NewCopyOnWriteBuffer(v) + n := 0 + for i := 0; i < len(v); i++ { + c := v[i] + if c < 0xb5 { + if c >= 0x41 && c <= 0x5a { + // A-Z to a-z + cob.Write(v[n:i]) + _ = cob.WriteByte(c + 32) + n = i + 1 + } + continue + } + + if !utf8.RuneStart(c) { + continue + } + r, length := utf8.DecodeRune(v[i:]) + if r == utf8.RuneError { + continue + } + folded, ok := unicodeCaseFoldings[r] + if !ok { + continue + } + + cob.Write(v[n:i]) + if rbuf == nil { + rbuf = make([]byte, 4) + } + for _, f := range folded { + l := utf8.EncodeRune(rbuf, f) + cob.Write(rbuf[:l]) + } + i += length - 1 + n = i + 1 + } + if cob.IsCopied() { + cob.Write(v[n:]) + } + return cob.Bytes() +} + +// ReplaceSpaces replaces sequence of spaces with the given repl. +func ReplaceSpaces(source []byte, repl byte) []byte { + var ret []byte + start := -1 + for i, c := range source { + iss := IsSpace(c) + if start < 0 && iss { + start = i + continue + } else if start >= 0 && iss { + continue + } else if start >= 0 { + if ret == nil { + ret = make([]byte, 0, len(source)) + ret = append(ret, source[:start]...) + } + ret = append(ret, repl) + start = -1 + } + if ret != nil { + ret = append(ret, c) + } + } + if start >= 0 && ret != nil { + ret = append(ret, repl) + } + if ret == nil { + return source + } + return ret +} + +// ToRune decode given bytes start at pos and returns a rune. +func ToRune(source []byte, pos int) rune { + i := pos + for ; i >= 0; i-- { + if utf8.RuneStart(source[i]) { + break + } + } + r, _ := utf8.DecodeRune(source[i:]) + return r +} + +// ToValidRune returns 0xFFFD if the given rune is invalid, otherwise v. +func ToValidRune(v rune) rune { + if v == 0 || !utf8.ValidRune(v) { + return rune(0xFFFD) + } + return v +} + +// ToLinkReference converts given bytes into a valid link reference string. +// ToLinkReference performs unicode case folding, trims leading and trailing spaces, converts into lower +// case and replace spaces with a single space character. +func ToLinkReference(v []byte) string { + v = TrimLeftSpace(v) + v = TrimRightSpace(v) + v = DoFullUnicodeCaseFolding(v) + return string(ReplaceSpaces(v, ' ')) +} + +var htmlEscapeTable = [256][]byte{nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, []byte("""), nil, nil, nil, []byte("&"), nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, []byte("<"), nil, []byte(">"), nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil, nil} //nolint:golint,lll + +// EscapeHTMLByte returns HTML escaped bytes if the given byte should be escaped, +// otherwise nil. +func EscapeHTMLByte(b byte) []byte { + return htmlEscapeTable[b] +} + +// EscapeHTML escapes characters that should be escaped in HTML text. +func EscapeHTML(v []byte) []byte { + cob := NewCopyOnWriteBuffer(v) + n := 0 + for i := 0; i < len(v); i++ { + c := v[i] + escaped := htmlEscapeTable[c] + if escaped != nil { + cob.Write(v[n:i]) + cob.Write(escaped) + n = i + 1 + } + } + if cob.IsCopied() { + cob.Write(v[n:]) + } + return cob.Bytes() +} + +// UnescapePunctuations unescapes blackslash escaped punctuations. +func UnescapePunctuations(source []byte) []byte { + cob := NewCopyOnWriteBuffer(source) + limit := len(source) + n := 0 + for i := 0; i < limit; { + c := source[i] + if i < limit-1 && c == '\\' && IsPunct(source[i+1]) { + cob.Write(source[n:i]) + _ = cob.WriteByte(source[i+1]) + i += 2 + n = i + continue + } + i++ + } + if cob.IsCopied() { + cob.Write(source[n:]) + } + return cob.Bytes() +} + +// ResolveNumericReferences resolve numeric references like 'Ӓ" . +func ResolveNumericReferences(source []byte) []byte { + cob := NewCopyOnWriteBuffer(source) + buf := make([]byte, 6) + limit := len(source) + var ok bool + n := 0 + for i := 0; i < limit; i++ { + if source[i] == '&' { + pos := i + next := i + 1 + if next < limit && source[next] == '#' { + nnext := next + 1 + if nnext < limit { + nc := source[nnext] + // code point like #x22; + if nnext < limit && nc == 'x' || nc == 'X' { + start := nnext + 1 + i, ok = ReadWhile(source, [2]int{start, limit}, IsHexDecimal) + if ok && i < limit && source[i] == ';' { + v, _ := strconv.ParseUint(BytesToReadOnlyString(source[start:i]), 16, 32) + cob.Write(source[n:pos]) + n = i + 1 + runeSize := utf8.EncodeRune(buf, ToValidRune(rune(v))) + cob.Write(buf[:runeSize]) + continue + } + // code point like #1234; + } else if nc >= '0' && nc <= '9' { + start := nnext + i, ok = ReadWhile(source, [2]int{start, limit}, IsNumeric) + if ok && i < limit && i-start < 8 && source[i] == ';' { + v, _ := strconv.ParseUint(BytesToReadOnlyString(source[start:i]), 0, 32) + cob.Write(source[n:pos]) + n = i + 1 + runeSize := utf8.EncodeRune(buf, ToValidRune(rune(v))) + cob.Write(buf[:runeSize]) + continue + } + } + } + } + i = next - 1 + } + } + if cob.IsCopied() { + cob.Write(source[n:]) + } + return cob.Bytes() +} + +// ResolveEntityNames resolve entity references like 'ö" . +func ResolveEntityNames(source []byte) []byte { + cob := NewCopyOnWriteBuffer(source) + limit := len(source) + var ok bool + n := 0 + for i := 0; i < limit; i++ { + if source[i] == '&' { + pos := i + next := i + 1 + if !(next < limit && source[next] == '#') { + start := next + i, ok = ReadWhile(source, [2]int{start, limit}, IsAlphaNumeric) + if ok && i < limit && source[i] == ';' { + name := BytesToReadOnlyString(source[start:i]) + entity, ok := LookUpHTML5EntityByName(name) + if ok { + cob.Write(source[n:pos]) + n = i + 1 + cob.Write(entity.Characters) + continue + } + } + } + i = next - 1 + } + } + if cob.IsCopied() { + cob.Write(source[n:]) + } + return cob.Bytes() +} + +var htmlSpace = []byte("%20") + +// URLEscape escape the given URL. +// If resolveReference is set true: +// 1. unescape punctuations +// 2. resolve numeric references +// 3. resolve entity references +// +// URL encoded values (%xx) are kept as is. +func URLEscape(v []byte, resolveReference bool) []byte { + if resolveReference { + v = UnescapePunctuations(v) + v = ResolveNumericReferences(v) + v = ResolveEntityNames(v) + } + cob := NewCopyOnWriteBuffer(v) + limit := len(v) + n := 0 + + for i := 0; i < limit; { + c := v[i] + if urlEscapeTable[c] == 1 { + i++ + continue + } + if c == '%' && i+2 < limit && IsHexDecimal(v[i+1]) && IsHexDecimal(v[i+1]) { + i += 3 + continue + } + u8len := utf8lenTable[c] + if u8len == 99 { // invalid utf8 leading byte, skip it + i++ + continue + } + if c == ' ' { + cob.Write(v[n:i]) + cob.Write(htmlSpace) + i++ + n = i + continue + } + if int(u8len) > len(v) { + u8len = int8(len(v) - 1) + } + if u8len == 0 { + i++ + n = i + continue + } + cob.Write(v[n:i]) + stop := i + int(u8len) + if stop > len(v) { + i++ + n = i + continue + } + cob.Write(StringToReadOnlyBytes(url.QueryEscape(string(v[i:stop])))) + i += int(u8len) + n = i + } + if cob.IsCopied() && n < limit { + cob.Write(v[n:]) + } + return cob.Bytes() +} + +// FindURLIndex returns a stop index value if the given bytes seem an URL. +// This function is equivalent to [A-Za-z][A-Za-z0-9.+-]{1,31}:[^<>\x00-\x20]* . +func FindURLIndex(b []byte) int { + i := 0 + if !(len(b) > 0 && urlTable[b[i]]&7 == 7) { + return -1 + } + i++ + for ; i < len(b); i++ { + c := b[i] + if urlTable[c]&4 != 4 { + break + } + } + if i == 1 || i > 33 || i >= len(b) { + return -1 + } + if b[i] != ':' { + return -1 + } + i++ + for ; i < len(b); i++ { + c := b[i] + if urlTable[c]&1 != 1 { + break + } + } + return i +} + +var emailDomainRegexp = regexp.MustCompile(`^[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*`) //nolint:golint,lll + +// FindEmailIndex returns a stop index value if the given bytes seem an email address. +func FindEmailIndex(b []byte) int { + // TODO: eliminate regexps + i := 0 + for ; i < len(b); i++ { + c := b[i] + if emailTable[c]&1 != 1 { + break + } + } + if i == 0 { + return -1 + } + if i >= len(b) || b[i] != '@' { + return -1 + } + i++ + if i >= len(b) { + return -1 + } + match := emailDomainRegexp.FindSubmatchIndex(b[i:]) + if match == nil { + return -1 + } + return i + match[1] +} + +var spaces = []byte(" \t\n\x0b\x0c\x0d") + +var spaceTable = [256]int8{0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} //nolint:golint,lll + +var punctTable = [256]int8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} //nolint:golint,lll + +// a-zA-Z0-9, ;/?:@&=+$,-_.!~*'()# + +var urlEscapeTable = [256]int8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} //nolint:golint,lll + +var utf8lenTable = [256]int8{1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 99, 99, 99, 99, 99, 99, 99, 99} //nolint:golint,lll + +var urlTable = [256]uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 5, 1, 5, 5, 1, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 1, 1, 0, 1, 0, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} //nolint:golint,lll + +var emailTable = [256]uint8{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0} //nolint:golint,lll + +// UTF8Len returns a byte length of the utf-8 character. +func UTF8Len(b byte) int8 { + return utf8lenTable[b] +} + +// IsPunct returns true if the given character is a punctuation, otherwise false. +func IsPunct(c byte) bool { + return punctTable[c] == 1 +} + +// IsPunctRune returns true if the given rune is a punctuation, otherwise false. +func IsPunctRune(r rune) bool { + return unicode.IsSymbol(r) || unicode.IsPunct(r) +} + +// IsSpace returns true if the given character is a space, otherwise false. +func IsSpace(c byte) bool { + return spaceTable[c] == 1 +} + +// IsSpaceRune returns true if the given rune is a space, otherwise false. +func IsSpaceRune(r rune) bool { + return int32(r) <= 256 && IsSpace(byte(r)) || unicode.IsSpace(r) +} + +// IsNumeric returns true if the given character is a numeric, otherwise false. +func IsNumeric(c byte) bool { + return c >= '0' && c <= '9' +} + +// IsHexDecimal returns true if the given character is a hexdecimal, otherwise false. +func IsHexDecimal(c byte) bool { + return c >= '0' && c <= '9' || c >= 'a' && c <= 'f' || c >= 'A' && c <= 'F' +} + +// IsAlphaNumeric returns true if the given character is a alphabet or a numeric, otherwise false. +func IsAlphaNumeric(c byte) bool { + return c >= 'a' && c <= 'z' || c >= 'A' && c <= 'Z' || c >= '0' && c <= '9' +} + +// A BufWriter is a subset of the bufio.Writer . +type BufWriter interface { + io.Writer + Available() int + Buffered() int + Flush() error + WriteByte(c byte) error + WriteRune(r rune) (size int, err error) + WriteString(s string) (int, error) +} + +// A PrioritizedValue struct holds pair of an arbitrary value and a priority. +type PrioritizedValue struct { + // Value is an arbitrary value that you want to prioritize. + Value interface{} + // Priority is a priority of the value. + Priority int +} + +// PrioritizedSlice is a slice of the PrioritizedValues. +type PrioritizedSlice []PrioritizedValue + +// Sort sorts the PrioritizedSlice in ascending order. +func (s PrioritizedSlice) Sort() { + sort.Slice(s, func(i, j int) bool { + return s[i].Priority < s[j].Priority + }) +} + +// Remove removes the given value from this slice. +func (s PrioritizedSlice) Remove(v interface{}) PrioritizedSlice { + i := 0 + found := false + for ; i < len(s); i++ { + if s[i].Value == v { + found = true + break + } + } + if !found { + return s + } + return append(s[:i], s[i+1:]...) +} + +// Prioritized returns a new PrioritizedValue. +func Prioritized(v interface{}, priority int) PrioritizedValue { + return PrioritizedValue{v, priority} +} + +func bytesHash(b []byte) uint64 { + var hash uint64 = 5381 + for _, c := range b { + hash = ((hash << 5) + hash) + uint64(c) + } + return hash +} + +// BytesFilter is a efficient data structure for checking whether bytes exist or not. +// BytesFilter is thread-safe. +type BytesFilter interface { + // Add adds given bytes to this set. + Add([]byte) + + // Contains return true if this set contains given bytes, otherwise false. + Contains([]byte) bool + + // Extend copies this filter and adds given bytes to new filter. + Extend(...[]byte) BytesFilter +} + +type bytesFilter struct { + chars [256]uint8 + threshold int + slots [][][]byte +} + +// NewBytesFilter returns a new BytesFilter. +func NewBytesFilter(elements ...[]byte) BytesFilter { + s := &bytesFilter{ + threshold: 3, + slots: make([][][]byte, 64), + } + for _, element := range elements { + s.Add(element) + } + return s +} + +func (s *bytesFilter) Add(b []byte) { + l := len(b) + m := s.threshold + if l < s.threshold { + m = l + } + for i := 0; i < m; i++ { + s.chars[b[i]] |= 1 << uint8(i) + } + h := bytesHash(b) % uint64(len(s.slots)) + slot := s.slots[h] + if slot == nil { + slot = [][]byte{} + } + s.slots[h] = append(slot, b) +} + +func (s *bytesFilter) Extend(bs ...[]byte) BytesFilter { + newFilter := NewBytesFilter().(*bytesFilter) + newFilter.chars = s.chars + newFilter.threshold = s.threshold + for k, v := range s.slots { + newSlot := make([][]byte, len(v)) + copy(newSlot, v) + newFilter.slots[k] = v + } + for _, b := range bs { + newFilter.Add(b) + } + return newFilter +} + +func (s *bytesFilter) Contains(b []byte) bool { + l := len(b) + m := s.threshold + if l < s.threshold { + m = l + } + for i := 0; i < m; i++ { + if (s.chars[b[i]] & (1 << uint8(i))) == 0 { + return false + } + } + h := bytesHash(b) % uint64(len(s.slots)) + slot := s.slots[h] + if len(slot) == 0 { + return false + } + for _, element := range slot { + if bytes.Equal(element, b) { + return true + } + } + return false +} diff --git a/vendor/github.com/yuin/goldmark/util/util_cjk.go b/vendor/github.com/yuin/goldmark/util/util_cjk.go new file mode 100644 index 0000000..d758107 --- /dev/null +++ b/vendor/github.com/yuin/goldmark/util/util_cjk.go @@ -0,0 +1,469 @@ +package util + +import "unicode" + +var cjkRadicalsSupplement = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x2E80, 0x2EFF, 1}, + }, +} + +var kangxiRadicals = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x2F00, 0x2FDF, 1}, + }, +} + +var ideographicDescriptionCharacters = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x2FF0, 0x2FFF, 1}, + }, +} + +var cjkSymbolsAndPunctuation = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x3000, 0x303F, 1}, + }, +} + +var hiragana = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x3040, 0x309F, 1}, + }, +} + +var katakana = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x30A0, 0x30FF, 1}, + }, +} + +var kanbun = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x3130, 0x318F, 1}, + {0x3190, 0x319F, 1}, + }, +} + +var cjkStrokes = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x31C0, 0x31EF, 1}, + }, +} + +var katakanaPhoneticExtensions = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x31F0, 0x31FF, 1}, + }, +} + +var cjkCompatibility = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x3300, 0x33FF, 1}, + }, +} + +var cjkUnifiedIdeographsExtensionA = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x3400, 0x4DBF, 1}, + }, +} + +var cjkUnifiedIdeographs = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0x4E00, 0x9FFF, 1}, + }, +} + +var yiSyllables = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0xA000, 0xA48F, 1}, + }, +} + +var yiRadicals = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0xA490, 0xA4CF, 1}, + }, +} + +var cjkCompatibilityIdeographs = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0xF900, 0xFAFF, 1}, + }, +} + +var verticalForms = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0xFE10, 0xFE1F, 1}, + }, +} + +var cjkCompatibilityForms = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0xFE30, 0xFE4F, 1}, + }, +} + +var smallFormVariants = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0xFE50, 0xFE6F, 1}, + }, +} + +var halfwidthAndFullwidthForms = &unicode.RangeTable{ + R16: []unicode.Range16{ + {0xFF00, 0xFFEF, 1}, + }, +} + +var kanaSupplement = &unicode.RangeTable{ + R32: []unicode.Range32{ + {0x1B000, 0x1B0FF, 1}, + }, +} + +var kanaExtendedA = &unicode.RangeTable{ + R32: []unicode.Range32{ + {0x1B100, 0x1B12F, 1}, + }, +} + +var smallKanaExtension = &unicode.RangeTable{ + R32: []unicode.Range32{ + {0x1B130, 0x1B16F, 1}, + }, +} + +var cjkUnifiedIdeographsExtensionB = &unicode.RangeTable{ + R32: []unicode.Range32{ + {0x20000, 0x2A6DF, 1}, + }, +} + +var cjkUnifiedIdeographsExtensionC = &unicode.RangeTable{ + R32: []unicode.Range32{ + {0x2A700, 0x2B73F, 1}, + }, +} + +var cjkUnifiedIdeographsExtensionD = &unicode.RangeTable{ + R32: []unicode.Range32{ + {0x2B740, 0x2B81F, 1}, + }, +} + +var cjkUnifiedIdeographsExtensionE = &unicode.RangeTable{ + R32: []unicode.Range32{ + {0x2B820, 0x2CEAF, 1}, + }, +} + +var cjkUnifiedIdeographsExtensionF = &unicode.RangeTable{ + R32: []unicode.Range32{ + {0x2CEB0, 0x2EBEF, 1}, + }, +} + +var cjkCompatibilityIdeographsSupplement = &unicode.RangeTable{ + R32: []unicode.Range32{ + {0x2F800, 0x2FA1F, 1}, + }, +} + +var cjkUnifiedIdeographsExtensionG = &unicode.RangeTable{ + R32: []unicode.Range32{ + {0x30000, 0x3134F, 1}, + }, +} + +// IsEastAsianWideRune returns trhe if the given rune is an east asian wide character, otherwise false. +func IsEastAsianWideRune(r rune) bool { + return unicode.Is(unicode.Hiragana, r) || + unicode.Is(unicode.Katakana, r) || + unicode.Is(unicode.Han, r) || + unicode.Is(unicode.Lm, r) || + unicode.Is(unicode.Hangul, r) || + unicode.Is(cjkSymbolsAndPunctuation, r) +} + +// IsSpaceDiscardingUnicodeRune returns true if the given rune is space-discarding unicode character, otherwise false. +// See https://www.w3.org/TR/2020/WD-css-text-3-20200429/#space-discard-set +func IsSpaceDiscardingUnicodeRune(r rune) bool { + return unicode.Is(cjkRadicalsSupplement, r) || + unicode.Is(kangxiRadicals, r) || + unicode.Is(ideographicDescriptionCharacters, r) || + unicode.Is(cjkSymbolsAndPunctuation, r) || + unicode.Is(hiragana, r) || + unicode.Is(katakana, r) || + unicode.Is(kanbun, r) || + unicode.Is(cjkStrokes, r) || + unicode.Is(katakanaPhoneticExtensions, r) || + unicode.Is(cjkCompatibility, r) || + unicode.Is(cjkUnifiedIdeographsExtensionA, r) || + unicode.Is(cjkUnifiedIdeographs, r) || + unicode.Is(yiSyllables, r) || + unicode.Is(yiRadicals, r) || + unicode.Is(cjkCompatibilityIdeographs, r) || + unicode.Is(verticalForms, r) || + unicode.Is(cjkCompatibilityForms, r) || + unicode.Is(smallFormVariants, r) || + unicode.Is(halfwidthAndFullwidthForms, r) || + unicode.Is(kanaSupplement, r) || + unicode.Is(kanaExtendedA, r) || + unicode.Is(smallKanaExtension, r) || + unicode.Is(cjkUnifiedIdeographsExtensionB, r) || + unicode.Is(cjkUnifiedIdeographsExtensionC, r) || + unicode.Is(cjkUnifiedIdeographsExtensionD, r) || + unicode.Is(cjkUnifiedIdeographsExtensionE, r) || + unicode.Is(cjkUnifiedIdeographsExtensionF, r) || + unicode.Is(cjkCompatibilityIdeographsSupplement, r) || + unicode.Is(cjkUnifiedIdeographsExtensionG, r) +} + +// EastAsianWidth returns the east asian width of the given rune. +// See https://www.unicode.org/reports/tr11/tr11-36.html +func EastAsianWidth(r rune) string { + switch { + case r == 0x3000, + (0xFF01 <= r && r <= 0xFF60), + (0xFFE0 <= r && r <= 0xFFE6): + return "F" + + case r == 0x20A9, + (0xFF61 <= r && r <= 0xFFBE), + (0xFFC2 <= r && r <= 0xFFC7), + (0xFFCA <= r && r <= 0xFFCF), + (0xFFD2 <= r && r <= 0xFFD7), + (0xFFDA <= r && r <= 0xFFDC), + (0xFFE8 <= r && r <= 0xFFEE): + return "H" + + case (0x1100 <= r && r <= 0x115F), + (0x11A3 <= r && r <= 0x11A7), + (0x11FA <= r && r <= 0x11FF), + (0x2329 <= r && r <= 0x232A), + (0x2E80 <= r && r <= 0x2E99), + (0x2E9B <= r && r <= 0x2EF3), + (0x2F00 <= r && r <= 0x2FD5), + (0x2FF0 <= r && r <= 0x2FFB), + (0x3001 <= r && r <= 0x303E), + (0x3041 <= r && r <= 0x3096), + (0x3099 <= r && r <= 0x30FF), + (0x3105 <= r && r <= 0x312D), + (0x3131 <= r && r <= 0x318E), + (0x3190 <= r && r <= 0x31BA), + (0x31C0 <= r && r <= 0x31E3), + (0x31F0 <= r && r <= 0x321E), + (0x3220 <= r && r <= 0x3247), + (0x3250 <= r && r <= 0x32FE), + (0x3300 <= r && r <= 0x4DBF), + (0x4E00 <= r && r <= 0xA48C), + (0xA490 <= r && r <= 0xA4C6), + (0xA960 <= r && r <= 0xA97C), + (0xAC00 <= r && r <= 0xD7A3), + (0xD7B0 <= r && r <= 0xD7C6), + (0xD7CB <= r && r <= 0xD7FB), + (0xF900 <= r && r <= 0xFAFF), + (0xFE10 <= r && r <= 0xFE19), + (0xFE30 <= r && r <= 0xFE52), + (0xFE54 <= r && r <= 0xFE66), + (0xFE68 <= r && r <= 0xFE6B), + (0x1B000 <= r && r <= 0x1B001), + (0x1F200 <= r && r <= 0x1F202), + (0x1F210 <= r && r <= 0x1F23A), + (0x1F240 <= r && r <= 0x1F248), + (0x1F250 <= r && r <= 0x1F251), + (0x20000 <= r && r <= 0x2F73F), + (0x2B740 <= r && r <= 0x2FFFD), + (0x30000 <= r && r <= 0x3FFFD): + return "W" + + case (0x0020 <= r && r <= 0x007E), + (0x00A2 <= r && r <= 0x00A3), + (0x00A5 <= r && r <= 0x00A6), + r == 0x00AC, + r == 0x00AF, + (0x27E6 <= r && r <= 0x27ED), + (0x2985 <= r && r <= 0x2986): + return "Na" + + case (0x00A1 == r), + (0x00A4 == r), + (0x00A7 <= r && r <= 0x00A8), + (0x00AA == r), + (0x00AD <= r && r <= 0x00AE), + (0x00B0 <= r && r <= 0x00B4), + (0x00B6 <= r && r <= 0x00BA), + (0x00BC <= r && r <= 0x00BF), + (0x00C6 == r), + (0x00D0 == r), + (0x00D7 <= r && r <= 0x00D8), + (0x00DE <= r && r <= 0x00E1), + (0x00E6 == r), + (0x00E8 <= r && r <= 0x00EA), + (0x00EC <= r && r <= 0x00ED), + (0x00F0 == r), + (0x00F2 <= r && r <= 0x00F3), + (0x00F7 <= r && r <= 0x00FA), + (0x00FC == r), + (0x00FE == r), + (0x0101 == r), + (0x0111 == r), + (0x0113 == r), + (0x011B == r), + (0x0126 <= r && r <= 0x0127), + (0x012B == r), + (0x0131 <= r && r <= 0x0133), + (0x0138 == r), + (0x013F <= r && r <= 0x0142), + (0x0144 == r), + (0x0148 <= r && r <= 0x014B), + (0x014D == r), + (0x0152 <= r && r <= 0x0153), + (0x0166 <= r && r <= 0x0167), + (0x016B == r), + (0x01CE == r), + (0x01D0 == r), + (0x01D2 == r), + (0x01D4 == r), + (0x01D6 == r), + (0x01D8 == r), + (0x01DA == r), + (0x01DC == r), + (0x0251 == r), + (0x0261 == r), + (0x02C4 == r), + (0x02C7 == r), + (0x02C9 <= r && r <= 0x02CB), + (0x02CD == r), + (0x02D0 == r), + (0x02D8 <= r && r <= 0x02DB), + (0x02DD == r), + (0x02DF == r), + (0x0300 <= r && r <= 0x036F), + (0x0391 <= r && r <= 0x03A1), + (0x03A3 <= r && r <= 0x03A9), + (0x03B1 <= r && r <= 0x03C1), + (0x03C3 <= r && r <= 0x03C9), + (0x0401 == r), + (0x0410 <= r && r <= 0x044F), + (0x0451 == r), + (0x2010 == r), + (0x2013 <= r && r <= 0x2016), + (0x2018 <= r && r <= 0x2019), + (0x201C <= r && r <= 0x201D), + (0x2020 <= r && r <= 0x2022), + (0x2024 <= r && r <= 0x2027), + (0x2030 == r), + (0x2032 <= r && r <= 0x2033), + (0x2035 == r), + (0x203B == r), + (0x203E == r), + (0x2074 == r), + (0x207F == r), + (0x2081 <= r && r <= 0x2084), + (0x20AC == r), + (0x2103 == r), + (0x2105 == r), + (0x2109 == r), + (0x2113 == r), + (0x2116 == r), + (0x2121 <= r && r <= 0x2122), + (0x2126 == r), + (0x212B == r), + (0x2153 <= r && r <= 0x2154), + (0x215B <= r && r <= 0x215E), + (0x2160 <= r && r <= 0x216B), + (0x2170 <= r && r <= 0x2179), + (0x2189 == r), + (0x2190 <= r && r <= 0x2199), + (0x21B8 <= r && r <= 0x21B9), + (0x21D2 == r), + (0x21D4 == r), + (0x21E7 == r), + (0x2200 == r), + (0x2202 <= r && r <= 0x2203), + (0x2207 <= r && r <= 0x2208), + (0x220B == r), + (0x220F == r), + (0x2211 == r), + (0x2215 == r), + (0x221A == r), + (0x221D <= r && r <= 0x2220), + (0x2223 == r), + (0x2225 == r), + (0x2227 <= r && r <= 0x222C), + (0x222E == r), + (0x2234 <= r && r <= 0x2237), + (0x223C <= r && r <= 0x223D), + (0x2248 == r), + (0x224C == r), + (0x2252 == r), + (0x2260 <= r && r <= 0x2261), + (0x2264 <= r && r <= 0x2267), + (0x226A <= r && r <= 0x226B), + (0x226E <= r && r <= 0x226F), + (0x2282 <= r && r <= 0x2283), + (0x2286 <= r && r <= 0x2287), + (0x2295 == r), + (0x2299 == r), + (0x22A5 == r), + (0x22BF == r), + (0x2312 == r), + (0x2460 <= r && r <= 0x24E9), + (0x24EB <= r && r <= 0x254B), + (0x2550 <= r && r <= 0x2573), + (0x2580 <= r && r <= 0x258F), + (0x2592 <= r && r <= 0x2595), + (0x25A0 <= r && r <= 0x25A1), + (0x25A3 <= r && r <= 0x25A9), + (0x25B2 <= r && r <= 0x25B3), + (0x25B6 <= r && r <= 0x25B7), + (0x25BC <= r && r <= 0x25BD), + (0x25C0 <= r && r <= 0x25C1), + (0x25C6 <= r && r <= 0x25C8), + (0x25CB == r), + (0x25CE <= r && r <= 0x25D1), + (0x25E2 <= r && r <= 0x25E5), + (0x25EF == r), + (0x2605 <= r && r <= 0x2606), + (0x2609 == r), + (0x260E <= r && r <= 0x260F), + (0x2614 <= r && r <= 0x2615), + (0x261C == r), + (0x261E == r), + (0x2640 == r), + (0x2642 == r), + (0x2660 <= r && r <= 0x2661), + (0x2663 <= r && r <= 0x2665), + (0x2667 <= r && r <= 0x266A), + (0x266C <= r && r <= 0x266D), + (0x266F == r), + (0x269E <= r && r <= 0x269F), + (0x26BE <= r && r <= 0x26BF), + (0x26C4 <= r && r <= 0x26CD), + (0x26CF <= r && r <= 0x26E1), + (0x26E3 == r), + (0x26E8 <= r && r <= 0x26FF), + (0x273D == r), + (0x2757 == r), + (0x2776 <= r && r <= 0x277F), + (0x2B55 <= r && r <= 0x2B59), + (0x3248 <= r && r <= 0x324F), + (0xE000 <= r && r <= 0xF8FF), + (0xFE00 <= r && r <= 0xFE0F), + (0xFFFD == r), + (0x1F100 <= r && r <= 0x1F10A), + (0x1F110 <= r && r <= 0x1F12D), + (0x1F130 <= r && r <= 0x1F169), + (0x1F170 <= r && r <= 0x1F19A), + (0xE0100 <= r && r <= 0xE01EF), + (0xF0000 <= r && r <= 0xFFFFD), + (0x100000 <= r && r <= 0x10FFFD): + return "A" + + default: + return "N" + } +} diff --git a/vendor/github.com/yuin/goldmark/util/util_safe.go b/vendor/github.com/yuin/goldmark/util/util_safe.go new file mode 100644 index 0000000..2f6a3fe --- /dev/null +++ b/vendor/github.com/yuin/goldmark/util/util_safe.go @@ -0,0 +1,14 @@ +//go:build appengine || js +// +build appengine js + +package util + +// BytesToReadOnlyString returns a string converted from given bytes. +func BytesToReadOnlyString(b []byte) string { + return string(b) +} + +// StringToReadOnlyBytes returns bytes converted from given string. +func StringToReadOnlyBytes(s string) []byte { + return []byte(s) +} diff --git a/vendor/github.com/yuin/goldmark/util/util_unsafe.go b/vendor/github.com/yuin/goldmark/util/util_unsafe.go new file mode 100644 index 0000000..840007a --- /dev/null +++ b/vendor/github.com/yuin/goldmark/util/util_unsafe.go @@ -0,0 +1,24 @@ +//go:build !appengine && !js +// +build !appengine,!js + +package util + +import ( + "reflect" + "unsafe" +) + +// BytesToReadOnlyString returns a string converted from given bytes. +func BytesToReadOnlyString(b []byte) string { + return *(*string)(unsafe.Pointer(&b)) +} + +// StringToReadOnlyBytes returns bytes converted from given string. +func StringToReadOnlyBytes(s string) (bs []byte) { + sh := (*reflect.StringHeader)(unsafe.Pointer(&s)) + bh := (*reflect.SliceHeader)(unsafe.Pointer(&bs)) + bh.Data = sh.Data + bh.Cap = sh.Len + bh.Len = sh.Len + return +} diff --git a/vendor/modules.txt b/vendor/modules.txt new file mode 100644 index 0000000..937f734 --- /dev/null +++ b/vendor/modules.txt @@ -0,0 +1,67 @@ +# github.com/alecthomas/chroma v0.10.0 +## explicit; go 1.13 +github.com/alecthomas/chroma +github.com/alecthomas/chroma/formatters/html +github.com/alecthomas/chroma/lexers +github.com/alecthomas/chroma/lexers/a +github.com/alecthomas/chroma/lexers/b +github.com/alecthomas/chroma/lexers/c +github.com/alecthomas/chroma/lexers/circular +github.com/alecthomas/chroma/lexers/d +github.com/alecthomas/chroma/lexers/e +github.com/alecthomas/chroma/lexers/f +github.com/alecthomas/chroma/lexers/g +github.com/alecthomas/chroma/lexers/h +github.com/alecthomas/chroma/lexers/i +github.com/alecthomas/chroma/lexers/internal +github.com/alecthomas/chroma/lexers/j +github.com/alecthomas/chroma/lexers/k +github.com/alecthomas/chroma/lexers/l +github.com/alecthomas/chroma/lexers/m +github.com/alecthomas/chroma/lexers/n +github.com/alecthomas/chroma/lexers/o +github.com/alecthomas/chroma/lexers/p +github.com/alecthomas/chroma/lexers/q +github.com/alecthomas/chroma/lexers/r +github.com/alecthomas/chroma/lexers/s +github.com/alecthomas/chroma/lexers/t +github.com/alecthomas/chroma/lexers/v +github.com/alecthomas/chroma/lexers/w +github.com/alecthomas/chroma/lexers/x +github.com/alecthomas/chroma/lexers/y +github.com/alecthomas/chroma/lexers/z +github.com/alecthomas/chroma/styles +# github.com/dlclark/regexp2 v1.11.4 +## explicit; go 1.13 +github.com/dlclark/regexp2 +github.com/dlclark/regexp2/syntax +# github.com/elliotchance/orderedmap/v2 v2.4.0 +## explicit; go 1.18 +github.com/elliotchance/orderedmap/v2 +# github.com/gorilla/feeds v1.2.0 +## explicit; go 1.20 +github.com/gorilla/feeds +# github.com/gosimple/slug v1.14.0 +## explicit; go 1.11 +github.com/gosimple/slug +# github.com/gosimple/unidecode v1.0.1 +## explicit; go 1.16 +github.com/gosimple/unidecode +# github.com/teekennedy/goldmark-markdown v0.3.0 => github.com/thiagokokada/goldmark-markdown v0.0.0-20240820111219-f30775d8ed15 +## explicit; go 1.21 +github.com/teekennedy/goldmark-markdown +# github.com/yuin/goldmark v1.7.4 +## explicit; go 1.19 +github.com/yuin/goldmark +github.com/yuin/goldmark/ast +github.com/yuin/goldmark/extension +github.com/yuin/goldmark/extension/ast +github.com/yuin/goldmark/parser +github.com/yuin/goldmark/renderer +github.com/yuin/goldmark/renderer/html +github.com/yuin/goldmark/text +github.com/yuin/goldmark/util +# github.com/yuin/goldmark-highlighting v0.0.0-20220208100518-594be1970594 +## explicit; go 1.13 +github.com/yuin/goldmark-highlighting +# github.com/teekennedy/goldmark-markdown => github.com/thiagokokada/goldmark-markdown v0.0.0-20240820111219-f30775d8ed15
    ')
    +	}
    +	l := n.Lines().Len()
    +	for i := 0; i < l; i++ {
    +		line := n.Lines().At(i)
    +		r.Writer.RawWrite(w, line.Value(source))
    +	}
    +	if r.WrapperRenderer != nil {
    +		r.WrapperRenderer(w, c, false)
    +	} else {
    +		_, _ = w.WriteString("