Coverage Report

Created: 2025-08-12 06:35

/rust/registry/src/index.crates.io-6f17d22bba15001f/quick-xml-0.29.0/src/escapei.rs
Line
Count
Source (jump to first uncovered line)
1
//! Manage xml character escapes
2
3
use memchr::memchr2_iter;
4
use std::borrow::Cow;
5
use std::ops::Range;
6
7
#[cfg(test)]
8
use pretty_assertions::assert_eq;
9
10
/// Error for XML escape / unescape.
11
#[derive(Clone, Debug)]
12
pub enum EscapeError {
13
    /// Entity with Null character
14
    EntityWithNull(Range<usize>),
15
    /// Unrecognized escape symbol
16
    UnrecognizedSymbol(Range<usize>, String),
17
    /// Cannot find `;` after `&`
18
    UnterminatedEntity(Range<usize>),
19
    /// Cannot convert Hexa to utf8
20
    TooLongHexadecimal,
21
    /// Character is not a valid hexadecimal value
22
    InvalidHexadecimal(char),
23
    /// Cannot convert decimal to hexa
24
    TooLongDecimal,
25
    /// Character is not a valid decimal value
26
    InvalidDecimal(char),
27
    /// Not a valid unicode codepoint
28
    InvalidCodepoint(u32),
29
}
30
31
impl std::fmt::Display for EscapeError {
32
0
    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
33
0
        match self {
34
0
            EscapeError::EntityWithNull(e) => write!(
35
0
                f,
36
0
                "Error while escaping character at range {:?}: Null character entity not allowed",
37
0
                e
38
0
            ),
39
0
            EscapeError::UnrecognizedSymbol(rge, res) => write!(
40
0
                f,
41
0
                "Error while escaping character at range {:?}: Unrecognized escape symbol: {:?}",
42
0
                rge, res
43
0
            ),
44
0
            EscapeError::UnterminatedEntity(e) => write!(
45
0
                f,
46
0
                "Error while escaping character at range {:?}: Cannot find ';' after '&'",
47
0
                e
48
0
            ),
49
0
            EscapeError::TooLongHexadecimal => write!(f, "Cannot convert hexadecimal to utf8"),
50
0
            EscapeError::InvalidHexadecimal(e) => {
51
0
                write!(f, "'{}' is not a valid hexadecimal character", e)
52
            }
53
0
            EscapeError::TooLongDecimal => write!(f, "Cannot convert decimal to utf8"),
54
0
            EscapeError::InvalidDecimal(e) => write!(f, "'{}' is not a valid decimal character", e),
55
0
            EscapeError::InvalidCodepoint(n) => write!(f, "'{}' is not a valid codepoint", n),
56
        }
57
0
    }
58
}
59
60
impl std::error::Error for EscapeError {}
61
62
/// Escapes an `&str` and replaces all xml special characters (`<`, `>`, `&`, `'`, `"`)
63
/// with their corresponding xml escaped value.
64
///
65
/// This function performs following replacements:
66
///
67
/// | Character | Replacement
68
/// |-----------|------------
69
/// | `<`       | `&lt;`
70
/// | `>`       | `&gt;`
71
/// | `&`       | `&amp;`
72
/// | `'`       | `&apos;`
73
/// | `"`       | `&quot;`
74
0
pub fn escape(raw: &str) -> Cow<str> {
75
0
    _escape(raw, |ch| matches!(ch, b'<' | b'>' | b'&' | b'\'' | b'\"'))
76
0
}
77
78
/// Escapes an `&str` and replaces xml special characters (`<`, `>`, `&`)
79
/// with their corresponding xml escaped value.
80
///
81
/// Should only be used for escaping text content. In XML text content, it is allowed
82
/// (though not recommended) to leave the quote special characters `"` and `'` unescaped.
83
///
84
/// This function performs following replacements:
85
///
86
/// | Character | Replacement
87
/// |-----------|------------
88
/// | `<`       | `&lt;`
89
/// | `>`       | `&gt;`
90
/// | `&`       | `&amp;`
91
0
pub fn partial_escape(raw: &str) -> Cow<str> {
92
0
    _escape(raw, |ch| matches!(ch, b'<' | b'>' | b'&'))
93
0
}
94
95
/// Escapes an `&str` and replaces a subset of xml special characters (`<`, `>`,
96
/// `&`, `'`, `"`) with their corresponding xml escaped value.
97
0
pub(crate) fn _escape<F: Fn(u8) -> bool>(raw: &str, escape_chars: F) -> Cow<str> {
98
0
    let bytes = raw.as_bytes();
99
0
    let mut escaped = None;
100
0
    let mut iter = bytes.iter();
101
0
    let mut pos = 0;
102
0
    while let Some(i) = iter.position(|&b| escape_chars(b)) {
Unexecuted instantiation: quick_xml::escapei::_escape::<quick_xml::escapei::partial_escape::{closure#0}>::{closure#0}
Unexecuted instantiation: quick_xml::escapei::_escape::<quick_xml::escapei::escape::{closure#0}>::{closure#0}
103
0
        if escaped.is_none() {
104
0
            escaped = Some(Vec::with_capacity(raw.len()));
105
0
        }
106
0
        let escaped = escaped.as_mut().expect("initialized");
107
0
        let new_pos = pos + i;
108
0
        escaped.extend_from_slice(&bytes[pos..new_pos]);
109
0
        match bytes[new_pos] {
110
0
            b'<' => escaped.extend_from_slice(b"&lt;"),
111
0
            b'>' => escaped.extend_from_slice(b"&gt;"),
112
0
            b'\'' => escaped.extend_from_slice(b"&apos;"),
113
0
            b'&' => escaped.extend_from_slice(b"&amp;"),
114
0
            b'"' => escaped.extend_from_slice(b"&quot;"),
115
116
            // This set of escapes handles characters that should be escaped
117
            // in elements of xs:lists, because those characters works as
118
            // delimiters of list elements
119
0
            b'\t' => escaped.extend_from_slice(b"&#9;"),
120
0
            b'\n' => escaped.extend_from_slice(b"&#10;"),
121
0
            b'\r' => escaped.extend_from_slice(b"&#13;"),
122
0
            b' ' => escaped.extend_from_slice(b"&#32;"),
123
0
            _ => unreachable!(
124
0
                "Only '<', '>','\', '&', '\"', '\\t', '\\r', '\\n', and ' ' are escaped"
125
0
            ),
126
        }
127
0
        pos = new_pos + 1;
128
    }
129
130
0
    if let Some(mut escaped) = escaped {
131
0
        if let Some(raw) = bytes.get(pos..) {
132
0
            escaped.extend_from_slice(raw);
133
0
        }
134
        // SAFETY: we operate on UTF-8 input and search for an one byte chars only,
135
        // so all slices that was put to the `escaped` is a valid UTF-8 encoded strings
136
        // TODO: Can be replaced with `unsafe { String::from_utf8_unchecked() }`
137
        // if unsafe code will be allowed
138
0
        Cow::Owned(String::from_utf8(escaped).unwrap())
139
    } else {
140
0
        Cow::Borrowed(raw)
141
    }
142
0
}
Unexecuted instantiation: quick_xml::escapei::_escape::<quick_xml::escapei::partial_escape::{closure#0}>
Unexecuted instantiation: quick_xml::escapei::_escape::<quick_xml::escapei::escape::{closure#0}>
143
144
/// Unescape an `&str` and replaces all xml escaped characters (`&...;`) into
145
/// their corresponding value.
146
///
147
/// If feature `escape-html` is enabled, then recognizes all [HTML5 escapes].
148
///
149
/// [HTML5 escapes]: https://dev.w3.org/html5/html-author/charref
150
30.8M
pub fn unescape(raw: &str) -> Result<Cow<str>, EscapeError> {
151
30.8M
    unescape_with(raw, |_| None)
152
30.8M
}
153
154
/// Unescape an `&str` and replaces all xml escaped characters (`&...;`) into
155
/// their corresponding value, using a resolver function for custom entities.
156
///
157
/// If feature `escape-html` is enabled, then recognizes all [HTML5 escapes].
158
///
159
/// [HTML5 escapes]: https://dev.w3.org/html5/html-author/charref
160
33.7M
pub fn unescape_with<'input, 'entity, F>(
161
33.7M
    raw: &'input str,
162
33.7M
    mut resolve_entity: F,
163
33.7M
) -> Result<Cow<'input, str>, EscapeError>
164
33.7M
where
165
33.7M
    // the lifetime of the output comes from a capture or is `'static`
166
33.7M
    F: FnMut(&str) -> Option<&'entity str>,
167
33.7M
{
168
33.7M
    let bytes = raw.as_bytes();
169
33.7M
    let mut unescaped = None;
170
33.7M
    let mut last_end = 0;
171
33.7M
    let mut iter = memchr2_iter(b'&', b';', bytes);
172
63.0M
    while let Some(start) = iter.by_ref().find(|p| bytes[*p] == b'&') {
quick_xml::escapei::unescape_with::<quick_xml::escapei::unescape::{closure#0}>::{closure#0}
Line
Count
Source
172
23.1M
    while let Some(start) = iter.by_ref().find(|p| bytes[*p] == b'&') {
quick_xml::escapei::unescape_with::<<quick_xml::events::attributes::Attribute>::unescape_value::{closure#0}>::{closure#0}
Line
Count
Source
172
6.60M
    while let Some(start) = iter.by_ref().find(|p| bytes[*p] == b'&') {
Unexecuted instantiation: quick_xml::escapei::unescape_with::<<quick_xml::events::BytesText>::unescape::{closure#0}>::{closure#0}
173
29.3M
        match iter.next() {
174
29.3M
            Some(end) if bytes[end] == b';' => {
175
29.3M
                // append valid data
176
29.3M
                if unescaped.is_none() {
177
10.6M
                    unescaped = Some(String::with_capacity(raw.len()));
178
18.7M
                }
179
29.3M
                let unescaped = unescaped.as_mut().expect("initialized");
180
29.3M
                unescaped.push_str(&raw[last_end..start]);
181
29.3M
182
29.3M
                // search for character correctness
183
29.3M
                let pat = &raw[start + 1..end];
184
29.3M
                if let Some(entity) = pat.strip_prefix('#') {
185
0
                    let codepoint = parse_number(entity, start..end)?;
186
0
                    unescaped.push_str(codepoint.encode_utf8(&mut [0u8; 4]));
187
29.3M
                } else if let Some(value) = named_entity(pat) {
188
29.3M
                    unescaped.push_str(value);
189
29.3M
                } else if let Some(value) = resolve_entity(pat) {
190
0
                    unescaped.push_str(value);
191
0
                } else {
192
0
                    return Err(EscapeError::UnrecognizedSymbol(
193
0
                        start + 1..end,
194
0
                        pat.to_string(),
195
0
                    ));
196
                }
197
198
29.3M
                last_end = end + 1;
199
            }
200
0
            _ => return Err(EscapeError::UnterminatedEntity(start..raw.len())),
201
        }
202
    }
203
204
33.7M
    if let Some(mut unescaped) = unescaped {
205
10.6M
        if let Some(raw) = raw.get(last_end..) {
206
10.6M
            unescaped.push_str(raw);
207
10.6M
        }
208
10.6M
        Ok(Cow::Owned(unescaped))
209
    } else {
210
23.0M
        Ok(Cow::Borrowed(raw))
211
    }
212
33.7M
}
quick_xml::escapei::unescape_with::<quick_xml::escapei::unescape::{closure#0}>
Line
Count
Source
160
30.8M
pub fn unescape_with<'input, 'entity, F>(
161
30.8M
    raw: &'input str,
162
30.8M
    mut resolve_entity: F,
163
30.8M
) -> Result<Cow<'input, str>, EscapeError>
164
30.8M
where
165
30.8M
    // the lifetime of the output comes from a capture or is `'static`
166
30.8M
    F: FnMut(&str) -> Option<&'entity str>,
167
30.8M
{
168
30.8M
    let bytes = raw.as_bytes();
169
30.8M
    let mut unescaped = None;
170
30.8M
    let mut last_end = 0;
171
30.8M
    let mut iter = memchr2_iter(b'&', b';', bytes);
172
53.8M
    while let Some(start) = iter.by_ref().find(|p| bytes[*p] == b'&') {
173
22.9M
        match iter.next() {
174
22.9M
            Some(end) if bytes[end] == b';' => {
175
22.9M
                // append valid data
176
22.9M
                if unescaped.is_none() {
177
10.5M
                    unescaped = Some(String::with_capacity(raw.len()));
178
12.4M
                }
179
22.9M
                let unescaped = unescaped.as_mut().expect("initialized");
180
22.9M
                unescaped.push_str(&raw[last_end..start]);
181
22.9M
182
22.9M
                // search for character correctness
183
22.9M
                let pat = &raw[start + 1..end];
184
22.9M
                if let Some(entity) = pat.strip_prefix('#') {
185
0
                    let codepoint = parse_number(entity, start..end)?;
186
0
                    unescaped.push_str(codepoint.encode_utf8(&mut [0u8; 4]));
187
22.9M
                } else if let Some(value) = named_entity(pat) {
188
22.9M
                    unescaped.push_str(value);
189
22.9M
                } else if let Some(value) = resolve_entity(pat) {
190
0
                    unescaped.push_str(value);
191
0
                } else {
192
0
                    return Err(EscapeError::UnrecognizedSymbol(
193
0
                        start + 1..end,
194
0
                        pat.to_string(),
195
0
                    ));
196
                }
197
198
22.9M
                last_end = end + 1;
199
            }
200
0
            _ => return Err(EscapeError::UnterminatedEntity(start..raw.len())),
201
        }
202
    }
203
204
30.8M
    if let Some(mut unescaped) = unescaped {
205
10.5M
        if let Some(raw) = raw.get(last_end..) {
206
10.5M
            unescaped.push_str(raw);
207
10.5M
        }
208
10.5M
        Ok(Cow::Owned(unescaped))
209
    } else {
210
20.3M
        Ok(Cow::Borrowed(raw))
211
    }
212
30.8M
}
quick_xml::escapei::unescape_with::<<quick_xml::events::attributes::Attribute>::unescape_value::{closure#0}>
Line
Count
Source
160
2.85M
pub fn unescape_with<'input, 'entity, F>(
161
2.85M
    raw: &'input str,
162
2.85M
    mut resolve_entity: F,
163
2.85M
) -> Result<Cow<'input, str>, EscapeError>
164
2.85M
where
165
2.85M
    // the lifetime of the output comes from a capture or is `'static`
166
2.85M
    F: FnMut(&str) -> Option<&'entity str>,
167
2.85M
{
168
2.85M
    let bytes = raw.as_bytes();
169
2.85M
    let mut unescaped = None;
170
2.85M
    let mut last_end = 0;
171
2.85M
    let mut iter = memchr2_iter(b'&', b';', bytes);
172
9.26M
    while let Some(start) = iter.by_ref().find(|p| bytes[*p] == b'&') {
173
6.41M
        match iter.next() {
174
6.41M
            Some(end) if bytes[end] == b';' => {
175
6.41M
                // append valid data
176
6.41M
                if unescaped.is_none() {
177
88.9k
                    unescaped = Some(String::with_capacity(raw.len()));
178
6.32M
                }
179
6.41M
                let unescaped = unescaped.as_mut().expect("initialized");
180
6.41M
                unescaped.push_str(&raw[last_end..start]);
181
6.41M
182
6.41M
                // search for character correctness
183
6.41M
                let pat = &raw[start + 1..end];
184
6.41M
                if let Some(entity) = pat.strip_prefix('#') {
185
0
                    let codepoint = parse_number(entity, start..end)?;
186
0
                    unescaped.push_str(codepoint.encode_utf8(&mut [0u8; 4]));
187
6.41M
                } else if let Some(value) = named_entity(pat) {
188
6.41M
                    unescaped.push_str(value);
189
6.41M
                } else if let Some(value) = resolve_entity(pat) {
190
0
                    unescaped.push_str(value);
191
0
                } else {
192
0
                    return Err(EscapeError::UnrecognizedSymbol(
193
0
                        start + 1..end,
194
0
                        pat.to_string(),
195
0
                    ));
196
                }
197
198
6.41M
                last_end = end + 1;
199
            }
200
0
            _ => return Err(EscapeError::UnterminatedEntity(start..raw.len())),
201
        }
202
    }
203
204
2.85M
    if let Some(mut unescaped) = unescaped {
205
88.9k
        if let Some(raw) = raw.get(last_end..) {
206
88.9k
            unescaped.push_str(raw);
207
88.9k
        }
208
88.9k
        Ok(Cow::Owned(unescaped))
209
    } else {
210
2.76M
        Ok(Cow::Borrowed(raw))
211
    }
212
2.85M
}
Unexecuted instantiation: quick_xml::escapei::unescape_with::<<quick_xml::events::BytesText>::unescape::{closure#0}>
213
214
#[cfg(not(feature = "escape-html"))]
215
29.3M
fn named_entity(name: &str) -> Option<&str> {
216
    // match over strings are not allowed in const functions
217
29.3M
    let s = match name.as_bytes() {
218
29.3M
        b"lt" => "<",
219
9.91M
        b"gt" => ">",
220
5.26M
        b"amp" => "&",
221
4.05M
        b"apos" => "'",
222
4.05M
        b"quot" => "\"",
223
0
        _ => return None,
224
    };
225
29.3M
    Some(s)
226
29.3M
}
227
#[cfg(feature = "escape-html")]
228
fn named_entity(name: &str) -> Option<&str> {
229
    // imported from https://dev.w3.org/html5/html-author/charref
230
    // match over strings are not allowed in const functions
231
    //TODO: automate up-to-dating using https://html.spec.whatwg.org/entities.json
232
    let s = match name.as_bytes() {
233
        b"Tab" => "\u{09}",
234
        b"NewLine" => "\u{0A}",
235
        b"excl" => "\u{21}",
236
        b"quot" | b"QUOT" => "\u{22}",
237
        b"num" => "\u{23}",
238
        b"dollar" => "\u{24}",
239
        b"percnt" => "\u{25}",
240
        b"amp" | b"AMP" => "\u{26}",
241
        b"apos" => "\u{27}",
242
        b"lpar" => "\u{28}",
243
        b"rpar" => "\u{29}",
244
        b"ast" | b"midast" => "\u{2A}",
245
        b"plus" => "\u{2B}",
246
        b"comma" => "\u{2C}",
247
        b"period" => "\u{2E}",
248
        b"sol" => "\u{2F}",
249
        b"colon" => "\u{3A}",
250
        b"semi" => "\u{3B}",
251
        b"lt" | b"LT" => "\u{3C}",
252
        b"equals" => "\u{3D}",
253
        b"gt" | b"GT" => "\u{3E}",
254
        b"quest" => "\u{3F}",
255
        b"commat" => "\u{40}",
256
        b"lsqb" | b"lbrack" => "\u{5B}",
257
        b"bsol" => "\u{5C}",
258
        b"rsqb" | b"rbrack" => "\u{5D}",
259
        b"Hat" => "\u{5E}",
260
        b"lowbar" => "\u{5F}",
261
        b"grave" | b"DiacriticalGrave" => "\u{60}",
262
        b"lcub" | b"lbrace" => "\u{7B}",
263
        b"verbar" | b"vert" | b"VerticalLine" => "\u{7C}",
264
        b"rcub" | b"rbrace" => "\u{7D}",
265
        b"nbsp" | b"NonBreakingSpace" => "\u{A0}",
266
        b"iexcl" => "\u{A1}",
267
        b"cent" => "\u{A2}",
268
        b"pound" => "\u{A3}",
269
        b"curren" => "\u{A4}",
270
        b"yen" => "\u{A5}",
271
        b"brvbar" => "\u{A6}",
272
        b"sect" => "\u{A7}",
273
        b"Dot" | b"die" | b"DoubleDot" | b"uml" => "\u{A8}",
274
        b"copy" | b"COPY" => "\u{A9}",
275
        b"ordf" => "\u{AA}",
276
        b"laquo" => "\u{AB}",
277
        b"not" => "\u{AC}",
278
        b"shy" => "\u{AD}",
279
        b"reg" | b"circledR" | b"REG" => "\u{AE}",
280
        b"macr" | b"OverBar" | b"strns" => "\u{AF}",
281
        b"deg" => "\u{B0}",
282
        b"plusmn" | b"pm" | b"PlusMinus" => "\u{B1}",
283
        b"sup2" => "\u{B2}",
284
        b"sup3" => "\u{B3}",
285
        b"acute" | b"DiacriticalAcute" => "\u{B4}",
286
        b"micro" => "\u{B5}",
287
        b"para" => "\u{B6}",
288
        b"middot" | b"centerdot" | b"CenterDot" => "\u{B7}",
289
        b"cedil" | b"Cedilla" => "\u{B8}",
290
        b"sup1" => "\u{B9}",
291
        b"ordm" => "\u{BA}",
292
        b"raquo" => "\u{BB}",
293
        b"frac14" => "\u{BC}",
294
        b"frac12" | b"half" => "\u{BD}",
295
        b"frac34" => "\u{BE}",
296
        b"iquest" => "\u{BF}",
297
        b"Agrave" => "\u{C0}",
298
        b"Aacute" => "\u{C1}",
299
        b"Acirc" => "\u{C2}",
300
        b"Atilde" => "\u{C3}",
301
        b"Auml" => "\u{C4}",
302
        b"Aring" => "\u{C5}",
303
        b"AElig" => "\u{C6}",
304
        b"Ccedil" => "\u{C7}",
305
        b"Egrave" => "\u{C8}",
306
        b"Eacute" => "\u{C9}",
307
        b"Ecirc" => "\u{CA}",
308
        b"Euml" => "\u{CB}",
309
        b"Igrave" => "\u{CC}",
310
        b"Iacute" => "\u{CD}",
311
        b"Icirc" => "\u{CE}",
312
        b"Iuml" => "\u{CF}",
313
        b"ETH" => "\u{D0}",
314
        b"Ntilde" => "\u{D1}",
315
        b"Ograve" => "\u{D2}",
316
        b"Oacute" => "\u{D3}",
317
        b"Ocirc" => "\u{D4}",
318
        b"Otilde" => "\u{D5}",
319
        b"Ouml" => "\u{D6}",
320
        b"times" => "\u{D7}",
321
        b"Oslash" => "\u{D8}",
322
        b"Ugrave" => "\u{D9}",
323
        b"Uacute" => "\u{DA}",
324
        b"Ucirc" => "\u{DB}",
325
        b"Uuml" => "\u{DC}",
326
        b"Yacute" => "\u{DD}",
327
        b"THORN" => "\u{DE}",
328
        b"szlig" => "\u{DF}",
329
        b"agrave" => "\u{E0}",
330
        b"aacute" => "\u{E1}",
331
        b"acirc" => "\u{E2}",
332
        b"atilde" => "\u{E3}",
333
        b"auml" => "\u{E4}",
334
        b"aring" => "\u{E5}",
335
        b"aelig" => "\u{E6}",
336
        b"ccedil" => "\u{E7}",
337
        b"egrave" => "\u{E8}",
338
        b"eacute" => "\u{E9}",
339
        b"ecirc" => "\u{EA}",
340
        b"euml" => "\u{EB}",
341
        b"igrave" => "\u{EC}",
342
        b"iacute" => "\u{ED}",
343
        b"icirc" => "\u{EE}",
344
        b"iuml" => "\u{EF}",
345
        b"eth" => "\u{F0}",
346
        b"ntilde" => "\u{F1}",
347
        b"ograve" => "\u{F2}",
348
        b"oacute" => "\u{F3}",
349
        b"ocirc" => "\u{F4}",
350
        b"otilde" => "\u{F5}",
351
        b"ouml" => "\u{F6}",
352
        b"divide" | b"div" => "\u{F7}",
353
        b"oslash" => "\u{F8}",
354
        b"ugrave" => "\u{F9}",
355
        b"uacute" => "\u{FA}",
356
        b"ucirc" => "\u{FB}",
357
        b"uuml" => "\u{FC}",
358
        b"yacute" => "\u{FD}",
359
        b"thorn" => "\u{FE}",
360
        b"yuml" => "\u{FF}",
361
        b"Amacr" => "\u{10}",
362
        b"amacr" => "\u{10}",
363
        b"Abreve" => "\u{10}",
364
        b"abreve" => "\u{10}",
365
        b"Aogon" => "\u{10}",
366
        b"aogon" => "\u{10}",
367
        b"Cacute" => "\u{10}",
368
        b"cacute" => "\u{10}",
369
        b"Ccirc" => "\u{10}",
370
        b"ccirc" => "\u{10}",
371
        b"Cdot" => "\u{10}",
372
        b"cdot" => "\u{10}",
373
        b"Ccaron" => "\u{10}",
374
        b"ccaron" => "\u{10}",
375
        b"Dcaron" => "\u{10}",
376
        b"dcaron" => "\u{10}",
377
        b"Dstrok" => "\u{11}",
378
        b"dstrok" => "\u{11}",
379
        b"Emacr" => "\u{11}",
380
        b"emacr" => "\u{11}",
381
        b"Edot" => "\u{11}",
382
        b"edot" => "\u{11}",
383
        b"Eogon" => "\u{11}",
384
        b"eogon" => "\u{11}",
385
        b"Ecaron" => "\u{11}",
386
        b"ecaron" => "\u{11}",
387
        b"Gcirc" => "\u{11}",
388
        b"gcirc" => "\u{11}",
389
        b"Gbreve" => "\u{11}",
390
        b"gbreve" => "\u{11}",
391
        b"Gdot" => "\u{12}",
392
        b"gdot" => "\u{12}",
393
        b"Gcedil" => "\u{12}",
394
        b"Hcirc" => "\u{12}",
395
        b"hcirc" => "\u{12}",
396
        b"Hstrok" => "\u{12}",
397
        b"hstrok" => "\u{12}",
398
        b"Itilde" => "\u{12}",
399
        b"itilde" => "\u{12}",
400
        b"Imacr" => "\u{12}",
401
        b"imacr" => "\u{12}",
402
        b"Iogon" => "\u{12}",
403
        b"iogon" => "\u{12}",
404
        b"Idot" => "\u{13}",
405
        b"imath" | b"inodot" => "\u{13}",
406
        b"IJlig" => "\u{13}",
407
        b"ijlig" => "\u{13}",
408
        b"Jcirc" => "\u{13}",
409
        b"jcirc" => "\u{13}",
410
        b"Kcedil" => "\u{13}",
411
        b"kcedil" => "\u{13}",
412
        b"kgreen" => "\u{13}",
413
        b"Lacute" => "\u{13}",
414
        b"lacute" => "\u{13}",
415
        b"Lcedil" => "\u{13}",
416
        b"lcedil" => "\u{13}",
417
        b"Lcaron" => "\u{13}",
418
        b"lcaron" => "\u{13}",
419
        b"Lmidot" => "\u{13}",
420
        b"lmidot" => "\u{14}",
421
        b"Lstrok" => "\u{14}",
422
        b"lstrok" => "\u{14}",
423
        b"Nacute" => "\u{14}",
424
        b"nacute" => "\u{14}",
425
        b"Ncedil" => "\u{14}",
426
        b"ncedil" => "\u{14}",
427
        b"Ncaron" => "\u{14}",
428
        b"ncaron" => "\u{14}",
429
        b"napos" => "\u{14}",
430
        b"ENG" => "\u{14}",
431
        b"eng" => "\u{14}",
432
        b"Omacr" => "\u{14}",
433
        b"omacr" => "\u{14}",
434
        b"Odblac" => "\u{15}",
435
        b"odblac" => "\u{15}",
436
        b"OElig" => "\u{15}",
437
        b"oelig" => "\u{15}",
438
        b"Racute" => "\u{15}",
439
        b"racute" => "\u{15}",
440
        b"Rcedil" => "\u{15}",
441
        b"rcedil" => "\u{15}",
442
        b"Rcaron" => "\u{15}",
443
        b"rcaron" => "\u{15}",
444
        b"Sacute" => "\u{15}",
445
        b"sacute" => "\u{15}",
446
        b"Scirc" => "\u{15}",
447
        b"scirc" => "\u{15}",
448
        b"Scedil" => "\u{15}",
449
        b"scedil" => "\u{15}",
450
        b"Scaron" => "\u{16}",
451
        b"scaron" => "\u{16}",
452
        b"Tcedil" => "\u{16}",
453
        b"tcedil" => "\u{16}",
454
        b"Tcaron" => "\u{16}",
455
        b"tcaron" => "\u{16}",
456
        b"Tstrok" => "\u{16}",
457
        b"tstrok" => "\u{16}",
458
        b"Utilde" => "\u{16}",
459
        b"utilde" => "\u{16}",
460
        b"Umacr" => "\u{16}",
461
        b"umacr" => "\u{16}",
462
        b"Ubreve" => "\u{16}",
463
        b"ubreve" => "\u{16}",
464
        b"Uring" => "\u{16}",
465
        b"uring" => "\u{16}",
466
        b"Udblac" => "\u{17}",
467
        b"udblac" => "\u{17}",
468
        b"Uogon" => "\u{17}",
469
        b"uogon" => "\u{17}",
470
        b"Wcirc" => "\u{17}",
471
        b"wcirc" => "\u{17}",
472
        b"Ycirc" => "\u{17}",
473
        b"ycirc" => "\u{17}",
474
        b"Yuml" => "\u{17}",
475
        b"Zacute" => "\u{17}",
476
        b"zacute" => "\u{17}",
477
        b"Zdot" => "\u{17}",
478
        b"zdot" => "\u{17}",
479
        b"Zcaron" => "\u{17}",
480
        b"zcaron" => "\u{17}",
481
        b"fnof" => "\u{19}",
482
        b"imped" => "\u{1B}",
483
        b"gacute" => "\u{1F}",
484
        b"jmath" => "\u{23}",
485
        b"circ" => "\u{2C}",
486
        b"caron" | b"Hacek" => "\u{2C}",
487
        b"breve" | b"Breve" => "\u{2D}",
488
        b"dot" | b"DiacriticalDot" => "\u{2D}",
489
        b"ring" => "\u{2D}",
490
        b"ogon" => "\u{2D}",
491
        b"tilde" | b"DiacriticalTilde" => "\u{2D}",
492
        b"dblac" | b"DiacriticalDoubleAcute" => "\u{2D}",
493
        b"DownBreve" => "\u{31}",
494
        b"UnderBar" => "\u{33}",
495
        b"Alpha" => "\u{39}",
496
        b"Beta" => "\u{39}",
497
        b"Gamma" => "\u{39}",
498
        b"Delta" => "\u{39}",
499
        b"Epsilon" => "\u{39}",
500
        b"Zeta" => "\u{39}",
501
        b"Eta" => "\u{39}",
502
        b"Theta" => "\u{39}",
503
        b"Iota" => "\u{39}",
504
        b"Kappa" => "\u{39}",
505
        b"Lambda" => "\u{39}",
506
        b"Mu" => "\u{39}",
507
        b"Nu" => "\u{39}",
508
        b"Xi" => "\u{39}",
509
        b"Omicron" => "\u{39}",
510
        b"Pi" => "\u{3A}",
511
        b"Rho" => "\u{3A}",
512
        b"Sigma" => "\u{3A}",
513
        b"Tau" => "\u{3A}",
514
        b"Upsilon" => "\u{3A}",
515
        b"Phi" => "\u{3A}",
516
        b"Chi" => "\u{3A}",
517
        b"Psi" => "\u{3A}",
518
        b"Omega" => "\u{3A}",
519
        b"alpha" => "\u{3B}",
520
        b"beta" => "\u{3B}",
521
        b"gamma" => "\u{3B}",
522
        b"delta" => "\u{3B}",
523
        b"epsiv" | b"varepsilon" | b"epsilon" => "\u{3B}",
524
        b"zeta" => "\u{3B}",
525
        b"eta" => "\u{3B}",
526
        b"theta" => "\u{3B}",
527
        b"iota" => "\u{3B}",
528
        b"kappa" => "\u{3B}",
529
        b"lambda" => "\u{3B}",
530
        b"mu" => "\u{3B}",
531
        b"nu" => "\u{3B}",
532
        b"xi" => "\u{3B}",
533
        b"omicron" => "\u{3B}",
534
        b"pi" => "\u{3C}",
535
        b"rho" => "\u{3C}",
536
        b"sigmav" | b"varsigma" | b"sigmaf" => "\u{3C}",
537
        b"sigma" => "\u{3C}",
538
        b"tau" => "\u{3C}",
539
        b"upsi" | b"upsilon" => "\u{3C}",
540
        b"phi" | b"phiv" | b"varphi" => "\u{3C}",
541
        b"chi" => "\u{3C}",
542
        b"psi" => "\u{3C}",
543
        b"omega" => "\u{3C}",
544
        b"thetav" | b"vartheta" | b"thetasym" => "\u{3D}",
545
        b"Upsi" | b"upsih" => "\u{3D}",
546
        b"straightphi" => "\u{3D}",
547
        b"piv" | b"varpi" => "\u{3D}",
548
        b"Gammad" => "\u{3D}",
549
        b"gammad" | b"digamma" => "\u{3D}",
550
        b"kappav" | b"varkappa" => "\u{3F}",
551
        b"rhov" | b"varrho" => "\u{3F}",
552
        b"epsi" | b"straightepsilon" => "\u{3F}",
553
        b"bepsi" | b"backepsilon" => "\u{3F}",
554
        b"IOcy" => "\u{40}",
555
        b"DJcy" => "\u{40}",
556
        b"GJcy" => "\u{40}",
557
        b"Jukcy" => "\u{40}",
558
        b"DScy" => "\u{40}",
559
        b"Iukcy" => "\u{40}",
560
        b"YIcy" => "\u{40}",
561
        b"Jsercy" => "\u{40}",
562
        b"LJcy" => "\u{40}",
563
        b"NJcy" => "\u{40}",
564
        b"TSHcy" => "\u{40}",
565
        b"KJcy" => "\u{40}",
566
        b"Ubrcy" => "\u{40}",
567
        b"DZcy" => "\u{40}",
568
        b"Acy" => "\u{41}",
569
        b"Bcy" => "\u{41}",
570
        b"Vcy" => "\u{41}",
571
        b"Gcy" => "\u{41}",
572
        b"Dcy" => "\u{41}",
573
        b"IEcy" => "\u{41}",
574
        b"ZHcy" => "\u{41}",
575
        b"Zcy" => "\u{41}",
576
        b"Icy" => "\u{41}",
577
        b"Jcy" => "\u{41}",
578
        b"Kcy" => "\u{41}",
579
        b"Lcy" => "\u{41}",
580
        b"Mcy" => "\u{41}",
581
        b"Ncy" => "\u{41}",
582
        b"Ocy" => "\u{41}",
583
        b"Pcy" => "\u{41}",
584
        b"Rcy" => "\u{42}",
585
        b"Scy" => "\u{42}",
586
        b"Tcy" => "\u{42}",
587
        b"Ucy" => "\u{42}",
588
        b"Fcy" => "\u{42}",
589
        b"KHcy" => "\u{42}",
590
        b"TScy" => "\u{42}",
591
        b"CHcy" => "\u{42}",
592
        b"SHcy" => "\u{42}",
593
        b"SHCHcy" => "\u{42}",
594
        b"HARDcy" => "\u{42}",
595
        b"Ycy" => "\u{42}",
596
        b"SOFTcy" => "\u{42}",
597
        b"Ecy" => "\u{42}",
598
        b"YUcy" => "\u{42}",
599
        b"YAcy" => "\u{42}",
600
        b"acy" => "\u{43}",
601
        b"bcy" => "\u{43}",
602
        b"vcy" => "\u{43}",
603
        b"gcy" => "\u{43}",
604
        b"dcy" => "\u{43}",
605
        b"iecy" => "\u{43}",
606
        b"zhcy" => "\u{43}",
607
        b"zcy" => "\u{43}",
608
        b"icy" => "\u{43}",
609
        b"jcy" => "\u{43}",
610
        b"kcy" => "\u{43}",
611
        b"lcy" => "\u{43}",
612
        b"mcy" => "\u{43}",
613
        b"ncy" => "\u{43}",
614
        b"ocy" => "\u{43}",
615
        b"pcy" => "\u{43}",
616
        b"rcy" => "\u{44}",
617
        b"scy" => "\u{44}",
618
        b"tcy" => "\u{44}",
619
        b"ucy" => "\u{44}",
620
        b"fcy" => "\u{44}",
621
        b"khcy" => "\u{44}",
622
        b"tscy" => "\u{44}",
623
        b"chcy" => "\u{44}",
624
        b"shcy" => "\u{44}",
625
        b"shchcy" => "\u{44}",
626
        b"hardcy" => "\u{44}",
627
        b"ycy" => "\u{44}",
628
        b"softcy" => "\u{44}",
629
        b"ecy" => "\u{44}",
630
        b"yucy" => "\u{44}",
631
        b"yacy" => "\u{44}",
632
        b"iocy" => "\u{45}",
633
        b"djcy" => "\u{45}",
634
        b"gjcy" => "\u{45}",
635
        b"jukcy" => "\u{45}",
636
        b"dscy" => "\u{45}",
637
        b"iukcy" => "\u{45}",
638
        b"yicy" => "\u{45}",
639
        b"jsercy" => "\u{45}",
640
        b"ljcy" => "\u{45}",
641
        b"njcy" => "\u{45}",
642
        b"tshcy" => "\u{45}",
643
        b"kjcy" => "\u{45}",
644
        b"ubrcy" => "\u{45}",
645
        b"dzcy" => "\u{45}",
646
        b"ensp" => "\u{2002}",
647
        b"emsp" => "\u{2003}",
648
        b"emsp13" => "\u{2004}",
649
        b"emsp14" => "\u{2005}",
650
        b"numsp" => "\u{2007}",
651
        b"puncsp" => "\u{2008}",
652
        b"thinsp" | b"ThinSpace" => "\u{2009}",
653
        b"hairsp" | b"VeryThinSpace" => "\u{200A}",
654
        b"ZeroWidthSpace"
655
        | b"NegativeVeryThinSpace"
656
        | b"NegativeThinSpace"
657
        | b"NegativeMediumSpace"
658
        | b"NegativeThickSpace" => "\u{200B}",
659
        b"zwnj" => "\u{200C}",
660
        b"zwj" => "\u{200D}",
661
        b"lrm" => "\u{200E}",
662
        b"rlm" => "\u{200F}",
663
        b"hyphen" | b"dash" => "\u{2010}",
664
        b"ndash" => "\u{2013}",
665
        b"mdash" => "\u{2014}",
666
        b"horbar" => "\u{2015}",
667
        b"Verbar" | b"Vert" => "\u{2016}",
668
        b"lsquo" | b"OpenCurlyQuote" => "\u{2018}",
669
        b"rsquo" | b"rsquor" | b"CloseCurlyQuote" => "\u{2019}",
670
        b"lsquor" | b"sbquo" => "\u{201A}",
671
        b"ldquo" | b"OpenCurlyDoubleQuote" => "\u{201C}",
672
        b"rdquo" | b"rdquor" | b"CloseCurlyDoubleQuote" => "\u{201D}",
673
        b"ldquor" | b"bdquo" => "\u{201E}",
674
        b"dagger" => "\u{2020}",
675
        b"Dagger" | b"ddagger" => "\u{2021}",
676
        b"bull" | b"bullet" => "\u{2022}",
677
        b"nldr" => "\u{2025}",
678
        b"hellip" | b"mldr" => "\u{2026}",
679
        b"permil" => "\u{2030}",
680
        b"pertenk" => "\u{2031}",
681
        b"prime" => "\u{2032}",
682
        b"Prime" => "\u{2033}",
683
        b"tprime" => "\u{2034}",
684
        b"bprime" | b"backprime" => "\u{2035}",
685
        b"lsaquo" => "\u{2039}",
686
        b"rsaquo" => "\u{203A}",
687
        b"oline" => "\u{203E}",
688
        b"caret" => "\u{2041}",
689
        b"hybull" => "\u{2043}",
690
        b"frasl" => "\u{2044}",
691
        b"bsemi" => "\u{204F}",
692
        b"qprime" => "\u{2057}",
693
        b"MediumSpace" => "\u{205F}",
694
        b"NoBreak" => "\u{2060}",
695
        b"ApplyFunction" | b"af" => "\u{2061}",
696
        b"InvisibleTimes" | b"it" => "\u{2062}",
697
        b"InvisibleComma" | b"ic" => "\u{2063}",
698
        b"euro" => "\u{20AC}",
699
        b"tdot" | b"TripleDot" => "\u{20DB}",
700
        b"DotDot" => "\u{20DC}",
701
        b"Copf" | b"complexes" => "\u{2102}",
702
        b"incare" => "\u{2105}",
703
        b"gscr" => "\u{210A}",
704
        b"hamilt" | b"HilbertSpace" | b"Hscr" => "\u{210B}",
705
        b"Hfr" | b"Poincareplane" => "\u{210C}",
706
        b"quaternions" | b"Hopf" => "\u{210D}",
707
        b"planckh" => "\u{210E}",
708
        b"planck" | b"hbar" | b"plankv" | b"hslash" => "\u{210F}",
709
        b"Iscr" | b"imagline" => "\u{2110}",
710
        b"image" | b"Im" | b"imagpart" | b"Ifr" => "\u{2111}",
711
        b"Lscr" | b"lagran" | b"Laplacetrf" => "\u{2112}",
712
        b"ell" => "\u{2113}",
713
        b"Nopf" | b"naturals" => "\u{2115}",
714
        b"numero" => "\u{2116}",
715
        b"copysr" => "\u{2117}",
716
        b"weierp" | b"wp" => "\u{2118}",
717
        b"Popf" | b"primes" => "\u{2119}",
718
        b"rationals" | b"Qopf" => "\u{211A}",
719
        b"Rscr" | b"realine" => "\u{211B}",
720
        b"real" | b"Re" | b"realpart" | b"Rfr" => "\u{211C}",
721
        b"reals" | b"Ropf" => "\u{211D}",
722
        b"rx" => "\u{211E}",
723
        b"trade" | b"TRADE" => "\u{2122}",
724
        b"integers" | b"Zopf" => "\u{2124}",
725
        b"ohm" => "\u{2126}",
726
        b"mho" => "\u{2127}",
727
        b"Zfr" | b"zeetrf" => "\u{2128}",
728
        b"iiota" => "\u{2129}",
729
        b"angst" => "\u{212B}",
730
        b"bernou" | b"Bernoullis" | b"Bscr" => "\u{212C}",
731
        b"Cfr" | b"Cayleys" => "\u{212D}",
732
        b"escr" => "\u{212F}",
733
        b"Escr" | b"expectation" => "\u{2130}",
734
        b"Fscr" | b"Fouriertrf" => "\u{2131}",
735
        b"phmmat" | b"Mellintrf" | b"Mscr" => "\u{2133}",
736
        b"order" | b"orderof" | b"oscr" => "\u{2134}",
737
        b"alefsym" | b"aleph" => "\u{2135}",
738
        b"beth" => "\u{2136}",
739
        b"gimel" => "\u{2137}",
740
        b"daleth" => "\u{2138}",
741
        b"CapitalDifferentialD" | b"DD" => "\u{2145}",
742
        b"DifferentialD" | b"dd" => "\u{2146}",
743
        b"ExponentialE" | b"exponentiale" | b"ee" => "\u{2147}",
744
        b"ImaginaryI" | b"ii" => "\u{2148}",
745
        b"frac13" => "\u{2153}",
746
        b"frac23" => "\u{2154}",
747
        b"frac15" => "\u{2155}",
748
        b"frac25" => "\u{2156}",
749
        b"frac35" => "\u{2157}",
750
        b"frac45" => "\u{2158}",
751
        b"frac16" => "\u{2159}",
752
        b"frac56" => "\u{215A}",
753
        b"frac18" => "\u{215B}",
754
        b"frac38" => "\u{215C}",
755
        b"frac58" => "\u{215D}",
756
        b"frac78" => "\u{215E}",
757
        b"larr" | b"leftarrow" | b"LeftArrow" | b"slarr" | b"ShortLeftArrow" => "\u{2190}",
758
        b"uarr" | b"uparrow" | b"UpArrow" | b"ShortUpArrow" => "\u{2191}",
759
        b"rarr" | b"rightarrow" | b"RightArrow" | b"srarr" | b"ShortRightArrow" => "\u{2192}",
760
        b"darr" | b"downarrow" | b"DownArrow" | b"ShortDownArrow" => "\u{2193}",
761
        b"harr" | b"leftrightarrow" | b"LeftRightArrow" => "\u{2194}",
762
        b"varr" | b"updownarrow" | b"UpDownArrow" => "\u{2195}",
763
        b"nwarr" | b"UpperLeftArrow" | b"nwarrow" => "\u{2196}",
764
        b"nearr" | b"UpperRightArrow" | b"nearrow" => "\u{2197}",
765
        b"searr" | b"searrow" | b"LowerRightArrow" => "\u{2198}",
766
        b"swarr" | b"swarrow" | b"LowerLeftArrow" => "\u{2199}",
767
        b"nlarr" | b"nleftarrow" => "\u{219A}",
768
        b"nrarr" | b"nrightarrow" => "\u{219B}",
769
        b"rarrw" | b"rightsquigarrow" => "\u{219D}",
770
        b"Larr" | b"twoheadleftarrow" => "\u{219E}",
771
        b"Uarr" => "\u{219F}",
772
        b"Rarr" | b"twoheadrightarrow" => "\u{21A0}",
773
        b"Darr" => "\u{21A1}",
774
        b"larrtl" | b"leftarrowtail" => "\u{21A2}",
775
        b"rarrtl" | b"rightarrowtail" => "\u{21A3}",
776
        b"LeftTeeArrow" | b"mapstoleft" => "\u{21A4}",
777
        b"UpTeeArrow" | b"mapstoup" => "\u{21A5}",
778
        b"map" | b"RightTeeArrow" | b"mapsto" => "\u{21A6}",
779
        b"DownTeeArrow" | b"mapstodown" => "\u{21A7}",
780
        b"larrhk" | b"hookleftarrow" => "\u{21A9}",
781
        b"rarrhk" | b"hookrightarrow" => "\u{21AA}",
782
        b"larrlp" | b"looparrowleft" => "\u{21AB}",
783
        b"rarrlp" | b"looparrowright" => "\u{21AC}",
784
        b"harrw" | b"leftrightsquigarrow" => "\u{21AD}",
785
        b"nharr" | b"nleftrightarrow" => "\u{21AE}",
786
        b"lsh" | b"Lsh" => "\u{21B0}",
787
        b"rsh" | b"Rsh" => "\u{21B1}",
788
        b"ldsh" => "\u{21B2}",
789
        b"rdsh" => "\u{21B3}",
790
        b"crarr" => "\u{21B5}",
791
        b"cularr" | b"curvearrowleft" => "\u{21B6}",
792
        b"curarr" | b"curvearrowright" => "\u{21B7}",
793
        b"olarr" | b"circlearrowleft" => "\u{21BA}",
794
        b"orarr" | b"circlearrowright" => "\u{21BB}",
795
        b"lharu" | b"LeftVector" | b"leftharpoonup" => "\u{21BC}",
796
        b"lhard" | b"leftharpoondown" | b"DownLeftVector" => "\u{21BD}",
797
        b"uharr" | b"upharpoonright" | b"RightUpVector" => "\u{21BE}",
798
        b"uharl" | b"upharpoonleft" | b"LeftUpVector" => "\u{21BF}",
799
        b"rharu" | b"RightVector" | b"rightharpoonup" => "\u{21C0}",
800
        b"rhard" | b"rightharpoondown" | b"DownRightVector" => "\u{21C1}",
801
        b"dharr" | b"RightDownVector" | b"downharpoonright" => "\u{21C2}",
802
        b"dharl" | b"LeftDownVector" | b"downharpoonleft" => "\u{21C3}",
803
        b"rlarr" | b"rightleftarrows" | b"RightArrowLeftArrow" => "\u{21C4}",
804
        b"udarr" | b"UpArrowDownArrow" => "\u{21C5}",
805
        b"lrarr" | b"leftrightarrows" | b"LeftArrowRightArrow" => "\u{21C6}",
806
        b"llarr" | b"leftleftarrows" => "\u{21C7}",
807
        b"uuarr" | b"upuparrows" => "\u{21C8}",
808
        b"rrarr" | b"rightrightarrows" => "\u{21C9}",
809
        b"ddarr" | b"downdownarrows" => "\u{21CA}",
810
        b"lrhar" | b"ReverseEquilibrium" | b"leftrightharpoons" => "\u{21CB}",
811
        b"rlhar" | b"rightleftharpoons" | b"Equilibrium" => "\u{21CC}",
812
        b"nlArr" | b"nLeftarrow" => "\u{21CD}",
813
        b"nhArr" | b"nLeftrightarrow" => "\u{21CE}",
814
        b"nrArr" | b"nRightarrow" => "\u{21CF}",
815
        b"lArr" | b"Leftarrow" | b"DoubleLeftArrow" => "\u{21D0}",
816
        b"uArr" | b"Uparrow" | b"DoubleUpArrow" => "\u{21D1}",
817
        b"rArr" | b"Rightarrow" | b"Implies" | b"DoubleRightArrow" => "\u{21D2}",
818
        b"dArr" | b"Downarrow" | b"DoubleDownArrow" => "\u{21D3}",
819
        b"hArr" | b"Leftrightarrow" | b"DoubleLeftRightArrow" | b"iff" => "\u{21D4}",
820
        b"vArr" | b"Updownarrow" | b"DoubleUpDownArrow" => "\u{21D5}",
821
        b"nwArr" => "\u{21D6}",
822
        b"neArr" => "\u{21D7}",
823
        b"seArr" => "\u{21D8}",
824
        b"swArr" => "\u{21D9}",
825
        b"lAarr" | b"Lleftarrow" => "\u{21DA}",
826
        b"rAarr" | b"Rrightarrow" => "\u{21DB}",
827
        b"zigrarr" => "\u{21DD}",
828
        b"larrb" | b"LeftArrowBar" => "\u{21E4}",
829
        b"rarrb" | b"RightArrowBar" => "\u{21E5}",
830
        b"duarr" | b"DownArrowUpArrow" => "\u{21F5}",
831
        b"loarr" => "\u{21FD}",
832
        b"roarr" => "\u{21FE}",
833
        b"hoarr" => "\u{21FF}",
834
        b"forall" | b"ForAll" => "\u{2200}",
835
        b"comp" | b"complement" => "\u{2201}",
836
        b"part" | b"PartialD" => "\u{2202}",
837
        b"exist" | b"Exists" => "\u{2203}",
838
        b"nexist" | b"NotExists" | b"nexists" => "\u{2204}",
839
        b"empty" | b"emptyset" | b"emptyv" | b"varnothing" => "\u{2205}",
840
        b"nabla" | b"Del" => "\u{2207}",
841
        b"isin" | b"isinv" | b"Element" | b"in" => "\u{2208}",
842
        b"notin" | b"NotElement" | b"notinva" => "\u{2209}",
843
        b"niv" | b"ReverseElement" | b"ni" | b"SuchThat" => "\u{220B}",
844
        b"notni" | b"notniva" | b"NotReverseElement" => "\u{220C}",
845
        b"prod" | b"Product" => "\u{220F}",
846
        b"coprod" | b"Coproduct" => "\u{2210}",
847
        b"sum" | b"Sum" => "\u{2211}",
848
        b"minus" => "\u{2212}",
849
        b"mnplus" | b"mp" | b"MinusPlus" => "\u{2213}",
850
        b"plusdo" | b"dotplus" => "\u{2214}",
851
        b"setmn" | b"setminus" | b"Backslash" | b"ssetmn" | b"smallsetminus" => "\u{2216}",
852
        b"lowast" => "\u{2217}",
853
        b"compfn" | b"SmallCircle" => "\u{2218}",
854
        b"radic" | b"Sqrt" => "\u{221A}",
855
        b"prop" | b"propto" | b"Proportional" | b"vprop" | b"varpropto" => "\u{221D}",
856
        b"infin" => "\u{221E}",
857
        b"angrt" => "\u{221F}",
858
        b"ang" | b"angle" => "\u{2220}",
859
        b"angmsd" | b"measuredangle" => "\u{2221}",
860
        b"angsph" => "\u{2222}",
861
        b"mid" | b"VerticalBar" | b"smid" | b"shortmid" => "\u{2223}",
862
        b"nmid" | b"NotVerticalBar" | b"nsmid" | b"nshortmid" => "\u{2224}",
863
        b"par" | b"parallel" | b"DoubleVerticalBar" | b"spar" | b"shortparallel" => "\u{2225}",
864
        b"npar" | b"nparallel" | b"NotDoubleVerticalBar" | b"nspar" | b"nshortparallel" => {
865
            "\u{2226}"
866
        }
867
        b"and" | b"wedge" => "\u{2227}",
868
        b"or" | b"vee" => "\u{2228}",
869
        b"cap" => "\u{2229}",
870
        b"cup" => "\u{222A}",
871
        b"int" | b"Integral" => "\u{222B}",
872
        b"Int" => "\u{222C}",
873
        b"tint" | b"iiint" => "\u{222D}",
874
        b"conint" | b"oint" | b"ContourIntegral" => "\u{222E}",
875
        b"Conint" | b"DoubleContourIntegral" => "\u{222F}",
876
        b"Cconint" => "\u{2230}",
877
        b"cwint" => "\u{2231}",
878
        b"cwconint" | b"ClockwiseContourIntegral" => "\u{2232}",
879
        b"awconint" | b"CounterClockwiseContourIntegral" => "\u{2233}",
880
        b"there4" | b"therefore" | b"Therefore" => "\u{2234}",
881
        b"becaus" | b"because" | b"Because" => "\u{2235}",
882
        b"ratio" => "\u{2236}",
883
        b"Colon" | b"Proportion" => "\u{2237}",
884
        b"minusd" | b"dotminus" => "\u{2238}",
885
        b"mDDot" => "\u{223A}",
886
        b"homtht" => "\u{223B}",
887
        b"sim" | b"Tilde" | b"thksim" | b"thicksim" => "\u{223C}",
888
        b"bsim" | b"backsim" => "\u{223D}",
889
        b"ac" | b"mstpos" => "\u{223E}",
890
        b"acd" => "\u{223F}",
891
        b"wreath" | b"VerticalTilde" | b"wr" => "\u{2240}",
892
        b"nsim" | b"NotTilde" => "\u{2241}",
893
        b"esim" | b"EqualTilde" | b"eqsim" => "\u{2242}",
894
        b"sime" | b"TildeEqual" | b"simeq" => "\u{2243}",
895
        b"nsime" | b"nsimeq" | b"NotTildeEqual" => "\u{2244}",
896
        b"cong" | b"TildeFullEqual" => "\u{2245}",
897
        b"simne" => "\u{2246}",
898
        b"ncong" | b"NotTildeFullEqual" => "\u{2247}",
899
        b"asymp" | b"ap" | b"TildeTilde" | b"approx" | b"thkap" | b"thickapprox" => "\u{2248}",
900
        b"nap" | b"NotTildeTilde" | b"napprox" => "\u{2249}",
901
        b"ape" | b"approxeq" => "\u{224A}",
902
        b"apid" => "\u{224B}",
903
        b"bcong" | b"backcong" => "\u{224C}",
904
        b"asympeq" | b"CupCap" => "\u{224D}",
905
        b"bump" | b"HumpDownHump" | b"Bumpeq" => "\u{224E}",
906
        b"bumpe" | b"HumpEqual" | b"bumpeq" => "\u{224F}",
907
        b"esdot" | b"DotEqual" | b"doteq" => "\u{2250}",
908
        b"eDot" | b"doteqdot" => "\u{2251}",
909
        b"efDot" | b"fallingdotseq" => "\u{2252}",
910
        b"erDot" | b"risingdotseq" => "\u{2253}",
911
        b"colone" | b"coloneq" | b"Assign" => "\u{2254}",
912
        b"ecolon" | b"eqcolon" => "\u{2255}",
913
        b"ecir" | b"eqcirc" => "\u{2256}",
914
        b"cire" | b"circeq" => "\u{2257}",
915
        b"wedgeq" => "\u{2259}",
916
        b"veeeq" => "\u{225A}",
917
        b"trie" | b"triangleq" => "\u{225C}",
918
        b"equest" | b"questeq" => "\u{225F}",
919
        b"ne" | b"NotEqual" => "\u{2260}",
920
        b"equiv" | b"Congruent" => "\u{2261}",
921
        b"nequiv" | b"NotCongruent" => "\u{2262}",
922
        b"le" | b"leq" => "\u{2264}",
923
        b"ge" | b"GreaterEqual" | b"geq" => "\u{2265}",
924
        b"lE" | b"LessFullEqual" | b"leqq" => "\u{2266}",
925
        b"gE" | b"GreaterFullEqual" | b"geqq" => "\u{2267}",
926
        b"lnE" | b"lneqq" => "\u{2268}",
927
        b"gnE" | b"gneqq" => "\u{2269}",
928
        b"Lt" | b"NestedLessLess" | b"ll" => "\u{226A}",
929
        b"Gt" | b"NestedGreaterGreater" | b"gg" => "\u{226B}",
930
        b"twixt" | b"between" => "\u{226C}",
931
        b"NotCupCap" => "\u{226D}",
932
        b"nlt" | b"NotLess" | b"nless" => "\u{226E}",
933
        b"ngt" | b"NotGreater" | b"ngtr" => "\u{226F}",
934
        b"nle" | b"NotLessEqual" | b"nleq" => "\u{2270}",
935
        b"nge" | b"NotGreaterEqual" | b"ngeq" => "\u{2271}",
936
        b"lsim" | b"LessTilde" | b"lesssim" => "\u{2272}",
937
        b"gsim" | b"gtrsim" | b"GreaterTilde" => "\u{2273}",
938
        b"nlsim" | b"NotLessTilde" => "\u{2274}",
939
        b"ngsim" | b"NotGreaterTilde" => "\u{2275}",
940
        b"lg" | b"lessgtr" | b"LessGreater" => "\u{2276}",
941
        b"gl" | b"gtrless" | b"GreaterLess" => "\u{2277}",
942
        b"ntlg" | b"NotLessGreater" => "\u{2278}",
943
        b"ntgl" | b"NotGreaterLess" => "\u{2279}",
944
        b"pr" | b"Precedes" | b"prec" => "\u{227A}",
945
        b"sc" | b"Succeeds" | b"succ" => "\u{227B}",
946
        b"prcue" | b"PrecedesSlantEqual" | b"preccurlyeq" => "\u{227C}",
947
        b"sccue" | b"SucceedsSlantEqual" | b"succcurlyeq" => "\u{227D}",
948
        b"prsim" | b"precsim" | b"PrecedesTilde" => "\u{227E}",
949
        b"scsim" | b"succsim" | b"SucceedsTilde" => "\u{227F}",
950
        b"npr" | b"nprec" | b"NotPrecedes" => "\u{2280}",
951
        b"nsc" | b"nsucc" | b"NotSucceeds" => "\u{2281}",
952
        b"sub" | b"subset" => "\u{2282}",
953
        b"sup" | b"supset" | b"Superset" => "\u{2283}",
954
        b"nsub" => "\u{2284}",
955
        b"nsup" => "\u{2285}",
956
        b"sube" | b"SubsetEqual" | b"subseteq" => "\u{2286}",
957
        b"supe" | b"supseteq" | b"SupersetEqual" => "\u{2287}",
958
        b"nsube" | b"nsubseteq" | b"NotSubsetEqual" => "\u{2288}",
959
        b"nsupe" | b"nsupseteq" | b"NotSupersetEqual" => "\u{2289}",
960
        b"subne" | b"subsetneq" => "\u{228A}",
961
        b"supne" | b"supsetneq" => "\u{228B}",
962
        b"cupdot" => "\u{228D}",
963
        b"uplus" | b"UnionPlus" => "\u{228E}",
964
        b"sqsub" | b"SquareSubset" | b"sqsubset" => "\u{228F}",
965
        b"sqsup" | b"SquareSuperset" | b"sqsupset" => "\u{2290}",
966
        b"sqsube" | b"SquareSubsetEqual" | b"sqsubseteq" => "\u{2291}",
967
        b"sqsupe" | b"SquareSupersetEqual" | b"sqsupseteq" => "\u{2292}",
968
        b"sqcap" | b"SquareIntersection" => "\u{2293}",
969
        b"sqcup" | b"SquareUnion" => "\u{2294}",
970
        b"oplus" | b"CirclePlus" => "\u{2295}",
971
        b"ominus" | b"CircleMinus" => "\u{2296}",
972
        b"otimes" | b"CircleTimes" => "\u{2297}",
973
        b"osol" => "\u{2298}",
974
        b"odot" | b"CircleDot" => "\u{2299}",
975
        b"ocir" | b"circledcirc" => "\u{229A}",
976
        b"oast" | b"circledast" => "\u{229B}",
977
        b"odash" | b"circleddash" => "\u{229D}",
978
        b"plusb" | b"boxplus" => "\u{229E}",
979
        b"minusb" | b"boxminus" => "\u{229F}",
980
        b"timesb" | b"boxtimes" => "\u{22A0}",
981
        b"sdotb" | b"dotsquare" => "\u{22A1}",
982
        b"vdash" | b"RightTee" => "\u{22A2}",
983
        b"dashv" | b"LeftTee" => "\u{22A3}",
984
        b"top" | b"DownTee" => "\u{22A4}",
985
        b"bottom" | b"bot" | b"perp" | b"UpTee" => "\u{22A5}",
986
        b"models" => "\u{22A7}",
987
        b"vDash" | b"DoubleRightTee" => "\u{22A8}",
988
        b"Vdash" => "\u{22A9}",
989
        b"Vvdash" => "\u{22AA}",
990
        b"VDash" => "\u{22AB}",
991
        b"nvdash" => "\u{22AC}",
992
        b"nvDash" => "\u{22AD}",
993
        b"nVdash" => "\u{22AE}",
994
        b"nVDash" => "\u{22AF}",
995
        b"prurel" => "\u{22B0}",
996
        b"vltri" | b"vartriangleleft" | b"LeftTriangle" => "\u{22B2}",
997
        b"vrtri" | b"vartriangleright" | b"RightTriangle" => "\u{22B3}",
998
        b"ltrie" | b"trianglelefteq" | b"LeftTriangleEqual" => "\u{22B4}",
999
        b"rtrie" | b"trianglerighteq" | b"RightTriangleEqual" => "\u{22B5}",
1000
        b"origof" => "\u{22B6}",
1001
        b"imof" => "\u{22B7}",
1002
        b"mumap" | b"multimap" => "\u{22B8}",
1003
        b"hercon" => "\u{22B9}",
1004
        b"intcal" | b"intercal" => "\u{22BA}",
1005
        b"veebar" => "\u{22BB}",
1006
        b"barvee" => "\u{22BD}",
1007
        b"angrtvb" => "\u{22BE}",
1008
        b"lrtri" => "\u{22BF}",
1009
        b"xwedge" | b"Wedge" | b"bigwedge" => "\u{22C0}",
1010
        b"xvee" | b"Vee" | b"bigvee" => "\u{22C1}",
1011
        b"xcap" | b"Intersection" | b"bigcap" => "\u{22C2}",
1012
        b"xcup" | b"Union" | b"bigcup" => "\u{22C3}",
1013
        b"diam" | b"diamond" | b"Diamond" => "\u{22C4}",
1014
        b"sdot" => "\u{22C5}",
1015
        b"sstarf" | b"Star" => "\u{22C6}",
1016
        b"divonx" | b"divideontimes" => "\u{22C7}",
1017
        b"bowtie" => "\u{22C8}",
1018
        b"ltimes" => "\u{22C9}",
1019
        b"rtimes" => "\u{22CA}",
1020
        b"lthree" | b"leftthreetimes" => "\u{22CB}",
1021
        b"rthree" | b"rightthreetimes" => "\u{22CC}",
1022
        b"bsime" | b"backsimeq" => "\u{22CD}",
1023
        b"cuvee" | b"curlyvee" => "\u{22CE}",
1024
        b"cuwed" | b"curlywedge" => "\u{22CF}",
1025
        b"Sub" | b"Subset" => "\u{22D0}",
1026
        b"Sup" | b"Supset" => "\u{22D1}",
1027
        b"Cap" => "\u{22D2}",
1028
        b"Cup" => "\u{22D3}",
1029
        b"fork" | b"pitchfork" => "\u{22D4}",
1030
        b"epar" => "\u{22D5}",
1031
        b"ltdot" | b"lessdot" => "\u{22D6}",
1032
        b"gtdot" | b"gtrdot" => "\u{22D7}",
1033
        b"Ll" => "\u{22D8}",
1034
        b"Gg" | b"ggg" => "\u{22D9}",
1035
        b"leg" | b"LessEqualGreater" | b"lesseqgtr" => "\u{22DA}",
1036
        b"gel" | b"gtreqless" | b"GreaterEqualLess" => "\u{22DB}",
1037
        b"cuepr" | b"curlyeqprec" => "\u{22DE}",
1038
        b"cuesc" | b"curlyeqsucc" => "\u{22DF}",
1039
        b"nprcue" | b"NotPrecedesSlantEqual" => "\u{22E0}",
1040
        b"nsccue" | b"NotSucceedsSlantEqual" => "\u{22E1}",
1041
        b"nsqsube" | b"NotSquareSubsetEqual" => "\u{22E2}",
1042
        b"nsqsupe" | b"NotSquareSupersetEqual" => "\u{22E3}",
1043
        b"lnsim" => "\u{22E6}",
1044
        b"gnsim" => "\u{22E7}",
1045
        b"prnsim" | b"precnsim" => "\u{22E8}",
1046
        b"scnsim" | b"succnsim" => "\u{22E9}",
1047
        b"nltri" | b"ntriangleleft" | b"NotLeftTriangle" => "\u{22EA}",
1048
        b"nrtri" | b"ntriangleright" | b"NotRightTriangle" => "\u{22EB}",
1049
        b"nltrie" | b"ntrianglelefteq" | b"NotLeftTriangleEqual" => "\u{22EC}",
1050
        b"nrtrie" | b"ntrianglerighteq" | b"NotRightTriangleEqual" => "\u{22ED}",
1051
        b"vellip" => "\u{22EE}",
1052
        b"ctdot" => "\u{22EF}",
1053
        b"utdot" => "\u{22F0}",
1054
        b"dtdot" => "\u{22F1}",
1055
        b"disin" => "\u{22F2}",
1056
        b"isinsv" => "\u{22F3}",
1057
        b"isins" => "\u{22F4}",
1058
        b"isindot" => "\u{22F5}",
1059
        b"notinvc" => "\u{22F6}",
1060
        b"notinvb" => "\u{22F7}",
1061
        b"isinE" => "\u{22F9}",
1062
        b"nisd" => "\u{22FA}",
1063
        b"xnis" => "\u{22FB}",
1064
        b"nis" => "\u{22FC}",
1065
        b"notnivc" => "\u{22FD}",
1066
        b"notnivb" => "\u{22FE}",
1067
        b"barwed" | b"barwedge" => "\u{2305}",
1068
        b"Barwed" | b"doublebarwedge" => "\u{2306}",
1069
        b"lceil" | b"LeftCeiling" => "\u{2308}",
1070
        b"rceil" | b"RightCeiling" => "\u{2309}",
1071
        b"lfloor" | b"LeftFloor" => "\u{230A}",
1072
        b"rfloor" | b"RightFloor" => "\u{230B}",
1073
        b"drcrop" => "\u{230C}",
1074
        b"dlcrop" => "\u{230D}",
1075
        b"urcrop" => "\u{230E}",
1076
        b"ulcrop" => "\u{230F}",
1077
        b"bnot" => "\u{2310}",
1078
        b"profline" => "\u{2312}",
1079
        b"profsurf" => "\u{2313}",
1080
        b"telrec" => "\u{2315}",
1081
        b"target" => "\u{2316}",
1082
        b"ulcorn" | b"ulcorner" => "\u{231C}",
1083
        b"urcorn" | b"urcorner" => "\u{231D}",
1084
        b"dlcorn" | b"llcorner" => "\u{231E}",
1085
        b"drcorn" | b"lrcorner" => "\u{231F}",
1086
        b"frown" | b"sfrown" => "\u{2322}",
1087
        b"smile" | b"ssmile" => "\u{2323}",
1088
        b"cylcty" => "\u{232D}",
1089
        b"profalar" => "\u{232E}",
1090
        b"topbot" => "\u{2336}",
1091
        b"ovbar" => "\u{233D}",
1092
        b"solbar" => "\u{233F}",
1093
        b"angzarr" => "\u{237C}",
1094
        b"lmoust" | b"lmoustache" => "\u{23B0}",
1095
        b"rmoust" | b"rmoustache" => "\u{23B1}",
1096
        b"tbrk" | b"OverBracket" => "\u{23B4}",
1097
        b"bbrk" | b"UnderBracket" => "\u{23B5}",
1098
        b"bbrktbrk" => "\u{23B6}",
1099
        b"OverParenthesis" => "\u{23DC}",
1100
        b"UnderParenthesis" => "\u{23DD}",
1101
        b"OverBrace" => "\u{23DE}",
1102
        b"UnderBrace" => "\u{23DF}",
1103
        b"trpezium" => "\u{23E2}",
1104
        b"elinters" => "\u{23E7}",
1105
        b"blank" => "\u{2423}",
1106
        b"oS" | b"circledS" => "\u{24C8}",
1107
        b"boxh" | b"HorizontalLine" => "\u{2500}",
1108
        b"boxv" => "\u{2502}",
1109
        b"boxdr" => "\u{250C}",
1110
        b"boxdl" => "\u{2510}",
1111
        b"boxur" => "\u{2514}",
1112
        b"boxul" => "\u{2518}",
1113
        b"boxvr" => "\u{251C}",
1114
        b"boxvl" => "\u{2524}",
1115
        b"boxhd" => "\u{252C}",
1116
        b"boxhu" => "\u{2534}",
1117
        b"boxvh" => "\u{253C}",
1118
        b"boxH" => "\u{2550}",
1119
        b"boxV" => "\u{2551}",
1120
        b"boxdR" => "\u{2552}",
1121
        b"boxDr" => "\u{2553}",
1122
        b"boxDR" => "\u{2554}",
1123
        b"boxdL" => "\u{2555}",
1124
        b"boxDl" => "\u{2556}",
1125
        b"boxDL" => "\u{2557}",
1126
        b"boxuR" => "\u{2558}",
1127
        b"boxUr" => "\u{2559}",
1128
        b"boxUR" => "\u{255A}",
1129
        b"boxuL" => "\u{255B}",
1130
        b"boxUl" => "\u{255C}",
1131
        b"boxUL" => "\u{255D}",
1132
        b"boxvR" => "\u{255E}",
1133
        b"boxVr" => "\u{255F}",
1134
        b"boxVR" => "\u{2560}",
1135
        b"boxvL" => "\u{2561}",
1136
        b"boxVl" => "\u{2562}",
1137
        b"boxVL" => "\u{2563}",
1138
        b"boxHd" => "\u{2564}",
1139
        b"boxhD" => "\u{2565}",
1140
        b"boxHD" => "\u{2566}",
1141
        b"boxHu" => "\u{2567}",
1142
        b"boxhU" => "\u{2568}",
1143
        b"boxHU" => "\u{2569}",
1144
        b"boxvH" => "\u{256A}",
1145
        b"boxVh" => "\u{256B}",
1146
        b"boxVH" => "\u{256C}",
1147
        b"uhblk" => "\u{2580}",
1148
        b"lhblk" => "\u{2584}",
1149
        b"block" => "\u{2588}",
1150
        b"blk14" => "\u{2591}",
1151
        b"blk12" => "\u{2592}",
1152
        b"blk34" => "\u{2593}",
1153
        b"squ" | b"square" | b"Square" => "\u{25A1}",
1154
        b"squf" | b"squarf" | b"blacksquare" | b"FilledVerySmallSquare" => "\u{25AA}",
1155
        b"EmptyVerySmallSquare" => "\u{25AB}",
1156
        b"rect" => "\u{25AD}",
1157
        b"marker" => "\u{25AE}",
1158
        b"fltns" => "\u{25B1}",
1159
        b"xutri" | b"bigtriangleup" => "\u{25B3}",
1160
        b"utrif" | b"blacktriangle" => "\u{25B4}",
1161
        b"utri" | b"triangle" => "\u{25B5}",
1162
        b"rtrif" | b"blacktriangleright" => "\u{25B8}",
1163
        b"rtri" | b"triangleright" => "\u{25B9}",
1164
        b"xdtri" | b"bigtriangledown" => "\u{25BD}",
1165
        b"dtrif" | b"blacktriangledown" => "\u{25BE}",
1166
        b"dtri" | b"triangledown" => "\u{25BF}",
1167
        b"ltrif" | b"blacktriangleleft" => "\u{25C2}",
1168
        b"ltri" | b"triangleleft" => "\u{25C3}",
1169
        b"loz" | b"lozenge" => "\u{25CA}",
1170
        b"cir" => "\u{25CB}",
1171
        b"tridot" => "\u{25EC}",
1172
        b"xcirc" | b"bigcirc" => "\u{25EF}",
1173
        b"ultri" => "\u{25F8}",
1174
        b"urtri" => "\u{25F9}",
1175
        b"lltri" => "\u{25FA}",
1176
        b"EmptySmallSquare" => "\u{25FB}",
1177
        b"FilledSmallSquare" => "\u{25FC}",
1178
        b"starf" | b"bigstar" => "\u{2605}",
1179
        b"star" => "\u{2606}",
1180
        b"phone" => "\u{260E}",
1181
        b"female" => "\u{2640}",
1182
        b"male" => "\u{2642}",
1183
        b"spades" | b"spadesuit" => "\u{2660}",
1184
        b"clubs" | b"clubsuit" => "\u{2663}",
1185
        b"hearts" | b"heartsuit" => "\u{2665}",
1186
        b"diams" | b"diamondsuit" => "\u{2666}",
1187
        b"sung" => "\u{266A}",
1188
        b"flat" => "\u{266D}",
1189
        b"natur" | b"natural" => "\u{266E}",
1190
        b"sharp" => "\u{266F}",
1191
        b"check" | b"checkmark" => "\u{2713}",
1192
        b"cross" => "\u{2717}",
1193
        b"malt" | b"maltese" => "\u{2720}",
1194
        b"sext" => "\u{2736}",
1195
        b"VerticalSeparator" => "\u{2758}",
1196
        b"lbbrk" => "\u{2772}",
1197
        b"rbbrk" => "\u{2773}",
1198
        b"lobrk" | b"LeftDoubleBracket" => "\u{27E6}",
1199
        b"robrk" | b"RightDoubleBracket" => "\u{27E7}",
1200
        b"lang" | b"LeftAngleBracket" | b"langle" => "\u{27E8}",
1201
        b"rang" | b"RightAngleBracket" | b"rangle" => "\u{27E9}",
1202
        b"Lang" => "\u{27EA}",
1203
        b"Rang" => "\u{27EB}",
1204
        b"loang" => "\u{27EC}",
1205
        b"roang" => "\u{27ED}",
1206
        b"xlarr" | b"longleftarrow" | b"LongLeftArrow" => "\u{27F5}",
1207
        b"xrarr" | b"longrightarrow" | b"LongRightArrow" => "\u{27F6}",
1208
        b"xharr" | b"longleftrightarrow" | b"LongLeftRightArrow" => "\u{27F7}",
1209
        b"xlArr" | b"Longleftarrow" | b"DoubleLongLeftArrow" => "\u{27F8}",
1210
        b"xrArr" | b"Longrightarrow" | b"DoubleLongRightArrow" => "\u{27F9}",
1211
        b"xhArr" | b"Longleftrightarrow" | b"DoubleLongLeftRightArrow" => "\u{27FA}",
1212
        b"xmap" | b"longmapsto" => "\u{27FC}",
1213
        b"dzigrarr" => "\u{27FF}",
1214
        b"nvlArr" => "\u{2902}",
1215
        b"nvrArr" => "\u{2903}",
1216
        b"nvHarr" => "\u{2904}",
1217
        b"Map" => "\u{2905}",
1218
        b"lbarr" => "\u{290C}",
1219
        b"rbarr" | b"bkarow" => "\u{290D}",
1220
        b"lBarr" => "\u{290E}",
1221
        b"rBarr" | b"dbkarow" => "\u{290F}",
1222
        b"RBarr" | b"drbkarow" => "\u{2910}",
1223
        b"DDotrahd" => "\u{2911}",
1224
        b"UpArrowBar" => "\u{2912}",
1225
        b"DownArrowBar" => "\u{2913}",
1226
        b"Rarrtl" => "\u{2916}",
1227
        b"latail" => "\u{2919}",
1228
        b"ratail" => "\u{291A}",
1229
        b"lAtail" => "\u{291B}",
1230
        b"rAtail" => "\u{291C}",
1231
        b"larrfs" => "\u{291D}",
1232
        b"rarrfs" => "\u{291E}",
1233
        b"larrbfs" => "\u{291F}",
1234
        b"rarrbfs" => "\u{2920}",
1235
        b"nwarhk" => "\u{2923}",
1236
        b"nearhk" => "\u{2924}",
1237
        b"searhk" | b"hksearow" => "\u{2925}",
1238
        b"swarhk" | b"hkswarow" => "\u{2926}",
1239
        b"nwnear" => "\u{2927}",
1240
        b"nesear" | b"toea" => "\u{2928}",
1241
        b"seswar" | b"tosa" => "\u{2929}",
1242
        b"swnwar" => "\u{292A}",
1243
        b"rarrc" => "\u{2933}",
1244
        b"cudarrr" => "\u{2935}",
1245
        b"ldca" => "\u{2936}",
1246
        b"rdca" => "\u{2937}",
1247
        b"cudarrl" => "\u{2938}",
1248
        b"larrpl" => "\u{2939}",
1249
        b"curarrm" => "\u{293C}",
1250
        b"cularrp" => "\u{293D}",
1251
        b"rarrpl" => "\u{2945}",
1252
        b"harrcir" => "\u{2948}",
1253
        b"Uarrocir" => "\u{2949}",
1254
        b"lurdshar" => "\u{294A}",
1255
        b"ldrushar" => "\u{294B}",
1256
        b"LeftRightVector" => "\u{294E}",
1257
        b"RightUpDownVector" => "\u{294F}",
1258
        b"DownLeftRightVector" => "\u{2950}",
1259
        b"LeftUpDownVector" => "\u{2951}",
1260
        b"LeftVectorBar" => "\u{2952}",
1261
        b"RightVectorBar" => "\u{2953}",
1262
        b"RightUpVectorBar" => "\u{2954}",
1263
        b"RightDownVectorBar" => "\u{2955}",
1264
        b"DownLeftVectorBar" => "\u{2956}",
1265
        b"DownRightVectorBar" => "\u{2957}",
1266
        b"LeftUpVectorBar" => "\u{2958}",
1267
        b"LeftDownVectorBar" => "\u{2959}",
1268
        b"LeftTeeVector" => "\u{295A}",
1269
        b"RightTeeVector" => "\u{295B}",
1270
        b"RightUpTeeVector" => "\u{295C}",
1271
        b"RightDownTeeVector" => "\u{295D}",
1272
        b"DownLeftTeeVector" => "\u{295E}",
1273
        b"DownRightTeeVector" => "\u{295F}",
1274
        b"LeftUpTeeVector" => "\u{2960}",
1275
        b"LeftDownTeeVector" => "\u{2961}",
1276
        b"lHar" => "\u{2962}",
1277
        b"uHar" => "\u{2963}",
1278
        b"rHar" => "\u{2964}",
1279
        b"dHar" => "\u{2965}",
1280
        b"luruhar" => "\u{2966}",
1281
        b"ldrdhar" => "\u{2967}",
1282
        b"ruluhar" => "\u{2968}",
1283
        b"rdldhar" => "\u{2969}",
1284
        b"lharul" => "\u{296A}",
1285
        b"llhard" => "\u{296B}",
1286
        b"rharul" => "\u{296C}",
1287
        b"lrhard" => "\u{296D}",
1288
        b"udhar" | b"UpEquilibrium" => "\u{296E}",
1289
        b"duhar" | b"ReverseUpEquilibrium" => "\u{296F}",
1290
        b"RoundImplies" => "\u{2970}",
1291
        b"erarr" => "\u{2971}",
1292
        b"simrarr" => "\u{2972}",
1293
        b"larrsim" => "\u{2973}",
1294
        b"rarrsim" => "\u{2974}",
1295
        b"rarrap" => "\u{2975}",
1296
        b"ltlarr" => "\u{2976}",
1297
        b"gtrarr" => "\u{2978}",
1298
        b"subrarr" => "\u{2979}",
1299
        b"suplarr" => "\u{297B}",
1300
        b"lfisht" => "\u{297C}",
1301
        b"rfisht" => "\u{297D}",
1302
        b"ufisht" => "\u{297E}",
1303
        b"dfisht" => "\u{297F}",
1304
        b"lopar" => "\u{2985}",
1305
        b"ropar" => "\u{2986}",
1306
        b"lbrke" => "\u{298B}",
1307
        b"rbrke" => "\u{298C}",
1308
        b"lbrkslu" => "\u{298D}",
1309
        b"rbrksld" => "\u{298E}",
1310
        b"lbrksld" => "\u{298F}",
1311
        b"rbrkslu" => "\u{2990}",
1312
        b"langd" => "\u{2991}",
1313
        b"rangd" => "\u{2992}",
1314
        b"lparlt" => "\u{2993}",
1315
        b"rpargt" => "\u{2994}",
1316
        b"gtlPar" => "\u{2995}",
1317
        b"ltrPar" => "\u{2996}",
1318
        b"vzigzag" => "\u{299A}",
1319
        b"vangrt" => "\u{299C}",
1320
        b"angrtvbd" => "\u{299D}",
1321
        b"ange" => "\u{29A4}",
1322
        b"range" => "\u{29A5}",
1323
        b"dwangle" => "\u{29A6}",
1324
        b"uwangle" => "\u{29A7}",
1325
        b"angmsdaa" => "\u{29A8}",
1326
        b"angmsdab" => "\u{29A9}",
1327
        b"angmsdac" => "\u{29AA}",
1328
        b"angmsdad" => "\u{29AB}",
1329
        b"angmsdae" => "\u{29AC}",
1330
        b"angmsdaf" => "\u{29AD}",
1331
        b"angmsdag" => "\u{29AE}",
1332
        b"angmsdah" => "\u{29AF}",
1333
        b"bemptyv" => "\u{29B0}",
1334
        b"demptyv" => "\u{29B1}",
1335
        b"cemptyv" => "\u{29B2}",
1336
        b"raemptyv" => "\u{29B3}",
1337
        b"laemptyv" => "\u{29B4}",
1338
        b"ohbar" => "\u{29B5}",
1339
        b"omid" => "\u{29B6}",
1340
        b"opar" => "\u{29B7}",
1341
        b"operp" => "\u{29B9}",
1342
        b"olcross" => "\u{29BB}",
1343
        b"odsold" => "\u{29BC}",
1344
        b"olcir" => "\u{29BE}",
1345
        b"ofcir" => "\u{29BF}",
1346
        b"olt" => "\u{29C0}",
1347
        b"ogt" => "\u{29C1}",
1348
        b"cirscir" => "\u{29C2}",
1349
        b"cirE" => "\u{29C3}",
1350
        b"solb" => "\u{29C4}",
1351
        b"bsolb" => "\u{29C5}",
1352
        b"boxbox" => "\u{29C9}",
1353
        b"trisb" => "\u{29CD}",
1354
        b"rtriltri" => "\u{29CE}",
1355
        b"LeftTriangleBar" => "\u{29CF}",
1356
        b"RightTriangleBar" => "\u{29D0}",
1357
        b"race" => "\u{29DA}",
1358
        b"iinfin" => "\u{29DC}",
1359
        b"infintie" => "\u{29DD}",
1360
        b"nvinfin" => "\u{29DE}",
1361
        b"eparsl" => "\u{29E3}",
1362
        b"smeparsl" => "\u{29E4}",
1363
        b"eqvparsl" => "\u{29E5}",
1364
        b"lozf" | b"blacklozenge" => "\u{29EB}",
1365
        b"RuleDelayed" => "\u{29F4}",
1366
        b"dsol" => "\u{29F6}",
1367
        b"xodot" | b"bigodot" => "\u{2A00}",
1368
        b"xoplus" | b"bigoplus" => "\u{2A01}",
1369
        b"xotime" | b"bigotimes" => "\u{2A02}",
1370
        b"xuplus" | b"biguplus" => "\u{2A04}",
1371
        b"xsqcup" | b"bigsqcup" => "\u{2A06}",
1372
        b"qint" | b"iiiint" => "\u{2A0C}",
1373
        b"fpartint" => "\u{2A0D}",
1374
        b"cirfnint" => "\u{2A10}",
1375
        b"awint" => "\u{2A11}",
1376
        b"rppolint" => "\u{2A12}",
1377
        b"scpolint" => "\u{2A13}",
1378
        b"npolint" => "\u{2A14}",
1379
        b"pointint" => "\u{2A15}",
1380
        b"quatint" => "\u{2A16}",
1381
        b"intlarhk" => "\u{2A17}",
1382
        b"pluscir" => "\u{2A22}",
1383
        b"plusacir" => "\u{2A23}",
1384
        b"simplus" => "\u{2A24}",
1385
        b"plusdu" => "\u{2A25}",
1386
        b"plussim" => "\u{2A26}",
1387
        b"plustwo" => "\u{2A27}",
1388
        b"mcomma" => "\u{2A29}",
1389
        b"minusdu" => "\u{2A2A}",
1390
        b"loplus" => "\u{2A2D}",
1391
        b"roplus" => "\u{2A2E}",
1392
        b"Cross" => "\u{2A2F}",
1393
        b"timesd" => "\u{2A30}",
1394
        b"timesbar" => "\u{2A31}",
1395
        b"smashp" => "\u{2A33}",
1396
        b"lotimes" => "\u{2A34}",
1397
        b"rotimes" => "\u{2A35}",
1398
        b"otimesas" => "\u{2A36}",
1399
        b"Otimes" => "\u{2A37}",
1400
        b"odiv" => "\u{2A38}",
1401
        b"triplus" => "\u{2A39}",
1402
        b"triminus" => "\u{2A3A}",
1403
        b"tritime" => "\u{2A3B}",
1404
        b"iprod" | b"intprod" => "\u{2A3C}",
1405
        b"amalg" => "\u{2A3F}",
1406
        b"capdot" => "\u{2A40}",
1407
        b"ncup" => "\u{2A42}",
1408
        b"ncap" => "\u{2A43}",
1409
        b"capand" => "\u{2A44}",
1410
        b"cupor" => "\u{2A45}",
1411
        b"cupcap" => "\u{2A46}",
1412
        b"capcup" => "\u{2A47}",
1413
        b"cupbrcap" => "\u{2A48}",
1414
        b"capbrcup" => "\u{2A49}",
1415
        b"cupcup" => "\u{2A4A}",
1416
        b"capcap" => "\u{2A4B}",
1417
        b"ccups" => "\u{2A4C}",
1418
        b"ccaps" => "\u{2A4D}",
1419
        b"ccupssm" => "\u{2A50}",
1420
        b"And" => "\u{2A53}",
1421
        b"Or" => "\u{2A54}",
1422
        b"andand" => "\u{2A55}",
1423
        b"oror" => "\u{2A56}",
1424
        b"orslope" => "\u{2A57}",
1425
        b"andslope" => "\u{2A58}",
1426
        b"andv" => "\u{2A5A}",
1427
        b"orv" => "\u{2A5B}",
1428
        b"andd" => "\u{2A5C}",
1429
        b"ord" => "\u{2A5D}",
1430
        b"wedbar" => "\u{2A5F}",
1431
        b"sdote" => "\u{2A66}",
1432
        b"simdot" => "\u{2A6A}",
1433
        b"congdot" => "\u{2A6D}",
1434
        b"easter" => "\u{2A6E}",
1435
        b"apacir" => "\u{2A6F}",
1436
        b"apE" => "\u{2A70}",
1437
        b"eplus" => "\u{2A71}",
1438
        b"pluse" => "\u{2A72}",
1439
        b"Esim" => "\u{2A73}",
1440
        b"Colone" => "\u{2A74}",
1441
        b"Equal" => "\u{2A75}",
1442
        b"eDDot" | b"ddotseq" => "\u{2A77}",
1443
        b"equivDD" => "\u{2A78}",
1444
        b"ltcir" => "\u{2A79}",
1445
        b"gtcir" => "\u{2A7A}",
1446
        b"ltquest" => "\u{2A7B}",
1447
        b"gtquest" => "\u{2A7C}",
1448
        b"les" | b"LessSlantEqual" | b"leqslant" => "\u{2A7D}",
1449
        b"ges" | b"GreaterSlantEqual" | b"geqslant" => "\u{2A7E}",
1450
        b"lesdot" => "\u{2A7F}",
1451
        b"gesdot" => "\u{2A80}",
1452
        b"lesdoto" => "\u{2A81}",
1453
        b"gesdoto" => "\u{2A82}",
1454
        b"lesdotor" => "\u{2A83}",
1455
        b"gesdotol" => "\u{2A84}",
1456
        b"lap" | b"lessapprox" => "\u{2A85}",
1457
        b"gap" | b"gtrapprox" => "\u{2A86}",
1458
        b"lne" | b"lneq" => "\u{2A87}",
1459
        b"gne" | b"gneq" => "\u{2A88}",
1460
        b"lnap" | b"lnapprox" => "\u{2A89}",
1461
        b"gnap" | b"gnapprox" => "\u{2A8A}",
1462
        b"lEg" | b"lesseqqgtr" => "\u{2A8B}",
1463
        b"gEl" | b"gtreqqless" => "\u{2A8C}",
1464
        b"lsime" => "\u{2A8D}",
1465
        b"gsime" => "\u{2A8E}",
1466
        b"lsimg" => "\u{2A8F}",
1467
        b"gsiml" => "\u{2A90}",
1468
        b"lgE" => "\u{2A91}",
1469
        b"glE" => "\u{2A92}",
1470
        b"lesges" => "\u{2A93}",
1471
        b"gesles" => "\u{2A94}",
1472
        b"els" | b"eqslantless" => "\u{2A95}",
1473
        b"egs" | b"eqslantgtr" => "\u{2A96}",
1474
        b"elsdot" => "\u{2A97}",
1475
        b"egsdot" => "\u{2A98}",
1476
        b"el" => "\u{2A99}",
1477
        b"eg" => "\u{2A9A}",
1478
        b"siml" => "\u{2A9D}",
1479
        b"simg" => "\u{2A9E}",
1480
        b"simlE" => "\u{2A9F}",
1481
        b"simgE" => "\u{2AA0}",
1482
        b"LessLess" => "\u{2AA1}",
1483
        b"GreaterGreater" => "\u{2AA2}",
1484
        b"glj" => "\u{2AA4}",
1485
        b"gla" => "\u{2AA5}",
1486
        b"ltcc" => "\u{2AA6}",
1487
        b"gtcc" => "\u{2AA7}",
1488
        b"lescc" => "\u{2AA8}",
1489
        b"gescc" => "\u{2AA9}",
1490
        b"smt" => "\u{2AAA}",
1491
        b"lat" => "\u{2AAB}",
1492
        b"smte" => "\u{2AAC}",
1493
        b"late" => "\u{2AAD}",
1494
        b"bumpE" => "\u{2AAE}",
1495
        b"pre" | b"preceq" | b"PrecedesEqual" => "\u{2AAF}",
1496
        b"sce" | b"succeq" | b"SucceedsEqual" => "\u{2AB0}",
1497
        b"prE" => "\u{2AB3}",
1498
        b"scE" => "\u{2AB4}",
1499
        b"prnE" | b"precneqq" => "\u{2AB5}",
1500
        b"scnE" | b"succneqq" => "\u{2AB6}",
1501
        b"prap" | b"precapprox" => "\u{2AB7}",
1502
        b"scap" | b"succapprox" => "\u{2AB8}",
1503
        b"prnap" | b"precnapprox" => "\u{2AB9}",
1504
        b"scnap" | b"succnapprox" => "\u{2ABA}",
1505
        b"Pr" => "\u{2ABB}",
1506
        b"Sc" => "\u{2ABC}",
1507
        b"subdot" => "\u{2ABD}",
1508
        b"supdot" => "\u{2ABE}",
1509
        b"subplus" => "\u{2ABF}",
1510
        b"supplus" => "\u{2AC0}",
1511
        b"submult" => "\u{2AC1}",
1512
        b"supmult" => "\u{2AC2}",
1513
        b"subedot" => "\u{2AC3}",
1514
        b"supedot" => "\u{2AC4}",
1515
        b"subE" | b"subseteqq" => "\u{2AC5}",
1516
        b"supE" | b"supseteqq" => "\u{2AC6}",
1517
        b"subsim" => "\u{2AC7}",
1518
        b"supsim" => "\u{2AC8}",
1519
        b"subnE" | b"subsetneqq" => "\u{2ACB}",
1520
        b"supnE" | b"supsetneqq" => "\u{2ACC}",
1521
        b"csub" => "\u{2ACF}",
1522
        b"csup" => "\u{2AD0}",
1523
        b"csube" => "\u{2AD1}",
1524
        b"csupe" => "\u{2AD2}",
1525
        b"subsup" => "\u{2AD3}",
1526
        b"supsub" => "\u{2AD4}",
1527
        b"subsub" => "\u{2AD5}",
1528
        b"supsup" => "\u{2AD6}",
1529
        b"suphsub" => "\u{2AD7}",
1530
        b"supdsub" => "\u{2AD8}",
1531
        b"forkv" => "\u{2AD9}",
1532
        b"topfork" => "\u{2ADA}",
1533
        b"mlcp" => "\u{2ADB}",
1534
        b"Dashv" | b"DoubleLeftTee" => "\u{2AE4}",
1535
        b"Vdashl" => "\u{2AE6}",
1536
        b"Barv" => "\u{2AE7}",
1537
        b"vBar" => "\u{2AE8}",
1538
        b"vBarv" => "\u{2AE9}",
1539
        b"Vbar" => "\u{2AEB}",
1540
        b"Not" => "\u{2AEC}",
1541
        b"bNot" => "\u{2AED}",
1542
        b"rnmid" => "\u{2AEE}",
1543
        b"cirmid" => "\u{2AEF}",
1544
        b"midcir" => "\u{2AF0}",
1545
        b"topcir" => "\u{2AF1}",
1546
        b"nhpar" => "\u{2AF2}",
1547
        b"parsim" => "\u{2AF3}",
1548
        b"parsl" => "\u{2AFD}",
1549
        b"fflig" => "\u{FB00}",
1550
        b"filig" => "\u{FB01}",
1551
        b"fllig" => "\u{FB02}",
1552
        b"ffilig" => "\u{FB03}",
1553
        b"ffllig" => "\u{FB04}",
1554
        b"Ascr" => "\u{1D49}",
1555
        b"Cscr" => "\u{1D49}",
1556
        b"Dscr" => "\u{1D49}",
1557
        b"Gscr" => "\u{1D4A}",
1558
        b"Jscr" => "\u{1D4A}",
1559
        b"Kscr" => "\u{1D4A}",
1560
        b"Nscr" => "\u{1D4A}",
1561
        b"Oscr" => "\u{1D4A}",
1562
        b"Pscr" => "\u{1D4A}",
1563
        b"Qscr" => "\u{1D4A}",
1564
        b"Sscr" => "\u{1D4A}",
1565
        b"Tscr" => "\u{1D4A}",
1566
        b"Uscr" => "\u{1D4B}",
1567
        b"Vscr" => "\u{1D4B}",
1568
        b"Wscr" => "\u{1D4B}",
1569
        b"Xscr" => "\u{1D4B}",
1570
        b"Yscr" => "\u{1D4B}",
1571
        b"Zscr" => "\u{1D4B}",
1572
        b"ascr" => "\u{1D4B}",
1573
        b"bscr" => "\u{1D4B}",
1574
        b"cscr" => "\u{1D4B}",
1575
        b"dscr" => "\u{1D4B}",
1576
        b"fscr" => "\u{1D4B}",
1577
        b"hscr" => "\u{1D4B}",
1578
        b"iscr" => "\u{1D4B}",
1579
        b"jscr" => "\u{1D4B}",
1580
        b"kscr" => "\u{1D4C}",
1581
        b"lscr" => "\u{1D4C}",
1582
        b"mscr" => "\u{1D4C}",
1583
        b"nscr" => "\u{1D4C}",
1584
        b"pscr" => "\u{1D4C}",
1585
        b"qscr" => "\u{1D4C}",
1586
        b"rscr" => "\u{1D4C}",
1587
        b"sscr" => "\u{1D4C}",
1588
        b"tscr" => "\u{1D4C}",
1589
        b"uscr" => "\u{1D4C}",
1590
        b"vscr" => "\u{1D4C}",
1591
        b"wscr" => "\u{1D4C}",
1592
        b"xscr" => "\u{1D4C}",
1593
        b"yscr" => "\u{1D4C}",
1594
        b"zscr" => "\u{1D4C}",
1595
        b"Afr" => "\u{1D50}",
1596
        b"Bfr" => "\u{1D50}",
1597
        b"Dfr" => "\u{1D50}",
1598
        b"Efr" => "\u{1D50}",
1599
        b"Ffr" => "\u{1D50}",
1600
        b"Gfr" => "\u{1D50}",
1601
        b"Jfr" => "\u{1D50}",
1602
        b"Kfr" => "\u{1D50}",
1603
        b"Lfr" => "\u{1D50}",
1604
        b"Mfr" => "\u{1D51}",
1605
        b"Nfr" => "\u{1D51}",
1606
        b"Ofr" => "\u{1D51}",
1607
        b"Pfr" => "\u{1D51}",
1608
        b"Qfr" => "\u{1D51}",
1609
        b"Sfr" => "\u{1D51}",
1610
        b"Tfr" => "\u{1D51}",
1611
        b"Ufr" => "\u{1D51}",
1612
        b"Vfr" => "\u{1D51}",
1613
        b"Wfr" => "\u{1D51}",
1614
        b"Xfr" => "\u{1D51}",
1615
        b"Yfr" => "\u{1D51}",
1616
        b"afr" => "\u{1D51}",
1617
        b"bfr" => "\u{1D51}",
1618
        b"cfr" => "\u{1D52}",
1619
        b"dfr" => "\u{1D52}",
1620
        b"efr" => "\u{1D52}",
1621
        b"ffr" => "\u{1D52}",
1622
        b"gfr" => "\u{1D52}",
1623
        b"hfr" => "\u{1D52}",
1624
        b"ifr" => "\u{1D52}",
1625
        b"jfr" => "\u{1D52}",
1626
        b"kfr" => "\u{1D52}",
1627
        b"lfr" => "\u{1D52}",
1628
        b"mfr" => "\u{1D52}",
1629
        b"nfr" => "\u{1D52}",
1630
        b"ofr" => "\u{1D52}",
1631
        b"pfr" => "\u{1D52}",
1632
        b"qfr" => "\u{1D52}",
1633
        b"rfr" => "\u{1D52}",
1634
        b"sfr" => "\u{1D53}",
1635
        b"tfr" => "\u{1D53}",
1636
        b"ufr" => "\u{1D53}",
1637
        b"vfr" => "\u{1D53}",
1638
        b"wfr" => "\u{1D53}",
1639
        b"xfr" => "\u{1D53}",
1640
        b"yfr" => "\u{1D53}",
1641
        b"zfr" => "\u{1D53}",
1642
        b"Aopf" => "\u{1D53}",
1643
        b"Bopf" => "\u{1D53}",
1644
        b"Dopf" => "\u{1D53}",
1645
        b"Eopf" => "\u{1D53}",
1646
        b"Fopf" => "\u{1D53}",
1647
        b"Gopf" => "\u{1D53}",
1648
        b"Iopf" => "\u{1D54}",
1649
        b"Jopf" => "\u{1D54}",
1650
        b"Kopf" => "\u{1D54}",
1651
        b"Lopf" => "\u{1D54}",
1652
        b"Mopf" => "\u{1D54}",
1653
        b"Oopf" => "\u{1D54}",
1654
        b"Sopf" => "\u{1D54}",
1655
        b"Topf" => "\u{1D54}",
1656
        b"Uopf" => "\u{1D54}",
1657
        b"Vopf" => "\u{1D54}",
1658
        b"Wopf" => "\u{1D54}",
1659
        b"Xopf" => "\u{1D54}",
1660
        b"Yopf" => "\u{1D55}",
1661
        b"aopf" => "\u{1D55}",
1662
        b"bopf" => "\u{1D55}",
1663
        b"copf" => "\u{1D55}",
1664
        b"dopf" => "\u{1D55}",
1665
        b"eopf" => "\u{1D55}",
1666
        b"fopf" => "\u{1D55}",
1667
        b"gopf" => "\u{1D55}",
1668
        b"hopf" => "\u{1D55}",
1669
        b"iopf" => "\u{1D55}",
1670
        b"jopf" => "\u{1D55}",
1671
        b"kopf" => "\u{1D55}",
1672
        b"lopf" => "\u{1D55}",
1673
        b"mopf" => "\u{1D55}",
1674
        b"nopf" => "\u{1D55}",
1675
        b"oopf" => "\u{1D56}",
1676
        b"popf" => "\u{1D56}",
1677
        b"qopf" => "\u{1D56}",
1678
        b"ropf" => "\u{1D56}",
1679
        b"sopf" => "\u{1D56}",
1680
        b"topf" => "\u{1D56}",
1681
        b"uopf" => "\u{1D56}",
1682
        b"vopf" => "\u{1D56}",
1683
        b"wopf" => "\u{1D56}",
1684
        b"xopf" => "\u{1D56}",
1685
        b"yopf" => "\u{1D56}",
1686
        b"zopf" => "\u{1D56}",
1687
        _ => return None,
1688
    };
1689
    Some(s)
1690
}
1691
1692
0
fn parse_number(bytes: &str, range: Range<usize>) -> Result<char, EscapeError> {
1693
0
    let code = if let Some(hex_digits) = bytes.strip_prefix('x') {
1694
0
        parse_hexadecimal(hex_digits)
1695
    } else {
1696
0
        parse_decimal(bytes)
1697
0
    }?;
1698
0
    if code == 0 {
1699
0
        return Err(EscapeError::EntityWithNull(range));
1700
0
    }
1701
0
    match std::char::from_u32(code) {
1702
0
        Some(c) => Ok(c),
1703
0
        None => Err(EscapeError::InvalidCodepoint(code)),
1704
    }
1705
0
}
1706
1707
0
fn parse_hexadecimal(bytes: &str) -> Result<u32, EscapeError> {
1708
0
    // maximum code is 0x10FFFF => 6 characters
1709
0
    if bytes.len() > 6 {
1710
0
        return Err(EscapeError::TooLongHexadecimal);
1711
0
    }
1712
0
    let mut code = 0;
1713
0
    for b in bytes.bytes() {
1714
0
        code <<= 4;
1715
0
        code += match b {
1716
0
            b'0'..=b'9' => b - b'0',
1717
0
            b'a'..=b'f' => b - b'a' + 10,
1718
0
            b'A'..=b'F' => b - b'A' + 10,
1719
0
            b => return Err(EscapeError::InvalidHexadecimal(b as char)),
1720
        } as u32;
1721
    }
1722
0
    Ok(code)
1723
0
}
1724
1725
0
fn parse_decimal(bytes: &str) -> Result<u32, EscapeError> {
1726
0
    // maximum code is 0x10FFFF = 1114111 => 7 characters
1727
0
    if bytes.len() > 7 {
1728
0
        return Err(EscapeError::TooLongDecimal);
1729
0
    }
1730
0
    let mut code = 0;
1731
0
    for b in bytes.bytes() {
1732
0
        code *= 10;
1733
0
        code += match b {
1734
0
            b'0'..=b'9' => b - b'0',
1735
0
            b => return Err(EscapeError::InvalidDecimal(b as char)),
1736
        } as u32;
1737
    }
1738
0
    Ok(code)
1739
0
}
1740
1741
#[test]
1742
fn test_unescape() {
1743
    let unchanged = unescape("test").unwrap();
1744
    // assert_eq does not check that Cow is borrowed, but we explicitly use Cow
1745
    // because it influences diff
1746
    // TODO: use assert_matches! when stabilized and other features will bump MSRV
1747
    assert_eq!(unchanged, Cow::Borrowed("test"));
1748
    assert!(matches!(unchanged, Cow::Borrowed(_)));
1749
1750
    assert_eq!(unescape("&lt;test&gt;").unwrap(), "<test>");
1751
    assert_eq!(unescape("&#x30;").unwrap(), "0");
1752
    assert_eq!(unescape("&#48;").unwrap(), "0");
1753
    assert!(unescape("&foo;").is_err());
1754
}
1755
1756
#[test]
1757
fn test_unescape_with() {
1758
    let custom_entities = |ent: &str| match ent {
1759
        "foo" => Some("BAR"),
1760
        _ => None,
1761
    };
1762
1763
    let unchanged = unescape_with("test", custom_entities).unwrap();
1764
    // assert_eq does not check that Cow is borrowed, but we explicitly use Cow
1765
    // because it influences diff
1766
    // TODO: use assert_matches! when stabilized and other features will bump MSRV
1767
    assert_eq!(unchanged, Cow::Borrowed("test"));
1768
    assert!(matches!(unchanged, Cow::Borrowed(_)));
1769
1770
    assert_eq!(
1771
        unescape_with("&lt;test&gt;", custom_entities).unwrap(),
1772
        "<test>"
1773
    );
1774
    assert_eq!(unescape_with("&#x30;", custom_entities).unwrap(), "0");
1775
    assert_eq!(unescape_with("&#48;", custom_entities).unwrap(), "0");
1776
    assert_eq!(unescape_with("&foo;", custom_entities).unwrap(), "BAR");
1777
    assert!(unescape_with("&fop;", custom_entities).is_err());
1778
}
1779
1780
#[test]
1781
fn test_escape() {
1782
    let unchanged = escape("test");
1783
    // assert_eq does not check that Cow is borrowed, but we explicitly use Cow
1784
    // because it influences diff
1785
    // TODO: use assert_matches! when stabilized and other features will bump MSRV
1786
    assert_eq!(unchanged, Cow::Borrowed("test"));
1787
    assert!(matches!(unchanged, Cow::Borrowed(_)));
1788
1789
    assert_eq!(escape("<test>"), "&lt;test&gt;");
1790
    assert_eq!(escape("\"a\"bc"), "&quot;a&quot;bc");
1791
    assert_eq!(escape("\"a\"b&c"), "&quot;a&quot;b&amp;c");
1792
    assert_eq!(
1793
        escape("prefix_\"a\"b&<>c"),
1794
        "prefix_&quot;a&quot;b&amp;&lt;&gt;c"
1795
    );
1796
}
1797
1798
#[test]
1799
fn test_partial_escape() {
1800
    let unchanged = partial_escape("test");
1801
    // assert_eq does not check that Cow is borrowed, but we explicitly use Cow
1802
    // because it influences diff
1803
    // TODO: use assert_matches! when stabilized and other features will bump MSRV
1804
    assert_eq!(unchanged, Cow::Borrowed("test"));
1805
    assert!(matches!(unchanged, Cow::Borrowed(_)));
1806
1807
    assert_eq!(partial_escape("<test>"), "&lt;test&gt;");
1808
    assert_eq!(partial_escape("\"a\"bc"), "\"a\"bc");
1809
    assert_eq!(partial_escape("\"a\"b&c"), "\"a\"b&amp;c");
1810
    assert_eq!(
1811
        partial_escape("prefix_\"a\"b&<>c"),
1812
        "prefix_\"a\"b&amp;&lt;&gt;c"
1813
    );
1814
}