You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucy.apache.org by nw...@apache.org on 2015/01/18 19:44:37 UTC

[01/12] lucy-clownfish git commit: Probe for va_copy needed by CommonMark

Repository: lucy-clownfish
Updated Branches:
  refs/heads/master 9e23ec51b -> aa82267a9


Probe for va_copy needed by CommonMark


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/9a13d0b1
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/9a13d0b1
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/9a13d0b1

Branch: refs/heads/master
Commit: 9a13d0b108e1409b7724b1696ac88b3099207e89
Parents: 9e23ec5
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sat Jan 10 18:42:24 2015 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sat Jan 10 18:42:24 2015 +0100

----------------------------------------------------------------------
 compiler/common/charmonizer.main | 5 +++++
 1 file changed, 5 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/9a13d0b1/compiler/common/charmonizer.main
----------------------------------------------------------------------
diff --git a/compiler/common/charmonizer.main b/compiler/common/charmonizer.main
index 1aff90c..d760a7a 100644
--- a/compiler/common/charmonizer.main
+++ b/compiler/common/charmonizer.main
@@ -77,6 +77,11 @@ int main(int argc, const char **argv) {
         S_write_makefile(cli);
     }
 
+    /* Needed by cmark. */
+    if (chaz_HeadCheck_defines_symbol("va_copy", "#include <stdarg.h>")) {
+        chaz_ConfWriter_append_conf("#define CHY_HAS_VA_COPY\n\n");
+    }
+
     /* Clean up. */
     chaz_CLI_destroy(cli);
     chaz_Probe_clean_up();


[03/12] lucy-clownfish git commit: Update CommonMark source code

Posted by nw...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/scanners.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/scanners.h b/compiler/modules/CommonMark/src/scanners.h
index aa5c00d..f360505 100644
--- a/compiler/modules/CommonMark/src/scanners.h
+++ b/compiler/modules/CommonMark/src/scanners.h
@@ -5,7 +5,7 @@
 extern "C" {
 #endif
 
-int _scan_at(int (*scanner)(const unsigned char *), chunk *c, int offset);
+int _scan_at(int (*scanner)(const unsigned char *), cmark_chunk *c, int offset);
 int _scan_autolink_uri(const unsigned char *p);
 int _scan_autolink_email(const unsigned char *p);
 int _scan_html_tag(const unsigned char *p);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/scanners.re
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/scanners.re b/compiler/modules/CommonMark/src/scanners.re
index 5e74873..d83efde 100644
--- a/compiler/modules/CommonMark/src/scanners.re
+++ b/compiler/modules/CommonMark/src/scanners.re
@@ -2,7 +2,7 @@
 #include "chunk.h"
 #include "scanners.h"
 
-int _scan_at(int (*scanner)(const unsigned char *), chunk *c, int offset)
+int _scan_at(int (*scanner)(const unsigned char *), cmark_chunk *c, int offset)
 {
 	int res;
 	unsigned char *ptr = (unsigned char *)c->data;
@@ -49,7 +49,7 @@ int _scan_at(int (*scanner)(const unsigned char *), chunk *c, int offset)
   opentag = tagname attribute* spacechar* [/]? [>];
   closetag = [/] tagname spacechar* [>];
 
-  htmlcomment = "!--" ([^-\x00]+ | [-][^-\x00]+)* "-->";
+  htmlcomment = "!---->" | ("!--" ([-]? [^\x00>-]) ([-]? [^\x00-])* "-->");
 
   processinginstruction = "?" ([^?>\x00]+ | [?][^>\x00] | [>])* "?>";
 
@@ -216,7 +216,8 @@ int _scan_close_code_fence(const unsigned char *p)
   const unsigned char *marker = NULL;
   const unsigned char *start = p;
 /*!re2c
-  ([`]{3,} | [~]{3,}) / spacechar* [\n] { return (p - start); }
+  [`]{3,} / [ \t]*[\n] { return (p - start); }
+  [~]{3,} / [ \t]*[\n] { return (p - start); }
   .? { return 0; }
 */
 }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/utf8.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/utf8.c b/compiler/modules/CommonMark/src/utf8.c
index e4ea8e2..d77c5d1 100644
--- a/compiler/modules/CommonMark/src/utf8.c
+++ b/compiler/modules/CommonMark/src/utf8.c
@@ -2,6 +2,7 @@
 #include <stdint.h>
 #include <assert.h>
 
+#include "cmark_ctype.h"
 #include "utf8.h"
 
 static const int8_t utf8proc_utf8class[256] = {
@@ -20,12 +21,13 @@ static const int8_t utf8proc_utf8class[256] = {
 	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, 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, 0, 0, 0, 0, 0, 0, 0, 0 };
+	4, 4, 4, 4, 4, 4, 4, 4, 0, 0, 0, 0, 0, 0, 0, 0
+};
 
-static void encode_unknown(strbuf *buf)
+static void encode_unknown(cmark_strbuf *buf)
 {
 	static const uint8_t repl[] = {239, 191, 189};
-	strbuf_put(buf, repl, 3);
+	cmark_strbuf_put(buf, repl, 3);
 }
 
 static int utf8proc_charlen(const uint8_t *str, int str_len)
@@ -81,8 +83,7 @@ static int utf8proc_valid(const uint8_t *str, int str_len)
 				// Overlong
 				return -length;
 			}
-		}
-		else if (str[0] == 0xED) {
+		} else if (str[0] == 0xED) {
 			if (str[1] >= 0xA0) {
 				// Surrogate
 				return -length;
@@ -96,8 +97,7 @@ static int utf8proc_valid(const uint8_t *str, int str_len)
 				// Overlong
 				return -length;
 			}
-		}
-		else if (str[0] >= 0xF4) {
+		} else if (str[0] >= 0xF4) {
 			if (str[0] > 0xF4 || str[1] >= 0x90) {
 				// Above 0x10FFFF
 				return -length;
@@ -109,7 +109,7 @@ static int utf8proc_valid(const uint8_t *str, int str_len)
 	return length;
 }
 
-void utf8proc_detab(strbuf *ob, const uint8_t *line, size_t size)
+void utf8proc_detab(cmark_strbuf *ob, const uint8_t *line, size_t size)
 {
 	static const uint8_t whitespace[] = "    ";
 
@@ -120,25 +120,26 @@ void utf8proc_detab(strbuf *ob, const uint8_t *line, size_t size)
 
 		while (i < size && line[i] != '\t' && line[i] != '\0'
 		       && line[i] < 0x80) {
-			i++; tab++;
+			i++;
+			tab++;
 		}
 
 		if (i > org)
-			strbuf_put(ob, line + org, i - org);
+			cmark_strbuf_put(ob, line + org, i - org);
 
 		if (i >= size)
 			break;
 
 		if (line[i] == '\t') {
 			int numspaces = 4 - (tab % 4);
-			strbuf_put(ob, whitespace, numspaces);
+			cmark_strbuf_put(ob, whitespace, numspaces);
 			i += 1;
 			tab += numspaces;
 		} else {
 			int charlen = utf8proc_valid(line + i, size - i);
 
 			if (charlen >= 0) {
-				strbuf_put(ob, line + i, charlen);
+				cmark_strbuf_put(ob, line + i, charlen);
 			} else {
 				encode_unknown(ob);
 				charlen = -charlen;
@@ -170,13 +171,13 @@ int utf8proc_iterate(const uint8_t *str, int str_len, int32_t *dst)
 		break;
 	case 3:
 		uc = ((str[0] & 0x0F) << 12) + ((str[1] & 0x3F) <<  6)
-			+ (str[2] & 0x3F);
+		     + (str[2] & 0x3F);
 		if (uc < 0x800 || (uc >= 0xD800 && uc < 0xE000) ||
 		    (uc >= 0xFDD0 && uc < 0xFDF0)) uc = -1;
 		break;
 	case 4:
 		uc = ((str[0] & 0x07) << 18) + ((str[1] & 0x3F) << 12)
-			+ ((str[2] & 0x3F) <<  6) + (str[3] & 0x3F);
+		     + ((str[2] & 0x3F) <<  6) + (str[3] & 0x3F);
 		if (uc < 0x10000 || uc >= 0x110000) uc = -1;
 		break;
 	}
@@ -188,7 +189,7 @@ int utf8proc_iterate(const uint8_t *str, int str_len, int32_t *dst)
 	return length;
 }
 
-void utf8proc_encode_char(int32_t uc, strbuf *buf)
+void utf8proc_encode_char(int32_t uc, cmark_strbuf *buf)
 {
 	uint8_t dst[4];
 	int len = 0;
@@ -224,10 +225,10 @@ void utf8proc_encode_char(int32_t uc, strbuf *buf)
 		return;
 	}
 
-	strbuf_put(buf, dst, len);
+	cmark_strbuf_put(buf, dst, len);
 }
 
-void utf8proc_case_fold(strbuf *dest, const uint8_t *str, int len)
+void utf8proc_case_fold(cmark_strbuf *dest, const uint8_t *str, int len)
 {
 	int32_t c;
 
@@ -253,210 +254,200 @@ void utf8proc_case_fold(strbuf *dest, const uint8_t *str, int len)
 int utf8proc_is_space(int32_t uc)
 {
 	return (uc == 9 ||
-		uc == 10 ||
-		uc == 12 ||
-		uc == 13 ||
-		uc == 32 ||
-		uc == 160 ||
-		uc == 5760 ||
-		(uc >= 8192 && uc <= 8202) ||
-		uc == 8239 ||
-		uc == 8287 ||
-		uc == 12288);
+	        uc == 10 ||
+	        uc == 12 ||
+	        uc == 13 ||
+	        uc == 32 ||
+	        uc == 160 ||
+	        uc == 5760 ||
+	        (uc >= 8192 && uc <= 8202) ||
+	        uc == 8239 ||
+	        uc == 8287 ||
+	        uc == 12288);
 }
 
 // matches anything in the P[cdefios] classes.
 int utf8proc_is_punctuation(int32_t uc)
 {
-	return ((uc >= 33 && uc <= 35) ||
-		(uc >= 37 && uc <= 42) ||
-		(uc >= 44 && uc <= 47) ||
-		uc == 58 ||
-		uc == 59 ||
-		uc == 63 ||
-		uc == 64 ||
-		(uc >= 91 && uc <= 93) ||
-		uc == 95 ||
-		uc == 123 ||
-		uc == 125 ||
-		uc == 161 ||
-		uc == 167 ||
-		uc == 171 ||
-		uc == 182 ||
-		uc == 183 ||
-		uc == 187 ||
-		uc == 191 ||
-		uc == 894 ||
-		uc == 903 ||
-		(uc >= 1370 && uc <= 1375) ||
-		uc == 1417 ||
-		uc == 1418 ||
-		uc == 1470 ||
-		uc == 1472 ||
-		uc == 1475 ||
-		uc == 1478 ||
-		uc == 1523 ||
-		uc == 1524 ||
-		uc == 1545 ||
-		uc == 1546 ||
-		uc == 1548 ||
-		uc == 1549 ||
-		uc == 1563 ||
-		uc == 1566 ||
-		uc == 1567 ||
-		(uc >= 1642 && uc <= 1645) ||
-		uc == 1748 ||
-		(uc >= 1792 && uc <= 1805) ||
-		(uc >= 2039 && uc <= 2041) ||
-		(uc >= 2096 && uc <= 2110) ||
-		uc == 2142 ||
-		uc == 2404 ||
-		uc == 2405 ||
-		uc == 2416 ||
-		uc == 2800 ||
-		uc == 3572 ||
-		uc == 3663 ||
-		uc == 3674 ||
-		uc == 3675 ||
-		(uc >= 3844 && uc <= 3858) ||
-		uc == 3860 ||
-		(uc >= 3898 && uc <= 3901) ||
-		uc == 3973 ||
-		(uc >= 4048 && uc <= 4052) ||
-		uc == 4057 ||
-		uc == 4058 ||
-		(uc >= 4170 && uc <= 4175) ||
-		uc == 4347 ||
-		(uc >= 4960 && uc <= 4968) ||
-		uc == 5120 ||
-		uc == 5741 ||
-		uc == 5742 ||
-		uc == 5787 ||
-		uc == 5788 ||
-		(uc >= 5867 && uc <= 5869) ||
-		uc == 5941 ||
-		uc == 5942 ||
-		(uc >= 6100 && uc <= 6102) ||
-		(uc >= 6104 && uc <= 6106) ||
-		(uc >= 6144 && uc <= 6154) ||
-		uc == 6468 ||
-		uc == 6469 ||
-		uc == 6686 ||
-		uc == 6687 ||
-		(uc >= 6816 && uc <= 6822) ||
-		(uc >= 6824 && uc <= 6829) ||
-		(uc >= 7002 && uc <= 7008) ||
-		(uc >= 7164 && uc <= 7167) ||
-		(uc >= 7227 && uc <= 7231) ||
-		uc == 7294 ||
-		uc == 7295 ||
-		(uc >= 7360 && uc <= 7367) ||
-		uc == 7379 ||
-		(uc >= 8208 && uc <= 8231) ||
-		(uc >= 8240 && uc <= 8259) ||
-		(uc >= 8261 && uc <= 8273) ||
-		(uc >= 8275 && uc <= 8286) ||
-		uc == 8317 ||
-		uc == 8318 ||
-		uc == 8333 ||
-		uc == 8334 ||
-		(uc >= 8968 && uc <= 8971) ||
-		uc == 9001 ||
-		uc == 9002 ||
-		(uc >= 10088 && uc <= 10101) ||
-		uc == 10181 ||
-		uc == 10182 ||
-		(uc >= 10214 && uc <= 10223) ||
-		(uc >= 10627 && uc <= 10648) ||
-		(uc >= 10712 && uc <= 10715) ||
-		uc == 10748 ||
-		uc == 10749 ||
-		(uc >= 11513 && uc <= 11516) ||
-		uc == 11518 ||
-		uc == 11519 ||
-		uc == 11632 ||
-		(uc >= 11776 && uc <= 11822) ||
-		(uc >= 11824 && uc <= 11842) ||
-		(uc >= 12289 && uc <= 12291) ||
-		(uc >= 12296 && uc <= 12305) ||
-		(uc >= 12308 && uc <= 12319) ||
-		uc == 12336 ||
-		uc == 12349 ||
-		uc == 12448 ||
-		uc == 12539 ||
-		uc == 42238 ||
-		uc == 42239 ||
-		(uc >= 42509 && uc <= 42511) ||
-		uc == 42611 ||
-		uc == 42622 ||
-		(uc >= 42738 && uc <= 42743) ||
-		(uc >= 43124 && uc <= 43127) ||
-		uc == 43214 ||
-		uc == 43215 ||
-		(uc >= 43256 && uc <= 43258) ||
-		uc == 43310 ||
-		uc == 43311 ||
-		uc == 43359 ||
-		(uc >= 43457 && uc <= 43469) ||
-		uc == 43486 ||
-		uc == 43487 ||
-		(uc >= 43612 && uc <= 43615) ||
-		uc == 43742 ||
-		uc == 43743 ||
-		uc == 43760 ||
-		uc == 43761 ||
-		uc == 44011 ||
-		uc == 64830 ||
-		uc == 64831 ||
-		(uc >= 65040 && uc <= 65049) ||
-		(uc >= 65072 && uc <= 65106) ||
-		(uc >= 65108 && uc <= 65121) ||
-		uc == 65123 ||
-		uc == 65128 ||
-		uc == 65130 ||
-		uc == 65131 ||
-		(uc >= 65281 && uc <= 65283) ||
-		(uc >= 65285 && uc <= 65290) ||
-		(uc >= 65292 && uc <= 65295) ||
-		uc == 65306 ||
-		uc == 65307 ||
-		uc == 65311 ||
-		uc == 65312 ||
-		(uc >= 65339 && uc <= 65341) ||
-		uc == 65343 ||
-		uc == 65371 ||
-		uc == 65373 ||
-		(uc >= 65375 && uc <= 65381) ||
-		(uc >= 65792 && uc <= 65794) ||
-		uc == 66463 ||
-		uc == 66512 ||
-		uc == 66927 ||
-		uc == 67671 ||
-		uc == 67871 ||
-		uc == 67903 ||
-		(uc >= 68176 && uc <= 68184) ||
-		uc == 68223 ||
-		(uc >= 68336 && uc <= 68342) ||
-		(uc >= 68409 && uc <= 68415) ||
-		(uc >= 68505 && uc <= 68508) ||
-		(uc >= 69703 && uc <= 69709) ||
-		uc == 69819 ||
-		uc == 69820 ||
-		(uc >= 69822 && uc <= 69825) ||
-		(uc >= 69952 && uc <= 69955) ||
-		uc == 70004 ||
-		uc == 70005 ||
-		(uc >= 70085 && uc <= 70088) ||
-		uc == 70093 ||
-		(uc >= 70200 && uc <= 70205) ||
-		uc == 70854 ||
-		(uc >= 71105 && uc <= 71113) ||
-		(uc >= 71233 && uc <= 71235) ||
-		(uc >= 74864 && uc <= 74868) ||
-		uc == 92782 ||
-		uc == 92783 ||
-		uc == 92917 ||
-		(uc >= 92983 && uc <= 92987) ||
-		uc == 92996 ||
-		uc == 113823);
+	return ((uc < 128 && cmark_ispunct((char)uc)) ||
+	        uc == 161 ||
+	        uc == 167 ||
+	        uc == 171 ||
+	        uc == 182 ||
+	        uc == 183 ||
+	        uc == 187 ||
+	        uc == 191 ||
+	        uc == 894 ||
+	        uc == 903 ||
+	        (uc >= 1370 && uc <= 1375) ||
+	        uc == 1417 ||
+	        uc == 1418 ||
+	        uc == 1470 ||
+	        uc == 1472 ||
+	        uc == 1475 ||
+	        uc == 1478 ||
+	        uc == 1523 ||
+	        uc == 1524 ||
+	        uc == 1545 ||
+	        uc == 1546 ||
+	        uc == 1548 ||
+	        uc == 1549 ||
+	        uc == 1563 ||
+	        uc == 1566 ||
+	        uc == 1567 ||
+	        (uc >= 1642 && uc <= 1645) ||
+	        uc == 1748 ||
+	        (uc >= 1792 && uc <= 1805) ||
+	        (uc >= 2039 && uc <= 2041) ||
+	        (uc >= 2096 && uc <= 2110) ||
+	        uc == 2142 ||
+	        uc == 2404 ||
+	        uc == 2405 ||
+	        uc == 2416 ||
+	        uc == 2800 ||
+	        uc == 3572 ||
+	        uc == 3663 ||
+	        uc == 3674 ||
+	        uc == 3675 ||
+	        (uc >= 3844 && uc <= 3858) ||
+	        uc == 3860 ||
+	        (uc >= 3898 && uc <= 3901) ||
+	        uc == 3973 ||
+	        (uc >= 4048 && uc <= 4052) ||
+	        uc == 4057 ||
+	        uc == 4058 ||
+	        (uc >= 4170 && uc <= 4175) ||
+	        uc == 4347 ||
+	        (uc >= 4960 && uc <= 4968) ||
+	        uc == 5120 ||
+	        uc == 5741 ||
+	        uc == 5742 ||
+	        uc == 5787 ||
+	        uc == 5788 ||
+	        (uc >= 5867 && uc <= 5869) ||
+	        uc == 5941 ||
+	        uc == 5942 ||
+	        (uc >= 6100 && uc <= 6102) ||
+	        (uc >= 6104 && uc <= 6106) ||
+	        (uc >= 6144 && uc <= 6154) ||
+	        uc == 6468 ||
+	        uc == 6469 ||
+	        uc == 6686 ||
+	        uc == 6687 ||
+	        (uc >= 6816 && uc <= 6822) ||
+	        (uc >= 6824 && uc <= 6829) ||
+	        (uc >= 7002 && uc <= 7008) ||
+	        (uc >= 7164 && uc <= 7167) ||
+	        (uc >= 7227 && uc <= 7231) ||
+	        uc == 7294 ||
+	        uc == 7295 ||
+	        (uc >= 7360 && uc <= 7367) ||
+	        uc == 7379 ||
+	        (uc >= 8208 && uc <= 8231) ||
+	        (uc >= 8240 && uc <= 8259) ||
+	        (uc >= 8261 && uc <= 8273) ||
+	        (uc >= 8275 && uc <= 8286) ||
+	        uc == 8317 ||
+	        uc == 8318 ||
+	        uc == 8333 ||
+	        uc == 8334 ||
+	        (uc >= 8968 && uc <= 8971) ||
+	        uc == 9001 ||
+	        uc == 9002 ||
+	        (uc >= 10088 && uc <= 10101) ||
+	        uc == 10181 ||
+	        uc == 10182 ||
+	        (uc >= 10214 && uc <= 10223) ||
+	        (uc >= 10627 && uc <= 10648) ||
+	        (uc >= 10712 && uc <= 10715) ||
+	        uc == 10748 ||
+	        uc == 10749 ||
+	        (uc >= 11513 && uc <= 11516) ||
+	        uc == 11518 ||
+	        uc == 11519 ||
+	        uc == 11632 ||
+	        (uc >= 11776 && uc <= 11822) ||
+	        (uc >= 11824 && uc <= 11842) ||
+	        (uc >= 12289 && uc <= 12291) ||
+	        (uc >= 12296 && uc <= 12305) ||
+	        (uc >= 12308 && uc <= 12319) ||
+	        uc == 12336 ||
+	        uc == 12349 ||
+	        uc == 12448 ||
+	        uc == 12539 ||
+	        uc == 42238 ||
+	        uc == 42239 ||
+	        (uc >= 42509 && uc <= 42511) ||
+	        uc == 42611 ||
+	        uc == 42622 ||
+	        (uc >= 42738 && uc <= 42743) ||
+	        (uc >= 43124 && uc <= 43127) ||
+	        uc == 43214 ||
+	        uc == 43215 ||
+	        (uc >= 43256 && uc <= 43258) ||
+	        uc == 43310 ||
+	        uc == 43311 ||
+	        uc == 43359 ||
+	        (uc >= 43457 && uc <= 43469) ||
+	        uc == 43486 ||
+	        uc == 43487 ||
+	        (uc >= 43612 && uc <= 43615) ||
+	        uc == 43742 ||
+	        uc == 43743 ||
+	        uc == 43760 ||
+	        uc == 43761 ||
+	        uc == 44011 ||
+	        uc == 64830 ||
+	        uc == 64831 ||
+	        (uc >= 65040 && uc <= 65049) ||
+	        (uc >= 65072 && uc <= 65106) ||
+	        (uc >= 65108 && uc <= 65121) ||
+	        uc == 65123 ||
+	        uc == 65128 ||
+	        uc == 65130 ||
+	        uc == 65131 ||
+	        (uc >= 65281 && uc <= 65283) ||
+	        (uc >= 65285 && uc <= 65290) ||
+	        (uc >= 65292 && uc <= 65295) ||
+	        uc == 65306 ||
+	        uc == 65307 ||
+	        uc == 65311 ||
+	        uc == 65312 ||
+	        (uc >= 65339 && uc <= 65341) ||
+	        uc == 65343 ||
+	        uc == 65371 ||
+	        uc == 65373 ||
+	        (uc >= 65375 && uc <= 65381) ||
+	        (uc >= 65792 && uc <= 65794) ||
+	        uc == 66463 ||
+	        uc == 66512 ||
+	        uc == 66927 ||
+	        uc == 67671 ||
+	        uc == 67871 ||
+	        uc == 67903 ||
+	        (uc >= 68176 && uc <= 68184) ||
+	        uc == 68223 ||
+	        (uc >= 68336 && uc <= 68342) ||
+	        (uc >= 68409 && uc <= 68415) ||
+	        (uc >= 68505 && uc <= 68508) ||
+	        (uc >= 69703 && uc <= 69709) ||
+	        uc == 69819 ||
+	        uc == 69820 ||
+	        (uc >= 69822 && uc <= 69825) ||
+	        (uc >= 69952 && uc <= 69955) ||
+	        uc == 70004 ||
+	        uc == 70005 ||
+	        (uc >= 70085 && uc <= 70088) ||
+	        uc == 70093 ||
+	        (uc >= 70200 && uc <= 70205) ||
+	        uc == 70854 ||
+	        (uc >= 71105 && uc <= 71113) ||
+	        (uc >= 71233 && uc <= 71235) ||
+	        (uc >= 74864 && uc <= 74868) ||
+	        uc == 92782 ||
+	        uc == 92783 ||
+	        uc == 92917 ||
+	        (uc >= 92983 && uc <= 92987) ||
+	        uc == 92996 ||
+	        uc == 113823);
 }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/xml.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/xml.c b/compiler/modules/CommonMark/src/xml.c
new file mode 100644
index 0000000..f630aba
--- /dev/null
+++ b/compiler/modules/CommonMark/src/xml.c
@@ -0,0 +1,175 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#include "config.h"
+#include "cmark.h"
+#include "node.h"
+#include "buffer.h"
+#include "houdini.h"
+
+// Functions to convert cmark_nodes to XML strings.
+
+static void escape_xml(cmark_strbuf *dest, const unsigned char *source, int length)
+{
+	if (source != NULL) {
+		if (length < 0)
+			length = strlen((char *)source);
+
+		houdini_escape_html0(dest, source, (size_t)length, 0);
+	}
+}
+
+struct render_state {
+	cmark_strbuf* xml;
+	int indent;
+};
+
+static inline void indent(struct render_state *state)
+{
+	int i;
+	for (i = 0; i < state->indent; i++) {
+		cmark_strbuf_putc(state->xml, ' ');
+	}
+}
+
+static int
+S_render_node(cmark_node *node, cmark_event_type ev_type,
+              struct render_state *state, long options)
+{
+	cmark_strbuf *xml = state->xml;
+	bool literal = false;
+	cmark_delim_type delim;
+	bool entering = (ev_type == CMARK_EVENT_ENTER);
+
+	if (entering) {
+		indent(state);
+		cmark_strbuf_printf(xml, "<%s",
+		                    cmark_node_get_type_string(node));
+
+		if (options & CMARK_OPT_SOURCEPOS && node->start_line != 0) {
+			cmark_strbuf_printf(xml, " sourcepos=\"%d:%d-%d:%d\"",
+			                    node->start_line,
+			                    node->start_column,
+			                    node->end_line,
+			                    node->end_column);
+		}
+
+		literal = false;
+
+		switch (node->type) {
+		case CMARK_NODE_TEXT:
+		case CMARK_NODE_CODE:
+		case CMARK_NODE_HTML:
+		case CMARK_NODE_INLINE_HTML:
+			cmark_strbuf_puts(xml, ">");
+			escape_xml(xml, node->as.literal.data,
+			           node->as.literal.len);
+			cmark_strbuf_puts(xml, "</");
+			cmark_strbuf_puts(xml,
+			                  cmark_node_get_type_string(node));
+			literal = true;
+			break;
+		case CMARK_NODE_LIST:
+			switch (cmark_node_get_list_type(node)) {
+			case CMARK_ORDERED_LIST:
+				cmark_strbuf_puts(xml, " type=\"ordered\"");
+				cmark_strbuf_printf(xml, " start=\"%d\"",
+				                    cmark_node_get_list_start(node));
+				delim = cmark_node_get_list_delim(node);
+				if (delim == CMARK_PAREN_DELIM) {
+					cmark_strbuf_puts(xml,
+					                  " delim=\"paren\"");
+				} else if (delim == CMARK_PERIOD_DELIM) {
+					cmark_strbuf_puts(xml,
+					                  " delim=\"period\"");
+				}
+				break;
+			case CMARK_BULLET_LIST:
+				cmark_strbuf_puts(xml, " type=\"bullet\"");
+				break;
+			default:
+				break;
+			}
+			cmark_strbuf_printf(xml, " tight=\"%s\"",
+			                    (cmark_node_get_list_tight(node) ?
+			                     "true" : "false"));
+			break;
+		case CMARK_NODE_HEADER:
+			cmark_strbuf_printf(xml, " level=\"%d\"",
+			                    node->as.header.level);
+			break;
+		case CMARK_NODE_CODE_BLOCK:
+			if (node->as.code.info.len > 0) {
+				cmark_strbuf_puts(xml, " info=\"");
+				escape_xml(xml, node->as.code.info.data,
+				           node->as.code.info.len);
+				cmark_strbuf_putc(xml, '"');
+			}
+			cmark_strbuf_puts(xml, ">");
+			escape_xml(xml, node->as.code.literal.data,
+			           node->as.code.literal.len);
+			cmark_strbuf_puts(xml, "</");
+			cmark_strbuf_puts(xml,
+			                  cmark_node_get_type_string(node));
+			literal = true;
+			break;
+		case CMARK_NODE_LINK:
+		case CMARK_NODE_IMAGE:
+			cmark_strbuf_puts(xml, " destination=\"");
+			escape_xml(xml, node->as.link.url, -1);
+			cmark_strbuf_putc(xml, '"');
+			cmark_strbuf_puts(xml, " title=\"");
+			escape_xml(xml, node->as.link.title, -1);
+			cmark_strbuf_putc(xml, '"');
+			break;
+		default:
+			break;
+		}
+		if (node->first_child) {
+			state->indent += 2;
+		} else if (!literal) {
+			cmark_strbuf_puts(xml, " /");
+		}
+		cmark_strbuf_puts(xml, ">\n");
+
+
+	} else if (node->first_child) {
+		state->indent -= 2;
+		indent(state);
+		cmark_strbuf_printf(xml, "</%s>\n",
+		                    cmark_node_get_type_string(node));
+	}
+
+	return 1;
+}
+
+char *cmark_render_xml(cmark_node *root, long options)
+{
+	char *result;
+	cmark_strbuf xml = GH_BUF_INIT;
+	cmark_event_type ev_type;
+	cmark_node *cur;
+	struct render_state state = { &xml, 0 };
+
+	if (options & CMARK_OPT_NORMALIZE) {
+		cmark_consolidate_text_nodes(root);
+	}
+
+	cmark_iter *iter = cmark_iter_new(root);
+
+	cmark_strbuf_puts(state.xml,
+	                  "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
+	cmark_strbuf_puts(state.xml,
+	                  "<!DOCTYPE CommonMark SYSTEM \"CommonMark.dtd\">\n");
+	while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
+		cur = cmark_iter_get_node(iter);
+		S_render_node(cur, ev_type, &state, options);
+	}
+	result = (char *)cmark_strbuf_detach(&xml);
+
+	cmark_iter_free(iter);
+	cmark_strbuf_free(&xml);
+	return result;
+}


[11/12] lucy-clownfish git commit: Switch to CommonMark iterators

Posted by nw...@apache.org.
Switch to CommonMark iterators


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/73efb7c7
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/73efb7c7
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/73efb7c7

Branch: refs/heads/master
Commit: 73efb7c705e9087a40520fb40808d2c6ac7ced73
Parents: eb17ed8
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sat Jan 10 22:43:20 2015 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sun Jan 18 19:38:29 2015 +0100

----------------------------------------------------------------------
 compiler/src/CFCCHtml.c   |  33 ++------
 compiler/src/CFCCMan.c    | 187 +++++++++++++++++------------------------
 compiler/src/CFCPerlPod.c | 123 +++++++++++++--------------
 3 files changed, 143 insertions(+), 200 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/73efb7c7/compiler/src/CFCCHtml.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCCHtml.c b/compiler/src/CFCCHtml.c
index e4b67f7..9252624 100644
--- a/compiler/src/CFCCHtml.c
+++ b/compiler/src/CFCCHtml.c
@@ -762,37 +762,18 @@ S_md_to_html(CFCClass *klass, const char *md) {
 
 static void
 S_convert_uris(CFCClass *klass, cmark_node *node) {
-    cmark_node *cur = node;
+    cmark_iter *iter = cmark_iter_new(node);
+    cmark_event_type ev_type;
 
-    while (cur) {
-        cmark_node_type type = cmark_node_get_type(cur);
+    while (CMARK_EVENT_DONE != (ev_type = cmark_iter_next(iter))) {
+        cmark_node *cur = cmark_iter_get_node(iter);
 
-        // Find the next node in the tree before possibly deleting cur.
-        cmark_node *tree_next = NULL;
-
-        cmark_node *child = cmark_node_first_child(cur);
-        // Don't descend into links.
-        if (type != CMARK_NODE_LINK && child) {
-            tree_next = child;
-        }
-        else {
-            cmark_node *ancestor = cur;
-            while (ancestor != node) {
-                cmark_node *next = cmark_node_next(ancestor);
-                if (next) {
-                    tree_next = next;
-                    break;
-                }
-                ancestor = cmark_node_parent(ancestor);
-            }
-        }
-
-        if (type == NODE_LINK) {
+        if (cmark_node_get_type(cur) == NODE_LINK) {
             S_convert_uri(klass, cur);
         }
-
-        cur = tree_next;
     }
+
+    cmark_iter_free(iter);
 }
 
 static void

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/73efb7c7/compiler/src/CFCCMan.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCCMan.c b/compiler/src/CFCCMan.c
index 55865b1..f6ef3f0 100644
--- a/compiler/src/CFCCMan.c
+++ b/compiler/src/CFCCMan.c
@@ -421,111 +421,80 @@ S_md_to_man(CFCClass *klass, const char *md, int needs_indent) {
 static char*
 S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
     char *result = CFCUtil_strdup("");
+    int level      = needs_indent ? 1 : 0;
     int has_indent = needs_indent;
     int has_vspace = true;
+    cmark_iter *iter = cmark_iter_new(node);
+    cmark_event_type ev_type;
 
-    while (node) {
-        cmark_node_type type = cmark_node_get_type(node);
+    while (CMARK_EVENT_DONE != (ev_type = cmark_iter_next(iter))) {
+        cmark_node      *node = cmark_iter_get_node(iter);
+        cmark_node_type  type = cmark_node_get_type(node);
 
         switch (type) {
-            case CMARK_NODE_DOCUMENT: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_man = S_nodes_to_man(klass, child,
-                                                    needs_indent);
-                result = CFCUtil_cat(result, children_man, NULL);
-                FREEMEM(children_man);
+            case CMARK_NODE_DOCUMENT:
                 break;
-            }
 
-            case CMARK_NODE_PARAGRAPH: {
-                if (needs_indent && !has_indent) {
-                    result = CFCUtil_cat(result, ".IP\n", NULL);
-                    has_indent = true;
-                }
-                else if (!needs_indent && has_indent) {
-                    result = CFCUtil_cat(result, ".P\n", NULL);
-                    has_indent = false;
+            case CMARK_NODE_PARAGRAPH:
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    if (level > 0 && !has_indent) {
+                        result = CFCUtil_cat(result, ".IP\n", NULL);
+                        has_indent = true;
+                    }
+                    else if (level == 0 && has_indent) {
+                        result = CFCUtil_cat(result, ".P\n", NULL);
+                        has_indent = false;
+                    }
+                    else if (!has_vspace) {
+                        result = CFCUtil_cat(result, "\n", NULL);
+                    }
                 }
-                else if (!has_vspace) {
+                else {
                     result = CFCUtil_cat(result, "\n", NULL);
+                    has_vspace = false;
                 }
-
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_man = S_nodes_to_man(klass, child,
-                                                    needs_indent);
-                result = CFCUtil_cat(result, children_man, "\n", NULL);
-                FREEMEM(children_man);
-
-                has_vspace = false;
-
                 break;
-            }
 
-            case CMARK_NODE_BLOCK_QUOTE: {
-                if (needs_indent) {
-                    result = CFCUtil_cat(result, ".RS\n", NULL);
-                }
-
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_man = S_nodes_to_man(klass, child, true);
-                result = CFCUtil_cat(result, ".IP\n", children_man, NULL);
-                FREEMEM(children_man);
-
-                if (needs_indent) {
-                    result = CFCUtil_cat(result, ".RE\n", NULL);
-                    has_indent = false;
+            case CMARK_NODE_BLOCK_QUOTE:
+            case CMARK_NODE_LIST:
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    if (level > 0) {
+                        result = CFCUtil_cat(result, ".RS\n", NULL);
+                        has_indent = false;
+                    }
+                    ++level;
                 }
                 else {
-                    has_indent = true;
+                    --level;
+                    if (level > 0) {
+                        result = CFCUtil_cat(result, ".RE\n", NULL);
+                        has_indent = false;
+                    }
                 }
-
-                break;
-            }
-
-            case CMARK_NODE_ITEM: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_man = S_nodes_to_man(klass, child, true);
-                result = CFCUtil_cat(result, ".IP \\(bu\n", children_man,
-                                     NULL);
-                FREEMEM(children_man);
                 break;
-            }
 
-            case CMARK_NODE_LIST: {
-                if (needs_indent) {
-                    result = CFCUtil_cat(result, ".RS\n", NULL);
+            case CMARK_NODE_ITEM:
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    result = CFCUtil_cat(result, ".IP \\(bu\n", NULL);
+                    has_indent = true;
+                    has_vspace = true;
                 }
+                break;
 
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_man = S_nodes_to_man(klass, child,
-                                                    needs_indent);
-                result = CFCUtil_cat(result, children_man, NULL);
-                FREEMEM(children_man);
-
-                if (needs_indent) {
-                    result = CFCUtil_cat(result, ".RE\n", NULL);
+            case CMARK_NODE_HEADER:
+                // Only works on top level for now.
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    result = CFCUtil_cat(result, ".SS\n", NULL);
                     has_indent = false;
                 }
                 else {
-                    has_indent = true;
+                    result = CFCUtil_cat(result, "\n", NULL);
+                    has_vspace = true;
                 }
-
                 break;
-            }
-
-            case CMARK_NODE_HEADER: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_man = S_nodes_to_man(klass, child,
-                                                    needs_indent);
-                result = CFCUtil_cat(result, ".SS\n", children_man, "\n", NULL);
-                FREEMEM(children_man);
-                has_indent = false;
-                has_vspace = true;
-                break;
-            }
 
             case CMARK_NODE_CODE_BLOCK: {
-                if (needs_indent) {
+                if (level > 0) {
                     result = CFCUtil_cat(result, ".RS\n", NULL);
                 }
 
@@ -535,12 +504,13 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                                      ".fam\n.fi\n", NULL);
                 FREEMEM(escaped);
 
-                if (needs_indent) {
+                if (level > 0) {
                     result = CFCUtil_cat(result, ".RE\n", NULL);
                     has_indent = false;
                 }
                 else {
                     has_indent = true;
+                    has_vspace = false;
                 }
 
                 break;
@@ -584,15 +554,13 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
             }
 
             case CMARK_NODE_LINK: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_man = S_nodes_to_man(klass, child,
-                                                    needs_indent);
                 const char *url = cmark_node_get_url(node);
+
                 if (CFCUri_is_clownfish_uri(url)) {
-                    if (children_man[0] != '\0') {
-                        result = CFCUtil_cat(result, children_man, NULL);
-                    }
-                    else {
+                    if (ev_type == CMARK_EVENT_ENTER
+                        && !cmark_node_first_child(node)
+                    ) {
+                        // Empty link text.
                         CFCUri *uri_obj = CFCUri_new(url, klass);
                         char *link_text = CFCC_link_text(uri_obj, klass);
                         if (link_text) {
@@ -603,11 +571,15 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                     }
                 }
                 else {
-                    result = CFCUtil_cat(result, "\n.UR ", url, "\n",
-                                         children_man, "\n.UE\n",
-                                         NULL);
+                    if (ev_type == CMARK_EVENT_ENTER) {
+                        result = CFCUtil_cat(result, "\n.UR ", url, "\n",
+                                             NULL);
+                    }
+                    else {
+                        result = CFCUtil_cat(result, "\n.UE\n", NULL);
+                    }
                 }
-                FREEMEM(children_man);
+
                 break;
             }
 
@@ -615,34 +587,31 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                 CFCUtil_warn("Images not supported in man pages");
                 break;
 
-            case CMARK_NODE_STRONG: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_man = S_nodes_to_man(klass, child,
-                                                    needs_indent);
-                result = CFCUtil_cat(result, "\\fB", children_man, "\\f[]",
-                                     NULL);
-                FREEMEM(children_man);
+            case CMARK_NODE_STRONG:
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    result = CFCUtil_cat(result, "\\fB", NULL);
+                }
+                else {
+                    result = CFCUtil_cat(result, "\\f[]", NULL);
+                }
                 break;
-            }
 
-            case CMARK_NODE_EMPH: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_man = S_nodes_to_man(klass, child,
-                                                    needs_indent);
-                result = CFCUtil_cat(result, "\\fI", children_man, "\\f[]",
-                                     NULL);
-                FREEMEM(children_man);
+            case CMARK_NODE_EMPH:
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    result = CFCUtil_cat(result, "\\fI", NULL);
+                }
+                else {
+                    result = CFCUtil_cat(result, "\\f[]", NULL);
+                }
                 break;
-            }
 
             default:
                 CFCUtil_die("Invalid cmark node type: %d", type);
                 break;
         }
-
-        node = cmark_node_next(node);
     }
 
+    cmark_iter_free(iter);
     return result;
 }
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/73efb7c7/compiler/src/CFCPerlPod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlPod.c b/compiler/src/CFCPerlPod.c
index 3dcb83a..17e6a43 100644
--- a/compiler/src/CFCPerlPod.c
+++ b/compiler/src/CFCPerlPod.c
@@ -331,66 +331,56 @@ CFCPerlPod_md_to_pod(CFCPerlPod *self, CFCClass *klass, const char *md) {
 static char*
 S_nodes_to_pod(CFCClass *klass, cmark_node *node) {
     char *result = CFCUtil_strdup("");
+    if (node == NULL) {
+        return result;
+    }
+
+    cmark_iter *iter = cmark_iter_new(node);
+    cmark_event_type ev_type;
 
-    while (node) {
+    while (CMARK_EVENT_DONE != (ev_type = cmark_iter_next(iter))) {
+        cmark_node *node = cmark_iter_get_node(iter);
         cmark_node_type type = cmark_node_get_type(node);
 
         switch (type) {
-            case CMARK_NODE_DOCUMENT: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_pod = S_nodes_to_pod(klass, child);
-                result = CFCUtil_cat(result, children_pod, NULL);
-                FREEMEM(children_pod);
+            case CMARK_NODE_DOCUMENT:
                 break;
-            }
 
-            case CMARK_NODE_PARAGRAPH: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_pod = S_nodes_to_pod(klass, child);
-                result = CFCUtil_cat(result, children_pod, "\n\n", NULL);
-                FREEMEM(children_pod);
+            case CMARK_NODE_PARAGRAPH:
+                if (ev_type == CMARK_EVENT_EXIT) {
+                    result = CFCUtil_cat(result, "\n\n", NULL);
+                }
                 break;
-            }
 
-            case CMARK_NODE_BLOCK_QUOTE: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_pod = S_nodes_to_pod(klass, child);
-                result = CFCUtil_cat(result, "=over\n\n", children_pod,
-                                     "\n=back\n\n", NULL);
-                FREEMEM(children_pod);
+            case CMARK_NODE_BLOCK_QUOTE:
+            case CMARK_NODE_LIST:
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    result = CFCUtil_cat(result, "=over\n\n", NULL);
+                }
+                else {
+                    result = CFCUtil_cat(result, "=back\n\n", NULL);
+                }
                 break;
-            }
 
-            case CMARK_NODE_ITEM: {
+            case CMARK_NODE_ITEM:
                 // TODO: Ordered lists.
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_pod = S_nodes_to_pod(klass, child);
-                result = CFCUtil_cat(result, "=item *\n\n", children_pod,
-                                     NULL);
-                FREEMEM(children_pod);
-                break;
-            }
-
-            case CMARK_NODE_LIST: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_pod = S_nodes_to_pod(klass, child);
-                result = CFCUtil_cat(result, "=over\n\n", children_pod,
-                                     "=back\n\n", NULL);
-                FREEMEM(children_pod);
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    result = CFCUtil_cat(result, "=item *\n\n", NULL);
+                }
                 break;
-            }
 
-            case CMARK_NODE_HEADER: {
-                cmark_node *child = cmark_node_first_child(node);
-                int header_level = cmark_node_get_header_level(node);
-                char *children_pod = S_nodes_to_pod(klass, child);
-                char *header = CFCUtil_sprintf("=head%d %s\n\n",
-                                               header_level + 2, children_pod);
-                result = CFCUtil_cat(result, header, NULL);
-                FREEMEM(header);
-                FREEMEM(children_pod);
+            case CMARK_NODE_HEADER:
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    int header_level = cmark_node_get_header_level(node);
+                    char *header = CFCUtil_sprintf("=head%d ",
+                                                   header_level + 2);
+                    result = CFCUtil_cat(result, header, NULL);
+                    FREEMEM(header);
+                }
+                else {
+                    result = CFCUtil_cat(result, "\n\n", NULL);
+                }
                 break;
-            }
 
             case CMARK_NODE_CODE_BLOCK: {
                 const char *content = cmark_node_get_literal(node);
@@ -449,41 +439,44 @@ S_nodes_to_pod(CFCClass *klass, cmark_node *node) {
                 break;
             }
 
-            case CMARK_NODE_LINK: {
-                char *pod = S_convert_link(klass, node);
-                result = CFCUtil_cat(result, pod, NULL);
-                FREEMEM(pod);
+            case CMARK_NODE_LINK:
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    char *pod = S_convert_link(klass, node);
+                    result = CFCUtil_cat(result, pod, NULL);
+                    FREEMEM(pod);
+                    cmark_iter_reset(iter, node, CMARK_EVENT_EXIT);
+                }
                 break;
-            }
 
             case CMARK_NODE_IMAGE:
                 CFCUtil_warn("Images not supported in POD");
                 break;
 
-            case CMARK_NODE_STRONG: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_pod = S_nodes_to_pod(klass, child);
-                result = CFCUtil_cat(result, "B<", children_pod, ">", NULL);
-                FREEMEM(children_pod);
+            case CMARK_NODE_STRONG:
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    result = CFCUtil_cat(result, "B<", NULL);
+                }
+                else {
+                    result = CFCUtil_cat(result, ">", NULL);
+                }
                 break;
-            }
 
-            case CMARK_NODE_EMPH: {
-                cmark_node *child = cmark_node_first_child(node);
-                char *children_pod = S_nodes_to_pod(klass, child);
-                result = CFCUtil_cat(result, "I<", children_pod, ">", NULL);
-                FREEMEM(children_pod);
+            case CMARK_NODE_EMPH:
+                if (ev_type == CMARK_EVENT_ENTER) {
+                    result = CFCUtil_cat(result, "I<", NULL);
+                }
+                else {
+                    result = CFCUtil_cat(result, ">", NULL);
+                }
                 break;
-            }
 
             default:
                 CFCUtil_die("Invalid cmark node type: %d", type);
                 break;
         }
-
-        node = cmark_node_next(node);
     }
 
+    cmark_iter_free(iter);
     return result;
 }
 


[10/12] lucy-clownfish git commit: Adjust for CommonMark API changes

Posted by nw...@apache.org.
Adjust for CommonMark API changes


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/eb17ed8e
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/eb17ed8e
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/eb17ed8e

Branch: refs/heads/master
Commit: eb17ed8e0d44ee6dfc33d853aa77ea9af0c5c8ba
Parents: 5672da1
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sat Jan 10 19:02:33 2015 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sun Jan 18 19:38:29 2015 +0100

----------------------------------------------------------------------
 compiler/src/CFCCHtml.c   |  4 ++--
 compiler/src/CFCCMan.c    | 47 +++++++++++++++++++---------------------
 compiler/src/CFCPerlPod.c | 49 ++++++++++++++++++++----------------------
 3 files changed, 47 insertions(+), 53 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/eb17ed8e/compiler/src/CFCCHtml.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCCHtml.c b/compiler/src/CFCCHtml.c
index 73b25cf..e4b67f7 100644
--- a/compiler/src/CFCCHtml.c
+++ b/compiler/src/CFCCHtml.c
@@ -754,7 +754,7 @@ static char*
 S_md_to_html(CFCClass *klass, const char *md) {
     cmark_node *doc = cmark_parse_document(md, strlen(md));
     S_convert_uris(klass, doc);
-    char *html = cmark_render_html(doc);
+    char *html = cmark_render_html(doc, CMARK_OPT_DEFAULT);
     cmark_node_free(doc);
 
     return html;
@@ -831,7 +831,7 @@ S_convert_uri(CFCClass *klass, cmark_node *link) {
 
             if (link_text) {
                 cmark_node *text_node = cmark_node_new(CMARK_NODE_TEXT);
-                cmark_node_set_string_content(text_node, link_text);
+                cmark_node_set_literal(text_node, link_text);
                 cmark_node_append_child(link, text_node);
                 FREEMEM(link_text);
             }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/eb17ed8e/compiler/src/CFCCMan.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCCMan.c b/compiler/src/CFCCMan.c
index 736d0f0..55865b1 100644
--- a/compiler/src/CFCCMan.c
+++ b/compiler/src/CFCCMan.c
@@ -428,7 +428,7 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
         cmark_node_type type = cmark_node_get_type(node);
 
         switch (type) {
-            case NODE_DOCUMENT: {
+            case CMARK_NODE_DOCUMENT: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_man = S_nodes_to_man(klass, child,
                                                     needs_indent);
@@ -437,7 +437,7 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                 break;
             }
 
-            case NODE_PARAGRAPH: {
+            case CMARK_NODE_PARAGRAPH: {
                 if (needs_indent && !has_indent) {
                     result = CFCUtil_cat(result, ".IP\n", NULL);
                     has_indent = true;
@@ -461,7 +461,7 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                 break;
             }
 
-            case NODE_BLOCK_QUOTE: {
+            case CMARK_NODE_BLOCK_QUOTE: {
                 if (needs_indent) {
                     result = CFCUtil_cat(result, ".RS\n", NULL);
                 }
@@ -482,7 +482,7 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                 break;
             }
 
-            case NODE_LIST_ITEM: {
+            case CMARK_NODE_ITEM: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_man = S_nodes_to_man(klass, child, true);
                 result = CFCUtil_cat(result, ".IP \\(bu\n", children_man,
@@ -491,7 +491,7 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                 break;
             }
 
-            case NODE_LIST: {
+            case CMARK_NODE_LIST: {
                 if (needs_indent) {
                     result = CFCUtil_cat(result, ".RS\n", NULL);
                 }
@@ -513,7 +513,7 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                 break;
             }
 
-            case NODE_HEADER: {
+            case CMARK_NODE_HEADER: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_man = S_nodes_to_man(klass, child,
                                                     needs_indent);
@@ -524,12 +524,12 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                 break;
             }
 
-            case NODE_CODE_BLOCK: {
+            case CMARK_NODE_CODE_BLOCK: {
                 if (needs_indent) {
                     result = CFCUtil_cat(result, ".RS\n", NULL);
                 }
 
-                const char *content = cmark_node_get_string_content(node);
+                const char *content = cmark_node_get_literal(node);
                 char *escaped = S_man_escape(content);
                 result = CFCUtil_cat(result, ".IP\n.nf\n.fam C\n", escaped,
                                      ".fam\n.fi\n", NULL);
@@ -546,47 +546,44 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                 break;
             }
 
-            case NODE_HTML:
+            case CMARK_NODE_HTML:
                 CFCUtil_warn("HTML not supported in man pages");
                 break;
 
-            case NODE_HRULE:
+            case CMARK_NODE_HRULE:
                 break;
 
-            case NODE_REFERENCE_DEF:
-                break;
-
-            case NODE_TEXT: {
-                const char *content = cmark_node_get_string_content(node);
+            case CMARK_NODE_TEXT: {
+                const char *content = cmark_node_get_literal(node);
                 char *escaped = S_man_escape(content);
                 result = CFCUtil_cat(result, escaped, NULL);
                 FREEMEM(escaped);
                 break;
             }
 
-            case NODE_LINEBREAK:
+            case CMARK_NODE_LINEBREAK:
                 result = CFCUtil_cat(result, "\n.br\n", NULL);
                 break;
 
-            case NODE_SOFTBREAK:
+            case CMARK_NODE_SOFTBREAK:
                 result = CFCUtil_cat(result, "\n", NULL);
                 break;
 
-            case NODE_INLINE_CODE: {
-                const char *content = cmark_node_get_string_content(node);
+            case CMARK_NODE_CODE: {
+                const char *content = cmark_node_get_literal(node);
                 char *escaped = S_man_escape(content);
                 result = CFCUtil_cat(result, "\\FC", escaped, "\\F[]", NULL);
                 FREEMEM(escaped);
                 break;
             }
 
-            case NODE_INLINE_HTML: {
-                const char *html = cmark_node_get_string_content(node);
+            case CMARK_NODE_INLINE_HTML: {
+                const char *html = cmark_node_get_literal(node);
                 CFCUtil_warn("HTML not supported in man pages: %s", html);
                 break;
             }
 
-            case NODE_LINK: {
+            case CMARK_NODE_LINK: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_man = S_nodes_to_man(klass, child,
                                                     needs_indent);
@@ -614,11 +611,11 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                 break;
             }
 
-            case NODE_IMAGE:
+            case CMARK_NODE_IMAGE:
                 CFCUtil_warn("Images not supported in man pages");
                 break;
 
-            case NODE_STRONG: {
+            case CMARK_NODE_STRONG: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_man = S_nodes_to_man(klass, child,
                                                     needs_indent);
@@ -628,7 +625,7 @@ S_nodes_to_man(CFCClass *klass, cmark_node *node, int needs_indent) {
                 break;
             }
 
-            case NODE_EMPH: {
+            case CMARK_NODE_EMPH: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_man = S_nodes_to_man(klass, child,
                                                     needs_indent);

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/eb17ed8e/compiler/src/CFCPerlPod.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCPerlPod.c b/compiler/src/CFCPerlPod.c
index aaf8253..3dcb83a 100644
--- a/compiler/src/CFCPerlPod.c
+++ b/compiler/src/CFCPerlPod.c
@@ -336,7 +336,7 @@ S_nodes_to_pod(CFCClass *klass, cmark_node *node) {
         cmark_node_type type = cmark_node_get_type(node);
 
         switch (type) {
-            case NODE_DOCUMENT: {
+            case CMARK_NODE_DOCUMENT: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_pod = S_nodes_to_pod(klass, child);
                 result = CFCUtil_cat(result, children_pod, NULL);
@@ -344,7 +344,7 @@ S_nodes_to_pod(CFCClass *klass, cmark_node *node) {
                 break;
             }
 
-            case NODE_PARAGRAPH: {
+            case CMARK_NODE_PARAGRAPH: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_pod = S_nodes_to_pod(klass, child);
                 result = CFCUtil_cat(result, children_pod, "\n\n", NULL);
@@ -352,7 +352,7 @@ S_nodes_to_pod(CFCClass *klass, cmark_node *node) {
                 break;
             }
 
-            case NODE_BLOCK_QUOTE: {
+            case CMARK_NODE_BLOCK_QUOTE: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_pod = S_nodes_to_pod(klass, child);
                 result = CFCUtil_cat(result, "=over\n\n", children_pod,
@@ -361,7 +361,7 @@ S_nodes_to_pod(CFCClass *klass, cmark_node *node) {
                 break;
             }
 
-            case NODE_LIST_ITEM: {
+            case CMARK_NODE_ITEM: {
                 // TODO: Ordered lists.
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_pod = S_nodes_to_pod(klass, child);
@@ -371,7 +371,7 @@ S_nodes_to_pod(CFCClass *klass, cmark_node *node) {
                 break;
             }
 
-            case NODE_LIST: {
+            case CMARK_NODE_LIST: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_pod = S_nodes_to_pod(klass, child);
                 result = CFCUtil_cat(result, "=over\n\n", children_pod,
@@ -380,7 +380,7 @@ S_nodes_to_pod(CFCClass *klass, cmark_node *node) {
                 break;
             }
 
-            case NODE_HEADER: {
+            case CMARK_NODE_HEADER: {
                 cmark_node *child = cmark_node_first_child(node);
                 int header_level = cmark_node_get_header_level(node);
                 char *children_pod = S_nodes_to_pod(klass, child);
@@ -392,8 +392,8 @@ S_nodes_to_pod(CFCClass *klass, cmark_node *node) {
                 break;
             }
 
-            case NODE_CODE_BLOCK: {
-                const char *content = cmark_node_get_string_content(node);
+            case CMARK_NODE_CODE_BLOCK: {
+                const char *content = cmark_node_get_literal(node);
                 char *escaped = S_pod_escape(content);
                 // Chomp trailing newline.
                 size_t len = strlen(escaped);
@@ -408,62 +408,59 @@ S_nodes_to_pod(CFCClass *klass, cmark_node *node) {
                 break;
             }
 
-            case NODE_HTML: {
-                const char *html = cmark_node_get_string_content(node);
+            case CMARK_NODE_HTML: {
+                const char *html = cmark_node_get_literal(node);
                 result = CFCUtil_cat(result, "=begin html\n\n", html,
                                      "\n=end\n\n", NULL);
                 break;
             }
 
-            case NODE_HRULE:
+            case CMARK_NODE_HRULE:
                 break;
 
-            case NODE_REFERENCE_DEF:
-                break;
-
-            case NODE_TEXT: {
-                const char *content = cmark_node_get_string_content(node);
+            case CMARK_NODE_TEXT: {
+                const char *content = cmark_node_get_literal(node);
                 char *escaped = S_pod_escape(content);
                 result = CFCUtil_cat(result, escaped, NULL);
                 FREEMEM(escaped);
                 break;
             }
 
-            case NODE_LINEBREAK:
+            case CMARK_NODE_LINEBREAK:
                 // POD doesn't support line breaks. Start a new paragraph.
                 result = CFCUtil_cat(result, "\n\n", NULL);
                 break;
 
-            case NODE_SOFTBREAK:
+            case CMARK_NODE_SOFTBREAK:
                 result = CFCUtil_cat(result, "\n", NULL);
                 break;
 
-            case NODE_INLINE_CODE: {
-                const char *content = cmark_node_get_string_content(node);
+            case CMARK_NODE_CODE: {
+                const char *content = cmark_node_get_literal(node);
                 char *escaped = S_pod_escape(content);
                 result = CFCUtil_cat(result, "C<", escaped, ">", NULL);
                 FREEMEM(escaped);
                 break;
             }
 
-            case NODE_INLINE_HTML: {
-                const char *html = cmark_node_get_string_content(node);
+            case CMARK_NODE_INLINE_HTML: {
+                const char *html = cmark_node_get_literal(node);
                 CFCUtil_warn("Inline HTML not supported in POD: %s", html);
                 break;
             }
 
-            case NODE_LINK: {
+            case CMARK_NODE_LINK: {
                 char *pod = S_convert_link(klass, node);
                 result = CFCUtil_cat(result, pod, NULL);
                 FREEMEM(pod);
                 break;
             }
 
-            case NODE_IMAGE:
+            case CMARK_NODE_IMAGE:
                 CFCUtil_warn("Images not supported in POD");
                 break;
 
-            case NODE_STRONG: {
+            case CMARK_NODE_STRONG: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_pod = S_nodes_to_pod(klass, child);
                 result = CFCUtil_cat(result, "B<", children_pod, ">", NULL);
@@ -471,7 +468,7 @@ S_nodes_to_pod(CFCClass *klass, cmark_node *node) {
                 break;
             }
 
-            case NODE_EMPH: {
+            case CMARK_NODE_EMPH: {
                 cmark_node *child = cmark_node_first_child(node);
                 char *children_pod = S_nodes_to_pod(klass, child);
                 result = CFCUtil_cat(result, "I<", children_pod, ">", NULL);


[06/12] lucy-clownfish git commit: Update CommonMark source code

Posted by nw...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/html_unescape.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/html_unescape.h b/compiler/modules/CommonMark/src/html_unescape.h
index 6d33596..1eb318b 100644
--- a/compiler/modules/CommonMark/src/html_unescape.h
+++ b/compiler/modules/CommonMark/src/html_unescape.h
@@ -1,5 +1,5 @@
 /* ANSI-C code produced by gperf version 3.0.3 */
-/* Command-line: /Library/Developer/CommandLineTools/usr/bin/gperf -L ANSI-C -I -t -N find_entity -H hash_entity -K entity -C -l -F ',0,{0}' --null-strings -m5 src/html_unescape.gperf  */
+/* Command-line: /Library/Developer/CommandLineTools/usr/bin/gperf -L ANSI-C -I -t -N find_entity -H hash_entity -K entity -C -l -F ',{0}' --null-strings -m5 -P -Q entity_pool src/html_unescape.gperf  */
 /* Computed positions: -k'1-7,10,12,$' */
 
 #if !((' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \
@@ -31,11 +31,11 @@
 
 #line 1 "src/html_unescape.gperf"
 struct html_ent {
-	const char *entity;
-	unsigned int utf8_len;
+	int entity;
 	unsigned char utf8[4];
 };
 #include <string.h>
+#include <stddef.h>
 
 #define TOTAL_KEYWORDS 2125
 #define MIN_WORD_LENGTH 2
@@ -121,6 +121,4263 @@ hash_entity (register const char *str, register unsigned int len)
   return hval + asso_values[(unsigned char)str[len - 1]];
 }
 
+struct entity_pool_t
+  {
+    char entity_pool_str39[sizeof("rarr")];
+    char entity_pool_str41[sizeof("larr")];
+    char entity_pool_str49[sizeof("lat")];
+    char entity_pool_str52[sizeof("uarr")];
+    char entity_pool_str55[sizeof("npr")];
+    char entity_pool_str62[sizeof("rarrtl")];
+    char entity_pool_str64[sizeof("larrtl")];
+    char entity_pool_str65[sizeof("roarr")];
+    char entity_pool_str67[sizeof("loarr")];
+    char entity_pool_str68[sizeof("not")];
+    char entity_pool_str69[sizeof("rpar")];
+    char entity_pool_str70[sizeof("bot")];
+    char entity_pool_str71[sizeof("lpar")];
+    char entity_pool_str73[sizeof("spar")];
+    char entity_pool_str75[sizeof("ll")];
+    char entity_pool_str76[sizeof("uharr")];
+    char entity_pool_str77[sizeof("epar")];
+    char entity_pool_str81[sizeof("el")];
+    char entity_pool_str83[sizeof("rotimes")];
+    char entity_pool_str85[sizeof("lotimes")];
+    char entity_pool_str86[sizeof("par")];
+    char entity_pool_str88[sizeof("nharr")];
+    char entity_pool_str94[sizeof("npar")];
+    char entity_pool_str97[sizeof("tprime")];
+    char entity_pool_str101[sizeof("els")];
+    char entity_pool_str102[sizeof("eparsl")];
+    char entity_pool_str104[sizeof("ensp")];
+    char entity_pool_str109[sizeof("bprime")];
+    char entity_pool_str110[sizeof("lnap")];
+    char entity_pool_str111[sizeof("blk14")];
+    char entity_pool_str115[sizeof("blk12")];
+    char entity_pool_str117[sizeof("blk34")];
+    char entity_pool_str119[sizeof("nparsl")];
+    char entity_pool_str123[sizeof("nldr")];
+    char entity_pool_str124[sizeof("rlarr")];
+    char entity_pool_str125[sizeof("npart")];
+    char entity_pool_str126[sizeof("llarr")];
+    char entity_pool_str127[sizeof("nlt")];
+    char entity_pool_str128[sizeof("slarr")];
+    char entity_pool_str138[sizeof("nparallel")];
+    char entity_pool_str143[sizeof("Tau")];
+    char entity_pool_str144[sizeof("varr")];
+    char entity_pool_str146[sizeof("squ")];
+    char entity_pool_str149[sizeof("nlarr")];
+    char entity_pool_str152[sizeof("tau")];
+    char entity_pool_str165[sizeof("lne")];
+    char entity_pool_str166[sizeof("rrarr")];
+    char entity_pool_str168[sizeof("lrarr")];
+    char entity_pool_str170[sizeof("srarr")];
+    char entity_pool_str171[sizeof("rharul")];
+    char entity_pool_str173[sizeof("lharul")];
+    char entity_pool_str174[sizeof("erarr")];
+    char entity_pool_str176[sizeof("pr")];
+    char entity_pool_str177[sizeof("rharu")];
+    char entity_pool_str179[sizeof("lharu")];
+    char entity_pool_str184[sizeof("Uarr")];
+    char entity_pool_str188[sizeof("nGt")];
+    char entity_pool_str190[sizeof("bne")];
+    char entity_pool_str191[sizeof("nrarr")];
+    char entity_pool_str194[sizeof("swarr")];
+    char entity_pool_str198[sizeof("rarrap")];
+    char entity_pool_str200[sizeof("upuparrows")];
+    char entity_pool_str202[sizeof("Darr")];
+    char entity_pool_str205[sizeof("rbarr")];
+    char entity_pool_str206[sizeof("Dot")];
+    char entity_pool_str207[sizeof("lbarr")];
+    char entity_pool_str215[sizeof("nwarr")];
+    char entity_pool_str217[sizeof("smt")];
+    char entity_pool_str222[sizeof("emsp14")];
+    char entity_pool_str223[sizeof("rarrpl")];
+    char entity_pool_str225[sizeof("larrpl")];
+    char entity_pool_str230[sizeof("phmmat")];
+    char entity_pool_str232[sizeof("emsp13")];
+    char entity_pool_str234[sizeof("LT")];
+    char entity_pool_str238[sizeof("Larr")];
+    char entity_pool_str239[sizeof("rbrkslu")];
+    char entity_pool_str241[sizeof("lbrkslu")];
+    char entity_pool_str243[sizeof("napos")];
+    char entity_pool_str251[sizeof("nle")];
+    char entity_pool_str253[sizeof("rHar")];
+    char entity_pool_str255[sizeof("lHar")];
+    char entity_pool_str256[sizeof("qprime")];
+    char entity_pool_str258[sizeof("lap")];
+    char entity_pool_str265[sizeof("nbsp")];
+    char entity_pool_str266[sizeof("uHar")];
+    char entity_pool_str267[sizeof("top")];
+    char entity_pool_str269[sizeof("Vbar")];
+    char entity_pool_str272[sizeof("Ll")];
+    char entity_pool_str276[sizeof("prap")];
+    char entity_pool_str278[sizeof("emsp")];
+    char entity_pool_str281[sizeof("nap")];
+    char entity_pool_str294[sizeof("looparrowleft")];
+    char entity_pool_str296[sizeof("le")];
+    char entity_pool_str300[sizeof("sharp")];
+    char entity_pool_str302[sizeof("ee")];
+    char entity_pool_str310[sizeof("les")];
+    char entity_pool_str311[sizeof("in")];
+    char entity_pool_str312[sizeof("prop")];
+    char entity_pool_str314[sizeof("topbot")];
+    char entity_pool_str317[sizeof("int")];
+    char entity_pool_str319[sizeof("ne")];
+    char entity_pool_str329[sizeof("nprcue")];
+    char entity_pool_str331[sizeof("pre")];
+    char entity_pool_str332[sizeof("epsi")];
+    char entity_pool_str337[sizeof("upsi")];
+    char entity_pool_str338[sizeof("there4")];
+    char entity_pool_str342[sizeof("rbrke")];
+    char entity_pool_str343[sizeof("searr")];
+    char entity_pool_str344[sizeof("lbrke")];
+    char entity_pool_str346[sizeof("blacktriangle")];
+    char entity_pool_str349[sizeof("lneq")];
+    char entity_pool_str352[sizeof("lneqq")];
+    char entity_pool_str354[sizeof("plus")];
+    char entity_pool_str355[sizeof("nles")];
+    char entity_pool_str356[sizeof("nedot")];
+    char entity_pool_str357[sizeof("blacktriangleleft")];
+    char entity_pool_str358[sizeof("blacktriangleright")];
+    char entity_pool_str364[sizeof("nearr")];
+    char entity_pool_str367[sizeof("blacktriangledown")];
+    char entity_pool_str373[sizeof("nless")];
+    char entity_pool_str374[sizeof("emacr")];
+    char entity_pool_str378[sizeof("vprop")];
+    char entity_pool_str379[sizeof("umacr")];
+    char entity_pool_str383[sizeof("smeparsl")];
+    char entity_pool_str387[sizeof("Map")];
+    char entity_pool_str390[sizeof("plusdu")];
+    char entity_pool_str391[sizeof("Not")];
+    char entity_pool_str408[sizeof("Verbar")];
+    char entity_pool_str426[sizeof("perp")];
+    char entity_pool_str430[sizeof("fltns")];
+    char entity_pool_str431[sizeof("plusmn")];
+    char entity_pool_str435[sizeof("nleq")];
+    char entity_pool_str438[sizeof("nleqq")];
+    char entity_pool_str440[sizeof("frac34")];
+    char entity_pool_str441[sizeof("frac14")];
+    char entity_pool_str442[sizeof("verbar")];
+    char entity_pool_str443[sizeof("frac12")];
+    char entity_pool_str444[sizeof("frac35")];
+    char entity_pool_str445[sizeof("frac15")];
+    char entity_pool_str446[sizeof("frac45")];
+    char entity_pool_str449[sizeof("frac25")];
+    char entity_pool_str451[sizeof("frac13")];
+    char entity_pool_str453[sizeof("frac16")];
+    char entity_pool_str454[sizeof("prurel")];
+    char entity_pool_str455[sizeof("frac23")];
+    char entity_pool_str456[sizeof("frac38")];
+    char entity_pool_str457[sizeof("frac18")];
+    char entity_pool_str458[sizeof("frac56")];
+    char entity_pool_str462[sizeof("frac58")];
+    char entity_pool_str464[sizeof("frac78")];
+    char entity_pool_str465[sizeof("leq")];
+    char entity_pool_str466[sizeof("darr")];
+    char entity_pool_str469[sizeof("Upsi")];
+    char entity_pool_str470[sizeof("dot")];
+    char entity_pool_str471[sizeof("phone")];
+    char entity_pool_str474[sizeof("Cap")];
+    char entity_pool_str478[sizeof("blacksquare")];
+    char entity_pool_str479[sizeof("rnmid")];
+    char entity_pool_str483[sizeof("leqq")];
+    char entity_pool_str486[sizeof("intcal")];
+    char entity_pool_str490[sizeof("dharr")];
+    char entity_pool_str494[sizeof("rhard")];
+    char entity_pool_str496[sizeof("lhard")];
+    char entity_pool_str505[sizeof("pluse")];
+    char entity_pool_str511[sizeof("Umacr")];
+    char entity_pool_str512[sizeof("Vee")];
+    char entity_pool_str515[sizeof("Rarr")];
+    char entity_pool_str527[sizeof("Cross")];
+    char entity_pool_str529[sizeof("rsqb")];
+    char entity_pool_str531[sizeof("lsqb")];
+    char entity_pool_str538[sizeof("Rarrtl")];
+    char entity_pool_str541[sizeof("esdot")];
+    char entity_pool_str546[sizeof("vee")];
+    char entity_pool_str547[sizeof("nbumpe")];
+    char entity_pool_str553[sizeof("llcorner")];
+    char entity_pool_str554[sizeof("fpartint")];
+    char entity_pool_str558[sizeof("squf")];
+    char entity_pool_str559[sizeof("plankv")];
+    char entity_pool_str562[sizeof("eqvparsl")];
+    char entity_pool_str564[sizeof("ulcorner")];
+    char entity_pool_str566[sizeof("wp")];
+    char entity_pool_str571[sizeof("lozf")];
+    char entity_pool_str575[sizeof("COPY")];
+    char entity_pool_str577[sizeof("ulcorn")];
+    char entity_pool_str582[sizeof("veebar")];
+    char entity_pool_str584[sizeof("part")];
+    char entity_pool_str589[sizeof("square")];
+    char entity_pool_str591[sizeof("nbump")];
+    char entity_pool_str592[sizeof("bernou")];
+    char entity_pool_str593[sizeof("wr")];
+    char entity_pool_str594[sizeof("rBarr")];
+    char entity_pool_str595[sizeof("lrcorner")];
+    char entity_pool_str596[sizeof("lBarr")];
+    char entity_pool_str599[sizeof("bnot")];
+    char entity_pool_str601[sizeof("semi")];
+    char entity_pool_str606[sizeof("urcorner")];
+    char entity_pool_str612[sizeof("NotSubset")];
+    char entity_pool_str614[sizeof("ropf")];
+    char entity_pool_str615[sizeof("Qopf")];
+    char entity_pool_str616[sizeof("lopf")];
+    char entity_pool_str618[sizeof("sopf")];
+    char entity_pool_str619[sizeof("urcorn")];
+    char entity_pool_str620[sizeof("Topf")];
+    char entity_pool_str621[sizeof("Zopf")];
+    char entity_pool_str622[sizeof("eopf")];
+    char entity_pool_str626[sizeof("ropar")];
+    char entity_pool_str627[sizeof("uopf")];
+    char entity_pool_str628[sizeof("lopar")];
+    char entity_pool_str629[sizeof("topf")];
+    char entity_pool_str635[sizeof("Xopf")];
+    char entity_pool_str639[sizeof("nopf")];
+    char entity_pool_str641[sizeof("bopf")];
+    char entity_pool_str642[sizeof("epsiv")];
+    char entity_pool_str643[sizeof("fnof")];
+    char entity_pool_str644[sizeof("imacr")];
+    char entity_pool_str647[sizeof("Jopf")];
+    char entity_pool_str649[sizeof("nhpar")];
+    char entity_pool_str653[sizeof("Wopf")];
+    char entity_pool_str658[sizeof("Sqrt")];
+    char entity_pool_str659[sizeof("nsub")];
+    char entity_pool_str661[sizeof("napid")];
+    char entity_pool_str664[sizeof("NotSuperset")];
+    char entity_pool_str667[sizeof("brvbar")];
+    char entity_pool_str670[sizeof("sol")];
+    char entity_pool_str675[sizeof("easter")];
+    char entity_pool_str677[sizeof("popf")];
+    char entity_pool_str680[sizeof("dHar")];
+    char entity_pool_str685[sizeof("Vopf")];
+    char entity_pool_str690[sizeof("nsupset")];
+    char entity_pool_str691[sizeof("nsup")];
+    char entity_pool_str692[sizeof("vBar")];
+    char entity_pool_str694[sizeof("nsubset")];
+    char entity_pool_str700[sizeof("thkap")];
+    char entity_pool_str704[sizeof("nis")];
+    char entity_pool_str705[sizeof("profsurf")];
+    char entity_pool_str706[sizeof("solb")];
+    char entity_pool_str710[sizeof("lnsim")];
+    char entity_pool_str712[sizeof("solbar")];
+    char entity_pool_str717[sizeof("Square")];
+    char entity_pool_str719[sizeof("vopf")];
+    char entity_pool_str723[sizeof("uharl")];
+    char entity_pool_str725[sizeof("ulcrop")];
+    char entity_pool_str729[sizeof("eqsim")];
+    char entity_pool_str730[sizeof("equiv")];
+    char entity_pool_str733[sizeof("ell")];
+    char entity_pool_str734[sizeof("smashp")];
+    char entity_pool_str735[sizeof("mp")];
+    char entity_pool_str738[sizeof("Kopf")];
+    char entity_pool_str741[sizeof("simrarr")];
+    char entity_pool_str743[sizeof("flat")];
+    char entity_pool_str745[sizeof("Mopf")];
+    char entity_pool_str746[sizeof("Sopf")];
+    char entity_pool_str747[sizeof("mldr")];
+    char entity_pool_str748[sizeof("rlm")];
+    char entity_pool_str749[sizeof("iprod")];
+    char entity_pool_str756[sizeof("lparlt")];
+    char entity_pool_str758[sizeof("fopf")];
+    char entity_pool_str759[sizeof("Uopf")];
+    char entity_pool_str763[sizeof("varsubsetneq")];
+    char entity_pool_str764[sizeof("varsubsetneqq")];
+    char entity_pool_str767[sizeof("urcrop")];
+    char entity_pool_str768[sizeof("LessLess")];
+    char entity_pool_str770[sizeof("Re")];
+    char entity_pool_str773[sizeof("NotNestedLessLess")];
+    char entity_pool_str777[sizeof("Dopf")];
+    char entity_pool_str779[sizeof("forkv")];
+    char entity_pool_str781[sizeof("nsqsube")];
+    char entity_pool_str783[sizeof("nsupe")];
+    char entity_pool_str787[sizeof("nsube")];
+    char entity_pool_str788[sizeof("qopf")];
+    char entity_pool_str789[sizeof("rlhar")];
+    char entity_pool_str792[sizeof("lrm")];
+    char entity_pool_str796[sizeof("nlsim")];
+    char entity_pool_str798[sizeof("pound")];
+    char entity_pool_str799[sizeof("varsupsetneq")];
+    char entity_pool_str800[sizeof("varsupsetneqq")];
+    char entity_pool_str802[sizeof("bnequiv")];
+    char entity_pool_str813[sizeof("Lopf")];
+    char entity_pool_str817[sizeof("nsqsupe")];
+    char entity_pool_str820[sizeof("rarrlp")];
+    char entity_pool_str821[sizeof("wedbar")];
+    char entity_pool_str822[sizeof("larrlp")];
+    char entity_pool_str824[sizeof("Yopf")];
+    char entity_pool_str829[sizeof("NotReverseElement")];
+    char entity_pool_str832[sizeof("Copf")];
+    char entity_pool_str833[sizeof("lrhar")];
+    char entity_pool_str848[sizeof("parsl")];
+    char entity_pool_str849[sizeof("uml")];
+    char entity_pool_str850[sizeof("marker")];
+    char entity_pool_str851[sizeof("nsupseteq")];
+    char entity_pool_str855[sizeof("nsubseteq")];
+    char entity_pool_str861[sizeof("squarf")];
+    char entity_pool_str862[sizeof("Vert")];
+    char entity_pool_str874[sizeof("SquareSupersetEqual")];
+    char entity_pool_str876[sizeof("prsim")];
+    char entity_pool_str879[sizeof("SquareSubsetEqual")];
+    char entity_pool_str882[sizeof("SquareSuperset")];
+    char entity_pool_str887[sizeof("SquareSubset")];
+    char entity_pool_str888[sizeof("nvap")];
+    char entity_pool_str892[sizeof("iopf")];
+    char entity_pool_str894[sizeof("pm")];
+    char entity_pool_str896[sizeof("vert")];
+    char entity_pool_str898[sizeof("thetav")];
+    char entity_pool_str901[sizeof("loz")];
+    char entity_pool_str905[sizeof("map")];
+    char entity_pool_str920[sizeof("lesseqqgtr")];
+    char entity_pool_str934[sizeof("rscr")];
+    char entity_pool_str935[sizeof("Qscr")];
+    char entity_pool_str936[sizeof("lscr")];
+    char entity_pool_str938[sizeof("sscr")];
+    char entity_pool_str940[sizeof("Tscr")];
+    char entity_pool_str941[sizeof("Zscr")];
+    char entity_pool_str942[sizeof("escr")];
+    char entity_pool_str947[sizeof("uscr")];
+    char entity_pool_str949[sizeof("tscr")];
+    char entity_pool_str951[sizeof("imof")];
+    char entity_pool_str952[sizeof("Coproduct")];
+    char entity_pool_str955[sizeof("Xscr")];
+    char entity_pool_str956[sizeof("Xi")];
+    char entity_pool_str959[sizeof("nscr")];
+    char entity_pool_str960[sizeof("ni")];
+    char entity_pool_str961[sizeof("bscr")];
+    char entity_pool_str962[sizeof("Nopf")];
+    char entity_pool_str967[sizeof("Jscr")];
+    char entity_pool_str968[sizeof("preceq")];
+    char entity_pool_str971[sizeof("nvrArr")];
+    char entity_pool_str972[sizeof("backprime")];
+    char entity_pool_str973[sizeof("Wscr")];
+    char entity_pool_str975[sizeof("varphi")];
+    char entity_pool_str984[sizeof("nsmid")];
+    char entity_pool_str991[sizeof("dlcorn")];
+    char entity_pool_str997[sizeof("pscr")];
+    char entity_pool_str998[sizeof("pi")];
+    char entity_pool_str1005[sizeof("Vscr")];
+    char entity_pool_str1011[sizeof("nesim")];
+    char entity_pool_str1021[sizeof("simne")];
+    char entity_pool_str1028[sizeof("nsupseteqq")];
+    char entity_pool_str1032[sizeof("nsubseteqq")];
+    char entity_pool_str1033[sizeof("drcorn")];
+    char entity_pool_str1038[sizeof("rbrace")];
+    char entity_pool_str1039[sizeof("vscr")];
+    char entity_pool_str1040[sizeof("lbrace")];
+    char entity_pool_str1041[sizeof("dopf")];
+    char entity_pool_str1049[sizeof("frasl")];
+    char entity_pool_str1055[sizeof("LessTilde")];
+    char entity_pool_str1058[sizeof("Kscr")];
+    char entity_pool_str1064[sizeof("pluscir")];
+    char entity_pool_str1065[sizeof("Mscr")];
+    char entity_pool_str1066[sizeof("Sscr")];
+    char entity_pool_str1067[sizeof("rbrksld")];
+    char entity_pool_str1069[sizeof("lbrksld")];
+    char entity_pool_str1070[sizeof("RBarr")];
+    char entity_pool_str1073[sizeof("sqcaps")];
+    char entity_pool_str1074[sizeof("rArr")];
+    char entity_pool_str1075[sizeof("bNot")];
+    char entity_pool_str1076[sizeof("lArr")];
+    char entity_pool_str1078[sizeof("fscr")];
+    char entity_pool_str1079[sizeof("Uscr")];
+    char entity_pool_str1087[sizeof("uArr")];
+    char entity_pool_str1090[sizeof("Ropf")];
+    char entity_pool_str1094[sizeof("wopf")];
+    char entity_pool_str1097[sizeof("Dscr")];
+    char entity_pool_str1098[sizeof("opar")];
+    char entity_pool_str1099[sizeof("seswar")];
+    char entity_pool_str1103[sizeof("Del")];
+    char entity_pool_str1104[sizeof("rAarr")];
+    char entity_pool_str1105[sizeof("rho")];
+    char entity_pool_str1106[sizeof("lAarr")];
+    char entity_pool_str1107[sizeof("preccurlyeq")];
+    char entity_pool_str1108[sizeof("qscr")];
+    char entity_pool_str1111[sizeof("macr")];
+    char entity_pool_str1115[sizeof("notin")];
+    char entity_pool_str1120[sizeof("equivDD")];
+    char entity_pool_str1125[sizeof("sqcap")];
+    char entity_pool_str1127[sizeof("nspar")];
+    char entity_pool_str1131[sizeof("olt")];
+    char entity_pool_str1132[sizeof("ratio")];
+    char entity_pool_str1133[sizeof("Lscr")];
+    char entity_pool_str1137[sizeof("dharl")];
+    char entity_pool_str1139[sizeof("dlcrop")];
+    char entity_pool_str1140[sizeof("DoubleDot")];
+    char entity_pool_str1141[sizeof("dotplus")];
+    char entity_pool_str1142[sizeof("or")];
+    char entity_pool_str1144[sizeof("Yscr")];
+    char entity_pool_str1147[sizeof("Fopf")];
+    char entity_pool_str1152[sizeof("Cscr")];
+    char entity_pool_str1153[sizeof("olarr")];
+    char entity_pool_str1154[sizeof("nrarrw")];
+    char entity_pool_str1159[sizeof("lvertneqq")];
+    char entity_pool_str1160[sizeof("eqslantgtr")];
+    char entity_pool_str1164[sizeof("thorn")];
+    char entity_pool_str1169[sizeof("eqslantless")];
+    char entity_pool_str1172[sizeof("incare")];
+    char entity_pool_str1179[sizeof("vArr")];
+    char entity_pool_str1180[sizeof("rppolint")];
+    char entity_pool_str1181[sizeof("drcrop")];
+    char entity_pool_str1187[sizeof("parallel")];
+    char entity_pool_str1195[sizeof("orarr")];
+    char entity_pool_str1196[sizeof("ssmile")];
+    char entity_pool_str1200[sizeof("DoubleLeftTee")];
+    char entity_pool_str1201[sizeof("erDot")];
+    char entity_pool_str1202[sizeof("diams")];
+    char entity_pool_str1203[sizeof("ssetmn")];
+    char entity_pool_str1208[sizeof("oS")];
+    char entity_pool_str1212[sizeof("iscr")];
+    char entity_pool_str1213[sizeof("ii")];
+    char entity_pool_str1214[sizeof("rect")];
+    char entity_pool_str1217[sizeof("nsccue")];
+    char entity_pool_str1218[sizeof("sect")];
+    char entity_pool_str1220[sizeof("mlcp")];
+    char entity_pool_str1224[sizeof("oror")];
+    char entity_pool_str1226[sizeof("DoubleContourIntegral")];
+    char entity_pool_str1230[sizeof("equals")];
+    char entity_pool_str1232[sizeof("Hat")];
+    char entity_pool_str1236[sizeof("sstarf")];
+    char entity_pool_str1237[sizeof("mstpos")];
+    char entity_pool_str1239[sizeof("die")];
+    char entity_pool_str1240[sizeof("measuredangle")];
+    char entity_pool_str1252[sizeof("forall")];
+    char entity_pool_str1255[sizeof("notinvb")];
+    char entity_pool_str1263[sizeof("mopf")];
+    char entity_pool_str1270[sizeof("niv")];
+    char entity_pool_str1280[sizeof("vBarv")];
+    char entity_pool_str1282[sizeof("Nscr")];
+    char entity_pool_str1284[sizeof("period")];
+    char entity_pool_str1292[sizeof("becaus")];
+    char entity_pool_str1298[sizeof("between")];
+    char entity_pool_str1299[sizeof("Int")];
+    char entity_pool_str1307[sizeof("because")];
+    char entity_pool_str1308[sizeof("piv")];
+    char entity_pool_str1326[sizeof("rfr")];
+    char entity_pool_str1327[sizeof("Qfr")];
+    char entity_pool_str1328[sizeof("lfr")];
+    char entity_pool_str1330[sizeof("sfr")];
+    char entity_pool_str1331[sizeof("nleftrightarrow")];
+    char entity_pool_str1332[sizeof("Tfr")];
+    char entity_pool_str1333[sizeof("Zfr")];
+    char entity_pool_str1334[sizeof("efr")];
+    char entity_pool_str1338[sizeof("sim")];
+    char entity_pool_str1339[sizeof("ufr")];
+    char entity_pool_str1340[sizeof("roplus")];
+    char entity_pool_str1341[sizeof("tfr")];
+    char entity_pool_str1342[sizeof("loplus")];
+    char entity_pool_str1347[sizeof("Xfr")];
+    char entity_pool_str1350[sizeof("real")];
+    char entity_pool_str1351[sizeof("nfr")];
+    char entity_pool_str1353[sizeof("bfr")];
+    char entity_pool_str1355[sizeof("NotHumpEqual")];
+    char entity_pool_str1359[sizeof("Jfr")];
+    char entity_pool_str1361[sizeof("dscr")];
+    char entity_pool_str1365[sizeof("Wfr")];
+    char entity_pool_str1367[sizeof("blacklozenge")];
+    char entity_pool_str1369[sizeof("zopf")];
+    char entity_pool_str1370[sizeof("reals")];
+    char entity_pool_str1372[sizeof("NotCupCap")];
+    char entity_pool_str1375[sizeof("simplus")];
+    char entity_pool_str1377[sizeof("ForAll")];
+    char entity_pool_str1389[sizeof("pfr")];
+    char entity_pool_str1395[sizeof("omacr")];
+    char entity_pool_str1397[sizeof("Vfr")];
+    char entity_pool_str1409[sizeof("Emacr")];
+    char entity_pool_str1410[sizeof("Rscr")];
+    char entity_pool_str1414[sizeof("wscr")];
+    char entity_pool_str1423[sizeof("ShortUpArrow")];
+    char entity_pool_str1429[sizeof("setmn")];
+    char entity_pool_str1431[sizeof("vfr")];
+    char entity_pool_str1450[sizeof("Kfr")];
+    char entity_pool_str1455[sizeof("operp")];
+    char entity_pool_str1457[sizeof("Mfr")];
+    char entity_pool_str1458[sizeof("Sfr")];
+    char entity_pool_str1461[sizeof("nltrie")];
+    char entity_pool_str1467[sizeof("Fscr")];
+    char entity_pool_str1470[sizeof("ffr")];
+    char entity_pool_str1471[sizeof("Ufr")];
+    char entity_pool_str1473[sizeof("shortmid")];
+    char entity_pool_str1488[sizeof("nvsim")];
+    char entity_pool_str1489[sizeof("Dfr")];
+    char entity_pool_str1490[sizeof("lessdot")];
+    char entity_pool_str1493[sizeof("profline")];
+    char entity_pool_str1500[sizeof("qfr")];
+    char entity_pool_str1501[sizeof("dArr")];
+    char entity_pool_str1503[sizeof("nrtrie")];
+    char entity_pool_str1507[sizeof("ShortRightArrow")];
+    char entity_pool_str1515[sizeof("Therefore")];
+    char entity_pool_str1519[sizeof("DD")];
+    char entity_pool_str1524[sizeof("therefore")];
+    char entity_pool_str1525[sizeof("Lfr")];
+    char entity_pool_str1532[sizeof("target")];
+    char entity_pool_str1535[sizeof("Element")];
+    char entity_pool_str1536[sizeof("Yfr")];
+    char entity_pool_str1537[sizeof("ClockwiseContourIntegral")];
+    char entity_pool_str1542[sizeof("olcir")];
+    char entity_pool_str1544[sizeof("Cfr")];
+    char entity_pool_str1559[sizeof("female")];
+    char entity_pool_str1560[sizeof("nsucceq")];
+    char entity_pool_str1561[sizeof("oast")];
+    char entity_pool_str1568[sizeof("percnt")];
+    char entity_pool_str1578[sizeof("ordf")];
+    char entity_pool_str1580[sizeof("ord")];
+    char entity_pool_str1581[sizeof("Rho")];
+    char entity_pool_str1583[sizeof("mscr")];
+    char entity_pool_str1585[sizeof("nvrtrie")];
+    char entity_pool_str1589[sizeof("lnE")];
+    char entity_pool_str1597[sizeof("nhArr")];
+    char entity_pool_str1598[sizeof("Or")];
+    char entity_pool_str1602[sizeof("divide")];
+    char entity_pool_str1604[sizeof("ifr")];
+    char entity_pool_str1605[sizeof("elinters")];
+    char entity_pool_str1615[sizeof("bsol")];
+    char entity_pool_str1616[sizeof("nvlArr")];
+    char entity_pool_str1626[sizeof("Imacr")];
+    char entity_pool_str1628[sizeof("backsimeq")];
+    char entity_pool_str1629[sizeof("twixt")];
+    char entity_pool_str1630[sizeof("olcross")];
+    char entity_pool_str1639[sizeof("rarrsim")];
+    char entity_pool_str1640[sizeof("DoubleDownArrow")];
+    char entity_pool_str1641[sizeof("larrsim")];
+    char entity_pool_str1642[sizeof("emptyset")];
+    char entity_pool_str1643[sizeof("oopf")];
+    char entity_pool_str1645[sizeof("exist")];
+    char entity_pool_str1648[sizeof("llhard")];
+    char entity_pool_str1656[sizeof("excl")];
+    char entity_pool_str1657[sizeof("Eopf")];
+    char entity_pool_str1658[sizeof("nlArr")];
+    char entity_pool_str1663[sizeof("thinsp")];
+    char entity_pool_str1664[sizeof("NotSubsetEqual")];
+    char entity_pool_str1665[sizeof("phi")];
+    char entity_pool_str1666[sizeof("DoubleLeftArrow")];
+    char entity_pool_str1668[sizeof("topcir")];
+    char entity_pool_str1672[sizeof("div")];
+    char entity_pool_str1674[sizeof("Nfr")];
+    char entity_pool_str1675[sizeof("nlE")];
+    char entity_pool_str1689[sizeof("zscr")];
+    char entity_pool_str1690[sizeof("lrhard")];
+    char entity_pool_str1697[sizeof("lltri")];
+    char entity_pool_str1700[sizeof("nrArr")];
+    char entity_pool_str1701[sizeof("NotSupersetEqual")];
+    char entity_pool_str1703[sizeof("swArr")];
+    char entity_pool_str1704[sizeof("ThickSpace")];
+    char entity_pool_str1708[sizeof("ultri")];
+    char entity_pool_str1709[sizeof("notnivb")];
+    char entity_pool_str1711[sizeof("prime")];
+    char entity_pool_str1714[sizeof("primes")];
+    char entity_pool_str1716[sizeof("ohm")];
+    char entity_pool_str1719[sizeof("CircleTimes")];
+    char entity_pool_str1720[sizeof("nltri")];
+    char entity_pool_str1723[sizeof("siml")];
+    char entity_pool_str1724[sizeof("nwArr")];
+    char entity_pool_str1727[sizeof("varpi")];
+    char entity_pool_str1730[sizeof("orv")];
+    char entity_pool_str1735[sizeof("setminus")];
+    char entity_pool_str1739[sizeof("lrtri")];
+    char entity_pool_str1743[sizeof("permil")];
+    char entity_pool_str1744[sizeof("mid")];
+    char entity_pool_str1750[sizeof("urtri")];
+    char entity_pool_str1753[sizeof("dfr")];
+    char entity_pool_str1754[sizeof("mho")];
+    char entity_pool_str1755[sizeof("prE")];
+    char entity_pool_str1759[sizeof("vsupne")];
+    char entity_pool_str1762[sizeof("nrtri")];
+    char entity_pool_str1763[sizeof("vsubne")];
+    char entity_pool_str1765[sizeof("eDot")];
+    char entity_pool_str1778[sizeof("lesges")];
+    char entity_pool_str1781[sizeof("backepsilon")];
+    char entity_pool_str1783[sizeof("ratail")];
+    char entity_pool_str1785[sizeof("latail")];
+    char entity_pool_str1788[sizeof("UpEquilibrium")];
+    char entity_pool_str1791[sizeof("epsilon")];
+    char entity_pool_str1796[sizeof("upsilon")];
+    char entity_pool_str1798[sizeof("midast")];
+    char entity_pool_str1799[sizeof("Hopf")];
+    char entity_pool_str1800[sizeof("vltri")];
+    char entity_pool_str1802[sizeof("Rfr")];
+    char entity_pool_str1805[sizeof("Wedge")];
+    char entity_pool_str1806[sizeof("wfr")];
+    char entity_pool_str1812[sizeof("barwed")];
+    char entity_pool_str1815[sizeof("malt")];
+    char entity_pool_str1820[sizeof("Chi")];
+    char entity_pool_str1821[sizeof("emptyv")];
+    char entity_pool_str1822[sizeof("notni")];
+    char entity_pool_str1827[sizeof("LessGreater")];
+    char entity_pool_str1829[sizeof("diam")];
+    char entity_pool_str1842[sizeof("vrtri")];
+    char entity_pool_str1849[sizeof("CircleMinus")];
+    char entity_pool_str1851[sizeof("Omacr")];
+    char entity_pool_str1852[sizeof("seArr")];
+    char entity_pool_str1859[sizeof("Ffr")];
+    char entity_pool_str1865[sizeof("precneqq")];
+    char entity_pool_str1867[sizeof("Diamond")];
+    char entity_pool_str1868[sizeof("ordm")];
+    char entity_pool_str1873[sizeof("neArr")];
+    char entity_pool_str1874[sizeof("Iopf")];
+    char entity_pool_str1875[sizeof("CircleDot")];
+    char entity_pool_str1878[sizeof("prnap")];
+    char entity_pool_str1884[sizeof("dotminus")];
+    char entity_pool_str1903[sizeof("nshortmid")];
+    char entity_pool_str1905[sizeof("bottom")];
+    char entity_pool_str1907[sizeof("pointint")];
+    char entity_pool_str1917[sizeof("SquareUnion")];
+    char entity_pool_str1925[sizeof("jopf")];
+    char entity_pool_str1928[sizeof("Upsilon")];
+    char entity_pool_str1936[sizeof("Colone")];
+    char entity_pool_str1938[sizeof("nvlt")];
+    char entity_pool_str1941[sizeof("NestedLessLess")];
+    char entity_pool_str1942[sizeof("Colon")];
+    char entity_pool_str1945[sizeof("bsolhsub")];
+    char entity_pool_str1949[sizeof("DoubleLeftRightArrow")];
+    char entity_pool_str1950[sizeof("plussim")];
+    char entity_pool_str1959[sizeof("image")];
+    char entity_pool_str1960[sizeof("egs")];
+    char entity_pool_str1963[sizeof("oscr")];
+    char entity_pool_str1964[sizeof("swnwar")];
+    char entity_pool_str1969[sizeof("zeetrf")];
+    char entity_pool_str1973[sizeof("maltese")];
+    char entity_pool_str1975[sizeof("mfr")];
+    char entity_pool_str1976[sizeof("rarrfs")];
+    char entity_pool_str1977[sizeof("Escr")];
+    char entity_pool_str1978[sizeof("larrfs")];
+    char entity_pool_str1985[sizeof("mnplus")];
+    char entity_pool_str1986[sizeof("ngt")];
+    char entity_pool_str1987[sizeof("ngtr")];
+    char entity_pool_str1996[sizeof("gl")];
+    char entity_pool_str2003[sizeof("diamondsuit")];
+    char entity_pool_str2004[sizeof("GT")];
+    char entity_pool_str2014[sizeof("lesssim")];
+    char entity_pool_str2015[sizeof("dsol")];
+    char entity_pool_str2023[sizeof("upharpoonleft")];
+    char entity_pool_str2024[sizeof("SquareIntersection")];
+    char entity_pool_str2025[sizeof("lsime")];
+    char entity_pool_str2027[sizeof("nLt")];
+    char entity_pool_str2029[sizeof("NotLess")];
+    char entity_pool_str2031[sizeof("gnap")];
+    char entity_pool_str2035[sizeof("scap")];
+    char entity_pool_str2038[sizeof("mapstoleft")];
+    char entity_pool_str2039[sizeof("NotLessLess")];
+    char entity_pool_str2043[sizeof("rfloor")];
+    char entity_pool_str2045[sizeof("lfloor")];
+    char entity_pool_str2048[sizeof("nsime")];
+    char entity_pool_str2050[sizeof("bsime")];
+    char entity_pool_str2051[sizeof("NotLessEqual")];
+    char entity_pool_str2052[sizeof("NotLessTilde")];
+    char entity_pool_str2056[sizeof("ncap")];
+    char entity_pool_str2059[sizeof("NotLessGreater")];
+    char entity_pool_str2070[sizeof("precsim")];
+    char entity_pool_str2072[sizeof("looparrowright")];
+    char entity_pool_str2076[sizeof("Pr")];
+    char entity_pool_str2077[sizeof("rcub")];
+    char entity_pool_str2078[sizeof("mapstoup")];
+    char entity_pool_str2079[sizeof("lcub")];
+    char entity_pool_str2081[sizeof("zfr")];
+    char entity_pool_str2084[sizeof("uparrow")];
+    char entity_pool_str2086[sizeof("gne")];
+    char entity_pool_str2090[sizeof("sce")];
+    char entity_pool_str2091[sizeof("Im")];
+    char entity_pool_str2096[sizeof("rcaron")];
+    char entity_pool_str2098[sizeof("lcaron")];
+    char entity_pool_str2099[sizeof("Oopf")];
+    char entity_pool_str2100[sizeof("scaron")];
+    char entity_pool_str2101[sizeof("backsim")];
+    char entity_pool_str2102[sizeof("Tcaron")];
+    char entity_pool_str2103[sizeof("Zcaron")];
+    char entity_pool_str2104[sizeof("ecaron")];
+    char entity_pool_str2106[sizeof("Bernoullis")];
+    char entity_pool_str2110[sizeof("nge")];
+    char entity_pool_str2111[sizeof("tcaron")];
+    char entity_pool_str2113[sizeof("fork")];
+    char entity_pool_str2119[sizeof("Hscr")];
+    char entity_pool_str2121[sizeof("ncaron")];
+    char entity_pool_str2122[sizeof("elsdot")];
+    char entity_pool_str2124[sizeof("tbrk")];
+    char entity_pool_str2128[sizeof("triplus")];
+    char entity_pool_str2131[sizeof("diamond")];
+    char entity_pool_str2134[sizeof("ncup")];
+    char entity_pool_str2136[sizeof("bbrk")];
+    char entity_pool_str2138[sizeof("frown")];
+    char entity_pool_str2139[sizeof("bkarow")];
+    char entity_pool_str2141[sizeof("spades")];
+    char entity_pool_str2143[sizeof("psi")];
+    char entity_pool_str2150[sizeof("Bopf")];
+    char entity_pool_str2156[sizeof("dollar")];
+    char entity_pool_str2164[sizeof("disin")];
+    char entity_pool_str2170[sizeof("spadesuit")];
+    char entity_pool_str2176[sizeof("NotTilde")];
+    char entity_pool_str2177[sizeof("doublebarwedge")];
+    char entity_pool_str2179[sizeof("gap")];
+    char entity_pool_str2186[sizeof("bbrktbrk")];
+    char entity_pool_str2189[sizeof("swarrow")];
+    char entity_pool_str2190[sizeof("bepsi")];
+    char entity_pool_str2194[sizeof("Iscr")];
+    char entity_pool_str2198[sizeof("NotTildeFullEqual")];
+    char entity_pool_str2199[sizeof("eqcolon")];
+    char entity_pool_str2202[sizeof("tint")];
+    char entity_pool_str2205[sizeof("intprod")];
+    char entity_pool_str2207[sizeof("nsupE")];
+    char entity_pool_str2210[sizeof("nwarrow")];
+    char entity_pool_str2211[sizeof("nsubE")];
+    char entity_pool_str2214[sizeof("nges")];
+    char entity_pool_str2216[sizeof("Uparrow")];
+    char entity_pool_str2217[sizeof("ge")];
+    char entity_pool_str2218[sizeof("OpenCurlyDoubleQuote")];
+    char entity_pool_str2223[sizeof("smallsetminus")];
+    char entity_pool_str2228[sizeof("Scaron")];
+    char entity_pool_str2230[sizeof("nvltrie")];
+    char entity_pool_str2231[sizeof("ges")];
+    char entity_pool_str2232[sizeof("blank")];
+    char entity_pool_str2233[sizeof("QUOT")];
+    char entity_pool_str2238[sizeof("block")];
+    char entity_pool_str2239[sizeof("trade")];
+    char entity_pool_str2245[sizeof("jscr")];
+    char entity_pool_str2246[sizeof("wedge")];
+    char entity_pool_str2254[sizeof("Amacr")];
+    char entity_pool_str2256[sizeof("Equal")];
+    char entity_pool_str2259[sizeof("Dcaron")];
+    char entity_pool_str2262[sizeof("DotDot")];
+    char entity_pool_str2270[sizeof("gneq")];
+    char entity_pool_str2271[sizeof("varpropto")];
+    char entity_pool_str2273[sizeof("gneqq")];
+    char entity_pool_str2274[sizeof("Proportional")];
+    char entity_pool_str2279[sizeof("isins")];
+    char entity_pool_str2281[sizeof("eDDot")];
+    char entity_pool_str2282[sizeof("isin")];
+    char entity_pool_str2286[sizeof("TripleDot")];
+    char entity_pool_str2290[sizeof("Fouriertrf")];
+    char entity_pool_str2291[sizeof("Proportion")];
+    char entity_pool_str2294[sizeof("ngeq")];
+    char entity_pool_str2295[sizeof("Lcaron")];
+    char entity_pool_str2297[sizeof("ngeqq")];
+    char entity_pool_str2313[sizeof("lE")];
+    char entity_pool_str2314[sizeof("Ccaron")];
+    char entity_pool_str2320[sizeof("bsemi")];
+    char entity_pool_str2326[sizeof("propto")];
+    char entity_pool_str2331[sizeof("lesdot")];
+    char entity_pool_str2332[sizeof("Conint")];
+    char entity_pool_str2334[sizeof("And")];
+    char entity_pool_str2338[sizeof("searrow")];
+    char entity_pool_str2343[sizeof("orslope")];
+    char entity_pool_str2344[sizeof("harr")];
+    char entity_pool_str2350[sizeof("late")];
+    char entity_pool_str2352[sizeof("CenterDot")];
+    char entity_pool_str2355[sizeof("ofr")];
+    char entity_pool_str2359[sizeof("nearrow")];
+    char entity_pool_str2361[sizeof("qint")];
+    char entity_pool_str2364[sizeof("lates")];
+    char entity_pool_str2365[sizeof("kappav")];
+    char entity_pool_str2368[sizeof("horbar")];
+    char entity_pool_str2369[sizeof("Efr")];
+    char entity_pool_str2370[sizeof("hoarr")];
+    char entity_pool_str2371[sizeof("npre")];
+    char entity_pool_str2377[sizeof("inodot")];
+    char entity_pool_str2379[sizeof("udarr")];
+    char entity_pool_str2386[sizeof("geq")];
+    char entity_pool_str2391[sizeof("nsimeq")];
+    char entity_pool_str2404[sizeof("geqq")];
+    char entity_pool_str2407[sizeof("efDot")];
+    char entity_pool_str2410[sizeof("rpargt")];
+    char entity_pool_str2419[sizeof("Oscr")];
+    char entity_pool_str2422[sizeof("plusdo")];
+    char entity_pool_str2425[sizeof("lagran")];
+    char entity_pool_str2429[sizeof("thicksim")];
+    char entity_pool_str2440[sizeof("precnsim")];
+    char entity_pool_str2444[sizeof("Ncaron")];
+    char entity_pool_str2449[sizeof("napE")];
+    char entity_pool_str2457[sizeof("iiint")];
+    char entity_pool_str2470[sizeof("Bscr")];
+    char entity_pool_str2483[sizeof("mapstodown")];
+    char entity_pool_str2486[sizeof("varrho")];
+    char entity_pool_str2488[sizeof("isinsv")];
+    char entity_pool_str2491[sizeof("nvHarr")];
+    char entity_pool_str2494[sizeof("NotLeftTriangleBar")];
+    char entity_pool_str2496[sizeof("equest")];
+    char entity_pool_str2498[sizeof("NotLeftTriangleEqual")];
+    char entity_pool_str2499[sizeof("NotLeftTriangle")];
+    char entity_pool_str2502[sizeof("Aopf")];
+    char entity_pool_str2503[sizeof("hbar")];
+    char entity_pool_str2507[sizeof("vangrt")];
+    char entity_pool_str2511[sizeof("Hfr")];
+    char entity_pool_str2517[sizeof("range")];
+    char entity_pool_str2518[sizeof("smte")];
+    char entity_pool_str2519[sizeof("lsim")];
+    char entity_pool_str2521[sizeof("npolint")];
+    char entity_pool_str2523[sizeof("dcaron")];
+    char entity_pool_str2525[sizeof("esim")];
+    char entity_pool_str2527[sizeof("Union")];
+    char entity_pool_str2532[sizeof("smtes")];
+    char entity_pool_str2536[sizeof("kopf")];
+    char entity_pool_str2537[sizeof("gopf")];
+    char entity_pool_str2542[sizeof("nsim")];
+    char entity_pool_str2544[sizeof("bsim")];
+    char entity_pool_str2546[sizeof("SmallCircle")];
+    char entity_pool_str2548[sizeof("NotDoubleVerticalBar")];
+    char entity_pool_str2549[sizeof("NotNestedGreaterGreater")];
+    char entity_pool_str2565[sizeof("EqualTilde")];
+    char entity_pool_str2568[sizeof("notindot")];
+    char entity_pool_str2572[sizeof("Rcaron")];
+    char entity_pool_str2577[sizeof("Popf")];
+    char entity_pool_str2583[sizeof("Gopf")];
+    char entity_pool_str2586[sizeof("Ifr")];
+    char entity_pool_str2589[sizeof("wedgeq")];
+    char entity_pool_str2595[sizeof("prod")];
+    char entity_pool_str2617[sizeof("osol")];
+    char entity_pool_str2624[sizeof("DoubleUpArrow")];
+    char entity_pool_str2627[sizeof("Congruent")];
+    char entity_pool_str2631[sizeof("gnsim")];
+    char entity_pool_str2635[sizeof("scsim")];
+    char entity_pool_str2637[sizeof("jfr")];
+    char entity_pool_str2645[sizeof("upsih")];
+    char entity_pool_str2650[sizeof("nLl")];
+    char entity_pool_str2653[sizeof("DoubleUpDownArrow")];
+    char entity_pool_str2655[sizeof("ngsim")];
+    char entity_pool_str2664[sizeof("hearts")];
+    char entity_pool_str2666[sizeof("lesseqgtr")];
+    char entity_pool_str2670[sizeof("nesear")];
+    char entity_pool_str2676[sizeof("Exists")];
+    char entity_pool_str2687[sizeof("smile")];
+    char entity_pool_str2689[sizeof("uwangle")];
+    char entity_pool_str2693[sizeof("heartsuit")];
+    char entity_pool_str2700[sizeof("HorizontalLine")];
+    char entity_pool_str2703[sizeof("GreaterLess")];
+    char entity_pool_str2705[sizeof("rsaquo")];
+    char entity_pool_str2707[sizeof("lsaquo")];
+    char entity_pool_str2709[sizeof("realine")];
+    char entity_pool_str2710[sizeof("Dashv")];
+    char entity_pool_str2714[sizeof("simdot")];
+    char entity_pool_str2715[sizeof("GreaterEqual")];
+    char entity_pool_str2716[sizeof("GreaterTilde")];
+    char entity_pool_str2721[sizeof("GreaterEqualLess")];
+    char entity_pool_str2723[sizeof("GreaterGreater")];
+    char entity_pool_str2737[sizeof("rceil")];
+    char entity_pool_str2739[sizeof("lceil")];
+    char entity_pool_str2743[sizeof("lessgtr")];
+    char entity_pool_str2746[sizeof("oline")];
+    char entity_pool_str2753[sizeof("thksim")];
+    char entity_pool_str2755[sizeof("InvisibleTimes")];
+    char entity_pool_str2762[sizeof("race")];
+    char entity_pool_str2766[sizeof("iquest")];
+    char entity_pool_str2774[sizeof("imagline")];
+    char entity_pool_str2779[sizeof("UpTee")];
+    char entity_pool_str2781[sizeof("midcir")];
+    char entity_pool_str2790[sizeof("ofcir")];
+    char entity_pool_str2793[sizeof("ddarr")];
+    char entity_pool_str2800[sizeof("rangd")];
+    char entity_pool_str2802[sizeof("langd")];
+    char entity_pool_str2808[sizeof("Equilibrium")];
+    char entity_pool_str2809[sizeof("parsim")];
+    char entity_pool_str2810[sizeof("Vdashl")];
+    char entity_pool_str2811[sizeof("Ofr")];
+    char entity_pool_str2816[sizeof("Because")];
+    char entity_pool_str2818[sizeof("rAtail")];
+    char entity_pool_str2820[sizeof("lAtail")];
+    char entity_pool_str2821[sizeof("ominus")];
+    char entity_pool_str2822[sizeof("Ascr")];
+    char entity_pool_str2826[sizeof("Epsilon")];
+    char entity_pool_str2832[sizeof("ShortLeftArrow")];
+    char entity_pool_str2845[sizeof("isinv")];
+    char entity_pool_str2847[sizeof("micro")];
+    char entity_pool_str2851[sizeof("zcaron")];
+    char entity_pool_str2856[sizeof("kscr")];
+    char entity_pool_str2857[sizeof("gscr")];
+    char entity_pool_str2862[sizeof("Bfr")];
+    char entity_pool_str2863[sizeof("gel")];
+    char entity_pool_str2864[sizeof("hercon")];
+    char entity_pool_str2871[sizeof("triminus")];
+    char entity_pool_str2877[sizeof("egrave")];
+    char entity_pool_str2881[sizeof("sdot")];
+    char entity_pool_str2882[sizeof("ugrave")];
+    char entity_pool_str2884[sizeof("Zdot")];
+    char entity_pool_str2885[sizeof("edot")];
+    char entity_pool_str2890[sizeof("NotTildeTilde")];
+    char entity_pool_str2892[sizeof("tdot")];
+    char entity_pool_str2897[sizeof("Pscr")];
+    char entity_pool_str2898[sizeof("Pi")];
+    char entity_pool_str2903[sizeof("Gscr")];
+    char entity_pool_str2910[sizeof("plustwo")];
+    char entity_pool_str2914[sizeof("NotElement")];
+    char entity_pool_str2916[sizeof("PlusMinus")];
+    char entity_pool_str2919[sizeof("hopf")];
+    char entity_pool_str2920[sizeof("gammad")];
+    char entity_pool_str2922[sizeof("mDDot")];
+    char entity_pool_str2926[sizeof("divideontimes")];
+    char entity_pool_str2940[sizeof("doteq")];
+    char entity_pool_str2956[sizeof("varepsilon")];
+    char entity_pool_str2963[sizeof("Precedes")];
+    char entity_pool_str2966[sizeof("Gammad")];
+    char entity_pool_str2974[sizeof("dashv")];
+    char entity_pool_str2979[sizeof("NotCongruent")];
+    char entity_pool_str2982[sizeof("ubreve")];
+    char entity_pool_str2990[sizeof("ogt")];
+    char entity_pool_str2994[sizeof("RoundImplies")];
+    char entity_pool_str3002[sizeof("PrecedesSlantEqual")];
+    char entity_pool_str3005[sizeof("sime")];
+    char entity_pool_str3014[sizeof("Ugrave")];
+    char entity_pool_str3016[sizeof("dbkarow")];
+    char entity_pool_str3021[sizeof("sdote")];
+    char entity_pool_str3023[sizeof("veeeq")];
+    char entity_pool_str3027[sizeof("mapsto")];
+    char entity_pool_str3030[sizeof("times")];
+    char entity_pool_str3033[sizeof("rangle")];
+    char entity_pool_str3035[sizeof("langle")];
+    char entity_pool_str3038[sizeof("leftarrowtail")];
+    char entity_pool_str3039[sizeof("hamilt")];
+    char entity_pool_str3044[sizeof("udhar")];
+    char entity_pool_str3053[sizeof("nisd")];
+    char entity_pool_str3055[sizeof("rfisht")];
+    char entity_pool_str3057[sizeof("lfisht")];
+    char entity_pool_str3058[sizeof("harrcir")];
+    char entity_pool_str3066[sizeof("OpenCurlyQuote")];
+    char entity_pool_str3068[sizeof("ufisht")];
+    char entity_pool_str3069[sizeof("NotHumpDownHump")];
+    char entity_pool_str3072[sizeof("LeftTee")];
+    char entity_pool_str3074[sizeof("rsh")];
+    char entity_pool_str3076[sizeof("lsh")];
+    char entity_pool_str3080[sizeof("gvertneqq")];
+    char entity_pool_str3083[sizeof("timesb")];
+    char entity_pool_str3092[sizeof("scpolint")];
+    char entity_pool_str3095[sizeof("Cdot")];
+    char entity_pool_str3103[sizeof("dwangle")];
+    char entity_pool_str3114[sizeof("Ubreve")];
+    char entity_pool_str3132[sizeof("LeftUpVector")];
+    char entity_pool_str3135[sizeof("LeftUpVectorBar")];
+    char entity_pool_str3139[sizeof("Ecaron")];
+    char entity_pool_str3142[sizeof("homtht")];
+    char entity_pool_str3147[sizeof("igrave")];
+    char entity_pool_str3155[sizeof("npreceq")];
+    char entity_pool_str3156[sizeof("ecolon")];
+    char entity_pool_str3167[sizeof("dd")];
+    char entity_pool_str3174[sizeof("simeq")];
+    char entity_pool_str3179[sizeof("notinE")];
+    char entity_pool_str3198[sizeof("bigoplus")];
+    char entity_pool_str3214[sizeof("Afr")];
+    char entity_pool_str3215[sizeof("leftarrow")];
+    char entity_pool_str3216[sizeof("oint")];
+    char entity_pool_str3218[sizeof("Tab")];
+    char entity_pool_str3227[sizeof("ogon")];
+    char entity_pool_str3230[sizeof("lt")];
+    char entity_pool_str3231[sizeof("nLeftrightarrow")];
+    char entity_pool_str3235[sizeof("rarrb")];
+    char entity_pool_str3237[sizeof("larrb")];
+    char entity_pool_str3239[sizeof("hscr")];
+    char entity_pool_str3246[sizeof("LeftUpDownVector")];
+    char entity_pool_str3248[sizeof("kfr")];
+    char entity_pool_str3249[sizeof("gfr")];
+    char entity_pool_str3250[sizeof("UpArrowBar")];
+    char entity_pool_str3259[sizeof("nsce")];
+    char entity_pool_str3260[sizeof("ltdot")];
+    char entity_pool_str3261[sizeof("gesl")];
+    char entity_pool_str3262[sizeof("xodot")];
+    char entity_pool_str3263[sizeof("star")];
+    char entity_pool_str3266[sizeof("lowbar")];
+    char entity_pool_str3268[sizeof("xharr")];
+    char entity_pool_str3269[sizeof("ecir")];
+    char entity_pool_str3271[sizeof("utdot")];
+    char entity_pool_str3272[sizeof("natur")];
+    char entity_pool_str3273[sizeof("Lsh")];
+    char entity_pool_str3274[sizeof("infin")];
+    char entity_pool_str3276[sizeof("comp")];
+    char entity_pool_str3278[sizeof("sigmav")];
+    char entity_pool_str3285[sizeof("xotime")];
+    char entity_pool_str3289[sizeof("Pfr")];
+    char entity_pool_str3295[sizeof("Gfr")];
+    char entity_pool_str3298[sizeof("bigcap")];
+    char entity_pool_str3300[sizeof("simlE")];
+    char entity_pool_str3319[sizeof("iiiint")];
+    char entity_pool_str3320[sizeof("barwedge")];
+    char entity_pool_str3321[sizeof("Barwed")];
+    char entity_pool_str3329[sizeof("xlarr")];
+    char entity_pool_str3330[sizeof("LessEqualGreater")];
+    char entity_pool_str3332[sizeof("crarr")];
+    char entity_pool_str3333[sizeof("isindot")];
+    char entity_pool_str3335[sizeof("commat")];
+    char entity_pool_str3342[sizeof("middot")];
+    char entity_pool_str3349[sizeof("lesdotor")];
+    char entity_pool_str3356[sizeof("sigmaf")];
+    char entity_pool_str3366[sizeof("rarrbfs")];
+    char entity_pool_str3368[sizeof("larrbfs")];
+    char entity_pool_str3371[sizeof("xrarr")];
+    char entity_pool_str3376[sizeof("bigcup")];
+    char entity_pool_str3378[sizeof("clubs")];
+    char entity_pool_str3379[sizeof("hArr")];
+    char entity_pool_str3380[sizeof("rtrie")];
+    char entity_pool_str3382[sizeof("ltrie")];
+    char entity_pool_str3383[sizeof("imped")];
+    char entity_pool_str3388[sizeof("eogon")];
+    char entity_pool_str3389[sizeof("rx")];
+    char entity_pool_str3390[sizeof("ltrPar")];
+    char entity_pool_str3391[sizeof("Star")];
+    char entity_pool_str3393[sizeof("uogon")];
+    char entity_pool_str3396[sizeof("Tilde")];
+    char entity_pool_str3398[sizeof("half")];
+    char entity_pool_str3405[sizeof("tilde")];
+    char entity_pool_str3412[sizeof("Leftarrow")];
+    char entity_pool_str3417[sizeof("gesles")];
+    char entity_pool_str3422[sizeof("cap")];
+    char entity_pool_str3423[sizeof("strns")];
+    char entity_pool_str3427[sizeof("Lt")];
+    char entity_pool_str3439[sizeof("prnE")];
+    char entity_pool_str3447[sizeof("sqsupe")];
+    char entity_pool_str3462[sizeof("sqsupset")];
+    char entity_pool_str3467[sizeof("tridot")];
+    char entity_pool_str3468[sizeof("order")];
+    char entity_pool_str3471[sizeof("caps")];
+    char entity_pool_str3475[sizeof("cross")];
+    char entity_pool_str3482[sizeof("dfisht")];
+    char entity_pool_str3487[sizeof("xmap")];
+    char entity_pool_str3491[sizeof("sqsup")];
+    char entity_pool_str3503[sizeof("rtri")];
+    char entity_pool_str3505[sizeof("ltri")];
+    char entity_pool_str3506[sizeof("it")];
+    char entity_pool_str3507[sizeof("rmoust")];
+    char entity_pool_str3509[sizeof("lmoust")];
+    char entity_pool_str3510[sizeof("gnE")];
+    char entity_pool_str3511[sizeof("lgE")];
+    char entity_pool_str3514[sizeof("scE")];
+    char entity_pool_str3516[sizeof("utri")];
+    char entity_pool_str3518[sizeof("vellip")];
+    char entity_pool_str3520[sizeof("ETH")];
+    char entity_pool_str3523[sizeof("lmidot")];
+    char entity_pool_str3525[sizeof("Uogon")];
+    char entity_pool_str3526[sizeof("CounterClockwiseContourIntegral")];
+    char entity_pool_str3534[sizeof("ngE")];
+    char entity_pool_str3535[sizeof("nwnear")];
+    char entity_pool_str3543[sizeof("lesg")];
+    char entity_pool_str3546[sizeof("plusb")];
+    char entity_pool_str3550[sizeof("Rsh")];
+    char entity_pool_str3555[sizeof("copysr")];
+    char entity_pool_str3557[sizeof("infintie")];
+    char entity_pool_str3559[sizeof("imath")];
+    char entity_pool_str3560[sizeof("Esim")];
+    char entity_pool_str3565[sizeof("Phi")];
+    char entity_pool_str3573[sizeof("glE")];
+    char entity_pool_str3579[sizeof("vnsup")];
+    char entity_pool_str3582[sizeof("simgE")];
+    char entity_pool_str3586[sizeof("DoubleLongLeftArrow")];
+    char entity_pool_str3591[sizeof("DoubleLongLeftRightArrow")];
+    char entity_pool_str3594[sizeof("nvgt")];
+    char entity_pool_str3607[sizeof("Mellintrf")];
+    char entity_pool_str3611[sizeof("Prime")];
+    char entity_pool_str3615[sizeof("iinfin")];
+    char entity_pool_str3620[sizeof("ReverseElement")];
+    char entity_pool_str3627[sizeof("EmptySmallSquare")];
+    char entity_pool_str3628[sizeof("radic")];
+    char entity_pool_str3631[sizeof("hfr")];
+    char entity_pool_str3632[sizeof("zdot")];
+    char entity_pool_str3633[sizeof("male")];
+    char entity_pool_str3635[sizeof("rarrc")];
+    char entity_pool_str3636[sizeof("prec")];
+    char entity_pool_str3637[sizeof("scnap")];
+    char entity_pool_str3641[sizeof("DifferentialD")];
+    char entity_pool_str3643[sizeof("models")];
+    char entity_pool_str3657[sizeof("ltcir")];
+    char entity_pool_str3658[sizeof("iogon")];
+    char entity_pool_str3665[sizeof("capcap")];
+    char entity_pool_str3667[sizeof("iff")];
+    char entity_pool_str3669[sizeof("ddotseq")];
+    char entity_pool_str3671[sizeof("CirclePlus")];
+    char entity_pool_str3676[sizeof("rthree")];
+    char entity_pool_str3678[sizeof("lthree")];
+    char entity_pool_str3681[sizeof("PrecedesTilde")];
+    char entity_pool_str3685[sizeof("dtdot")];
+    char entity_pool_str3687[sizeof("clubsuit")];
+    char entity_pool_str3689[sizeof("racute")];
+    char entity_pool_str3691[sizeof("lacute")];
+    char entity_pool_str3692[sizeof("trpezium")];
+    char entity_pool_str3693[sizeof("sacute")];
+    char entity_pool_str3696[sizeof("Zacute")];
+    char entity_pool_str3697[sizeof("eacute")];
+    char entity_pool_str3699[sizeof("TildeTilde")];
+    char entity_pool_str3701[sizeof("Uarrocir")];
+    char entity_pool_str3702[sizeof("uacute")];
+    char entity_pool_str3703[sizeof("lowast")];
+    char entity_pool_str3714[sizeof("nacute")];
+    char entity_pool_str3716[sizeof("NotPrecedes")];
+    char entity_pool_str3720[sizeof("Lmidot")];
+    char entity_pool_str3725[sizeof("UpArrow")];
+    char entity_pool_str3727[sizeof("rarrw")];
+    char entity_pool_str3738[sizeof("DownTee")];
+    char entity_pool_str3742[sizeof("FilledSmallSquare")];
+    char entity_pool_str3743[sizeof("capcup")];
+    char entity_pool_str3749[sizeof("GreaterFullEqual")];
+    char entity_pool_str3756[sizeof("nvle")];
+    char entity_pool_str3758[sizeof("trie")];
+    char entity_pool_str3764[sizeof("omicron")];
+    char entity_pool_str3766[sizeof("DoubleRightTee")];
+    char entity_pool_str3767[sizeof("Cconint")];
+    char entity_pool_str3768[sizeof("rsquor")];
+    char entity_pool_str3770[sizeof("lsquor")];
+    char entity_pool_str3772[sizeof("zigrarr")];
+    char entity_pool_str3780[sizeof("copf")];
+    char entity_pool_str3782[sizeof("ContourIntegral")];
+    char entity_pool_str3798[sizeof("hairsp")];
+    char entity_pool_str3799[sizeof("sqsupseteq")];
+    char entity_pool_str3800[sizeof("csub")];
+    char entity_pool_str3801[sizeof("upharpoonright")];
+    char entity_pool_str3805[sizeof("DownBreve")];
+    char entity_pool_str3817[sizeof("ShortDownArrow")];
+    char entity_pool_str3819[sizeof("xopf")];
+    char entity_pool_str3821[sizeof("Sacute")];
+    char entity_pool_str3829[sizeof("vsupnE")];
+    char entity_pool_str3830[sizeof("cir")];
+    char entity_pool_str3831[sizeof("plusacir")];
+    char entity_pool_str3832[sizeof("csup")];
+    char entity_pool_str3833[sizeof("vsubnE")];
+    char entity_pool_str3834[sizeof("Uacute")];
+    char entity_pool_str3836[sizeof("isinE")];
+    char entity_pool_str3845[sizeof("gEl")];
+    char entity_pool_str3851[sizeof("sqcups")];
+    char entity_pool_str3853[sizeof("smid")];
+    char entity_pool_str3855[sizeof("lg")];
+    char entity_pool_str3857[sizeof("DoubleLongRightArrow")];
+    char entity_pool_str3858[sizeof("NotPrecedesSlantEqual")];
+    char entity_pool_str3861[sizeof("eg")];
+    char entity_pool_str3864[sizeof("AMP")];
+    char entity_pool_str3874[sizeof("nmid")];
+    char entity_pool_str3883[sizeof("timesd")];
+    char entity_pool_str3886[sizeof("DownLeftVector")];
+    char entity_pool_str3887[sizeof("zwnj")];
+    char entity_pool_str3888[sizeof("Lacute")];
+    char entity_pool_str3889[sizeof("DownLeftVectorBar")];
+    char entity_pool_str3898[sizeof("ograve")];
+    char entity_pool_str3899[sizeof("Yacute")];
+    char entity_pool_str3903[sizeof("sqcup")];
+    char entity_pool_str3906[sizeof("odot")];
+    char entity_pool_str3907[sizeof("Cacute")];
+    char entity_pool_str3909[sizeof("nu")];
+    char entity_pool_str3910[sizeof("tritime")];
+    char entity_pool_str3912[sizeof("Egrave")];
+    char entity_pool_str3913[sizeof("eplus")];
+    char entity_pool_str3915[sizeof("backcong")];
+    char entity_pool_str3918[sizeof("uplus")];
+    char entity_pool_str3920[sizeof("Edot")];
+    char entity_pool_str3924[sizeof("csupe")];
+    char entity_pool_str3926[sizeof("simg")];
+    char entity_pool_str3927[sizeof("UpperRightArrow")];
+    char entity_pool_str3928[sizeof("csube")];
+    char entity_pool_str3930[sizeof("dtri")];
+    char entity_pool_str3931[sizeof("prnsim")];
+    char entity_pool_str3936[sizeof("boxUr")];
+    char entity_pool_str3937[sizeof("uuarr")];
+    char entity_pool_str3945[sizeof("DownLeftTeeVector")];
+    char entity_pool_str3946[sizeof("gsime")];
+    char entity_pool_str3950[sizeof("bigotimes")];
+    char entity_pool_str3951[sizeof("Dagger")];
+    char entity_pool_str3954[sizeof("Intersection")];
+    char entity_pool_str3967[sizeof("iacute")];
+    char entity_pool_str3969[sizeof("prcue")];
+    char entity_pool_str3981[sizeof("egsdot")];
+    char entity_pool_str3987[sizeof("Implies")];
+    char entity_pool_str3988[sizeof("VDash")];
+    char entity_pool_str3996[sizeof("bump")];
+    char entity_pool_str4015[sizeof("Mu")];
+    char entity_pool_str4022[sizeof("vDash")];
+    char entity_pool_str4028[sizeof("lvnE")];
+    char entity_pool_str4033[sizeof("LeftTeeArrow")];
+    char entity_pool_str4037[sizeof("Nacute")];
+    char entity_pool_str4042[sizeof("UnderBrace")];
+    char entity_pool_str4043[sizeof("Psi")];
+    char entity_pool_str4047[sizeof("rhov")];
+    char entity_pool_str4049[sizeof("lescc")];
+    char entity_pool_str4055[sizeof("sup1")];
+    char entity_pool_str4058[sizeof("sup2")];
+    char entity_pool_str4066[sizeof("sup3")];
+    char entity_pool_str4071[sizeof("bigodot")];
+    char entity_pool_str4078[sizeof("Downarrow")];
+    char entity_pool_str4080[sizeof("xsqcup")];
+    char entity_pool_str4082[sizeof("barvee")];
+    char entity_pool_str4087[sizeof("NegativeMediumSpace")];
+    char entity_pool_str4088[sizeof("bumpe")];
+    char entity_pool_str4100[sizeof("cscr")];
+    char entity_pool_str4109[sizeof("nsc")];
+    char entity_pool_str4115[sizeof("sup")];
+    char entity_pool_str4122[sizeof("cedil")];
+    char entity_pool_str4125[sizeof("boxVr")];
+    char entity_pool_str4127[sizeof("origof")];
+    char entity_pool_str4128[sizeof("zwj")];
+    char entity_pool_str4129[sizeof("Igrave")];
+    char entity_pool_str4137[sizeof("Idot")];
+    char entity_pool_str4139[sizeof("xscr")];
+    char entity_pool_str4140[sizeof("xi")];
+    char entity_pool_str4144[sizeof("nGtv")];
+    char entity_pool_str4153[sizeof("boxHu")];
+    char entity_pool_str4163[sizeof("THORN")];
+    char entity_pool_str4165[sizeof("Racute")];
+    char entity_pool_str4167[sizeof("rarrhk")];
+    char entity_pool_str4169[sizeof("larrhk")];
+    char entity_pool_str4177[sizeof("rtriltri")];
+    char entity_pool_str4189[sizeof("boxV")];
+    char entity_pool_str4215[sizeof("dagger")];
+    char entity_pool_str4220[sizeof("Omicron")];
+    char entity_pool_str4226[sizeof("DoubleVerticalBar")];
+    char entity_pool_str4229[sizeof("nexists")];
+    char entity_pool_str4232[sizeof("Nu")];
+    char entity_pool_str4233[sizeof("nexist")];
+    char entity_pool_str4234[sizeof("gE")];
+    char entity_pool_str4238[sizeof("ap")];
+    char entity_pool_str4243[sizeof("Sup")];
+    char entity_pool_str4244[sizeof("doteqdot")];
+    char entity_pool_str4247[sizeof("eng")];
+    char entity_pool_str4249[sizeof("caron")];
+    char entity_pool_str4251[sizeof("boxHU")];
+    char entity_pool_str4252[sizeof("gesdot")];
+    char entity_pool_str4257[sizeof("ReverseEquilibrium")];
+    char entity_pool_str4262[sizeof("boxUL")];
+    char entity_pool_str4264[sizeof("supmult")];
+    char entity_pool_str4267[sizeof("pitchfork")];
+    char entity_pool_str4272[sizeof("numsp")];
+    char entity_pool_str4285[sizeof("rang")];
+    char entity_pool_str4287[sizeof("lang")];
+    char entity_pool_str4290[sizeof("ocir")];
+    char entity_pool_str4292[sizeof("rationals")];
+    char entity_pool_str4294[sizeof("coprod")];
+    char entity_pool_str4307[sizeof("ltlarr")];
+    char entity_pool_str4308[sizeof("breve")];
+    char entity_pool_str4310[sizeof("nang")];
+    char entity_pool_str4315[sizeof("swarhk")];
+    char entity_pool_str4322[sizeof("raquo")];
+    char entity_pool_str4324[sizeof("laquo")];
+    char entity_pool_str4325[sizeof("supsub")];
+    char entity_pool_str4329[sizeof("Cup")];
+    char entity_pool_str4330[sizeof("ape")];
+    char entity_pool_str4331[sizeof("quest")];
+    char entity_pool_str4336[sizeof("nwarhk")];
+    char entity_pool_str4340[sizeof("supset")];
+    char entity_pool_str4342[sizeof("downarrow")];
+    char entity_pool_str4351[sizeof("duarr")];
+    char entity_pool_str4353[sizeof("apos")];
+    char entity_pool_str4354[sizeof("Ograve")];
+    char entity_pool_str4355[sizeof("shortparallel")];
+    char entity_pool_str4364[sizeof("nsucc")];
+    char entity_pool_str4368[sizeof("LongLeftArrow")];
+    char entity_pool_str4377[sizeof("lesdoto")];
+    char entity_pool_str4384[sizeof("supne")];
+    char entity_pool_str4388[sizeof("nGg")];
+    char entity_pool_str4396[sizeof("raemptyv")];
+    char entity_pool_str4397[sizeof("supsup")];
+    char entity_pool_str4398[sizeof("laemptyv")];
+    char entity_pool_str4401[sizeof("topfork")];
+    char entity_pool_str4423[sizeof("Eogon")];
+    char entity_pool_str4429[sizeof("risingdotseq")];
+    char entity_pool_str4431[sizeof("bumpeq")];
+    char entity_pool_str4435[sizeof("lstrok")];
+    char entity_pool_str4439[sizeof("Tstrok")];
+    char entity_pool_str4440[sizeof("gsim")];
+    char entity_pool_str4443[sizeof("bemptyv")];
+    char entity_pool_str4444[sizeof("zacute")];
+    char entity_pool_str4445[sizeof("gsiml")];
+    char entity_pool_str4448[sizeof("tstrok")];
+    char entity_pool_str4450[sizeof("roang")];
+    char entity_pool_str4451[sizeof("boxVL")];
+    char entity_pool_str4452[sizeof("loang")];
+    char entity_pool_str4456[sizeof("nleqslant")];
+    char entity_pool_str4462[sizeof("sbquo")];
+    char entity_pool_str4464[sizeof("searhk")];
+    char entity_pool_str4465[sizeof("lnapprox")];
+    char entity_pool_str4468[sizeof("Supset")];
+    char entity_pool_str4470[sizeof("boxHd")];
+    char entity_pool_str4471[sizeof("varkappa")];
+    char entity_pool_str4475[sizeof("circeq")];
+    char entity_pool_str4477[sizeof("yopf")];
+    char entity_pool_str4479[sizeof("UnionPlus")];
+    char entity_pool_str4484[sizeof("Lang")];
+    char entity_pool_str4485[sizeof("nearhk")];
+    char entity_pool_str4486[sizeof("shcy")];
+    char entity_pool_str4492[sizeof("cfr")];
+    char entity_pool_str4506[sizeof("Kappa")];
+    char entity_pool_str4507[sizeof("ljcy")];
+    char entity_pool_str4508[sizeof("MediumSpace")];
+    char entity_pool_str4511[sizeof("supseteq")];
+    char entity_pool_str4512[sizeof("supseteqq")];
+    char entity_pool_str4517[sizeof("reg")];
+    char entity_pool_str4518[sizeof("amacr")];
+    char entity_pool_str4519[sizeof("leg")];
+    char entity_pool_str4524[sizeof("weierp")];
+    char entity_pool_str4525[sizeof("TScy")];
+    char entity_pool_str4529[sizeof("supsetneq")];
+    char entity_pool_str4530[sizeof("njcy")];
+    char entity_pool_str4531[sizeof("xfr")];
+    char entity_pool_str4533[sizeof("mu")];
+    char entity_pool_str4539[sizeof("nvinfin")];
+    char entity_pool_str4540[sizeof("boxUR")];
+    char entity_pool_str4545[sizeof("xoplus")];
+    char entity_pool_str4551[sizeof("leftleftarrows")];
+    char entity_pool_str4552[sizeof("sum")];
+    char entity_pool_str4559[sizeof("beth")];
+    char entity_pool_str4563[sizeof("complement")];
+    char entity_pool_str4573[sizeof("num")];
+    char entity_pool_str4574[sizeof("amp")];
+    char entity_pool_str4583[sizeof("boxUl")];
+    char entity_pool_str4590[sizeof("NotGreater")];
+    char entity_pool_str4591[sizeof("boxplus")];
+    char entity_pool_str4592[sizeof("jmath")];
+    char entity_pool_str4594[sizeof("sfrown")];
+    char entity_pool_str4596[sizeof("Dstrok")];
+    char entity_pool_str4598[sizeof("and")];
+    char entity_pool_str4599[sizeof("NotGreaterGreater")];
+    char entity_pool_str4606[sizeof("NotGreaterSlantEqual")];
+    char entity_pool_str4608[sizeof("NotGreaterLess")];
+    char entity_pool_str4609[sizeof("quot")];
+    char entity_pool_str4616[sizeof("NotGreaterFullEqual")];
+    char entity_pool_str4617[sizeof("hyphen")];
+    char entity_pool_str4618[sizeof("planck")];
+    char entity_pool_str4620[sizeof("TildeEqual")];
+    char entity_pool_str4627[sizeof("tosa")];
+    char entity_pool_str4632[sizeof("Lstrok")];
+    char entity_pool_str4635[sizeof("shy")];
+    char entity_pool_str4639[sizeof("xnis")];
+    char entity_pool_str4640[sizeof("Iogon")];
+    char entity_pool_str4643[sizeof("DZcy")];
+    char entity_pool_str4645[sizeof("ohbar")];
+    char entity_pool_str4652[sizeof("cirscir")];
+    char entity_pool_str4654[sizeof("sext")];
+    char entity_pool_str4668[sizeof("para")];
+    char entity_pool_str4671[sizeof("ast")];
+    char entity_pool_str4678[sizeof("questeq")];
+    char entity_pool_str4680[sizeof("Sum")];
+    char entity_pool_str4682[sizeof("DScy")];
+    char entity_pool_str4684[sizeof("ENG")];
+    char entity_pool_str4686[sizeof("ZHcy")];
+    char entity_pool_str4689[sizeof("longleftarrow")];
+    char entity_pool_str4691[sizeof("dash")];
+    char entity_pool_str4699[sizeof("DownTeeArrow")];
+    char entity_pool_str4706[sizeof("supsetneqq")];
+    char entity_pool_str4714[sizeof("profalar")];
+    char entity_pool_str4718[sizeof("oacute")];
+    char entity_pool_str4729[sizeof("boxVR")];
+    char entity_pool_str4732[sizeof("Eacute")];
+    char entity_pool_str4738[sizeof("supplus")];
+    char entity_pool_str4740[sizeof("hookleftarrow")];
+    char entity_pool_str4743[sizeof("CloseCurlyQuote")];
+    char entity_pool_str4746[sizeof("trisb")];
+    char entity_pool_str4747[sizeof("dotsquare")];
+    char entity_pool_str4751[sizeof("rtimes")];
+    char entity_pool_str4753[sizeof("ltimes")];
+    char entity_pool_str4756[sizeof("toea")];
+    char entity_pool_str4757[sizeof("Agrave")];
+    char entity_pool_str4760[sizeof("Assign")];
+    char entity_pool_str4761[sizeof("Rang")];
+    char entity_pool_str4762[sizeof("iocy")];
+    char entity_pool_str4764[sizeof("NotPrecedesEqual")];
+    char entity_pool_str4766[sizeof("aopf")];
+    char entity_pool_str4768[sizeof("chi")];
+    char entity_pool_str4771[sizeof("quaternions")];
+    char entity_pool_str4772[sizeof("boxVl")];
+    char entity_pool_str4773[sizeof("NotGreaterEqual")];
+    char entity_pool_str4777[sizeof("xhArr")];
+    char entity_pool_str4791[sizeof("orderof")];
+    char entity_pool_str4794[sizeof("rsquo")];
+    char entity_pool_str4796[sizeof("lsquo")];
+    char entity_pool_str4797[sizeof("yscr")];
+    char entity_pool_str4800[sizeof("gdot")];
+    char entity_pool_str4802[sizeof("NotSquareSubsetEqual")];
+    char entity_pool_str4803[sizeof("KHcy")];
+    char entity_pool_str4809[sizeof("bsolb")];
+    char entity_pool_str4810[sizeof("NotSquareSubset")];
+    char entity_pool_str4811[sizeof("SHcy")];
+    char entity_pool_str4821[sizeof("YIcy")];
+    char entity_pool_str4825[sizeof("cwint")];
+    char entity_pool_str4828[sizeof("Theta")];
+    char entity_pool_str4837[sizeof("theta")];
+    char entity_pool_str4838[sizeof("xlArr")];
+    char entity_pool_str4840[sizeof("NotSquareSupersetEqual")];
+    char entity_pool_str4843[sizeof("demptyv")];
+    char entity_pool_str4844[sizeof("triangle")];
+    char entity_pool_str4846[sizeof("Gdot")];
+    char entity_pool_str4848[sizeof("NotSquareSuperset")];
+    char entity_pool_str4857[sizeof("Abreve")];
+    char entity_pool_str4860[sizeof("dstrok")];
+    char entity_pool_str4861[sizeof("pertenk")];
+    char entity_pool_str4866[sizeof("rbrack")];
+    char entity_pool_str4868[sizeof("lbrack")];
+    char entity_pool_str4872[sizeof("odsold")];
+    char entity_pool_str4878[sizeof("omid")];
+    char entity_pool_str4880[sizeof("xrArr")];
+    char entity_pool_str4882[sizeof("triangleleft")];
+    char entity_pool_str4883[sizeof("NotGreaterTilde")];
+    char entity_pool_str4884[sizeof("colone")];
+    char entity_pool_str4886[sizeof("Longleftarrow")];
+    char entity_pool_str4888[sizeof("iota")];
+    char entity_pool_str4890[sizeof("colon")];
+    char entity_pool_str4891[sizeof("Zeta")];
+    char entity_pool_str4892[sizeof("gbreve")];
+    char entity_pool_str4897[sizeof("CHcy")];
+    char entity_pool_str4900[sizeof("YUcy")];
+    char entity_pool_str4901[sizeof("REG")];
+    char entity_pool_str4902[sizeof("szlig")];
+    char entity_pool_str4909[sizeof("dzcy")];
+    char entity_pool_str4911[sizeof("beta")];
+    char entity_pool_str4918[sizeof("euro")];
+    char entity_pool_str4921[sizeof("LeftArrow")];
+    char entity_pool_str4924[sizeof("CapitalDifferentialD")];
+    char entity_pool_str4926[sizeof("ring")];
+    char entity_pool_str4927[sizeof("Laplacetrf")];
+    char entity_pool_str4932[sizeof("djcy")];
+    char entity_pool_str4934[sizeof("oplus")];
+    char entity_pool_str4937[sizeof("integers")];
+    char entity_pool_str4938[sizeof("Gbreve")];
+    char entity_pool_str4940[sizeof("ubrcy")];
+    char entity_pool_str4941[sizeof("euml")];
+    char entity_pool_str4944[sizeof("deg")];
+    char entity_pool_str4946[sizeof("uuml")];
+    char entity_pool_str4949[sizeof("Iacute")];
+    char entity_pool_str4950[sizeof("succeq")];
+    char entity_pool_str4952[sizeof("KJcy")];
+    char entity_pool_str4961[sizeof("CupCap")];
+    char entity_pool_str4975[sizeof("tscy")];
+    char entity_pool_str4982[sizeof("cent")];
+    char entity_pool_str4991[sizeof("DJcy")];
+    char entity_pool_str5009[sizeof("TildeFullEqual")];
+    char entity_pool_str5011[sizeof("triangleq")];
+    char entity_pool_str5016[sizeof("duhar")];
+    char entity_pool_str5025[sizeof("LeftDoubleBracket")];
+    char entity_pool_str5027[sizeof("LJcy")];
+    char entity_pool_str5036[sizeof("iecy")];
+    char entity_pool_str5043[sizeof("trianglelefteq")];
+    char entity_pool_str5049[sizeof("nequiv")];
+    char entity_pool_str5055[sizeof("nshortparallel")];
+    char entity_pool_str5062[sizeof("ndash")];
+    char entity_pool_str5063[sizeof("bowtie")];
+    char entity_pool_str5065[sizeof("fjlig")];
+    char entity_pool_str5072[sizeof("Ubrcy")];
+    char entity_pool_str5074[sizeof("vartheta")];
+    char entity_pool_str5078[sizeof("Uuml")];
+    char entity_pool_str5084[sizeof("vartriangleright")];
+    char entity_pool_str5085[sizeof("vartriangleleft")];
+    char entity_pool_str5086[sizeof("ascr")];
+    char entity_pool_str5089[sizeof("succcurlyeq")];
+    char entity_pool_str5093[sizeof("cwconint")];
+    char entity_pool_str5101[sizeof("sc")];
+    char entity_pool_str5103[sizeof("fllig")];
+    char entity_pool_str5105[sizeof("circledast")];
+    char entity_pool_str5108[sizeof("Vdash")];
+    char entity_pool_str5112[sizeof("nVdash")];
+    char entity_pool_str5120[sizeof("suplarr")];
+    char entity_pool_str5124[sizeof("robrk")];
+    char entity_pool_str5126[sizeof("lobrk")];
+    char entity_pool_str5142[sizeof("vdash")];
+    char entity_pool_str5143[sizeof("Yuml")];
+    char entity_pool_str5151[sizeof("gt")];
+    char entity_pool_str5156[sizeof("ccaps")];
+    char entity_pool_str5173[sizeof("Succeeds")];
+    char entity_pool_str5174[sizeof("Oacute")];
+    char entity_pool_str5175[sizeof("TRADE")];
+    char entity_pool_str5176[sizeof("NJcy")];
+    char entity_pool_str5181[sizeof("gtdot")];
+    char entity_pool_str5189[sizeof("yfr")];
+    char entity_pool_str5192[sizeof("compfn")];
+    char entity_pool_str5197[sizeof("Gt")];
+    char entity_pool_str5198[sizeof("scnE")];
+    char entity_pool_str5199[sizeof("ijlig")];
+    char entity_pool_str5203[sizeof("circledS")];
+    char entity_pool_str5206[sizeof("yen")];
+    char entity_pool_str5208[sizeof("thetasym")];
+    char entity_pool_str5211[sizeof("iuml")];
+    char entity_pool_str5212[sizeof("SucceedsSlantEqual")];
+    char entity_pool_str5217[sizeof("boxH")];
+    char entity_pool_str5218[sizeof("mumap")];
+    char entity_pool_str5222[sizeof("rightrightarrows")];
+    char entity_pool_str5227[sizeof("coloneq")];
+    char entity_pool_str5229[sizeof("Sc")];
+    char entity_pool_str5230[sizeof("glj")];
+    char entity_pool_str5231[sizeof("iexcl")];
+    char entity_pool_str5234[sizeof("ccups")];
+    char entity_pool_str5236[sizeof("xcap")];
+    char entity_pool_str5237[sizeof("zhcy")];
+    char entity_pool_str5241[sizeof("boxHD")];
+    char entity_pool_str5250[sizeof("leqslant")];
+    char entity_pool_str5252[sizeof("UpperLeftArrow")];
+    char entity_pool_str5257[sizeof("dblac")];
+    char entity_pool_str5260[sizeof("puncsp")];
+    char entity_pool_str5262[sizeof("ccaron")];
+    char entity_pool_str5264[sizeof("rbbrk")];
+    char entity_pool_str5266[sizeof("lbbrk")];
+    char entity_pool_str5268[sizeof("Aogon")];
+    char entity_pool_str5269[sizeof("LeftTriangleBar")];
+    char entity_pool_str5272[sizeof("gesdotol")];
+    char entity_pool_str5273[sizeof("LeftTriangleEqual")];
+    char entity_pool_str5274[sizeof("LeftTriangle")];
+    char entity_pool_str5280[sizeof("conint")];
+    char entity_pool_str5283[sizeof("drbkarow")];
+    char entity_pool_str5295[sizeof("rtrif")];
+    char entity_pool_str5297[sizeof("ltrif")];
+    char entity_pool_str5300[sizeof("ReverseUpEquilibrium")];
+    char entity_pool_str5306[sizeof("LeftCeiling")];
+    char entity_pool_str5308[sizeof("utrif")];
+    char entity_pool_str5314[sizeof("xcup")];
+    char entity_pool_str5319[sizeof("fallingdotseq")];
+    char entity_pool_str5325[sizeof("rcedil")];
+    char entity_pool_str5327[sizeof("lcedil")];
+    char entity_pool_str5329[sizeof("scedil")];
+    char entity_pool_str5331[sizeof("Tcedil")];
+    char entity_pool_str5333[sizeof("starf")];
+    char entity_pool_str5334[sizeof("boxminus")];
+    char entity_pool_str5340[sizeof("tcedil")];
+    char entity_pool_str5341[sizeof("ZeroWidthSpace")];
+    char entity_pool_str5350[sizeof("ncedil")];
+    char entity_pool_str5358[sizeof("phiv")];
+    char entity_pool_str5375[sizeof("ic")];
+    char entity_pool_str5384[sizeof("capdot")];
+    char entity_pool_str5387[sizeof("dscy")];
+    char entity_pool_str5397[sizeof("check")];
+    char entity_pool_str5398[sizeof("ovbar")];
+    char entity_pool_str5405[sizeof("ntriangleleft")];
+    char entity_pool_str5411[sizeof("RightTee")];
+    char entity_pool_str5412[sizeof("nvge")];
+    char entity_pool_str5424[sizeof("leftrightsquigarrow")];
+    char entity_pool_str5431[sizeof("lozenge")];
+    char entity_pool_str5434[sizeof("RightTriangleBar")];
+    char entity_pool_str5436[sizeof("RightTeeVector")];
+    char entity_pool_str5438[sizeof("RightTriangleEqual")];
+    char entity_pool_str5439[sizeof("RightTriangle")];
+    char entity_pool_str5449[sizeof("Kcedil")];
+    char entity_pool_str5457[sizeof("Scedil")];
+    char entity_pool_str5468[sizeof("cirfnint")];
+    char entity_pool_str5471[sizeof("empty")];
+    char entity_pool_str5478[sizeof("afr")];
+    char entity_pool_str5482[sizeof("DiacriticalTilde")];
+    char entity_pool_str5489[sizeof("LeftDownVector")];
+    char entity_pool_str5492[sizeof("LeftDownVectorBar")];
+    char entity_pool_str5501[sizeof("lEg")];
+    char entity_pool_str5509[sizeof("ApplyFunction")];
+    char entity_pool_str5512[sizeof("bumpE")];
+    char entity_pool_str5524[sizeof("Lcedil")];
+    char entity_pool_str5528[sizeof("caret")];
+    char entity_pool_str5530[sizeof("Barv")];
+    char entity_pool_str5543[sizeof("Ccedil")];
+    char entity_pool_str5547[sizeof("circledR")];
+    char entity_pool_str5548[sizeof("LeftDownTeeVector")];
+    char entity_pool_str5552[sizeof("tshcy")];
+    char entity_pool_str5556[sizeof("DotEqual")];
+    char entity_pool_str5564[sizeof("centerdot")];
+    char entity_pool_str5566[sizeof("ntrianglelefteq")];
+    char entity_pool_str5568[sizeof("minus")];
+    char entity_pool_str5570[sizeof("gimel")];
+    char entity_pool_str5577[sizeof("Aacute")];
+    char entity_pool_str5578[sizeof("gtcir")];
+    char entity_pool_str5583[sizeof("gtrarr")];
+    char entity_pool_str5584[sizeof("bull")];
+    char entity_pool_str5587[sizeof("DownArrow")];
+    char entity_pool_str5593[sizeof("rdquor")];
+    char entity_pool_str5595[sizeof("ldquor")];
+    char entity_pool_str5598[sizeof("intlarhk")];
+    char entity_pool_str5602[sizeof("utilde")];
+    char entity_pool_str5612[sizeof("gacute")];
+    char entity_pool_str5614[sizeof("ntilde")];
+    char entity_pool_str5615[sizeof("af")];
+    char entity_pool_str5618[sizeof("Hstrok")];
+    char entity_pool_str5620[sizeof("exponentiale")];
+    char entity_pool_str5621[sizeof("minusb")];
+    char entity_pool_str5625[sizeof("RightUpTeeVector")];
+    char entity_pool_str5630[sizeof("UpTeeArrow")];
+    char entity_pool_str5639[sizeof("zeta")];
+    char entity_pool_str5644[sizeof("DiacriticalDot")];
+    char entity_pool_str5645[sizeof("DiacriticalDoubleAcute")];
+    char entity_pool_str5663[sizeof("nleftarrow")];
+    char entity_pool_str5664[sizeof("hkswarow")];
+    char entity_pool_str5666[sizeof("iiota")];
+    char entity_pool_str5669[sizeof("apacir")];
+    char entity_pool_str5673[sizeof("Ncedil")];
+    char entity_pool_str5678[sizeof("capand")];
+    char entity_pool_str5686[sizeof("mdash")];
+    char entity_pool_str5689[sizeof("filig")];
+    char entity_pool_str5690[sizeof("scnsim")];
+    char entity_pool_str5699[sizeof("realpart")];
+    char entity_pool_str5703[sizeof("leftthreetimes")];
+    char entity_pool_str5704[sizeof("asymp")];
+    char entity_pool_str5718[sizeof("hellip")];
+    char entity_pool_str5722[sizeof("dtrif")];
+    char entity_pool_str5724[sizeof("NotExists")];
+    char entity_pool_str5728[sizeof("sccue")];
+    char entity_pool_str5733[sizeof("YAcy")];
+    char entity_pool_str5734[sizeof("Utilde")];
+    char entity_pool_str5741[sizeof("NotEqual")];
+    char entity_pool_str5747[sizeof("ThinSpace")];
+    char entity_pool_str5754[sizeof("apE")];
+    char entity_pool_str5762[sizeof("bullet")];
+    char entity_pool_str5765[sizeof("CloseCurlyDoubleQuote")];
+    char entity_pool_str5766[sizeof("Delta")];
+    char entity_pool_str5776[sizeof("gg")];
+    char entity_pool_str5780[sizeof("otimes")];
+    char entity_pool_str5799[sizeof("wreath")];
+    char entity_pool_str5801[sizeof("Rcedil")];
+    char entity_pool_str5807[sizeof("eth")];
+    char entity_pool_str5808[sizeof("supnE")];
+    char entity_pool_str5811[sizeof("awint")];
+    char entity_pool_str5817[sizeof("Breve")];
+    char entity_pool_str5822[sizeof("Gg")];
+    char entity_pool_str5824[sizeof("HumpEqual")];
+    char entity_pool_str5837[sizeof("Lleftarrow")];
+    char entity_pool_str5838[sizeof("boxdr")];
+    char entity_pool_str5847[sizeof("succneqq")];
+    char entity_pool_str5848[sizeof("uring")];
+    char entity_pool_str5849[sizeof("LessSlantEqual")];
+    char entity_pool_str5860[sizeof("nvdash")];
+    char entity_pool_str5866[sizeof("Hacek")];
+    char entity_pool_str5867[sizeof("itilde")];
+    char entity_pool_str5870[sizeof("Iota")];
+    char entity_pool_str5872[sizeof("IOcy")];
+    char entity_pool_str5884[sizeof("boxDr")];
+    char entity_pool_str5891[sizeof("SucceedsTilde")];
+    char entity_pool_str5905[sizeof("LeftFloor")];
+    char entity_pool_str5906[sizeof("Vvdash")];
+    char entity_pool_str5923[sizeof("triangledown")];
+    char entity_pool_str5927[sizeof("LongLeftRightArrow")];
+    char entity_pool_str5928[sizeof("RightFloor")];
+    char entity_pool_str5931[sizeof("DownRightTeeVector")];
+    char entity_pool_str5933[sizeof("quatint")];
+    char entity_pool_str5937[sizeof("Ntilde")];
+    char entity_pool_str5940[sizeof("Bumpeq")];
+    char entity_pool_str5949[sizeof("gvnE")];
+    char entity_pool_str5951[sizeof("boxhu")];
+    char entity_pool_str5956[sizeof("gtlPar")];
+    char entity_pool_str5959[sizeof("nprec")];
+    char entity_pool_str5962[sizeof("ouml")];
+    char entity_pool_str5970[sizeof("gescc")];
+    char entity_pool_str5976[sizeof("Euml")];
+    char entity_pool_str5980[sizeof("Uring")];
+    char entity_pool_str5982[sizeof("UnderBracket")];
+    char entity_pool_str5983[sizeof("nLtv")];
+    char entity_pool_str5984[sizeof("LeftArrowBar")];
+    char entity_pool_str5985[sizeof("ncongdot")];
+    char entity_pool_str6003[sizeof("asympeq")];
+    char entity_pool_str6023[sizeof("minusdu")];
+    char entity_pool_str6030[sizeof("delta")];
+    char entity_pool_str6032[sizeof("harrw")];
+    char entity_pool_str6038[sizeof("andslope")];
+    char entity_pool_str6043[sizeof("cdot")];
+    char entity_pool_str6048[sizeof("Cayleys")];
+    char entity_pool_str6049[sizeof("boxhU")];
+    char entity_pool_str6052[sizeof("succsim")];
+    char entity_pool_str6061[sizeof("cirE")];
+    char entity_pool_str6062[sizeof("sdotb")];
+    char entity_pool_str6066[sizeof("odash")];
+    char entity_pool_str6067[sizeof("cirmid")];
+    char entity_pool_str6068[sizeof("suphsub")];
+    char entity_pool_str6069[sizeof("supdsub")];
+    char entity_pool_str6077[sizeof("supdot")];
+    char entity_pool_str6079[sizeof("awconint")];
+    char entity_pool_str6084[sizeof("TSHcy")];
+    char entity_pool_str6087[sizeof("grave")];
+    char entity_pool_str6101[sizeof("lsimg")];
+    char entity_pool_str6106[sizeof("UpArrowDownArrow")];
+    char entity_pool_str6121[sizeof("LeftVector")];
+    char entity_pool_str6122[sizeof("DoubleRightArrow")];
+    char entity_pool_str6129[sizeof("NegativeThinSpace")];
+    char entity_pool_str6140[sizeof("lhblk")];
+    char entity_pool_str6146[sizeof("cire")];
+    char entity_pool_str6147[sizeof("nVDash")];
+    char entity_pool_str6151[sizeof("uhblk")];
+    char entity_pool_str6155[sizeof("imagpart")];
+    char entity_pool_str6161[sizeof("RightUpDownVector")];
+    char entity_pool_str6164[sizeof("boxdL")];
+    char entity_pool_str6176[sizeof("gla")];
+    char entity_pool_str6193[sizeof("Iuml")];
+    char entity_pool_str6203[sizeof("oelig")];
+    char entity_pool_str6208[sizeof("NotLessSlantEqual")];
+    char entity_pool_str6210[sizeof("boxDL")];
+    char entity_pool_str6215[sizeof("gamma")];
+    char entity_pool_str6236[sizeof("Otimes")];
+    char entity_pool_str6248[sizeof("longleftrightarrow")];
+    char entity_pool_str6261[sizeof("Gamma")];
+    char entity_pool_str6262[sizeof("bigwedge")];
+    char entity_pool_str6268[sizeof("boxhd")];
+    char entity_pool_str6283[sizeof("supE")];
+    char entity_pool_str6292[sizeof("LeftUpTeeVector")];
+    char entity_pool_str6298[sizeof("gesdoto")];
+    char entity_pool_str6304[sizeof("kappa")];
+    char entity_pool_str6315[sizeof("ngeqslant")];
+    char entity_pool_str6340[sizeof("gtrless")];
+    char entity_pool_str6351[sizeof("fflig")];
+    char entity_pool_str6352[sizeof("bigsqcup")];
+    char entity_pool_str6367[sizeof("kgreen")];
+    char entity_pool_str6368[sizeof("supe")];
+    char entity_pool_str6370[sizeof("boxtimes")];
+    char entity_pool_str6386[sizeof("gnapprox")];
+    char entity_pool_str6394[sizeof("downdownarrows")];
+    char entity_pool_str6403[sizeof("biguplus")];
+    char entity_pool_str6404[sizeof("khcy")];
+    char entity_pool_str6406[sizeof("ddagger")];
+    char entity_pool_str6418[sizeof("Ouml")];
+    char entity_pool_str6420[sizeof("Beta")];
+    char entity_pool_str6421[sizeof("minusd")];
+    char entity_pool_str6422[sizeof("succnsim")];
+    char entity_pool_str6424[sizeof("ctdot")];
+    char entity_pool_str6427[sizeof("kjcy")];
+    char entity_pool_str6428[sizeof("gjcy")];
+    char entity_pool_str6430[sizeof("ncong")];
+    char entity_pool_str6431[sizeof("xvee")];
+    char entity_pool_str6432[sizeof("bcong")];
+    char entity_pool_str6439[sizeof("sqsube")];
+    char entity_pool_str6442[sizeof("boxdR")];
+    char entity_pool_str6445[sizeof("Longleftrightarrow")];
+    char entity_pool_str6447[sizeof("sqsub")];
+    char entity_pool_str6451[sizeof("DownLeftRightVector")];
+    char entity_pool_str6454[sizeof("sqsubset")];
+    char entity_pool_str6456[sizeof("NotVerticalBar")];
+    char entity_pool_str6461[sizeof("NotEqualTilde")];
+    char entity_pool_str6485[sizeof("boxdl")];
+    char entity_pool_str6488[sizeof("boxDR")];
+    char entity_pool_str6490[sizeof("andand")];
+    char entity_pool_str6502[sizeof("RightVector")];
+    char entity_pool_str6504[sizeof("IJlig")];
+    char entity_pool_str6505[sizeof("NotTildeEqual")];
+    char entity_pool_str6509[sizeof("angzarr")];
+    char entity_pool_str6515[sizeof("angrt")];
+    char entity_pool_str6521[sizeof("acd")];
+    char entity_pool_str6524[sizeof("andd")];
+    char entity_pool_str6526[sizeof("nrarrc")];
+    char entity_pool_str6527[sizeof("VeryThinSpace")];
+    char entity_pool_str6529[sizeof("Superset")];
+    char entity_pool_str6531[sizeof("boxDl")];
+    char entity_pool_str6535[sizeof("vnsub")];
+    char entity_pool_str6538[sizeof("ccupssm")];
+    char entity_pool_str6548[sizeof("varnothing")];
+    char entity_pool_str6552[sizeof("rcy")];
+    char entity_pool_str6554[sizeof("lcy")];
+    char entity_pool_str6556[sizeof("scy")];
+    char entity_pool_str6558[sizeof("Tcy")];
+    char entity_pool_str6559[sizeof("Zcy")];
+    char entity_pool_str6560[sizeof("ecy")];
+    char entity_pool_str6561[sizeof("rdsh")];
+    char entity_pool_str6563[sizeof("ldsh")];
+    char entity_pool_str6565[sizeof("ucy")];
+    char entity_pool_str6566[sizeof("boxVH")];
+    char entity_pool_str6567[sizeof("tcy")];
+    char entity_pool_str6577[sizeof("ncy")];
+    char entity_pool_str6579[sizeof("bcy")];
+    char entity_pool_str6580[sizeof("ntgl")];
+    char entity_pool_str6585[sizeof("Jcy")];
+    char entity_pool_str6600[sizeof("congdot")];
+    char entity_pool_str6607[sizeof("angst")];
+    char entity_pool_str6609[sizeof("RightDownTeeVector")];
+    char entity_pool_str6612[sizeof("OverParenthesis")];
+    char entity_pool_str6613[sizeof("ltquest")];
+    char entity_pool_str6615[sizeof("pcy")];
+    char entity_pool_str6618[sizeof("otilde")];
+    char entity_pool_str6619[sizeof("rdquo")];
+    char entity_pool_str6621[sizeof("ldquo")];
+    char entity_pool_str6623[sizeof("Vcy")];
+    char entity_pool_str6626[sizeof("capbrcup")];
+    char entity_pool_str6646[sizeof("bdquo")];
+    char entity_pool_str6650[sizeof("DownArrowBar")];
+    char entity_pool_str6657[sizeof("vcy")];
+    char entity_pool_str6665[sizeof("angrtvb")];
+    char entity_pool_str6676[sizeof("Kcy")];
+    char entity_pool_str6683[sizeof("Mcy")];
+    char entity_pool_str6684[sizeof("Scy")];
+    char entity_pool_str6691[sizeof("NewLine")];
+    char entity_pool_str6696[sizeof("fcy")];
+    char entity_pool_str6697[sizeof("Ucy")];
+    char entity_pool_str6704[sizeof("boxVh")];
+    char entity_pool_str6715[sizeof("Dcy")];
+    char entity_pool_str6738[sizeof("hstrok")];
+    char entity_pool_str6751[sizeof("Lcy")];
+    char entity_pool_str6762[sizeof("Ycy")];
+    char entity_pool_str6775[sizeof("supsim")];
+    char entity_pool_str6789[sizeof("NonBreakingSpace")];
+    char entity_pool_str6790[sizeof("OverBar")];
+    char entity_pool_str6791[sizeof("sqsubseteq")];
+    char entity_pool_str6797[sizeof("GJcy")];
+    char entity_pool_str6800[sizeof("OverBrace")];
+    char entity_pool_str6806[sizeof("eqcirc")];
+    char entity_pool_str6819[sizeof("OverBracket")];
+    char entity_pool_str6821[sizeof("Auml")];
+    char entity_pool_str6829[sizeof("acute")];
+    char entity_pool_str6830[sizeof("icy")];
+    char entity_pool_str6849[sizeof("Itilde")];
+    char entity_pool_str6850[sizeof("HilbertSpace")];
+    char entity_pool_str6854[sizeof("omega")];
+    char entity_pool_str6855[sizeof("cacute")];
+    char entity_pool_str6861[sizeof("scirc")];
+    char entity_pool_str6865[sizeof("ecirc")];
+    char entity_pool_str6870[sizeof("ucirc")];
+    char entity_pool_str6872[sizeof("GreaterSlantEqual")];
+    char entity_pool_str6890[sizeof("Jcirc")];
+    char entity_pool_str6895[sizeof("nvDash")];
+    char entity_pool_str6896[sizeof("Wcirc")];
+    char entity_pool_str6900[sizeof("Ncy")];
+    char entity_pool_str6921[sizeof("RightTeeArrow")];
+    char entity_pool_str6942[sizeof("LessFullEqual")];
+    char entity_pool_str6958[sizeof("ltcc")];
+    char entity_pool_str6963[sizeof("aleph")];
+    char entity_pool_str6979[sizeof("dcy")];
+    char entity_pool_str6989[sizeof("Scirc")];
+    char entity_pool_str6991[sizeof("lessapprox")];
+    char entity_pool_str7000[sizeof("IEcy")];
+    char entity_pool_str7001[sizeof("LowerRightArrow")];
+    char entity_pool_str7002[sizeof("Ucirc")];
+    char entity_pool_str7021[sizeof("agrave")];
+    char entity_pool_str7023[sizeof("MinusPlus")];
+    char entity_pool_str7024[sizeof("bigvee")];
+    char entity_pool_str7028[sizeof("Rcy")];
+    char entity_pool_str7034[sizeof("suphsol")];
+    char entity_pool_str7037[sizeof("EmptyVerySmallSquare")];
+    char entity_pool_str7039[sizeof("boxhD")];
+    char entity_pool_str7047[sizeof("precapprox")];
+    char entity_pool_str7066[sizeof("angrtvbd")];
+  

<TRUNCATED>

[05/12] lucy-clownfish git commit: Update CommonMark source code

Posted by nw...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/inlines.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/inlines.c b/compiler/modules/CommonMark/src/inlines.c
index 08a934b..2487f63 100644
--- a/compiler/modules/CommonMark/src/inlines.c
+++ b/compiler/modules/CommonMark/src/inlines.c
@@ -1,8 +1,8 @@
 #include <stdlib.h>
 #include <string.h>
 #include <stdio.h>
-#include <ctype.h>
 
+#include "cmark_ctype.h"
 #include "config.h"
 #include "node.h"
 #include "parser.h"
@@ -16,7 +16,7 @@
 
 // Macros for creating various kinds of simple.
 #define make_str(s) make_literal(CMARK_NODE_TEXT, s)
-#define make_code(s) make_literal(CMARK_NODE_INLINE_CODE, s)
+#define make_code(s) make_literal(CMARK_NODE_CODE, s)
 #define make_raw_html(s) make_literal(CMARK_NODE_INLINE_HTML, s)
 #define make_linebreak() make_simple(CMARK_NODE_LINEBREAK)
 #define make_softbreak() make_simple(CMARK_NODE_SOFTBREAK)
@@ -31,10 +31,11 @@ typedef struct delimiter {
 	int position;
 	bool can_open;
 	bool can_close;
+	bool active;
 } delimiter;
 
 typedef struct {
-	chunk input;
+	cmark_chunk input;
 	int pos;
 	cmark_reference_map *refmap;
 	delimiter *last_delim;
@@ -45,24 +46,24 @@ S_insert_emph(subject *subj, delimiter *opener, delimiter *closer);
 
 static int parse_inline(subject* subj, cmark_node * parent);
 
-static void subject_from_buf(subject *e, strbuf *buffer,
-			     cmark_reference_map *refmap);
+static void subject_from_buf(subject *e, cmark_strbuf *buffer,
+                             cmark_reference_map *refmap);
 static int subject_find_special_char(subject *subj);
 
-static unsigned char *cmark_clean_autolink(chunk *url, int is_email)
+static unsigned char *cmark_clean_autolink(cmark_chunk *url, int is_email)
 {
-	strbuf buf = GH_BUF_INIT;
+	cmark_strbuf buf = GH_BUF_INIT;
 
-	chunk_trim(url);
+	cmark_chunk_trim(url);
 
 	if (url->len == 0)
 		return NULL;
 
 	if (is_email)
-		strbuf_puts(&buf, "mailto:");
+		cmark_strbuf_puts(&buf, "mailto:");
 
 	houdini_unescape_html_f(&buf, url->data, url->len);
-	return strbuf_detach(&buf);
+	return cmark_strbuf_detach(&buf);
 }
 
 static inline cmark_node *make_link(cmark_node *label, unsigned char *url, unsigned char *title)
@@ -71,11 +72,11 @@ static inline cmark_node *make_link(cmark_node *label, unsigned char *url, unsig
 	if(e != NULL) {
 		e->type = CMARK_NODE_LINK;
 		e->first_child   = label;
-                e->last_child    = label;
+		e->last_child    = label;
 		e->as.link.url   = url;
 		e->as.link.title = title;
 		e->next = NULL;
-                label->parent = e;
+		label->parent = e;
 	}
 	return e;
 }
@@ -93,14 +94,14 @@ static inline cmark_node* make_literal(cmark_node_type t, cmark_chunk s)
 		e->type = t;
 		e->as.literal = s;
 		e->next = NULL;
-                e->prev = NULL;
-                e->parent = NULL;
-                e->first_child = NULL;
-                e->last_child = NULL;
-                // These fields aren't used for inlines:
-                e->start_line = 0;
-                e->start_column = 0;
-                e->end_line = 0;
+		e->prev = NULL;
+		e->parent = NULL;
+		e->first_child = NULL;
+		e->last_child = NULL;
+		// These fields aren't used for inlines:
+		e->start_line = 0;
+		e->start_column = 0;
+		e->end_line = 0;
 	}
 	return e;
 }
@@ -112,14 +113,14 @@ static inline cmark_node* make_simple(cmark_node_type t)
 	if(e != NULL) {
 		e->type = t;
 		e->next = NULL;
-                e->prev = NULL;
-                e->parent = NULL;
-                e->first_child = NULL;
-                e->last_child = NULL;
-                // These fields aren't used for inlines:
-                e->start_line = 0;
-                e->start_column = 0;
-                e->end_line = 0;
+		e->prev = NULL;
+		e->parent = NULL;
+		e->first_child = NULL;
+		e->last_child = NULL;
+		// These fields aren't used for inlines:
+		e->start_line = 0;
+		e->start_column = 0;
+		e->end_line = 0;
 	}
 	return e;
 }
@@ -139,8 +140,8 @@ static unsigned char *bufdup(const unsigned char *buf)
 	return new_buf;
 }
 
-static void subject_from_buf(subject *e, strbuf *buffer,
-			     cmark_reference_map *refmap)
+static void subject_from_buf(subject *e, cmark_strbuf *buffer,
+                             cmark_reference_map *refmap)
 {
 	e->input.data = buffer->ptr;
 	e->input.len = buffer->size;
@@ -149,7 +150,7 @@ static void subject_from_buf(subject *e, strbuf *buffer,
 	e->refmap = refmap;
 	e->last_delim = NULL;
 
-	chunk_rtrim(&e->input);
+	cmark_chunk_rtrim(&e->input);
 }
 
 static inline int isbacktick(int c)
@@ -177,7 +178,7 @@ static inline int is_eof(subject* subj)
 #define advance(subj) (subj)->pos += 1
 
 // Take characters while a predicate holds, and return a string.
-static inline chunk take_while(subject* subj, int (*f)(int))
+static inline cmark_chunk take_while(subject* subj, int (*f)(int))
 {
 	unsigned char c;
 	int startpos = subj->pos;
@@ -188,7 +189,7 @@ static inline chunk take_while(subject* subj, int (*f)(int))
 		len++;
 	}
 
-	return chunk_dup(&subj->input, startpos, len);
+	return cmark_chunk_dup(&subj->input, startpos, len);
 }
 
 // Try to process a backtick code span that began with a
@@ -211,7 +212,7 @@ static int scan_to_closing_backticks(subject* subj, int openticklength)
 		advance(subj);
 		numticks++;
 	}
-	if (numticks != openticklength){
+	if (numticks != openticklength) {
 		return(scan_to_closing_backticks(subj, openticklength));
 	}
 	return (subj->pos);
@@ -221,7 +222,7 @@ static int scan_to_closing_backticks(subject* subj, int openticklength)
 // Assumes that the subject has a backtick at the current position.
 static cmark_node* handle_backticks(subject *subj)
 {
-	chunk openticks = take_while(subj, isbacktick);
+	cmark_chunk openticks = take_while(subj, isbacktick);
 	int startpos = subj->pos;
 	int endpos = scan_to_closing_backticks(subj, openticks.len);
 
@@ -229,34 +230,66 @@ static cmark_node* handle_backticks(subject *subj)
 		subj->pos = startpos; // rewind
 		return make_str(openticks);
 	} else {
-		strbuf buf = GH_BUF_INIT;
+		cmark_strbuf buf = GH_BUF_INIT;
 
-		strbuf_set(&buf, subj->input.data + startpos, endpos - startpos - openticks.len);
-		strbuf_trim(&buf);
-		strbuf_normalize_whitespace(&buf);
+		cmark_strbuf_set(&buf, subj->input.data + startpos, endpos - startpos - openticks.len);
+		cmark_strbuf_trim(&buf);
+		cmark_strbuf_normalize_whitespace(&buf);
 
-		return make_code(chunk_buf_detach(&buf));
+		return make_code(cmark_chunk_buf_detach(&buf));
 	}
 }
 
 // Scan ***, **, or * and return number scanned, or 0.
 // Advances position.
-static int scan_delims(subject* subj, unsigned char c, bool * can_open, bool * can_close)
+static int
+scan_delims(subject* subj, unsigned char c, bool * can_open, bool * can_close)
 {
 	int numdelims = 0;
-	unsigned char char_before, char_after;
+	int before_char_pos;
+	int32_t after_char = 0;
+	int32_t before_char = 0;
+	int len;
+
+	if (subj->pos == 0) {
+		before_char = 10;
+	} else {
+		before_char_pos = subj->pos - 1;
+		// walk back to the beginning of the UTF_8 sequence:
+		while (peek_at(subj, before_char_pos) >> 6 == 2 &&
+		       before_char_pos > 0) {
+			before_char_pos -= 1;
+		}
+		len = utf8proc_iterate(subj->input.data + before_char_pos,
+		                       subj->pos - before_char_pos, &before_char);
+		if (len == -1) {
+			before_char = 10;
+		}
+	}
 
-	char_before = subj->pos == 0 ? '\n' : peek_at(subj, subj->pos - 1);
 	while (peek_char(subj) == c) {
 		numdelims++;
 		advance(subj);
 	}
-	char_after = peek_char(subj);
-	*can_open = numdelims > 0 && !isspace(char_after);
-	*can_close = numdelims > 0 && !isspace(char_before);
+
+	len = utf8proc_iterate(subj->input.data + subj->pos,
+	                       subj->input.len - subj->pos, &after_char);
+	if (len == -1) {
+		after_char = 10;
+	}
+	*can_open = numdelims > 0 && !utf8proc_is_space(after_char) &&
+	            !(utf8proc_is_punctuation(after_char) &&
+	              !utf8proc_is_space(before_char) &&
+	              !utf8proc_is_punctuation(before_char));
+	*can_close = numdelims > 0 && !utf8proc_is_space(before_char) &&
+	             !(utf8proc_is_punctuation(before_char) &&
+	               !utf8proc_is_space(after_char) &&
+	               !utf8proc_is_punctuation(after_char));
 	if (c == '_') {
-		*can_open = *can_open && !isalnum(char_before);
-		*can_close = *can_close && !isalnum(char_after);
+		*can_open = *can_open && !(before_char < 128 &&
+		                           cmark_isalnum((char)before_char));
+		*can_close = *can_close && !(before_char < 128 &&
+		                             cmark_isalnum((char)after_char));
 	}
 	return numdelims;
 }
@@ -293,10 +326,10 @@ static void remove_delimiter(subject *subj, delimiter *delim)
 }
 
 static void push_delimiter(subject *subj, unsigned char c, bool can_open,
-			   bool can_close, cmark_node *inl_text)
+                           bool can_close, cmark_node *inl_text)
 {
 	delimiter *delim =
-		(delimiter*)malloc(sizeof(delimiter));
+	    (delimiter*)malloc(sizeof(delimiter));
 	if (delim == NULL) {
 		return;
 	}
@@ -310,6 +343,7 @@ static void push_delimiter(subject *subj, unsigned char c, bool can_open,
 		delim->previous->next = delim;
 	}
 	delim->position = subj->pos;
+	delim->active = true;
 	subj->last_delim = delim;
 }
 
@@ -323,7 +357,7 @@ static cmark_node* handle_strong_emph(subject* subj, unsigned char c)
 
 	numdelims = scan_delims(subj, c, &can_open, &can_close);
 
-	inl_text = make_str(chunk_dup(&subj->input, subj->pos - numdelims, numdelims));
+	inl_text = make_str(cmark_chunk_dup(&subj->input, subj->pos - numdelims, numdelims));
 
 	if (can_open || can_close) {
 		push_delimiter(subj, c, can_open, can_close, inl_text);
@@ -384,7 +418,7 @@ S_insert_emph(subject *subj, delimiter *opener, delimiter *closer)
 	// calculate the actual number of characters used from this closer
 	if (closer_num_chars < 3 || opener_num_chars < 3) {
 		use_delims = closer_num_chars <= opener_num_chars ?
-			closer_num_chars : opener_num_chars;
+		             closer_num_chars : opener_num_chars;
 	} else { // closer and opener both have >= 3 characters
 		use_delims = closer_num_chars % 2 == 0 ? 2 : 1;
 	}
@@ -409,13 +443,12 @@ S_insert_emph(subject *subj, delimiter *opener, delimiter *closer)
 	// if opener has 0 characters, remove it and its associated inline
 	if (opener_num_chars == 0) {
 		// replace empty opener inline with emph
-		chunk_free(&(opener_inl->as.literal));
+		cmark_chunk_free(&(opener_inl->as.literal));
 		emph = opener_inl;
 		emph->type = use_delims == 1 ? NODE_EMPH : NODE_STRONG;
 		// remove opener from list
 		remove_delimiter(subj, opener);
-	}
-	else {
+	} else {
 		// create new emph or strong, and splice it in to our inlines
 		// between the opener and closer
 		emph = use_delims == 1 ? make_emph() : make_strong();
@@ -455,14 +488,14 @@ static cmark_node* handle_backslash(subject *subj)
 {
 	advance(subj);
 	unsigned char nextchar = peek_char(subj);
-	if (ispunct(nextchar)) {  // only ascii symbols and newline can be escaped
+	if (cmark_ispunct(nextchar)) {  // only ascii symbols and newline can be escaped
 		advance(subj);
-		return make_str(chunk_dup(&subj->input, subj->pos - 1, 1));
+		return make_str(cmark_chunk_dup(&subj->input, subj->pos - 1, 1));
 	} else if (nextchar == '\n') {
 		advance(subj);
 		return make_linebreak();
 	} else {
-		return make_str(chunk_literal("\\"));
+		return make_str(cmark_chunk_literal("\\"));
 	}
 }
 
@@ -470,31 +503,31 @@ static cmark_node* handle_backslash(subject *subj)
 // Assumes the subject has an '&' character at the current position.
 static cmark_node* handle_entity(subject* subj)
 {
-	strbuf ent = GH_BUF_INIT;
+	cmark_strbuf ent = GH_BUF_INIT;
 	size_t len;
 
 	advance(subj);
 
 	len = houdini_unescape_ent(&ent,
-				   subj->input.data + subj->pos,
-				   subj->input.len - subj->pos
-				   );
+	                           subj->input.data + subj->pos,
+	                           subj->input.len - subj->pos
+	                          );
 
 	if (len == 0)
-		return make_str(chunk_literal("&"));
+		return make_str(cmark_chunk_literal("&"));
 
 	subj->pos += len;
-	return make_str(chunk_buf_detach(&ent));
+	return make_str(cmark_chunk_buf_detach(&ent));
 }
 
 // Like make_str, but parses entities.
 // Returns an inline sequence consisting of str and entity elements.
-static cmark_node *make_str_with_entities(chunk *content)
+static cmark_node *make_str_with_entities(cmark_chunk *content)
 {
-	strbuf unescaped = GH_BUF_INIT;
+	cmark_strbuf unescaped = GH_BUF_INIT;
 
 	if (houdini_unescape_html(&unescaped, content->data, (size_t)content->len)) {
-		return make_str(chunk_buf_detach(&unescaped));
+		return make_str(cmark_chunk_buf_detach(&unescaped));
 	} else {
 		return make_str(*content);
 	}
@@ -502,11 +535,11 @@ static cmark_node *make_str_with_entities(chunk *content)
 
 // Clean a URL: remove surrounding whitespace and surrounding <>,
 // and remove \ that escape punctuation.
-unsigned char *cmark_clean_url(chunk *url)
+unsigned char *cmark_clean_url(cmark_chunk *url)
 {
-	strbuf buf = GH_BUF_INIT;
+	cmark_strbuf buf = GH_BUF_INIT;
 
-	chunk_trim(url);
+	cmark_chunk_trim(url);
 
 	if (url->len == 0)
 		return NULL;
@@ -517,32 +550,32 @@ unsigned char *cmark_clean_url(chunk *url)
 		houdini_unescape_html_f(&buf, url->data, url->len);
 	}
 
-	strbuf_unescape(&buf);
-	return strbuf_detach(&buf);
+	cmark_strbuf_unescape(&buf);
+	return cmark_strbuf_detach(&buf);
 }
 
-unsigned char *cmark_clean_title(chunk *title)
+unsigned char *cmark_clean_title(cmark_chunk *title)
 {
-       strbuf buf = GH_BUF_INIT;
-       unsigned char first, last;
+	cmark_strbuf buf = GH_BUF_INIT;
+	unsigned char first, last;
 
-       if (title->len == 0)
-               return NULL;
+	if (title->len == 0)
+		return NULL;
 
-       first = title->data[0];
-       last = title->data[title->len - 1];
+	first = title->data[0];
+	last = title->data[title->len - 1];
 
-       // remove surrounding quotes if any:
-       if ((first == '\'' && last == '\'') ||
-           (first == '(' && last == ')') ||
-           (first == '"' && last == '"')) {
-               houdini_unescape_html_f(&buf, title->data + 1, title->len - 2);
-       } else {
-               houdini_unescape_html_f(&buf, title->data, title->len);
-       }
+	// remove surrounding quotes if any:
+	if ((first == '\'' && last == '\'') ||
+	    (first == '(' && last == ')') ||
+	    (first == '"' && last == '"')) {
+		houdini_unescape_html_f(&buf, title->data + 1, title->len - 2);
+	} else {
+		houdini_unescape_html_f(&buf, title->data, title->len);
+	}
 
-       strbuf_unescape(&buf);
-       return strbuf_detach(&buf);
+	cmark_strbuf_unescape(&buf);
+	return cmark_strbuf_detach(&buf);
 }
 
 // Parse an autolink or HTML tag.
@@ -550,51 +583,51 @@ unsigned char *cmark_clean_title(chunk *title)
 static cmark_node* handle_pointy_brace(subject* subj)
 {
 	int matchlen = 0;
-	chunk contents;
+	cmark_chunk contents;
 
 	advance(subj);  // advance past first <
 
 	// first try to match a URL autolink
 	matchlen = scan_autolink_uri(&subj->input, subj->pos);
 	if (matchlen > 0) {
-		contents = chunk_dup(&subj->input, subj->pos, matchlen - 1);
+		contents = cmark_chunk_dup(&subj->input, subj->pos, matchlen - 1);
 		subj->pos += matchlen;
 
 		return make_autolink(
-				     make_str_with_entities(&contents),
-				     contents, 0
-				     );
+		           make_str_with_entities(&contents),
+		           contents, 0
+		       );
 	}
 
 	// next try to match an email autolink
 	matchlen = scan_autolink_email(&subj->input, subj->pos);
 	if (matchlen > 0) {
-		contents = chunk_dup(&subj->input, subj->pos, matchlen - 1);
+		contents = cmark_chunk_dup(&subj->input, subj->pos, matchlen - 1);
 		subj->pos += matchlen;
 
 		return make_autolink(
-				     make_str_with_entities(&contents),
-				     contents, 1
-				     );
+		           make_str_with_entities(&contents),
+		           contents, 1
+		       );
 	}
 
 	// finally, try to match an html tag
 	matchlen = scan_html_tag(&subj->input, subj->pos);
 	if (matchlen > 0) {
-		contents = chunk_dup(&subj->input, subj->pos - 1, matchlen + 1);
+		contents = cmark_chunk_dup(&subj->input, subj->pos - 1, matchlen + 1);
 		subj->pos += matchlen;
 		return make_raw_html(contents);
 	}
 
 	// if nothing matches, just return the opening <:
-	return make_str(chunk_literal("<"));
+	return make_str(cmark_chunk_literal("<"));
 }
 
 // Parse a link label.  Returns 1 if successful.
 // Note:  unescaped brackets are not allowed in labels.
 // The label begins with `[` and ends with the first `]` character
 // encountered.  Backticks in labels do not start code spans.
-static int link_label(subject* subj, chunk *raw_label)
+static int link_label(subject* subj, cmark_chunk *raw_label)
 {
 	int startpos = subj->pos;
 	int length = 0;
@@ -611,7 +644,7 @@ static int link_label(subject* subj, chunk *raw_label)
 		if (c == '\\') {
 			advance(subj);
 			length++;
-			if (ispunct(peek_char(subj))) {
+			if (cmark_ispunct(peek_char(subj))) {
 				advance(subj);
 				length++;
 			}
@@ -625,12 +658,12 @@ static int link_label(subject* subj, chunk *raw_label)
 	}
 
 	if (c == ']') { // match found
-		*raw_label = chunk_dup(&subj->input, startpos + 1, subj->pos - (startpos + 1));
+		*raw_label = cmark_chunk_dup(&subj->input, startpos + 1, subj->pos - (startpos + 1));
 		advance(subj);  // advance past ]
 		return 1;
 	}
 
- noMatch:
+noMatch:
 	subj->pos = startpos; // rewind
 	return 0;
 
@@ -645,13 +678,12 @@ static cmark_node* handle_close_bracket(subject* subj, cmark_node *parent)
 	int sps;
 	cmark_reference *ref;
 	bool is_image = false;
-	chunk urlchunk, titlechunk;
+	cmark_chunk url_chunk, title_chunk;
 	unsigned char *url, *title;
 	delimiter *opener;
-	delimiter *tmp_delim;
 	cmark_node *link_text;
 	cmark_node *inl;
-	chunk raw_label;
+	cmark_chunk raw_label;
 	int found_label;
 
 	advance(subj);  // advance past ]
@@ -667,7 +699,13 @@ static cmark_node* handle_close_bracket(subject* subj, cmark_node *parent)
 	}
 
 	if (opener == NULL) {
-		return make_str(chunk_literal("]"));
+		return make_str(cmark_chunk_literal("]"));
+	}
+
+	if (!opener->active) {
+		// take delimiter off stack
+		remove_delimiter(subj, opener);
+		return make_str(cmark_chunk_literal("]"));
 	}
 
 	// If we got here, we matched a potential link/image text.
@@ -688,19 +726,19 @@ static cmark_node* handle_close_bracket(subject* subj, cmark_node *parent)
 
 		// ensure there are spaces btw url and title
 		endtitle = (starttitle == endurl) ? starttitle :
-			starttitle + scan_link_title(&subj->input, starttitle);
+		           starttitle + scan_link_title(&subj->input, starttitle);
 
 		endall = endtitle + scan_spacechars(&subj->input, endtitle);
 
 		if (peek_at(subj, endall) == ')') {
 			subj->pos = endall + 1;
 
-			urlchunk = chunk_dup(&subj->input, starturl, endurl - starturl);
-			titlechunk = chunk_dup(&subj->input, starttitle, endtitle - starttitle);
-			url = cmark_clean_url(&urlchunk);
-			title = cmark_clean_title(&titlechunk);
-			chunk_free(&urlchunk);
-			chunk_free(&titlechunk);
+			url_chunk = cmark_chunk_dup(&subj->input, starturl, endurl - starturl);
+			title_chunk = cmark_chunk_dup(&subj->input, starttitle, endtitle - starttitle);
+			url = cmark_clean_url(&url_chunk);
+			title = cmark_clean_title(&title_chunk);
+			cmark_chunk_free(&url_chunk);
+			cmark_chunk_free(&title_chunk);
 			goto match;
 
 		} else {
@@ -711,12 +749,12 @@ static cmark_node* handle_close_bracket(subject* subj, cmark_node *parent)
 	// Next, look for a following [link label] that matches in refmap.
 	// skip spaces
 	subj->pos = subj->pos + scan_spacechars(&subj->input, subj->pos);
-	raw_label = chunk_literal("");
+	raw_label = cmark_chunk_literal("");
 	found_label = link_label(subj, &raw_label);
 	if (!found_label || raw_label.len == 0) {
-		chunk_free(&raw_label);
-		raw_label = chunk_dup(&subj->input, opener->position,
-				      initial_pos - opener->position - 1);
+		cmark_chunk_free(&raw_label);
+		raw_label = cmark_chunk_dup(&subj->input, opener->position,
+		                            initial_pos - opener->position - 1);
 	}
 
 	if (!found_label) {
@@ -726,7 +764,7 @@ static cmark_node* handle_close_bracket(subject* subj, cmark_node *parent)
 	}
 
 	ref = cmark_reference_lookup(subj->refmap, &raw_label);
-	chunk_free(&raw_label);
+	cmark_chunk_free(&raw_label);
 
 	if (ref != NULL) { // found
 		url = bufdup(ref->url);
@@ -740,12 +778,12 @@ noMatch:
 	// If we fall through to here, it means we didn't match a link:
 	remove_delimiter(subj, opener);  // remove this opener from delimiter list
 	subj->pos = initial_pos;
-	return make_str(chunk_literal("]"));
+	return make_str(cmark_chunk_literal("]"));
 
 match:
 	inl = opener->inl_text;
 	inl->type = is_image ? NODE_IMAGE : NODE_LINK;
-	chunk_free(&inl->as.literal);
+	cmark_chunk_free(&inl->as.literal);
 	inl->first_child = link_text;
 	process_emphasis(subj, opener->previous);
 	inl->as.link.url   = url;
@@ -763,17 +801,20 @@ match:
 	parent->last_child = inl;
 
 	// process_emphasis will remove this delimiter and all later ones.
-	// Now, if we have a link, we also want to remove earlier link
-        // delimiters. (This code can be removed if we decide to allow links
+	// Now, if we have a link, we also want to deactivate earlier link
+	// delimiters. (This code can be removed if we decide to allow links
 	// inside links.)
 	if (!is_image) {
 		opener = subj->last_delim;
 		while (opener != NULL) {
-			tmp_delim = opener->previous;
 			if (opener->delim_char == '[') {
-				remove_delimiter(subj, opener);
+				if (!opener->active) {
+					break;
+				} else {
+					opener->active = false;
+				}
 			}
-			opener = tmp_delim;
+			opener = opener->previous;
 		}
 	}
 
@@ -819,7 +860,8 @@ static int subject_find_special_char(subject *subj)
 		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
 		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
-		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
+		0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+	};
 
 	int n = subj->pos + 1;
 
@@ -837,14 +879,14 @@ static int subject_find_special_char(subject *subj)
 static int parse_inline(subject* subj, cmark_node * parent)
 {
 	cmark_node* new_inl = NULL;
-	chunk contents;
+	cmark_chunk contents;
 	unsigned char c;
 	int endpos;
 	c = peek_char(subj);
 	if (c == 0) {
 		return 0;
 	}
-	switch(c){
+	switch(c) {
 	case '\n':
 		new_inl = handle_newline(subj);
 		break;
@@ -866,7 +908,7 @@ static int parse_inline(subject* subj, cmark_node * parent)
 		break;
 	case '[':
 		advance(subj);
-		new_inl = make_str(chunk_literal("["));
+		new_inl = make_str(cmark_chunk_literal("["));
 		push_delimiter(subj, '[', true, false, new_inl);
 		break;
 	case ']':
@@ -876,20 +918,20 @@ static int parse_inline(subject* subj, cmark_node * parent)
 		advance(subj);
 		if (peek_char(subj) == '[') {
 			advance(subj);
-			new_inl = make_str(chunk_literal("!["));
+			new_inl = make_str(cmark_chunk_literal("!["));
 			push_delimiter(subj, '!', false, true, new_inl);
 		} else {
-			new_inl = make_str(chunk_literal("!"));
+			new_inl = make_str(cmark_chunk_literal("!"));
 		}
 		break;
 	default:
 		endpos = subject_find_special_char(subj);
-		contents = chunk_dup(&subj->input, subj->pos, endpos - subj->pos);
+		contents = cmark_chunk_dup(&subj->input, subj->pos, endpos - subj->pos);
 		subj->pos = endpos;
 
 		// if we're at a newline, strip trailing spaces.
 		if (peek_char(subj) == '\n') {
-			chunk_rtrim(&contents);
+			cmark_chunk_rtrim(&contents);
 		}
 
 		new_inl = make_str(contents);
@@ -918,7 +960,7 @@ static void spnl(subject* subj)
 	bool seen_newline = false;
 	while (peek_char(subj) == ' ' ||
 	       (!seen_newline &&
-		(seen_newline = peek_char(subj) == '\n'))) {
+	        (seen_newline = peek_char(subj) == '\n'))) {
 		advance(subj);
 	}
 }
@@ -927,13 +969,13 @@ static void spnl(subject* subj)
 // Modify refmap if a reference is encountered.
 // Return 0 if no reference found, otherwise position of subject
 // after reference is parsed.
-int cmark_parse_reference_inline(strbuf *input, cmark_reference_map *refmap)
+int cmark_parse_reference_inline(cmark_strbuf *input, cmark_reference_map *refmap)
 {
 	subject subj;
 
-	chunk lab;
-	chunk url;
-	chunk title;
+	cmark_chunk lab;
+	cmark_chunk url;
+	cmark_chunk title;
 
 	int matchlen = 0;
 	int beforetitle;
@@ -955,7 +997,7 @@ int cmark_parse_reference_inline(strbuf *input, cmark_reference_map *refmap)
 	spnl(&subj);
 	matchlen = scan_link_url(&subj.input, subj.pos);
 	if (matchlen) {
-		url = chunk_dup(&subj.input, subj.pos, matchlen);
+		url = cmark_chunk_dup(&subj.input, subj.pos, matchlen);
 		subj.pos += matchlen;
 	} else {
 		return 0;
@@ -966,11 +1008,11 @@ int cmark_parse_reference_inline(strbuf *input, cmark_reference_map *refmap)
 	spnl(&subj);
 	matchlen = scan_link_title(&subj.input, subj.pos);
 	if (matchlen) {
-		title = chunk_dup(&subj.input, subj.pos, matchlen);
+		title = cmark_chunk_dup(&subj.input, subj.pos, matchlen);
 		subj.pos += matchlen;
 	} else {
 		subj.pos = beforetitle;
-		title = chunk_literal("");
+		title = cmark_chunk_literal("");
 	}
 	// parse final spaces and newline:
 	while (peek_char(&subj) == ' ') {

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/iterator.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/iterator.c b/compiler/modules/CommonMark/src/iterator.c
new file mode 100644
index 0000000..4daec2d
--- /dev/null
+++ b/compiler/modules/CommonMark/src/iterator.c
@@ -0,0 +1,140 @@
+#include <assert.h>
+#include <stdlib.h>
+
+#include "config.h"
+#include "node.h"
+#include "cmark.h"
+#include "iterator.h"
+
+static const int S_leaf_mask =
+    (1 << CMARK_NODE_HTML)        |
+    (1 << CMARK_NODE_HRULE)       |
+    (1 << CMARK_NODE_CODE_BLOCK)  |
+    (1 << CMARK_NODE_TEXT)        |
+    (1 << CMARK_NODE_SOFTBREAK)   |
+    (1 << CMARK_NODE_LINEBREAK)   |
+    (1 << CMARK_NODE_CODE)        |
+    (1 << CMARK_NODE_INLINE_HTML);
+
+cmark_iter*
+cmark_iter_new(cmark_node *root)
+{
+	if (root == NULL) {
+		return NULL;
+	}
+	cmark_iter *iter = (cmark_iter*)malloc(sizeof(cmark_iter));
+	if (iter == NULL) {
+		return NULL;
+	}
+	iter->root         = root;
+	iter->cur.ev_type  = CMARK_EVENT_NONE;
+	iter->cur.node     = NULL;
+	iter->next.ev_type = CMARK_EVENT_ENTER;
+	iter->next.node    = root;
+	return iter;
+}
+
+void
+cmark_iter_free(cmark_iter *iter)
+{
+	free(iter);
+}
+
+static bool
+S_is_leaf(cmark_node *node)
+{
+	return (1 << node->type) & S_leaf_mask;
+}
+
+cmark_event_type
+cmark_iter_next(cmark_iter *iter)
+{
+	cmark_event_type  ev_type = iter->next.ev_type;
+	cmark_node       *node    = iter->next.node;
+
+	iter->cur.ev_type = ev_type;
+	iter->cur.node    = node;
+
+	if (ev_type == CMARK_EVENT_DONE) {
+		return ev_type;
+	}
+
+	/* roll forward to next item, setting both fields */
+	if (ev_type == CMARK_EVENT_ENTER && !S_is_leaf(node)) {
+		if (node->first_child == NULL) {
+			/* stay on this node but exit */
+			iter->next.ev_type = CMARK_EVENT_EXIT;
+		} else {
+			iter->next.ev_type = CMARK_EVENT_ENTER;
+			iter->next.node    = node->first_child;
+		}
+	} else if (node == iter->root) {
+		/* don't move past root */
+		iter->next.ev_type = CMARK_EVENT_DONE;
+		iter->next.node    = NULL;
+	} else if (node->next) {
+		iter->next.ev_type = CMARK_EVENT_ENTER;
+		iter->next.node    = node->next;
+	} else if (node->parent) {
+		iter->next.ev_type = CMARK_EVENT_EXIT;
+		iter->next.node    = node->parent;
+	} else {
+		assert(false);
+		iter->next.ev_type = CMARK_EVENT_DONE;
+		iter->next.node    = NULL;
+	}
+
+	return ev_type;
+}
+
+void
+cmark_iter_reset(cmark_iter *iter, cmark_node *current,
+                 cmark_event_type event_type)
+{
+	iter->next.ev_type = event_type;
+	iter->next.node    = current;
+	cmark_iter_next(iter);
+}
+
+cmark_node*
+cmark_iter_get_node(cmark_iter *iter)
+{
+	return iter->cur.node;
+}
+
+cmark_event_type
+cmark_iter_get_event_type(cmark_iter *iter)
+{
+	return iter->cur.ev_type;
+}
+
+
+void cmark_consolidate_text_nodes(cmark_node *root)
+{
+	cmark_iter *iter = cmark_iter_new(root);
+	cmark_strbuf buf = GH_BUF_INIT;
+	cmark_event_type ev_type;
+	cmark_node *cur, *tmp, *next;
+
+	while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
+		cur = cmark_iter_get_node(iter);
+		if (ev_type == CMARK_EVENT_ENTER &&
+		    cur->type == CMARK_NODE_TEXT &&
+		    cur->next &&
+		    cur->next->type == CMARK_NODE_TEXT) {
+			cmark_strbuf_clear(&buf);
+			cmark_strbuf_puts(&buf, cmark_node_get_literal(cur));
+			tmp = cur->next;
+			while (tmp && tmp->type == CMARK_NODE_TEXT) {
+				cmark_iter_get_node(iter); // advance pointer
+				cmark_strbuf_puts(&buf, cmark_node_get_literal(tmp));
+				next = tmp->next;
+				cmark_node_free(tmp);
+				tmp = next;
+			}
+			cmark_node_set_literal(cur, (char *)cmark_strbuf_detach(&buf));
+		}
+	}
+
+	cmark_iter_free(iter);
+}

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/iterator.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/iterator.h b/compiler/modules/CommonMark/src/iterator.h
new file mode 100644
index 0000000..027b10b
--- /dev/null
+++ b/compiler/modules/CommonMark/src/iterator.h
@@ -0,0 +1,25 @@
+#ifndef CMARK_ITERATOR_H
+#define CMARK_ITERATOR_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include "cmark.h"
+
+typedef struct {
+	cmark_event_type  ev_type;
+	cmark_node       *node;
+} cmark_iter_state;
+
+struct cmark_iter {
+	cmark_node       *root;
+	cmark_iter_state  cur;
+	cmark_iter_state  next;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/man.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/man.c b/compiler/modules/CommonMark/src/man.c
new file mode 100644
index 0000000..2c8a3a5
--- /dev/null
+++ b/compiler/modules/CommonMark/src/man.c
@@ -0,0 +1,249 @@
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <assert.h>
+
+#include "config.h"
+#include "cmark.h"
+#include "node.h"
+#include "buffer.h"
+
+// Functions to convert cmark_nodes to groff man strings.
+
+static void escape_man(cmark_strbuf *dest, const unsigned char *source, int length)
+{
+	int i;
+	unsigned char c;
+
+	for (i = 0; i < length; i++) {
+		c = source[i];
+		if (c == '.' && i == 0) {
+			cmark_strbuf_puts(dest, "\\&.");
+		} else if (c == '\'' && i == 0) {
+			cmark_strbuf_puts(dest, "\\&'");
+		} else if (c == '-') {
+			cmark_strbuf_puts(dest, "\\-");
+		} else if (c == '\\') {
+			cmark_strbuf_puts(dest, "\\e");
+		} else {
+			cmark_strbuf_putc(dest, source[i]);
+		}
+	}
+}
+
+static inline void cr(cmark_strbuf *man)
+{
+	if (man->size && man->ptr[man->size - 1] != '\n')
+		cmark_strbuf_putc(man, '\n');
+}
+
+struct render_state {
+	cmark_strbuf* man;
+	cmark_node *plain;
+};
+
+static int
+S_render_node(cmark_node *node, cmark_event_type ev_type,
+              struct render_state *state)
+{
+	cmark_node *tmp;
+	cmark_strbuf *man = state->man;
+	int list_number;
+	bool entering = (ev_type == CMARK_EVENT_ENTER);
+
+	if (state->plain == node) { // back at original node
+		state->plain = NULL;
+	}
+
+	if (state->plain != NULL) {
+		switch(node->type) {
+		case CMARK_NODE_TEXT:
+		case CMARK_NODE_CODE:
+			escape_man(man, node->as.literal.data,
+			           node->as.literal.len);
+			break;
+
+		case CMARK_NODE_LINEBREAK:
+		case CMARK_NODE_SOFTBREAK:
+			cmark_strbuf_putc(man, ' ');
+			break;
+
+		default:
+			break;
+		}
+		return 1;
+	}
+
+	switch (node->type) {
+	case CMARK_NODE_DOCUMENT:
+		break;
+
+	case CMARK_NODE_BLOCK_QUOTE:
+		if (entering) {
+			cr(man);
+			cmark_strbuf_puts(man, ".RS");
+			cr(man);
+		} else {
+			cr(man);
+			cmark_strbuf_puts(man, ".RE");
+			cr(man);
+		}
+		break;
+
+	case CMARK_NODE_LIST:
+		break;
+
+	case CMARK_NODE_ITEM:
+		if (entering) {
+			cr(man);
+			cmark_strbuf_puts(man, ".IP ");
+			if (cmark_node_get_list_type(node->parent) ==
+			    CMARK_BULLET_LIST) {
+				cmark_strbuf_puts(man, "\\[bu] 2");
+			} else {
+				list_number = cmark_node_get_list_start(node->parent);
+				tmp = node;
+				while (tmp->prev) {
+					tmp = tmp->prev;
+					list_number += 1;
+				}
+				cmark_strbuf_printf(man, "\"%d.\" 4", list_number);
+			}
+			cr(man);
+		} else {
+			cr(man);
+		}
+		break;
+
+	case CMARK_NODE_HEADER:
+		if (entering) {
+			cr(man);
+			cmark_strbuf_puts(man,
+			                  cmark_node_get_header_level(node) == 1 ?
+			                  ".SH" : ".SS");
+			cr(man);
+		} else {
+			cr(man);
+		}
+		break;
+
+	case CMARK_NODE_CODE_BLOCK:
+		cr(man);
+		cmark_strbuf_puts(man, ".IP\n.nf\n\\f[C]\n");
+		escape_man(man, node->as.code.literal.data,
+		           node->as.code.literal.len);
+		cr(man);
+		cmark_strbuf_puts(man, "\\f[]\n.fi");
+		cr(man);
+		break;
+
+	case CMARK_NODE_HTML:
+		break;
+
+	case CMARK_NODE_HRULE:
+		cr(man);
+		cmark_strbuf_puts(man, ".PP\n  *  *  *  *  *");
+		cr(man);
+		break;
+
+	case CMARK_NODE_PARAGRAPH:
+		if (entering) {
+			// no blank line if first paragraph in list:
+			if (node->parent &&
+			    node->parent->type == CMARK_NODE_ITEM &&
+			    node->prev == NULL) {
+				// no blank line or .PP
+			} else {
+				cr(man);
+				cmark_strbuf_puts(man, ".PP\n");
+			}
+		} else {
+			cr(man);
+		}
+		break;
+
+	case CMARK_NODE_TEXT:
+		escape_man(man, node->as.literal.data,
+		           node->as.literal.len);
+		break;
+
+	case CMARK_NODE_LINEBREAK:
+		cmark_strbuf_puts(man, ".PD 0\n.P\n.PD");
+		cr(man);
+		break;
+
+	case CMARK_NODE_SOFTBREAK:
+		cmark_strbuf_putc(man, '\n');
+		break;
+
+	case CMARK_NODE_CODE:
+		cmark_strbuf_puts(man, "\\f[C]");
+		escape_man(man, node->as.literal.data, node->as.literal.len);
+		cmark_strbuf_puts(man, "\\f[]");
+		break;
+
+	case CMARK_NODE_INLINE_HTML:
+		break;
+
+	case CMARK_NODE_STRONG:
+		if (entering) {
+			cmark_strbuf_puts(man, "\\f[B]");
+		} else {
+			cmark_strbuf_puts(man, "\\f[]");
+		}
+		break;
+
+	case CMARK_NODE_EMPH:
+		if (entering) {
+			cmark_strbuf_puts(man, "\\f[I]");
+		} else {
+			cmark_strbuf_puts(man, "\\f[]");
+		}
+		break;
+
+	case CMARK_NODE_LINK:
+		if (!entering) {
+			cmark_strbuf_printf(man, " (%s)",
+			                    cmark_node_get_url(node));
+		}
+		break;
+
+	case CMARK_NODE_IMAGE:
+		if (entering) {
+			cmark_strbuf_puts(man, "[IMAGE: ");
+			state->plain = node;
+		} else {
+			cmark_strbuf_puts(man, "]");
+		}
+		break;
+
+	default:
+		assert(false);
+		break;
+	}
+
+	// cmark_strbuf_putc(man, 'x');
+	return 1;
+}
+
+char *cmark_render_man(cmark_node *root, long options)
+{
+	char *result;
+	cmark_strbuf man = GH_BUF_INIT;
+	struct render_state state = { &man, NULL };
+	cmark_node *cur;
+	cmark_event_type ev_type;
+	cmark_iter *iter = cmark_iter_new(root);
+
+	if (options == 0) options = 0; // avoid warning about unused parameters
+
+	while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
+		cur = cmark_iter_get_node(iter);
+		S_render_node(cur, ev_type, &state);
+	}
+	result = (char *)cmark_strbuf_detach(&man);
+
+	cmark_iter_free(iter);
+	cmark_strbuf_free(&man);
+	return result;
+}

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/node.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/node.c b/compiler/modules/CommonMark/src/node.c
index 243c3e6..3785a27 100644
--- a/compiler/modules/CommonMark/src/node.c
+++ b/compiler/modules/CommonMark/src/node.c
@@ -8,7 +8,8 @@ static void
 S_node_unlink(cmark_node *node);
 
 cmark_node*
-cmark_node_new(cmark_node_type type) {
+cmark_node_new(cmark_node_type type)
+{
 	cmark_node *node = (cmark_node *)calloc(1, sizeof(*node));
 	node->type = type;
 
@@ -38,14 +39,16 @@ void S_free_nodes(cmark_node *e)
 {
 	cmark_node *next;
 	while (e != NULL) {
-		strbuf_free(&e->string_content);
-		switch (e->type){
+		cmark_strbuf_free(&e->string_content);
+		switch (e->type) {
 		case NODE_CODE_BLOCK:
-			strbuf_free(&e->as.code.info);
+			cmark_chunk_free(&e->as.code.info);
+			cmark_chunk_free(&e->as.code.literal);
 			break;
 		case NODE_TEXT:
 		case NODE_INLINE_HTML:
-		case NODE_INLINE_CODE:
+		case NODE_CODE:
+		case NODE_HTML:
 			cmark_chunk_free(&e->as.literal);
 			break;
 		case NODE_LINK:
@@ -68,7 +71,8 @@ void S_free_nodes(cmark_node *e)
 }
 
 void
-cmark_node_free(cmark_node *node) {
+cmark_node_free(cmark_node *node)
+{
 	S_node_unlink(node);
 	node->next = NULL;
 	S_free_nodes(node);
@@ -84,34 +88,52 @@ cmark_node_get_type(cmark_node *node)
 	}
 }
 
-static const char*
-S_type_string(cmark_node *node)
+const char*
+cmark_node_get_type_string(cmark_node *node)
 {
 	if (node == NULL) {
 		return "NONE";
 	}
 
 	switch (node->type) {
-	case CMARK_NODE_NONE:          return "NONE";
-	case CMARK_NODE_DOCUMENT:      return "DOCUMENT";
-	case CMARK_NODE_BLOCK_QUOTE:   return "BLOCK_QUOTE";
-	case CMARK_NODE_LIST:          return "LIST";
-	case CMARK_NODE_LIST_ITEM:     return "LIST_ITEM";
-	case CMARK_NODE_CODE_BLOCK:    return "CODE_BLOCK";
-	case CMARK_NODE_HTML:          return "HTML";
-	case CMARK_NODE_PARAGRAPH:     return "PARAGRAPH";
-	case CMARK_NODE_HEADER:	       return "HEADER";
-	case CMARK_NODE_HRULE:         return "HRULE";
-	case CMARK_NODE_REFERENCE_DEF: return "REFERENCE_DEF";
-	case CMARK_NODE_TEXT:          return "TEXT";
-	case CMARK_NODE_SOFTBREAK:     return "SOFTBREAK";
-	case CMARK_NODE_LINEBREAK:     return "LINEBREAK";
-	case CMARK_NODE_INLINE_CODE:   return "INLINE_CODE";
-	case CMARK_NODE_INLINE_HTML:   return "INLINE_HTML";
-	case CMARK_NODE_EMPH:          return "EMPH";
-	case CMARK_NODE_STRONG:        return "STRONG";
-	case CMARK_NODE_LINK:          return "LINK";
-	case CMARK_NODE_IMAGE:         return "IMAGE";
+	case CMARK_NODE_NONE:
+		return "none";
+	case CMARK_NODE_DOCUMENT:
+		return "document";
+	case CMARK_NODE_BLOCK_QUOTE:
+		return "block_quote";
+	case CMARK_NODE_LIST:
+		return "list";
+	case CMARK_NODE_ITEM:
+		return "item";
+	case CMARK_NODE_CODE_BLOCK:
+		return "code_block";
+	case CMARK_NODE_HTML:
+		return "html";
+	case CMARK_NODE_PARAGRAPH:
+		return "paragraph";
+	case CMARK_NODE_HEADER:
+		return "header";
+	case CMARK_NODE_HRULE:
+		return "hrule";
+	case CMARK_NODE_TEXT:
+		return "text";
+	case CMARK_NODE_SOFTBREAK:
+		return "softbreak";
+	case CMARK_NODE_LINEBREAK:
+		return "linebreak";
+	case CMARK_NODE_CODE:
+		return "code";
+	case CMARK_NODE_INLINE_HTML:
+		return "inline_html";
+	case CMARK_NODE_EMPH:
+		return "emph";
+	case CMARK_NODE_STRONG:
+		return "strong";
+	case CMARK_NODE_LINK:
+		return "link";
+	case CMARK_NODE_IMAGE:
+		return "image";
 	}
 
 	return "<unknown>";
@@ -168,7 +190,8 @@ cmark_node_last_child(cmark_node *node)
 }
 
 static char*
-S_strdup(const char *str) {
+S_strdup(const char *str)
+{
 	size_t size = strlen(str) + 1;
 	char *dup = (char *)malloc(size);
 	memcpy(dup, str, size);
@@ -176,21 +199,22 @@ S_strdup(const char *str) {
 }
 
 const char*
-cmark_node_get_string_content(cmark_node *node) {
+cmark_node_get_literal(cmark_node *node)
+{
 	if (node == NULL) {
 		return NULL;
 	}
 
 	switch (node->type) {
-	case NODE_CODE_BLOCK:
 	case NODE_HTML:
-		return cmark_strbuf_cstr(&node->string_content);
-
 	case NODE_TEXT:
 	case NODE_INLINE_HTML:
-	case NODE_INLINE_CODE:
+	case NODE_CODE:
 		return cmark_chunk_to_cstr(&node->as.literal);
 
+	case NODE_CODE_BLOCK:
+		return cmark_chunk_to_cstr(&node->as.code.literal);
+
 	default:
 		break;
 	}
@@ -199,23 +223,24 @@ cmark_node_get_string_content(cmark_node *node) {
 }
 
 int
-cmark_node_set_string_content(cmark_node *node, const char *content) {
+cmark_node_set_literal(cmark_node *node, const char *content)
+{
 	if (node == NULL) {
 		return 0;
 	}
 
 	switch (node->type) {
-	case NODE_CODE_BLOCK:
 	case NODE_HTML:
-		cmark_strbuf_sets(&node->string_content, content);
-		return 1;
-
 	case NODE_TEXT:
 	case NODE_INLINE_HTML:
-	case NODE_INLINE_CODE:
+	case NODE_CODE:
 		cmark_chunk_set_cstr(&node->as.literal, content);
 		return 1;
 
+	case NODE_CODE_BLOCK:
+		cmark_chunk_set_cstr(&node->as.code.literal, content);
+		return 1;
+
 	default:
 		break;
 	}
@@ -224,7 +249,8 @@ cmark_node_set_string_content(cmark_node *node, const char *content) {
 }
 
 int
-cmark_node_get_header_level(cmark_node *node) {
+cmark_node_get_header_level(cmark_node *node)
+{
 	if (node == NULL) {
 		return 0;
 	}
@@ -241,7 +267,8 @@ cmark_node_get_header_level(cmark_node *node) {
 }
 
 int
-cmark_node_set_header_level(cmark_node *node, int level) {
+cmark_node_set_header_level(cmark_node *node, int level)
+{
 	if (node == NULL || level < 1 || level > 6) {
 		return 0;
 	}
@@ -259,21 +286,22 @@ cmark_node_set_header_level(cmark_node *node, int level) {
 }
 
 cmark_list_type
-cmark_node_get_list_type(cmark_node *node) {
+cmark_node_get_list_type(cmark_node *node)
+{
 	if (node == NULL) {
 		return CMARK_NO_LIST;
 	}
 
 	if (node->type == CMARK_NODE_LIST) {
 		return node->as.list.list_type;
-	}
-	else {
+	} else {
 		return CMARK_NO_LIST;
 	}
 }
 
 int
-cmark_node_set_list_type(cmark_node *node, cmark_list_type type) {
+cmark_node_set_list_type(cmark_node *node, cmark_list_type type)
+{
 	if (!(type == CMARK_BULLET_LIST || type == CMARK_ORDERED_LIST)) {
 		return 0;
 	}
@@ -285,28 +313,61 @@ cmark_node_set_list_type(cmark_node *node, cmark_list_type type) {
 	if (node->type == CMARK_NODE_LIST) {
 		node->as.list.list_type = type;
 		return 1;
+	} else {
+		return 0;
+	}
+}
+
+cmark_delim_type
+cmark_node_get_list_delim(cmark_node *node)
+{
+	if (node == NULL) {
+		return CMARK_NO_DELIM;
+	}
+
+	if (node->type == CMARK_NODE_LIST) {
+		return node->as.list.delimiter;
+	} else {
+		return CMARK_NO_DELIM;
 	}
-	else {
+}
+
+int
+cmark_node_set_list_delim(cmark_node *node, cmark_delim_type delim)
+{
+	if (!(delim == CMARK_PERIOD_DELIM || delim == CMARK_PAREN_DELIM)) {
+		return 0;
+	}
+
+	if (node == NULL) {
+		return 0;
+	}
+
+	if (node->type == CMARK_NODE_LIST) {
+		node->as.list.delimiter = delim;
+		return 1;
+	} else {
 		return 0;
 	}
 }
 
 int
-cmark_node_get_list_start(cmark_node *node) {
+cmark_node_get_list_start(cmark_node *node)
+{
 	if (node == NULL) {
 		return 0;
 	}
 
 	if (node->type == CMARK_NODE_LIST) {
 		return node->as.list.start;
-	}
-	else {
+	} else {
 		return 0;
 	}
 }
 
 int
-cmark_node_set_list_start(cmark_node *node, int start) {
+cmark_node_set_list_start(cmark_node *node, int start)
+{
 	if (node == NULL || start < 0) {
 		return 0;
 	}
@@ -314,28 +375,28 @@ cmark_node_set_list_start(cmark_node *node, int start) {
 	if (node->type == CMARK_NODE_LIST) {
 		node->as.list.start = start;
 		return 1;
-	}
-	else {
+	} else {
 		return 0;
 	}
 }
 
 int
-cmark_node_get_list_tight(cmark_node *node) {
+cmark_node_get_list_tight(cmark_node *node)
+{
 	if (node == NULL) {
 		return 0;
 	}
 
 	if (node->type == CMARK_NODE_LIST) {
 		return node->as.list.tight;
-	}
-	else {
+	} else {
 		return 0;
 	}
 }
 
 int
-cmark_node_set_list_tight(cmark_node *node, int tight) {
+cmark_node_set_list_tight(cmark_node *node, int tight)
+{
 	if (node == NULL) {
 		return 0;
 	}
@@ -343,43 +404,43 @@ cmark_node_set_list_tight(cmark_node *node, int tight) {
 	if (node->type == CMARK_NODE_LIST) {
 		node->as.list.tight = tight;
 		return 1;
-	}
-	else {
+	} else {
 		return 0;
 	}
 }
 
 const char*
-cmark_node_get_fence_info(cmark_node *node) {
+cmark_node_get_fence_info(cmark_node *node)
+{
 	if (node == NULL) {
 		return NULL;
 	}
 
 	if (node->type == NODE_CODE_BLOCK) {
-		return cmark_strbuf_cstr(&node->as.code.info);
-	}
-	else {
+		return cmark_chunk_to_cstr(&node->as.code.info);
+	} else {
 		return NULL;
 	}
 }
 
 int
-cmark_node_set_fence_info(cmark_node *node, const char *info) {
+cmark_node_set_fence_info(cmark_node *node, const char *info)
+{
 	if (node == NULL) {
 		return 0;
 	}
 
 	if (node->type == NODE_CODE_BLOCK) {
-		cmark_strbuf_sets(&node->as.code.info, info);
+		cmark_chunk_set_cstr(&node->as.code.info, info);
 		return 1;
-	}
-	else {
+	} else {
 		return 0;
 	}
 }
 
 const char*
-cmark_node_get_url(cmark_node *node) {
+cmark_node_get_url(cmark_node *node)
+{
 	if (node == NULL) {
 		return NULL;
 	}
@@ -396,7 +457,8 @@ cmark_node_get_url(cmark_node *node) {
 }
 
 int
-cmark_node_set_url(cmark_node *node, const char *url) {
+cmark_node_set_url(cmark_node *node, const char *url)
+{
 	if (node == NULL) {
 		return 0;
 	}
@@ -415,7 +477,8 @@ cmark_node_set_url(cmark_node *node, const char *url) {
 }
 
 const char*
-cmark_node_get_title(cmark_node *node) {
+cmark_node_get_title(cmark_node *node)
+{
 	if (node == NULL) {
 		return NULL;
 	}
@@ -432,7 +495,8 @@ cmark_node_get_title(cmark_node *node) {
 }
 
 int
-cmark_node_set_title(cmark_node *node, const char *title) {
+cmark_node_set_title(cmark_node *node, const char *title)
+{
 	if (node == NULL) {
 		return 0;
 	}
@@ -451,7 +515,8 @@ cmark_node_set_title(cmark_node *node, const char *title) {
 }
 
 int
-cmark_node_get_start_line(cmark_node *node) {
+cmark_node_get_start_line(cmark_node *node)
+{
 	if (node == NULL) {
 		return 0;
 	}
@@ -459,7 +524,8 @@ cmark_node_get_start_line(cmark_node *node) {
 }
 
 int
-cmark_node_get_start_column(cmark_node *node) {
+cmark_node_get_start_column(cmark_node *node)
+{
 	if (node == NULL) {
 		return 0;
 	}
@@ -467,15 +533,26 @@ cmark_node_get_start_column(cmark_node *node) {
 }
 
 int
-cmark_node_get_end_line(cmark_node *node) {
+cmark_node_get_end_line(cmark_node *node)
+{
 	if (node == NULL) {
 		return 0;
 	}
 	return node->end_line;
 }
 
+int
+cmark_node_get_end_column(cmark_node *node)
+{
+	if (node == NULL) {
+		return 0;
+	}
+	return node->end_column;
+}
+
 static inline bool
-S_is_block(cmark_node *node) {
+S_is_block(cmark_node *node)
+{
 	if (node == NULL) {
 		return false;
 	}
@@ -484,7 +561,8 @@ S_is_block(cmark_node *node) {
 }
 
 static inline bool
-S_is_inline(cmark_node *node) {
+S_is_inline(cmark_node *node)
+{
 	if (node == NULL) {
 		return false;
 	}
@@ -517,12 +595,12 @@ S_can_contain(cmark_node *node, cmark_node *child)
 	switch (node->type) {
 	case CMARK_NODE_DOCUMENT:
 	case CMARK_NODE_BLOCK_QUOTE:
-	case CMARK_NODE_LIST_ITEM:
+	case CMARK_NODE_ITEM:
 		return S_is_block(child)
-		       && child->type != CMARK_NODE_LIST_ITEM;
+		       && child->type != CMARK_NODE_ITEM;
 
 	case CMARK_NODE_LIST:
-		return child->type == CMARK_NODE_LIST_ITEM;
+		return child->type == CMARK_NODE_ITEM;
 
 	case CMARK_NODE_PARAGRAPH:
 	case CMARK_NODE_HEADER:
@@ -567,7 +645,8 @@ S_node_unlink(cmark_node *node)
 }
 
 void
-cmark_node_unlink(cmark_node *node) {
+cmark_node_unlink(cmark_node *node)
+{
 	S_node_unlink(node);
 
 	node->next   = NULL;
@@ -664,8 +743,7 @@ cmark_node_prepend_child(cmark_node *node, cmark_node *child)
 
 	if (old_first_child) {
 		old_first_child->prev = child;
-	}
-	else {
+	} else {
 		// Also set last_child if node previously had no children.
 		node->last_child = child;
 	}
@@ -691,8 +769,7 @@ cmark_node_append_child(cmark_node *node, cmark_node *child)
 
 	if (old_last_child) {
 		old_last_child->next = child;
-	}
-	else {
+	} else {
 		// Also set first_child if node previously had no children.
 		node->first_child = child;
 	}
@@ -707,7 +784,8 @@ S_print_error(FILE *out, cmark_node *node, const char *elem)
 		return;
 	}
 	fprintf(out, "Invalid '%s' in node type %s at %d:%d\n", elem,
-		S_type_string(node), node->start_line, node->start_column);
+	        cmark_node_get_type_string(node), node->start_line,
+	        node->start_column);
 }
 
 int
@@ -737,7 +815,7 @@ cmark_node_check(cmark_node *node, FILE *out)
 			continue;
 		}
 
-	next_sibling:
+next_sibling:
 		if (cur == node) {
 			break;
 		}

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/node.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/node.h b/compiler/modules/CommonMark/src/node.h
index b842ed8..c0c43d3 100644
--- a/compiler/modules/CommonMark/src/node.h
+++ b/compiler/modules/CommonMark/src/node.h
@@ -26,7 +26,8 @@ typedef struct {
 	int               fence_length;
 	int               fence_offset;
 	unsigned char     fence_char;
-	cmark_strbuf      info;
+	cmark_chunk       info;
+	cmark_chunk       literal;
 } cmark_code;
 
 typedef struct {
@@ -51,6 +52,7 @@ struct cmark_node {
 	int start_line;
 	int start_column;
 	int end_line;
+	int end_column;
 	bool open;
 	bool last_line_blank;
 
@@ -73,4 +75,3 @@ cmark_node_check(cmark_node *node, FILE *out);
 #endif
 
 #endif
-

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/parser.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/parser.h b/compiler/modules/CommonMark/src/parser.h
index 9d65b67..3c8def9 100644
--- a/compiler/modules/CommonMark/src/parser.h
+++ b/compiler/modules/CommonMark/src/parser.h
@@ -17,6 +17,7 @@ struct cmark_parser {
 	struct cmark_node* current;
 	int line_number;
 	cmark_strbuf *curline;
+	int last_line_length;
 	cmark_strbuf *linebuf;
 };
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/print.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/print.c b/compiler/modules/CommonMark/src/print.c
deleted file mode 100644
index d2dfe8c..0000000
--- a/compiler/modules/CommonMark/src/print.c
+++ /dev/null
@@ -1,169 +0,0 @@
-#include <stdlib.h>
-#include <stdio.h>
-#include <string.h>
-#include "cmark.h"
-#include "buffer.h"
-#include "node.h"
-
-#define INDENT 2
-
-static void print_str(strbuf* buffer, const unsigned char *s, int len)
-{
-	int i;
-
-	if (len < 0)
-		len = strlen((char *)s);
-
-	strbuf_putc(buffer, '"');
-	for (i = 0; i < len; ++i) {
-		unsigned char c = s[i];
-
-		switch (c) {
-		case '\n':
-			strbuf_printf(buffer, "\\n");
-			break;
-		case '"':
-			strbuf_printf(buffer, "\\\"");
-			break;
-		case '\\':
-			strbuf_printf(buffer, "\\\\");
-			break;
-		default:
-			strbuf_putc(buffer, (int)c);
-		}
-	}
-	strbuf_putc(buffer, '"');
-}
-
-// Prettyprint an inline list, for debugging.
-static void render_nodes(strbuf* buffer, cmark_node* node, int indent)
-{
-	int i;
-	cmark_list *data;
-
-	while(node != NULL) {
-		for (i=0; i < indent; i++) {
-			strbuf_putc(buffer, ' ');
-		}
-		switch(node->type) {
-		case NODE_DOCUMENT:
-			break;
-		case NODE_BLOCK_QUOTE:
-			strbuf_printf(buffer, "block_quote\n");
-			break;
-		case NODE_LIST_ITEM:
-			strbuf_printf(buffer, "list_item\n");
-			break;
-		case NODE_LIST:
-			data = &(node->as.list);
-			if (data->list_type == CMARK_ORDERED_LIST) {
-				strbuf_printf(buffer, "list (type=ordered tight=%s start=%d delim=%s)\n",
-				       (data->tight ? "true" : "false"),
-				       data->start,
-				       (data->delimiter == CMARK_PAREN_DELIM ? "parens" : "period"));
-			} else {
-				strbuf_printf(buffer, "list (type=bullet tight=%s bullet_char=%c)\n",
-				       (data->tight ? "true" : "false"),
-				       data->bullet_char);
-			}
-			break;
-		case NODE_HEADER:
-			strbuf_printf(buffer, "header (level=%d)\n", node->as.header.level);
-			break;
-		case NODE_PARAGRAPH:
-			strbuf_printf(buffer, "paragraph\n");
-			break;
-		case NODE_HRULE:
-			strbuf_printf(buffer, "hrule\n");
-			break;
-		case NODE_CODE_BLOCK:
-			strbuf_printf(buffer, "code_block info=");
-			print_str(buffer, node->as.code.info.ptr, -1);
-			strbuf_putc(buffer, ' ');
-			print_str(buffer, node->string_content.ptr, -1);
-			strbuf_putc(buffer, '\n');
-			break;
-		case NODE_HTML:
-			strbuf_printf(buffer, "html ");
-			print_str(buffer, node->string_content.ptr, -1);
-			strbuf_putc(buffer, '\n');
-			break;
-		case NODE_REFERENCE_DEF:
-			// skip
-			// strbuf_printf(buffer, "reference_def\n");
-			break;
-		case NODE_TEXT:
-			strbuf_printf(buffer, "text ");
-			print_str(buffer, node->as.literal.data, node->as.literal.len);
-			strbuf_putc(buffer, '\n');
-			break;
-		case NODE_LINEBREAK:
-			strbuf_printf(buffer, "linebreak\n");
-			break;
-		case NODE_SOFTBREAK:
-			strbuf_printf(buffer, "softbreak\n");
-			break;
-		case NODE_INLINE_CODE:
-			strbuf_printf(buffer, "code ");
-			print_str(buffer, node->as.literal.data, node->as.literal.len);
-			strbuf_putc(buffer, '\n');
-			break;
-		case NODE_INLINE_HTML:
-			strbuf_printf(buffer, "inline_html ");
-			print_str(buffer, node->as.literal.data, node->as.literal.len);
-			strbuf_putc(buffer, '\n');
-			break;
-		case NODE_LINK:
-		case NODE_IMAGE:
-			strbuf_printf(buffer, "%s url=", node->type == NODE_LINK ? "link" : "image");
-
-			if (node->as.link.url)
-				print_str(buffer, node->as.link.url, -1);
-
-			if (node->as.link.title) {
-				strbuf_printf(buffer, " title=");
-				print_str(buffer, node->as.link.title, -1);
-			}
-			strbuf_putc(buffer, '\n');
-			break;
-		case NODE_STRONG:
-			strbuf_printf(buffer, "strong\n");
-			break;
-		case NODE_EMPH:
-			strbuf_printf(buffer, "emph\n");
-			break;
-		default:
-			break;
-		}
-		if (node->first_child) { // render children if any
-			indent += INDENT;
-			node = node->first_child;
-		} else if (node->next) { // otherwise render next sibling
-			node = node->next;
-		} else {
-			node = node->parent;  // back up to parent
-			while (node) {
-				indent -= INDENT;
-				if (node->next) {
-					node = node->next;
-					break;
-				} else {
-					node = node->parent;
-				}
-				if (!node) {
-					break;
-				}
-			}
-		}
-	}
-}
-
-char *cmark_render_ast(cmark_node *root)
-{
-	char* result;
-	strbuf buffer = GH_BUF_INIT;
-	render_nodes(&buffer, root, -2);
-	result = (char *)strbuf_detach(&buffer);
-	strbuf_free(&buffer);
-	return result;
-}

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/references.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/references.c b/compiler/modules/CommonMark/src/references.c
index 2b1d0a7..37bf4cb 100644
--- a/compiler/modules/CommonMark/src/references.c
+++ b/compiler/modules/CommonMark/src/references.c
@@ -30,9 +30,9 @@ static void reference_free(cmark_reference *ref)
 // remove leading/trailing whitespace, case fold
 // Return NULL if the reference name is actually empty (i.e. composed
 // solely from whitespace)
-static unsigned char *normalize_reference(chunk *ref)
+static unsigned char *normalize_reference(cmark_chunk *ref)
 {
-	strbuf normalized = GH_BUF_INIT;
+	cmark_strbuf normalized = GH_BUF_INIT;
 	unsigned char *result;
 
 	if(ref == NULL)
@@ -42,10 +42,10 @@ static unsigned char *normalize_reference(chunk *ref)
 		return NULL;
 
 	utf8proc_case_fold(&normalized, ref->data, ref->len);
-	strbuf_trim(&normalized);
-	strbuf_normalize_whitespace(&normalized);
+	cmark_strbuf_trim(&normalized);
+	cmark_strbuf_normalize_whitespace(&normalized);
 
-	result = strbuf_detach(&normalized);
+	result = cmark_strbuf_detach(&normalized);
 	assert(result);
 
 	if (result[0] == '\0') {
@@ -73,8 +73,8 @@ static void add_reference(cmark_reference_map *map, cmark_reference* ref)
 	map->table[ref->hash % REFMAP_SIZE] = ref;
 }
 
-void cmark_reference_create(cmark_reference_map *map, chunk *label, chunk *url,
-			    chunk *title)
+void cmark_reference_create(cmark_reference_map *map, cmark_chunk *label, cmark_chunk *url,
+                            cmark_chunk *title)
 {
 	cmark_reference *ref;
 	unsigned char *reflabel = normalize_reference(label);
@@ -97,7 +97,7 @@ void cmark_reference_create(cmark_reference_map *map, chunk *label, chunk *url,
 
 // Returns reference if refmap contains a reference with matching
 // label, otherwise NULL.
-cmark_reference* cmark_reference_lookup(cmark_reference_map *map, chunk *label)
+cmark_reference* cmark_reference_lookup(cmark_reference_map *map, cmark_chunk *label)
 {
 	cmark_reference *ref = NULL;
 	unsigned char *norm;


[04/12] lucy-clownfish git commit: Update CommonMark source code

Posted by nw...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/scanners.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/scanners.c b/compiler/modules/CommonMark/src/scanners.c
index 6728c07..21c0744 100644
--- a/compiler/modules/CommonMark/src/scanners.c
+++ b/compiler/modules/CommonMark/src/scanners.c
@@ -3,7 +3,7 @@
 #include "chunk.h"
 #include "scanners.h"
 
-int _scan_at(int (*scanner)(const unsigned char *), chunk *c, int offset)
+int _scan_at(int (*scanner)(const unsigned char *), cmark_chunk *c, int offset)
 {
 	int res;
 	unsigned char *ptr = (unsigned char *)c->data;
@@ -8025,31 +8025,31 @@ yy750:
 	if (yych <= '9') {
 		if (yych <= 0x1F) {
 			if (yych <= 0x08) goto yy749;
-			if (yych <= '\n') goto yy790;
+			if (yych <= '\n') goto yy791;
 			goto yy749;
 		} else {
-			if (yych <= ' ') goto yy790;
+			if (yych <= ' ') goto yy791;
 			if (yych <= '.') goto yy749;
-			if (yych <= '/') goto yy792;
-			goto yy788;
+			if (yych <= '/') goto yy793;
+			goto yy789;
 		}
 	} else {
 		if (yych <= '@') {
 			if (yych == '>') goto yy759;
 			goto yy749;
 		} else {
-			if (yych <= 'Z') goto yy788;
+			if (yych <= 'Z') goto yy789;
 			if (yych <= '`') goto yy749;
-			if (yych <= 'z') goto yy788;
+			if (yych <= 'z') goto yy789;
 			goto yy749;
 		}
 	}
 yy751:
 	yych = *(marker = ++p);
 	if (yych <= '@') goto yy749;
-	if (yych <= 'Z') goto yy784;
+	if (yych <= 'Z') goto yy785;
 	if (yych <= '`') goto yy749;
-	if (yych <= 'z') goto yy784;
+	if (yych <= 'z') goto yy785;
 	goto yy749;
 yy752:
 	yych = *(marker = ++p);
@@ -8087,14 +8087,14 @@ yy759:
 	{ return (p - start); }
 yy761:
 	yych = *++p;
-	if (yych == 'C') goto yy775;
-	if (yych == 'c') goto yy775;
+	if (yych == 'C') goto yy776;
+	if (yych == 'c') goto yy776;
 	goto yy757;
 yy762:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 1) {
-		goto yy771;
+		goto yy772;
 	}
 	if (yych <= '@') goto yy757;
 	if (yych <= 'Z') goto yy762;
@@ -8102,107 +8102,116 @@ yy762:
 yy764:
 	yych = *++p;
 	if (yych != '-') goto yy757;
-yy765:
+	yych = *++p;
+	if (yych == '-') goto yy766;
+	if (yych == '>') goto yy757;
+	goto yy768;
+yy766:
+	yych = *++p;
+	if (yych == '-') goto yy771;
+	if (yych == '>') goto yy757;
+	goto yy768;
+yy767:
 	++p;
 	yych = *p;
+yy768:
 	if (yybm[256+yych] & 128) {
-		goto yy765;
+		goto yy767;
 	}
 	if (yych <= 0x00) goto yy757;
-yy767:
 	++p;
 	yych = *p;
+	if (yybm[256+yych] & 128) {
+		goto yy767;
+	}
 	if (yych <= 0x00) goto yy757;
-	if (yych != '-') goto yy769;
 	yych = *++p;
 	if (yych == '>') goto yy759;
 	goto yy757;
-yy769:
-	++p;
-	yych = *p;
-	if (yych <= 0x00) goto yy757;
-	if (yych == '-') goto yy767;
-	goto yy769;
 yy771:
+	yych = *++p;
+	if (yych == '>') goto yy759;
+	goto yy757;
+yy772:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 1) {
-		goto yy771;
+		goto yy772;
 	}
 	if (yych <= 0x00) goto yy757;
 	if (yych == '>') goto yy759;
-yy773:
+yy774:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 2) {
-		goto yy773;
+		goto yy774;
 	}
 	if (yych <= 0x00) goto yy757;
 	goto yy759;
-yy775:
+yy776:
 	yych = *++p;
-	if (yych == 'D') goto yy776;
+	if (yych == 'D') goto yy777;
 	if (yych != 'd') goto yy757;
-yy776:
+yy777:
 	yych = *++p;
-	if (yych == 'A') goto yy777;
+	if (yych == 'A') goto yy778;
 	if (yych != 'a') goto yy757;
-yy777:
+yy778:
 	yych = *++p;
-	if (yych == 'T') goto yy778;
+	if (yych == 'T') goto yy779;
 	if (yych != 't') goto yy757;
-yy778:
+yy779:
 	yych = *++p;
-	if (yych == 'A') goto yy779;
+	if (yych == 'A') goto yy780;
 	if (yych != 'a') goto yy757;
-yy779:
+yy780:
 	yych = *++p;
 	if (yych != '[') goto yy757;
-yy780:
+yy781:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 4) {
-		goto yy780;
+		goto yy781;
 	}
 	if (yych <= 0x00) goto yy757;
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 4) {
-		goto yy780;
+		goto yy781;
 	}
 	if (yych <= 0x00) goto yy757;
 	++p;
 	yych = *p;
 	if (yych <= 0x00) goto yy757;
 	if (yych == '>') goto yy759;
-	goto yy780;
-yy784:
+	goto yy781;
+yy785:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 8) {
-		goto yy784;
+		goto yy785;
 	}
 	if (yych <= 0x1F) {
 		if (yych <= 0x08) goto yy757;
 		if (yych >= '\v') goto yy757;
 	} else {
-		if (yych <= ' ') goto yy786;
+		if (yych <= ' ') goto yy787;
 		if (yych == '>') goto yy759;
 		goto yy757;
 	}
-yy786:
+yy787:
 	++p;
 	yych = *p;
 	if (yych <= 0x1F) {
 		if (yych <= 0x08) goto yy757;
-		if (yych <= '\n') goto yy786;
+		if (yych <= '\n') goto yy787;
 		goto yy757;
 	} else {
-		if (yych <= ' ') goto yy786;
+		if (yych <= ' ') goto yy787;
 		if (yych == '>') goto yy759;
 		goto yy757;
 	}
-yy788:
+yy789:
 	++p;
 	yych = *p;
 	if (yych <= '9') {
@@ -8210,61 +8219,61 @@ yy788:
 			if (yych <= 0x08) goto yy757;
 			if (yych >= '\v') goto yy757;
 		} else {
-			if (yych <= ' ') goto yy790;
+			if (yych <= ' ') goto yy791;
 			if (yych <= '.') goto yy757;
-			if (yych <= '/') goto yy792;
-			goto yy788;
+			if (yych <= '/') goto yy793;
+			goto yy789;
 		}
 	} else {
 		if (yych <= '@') {
 			if (yych == '>') goto yy759;
 			goto yy757;
 		} else {
-			if (yych <= 'Z') goto yy788;
+			if (yych <= 'Z') goto yy789;
 			if (yych <= '`') goto yy757;
-			if (yych <= 'z') goto yy788;
+			if (yych <= 'z') goto yy789;
 			goto yy757;
 		}
 	}
-yy790:
+yy791:
 	++p;
 	yych = *p;
 	if (yych <= ':') {
 		if (yych <= ' ') {
 			if (yych <= 0x08) goto yy757;
-			if (yych <= '\n') goto yy790;
+			if (yych <= '\n') goto yy791;
 			if (yych <= 0x1F) goto yy757;
-			goto yy790;
+			goto yy791;
 		} else {
-			if (yych == '/') goto yy792;
+			if (yych == '/') goto yy793;
 			if (yych <= '9') goto yy757;
-			goto yy793;
+			goto yy794;
 		}
 	} else {
 		if (yych <= 'Z') {
 			if (yych == '>') goto yy759;
 			if (yych <= '@') goto yy757;
-			goto yy793;
+			goto yy794;
 		} else {
 			if (yych <= '_') {
 				if (yych <= '^') goto yy757;
-				goto yy793;
+				goto yy794;
 			} else {
 				if (yych <= '`') goto yy757;
-				if (yych <= 'z') goto yy793;
+				if (yych <= 'z') goto yy794;
 				goto yy757;
 			}
 		}
 	}
-yy792:
+yy793:
 	yych = *++p;
 	if (yych == '>') goto yy759;
 	goto yy757;
-yy793:
+yy794:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 16) {
-		goto yy793;
+		goto yy794;
 	}
 	if (yych <= '.') {
 		if (yych <= '\n') {
@@ -8274,289 +8283,289 @@ yy793:
 		}
 	} else {
 		if (yych <= '<') {
-			if (yych <= '/') goto yy792;
+			if (yych <= '/') goto yy793;
 			goto yy757;
 		} else {
-			if (yych <= '=') goto yy797;
+			if (yych <= '=') goto yy798;
 			if (yych <= '>') goto yy759;
 			goto yy757;
 		}
 	}
-yy795:
+yy796:
 	++p;
 	yych = *p;
 	if (yych <= '<') {
 		if (yych <= ' ') {
 			if (yych <= 0x08) goto yy757;
-			if (yych <= '\n') goto yy795;
+			if (yych <= '\n') goto yy796;
 			if (yych <= 0x1F) goto yy757;
-			goto yy795;
+			goto yy796;
 		} else {
 			if (yych <= '/') {
 				if (yych <= '.') goto yy757;
-				goto yy792;
+				goto yy793;
 			} else {
-				if (yych == ':') goto yy793;
+				if (yych == ':') goto yy794;
 				goto yy757;
 			}
 		}
 	} else {
 		if (yych <= 'Z') {
-			if (yych <= '=') goto yy797;
+			if (yych <= '=') goto yy798;
 			if (yych <= '>') goto yy759;
 			if (yych <= '@') goto yy757;
-			goto yy793;
+			goto yy794;
 		} else {
 			if (yych <= '_') {
 				if (yych <= '^') goto yy757;
-				goto yy793;
+				goto yy794;
 			} else {
 				if (yych <= '`') goto yy757;
-				if (yych <= 'z') goto yy793;
+				if (yych <= 'z') goto yy794;
 				goto yy757;
 			}
 		}
 	}
-yy797:
+yy798:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 32) {
-		goto yy799;
+		goto yy800;
 	}
 	if (yych <= 0x00) goto yy757;
-	if (yych <= '!') goto yy798;
-	if (yych <= '"') goto yy803;
-	if (yych <= ';') goto yy801;
+	if (yych <= '!') goto yy799;
+	if (yych <= '"') goto yy804;
+	if (yych <= ';') goto yy802;
 	goto yy757;
-yy798:
+yy799:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 32) {
-		goto yy799;
+		goto yy800;
 	}
 	if (yych <= '"') {
 		if (yych <= 0x00) goto yy757;
-		if (yych <= '!') goto yy812;
-		goto yy803;
+		if (yych <= '!') goto yy813;
+		goto yy804;
 	} else {
-		if (yych <= ';') goto yy801;
+		if (yych <= ';') goto yy802;
 		if (yych == '>') goto yy759;
 		goto yy757;
 	}
-yy799:
+yy800:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 32) {
-		goto yy799;
+		goto yy800;
 	}
 	if (yych <= 0x00) goto yy757;
-	if (yych <= '!') goto yy806;
+	if (yych <= '!') goto yy807;
 	if (yych == '>') goto yy759;
 	goto yy757;
-yy801:
+yy802:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 64) {
-		goto yy801;
+		goto yy802;
 	}
 	if (yych <= 0x00) goto yy757;
-	goto yy805;
-yy803:
+	goto yy806;
+yy804:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 128) {
-		goto yy803;
+		goto yy804;
 	}
 	if (yych <= 0x00) goto yy757;
-yy805:
+yy806:
 	++p;
 	yych = *p;
 	if (yych <= ' ') {
 		if (yych <= 0x08) goto yy757;
-		if (yych <= '\n') goto yy790;
+		if (yych <= '\n') goto yy791;
 		if (yych <= 0x1F) goto yy757;
-		goto yy790;
+		goto yy791;
 	} else {
 		if (yych <= '/') {
 			if (yych <= '.') goto yy757;
-			goto yy792;
+			goto yy793;
 		} else {
 			if (yych == '>') goto yy759;
 			goto yy757;
 		}
 	}
-yy806:
+yy807:
 	++p;
 	yych = *p;
 	if (yych <= '9') {
 		if (yych <= ' ') {
 			if (yych <= 0x08) {
 				if (yych <= 0x00) goto yy757;
-				goto yy799;
+				goto yy800;
 			} else {
-				if (yych <= '\n') goto yy806;
-				if (yych <= 0x1F) goto yy799;
-				goto yy806;
+				if (yych <= '\n') goto yy807;
+				if (yych <= 0x1F) goto yy800;
+				goto yy807;
 			}
 		} else {
 			if (yych <= '"') {
-				if (yych <= '!') goto yy799;
+				if (yych <= '!') goto yy800;
 				goto yy757;
 			} else {
 				if (yych == '\'') goto yy757;
-				goto yy799;
+				goto yy800;
 			}
 		}
 	} else {
 		if (yych <= '@') {
 			if (yych <= ';') {
-				if (yych >= ';') goto yy799;
+				if (yych >= ';') goto yy800;
 			} else {
 				if (yych <= '=') goto yy757;
 				if (yych <= '>') goto yy759;
-				goto yy799;
+				goto yy800;
 			}
 		} else {
 			if (yych <= '_') {
-				if (yych <= 'Z') goto yy808;
-				if (yych <= '^') goto yy799;
+				if (yych <= 'Z') goto yy809;
+				if (yych <= '^') goto yy800;
 			} else {
 				if (yych <= '`') goto yy757;
-				if (yych >= '{') goto yy799;
+				if (yych >= '{') goto yy800;
 			}
 		}
 	}
-yy808:
+yy809:
 	++p;
 	yych = *p;
 	if (yych <= '/') {
 		if (yych <= '!') {
 			if (yych <= '\n') {
 				if (yych <= 0x00) goto yy757;
-				if (yych <= 0x08) goto yy799;
+				if (yych <= 0x08) goto yy800;
 			} else {
-				if (yych != ' ') goto yy799;
+				if (yych != ' ') goto yy800;
 			}
 		} else {
 			if (yych <= '\'') {
 				if (yych <= '"') goto yy757;
-				if (yych <= '&') goto yy799;
+				if (yych <= '&') goto yy800;
 				goto yy757;
 			} else {
-				if (yych <= ',') goto yy799;
-				if (yych <= '.') goto yy808;
-				goto yy799;
+				if (yych <= ',') goto yy800;
+				if (yych <= '.') goto yy809;
+				goto yy800;
 			}
 		}
 	} else {
 		if (yych <= '@') {
 			if (yych <= '<') {
-				if (yych <= ':') goto yy808;
-				if (yych <= ';') goto yy799;
+				if (yych <= ':') goto yy809;
+				if (yych <= ';') goto yy800;
 				goto yy757;
 			} else {
-				if (yych <= '=') goto yy797;
+				if (yych <= '=') goto yy798;
 				if (yych <= '>') goto yy759;
-				goto yy799;
+				goto yy800;
 			}
 		} else {
 			if (yych <= '_') {
-				if (yych <= 'Z') goto yy808;
-				if (yych <= '^') goto yy799;
-				goto yy808;
+				if (yych <= 'Z') goto yy809;
+				if (yych <= '^') goto yy800;
+				goto yy809;
 			} else {
 				if (yych <= '`') goto yy757;
-				if (yych <= 'z') goto yy808;
-				goto yy799;
+				if (yych <= 'z') goto yy809;
+				goto yy800;
 			}
 		}
 	}
-yy810:
+yy811:
 	++p;
 	yych = *p;
 	if (yych <= ':') {
 		if (yych <= ' ') {
 			if (yych <= 0x08) {
 				if (yych <= 0x00) goto yy757;
-				goto yy799;
+				goto yy800;
 			} else {
-				if (yych <= '\n') goto yy810;
-				if (yych <= 0x1F) goto yy799;
-				goto yy810;
+				if (yych <= '\n') goto yy811;
+				if (yych <= 0x1F) goto yy800;
+				goto yy811;
 			}
 		} else {
 			if (yych <= '&') {
 				if (yych == '"') goto yy757;
-				goto yy799;
+				goto yy800;
 			} else {
 				if (yych <= '\'') goto yy757;
-				if (yych <= '9') goto yy799;
-				goto yy808;
+				if (yych <= '9') goto yy800;
+				goto yy809;
 			}
 		}
 	} else {
 		if (yych <= '@') {
 			if (yych <= '<') {
-				if (yych <= ';') goto yy799;
+				if (yych <= ';') goto yy800;
 				goto yy757;
 			} else {
-				if (yych <= '=') goto yy797;
+				if (yych <= '=') goto yy798;
 				if (yych <= '>') goto yy759;
-				goto yy799;
+				goto yy800;
 			}
 		} else {
 			if (yych <= '_') {
-				if (yych <= 'Z') goto yy808;
-				if (yych <= '^') goto yy799;
-				goto yy808;
+				if (yych <= 'Z') goto yy809;
+				if (yych <= '^') goto yy800;
+				goto yy809;
 			} else {
 				if (yych <= '`') goto yy757;
-				if (yych <= 'z') goto yy808;
-				goto yy799;
+				if (yych <= 'z') goto yy809;
+				goto yy800;
 			}
 		}
 	}
-yy812:
+yy813:
 	++p;
 	yych = *p;
 	if (yych <= '9') {
 		if (yych <= ' ') {
 			if (yych <= 0x08) {
 				if (yych <= 0x00) goto yy757;
-				goto yy799;
+				goto yy800;
 			} else {
-				if (yych <= '\n') goto yy812;
-				if (yych <= 0x1F) goto yy799;
-				goto yy812;
+				if (yych <= '\n') goto yy813;
+				if (yych <= 0x1F) goto yy800;
+				goto yy813;
 			}
 		} else {
 			if (yych <= '"') {
-				if (yych <= '!') goto yy799;
-				goto yy803;
+				if (yych <= '!') goto yy800;
+				goto yy804;
 			} else {
-				if (yych == '\'') goto yy801;
-				goto yy799;
+				if (yych == '\'') goto yy802;
+				goto yy800;
 			}
 		}
 	} else {
 		if (yych <= '@') {
 			if (yych <= ';') {
-				if (yych <= ':') goto yy808;
-				goto yy799;
+				if (yych <= ':') goto yy809;
+				goto yy800;
 			} else {
 				if (yych <= '=') goto yy757;
 				if (yych <= '>') goto yy759;
-				goto yy799;
+				goto yy800;
 			}
 		} else {
 			if (yych <= '_') {
-				if (yych <= 'Z') goto yy808;
-				if (yych <= '^') goto yy799;
-				goto yy808;
+				if (yych <= 'Z') goto yy809;
+				if (yych <= '^') goto yy800;
+				goto yy809;
 			} else {
 				if (yych <= '`') goto yy757;
-				if (yych <= 'z') goto yy808;
-				goto yy799;
+				if (yych <= 'z') goto yy809;
+				goto yy800;
 			}
 		}
 	}
@@ -8574,1778 +8583,1778 @@ int _scan_html_block_tag(const unsigned char *p)
 {
 	unsigned char yych;
 	yych = *p;
-	if (yych == '\n') goto yy816;
-	if (yych == '<') goto yy817;
-	goto yy818;
-yy816:
-	{ return 0; }
+	if (yych == '\n') goto yy817;
+	if (yych == '<') goto yy818;
+	goto yy819;
 yy817:
+	{ return 0; }
+yy818:
 	yych = *(marker = ++p);
 	switch (yych) {
 	case '!':
-	case '?':	goto yy819;
-	case '/':	goto yy838;
+	case '?':	goto yy820;
+	case '/':	goto yy839;
 	case 'A':
-	case 'a':	goto yy823;
+	case 'a':	goto yy824;
 	case 'B':
-	case 'b':	goto yy826;
+	case 'b':	goto yy827;
 	case 'C':
-	case 'c':	goto yy830;
+	case 'c':	goto yy831;
 	case 'D':
-	case 'd':	goto yy831;
+	case 'd':	goto yy832;
 	case 'E':
-	case 'e':	goto yy834;
+	case 'e':	goto yy835;
 	case 'F':
-	case 'f':	goto yy835;
+	case 'f':	goto yy836;
 	case 'H':
-	case 'h':	goto yy824;
+	case 'h':	goto yy825;
 	case 'I':
-	case 'i':	goto yy825;
+	case 'i':	goto yy826;
 	case 'L':
-	case 'l':	goto yy827;
+	case 'l':	goto yy828;
 	case 'M':
-	case 'm':	goto yy828;
+	case 'm':	goto yy829;
 	case 'O':
-	case 'o':	goto yy829;
+	case 'o':	goto yy830;
 	case 'P':
-	case 'p':	goto yy821;
+	case 'p':	goto yy822;
 	case 'S':
-	case 's':	goto yy832;
+	case 's':	goto yy833;
 	case 'T':
-	case 't':	goto yy833;
+	case 't':	goto yy834;
 	case 'U':
-	case 'u':	goto yy836;
+	case 'u':	goto yy837;
 	case 'V':
-	case 'v':	goto yy837;
-	default:	goto yy816;
+	case 'v':	goto yy838;
+	default:	goto yy817;
 	}
-yy818:
-	yych = *++p;
-	goto yy816;
 yy819:
+	yych = *++p;
+	goto yy817;
+yy820:
 	++p;
 	{ return (p - start); }
-yy821:
+yy822:
 	yych = *++p;
 	if (yych <= '/') {
 		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy822;
-			if (yych <= '\n') goto yy982;
+			if (yych <= 0x08) goto yy823;
+			if (yych <= '\n') goto yy983;
 		} else {
-			if (yych <= ' ') goto yy982;
-			if (yych >= '/') goto yy982;
+			if (yych <= ' ') goto yy983;
+			if (yych >= '/') goto yy983;
 		}
 	} else {
 		if (yych <= 'Q') {
-			if (yych == '>') goto yy982;
+			if (yych == '>') goto yy983;
 		} else {
-			if (yych <= 'R') goto yy1095;
-			if (yych == 'r') goto yy1095;
+			if (yych <= 'R') goto yy1096;
+			if (yych == 'r') goto yy1096;
 		}
 	}
-yy822:
-	p = marker;
-	goto yy816;
 yy823:
+	p = marker;
+	goto yy817;
+yy824:
 	yych = *++p;
 	if (yych <= 'S') {
-		if (yych <= 'Q') goto yy822;
-		if (yych <= 'R') goto yy1088;
-		goto yy1087;
+		if (yych <= 'Q') goto yy823;
+		if (yych <= 'R') goto yy1089;
+		goto yy1088;
 	} else {
-		if (yych <= 'q') goto yy822;
-		if (yych <= 'r') goto yy1088;
-		if (yych <= 's') goto yy1087;
-		goto yy822;
+		if (yych <= 'q') goto yy823;
+		if (yych <= 'r') goto yy1089;
+		if (yych <= 's') goto yy1088;
+		goto yy823;
 	}
-yy824:
+yy825:
 	yych = *++p;
 	if (yych <= 'Q') {
 		if (yych <= 'D') {
-			if (yych <= '0') goto yy822;
-			if (yych <= '6') goto yy981;
-			goto yy822;
+			if (yych <= '0') goto yy823;
+			if (yych <= '6') goto yy982;
+			goto yy823;
 		} else {
-			if (yych <= 'E') goto yy1080;
-			if (yych == 'G') goto yy1079;
-			goto yy822;
+			if (yych <= 'E') goto yy1081;
+			if (yych == 'G') goto yy1080;
+			goto yy823;
 		}
 	} else {
 		if (yych <= 'f') {
-			if (yych <= 'R') goto yy981;
-			if (yych == 'e') goto yy1080;
-			goto yy822;
+			if (yych <= 'R') goto yy982;
+			if (yych == 'e') goto yy1081;
+			goto yy823;
 		} else {
-			if (yych <= 'g') goto yy1079;
-			if (yych == 'r') goto yy981;
-			goto yy822;
+			if (yych <= 'g') goto yy1080;
+			if (yych == 'r') goto yy982;
+			goto yy823;
 		}
 	}
-yy825:
-	yych = *++p;
-	if (yych == 'F') goto yy1075;
-	if (yych == 'f') goto yy1075;
-	goto yy822;
 yy826:
 	yych = *++p;
+	if (yych == 'F') goto yy1076;
+	if (yych == 'f') goto yy1076;
+	goto yy823;
+yy827:
+	yych = *++p;
 	if (yych <= 'U') {
 		if (yych <= 'N') {
-			if (yych == 'L') goto yy1063;
-			goto yy822;
+			if (yych == 'L') goto yy1064;
+			goto yy823;
 		} else {
-			if (yych <= 'O') goto yy1062;
-			if (yych <= 'T') goto yy822;
-			goto yy1061;
+			if (yych <= 'O') goto yy1063;
+			if (yych <= 'T') goto yy823;
+			goto yy1062;
 		}
 	} else {
 		if (yych <= 'n') {
-			if (yych == 'l') goto yy1063;
-			goto yy822;
+			if (yych == 'l') goto yy1064;
+			goto yy823;
 		} else {
-			if (yych <= 'o') goto yy1062;
-			if (yych == 'u') goto yy1061;
-			goto yy822;
+			if (yych <= 'o') goto yy1063;
+			if (yych == 'u') goto yy1062;
+			goto yy823;
 		}
 	}
-yy827:
-	yych = *++p;
-	if (yych == 'I') goto yy981;
-	if (yych == 'i') goto yy981;
-	goto yy822;
 yy828:
 	yych = *++p;
-	if (yych == 'A') goto yy1060;
-	if (yych == 'a') goto yy1060;
-	goto yy822;
+	if (yych == 'I') goto yy982;
+	if (yych == 'i') goto yy982;
+	goto yy823;
 yy829:
 	yych = *++p;
+	if (yych == 'A') goto yy1061;
+	if (yych == 'a') goto yy1061;
+	goto yy823;
+yy830:
+	yych = *++p;
 	if (yych <= 'U') {
 		if (yych <= 'K') {
-			if (yych == 'B') goto yy1053;
-			goto yy822;
+			if (yych == 'B') goto yy1054;
+			goto yy823;
 		} else {
-			if (yych <= 'L') goto yy981;
-			if (yych <= 'T') goto yy822;
-			goto yy1052;
+			if (yych <= 'L') goto yy982;
+			if (yych <= 'T') goto yy823;
+			goto yy1053;
 		}
 	} else {
 		if (yych <= 'k') {
-			if (yych == 'b') goto yy1053;
-			goto yy822;
+			if (yych == 'b') goto yy1054;
+			goto yy823;
 		} else {
-			if (yych <= 'l') goto yy981;
-			if (yych == 'u') goto yy1052;
-			goto yy822;
+			if (yych <= 'l') goto yy982;
+			if (yych == 'u') goto yy1053;
+			goto yy823;
 		}
 	}
-yy830:
+yy831:
 	yych = *++p;
 	if (yych <= 'O') {
-		if (yych == 'A') goto yy1039;
-		if (yych <= 'N') goto yy822;
-		goto yy1038;
+		if (yych == 'A') goto yy1040;
+		if (yych <= 'N') goto yy823;
+		goto yy1039;
 	} else {
 		if (yych <= 'a') {
-			if (yych <= '`') goto yy822;
-			goto yy1039;
+			if (yych <= '`') goto yy823;
+			goto yy1040;
 		} else {
-			if (yych == 'o') goto yy1038;
-			goto yy822;
+			if (yych == 'o') goto yy1039;
+			goto yy823;
 		}
 	}
-yy831:
+yy832:
 	yych = *++p;
 	if (yych <= 'T') {
 		if (yych <= 'I') {
-			if (yych == 'D') goto yy981;
-			if (yych <= 'H') goto yy822;
-			goto yy1037;
+			if (yych == 'D') goto yy982;
+			if (yych <= 'H') goto yy823;
+			goto yy1038;
 		} else {
-			if (yych == 'L') goto yy981;
-			if (yych <= 'S') goto yy822;
-			goto yy981;
+			if (yych == 'L') goto yy982;
+			if (yych <= 'S') goto yy823;
+			goto yy982;
 		}
 	} else {
 		if (yych <= 'i') {
-			if (yych == 'd') goto yy981;
-			if (yych <= 'h') goto yy822;
-			goto yy1037;
+			if (yych == 'd') goto yy982;
+			if (yych <= 'h') goto yy823;
+			goto yy1038;
 		} else {
 			if (yych <= 'l') {
-				if (yych <= 'k') goto yy822;
-				goto yy981;
+				if (yych <= 'k') goto yy823;
+				goto yy982;
 			} else {
-				if (yych == 't') goto yy981;
-				goto yy822;
+				if (yych == 't') goto yy982;
+				goto yy823;
 			}
 		}
 	}
-yy832:
+yy833:
 	yych = *++p;
 	if (yych <= 'T') {
 		if (yych <= 'D') {
-			if (yych == 'C') goto yy1026;
-			goto yy822;
+			if (yych == 'C') goto yy1027;
+			goto yy823;
 		} else {
-			if (yych <= 'E') goto yy1027;
-			if (yych <= 'S') goto yy822;
-			goto yy1025;
+			if (yych <= 'E') goto yy1028;
+			if (yych <= 'S') goto yy823;
+			goto yy1026;
 		}
 	} else {
 		if (yych <= 'd') {
-			if (yych == 'c') goto yy1026;
-			goto yy822;
+			if (yych == 'c') goto yy1027;
+			goto yy823;
 		} else {
-			if (yych <= 'e') goto yy1027;
-			if (yych == 't') goto yy1025;
-			goto yy822;
+			if (yych <= 'e') goto yy1028;
+			if (yych == 't') goto yy1026;
+			goto yy823;
 		}
 	}
-yy833:
+yy834:
 	yych = *++p;
 	switch (yych) {
 	case 'A':
-	case 'a':	goto yy1011;
+	case 'a':	goto yy1012;
 	case 'B':
-	case 'b':	goto yy1010;
+	case 'b':	goto yy1011;
 	case 'D':
 	case 'R':
 	case 'd':
-	case 'r':	goto yy981;
+	case 'r':	goto yy982;
 	case 'E':
-	case 'e':	goto yy1009;
+	case 'e':	goto yy1010;
 	case 'F':
-	case 'f':	goto yy1008;
+	case 'f':	goto yy1009;
 	case 'H':
-	case 'h':	goto yy1007;
-	default:	goto yy822;
+	case 'h':	goto yy1008;
+	default:	goto yy823;
 	}
-yy834:
-	yych = *++p;
-	if (yych == 'M') goto yy1004;
-	if (yych == 'm') goto yy1004;
-	goto yy822;
 yy835:
 	yych = *++p;
+	if (yych == 'M') goto yy1005;
+	if (yych == 'm') goto yy1005;
+	goto yy823;
+yy836:
+	yych = *++p;
 	if (yych <= 'O') {
-		if (yych == 'I') goto yy985;
-		if (yych <= 'N') goto yy822;
-		goto yy984;
+		if (yych == 'I') goto yy986;
+		if (yych <= 'N') goto yy823;
+		goto yy985;
 	} else {
 		if (yych <= 'i') {
-			if (yych <= 'h') goto yy822;
-			goto yy985;
+			if (yych <= 'h') goto yy823;
+			goto yy986;
 		} else {
-			if (yych == 'o') goto yy984;
-			goto yy822;
+			if (yych == 'o') goto yy985;
+			goto yy823;
 		}
 	}
-yy836:
-	yych = *++p;
-	if (yych == 'L') goto yy981;
-	if (yych == 'l') goto yy981;
-	goto yy822;
 yy837:
 	yych = *++p;
-	if (yych == 'I') goto yy978;
-	if (yych == 'i') goto yy978;
-	goto yy822;
+	if (yych == 'L') goto yy982;
+	if (yych == 'l') goto yy982;
+	goto yy823;
 yy838:
 	yych = *++p;
+	if (yych == 'I') goto yy979;
+	if (yych == 'i') goto yy979;
+	goto yy823;
+yy839:
+	yych = *++p;
 	switch (yych) {
 	case 'A':
-	case 'a':	goto yy840;
+	case 'a':	goto yy841;
 	case 'B':
-	case 'b':	goto yy843;
+	case 'b':	goto yy844;
 	case 'C':
-	case 'c':	goto yy847;
+	case 'c':	goto yy848;
 	case 'D':
-	case 'd':	goto yy848;
+	case 'd':	goto yy849;
 	case 'E':
-	case 'e':	goto yy851;
+	case 'e':	goto yy852;
 	case 'F':
-	case 'f':	goto yy852;
+	case 'f':	goto yy853;
 	case 'H':
-	case 'h':	goto yy841;
+	case 'h':	goto yy842;
 	case 'I':
-	case 'i':	goto yy842;
+	case 'i':	goto yy843;
 	case 'L':
-	case 'l':	goto yy844;
+	case 'l':	goto yy845;
 	case 'M':
-	case 'm':	goto yy845;
+	case 'm':	goto yy846;
 	case 'O':
-	case 'o':	goto yy846;
+	case 'o':	goto yy847;
 	case 'P':
-	case 'p':	goto yy839;
+	case 'p':	goto yy840;
 	case 'S':
-	case 's':	goto yy849;
+	case 's':	goto yy850;
 	case 'T':
-	case 't':	goto yy850;
+	case 't':	goto yy851;
 	case 'U':
-	case 'u':	goto yy853;
+	case 'u':	goto yy854;
 	case 'V':
-	case 'v':	goto yy854;
-	default:	goto yy822;
+	case 'v':	goto yy855;
+	default:	goto yy823;
 	}
-yy839:
+yy840:
 	yych = *++p;
 	if (yych <= '=') {
 		if (yych <= '\n') {
-			if (yych <= 0x08) goto yy822;
-			goto yy859;
+			if (yych <= 0x08) goto yy823;
+			goto yy860;
 		} else {
-			if (yych == ' ') goto yy859;
-			goto yy822;
+			if (yych == ' ') goto yy860;
+			goto yy823;
 		}
 	} else {
 		if (yych <= 'R') {
-			if (yych <= '>') goto yy859;
-			if (yych <= 'Q') goto yy822;
-			goto yy972;
+			if (yych <= '>') goto yy860;
+			if (yych <= 'Q') goto yy823;
+			goto yy973;
 		} else {
-			if (yych == 'r') goto yy972;
-			goto yy822;
+			if (yych == 'r') goto yy973;
+			goto yy823;
 		}
 	}
-yy840:
+yy841:
 	yych = *++p;
 	if (yych <= 'S') {
-		if (yych <= 'Q') goto yy822;
-		if (yych <= 'R') goto yy965;
-		goto yy964;
+		if (yych <= 'Q') goto yy823;
+		if (yych <= 'R') goto yy966;
+		goto yy965;
 	} else {
-		if (yych <= 'q') goto yy822;
-		if (yych <= 'r') goto yy965;
-		if (yych <= 's') goto yy964;
-		goto yy822;
+		if (yych <= 'q') goto yy823;
+		if (yych <= 'r') goto yy966;
+		if (yych <= 's') goto yy965;
+		goto yy823;
 	}
-yy841:
+yy842:
 	yych = *++p;
 	if (yych <= 'Q') {
 		if (yych <= 'D') {
-			if (yych <= '0') goto yy822;
-			if (yych <= '6') goto yy858;
-			goto yy822;
+			if (yych <= '0') goto yy823;
+			if (yych <= '6') goto yy859;
+			goto yy823;
 		} else {
-			if (yych <= 'E') goto yy957;
-			if (yych == 'G') goto yy956;
-			goto yy822;
+			if (yych <= 'E') goto yy958;
+			if (yych == 'G') goto yy957;
+			goto yy823;
 		}
 	} else {
 		if (yych <= 'f') {
-			if (yych <= 'R') goto yy858;
-			if (yych == 'e') goto yy957;
-			goto yy822;
+			if (yych <= 'R') goto yy859;
+			if (yych == 'e') goto yy958;
+			goto yy823;
 		} else {
-			if (yych <= 'g') goto yy956;
-			if (yych == 'r') goto yy858;
-			goto yy822;
+			if (yych <= 'g') goto yy957;
+			if (yych == 'r') goto yy859;
+			goto yy823;
 		}
 	}
-yy842:
-	yych = *++p;
-	if (yych == 'F') goto yy952;
-	if (yych == 'f') goto yy952;
-	goto yy822;
 yy843:
 	yych = *++p;
+	if (yych == 'F') goto yy953;
+	if (yych == 'f') goto yy953;
+	goto yy823;
+yy844:
+	yych = *++p;
 	if (yych <= 'U') {
 		if (yych <= 'N') {
-			if (yych == 'L') goto yy940;
-			goto yy822;
+			if (yych == 'L') goto yy941;
+			goto yy823;
 		} else {
-			if (yych <= 'O') goto yy939;
-			if (yych <= 'T') goto yy822;
-			goto yy938;
+			if (yych <= 'O') goto yy940;
+			if (yych <= 'T') goto yy823;
+			goto yy939;
 		}
 	} else {
 		if (yych <= 'n') {
-			if (yych == 'l') goto yy940;
-			goto yy822;
+			if (yych == 'l') goto yy941;
+			goto yy823;
 		} else {
-			if (yych <= 'o') goto yy939;
-			if (yych == 'u') goto yy938;
-			goto yy822;
+			if (yych <= 'o') goto yy940;
+			if (yych == 'u') goto yy939;
+			goto yy823;
 		}
 	}
-yy844:
-	yych = *++p;
-	if (yych == 'I') goto yy858;
-	if (yych == 'i') goto yy858;
-	goto yy822;
 yy845:
 	yych = *++p;
-	if (yych == 'A') goto yy937;
-	if (yych == 'a') goto yy937;
-	goto yy822;
+	if (yych == 'I') goto yy859;
+	if (yych == 'i') goto yy859;
+	goto yy823;
 yy846:
 	yych = *++p;
+	if (yych == 'A') goto yy938;
+	if (yych == 'a') goto yy938;
+	goto yy823;
+yy847:
+	yych = *++p;
 	if (yych <= 'U') {
 		if (yych <= 'K') {
-			if (yych == 'B') goto yy930;
-			goto yy822;
+			if (yych == 'B') goto yy931;
+			goto yy823;
 		} else {
-			if (yych <= 'L') goto yy858;
-			if (yych <= 'T') goto yy822;
-			goto yy929;
+			if (yych <= 'L') goto yy859;
+			if (yych <= 'T') goto yy823;
+			goto yy930;
 		}
 	} else {
 		if (yych <= 'k') {
-			if (yych == 'b') goto yy930;
-			goto yy822;
+			if (yych == 'b') goto yy931;
+			goto yy823;
 		} else {
-			if (yych <= 'l') goto yy858;
-			if (yych == 'u') goto yy929;
-			goto yy822;
+			if (yych <= 'l') goto yy859;
+			if (yych == 'u') goto yy930;
+			goto yy823;
 		}
 	}
-yy847:
+yy848:
 	yych = *++p;
 	if (yych <= 'O') {
-		if (yych == 'A') goto yy916;
-		if (yych <= 'N') goto yy822;
-		goto yy915;
+		if (yych == 'A') goto yy917;
+		if (yych <= 'N') goto yy823;
+		goto yy916;
 	} else {
 		if (yych <= 'a') {
-			if (yych <= '`') goto yy822;
-			goto yy916;
+			if (yych <= '`') goto yy823;
+			goto yy917;
 		} else {
-			if (yych == 'o') goto yy915;
-			goto yy822;
+			if (yych == 'o') goto yy916;
+			goto yy823;
 		}
 	}
-yy848:
+yy849:
 	yych = *++p;
 	if (yych <= 'T') {
 		if (yych <= 'I') {
-			if (yych == 'D') goto yy858;
-			if (yych <= 'H') goto yy822;
-			goto yy914;
+			if (yych == 'D') goto yy859;
+			if (yych <= 'H') goto yy823;
+			goto yy915;
 		} else {
-			if (yych == 'L') goto yy858;
-			if (yych <= 'S') goto yy822;
-			goto yy858;
+			if (yych == 'L') goto yy859;
+			if (yych <= 'S') goto yy823;
+			goto yy859;
 		}
 	} else {
 		if (yych <= 'i') {
-			if (yych == 'd') goto yy858;
-			if (yych <= 'h') goto yy822;
-			goto yy914;
+			if (yych == 'd') goto yy859;
+			if (yych <= 'h') goto yy823;
+			goto yy915;
 		} else {
 			if (yych <= 'l') {
-				if (yych <= 'k') goto yy822;
-				goto yy858;
+				if (yych <= 'k') goto yy823;
+				goto yy859;
 			} else {
-				if (yych == 't') goto yy858;
-				goto yy822;
+				if (yych == 't') goto yy859;
+				goto yy823;
 			}
 		}
 	}
-yy849:
+yy850:
 	yych = *++p;
 	if (yych <= 'T') {
 		if (yych <= 'D') {
-			if (yych == 'C') goto yy903;
-			goto yy822;
+			if (yych == 'C') goto yy904;
+			goto yy823;
 		} else {
-			if (yych <= 'E') goto yy904;
-			if (yych <= 'S') goto yy822;
-			goto yy902;
+			if (yych <= 'E') goto yy905;
+			if (yych <= 'S') goto yy823;
+			goto yy903;
 		}
 	} else {
 		if (yych <= 'd') {
-			if (yych == 'c') goto yy903;
-			goto yy822;
+			if (yych == 'c') goto yy904;
+			goto yy823;
 		} else {
-			if (yych <= 'e') goto yy904;
-			if (yych == 't') goto yy902;
-			goto yy822;
+			if (yych <= 'e') goto yy905;
+			if (yych == 't') goto yy903;
+			goto yy823;
 		}
 	}
-yy850:
+yy851:
 	yych = *++p;
 	switch (yych) {
 	case 'A':
-	case 'a':	goto yy888;
+	case 'a':	goto yy889;
 	case 'B':
-	case 'b':	goto yy887;
+	case 'b':	goto yy888;
 	case 'D':
 	case 'R':
 	case 'd':
-	case 'r':	goto yy858;
+	case 'r':	goto yy859;
 	case 'E':
-	case 'e':	goto yy886;
+	case 'e':	goto yy887;
 	case 'F':
-	case 'f':	goto yy885;
+	case 'f':	goto yy886;
 	case 'H':
-	case 'h':	goto yy884;
-	default:	goto yy822;
+	case 'h':	goto yy885;
+	default:	goto yy823;
 	}
-yy851:
-	yych = *++p;
-	if (yych == 'M') goto yy881;
-	if (yych == 'm') goto yy881;
-	goto yy822;
 yy852:
 	yych = *++p;
+	if (yych == 'M') goto yy882;
+	if (yych == 'm') goto yy882;
+	goto yy823;
+yy853:
+	yych = *++p;
 	if (yych <= 'O') {
-		if (yych == 'I') goto yy862;
-		if (yych <= 'N') goto yy822;
-		goto yy861;
+		if (yych == 'I') goto yy863;
+		if (yych <= 'N') goto yy823;
+		goto yy862;
 	} else {
 		if (yych <= 'i') {
-			if (yych <= 'h') goto yy822;
-			goto yy862;
+			if (yych <= 'h') goto yy823;
+			goto yy863;
 		} else {
-			if (yych == 'o') goto yy861;
-			goto yy822;
+			if (yych == 'o') goto yy862;
+			goto yy823;
 		}
 	}
-yy853:
-	yych = *++p;
-	if (yych == 'L') goto yy858;
-	if (yych == 'l') goto yy858;
-	goto yy822;
 yy854:
 	yych = *++p;
-	if (yych == 'I') goto yy855;
-	if (yych != 'i') goto yy822;
+	if (yych == 'L') goto yy859;
+	if (yych == 'l') goto yy859;
+	goto yy823;
 yy855:
 	yych = *++p;
-	if (yych == 'D') goto yy856;
-	if (yych != 'd') goto yy822;
+	if (yych == 'I') goto yy856;
+	if (yych != 'i') goto yy823;
 yy856:
 	yych = *++p;
-	if (yych == 'E') goto yy857;
-	if (yych != 'e') goto yy822;
+	if (yych == 'D') goto yy857;
+	if (yych != 'd') goto yy823;
 yy857:
 	yych = *++p;
-	if (yych == 'O') goto yy858;
-	if (yych != 'o') goto yy822;
+	if (yych == 'E') goto yy858;
+	if (yych != 'e') goto yy823;
 yy858:
 	yych = *++p;
+	if (yych == 'O') goto yy859;
+	if (yych != 'o') goto yy823;
+yy859:
+	yych = *++p;
 	if (yych <= 0x1F) {
-		if (yych <= 0x08) goto yy822;
-		if (yych >= '\v') goto yy822;
+		if (yych <= 0x08) goto yy823;
+		if (yych >= '\v') goto yy823;
 	} else {
-		if (yych <= ' ') goto yy859;
-		if (yych != '>') goto yy822;
+		if (yych <= ' ') goto yy860;
+		if (yych != '>') goto yy823;
 	}
-yy859:
+yy860:
 	++p;
 	{ return (p - start); }
-yy861:
+yy862:
 	yych = *++p;
 	if (yych <= 'R') {
-		if (yych == 'O') goto yy877;
-		if (yych <= 'Q') goto yy822;
-		goto yy878;
+		if (yych == 'O') goto yy878;
+		if (yych <= 'Q') goto yy823;
+		goto yy879;
 	} else {
 		if (yych <= 'o') {
-			if (yych <= 'n') goto yy822;
-			goto yy877;
+			if (yych <= 'n') goto yy823;
+			goto yy878;
 		} else {
-			if (yych == 'r') goto yy878;
-			goto yy822;
+			if (yych == 'r') goto yy879;
+			goto yy823;
 		}
 	}
-yy862:
+yy863:
 	yych = *++p;
 	if (yych <= 'G') {
-		if (yych == 'E') goto yy863;
-		if (yych <= 'F') goto yy822;
-		goto yy864;
+		if (yych == 'E') goto yy864;
+		if (yych <= 'F') goto yy823;
+		goto yy865;
 	} else {
 		if (yych <= 'e') {
-			if (yych <= 'd') goto yy822;
+			if (yych <= 'd') goto yy823;
 		} else {
-			if (yych == 'g') goto yy864;
-			goto yy822;
+			if (yych == 'g') goto yy865;
+			goto yy823;
 		}
 	}
-yy863:
-	yych = *++p;
-	if (yych == 'L') goto yy873;
-	if (yych == 'l') goto yy873;
-	goto yy822;
 yy864:
 	yych = *++p;
+	if (yych == 'L') goto yy874;
+	if (yych == 'l') goto yy874;
+	goto yy823;
+yy865:
+	yych = *++p;
 	if (yych <= 'U') {
-		if (yych == 'C') goto yy866;
-		if (yych <= 'T') goto yy822;
+		if (yych == 'C') goto yy867;
+		if (yych <= 'T') goto yy823;
 	} else {
 		if (yych <= 'c') {
-			if (yych <= 'b') goto yy822;
-			goto yy866;
+			if (yych <= 'b') goto yy823;
+			goto yy867;
 		} else {
-			if (yych != 'u') goto yy822;
+			if (yych != 'u') goto yy823;
 		}
 	}
 	yych = *++p;
-	if (yych == 'R') goto yy872;
-	if (yych == 'r') goto yy872;
-	goto yy822;
-yy866:
-	yych = *++p;
-	if (yych == 'A') goto yy867;
-	if (yych != 'a') goto yy822;
+	if (yych == 'R') goto yy873;
+	if (yych == 'r') goto yy873;
+	goto yy823;
 yy867:
 	yych = *++p;
-	if (yych == 'P') goto yy868;
-	if (yych != 'p') goto yy822;
+	if (yych == 'A') goto yy868;
+	if (yych != 'a') goto yy823;
 yy868:
 	yych = *++p;
-	if (yych == 'T') goto yy869;
-	if (yych != 't') goto yy822;
+	if (yych == 'P') goto yy869;
+	if (yych != 'p') goto yy823;
 yy869:
 	yych = *++p;
-	if (yych == 'I') goto yy870;
-	if (yych != 'i') goto yy822;
+	if (yych == 'T') goto yy870;
+	if (yych != 't') goto yy823;
 yy870:
 	yych = *++p;
-	if (yych == 'O') goto yy871;
-	if (yych != 'o') goto yy822;
+	if (yych == 'I') goto yy871;
+	if (yych != 'i') goto yy823;
 yy871:
 	yych = *++p;
-	if (yych == 'N') goto yy858;
-	if (yych == 'n') goto yy858;
-	goto yy822;
+	if (yych == 'O') goto yy872;
+	if (yych != 'o') goto yy823;
 yy872:
 	yych = *++p;
-	if (yych == 'E') goto yy858;
-	if (yych == 'e') goto yy858;
-	goto yy822;
+	if (yych == 'N') goto yy859;
+	if (yych == 'n') goto yy859;
+	goto yy823;
 yy873:
 	yych = *++p;
-	if (yych == 'D') goto yy874;
-	if (yych != 'd') goto yy822;
+	if (yych == 'E') goto yy859;
+	if (yych == 'e') goto yy859;
+	goto yy823;
 yy874:
 	yych = *++p;
-	if (yych == 'S') goto yy875;
-	if (yych != 's') goto yy822;
+	if (yych == 'D') goto yy875;
+	if (yych != 'd') goto yy823;
 yy875:
 	yych = *++p;
-	if (yych == 'E') goto yy876;
-	if (yych != 'e') goto yy822;
+	if (yych == 'S') goto yy876;
+	if (yych != 's') goto yy823;
 yy876:
 	yych = *++p;
-	if (yych == 'T') goto yy858;
-	if (yych == 't') goto yy858;
-	goto yy822;
+	if (yych == 'E') goto yy877;
+	if (yych != 'e') goto yy823;
 yy877:
 	yych = *++p;
-	if (yych == 'T') goto yy879;
-	if (yych == 't') goto yy879;
-	goto yy822;
+	if (yych == 'T') goto yy859;
+	if (yych == 't') goto yy859;
+	goto yy823;
 yy878:
 	yych = *++p;
-	if (yych == 'M') goto yy858;
-	if (yych == 'm') goto yy858;
-	goto yy822;
+	if (yych == 'T') goto yy880;
+	if (yych == 't') goto yy880;
+	goto yy823;
 yy879:
 	yych = *++p;
-	if (yych == 'E') goto yy880;
-	if (yych != 'e') goto yy822;
+	if (yych == 'M') goto yy859;
+	if (yych == 'm') goto yy859;
+	goto yy823;
 yy880:
 	yych = *++p;
-	if (yych == 'R') goto yy858;
-	if (yych == 'r') goto yy858;
-	goto yy822;
+	if (yych == 'E') goto yy881;
+	if (yych != 'e') goto yy823;
 yy881:
 	yych = *++p;
-	if (yych == 'B') goto yy882;
-	if (yych != 'b') goto yy822;
+	if (yych == 'R') goto yy859;
+	if (yych == 'r') goto yy859;
+	goto yy823;
 yy882:
 	yych = *++p;
-	if (yych == 'E') goto yy883;
-	if (yych != 'e') goto yy822;
+	if (yych == 'B') goto yy883;
+	if (yych != 'b') goto yy823;
 yy883:
 	yych = *++p;
-	if (yych == 'D') goto yy858;
-	if (yych == 'd') goto yy858;
-	goto yy822;
+	if (yych == 'E') goto yy884;
+	if (yych != 'e') goto yy823;
 yy884:
 	yych = *++p;
+	if (yych == 'D') goto yy859;
+	if (yych == 'd') goto yy859;
+	goto yy823;
+yy885:
+	yych = *++p;
 	if (yych <= '=') {
 		if (yych <= '\n') {
-			if (yych <= 0x08) goto yy822;
-			goto yy859;
+			if (yych <= 0x08) goto yy823;
+			goto yy860;
 		} else {
-			if (yych == ' ') goto yy859;
-			goto yy822;
+			if (yych == ' ') goto yy860;
+			goto yy823;
 		}
 	} else {
 		if (yych <= 'E') {
-			if (yych <= '>') goto yy859;
-			if (yych <= 'D') goto yy822;
-			goto yy900;
+			if (yych <= '>') goto yy860;
+			if (yych <= 'D') goto yy823;
+			goto yy901;
 		} else {
-			if (yych == 'e') goto yy900;
-			goto yy822;
+			if (yych == 'e') goto yy901;
+			goto yy823;
 		}
 	}
-yy885:
-	yych = *++p;
-	if (yych == 'O') goto yy898;
-	if (yych == 'o') goto yy898;
-	goto yy822;
 yy886:
 	yych = *++p;
-	if (yych == 'X') goto yy893;
-	if (yych == 'x') goto yy893;
-	goto yy822;
+	if (yych == 'O') goto yy899;
+	if (yych == 'o') goto yy899;
+	goto yy823;
 yy887:
 	yych = *++p;
-	if (yych == 'O') goto yy891;
-	if (yych == 'o') goto yy891;
-	goto yy822;
+	if (yych == 'X') goto yy894;
+	if (yych == 'x') goto yy894;
+	goto yy823;
 yy888:
 	yych = *++p;
-	if (yych == 'B') goto yy889;
-	if (yych != 'b') goto yy822;
+	if (yych == 'O') goto yy892;
+	if (yych == 'o') goto yy892;
+	goto yy823;
 yy889:
 	yych = *++p;
-	if (yych == 'L') goto yy890;
-	if (yych != 'l') goto yy822;
+	if (yych == 'B') goto yy890;
+	if (yych != 'b') goto yy823;
 yy890:
 	yych = *++p;
-	if (yych == 'E') goto yy858;
-	if (yych == 'e') goto yy858;
-	goto yy822;
+	if (yych == 'L') goto yy891;
+	if (yych != 'l') goto yy823;
 yy891:
 	yych = *++p;
-	if (yych == 'D') goto yy892;
-	if (yych != 'd') goto yy822;
+	if (yych == 'E') goto yy859;
+	if (yych == 'e') goto yy859;
+	goto yy823;
 yy892:
 	yych = *++p;
-	if (yych == 'Y') goto yy858;
-	if (yych == 'y') goto yy858;
-	goto yy822;
+	if (yych == 'D') goto yy893;
+	if (yych != 'd') goto yy823;
 yy893:
 	yych = *++p;
-	if (yych == 'T') goto yy894;
-	if (yych != 't') goto yy822;
+	if (yych == 'Y') goto yy859;
+	if (yych == 'y') goto yy859;
+	goto yy823;
 yy894:
 	yych = *++p;
-	if (yych == 'A') goto yy895;
-	if (yych != 'a') goto yy822;
+	if (yych == 'T') goto yy895;
+	if (yych != 't') goto yy823;
 yy895:
 	yych = *++p;
-	if (yych == 'R') goto yy896;
-	if (yych != 'r') goto yy822;
+	if (yych == 'A') goto yy896;
+	if (yych != 'a') goto yy823;
 yy896:
 	yych = *++p;
-	if (yych == 'E') goto yy897;
-	if (yych != 'e') goto yy822;
+	if (yych == 'R') goto yy897;
+	if (yych != 'r') goto yy823;
 yy897:
 	yych = *++p;
-	if (yych == 'A') goto yy858;
-	if (yych == 'a') goto yy858;
-	goto yy822;
+	if (yych == 'E') goto yy898;
+	if (yych != 'e') goto yy823;
 yy898:
 	yych = *++p;
-	if (yych == 'O') goto yy899;
-	if (yych != 'o') goto yy822;
+	if (yych == 'A') goto yy859;
+	if (yych == 'a') goto yy859;
+	goto yy823;
 yy899:
 	yych = *++p;
-	if (yych == 'T') goto yy858;
-	if (yych == 't') goto yy858;
-	goto yy822;
+	if (yych == 'O') goto yy900;
+	if (yych != 'o') goto yy823;
 yy900:
 	yych = *++p;
-	if (yych == 'A') goto yy901;
-	if (yych != 'a') goto yy822;
+	if (yych == 'T') goto yy859;
+	if (yych == 't') goto yy859;
+	goto yy823;
 yy901:
 	yych = *++p;
-	if (yych == 'D') goto yy858;
-	if (yych == 'd') goto yy858;
-	goto yy822;
+	if (yych == 'A') goto yy902;
+	if (yych != 'a') goto yy823;
 yy902:
 	yych = *++p;
-	if (yych == 'Y') goto yy912;
-	if (yych == 'y') goto yy912;
-	goto yy822;
+	if (yych == 'D') goto yy859;
+	if (yych == 'd') goto yy859;
+	goto yy823;
 yy903:
 	yych = *++p;
-	if (yych == 'R') goto yy909;
-	if (yych == 'r') goto yy909;
-	goto yy822;
+	if (yych == 'Y') goto yy913;
+	if (yych == 'y') goto yy913;
+	goto yy823;
 yy904:
 	yych = *++p;
-	if (yych == 'C') goto yy905;
-	if (yych != 'c') goto yy822;
+	if (yych == 'R') goto yy910;
+	if (yych == 'r') goto yy910;
+	goto yy823;
 yy905:
 	yych = *++p;
-	if (yych == 'T') goto yy906;
-	if (yych != 't') goto yy822;
+	if (yych == 'C') goto yy906;
+	if (yych != 'c') goto yy823;
 yy906:
 	yych = *++p;
-	if (yych == 'I') goto yy907;
-	if (yych != 'i') goto yy822;
+	if (yych == 'T') goto yy907;
+	if (yych != 't') goto yy823;
 yy907:
 	yych = *++p;
-	if (yych == 'O') goto yy908;
-	if (yych != 'o') goto yy822;
+	if (yych == 'I') goto yy908;
+	if (yych != 'i') goto yy823;
 yy908:
 	yych = *++p;
-	if (yych == 'N') goto yy858;
-	if (yych == 'n') goto yy858;
-	goto yy822;
+	if (yych == 'O') goto yy909;
+	if (yych != 'o') goto yy823;
 yy909:
 	yych = *++p;
-	if (yych == 'I') goto yy910;
-	if (yych != 'i') goto yy822;
+	if (yych == 'N') goto yy859;
+	if (yych == 'n') goto yy859;
+	goto yy823;
 yy910:
 	yych = *++p;
-	if (yych == 'P') goto yy911;
-	if (yych != 'p') goto yy822;
+	if (yych == 'I') goto yy911;
+	if (yych != 'i') goto yy823;
 yy911:
 	yych = *++p;
-	if (yych == 'T') goto yy858;
-	if (yych == 't') goto yy858;
-	goto yy822;
+	if (yych == 'P') goto yy912;
+	if (yych != 'p') goto yy823;
 yy912:
 	yych = *++p;
-	if (yych == 'L') goto yy913;
-	if (yych != 'l') goto yy822;
+	if (yych == 'T') goto yy859;
+	if (yych == 't') goto yy859;
+	goto yy823;
 yy913:
 	yych = *++p;
-	if (yych == 'E') goto yy858;
-	if (yych == 'e') goto yy858;
-	goto yy822;
+	if (yych == 'L') goto yy914;
+	if (yych != 'l') goto yy823;
 yy914:
 	yych = *++p;
-	if (yych == 'V') goto yy858;
-	if (yych == 'v') goto yy858;
-	goto yy822;
+	if (yych == 'E') goto yy859;
+	if (yych == 'e') goto yy859;
+	goto yy823;
 yy915:
 	yych = *++p;
-	if (yych == 'L') goto yy924;
-	if (yych == 'l') goto yy924;
-	goto yy822;
+	if (yych == 'V') goto yy859;
+	if (yych == 'v') goto yy859;
+	goto yy823;
 yy916:
 	yych = *++p;
+	if (yych == 'L') goto yy925;
+	if (yych == 'l') goto yy925;
+	goto yy823;
+yy917:
+	yych = *++p;
 	if (yych <= 'P') {
-		if (yych == 'N') goto yy917;
-		if (yych <= 'O') goto yy822;
-		goto yy918;
+		if (yych == 'N') goto yy918;
+		if (yych <= 'O') goto yy823;
+		goto yy919;
 	} else {
 		if (yych <= 'n') {
-			if (yych <= 'm') goto yy822;
+			if (yych <= 'm') goto yy823;
 		} else {
-			if (yych == 'p') goto yy918;
-			goto yy822;
+			if (yych == 'p') goto yy919;
+			goto yy823;
 		}
 	}
-yy917:
-	yych = *++p;
-	if (yych == 'V') goto yy922;
-	if (yych == 'v') goto yy922;
-	goto yy822;
 yy918:
 	yych = *++p;
-	if (yych == 'T') goto yy919;
-	if (yych != 't') goto yy822;
+	if (yych == 'V') goto yy923;
+	if (yych == 'v') goto yy923;
+	goto yy823;
 yy919:
 	yych = *++p;
-	if (yych == 'I') goto yy920;
-	if (yych != 'i') goto yy822;
+	if (yych == 'T') goto yy920;
+	if (yych != 't') goto yy823;
 yy920:
 	yych = *++p;
-	if (yych == 'O') goto yy921;
-	if (yych != 'o') goto yy822;
+	if (yych == 'I') goto yy921;
+	if (yych != 'i') goto yy823;
 yy921:
 	yych = *++p;
-	if (yych == 'N') goto yy858;
-	if (yych == 'n') goto yy858;
-	goto yy822;
+	if (yych == 'O') goto yy922;
+	if (yych != 'o') goto yy823;
 yy922:
 	yych = *++p;
-	if (yych == 'A') goto yy923;
-	if (yych != 'a') goto yy822;
+	if (yych == 'N') goto yy859;
+	if (yych == 'n') goto yy859;
+	goto yy823;
 yy923:
 	yych = *++p;
-	if (yych == 'S') goto yy858;
-	if (yych == 's') goto yy858;
-	goto yy822;
+	if (yych == 'A') goto yy924;
+	if (yych != 'a') goto yy823;
 yy924:
 	yych = *++p;
+	if (yych == 'S') goto yy859;
+	if (yych == 's') goto yy859;
+	goto yy823;
+yy925:
+	yych = *++p;
 	if (yych <= '=') {
 		if (yych <= '\n') {
-			if (yych <= 0x08) goto yy822;
-			goto yy859;
+			if (yych <= 0x08) goto yy823;
+			goto yy860;
 		} else {
-			if (yych == ' ') goto yy859;
-			goto yy822;
+			if (yych == ' ') goto yy860;
+			goto yy823;
 		}
 	} else {
 		if (yych <= 'G') {
-			if (yych <= '>') goto yy859;
-			if (yych <= 'F') goto yy822;
+			if (yych <= '>') goto yy860;
+			if (yych <= 'F') goto yy823;
 		} else {
-			if (yych != 'g') goto yy822;
+			if (yych != 'g') goto yy823;
 		}
 	}
 	yych = *++p;
-	if (yych == 'R') goto yy926;
-	if (yych != 'r') goto yy822;
-yy926:
-	yych = *++p;
-	if (yych == 'O') goto yy927;
-	if (yych != 'o') goto yy822;
+	if (yych == 'R') goto yy927;
+	if (yych != 'r') goto yy823;
 yy927:
 	yych = *++p;
-	if (yych == 'U') goto yy928;
-	if (yych != 'u') goto yy822;
+	if (yych == 'O') goto yy928;
+	if (yych != 'o') goto yy823;
 yy928:
 	yych = *++p;
-	if (yych == 'P') goto yy858;
-	if (yych == 'p') goto yy858;
-	goto yy822;
+	if (yych == 'U') goto yy929;
+	if (yych != 'u') goto yy823;
 yy929:
 	yych = *++p;
-	if (yych == 'T') goto yy934;
-	if (yych == 't') goto yy934;
-	goto yy822;
+	if (yych == 'P') goto yy859;
+	if (yych == 'p') goto yy859;
+	goto yy823;
 yy930:
 	yych = *++p;
-	if (yych == 'J') goto yy931;
-	if (yych != 'j') goto yy822;
+	if (yych == 'T') goto yy935;
+	if (yych == 't') goto yy935;
+	goto yy823;
 yy931:
 	yych = *++p;
-	if (yych == 'E') goto yy932;
-	if (yych != 'e') goto yy822;
+	if (yych == 'J') goto yy932;
+	if (yych != 'j') goto yy823;
 yy932:
 	yych = *++p;
-	if (yych == 'C') goto yy933;
-	if (yych != 'c') goto yy822;
+	if (yych == 'E') goto yy933;
+	if (yych != 'e') goto yy823;
 yy933:
 	yych = *++p;
-	if (yych == 'T') goto yy858;
-	if (yych == 't') goto yy858;
-	goto yy822;
+	if (yych == 'C') goto yy934;
+	if (yych != 'c') goto yy823;
 yy934:
 	yych = *++p;
-	if (yych == 'P') goto yy935;
-	if (yych != 'p') goto yy822;
+	if (yych == 'T') goto yy859;
+	if (yych == 't') goto yy859;
+	goto yy823;
 yy935:
 	yych = *++p;
-	if (yych == 'U') goto yy936;
-	if (yych != 'u') goto yy822;
+	if (yych == 'P') goto yy936;
+	if (yych != 'p') goto yy823;
 yy936:
 	yych = *++p;
-	if (yych == 'T') goto yy858;
-	if (yych == 't') goto yy858;
-	goto yy822;
+	if (yych == 'U') goto yy937;
+	if (yych != 'u') goto yy823;
 yy937:
 	yych = *++p;
-	if (yych == 'P') goto yy858;
-	if (yych == 'p') goto yy858;
-	goto yy822;
+	if (yych == 'T') goto yy859;
+	if (yych == 't') goto yy859;
+	goto yy823;
 yy938:
 	yych = *++p;
-	if (yych == 'T') goto yy949;
-	if (yych == 't') goto yy949;
-	goto yy822;
+	if (yych == 'P') goto yy859;
+	if (yych == 'p') goto yy859;
+	goto yy823;
 yy939:
 	yych = *++p;
-	if (yych == 'D') goto yy948;
-	if (yych == 'd') goto yy948;
-	goto yy822;
+	if (yych == 'T') goto yy950;
+	if (yych == 't') goto yy950;
+	goto yy823;
 yy940:
 	yych = *++p;
-	if (yych == 'O') goto yy941;
-	if (yych != 'o') goto yy822;
+	if (yych == 'D') goto yy949;
+	if (yych == 'd') goto yy949;
+	goto yy823;
 yy941:
 	yych = *++p;
-	if (yych == 'C') goto yy942;
-	if (yych != 'c') goto yy822;
+	if (yych == 'O') goto yy942;
+	if (yych != 'o') goto yy823;
 yy942:
 	yych = *++p;
-	if (yych == 'K') goto yy943;
-	if (yych != 'k') goto yy822;
+	if (yych == 'C') goto yy943;
+	if (yych != 'c') goto yy823;
 yy943:
 	yych = *++p;
-	if (yych == 'Q') goto yy944;
-	if (yych != 'q') goto yy822;
+	if (yych == 'K') goto yy944;
+	if (yych != 'k') goto yy823;
 yy944:
 	yych = *++p;
-	if (yych == 'U') goto yy945;
-	if (yych != 'u') goto yy822;
+	if (yych == 'Q') goto yy945;
+	if (yych != 'q') goto yy823;
 yy945:
 	yych = *++p;
-	if (yych == 'O') goto yy946;
-	if (yych != 'o') goto yy822;
+	if (yych == 'U') goto yy946;
+	if (yych != 'u') goto yy823;
 yy946:
 	yych = *++p;
-	if (yych == 'T') goto yy947;
-	if (yych != 't') goto yy822;
+	if (yych == 'O') goto yy947;
+	if (yych != 'o') goto yy823;
 yy947:
 	yych = *++p;
-	if (yych == 'E') goto yy858;
-	if (yych == 'e') goto yy858;
-	goto yy822;
+	if (yych == 'T') goto yy948;
+	if (yych != 't') goto yy823;
 yy948:
 	yych = *++p;
-	if (yych == 'Y') goto yy858;
-	if (yych == 'y') goto yy858;
-	goto yy822;
+	if (yych == 'E') goto yy859;
+	if (yych == 'e') goto yy859;
+	goto yy823;
 yy949:
 	yych = *++p;
-	if (yych == 'T') goto yy950;
-	if (yych != 't') goto yy822;
+	if (yych == 'Y') goto yy859;
+	if (yych == 'y') goto yy859;
+	goto yy823;
 yy950:
 	yych = *++p;
-	if (yych == 'O') goto yy951;
-	if (yych != 'o') goto yy822;
+	if (yych == 'T') goto yy951;
+	if (yych != 't') goto yy823;
 yy951:
 	yych = *++p;
-	if (yych == 'N') goto yy858;
-	if (yych == 'n') goto yy858;
-	goto yy822;
+	if (yych == 'O') goto yy952;
+	if (yych != 'o') goto yy823;
 yy952:
 	yych = *++p;
-	if (yych == 'R') goto yy953;
-	if (yych != 'r') goto yy822;
+	if (yych == 'N') goto yy859;
+	if (yych == 'n') goto yy859;
+	goto yy823;
 yy953:
 	yych = *++p;
-	if (yych == 'A') goto yy954;
-	if (yych != 'a') goto yy822;
+	if (yych == 'R') goto yy954;
+	if (yych != 'r') goto yy823;
 yy954:
 	yych = *++p;
-	if (yych == 'M') goto yy955;
-	if (yych != 'm') goto yy822;
+	if (yych == 'A') goto yy955;
+	if (yych != 'a') goto yy823;
 yy955:
 	yych = *++p;
-	if (yych == 'E') goto yy858;
-	if (yych == 'e') goto yy858;
-	goto yy822;
+	if (yych == 'M') goto yy956;
+	if (yych != 'm') goto yy823;
 yy956:
 	yych = *++p;
-	if (yych == 'R') goto yy961;
-	if (yych == 'r') goto yy961;
-	goto yy822;
+	if (yych == 'E') goto yy859;
+	if (yych == 'e') goto yy859;
+	goto yy823;
 yy957:
 	yych = *++p;
-	if (yych == 'A') goto yy958;
-	if (yych != 'a') goto yy822;
+	if (yych == 'R') goto yy962;
+	if (yych == 'r') goto yy962;
+	goto yy823;
 yy958:
 	yych = *++p;
-	if (yych == 'D') goto yy959;
-	if (yych != 'd') goto yy822;
+	if (yych == 'A') goto yy959;
+	if (yych != 'a') goto yy823;
 yy959:
 	yych = *++p;
-	if (yych == 'E') goto yy960;
-	if (yych != 'e') goto yy822;
+	if (yych == 'D') goto yy960;
+	if (yych != 'd') goto yy823;
 yy960:
 	yych = *++p;
-	if (yych == 'R') goto yy858;
-	if (yych == 'r') goto yy858;
-	goto yy822;
+	if (yych == 'E') goto yy961;
+	if (yych != 'e') goto yy823;
 yy961:
 	yych = *++p;
-	if (yych == 'O') goto yy962;
-	if (yych != 'o') goto yy822;
+	if (yych == 'R') goto yy859;
+	if (yych == 'r') goto yy859;
+	goto yy823;
 yy962:
 	yych = *++p;
-	if (yych == 'U') goto yy963;
-	if (yych != 'u') goto yy822;
+	if (yych == 'O') goto yy963;
+	if (yych != 'o') goto yy823;
 yy963:
 	yych = *++p;
-	if (yych == 'P') goto yy858;
-	if (yych == 'p') goto yy858;
-	goto yy822;
+	if (yych == 'U') goto yy964;
+	if (yych != 'u') goto yy823;
 yy964:
 	yych = *++p;
-	if (yych == 'I') goto yy970;
-	if (yych == 'i') goto yy970;
-	goto yy822;
+	if (yych == 'P') goto yy859;
+	if (yych == 'p') goto yy859;
+	goto yy823;
 yy965:
 	yych = *++p;
-	if (yych == 'T') goto yy966;
-	if (yych != 't') goto yy822;
+	if (yych == 'I') goto yy971;
+	if (yych == 'i') goto yy971;
+	goto yy823;
 yy966:
 	yych = *++p;
-	if (yych == 'I') goto yy967;
-	if (yych != 'i') goto yy822;
+	if (yych == 'T') goto yy967;
+	if (yych != 't') goto yy823;
 yy967:
 	yych = *++p;
-	if (yych == 'C') goto yy968;
-	if (yych != 'c') goto yy822;
+	if (yych == 'I') goto yy968;
+	if (yych != 'i') goto yy823;
 yy968:
 	yych = *++p;
-	if (yych == 'L') goto yy969;
-	if (yych != 'l') goto yy822;
+	if (yych == 'C') goto yy969;
+	if (yych != 'c') goto yy823;
 yy969:
 	yych = *++p;
-	if (yych == 'E') goto yy858;
-	if (yych == 'e') goto yy858;
-	goto yy822;
+	if (yych == 'L') goto yy970;
+	if (yych != 'l') goto yy823;
 yy970:
 	yych = *++p;
-	if (yych == 'D') goto yy971;
-	if (yych != 'd') goto yy822;
+	if (yych == 'E') goto yy859;
+	if (yych == 'e') goto yy859;
+	goto yy823;
 yy971:
 	yych = *++p;
-	if (yych == 'E') goto yy858;
-	if (yych == 'e') goto yy858;
-	goto yy822;
+	if (yych == 'D') goto yy972;
+	if (yych != 'd') goto yy823;
 yy972:
 	yych = *++p;
+	if (yych == 'E') goto yy859;
+	if (yych == 'e') goto yy859;
+	goto yy823;
+yy973:
+	yych = *++p;
 	if (yych <= 'O') {
-		if (yych == 'E') goto yy858;
-		if (yych <= 'N') goto yy822;
+		if (yych == 'E') goto yy859;
+		if (yych <= 'N') goto yy823;
 	} else {
 		if (yych <= 'e') {
-			if (yych <= 'd') goto yy822;
-			goto yy858;
+			if (yych <= 'd') goto yy823;
+			goto yy859;
 		} else {
-			if (yych != 'o') goto yy822;
+			if (yych != 'o') goto yy823;
 		}
 	}
 	yych = *++p;
-	if (yych == 'G') goto yy974;
-	if (yych != 'g') goto yy822;
-yy974:
-	yych = *++p;
-	if (yych == 'R') goto yy975;
-	if (yych != 'r') goto yy822;
+	if (yych == 'G') goto yy975;
+	if (yych != 'g') goto yy823;
 yy975:
 	yych = *++p;
-	if (yych == 'E') goto yy976;
-	if (yych != 'e') goto yy822;
+	if (yych == 'R') goto yy976;
+	if (yych != 'r') goto yy823;
 yy976:
 	yych = *++p;
-	if (yych == 'S') goto yy977;
-	if (yych != 's') goto yy822;
+	if (yych == 'E') goto yy977;
+	if (yych != 'e') goto yy823;
 yy977:
 	yych = *++p;
-	if (yych == 'S') goto yy858;
-	if (yych == 's') goto yy858;
-	goto yy822;
+	if (yych == 'S') goto yy978;
+	if (yych != 's') goto yy823;
 yy978:
 	yych = *++p;
-	if (yych == 'D') goto yy979;
-	if (yych != 'd') goto yy822;
+	if (yych == 'S') goto yy859;
+	if (yych == 's') goto yy859;
+	goto yy823;
 yy979:
 	yych = *++p;
-	if (yych == 'E') goto yy980;
-	if (yych != 'e') goto yy822;
+	if (yych == 'D') goto yy980;
+	if (yych != 'd') goto yy823;
 yy980:
 	yych = *++p;
-	if (yych == 'O') goto yy981;
-	if (yych != 'o') goto yy822;
+	if (yych == 'E') goto yy981;
+	if (yych != 'e') goto yy823;
 yy981:
 	yych = *++p;
+	if (yych == 'O') goto yy982;
+	if (yych != 'o') goto yy823;
+yy982:
+	yych = *++p;
 	if (yych <= ' ') {
-		if (yych <= 0x08) goto yy822;
-		if (yych <= '\n') goto yy982;
-		if (yych <= 0x1F) goto yy822;
+		if (yych <= 0x08) goto yy823;
+		if (yych <= '\n') goto yy983;
+		if (yych <= 0x1F) goto yy823;
 	} else {
 		if (yych <= '/') {
-			if (yych <= '.') goto yy822;
+			if (yych <= '.') goto yy823;
 		} else {
-			if (yych != '>') goto yy822;
+			if (yych != '>') goto yy823;
 		}
 	}
-yy982:
+yy983:
 	++p;
 	{ return (p - start); }
-yy984:
+yy985:
 	yych = *++p;
 	if (yych <= 'R') {
-		if (yych == 'O') goto yy1000;
-		if (yych <= 'Q') goto yy822;
-		goto yy1001;
+		if (yych == 'O') goto yy1001;
+		if (yych <= 'Q') goto yy823;
+		goto yy1002;
 	} else {
 		if (yych <= 'o') {
-			if (yych <= 'n') goto yy822;
-			goto yy1000;
+			if (yych <= 'n') goto yy823;
+			goto yy1001;
 		} else {
-			if (yych == 'r') goto yy1001;
-			goto yy822;
+			if (yych == 'r') goto yy1002;
+			goto yy823;
 		}
 	}
-yy985:
+yy986:
 	yych = *++p;
 	if (yych <= 'G') {
-		if (yych == 'E') goto yy986;
-		if (yych <= 'F') goto yy822;
-		goto yy987;
+		if (yych == 'E') goto yy987;
+		if (yych <= 'F') goto yy823;
+		goto yy988;
 	} else {
 		if (yych <= 'e') {
-			if (yych <= 'd') goto yy822;
+			if (yych <= 'd') goto yy823;
 		} else {
-			if (yych == 'g') goto yy987;
-			goto yy822;
+			if (yych == 'g') goto yy988;
+			goto yy823;
 		}
 	}
-yy986:
-	yych = *++p;
-	if (yych == 'L') goto yy996;
-	if (yych == 'l') goto yy996;
-	goto yy822;
 yy987:
 	yych = *++p;
+	if (yych == 'L') goto yy997;
+	if (yych == 'l') goto yy997;
+	goto yy823;
+yy988:
+	yych = *++p;
 	if (yych <= 'U') {
-		if (yych == 'C') goto yy989;
-		if (yych <= 'T') goto yy822;
+		if (yych == 'C') goto yy990;
+		if (yych <= 'T') goto yy823;
 	} else {
 		if (yych <= 'c') {
-			if (yych <= 'b') goto yy822;
-			goto yy989;
+			if (yych <= 'b') goto yy823;
+			goto yy990;
 		} else {
-			if (yych != 'u') goto yy822;
+			if (yych != 'u') goto yy823;
 		}
 	}
 	yych = *++p;
-	if (yych == 'R') goto yy995;
-	if (yych == 'r') goto yy995;
-	goto yy822;
-yy989:
-	yych = *++p;
-	if (yych == 'A') goto yy990;
-	if (yych != 'a') goto yy822;
+	if (yych == 'R') goto yy996;
+	if (yych == 'r') goto yy996;
+	goto yy823;
 yy990:
 	yych = *++p;
-	if (yych == 'P') goto yy991;
-	if (yych != 'p') goto yy822;
+	if (yych == 'A') goto yy991;
+	if (yych != 'a') goto yy823;
 yy991:
 	yych = *++p;
-	if (yych == 'T') goto yy992;
-	if (yych != 't') goto yy822;
+	if (yych == 'P') goto yy992;
+	if (yych != 'p') goto yy823;
 yy992:
 	yych = *++p;
-	if (yych == 'I') goto yy993;
-	if (yych != 'i') goto yy822;
+	if (yych == 'T') goto yy993;
+	if (yych != 't') goto yy823;
 yy993:
 	yych = *++p;
-	if (yych == 'O') goto yy994;
-	if (yych != 'o') goto yy822;
+	if (yych == 'I') goto yy994;
+	if (yych != 'i') goto yy823;
 yy994:
 	yych = *++p;
-	if (yych == 'N') goto yy981;
-	if (yych == 'n') goto yy981;
-	goto yy822;
+	if (yych == 'O') goto yy995;
+	if (yych != 'o') goto yy823;
 yy995:
 	yych = *++p;
-	if (yych == 'E') goto yy981;
-	if (yych == 'e') goto yy981;
-	goto yy822;
+	if (yych == 'N') goto yy982;
+	if (yych == 'n') goto yy982;
+	goto yy823;
 yy996:
 	yych = *++p;
-	if (yych == 'D') goto yy997;
-	if (yych != 'd') goto yy822;
+	if (yych == 'E') goto yy982;
+	if (yych == 'e') goto yy982;
+	goto yy823;
 yy997:
 	yych = *++p;
-	if (yych == 'S') goto yy998;
-	if (yych != 's') goto yy822;
+	if (yych == 'D') goto yy998;
+	if (yych != 'd') goto yy823;
 yy998:
 	yych = *++p;
-	if (yych == 'E') goto yy999;
-	if (yych != 'e') goto yy822;
+	if (yych == 'S') goto yy999;
+	if (yych != 's') goto yy823;
 yy999:
 	yych = *++p;
-	if (yych == 'T') goto yy981;
-	if (yych == 't') goto yy981;
-	goto yy822;
+	if (yych == 'E') goto yy1000;
+	if (yych != 'e') goto yy823;
 yy1000:
 	yych = *++p;
-	if (yych == 'T') goto yy1002;
-	if (yych == 't') goto yy1002;
-	goto yy822;
+	if (yych == 'T') goto yy982;
+	if (yych == 't') goto yy982;
+	goto yy823;
 yy1001:
 	yych = *++p;
-	if (yych == 'M') goto yy981;
-	if (yych == 'm') goto yy981;
-	goto yy822;
+	if (yych == 'T') goto yy1003;
+	if (yych == 't') goto yy1003;
+	goto yy823;
 yy1002:
 	yych = *++p;
-	if (yych == 'E') goto yy1003;
-	if (yych != 'e') goto yy822;
+	if (yych == 'M') goto yy982;
+	if (yych == 'm') goto yy982;
+	goto yy823;
 yy1003:
 	yych = *++p;
-	if (yych == 'R') goto yy981;
-	if (yych == 'r') goto yy981;
-	goto yy822;
+	if (yych == 'E') goto yy1004;
+	if (yych != 'e') goto yy823;
 yy1004:
 	yych = *++p;
-	if (yych == 'B') goto yy1005;
-	if (yych != 'b') goto yy822;
+	if (yych == 'R') goto yy982;
+	if (yych == 'r') goto yy982;
+	goto yy823;
 yy1005:
 	yych = *++p;
-	if (yych == 'E') goto yy1006;
-	if (yych != 'e') goto yy822;
+	if (yych == 'B') goto yy1006;
+	if (yych != 'b') goto yy823;
 yy1006:
 	yych = *++p;
-	if (yych == 'D') goto yy981;
-	if (yych == 'd') goto yy981;
-	goto yy822;
+	if (yych == 'E') goto yy1007;
+	if (yych != 'e') goto yy823;
 yy1007:
 	yych = *++p;
+	if (yych == 'D') goto yy982;
+	if (yych == 'd') goto yy982;
+	goto yy823;
+yy1008:
+	yych = *++p;
 	if (yych <= '/') {
 		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy822;
-			if (yych <= '\n') goto yy982;
-			goto yy822;
+			if (yych <= 0x08) goto yy823;
+			if (yych <= '\n') goto yy983;
+			goto yy823;
 		} else {
-			if (yych <= ' ') goto yy982;
-			if (yych <= '.') goto yy822;
-			goto yy982;
+			if (yych <= ' ') goto yy983;
+			if (yych <= '.') goto yy823;
+			goto yy983;
 		}
 	} else {
 		if (yych <= 'D') {
-			if (yych == '>') goto yy982;
-			goto yy822;
+			if (yych == '>') goto yy983;
+			goto yy823;
 		} else {
-			if (yych <= 'E') goto yy1023;
-			if (yych == 'e') goto yy1023;
-			goto yy822;
+			if (yych <= 'E') goto yy1024;
+			if (yych == 'e') goto yy1024;
+			goto yy823;
 		}
 	}
-yy1008:
-	yych = *++p;
-	if (yych == 'O') goto yy1021;
-	if (yych == 'o') goto yy1021;
-	goto yy822;
 yy1009:
 	yych = *++p;
-	if (yych == 'X') goto yy1016;
-	if (yych == 'x') goto yy1016;
-	goto yy822;
+	if (yych == 'O') goto yy1022;
+	if (yych == 'o') goto yy1022;
+	goto yy823;
 yy1010:
 	yych = *++p;
-	if (yych == 'O') goto yy1014;
-	if (yych == 'o') goto yy1014;
-	goto yy822;
+	if (yych == 'X') goto yy1017;
+	if (yych == 'x') goto yy1017;
+	goto yy823;
 yy1011:
 	yych = *++p;
-	if (yych == 'B') goto yy1012;
-	if (yych != 'b') goto yy822;
+	if (yych == 'O') goto yy1015;
+	if (yych == 'o') goto yy1015;
+	goto yy823;
 yy1012:
 	yych = *++p;
-	if (yych == 'L') goto yy1013;
-	if (yych != 'l') goto yy822;
+	if (yych == 'B') goto yy1013;
+	if (yych != 'b') goto yy823;
 yy1013:
 	yych = *++p;
-	if (yych == 'E') goto yy981;
-	if (yych == 'e') goto yy981;
-	goto yy822;
+	if (yych == 'L') goto yy1014;
+	if (yych != 'l') goto yy823;
 yy1014:
 	yych = *++p;
-	if (yych == 'D') goto yy1015;
-	if (yych != 'd') goto yy822;
+	if (yych == 'E') goto yy982;
+	if (yych == 'e') goto yy982;
+	goto yy823;
 yy1015:
 	yych = *++p;
-	if (yych == 'Y') goto yy981;
-	if (yych == 'y') goto yy981;
-	goto yy822;
+	if (yych == 'D') goto yy1016;
+	if (yych != 'd') goto yy823;
 yy1016:
 	yych = *++p;
-	if (yych == 'T') goto yy1017;
-	if (yych != 't') goto yy822;
+	if (yych == 'Y') goto yy982;
+	if (yych == 'y') goto yy982;
+	goto yy823;
 yy1017:
 	yych = *++p;
-	if (yych == 'A') goto yy1018;
-	if (yych != 'a') goto yy822;
+	if (yych == 'T') goto yy1018;
+	if (yych != 't') goto yy823;
 yy1018:
 	yych = *++p;
-	if (yych == 'R') goto yy1019;
-	if (yych != 'r') goto yy822;
+	if (yych == 'A') goto yy1019;
+	if (yych != 'a') goto yy823;
 yy1019:
 	yych = *++p;
-	if (yych == 'E') goto yy1020;
-	if (yych != 'e') goto yy822;
+	if (yych == 'R') goto yy1020;
+	if (yych != 'r') goto yy823;
 yy1020:
 	yych = *++p;
-	if (yych == 'A') goto yy981;
-	if (yych == 'a') goto yy981;
-	goto yy822;
+	if (yych == 'E') goto yy1021;
+	if (yych != 'e') goto yy823;
 yy1021:
 	yych = *++p;
-	if (yych == 'O') goto yy1022;
-	if (yych != 'o') goto yy822;
+	if (yych == 'A') goto yy982;
+	if (yych == 'a') goto yy982;
+	goto yy823;
 yy1022:
 	yych = *++p;
-	if (yych == 'T') goto yy981;
-	if (yych == 't') goto yy981;
-	goto yy822;
+	if (yych == 'O') goto yy1023;
+	if (yych != 'o') goto yy823;
 yy1023:
 	yych = *++p;
-	if (yych == 'A') goto yy1024;
-	if (yych != 'a') goto yy822;
+	if (yych == 'T') goto yy982;
+	if (yych == 't') goto yy982;
+	goto yy823;
 yy1024:
 	yych = *++p;
-	if (yych == 'D') goto yy981;
-	if (yych == 'd') goto yy981;
-	goto yy822;
+	if (yych == 'A') goto yy1025;
+	if (yych != 'a') goto yy823;
 yy1025:
 	yych = *++p;
-	if (yych == 'Y') goto yy1035;
-	if (yych == 'y') goto yy1035;
-	goto yy822;
+	if (yych == 'D') goto yy982;
+	if (yych == 'd') goto yy982;
+	goto yy823;
 yy1026:
 	yych = *++p;
-	if (yych == 'R') goto yy1032;
-	if (yych == 'r') goto yy1032;
-	goto yy822;
+	if (yych == 'Y') goto yy1036;
+	if (yych == 'y') goto yy1036;
+	goto yy823;
 yy1027:
 	yych = *++p;
-	if (yych == 'C') goto yy1028;
-	if (yych != 'c') goto yy822;
+	if (yych == 'R') goto yy1033;
+	if (yych == 'r') goto yy1033;
+	goto yy823;
 yy1028:
 	yych = *++p;
-	if (yych == 'T') goto yy1029;
-	if (yych != 't') goto yy822;
+	if (yych == 'C') goto yy1029;
+	if (yych != 'c') goto yy823;
 yy1029:
 	yych = *++p;
-	if (yych == 'I') goto yy1030;
-	if (yych != 'i') goto yy822;
+	if (yych == 'T') goto yy1030;
+	if (yych != 't') goto yy823;
 yy1030:
 	yych = *++p;
-	if (yych == 'O') goto yy1031;
-	if (yych != 'o') goto yy822;
+	if (yych == 'I') goto yy1031;
+	if (yych != 'i') goto yy823;
 yy1031:
 	yych = *++p;
-	if (yych == 'N') goto yy981;
-	if (yych == 'n') goto yy981;
-	goto yy822;
+	if (yych == 'O') goto yy1032;
+	if (yych != 'o') goto yy823;
 yy1032:
 	yych = *++p;
-	if (yych == 'I') goto yy1033;
-	if (yych != 'i') goto yy822;
+	if (yych == 'N') goto yy982;
+	if (yych == 'n') goto yy982;
+	goto yy823;
 yy1033:
 	yych = *++p;
-	if (yych == 'P') goto yy1034;
-	if (yych != 'p') goto yy822;
+	if (yych == 'I') goto yy1034;
+	if (yych != 'i') goto yy823;
 yy1034:
 	yych = *++p;
-	if (yych == 'T') goto yy981;
-	if (yych == 't') goto yy981;
-	goto yy822;
+	if (yych == 'P') goto yy1035;
+	if (yych != 'p') goto yy823;
 yy1035:
 	yych = *++p;
-	if (yych == 'L') goto yy1036;
-	if (yych != 'l') goto yy822;
+	if (yych == 'T') goto yy982;
+	if (yych == 't') goto yy982;
+	goto yy823;
 yy1036:
 	yych = *++p;
-	if (yych == 'E') goto yy981;
-	if (yych == 'e') goto yy981;
-	goto yy822;
+	if (yych == 'L') goto yy1037;
+	if (yych != 'l') goto yy823;
 yy1037:
 	yych = *++p;
-	if (yych == 'V') goto yy981;
-	if (yych == 'v') goto yy981;
-	goto yy822;
+	if (yych == 'E') goto yy982;
+	if (yych == 'e') goto yy982;
+	goto yy823;
 yy1038:
 	yych = *++p;
-	if (yych == 'L') goto yy1047;
-	if (yych == 'l') goto yy1047;
-	goto yy822;
+	if (yych == 'V') goto yy982;
+	if (yych == 'v') goto yy982;
+	goto yy823;
 yy1039:
 	yych = *++p;
+	if (yych == 'L') goto yy1048;
+	if (yych == 'l') goto yy1048;
+	goto yy823;
+yy1040:
+	yych = *++p;
 	if (yych <= 'P') {
-		if (yych == 'N') goto yy1040;
-		if (yych <= 'O') goto yy822;
-		goto yy1041;
+		if (yych == 'N') goto yy1041;
+		if (yych <= 'O') goto yy823;
+		goto yy1042;
 	} else {
 		if (yych <= 'n') {
-			if (yych <= 'm') goto yy822;
+			if (yych <= 'm') goto yy823;
 		} else {
-			if (yych == 'p') goto yy1041;
-			goto yy822;
+			if (yych == 'p') goto yy1042;
+			goto yy823;
 		}
 	}
-yy1040:
-	yych = *++p;
-	if (yych == 'V') goto yy1045;
-	if (yych == 'v') goto yy1045;
-	goto yy822;
 yy1041:
 	yych = *++p;
-	if (yych == 'T') goto yy1042;
-	if (yych != 't') goto yy822;
+	if (yych == 'V') goto yy1046;
+	if (yych == 'v') goto yy1046;
+	goto yy823;
 yy1042:
 	yych = *++p;
-	if (yych == 'I') goto yy1043;
-	if (yych != 'i') goto yy822;
+	if (yych == 'T') goto yy1043;
+	if (yych != 't') goto yy823;
 yy1043:
 	yych = *++p;
-	if (yych == 'O') goto yy1044;
-	if (yych != 'o') goto yy822;
+	if (yych == 'I') goto yy1044;
+	if (yych != 'i') goto yy823;
 yy1044:
 	yych = *++p;
-	if (yych == 'N') goto yy981;
-	if (yych == 'n') goto yy981;
-	goto yy822;
+	if (yych == 'O') goto yy1045;
+	if (yych != 'o') goto yy823;
 yy1045:
 	yych = *++p;
-	if (yych == 'A') goto yy1046;
-	if (yych != 'a') goto yy822;
+	if (yych == 'N') goto yy982;
+	if (yych == 'n') goto yy982;
+	goto yy823;
 yy1046:
 	yych = *++p;
-	if (yych == 'S') goto yy981;
-	if (yych == 's') goto yy981;
-	goto yy822;
+	if (yych == 'A') goto yy1047;
+	if (yych != 'a') goto yy823;
 yy1047:
 	yych = *++p;
+	if (yych == 'S') goto yy982;
+	if (yych == 's') goto yy982;
+	goto yy823;
+yy1048:
+	yych = *++p;
 	if (yych <= '/') {
 		if (yych <= 0x1F) {
-			if (yych <= 0x08) goto yy822;
-			if (yych <= '\n') goto yy982;
-			goto yy822;
+			if (yych <= 0x08) goto yy823;
+			if (yych <= '\n') goto yy983;
+			goto yy823;
 		} else {
-			if (yych <= ' ') goto yy982;
-			if (yych <= '.') goto yy822;
-			goto yy982;
+			if (yych <= ' ') goto yy983;
+			if (yych <= '.') goto yy823;
+			goto yy983;
 		}
 	} else {
 		if (yych <= 'F') {
-			if (yych == '>') goto yy982;
-			goto yy822;
+			if (yych == '>') goto yy983;
+			goto yy823;
 		} else {
-			if (yych <= 'G') goto yy1048;
-			if (yych != 'g') goto yy822;
+			if (yych <= 'G') goto yy1049;
+			if (yych != 'g') goto yy823;
 		}
 	}
-yy1048:
-	yych = *++p;
-	if (yych == 'R') goto yy1049;
-	if (yych != 'r') goto yy822;
 yy1049:
 	yych = *++p;
-	if (yych == 'O') goto yy1050;
-	if (yych != 'o') goto yy822;
+	if (yych == 'R') goto yy1050;
+	if (yych != 'r') goto yy823;
 yy1050:
 	yych = *++p;
-	if (yych == 'U') goto yy1051;
-	if (yych != 'u') goto yy822;
+	if (yych == 'O') goto yy1051;
+	if (yych != 'o') goto yy823;
 yy1051:
 	yych = *++p;
-	if (yych == 'P') goto yy981;
-	if (yych == 'p') goto yy981;
-	goto yy822;
+	if (yych == 'U') goto yy1052;
+	if (yych != 'u') goto yy823;
 yy1052:
 	yych = *++p;
-	if (yych == 'T') goto yy1057;
-	if (yych == 't') goto yy1057;
-	goto yy822;
+	if (yych == 'P') goto yy982;
+	if (yych == 'p') goto yy982;
+	goto yy823;
 yy1053:
 	yych = *++p;
-	if (yych == 'J') goto yy1054;
-	if (yych != 'j') goto yy822;
+	if (yych == 'T') goto yy1058;
+	if (yych == 't') goto yy1058;
+	goto yy823;
 yy1054:
 	yych = *++p;
-	if (yych == 'E') goto yy1055;
-	if (yych != 'e') goto yy822;
+	if (yych == 'J') goto yy1055;
+	if (yych != 'j') goto yy823;
 yy1055:
 	yych = *++p;
-	if (yych == 'C') goto yy1056;
-	if (yych != 'c') goto yy822;
+	if (yych == 'E') goto yy1056;
+	if (yych != 'e') goto yy823;
 yy1056:
 	yych = *++p;
-	if (yych == 'T') goto yy981;
-	if (yych == 't') goto yy981;
-	goto yy822;
+	if (yych == 'C') goto yy1057;
+	if (yych != 'c') goto yy823;
 yy1057:
 	yych = *++p;
-	if (yych == 'P') goto yy1058;
-	if (yych != 'p') goto yy822;
+	if (yych == 'T') goto yy982;
+	if (yych == 't') goto yy982;
+	goto yy823;
 yy1058:
 	yych = *++p;
-	if (yych == 'U') goto yy1059;
-	if (yych != 'u') goto yy822;
+	if (yych == 'P') goto yy1059;
+	if (yych != 'p') goto yy823;
 yy1059:
 	yych = *++p;
-	if (yych == 'T') goto yy981;
-	if (yych == 't') goto yy981;
-	goto yy822;
+	if (yych == 'U') goto yy1060;
+	if (yych != 'u') goto yy823;
 yy1060:
 	yych = *++p;
-	if (yych == 'P') goto yy981;
-	if (yych == 'p') goto yy981;
-	goto yy822;
+	if (yych == 'T') goto yy982;
+	if (yych == 't') goto yy982;
+	goto yy823;
 yy1061:
 	yych = *++p;
-	if (yych == 'T') goto yy1072;
-	if (yych == 't') goto yy1072;
-	goto yy822;
+	if (yych == 'P') goto yy982;
+	if (yych == 'p') goto yy982;
+	goto yy823;
 yy1062:
 	yych = *++p;
-	if (yych == 'D') goto yy1071;
-	if (yych == 'd') goto yy1071;
-	goto yy822;
+	if (yych == 'T') goto yy1073;
+	if (yych == 't') goto yy1073;
+	goto yy823;
 yy1063:
 	yych = *++p;
-	if (yych == 'O') goto yy1064;
-	if (yych != 'o') goto yy822;
+	if (yych == 'D') goto yy1072;
+	if (yych == 'd') goto yy1072;
+	goto yy823;
 yy1064:
 	yych = *++p;
-	if (yych == 'C') goto yy1065;
-	if (yych != 'c') goto yy822;
+	if (yych == 'O') goto yy1065;
+	if (yych != 'o') goto yy823;
 yy1065:
 	yych = *++p;
-	if (yych == 'K') goto yy1066;
-	if (yych != 'k') goto yy822;
+	if (yych == 'C') goto yy1066;
+	if (yych != 'c') goto yy823;
 yy1066:
 	yych = *++p;
-	if (yych == 'Q') goto yy1067;
-	if (yych != 'q') goto yy822;
+	if (yych == 'K') goto yy1067;
+	if (yych != 'k') goto yy823;
 yy1067:
 	yych = *++p;
-	if (yych == 'U') goto yy1068;
-	if (yych != 'u') goto yy822;
+	if (yych == 'Q') goto yy1068;
+	if (yych != 'q') goto yy823;
 yy1068:
 	yych = *++p;
-	if (yych == 'O') goto yy1069;
-	if (yych != 'o') goto yy822;
+	if (yych == 'U') goto yy1069;
+	if (yych != 'u') goto yy823;
 yy1069:
 	yych = *++p;
-	if (yych == 'T') goto yy1070;
-	if (yych != 't') goto yy822;
+	if (yych == 'O') goto yy1070;
+	if (yych != 'o') goto yy823;
 yy1070:
 	yych = *++p;
-	if (yych == 'E') goto yy981;
-	if (yych == 'e') goto yy981;
-	goto yy822;
+	if (yych == 'T') goto yy1071;
+	if (yych != 't') goto yy823;
 yy1071:
 	yych = *++p;
-	if (yych == 'Y') goto yy981;
-	if (yych == 'y') goto yy981;
-	goto yy822;
+	if (yych == 'E') goto yy982;
+	if (yych == 'e') goto yy982;
+	goto yy823;
 yy1072:
 	yych = *++p;
-	if (yych == 'T') goto yy1073;
-	if (yych != 't') goto yy822;
+	if (yych == 'Y') goto yy982;
+	if (yych == 'y') goto yy982;
+	goto yy823;
 yy1073:
 	yych = *++p;
-	if (yych == 'O') goto yy1074;
-	if (yych != 'o') goto yy822;
+	if (yych == 'T') goto yy1074;
+	if (yych != 't') goto yy823;
 yy1074:
 	yych = *++p;
-	if (yych == 'N') goto yy981;
-	if (yych == 'n') goto yy981;
-	goto yy822;
+	if (yych == 'O') goto yy1075;
+	if (yych != 'o') goto yy823;
 yy1075:
 	yych = *++p;
-	if (yych == 'R') goto yy1076;
-	if (yych != 'r') goto yy822;
+	if (yych == 'N') goto yy982;
+	if (yych == 'n') goto yy982;
+	goto yy823;
 yy1076:
 	yych = *++p;
-	if (yych == 'A') goto yy1077;
-	if (yych != 'a') goto yy822;
+	if (yych == 'R') goto yy1077;
+	if (yych != 'r') goto yy823;
 yy1077:
 	yych = *++p;
-	if (yych == 'M') goto yy1078;
-	if (yych != 'm') goto yy822;
+	if (yych == 'A') goto yy1078;
+	if (yych != 'a') goto yy823;
 yy1078:
 	yych = *++p;
-	if (yych == 'E') goto yy981;
-	if (yych == 'e') goto yy981;
-	goto yy822;
+	if (yych == 'M') goto yy1079;
+	if (yych != 'm') goto yy823;
 yy1079:
 	yych = *++p;
-	if (yych == 'R') goto yy1084;
-	if (yych == 'r') goto yy1084;
-	goto yy822;
+	if (yych == 'E') goto yy982;
+	if (yych == 'e') goto yy982;
+	goto yy823;
 yy1080:
 	yych = *++p;
-	if (yych == 'A') goto yy1081;
-	if (yych != 'a') goto yy822;
+	if (yych == 'R') goto yy1085;
+	if (yych == 'r') goto yy1085;
+	goto yy823;
 yy1081:
 	yych = *++p;
-	if (yych == 'D') goto yy1082;
-	if (yych != 'd') goto yy822;
+	if (yych == 'A') goto yy1082;
+	if (yych != 'a') goto yy823;
 yy1082:
 	yych = *++p;
-	if (yych == 'E') goto yy1083;
-	if (yych != 'e') goto yy822;
+	if (yych == 'D') goto yy1083;
+	if (yych != 'd') goto yy823;
 yy1083:
 	yych = *++p;
-	if (yych == 'R') goto yy981;
-	if (yych == 'r') goto yy981;
-	goto yy822;
+	if (yych == 'E') goto yy1084;
+	if (yych != 'e') goto yy823;
 yy1084:
 	yych = *++p;
-	if (yych == 'O') goto yy1085;
-	if (yych != 'o') goto yy822;
+	if (yych == 'R') goto yy982;
+	if (yych == 'r') goto yy982;
+	goto yy823;
 yy1085:
 	yych = *++p;
-	if (yych == 'U') goto yy1086;
-	if (yych != 'u') goto yy822;
+	if (yych == 'O') goto yy1086;
+	if (yych != 'o') goto yy823;
 yy1086:
 	yych = *++p;
-	if (yych == 'P') goto yy981;
-	if (yych == 'p') goto yy981;
-	goto yy822;
+	if (yych == 'U') goto yy1087;
+	if (yych != 'u') goto yy823;
 yy1087:
 	yych = *++p;
-	if (yych == 'I') goto yy1093;
-	if (yych == 'i') goto yy1093;
-	goto yy822;
+	if (yych == 'P') goto yy982;
+	if (yych == 'p') goto yy982;
+	goto yy823;
 yy1088:
 	yych = *++p;
-	if (yych == 'T') goto yy1089;
-	if (yych != 't') goto yy822;
+	if (yych == 'I') goto yy1094;
+	if (yych == 'i') goto yy1094;
+	goto yy823;
 yy1089:
 	yych = *++p;
-	if (yych == 'I') goto yy1090;
-	if (yych != 'i') goto yy822;
+	if (yych == 'T') goto yy1090;
+	if (yych != 't') goto yy823;
 yy1090:
 	yych = *++p;
-	if (yych == 'C') goto yy1091;
-	if (yych != 'c') goto yy822;
+	if (yych == 'I') goto yy1091;
+	if (yych != 'i') goto yy823;
 yy1091:
 	yych = *++p;
-	if (yych == 'L') goto yy1092;
-	if (yych != 'l') goto yy822;
+	if (yych == 'C') goto yy1092;
+	if (yych != 'c') goto yy823;
 yy1092:
 	yych = *++p;
-	if (yych == 'E') goto yy981;
-	if (yych == 'e') goto yy981;
-	goto yy822;
+	if (yych == 'L') goto yy1093;
+	if (yych != 'l') goto yy823;
 yy1093:
 	yych = *++p;
-	if (yych == 'D') goto yy1094;
-	if (yych != 'd') goto yy822;
+	if (yych == 'E') goto yy982;
+	if (yych == 'e') goto yy982;
+	goto yy823;
 yy1094:
 	yych = *++p;
-	if (yych == 'E') goto yy981;
-	if (yych == 'e') goto yy981;
-	goto yy822;
+	if (yych == 'D') goto yy1095;
+	if (yych != 'd') goto yy823;
 yy1095:
 	yych = *++p;
+	if (yych == 'E') goto yy982;
+	if (yych == 'e') goto yy982;
+	goto yy823;
+yy1096:
+	yych = *++p;
 	if (yych <= 'O') {
-		if (yych == 'E') goto yy981;
-		if (yych <= 'N') goto yy822;
+		if (yych == 'E') goto yy982;
+		if (yych <= 'N') goto yy823;
 	} else {
 		if (yych <= 'e') {
-			if (yych <= 'd') goto yy822;
-			goto yy981;
+			if (yych <= 'd') goto yy823;
+			goto yy982;
 		} else {
-			if (yych != 'o') goto yy822;
+			if (yych != 'o') goto yy823;
 		}
 	}
 	yych = *++p;
-	if (yych == 'G') goto yy1097;
-	if (yych != 'g') goto yy822;
-yy1097:
-	yych = *++p;
-	if (yych == 'R') goto yy1098;
-	if (yych != 'r') goto yy822;
+	if (yych == 'G') goto yy1098;
+	if (yych != 'g') goto yy823;
 yy1098:
 	yych = *++p;
-	if (yych == 'E') goto yy1099;
-	if (yych != 'e') goto yy822;
+	if (yych == 'R') goto yy1099;
+	if (yych != 'r') goto yy823;
 yy1099:
 	yych = *++p;
-	if (yych == 'S') goto yy1100;
-	if (yych != 's') goto yy822;
+	if (yych == 'E') goto yy1100;
+	if (yych != 'e') goto yy823;
 yy1100:
+	yych = *++p;
+	if (yych == 'S') goto yy1101;
+	if (yych != 's') goto yy823;
+yy1101:
 	++p;
-	if ((yych = *p) == 'S') goto yy981;
-	if (yych == 's') goto yy981;
-	goto yy822;
+	if ((yych = *p) == 'S') goto yy982;
+	if (yych == 's') goto yy982;
+	goto yy823;
 }
 
 }
@@ -10399,402 +10408,402 @@ int _scan_link_url(const unsigned char *p)
 	yych = *p;
 	if (yych <= '(') {
 		if (yych <= 0x1F) {
-			if (yych == '\n') goto yy1104;
-			goto yy1112;
+			if (yych == '\n') goto yy1105;
+			goto yy1113;
 		} else {
-			if (yych <= ' ') goto yy1106;
-			if (yych <= '\'') goto yy1108;
-			goto yy1111;
+			if (yych <= ' ') goto yy1107;
+			if (yych <= '\'') goto yy1109;
+			goto yy1112;
 		}
 	} else {
 		if (yych <= '<') {
-			if (yych <= ')') goto yy1112;
-			if (yych <= ';') goto yy1108;
-			goto yy1107;
-		} else {
-			if (yych == '\\') goto yy1109;
+			if (yych <= ')') goto yy1113;
+			if (yych <= ';') goto yy1109;
 			goto yy1108;
+		} else {
+			if (yych == '\\') goto yy1110;
+			goto yy1109;
 		}
 	}
-yy1103:
-	{ return (p - start); }
 yy1104:
+	{ return (p - start); }
+yy1105:
 	yyaccept = 0;
 	marker = ++p;
 	yych = *p;
-yy1105:
+yy1106:
 	if (yybm[0+yych] & 8) {
-		goto yy1104;
+		goto yy1105;
 	}
 	if (yych <= ')') {
-		if (yych <= ' ') goto yy1103;
-		if (yych <= '\'') goto yy1117;
-		if (yych <= '(') goto yy1113;
-		goto yy1103;
+		if (yych <= ' ') goto yy1104;
+		if (yych <= '\'') goto yy1118;
+		if (yych <= '(') goto yy1114;
+		goto yy1104;
 	} else {
 		if (yych <= '<') {
-			if (yych <= ';') goto yy1117;
-			goto yy1120;
+			if (yych <= ';') goto yy1118;
+			goto yy1121;
 		} else {
-			if (yych == '\\') goto yy1119;
-			goto yy1117;
+			if (yych == '\\') goto yy1120;
+			goto yy1118;
 		}
 	}
-yy1106:
+yy1107:
 	yyaccept = 0;
 	yych = *(marker = ++p);
-	goto yy1105;
-yy1107:
+	goto yy1106;
+yy1108:
 	yyaccept = 0;
 	yych = *(marker = ++p);
 	if (yybm[0+yych] & 32) {
-		goto yy1120;
+		goto yy1121;
 	}
 	if (yych <= '\'') {
-		if (yych <= 0x00) goto yy1103;
-		if (yych == '\n') goto yy1103;
-		goto yy1127;
+		if (yych <= 0x00) goto yy1104;
+		if (yych == '\n') goto yy1104;
+		goto yy1128;
 	} else {
 		if (yych <= ')') {
-			if (yych <= '(') goto yy1125;
-			goto yy1127;
+			if (yych <= '(') goto yy1126;
+			goto yy1128;
 		} else {
-			if (yych <= '=') goto yy1117;
-			if (yych <= '>') goto yy1122;
-			goto yy1124;
+			if (yych <= '=') goto yy1118;
+			if (yych <= '>') goto yy1123;
+			goto yy1125;
 		}
 	}
-yy1108:
+yy1109:
 	yyaccept = 0;
 	yych = *(marker = ++p);
-	goto yy1118;
-yy1109:
+	goto yy1119;
+yy1110:
 	++p;
 	if ((yych = *p) <= '@') {
-		if (yych <= ' ') goto yy1110;
-		if (yych <= '/') goto yy1117;
-		if (yych >= ':') goto yy1117;
+		if (yych <= ' ') goto yy1111;
+		if (yych <= '/') goto yy1118;
+		if (yych >= ':') goto yy1118;
 	} else {
 		if (yych <= '`') {
-			if (yych >= '[') goto yy1117;
+			if (yych >= '[') goto yy1118;
 		} else {
-			if (yych <= 'z') goto yy1110;
-			if (yych <= '~') goto yy1117;
+			if (yych <= 'z') goto yy1111;
+			if (yych <= '~') goto yy1118;
 		}
 	}
-yy1110:
-	{ return 0; }
 yy1111:
+	{ return 0; }
+yy1112:
 	yyaccept = 1;
 	yych = *(marker = ++p);
-	if (yych <= ' ') goto yy1110;
-	if (yych == '(') goto yy1110;
-	goto yy1114;
-yy1112:
-	yych = *++p;
-	goto yy1110;
+	if (yych <= ' ') goto yy1111;
+	if (yych == '(') goto yy1111;
+	goto yy1115;
 yy1113:
+	yych = *++p;
+	goto yy1111;
+yy1114:
 	++p;
 	yych = *p;
-yy1114:
+yy1115:
 	if (yybm[0+yych] & 16) {
-		goto yy1113;
+		goto yy1114;
 	}
-	if (yych <= '(') goto yy1115;
-	if (yych <= ')') goto yy1117;
-	goto yy1116;
-yy1115:
+	if (yych <= '(') goto yy1116;
+	if (yych <= ')') goto yy1118;
+	goto yy1117;
+yy1116:
 	p = marker;
 	if (yyaccept <= 1) {
 		if (yyaccept == 0) {
-			goto yy1103;
+			goto yy1104;
 		} else {
-			goto yy1110;
+			goto yy1111;
 		}
 	} else {
-		goto yy1123;
+		goto yy1124;
 	}
-yy1116:
+yy1117:
 	++p;
 	yych = *p;
 	if (yych <= '@') {
-		if (yych <= ' ') goto yy1115;
-		if (yych <= '/') goto yy1113;
-		if (yych <= '9') goto yy1115;
-		goto yy1113;
+		if (yych <= ' ') goto yy1116;
+		if (yych <= '/') goto yy1114;
+		if (yych <= '9') goto yy1116;
+		goto yy1114;
 	} else {
 		if (yych <= '`') {
-			if (yych <= 'Z') goto yy1115;
-			goto yy1113;
+			if (yych <= 'Z') goto yy1116;
+			goto yy1114;
 		} else {
-			if (yych <= 'z') goto yy1115;
-			if (yych <= '~') goto yy1113;
-			goto yy1115;
+			if (yych <= 'z') goto yy1116;
+			if (yych <= '~') goto yy1114;
+			goto yy1116;
 		}
 	}
-yy1117:
+yy1118:
 	yyaccept = 0;
 	marker = ++p;
 	yych = *p;
-yy1118:
+yy1119:
 	if (yych <= '(') {
-		if (yych <= ' ') goto yy1103;
-		if (yych <= '\'') goto yy1117;
-		goto yy1113;
+		if (yych <= ' ') goto yy1104;
+		if (yych <= '\'') goto yy1118;
+		goto yy1114;
 	} else {
-		if (yych <= ')') goto yy1103;
-		if (yych != '\\') goto yy1117;
+		if (yych <= ')') goto yy1104;
+		if (yych != '\\') goto yy1118;
 	}
-yy1119:
+yy1120:
 	++p;
 	yych = *p;
 	if (yych <= '@') {
-		if (yych <= ' ') goto yy1115;
-		if (yych <= '/') goto yy1117;
-		if (yych <= '9') goto yy1115;
-		goto yy1117;
+		if (yych <= ' ') goto yy1116;
+		if (yych <= '/') goto yy1118;
+		if (yych <= '9') goto yy1116;
+		goto yy1118;
 	} else {
 		if (yych <= '`') {
-			if (yych <= 'Z') goto yy1115;
-			goto yy1117;
+			if (yych <= 'Z') goto yy1116;
+			goto yy1118;
 		} else {
-			if (yych <= 'z') goto yy1115;
-			if (yych <= '~') goto yy1117;
-			goto yy1115;
+			if (yych <= 'z') goto yy1116;
+			if (yych <= '~') goto yy1118;
+			goto yy1116;
 		}
 	}
-yy1120:
+yy1121:
 	yyaccept = 0;
 	marker = ++p;
 	yych = *p;
 	if (yybm[0+yych] & 32) {
-		goto yy1120;
+		goto yy1121;
 	}
 	if (yych <= '\'') {
-		if (yych <= 0x00) goto yy1103;
-		if (yych == '\n') goto yy1103;
-		goto yy1127;
+		if (yych <= 0x00) goto yy1104;
+		if (yych == '\n') goto yy1104;
+		goto yy1128;
 	} else {
 		if (yych <= ')') {
-			if (yych <= '(') goto yy1125;
-			goto yy1127;
+			if (yych <= '(') goto yy1126;
+			goto yy1128;
 		} else {
-			if (yych <= '=') goto yy1117;
-			if (yych >= '?') goto yy1124;
+			if (yych <= '=') goto yy1118;
+			if (yych >= '?') goto yy1125;
 		}
 	}
-yy1122:
+yy1123:
 	yyaccept = 2;
 	yych = *(marker = ++p);
-	if (yych <= ' ') goto yy1123;
-	if (yych != ')') goto yy1118;
-yy1123:
-	{ return (p - start); }
+	if (yych <= ' ') goto yy1124;
+	if (yych != ')') goto yy1119;
 yy1124:
+	{ return (p - start); }
+yy1125:
 	++p;
 	yych = *p;
 	if (yych <= '>') {
 		if (yych <= ' ') {
-			if (yych <= 0x00) goto yy1115;
-			if (yych == '\n') goto yy1115;
-			goto yy1127;
+			if (yych <= 0x00) goto yy1116;
+			if (yych == '\n') goto yy1116;
+			goto yy1128;
 		} else {
-			if (yych <= '/') goto yy1120;
-			if (yych <= '9') goto yy1127;
-			if (yych <= '=') goto yy1120;
-			goto yy1137;
+			if (yych <= '/') goto yy1121;
+			if (yych <= '9') goto yy1128;
+			if (yych <= '=') goto yy1121;
+			goto yy1138;
 		}
 	} else {
 		if (yych <= '\\') {
-			if (yych <= '@') goto yy1120;
-			if (yych <= 'Z') goto yy1127;
-			if (yych <= '[') goto yy1120;
-			goto yy1138;
+			if (yych <= '@') goto yy1121;
+			if (yych <= 'Z') goto yy1128;
+			if (yych <= '[') goto yy1121;
+			goto yy1139;
 		} else {
-			if (yych <= '`') goto yy1120;
-			if (yych <= 'z') goto yy1127;
-			if (yych <= '~') goto yy1120;
-			goto yy1127;
+			if (yych <= '`') goto yy1121;
+			if (yych <= 'z') goto yy1128;
+			if (yych <= '~') goto yy1121;
+			goto yy1128;
 		}
 	}
-yy1125:
+yy1126:
 	++p;
 	yych = *p;
 	if (yych <= ')') {
 		if (yych <= '\n') {
-			if (yych <= 0x00) goto yy1115;
-			if (yych >= '\n') goto yy1115;
+			if (yych <= 0x00) goto yy1116;
+			if (yych >= '\n') goto yy1116;
 		} else {
-			if (yych <= ' ') goto yy1127;
-			if (yych <= '\'') goto yy1125;
-			if (yych >= ')') goto yy1120;
+			if (yych <= ' ') goto yy1128;
+			if (yych <= '\'') goto yy1126;
+			if (yych >= ')') goto yy1121;
 		}
 	} else {
 		if (yych <= '=') {
-			if (yych == '<') goto yy1113;
-			goto yy1125;
+			if (yych == '<') goto yy1114;
+			goto yy1126;
 		} else {
-			if (yych <= '>') goto yy1133;
-			if (yych == '\\') goto yy1134;
-			goto yy1125;
+			if (yych <= '>') goto yy1134;
+			if (yych == '\\') goto yy1135;
+			goto yy1126;
 		}
 	}
-yy1127:
+yy1128:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 64) {
-		goto yy1127;
+		goto yy1128;
 	}
-	if (yych <= '=') goto yy1115;
-	if (yych >= '?') goto yy1130;
-yy1129:
-	yych = *++p;
-	goto yy1123;
+	if (yych <= '=') goto yy1116;
+	if (yych >= '?') goto yy1131;
 yy1130:
+	yych = *++p;
+	goto yy1124;
+yy1131:
 	++p;
 	yych = *p;
 	if (yybm[0+yych] & 128) {
-		goto yy1130;
+		goto yy1131;
 	}
 	if (yych <= '\n') {
-		if (yych <= 0x00) goto yy1115;
-		if (yych <= '\t') goto yy1127;
-		goto yy1115;
+		if (yych <= 0x00) goto yy1116;
+		if (yych <= '\t') goto yy1128;
+		goto yy1116;
 	} else {
-		if (yych != '>') goto yy1127;
+		if (yych != '>') goto yy1128;
 	}
 	yyaccept = 2;
 	marker = ++p;
 	yych = *p;
 	if (yybm[0+yych] & 64) {
-		goto yy1127;
+		goto yy1128;
 	}
-	if (yych <= '=') goto yy1123;
-	if (yych <= '>') goto yy1129;
-	goto yy1130;
-yy1133:
+	if (yych <= '=') goto yy1124;
+	if (yych <= '>') goto yy1130;
+	goto yy1131;
+yy1134:
 	yyaccept = 2;
 	yych = *(marker = ++p);
-	if (yych <= ' ') goto yy1123;
-	if (yych == '(') goto yy1123;
-	goto yy1114;
-yy1134:
+	if (yych <= ' ') goto yy1124;
+	if (yych == '(') goto yy1124;
+	goto yy1115;
+yy1135:
 	++p;
 	yych = *p;
 	if (yych <= '>') {
 		if (yych <= ' ') {
-			if (yych <= 0x00) goto yy1115;
-			if (yych == '\n') goto yy1115;
-			goto yy1127;
+			if (yych <= 0x00) goto yy1116;
+			if (yych == '\n') goto yy1116;
+			goto yy1128;
 		} else {
-			if (yych <= '/') goto yy1125;
-			if (yych <= '9') goto yy1127;
-			if (yych <= '=') goto yy1125;
+			if (yych <= '/') goto yy1126;
+			if (yych <= '9') goto yy1128;
+			if (yych <= '=') goto yy1126;
 		}
 	} else {
 		if (yych <= '\\') {
-			if (yych <= '@') goto yy1125;
-			if (yych <= 'Z') goto yy1127;
-			if (yych <= '[') goto yy1125;
-			goto yy1136;
+			if (yych <= '@') goto yy1126;
+			if (yych <= 'Z') goto yy1128;
+			if (yych <= '[') goto yy1126;
+			goto yy1137;
 		} else {
-			if (yych <= '`') goto yy1125;
-			if (yych <= 'z') goto yy1127;
-			if (yych <= '~') goto yy1125;
-			goto yy1127;
+			if (yych <= '`') goto yy1126;
+			if (yych <= 'z') goto yy1128;
+			if (yych <= '~') goto yy1126;
+			goto yy1128;
 		}
 	}
-yy1135:
+yy1136:
 	yyaccept = 2;
 	marker = ++p;
 	yych = *p;
 	if (yych <= ')') {
 		if (yych <= '\n') {
-			if (yych <= 0x00) goto yy1123;
-			if (yych <= '\t') goto yy1127;
-			goto yy1123;
+			if (yych <= 0x00) goto yy1124;
+			if (yych <= '\t') goto yy1128;
+			goto yy1124;
 		} else {
-			if (yych <= ' ') goto yy1127;
-			if (yych <= '\'') goto yy1125;
-			if (yych <= '(') goto yy1127;
-			goto yy1120;
+			if (yych <= ' ') goto yy1128;
+			if (yych <= '\'') goto yy1126;
+			if (yych <= '(') goto yy1128;
+			goto yy1121;
 		}
 	} else {
 		if (yych <= '=') {
-			if (yych == '<') goto yy1113;
-			goto yy1125;
+			if (yych == '<') goto yy1114;
+			goto yy1126;
 		} else {
-			if (yych <= '>') goto yy1133;
-			if (yych == '\\') goto yy1134;
-			goto yy1125;
+			if (yych <= '>') goto yy1134;
+			if (yych == '\\') goto yy1135;
+			goto yy1126;
 		}
 	}
-yy1136:
+yy1137:
 	++p;
 	yych = *p;
 	if (yych <= '(') {
 		if (yych <= '\n') {
-			if (yych <= 0x00) goto yy1115;
-			if (yych <= '\t') goto yy1127;
-			goto yy1115;
+			if (yych <= 0x00) goto yy1116;
+			if (yych <= '\t') goto yy1128;
+			goto yy1116;
 		} else {
-			if (yych <= ' ') goto yy1127;
-			if (yych <= '\'') goto yy1125;
-			goto yy1127;
+			if (yych <= ' ') goto yy1128;
+			if (yych <= '\'') goto yy1126;
+			goto yy1128;
 		}
 	} else {
 		if (yych <= '>') {
-			if (yych <= ')') goto yy1120;
-			if (yych <= '=') goto yy1125;
-			goto yy1135;
+			if (yych <= ')') goto yy1121;
+			if (yych <= '=') goto yy1126;
+			goto yy1136;
 		} else {
-			if (yych == '\\') goto yy1134;
-			goto yy1125;
+			if (yych == '\\') goto yy1135;
+			goto yy1126;
 		}
 	}
-yy1137:
+yy1138:
 	yyaccept = 2;
 	marker = ++p;
 	yych = *p;
 	if (yybm[0+yych] & 32) {
-		goto yy1120;
+		goto yy1121;
 	}
 	if (yych <= '\'') {
-		if (yych <= 0x00) goto yy1123;
-		if (yych == '\n') goto yy1123;
-		goto yy1127;
+		if (yych <= 0x00) goto yy1124;
+		if (yych == '\n') goto yy1124;
+		goto yy1128;
 	} else {
 		if (yych <= ')') {
-			if (yych <= '(') goto yy1125;
-			goto yy1127;
+			if (yych <= '(') goto yy1126;
+			goto yy1128;
 		} else {
-			if (yych <= '=') goto yy1117;
-			if (yych <= '>') goto yy1122;
-			goto yy1124;
+			if (yych <= '=') goto yy1118;
+			if (yych <= '>') goto yy1123;
+			goto yy1125;
 		}
 	}
-yy1138:
+yy1139:
 	yyaccept = 0;
 	marker = ++p;
 	yych = *p;
 	if (yych <= '(') {
 		if (yych <= '\n') {
-			if (yych <= 0x00) goto yy1103;
-			if (yych <= '\t') goto yy1127;
-			goto yy1103;
+			if (yych <= 0x00) goto yy1104;
+			if (yych <= '\t') goto yy1128;
+			goto yy1104;
 		} else {
-			if (yych <= ' ') goto yy1127;
-			if (yych <= '\'') goto yy1120;
-			goto yy1125;
+			if (yych <= ' ') goto yy1128;
+			if (yych <= '\'') goto yy1121;
+			goto yy1126;
 		}
 	} else {
 		if (yych <= '>') {
-			if (yych <= ')') goto yy1127;
-			if (yych <= '=') goto yy1120;
-			goto yy1137;
+			if (yych <= ')') goto yy1128;
+			if (yych <= '=') goto yy1121;
+			goto yy1138;
 		} else {
-			if (yych == '\\') goto yy1124;
-			goto yy1120;
+			if (yych == '\\') goto yy1125;
+			goto yy1121;
 		}
 	}
 }
@@ -10848,147 +10857,147 @@ int _scan_link_title(const unsigned char *p)
 	};
 	yych = *p;
 	if (yych <= '"') {
-		if (yych == '\n') goto yy1141;
-		if (yych <= '!') goto yy1145;
-		goto yy1142;
+		if (yych == '\n') goto yy1142;
+		if (yych <= '!') goto yy1146;
+		goto yy1143;
 	} else {
-		if (yych <= '&') goto yy1145;
-		if (yych <= '\'') goto yy1143;
-		if (yych <= '(') goto yy1144;
-		goto yy1145;
+		if (yych <= '&') goto yy1146;
+		if (yych <= '\'') goto yy1144;
+		if (yych <= '(') goto yy1145;
+		goto yy1146;
 	}
-yy1141:
-	{ return 0; }
 yy1142:
-	yyaccept = 0;
-	yych = *(marker = ++p);
-	if (yych <= 0x00) goto yy1141;
-	goto yy1162;
+	{ return 0; }
 yy1143:
 	yyaccept = 0;
 	yych = *(marker = ++p);
-	if (yych <= 0x00) goto yy1141;
-	goto yy1155;
+	if (yych <= 0x00) goto yy1142;
+	goto yy1163;
 yy1144:
 	yyaccept = 0;
 	yych = *(marker = ++p);
-	if (yych <= 0x00) goto yy1141;
-	goto yy1147;
+	if (yych <= 0x00) goto yy1142;
+	goto yy1156;
 yy1145:
-	yych = *++p;
-	goto yy1141;

<TRUNCATED>

[12/12] lucy-clownfish git commit: Improve documentation generator tests

Posted by nw...@apache.org.
Improve documentation generator tests

- Move tests from CFCTestCMan to CFCTestDocuComment.
- Add tests for POD and HTML.
- Add CFCCHtml_create_html_body to simplify testing.


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/aa82267a
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/aa82267a
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/aa82267a

Branch: refs/heads/master
Commit: aa82267a9f85bd72c852e27ca094641f8add2d21
Parents: 73efb7c
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sat Jan 10 23:35:39 2015 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sun Jan 18 19:38:29 2015 +0100

----------------------------------------------------------------------
 compiler/src/CFCCHtml.c           |  32 ++++--
 compiler/src/CFCCHtml.h           |   3 +
 compiler/src/CFCTest.c            |   1 -
 compiler/src/CFCTest.h            |   1 -
 compiler/src/CFCTestCMan.c        | 107 ------------------
 compiler/src/CFCTestDocuComment.c | 197 ++++++++++++++++++++++++++++++++-
 6 files changed, 218 insertions(+), 123 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/aa82267a/compiler/src/CFCCHtml.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCCHtml.c b/compiler/src/CFCCHtml.c
index 9252624..542a6ff 100644
--- a/compiler/src/CFCCHtml.c
+++ b/compiler/src/CFCCHtml.c
@@ -325,6 +325,22 @@ CFCCHtml_create_index_doc(CFCCHtml *self, CFCParcel *parcel,
 
 char*
 CFCCHtml_create_html_doc(CFCCHtml *self, CFCClass *klass) {
+    const char *class_name     = CFCClass_get_class_name(klass);
+    char *title
+        = CFCUtil_sprintf("%s " UTF8_NDASH " C API Documentation", class_name);
+    char *header = CFCUtil_global_replace(self->header, "{title}", title);
+    char *body = CFCCHtml_create_html_body(klass);
+
+    char *html_doc = CFCUtil_sprintf("%s%s%s", header, body, self->footer);
+
+    FREEMEM(body);
+    FREEMEM(header);
+    FREEMEM(title);
+    return html_doc;
+}
+
+char*
+CFCCHtml_create_html_body(CFCClass *klass) {
     CFCParcel  *parcel         = CFCClass_get_parcel(klass);
     const char *parcel_name    = CFCParcel_get_name(parcel);
     const char *class_name     = CFCClass_get_class_name(klass);
@@ -350,14 +366,10 @@ CFCCHtml_create_html_doc(CFCCHtml *self, CFCClass *klass) {
     // Build an INHERITANCE section describing class ancestry.
     char *inheritance = S_html_create_inheritance(klass);
 
-    char *title
-        = CFCUtil_sprintf("%s " UTF8_NDASH " C API Documentation", class_name);
-    char *header = CFCUtil_global_replace(self->header, "{title}", title);
     char *index_filename = S_index_filename(parcel);
 
     // Put it all together.
     const char pattern[] =
-        "%s"
         "<h1>%s</h1>\n"
         "<table>\n"
         "<tr>\n"
@@ -386,18 +398,14 @@ CFCCHtml_create_html_doc(CFCCHtml *self, CFCClass *klass) {
         "%s"
         "%s"
         "%s"
-        "%s"
         "%s";
-    char *html_doc
-        = CFCUtil_sprintf(pattern, header, class_name, index_filename,
+    char *html_body
+        = CFCUtil_sprintf(pattern, class_name, index_filename,
                           parcel_name, class_name, class_nickname, class_var,
                           struct_sym, name, synopsis, description,
-                          functions_html, methods_html, inheritance,
-                          self->footer);
+                          functions_html, methods_html, inheritance);
 
     FREEMEM(index_filename);
-    FREEMEM(header);
-    FREEMEM(title);
     FREEMEM(name);
     FREEMEM(synopsis);
     FREEMEM(description);
@@ -405,7 +413,7 @@ CFCCHtml_create_html_doc(CFCCHtml *self, CFCClass *klass) {
     FREEMEM(methods_html);
     FREEMEM(inheritance);
 
-    return html_doc;
+    return html_body;
 }
 
 static int

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/aa82267a/compiler/src/CFCCHtml.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCCHtml.h b/compiler/src/CFCCHtml.h
index dc5a5f7..41f46fc 100644
--- a/compiler/src/CFCCHtml.h
+++ b/compiler/src/CFCCHtml.h
@@ -63,6 +63,9 @@ CFCCHtml_create_index_doc(CFCCHtml *self, struct CFCParcel *parcel,
 char*
 CFCCHtml_create_html_doc(CFCCHtml *self, struct CFCClass *klass);
 
+char*
+CFCCHtml_create_html_body(struct CFCClass *klass);
+
 #ifdef __cplusplus
 }
 #endif

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/aa82267a/compiler/src/CFCTest.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTest.c b/compiler/src/CFCTest.c
index 1692f58..21cff48 100644
--- a/compiler/src/CFCTest.c
+++ b/compiler/src/CFCTest.c
@@ -128,7 +128,6 @@ static const CFCTestBatch *const S_batches[] = {
     &CFCTEST_BATCH_FILE,
     &CFCTEST_BATCH_HIERARCHY,
     &CFCTEST_BATCH_PARSER,
-    &CFCTEST_BATCH_C_MAN,
     NULL
 };
 

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/aa82267a/compiler/src/CFCTest.h
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTest.h b/compiler/src/CFCTest.h
index f78e07f..dbb3a17 100644
--- a/compiler/src/CFCTest.h
+++ b/compiler/src/CFCTest.h
@@ -155,7 +155,6 @@ CFCTest_set_file_times(const char *path, time_t time);
 
 extern const CFCTestBatch CFCTEST_BATCH_CLASS;
 extern const CFCTestBatch CFCTEST_BATCH_C_BLOCK;
-extern const CFCTestBatch CFCTEST_BATCH_C_MAN;
 extern const CFCTestBatch CFCTEST_BATCH_DOCU_COMMENT;
 extern const CFCTestBatch CFCTEST_BATCH_FILE;
 extern const CFCTestBatch CFCTEST_BATCH_FILE_SPEC;

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/aa82267a/compiler/src/CFCTestCMan.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestCMan.c b/compiler/src/CFCTestCMan.c
deleted file mode 100644
index 6544d01..0000000
--- a/compiler/src/CFCTestCMan.c
+++ /dev/null
@@ -1,107 +0,0 @@
-/* Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements.  See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- */
-
-#include <string.h>
-
-#define CFC_USE_TEST_MACROS
-#include "CFCBase.h"
-#include "CFCClass.h"
-#include "CFCCMan.h"
-#include "CFCDocuComment.h"
-#include "CFCParcel.h"
-#include "CFCTest.h"
-#include "CFCUtil.h"
-
-#ifndef true
-  #define true 1
-  #define false 0
-#endif
-
-static void
-S_run_tests(CFCTest *test);
-
-const CFCTestBatch CFCTEST_BATCH_C_MAN = {
-    "Clownfish::CFC::Binding::C::Man",
-    1,
-    S_run_tests
-};
-
-static void
-S_run_tests(CFCTest *test) {
-    CFCParcel *parcel = CFCParcel_new("Neato", NULL, NULL, NULL);
-    CFCDocuComment *docu = CFCDocuComment_parse(
-        "/** Test man page creator.\n"
-        " * \n"
-        " * # Heading 1\n"
-        " * \n"
-        " * Paragraph: *emphasized*, **strong**, `code`.\n"
-        " * \n"
-        " * Paragraph: [link](http://example.com/).\n"
-        " * \n"
-        " *     Code 1\n"
-        " *     Code 2\n"
-        " * \n"
-        " * * List item 1\n"
-        " *   * List item 1.1\n"
-        " * \n"
-        " *   Paragraph in list\n"
-        " * \n"
-        " * Paragraph after list\n"
-        " */\n"
-    );
-    CFCClass *klass
-        = CFCClass_create(parcel, "public", "Neato::Object", NULL, NULL,
-                          docu, NULL, NULL, 0, 0);
-    char *man_page = CFCCMan_create_man_page(klass);
-    const char *expected_output =
-        ".TH Neato::Object 3\n"
-        ".SH NAME\n"
-        "Neato::Object \\- Test man page creator.\n"
-        ".SH DESCRIPTION\n"
-        ".SS\n"
-        "Heading 1\n"
-        "Paragraph: \\fIemphasized\\f[], \\fBstrong\\f[], \\FCcode\\F[]\\&.\n"
-        "\n"
-        "Paragraph: \n"
-        ".UR http://example.com/\n"
-        "link\n"
-        ".UE\n"
-        "\\&.\n"
-        ".IP\n"
-        ".nf\n"
-        ".fam C\n"
-        "Code 1\n"
-        "Code 2\n"
-        ".fam\n"
-        ".fi\n"
-        ".IP \\(bu\n"
-        "List item 1\n"
-        ".RS\n"
-        ".IP \\(bu\n"
-        "List item 1.1\n"
-        ".RE\n"
-        ".IP\n"
-        "Paragraph in list\n"
-        ".P\n"
-        "Paragraph after list\n";
-    STR_EQ(test, man_page, expected_output, "create man page");
-
-    FREEMEM(man_page);
-    CFCBase_decref((CFCBase*)klass);
-    CFCBase_decref((CFCBase*)docu);
-    CFCBase_decref((CFCBase*)parcel);
-}
-

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/aa82267a/compiler/src/CFCTestDocuComment.c
----------------------------------------------------------------------
diff --git a/compiler/src/CFCTestDocuComment.c b/compiler/src/CFCTestDocuComment.c
index dba5f3c..3e78e38 100644
--- a/compiler/src/CFCTestDocuComment.c
+++ b/compiler/src/CFCTestDocuComment.c
@@ -17,21 +17,32 @@
 #define CFC_USE_TEST_MACROS
 #include "CFCBase.h"
 #include "CFCDocuComment.h"
+#include "CFCCHtml.h"
+#include "CFCCMan.h"
+#include "CFCClass.h"
+#include "CFCParcel.h"
 #include "CFCParser.h"
+#include "CFCPerlClass.h"
+#include "CFCPerlPod.h"
 #include "CFCTest.h"
 #include "CFCUtil.h"
 
+#ifndef true
+  #define true 1
+  #define false 0
+#endif
+
 static void
 S_run_tests(CFCTest *test);
 
 const CFCTestBatch CFCTEST_BATCH_DOCU_COMMENT = {
     "Clownfish::CFC::Model::DocuComment",
-    15,
+    18,
     S_run_tests
 };
 
 static void
-S_run_tests(CFCTest *test) {
+S_test_parser(CFCTest *test) {
     CFCDocuComment *docucomment;
 
     docucomment = CFCDocuComment_parse("/** foo. */");
@@ -105,3 +116,185 @@ S_run_tests(CFCTest *test) {
     CFCBase_decref((CFCBase*)parser);
 }
 
+static void
+S_test_generator(CFCTest *test) {
+    CFCParcel *parcel = CFCParcel_new("Neato", NULL, NULL, NULL);
+    CFCDocuComment *docu = CFCDocuComment_parse(
+        "/** Test documentation generator.\n"
+        " * \n"
+        " * # Heading 1\n"
+        " * \n"
+        " * Paragraph: *emphasized*, **strong**, `code`.\n"
+        " * \n"
+        " * Paragraph: [link](http://example.com/).\n"
+        " * \n"
+        " *     Code 1\n"
+        " *     Code 2\n"
+        " * \n"
+        " * * List item 1\n"
+        " *   * List item 1.1\n"
+        " *     > Blockquote\n"
+        " * \n"
+        " *   Paragraph in list\n"
+        " * \n"
+        " * Paragraph after list\n"
+        " */\n"
+    );
+    CFCClass *klass
+        = CFCClass_create(parcel, "public", "Neato::Object", NULL, NULL,
+                          docu, NULL, NULL, 0, 0);
+
+    char *man_page = CFCCMan_create_man_page(klass);
+    const char *expected_man =
+        ".TH Neato::Object 3\n"
+        ".SH NAME\n"
+        "Neato::Object \\- Test documentation generator.\n"
+        ".SH DESCRIPTION\n"
+        ".SS\n"
+        "Heading 1\n"
+        "Paragraph: \\fIemphasized\\f[], \\fBstrong\\f[], \\FCcode\\F[]\\&.\n"
+        "\n"
+        "Paragraph: \n"
+        ".UR http://example.com/\n"
+        "link\n"
+        ".UE\n"
+        "\\&.\n"
+        ".IP\n"
+        ".nf\n"
+        ".fam C\n"
+        "Code 1\n"
+        "Code 2\n"
+        ".fam\n"
+        ".fi\n"
+        ".IP \\(bu\n"
+        "List item 1\n"
+        ".RS\n"
+        ".IP \\(bu\n"
+        "List item 1.1\n"
+        ".RS\n"
+        ".IP\n"
+        "Blockquote\n"
+        ".RE\n"
+        ".RE\n"
+        ".IP\n"
+        "Paragraph in list\n"
+        ".P\n"
+        "Paragraph after list\n";
+    STR_EQ(test, man_page, expected_man, "create man page");
+
+    char *html = CFCCHtml_create_html_body(klass);
+    const char *expected_html =
+        "<h1>Neato::Object</h1>\n"
+        "<table>\n"
+        "<tr>\n"
+        "<td class=\"label\">parcel</td>\n"
+        "<td><a href=\"neato.html\">Neato</a></td>\n"
+        "</tr>\n"
+        "<tr>\n"
+        "<td class=\"label\">class name</td>\n"
+        "<td>Neato::Object</td>\n"
+        "</tr>\n"
+        "<tr>\n"
+        "<td class=\"label\">class nickname</td>\n"
+        "<td>Object</td>\n"
+        "</tr>\n"
+        "<tr>\n"
+        "<td class=\"label\">class variable</td>\n"
+        "<td><code>NEATO_OBJECT</code></td>\n"
+        "</tr>\n"
+        "<tr>\n"
+        "<td class=\"label\">struct symbol</td>\n"
+        "<td><code>neato_Object</code></td>\n"
+        "</tr>\n"
+        "</table>\n"
+        "<h2>Name</h2>\n"
+        "<p>Neato::Object – Test documentation generator.</p>\n"
+        "<h2>Description</h2>\n"
+        "<h1>Heading 1</h1>\n"
+        "<p>Paragraph: <em>emphasized</em>, <strong>strong</strong>, <code>code</code>.</p>\n"
+        "<p>Paragraph: <a href=\"http://example.com/\">link</a>.</p>\n"
+        "<pre><code>Code 1\n"
+        "Code 2\n"
+        "</code></pre>\n"
+        "<ul>\n"
+        "<li>\n"
+        "<p>List item 1</p>\n"
+        "<ul>\n"
+        "<li>List item 1.1\n"
+        "<blockquote>\n"
+        "<p>Blockquote</p>\n"
+        "</blockquote>\n"
+        "</li>\n"
+        "</ul>\n"
+        "<p>Paragraph in list</p>\n"
+        "</li>\n"
+        "</ul>\n"
+        "<p>Paragraph after list</p>\n";
+    STR_EQ(test, html, expected_html, "create HTML");
+
+    CFCPerlClass *perl_class = CFCPerlClass_new(parcel, "Neato::Object");
+    CFCPerlPod *perl_pod = CFCPerlPod_new();
+    CFCPerlClass_set_pod_spec(perl_class, perl_pod);
+    char *pod = CFCPerlClass_create_pod(perl_class);
+    const char *expected_pod =
+        "=head1 NAME\n"
+        "\n"
+        "Neato::Object - Test documentation generator.\n"
+        "\n"
+        "=head1 DESCRIPTION\n"
+        "\n"
+        "=head3 Heading 1\n"
+        "\n"
+        "Paragraph: I<emphasized>, B<strong>, C<code>.\n"
+        "\n"
+        "Paragraph: L<link|http://example.com/>.\n"
+        "\n"
+        "    Code 1\n"
+        "    Code 2\n"
+        "\n"
+        "=over\n"
+        "\n"
+        "=item *\n"
+        "\n"
+        "List item 1\n"
+        "\n"
+        "=over\n"
+        "\n"
+        "=item *\n"
+        "\n"
+        "List item 1.1\n"
+        "\n"
+        "=over\n"
+        "\n"
+        "Blockquote\n"
+        "\n"
+        "=back\n"
+        "\n"
+        "=back\n"
+        "\n"
+        "Paragraph in list\n"
+        "\n"
+        "=back\n"
+        "\n"
+        "Paragraph after list\n"
+        "\n"
+        "=cut\n"
+        "\n";
+    STR_EQ(test, pod, expected_pod, "create POD");
+
+    FREEMEM(pod);
+    CFCBase_decref((CFCBase*)perl_pod);
+    CFCBase_decref((CFCBase*)perl_class);
+    FREEMEM(html);
+    FREEMEM(man_page);
+    CFCBase_decref((CFCBase*)klass);
+    CFCBase_decref((CFCBase*)docu);
+    CFCBase_decref((CFCBase*)parcel);
+}
+
+static void
+S_run_tests(CFCTest *test) {
+    S_test_parser(test);
+    S_test_generator(test);
+}
+


[07/12] lucy-clownfish git commit: Update CommonMark source code

Posted by nw...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/html_unescape.gperf
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/html_unescape.gperf b/compiler/modules/CommonMark/src/html_unescape.gperf
index 4d46f67..74173a6 100644
--- a/compiler/modules/CommonMark/src/html_unescape.gperf
+++ b/compiler/modules/CommonMark/src/html_unescape.gperf
@@ -1,2131 +1,2130 @@
 struct html_ent {
-	const char *entity;
-	unsigned int utf8_len;
+	int entity;
 	unsigned char utf8[4];
 };
 %%
-"Aacute", 2, {195, 129}
-"aacute", 2, {195, 161}
-"Abreve", 2, {196, 130}
-"abreve", 2, {196, 131}
-"ac", 3, {226, 136, 190}
-"acd", 3, {226, 136, 191}
-"acE", 3, {226, 136, 190}
-"Acirc", 2, {195, 130}
-"acirc", 2, {195, 162}
-"acute", 2, {194, 180}
-"Acy", 2, {208, 144}
-"acy", 2, {208, 176}
-"AElig", 2, {195, 134}
-"aelig", 2, {195, 166}
-"af", 3, {226, 129, 161}
-"Afr", 4, {240, 157, 148, 132}
-"afr", 4, {240, 157, 148, 158}
-"Agrave", 2, {195, 128}
-"agrave", 2, {195, 160}
-"alefsym", 3, {226, 132, 181}
-"aleph", 3, {226, 132, 181}
-"Alpha", 2, {206, 145}
-"alpha", 2, {206, 177}
-"Amacr", 2, {196, 128}
-"amacr", 2, {196, 129}
-"amalg", 3, {226, 168, 191}
-"amp", 1, {38}
-"AMP", 1, {38}
-"andand", 3, {226, 169, 149}
-"And", 3, {226, 169, 147}
-"and", 3, {226, 136, 167}
-"andd", 3, {226, 169, 156}
-"andslope", 3, {226, 169, 152}
-"andv", 3, {226, 169, 154}
-"ang", 3, {226, 136, 160}
-"ange", 3, {226, 166, 164}
-"angle", 3, {226, 136, 160}
-"angmsdaa", 3, {226, 166, 168}
-"angmsdab", 3, {226, 166, 169}
-"angmsdac", 3, {226, 166, 170}
-"angmsdad", 3, {226, 166, 171}
-"angmsdae", 3, {226, 166, 172}
-"angmsdaf", 3, {226, 166, 173}
-"angmsdag", 3, {226, 166, 174}
-"angmsdah", 3, {226, 166, 175}
-"angmsd", 3, {226, 136, 161}
-"angrt", 3, {226, 136, 159}
-"angrtvb", 3, {226, 138, 190}
-"angrtvbd", 3, {226, 166, 157}
-"angsph", 3, {226, 136, 162}
-"angst", 2, {195, 133}
-"angzarr", 3, {226, 141, 188}
-"Aogon", 2, {196, 132}
-"aogon", 2, {196, 133}
-"Aopf", 4, {240, 157, 148, 184}
-"aopf", 4, {240, 157, 149, 146}
-"apacir", 3, {226, 169, 175}
-"ap", 3, {226, 137, 136}
-"apE", 3, {226, 169, 176}
-"ape", 3, {226, 137, 138}
-"apid", 3, {226, 137, 139}
-"apos", 1, {39}
-"ApplyFunction", 3, {226, 129, 161}
-"approx", 3, {226, 137, 136}
-"approxeq", 3, {226, 137, 138}
-"Aring", 2, {195, 133}
-"aring", 2, {195, 165}
-"Ascr", 4, {240, 157, 146, 156}
-"ascr", 4, {240, 157, 146, 182}
-"Assign", 3, {226, 137, 148}
-"ast", 1, {42}
-"asymp", 3, {226, 137, 136}
-"asympeq", 3, {226, 137, 141}
-"Atilde", 2, {195, 131}
-"atilde", 2, {195, 163}
-"Auml", 2, {195, 132}
-"auml", 2, {195, 164}
-"awconint", 3, {226, 136, 179}
-"awint", 3, {226, 168, 145}
-"backcong", 3, {226, 137, 140}
-"backepsilon", 2, {207, 182}
-"backprime", 3, {226, 128, 181}
-"backsim", 3, {226, 136, 189}
-"backsimeq", 3, {226, 139, 141}
-"Backslash", 3, {226, 136, 150}
-"Barv", 3, {226, 171, 167}
-"barvee", 3, {226, 138, 189}
-"barwed", 3, {226, 140, 133}
-"Barwed", 3, {226, 140, 134}
-"barwedge", 3, {226, 140, 133}
-"bbrk", 3, {226, 142, 181}
-"bbrktbrk", 3, {226, 142, 182}
-"bcong", 3, {226, 137, 140}
-"Bcy", 2, {208, 145}
-"bcy", 2, {208, 177}
-"bdquo", 3, {226, 128, 158}
-"becaus", 3, {226, 136, 181}
-"because", 3, {226, 136, 181}
-"Because", 3, {226, 136, 181}
-"bemptyv", 3, {226, 166, 176}
-"bepsi", 2, {207, 182}
-"bernou", 3, {226, 132, 172}
-"Bernoullis", 3, {226, 132, 172}
-"Beta", 2, {206, 146}
-"beta", 2, {206, 178}
-"beth", 3, {226, 132, 182}
-"between", 3, {226, 137, 172}
-"Bfr", 4, {240, 157, 148, 133}
-"bfr", 4, {240, 157, 148, 159}
-"bigcap", 3, {226, 139, 130}
-"bigcirc", 3, {226, 151, 175}
-"bigcup", 3, {226, 139, 131}
-"bigodot", 3, {226, 168, 128}
-"bigoplus", 3, {226, 168, 129}
-"bigotimes", 3, {226, 168, 130}
-"bigsqcup", 3, {226, 168, 134}
-"bigstar", 3, {226, 152, 133}
-"bigtriangledown", 3, {226, 150, 189}
-"bigtriangleup", 3, {226, 150, 179}
-"biguplus", 3, {226, 168, 132}
-"bigvee", 3, {226, 139, 129}
-"bigwedge", 3, {226, 139, 128}
-"bkarow", 3, {226, 164, 141}
-"blacklozenge", 3, {226, 167, 171}
-"blacksquare", 3, {226, 150, 170}
-"blacktriangle", 3, {226, 150, 180}
-"blacktriangledown", 3, {226, 150, 190}
-"blacktriangleleft", 3, {226, 151, 130}
-"blacktriangleright", 3, {226, 150, 184}
-"blank", 3, {226, 144, 163}
-"blk12", 3, {226, 150, 146}
-"blk14", 3, {226, 150, 145}
-"blk34", 3, {226, 150, 147}
-"block", 3, {226, 150, 136}
-"bne", 1, {61}
-"bnequiv", 3, {226, 137, 161}
-"bNot", 3, {226, 171, 173}
-"bnot", 3, {226, 140, 144}
-"Bopf", 4, {240, 157, 148, 185}
-"bopf", 4, {240, 157, 149, 147}
-"bot", 3, {226, 138, 165}
-"bottom", 3, {226, 138, 165}
-"bowtie", 3, {226, 139, 136}
-"boxbox", 3, {226, 167, 137}
-"boxdl", 3, {226, 148, 144}
-"boxdL", 3, {226, 149, 149}
-"boxDl", 3, {226, 149, 150}
-"boxDL", 3, {226, 149, 151}
-"boxdr", 3, {226, 148, 140}
-"boxdR", 3, {226, 149, 146}
-"boxDr", 3, {226, 149, 147}
-"boxDR", 3, {226, 149, 148}
-"boxh", 3, {226, 148, 128}
-"boxH", 3, {226, 149, 144}
-"boxhd", 3, {226, 148, 172}
-"boxHd", 3, {226, 149, 164}
-"boxhD", 3, {226, 149, 165}
-"boxHD", 3, {226, 149, 166}
-"boxhu", 3, {226, 148, 180}
-"boxHu", 3, {226, 149, 167}
-"boxhU", 3, {226, 149, 168}
-"boxHU", 3, {226, 149, 169}
-"boxminus", 3, {226, 138, 159}
-"boxplus", 3, {226, 138, 158}
-"boxtimes", 3, {226, 138, 160}
-"boxul", 3, {226, 148, 152}
-"boxuL", 3, {226, 149, 155}
-"boxUl", 3, {226, 149, 156}
-"boxUL", 3, {226, 149, 157}
-"boxur", 3, {226, 148, 148}
-"boxuR", 3, {226, 149, 152}
-"boxUr", 3, {226, 149, 153}
-"boxUR", 3, {226, 149, 154}
-"boxv", 3, {226, 148, 130}
-"boxV", 3, {226, 149, 145}
-"boxvh", 3, {226, 148, 188}
-"boxvH", 3, {226, 149, 170}
-"boxVh", 3, {226, 149, 171}
-"boxVH", 3, {226, 149, 172}
-"boxvl", 3, {226, 148, 164}
-"boxvL", 3, {226, 149, 161}
-"boxVl", 3, {226, 149, 162}
-"boxVL", 3, {226, 149, 163}
-"boxvr", 3, {226, 148, 156}
-"boxvR", 3, {226, 149, 158}
-"boxVr", 3, {226, 149, 159}
-"boxVR", 3, {226, 149, 160}
-"bprime", 3, {226, 128, 181}
-"breve", 2, {203, 152}
-"Breve", 2, {203, 152}
-"brvbar", 2, {194, 166}
-"bscr", 4, {240, 157, 146, 183}
-"Bscr", 3, {226, 132, 172}
-"bsemi", 3, {226, 129, 143}
-"bsim", 3, {226, 136, 189}
-"bsime", 3, {226, 139, 141}
-"bsolb", 3, {226, 167, 133}
-"bsol", 1, {92}
-"bsolhsub", 3, {226, 159, 136}
-"bull", 3, {226, 128, 162}
-"bullet", 3, {226, 128, 162}
-"bump", 3, {226, 137, 142}
-"bumpE", 3, {226, 170, 174}
-"bumpe", 3, {226, 137, 143}
-"Bumpeq", 3, {226, 137, 142}
-"bumpeq", 3, {226, 137, 143}
-"Cacute", 2, {196, 134}
-"cacute", 2, {196, 135}
-"capand", 3, {226, 169, 132}
-"capbrcup", 3, {226, 169, 137}
-"capcap", 3, {226, 169, 139}
-"cap", 3, {226, 136, 169}
-"Cap", 3, {226, 139, 146}
-"capcup", 3, {226, 169, 135}
-"capdot", 3, {226, 169, 128}
-"CapitalDifferentialD", 3, {226, 133, 133}
-"caps", 3, {226, 136, 169}
-"caret", 3, {226, 129, 129}
-"caron", 2, {203, 135}
-"Cayleys", 3, {226, 132, 173}
-"ccaps", 3, {226, 169, 141}
-"Ccaron", 2, {196, 140}
-"ccaron", 2, {196, 141}
-"Ccedil", 2, {195, 135}
-"ccedil", 2, {195, 167}
-"Ccirc", 2, {196, 136}
-"ccirc", 2, {196, 137}
-"Cconint", 3, {226, 136, 176}
-"ccups", 3, {226, 169, 140}
-"ccupssm", 3, {226, 169, 144}
-"Cdot", 2, {196, 138}
-"cdot", 2, {196, 139}
-"cedil", 2, {194, 184}
-"Cedilla", 2, {194, 184}
-"cemptyv", 3, {226, 166, 178}
-"cent", 2, {194, 162}
-"centerdot", 2, {194, 183}
-"CenterDot", 2, {194, 183}
-"cfr", 4, {240, 157, 148, 160}
-"Cfr", 3, {226, 132, 173}
-"CHcy", 2, {208, 167}
-"chcy", 2, {209, 135}
-"check", 3, {226, 156, 147}
-"checkmark", 3, {226, 156, 147}
-"Chi", 2, {206, 167}
-"chi", 2, {207, 135}
-"circ", 2, {203, 134}
-"circeq", 3, {226, 137, 151}
-"circlearrowleft", 3, {226, 134, 186}
-"circlearrowright", 3, {226, 134, 187}
-"circledast", 3, {226, 138, 155}
-"circledcirc", 3, {226, 138, 154}
-"circleddash", 3, {226, 138, 157}
-"CircleDot", 3, {226, 138, 153}
-"circledR", 2, {194, 174}
-"circledS", 3, {226, 147, 136}
-"CircleMinus", 3, {226, 138, 150}
-"CirclePlus", 3, {226, 138, 149}
-"CircleTimes", 3, {226, 138, 151}
-"cir", 3, {226, 151, 139}
-"cirE", 3, {226, 167, 131}
-"cire", 3, {226, 137, 151}
-"cirfnint", 3, {226, 168, 144}
-"cirmid", 3, {226, 171, 175}
-"cirscir", 3, {226, 167, 130}
-"ClockwiseContourIntegral", 3, {226, 136, 178}
-"CloseCurlyDoubleQuote", 3, {226, 128, 157}
-"CloseCurlyQuote", 3, {226, 128, 153}
-"clubs", 3, {226, 153, 163}
-"clubsuit", 3, {226, 153, 163}
-"colon", 1, {58}
-"Colon", 3, {226, 136, 183}
-"Colone", 3, {226, 169, 180}
-"colone", 3, {226, 137, 148}
-"coloneq", 3, {226, 137, 148}
-"comma", 1, {44}
-"commat", 1, {64}
-"comp", 3, {226, 136, 129}
-"compfn", 3, {226, 136, 152}
-"complement", 3, {226, 136, 129}
-"complexes", 3, {226, 132, 130}
-"cong", 3, {226, 137, 133}
-"congdot", 3, {226, 169, 173}
-"Congruent", 3, {226, 137, 161}
-"conint", 3, {226, 136, 174}
-"Conint", 3, {226, 136, 175}
-"ContourIntegral", 3, {226, 136, 174}
-"copf", 4, {240, 157, 149, 148}
-"Copf", 3, {226, 132, 130}
-"coprod", 3, {226, 136, 144}
-"Coproduct", 3, {226, 136, 144}
-"copy", 2, {194, 169}
-"COPY", 2, {194, 169}
-"copysr", 3, {226, 132, 151}
-"CounterClockwiseContourIntegral", 3, {226, 136, 179}
-"crarr", 3, {226, 134, 181}
-"cross", 3, {226, 156, 151}
-"Cross", 3, {226, 168, 175}
-"Cscr", 4, {240, 157, 146, 158}
-"cscr", 4, {240, 157, 146, 184}
-"csub", 3, {226, 171, 143}
-"csube", 3, {226, 171, 145}
-"csup", 3, {226, 171, 144}
-"csupe", 3, {226, 171, 146}
-"ctdot", 3, {226, 139, 175}
-"cudarrl", 3, {226, 164, 184}
-"cudarrr", 3, {226, 164, 181}
-"cuepr", 3, {226, 139, 158}
-"cuesc", 3, {226, 139, 159}
-"cularr", 3, {226, 134, 182}
-"cularrp", 3, {226, 164, 189}
-"cupbrcap", 3, {226, 169, 136}
-"cupcap", 3, {226, 169, 134}
-"CupCap", 3, {226, 137, 141}
-"cup", 3, {226, 136, 170}
-"Cup", 3, {226, 139, 147}
-"cupcup", 3, {226, 169, 138}
-"cupdot", 3, {226, 138, 141}
-"cupor", 3, {226, 169, 133}
-"cups", 3, {226, 136, 170}
-"curarr", 3, {226, 134, 183}
-"curarrm", 3, {226, 164, 188}
-"curlyeqprec", 3, {226, 139, 158}
-"curlyeqsucc", 3, {226, 139, 159}
-"curlyvee", 3, {226, 139, 142}
-"curlywedge", 3, {226, 139, 143}
-"curren", 2, {194, 164}
-"curvearrowleft", 3, {226, 134, 182}
-"curvearrowright", 3, {226, 134, 183}
-"cuvee", 3, {226, 139, 142}
-"cuwed", 3, {226, 139, 143}
-"cwconint", 3, {226, 136, 178}
-"cwint", 3, {226, 136, 177}
-"cylcty", 3, {226, 140, 173}
-"dagger", 3, {226, 128, 160}
-"Dagger", 3, {226, 128, 161}
-"daleth", 3, {226, 132, 184}
-"darr", 3, {226, 134, 147}
-"Darr", 3, {226, 134, 161}
-"dArr", 3, {226, 135, 147}
-"dash", 3, {226, 128, 144}
-"Dashv", 3, {226, 171, 164}
-"dashv", 3, {226, 138, 163}
-"dbkarow", 3, {226, 164, 143}
-"dblac", 2, {203, 157}
-"Dcaron", 2, {196, 142}
-"dcaron", 2, {196, 143}
-"Dcy", 2, {208, 148}
-"dcy", 2, {208, 180}
-"ddagger", 3, {226, 128, 161}
-"ddarr", 3, {226, 135, 138}
-"DD", 3, {226, 133, 133}
-"dd", 3, {226, 133, 134}
-"DDotrahd", 3, {226, 164, 145}
-"ddotseq", 3, {226, 169, 183}
-"deg", 2, {194, 176}
-"Del", 3, {226, 136, 135}
-"Delta", 2, {206, 148}
-"delta", 2, {206, 180}
-"demptyv", 3, {226, 166, 177}
-"dfisht", 3, {226, 165, 191}
-"Dfr", 4, {240, 157, 148, 135}
-"dfr", 4, {240, 157, 148, 161}
-"dHar", 3, {226, 165, 165}
-"dharl", 3, {226, 135, 131}
-"dharr", 3, {226, 135, 130}
-"DiacriticalAcute", 2, {194, 180}
-"DiacriticalDot", 2, {203, 153}
-"DiacriticalDoubleAcute", 2, {203, 157}
-"DiacriticalGrave", 1, {96}
-"DiacriticalTilde", 2, {203, 156}
-"diam", 3, {226, 139, 132}
-"diamond", 3, {226, 139, 132}
-"Diamond", 3, {226, 139, 132}
-"diamondsuit", 3, {226, 153, 166}
-"diams", 3, {226, 153, 166}
-"die", 2, {194, 168}
-"DifferentialD", 3, {226, 133, 134}
-"digamma", 2, {207, 157}
-"disin", 3, {226, 139, 178}
-"div", 2, {195, 183}
-"divide", 2, {195, 183}
-"divideontimes", 3, {226, 139, 135}
-"divonx", 3, {226, 139, 135}
-"DJcy", 2, {208, 130}
-"djcy", 2, {209, 146}
-"dlcorn", 3, {226, 140, 158}
-"dlcrop", 3, {226, 140, 141}
-"dollar", 1, {36}
-"Dopf", 4, {240, 157, 148, 187}
-"dopf", 4, {240, 157, 149, 149}
-"Dot", 2, {194, 168}
-"dot", 2, {203, 153}
-"DotDot", 3, {226, 131, 156}
-"doteq", 3, {226, 137, 144}
-"doteqdot", 3, {226, 137, 145}
-"DotEqual", 3, {226, 137, 144}
-"dotminus", 3, {226, 136, 184}
-"dotplus", 3, {226, 136, 148}
-"dotsquare", 3, {226, 138, 161}
-"doublebarwedge", 3, {226, 140, 134}
-"DoubleContourIntegral", 3, {226, 136, 175}
-"DoubleDot", 2, {194, 168}
-"DoubleDownArrow", 3, {226, 135, 147}
-"DoubleLeftArrow", 3, {226, 135, 144}
-"DoubleLeftRightArrow", 3, {226, 135, 148}
-"DoubleLeftTee", 3, {226, 171, 164}
-"DoubleLongLeftArrow", 3, {226, 159, 184}
-"DoubleLongLeftRightArrow", 3, {226, 159, 186}
-"DoubleLongRightArrow", 3, {226, 159, 185}
-"DoubleRightArrow", 3, {226, 135, 146}
-"DoubleRightTee", 3, {226, 138, 168}
-"DoubleUpArrow", 3, {226, 135, 145}
-"DoubleUpDownArrow", 3, {226, 135, 149}
-"DoubleVerticalBar", 3, {226, 136, 165}
-"DownArrowBar", 3, {226, 164, 147}
-"downarrow", 3, {226, 134, 147}
-"DownArrow", 3, {226, 134, 147}
-"Downarrow", 3, {226, 135, 147}
-"DownArrowUpArrow", 3, {226, 135, 181}
-"DownBreve", 2, {204, 145}
-"downdownarrows", 3, {226, 135, 138}
-"downharpoonleft", 3, {226, 135, 131}
-"downharpoonright", 3, {226, 135, 130}
-"DownLeftRightVector", 3, {226, 165, 144}
-"DownLeftTeeVector", 3, {226, 165, 158}
-"DownLeftVectorBar", 3, {226, 165, 150}
-"DownLeftVector", 3, {226, 134, 189}
-"DownRightTeeVector", 3, {226, 165, 159}
-"DownRightVectorBar", 3, {226, 165, 151}
-"DownRightVector", 3, {226, 135, 129}
-"DownTeeArrow", 3, {226, 134, 167}
-"DownTee", 3, {226, 138, 164}
-"drbkarow", 3, {226, 164, 144}
-"drcorn", 3, {226, 140, 159}
-"drcrop", 3, {226, 140, 140}
-"Dscr", 4, {240, 157, 146, 159}
-"dscr", 4, {240, 157, 146, 185}
-"DScy", 2, {208, 133}
-"dscy", 2, {209, 149}
-"dsol", 3, {226, 167, 182}
-"Dstrok", 2, {196, 144}
-"dstrok", 2, {196, 145}
-"dtdot", 3, {226, 139, 177}
-"dtri", 3, {226, 150, 191}
-"dtrif", 3, {226, 150, 190}
-"duarr", 3, {226, 135, 181}
-"duhar", 3, {226, 165, 175}
-"dwangle", 3, {226, 166, 166}
-"DZcy", 2, {208, 143}
-"dzcy", 2, {209, 159}
-"dzigrarr", 3, {226, 159, 191}
-"Eacute", 2, {195, 137}
-"eacute", 2, {195, 169}
-"easter", 3, {226, 169, 174}
-"Ecaron", 2, {196, 154}
-"ecaron", 2, {196, 155}
-"Ecirc", 2, {195, 138}
-"ecirc", 2, {195, 170}
-"ecir", 3, {226, 137, 150}
-"ecolon", 3, {226, 137, 149}
-"Ecy", 2, {208, 173}
-"ecy", 2, {209, 141}
-"eDDot", 3, {226, 169, 183}
-"Edot", 2, {196, 150}
-"edot", 2, {196, 151}
-"eDot", 3, {226, 137, 145}
-"ee", 3, {226, 133, 135}
-"efDot", 3, {226, 137, 146}
-"Efr", 4, {240, 157, 148, 136}
-"efr", 4, {240, 157, 148, 162}
-"eg", 3, {226, 170, 154}
-"Egrave", 2, {195, 136}
-"egrave", 2, {195, 168}
-"egs", 3, {226, 170, 150}
-"egsdot", 3, {226, 170, 152}
-"el", 3, {226, 170, 153}
-"Element", 3, {226, 136, 136}
-"elinters", 3, {226, 143, 167}
-"ell", 3, {226, 132, 147}
-"els", 3, {226, 170, 149}
-"elsdot", 3, {226, 170, 151}
-"Emacr", 2, {196, 146}
-"emacr", 2, {196, 147}
-"empty", 3, {226, 136, 133}
-"emptyset", 3, {226, 136, 133}
-"EmptySmallSquare", 3, {226, 151, 187}
-"emptyv", 3, {226, 136, 133}
-"EmptyVerySmallSquare", 3, {226, 150, 171}
-"emsp13", 3, {226, 128, 132}
-"emsp14", 3, {226, 128, 133}
-"emsp", 3, {226, 128, 131}
-"ENG", 2, {197, 138}
-"eng", 2, {197, 139}
-"ensp", 3, {226, 128, 130}
-"Eogon", 2, {196, 152}
-"eogon", 2, {196, 153}
-"Eopf", 4, {240, 157, 148, 188}
-"eopf", 4, {240, 157, 149, 150}
-"epar", 3, {226, 139, 149}
-"eparsl", 3, {226, 167, 163}
-"eplus", 3, {226, 169, 177}
-"epsi", 2, {206, 181}
-"Epsilon", 2, {206, 149}
-"epsilon", 2, {206, 181}
-"epsiv", 2, {207, 181}
-"eqcirc", 3, {226, 137, 150}
-"eqcolon", 3, {226, 137, 149}
-"eqsim", 3, {226, 137, 130}
-"eqslantgtr", 3, {226, 170, 150}
-"eqslantless", 3, {226, 170, 149}
-"Equal", 3, {226, 169, 181}
-"equals", 1, {61}
-"EqualTilde", 3, {226, 137, 130}
-"equest", 3, {226, 137, 159}
-"Equilibrium", 3, {226, 135, 140}
-"equiv", 3, {226, 137, 161}
-"equivDD", 3, {226, 169, 184}
-"eqvparsl", 3, {226, 167, 165}
-"erarr", 3, {226, 165, 177}
-"erDot", 3, {226, 137, 147}
-"escr", 3, {226, 132, 175}
-"Escr", 3, {226, 132, 176}
-"esdot", 3, {226, 137, 144}
-"Esim", 3, {226, 169, 179}
-"esim", 3, {226, 137, 130}
-"Eta", 2, {206, 151}
-"eta", 2, {206, 183}
-"ETH", 2, {195, 144}
-"eth", 2, {195, 176}
-"Euml", 2, {195, 139}
-"euml", 2, {195, 171}
-"euro", 3, {226, 130, 172}
-"excl", 1, {33}
-"exist", 3, {226, 136, 131}
-"Exists", 3, {226, 136, 131}
-"expectation", 3, {226, 132, 176}
-"exponentiale", 3, {226, 133, 135}
-"ExponentialE", 3, {226, 133, 135}
-"fallingdotseq", 3, {226, 137, 146}
-"Fcy", 2, {208, 164}
-"fcy", 2, {209, 132}
-"female", 3, {226, 153, 128}
-"ffilig", 3, {239, 172, 131}
-"fflig", 3, {239, 172, 128}
-"ffllig", 3, {239, 172, 132}
-"Ffr", 4, {240, 157, 148, 137}
-"ffr", 4, {240, 157, 148, 163}
-"filig", 3, {239, 172, 129}
-"FilledSmallSquare", 3, {226, 151, 188}
-"FilledVerySmallSquare", 3, {226, 150, 170}
-"fjlig", 1, {102}
-"flat", 3, {226, 153, 173}
-"fllig", 3, {239, 172, 130}
-"fltns", 3, {226, 150, 177}
-"fnof", 2, {198, 146}
-"Fopf", 4, {240, 157, 148, 189}
-"fopf", 4, {240, 157, 149, 151}
-"forall", 3, {226, 136, 128}
-"ForAll", 3, {226, 136, 128}
-"fork", 3, {226, 139, 148}
-"forkv", 3, {226, 171, 153}
-"Fouriertrf", 3, {226, 132, 177}
-"fpartint", 3, {226, 168, 141}
-"frac12", 2, {194, 189}
-"frac13", 3, {226, 133, 147}
-"frac14", 2, {194, 188}
-"frac15", 3, {226, 133, 149}
-"frac16", 3, {226, 133, 153}
-"frac18", 3, {226, 133, 155}
-"frac23", 3, {226, 133, 148}
-"frac25", 3, {226, 133, 150}
-"frac34", 2, {194, 190}
-"frac35", 3, {226, 133, 151}
-"frac38", 3, {226, 133, 156}
-"frac45", 3, {226, 133, 152}
-"frac56", 3, {226, 133, 154}
-"frac58", 3, {226, 133, 157}
-"frac78", 3, {226, 133, 158}
-"frasl", 3, {226, 129, 132}
-"frown", 3, {226, 140, 162}
-"fscr", 4, {240, 157, 146, 187}
-"Fscr", 3, {226, 132, 177}
-"gacute", 2, {199, 181}
-"Gamma", 2, {206, 147}
-"gamma", 2, {206, 179}
-"Gammad", 2, {207, 156}
-"gammad", 2, {207, 157}
-"gap", 3, {226, 170, 134}
-"Gbreve", 2, {196, 158}
-"gbreve", 2, {196, 159}
-"Gcedil", 2, {196, 162}
-"Gcirc", 2, {196, 156}
-"gcirc", 2, {196, 157}
-"Gcy", 2, {208, 147}
-"gcy", 2, {208, 179}
-"Gdot", 2, {196, 160}
-"gdot", 2, {196, 161}
-"ge", 3, {226, 137, 165}
-"gE", 3, {226, 137, 167}
-"gEl", 3, {226, 170, 140}
-"gel", 3, {226, 139, 155}
-"geq", 3, {226, 137, 165}
-"geqq", 3, {226, 137, 167}
-"geqslant", 3, {226, 169, 190}
-"gescc", 3, {226, 170, 169}
-"ges", 3, {226, 169, 190}
-"gesdot", 3, {226, 170, 128}
-"gesdoto", 3, {226, 170, 130}
-"gesdotol", 3, {226, 170, 132}
-"gesl", 3, {226, 139, 155}
-"gesles", 3, {226, 170, 148}
-"Gfr", 4, {240, 157, 148, 138}
-"gfr", 4, {240, 157, 148, 164}
-"gg", 3, {226, 137, 171}
-"Gg", 3, {226, 139, 153}
-"ggg", 3, {226, 139, 153}
-"gimel", 3, {226, 132, 183}
-"GJcy", 2, {208, 131}
-"gjcy", 2, {209, 147}
-"gla", 3, {226, 170, 165}
-"gl", 3, {226, 137, 183}
-"glE", 3, {226, 170, 146}
-"glj", 3, {226, 170, 164}
-"gnap", 3, {226, 170, 138}
-"gnapprox", 3, {226, 170, 138}
-"gne", 3, {226, 170, 136}
-"gnE", 3, {226, 137, 169}
-"gneq", 3, {226, 170, 136}
-"gneqq", 3, {226, 137, 169}
-"gnsim", 3, {226, 139, 167}
-"Gopf", 4, {240, 157, 148, 190}
-"gopf", 4, {240, 157, 149, 152}
-"grave", 1, {96}
-"GreaterEqual", 3, {226, 137, 165}
-"GreaterEqualLess", 3, {226, 139, 155}
-"GreaterFullEqual", 3, {226, 137, 167}
-"GreaterGreater", 3, {226, 170, 162}
-"GreaterLess", 3, {226, 137, 183}
-"GreaterSlantEqual", 3, {226, 169, 190}
-"GreaterTilde", 3, {226, 137, 179}
-"Gscr", 4, {240, 157, 146, 162}
-"gscr", 3, {226, 132, 138}
-"gsim", 3, {226, 137, 179}
-"gsime", 3, {226, 170, 142}
-"gsiml", 3, {226, 170, 144}
-"gtcc", 3, {226, 170, 167}
-"gtcir", 3, {226, 169, 186}
-"gt", 1, {62}
-"GT", 1, {62}
-"Gt", 3, {226, 137, 171}
-"gtdot", 3, {226, 139, 151}
-"gtlPar", 3, {226, 166, 149}
-"gtquest", 3, {226, 169, 188}
-"gtrapprox", 3, {226, 170, 134}
-"gtrarr", 3, {226, 165, 184}
-"gtrdot", 3, {226, 139, 151}
-"gtreqless", 3, {226, 139, 155}
-"gtreqqless", 3, {226, 170, 140}
-"gtrless", 3, {226, 137, 183}
-"gtrsim", 3, {226, 137, 179}
-"gvertneqq", 3, {226, 137, 169}
-"gvnE", 3, {226, 137, 169}
-"Hacek", 2, {203, 135}
-"hairsp", 3, {226, 128, 138}
-"half", 2, {194, 189}
-"hamilt", 3, {226, 132, 139}
-"HARDcy", 2, {208, 170}
-"hardcy", 2, {209, 138}
-"harrcir", 3, {226, 165, 136}
-"harr", 3, {226, 134, 148}
-"hArr", 3, {226, 135, 148}
-"harrw", 3, {226, 134, 173}
-"Hat", 1, {94}
-"hbar", 3, {226, 132, 143}
-"Hcirc", 2, {196, 164}
-"hcirc", 2, {196, 165}
-"hearts", 3, {226, 153, 165}
-"heartsuit", 3, {226, 153, 165}
-"hellip", 3, {226, 128, 166}
-"hercon", 3, {226, 138, 185}
-"hfr", 4, {240, 157, 148, 165}
-"Hfr", 3, {226, 132, 140}
-"HilbertSpace", 3, {226, 132, 139}
-"hksearow", 3, {226, 164, 165}
-"hkswarow", 3, {226, 164, 166}
-"hoarr", 3, {226, 135, 191}
-"homtht", 3, {226, 136, 187}
-"hookleftarrow", 3, {226, 134, 169}
-"hookrightarrow", 3, {226, 134, 170}
-"hopf", 4, {240, 157, 149, 153}
-"Hopf", 3, {226, 132, 141}
-"horbar", 3, {226, 128, 149}
-"HorizontalLine", 3, {226, 148, 128}
-"hscr", 4, {240, 157, 146, 189}
-"Hscr", 3, {226, 132, 139}
-"hslash", 3, {226, 132, 143}
-"Hstrok", 2, {196, 166}
-"hstrok", 2, {196, 167}
-"HumpDownHump", 3, {226, 137, 142}
-"HumpEqual", 3, {226, 137, 143}
-"hybull", 3, {226, 129, 131}
-"hyphen", 3, {226, 128, 144}
-"Iacute", 2, {195, 141}
-"iacute", 2, {195, 173}
-"ic", 3, {226, 129, 163}
-"Icirc", 2, {195, 142}
-"icirc", 2, {195, 174}
-"Icy", 2, {208, 152}
-"icy", 2, {208, 184}
-"Idot", 2, {196, 176}
-"IEcy", 2, {208, 149}
-"iecy", 2, {208, 181}
-"iexcl", 2, {194, 161}
-"iff", 3, {226, 135, 148}
-"ifr", 4, {240, 157, 148, 166}
-"Ifr", 3, {226, 132, 145}
-"Igrave", 2, {195, 140}
-"igrave", 2, {195, 172}
-"ii", 3, {226, 133, 136}
-"iiiint", 3, {226, 168, 140}
-"iiint", 3, {226, 136, 173}
-"iinfin", 3, {226, 167, 156}
-"iiota", 3, {226, 132, 169}
-"IJlig", 2, {196, 178}
-"ijlig", 2, {196, 179}
-"Imacr", 2, {196, 170}
-"imacr", 2, {196, 171}
-"image", 3, {226, 132, 145}
-"ImaginaryI", 3, {226, 133, 136}
-"imagline", 3, {226, 132, 144}
-"imagpart", 3, {226, 132, 145}
-"imath", 2, {196, 177}
-"Im", 3, {226, 132, 145}
-"imof", 3, {226, 138, 183}
-"imped", 2, {198, 181}
-"Implies", 3, {226, 135, 146}
-"incare", 3, {226, 132, 133}
-"in", 3, {226, 136, 136}
-"infin", 3, {226, 136, 158}
-"infintie", 3, {226, 167, 157}
-"inodot", 2, {196, 177}
-"intcal", 3, {226, 138, 186}
-"int", 3, {226, 136, 171}
-"Int", 3, {226, 136, 172}
-"integers", 3, {226, 132, 164}
-"Integral", 3, {226, 136, 171}
-"intercal", 3, {226, 138, 186}
-"Intersection", 3, {226, 139, 130}
-"intlarhk", 3, {226, 168, 151}
-"intprod", 3, {226, 168, 188}
-"InvisibleComma", 3, {226, 129, 163}
-"InvisibleTimes", 3, {226, 129, 162}
-"IOcy", 2, {208, 129}
-"iocy", 2, {209, 145}
-"Iogon", 2, {196, 174}
-"iogon", 2, {196, 175}
-"Iopf", 4, {240, 157, 149, 128}
-"iopf", 4, {240, 157, 149, 154}
-"Iota", 2, {206, 153}
-"iota", 2, {206, 185}
-"iprod", 3, {226, 168, 188}
-"iquest", 2, {194, 191}
-"iscr", 4, {240, 157, 146, 190}
-"Iscr", 3, {226, 132, 144}
-"isin", 3, {226, 136, 136}
-"isindot", 3, {226, 139, 181}
-"isinE", 3, {226, 139, 185}
-"isins", 3, {226, 139, 180}
-"isinsv", 3, {226, 139, 179}
-"isinv", 3, {226, 136, 136}
-"it", 3, {226, 129, 162}
-"Itilde", 2, {196, 168}
-"itilde", 2, {196, 169}
-"Iukcy", 2, {208, 134}
-"iukcy", 2, {209, 150}
-"Iuml", 2, {195, 143}
-"iuml", 2, {195, 175}
-"Jcirc", 2, {196, 180}
-"jcirc", 2, {196, 181}
-"Jcy", 2, {208, 153}
-"jcy", 2, {208, 185}
-"Jfr", 4, {240, 157, 148, 141}
-"jfr", 4, {240, 157, 148, 167}
-"jmath", 2, {200, 183}
-"Jopf", 4, {240, 157, 149, 129}
-"jopf", 4, {240, 157, 149, 155}
-"Jscr", 4, {240, 157, 146, 165}
-"jscr", 4, {240, 157, 146, 191}
-"Jsercy", 2, {208, 136}
-"jsercy", 2, {209, 152}
-"Jukcy", 2, {208, 132}
-"jukcy", 2, {209, 148}
-"Kappa", 2, {206, 154}
-"kappa", 2, {206, 186}
-"kappav", 2, {207, 176}
-"Kcedil", 2, {196, 182}
-"kcedil", 2, {196, 183}
-"Kcy", 2, {208, 154}
-"kcy", 2, {208, 186}
-"Kfr", 4, {240, 157, 148, 142}
-"kfr", 4, {240, 157, 148, 168}
-"kgreen", 2, {196, 184}
-"KHcy", 2, {208, 165}
-"khcy", 2, {209, 133}
-"KJcy", 2, {208, 140}
-"kjcy", 2, {209, 156}
-"Kopf", 4, {240, 157, 149, 130}
-"kopf", 4, {240, 157, 149, 156}
-"Kscr", 4, {240, 157, 146, 166}
-"kscr", 4, {240, 157, 147, 128}
-"lAarr", 3, {226, 135, 154}
-"Lacute", 2, {196, 185}
-"lacute", 2, {196, 186}
-"laemptyv", 3, {226, 166, 180}
-"lagran", 3, {226, 132, 146}
-"Lambda", 2, {206, 155}
-"lambda", 2, {206, 187}
-"lang", 3, {226, 159, 168}
-"Lang", 3, {226, 159, 170}
-"langd", 3, {226, 166, 145}
-"langle", 3, {226, 159, 168}
-"lap", 3, {226, 170, 133}
-"Laplacetrf", 3, {226, 132, 146}
-"laquo", 2, {194, 171}
-"larrb", 3, {226, 135, 164}
-"larrbfs", 3, {226, 164, 159}
-"larr", 3, {226, 134, 144}
-"Larr", 3, {226, 134, 158}
-"lArr", 3, {226, 135, 144}
-"larrfs", 3, {226, 164, 157}
-"larrhk", 3, {226, 134, 169}
-"larrlp", 3, {226, 134, 171}
-"larrpl", 3, {226, 164, 185}
-"larrsim", 3, {226, 165, 179}
-"larrtl", 3, {226, 134, 162}
-"latail", 3, {226, 164, 153}
-"lAtail", 3, {226, 164, 155}
-"lat", 3, {226, 170, 171}
-"late", 3, {226, 170, 173}
-"lates", 3, {226, 170, 173}
-"lbarr", 3, {226, 164, 140}
-"lBarr", 3, {226, 164, 142}
-"lbbrk", 3, {226, 157, 178}
-"lbrace", 1, {123}
-"lbrack", 1, {91}
-"lbrke", 3, {226, 166, 139}
-"lbrksld", 3, {226, 166, 143}
-"lbrkslu", 3, {226, 166, 141}
-"Lcaron", 2, {196, 189}
-"lcaron", 2, {196, 190}
-"Lcedil", 2, {196, 187}
-"lcedil", 2, {196, 188}
-"lceil", 3, {226, 140, 136}
-"lcub", 1, {123}
-"Lcy", 2, {208, 155}
-"lcy", 2, {208, 187}
-"ldca", 3, {226, 164, 182}
-"ldquo", 3, {226, 128, 156}
-"ldquor", 3, {226, 128, 158}
-"ldrdhar", 3, {226, 165, 167}
-"ldrushar", 3, {226, 165, 139}
-"ldsh", 3, {226, 134, 178}
-"le", 3, {226, 137, 164}
-"lE", 3, {226, 137, 166}
-"LeftAngleBracket", 3, {226, 159, 168}
-"LeftArrowBar", 3, {226, 135, 164}
-"leftarrow", 3, {226, 134, 144}
-"LeftArrow", 3, {226, 134, 144}
-"Leftarrow", 3, {226, 135, 144}
-"LeftArrowRightArrow", 3, {226, 135, 134}
-"leftarrowtail", 3, {226, 134, 162}
-"LeftCeiling", 3, {226, 140, 136}
-"LeftDoubleBracket", 3, {226, 159, 166}
-"LeftDownTeeVector", 3, {226, 165, 161}
-"LeftDownVectorBar", 3, {226, 165, 153}
-"LeftDownVector", 3, {226, 135, 131}
-"LeftFloor", 3, {226, 140, 138}
-"leftharpoondown", 3, {226, 134, 189}
-"leftharpoonup", 3, {226, 134, 188}
-"leftleftarrows", 3, {226, 135, 135}
-"leftrightarrow", 3, {226, 134, 148}
-"LeftRightArrow", 3, {226, 134, 148}
-"Leftrightarrow", 3, {226, 135, 148}
-"leftrightarrows", 3, {226, 135, 134}
-"leftrightharpoons", 3, {226, 135, 139}
-"leftrightsquigarrow", 3, {226, 134, 173}
-"LeftRightVector", 3, {226, 165, 142}
-"LeftTeeArrow", 3, {226, 134, 164}
-"LeftTee", 3, {226, 138, 163}
-"LeftTeeVector", 3, {226, 165, 154}
-"leftthreetimes", 3, {226, 139, 139}
-"LeftTriangleBar", 3, {226, 167, 143}
-"LeftTriangle", 3, {226, 138, 178}
-"LeftTriangleEqual", 3, {226, 138, 180}
-"LeftUpDownVector", 3, {226, 165, 145}
-"LeftUpTeeVector", 3, {226, 165, 160}
-"LeftUpVectorBar", 3, {226, 165, 152}
-"LeftUpVector", 3, {226, 134, 191}
-"LeftVectorBar", 3, {226, 165, 146}
-"LeftVector", 3, {226, 134, 188}
-"lEg", 3, {226, 170, 139}
-"leg", 3, {226, 139, 154}
-"leq", 3, {226, 137, 164}
-"leqq", 3, {226, 137, 166}
-"leqslant", 3, {226, 169, 189}
-"lescc", 3, {226, 170, 168}
-"les", 3, {226, 169, 189}
-"lesdot", 3, {226, 169, 191}
-"lesdoto", 3, {226, 170, 129}
-"lesdotor", 3, {226, 170, 131}
-"lesg", 3, {226, 139, 154}
-"lesges", 3, {226, 170, 147}
-"lessapprox", 3, {226, 170, 133}
-"lessdot", 3, {226, 139, 150}
-"lesseqgtr", 3, {226, 139, 154}
-"lesseqqgtr", 3, {226, 170, 139}
-"LessEqualGreater", 3, {226, 139, 154}
-"LessFullEqual", 3, {226, 137, 166}
-"LessGreater", 3, {226, 137, 182}
-"lessgtr", 3, {226, 137, 182}
-"LessLess", 3, {226, 170, 161}
-"lesssim", 3, {226, 137, 178}
-"LessSlantEqual", 3, {226, 169, 189}
-"LessTilde", 3, {226, 137, 178}
-"lfisht", 3, {226, 165, 188}
-"lfloor", 3, {226, 140, 138}
-"Lfr", 4, {240, 157, 148, 143}
-"lfr", 4, {240, 157, 148, 169}
-"lg", 3, {226, 137, 182}
-"lgE", 3, {226, 170, 145}
-"lHar", 3, {226, 165, 162}
-"lhard", 3, {226, 134, 189}
-"lharu", 3, {226, 134, 188}
-"lharul", 3, {226, 165, 170}
-"lhblk", 3, {226, 150, 132}
-"LJcy", 2, {208, 137}
-"ljcy", 2, {209, 153}
-"llarr", 3, {226, 135, 135}
-"ll", 3, {226, 137, 170}
-"Ll", 3, {226, 139, 152}
-"llcorner", 3, {226, 140, 158}
-"Lleftarrow", 3, {226, 135, 154}
-"llhard", 3, {226, 165, 171}
-"lltri", 3, {226, 151, 186}
-"Lmidot", 2, {196, 191}
-"lmidot", 2, {197, 128}
-"lmoustache", 3, {226, 142, 176}
-"lmoust", 3, {226, 142, 176}
-"lnap", 3, {226, 170, 137}
-"lnapprox", 3, {226, 170, 137}
-"lne", 3, {226, 170, 135}
-"lnE", 3, {226, 137, 168}
-"lneq", 3, {226, 170, 135}
-"lneqq", 3, {226, 137, 168}
-"lnsim", 3, {226, 139, 166}
-"loang", 3, {226, 159, 172}
-"loarr", 3, {226, 135, 189}
-"lobrk", 3, {226, 159, 166}
-"longleftarrow", 3, {226, 159, 181}
-"LongLeftArrow", 3, {226, 159, 181}
-"Longleftarrow", 3, {226, 159, 184}
-"longleftrightarrow", 3, {226, 159, 183}
-"LongLeftRightArrow", 3, {226, 159, 183}
-"Longleftrightarrow", 3, {226, 159, 186}
-"longmapsto", 3, {226, 159, 188}
-"longrightarrow", 3, {226, 159, 182}
-"LongRightArrow", 3, {226, 159, 182}
-"Longrightarrow", 3, {226, 159, 185}
-"looparrowleft", 3, {226, 134, 171}
-"looparrowright", 3, {226, 134, 172}
-"lopar", 3, {226, 166, 133}
-"Lopf", 4, {240, 157, 149, 131}
-"lopf", 4, {240, 157, 149, 157}
-"loplus", 3, {226, 168, 173}
-"lotimes", 3, {226, 168, 180}
-"lowast", 3, {226, 136, 151}
-"lowbar", 1, {95}
-"LowerLeftArrow", 3, {226, 134, 153}
-"LowerRightArrow", 3, {226, 134, 152}
-"loz", 3, {226, 151, 138}
-"lozenge", 3, {226, 151, 138}
-"lozf", 3, {226, 167, 171}
-"lpar", 1, {40}
-"lparlt", 3, {226, 166, 147}
-"lrarr", 3, {226, 135, 134}
-"lrcorner", 3, {226, 140, 159}
-"lrhar", 3, {226, 135, 139}
-"lrhard", 3, {226, 165, 173}
-"lrm", 3, {226, 128, 142}
-"lrtri", 3, {226, 138, 191}
-"lsaquo", 3, {226, 128, 185}
-"lscr", 4, {240, 157, 147, 129}
-"Lscr", 3, {226, 132, 146}
-"lsh", 3, {226, 134, 176}
-"Lsh", 3, {226, 134, 176}
-"lsim", 3, {226, 137, 178}
-"lsime", 3, {226, 170, 141}
-"lsimg", 3, {226, 170, 143}
-"lsqb", 1, {91}
-"lsquo", 3, {226, 128, 152}
-"lsquor", 3, {226, 128, 154}
-"Lstrok", 2, {197, 129}
-"lstrok", 2, {197, 130}
-"ltcc", 3, {226, 170, 166}
-"ltcir", 3, {226, 169, 185}
-"lt", 1, {60}
-"LT", 1, {60}
-"Lt", 3, {226, 137, 170}
-"ltdot", 3, {226, 139, 150}
-"lthree", 3, {226, 139, 139}
-"ltimes", 3, {226, 139, 137}
-"ltlarr", 3, {226, 165, 182}
-"ltquest", 3, {226, 169, 187}
-"ltri", 3, {226, 151, 131}
-"ltrie", 3, {226, 138, 180}
-"ltrif", 3, {226, 151, 130}
-"ltrPar", 3, {226, 166, 150}
-"lurdshar", 3, {226, 165, 138}
-"luruhar", 3, {226, 165, 166}
-"lvertneqq", 3, {226, 137, 168}
-"lvnE", 3, {226, 137, 168}
-"macr", 2, {194, 175}
-"male", 3, {226, 153, 130}
-"malt", 3, {226, 156, 160}
-"maltese", 3, {226, 156, 160}
-"Map", 3, {226, 164, 133}
-"map", 3, {226, 134, 166}
-"mapsto", 3, {226, 134, 166}
-"mapstodown", 3, {226, 134, 167}
-"mapstoleft", 3, {226, 134, 164}
-"mapstoup", 3, {226, 134, 165}
-"marker", 3, {226, 150, 174}
-"mcomma", 3, {226, 168, 169}
-"Mcy", 2, {208, 156}
-"mcy", 2, {208, 188}
-"mdash", 3, {226, 128, 148}
-"mDDot", 3, {226, 136, 186}
-"measuredangle", 3, {226, 136, 161}
-"MediumSpace", 3, {226, 129, 159}
-"Mellintrf", 3, {226, 132, 179}
-"Mfr", 4, {240, 157, 148, 144}
-"mfr", 4, {240, 157, 148, 170}
-"mho", 3, {226, 132, 167}
-"micro", 2, {194, 181}
-"midast", 1, {42}
-"midcir", 3, {226, 171, 176}
-"mid", 3, {226, 136, 163}
-"middot", 2, {194, 183}
-"minusb", 3, {226, 138, 159}
-"minus", 3, {226, 136, 146}
-"minusd", 3, {226, 136, 184}
-"minusdu", 3, {226, 168, 170}
-"MinusPlus", 3, {226, 136, 147}
-"mlcp", 3, {226, 171, 155}
-"mldr", 3, {226, 128, 166}
-"mnplus", 3, {226, 136, 147}
-"models", 3, {226, 138, 167}
-"Mopf", 4, {240, 157, 149, 132}
-"mopf", 4, {240, 157, 149, 158}
-"mp", 3, {226, 136, 147}
-"mscr", 4, {240, 157, 147, 130}
-"Mscr", 3, {226, 132, 179}
-"mstpos", 3, {226, 136, 190}
-"Mu", 2, {206, 156}
-"mu", 2, {206, 188}
-"multimap", 3, {226, 138, 184}
-"mumap", 3, {226, 138, 184}
-"nabla", 3, {226, 136, 135}
-"Nacute", 2, {197, 131}
-"nacute", 2, {197, 132}
-"nang", 3, {226, 136, 160}
-"nap", 3, {226, 137, 137}
-"napE", 3, {226, 169, 176}
-"napid", 3, {226, 137, 139}
-"napos", 2, {197, 137}
-"napprox", 3, {226, 137, 137}
-"natural", 3, {226, 153, 174}
-"naturals", 3, {226, 132, 149}
-"natur", 3, {226, 153, 174}
-"nbsp", 2, {194, 160}
-"nbump", 3, {226, 137, 142}
-"nbumpe", 3, {226, 137, 143}
-"ncap", 3, {226, 169, 131}
-"Ncaron", 2, {197, 135}
-"ncaron", 2, {197, 136}
-"Ncedil", 2, {197, 133}
-"ncedil", 2, {197, 134}
-"ncong", 3, {226, 137, 135}
-"ncongdot", 3, {226, 169, 173}
-"ncup", 3, {226, 169, 130}
-"Ncy", 2, {208, 157}
-"ncy", 2, {208, 189}
-"ndash", 3, {226, 128, 147}
-"nearhk", 3, {226, 164, 164}
-"nearr", 3, {226, 134, 151}
-"neArr", 3, {226, 135, 151}
-"nearrow", 3, {226, 134, 151}
-"ne", 3, {226, 137, 160}
-"nedot", 3, {226, 137, 144}
-"NegativeMediumSpace", 3, {226, 128, 139}
-"NegativeThickSpace", 3, {226, 128, 139}
-"NegativeThinSpace", 3, {226, 128, 139}
-"NegativeVeryThinSpace", 3, {226, 128, 139}
-"nequiv", 3, {226, 137, 162}
-"nesear", 3, {226, 164, 168}
-"nesim", 3, {226, 137, 130}
-"NestedGreaterGreater", 3, {226, 137, 171}
-"NestedLessLess", 3, {226, 137, 170}
-"NewLine", 1, {10}
-"nexist", 3, {226, 136, 132}
-"nexists", 3, {226, 136, 132}
-"Nfr", 4, {240, 157, 148, 145}
-"nfr", 4, {240, 157, 148, 171}
-"ngE", 3, {226, 137, 167}
-"nge", 3, {226, 137, 177}
-"ngeq", 3, {226, 137, 177}
-"ngeqq", 3, {226, 137, 167}
-"ngeqslant", 3, {226, 169, 190}
-"nges", 3, {226, 169, 190}
-"nGg", 3, {226, 139, 153}
-"ngsim", 3, {226, 137, 181}
-"nGt", 3, {226, 137, 171}
-"ngt", 3, {226, 137, 175}
-"ngtr", 3, {226, 137, 175}
-"nGtv", 3, {226, 137, 171}
-"nharr", 3, {226, 134, 174}
-"nhArr", 3, {226, 135, 142}
-"nhpar", 3, {226, 171, 178}
-"ni", 3, {226, 136, 139}
-"nis", 3, {226, 139, 188}
-"nisd", 3, {226, 139, 186}
-"niv", 3, {226, 136, 139}
-"NJcy", 2, {208, 138}
-"njcy", 2, {209, 154}
-"nlarr", 3, {226, 134, 154}
-"nlArr", 3, {226, 135, 141}
-"nldr", 3, {226, 128, 165}
-"nlE", 3, {226, 137, 166}
-"nle", 3, {226, 137, 176}
-"nleftarrow", 3, {226, 134, 154}
-"nLeftarrow", 3, {226, 135, 141}
-"nleftrightarrow", 3, {226, 134, 174}
-"nLeftrightarrow", 3, {226, 135, 142}
-"nleq", 3, {226, 137, 176}
-"nleqq", 3, {226, 137, 166}
-"nleqslant", 3, {226, 169, 189}
-"nles", 3, {226, 169, 189}
-"nless", 3, {226, 137, 174}
-"nLl", 3, {226, 139, 152}
-"nlsim", 3, {226, 137, 180}
-"nLt", 3, {226, 137, 170}
-"nlt", 3, {226, 137, 174}
-"nltri", 3, {226, 139, 170}
-"nltrie", 3, {226, 139, 172}
-"nLtv", 3, {226, 137, 170}
-"nmid", 3, {226, 136, 164}
-"NoBreak", 3, {226, 129, 160}
-"NonBreakingSpace", 2, {194, 160}
-"nopf", 4, {240, 157, 149, 159}
-"Nopf", 3, {226, 132, 149}
-"Not", 3, {226, 171, 172}
-"not", 2, {194, 172}
-"NotCongruent", 3, {226, 137, 162}
-"NotCupCap", 3, {226, 137, 173}
-"NotDoubleVerticalBar", 3, {226, 136, 166}
-"NotElement", 3, {226, 136, 137}
-"NotEqual", 3, {226, 137, 160}
-"NotEqualTilde", 3, {226, 137, 130}
-"NotExists", 3, {226, 136, 132}
-"NotGreater", 3, {226, 137, 175}
-"NotGreaterEqual", 3, {226, 137, 177}
-"NotGreaterFullEqual", 3, {226, 137, 167}
-"NotGreaterGreater", 3, {226, 137, 171}
-"NotGreaterLess", 3, {226, 137, 185}
-"NotGreaterSlantEqual", 3, {226, 169, 190}
-"NotGreaterTilde", 3, {226, 137, 181}
-"NotHumpDownHump", 3, {226, 137, 142}
-"NotHumpEqual", 3, {226, 137, 143}
-"notin", 3, {226, 136, 137}
-"notindot", 3, {226, 139, 181}
-"notinE", 3, {226, 139, 185}
-"notinva", 3, {226, 136, 137}
-"notinvb", 3, {226, 139, 183}
-"notinvc", 3, {226, 139, 182}
-"NotLeftTriangleBar", 3, {226, 167, 143}
-"NotLeftTriangle", 3, {226, 139, 170}
-"NotLeftTriangleEqual", 3, {226, 139, 172}
-"NotLess", 3, {226, 137, 174}
-"NotLessEqual", 3, {226, 137, 176}
-"NotLessGreater", 3, {226, 137, 184}
-"NotLessLess", 3, {226, 137, 170}
-"NotLessSlantEqual", 3, {226, 169, 189}
-"NotLessTilde", 3, {226, 137, 180}
-"NotNestedGreaterGreater", 3, {226, 170, 162}
-"NotNestedLessLess", 3, {226, 170, 161}
-"notni", 3, {226, 136, 140}
-"notniva", 3, {226, 136, 140}
-"notnivb", 3, {226, 139, 190}
-"notnivc", 3, {226, 139, 189}
-"NotPrecedes", 3, {226, 138, 128}
-"NotPrecedesEqual", 3, {226, 170, 175}
-"NotPrecedesSlantEqual", 3, {226, 139, 160}
-"NotReverseElement", 3, {226, 136, 140}
-"NotRightTriangleBar", 3, {226, 167, 144}
-"NotRightTriangle", 3, {226, 139, 171}
-"NotRightTriangleEqual", 3, {226, 139, 173}
-"NotSquareSubset", 3, {226, 138, 143}
-"NotSquareSubsetEqual", 3, {226, 139, 162}
-"NotSquareSuperset", 3, {226, 138, 144}
-"NotSquareSupersetEqual", 3, {226, 139, 163}
-"NotSubset", 3, {226, 138, 130}
-"NotSubsetEqual", 3, {226, 138, 136}
-"NotSucceeds", 3, {226, 138, 129}
-"NotSucceedsEqual", 3, {226, 170, 176}
-"NotSucceedsSlantEqual", 3, {226, 139, 161}
-"NotSucceedsTilde", 3, {226, 137, 191}
-"NotSuperset", 3, {226, 138, 131}
-"NotSupersetEqual", 3, {226, 138, 137}
-"NotTilde", 3, {226, 137, 129}
-"NotTildeEqual", 3, {226, 137, 132}
-"NotTildeFullEqual", 3, {226, 137, 135}
-"NotTildeTilde", 3, {226, 137, 137}
-"NotVerticalBar", 3, {226, 136, 164}
-"nparallel", 3, {226, 136, 166}
-"npar", 3, {226, 136, 166}
-"nparsl", 3, {226, 171, 189}
-"npart", 3, {226, 136, 130}
-"npolint", 3, {226, 168, 148}
-"npr", 3, {226, 138, 128}
-"nprcue", 3, {226, 139, 160}
-"nprec", 3, {226, 138, 128}
-"npreceq", 3, {226, 170, 175}
-"npre", 3, {226, 170, 175}
-"nrarrc", 3, {226, 164, 179}
-"nrarr", 3, {226, 134, 155}
-"nrArr", 3, {226, 135, 143}
-"nrarrw", 3, {226, 134, 157}
-"nrightarrow", 3, {226, 134, 155}
-"nRightarrow", 3, {226, 135, 143}
-"nrtri", 3, {226, 139, 171}
-"nrtrie", 3, {226, 139, 173}
-"nsc", 3, {226, 138, 129}
-"nsccue", 3, {226, 139, 161}
-"nsce", 3, {226, 170, 176}
-"Nscr", 4, {240, 157, 146, 169}
-"nscr", 4, {240, 157, 147, 131}
-"nshortmid", 3, {226, 136, 164}
-"nshortparallel", 3, {226, 136, 166}
-"nsim", 3, {226, 137, 129}
-"nsime", 3, {226, 137, 132}
-"nsimeq", 3, {226, 137, 132}
-"nsmid", 3, {226, 136, 164}
-"nspar", 3, {226, 136, 166}
-"nsqsube", 3, {226, 139, 162}
-"nsqsupe", 3, {226, 139, 163}
-"nsub", 3, {226, 138, 132}
-"nsubE", 3, {226, 171, 133}
-"nsube", 3, {226, 138, 136}
-"nsubset", 3, {226, 138, 130}
-"nsubseteq", 3, {226, 138, 136}
-"nsubseteqq", 3, {226, 171, 133}
-"nsucc", 3, {226, 138, 129}
-"nsucceq", 3, {226, 170, 176}
-"nsup", 3, {226, 138, 133}
-"nsupE", 3, {226, 171, 134}
-"nsupe", 3, {226, 138, 137}
-"nsupset", 3, {226, 138, 131}
-"nsupseteq", 3, {226, 138, 137}
-"nsupseteqq", 3, {226, 171, 134}
-"ntgl", 3, {226, 137, 185}
-"Ntilde", 2, {195, 145}
-"ntilde", 2, {195, 177}
-"ntlg", 3, {226, 137, 184}
-"ntriangleleft", 3, {226, 139, 170}
-"ntrianglelefteq", 3, {226, 139, 172}
-"ntriangleright", 3, {226, 139, 171}
-"ntrianglerighteq", 3, {226, 139, 173}
-"Nu", 2, {206, 157}
-"nu", 2, {206, 189}
-"num", 1, {35}
-"numero", 3, {226, 132, 150}
-"numsp", 3, {226, 128, 135}
-"nvap", 3, {226, 137, 141}
-"nvdash", 3, {226, 138, 172}
-"nvDash", 3, {226, 138, 173}
-"nVdash", 3, {226, 138, 174}
-"nVDash", 3, {226, 138, 175}
-"nvge", 3, {226, 137, 165}
-"nvgt", 1, {62}
-"nvHarr", 3, {226, 164, 132}
-"nvinfin", 3, {226, 167, 158}
-"nvlArr", 3, {226, 164, 130}
-"nvle", 3, {226, 137, 164}
-"nvlt", 1, {60}
-"nvltrie", 3, {226, 138, 180}
-"nvrArr", 3, {226, 164, 131}
-"nvrtrie", 3, {226, 138, 181}
-"nvsim", 3, {226, 136, 188}
-"nwarhk", 3, {226, 164, 163}
-"nwarr", 3, {226, 134, 150}
-"nwArr", 3, {226, 135, 150}
-"nwarrow", 3, {226, 134, 150}
-"nwnear", 3, {226, 164, 167}
-"Oacute", 2, {195, 147}
-"oacute", 2, {195, 179}
-"oast", 3, {226, 138, 155}
-"Ocirc", 2, {195, 148}
-"ocirc", 2, {195, 180}
-"ocir", 3, {226, 138, 154}
-"Ocy", 2, {208, 158}
-"ocy", 2, {208, 190}
-"odash", 3, {226, 138, 157}
-"Odblac", 2, {197, 144}
-"odblac", 2, {197, 145}
-"odiv", 3, {226, 168, 184}
-"odot", 3, {226, 138, 153}
-"odsold", 3, {226, 166, 188}
-"OElig", 2, {197, 146}
-"oelig", 2, {197, 147}
-"ofcir", 3, {226, 166, 191}
-"Ofr", 4, {240, 157, 148, 146}
-"ofr", 4, {240, 157, 148, 172}
-"ogon", 2, {203, 155}
-"Ograve", 2, {195, 146}
-"ograve", 2, {195, 178}
-"ogt", 3, {226, 167, 129}
-"ohbar", 3, {226, 166, 181}
-"ohm", 2, {206, 169}
-"oint", 3, {226, 136, 174}
-"olarr", 3, {226, 134, 186}
-"olcir", 3, {226, 166, 190}
-"olcross", 3, {226, 166, 187}
-"oline", 3, {226, 128, 190}
-"olt", 3, {226, 167, 128}
-"Omacr", 2, {197, 140}
-"omacr", 2, {197, 141}
-"Omega", 2, {206, 169}
-"omega", 2, {207, 137}
-"Omicron", 2, {206, 159}
-"omicron", 2, {206, 191}
-"omid", 3, {226, 166, 182}
-"ominus", 3, {226, 138, 150}
-"Oopf", 4, {240, 157, 149, 134}
-"oopf", 4, {240, 157, 149, 160}
-"opar", 3, {226, 166, 183}
-"OpenCurlyDoubleQuote", 3, {226, 128, 156}
-"OpenCurlyQuote", 3, {226, 128, 152}
-"operp", 3, {226, 166, 185}
-"oplus", 3, {226, 138, 149}
-"orarr", 3, {226, 134, 187}
-"Or", 3, {226, 169, 148}
-"or", 3, {226, 136, 168}
-"ord", 3, {226, 169, 157}
-"order", 3, {226, 132, 180}
-"orderof", 3, {226, 132, 180}
-"ordf", 2, {194, 170}
-"ordm", 2, {194, 186}
-"origof", 3, {226, 138, 182}
-"oror", 3, {226, 169, 150}
-"orslope", 3, {226, 169, 151}
-"orv", 3, {226, 169, 155}
-"oS", 3, {226, 147, 136}
-"Oscr", 4, {240, 157, 146, 170}
-"oscr", 3, {226, 132, 180}
-"Oslash", 2, {195, 152}
-"oslash", 2, {195, 184}
-"osol", 3, {226, 138, 152}
-"Otilde", 2, {195, 149}
-"otilde", 2, {195, 181}
-"otimesas", 3, {226, 168, 182}
-"Otimes", 3, {226, 168, 183}
-"otimes", 3, {226, 138, 151}
-"Ouml", 2, {195, 150}
-"ouml", 2, {195, 182}
-"ovbar", 3, {226, 140, 189}
-"OverBar", 3, {226, 128, 190}
-"OverBrace", 3, {226, 143, 158}
-"OverBracket", 3, {226, 142, 180}
-"OverParenthesis", 3, {226, 143, 156}
-"para", 2, {194, 182}
-"parallel", 3, {226, 136, 165}
-"par", 3, {226, 136, 165}
-"parsim", 3, {226, 171, 179}
-"parsl", 3, {226, 171, 189}
-"part", 3, {226, 136, 130}
-"PartialD", 3, {226, 136, 130}
-"Pcy", 2, {208, 159}
-"pcy", 2, {208, 191}
-"percnt", 1, {37}
-"period", 1, {46}
-"permil", 3, {226, 128, 176}
-"perp", 3, {226, 138, 165}
-"pertenk", 3, {226, 128, 177}
-"Pfr", 4, {240, 157, 148, 147}
-"pfr", 4, {240, 157, 148, 173}
-"Phi", 2, {206, 166}
-"phi", 2, {207, 134}
-"phiv", 2, {207, 149}
-"phmmat", 3, {226, 132, 179}
-"phone", 3, {226, 152, 142}
-"Pi", 2, {206, 160}
-"pi", 2, {207, 128}
-"pitchfork", 3, {226, 139, 148}
-"piv", 2, {207, 150}
-"planck", 3, {226, 132, 143}
-"planckh", 3, {226, 132, 142}
-"plankv", 3, {226, 132, 143}
-"plusacir", 3, {226, 168, 163}
-"plusb", 3, {226, 138, 158}
-"pluscir", 3, {226, 168, 162}
-"plus", 1, {43}
-"plusdo", 3, {226, 136, 148}
-"plusdu", 3, {226, 168, 165}
-"pluse", 3, {226, 169, 178}
-"PlusMinus", 2, {194, 177}
-"plusmn", 2, {194, 177}
-"plussim", 3, {226, 168, 166}
-"plustwo", 3, {226, 168, 167}
-"pm", 2, {194, 177}
-"Poincareplane", 3, {226, 132, 140}
-"pointint", 3, {226, 168, 149}
-"popf", 4, {240, 157, 149, 161}
-"Popf", 3, {226, 132, 153}
-"pound", 2, {194, 163}
-"prap", 3, {226, 170, 183}
-"Pr", 3, {226, 170, 187}
-"pr", 3, {226, 137, 186}
-"prcue", 3, {226, 137, 188}
-"precapprox", 3, {226, 170, 183}
-"prec", 3, {226, 137, 186}
-"preccurlyeq", 3, {226, 137, 188}
-"Precedes", 3, {226, 137, 186}
-"PrecedesEqual", 3, {226, 170, 175}
-"PrecedesSlantEqual", 3, {226, 137, 188}
-"PrecedesTilde", 3, {226, 137, 190}
-"preceq", 3, {226, 170, 175}
-"precnapprox", 3, {226, 170, 185}
-"precneqq", 3, {226, 170, 181}
-"precnsim", 3, {226, 139, 168}
-"pre", 3, {226, 170, 175}
-"prE", 3, {226, 170, 179}
-"precsim", 3, {226, 137, 190}
-"prime", 3, {226, 128, 178}
-"Prime", 3, {226, 128, 179}
-"primes", 3, {226, 132, 153}
-"prnap", 3, {226, 170, 185}
-"prnE", 3, {226, 170, 181}
-"prnsim", 3, {226, 139, 168}
-"prod", 3, {226, 136, 143}
-"Product", 3, {226, 136, 143}
-"profalar", 3, {226, 140, 174}
-"profline", 3, {226, 140, 146}
-"profsurf", 3, {226, 140, 147}
-"prop", 3, {226, 136, 157}
-"Proportional", 3, {226, 136, 157}
-"Proportion", 3, {226, 136, 183}
-"propto", 3, {226, 136, 157}
-"prsim", 3, {226, 137, 190}
-"prurel", 3, {226, 138, 176}
-"Pscr", 4, {240, 157, 146, 171}
-"pscr", 4, {240, 157, 147, 133}
-"Psi", 2, {206, 168}
-"psi", 2, {207, 136}
-"puncsp", 3, {226, 128, 136}
-"Qfr", 4, {240, 157, 148, 148}
-"qfr", 4, {240, 157, 148, 174}
-"qint", 3, {226, 168, 140}
-"qopf", 4, {240, 157, 149, 162}
-"Qopf", 3, {226, 132, 154}
-"qprime", 3, {226, 129, 151}
-"Qscr", 4, {240, 157, 146, 172}
-"qscr", 4, {240, 157, 147, 134}
-"quaternions", 3, {226, 132, 141}
-"quatint", 3, {226, 168, 150}
-"quest", 1, {63}
-"questeq", 3, {226, 137, 159}
-"quot", 1, {34}
-"QUOT", 1, {34}
-"rAarr", 3, {226, 135, 155}
-"race", 3, {226, 136, 189}
-"Racute", 2, {197, 148}
-"racute", 2, {197, 149}
-"radic", 3, {226, 136, 154}
-"raemptyv", 3, {226, 166, 179}
-"rang", 3, {226, 159, 169}
-"Rang", 3, {226, 159, 171}
-"rangd", 3, {226, 166, 146}
-"range", 3, {226, 166, 165}
-"rangle", 3, {226, 159, 169}
-"raquo", 2, {194, 187}
-"rarrap", 3, {226, 165, 181}
-"rarrb", 3, {226, 135, 165}
-"rarrbfs", 3, {226, 164, 160}
-"rarrc", 3, {226, 164, 179}
-"rarr", 3, {226, 134, 146}
-"Rarr", 3, {226, 134, 160}
-"rArr", 3, {226, 135, 146}
-"rarrfs", 3, {226, 164, 158}
-"rarrhk", 3, {226, 134, 170}
-"rarrlp", 3, {226, 134, 172}
-"rarrpl", 3, {226, 165, 133}
-"rarrsim", 3, {226, 165, 180}
-"Rarrtl", 3, {226, 164, 150}
-"rarrtl", 3, {226, 134, 163}
-"rarrw", 3, {226, 134, 157}
-"ratail", 3, {226, 164, 154}
-"rAtail", 3, {226, 164, 156}
-"ratio", 3, {226, 136, 182}
-"rationals", 3, {226, 132, 154}
-"rbarr", 3, {226, 164, 141}
-"rBarr", 3, {226, 164, 143}
-"RBarr", 3, {226, 164, 144}
-"rbbrk", 3, {226, 157, 179}
-"rbrace", 1, {125}
-"rbrack", 1, {93}
-"rbrke", 3, {226, 166, 140}
-"rbrksld", 3, {226, 166, 142}
-"rbrkslu", 3, {226, 166, 144}
-"Rcaron", 2, {197, 152}
-"rcaron", 2, {197, 153}
-"Rcedil", 2, {197, 150}
-"rcedil", 2, {197, 151}
-"rceil", 3, {226, 140, 137}
-"rcub", 1, {125}
-"Rcy", 2, {208, 160}
-"rcy", 2, {209, 128}
-"rdca", 3, {226, 164, 183}
-"rdldhar", 3, {226, 165, 169}
-"rdquo", 3, {226, 128, 157}
-"rdquor", 3, {226, 128, 157}
-"rdsh", 3, {226, 134, 179}
-"real", 3, {226, 132, 156}
-"realine", 3, {226, 132, 155}
-"realpart", 3, {226, 132, 156}
-"reals", 3, {226, 132, 157}
-"Re", 3, {226, 132, 156}
-"rect", 3, {226, 150, 173}
-"reg", 2, {194, 174}
-"REG", 2, {194, 174}
-"ReverseElement", 3, {226, 136, 139}
-"ReverseEquilibrium", 3, {226, 135, 139}
-"ReverseUpEquilibrium", 3, {226, 165, 175}
-"rfisht", 3, {226, 165, 189}
-"rfloor", 3, {226, 140, 139}
-"rfr", 4, {240, 157, 148, 175}
-"Rfr", 3, {226, 132, 156}
-"rHar", 3, {226, 165, 164}
-"rhard", 3, {226, 135, 129}
-"rharu", 3, {226, 135, 128}
-"rharul", 3, {226, 165, 172}
-"Rho", 2, {206, 161}
-"rho", 2, {207, 129}
-"rhov", 2, {207, 177}
-"RightAngleBracket", 3, {226, 159, 169}
-"RightArrowBar", 3, {226, 135, 165}
-"rightarrow", 3, {226, 134, 146}
-"RightArrow", 3, {226, 134, 146}
-"Rightarrow", 3, {226, 135, 146}
-"RightArrowLeftArrow", 3, {226, 135, 132}
-"rightarrowtail", 3, {226, 134, 163}
-"RightCeiling", 3, {226, 140, 137}
-"RightDoubleBracket", 3, {226, 159, 167}
-"RightDownTeeVector", 3, {226, 165, 157}
-"RightDownVectorBar", 3, {226, 165, 149}
-"RightDownVector", 3, {226, 135, 130}
-"RightFloor", 3, {226, 140, 139}
-"rightharpoondown", 3, {226, 135, 129}
-"rightharpoonup", 3, {226, 135, 128}
-"rightleftarrows", 3, {226, 135, 132}
-"rightleftharpoons", 3, {226, 135, 140}
-"rightrightarrows", 3, {226, 135, 137}
-"rightsquigarrow", 3, {226, 134, 157}
-"RightTeeArrow", 3, {226, 134, 166}
-"RightTee", 3, {226, 138, 162}
-"RightTeeVector", 3, {226, 165, 155}
-"rightthreetimes", 3, {226, 139, 140}
-"RightTriangleBar", 3, {226, 167, 144}
-"RightTriangle", 3, {226, 138, 179}
-"RightTriangleEqual", 3, {226, 138, 181}
-"RightUpDownVector", 3, {226, 165, 143}
-"RightUpTeeVector", 3, {226, 165, 156}
-"RightUpVectorBar", 3, {226, 165, 148}
-"RightUpVector", 3, {226, 134, 190}
-"RightVectorBar", 3, {226, 165, 147}
-"RightVector", 3, {226, 135, 128}
-"ring", 2, {203, 154}
-"risingdotseq", 3, {226, 137, 147}
-"rlarr", 3, {226, 135, 132}
-"rlhar", 3, {226, 135, 140}
-"rlm", 3, {226, 128, 143}
-"rmoustache", 3, {226, 142, 177}
-"rmoust", 3, {226, 142, 177}
-"rnmid", 3, {226, 171, 174}
-"roang", 3, {226, 159, 173}
-"roarr", 3, {226, 135, 190}
-"robrk", 3, {226, 159, 167}
-"ropar", 3, {226, 166, 134}
-"ropf", 4, {240, 157, 149, 163}
-"Ropf", 3, {226, 132, 157}
-"roplus", 3, {226, 168, 174}
-"rotimes", 3, {226, 168, 181}
-"RoundImplies", 3, {226, 165, 176}
-"rpar", 1, {41}
-"rpargt", 3, {226, 166, 148}
-"rppolint", 3, {226, 168, 146}
-"rrarr", 3, {226, 135, 137}
-"Rrightarrow", 3, {226, 135, 155}
-"rsaquo", 3, {226, 128, 186}
-"rscr", 4, {240, 157, 147, 135}
-"Rscr", 3, {226, 132, 155}
-"rsh", 3, {226, 134, 177}
-"Rsh", 3, {226, 134, 177}
-"rsqb", 1, {93}
-"rsquo", 3, {226, 128, 153}
-"rsquor", 3, {226, 128, 153}
-"rthree", 3, {226, 139, 140}
-"rtimes", 3, {226, 139, 138}
-"rtri", 3, {226, 150, 185}
-"rtrie", 3, {226, 138, 181}
-"rtrif", 3, {226, 150, 184}
-"rtriltri", 3, {226, 167, 142}
-"RuleDelayed", 3, {226, 167, 180}
-"ruluhar", 3, {226, 165, 168}
-"rx", 3, {226, 132, 158}
-"Sacute", 2, {197, 154}
-"sacute", 2, {197, 155}
-"sbquo", 3, {226, 128, 154}
-"scap", 3, {226, 170, 184}
-"Scaron", 2, {197, 160}
-"scaron", 2, {197, 161}
-"Sc", 3, {226, 170, 188}
-"sc", 3, {226, 137, 187}
-"sccue", 3, {226, 137, 189}
-"sce", 3, {226, 170, 176}
-"scE", 3, {226, 170, 180}
-"Scedil", 2, {197, 158}
-"scedil", 2, {197, 159}
-"Scirc", 2, {197, 156}
-"scirc", 2, {197, 157}
-"scnap", 3, {226, 170, 186}
-"scnE", 3, {226, 170, 182}
-"scnsim", 3, {226, 139, 169}
-"scpolint", 3, {226, 168, 147}
-"scsim", 3, {226, 137, 191}
-"Scy", 2, {208, 161}
-"scy", 2, {209, 129}
-"sdotb", 3, {226, 138, 161}
-"sdot", 3, {226, 139, 133}
-"sdote", 3, {226, 169, 166}
-"searhk", 3, {226, 164, 165}
-"searr", 3, {226, 134, 152}
-"seArr", 3, {226, 135, 152}
-"searrow", 3, {226, 134, 152}
-"sect", 2, {194, 167}
-"semi", 1, {59}
-"seswar", 3, {226, 164, 169}
-"setminus", 3, {226, 136, 150}
-"setmn", 3, {226, 136, 150}
-"sext", 3, {226, 156, 182}
-"Sfr", 4, {240, 157, 148, 150}
-"sfr", 4, {240, 157, 148, 176}
-"sfrown", 3, {226, 140, 162}
-"sharp", 3, {226, 153, 175}
-"SHCHcy", 2, {208, 169}
-"shchcy", 2, {209, 137}
-"SHcy", 2, {208, 168}
-"shcy", 2, {209, 136}
-"ShortDownArrow", 3, {226, 134, 147}
-"ShortLeftArrow", 3, {226, 134, 144}
-"shortmid", 3, {226, 136, 163}
-"shortparallel", 3, {226, 136, 165}
-"ShortRightArrow", 3, {226, 134, 146}
-"ShortUpArrow", 3, {226, 134, 145}
-"shy", 2, {194, 173}
-"Sigma", 2, {206, 163}
-"sigma", 2, {207, 131}
-"sigmaf", 2, {207, 130}
-"sigmav", 2, {207, 130}
-"sim", 3, {226, 136, 188}
-"simdot", 3, {226, 169, 170}
-"sime", 3, {226, 137, 131}
-"simeq", 3, {226, 137, 131}
-"simg", 3, {226, 170, 158}
-"simgE", 3, {226, 170, 160}
-"siml", 3, {226, 170, 157}
-"simlE", 3, {226, 170, 159}
-"simne", 3, {226, 137, 134}
-"simplus", 3, {226, 168, 164}
-"simrarr", 3, {226, 165, 178}
-"slarr", 3, {226, 134, 144}
-"SmallCircle", 3, {226, 136, 152}
-"smallsetminus", 3, {226, 136, 150}
-"smashp", 3, {226, 168, 179}
-"smeparsl", 3, {226, 167, 164}
-"smid", 3, {226, 136, 163}
-"smile", 3, {226, 140, 163}
-"smt", 3, {226, 170, 170}
-"smte", 3, {226, 170, 172}
-"smtes", 3, {226, 170, 172}
-"SOFTcy", 2, {208, 172}
-"softcy", 2, {209, 140}
-"solbar", 3, {226, 140, 191}
-"solb", 3, {226, 167, 132}
-"sol", 1, {47}
-"Sopf", 4, {240, 157, 149, 138}
-"sopf", 4, {240, 157, 149, 164}
-"spades", 3, {226, 153, 160}
-"spadesuit", 3, {226, 153, 160}
-"spar", 3, {226, 136, 165}
-"sqcap", 3, {226, 138, 147}
-"sqcaps", 3, {226, 138, 147}
-"sqcup", 3, {226, 138, 148}
-"sqcups", 3, {226, 138, 148}
-"Sqrt", 3, {226, 136, 154}
-"sqsub", 3, {226, 138, 143}
-"sqsube", 3, {226, 138, 145}
-"sqsubset", 3, {226, 138, 143}
-"sqsubseteq", 3, {226, 138, 145}
-"sqsup", 3, {226, 138, 144}
-"sqsupe", 3, {226, 138, 146}
-"sqsupset", 3, {226, 138, 144}
-"sqsupseteq", 3, {226, 138, 146}
-"square", 3, {226, 150, 161}
-"Square", 3, {226, 150, 161}
-"SquareIntersection", 3, {226, 138, 147}
-"SquareSubset", 3, {226, 138, 143}
-"SquareSubsetEqual", 3, {226, 138, 145}
-"SquareSuperset", 3, {226, 138, 144}
-"SquareSupersetEqual", 3, {226, 138, 146}
-"SquareUnion", 3, {226, 138, 148}
-"squarf", 3, {226, 150, 170}
-"squ", 3, {226, 150, 161}
-"squf", 3, {226, 150, 170}
-"srarr", 3, {226, 134, 146}
-"Sscr", 4, {240, 157, 146, 174}
-"sscr", 4, {240, 157, 147, 136}
-"ssetmn", 3, {226, 136, 150}
-"ssmile", 3, {226, 140, 163}
-"sstarf", 3, {226, 139, 134}
-"Star", 3, {226, 139, 134}
-"star", 3, {226, 152, 134}
-"starf", 3, {226, 152, 133}
-"straightepsilon", 2, {207, 181}
-"straightphi", 2, {207, 149}
-"strns", 2, {194, 175}
-"sub", 3, {226, 138, 130}
-"Sub", 3, {226, 139, 144}
-"subdot", 3, {226, 170, 189}
-"subE", 3, {226, 171, 133}
-"sube", 3, {226, 138, 134}
-"subedot", 3, {226, 171, 131}
-"submult", 3, {226, 171, 129}
-"subnE", 3, {226, 171, 139}
-"subne", 3, {226, 138, 138}
-"subplus", 3, {226, 170, 191}
-"subrarr", 3, {226, 165, 185}
-"subset", 3, {226, 138, 130}
-"Subset", 3, {226, 139, 144}
-"subseteq", 3, {226, 138, 134}
-"subseteqq", 3, {226, 171, 133}
-"SubsetEqual", 3, {226, 138, 134}
-"subsetneq", 3, {226, 138, 138}
-"subsetneqq", 3, {226, 171, 139}
-"subsim", 3, {226, 171, 135}
-"subsub", 3, {226, 171, 149}
-"subsup", 3, {226, 171, 147}
-"succapprox", 3, {226, 170, 184}
-"succ", 3, {226, 137, 187}
-"succcurlyeq", 3, {226, 137, 189}
-"Succeeds", 3, {226, 137, 187}
-"SucceedsEqual", 3, {226, 170, 176}
-"SucceedsSlantEqual", 3, {226, 137, 189}
-"SucceedsTilde", 3, {226, 137, 191}
-"succeq", 3, {226, 170, 176}
-"succnapprox", 3, {226, 170, 186}
-"succneqq", 3, {226, 170, 182}
-"succnsim", 3, {226, 139, 169}
-"succsim", 3, {226, 137, 191}
-"SuchThat", 3, {226, 136, 139}
-"sum", 3, {226, 136, 145}
-"Sum", 3, {226, 136, 145}
-"sung", 3, {226, 153, 170}
-"sup1", 2, {194, 185}
-"sup2", 2, {194, 178}
-"sup3", 2, {194, 179}
-"sup", 3, {226, 138, 131}
-"Sup", 3, {226, 139, 145}
-"supdot", 3, {226, 170, 190}
-"supdsub", 3, {226, 171, 152}
-"supE", 3, {226, 171, 134}
-"supe", 3, {226, 138, 135}
-"supedot", 3, {226, 171, 132}
-"Superset", 3, {226, 138, 131}
-"SupersetEqual", 3, {226, 138, 135}
-"suphsol", 3, {226, 159, 137}
-"suphsub", 3, {226, 171, 151}
-"suplarr", 3, {226, 165, 187}
-"supmult", 3, {226, 171, 130}
-"supnE", 3, {226, 171, 140}
-"supne", 3, {226, 138, 139}
-"supplus", 3, {226, 171, 128}
-"supset", 3, {226, 138, 131}
-"Supset", 3, {226, 139, 145}
-"supseteq", 3, {226, 138, 135}
-"supseteqq", 3, {226, 171, 134}
-"supsetneq", 3, {226, 138, 139}
-"supsetneqq", 3, {226, 171, 140}
-"supsim", 3, {226, 171, 136}
-"supsub", 3, {226, 171, 148}
-"supsup", 3, {226, 171, 150}
-"swarhk", 3, {226, 164, 166}
-"swarr", 3, {226, 134, 153}
-"swArr", 3, {226, 135, 153}
-"swarrow", 3, {226, 134, 153}
-"swnwar", 3, {226, 164, 170}
-"szlig", 2, {195, 159}
-"Tab", 1, {9}
-"target", 3, {226, 140, 150}
-"Tau", 2, {206, 164}
-"tau", 2, {207, 132}
-"tbrk", 3, {226, 142, 180}
-"Tcaron", 2, {197, 164}
-"tcaron", 2, {197, 165}
-"Tcedil", 2, {197, 162}
-"tcedil", 2, {197, 163}
-"Tcy", 2, {208, 162}
-"tcy", 2, {209, 130}
-"tdot", 3, {226, 131, 155}
-"telrec", 3, {226, 140, 149}
-"Tfr", 4, {240, 157, 148, 151}
-"tfr", 4, {240, 157, 148, 177}
-"there4", 3, {226, 136, 180}
-"therefore", 3, {226, 136, 180}
-"Therefore", 3, {226, 136, 180}
-"Theta", 2, {206, 152}
-"theta", 2, {206, 184}
-"thetasym", 2, {207, 145}
-"thetav", 2, {207, 145}
-"thickapprox", 3, {226, 137, 136}
-"thicksim", 3, {226, 136, 188}
-"ThickSpace", 3, {226, 129, 159}
-"ThinSpace", 3, {226, 128, 137}
-"thinsp", 3, {226, 128, 137}
-"thkap", 3, {226, 137, 136}
-"thksim", 3, {226, 136, 188}
-"THORN", 2, {195, 158}
-"thorn", 2, {195, 190}
-"tilde", 2, {203, 156}
-"Tilde", 3, {226, 136, 188}
-"TildeEqual", 3, {226, 137, 131}
-"TildeFullEqual", 3, {226, 137, 133}
-"TildeTilde", 3, {226, 137, 136}
-"timesbar", 3, {226, 168, 177}
-"timesb", 3, {226, 138, 160}
-"times", 2, {195, 151}
-"timesd", 3, {226, 168, 176}
-"tint", 3, {226, 136, 173}
-"toea", 3, {226, 164, 168}
-"topbot", 3, {226, 140, 182}
-"topcir", 3, {226, 171, 177}
-"top", 3, {226, 138, 164}
-"Topf", 4, {240, 157, 149, 139}
-"topf", 4, {240, 157, 149, 165}
-"topfork", 3, {226, 171, 154}
-"tosa", 3, {226, 164, 169}
-"tprime", 3, {226, 128, 180}
-"trade", 3, {226, 132, 162}
-"TRADE", 3, {226, 132, 162}
-"triangle", 3, {226, 150, 181}
-"triangledown", 3, {226, 150, 191}
-"triangleleft", 3, {226, 151, 131}
-"trianglelefteq", 3, {226, 138, 180}
-"triangleq", 3, {226, 137, 156}
-"triangleright", 3, {226, 150, 185}
-"trianglerighteq", 3, {226, 138, 181}
-"tridot", 3, {226, 151, 172}
-"trie", 3, {226, 137, 156}
-"triminus", 3, {226, 168, 186}
-"TripleDot", 3, {226, 131, 155}
-"triplus", 3, {226, 168, 185}
-"trisb", 3, {226, 167, 141}
-"tritime", 3, {226, 168, 187}
-"trpezium", 3, {226, 143, 162}
-"Tscr", 4, {240, 157, 146, 175}
-"tscr", 4, {240, 157, 147, 137}
-"TScy", 2, {208, 166}
-"tscy", 2, {209, 134}
-"TSHcy", 2, {208, 139}
-"tshcy", 2, {209, 155}
-"Tstrok", 2, {197, 166}
-"tstrok", 2, {197, 167}
-"twixt", 3, {226, 137, 172}
-"twoheadleftarrow", 3, {226, 134, 158}
-"twoheadrightarrow", 3, {226, 134, 160}
-"Uacute", 2, {195, 154}
-"uacute", 2, {195, 186}
-"uarr", 3, {226, 134, 145}
-"Uarr", 3, {226, 134, 159}
-"uArr", 3, {226, 135, 145}
-"Uarrocir", 3, {226, 165, 137}
-"Ubrcy", 2, {208, 142}
-"ubrcy", 2, {209, 158}
-"Ubreve", 2, {197, 172}
-"ubreve", 2, {197, 173}
-"Ucirc", 2, {195, 155}
-"ucirc", 2, {195, 187}
-"Ucy", 2, {208, 163}
-"ucy", 2, {209, 131}
-"udarr", 3, {226, 135, 133}
-"Udblac", 2, {197, 176}
-"udblac", 2, {197, 177}
-"udhar", 3, {226, 165, 174}
-"ufisht", 3, {226, 165, 190}
-"Ufr", 4, {240, 157, 148, 152}
-"ufr", 4, {240, 157, 148, 178}
-"Ugrave", 2, {195, 153}
-"ugrave", 2, {195, 185}
-"uHar", 3, {226, 165, 163}
-"uharl", 3, {226, 134, 191}
-"uharr", 3, {226, 134, 190}
-"uhblk", 3, {226, 150, 128}
-"ulcorn", 3, {226, 140, 156}
-"ulcorner", 3, {226, 140, 156}
-"ulcrop", 3, {226, 140, 143}
-"ultri", 3, {226, 151, 184}
-"Umacr", 2, {197, 170}
-"umacr", 2, {197, 171}
-"uml", 2, {194, 168}
-"UnderBar", 1, {95}
-"UnderBrace", 3, {226, 143, 159}
-"UnderBracket", 3, {226, 142, 181}
-"UnderParenthesis", 3, {226, 143, 157}
-"Union", 3, {226, 139, 131}
-"UnionPlus", 3, {226, 138, 142}
-"Uogon", 2, {197, 178}
-"uogon", 2, {197, 179}
-"Uopf", 4, {240, 157, 149, 140}
-"uopf", 4, {240, 157, 149, 166}
-"UpArrowBar", 3, {226, 164, 146}
-"uparrow", 3, {226, 134, 145}
-"UpArrow", 3, {226, 134, 145}
-"Uparrow", 3, {226, 135, 145}
-"UpArrowDownArrow", 3, {226, 135, 133}
-"updownarrow", 3, {226, 134, 149}
-"UpDownArrow", 3, {226, 134, 149}
-"Updownarrow", 3, {226, 135, 149}
-"UpEquilibrium", 3, {226, 165, 174}
-"upharpoonleft", 3, {226, 134, 191}
-"upharpoonright", 3, {226, 134, 190}
-"uplus", 3, {226, 138, 142}
-"UpperLeftArrow", 3, {226, 134, 150}
-"UpperRightArrow", 3, {226, 134, 151}
-"upsi", 2, {207, 133}
-"Upsi", 2, {207, 146}
-"upsih", 2, {207, 146}
-"Upsilon", 2, {206, 165}
-"upsilon", 2, {207, 133}
-"UpTeeArrow", 3, {226, 134, 165}
-"UpTee", 3, {226, 138, 165}
-"upuparrows", 3, {226, 135, 136}
-"urcorn", 3, {226, 140, 157}
-"urcorner", 3, {226, 140, 157}
-"urcrop", 3, {226, 140, 142}
-"Uring", 2, {197, 174}
-"uring", 2, {197, 175}
-"urtri", 3, {226, 151, 185}
-"Uscr", 4, {240, 157, 146, 176}
-"uscr", 4, {240, 157, 147, 138}
-"utdot", 3, {226, 139, 176}
-"Utilde", 2, {197, 168}
-"utilde", 2, {197, 169}
-"utri", 3, {226, 150, 181}
-"utrif", 3, {226, 150, 180}
-"uuarr", 3, {226, 135, 136}
-"Uuml", 2, {195, 156}
-"uuml", 2, {195, 188}
-"uwangle", 3, {226, 166, 167}
-"vangrt", 3, {226, 166, 156}
-"varepsilon", 2, {207, 181}
-"varkappa", 2, {207, 176}
-"varnothing", 3, {226, 136, 133}
-"varphi", 2, {207, 149}
-"varpi", 2, {207, 150}
-"varpropto", 3, {226, 136, 157}
-"varr", 3, {226, 134, 149}
-"vArr", 3, {226, 135, 149}
-"varrho", 2, {207, 177}
-"varsigma", 2, {207, 130}
-"varsubsetneq", 3, {226, 138, 138}
-"varsubsetneqq", 3, {226, 171, 139}
-"varsupsetneq", 3, {226, 138, 139}
-"varsupsetneqq", 3, {226, 171, 140}
-"vartheta", 2, {207, 145}
-"vartriangleleft", 3, {226, 138, 178}
-"vartriangleright", 3, {226, 138, 179}
-"vBar", 3, {226, 171, 168}
-"Vbar", 3, {226, 171, 171}
-"vBarv", 3, {226, 171, 169}
-"Vcy", 2, {208, 146}
-"vcy", 2, {208, 178}
-"vdash", 3, {226, 138, 162}
-"vDash", 3, {226, 138, 168}
-"Vdash", 3, {226, 138, 169}
-"VDash", 3, {226, 138, 171}
-"Vdashl", 3, {226, 171, 166}
-"veebar", 3, {226, 138, 187}
-"vee", 3, {226, 136, 168}
-"Vee", 3, {226, 139, 129}
-"veeeq", 3, {226, 137, 154}
-"vellip", 3, {226, 139, 174}
-"verbar", 1, {124}
-"Verbar", 3, {226, 128, 150}
-"vert", 1, {124}
-"Vert", 3, {226, 128, 150}
-"VerticalBar", 3, {226, 136, 163}
-"VerticalLine", 1, {124}
-"VerticalSeparator", 3, {226, 157, 152}
-"VerticalTilde", 3, {226, 137, 128}
-"VeryThinSpace", 3, {226, 128, 138}
-"Vfr", 4, {240, 157, 148, 153}
-"vfr", 4, {240, 157, 148, 179}
-"vltri", 3, {226, 138, 178}
-"vnsub", 3, {226, 138, 130}
-"vnsup", 3, {226, 138, 131}
-"Vopf", 4, {240, 157, 149, 141}
-"vopf", 4, {240, 157, 149, 167}
-"vprop", 3, {226, 136, 157}
-"vrtri", 3, {226, 138, 179}
-"Vscr", 4, {240, 157, 146, 177}
-"vscr", 4, {240, 157, 147, 139}
-"vsubnE", 3, {226, 171, 139}
-"vsubne", 3, {226, 138, 138}
-"vsupnE", 3, {226, 171, 140}
-"vsupne", 3, {226, 138, 139}
-"Vvdash", 3, {226, 138, 170}
-"vzigzag", 3, {226, 166, 154}
-"Wcirc", 2, {197, 180}
-"wcirc", 2, {197, 181}
-"wedbar", 3, {226, 169, 159}
-"wedge", 3, {226, 136, 167}
-"Wedge", 3, {226, 139, 128}
-"wedgeq", 3, {226, 137, 153}
-"weierp", 3, {226, 132, 152}
-"Wfr", 4, {240, 157, 148, 154}
-"wfr", 4, {240, 157, 148, 180}
-"Wopf", 4, {240, 157, 149, 142}
-"wopf", 4, {240, 157, 149, 168}
-"wp", 3, {226, 132, 152}
-"wr", 3, {226, 137, 128}
-"wreath", 3, {226, 137, 128}
-"Wscr", 4, {240, 157, 146, 178}
-"wscr", 4, {240, 157, 147, 140}
-"xcap", 3, {226, 139, 130}
-"xcirc", 3, {226, 151, 175}
-"xcup", 3, {226, 139, 131}
-"xdtri", 3, {226, 150, 189}
-"Xfr", 4, {240, 157, 148, 155}
-"xfr", 4, {240, 157, 148, 181}
-"xharr", 3, {226, 159, 183}
-"xhArr", 3, {226, 159, 186}
-"Xi", 2, {206, 158}
-"xi", 2, {206, 190}
-"xlarr", 3, {226, 159, 181}
-"xlArr", 3, {226, 159, 184}
-"xmap", 3, {226, 159, 188}
-"xnis", 3, {226, 139, 187}
-"xodot", 3, {226, 168, 128}
-"Xopf", 4, {240, 157, 149, 143}
-"xopf", 4, {240, 157, 149, 169}
-"xoplus", 3, {226, 168, 129}
-"xotime", 3, {226, 168, 130}
-"xrarr", 3, {226, 159, 182}
-"xrArr", 3, {226, 159, 185}
-"Xscr", 4, {240, 157, 146, 179}
-"xscr", 4, {240, 157, 147, 141}
-"xsqcup", 3, {226, 168, 134}
-"xuplus", 3, {226, 168, 132}
-"xutri", 3, {226, 150, 179}
-"xvee", 3, {226, 139, 129}
-"xwedge", 3, {226, 139, 128}
-"Yacute", 2, {195, 157}
-"yacute", 2, {195, 189}
-"YAcy", 2, {208, 175}
-"yacy", 2, {209, 143}
-"Ycirc", 2, {197, 182}
-"ycirc", 2, {197, 183}
-"Ycy", 2, {208, 171}
-"ycy", 2, {209, 139}
-"yen", 2, {194, 165}
-"Yfr", 4, {240, 157, 148, 156}
-"yfr", 4, {240, 157, 148, 182}
-"YIcy", 2, {208, 135}
-"yicy", 2, {209, 151}
-"Yopf", 4, {240, 157, 149, 144}
-"yopf", 4, {240, 157, 149, 170}
-"Yscr", 4, {240, 157, 146, 180}
-"yscr", 4, {240, 157, 147, 142}
-"YUcy", 2, {208, 174}
-"yucy", 2, {209, 142}
-"yuml", 2, {195, 191}
-"Yuml", 2, {197, 184}
-"Zacute", 2, {197, 185}
-"zacute", 2, {197, 186}
-"Zcaron", 2, {197, 189}
-"zcaron", 2, {197, 190}
-"Zcy", 2, {208, 151}
-"zcy", 2, {208, 183}
-"Zdot", 2, {197, 187}
-"zdot", 2, {197, 188}
-"zeetrf", 3, {226, 132, 168}
-"ZeroWidthSpace", 3, {226, 128, 139}
-"Zeta", 2, {206, 150}
-"zeta", 2, {206, 182}
-"zfr", 4, {240, 157, 148, 183}
-"Zfr", 3, {226, 132, 168}
-"ZHcy", 2, {208, 150}
-"zhcy", 2, {208, 182}
-"zigrarr", 3, {226, 135, 157}
-"zopf", 4, {240, 157, 149, 171}
-"Zopf", 3, {226, 132, 164}
-"Zscr", 4, {240, 157, 146, 181}
-"zscr", 4, {240, 157, 147, 143}
-"zwj", 3, {226, 128, 141}
-"zwnj", 3, {226, 128, 140}
+"Aacute", {195, 129, 0}
+"aacute", {195, 161, 0}
+"Abreve", {196, 130, 0}
+"abreve", {196, 131, 0}
+"ac", {226, 136, 190, 0}
+"acd", {226, 136, 191, 0}
+"acE", {226, 136, 190, 0}
+"Acirc", {195, 130, 0}
+"acirc", {195, 162, 0}
+"acute", {194, 180, 0}
+"Acy", {208, 144, 0}
+"acy", {208, 176, 0}
+"AElig", {195, 134, 0}
+"aelig", {195, 166, 0}
+"af", {226, 129, 161, 0}
+"Afr", {240, 157, 148, 132}
+"afr", {240, 157, 148, 158}
+"Agrave", {195, 128, 0}
+"agrave", {195, 160, 0}
+"alefsym", {226, 132, 181, 0}
+"aleph", {226, 132, 181, 0}
+"Alpha", {206, 145, 0}
+"alpha", {206, 177, 0}
+"Amacr", {196, 128, 0}
+"amacr", {196, 129, 0}
+"amalg", {226, 168, 191, 0}
+"amp", {38, 0}
+"AMP", {38, 0}
+"andand", {226, 169, 149, 0}
+"And", {226, 169, 147, 0}
+"and", {226, 136, 167, 0}
+"andd", {226, 169, 156, 0}
+"andslope", {226, 169, 152, 0}
+"andv", {226, 169, 154, 0}
+"ang", {226, 136, 160, 0}
+"ange", {226, 166, 164, 0}
+"angle", {226, 136, 160, 0}
+"angmsdaa", {226, 166, 168, 0}
+"angmsdab", {226, 166, 169, 0}
+"angmsdac", {226, 166, 170, 0}
+"angmsdad", {226, 166, 171, 0}
+"angmsdae", {226, 166, 172, 0}
+"angmsdaf", {226, 166, 173, 0}
+"angmsdag", {226, 166, 174, 0}
+"angmsdah", {226, 166, 175, 0}
+"angmsd", {226, 136, 161, 0}
+"angrt", {226, 136, 159, 0}
+"angrtvb", {226, 138, 190, 0}
+"angrtvbd", {226, 166, 157, 0}
+"angsph", {226, 136, 162, 0}
+"angst", {195, 133, 0}
+"angzarr", {226, 141, 188, 0}
+"Aogon", {196, 132, 0}
+"aogon", {196, 133, 0}
+"Aopf", {240, 157, 148, 184}
+"aopf", {240, 157, 149, 146}
+"apacir", {226, 169, 175, 0}
+"ap", {226, 137, 136, 0}
+"apE", {226, 169, 176, 0}
+"ape", {226, 137, 138, 0}
+"apid", {226, 137, 139, 0}
+"apos", {39, 0}
+"ApplyFunction", {226, 129, 161, 0}
+"approx", {226, 137, 136, 0}
+"approxeq", {226, 137, 138, 0}
+"Aring", {195, 133, 0}
+"aring", {195, 165, 0}
+"Ascr", {240, 157, 146, 156}
+"ascr", {240, 157, 146, 182}
+"Assign", {226, 137, 148, 0}
+"ast", {42, 0}
+"asymp", {226, 137, 136, 0}
+"asympeq", {226, 137, 141, 0}
+"Atilde", {195, 131, 0}
+"atilde", {195, 163, 0}
+"Auml", {195, 132, 0}
+"auml", {195, 164, 0}
+"awconint", {226, 136, 179, 0}
+"awint", {226, 168, 145, 0}
+"backcong", {226, 137, 140, 0}
+"backepsilon", {207, 182, 0}
+"backprime", {226, 128, 181, 0}
+"backsim", {226, 136, 189, 0}
+"backsimeq", {226, 139, 141, 0}
+"Backslash", {226, 136, 150, 0}
+"Barv", {226, 171, 167, 0}
+"barvee", {226, 138, 189, 0}
+"barwed", {226, 140, 133, 0}
+"Barwed", {226, 140, 134, 0}
+"barwedge", {226, 140, 133, 0}
+"bbrk", {226, 142, 181, 0}
+"bbrktbrk", {226, 142, 182, 0}
+"bcong", {226, 137, 140, 0}
+"Bcy", {208, 145, 0}
+"bcy", {208, 177, 0}
+"bdquo", {226, 128, 158, 0}
+"becaus", {226, 136, 181, 0}
+"because", {226, 136, 181, 0}
+"Because", {226, 136, 181, 0}
+"bemptyv", {226, 166, 176, 0}
+"bepsi", {207, 182, 0}
+"bernou", {226, 132, 172, 0}
+"Bernoullis", {226, 132, 172, 0}
+"Beta", {206, 146, 0}
+"beta", {206, 178, 0}
+"beth", {226, 132, 182, 0}
+"between", {226, 137, 172, 0}
+"Bfr", {240, 157, 148, 133}
+"bfr", {240, 157, 148, 159}
+"bigcap", {226, 139, 130, 0}
+"bigcirc", {226, 151, 175, 0}
+"bigcup", {226, 139, 131, 0}
+"bigodot", {226, 168, 128, 0}
+"bigoplus", {226, 168, 129, 0}
+"bigotimes", {226, 168, 130, 0}
+"bigsqcup", {226, 168, 134, 0}
+"bigstar", {226, 152, 133, 0}
+"bigtriangledown", {226, 150, 189, 0}
+"bigtriangleup", {226, 150, 179, 0}
+"biguplus", {226, 168, 132, 0}
+"bigvee", {226, 139, 129, 0}
+"bigwedge", {226, 139, 128, 0}
+"bkarow", {226, 164, 141, 0}
+"blacklozenge", {226, 167, 171, 0}
+"blacksquare", {226, 150, 170, 0}
+"blacktriangle", {226, 150, 180, 0}
+"blacktriangledown", {226, 150, 190, 0}
+"blacktriangleleft", {226, 151, 130, 0}
+"blacktriangleright", {226, 150, 184, 0}
+"blank", {226, 144, 163, 0}
+"blk12", {226, 150, 146, 0}
+"blk14", {226, 150, 145, 0}
+"blk34", {226, 150, 147, 0}
+"block", {226, 150, 136, 0}
+"bne", {61, 0}
+"bnequiv", {226, 137, 161, 0}
+"bNot", {226, 171, 173, 0}
+"bnot", {226, 140, 144, 0}
+"Bopf", {240, 157, 148, 185}
+"bopf", {240, 157, 149, 147}
+"bot", {226, 138, 165, 0}
+"bottom", {226, 138, 165, 0}
+"bowtie", {226, 139, 136, 0}
+"boxbox", {226, 167, 137, 0}
+"boxdl", {226, 148, 144, 0}
+"boxdL", {226, 149, 149, 0}
+"boxDl", {226, 149, 150, 0}
+"boxDL", {226, 149, 151, 0}
+"boxdr", {226, 148, 140, 0}
+"boxdR", {226, 149, 146, 0}
+"boxDr", {226, 149, 147, 0}
+"boxDR", {226, 149, 148, 0}
+"boxh", {226, 148, 128, 0}
+"boxH", {226, 149, 144, 0}
+"boxhd", {226, 148, 172, 0}
+"boxHd", {226, 149, 164, 0}
+"boxhD", {226, 149, 165, 0}
+"boxHD", {226, 149, 166, 0}
+"boxhu", {226, 148, 180, 0}
+"boxHu", {226, 149, 167, 0}
+"boxhU", {226, 149, 168, 0}
+"boxHU", {226, 149, 169, 0}
+"boxminus", {226, 138, 159, 0}
+"boxplus", {226, 138, 158, 0}
+"boxtimes", {226, 138, 160, 0}
+"boxul", {226, 148, 152, 0}
+"boxuL", {226, 149, 155, 0}
+"boxUl", {226, 149, 156, 0}
+"boxUL", {226, 149, 157, 0}
+"boxur", {226, 148, 148, 0}
+"boxuR", {226, 149, 152, 0}
+"boxUr", {226, 149, 153, 0}
+"boxUR", {226, 149, 154, 0}
+"boxv", {226, 148, 130, 0}
+"boxV", {226, 149, 145, 0}
+"boxvh", {226, 148, 188, 0}
+"boxvH", {226, 149, 170, 0}
+"boxVh", {226, 149, 171, 0}
+"boxVH", {226, 149, 172, 0}
+"boxvl", {226, 148, 164, 0}
+"boxvL", {226, 149, 161, 0}
+"boxVl", {226, 149, 162, 0}
+"boxVL", {226, 149, 163, 0}
+"boxvr", {226, 148, 156, 0}
+"boxvR", {226, 149, 158, 0}
+"boxVr", {226, 149, 159, 0}
+"boxVR", {226, 149, 160, 0}
+"bprime", {226, 128, 181, 0}
+"breve", {203, 152, 0}
+"Breve", {203, 152, 0}
+"brvbar", {194, 166, 0}
+"bscr", {240, 157, 146, 183}
+"Bscr", {226, 132, 172, 0}
+"bsemi", {226, 129, 143, 0}
+"bsim", {226, 136, 189, 0}
+"bsime", {226, 139, 141, 0}
+"bsolb", {226, 167, 133, 0}
+"bsol", {92, 0}
+"bsolhsub", {226, 159, 136, 0}
+"bull", {226, 128, 162, 0}
+"bullet", {226, 128, 162, 0}
+"bump", {226, 137, 142, 0}
+"bumpE", {226, 170, 174, 0}
+"bumpe", {226, 137, 143, 0}
+"Bumpeq", {226, 137, 142, 0}
+"bumpeq", {226, 137, 143, 0}
+"Cacute", {196, 134, 0}
+"cacute", {196, 135, 0}
+"capand", {226, 169, 132, 0}
+"capbrcup", {226, 169, 137, 0}
+"capcap", {226, 169, 139, 0}
+"cap", {226, 136, 169, 0}
+"Cap", {226, 139, 146, 0}
+"capcup", {226, 169, 135, 0}
+"capdot", {226, 169, 128, 0}
+"CapitalDifferentialD", {226, 133, 133, 0}
+"caps", {226, 136, 169, 0}
+"caret", {226, 129, 129, 0}
+"caron", {203, 135, 0}
+"Cayleys", {226, 132, 173, 0}
+"ccaps", {226, 169, 141, 0}
+"Ccaron", {196, 140, 0}
+"ccaron", {196, 141, 0}
+"Ccedil", {195, 135, 0}
+"ccedil", {195, 167, 0}
+"Ccirc", {196, 136, 0}
+"ccirc", {196, 137, 0}
+"Cconint", {226, 136, 176, 0}
+"ccups", {226, 169, 140, 0}
+"ccupssm", {226, 169, 144, 0}
+"Cdot", {196, 138, 0}
+"cdot", {196, 139, 0}
+"cedil", {194, 184, 0}
+"Cedilla", {194, 184, 0}
+"cemptyv", {226, 166, 178, 0}
+"cent", {194, 162, 0}
+"centerdot", {194, 183, 0}
+"CenterDot", {194, 183, 0}
+"cfr", {240, 157, 148, 160}
+"Cfr", {226, 132, 173, 0}
+"CHcy", {208, 167, 0}
+"chcy", {209, 135, 0}
+"check", {226, 156, 147, 0}
+"checkmark", {226, 156, 147, 0}
+"Chi", {206, 167, 0}
+"chi", {207, 135, 0}
+"circ", {203, 134, 0}
+"circeq", {226, 137, 151, 0}
+"circlearrowleft", {226, 134, 186, 0}
+"circlearrowright", {226, 134, 187, 0}
+"circledast", {226, 138, 155, 0}
+"circledcirc", {226, 138, 154, 0}
+"circleddash", {226, 138, 157, 0}
+"CircleDot", {226, 138, 153, 0}
+"circledR", {194, 174, 0}
+"circledS", {226, 147, 136, 0}
+"CircleMinus", {226, 138, 150, 0}
+"CirclePlus", {226, 138, 149, 0}
+"CircleTimes", {226, 138, 151, 0}
+"cir", {226, 151, 139, 0}
+"cirE", {226, 167, 131, 0}
+"cire", {226, 137, 151, 0}
+"cirfnint", {226, 168, 144, 0}
+"cirmid", {226, 171, 175, 0}
+"cirscir", {226, 167, 130, 0}
+"ClockwiseContourIntegral", {226, 136, 178, 0}
+"CloseCurlyDoubleQuote", {226, 128, 157, 0}
+"CloseCurlyQuote", {226, 128, 153, 0}
+"clubs", {226, 153, 163, 0}
+"clubsuit", {226, 153, 163, 0}
+"colon", {58, 0}
+"Colon", {226, 136, 183, 0}
+"Colone", {226, 169, 180, 0}
+"colone", {226, 137, 148, 0}
+"coloneq", {226, 137, 148, 0}
+"comma", {44, 0}
+"commat", {64, 0}
+"comp", {226, 136, 129, 0}
+"compfn", {226, 136, 152, 0}
+"complement", {226, 136, 129, 0}
+"complexes", {226, 132, 130, 0}
+"cong", {226, 137, 133, 0}
+"congdot", {226, 169, 173, 0}
+"Congruent", {226, 137, 161, 0}
+"conint", {226, 136, 174, 0}
+"Conint", {226, 136, 175, 0}
+"ContourIntegral", {226, 136, 174, 0}
+"copf", {240, 157, 149, 148}
+"Copf", {226, 132, 130, 0}
+"coprod", {226, 136, 144, 0}
+"Coproduct", {226, 136, 144, 0}
+"copy", {194, 169, 0}
+"COPY", {194, 169, 0}
+"copysr", {226, 132, 151, 0}
+"CounterClockwiseContourIntegral", {226, 136, 179, 0}
+"crarr", {226, 134, 181, 0}
+"cross", {226, 156, 151, 0}
+"Cross", {226, 168, 175, 0}
+"Cscr", {240, 157, 146, 158}
+"cscr", {240, 157, 146, 184}
+"csub", {226, 171, 143, 0}
+"csube", {226, 171, 145, 0}
+"csup", {226, 171, 144, 0}
+"csupe", {226, 171, 146, 0}
+"ctdot", {226, 139, 175, 0}
+"cudarrl", {226, 164, 184, 0}
+"cudarrr", {226, 164, 181, 0}
+"cuepr", {226, 139, 158, 0}
+"cuesc", {226, 139, 159, 0}
+"cularr", {226, 134, 182, 0}
+"cularrp", {226, 164, 189, 0}
+"cupbrcap", {226, 169, 136, 0}
+"cupcap", {226, 169, 134, 0}
+"CupCap", {226, 137, 141, 0}
+"cup", {226, 136, 170, 0}
+"Cup", {226, 139, 147, 0}
+"cupcup", {226, 169, 138, 0}
+"cupdot", {226, 138, 141, 0}
+"cupor", {226, 169, 133, 0}
+"cups", {226, 136, 170, 0}
+"curarr", {226, 134, 183, 0}
+"curarrm", {226, 164, 188, 0}
+"curlyeqprec", {226, 139, 158, 0}
+"curlyeqsucc", {226, 139, 159, 0}
+"curlyvee", {226, 139, 142, 0}
+"curlywedge", {226, 139, 143, 0}
+"curren", {194, 164, 0}
+"curvearrowleft", {226, 134, 182, 0}
+"curvearrowright", {226, 134, 183, 0}
+"cuvee", {226, 139, 142, 0}
+"cuwed", {226, 139, 143, 0}
+"cwconint", {226, 136, 178, 0}
+"cwint", {226, 136, 177, 0}
+"cylcty", {226, 140, 173, 0}
+"dagger", {226, 128, 160, 0}
+"Dagger", {226, 128, 161, 0}
+"daleth", {226, 132, 184, 0}
+"darr", {226, 134, 147, 0}
+"Darr", {226, 134, 161, 0}
+"dArr", {226, 135, 147, 0}
+"dash", {226, 128, 144, 0}
+"Dashv", {226, 171, 164, 0}
+"dashv", {226, 138, 163, 0}
+"dbkarow", {226, 164, 143, 0}
+"dblac", {203, 157, 0}
+"Dcaron", {196, 142, 0}
+"dcaron", {196, 143, 0}
+"Dcy", {208, 148, 0}
+"dcy", {208, 180, 0}
+"ddagger", {226, 128, 161, 0}
+"ddarr", {226, 135, 138, 0}
+"DD", {226, 133, 133, 0}
+"dd", {226, 133, 134, 0}
+"DDotrahd", {226, 164, 145, 0}
+"ddotseq", {226, 169, 183, 0}
+"deg", {194, 176, 0}
+"Del", {226, 136, 135, 0}
+"Delta", {206, 148, 0}
+"delta", {206, 180, 0}
+"demptyv", {226, 166, 177, 0}
+"dfisht", {226, 165, 191, 0}
+"Dfr", {240, 157, 148, 135}
+"dfr", {240, 157, 148, 161}
+"dHar", {226, 165, 165, 0}
+"dharl", {226, 135, 131, 0}
+"dharr", {226, 135, 130, 0}
+"DiacriticalAcute", {194, 180, 0}
+"DiacriticalDot", {203, 153, 0}
+"DiacriticalDoubleAcute", {203, 157, 0}
+"DiacriticalGrave", {96, 0}
+"DiacriticalTilde", {203, 156, 0}
+"diam", {226, 139, 132, 0}
+"diamond", {226, 139, 132, 0}
+"Diamond", {226, 139, 132, 0}
+"diamondsuit", {226, 153, 166, 0}
+"diams", {226, 153, 166, 0}
+"die", {194, 168, 0}
+"DifferentialD", {226, 133, 134, 0}
+"digamma", {207, 157, 0}
+"disin", {226, 139, 178, 0}
+"div", {195, 183, 0}
+"divide", {195, 183, 0}
+"divideontimes", {226, 139, 135, 0}
+"divonx", {226, 139, 135, 0}
+"DJcy", {208, 130, 0}
+"djcy", {209, 146, 0}
+"dlcorn", {226, 140, 158, 0}
+"dlcrop", {226, 140, 141, 0}
+"dollar", {36, 0}
+"Dopf", {240, 157, 148, 187}
+"dopf", {240, 157, 149, 149}
+"Dot", {194, 168, 0}
+"dot", {203, 153, 0}
+"DotDot", {226, 131, 156, 0}
+"doteq", {226, 137, 144, 0}
+"doteqdot", {226, 137, 145, 0}
+"DotEqual", {226, 137, 144, 0}
+"dotminus", {226, 136, 184, 0}
+"dotplus", {226, 136, 148, 0}
+"dotsquare", {226, 138, 161, 0}
+"doublebarwedge", {226, 140, 134, 0}
+"DoubleContourIntegral", {226, 136, 175, 0}
+"DoubleDot", {194, 168, 0}
+"DoubleDownArrow", {226, 135, 147, 0}
+"DoubleLeftArrow", {226, 135, 144, 0}
+"DoubleLeftRightArrow", {226, 135, 148, 0}
+"DoubleLeftTee", {226, 171, 164, 0}
+"DoubleLongLeftArrow", {226, 159, 184, 0}
+"DoubleLongLeftRightArrow", {226, 159, 186, 0}
+"DoubleLongRightArrow", {226, 159, 185, 0}
+"DoubleRightArrow", {226, 135, 146, 0}
+"DoubleRightTee", {226, 138, 168, 0}
+"DoubleUpArrow", {226, 135, 145, 0}
+"DoubleUpDownArrow", {226, 135, 149, 0}
+"DoubleVerticalBar", {226, 136, 165, 0}
+"DownArrowBar", {226, 164, 147, 0}
+"downarrow", {226, 134, 147, 0}
+"DownArrow", {226, 134, 147, 0}
+"Downarrow", {226, 135, 147, 0}
+"DownArrowUpArrow", {226, 135, 181, 0}
+"DownBreve", {204, 145, 0}
+"downdownarrows", {226, 135, 138, 0}
+"downharpoonleft", {226, 135, 131, 0}
+"downharpoonright", {226, 135, 130, 0}
+"DownLeftRightVector", {226, 165, 144, 0}
+"DownLeftTeeVector", {226, 165, 158, 0}
+"DownLeftVectorBar", {226, 165, 150, 0}
+"DownLeftVector", {226, 134, 189, 0}
+"DownRightTeeVector", {226, 165, 159, 0}
+"DownRightVectorBar", {226, 165, 151, 0}
+"DownRightVector", {226, 135, 129, 0}
+"DownTeeArrow", {226, 134, 167, 0}
+"DownTee", {226, 138, 164, 0}
+"drbkarow", {226, 164, 144, 0}
+"drcorn", {226, 140, 159, 0}
+"drcrop", {226, 140, 140, 0}
+"Dscr", {240, 157, 146, 159}
+"dscr", {240, 157, 146, 185}
+"DScy", {208, 133, 0}
+"dscy", {209, 149, 0}
+"dsol", {226, 167, 182, 0}
+"Dstrok", {196, 144, 0}
+"dstrok", {196, 145, 0}
+"dtdot", {226, 139, 177, 0}
+"dtri", {226, 150, 191, 0}
+"dtrif", {226, 150, 190, 0}
+"duarr", {226, 135, 181, 0}
+"duhar", {226, 165, 175, 0}
+"dwangle", {226, 166, 166, 0}
+"DZcy", {208, 143, 0}
+"dzcy", {209, 159, 0}
+"dzigrarr", {226, 159, 191, 0}
+"Eacute", {195, 137, 0}
+"eacute", {195, 169, 0}
+"easter", {226, 169, 174, 0}
+"Ecaron", {196, 154, 0}
+"ecaron", {196, 155, 0}
+"Ecirc", {195, 138, 0}
+"ecirc", {195, 170, 0}
+"ecir", {226, 137, 150, 0}
+"ecolon", {226, 137, 149, 0}
+"Ecy", {208, 173, 0}
+"ecy", {209, 141, 0}
+"eDDot", {226, 169, 183, 0}
+"Edot", {196, 150, 0}
+"edot", {196, 151, 0}
+"eDot", {226, 137, 145, 0}
+"ee", {226, 133, 135, 0}
+"efDot", {226, 137, 146, 0}
+"Efr", {240, 157, 148, 136}
+"efr", {240, 157, 148, 162}
+"eg", {226, 170, 154, 0}
+"Egrave", {195, 136, 0}
+"egrave", {195, 168, 0}
+"egs", {226, 170, 150, 0}
+"egsdot", {226, 170, 152, 0}
+"el", {226, 170, 153, 0}
+"Element", {226, 136, 136, 0}
+"elinters", {226, 143, 167, 0}
+"ell", {226, 132, 147, 0}
+"els", {226, 170, 149, 0}
+"elsdot", {226, 170, 151, 0}
+"Emacr", {196, 146, 0}
+"emacr", {196, 147, 0}
+"empty", {226, 136, 133, 0}
+"emptyset", {226, 136, 133, 0}
+"EmptySmallSquare", {226, 151, 187, 0}
+"emptyv", {226, 136, 133, 0}
+"EmptyVerySmallSquare", {226, 150, 171, 0}
+"emsp13", {226, 128, 132, 0}
+"emsp14", {226, 128, 133, 0}
+"emsp", {226, 128, 131, 0}
+"ENG", {197, 138, 0}
+"eng", {197, 139, 0}
+"ensp", {226, 128, 130, 0}
+"Eogon", {196, 152, 0}
+"eogon", {196, 153, 0}
+"Eopf", {240, 157, 148, 188}
+"eopf", {240, 157, 149, 150}
+"epar", {226, 139, 149, 0}
+"eparsl", {226, 167, 163, 0}
+"eplus", {226, 169, 177, 0}
+"epsi", {206, 181, 0}
+"Epsilon", {206, 149, 0}
+"epsilon", {206, 181, 0}
+"epsiv", {207, 181, 0}
+"eqcirc", {226, 137, 150, 0}
+"eqcolon", {226, 137, 149, 0}
+"eqsim", {226, 137, 130, 0}
+"eqslantgtr", {226, 170, 150, 0}
+"eqslantless", {226, 170, 149, 0}
+"Equal", {226, 169, 181, 0}
+"equals", {61, 0}
+"EqualTilde", {226, 137, 130, 0}
+"equest", {226, 137, 159, 0}
+"Equilibrium", {226, 135, 140, 0}
+"equiv", {226, 137, 161, 0}
+"equivDD", {226, 169, 184, 0}
+"eqvparsl", {226, 167, 165, 0}
+"erarr", {226, 165, 177, 0}
+"erDot", {226, 137, 147, 0}
+"escr", {226, 132, 175, 0}
+"Escr", {226, 132, 176, 0}
+"esdot", {226, 137, 144, 0}
+"Esim", {226, 169, 179, 0}
+"esim", {226, 137, 130, 0}
+"Eta", {206, 151, 0}
+"eta", {206, 183, 0}
+"ETH", {195, 144, 0}
+"eth", {195, 176, 0}
+"Euml", {195, 139, 0}
+"euml", {195, 171, 0}
+"euro", {226, 130, 172, 0}
+"excl", {33, 0}
+"exist", {226, 136, 131, 0}
+"Exists", {226, 136, 131, 0}
+"expectation", {226, 132, 176, 0}
+"exponentiale", {226, 133, 135, 0}
+"ExponentialE", {226, 133, 135, 0}
+"fallingdotseq", {226, 137, 146, 0}
+"Fcy", {208, 164, 0}
+"fcy", {209, 132, 0}
+"female", {226, 153, 128, 0}
+"ffilig", {239, 172, 131, 0}
+"fflig", {239, 172, 128, 0}
+"ffllig", {239, 172, 132, 0}
+"Ffr", {240, 157, 148, 137}
+"ffr", {240, 157, 148, 163}
+"filig", {239, 172, 129, 0}
+"FilledSmallSquare", {226, 151, 188, 0}
+"FilledVerySmallSquare", {226, 150, 170, 0}
+"fjlig", {102, 0}
+"flat", {226, 153, 173, 0}
+"fllig", {239, 172, 130, 0}
+"fltns", {226, 150, 177, 0}
+"fnof", {198, 146, 0}
+"Fopf", {240, 157, 148, 189}
+"fopf", {240, 157, 149, 151}
+"forall", {226, 136, 128, 0}
+"ForAll", {226, 136, 128, 0}
+"fork", {226, 139, 148, 0}
+"forkv", {226, 171, 153, 0}
+"Fouriertrf", {226, 132, 177, 0}
+"fpartint", {226, 168, 141, 0}
+"frac12", {194, 189, 0}
+"frac13", {226, 133, 147, 0}
+"frac14", {194, 188, 0}
+"frac15", {226, 133, 149, 0}
+"frac16", {226, 133, 153, 0}
+"frac18", {226, 133, 155, 0}
+"frac23", {226, 133, 148, 0}
+"frac25", {226, 133, 150, 0}
+"frac34", {194, 190, 0}
+"frac35", {226, 133, 151, 0}
+"frac38", {226, 133, 156, 0}
+"frac45", {226, 133, 152, 0}
+"frac56", {226, 133, 154, 0}
+"frac58", {226, 133, 157, 0}
+"frac78", {226, 133, 158, 0}
+"frasl", {226, 129, 132, 0}
+"frown", {226, 140, 162, 0}
+"fscr", {240, 157, 146, 187}
+"Fscr", {226, 132, 177, 0}
+"gacute", {199, 181, 0}
+"Gamma", {206, 147, 0}
+"gamma", {206, 179, 0}
+"Gammad", {207, 156, 0}
+"gammad", {207, 157, 0}
+"gap", {226, 170, 134, 0}
+"Gbreve", {196, 158, 0}
+"gbreve", {196, 159, 0}
+"Gcedil", {196, 162, 0}
+"Gcirc", {196, 156, 0}
+"gcirc", {196, 157, 0}
+"Gcy", {208, 147, 0}
+"gcy", {208, 179, 0}
+"Gdot", {196, 160, 0}
+"gdot", {196, 161, 0}
+"ge", {226, 137, 165, 0}
+"gE", {226, 137, 167, 0}
+"gEl", {226, 170, 140, 0}
+"gel", {226, 139, 155, 0}
+"geq", {226, 137, 165, 0}
+"geqq", {226, 137, 167, 0}
+"geqslant", {226, 169, 190, 0}
+"gescc", {226, 170, 169, 0}
+"ges", {226, 169, 190, 0}
+"gesdot", {226, 170, 128, 0}
+"gesdoto", {226, 170, 130, 0}
+"gesdotol", {226, 170, 132, 0}
+"gesl", {226, 139, 155, 0}
+"gesles", {226, 170, 148, 0}
+"Gfr", {240, 157, 148, 138}
+"gfr", {240, 157, 148, 164}
+"gg", {226, 137, 171, 0}
+"Gg", {226, 139, 153, 0}
+"ggg", {226, 139, 153, 0}
+"gimel", {226, 132, 183, 0}
+"GJcy", {208, 131, 0}
+"gjcy", {209, 147, 0}
+"gla", {226, 170, 165, 0}
+"gl", {226, 137, 183, 0}
+"glE", {226, 170, 146, 0}
+"glj", {226, 170, 164, 0}
+"gnap", {226, 170, 138, 0}
+"gnapprox", {226, 170, 138, 0}
+"gne", {226, 170, 136, 0}
+"gnE", {226, 137, 169, 0}
+"gneq", {226, 170, 136, 0}
+"gneqq", {226, 137, 169, 0}
+"gnsim", {226, 139, 167, 0}
+"Gopf", {240, 157, 148, 190}
+"gopf", {240, 157, 149, 152}
+"grave", {96, 0}
+"GreaterEqual", {226, 137, 165, 0}
+"GreaterEqualLess", {226, 139, 155, 0}
+"GreaterFullEqual", {226, 137, 167, 0}
+"GreaterGreater", {226, 170, 162, 0}
+"GreaterLess", {226, 137, 183, 0}
+"GreaterSlantEqual", {226, 169, 190, 0}
+"GreaterTilde", {226, 137, 179, 0}
+"Gscr", {240, 157, 146, 162}
+"gscr", {226, 132, 138, 0}
+"gsim", {226, 137, 179, 0}
+"gsime", {226, 170, 142, 0}
+"gsiml", {226, 170, 144, 0}
+"gtcc", {226, 170, 167, 0}
+"gtcir", {226, 169, 186, 0}
+"gt", {62, 0}
+"GT", {62, 0}
+"Gt", {226, 137, 171, 0}
+"gtdot", {226, 139, 151, 0}
+"gtlPar", {226, 166, 149, 0}
+"gtquest", {226, 169, 188, 0}
+"gtrapprox", {226, 170, 134, 0}
+"gtrarr", {226, 165, 184, 0}
+"gtrdot", {226, 139, 151, 0}
+"gtreqless", {226, 139, 155, 0}
+"gtreqqless", {226, 170, 140, 0}
+"gtrless", {226, 137, 183, 0}
+"gtrsim", {226, 137, 179, 0}
+"gvertneqq", {226, 137, 169, 0}
+"gvnE", {226, 137, 169, 0}
+"Hacek", {203, 135, 0}
+"hairsp", {226, 128, 138, 0}
+"half", {194, 189, 0}
+"hamilt", {226, 132, 139, 0}
+"HARDcy", {208, 170, 0}
+"hardcy", {209, 138, 0}
+"harrcir", {226, 165, 136, 0}
+"harr", {226, 134, 148, 0}
+"hArr", {226, 135, 148, 0}
+"harrw", {226, 134, 173, 0}
+"Hat", {94, 0}
+"hbar", {226, 132, 143, 0}
+"Hcirc", {196, 164, 0}
+"hcirc", {196, 165, 0}
+"hearts", {226, 153, 165, 0}
+"heartsuit", {226, 153, 165, 0}
+"hellip", {226, 128, 166, 0}
+"hercon", {226, 138, 185, 0}
+"hfr", {240, 157, 148, 165}
+"Hfr", {226, 132, 140, 0}
+"HilbertSpace", {226, 132, 139, 0}
+"hksearow", {226, 164, 165, 0}
+"hkswarow", {226, 164, 166, 0}
+"hoarr", {226, 135, 191, 0}
+"homtht", {226, 136, 187, 0}
+"hookleftarrow", {226, 134, 169, 0}
+"hookrightarrow", {226, 134, 170, 0}
+"hopf", {240, 157, 149, 153}
+"Hopf", {226, 132, 141, 0}
+"horbar", {226, 128, 149, 0}
+"HorizontalLine", {226, 148, 128, 0}
+"hscr", {240, 157, 146, 189}
+"Hscr", {226, 132, 139, 0}
+"hslash", {226, 132, 143, 0}
+"Hstrok", {196, 166, 0}
+"hstrok", {196, 167, 0}
+"HumpDownHump", {226, 137, 142, 0}
+"HumpEqual", {226, 137, 143, 0}
+"hybull", {226, 129, 131, 0}
+"hyphen", {226, 128, 144, 0}
+"Iacute", {195, 141, 0}
+"iacute", {195, 173, 0}
+"ic", {226, 129, 163, 0}
+"Icirc", {195, 142, 0}
+"icirc", {195, 174, 0}
+"Icy", {208, 152, 0}
+"icy", {208, 184, 0}
+"Idot", {196, 176, 0}
+"IEcy", {208, 149, 0}
+"iecy", {208, 181, 0}
+"iexcl", {194, 161, 0}
+"iff", {226, 135, 148, 0}
+"ifr", {240, 157, 148, 166}
+"Ifr", {226, 132, 145, 0}
+"Igrave", {195, 140, 0}
+"igrave", {195, 172, 0}
+"ii", {226, 133, 136, 0}
+"iiiint", {226, 168, 140, 0}
+"iiint", {226, 136, 173, 0}
+"iinfin", {226, 167, 156, 0}
+"iiota", {226, 132, 169, 0}
+"IJlig", {196, 178, 0}
+"ijlig", {196, 179, 0}
+"Imacr", {196, 170, 0}
+"imacr", {196, 171, 0}
+"image", {226, 132, 145, 0}
+"ImaginaryI", {226, 133, 136, 0}
+"imagline", {226, 132, 144, 0}
+"imagpart", {226, 132, 145, 0}
+"imath", {196, 177, 0}
+"Im", {226, 132, 145, 0}
+"imof", {226, 138, 183, 0}
+"imped", {198, 181, 0}
+"Implies", {226, 135, 146, 0}
+"incare", {226, 132, 133, 0}
+"in", {226, 136, 136, 0}
+"infin", {226, 136, 158, 0}
+"infintie", {226, 167, 157, 0}
+"inodot", {196, 177, 0}
+"intcal", {226, 138, 186, 0}
+"int", {226, 136, 171, 0}
+"Int", {226, 136, 172, 0}
+"integers", {226, 132, 164, 0}
+"Integral", {226, 136, 171, 0}
+"intercal", {226, 138, 186, 0}
+"Intersection", {226, 139, 130, 0}
+"intlarhk", {226, 168, 151, 0}
+"intprod", {226, 168, 188, 0}
+"InvisibleComma", {226, 129, 163, 0}
+"InvisibleTimes", {226, 129, 162, 0}
+"IOcy", {208, 129, 0}
+"iocy", {209, 145, 0}
+"Iogon", {196, 174, 0}
+"iogon", {196, 175, 0}
+"Iopf", {240, 157, 149, 128}
+"iopf", {240, 157, 149, 154}
+"Iota", {206, 153, 0}
+"iota", {206, 185, 0}
+"iprod", {226, 168, 188, 0}
+"iquest", {194, 191, 0}
+"iscr", {240, 157, 146, 190}
+"Iscr", {226, 132, 144, 0}
+"isin", {226, 136, 136, 0}
+"isindot", {226, 139, 181, 0}
+"isinE", {226, 139, 185, 0}
+"isins", {226, 139, 180, 0}
+"isinsv", {226, 139, 179, 0}
+"isinv", {226, 136, 136, 0}
+"it", {226, 129, 162, 0}
+"Itilde", {196, 168, 0}
+"itilde", {196, 169, 0}
+"Iukcy", {208, 134, 0}
+"iukcy", {209, 150, 0}
+"Iuml", {195, 143, 0}
+"iuml", {195, 175, 0}
+"Jcirc", {196, 180, 0}
+"jcirc", {196, 181, 0}
+"Jcy", {208, 153, 0}
+"jcy", {208, 185, 0}
+"Jfr", {240, 157, 148, 141}
+"jfr", {240, 157, 148, 167}
+"jmath", {200, 183, 0}
+"Jopf", {240, 157, 149, 129}
+"jopf", {240, 157, 149, 155}
+"Jscr", {240, 157, 146, 165}
+"jscr", {240, 157, 146, 191}
+"Jsercy", {208, 136, 0}
+"jsercy", {209, 152, 0}
+"Jukcy", {208, 132, 0}
+"jukcy", {209, 148, 0}
+"Kappa", {206, 154, 0}
+"kappa", {206, 186, 0}
+"kappav", {207, 176, 0}
+"Kcedil", {196, 182, 0}
+"kcedil", {196, 183, 0}
+"Kcy", {208, 154, 0}
+"kcy", {208, 186, 0}
+"Kfr", {240, 157, 148, 142}
+"kfr", {240, 157, 148, 168}
+"kgreen", {196, 184, 0}
+"KHcy", {208, 165, 0}
+"khcy", {209, 133, 0}
+"KJcy", {208, 140, 0}
+"kjcy", {209, 156, 0}
+"Kopf", {240, 157, 149, 130}
+"kopf", {240, 157, 149, 156}
+"Kscr", {240, 157, 146, 166}
+"kscr", {240, 157, 147, 128}
+"lAarr", {226, 135, 154, 0}
+"Lacute", {196, 185, 0}
+"lacute", {196, 186, 0}
+"laemptyv", {226, 166, 180, 0}
+"lagran", {226, 132, 146, 0}
+"Lambda", {206, 155, 0}
+"lambda", {206, 187, 0}
+"lang", {226, 159, 168, 0}
+"Lang", {226, 159, 170, 0}
+"langd", {226, 166, 145, 0}
+"langle", {226, 159, 168, 0}
+"lap", {226, 170, 133, 0}
+"Laplacetrf", {226, 132, 146, 0}
+"laquo", {194, 171, 0}
+"larrb", {226, 135, 164, 0}
+"larrbfs", {226, 164, 159, 0}
+"larr", {226, 134, 144, 0}
+"Larr", {226, 134, 158, 0}
+"lArr", {226, 135, 144, 0}
+"larrfs", {226, 164, 157, 0}
+"larrhk", {226, 134, 169, 0}
+"larrlp", {226, 134, 171, 0}
+"larrpl", {226, 164, 185, 0}
+"larrsim", {226, 165, 179, 0}
+"larrtl", {226, 134, 162, 0}
+"latail", {226, 164, 153, 0}
+"lAtail", {226, 164, 155, 0}
+"lat", {226, 170, 171, 0}
+"late", {226, 170, 173, 0}
+"lates", {226, 170, 173, 0}
+"lbarr", {226, 164, 140, 0}
+"lBarr", {226, 164, 142, 0}
+"lbbrk", {226, 157, 178, 0}
+"lbrace", {123, 0}
+"lbrack", {91, 0}
+"lbrke", {226, 166, 139, 0}
+"lbrksld", {226, 166, 143, 0}
+"lbrkslu", {226, 166, 141, 0}
+"Lcaron", {196, 189, 0}
+"lcaron", {196, 190, 0}
+"Lcedil", {196, 187, 0}
+"lcedil", {196, 188, 0}
+"lceil", {226, 140, 136, 0}
+"lcub", {123, 0}
+"Lcy", {208, 155, 0}
+"lcy", {208, 187, 0}
+"ldca", {226, 164, 182, 0}
+"ldquo", {226, 128, 156, 0}
+"ldquor", {226, 128, 158, 0}
+"ldrdhar", {226, 165, 167, 0}
+"ldrushar", {226, 165, 139, 0}
+"ldsh", {226, 134, 178, 0}
+"le", {226, 137, 164, 0}
+"lE", {226, 137, 166, 0}
+"LeftAngleBracket", {226, 159, 168, 0}
+"LeftArrowBar", {226, 135, 164, 0}
+"leftarrow", {226, 134, 144, 0}
+"LeftArrow", {226, 134, 144, 0}
+"Leftarrow", {226, 135, 144, 0}
+"LeftArrowRightArrow", {226, 135, 134, 0}
+"leftarrowtail", {226, 134, 162, 0}
+"LeftCeiling", {226, 140, 136, 0}
+"LeftDoubleBracket", {226, 159, 166, 0}
+"LeftDownTeeVector", {226, 165, 161, 0}
+"LeftDownVectorBar", {226, 165, 153, 0}
+"LeftDownVector", {226, 135, 131, 0}
+"LeftFloor", {226, 140, 138, 0}
+"leftharpoondown", {226, 134, 189, 0}
+"leftharpoonup", {226, 134, 188, 0}
+"leftleftarrows", {226, 135, 135, 0}
+"leftrightarrow", {226, 134, 148, 0}
+"LeftRightArrow", {226, 134, 148, 0}
+"Leftrightarrow", {226, 135, 148, 0}
+"leftrightarrows", {226, 135, 134, 0}
+"leftrightharpoons", {226, 135, 139, 0}
+"leftrightsquigarrow", {226, 134, 173, 0}
+"LeftRightVector", {226, 165, 142, 0}
+"LeftTeeArrow", {

<TRUNCATED>

[09/12] lucy-clownfish git commit: Update CommonMark source code

Posted by nw...@apache.org.
Update CommonMark source code

Update CommonMark source code to commit b34e19c from Sat Jan 17
22:00:19 2015 -0800.


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/5672da15
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/5672da15
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/5672da15

Branch: refs/heads/master
Commit: 5672da15fe6837fc7c1081d74a283d7005a8da22
Parents: dd37ce3
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sat Jan 10 18:54:08 2015 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sun Jan 18 19:37:05 2015 +0100

----------------------------------------------------------------------
 compiler/modules/CommonMark/COPYING             |   173 +
 compiler/modules/CommonMark/LICENSE             |    70 -
 compiler/modules/CommonMark/README.md           |    87 +-
 compiler/modules/CommonMark/src/blocks.c        |   508 +-
 compiler/modules/CommonMark/src/buffer.c        |    84 +-
 compiler/modules/CommonMark/src/buffer.h        |    82 +-
 compiler/modules/CommonMark/src/chunk.h         |    18 +-
 compiler/modules/CommonMark/src/cmark.c         |     2 +-
 compiler/modules/CommonMark/src/cmark.h         |   354 +-
 compiler/modules/CommonMark/src/cmark_ctype.c   |    53 +
 compiler/modules/CommonMark/src/cmark_ctype.h   |    24 +
 compiler/modules/CommonMark/src/cmark_export.h  |    32 +-
 compiler/modules/CommonMark/src/config.h        |     4 +
 compiler/modules/CommonMark/src/config.h.in     |     6 +
 compiler/modules/CommonMark/src/houdini.h       |    26 +-
 .../modules/CommonMark/src/houdini_href_e.c     |    20 +-
 .../modules/CommonMark/src/houdini_html_e.c     |    24 +-
 .../modules/CommonMark/src/houdini_html_u.c     |    17 +-
 compiler/modules/CommonMark/src/html.c          |   489 +-
 .../modules/CommonMark/src/html_unescape.gperf  |  4253 ++--
 compiler/modules/CommonMark/src/html_unescape.h | 21275 +++++++++--------
 compiler/modules/CommonMark/src/inlines.c       |   328 +-
 compiler/modules/CommonMark/src/iterator.c      |   140 +
 compiler/modules/CommonMark/src/iterator.h      |    25 +
 compiler/modules/CommonMark/src/man.c           |   249 +
 compiler/modules/CommonMark/src/node.c          |   250 +-
 compiler/modules/CommonMark/src/node.h          |     5 +-
 compiler/modules/CommonMark/src/parser.h        |     1 +
 compiler/modules/CommonMark/src/print.c         |   169 -
 compiler/modules/CommonMark/src/references.c    |    16 +-
 compiler/modules/CommonMark/src/scanners.c      |  4008 ++--
 compiler/modules/CommonMark/src/scanners.h      |     2 +-
 compiler/modules/CommonMark/src/scanners.re     |     7 +-
 compiler/modules/CommonMark/src/utf8.c          |   427 +-
 compiler/modules/CommonMark/src/xml.c           |   175 +
 35 files changed, 18401 insertions(+), 15002 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/COPYING
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/COPYING b/compiler/modules/CommonMark/COPYING
new file mode 100644
index 0000000..0bb3445
--- /dev/null
+++ b/compiler/modules/CommonMark/COPYING
@@ -0,0 +1,173 @@
+Copyright (c) 2014, John MacFarlane
+
+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 John MacFarlane nor the names of other
+      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.
+
+-----
+
+houdini.h, houdini_href_e.c, houdini_html_e.c, houdini_html_u.c,
+html_unescape.gperf, html_unescape.h
+
+derive from https://github.com/vmg/houdini (with some modifications)
+
+Copyright (C) 2012 Vicent Martí
+
+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.
+
+-----
+
+buffer.h, buffer.c, chunk.h
+
+are derived from code (C) 2012 Github, Inc.
+
+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.
+
+-----
+
+utf8.c and utf8.c
+
+are derived from utf8proc
+(<http://www.public-software-group.org/utf8proc>),
+(C) 2009 Public Software Group e. V., Berlin, Germany.
+
+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.
+
+-----
+
+normalize-reference.js is a slightly modified version of
+https://github.com/dmoscrop/fold-case:
+
+Copyright Mathias Bynens <https://mathiasbynens.be/>
+
+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.
+
+-----
+
+The polyfill for String.fromCodePoint included in commonmark.js is
+Copyright Mathias Bynens <http://mathiasbynens.be/>
+
+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.
+
+-----
+
+The normalization code in runtests.py was derived from the
+markdowntest project, Copyright 2013 Karl Dubost:
+
+The MIT License (MIT)
+
+Copyright (c) 2013 Karl Dubost
+
+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.
+

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/LICENSE
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/LICENSE b/compiler/modules/CommonMark/LICENSE
deleted file mode 100644
index c8377be..0000000
--- a/compiler/modules/CommonMark/LICENSE
+++ /dev/null
@@ -1,70 +0,0 @@
-Copyright (c) 2014, John MacFarlane
-
-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 John MacFarlane nor the names of other
-      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.
-
------
-
-The polyfill for String.fromCodePoint included in commonmark.js is
-Copyright Mathias Bynens <http://mathiasbynens.be/>
-
-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.
-
------
-
-The normalization code in runtests.py was derived from the
-markdowntest project, Copyright 2013 Karl Dubost:
-
-The MIT License (MIT)
-
-Copyright (c) 2013 Karl Dubost
-
-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.
-

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/README.md
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/README.md b/compiler/modules/CommonMark/README.md
index 8db4c1f..4bbac88 100644
--- a/compiler/modules/CommonMark/README.md
+++ b/compiler/modules/CommonMark/README.md
@@ -16,22 +16,12 @@ written in standard C99 and has no library dependencies.  The parser is
 very fast (see [benchmarks](benchmarks.md)).
 
 It is easy to use `libcmark` in python, lua, ruby, and other dynamic
-languages: see `wrapper.py`, `wrapper.lua`, and `wrapper.rb` in the
-repository for simple examples.
+languages: see the `wrappers/` subdirectory for some simple examples.
 
-The JavaScript implementation is a single JavaScript file, with
-no dependencies, that can be linked to in an HTML page.  Here
-is a simple usage example:
-
-``` javascript
-var reader = new commonmark.DocParser();
-var writer = new commonmark.HtmlRenderer();
-var parsed = reader.parse("Hello *world*");
-var result = writer.render(parsed);
-```
-
-A node package is also available; it includes a command-line tool called
-`commonmark`.
+The JavaScript implementation provides both an NPM package and a
+single JavaScript file, with no dependencies, that can be linked into
+an HTML page. For further information, see the
+[README in the js directory](js/README.md).
 
 **A note on security:**
 Neither implementation attempts to sanitize link attributes or
@@ -61,7 +51,7 @@ on FreeBSD:
     mkdir build
     cd build
     cmake ..  # optionally: -DCMAKE_INSTALL_PREFIX=path
-    make      # executable will be create as build/src/cmake
+    make      # executable will be created as build/src/cmark
     make test
     make install
 
@@ -75,21 +65,26 @@ Or, to create Xcode project files on OSX:
     make install
 
 The GNU Makefile also provides a few other targets for developers.
+To run a benchmark:
+
+    make bench
+
 To run a "fuzz test" against ten long randomly generated inputs:
 
     make fuzztest
 
-To run a test for memory leaks using valgrind:
+To run a test for memory leaks using `valgrind`:
 
     make leakcheck
 
+To reformat source code using `astyle`:
+
+    make astyle
+
 To make a release tarball and zip archive:
 
     make archive
 
-To test the archives:
-
-    make testarchive
 
 Compiling for Windows
 ---------------------
@@ -112,20 +107,14 @@ The JavaScript library can be installed through `npm`:
 
     npm install commonmark
 
-To build the JavaScript library as a single standalone file:
-
-    browserify --standalone commonmark js/lib/index.js -o js/commonmark.js
-
-Or fetch a pre-built copy from
-<http://spec.commonmark.org/js/commonmark.js>`.
-
-To run tests for the JavaScript library:
-
-    make testjs
+This includes a command-line converter called `commonmark`.
 
-or
+If you want to use it in a client application, you can fetch
+a pre-built copy of `commonmark.js` from
+<http://spec.commonmark.org/js/commonmark.js>.
 
-    node js/test.js
+For further information, see the
+[README in the js directory](js/README.md).
 
 The spec
 --------
@@ -133,16 +122,16 @@ The spec
 [The spec] contains over 500 embedded examples which serve as conformance
 tests. To run the tests using an executable `$PROG`:
 
-    python test/spec_tests.py --program $PROG
+    python3 test/spec_tests.py --program $PROG
 
 If you want to extract the raw test data from the spec without
 actually running the tests, you can do:
 
-    python test/spec_tests.py --dump-tests
+    python3 test/spec_tests.py --dump-tests
 
 and you'll get all the tests in JSON format.
 
-[The spec]:  http://jgm.github.io/CommonMark/spec.html
+[The spec]:  http://spec.commonmark.org/0.13/
 
 The source of [the spec] is `spec.txt`.  This is basically a Markdown
 file, with code examples written in a shorthand form:
@@ -154,8 +143,9 @@ file, with code examples written in a shorthand form:
     .
 
 To build an HTML version of the spec, do `make spec.html`.  To build a
-PDF version, do `make spec.pdf`.  Both these commands require that
-[pandoc] is installed, and creating a PDF requires a latex installation.
+PDF version, do `make spec.pdf`.  (Creating a PDF requires [pandoc]
+and a LaTeX installation.  Creating the HTML version requires only
+`libcmark` and `python3`.)
 
 The spec is written from the point of view of the human writer, not
 the computer reader.  It is not an algorithm---an English translation of
@@ -191,15 +181,13 @@ Differences from original Markdown
 There are only a few places where this spec says things that contradict
 the canonical syntax description:
 
--   It [allows all punctuation symbols to be
-    backslash-escaped](http://jgm.github.io/CommonMark/spec.html#backslash-escapes),
+-   It allows all punctuation symbols to be backslash-escaped,
     not just the symbols with special meanings in Markdown. We found
     that it was just too hard to remember which symbols could be
     escaped.
 
--   It introduces an [alternative syntax for hard line
-    breaks](http://jgm.github.io/CommonMark/spec.html#hard-line-breaks), a
-    backslash at the end of the line, supplementing the
+-   It introduces an alternative syntax for hard line
+    breaks, a backslash at the end of the line, supplementing the
     two-spaces-at-the-end-of-line rule. This is motivated by persistent
     complaints about the “invisible” nature of the two-space rule.
 
@@ -207,13 +195,11 @@ the canonical syntax description:
     backwards-compatible way). For example, `Markdown.pl` allows single
     quotes around a title in inline links, but not in reference links.
     This kind of difference is really hard for users to remember, so the
-    spec [allows single quotes in both
-    contexts](http://jgm.github.io/CommonMark/spec.html#links).
+    spec allows single quotes in both contexts.
 
 -   The rule for HTML blocks differs, though in most real cases it
-    shouldn't make a difference. (See
-    [here](http://jgm.github.io/CommonMark/spec.html#html-blocks) for
-    details.) The spec's proposal makes it easy to include Markdown
+    shouldn't make a difference. (See the section on HTML Blocks
+    for details.) The spec's proposal makes it easy to include Markdown
     inside HTML block-level tags, if you want to, but also allows you to
     exclude this. It is also makes parsing much easier, avoiding
     expensive backtracking.
@@ -232,7 +218,7 @@ the canonical syntax description:
 -   Rules for content in lists differ in a few respects, though (as with
     HTML blocks), most lists in existing documents should render as
     intended. There is some discussion of the choice points and
-    differences [here](http://jgm.github.io/CommonMark/spec.html#motivation).
+    differences in the subsection of List Items entitled Motivation.
     We think that the spec's proposal does better than any existing
     implementation in rendering lists the way a human writer or reader
     would intuitively understand them. (We could give numerous examples
@@ -254,7 +240,7 @@ the canonical syntax description:
 
 -   The start number of an ordered list is significant.
 
--   [Fenced code blocks](http://jgm.github.io/CommonMark/spec.html#fenced-code-blocks) are supported, delimited by either
+-   Fenced code blocks are supported, delimited by either
     backticks (```` ``` ```` or tildes (` ~~~ `).
 
 Contributing
@@ -290,7 +276,8 @@ optimized the C implementation for performance, increasing its speed
 tenfold.  Kārlis Gaņģis helped work out a better parsing algorithm
 for links and emphasis, eliminating several worst-case performance
 issues.  Nick Wellnhofer contributed many improvements, including
-most of the C library's API and its test harness.
+most of the C library's API and its test harness.  Vitaly Puzrin
+has offered much good advice about the JavaScript implementation.
 
 [cmake]: http://www.cmake.org/download/
 [pandoc]: http://johnmacfarlane.net/pandoc/

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/blocks.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/blocks.c b/compiler/modules/CommonMark/src/blocks.c
index ebef88b..dafbb9b 100644
--- a/compiler/modules/CommonMark/src/blocks.c
+++ b/compiler/modules/CommonMark/src/blocks.c
@@ -1,8 +1,8 @@
 #include <stdlib.h>
 #include <assert.h>
 #include <stdio.h>
-#include <ctype.h>
 
+#include "cmark_ctype.h"
 #include "config.h"
 #include "parser.h"
 #include "cmark.h"
@@ -20,11 +20,11 @@
 
 static void
 S_parser_feed(cmark_parser *parser, const unsigned char *buffer, size_t len,
-	      bool eof);
+              bool eof);
 
 static void
 S_process_line(cmark_parser *parser, const unsigned char *buffer,
-	       size_t bytes);
+               size_t bytes);
 
 static cmark_node* make_block(cmark_node_type tag, int start_line, int start_column)
 {
@@ -37,7 +37,7 @@ static cmark_node* make_block(cmark_node_type tag, int start_line, int start_col
 		e->start_line = start_line;
 		e->start_column = start_column;
 		e->end_line = start_line;
-		strbuf_init(&e->string_content, 32);
+		cmark_strbuf_init(&e->string_content, 32);
 	}
 
 	return e;
@@ -54,8 +54,8 @@ cmark_parser *cmark_parser_new()
 {
 	cmark_parser *parser = (cmark_parser*)malloc(sizeof(cmark_parser));
 	cmark_node *document = make_document();
-	strbuf *line = (strbuf*)malloc(sizeof(strbuf));
-	strbuf *buf  = (strbuf*)malloc(sizeof(strbuf));
+	cmark_strbuf *line = (cmark_strbuf*)malloc(sizeof(cmark_strbuf));
+	cmark_strbuf *buf  = (cmark_strbuf*)malloc(sizeof(cmark_strbuf));
 	cmark_strbuf_init(line, 256);
 	cmark_strbuf_init(buf, 0);
 
@@ -64,6 +64,7 @@ cmark_parser *cmark_parser_new()
 	parser->current = document;
 	parser->line_number = 0;
 	parser->curline = line;
+	parser->last_line_length = 0;
 	parser->linebuf = buf;
 
 	return parser;
@@ -79,20 +80,21 @@ void cmark_parser_free(cmark_parser *parser)
 	free(parser);
 }
 
-static void finalize(cmark_parser *parser, cmark_node* b, int line_number);
+static cmark_node*
+finalize(cmark_parser *parser, cmark_node* b);
 
 // Returns true if line has only space characters, else false.
-static bool is_blank(strbuf *s, int offset)
+static bool is_blank(cmark_strbuf *s, int offset)
 {
 	while (offset < s->size) {
 		switch (s->ptr[offset]) {
-			case '\n':
-				return true;
-			case ' ':
-				offset++;
-				break;
-			default:
-				return false;
+		case '\n':
+			return true;
+		case ' ':
+			offset++;
+			break;
+		default:
+			return false;
 		}
 	}
 
@@ -102,25 +104,25 @@ static bool is_blank(strbuf *s, int offset)
 static inline bool can_contain(cmark_node_type parent_type, cmark_node_type child_type)
 {
 	return ( parent_type == NODE_DOCUMENT ||
-			parent_type == NODE_BLOCK_QUOTE ||
-			parent_type == NODE_LIST_ITEM ||
-			(parent_type == NODE_LIST && child_type == NODE_LIST_ITEM) );
+	         parent_type == NODE_BLOCK_QUOTE ||
+	         parent_type == NODE_ITEM ||
+	         (parent_type == NODE_LIST && child_type == NODE_ITEM) );
 }
 
 static inline bool accepts_lines(cmark_node_type block_type)
 {
 	return (block_type == NODE_PARAGRAPH ||
-		block_type == NODE_HEADER ||
-		block_type == NODE_CODE_BLOCK);
+	        block_type == NODE_HEADER ||
+	        block_type == NODE_CODE_BLOCK);
 }
 
-static void add_line(cmark_node* cmark_node, chunk *ch, int offset)
+static void add_line(cmark_node* node, cmark_chunk *ch, int offset)
 {
-	assert(cmark_node->open);
-	strbuf_put(&cmark_node->string_content, ch->data + offset, ch->len - offset);
+	assert(node->open);
+	cmark_strbuf_put(&node->string_content, ch->data + offset, ch->len - offset);
 }
 
-static void remove_trailing_blank_lines(strbuf *ln)
+static void remove_trailing_blank_lines(cmark_strbuf *ln)
 {
 	int i;
 
@@ -132,31 +134,35 @@ static void remove_trailing_blank_lines(strbuf *ln)
 	}
 
 	if (i < 0) {
-		strbuf_clear(ln);
+		cmark_strbuf_clear(ln);
 		return;
 	}
 
-	i = strbuf_strchr(ln, '\n', i);
+	i = cmark_strbuf_strchr(ln, '\n', i);
 	if (i >= 0)
-		strbuf_truncate(ln, i);
+		cmark_strbuf_truncate(ln, i);
 }
 
 // Check to see if a cmark_node ends with a blank line, descending
 // if needed into lists and sublists.
-static bool ends_with_blank_line(cmark_node* cmark_node)
+static bool ends_with_blank_line(cmark_node* node)
 {
-	if (cmark_node->last_line_blank) {
-		return true;
-	}
-	if ((cmark_node->type == NODE_LIST || cmark_node->type == NODE_LIST_ITEM) && cmark_node->last_child) {
-		return ends_with_blank_line(cmark_node->last_child);
-	} else {
-		return false;
+	cmark_node *cur = node;
+	while (cur != NULL) {
+		if (cur->last_line_blank) {
+			return true;
+		}
+		if (cur->type == NODE_LIST || cur->type == NODE_ITEM) {
+			cur = cur->last_child;
+		} else {
+			cur = NULL;
+		}
 	}
+	return false;
 }
 
 // Break out of all containing lists
-static int break_out_of_lists(cmark_parser *parser, cmark_node ** bptr, int line_number)
+static int break_out_of_lists(cmark_parser *parser, cmark_node ** bptr)
 {
 	cmark_node *container = *bptr;
 	cmark_node *b = parser->root;
@@ -166,116 +172,137 @@ static int break_out_of_lists(cmark_parser *parser, cmark_node ** bptr, int line
 	}
 	if (b) {
 		while (container && container != b) {
-			finalize(parser, container, line_number);
-			container = container->parent;
+			container = finalize(parser, container);
 		}
-		finalize(parser, b, line_number);
+		finalize(parser, b);
 		*bptr = b->parent;
 	}
 	return 0;
 }
 
 
-static void finalize(cmark_parser *parser, cmark_node* b, int line_number)
+static cmark_node*
+finalize(cmark_parser *parser, cmark_node* b)
 {
 	int firstlinelen;
 	int pos;
 	cmark_node* item;
 	cmark_node* subitem;
+	cmark_node* parent;
+
+	parent = b->parent;
 
+	// don't do anything if the cmark_node is already closed
 	if (!b->open)
-		return; // don't do anything if the cmark_node is already closed
+		return parent;
 
 	b->open = false;
-	if (line_number > b->start_line) {
-		b->end_line = line_number - 1;
+
+	if (parser->curline->size == 0) {
+		// end of input - line number has not been incremented
+		b->end_line = parser->line_number;
+		b->end_column = parser->last_line_length;
+	} else if (b->type == NODE_DOCUMENT ||
+	           (b->type == NODE_CODE_BLOCK && b->as.code.fenced) ||
+	           (b->type == NODE_HEADER && b->as.header.setext)) {
+		b->end_line = parser->line_number;
+		b->end_column = parser->curline->size -
+		                (parser->curline->ptr[parser->curline->size - 1] == '\n' ?
+		                 1 : 0);
 	} else {
-		b->end_line = line_number;
+		b->end_line = parser->line_number - 1;
+		b->end_column = parser->last_line_length;
 	}
 
 	switch (b->type) {
-		case NODE_PARAGRAPH:
-			while (strbuf_at(&b->string_content, 0) == '[' &&
-					(pos = cmark_parse_reference_inline(&b->string_content, parser->refmap))) {
+	case NODE_PARAGRAPH:
+		while (cmark_strbuf_at(&b->string_content, 0) == '[' &&
+		       (pos = cmark_parse_reference_inline(&b->string_content, parser->refmap))) {
 
-				strbuf_drop(&b->string_content, pos);
-			}
-			if (is_blank(&b->string_content, 0)) {
-				b->type = NODE_REFERENCE_DEF;
-			}
-			break;
+			cmark_strbuf_drop(&b->string_content, pos);
+		}
+		if (is_blank(&b->string_content, 0)) {
+			// remove blank node (former reference def)
+			cmark_node_free(b);
+		}
+		break;
 
-		case NODE_CODE_BLOCK:
-			if (!b->as.code.fenced) { // indented code
-				remove_trailing_blank_lines(&b->string_content);
-				strbuf_putc(&b->string_content, '\n');
-				break;
-			} else {
+	case NODE_CODE_BLOCK:
+		if (!b->as.code.fenced) { // indented code
+			remove_trailing_blank_lines(&b->string_content);
+			cmark_strbuf_putc(&b->string_content, '\n');
+		} else {
 
-				// first line of contents becomes info
-				firstlinelen = strbuf_strchr(&b->string_content, '\n', 0);
+			// first line of contents becomes info
+			firstlinelen = cmark_strbuf_strchr(&b->string_content, '\n', 0);
 
-				houdini_unescape_html_f(
-						&b->as.code.info,
-						b->string_content.ptr,
-						firstlinelen
-						);
+			cmark_strbuf tmp = GH_BUF_INIT;
+			houdini_unescape_html_f(
+			    &tmp,
+			    b->string_content.ptr,
+			    firstlinelen
+			);
+			cmark_strbuf_trim(&tmp);
+			cmark_strbuf_unescape(&tmp);
+			b->as.code.info = cmark_chunk_buf_detach(&tmp);
 
-				strbuf_drop(&b->string_content, firstlinelen + 1);
+			cmark_strbuf_drop(&b->string_content, firstlinelen + 1);
+		}
+		b->as.code.literal = cmark_chunk_buf_detach(&b->string_content);
+		break;
 
-				strbuf_trim(&b->as.code.info);
-				strbuf_unescape(&b->as.code.info);
-				break;
-			}
+	case NODE_HTML:
+		b->as.literal = cmark_chunk_buf_detach(&b->string_content);
+		break;
 
-		case NODE_LIST: // determine tight/loose status
-			b->as.list.tight = true; // tight by default
-			item = b->first_child;
+	case NODE_LIST: // determine tight/loose status
+		b->as.list.tight = true; // tight by default
+		item = b->first_child;
 
-			while (item) {
-				// check for non-final non-empty list item ending with blank line:
-				if (item->last_line_blank && item->next) {
+		while (item) {
+			// check for non-final non-empty list item ending with blank line:
+			if (item->last_line_blank && item->next) {
+				b->as.list.tight = false;
+				break;
+			}
+			// recurse into children of list item, to see if there are
+			// spaces between them:
+			subitem = item->first_child;
+			while (subitem) {
+				if (ends_with_blank_line(subitem) &&
+				    (item->next || subitem->next)) {
 					b->as.list.tight = false;
 					break;
 				}
-				// recurse into children of list item, to see if there are
-				// spaces between them:
-				subitem = item->first_child;
-				while (subitem) {
-					if (ends_with_blank_line(subitem) &&
-							(item->next || subitem->next)) {
-						b->as.list.tight = false;
-						break;
-					}
-					subitem = subitem->next;
-				}
-				if (!(b->as.list.tight)) {
-					break;
-				}
-				item = item->next;
+				subitem = subitem->next;
+			}
+			if (!(b->as.list.tight)) {
+				break;
 			}
+			item = item->next;
+		}
 
-			break;
+		break;
 
-		default:
-			break;
+	default:
+		break;
 	}
+	return parent;
 }
 
 // Add a cmark_node as child of another.  Return pointer to child.
 static cmark_node* add_child(cmark_parser *parser, cmark_node* parent,
-		cmark_node_type block_type, int start_line, int start_column)
+                             cmark_node_type block_type, int start_column)
 {
 	assert(parent);
 
 	// if 'parent' isn't the kind of cmark_node that can accept this child,
 	// then back up til we hit a cmark_node that can.
 	while (!can_contain(parent->type, block_type)) {
-		finalize(parser, parent, start_line);
-		parent = parent->parent;
+		parent = finalize(parser, parent);
 	}
 
-	cmark_node* child = make_block(block_type, start_line, start_column);
+	cmark_node* child = make_block(block_type, parser->line_number, start_column);
 	child->parent = parent;
 
 	if (parent->last_child) {
@@ -290,58 +317,31 @@ static cmark_node* add_child(cmark_parser *parser, cmark_node* parent,
 }
 
 
-typedef struct BlockStack {
-	struct BlockStack *previous;
-	cmark_node *next_sibling;
-} block_stack;
-
 // Walk through cmark_node and all children, recursively, parsing
 // string content into inline content where appropriate.
-static void process_inlines(cmark_node* cur, cmark_reference_map *refmap)
+static void process_inlines(cmark_node* root, cmark_reference_map *refmap)
 {
-	block_stack* stack = NULL;
-	block_stack* newstack = NULL;
-
-	while (cur != NULL) {
-		switch (cur->type) {
-			case NODE_PARAGRAPH:
-			case NODE_HEADER:
+	cmark_iter *iter = cmark_iter_new(root);
+	cmark_node *cur;
+	cmark_event_type ev_type;
+
+	while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
+		cur = cmark_iter_get_node(iter);
+		if (ev_type == CMARK_EVENT_ENTER) {
+			if (cur->type == NODE_PARAGRAPH ||
+			    cur->type == NODE_HEADER) {
 				cmark_parse_inlines(cur, refmap);
-				break;
-
-			default:
-				break;
-		}
-
-		if (cur->first_child) {
-			newstack = (block_stack*)malloc(sizeof(block_stack));
-			if (newstack == NULL) break;
-			newstack->previous = stack;
-			stack = newstack;
-			stack->next_sibling = cur->next;
-			cur = cur->first_child;
-		} else {
-			cur = cur->next;
-		}
-
-		while (cur == NULL && stack != NULL) {
-			cur = stack->next_sibling;
-			newstack = stack->previous;
-			free(stack);
-			stack = newstack;
+			}
 		}
 	}
-	while (stack != NULL) {
-		newstack = stack->previous;
-		free(stack);
-		stack = newstack;
-	}
+
+	cmark_iter_free(iter);
 }
 
 // Attempts to parse a list item marker (bullet or enumerated).
 // On success, returns length of the marker, and populates
 // data with the details.  On failure, returns 0.
-static int parse_list_marker(chunk *input, int pos, cmark_list **dataptr)
+static int parse_list_marker(cmark_chunk *input, int pos, cmark_list **dataptr)
 {
 	unsigned char c;
 	int startpos;
@@ -352,7 +352,7 @@ static int parse_list_marker(chunk *input, int pos, cmark_list **dataptr)
 
 	if ((c == '*' || c == '-' || c == '+') && !scan_hrule(input, pos)) {
 		pos++;
-		if (!isspace(peek_at(input, pos))) {
+		if (!cmark_isspace(peek_at(input, pos))) {
 			return 0;
 		}
 		data = (cmark_list *)calloc(1, sizeof(*data));
@@ -366,18 +366,18 @@ static int parse_list_marker(chunk *input, int pos, cmark_list **dataptr)
 			data->delimiter = CMARK_PERIOD_DELIM;
 			data->tight = false;
 		}
-	} else if (isdigit(c)) {
+	} else if (cmark_isdigit(c)) {
 		int start = 0;
 
 		do {
 			start = (10 * start) + (peek_at(input, pos) - '0');
 			pos++;
-		} while (isdigit(peek_at(input, pos)));
+		} while (cmark_isdigit(peek_at(input, pos)));
 
 		c = peek_at(input, pos);
 		if (c == '.' || c == ')') {
 			pos++;
-			if (!isspace(peek_at(input, pos))) {
+			if (!cmark_isspace(peek_at(input, pos))) {
 				return 0;
 			}
 			data = (cmark_list *)calloc(1, sizeof(*data));
@@ -407,19 +407,18 @@ static int parse_list_marker(chunk *input, int pos, cmark_list **dataptr)
 static int lists_match(cmark_list *list_data, cmark_list *item_data)
 {
 	return (list_data->list_type == item_data->list_type &&
-			list_data->delimiter == item_data->delimiter &&
-			// list_data->marker_offset == item_data.marker_offset &&
-			list_data->bullet_char == item_data->bullet_char);
+	        list_data->delimiter == item_data->delimiter &&
+	        // list_data->marker_offset == item_data.marker_offset &&
+	        list_data->bullet_char == item_data->bullet_char);
 }
 
 static cmark_node *finalize_document(cmark_parser *parser)
 {
 	while (parser->current != parser->root) {
-		finalize(parser, parser->current, parser->line_number);
-		parser->current = parser->current->parent;
+		parser->current = finalize(parser, parser->current);
 	}
 
-	finalize(parser, parser->root, parser->line_number);
+	finalize(parser, parser->root);
 	process_inlines(parser->root, parser->refmap);
 
 	return parser->root;
@@ -465,34 +464,31 @@ cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len)
 
 static void
 S_parser_feed(cmark_parser *parser, const unsigned char *buffer, size_t len,
-	      bool eof)
+              bool eof)
 {
 	const unsigned char *end = buffer + len;
 
 	while (buffer < end) {
 		const unsigned char *eol
-			= (const unsigned char *)memchr(buffer, '\n',
-							end - buffer);
+		    = (const unsigned char *)memchr(buffer, '\n',
+		                                    end - buffer);
 		size_t line_len;
 
 		if (eol) {
 			line_len = eol + 1 - buffer;
-		}
-		else if (eof) {
+		} else if (eof) {
 			line_len = end - buffer;
-		}
-		else {
-			strbuf_put(parser->linebuf, buffer, end - buffer);
+		} else {
+			cmark_strbuf_put(parser->linebuf, buffer, end - buffer);
 			break;
 		}
 
 		if (parser->linebuf->size > 0) {
-			strbuf_put(parser->linebuf, buffer, line_len);
+			cmark_strbuf_put(parser->linebuf, buffer, line_len);
 			S_process_line(parser, parser->linebuf->ptr,
-				       parser->linebuf->size);
-			strbuf_clear(parser->linebuf);
-		}
-		else {
+			               parser->linebuf->size);
+			cmark_strbuf_clear(parser->linebuf);
+		} else {
 			S_process_line(parser, buffer, line_len);
 		}
 
@@ -500,11 +496,11 @@ S_parser_feed(cmark_parser *parser, const unsigned char *buffer, size_t len,
 	}
 }
 
-static void chop_trailing_hashtags(chunk *ch)
+static void chop_trailing_hashtags(cmark_chunk *ch)
 {
 	int n, orig_n;
 
-	chunk_rtrim(ch);
+	cmark_chunk_rtrim(ch);
 	orig_n = n = ch->len - 1;
 
 	// if string ends in space followed by #s, remove these:
@@ -514,7 +510,7 @@ static void chop_trailing_hashtags(chunk *ch)
 	// Check for a be a space before the final #s:
 	if (n != orig_n && n >= 0 && peek_at(ch, n) == ' ') {
 		ch->len = n;
-		chunk_rtrim(ch);
+		cmark_chunk_rtrim(ch);
 	}
 }
 
@@ -533,14 +529,14 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 	bool blank = false;
 	int first_nonspace;
 	int indent;
-	chunk input;
+	cmark_chunk input;
 
 	utf8proc_detab(parser->curline, buffer, bytes);
 
 	// Add a newline to the end if not present:
 	// TODO this breaks abstraction:
 	if (parser->curline->ptr[parser->curline->size - 1] != '\n') {
-		strbuf_putc(parser->curline, '\n');
+		cmark_strbuf_putc(parser->curline, '\n');
 	}
 	input.data = parser->curline->ptr;
 	input.len = parser->curline->size;
@@ -574,12 +570,12 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 				all_matched = false;
 			}
 
-		} else if (container->type == NODE_LIST_ITEM) {
+		} else if (container->type == NODE_ITEM) {
 
 			if (indent >= container->as.list.marker_offset +
-					container->as.list.padding) {
+			    container->as.list.padding) {
 				offset += container->as.list.marker_offset +
-					container->as.list.padding;
+				          container->as.list.padding;
 			} else if (blank) {
 				offset = first_nonspace;
 			} else {
@@ -596,34 +592,45 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 				} else {
 					all_matched = false;
 				}
-			} else {
-				// skip optional spaces of fence offset
-				i = container->as.code.fence_offset;
-				while (i > 0 && peek_at(&input, offset) == ' ') {
-					offset++;
-					i--;
+			} else { // fenced
+				matched = 0;
+				if (indent <= 3 &&
+					(peek_at(&input, first_nonspace) ==
+					 container->as.code.fence_char)) {
+					matched = scan_close_code_fence(&input,
+							first_nonspace);
+				}
+				if (matched >= container->as.code.fence_length) {
+					// closing fence - and since we're at
+					// the end of a line, we can return:
+					all_matched = false;
+					offset += matched;
+					finalize(parser, container);
+					goto finished;
+				} else {
+					// skip opt. spaces of fence offset
+					i = container->as.code.fence_offset;
+					while (i > 0 &&
+					    peek_at(&input, offset) == ' ') {
+						offset++;
+						i--;
+					}
 				}
 			}
-
 		} else if (container->type == NODE_HEADER) {
 
 			// a header can never contain more than one line
 			all_matched = false;
-			if (blank) {
-				container->last_line_blank = true;
-			}
 
 		} else if (container->type == NODE_HTML) {
 
 			if (blank) {
-				container->last_line_blank = true;
 				all_matched = false;
 			}
 
 		} else if (container->type == NODE_PARAGRAPH) {
 
 			if (blank) {
-				container->last_line_blank = true;
 				all_matched = false;
 			}
 
@@ -639,12 +646,12 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 
 	// check to see if we've hit 2nd blank line, break out of list:
 	if (blank && container->last_line_blank) {
-		break_out_of_lists(parser, &container, parser->line_number);
+		break_out_of_lists(parser, &container);
 	}
 
 	// unless last matched container is code cmark_node, try new container starts:
 	while (container->type != NODE_CODE_BLOCK &&
-			container->type != NODE_HTML) {
+	       container->type != NODE_HTML) {
 
 		first_nonspace = offset;
 		while (peek_at(&input, first_nonspace) == ' ')
@@ -656,12 +663,12 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 		if (indent >= CODE_INDENT) {
 			if (cur->type != NODE_PARAGRAPH && !blank) {
 				offset += CODE_INDENT;
-				container = add_child(parser, container, NODE_CODE_BLOCK, parser->line_number, offset + 1);
+				container = add_child(parser, container, NODE_CODE_BLOCK, offset + 1);
 				container->as.code.fenced = false;
 				container->as.code.fence_char = 0;
 				container->as.code.fence_length = 0;
 				container->as.code.fence_offset = 0;
-				strbuf_init(&container->as.code.info, 0);
+				container->as.code.info = cmark_chunk_literal("");
 			} else { // indent > 4 in lazy line
 				break;
 			}
@@ -672,14 +679,14 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 			// optional following character
 			if (peek_at(&input, offset) == ' ')
 				offset++;
-			container = add_child(parser, container, NODE_BLOCK_QUOTE, parser->line_number, offset + 1);
+			container = add_child(parser, container, NODE_BLOCK_QUOTE, offset + 1);
 
 		} else if ((matched = scan_atx_header_start(&input, first_nonspace))) {
 
 			offset = first_nonspace + matched;
-			container = add_child(parser, container, NODE_HEADER, parser->line_number, offset + 1);
+			container = add_child(parser, container, NODE_HEADER, offset + 1);
 
-			int hashpos = chunk_strchr(&input, '#', first_nonspace);
+			int hashpos = cmark_chunk_strchr(&input, '#', first_nonspace);
 			int level = 0;
 
 			while (peek_at(&input, hashpos) == '#') {
@@ -691,24 +698,24 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 
 		} else if ((matched = scan_open_code_fence(&input, first_nonspace))) {
 
-			container = add_child(parser, container, NODE_CODE_BLOCK, parser->line_number, first_nonspace + 1);
+			container = add_child(parser, container, NODE_CODE_BLOCK, first_nonspace + 1);
 			container->as.code.fenced = true;
 			container->as.code.fence_char = peek_at(&input, first_nonspace);
 			container->as.code.fence_length = matched;
 			container->as.code.fence_offset = first_nonspace - offset;
-			strbuf_init(&container->as.code.info, 0);
+			container->as.code.info = cmark_chunk_literal("");
 			offset = first_nonspace + matched;
 
 		} else if ((matched = scan_html_block_tag(&input, first_nonspace))) {
 
-			container = add_child(parser, container, NODE_HTML, parser->line_number, first_nonspace + 1);
+			container = add_child(parser, container, NODE_HTML, first_nonspace + 1);
 			// note, we don't adjust offset because the tag is part of the text
 
 		} else if (container->type == NODE_PARAGRAPH &&
-				(lev = scan_setext_header_line(&input, first_nonspace)) &&
-				// check that there is only one line in the paragraph:
-				strbuf_strrchr(&container->string_content, '\n',
-					strbuf_len(&container->string_content) - 2) < 0) {
+		           (lev = scan_setext_header_line(&input, first_nonspace)) &&
+		           // check that there is only one line in the paragraph:
+		           cmark_strbuf_strrchr(&container->string_content, '\n',
+		                                cmark_strbuf_len(&container->string_content) - 2) < 0) {
 
 			container->type = NODE_HEADER;
 			container->as.header.level = lev;
@@ -716,12 +723,11 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 			offset = input.len - 1;
 
 		} else if (!(container->type == NODE_PARAGRAPH && !all_matched) &&
-				(matched = scan_hrule(&input, first_nonspace))) {
+		           (matched = scan_hrule(&input, first_nonspace))) {
 
 			// it's only now that we know the line is not part of a setext header:
-			container = add_child(parser, container, NODE_HRULE, parser->line_number, first_nonspace + 1);
-			finalize(parser, container, parser->line_number);
-			container = container->parent;
+			container = add_child(parser, container, NODE_HRULE, first_nonspace + 1);
+			container = finalize(parser, container);
 			offset = input.len - 1;
 
 		} else if ((matched = parse_list_marker(&input, first_nonspace, &data))) {
@@ -749,16 +755,16 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 			data->marker_offset = indent;
 
 			if (container->type != NODE_LIST ||
-					!lists_match(&container->as.list, data)) {
-				container = add_child(parser, container, NODE_LIST, parser->line_number,
-						first_nonspace + 1);
+			    !lists_match(&container->as.list, data)) {
+				container = add_child(parser, container, NODE_LIST,
+				                      first_nonspace + 1);
 
 				memcpy(&container->as.list, data, sizeof(*data));
 			}
 
 			// add the list item
-			container = add_child(parser, container, NODE_LIST_ITEM, parser->line_number,
-					first_nonspace + 1);
+			container = add_child(parser, container, NODE_ITEM,
+			                      first_nonspace + 1);
 			/* TODO: static */
 			memcpy(&container->as.list, data, sizeof(*data));
 			free(data);
@@ -782,18 +788,22 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 	indent = first_nonspace - offset;
 	blank = peek_at(&input, first_nonspace) == '\n';
 
-	// cmark_node quote lines are never blank as they start with >
+	if (blank && container->last_child) {
+		container->last_child->last_line_blank = true;
+	}
+
+	// block quote lines are never blank as they start with >
 	// and we don't count blanks in fenced code for purposes of tight/loose
 	// lists or breaking out of lists.  we also don't set last_line_blank
 	// on an empty list item.
 	container->last_line_blank = (blank &&
-			container->type != NODE_BLOCK_QUOTE &&
-			container->type != NODE_HEADER &&
-			!(container->type == NODE_CODE_BLOCK &&
-				container->as.code.fenced) &&
-			!(container->type == NODE_LIST_ITEM &&
-				container->first_child == NULL &&
-				container->start_line == parser->line_number));
+	                              container->type != NODE_BLOCK_QUOTE &&
+	                              container->type != NODE_HEADER &&
+	                              !(container->type == NODE_CODE_BLOCK &&
+	                                container->as.code.fenced) &&
+	                              !(container->type == NODE_ITEM &&
+	                                container->first_child == NULL &&
+	                                container->start_line == parser->line_number));
 
 	cmark_node *cont = container;
 	while (cont->parent) {
@@ -802,10 +812,10 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 	}
 
 	if (cur != last_matched_container &&
-			container == last_matched_container &&
-			!blank &&
-			cur->type == NODE_PARAGRAPH &&
-			strbuf_len(&cur->string_content) > 0) {
+	    container == last_matched_container &&
+	    !blank &&
+	    cur->type == NODE_PARAGRAPH &&
+	    cmark_strbuf_len(&cur->string_content) > 0) {
 
 		add_line(cur, &input, offset);
 
@@ -813,36 +823,12 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 
 		// finalize any blocks that were not matched and set cur to container:
 		while (cur != last_matched_container) {
-			finalize(parser, cur, parser->line_number);
-			cur = cur->parent;
+			cur = finalize(parser, cur);
 			assert(cur != NULL);
 		}
 
-		if (container->type == NODE_CODE_BLOCK &&
-		    !container->as.code.fenced) {
-
-			add_line(container, &input, offset);
-
-		} else if (container->type == NODE_CODE_BLOCK &&
-			   container->as.code.fenced) {
-			matched = 0;
-
-			if (indent <= 3 &&
-					peek_at(&input, first_nonspace) == container->as.code.fence_char) {
-				int fence_len = scan_close_code_fence(&input, first_nonspace);
-				if (fence_len > container->as.code.fence_length)
-					matched = 1;
-			}
-
-			if (matched) {
-				// if closing fence, don't add line to container; instead, close it:
-				finalize(parser, container, parser->line_number);
-				container = container->parent; // back up to parent
-			} else {
-				add_line(container, &input, offset);
-			}
-
-		} else if (container->type == NODE_HTML) {
+		if (container->type == NODE_CODE_BLOCK ||
+		    container->type == NODE_HTML) {
 
 			add_line(container, &input, offset);
 
@@ -850,31 +836,29 @@ S_process_line(cmark_parser *parser, const unsigned char *buffer, size_t bytes)
 
 			// ??? do nothing
 
-		} else if (container->type == NODE_HEADER) {
-
-			chop_trailing_hashtags(&input);
-			add_line(container, &input, first_nonspace);
-			finalize(parser, container, parser->line_number);
-			container = container->parent;
-
 		} else if (accepts_lines(container->type)) {
 
+			if (container->type == NODE_HEADER &&
+			    container->as.header.setext == false) {
+				chop_trailing_hashtags(&input);
+			}
 			add_line(container, &input, first_nonspace);
 
-		} else if (container->type != NODE_HRULE &&
-			   container->type != NODE_HEADER) {
-
+		} else {
 			// create paragraph container for line
-			container = add_child(parser, container, NODE_PARAGRAPH, parser->line_number, first_nonspace + 1);
+			container = add_child(parser, container, NODE_PARAGRAPH, first_nonspace + 1);
 			add_line(container, &input, first_nonspace);
 
-		} else {
-			assert(false);
 		}
 
 		parser->current = container;
 	}
-	strbuf_clear(parser->curline);
+finished:
+	parser->last_line_length = parser->curline->size -
+	                           (parser->curline->ptr[parser->curline->size - 1] == '\n' ?
+	                            1 : 0);
+	;
+	cmark_strbuf_clear(parser->curline);
 
 }
 
@@ -882,12 +866,12 @@ cmark_node *cmark_parser_finish(cmark_parser *parser)
 {
 	if (parser->linebuf->size) {
 		S_process_line(parser, parser->linebuf->ptr,
-			     parser->linebuf->size);
-		strbuf_clear(parser->linebuf);
+		               parser->linebuf->size);
+		cmark_strbuf_clear(parser->linebuf);
 	}
 
 	finalize_document(parser);
-	strbuf_free(parser->curline);
+	cmark_strbuf_free(parser->curline);
 #if CMARK_DEBUG_NODES
 	if (cmark_node_check(parser->root, stderr)) {
 		abort();

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/buffer.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/buffer.c b/compiler/modules/CommonMark/src/buffer.c
index 45b6984..0df6561 100644
--- a/compiler/modules/CommonMark/src/buffer.c
+++ b/compiler/modules/CommonMark/src/buffer.c
@@ -1,28 +1,29 @@
 #include <stdarg.h>
-#include <ctype.h>
 #include <string.h>
 #include <assert.h>
 #include <string.h>
 #include <stdio.h>
 #include <stdlib.h>
 
+#include "config.h"
+#include "cmark_ctype.h"
 #include "buffer.h"
 
-/* Used as default value for strbuf->ptr so that people can always
- * assume ptr is non-NULL and zero terminated even for new strbufs.
+/* Used as default value for cmark_strbuf->ptr so that people can always
+ * assume ptr is non-NULL and zero terminated even for new cmark_strbufs.
  */
 unsigned char cmark_strbuf__initbuf[1];
 unsigned char cmark_strbuf__oom[1];
 
 #define ENSURE_SIZE(b, d)					\
-	if ((d) > buf->asize && strbuf_grow(b, (d)) < 0)	\
+	if ((d) > buf->asize && cmark_strbuf_grow(b, (d)) < 0)	\
 		return -1;
 
 #ifndef MIN
 #define MIN(x,y)  ((x<y) ? x : y)
 #endif
 
-void cmark_strbuf_init(strbuf *buf, int initial_size)
+void cmark_strbuf_init(cmark_strbuf *buf, int initial_size)
 {
 	buf->asize = 0;
 	buf->size = 0;
@@ -32,7 +33,7 @@ void cmark_strbuf_init(strbuf *buf, int initial_size)
 		cmark_strbuf_grow(buf, initial_size);
 }
 
-int cmark_strbuf_try_grow(strbuf *buf, int target_size, bool mark_oom)
+int cmark_strbuf_try_grow(cmark_strbuf *buf, int target_size, bool mark_oom)
 {
 	unsigned char *new_ptr;
 	int new_size;
@@ -93,7 +94,7 @@ size_t cmark_strbuf_len(const cmark_strbuf *buf)
 	return buf->size;
 }
 
-void cmark_strbuf_free(strbuf *buf)
+void cmark_strbuf_free(cmark_strbuf *buf)
 {
 	if (!buf) return;
 
@@ -103,7 +104,7 @@ void cmark_strbuf_free(strbuf *buf)
 	cmark_strbuf_init(buf, 0);
 }
 
-void cmark_strbuf_clear(strbuf *buf)
+void cmark_strbuf_clear(cmark_strbuf *buf)
 {
 	buf->size = 0;
 
@@ -111,7 +112,7 @@ void cmark_strbuf_clear(strbuf *buf)
 		buf->ptr[0] = '\0';
 }
 
-int cmark_strbuf_set(strbuf *buf, const unsigned char *data, int len)
+int cmark_strbuf_set(cmark_strbuf *buf, const unsigned char *data, int len)
 {
 	if (len <= 0 || data == NULL) {
 		cmark_strbuf_clear(buf);
@@ -126,14 +127,14 @@ int cmark_strbuf_set(strbuf *buf, const unsigned char *data, int len)
 	return 0;
 }
 
-int cmark_strbuf_sets(strbuf *buf, const char *string)
+int cmark_strbuf_sets(cmark_strbuf *buf, const char *string)
 {
 	return cmark_strbuf_set(buf,
-			  (const unsigned char *)string,
-			  string ? strlen(string) : 0);
+	                        (const unsigned char *)string,
+	                        string ? strlen(string) : 0);
 }
 
-int cmark_strbuf_putc(strbuf *buf, int c)
+int cmark_strbuf_putc(cmark_strbuf *buf, int c)
 {
 	ENSURE_SIZE(buf, buf->size + 2);
 	buf->ptr[buf->size++] = c;
@@ -141,7 +142,7 @@ int cmark_strbuf_putc(strbuf *buf, int c)
 	return 0;
 }
 
-int cmark_strbuf_put(strbuf *buf, const unsigned char *data, int len)
+int cmark_strbuf_put(cmark_strbuf *buf, const unsigned char *data, int len)
 {
 	if (len <= 0)
 		return 0;
@@ -153,12 +154,12 @@ int cmark_strbuf_put(strbuf *buf, const unsigned char *data, int len)
 	return 0;
 }
 
-int cmark_strbuf_puts(strbuf *buf, const char *string)
+int cmark_strbuf_puts(cmark_strbuf *buf, const char *string)
 {
 	return cmark_strbuf_put(buf, (const unsigned char *)string, strlen(string));
 }
 
-int cmark_strbuf_vprintf(strbuf *buf, const char *format, va_list ap)
+int cmark_strbuf_vprintf(cmark_strbuf *buf, const char *format, va_list ap)
 {
 	const int expected_size = buf->size + (strlen(format) * 2);
 	int len;
@@ -166,11 +167,16 @@ int cmark_strbuf_vprintf(strbuf *buf, const char *format, va_list ap)
 	ENSURE_SIZE(buf, expected_size);
 
 	while (1) {
+		va_list args;
+		va_copy(args, ap);
+
 		len = vsnprintf(
-			(char *)buf->ptr + buf->size,
-			buf->asize - buf->size,
-			format, ap
-			);
+		          (char *)buf->ptr + buf->size,
+		          buf->asize - buf->size,
+		          format, args
+		      );
+
+		va_end(args);
 
 		if (len < 0) {
 			free(buf->ptr);
@@ -189,7 +195,7 @@ int cmark_strbuf_vprintf(strbuf *buf, const char *format, va_list ap)
 	return 0;
 }
 
-int cmark_strbuf_printf(strbuf *buf, const char *format, ...)
+int cmark_strbuf_printf(cmark_strbuf *buf, const char *format, ...)
 {
 	int r;
 	va_list ap;
@@ -201,7 +207,7 @@ int cmark_strbuf_printf(strbuf *buf, const char *format, ...)
 	return r;
 }
 
-void cmark_strbuf_copy_cstr(char *data, int datasize, const strbuf *buf)
+void cmark_strbuf_copy_cstr(char *data, int datasize, const cmark_strbuf *buf)
 {
 	int copylen;
 
@@ -219,14 +225,14 @@ void cmark_strbuf_copy_cstr(char *data, int datasize, const strbuf *buf)
 	data[copylen] = '\0';
 }
 
-void cmark_strbuf_swap(strbuf *buf_a, strbuf *buf_b)
+void cmark_strbuf_swap(cmark_strbuf *buf_a, cmark_strbuf *buf_b)
 {
-	strbuf t = *buf_a;
+	cmark_strbuf t = *buf_a;
 	*buf_a = *buf_b;
 	*buf_b = t;
 }
 
-unsigned char *cmark_strbuf_detach(strbuf *buf)
+unsigned char *cmark_strbuf_detach(cmark_strbuf *buf)
 {
 	unsigned char *data = buf->ptr;
 
@@ -239,7 +245,7 @@ unsigned char *cmark_strbuf_detach(strbuf *buf)
 	return data;
 }
 
-void cmark_strbuf_attach(strbuf *buf, unsigned char *ptr, int asize)
+void cmark_strbuf_attach(cmark_strbuf *buf, unsigned char *ptr, int asize)
 {
 	cmark_strbuf_free(buf);
 
@@ -255,14 +261,14 @@ void cmark_strbuf_attach(strbuf *buf, unsigned char *ptr, int asize)
 	}
 }
 
-int cmark_strbuf_cmp(const strbuf *a, const strbuf *b)
+int cmark_strbuf_cmp(const cmark_strbuf *a, const cmark_strbuf *b)
 {
 	int result = memcmp(a->ptr, b->ptr, MIN(a->size, b->size));
 	return (result != 0) ? result :
-		(a->size < b->size) ? -1 : (a->size > b->size) ? 1 : 0;
+	       (a->size < b->size) ? -1 : (a->size > b->size) ? 1 : 0;
 }
 
-int cmark_strbuf_strchr(const strbuf *buf, int c, int pos)
+int cmark_strbuf_strchr(const cmark_strbuf *buf, int c, int pos)
 {
 	const unsigned char *p = (unsigned char *)memchr(buf->ptr + pos, c, buf->size - pos);
 	if (!p)
@@ -271,7 +277,7 @@ int cmark_strbuf_strchr(const strbuf *buf, int c, int pos)
 	return (int)(p - (const unsigned char *)buf->ptr);
 }
 
-int cmark_strbuf_strrchr(const strbuf *buf, int c, int pos)
+int cmark_strbuf_strrchr(const cmark_strbuf *buf, int c, int pos)
 {
 	int i;
 
@@ -283,7 +289,7 @@ int cmark_strbuf_strrchr(const strbuf *buf, int c, int pos)
 	return -1;
 }
 
-void cmark_strbuf_truncate(strbuf *buf, int len)
+void cmark_strbuf_truncate(cmark_strbuf *buf, int len)
 {
 	if (len < buf->size) {
 		buf->size = len;
@@ -291,7 +297,7 @@ void cmark_strbuf_truncate(strbuf *buf, int len)
 	}
 }
 
-void cmark_strbuf_drop(strbuf *buf, int n)
+void cmark_strbuf_drop(cmark_strbuf *buf, int n)
 {
 	if (n > 0) {
 		buf->size = buf->size - n;
@@ -302,13 +308,13 @@ void cmark_strbuf_drop(strbuf *buf, int n)
 	}
 }
 
-void cmark_strbuf_rtrim(strbuf *buf)
+void cmark_strbuf_rtrim(cmark_strbuf *buf)
 {
 	if (!buf->size)
 		return;
 
 	while (buf->size > 0) {
-		if (!isspace(buf->ptr[buf->size - 1]))
+		if (!cmark_isspace(buf->ptr[buf->size - 1]))
 			break;
 
 		buf->size--;
@@ -317,14 +323,14 @@ void cmark_strbuf_rtrim(strbuf *buf)
 	buf->ptr[buf->size] = '\0';
 }
 
-void cmark_strbuf_trim(strbuf *buf)
+void cmark_strbuf_trim(cmark_strbuf *buf)
 {
 	int i = 0;
 
 	if (!buf->size)
 		return;
 
-	while (i < buf->size && isspace(buf->ptr[i]))
+	while (i < buf->size && cmark_isspace(buf->ptr[i]))
 		i++;
 
 	cmark_strbuf_drop(buf, i);
@@ -334,7 +340,7 @@ void cmark_strbuf_trim(strbuf *buf)
 
 // Destructively modify string, collapsing consecutive
 // space and newline characters into a single space.
-void cmark_strbuf_normalize_whitespace(strbuf *s)
+void cmark_strbuf_normalize_whitespace(cmark_strbuf *s)
 {
 	bool last_char_was_space = false;
 	int r, w;
@@ -360,12 +366,12 @@ void cmark_strbuf_normalize_whitespace(strbuf *s)
 }
 
 // Destructively unescape a string: remove backslashes before punctuation chars.
-extern void cmark_strbuf_unescape(strbuf *buf)
+extern void cmark_strbuf_unescape(cmark_strbuf *buf)
 {
 	int r, w;
 
 	for (r = 0, w = 0; r < buf->size; ++r) {
-		if (buf->ptr[r] == '\\' && ispunct(buf->ptr[r + 1]))
+		if (buf->ptr[r] == '\\' && cmark_ispunct(buf->ptr[r + 1]))
 			continue;
 
 		buf->ptr[w++] = buf->ptr[r];

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/buffer.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/buffer.h b/compiler/modules/CommonMark/src/buffer.h
index 7401b22..fb9f910 100644
--- a/compiler/modules/CommonMark/src/buffer.h
+++ b/compiler/modules/CommonMark/src/buffer.h
@@ -4,7 +4,6 @@
 #include <stddef.h>
 #include <stdarg.h>
 #include "config.h"
-#include "cmark_export.h"
 
 #ifdef __cplusplus
 extern "C" {
@@ -15,21 +14,18 @@ typedef struct {
 	int asize, size;
 } cmark_strbuf;
 
-CMARK_EXPORT
 extern unsigned char cmark_strbuf__initbuf[];
 
-CMARK_EXPORT
 extern unsigned char cmark_strbuf__oom[];
 
-#define CMARK_GH_BUF_INIT { cmark_strbuf__initbuf, 0, 0 }
+#define GH_BUF_INIT { cmark_strbuf__initbuf, 0, 0 }
 
 /**
- * Initialize a strbuf structure.
+ * Initialize a cmark_strbuf structure.
  *
  * For the cases where GH_BUF_INIT cannot be used to do static
  * initialization.
  */
-CMARK_EXPORT
 void cmark_strbuf_init(cmark_strbuf *buf, int initial_size);
 
 /**
@@ -40,7 +36,6 @@ void cmark_strbuf_init(cmark_strbuf *buf, int initial_size);
  * existing buffer content will be preserved, but calling code must handle
  * that buffer was not expanded.
  */
-CMARK_EXPORT
 int cmark_strbuf_try_grow(cmark_strbuf *buf, int target_size, bool mark_oom);
 
 /**
@@ -51,39 +46,30 @@ int cmark_strbuf_try_grow(cmark_strbuf *buf, int target_size, bool mark_oom);
  *
  * @return 0 on success or -1 on failure
  */
-CMARK_EXPORT
 int cmark_strbuf_grow(cmark_strbuf *buf, int target_size);
 
-CMARK_EXPORT
 void cmark_strbuf_free(cmark_strbuf *buf);
-CMARK_EXPORT
 void cmark_strbuf_swap(cmark_strbuf *buf_a, cmark_strbuf *buf_b);
 
 /**
- * Test if there have been any reallocation failures with this strbuf.
+ * Test if there have been any reallocation failures with this cmark_strbuf.
  *
- * Any function that writes to a strbuf can fail due to memory allocation
- * issues.  If one fails, the strbuf will be marked with an OOM error and
- * further calls to modify the buffer will fail.  Check strbuf_oom() at the
+ * Any function that writes to a cmark_strbuf can fail due to memory allocation
+ * issues.  If one fails, the cmark_strbuf will be marked with an OOM error and
+ * further calls to modify the buffer will fail.  Check cmark_strbuf_oom() at the
  * end of your sequence and it will be true if you ran out of memory at any
  * point with that buffer.
  *
  * @return false if no error, true if allocation error
  */
-CMARK_EXPORT
 bool cmark_strbuf_oom(const cmark_strbuf *buf);
 
-CMARK_EXPORT
 size_t cmark_strbuf_len(const cmark_strbuf *buf);
 
-CMARK_EXPORT
 int cmark_strbuf_cmp(const cmark_strbuf *a, const cmark_strbuf *b);
 
-CMARK_EXPORT
 void cmark_strbuf_attach(cmark_strbuf *buf, unsigned char *ptr, int asize);
-CMARK_EXPORT
 unsigned char *cmark_strbuf_detach(cmark_strbuf *buf);
-CMARK_EXPORT
 void cmark_strbuf_copy_cstr(char *data, int datasize, const cmark_strbuf *buf);
 
 static inline const char *cmark_strbuf_cstr(const cmark_strbuf *buf)
@@ -96,80 +82,30 @@ static inline const char *cmark_strbuf_cstr(const cmark_strbuf *buf)
 /*
  * Functions below that return int value error codes will return 0 on
  * success or -1 on failure (which generally means an allocation failed).
- * Using a strbuf where the allocation has failed with result in -1 from
+ * Using a cmark_strbuf where the allocation has failed with result in -1 from
  * all further calls using that buffer.  As a result, you can ignore the
  * return code of these functions and call them in a series then just call
- * strbuf_oom at the end.
+ * cmark_strbuf_oom at the end.
  */
-CMARK_EXPORT
 int cmark_strbuf_set(cmark_strbuf *buf, const unsigned char *data, int len);
-CMARK_EXPORT
 int cmark_strbuf_sets(cmark_strbuf *buf, const char *string);
-CMARK_EXPORT
 int cmark_strbuf_putc(cmark_strbuf *buf, int c);
-CMARK_EXPORT
 int cmark_strbuf_put(cmark_strbuf *buf, const unsigned char *data, int len);
-CMARK_EXPORT
 int cmark_strbuf_puts(cmark_strbuf *buf, const char *string);
-CMARK_EXPORT
 int cmark_strbuf_printf(cmark_strbuf *buf, const char *format, ...)
-	CMARK_ATTRIBUTE((format (printf, 2, 3)));
-CMARK_EXPORT
+CMARK_ATTRIBUTE((format (printf, 2, 3)));
 int cmark_strbuf_vprintf(cmark_strbuf *buf, const char *format, va_list ap);
-CMARK_EXPORT
 void cmark_strbuf_clear(cmark_strbuf *buf);
 
-CMARK_EXPORT
 int cmark_strbuf_strchr(const cmark_strbuf *buf, int c, int pos);
-CMARK_EXPORT
 int cmark_strbuf_strrchr(const cmark_strbuf *buf, int c, int pos);
-CMARK_EXPORT
 void cmark_strbuf_drop(cmark_strbuf *buf, int n);
-CMARK_EXPORT
 void cmark_strbuf_truncate(cmark_strbuf *buf, int len);
-CMARK_EXPORT
 void cmark_strbuf_rtrim(cmark_strbuf *buf);
-CMARK_EXPORT
 void cmark_strbuf_trim(cmark_strbuf *buf);
-CMARK_EXPORT
 void cmark_strbuf_normalize_whitespace(cmark_strbuf *s);
-CMARK_EXPORT
 void cmark_strbuf_unescape(cmark_strbuf *s);
 
-// Convenience macros
-#define strbuf                        cmark_strbuf
-#define strbuf__initbuf               cmark_strbuf__initbuf
-#define strbuf__oom                   cmark_strbuf__oom
-#define GH_BUF_INIT                   CMARK_GH_BUF_INIT
-#define strbuf_init                   cmark_strbuf_init
-#define strbuf_try_grow               cmark_strbuf_try_grow
-#define strbuf_grow                   cmark_strbuf_grow
-#define strbuf_free                   cmark_strbuf_free
-#define strbuf_swap                   cmark_strbuf_swap
-#define strbuf_oom                    cmark_strbuf_oom
-#define strbuf_len                    cmark_strbuf_len
-#define strbuf_cmp                    cmark_strbuf_cmp
-#define strbuf_attach                 cmark_strbuf_attach
-#define strbuf_detach                 cmark_strbuf_detach
-#define strbuf_copy_cstr              cmark_strbuf_copy_cstr
-#define strbuf_at                     cmark_strbuf_at
-#define strbuf_set                    cmark_strbuf_set
-#define strbuf_sets                   cmark_strbuf_sets
-#define strbuf_putc                   cmark_strbuf_putc
-#define strbuf_put                    cmark_strbuf_put
-#define strbuf_puts                   cmark_strbuf_puts
-#define strbuf_printf                 cmark_strbuf_printf
-#define strbuf_vprintf                cmark_strbuf_vprintf
-#define strbuf_clear                  cmark_strbuf_clear
-#define strbuf_strchr                 cmark_strbuf_strchr
-#define strbuf_strrchr                cmark_strbuf_strrchr
-#define strbuf_drop                   cmark_strbuf_drop
-#define strbuf_truncate               cmark_strbuf_truncate
-#define strbuf_rtrim                  cmark_strbuf_rtrim
-#define strbuf_trim                   cmark_strbuf_trim
-#define strbuf_normalize_whitespace   cmark_strbuf_normalize_whitespace
-#define strbuf_unescape               cmark_strbuf_unescape
-
 #ifdef __cplusplus
 }
 #endif

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/chunk.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/chunk.h b/compiler/modules/CommonMark/src/chunk.h
index 22594b1..54c4b16 100644
--- a/compiler/modules/CommonMark/src/chunk.h
+++ b/compiler/modules/CommonMark/src/chunk.h
@@ -2,9 +2,9 @@
 #define CMARK_CHUNK_H
 
 #include <string.h>
-#include <ctype.h>
 #include <stdlib.h>
 #include <assert.h>
+#include "cmark_ctype.h"
 #include "buffer.h"
 
 typedef struct {
@@ -27,7 +27,7 @@ static inline void cmark_chunk_ltrim(cmark_chunk *c)
 {
 	assert(!c->alloc);
 
-	while (c->len && isspace(c->data[0])) {
+	while (c->len && cmark_isspace(c->data[0])) {
 		c->data++;
 		c->len--;
 	}
@@ -36,7 +36,7 @@ static inline void cmark_chunk_ltrim(cmark_chunk *c)
 static inline void cmark_chunk_rtrim(cmark_chunk *c)
 {
 	while (c->len > 0) {
-		if (!isspace(c->data[c->len - 1]))
+		if (!cmark_isspace(c->data[c->len - 1]))
 			break;
 
 		c->len--;
@@ -107,16 +107,4 @@ static inline cmark_chunk cmark_chunk_buf_detach(cmark_strbuf *buf)
 	return c;
 }
 
-// Convenience macros
-#define chunk             cmark_chunk
-#define chunk_free        cmark_chunk_free
-#define chunk_ltrim       cmark_chunk_ltrim
-#define chunk_rtrim       cmark_chunk_rtrim
-#define chunk_trim        cmark_chunk_trim
-#define chunk_strchr      cmark_chunk_strchr
-#define chunk_to_cstr     cmark_chunk_to_cstr
-#define chunk_literal     cmark_chunk_literal
-#define chunk_dup         cmark_chunk_dup
-#define chunk_buf_detach  cmark_chunk_buf_detach
-
 #endif

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/cmark.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/cmark.c b/compiler/modules/CommonMark/src/cmark.c
index 16817b9..1d7a500 100644
--- a/compiler/modules/CommonMark/src/cmark.c
+++ b/compiler/modules/CommonMark/src/cmark.c
@@ -13,7 +13,7 @@ char *cmark_markdown_to_html(const char *text, int len)
 
 	doc = cmark_parse_document(text, len);
 
-	result = cmark_render_html(doc);
+	result = cmark_render_html(doc, CMARK_OPT_DEFAULT);
 	cmark_node_free(doc);
 
 	return result;

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/cmark.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/cmark.h b/compiler/modules/CommonMark/src/cmark.h
index f96cea9..04ca6d7 100644
--- a/compiler/modules/CommonMark/src/cmark.h
+++ b/compiler/modules/CommonMark/src/cmark.h
@@ -8,13 +8,14 @@
 extern "C" {
 #endif
 
-/** .SH NAME
+/** # NAME
  *
- * .B cmark
- * \- CommonMark parsing, manipulating, and rendering
+ * **cmark** - CommonMark parsing, manipulating, and rendering
  */
 
-/** .SH SIMPLE INTERFACE
+/** # DESCRIPTION
+ *
+ * ## Simple Interface
  */
 
 /** Current version of library.
@@ -28,11 +29,9 @@ extern "C" {
 CMARK_EXPORT
 char *cmark_markdown_to_html(const char *text, int len);
 
-/** .SH NODE STRUCTURE
+/** ## Node Structure
  */
 
-/**
- */
 typedef enum {
 	/* Error status */
 	CMARK_NODE_NONE,
@@ -41,22 +40,21 @@ typedef enum {
 	CMARK_NODE_DOCUMENT,
 	CMARK_NODE_BLOCK_QUOTE,
 	CMARK_NODE_LIST,
-	CMARK_NODE_LIST_ITEM,
+	CMARK_NODE_ITEM,
 	CMARK_NODE_CODE_BLOCK,
 	CMARK_NODE_HTML,
 	CMARK_NODE_PARAGRAPH,
 	CMARK_NODE_HEADER,
 	CMARK_NODE_HRULE,
-	CMARK_NODE_REFERENCE_DEF,
 
 	CMARK_NODE_FIRST_BLOCK = CMARK_NODE_DOCUMENT,
-	CMARK_NODE_LAST_BLOCK  = CMARK_NODE_REFERENCE_DEF,
+	CMARK_NODE_LAST_BLOCK  = CMARK_NODE_HRULE,
 
 	/* Inline */
 	CMARK_NODE_TEXT,
 	CMARK_NODE_SOFTBREAK,
 	CMARK_NODE_LINEBREAK,
-	CMARK_NODE_INLINE_CODE,
+	CMARK_NODE_CODE,
 	CMARK_NODE_INLINE_HTML,
 	CMARK_NODE_EMPH,
 	CMARK_NODE_STRONG,
@@ -68,275 +66,451 @@ typedef enum {
 } cmark_node_type;
 
 
-/**
- */
 typedef enum {
 	CMARK_NO_LIST,
 	CMARK_BULLET_LIST,
 	CMARK_ORDERED_LIST
 }  cmark_list_type;
 
-/**
- */
 typedef enum {
+	CMARK_NO_DELIM,
 	CMARK_PERIOD_DELIM,
 	CMARK_PAREN_DELIM
 } cmark_delim_type;
 
 typedef struct cmark_node cmark_node;
 typedef struct cmark_parser cmark_parser;
+typedef struct cmark_iter cmark_iter;
+
+typedef enum {
+	CMARK_EVENT_NONE,
+	CMARK_EVENT_DONE,
+	CMARK_EVENT_ENTER,
+	CMARK_EVENT_EXIT
+} cmark_event_type;
 
 /**
- * .SH CREATING AND DESTROYING NODES
+ * ## Creating and Destroying Nodes
  */
 
-/**
+/** Creates a new node of type 'type'.  Note that the node may have
+ * other required properties, which it is the caller's responsibility
+ * to assign.
  */
 CMARK_EXPORT cmark_node*
 cmark_node_new(cmark_node_type type);
 
-/**
+/** Frees the memory allocated for a node.
  */
 CMARK_EXPORT void
 cmark_node_free(cmark_node *node);
 
 /**
- * .SH TREE TRAVERSAL
+ * ## Tree Traversal
+ */
+
+/** Returns the next node in the sequence after 'node', or NULL if
+ * there is none.
  */
 CMARK_EXPORT cmark_node*
 cmark_node_next(cmark_node *node);
 
-/**
+/** Returns the previous node in the sequence after 'node', or NULL if
+ * there is none.
  */
 CMARK_EXPORT cmark_node*
 cmark_node_previous(cmark_node *node);
 
-/**
+/** Returns the parent of 'node', or NULL if there is none.
  */
 CMARK_EXPORT cmark_node*
 cmark_node_parent(cmark_node *node);
 
-/**
+/** Returns the first child of 'node', or NULL if 'node' has no children.
  */
 CMARK_EXPORT cmark_node*
 cmark_node_first_child(cmark_node *node);
 
-/**
+/** Returns the last child of 'node', or NULL if 'node' has no children.
  */
 CMARK_EXPORT cmark_node*
 cmark_node_last_child(cmark_node *node);
 
 /**
- * .SH ACCESSORS
+ * ## Iterator
+ *
+ * An iterator will walk through a tree of nodes, starting from a root
+ * node, returning one node at a time, together with information about
+ * whether the node is being entered or exited.  The iterator will
+ * first descend to a child node, if there is one.  When there is no
+ * child, the iterator will go to the next sibling.  When there is no
+ * next sibling, the iterator will return to the parent (but with
+ * a 'cmark_event_type' of `CMARK_EVENT_EXIT`).  The iterator will
+ * return `CMARK_EVENT_DONE` when it reaches the root node again.
+ * One natural application is an HTML renderer, where an `ENTER` event
+ * outputs an open tag and an `EXIT` event outputs a close tag.
+ * An iterator might also be used to transform an AST in some systematic
+ * way, for example, turning all level-3 headers into regular paragraphs.
+ *
+ *     void
+ *     usage_example(cmark_node *root) {
+ *         cmark_event_type ev_type;
+ *         cmark_iter *iter = cmark_iter_new(root);
+ *
+ *         while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
+ *             cmark_node *cur = cmark_iter_get_node(iter);
+ *             // Do something with `cur` and `ev_type`
+ *         }
+ *
+ *         cmark_iter_free(iter);
+ *     }
+ *
+ * Iterators will never return `EXIT` events for leaf nodes, which are nodes
+ * of type:
+ *
+ * * CMARK_NODE_HTML
+ * * CMARK_NODE_HRULE
+ * * CMARK_NODE_CODE_BLOCK
+ * * CMARK_NODE_TEXT
+ * * CMARK_NODE_SOFTBREAK
+ * * CMARK_NODE_LINEBREAK
+ * * CMARK_NODE_CODE
+ * * CMARK_NODE_INLINE_HTML
+ *
+ * Nodes must only be modified after an `EXIT` event, or an `ENTER` event for
+ * leaf nodes.
  */
 
+/** Creates a new iterator starting at 'root'.  The current node and event
+ * type are undefined until `cmark_iter_next` is called for the first time.
+ */
+CMARK_EXPORT
+cmark_iter*
+cmark_iter_new(cmark_node *root);
+
+/** Frees the memory allocated for an iterator.
+ */
+CMARK_EXPORT
+void
+cmark_iter_free(cmark_iter *iter);
+
+/** Advances to the next node and returns the event type (`CMARK_EVENT_ENTER`,
+ * `CMARK_EVENT_EXIT` or `CMARK_EVENT_DONE`).
+ */
+CMARK_EXPORT
+cmark_event_type
+cmark_iter_next(cmark_iter *iter);
+
+/** Returns the current node.
+ */
+CMARK_EXPORT
+cmark_node*
+cmark_iter_get_node(cmark_iter *iter);
+
+/** Returns the current event type.
+ */
+CMARK_EXPORT
+cmark_event_type
+cmark_iter_get_event_type(cmark_iter *iter);
+
+/** Resets the iterator so that the current node is 'current' and
+ * the event type is 'event_type'.  The new current node must be a
+ * descendant of the root node or the root node itself.
+ */
+CMARK_EXPORT
+void
+cmark_iter_reset(cmark_iter *iter, cmark_node *current,
+                 cmark_event_type event_type);
+
 /**
+ * ## Accessors
+ */
+
+/** Returns the type of 'node', or `CMARK_NODE_NONE` on error.
  */
 CMARK_EXPORT cmark_node_type
 cmark_node_get_type(cmark_node *node);
 
-/**
+/** Like 'cmark_node_get_type', but returns a string representation
+    of the type, or `"<unknown>"`.
+ */
+CMARK_EXPORT
+const char*
+cmark_node_get_type_string(cmark_node *node);
+
+/** Returns the string contents of 'node', or NULL if none.
  */
 CMARK_EXPORT const char*
-cmark_node_get_string_content(cmark_node *node);
+cmark_node_get_literal(cmark_node *node);
 
-/**
+/** Sets the string contents of 'node'.  Returns 1 on success,
+ * 0 on failure.
  */
 CMARK_EXPORT int
-cmark_node_set_string_content(cmark_node *node, const char *content);
+cmark_node_set_literal(cmark_node *node, const char *content);
 
-/**
+/** Returns the header level of 'node', or 0 if 'node' is not a header.
  */
 CMARK_EXPORT int
 cmark_node_get_header_level(cmark_node *node);
 
-/**
+/** Sets the header level of 'node', returning 1 on success and 0 on error.
  */
 CMARK_EXPORT int
 cmark_node_set_header_level(cmark_node *node, int level);
 
-/**
+/** Returns the list type of 'node', or `CMARK_NO_LIST` if 'node'
+ * is not a list.
  */
 CMARK_EXPORT cmark_list_type
 cmark_node_get_list_type(cmark_node *node);
 
-/**
+/** Sets the list type of 'node', returning 1 on success and 0 on error.
  */
 CMARK_EXPORT int
 cmark_node_set_list_type(cmark_node *node, cmark_list_type type);
 
-/**
+/** Returns the list delimiter type of 'node', or `CMARK_NO_DELIM` if 'node'
+ * is not a list.
+ */
+CMARK_EXPORT cmark_delim_type
+cmark_node_get_list_delim(cmark_node *node);
+
+/** Sets the list delimiter type of 'node', returning 1 on success and 0
+ * on error.
+ */
+CMARK_EXPORT int
+cmark_node_set_list_delim(cmark_node *node, cmark_delim_type delim);
+
+/** Returns starting number of 'node', if it is an ordered list, otherwise 0.
  */
 CMARK_EXPORT int
 cmark_node_get_list_start(cmark_node *node);
 
-/**
+/** Sets starting number of 'node', if it is an ordered list. Returns 1
+ * on success, 0 on failure.
  */
 CMARK_EXPORT int
 cmark_node_set_list_start(cmark_node *node, int start);
 
-/**
+/** Returns 1 if 'node' is a tight list, 0 otherwise.
  */
 CMARK_EXPORT int
 cmark_node_get_list_tight(cmark_node *node);
 
-/**
+/** Sets the "tightness" of a list.  Returns 1 on success, 0 on failure.
  */
 CMARK_EXPORT int
 cmark_node_set_list_tight(cmark_node *node, int tight);
 
-/**
+/** Returns the info string from a fenced code block, or NULL if none.
  */
 CMARK_EXPORT const char*
 cmark_node_get_fence_info(cmark_node *node);
 
-/**
+/** Sets the info string in a fenced code block, returning 1 on
+ * success and 0 on failure.
  */
 CMARK_EXPORT int
 cmark_node_set_fence_info(cmark_node *node, const char *info);
 
-/**
+/** Gets the URL of a link or image 'node', or NULL if none.
  */
 CMARK_EXPORT const char*
 cmark_node_get_url(cmark_node *node);
 
-/**
+/** Sets the URL of a link or image 'node'. Returns 1 on success,
+ * 0 on failure.
  */
 CMARK_EXPORT int
 cmark_node_set_url(cmark_node *node, const char *url);
 
-/**
+/** Gets the title of a link or image 'node', or NULL if none.
  */
 CMARK_EXPORT const char*
 cmark_node_get_title(cmark_node *node);
 
-/**
+/** Sets the title of a link or image 'node'. Returns 1 on success,
+ * 0 on failure.
  */
 CMARK_EXPORT int
 cmark_node_set_title(cmark_node *node, const char *title);
 
-/**
+/** Returns the line on which 'node' begins.
  */
 CMARK_EXPORT int
 cmark_node_get_start_line(cmark_node *node);
 
-/**
+/** Returns the column at which 'node' begins.
  */
 CMARK_EXPORT int
 cmark_node_get_start_column(cmark_node *node);
 
-/**
+/** Returns the line on which 'node' ends.
  */
 CMARK_EXPORT int
 cmark_node_get_end_line(cmark_node *node);
 
-/**
- * .SH TREE MANIPULATION
+/** Returns the column at which 'node' ends.
  */
+CMARK_EXPORT int
+cmark_node_get_end_column(cmark_node *node);
 
 /**
+ * ## Tree Manipulation
+ */
+
+/** Unlinks a 'node', removing it from the tree, but not freeing its
+ * memory.  (Use 'cmark_node_free' for that.)
  */
 CMARK_EXPORT void
 cmark_node_unlink(cmark_node *node);
 
-/**
+/** Inserts 'sibling' before 'node'.  Returns 1 on success, 0 on failure.
  */
 CMARK_EXPORT int
 cmark_node_insert_before(cmark_node *node, cmark_node *sibling);
 
-/**
+/** Inserts 'sibling' after 'node'. Returns 1 on success, 0 on failure.
  */
 CMARK_EXPORT int
 cmark_node_insert_after(cmark_node *node, cmark_node *sibling);
 
-/**
+/** Adds 'child' to the beginning of the children of 'node'.
+ * Returns 1 on success, 0 on failure.
  */
 CMARK_EXPORT int
 cmark_node_prepend_child(cmark_node *node, cmark_node *child);
 
-/**
+/** Adds 'child' to the end of the children of 'node'.
+ * Returns 1 on success, 0 on failure.
  */
 CMARK_EXPORT int
 cmark_node_append_child(cmark_node *node, cmark_node *child);
 
-/**
- * .SH PARSING
+/** Consolidates adjacent text nodes.
  */
+CMARK_EXPORT void
+cmark_consolidate_text_nodes(cmark_node *root);
 
 /**
+ * ## Parsing
+ *
+ * Simple interface:
+ *
+ *     cmark_node *document = cmark_parse_document("Hello *world*", 12);
+ *
+ * Streaming interface:
+ *
+ *     cmark_parser *parser = cmark_parser_new();
+ *     FILE *fp = fopen("myfile.md", "r");
+ *     while ((bytes = fread(buffer, 1, sizeof(buffer), fp)) > 0) {
+ *     	   cmark_parser_feed(parser, buffer, bytes);
+ *     	   if (bytes < sizeof(buffer)) {
+ *     	       break;
+ *     	   }
+ *     }
+ *     document = cmark_parser_finish(parser);
+ *     cmark_parser_free(parser);
+ */
+
+/** Creates a new parser object.
  */
 CMARK_EXPORT
 cmark_parser *cmark_parser_new();
 
-/**
+/** Frees memory allocated for a parser object.
  */
 CMARK_EXPORT
 void cmark_parser_free(cmark_parser *parser);
 
-/**
+/** Feeds a string of length 'len' to 'parser'.
  */
 CMARK_EXPORT
-cmark_node *cmark_parser_finish(cmark_parser *parser);
+void cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len);
 
-/**
+/** Finish parsing and return a pointer to a tree of nodes.
  */
 CMARK_EXPORT
-void cmark_parser_feed(cmark_parser *parser, const char *buffer, size_t len);
+cmark_node *cmark_parser_finish(cmark_parser *parser);
 
-/**
+/** Parse a CommonMark document in 'buffer' of length 'len'.
+ * Returns a pointer to a tree of nodes.
  */
 CMARK_EXPORT
 cmark_node *cmark_parse_document(const char *buffer, size_t len);
 
-/**
+/** Parse a CommonMark document in file 'f', returning a pointer to
+ * a tree of nodes.
  */
 CMARK_EXPORT
 cmark_node *cmark_parse_file(FILE *f);
 
 /**
- * .SH RENDERING
+ * ## Rendering
  */
 
-/**
+/** Render a 'node' tree as XML.
  */
 CMARK_EXPORT
-char *cmark_render_ast(cmark_node *root);
+char *cmark_render_xml(cmark_node *root, long options);
 
-/**
+/** Render a 'node' tree as an HTML fragment.  It is up to the user
+ * to add an appropriate header and footer.
  */
 CMARK_EXPORT
-char *cmark_render_html(cmark_node *root);
+char *cmark_render_html(cmark_node *root, long options);
+
+/** Render a 'node' tree as a groff man page, without the header.
+ */
+CMARK_EXPORT
+char *cmark_render_man(cmark_node *root, long options);
+
+/** Default writer options.
+ */
+#define CMARK_OPT_DEFAULT 0
+
+/** Include a `data-sourcepos` attribute on all block elements.
+ */
+#define CMARK_OPT_SOURCEPOS 1
+
+/** Render `softbreak` elements as hard line breaks.
+ */
+#define CMARK_OPT_HARDBREAKS 2
+
+/** Normalize tree by consolidating adjacent text nodes.
+ */
+#define CMARK_OPT_NORMALIZE 4
 
-/** .SH AUTHORS
+/** # AUTHORS
  *
  * John MacFarlane, Vicent Marti,  Kārlis Gaņģis, Nick Wellnhofer.
  */
 
 #ifndef CMARK_NO_SHORT_NAMES
-  #define NODE_DOCUMENT             CMARK_NODE_DOCUMENT
-  #define NODE_BLOCK_QUOTE          CMARK_NODE_BLOCK_QUOTE
-  #define NODE_LIST                 CMARK_NODE_LIST
-  #define NODE_LIST_ITEM            CMARK_NODE_LIST_ITEM
-  #define NODE_CODE_BLOCK           CMARK_NODE_CODE_BLOCK
-  #define NODE_HTML                 CMARK_NODE_HTML
-  #define NODE_PARAGRAPH            CMARK_NODE_PARAGRAPH
-  #define NODE_HEADER		    CMARK_NODE_HEADER
-  #define NODE_HRULE                CMARK_NODE_HRULE
-  #define NODE_REFERENCE_DEF        CMARK_NODE_REFERENCE_DEF
-  #define NODE_TEXT                 CMARK_NODE_TEXT
-  #define NODE_SOFTBREAK            CMARK_NODE_SOFTBREAK
-  #define NODE_LINEBREAK            CMARK_NODE_LINEBREAK
-  #define NODE_INLINE_CODE          CMARK_NODE_INLINE_CODE
-  #define NODE_INLINE_HTML          CMARK_NODE_INLINE_HTML
-  #define NODE_EMPH                 CMARK_NODE_EMPH
-  #define NODE_STRONG               CMARK_NODE_STRONG
-  #define NODE_LINK                 CMARK_NODE_LINK
-  #define NODE_IMAGE                CMARK_NODE_IMAGE
-  #define NODE_LINK_LABEL           CMARK_NODE_LINK_LABEL
-  #define BULLET_LIST               CMARK_BULLET_LIST
-  #define ORDERED_LIST              CMARK_ORDERED_LIST
-  #define PERIOD_DELIM              CMARK_PERIOD_DELIM
-  #define PAREN_DELIM               CMARK_PAREN_DELIM
+#define NODE_DOCUMENT             CMARK_NODE_DOCUMENT
+#define NODE_BLOCK_QUOTE          CMARK_NODE_BLOCK_QUOTE
+#define NODE_LIST                 CMARK_NODE_LIST
+#define NODE_ITEM                 CMARK_NODE_ITEM
+#define NODE_CODE_BLOCK           CMARK_NODE_CODE_BLOCK
+#define NODE_HTML                 CMARK_NODE_HTML
+#define NODE_PARAGRAPH            CMARK_NODE_PARAGRAPH
+#define NODE_HEADER		    CMARK_NODE_HEADER
+#define NODE_HRULE                CMARK_NODE_HRULE
+#define NODE_TEXT                 CMARK_NODE_TEXT
+#define NODE_SOFTBREAK            CMARK_NODE_SOFTBREAK
+#define NODE_LINEBREAK            CMARK_NODE_LINEBREAK
+#define NODE_CODE                 CMARK_NODE_CODE
+#define NODE_INLINE_HTML          CMARK_NODE_INLINE_HTML
+#define NODE_EMPH                 CMARK_NODE_EMPH
+#define NODE_STRONG               CMARK_NODE_STRONG
+#define NODE_LINK                 CMARK_NODE_LINK
+#define NODE_IMAGE                CMARK_NODE_IMAGE
+#define NODE_LINK_LABEL           CMARK_NODE_LINK_LABEL
+#define BULLET_LIST               CMARK_BULLET_LIST
+#define ORDERED_LIST              CMARK_ORDERED_LIST
+#define PERIOD_DELIM              CMARK_PERIOD_DELIM
+#define PAREN_DELIM               CMARK_PAREN_DELIM
 #endif
 
 #ifdef __cplusplus


[02/12] lucy-clownfish git commit: Regenerate charmonizer.c

Posted by nw...@apache.org.
Regenerate charmonizer.c


Project: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/repo
Commit: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/commit/dd37ce3b
Tree: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/tree/dd37ce3b
Diff: http://git-wip-us.apache.org/repos/asf/lucy-clownfish/diff/dd37ce3b

Branch: refs/heads/master
Commit: dd37ce3bd7dcea32c3dfeccc9c7fa53d5a0a6294
Parents: 9a13d0b
Author: Nick Wellnhofer <we...@aevum.de>
Authored: Sat Jan 10 18:42:41 2015 +0100
Committer: Nick Wellnhofer <we...@aevum.de>
Committed: Sat Jan 10 18:42:41 2015 +0100

----------------------------------------------------------------------
 compiler/common/charmonizer.c | 37 +++++++++++++++++++++++++++++++++++++
 runtime/common/charmonizer.c  | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 69 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/dd37ce3b/compiler/common/charmonizer.c
----------------------------------------------------------------------
diff --git a/compiler/common/charmonizer.c b/compiler/common/charmonizer.c
index 049bee6..f34c531 100644
--- a/compiler/common/charmonizer.c
+++ b/compiler/common/charmonizer.c
@@ -599,6 +599,10 @@ chaz_HeadCheck_check_header(const char *header_name);
 int
 chaz_HeadCheck_check_many_headers(const char **header_names);
 
+/* Return true if the symbol is defined (possibly as a macro). */
+int
+chaz_HeadCheck_defines_symbol(const char *symbol, const char *includes);
+
 /* Return true if the member is present in the struct. */
 int
 chaz_HeadCheck_contains_member(const char *struct_name, const char *member,
@@ -4205,6 +4209,34 @@ chaz_HeadCheck_check_many_headers(const char **header_names) {
 }
 
 int
+chaz_HeadCheck_defines_symbol(const char *symbol, const char *includes) {
+    /*
+     * Casting function pointers to object pointers like 'char*' is a C
+     * extension, so for a bullet-proof check, a separate test for functions
+     * might be necessary.
+     */
+    static const char defines_code[] =
+        CHAZ_QUOTE(  %s                                            )
+        CHAZ_QUOTE(  int main() {                                  )
+        CHAZ_QUOTE(  #ifdef %s                                     )
+        CHAZ_QUOTE(      return 0;                                 )
+        CHAZ_QUOTE(  #else                                         )
+        CHAZ_QUOTE(      return *(char*)&%s;                       )
+        CHAZ_QUOTE(  #endif                                        )
+        CHAZ_QUOTE(  }                                             );
+    long needed = sizeof(defines_code)
+                  + 2 * strlen(symbol)
+                  + strlen(includes)
+                  + 10;
+    char *buf = (char*)malloc(needed);
+    int retval;
+    sprintf(buf, defines_code, includes, symbol, symbol);
+    retval = chaz_CC_test_compile(buf);
+    free(buf);
+    return retval;
+}
+
+int
 chaz_HeadCheck_contains_member(const char *struct_name, const char *member,
                                const char *includes) {
     static const char contains_code[] =
@@ -7784,6 +7816,11 @@ int main(int argc, const char **argv) {
         S_write_makefile(cli);
     }
 
+    /* Needed by cmark. */
+    if (chaz_HeadCheck_defines_symbol("va_copy", "#include <stdarg.h>")) {
+        chaz_ConfWriter_append_conf("#define CHY_HAS_VA_COPY\n\n");
+    }
+
     /* Clean up. */
     chaz_CLI_destroy(cli);
     chaz_Probe_clean_up();

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/dd37ce3b/runtime/common/charmonizer.c
----------------------------------------------------------------------
diff --git a/runtime/common/charmonizer.c b/runtime/common/charmonizer.c
index 05ada73..9d8d92a 100644
--- a/runtime/common/charmonizer.c
+++ b/runtime/common/charmonizer.c
@@ -599,6 +599,10 @@ chaz_HeadCheck_check_header(const char *header_name);
 int
 chaz_HeadCheck_check_many_headers(const char **header_names);
 
+/* Return true if the symbol is defined (possibly as a macro). */
+int
+chaz_HeadCheck_defines_symbol(const char *symbol, const char *includes);
+
 /* Return true if the member is present in the struct. */
 int
 chaz_HeadCheck_contains_member(const char *struct_name, const char *member,
@@ -4205,6 +4209,34 @@ chaz_HeadCheck_check_many_headers(const char **header_names) {
 }
 
 int
+chaz_HeadCheck_defines_symbol(const char *symbol, const char *includes) {
+    /*
+     * Casting function pointers to object pointers like 'char*' is a C
+     * extension, so for a bullet-proof check, a separate test for functions
+     * might be necessary.
+     */
+    static const char defines_code[] =
+        CHAZ_QUOTE(  %s                                            )
+        CHAZ_QUOTE(  int main() {                                  )
+        CHAZ_QUOTE(  #ifdef %s                                     )
+        CHAZ_QUOTE(      return 0;                                 )
+        CHAZ_QUOTE(  #else                                         )
+        CHAZ_QUOTE(      return *(char*)&%s;                       )
+        CHAZ_QUOTE(  #endif                                        )
+        CHAZ_QUOTE(  }                                             );
+    long needed = sizeof(defines_code)
+                  + 2 * strlen(symbol)
+                  + strlen(includes)
+                  + 10;
+    char *buf = (char*)malloc(needed);
+    int retval;
+    sprintf(buf, defines_code, includes, symbol, symbol);
+    retval = chaz_CC_test_compile(buf);
+    free(buf);
+    return retval;
+}
+
+int
 chaz_HeadCheck_contains_member(const char *struct_name, const char *member,
                                const char *includes) {
     static const char contains_code[] =


[08/12] lucy-clownfish git commit: Update CommonMark source code

Posted by nw...@apache.org.
http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/cmark_ctype.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/cmark_ctype.c b/compiler/modules/CommonMark/src/cmark_ctype.c
new file mode 100644
index 0000000..5de8199
--- /dev/null
+++ b/compiler/modules/CommonMark/src/cmark_ctype.c
@@ -0,0 +1,53 @@
+#include <stdint.h>
+
+#include "cmark_ctype.h"
+
+/** 1 = space, 2 = punct, 3 = digit, 4 = alpha, 0 = other
+ */
+static const int8_t cmark_ctype_class[256] = {
+	/*      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, 0, 1, 1, 0, 0, 1, 0, 0,
+	/* 1 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	/* 2 */ 1, 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, 2, 2, 2, 2, 2, 2,
+	/* 4 */ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+	/* 5 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2,
+	/* 6 */ 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4,
+	/* 7 */ 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 2, 2, 0,
+	/* 8 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	/* 9 */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	/* a */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	/* b */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	/* c */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	/* d */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	/* e */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+	/* f */ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
+};
+
+/**
+ * Returns 1 if c is a "whitespace" character as defined by the spec.
+ */
+int cmark_isspace(char c)
+{
+	return cmark_ctype_class[(int8_t)c] == 1;
+}
+
+/**
+ * Returns 1 if c is an ascii punctuation character.
+ */
+int cmark_ispunct(char c)
+{
+	return cmark_ctype_class[(int8_t)c] == 2;
+}
+
+int cmark_isalnum(char c)
+{
+	int8_t result;
+	result = cmark_ctype_class[(int8_t)c];
+	return (result == 3 || result == 4);
+}
+
+int cmark_isdigit(char c)
+{
+	return cmark_ctype_class[(int8_t)c] == 3;
+}

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/cmark_ctype.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/cmark_ctype.h b/compiler/modules/CommonMark/src/cmark_ctype.h
new file mode 100644
index 0000000..f803946
--- /dev/null
+++ b/compiler/modules/CommonMark/src/cmark_ctype.h
@@ -0,0 +1,24 @@
+#ifndef CMARK_CMARK_CTYPE_H
+#define CMARK_CMARK_CTYPE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/** Locale-independent versions of functions from ctype.h.
+ * We want cmark to behave the same no matter what the system locale.
+ */
+
+int cmark_isspace(char c);
+
+int cmark_ispunct(char c);
+
+int cmark_isalnum(char c);
+
+int cmark_isdigit(char c);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/cmark_export.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/cmark_export.h b/compiler/modules/CommonMark/src/cmark_export.h
index fa14b4d..1102c36 100644
--- a/compiler/modules/CommonMark/src/cmark_export.h
+++ b/compiler/modules/CommonMark/src/cmark_export.h
@@ -1,7 +1,35 @@
+
 #ifndef CMARK_EXPORT_H
 #define CMARK_EXPORT_H
 
-#define CMARK_EXPORT
-#define CMARK_NO_EXPORT
+#ifdef CMARK_STATIC_DEFINE
+#  define CMARK_EXPORT
+#  define CMARK_NO_EXPORT
+#else
+#  ifndef CMARK_EXPORT
+#    ifdef libcmark_EXPORTS
+        /* We are building this library */
+#      define CMARK_EXPORT __attribute__((visibility("default")))
+#    else
+        /* We are using this library */
+#      define CMARK_EXPORT __attribute__((visibility("default")))
+#    endif
+#  endif
+
+#  ifndef CMARK_NO_EXPORT
+#    define CMARK_NO_EXPORT __attribute__((visibility("hidden")))
+#  endif
+#endif
+
+#ifndef CMARK_DEPRECATED
+#  define CMARK_DEPRECATED __attribute__ ((__deprecated__))
+#  define CMARK_DEPRECATED_EXPORT CMARK_EXPORT __attribute__ ((__deprecated__))
+#  define CMARK_DEPRECATED_NO_EXPORT CMARK_NO_EXPORT __attribute__ ((__deprecated__))
+#endif
+
+#define DEFINE_NO_DEPRECATED 0
+#if DEFINE_NO_DEPRECATED
+# define CMARK_NO_DEPRECATED
+#endif
 
 #endif

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/config.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/config.h b/compiler/modules/CommonMark/src/config.h
index ce3064e..ecfa334 100644
--- a/compiler/modules/CommonMark/src/config.h
+++ b/compiler/modules/CommonMark/src/config.h
@@ -9,3 +9,7 @@ typedef char bool;
 #endif
 
 #define CMARK_ATTRIBUTE(list)
+
+#ifndef CHY_HAS_VA_COPY
+  #define va_copy(dest, src) ((dest) = (src))
+#endif

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/config.h.in
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/config.h.in b/compiler/modules/CommonMark/src/config.h.in
index 5294bc9..c1e9597 100644
--- a/compiler/modules/CommonMark/src/config.h.in
+++ b/compiler/modules/CommonMark/src/config.h.in
@@ -15,3 +15,9 @@
 #else
   #define CMARK_ATTRIBUTE(list)
 #endif
+
+#cmakedefine HAVE_VA_COPY
+
+#ifndef HAVE_VA_COPY
+  #define va_copy(dest, src) ((dest) = (src))
+#endif

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/houdini.h
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/houdini.h b/compiler/modules/CommonMark/src/houdini.h
index 9e1200e..9f00f6d 100644
--- a/compiler/modules/CommonMark/src/houdini.h
+++ b/compiler/modules/CommonMark/src/houdini.h
@@ -31,19 +31,19 @@ extern "C" {
 #define HOUDINI_ESCAPED_SIZE(x) (((x) * 12) / 10)
 #define HOUDINI_UNESCAPED_SIZE(x) (x)
 
-extern size_t houdini_unescape_ent(strbuf *ob, const uint8_t *src, size_t size);
-extern int houdini_escape_html(strbuf *ob, const uint8_t *src, size_t size);
-extern int houdini_escape_html0(strbuf *ob, const uint8_t *src, size_t size, int secure);
-extern int houdini_unescape_html(strbuf *ob, const uint8_t *src, size_t size);
-extern void houdini_unescape_html_f(strbuf *ob, const uint8_t *src, size_t size);
-extern int houdini_escape_xml(strbuf *ob, const uint8_t *src, size_t size);
-extern int houdini_escape_uri(strbuf *ob, const uint8_t *src, size_t size);
-extern int houdini_escape_url(strbuf *ob, const uint8_t *src, size_t size);
-extern int houdini_escape_href(strbuf *ob, const uint8_t *src, size_t size);
-extern int houdini_unescape_uri(strbuf *ob, const uint8_t *src, size_t size);
-extern int houdini_unescape_url(strbuf *ob, const uint8_t *src, size_t size);
-extern int houdini_escape_js(strbuf *ob, const uint8_t *src, size_t size);
-extern int houdini_unescape_js(strbuf *ob, const uint8_t *src, size_t size);
+extern size_t houdini_unescape_ent(cmark_strbuf *ob, const uint8_t *src, size_t size);
+extern int houdini_escape_html(cmark_strbuf *ob, const uint8_t *src, size_t size);
+extern int houdini_escape_html0(cmark_strbuf *ob, const uint8_t *src, size_t size, int secure);
+extern int houdini_unescape_html(cmark_strbuf *ob, const uint8_t *src, size_t size);
+extern void houdini_unescape_html_f(cmark_strbuf *ob, const uint8_t *src, size_t size);
+extern int houdini_escape_xml(cmark_strbuf *ob, const uint8_t *src, size_t size);
+extern int houdini_escape_uri(cmark_strbuf *ob, const uint8_t *src, size_t size);
+extern int houdini_escape_url(cmark_strbuf *ob, const uint8_t *src, size_t size);
+extern int houdini_escape_href(cmark_strbuf *ob, const uint8_t *src, size_t size);
+extern int houdini_unescape_uri(cmark_strbuf *ob, const uint8_t *src, size_t size);
+extern int houdini_unescape_url(cmark_strbuf *ob, const uint8_t *src, size_t size);
+extern int houdini_escape_js(cmark_strbuf *ob, const uint8_t *src, size_t size);
+extern int houdini_unescape_js(cmark_strbuf *ob, const uint8_t *src, size_t size);
 
 #ifdef __cplusplus
 }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/houdini_href_e.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/houdini_href_e.c b/compiler/modules/CommonMark/src/houdini_href_e.c
index 1c99432..7527780 100644
--- a/compiler/modules/CommonMark/src/houdini_href_e.c
+++ b/compiler/modules/CommonMark/src/houdini_href_e.c
@@ -49,7 +49,7 @@ static const char HREF_SAFE[] = {
 };
 
 int
-houdini_escape_href(strbuf *ob, const uint8_t *src, size_t size)
+houdini_escape_href(cmark_strbuf *ob, const uint8_t *src, size_t size)
 {
 	static const uint8_t hex_chars[] = "0123456789ABCDEF";
 	size_t  i = 0, org;
@@ -63,7 +63,7 @@ houdini_escape_href(strbuf *ob, const uint8_t *src, size_t size)
 			i++;
 
 		if (likely(i > org))
-			strbuf_put(ob, src + org, i - org);
+			cmark_strbuf_put(ob, src + org, i - org);
 
 		/* escaping */
 		if (i >= size)
@@ -73,23 +73,23 @@ houdini_escape_href(strbuf *ob, const uint8_t *src, size_t size)
 		/* amp appears all the time in URLs, but needs
 		 * HTML-entity escaping to be inside an href */
 		case '&':
-			strbuf_puts(ob, "&amp;");
+			cmark_strbuf_puts(ob, "&amp;");
 			break;
 
 		/* the single quote is a valid URL character
 		 * according to the standard; it needs HTML
 		 * entity escaping too */
 		case '\'':
-			strbuf_puts(ob, "&#x27;");
+			cmark_strbuf_puts(ob, "&#x27;");
 			break;
 
-		/* the space can be escaped to %20 or a plus
-		 * sign. we're going with the generic escape
-		 * for now. the plus thing is more commonly seen
-		 * when building GET strings */
+			/* the space can be escaped to %20 or a plus
+			 * sign. we're going with the generic escape
+			 * for now. the plus thing is more commonly seen
+			 * when building GET strings */
 #if 0
 		case ' ':
-			strbuf_putc(ob, '+');
+			cmark_strbuf_putc(ob, '+');
 			break;
 #endif
 
@@ -97,7 +97,7 @@ houdini_escape_href(strbuf *ob, const uint8_t *src, size_t size)
 		default:
 			hex_str[1] = hex_chars[(src[i] >> 4) & 0xF];
 			hex_str[2] = hex_chars[src[i] & 0xF];
-			strbuf_put(ob, hex_str, 3);
+			cmark_strbuf_put(ob, hex_str, 3);
 		}
 
 		i++;

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/houdini_html_e.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/houdini_html_e.c b/compiler/modules/CommonMark/src/houdini_html_e.c
index db5034b..1a4c3e1 100644
--- a/compiler/modules/CommonMark/src/houdini_html_e.c
+++ b/compiler/modules/CommonMark/src/houdini_html_e.c
@@ -35,17 +35,17 @@ static const char HTML_ESCAPE_TABLE[] = {
 };
 
 static const char *HTML_ESCAPES[] = {
-        "",
-        "&quot;",
-        "&amp;",
-        "&#39;",
-        "&#47;",
-        "&lt;",
-        "&gt;"
+	"",
+	"&quot;",
+	"&amp;",
+	"&#39;",
+	"&#47;",
+	"&lt;",
+	"&gt;"
 };
 
 int
-houdini_escape_html0(strbuf *ob, const uint8_t *src, size_t size, int secure)
+houdini_escape_html0(cmark_strbuf *ob, const uint8_t *src, size_t size, int secure)
 {
 	size_t  i = 0, org, esc = 0;
 
@@ -55,7 +55,7 @@ houdini_escape_html0(strbuf *ob, const uint8_t *src, size_t size, int secure)
 			i++;
 
 		if (i > org)
-			strbuf_put(ob, src + org, i - org);
+			cmark_strbuf_put(ob, src + org, i - org);
 
 		/* escaping */
 		if (unlikely(i >= size))
@@ -63,9 +63,9 @@ houdini_escape_html0(strbuf *ob, const uint8_t *src, size_t size, int secure)
 
 		/* The forward slash is only escaped in secure mode */
 		if ((src[i] == '/' || src[i] == '\'') && !secure) {
-			strbuf_putc(ob, src[i]);
+			cmark_strbuf_putc(ob, src[i]);
 		} else {
-			strbuf_puts(ob, HTML_ESCAPES[esc]);
+			cmark_strbuf_puts(ob, HTML_ESCAPES[esc]);
 		}
 
 		i++;
@@ -75,7 +75,7 @@ houdini_escape_html0(strbuf *ob, const uint8_t *src, size_t size, int secure)
 }
 
 int
-houdini_escape_html(strbuf *ob, const uint8_t *src, size_t size)
+houdini_escape_html(cmark_strbuf *ob, const uint8_t *src, size_t size)
 {
 	return houdini_escape_html0(ob, src, size, 1);
 }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/houdini_html_u.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/houdini_html_u.c b/compiler/modules/CommonMark/src/houdini_html_u.c
index b88b9d1..ecd7faa 100644
--- a/compiler/modules/CommonMark/src/houdini_html_u.c
+++ b/compiler/modules/CommonMark/src/houdini_html_u.c
@@ -8,7 +8,7 @@
 #include "html_unescape.h"
 
 size_t
-houdini_unescape_ent(strbuf *ob, const uint8_t *src, size_t size)
+houdini_unescape_ent(cmark_strbuf *ob, const uint8_t *src, size_t size)
 {
 	size_t i = 0;
 
@@ -55,7 +55,8 @@ houdini_unescape_ent(strbuf *ob, const uint8_t *src, size_t size)
 				const struct html_ent *entity = find_entity((char *)src, i);
 
 				if (entity != NULL) {
-					strbuf_put(ob, entity->utf8, entity->utf8_len);
+					size_t len = strnlen((const char *)entity->utf8, 4);
+					cmark_strbuf_put(ob, entity->utf8, len);
 					return i + 1;
 				}
 
@@ -68,7 +69,7 @@ houdini_unescape_ent(strbuf *ob, const uint8_t *src, size_t size)
 }
 
 int
-houdini_unescape_html(strbuf *ob, const uint8_t *src, size_t size)
+houdini_unescape_html(cmark_strbuf *ob, const uint8_t *src, size_t size)
 {
 	size_t  i = 0, org, ent;
 
@@ -82,10 +83,10 @@ houdini_unescape_html(strbuf *ob, const uint8_t *src, size_t size)
 				if (i >= size)
 					return 0;
 
-				strbuf_grow(ob, HOUDINI_UNESCAPED_SIZE(size));
+				cmark_strbuf_grow(ob, HOUDINI_UNESCAPED_SIZE(size));
 			}
 
-			strbuf_put(ob, src + org, i - org);
+			cmark_strbuf_put(ob, src + org, i - org);
 		}
 
 		/* escaping */
@@ -99,14 +100,14 @@ houdini_unescape_html(strbuf *ob, const uint8_t *src, size_t size)
 
 		/* not really an entity */
 		if (ent == 0)
-			strbuf_putc(ob, '&');
+			cmark_strbuf_putc(ob, '&');
 	}
 
 	return 1;
 }
 
-void houdini_unescape_html_f(strbuf *ob, const uint8_t *src, size_t size)
+void houdini_unescape_html_f(cmark_strbuf *ob, const uint8_t *src, size_t size)
 {
 	if (!houdini_unescape_html(ob, src, size))
-		strbuf_put(ob, src, size);
+		cmark_strbuf_put(ob, src, size);
 }

http://git-wip-us.apache.org/repos/asf/lucy-clownfish/blob/5672da15/compiler/modules/CommonMark/src/html.c
----------------------------------------------------------------------
diff --git a/compiler/modules/CommonMark/src/html.c b/compiler/modules/CommonMark/src/html.c
index 60229cc..abc3e83 100644
--- a/compiler/modules/CommonMark/src/html.c
+++ b/compiler/modules/CommonMark/src/html.c
@@ -11,10 +11,7 @@
 
 // Functions to convert cmark_nodes to HTML strings.
 
-static bool
-finish_node(strbuf *html, cmark_node *node, bool tight);
-
-static void escape_html(strbuf *dest, const unsigned char *source, int length)
+static void escape_html(cmark_strbuf *dest, const unsigned char *source, int length)
 {
 	if (length < 0)
 		length = strlen((char *)source);
@@ -22,7 +19,7 @@ static void escape_html(strbuf *dest, const unsigned char *source, int length)
 	houdini_escape_html0(dest, source, (size_t)length, 0);
 }
 
-static void escape_href(strbuf *dest, const unsigned char *source, int length)
+static void escape_href(cmark_strbuf *dest, const unsigned char *source, int length)
 {
 	if (length < 0)
 		length = strlen((char *)source);
@@ -30,328 +27,298 @@ static void escape_href(strbuf *dest, const unsigned char *source, int length)
 	houdini_escape_href(dest, source, (size_t)length);
 }
 
-static inline void cr(strbuf *html)
+static inline void cr(cmark_strbuf *html)
 {
 	if (html->size && html->ptr[html->size - 1] != '\n')
-		strbuf_putc(html, '\n');
+		cmark_strbuf_putc(html, '\n');
 }
 
-// Convert the inline children of a node to a plain string.
-static void inlines_to_plain_html(strbuf *html, cmark_node* node)
-{
-	cmark_node* cur = node->first_child;
-
-	if (cur == NULL) {
-		return;
-	}
-
-	while (true) {
-		switch(cur->type) {
-		case NODE_TEXT:
-		case NODE_INLINE_CODE:
-		case NODE_INLINE_HTML:
-			escape_html(html, cur->as.literal.data, cur->as.literal.len);
-			break;
-
-		case NODE_LINEBREAK:
-		case NODE_SOFTBREAK:
-			strbuf_putc(html, ' ');
-			break;
+struct render_state {
+	cmark_strbuf* html;
+	cmark_node *plain;
+};
 
-		default:
-			break;
-		}
-
-		if (cur->first_child) {
-			cur = cur->first_child;
-			continue;
-		}
-
-	next_sibling:
-		if (cur->next) {
-			cur = cur->next;
-			continue;
-		}
-		cur = cur->parent;
-		if (cur == node) {
-			break;
-		}
-		goto next_sibling;
+static void
+S_render_sourcepos(cmark_node *node, cmark_strbuf *html, long options)
+{
+	if (CMARK_OPT_SOURCEPOS & options) {
+		cmark_strbuf_printf(html, " data-sourcepos=\"%d:%d-%d:%d\"",
+		                    cmark_node_get_start_line(node),
+		                    cmark_node_get_start_column(node),
+		                    cmark_node_get_end_line(node),
+		                    cmark_node_get_end_column(node));
 	}
 }
 
-
-// Convert a cmark_node to HTML.
-static void node_to_html(strbuf *html, cmark_node *node)
+static int
+S_render_node(cmark_node *node, cmark_event_type ev_type,
+              struct render_state *state, long options)
 {
-	cmark_node *cur;
-	char start_header[] = "<h0>";
-	bool tight = false;
-	bool visit_children;
-	strbuf *info;
-
-	if (node == NULL) {
-		return;
-	}
+	cmark_node *parent;
+	cmark_node *grandparent;
+	cmark_strbuf *html = state->html;
+	char start_header[] = "<h0";
+	char end_header[] = "</h0";
+	bool tight;
 
-	cur = node;
-	while (true) {
-		// Only NODE_IMAGE wants to skip its children.
-		visit_children = true;
+	bool entering = (ev_type == CMARK_EVENT_ENTER);
 
-		switch(cur->type) {
-		case NODE_DOCUMENT:
-			break;
+	if (state->plain == node) { // back at original node
+		state->plain = NULL;
+	}
 
-		case NODE_PARAGRAPH:
-			if (!tight) {
-				cr(html);
-				strbuf_puts(html, "<p>");
-			}
+	if (state->plain != NULL) {
+		switch(node->type) {
+		case CMARK_NODE_TEXT:
+		case CMARK_NODE_CODE:
+		case CMARK_NODE_INLINE_HTML:
+			escape_html(html, node->as.literal.data,
+			            node->as.literal.len);
 			break;
 
-		case NODE_BLOCK_QUOTE:
-			cr(html);
-			strbuf_puts(html, "<blockquote>\n");
-			// BLOCK_QUOTE doesn't use any of the 'as' structs,
-			// so the 'list' member can be used to store the
-			// current value of 'tight'.
-			cur->as.list.tight = tight;
-			tight = false;
+		case CMARK_NODE_LINEBREAK:
+		case CMARK_NODE_SOFTBREAK:
+			cmark_strbuf_putc(html, ' ');
 			break;
 
-		case NODE_LIST_ITEM:
-			cr(html);
-			strbuf_puts(html, "<li>");
+		default:
 			break;
+		}
+		return 1;
+	}
 
-		case NODE_LIST: {
-			cmark_list *list = &cur->as.list;
-			bool tmp;
+	switch (node->type) {
+	case CMARK_NODE_DOCUMENT:
+		break;
 
-			// make sure a list starts at the beginning of the line:
+	case CMARK_NODE_BLOCK_QUOTE:
+		if (entering) {
 			cr(html);
-
-			if (list->list_type == CMARK_BULLET_LIST) {
-				strbuf_puts(html, "<ul>\n");
-			}
-			else if (list->start == 1) {
-				strbuf_puts(html, "<ol>\n");
-			}
-			else {
-				strbuf_printf(html, "<ol start=\"%d\">\n",
-					      list->start);
-			}
-
-			// Store the current value of 'tight' by swapping.
-			tmp = list->tight;
-			list->tight = tight;
-			tight = tmp;
-			break;
+			cmark_strbuf_puts(html, "<blockquote");
+			S_render_sourcepos(node, html, options);
+			cmark_strbuf_puts(html, ">\n");
+		} else {
+			cr(html);
+			cmark_strbuf_puts(html, "</blockquote>\n");
 		}
+		break;
 
-		case NODE_HEADER:
-			cr(html);
-			start_header[2] = '0' + cur->as.header.level;
-			strbuf_puts(html, start_header);
-			break;
+	case CMARK_NODE_LIST: {
+		cmark_list_type list_type = node->as.list.list_type;
+		int start = node->as.list.start;
 
-		case NODE_CODE_BLOCK:
-			info = &cur->as.code.info;
+		if (entering) {
 			cr(html);
-
-			if (&cur->as.code.fence_length == 0
-			    || strbuf_len(info) == 0) {
-				strbuf_puts(html, "<pre><code>");
+			if (list_type == CMARK_BULLET_LIST) {
+				cmark_strbuf_puts(html, "<ul");
+				S_render_sourcepos(node, html, options);
+				cmark_strbuf_puts(html, ">\n");
+			} else if (start == 1) {
+				cmark_strbuf_puts(html, "<ol");
+				S_render_sourcepos(node, html, options);
+				cmark_strbuf_puts(html, ">\n");
+			} else {
+				cmark_strbuf_printf(html,
+				                    "<ol start=\"%d\"",
+				                    start);
+				S_render_sourcepos(node, html, options);
+				cmark_strbuf_puts(html, ">\n");
 			}
-			else {
-				int first_tag = strbuf_strchr(info, ' ', 0);
-				if (first_tag < 0)
-					first_tag = strbuf_len(info);
-
-				strbuf_puts(html,
-					    "<pre><code class=\"language-");
-				escape_html(html, info->ptr, first_tag);
-				strbuf_puts(html, "\">");
-			}
-
-			escape_html(html, cur->string_content.ptr, cur->string_content.size);
-			break;
+		} else {
+			cmark_strbuf_puts(html,
+			                  list_type == CMARK_BULLET_LIST ?
+			                  "</ul>\n" : "</ol>\n");
+		}
+		break;
+	}
 
-		case NODE_HTML:
+	case CMARK_NODE_ITEM:
+		if (entering) {
 			cr(html);
-			strbuf_put(html, cur->string_content.ptr, cur->string_content.size);
-			break;
+			cmark_strbuf_puts(html, "<li");
+			S_render_sourcepos(node, html, options);
+			cmark_strbuf_putc(html, '>');
+		} else {
+			cmark_strbuf_puts(html, "</li>\n");
+		}
+		break;
 
-		case NODE_HRULE:
+	case CMARK_NODE_HEADER:
+		if (entering) {
 			cr(html);
-			strbuf_puts(html, "<hr />\n");
-			break;
-
-		case NODE_REFERENCE_DEF:
-			break;
-
-		case NODE_TEXT:
-			escape_html(html, cur->as.literal.data, cur->as.literal.len);
-			break;
-
-		case NODE_LINEBREAK:
-			strbuf_puts(html, "<br />\n");
-			break;
-
-		case NODE_SOFTBREAK:
-			strbuf_putc(html, '\n');
-			break;
-
-		case NODE_INLINE_CODE:
-			strbuf_puts(html, "<code>");
-			escape_html(html, cur->as.literal.data, cur->as.literal.len);
-			break;
-
-		case NODE_INLINE_HTML:
-			strbuf_put(html,
-				   cur->as.literal.data,
-				   cur->as.literal.len);
-			break;
-
-		case NODE_LINK:
-			strbuf_puts(html, "<a href=\"");
-			if (cur->as.link.url)
-				escape_href(html, cur->as.link.url, -1);
-
-			if (cur->as.link.title) {
-				strbuf_puts(html, "\" title=\"");
-				escape_html(html, cur->as.link.title, -1);
-			}
-
-			strbuf_puts(html, "\">");
-			break;
-
-		case NODE_IMAGE:
-			strbuf_puts(html, "<img src=\"");
-			if (cur->as.link.url)
-				escape_href(html, cur->as.link.url, -1);
-
-			strbuf_puts(html, "\" alt=\"");
-			inlines_to_plain_html(html, cur);
+			start_header[2] = '0' + node->as.header.level;
+			cmark_strbuf_puts(html, start_header);
+			S_render_sourcepos(node, html, options);
+			cmark_strbuf_putc(html, '>');
+		} else {
+			end_header[3] = '0' + node->as.header.level;
+			cmark_strbuf_puts(html, end_header);
+			cmark_strbuf_puts(html, ">\n");
+		}
+		break;
 
-			if (cur->as.link.title) {
-				strbuf_puts(html, "\" title=\"");
-				escape_html(html, cur->as.link.title, -1);
+	case CMARK_NODE_CODE_BLOCK:
+		cr(html);
+
+		if (!node->as.code.fenced || node->as.code.info.len == 0) {
+			cmark_strbuf_puts(html, "<pre");
+			S_render_sourcepos(node, html, options);
+			cmark_strbuf_puts(html, "><code>");
+		} else {
+			int first_tag = 0;
+			while (first_tag < node->as.code.info.len &&
+			       node->as.code.info.data[first_tag] != ' ') {
+				first_tag += 1;
 			}
 
-			strbuf_puts(html, "\" />");
-			visit_children = false;
-			break;
-
-		case NODE_STRONG:
-			strbuf_puts(html, "<strong>");
-			break;
-
-		case NODE_EMPH:
-			strbuf_puts(html, "<em>");
-			break;
-
-		default:
-			assert(false);
+			cmark_strbuf_puts(html, "<pre");
+			S_render_sourcepos(node, html, options);
+			cmark_strbuf_puts(html, "><code class=\"language-");
+			escape_html(html, node->as.code.info.data, first_tag);
+			cmark_strbuf_puts(html, "\">");
 		}
 
-		if (visit_children && cur->first_child) {
-			cur = cur->first_child;
-			continue;
-		}
+		escape_html(html, node->as.code.literal.data,
+		            node->as.code.literal.len);
+		cmark_strbuf_puts(html, "</code></pre>\n");
+		break;
 
-	next_sibling:
-		tight = finish_node(html, cur, tight);
-		if (cur == node) {
-			break;
-		}
-		if (cur->next) {
-			cur = cur->next;
-			continue;
-		}
-		cur = cur->parent;
-		goto next_sibling;
-	}
-}
+	case CMARK_NODE_HTML:
+		cr(html);
+		cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
+		break;
 
-// Returns the restored value of 'tight'.
-static bool
-finish_node(strbuf *html, cmark_node *node, bool tight)
-{
-	char end_header[] = "</h0>\n";
+	case CMARK_NODE_HRULE:
+		cr(html);
+		cmark_strbuf_puts(html, "<hr");
+		S_render_sourcepos(node, html, options);
+		cmark_strbuf_puts(html, " />\n");
+		break;
 
-	switch (node->type) {
-	case NODE_PARAGRAPH:
+	case CMARK_NODE_PARAGRAPH:
+		parent = cmark_node_parent(node);
+		grandparent = cmark_node_parent(parent);
+		if (grandparent != NULL &&
+		    grandparent->type == CMARK_NODE_LIST) {
+			tight = grandparent->as.list.tight;
+		} else {
+			tight = false;
+		}
 		if (!tight) {
-			strbuf_puts(html, "</p>\n");
+			if (entering) {
+				cr(html);
+				cmark_strbuf_puts(html, "<p");
+				S_render_sourcepos(node, html, options);
+				cmark_strbuf_putc(html, '>');
+			} else {
+				cmark_strbuf_puts(html, "</p>\n");
+			}
 		}
 		break;
 
-	case NODE_BLOCK_QUOTE: {
-		cmark_list *list = &node->as.list;
-		strbuf_puts(html, "</blockquote>\n");
-		// Restore old 'tight' value.
-		tight = list->tight;
-		list->tight = false;
+	case CMARK_NODE_TEXT:
+		escape_html(html, node->as.literal.data,
+		            node->as.literal.len);
 		break;
-	}
 
-	case NODE_LIST_ITEM:
-		strbuf_puts(html, "</li>\n");
+	case CMARK_NODE_LINEBREAK:
+		cmark_strbuf_puts(html, "<br />\n");
 		break;
 
-	case NODE_LIST: {
-		cmark_list *list = &node->as.list;
-		bool tmp;
-		strbuf_puts(html,
-			    list->list_type == CMARK_BULLET_LIST ?
-			    "</ul>\n" : "</ol>\n");
-		// Restore old 'tight' value.
-		tmp = tight;
-		tight = list->tight;
-		list->tight = tmp;
+	case CMARK_NODE_SOFTBREAK:
+		if (options & CMARK_OPT_HARDBREAKS) {
+			cmark_strbuf_puts(html, "<br />\n");
+		} else {
+			cmark_strbuf_putc(html, '\n');
+		}
 		break;
-	}
 
-	case NODE_HEADER:
-		end_header[3] = '0' + node->as.header.level;
-		strbuf_puts(html, end_header);
+	case CMARK_NODE_CODE:
+		cmark_strbuf_puts(html, "<code>");
+		escape_html(html, node->as.literal.data, node->as.literal.len);
+		cmark_strbuf_puts(html, "</code>");
 		break;
 
-	case NODE_CODE_BLOCK:
-		strbuf_puts(html, "</code></pre>\n");
+	case CMARK_NODE_INLINE_HTML:
+		cmark_strbuf_put(html, node->as.literal.data, node->as.literal.len);
 		break;
 
-	case NODE_INLINE_CODE:
-		strbuf_puts(html, "</code>");
+	case CMARK_NODE_STRONG:
+		if (entering) {
+			cmark_strbuf_puts(html, "<strong>");
+		} else {
+			cmark_strbuf_puts(html, "</strong>");
+		}
 		break;
 
-	case NODE_LINK:
-		strbuf_puts(html, "</a>");
+	case CMARK_NODE_EMPH:
+		if (entering) {
+			cmark_strbuf_puts(html, "<em>");
+		} else {
+			cmark_strbuf_puts(html, "</em>");
+		}
 		break;
 
-	case NODE_STRONG:
-		strbuf_puts(html, "</strong>");
+	case CMARK_NODE_LINK:
+		if (entering) {
+			cmark_strbuf_puts(html, "<a href=\"");
+			if (node->as.link.url)
+				escape_href(html, node->as.link.url, -1);
+
+			if (node->as.link.title) {
+				cmark_strbuf_puts(html, "\" title=\"");
+				escape_html(html, node->as.link.title, -1);
+			}
+
+			cmark_strbuf_puts(html, "\">");
+		} else {
+			cmark_strbuf_puts(html, "</a>");
+		}
 		break;
 
-	case NODE_EMPH:
-		strbuf_puts(html, "</em>");
+	case CMARK_NODE_IMAGE:
+		if (entering) {
+			cmark_strbuf_puts(html, "<img src=\"");
+			if (node->as.link.url)
+				escape_href(html, node->as.link.url, -1);
+
+			cmark_strbuf_puts(html, "\" alt=\"");
+			state->plain = node;
+		} else {
+			if (node->as.link.title) {
+				cmark_strbuf_puts(html, "\" title=\"");
+				escape_html(html, node->as.link.title, -1);
+			}
+
+			cmark_strbuf_puts(html, "\" />");
+		}
 		break;
 
 	default:
+		assert(false);
 		break;
 	}
 
-	return tight;
+	// cmark_strbuf_putc(html, 'x');
+	return 1;
 }
 
-char *cmark_render_html(cmark_node *root)
+char *cmark_render_html(cmark_node *root, long options)
 {
 	char *result;
-	strbuf html = GH_BUF_INIT;
-	node_to_html(&html, root);
-	result = (char *)strbuf_detach(&html);
-	strbuf_free(&html);
+	cmark_strbuf html = GH_BUF_INIT;
+	cmark_event_type ev_type;
+	cmark_node *cur;
+	struct render_state state = { &html, NULL };
+	cmark_iter *iter = cmark_iter_new(root);
+
+	while ((ev_type = cmark_iter_next(iter)) != CMARK_EVENT_DONE) {
+		cur = cmark_iter_get_node(iter);
+		S_render_node(cur, ev_type, &state, options);
+	}
+	result = (char *)cmark_strbuf_detach(&html);
+
+	cmark_iter_free(iter);
+	cmark_strbuf_free(&html);
 	return result;
 }