mail_parser/decoders/
html.rs

1/*
2 * SPDX-FileCopyrightText: 2020 Stalwart Labs LLC <hello@stalw.art>
3 *
4 * SPDX-License-Identifier: Apache-2.0 OR MIT
5 */
6
7use std::char::REPLACEMENT_CHARACTER;
8
9pub fn add_html_token(result: &mut String, token: &[u8], add_space: bool) {
10    if add_space {
11        result.push(' ');
12    }
13
14    if let [b'&', entity @ .., b';'] = token {
15        let entity_code = if let [b'#', code @ ..] = entity {
16            let (code, radix) = if let [b'x' | b'X', code @ ..] = code {
17                (code, 16)
18            } else {
19                (code, 10)
20            };
21
22            std::str::from_utf8(code)
23                .ok()
24                .and_then(|code| u32::from_str_radix(code, radix).ok())
25        } else {
26            lookup_entity(entity).copied()
27        };
28
29        if let Some(entity_code) = entity_code {
30            result.push(char::from_u32(entity_code).unwrap_or(REPLACEMENT_CHARACTER));
31            return;
32        }
33    }
34
35    result.push_str(std::str::from_utf8(token).unwrap());
36}
37
38pub fn html_to_text(input: &str) -> String {
39    let mut result = String::with_capacity(input.len());
40    let input = input.as_bytes();
41
42    let mut in_tag = false;
43    let mut in_head = false;
44    let mut in_comment = false;
45
46    let mut is_token_start = true;
47    let mut is_after_space = false;
48    let mut is_tag_close = false;
49    let mut is_new_line = true;
50
51    let mut token_start = 0;
52    let mut token_end = 0;
53
54    let mut tag_token_pos = 0;
55    let mut comment_pos = 0;
56
57    for (pos, ch) in input.iter().enumerate() {
58        if !in_comment {
59            match ch {
60                b'<' => {
61                    if !in_tag && !in_head && !is_token_start {
62                        add_html_token(
63                            &mut result,
64                            &input[token_start..token_end + 1],
65                            is_after_space,
66                        );
67                        is_after_space = false;
68                    }
69
70                    tag_token_pos = 0;
71                    in_tag = true;
72                    is_token_start = true;
73                    is_tag_close = false;
74                    continue;
75                }
76                b'>' if in_tag => {
77                    if tag_token_pos == 1 {
78                        match input.get(token_start..token_end + 1) {
79                            Some(tag)
80                                if tag.eq_ignore_ascii_case(b"br")
81                                    || (tag.eq_ignore_ascii_case(b"p") && is_tag_close) =>
82                            {
83                                result.push('\n');
84                                is_after_space = false;
85                                is_new_line = true;
86                            }
87                            Some(tag) if tag.eq_ignore_ascii_case(b"head") => {
88                                in_head = !is_tag_close;
89                            }
90                            _ => (),
91                        }
92                    }
93
94                    in_tag = false;
95                    is_token_start = true;
96
97                    continue;
98                }
99                b'/' if in_tag => {
100                    if tag_token_pos == 0 {
101                        is_tag_close = true;
102                    }
103                    continue;
104                }
105                b'!' if in_tag && tag_token_pos == 0 => {
106                    if let Some(b"--") = input.get(pos + 1..pos + 3) {
107                        in_comment = true;
108                        continue;
109                    }
110                }
111                b' ' | b'\t' | b'\r' | b'\n' => {
112                    if !in_tag && !in_head {
113                        if !is_token_start {
114                            add_html_token(
115                                &mut result,
116                                &input[token_start..token_end + 1],
117                                is_after_space && !is_new_line,
118                            );
119                            is_new_line = false;
120                        }
121                        is_after_space = true;
122                    }
123
124                    is_token_start = true;
125
126                    continue;
127                }
128                b'&' if !in_tag && !is_token_start && !in_head => {
129                    add_html_token(
130                        &mut result,
131                        &input[token_start..token_end + 1],
132                        is_after_space && !is_new_line,
133                    );
134                    is_new_line = false;
135                    is_token_start = true;
136                    is_after_space = false;
137                }
138                b';' if !in_tag && !is_token_start && !in_head => {
139                    add_html_token(
140                        &mut result,
141                        &input[token_start..pos + 1],
142                        is_after_space && !is_new_line,
143                    );
144                    is_token_start = true;
145                    is_after_space = false;
146                    is_new_line = false;
147                    continue;
148                }
149                _ => (),
150            }
151            if is_token_start {
152                token_start = pos;
153                is_token_start = false;
154                if in_tag {
155                    tag_token_pos += 1;
156                }
157            }
158            token_end = pos;
159        } else {
160            match ch {
161                b'-' => comment_pos += 1,
162                b'>' if comment_pos == 2 => {
163                    comment_pos = 0;
164                    in_comment = false;
165                    in_tag = false;
166                    is_token_start = true;
167                }
168                _ => comment_pos = 0,
169            }
170        }
171    }
172
173    if !in_tag && !is_token_start && !in_head {
174        add_html_token(
175            &mut result,
176            &input[token_start..token_end + 1],
177            is_after_space && !is_new_line,
178        );
179    }
180
181    result.shrink_to_fit();
182    result
183}
184
185pub fn text_to_html(input: &str) -> String {
186    let input = input.as_bytes();
187    let mut result = Vec::with_capacity(input.len() + 26);
188
189    result.extend_from_slice(b"<html><body>");
190
191    for &ch in input {
192        match ch {
193            b'\n' => result.extend_from_slice(b"<br/>"),
194            b'<' => result.extend_from_slice(b"&lt;"),
195            b'\r' => (),
196            _ => result.push(ch),
197        }
198    }
199    result.extend_from_slice(b"</body></html>");
200
201    String::from_utf8(result).unwrap()
202}
203
204fn lookup_entity(key: &[u8]) -> Option<&u32> {
205    hashify::map! {
206    key,
207    u32,
208    "AElig" => 198,
209    "AMP" => 38,
210    "Aacute" => 193,
211    "Abreve" => 258,
212    "Acirc" => 194,
213    "Acy" => 1040,
214    "Afr" => 120068,
215    "Agrave" => 192,
216    "Alpha" => 913,
217    "Amacr" => 256,
218    "And" => 10835,
219    "Aogon" => 260,
220    "Aopf" => 120120,
221    "ApplyFunction" => 8289,
222    "Aring" => 197,
223    "Ascr" => 119964,
224    "Assign" => 8788,
225    "Atilde" => 195,
226    "Auml" => 196,
227    "Backslash" => 8726,
228    "Barv" => 10983,
229    "Barwed" => 8966,
230    "Bcy" => 1041,
231    "Because" => 8757,
232    "Bernoullis" => 8492,
233    "Beta" => 914,
234    "Bfr" => 120069,
235    "Bopf" => 120121,
236    "Breve" => 728,
237    "Bscr" => 8492,
238    "Bumpeq" => 8782,
239    "CHcy" => 1063,
240    "COPY" => 169,
241    "Cacute" => 262,
242    "Cap" => 8914,
243    "CapitalDifferentialD" => 8517,
244    "Cayleys" => 8493,
245    "Ccaron" => 268,
246    "Ccedil" => 199,
247    "Ccirc" => 264,
248    "Cconint" => 8752,
249    "Cdot" => 266,
250    "Cedilla" => 184,
251    "CenterDot" => 183,
252    "Cfr" => 8493,
253    "Chi" => 935,
254    "CircleDot" => 8857,
255    "CircleMinus" => 8854,
256    "CirclePlus" => 8853,
257    "CircleTimes" => 8855,
258    "ClockwiseContourIntegral" => 8754,
259    "CloseCurlyDoubleQuote" => 8221,
260    "CloseCurlyQuote" => 8217,
261    "Colon" => 8759,
262    "Colone" => 10868,
263    "Congruent" => 8801,
264    "Conint" => 8751,
265    "ContourIntegral" => 8750,
266    "Copf" => 8450,
267    "Coproduct" => 8720,
268    "CounterClockwiseContourIntegral" => 8755,
269    "Cross" => 10799,
270    "Cscr" => 119966,
271    "Cup" => 8915,
272    "CupCap" => 8781,
273    "DD" => 8517,
274    "DDotrahd" => 10513,
275    "DJcy" => 1026,
276    "DScy" => 1029,
277    "DZcy" => 1039,
278    "Dagger" => 8225,
279    "Darr" => 8609,
280    "Dashv" => 10980,
281    "Dcaron" => 270,
282    "Dcy" => 1044,
283    "Del" => 8711,
284    "Delta" => 916,
285    "Dfr" => 120071,
286    "DiacriticalAcute" => 180,
287    "DiacriticalDot" => 729,
288    "DiacriticalDoubleAcute" => 733,
289    "DiacriticalGrave" => 96,
290    "DiacriticalTilde" => 732,
291    "Diamond" => 8900,
292    "DifferentialD" => 8518,
293    "Dopf" => 120123,
294    "Dot" => 168,
295    "DotDot" => 8412,
296    "DotEqual" => 8784,
297    "DoubleContourIntegral" => 8751,
298    "DoubleDot" => 168,
299    "DoubleDownArrow" => 8659,
300    "DoubleLeftArrow" => 8656,
301    "DoubleLeftRightArrow" => 8660,
302    "DoubleLeftTee" => 10980,
303    "DoubleLongLeftArrow" => 10232,
304    "DoubleLongLeftRightArrow" => 10234,
305    "DoubleLongRightArrow" => 10233,
306    "DoubleRightArrow" => 8658,
307    "DoubleRightTee" => 8872,
308    "DoubleUpArrow" => 8657,
309    "DoubleUpDownArrow" => 8661,
310    "DoubleVerticalBar" => 8741,
311    "DownArrow" => 8595,
312    "DownArrowBar" => 10515,
313    "DownArrowUpArrow" => 8693,
314    "DownBreve" => 785,
315    "DownLeftRightVector" => 10576,
316    "DownLeftTeeVector" => 10590,
317    "DownLeftVector" => 8637,
318    "DownLeftVectorBar" => 10582,
319    "DownRightTeeVector" => 10591,
320    "DownRightVector" => 8641,
321    "DownRightVectorBar" => 10583,
322    "DownTee" => 8868,
323    "DownTeeArrow" => 8615,
324    "Downarrow" => 8659,
325    "Dscr" => 119967,
326    "Dstrok" => 272,
327    "ENG" => 330,
328    "ETH" => 208,
329    "Eacute" => 201,
330    "Ecaron" => 282,
331    "Ecirc" => 202,
332    "Ecy" => 1069,
333    "Edot" => 278,
334    "Efr" => 120072,
335    "Egrave" => 200,
336    "Element" => 8712,
337    "Emacr" => 274,
338    "EmptySmallSquare" => 9723,
339    "EmptyVerySmallSquare" => 9643,
340    "Eogon" => 280,
341    "Eopf" => 120124,
342    "Epsilon" => 917,
343    "Equal" => 10869,
344    "EqualTilde" => 8770,
345    "Equilibrium" => 8652,
346    "Escr" => 8496,
347    "Esim" => 10867,
348    "Eta" => 919,
349    "Euml" => 203,
350    "Exists" => 8707,
351    "ExponentialE" => 8519,
352    "Fcy" => 1060,
353    "Ffr" => 120073,
354    "FilledSmallSquare" => 9724,
355    "FilledVerySmallSquare" => 9642,
356    "Fopf" => 120125,
357    "ForAll" => 8704,
358    "Fouriertrf" => 8497,
359    "Fscr" => 8497,
360    "GJcy" => 1027,
361    "GT" => 62,
362    "Gamma" => 915,
363    "Gammad" => 988,
364    "Gbreve" => 286,
365    "Gcedil" => 290,
366    "Gcirc" => 284,
367    "Gcy" => 1043,
368    "Gdot" => 288,
369    "Gfr" => 120074,
370    "Gg" => 8921,
371    "Gopf" => 120126,
372    "GreaterEqual" => 8805,
373    "GreaterEqualLess" => 8923,
374    "GreaterFullEqual" => 8807,
375    "GreaterGreater" => 10914,
376    "GreaterLess" => 8823,
377    "GreaterSlantEqual" => 10878,
378    "GreaterTilde" => 8819,
379    "Gscr" => 119970,
380    "Gt" => 8811,
381    "HARDcy" => 1066,
382    "Hacek" => 711,
383    "Hat" => 94,
384    "Hcirc" => 292,
385    "Hfr" => 8460,
386    "HilbertSpace" => 8459,
387    "Hopf" => 8461,
388    "HorizontalLine" => 9472,
389    "Hscr" => 8459,
390    "Hstrok" => 294,
391    "HumpDownHump" => 8782,
392    "HumpEqual" => 8783,
393    "IEcy" => 1045,
394    "IJlig" => 306,
395    "IOcy" => 1025,
396    "Iacute" => 205,
397    "Icirc" => 206,
398    "Icy" => 1048,
399    "Idot" => 304,
400    "Ifr" => 8465,
401    "Igrave" => 204,
402    "Im" => 8465,
403    "Imacr" => 298,
404    "ImaginaryI" => 8520,
405    "Implies" => 8658,
406    "Int" => 8748,
407    "Integral" => 8747,
408    "Intersection" => 8898,
409    "InvisibleComma" => 8291,
410    "InvisibleTimes" => 8290,
411    "Iogon" => 302,
412    "Iopf" => 120128,
413    "Iota" => 921,
414    "Iscr" => 8464,
415    "Itilde" => 296,
416    "Iukcy" => 1030,
417    "Iuml" => 207,
418    "Jcirc" => 308,
419    "Jcy" => 1049,
420    "Jfr" => 120077,
421    "Jopf" => 120129,
422    "Jscr" => 119973,
423    "Jsercy" => 1032,
424    "Jukcy" => 1028,
425    "KHcy" => 1061,
426    "KJcy" => 1036,
427    "Kappa" => 922,
428    "Kcedil" => 310,
429    "Kcy" => 1050,
430    "Kfr" => 120078,
431    "Kopf" => 120130,
432    "Kscr" => 119974,
433    "LJcy" => 1033,
434    "LT" => 60,
435    "Lacute" => 313,
436    "Lambda" => 923,
437    "Lang" => 10218,
438    "Laplacetrf" => 8466,
439    "Larr" => 8606,
440    "Lcaron" => 317,
441    "Lcedil" => 315,
442    "Lcy" => 1051,
443    "LeftAngleBracket" => 10216,
444    "LeftArrow" => 8592,
445    "LeftArrowBar" => 8676,
446    "LeftArrowRightArrow" => 8646,
447    "LeftCeiling" => 8968,
448    "LeftDoubleBracket" => 10214,
449    "LeftDownTeeVector" => 10593,
450    "LeftDownVector" => 8643,
451    "LeftDownVectorBar" => 10585,
452    "LeftFloor" => 8970,
453    "LeftRightArrow" => 8596,
454    "LeftRightVector" => 10574,
455    "LeftTee" => 8867,
456    "LeftTeeArrow" => 8612,
457    "LeftTeeVector" => 10586,
458    "LeftTriangle" => 8882,
459    "LeftTriangleBar" => 10703,
460    "LeftTriangleEqual" => 8884,
461    "LeftUpDownVector" => 10577,
462    "LeftUpTeeVector" => 10592,
463    "LeftUpVector" => 8639,
464    "LeftUpVectorBar" => 10584,
465    "LeftVector" => 8636,
466    "LeftVectorBar" => 10578,
467    "Leftarrow" => 8656,
468    "Leftrightarrow" => 8660,
469    "LessEqualGreater" => 8922,
470    "LessFullEqual" => 8806,
471    "LessGreater" => 8822,
472    "LessLess" => 10913,
473    "LessSlantEqual" => 10877,
474    "LessTilde" => 8818,
475    "Lfr" => 120079,
476    "Ll" => 8920,
477    "Lleftarrow" => 8666,
478    "Lmidot" => 319,
479    "LongLeftArrow" => 10229,
480    "LongLeftRightArrow" => 10231,
481    "LongRightArrow" => 10230,
482    "Longleftarrow" => 10232,
483    "Longleftrightarrow" => 10234,
484    "Longrightarrow" => 10233,
485    "Lopf" => 120131,
486    "LowerLeftArrow" => 8601,
487    "LowerRightArrow" => 8600,
488    "Lscr" => 8466,
489    "Lsh" => 8624,
490    "Lstrok" => 321,
491    "Lt" => 8810,
492    "Map" => 10501,
493    "Mcy" => 1052,
494    "MediumSpace" => 8287,
495    "Mellintrf" => 8499,
496    "Mfr" => 120080,
497    "MinusPlus" => 8723,
498    "Mopf" => 120132,
499    "Mscr" => 8499,
500    "Mu" => 924,
501    "NJcy" => 1034,
502    "Nacute" => 323,
503    "Ncaron" => 327,
504    "Ncedil" => 325,
505    "Ncy" => 1053,
506    "NegativeMediumSpace" => 8203,
507    "NegativeThickSpace" => 8203,
508    "NegativeThinSpace" => 8203,
509    "NegativeVeryThinSpace" => 8203,
510    "NestedGreaterGreater" => 8811,
511    "NestedLessLess" => 8810,
512    "NewLine" => 10,
513    "Nfr" => 120081,
514    "NoBreak" => 8288,
515    "NonBreakingSpace" => 160,
516    "Nopf" => 8469,
517    "Not" => 10988,
518    "NotCongruent" => 8802,
519    "NotCupCap" => 8813,
520    "NotDoubleVerticalBar" => 8742,
521    "NotElement" => 8713,
522    "NotEqual" => 8800,
523    "NotEqualTilde" => 8770,
524    "NotExists" => 8708,
525    "NotGreater" => 8815,
526    "NotGreaterEqual" => 8817,
527    "NotGreaterFullEqual" => 8807,
528    "NotGreaterGreater" => 8811,
529    "NotGreaterLess" => 8825,
530    "NotGreaterSlantEqual" => 10878,
531    "NotGreaterTilde" => 8821,
532    "NotHumpDownHump" => 8782,
533    "NotHumpEqual" => 8783,
534    "NotLeftTriangle" => 8938,
535    "NotLeftTriangleBar" => 10703,
536    "NotLeftTriangleEqual" => 8940,
537    "NotLess" => 8814,
538    "NotLessEqual" => 8816,
539    "NotLessGreater" => 8824,
540    "NotLessLess" => 8810,
541    "NotLessSlantEqual" => 10877,
542    "NotLessTilde" => 8820,
543    "NotNestedGreaterGreater" => 10914,
544    "NotNestedLessLess" => 10913,
545    "NotPrecedes" => 8832,
546    "NotPrecedesEqual" => 10927,
547    "NotPrecedesSlantEqual" => 8928,
548    "NotReverseElement" => 8716,
549    "NotRightTriangle" => 8939,
550    "NotRightTriangleBar" => 10704,
551    "NotRightTriangleEqual" => 8941,
552    "NotSquareSubset" => 8847,
553    "NotSquareSubsetEqual" => 8930,
554    "NotSquareSuperset" => 8848,
555    "NotSquareSupersetEqual" => 8931,
556    "NotSubset" => 8834,
557    "NotSubsetEqual" => 8840,
558    "NotSucceeds" => 8833,
559    "NotSucceedsEqual" => 10928,
560    "NotSucceedsSlantEqual" => 8929,
561    "NotSucceedsTilde" => 8831,
562    "NotSuperset" => 8835,
563    "NotSupersetEqual" => 8841,
564    "NotTilde" => 8769,
565    "NotTildeEqual" => 8772,
566    "NotTildeFullEqual" => 8775,
567    "NotTildeTilde" => 8777,
568    "NotVerticalBar" => 8740,
569    "Nscr" => 119977,
570    "Ntilde" => 209,
571    "Nu" => 925,
572    "OElig" => 338,
573    "Oacute" => 211,
574    "Ocirc" => 212,
575    "Ocy" => 1054,
576    "Odblac" => 336,
577    "Ofr" => 120082,
578    "Ograve" => 210,
579    "Omacr" => 332,
580    "Omega" => 937,
581    "Omicron" => 927,
582    "Oopf" => 120134,
583    "OpenCurlyDoubleQuote" => 8220,
584    "OpenCurlyQuote" => 8216,
585    "Or" => 10836,
586    "Oscr" => 119978,
587    "Oslash" => 216,
588    "Otilde" => 213,
589    "Otimes" => 10807,
590    "Ouml" => 214,
591    "OverBar" => 8254,
592    "OverBrace" => 9182,
593    "OverBracket" => 9140,
594    "OverParenthesis" => 9180,
595    "PartialD" => 8706,
596    "Pcy" => 1055,
597    "Pfr" => 120083,
598    "Phi" => 934,
599    "Pi" => 928,
600    "PlusMinus" => 177,
601    "Poincareplane" => 8460,
602    "Popf" => 8473,
603    "Pr" => 10939,
604    "Precedes" => 8826,
605    "PrecedesEqual" => 10927,
606    "PrecedesSlantEqual" => 8828,
607    "PrecedesTilde" => 8830,
608    "Prime" => 8243,
609    "Product" => 8719,
610    "Proportion" => 8759,
611    "Proportional" => 8733,
612    "Pscr" => 119979,
613    "Psi" => 936,
614    "QUOT" => 34,
615    "Qfr" => 120084,
616    "Qopf" => 8474,
617    "Qscr" => 119980,
618    "RBarr" => 10512,
619    "REG" => 174,
620    "Racute" => 340,
621    "Rang" => 10219,
622    "Rarr" => 8608,
623    "Rarrtl" => 10518,
624    "Rcaron" => 344,
625    "Rcedil" => 342,
626    "Rcy" => 1056,
627    "Re" => 8476,
628    "ReverseElement" => 8715,
629    "ReverseEquilibrium" => 8651,
630    "ReverseUpEquilibrium" => 10607,
631    "Rfr" => 8476,
632    "Rho" => 929,
633    "RightAngleBracket" => 10217,
634    "RightArrow" => 8594,
635    "RightArrowBar" => 8677,
636    "RightArrowLeftArrow" => 8644,
637    "RightCeiling" => 8969,
638    "RightDoubleBracket" => 10215,
639    "RightDownTeeVector" => 10589,
640    "RightDownVector" => 8642,
641    "RightDownVectorBar" => 10581,
642    "RightFloor" => 8971,
643    "RightTee" => 8866,
644    "RightTeeArrow" => 8614,
645    "RightTeeVector" => 10587,
646    "RightTriangle" => 8883,
647    "RightTriangleBar" => 10704,
648    "RightTriangleEqual" => 8885,
649    "RightUpDownVector" => 10575,
650    "RightUpTeeVector" => 10588,
651    "RightUpVector" => 8638,
652    "RightUpVectorBar" => 10580,
653    "RightVector" => 8640,
654    "RightVectorBar" => 10579,
655    "Rightarrow" => 8658,
656    "Ropf" => 8477,
657    "RoundImplies" => 10608,
658    "Rrightarrow" => 8667,
659    "Rscr" => 8475,
660    "Rsh" => 8625,
661    "RuleDelayed" => 10740,
662    "SHCHcy" => 1065,
663    "SHcy" => 1064,
664    "SOFTcy" => 1068,
665    "Sacute" => 346,
666    "Sc" => 10940,
667    "Scaron" => 352,
668    "Scedil" => 350,
669    "Scirc" => 348,
670    "Scy" => 1057,
671    "Sfr" => 120086,
672    "ShortDownArrow" => 8595,
673    "ShortLeftArrow" => 8592,
674    "ShortRightArrow" => 8594,
675    "ShortUpArrow" => 8593,
676    "Sigma" => 931,
677    "SmallCircle" => 8728,
678    "Sopf" => 120138,
679    "Sqrt" => 8730,
680    "Square" => 9633,
681    "SquareIntersection" => 8851,
682    "SquareSubset" => 8847,
683    "SquareSubsetEqual" => 8849,
684    "SquareSuperset" => 8848,
685    "SquareSupersetEqual" => 8850,
686    "SquareUnion" => 8852,
687    "Sscr" => 119982,
688    "Star" => 8902,
689    "Sub" => 8912,
690    "Subset" => 8912,
691    "SubsetEqual" => 8838,
692    "Succeeds" => 8827,
693    "SucceedsEqual" => 10928,
694    "SucceedsSlantEqual" => 8829,
695    "SucceedsTilde" => 8831,
696    "SuchThat" => 8715,
697    "Sum" => 8721,
698    "Sup" => 8913,
699    "Superset" => 8835,
700    "SupersetEqual" => 8839,
701    "Supset" => 8913,
702    "THORN" => 222,
703    "TRADE" => 8482,
704    "TSHcy" => 1035,
705    "TScy" => 1062,
706    "Tab" => 9,
707    "Tau" => 932,
708    "Tcaron" => 356,
709    "Tcedil" => 354,
710    "Tcy" => 1058,
711    "Tfr" => 120087,
712    "Therefore" => 8756,
713    "Theta" => 920,
714    "ThickSpace" => 8287,
715    "ThinSpace" => 8201,
716    "Tilde" => 8764,
717    "TildeEqual" => 8771,
718    "TildeFullEqual" => 8773,
719    "TildeTilde" => 8776,
720    "Topf" => 120139,
721    "TripleDot" => 8411,
722    "Tscr" => 119983,
723    "Tstrok" => 358,
724    "Uacute" => 218,
725    "Uarr" => 8607,
726    "Uarrocir" => 10569,
727    "Ubrcy" => 1038,
728    "Ubreve" => 364,
729    "Ucirc" => 219,
730    "Ucy" => 1059,
731    "Udblac" => 368,
732    "Ufr" => 120088,
733    "Ugrave" => 217,
734    "Umacr" => 362,
735    "UnderBar" => 95,
736    "UnderBrace" => 9183,
737    "UnderBracket" => 9141,
738    "UnderParenthesis" => 9181,
739    "Union" => 8899,
740    "UnionPlus" => 8846,
741    "Uogon" => 370,
742    "Uopf" => 120140,
743    "UpArrow" => 8593,
744    "UpArrowBar" => 10514,
745    "UpArrowDownArrow" => 8645,
746    "UpDownArrow" => 8597,
747    "UpEquilibrium" => 10606,
748    "UpTee" => 8869,
749    "UpTeeArrow" => 8613,
750    "Uparrow" => 8657,
751    "Updownarrow" => 8661,
752    "UpperLeftArrow" => 8598,
753    "UpperRightArrow" => 8599,
754    "Upsi" => 978,
755    "Upsilon" => 933,
756    "Uring" => 366,
757    "Uscr" => 119984,
758    "Utilde" => 360,
759    "Uuml" => 220,
760    "VDash" => 8875,
761    "Vbar" => 10987,
762    "Vcy" => 1042,
763    "Vdash" => 8873,
764    "Vdashl" => 10982,
765    "Vee" => 8897,
766    "Verbar" => 8214,
767    "Vert" => 8214,
768    "VerticalBar" => 8739,
769    "VerticalLine" => 124,
770    "VerticalSeparator" => 10072,
771    "VerticalTilde" => 8768,
772    "VeryThinSpace" => 8202,
773    "Vfr" => 120089,
774    "Vopf" => 120141,
775    "Vscr" => 119985,
776    "Vvdash" => 8874,
777    "Wcirc" => 372,
778    "Wedge" => 8896,
779    "Wfr" => 120090,
780    "Wopf" => 120142,
781    "Wscr" => 119986,
782    "Xfr" => 120091,
783    "Xi" => 926,
784    "Xopf" => 120143,
785    "Xscr" => 119987,
786    "YAcy" => 1071,
787    "YIcy" => 1031,
788    "YUcy" => 1070,
789    "Yacute" => 221,
790    "Ycirc" => 374,
791    "Ycy" => 1067,
792    "Yfr" => 120092,
793    "Yopf" => 120144,
794    "Yscr" => 119988,
795    "Yuml" => 376,
796    "ZHcy" => 1046,
797    "Zacute" => 377,
798    "Zcaron" => 381,
799    "Zcy" => 1047,
800    "Zdot" => 379,
801    "ZeroWidthSpace" => 8203,
802    "Zeta" => 918,
803    "Zfr" => 8488,
804    "Zopf" => 8484,
805    "Zscr" => 119989,
806    "aacute" => 225,
807    "abreve" => 259,
808    "ac" => 8766,
809    "acE" => 8766,
810    "acd" => 8767,
811    "acirc" => 226,
812    "acute" => 180,
813    "acy" => 1072,
814    "aelig" => 230,
815    "af" => 8289,
816    "afr" => 120094,
817    "agrave" => 224,
818    "alefsym" => 8501,
819    "aleph" => 8501,
820    "alpha" => 945,
821    "amacr" => 257,
822    "amalg" => 10815,
823    "amp" => 38,
824    "and" => 8743,
825    "andand" => 10837,
826    "andd" => 10844,
827    "andslope" => 10840,
828    "andv" => 10842,
829    "ang" => 8736,
830    "ange" => 10660,
831    "angle" => 8736,
832    "angmsd" => 8737,
833    "angmsdaa" => 10664,
834    "angmsdab" => 10665,
835    "angmsdac" => 10666,
836    "angmsdad" => 10667,
837    "angmsdae" => 10668,
838    "angmsdaf" => 10669,
839    "angmsdag" => 10670,
840    "angmsdah" => 10671,
841    "angrt" => 8735,
842    "angrtvb" => 8894,
843    "angrtvbd" => 10653,
844    "angsph" => 8738,
845    "angst" => 197,
846    "angzarr" => 9084,
847    "aogon" => 261,
848    "aopf" => 120146,
849    "ap" => 8776,
850    "apE" => 10864,
851    "apacir" => 10863,
852    "ape" => 8778,
853    "apid" => 8779,
854    "apos" => 39,
855    "approx" => 8776,
856    "approxeq" => 8778,
857    "aring" => 229,
858    "ascr" => 119990,
859    "ast" => 42,
860    "asymp" => 8776,
861    "asympeq" => 8781,
862    "atilde" => 227,
863    "auml" => 228,
864    "awconint" => 8755,
865    "awint" => 10769,
866    "bNot" => 10989,
867    "backcong" => 8780,
868    "backepsilon" => 1014,
869    "backprime" => 8245,
870    "backsim" => 8765,
871    "backsimeq" => 8909,
872    "barvee" => 8893,
873    "barwed" => 8965,
874    "barwedge" => 8965,
875    "bbrk" => 9141,
876    "bbrktbrk" => 9142,
877    "bcong" => 8780,
878    "bcy" => 1073,
879    "bdquo" => 8222,
880    "becaus" => 8757,
881    "because" => 8757,
882    "bemptyv" => 10672,
883    "bepsi" => 1014,
884    "bernou" => 8492,
885    "beta" => 946,
886    "beth" => 8502,
887    "between" => 8812,
888    "bfr" => 120095,
889    "bigcap" => 8898,
890    "bigcirc" => 9711,
891    "bigcup" => 8899,
892    "bigodot" => 10752,
893    "bigoplus" => 10753,
894    "bigotimes" => 10754,
895    "bigsqcup" => 10758,
896    "bigstar" => 9733,
897    "bigtriangledown" => 9661,
898    "bigtriangleup" => 9651,
899    "biguplus" => 10756,
900    "bigvee" => 8897,
901    "bigwedge" => 8896,
902    "bkarow" => 10509,
903    "blacklozenge" => 10731,
904    "blacksquare" => 9642,
905    "blacktriangle" => 9652,
906    "blacktriangledown" => 9662,
907    "blacktriangleleft" => 9666,
908    "blacktriangleright" => 9656,
909    "blank" => 9251,
910    "blk12" => 9618,
911    "blk14" => 9617,
912    "blk34" => 9619,
913    "block" => 9608,
914    "bne" => 61,
915    "bnequiv" => 8801,
916    "bnot" => 8976,
917    "bopf" => 120147,
918    "bot" => 8869,
919    "bottom" => 8869,
920    "bowtie" => 8904,
921    "boxDL" => 9559,
922    "boxDR" => 9556,
923    "boxDl" => 9558,
924    "boxDr" => 9555,
925    "boxH" => 9552,
926    "boxHD" => 9574,
927    "boxHU" => 9577,
928    "boxHd" => 9572,
929    "boxHu" => 9575,
930    "boxUL" => 9565,
931    "boxUR" => 9562,
932    "boxUl" => 9564,
933    "boxUr" => 9561,
934    "boxV" => 9553,
935    "boxVH" => 9580,
936    "boxVL" => 9571,
937    "boxVR" => 9568,
938    "boxVh" => 9579,
939    "boxVl" => 9570,
940    "boxVr" => 9567,
941    "boxbox" => 10697,
942    "boxdL" => 9557,
943    "boxdR" => 9554,
944    "boxdl" => 9488,
945    "boxdr" => 9484,
946    "boxh" => 9472,
947    "boxhD" => 9573,
948    "boxhU" => 9576,
949    "boxhd" => 9516,
950    "boxhu" => 9524,
951    "boxminus" => 8863,
952    "boxplus" => 8862,
953    "boxtimes" => 8864,
954    "boxuL" => 9563,
955    "boxuR" => 9560,
956    "boxul" => 9496,
957    "boxur" => 9492,
958    "boxv" => 9474,
959    "boxvH" => 9578,
960    "boxvL" => 9569,
961    "boxvR" => 9566,
962    "boxvh" => 9532,
963    "boxvl" => 9508,
964    "boxvr" => 9500,
965    "bprime" => 8245,
966    "breve" => 728,
967    "brvbar" => 166,
968    "bscr" => 119991,
969    "bsemi" => 8271,
970    "bsim" => 8765,
971    "bsime" => 8909,
972    "bsol" => 92,
973    "bsolb" => 10693,
974    "bsolhsub" => 10184,
975    "bull" => 8226,
976    "bullet" => 8226,
977    "bump" => 8782,
978    "bumpE" => 10926,
979    "bumpe" => 8783,
980    "bumpeq" => 8783,
981    "cacute" => 263,
982    "cap" => 8745,
983    "capand" => 10820,
984    "capbrcup" => 10825,
985    "capcap" => 10827,
986    "capcup" => 10823,
987    "capdot" => 10816,
988    "caps" => 8745,
989    "caret" => 8257,
990    "caron" => 711,
991    "ccaps" => 10829,
992    "ccaron" => 269,
993    "ccedil" => 231,
994    "ccirc" => 265,
995    "ccups" => 10828,
996    "ccupssm" => 10832,
997    "cdot" => 267,
998    "cedil" => 184,
999    "cemptyv" => 10674,
1000    "cent" => 162,
1001    "centerdot" => 183,
1002    "cfr" => 120096,
1003    "chcy" => 1095,
1004    "check" => 10003,
1005    "checkmark" => 10003,
1006    "chi" => 967,
1007    "cir" => 9675,
1008    "cirE" => 10691,
1009    "circ" => 710,
1010    "circeq" => 8791,
1011    "circlearrowleft" => 8634,
1012    "circlearrowright" => 8635,
1013    "circledR" => 174,
1014    "circledS" => 9416,
1015    "circledast" => 8859,
1016    "circledcirc" => 8858,
1017    "circleddash" => 8861,
1018    "cire" => 8791,
1019    "cirfnint" => 10768,
1020    "cirmid" => 10991,
1021    "cirscir" => 10690,
1022    "clubs" => 9827,
1023    "clubsuit" => 9827,
1024    "colon" => 58,
1025    "colone" => 8788,
1026    "coloneq" => 8788,
1027    "comma" => 44,
1028    "commat" => 64,
1029    "comp" => 8705,
1030    "compfn" => 8728,
1031    "complement" => 8705,
1032    "complexes" => 8450,
1033    "cong" => 8773,
1034    "congdot" => 10861,
1035    "conint" => 8750,
1036    "copf" => 120148,
1037    "coprod" => 8720,
1038    "copy" => 169,
1039    "copysr" => 8471,
1040    "crarr" => 8629,
1041    "cross" => 10007,
1042    "cscr" => 119992,
1043    "csub" => 10959,
1044    "csube" => 10961,
1045    "csup" => 10960,
1046    "csupe" => 10962,
1047    "ctdot" => 8943,
1048    "cudarrl" => 10552,
1049    "cudarrr" => 10549,
1050    "cuepr" => 8926,
1051    "cuesc" => 8927,
1052    "cularr" => 8630,
1053    "cularrp" => 10557,
1054    "cup" => 8746,
1055    "cupbrcap" => 10824,
1056    "cupcap" => 10822,
1057    "cupcup" => 10826,
1058    "cupdot" => 8845,
1059    "cupor" => 10821,
1060    "cups" => 8746,
1061    "curarr" => 8631,
1062    "curarrm" => 10556,
1063    "curlyeqprec" => 8926,
1064    "curlyeqsucc" => 8927,
1065    "curlyvee" => 8910,
1066    "curlywedge" => 8911,
1067    "curren" => 164,
1068    "curvearrowleft" => 8630,
1069    "curvearrowright" => 8631,
1070    "cuvee" => 8910,
1071    "cuwed" => 8911,
1072    "cwconint" => 8754,
1073    "cwint" => 8753,
1074    "cylcty" => 9005,
1075    "dArr" => 8659,
1076    "dHar" => 10597,
1077    "dagger" => 8224,
1078    "daleth" => 8504,
1079    "darr" => 8595,
1080    "dash" => 8208,
1081    "dashv" => 8867,
1082    "dbkarow" => 10511,
1083    "dblac" => 733,
1084    "dcaron" => 271,
1085    "dcy" => 1076,
1086    "dd" => 8518,
1087    "ddagger" => 8225,
1088    "ddarr" => 8650,
1089    "ddotseq" => 10871,
1090    "deg" => 176,
1091    "delta" => 948,
1092    "demptyv" => 10673,
1093    "dfisht" => 10623,
1094    "dfr" => 120097,
1095    "dharl" => 8643,
1096    "dharr" => 8642,
1097    "diam" => 8900,
1098    "diamond" => 8900,
1099    "diamondsuit" => 9830,
1100    "diams" => 9830,
1101    "die" => 168,
1102    "digamma" => 989,
1103    "disin" => 8946,
1104    "div" => 247,
1105    "divide" => 247,
1106    "divideontimes" => 8903,
1107    "divonx" => 8903,
1108    "djcy" => 1106,
1109    "dlcorn" => 8990,
1110    "dlcrop" => 8973,
1111    "dollar" => 36,
1112    "dopf" => 120149,
1113    "dot" => 729,
1114    "doteq" => 8784,
1115    "doteqdot" => 8785,
1116    "dotminus" => 8760,
1117    "dotplus" => 8724,
1118    "dotsquare" => 8865,
1119    "doublebarwedge" => 8966,
1120    "downarrow" => 8595,
1121    "downdownarrows" => 8650,
1122    "downharpoonleft" => 8643,
1123    "downharpoonright" => 8642,
1124    "drbkarow" => 10512,
1125    "drcorn" => 8991,
1126    "drcrop" => 8972,
1127    "dscr" => 119993,
1128    "dscy" => 1109,
1129    "dsol" => 10742,
1130    "dstrok" => 273,
1131    "dtdot" => 8945,
1132    "dtri" => 9663,
1133    "dtrif" => 9662,
1134    "duarr" => 8693,
1135    "duhar" => 10607,
1136    "dwangle" => 10662,
1137    "dzcy" => 1119,
1138    "dzigrarr" => 10239,
1139    "eDDot" => 10871,
1140    "eDot" => 8785,
1141    "eacute" => 233,
1142    "easter" => 10862,
1143    "ecaron" => 283,
1144    "ecir" => 8790,
1145    "ecirc" => 234,
1146    "ecolon" => 8789,
1147    "ecy" => 1101,
1148    "edot" => 279,
1149    "ee" => 8519,
1150    "efDot" => 8786,
1151    "efr" => 120098,
1152    "eg" => 10906,
1153    "egrave" => 232,
1154    "egs" => 10902,
1155    "egsdot" => 10904,
1156    "el" => 10905,
1157    "elinters" => 9191,
1158    "ell" => 8467,
1159    "els" => 10901,
1160    "elsdot" => 10903,
1161    "emacr" => 275,
1162    "empty" => 8709,
1163    "emptyset" => 8709,
1164    "emptyv" => 8709,
1165    "emsp" => 8195,
1166    "emsp13" => 8196,
1167    "emsp14" => 8197,
1168    "eng" => 331,
1169    "ensp" => 8194,
1170    "eogon" => 281,
1171    "eopf" => 120150,
1172    "epar" => 8917,
1173    "eparsl" => 10723,
1174    "eplus" => 10865,
1175    "epsi" => 949,
1176    "epsilon" => 949,
1177    "epsiv" => 1013,
1178    "eqcirc" => 8790,
1179    "eqcolon" => 8789,
1180    "eqsim" => 8770,
1181    "eqslantgtr" => 10902,
1182    "eqslantless" => 10901,
1183    "equals" => 61,
1184    "equest" => 8799,
1185    "equiv" => 8801,
1186    "equivDD" => 10872,
1187    "eqvparsl" => 10725,
1188    "erDot" => 8787,
1189    "erarr" => 10609,
1190    "escr" => 8495,
1191    "esdot" => 8784,
1192    "esim" => 8770,
1193    "eta" => 951,
1194    "eth" => 240,
1195    "euml" => 235,
1196    "euro" => 8364,
1197    "excl" => 33,
1198    "exist" => 8707,
1199    "expectation" => 8496,
1200    "exponentiale" => 8519,
1201    "fallingdotseq" => 8786,
1202    "fcy" => 1092,
1203    "female" => 9792,
1204    "ffilig" => 64259,
1205    "fflig" => 64256,
1206    "ffllig" => 64260,
1207    "ffr" => 120099,
1208    "filig" => 64257,
1209    "fjlig" => 102,
1210    "flat" => 9837,
1211    "fllig" => 64258,
1212    "fltns" => 9649,
1213    "fnof" => 402,
1214    "fopf" => 120151,
1215    "forall" => 8704,
1216    "fork" => 8916,
1217    "forkv" => 10969,
1218    "fpartint" => 10765,
1219    "frac12" => 189,
1220    "frac13" => 8531,
1221    "frac14" => 188,
1222    "frac15" => 8533,
1223    "frac16" => 8537,
1224    "frac18" => 8539,
1225    "frac23" => 8532,
1226    "frac25" => 8534,
1227    "frac34" => 190,
1228    "frac35" => 8535,
1229    "frac38" => 8540,
1230    "frac45" => 8536,
1231    "frac56" => 8538,
1232    "frac58" => 8541,
1233    "frac78" => 8542,
1234    "frasl" => 8260,
1235    "frown" => 8994,
1236    "fscr" => 119995,
1237    "gE" => 8807,
1238    "gEl" => 10892,
1239    "gacute" => 501,
1240    "gamma" => 947,
1241    "gammad" => 989,
1242    "gap" => 10886,
1243    "gbreve" => 287,
1244    "gcirc" => 285,
1245    "gcy" => 1075,
1246    "gdot" => 289,
1247    "ge" => 8805,
1248    "gel" => 8923,
1249    "geq" => 8805,
1250    "geqq" => 8807,
1251    "geqslant" => 10878,
1252    "ges" => 10878,
1253    "gescc" => 10921,
1254    "gesdot" => 10880,
1255    "gesdoto" => 10882,
1256    "gesdotol" => 10884,
1257    "gesl" => 8923,
1258    "gesles" => 10900,
1259    "gfr" => 120100,
1260    "gg" => 8811,
1261    "ggg" => 8921,
1262    "gimel" => 8503,
1263    "gjcy" => 1107,
1264    "gl" => 8823,
1265    "glE" => 10898,
1266    "gla" => 10917,
1267    "glj" => 10916,
1268    "gnE" => 8809,
1269    "gnap" => 10890,
1270    "gnapprox" => 10890,
1271    "gne" => 10888,
1272    "gneq" => 10888,
1273    "gneqq" => 8809,
1274    "gnsim" => 8935,
1275    "gopf" => 120152,
1276    "grave" => 96,
1277    "gscr" => 8458,
1278    "gsim" => 8819,
1279    "gsime" => 10894,
1280    "gsiml" => 10896,
1281    "gt" => 62,
1282    "gtcc" => 10919,
1283    "gtcir" => 10874,
1284    "gtdot" => 8919,
1285    "gtlPar" => 10645,
1286    "gtquest" => 10876,
1287    "gtrapprox" => 10886,
1288    "gtrarr" => 10616,
1289    "gtrdot" => 8919,
1290    "gtreqless" => 8923,
1291    "gtreqqless" => 10892,
1292    "gtrless" => 8823,
1293    "gtrsim" => 8819,
1294    "gvertneqq" => 8809,
1295    "gvnE" => 8809,
1296    "hArr" => 8660,
1297    "hairsp" => 8202,
1298    "half" => 189,
1299    "hamilt" => 8459,
1300    "hardcy" => 1098,
1301    "harr" => 8596,
1302    "harrcir" => 10568,
1303    "harrw" => 8621,
1304    "hbar" => 8463,
1305    "hcirc" => 293,
1306    "hearts" => 9829,
1307    "heartsuit" => 9829,
1308    "hellip" => 8230,
1309    "hercon" => 8889,
1310    "hfr" => 120101,
1311    "hksearow" => 10533,
1312    "hkswarow" => 10534,
1313    "hoarr" => 8703,
1314    "homtht" => 8763,
1315    "hookleftarrow" => 8617,
1316    "hookrightarrow" => 8618,
1317    "hopf" => 120153,
1318    "horbar" => 8213,
1319    "hscr" => 119997,
1320    "hslash" => 8463,
1321    "hstrok" => 295,
1322    "hybull" => 8259,
1323    "hyphen" => 8208,
1324    "iacute" => 237,
1325    "ic" => 8291,
1326    "icirc" => 238,
1327    "icy" => 1080,
1328    "iecy" => 1077,
1329    "iexcl" => 161,
1330    "iff" => 8660,
1331    "ifr" => 120102,
1332    "igrave" => 236,
1333    "ii" => 8520,
1334    "iiiint" => 10764,
1335    "iiint" => 8749,
1336    "iinfin" => 10716,
1337    "iiota" => 8489,
1338    "ijlig" => 307,
1339    "imacr" => 299,
1340    "image" => 8465,
1341    "imagline" => 8464,
1342    "imagpart" => 8465,
1343    "imath" => 305,
1344    "imof" => 8887,
1345    "imped" => 437,
1346    "in" => 8712,
1347    "incare" => 8453,
1348    "infin" => 8734,
1349    "infintie" => 10717,
1350    "inodot" => 305,
1351    "int" => 8747,
1352    "intcal" => 8890,
1353    "integers" => 8484,
1354    "intercal" => 8890,
1355    "intlarhk" => 10775,
1356    "intprod" => 10812,
1357    "iocy" => 1105,
1358    "iogon" => 303,
1359    "iopf" => 120154,
1360    "iota" => 953,
1361    "iprod" => 10812,
1362    "iquest" => 191,
1363    "iscr" => 119998,
1364    "isin" => 8712,
1365    "isinE" => 8953,
1366    "isindot" => 8949,
1367    "isins" => 8948,
1368    "isinsv" => 8947,
1369    "isinv" => 8712,
1370    "it" => 8290,
1371    "itilde" => 297,
1372    "iukcy" => 1110,
1373    "iuml" => 239,
1374    "jcirc" => 309,
1375    "jcy" => 1081,
1376    "jfr" => 120103,
1377    "jmath" => 567,
1378    "jopf" => 120155,
1379    "jscr" => 119999,
1380    "jsercy" => 1112,
1381    "jukcy" => 1108,
1382    "kappa" => 954,
1383    "kappav" => 1008,
1384    "kcedil" => 311,
1385    "kcy" => 1082,
1386    "kfr" => 120104,
1387    "kgreen" => 312,
1388    "khcy" => 1093,
1389    "kjcy" => 1116,
1390    "kopf" => 120156,
1391    "kscr" => 120000,
1392    "lAarr" => 8666,
1393    "lArr" => 8656,
1394    "lAtail" => 10523,
1395    "lBarr" => 10510,
1396    "lE" => 8806,
1397    "lEg" => 10891,
1398    "lHar" => 10594,
1399    "lacute" => 314,
1400    "laemptyv" => 10676,
1401    "lagran" => 8466,
1402    "lambda" => 955,
1403    "lang" => 10216,
1404    "langd" => 10641,
1405    "langle" => 10216,
1406    "lap" => 10885,
1407    "laquo" => 171,
1408    "larr" => 8592,
1409    "larrb" => 8676,
1410    "larrbfs" => 10527,
1411    "larrfs" => 10525,
1412    "larrhk" => 8617,
1413    "larrlp" => 8619,
1414    "larrpl" => 10553,
1415    "larrsim" => 10611,
1416    "larrtl" => 8610,
1417    "lat" => 10923,
1418    "latail" => 10521,
1419    "late" => 10925,
1420    "lates" => 10925,
1421    "lbarr" => 10508,
1422    "lbbrk" => 10098,
1423    "lbrace" => 123,
1424    "lbrack" => 91,
1425    "lbrke" => 10635,
1426    "lbrksld" => 10639,
1427    "lbrkslu" => 10637,
1428    "lcaron" => 318,
1429    "lcedil" => 316,
1430    "lceil" => 8968,
1431    "lcub" => 123,
1432    "lcy" => 1083,
1433    "ldca" => 10550,
1434    "ldquo" => 8220,
1435    "ldquor" => 8222,
1436    "ldrdhar" => 10599,
1437    "ldrushar" => 10571,
1438    "ldsh" => 8626,
1439    "le" => 8804,
1440    "leftarrow" => 8592,
1441    "leftarrowtail" => 8610,
1442    "leftharpoondown" => 8637,
1443    "leftharpoonup" => 8636,
1444    "leftleftarrows" => 8647,
1445    "leftrightarrow" => 8596,
1446    "leftrightarrows" => 8646,
1447    "leftrightharpoons" => 8651,
1448    "leftrightsquigarrow" => 8621,
1449    "leftthreetimes" => 8907,
1450    "leg" => 8922,
1451    "leq" => 8804,
1452    "leqq" => 8806,
1453    "leqslant" => 10877,
1454    "les" => 10877,
1455    "lescc" => 10920,
1456    "lesdot" => 10879,
1457    "lesdoto" => 10881,
1458    "lesdotor" => 10883,
1459    "lesg" => 8922,
1460    "lesges" => 10899,
1461    "lessapprox" => 10885,
1462    "lessdot" => 8918,
1463    "lesseqgtr" => 8922,
1464    "lesseqqgtr" => 10891,
1465    "lessgtr" => 8822,
1466    "lesssim" => 8818,
1467    "lfisht" => 10620,
1468    "lfloor" => 8970,
1469    "lfr" => 120105,
1470    "lg" => 8822,
1471    "lgE" => 10897,
1472    "lhard" => 8637,
1473    "lharu" => 8636,
1474    "lharul" => 10602,
1475    "lhblk" => 9604,
1476    "ljcy" => 1113,
1477    "ll" => 8810,
1478    "llarr" => 8647,
1479    "llcorner" => 8990,
1480    "llhard" => 10603,
1481    "lltri" => 9722,
1482    "lmidot" => 320,
1483    "lmoust" => 9136,
1484    "lmoustache" => 9136,
1485    "lnE" => 8808,
1486    "lnap" => 10889,
1487    "lnapprox" => 10889,
1488    "lne" => 10887,
1489    "lneq" => 10887,
1490    "lneqq" => 8808,
1491    "lnsim" => 8934,
1492    "loang" => 10220,
1493    "loarr" => 8701,
1494    "lobrk" => 10214,
1495    "longleftarrow" => 10229,
1496    "longleftrightarrow" => 10231,
1497    "longmapsto" => 10236,
1498    "longrightarrow" => 10230,
1499    "looparrowleft" => 8619,
1500    "looparrowright" => 8620,
1501    "lopar" => 10629,
1502    "lopf" => 120157,
1503    "loplus" => 10797,
1504    "lotimes" => 10804,
1505    "lowast" => 8727,
1506    "lowbar" => 95,
1507    "loz" => 9674,
1508    "lozenge" => 9674,
1509    "lozf" => 10731,
1510    "lpar" => 40,
1511    "lparlt" => 10643,
1512    "lrarr" => 8646,
1513    "lrcorner" => 8991,
1514    "lrhar" => 8651,
1515    "lrhard" => 10605,
1516    "lrm" => 8206,
1517    "lrtri" => 8895,
1518    "lsaquo" => 8249,
1519    "lscr" => 120001,
1520    "lsh" => 8624,
1521    "lsim" => 8818,
1522    "lsime" => 10893,
1523    "lsimg" => 10895,
1524    "lsqb" => 91,
1525    "lsquo" => 8216,
1526    "lsquor" => 8218,
1527    "lstrok" => 322,
1528    "lt" => 60,
1529    "ltcc" => 10918,
1530    "ltcir" => 10873,
1531    "ltdot" => 8918,
1532    "lthree" => 8907,
1533    "ltimes" => 8905,
1534    "ltlarr" => 10614,
1535    "ltquest" => 10875,
1536    "ltrPar" => 10646,
1537    "ltri" => 9667,
1538    "ltrie" => 8884,
1539    "ltrif" => 9666,
1540    "lurdshar" => 10570,
1541    "luruhar" => 10598,
1542    "lvertneqq" => 8808,
1543    "lvnE" => 8808,
1544    "mDDot" => 8762,
1545    "macr" => 175,
1546    "male" => 9794,
1547    "malt" => 10016,
1548    "maltese" => 10016,
1549    "map" => 8614,
1550    "mapsto" => 8614,
1551    "mapstodown" => 8615,
1552    "mapstoleft" => 8612,
1553    "mapstoup" => 8613,
1554    "marker" => 9646,
1555    "mcomma" => 10793,
1556    "mcy" => 1084,
1557    "mdash" => 8212,
1558    "measuredangle" => 8737,
1559    "mfr" => 120106,
1560    "mho" => 8487,
1561    "micro" => 181,
1562    "mid" => 8739,
1563    "midast" => 42,
1564    "midcir" => 10992,
1565    "middot" => 183,
1566    "minus" => 8722,
1567    "minusb" => 8863,
1568    "minusd" => 8760,
1569    "minusdu" => 10794,
1570    "mlcp" => 10971,
1571    "mldr" => 8230,
1572    "mnplus" => 8723,
1573    "models" => 8871,
1574    "mopf" => 120158,
1575    "mp" => 8723,
1576    "mscr" => 120002,
1577    "mstpos" => 8766,
1578    "mu" => 956,
1579    "multimap" => 8888,
1580    "mumap" => 8888,
1581    "nGg" => 8921,
1582    "nGt" => 8811,
1583    "nGtv" => 8811,
1584    "nLeftarrow" => 8653,
1585    "nLeftrightarrow" => 8654,
1586    "nLl" => 8920,
1587    "nLt" => 8810,
1588    "nLtv" => 8810,
1589    "nRightarrow" => 8655,
1590    "nVDash" => 8879,
1591    "nVdash" => 8878,
1592    "nabla" => 8711,
1593    "nacute" => 324,
1594    "nang" => 8736,
1595    "nap" => 8777,
1596    "napE" => 10864,
1597    "napid" => 8779,
1598    "napos" => 329,
1599    "napprox" => 8777,
1600    "natur" => 9838,
1601    "natural" => 9838,
1602    "naturals" => 8469,
1603    "nbsp" => 160,
1604    "nbump" => 8782,
1605    "nbumpe" => 8783,
1606    "ncap" => 10819,
1607    "ncaron" => 328,
1608    "ncedil" => 326,
1609    "ncong" => 8775,
1610    "ncongdot" => 10861,
1611    "ncup" => 10818,
1612    "ncy" => 1085,
1613    "ndash" => 8211,
1614    "ne" => 8800,
1615    "neArr" => 8663,
1616    "nearhk" => 10532,
1617    "nearr" => 8599,
1618    "nearrow" => 8599,
1619    "nedot" => 8784,
1620    "nequiv" => 8802,
1621    "nesear" => 10536,
1622    "nesim" => 8770,
1623    "nexist" => 8708,
1624    "nexists" => 8708,
1625    "nfr" => 120107,
1626    "ngE" => 8807,
1627    "nge" => 8817,
1628    "ngeq" => 8817,
1629    "ngeqq" => 8807,
1630    "ngeqslant" => 10878,
1631    "nges" => 10878,
1632    "ngsim" => 8821,
1633    "ngt" => 8815,
1634    "ngtr" => 8815,
1635    "nhArr" => 8654,
1636    "nharr" => 8622,
1637    "nhpar" => 10994,
1638    "ni" => 8715,
1639    "nis" => 8956,
1640    "nisd" => 8954,
1641    "niv" => 8715,
1642    "njcy" => 1114,
1643    "nlArr" => 8653,
1644    "nlE" => 8806,
1645    "nlarr" => 8602,
1646    "nldr" => 8229,
1647    "nle" => 8816,
1648    "nleftarrow" => 8602,
1649    "nleftrightarrow" => 8622,
1650    "nleq" => 8816,
1651    "nleqq" => 8806,
1652    "nleqslant" => 10877,
1653    "nles" => 10877,
1654    "nless" => 8814,
1655    "nlsim" => 8820,
1656    "nlt" => 8814,
1657    "nltri" => 8938,
1658    "nltrie" => 8940,
1659    "nmid" => 8740,
1660    "nopf" => 120159,
1661    "not" => 172,
1662    "notin" => 8713,
1663    "notinE" => 8953,
1664    "notindot" => 8949,
1665    "notinva" => 8713,
1666    "notinvb" => 8951,
1667    "notinvc" => 8950,
1668    "notni" => 8716,
1669    "notniva" => 8716,
1670    "notnivb" => 8958,
1671    "notnivc" => 8957,
1672    "npar" => 8742,
1673    "nparallel" => 8742,
1674    "nparsl" => 11005,
1675    "npart" => 8706,
1676    "npolint" => 10772,
1677    "npr" => 8832,
1678    "nprcue" => 8928,
1679    "npre" => 10927,
1680    "nprec" => 8832,
1681    "npreceq" => 10927,
1682    "nrArr" => 8655,
1683    "nrarr" => 8603,
1684    "nrarrc" => 10547,
1685    "nrarrw" => 8605,
1686    "nrightarrow" => 8603,
1687    "nrtri" => 8939,
1688    "nrtrie" => 8941,
1689    "nsc" => 8833,
1690    "nsccue" => 8929,
1691    "nsce" => 10928,
1692    "nscr" => 120003,
1693    "nshortmid" => 8740,
1694    "nshortparallel" => 8742,
1695    "nsim" => 8769,
1696    "nsime" => 8772,
1697    "nsimeq" => 8772,
1698    "nsmid" => 8740,
1699    "nspar" => 8742,
1700    "nsqsube" => 8930,
1701    "nsqsupe" => 8931,
1702    "nsub" => 8836,
1703    "nsubE" => 10949,
1704    "nsube" => 8840,
1705    "nsubset" => 8834,
1706    "nsubseteq" => 8840,
1707    "nsubseteqq" => 10949,
1708    "nsucc" => 8833,
1709    "nsucceq" => 10928,
1710    "nsup" => 8837,
1711    "nsupE" => 10950,
1712    "nsupe" => 8841,
1713    "nsupset" => 8835,
1714    "nsupseteq" => 8841,
1715    "nsupseteqq" => 10950,
1716    "ntgl" => 8825,
1717    "ntilde" => 241,
1718    "ntlg" => 8824,
1719    "ntriangleleft" => 8938,
1720    "ntrianglelefteq" => 8940,
1721    "ntriangleright" => 8939,
1722    "ntrianglerighteq" => 8941,
1723    "nu" => 957,
1724    "num" => 35,
1725    "numero" => 8470,
1726    "numsp" => 8199,
1727    "nvDash" => 8877,
1728    "nvHarr" => 10500,
1729    "nvap" => 8781,
1730    "nvdash" => 8876,
1731    "nvge" => 8805,
1732    "nvgt" => 62,
1733    "nvinfin" => 10718,
1734    "nvlArr" => 10498,
1735    "nvle" => 8804,
1736    "nvlt" => 60,
1737    "nvltrie" => 8884,
1738    "nvrArr" => 10499,
1739    "nvrtrie" => 8885,
1740    "nvsim" => 8764,
1741    "nwArr" => 8662,
1742    "nwarhk" => 10531,
1743    "nwarr" => 8598,
1744    "nwarrow" => 8598,
1745    "nwnear" => 10535,
1746    "oS" => 9416,
1747    "oacute" => 243,
1748    "oast" => 8859,
1749    "ocir" => 8858,
1750    "ocirc" => 244,
1751    "ocy" => 1086,
1752    "odash" => 8861,
1753    "odblac" => 337,
1754    "odiv" => 10808,
1755    "odot" => 8857,
1756    "odsold" => 10684,
1757    "oelig" => 339,
1758    "ofcir" => 10687,
1759    "ofr" => 120108,
1760    "ogon" => 731,
1761    "ograve" => 242,
1762    "ogt" => 10689,
1763    "ohbar" => 10677,
1764    "ohm" => 937,
1765    "oint" => 8750,
1766    "olarr" => 8634,
1767    "olcir" => 10686,
1768    "olcross" => 10683,
1769    "oline" => 8254,
1770    "olt" => 10688,
1771    "omacr" => 333,
1772    "omega" => 969,
1773    "omicron" => 959,
1774    "omid" => 10678,
1775    "ominus" => 8854,
1776    "oopf" => 120160,
1777    "opar" => 10679,
1778    "operp" => 10681,
1779    "oplus" => 8853,
1780    "or" => 8744,
1781    "orarr" => 8635,
1782    "ord" => 10845,
1783    "order" => 8500,
1784    "orderof" => 8500,
1785    "ordf" => 170,
1786    "ordm" => 186,
1787    "origof" => 8886,
1788    "oror" => 10838,
1789    "orslope" => 10839,
1790    "orv" => 10843,
1791    "oscr" => 8500,
1792    "oslash" => 248,
1793    "osol" => 8856,
1794    "otilde" => 245,
1795    "otimes" => 8855,
1796    "otimesas" => 10806,
1797    "ouml" => 246,
1798    "ovbar" => 9021,
1799    "par" => 8741,
1800    "para" => 182,
1801    "parallel" => 8741,
1802    "parsim" => 10995,
1803    "parsl" => 11005,
1804    "part" => 8706,
1805    "pcy" => 1087,
1806    "percnt" => 37,
1807    "period" => 46,
1808    "permil" => 8240,
1809    "perp" => 8869,
1810    "pertenk" => 8241,
1811    "pfr" => 120109,
1812    "phi" => 966,
1813    "phiv" => 981,
1814    "phmmat" => 8499,
1815    "phone" => 9742,
1816    "pi" => 960,
1817    "pitchfork" => 8916,
1818    "piv" => 982,
1819    "planck" => 8463,
1820    "planckh" => 8462,
1821    "plankv" => 8463,
1822    "plus" => 43,
1823    "plusacir" => 10787,
1824    "plusb" => 8862,
1825    "pluscir" => 10786,
1826    "plusdo" => 8724,
1827    "plusdu" => 10789,
1828    "pluse" => 10866,
1829    "plusmn" => 177,
1830    "plussim" => 10790,
1831    "plustwo" => 10791,
1832    "pm" => 177,
1833    "pointint" => 10773,
1834    "popf" => 120161,
1835    "pound" => 163,
1836    "pr" => 8826,
1837    "prE" => 10931,
1838    "prap" => 10935,
1839    "prcue" => 8828,
1840    "pre" => 10927,
1841    "prec" => 8826,
1842    "precapprox" => 10935,
1843    "preccurlyeq" => 8828,
1844    "preceq" => 10927,
1845    "precnapprox" => 10937,
1846    "precneqq" => 10933,
1847    "precnsim" => 8936,
1848    "precsim" => 8830,
1849    "prime" => 8242,
1850    "primes" => 8473,
1851    "prnE" => 10933,
1852    "prnap" => 10937,
1853    "prnsim" => 8936,
1854    "prod" => 8719,
1855    "profalar" => 9006,
1856    "profline" => 8978,
1857    "profsurf" => 8979,
1858    "prop" => 8733,
1859    "propto" => 8733,
1860    "prsim" => 8830,
1861    "prurel" => 8880,
1862    "pscr" => 120005,
1863    "psi" => 968,
1864    "puncsp" => 8200,
1865    "qfr" => 120110,
1866    "qint" => 10764,
1867    "qopf" => 120162,
1868    "qprime" => 8279,
1869    "qscr" => 120006,
1870    "quaternions" => 8461,
1871    "quatint" => 10774,
1872    "quest" => 63,
1873    "questeq" => 8799,
1874    "quot" => 34,
1875    "rAarr" => 8667,
1876    "rArr" => 8658,
1877    "rAtail" => 10524,
1878    "rBarr" => 10511,
1879    "rHar" => 10596,
1880    "race" => 8765,
1881    "racute" => 341,
1882    "radic" => 8730,
1883    "raemptyv" => 10675,
1884    "rang" => 10217,
1885    "rangd" => 10642,
1886    "range" => 10661,
1887    "rangle" => 10217,
1888    "raquo" => 187,
1889    "rarr" => 8594,
1890    "rarrap" => 10613,
1891    "rarrb" => 8677,
1892    "rarrbfs" => 10528,
1893    "rarrc" => 10547,
1894    "rarrfs" => 10526,
1895    "rarrhk" => 8618,
1896    "rarrlp" => 8620,
1897    "rarrpl" => 10565,
1898    "rarrsim" => 10612,
1899    "rarrtl" => 8611,
1900    "rarrw" => 8605,
1901    "ratail" => 10522,
1902    "ratio" => 8758,
1903    "rationals" => 8474,
1904    "rbarr" => 10509,
1905    "rbbrk" => 10099,
1906    "rbrace" => 125,
1907    "rbrack" => 93,
1908    "rbrke" => 10636,
1909    "rbrksld" => 10638,
1910    "rbrkslu" => 10640,
1911    "rcaron" => 345,
1912    "rcedil" => 343,
1913    "rceil" => 8969,
1914    "rcub" => 125,
1915    "rcy" => 1088,
1916    "rdca" => 10551,
1917    "rdldhar" => 10601,
1918    "rdquo" => 8221,
1919    "rdquor" => 8221,
1920    "rdsh" => 8627,
1921    "real" => 8476,
1922    "realine" => 8475,
1923    "realpart" => 8476,
1924    "reals" => 8477,
1925    "rect" => 9645,
1926    "reg" => 174,
1927    "rfisht" => 10621,
1928    "rfloor" => 8971,
1929    "rfr" => 120111,
1930    "rhard" => 8641,
1931    "rharu" => 8640,
1932    "rharul" => 10604,
1933    "rho" => 961,
1934    "rhov" => 1009,
1935    "rightarrow" => 8594,
1936    "rightarrowtail" => 8611,
1937    "rightharpoondown" => 8641,
1938    "rightharpoonup" => 8640,
1939    "rightleftarrows" => 8644,
1940    "rightleftharpoons" => 8652,
1941    "rightrightarrows" => 8649,
1942    "rightsquigarrow" => 8605,
1943    "rightthreetimes" => 8908,
1944    "ring" => 730,
1945    "risingdotseq" => 8787,
1946    "rlarr" => 8644,
1947    "rlhar" => 8652,
1948    "rlm" => 8207,
1949    "rmoust" => 9137,
1950    "rmoustache" => 9137,
1951    "rnmid" => 10990,
1952    "roang" => 10221,
1953    "roarr" => 8702,
1954    "robrk" => 10215,
1955    "ropar" => 10630,
1956    "ropf" => 120163,
1957    "roplus" => 10798,
1958    "rotimes" => 10805,
1959    "rpar" => 41,
1960    "rpargt" => 10644,
1961    "rppolint" => 10770,
1962    "rrarr" => 8649,
1963    "rsaquo" => 8250,
1964    "rscr" => 120007,
1965    "rsh" => 8625,
1966    "rsqb" => 93,
1967    "rsquo" => 8217,
1968    "rsquor" => 8217,
1969    "rthree" => 8908,
1970    "rtimes" => 8906,
1971    "rtri" => 9657,
1972    "rtrie" => 8885,
1973    "rtrif" => 9656,
1974    "rtriltri" => 10702,
1975    "ruluhar" => 10600,
1976    "rx" => 8478,
1977    "sacute" => 347,
1978    "sbquo" => 8218,
1979    "sc" => 8827,
1980    "scE" => 10932,
1981    "scap" => 10936,
1982    "scaron" => 353,
1983    "sccue" => 8829,
1984    "sce" => 10928,
1985    "scedil" => 351,
1986    "scirc" => 349,
1987    "scnE" => 10934,
1988    "scnap" => 10938,
1989    "scnsim" => 8937,
1990    "scpolint" => 10771,
1991    "scsim" => 8831,
1992    "scy" => 1089,
1993    "sdot" => 8901,
1994    "sdotb" => 8865,
1995    "sdote" => 10854,
1996    "seArr" => 8664,
1997    "searhk" => 10533,
1998    "searr" => 8600,
1999    "searrow" => 8600,
2000    "sect" => 167,
2001    "semi" => 59,
2002    "seswar" => 10537,
2003    "setminus" => 8726,
2004    "setmn" => 8726,
2005    "sext" => 10038,
2006    "sfr" => 120112,
2007    "sfrown" => 8994,
2008    "sharp" => 9839,
2009    "shchcy" => 1097,
2010    "shcy" => 1096,
2011    "shortmid" => 8739,
2012    "shortparallel" => 8741,
2013    "shy" => 173,
2014    "sigma" => 963,
2015    "sigmaf" => 962,
2016    "sigmav" => 962,
2017    "sim" => 8764,
2018    "simdot" => 10858,
2019    "sime" => 8771,
2020    "simeq" => 8771,
2021    "simg" => 10910,
2022    "simgE" => 10912,
2023    "siml" => 10909,
2024    "simlE" => 10911,
2025    "simne" => 8774,
2026    "simplus" => 10788,
2027    "simrarr" => 10610,
2028    "slarr" => 8592,
2029    "smallsetminus" => 8726,
2030    "smashp" => 10803,
2031    "smeparsl" => 10724,
2032    "smid" => 8739,
2033    "smile" => 8995,
2034    "smt" => 10922,
2035    "smte" => 10924,
2036    "smtes" => 10924,
2037    "softcy" => 1100,
2038    "sol" => 47,
2039    "solb" => 10692,
2040    "solbar" => 9023,
2041    "sopf" => 120164,
2042    "spades" => 9824,
2043    "spadesuit" => 9824,
2044    "spar" => 8741,
2045    "sqcap" => 8851,
2046    "sqcaps" => 8851,
2047    "sqcup" => 8852,
2048    "sqcups" => 8852,
2049    "sqsub" => 8847,
2050    "sqsube" => 8849,
2051    "sqsubset" => 8847,
2052    "sqsubseteq" => 8849,
2053    "sqsup" => 8848,
2054    "sqsupe" => 8850,
2055    "sqsupset" => 8848,
2056    "sqsupseteq" => 8850,
2057    "squ" => 9633,
2058    "square" => 9633,
2059    "squarf" => 9642,
2060    "squf" => 9642,
2061    "srarr" => 8594,
2062    "sscr" => 120008,
2063    "ssetmn" => 8726,
2064    "ssmile" => 8995,
2065    "sstarf" => 8902,
2066    "star" => 9734,
2067    "starf" => 9733,
2068    "straightepsilon" => 1013,
2069    "straightphi" => 981,
2070    "strns" => 175,
2071    "sub" => 8834,
2072    "subE" => 10949,
2073    "subdot" => 10941,
2074    "sube" => 8838,
2075    "subedot" => 10947,
2076    "submult" => 10945,
2077    "subnE" => 10955,
2078    "subne" => 8842,
2079    "subplus" => 10943,
2080    "subrarr" => 10617,
2081    "subset" => 8834,
2082    "subseteq" => 8838,
2083    "subseteqq" => 10949,
2084    "subsetneq" => 8842,
2085    "subsetneqq" => 10955,
2086    "subsim" => 10951,
2087    "subsub" => 10965,
2088    "subsup" => 10963,
2089    "succ" => 8827,
2090    "succapprox" => 10936,
2091    "succcurlyeq" => 8829,
2092    "succeq" => 10928,
2093    "succnapprox" => 10938,
2094    "succneqq" => 10934,
2095    "succnsim" => 8937,
2096    "succsim" => 8831,
2097    "sum" => 8721,
2098    "sung" => 9834,
2099    "sup" => 8835,
2100    "sup1" => 185,
2101    "sup2" => 178,
2102    "sup3" => 179,
2103    "supE" => 10950,
2104    "supdot" => 10942,
2105    "supdsub" => 10968,
2106    "supe" => 8839,
2107    "supedot" => 10948,
2108    "suphsol" => 10185,
2109    "suphsub" => 10967,
2110    "suplarr" => 10619,
2111    "supmult" => 10946,
2112    "supnE" => 10956,
2113    "supne" => 8843,
2114    "supplus" => 10944,
2115    "supset" => 8835,
2116    "supseteq" => 8839,
2117    "supseteqq" => 10950,
2118    "supsetneq" => 8843,
2119    "supsetneqq" => 10956,
2120    "supsim" => 10952,
2121    "supsub" => 10964,
2122    "supsup" => 10966,
2123    "swArr" => 8665,
2124    "swarhk" => 10534,
2125    "swarr" => 8601,
2126    "swarrow" => 8601,
2127    "swnwar" => 10538,
2128    "szlig" => 223,
2129    "target" => 8982,
2130    "tau" => 964,
2131    "tbrk" => 9140,
2132    "tcaron" => 357,
2133    "tcedil" => 355,
2134    "tcy" => 1090,
2135    "tdot" => 8411,
2136    "telrec" => 8981,
2137    "tfr" => 120113,
2138    "there4" => 8756,
2139    "therefore" => 8756,
2140    "theta" => 952,
2141    "thetasym" => 977,
2142    "thetav" => 977,
2143    "thickapprox" => 8776,
2144    "thicksim" => 8764,
2145    "thinsp" => 8201,
2146    "thkap" => 8776,
2147    "thksim" => 8764,
2148    "thorn" => 254,
2149    "tilde" => 732,
2150    "times" => 215,
2151    "timesb" => 8864,
2152    "timesbar" => 10801,
2153    "timesd" => 10800,
2154    "tint" => 8749,
2155    "toea" => 10536,
2156    "top" => 8868,
2157    "topbot" => 9014,
2158    "topcir" => 10993,
2159    "topf" => 120165,
2160    "topfork" => 10970,
2161    "tosa" => 10537,
2162    "tprime" => 8244,
2163    "trade" => 8482,
2164    "triangle" => 9653,
2165    "triangledown" => 9663,
2166    "triangleleft" => 9667,
2167    "trianglelefteq" => 8884,
2168    "triangleq" => 8796,
2169    "triangleright" => 9657,
2170    "trianglerighteq" => 8885,
2171    "tridot" => 9708,
2172    "trie" => 8796,
2173    "triminus" => 10810,
2174    "triplus" => 10809,
2175    "trisb" => 10701,
2176    "tritime" => 10811,
2177    "trpezium" => 9186,
2178    "tscr" => 120009,
2179    "tscy" => 1094,
2180    "tshcy" => 1115,
2181    "tstrok" => 359,
2182    "twixt" => 8812,
2183    "twoheadleftarrow" => 8606,
2184    "twoheadrightarrow" => 8608,
2185    "uArr" => 8657,
2186    "uHar" => 10595,
2187    "uacute" => 250,
2188    "uarr" => 8593,
2189    "ubrcy" => 1118,
2190    "ubreve" => 365,
2191    "ucirc" => 251,
2192    "ucy" => 1091,
2193    "udarr" => 8645,
2194    "udblac" => 369,
2195    "udhar" => 10606,
2196    "ufisht" => 10622,
2197    "ufr" => 120114,
2198    "ugrave" => 249,
2199    "uharl" => 8639,
2200    "uharr" => 8638,
2201    "uhblk" => 9600,
2202    "ulcorn" => 8988,
2203    "ulcorner" => 8988,
2204    "ulcrop" => 8975,
2205    "ultri" => 9720,
2206    "umacr" => 363,
2207    "uml" => 168,
2208    "uogon" => 371,
2209    "uopf" => 120166,
2210    "uparrow" => 8593,
2211    "updownarrow" => 8597,
2212    "upharpoonleft" => 8639,
2213    "upharpoonright" => 8638,
2214    "uplus" => 8846,
2215    "upsi" => 965,
2216    "upsih" => 978,
2217    "upsilon" => 965,
2218    "upuparrows" => 8648,
2219    "urcorn" => 8989,
2220    "urcorner" => 8989,
2221    "urcrop" => 8974,
2222    "uring" => 367,
2223    "urtri" => 9721,
2224    "uscr" => 120010,
2225    "utdot" => 8944,
2226    "utilde" => 361,
2227    "utri" => 9653,
2228    "utrif" => 9652,
2229    "uuarr" => 8648,
2230    "uuml" => 252,
2231    "uwangle" => 10663,
2232    "vArr" => 8661,
2233    "vBar" => 10984,
2234    "vBarv" => 10985,
2235    "vDash" => 8872,
2236    "vangrt" => 10652,
2237    "varepsilon" => 1013,
2238    "varkappa" => 1008,
2239    "varnothing" => 8709,
2240    "varphi" => 981,
2241    "varpi" => 982,
2242    "varpropto" => 8733,
2243    "varr" => 8597,
2244    "varrho" => 1009,
2245    "varsigma" => 962,
2246    "varsubsetneq" => 8842,
2247    "varsubsetneqq" => 10955,
2248    "varsupsetneq" => 8843,
2249    "varsupsetneqq" => 10956,
2250    "vartheta" => 977,
2251    "vartriangleleft" => 8882,
2252    "vartriangleright" => 8883,
2253    "vcy" => 1074,
2254    "vdash" => 8866,
2255    "vee" => 8744,
2256    "veebar" => 8891,
2257    "veeeq" => 8794,
2258    "vellip" => 8942,
2259    "verbar" => 124,
2260    "vert" => 124,
2261    "vfr" => 120115,
2262    "vltri" => 8882,
2263    "vnsub" => 8834,
2264    "vnsup" => 8835,
2265    "vopf" => 120167,
2266    "vprop" => 8733,
2267    "vrtri" => 8883,
2268    "vscr" => 120011,
2269    "vsubnE" => 10955,
2270    "vsubne" => 8842,
2271    "vsupnE" => 10956,
2272    "vsupne" => 8843,
2273    "vzigzag" => 10650,
2274    "wcirc" => 373,
2275    "wedbar" => 10847,
2276    "wedge" => 8743,
2277    "wedgeq" => 8793,
2278    "weierp" => 8472,
2279    "wfr" => 120116,
2280    "wopf" => 120168,
2281    "wp" => 8472,
2282    "wr" => 8768,
2283    "wreath" => 8768,
2284    "wscr" => 120012,
2285    "xcap" => 8898,
2286    "xcirc" => 9711,
2287    "xcup" => 8899,
2288    "xdtri" => 9661,
2289    "xfr" => 120117,
2290    "xhArr" => 10234,
2291    "xharr" => 10231,
2292    "xi" => 958,
2293    "xlArr" => 10232,
2294    "xlarr" => 10229,
2295    "xmap" => 10236,
2296    "xnis" => 8955,
2297    "xodot" => 10752,
2298    "xopf" => 120169,
2299    "xoplus" => 10753,
2300    "xotime" => 10754,
2301    "xrArr" => 10233,
2302    "xrarr" => 10230,
2303    "xscr" => 120013,
2304    "xsqcup" => 10758,
2305    "xuplus" => 10756,
2306    "xutri" => 9651,
2307    "xvee" => 8897,
2308    "xwedge" => 8896,
2309    "yacute" => 253,
2310    "yacy" => 1103,
2311    "ycirc" => 375,
2312    "ycy" => 1099,
2313    "yen" => 165,
2314    "yfr" => 120118,
2315    "yicy" => 1111,
2316    "yopf" => 120170,
2317    "yscr" => 120014,
2318    "yucy" => 1102,
2319    "yuml" => 255,
2320    "zacute" => 378,
2321    "zcaron" => 382,
2322    "zcy" => 1079,
2323    "zdot" => 380,
2324    "zeetrf" => 8488,
2325    "zeta" => 950,
2326    "zfr" => 120119,
2327    "zhcy" => 1078,
2328    "zigrarr" => 8669,
2329    "zopf" => 120171,
2330    "zscr" => 120015,
2331    "zwj" => 8205,
2332    "zwnj" => 8204,
2333    }
2334}
2335
2336#[cfg(test)]
2337mod tests {
2338
2339    use crate::decoders::html::{add_html_token, html_to_text, text_to_html};
2340
2341    #[test]
2342    fn convert_text_to_html() {
2343        let inputs = [
2344            (
2345                "hello\nworld\n",
2346                "<html><body>hello<br/>world<br/></body></html>",
2347            ),
2348            ("using <>\n", "<html><body>using &lt;><br/></body></html>"),
2349        ];
2350
2351        for input in inputs {
2352            assert_eq!(text_to_html(input.0), input.1);
2353        }
2354    }
2355
2356    #[test]
2357    fn convert_html_to_text() {
2358        let inputs = [
2359            ("<html>hello<br/>world<br/></html>", "hello\nworld\n"),
2360            ("<html>using &lt;><br/></html>", "using <>\n"),
2361            ("test <not br/>tag<br />", "test tag\n"),
2362            ("<>< ><tag\n/>>hello    world< br \n />", ">hello world\n"),
2363            (
2364                concat!(
2365                    "<head><title>ignore head</title><not head>xyz</not head></head>",
2366                    "<h1>&lt;body&gt;</h1>"
2367                ),
2368                "<body>",
2369            ),
2370            (
2371                concat!(
2372                    "<p>what is &heartsuit;?</p><p>&#x000DF;&Abreve;&#914;&gamma; ",
2373                    "don&apos;t hurt me.</p>"
2374                ),
2375                "what is ♥?\nßĂΒγ don't hurt me.\n",
2376            ),
2377            (
2378                concat!(
2379                    "<!--[if mso]><style type=\"text/css\">body, table, td, a, p, ",
2380                    "span, ul, li {font-family: Arial, sans-serif!important;}</style><![endif]-->",
2381                    "this is <!-- <> < < < < ignore  > -> here -->the actual<!--> text"
2382                ),
2383                "this is the actual text",
2384            ),
2385            (
2386                "   < p >  hello < / p > < p > world < / p >   !!! < br > ",
2387                "hello\nworld\n!!!\n",
2388            ),
2389            (
2390                " <p>please unsubscribe <a href=#>here</a>.</p> ",
2391                "please unsubscribe here.\n",
2392            ),
2393        ];
2394
2395        for input in inputs {
2396            assert_eq!(html_to_text(input.0), input.1, "Failed for '{:?}'", input.0);
2397        }
2398    }
2399
2400    #[test]
2401    fn convert_html_entity() {
2402        let inputs = [
2403            ("&lt;", "<"),
2404            ("&#32;", " "),
2405            ("&#x20;", " "),
2406            ("&nbsp;", "\u{a0}"),
2407            ("&CounterClockwiseContourIntegral;", "∳"),
2408            ("&curvearrowright;", "↷"),
2409            ("&rarr;", "→"),
2410            ("&#xFFFFFFF;", "�"),
2411            ("&hmmm", "&hmmm"),
2412        ];
2413
2414        for input in inputs {
2415            let mut result = String::with_capacity(input.0.len());
2416            add_html_token(&mut result, input.0.as_bytes(), false);
2417            assert_eq!(result, input.1, "Failed for '{:?}", input.0);
2418        }
2419    }
2420}