From 8f2d1f48c273ef8b43da807c34dada36a6c40027 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Mon, 27 Nov 2023 09:13:41 +0100 Subject: [PATCH 01/18] Removed benchmark code and will make it's own project --- benchmark/pom.xml | 187 - .../htmlunit/benchmark/util/FastRandom.java | 67 - .../htmlunit/benchmark/util/RandomUtils.java | 40 - .../cyberneko/HTMLEntitiesParser_Old.java | 60552 ---------------- .../HtmlEntitiesParserBenchmark.java | 282 - .../cyberneko/html_entities.properties | 2231 - .../cyberneko/html_entities_common.properties | 8 - .../cyberneko/util/HTMLEntitiesParser.java | 342 - .../util/HTMLNumericEntitiesParser.java | 283 - .../cyberneko/util/HtmlEntities1.java | 297 - .../cyberneko/util/HtmlEntities2.java | 227 - .../cyberneko/util/HtmlEntities3.java | 240 - .../cyberneko/util/html_entities.properties | 2231 - .../cyberneko/HTMLEntitiesParserTest.java | 216 - .../cyberneko/HTMLEntitiesParser_OldTest.java | 173 - .../HTMLNumericEntitiesParserTest.java | 198 - .../cyberneko/HtmlEntities1ParserTest.java | 149 - .../cyberneko/HtmlEntities2ParserTest.java | 230 - .../cyberneko/HtmlEntities3ParserTest.java | 166 - 19 files changed, 68119 deletions(-) delete mode 100644 benchmark/pom.xml delete mode 100644 benchmark/src/main/java/org/htmlunit/benchmark/util/FastRandom.java delete mode 100644 benchmark/src/main/java/org/htmlunit/benchmark/util/RandomUtils.java delete mode 100644 benchmark/src/main/java/org/htmlunit/cyberneko/HTMLEntitiesParser_Old.java delete mode 100644 benchmark/src/main/java/org/htmlunit/cyberneko/HtmlEntitiesParserBenchmark.java delete mode 100644 benchmark/src/main/java/org/htmlunit/cyberneko/html_entities.properties delete mode 100644 benchmark/src/main/java/org/htmlunit/cyberneko/html_entities_common.properties delete mode 100644 benchmark/src/main/java/org/htmlunit/cyberneko/util/HTMLEntitiesParser.java delete mode 100644 benchmark/src/main/java/org/htmlunit/cyberneko/util/HTMLNumericEntitiesParser.java delete mode 100644 benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities1.java delete mode 100644 benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities2.java delete mode 100644 benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities3.java delete mode 100644 benchmark/src/main/java/org/htmlunit/cyberneko/util/html_entities.properties delete mode 100644 benchmark/src/test/java/org/htmlunit/cyberneko/HTMLEntitiesParserTest.java delete mode 100644 benchmark/src/test/java/org/htmlunit/cyberneko/HTMLEntitiesParser_OldTest.java delete mode 100644 benchmark/src/test/java/org/htmlunit/cyberneko/HTMLNumericEntitiesParserTest.java delete mode 100644 benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities1ParserTest.java delete mode 100644 benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities2ParserTest.java delete mode 100644 benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities3ParserTest.java diff --git a/benchmark/pom.xml b/benchmark/pom.xml deleted file mode 100644 index f779b3aa..00000000 --- a/benchmark/pom.xml +++ /dev/null @@ -1,187 +0,0 @@ - - - - 4.0.0 - - org.htmlunit.cybernecko - test - 1.0 - jar - - HtmlUnit-Neko-Benchmark-Suite - - - - - - org.openjdk.jmh - jmh-core - ${jmh.version} - - - org.openjdk.jmh - jmh-generator-annprocess - ${jmh.version} - provided - - - org.junit.jupiter - junit-jupiter-engine - 5.10.0 - test - - - - - UTF-8 - - - 1.37 - - - 1.8 - - - benchmarks - - - - - - src/main/java - - **/*.properties - - - - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.8.0 - - ${javac.target} - ${javac.target} - ${javac.target} - - - - org.apache.maven.plugins - maven-shade-plugin - 3.2.1 - - - package - - shade - - - ${uberjar.name} - - - org.openjdk.jmh.Main - - - - - - - *:* - - META-INF/*.SF - META-INF/*.DSA - META-INF/*.RSA - - - - - - - - - - - - maven-clean-plugin - 2.5 - - - maven-deploy-plugin - 2.8.1 - - - maven-install-plugin - 2.5.1 - - - maven-jar-plugin - 2.4 - - - maven-javadoc-plugin - 2.9.1 - - - maven-resources-plugin - 2.6 - - - maven-site-plugin - 3.3 - - - maven-source-plugin - 2.2.1 - - - maven-surefire-plugin - 2.17 - - - - - - diff --git a/benchmark/src/main/java/org/htmlunit/benchmark/util/FastRandom.java b/benchmark/src/main/java/org/htmlunit/benchmark/util/FastRandom.java deleted file mode 100644 index 7662fdc9..00000000 --- a/benchmark/src/main/java/org/htmlunit/benchmark/util/FastRandom.java +++ /dev/null @@ -1,67 +0,0 @@ -package org.htmlunit.benchmark.util; - -/** - * Ultra-fast pseudo random generator that is not synchronized! - * Don't use anything from Random by inheritance, this will inherit - * a volatile! - * - * @author rschwietzke - * - */ -public class FastRandom -{ - private long seed; - - public FastRandom() - { - this.seed = System.currentTimeMillis(); - } - - public FastRandom(long seed) - { - this.seed = seed; - } - - protected int next(int nbits) - { - // N.B. Not thread-safe! - long x = this.seed; - x ^= (x << 21); - x ^= (x >>> 35); - x ^= (x << 4); - this.seed = x; - - x &= ((1L << nbits) -1); - - return (int) x; - } - - /** - * Borrowed from the JDK - * - * @param bound - * @return - */ - public int nextInt(int bound) { - - int r = next(31); - int m = bound - 1; - if ((bound & m) == 0) // i.e., bound is a power of 2 - r = (int)((bound * (long)r) >> 31); - else { - for (int u = r; - u - (r = u % bound) + m < 0; - u = next(31)) - ; - } - return r; - } - - /** - * Borrowed from the JDK - * @return - */ - public int nextInt() { - return next(32); - } -} diff --git a/benchmark/src/main/java/org/htmlunit/benchmark/util/RandomUtils.java b/benchmark/src/main/java/org/htmlunit/benchmark/util/RandomUtils.java deleted file mode 100644 index 2b77f5eb..00000000 --- a/benchmark/src/main/java/org/htmlunit/benchmark/util/RandomUtils.java +++ /dev/null @@ -1,40 +0,0 @@ -package org.htmlunit.benchmark.util; -public class RandomUtils -{ - private final static String LOWERCHARS = "abcdefghijklmnopqrstuvwxyz"; - private final static String UPPERCHARS = LOWERCHARS.toUpperCase(); - private final static String CHARS = LOWERCHARS + UPPERCHARS; - - /** - * Fixed length random string - * @param random - * @param length - * @return - */ - public static String randomString(final FastRandom random, final int length) - { - return randomString(random, length, length); - } - - /** - * Variable length random string - * @param random - * @param from - * @param to - * @return - */ - public static String randomString(final FastRandom random, final int from, final int to) - { - final int length = random.nextInt(to - from + 1) + from; - - final StringBuilder sb = new StringBuilder(to); - - for (int i = 0; i < length; i++) - { - final int pos = random.nextInt(CHARS.length()); - sb.append(CHARS.charAt(pos)); - } - - return sb.toString(); - } -} diff --git a/benchmark/src/main/java/org/htmlunit/cyberneko/HTMLEntitiesParser_Old.java b/benchmark/src/main/java/org/htmlunit/cyberneko/HTMLEntitiesParser_Old.java deleted file mode 100644 index 51edbc58..00000000 --- a/benchmark/src/main/java/org/htmlunit/cyberneko/HTMLEntitiesParser_Old.java +++ /dev/null @@ -1,60552 +0,0 @@ -/* - * Copyright 2002-2009 Andy Clark, Marc Guillemot - * Copyright 2017-2023 Ronald Brill - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.htmlunit.cyberneko; - -/** - * Parser for the Pre-defined named HTML entities. - * 12.2.5.72 Character reference state - *

- * From the spec:
- * Consume the maximum number of characters possible, with the consumed characters matching - * one of the identifiers in the first column of the named character references table - * (in a case-sensitive manner). - * Append each character to the temporary buffer when it's consumed. - * - * @author Ronald Brill - */ -public class HTMLEntitiesParser_Old { - public static final int STATE_START = 0; - private static final int STATE_ENDS_WITH_SEMICOLON = -2; - - private static final int STATE_HEXADECIMAL_CHAR = -102; - private static final int STATE_DECIMAL_CHAR = -104; - - private static final int STATE_NUMERIC_CHAR_END_SEMICOLON_MISSING = -105; - - private int state; - private int consumedCount; - private String match; - private int code; - private int matchLength; - - public String getMatch() { - return match; - } - - public int getMatchLength() { - return matchLength; - } - - public int getRewindCount() { - return consumedCount - matchLength; - } - - public boolean endsWithSemicolon() { - return STATE_ENDS_WITH_SEMICOLON == state; - } - - public HTMLEntitiesParser_Old() { - state = STATE_START; - } - - public void setMatchFromCode() { - // If the number is 0x00, then this is a null-character-reference parse error. Set the character reference code to 0xFFFD. - // If the number is greater than 0x10FFFF, then this is a character-reference-outside-unicode-range parse error. Set the character reference code to 0xFFFD. - if ((0x00 == code) || (code > 0x10FFFF)) { - match = "\uFFFD"; - matchLength = consumedCount; - return; - } - - // If the number is a surrogate, then this is a surrogate-character-reference parse error. Set the character reference code to 0xFFFD - if (Character.isSurrogate((char) code)) { - match = "\uFFFD"; - return; - } - - // If the number is a noncharacter, then this is a noncharacter-character-reference parse error. - - // If the number is 0x0D, or a control that's not ASCII whitespace, then this is a control-character-reference parse error. - - // If the number is one of the numbers in the first column of the following table, then find the row with that number in the first column, - // and set the character reference code to the number in the second column of that row. - switch (code) { - case 0x80: - match = "\u20AC"; - matchLength = consumedCount; - return; - - case 0x82: - match = "\u201A"; - matchLength = consumedCount; - return; - - case 0x83: - match = "\u0192"; - matchLength = consumedCount; - return; - - case 0x84: - match = "\u201E"; - matchLength = consumedCount; - return; - - case 0x85: - match = "\u2026"; - matchLength = consumedCount; - return; - - case 0x86: - match = "\u2020"; - matchLength = consumedCount; - return; - - case 0x87: - match = "\u2021"; - matchLength = consumedCount; - return; - - case 0x88: - match = "\u02C6"; - matchLength = consumedCount; - return; - - case 0x89: - match = "\u2030"; - matchLength = consumedCount; - return; - - case 0x8A: - match = "\u0160"; - matchLength = consumedCount; - return; - - case 0x8B: - match = "\u2039"; - matchLength = consumedCount; - return; - - case 0x8C: - match = "\u0152"; - matchLength = consumedCount; - return; - - case 0x8E: - match = "\u017D"; - matchLength = consumedCount; - return; - - case 0x91: - match = "\u2018"; - matchLength = consumedCount; - return; - - case 0x92: - match = "\u2019"; - matchLength = consumedCount; - return; - - case 0x93: - match = "\u201C"; - matchLength = consumedCount; - return; - - case 0x94: - match = "\u201D"; - matchLength = consumedCount; - return; - - case 0x95: - match = "\u2022"; - matchLength = consumedCount; - return; - - case 0x96: - match = "\u2013"; - matchLength = consumedCount; - return; - - case 0x97: - match = "\u2014"; - matchLength = consumedCount; - return; - - case 0x98: - match = "\u20DC"; - matchLength = consumedCount; - return; - - case 0x99: - match = "\u2122"; - matchLength = consumedCount; - return; - - case 0x9A: - match = "\u0161"; - matchLength = consumedCount; - return; - - case 0x9B: - match = "\u203A"; - matchLength = consumedCount; - return; - - case 0x9C: - match = "\u0153"; - matchLength = consumedCount; - return; - - case 0x9E: - match = "\u017E"; - matchLength = consumedCount; - return; - - case 0x9F: - match = "\u0178"; - matchLength = consumedCount; - return; - - default: - break; - } - match = new String(Character.toChars(code)); - matchLength = consumedCount; - } - - public boolean parseNumeric(final int current) { - consumedCount++; - switch (state) { - case STATE_START: - if ('X' == current || 'x' == current) { - state = STATE_HEXADECIMAL_CHAR; - return true; - } - if ('0' <= current && current <= '9') { - state = STATE_DECIMAL_CHAR; - code = (code * 10) + current - 0x30; - return true; - } - break; - case STATE_HEXADECIMAL_CHAR: - if ('0' <= current && current <= '9') { - code = (code * 16) + current - 0x30; - return true; - } - if ('A' <= current && current <= 'F') { - code = (code * 16) + current - 0x37; - return true; - } - if ('a' <= current && current <= 'f') { - code = (code * 16) + current - 0x57; - return true; - } - if (';' == current) { - setMatchFromCode(); - return false; - } - - state = STATE_NUMERIC_CHAR_END_SEMICOLON_MISSING; - setMatchFromCode(); - matchLength = consumedCount - 1; - break; - case STATE_DECIMAL_CHAR: - if ('0' <= current && current <= '9') { - code = (code * 10) + current - 0x30; - return true; - } - if (';' == current) { - setMatchFromCode(); - return false; - } - - state = STATE_NUMERIC_CHAR_END_SEMICOLON_MISSING; - setMatchFromCode(); - matchLength = consumedCount - 1; - break; - } - return false; - } - - private boolean parse1(final int current) { - consumedCount++; - switch (state) { - case 0: - switch (current) { - case 'A': - state = 1; - return true; - case 'B': - state = 77; - return true; - case 'C': - state = 126; - return true; - case 'D': - state = 342; - return true; - case 'E': - state = 666; - return true; - case 'F': - state = 788; - return true; - case 'G': - state = 842; - return true; - case 'H': - state = 929; - return true; - case 'I': - state = 995; - return true; - case 'J': - state = 1096; - return true; - case 'K': - state = 1118; - return true; - case 'L': - state = 1143; - return true; - case 'M': - state = 1514; - return true; - case 'N': - state = 1553; - return true; - case 'O': - state = 2048; - return true; - case 'P': - state = 2157; - return true; - case 'Q': - state = 2242; - return true; - case 'R': - state = 2254; - return true; - case 'S': - state = 2509; - return true; - case 'T': - state = 2706; - return true; - case 'U': - state = 2801; - return true; - case 'V': - state = 2981; - return true; - case 'W': - state = 3051; - return true; - case 'X': - state = 3068; - return true; - case 'Y': - state = 3078; - return true; - case 'Z': - state = 3109; - return true; - case 'a': - state = 3150; - return true; - case 'b': - state = 3295; - return true; - case 'c': - state = 3607; - return true; - case 'd': - state = 3899; - return true; - case 'e': - state = 4140; - return true; - case 'f': - state = 4326; - return true; - case 'g': - state = 4426; - return true; - case 'h': - state = 4572; - return true; - case 'i': - state = 4688; - return true; - case 'j': - state = 4831; - return true; - case 'k': - state = 4857; - return true; - case 'l': - state = 4888; - return true; - case 'm': - state = 5381; - return true; - case 'n': - state = 5494; - return true; - case 'o': - state = 5929; - return true; - case 'p': - state = 6076; - return true; - case 'q': - state = 6256; - return true; - case 'r': - state = 6293; - return true; - case 's': - state = 6626; - return true; - case 't': - state = 7027; - return true; - case 'u': - state = 7222; - return true; - case 'v': - state = 7392; - return true; - case 'w': - state = 7546; - return true; - case 'x': - state = 7577; - return true; - case 'y': - state = 7656; - return true; - case 'z': - state = 7686; - return true; - } - break; - case 1: - switch (current) { - case 'E': - state = 2; - return true; - case 'M': - state = 6; - return true; - case 'a': - state = 8; - return true; - case 'b': - state = 13; - return true; - case 'c': - state = 18; - return true; - case 'f': - state = 23; - return true; - case 'g': - state = 25; - return true; - case 'l': - state = 30; - return true; - case 'm': - state = 34; - return true; - case 'n': - state = 38; - return true; - case 'o': - state = 40; - return true; - case 'p': - state = 46; - return true; - case 'r': - state = 58; - return true; - case 's': - state = 62; - return true; - case 't': - state = 69; - return true; - case 'u': - state = 74; - return true; - } - break; - case 2: - if ('l' == current) { - state = 3; - return true; - } - break; - case 3: - if ('i' == current) { - state = 4; - return true; - } - break; - case 4: - // AElig - if ('g' == current) { - match = "\u00C6"; - matchLength = consumedCount; - state = 5; - return true; - } - break; - case 5: - // AElig; - if (';' == current) { - match = "\u00C6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6: - // AMP - if ('P' == current) { - match = "&"; - matchLength = consumedCount; - state = 7; - return true; - } - break; - case 7: - // AMP; - if (';' == current) { - match = "&"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 8: - if ('c' == current) { - state = 9; - return true; - } - break; - case 9: - if ('u' == current) { - state = 10; - return true; - } - break; - case 10: - if ('t' == current) { - state = 11; - return true; - } - break; - case 11: - // Aacute - if ('e' == current) { - match = "\u00C1"; - matchLength = consumedCount; - state = 12; - return true; - } - break; - case 12: - // Aacute; - if (';' == current) { - match = "\u00C1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 13: - if ('r' == current) { - state = 14; - return true; - } - break; - case 14: - if ('e' == current) { - state = 15; - return true; - } - break; - case 15: - if ('v' == current) { - state = 16; - return true; - } - break; - case 16: - if ('e' == current) { - state = 17; - return true; - } - break; - case 17: - // Abreve; - if (';' == current) { - match = "\u0102"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 18: - if ('i' == current) { - state = 19; - return true; - } - else if ('y' == current) { - state = 22; - return true; - } - break; - case 19: - if ('r' == current) { - state = 20; - return true; - } - break; - case 20: - // Acirc - if ('c' == current) { - match = "\u00C2"; - matchLength = consumedCount; - state = 21; - return true; - } - break; - case 21: - // Acirc; - if (';' == current) { - match = "\u00C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 22: - // Acy; - if (';' == current) { - match = "\u0410"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 23: - if ('r' == current) { - state = 24; - return true; - } - break; - case 24: - // Afr; - if (';' == current) { - match = "\uD835\uDD04"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 25: - if ('r' == current) { - state = 26; - return true; - } - break; - case 26: - if ('a' == current) { - state = 27; - return true; - } - break; - case 27: - if ('v' == current) { - state = 28; - return true; - } - break; - case 28: - // Agrave - if ('e' == current) { - match = "\u00C0"; - matchLength = consumedCount; - state = 29; - return true; - } - break; - case 29: - // Agrave; - if (';' == current) { - match = "\u00C0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 30: - if ('p' == current) { - state = 31; - return true; - } - break; - case 31: - if ('h' == current) { - state = 32; - return true; - } - break; - case 32: - if ('a' == current) { - state = 33; - return true; - } - break; - case 33: - // Alpha; - if (';' == current) { - match = "\u0391"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 34: - if ('a' == current) { - state = 35; - return true; - } - break; - case 35: - if ('c' == current) { - state = 36; - return true; - } - break; - case 36: - if ('r' == current) { - state = 37; - return true; - } - break; - case 37: - // Amacr; - if (';' == current) { - match = "\u0100"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 38: - if ('d' == current) { - state = 39; - return true; - } - break; - case 39: - // And; - if (';' == current) { - match = "\u2A53"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 40: - if ('g' == current) { - state = 41; - return true; - } - else if ('p' == current) { - state = 44; - return true; - } - break; - case 41: - if ('o' == current) { - state = 42; - return true; - } - break; - case 42: - if ('n' == current) { - state = 43; - return true; - } - break; - case 43: - // Aogon; - if (';' == current) { - match = "\u0104"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 44: - if ('f' == current) { - state = 45; - return true; - } - break; - case 45: - // Aopf; - if (';' == current) { - match = "\uD835\uDD38"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 46: - if ('p' == current) { - state = 47; - return true; - } - break; - case 47: - if ('l' == current) { - state = 48; - return true; - } - break; - case 48: - if ('y' == current) { - state = 49; - return true; - } - break; - case 49: - if ('F' == current) { - state = 50; - return true; - } - break; - case 50: - if ('u' == current) { - state = 51; - return true; - } - break; - case 51: - if ('n' == current) { - state = 52; - return true; - } - break; - case 52: - if ('c' == current) { - state = 53; - return true; - } - break; - case 53: - if ('t' == current) { - state = 54; - return true; - } - break; - case 54: - if ('i' == current) { - state = 55; - return true; - } - break; - case 55: - if ('o' == current) { - state = 56; - return true; - } - break; - case 56: - if ('n' == current) { - state = 57; - return true; - } - break; - case 57: - // ApplyFunction; - if (';' == current) { - match = "\u2061"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 58: - if ('i' == current) { - state = 59; - return true; - } - break; - case 59: - if ('n' == current) { - state = 60; - return true; - } - break; - case 60: - // Aring - if ('g' == current) { - match = "\u00C5"; - matchLength = consumedCount; - state = 61; - return true; - } - break; - case 61: - // Aring; - if (';' == current) { - match = "\u00C5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 62: - if ('c' == current) { - state = 63; - return true; - } - else if ('s' == current) { - state = 65; - return true; - } - break; - case 63: - if ('r' == current) { - state = 64; - return true; - } - break; - case 64: - // Ascr; - if (';' == current) { - match = "\uD835\uDC9C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 65: - if ('i' == current) { - state = 66; - return true; - } - break; - case 66: - if ('g' == current) { - state = 67; - return true; - } - break; - case 67: - if ('n' == current) { - state = 68; - return true; - } - break; - case 68: - // Assign; - if (';' == current) { - match = "\u2254"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 69: - if ('i' == current) { - state = 70; - return true; - } - break; - case 70: - if ('l' == current) { - state = 71; - return true; - } - break; - case 71: - if ('d' == current) { - state = 72; - return true; - } - break; - case 72: - // Atilde - if ('e' == current) { - match = "\u00C3"; - matchLength = consumedCount; - state = 73; - return true; - } - break; - case 73: - // Atilde; - if (';' == current) { - match = "\u00C3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 74: - if ('m' == current) { - state = 75; - return true; - } - break; - case 75: - // Auml - if ('l' == current) { - match = "\u00C4"; - matchLength = consumedCount; - state = 76; - return true; - } - break; - case 76: - // Auml; - if (';' == current) { - match = "\u00C4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 77: - switch (current) { - case 'a': - state = 78; - return true; - case 'c': - state = 91; - return true; - case 'e': - state = 93; - return true; - case 'f': - state = 109; - return true; - case 'o': - state = 111; - return true; - case 'r': - state = 114; - return true; - case 's': - state = 118; - return true; - case 'u': - state = 121; - return true; - } - break; - case 78: - if ('c' == current) { - state = 79; - return true; - } - else if ('r' == current) { - state = 86; - return true; - } - break; - case 79: - if ('k' == current) { - state = 80; - return true; - } - break; - case 80: - if ('s' == current) { - state = 81; - return true; - } - break; - case 81: - if ('l' == current) { - state = 82; - return true; - } - break; - case 82: - if ('a' == current) { - state = 83; - return true; - } - break; - case 83: - if ('s' == current) { - state = 84; - return true; - } - break; - case 84: - if ('h' == current) { - state = 85; - return true; - } - break; - case 85: - // Backslash; - if (';' == current) { - match = "\u2216"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 86: - if ('v' == current) { - state = 87; - return true; - } - else if ('w' == current) { - state = 88; - return true; - } - break; - case 87: - // Barv; - if (';' == current) { - match = "\u2AE7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 88: - if ('e' == current) { - state = 89; - return true; - } - break; - case 89: - if ('d' == current) { - state = 90; - return true; - } - break; - case 90: - // Barwed; - if (';' == current) { - match = "\u2306"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 91: - if ('y' == current) { - state = 92; - return true; - } - break; - case 92: - // Bcy; - if (';' == current) { - match = "\u0411"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 93: - switch (current) { - case 'c': - state = 94; - return true; - case 'r': - state = 99; - return true; - case 't': - state = 107; - return true; - } - break; - case 94: - if ('a' == current) { - state = 95; - return true; - } - break; - case 95: - if ('u' == current) { - state = 96; - return true; - } - break; - case 96: - if ('s' == current) { - state = 97; - return true; - } - break; - case 97: - if ('e' == current) { - state = 98; - return true; - } - break; - case 98: - // Because; - if (';' == current) { - match = "\u2235"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 99: - if ('n' == current) { - state = 100; - return true; - } - break; - case 100: - if ('o' == current) { - state = 101; - return true; - } - break; - case 101: - if ('u' == current) { - state = 102; - return true; - } - break; - case 102: - if ('l' == current) { - state = 103; - return true; - } - break; - case 103: - if ('l' == current) { - state = 104; - return true; - } - break; - case 104: - if ('i' == current) { - state = 105; - return true; - } - break; - case 105: - if ('s' == current) { - state = 106; - return true; - } - break; - case 106: - // Bernoullis; - if (';' == current) { - match = "\u212C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 107: - if ('a' == current) { - state = 108; - return true; - } - break; - case 108: - // Beta; - if (';' == current) { - match = "\u0392"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 109: - if ('r' == current) { - state = 110; - return true; - } - break; - case 110: - // Bfr; - if (';' == current) { - match = "\uD835\uDD05"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 111: - if ('p' == current) { - state = 112; - return true; - } - break; - case 112: - if ('f' == current) { - state = 113; - return true; - } - break; - case 113: - // Bopf; - if (';' == current) { - match = "\uD835\uDD39"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 114: - if ('e' == current) { - state = 115; - return true; - } - break; - case 115: - if ('v' == current) { - state = 116; - return true; - } - break; - case 116: - if ('e' == current) { - state = 117; - return true; - } - break; - case 117: - // Breve; - if (';' == current) { - match = "\u02D8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 118: - if ('c' == current) { - state = 119; - return true; - } - break; - case 119: - if ('r' == current) { - state = 120; - return true; - } - break; - case 120: - // Bscr; - if (';' == current) { - match = "\u212C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 121: - if ('m' == current) { - state = 122; - return true; - } - break; - case 122: - if ('p' == current) { - state = 123; - return true; - } - break; - case 123: - if ('e' == current) { - state = 124; - return true; - } - break; - case 124: - if ('q' == current) { - state = 125; - return true; - } - break; - case 125: - // Bumpeq; - if (';' == current) { - match = "\u224E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 126: - switch (current) { - case 'H': - state = 127; - return true; - case 'O': - state = 130; - return true; - case 'a': - state = 133; - return true; - case 'c': - state = 161; - return true; - case 'd': - state = 178; - return true; - case 'e': - state = 181; - return true; - case 'f': - state = 194; - return true; - case 'h': - state = 196; - return true; - case 'i': - state = 198; - return true; - case 'l': - state = 220; - return true; - case 'o': - state = 266; - return true; - case 'r': - state = 330; - return true; - case 's': - state = 334; - return true; - case 'u': - state = 337; - return true; - } - break; - case 127: - if ('c' == current) { - state = 128; - return true; - } - break; - case 128: - if ('y' == current) { - state = 129; - return true; - } - break; - case 129: - // CHcy; - if (';' == current) { - match = "\u0427"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 130: - if ('P' == current) { - state = 131; - return true; - } - break; - case 131: - // COPY - if ('Y' == current) { - match = "\u00A9"; - matchLength = consumedCount; - state = 132; - return true; - } - break; - case 132: - // COPY; - if (';' == current) { - match = "\u00A9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 133: - switch (current) { - case 'c': - state = 134; - return true; - case 'p': - state = 138; - return true; - case 'y': - state = 156; - return true; - } - break; - case 134: - if ('u' == current) { - state = 135; - return true; - } - break; - case 135: - if ('t' == current) { - state = 136; - return true; - } - break; - case 136: - if ('e' == current) { - state = 137; - return true; - } - break; - case 137: - // Cacute; - if (';' == current) { - match = "\u0106"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 138: - // Cap; - if (';' == current) { - match = "\u22D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('i' == current) { - state = 139; - return true; - } - break; - case 139: - if ('t' == current) { - state = 140; - return true; - } - break; - case 140: - if ('a' == current) { - state = 141; - return true; - } - break; - case 141: - if ('l' == current) { - state = 142; - return true; - } - break; - case 142: - if ('D' == current) { - state = 143; - return true; - } - break; - case 143: - if ('i' == current) { - state = 144; - return true; - } - break; - case 144: - if ('f' == current) { - state = 145; - return true; - } - break; - case 145: - if ('f' == current) { - state = 146; - return true; - } - break; - case 146: - if ('e' == current) { - state = 147; - return true; - } - break; - case 147: - if ('r' == current) { - state = 148; - return true; - } - break; - case 148: - if ('e' == current) { - state = 149; - return true; - } - break; - case 149: - if ('n' == current) { - state = 150; - return true; - } - break; - case 150: - if ('t' == current) { - state = 151; - return true; - } - break; - case 151: - if ('i' == current) { - state = 152; - return true; - } - break; - case 152: - if ('a' == current) { - state = 153; - return true; - } - break; - case 153: - if ('l' == current) { - state = 154; - return true; - } - break; - case 154: - if ('D' == current) { - state = 155; - return true; - } - break; - case 155: - // CapitalDifferentialD; - if (';' == current) { - match = "\u2145"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 156: - if ('l' == current) { - state = 157; - return true; - } - break; - case 157: - if ('e' == current) { - state = 158; - return true; - } - break; - case 158: - if ('y' == current) { - state = 159; - return true; - } - break; - case 159: - if ('s' == current) { - state = 160; - return true; - } - break; - case 160: - // Cayleys; - if (';' == current) { - match = "\u212D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 161: - switch (current) { - case 'a': - state = 162; - return true; - case 'e': - state = 166; - return true; - case 'i': - state = 170; - return true; - case 'o': - state = 173; - return true; - } - break; - case 162: - if ('r' == current) { - state = 163; - return true; - } - break; - case 163: - if ('o' == current) { - state = 164; - return true; - } - break; - case 164: - if ('n' == current) { - state = 165; - return true; - } - break; - case 165: - // Ccaron; - if (';' == current) { - match = "\u010C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 166: - if ('d' == current) { - state = 167; - return true; - } - break; - case 167: - if ('i' == current) { - state = 168; - return true; - } - break; - case 168: - // Ccedil - if ('l' == current) { - match = "\u00C7"; - matchLength = consumedCount; - state = 169; - return true; - } - break; - case 169: - // Ccedil; - if (';' == current) { - match = "\u00C7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 170: - if ('r' == current) { - state = 171; - return true; - } - break; - case 171: - if ('c' == current) { - state = 172; - return true; - } - break; - case 172: - // Ccirc; - if (';' == current) { - match = "\u0108"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 173: - if ('n' == current) { - state = 174; - return true; - } - break; - case 174: - if ('i' == current) { - state = 175; - return true; - } - break; - case 175: - if ('n' == current) { - state = 176; - return true; - } - break; - case 176: - if ('t' == current) { - state = 177; - return true; - } - break; - case 177: - // Cconint; - if (';' == current) { - match = "\u2230"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 178: - if ('o' == current) { - state = 179; - return true; - } - break; - case 179: - if ('t' == current) { - state = 180; - return true; - } - break; - case 180: - // Cdot; - if (';' == current) { - match = "\u010A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 181: - if ('d' == current) { - state = 182; - return true; - } - else if ('n' == current) { - state = 187; - return true; - } - break; - case 182: - if ('i' == current) { - state = 183; - return true; - } - break; - case 183: - if ('l' == current) { - state = 184; - return true; - } - break; - case 184: - if ('l' == current) { - state = 185; - return true; - } - break; - case 185: - if ('a' == current) { - state = 186; - return true; - } - break; - case 186: - // Cedilla; - if (';' == current) { - match = "\u00B8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 187: - if ('t' == current) { - state = 188; - return true; - } - break; - case 188: - if ('e' == current) { - state = 189; - return true; - } - break; - case 189: - if ('r' == current) { - state = 190; - return true; - } - break; - case 190: - if ('D' == current) { - state = 191; - return true; - } - break; - case 191: - if ('o' == current) { - state = 192; - return true; - } - break; - case 192: - if ('t' == current) { - state = 193; - return true; - } - break; - case 193: - // CenterDot; - if (';' == current) { - match = "\u00B7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 194: - if ('r' == current) { - state = 195; - return true; - } - break; - case 195: - // Cfr; - if (';' == current) { - match = "\u212D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 196: - if ('i' == current) { - state = 197; - return true; - } - break; - case 197: - // Chi; - if (';' == current) { - match = "\u03A7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 198: - if ('r' == current) { - state = 199; - return true; - } - break; - case 199: - if ('c' == current) { - state = 200; - return true; - } - break; - case 200: - if ('l' == current) { - state = 201; - return true; - } - break; - case 201: - if ('e' == current) { - state = 202; - return true; - } - break; - case 202: - switch (current) { - case 'D': - state = 203; - return true; - case 'M': - state = 206; - return true; - case 'P': - state = 211; - return true; - case 'T': - state = 215; - return true; - } - break; - case 203: - if ('o' == current) { - state = 204; - return true; - } - break; - case 204: - if ('t' == current) { - state = 205; - return true; - } - break; - case 205: - // CircleDot; - if (';' == current) { - match = "\u2299"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 206: - if ('i' == current) { - state = 207; - return true; - } - break; - case 207: - if ('n' == current) { - state = 208; - return true; - } - break; - case 208: - if ('u' == current) { - state = 209; - return true; - } - break; - case 209: - if ('s' == current) { - state = 210; - return true; - } - break; - case 210: - // CircleMinus; - if (';' == current) { - match = "\u2296"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 211: - if ('l' == current) { - state = 212; - return true; - } - break; - case 212: - if ('u' == current) { - state = 213; - return true; - } - break; - case 213: - if ('s' == current) { - state = 214; - return true; - } - break; - case 214: - // CirclePlus; - if (';' == current) { - match = "\u2295"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 215: - if ('i' == current) { - state = 216; - return true; - } - break; - case 216: - if ('m' == current) { - state = 217; - return true; - } - break; - case 217: - if ('e' == current) { - state = 218; - return true; - } - break; - case 218: - if ('s' == current) { - state = 219; - return true; - } - break; - case 219: - // CircleTimes; - if (';' == current) { - match = "\u2297"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 220: - if ('o' == current) { - state = 221; - return true; - } - break; - case 221: - if ('c' == current) { - state = 222; - return true; - } - else if ('s' == current) { - state = 243; - return true; - } - break; - case 222: - if ('k' == current) { - state = 223; - return true; - } - break; - case 223: - if ('w' == current) { - state = 224; - return true; - } - break; - case 224: - if ('i' == current) { - state = 225; - return true; - } - break; - case 225: - if ('s' == current) { - state = 226; - return true; - } - break; - case 226: - if ('e' == current) { - state = 227; - return true; - } - break; - case 227: - if ('C' == current) { - state = 228; - return true; - } - break; - case 228: - if ('o' == current) { - state = 229; - return true; - } - break; - case 229: - if ('n' == current) { - state = 230; - return true; - } - break; - case 230: - if ('t' == current) { - state = 231; - return true; - } - break; - case 231: - if ('o' == current) { - state = 232; - return true; - } - break; - case 232: - if ('u' == current) { - state = 233; - return true; - } - break; - case 233: - if ('r' == current) { - state = 234; - return true; - } - break; - case 234: - if ('I' == current) { - state = 235; - return true; - } - break; - case 235: - if ('n' == current) { - state = 236; - return true; - } - break; - case 236: - if ('t' == current) { - state = 237; - return true; - } - break; - case 237: - if ('e' == current) { - state = 238; - return true; - } - break; - case 238: - if ('g' == current) { - state = 239; - return true; - } - break; - case 239: - if ('r' == current) { - state = 240; - return true; - } - break; - case 240: - if ('a' == current) { - state = 241; - return true; - } - break; - case 241: - if ('l' == current) { - state = 242; - return true; - } - break; - case 242: - // ClockwiseContourIntegral; - if (';' == current) { - match = "\u2232"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 243: - if ('e' == current) { - state = 244; - return true; - } - break; - case 244: - if ('C' == current) { - state = 245; - return true; - } - break; - case 245: - if ('u' == current) { - state = 246; - return true; - } - break; - case 246: - if ('r' == current) { - state = 247; - return true; - } - break; - case 247: - if ('l' == current) { - state = 248; - return true; - } - break; - case 248: - if ('y' == current) { - state = 249; - return true; - } - break; - case 249: - if ('D' == current) { - state = 250; - return true; - } - else if ('Q' == current) { - state = 261; - return true; - } - break; - case 250: - if ('o' == current) { - state = 251; - return true; - } - break; - case 251: - if ('u' == current) { - state = 252; - return true; - } - break; - case 252: - if ('b' == current) { - state = 253; - return true; - } - break; - case 253: - if ('l' == current) { - state = 254; - return true; - } - break; - case 254: - if ('e' == current) { - state = 255; - return true; - } - break; - case 255: - if ('Q' == current) { - state = 256; - return true; - } - break; - case 256: - if ('u' == current) { - state = 257; - return true; - } - break; - case 257: - if ('o' == current) { - state = 258; - return true; - } - break; - case 258: - if ('t' == current) { - state = 259; - return true; - } - break; - case 259: - if ('e' == current) { - state = 260; - return true; - } - break; - case 260: - // CloseCurlyDoubleQuote; - if (';' == current) { - match = "\u201D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 261: - if ('u' == current) { - state = 262; - return true; - } - break; - case 262: - if ('o' == current) { - state = 263; - return true; - } - break; - case 263: - if ('t' == current) { - state = 264; - return true; - } - break; - case 264: - if ('e' == current) { - state = 265; - return true; - } - break; - case 265: - // CloseCurlyQuote; - if (';' == current) { - match = "\u2019"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 266: - switch (current) { - case 'l': - state = 267; - return true; - case 'n': - state = 271; - return true; - case 'p': - state = 293; - return true; - case 'u': - state = 301; - return true; - } - break; - case 267: - if ('o' == current) { - state = 268; - return true; - } - break; - case 268: - if ('n' == current) { - state = 269; - return true; - } - break; - case 269: - // Colon; - if (';' == current) { - match = "\u2237"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 270; - return true; - } - break; - case 270: - // Colone; - if (';' == current) { - match = "\u2A74"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 271: - switch (current) { - case 'g': - state = 272; - return true; - case 'i': - state = 278; - return true; - case 't': - state = 281; - return true; - } - break; - case 272: - if ('r' == current) { - state = 273; - return true; - } - break; - case 273: - if ('u' == current) { - state = 274; - return true; - } - break; - case 274: - if ('e' == current) { - state = 275; - return true; - } - break; - case 275: - if ('n' == current) { - state = 276; - return true; - } - break; - case 276: - if ('t' == current) { - state = 277; - return true; - } - break; - case 277: - // Congruent; - if (';' == current) { - match = "\u2261"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 278: - if ('n' == current) { - state = 279; - return true; - } - break; - case 279: - if ('t' == current) { - state = 280; - return true; - } - break; - case 280: - // Conint; - if (';' == current) { - match = "\u222F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 281: - if ('o' == current) { - state = 282; - return true; - } - break; - case 282: - if ('u' == current) { - state = 283; - return true; - } - break; - case 283: - if ('r' == current) { - state = 284; - return true; - } - break; - case 284: - if ('I' == current) { - state = 285; - return true; - } - break; - case 285: - if ('n' == current) { - state = 286; - return true; - } - break; - case 286: - if ('t' == current) { - state = 287; - return true; - } - break; - case 287: - if ('e' == current) { - state = 288; - return true; - } - break; - case 288: - if ('g' == current) { - state = 289; - return true; - } - break; - case 289: - if ('r' == current) { - state = 290; - return true; - } - break; - case 290: - if ('a' == current) { - state = 291; - return true; - } - break; - case 291: - if ('l' == current) { - state = 292; - return true; - } - break; - case 292: - // ContourIntegral; - if (';' == current) { - match = "\u222E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 293: - if ('f' == current) { - state = 294; - return true; - } - else if ('r' == current) { - state = 295; - return true; - } - break; - case 294: - // Copf; - if (';' == current) { - match = "\u2102"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 295: - if ('o' == current) { - state = 296; - return true; - } - break; - case 296: - if ('d' == current) { - state = 297; - return true; - } - break; - case 297: - if ('u' == current) { - state = 298; - return true; - } - break; - case 298: - if ('c' == current) { - state = 299; - return true; - } - break; - case 299: - if ('t' == current) { - state = 300; - return true; - } - break; - case 300: - // Coproduct; - if (';' == current) { - match = "\u2210"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 301: - if ('n' == current) { - state = 302; - return true; - } - break; - case 302: - if ('t' == current) { - state = 303; - return true; - } - break; - case 303: - if ('e' == current) { - state = 304; - return true; - } - break; - case 304: - if ('r' == current) { - state = 305; - return true; - } - break; - case 305: - if ('C' == current) { - state = 306; - return true; - } - break; - case 306: - if ('l' == current) { - state = 307; - return true; - } - break; - case 307: - if ('o' == current) { - state = 308; - return true; - } - break; - case 308: - if ('c' == current) { - state = 309; - return true; - } - break; - case 309: - if ('k' == current) { - state = 310; - return true; - } - break; - case 310: - if ('w' == current) { - state = 311; - return true; - } - break; - case 311: - if ('i' == current) { - state = 312; - return true; - } - break; - case 312: - if ('s' == current) { - state = 313; - return true; - } - break; - case 313: - if ('e' == current) { - state = 314; - return true; - } - break; - case 314: - if ('C' == current) { - state = 315; - return true; - } - break; - case 315: - if ('o' == current) { - state = 316; - return true; - } - break; - case 316: - if ('n' == current) { - state = 317; - return true; - } - break; - case 317: - if ('t' == current) { - state = 318; - return true; - } - break; - case 318: - if ('o' == current) { - state = 319; - return true; - } - break; - case 319: - if ('u' == current) { - state = 320; - return true; - } - break; - case 320: - if ('r' == current) { - state = 321; - return true; - } - break; - case 321: - if ('I' == current) { - state = 322; - return true; - } - break; - case 322: - if ('n' == current) { - state = 323; - return true; - } - break; - case 323: - if ('t' == current) { - state = 324; - return true; - } - break; - case 324: - if ('e' == current) { - state = 325; - return true; - } - break; - case 325: - if ('g' == current) { - state = 326; - return true; - } - break; - case 326: - if ('r' == current) { - state = 327; - return true; - } - break; - case 327: - if ('a' == current) { - state = 328; - return true; - } - break; - case 328: - if ('l' == current) { - state = 329; - return true; - } - break; - case 329: - // CounterClockwiseContourIntegral; - if (';' == current) { - match = "\u2233"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 330: - if ('o' == current) { - state = 331; - return true; - } - break; - case 331: - if ('s' == current) { - state = 332; - return true; - } - break; - case 332: - if ('s' == current) { - state = 333; - return true; - } - break; - case 333: - // Cross; - if (';' == current) { - match = "\u2A2F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 334: - if ('c' == current) { - state = 335; - return true; - } - break; - case 335: - if ('r' == current) { - state = 336; - return true; - } - break; - case 336: - // Cscr; - if (';' == current) { - match = "\uD835\uDC9E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 337: - if ('p' == current) { - state = 338; - return true; - } - break; - case 338: - // Cup; - if (';' == current) { - match = "\u22D3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('C' == current) { - state = 339; - return true; - } - break; - case 339: - if ('a' == current) { - state = 340; - return true; - } - break; - case 340: - if ('p' == current) { - state = 341; - return true; - } - break; - case 341: - // CupCap; - if (';' == current) { - match = "\u224D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 342: - switch (current) { - case 'D': - state = 343; - return true; - case 'J': - state = 350; - return true; - case 'S': - state = 353; - return true; - case 'Z': - state = 356; - return true; - case 'a': - state = 359; - return true; - case 'c': - state = 369; - return true; - case 'e': - state = 375; - return true; - case 'f': - state = 379; - return true; - case 'i': - state = 381; - return true; - case 'o': - state = 433; - return true; - case 's': - state = 659; - return true; - } - break; - case 343: - // DD; - if (';' == current) { - match = "\u2145"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 344; - return true; - } - break; - case 344: - if ('t' == current) { - state = 345; - return true; - } - break; - case 345: - if ('r' == current) { - state = 346; - return true; - } - break; - case 346: - if ('a' == current) { - state = 347; - return true; - } - break; - case 347: - if ('h' == current) { - state = 348; - return true; - } - break; - case 348: - if ('d' == current) { - state = 349; - return true; - } - break; - case 349: - // DDotrahd; - if (';' == current) { - match = "\u2911"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 350: - if ('c' == current) { - state = 351; - return true; - } - break; - case 351: - if ('y' == current) { - state = 352; - return true; - } - break; - case 352: - // DJcy; - if (';' == current) { - match = "\u0402"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 353: - if ('c' == current) { - state = 354; - return true; - } - break; - case 354: - if ('y' == current) { - state = 355; - return true; - } - break; - case 355: - // DScy; - if (';' == current) { - match = "\u0405"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 356: - if ('c' == current) { - state = 357; - return true; - } - break; - case 357: - if ('y' == current) { - state = 358; - return true; - } - break; - case 358: - // DZcy; - if (';' == current) { - match = "\u040F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 359: - switch (current) { - case 'g': - state = 360; - return true; - case 'r': - state = 364; - return true; - case 's': - state = 366; - return true; - } - break; - case 360: - if ('g' == current) { - state = 361; - return true; - } - break; - case 361: - if ('e' == current) { - state = 362; - return true; - } - break; - case 362: - if ('r' == current) { - state = 363; - return true; - } - break; - case 363: - // Dagger; - if (';' == current) { - match = "\u2021"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 364: - if ('r' == current) { - state = 365; - return true; - } - break; - case 365: - // Darr; - if (';' == current) { - match = "\u21A1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 366: - if ('h' == current) { - state = 367; - return true; - } - break; - case 367: - if ('v' == current) { - state = 368; - return true; - } - break; - case 368: - // Dashv; - if (';' == current) { - match = "\u2AE4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 369: - if ('a' == current) { - state = 370; - return true; - } - else if ('y' == current) { - state = 374; - return true; - } - break; - case 370: - if ('r' == current) { - state = 371; - return true; - } - break; - case 371: - if ('o' == current) { - state = 372; - return true; - } - break; - case 372: - if ('n' == current) { - state = 373; - return true; - } - break; - case 373: - // Dcaron; - if (';' == current) { - match = "\u010E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 374: - // Dcy; - if (';' == current) { - match = "\u0414"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 375: - if ('l' == current) { - state = 376; - return true; - } - break; - case 376: - // Del; - if (';' == current) { - match = "\u2207"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('t' == current) { - state = 377; - return true; - } - break; - case 377: - if ('a' == current) { - state = 378; - return true; - } - break; - case 378: - // Delta; - if (';' == current) { - match = "\u0394"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 379: - if ('r' == current) { - state = 380; - return true; - } - break; - case 380: - // Dfr; - if (';' == current) { - match = "\uD835\uDD07"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 381: - if ('a' == current) { - state = 382; - return true; - } - else if ('f' == current) { - state = 422; - return true; - } - break; - case 382: - if ('c' == current) { - state = 383; - return true; - } - else if ('m' == current) { - state = 418; - return true; - } - break; - case 383: - if ('r' == current) { - state = 384; - return true; - } - break; - case 384: - if ('i' == current) { - state = 385; - return true; - } - break; - case 385: - if ('t' == current) { - state = 386; - return true; - } - break; - case 386: - if ('i' == current) { - state = 387; - return true; - } - break; - case 387: - if ('c' == current) { - state = 388; - return true; - } - break; - case 388: - if ('a' == current) { - state = 389; - return true; - } - break; - case 389: - if ('l' == current) { - state = 390; - return true; - } - break; - case 390: - switch (current) { - case 'A': - state = 391; - return true; - case 'D': - state = 396; - return true; - case 'G': - state = 408; - return true; - case 'T': - state = 413; - return true; - } - break; - case 391: - if ('c' == current) { - state = 392; - return true; - } - break; - case 392: - if ('u' == current) { - state = 393; - return true; - } - break; - case 393: - if ('t' == current) { - state = 394; - return true; - } - break; - case 394: - if ('e' == current) { - state = 395; - return true; - } - break; - case 395: - // DiacriticalAcute; - if (';' == current) { - match = "\u00B4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 396: - if ('o' == current) { - state = 397; - return true; - } - break; - case 397: - if ('t' == current) { - state = 398; - return true; - } - else if ('u' == current) { - state = 399; - return true; - } - break; - case 398: - // DiacriticalDot; - if (';' == current) { - match = "\u02D9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 399: - if ('b' == current) { - state = 400; - return true; - } - break; - case 400: - if ('l' == current) { - state = 401; - return true; - } - break; - case 401: - if ('e' == current) { - state = 402; - return true; - } - break; - case 402: - if ('A' == current) { - state = 403; - return true; - } - break; - case 403: - if ('c' == current) { - state = 404; - return true; - } - break; - case 404: - if ('u' == current) { - state = 405; - return true; - } - break; - case 405: - if ('t' == current) { - state = 406; - return true; - } - break; - case 406: - if ('e' == current) { - state = 407; - return true; - } - break; - case 407: - // DiacriticalDoubleAcute; - if (';' == current) { - match = "\u02DD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 408: - if ('r' == current) { - state = 409; - return true; - } - break; - case 409: - if ('a' == current) { - state = 410; - return true; - } - break; - case 410: - if ('v' == current) { - state = 411; - return true; - } - break; - case 411: - if ('e' == current) { - state = 412; - return true; - } - break; - case 412: - // DiacriticalGrave; - if (';' == current) { - match = "`"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 413: - if ('i' == current) { - state = 414; - return true; - } - break; - case 414: - if ('l' == current) { - state = 415; - return true; - } - break; - case 415: - if ('d' == current) { - state = 416; - return true; - } - break; - case 416: - if ('e' == current) { - state = 417; - return true; - } - break; - case 417: - // DiacriticalTilde; - if (';' == current) { - match = "\u02DC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 418: - if ('o' == current) { - state = 419; - return true; - } - break; - case 419: - if ('n' == current) { - state = 420; - return true; - } - break; - case 420: - if ('d' == current) { - state = 421; - return true; - } - break; - case 421: - // Diamond; - if (';' == current) { - match = "\u22C4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 422: - if ('f' == current) { - state = 423; - return true; - } - break; - case 423: - if ('e' == current) { - state = 424; - return true; - } - break; - case 424: - if ('r' == current) { - state = 425; - return true; - } - break; - case 425: - if ('e' == current) { - state = 426; - return true; - } - break; - case 426: - if ('n' == current) { - state = 427; - return true; - } - break; - case 427: - if ('t' == current) { - state = 428; - return true; - } - break; - case 428: - if ('i' == current) { - state = 429; - return true; - } - break; - case 429: - if ('a' == current) { - state = 430; - return true; - } - break; - case 430: - if ('l' == current) { - state = 431; - return true; - } - break; - case 431: - if ('D' == current) { - state = 432; - return true; - } - break; - case 432: - // DifferentialD; - if (';' == current) { - match = "\u2146"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 433: - switch (current) { - case 'p': - state = 434; - return true; - case 't': - state = 436; - return true; - case 'u': - state = 445; - return true; - case 'w': - state = 568; - return true; - } - break; - case 434: - if ('f' == current) { - state = 435; - return true; - } - break; - case 435: - // Dopf; - if (';' == current) { - match = "\uD835\uDD3B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 436: - switch (current) { - case ';': // Dot; - match = "\u00A8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'D': - state = 437; - return true; - case 'E': - state = 440; - return true; - } - break; - case 437: - if ('o' == current) { - state = 438; - return true; - } - break; - case 438: - if ('t' == current) { - state = 439; - return true; - } - break; - case 439: - // DotDot; - if (';' == current) { - match = "\u20DC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 440: - if ('q' == current) { - state = 441; - return true; - } - break; - case 441: - if ('u' == current) { - state = 442; - return true; - } - break; - case 442: - if ('a' == current) { - state = 443; - return true; - } - break; - case 443: - if ('l' == current) { - state = 444; - return true; - } - break; - case 444: - // DotEqual; - if (';' == current) { - match = "\u2250"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 445: - if ('b' == current) { - state = 446; - return true; - } - break; - case 446: - if ('l' == current) { - state = 447; - return true; - } - break; - case 447: - if ('e' == current) { - state = 448; - return true; - } - break; - case 448: - switch (current) { - case 'C': - state = 449; - return true; - case 'D': - state = 464; - return true; - case 'L': - state = 474; - return true; - case 'R': - state = 528; - return true; - case 'U': - state = 541; - return true; - case 'V': - state = 557; - return true; - } - break; - case 449: - if ('o' == current) { - state = 450; - return true; - } - break; - case 450: - if ('n' == current) { - state = 451; - return true; - } - break; - case 451: - if ('t' == current) { - state = 452; - return true; - } - break; - case 452: - if ('o' == current) { - state = 453; - return true; - } - break; - case 453: - if ('u' == current) { - state = 454; - return true; - } - break; - case 454: - if ('r' == current) { - state = 455; - return true; - } - break; - case 455: - if ('I' == current) { - state = 456; - return true; - } - break; - case 456: - if ('n' == current) { - state = 457; - return true; - } - break; - case 457: - if ('t' == current) { - state = 458; - return true; - } - break; - case 458: - if ('e' == current) { - state = 459; - return true; - } - break; - case 459: - if ('g' == current) { - state = 460; - return true; - } - break; - case 460: - if ('r' == current) { - state = 461; - return true; - } - break; - case 461: - if ('a' == current) { - state = 462; - return true; - } - break; - case 462: - if ('l' == current) { - state = 463; - return true; - } - break; - case 463: - // DoubleContourIntegral; - if (';' == current) { - match = "\u222F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 464: - if ('o' == current) { - state = 465; - return true; - } - break; - case 465: - if ('t' == current) { - state = 466; - return true; - } - else if ('w' == current) { - state = 467; - return true; - } - break; - case 466: - // DoubleDot; - if (';' == current) { - match = "\u00A8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 467: - if ('n' == current) { - state = 468; - return true; - } - break; - case 468: - if ('A' == current) { - state = 469; - return true; - } - break; - case 469: - if ('r' == current) { - state = 470; - return true; - } - break; - case 470: - if ('r' == current) { - state = 471; - return true; - } - break; - case 471: - if ('o' == current) { - state = 472; - return true; - } - break; - case 472: - if ('w' == current) { - state = 473; - return true; - } - break; - case 473: - // DoubleDownArrow; - if (';' == current) { - match = "\u21D3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 474: - if ('e' == current) { - state = 475; - return true; - } - else if ('o' == current) { - state = 496; - return true; - } - break; - case 475: - if ('f' == current) { - state = 476; - return true; - } - break; - case 476: - if ('t' == current) { - state = 477; - return true; - } - break; - case 477: - switch (current) { - case 'A': - state = 478; - return true; - case 'R': - state = 483; - return true; - case 'T': - state = 493; - return true; - } - break; - case 478: - if ('r' == current) { - state = 479; - return true; - } - break; - case 479: - if ('r' == current) { - state = 480; - return true; - } - break; - case 480: - if ('o' == current) { - state = 481; - return true; - } - break; - case 481: - if ('w' == current) { - state = 482; - return true; - } - break; - case 482: - // DoubleLeftArrow; - if (';' == current) { - match = "\u21D0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 483: - if ('i' == current) { - state = 484; - return true; - } - break; - case 484: - if ('g' == current) { - state = 485; - return true; - } - break; - case 485: - if ('h' == current) { - state = 486; - return true; - } - break; - case 486: - if ('t' == current) { - state = 487; - return true; - } - break; - case 487: - if ('A' == current) { - state = 488; - return true; - } - break; - case 488: - if ('r' == current) { - state = 489; - return true; - } - break; - case 489: - if ('r' == current) { - state = 490; - return true; - } - break; - case 490: - if ('o' == current) { - state = 491; - return true; - } - break; - case 491: - if ('w' == current) { - state = 492; - return true; - } - break; - case 492: - // DoubleLeftRightArrow; - if (';' == current) { - match = "\u21D4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 493: - if ('e' == current) { - state = 494; - return true; - } - break; - case 494: - if ('e' == current) { - state = 495; - return true; - } - break; - case 495: - // DoubleLeftTee; - if (';' == current) { - match = "\u2AE4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 496: - if ('n' == current) { - state = 497; - return true; - } - break; - case 497: - if ('g' == current) { - state = 498; - return true; - } - break; - case 498: - if ('L' == current) { - state = 499; - return true; - } - else if ('R' == current) { - state = 518; - return true; - } - break; - case 499: - if ('e' == current) { - state = 500; - return true; - } - break; - case 500: - if ('f' == current) { - state = 501; - return true; - } - break; - case 501: - if ('t' == current) { - state = 502; - return true; - } - break; - case 502: - if ('A' == current) { - state = 503; - return true; - } - else if ('R' == current) { - state = 508; - return true; - } - break; - case 503: - if ('r' == current) { - state = 504; - return true; - } - break; - case 504: - if ('r' == current) { - state = 505; - return true; - } - break; - case 505: - if ('o' == current) { - state = 506; - return true; - } - break; - case 506: - if ('w' == current) { - state = 507; - return true; - } - break; - case 507: - // DoubleLongLeftArrow; - if (';' == current) { - match = "\u27F8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 508: - if ('i' == current) { - state = 509; - return true; - } - break; - case 509: - if ('g' == current) { - state = 510; - return true; - } - break; - case 510: - if ('h' == current) { - state = 511; - return true; - } - break; - case 511: - if ('t' == current) { - state = 512; - return true; - } - break; - case 512: - if ('A' == current) { - state = 513; - return true; - } - break; - case 513: - if ('r' == current) { - state = 514; - return true; - } - break; - case 514: - if ('r' == current) { - state = 515; - return true; - } - break; - case 515: - if ('o' == current) { - state = 516; - return true; - } - break; - case 516: - if ('w' == current) { - state = 517; - return true; - } - break; - case 517: - // DoubleLongLeftRightArrow; - if (';' == current) { - match = "\u27FA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 518: - if ('i' == current) { - state = 519; - return true; - } - break; - case 519: - if ('g' == current) { - state = 520; - return true; - } - break; - case 520: - if ('h' == current) { - state = 521; - return true; - } - break; - case 521: - if ('t' == current) { - state = 522; - return true; - } - break; - case 522: - if ('A' == current) { - state = 523; - return true; - } - break; - case 523: - if ('r' == current) { - state = 524; - return true; - } - break; - case 524: - if ('r' == current) { - state = 525; - return true; - } - break; - case 525: - if ('o' == current) { - state = 526; - return true; - } - break; - case 526: - if ('w' == current) { - state = 527; - return true; - } - break; - case 527: - // DoubleLongRightArrow; - if (';' == current) { - match = "\u27F9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 528: - if ('i' == current) { - state = 529; - return true; - } - break; - case 529: - if ('g' == current) { - state = 530; - return true; - } - break; - case 530: - if ('h' == current) { - state = 531; - return true; - } - break; - case 531: - if ('t' == current) { - state = 532; - return true; - } - break; - case 532: - if ('A' == current) { - state = 533; - return true; - } - else if ('T' == current) { - state = 538; - return true; - } - break; - case 533: - if ('r' == current) { - state = 534; - return true; - } - break; - case 534: - if ('r' == current) { - state = 535; - return true; - } - break; - case 535: - if ('o' == current) { - state = 536; - return true; - } - break; - case 536: - if ('w' == current) { - state = 537; - return true; - } - break; - case 537: - // DoubleRightArrow; - if (';' == current) { - match = "\u21D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 538: - if ('e' == current) { - state = 539; - return true; - } - break; - case 539: - if ('e' == current) { - state = 540; - return true; - } - break; - case 540: - // DoubleRightTee; - if (';' == current) { - match = "\u22A8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 541: - if ('p' == current) { - state = 542; - return true; - } - break; - case 542: - if ('A' == current) { - state = 543; - return true; - } - else if ('D' == current) { - state = 548; - return true; - } - break; - case 543: - if ('r' == current) { - state = 544; - return true; - } - break; - case 544: - if ('r' == current) { - state = 545; - return true; - } - break; - case 545: - if ('o' == current) { - state = 546; - return true; - } - break; - case 546: - if ('w' == current) { - state = 547; - return true; - } - break; - case 547: - // DoubleUpArrow; - if (';' == current) { - match = "\u21D1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 548: - if ('o' == current) { - state = 549; - return true; - } - break; - case 549: - if ('w' == current) { - state = 550; - return true; - } - break; - case 550: - if ('n' == current) { - state = 551; - return true; - } - break; - case 551: - if ('A' == current) { - state = 552; - return true; - } - break; - case 552: - if ('r' == current) { - state = 553; - return true; - } - break; - case 553: - if ('r' == current) { - state = 554; - return true; - } - break; - case 554: - if ('o' == current) { - state = 555; - return true; - } - break; - case 555: - if ('w' == current) { - state = 556; - return true; - } - break; - case 556: - // DoubleUpDownArrow; - if (';' == current) { - match = "\u21D5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 557: - if ('e' == current) { - state = 558; - return true; - } - break; - case 558: - if ('r' == current) { - state = 559; - return true; - } - break; - case 559: - if ('t' == current) { - state = 560; - return true; - } - break; - case 560: - if ('i' == current) { - state = 561; - return true; - } - break; - case 561: - if ('c' == current) { - state = 562; - return true; - } - break; - case 562: - if ('a' == current) { - state = 563; - return true; - } - break; - case 563: - if ('l' == current) { - state = 564; - return true; - } - break; - case 564: - if ('B' == current) { - state = 565; - return true; - } - break; - case 565: - if ('a' == current) { - state = 566; - return true; - } - break; - case 566: - if ('r' == current) { - state = 567; - return true; - } - break; - case 567: - // DoubleVerticalBar; - if (';' == current) { - match = "\u2225"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 568: - if ('n' == current) { - state = 569; - return true; - } - break; - case 569: - switch (current) { - case 'A': - state = 570; - return true; - case 'B': - state = 585; - return true; - case 'L': - state = 590; - return true; - case 'R': - state = 623; - return true; - case 'T': - state = 646; - return true; - case 'a': - state = 654; - return true; - } - break; - case 570: - if ('r' == current) { - state = 571; - return true; - } - break; - case 571: - if ('r' == current) { - state = 572; - return true; - } - break; - case 572: - if ('o' == current) { - state = 573; - return true; - } - break; - case 573: - if ('w' == current) { - state = 574; - return true; - } - break; - case 574: - switch (current) { - case ';': // DownArrow; - match = "\u2193"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'B': - state = 575; - return true; - case 'U': - state = 578; - return true; - } - break; - case 575: - if ('a' == current) { - state = 576; - return true; - } - break; - case 576: - if ('r' == current) { - state = 577; - return true; - } - break; - case 577: - // DownArrowBar; - if (';' == current) { - match = "\u2913"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 578: - if ('p' == current) { - state = 579; - return true; - } - break; - case 579: - if ('A' == current) { - state = 580; - return true; - } - break; - case 580: - if ('r' == current) { - state = 581; - return true; - } - break; - case 581: - if ('r' == current) { - state = 582; - return true; - } - break; - case 582: - if ('o' == current) { - state = 583; - return true; - } - break; - case 583: - if ('w' == current) { - state = 584; - return true; - } - break; - case 584: - // DownArrowUpArrow; - if (';' == current) { - match = "\u21F5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 585: - if ('r' == current) { - state = 586; - return true; - } - break; - case 586: - if ('e' == current) { - state = 587; - return true; - } - break; - case 587: - if ('v' == current) { - state = 588; - return true; - } - break; - case 588: - if ('e' == current) { - state = 589; - return true; - } - break; - case 589: - // DownBreve; - if (';' == current) { - match = "\u0311"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 590: - if ('e' == current) { - state = 591; - return true; - } - break; - case 591: - if ('f' == current) { - state = 592; - return true; - } - break; - case 592: - if ('t' == current) { - state = 593; - return true; - } - break; - case 593: - switch (current) { - case 'R': - state = 594; - return true; - case 'T': - state = 605; - return true; - case 'V': - state = 614; - return true; - } - break; - case 594: - if ('i' == current) { - state = 595; - return true; - } - break; - case 595: - if ('g' == current) { - state = 596; - return true; - } - break; - case 596: - if ('h' == current) { - state = 597; - return true; - } - break; - case 597: - if ('t' == current) { - state = 598; - return true; - } - break; - case 598: - if ('V' == current) { - state = 599; - return true; - } - break; - case 599: - if ('e' == current) { - state = 600; - return true; - } - break; - case 600: - if ('c' == current) { - state = 601; - return true; - } - break; - case 601: - if ('t' == current) { - state = 602; - return true; - } - break; - case 602: - if ('o' == current) { - state = 603; - return true; - } - break; - case 603: - if ('r' == current) { - state = 604; - return true; - } - break; - case 604: - // DownLeftRightVector; - if (';' == current) { - match = "\u2950"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 605: - if ('e' == current) { - state = 606; - return true; - } - break; - case 606: - if ('e' == current) { - state = 607; - return true; - } - break; - case 607: - if ('V' == current) { - state = 608; - return true; - } - break; - case 608: - if ('e' == current) { - state = 609; - return true; - } - break; - case 609: - if ('c' == current) { - state = 610; - return true; - } - break; - case 610: - if ('t' == current) { - state = 611; - return true; - } - break; - case 611: - if ('o' == current) { - state = 612; - return true; - } - break; - case 612: - if ('r' == current) { - state = 613; - return true; - } - break; - case 613: - // DownLeftTeeVector; - if (';' == current) { - match = "\u295E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 614: - if ('e' == current) { - state = 615; - return true; - } - break; - case 615: - if ('c' == current) { - state = 616; - return true; - } - break; - case 616: - if ('t' == current) { - state = 617; - return true; - } - break; - case 617: - if ('o' == current) { - state = 618; - return true; - } - break; - case 618: - if ('r' == current) { - state = 619; - return true; - } - break; - case 619: - // DownLeftVector; - if (';' == current) { - match = "\u21BD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('B' == current) { - state = 620; - return true; - } - break; - case 620: - if ('a' == current) { - state = 621; - return true; - } - break; - case 621: - if ('r' == current) { - state = 622; - return true; - } - break; - case 622: - // DownLeftVectorBar; - if (';' == current) { - match = "\u2956"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 623: - if ('i' == current) { - state = 624; - return true; - } - break; - case 624: - if ('g' == current) { - state = 625; - return true; - } - break; - case 625: - if ('h' == current) { - state = 626; - return true; - } - break; - case 626: - if ('t' == current) { - state = 627; - return true; - } - break; - case 627: - if ('T' == current) { - state = 628; - return true; - } - else if ('V' == current) { - state = 637; - return true; - } - break; - case 628: - if ('e' == current) { - state = 629; - return true; - } - break; - case 629: - if ('e' == current) { - state = 630; - return true; - } - break; - case 630: - if ('V' == current) { - state = 631; - return true; - } - break; - case 631: - if ('e' == current) { - state = 632; - return true; - } - break; - case 632: - if ('c' == current) { - state = 633; - return true; - } - break; - case 633: - if ('t' == current) { - state = 634; - return true; - } - break; - case 634: - if ('o' == current) { - state = 635; - return true; - } - break; - case 635: - if ('r' == current) { - state = 636; - return true; - } - break; - case 636: - // DownRightTeeVector; - if (';' == current) { - match = "\u295F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 637: - if ('e' == current) { - state = 638; - return true; - } - break; - case 638: - if ('c' == current) { - state = 639; - return true; - } - break; - case 639: - if ('t' == current) { - state = 640; - return true; - } - break; - case 640: - if ('o' == current) { - state = 641; - return true; - } - break; - case 641: - if ('r' == current) { - state = 642; - return true; - } - break; - case 642: - // DownRightVector; - if (';' == current) { - match = "\u21C1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('B' == current) { - state = 643; - return true; - } - break; - case 643: - if ('a' == current) { - state = 644; - return true; - } - break; - case 644: - if ('r' == current) { - state = 645; - return true; - } - break; - case 645: - // DownRightVectorBar; - if (';' == current) { - match = "\u2957"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 646: - if ('e' == current) { - state = 647; - return true; - } - break; - case 647: - if ('e' == current) { - state = 648; - return true; - } - break; - case 648: - // DownTee; - if (';' == current) { - match = "\u22A4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('A' == current) { - state = 649; - return true; - } - break; - case 649: - if ('r' == current) { - state = 650; - return true; - } - break; - case 650: - if ('r' == current) { - state = 651; - return true; - } - break; - case 651: - if ('o' == current) { - state = 652; - return true; - } - break; - case 652: - if ('w' == current) { - state = 653; - return true; - } - break; - case 653: - // DownTeeArrow; - if (';' == current) { - match = "\u21A7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 654: - if ('r' == current) { - state = 655; - return true; - } - break; - case 655: - if ('r' == current) { - state = 656; - return true; - } - break; - case 656: - if ('o' == current) { - state = 657; - return true; - } - break; - case 657: - if ('w' == current) { - state = 658; - return true; - } - break; - case 658: - // Downarrow; - if (';' == current) { - match = "\u21D3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 659: - if ('c' == current) { - state = 660; - return true; - } - else if ('t' == current) { - state = 662; - return true; - } - break; - case 660: - if ('r' == current) { - state = 661; - return true; - } - break; - case 661: - // Dscr; - if (';' == current) { - match = "\uD835\uDC9F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 662: - if ('r' == current) { - state = 663; - return true; - } - break; - case 663: - if ('o' == current) { - state = 664; - return true; - } - break; - case 664: - if ('k' == current) { - state = 665; - return true; - } - break; - case 665: - // Dstrok; - if (';' == current) { - match = "\u0110"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 666: - switch (current) { - case 'N': - state = 667; - return true; - case 'T': - state = 669; - return true; - case 'a': - state = 671; - return true; - case 'c': - state = 676; - return true; - case 'd': - state = 685; - return true; - case 'f': - state = 688; - return true; - case 'g': - state = 690; - return true; - case 'l': - state = 695; - return true; - case 'm': - state = 701; - return true; - case 'o': - state = 734; - return true; - case 'p': - state = 740; - return true; - case 'q': - state = 746; - return true; - case 's': - state = 763; - return true; - case 't': - state = 768; - return true; - case 'u': - state = 770; - return true; - case 'x': - state = 773; - return true; - } - break; - case 667: - if ('G' == current) { - state = 668; - return true; - } - break; - case 668: - // ENG; - if (';' == current) { - match = "\u014A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 669: - // ETH - if ('H' == current) { - match = "\u00D0"; - matchLength = consumedCount; - state = 670; - return true; - } - break; - case 670: - // ETH; - if (';' == current) { - match = "\u00D0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 671: - if ('c' == current) { - state = 672; - return true; - } - break; - case 672: - if ('u' == current) { - state = 673; - return true; - } - break; - case 673: - if ('t' == current) { - state = 674; - return true; - } - break; - case 674: - // Eacute - if ('e' == current) { - match = "\u00C9"; - matchLength = consumedCount; - state = 675; - return true; - } - break; - case 675: - // Eacute; - if (';' == current) { - match = "\u00C9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 676: - switch (current) { - case 'a': - state = 677; - return true; - case 'i': - state = 681; - return true; - case 'y': - state = 684; - return true; - } - break; - case 677: - if ('r' == current) { - state = 678; - return true; - } - break; - case 678: - if ('o' == current) { - state = 679; - return true; - } - break; - case 679: - if ('n' == current) { - state = 680; - return true; - } - break; - case 680: - // Ecaron; - if (';' == current) { - match = "\u011A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 681: - if ('r' == current) { - state = 682; - return true; - } - break; - case 682: - // Ecirc - if ('c' == current) { - match = "\u00CA"; - matchLength = consumedCount; - state = 683; - return true; - } - break; - case 683: - // Ecirc; - if (';' == current) { - match = "\u00CA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 684: - // Ecy; - if (';' == current) { - match = "\u042D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 685: - if ('o' == current) { - state = 686; - return true; - } - break; - case 686: - if ('t' == current) { - state = 687; - return true; - } - break; - case 687: - // Edot; - if (';' == current) { - match = "\u0116"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 688: - if ('r' == current) { - state = 689; - return true; - } - break; - case 689: - // Efr; - if (';' == current) { - match = "\uD835\uDD08"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 690: - if ('r' == current) { - state = 691; - return true; - } - break; - case 691: - if ('a' == current) { - state = 692; - return true; - } - break; - case 692: - if ('v' == current) { - state = 693; - return true; - } - break; - case 693: - // Egrave - if ('e' == current) { - match = "\u00C8"; - matchLength = consumedCount; - state = 694; - return true; - } - break; - case 694: - // Egrave; - if (';' == current) { - match = "\u00C8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 695: - if ('e' == current) { - state = 696; - return true; - } - break; - case 696: - if ('m' == current) { - state = 697; - return true; - } - break; - case 697: - if ('e' == current) { - state = 698; - return true; - } - break; - case 698: - if ('n' == current) { - state = 699; - return true; - } - break; - case 699: - if ('t' == current) { - state = 700; - return true; - } - break; - case 700: - // Element; - if (';' == current) { - match = "\u2208"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 701: - if ('a' == current) { - state = 702; - return true; - } - else if ('p' == current) { - state = 705; - return true; - } - break; - case 702: - if ('c' == current) { - state = 703; - return true; - } - break; - case 703: - if ('r' == current) { - state = 704; - return true; - } - break; - case 704: - // Emacr; - if (';' == current) { - match = "\u0112"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 705: - if ('t' == current) { - state = 706; - return true; - } - break; - case 706: - if ('y' == current) { - state = 707; - return true; - } - break; - case 707: - if ('S' == current) { - state = 708; - return true; - } - else if ('V' == current) { - state = 719; - return true; - } - break; - case 708: - if ('m' == current) { - state = 709; - return true; - } - break; - case 709: - if ('a' == current) { - state = 710; - return true; - } - break; - case 710: - if ('l' == current) { - state = 711; - return true; - } - break; - case 711: - if ('l' == current) { - state = 712; - return true; - } - break; - case 712: - if ('S' == current) { - state = 713; - return true; - } - break; - case 713: - if ('q' == current) { - state = 714; - return true; - } - break; - case 714: - if ('u' == current) { - state = 715; - return true; - } - break; - case 715: - if ('a' == current) { - state = 716; - return true; - } - break; - case 716: - if ('r' == current) { - state = 717; - return true; - } - break; - case 717: - if ('e' == current) { - state = 718; - return true; - } - break; - case 718: - // EmptySmallSquare; - if (';' == current) { - match = "\u25FB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 719: - if ('e' == current) { - state = 720; - return true; - } - break; - case 720: - if ('r' == current) { - state = 721; - return true; - } - break; - case 721: - if ('y' == current) { - state = 722; - return true; - } - break; - case 722: - if ('S' == current) { - state = 723; - return true; - } - break; - case 723: - if ('m' == current) { - state = 724; - return true; - } - break; - case 724: - if ('a' == current) { - state = 725; - return true; - } - break; - case 725: - if ('l' == current) { - state = 726; - return true; - } - break; - case 726: - if ('l' == current) { - state = 727; - return true; - } - break; - case 727: - if ('S' == current) { - state = 728; - return true; - } - break; - case 728: - if ('q' == current) { - state = 729; - return true; - } - break; - case 729: - if ('u' == current) { - state = 730; - return true; - } - break; - case 730: - if ('a' == current) { - state = 731; - return true; - } - break; - case 731: - if ('r' == current) { - state = 732; - return true; - } - break; - case 732: - if ('e' == current) { - state = 733; - return true; - } - break; - case 733: - // EmptyVerySmallSquare; - if (';' == current) { - match = "\u25AB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 734: - if ('g' == current) { - state = 735; - return true; - } - else if ('p' == current) { - state = 738; - return true; - } - break; - case 735: - if ('o' == current) { - state = 736; - return true; - } - break; - case 736: - if ('n' == current) { - state = 737; - return true; - } - break; - case 737: - // Eogon; - if (';' == current) { - match = "\u0118"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 738: - if ('f' == current) { - state = 739; - return true; - } - break; - case 739: - // Eopf; - if (';' == current) { - match = "\uD835\uDD3C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 740: - if ('s' == current) { - state = 741; - return true; - } - break; - case 741: - if ('i' == current) { - state = 742; - return true; - } - break; - case 742: - if ('l' == current) { - state = 743; - return true; - } - break; - case 743: - if ('o' == current) { - state = 744; - return true; - } - break; - case 744: - if ('n' == current) { - state = 745; - return true; - } - break; - case 745: - // Epsilon; - if (';' == current) { - match = "\u0395"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 746: - if ('u' == current) { - state = 747; - return true; - } - break; - case 747: - if ('a' == current) { - state = 748; - return true; - } - else if ('i' == current) { - state = 755; - return true; - } - break; - case 748: - if ('l' == current) { - state = 749; - return true; - } - break; - case 749: - // Equal; - if (';' == current) { - match = "\u2A75"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('T' == current) { - state = 750; - return true; - } - break; - case 750: - if ('i' == current) { - state = 751; - return true; - } - break; - case 751: - if ('l' == current) { - state = 752; - return true; - } - break; - case 752: - if ('d' == current) { - state = 753; - return true; - } - break; - case 753: - if ('e' == current) { - state = 754; - return true; - } - break; - case 754: - // EqualTilde; - if (';' == current) { - match = "\u2242"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 755: - if ('l' == current) { - state = 756; - return true; - } - break; - case 756: - if ('i' == current) { - state = 757; - return true; - } - break; - case 757: - if ('b' == current) { - state = 758; - return true; - } - break; - case 758: - if ('r' == current) { - state = 759; - return true; - } - break; - case 759: - if ('i' == current) { - state = 760; - return true; - } - break; - case 760: - if ('u' == current) { - state = 761; - return true; - } - break; - case 761: - if ('m' == current) { - state = 762; - return true; - } - break; - case 762: - // Equilibrium; - if (';' == current) { - match = "\u21CC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 763: - if ('c' == current) { - state = 764; - return true; - } - else if ('i' == current) { - state = 766; - return true; - } - break; - case 764: - if ('r' == current) { - state = 765; - return true; - } - break; - case 765: - // Escr; - if (';' == current) { - match = "\u2130"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 766: - if ('m' == current) { - state = 767; - return true; - } - break; - case 767: - // Esim; - if (';' == current) { - match = "\u2A73"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 768: - if ('a' == current) { - state = 769; - return true; - } - break; - case 769: - // Eta; - if (';' == current) { - match = "\u0397"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 770: - if ('m' == current) { - state = 771; - return true; - } - break; - case 771: - // Euml - if ('l' == current) { - match = "\u00CB"; - matchLength = consumedCount; - state = 772; - return true; - } - break; - case 772: - // Euml; - if (';' == current) { - match = "\u00CB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 773: - if ('i' == current) { - state = 774; - return true; - } - else if ('p' == current) { - state = 778; - return true; - } - break; - case 774: - if ('s' == current) { - state = 775; - return true; - } - break; - case 775: - if ('t' == current) { - state = 776; - return true; - } - break; - case 776: - if ('s' == current) { - state = 777; - return true; - } - break; - case 777: - // Exists; - if (';' == current) { - match = "\u2203"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 778: - if ('o' == current) { - state = 779; - return true; - } - break; - case 779: - if ('n' == current) { - state = 780; - return true; - } - break; - case 780: - if ('e' == current) { - state = 781; - return true; - } - break; - case 781: - if ('n' == current) { - state = 782; - return true; - } - break; - case 782: - if ('t' == current) { - state = 783; - return true; - } - break; - case 783: - if ('i' == current) { - state = 784; - return true; - } - break; - case 784: - if ('a' == current) { - state = 785; - return true; - } - break; - case 785: - if ('l' == current) { - state = 786; - return true; - } - break; - case 786: - if ('E' == current) { - state = 787; - return true; - } - break; - case 787: - // ExponentialE; - if (';' == current) { - match = "\u2147"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 788: - switch (current) { - case 'c': - state = 789; - return true; - case 'f': - state = 791; - return true; - case 'i': - state = 793; - return true; - case 'o': - state = 824; - return true; - case 's': - state = 839; - return true; - } - break; - case 789: - if ('y' == current) { - state = 790; - return true; - } - break; - case 790: - // Fcy; - if (';' == current) { - match = "\u0424"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 791: - if ('r' == current) { - state = 792; - return true; - } - break; - case 792: - // Ffr; - if (';' == current) { - match = "\uD835\uDD09"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 793: - if ('l' == current) { - state = 794; - return true; - } - break; - case 794: - if ('l' == current) { - state = 795; - return true; - } - break; - case 795: - if ('e' == current) { - state = 796; - return true; - } - break; - case 796: - if ('d' == current) { - state = 797; - return true; - } - break; - case 797: - if ('S' == current) { - state = 798; - return true; - } - else if ('V' == current) { - state = 809; - return true; - } - break; - case 798: - if ('m' == current) { - state = 799; - return true; - } - break; - case 799: - if ('a' == current) { - state = 800; - return true; - } - break; - case 800: - if ('l' == current) { - state = 801; - return true; - } - break; - case 801: - if ('l' == current) { - state = 802; - return true; - } - break; - case 802: - if ('S' == current) { - state = 803; - return true; - } - break; - case 803: - if ('q' == current) { - state = 804; - return true; - } - break; - case 804: - if ('u' == current) { - state = 805; - return true; - } - break; - case 805: - if ('a' == current) { - state = 806; - return true; - } - break; - case 806: - if ('r' == current) { - state = 807; - return true; - } - break; - case 807: - if ('e' == current) { - state = 808; - return true; - } - break; - case 808: - // FilledSmallSquare; - if (';' == current) { - match = "\u25FC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 809: - if ('e' == current) { - state = 810; - return true; - } - break; - case 810: - if ('r' == current) { - state = 811; - return true; - } - break; - case 811: - if ('y' == current) { - state = 812; - return true; - } - break; - case 812: - if ('S' == current) { - state = 813; - return true; - } - break; - case 813: - if ('m' == current) { - state = 814; - return true; - } - break; - case 814: - if ('a' == current) { - state = 815; - return true; - } - break; - case 815: - if ('l' == current) { - state = 816; - return true; - } - break; - case 816: - if ('l' == current) { - state = 817; - return true; - } - break; - case 817: - if ('S' == current) { - state = 818; - return true; - } - break; - case 818: - if ('q' == current) { - state = 819; - return true; - } - break; - case 819: - if ('u' == current) { - state = 820; - return true; - } - break; - case 820: - if ('a' == current) { - state = 821; - return true; - } - break; - case 821: - if ('r' == current) { - state = 822; - return true; - } - break; - case 822: - if ('e' == current) { - state = 823; - return true; - } - break; - case 823: - // FilledVerySmallSquare; - if (';' == current) { - match = "\u25AA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 824: - switch (current) { - case 'p': - state = 825; - return true; - case 'r': - state = 827; - return true; - case 'u': - state = 831; - return true; - } - break; - case 825: - if ('f' == current) { - state = 826; - return true; - } - break; - case 826: - // Fopf; - if (';' == current) { - match = "\uD835\uDD3D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 827: - if ('A' == current) { - state = 828; - return true; - } - break; - case 828: - if ('l' == current) { - state = 829; - return true; - } - break; - case 829: - if ('l' == current) { - state = 830; - return true; - } - break; - case 830: - // ForAll; - if (';' == current) { - match = "\u2200"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 831: - if ('r' == current) { - state = 832; - return true; - } - break; - case 832: - if ('i' == current) { - state = 833; - return true; - } - break; - case 833: - if ('e' == current) { - state = 834; - return true; - } - break; - case 834: - if ('r' == current) { - state = 835; - return true; - } - break; - case 835: - if ('t' == current) { - state = 836; - return true; - } - break; - case 836: - if ('r' == current) { - state = 837; - return true; - } - break; - case 837: - if ('f' == current) { - state = 838; - return true; - } - break; - case 838: - // Fouriertrf; - if (';' == current) { - match = "\u2131"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 839: - if ('c' == current) { - state = 840; - return true; - } - break; - case 840: - if ('r' == current) { - state = 841; - return true; - } - break; - case 841: - // Fscr; - if (';' == current) { - match = "\u2131"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 842: - switch (current) { - case 'J': - state = 843; - return true; - case 'T': // GT - match = ">"; - matchLength = consumedCount; - state = 846; - return true; - case 'a': - state = 847; - return true; - case 'b': - state = 852; - return true; - case 'c': - state = 857; - return true; - case 'd': - state = 866; - return true; - case 'f': - state = 869; - return true; - case 'g': - state = 871; - return true; - case 'o': - state = 872; - return true; - case 'r': - state = 875; - return true; - case 's': - state = 925; - return true; - case 't': - state = 928; - return true; - } - break; - case 843: - if ('c' == current) { - state = 844; - return true; - } - break; - case 844: - if ('y' == current) { - state = 845; - return true; - } - break; - case 845: - // GJcy; - if (';' == current) { - match = "\u0403"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 846: - // GT; - if (';' == current) { - match = ">"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 847: - if ('m' == current) { - state = 848; - return true; - } - break; - case 848: - if ('m' == current) { - state = 849; - return true; - } - break; - case 849: - if ('a' == current) { - state = 850; - return true; - } - break; - case 850: - // Gamma; - if (';' == current) { - match = "\u0393"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 851; - return true; - } - break; - case 851: - // Gammad; - if (';' == current) { - match = "\u03DC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 852: - if ('r' == current) { - state = 853; - return true; - } - break; - case 853: - if ('e' == current) { - state = 854; - return true; - } - break; - case 854: - if ('v' == current) { - state = 855; - return true; - } - break; - case 855: - if ('e' == current) { - state = 856; - return true; - } - break; - case 856: - // Gbreve; - if (';' == current) { - match = "\u011E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 857: - switch (current) { - case 'e': - state = 858; - return true; - case 'i': - state = 862; - return true; - case 'y': - state = 865; - return true; - } - break; - case 858: - if ('d' == current) { - state = 859; - return true; - } - break; - case 859: - if ('i' == current) { - state = 860; - return true; - } - break; - case 860: - if ('l' == current) { - state = 861; - return true; - } - break; - case 861: - // Gcedil; - if (';' == current) { - match = "\u0122"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 862: - if ('r' == current) { - state = 863; - return true; - } - break; - case 863: - if ('c' == current) { - state = 864; - return true; - } - break; - case 864: - // Gcirc; - if (';' == current) { - match = "\u011C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 865: - // Gcy; - if (';' == current) { - match = "\u0413"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 866: - if ('o' == current) { - state = 867; - return true; - } - break; - case 867: - if ('t' == current) { - state = 868; - return true; - } - break; - case 868: - // Gdot; - if (';' == current) { - match = "\u0120"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 869: - if ('r' == current) { - state = 870; - return true; - } - break; - case 870: - // Gfr; - if (';' == current) { - match = "\uD835\uDD0A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 871: - // Gg; - if (';' == current) { - match = "\u22D9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 872: - if ('p' == current) { - state = 873; - return true; - } - break; - case 873: - if ('f' == current) { - state = 874; - return true; - } - break; - case 874: - // Gopf; - if (';' == current) { - match = "\uD835\uDD3E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 875: - if ('e' == current) { - state = 876; - return true; - } - break; - case 876: - if ('a' == current) { - state = 877; - return true; - } - break; - case 877: - if ('t' == current) { - state = 878; - return true; - } - break; - case 878: - if ('e' == current) { - state = 879; - return true; - } - break; - case 879: - if ('r' == current) { - state = 880; - return true; - } - break; - case 880: - switch (current) { - case 'E': - state = 881; - return true; - case 'F': - state = 890; - return true; - case 'G': - state = 899; - return true; - case 'L': - state = 906; - return true; - case 'S': - state = 910; - return true; - case 'T': - state = 920; - return true; - } - break; - case 881: - if ('q' == current) { - state = 882; - return true; - } - break; - case 882: - if ('u' == current) { - state = 883; - return true; - } - break; - case 883: - if ('a' == current) { - state = 884; - return true; - } - break; - case 884: - if ('l' == current) { - state = 885; - return true; - } - break; - case 885: - // GreaterEqual; - if (';' == current) { - match = "\u2265"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('L' == current) { - state = 886; - return true; - } - break; - case 886: - if ('e' == current) { - state = 887; - return true; - } - break; - case 887: - if ('s' == current) { - state = 888; - return true; - } - break; - case 888: - if ('s' == current) { - state = 889; - return true; - } - break; - case 889: - // GreaterEqualLess; - if (';' == current) { - match = "\u22DB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 890: - if ('u' == current) { - state = 891; - return true; - } - break; - case 891: - if ('l' == current) { - state = 892; - return true; - } - break; - case 892: - if ('l' == current) { - state = 893; - return true; - } - break; - case 893: - if ('E' == current) { - state = 894; - return true; - } - break; - case 894: - if ('q' == current) { - state = 895; - return true; - } - break; - case 895: - if ('u' == current) { - state = 896; - return true; - } - break; - case 896: - if ('a' == current) { - state = 897; - return true; - } - break; - case 897: - if ('l' == current) { - state = 898; - return true; - } - break; - case 898: - // GreaterFullEqual; - if (';' == current) { - match = "\u2267"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 899: - if ('r' == current) { - state = 900; - return true; - } - break; - case 900: - if ('e' == current) { - state = 901; - return true; - } - break; - case 901: - if ('a' == current) { - state = 902; - return true; - } - break; - case 902: - if ('t' == current) { - state = 903; - return true; - } - break; - case 903: - if ('e' == current) { - state = 904; - return true; - } - break; - case 904: - if ('r' == current) { - state = 905; - return true; - } - break; - case 905: - // GreaterGreater; - if (';' == current) { - match = "\u2AA2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 906: - if ('e' == current) { - state = 907; - return true; - } - break; - case 907: - if ('s' == current) { - state = 908; - return true; - } - break; - case 908: - if ('s' == current) { - state = 909; - return true; - } - break; - case 909: - // GreaterLess; - if (';' == current) { - match = "\u2277"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 910: - if ('l' == current) { - state = 911; - return true; - } - break; - case 911: - if ('a' == current) { - state = 912; - return true; - } - break; - case 912: - if ('n' == current) { - state = 913; - return true; - } - break; - case 913: - if ('t' == current) { - state = 914; - return true; - } - break; - case 914: - if ('E' == current) { - state = 915; - return true; - } - break; - case 915: - if ('q' == current) { - state = 916; - return true; - } - break; - case 916: - if ('u' == current) { - state = 917; - return true; - } - break; - case 917: - if ('a' == current) { - state = 918; - return true; - } - break; - case 918: - if ('l' == current) { - state = 919; - return true; - } - break; - case 919: - // GreaterSlantEqual; - if (';' == current) { - match = "\u2A7E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 920: - if ('i' == current) { - state = 921; - return true; - } - break; - case 921: - if ('l' == current) { - state = 922; - return true; - } - break; - case 922: - if ('d' == current) { - state = 923; - return true; - } - break; - case 923: - if ('e' == current) { - state = 924; - return true; - } - break; - case 924: - // GreaterTilde; - if (';' == current) { - match = "\u2273"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 925: - if ('c' == current) { - state = 926; - return true; - } - break; - case 926: - if ('r' == current) { - state = 927; - return true; - } - break; - case 927: - // Gscr; - if (';' == current) { - match = "\uD835\uDCA2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 928: - // Gt; - if (';' == current) { - match = "\u226B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 929: - switch (current) { - case 'A': - state = 930; - return true; - case 'a': - state = 935; - return true; - case 'c': - state = 940; - return true; - case 'f': - state = 944; - return true; - case 'i': - state = 946; - return true; - case 'o': - state = 957; - return true; - case 's': - state = 972; - return true; - case 'u': - state = 979; - return true; - } - break; - case 930: - if ('R' == current) { - state = 931; - return true; - } - break; - case 931: - if ('D' == current) { - state = 932; - return true; - } - break; - case 932: - if ('c' == current) { - state = 933; - return true; - } - break; - case 933: - if ('y' == current) { - state = 934; - return true; - } - break; - case 934: - // HARDcy; - if (';' == current) { - match = "\u042A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 935: - if ('c' == current) { - state = 936; - return true; - } - else if ('t' == current) { - state = 939; - return true; - } - break; - case 936: - if ('e' == current) { - state = 937; - return true; - } - break; - case 937: - if ('k' == current) { - state = 938; - return true; - } - break; - case 938: - // Hacek; - if (';' == current) { - match = "\u02C7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 939: - // Hat; - if (';' == current) { - match = "^"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 940: - if ('i' == current) { - state = 941; - return true; - } - break; - case 941: - if ('r' == current) { - state = 942; - return true; - } - break; - case 942: - if ('c' == current) { - state = 943; - return true; - } - break; - case 943: - // Hcirc; - if (';' == current) { - match = "\u0124"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 944: - if ('r' == current) { - state = 945; - return true; - } - break; - case 945: - // Hfr; - if (';' == current) { - match = "\u210C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 946: - if ('l' == current) { - state = 947; - return true; - } - break; - case 947: - if ('b' == current) { - state = 948; - return true; - } - break; - case 948: - if ('e' == current) { - state = 949; - return true; - } - break; - case 949: - if ('r' == current) { - state = 950; - return true; - } - break; - case 950: - if ('t' == current) { - state = 951; - return true; - } - break; - case 951: - if ('S' == current) { - state = 952; - return true; - } - break; - case 952: - if ('p' == current) { - state = 953; - return true; - } - break; - case 953: - if ('a' == current) { - state = 954; - return true; - } - break; - case 954: - if ('c' == current) { - state = 955; - return true; - } - break; - case 955: - if ('e' == current) { - state = 956; - return true; - } - break; - case 956: - // HilbertSpace; - if (';' == current) { - match = "\u210B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 957: - if ('p' == current) { - state = 958; - return true; - } - else if ('r' == current) { - state = 960; - return true; - } - break; - case 958: - if ('f' == current) { - state = 959; - return true; - } - break; - case 959: - // Hopf; - if (';' == current) { - match = "\u210D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 960: - if ('i' == current) { - state = 961; - return true; - } - break; - case 961: - if ('z' == current) { - state = 962; - return true; - } - break; - case 962: - if ('o' == current) { - state = 963; - return true; - } - break; - case 963: - if ('n' == current) { - state = 964; - return true; - } - break; - case 964: - if ('t' == current) { - state = 965; - return true; - } - break; - case 965: - if ('a' == current) { - state = 966; - return true; - } - break; - case 966: - if ('l' == current) { - state = 967; - return true; - } - break; - case 967: - if ('L' == current) { - state = 968; - return true; - } - break; - case 968: - if ('i' == current) { - state = 969; - return true; - } - break; - case 969: - if ('n' == current) { - state = 970; - return true; - } - break; - case 970: - if ('e' == current) { - state = 971; - return true; - } - break; - case 971: - // HorizontalLine; - if (';' == current) { - match = "\u2500"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 972: - if ('c' == current) { - state = 973; - return true; - } - else if ('t' == current) { - state = 975; - return true; - } - break; - case 973: - if ('r' == current) { - state = 974; - return true; - } - break; - case 974: - // Hscr; - if (';' == current) { - match = "\u210B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 975: - if ('r' == current) { - state = 976; - return true; - } - break; - case 976: - if ('o' == current) { - state = 977; - return true; - } - break; - case 977: - if ('k' == current) { - state = 978; - return true; - } - break; - case 978: - // Hstrok; - if (';' == current) { - match = "\u0126"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 979: - if ('m' == current) { - state = 980; - return true; - } - break; - case 980: - if ('p' == current) { - state = 981; - return true; - } - break; - case 981: - if ('D' == current) { - state = 982; - return true; - } - else if ('E' == current) { - state = 990; - return true; - } - break; - case 982: - if ('o' == current) { - state = 983; - return true; - } - break; - case 983: - if ('w' == current) { - state = 984; - return true; - } - break; - case 984: - if ('n' == current) { - state = 985; - return true; - } - break; - case 985: - if ('H' == current) { - state = 986; - return true; - } - break; - case 986: - if ('u' == current) { - state = 987; - return true; - } - break; - case 987: - if ('m' == current) { - state = 988; - return true; - } - break; - case 988: - if ('p' == current) { - state = 989; - return true; - } - break; - case 989: - // HumpDownHump; - if (';' == current) { - match = "\u224E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 990: - if ('q' == current) { - state = 991; - return true; - } - break; - case 991: - if ('u' == current) { - state = 992; - return true; - } - break; - case 992: - if ('a' == current) { - state = 993; - return true; - } - break; - case 993: - if ('l' == current) { - state = 994; - return true; - } - break; - case 994: - // HumpEqual; - if (';' == current) { - match = "\u224F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 995: - switch (current) { - case 'E': - state = 996; - return true; - case 'J': - state = 999; - return true; - case 'O': - state = 1003; - return true; - case 'a': - state = 1006; - return true; - case 'c': - state = 1011; - return true; - case 'd': - state = 1016; - return true; - case 'f': - state = 1019; - return true; - case 'g': - state = 1021; - return true; - case 'm': - state = 1026; - return true; - case 'n': - state = 1042; - return true; - case 'o': - state = 1074; - return true; - case 's': - state = 1082; - return true; - case 't': - state = 1085; - return true; - case 'u': - state = 1090; - return true; - } - break; - case 996: - if ('c' == current) { - state = 997; - return true; - } - break; - case 997: - if ('y' == current) { - state = 998; - return true; - } - break; - case 998: - // IEcy; - if (';' == current) { - match = "\u0415"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 999: - if ('l' == current) { - state = 1000; - return true; - } - break; - } - return false; - } - - private boolean parse2(final int current) { - consumedCount++; - switch (state) { - case 1000: - if ('i' == current) { - state = 1001; - return true; - } - break; - case 1001: - if ('g' == current) { - state = 1002; - return true; - } - break; - case 1002: - // IJlig; - if (';' == current) { - match = "\u0132"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1003: - if ('c' == current) { - state = 1004; - return true; - } - break; - case 1004: - if ('y' == current) { - state = 1005; - return true; - } - break; - case 1005: - // IOcy; - if (';' == current) { - match = "\u0401"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1006: - if ('c' == current) { - state = 1007; - return true; - } - break; - case 1007: - if ('u' == current) { - state = 1008; - return true; - } - break; - case 1008: - if ('t' == current) { - state = 1009; - return true; - } - break; - case 1009: - // Iacute - if ('e' == current) { - match = "\u00CD"; - matchLength = consumedCount; - state = 1010; - return true; - } - break; - case 1010: - // Iacute; - if (';' == current) { - match = "\u00CD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1011: - if ('i' == current) { - state = 1012; - return true; - } - else if ('y' == current) { - state = 1015; - return true; - } - break; - case 1012: - if ('r' == current) { - state = 1013; - return true; - } - break; - case 1013: - // Icirc - if ('c' == current) { - match = "\u00CE"; - matchLength = consumedCount; - state = 1014; - return true; - } - break; - case 1014: - // Icirc; - if (';' == current) { - match = "\u00CE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1015: - // Icy; - if (';' == current) { - match = "\u0418"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1016: - if ('o' == current) { - state = 1017; - return true; - } - break; - case 1017: - if ('t' == current) { - state = 1018; - return true; - } - break; - case 1018: - // Idot; - if (';' == current) { - match = "\u0130"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1019: - if ('r' == current) { - state = 1020; - return true; - } - break; - case 1020: - // Ifr; - if (';' == current) { - match = "\u2111"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1021: - if ('r' == current) { - state = 1022; - return true; - } - break; - case 1022: - if ('a' == current) { - state = 1023; - return true; - } - break; - case 1023: - if ('v' == current) { - state = 1024; - return true; - } - break; - case 1024: - // Igrave - if ('e' == current) { - match = "\u00CC"; - matchLength = consumedCount; - state = 1025; - return true; - } - break; - case 1025: - // Igrave; - if (';' == current) { - match = "\u00CC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1026: - switch (current) { - case ';': // Im; - match = "\u2111"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 1027; - return true; - case 'p': - state = 1037; - return true; - } - break; - case 1027: - if ('c' == current) { - state = 1028; - return true; - } - else if ('g' == current) { - state = 1030; - return true; - } - break; - case 1028: - if ('r' == current) { - state = 1029; - return true; - } - break; - case 1029: - // Imacr; - if (';' == current) { - match = "\u012A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1030: - if ('i' == current) { - state = 1031; - return true; - } - break; - case 1031: - if ('n' == current) { - state = 1032; - return true; - } - break; - case 1032: - if ('a' == current) { - state = 1033; - return true; - } - break; - case 1033: - if ('r' == current) { - state = 1034; - return true; - } - break; - case 1034: - if ('y' == current) { - state = 1035; - return true; - } - break; - case 1035: - if ('I' == current) { - state = 1036; - return true; - } - break; - case 1036: - // ImaginaryI; - if (';' == current) { - match = "\u2148"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1037: - if ('l' == current) { - state = 1038; - return true; - } - break; - case 1038: - if ('i' == current) { - state = 1039; - return true; - } - break; - case 1039: - if ('e' == current) { - state = 1040; - return true; - } - break; - case 1040: - if ('s' == current) { - state = 1041; - return true; - } - break; - case 1041: - // Implies; - if (';' == current) { - match = "\u21D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1042: - if ('t' == current) { - state = 1043; - return true; - } - else if ('v' == current) { - state = 1057; - return true; - } - break; - case 1043: - // Int; - if (';' == current) { - match = "\u222C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 1044; - return true; - } - break; - case 1044: - if ('g' == current) { - state = 1045; - return true; - } - else if ('r' == current) { - state = 1049; - return true; - } - break; - case 1045: - if ('r' == current) { - state = 1046; - return true; - } - break; - case 1046: - if ('a' == current) { - state = 1047; - return true; - } - break; - case 1047: - if ('l' == current) { - state = 1048; - return true; - } - break; - case 1048: - // Integral; - if (';' == current) { - match = "\u222B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1049: - if ('s' == current) { - state = 1050; - return true; - } - break; - case 1050: - if ('e' == current) { - state = 1051; - return true; - } - break; - case 1051: - if ('c' == current) { - state = 1052; - return true; - } - break; - case 1052: - if ('t' == current) { - state = 1053; - return true; - } - break; - case 1053: - if ('i' == current) { - state = 1054; - return true; - } - break; - case 1054: - if ('o' == current) { - state = 1055; - return true; - } - break; - case 1055: - if ('n' == current) { - state = 1056; - return true; - } - break; - case 1056: - // Intersection; - if (';' == current) { - match = "\u22C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1057: - if ('i' == current) { - state = 1058; - return true; - } - break; - case 1058: - if ('s' == current) { - state = 1059; - return true; - } - break; - case 1059: - if ('i' == current) { - state = 1060; - return true; - } - break; - case 1060: - if ('b' == current) { - state = 1061; - return true; - } - break; - case 1061: - if ('l' == current) { - state = 1062; - return true; - } - break; - case 1062: - if ('e' == current) { - state = 1063; - return true; - } - break; - case 1063: - if ('C' == current) { - state = 1064; - return true; - } - else if ('T' == current) { - state = 1069; - return true; - } - break; - case 1064: - if ('o' == current) { - state = 1065; - return true; - } - break; - case 1065: - if ('m' == current) { - state = 1066; - return true; - } - break; - case 1066: - if ('m' == current) { - state = 1067; - return true; - } - break; - case 1067: - if ('a' == current) { - state = 1068; - return true; - } - break; - case 1068: - // InvisibleComma; - if (';' == current) { - match = "\u2063"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1069: - if ('i' == current) { - state = 1070; - return true; - } - break; - case 1070: - if ('m' == current) { - state = 1071; - return true; - } - break; - case 1071: - if ('e' == current) { - state = 1072; - return true; - } - break; - case 1072: - if ('s' == current) { - state = 1073; - return true; - } - break; - case 1073: - // InvisibleTimes; - if (';' == current) { - match = "\u2062"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1074: - switch (current) { - case 'g': - state = 1075; - return true; - case 'p': - state = 1078; - return true; - case 't': - state = 1080; - return true; - } - break; - case 1075: - if ('o' == current) { - state = 1076; - return true; - } - break; - case 1076: - if ('n' == current) { - state = 1077; - return true; - } - break; - case 1077: - // Iogon; - if (';' == current) { - match = "\u012E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1078: - if ('f' == current) { - state = 1079; - return true; - } - break; - case 1079: - // Iopf; - if (';' == current) { - match = "\uD835\uDD40"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1080: - if ('a' == current) { - state = 1081; - return true; - } - break; - case 1081: - // Iota; - if (';' == current) { - match = "\u0399"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1082: - if ('c' == current) { - state = 1083; - return true; - } - break; - case 1083: - if ('r' == current) { - state = 1084; - return true; - } - break; - case 1084: - // Iscr; - if (';' == current) { - match = "\u2110"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1085: - if ('i' == current) { - state = 1086; - return true; - } - break; - case 1086: - if ('l' == current) { - state = 1087; - return true; - } - break; - case 1087: - if ('d' == current) { - state = 1088; - return true; - } - break; - case 1088: - if ('e' == current) { - state = 1089; - return true; - } - break; - case 1089: - // Itilde; - if (';' == current) { - match = "\u0128"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1090: - if ('k' == current) { - state = 1091; - return true; - } - else if ('m' == current) { - state = 1094; - return true; - } - break; - case 1091: - if ('c' == current) { - state = 1092; - return true; - } - break; - case 1092: - if ('y' == current) { - state = 1093; - return true; - } - break; - case 1093: - // Iukcy; - if (';' == current) { - match = "\u0406"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1094: - // Iuml - if ('l' == current) { - match = "\u00CF"; - matchLength = consumedCount; - state = 1095; - return true; - } - break; - case 1095: - // Iuml; - if (';' == current) { - match = "\u00CF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1096: - switch (current) { - case 'c': - state = 1097; - return true; - case 'f': - state = 1102; - return true; - case 'o': - state = 1104; - return true; - case 's': - state = 1107; - return true; - case 'u': - state = 1114; - return true; - } - break; - case 1097: - if ('i' == current) { - state = 1098; - return true; - } - else if ('y' == current) { - state = 1101; - return true; - } - break; - case 1098: - if ('r' == current) { - state = 1099; - return true; - } - break; - case 1099: - if ('c' == current) { - state = 1100; - return true; - } - break; - case 1100: - // Jcirc; - if (';' == current) { - match = "\u0134"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1101: - // Jcy; - if (';' == current) { - match = "\u0419"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1102: - if ('r' == current) { - state = 1103; - return true; - } - break; - case 1103: - // Jfr; - if (';' == current) { - match = "\uD835\uDD0D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1104: - if ('p' == current) { - state = 1105; - return true; - } - break; - case 1105: - if ('f' == current) { - state = 1106; - return true; - } - break; - case 1106: - // Jopf; - if (';' == current) { - match = "\uD835\uDD41"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1107: - if ('c' == current) { - state = 1108; - return true; - } - else if ('e' == current) { - state = 1110; - return true; - } - break; - case 1108: - if ('r' == current) { - state = 1109; - return true; - } - break; - case 1109: - // Jscr; - if (';' == current) { - match = "\uD835\uDCA5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1110: - if ('r' == current) { - state = 1111; - return true; - } - break; - case 1111: - if ('c' == current) { - state = 1112; - return true; - } - break; - case 1112: - if ('y' == current) { - state = 1113; - return true; - } - break; - case 1113: - // Jsercy; - if (';' == current) { - match = "\u0408"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1114: - if ('k' == current) { - state = 1115; - return true; - } - break; - case 1115: - if ('c' == current) { - state = 1116; - return true; - } - break; - case 1116: - if ('y' == current) { - state = 1117; - return true; - } - break; - case 1117: - // Jukcy; - if (';' == current) { - match = "\u0404"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1118: - switch (current) { - case 'H': - state = 1119; - return true; - case 'J': - state = 1122; - return true; - case 'a': - state = 1125; - return true; - case 'c': - state = 1129; - return true; - case 'f': - state = 1135; - return true; - case 'o': - state = 1137; - return true; - case 's': - state = 1140; - return true; - } - break; - case 1119: - if ('c' == current) { - state = 1120; - return true; - } - break; - case 1120: - if ('y' == current) { - state = 1121; - return true; - } - break; - case 1121: - // KHcy; - if (';' == current) { - match = "\u0425"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1122: - if ('c' == current) { - state = 1123; - return true; - } - break; - case 1123: - if ('y' == current) { - state = 1124; - return true; - } - break; - case 1124: - // KJcy; - if (';' == current) { - match = "\u040C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1125: - if ('p' == current) { - state = 1126; - return true; - } - break; - case 1126: - if ('p' == current) { - state = 1127; - return true; - } - break; - case 1127: - if ('a' == current) { - state = 1128; - return true; - } - break; - case 1128: - // Kappa; - if (';' == current) { - match = "\u039A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1129: - if ('e' == current) { - state = 1130; - return true; - } - else if ('y' == current) { - state = 1134; - return true; - } - break; - case 1130: - if ('d' == current) { - state = 1131; - return true; - } - break; - case 1131: - if ('i' == current) { - state = 1132; - return true; - } - break; - case 1132: - if ('l' == current) { - state = 1133; - return true; - } - break; - case 1133: - // Kcedil; - if (';' == current) { - match = "\u0136"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1134: - // Kcy; - if (';' == current) { - match = "\u041A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1135: - if ('r' == current) { - state = 1136; - return true; - } - break; - case 1136: - // Kfr; - if (';' == current) { - match = "\uD835\uDD0E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1137: - if ('p' == current) { - state = 1138; - return true; - } - break; - case 1138: - if ('f' == current) { - state = 1139; - return true; - } - break; - case 1139: - // Kopf; - if (';' == current) { - match = "\uD835\uDD42"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1140: - if ('c' == current) { - state = 1141; - return true; - } - break; - case 1141: - if ('r' == current) { - state = 1142; - return true; - } - break; - case 1142: - // Kscr; - if (';' == current) { - match = "\uD835\uDCA6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1143: - switch (current) { - case 'J': - state = 1144; - return true; - case 'T': // LT - match = "<"; - matchLength = consumedCount; - state = 1147; - return true; - case 'a': - state = 1148; - return true; - case 'c': - state = 1169; - return true; - case 'e': - state = 1179; - return true; - case 'f': - state = 1404; - return true; - case 'l': - state = 1406; - return true; - case 'm': - state = 1415; - return true; - case 'o': - state = 1420; - return true; - case 's': - state = 1505; - return true; - case 't': - state = 1513; - return true; - } - break; - case 1144: - if ('c' == current) { - state = 1145; - return true; - } - break; - case 1145: - if ('y' == current) { - state = 1146; - return true; - } - break; - case 1146: - // LJcy; - if (';' == current) { - match = "\u0409"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1147: - // LT; - if (';' == current) { - match = "<"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1148: - switch (current) { - case 'c': - state = 1149; - return true; - case 'm': - state = 1153; - return true; - case 'n': - state = 1157; - return true; - case 'p': - state = 1159; - return true; - case 'r': - state = 1167; - return true; - } - break; - case 1149: - if ('u' == current) { - state = 1150; - return true; - } - break; - case 1150: - if ('t' == current) { - state = 1151; - return true; - } - break; - case 1151: - if ('e' == current) { - state = 1152; - return true; - } - break; - case 1152: - // Lacute; - if (';' == current) { - match = "\u0139"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1153: - if ('b' == current) { - state = 1154; - return true; - } - break; - case 1154: - if ('d' == current) { - state = 1155; - return true; - } - break; - case 1155: - if ('a' == current) { - state = 1156; - return true; - } - break; - case 1156: - // Lambda; - if (';' == current) { - match = "\u039B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1157: - if ('g' == current) { - state = 1158; - return true; - } - break; - case 1158: - // Lang; - if (';' == current) { - match = "\u27EA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1159: - if ('l' == current) { - state = 1160; - return true; - } - break; - case 1160: - if ('a' == current) { - state = 1161; - return true; - } - break; - case 1161: - if ('c' == current) { - state = 1162; - return true; - } - break; - case 1162: - if ('e' == current) { - state = 1163; - return true; - } - break; - case 1163: - if ('t' == current) { - state = 1164; - return true; - } - break; - case 1164: - if ('r' == current) { - state = 1165; - return true; - } - break; - case 1165: - if ('f' == current) { - state = 1166; - return true; - } - break; - case 1166: - // Laplacetrf; - if (';' == current) { - match = "\u2112"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1167: - if ('r' == current) { - state = 1168; - return true; - } - break; - case 1168: - // Larr; - if (';' == current) { - match = "\u219E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1169: - switch (current) { - case 'a': - state = 1170; - return true; - case 'e': - state = 1174; - return true; - case 'y': - state = 1178; - return true; - } - break; - case 1170: - if ('r' == current) { - state = 1171; - return true; - } - break; - case 1171: - if ('o' == current) { - state = 1172; - return true; - } - break; - case 1172: - if ('n' == current) { - state = 1173; - return true; - } - break; - case 1173: - // Lcaron; - if (';' == current) { - match = "\u013D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1174: - if ('d' == current) { - state = 1175; - return true; - } - break; - case 1175: - if ('i' == current) { - state = 1176; - return true; - } - break; - case 1176: - if ('l' == current) { - state = 1177; - return true; - } - break; - case 1177: - // Lcedil; - if (';' == current) { - match = "\u013B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1178: - // Lcy; - if (';' == current) { - match = "\u041B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1179: - if ('f' == current) { - state = 1180; - return true; - } - else if ('s' == current) { - state = 1355; - return true; - } - break; - case 1180: - if ('t' == current) { - state = 1181; - return true; - } - break; - case 1181: - switch (current) { - case 'A': - state = 1182; - return true; - case 'C': - state = 1211; - return true; - case 'D': - state = 1218; - return true; - case 'F': - state = 1251; - return true; - case 'R': - state = 1256; - return true; - case 'T': - state = 1272; - return true; - case 'U': - state = 1301; - return true; - case 'V': - state = 1331; - return true; - case 'a': - state = 1340; - return true; - case 'r': - state = 1345; - return true; - } - break; - case 1182: - if ('n' == current) { - state = 1183; - return true; - } - else if ('r' == current) { - state = 1194; - return true; - } - break; - case 1183: - if ('g' == current) { - state = 1184; - return true; - } - break; - case 1184: - if ('l' == current) { - state = 1185; - return true; - } - break; - case 1185: - if ('e' == current) { - state = 1186; - return true; - } - break; - case 1186: - if ('B' == current) { - state = 1187; - return true; - } - break; - case 1187: - if ('r' == current) { - state = 1188; - return true; - } - break; - case 1188: - if ('a' == current) { - state = 1189; - return true; - } - break; - case 1189: - if ('c' == current) { - state = 1190; - return true; - } - break; - case 1190: - if ('k' == current) { - state = 1191; - return true; - } - break; - case 1191: - if ('e' == current) { - state = 1192; - return true; - } - break; - case 1192: - if ('t' == current) { - state = 1193; - return true; - } - break; - case 1193: - // LeftAngleBracket; - if (';' == current) { - match = "\u27E8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1194: - if ('r' == current) { - state = 1195; - return true; - } - break; - case 1195: - if ('o' == current) { - state = 1196; - return true; - } - break; - case 1196: - if ('w' == current) { - state = 1197; - return true; - } - break; - case 1197: - switch (current) { - case ';': // LeftArrow; - match = "\u2190"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'B': - state = 1198; - return true; - case 'R': - state = 1201; - return true; - } - break; - case 1198: - if ('a' == current) { - state = 1199; - return true; - } - break; - case 1199: - if ('r' == current) { - state = 1200; - return true; - } - break; - case 1200: - // LeftArrowBar; - if (';' == current) { - match = "\u21E4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1201: - if ('i' == current) { - state = 1202; - return true; - } - break; - case 1202: - if ('g' == current) { - state = 1203; - return true; - } - break; - case 1203: - if ('h' == current) { - state = 1204; - return true; - } - break; - case 1204: - if ('t' == current) { - state = 1205; - return true; - } - break; - case 1205: - if ('A' == current) { - state = 1206; - return true; - } - break; - case 1206: - if ('r' == current) { - state = 1207; - return true; - } - break; - case 1207: - if ('r' == current) { - state = 1208; - return true; - } - break; - case 1208: - if ('o' == current) { - state = 1209; - return true; - } - break; - case 1209: - if ('w' == current) { - state = 1210; - return true; - } - break; - case 1210: - // LeftArrowRightArrow; - if (';' == current) { - match = "\u21C6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1211: - if ('e' == current) { - state = 1212; - return true; - } - break; - case 1212: - if ('i' == current) { - state = 1213; - return true; - } - break; - case 1213: - if ('l' == current) { - state = 1214; - return true; - } - break; - case 1214: - if ('i' == current) { - state = 1215; - return true; - } - break; - case 1215: - if ('n' == current) { - state = 1216; - return true; - } - break; - case 1216: - if ('g' == current) { - state = 1217; - return true; - } - break; - case 1217: - // LeftCeiling; - if (';' == current) { - match = "\u2308"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1218: - if ('o' == current) { - state = 1219; - return true; - } - break; - case 1219: - if ('u' == current) { - state = 1220; - return true; - } - else if ('w' == current) { - state = 1231; - return true; - } - break; - case 1220: - if ('b' == current) { - state = 1221; - return true; - } - break; - case 1221: - if ('l' == current) { - state = 1222; - return true; - } - break; - case 1222: - if ('e' == current) { - state = 1223; - return true; - } - break; - case 1223: - if ('B' == current) { - state = 1224; - return true; - } - break; - case 1224: - if ('r' == current) { - state = 1225; - return true; - } - break; - case 1225: - if ('a' == current) { - state = 1226; - return true; - } - break; - case 1226: - if ('c' == current) { - state = 1227; - return true; - } - break; - case 1227: - if ('k' == current) { - state = 1228; - return true; - } - break; - case 1228: - if ('e' == current) { - state = 1229; - return true; - } - break; - case 1229: - if ('t' == current) { - state = 1230; - return true; - } - break; - case 1230: - // LeftDoubleBracket; - if (';' == current) { - match = "\u27E6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1231: - if ('n' == current) { - state = 1232; - return true; - } - break; - case 1232: - if ('T' == current) { - state = 1233; - return true; - } - else if ('V' == current) { - state = 1242; - return true; - } - break; - case 1233: - if ('e' == current) { - state = 1234; - return true; - } - break; - case 1234: - if ('e' == current) { - state = 1235; - return true; - } - break; - case 1235: - if ('V' == current) { - state = 1236; - return true; - } - break; - case 1236: - if ('e' == current) { - state = 1237; - return true; - } - break; - case 1237: - if ('c' == current) { - state = 1238; - return true; - } - break; - case 1238: - if ('t' == current) { - state = 1239; - return true; - } - break; - case 1239: - if ('o' == current) { - state = 1240; - return true; - } - break; - case 1240: - if ('r' == current) { - state = 1241; - return true; - } - break; - case 1241: - // LeftDownTeeVector; - if (';' == current) { - match = "\u2961"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1242: - if ('e' == current) { - state = 1243; - return true; - } - break; - case 1243: - if ('c' == current) { - state = 1244; - return true; - } - break; - case 1244: - if ('t' == current) { - state = 1245; - return true; - } - break; - case 1245: - if ('o' == current) { - state = 1246; - return true; - } - break; - case 1246: - if ('r' == current) { - state = 1247; - return true; - } - break; - case 1247: - // LeftDownVector; - if (';' == current) { - match = "\u21C3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('B' == current) { - state = 1248; - return true; - } - break; - case 1248: - if ('a' == current) { - state = 1249; - return true; - } - break; - case 1249: - if ('r' == current) { - state = 1250; - return true; - } - break; - case 1250: - // LeftDownVectorBar; - if (';' == current) { - match = "\u2959"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1251: - if ('l' == current) { - state = 1252; - return true; - } - break; - case 1252: - if ('o' == current) { - state = 1253; - return true; - } - break; - case 1253: - if ('o' == current) { - state = 1254; - return true; - } - break; - case 1254: - if ('r' == current) { - state = 1255; - return true; - } - break; - case 1255: - // LeftFloor; - if (';' == current) { - match = "\u230A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1256: - if ('i' == current) { - state = 1257; - return true; - } - break; - case 1257: - if ('g' == current) { - state = 1258; - return true; - } - break; - case 1258: - if ('h' == current) { - state = 1259; - return true; - } - break; - case 1259: - if ('t' == current) { - state = 1260; - return true; - } - break; - case 1260: - if ('A' == current) { - state = 1261; - return true; - } - else if ('V' == current) { - state = 1266; - return true; - } - break; - case 1261: - if ('r' == current) { - state = 1262; - return true; - } - break; - case 1262: - if ('r' == current) { - state = 1263; - return true; - } - break; - case 1263: - if ('o' == current) { - state = 1264; - return true; - } - break; - case 1264: - if ('w' == current) { - state = 1265; - return true; - } - break; - case 1265: - // LeftRightArrow; - if (';' == current) { - match = "\u2194"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1266: - if ('e' == current) { - state = 1267; - return true; - } - break; - case 1267: - if ('c' == current) { - state = 1268; - return true; - } - break; - case 1268: - if ('t' == current) { - state = 1269; - return true; - } - break; - case 1269: - if ('o' == current) { - state = 1270; - return true; - } - break; - case 1270: - if ('r' == current) { - state = 1271; - return true; - } - break; - case 1271: - // LeftRightVector; - if (';' == current) { - match = "\u294E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1272: - if ('e' == current) { - state = 1273; - return true; - } - else if ('r' == current) { - state = 1286; - return true; - } - break; - case 1273: - if ('e' == current) { - state = 1274; - return true; - } - break; - case 1274: - switch (current) { - case ';': // LeftTee; - match = "\u22A3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'A': - state = 1275; - return true; - case 'V': - state = 1280; - return true; - } - break; - case 1275: - if ('r' == current) { - state = 1276; - return true; - } - break; - case 1276: - if ('r' == current) { - state = 1277; - return true; - } - break; - case 1277: - if ('o' == current) { - state = 1278; - return true; - } - break; - case 1278: - if ('w' == current) { - state = 1279; - return true; - } - break; - case 1279: - // LeftTeeArrow; - if (';' == current) { - match = "\u21A4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1280: - if ('e' == current) { - state = 1281; - return true; - } - break; - case 1281: - if ('c' == current) { - state = 1282; - return true; - } - break; - case 1282: - if ('t' == current) { - state = 1283; - return true; - } - break; - case 1283: - if ('o' == current) { - state = 1284; - return true; - } - break; - case 1284: - if ('r' == current) { - state = 1285; - return true; - } - break; - case 1285: - // LeftTeeVector; - if (';' == current) { - match = "\u295A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1286: - if ('i' == current) { - state = 1287; - return true; - } - break; - case 1287: - if ('a' == current) { - state = 1288; - return true; - } - break; - case 1288: - if ('n' == current) { - state = 1289; - return true; - } - break; - case 1289: - if ('g' == current) { - state = 1290; - return true; - } - break; - case 1290: - if ('l' == current) { - state = 1291; - return true; - } - break; - case 1291: - if ('e' == current) { - state = 1292; - return true; - } - break; - case 1292: - switch (current) { - case ';': // LeftTriangle; - match = "\u22B2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'B': - state = 1293; - return true; - case 'E': - state = 1296; - return true; - } - break; - case 1293: - if ('a' == current) { - state = 1294; - return true; - } - break; - case 1294: - if ('r' == current) { - state = 1295; - return true; - } - break; - case 1295: - // LeftTriangleBar; - if (';' == current) { - match = "\u29CF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1296: - if ('q' == current) { - state = 1297; - return true; - } - break; - case 1297: - if ('u' == current) { - state = 1298; - return true; - } - break; - case 1298: - if ('a' == current) { - state = 1299; - return true; - } - break; - case 1299: - if ('l' == current) { - state = 1300; - return true; - } - break; - case 1300: - // LeftTriangleEqual; - if (';' == current) { - match = "\u22B4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1301: - if ('p' == current) { - state = 1302; - return true; - } - break; - case 1302: - switch (current) { - case 'D': - state = 1303; - return true; - case 'T': - state = 1313; - return true; - case 'V': - state = 1322; - return true; - } - break; - case 1303: - if ('o' == current) { - state = 1304; - return true; - } - break; - case 1304: - if ('w' == current) { - state = 1305; - return true; - } - break; - case 1305: - if ('n' == current) { - state = 1306; - return true; - } - break; - case 1306: - if ('V' == current) { - state = 1307; - return true; - } - break; - case 1307: - if ('e' == current) { - state = 1308; - return true; - } - break; - case 1308: - if ('c' == current) { - state = 1309; - return true; - } - break; - case 1309: - if ('t' == current) { - state = 1310; - return true; - } - break; - case 1310: - if ('o' == current) { - state = 1311; - return true; - } - break; - case 1311: - if ('r' == current) { - state = 1312; - return true; - } - break; - case 1312: - // LeftUpDownVector; - if (';' == current) { - match = "\u2951"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1313: - if ('e' == current) { - state = 1314; - return true; - } - break; - case 1314: - if ('e' == current) { - state = 1315; - return true; - } - break; - case 1315: - if ('V' == current) { - state = 1316; - return true; - } - break; - case 1316: - if ('e' == current) { - state = 1317; - return true; - } - break; - case 1317: - if ('c' == current) { - state = 1318; - return true; - } - break; - case 1318: - if ('t' == current) { - state = 1319; - return true; - } - break; - case 1319: - if ('o' == current) { - state = 1320; - return true; - } - break; - case 1320: - if ('r' == current) { - state = 1321; - return true; - } - break; - case 1321: - // LeftUpTeeVector; - if (';' == current) { - match = "\u2960"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1322: - if ('e' == current) { - state = 1323; - return true; - } - break; - case 1323: - if ('c' == current) { - state = 1324; - return true; - } - break; - case 1324: - if ('t' == current) { - state = 1325; - return true; - } - break; - case 1325: - if ('o' == current) { - state = 1326; - return true; - } - break; - case 1326: - if ('r' == current) { - state = 1327; - return true; - } - break; - case 1327: - // LeftUpVector; - if (';' == current) { - match = "\u21BF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('B' == current) { - state = 1328; - return true; - } - break; - case 1328: - if ('a' == current) { - state = 1329; - return true; - } - break; - case 1329: - if ('r' == current) { - state = 1330; - return true; - } - break; - case 1330: - // LeftUpVectorBar; - if (';' == current) { - match = "\u2958"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1331: - if ('e' == current) { - state = 1332; - return true; - } - break; - case 1332: - if ('c' == current) { - state = 1333; - return true; - } - break; - case 1333: - if ('t' == current) { - state = 1334; - return true; - } - break; - case 1334: - if ('o' == current) { - state = 1335; - return true; - } - break; - case 1335: - if ('r' == current) { - state = 1336; - return true; - } - break; - case 1336: - // LeftVector; - if (';' == current) { - match = "\u21BC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('B' == current) { - state = 1337; - return true; - } - break; - case 1337: - if ('a' == current) { - state = 1338; - return true; - } - break; - case 1338: - if ('r' == current) { - state = 1339; - return true; - } - break; - case 1339: - // LeftVectorBar; - if (';' == current) { - match = "\u2952"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1340: - if ('r' == current) { - state = 1341; - return true; - } - break; - case 1341: - if ('r' == current) { - state = 1342; - return true; - } - break; - case 1342: - if ('o' == current) { - state = 1343; - return true; - } - break; - case 1343: - if ('w' == current) { - state = 1344; - return true; - } - break; - case 1344: - // Leftarrow; - if (';' == current) { - match = "\u21D0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1345: - if ('i' == current) { - state = 1346; - return true; - } - break; - case 1346: - if ('g' == current) { - state = 1347; - return true; - } - break; - case 1347: - if ('h' == current) { - state = 1348; - return true; - } - break; - case 1348: - if ('t' == current) { - state = 1349; - return true; - } - break; - case 1349: - if ('a' == current) { - state = 1350; - return true; - } - break; - case 1350: - if ('r' == current) { - state = 1351; - return true; - } - break; - case 1351: - if ('r' == current) { - state = 1352; - return true; - } - break; - case 1352: - if ('o' == current) { - state = 1353; - return true; - } - break; - case 1353: - if ('w' == current) { - state = 1354; - return true; - } - break; - case 1354: - // Leftrightarrow; - if (';' == current) { - match = "\u21D4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1355: - if ('s' == current) { - state = 1356; - return true; - } - break; - case 1356: - switch (current) { - case 'E': - state = 1357; - return true; - case 'F': - state = 1369; - return true; - case 'G': - state = 1378; - return true; - case 'L': - state = 1385; - return true; - case 'S': - state = 1389; - return true; - case 'T': - state = 1399; - return true; - } - break; - case 1357: - if ('q' == current) { - state = 1358; - return true; - } - break; - case 1358: - if ('u' == current) { - state = 1359; - return true; - } - break; - case 1359: - if ('a' == current) { - state = 1360; - return true; - } - break; - case 1360: - if ('l' == current) { - state = 1361; - return true; - } - break; - case 1361: - if ('G' == current) { - state = 1362; - return true; - } - break; - case 1362: - if ('r' == current) { - state = 1363; - return true; - } - break; - case 1363: - if ('e' == current) { - state = 1364; - return true; - } - break; - case 1364: - if ('a' == current) { - state = 1365; - return true; - } - break; - case 1365: - if ('t' == current) { - state = 1366; - return true; - } - break; - case 1366: - if ('e' == current) { - state = 1367; - return true; - } - break; - case 1367: - if ('r' == current) { - state = 1368; - return true; - } - break; - case 1368: - // LessEqualGreater; - if (';' == current) { - match = "\u22DA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1369: - if ('u' == current) { - state = 1370; - return true; - } - break; - case 1370: - if ('l' == current) { - state = 1371; - return true; - } - break; - case 1371: - if ('l' == current) { - state = 1372; - return true; - } - break; - case 1372: - if ('E' == current) { - state = 1373; - return true; - } - break; - case 1373: - if ('q' == current) { - state = 1374; - return true; - } - break; - case 1374: - if ('u' == current) { - state = 1375; - return true; - } - break; - case 1375: - if ('a' == current) { - state = 1376; - return true; - } - break; - case 1376: - if ('l' == current) { - state = 1377; - return true; - } - break; - case 1377: - // LessFullEqual; - if (';' == current) { - match = "\u2266"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1378: - if ('r' == current) { - state = 1379; - return true; - } - break; - case 1379: - if ('e' == current) { - state = 1380; - return true; - } - break; - case 1380: - if ('a' == current) { - state = 1381; - return true; - } - break; - case 1381: - if ('t' == current) { - state = 1382; - return true; - } - break; - case 1382: - if ('e' == current) { - state = 1383; - return true; - } - break; - case 1383: - if ('r' == current) { - state = 1384; - return true; - } - break; - case 1384: - // LessGreater; - if (';' == current) { - match = "\u2276"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1385: - if ('e' == current) { - state = 1386; - return true; - } - break; - case 1386: - if ('s' == current) { - state = 1387; - return true; - } - break; - case 1387: - if ('s' == current) { - state = 1388; - return true; - } - break; - case 1388: - // LessLess; - if (';' == current) { - match = "\u2AA1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1389: - if ('l' == current) { - state = 1390; - return true; - } - break; - case 1390: - if ('a' == current) { - state = 1391; - return true; - } - break; - case 1391: - if ('n' == current) { - state = 1392; - return true; - } - break; - case 1392: - if ('t' == current) { - state = 1393; - return true; - } - break; - case 1393: - if ('E' == current) { - state = 1394; - return true; - } - break; - case 1394: - if ('q' == current) { - state = 1395; - return true; - } - break; - case 1395: - if ('u' == current) { - state = 1396; - return true; - } - break; - case 1396: - if ('a' == current) { - state = 1397; - return true; - } - break; - case 1397: - if ('l' == current) { - state = 1398; - return true; - } - break; - case 1398: - // LessSlantEqual; - if (';' == current) { - match = "\u2A7D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1399: - if ('i' == current) { - state = 1400; - return true; - } - break; - case 1400: - if ('l' == current) { - state = 1401; - return true; - } - break; - case 1401: - if ('d' == current) { - state = 1402; - return true; - } - break; - case 1402: - if ('e' == current) { - state = 1403; - return true; - } - break; - case 1403: - // LessTilde; - if (';' == current) { - match = "\u2272"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1404: - if ('r' == current) { - state = 1405; - return true; - } - break; - case 1405: - // Lfr; - if (';' == current) { - match = "\uD835\uDD0F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1406: - // Ll; - if (';' == current) { - match = "\u22D8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 1407; - return true; - } - break; - case 1407: - if ('f' == current) { - state = 1408; - return true; - } - break; - case 1408: - if ('t' == current) { - state = 1409; - return true; - } - break; - case 1409: - if ('a' == current) { - state = 1410; - return true; - } - break; - case 1410: - if ('r' == current) { - state = 1411; - return true; - } - break; - case 1411: - if ('r' == current) { - state = 1412; - return true; - } - break; - case 1412: - if ('o' == current) { - state = 1413; - return true; - } - break; - case 1413: - if ('w' == current) { - state = 1414; - return true; - } - break; - case 1414: - // Lleftarrow; - if (';' == current) { - match = "\u21DA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1415: - if ('i' == current) { - state = 1416; - return true; - } - break; - case 1416: - if ('d' == current) { - state = 1417; - return true; - } - break; - case 1417: - if ('o' == current) { - state = 1418; - return true; - } - break; - case 1418: - if ('t' == current) { - state = 1419; - return true; - } - break; - case 1419: - // Lmidot; - if (';' == current) { - match = "\u013F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1420: - switch (current) { - case 'n': - state = 1421; - return true; - case 'p': - state = 1481; - return true; - case 'w': - state = 1483; - return true; - } - break; - case 1421: - if ('g' == current) { - state = 1422; - return true; - } - break; - case 1422: - switch (current) { - case 'L': - state = 1423; - return true; - case 'R': - state = 1442; - return true; - case 'l': - state = 1452; - return true; - case 'r': - state = 1471; - return true; - } - break; - case 1423: - if ('e' == current) { - state = 1424; - return true; - } - break; - case 1424: - if ('f' == current) { - state = 1425; - return true; - } - break; - case 1425: - if ('t' == current) { - state = 1426; - return true; - } - break; - case 1426: - if ('A' == current) { - state = 1427; - return true; - } - else if ('R' == current) { - state = 1432; - return true; - } - break; - case 1427: - if ('r' == current) { - state = 1428; - return true; - } - break; - case 1428: - if ('r' == current) { - state = 1429; - return true; - } - break; - case 1429: - if ('o' == current) { - state = 1430; - return true; - } - break; - case 1430: - if ('w' == current) { - state = 1431; - return true; - } - break; - case 1431: - // LongLeftArrow; - if (';' == current) { - match = "\u27F5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1432: - if ('i' == current) { - state = 1433; - return true; - } - break; - case 1433: - if ('g' == current) { - state = 1434; - return true; - } - break; - case 1434: - if ('h' == current) { - state = 1435; - return true; - } - break; - case 1435: - if ('t' == current) { - state = 1436; - return true; - } - break; - case 1436: - if ('A' == current) { - state = 1437; - return true; - } - break; - case 1437: - if ('r' == current) { - state = 1438; - return true; - } - break; - case 1438: - if ('r' == current) { - state = 1439; - return true; - } - break; - case 1439: - if ('o' == current) { - state = 1440; - return true; - } - break; - case 1440: - if ('w' == current) { - state = 1441; - return true; - } - break; - case 1441: - // LongLeftRightArrow; - if (';' == current) { - match = "\u27F7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1442: - if ('i' == current) { - state = 1443; - return true; - } - break; - case 1443: - if ('g' == current) { - state = 1444; - return true; - } - break; - case 1444: - if ('h' == current) { - state = 1445; - return true; - } - break; - case 1445: - if ('t' == current) { - state = 1446; - return true; - } - break; - case 1446: - if ('A' == current) { - state = 1447; - return true; - } - break; - case 1447: - if ('r' == current) { - state = 1448; - return true; - } - break; - case 1448: - if ('r' == current) { - state = 1449; - return true; - } - break; - case 1449: - if ('o' == current) { - state = 1450; - return true; - } - break; - case 1450: - if ('w' == current) { - state = 1451; - return true; - } - break; - case 1451: - // LongRightArrow; - if (';' == current) { - match = "\u27F6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1452: - if ('e' == current) { - state = 1453; - return true; - } - break; - case 1453: - if ('f' == current) { - state = 1454; - return true; - } - break; - case 1454: - if ('t' == current) { - state = 1455; - return true; - } - break; - case 1455: - if ('a' == current) { - state = 1456; - return true; - } - else if ('r' == current) { - state = 1461; - return true; - } - break; - case 1456: - if ('r' == current) { - state = 1457; - return true; - } - break; - case 1457: - if ('r' == current) { - state = 1458; - return true; - } - break; - case 1458: - if ('o' == current) { - state = 1459; - return true; - } - break; - case 1459: - if ('w' == current) { - state = 1460; - return true; - } - break; - case 1460: - // Longleftarrow; - if (';' == current) { - match = "\u27F8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1461: - if ('i' == current) { - state = 1462; - return true; - } - break; - case 1462: - if ('g' == current) { - state = 1463; - return true; - } - break; - case 1463: - if ('h' == current) { - state = 1464; - return true; - } - break; - case 1464: - if ('t' == current) { - state = 1465; - return true; - } - break; - case 1465: - if ('a' == current) { - state = 1466; - return true; - } - break; - case 1466: - if ('r' == current) { - state = 1467; - return true; - } - break; - case 1467: - if ('r' == current) { - state = 1468; - return true; - } - break; - case 1468: - if ('o' == current) { - state = 1469; - return true; - } - break; - case 1469: - if ('w' == current) { - state = 1470; - return true; - } - break; - case 1470: - // Longleftrightarrow; - if (';' == current) { - match = "\u27FA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1471: - if ('i' == current) { - state = 1472; - return true; - } - break; - case 1472: - if ('g' == current) { - state = 1473; - return true; - } - break; - case 1473: - if ('h' == current) { - state = 1474; - return true; - } - break; - case 1474: - if ('t' == current) { - state = 1475; - return true; - } - break; - case 1475: - if ('a' == current) { - state = 1476; - return true; - } - break; - case 1476: - if ('r' == current) { - state = 1477; - return true; - } - break; - case 1477: - if ('r' == current) { - state = 1478; - return true; - } - break; - case 1478: - if ('o' == current) { - state = 1479; - return true; - } - break; - case 1479: - if ('w' == current) { - state = 1480; - return true; - } - break; - case 1480: - // Longrightarrow; - if (';' == current) { - match = "\u27F9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1481: - if ('f' == current) { - state = 1482; - return true; - } - break; - case 1482: - // Lopf; - if (';' == current) { - match = "\uD835\uDD43"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1483: - if ('e' == current) { - state = 1484; - return true; - } - break; - case 1484: - if ('r' == current) { - state = 1485; - return true; - } - break; - case 1485: - if ('L' == current) { - state = 1486; - return true; - } - else if ('R' == current) { - state = 1495; - return true; - } - break; - case 1486: - if ('e' == current) { - state = 1487; - return true; - } - break; - case 1487: - if ('f' == current) { - state = 1488; - return true; - } - break; - case 1488: - if ('t' == current) { - state = 1489; - return true; - } - break; - case 1489: - if ('A' == current) { - state = 1490; - return true; - } - break; - case 1490: - if ('r' == current) { - state = 1491; - return true; - } - break; - case 1491: - if ('r' == current) { - state = 1492; - return true; - } - break; - case 1492: - if ('o' == current) { - state = 1493; - return true; - } - break; - case 1493: - if ('w' == current) { - state = 1494; - return true; - } - break; - case 1494: - // LowerLeftArrow; - if (';' == current) { - match = "\u2199"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1495: - if ('i' == current) { - state = 1496; - return true; - } - break; - case 1496: - if ('g' == current) { - state = 1497; - return true; - } - break; - case 1497: - if ('h' == current) { - state = 1498; - return true; - } - break; - case 1498: - if ('t' == current) { - state = 1499; - return true; - } - break; - case 1499: - if ('A' == current) { - state = 1500; - return true; - } - break; - case 1500: - if ('r' == current) { - state = 1501; - return true; - } - break; - case 1501: - if ('r' == current) { - state = 1502; - return true; - } - break; - case 1502: - if ('o' == current) { - state = 1503; - return true; - } - break; - case 1503: - if ('w' == current) { - state = 1504; - return true; - } - break; - case 1504: - // LowerRightArrow; - if (';' == current) { - match = "\u2198"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1505: - switch (current) { - case 'c': - state = 1506; - return true; - case 'h': - state = 1508; - return true; - case 't': - state = 1509; - return true; - } - break; - case 1506: - if ('r' == current) { - state = 1507; - return true; - } - break; - case 1507: - // Lscr; - if (';' == current) { - match = "\u2112"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1508: - // Lsh; - if (';' == current) { - match = "\u21B0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1509: - if ('r' == current) { - state = 1510; - return true; - } - break; - case 1510: - if ('o' == current) { - state = 1511; - return true; - } - break; - case 1511: - if ('k' == current) { - state = 1512; - return true; - } - break; - case 1512: - // Lstrok; - if (';' == current) { - match = "\u0141"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1513: - // Lt; - if (';' == current) { - match = "\u226A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1514: - switch (current) { - case 'a': - state = 1515; - return true; - case 'c': - state = 1517; - return true; - case 'e': - state = 1519; - return true; - case 'f': - state = 1536; - return true; - case 'i': - state = 1538; - return true; - case 'o': - state = 1546; - return true; - case 's': - state = 1549; - return true; - case 'u': - state = 1552; - return true; - } - break; - case 1515: - if ('p' == current) { - state = 1516; - return true; - } - break; - case 1516: - // Map; - if (';' == current) { - match = "\u2905"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1517: - if ('y' == current) { - state = 1518; - return true; - } - break; - case 1518: - // Mcy; - if (';' == current) { - match = "\u041C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1519: - if ('d' == current) { - state = 1520; - return true; - } - else if ('l' == current) { - state = 1529; - return true; - } - break; - case 1520: - if ('i' == current) { - state = 1521; - return true; - } - break; - case 1521: - if ('u' == current) { - state = 1522; - return true; - } - break; - case 1522: - if ('m' == current) { - state = 1523; - return true; - } - break; - case 1523: - if ('S' == current) { - state = 1524; - return true; - } - break; - case 1524: - if ('p' == current) { - state = 1525; - return true; - } - break; - case 1525: - if ('a' == current) { - state = 1526; - return true; - } - break; - case 1526: - if ('c' == current) { - state = 1527; - return true; - } - break; - case 1527: - if ('e' == current) { - state = 1528; - return true; - } - break; - case 1528: - // MediumSpace; - if (';' == current) { - match = "\u205F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1529: - if ('l' == current) { - state = 1530; - return true; - } - break; - case 1530: - if ('i' == current) { - state = 1531; - return true; - } - break; - case 1531: - if ('n' == current) { - state = 1532; - return true; - } - break; - case 1532: - if ('t' == current) { - state = 1533; - return true; - } - break; - case 1533: - if ('r' == current) { - state = 1534; - return true; - } - break; - case 1534: - if ('f' == current) { - state = 1535; - return true; - } - break; - case 1535: - // Mellintrf; - if (';' == current) { - match = "\u2133"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1536: - if ('r' == current) { - state = 1537; - return true; - } - break; - case 1537: - // Mfr; - if (';' == current) { - match = "\uD835\uDD10"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1538: - if ('n' == current) { - state = 1539; - return true; - } - break; - case 1539: - if ('u' == current) { - state = 1540; - return true; - } - break; - case 1540: - if ('s' == current) { - state = 1541; - return true; - } - break; - case 1541: - if ('P' == current) { - state = 1542; - return true; - } - break; - case 1542: - if ('l' == current) { - state = 1543; - return true; - } - break; - case 1543: - if ('u' == current) { - state = 1544; - return true; - } - break; - case 1544: - if ('s' == current) { - state = 1545; - return true; - } - break; - case 1545: - // MinusPlus; - if (';' == current) { - match = "\u2213"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1546: - if ('p' == current) { - state = 1547; - return true; - } - break; - case 1547: - if ('f' == current) { - state = 1548; - return true; - } - break; - case 1548: - // Mopf; - if (';' == current) { - match = "\uD835\uDD44"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1549: - if ('c' == current) { - state = 1550; - return true; - } - break; - case 1550: - if ('r' == current) { - state = 1551; - return true; - } - break; - case 1551: - // Mscr; - if (';' == current) { - match = "\u2133"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1552: - // Mu; - if (';' == current) { - match = "\u039C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1553: - switch (current) { - case 'J': - state = 1554; - return true; - case 'a': - state = 1557; - return true; - case 'c': - state = 1562; - return true; - case 'e': - state = 1572; - return true; - case 'f': - state = 1650; - return true; - case 'o': - state = 1652; - return true; - case 's': - state = 2039; - return true; - case 't': - state = 2042; - return true; - case 'u': - state = 2047; - return true; - } - break; - case 1554: - if ('c' == current) { - state = 1555; - return true; - } - break; - case 1555: - if ('y' == current) { - state = 1556; - return true; - } - break; - case 1556: - // NJcy; - if (';' == current) { - match = "\u040A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1557: - if ('c' == current) { - state = 1558; - return true; - } - break; - case 1558: - if ('u' == current) { - state = 1559; - return true; - } - break; - case 1559: - if ('t' == current) { - state = 1560; - return true; - } - break; - case 1560: - if ('e' == current) { - state = 1561; - return true; - } - break; - case 1561: - // Nacute; - if (';' == current) { - match = "\u0143"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1562: - switch (current) { - case 'a': - state = 1563; - return true; - case 'e': - state = 1567; - return true; - case 'y': - state = 1571; - return true; - } - break; - case 1563: - if ('r' == current) { - state = 1564; - return true; - } - break; - case 1564: - if ('o' == current) { - state = 1565; - return true; - } - break; - case 1565: - if ('n' == current) { - state = 1566; - return true; - } - break; - case 1566: - // Ncaron; - if (';' == current) { - match = "\u0147"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1567: - if ('d' == current) { - state = 1568; - return true; - } - break; - case 1568: - if ('i' == current) { - state = 1569; - return true; - } - break; - case 1569: - if ('l' == current) { - state = 1570; - return true; - } - break; - case 1570: - // Ncedil; - if (';' == current) { - match = "\u0145"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1571: - // Ncy; - if (';' == current) { - match = "\u041D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1572: - switch (current) { - case 'g': - state = 1573; - return true; - case 's': - state = 1619; - return true; - case 'w': - state = 1645; - return true; - } - break; - case 1573: - if ('a' == current) { - state = 1574; - return true; - } - break; - case 1574: - if ('t' == current) { - state = 1575; - return true; - } - break; - case 1575: - if ('i' == current) { - state = 1576; - return true; - } - break; - case 1576: - if ('v' == current) { - state = 1577; - return true; - } - break; - case 1577: - if ('e' == current) { - state = 1578; - return true; - } - break; - case 1578: - switch (current) { - case 'M': - state = 1579; - return true; - case 'T': - state = 1590; - return true; - case 'V': - state = 1606; - return true; - } - break; - case 1579: - if ('e' == current) { - state = 1580; - return true; - } - break; - case 1580: - if ('d' == current) { - state = 1581; - return true; - } - break; - case 1581: - if ('i' == current) { - state = 1582; - return true; - } - break; - case 1582: - if ('u' == current) { - state = 1583; - return true; - } - break; - case 1583: - if ('m' == current) { - state = 1584; - return true; - } - break; - case 1584: - if ('S' == current) { - state = 1585; - return true; - } - break; - case 1585: - if ('p' == current) { - state = 1586; - return true; - } - break; - case 1586: - if ('a' == current) { - state = 1587; - return true; - } - break; - case 1587: - if ('c' == current) { - state = 1588; - return true; - } - break; - case 1588: - if ('e' == current) { - state = 1589; - return true; - } - break; - case 1589: - // NegativeMediumSpace; - if (';' == current) { - match = "\u200B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1590: - if ('h' == current) { - state = 1591; - return true; - } - break; - case 1591: - if ('i' == current) { - state = 1592; - return true; - } - break; - case 1592: - if ('c' == current) { - state = 1593; - return true; - } - else if ('n' == current) { - state = 1600; - return true; - } - break; - case 1593: - if ('k' == current) { - state = 1594; - return true; - } - break; - case 1594: - if ('S' == current) { - state = 1595; - return true; - } - break; - case 1595: - if ('p' == current) { - state = 1596; - return true; - } - break; - case 1596: - if ('a' == current) { - state = 1597; - return true; - } - break; - case 1597: - if ('c' == current) { - state = 1598; - return true; - } - break; - case 1598: - if ('e' == current) { - state = 1599; - return true; - } - break; - case 1599: - // NegativeThickSpace; - if (';' == current) { - match = "\u200B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1600: - if ('S' == current) { - state = 1601; - return true; - } - break; - case 1601: - if ('p' == current) { - state = 1602; - return true; - } - break; - case 1602: - if ('a' == current) { - state = 1603; - return true; - } - break; - case 1603: - if ('c' == current) { - state = 1604; - return true; - } - break; - case 1604: - if ('e' == current) { - state = 1605; - return true; - } - break; - case 1605: - // NegativeThinSpace; - if (';' == current) { - match = "\u200B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1606: - if ('e' == current) { - state = 1607; - return true; - } - break; - case 1607: - if ('r' == current) { - state = 1608; - return true; - } - break; - case 1608: - if ('y' == current) { - state = 1609; - return true; - } - break; - case 1609: - if ('T' == current) { - state = 1610; - return true; - } - break; - case 1610: - if ('h' == current) { - state = 1611; - return true; - } - break; - case 1611: - if ('i' == current) { - state = 1612; - return true; - } - break; - case 1612: - if ('n' == current) { - state = 1613; - return true; - } - break; - case 1613: - if ('S' == current) { - state = 1614; - return true; - } - break; - case 1614: - if ('p' == current) { - state = 1615; - return true; - } - break; - case 1615: - if ('a' == current) { - state = 1616; - return true; - } - break; - case 1616: - if ('c' == current) { - state = 1617; - return true; - } - break; - case 1617: - if ('e' == current) { - state = 1618; - return true; - } - break; - case 1618: - // NegativeVeryThinSpace; - if (';' == current) { - match = "\u200B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1619: - if ('t' == current) { - state = 1620; - return true; - } - break; - case 1620: - if ('e' == current) { - state = 1621; - return true; - } - break; - case 1621: - if ('d' == current) { - state = 1622; - return true; - } - break; - case 1622: - if ('G' == current) { - state = 1623; - return true; - } - else if ('L' == current) { - state = 1637; - return true; - } - break; - case 1623: - if ('r' == current) { - state = 1624; - return true; - } - break; - case 1624: - if ('e' == current) { - state = 1625; - return true; - } - break; - case 1625: - if ('a' == current) { - state = 1626; - return true; - } - break; - case 1626: - if ('t' == current) { - state = 1627; - return true; - } - break; - case 1627: - if ('e' == current) { - state = 1628; - return true; - } - break; - case 1628: - if ('r' == current) { - state = 1629; - return true; - } - break; - case 1629: - if ('G' == current) { - state = 1630; - return true; - } - break; - case 1630: - if ('r' == current) { - state = 1631; - return true; - } - break; - case 1631: - if ('e' == current) { - state = 1632; - return true; - } - break; - case 1632: - if ('a' == current) { - state = 1633; - return true; - } - break; - case 1633: - if ('t' == current) { - state = 1634; - return true; - } - break; - case 1634: - if ('e' == current) { - state = 1635; - return true; - } - break; - case 1635: - if ('r' == current) { - state = 1636; - return true; - } - break; - case 1636: - // NestedGreaterGreater; - if (';' == current) { - match = "\u226B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1637: - if ('e' == current) { - state = 1638; - return true; - } - break; - case 1638: - if ('s' == current) { - state = 1639; - return true; - } - break; - case 1639: - if ('s' == current) { - state = 1640; - return true; - } - break; - case 1640: - if ('L' == current) { - state = 1641; - return true; - } - break; - case 1641: - if ('e' == current) { - state = 1642; - return true; - } - break; - case 1642: - if ('s' == current) { - state = 1643; - return true; - } - break; - case 1643: - if ('s' == current) { - state = 1644; - return true; - } - break; - case 1644: - // NestedLessLess; - if (';' == current) { - match = "\u226A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1645: - if ('L' == current) { - state = 1646; - return true; - } - break; - case 1646: - if ('i' == current) { - state = 1647; - return true; - } - break; - case 1647: - if ('n' == current) { - state = 1648; - return true; - } - break; - case 1648: - if ('e' == current) { - state = 1649; - return true; - } - break; - case 1649: - // NewLine; - if (';' == current) { - match = "\n"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1650: - if ('r' == current) { - state = 1651; - return true; - } - break; - case 1651: - // Nfr; - if (';' == current) { - match = "\uD835\uDD11"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1652: - switch (current) { - case 'B': - state = 1653; - return true; - case 'n': - state = 1658; - return true; - case 'p': - state = 1672; - return true; - case 't': - state = 1674; - return true; - } - break; - case 1653: - if ('r' == current) { - state = 1654; - return true; - } - break; - case 1654: - if ('e' == current) { - state = 1655; - return true; - } - break; - case 1655: - if ('a' == current) { - state = 1656; - return true; - } - break; - case 1656: - if ('k' == current) { - state = 1657; - return true; - } - break; - case 1657: - // NoBreak; - if (';' == current) { - match = "\u2060"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1658: - if ('B' == current) { - state = 1659; - return true; - } - break; - case 1659: - if ('r' == current) { - state = 1660; - return true; - } - break; - case 1660: - if ('e' == current) { - state = 1661; - return true; - } - break; - case 1661: - if ('a' == current) { - state = 1662; - return true; - } - break; - case 1662: - if ('k' == current) { - state = 1663; - return true; - } - break; - case 1663: - if ('i' == current) { - state = 1664; - return true; - } - break; - case 1664: - if ('n' == current) { - state = 1665; - return true; - } - break; - case 1665: - if ('g' == current) { - state = 1666; - return true; - } - break; - case 1666: - if ('S' == current) { - state = 1667; - return true; - } - break; - case 1667: - if ('p' == current) { - state = 1668; - return true; - } - break; - case 1668: - if ('a' == current) { - state = 1669; - return true; - } - break; - case 1669: - if ('c' == current) { - state = 1670; - return true; - } - break; - case 1670: - if ('e' == current) { - state = 1671; - return true; - } - break; - case 1671: - // NonBreakingSpace; - if (';' == current) { - match = "\u00A0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1672: - if ('f' == current) { - state = 1673; - return true; - } - break; - case 1673: - // Nopf; - if (';' == current) { - match = "\u2115"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1674: - switch (current) { - case ';': // Not; - match = "\u2AEC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'C': - state = 1675; - return true; - case 'D': - state = 1689; - return true; - case 'E': - state = 1706; - return true; - case 'G': - state = 1727; - return true; - case 'H': - state = 1774; - return true; - case 'L': - state = 1791; - return true; - case 'N': - state = 1844; - return true; - case 'P': - state = 1872; - return true; - case 'R': - state = 1895; - return true; - case 'S': - state = 1929; - return true; - case 'T': - state = 2004; - return true; - case 'V': - state = 2028; - return true; - } - break; - case 1675: - if ('o' == current) { - state = 1676; - return true; - } - else if ('u' == current) { - state = 1684; - return true; - } - break; - case 1676: - if ('n' == current) { - state = 1677; - return true; - } - break; - case 1677: - if ('g' == current) { - state = 1678; - return true; - } - break; - case 1678: - if ('r' == current) { - state = 1679; - return true; - } - break; - case 1679: - if ('u' == current) { - state = 1680; - return true; - } - break; - case 1680: - if ('e' == current) { - state = 1681; - return true; - } - break; - case 1681: - if ('n' == current) { - state = 1682; - return true; - } - break; - case 1682: - if ('t' == current) { - state = 1683; - return true; - } - break; - case 1683: - // NotCongruent; - if (';' == current) { - match = "\u2262"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1684: - if ('p' == current) { - state = 1685; - return true; - } - break; - case 1685: - if ('C' == current) { - state = 1686; - return true; - } - break; - case 1686: - if ('a' == current) { - state = 1687; - return true; - } - break; - case 1687: - if ('p' == current) { - state = 1688; - return true; - } - break; - case 1688: - // NotCupCap; - if (';' == current) { - match = "\u226D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1689: - if ('o' == current) { - state = 1690; - return true; - } - break; - case 1690: - if ('u' == current) { - state = 1691; - return true; - } - break; - case 1691: - if ('b' == current) { - state = 1692; - return true; - } - break; - case 1692: - if ('l' == current) { - state = 1693; - return true; - } - break; - case 1693: - if ('e' == current) { - state = 1694; - return true; - } - break; - case 1694: - if ('V' == current) { - state = 1695; - return true; - } - break; - case 1695: - if ('e' == current) { - state = 1696; - return true; - } - break; - case 1696: - if ('r' == current) { - state = 1697; - return true; - } - break; - case 1697: - if ('t' == current) { - state = 1698; - return true; - } - break; - case 1698: - if ('i' == current) { - state = 1699; - return true; - } - break; - case 1699: - if ('c' == current) { - state = 1700; - return true; - } - break; - case 1700: - if ('a' == current) { - state = 1701; - return true; - } - break; - case 1701: - if ('l' == current) { - state = 1702; - return true; - } - break; - case 1702: - if ('B' == current) { - state = 1703; - return true; - } - break; - case 1703: - if ('a' == current) { - state = 1704; - return true; - } - break; - case 1704: - if ('r' == current) { - state = 1705; - return true; - } - break; - case 1705: - // NotDoubleVerticalBar; - if (';' == current) { - match = "\u2226"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1706: - switch (current) { - case 'l': - state = 1707; - return true; - case 'q': - state = 1713; - return true; - case 'x': - state = 1722; - return true; - } - break; - case 1707: - if ('e' == current) { - state = 1708; - return true; - } - break; - case 1708: - if ('m' == current) { - state = 1709; - return true; - } - break; - case 1709: - if ('e' == current) { - state = 1710; - return true; - } - break; - case 1710: - if ('n' == current) { - state = 1711; - return true; - } - break; - case 1711: - if ('t' == current) { - state = 1712; - return true; - } - break; - case 1712: - // NotElement; - if (';' == current) { - match = "\u2209"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1713: - if ('u' == current) { - state = 1714; - return true; - } - break; - case 1714: - if ('a' == current) { - state = 1715; - return true; - } - break; - case 1715: - if ('l' == current) { - state = 1716; - return true; - } - break; - case 1716: - // NotEqual; - if (';' == current) { - match = "\u2260"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('T' == current) { - state = 1717; - return true; - } - break; - case 1717: - if ('i' == current) { - state = 1718; - return true; - } - break; - case 1718: - if ('l' == current) { - state = 1719; - return true; - } - break; - case 1719: - if ('d' == current) { - state = 1720; - return true; - } - break; - case 1720: - if ('e' == current) { - state = 1721; - return true; - } - break; - case 1721: - // NotEqualTilde; - if (';' == current) { - match = "\u2242\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1722: - if ('i' == current) { - state = 1723; - return true; - } - break; - case 1723: - if ('s' == current) { - state = 1724; - return true; - } - break; - case 1724: - if ('t' == current) { - state = 1725; - return true; - } - break; - case 1725: - if ('s' == current) { - state = 1726; - return true; - } - break; - case 1726: - // NotExists; - if (';' == current) { - match = "\u2204"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1727: - if ('r' == current) { - state = 1728; - return true; - } - break; - case 1728: - if ('e' == current) { - state = 1729; - return true; - } - break; - case 1729: - if ('a' == current) { - state = 1730; - return true; - } - break; - case 1730: - if ('t' == current) { - state = 1731; - return true; - } - break; - case 1731: - if ('e' == current) { - state = 1732; - return true; - } - break; - case 1732: - if ('r' == current) { - state = 1733; - return true; - } - break; - case 1733: - switch (current) { - case ';': // NotGreater; - match = "\u226F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 1734; - return true; - case 'F': - state = 1739; - return true; - case 'G': - state = 1748; - return true; - case 'L': - state = 1755; - return true; - case 'S': - state = 1759; - return true; - case 'T': - state = 1769; - return true; - } - break; - case 1734: - if ('q' == current) { - state = 1735; - return true; - } - break; - case 1735: - if ('u' == current) { - state = 1736; - return true; - } - break; - case 1736: - if ('a' == current) { - state = 1737; - return true; - } - break; - case 1737: - if ('l' == current) { - state = 1738; - return true; - } - break; - case 1738: - // NotGreaterEqual; - if (';' == current) { - match = "\u2271"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1739: - if ('u' == current) { - state = 1740; - return true; - } - break; - case 1740: - if ('l' == current) { - state = 1741; - return true; - } - break; - case 1741: - if ('l' == current) { - state = 1742; - return true; - } - break; - case 1742: - if ('E' == current) { - state = 1743; - return true; - } - break; - case 1743: - if ('q' == current) { - state = 1744; - return true; - } - break; - case 1744: - if ('u' == current) { - state = 1745; - return true; - } - break; - case 1745: - if ('a' == current) { - state = 1746; - return true; - } - break; - case 1746: - if ('l' == current) { - state = 1747; - return true; - } - break; - case 1747: - // NotGreaterFullEqual; - if (';' == current) { - match = "\u2267\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1748: - if ('r' == current) { - state = 1749; - return true; - } - break; - case 1749: - if ('e' == current) { - state = 1750; - return true; - } - break; - case 1750: - if ('a' == current) { - state = 1751; - return true; - } - break; - case 1751: - if ('t' == current) { - state = 1752; - return true; - } - break; - case 1752: - if ('e' == current) { - state = 1753; - return true; - } - break; - case 1753: - if ('r' == current) { - state = 1754; - return true; - } - break; - case 1754: - // NotGreaterGreater; - if (';' == current) { - match = "\u226B\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1755: - if ('e' == current) { - state = 1756; - return true; - } - break; - case 1756: - if ('s' == current) { - state = 1757; - return true; - } - break; - case 1757: - if ('s' == current) { - state = 1758; - return true; - } - break; - case 1758: - // NotGreaterLess; - if (';' == current) { - match = "\u2279"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1759: - if ('l' == current) { - state = 1760; - return true; - } - break; - case 1760: - if ('a' == current) { - state = 1761; - return true; - } - break; - case 1761: - if ('n' == current) { - state = 1762; - return true; - } - break; - case 1762: - if ('t' == current) { - state = 1763; - return true; - } - break; - case 1763: - if ('E' == current) { - state = 1764; - return true; - } - break; - case 1764: - if ('q' == current) { - state = 1765; - return true; - } - break; - case 1765: - if ('u' == current) { - state = 1766; - return true; - } - break; - case 1766: - if ('a' == current) { - state = 1767; - return true; - } - break; - case 1767: - if ('l' == current) { - state = 1768; - return true; - } - break; - case 1768: - // NotGreaterSlantEqual; - if (';' == current) { - match = "\u2A7E\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1769: - if ('i' == current) { - state = 1770; - return true; - } - break; - case 1770: - if ('l' == current) { - state = 1771; - return true; - } - break; - case 1771: - if ('d' == current) { - state = 1772; - return true; - } - break; - case 1772: - if ('e' == current) { - state = 1773; - return true; - } - break; - case 1773: - // NotGreaterTilde; - if (';' == current) { - match = "\u2275"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1774: - if ('u' == current) { - state = 1775; - return true; - } - break; - case 1775: - if ('m' == current) { - state = 1776; - return true; - } - break; - case 1776: - if ('p' == current) { - state = 1777; - return true; - } - break; - case 1777: - if ('D' == current) { - state = 1778; - return true; - } - else if ('E' == current) { - state = 1786; - return true; - } - break; - case 1778: - if ('o' == current) { - state = 1779; - return true; - } - break; - case 1779: - if ('w' == current) { - state = 1780; - return true; - } - break; - case 1780: - if ('n' == current) { - state = 1781; - return true; - } - break; - case 1781: - if ('H' == current) { - state = 1782; - return true; - } - break; - case 1782: - if ('u' == current) { - state = 1783; - return true; - } - break; - case 1783: - if ('m' == current) { - state = 1784; - return true; - } - break; - case 1784: - if ('p' == current) { - state = 1785; - return true; - } - break; - case 1785: - // NotHumpDownHump; - if (';' == current) { - match = "\u224E\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1786: - if ('q' == current) { - state = 1787; - return true; - } - break; - case 1787: - if ('u' == current) { - state = 1788; - return true; - } - break; - case 1788: - if ('a' == current) { - state = 1789; - return true; - } - break; - case 1789: - if ('l' == current) { - state = 1790; - return true; - } - break; - case 1790: - // NotHumpEqual; - if (';' == current) { - match = "\u224F\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1791: - if ('e' == current) { - state = 1792; - return true; - } - break; - case 1792: - if ('f' == current) { - state = 1793; - return true; - } - else if ('s' == current) { - state = 1811; - return true; - } - break; - case 1793: - if ('t' == current) { - state = 1794; - return true; - } - break; - case 1794: - if ('T' == current) { - state = 1795; - return true; - } - break; - case 1795: - if ('r' == current) { - state = 1796; - return true; - } - break; - case 1796: - if ('i' == current) { - state = 1797; - return true; - } - break; - case 1797: - if ('a' == current) { - state = 1798; - return true; - } - break; - case 1798: - if ('n' == current) { - state = 1799; - return true; - } - break; - case 1799: - if ('g' == current) { - state = 1800; - return true; - } - break; - case 1800: - if ('l' == current) { - state = 1801; - return true; - } - break; - case 1801: - if ('e' == current) { - state = 1802; - return true; - } - break; - case 1802: - switch (current) { - case ';': // NotLeftTriangle; - match = "\u22EA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'B': - state = 1803; - return true; - case 'E': - state = 1806; - return true; - } - break; - case 1803: - if ('a' == current) { - state = 1804; - return true; - } - break; - case 1804: - if ('r' == current) { - state = 1805; - return true; - } - break; - case 1805: - // NotLeftTriangleBar; - if (';' == current) { - match = "\u29CF\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1806: - if ('q' == current) { - state = 1807; - return true; - } - break; - case 1807: - if ('u' == current) { - state = 1808; - return true; - } - break; - case 1808: - if ('a' == current) { - state = 1809; - return true; - } - break; - case 1809: - if ('l' == current) { - state = 1810; - return true; - } - break; - case 1810: - // NotLeftTriangleEqual; - if (';' == current) { - match = "\u22EC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1811: - if ('s' == current) { - state = 1812; - return true; - } - break; - case 1812: - switch (current) { - case ';': // NotLess; - match = "\u226E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 1813; - return true; - case 'G': - state = 1818; - return true; - case 'L': - state = 1825; - return true; - case 'S': - state = 1829; - return true; - case 'T': - state = 1839; - return true; - } - break; - case 1813: - if ('q' == current) { - state = 1814; - return true; - } - break; - case 1814: - if ('u' == current) { - state = 1815; - return true; - } - break; - case 1815: - if ('a' == current) { - state = 1816; - return true; - } - break; - case 1816: - if ('l' == current) { - state = 1817; - return true; - } - break; - case 1817: - // NotLessEqual; - if (';' == current) { - match = "\u2270"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1818: - if ('r' == current) { - state = 1819; - return true; - } - break; - case 1819: - if ('e' == current) { - state = 1820; - return true; - } - break; - case 1820: - if ('a' == current) { - state = 1821; - return true; - } - break; - case 1821: - if ('t' == current) { - state = 1822; - return true; - } - break; - case 1822: - if ('e' == current) { - state = 1823; - return true; - } - break; - case 1823: - if ('r' == current) { - state = 1824; - return true; - } - break; - case 1824: - // NotLessGreater; - if (';' == current) { - match = "\u2278"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1825: - if ('e' == current) { - state = 1826; - return true; - } - break; - case 1826: - if ('s' == current) { - state = 1827; - return true; - } - break; - case 1827: - if ('s' == current) { - state = 1828; - return true; - } - break; - case 1828: - // NotLessLess; - if (';' == current) { - match = "\u226A\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1829: - if ('l' == current) { - state = 1830; - return true; - } - break; - case 1830: - if ('a' == current) { - state = 1831; - return true; - } - break; - case 1831: - if ('n' == current) { - state = 1832; - return true; - } - break; - case 1832: - if ('t' == current) { - state = 1833; - return true; - } - break; - case 1833: - if ('E' == current) { - state = 1834; - return true; - } - break; - case 1834: - if ('q' == current) { - state = 1835; - return true; - } - break; - case 1835: - if ('u' == current) { - state = 1836; - return true; - } - break; - case 1836: - if ('a' == current) { - state = 1837; - return true; - } - break; - case 1837: - if ('l' == current) { - state = 1838; - return true; - } - break; - case 1838: - // NotLessSlantEqual; - if (';' == current) { - match = "\u2A7D\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1839: - if ('i' == current) { - state = 1840; - return true; - } - break; - case 1840: - if ('l' == current) { - state = 1841; - return true; - } - break; - case 1841: - if ('d' == current) { - state = 1842; - return true; - } - break; - case 1842: - if ('e' == current) { - state = 1843; - return true; - } - break; - case 1843: - // NotLessTilde; - if (';' == current) { - match = "\u2274"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1844: - if ('e' == current) { - state = 1845; - return true; - } - break; - case 1845: - if ('s' == current) { - state = 1846; - return true; - } - break; - case 1846: - if ('t' == current) { - state = 1847; - return true; - } - break; - case 1847: - if ('e' == current) { - state = 1848; - return true; - } - break; - case 1848: - if ('d' == current) { - state = 1849; - return true; - } - break; - case 1849: - if ('G' == current) { - state = 1850; - return true; - } - else if ('L' == current) { - state = 1864; - return true; - } - break; - case 1850: - if ('r' == current) { - state = 1851; - return true; - } - break; - case 1851: - if ('e' == current) { - state = 1852; - return true; - } - break; - case 1852: - if ('a' == current) { - state = 1853; - return true; - } - break; - case 1853: - if ('t' == current) { - state = 1854; - return true; - } - break; - case 1854: - if ('e' == current) { - state = 1855; - return true; - } - break; - case 1855: - if ('r' == current) { - state = 1856; - return true; - } - break; - case 1856: - if ('G' == current) { - state = 1857; - return true; - } - break; - case 1857: - if ('r' == current) { - state = 1858; - return true; - } - break; - case 1858: - if ('e' == current) { - state = 1859; - return true; - } - break; - case 1859: - if ('a' == current) { - state = 1860; - return true; - } - break; - case 1860: - if ('t' == current) { - state = 1861; - return true; - } - break; - case 1861: - if ('e' == current) { - state = 1862; - return true; - } - break; - case 1862: - if ('r' == current) { - state = 1863; - return true; - } - break; - case 1863: - // NotNestedGreaterGreater; - if (';' == current) { - match = "\u2AA2\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1864: - if ('e' == current) { - state = 1865; - return true; - } - break; - case 1865: - if ('s' == current) { - state = 1866; - return true; - } - break; - case 1866: - if ('s' == current) { - state = 1867; - return true; - } - break; - case 1867: - if ('L' == current) { - state = 1868; - return true; - } - break; - case 1868: - if ('e' == current) { - state = 1869; - return true; - } - break; - case 1869: - if ('s' == current) { - state = 1870; - return true; - } - break; - case 1870: - if ('s' == current) { - state = 1871; - return true; - } - break; - case 1871: - // NotNestedLessLess; - if (';' == current) { - match = "\u2AA1\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1872: - if ('r' == current) { - state = 1873; - return true; - } - break; - case 1873: - if ('e' == current) { - state = 1874; - return true; - } - break; - case 1874: - if ('c' == current) { - state = 1875; - return true; - } - break; - case 1875: - if ('e' == current) { - state = 1876; - return true; - } - break; - case 1876: - if ('d' == current) { - state = 1877; - return true; - } - break; - case 1877: - if ('e' == current) { - state = 1878; - return true; - } - break; - case 1878: - if ('s' == current) { - state = 1879; - return true; - } - break; - case 1879: - switch (current) { - case ';': // NotPrecedes; - match = "\u2280"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 1880; - return true; - case 'S': - state = 1885; - return true; - } - break; - case 1880: - if ('q' == current) { - state = 1881; - return true; - } - break; - case 1881: - if ('u' == current) { - state = 1882; - return true; - } - break; - case 1882: - if ('a' == current) { - state = 1883; - return true; - } - break; - case 1883: - if ('l' == current) { - state = 1884; - return true; - } - break; - case 1884: - // NotPrecedesEqual; - if (';' == current) { - match = "\u2AAF\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1885: - if ('l' == current) { - state = 1886; - return true; - } - break; - case 1886: - if ('a' == current) { - state = 1887; - return true; - } - break; - case 1887: - if ('n' == current) { - state = 1888; - return true; - } - break; - case 1888: - if ('t' == current) { - state = 1889; - return true; - } - break; - case 1889: - if ('E' == current) { - state = 1890; - return true; - } - break; - case 1890: - if ('q' == current) { - state = 1891; - return true; - } - break; - case 1891: - if ('u' == current) { - state = 1892; - return true; - } - break; - case 1892: - if ('a' == current) { - state = 1893; - return true; - } - break; - case 1893: - if ('l' == current) { - state = 1894; - return true; - } - break; - case 1894: - // NotPrecedesSlantEqual; - if (';' == current) { - match = "\u22E0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1895: - if ('e' == current) { - state = 1896; - return true; - } - else if ('i' == current) { - state = 1909; - return true; - } - break; - case 1896: - if ('v' == current) { - state = 1897; - return true; - } - break; - case 1897: - if ('e' == current) { - state = 1898; - return true; - } - break; - case 1898: - if ('r' == current) { - state = 1899; - return true; - } - break; - case 1899: - if ('s' == current) { - state = 1900; - return true; - } - break; - case 1900: - if ('e' == current) { - state = 1901; - return true; - } - break; - case 1901: - if ('E' == current) { - state = 1902; - return true; - } - break; - case 1902: - if ('l' == current) { - state = 1903; - return true; - } - break; - case 1903: - if ('e' == current) { - state = 1904; - return true; - } - break; - case 1904: - if ('m' == current) { - state = 1905; - return true; - } - break; - case 1905: - if ('e' == current) { - state = 1906; - return true; - } - break; - case 1906: - if ('n' == current) { - state = 1907; - return true; - } - break; - case 1907: - if ('t' == current) { - state = 1908; - return true; - } - break; - case 1908: - // NotReverseElement; - if (';' == current) { - match = "\u220C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1909: - if ('g' == current) { - state = 1910; - return true; - } - break; - case 1910: - if ('h' == current) { - state = 1911; - return true; - } - break; - case 1911: - if ('t' == current) { - state = 1912; - return true; - } - break; - case 1912: - if ('T' == current) { - state = 1913; - return true; - } - break; - case 1913: - if ('r' == current) { - state = 1914; - return true; - } - break; - case 1914: - if ('i' == current) { - state = 1915; - return true; - } - break; - case 1915: - if ('a' == current) { - state = 1916; - return true; - } - break; - case 1916: - if ('n' == current) { - state = 1917; - return true; - } - break; - case 1917: - if ('g' == current) { - state = 1918; - return true; - } - break; - case 1918: - if ('l' == current) { - state = 1919; - return true; - } - break; - case 1919: - if ('e' == current) { - state = 1920; - return true; - } - break; - case 1920: - switch (current) { - case ';': // NotRightTriangle; - match = "\u22EB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'B': - state = 1921; - return true; - case 'E': - state = 1924; - return true; - } - break; - case 1921: - if ('a' == current) { - state = 1922; - return true; - } - break; - case 1922: - if ('r' == current) { - state = 1923; - return true; - } - break; - case 1923: - // NotRightTriangleBar; - if (';' == current) { - match = "\u29D0\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1924: - if ('q' == current) { - state = 1925; - return true; - } - break; - case 1925: - if ('u' == current) { - state = 1926; - return true; - } - break; - case 1926: - if ('a' == current) { - state = 1927; - return true; - } - break; - case 1927: - if ('l' == current) { - state = 1928; - return true; - } - break; - case 1928: - // NotRightTriangleEqual; - if (';' == current) { - match = "\u22ED"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1929: - if ('q' == current) { - state = 1930; - return true; - } - else if ('u' == current) { - state = 1957; - return true; - } - break; - case 1930: - if ('u' == current) { - state = 1931; - return true; - } - break; - case 1931: - if ('a' == current) { - state = 1932; - return true; - } - break; - case 1932: - if ('r' == current) { - state = 1933; - return true; - } - break; - case 1933: - if ('e' == current) { - state = 1934; - return true; - } - break; - case 1934: - if ('S' == current) { - state = 1935; - return true; - } - break; - case 1935: - if ('u' == current) { - state = 1936; - return true; - } - break; - case 1936: - if ('b' == current) { - state = 1937; - return true; - } - else if ('p' == current) { - state = 1946; - return true; - } - break; - case 1937: - if ('s' == current) { - state = 1938; - return true; - } - break; - case 1938: - if ('e' == current) { - state = 1939; - return true; - } - break; - case 1939: - if ('t' == current) { - state = 1940; - return true; - } - break; - case 1940: - // NotSquareSubset; - if (';' == current) { - match = "\u228F\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('E' == current) { - state = 1941; - return true; - } - break; - case 1941: - if ('q' == current) { - state = 1942; - return true; - } - break; - case 1942: - if ('u' == current) { - state = 1943; - return true; - } - break; - case 1943: - if ('a' == current) { - state = 1944; - return true; - } - break; - case 1944: - if ('l' == current) { - state = 1945; - return true; - } - break; - case 1945: - // NotSquareSubsetEqual; - if (';' == current) { - match = "\u22E2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1946: - if ('e' == current) { - state = 1947; - return true; - } - break; - case 1947: - if ('r' == current) { - state = 1948; - return true; - } - break; - case 1948: - if ('s' == current) { - state = 1949; - return true; - } - break; - case 1949: - if ('e' == current) { - state = 1950; - return true; - } - break; - case 1950: - if ('t' == current) { - state = 1951; - return true; - } - break; - case 1951: - // NotSquareSuperset; - if (';' == current) { - match = "\u2290\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('E' == current) { - state = 1952; - return true; - } - break; - case 1952: - if ('q' == current) { - state = 1953; - return true; - } - break; - case 1953: - if ('u' == current) { - state = 1954; - return true; - } - break; - case 1954: - if ('a' == current) { - state = 1955; - return true; - } - break; - case 1955: - if ('l' == current) { - state = 1956; - return true; - } - break; - case 1956: - // NotSquareSupersetEqual; - if (';' == current) { - match = "\u22E3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1957: - switch (current) { - case 'b': - state = 1958; - return true; - case 'c': - state = 1967; - return true; - case 'p': - state = 1993; - return true; - } - break; - case 1958: - if ('s' == current) { - state = 1959; - return true; - } - break; - case 1959: - if ('e' == current) { - state = 1960; - return true; - } - break; - case 1960: - if ('t' == current) { - state = 1961; - return true; - } - break; - case 1961: - // NotSubset; - if (';' == current) { - match = "\u2282\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('E' == current) { - state = 1962; - return true; - } - break; - case 1962: - if ('q' == current) { - state = 1963; - return true; - } - break; - case 1963: - if ('u' == current) { - state = 1964; - return true; - } - break; - case 1964: - if ('a' == current) { - state = 1965; - return true; - } - break; - case 1965: - if ('l' == current) { - state = 1966; - return true; - } - break; - case 1966: - // NotSubsetEqual; - if (';' == current) { - match = "\u2288"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1967: - if ('c' == current) { - state = 1968; - return true; - } - break; - case 1968: - if ('e' == current) { - state = 1969; - return true; - } - break; - case 1969: - if ('e' == current) { - state = 1970; - return true; - } - break; - case 1970: - if ('d' == current) { - state = 1971; - return true; - } - break; - case 1971: - if ('s' == current) { - state = 1972; - return true; - } - break; - case 1972: - switch (current) { - case ';': // NotSucceeds; - match = "\u2281"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 1973; - return true; - case 'S': - state = 1978; - return true; - case 'T': - state = 1988; - return true; - } - break; - case 1973: - if ('q' == current) { - state = 1974; - return true; - } - break; - case 1974: - if ('u' == current) { - state = 1975; - return true; - } - break; - case 1975: - if ('a' == current) { - state = 1976; - return true; - } - break; - case 1976: - if ('l' == current) { - state = 1977; - return true; - } - break; - case 1977: - // NotSucceedsEqual; - if (';' == current) { - match = "\u2AB0\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1978: - if ('l' == current) { - state = 1979; - return true; - } - break; - case 1979: - if ('a' == current) { - state = 1980; - return true; - } - break; - case 1980: - if ('n' == current) { - state = 1981; - return true; - } - break; - case 1981: - if ('t' == current) { - state = 1982; - return true; - } - break; - case 1982: - if ('E' == current) { - state = 1983; - return true; - } - break; - case 1983: - if ('q' == current) { - state = 1984; - return true; - } - break; - case 1984: - if ('u' == current) { - state = 1985; - return true; - } - break; - case 1985: - if ('a' == current) { - state = 1986; - return true; - } - break; - case 1986: - if ('l' == current) { - state = 1987; - return true; - } - break; - case 1987: - // NotSucceedsSlantEqual; - if (';' == current) { - match = "\u22E1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1988: - if ('i' == current) { - state = 1989; - return true; - } - break; - case 1989: - if ('l' == current) { - state = 1990; - return true; - } - break; - case 1990: - if ('d' == current) { - state = 1991; - return true; - } - break; - case 1991: - if ('e' == current) { - state = 1992; - return true; - } - break; - case 1992: - // NotSucceedsTilde; - if (';' == current) { - match = "\u227F\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 1993: - if ('e' == current) { - state = 1994; - return true; - } - break; - case 1994: - if ('r' == current) { - state = 1995; - return true; - } - break; - case 1995: - if ('s' == current) { - state = 1996; - return true; - } - break; - case 1996: - if ('e' == current) { - state = 1997; - return true; - } - break; - case 1997: - if ('t' == current) { - state = 1998; - return true; - } - break; - case 1998: - // NotSuperset; - if (';' == current) { - match = "\u2283\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('E' == current) { - state = 1999; - return true; - } - break; - case 1999: - if ('q' == current) { - state = 2000; - return true; - } - break; - } - return false; - } - - private boolean parse3(final int current) { - consumedCount++; - switch (state) { - case 2000: - if ('u' == current) { - state = 2001; - return true; - } - break; - case 2001: - if ('a' == current) { - state = 2002; - return true; - } - break; - case 2002: - if ('l' == current) { - state = 2003; - return true; - } - break; - case 2003: - // NotSupersetEqual; - if (';' == current) { - match = "\u2289"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2004: - if ('i' == current) { - state = 2005; - return true; - } - break; - case 2005: - if ('l' == current) { - state = 2006; - return true; - } - break; - case 2006: - if ('d' == current) { - state = 2007; - return true; - } - break; - case 2007: - if ('e' == current) { - state = 2008; - return true; - } - break; - case 2008: - switch (current) { - case ';': // NotTilde; - match = "\u2241"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 2009; - return true; - case 'F': - state = 2014; - return true; - case 'T': - state = 2023; - return true; - } - break; - case 2009: - if ('q' == current) { - state = 2010; - return true; - } - break; - case 2010: - if ('u' == current) { - state = 2011; - return true; - } - break; - case 2011: - if ('a' == current) { - state = 2012; - return true; - } - break; - case 2012: - if ('l' == current) { - state = 2013; - return true; - } - break; - case 2013: - // NotTildeEqual; - if (';' == current) { - match = "\u2244"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2014: - if ('u' == current) { - state = 2015; - return true; - } - break; - case 2015: - if ('l' == current) { - state = 2016; - return true; - } - break; - case 2016: - if ('l' == current) { - state = 2017; - return true; - } - break; - case 2017: - if ('E' == current) { - state = 2018; - return true; - } - break; - case 2018: - if ('q' == current) { - state = 2019; - return true; - } - break; - case 2019: - if ('u' == current) { - state = 2020; - return true; - } - break; - case 2020: - if ('a' == current) { - state = 2021; - return true; - } - break; - case 2021: - if ('l' == current) { - state = 2022; - return true; - } - break; - case 2022: - // NotTildeFullEqual; - if (';' == current) { - match = "\u2247"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2023: - if ('i' == current) { - state = 2024; - return true; - } - break; - case 2024: - if ('l' == current) { - state = 2025; - return true; - } - break; - case 2025: - if ('d' == current) { - state = 2026; - return true; - } - break; - case 2026: - if ('e' == current) { - state = 2027; - return true; - } - break; - case 2027: - // NotTildeTilde; - if (';' == current) { - match = "\u2249"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2028: - if ('e' == current) { - state = 2029; - return true; - } - break; - case 2029: - if ('r' == current) { - state = 2030; - return true; - } - break; - case 2030: - if ('t' == current) { - state = 2031; - return true; - } - break; - case 2031: - if ('i' == current) { - state = 2032; - return true; - } - break; - case 2032: - if ('c' == current) { - state = 2033; - return true; - } - break; - case 2033: - if ('a' == current) { - state = 2034; - return true; - } - break; - case 2034: - if ('l' == current) { - state = 2035; - return true; - } - break; - case 2035: - if ('B' == current) { - state = 2036; - return true; - } - break; - case 2036: - if ('a' == current) { - state = 2037; - return true; - } - break; - case 2037: - if ('r' == current) { - state = 2038; - return true; - } - break; - case 2038: - // NotVerticalBar; - if (';' == current) { - match = "\u2224"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2039: - if ('c' == current) { - state = 2040; - return true; - } - break; - case 2040: - if ('r' == current) { - state = 2041; - return true; - } - break; - case 2041: - // Nscr; - if (';' == current) { - match = "\uD835\uDCA9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2042: - if ('i' == current) { - state = 2043; - return true; - } - break; - case 2043: - if ('l' == current) { - state = 2044; - return true; - } - break; - case 2044: - if ('d' == current) { - state = 2045; - return true; - } - break; - case 2045: - // Ntilde - if ('e' == current) { - match = "\u00D1"; - matchLength = consumedCount; - state = 2046; - return true; - } - break; - case 2046: - // Ntilde; - if (';' == current) { - match = "\u00D1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2047: - // Nu; - if (';' == current) { - match = "\u039D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2048: - switch (current) { - case 'E': - state = 2049; - return true; - case 'a': - state = 2053; - return true; - case 'c': - state = 2058; - return true; - case 'd': - state = 2063; - return true; - case 'f': - state = 2068; - return true; - case 'g': - state = 2070; - return true; - case 'm': - state = 2075; - return true; - case 'o': - state = 2087; - return true; - case 'p': - state = 2090; - return true; - case 'r': - state = 2114; - return true; - case 's': - state = 2115; - return true; - case 't': - state = 2122; - return true; - case 'u': - state = 2130; - return true; - case 'v': - state = 2133; - return true; - } - break; - case 2049: - if ('l' == current) { - state = 2050; - return true; - } - break; - case 2050: - if ('i' == current) { - state = 2051; - return true; - } - break; - case 2051: - if ('g' == current) { - state = 2052; - return true; - } - break; - case 2052: - // OElig; - if (';' == current) { - match = "\u0152"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2053: - if ('c' == current) { - state = 2054; - return true; - } - break; - case 2054: - if ('u' == current) { - state = 2055; - return true; - } - break; - case 2055: - if ('t' == current) { - state = 2056; - return true; - } - break; - case 2056: - // Oacute - if ('e' == current) { - match = "\u00D3"; - matchLength = consumedCount; - state = 2057; - return true; - } - break; - case 2057: - // Oacute; - if (';' == current) { - match = "\u00D3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2058: - if ('i' == current) { - state = 2059; - return true; - } - else if ('y' == current) { - state = 2062; - return true; - } - break; - case 2059: - if ('r' == current) { - state = 2060; - return true; - } - break; - case 2060: - // Ocirc - if ('c' == current) { - match = "\u00D4"; - matchLength = consumedCount; - state = 2061; - return true; - } - break; - case 2061: - // Ocirc; - if (';' == current) { - match = "\u00D4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2062: - // Ocy; - if (';' == current) { - match = "\u041E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2063: - if ('b' == current) { - state = 2064; - return true; - } - break; - case 2064: - if ('l' == current) { - state = 2065; - return true; - } - break; - case 2065: - if ('a' == current) { - state = 2066; - return true; - } - break; - case 2066: - if ('c' == current) { - state = 2067; - return true; - } - break; - case 2067: - // Odblac; - if (';' == current) { - match = "\u0150"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2068: - if ('r' == current) { - state = 2069; - return true; - } - break; - case 2069: - // Ofr; - if (';' == current) { - match = "\uD835\uDD12"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2070: - if ('r' == current) { - state = 2071; - return true; - } - break; - case 2071: - if ('a' == current) { - state = 2072; - return true; - } - break; - case 2072: - if ('v' == current) { - state = 2073; - return true; - } - break; - case 2073: - // Ograve - if ('e' == current) { - match = "\u00D2"; - matchLength = consumedCount; - state = 2074; - return true; - } - break; - case 2074: - // Ograve; - if (';' == current) { - match = "\u00D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2075: - switch (current) { - case 'a': - state = 2076; - return true; - case 'e': - state = 2079; - return true; - case 'i': - state = 2082; - return true; - } - break; - case 2076: - if ('c' == current) { - state = 2077; - return true; - } - break; - case 2077: - if ('r' == current) { - state = 2078; - return true; - } - break; - case 2078: - // Omacr; - if (';' == current) { - match = "\u014C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2079: - if ('g' == current) { - state = 2080; - return true; - } - break; - case 2080: - if ('a' == current) { - state = 2081; - return true; - } - break; - case 2081: - // Omega; - if (';' == current) { - match = "\u03A9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2082: - if ('c' == current) { - state = 2083; - return true; - } - break; - case 2083: - if ('r' == current) { - state = 2084; - return true; - } - break; - case 2084: - if ('o' == current) { - state = 2085; - return true; - } - break; - case 2085: - if ('n' == current) { - state = 2086; - return true; - } - break; - case 2086: - // Omicron; - if (';' == current) { - match = "\u039F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2087: - if ('p' == current) { - state = 2088; - return true; - } - break; - case 2088: - if ('f' == current) { - state = 2089; - return true; - } - break; - case 2089: - // Oopf; - if (';' == current) { - match = "\uD835\uDD46"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2090: - if ('e' == current) { - state = 2091; - return true; - } - break; - case 2091: - if ('n' == current) { - state = 2092; - return true; - } - break; - case 2092: - if ('C' == current) { - state = 2093; - return true; - } - break; - case 2093: - if ('u' == current) { - state = 2094; - return true; - } - break; - case 2094: - if ('r' == current) { - state = 2095; - return true; - } - break; - case 2095: - if ('l' == current) { - state = 2096; - return true; - } - break; - case 2096: - if ('y' == current) { - state = 2097; - return true; - } - break; - case 2097: - if ('D' == current) { - state = 2098; - return true; - } - else if ('Q' == current) { - state = 2109; - return true; - } - break; - case 2098: - if ('o' == current) { - state = 2099; - return true; - } - break; - case 2099: - if ('u' == current) { - state = 2100; - return true; - } - break; - case 2100: - if ('b' == current) { - state = 2101; - return true; - } - break; - case 2101: - if ('l' == current) { - state = 2102; - return true; - } - break; - case 2102: - if ('e' == current) { - state = 2103; - return true; - } - break; - case 2103: - if ('Q' == current) { - state = 2104; - return true; - } - break; - case 2104: - if ('u' == current) { - state = 2105; - return true; - } - break; - case 2105: - if ('o' == current) { - state = 2106; - return true; - } - break; - case 2106: - if ('t' == current) { - state = 2107; - return true; - } - break; - case 2107: - if ('e' == current) { - state = 2108; - return true; - } - break; - case 2108: - // OpenCurlyDoubleQuote; - if (';' == current) { - match = "\u201C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2109: - if ('u' == current) { - state = 2110; - return true; - } - break; - case 2110: - if ('o' == current) { - state = 2111; - return true; - } - break; - case 2111: - if ('t' == current) { - state = 2112; - return true; - } - break; - case 2112: - if ('e' == current) { - state = 2113; - return true; - } - break; - case 2113: - // OpenCurlyQuote; - if (';' == current) { - match = "\u2018"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2114: - // Or; - if (';' == current) { - match = "\u2A54"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2115: - if ('c' == current) { - state = 2116; - return true; - } - else if ('l' == current) { - state = 2118; - return true; - } - break; - case 2116: - if ('r' == current) { - state = 2117; - return true; - } - break; - case 2117: - // Oscr; - if (';' == current) { - match = "\uD835\uDCAA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2118: - if ('a' == current) { - state = 2119; - return true; - } - break; - case 2119: - if ('s' == current) { - state = 2120; - return true; - } - break; - case 2120: - // Oslash - if ('h' == current) { - match = "\u00D8"; - matchLength = consumedCount; - state = 2121; - return true; - } - break; - case 2121: - // Oslash; - if (';' == current) { - match = "\u00D8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2122: - if ('i' == current) { - state = 2123; - return true; - } - break; - case 2123: - if ('l' == current) { - state = 2124; - return true; - } - else if ('m' == current) { - state = 2127; - return true; - } - break; - case 2124: - if ('d' == current) { - state = 2125; - return true; - } - break; - case 2125: - // Otilde - if ('e' == current) { - match = "\u00D5"; - matchLength = consumedCount; - state = 2126; - return true; - } - break; - case 2126: - // Otilde; - if (';' == current) { - match = "\u00D5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2127: - if ('e' == current) { - state = 2128; - return true; - } - break; - case 2128: - if ('s' == current) { - state = 2129; - return true; - } - break; - case 2129: - // Otimes; - if (';' == current) { - match = "\u2A37"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2130: - if ('m' == current) { - state = 2131; - return true; - } - break; - case 2131: - // Ouml - if ('l' == current) { - match = "\u00D6"; - matchLength = consumedCount; - state = 2132; - return true; - } - break; - case 2132: - // Ouml; - if (';' == current) { - match = "\u00D6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2133: - if ('e' == current) { - state = 2134; - return true; - } - break; - case 2134: - if ('r' == current) { - state = 2135; - return true; - } - break; - case 2135: - if ('B' == current) { - state = 2136; - return true; - } - else if ('P' == current) { - state = 2146; - return true; - } - break; - case 2136: - if ('a' == current) { - state = 2137; - return true; - } - else if ('r' == current) { - state = 2139; - return true; - } - break; - case 2137: - if ('r' == current) { - state = 2138; - return true; - } - break; - case 2138: - // OverBar; - if (';' == current) { - match = "\u203E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2139: - if ('a' == current) { - state = 2140; - return true; - } - break; - case 2140: - if ('c' == current) { - state = 2141; - return true; - } - break; - case 2141: - if ('e' == current) { - state = 2142; - return true; - } - else if ('k' == current) { - state = 2143; - return true; - } - break; - case 2142: - // OverBrace; - if (';' == current) { - match = "\u23DE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2143: - if ('e' == current) { - state = 2144; - return true; - } - break; - case 2144: - if ('t' == current) { - state = 2145; - return true; - } - break; - case 2145: - // OverBracket; - if (';' == current) { - match = "\u23B4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2146: - if ('a' == current) { - state = 2147; - return true; - } - break; - case 2147: - if ('r' == current) { - state = 2148; - return true; - } - break; - case 2148: - if ('e' == current) { - state = 2149; - return true; - } - break; - case 2149: - if ('n' == current) { - state = 2150; - return true; - } - break; - case 2150: - if ('t' == current) { - state = 2151; - return true; - } - break; - case 2151: - if ('h' == current) { - state = 2152; - return true; - } - break; - case 2152: - if ('e' == current) { - state = 2153; - return true; - } - break; - case 2153: - if ('s' == current) { - state = 2154; - return true; - } - break; - case 2154: - if ('i' == current) { - state = 2155; - return true; - } - break; - case 2155: - if ('s' == current) { - state = 2156; - return true; - } - break; - case 2156: - // OverParenthesis; - if (';' == current) { - match = "\u23DC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2157: - switch (current) { - case 'a': - state = 2158; - return true; - case 'c': - state = 2165; - return true; - case 'f': - state = 2167; - return true; - case 'h': - state = 2169; - return true; - case 'i': - state = 2171; - return true; - case 'l': - state = 2172; - return true; - case 'o': - state = 2180; - return true; - case 'r': - state = 2194; - return true; - case 's': - state = 2238; - return true; - } - break; - case 2158: - if ('r' == current) { - state = 2159; - return true; - } - break; - case 2159: - if ('t' == current) { - state = 2160; - return true; - } - break; - case 2160: - if ('i' == current) { - state = 2161; - return true; - } - break; - case 2161: - if ('a' == current) { - state = 2162; - return true; - } - break; - case 2162: - if ('l' == current) { - state = 2163; - return true; - } - break; - case 2163: - if ('D' == current) { - state = 2164; - return true; - } - break; - case 2164: - // PartialD; - if (';' == current) { - match = "\u2202"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2165: - if ('y' == current) { - state = 2166; - return true; - } - break; - case 2166: - // Pcy; - if (';' == current) { - match = "\u041F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2167: - if ('r' == current) { - state = 2168; - return true; - } - break; - case 2168: - // Pfr; - if (';' == current) { - match = "\uD835\uDD13"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2169: - if ('i' == current) { - state = 2170; - return true; - } - break; - case 2170: - // Phi; - if (';' == current) { - match = "\u03A6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2171: - // Pi; - if (';' == current) { - match = "\u03A0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2172: - if ('u' == current) { - state = 2173; - return true; - } - break; - case 2173: - if ('s' == current) { - state = 2174; - return true; - } - break; - case 2174: - if ('M' == current) { - state = 2175; - return true; - } - break; - case 2175: - if ('i' == current) { - state = 2176; - return true; - } - break; - case 2176: - if ('n' == current) { - state = 2177; - return true; - } - break; - case 2177: - if ('u' == current) { - state = 2178; - return true; - } - break; - case 2178: - if ('s' == current) { - state = 2179; - return true; - } - break; - case 2179: - // PlusMinus; - if (';' == current) { - match = "\u00B1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2180: - if ('i' == current) { - state = 2181; - return true; - } - else if ('p' == current) { - state = 2192; - return true; - } - break; - case 2181: - if ('n' == current) { - state = 2182; - return true; - } - break; - case 2182: - if ('c' == current) { - state = 2183; - return true; - } - break; - case 2183: - if ('a' == current) { - state = 2184; - return true; - } - break; - case 2184: - if ('r' == current) { - state = 2185; - return true; - } - break; - case 2185: - if ('e' == current) { - state = 2186; - return true; - } - break; - case 2186: - if ('p' == current) { - state = 2187; - return true; - } - break; - case 2187: - if ('l' == current) { - state = 2188; - return true; - } - break; - case 2188: - if ('a' == current) { - state = 2189; - return true; - } - break; - case 2189: - if ('n' == current) { - state = 2190; - return true; - } - break; - case 2190: - if ('e' == current) { - state = 2191; - return true; - } - break; - case 2191: - // Poincareplane; - if (';' == current) { - match = "\u210C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2192: - if ('f' == current) { - state = 2193; - return true; - } - break; - case 2193: - // Popf; - if (';' == current) { - match = "\u2119"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2194: - switch (current) { - case ';': // Pr; - match = "\u2ABB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 2195; - return true; - case 'i': - state = 2221; - return true; - case 'o': - state = 2224; - return true; - } - break; - case 2195: - if ('c' == current) { - state = 2196; - return true; - } - break; - case 2196: - if ('e' == current) { - state = 2197; - return true; - } - break; - case 2197: - if ('d' == current) { - state = 2198; - return true; - } - break; - case 2198: - if ('e' == current) { - state = 2199; - return true; - } - break; - case 2199: - if ('s' == current) { - state = 2200; - return true; - } - break; - case 2200: - switch (current) { - case ';': // Precedes; - match = "\u227A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 2201; - return true; - case 'S': - state = 2206; - return true; - case 'T': - state = 2216; - return true; - } - break; - case 2201: - if ('q' == current) { - state = 2202; - return true; - } - break; - case 2202: - if ('u' == current) { - state = 2203; - return true; - } - break; - case 2203: - if ('a' == current) { - state = 2204; - return true; - } - break; - case 2204: - if ('l' == current) { - state = 2205; - return true; - } - break; - case 2205: - // PrecedesEqual; - if (';' == current) { - match = "\u2AAF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2206: - if ('l' == current) { - state = 2207; - return true; - } - break; - case 2207: - if ('a' == current) { - state = 2208; - return true; - } - break; - case 2208: - if ('n' == current) { - state = 2209; - return true; - } - break; - case 2209: - if ('t' == current) { - state = 2210; - return true; - } - break; - case 2210: - if ('E' == current) { - state = 2211; - return true; - } - break; - case 2211: - if ('q' == current) { - state = 2212; - return true; - } - break; - case 2212: - if ('u' == current) { - state = 2213; - return true; - } - break; - case 2213: - if ('a' == current) { - state = 2214; - return true; - } - break; - case 2214: - if ('l' == current) { - state = 2215; - return true; - } - break; - case 2215: - // PrecedesSlantEqual; - if (';' == current) { - match = "\u227C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2216: - if ('i' == current) { - state = 2217; - return true; - } - break; - case 2217: - if ('l' == current) { - state = 2218; - return true; - } - break; - case 2218: - if ('d' == current) { - state = 2219; - return true; - } - break; - case 2219: - if ('e' == current) { - state = 2220; - return true; - } - break; - case 2220: - // PrecedesTilde; - if (';' == current) { - match = "\u227E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2221: - if ('m' == current) { - state = 2222; - return true; - } - break; - case 2222: - if ('e' == current) { - state = 2223; - return true; - } - break; - case 2223: - // Prime; - if (';' == current) { - match = "\u2033"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2224: - if ('d' == current) { - state = 2225; - return true; - } - else if ('p' == current) { - state = 2229; - return true; - } - break; - case 2225: - if ('u' == current) { - state = 2226; - return true; - } - break; - case 2226: - if ('c' == current) { - state = 2227; - return true; - } - break; - case 2227: - if ('t' == current) { - state = 2228; - return true; - } - break; - case 2228: - // Product; - if (';' == current) { - match = "\u220F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2229: - if ('o' == current) { - state = 2230; - return true; - } - break; - case 2230: - if ('r' == current) { - state = 2231; - return true; - } - break; - case 2231: - if ('t' == current) { - state = 2232; - return true; - } - break; - case 2232: - if ('i' == current) { - state = 2233; - return true; - } - break; - case 2233: - if ('o' == current) { - state = 2234; - return true; - } - break; - case 2234: - if ('n' == current) { - state = 2235; - return true; - } - break; - case 2235: - // Proportion; - if (';' == current) { - match = "\u2237"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('a' == current) { - state = 2236; - return true; - } - break; - case 2236: - if ('l' == current) { - state = 2237; - return true; - } - break; - case 2237: - // Proportional; - if (';' == current) { - match = "\u221D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2238: - if ('c' == current) { - state = 2239; - return true; - } - else if ('i' == current) { - state = 2241; - return true; - } - break; - case 2239: - if ('r' == current) { - state = 2240; - return true; - } - break; - case 2240: - // Pscr; - if (';' == current) { - match = "\uD835\uDCAB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2241: - // Psi; - if (';' == current) { - match = "\u03A8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2242: - switch (current) { - case 'U': - state = 2243; - return true; - case 'f': - state = 2246; - return true; - case 'o': - state = 2248; - return true; - case 's': - state = 2251; - return true; - } - break; - case 2243: - if ('O' == current) { - state = 2244; - return true; - } - break; - case 2244: - // QUOT - if ('T' == current) { - match = "\""; - matchLength = consumedCount; - state = 2245; - return true; - } - break; - case 2245: - // QUOT; - if (';' == current) { - match = "\""; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2246: - if ('r' == current) { - state = 2247; - return true; - } - break; - case 2247: - // Qfr; - if (';' == current) { - match = "\uD835\uDD14"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2248: - if ('p' == current) { - state = 2249; - return true; - } - break; - case 2249: - if ('f' == current) { - state = 2250; - return true; - } - break; - case 2250: - // Qopf; - if (';' == current) { - match = "\u211A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2251: - if ('c' == current) { - state = 2252; - return true; - } - break; - case 2252: - if ('r' == current) { - state = 2253; - return true; - } - break; - case 2253: - // Qscr; - if (';' == current) { - match = "\uD835\uDCAC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2254: - switch (current) { - case 'B': - state = 2255; - return true; - case 'E': - state = 2259; - return true; - case 'a': - state = 2261; - return true; - case 'c': - state = 2272; - return true; - case 'e': - state = 2282; - return true; - case 'f': - state = 2318; - return true; - case 'h': - state = 2320; - return true; - case 'i': - state = 2322; - return true; - case 'o': - state = 2472; - return true; - case 'r': - state = 2485; - return true; - case 's': - state = 2495; - return true; - case 'u': - state = 2499; - return true; - } - break; - case 2255: - if ('a' == current) { - state = 2256; - return true; - } - break; - case 2256: - if ('r' == current) { - state = 2257; - return true; - } - break; - case 2257: - if ('r' == current) { - state = 2258; - return true; - } - break; - case 2258: - // RBarr; - if (';' == current) { - match = "\u2910"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2259: - // REG - if ('G' == current) { - match = "\u00AE"; - matchLength = consumedCount; - state = 2260; - return true; - } - break; - case 2260: - // REG; - if (';' == current) { - match = "\u00AE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2261: - switch (current) { - case 'c': - state = 2262; - return true; - case 'n': - state = 2266; - return true; - case 'r': - state = 2268; - return true; - } - break; - case 2262: - if ('u' == current) { - state = 2263; - return true; - } - break; - case 2263: - if ('t' == current) { - state = 2264; - return true; - } - break; - case 2264: - if ('e' == current) { - state = 2265; - return true; - } - break; - case 2265: - // Racute; - if (';' == current) { - match = "\u0154"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2266: - if ('g' == current) { - state = 2267; - return true; - } - break; - case 2267: - // Rang; - if (';' == current) { - match = "\u27EB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2268: - if ('r' == current) { - state = 2269; - return true; - } - break; - case 2269: - // Rarr; - if (';' == current) { - match = "\u21A0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('t' == current) { - state = 2270; - return true; - } - break; - case 2270: - if ('l' == current) { - state = 2271; - return true; - } - break; - case 2271: - // Rarrtl; - if (';' == current) { - match = "\u2916"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2272: - switch (current) { - case 'a': - state = 2273; - return true; - case 'e': - state = 2277; - return true; - case 'y': - state = 2281; - return true; - } - break; - case 2273: - if ('r' == current) { - state = 2274; - return true; - } - break; - case 2274: - if ('o' == current) { - state = 2275; - return true; - } - break; - case 2275: - if ('n' == current) { - state = 2276; - return true; - } - break; - case 2276: - // Rcaron; - if (';' == current) { - match = "\u0158"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2277: - if ('d' == current) { - state = 2278; - return true; - } - break; - case 2278: - if ('i' == current) { - state = 2279; - return true; - } - break; - case 2279: - if ('l' == current) { - state = 2280; - return true; - } - break; - case 2280: - // Rcedil; - if (';' == current) { - match = "\u0156"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2281: - // Rcy; - if (';' == current) { - match = "\u0420"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2282: - // Re; - if (';' == current) { - match = "\u211C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 2283; - return true; - } - break; - case 2283: - if ('e' == current) { - state = 2284; - return true; - } - break; - case 2284: - if ('r' == current) { - state = 2285; - return true; - } - break; - case 2285: - if ('s' == current) { - state = 2286; - return true; - } - break; - case 2286: - if ('e' == current) { - state = 2287; - return true; - } - break; - case 2287: - if ('E' == current) { - state = 2288; - return true; - } - else if ('U' == current) { - state = 2305; - return true; - } - break; - case 2288: - if ('l' == current) { - state = 2289; - return true; - } - else if ('q' == current) { - state = 2295; - return true; - } - break; - case 2289: - if ('e' == current) { - state = 2290; - return true; - } - break; - case 2290: - if ('m' == current) { - state = 2291; - return true; - } - break; - case 2291: - if ('e' == current) { - state = 2292; - return true; - } - break; - case 2292: - if ('n' == current) { - state = 2293; - return true; - } - break; - case 2293: - if ('t' == current) { - state = 2294; - return true; - } - break; - case 2294: - // ReverseElement; - if (';' == current) { - match = "\u220B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2295: - if ('u' == current) { - state = 2296; - return true; - } - break; - case 2296: - if ('i' == current) { - state = 2297; - return true; - } - break; - case 2297: - if ('l' == current) { - state = 2298; - return true; - } - break; - case 2298: - if ('i' == current) { - state = 2299; - return true; - } - break; - case 2299: - if ('b' == current) { - state = 2300; - return true; - } - break; - case 2300: - if ('r' == current) { - state = 2301; - return true; - } - break; - case 2301: - if ('i' == current) { - state = 2302; - return true; - } - break; - case 2302: - if ('u' == current) { - state = 2303; - return true; - } - break; - case 2303: - if ('m' == current) { - state = 2304; - return true; - } - break; - case 2304: - // ReverseEquilibrium; - if (';' == current) { - match = "\u21CB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2305: - if ('p' == current) { - state = 2306; - return true; - } - break; - case 2306: - if ('E' == current) { - state = 2307; - return true; - } - break; - case 2307: - if ('q' == current) { - state = 2308; - return true; - } - break; - case 2308: - if ('u' == current) { - state = 2309; - return true; - } - break; - case 2309: - if ('i' == current) { - state = 2310; - return true; - } - break; - case 2310: - if ('l' == current) { - state = 2311; - return true; - } - break; - case 2311: - if ('i' == current) { - state = 2312; - return true; - } - break; - case 2312: - if ('b' == current) { - state = 2313; - return true; - } - break; - case 2313: - if ('r' == current) { - state = 2314; - return true; - } - break; - case 2314: - if ('i' == current) { - state = 2315; - return true; - } - break; - case 2315: - if ('u' == current) { - state = 2316; - return true; - } - break; - case 2316: - if ('m' == current) { - state = 2317; - return true; - } - break; - case 2317: - // ReverseUpEquilibrium; - if (';' == current) { - match = "\u296F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2318: - if ('r' == current) { - state = 2319; - return true; - } - break; - case 2319: - // Rfr; - if (';' == current) { - match = "\u211C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2320: - if ('o' == current) { - state = 2321; - return true; - } - break; - case 2321: - // Rho; - if (';' == current) { - match = "\u03A1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2322: - if ('g' == current) { - state = 2323; - return true; - } - break; - case 2323: - if ('h' == current) { - state = 2324; - return true; - } - break; - case 2324: - if ('t' == current) { - state = 2325; - return true; - } - break; - case 2325: - switch (current) { - case 'A': - state = 2326; - return true; - case 'C': - state = 2354; - return true; - case 'D': - state = 2361; - return true; - case 'F': - state = 2394; - return true; - case 'T': - state = 2399; - return true; - case 'U': - state = 2428; - return true; - case 'V': - state = 2458; - return true; - case 'a': - state = 2467; - return true; - } - break; - case 2326: - if ('n' == current) { - state = 2327; - return true; - } - else if ('r' == current) { - state = 2338; - return true; - } - break; - case 2327: - if ('g' == current) { - state = 2328; - return true; - } - break; - case 2328: - if ('l' == current) { - state = 2329; - return true; - } - break; - case 2329: - if ('e' == current) { - state = 2330; - return true; - } - break; - case 2330: - if ('B' == current) { - state = 2331; - return true; - } - break; - case 2331: - if ('r' == current) { - state = 2332; - return true; - } - break; - case 2332: - if ('a' == current) { - state = 2333; - return true; - } - break; - case 2333: - if ('c' == current) { - state = 2334; - return true; - } - break; - case 2334: - if ('k' == current) { - state = 2335; - return true; - } - break; - case 2335: - if ('e' == current) { - state = 2336; - return true; - } - break; - case 2336: - if ('t' == current) { - state = 2337; - return true; - } - break; - case 2337: - // RightAngleBracket; - if (';' == current) { - match = "\u27E9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2338: - if ('r' == current) { - state = 2339; - return true; - } - break; - case 2339: - if ('o' == current) { - state = 2340; - return true; - } - break; - case 2340: - if ('w' == current) { - state = 2341; - return true; - } - break; - case 2341: - switch (current) { - case ';': // RightArrow; - match = "\u2192"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'B': - state = 2342; - return true; - case 'L': - state = 2345; - return true; - } - break; - case 2342: - if ('a' == current) { - state = 2343; - return true; - } - break; - case 2343: - if ('r' == current) { - state = 2344; - return true; - } - break; - case 2344: - // RightArrowBar; - if (';' == current) { - match = "\u21E5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2345: - if ('e' == current) { - state = 2346; - return true; - } - break; - case 2346: - if ('f' == current) { - state = 2347; - return true; - } - break; - case 2347: - if ('t' == current) { - state = 2348; - return true; - } - break; - case 2348: - if ('A' == current) { - state = 2349; - return true; - } - break; - case 2349: - if ('r' == current) { - state = 2350; - return true; - } - break; - case 2350: - if ('r' == current) { - state = 2351; - return true; - } - break; - case 2351: - if ('o' == current) { - state = 2352; - return true; - } - break; - case 2352: - if ('w' == current) { - state = 2353; - return true; - } - break; - case 2353: - // RightArrowLeftArrow; - if (';' == current) { - match = "\u21C4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2354: - if ('e' == current) { - state = 2355; - return true; - } - break; - case 2355: - if ('i' == current) { - state = 2356; - return true; - } - break; - case 2356: - if ('l' == current) { - state = 2357; - return true; - } - break; - case 2357: - if ('i' == current) { - state = 2358; - return true; - } - break; - case 2358: - if ('n' == current) { - state = 2359; - return true; - } - break; - case 2359: - if ('g' == current) { - state = 2360; - return true; - } - break; - case 2360: - // RightCeiling; - if (';' == current) { - match = "\u2309"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2361: - if ('o' == current) { - state = 2362; - return true; - } - break; - case 2362: - if ('u' == current) { - state = 2363; - return true; - } - else if ('w' == current) { - state = 2374; - return true; - } - break; - case 2363: - if ('b' == current) { - state = 2364; - return true; - } - break; - case 2364: - if ('l' == current) { - state = 2365; - return true; - } - break; - case 2365: - if ('e' == current) { - state = 2366; - return true; - } - break; - case 2366: - if ('B' == current) { - state = 2367; - return true; - } - break; - case 2367: - if ('r' == current) { - state = 2368; - return true; - } - break; - case 2368: - if ('a' == current) { - state = 2369; - return true; - } - break; - case 2369: - if ('c' == current) { - state = 2370; - return true; - } - break; - case 2370: - if ('k' == current) { - state = 2371; - return true; - } - break; - case 2371: - if ('e' == current) { - state = 2372; - return true; - } - break; - case 2372: - if ('t' == current) { - state = 2373; - return true; - } - break; - case 2373: - // RightDoubleBracket; - if (';' == current) { - match = "\u27E7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2374: - if ('n' == current) { - state = 2375; - return true; - } - break; - case 2375: - if ('T' == current) { - state = 2376; - return true; - } - else if ('V' == current) { - state = 2385; - return true; - } - break; - case 2376: - if ('e' == current) { - state = 2377; - return true; - } - break; - case 2377: - if ('e' == current) { - state = 2378; - return true; - } - break; - case 2378: - if ('V' == current) { - state = 2379; - return true; - } - break; - case 2379: - if ('e' == current) { - state = 2380; - return true; - } - break; - case 2380: - if ('c' == current) { - state = 2381; - return true; - } - break; - case 2381: - if ('t' == current) { - state = 2382; - return true; - } - break; - case 2382: - if ('o' == current) { - state = 2383; - return true; - } - break; - case 2383: - if ('r' == current) { - state = 2384; - return true; - } - break; - case 2384: - // RightDownTeeVector; - if (';' == current) { - match = "\u295D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2385: - if ('e' == current) { - state = 2386; - return true; - } - break; - case 2386: - if ('c' == current) { - state = 2387; - return true; - } - break; - case 2387: - if ('t' == current) { - state = 2388; - return true; - } - break; - case 2388: - if ('o' == current) { - state = 2389; - return true; - } - break; - case 2389: - if ('r' == current) { - state = 2390; - return true; - } - break; - case 2390: - // RightDownVector; - if (';' == current) { - match = "\u21C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('B' == current) { - state = 2391; - return true; - } - break; - case 2391: - if ('a' == current) { - state = 2392; - return true; - } - break; - case 2392: - if ('r' == current) { - state = 2393; - return true; - } - break; - case 2393: - // RightDownVectorBar; - if (';' == current) { - match = "\u2955"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2394: - if ('l' == current) { - state = 2395; - return true; - } - break; - case 2395: - if ('o' == current) { - state = 2396; - return true; - } - break; - case 2396: - if ('o' == current) { - state = 2397; - return true; - } - break; - case 2397: - if ('r' == current) { - state = 2398; - return true; - } - break; - case 2398: - // RightFloor; - if (';' == current) { - match = "\u230B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2399: - if ('e' == current) { - state = 2400; - return true; - } - else if ('r' == current) { - state = 2413; - return true; - } - break; - case 2400: - if ('e' == current) { - state = 2401; - return true; - } - break; - case 2401: - switch (current) { - case ';': // RightTee; - match = "\u22A2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'A': - state = 2402; - return true; - case 'V': - state = 2407; - return true; - } - break; - case 2402: - if ('r' == current) { - state = 2403; - return true; - } - break; - case 2403: - if ('r' == current) { - state = 2404; - return true; - } - break; - case 2404: - if ('o' == current) { - state = 2405; - return true; - } - break; - case 2405: - if ('w' == current) { - state = 2406; - return true; - } - break; - case 2406: - // RightTeeArrow; - if (';' == current) { - match = "\u21A6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2407: - if ('e' == current) { - state = 2408; - return true; - } - break; - case 2408: - if ('c' == current) { - state = 2409; - return true; - } - break; - case 2409: - if ('t' == current) { - state = 2410; - return true; - } - break; - case 2410: - if ('o' == current) { - state = 2411; - return true; - } - break; - case 2411: - if ('r' == current) { - state = 2412; - return true; - } - break; - case 2412: - // RightTeeVector; - if (';' == current) { - match = "\u295B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2413: - if ('i' == current) { - state = 2414; - return true; - } - break; - case 2414: - if ('a' == current) { - state = 2415; - return true; - } - break; - case 2415: - if ('n' == current) { - state = 2416; - return true; - } - break; - case 2416: - if ('g' == current) { - state = 2417; - return true; - } - break; - case 2417: - if ('l' == current) { - state = 2418; - return true; - } - break; - case 2418: - if ('e' == current) { - state = 2419; - return true; - } - break; - case 2419: - switch (current) { - case ';': // RightTriangle; - match = "\u22B3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'B': - state = 2420; - return true; - case 'E': - state = 2423; - return true; - } - break; - case 2420: - if ('a' == current) { - state = 2421; - return true; - } - break; - case 2421: - if ('r' == current) { - state = 2422; - return true; - } - break; - case 2422: - // RightTriangleBar; - if (';' == current) { - match = "\u29D0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2423: - if ('q' == current) { - state = 2424; - return true; - } - break; - case 2424: - if ('u' == current) { - state = 2425; - return true; - } - break; - case 2425: - if ('a' == current) { - state = 2426; - return true; - } - break; - case 2426: - if ('l' == current) { - state = 2427; - return true; - } - break; - case 2427: - // RightTriangleEqual; - if (';' == current) { - match = "\u22B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2428: - if ('p' == current) { - state = 2429; - return true; - } - break; - case 2429: - switch (current) { - case 'D': - state = 2430; - return true; - case 'T': - state = 2440; - return true; - case 'V': - state = 2449; - return true; - } - break; - case 2430: - if ('o' == current) { - state = 2431; - return true; - } - break; - case 2431: - if ('w' == current) { - state = 2432; - return true; - } - break; - case 2432: - if ('n' == current) { - state = 2433; - return true; - } - break; - case 2433: - if ('V' == current) { - state = 2434; - return true; - } - break; - case 2434: - if ('e' == current) { - state = 2435; - return true; - } - break; - case 2435: - if ('c' == current) { - state = 2436; - return true; - } - break; - case 2436: - if ('t' == current) { - state = 2437; - return true; - } - break; - case 2437: - if ('o' == current) { - state = 2438; - return true; - } - break; - case 2438: - if ('r' == current) { - state = 2439; - return true; - } - break; - case 2439: - // RightUpDownVector; - if (';' == current) { - match = "\u294F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2440: - if ('e' == current) { - state = 2441; - return true; - } - break; - case 2441: - if ('e' == current) { - state = 2442; - return true; - } - break; - case 2442: - if ('V' == current) { - state = 2443; - return true; - } - break; - case 2443: - if ('e' == current) { - state = 2444; - return true; - } - break; - case 2444: - if ('c' == current) { - state = 2445; - return true; - } - break; - case 2445: - if ('t' == current) { - state = 2446; - return true; - } - break; - case 2446: - if ('o' == current) { - state = 2447; - return true; - } - break; - case 2447: - if ('r' == current) { - state = 2448; - return true; - } - break; - case 2448: - // RightUpTeeVector; - if (';' == current) { - match = "\u295C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2449: - if ('e' == current) { - state = 2450; - return true; - } - break; - case 2450: - if ('c' == current) { - state = 2451; - return true; - } - break; - case 2451: - if ('t' == current) { - state = 2452; - return true; - } - break; - case 2452: - if ('o' == current) { - state = 2453; - return true; - } - break; - case 2453: - if ('r' == current) { - state = 2454; - return true; - } - break; - case 2454: - // RightUpVector; - if (';' == current) { - match = "\u21BE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('B' == current) { - state = 2455; - return true; - } - break; - case 2455: - if ('a' == current) { - state = 2456; - return true; - } - break; - case 2456: - if ('r' == current) { - state = 2457; - return true; - } - break; - case 2457: - // RightUpVectorBar; - if (';' == current) { - match = "\u2954"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2458: - if ('e' == current) { - state = 2459; - return true; - } - break; - case 2459: - if ('c' == current) { - state = 2460; - return true; - } - break; - case 2460: - if ('t' == current) { - state = 2461; - return true; - } - break; - case 2461: - if ('o' == current) { - state = 2462; - return true; - } - break; - case 2462: - if ('r' == current) { - state = 2463; - return true; - } - break; - case 2463: - // RightVector; - if (';' == current) { - match = "\u21C0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('B' == current) { - state = 2464; - return true; - } - break; - case 2464: - if ('a' == current) { - state = 2465; - return true; - } - break; - case 2465: - if ('r' == current) { - state = 2466; - return true; - } - break; - case 2466: - // RightVectorBar; - if (';' == current) { - match = "\u2953"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2467: - if ('r' == current) { - state = 2468; - return true; - } - break; - case 2468: - if ('r' == current) { - state = 2469; - return true; - } - break; - case 2469: - if ('o' == current) { - state = 2470; - return true; - } - break; - case 2470: - if ('w' == current) { - state = 2471; - return true; - } - break; - case 2471: - // Rightarrow; - if (';' == current) { - match = "\u21D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2472: - if ('p' == current) { - state = 2473; - return true; - } - else if ('u' == current) { - state = 2475; - return true; - } - break; - case 2473: - if ('f' == current) { - state = 2474; - return true; - } - break; - case 2474: - // Ropf; - if (';' == current) { - match = "\u211D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2475: - if ('n' == current) { - state = 2476; - return true; - } - break; - case 2476: - if ('d' == current) { - state = 2477; - return true; - } - break; - case 2477: - if ('I' == current) { - state = 2478; - return true; - } - break; - case 2478: - if ('m' == current) { - state = 2479; - return true; - } - break; - case 2479: - if ('p' == current) { - state = 2480; - return true; - } - break; - case 2480: - if ('l' == current) { - state = 2481; - return true; - } - break; - case 2481: - if ('i' == current) { - state = 2482; - return true; - } - break; - case 2482: - if ('e' == current) { - state = 2483; - return true; - } - break; - case 2483: - if ('s' == current) { - state = 2484; - return true; - } - break; - case 2484: - // RoundImplies; - if (';' == current) { - match = "\u2970"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2485: - if ('i' == current) { - state = 2486; - return true; - } - break; - case 2486: - if ('g' == current) { - state = 2487; - return true; - } - break; - case 2487: - if ('h' == current) { - state = 2488; - return true; - } - break; - case 2488: - if ('t' == current) { - state = 2489; - return true; - } - break; - case 2489: - if ('a' == current) { - state = 2490; - return true; - } - break; - case 2490: - if ('r' == current) { - state = 2491; - return true; - } - break; - case 2491: - if ('r' == current) { - state = 2492; - return true; - } - break; - case 2492: - if ('o' == current) { - state = 2493; - return true; - } - break; - case 2493: - if ('w' == current) { - state = 2494; - return true; - } - break; - case 2494: - // Rrightarrow; - if (';' == current) { - match = "\u21DB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2495: - if ('c' == current) { - state = 2496; - return true; - } - else if ('h' == current) { - state = 2498; - return true; - } - break; - case 2496: - if ('r' == current) { - state = 2497; - return true; - } - break; - case 2497: - // Rscr; - if (';' == current) { - match = "\u211B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2498: - // Rsh; - if (';' == current) { - match = "\u21B1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2499: - if ('l' == current) { - state = 2500; - return true; - } - break; - case 2500: - if ('e' == current) { - state = 2501; - return true; - } - break; - case 2501: - if ('D' == current) { - state = 2502; - return true; - } - break; - case 2502: - if ('e' == current) { - state = 2503; - return true; - } - break; - case 2503: - if ('l' == current) { - state = 2504; - return true; - } - break; - case 2504: - if ('a' == current) { - state = 2505; - return true; - } - break; - case 2505: - if ('y' == current) { - state = 2506; - return true; - } - break; - case 2506: - if ('e' == current) { - state = 2507; - return true; - } - break; - case 2507: - if ('d' == current) { - state = 2508; - return true; - } - break; - case 2508: - // RuleDelayed; - if (';' == current) { - match = "\u29F4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2509: - switch (current) { - case 'H': - state = 2510; - return true; - case 'O': - state = 2517; - return true; - case 'a': - state = 2522; - return true; - case 'c': - state = 2527; - return true; - case 'f': - state = 2540; - return true; - case 'h': - state = 2542; - return true; - case 'i': - state = 2581; - return true; - case 'm': - state = 2585; - return true; - case 'o': - state = 2595; - return true; - case 'q': - state = 2598; - return true; - case 's': - state = 2644; - return true; - case 't': - state = 2647; - return true; - case 'u': - state = 2650; - return true; - } - break; - case 2510: - if ('C' == current) { - state = 2511; - return true; - } - else if ('c' == current) { - state = 2515; - return true; - } - break; - case 2511: - if ('H' == current) { - state = 2512; - return true; - } - break; - case 2512: - if ('c' == current) { - state = 2513; - return true; - } - break; - case 2513: - if ('y' == current) { - state = 2514; - return true; - } - break; - case 2514: - // SHCHcy; - if (';' == current) { - match = "\u0429"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2515: - if ('y' == current) { - state = 2516; - return true; - } - break; - case 2516: - // SHcy; - if (';' == current) { - match = "\u0428"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2517: - if ('F' == current) { - state = 2518; - return true; - } - break; - case 2518: - if ('T' == current) { - state = 2519; - return true; - } - break; - case 2519: - if ('c' == current) { - state = 2520; - return true; - } - break; - case 2520: - if ('y' == current) { - state = 2521; - return true; - } - break; - case 2521: - // SOFTcy; - if (';' == current) { - match = "\u042C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2522: - if ('c' == current) { - state = 2523; - return true; - } - break; - case 2523: - if ('u' == current) { - state = 2524; - return true; - } - break; - case 2524: - if ('t' == current) { - state = 2525; - return true; - } - break; - case 2525: - if ('e' == current) { - state = 2526; - return true; - } - break; - case 2526: - // Sacute; - if (';' == current) { - match = "\u015A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2527: - switch (current) { - case ';': // Sc; - match = "\u2ABC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 2528; - return true; - case 'e': - state = 2532; - return true; - case 'i': - state = 2536; - return true; - case 'y': - state = 2539; - return true; - } - break; - case 2528: - if ('r' == current) { - state = 2529; - return true; - } - break; - case 2529: - if ('o' == current) { - state = 2530; - return true; - } - break; - case 2530: - if ('n' == current) { - state = 2531; - return true; - } - break; - case 2531: - // Scaron; - if (';' == current) { - match = "\u0160"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2532: - if ('d' == current) { - state = 2533; - return true; - } - break; - case 2533: - if ('i' == current) { - state = 2534; - return true; - } - break; - case 2534: - if ('l' == current) { - state = 2535; - return true; - } - break; - case 2535: - // Scedil; - if (';' == current) { - match = "\u015E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2536: - if ('r' == current) { - state = 2537; - return true; - } - break; - case 2537: - if ('c' == current) { - state = 2538; - return true; - } - break; - case 2538: - // Scirc; - if (';' == current) { - match = "\u015C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2539: - // Scy; - if (';' == current) { - match = "\u0421"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2540: - if ('r' == current) { - state = 2541; - return true; - } - break; - case 2541: - // Sfr; - if (';' == current) { - match = "\uD835\uDD16"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2542: - if ('o' == current) { - state = 2543; - return true; - } - break; - case 2543: - if ('r' == current) { - state = 2544; - return true; - } - break; - case 2544: - if ('t' == current) { - state = 2545; - return true; - } - break; - case 2545: - switch (current) { - case 'D': - state = 2546; - return true; - case 'L': - state = 2555; - return true; - case 'R': - state = 2564; - return true; - case 'U': - state = 2574; - return true; - } - break; - case 2546: - if ('o' == current) { - state = 2547; - return true; - } - break; - case 2547: - if ('w' == current) { - state = 2548; - return true; - } - break; - case 2548: - if ('n' == current) { - state = 2549; - return true; - } - break; - case 2549: - if ('A' == current) { - state = 2550; - return true; - } - break; - case 2550: - if ('r' == current) { - state = 2551; - return true; - } - break; - case 2551: - if ('r' == current) { - state = 2552; - return true; - } - break; - case 2552: - if ('o' == current) { - state = 2553; - return true; - } - break; - case 2553: - if ('w' == current) { - state = 2554; - return true; - } - break; - case 2554: - // ShortDownArrow; - if (';' == current) { - match = "\u2193"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2555: - if ('e' == current) { - state = 2556; - return true; - } - break; - case 2556: - if ('f' == current) { - state = 2557; - return true; - } - break; - case 2557: - if ('t' == current) { - state = 2558; - return true; - } - break; - case 2558: - if ('A' == current) { - state = 2559; - return true; - } - break; - case 2559: - if ('r' == current) { - state = 2560; - return true; - } - break; - case 2560: - if ('r' == current) { - state = 2561; - return true; - } - break; - case 2561: - if ('o' == current) { - state = 2562; - return true; - } - break; - case 2562: - if ('w' == current) { - state = 2563; - return true; - } - break; - case 2563: - // ShortLeftArrow; - if (';' == current) { - match = "\u2190"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2564: - if ('i' == current) { - state = 2565; - return true; - } - break; - case 2565: - if ('g' == current) { - state = 2566; - return true; - } - break; - case 2566: - if ('h' == current) { - state = 2567; - return true; - } - break; - case 2567: - if ('t' == current) { - state = 2568; - return true; - } - break; - case 2568: - if ('A' == current) { - state = 2569; - return true; - } - break; - case 2569: - if ('r' == current) { - state = 2570; - return true; - } - break; - case 2570: - if ('r' == current) { - state = 2571; - return true; - } - break; - case 2571: - if ('o' == current) { - state = 2572; - return true; - } - break; - case 2572: - if ('w' == current) { - state = 2573; - return true; - } - break; - case 2573: - // ShortRightArrow; - if (';' == current) { - match = "\u2192"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2574: - if ('p' == current) { - state = 2575; - return true; - } - break; - case 2575: - if ('A' == current) { - state = 2576; - return true; - } - break; - case 2576: - if ('r' == current) { - state = 2577; - return true; - } - break; - case 2577: - if ('r' == current) { - state = 2578; - return true; - } - break; - case 2578: - if ('o' == current) { - state = 2579; - return true; - } - break; - case 2579: - if ('w' == current) { - state = 2580; - return true; - } - break; - case 2580: - // ShortUpArrow; - if (';' == current) { - match = "\u2191"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2581: - if ('g' == current) { - state = 2582; - return true; - } - break; - case 2582: - if ('m' == current) { - state = 2583; - return true; - } - break; - case 2583: - if ('a' == current) { - state = 2584; - return true; - } - break; - case 2584: - // Sigma; - if (';' == current) { - match = "\u03A3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2585: - if ('a' == current) { - state = 2586; - return true; - } - break; - case 2586: - if ('l' == current) { - state = 2587; - return true; - } - break; - case 2587: - if ('l' == current) { - state = 2588; - return true; - } - break; - case 2588: - if ('C' == current) { - state = 2589; - return true; - } - break; - case 2589: - if ('i' == current) { - state = 2590; - return true; - } - break; - case 2590: - if ('r' == current) { - state = 2591; - return true; - } - break; - case 2591: - if ('c' == current) { - state = 2592; - return true; - } - break; - case 2592: - if ('l' == current) { - state = 2593; - return true; - } - break; - case 2593: - if ('e' == current) { - state = 2594; - return true; - } - break; - case 2594: - // SmallCircle; - if (';' == current) { - match = "\u2218"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2595: - if ('p' == current) { - state = 2596; - return true; - } - break; - case 2596: - if ('f' == current) { - state = 2597; - return true; - } - break; - case 2597: - // Sopf; - if (';' == current) { - match = "\uD835\uDD4A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2598: - if ('r' == current) { - state = 2599; - return true; - } - else if ('u' == current) { - state = 2601; - return true; - } - break; - case 2599: - if ('t' == current) { - state = 2600; - return true; - } - break; - case 2600: - // Sqrt; - if (';' == current) { - match = "\u221A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2601: - if ('a' == current) { - state = 2602; - return true; - } - break; - case 2602: - if ('r' == current) { - state = 2603; - return true; - } - break; - case 2603: - if ('e' == current) { - state = 2604; - return true; - } - break; - case 2604: - switch (current) { - case ';': // Square; - match = "\u25A1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'I': - state = 2605; - return true; - case 'S': - state = 2617; - return true; - case 'U': - state = 2639; - return true; - } - break; - case 2605: - if ('n' == current) { - state = 2606; - return true; - } - break; - case 2606: - if ('t' == current) { - state = 2607; - return true; - } - break; - case 2607: - if ('e' == current) { - state = 2608; - return true; - } - break; - case 2608: - if ('r' == current) { - state = 2609; - return true; - } - break; - case 2609: - if ('s' == current) { - state = 2610; - return true; - } - break; - case 2610: - if ('e' == current) { - state = 2611; - return true; - } - break; - case 2611: - if ('c' == current) { - state = 2612; - return true; - } - break; - case 2612: - if ('t' == current) { - state = 2613; - return true; - } - break; - case 2613: - if ('i' == current) { - state = 2614; - return true; - } - break; - case 2614: - if ('o' == current) { - state = 2615; - return true; - } - break; - case 2615: - if ('n' == current) { - state = 2616; - return true; - } - break; - case 2616: - // SquareIntersection; - if (';' == current) { - match = "\u2293"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2617: - if ('u' == current) { - state = 2618; - return true; - } - break; - case 2618: - if ('b' == current) { - state = 2619; - return true; - } - else if ('p' == current) { - state = 2628; - return true; - } - break; - case 2619: - if ('s' == current) { - state = 2620; - return true; - } - break; - case 2620: - if ('e' == current) { - state = 2621; - return true; - } - break; - case 2621: - if ('t' == current) { - state = 2622; - return true; - } - break; - case 2622: - // SquareSubset; - if (';' == current) { - match = "\u228F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('E' == current) { - state = 2623; - return true; - } - break; - case 2623: - if ('q' == current) { - state = 2624; - return true; - } - break; - case 2624: - if ('u' == current) { - state = 2625; - return true; - } - break; - case 2625: - if ('a' == current) { - state = 2626; - return true; - } - break; - case 2626: - if ('l' == current) { - state = 2627; - return true; - } - break; - case 2627: - // SquareSubsetEqual; - if (';' == current) { - match = "\u2291"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2628: - if ('e' == current) { - state = 2629; - return true; - } - break; - case 2629: - if ('r' == current) { - state = 2630; - return true; - } - break; - case 2630: - if ('s' == current) { - state = 2631; - return true; - } - break; - case 2631: - if ('e' == current) { - state = 2632; - return true; - } - break; - case 2632: - if ('t' == current) { - state = 2633; - return true; - } - break; - case 2633: - // SquareSuperset; - if (';' == current) { - match = "\u2290"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('E' == current) { - state = 2634; - return true; - } - break; - case 2634: - if ('q' == current) { - state = 2635; - return true; - } - break; - case 2635: - if ('u' == current) { - state = 2636; - return true; - } - break; - case 2636: - if ('a' == current) { - state = 2637; - return true; - } - break; - case 2637: - if ('l' == current) { - state = 2638; - return true; - } - break; - case 2638: - // SquareSupersetEqual; - if (';' == current) { - match = "\u2292"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2639: - if ('n' == current) { - state = 2640; - return true; - } - break; - case 2640: - if ('i' == current) { - state = 2641; - return true; - } - break; - case 2641: - if ('o' == current) { - state = 2642; - return true; - } - break; - case 2642: - if ('n' == current) { - state = 2643; - return true; - } - break; - case 2643: - // SquareUnion; - if (';' == current) { - match = "\u2294"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2644: - if ('c' == current) { - state = 2645; - return true; - } - break; - case 2645: - if ('r' == current) { - state = 2646; - return true; - } - break; - case 2646: - // Sscr; - if (';' == current) { - match = "\uD835\uDCAE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2647: - if ('a' == current) { - state = 2648; - return true; - } - break; - case 2648: - if ('r' == current) { - state = 2649; - return true; - } - break; - case 2649: - // Star; - if (';' == current) { - match = "\u22C6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2650: - switch (current) { - case 'b': - state = 2651; - return true; - case 'c': - state = 2660; - return true; - case 'm': - state = 2691; - return true; - case 'p': - state = 2692; - return true; - } - break; - case 2651: - // Sub; - if (';' == current) { - match = "\u22D0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 2652; - return true; - } - break; - case 2652: - if ('e' == current) { - state = 2653; - return true; - } - break; - case 2653: - if ('t' == current) { - state = 2654; - return true; - } - break; - case 2654: - // Subset; - if (';' == current) { - match = "\u22D0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('E' == current) { - state = 2655; - return true; - } - break; - case 2655: - if ('q' == current) { - state = 2656; - return true; - } - break; - case 2656: - if ('u' == current) { - state = 2657; - return true; - } - break; - case 2657: - if ('a' == current) { - state = 2658; - return true; - } - break; - case 2658: - if ('l' == current) { - state = 2659; - return true; - } - break; - case 2659: - // SubsetEqual; - if (';' == current) { - match = "\u2286"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2660: - if ('c' == current) { - state = 2661; - return true; - } - else if ('h' == current) { - state = 2686; - return true; - } - break; - case 2661: - if ('e' == current) { - state = 2662; - return true; - } - break; - case 2662: - if ('e' == current) { - state = 2663; - return true; - } - break; - case 2663: - if ('d' == current) { - state = 2664; - return true; - } - break; - case 2664: - if ('s' == current) { - state = 2665; - return true; - } - break; - case 2665: - switch (current) { - case ';': // Succeeds; - match = "\u227B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 2666; - return true; - case 'S': - state = 2671; - return true; - case 'T': - state = 2681; - return true; - } - break; - case 2666: - if ('q' == current) { - state = 2667; - return true; - } - break; - case 2667: - if ('u' == current) { - state = 2668; - return true; - } - break; - case 2668: - if ('a' == current) { - state = 2669; - return true; - } - break; - case 2669: - if ('l' == current) { - state = 2670; - return true; - } - break; - case 2670: - // SucceedsEqual; - if (';' == current) { - match = "\u2AB0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2671: - if ('l' == current) { - state = 2672; - return true; - } - break; - case 2672: - if ('a' == current) { - state = 2673; - return true; - } - break; - case 2673: - if ('n' == current) { - state = 2674; - return true; - } - break; - case 2674: - if ('t' == current) { - state = 2675; - return true; - } - break; - case 2675: - if ('E' == current) { - state = 2676; - return true; - } - break; - case 2676: - if ('q' == current) { - state = 2677; - return true; - } - break; - case 2677: - if ('u' == current) { - state = 2678; - return true; - } - break; - case 2678: - if ('a' == current) { - state = 2679; - return true; - } - break; - case 2679: - if ('l' == current) { - state = 2680; - return true; - } - break; - case 2680: - // SucceedsSlantEqual; - if (';' == current) { - match = "\u227D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2681: - if ('i' == current) { - state = 2682; - return true; - } - break; - case 2682: - if ('l' == current) { - state = 2683; - return true; - } - break; - case 2683: - if ('d' == current) { - state = 2684; - return true; - } - break; - case 2684: - if ('e' == current) { - state = 2685; - return true; - } - break; - case 2685: - // SucceedsTilde; - if (';' == current) { - match = "\u227F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2686: - if ('T' == current) { - state = 2687; - return true; - } - break; - case 2687: - if ('h' == current) { - state = 2688; - return true; - } - break; - case 2688: - if ('a' == current) { - state = 2689; - return true; - } - break; - case 2689: - if ('t' == current) { - state = 2690; - return true; - } - break; - case 2690: - // SuchThat; - if (';' == current) { - match = "\u220B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2691: - // Sum; - if (';' == current) { - match = "\u2211"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2692: - switch (current) { - case ';': // Sup; - match = "\u22D1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 2693; - return true; - case 's': - state = 2703; - return true; - } - break; - case 2693: - if ('r' == current) { - state = 2694; - return true; - } - break; - case 2694: - if ('s' == current) { - state = 2695; - return true; - } - break; - case 2695: - if ('e' == current) { - state = 2696; - return true; - } - break; - case 2696: - if ('t' == current) { - state = 2697; - return true; - } - break; - case 2697: - // Superset; - if (';' == current) { - match = "\u2283"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('E' == current) { - state = 2698; - return true; - } - break; - case 2698: - if ('q' == current) { - state = 2699; - return true; - } - break; - case 2699: - if ('u' == current) { - state = 2700; - return true; - } - break; - case 2700: - if ('a' == current) { - state = 2701; - return true; - } - break; - case 2701: - if ('l' == current) { - state = 2702; - return true; - } - break; - case 2702: - // SupersetEqual; - if (';' == current) { - match = "\u2287"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2703: - if ('e' == current) { - state = 2704; - return true; - } - break; - case 2704: - if ('t' == current) { - state = 2705; - return true; - } - break; - case 2705: - // Supset; - if (';' == current) { - match = "\u22D1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2706: - switch (current) { - case 'H': - state = 2707; - return true; - case 'R': - state = 2711; - return true; - case 'S': - state = 2715; - return true; - case 'a': - state = 2721; - return true; - case 'c': - state = 2724; - return true; - case 'f': - state = 2734; - return true; - case 'h': - state = 2736; - return true; - case 'i': - state = 2760; - return true; - case 'o': - state = 2783; - return true; - case 'r': - state = 2786; - return true; - case 's': - state = 2794; - return true; - } - break; - case 2707: - if ('O' == current) { - state = 2708; - return true; - } - break; - case 2708: - if ('R' == current) { - state = 2709; - return true; - } - break; - case 2709: - // THORN - if ('N' == current) { - match = "\u00DE"; - matchLength = consumedCount; - state = 2710; - return true; - } - break; - case 2710: - // THORN; - if (';' == current) { - match = "\u00DE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2711: - if ('A' == current) { - state = 2712; - return true; - } - break; - case 2712: - if ('D' == current) { - state = 2713; - return true; - } - break; - case 2713: - if ('E' == current) { - state = 2714; - return true; - } - break; - case 2714: - // TRADE; - if (';' == current) { - match = "\u2122"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2715: - if ('H' == current) { - state = 2716; - return true; - } - else if ('c' == current) { - state = 2719; - return true; - } - break; - case 2716: - if ('c' == current) { - state = 2717; - return true; - } - break; - case 2717: - if ('y' == current) { - state = 2718; - return true; - } - break; - case 2718: - // TSHcy; - if (';' == current) { - match = "\u040B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2719: - if ('y' == current) { - state = 2720; - return true; - } - break; - case 2720: - // TScy; - if (';' == current) { - match = "\u0426"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2721: - if ('b' == current) { - state = 2722; - return true; - } - else if ('u' == current) { - state = 2723; - return true; - } - break; - case 2722: - // Tab; - if (';' == current) { - match = "\u0009"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2723: - // Tau; - if (';' == current) { - match = "\u03A4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2724: - switch (current) { - case 'a': - state = 2725; - return true; - case 'e': - state = 2729; - return true; - case 'y': - state = 2733; - return true; - } - break; - case 2725: - if ('r' == current) { - state = 2726; - return true; - } - break; - case 2726: - if ('o' == current) { - state = 2727; - return true; - } - break; - case 2727: - if ('n' == current) { - state = 2728; - return true; - } - break; - case 2728: - // Tcaron; - if (';' == current) { - match = "\u0164"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2729: - if ('d' == current) { - state = 2730; - return true; - } - break; - case 2730: - if ('i' == current) { - state = 2731; - return true; - } - break; - case 2731: - if ('l' == current) { - state = 2732; - return true; - } - break; - case 2732: - // Tcedil; - if (';' == current) { - match = "\u0162"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2733: - // Tcy; - if (';' == current) { - match = "\u0422"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2734: - if ('r' == current) { - state = 2735; - return true; - } - break; - case 2735: - // Tfr; - if (';' == current) { - match = "\uD835\uDD17"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2736: - if ('e' == current) { - state = 2737; - return true; - } - else if ('i' == current) { - state = 2746; - return true; - } - break; - case 2737: - if ('r' == current) { - state = 2738; - return true; - } - else if ('t' == current) { - state = 2744; - return true; - } - break; - case 2738: - if ('e' == current) { - state = 2739; - return true; - } - break; - case 2739: - if ('f' == current) { - state = 2740; - return true; - } - break; - case 2740: - if ('o' == current) { - state = 2741; - return true; - } - break; - case 2741: - if ('r' == current) { - state = 2742; - return true; - } - break; - case 2742: - if ('e' == current) { - state = 2743; - return true; - } - break; - case 2743: - // Therefore; - if (';' == current) { - match = "\u2234"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2744: - if ('a' == current) { - state = 2745; - return true; - } - break; - case 2745: - // Theta; - if (';' == current) { - match = "\u0398"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2746: - if ('c' == current) { - state = 2747; - return true; - } - else if ('n' == current) { - state = 2754; - return true; - } - break; - case 2747: - if ('k' == current) { - state = 2748; - return true; - } - break; - case 2748: - if ('S' == current) { - state = 2749; - return true; - } - break; - case 2749: - if ('p' == current) { - state = 2750; - return true; - } - break; - case 2750: - if ('a' == current) { - state = 2751; - return true; - } - break; - case 2751: - if ('c' == current) { - state = 2752; - return true; - } - break; - case 2752: - if ('e' == current) { - state = 2753; - return true; - } - break; - case 2753: - // ThickSpace; - if (';' == current) { - match = "\u205F\u200A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2754: - if ('S' == current) { - state = 2755; - return true; - } - break; - case 2755: - if ('p' == current) { - state = 2756; - return true; - } - break; - case 2756: - if ('a' == current) { - state = 2757; - return true; - } - break; - case 2757: - if ('c' == current) { - state = 2758; - return true; - } - break; - case 2758: - if ('e' == current) { - state = 2759; - return true; - } - break; - case 2759: - // ThinSpace; - if (';' == current) { - match = "\u2009"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2760: - if ('l' == current) { - state = 2761; - return true; - } - break; - case 2761: - if ('d' == current) { - state = 2762; - return true; - } - break; - case 2762: - if ('e' == current) { - state = 2763; - return true; - } - break; - case 2763: - switch (current) { - case ';': // Tilde; - match = "\u223C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 2764; - return true; - case 'F': - state = 2769; - return true; - case 'T': - state = 2778; - return true; - } - break; - case 2764: - if ('q' == current) { - state = 2765; - return true; - } - break; - case 2765: - if ('u' == current) { - state = 2766; - return true; - } - break; - case 2766: - if ('a' == current) { - state = 2767; - return true; - } - break; - case 2767: - if ('l' == current) { - state = 2768; - return true; - } - break; - case 2768: - // TildeEqual; - if (';' == current) { - match = "\u2243"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2769: - if ('u' == current) { - state = 2770; - return true; - } - break; - case 2770: - if ('l' == current) { - state = 2771; - return true; - } - break; - case 2771: - if ('l' == current) { - state = 2772; - return true; - } - break; - case 2772: - if ('E' == current) { - state = 2773; - return true; - } - break; - case 2773: - if ('q' == current) { - state = 2774; - return true; - } - break; - case 2774: - if ('u' == current) { - state = 2775; - return true; - } - break; - case 2775: - if ('a' == current) { - state = 2776; - return true; - } - break; - case 2776: - if ('l' == current) { - state = 2777; - return true; - } - break; - case 2777: - // TildeFullEqual; - if (';' == current) { - match = "\u2245"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2778: - if ('i' == current) { - state = 2779; - return true; - } - break; - case 2779: - if ('l' == current) { - state = 2780; - return true; - } - break; - case 2780: - if ('d' == current) { - state = 2781; - return true; - } - break; - case 2781: - if ('e' == current) { - state = 2782; - return true; - } - break; - case 2782: - // TildeTilde; - if (';' == current) { - match = "\u2248"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2783: - if ('p' == current) { - state = 2784; - return true; - } - break; - case 2784: - if ('f' == current) { - state = 2785; - return true; - } - break; - case 2785: - // Topf; - if (';' == current) { - match = "\uD835\uDD4B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2786: - if ('i' == current) { - state = 2787; - return true; - } - break; - case 2787: - if ('p' == current) { - state = 2788; - return true; - } - break; - case 2788: - if ('l' == current) { - state = 2789; - return true; - } - break; - case 2789: - if ('e' == current) { - state = 2790; - return true; - } - break; - case 2790: - if ('D' == current) { - state = 2791; - return true; - } - break; - case 2791: - if ('o' == current) { - state = 2792; - return true; - } - break; - case 2792: - if ('t' == current) { - state = 2793; - return true; - } - break; - case 2793: - // TripleDot; - if (';' == current) { - match = "\u20DB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2794: - if ('c' == current) { - state = 2795; - return true; - } - else if ('t' == current) { - state = 2797; - return true; - } - break; - case 2795: - if ('r' == current) { - state = 2796; - return true; - } - break; - case 2796: - // Tscr; - if (';' == current) { - match = "\uD835\uDCAF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2797: - if ('r' == current) { - state = 2798; - return true; - } - break; - case 2798: - if ('o' == current) { - state = 2799; - return true; - } - break; - case 2799: - if ('k' == current) { - state = 2800; - return true; - } - break; - case 2800: - // Tstrok; - if (';' == current) { - match = "\u0166"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2801: - switch (current) { - case 'a': - state = 2802; - return true; - case 'b': - state = 2813; - return true; - case 'c': - state = 2820; - return true; - case 'd': - state = 2825; - return true; - case 'f': - state = 2830; - return true; - case 'g': - state = 2832; - return true; - case 'm': - state = 2837; - return true; - case 'n': - state = 2841; - return true; - case 'o': - state = 2873; - return true; - case 'p': - state = 2879; - return true; - case 'r': - state = 2966; - return true; - case 's': - state = 2970; - return true; - case 't': - state = 2973; - return true; - case 'u': - state = 2978; - return true; - } - break; - case 2802: - if ('c' == current) { - state = 2803; - return true; - } - else if ('r' == current) { - state = 2807; - return true; - } - break; - case 2803: - if ('u' == current) { - state = 2804; - return true; - } - break; - case 2804: - if ('t' == current) { - state = 2805; - return true; - } - break; - case 2805: - // Uacute - if ('e' == current) { - match = "\u00DA"; - matchLength = consumedCount; - state = 2806; - return true; - } - break; - case 2806: - // Uacute; - if (';' == current) { - match = "\u00DA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2807: - if ('r' == current) { - state = 2808; - return true; - } - break; - case 2808: - // Uarr; - if (';' == current) { - match = "\u219F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 2809; - return true; - } - break; - case 2809: - if ('c' == current) { - state = 2810; - return true; - } - break; - case 2810: - if ('i' == current) { - state = 2811; - return true; - } - break; - case 2811: - if ('r' == current) { - state = 2812; - return true; - } - break; - case 2812: - // Uarrocir; - if (';' == current) { - match = "\u2949"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2813: - if ('r' == current) { - state = 2814; - return true; - } - break; - case 2814: - if ('c' == current) { - state = 2815; - return true; - } - else if ('e' == current) { - state = 2817; - return true; - } - break; - case 2815: - if ('y' == current) { - state = 2816; - return true; - } - break; - case 2816: - // Ubrcy; - if (';' == current) { - match = "\u040E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2817: - if ('v' == current) { - state = 2818; - return true; - } - break; - case 2818: - if ('e' == current) { - state = 2819; - return true; - } - break; - case 2819: - // Ubreve; - if (';' == current) { - match = "\u016C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2820: - if ('i' == current) { - state = 2821; - return true; - } - else if ('y' == current) { - state = 2824; - return true; - } - break; - case 2821: - if ('r' == current) { - state = 2822; - return true; - } - break; - case 2822: - // Ucirc - if ('c' == current) { - match = "\u00DB"; - matchLength = consumedCount; - state = 2823; - return true; - } - break; - case 2823: - // Ucirc; - if (';' == current) { - match = "\u00DB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2824: - // Ucy; - if (';' == current) { - match = "\u0423"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2825: - if ('b' == current) { - state = 2826; - return true; - } - break; - case 2826: - if ('l' == current) { - state = 2827; - return true; - } - break; - case 2827: - if ('a' == current) { - state = 2828; - return true; - } - break; - case 2828: - if ('c' == current) { - state = 2829; - return true; - } - break; - case 2829: - // Udblac; - if (';' == current) { - match = "\u0170"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2830: - if ('r' == current) { - state = 2831; - return true; - } - break; - case 2831: - // Ufr; - if (';' == current) { - match = "\uD835\uDD18"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2832: - if ('r' == current) { - state = 2833; - return true; - } - break; - case 2833: - if ('a' == current) { - state = 2834; - return true; - } - break; - case 2834: - if ('v' == current) { - state = 2835; - return true; - } - break; - case 2835: - // Ugrave - if ('e' == current) { - match = "\u00D9"; - matchLength = consumedCount; - state = 2836; - return true; - } - break; - case 2836: - // Ugrave; - if (';' == current) { - match = "\u00D9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2837: - if ('a' == current) { - state = 2838; - return true; - } - break; - case 2838: - if ('c' == current) { - state = 2839; - return true; - } - break; - case 2839: - if ('r' == current) { - state = 2840; - return true; - } - break; - case 2840: - // Umacr; - if (';' == current) { - match = "\u016A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2841: - if ('d' == current) { - state = 2842; - return true; - } - else if ('i' == current) { - state = 2866; - return true; - } - break; - case 2842: - if ('e' == current) { - state = 2843; - return true; - } - break; - case 2843: - if ('r' == current) { - state = 2844; - return true; - } - break; - case 2844: - if ('B' == current) { - state = 2845; - return true; - } - else if ('P' == current) { - state = 2855; - return true; - } - break; - case 2845: - if ('a' == current) { - state = 2846; - return true; - } - else if ('r' == current) { - state = 2848; - return true; - } - break; - case 2846: - if ('r' == current) { - state = 2847; - return true; - } - break; - case 2847: - // UnderBar; - if (';' == current) { - match = "_"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2848: - if ('a' == current) { - state = 2849; - return true; - } - break; - case 2849: - if ('c' == current) { - state = 2850; - return true; - } - break; - case 2850: - if ('e' == current) { - state = 2851; - return true; - } - else if ('k' == current) { - state = 2852; - return true; - } - break; - case 2851: - // UnderBrace; - if (';' == current) { - match = "\u23DF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2852: - if ('e' == current) { - state = 2853; - return true; - } - break; - case 2853: - if ('t' == current) { - state = 2854; - return true; - } - break; - case 2854: - // UnderBracket; - if (';' == current) { - match = "\u23B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2855: - if ('a' == current) { - state = 2856; - return true; - } - break; - case 2856: - if ('r' == current) { - state = 2857; - return true; - } - break; - case 2857: - if ('e' == current) { - state = 2858; - return true; - } - break; - case 2858: - if ('n' == current) { - state = 2859; - return true; - } - break; - case 2859: - if ('t' == current) { - state = 2860; - return true; - } - break; - case 2860: - if ('h' == current) { - state = 2861; - return true; - } - break; - case 2861: - if ('e' == current) { - state = 2862; - return true; - } - break; - case 2862: - if ('s' == current) { - state = 2863; - return true; - } - break; - case 2863: - if ('i' == current) { - state = 2864; - return true; - } - break; - case 2864: - if ('s' == current) { - state = 2865; - return true; - } - break; - case 2865: - // UnderParenthesis; - if (';' == current) { - match = "\u23DD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2866: - if ('o' == current) { - state = 2867; - return true; - } - break; - case 2867: - if ('n' == current) { - state = 2868; - return true; - } - break; - case 2868: - // Union; - if (';' == current) { - match = "\u22C3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('P' == current) { - state = 2869; - return true; - } - break; - case 2869: - if ('l' == current) { - state = 2870; - return true; - } - break; - case 2870: - if ('u' == current) { - state = 2871; - return true; - } - break; - case 2871: - if ('s' == current) { - state = 2872; - return true; - } - break; - case 2872: - // UnionPlus; - if (';' == current) { - match = "\u228E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2873: - if ('g' == current) { - state = 2874; - return true; - } - else if ('p' == current) { - state = 2877; - return true; - } - break; - case 2874: - if ('o' == current) { - state = 2875; - return true; - } - break; - case 2875: - if ('n' == current) { - state = 2876; - return true; - } - break; - case 2876: - // Uogon; - if (';' == current) { - match = "\u0172"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2877: - if ('f' == current) { - state = 2878; - return true; - } - break; - case 2878: - // Uopf; - if (';' == current) { - match = "\uD835\uDD4C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2879: - switch (current) { - case 'A': - state = 2880; - return true; - case 'D': - state = 2897; - return true; - case 'E': - state = 2906; - return true; - case 'T': - state = 2917; - return true; - case 'a': - state = 2925; - return true; - case 'd': - state = 2930; - return true; - case 'p': - state = 2939; - return true; - case 's': - state = 2961; - return true; - } - break; - case 2880: - if ('r' == current) { - state = 2881; - return true; - } - break; - case 2881: - if ('r' == current) { - state = 2882; - return true; - } - break; - case 2882: - if ('o' == current) { - state = 2883; - return true; - } - break; - case 2883: - if ('w' == current) { - state = 2884; - return true; - } - break; - case 2884: - switch (current) { - case ';': // UpArrow; - match = "\u2191"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'B': - state = 2885; - return true; - case 'D': - state = 2888; - return true; - } - break; - case 2885: - if ('a' == current) { - state = 2886; - return true; - } - break; - case 2886: - if ('r' == current) { - state = 2887; - return true; - } - break; - case 2887: - // UpArrowBar; - if (';' == current) { - match = "\u2912"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2888: - if ('o' == current) { - state = 2889; - return true; - } - break; - case 2889: - if ('w' == current) { - state = 2890; - return true; - } - break; - case 2890: - if ('n' == current) { - state = 2891; - return true; - } - break; - case 2891: - if ('A' == current) { - state = 2892; - return true; - } - break; - case 2892: - if ('r' == current) { - state = 2893; - return true; - } - break; - case 2893: - if ('r' == current) { - state = 2894; - return true; - } - break; - case 2894: - if ('o' == current) { - state = 2895; - return true; - } - break; - case 2895: - if ('w' == current) { - state = 2896; - return true; - } - break; - case 2896: - // UpArrowDownArrow; - if (';' == current) { - match = "\u21C5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2897: - if ('o' == current) { - state = 2898; - return true; - } - break; - case 2898: - if ('w' == current) { - state = 2899; - return true; - } - break; - case 2899: - if ('n' == current) { - state = 2900; - return true; - } - break; - case 2900: - if ('A' == current) { - state = 2901; - return true; - } - break; - case 2901: - if ('r' == current) { - state = 2902; - return true; - } - break; - case 2902: - if ('r' == current) { - state = 2903; - return true; - } - break; - case 2903: - if ('o' == current) { - state = 2904; - return true; - } - break; - case 2904: - if ('w' == current) { - state = 2905; - return true; - } - break; - case 2905: - // UpDownArrow; - if (';' == current) { - match = "\u2195"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2906: - if ('q' == current) { - state = 2907; - return true; - } - break; - case 2907: - if ('u' == current) { - state = 2908; - return true; - } - break; - case 2908: - if ('i' == current) { - state = 2909; - return true; - } - break; - case 2909: - if ('l' == current) { - state = 2910; - return true; - } - break; - case 2910: - if ('i' == current) { - state = 2911; - return true; - } - break; - case 2911: - if ('b' == current) { - state = 2912; - return true; - } - break; - case 2912: - if ('r' == current) { - state = 2913; - return true; - } - break; - case 2913: - if ('i' == current) { - state = 2914; - return true; - } - break; - case 2914: - if ('u' == current) { - state = 2915; - return true; - } - break; - case 2915: - if ('m' == current) { - state = 2916; - return true; - } - break; - case 2916: - // UpEquilibrium; - if (';' == current) { - match = "\u296E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2917: - if ('e' == current) { - state = 2918; - return true; - } - break; - case 2918: - if ('e' == current) { - state = 2919; - return true; - } - break; - case 2919: - // UpTee; - if (';' == current) { - match = "\u22A5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('A' == current) { - state = 2920; - return true; - } - break; - case 2920: - if ('r' == current) { - state = 2921; - return true; - } - break; - case 2921: - if ('r' == current) { - state = 2922; - return true; - } - break; - case 2922: - if ('o' == current) { - state = 2923; - return true; - } - break; - case 2923: - if ('w' == current) { - state = 2924; - return true; - } - break; - case 2924: - // UpTeeArrow; - if (';' == current) { - match = "\u21A5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2925: - if ('r' == current) { - state = 2926; - return true; - } - break; - case 2926: - if ('r' == current) { - state = 2927; - return true; - } - break; - case 2927: - if ('o' == current) { - state = 2928; - return true; - } - break; - case 2928: - if ('w' == current) { - state = 2929; - return true; - } - break; - case 2929: - // Uparrow; - if (';' == current) { - match = "\u21D1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2930: - if ('o' == current) { - state = 2931; - return true; - } - break; - case 2931: - if ('w' == current) { - state = 2932; - return true; - } - break; - case 2932: - if ('n' == current) { - state = 2933; - return true; - } - break; - case 2933: - if ('a' == current) { - state = 2934; - return true; - } - break; - case 2934: - if ('r' == current) { - state = 2935; - return true; - } - break; - case 2935: - if ('r' == current) { - state = 2936; - return true; - } - break; - case 2936: - if ('o' == current) { - state = 2937; - return true; - } - break; - case 2937: - if ('w' == current) { - state = 2938; - return true; - } - break; - case 2938: - // Updownarrow; - if (';' == current) { - match = "\u21D5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2939: - if ('e' == current) { - state = 2940; - return true; - } - break; - case 2940: - if ('r' == current) { - state = 2941; - return true; - } - break; - case 2941: - if ('L' == current) { - state = 2942; - return true; - } - else if ('R' == current) { - state = 2951; - return true; - } - break; - case 2942: - if ('e' == current) { - state = 2943; - return true; - } - break; - case 2943: - if ('f' == current) { - state = 2944; - return true; - } - break; - case 2944: - if ('t' == current) { - state = 2945; - return true; - } - break; - case 2945: - if ('A' == current) { - state = 2946; - return true; - } - break; - case 2946: - if ('r' == current) { - state = 2947; - return true; - } - break; - case 2947: - if ('r' == current) { - state = 2948; - return true; - } - break; - case 2948: - if ('o' == current) { - state = 2949; - return true; - } - break; - case 2949: - if ('w' == current) { - state = 2950; - return true; - } - break; - case 2950: - // UpperLeftArrow; - if (';' == current) { - match = "\u2196"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2951: - if ('i' == current) { - state = 2952; - return true; - } - break; - case 2952: - if ('g' == current) { - state = 2953; - return true; - } - break; - case 2953: - if ('h' == current) { - state = 2954; - return true; - } - break; - case 2954: - if ('t' == current) { - state = 2955; - return true; - } - break; - case 2955: - if ('A' == current) { - state = 2956; - return true; - } - break; - case 2956: - if ('r' == current) { - state = 2957; - return true; - } - break; - case 2957: - if ('r' == current) { - state = 2958; - return true; - } - break; - case 2958: - if ('o' == current) { - state = 2959; - return true; - } - break; - case 2959: - if ('w' == current) { - state = 2960; - return true; - } - break; - case 2960: - // UpperRightArrow; - if (';' == current) { - match = "\u2197"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2961: - if ('i' == current) { - state = 2962; - return true; - } - break; - case 2962: - // Upsi; - if (';' == current) { - match = "\u03D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('l' == current) { - state = 2963; - return true; - } - break; - case 2963: - if ('o' == current) { - state = 2964; - return true; - } - break; - case 2964: - if ('n' == current) { - state = 2965; - return true; - } - break; - case 2965: - // Upsilon; - if (';' == current) { - match = "\u03A5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2966: - if ('i' == current) { - state = 2967; - return true; - } - break; - case 2967: - if ('n' == current) { - state = 2968; - return true; - } - break; - case 2968: - if ('g' == current) { - state = 2969; - return true; - } - break; - case 2969: - // Uring; - if (';' == current) { - match = "\u016E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2970: - if ('c' == current) { - state = 2971; - return true; - } - break; - case 2971: - if ('r' == current) { - state = 2972; - return true; - } - break; - case 2972: - // Uscr; - if (';' == current) { - match = "\uD835\uDCB0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2973: - if ('i' == current) { - state = 2974; - return true; - } - break; - case 2974: - if ('l' == current) { - state = 2975; - return true; - } - break; - case 2975: - if ('d' == current) { - state = 2976; - return true; - } - break; - case 2976: - if ('e' == current) { - state = 2977; - return true; - } - break; - case 2977: - // Utilde; - if (';' == current) { - match = "\u0168"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2978: - if ('m' == current) { - state = 2979; - return true; - } - break; - case 2979: - // Uuml - if ('l' == current) { - match = "\u00DC"; - matchLength = consumedCount; - state = 2980; - return true; - } - break; - case 2980: - // Uuml; - if (';' == current) { - match = "\u00DC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2981: - switch (current) { - case 'D': - state = 2982; - return true; - case 'b': - state = 2986; - return true; - case 'c': - state = 2989; - return true; - case 'd': - state = 2991; - return true; - case 'e': - state = 2996; - return true; - case 'f': - state = 3038; - return true; - case 'o': - state = 3040; - return true; - case 's': - state = 3043; - return true; - case 'v': - state = 3046; - return true; - } - break; - case 2982: - if ('a' == current) { - state = 2983; - return true; - } - break; - case 2983: - if ('s' == current) { - state = 2984; - return true; - } - break; - case 2984: - if ('h' == current) { - state = 2985; - return true; - } - break; - case 2985: - // VDash; - if (';' == current) { - match = "\u22AB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2986: - if ('a' == current) { - state = 2987; - return true; - } - break; - case 2987: - if ('r' == current) { - state = 2988; - return true; - } - break; - case 2988: - // Vbar; - if (';' == current) { - match = "\u2AEB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2989: - if ('y' == current) { - state = 2990; - return true; - } - break; - case 2990: - // Vcy; - if (';' == current) { - match = "\u0412"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2991: - if ('a' == current) { - state = 2992; - return true; - } - break; - case 2992: - if ('s' == current) { - state = 2993; - return true; - } - break; - case 2993: - if ('h' == current) { - state = 2994; - return true; - } - break; - case 2994: - // Vdash; - if (';' == current) { - match = "\u22A9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('l' == current) { - state = 2995; - return true; - } - break; - case 2995: - // Vdashl; - if (';' == current) { - match = "\u2AE6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2996: - if ('e' == current) { - state = 2997; - return true; - } - else if ('r' == current) { - state = 2998; - return true; - } - break; - case 2997: - // Vee; - if (';' == current) { - match = "\u22C1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 2998: - switch (current) { - case 'b': - state = 2999; - return true; - case 't': - state = 3002; - return true; - case 'y': - state = 3028; - return true; - } - break; - case 2999: - if ('a' == current) { - state = 3000; - return true; - } - break; - } - return false; - } - - private boolean parse4(final int current) { - consumedCount++; - switch (state) { - case 3000: - if ('r' == current) { - state = 3001; - return true; - } - break; - case 3001: - // Verbar; - if (';' == current) { - match = "\u2016"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3002: - // Vert; - if (';' == current) { - match = "\u2016"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('i' == current) { - state = 3003; - return true; - } - break; - case 3003: - if ('c' == current) { - state = 3004; - return true; - } - break; - case 3004: - if ('a' == current) { - state = 3005; - return true; - } - break; - case 3005: - if ('l' == current) { - state = 3006; - return true; - } - break; - case 3006: - switch (current) { - case 'B': - state = 3007; - return true; - case 'L': - state = 3010; - return true; - case 'S': - state = 3014; - return true; - case 'T': - state = 3023; - return true; - } - break; - case 3007: - if ('a' == current) { - state = 3008; - return true; - } - break; - case 3008: - if ('r' == current) { - state = 3009; - return true; - } - break; - case 3009: - // VerticalBar; - if (';' == current) { - match = "\u2223"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3010: - if ('i' == current) { - state = 3011; - return true; - } - break; - case 3011: - if ('n' == current) { - state = 3012; - return true; - } - break; - case 3012: - if ('e' == current) { - state = 3013; - return true; - } - break; - case 3013: - // VerticalLine; - if (';' == current) { - match = "|"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3014: - if ('e' == current) { - state = 3015; - return true; - } - break; - case 3015: - if ('p' == current) { - state = 3016; - return true; - } - break; - case 3016: - if ('a' == current) { - state = 3017; - return true; - } - break; - case 3017: - if ('r' == current) { - state = 3018; - return true; - } - break; - case 3018: - if ('a' == current) { - state = 3019; - return true; - } - break; - case 3019: - if ('t' == current) { - state = 3020; - return true; - } - break; - case 3020: - if ('o' == current) { - state = 3021; - return true; - } - break; - case 3021: - if ('r' == current) { - state = 3022; - return true; - } - break; - case 3022: - // VerticalSeparator; - if (';' == current) { - match = "\u2758"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3023: - if ('i' == current) { - state = 3024; - return true; - } - break; - case 3024: - if ('l' == current) { - state = 3025; - return true; - } - break; - case 3025: - if ('d' == current) { - state = 3026; - return true; - } - break; - case 3026: - if ('e' == current) { - state = 3027; - return true; - } - break; - case 3027: - // VerticalTilde; - if (';' == current) { - match = "\u2240"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3028: - if ('T' == current) { - state = 3029; - return true; - } - break; - case 3029: - if ('h' == current) { - state = 3030; - return true; - } - break; - case 3030: - if ('i' == current) { - state = 3031; - return true; - } - break; - case 3031: - if ('n' == current) { - state = 3032; - return true; - } - break; - case 3032: - if ('S' == current) { - state = 3033; - return true; - } - break; - case 3033: - if ('p' == current) { - state = 3034; - return true; - } - break; - case 3034: - if ('a' == current) { - state = 3035; - return true; - } - break; - case 3035: - if ('c' == current) { - state = 3036; - return true; - } - break; - case 3036: - if ('e' == current) { - state = 3037; - return true; - } - break; - case 3037: - // VeryThinSpace; - if (';' == current) { - match = "\u200A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3038: - if ('r' == current) { - state = 3039; - return true; - } - break; - case 3039: - // Vfr; - if (';' == current) { - match = "\uD835\uDD19"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3040: - if ('p' == current) { - state = 3041; - return true; - } - break; - case 3041: - if ('f' == current) { - state = 3042; - return true; - } - break; - case 3042: - // Vopf; - if (';' == current) { - match = "\uD835\uDD4D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3043: - if ('c' == current) { - state = 3044; - return true; - } - break; - case 3044: - if ('r' == current) { - state = 3045; - return true; - } - break; - case 3045: - // Vscr; - if (';' == current) { - match = "\uD835\uDCB1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3046: - if ('d' == current) { - state = 3047; - return true; - } - break; - case 3047: - if ('a' == current) { - state = 3048; - return true; - } - break; - case 3048: - if ('s' == current) { - state = 3049; - return true; - } - break; - case 3049: - if ('h' == current) { - state = 3050; - return true; - } - break; - case 3050: - // Vvdash; - if (';' == current) { - match = "\u22AA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3051: - switch (current) { - case 'c': - state = 3052; - return true; - case 'e': - state = 3056; - return true; - case 'f': - state = 3060; - return true; - case 'o': - state = 3062; - return true; - case 's': - state = 3065; - return true; - } - break; - case 3052: - if ('i' == current) { - state = 3053; - return true; - } - break; - case 3053: - if ('r' == current) { - state = 3054; - return true; - } - break; - case 3054: - if ('c' == current) { - state = 3055; - return true; - } - break; - case 3055: - // Wcirc; - if (';' == current) { - match = "\u0174"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3056: - if ('d' == current) { - state = 3057; - return true; - } - break; - case 3057: - if ('g' == current) { - state = 3058; - return true; - } - break; - case 3058: - if ('e' == current) { - state = 3059; - return true; - } - break; - case 3059: - // Wedge; - if (';' == current) { - match = "\u22C0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3060: - if ('r' == current) { - state = 3061; - return true; - } - break; - case 3061: - // Wfr; - if (';' == current) { - match = "\uD835\uDD1A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3062: - if ('p' == current) { - state = 3063; - return true; - } - break; - case 3063: - if ('f' == current) { - state = 3064; - return true; - } - break; - case 3064: - // Wopf; - if (';' == current) { - match = "\uD835\uDD4E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3065: - if ('c' == current) { - state = 3066; - return true; - } - break; - case 3066: - if ('r' == current) { - state = 3067; - return true; - } - break; - case 3067: - // Wscr; - if (';' == current) { - match = "\uD835\uDCB2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3068: - switch (current) { - case 'f': - state = 3069; - return true; - case 'i': - state = 3071; - return true; - case 'o': - state = 3072; - return true; - case 's': - state = 3075; - return true; - } - break; - case 3069: - if ('r' == current) { - state = 3070; - return true; - } - break; - case 3070: - // Xfr; - if (';' == current) { - match = "\uD835\uDD1B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3071: - // Xi; - if (';' == current) { - match = "\u039E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3072: - if ('p' == current) { - state = 3073; - return true; - } - break; - case 3073: - if ('f' == current) { - state = 3074; - return true; - } - break; - case 3074: - // Xopf; - if (';' == current) { - match = "\uD835\uDD4F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3075: - if ('c' == current) { - state = 3076; - return true; - } - break; - case 3076: - if ('r' == current) { - state = 3077; - return true; - } - break; - case 3077: - // Xscr; - if (';' == current) { - match = "\uD835\uDCB3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3078: - switch (current) { - case 'A': - state = 3079; - return true; - case 'I': - state = 3082; - return true; - case 'U': - state = 3085; - return true; - case 'a': - state = 3088; - return true; - case 'c': - state = 3093; - return true; - case 'f': - state = 3098; - return true; - case 'o': - state = 3100; - return true; - case 's': - state = 3103; - return true; - case 'u': - state = 3106; - return true; - } - break; - case 3079: - if ('c' == current) { - state = 3080; - return true; - } - break; - case 3080: - if ('y' == current) { - state = 3081; - return true; - } - break; - case 3081: - // YAcy; - if (';' == current) { - match = "\u042F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3082: - if ('c' == current) { - state = 3083; - return true; - } - break; - case 3083: - if ('y' == current) { - state = 3084; - return true; - } - break; - case 3084: - // YIcy; - if (';' == current) { - match = "\u0407"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3085: - if ('c' == current) { - state = 3086; - return true; - } - break; - case 3086: - if ('y' == current) { - state = 3087; - return true; - } - break; - case 3087: - // YUcy; - if (';' == current) { - match = "\u042E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3088: - if ('c' == current) { - state = 3089; - return true; - } - break; - case 3089: - if ('u' == current) { - state = 3090; - return true; - } - break; - case 3090: - if ('t' == current) { - state = 3091; - return true; - } - break; - case 3091: - // Yacute - if ('e' == current) { - match = "\u00DD"; - matchLength = consumedCount; - state = 3092; - return true; - } - break; - case 3092: - // Yacute; - if (';' == current) { - match = "\u00DD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3093: - if ('i' == current) { - state = 3094; - return true; - } - else if ('y' == current) { - state = 3097; - return true; - } - break; - case 3094: - if ('r' == current) { - state = 3095; - return true; - } - break; - case 3095: - if ('c' == current) { - state = 3096; - return true; - } - break; - case 3096: - // Ycirc; - if (';' == current) { - match = "\u0176"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3097: - // Ycy; - if (';' == current) { - match = "\u042B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3098: - if ('r' == current) { - state = 3099; - return true; - } - break; - case 3099: - // Yfr; - if (';' == current) { - match = "\uD835\uDD1C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3100: - if ('p' == current) { - state = 3101; - return true; - } - break; - case 3101: - if ('f' == current) { - state = 3102; - return true; - } - break; - case 3102: - // Yopf; - if (';' == current) { - match = "\uD835\uDD50"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3103: - if ('c' == current) { - state = 3104; - return true; - } - break; - case 3104: - if ('r' == current) { - state = 3105; - return true; - } - break; - case 3105: - // Yscr; - if (';' == current) { - match = "\uD835\uDCB4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3106: - if ('m' == current) { - state = 3107; - return true; - } - break; - case 3107: - if ('l' == current) { - state = 3108; - return true; - } - break; - case 3108: - // Yuml; - if (';' == current) { - match = "\u0178"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3109: - switch (current) { - case 'H': - state = 3110; - return true; - case 'a': - state = 3113; - return true; - case 'c': - state = 3118; - return true; - case 'd': - state = 3124; - return true; - case 'e': - state = 3127; - return true; - case 'f': - state = 3142; - return true; - case 'o': - state = 3144; - return true; - case 's': - state = 3147; - return true; - } - break; - case 3110: - if ('c' == current) { - state = 3111; - return true; - } - break; - case 3111: - if ('y' == current) { - state = 3112; - return true; - } - break; - case 3112: - // ZHcy; - if (';' == current) { - match = "\u0416"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3113: - if ('c' == current) { - state = 3114; - return true; - } - break; - case 3114: - if ('u' == current) { - state = 3115; - return true; - } - break; - case 3115: - if ('t' == current) { - state = 3116; - return true; - } - break; - case 3116: - if ('e' == current) { - state = 3117; - return true; - } - break; - case 3117: - // Zacute; - if (';' == current) { - match = "\u0179"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3118: - if ('a' == current) { - state = 3119; - return true; - } - else if ('y' == current) { - state = 3123; - return true; - } - break; - case 3119: - if ('r' == current) { - state = 3120; - return true; - } - break; - case 3120: - if ('o' == current) { - state = 3121; - return true; - } - break; - case 3121: - if ('n' == current) { - state = 3122; - return true; - } - break; - case 3122: - // Zcaron; - if (';' == current) { - match = "\u017D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3123: - // Zcy; - if (';' == current) { - match = "\u0417"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3124: - if ('o' == current) { - state = 3125; - return true; - } - break; - case 3125: - if ('t' == current) { - state = 3126; - return true; - } - break; - case 3126: - // Zdot; - if (';' == current) { - match = "\u017B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3127: - if ('r' == current) { - state = 3128; - return true; - } - else if ('t' == current) { - state = 3140; - return true; - } - break; - case 3128: - if ('o' == current) { - state = 3129; - return true; - } - break; - case 3129: - if ('W' == current) { - state = 3130; - return true; - } - break; - case 3130: - if ('i' == current) { - state = 3131; - return true; - } - break; - case 3131: - if ('d' == current) { - state = 3132; - return true; - } - break; - case 3132: - if ('t' == current) { - state = 3133; - return true; - } - break; - case 3133: - if ('h' == current) { - state = 3134; - return true; - } - break; - case 3134: - if ('S' == current) { - state = 3135; - return true; - } - break; - case 3135: - if ('p' == current) { - state = 3136; - return true; - } - break; - case 3136: - if ('a' == current) { - state = 3137; - return true; - } - break; - case 3137: - if ('c' == current) { - state = 3138; - return true; - } - break; - case 3138: - if ('e' == current) { - state = 3139; - return true; - } - break; - case 3139: - // ZeroWidthSpace; - if (';' == current) { - match = "\u200B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3140: - if ('a' == current) { - state = 3141; - return true; - } - break; - case 3141: - // Zeta; - if (';' == current) { - match = "\u0396"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3142: - if ('r' == current) { - state = 3143; - return true; - } - break; - case 3143: - // Zfr; - if (';' == current) { - match = "\u2128"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3144: - if ('p' == current) { - state = 3145; - return true; - } - break; - case 3145: - if ('f' == current) { - state = 3146; - return true; - } - break; - case 3146: - // Zopf; - if (';' == current) { - match = "\u2124"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3147: - if ('c' == current) { - state = 3148; - return true; - } - break; - case 3148: - if ('r' == current) { - state = 3149; - return true; - } - break; - case 3149: - // Zscr; - if (';' == current) { - match = "\uD835\uDCB5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3150: - switch (current) { - case 'a': - state = 3151; - return true; - case 'b': - state = 3156; - return true; - case 'c': - state = 3161; - return true; - case 'e': - state = 3171; - return true; - case 'f': - state = 3175; - return true; - case 'g': - state = 3177; - return true; - case 'l': - state = 3182; - return true; - case 'm': - state = 3193; - return true; - case 'n': - state = 3200; - return true; - case 'o': - state = 3241; - return true; - case 'p': - state = 3247; - return true; - case 'r': - state = 3264; - return true; - case 's': - state = 3268; - return true; - case 't': - state = 3277; - return true; - case 'u': - state = 3282; - return true; - case 'w': - state = 3285; - return true; - } - break; - case 3151: - if ('c' == current) { - state = 3152; - return true; - } - break; - case 3152: - if ('u' == current) { - state = 3153; - return true; - } - break; - case 3153: - if ('t' == current) { - state = 3154; - return true; - } - break; - case 3154: - // aacute - if ('e' == current) { - match = "\u00E1"; - matchLength = consumedCount; - state = 3155; - return true; - } - break; - case 3155: - // aacute; - if (';' == current) { - match = "\u00E1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3156: - if ('r' == current) { - state = 3157; - return true; - } - break; - case 3157: - if ('e' == current) { - state = 3158; - return true; - } - break; - case 3158: - if ('v' == current) { - state = 3159; - return true; - } - break; - case 3159: - if ('e' == current) { - state = 3160; - return true; - } - break; - case 3160: - // abreve; - if (';' == current) { - match = "\u0103"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3161: - switch (current) { - case ';': // ac; - match = "\u223E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 3162; - return true; - case 'd': - state = 3163; - return true; - case 'i': - state = 3164; - return true; - case 'u': - state = 3167; - return true; - case 'y': - state = 3170; - return true; - } - break; - case 3162: - // acE; - if (';' == current) { - match = "\u223E\u0333"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3163: - // acd; - if (';' == current) { - match = "\u223F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3164: - if ('r' == current) { - state = 3165; - return true; - } - break; - case 3165: - // acirc - if ('c' == current) { - match = "\u00E2"; - matchLength = consumedCount; - state = 3166; - return true; - } - break; - case 3166: - // acirc; - if (';' == current) { - match = "\u00E2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3167: - if ('t' == current) { - state = 3168; - return true; - } - break; - case 3168: - // acute - if ('e' == current) { - match = "\u00B4"; - matchLength = consumedCount; - state = 3169; - return true; - } - break; - case 3169: - // acute; - if (';' == current) { - match = "\u00B4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3170: - // acy; - if (';' == current) { - match = "\u0430"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3171: - if ('l' == current) { - state = 3172; - return true; - } - break; - case 3172: - if ('i' == current) { - state = 3173; - return true; - } - break; - case 3173: - // aelig - if ('g' == current) { - match = "\u00E6"; - matchLength = consumedCount; - state = 3174; - return true; - } - break; - case 3174: - // aelig; - if (';' == current) { - match = "\u00E6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3175: - // af; - if (';' == current) { - match = "\u2061"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('r' == current) { - state = 3176; - return true; - } - break; - case 3176: - // afr; - if (';' == current) { - match = "\uD835\uDD1E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3177: - if ('r' == current) { - state = 3178; - return true; - } - break; - case 3178: - if ('a' == current) { - state = 3179; - return true; - } - break; - case 3179: - if ('v' == current) { - state = 3180; - return true; - } - break; - case 3180: - // agrave - if ('e' == current) { - match = "\u00E0"; - matchLength = consumedCount; - state = 3181; - return true; - } - break; - case 3181: - // agrave; - if (';' == current) { - match = "\u00E0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3182: - if ('e' == current) { - state = 3183; - return true; - } - else if ('p' == current) { - state = 3190; - return true; - } - break; - case 3183: - if ('f' == current) { - state = 3184; - return true; - } - else if ('p' == current) { - state = 3188; - return true; - } - break; - case 3184: - if ('s' == current) { - state = 3185; - return true; - } - break; - case 3185: - if ('y' == current) { - state = 3186; - return true; - } - break; - case 3186: - if ('m' == current) { - state = 3187; - return true; - } - break; - case 3187: - // alefsym; - if (';' == current) { - match = "\u2135"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3188: - if ('h' == current) { - state = 3189; - return true; - } - break; - case 3189: - // aleph; - if (';' == current) { - match = "\u2135"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3190: - if ('h' == current) { - state = 3191; - return true; - } - break; - case 3191: - if ('a' == current) { - state = 3192; - return true; - } - break; - case 3192: - // alpha; - if (';' == current) { - match = "\u03B1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3193: - if ('a' == current) { - state = 3194; - return true; - } - // amp - else if ('p' == current) { - match = "&"; - matchLength = consumedCount; - state = 3199; - return true; - } - break; - case 3194: - if ('c' == current) { - state = 3195; - return true; - } - else if ('l' == current) { - state = 3197; - return true; - } - break; - case 3195: - if ('r' == current) { - state = 3196; - return true; - } - break; - case 3196: - // amacr; - if (';' == current) { - match = "\u0101"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3197: - if ('g' == current) { - state = 3198; - return true; - } - break; - case 3198: - // amalg; - if (';' == current) { - match = "\u2A3F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3199: - // amp; - if (';' == current) { - match = "&"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3200: - if ('d' == current) { - state = 3201; - return true; - } - else if ('g' == current) { - state = 3212; - return true; - } - break; - case 3201: - switch (current) { - case ';': // and; - match = "\u2227"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 3202; - return true; - case 'd': - state = 3205; - return true; - case 's': - state = 3206; - return true; - case 'v': - state = 3211; - return true; - } - break; - case 3202: - if ('n' == current) { - state = 3203; - return true; - } - break; - case 3203: - if ('d' == current) { - state = 3204; - return true; - } - break; - case 3204: - // andand; - if (';' == current) { - match = "\u2A55"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3205: - // andd; - if (';' == current) { - match = "\u2A5C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3206: - if ('l' == current) { - state = 3207; - return true; - } - break; - case 3207: - if ('o' == current) { - state = 3208; - return true; - } - break; - case 3208: - if ('p' == current) { - state = 3209; - return true; - } - break; - case 3209: - if ('e' == current) { - state = 3210; - return true; - } - break; - case 3210: - // andslope; - if (';' == current) { - match = "\u2A58"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3211: - // andv; - if (';' == current) { - match = "\u2A5A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3212: - switch (current) { - case ';': // ang; - match = "\u2220"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 3213; - return true; - case 'l': - state = 3214; - return true; - case 'm': - state = 3216; - return true; - case 'r': - state = 3228; - return true; - case 's': - state = 3233; - return true; - case 'z': - state = 3237; - return true; - } - break; - case 3213: - // ange; - if (';' == current) { - match = "\u29A4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3214: - if ('e' == current) { - state = 3215; - return true; - } - break; - case 3215: - // angle; - if (';' == current) { - match = "\u2220"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3216: - if ('s' == current) { - state = 3217; - return true; - } - break; - case 3217: - if ('d' == current) { - state = 3218; - return true; - } - break; - case 3218: - // angmsd; - if (';' == current) { - match = "\u2221"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('a' == current) { - state = 3219; - return true; - } - break; - case 3219: - switch (current) { - case 'a': - state = 3220; - return true; - case 'b': - state = 3221; - return true; - case 'c': - state = 3222; - return true; - case 'd': - state = 3223; - return true; - case 'e': - state = 3224; - return true; - case 'f': - state = 3225; - return true; - case 'g': - state = 3226; - return true; - case 'h': - state = 3227; - return true; - } - break; - case 3220: - // angmsdaa; - if (';' == current) { - match = "\u29A8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3221: - // angmsdab; - if (';' == current) { - match = "\u29A9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3222: - // angmsdac; - if (';' == current) { - match = "\u29AA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3223: - // angmsdad; - if (';' == current) { - match = "\u29AB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3224: - // angmsdae; - if (';' == current) { - match = "\u29AC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3225: - // angmsdaf; - if (';' == current) { - match = "\u29AD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3226: - // angmsdag; - if (';' == current) { - match = "\u29AE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3227: - // angmsdah; - if (';' == current) { - match = "\u29AF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3228: - if ('t' == current) { - state = 3229; - return true; - } - break; - case 3229: - // angrt; - if (';' == current) { - match = "\u221F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 3230; - return true; - } - break; - case 3230: - if ('b' == current) { - state = 3231; - return true; - } - break; - case 3231: - // angrtvb; - if (';' == current) { - match = "\u22BE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 3232; - return true; - } - break; - case 3232: - // angrtvbd; - if (';' == current) { - match = "\u299D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3233: - if ('p' == current) { - state = 3234; - return true; - } - else if ('t' == current) { - state = 3236; - return true; - } - break; - case 3234: - if ('h' == current) { - state = 3235; - return true; - } - break; - case 3235: - // angsph; - if (';' == current) { - match = "\u2222"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3236: - // angst; - if (';' == current) { - match = "\u00C5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3237: - if ('a' == current) { - state = 3238; - return true; - } - break; - case 3238: - if ('r' == current) { - state = 3239; - return true; - } - break; - case 3239: - if ('r' == current) { - state = 3240; - return true; - } - break; - case 3240: - // angzarr; - if (';' == current) { - match = "\u237C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3241: - if ('g' == current) { - state = 3242; - return true; - } - else if ('p' == current) { - state = 3245; - return true; - } - break; - case 3242: - if ('o' == current) { - state = 3243; - return true; - } - break; - case 3243: - if ('n' == current) { - state = 3244; - return true; - } - break; - case 3244: - // aogon; - if (';' == current) { - match = "\u0105"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3245: - if ('f' == current) { - state = 3246; - return true; - } - break; - case 3246: - // aopf; - if (';' == current) { - match = "\uD835\uDD52"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3247: - switch (current) { - case ';': // ap; - match = "\u2248"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 3248; - return true; - case 'a': - state = 3249; - return true; - case 'e': - state = 3253; - return true; - case 'i': - state = 3254; - return true; - case 'o': - state = 3256; - return true; - case 'p': - state = 3258; - return true; - } - break; - case 3248: - // apE; - if (';' == current) { - match = "\u2A70"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3249: - if ('c' == current) { - state = 3250; - return true; - } - break; - case 3250: - if ('i' == current) { - state = 3251; - return true; - } - break; - case 3251: - if ('r' == current) { - state = 3252; - return true; - } - break; - case 3252: - // apacir; - if (';' == current) { - match = "\u2A6F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3253: - // ape; - if (';' == current) { - match = "\u224A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3254: - if ('d' == current) { - state = 3255; - return true; - } - break; - case 3255: - // apid; - if (';' == current) { - match = "\u224B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3256: - if ('s' == current) { - state = 3257; - return true; - } - break; - case 3257: - // apos; - if (';' == current) { - match = "'"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3258: - if ('r' == current) { - state = 3259; - return true; - } - break; - case 3259: - if ('o' == current) { - state = 3260; - return true; - } - break; - case 3260: - if ('x' == current) { - state = 3261; - return true; - } - break; - case 3261: - // approx; - if (';' == current) { - match = "\u2248"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 3262; - return true; - } - break; - case 3262: - if ('q' == current) { - state = 3263; - return true; - } - break; - case 3263: - // approxeq; - if (';' == current) { - match = "\u224A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3264: - if ('i' == current) { - state = 3265; - return true; - } - break; - case 3265: - if ('n' == current) { - state = 3266; - return true; - } - break; - case 3266: - // aring - if ('g' == current) { - match = "\u00E5"; - matchLength = consumedCount; - state = 3267; - return true; - } - break; - case 3267: - // aring; - if (';' == current) { - match = "\u00E5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3268: - switch (current) { - case 'c': - state = 3269; - return true; - case 't': - state = 3271; - return true; - case 'y': - state = 3272; - return true; - } - break; - case 3269: - if ('r' == current) { - state = 3270; - return true; - } - break; - case 3270: - // ascr; - if (';' == current) { - match = "\uD835\uDCB6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3271: - // ast; - if (';' == current) { - match = "*"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3272: - if ('m' == current) { - state = 3273; - return true; - } - break; - case 3273: - if ('p' == current) { - state = 3274; - return true; - } - break; - case 3274: - // asymp; - if (';' == current) { - match = "\u2248"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 3275; - return true; - } - break; - case 3275: - if ('q' == current) { - state = 3276; - return true; - } - break; - case 3276: - // asympeq; - if (';' == current) { - match = "\u224D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3277: - if ('i' == current) { - state = 3278; - return true; - } - break; - case 3278: - if ('l' == current) { - state = 3279; - return true; - } - break; - case 3279: - if ('d' == current) { - state = 3280; - return true; - } - break; - case 3280: - // atilde - if ('e' == current) { - match = "\u00E3"; - matchLength = consumedCount; - state = 3281; - return true; - } - break; - case 3281: - // atilde; - if (';' == current) { - match = "\u00E3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3282: - if ('m' == current) { - state = 3283; - return true; - } - break; - case 3283: - // auml - if ('l' == current) { - match = "\u00E4"; - matchLength = consumedCount; - state = 3284; - return true; - } - break; - case 3284: - // auml; - if (';' == current) { - match = "\u00E4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3285: - if ('c' == current) { - state = 3286; - return true; - } - else if ('i' == current) { - state = 3292; - return true; - } - break; - case 3286: - if ('o' == current) { - state = 3287; - return true; - } - break; - case 3287: - if ('n' == current) { - state = 3288; - return true; - } - break; - case 3288: - if ('i' == current) { - state = 3289; - return true; - } - break; - case 3289: - if ('n' == current) { - state = 3290; - return true; - } - break; - case 3290: - if ('t' == current) { - state = 3291; - return true; - } - break; - case 3291: - // awconint; - if (';' == current) { - match = "\u2233"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3292: - if ('n' == current) { - state = 3293; - return true; - } - break; - case 3293: - if ('t' == current) { - state = 3294; - return true; - } - break; - case 3294: - // awint; - if (';' == current) { - match = "\u2A11"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3295: - switch (current) { - case 'N': - state = 3296; - return true; - case 'a': - state = 3299; - return true; - case 'b': - state = 3332; - return true; - case 'c': - state = 3339; - return true; - case 'd': - state = 3344; - return true; - case 'e': - state = 3348; - return true; - case 'f': - state = 3373; - return true; - case 'i': - state = 3375; - return true; - case 'k': - state = 3433; - return true; - case 'l': - state = 3438; - return true; - case 'n': - state = 3487; - return true; - case 'o': - state = 3495; - return true; - case 'p': - state = 3568; - return true; - case 'r': - state = 3573; - return true; - case 's': - state = 3581; - return true; - case 'u': - state = 3597; - return true; - } - break; - case 3296: - if ('o' == current) { - state = 3297; - return true; - } - break; - case 3297: - if ('t' == current) { - state = 3298; - return true; - } - break; - case 3298: - // bNot; - if (';' == current) { - match = "\u2AED"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3299: - if ('c' == current) { - state = 3300; - return true; - } - else if ('r' == current) { - state = 3323; - return true; - } - break; - case 3300: - if ('k' == current) { - state = 3301; - return true; - } - break; - case 3301: - switch (current) { - case 'c': - state = 3302; - return true; - case 'e': - state = 3306; - return true; - case 'p': - state = 3313; - return true; - case 's': - state = 3318; - return true; - } - break; - case 3302: - if ('o' == current) { - state = 3303; - return true; - } - break; - case 3303: - if ('n' == current) { - state = 3304; - return true; - } - break; - case 3304: - if ('g' == current) { - state = 3305; - return true; - } - break; - case 3305: - // backcong; - if (';' == current) { - match = "\u224C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3306: - if ('p' == current) { - state = 3307; - return true; - } - break; - case 3307: - if ('s' == current) { - state = 3308; - return true; - } - break; - case 3308: - if ('i' == current) { - state = 3309; - return true; - } - break; - case 3309: - if ('l' == current) { - state = 3310; - return true; - } - break; - case 3310: - if ('o' == current) { - state = 3311; - return true; - } - break; - case 3311: - if ('n' == current) { - state = 3312; - return true; - } - break; - case 3312: - // backepsilon; - if (';' == current) { - match = "\u03F6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3313: - if ('r' == current) { - state = 3314; - return true; - } - break; - case 3314: - if ('i' == current) { - state = 3315; - return true; - } - break; - case 3315: - if ('m' == current) { - state = 3316; - return true; - } - break; - case 3316: - if ('e' == current) { - state = 3317; - return true; - } - break; - case 3317: - // backprime; - if (';' == current) { - match = "\u2035"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3318: - if ('i' == current) { - state = 3319; - return true; - } - break; - case 3319: - if ('m' == current) { - state = 3320; - return true; - } - break; - case 3320: - // backsim; - if (';' == current) { - match = "\u223D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 3321; - return true; - } - break; - case 3321: - if ('q' == current) { - state = 3322; - return true; - } - break; - case 3322: - // backsimeq; - if (';' == current) { - match = "\u22CD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3323: - if ('v' == current) { - state = 3324; - return true; - } - else if ('w' == current) { - state = 3327; - return true; - } - break; - case 3324: - if ('e' == current) { - state = 3325; - return true; - } - break; - case 3325: - if ('e' == current) { - state = 3326; - return true; - } - break; - case 3326: - // barvee; - if (';' == current) { - match = "\u22BD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3327: - if ('e' == current) { - state = 3328; - return true; - } - break; - case 3328: - if ('d' == current) { - state = 3329; - return true; - } - break; - case 3329: - // barwed; - if (';' == current) { - match = "\u2305"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('g' == current) { - state = 3330; - return true; - } - break; - case 3330: - if ('e' == current) { - state = 3331; - return true; - } - break; - case 3331: - // barwedge; - if (';' == current) { - match = "\u2305"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3332: - if ('r' == current) { - state = 3333; - return true; - } - break; - case 3333: - if ('k' == current) { - state = 3334; - return true; - } - break; - case 3334: - // bbrk; - if (';' == current) { - match = "\u23B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('t' == current) { - state = 3335; - return true; - } - break; - case 3335: - if ('b' == current) { - state = 3336; - return true; - } - break; - case 3336: - if ('r' == current) { - state = 3337; - return true; - } - break; - case 3337: - if ('k' == current) { - state = 3338; - return true; - } - break; - case 3338: - // bbrktbrk; - if (';' == current) { - match = "\u23B6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3339: - if ('o' == current) { - state = 3340; - return true; - } - else if ('y' == current) { - state = 3343; - return true; - } - break; - case 3340: - if ('n' == current) { - state = 3341; - return true; - } - break; - case 3341: - if ('g' == current) { - state = 3342; - return true; - } - break; - case 3342: - // bcong; - if (';' == current) { - match = "\u224C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3343: - // bcy; - if (';' == current) { - match = "\u0431"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3344: - if ('q' == current) { - state = 3345; - return true; - } - break; - case 3345: - if ('u' == current) { - state = 3346; - return true; - } - break; - case 3346: - if ('o' == current) { - state = 3347; - return true; - } - break; - case 3347: - // bdquo; - if (';' == current) { - match = "\u201E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3348: - switch (current) { - case 'c': - state = 3349; - return true; - case 'm': - state = 3354; - return true; - case 'p': - state = 3359; - return true; - case 'r': - state = 3362; - return true; - case 't': - state = 3366; - return true; - } - break; - case 3349: - if ('a' == current) { - state = 3350; - return true; - } - break; - case 3350: - if ('u' == current) { - state = 3351; - return true; - } - break; - case 3351: - if ('s' == current) { - state = 3352; - return true; - } - break; - case 3352: - // becaus; - if (';' == current) { - match = "\u2235"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 3353; - return true; - } - break; - case 3353: - // because; - if (';' == current) { - match = "\u2235"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3354: - if ('p' == current) { - state = 3355; - return true; - } - break; - case 3355: - if ('t' == current) { - state = 3356; - return true; - } - break; - case 3356: - if ('y' == current) { - state = 3357; - return true; - } - break; - case 3357: - if ('v' == current) { - state = 3358; - return true; - } - break; - case 3358: - // bemptyv; - if (';' == current) { - match = "\u29B0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3359: - if ('s' == current) { - state = 3360; - return true; - } - break; - case 3360: - if ('i' == current) { - state = 3361; - return true; - } - break; - case 3361: - // bepsi; - if (';' == current) { - match = "\u03F6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3362: - if ('n' == current) { - state = 3363; - return true; - } - break; - case 3363: - if ('o' == current) { - state = 3364; - return true; - } - break; - case 3364: - if ('u' == current) { - state = 3365; - return true; - } - break; - case 3365: - // bernou; - if (';' == current) { - match = "\u212C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3366: - switch (current) { - case 'a': - state = 3367; - return true; - case 'h': - state = 3368; - return true; - case 'w': - state = 3369; - return true; - } - break; - case 3367: - // beta; - if (';' == current) { - match = "\u03B2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3368: - // beth; - if (';' == current) { - match = "\u2136"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3369: - if ('e' == current) { - state = 3370; - return true; - } - break; - case 3370: - if ('e' == current) { - state = 3371; - return true; - } - break; - case 3371: - if ('n' == current) { - state = 3372; - return true; - } - break; - case 3372: - // between; - if (';' == current) { - match = "\u226C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3373: - if ('r' == current) { - state = 3374; - return true; - } - break; - case 3374: - // bfr; - if (';' == current) { - match = "\uD835\uDD1F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3375: - if ('g' == current) { - state = 3376; - return true; - } - break; - case 3376: - switch (current) { - case 'c': - state = 3377; - return true; - case 'o': - state = 3385; - return true; - case 's': - state = 3398; - return true; - case 't': - state = 3406; - return true; - case 'u': - state = 3420; - return true; - case 'v': - state = 3425; - return true; - case 'w': - state = 3428; - return true; - } - break; - case 3377: - switch (current) { - case 'a': - state = 3378; - return true; - case 'i': - state = 3380; - return true; - case 'u': - state = 3383; - return true; - } - break; - case 3378: - if ('p' == current) { - state = 3379; - return true; - } - break; - case 3379: - // bigcap; - if (';' == current) { - match = "\u22C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3380: - if ('r' == current) { - state = 3381; - return true; - } - break; - case 3381: - if ('c' == current) { - state = 3382; - return true; - } - break; - case 3382: - // bigcirc; - if (';' == current) { - match = "\u25EF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3383: - if ('p' == current) { - state = 3384; - return true; - } - break; - case 3384: - // bigcup; - if (';' == current) { - match = "\u22C3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3385: - switch (current) { - case 'd': - state = 3386; - return true; - case 'p': - state = 3389; - return true; - case 't': - state = 3393; - return true; - } - break; - case 3386: - if ('o' == current) { - state = 3387; - return true; - } - break; - case 3387: - if ('t' == current) { - state = 3388; - return true; - } - break; - case 3388: - // bigodot; - if (';' == current) { - match = "\u2A00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3389: - if ('l' == current) { - state = 3390; - return true; - } - break; - case 3390: - if ('u' == current) { - state = 3391; - return true; - } - break; - case 3391: - if ('s' == current) { - state = 3392; - return true; - } - break; - case 3392: - // bigoplus; - if (';' == current) { - match = "\u2A01"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3393: - if ('i' == current) { - state = 3394; - return true; - } - break; - case 3394: - if ('m' == current) { - state = 3395; - return true; - } - break; - case 3395: - if ('e' == current) { - state = 3396; - return true; - } - break; - case 3396: - if ('s' == current) { - state = 3397; - return true; - } - break; - case 3397: - // bigotimes; - if (';' == current) { - match = "\u2A02"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3398: - if ('q' == current) { - state = 3399; - return true; - } - else if ('t' == current) { - state = 3403; - return true; - } - break; - case 3399: - if ('c' == current) { - state = 3400; - return true; - } - break; - case 3400: - if ('u' == current) { - state = 3401; - return true; - } - break; - case 3401: - if ('p' == current) { - state = 3402; - return true; - } - break; - case 3402: - // bigsqcup; - if (';' == current) { - match = "\u2A06"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3403: - if ('a' == current) { - state = 3404; - return true; - } - break; - case 3404: - if ('r' == current) { - state = 3405; - return true; - } - break; - case 3405: - // bigstar; - if (';' == current) { - match = "\u2605"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3406: - if ('r' == current) { - state = 3407; - return true; - } - break; - case 3407: - if ('i' == current) { - state = 3408; - return true; - } - break; - case 3408: - if ('a' == current) { - state = 3409; - return true; - } - break; - case 3409: - if ('n' == current) { - state = 3410; - return true; - } - break; - case 3410: - if ('g' == current) { - state = 3411; - return true; - } - break; - case 3411: - if ('l' == current) { - state = 3412; - return true; - } - break; - case 3412: - if ('e' == current) { - state = 3413; - return true; - } - break; - case 3413: - if ('d' == current) { - state = 3414; - return true; - } - else if ('u' == current) { - state = 3418; - return true; - } - break; - case 3414: - if ('o' == current) { - state = 3415; - return true; - } - break; - case 3415: - if ('w' == current) { - state = 3416; - return true; - } - break; - case 3416: - if ('n' == current) { - state = 3417; - return true; - } - break; - case 3417: - // bigtriangledown; - if (';' == current) { - match = "\u25BD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3418: - if ('p' == current) { - state = 3419; - return true; - } - break; - case 3419: - // bigtriangleup; - if (';' == current) { - match = "\u25B3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3420: - if ('p' == current) { - state = 3421; - return true; - } - break; - case 3421: - if ('l' == current) { - state = 3422; - return true; - } - break; - case 3422: - if ('u' == current) { - state = 3423; - return true; - } - break; - case 3423: - if ('s' == current) { - state = 3424; - return true; - } - break; - case 3424: - // biguplus; - if (';' == current) { - match = "\u2A04"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3425: - if ('e' == current) { - state = 3426; - return true; - } - break; - case 3426: - if ('e' == current) { - state = 3427; - return true; - } - break; - case 3427: - // bigvee; - if (';' == current) { - match = "\u22C1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3428: - if ('e' == current) { - state = 3429; - return true; - } - break; - case 3429: - if ('d' == current) { - state = 3430; - return true; - } - break; - case 3430: - if ('g' == current) { - state = 3431; - return true; - } - break; - case 3431: - if ('e' == current) { - state = 3432; - return true; - } - break; - case 3432: - // bigwedge; - if (';' == current) { - match = "\u22C0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3433: - if ('a' == current) { - state = 3434; - return true; - } - break; - case 3434: - if ('r' == current) { - state = 3435; - return true; - } - break; - case 3435: - if ('o' == current) { - state = 3436; - return true; - } - break; - case 3436: - if ('w' == current) { - state = 3437; - return true; - } - break; - case 3437: - // bkarow; - if (';' == current) { - match = "\u290D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3438: - switch (current) { - case 'a': - state = 3439; - return true; - case 'k': - state = 3478; - return true; - case 'o': - state = 3484; - return true; - } - break; - case 3439: - if ('c' == current) { - state = 3440; - return true; - } - else if ('n' == current) { - state = 3476; - return true; - } - break; - case 3440: - if ('k' == current) { - state = 3441; - return true; - } - break; - case 3441: - switch (current) { - case 'l': - state = 3442; - return true; - case 's': - state = 3449; - return true; - case 't': - state = 3455; - return true; - } - break; - case 3442: - if ('o' == current) { - state = 3443; - return true; - } - break; - case 3443: - if ('z' == current) { - state = 3444; - return true; - } - break; - case 3444: - if ('e' == current) { - state = 3445; - return true; - } - break; - case 3445: - if ('n' == current) { - state = 3446; - return true; - } - break; - case 3446: - if ('g' == current) { - state = 3447; - return true; - } - break; - case 3447: - if ('e' == current) { - state = 3448; - return true; - } - break; - case 3448: - // blacklozenge; - if (';' == current) { - match = "\u29EB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3449: - if ('q' == current) { - state = 3450; - return true; - } - break; - case 3450: - if ('u' == current) { - state = 3451; - return true; - } - break; - case 3451: - if ('a' == current) { - state = 3452; - return true; - } - break; - case 3452: - if ('r' == current) { - state = 3453; - return true; - } - break; - case 3453: - if ('e' == current) { - state = 3454; - return true; - } - break; - case 3454: - // blacksquare; - if (';' == current) { - match = "\u25AA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3455: - if ('r' == current) { - state = 3456; - return true; - } - break; - case 3456: - if ('i' == current) { - state = 3457; - return true; - } - break; - case 3457: - if ('a' == current) { - state = 3458; - return true; - } - break; - case 3458: - if ('n' == current) { - state = 3459; - return true; - } - break; - case 3459: - if ('g' == current) { - state = 3460; - return true; - } - break; - case 3460: - if ('l' == current) { - state = 3461; - return true; - } - break; - case 3461: - if ('e' == current) { - state = 3462; - return true; - } - break; - case 3462: - switch (current) { - case ';': // blacktriangle; - match = "\u25B4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'd': - state = 3463; - return true; - case 'l': - state = 3467; - return true; - case 'r': - state = 3471; - return true; - } - break; - case 3463: - if ('o' == current) { - state = 3464; - return true; - } - break; - case 3464: - if ('w' == current) { - state = 3465; - return true; - } - break; - case 3465: - if ('n' == current) { - state = 3466; - return true; - } - break; - case 3466: - // blacktriangledown; - if (';' == current) { - match = "\u25BE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3467: - if ('e' == current) { - state = 3468; - return true; - } - break; - case 3468: - if ('f' == current) { - state = 3469; - return true; - } - break; - case 3469: - if ('t' == current) { - state = 3470; - return true; - } - break; - case 3470: - // blacktriangleleft; - if (';' == current) { - match = "\u25C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3471: - if ('i' == current) { - state = 3472; - return true; - } - break; - case 3472: - if ('g' == current) { - state = 3473; - return true; - } - break; - case 3473: - if ('h' == current) { - state = 3474; - return true; - } - break; - case 3474: - if ('t' == current) { - state = 3475; - return true; - } - break; - case 3475: - // blacktriangleright; - if (';' == current) { - match = "\u25B8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3476: - if ('k' == current) { - state = 3477; - return true; - } - break; - case 3477: - // blank; - if (';' == current) { - match = "\u2423"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3478: - if ('1' == current) { - state = 3479; - return true; - } - else if ('3' == current) { - state = 3482; - return true; - } - break; - case 3479: - if ('2' == current) { - state = 3480; - return true; - } - else if ('4' == current) { - state = 3481; - return true; - } - break; - case 3480: - // blk12; - if (';' == current) { - match = "\u2592"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3481: - // blk14; - if (';' == current) { - match = "\u2591"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3482: - if ('4' == current) { - state = 3483; - return true; - } - break; - case 3483: - // blk34; - if (';' == current) { - match = "\u2593"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3484: - if ('c' == current) { - state = 3485; - return true; - } - break; - case 3485: - if ('k' == current) { - state = 3486; - return true; - } - break; - case 3486: - // block; - if (';' == current) { - match = "\u2588"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3487: - if ('e' == current) { - state = 3488; - return true; - } - else if ('o' == current) { - state = 3493; - return true; - } - break; - case 3488: - // bne; - if (';' == current) { - match = "=\u20E5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 3489; - return true; - } - break; - case 3489: - if ('u' == current) { - state = 3490; - return true; - } - break; - case 3490: - if ('i' == current) { - state = 3491; - return true; - } - break; - case 3491: - if ('v' == current) { - state = 3492; - return true; - } - break; - case 3492: - // bnequiv; - if (';' == current) { - match = "\u2261\u20E5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3493: - if ('t' == current) { - state = 3494; - return true; - } - break; - case 3494: - // bnot; - if (';' == current) { - match = "\u2310"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3495: - switch (current) { - case 'p': - state = 3496; - return true; - case 't': - state = 3498; - return true; - case 'w': - state = 3502; - return true; - case 'x': - state = 3506; - return true; - } - break; - case 3496: - if ('f' == current) { - state = 3497; - return true; - } - break; - case 3497: - // bopf; - if (';' == current) { - match = "\uD835\uDD53"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3498: - // bot; - if (';' == current) { - match = "\u22A5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('t' == current) { - state = 3499; - return true; - } - break; - case 3499: - if ('o' == current) { - state = 3500; - return true; - } - break; - case 3500: - if ('m' == current) { - state = 3501; - return true; - } - break; - case 3501: - // bottom; - if (';' == current) { - match = "\u22A5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3502: - if ('t' == current) { - state = 3503; - return true; - } - break; - case 3503: - if ('i' == current) { - state = 3504; - return true; - } - break; - case 3504: - if ('e' == current) { - state = 3505; - return true; - } - break; - case 3505: - // bowtie; - if (';' == current) { - match = "\u22C8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3506: - switch (current) { - case 'D': - state = 3507; - return true; - case 'H': - state = 3512; - return true; - case 'U': - state = 3517; - return true; - case 'V': - state = 3522; - return true; - case 'b': - state = 3529; - return true; - case 'd': - state = 3532; - return true; - case 'h': - state = 3537; - return true; - case 'm': - state = 3542; - return true; - case 'p': - state = 3547; - return true; - case 't': - state = 3551; - return true; - case 'u': - state = 3556; - return true; - case 'v': - state = 3561; - return true; - } - break; - case 3507: - switch (current) { - case 'L': - state = 3508; - return true; - case 'R': - state = 3509; - return true; - case 'l': - state = 3510; - return true; - case 'r': - state = 3511; - return true; - } - break; - case 3508: - // boxDL; - if (';' == current) { - match = "\u2557"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3509: - // boxDR; - if (';' == current) { - match = "\u2554"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3510: - // boxDl; - if (';' == current) { - match = "\u2556"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3511: - // boxDr; - if (';' == current) { - match = "\u2553"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3512: - switch (current) { - case ';': // boxH; - match = "\u2550"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'D': - state = 3513; - return true; - case 'U': - state = 3514; - return true; - case 'd': - state = 3515; - return true; - case 'u': - state = 3516; - return true; - } - break; - case 3513: - // boxHD; - if (';' == current) { - match = "\u2566"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3514: - // boxHU; - if (';' == current) { - match = "\u2569"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3515: - // boxHd; - if (';' == current) { - match = "\u2564"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3516: - // boxHu; - if (';' == current) { - match = "\u2567"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3517: - switch (current) { - case 'L': - state = 3518; - return true; - case 'R': - state = 3519; - return true; - case 'l': - state = 3520; - return true; - case 'r': - state = 3521; - return true; - } - break; - case 3518: - // boxUL; - if (';' == current) { - match = "\u255D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3519: - // boxUR; - if (';' == current) { - match = "\u255A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3520: - // boxUl; - if (';' == current) { - match = "\u255C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3521: - // boxUr; - if (';' == current) { - match = "\u2559"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3522: - switch (current) { - case ';': // boxV; - match = "\u2551"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'H': - state = 3523; - return true; - case 'L': - state = 3524; - return true; - case 'R': - state = 3525; - return true; - case 'h': - state = 3526; - return true; - case 'l': - state = 3527; - return true; - case 'r': - state = 3528; - return true; - } - break; - case 3523: - // boxVH; - if (';' == current) { - match = "\u256C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3524: - // boxVL; - if (';' == current) { - match = "\u2563"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3525: - // boxVR; - if (';' == current) { - match = "\u2560"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3526: - // boxVh; - if (';' == current) { - match = "\u256B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3527: - // boxVl; - if (';' == current) { - match = "\u2562"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3528: - // boxVr; - if (';' == current) { - match = "\u255F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3529: - if ('o' == current) { - state = 3530; - return true; - } - break; - case 3530: - if ('x' == current) { - state = 3531; - return true; - } - break; - case 3531: - // boxbox; - if (';' == current) { - match = "\u29C9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3532: - switch (current) { - case 'L': - state = 3533; - return true; - case 'R': - state = 3534; - return true; - case 'l': - state = 3535; - return true; - case 'r': - state = 3536; - return true; - } - break; - case 3533: - // boxdL; - if (';' == current) { - match = "\u2555"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3534: - // boxdR; - if (';' == current) { - match = "\u2552"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3535: - // boxdl; - if (';' == current) { - match = "\u2510"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3536: - // boxdr; - if (';' == current) { - match = "\u250C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3537: - switch (current) { - case ';': // boxh; - match = "\u2500"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'D': - state = 3538; - return true; - case 'U': - state = 3539; - return true; - case 'd': - state = 3540; - return true; - case 'u': - state = 3541; - return true; - } - break; - case 3538: - // boxhD; - if (';' == current) { - match = "\u2565"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3539: - // boxhU; - if (';' == current) { - match = "\u2568"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3540: - // boxhd; - if (';' == current) { - match = "\u252C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3541: - // boxhu; - if (';' == current) { - match = "\u2534"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3542: - if ('i' == current) { - state = 3543; - return true; - } - break; - case 3543: - if ('n' == current) { - state = 3544; - return true; - } - break; - case 3544: - if ('u' == current) { - state = 3545; - return true; - } - break; - case 3545: - if ('s' == current) { - state = 3546; - return true; - } - break; - case 3546: - // boxminus; - if (';' == current) { - match = "\u229F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3547: - if ('l' == current) { - state = 3548; - return true; - } - break; - case 3548: - if ('u' == current) { - state = 3549; - return true; - } - break; - case 3549: - if ('s' == current) { - state = 3550; - return true; - } - break; - case 3550: - // boxplus; - if (';' == current) { - match = "\u229E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3551: - if ('i' == current) { - state = 3552; - return true; - } - break; - case 3552: - if ('m' == current) { - state = 3553; - return true; - } - break; - case 3553: - if ('e' == current) { - state = 3554; - return true; - } - break; - case 3554: - if ('s' == current) { - state = 3555; - return true; - } - break; - case 3555: - // boxtimes; - if (';' == current) { - match = "\u22A0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3556: - switch (current) { - case 'L': - state = 3557; - return true; - case 'R': - state = 3558; - return true; - case 'l': - state = 3559; - return true; - case 'r': - state = 3560; - return true; - } - break; - case 3557: - // boxuL; - if (';' == current) { - match = "\u255B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3558: - // boxuR; - if (';' == current) { - match = "\u2558"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3559: - // boxul; - if (';' == current) { - match = "\u2518"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3560: - // boxur; - if (';' == current) { - match = "\u2514"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3561: - switch (current) { - case ';': // boxv; - match = "\u2502"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'H': - state = 3562; - return true; - case 'L': - state = 3563; - return true; - case 'R': - state = 3564; - return true; - case 'h': - state = 3565; - return true; - case 'l': - state = 3566; - return true; - case 'r': - state = 3567; - return true; - } - break; - case 3562: - // boxvH; - if (';' == current) { - match = "\u256A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3563: - // boxvL; - if (';' == current) { - match = "\u2561"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3564: - // boxvR; - if (';' == current) { - match = "\u255E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3565: - // boxvh; - if (';' == current) { - match = "\u253C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3566: - // boxvl; - if (';' == current) { - match = "\u2524"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3567: - // boxvr; - if (';' == current) { - match = "\u251C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3568: - if ('r' == current) { - state = 3569; - return true; - } - break; - case 3569: - if ('i' == current) { - state = 3570; - return true; - } - break; - case 3570: - if ('m' == current) { - state = 3571; - return true; - } - break; - case 3571: - if ('e' == current) { - state = 3572; - return true; - } - break; - case 3572: - // bprime; - if (';' == current) { - match = "\u2035"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3573: - if ('e' == current) { - state = 3574; - return true; - } - else if ('v' == current) { - state = 3577; - return true; - } - break; - case 3574: - if ('v' == current) { - state = 3575; - return true; - } - break; - case 3575: - if ('e' == current) { - state = 3576; - return true; - } - break; - case 3576: - // breve; - if (';' == current) { - match = "\u02D8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3577: - if ('b' == current) { - state = 3578; - return true; - } - break; - case 3578: - if ('a' == current) { - state = 3579; - return true; - } - break; - case 3579: - // brvbar - if ('r' == current) { - match = "\u00A6"; - matchLength = consumedCount; - state = 3580; - return true; - } - break; - case 3580: - // brvbar; - if (';' == current) { - match = "\u00A6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3581: - switch (current) { - case 'c': - state = 3582; - return true; - case 'e': - state = 3584; - return true; - case 'i': - state = 3587; - return true; - case 'o': - state = 3590; - return true; - } - break; - case 3582: - if ('r' == current) { - state = 3583; - return true; - } - break; - case 3583: - // bscr; - if (';' == current) { - match = "\uD835\uDCB7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3584: - if ('m' == current) { - state = 3585; - return true; - } - break; - case 3585: - if ('i' == current) { - state = 3586; - return true; - } - break; - case 3586: - // bsemi; - if (';' == current) { - match = "\u204F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3587: - if ('m' == current) { - state = 3588; - return true; - } - break; - case 3588: - // bsim; - if (';' == current) { - match = "\u223D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 3589; - return true; - } - break; - case 3589: - // bsime; - if (';' == current) { - match = "\u22CD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3590: - if ('l' == current) { - state = 3591; - return true; - } - break; - case 3591: - switch (current) { - case ';': // bsol; - match = "\\"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'b': - state = 3592; - return true; - case 'h': - state = 3593; - return true; - } - break; - case 3592: - // bsolb; - if (';' == current) { - match = "\u29C5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3593: - if ('s' == current) { - state = 3594; - return true; - } - break; - case 3594: - if ('u' == current) { - state = 3595; - return true; - } - break; - case 3595: - if ('b' == current) { - state = 3596; - return true; - } - break; - case 3596: - // bsolhsub; - if (';' == current) { - match = "\u27C8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3597: - if ('l' == current) { - state = 3598; - return true; - } - else if ('m' == current) { - state = 3602; - return true; - } - break; - case 3598: - if ('l' == current) { - state = 3599; - return true; - } - break; - case 3599: - // bull; - if (';' == current) { - match = "\u2022"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 3600; - return true; - } - break; - case 3600: - if ('t' == current) { - state = 3601; - return true; - } - break; - case 3601: - // bullet; - if (';' == current) { - match = "\u2022"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3602: - if ('p' == current) { - state = 3603; - return true; - } - break; - case 3603: - switch (current) { - case ';': // bump; - match = "\u224E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 3604; - return true; - case 'e': - state = 3605; - return true; - } - break; - case 3604: - // bumpE; - if (';' == current) { - match = "\u2AAE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3605: - // bumpe; - if (';' == current) { - match = "\u224F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 3606; - return true; - } - break; - case 3606: - // bumpeq; - if (';' == current) { - match = "\u224F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3607: - switch (current) { - case 'a': - state = 3608; - return true; - case 'c': - state = 3636; - return true; - case 'd': - state = 3655; - return true; - case 'e': - state = 3658; - return true; - case 'f': - state = 3674; - return true; - case 'h': - state = 3676; - return true; - case 'i': - state = 3687; - return true; - case 'l': - state = 3736; - return true; - case 'o': - state = 3743; - return true; - case 'r': - state = 3781; - return true; - case 's': - state = 3788; - return true; - case 't': - state = 3796; - return true; - case 'u': - state = 3800; - return true; - case 'w': - state = 3884; - return true; - case 'y': - state = 3894; - return true; - } - break; - case 3608: - switch (current) { - case 'c': - state = 3609; - return true; - case 'p': - state = 3613; - return true; - case 'r': - state = 3631; - return true; - } - break; - case 3609: - if ('u' == current) { - state = 3610; - return true; - } - break; - case 3610: - if ('t' == current) { - state = 3611; - return true; - } - break; - case 3611: - if ('e' == current) { - state = 3612; - return true; - } - break; - case 3612: - // cacute; - if (';' == current) { - match = "\u0107"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3613: - switch (current) { - case ';': // cap; - match = "\u2229"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 3614; - return true; - case 'b': - state = 3617; - return true; - case 'c': - state = 3622; - return true; - case 'd': - state = 3627; - return true; - case 's': - state = 3630; - return true; - } - break; - case 3614: - if ('n' == current) { - state = 3615; - return true; - } - break; - case 3615: - if ('d' == current) { - state = 3616; - return true; - } - break; - case 3616: - // capand; - if (';' == current) { - match = "\u2A44"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3617: - if ('r' == current) { - state = 3618; - return true; - } - break; - case 3618: - if ('c' == current) { - state = 3619; - return true; - } - break; - case 3619: - if ('u' == current) { - state = 3620; - return true; - } - break; - case 3620: - if ('p' == current) { - state = 3621; - return true; - } - break; - case 3621: - // capbrcup; - if (';' == current) { - match = "\u2A49"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3622: - if ('a' == current) { - state = 3623; - return true; - } - else if ('u' == current) { - state = 3625; - return true; - } - break; - case 3623: - if ('p' == current) { - state = 3624; - return true; - } - break; - case 3624: - // capcap; - if (';' == current) { - match = "\u2A4B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3625: - if ('p' == current) { - state = 3626; - return true; - } - break; - case 3626: - // capcup; - if (';' == current) { - match = "\u2A47"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3627: - if ('o' == current) { - state = 3628; - return true; - } - break; - case 3628: - if ('t' == current) { - state = 3629; - return true; - } - break; - case 3629: - // capdot; - if (';' == current) { - match = "\u2A40"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3630: - // caps; - if (';' == current) { - match = "\u2229\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3631: - if ('e' == current) { - state = 3632; - return true; - } - else if ('o' == current) { - state = 3634; - return true; - } - break; - case 3632: - if ('t' == current) { - state = 3633; - return true; - } - break; - case 3633: - // caret; - if (';' == current) { - match = "\u2041"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3634: - if ('n' == current) { - state = 3635; - return true; - } - break; - case 3635: - // caron; - if (';' == current) { - match = "\u02C7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3636: - switch (current) { - case 'a': - state = 3637; - return true; - case 'e': - state = 3643; - return true; - case 'i': - state = 3647; - return true; - case 'u': - state = 3650; - return true; - } - break; - case 3637: - if ('p' == current) { - state = 3638; - return true; - } - else if ('r' == current) { - state = 3640; - return true; - } - break; - case 3638: - if ('s' == current) { - state = 3639; - return true; - } - break; - case 3639: - // ccaps; - if (';' == current) { - match = "\u2A4D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3640: - if ('o' == current) { - state = 3641; - return true; - } - break; - case 3641: - if ('n' == current) { - state = 3642; - return true; - } - break; - case 3642: - // ccaron; - if (';' == current) { - match = "\u010D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3643: - if ('d' == current) { - state = 3644; - return true; - } - break; - case 3644: - if ('i' == current) { - state = 3645; - return true; - } - break; - case 3645: - // ccedil - if ('l' == current) { - match = "\u00E7"; - matchLength = consumedCount; - state = 3646; - return true; - } - break; - case 3646: - // ccedil; - if (';' == current) { - match = "\u00E7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3647: - if ('r' == current) { - state = 3648; - return true; - } - break; - case 3648: - if ('c' == current) { - state = 3649; - return true; - } - break; - case 3649: - // ccirc; - if (';' == current) { - match = "\u0109"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3650: - if ('p' == current) { - state = 3651; - return true; - } - break; - case 3651: - if ('s' == current) { - state = 3652; - return true; - } - break; - case 3652: - // ccups; - if (';' == current) { - match = "\u2A4C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 3653; - return true; - } - break; - case 3653: - if ('m' == current) { - state = 3654; - return true; - } - break; - case 3654: - // ccupssm; - if (';' == current) { - match = "\u2A50"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3655: - if ('o' == current) { - state = 3656; - return true; - } - break; - case 3656: - if ('t' == current) { - state = 3657; - return true; - } - break; - case 3657: - // cdot; - if (';' == current) { - match = "\u010B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3658: - switch (current) { - case 'd': - state = 3659; - return true; - case 'm': - state = 3662; - return true; - case 'n': - state = 3667; - return true; - } - break; - case 3659: - if ('i' == current) { - state = 3660; - return true; - } - break; - case 3660: - // cedil - if ('l' == current) { - match = "\u00B8"; - matchLength = consumedCount; - state = 3661; - return true; - } - break; - case 3661: - // cedil; - if (';' == current) { - match = "\u00B8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3662: - if ('p' == current) { - state = 3663; - return true; - } - break; - case 3663: - if ('t' == current) { - state = 3664; - return true; - } - break; - case 3664: - if ('y' == current) { - state = 3665; - return true; - } - break; - case 3665: - if ('v' == current) { - state = 3666; - return true; - } - break; - case 3666: - // cemptyv; - if (';' == current) { - match = "\u29B2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3667: - // cent - if ('t' == current) { - match = "\u00A2"; - matchLength = consumedCount; - state = 3668; - return true; - } - break; - case 3668: - // cent; - if (';' == current) { - match = "\u00A2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 3669; - return true; - } - break; - case 3669: - if ('r' == current) { - state = 3670; - return true; - } - break; - case 3670: - if ('d' == current) { - state = 3671; - return true; - } - break; - case 3671: - if ('o' == current) { - state = 3672; - return true; - } - break; - case 3672: - if ('t' == current) { - state = 3673; - return true; - } - break; - case 3673: - // centerdot; - if (';' == current) { - match = "\u00B7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3674: - if ('r' == current) { - state = 3675; - return true; - } - break; - case 3675: - // cfr; - if (';' == current) { - match = "\uD835\uDD20"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3676: - switch (current) { - case 'c': - state = 3677; - return true; - case 'e': - state = 3679; - return true; - case 'i': - state = 3686; - return true; - } - break; - case 3677: - if ('y' == current) { - state = 3678; - return true; - } - break; - case 3678: - // chcy; - if (';' == current) { - match = "\u0447"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3679: - if ('c' == current) { - state = 3680; - return true; - } - break; - case 3680: - if ('k' == current) { - state = 3681; - return true; - } - break; - case 3681: - // check; - if (';' == current) { - match = "\u2713"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('m' == current) { - state = 3682; - return true; - } - break; - case 3682: - if ('a' == current) { - state = 3683; - return true; - } - break; - case 3683: - if ('r' == current) { - state = 3684; - return true; - } - break; - case 3684: - if ('k' == current) { - state = 3685; - return true; - } - break; - case 3685: - // checkmark; - if (';' == current) { - match = "\u2713"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3686: - // chi; - if (';' == current) { - match = "\u03C7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3687: - if ('r' == current) { - state = 3688; - return true; - } - break; - case 3688: - switch (current) { - case ';': // cir; - match = "\u25CB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 3689; - return true; - case 'c': - state = 3690; - return true; - case 'e': - state = 3723; - return true; - case 'f': - state = 3724; - return true; - case 'm': - state = 3729; - return true; - case 's': - state = 3732; - return true; - } - break; - case 3689: - // cirE; - if (';' == current) { - match = "\u29C3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3690: - switch (current) { - case ';': // circ; - match = "\u02C6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 3691; - return true; - case 'l': - state = 3693; - return true; - } - break; - case 3691: - if ('q' == current) { - state = 3692; - return true; - } - break; - case 3692: - // circeq; - if (';' == current) { - match = "\u2257"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3693: - if ('e' == current) { - state = 3694; - return true; - } - break; - case 3694: - if ('a' == current) { - state = 3695; - return true; - } - else if ('d' == current) { - state = 3709; - return true; - } - break; - case 3695: - if ('r' == current) { - state = 3696; - return true; - } - break; - case 3696: - if ('r' == current) { - state = 3697; - return true; - } - break; - case 3697: - if ('o' == current) { - state = 3698; - return true; - } - break; - case 3698: - if ('w' == current) { - state = 3699; - return true; - } - break; - case 3699: - if ('l' == current) { - state = 3700; - return true; - } - else if ('r' == current) { - state = 3704; - return true; - } - break; - case 3700: - if ('e' == current) { - state = 3701; - return true; - } - break; - case 3701: - if ('f' == current) { - state = 3702; - return true; - } - break; - case 3702: - if ('t' == current) { - state = 3703; - return true; - } - break; - case 3703: - // circlearrowleft; - if (';' == current) { - match = "\u21BA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3704: - if ('i' == current) { - state = 3705; - return true; - } - break; - case 3705: - if ('g' == current) { - state = 3706; - return true; - } - break; - case 3706: - if ('h' == current) { - state = 3707; - return true; - } - break; - case 3707: - if ('t' == current) { - state = 3708; - return true; - } - break; - case 3708: - // circlearrowright; - if (';' == current) { - match = "\u21BB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3709: - switch (current) { - case 'R': - state = 3710; - return true; - case 'S': - state = 3711; - return true; - case 'a': - state = 3712; - return true; - case 'c': - state = 3715; - return true; - case 'd': - state = 3719; - return true; - } - break; - case 3710: - // circledR; - if (';' == current) { - match = "\u00AE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3711: - // circledS; - if (';' == current) { - match = "\u24C8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3712: - if ('s' == current) { - state = 3713; - return true; - } - break; - case 3713: - if ('t' == current) { - state = 3714; - return true; - } - break; - case 3714: - // circledast; - if (';' == current) { - match = "\u229B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3715: - if ('i' == current) { - state = 3716; - return true; - } - break; - case 3716: - if ('r' == current) { - state = 3717; - return true; - } - break; - case 3717: - if ('c' == current) { - state = 3718; - return true; - } - break; - case 3718: - // circledcirc; - if (';' == current) { - match = "\u229A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3719: - if ('a' == current) { - state = 3720; - return true; - } - break; - case 3720: - if ('s' == current) { - state = 3721; - return true; - } - break; - case 3721: - if ('h' == current) { - state = 3722; - return true; - } - break; - case 3722: - // circleddash; - if (';' == current) { - match = "\u229D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3723: - // cire; - if (';' == current) { - match = "\u2257"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3724: - if ('n' == current) { - state = 3725; - return true; - } - break; - case 3725: - if ('i' == current) { - state = 3726; - return true; - } - break; - case 3726: - if ('n' == current) { - state = 3727; - return true; - } - break; - case 3727: - if ('t' == current) { - state = 3728; - return true; - } - break; - case 3728: - // cirfnint; - if (';' == current) { - match = "\u2A10"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3729: - if ('i' == current) { - state = 3730; - return true; - } - break; - case 3730: - if ('d' == current) { - state = 3731; - return true; - } - break; - case 3731: - // cirmid; - if (';' == current) { - match = "\u2AEF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3732: - if ('c' == current) { - state = 3733; - return true; - } - break; - case 3733: - if ('i' == current) { - state = 3734; - return true; - } - break; - case 3734: - if ('r' == current) { - state = 3735; - return true; - } - break; - case 3735: - // cirscir; - if (';' == current) { - match = "\u29C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3736: - if ('u' == current) { - state = 3737; - return true; - } - break; - case 3737: - if ('b' == current) { - state = 3738; - return true; - } - break; - case 3738: - if ('s' == current) { - state = 3739; - return true; - } - break; - case 3739: - // clubs; - if (';' == current) { - match = "\u2663"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('u' == current) { - state = 3740; - return true; - } - break; - case 3740: - if ('i' == current) { - state = 3741; - return true; - } - break; - case 3741: - if ('t' == current) { - state = 3742; - return true; - } - break; - case 3742: - // clubsuit; - if (';' == current) { - match = "\u2663"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3743: - switch (current) { - case 'l': - state = 3744; - return true; - case 'm': - state = 3749; - return true; - case 'n': - state = 3765; - return true; - case 'p': - state = 3773; - return true; - } - break; - case 3744: - if ('o' == current) { - state = 3745; - return true; - } - break; - case 3745: - if ('n' == current) { - state = 3746; - return true; - } - break; - case 3746: - // colon; - if (';' == current) { - match = ":"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 3747; - return true; - } - break; - case 3747: - // colone; - if (';' == current) { - match = "\u2254"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 3748; - return true; - } - break; - case 3748: - // coloneq; - if (';' == current) { - match = "\u2254"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3749: - if ('m' == current) { - state = 3750; - return true; - } - else if ('p' == current) { - state = 3753; - return true; - } - break; - case 3750: - if ('a' == current) { - state = 3751; - return true; - } - break; - case 3751: - // comma; - if (';' == current) { - match = ","; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('t' == current) { - state = 3752; - return true; - } - break; - case 3752: - // commat; - if (';' == current) { - match = "@"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3753: - switch (current) { - case ';': // comp; - match = "\u2201"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'f': - state = 3754; - return true; - case 'l': - state = 3756; - return true; - } - break; - case 3754: - if ('n' == current) { - state = 3755; - return true; - } - break; - case 3755: - // compfn; - if (';' == current) { - match = "\u2218"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3756: - if ('e' == current) { - state = 3757; - return true; - } - break; - case 3757: - if ('m' == current) { - state = 3758; - return true; - } - else if ('x' == current) { - state = 3762; - return true; - } - break; - case 3758: - if ('e' == current) { - state = 3759; - return true; - } - break; - case 3759: - if ('n' == current) { - state = 3760; - return true; - } - break; - case 3760: - if ('t' == current) { - state = 3761; - return true; - } - break; - case 3761: - // complement; - if (';' == current) { - match = "\u2201"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3762: - if ('e' == current) { - state = 3763; - return true; - } - break; - case 3763: - if ('s' == current) { - state = 3764; - return true; - } - break; - case 3764: - // complexes; - if (';' == current) { - match = "\u2102"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3765: - if ('g' == current) { - state = 3766; - return true; - } - else if ('i' == current) { - state = 3770; - return true; - } - break; - case 3766: - // cong; - if (';' == current) { - match = "\u2245"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 3767; - return true; - } - break; - case 3767: - if ('o' == current) { - state = 3768; - return true; - } - break; - case 3768: - if ('t' == current) { - state = 3769; - return true; - } - break; - case 3769: - // congdot; - if (';' == current) { - match = "\u2A6D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3770: - if ('n' == current) { - state = 3771; - return true; - } - break; - case 3771: - if ('t' == current) { - state = 3772; - return true; - } - break; - case 3772: - // conint; - if (';' == current) { - match = "\u222E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3773: - switch (current) { - case 'f': - state = 3774; - return true; - case 'r': - state = 3775; - return true; - case 'y': // copy - match = "\u00A9"; - matchLength = consumedCount; - state = 3778; - return true; - } - break; - case 3774: - // copf; - if (';' == current) { - match = "\uD835\uDD54"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3775: - if ('o' == current) { - state = 3776; - return true; - } - break; - case 3776: - if ('d' == current) { - state = 3777; - return true; - } - break; - case 3777: - // coprod; - if (';' == current) { - match = "\u2210"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3778: - // copy; - if (';' == current) { - match = "\u00A9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 3779; - return true; - } - break; - case 3779: - if ('r' == current) { - state = 3780; - return true; - } - break; - case 3780: - // copysr; - if (';' == current) { - match = "\u2117"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3781: - if ('a' == current) { - state = 3782; - return true; - } - else if ('o' == current) { - state = 3785; - return true; - } - break; - case 3782: - if ('r' == current) { - state = 3783; - return true; - } - break; - case 3783: - if ('r' == current) { - state = 3784; - return true; - } - break; - case 3784: - // crarr; - if (';' == current) { - match = "\u21B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3785: - if ('s' == current) { - state = 3786; - return true; - } - break; - case 3786: - if ('s' == current) { - state = 3787; - return true; - } - break; - case 3787: - // cross; - if (';' == current) { - match = "\u2717"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3788: - if ('c' == current) { - state = 3789; - return true; - } - else if ('u' == current) { - state = 3791; - return true; - } - break; - case 3789: - if ('r' == current) { - state = 3790; - return true; - } - break; - case 3790: - // cscr; - if (';' == current) { - match = "\uD835\uDCB8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3791: - if ('b' == current) { - state = 3792; - return true; - } - else if ('p' == current) { - state = 3794; - return true; - } - break; - case 3792: - // csub; - if (';' == current) { - match = "\u2ACF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 3793; - return true; - } - break; - case 3793: - // csube; - if (';' == current) { - match = "\u2AD1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3794: - // csup; - if (';' == current) { - match = "\u2AD0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 3795; - return true; - } - break; - case 3795: - // csupe; - if (';' == current) { - match = "\u2AD2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3796: - if ('d' == current) { - state = 3797; - return true; - } - break; - case 3797: - if ('o' == current) { - state = 3798; - return true; - } - break; - case 3798: - if ('t' == current) { - state = 3799; - return true; - } - break; - case 3799: - // ctdot; - if (';' == current) { - match = "\u22EF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3800: - switch (current) { - case 'd': - state = 3801; - return true; - case 'e': - state = 3807; - return true; - case 'l': - state = 3812; - return true; - case 'p': - state = 3817; - return true; - case 'r': - state = 3834; - return true; - case 'v': - state = 3878; - return true; - case 'w': - state = 3881; - return true; - } - break; - case 3801: - if ('a' == current) { - state = 3802; - return true; - } - break; - case 3802: - if ('r' == current) { - state = 3803; - return true; - } - break; - case 3803: - if ('r' == current) { - state = 3804; - return true; - } - break; - case 3804: - if ('l' == current) { - state = 3805; - return true; - } - else if ('r' == current) { - state = 3806; - return true; - } - break; - case 3805: - // cudarrl; - if (';' == current) { - match = "\u2938"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3806: - // cudarrr; - if (';' == current) { - match = "\u2935"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3807: - if ('p' == current) { - state = 3808; - return true; - } - else if ('s' == current) { - state = 3810; - return true; - } - break; - case 3808: - if ('r' == current) { - state = 3809; - return true; - } - break; - case 3809: - // cuepr; - if (';' == current) { - match = "\u22DE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3810: - if ('c' == current) { - state = 3811; - return true; - } - break; - case 3811: - // cuesc; - if (';' == current) { - match = "\u22DF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3812: - if ('a' == current) { - state = 3813; - return true; - } - break; - case 3813: - if ('r' == current) { - state = 3814; - return true; - } - break; - case 3814: - if ('r' == current) { - state = 3815; - return true; - } - break; - case 3815: - // cularr; - if (';' == current) { - match = "\u21B6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('p' == current) { - state = 3816; - return true; - } - break; - case 3816: - // cularrp; - if (';' == current) { - match = "\u293D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3817: - switch (current) { - case ';': // cup; - match = "\u222A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'b': - state = 3818; - return true; - case 'c': - state = 3823; - return true; - case 'd': - state = 3828; - return true; - case 'o': - state = 3831; - return true; - case 's': - state = 3833; - return true; - } - break; - case 3818: - if ('r' == current) { - state = 3819; - return true; - } - break; - case 3819: - if ('c' == current) { - state = 3820; - return true; - } - break; - case 3820: - if ('a' == current) { - state = 3821; - return true; - } - break; - case 3821: - if ('p' == current) { - state = 3822; - return true; - } - break; - case 3822: - // cupbrcap; - if (';' == current) { - match = "\u2A48"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3823: - if ('a' == current) { - state = 3824; - return true; - } - else if ('u' == current) { - state = 3826; - return true; - } - break; - case 3824: - if ('p' == current) { - state = 3825; - return true; - } - break; - case 3825: - // cupcap; - if (';' == current) { - match = "\u2A46"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3826: - if ('p' == current) { - state = 3827; - return true; - } - break; - case 3827: - // cupcup; - if (';' == current) { - match = "\u2A4A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3828: - if ('o' == current) { - state = 3829; - return true; - } - break; - case 3829: - if ('t' == current) { - state = 3830; - return true; - } - break; - case 3830: - // cupdot; - if (';' == current) { - match = "\u228D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3831: - if ('r' == current) { - state = 3832; - return true; - } - break; - case 3832: - // cupor; - if (';' == current) { - match = "\u2A45"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3833: - // cups; - if (';' == current) { - match = "\u222A\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3834: - switch (current) { - case 'a': - state = 3835; - return true; - case 'l': - state = 3839; - return true; - case 'r': - state = 3859; - return true; - case 'v': - state = 3862; - return true; - } - break; - case 3835: - if ('r' == current) { - state = 3836; - return true; - } - break; - case 3836: - if ('r' == current) { - state = 3837; - return true; - } - break; - case 3837: - // curarr; - if (';' == current) { - match = "\u21B7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('m' == current) { - state = 3838; - return true; - } - break; - case 3838: - // curarrm; - if (';' == current) { - match = "\u293C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3839: - if ('y' == current) { - state = 3840; - return true; - } - break; - case 3840: - switch (current) { - case 'e': - state = 3841; - return true; - case 'v': - state = 3851; - return true; - case 'w': - state = 3854; - return true; - } - break; - case 3841: - if ('q' == current) { - state = 3842; - return true; - } - break; - case 3842: - if ('p' == current) { - state = 3843; - return true; - } - else if ('s' == current) { - state = 3847; - return true; - } - break; - case 3843: - if ('r' == current) { - state = 3844; - return true; - } - break; - case 3844: - if ('e' == current) { - state = 3845; - return true; - } - break; - case 3845: - if ('c' == current) { - state = 3846; - return true; - } - break; - case 3846: - // curlyeqprec; - if (';' == current) { - match = "\u22DE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3847: - if ('u' == current) { - state = 3848; - return true; - } - break; - case 3848: - if ('c' == current) { - state = 3849; - return true; - } - break; - case 3849: - if ('c' == current) { - state = 3850; - return true; - } - break; - case 3850: - // curlyeqsucc; - if (';' == current) { - match = "\u22DF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3851: - if ('e' == current) { - state = 3852; - return true; - } - break; - case 3852: - if ('e' == current) { - state = 3853; - return true; - } - break; - case 3853: - // curlyvee; - if (';' == current) { - match = "\u22CE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3854: - if ('e' == current) { - state = 3855; - return true; - } - break; - case 3855: - if ('d' == current) { - state = 3856; - return true; - } - break; - case 3856: - if ('g' == current) { - state = 3857; - return true; - } - break; - case 3857: - if ('e' == current) { - state = 3858; - return true; - } - break; - case 3858: - // curlywedge; - if (';' == current) { - match = "\u22CF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3859: - if ('e' == current) { - state = 3860; - return true; - } - break; - case 3860: - // curren - if ('n' == current) { - match = "\u00A4"; - matchLength = consumedCount; - state = 3861; - return true; - } - break; - case 3861: - // curren; - if (';' == current) { - match = "\u00A4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3862: - if ('e' == current) { - state = 3863; - return true; - } - break; - case 3863: - if ('a' == current) { - state = 3864; - return true; - } - break; - case 3864: - if ('r' == current) { - state = 3865; - return true; - } - break; - case 3865: - if ('r' == current) { - state = 3866; - return true; - } - break; - case 3866: - if ('o' == current) { - state = 3867; - return true; - } - break; - case 3867: - if ('w' == current) { - state = 3868; - return true; - } - break; - case 3868: - if ('l' == current) { - state = 3869; - return true; - } - else if ('r' == current) { - state = 3873; - return true; - } - break; - case 3869: - if ('e' == current) { - state = 3870; - return true; - } - break; - case 3870: - if ('f' == current) { - state = 3871; - return true; - } - break; - case 3871: - if ('t' == current) { - state = 3872; - return true; - } - break; - case 3872: - // curvearrowleft; - if (';' == current) { - match = "\u21B6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3873: - if ('i' == current) { - state = 3874; - return true; - } - break; - case 3874: - if ('g' == current) { - state = 3875; - return true; - } - break; - case 3875: - if ('h' == current) { - state = 3876; - return true; - } - break; - case 3876: - if ('t' == current) { - state = 3877; - return true; - } - break; - case 3877: - // curvearrowright; - if (';' == current) { - match = "\u21B7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3878: - if ('e' == current) { - state = 3879; - return true; - } - break; - case 3879: - if ('e' == current) { - state = 3880; - return true; - } - break; - case 3880: - // cuvee; - if (';' == current) { - match = "\u22CE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3881: - if ('e' == current) { - state = 3882; - return true; - } - break; - case 3882: - if ('d' == current) { - state = 3883; - return true; - } - break; - case 3883: - // cuwed; - if (';' == current) { - match = "\u22CF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3884: - if ('c' == current) { - state = 3885; - return true; - } - else if ('i' == current) { - state = 3891; - return true; - } - break; - case 3885: - if ('o' == current) { - state = 3886; - return true; - } - break; - case 3886: - if ('n' == current) { - state = 3887; - return true; - } - break; - case 3887: - if ('i' == current) { - state = 3888; - return true; - } - break; - case 3888: - if ('n' == current) { - state = 3889; - return true; - } - break; - case 3889: - if ('t' == current) { - state = 3890; - return true; - } - break; - case 3890: - // cwconint; - if (';' == current) { - match = "\u2232"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3891: - if ('n' == current) { - state = 3892; - return true; - } - break; - case 3892: - if ('t' == current) { - state = 3893; - return true; - } - break; - case 3893: - // cwint; - if (';' == current) { - match = "\u2231"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3894: - if ('l' == current) { - state = 3895; - return true; - } - break; - case 3895: - if ('c' == current) { - state = 3896; - return true; - } - break; - case 3896: - if ('t' == current) { - state = 3897; - return true; - } - break; - case 3897: - if ('y' == current) { - state = 3898; - return true; - } - break; - case 3898: - // cylcty; - if (';' == current) { - match = "\u232D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3899: - switch (current) { - case 'A': - state = 3900; - return true; - case 'H': - state = 3903; - return true; - case 'a': - state = 3906; - return true; - case 'b': - state = 3920; - return true; - case 'c': - state = 3929; - return true; - case 'd': - state = 3935; - return true; - case 'e': - state = 3948; - return true; - case 'f': - state = 3958; - return true; - case 'h': - state = 3964; - return true; - case 'i': - state = 3969; - return true; - case 'j': - state = 4003; - return true; - case 'l': - state = 4006; - return true; - case 'o': - state = 4014; - return true; - case 'r': - state = 4087; - return true; - case 's': - state = 4101; - return true; - case 't': - state = 4111; - return true; - case 'u': - state = 4118; - return true; - case 'w': - state = 4125; - return true; - case 'z': - state = 4131; - return true; - } - break; - case 3900: - if ('r' == current) { - state = 3901; - return true; - } - break; - case 3901: - if ('r' == current) { - state = 3902; - return true; - } - break; - case 3902: - // dArr; - if (';' == current) { - match = "\u21D3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3903: - if ('a' == current) { - state = 3904; - return true; - } - break; - case 3904: - if ('r' == current) { - state = 3905; - return true; - } - break; - case 3905: - // dHar; - if (';' == current) { - match = "\u2965"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3906: - switch (current) { - case 'g': - state = 3907; - return true; - case 'l': - state = 3911; - return true; - case 'r': - state = 3915; - return true; - case 's': - state = 3917; - return true; - } - break; - case 3907: - if ('g' == current) { - state = 3908; - return true; - } - break; - case 3908: - if ('e' == current) { - state = 3909; - return true; - } - break; - case 3909: - if ('r' == current) { - state = 3910; - return true; - } - break; - case 3910: - // dagger; - if (';' == current) { - match = "\u2020"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3911: - if ('e' == current) { - state = 3912; - return true; - } - break; - case 3912: - if ('t' == current) { - state = 3913; - return true; - } - break; - case 3913: - if ('h' == current) { - state = 3914; - return true; - } - break; - case 3914: - // daleth; - if (';' == current) { - match = "\u2138"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3915: - if ('r' == current) { - state = 3916; - return true; - } - break; - case 3916: - // darr; - if (';' == current) { - match = "\u2193"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3917: - if ('h' == current) { - state = 3918; - return true; - } - break; - case 3918: - // dash; - if (';' == current) { - match = "\u2010"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 3919; - return true; - } - break; - case 3919: - // dashv; - if (';' == current) { - match = "\u22A3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3920: - if ('k' == current) { - state = 3921; - return true; - } - else if ('l' == current) { - state = 3926; - return true; - } - break; - case 3921: - if ('a' == current) { - state = 3922; - return true; - } - break; - case 3922: - if ('r' == current) { - state = 3923; - return true; - } - break; - case 3923: - if ('o' == current) { - state = 3924; - return true; - } - break; - case 3924: - if ('w' == current) { - state = 3925; - return true; - } - break; - case 3925: - // dbkarow; - if (';' == current) { - match = "\u290F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3926: - if ('a' == current) { - state = 3927; - return true; - } - break; - case 3927: - if ('c' == current) { - state = 3928; - return true; - } - break; - case 3928: - // dblac; - if (';' == current) { - match = "\u02DD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3929: - if ('a' == current) { - state = 3930; - return true; - } - else if ('y' == current) { - state = 3934; - return true; - } - break; - case 3930: - if ('r' == current) { - state = 3931; - return true; - } - break; - case 3931: - if ('o' == current) { - state = 3932; - return true; - } - break; - case 3932: - if ('n' == current) { - state = 3933; - return true; - } - break; - case 3933: - // dcaron; - if (';' == current) { - match = "\u010F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3934: - // dcy; - if (';' == current) { - match = "\u0434"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3935: - switch (current) { - case ';': // dd; - match = "\u2146"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 3936; - return true; - case 'o': - state = 3943; - return true; - } - break; - case 3936: - if ('g' == current) { - state = 3937; - return true; - } - else if ('r' == current) { - state = 3941; - return true; - } - break; - case 3937: - if ('g' == current) { - state = 3938; - return true; - } - break; - case 3938: - if ('e' == current) { - state = 3939; - return true; - } - break; - case 3939: - if ('r' == current) { - state = 3940; - return true; - } - break; - case 3940: - // ddagger; - if (';' == current) { - match = "\u2021"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3941: - if ('r' == current) { - state = 3942; - return true; - } - break; - case 3942: - // ddarr; - if (';' == current) { - match = "\u21CA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3943: - if ('t' == current) { - state = 3944; - return true; - } - break; - case 3944: - if ('s' == current) { - state = 3945; - return true; - } - break; - case 3945: - if ('e' == current) { - state = 3946; - return true; - } - break; - case 3946: - if ('q' == current) { - state = 3947; - return true; - } - break; - case 3947: - // ddotseq; - if (';' == current) { - match = "\u2A77"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3948: - switch (current) { - case 'g': // deg - match = "\u00B0"; - matchLength = consumedCount; - state = 3949; - return true; - case 'l': - state = 3950; - return true; - case 'm': - state = 3953; - return true; - } - break; - case 3949: - // deg; - if (';' == current) { - match = "\u00B0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3950: - if ('t' == current) { - state = 3951; - return true; - } - break; - case 3951: - if ('a' == current) { - state = 3952; - return true; - } - break; - case 3952: - // delta; - if (';' == current) { - match = "\u03B4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3953: - if ('p' == current) { - state = 3954; - return true; - } - break; - case 3954: - if ('t' == current) { - state = 3955; - return true; - } - break; - case 3955: - if ('y' == current) { - state = 3956; - return true; - } - break; - case 3956: - if ('v' == current) { - state = 3957; - return true; - } - break; - case 3957: - // demptyv; - if (';' == current) { - match = "\u29B1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3958: - if ('i' == current) { - state = 3959; - return true; - } - else if ('r' == current) { - state = 3963; - return true; - } - break; - case 3959: - if ('s' == current) { - state = 3960; - return true; - } - break; - case 3960: - if ('h' == current) { - state = 3961; - return true; - } - break; - case 3961: - if ('t' == current) { - state = 3962; - return true; - } - break; - case 3962: - // dfisht; - if (';' == current) { - match = "\u297F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3963: - // dfr; - if (';' == current) { - match = "\uD835\uDD21"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3964: - if ('a' == current) { - state = 3965; - return true; - } - break; - case 3965: - if ('r' == current) { - state = 3966; - return true; - } - break; - case 3966: - if ('l' == current) { - state = 3967; - return true; - } - else if ('r' == current) { - state = 3968; - return true; - } - break; - case 3967: - // dharl; - if (';' == current) { - match = "\u21C3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3968: - // dharr; - if (';' == current) { - match = "\u21C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3969: - switch (current) { - case 'a': - state = 3970; - return true; - case 'e': - state = 3980; - return true; - case 'g': - state = 3981; - return true; - case 's': - state = 3986; - return true; - case 'v': - state = 3989; - return true; - } - break; - case 3970: - if ('m' == current) { - state = 3971; - return true; - } - break; - case 3971: - switch (current) { - case ';': // diam; - match = "\u22C4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'o': - state = 3972; - return true; - case 's': - state = 3979; - return true; - } - break; - case 3972: - if ('n' == current) { - state = 3973; - return true; - } - break; - case 3973: - if ('d' == current) { - state = 3974; - return true; - } - break; - case 3974: - // diamond; - if (';' == current) { - match = "\u22C4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 3975; - return true; - } - break; - case 3975: - if ('u' == current) { - state = 3976; - return true; - } - break; - case 3976: - if ('i' == current) { - state = 3977; - return true; - } - break; - case 3977: - if ('t' == current) { - state = 3978; - return true; - } - break; - case 3978: - // diamondsuit; - if (';' == current) { - match = "\u2666"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3979: - // diams; - if (';' == current) { - match = "\u2666"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3980: - // die; - if (';' == current) { - match = "\u00A8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3981: - if ('a' == current) { - state = 3982; - return true; - } - break; - case 3982: - if ('m' == current) { - state = 3983; - return true; - } - break; - case 3983: - if ('m' == current) { - state = 3984; - return true; - } - break; - case 3984: - if ('a' == current) { - state = 3985; - return true; - } - break; - case 3985: - // digamma; - if (';' == current) { - match = "\u03DD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3986: - if ('i' == current) { - state = 3987; - return true; - } - break; - case 3987: - if ('n' == current) { - state = 3988; - return true; - } - break; - case 3988: - // disin; - if (';' == current) { - match = "\u22F2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 3989: - switch (current) { - case ';': // div; - match = "\u00F7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'i': - state = 3990; - return true; - case 'o': - state = 4000; - return true; - } - break; - case 3990: - if ('d' == current) { - state = 3991; - return true; - } - break; - case 3991: - // divide - if ('e' == current) { - match = "\u00F7"; - matchLength = consumedCount; - state = 3992; - return true; - } - break; - case 3992: - // divide; - if (';' == current) { - match = "\u00F7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 3993; - return true; - } - break; - case 3993: - if ('n' == current) { - state = 3994; - return true; - } - break; - case 3994: - if ('t' == current) { - state = 3995; - return true; - } - break; - case 3995: - if ('i' == current) { - state = 3996; - return true; - } - break; - case 3996: - if ('m' == current) { - state = 3997; - return true; - } - break; - case 3997: - if ('e' == current) { - state = 3998; - return true; - } - break; - case 3998: - if ('s' == current) { - state = 3999; - return true; - } - break; - case 3999: - // divideontimes; - if (';' == current) { - match = "\u22C7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - } - return false; - } - - private boolean parse5(final int current) { - consumedCount++; - switch (state) { - case 4000: - if ('n' == current) { - state = 4001; - return true; - } - break; - case 4001: - if ('x' == current) { - state = 4002; - return true; - } - break; - case 4002: - // divonx; - if (';' == current) { - match = "\u22C7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4003: - if ('c' == current) { - state = 4004; - return true; - } - break; - case 4004: - if ('y' == current) { - state = 4005; - return true; - } - break; - case 4005: - // djcy; - if (';' == current) { - match = "\u0452"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4006: - if ('c' == current) { - state = 4007; - return true; - } - break; - case 4007: - if ('o' == current) { - state = 4008; - return true; - } - else if ('r' == current) { - state = 4011; - return true; - } - break; - case 4008: - if ('r' == current) { - state = 4009; - return true; - } - break; - case 4009: - if ('n' == current) { - state = 4010; - return true; - } - break; - case 4010: - // dlcorn; - if (';' == current) { - match = "\u231E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4011: - if ('o' == current) { - state = 4012; - return true; - } - break; - case 4012: - if ('p' == current) { - state = 4013; - return true; - } - break; - case 4013: - // dlcrop; - if (';' == current) { - match = "\u230D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4014: - switch (current) { - case 'l': - state = 4015; - return true; - case 'p': - state = 4019; - return true; - case 't': - state = 4021; - return true; - case 'u': - state = 4042; - return true; - case 'w': - state = 4054; - return true; - } - break; - case 4015: - if ('l' == current) { - state = 4016; - return true; - } - break; - case 4016: - if ('a' == current) { - state = 4017; - return true; - } - break; - case 4017: - if ('r' == current) { - state = 4018; - return true; - } - break; - case 4018: - // dollar; - if (';' == current) { - match = "$"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4019: - if ('f' == current) { - state = 4020; - return true; - } - break; - case 4020: - // dopf; - if (';' == current) { - match = "\uD835\uDD55"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4021: - switch (current) { - case ';': // dot; - match = "\u02D9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 4022; - return true; - case 'm': - state = 4027; - return true; - case 'p': - state = 4032; - return true; - case 's': - state = 4036; - return true; - } - break; - case 4022: - if ('q' == current) { - state = 4023; - return true; - } - break; - case 4023: - // doteq; - if (';' == current) { - match = "\u2250"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 4024; - return true; - } - break; - case 4024: - if ('o' == current) { - state = 4025; - return true; - } - break; - case 4025: - if ('t' == current) { - state = 4026; - return true; - } - break; - case 4026: - // doteqdot; - if (';' == current) { - match = "\u2251"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4027: - if ('i' == current) { - state = 4028; - return true; - } - break; - case 4028: - if ('n' == current) { - state = 4029; - return true; - } - break; - case 4029: - if ('u' == current) { - state = 4030; - return true; - } - break; - case 4030: - if ('s' == current) { - state = 4031; - return true; - } - break; - case 4031: - // dotminus; - if (';' == current) { - match = "\u2238"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4032: - if ('l' == current) { - state = 4033; - return true; - } - break; - case 4033: - if ('u' == current) { - state = 4034; - return true; - } - break; - case 4034: - if ('s' == current) { - state = 4035; - return true; - } - break; - case 4035: - // dotplus; - if (';' == current) { - match = "\u2214"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4036: - if ('q' == current) { - state = 4037; - return true; - } - break; - case 4037: - if ('u' == current) { - state = 4038; - return true; - } - break; - case 4038: - if ('a' == current) { - state = 4039; - return true; - } - break; - case 4039: - if ('r' == current) { - state = 4040; - return true; - } - break; - case 4040: - if ('e' == current) { - state = 4041; - return true; - } - break; - case 4041: - // dotsquare; - if (';' == current) { - match = "\u22A1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4042: - if ('b' == current) { - state = 4043; - return true; - } - break; - case 4043: - if ('l' == current) { - state = 4044; - return true; - } - break; - case 4044: - if ('e' == current) { - state = 4045; - return true; - } - break; - case 4045: - if ('b' == current) { - state = 4046; - return true; - } - break; - case 4046: - if ('a' == current) { - state = 4047; - return true; - } - break; - case 4047: - if ('r' == current) { - state = 4048; - return true; - } - break; - case 4048: - if ('w' == current) { - state = 4049; - return true; - } - break; - case 4049: - if ('e' == current) { - state = 4050; - return true; - } - break; - case 4050: - if ('d' == current) { - state = 4051; - return true; - } - break; - case 4051: - if ('g' == current) { - state = 4052; - return true; - } - break; - case 4052: - if ('e' == current) { - state = 4053; - return true; - } - break; - case 4053: - // doublebarwedge; - if (';' == current) { - match = "\u2306"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4054: - if ('n' == current) { - state = 4055; - return true; - } - break; - case 4055: - switch (current) { - case 'a': - state = 4056; - return true; - case 'd': - state = 4061; - return true; - case 'h': - state = 4071; - return true; - } - break; - case 4056: - if ('r' == current) { - state = 4057; - return true; - } - break; - case 4057: - if ('r' == current) { - state = 4058; - return true; - } - break; - case 4058: - if ('o' == current) { - state = 4059; - return true; - } - break; - case 4059: - if ('w' == current) { - state = 4060; - return true; - } - break; - case 4060: - // downarrow; - if (';' == current) { - match = "\u2193"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4061: - if ('o' == current) { - state = 4062; - return true; - } - break; - case 4062: - if ('w' == current) { - state = 4063; - return true; - } - break; - case 4063: - if ('n' == current) { - state = 4064; - return true; - } - break; - case 4064: - if ('a' == current) { - state = 4065; - return true; - } - break; - case 4065: - if ('r' == current) { - state = 4066; - return true; - } - break; - case 4066: - if ('r' == current) { - state = 4067; - return true; - } - break; - case 4067: - if ('o' == current) { - state = 4068; - return true; - } - break; - case 4068: - if ('w' == current) { - state = 4069; - return true; - } - break; - case 4069: - if ('s' == current) { - state = 4070; - return true; - } - break; - case 4070: - // downdownarrows; - if (';' == current) { - match = "\u21CA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4071: - if ('a' == current) { - state = 4072; - return true; - } - break; - case 4072: - if ('r' == current) { - state = 4073; - return true; - } - break; - case 4073: - if ('p' == current) { - state = 4074; - return true; - } - break; - case 4074: - if ('o' == current) { - state = 4075; - return true; - } - break; - case 4075: - if ('o' == current) { - state = 4076; - return true; - } - break; - case 4076: - if ('n' == current) { - state = 4077; - return true; - } - break; - case 4077: - if ('l' == current) { - state = 4078; - return true; - } - else if ('r' == current) { - state = 4082; - return true; - } - break; - case 4078: - if ('e' == current) { - state = 4079; - return true; - } - break; - case 4079: - if ('f' == current) { - state = 4080; - return true; - } - break; - case 4080: - if ('t' == current) { - state = 4081; - return true; - } - break; - case 4081: - // downharpoonleft; - if (';' == current) { - match = "\u21C3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4082: - if ('i' == current) { - state = 4083; - return true; - } - break; - case 4083: - if ('g' == current) { - state = 4084; - return true; - } - break; - case 4084: - if ('h' == current) { - state = 4085; - return true; - } - break; - case 4085: - if ('t' == current) { - state = 4086; - return true; - } - break; - case 4086: - // downharpoonright; - if (';' == current) { - match = "\u21C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4087: - if ('b' == current) { - state = 4088; - return true; - } - else if ('c' == current) { - state = 4094; - return true; - } - break; - case 4088: - if ('k' == current) { - state = 4089; - return true; - } - break; - case 4089: - if ('a' == current) { - state = 4090; - return true; - } - break; - case 4090: - if ('r' == current) { - state = 4091; - return true; - } - break; - case 4091: - if ('o' == current) { - state = 4092; - return true; - } - break; - case 4092: - if ('w' == current) { - state = 4093; - return true; - } - break; - case 4093: - // drbkarow; - if (';' == current) { - match = "\u2910"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4094: - if ('o' == current) { - state = 4095; - return true; - } - else if ('r' == current) { - state = 4098; - return true; - } - break; - case 4095: - if ('r' == current) { - state = 4096; - return true; - } - break; - case 4096: - if ('n' == current) { - state = 4097; - return true; - } - break; - case 4097: - // drcorn; - if (';' == current) { - match = "\u231F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4098: - if ('o' == current) { - state = 4099; - return true; - } - break; - case 4099: - if ('p' == current) { - state = 4100; - return true; - } - break; - case 4100: - // drcrop; - if (';' == current) { - match = "\u230C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4101: - switch (current) { - case 'c': - state = 4102; - return true; - case 'o': - state = 4105; - return true; - case 't': - state = 4107; - return true; - } - break; - case 4102: - if ('r' == current) { - state = 4103; - return true; - } - else if ('y' == current) { - state = 4104; - return true; - } - break; - case 4103: - // dscr; - if (';' == current) { - match = "\uD835\uDCB9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4104: - // dscy; - if (';' == current) { - match = "\u0455"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4105: - if ('l' == current) { - state = 4106; - return true; - } - break; - case 4106: - // dsol; - if (';' == current) { - match = "\u29F6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4107: - if ('r' == current) { - state = 4108; - return true; - } - break; - case 4108: - if ('o' == current) { - state = 4109; - return true; - } - break; - case 4109: - if ('k' == current) { - state = 4110; - return true; - } - break; - case 4110: - // dstrok; - if (';' == current) { - match = "\u0111"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4111: - if ('d' == current) { - state = 4112; - return true; - } - else if ('r' == current) { - state = 4115; - return true; - } - break; - case 4112: - if ('o' == current) { - state = 4113; - return true; - } - break; - case 4113: - if ('t' == current) { - state = 4114; - return true; - } - break; - case 4114: - // dtdot; - if (';' == current) { - match = "\u22F1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4115: - if ('i' == current) { - state = 4116; - return true; - } - break; - case 4116: - // dtri; - if (';' == current) { - match = "\u25BF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('f' == current) { - state = 4117; - return true; - } - break; - case 4117: - // dtrif; - if (';' == current) { - match = "\u25BE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4118: - if ('a' == current) { - state = 4119; - return true; - } - else if ('h' == current) { - state = 4122; - return true; - } - break; - case 4119: - if ('r' == current) { - state = 4120; - return true; - } - break; - case 4120: - if ('r' == current) { - state = 4121; - return true; - } - break; - case 4121: - // duarr; - if (';' == current) { - match = "\u21F5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4122: - if ('a' == current) { - state = 4123; - return true; - } - break; - case 4123: - if ('r' == current) { - state = 4124; - return true; - } - break; - case 4124: - // duhar; - if (';' == current) { - match = "\u296F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4125: - if ('a' == current) { - state = 4126; - return true; - } - break; - case 4126: - if ('n' == current) { - state = 4127; - return true; - } - break; - case 4127: - if ('g' == current) { - state = 4128; - return true; - } - break; - case 4128: - if ('l' == current) { - state = 4129; - return true; - } - break; - case 4129: - if ('e' == current) { - state = 4130; - return true; - } - break; - case 4130: - // dwangle; - if (';' == current) { - match = "\u29A6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4131: - if ('c' == current) { - state = 4132; - return true; - } - else if ('i' == current) { - state = 4134; - return true; - } - break; - case 4132: - if ('y' == current) { - state = 4133; - return true; - } - break; - case 4133: - // dzcy; - if (';' == current) { - match = "\u045F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4134: - if ('g' == current) { - state = 4135; - return true; - } - break; - case 4135: - if ('r' == current) { - state = 4136; - return true; - } - break; - case 4136: - if ('a' == current) { - state = 4137; - return true; - } - break; - case 4137: - if ('r' == current) { - state = 4138; - return true; - } - break; - case 4138: - if ('r' == current) { - state = 4139; - return true; - } - break; - case 4139: - // dzigrarr; - if (';' == current) { - match = "\u27FF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4140: - switch (current) { - case 'D': - state = 4141; - return true; - case 'a': - state = 4147; - return true; - case 'c': - state = 4156; - return true; - case 'd': - state = 4169; - return true; - case 'e': - state = 4172; - return true; - case 'f': - state = 4173; - return true; - case 'g': - state = 4178; - return true; - case 'l': - state = 4187; - return true; - case 'm': - state = 4199; - return true; - case 'n': - state = 4215; - return true; - case 'o': - state = 4219; - return true; - case 'p': - state = 4225; - return true; - case 'q': - state = 4239; - return true; - case 'r': - state = 4279; - return true; - case 's': - state = 4286; - return true; - case 't': - state = 4294; - return true; - case 'u': - state = 4297; - return true; - case 'x': - state = 4302; - return true; - } - break; - case 4141: - if ('D' == current) { - state = 4142; - return true; - } - else if ('o' == current) { - state = 4145; - return true; - } - break; - case 4142: - if ('o' == current) { - state = 4143; - return true; - } - break; - case 4143: - if ('t' == current) { - state = 4144; - return true; - } - break; - case 4144: - // eDDot; - if (';' == current) { - match = "\u2A77"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4145: - if ('t' == current) { - state = 4146; - return true; - } - break; - case 4146: - // eDot; - if (';' == current) { - match = "\u2251"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4147: - if ('c' == current) { - state = 4148; - return true; - } - else if ('s' == current) { - state = 4152; - return true; - } - break; - case 4148: - if ('u' == current) { - state = 4149; - return true; - } - break; - case 4149: - if ('t' == current) { - state = 4150; - return true; - } - break; - case 4150: - // eacute - if ('e' == current) { - match = "\u00E9"; - matchLength = consumedCount; - state = 4151; - return true; - } - break; - case 4151: - // eacute; - if (';' == current) { - match = "\u00E9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4152: - if ('t' == current) { - state = 4153; - return true; - } - break; - case 4153: - if ('e' == current) { - state = 4154; - return true; - } - break; - case 4154: - if ('r' == current) { - state = 4155; - return true; - } - break; - case 4155: - // easter; - if (';' == current) { - match = "\u2A6E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4156: - switch (current) { - case 'a': - state = 4157; - return true; - case 'i': - state = 4161; - return true; - case 'o': - state = 4164; - return true; - case 'y': - state = 4168; - return true; - } - break; - case 4157: - if ('r' == current) { - state = 4158; - return true; - } - break; - case 4158: - if ('o' == current) { - state = 4159; - return true; - } - break; - case 4159: - if ('n' == current) { - state = 4160; - return true; - } - break; - case 4160: - // ecaron; - if (';' == current) { - match = "\u011B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4161: - if ('r' == current) { - state = 4162; - return true; - } - break; - case 4162: - // ecir; - if (';' == current) { - match = "\u2256"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - // ecirc - else if ('c' == current) { - match = "\u00EA"; - matchLength = consumedCount; - state = 4163; - return true; - } - break; - case 4163: - // ecirc; - if (';' == current) { - match = "\u00EA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4164: - if ('l' == current) { - state = 4165; - return true; - } - break; - case 4165: - if ('o' == current) { - state = 4166; - return true; - } - break; - case 4166: - if ('n' == current) { - state = 4167; - return true; - } - break; - case 4167: - // ecolon; - if (';' == current) { - match = "\u2255"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4168: - // ecy; - if (';' == current) { - match = "\u044D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4169: - if ('o' == current) { - state = 4170; - return true; - } - break; - case 4170: - if ('t' == current) { - state = 4171; - return true; - } - break; - case 4171: - // edot; - if (';' == current) { - match = "\u0117"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4172: - // ee; - if (';' == current) { - match = "\u2147"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4173: - if ('D' == current) { - state = 4174; - return true; - } - else if ('r' == current) { - state = 4177; - return true; - } - break; - case 4174: - if ('o' == current) { - state = 4175; - return true; - } - break; - case 4175: - if ('t' == current) { - state = 4176; - return true; - } - break; - case 4176: - // efDot; - if (';' == current) { - match = "\u2252"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4177: - // efr; - if (';' == current) { - match = "\uD835\uDD22"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4178: - switch (current) { - case ';': // eg; - match = "\u2A9A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'r': - state = 4179; - return true; - case 's': - state = 4183; - return true; - } - break; - case 4179: - if ('a' == current) { - state = 4180; - return true; - } - break; - case 4180: - if ('v' == current) { - state = 4181; - return true; - } - break; - case 4181: - // egrave - if ('e' == current) { - match = "\u00E8"; - matchLength = consumedCount; - state = 4182; - return true; - } - break; - case 4182: - // egrave; - if (';' == current) { - match = "\u00E8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4183: - // egs; - if (';' == current) { - match = "\u2A96"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 4184; - return true; - } - break; - case 4184: - if ('o' == current) { - state = 4185; - return true; - } - break; - case 4185: - if ('t' == current) { - state = 4186; - return true; - } - break; - case 4186: - // egsdot; - if (';' == current) { - match = "\u2A98"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4187: - switch (current) { - case ';': // el; - match = "\u2A99"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'i': - state = 4188; - return true; - case 'l': - state = 4194; - return true; - case 's': - state = 4195; - return true; - } - break; - case 4188: - if ('n' == current) { - state = 4189; - return true; - } - break; - case 4189: - if ('t' == current) { - state = 4190; - return true; - } - break; - case 4190: - if ('e' == current) { - state = 4191; - return true; - } - break; - case 4191: - if ('r' == current) { - state = 4192; - return true; - } - break; - case 4192: - if ('s' == current) { - state = 4193; - return true; - } - break; - case 4193: - // elinters; - if (';' == current) { - match = "\u23E7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4194: - // ell; - if (';' == current) { - match = "\u2113"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4195: - // els; - if (';' == current) { - match = "\u2A95"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 4196; - return true; - } - break; - case 4196: - if ('o' == current) { - state = 4197; - return true; - } - break; - case 4197: - if ('t' == current) { - state = 4198; - return true; - } - break; - case 4198: - // elsdot; - if (';' == current) { - match = "\u2A97"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4199: - switch (current) { - case 'a': - state = 4200; - return true; - case 'p': - state = 4203; - return true; - case 's': - state = 4210; - return true; - } - break; - case 4200: - if ('c' == current) { - state = 4201; - return true; - } - break; - case 4201: - if ('r' == current) { - state = 4202; - return true; - } - break; - case 4202: - // emacr; - if (';' == current) { - match = "\u0113"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4203: - if ('t' == current) { - state = 4204; - return true; - } - break; - case 4204: - if ('y' == current) { - state = 4205; - return true; - } - break; - case 4205: - switch (current) { - case ';': // empty; - match = "\u2205"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 's': - state = 4206; - return true; - case 'v': - state = 4209; - return true; - } - break; - case 4206: - if ('e' == current) { - state = 4207; - return true; - } - break; - case 4207: - if ('t' == current) { - state = 4208; - return true; - } - break; - case 4208: - // emptyset; - if (';' == current) { - match = "\u2205"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4209: - // emptyv; - if (';' == current) { - match = "\u2205"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4210: - if ('p' == current) { - state = 4211; - return true; - } - break; - case 4211: - if ('1' == current) { - state = 4212; - return true; - } - // emsp; - else if (';' == current) { - match = "\u2003"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4212: - if ('3' == current) { - state = 4213; - return true; - } - else if ('4' == current) { - state = 4214; - return true; - } - break; - case 4213: - // emsp13; - if (';' == current) { - match = "\u2004"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4214: - // emsp14; - if (';' == current) { - match = "\u2005"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4215: - if ('g' == current) { - state = 4216; - return true; - } - else if ('s' == current) { - state = 4217; - return true; - } - break; - case 4216: - // eng; - if (';' == current) { - match = "\u014B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4217: - if ('p' == current) { - state = 4218; - return true; - } - break; - case 4218: - // ensp; - if (';' == current) { - match = "\u2002"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4219: - if ('g' == current) { - state = 4220; - return true; - } - else if ('p' == current) { - state = 4223; - return true; - } - break; - case 4220: - if ('o' == current) { - state = 4221; - return true; - } - break; - case 4221: - if ('n' == current) { - state = 4222; - return true; - } - break; - case 4222: - // eogon; - if (';' == current) { - match = "\u0119"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4223: - if ('f' == current) { - state = 4224; - return true; - } - break; - case 4224: - // eopf; - if (';' == current) { - match = "\uD835\uDD56"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4225: - switch (current) { - case 'a': - state = 4226; - return true; - case 'l': - state = 4230; - return true; - case 's': - state = 4233; - return true; - } - break; - case 4226: - if ('r' == current) { - state = 4227; - return true; - } - break; - case 4227: - // epar; - if (';' == current) { - match = "\u22D5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 4228; - return true; - } - break; - case 4228: - if ('l' == current) { - state = 4229; - return true; - } - break; - case 4229: - // eparsl; - if (';' == current) { - match = "\u29E3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4230: - if ('u' == current) { - state = 4231; - return true; - } - break; - case 4231: - if ('s' == current) { - state = 4232; - return true; - } - break; - case 4232: - // eplus; - if (';' == current) { - match = "\u2A71"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4233: - if ('i' == current) { - state = 4234; - return true; - } - break; - case 4234: - switch (current) { - case ';': // epsi; - match = "\u03B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'l': - state = 4235; - return true; - case 'v': - state = 4238; - return true; - } - break; - case 4235: - if ('o' == current) { - state = 4236; - return true; - } - break; - case 4236: - if ('n' == current) { - state = 4237; - return true; - } - break; - case 4237: - // epsilon; - if (';' == current) { - match = "\u03B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4238: - // epsiv; - if (';' == current) { - match = "\u03F5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4239: - switch (current) { - case 'c': - state = 4240; - return true; - case 's': - state = 4248; - return true; - case 'u': - state = 4262; - return true; - case 'v': - state = 4273; - return true; - } - break; - case 4240: - if ('i' == current) { - state = 4241; - return true; - } - else if ('o' == current) { - state = 4244; - return true; - } - break; - case 4241: - if ('r' == current) { - state = 4242; - return true; - } - break; - case 4242: - if ('c' == current) { - state = 4243; - return true; - } - break; - case 4243: - // eqcirc; - if (';' == current) { - match = "\u2256"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4244: - if ('l' == current) { - state = 4245; - return true; - } - break; - case 4245: - if ('o' == current) { - state = 4246; - return true; - } - break; - case 4246: - if ('n' == current) { - state = 4247; - return true; - } - break; - case 4247: - // eqcolon; - if (';' == current) { - match = "\u2255"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4248: - if ('i' == current) { - state = 4249; - return true; - } - else if ('l' == current) { - state = 4251; - return true; - } - break; - case 4249: - if ('m' == current) { - state = 4250; - return true; - } - break; - case 4250: - // eqsim; - if (';' == current) { - match = "\u2242"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4251: - if ('a' == current) { - state = 4252; - return true; - } - break; - case 4252: - if ('n' == current) { - state = 4253; - return true; - } - break; - case 4253: - if ('t' == current) { - state = 4254; - return true; - } - break; - case 4254: - if ('g' == current) { - state = 4255; - return true; - } - else if ('l' == current) { - state = 4258; - return true; - } - break; - case 4255: - if ('t' == current) { - state = 4256; - return true; - } - break; - case 4256: - if ('r' == current) { - state = 4257; - return true; - } - break; - case 4257: - // eqslantgtr; - if (';' == current) { - match = "\u2A96"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4258: - if ('e' == current) { - state = 4259; - return true; - } - break; - case 4259: - if ('s' == current) { - state = 4260; - return true; - } - break; - case 4260: - if ('s' == current) { - state = 4261; - return true; - } - break; - case 4261: - // eqslantless; - if (';' == current) { - match = "\u2A95"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4262: - switch (current) { - case 'a': - state = 4263; - return true; - case 'e': - state = 4266; - return true; - case 'i': - state = 4269; - return true; - } - break; - case 4263: - if ('l' == current) { - state = 4264; - return true; - } - break; - case 4264: - if ('s' == current) { - state = 4265; - return true; - } - break; - case 4265: - // equals; - if (';' == current) { - match = "="; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4266: - if ('s' == current) { - state = 4267; - return true; - } - break; - case 4267: - if ('t' == current) { - state = 4268; - return true; - } - break; - case 4268: - // equest; - if (';' == current) { - match = "\u225F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4269: - if ('v' == current) { - state = 4270; - return true; - } - break; - case 4270: - // equiv; - if (';' == current) { - match = "\u2261"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('D' == current) { - state = 4271; - return true; - } - break; - case 4271: - if ('D' == current) { - state = 4272; - return true; - } - break; - case 4272: - // equivDD; - if (';' == current) { - match = "\u2A78"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4273: - if ('p' == current) { - state = 4274; - return true; - } - break; - case 4274: - if ('a' == current) { - state = 4275; - return true; - } - break; - case 4275: - if ('r' == current) { - state = 4276; - return true; - } - break; - case 4276: - if ('s' == current) { - state = 4277; - return true; - } - break; - case 4277: - if ('l' == current) { - state = 4278; - return true; - } - break; - case 4278: - // eqvparsl; - if (';' == current) { - match = "\u29E5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4279: - if ('D' == current) { - state = 4280; - return true; - } - else if ('a' == current) { - state = 4283; - return true; - } - break; - case 4280: - if ('o' == current) { - state = 4281; - return true; - } - break; - case 4281: - if ('t' == current) { - state = 4282; - return true; - } - break; - case 4282: - // erDot; - if (';' == current) { - match = "\u2253"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4283: - if ('r' == current) { - state = 4284; - return true; - } - break; - case 4284: - if ('r' == current) { - state = 4285; - return true; - } - break; - case 4285: - // erarr; - if (';' == current) { - match = "\u2971"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4286: - switch (current) { - case 'c': - state = 4287; - return true; - case 'd': - state = 4289; - return true; - case 'i': - state = 4292; - return true; - } - break; - case 4287: - if ('r' == current) { - state = 4288; - return true; - } - break; - case 4288: - // escr; - if (';' == current) { - match = "\u212F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4289: - if ('o' == current) { - state = 4290; - return true; - } - break; - case 4290: - if ('t' == current) { - state = 4291; - return true; - } - break; - case 4291: - // esdot; - if (';' == current) { - match = "\u2250"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4292: - if ('m' == current) { - state = 4293; - return true; - } - break; - case 4293: - // esim; - if (';' == current) { - match = "\u2242"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4294: - if ('a' == current) { - state = 4295; - return true; - } - // eth - else if ('h' == current) { - match = "\u00F0"; - matchLength = consumedCount; - state = 4296; - return true; - } - break; - case 4295: - // eta; - if (';' == current) { - match = "\u03B7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4296: - // eth; - if (';' == current) { - match = "\u00F0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4297: - if ('m' == current) { - state = 4298; - return true; - } - else if ('r' == current) { - state = 4300; - return true; - } - break; - case 4298: - // euml - if ('l' == current) { - match = "\u00EB"; - matchLength = consumedCount; - state = 4299; - return true; - } - break; - case 4299: - // euml; - if (';' == current) { - match = "\u00EB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4300: - if ('o' == current) { - state = 4301; - return true; - } - break; - case 4301: - // euro; - if (';' == current) { - match = "\u20AC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4302: - switch (current) { - case 'c': - state = 4303; - return true; - case 'i': - state = 4305; - return true; - case 'p': - state = 4308; - return true; - } - break; - case 4303: - if ('l' == current) { - state = 4304; - return true; - } - break; - case 4304: - // excl; - if (';' == current) { - match = "!"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4305: - if ('s' == current) { - state = 4306; - return true; - } - break; - case 4306: - if ('t' == current) { - state = 4307; - return true; - } - break; - case 4307: - // exist; - if (';' == current) { - match = "\u2203"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4308: - if ('e' == current) { - state = 4309; - return true; - } - else if ('o' == current) { - state = 4317; - return true; - } - break; - case 4309: - if ('c' == current) { - state = 4310; - return true; - } - break; - case 4310: - if ('t' == current) { - state = 4311; - return true; - } - break; - case 4311: - if ('a' == current) { - state = 4312; - return true; - } - break; - case 4312: - if ('t' == current) { - state = 4313; - return true; - } - break; - case 4313: - if ('i' == current) { - state = 4314; - return true; - } - break; - case 4314: - if ('o' == current) { - state = 4315; - return true; - } - break; - case 4315: - if ('n' == current) { - state = 4316; - return true; - } - break; - case 4316: - // expectation; - if (';' == current) { - match = "\u2130"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4317: - if ('n' == current) { - state = 4318; - return true; - } - break; - case 4318: - if ('e' == current) { - state = 4319; - return true; - } - break; - case 4319: - if ('n' == current) { - state = 4320; - return true; - } - break; - case 4320: - if ('t' == current) { - state = 4321; - return true; - } - break; - case 4321: - if ('i' == current) { - state = 4322; - return true; - } - break; - case 4322: - if ('a' == current) { - state = 4323; - return true; - } - break; - case 4323: - if ('l' == current) { - state = 4324; - return true; - } - break; - case 4324: - if ('e' == current) { - state = 4325; - return true; - } - break; - case 4325: - // exponentiale; - if (';' == current) { - match = "\u2147"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4326: - switch (current) { - case 'a': - state = 4327; - return true; - case 'c': - state = 4339; - return true; - case 'e': - state = 4341; - return true; - case 'f': - state = 4346; - return true; - case 'i': - state = 4358; - return true; - case 'j': - state = 4362; - return true; - case 'l': - state = 4366; - return true; - case 'n': - state = 4375; - return true; - case 'o': - state = 4378; - return true; - case 'p': - state = 4387; - return true; - case 'r': - state = 4394; - return true; - case 's': - state = 4423; - return true; - } - break; - case 4327: - if ('l' == current) { - state = 4328; - return true; - } - break; - case 4328: - if ('l' == current) { - state = 4329; - return true; - } - break; - case 4329: - if ('i' == current) { - state = 4330; - return true; - } - break; - case 4330: - if ('n' == current) { - state = 4331; - return true; - } - break; - case 4331: - if ('g' == current) { - state = 4332; - return true; - } - break; - case 4332: - if ('d' == current) { - state = 4333; - return true; - } - break; - case 4333: - if ('o' == current) { - state = 4334; - return true; - } - break; - case 4334: - if ('t' == current) { - state = 4335; - return true; - } - break; - case 4335: - if ('s' == current) { - state = 4336; - return true; - } - break; - case 4336: - if ('e' == current) { - state = 4337; - return true; - } - break; - case 4337: - if ('q' == current) { - state = 4338; - return true; - } - break; - case 4338: - // fallingdotseq; - if (';' == current) { - match = "\u2252"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4339: - if ('y' == current) { - state = 4340; - return true; - } - break; - case 4340: - // fcy; - if (';' == current) { - match = "\u0444"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4341: - if ('m' == current) { - state = 4342; - return true; - } - break; - case 4342: - if ('a' == current) { - state = 4343; - return true; - } - break; - case 4343: - if ('l' == current) { - state = 4344; - return true; - } - break; - case 4344: - if ('e' == current) { - state = 4345; - return true; - } - break; - case 4345: - // female; - if (';' == current) { - match = "\u2640"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4346: - switch (current) { - case 'i': - state = 4347; - return true; - case 'l': - state = 4351; - return true; - case 'r': - state = 4357; - return true; - } - break; - case 4347: - if ('l' == current) { - state = 4348; - return true; - } - break; - case 4348: - if ('i' == current) { - state = 4349; - return true; - } - break; - case 4349: - if ('g' == current) { - state = 4350; - return true; - } - break; - case 4350: - // ffilig; - if (';' == current) { - match = "\uFB03"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4351: - if ('i' == current) { - state = 4352; - return true; - } - else if ('l' == current) { - state = 4354; - return true; - } - break; - case 4352: - if ('g' == current) { - state = 4353; - return true; - } - break; - case 4353: - // fflig; - if (';' == current) { - match = "\uFB00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4354: - if ('i' == current) { - state = 4355; - return true; - } - break; - case 4355: - if ('g' == current) { - state = 4356; - return true; - } - break; - case 4356: - // ffllig; - if (';' == current) { - match = "\uFB04"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4357: - // ffr; - if (';' == current) { - match = "\uD835\uDD23"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4358: - if ('l' == current) { - state = 4359; - return true; - } - break; - case 4359: - if ('i' == current) { - state = 4360; - return true; - } - break; - case 4360: - if ('g' == current) { - state = 4361; - return true; - } - break; - case 4361: - // filig; - if (';' == current) { - match = "\uFB01"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4362: - if ('l' == current) { - state = 4363; - return true; - } - break; - case 4363: - if ('i' == current) { - state = 4364; - return true; - } - break; - case 4364: - if ('g' == current) { - state = 4365; - return true; - } - break; - case 4365: - // fjlig; - if (';' == current) { - match = "fj"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4366: - switch (current) { - case 'a': - state = 4367; - return true; - case 'l': - state = 4369; - return true; - case 't': - state = 4372; - return true; - } - break; - case 4367: - if ('t' == current) { - state = 4368; - return true; - } - break; - case 4368: - // flat; - if (';' == current) { - match = "\u266D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4369: - if ('i' == current) { - state = 4370; - return true; - } - break; - case 4370: - if ('g' == current) { - state = 4371; - return true; - } - break; - case 4371: - // fllig; - if (';' == current) { - match = "\uFB02"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4372: - if ('n' == current) { - state = 4373; - return true; - } - break; - case 4373: - if ('s' == current) { - state = 4374; - return true; - } - break; - case 4374: - // fltns; - if (';' == current) { - match = "\u25B1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4375: - if ('o' == current) { - state = 4376; - return true; - } - break; - case 4376: - if ('f' == current) { - state = 4377; - return true; - } - break; - case 4377: - // fnof; - if (';' == current) { - match = "\u0192"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4378: - if ('p' == current) { - state = 4379; - return true; - } - else if ('r' == current) { - state = 4381; - return true; - } - break; - case 4379: - if ('f' == current) { - state = 4380; - return true; - } - break; - case 4380: - // fopf; - if (';' == current) { - match = "\uD835\uDD57"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4381: - if ('a' == current) { - state = 4382; - return true; - } - else if ('k' == current) { - state = 4385; - return true; - } - break; - case 4382: - if ('l' == current) { - state = 4383; - return true; - } - break; - case 4383: - if ('l' == current) { - state = 4384; - return true; - } - break; - case 4384: - // forall; - if (';' == current) { - match = "\u2200"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4385: - // fork; - if (';' == current) { - match = "\u22D4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 4386; - return true; - } - break; - case 4386: - // forkv; - if (';' == current) { - match = "\u2AD9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4387: - if ('a' == current) { - state = 4388; - return true; - } - break; - case 4388: - if ('r' == current) { - state = 4389; - return true; - } - break; - case 4389: - if ('t' == current) { - state = 4390; - return true; - } - break; - case 4390: - if ('i' == current) { - state = 4391; - return true; - } - break; - case 4391: - if ('n' == current) { - state = 4392; - return true; - } - break; - case 4392: - if ('t' == current) { - state = 4393; - return true; - } - break; - case 4393: - // fpartint; - if (';' == current) { - match = "\u2A0D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4394: - if ('a' == current) { - state = 4395; - return true; - } - else if ('o' == current) { - state = 4420; - return true; - } - break; - case 4395: - if ('c' == current) { - state = 4396; - return true; - } - else if ('s' == current) { - state = 4418; - return true; - } - break; - case 4396: - switch (current) { - case '1': - state = 4397; - return true; - case '2': - state = 4404; - return true; - case '3': - state = 4407; - return true; - case '4': - state = 4411; - return true; - case '5': - state = 4413; - return true; - case '7': - state = 4416; - return true; - } - break; - case 4397: - switch (current) { - case '2': // frac12 - match = "\u00BD"; - matchLength = consumedCount; - state = 4398; - return true; - case '3': - state = 4399; - return true; - case '4': // frac14 - match = "\u00BC"; - matchLength = consumedCount; - state = 4400; - return true; - case '5': - state = 4401; - return true; - case '6': - state = 4402; - return true; - case '8': - state = 4403; - return true; - } - break; - case 4398: - // frac12; - if (';' == current) { - match = "\u00BD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4399: - // frac13; - if (';' == current) { - match = "\u2153"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4400: - // frac14; - if (';' == current) { - match = "\u00BC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4401: - // frac15; - if (';' == current) { - match = "\u2155"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4402: - // frac16; - if (';' == current) { - match = "\u2159"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4403: - // frac18; - if (';' == current) { - match = "\u215B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4404: - if ('3' == current) { - state = 4405; - return true; - } - else if ('5' == current) { - state = 4406; - return true; - } - break; - case 4405: - // frac23; - if (';' == current) { - match = "\u2154"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4406: - // frac25; - if (';' == current) { - match = "\u2156"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4407: - switch (current) { - case '4': // frac34 - match = "\u00BE"; - matchLength = consumedCount; - state = 4408; - return true; - case '5': - state = 4409; - return true; - case '8': - state = 4410; - return true; - } - break; - case 4408: - // frac34; - if (';' == current) { - match = "\u00BE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4409: - // frac35; - if (';' == current) { - match = "\u2157"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4410: - // frac38; - if (';' == current) { - match = "\u215C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4411: - if ('5' == current) { - state = 4412; - return true; - } - break; - case 4412: - // frac45; - if (';' == current) { - match = "\u2158"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4413: - if ('6' == current) { - state = 4414; - return true; - } - else if ('8' == current) { - state = 4415; - return true; - } - break; - case 4414: - // frac56; - if (';' == current) { - match = "\u215A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4415: - // frac58; - if (';' == current) { - match = "\u215D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4416: - if ('8' == current) { - state = 4417; - return true; - } - break; - case 4417: - // frac78; - if (';' == current) { - match = "\u215E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4418: - if ('l' == current) { - state = 4419; - return true; - } - break; - case 4419: - // frasl; - if (';' == current) { - match = "\u2044"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4420: - if ('w' == current) { - state = 4421; - return true; - } - break; - case 4421: - if ('n' == current) { - state = 4422; - return true; - } - break; - case 4422: - // frown; - if (';' == current) { - match = "\u2322"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4423: - if ('c' == current) { - state = 4424; - return true; - } - break; - case 4424: - if ('r' == current) { - state = 4425; - return true; - } - break; - case 4425: - // fscr; - if (';' == current) { - match = "\uD835\uDCBB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4426: - switch (current) { - case 'E': - state = 4427; - return true; - case 'a': - state = 4429; - return true; - case 'b': - state = 4439; - return true; - case 'c': - state = 4444; - return true; - case 'd': - state = 4449; - return true; - case 'e': - state = 4452; - return true; - case 'f': - state = 4472; - return true; - case 'g': - state = 4474; - return true; - case 'i': - state = 4476; - return true; - case 'j': - state = 4480; - return true; - case 'l': - state = 4483; - return true; - case 'n': - state = 4487; - return true; - case 'o': - state = 4501; - return true; - case 'r': - state = 4504; - return true; - case 's': - state = 4508; - return true; - case 't': // gt - match = ">"; - matchLength = consumedCount; - state = 4515; - return true; - case 'v': - state = 4562; - return true; - } - break; - case 4427: - // gE; - if (';' == current) { - match = "\u2267"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('l' == current) { - state = 4428; - return true; - } - break; - case 4428: - // gEl; - if (';' == current) { - match = "\u2A8C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4429: - switch (current) { - case 'c': - state = 4430; - return true; - case 'm': - state = 4434; - return true; - case 'p': - state = 4438; - return true; - } - break; - case 4430: - if ('u' == current) { - state = 4431; - return true; - } - break; - case 4431: - if ('t' == current) { - state = 4432; - return true; - } - break; - case 4432: - if ('e' == current) { - state = 4433; - return true; - } - break; - case 4433: - // gacute; - if (';' == current) { - match = "\u01F5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4434: - if ('m' == current) { - state = 4435; - return true; - } - break; - case 4435: - if ('a' == current) { - state = 4436; - return true; - } - break; - case 4436: - // gamma; - if (';' == current) { - match = "\u03B3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 4437; - return true; - } - break; - case 4437: - // gammad; - if (';' == current) { - match = "\u03DD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4438: - // gap; - if (';' == current) { - match = "\u2A86"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4439: - if ('r' == current) { - state = 4440; - return true; - } - break; - case 4440: - if ('e' == current) { - state = 4441; - return true; - } - break; - case 4441: - if ('v' == current) { - state = 4442; - return true; - } - break; - case 4442: - if ('e' == current) { - state = 4443; - return true; - } - break; - case 4443: - // gbreve; - if (';' == current) { - match = "\u011F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4444: - if ('i' == current) { - state = 4445; - return true; - } - else if ('y' == current) { - state = 4448; - return true; - } - break; - case 4445: - if ('r' == current) { - state = 4446; - return true; - } - break; - case 4446: - if ('c' == current) { - state = 4447; - return true; - } - break; - case 4447: - // gcirc; - if (';' == current) { - match = "\u011D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4448: - // gcy; - if (';' == current) { - match = "\u0433"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4449: - if ('o' == current) { - state = 4450; - return true; - } - break; - case 4450: - if ('t' == current) { - state = 4451; - return true; - } - break; - case 4451: - // gdot; - if (';' == current) { - match = "\u0121"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4452: - switch (current) { - case ';': // ge; - match = "\u2265"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'l': - state = 4453; - return true; - case 'q': - state = 4454; - return true; - case 's': - state = 4461; - return true; - } - break; - case 4453: - // gel; - if (';' == current) { - match = "\u22DB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4454: - switch (current) { - case ';': // geq; - match = "\u2265"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'q': - state = 4455; - return true; - case 's': - state = 4456; - return true; - } - break; - case 4455: - // geqq; - if (';' == current) { - match = "\u2267"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4456: - if ('l' == current) { - state = 4457; - return true; - } - break; - case 4457: - if ('a' == current) { - state = 4458; - return true; - } - break; - case 4458: - if ('n' == current) { - state = 4459; - return true; - } - break; - case 4459: - if ('t' == current) { - state = 4460; - return true; - } - break; - case 4460: - // geqslant; - if (';' == current) { - match = "\u2A7E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4461: - switch (current) { - case ';': // ges; - match = "\u2A7E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'c': - state = 4462; - return true; - case 'd': - state = 4464; - return true; - case 'l': - state = 4469; - return true; - } - break; - case 4462: - if ('c' == current) { - state = 4463; - return true; - } - break; - case 4463: - // gescc; - if (';' == current) { - match = "\u2AA9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4464: - if ('o' == current) { - state = 4465; - return true; - } - break; - case 4465: - if ('t' == current) { - state = 4466; - return true; - } - break; - case 4466: - // gesdot; - if (';' == current) { - match = "\u2A80"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 4467; - return true; - } - break; - case 4467: - // gesdoto; - if (';' == current) { - match = "\u2A82"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('l' == current) { - state = 4468; - return true; - } - break; - case 4468: - // gesdotol; - if (';' == current) { - match = "\u2A84"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4469: - // gesl; - if (';' == current) { - match = "\u22DB\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 4470; - return true; - } - break; - case 4470: - if ('s' == current) { - state = 4471; - return true; - } - break; - case 4471: - // gesles; - if (';' == current) { - match = "\u2A94"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4472: - if ('r' == current) { - state = 4473; - return true; - } - break; - case 4473: - // gfr; - if (';' == current) { - match = "\uD835\uDD24"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4474: - // gg; - if (';' == current) { - match = "\u226B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('g' == current) { - state = 4475; - return true; - } - break; - case 4475: - // ggg; - if (';' == current) { - match = "\u22D9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4476: - if ('m' == current) { - state = 4477; - return true; - } - break; - case 4477: - if ('e' == current) { - state = 4478; - return true; - } - break; - case 4478: - if ('l' == current) { - state = 4479; - return true; - } - break; - case 4479: - // gimel; - if (';' == current) { - match = "\u2137"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4480: - if ('c' == current) { - state = 4481; - return true; - } - break; - case 4481: - if ('y' == current) { - state = 4482; - return true; - } - break; - case 4482: - // gjcy; - if (';' == current) { - match = "\u0453"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4483: - switch (current) { - case ';': // gl; - match = "\u2277"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 4484; - return true; - case 'a': - state = 4485; - return true; - case 'j': - state = 4486; - return true; - } - break; - case 4484: - // glE; - if (';' == current) { - match = "\u2A92"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4485: - // gla; - if (';' == current) { - match = "\u2AA5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4486: - // glj; - if (';' == current) { - match = "\u2AA4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4487: - switch (current) { - case 'E': - state = 4488; - return true; - case 'a': - state = 4489; - return true; - case 'e': - state = 4495; - return true; - case 's': - state = 4498; - return true; - } - break; - case 4488: - // gnE; - if (';' == current) { - match = "\u2269"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4489: - if ('p' == current) { - state = 4490; - return true; - } - break; - case 4490: - // gnap; - if (';' == current) { - match = "\u2A8A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('p' == current) { - state = 4491; - return true; - } - break; - case 4491: - if ('r' == current) { - state = 4492; - return true; - } - break; - case 4492: - if ('o' == current) { - state = 4493; - return true; - } - break; - case 4493: - if ('x' == current) { - state = 4494; - return true; - } - break; - case 4494: - // gnapprox; - if (';' == current) { - match = "\u2A8A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4495: - // gne; - if (';' == current) { - match = "\u2A88"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 4496; - return true; - } - break; - case 4496: - // gneq; - if (';' == current) { - match = "\u2A88"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 4497; - return true; - } - break; - case 4497: - // gneqq; - if (';' == current) { - match = "\u2269"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4498: - if ('i' == current) { - state = 4499; - return true; - } - break; - case 4499: - if ('m' == current) { - state = 4500; - return true; - } - break; - case 4500: - // gnsim; - if (';' == current) { - match = "\u22E7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4501: - if ('p' == current) { - state = 4502; - return true; - } - break; - case 4502: - if ('f' == current) { - state = 4503; - return true; - } - break; - case 4503: - // gopf; - if (';' == current) { - match = "\uD835\uDD58"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4504: - if ('a' == current) { - state = 4505; - return true; - } - break; - case 4505: - if ('v' == current) { - state = 4506; - return true; - } - break; - case 4506: - if ('e' == current) { - state = 4507; - return true; - } - break; - case 4507: - // grave; - if (';' == current) { - match = "`"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4508: - if ('c' == current) { - state = 4509; - return true; - } - else if ('i' == current) { - state = 4511; - return true; - } - break; - case 4509: - if ('r' == current) { - state = 4510; - return true; - } - break; - case 4510: - // gscr; - if (';' == current) { - match = "\u210A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4511: - if ('m' == current) { - state = 4512; - return true; - } - break; - case 4512: - switch (current) { - case ';': // gsim; - match = "\u2273"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 4513; - return true; - case 'l': - state = 4514; - return true; - } - break; - case 4513: - // gsime; - if (';' == current) { - match = "\u2A8E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4514: - // gsiml; - if (';' == current) { - match = "\u2A90"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4515: - switch (current) { - case ';': // gt; - match = ">"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'c': - state = 4516; - return true; - case 'd': - state = 4520; - return true; - case 'l': - state = 4523; - return true; - case 'q': - state = 4527; - return true; - case 'r': - state = 4532; - return true; - } - break; - case 4516: - if ('c' == current) { - state = 4517; - return true; - } - else if ('i' == current) { - state = 4518; - return true; - } - break; - case 4517: - // gtcc; - if (';' == current) { - match = "\u2AA7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4518: - if ('r' == current) { - state = 4519; - return true; - } - break; - case 4519: - // gtcir; - if (';' == current) { - match = "\u2A7A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4520: - if ('o' == current) { - state = 4521; - return true; - } - break; - case 4521: - if ('t' == current) { - state = 4522; - return true; - } - break; - case 4522: - // gtdot; - if (';' == current) { - match = "\u22D7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4523: - if ('P' == current) { - state = 4524; - return true; - } - break; - case 4524: - if ('a' == current) { - state = 4525; - return true; - } - break; - case 4525: - if ('r' == current) { - state = 4526; - return true; - } - break; - case 4526: - // gtlPar; - if (';' == current) { - match = "\u2995"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4527: - if ('u' == current) { - state = 4528; - return true; - } - break; - case 4528: - if ('e' == current) { - state = 4529; - return true; - } - break; - case 4529: - if ('s' == current) { - state = 4530; - return true; - } - break; - case 4530: - if ('t' == current) { - state = 4531; - return true; - } - break; - case 4531: - // gtquest; - if (';' == current) { - match = "\u2A7C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4532: - switch (current) { - case 'a': - state = 4533; - return true; - case 'd': - state = 4541; - return true; - case 'e': - state = 4544; - return true; - case 'l': - state = 4555; - return true; - case 's': - state = 4559; - return true; - } - break; - case 4533: - if ('p' == current) { - state = 4534; - return true; - } - else if ('r' == current) { - state = 4539; - return true; - } - break; - case 4534: - if ('p' == current) { - state = 4535; - return true; - } - break; - case 4535: - if ('r' == current) { - state = 4536; - return true; - } - break; - case 4536: - if ('o' == current) { - state = 4537; - return true; - } - break; - case 4537: - if ('x' == current) { - state = 4538; - return true; - } - break; - case 4538: - // gtrapprox; - if (';' == current) { - match = "\u2A86"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4539: - if ('r' == current) { - state = 4540; - return true; - } - break; - case 4540: - // gtrarr; - if (';' == current) { - match = "\u2978"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4541: - if ('o' == current) { - state = 4542; - return true; - } - break; - case 4542: - if ('t' == current) { - state = 4543; - return true; - } - break; - case 4543: - // gtrdot; - if (';' == current) { - match = "\u22D7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4544: - if ('q' == current) { - state = 4545; - return true; - } - break; - case 4545: - if ('l' == current) { - state = 4546; - return true; - } - else if ('q' == current) { - state = 4550; - return true; - } - break; - case 4546: - if ('e' == current) { - state = 4547; - return true; - } - break; - case 4547: - if ('s' == current) { - state = 4548; - return true; - } - break; - case 4548: - if ('s' == current) { - state = 4549; - return true; - } - break; - case 4549: - // gtreqless; - if (';' == current) { - match = "\u22DB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4550: - if ('l' == current) { - state = 4551; - return true; - } - break; - case 4551: - if ('e' == current) { - state = 4552; - return true; - } - break; - case 4552: - if ('s' == current) { - state = 4553; - return true; - } - break; - case 4553: - if ('s' == current) { - state = 4554; - return true; - } - break; - case 4554: - // gtreqqless; - if (';' == current) { - match = "\u2A8C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4555: - if ('e' == current) { - state = 4556; - return true; - } - break; - case 4556: - if ('s' == current) { - state = 4557; - return true; - } - break; - case 4557: - if ('s' == current) { - state = 4558; - return true; - } - break; - case 4558: - // gtrless; - if (';' == current) { - match = "\u2277"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4559: - if ('i' == current) { - state = 4560; - return true; - } - break; - case 4560: - if ('m' == current) { - state = 4561; - return true; - } - break; - case 4561: - // gtrsim; - if (';' == current) { - match = "\u2273"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4562: - if ('e' == current) { - state = 4563; - return true; - } - else if ('n' == current) { - state = 4570; - return true; - } - break; - case 4563: - if ('r' == current) { - state = 4564; - return true; - } - break; - case 4564: - if ('t' == current) { - state = 4565; - return true; - } - break; - case 4565: - if ('n' == current) { - state = 4566; - return true; - } - break; - case 4566: - if ('e' == current) { - state = 4567; - return true; - } - break; - case 4567: - if ('q' == current) { - state = 4568; - return true; - } - break; - case 4568: - if ('q' == current) { - state = 4569; - return true; - } - break; - case 4569: - // gvertneqq; - if (';' == current) { - match = "\u2269\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4570: - if ('E' == current) { - state = 4571; - return true; - } - break; - case 4571: - // gvnE; - if (';' == current) { - match = "\u2269\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4572: - switch (current) { - case 'A': - state = 4573; - return true; - case 'a': - state = 4576; - return true; - case 'b': - state = 4596; - return true; - case 'c': - state = 4599; - return true; - case 'e': - state = 4603; - return true; - case 'f': - state = 4619; - return true; - case 'k': - state = 4621; - return true; - case 'o': - state = 4633; - return true; - case 's': - state = 4668; - return true; - case 'y': - state = 4679; - return true; - } - break; - case 4573: - if ('r' == current) { - state = 4574; - return true; - } - break; - case 4574: - if ('r' == current) { - state = 4575; - return true; - } - break; - case 4575: - // hArr; - if (';' == current) { - match = "\u21D4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4576: - switch (current) { - case 'i': - state = 4577; - return true; - case 'l': - state = 4581; - return true; - case 'm': - state = 4583; - return true; - case 'r': - state = 4587; - return true; - } - break; - case 4577: - if ('r' == current) { - state = 4578; - return true; - } - break; - case 4578: - if ('s' == current) { - state = 4579; - return true; - } - break; - case 4579: - if ('p' == current) { - state = 4580; - return true; - } - break; - case 4580: - // hairsp; - if (';' == current) { - match = "\u200A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4581: - if ('f' == current) { - state = 4582; - return true; - } - break; - case 4582: - // half; - if (';' == current) { - match = "\u00BD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4583: - if ('i' == current) { - state = 4584; - return true; - } - break; - case 4584: - if ('l' == current) { - state = 4585; - return true; - } - break; - case 4585: - if ('t' == current) { - state = 4586; - return true; - } - break; - case 4586: - // hamilt; - if (';' == current) { - match = "\u210B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4587: - if ('d' == current) { - state = 4588; - return true; - } - else if ('r' == current) { - state = 4591; - return true; - } - break; - case 4588: - if ('c' == current) { - state = 4589; - return true; - } - break; - case 4589: - if ('y' == current) { - state = 4590; - return true; - } - break; - case 4590: - // hardcy; - if (';' == current) { - match = "\u044A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4591: - switch (current) { - case ';': // harr; - match = "\u2194"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'c': - state = 4592; - return true; - case 'w': - state = 4595; - return true; - } - break; - case 4592: - if ('i' == current) { - state = 4593; - return true; - } - break; - case 4593: - if ('r' == current) { - state = 4594; - return true; - } - break; - case 4594: - // harrcir; - if (';' == current) { - match = "\u2948"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4595: - // harrw; - if (';' == current) { - match = "\u21AD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4596: - if ('a' == current) { - state = 4597; - return true; - } - break; - case 4597: - if ('r' == current) { - state = 4598; - return true; - } - break; - case 4598: - // hbar; - if (';' == current) { - match = "\u210F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4599: - if ('i' == current) { - state = 4600; - return true; - } - break; - case 4600: - if ('r' == current) { - state = 4601; - return true; - } - break; - case 4601: - if ('c' == current) { - state = 4602; - return true; - } - break; - case 4602: - // hcirc; - if (';' == current) { - match = "\u0125"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4603: - switch (current) { - case 'a': - state = 4604; - return true; - case 'l': - state = 4611; - return true; - case 'r': - state = 4615; - return true; - } - break; - case 4604: - if ('r' == current) { - state = 4605; - return true; - } - break; - case 4605: - if ('t' == current) { - state = 4606; - return true; - } - break; - case 4606: - if ('s' == current) { - state = 4607; - return true; - } - break; - case 4607: - // hearts; - if (';' == current) { - match = "\u2665"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('u' == current) { - state = 4608; - return true; - } - break; - case 4608: - if ('i' == current) { - state = 4609; - return true; - } - break; - case 4609: - if ('t' == current) { - state = 4610; - return true; - } - break; - case 4610: - // heartsuit; - if (';' == current) { - match = "\u2665"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4611: - if ('l' == current) { - state = 4612; - return true; - } - break; - case 4612: - if ('i' == current) { - state = 4613; - return true; - } - break; - case 4613: - if ('p' == current) { - state = 4614; - return true; - } - break; - case 4614: - // hellip; - if (';' == current) { - match = "\u2026"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4615: - if ('c' == current) { - state = 4616; - return true; - } - break; - case 4616: - if ('o' == current) { - state = 4617; - return true; - } - break; - case 4617: - if ('n' == current) { - state = 4618; - return true; - } - break; - case 4618: - // hercon; - if (';' == current) { - match = "\u22B9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4619: - if ('r' == current) { - state = 4620; - return true; - } - break; - case 4620: - // hfr; - if (';' == current) { - match = "\uD835\uDD25"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4621: - if ('s' == current) { - state = 4622; - return true; - } - break; - case 4622: - if ('e' == current) { - state = 4623; - return true; - } - else if ('w' == current) { - state = 4628; - return true; - } - break; - case 4623: - if ('a' == current) { - state = 4624; - return true; - } - break; - case 4624: - if ('r' == current) { - state = 4625; - return true; - } - break; - case 4625: - if ('o' == current) { - state = 4626; - return true; - } - break; - case 4626: - if ('w' == current) { - state = 4627; - return true; - } - break; - case 4627: - // hksearow; - if (';' == current) { - match = "\u2925"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4628: - if ('a' == current) { - state = 4629; - return true; - } - break; - case 4629: - if ('r' == current) { - state = 4630; - return true; - } - break; - case 4630: - if ('o' == current) { - state = 4631; - return true; - } - break; - case 4631: - if ('w' == current) { - state = 4632; - return true; - } - break; - case 4632: - // hkswarow; - if (';' == current) { - match = "\u2926"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4633: - switch (current) { - case 'a': - state = 4634; - return true; - case 'm': - state = 4637; - return true; - case 'o': - state = 4641; - return true; - case 'p': - state = 4662; - return true; - case 'r': - state = 4664; - return true; - } - break; - case 4634: - if ('r' == current) { - state = 4635; - return true; - } - break; - case 4635: - if ('r' == current) { - state = 4636; - return true; - } - break; - case 4636: - // hoarr; - if (';' == current) { - match = "\u21FF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4637: - if ('t' == current) { - state = 4638; - return true; - } - break; - case 4638: - if ('h' == current) { - state = 4639; - return true; - } - break; - case 4639: - if ('t' == current) { - state = 4640; - return true; - } - break; - case 4640: - // homtht; - if (';' == current) { - match = "\u223B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4641: - if ('k' == current) { - state = 4642; - return true; - } - break; - case 4642: - if ('l' == current) { - state = 4643; - return true; - } - else if ('r' == current) { - state = 4652; - return true; - } - break; - case 4643: - if ('e' == current) { - state = 4644; - return true; - } - break; - case 4644: - if ('f' == current) { - state = 4645; - return true; - } - break; - case 4645: - if ('t' == current) { - state = 4646; - return true; - } - break; - case 4646: - if ('a' == current) { - state = 4647; - return true; - } - break; - case 4647: - if ('r' == current) { - state = 4648; - return true; - } - break; - case 4648: - if ('r' == current) { - state = 4649; - return true; - } - break; - case 4649: - if ('o' == current) { - state = 4650; - return true; - } - break; - case 4650: - if ('w' == current) { - state = 4651; - return true; - } - break; - case 4651: - // hookleftarrow; - if (';' == current) { - match = "\u21A9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4652: - if ('i' == current) { - state = 4653; - return true; - } - break; - case 4653: - if ('g' == current) { - state = 4654; - return true; - } - break; - case 4654: - if ('h' == current) { - state = 4655; - return true; - } - break; - case 4655: - if ('t' == current) { - state = 4656; - return true; - } - break; - case 4656: - if ('a' == current) { - state = 4657; - return true; - } - break; - case 4657: - if ('r' == current) { - state = 4658; - return true; - } - break; - case 4658: - if ('r' == current) { - state = 4659; - return true; - } - break; - case 4659: - if ('o' == current) { - state = 4660; - return true; - } - break; - case 4660: - if ('w' == current) { - state = 4661; - return true; - } - break; - case 4661: - // hookrightarrow; - if (';' == current) { - match = "\u21AA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4662: - if ('f' == current) { - state = 4663; - return true; - } - break; - case 4663: - // hopf; - if (';' == current) { - match = "\uD835\uDD59"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4664: - if ('b' == current) { - state = 4665; - return true; - } - break; - case 4665: - if ('a' == current) { - state = 4666; - return true; - } - break; - case 4666: - if ('r' == current) { - state = 4667; - return true; - } - break; - case 4667: - // horbar; - if (';' == current) { - match = "\u2015"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4668: - switch (current) { - case 'c': - state = 4669; - return true; - case 'l': - state = 4671; - return true; - case 't': - state = 4675; - return true; - } - break; - case 4669: - if ('r' == current) { - state = 4670; - return true; - } - break; - case 4670: - // hscr; - if (';' == current) { - match = "\uD835\uDCBD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4671: - if ('a' == current) { - state = 4672; - return true; - } - break; - case 4672: - if ('s' == current) { - state = 4673; - return true; - } - break; - case 4673: - if ('h' == current) { - state = 4674; - return true; - } - break; - case 4674: - // hslash; - if (';' == current) { - match = "\u210F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4675: - if ('r' == current) { - state = 4676; - return true; - } - break; - case 4676: - if ('o' == current) { - state = 4677; - return true; - } - break; - case 4677: - if ('k' == current) { - state = 4678; - return true; - } - break; - case 4678: - // hstrok; - if (';' == current) { - match = "\u0127"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4679: - if ('b' == current) { - state = 4680; - return true; - } - else if ('p' == current) { - state = 4684; - return true; - } - break; - case 4680: - if ('u' == current) { - state = 4681; - return true; - } - break; - case 4681: - if ('l' == current) { - state = 4682; - return true; - } - break; - case 4682: - if ('l' == current) { - state = 4683; - return true; - } - break; - case 4683: - // hybull; - if (';' == current) { - match = "\u2043"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4684: - if ('h' == current) { - state = 4685; - return true; - } - break; - case 4685: - if ('e' == current) { - state = 4686; - return true; - } - break; - case 4686: - if ('n' == current) { - state = 4687; - return true; - } - break; - case 4687: - // hyphen; - if (';' == current) { - match = "\u2010"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4688: - switch (current) { - case 'a': - state = 4689; - return true; - case 'c': - state = 4694; - return true; - case 'e': - state = 4699; - return true; - case 'f': - state = 4705; - return true; - case 'g': - state = 4708; - return true; - case 'i': - state = 4713; - return true; - case 'j': - state = 4727; - return true; - case 'm': - state = 4731; - return true; - case 'n': - state = 4752; - return true; - case 'o': - state = 4789; - return true; - case 'p': - state = 4799; - return true; - case 'q': - state = 4803; - return true; - case 's': - state = 4808; - return true; - case 't': - state = 4820; - return true; - case 'u': - state = 4825; - return true; - } - break; - case 4689: - if ('c' == current) { - state = 4690; - return true; - } - break; - case 4690: - if ('u' == current) { - state = 4691; - return true; - } - break; - case 4691: - if ('t' == current) { - state = 4692; - return true; - } - break; - case 4692: - // iacute - if ('e' == current) { - match = "\u00ED"; - matchLength = consumedCount; - state = 4693; - return true; - } - break; - case 4693: - // iacute; - if (';' == current) { - match = "\u00ED"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4694: - switch (current) { - case ';': // ic; - match = "\u2063"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'i': - state = 4695; - return true; - case 'y': - state = 4698; - return true; - } - break; - case 4695: - if ('r' == current) { - state = 4696; - return true; - } - break; - case 4696: - // icirc - if ('c' == current) { - match = "\u00EE"; - matchLength = consumedCount; - state = 4697; - return true; - } - break; - case 4697: - // icirc; - if (';' == current) { - match = "\u00EE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4698: - // icy; - if (';' == current) { - match = "\u0438"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4699: - if ('c' == current) { - state = 4700; - return true; - } - else if ('x' == current) { - state = 4702; - return true; - } - break; - case 4700: - if ('y' == current) { - state = 4701; - return true; - } - break; - case 4701: - // iecy; - if (';' == current) { - match = "\u0435"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4702: - if ('c' == current) { - state = 4703; - return true; - } - break; - case 4703: - // iexcl - if ('l' == current) { - match = "\u00A1"; - matchLength = consumedCount; - state = 4704; - return true; - } - break; - case 4704: - // iexcl; - if (';' == current) { - match = "\u00A1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4705: - if ('f' == current) { - state = 4706; - return true; - } - else if ('r' == current) { - state = 4707; - return true; - } - break; - case 4706: - // iff; - if (';' == current) { - match = "\u21D4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4707: - // ifr; - if (';' == current) { - match = "\uD835\uDD26"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4708: - if ('r' == current) { - state = 4709; - return true; - } - break; - case 4709: - if ('a' == current) { - state = 4710; - return true; - } - break; - case 4710: - if ('v' == current) { - state = 4711; - return true; - } - break; - case 4711: - // igrave - if ('e' == current) { - match = "\u00EC"; - matchLength = consumedCount; - state = 4712; - return true; - } - break; - case 4712: - // igrave; - if (';' == current) { - match = "\u00EC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4713: - switch (current) { - case ';': // ii; - match = "\u2148"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'i': - state = 4714; - return true; - case 'n': - state = 4720; - return true; - case 'o': - state = 4724; - return true; - } - break; - case 4714: - if ('i' == current) { - state = 4715; - return true; - } - else if ('n' == current) { - state = 4718; - return true; - } - break; - case 4715: - if ('n' == current) { - state = 4716; - return true; - } - break; - case 4716: - if ('t' == current) { - state = 4717; - return true; - } - break; - case 4717: - // iiiint; - if (';' == current) { - match = "\u2A0C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4718: - if ('t' == current) { - state = 4719; - return true; - } - break; - case 4719: - // iiint; - if (';' == current) { - match = "\u222D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4720: - if ('f' == current) { - state = 4721; - return true; - } - break; - case 4721: - if ('i' == current) { - state = 4722; - return true; - } - break; - case 4722: - if ('n' == current) { - state = 4723; - return true; - } - break; - case 4723: - // iinfin; - if (';' == current) { - match = "\u29DC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4724: - if ('t' == current) { - state = 4725; - return true; - } - break; - case 4725: - if ('a' == current) { - state = 4726; - return true; - } - break; - case 4726: - // iiota; - if (';' == current) { - match = "\u2129"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4727: - if ('l' == current) { - state = 4728; - return true; - } - break; - case 4728: - if ('i' == current) { - state = 4729; - return true; - } - break; - case 4729: - if ('g' == current) { - state = 4730; - return true; - } - break; - case 4730: - // ijlig; - if (';' == current) { - match = "\u0133"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4731: - switch (current) { - case 'a': - state = 4732; - return true; - case 'o': - state = 4747; - return true; - case 'p': - state = 4749; - return true; - } - break; - case 4732: - switch (current) { - case 'c': - state = 4733; - return true; - case 'g': - state = 4735; - return true; - case 't': - state = 4745; - return true; - } - break; - case 4733: - if ('r' == current) { - state = 4734; - return true; - } - break; - case 4734: - // imacr; - if (';' == current) { - match = "\u012B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4735: - switch (current) { - case 'e': - state = 4736; - return true; - case 'l': - state = 4737; - return true; - case 'p': - state = 4741; - return true; - } - break; - case 4736: - // image; - if (';' == current) { - match = "\u2111"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4737: - if ('i' == current) { - state = 4738; - return true; - } - break; - case 4738: - if ('n' == current) { - state = 4739; - return true; - } - break; - case 4739: - if ('e' == current) { - state = 4740; - return true; - } - break; - case 4740: - // imagline; - if (';' == current) { - match = "\u2110"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4741: - if ('a' == current) { - state = 4742; - return true; - } - break; - case 4742: - if ('r' == current) { - state = 4743; - return true; - } - break; - case 4743: - if ('t' == current) { - state = 4744; - return true; - } - break; - case 4744: - // imagpart; - if (';' == current) { - match = "\u2111"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4745: - if ('h' == current) { - state = 4746; - return true; - } - break; - case 4746: - // imath; - if (';' == current) { - match = "\u0131"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4747: - if ('f' == current) { - state = 4748; - return true; - } - break; - case 4748: - // imof; - if (';' == current) { - match = "\u22B7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4749: - if ('e' == current) { - state = 4750; - return true; - } - break; - case 4750: - if ('d' == current) { - state = 4751; - return true; - } - break; - case 4751: - // imped; - if (';' == current) { - match = "\u01B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4752: - switch (current) { - case ';': // in; - match = "\u2208"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'c': - state = 4753; - return true; - case 'f': - state = 4757; - return true; - case 'o': - state = 4763; - return true; - case 't': - state = 4767; - return true; - } - break; - case 4753: - if ('a' == current) { - state = 4754; - return true; - } - break; - case 4754: - if ('r' == current) { - state = 4755; - return true; - } - break; - case 4755: - if ('e' == current) { - state = 4756; - return true; - } - break; - case 4756: - // incare; - if (';' == current) { - match = "\u2105"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4757: - if ('i' == current) { - state = 4758; - return true; - } - break; - case 4758: - if ('n' == current) { - state = 4759; - return true; - } - break; - case 4759: - // infin; - if (';' == current) { - match = "\u221E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('t' == current) { - state = 4760; - return true; - } - break; - case 4760: - if ('i' == current) { - state = 4761; - return true; - } - break; - case 4761: - if ('e' == current) { - state = 4762; - return true; - } - break; - case 4762: - // infintie; - if (';' == current) { - match = "\u29DD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4763: - if ('d' == current) { - state = 4764; - return true; - } - break; - case 4764: - if ('o' == current) { - state = 4765; - return true; - } - break; - case 4765: - if ('t' == current) { - state = 4766; - return true; - } - break; - case 4766: - // inodot; - if (';' == current) { - match = "\u0131"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4767: - switch (current) { - case ';': // int; - match = "\u222B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'c': - state = 4768; - return true; - case 'e': - state = 4771; - return true; - case 'l': - state = 4780; - return true; - case 'p': - state = 4785; - return true; - } - break; - case 4768: - if ('a' == current) { - state = 4769; - return true; - } - break; - case 4769: - if ('l' == current) { - state = 4770; - return true; - } - break; - case 4770: - // intcal; - if (';' == current) { - match = "\u22BA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4771: - if ('g' == current) { - state = 4772; - return true; - } - else if ('r' == current) { - state = 4776; - return true; - } - break; - case 4772: - if ('e' == current) { - state = 4773; - return true; - } - break; - case 4773: - if ('r' == current) { - state = 4774; - return true; - } - break; - case 4774: - if ('s' == current) { - state = 4775; - return true; - } - break; - case 4775: - // integers; - if (';' == current) { - match = "\u2124"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4776: - if ('c' == current) { - state = 4777; - return true; - } - break; - case 4777: - if ('a' == current) { - state = 4778; - return true; - } - break; - case 4778: - if ('l' == current) { - state = 4779; - return true; - } - break; - case 4779: - // intercal; - if (';' == current) { - match = "\u22BA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4780: - if ('a' == current) { - state = 4781; - return true; - } - break; - case 4781: - if ('r' == current) { - state = 4782; - return true; - } - break; - case 4782: - if ('h' == current) { - state = 4783; - return true; - } - break; - case 4783: - if ('k' == current) { - state = 4784; - return true; - } - break; - case 4784: - // intlarhk; - if (';' == current) { - match = "\u2A17"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4785: - if ('r' == current) { - state = 4786; - return true; - } - break; - case 4786: - if ('o' == current) { - state = 4787; - return true; - } - break; - case 4787: - if ('d' == current) { - state = 4788; - return true; - } - break; - case 4788: - // intprod; - if (';' == current) { - match = "\u2A3C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4789: - switch (current) { - case 'c': - state = 4790; - return true; - case 'g': - state = 4792; - return true; - case 'p': - state = 4795; - return true; - case 't': - state = 4797; - return true; - } - break; - case 4790: - if ('y' == current) { - state = 4791; - return true; - } - break; - case 4791: - // iocy; - if (';' == current) { - match = "\u0451"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4792: - if ('o' == current) { - state = 4793; - return true; - } - break; - case 4793: - if ('n' == current) { - state = 4794; - return true; - } - break; - case 4794: - // iogon; - if (';' == current) { - match = "\u012F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4795: - if ('f' == current) { - state = 4796; - return true; - } - break; - case 4796: - // iopf; - if (';' == current) { - match = "\uD835\uDD5A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4797: - if ('a' == current) { - state = 4798; - return true; - } - break; - case 4798: - // iota; - if (';' == current) { - match = "\u03B9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4799: - if ('r' == current) { - state = 4800; - return true; - } - break; - case 4800: - if ('o' == current) { - state = 4801; - return true; - } - break; - case 4801: - if ('d' == current) { - state = 4802; - return true; - } - break; - case 4802: - // iprod; - if (';' == current) { - match = "\u2A3C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4803: - if ('u' == current) { - state = 4804; - return true; - } - break; - case 4804: - if ('e' == current) { - state = 4805; - return true; - } - break; - case 4805: - if ('s' == current) { - state = 4806; - return true; - } - break; - case 4806: - // iquest - if ('t' == current) { - match = "\u00BF"; - matchLength = consumedCount; - state = 4807; - return true; - } - break; - case 4807: - // iquest; - if (';' == current) { - match = "\u00BF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4808: - if ('c' == current) { - state = 4809; - return true; - } - else if ('i' == current) { - state = 4811; - return true; - } - break; - case 4809: - if ('r' == current) { - state = 4810; - return true; - } - break; - case 4810: - // iscr; - if (';' == current) { - match = "\uD835\uDCBE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4811: - if ('n' == current) { - state = 4812; - return true; - } - break; - case 4812: - switch (current) { - case ';': // isin; - match = "\u2208"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 4813; - return true; - case 'd': - state = 4814; - return true; - case 's': - state = 4817; - return true; - case 'v': - state = 4819; - return true; - } - break; - case 4813: - // isinE; - if (';' == current) { - match = "\u22F9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4814: - if ('o' == current) { - state = 4815; - return true; - } - break; - case 4815: - if ('t' == current) { - state = 4816; - return true; - } - break; - case 4816: - // isindot; - if (';' == current) { - match = "\u22F5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4817: - // isins; - if (';' == current) { - match = "\u22F4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 4818; - return true; - } - break; - case 4818: - // isinsv; - if (';' == current) { - match = "\u22F3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4819: - // isinv; - if (';' == current) { - match = "\u2208"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4820: - // it; - if (';' == current) { - match = "\u2062"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('i' == current) { - state = 4821; - return true; - } - break; - case 4821: - if ('l' == current) { - state = 4822; - return true; - } - break; - case 4822: - if ('d' == current) { - state = 4823; - return true; - } - break; - case 4823: - if ('e' == current) { - state = 4824; - return true; - } - break; - case 4824: - // itilde; - if (';' == current) { - match = "\u0129"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4825: - if ('k' == current) { - state = 4826; - return true; - } - else if ('m' == current) { - state = 4829; - return true; - } - break; - case 4826: - if ('c' == current) { - state = 4827; - return true; - } - break; - case 4827: - if ('y' == current) { - state = 4828; - return true; - } - break; - case 4828: - // iukcy; - if (';' == current) { - match = "\u0456"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4829: - // iuml - if ('l' == current) { - match = "\u00EF"; - matchLength = consumedCount; - state = 4830; - return true; - } - break; - case 4830: - // iuml; - if (';' == current) { - match = "\u00EF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4831: - switch (current) { - case 'c': - state = 4832; - return true; - case 'f': - state = 4837; - return true; - case 'm': - state = 4839; - return true; - case 'o': - state = 4843; - return true; - case 's': - state = 4846; - return true; - case 'u': - state = 4853; - return true; - } - break; - case 4832: - if ('i' == current) { - state = 4833; - return true; - } - else if ('y' == current) { - state = 4836; - return true; - } - break; - case 4833: - if ('r' == current) { - state = 4834; - return true; - } - break; - case 4834: - if ('c' == current) { - state = 4835; - return true; - } - break; - case 4835: - // jcirc; - if (';' == current) { - match = "\u0135"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4836: - // jcy; - if (';' == current) { - match = "\u0439"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4837: - if ('r' == current) { - state = 4838; - return true; - } - break; - case 4838: - // jfr; - if (';' == current) { - match = "\uD835\uDD27"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4839: - if ('a' == current) { - state = 4840; - return true; - } - break; - case 4840: - if ('t' == current) { - state = 4841; - return true; - } - break; - case 4841: - if ('h' == current) { - state = 4842; - return true; - } - break; - case 4842: - // jmath; - if (';' == current) { - match = "\u0237"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4843: - if ('p' == current) { - state = 4844; - return true; - } - break; - case 4844: - if ('f' == current) { - state = 4845; - return true; - } - break; - case 4845: - // jopf; - if (';' == current) { - match = "\uD835\uDD5B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4846: - if ('c' == current) { - state = 4847; - return true; - } - else if ('e' == current) { - state = 4849; - return true; - } - break; - case 4847: - if ('r' == current) { - state = 4848; - return true; - } - break; - case 4848: - // jscr; - if (';' == current) { - match = "\uD835\uDCBF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4849: - if ('r' == current) { - state = 4850; - return true; - } - break; - case 4850: - if ('c' == current) { - state = 4851; - return true; - } - break; - case 4851: - if ('y' == current) { - state = 4852; - return true; - } - break; - case 4852: - // jsercy; - if (';' == current) { - match = "\u0458"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4853: - if ('k' == current) { - state = 4854; - return true; - } - break; - case 4854: - if ('c' == current) { - state = 4855; - return true; - } - break; - case 4855: - if ('y' == current) { - state = 4856; - return true; - } - break; - case 4856: - // jukcy; - if (';' == current) { - match = "\u0454"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4857: - switch (current) { - case 'a': - state = 4858; - return true; - case 'c': - state = 4863; - return true; - case 'f': - state = 4869; - return true; - case 'g': - state = 4871; - return true; - case 'h': - state = 4876; - return true; - case 'j': - state = 4879; - return true; - case 'o': - state = 4882; - return true; - case 's': - state = 4885; - return true; - } - break; - case 4858: - if ('p' == current) { - state = 4859; - return true; - } - break; - case 4859: - if ('p' == current) { - state = 4860; - return true; - } - break; - case 4860: - if ('a' == current) { - state = 4861; - return true; - } - break; - case 4861: - // kappa; - if (';' == current) { - match = "\u03BA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 4862; - return true; - } - break; - case 4862: - // kappav; - if (';' == current) { - match = "\u03F0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4863: - if ('e' == current) { - state = 4864; - return true; - } - else if ('y' == current) { - state = 4868; - return true; - } - break; - case 4864: - if ('d' == current) { - state = 4865; - return true; - } - break; - case 4865: - if ('i' == current) { - state = 4866; - return true; - } - break; - case 4866: - if ('l' == current) { - state = 4867; - return true; - } - break; - case 4867: - // kcedil; - if (';' == current) { - match = "\u0137"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4868: - // kcy; - if (';' == current) { - match = "\u043A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4869: - if ('r' == current) { - state = 4870; - return true; - } - break; - case 4870: - // kfr; - if (';' == current) { - match = "\uD835\uDD28"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4871: - if ('r' == current) { - state = 4872; - return true; - } - break; - case 4872: - if ('e' == current) { - state = 4873; - return true; - } - break; - case 4873: - if ('e' == current) { - state = 4874; - return true; - } - break; - case 4874: - if ('n' == current) { - state = 4875; - return true; - } - break; - case 4875: - // kgreen; - if (';' == current) { - match = "\u0138"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4876: - if ('c' == current) { - state = 4877; - return true; - } - break; - case 4877: - if ('y' == current) { - state = 4878; - return true; - } - break; - case 4878: - // khcy; - if (';' == current) { - match = "\u0445"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4879: - if ('c' == current) { - state = 4880; - return true; - } - break; - case 4880: - if ('y' == current) { - state = 4881; - return true; - } - break; - case 4881: - // kjcy; - if (';' == current) { - match = "\u045C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4882: - if ('p' == current) { - state = 4883; - return true; - } - break; - case 4883: - if ('f' == current) { - state = 4884; - return true; - } - break; - case 4884: - // kopf; - if (';' == current) { - match = "\uD835\uDD5C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4885: - if ('c' == current) { - state = 4886; - return true; - } - break; - case 4886: - if ('r' == current) { - state = 4887; - return true; - } - break; - case 4887: - // kscr; - if (';' == current) { - match = "\uD835\uDCC0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4888: - switch (current) { - case 'A': - state = 4889; - return true; - case 'B': - state = 4899; - return true; - case 'E': - state = 4903; - return true; - case 'H': - state = 4905; - return true; - case 'a': - state = 4908; - return true; - case 'b': - state = 4960; - return true; - case 'c': - state = 4978; - return true; - case 'd': - state = 4992; - return true; - case 'e': - state = 5011; - return true; - case 'f': - state = 5129; - return true; - case 'g': - state = 5139; - return true; - case 'h': - state = 5141; - return true; - case 'j': - state = 5150; - return true; - case 'l': - state = 5153; - return true; - case 'm': - state = 5170; - return true; - case 'n': - state = 5183; - return true; - case 'o': - state = 5197; - return true; - case 'p': - state = 5284; - return true; - case 'r': - state = 5289; - return true; - case 's': - state = 5307; - return true; - case 't': // lt - match = "<"; - matchLength = consumedCount; - state = 5328; - return true; - case 'u': - state = 5360; - return true; - case 'v': - state = 5371; - return true; - } - break; - case 4889: - switch (current) { - case 'a': - state = 4890; - return true; - case 'r': - state = 4893; - return true; - case 't': - state = 4895; - return true; - } - break; - case 4890: - if ('r' == current) { - state = 4891; - return true; - } - break; - case 4891: - if ('r' == current) { - state = 4892; - return true; - } - break; - case 4892: - // lAarr; - if (';' == current) { - match = "\u21DA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4893: - if ('r' == current) { - state = 4894; - return true; - } - break; - case 4894: - // lArr; - if (';' == current) { - match = "\u21D0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4895: - if ('a' == current) { - state = 4896; - return true; - } - break; - case 4896: - if ('i' == current) { - state = 4897; - return true; - } - break; - case 4897: - if ('l' == current) { - state = 4898; - return true; - } - break; - case 4898: - // lAtail; - if (';' == current) { - match = "\u291B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4899: - if ('a' == current) { - state = 4900; - return true; - } - break; - case 4900: - if ('r' == current) { - state = 4901; - return true; - } - break; - case 4901: - if ('r' == current) { - state = 4902; - return true; - } - break; - case 4902: - // lBarr; - if (';' == current) { - match = "\u290E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4903: - // lE; - if (';' == current) { - match = "\u2266"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('g' == current) { - state = 4904; - return true; - } - break; - case 4904: - // lEg; - if (';' == current) { - match = "\u2A8B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4905: - if ('a' == current) { - state = 4906; - return true; - } - break; - case 4906: - if ('r' == current) { - state = 4907; - return true; - } - break; - case 4907: - // lHar; - if (';' == current) { - match = "\u2962"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4908: - switch (current) { - case 'c': - state = 4909; - return true; - case 'e': - state = 4913; - return true; - case 'g': - state = 4919; - return true; - case 'm': - state = 4923; - return true; - case 'n': - state = 4927; - return true; - case 'p': - state = 4932; - return true; - case 'q': - state = 4933; - return true; - case 'r': - state = 4936; - return true; - case 't': - state = 4954; - return true; - } - break; - case 4909: - if ('u' == current) { - state = 4910; - return true; - } - break; - case 4910: - if ('t' == current) { - state = 4911; - return true; - } - break; - case 4911: - if ('e' == current) { - state = 4912; - return true; - } - break; - case 4912: - // lacute; - if (';' == current) { - match = "\u013A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4913: - if ('m' == current) { - state = 4914; - return true; - } - break; - case 4914: - if ('p' == current) { - state = 4915; - return true; - } - break; - case 4915: - if ('t' == current) { - state = 4916; - return true; - } - break; - case 4916: - if ('y' == current) { - state = 4917; - return true; - } - break; - case 4917: - if ('v' == current) { - state = 4918; - return true; - } - break; - case 4918: - // laemptyv; - if (';' == current) { - match = "\u29B4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4919: - if ('r' == current) { - state = 4920; - return true; - } - break; - case 4920: - if ('a' == current) { - state = 4921; - return true; - } - break; - case 4921: - if ('n' == current) { - state = 4922; - return true; - } - break; - case 4922: - // lagran; - if (';' == current) { - match = "\u2112"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4923: - if ('b' == current) { - state = 4924; - return true; - } - break; - case 4924: - if ('d' == current) { - state = 4925; - return true; - } - break; - case 4925: - if ('a' == current) { - state = 4926; - return true; - } - break; - case 4926: - // lambda; - if (';' == current) { - match = "\u03BB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4927: - if ('g' == current) { - state = 4928; - return true; - } - break; - case 4928: - switch (current) { - case ';': // lang; - match = "\u27E8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'd': - state = 4929; - return true; - case 'l': - state = 4930; - return true; - } - break; - case 4929: - // langd; - if (';' == current) { - match = "\u2991"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4930: - if ('e' == current) { - state = 4931; - return true; - } - break; - case 4931: - // langle; - if (';' == current) { - match = "\u27E8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4932: - // lap; - if (';' == current) { - match = "\u2A85"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4933: - if ('u' == current) { - state = 4934; - return true; - } - break; - case 4934: - // laquo - if ('o' == current) { - match = "\u00AB"; - matchLength = consumedCount; - state = 4935; - return true; - } - break; - case 4935: - // laquo; - if (';' == current) { - match = "\u00AB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4936: - if ('r' == current) { - state = 4937; - return true; - } - break; - case 4937: - switch (current) { - case ';': // larr; - match = "\u2190"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'b': - state = 4938; - return true; - case 'f': - state = 4941; - return true; - case 'h': - state = 4943; - return true; - case 'l': - state = 4945; - return true; - case 'p': - state = 4947; - return true; - case 's': - state = 4949; - return true; - case 't': - state = 4952; - return true; - } - break; - case 4938: - // larrb; - if (';' == current) { - match = "\u21E4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('f' == current) { - state = 4939; - return true; - } - break; - case 4939: - if ('s' == current) { - state = 4940; - return true; - } - break; - case 4940: - // larrbfs; - if (';' == current) { - match = "\u291F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4941: - if ('s' == current) { - state = 4942; - return true; - } - break; - case 4942: - // larrfs; - if (';' == current) { - match = "\u291D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4943: - if ('k' == current) { - state = 4944; - return true; - } - break; - case 4944: - // larrhk; - if (';' == current) { - match = "\u21A9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4945: - if ('p' == current) { - state = 4946; - return true; - } - break; - case 4946: - // larrlp; - if (';' == current) { - match = "\u21AB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4947: - if ('l' == current) { - state = 4948; - return true; - } - break; - case 4948: - // larrpl; - if (';' == current) { - match = "\u2939"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4949: - if ('i' == current) { - state = 4950; - return true; - } - break; - case 4950: - if ('m' == current) { - state = 4951; - return true; - } - break; - case 4951: - // larrsim; - if (';' == current) { - match = "\u2973"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4952: - if ('l' == current) { - state = 4953; - return true; - } - break; - case 4953: - // larrtl; - if (';' == current) { - match = "\u21A2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4954: - switch (current) { - case ';': // lat; - match = "\u2AAB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 4955; - return true; - case 'e': - state = 4958; - return true; - } - break; - case 4955: - if ('i' == current) { - state = 4956; - return true; - } - break; - case 4956: - if ('l' == current) { - state = 4957; - return true; - } - break; - case 4957: - // latail; - if (';' == current) { - match = "\u2919"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4958: - // late; - if (';' == current) { - match = "\u2AAD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 4959; - return true; - } - break; - case 4959: - // lates; - if (';' == current) { - match = "\u2AAD\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4960: - switch (current) { - case 'a': - state = 4961; - return true; - case 'b': - state = 4964; - return true; - case 'r': - state = 4967; - return true; - } - break; - case 4961: - if ('r' == current) { - state = 4962; - return true; - } - break; - case 4962: - if ('r' == current) { - state = 4963; - return true; - } - break; - case 4963: - // lbarr; - if (';' == current) { - match = "\u290C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4964: - if ('r' == current) { - state = 4965; - return true; - } - break; - case 4965: - if ('k' == current) { - state = 4966; - return true; - } - break; - case 4966: - // lbbrk; - if (';' == current) { - match = "\u2772"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4967: - if ('a' == current) { - state = 4968; - return true; - } - else if ('k' == current) { - state = 4972; - return true; - } - break; - case 4968: - if ('c' == current) { - state = 4969; - return true; - } - break; - case 4969: - if ('e' == current) { - state = 4970; - return true; - } - else if ('k' == current) { - state = 4971; - return true; - } - break; - case 4970: - // lbrace; - if (';' == current) { - match = "{"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4971: - // lbrack; - if (';' == current) { - match = "["; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4972: - if ('e' == current) { - state = 4973; - return true; - } - else if ('s' == current) { - state = 4974; - return true; - } - break; - case 4973: - // lbrke; - if (';' == current) { - match = "\u298B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4974: - if ('l' == current) { - state = 4975; - return true; - } - break; - case 4975: - if ('d' == current) { - state = 4976; - return true; - } - else if ('u' == current) { - state = 4977; - return true; - } - break; - case 4976: - // lbrksld; - if (';' == current) { - match = "\u298F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4977: - // lbrkslu; - if (';' == current) { - match = "\u298D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4978: - switch (current) { - case 'a': - state = 4979; - return true; - case 'e': - state = 4983; - return true; - case 'u': - state = 4989; - return true; - case 'y': - state = 4991; - return true; - } - break; - case 4979: - if ('r' == current) { - state = 4980; - return true; - } - break; - case 4980: - if ('o' == current) { - state = 4981; - return true; - } - break; - case 4981: - if ('n' == current) { - state = 4982; - return true; - } - break; - case 4982: - // lcaron; - if (';' == current) { - match = "\u013E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4983: - if ('d' == current) { - state = 4984; - return true; - } - else if ('i' == current) { - state = 4987; - return true; - } - break; - case 4984: - if ('i' == current) { - state = 4985; - return true; - } - break; - case 4985: - if ('l' == current) { - state = 4986; - return true; - } - break; - case 4986: - // lcedil; - if (';' == current) { - match = "\u013C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4987: - if ('l' == current) { - state = 4988; - return true; - } - break; - case 4988: - // lceil; - if (';' == current) { - match = "\u2308"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4989: - if ('b' == current) { - state = 4990; - return true; - } - break; - case 4990: - // lcub; - if (';' == current) { - match = "{"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4991: - // lcy; - if (';' == current) { - match = "\u043B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4992: - switch (current) { - case 'c': - state = 4993; - return true; - case 'q': - state = 4995; - return true; - case 'r': - state = 4999; - return true; - case 's': - state = 5009; - return true; - } - break; - case 4993: - if ('a' == current) { - state = 4994; - return true; - } - break; - case 4994: - // ldca; - if (';' == current) { - match = "\u2936"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4995: - if ('u' == current) { - state = 4996; - return true; - } - break; - case 4996: - if ('o' == current) { - state = 4997; - return true; - } - break; - case 4997: - // ldquo; - if (';' == current) { - match = "\u201C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('r' == current) { - state = 4998; - return true; - } - break; - case 4998: - // ldquor; - if (';' == current) { - match = "\u201E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 4999: - if ('d' == current) { - state = 5000; - return true; - } - else if ('u' == current) { - state = 5004; - return true; - } - break; - } - return false; - } - - private boolean parse6(final int current) { - consumedCount++; - switch (state) { - case 5000: - if ('h' == current) { - state = 5001; - return true; - } - break; - case 5001: - if ('a' == current) { - state = 5002; - return true; - } - break; - case 5002: - if ('r' == current) { - state = 5003; - return true; - } - break; - case 5003: - // ldrdhar; - if (';' == current) { - match = "\u2967"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5004: - if ('s' == current) { - state = 5005; - return true; - } - break; - case 5005: - if ('h' == current) { - state = 5006; - return true; - } - break; - case 5006: - if ('a' == current) { - state = 5007; - return true; - } - break; - case 5007: - if ('r' == current) { - state = 5008; - return true; - } - break; - case 5008: - // ldrushar; - if (';' == current) { - match = "\u294B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5009: - if ('h' == current) { - state = 5010; - return true; - } - break; - case 5010: - // ldsh; - if (';' == current) { - match = "\u21B2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5011: - switch (current) { - case ';': // le; - match = "\u2264"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'f': - state = 5012; - return true; - case 'g': - state = 5085; - return true; - case 'q': - state = 5086; - return true; - case 's': - state = 5093; - return true; - } - break; - case 5012: - if ('t' == current) { - state = 5013; - return true; - } - break; - case 5013: - switch (current) { - case 'a': - state = 5014; - return true; - case 'h': - state = 5023; - return true; - case 'l': - state = 5036; - return true; - case 'r': - state = 5046; - return true; - case 't': - state = 5075; - return true; - } - break; - case 5014: - if ('r' == current) { - state = 5015; - return true; - } - break; - case 5015: - if ('r' == current) { - state = 5016; - return true; - } - break; - case 5016: - if ('o' == current) { - state = 5017; - return true; - } - break; - case 5017: - if ('w' == current) { - state = 5018; - return true; - } - break; - case 5018: - // leftarrow; - if (';' == current) { - match = "\u2190"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('t' == current) { - state = 5019; - return true; - } - break; - case 5019: - if ('a' == current) { - state = 5020; - return true; - } - break; - case 5020: - if ('i' == current) { - state = 5021; - return true; - } - break; - case 5021: - if ('l' == current) { - state = 5022; - return true; - } - break; - case 5022: - // leftarrowtail; - if (';' == current) { - match = "\u21A2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5023: - if ('a' == current) { - state = 5024; - return true; - } - break; - case 5024: - if ('r' == current) { - state = 5025; - return true; - } - break; - case 5025: - if ('p' == current) { - state = 5026; - return true; - } - break; - case 5026: - if ('o' == current) { - state = 5027; - return true; - } - break; - case 5027: - if ('o' == current) { - state = 5028; - return true; - } - break; - case 5028: - if ('n' == current) { - state = 5029; - return true; - } - break; - case 5029: - if ('d' == current) { - state = 5030; - return true; - } - else if ('u' == current) { - state = 5034; - return true; - } - break; - case 5030: - if ('o' == current) { - state = 5031; - return true; - } - break; - case 5031: - if ('w' == current) { - state = 5032; - return true; - } - break; - case 5032: - if ('n' == current) { - state = 5033; - return true; - } - break; - case 5033: - // leftharpoondown; - if (';' == current) { - match = "\u21BD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5034: - if ('p' == current) { - state = 5035; - return true; - } - break; - case 5035: - // leftharpoonup; - if (';' == current) { - match = "\u21BC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5036: - if ('e' == current) { - state = 5037; - return true; - } - break; - case 5037: - if ('f' == current) { - state = 5038; - return true; - } - break; - case 5038: - if ('t' == current) { - state = 5039; - return true; - } - break; - case 5039: - if ('a' == current) { - state = 5040; - return true; - } - break; - case 5040: - if ('r' == current) { - state = 5041; - return true; - } - break; - case 5041: - if ('r' == current) { - state = 5042; - return true; - } - break; - case 5042: - if ('o' == current) { - state = 5043; - return true; - } - break; - case 5043: - if ('w' == current) { - state = 5044; - return true; - } - break; - case 5044: - if ('s' == current) { - state = 5045; - return true; - } - break; - case 5045: - // leftleftarrows; - if (';' == current) { - match = "\u21C7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5046: - if ('i' == current) { - state = 5047; - return true; - } - break; - case 5047: - if ('g' == current) { - state = 5048; - return true; - } - break; - case 5048: - if ('h' == current) { - state = 5049; - return true; - } - break; - case 5049: - if ('t' == current) { - state = 5050; - return true; - } - break; - case 5050: - switch (current) { - case 'a': - state = 5051; - return true; - case 'h': - state = 5057; - return true; - case 's': - state = 5065; - return true; - } - break; - case 5051: - if ('r' == current) { - state = 5052; - return true; - } - break; - case 5052: - if ('r' == current) { - state = 5053; - return true; - } - break; - case 5053: - if ('o' == current) { - state = 5054; - return true; - } - break; - case 5054: - if ('w' == current) { - state = 5055; - return true; - } - break; - case 5055: - // leftrightarrow; - if (';' == current) { - match = "\u2194"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 5056; - return true; - } - break; - case 5056: - // leftrightarrows; - if (';' == current) { - match = "\u21C6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5057: - if ('a' == current) { - state = 5058; - return true; - } - break; - case 5058: - if ('r' == current) { - state = 5059; - return true; - } - break; - case 5059: - if ('p' == current) { - state = 5060; - return true; - } - break; - case 5060: - if ('o' == current) { - state = 5061; - return true; - } - break; - case 5061: - if ('o' == current) { - state = 5062; - return true; - } - break; - case 5062: - if ('n' == current) { - state = 5063; - return true; - } - break; - case 5063: - if ('s' == current) { - state = 5064; - return true; - } - break; - case 5064: - // leftrightharpoons; - if (';' == current) { - match = "\u21CB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5065: - if ('q' == current) { - state = 5066; - return true; - } - break; - case 5066: - if ('u' == current) { - state = 5067; - return true; - } - break; - case 5067: - if ('i' == current) { - state = 5068; - return true; - } - break; - case 5068: - if ('g' == current) { - state = 5069; - return true; - } - break; - case 5069: - if ('a' == current) { - state = 5070; - return true; - } - break; - case 5070: - if ('r' == current) { - state = 5071; - return true; - } - break; - case 5071: - if ('r' == current) { - state = 5072; - return true; - } - break; - case 5072: - if ('o' == current) { - state = 5073; - return true; - } - break; - case 5073: - if ('w' == current) { - state = 5074; - return true; - } - break; - case 5074: - // leftrightsquigarrow; - if (';' == current) { - match = "\u21AD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5075: - if ('h' == current) { - state = 5076; - return true; - } - break; - case 5076: - if ('r' == current) { - state = 5077; - return true; - } - break; - case 5077: - if ('e' == current) { - state = 5078; - return true; - } - break; - case 5078: - if ('e' == current) { - state = 5079; - return true; - } - break; - case 5079: - if ('t' == current) { - state = 5080; - return true; - } - break; - case 5080: - if ('i' == current) { - state = 5081; - return true; - } - break; - case 5081: - if ('m' == current) { - state = 5082; - return true; - } - break; - case 5082: - if ('e' == current) { - state = 5083; - return true; - } - break; - case 5083: - if ('s' == current) { - state = 5084; - return true; - } - break; - case 5084: - // leftthreetimes; - if (';' == current) { - match = "\u22CB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5085: - // leg; - if (';' == current) { - match = "\u22DA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5086: - switch (current) { - case ';': // leq; - match = "\u2264"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'q': - state = 5087; - return true; - case 's': - state = 5088; - return true; - } - break; - case 5087: - // leqq; - if (';' == current) { - match = "\u2266"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5088: - if ('l' == current) { - state = 5089; - return true; - } - break; - case 5089: - if ('a' == current) { - state = 5090; - return true; - } - break; - case 5090: - if ('n' == current) { - state = 5091; - return true; - } - break; - case 5091: - if ('t' == current) { - state = 5092; - return true; - } - break; - case 5092: - // leqslant; - if (';' == current) { - match = "\u2A7D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5093: - switch (current) { - case ';': // les; - match = "\u2A7D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'c': - state = 5094; - return true; - case 'd': - state = 5096; - return true; - case 'g': - state = 5101; - return true; - case 's': - state = 5104; - return true; - } - break; - case 5094: - if ('c' == current) { - state = 5095; - return true; - } - break; - case 5095: - // lescc; - if (';' == current) { - match = "\u2AA8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5096: - if ('o' == current) { - state = 5097; - return true; - } - break; - case 5097: - if ('t' == current) { - state = 5098; - return true; - } - break; - case 5098: - // lesdot; - if (';' == current) { - match = "\u2A7F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 5099; - return true; - } - break; - case 5099: - // lesdoto; - if (';' == current) { - match = "\u2A81"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('r' == current) { - state = 5100; - return true; - } - break; - case 5100: - // lesdotor; - if (';' == current) { - match = "\u2A83"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5101: - // lesg; - if (';' == current) { - match = "\u22DA\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5102; - return true; - } - break; - case 5102: - if ('s' == current) { - state = 5103; - return true; - } - break; - case 5103: - // lesges; - if (';' == current) { - match = "\u2A93"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5104: - switch (current) { - case 'a': - state = 5105; - return true; - case 'd': - state = 5111; - return true; - case 'e': - state = 5114; - return true; - case 'g': - state = 5123; - return true; - case 's': - state = 5126; - return true; - } - break; - case 5105: - if ('p' == current) { - state = 5106; - return true; - } - break; - case 5106: - if ('p' == current) { - state = 5107; - return true; - } - break; - case 5107: - if ('r' == current) { - state = 5108; - return true; - } - break; - case 5108: - if ('o' == current) { - state = 5109; - return true; - } - break; - case 5109: - if ('x' == current) { - state = 5110; - return true; - } - break; - case 5110: - // lessapprox; - if (';' == current) { - match = "\u2A85"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5111: - if ('o' == current) { - state = 5112; - return true; - } - break; - case 5112: - if ('t' == current) { - state = 5113; - return true; - } - break; - case 5113: - // lessdot; - if (';' == current) { - match = "\u22D6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5114: - if ('q' == current) { - state = 5115; - return true; - } - break; - case 5115: - if ('g' == current) { - state = 5116; - return true; - } - else if ('q' == current) { - state = 5119; - return true; - } - break; - case 5116: - if ('t' == current) { - state = 5117; - return true; - } - break; - case 5117: - if ('r' == current) { - state = 5118; - return true; - } - break; - case 5118: - // lesseqgtr; - if (';' == current) { - match = "\u22DA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5119: - if ('g' == current) { - state = 5120; - return true; - } - break; - case 5120: - if ('t' == current) { - state = 5121; - return true; - } - break; - case 5121: - if ('r' == current) { - state = 5122; - return true; - } - break; - case 5122: - // lesseqqgtr; - if (';' == current) { - match = "\u2A8B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5123: - if ('t' == current) { - state = 5124; - return true; - } - break; - case 5124: - if ('r' == current) { - state = 5125; - return true; - } - break; - case 5125: - // lessgtr; - if (';' == current) { - match = "\u2276"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5126: - if ('i' == current) { - state = 5127; - return true; - } - break; - case 5127: - if ('m' == current) { - state = 5128; - return true; - } - break; - case 5128: - // lesssim; - if (';' == current) { - match = "\u2272"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5129: - switch (current) { - case 'i': - state = 5130; - return true; - case 'l': - state = 5134; - return true; - case 'r': - state = 5138; - return true; - } - break; - case 5130: - if ('s' == current) { - state = 5131; - return true; - } - break; - case 5131: - if ('h' == current) { - state = 5132; - return true; - } - break; - case 5132: - if ('t' == current) { - state = 5133; - return true; - } - break; - case 5133: - // lfisht; - if (';' == current) { - match = "\u297C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5134: - if ('o' == current) { - state = 5135; - return true; - } - break; - case 5135: - if ('o' == current) { - state = 5136; - return true; - } - break; - case 5136: - if ('r' == current) { - state = 5137; - return true; - } - break; - case 5137: - // lfloor; - if (';' == current) { - match = "\u230A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5138: - // lfr; - if (';' == current) { - match = "\uD835\uDD29"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5139: - // lg; - if (';' == current) { - match = "\u2276"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('E' == current) { - state = 5140; - return true; - } - break; - case 5140: - // lgE; - if (';' == current) { - match = "\u2A91"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5141: - if ('a' == current) { - state = 5142; - return true; - } - else if ('b' == current) { - state = 5147; - return true; - } - break; - case 5142: - if ('r' == current) { - state = 5143; - return true; - } - break; - case 5143: - if ('d' == current) { - state = 5144; - return true; - } - else if ('u' == current) { - state = 5145; - return true; - } - break; - case 5144: - // lhard; - if (';' == current) { - match = "\u21BD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5145: - // lharu; - if (';' == current) { - match = "\u21BC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('l' == current) { - state = 5146; - return true; - } - break; - case 5146: - // lharul; - if (';' == current) { - match = "\u296A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5147: - if ('l' == current) { - state = 5148; - return true; - } - break; - case 5148: - if ('k' == current) { - state = 5149; - return true; - } - break; - case 5149: - // lhblk; - if (';' == current) { - match = "\u2584"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5150: - if ('c' == current) { - state = 5151; - return true; - } - break; - case 5151: - if ('y' == current) { - state = 5152; - return true; - } - break; - case 5152: - // ljcy; - if (';' == current) { - match = "\u0459"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5153: - switch (current) { - case ';': // ll; - match = "\u226A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 5154; - return true; - case 'c': - state = 5157; - return true; - case 'h': - state = 5163; - return true; - case 't': - state = 5167; - return true; - } - break; - case 5154: - if ('r' == current) { - state = 5155; - return true; - } - break; - case 5155: - if ('r' == current) { - state = 5156; - return true; - } - break; - case 5156: - // llarr; - if (';' == current) { - match = "\u21C7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5157: - if ('o' == current) { - state = 5158; - return true; - } - break; - case 5158: - if ('r' == current) { - state = 5159; - return true; - } - break; - case 5159: - if ('n' == current) { - state = 5160; - return true; - } - break; - case 5160: - if ('e' == current) { - state = 5161; - return true; - } - break; - case 5161: - if ('r' == current) { - state = 5162; - return true; - } - break; - case 5162: - // llcorner; - if (';' == current) { - match = "\u231E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5163: - if ('a' == current) { - state = 5164; - return true; - } - break; - case 5164: - if ('r' == current) { - state = 5165; - return true; - } - break; - case 5165: - if ('d' == current) { - state = 5166; - return true; - } - break; - case 5166: - // llhard; - if (';' == current) { - match = "\u296B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5167: - if ('r' == current) { - state = 5168; - return true; - } - break; - case 5168: - if ('i' == current) { - state = 5169; - return true; - } - break; - case 5169: - // lltri; - if (';' == current) { - match = "\u25FA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5170: - if ('i' == current) { - state = 5171; - return true; - } - else if ('o' == current) { - state = 5175; - return true; - } - break; - case 5171: - if ('d' == current) { - state = 5172; - return true; - } - break; - case 5172: - if ('o' == current) { - state = 5173; - return true; - } - break; - case 5173: - if ('t' == current) { - state = 5174; - return true; - } - break; - case 5174: - // lmidot; - if (';' == current) { - match = "\u0140"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5175: - if ('u' == current) { - state = 5176; - return true; - } - break; - case 5176: - if ('s' == current) { - state = 5177; - return true; - } - break; - case 5177: - if ('t' == current) { - state = 5178; - return true; - } - break; - case 5178: - // lmoust; - if (';' == current) { - match = "\u23B0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('a' == current) { - state = 5179; - return true; - } - break; - case 5179: - if ('c' == current) { - state = 5180; - return true; - } - break; - case 5180: - if ('h' == current) { - state = 5181; - return true; - } - break; - case 5181: - if ('e' == current) { - state = 5182; - return true; - } - break; - case 5182: - // lmoustache; - if (';' == current) { - match = "\u23B0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5183: - switch (current) { - case 'E': - state = 5184; - return true; - case 'a': - state = 5185; - return true; - case 'e': - state = 5191; - return true; - case 's': - state = 5194; - return true; - } - break; - case 5184: - // lnE; - if (';' == current) { - match = "\u2268"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5185: - if ('p' == current) { - state = 5186; - return true; - } - break; - case 5186: - // lnap; - if (';' == current) { - match = "\u2A89"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('p' == current) { - state = 5187; - return true; - } - break; - case 5187: - if ('r' == current) { - state = 5188; - return true; - } - break; - case 5188: - if ('o' == current) { - state = 5189; - return true; - } - break; - case 5189: - if ('x' == current) { - state = 5190; - return true; - } - break; - case 5190: - // lnapprox; - if (';' == current) { - match = "\u2A89"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5191: - // lne; - if (';' == current) { - match = "\u2A87"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 5192; - return true; - } - break; - case 5192: - // lneq; - if (';' == current) { - match = "\u2A87"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 5193; - return true; - } - break; - case 5193: - // lneqq; - if (';' == current) { - match = "\u2268"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5194: - if ('i' == current) { - state = 5195; - return true; - } - break; - case 5195: - if ('m' == current) { - state = 5196; - return true; - } - break; - case 5196: - // lnsim; - if (';' == current) { - match = "\u22E6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5197: - switch (current) { - case 'a': - state = 5198; - return true; - case 'b': - state = 5203; - return true; - case 'n': - state = 5206; - return true; - case 'o': - state = 5243; - return true; - case 'p': - state = 5259; - return true; - case 't': - state = 5266; - return true; - case 'w': - state = 5271; - return true; - case 'z': - state = 5278; - return true; - } - break; - case 5198: - if ('n' == current) { - state = 5199; - return true; - } - else if ('r' == current) { - state = 5201; - return true; - } - break; - case 5199: - if ('g' == current) { - state = 5200; - return true; - } - break; - case 5200: - // loang; - if (';' == current) { - match = "\u27EC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5201: - if ('r' == current) { - state = 5202; - return true; - } - break; - case 5202: - // loarr; - if (';' == current) { - match = "\u21FD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5203: - if ('r' == current) { - state = 5204; - return true; - } - break; - case 5204: - if ('k' == current) { - state = 5205; - return true; - } - break; - case 5205: - // lobrk; - if (';' == current) { - match = "\u27E6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5206: - if ('g' == current) { - state = 5207; - return true; - } - break; - case 5207: - switch (current) { - case 'l': - state = 5208; - return true; - case 'm': - state = 5227; - return true; - case 'r': - state = 5233; - return true; - } - break; - case 5208: - if ('e' == current) { - state = 5209; - return true; - } - break; - case 5209: - if ('f' == current) { - state = 5210; - return true; - } - break; - case 5210: - if ('t' == current) { - state = 5211; - return true; - } - break; - case 5211: - if ('a' == current) { - state = 5212; - return true; - } - else if ('r' == current) { - state = 5217; - return true; - } - break; - case 5212: - if ('r' == current) { - state = 5213; - return true; - } - break; - case 5213: - if ('r' == current) { - state = 5214; - return true; - } - break; - case 5214: - if ('o' == current) { - state = 5215; - return true; - } - break; - case 5215: - if ('w' == current) { - state = 5216; - return true; - } - break; - case 5216: - // longleftarrow; - if (';' == current) { - match = "\u27F5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5217: - if ('i' == current) { - state = 5218; - return true; - } - break; - case 5218: - if ('g' == current) { - state = 5219; - return true; - } - break; - case 5219: - if ('h' == current) { - state = 5220; - return true; - } - break; - case 5220: - if ('t' == current) { - state = 5221; - return true; - } - break; - case 5221: - if ('a' == current) { - state = 5222; - return true; - } - break; - case 5222: - if ('r' == current) { - state = 5223; - return true; - } - break; - case 5223: - if ('r' == current) { - state = 5224; - return true; - } - break; - case 5224: - if ('o' == current) { - state = 5225; - return true; - } - break; - case 5225: - if ('w' == current) { - state = 5226; - return true; - } - break; - case 5226: - // longleftrightarrow; - if (';' == current) { - match = "\u27F7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5227: - if ('a' == current) { - state = 5228; - return true; - } - break; - case 5228: - if ('p' == current) { - state = 5229; - return true; - } - break; - case 5229: - if ('s' == current) { - state = 5230; - return true; - } - break; - case 5230: - if ('t' == current) { - state = 5231; - return true; - } - break; - case 5231: - if ('o' == current) { - state = 5232; - return true; - } - break; - case 5232: - // longmapsto; - if (';' == current) { - match = "\u27FC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5233: - if ('i' == current) { - state = 5234; - return true; - } - break; - case 5234: - if ('g' == current) { - state = 5235; - return true; - } - break; - case 5235: - if ('h' == current) { - state = 5236; - return true; - } - break; - case 5236: - if ('t' == current) { - state = 5237; - return true; - } - break; - case 5237: - if ('a' == current) { - state = 5238; - return true; - } - break; - case 5238: - if ('r' == current) { - state = 5239; - return true; - } - break; - case 5239: - if ('r' == current) { - state = 5240; - return true; - } - break; - case 5240: - if ('o' == current) { - state = 5241; - return true; - } - break; - case 5241: - if ('w' == current) { - state = 5242; - return true; - } - break; - case 5242: - // longrightarrow; - if (';' == current) { - match = "\u27F6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5243: - if ('p' == current) { - state = 5244; - return true; - } - break; - case 5244: - if ('a' == current) { - state = 5245; - return true; - } - break; - case 5245: - if ('r' == current) { - state = 5246; - return true; - } - break; - case 5246: - if ('r' == current) { - state = 5247; - return true; - } - break; - case 5247: - if ('o' == current) { - state = 5248; - return true; - } - break; - case 5248: - if ('w' == current) { - state = 5249; - return true; - } - break; - case 5249: - if ('l' == current) { - state = 5250; - return true; - } - else if ('r' == current) { - state = 5254; - return true; - } - break; - case 5250: - if ('e' == current) { - state = 5251; - return true; - } - break; - case 5251: - if ('f' == current) { - state = 5252; - return true; - } - break; - case 5252: - if ('t' == current) { - state = 5253; - return true; - } - break; - case 5253: - // looparrowleft; - if (';' == current) { - match = "\u21AB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5254: - if ('i' == current) { - state = 5255; - return true; - } - break; - case 5255: - if ('g' == current) { - state = 5256; - return true; - } - break; - case 5256: - if ('h' == current) { - state = 5257; - return true; - } - break; - case 5257: - if ('t' == current) { - state = 5258; - return true; - } - break; - case 5258: - // looparrowright; - if (';' == current) { - match = "\u21AC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5259: - switch (current) { - case 'a': - state = 5260; - return true; - case 'f': - state = 5262; - return true; - case 'l': - state = 5263; - return true; - } - break; - case 5260: - if ('r' == current) { - state = 5261; - return true; - } - break; - case 5261: - // lopar; - if (';' == current) { - match = "\u2985"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5262: - // lopf; - if (';' == current) { - match = "\uD835\uDD5D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5263: - if ('u' == current) { - state = 5264; - return true; - } - break; - case 5264: - if ('s' == current) { - state = 5265; - return true; - } - break; - case 5265: - // loplus; - if (';' == current) { - match = "\u2A2D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5266: - if ('i' == current) { - state = 5267; - return true; - } - break; - case 5267: - if ('m' == current) { - state = 5268; - return true; - } - break; - case 5268: - if ('e' == current) { - state = 5269; - return true; - } - break; - case 5269: - if ('s' == current) { - state = 5270; - return true; - } - break; - case 5270: - // lotimes; - if (';' == current) { - match = "\u2A34"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5271: - if ('a' == current) { - state = 5272; - return true; - } - else if ('b' == current) { - state = 5275; - return true; - } - break; - case 5272: - if ('s' == current) { - state = 5273; - return true; - } - break; - case 5273: - if ('t' == current) { - state = 5274; - return true; - } - break; - case 5274: - // lowast; - if (';' == current) { - match = "\u2217"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5275: - if ('a' == current) { - state = 5276; - return true; - } - break; - case 5276: - if ('r' == current) { - state = 5277; - return true; - } - break; - case 5277: - // lowbar; - if (';' == current) { - match = "_"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5278: - switch (current) { - case ';': // loz; - match = "\u25CA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 5279; - return true; - case 'f': - state = 5283; - return true; - } - break; - case 5279: - if ('n' == current) { - state = 5280; - return true; - } - break; - case 5280: - if ('g' == current) { - state = 5281; - return true; - } - break; - case 5281: - if ('e' == current) { - state = 5282; - return true; - } - break; - case 5282: - // lozenge; - if (';' == current) { - match = "\u25CA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5283: - // lozf; - if (';' == current) { - match = "\u29EB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5284: - if ('a' == current) { - state = 5285; - return true; - } - break; - case 5285: - if ('r' == current) { - state = 5286; - return true; - } - break; - case 5286: - // lpar; - if (';' == current) { - match = "("; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('l' == current) { - state = 5287; - return true; - } - break; - case 5287: - if ('t' == current) { - state = 5288; - return true; - } - break; - case 5288: - // lparlt; - if (';' == current) { - match = "\u2993"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5289: - switch (current) { - case 'a': - state = 5290; - return true; - case 'c': - state = 5293; - return true; - case 'h': - state = 5299; - return true; - case 'm': - state = 5303; - return true; - case 't': - state = 5304; - return true; - } - break; - case 5290: - if ('r' == current) { - state = 5291; - return true; - } - break; - case 5291: - if ('r' == current) { - state = 5292; - return true; - } - break; - case 5292: - // lrarr; - if (';' == current) { - match = "\u21C6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5293: - if ('o' == current) { - state = 5294; - return true; - } - break; - case 5294: - if ('r' == current) { - state = 5295; - return true; - } - break; - case 5295: - if ('n' == current) { - state = 5296; - return true; - } - break; - case 5296: - if ('e' == current) { - state = 5297; - return true; - } - break; - case 5297: - if ('r' == current) { - state = 5298; - return true; - } - break; - case 5298: - // lrcorner; - if (';' == current) { - match = "\u231F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5299: - if ('a' == current) { - state = 5300; - return true; - } - break; - case 5300: - if ('r' == current) { - state = 5301; - return true; - } - break; - case 5301: - // lrhar; - if (';' == current) { - match = "\u21CB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 5302; - return true; - } - break; - case 5302: - // lrhard; - if (';' == current) { - match = "\u296D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5303: - // lrm; - if (';' == current) { - match = "\u200E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5304: - if ('r' == current) { - state = 5305; - return true; - } - break; - case 5305: - if ('i' == current) { - state = 5306; - return true; - } - break; - case 5306: - // lrtri; - if (';' == current) { - match = "\u22BF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5307: - switch (current) { - case 'a': - state = 5308; - return true; - case 'c': - state = 5312; - return true; - case 'h': - state = 5314; - return true; - case 'i': - state = 5315; - return true; - case 'q': - state = 5319; - return true; - case 't': - state = 5324; - return true; - } - break; - case 5308: - if ('q' == current) { - state = 5309; - return true; - } - break; - case 5309: - if ('u' == current) { - state = 5310; - return true; - } - break; - case 5310: - if ('o' == current) { - state = 5311; - return true; - } - break; - case 5311: - // lsaquo; - if (';' == current) { - match = "\u2039"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5312: - if ('r' == current) { - state = 5313; - return true; - } - break; - case 5313: - // lscr; - if (';' == current) { - match = "\uD835\uDCC1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5314: - // lsh; - if (';' == current) { - match = "\u21B0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5315: - if ('m' == current) { - state = 5316; - return true; - } - break; - case 5316: - switch (current) { - case ';': // lsim; - match = "\u2272"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 5317; - return true; - case 'g': - state = 5318; - return true; - } - break; - case 5317: - // lsime; - if (';' == current) { - match = "\u2A8D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5318: - // lsimg; - if (';' == current) { - match = "\u2A8F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5319: - if ('b' == current) { - state = 5320; - return true; - } - else if ('u' == current) { - state = 5321; - return true; - } - break; - case 5320: - // lsqb; - if (';' == current) { - match = "["; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5321: - if ('o' == current) { - state = 5322; - return true; - } - break; - case 5322: - // lsquo; - if (';' == current) { - match = "\u2018"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('r' == current) { - state = 5323; - return true; - } - break; - case 5323: - // lsquor; - if (';' == current) { - match = "\u201A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5324: - if ('r' == current) { - state = 5325; - return true; - } - break; - case 5325: - if ('o' == current) { - state = 5326; - return true; - } - break; - case 5326: - if ('k' == current) { - state = 5327; - return true; - } - break; - case 5327: - // lstrok; - if (';' == current) { - match = "\u0142"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5328: - switch (current) { - case ';': // lt; - match = "<"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'c': - state = 5329; - return true; - case 'd': - state = 5333; - return true; - case 'h': - state = 5336; - return true; - case 'i': - state = 5340; - return true; - case 'l': - state = 5344; - return true; - case 'q': - state = 5348; - return true; - case 'r': - state = 5353; - return true; - } - break; - case 5329: - if ('c' == current) { - state = 5330; - return true; - } - else if ('i' == current) { - state = 5331; - return true; - } - break; - case 5330: - // ltcc; - if (';' == current) { - match = "\u2AA6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5331: - if ('r' == current) { - state = 5332; - return true; - } - break; - case 5332: - // ltcir; - if (';' == current) { - match = "\u2A79"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5333: - if ('o' == current) { - state = 5334; - return true; - } - break; - case 5334: - if ('t' == current) { - state = 5335; - return true; - } - break; - case 5335: - // ltdot; - if (';' == current) { - match = "\u22D6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5336: - if ('r' == current) { - state = 5337; - return true; - } - break; - case 5337: - if ('e' == current) { - state = 5338; - return true; - } - break; - case 5338: - if ('e' == current) { - state = 5339; - return true; - } - break; - case 5339: - // lthree; - if (';' == current) { - match = "\u22CB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5340: - if ('m' == current) { - state = 5341; - return true; - } - break; - case 5341: - if ('e' == current) { - state = 5342; - return true; - } - break; - case 5342: - if ('s' == current) { - state = 5343; - return true; - } - break; - case 5343: - // ltimes; - if (';' == current) { - match = "\u22C9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5344: - if ('a' == current) { - state = 5345; - return true; - } - break; - case 5345: - if ('r' == current) { - state = 5346; - return true; - } - break; - case 5346: - if ('r' == current) { - state = 5347; - return true; - } - break; - case 5347: - // ltlarr; - if (';' == current) { - match = "\u2976"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5348: - if ('u' == current) { - state = 5349; - return true; - } - break; - case 5349: - if ('e' == current) { - state = 5350; - return true; - } - break; - case 5350: - if ('s' == current) { - state = 5351; - return true; - } - break; - case 5351: - if ('t' == current) { - state = 5352; - return true; - } - break; - case 5352: - // ltquest; - if (';' == current) { - match = "\u2A7B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5353: - if ('P' == current) { - state = 5354; - return true; - } - else if ('i' == current) { - state = 5357; - return true; - } - break; - case 5354: - if ('a' == current) { - state = 5355; - return true; - } - break; - case 5355: - if ('r' == current) { - state = 5356; - return true; - } - break; - case 5356: - // ltrPar; - if (';' == current) { - match = "\u2996"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5357: - switch (current) { - case ';': // ltri; - match = "\u25C3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 5358; - return true; - case 'f': - state = 5359; - return true; - } - break; - case 5358: - // ltrie; - if (';' == current) { - match = "\u22B4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5359: - // ltrif; - if (';' == current) { - match = "\u25C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5360: - if ('r' == current) { - state = 5361; - return true; - } - break; - case 5361: - if ('d' == current) { - state = 5362; - return true; - } - else if ('u' == current) { - state = 5367; - return true; - } - break; - case 5362: - if ('s' == current) { - state = 5363; - return true; - } - break; - case 5363: - if ('h' == current) { - state = 5364; - return true; - } - break; - case 5364: - if ('a' == current) { - state = 5365; - return true; - } - break; - case 5365: - if ('r' == current) { - state = 5366; - return true; - } - break; - case 5366: - // lurdshar; - if (';' == current) { - match = "\u294A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5367: - if ('h' == current) { - state = 5368; - return true; - } - break; - case 5368: - if ('a' == current) { - state = 5369; - return true; - } - break; - case 5369: - if ('r' == current) { - state = 5370; - return true; - } - break; - case 5370: - // luruhar; - if (';' == current) { - match = "\u2966"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5371: - if ('e' == current) { - state = 5372; - return true; - } - else if ('n' == current) { - state = 5379; - return true; - } - break; - case 5372: - if ('r' == current) { - state = 5373; - return true; - } - break; - case 5373: - if ('t' == current) { - state = 5374; - return true; - } - break; - case 5374: - if ('n' == current) { - state = 5375; - return true; - } - break; - case 5375: - if ('e' == current) { - state = 5376; - return true; - } - break; - case 5376: - if ('q' == current) { - state = 5377; - return true; - } - break; - case 5377: - if ('q' == current) { - state = 5378; - return true; - } - break; - case 5378: - // lvertneqq; - if (';' == current) { - match = "\u2268\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5379: - if ('E' == current) { - state = 5380; - return true; - } - break; - case 5380: - // lvnE; - if (';' == current) { - match = "\u2268\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5381: - switch (current) { - case 'D': - state = 5382; - return true; - case 'a': - state = 5386; - return true; - case 'c': - state = 5413; - return true; - case 'd': - state = 5419; - return true; - case 'e': - state = 5423; - return true; - case 'f': - state = 5435; - return true; - case 'h': - state = 5437; - return true; - case 'i': - state = 5439; - return true; - case 'l': - state = 5459; - return true; - case 'n': - state = 5464; - return true; - case 'o': - state = 5469; - return true; - case 'p': - state = 5476; - return true; - case 's': - state = 5477; - return true; - case 'u': - state = 5484; - return true; - } - break; - case 5382: - if ('D' == current) { - state = 5383; - return true; - } - break; - case 5383: - if ('o' == current) { - state = 5384; - return true; - } - break; - case 5384: - if ('t' == current) { - state = 5385; - return true; - } - break; - case 5385: - // mDDot; - if (';' == current) { - match = "\u223A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5386: - switch (current) { - case 'c': - state = 5387; - return true; - case 'l': - state = 5389; - return true; - case 'p': - state = 5395; - return true; - case 'r': - state = 5409; - return true; - } - break; - case 5387: - // macr - if ('r' == current) { - match = "\u00AF"; - matchLength = consumedCount; - state = 5388; - return true; - } - break; - case 5388: - // macr; - if (';' == current) { - match = "\u00AF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5389: - if ('e' == current) { - state = 5390; - return true; - } - else if ('t' == current) { - state = 5391; - return true; - } - break; - case 5390: - // male; - if (';' == current) { - match = "\u2642"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5391: - // malt; - if (';' == current) { - match = "\u2720"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5392; - return true; - } - break; - case 5392: - if ('s' == current) { - state = 5393; - return true; - } - break; - case 5393: - if ('e' == current) { - state = 5394; - return true; - } - break; - case 5394: - // maltese; - if (';' == current) { - match = "\u2720"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5395: - // map; - if (';' == current) { - match = "\u21A6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 5396; - return true; - } - break; - case 5396: - if ('t' == current) { - state = 5397; - return true; - } - break; - case 5397: - if ('o' == current) { - state = 5398; - return true; - } - break; - case 5398: - switch (current) { - case ';': // mapsto; - match = "\u21A6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'd': - state = 5399; - return true; - case 'l': - state = 5403; - return true; - case 'u': - state = 5407; - return true; - } - break; - case 5399: - if ('o' == current) { - state = 5400; - return true; - } - break; - case 5400: - if ('w' == current) { - state = 5401; - return true; - } - break; - case 5401: - if ('n' == current) { - state = 5402; - return true; - } - break; - case 5402: - // mapstodown; - if (';' == current) { - match = "\u21A7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5403: - if ('e' == current) { - state = 5404; - return true; - } - break; - case 5404: - if ('f' == current) { - state = 5405; - return true; - } - break; - case 5405: - if ('t' == current) { - state = 5406; - return true; - } - break; - case 5406: - // mapstoleft; - if (';' == current) { - match = "\u21A4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5407: - if ('p' == current) { - state = 5408; - return true; - } - break; - case 5408: - // mapstoup; - if (';' == current) { - match = "\u21A5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5409: - if ('k' == current) { - state = 5410; - return true; - } - break; - case 5410: - if ('e' == current) { - state = 5411; - return true; - } - break; - case 5411: - if ('r' == current) { - state = 5412; - return true; - } - break; - case 5412: - // marker; - if (';' == current) { - match = "\u25AE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5413: - if ('o' == current) { - state = 5414; - return true; - } - else if ('y' == current) { - state = 5418; - return true; - } - break; - case 5414: - if ('m' == current) { - state = 5415; - return true; - } - break; - case 5415: - if ('m' == current) { - state = 5416; - return true; - } - break; - case 5416: - if ('a' == current) { - state = 5417; - return true; - } - break; - case 5417: - // mcomma; - if (';' == current) { - match = "\u2A29"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5418: - // mcy; - if (';' == current) { - match = "\u043C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5419: - if ('a' == current) { - state = 5420; - return true; - } - break; - case 5420: - if ('s' == current) { - state = 5421; - return true; - } - break; - case 5421: - if ('h' == current) { - state = 5422; - return true; - } - break; - case 5422: - // mdash; - if (';' == current) { - match = "\u2014"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5423: - if ('a' == current) { - state = 5424; - return true; - } - break; - case 5424: - if ('s' == current) { - state = 5425; - return true; - } - break; - case 5425: - if ('u' == current) { - state = 5426; - return true; - } - break; - case 5426: - if ('r' == current) { - state = 5427; - return true; - } - break; - case 5427: - if ('e' == current) { - state = 5428; - return true; - } - break; - case 5428: - if ('d' == current) { - state = 5429; - return true; - } - break; - case 5429: - if ('a' == current) { - state = 5430; - return true; - } - break; - case 5430: - if ('n' == current) { - state = 5431; - return true; - } - break; - case 5431: - if ('g' == current) { - state = 5432; - return true; - } - break; - case 5432: - if ('l' == current) { - state = 5433; - return true; - } - break; - case 5433: - if ('e' == current) { - state = 5434; - return true; - } - break; - case 5434: - // measuredangle; - if (';' == current) { - match = "\u2221"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5435: - if ('r' == current) { - state = 5436; - return true; - } - break; - case 5436: - // mfr; - if (';' == current) { - match = "\uD835\uDD2A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5437: - if ('o' == current) { - state = 5438; - return true; - } - break; - case 5438: - // mho; - if (';' == current) { - match = "\u2127"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5439: - switch (current) { - case 'c': - state = 5440; - return true; - case 'd': - state = 5443; - return true; - case 'n': - state = 5453; - return true; - } - break; - case 5440: - if ('r' == current) { - state = 5441; - return true; - } - break; - case 5441: - // micro - if ('o' == current) { - match = "\u00B5"; - matchLength = consumedCount; - state = 5442; - return true; - } - break; - case 5442: - // micro; - if (';' == current) { - match = "\u00B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5443: - switch (current) { - case ';': // mid; - match = "\u2223"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 5444; - return true; - case 'c': - state = 5447; - return true; - case 'd': - state = 5450; - return true; - } - break; - case 5444: - if ('s' == current) { - state = 5445; - return true; - } - break; - case 5445: - if ('t' == current) { - state = 5446; - return true; - } - break; - case 5446: - // midast; - if (';' == current) { - match = "*"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5447: - if ('i' == current) { - state = 5448; - return true; - } - break; - case 5448: - if ('r' == current) { - state = 5449; - return true; - } - break; - case 5449: - // midcir; - if (';' == current) { - match = "\u2AF0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5450: - if ('o' == current) { - state = 5451; - return true; - } - break; - case 5451: - // middot - if ('t' == current) { - match = "\u00B7"; - matchLength = consumedCount; - state = 5452; - return true; - } - break; - case 5452: - // middot; - if (';' == current) { - match = "\u00B7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5453: - if ('u' == current) { - state = 5454; - return true; - } - break; - case 5454: - if ('s' == current) { - state = 5455; - return true; - } - break; - case 5455: - switch (current) { - case ';': // minus; - match = "\u2212"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'b': - state = 5456; - return true; - case 'd': - state = 5457; - return true; - } - break; - case 5456: - // minusb; - if (';' == current) { - match = "\u229F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5457: - // minusd; - if (';' == current) { - match = "\u2238"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('u' == current) { - state = 5458; - return true; - } - break; - case 5458: - // minusdu; - if (';' == current) { - match = "\u2A2A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5459: - if ('c' == current) { - state = 5460; - return true; - } - else if ('d' == current) { - state = 5462; - return true; - } - break; - case 5460: - if ('p' == current) { - state = 5461; - return true; - } - break; - case 5461: - // mlcp; - if (';' == current) { - match = "\u2ADB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5462: - if ('r' == current) { - state = 5463; - return true; - } - break; - case 5463: - // mldr; - if (';' == current) { - match = "\u2026"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5464: - if ('p' == current) { - state = 5465; - return true; - } - break; - case 5465: - if ('l' == current) { - state = 5466; - return true; - } - break; - case 5466: - if ('u' == current) { - state = 5467; - return true; - } - break; - case 5467: - if ('s' == current) { - state = 5468; - return true; - } - break; - case 5468: - // mnplus; - if (';' == current) { - match = "\u2213"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5469: - if ('d' == current) { - state = 5470; - return true; - } - else if ('p' == current) { - state = 5474; - return true; - } - break; - case 5470: - if ('e' == current) { - state = 5471; - return true; - } - break; - case 5471: - if ('l' == current) { - state = 5472; - return true; - } - break; - case 5472: - if ('s' == current) { - state = 5473; - return true; - } - break; - case 5473: - // models; - if (';' == current) { - match = "\u22A7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5474: - if ('f' == current) { - state = 5475; - return true; - } - break; - case 5475: - // mopf; - if (';' == current) { - match = "\uD835\uDD5E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5476: - // mp; - if (';' == current) { - match = "\u2213"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5477: - if ('c' == current) { - state = 5478; - return true; - } - else if ('t' == current) { - state = 5480; - return true; - } - break; - case 5478: - if ('r' == current) { - state = 5479; - return true; - } - break; - case 5479: - // mscr; - if (';' == current) { - match = "\uD835\uDCC2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5480: - if ('p' == current) { - state = 5481; - return true; - } - break; - case 5481: - if ('o' == current) { - state = 5482; - return true; - } - break; - case 5482: - if ('s' == current) { - state = 5483; - return true; - } - break; - case 5483: - // mstpos; - if (';' == current) { - match = "\u223E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5484: - switch (current) { - case ';': // mu; - match = "\u03BC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'l': - state = 5485; - return true; - case 'm': - state = 5491; - return true; - } - break; - case 5485: - if ('t' == current) { - state = 5486; - return true; - } - break; - case 5486: - if ('i' == current) { - state = 5487; - return true; - } - break; - case 5487: - if ('m' == current) { - state = 5488; - return true; - } - break; - case 5488: - if ('a' == current) { - state = 5489; - return true; - } - break; - case 5489: - if ('p' == current) { - state = 5490; - return true; - } - break; - case 5490: - // multimap; - if (';' == current) { - match = "\u22B8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5491: - if ('a' == current) { - state = 5492; - return true; - } - break; - case 5492: - if ('p' == current) { - state = 5493; - return true; - } - break; - case 5493: - // mumap; - if (';' == current) { - match = "\u22B8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5494: - switch (current) { - case 'G': - state = 5495; - return true; - case 'L': - state = 5499; - return true; - case 'R': - state = 5521; - return true; - case 'V': - state = 5531; - return true; - case 'a': - state = 5540; - return true; - case 'b': - state = 5566; - return true; - case 'c': - state = 5573; - return true; - case 'd': - state = 5592; - return true; - case 'e': - state = 5596; - return true; - case 'f': - state = 5625; - return true; - case 'g': - state = 5627; - return true; - case 'h': - state = 5643; - return true; - case 'i': - state = 5653; - return true; - case 'j': - state = 5657; - return true; - case 'l': - state = 5660; - return true; - case 'm': - state = 5704; - return true; - case 'o': - state = 5707; - return true; - case 'p': - state = 5727; - return true; - case 'r': - state = 5751; - return true; - case 's': - state = 5773; - return true; - case 't': - state = 5835; - return true; - case 'u': - state = 5864; - return true; - case 'v': - state = 5871; - return true; - case 'w': - state = 5914; - return true; - } - break; - case 5495: - if ('g' == current) { - state = 5496; - return true; - } - else if ('t' == current) { - state = 5497; - return true; - } - break; - case 5496: - // nGg; - if (';' == current) { - match = "\u22D9\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5497: - // nGt; - if (';' == current) { - match = "\u226B\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 5498; - return true; - } - break; - case 5498: - // nGtv; - if (';' == current) { - match = "\u226B\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5499: - switch (current) { - case 'e': - state = 5500; - return true; - case 'l': - state = 5518; - return true; - case 't': - state = 5519; - return true; - } - break; - case 5500: - if ('f' == current) { - state = 5501; - return true; - } - break; - case 5501: - if ('t' == current) { - state = 5502; - return true; - } - break; - case 5502: - if ('a' == current) { - state = 5503; - return true; - } - else if ('r' == current) { - state = 5508; - return true; - } - break; - case 5503: - if ('r' == current) { - state = 5504; - return true; - } - break; - case 5504: - if ('r' == current) { - state = 5505; - return true; - } - break; - case 5505: - if ('o' == current) { - state = 5506; - return true; - } - break; - case 5506: - if ('w' == current) { - state = 5507; - return true; - } - break; - case 5507: - // nLeftarrow; - if (';' == current) { - match = "\u21CD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5508: - if ('i' == current) { - state = 5509; - return true; - } - break; - case 5509: - if ('g' == current) { - state = 5510; - return true; - } - break; - case 5510: - if ('h' == current) { - state = 5511; - return true; - } - break; - case 5511: - if ('t' == current) { - state = 5512; - return true; - } - break; - case 5512: - if ('a' == current) { - state = 5513; - return true; - } - break; - case 5513: - if ('r' == current) { - state = 5514; - return true; - } - break; - case 5514: - if ('r' == current) { - state = 5515; - return true; - } - break; - case 5515: - if ('o' == current) { - state = 5516; - return true; - } - break; - case 5516: - if ('w' == current) { - state = 5517; - return true; - } - break; - case 5517: - // nLeftrightarrow; - if (';' == current) { - match = "\u21CE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5518: - // nLl; - if (';' == current) { - match = "\u22D8\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5519: - // nLt; - if (';' == current) { - match = "\u226A\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 5520; - return true; - } - break; - case 5520: - // nLtv; - if (';' == current) { - match = "\u226A\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5521: - if ('i' == current) { - state = 5522; - return true; - } - break; - case 5522: - if ('g' == current) { - state = 5523; - return true; - } - break; - case 5523: - if ('h' == current) { - state = 5524; - return true; - } - break; - case 5524: - if ('t' == current) { - state = 5525; - return true; - } - break; - case 5525: - if ('a' == current) { - state = 5526; - return true; - } - break; - case 5526: - if ('r' == current) { - state = 5527; - return true; - } - break; - case 5527: - if ('r' == current) { - state = 5528; - return true; - } - break; - case 5528: - if ('o' == current) { - state = 5529; - return true; - } - break; - case 5529: - if ('w' == current) { - state = 5530; - return true; - } - break; - case 5530: - // nRightarrow; - if (';' == current) { - match = "\u21CF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5531: - if ('D' == current) { - state = 5532; - return true; - } - else if ('d' == current) { - state = 5536; - return true; - } - break; - case 5532: - if ('a' == current) { - state = 5533; - return true; - } - break; - case 5533: - if ('s' == current) { - state = 5534; - return true; - } - break; - case 5534: - if ('h' == current) { - state = 5535; - return true; - } - break; - case 5535: - // nVDash; - if (';' == current) { - match = "\u22AF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5536: - if ('a' == current) { - state = 5537; - return true; - } - break; - case 5537: - if ('s' == current) { - state = 5538; - return true; - } - break; - case 5538: - if ('h' == current) { - state = 5539; - return true; - } - break; - case 5539: - // nVdash; - if (';' == current) { - match = "\u22AE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5540: - switch (current) { - case 'b': - state = 5541; - return true; - case 'c': - state = 5544; - return true; - case 'n': - state = 5548; - return true; - case 'p': - state = 5550; - return true; - case 't': - state = 5560; - return true; - } - break; - case 5541: - if ('l' == current) { - state = 5542; - return true; - } - break; - case 5542: - if ('a' == current) { - state = 5543; - return true; - } - break; - case 5543: - // nabla; - if (';' == current) { - match = "\u2207"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5544: - if ('u' == current) { - state = 5545; - return true; - } - break; - case 5545: - if ('t' == current) { - state = 5546; - return true; - } - break; - case 5546: - if ('e' == current) { - state = 5547; - return true; - } - break; - case 5547: - // nacute; - if (';' == current) { - match = "\u0144"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5548: - if ('g' == current) { - state = 5549; - return true; - } - break; - case 5549: - // nang; - if (';' == current) { - match = "\u2220\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5550: - switch (current) { - case ';': // nap; - match = "\u2249"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 5551; - return true; - case 'i': - state = 5552; - return true; - case 'o': - state = 5554; - return true; - case 'p': - state = 5556; - return true; - } - break; - case 5551: - // napE; - if (';' == current) { - match = "\u2A70\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5552: - if ('d' == current) { - state = 5553; - return true; - } - break; - case 5553: - // napid; - if (';' == current) { - match = "\u224B\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5554: - if ('s' == current) { - state = 5555; - return true; - } - break; - case 5555: - // napos; - if (';' == current) { - match = "\u0149"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5556: - if ('r' == current) { - state = 5557; - return true; - } - break; - case 5557: - if ('o' == current) { - state = 5558; - return true; - } - break; - case 5558: - if ('x' == current) { - state = 5559; - return true; - } - break; - case 5559: - // napprox; - if (';' == current) { - match = "\u2249"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5560: - if ('u' == current) { - state = 5561; - return true; - } - break; - case 5561: - if ('r' == current) { - state = 5562; - return true; - } - break; - case 5562: - // natur; - if (';' == current) { - match = "\u266E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('a' == current) { - state = 5563; - return true; - } - break; - case 5563: - if ('l' == current) { - state = 5564; - return true; - } - break; - case 5564: - // natural; - if (';' == current) { - match = "\u266E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 5565; - return true; - } - break; - case 5565: - // naturals; - if (';' == current) { - match = "\u2115"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5566: - if ('s' == current) { - state = 5567; - return true; - } - else if ('u' == current) { - state = 5569; - return true; - } - break; - case 5567: - // nbsp - if ('p' == current) { - match = "\u00A0"; - matchLength = consumedCount; - state = 5568; - return true; - } - break; - case 5568: - // nbsp; - if (';' == current) { - match = "\u00A0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5569: - if ('m' == current) { - state = 5570; - return true; - } - break; - case 5570: - if ('p' == current) { - state = 5571; - return true; - } - break; - case 5571: - // nbump; - if (';' == current) { - match = "\u224E\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5572; - return true; - } - break; - case 5572: - // nbumpe; - if (';' == current) { - match = "\u224F\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5573: - switch (current) { - case 'a': - state = 5574; - return true; - case 'e': - state = 5579; - return true; - case 'o': - state = 5583; - return true; - case 'u': - state = 5589; - return true; - case 'y': - state = 5591; - return true; - } - break; - case 5574: - if ('p' == current) { - state = 5575; - return true; - } - else if ('r' == current) { - state = 5576; - return true; - } - break; - case 5575: - // ncap; - if (';' == current) { - match = "\u2A43"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5576: - if ('o' == current) { - state = 5577; - return true; - } - break; - case 5577: - if ('n' == current) { - state = 5578; - return true; - } - break; - case 5578: - // ncaron; - if (';' == current) { - match = "\u0148"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5579: - if ('d' == current) { - state = 5580; - return true; - } - break; - case 5580: - if ('i' == current) { - state = 5581; - return true; - } - break; - case 5581: - if ('l' == current) { - state = 5582; - return true; - } - break; - case 5582: - // ncedil; - if (';' == current) { - match = "\u0146"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5583: - if ('n' == current) { - state = 5584; - return true; - } - break; - case 5584: - if ('g' == current) { - state = 5585; - return true; - } - break; - case 5585: - // ncong; - if (';' == current) { - match = "\u2247"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 5586; - return true; - } - break; - case 5586: - if ('o' == current) { - state = 5587; - return true; - } - break; - case 5587: - if ('t' == current) { - state = 5588; - return true; - } - break; - case 5588: - // ncongdot; - if (';' == current) { - match = "\u2A6D\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5589: - if ('p' == current) { - state = 5590; - return true; - } - break; - case 5590: - // ncup; - if (';' == current) { - match = "\u2A42"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5591: - // ncy; - if (';' == current) { - match = "\u043D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5592: - if ('a' == current) { - state = 5593; - return true; - } - break; - case 5593: - if ('s' == current) { - state = 5594; - return true; - } - break; - case 5594: - if ('h' == current) { - state = 5595; - return true; - } - break; - case 5595: - // ndash; - if (';' == current) { - match = "\u2013"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5596: - switch (current) { - case ';': // ne; - match = "\u2260"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'A': - state = 5597; - return true; - case 'a': - state = 5600; - return true; - case 'd': - state = 5607; - return true; - case 'q': - state = 5610; - return true; - case 's': - state = 5614; - return true; - case 'x': - state = 5620; - return true; - } - break; - case 5597: - if ('r' == current) { - state = 5598; - return true; - } - break; - case 5598: - if ('r' == current) { - state = 5599; - return true; - } - break; - case 5599: - // neArr; - if (';' == current) { - match = "\u21D7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5600: - if ('r' == current) { - state = 5601; - return true; - } - break; - case 5601: - if ('h' == current) { - state = 5602; - return true; - } - else if ('r' == current) { - state = 5604; - return true; - } - break; - case 5602: - if ('k' == current) { - state = 5603; - return true; - } - break; - case 5603: - // nearhk; - if (';' == current) { - match = "\u2924"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5604: - // nearr; - if (';' == current) { - match = "\u2197"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 5605; - return true; - } - break; - case 5605: - if ('w' == current) { - state = 5606; - return true; - } - break; - case 5606: - // nearrow; - if (';' == current) { - match = "\u2197"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5607: - if ('o' == current) { - state = 5608; - return true; - } - break; - case 5608: - if ('t' == current) { - state = 5609; - return true; - } - break; - case 5609: - // nedot; - if (';' == current) { - match = "\u2250\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5610: - if ('u' == current) { - state = 5611; - return true; - } - break; - case 5611: - if ('i' == current) { - state = 5612; - return true; - } - break; - case 5612: - if ('v' == current) { - state = 5613; - return true; - } - break; - case 5613: - // nequiv; - if (';' == current) { - match = "\u2262"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5614: - if ('e' == current) { - state = 5615; - return true; - } - else if ('i' == current) { - state = 5618; - return true; - } - break; - case 5615: - if ('a' == current) { - state = 5616; - return true; - } - break; - case 5616: - if ('r' == current) { - state = 5617; - return true; - } - break; - case 5617: - // nesear; - if (';' == current) { - match = "\u2928"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5618: - if ('m' == current) { - state = 5619; - return true; - } - break; - case 5619: - // nesim; - if (';' == current) { - match = "\u2242\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5620: - if ('i' == current) { - state = 5621; - return true; - } - break; - case 5621: - if ('s' == current) { - state = 5622; - return true; - } - break; - case 5622: - if ('t' == current) { - state = 5623; - return true; - } - break; - case 5623: - // nexist; - if (';' == current) { - match = "\u2204"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 5624; - return true; - } - break; - case 5624: - // nexists; - if (';' == current) { - match = "\u2204"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5625: - if ('r' == current) { - state = 5626; - return true; - } - break; - case 5626: - // nfr; - if (';' == current) { - match = "\uD835\uDD2B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5627: - switch (current) { - case 'E': - state = 5628; - return true; - case 'e': - state = 5629; - return true; - case 's': - state = 5638; - return true; - case 't': - state = 5641; - return true; - } - break; - case 5628: - // ngE; - if (';' == current) { - match = "\u2267\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5629: - switch (current) { - case ';': // nge; - match = "\u2271"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'q': - state = 5630; - return true; - case 's': - state = 5637; - return true; - } - break; - case 5630: - switch (current) { - case ';': // ngeq; - match = "\u2271"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'q': - state = 5631; - return true; - case 's': - state = 5632; - return true; - } - break; - case 5631: - // ngeqq; - if (';' == current) { - match = "\u2267\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5632: - if ('l' == current) { - state = 5633; - return true; - } - break; - case 5633: - if ('a' == current) { - state = 5634; - return true; - } - break; - case 5634: - if ('n' == current) { - state = 5635; - return true; - } - break; - case 5635: - if ('t' == current) { - state = 5636; - return true; - } - break; - case 5636: - // ngeqslant; - if (';' == current) { - match = "\u2A7E\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5637: - // nges; - if (';' == current) { - match = "\u2A7E\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5638: - if ('i' == current) { - state = 5639; - return true; - } - break; - case 5639: - if ('m' == current) { - state = 5640; - return true; - } - break; - case 5640: - // ngsim; - if (';' == current) { - match = "\u2275"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5641: - // ngt; - if (';' == current) { - match = "\u226F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('r' == current) { - state = 5642; - return true; - } - break; - case 5642: - // ngtr; - if (';' == current) { - match = "\u226F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5643: - switch (current) { - case 'A': - state = 5644; - return true; - case 'a': - state = 5647; - return true; - case 'p': - state = 5650; - return true; - } - break; - case 5644: - if ('r' == current) { - state = 5645; - return true; - } - break; - case 5645: - if ('r' == current) { - state = 5646; - return true; - } - break; - case 5646: - // nhArr; - if (';' == current) { - match = "\u21CE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5647: - if ('r' == current) { - state = 5648; - return true; - } - break; - case 5648: - if ('r' == current) { - state = 5649; - return true; - } - break; - case 5649: - // nharr; - if (';' == current) { - match = "\u21AE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5650: - if ('a' == current) { - state = 5651; - return true; - } - break; - case 5651: - if ('r' == current) { - state = 5652; - return true; - } - break; - case 5652: - // nhpar; - if (';' == current) { - match = "\u2AF2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5653: - switch (current) { - case ';': // ni; - match = "\u220B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 's': - state = 5654; - return true; - case 'v': - state = 5656; - return true; - } - break; - case 5654: - // nis; - if (';' == current) { - match = "\u22FC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 5655; - return true; - } - break; - case 5655: - // nisd; - if (';' == current) { - match = "\u22FA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5656: - // niv; - if (';' == current) { - match = "\u220B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5657: - if ('c' == current) { - state = 5658; - return true; - } - break; - case 5658: - if ('y' == current) { - state = 5659; - return true; - } - break; - case 5659: - // njcy; - if (';' == current) { - match = "\u045A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5660: - switch (current) { - case 'A': - state = 5661; - return true; - case 'E': - state = 5664; - return true; - case 'a': - state = 5665; - return true; - case 'd': - state = 5668; - return true; - case 'e': - state = 5670; - return true; - case 's': - state = 5697; - return true; - case 't': - state = 5700; - return true; - } - break; - case 5661: - if ('r' == current) { - state = 5662; - return true; - } - break; - case 5662: - if ('r' == current) { - state = 5663; - return true; - } - break; - case 5663: - // nlArr; - if (';' == current) { - match = "\u21CD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5664: - // nlE; - if (';' == current) { - match = "\u2266\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5665: - if ('r' == current) { - state = 5666; - return true; - } - break; - case 5666: - if ('r' == current) { - state = 5667; - return true; - } - break; - case 5667: - // nlarr; - if (';' == current) { - match = "\u219A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5668: - if ('r' == current) { - state = 5669; - return true; - } - break; - case 5669: - // nldr; - if (';' == current) { - match = "\u2025"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5670: - switch (current) { - case ';': // nle; - match = "\u2270"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'f': - state = 5671; - return true; - case 'q': - state = 5688; - return true; - case 's': - state = 5695; - return true; - } - break; - case 5671: - if ('t' == current) { - state = 5672; - return true; - } - break; - case 5672: - if ('a' == current) { - state = 5673; - return true; - } - else if ('r' == current) { - state = 5678; - return true; - } - break; - case 5673: - if ('r' == current) { - state = 5674; - return true; - } - break; - case 5674: - if ('r' == current) { - state = 5675; - return true; - } - break; - case 5675: - if ('o' == current) { - state = 5676; - return true; - } - break; - case 5676: - if ('w' == current) { - state = 5677; - return true; - } - break; - case 5677: - // nleftarrow; - if (';' == current) { - match = "\u219A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5678: - if ('i' == current) { - state = 5679; - return true; - } - break; - case 5679: - if ('g' == current) { - state = 5680; - return true; - } - break; - case 5680: - if ('h' == current) { - state = 5681; - return true; - } - break; - case 5681: - if ('t' == current) { - state = 5682; - return true; - } - break; - case 5682: - if ('a' == current) { - state = 5683; - return true; - } - break; - case 5683: - if ('r' == current) { - state = 5684; - return true; - } - break; - case 5684: - if ('r' == current) { - state = 5685; - return true; - } - break; - case 5685: - if ('o' == current) { - state = 5686; - return true; - } - break; - case 5686: - if ('w' == current) { - state = 5687; - return true; - } - break; - case 5687: - // nleftrightarrow; - if (';' == current) { - match = "\u21AE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5688: - switch (current) { - case ';': // nleq; - match = "\u2270"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'q': - state = 5689; - return true; - case 's': - state = 5690; - return true; - } - break; - case 5689: - // nleqq; - if (';' == current) { - match = "\u2266\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5690: - if ('l' == current) { - state = 5691; - return true; - } - break; - case 5691: - if ('a' == current) { - state = 5692; - return true; - } - break; - case 5692: - if ('n' == current) { - state = 5693; - return true; - } - break; - case 5693: - if ('t' == current) { - state = 5694; - return true; - } - break; - case 5694: - // nleqslant; - if (';' == current) { - match = "\u2A7D\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5695: - // nles; - if (';' == current) { - match = "\u2A7D\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 5696; - return true; - } - break; - case 5696: - // nless; - if (';' == current) { - match = "\u226E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5697: - if ('i' == current) { - state = 5698; - return true; - } - break; - case 5698: - if ('m' == current) { - state = 5699; - return true; - } - break; - case 5699: - // nlsim; - if (';' == current) { - match = "\u2274"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5700: - // nlt; - if (';' == current) { - match = "\u226E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('r' == current) { - state = 5701; - return true; - } - break; - case 5701: - if ('i' == current) { - state = 5702; - return true; - } - break; - case 5702: - // nltri; - if (';' == current) { - match = "\u22EA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5703; - return true; - } - break; - case 5703: - // nltrie; - if (';' == current) { - match = "\u22EC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5704: - if ('i' == current) { - state = 5705; - return true; - } - break; - case 5705: - if ('d' == current) { - state = 5706; - return true; - } - break; - case 5706: - // nmid; - if (';' == current) { - match = "\u2224"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5707: - if ('p' == current) { - state = 5708; - return true; - } - // not - else if ('t' == current) { - match = "\u00AC"; - matchLength = consumedCount; - state = 5710; - return true; - } - break; - case 5708: - if ('f' == current) { - state = 5709; - return true; - } - break; - case 5709: - // nopf; - if (';' == current) { - match = "\uD835\uDD5F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5710: - switch (current) { - case ';': // not; - match = "\u00AC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'i': - state = 5711; - return true; - case 'n': - state = 5721; - return true; - } - break; - case 5711: - if ('n' == current) { - state = 5712; - return true; - } - break; - case 5712: - switch (current) { - case ';': // notin; - match = "\u2209"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 5713; - return true; - case 'd': - state = 5714; - return true; - case 'v': - state = 5717; - return true; - } - break; - case 5713: - // notinE; - if (';' == current) { - match = "\u22F9\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5714: - if ('o' == current) { - state = 5715; - return true; - } - break; - case 5715: - if ('t' == current) { - state = 5716; - return true; - } - break; - case 5716: - // notindot; - if (';' == current) { - match = "\u22F5\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5717: - switch (current) { - case 'a': - state = 5718; - return true; - case 'b': - state = 5719; - return true; - case 'c': - state = 5720; - return true; - } - break; - case 5718: - // notinva; - if (';' == current) { - match = "\u2209"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5719: - // notinvb; - if (';' == current) { - match = "\u22F7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5720: - // notinvc; - if (';' == current) { - match = "\u22F6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5721: - if ('i' == current) { - state = 5722; - return true; - } - break; - case 5722: - // notni; - if (';' == current) { - match = "\u220C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 5723; - return true; - } - break; - case 5723: - switch (current) { - case 'a': - state = 5724; - return true; - case 'b': - state = 5725; - return true; - case 'c': - state = 5726; - return true; - } - break; - case 5724: - // notniva; - if (';' == current) { - match = "\u220C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5725: - // notnivb; - if (';' == current) { - match = "\u22FE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5726: - // notnivc; - if (';' == current) { - match = "\u22FD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5727: - switch (current) { - case 'a': - state = 5728; - return true; - case 'o': - state = 5738; - return true; - case 'r': - state = 5743; - return true; - } - break; - case 5728: - if ('r' == current) { - state = 5729; - return true; - } - break; - case 5729: - switch (current) { - case ';': // npar; - match = "\u2226"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 5730; - return true; - case 's': - state = 5735; - return true; - case 't': - state = 5737; - return true; - } - break; - case 5730: - if ('l' == current) { - state = 5731; - return true; - } - break; - case 5731: - if ('l' == current) { - state = 5732; - return true; - } - break; - case 5732: - if ('e' == current) { - state = 5733; - return true; - } - break; - case 5733: - if ('l' == current) { - state = 5734; - return true; - } - break; - case 5734: - // nparallel; - if (';' == current) { - match = "\u2226"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5735: - if ('l' == current) { - state = 5736; - return true; - } - break; - case 5736: - // nparsl; - if (';' == current) { - match = "\u2AFD\u20E5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5737: - // npart; - if (';' == current) { - match = "\u2202\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5738: - if ('l' == current) { - state = 5739; - return true; - } - break; - case 5739: - if ('i' == current) { - state = 5740; - return true; - } - break; - case 5740: - if ('n' == current) { - state = 5741; - return true; - } - break; - case 5741: - if ('t' == current) { - state = 5742; - return true; - } - break; - case 5742: - // npolint; - if (';' == current) { - match = "\u2A14"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5743: - switch (current) { - case ';': // npr; - match = "\u2280"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'c': - state = 5744; - return true; - case 'e': - state = 5747; - return true; - } - break; - case 5744: - if ('u' == current) { - state = 5745; - return true; - } - break; - case 5745: - if ('e' == current) { - state = 5746; - return true; - } - break; - case 5746: - // nprcue; - if (';' == current) { - match = "\u22E0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5747: - // npre; - if (';' == current) { - match = "\u2AAF\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('c' == current) { - state = 5748; - return true; - } - break; - case 5748: - // nprec; - if (';' == current) { - match = "\u2280"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5749; - return true; - } - break; - case 5749: - if ('q' == current) { - state = 5750; - return true; - } - break; - case 5750: - // npreceq; - if (';' == current) { - match = "\u2AAF\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5751: - switch (current) { - case 'A': - state = 5752; - return true; - case 'a': - state = 5755; - return true; - case 'i': - state = 5760; - return true; - case 't': - state = 5769; - return true; - } - break; - case 5752: - if ('r' == current) { - state = 5753; - return true; - } - break; - case 5753: - if ('r' == current) { - state = 5754; - return true; - } - break; - case 5754: - // nrArr; - if (';' == current) { - match = "\u21CF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5755: - if ('r' == current) { - state = 5756; - return true; - } - break; - case 5756: - if ('r' == current) { - state = 5757; - return true; - } - break; - case 5757: - switch (current) { - case ';': // nrarr; - match = "\u219B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'c': - state = 5758; - return true; - case 'w': - state = 5759; - return true; - } - break; - case 5758: - // nrarrc; - if (';' == current) { - match = "\u2933\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5759: - // nrarrw; - if (';' == current) { - match = "\u219D\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5760: - if ('g' == current) { - state = 5761; - return true; - } - break; - case 5761: - if ('h' == current) { - state = 5762; - return true; - } - break; - case 5762: - if ('t' == current) { - state = 5763; - return true; - } - break; - case 5763: - if ('a' == current) { - state = 5764; - return true; - } - break; - case 5764: - if ('r' == current) { - state = 5765; - return true; - } - break; - case 5765: - if ('r' == current) { - state = 5766; - return true; - } - break; - case 5766: - if ('o' == current) { - state = 5767; - return true; - } - break; - case 5767: - if ('w' == current) { - state = 5768; - return true; - } - break; - case 5768: - // nrightarrow; - if (';' == current) { - match = "\u219B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5769: - if ('r' == current) { - state = 5770; - return true; - } - break; - case 5770: - if ('i' == current) { - state = 5771; - return true; - } - break; - case 5771: - // nrtri; - if (';' == current) { - match = "\u22EB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5772; - return true; - } - break; - case 5772: - // nrtrie; - if (';' == current) { - match = "\u22ED"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5773: - switch (current) { - case 'c': - state = 5774; - return true; - case 'h': - state = 5780; - return true; - case 'i': - state = 5795; - return true; - case 'm': - state = 5799; - return true; - case 'p': - state = 5802; - return true; - case 'q': - state = 5805; - return true; - case 'u': - state = 5812; - return true; - } - break; - case 5774: - switch (current) { - case ';': // nsc; - match = "\u2281"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'c': - state = 5775; - return true; - case 'e': - state = 5778; - return true; - case 'r': - state = 5779; - return true; - } - break; - case 5775: - if ('u' == current) { - state = 5776; - return true; - } - break; - case 5776: - if ('e' == current) { - state = 5777; - return true; - } - break; - case 5777: - // nsccue; - if (';' == current) { - match = "\u22E1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5778: - // nsce; - if (';' == current) { - match = "\u2AB0\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5779: - // nscr; - if (';' == current) { - match = "\uD835\uDCC3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5780: - if ('o' == current) { - state = 5781; - return true; - } - break; - case 5781: - if ('r' == current) { - state = 5782; - return true; - } - break; - case 5782: - if ('t' == current) { - state = 5783; - return true; - } - break; - case 5783: - if ('m' == current) { - state = 5784; - return true; - } - else if ('p' == current) { - state = 5787; - return true; - } - break; - case 5784: - if ('i' == current) { - state = 5785; - return true; - } - break; - case 5785: - if ('d' == current) { - state = 5786; - return true; - } - break; - case 5786: - // nshortmid; - if (';' == current) { - match = "\u2224"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5787: - if ('a' == current) { - state = 5788; - return true; - } - break; - case 5788: - if ('r' == current) { - state = 5789; - return true; - } - break; - case 5789: - if ('a' == current) { - state = 5790; - return true; - } - break; - case 5790: - if ('l' == current) { - state = 5791; - return true; - } - break; - case 5791: - if ('l' == current) { - state = 5792; - return true; - } - break; - case 5792: - if ('e' == current) { - state = 5793; - return true; - } - break; - case 5793: - if ('l' == current) { - state = 5794; - return true; - } - break; - case 5794: - // nshortparallel; - if (';' == current) { - match = "\u2226"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5795: - if ('m' == current) { - state = 5796; - return true; - } - break; - case 5796: - // nsim; - if (';' == current) { - match = "\u2241"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5797; - return true; - } - break; - case 5797: - // nsime; - if (';' == current) { - match = "\u2244"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 5798; - return true; - } - break; - case 5798: - // nsimeq; - if (';' == current) { - match = "\u2244"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5799: - if ('i' == current) { - state = 5800; - return true; - } - break; - case 5800: - if ('d' == current) { - state = 5801; - return true; - } - break; - case 5801: - // nsmid; - if (';' == current) { - match = "\u2224"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5802: - if ('a' == current) { - state = 5803; - return true; - } - break; - case 5803: - if ('r' == current) { - state = 5804; - return true; - } - break; - case 5804: - // nspar; - if (';' == current) { - match = "\u2226"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5805: - if ('s' == current) { - state = 5806; - return true; - } - break; - case 5806: - if ('u' == current) { - state = 5807; - return true; - } - break; - case 5807: - if ('b' == current) { - state = 5808; - return true; - } - else if ('p' == current) { - state = 5810; - return true; - } - break; - case 5808: - if ('e' == current) { - state = 5809; - return true; - } - break; - case 5809: - // nsqsube; - if (';' == current) { - match = "\u22E2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5810: - if ('e' == current) { - state = 5811; - return true; - } - break; - case 5811: - // nsqsupe; - if (';' == current) { - match = "\u22E3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5812: - switch (current) { - case 'b': - state = 5813; - return true; - case 'c': - state = 5822; - return true; - case 'p': - state = 5826; - return true; - } - break; - case 5813: - switch (current) { - case ';': // nsub; - match = "\u2284"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 5814; - return true; - case 'e': - state = 5815; - return true; - case 's': - state = 5816; - return true; - } - break; - case 5814: - // nsubE; - if (';' == current) { - match = "\u2AC5\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5815: - // nsube; - if (';' == current) { - match = "\u2288"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5816: - if ('e' == current) { - state = 5817; - return true; - } - break; - case 5817: - if ('t' == current) { - state = 5818; - return true; - } - break; - case 5818: - // nsubset; - if (';' == current) { - match = "\u2282\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5819; - return true; - } - break; - case 5819: - if ('q' == current) { - state = 5820; - return true; - } - break; - case 5820: - // nsubseteq; - if (';' == current) { - match = "\u2288"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 5821; - return true; - } - break; - case 5821: - // nsubseteqq; - if (';' == current) { - match = "\u2AC5\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5822: - if ('c' == current) { - state = 5823; - return true; - } - break; - case 5823: - // nsucc; - if (';' == current) { - match = "\u2281"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5824; - return true; - } - break; - case 5824: - if ('q' == current) { - state = 5825; - return true; - } - break; - case 5825: - // nsucceq; - if (';' == current) { - match = "\u2AB0\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5826: - switch (current) { - case ';': // nsup; - match = "\u2285"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 5827; - return true; - case 'e': - state = 5828; - return true; - case 's': - state = 5829; - return true; - } - break; - case 5827: - // nsupE; - if (';' == current) { - match = "\u2AC6\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5828: - // nsupe; - if (';' == current) { - match = "\u2289"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5829: - if ('e' == current) { - state = 5830; - return true; - } - break; - case 5830: - if ('t' == current) { - state = 5831; - return true; - } - break; - case 5831: - // nsupset; - if (';' == current) { - match = "\u2283\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5832; - return true; - } - break; - case 5832: - if ('q' == current) { - state = 5833; - return true; - } - break; - case 5833: - // nsupseteq; - if (';' == current) { - match = "\u2289"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 5834; - return true; - } - break; - case 5834: - // nsupseteqq; - if (';' == current) { - match = "\u2AC6\u0338"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5835: - switch (current) { - case 'g': - state = 5836; - return true; - case 'i': - state = 5838; - return true; - case 'l': - state = 5842; - return true; - case 'r': - state = 5844; - return true; - } - break; - case 5836: - if ('l' == current) { - state = 5837; - return true; - } - break; - case 5837: - // ntgl; - if (';' == current) { - match = "\u2279"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5838: - if ('l' == current) { - state = 5839; - return true; - } - break; - case 5839: - if ('d' == current) { - state = 5840; - return true; - } - break; - case 5840: - // ntilde - if ('e' == current) { - match = "\u00F1"; - matchLength = consumedCount; - state = 5841; - return true; - } - break; - case 5841: - // ntilde; - if (';' == current) { - match = "\u00F1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5842: - if ('g' == current) { - state = 5843; - return true; - } - break; - case 5843: - // ntlg; - if (';' == current) { - match = "\u2278"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5844: - if ('i' == current) { - state = 5845; - return true; - } - break; - case 5845: - if ('a' == current) { - state = 5846; - return true; - } - break; - case 5846: - if ('n' == current) { - state = 5847; - return true; - } - break; - case 5847: - if ('g' == current) { - state = 5848; - return true; - } - break; - case 5848: - if ('l' == current) { - state = 5849; - return true; - } - break; - case 5849: - if ('e' == current) { - state = 5850; - return true; - } - break; - case 5850: - if ('l' == current) { - state = 5851; - return true; - } - else if ('r' == current) { - state = 5857; - return true; - } - break; - case 5851: - if ('e' == current) { - state = 5852; - return true; - } - break; - case 5852: - if ('f' == current) { - state = 5853; - return true; - } - break; - case 5853: - if ('t' == current) { - state = 5854; - return true; - } - break; - case 5854: - // ntriangleleft; - if (';' == current) { - match = "\u22EA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5855; - return true; - } - break; - case 5855: - if ('q' == current) { - state = 5856; - return true; - } - break; - case 5856: - // ntrianglelefteq; - if (';' == current) { - match = "\u22EC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5857: - if ('i' == current) { - state = 5858; - return true; - } - break; - case 5858: - if ('g' == current) { - state = 5859; - return true; - } - break; - case 5859: - if ('h' == current) { - state = 5860; - return true; - } - break; - case 5860: - if ('t' == current) { - state = 5861; - return true; - } - break; - case 5861: - // ntriangleright; - if (';' == current) { - match = "\u22EB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 5862; - return true; - } - break; - case 5862: - if ('q' == current) { - state = 5863; - return true; - } - break; - case 5863: - // ntrianglerighteq; - if (';' == current) { - match = "\u22ED"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5864: - // nu; - if (';' == current) { - match = "\u03BD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('m' == current) { - state = 5865; - return true; - } - break; - case 5865: - switch (current) { - case ';': // num; - match = "#"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 5866; - return true; - case 's': - state = 5869; - return true; - } - break; - case 5866: - if ('r' == current) { - state = 5867; - return true; - } - break; - case 5867: - if ('o' == current) { - state = 5868; - return true; - } - break; - case 5868: - // numero; - if (';' == current) { - match = "\u2116"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5869: - if ('p' == current) { - state = 5870; - return true; - } - break; - case 5870: - // numsp; - if (';' == current) { - match = "\u2007"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5871: - switch (current) { - case 'D': - state = 5872; - return true; - case 'H': - state = 5876; - return true; - case 'a': - state = 5880; - return true; - case 'd': - state = 5882; - return true; - case 'g': - state = 5886; - return true; - case 'i': - state = 5889; - return true; - case 'l': - state = 5894; - return true; - case 'r': - state = 5903; - return true; - case 's': - state = 5911; - return true; - } - break; - case 5872: - if ('a' == current) { - state = 5873; - return true; - } - break; - case 5873: - if ('s' == current) { - state = 5874; - return true; - } - break; - case 5874: - if ('h' == current) { - state = 5875; - return true; - } - break; - case 5875: - // nvDash; - if (';' == current) { - match = "\u22AD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5876: - if ('a' == current) { - state = 5877; - return true; - } - break; - case 5877: - if ('r' == current) { - state = 5878; - return true; - } - break; - case 5878: - if ('r' == current) { - state = 5879; - return true; - } - break; - case 5879: - // nvHarr; - if (';' == current) { - match = "\u2904"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5880: - if ('p' == current) { - state = 5881; - return true; - } - break; - case 5881: - // nvap; - if (';' == current) { - match = "\u224D\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5882: - if ('a' == current) { - state = 5883; - return true; - } - break; - case 5883: - if ('s' == current) { - state = 5884; - return true; - } - break; - case 5884: - if ('h' == current) { - state = 5885; - return true; - } - break; - case 5885: - // nvdash; - if (';' == current) { - match = "\u22AC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5886: - if ('e' == current) { - state = 5887; - return true; - } - else if ('t' == current) { - state = 5888; - return true; - } - break; - case 5887: - // nvge; - if (';' == current) { - match = "\u2265\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5888: - // nvgt; - if (';' == current) { - match = ">\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5889: - if ('n' == current) { - state = 5890; - return true; - } - break; - case 5890: - if ('f' == current) { - state = 5891; - return true; - } - break; - case 5891: - if ('i' == current) { - state = 5892; - return true; - } - break; - case 5892: - if ('n' == current) { - state = 5893; - return true; - } - break; - case 5893: - // nvinfin; - if (';' == current) { - match = "\u29DE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5894: - switch (current) { - case 'A': - state = 5895; - return true; - case 'e': - state = 5898; - return true; - case 't': - state = 5899; - return true; - } - break; - case 5895: - if ('r' == current) { - state = 5896; - return true; - } - break; - case 5896: - if ('r' == current) { - state = 5897; - return true; - } - break; - case 5897: - // nvlArr; - if (';' == current) { - match = "\u2902"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5898: - // nvle; - if (';' == current) { - match = "\u2264\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5899: - // nvlt; - if (';' == current) { - match = "<\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('r' == current) { - state = 5900; - return true; - } - break; - case 5900: - if ('i' == current) { - state = 5901; - return true; - } - break; - case 5901: - if ('e' == current) { - state = 5902; - return true; - } - break; - case 5902: - // nvltrie; - if (';' == current) { - match = "\u22B4\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5903: - if ('A' == current) { - state = 5904; - return true; - } - else if ('t' == current) { - state = 5907; - return true; - } - break; - case 5904: - if ('r' == current) { - state = 5905; - return true; - } - break; - case 5905: - if ('r' == current) { - state = 5906; - return true; - } - break; - case 5906: - // nvrArr; - if (';' == current) { - match = "\u2903"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5907: - if ('r' == current) { - state = 5908; - return true; - } - break; - case 5908: - if ('i' == current) { - state = 5909; - return true; - } - break; - case 5909: - if ('e' == current) { - state = 5910; - return true; - } - break; - case 5910: - // nvrtrie; - if (';' == current) { - match = "\u22B5\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5911: - if ('i' == current) { - state = 5912; - return true; - } - break; - case 5912: - if ('m' == current) { - state = 5913; - return true; - } - break; - case 5913: - // nvsim; - if (';' == current) { - match = "\u223C\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5914: - switch (current) { - case 'A': - state = 5915; - return true; - case 'a': - state = 5918; - return true; - case 'n': - state = 5925; - return true; - } - break; - case 5915: - if ('r' == current) { - state = 5916; - return true; - } - break; - case 5916: - if ('r' == current) { - state = 5917; - return true; - } - break; - case 5917: - // nwArr; - if (';' == current) { - match = "\u21D6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5918: - if ('r' == current) { - state = 5919; - return true; - } - break; - case 5919: - if ('h' == current) { - state = 5920; - return true; - } - else if ('r' == current) { - state = 5922; - return true; - } - break; - case 5920: - if ('k' == current) { - state = 5921; - return true; - } - break; - case 5921: - // nwarhk; - if (';' == current) { - match = "\u2923"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5922: - // nwarr; - if (';' == current) { - match = "\u2196"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 5923; - return true; - } - break; - case 5923: - if ('w' == current) { - state = 5924; - return true; - } - break; - case 5924: - // nwarrow; - if (';' == current) { - match = "\u2196"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5925: - if ('e' == current) { - state = 5926; - return true; - } - break; - case 5926: - if ('a' == current) { - state = 5927; - return true; - } - break; - case 5927: - if ('r' == current) { - state = 5928; - return true; - } - break; - case 5928: - // nwnear; - if (';' == current) { - match = "\u2927"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5929: - switch (current) { - case 'S': - state = 5930; - return true; - case 'a': - state = 5931; - return true; - case 'c': - state = 5938; - return true; - case 'd': - state = 5943; - return true; - case 'e': - state = 5959; - return true; - case 'f': - state = 5963; - return true; - case 'g': - state = 5968; - return true; - case 'h': - state = 5976; - return true; - case 'i': - state = 5981; - return true; - case 'l': - state = 5984; - return true; - case 'm': - state = 5999; - return true; - case 'o': - state = 6015; - return true; - case 'p': - state = 6018; - return true; - case 'r': - state = 6027; - return true; - case 's': - state = 6050; - return true; - case 't': - state = 6059; - return true; - case 'u': - state = 6069; - return true; - case 'v': - state = 6072; - return true; - } - break; - case 5930: - // oS; - if (';' == current) { - match = "\u24C8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5931: - if ('c' == current) { - state = 5932; - return true; - } - else if ('s' == current) { - state = 5936; - return true; - } - break; - case 5932: - if ('u' == current) { - state = 5933; - return true; - } - break; - case 5933: - if ('t' == current) { - state = 5934; - return true; - } - break; - case 5934: - // oacute - if ('e' == current) { - match = "\u00F3"; - matchLength = consumedCount; - state = 5935; - return true; - } - break; - case 5935: - // oacute; - if (';' == current) { - match = "\u00F3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5936: - if ('t' == current) { - state = 5937; - return true; - } - break; - case 5937: - // oast; - if (';' == current) { - match = "\u229B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5938: - if ('i' == current) { - state = 5939; - return true; - } - else if ('y' == current) { - state = 5942; - return true; - } - break; - case 5939: - if ('r' == current) { - state = 5940; - return true; - } - break; - case 5940: - // ocir; - if (';' == current) { - match = "\u229A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - // ocirc - else if ('c' == current) { - match = "\u00F4"; - matchLength = consumedCount; - state = 5941; - return true; - } - break; - case 5941: - // ocirc; - if (';' == current) { - match = "\u00F4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5942: - // ocy; - if (';' == current) { - match = "\u043E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5943: - switch (current) { - case 'a': - state = 5944; - return true; - case 'b': - state = 5947; - return true; - case 'i': - state = 5951; - return true; - case 'o': - state = 5953; - return true; - case 's': - state = 5955; - return true; - } - break; - case 5944: - if ('s' == current) { - state = 5945; - return true; - } - break; - case 5945: - if ('h' == current) { - state = 5946; - return true; - } - break; - case 5946: - // odash; - if (';' == current) { - match = "\u229D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5947: - if ('l' == current) { - state = 5948; - return true; - } - break; - case 5948: - if ('a' == current) { - state = 5949; - return true; - } - break; - case 5949: - if ('c' == current) { - state = 5950; - return true; - } - break; - case 5950: - // odblac; - if (';' == current) { - match = "\u0151"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5951: - if ('v' == current) { - state = 5952; - return true; - } - break; - case 5952: - // odiv; - if (';' == current) { - match = "\u2A38"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5953: - if ('t' == current) { - state = 5954; - return true; - } - break; - case 5954: - // odot; - if (';' == current) { - match = "\u2299"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5955: - if ('o' == current) { - state = 5956; - return true; - } - break; - case 5956: - if ('l' == current) { - state = 5957; - return true; - } - break; - case 5957: - if ('d' == current) { - state = 5958; - return true; - } - break; - case 5958: - // odsold; - if (';' == current) { - match = "\u29BC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5959: - if ('l' == current) { - state = 5960; - return true; - } - break; - case 5960: - if ('i' == current) { - state = 5961; - return true; - } - break; - case 5961: - if ('g' == current) { - state = 5962; - return true; - } - break; - case 5962: - // oelig; - if (';' == current) { - match = "\u0153"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5963: - if ('c' == current) { - state = 5964; - return true; - } - else if ('r' == current) { - state = 5967; - return true; - } - break; - case 5964: - if ('i' == current) { - state = 5965; - return true; - } - break; - case 5965: - if ('r' == current) { - state = 5966; - return true; - } - break; - case 5966: - // ofcir; - if (';' == current) { - match = "\u29BF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5967: - // ofr; - if (';' == current) { - match = "\uD835\uDD2C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5968: - switch (current) { - case 'o': - state = 5969; - return true; - case 'r': - state = 5971; - return true; - case 't': - state = 5975; - return true; - } - break; - case 5969: - if ('n' == current) { - state = 5970; - return true; - } - break; - case 5970: - // ogon; - if (';' == current) { - match = "\u02DB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5971: - if ('a' == current) { - state = 5972; - return true; - } - break; - case 5972: - if ('v' == current) { - state = 5973; - return true; - } - break; - case 5973: - // ograve - if ('e' == current) { - match = "\u00F2"; - matchLength = consumedCount; - state = 5974; - return true; - } - break; - case 5974: - // ograve; - if (';' == current) { - match = "\u00F2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5975: - // ogt; - if (';' == current) { - match = "\u29C1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5976: - if ('b' == current) { - state = 5977; - return true; - } - else if ('m' == current) { - state = 5980; - return true; - } - break; - case 5977: - if ('a' == current) { - state = 5978; - return true; - } - break; - case 5978: - if ('r' == current) { - state = 5979; - return true; - } - break; - case 5979: - // ohbar; - if (';' == current) { - match = "\u29B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5980: - // ohm; - if (';' == current) { - match = "\u03A9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5981: - if ('n' == current) { - state = 5982; - return true; - } - break; - case 5982: - if ('t' == current) { - state = 5983; - return true; - } - break; - case 5983: - // oint; - if (';' == current) { - match = "\u222E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5984: - switch (current) { - case 'a': - state = 5985; - return true; - case 'c': - state = 5988; - return true; - case 'i': - state = 5995; - return true; - case 't': - state = 5998; - return true; - } - break; - case 5985: - if ('r' == current) { - state = 5986; - return true; - } - break; - case 5986: - if ('r' == current) { - state = 5987; - return true; - } - break; - case 5987: - // olarr; - if (';' == current) { - match = "\u21BA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5988: - if ('i' == current) { - state = 5989; - return true; - } - else if ('r' == current) { - state = 5991; - return true; - } - break; - case 5989: - if ('r' == current) { - state = 5990; - return true; - } - break; - case 5990: - // olcir; - if (';' == current) { - match = "\u29BE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5991: - if ('o' == current) { - state = 5992; - return true; - } - break; - case 5992: - if ('s' == current) { - state = 5993; - return true; - } - break; - case 5993: - if ('s' == current) { - state = 5994; - return true; - } - break; - case 5994: - // olcross; - if (';' == current) { - match = "\u29BB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5995: - if ('n' == current) { - state = 5996; - return true; - } - break; - case 5996: - if ('e' == current) { - state = 5997; - return true; - } - break; - case 5997: - // oline; - if (';' == current) { - match = "\u203E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5998: - // olt; - if (';' == current) { - match = "\u29C0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 5999: - switch (current) { - case 'a': - state = 6000; - return true; - case 'e': - state = 6003; - return true; - case 'i': - state = 6006; - return true; - } - break; - } - return false; - } - - private boolean parse7(final int current) { - consumedCount++; - switch (state) { - case 6000: - if ('c' == current) { - state = 6001; - return true; - } - break; - case 6001: - if ('r' == current) { - state = 6002; - return true; - } - break; - case 6002: - // omacr; - if (';' == current) { - match = "\u014D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6003: - if ('g' == current) { - state = 6004; - return true; - } - break; - case 6004: - if ('a' == current) { - state = 6005; - return true; - } - break; - case 6005: - // omega; - if (';' == current) { - match = "\u03C9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6006: - switch (current) { - case 'c': - state = 6007; - return true; - case 'd': - state = 6011; - return true; - case 'n': - state = 6012; - return true; - } - break; - case 6007: - if ('r' == current) { - state = 6008; - return true; - } - break; - case 6008: - if ('o' == current) { - state = 6009; - return true; - } - break; - case 6009: - if ('n' == current) { - state = 6010; - return true; - } - break; - case 6010: - // omicron; - if (';' == current) { - match = "\u03BF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6011: - // omid; - if (';' == current) { - match = "\u29B6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6012: - if ('u' == current) { - state = 6013; - return true; - } - break; - case 6013: - if ('s' == current) { - state = 6014; - return true; - } - break; - case 6014: - // ominus; - if (';' == current) { - match = "\u2296"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6015: - if ('p' == current) { - state = 6016; - return true; - } - break; - case 6016: - if ('f' == current) { - state = 6017; - return true; - } - break; - case 6017: - // oopf; - if (';' == current) { - match = "\uD835\uDD60"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6018: - switch (current) { - case 'a': - state = 6019; - return true; - case 'e': - state = 6021; - return true; - case 'l': - state = 6024; - return true; - } - break; - case 6019: - if ('r' == current) { - state = 6020; - return true; - } - break; - case 6020: - // opar; - if (';' == current) { - match = "\u29B7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6021: - if ('r' == current) { - state = 6022; - return true; - } - break; - case 6022: - if ('p' == current) { - state = 6023; - return true; - } - break; - case 6023: - // operp; - if (';' == current) { - match = "\u29B9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6024: - if ('u' == current) { - state = 6025; - return true; - } - break; - case 6025: - if ('s' == current) { - state = 6026; - return true; - } - break; - case 6026: - // oplus; - if (';' == current) { - match = "\u2295"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6027: - switch (current) { - case ';': // or; - match = "\u2228"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 6028; - return true; - case 'd': - state = 6031; - return true; - case 'i': - state = 6038; - return true; - case 'o': - state = 6042; - return true; - case 's': - state = 6044; - return true; - case 'v': - state = 6049; - return true; - } - break; - case 6028: - if ('r' == current) { - state = 6029; - return true; - } - break; - case 6029: - if ('r' == current) { - state = 6030; - return true; - } - break; - case 6030: - // orarr; - if (';' == current) { - match = "\u21BB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6031: - switch (current) { - case ';': // ord; - match = "\u2A5D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 6032; - return true; - case 'f': // ordf - match = "\u00AA"; - matchLength = consumedCount; - state = 6036; - return true; - case 'm': // ordm - match = "\u00BA"; - matchLength = consumedCount; - state = 6037; - return true; - } - break; - case 6032: - if ('r' == current) { - state = 6033; - return true; - } - break; - case 6033: - // order; - if (';' == current) { - match = "\u2134"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 6034; - return true; - } - break; - case 6034: - if ('f' == current) { - state = 6035; - return true; - } - break; - case 6035: - // orderof; - if (';' == current) { - match = "\u2134"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6036: - // ordf; - if (';' == current) { - match = "\u00AA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6037: - // ordm; - if (';' == current) { - match = "\u00BA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6038: - if ('g' == current) { - state = 6039; - return true; - } - break; - case 6039: - if ('o' == current) { - state = 6040; - return true; - } - break; - case 6040: - if ('f' == current) { - state = 6041; - return true; - } - break; - case 6041: - // origof; - if (';' == current) { - match = "\u22B6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6042: - if ('r' == current) { - state = 6043; - return true; - } - break; - case 6043: - // oror; - if (';' == current) { - match = "\u2A56"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6044: - if ('l' == current) { - state = 6045; - return true; - } - break; - case 6045: - if ('o' == current) { - state = 6046; - return true; - } - break; - case 6046: - if ('p' == current) { - state = 6047; - return true; - } - break; - case 6047: - if ('e' == current) { - state = 6048; - return true; - } - break; - case 6048: - // orslope; - if (';' == current) { - match = "\u2A57"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6049: - // orv; - if (';' == current) { - match = "\u2A5B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6050: - switch (current) { - case 'c': - state = 6051; - return true; - case 'l': - state = 6053; - return true; - case 'o': - state = 6057; - return true; - } - break; - case 6051: - if ('r' == current) { - state = 6052; - return true; - } - break; - case 6052: - // oscr; - if (';' == current) { - match = "\u2134"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6053: - if ('a' == current) { - state = 6054; - return true; - } - break; - case 6054: - if ('s' == current) { - state = 6055; - return true; - } - break; - case 6055: - // oslash - if ('h' == current) { - match = "\u00F8"; - matchLength = consumedCount; - state = 6056; - return true; - } - break; - case 6056: - // oslash; - if (';' == current) { - match = "\u00F8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6057: - if ('l' == current) { - state = 6058; - return true; - } - break; - case 6058: - // osol; - if (';' == current) { - match = "\u2298"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6059: - if ('i' == current) { - state = 6060; - return true; - } - break; - case 6060: - if ('l' == current) { - state = 6061; - return true; - } - else if ('m' == current) { - state = 6064; - return true; - } - break; - case 6061: - if ('d' == current) { - state = 6062; - return true; - } - break; - case 6062: - // otilde - if ('e' == current) { - match = "\u00F5"; - matchLength = consumedCount; - state = 6063; - return true; - } - break; - case 6063: - // otilde; - if (';' == current) { - match = "\u00F5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6064: - if ('e' == current) { - state = 6065; - return true; - } - break; - case 6065: - if ('s' == current) { - state = 6066; - return true; - } - break; - case 6066: - // otimes; - if (';' == current) { - match = "\u2297"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('a' == current) { - state = 6067; - return true; - } - break; - case 6067: - if ('s' == current) { - state = 6068; - return true; - } - break; - case 6068: - // otimesas; - if (';' == current) { - match = "\u2A36"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6069: - if ('m' == current) { - state = 6070; - return true; - } - break; - case 6070: - // ouml - if ('l' == current) { - match = "\u00F6"; - matchLength = consumedCount; - state = 6071; - return true; - } - break; - case 6071: - // ouml; - if (';' == current) { - match = "\u00F6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6072: - if ('b' == current) { - state = 6073; - return true; - } - break; - case 6073: - if ('a' == current) { - state = 6074; - return true; - } - break; - case 6074: - if ('r' == current) { - state = 6075; - return true; - } - break; - case 6075: - // ovbar; - if (';' == current) { - match = "\u233D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6076: - switch (current) { - case 'a': - state = 6077; - return true; - case 'c': - state = 6089; - return true; - case 'e': - state = 6091; - return true; - case 'f': - state = 6107; - return true; - case 'h': - state = 6109; - return true; - case 'i': - state = 6119; - return true; - case 'l': - state = 6128; - return true; - case 'm': - state = 6158; - return true; - case 'o': - state = 6159; - return true; - case 'r': - state = 6171; - return true; - case 's': - state = 6247; - return true; - case 'u': - state = 6251; - return true; - } - break; - case 6077: - if ('r' == current) { - state = 6078; - return true; - } - break; - case 6078: - switch (current) { - case ';': // par; - match = "\u2225"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': // para - match = "\u00B6"; - matchLength = consumedCount; - state = 6079; - return true; - case 's': - state = 6084; - return true; - case 't': - state = 6088; - return true; - } - break; - case 6079: - // para; - if (';' == current) { - match = "\u00B6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('l' == current) { - state = 6080; - return true; - } - break; - case 6080: - if ('l' == current) { - state = 6081; - return true; - } - break; - case 6081: - if ('e' == current) { - state = 6082; - return true; - } - break; - case 6082: - if ('l' == current) { - state = 6083; - return true; - } - break; - case 6083: - // parallel; - if (';' == current) { - match = "\u2225"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6084: - if ('i' == current) { - state = 6085; - return true; - } - else if ('l' == current) { - state = 6087; - return true; - } - break; - case 6085: - if ('m' == current) { - state = 6086; - return true; - } - break; - case 6086: - // parsim; - if (';' == current) { - match = "\u2AF3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6087: - // parsl; - if (';' == current) { - match = "\u2AFD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6088: - // part; - if (';' == current) { - match = "\u2202"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6089: - if ('y' == current) { - state = 6090; - return true; - } - break; - case 6090: - // pcy; - if (';' == current) { - match = "\u043F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6091: - if ('r' == current) { - state = 6092; - return true; - } - break; - case 6092: - switch (current) { - case 'c': - state = 6093; - return true; - case 'i': - state = 6096; - return true; - case 'm': - state = 6099; - return true; - case 'p': - state = 6102; - return true; - case 't': - state = 6103; - return true; - } - break; - case 6093: - if ('n' == current) { - state = 6094; - return true; - } - break; - case 6094: - if ('t' == current) { - state = 6095; - return true; - } - break; - case 6095: - // percnt; - if (';' == current) { - match = "%"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6096: - if ('o' == current) { - state = 6097; - return true; - } - break; - case 6097: - if ('d' == current) { - state = 6098; - return true; - } - break; - case 6098: - // period; - if (';' == current) { - match = "."; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6099: - if ('i' == current) { - state = 6100; - return true; - } - break; - case 6100: - if ('l' == current) { - state = 6101; - return true; - } - break; - case 6101: - // permil; - if (';' == current) { - match = "\u2030"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6102: - // perp; - if (';' == current) { - match = "\u22A5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6103: - if ('e' == current) { - state = 6104; - return true; - } - break; - case 6104: - if ('n' == current) { - state = 6105; - return true; - } - break; - case 6105: - if ('k' == current) { - state = 6106; - return true; - } - break; - case 6106: - // pertenk; - if (';' == current) { - match = "\u2031"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6107: - if ('r' == current) { - state = 6108; - return true; - } - break; - case 6108: - // pfr; - if (';' == current) { - match = "\uD835\uDD2D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6109: - switch (current) { - case 'i': - state = 6110; - return true; - case 'm': - state = 6112; - return true; - case 'o': - state = 6116; - return true; - } - break; - case 6110: - // phi; - if (';' == current) { - match = "\u03C6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 6111; - return true; - } - break; - case 6111: - // phiv; - if (';' == current) { - match = "\u03D5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6112: - if ('m' == current) { - state = 6113; - return true; - } - break; - case 6113: - if ('a' == current) { - state = 6114; - return true; - } - break; - case 6114: - if ('t' == current) { - state = 6115; - return true; - } - break; - case 6115: - // phmmat; - if (';' == current) { - match = "\u2133"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6116: - if ('n' == current) { - state = 6117; - return true; - } - break; - case 6117: - if ('e' == current) { - state = 6118; - return true; - } - break; - case 6118: - // phone; - if (';' == current) { - match = "\u260E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6119: - switch (current) { - case ';': // pi; - match = "\u03C0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 't': - state = 6120; - return true; - case 'v': - state = 6127; - return true; - } - break; - case 6120: - if ('c' == current) { - state = 6121; - return true; - } - break; - case 6121: - if ('h' == current) { - state = 6122; - return true; - } - break; - case 6122: - if ('f' == current) { - state = 6123; - return true; - } - break; - case 6123: - if ('o' == current) { - state = 6124; - return true; - } - break; - case 6124: - if ('r' == current) { - state = 6125; - return true; - } - break; - case 6125: - if ('k' == current) { - state = 6126; - return true; - } - break; - case 6126: - // pitchfork; - if (';' == current) { - match = "\u22D4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6127: - // piv; - if (';' == current) { - match = "\u03D6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6128: - if ('a' == current) { - state = 6129; - return true; - } - else if ('u' == current) { - state = 6136; - return true; - } - break; - case 6129: - if ('n' == current) { - state = 6130; - return true; - } - break; - case 6130: - if ('c' == current) { - state = 6131; - return true; - } - else if ('k' == current) { - state = 6134; - return true; - } - break; - case 6131: - if ('k' == current) { - state = 6132; - return true; - } - break; - case 6132: - // planck; - if (';' == current) { - match = "\u210F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('h' == current) { - state = 6133; - return true; - } - break; - case 6133: - // planckh; - if (';' == current) { - match = "\u210E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6134: - if ('v' == current) { - state = 6135; - return true; - } - break; - case 6135: - // plankv; - if (';' == current) { - match = "\u210F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6136: - if ('s' == current) { - state = 6137; - return true; - } - break; - case 6137: - switch (current) { - case ';': // plus; - match = "+"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 6138; - return true; - case 'b': - state = 6142; - return true; - case 'c': - state = 6143; - return true; - case 'd': - state = 6146; - return true; - case 'e': - state = 6149; - return true; - case 'm': - state = 6150; - return true; - case 's': - state = 6152; - return true; - case 't': - state = 6155; - return true; - } - break; - case 6138: - if ('c' == current) { - state = 6139; - return true; - } - break; - case 6139: - if ('i' == current) { - state = 6140; - return true; - } - break; - case 6140: - if ('r' == current) { - state = 6141; - return true; - } - break; - case 6141: - // plusacir; - if (';' == current) { - match = "\u2A23"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6142: - // plusb; - if (';' == current) { - match = "\u229E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6143: - if ('i' == current) { - state = 6144; - return true; - } - break; - case 6144: - if ('r' == current) { - state = 6145; - return true; - } - break; - case 6145: - // pluscir; - if (';' == current) { - match = "\u2A22"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6146: - if ('o' == current) { - state = 6147; - return true; - } - else if ('u' == current) { - state = 6148; - return true; - } - break; - case 6147: - // plusdo; - if (';' == current) { - match = "\u2214"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6148: - // plusdu; - if (';' == current) { - match = "\u2A25"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6149: - // pluse; - if (';' == current) { - match = "\u2A72"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6150: - // plusmn - if ('n' == current) { - match = "\u00B1"; - matchLength = consumedCount; - state = 6151; - return true; - } - break; - case 6151: - // plusmn; - if (';' == current) { - match = "\u00B1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6152: - if ('i' == current) { - state = 6153; - return true; - } - break; - case 6153: - if ('m' == current) { - state = 6154; - return true; - } - break; - case 6154: - // plussim; - if (';' == current) { - match = "\u2A26"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6155: - if ('w' == current) { - state = 6156; - return true; - } - break; - case 6156: - if ('o' == current) { - state = 6157; - return true; - } - break; - case 6157: - // plustwo; - if (';' == current) { - match = "\u2A27"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6158: - // pm; - if (';' == current) { - match = "\u00B1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6159: - switch (current) { - case 'i': - state = 6160; - return true; - case 'p': - state = 6166; - return true; - case 'u': - state = 6168; - return true; - } - break; - case 6160: - if ('n' == current) { - state = 6161; - return true; - } - break; - case 6161: - if ('t' == current) { - state = 6162; - return true; - } - break; - case 6162: - if ('i' == current) { - state = 6163; - return true; - } - break; - case 6163: - if ('n' == current) { - state = 6164; - return true; - } - break; - case 6164: - if ('t' == current) { - state = 6165; - return true; - } - break; - case 6165: - // pointint; - if (';' == current) { - match = "\u2A15"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6166: - if ('f' == current) { - state = 6167; - return true; - } - break; - case 6167: - // popf; - if (';' == current) { - match = "\uD835\uDD61"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6168: - if ('n' == current) { - state = 6169; - return true; - } - break; - case 6169: - // pound - if ('d' == current) { - match = "\u00A3"; - matchLength = consumedCount; - state = 6170; - return true; - } - break; - case 6170: - // pound; - if (';' == current) { - match = "\u00A3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6171: - switch (current) { - case ';': // pr; - match = "\u227A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 6172; - return true; - case 'a': - state = 6173; - return true; - case 'c': - state = 6175; - return true; - case 'e': - state = 6178; - return true; - case 'i': - state = 6211; - return true; - case 'n': - state = 6215; - return true; - case 'o': - state = 6222; - return true; - case 's': - state = 6240; - return true; - case 'u': - state = 6243; - return true; - } - break; - case 6172: - // prE; - if (';' == current) { - match = "\u2AB3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6173: - if ('p' == current) { - state = 6174; - return true; - } - break; - case 6174: - // prap; - if (';' == current) { - match = "\u2AB7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6175: - if ('u' == current) { - state = 6176; - return true; - } - break; - case 6176: - if ('e' == current) { - state = 6177; - return true; - } - break; - case 6177: - // prcue; - if (';' == current) { - match = "\u227C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6178: - // pre; - if (';' == current) { - match = "\u2AAF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('c' == current) { - state = 6179; - return true; - } - break; - case 6179: - switch (current) { - case ';': // prec; - match = "\u227A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 6180; - return true; - case 'c': - state = 6186; - return true; - case 'e': - state = 6193; - return true; - case 'n': - state = 6195; - return true; - case 's': - state = 6208; - return true; - } - break; - case 6180: - if ('p' == current) { - state = 6181; - return true; - } - break; - case 6181: - if ('p' == current) { - state = 6182; - return true; - } - break; - case 6182: - if ('r' == current) { - state = 6183; - return true; - } - break; - case 6183: - if ('o' == current) { - state = 6184; - return true; - } - break; - case 6184: - if ('x' == current) { - state = 6185; - return true; - } - break; - case 6185: - // precapprox; - if (';' == current) { - match = "\u2AB7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6186: - if ('u' == current) { - state = 6187; - return true; - } - break; - case 6187: - if ('r' == current) { - state = 6188; - return true; - } - break; - case 6188: - if ('l' == current) { - state = 6189; - return true; - } - break; - case 6189: - if ('y' == current) { - state = 6190; - return true; - } - break; - case 6190: - if ('e' == current) { - state = 6191; - return true; - } - break; - case 6191: - if ('q' == current) { - state = 6192; - return true; - } - break; - case 6192: - // preccurlyeq; - if (';' == current) { - match = "\u227C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6193: - if ('q' == current) { - state = 6194; - return true; - } - break; - case 6194: - // preceq; - if (';' == current) { - match = "\u2AAF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6195: - switch (current) { - case 'a': - state = 6196; - return true; - case 'e': - state = 6202; - return true; - case 's': - state = 6205; - return true; - } - break; - case 6196: - if ('p' == current) { - state = 6197; - return true; - } - break; - case 6197: - if ('p' == current) { - state = 6198; - return true; - } - break; - case 6198: - if ('r' == current) { - state = 6199; - return true; - } - break; - case 6199: - if ('o' == current) { - state = 6200; - return true; - } - break; - case 6200: - if ('x' == current) { - state = 6201; - return true; - } - break; - case 6201: - // precnapprox; - if (';' == current) { - match = "\u2AB9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6202: - if ('q' == current) { - state = 6203; - return true; - } - break; - case 6203: - if ('q' == current) { - state = 6204; - return true; - } - break; - case 6204: - // precneqq; - if (';' == current) { - match = "\u2AB5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6205: - if ('i' == current) { - state = 6206; - return true; - } - break; - case 6206: - if ('m' == current) { - state = 6207; - return true; - } - break; - case 6207: - // precnsim; - if (';' == current) { - match = "\u22E8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6208: - if ('i' == current) { - state = 6209; - return true; - } - break; - case 6209: - if ('m' == current) { - state = 6210; - return true; - } - break; - case 6210: - // precsim; - if (';' == current) { - match = "\u227E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6211: - if ('m' == current) { - state = 6212; - return true; - } - break; - case 6212: - if ('e' == current) { - state = 6213; - return true; - } - break; - case 6213: - // prime; - if (';' == current) { - match = "\u2032"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 6214; - return true; - } - break; - case 6214: - // primes; - if (';' == current) { - match = "\u2119"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6215: - switch (current) { - case 'E': - state = 6216; - return true; - case 'a': - state = 6217; - return true; - case 's': - state = 6219; - return true; - } - break; - case 6216: - // prnE; - if (';' == current) { - match = "\u2AB5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6217: - if ('p' == current) { - state = 6218; - return true; - } - break; - case 6218: - // prnap; - if (';' == current) { - match = "\u2AB9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6219: - if ('i' == current) { - state = 6220; - return true; - } - break; - case 6220: - if ('m' == current) { - state = 6221; - return true; - } - break; - case 6221: - // prnsim; - if (';' == current) { - match = "\u22E8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6222: - switch (current) { - case 'd': - state = 6223; - return true; - case 'f': - state = 6224; - return true; - case 'p': - state = 6237; - return true; - } - break; - case 6223: - // prod; - if (';' == current) { - match = "\u220F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6224: - switch (current) { - case 'a': - state = 6225; - return true; - case 'l': - state = 6229; - return true; - case 's': - state = 6233; - return true; - } - break; - case 6225: - if ('l' == current) { - state = 6226; - return true; - } - break; - case 6226: - if ('a' == current) { - state = 6227; - return true; - } - break; - case 6227: - if ('r' == current) { - state = 6228; - return true; - } - break; - case 6228: - // profalar; - if (';' == current) { - match = "\u232E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6229: - if ('i' == current) { - state = 6230; - return true; - } - break; - case 6230: - if ('n' == current) { - state = 6231; - return true; - } - break; - case 6231: - if ('e' == current) { - state = 6232; - return true; - } - break; - case 6232: - // profline; - if (';' == current) { - match = "\u2312"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6233: - if ('u' == current) { - state = 6234; - return true; - } - break; - case 6234: - if ('r' == current) { - state = 6235; - return true; - } - break; - case 6235: - if ('f' == current) { - state = 6236; - return true; - } - break; - case 6236: - // profsurf; - if (';' == current) { - match = "\u2313"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6237: - // prop; - if (';' == current) { - match = "\u221D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('t' == current) { - state = 6238; - return true; - } - break; - case 6238: - if ('o' == current) { - state = 6239; - return true; - } - break; - case 6239: - // propto; - if (';' == current) { - match = "\u221D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6240: - if ('i' == current) { - state = 6241; - return true; - } - break; - case 6241: - if ('m' == current) { - state = 6242; - return true; - } - break; - case 6242: - // prsim; - if (';' == current) { - match = "\u227E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6243: - if ('r' == current) { - state = 6244; - return true; - } - break; - case 6244: - if ('e' == current) { - state = 6245; - return true; - } - break; - case 6245: - if ('l' == current) { - state = 6246; - return true; - } - break; - case 6246: - // prurel; - if (';' == current) { - match = "\u22B0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6247: - if ('c' == current) { - state = 6248; - return true; - } - else if ('i' == current) { - state = 6250; - return true; - } - break; - case 6248: - if ('r' == current) { - state = 6249; - return true; - } - break; - case 6249: - // pscr; - if (';' == current) { - match = "\uD835\uDCC5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6250: - // psi; - if (';' == current) { - match = "\u03C8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6251: - if ('n' == current) { - state = 6252; - return true; - } - break; - case 6252: - if ('c' == current) { - state = 6253; - return true; - } - break; - case 6253: - if ('s' == current) { - state = 6254; - return true; - } - break; - case 6254: - if ('p' == current) { - state = 6255; - return true; - } - break; - case 6255: - // puncsp; - if (';' == current) { - match = "\u2008"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6256: - switch (current) { - case 'f': - state = 6257; - return true; - case 'i': - state = 6259; - return true; - case 'o': - state = 6262; - return true; - case 'p': - state = 6265; - return true; - case 's': - state = 6270; - return true; - case 'u': - state = 6273; - return true; - } - break; - case 6257: - if ('r' == current) { - state = 6258; - return true; - } - break; - case 6258: - // qfr; - if (';' == current) { - match = "\uD835\uDD2E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6259: - if ('n' == current) { - state = 6260; - return true; - } - break; - case 6260: - if ('t' == current) { - state = 6261; - return true; - } - break; - case 6261: - // qint; - if (';' == current) { - match = "\u2A0C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6262: - if ('p' == current) { - state = 6263; - return true; - } - break; - case 6263: - if ('f' == current) { - state = 6264; - return true; - } - break; - case 6264: - // qopf; - if (';' == current) { - match = "\uD835\uDD62"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6265: - if ('r' == current) { - state = 6266; - return true; - } - break; - case 6266: - if ('i' == current) { - state = 6267; - return true; - } - break; - case 6267: - if ('m' == current) { - state = 6268; - return true; - } - break; - case 6268: - if ('e' == current) { - state = 6269; - return true; - } - break; - case 6269: - // qprime; - if (';' == current) { - match = "\u2057"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6270: - if ('c' == current) { - state = 6271; - return true; - } - break; - case 6271: - if ('r' == current) { - state = 6272; - return true; - } - break; - case 6272: - // qscr; - if (';' == current) { - match = "\uD835\uDCC6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6273: - switch (current) { - case 'a': - state = 6274; - return true; - case 'e': - state = 6286; - return true; - case 'o': - state = 6291; - return true; - } - break; - case 6274: - if ('t' == current) { - state = 6275; - return true; - } - break; - case 6275: - if ('e' == current) { - state = 6276; - return true; - } - else if ('i' == current) { - state = 6283; - return true; - } - break; - case 6276: - if ('r' == current) { - state = 6277; - return true; - } - break; - case 6277: - if ('n' == current) { - state = 6278; - return true; - } - break; - case 6278: - if ('i' == current) { - state = 6279; - return true; - } - break; - case 6279: - if ('o' == current) { - state = 6280; - return true; - } - break; - case 6280: - if ('n' == current) { - state = 6281; - return true; - } - break; - case 6281: - if ('s' == current) { - state = 6282; - return true; - } - break; - case 6282: - // quaternions; - if (';' == current) { - match = "\u210D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6283: - if ('n' == current) { - state = 6284; - return true; - } - break; - case 6284: - if ('t' == current) { - state = 6285; - return true; - } - break; - case 6285: - // quatint; - if (';' == current) { - match = "\u2A16"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6286: - if ('s' == current) { - state = 6287; - return true; - } - break; - case 6287: - if ('t' == current) { - state = 6288; - return true; - } - break; - case 6288: - // quest; - if (';' == current) { - match = "?"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 6289; - return true; - } - break; - case 6289: - if ('q' == current) { - state = 6290; - return true; - } - break; - case 6290: - // questeq; - if (';' == current) { - match = "\u225F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6291: - // quot - if ('t' == current) { - match = "\""; - matchLength = consumedCount; - state = 6292; - return true; - } - break; - case 6292: - // quot; - if (';' == current) { - match = "\""; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6293: - switch (current) { - case 'A': - state = 6294; - return true; - case 'B': - state = 6304; - return true; - case 'H': - state = 6308; - return true; - case 'a': - state = 6311; - return true; - case 'b': - state = 6367; - return true; - case 'c': - state = 6385; - return true; - case 'd': - state = 6399; - return true; - case 'e': - state = 6413; - return true; - case 'f': - state = 6427; - return true; - case 'h': - state = 6437; - return true; - case 'i': - state = 6445; - return true; - case 'l': - state = 6532; - return true; - case 'm': - state = 6540; - return true; - case 'n': - state = 6549; - return true; - case 'o': - state = 6553; - return true; - case 'p': - state = 6574; - return true; - case 'r': - state = 6585; - return true; - case 's': - state = 6589; - return true; - case 't': - state = 6602; - return true; - case 'u': - state = 6619; - return true; - case 'x': - state = 6625; - return true; - } - break; - case 6294: - switch (current) { - case 'a': - state = 6295; - return true; - case 'r': - state = 6298; - return true; - case 't': - state = 6300; - return true; - } - break; - case 6295: - if ('r' == current) { - state = 6296; - return true; - } - break; - case 6296: - if ('r' == current) { - state = 6297; - return true; - } - break; - case 6297: - // rAarr; - if (';' == current) { - match = "\u21DB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6298: - if ('r' == current) { - state = 6299; - return true; - } - break; - case 6299: - // rArr; - if (';' == current) { - match = "\u21D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6300: - if ('a' == current) { - state = 6301; - return true; - } - break; - case 6301: - if ('i' == current) { - state = 6302; - return true; - } - break; - case 6302: - if ('l' == current) { - state = 6303; - return true; - } - break; - case 6303: - // rAtail; - if (';' == current) { - match = "\u291C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6304: - if ('a' == current) { - state = 6305; - return true; - } - break; - case 6305: - if ('r' == current) { - state = 6306; - return true; - } - break; - case 6306: - if ('r' == current) { - state = 6307; - return true; - } - break; - case 6307: - // rBarr; - if (';' == current) { - match = "\u290F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6308: - if ('a' == current) { - state = 6309; - return true; - } - break; - case 6309: - if ('r' == current) { - state = 6310; - return true; - } - break; - case 6310: - // rHar; - if (';' == current) { - match = "\u2964"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6311: - switch (current) { - case 'c': - state = 6312; - return true; - case 'd': - state = 6317; - return true; - case 'e': - state = 6320; - return true; - case 'n': - state = 6326; - return true; - case 'q': - state = 6332; - return true; - case 'r': - state = 6335; - return true; - case 't': - state = 6357; - return true; - } - break; - case 6312: - if ('e' == current) { - state = 6313; - return true; - } - else if ('u' == current) { - state = 6314; - return true; - } - break; - case 6313: - // race; - if (';' == current) { - match = "\u223D\u0331"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6314: - if ('t' == current) { - state = 6315; - return true; - } - break; - case 6315: - if ('e' == current) { - state = 6316; - return true; - } - break; - case 6316: - // racute; - if (';' == current) { - match = "\u0155"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6317: - if ('i' == current) { - state = 6318; - return true; - } - break; - case 6318: - if ('c' == current) { - state = 6319; - return true; - } - break; - case 6319: - // radic; - if (';' == current) { - match = "\u221A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6320: - if ('m' == current) { - state = 6321; - return true; - } - break; - case 6321: - if ('p' == current) { - state = 6322; - return true; - } - break; - case 6322: - if ('t' == current) { - state = 6323; - return true; - } - break; - case 6323: - if ('y' == current) { - state = 6324; - return true; - } - break; - case 6324: - if ('v' == current) { - state = 6325; - return true; - } - break; - case 6325: - // raemptyv; - if (';' == current) { - match = "\u29B3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6326: - if ('g' == current) { - state = 6327; - return true; - } - break; - case 6327: - switch (current) { - case ';': // rang; - match = "\u27E9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'd': - state = 6328; - return true; - case 'e': - state = 6329; - return true; - case 'l': - state = 6330; - return true; - } - break; - case 6328: - // rangd; - if (';' == current) { - match = "\u2992"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6329: - // range; - if (';' == current) { - match = "\u29A5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6330: - if ('e' == current) { - state = 6331; - return true; - } - break; - case 6331: - // rangle; - if (';' == current) { - match = "\u27E9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6332: - if ('u' == current) { - state = 6333; - return true; - } - break; - case 6333: - // raquo - if ('o' == current) { - match = "\u00BB"; - matchLength = consumedCount; - state = 6334; - return true; - } - break; - case 6334: - // raquo; - if (';' == current) { - match = "\u00BB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6335: - if ('r' == current) { - state = 6336; - return true; - } - break; - case 6336: - switch (current) { - case ';': // rarr; - match = "\u2192"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 6337; - return true; - case 'b': - state = 6339; - return true; - case 'c': - state = 6342; - return true; - case 'f': - state = 6343; - return true; - case 'h': - state = 6345; - return true; - case 'l': - state = 6347; - return true; - case 'p': - state = 6349; - return true; - case 's': - state = 6351; - return true; - case 't': - state = 6354; - return true; - case 'w': - state = 6356; - return true; - } - break; - case 6337: - if ('p' == current) { - state = 6338; - return true; - } - break; - case 6338: - // rarrap; - if (';' == current) { - match = "\u2975"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6339: - // rarrb; - if (';' == current) { - match = "\u21E5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('f' == current) { - state = 6340; - return true; - } - break; - case 6340: - if ('s' == current) { - state = 6341; - return true; - } - break; - case 6341: - // rarrbfs; - if (';' == current) { - match = "\u2920"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6342: - // rarrc; - if (';' == current) { - match = "\u2933"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6343: - if ('s' == current) { - state = 6344; - return true; - } - break; - case 6344: - // rarrfs; - if (';' == current) { - match = "\u291E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6345: - if ('k' == current) { - state = 6346; - return true; - } - break; - case 6346: - // rarrhk; - if (';' == current) { - match = "\u21AA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6347: - if ('p' == current) { - state = 6348; - return true; - } - break; - case 6348: - // rarrlp; - if (';' == current) { - match = "\u21AC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6349: - if ('l' == current) { - state = 6350; - return true; - } - break; - case 6350: - // rarrpl; - if (';' == current) { - match = "\u2945"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6351: - if ('i' == current) { - state = 6352; - return true; - } - break; - case 6352: - if ('m' == current) { - state = 6353; - return true; - } - break; - case 6353: - // rarrsim; - if (';' == current) { - match = "\u2974"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6354: - if ('l' == current) { - state = 6355; - return true; - } - break; - case 6355: - // rarrtl; - if (';' == current) { - match = "\u21A3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6356: - // rarrw; - if (';' == current) { - match = "\u219D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6357: - if ('a' == current) { - state = 6358; - return true; - } - else if ('i' == current) { - state = 6361; - return true; - } - break; - case 6358: - if ('i' == current) { - state = 6359; - return true; - } - break; - case 6359: - if ('l' == current) { - state = 6360; - return true; - } - break; - case 6360: - // ratail; - if (';' == current) { - match = "\u291A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6361: - if ('o' == current) { - state = 6362; - return true; - } - break; - case 6362: - // ratio; - if (';' == current) { - match = "\u2236"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('n' == current) { - state = 6363; - return true; - } - break; - case 6363: - if ('a' == current) { - state = 6364; - return true; - } - break; - case 6364: - if ('l' == current) { - state = 6365; - return true; - } - break; - case 6365: - if ('s' == current) { - state = 6366; - return true; - } - break; - case 6366: - // rationals; - if (';' == current) { - match = "\u211A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6367: - switch (current) { - case 'a': - state = 6368; - return true; - case 'b': - state = 6371; - return true; - case 'r': - state = 6374; - return true; - } - break; - case 6368: - if ('r' == current) { - state = 6369; - return true; - } - break; - case 6369: - if ('r' == current) { - state = 6370; - return true; - } - break; - case 6370: - // rbarr; - if (';' == current) { - match = "\u290D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6371: - if ('r' == current) { - state = 6372; - return true; - } - break; - case 6372: - if ('k' == current) { - state = 6373; - return true; - } - break; - case 6373: - // rbbrk; - if (';' == current) { - match = "\u2773"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6374: - if ('a' == current) { - state = 6375; - return true; - } - else if ('k' == current) { - state = 6379; - return true; - } - break; - case 6375: - if ('c' == current) { - state = 6376; - return true; - } - break; - case 6376: - if ('e' == current) { - state = 6377; - return true; - } - else if ('k' == current) { - state = 6378; - return true; - } - break; - case 6377: - // rbrace; - if (';' == current) { - match = "}"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6378: - // rbrack; - if (';' == current) { - match = "]"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6379: - if ('e' == current) { - state = 6380; - return true; - } - else if ('s' == current) { - state = 6381; - return true; - } - break; - case 6380: - // rbrke; - if (';' == current) { - match = "\u298C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6381: - if ('l' == current) { - state = 6382; - return true; - } - break; - case 6382: - if ('d' == current) { - state = 6383; - return true; - } - else if ('u' == current) { - state = 6384; - return true; - } - break; - case 6383: - // rbrksld; - if (';' == current) { - match = "\u298E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6384: - // rbrkslu; - if (';' == current) { - match = "\u2990"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6385: - switch (current) { - case 'a': - state = 6386; - return true; - case 'e': - state = 6390; - return true; - case 'u': - state = 6396; - return true; - case 'y': - state = 6398; - return true; - } - break; - case 6386: - if ('r' == current) { - state = 6387; - return true; - } - break; - case 6387: - if ('o' == current) { - state = 6388; - return true; - } - break; - case 6388: - if ('n' == current) { - state = 6389; - return true; - } - break; - case 6389: - // rcaron; - if (';' == current) { - match = "\u0159"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6390: - if ('d' == current) { - state = 6391; - return true; - } - else if ('i' == current) { - state = 6394; - return true; - } - break; - case 6391: - if ('i' == current) { - state = 6392; - return true; - } - break; - case 6392: - if ('l' == current) { - state = 6393; - return true; - } - break; - case 6393: - // rcedil; - if (';' == current) { - match = "\u0157"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6394: - if ('l' == current) { - state = 6395; - return true; - } - break; - case 6395: - // rceil; - if (';' == current) { - match = "\u2309"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6396: - if ('b' == current) { - state = 6397; - return true; - } - break; - case 6397: - // rcub; - if (';' == current) { - match = "}"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6398: - // rcy; - if (';' == current) { - match = "\u0440"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6399: - switch (current) { - case 'c': - state = 6400; - return true; - case 'l': - state = 6402; - return true; - case 'q': - state = 6407; - return true; - case 's': - state = 6411; - return true; - } - break; - case 6400: - if ('a' == current) { - state = 6401; - return true; - } - break; - case 6401: - // rdca; - if (';' == current) { - match = "\u2937"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6402: - if ('d' == current) { - state = 6403; - return true; - } - break; - case 6403: - if ('h' == current) { - state = 6404; - return true; - } - break; - case 6404: - if ('a' == current) { - state = 6405; - return true; - } - break; - case 6405: - if ('r' == current) { - state = 6406; - return true; - } - break; - case 6406: - // rdldhar; - if (';' == current) { - match = "\u2969"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6407: - if ('u' == current) { - state = 6408; - return true; - } - break; - case 6408: - if ('o' == current) { - state = 6409; - return true; - } - break; - case 6409: - // rdquo; - if (';' == current) { - match = "\u201D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('r' == current) { - state = 6410; - return true; - } - break; - case 6410: - // rdquor; - if (';' == current) { - match = "\u201D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6411: - if ('h' == current) { - state = 6412; - return true; - } - break; - case 6412: - // rdsh; - if (';' == current) { - match = "\u21B3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6413: - switch (current) { - case 'a': - state = 6414; - return true; - case 'c': - state = 6424; - return true; - case 'g': // reg - match = "\u00AE"; - matchLength = consumedCount; - state = 6426; - return true; - } - break; - case 6414: - if ('l' == current) { - state = 6415; - return true; - } - break; - case 6415: - switch (current) { - case ';': // real; - match = "\u211C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'i': - state = 6416; - return true; - case 'p': - state = 6419; - return true; - case 's': - state = 6423; - return true; - } - break; - case 6416: - if ('n' == current) { - state = 6417; - return true; - } - break; - case 6417: - if ('e' == current) { - state = 6418; - return true; - } - break; - case 6418: - // realine; - if (';' == current) { - match = "\u211B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6419: - if ('a' == current) { - state = 6420; - return true; - } - break; - case 6420: - if ('r' == current) { - state = 6421; - return true; - } - break; - case 6421: - if ('t' == current) { - state = 6422; - return true; - } - break; - case 6422: - // realpart; - if (';' == current) { - match = "\u211C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6423: - // reals; - if (';' == current) { - match = "\u211D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6424: - if ('t' == current) { - state = 6425; - return true; - } - break; - case 6425: - // rect; - if (';' == current) { - match = "\u25AD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6426: - // reg; - if (';' == current) { - match = "\u00AE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6427: - switch (current) { - case 'i': - state = 6428; - return true; - case 'l': - state = 6432; - return true; - case 'r': - state = 6436; - return true; - } - break; - case 6428: - if ('s' == current) { - state = 6429; - return true; - } - break; - case 6429: - if ('h' == current) { - state = 6430; - return true; - } - break; - case 6430: - if ('t' == current) { - state = 6431; - return true; - } - break; - case 6431: - // rfisht; - if (';' == current) { - match = "\u297D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6432: - if ('o' == current) { - state = 6433; - return true; - } - break; - case 6433: - if ('o' == current) { - state = 6434; - return true; - } - break; - case 6434: - if ('r' == current) { - state = 6435; - return true; - } - break; - case 6435: - // rfloor; - if (';' == current) { - match = "\u230B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6436: - // rfr; - if (';' == current) { - match = "\uD835\uDD2F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6437: - if ('a' == current) { - state = 6438; - return true; - } - else if ('o' == current) { - state = 6443; - return true; - } - break; - case 6438: - if ('r' == current) { - state = 6439; - return true; - } - break; - case 6439: - if ('d' == current) { - state = 6440; - return true; - } - else if ('u' == current) { - state = 6441; - return true; - } - break; - case 6440: - // rhard; - if (';' == current) { - match = "\u21C1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6441: - // rharu; - if (';' == current) { - match = "\u21C0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('l' == current) { - state = 6442; - return true; - } - break; - case 6442: - // rharul; - if (';' == current) { - match = "\u296C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6443: - // rho; - if (';' == current) { - match = "\u03C1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 6444; - return true; - } - break; - case 6444: - // rhov; - if (';' == current) { - match = "\u03F1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6445: - switch (current) { - case 'g': - state = 6446; - return true; - case 'n': - state = 6520; - return true; - case 's': - state = 6522; - return true; - } - break; - case 6446: - if ('h' == current) { - state = 6447; - return true; - } - break; - case 6447: - if ('t' == current) { - state = 6448; - return true; - } - break; - case 6448: - switch (current) { - case 'a': - state = 6449; - return true; - case 'h': - state = 6458; - return true; - case 'l': - state = 6471; - return true; - case 'r': - state = 6489; - return true; - case 's': - state = 6500; - return true; - case 't': - state = 6510; - return true; - } - break; - case 6449: - if ('r' == current) { - state = 6450; - return true; - } - break; - case 6450: - if ('r' == current) { - state = 6451; - return true; - } - break; - case 6451: - if ('o' == current) { - state = 6452; - return true; - } - break; - case 6452: - if ('w' == current) { - state = 6453; - return true; - } - break; - case 6453: - // rightarrow; - if (';' == current) { - match = "\u2192"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('t' == current) { - state = 6454; - return true; - } - break; - case 6454: - if ('a' == current) { - state = 6455; - return true; - } - break; - case 6455: - if ('i' == current) { - state = 6456; - return true; - } - break; - case 6456: - if ('l' == current) { - state = 6457; - return true; - } - break; - case 6457: - // rightarrowtail; - if (';' == current) { - match = "\u21A3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6458: - if ('a' == current) { - state = 6459; - return true; - } - break; - case 6459: - if ('r' == current) { - state = 6460; - return true; - } - break; - case 6460: - if ('p' == current) { - state = 6461; - return true; - } - break; - case 6461: - if ('o' == current) { - state = 6462; - return true; - } - break; - case 6462: - if ('o' == current) { - state = 6463; - return true; - } - break; - case 6463: - if ('n' == current) { - state = 6464; - return true; - } - break; - case 6464: - if ('d' == current) { - state = 6465; - return true; - } - else if ('u' == current) { - state = 6469; - return true; - } - break; - case 6465: - if ('o' == current) { - state = 6466; - return true; - } - break; - case 6466: - if ('w' == current) { - state = 6467; - return true; - } - break; - case 6467: - if ('n' == current) { - state = 6468; - return true; - } - break; - case 6468: - // rightharpoondown; - if (';' == current) { - match = "\u21C1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6469: - if ('p' == current) { - state = 6470; - return true; - } - break; - case 6470: - // rightharpoonup; - if (';' == current) { - match = "\u21C0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6471: - if ('e' == current) { - state = 6472; - return true; - } - break; - case 6472: - if ('f' == current) { - state = 6473; - return true; - } - break; - case 6473: - if ('t' == current) { - state = 6474; - return true; - } - break; - case 6474: - if ('a' == current) { - state = 6475; - return true; - } - else if ('h' == current) { - state = 6481; - return true; - } - break; - case 6475: - if ('r' == current) { - state = 6476; - return true; - } - break; - case 6476: - if ('r' == current) { - state = 6477; - return true; - } - break; - case 6477: - if ('o' == current) { - state = 6478; - return true; - } - break; - case 6478: - if ('w' == current) { - state = 6479; - return true; - } - break; - case 6479: - if ('s' == current) { - state = 6480; - return true; - } - break; - case 6480: - // rightleftarrows; - if (';' == current) { - match = "\u21C4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6481: - if ('a' == current) { - state = 6482; - return true; - } - break; - case 6482: - if ('r' == current) { - state = 6483; - return true; - } - break; - case 6483: - if ('p' == current) { - state = 6484; - return true; - } - break; - case 6484: - if ('o' == current) { - state = 6485; - return true; - } - break; - case 6485: - if ('o' == current) { - state = 6486; - return true; - } - break; - case 6486: - if ('n' == current) { - state = 6487; - return true; - } - break; - case 6487: - if ('s' == current) { - state = 6488; - return true; - } - break; - case 6488: - // rightleftharpoons; - if (';' == current) { - match = "\u21CC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6489: - if ('i' == current) { - state = 6490; - return true; - } - break; - case 6490: - if ('g' == current) { - state = 6491; - return true; - } - break; - case 6491: - if ('h' == current) { - state = 6492; - return true; - } - break; - case 6492: - if ('t' == current) { - state = 6493; - return true; - } - break; - case 6493: - if ('a' == current) { - state = 6494; - return true; - } - break; - case 6494: - if ('r' == current) { - state = 6495; - return true; - } - break; - case 6495: - if ('r' == current) { - state = 6496; - return true; - } - break; - case 6496: - if ('o' == current) { - state = 6497; - return true; - } - break; - case 6497: - if ('w' == current) { - state = 6498; - return true; - } - break; - case 6498: - if ('s' == current) { - state = 6499; - return true; - } - break; - case 6499: - // rightrightarrows; - if (';' == current) { - match = "\u21C9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6500: - if ('q' == current) { - state = 6501; - return true; - } - break; - case 6501: - if ('u' == current) { - state = 6502; - return true; - } - break; - case 6502: - if ('i' == current) { - state = 6503; - return true; - } - break; - case 6503: - if ('g' == current) { - state = 6504; - return true; - } - break; - case 6504: - if ('a' == current) { - state = 6505; - return true; - } - break; - case 6505: - if ('r' == current) { - state = 6506; - return true; - } - break; - case 6506: - if ('r' == current) { - state = 6507; - return true; - } - break; - case 6507: - if ('o' == current) { - state = 6508; - return true; - } - break; - case 6508: - if ('w' == current) { - state = 6509; - return true; - } - break; - case 6509: - // rightsquigarrow; - if (';' == current) { - match = "\u219D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6510: - if ('h' == current) { - state = 6511; - return true; - } - break; - case 6511: - if ('r' == current) { - state = 6512; - return true; - } - break; - case 6512: - if ('e' == current) { - state = 6513; - return true; - } - break; - case 6513: - if ('e' == current) { - state = 6514; - return true; - } - break; - case 6514: - if ('t' == current) { - state = 6515; - return true; - } - break; - case 6515: - if ('i' == current) { - state = 6516; - return true; - } - break; - case 6516: - if ('m' == current) { - state = 6517; - return true; - } - break; - case 6517: - if ('e' == current) { - state = 6518; - return true; - } - break; - case 6518: - if ('s' == current) { - state = 6519; - return true; - } - break; - case 6519: - // rightthreetimes; - if (';' == current) { - match = "\u22CC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6520: - if ('g' == current) { - state = 6521; - return true; - } - break; - case 6521: - // ring; - if (';' == current) { - match = "\u02DA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6522: - if ('i' == current) { - state = 6523; - return true; - } - break; - case 6523: - if ('n' == current) { - state = 6524; - return true; - } - break; - case 6524: - if ('g' == current) { - state = 6525; - return true; - } - break; - case 6525: - if ('d' == current) { - state = 6526; - return true; - } - break; - case 6526: - if ('o' == current) { - state = 6527; - return true; - } - break; - case 6527: - if ('t' == current) { - state = 6528; - return true; - } - break; - case 6528: - if ('s' == current) { - state = 6529; - return true; - } - break; - case 6529: - if ('e' == current) { - state = 6530; - return true; - } - break; - case 6530: - if ('q' == current) { - state = 6531; - return true; - } - break; - case 6531: - // risingdotseq; - if (';' == current) { - match = "\u2253"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6532: - switch (current) { - case 'a': - state = 6533; - return true; - case 'h': - state = 6536; - return true; - case 'm': - state = 6539; - return true; - } - break; - case 6533: - if ('r' == current) { - state = 6534; - return true; - } - break; - case 6534: - if ('r' == current) { - state = 6535; - return true; - } - break; - case 6535: - // rlarr; - if (';' == current) { - match = "\u21C4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6536: - if ('a' == current) { - state = 6537; - return true; - } - break; - case 6537: - if ('r' == current) { - state = 6538; - return true; - } - break; - case 6538: - // rlhar; - if (';' == current) { - match = "\u21CC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6539: - // rlm; - if (';' == current) { - match = "\u200F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6540: - if ('o' == current) { - state = 6541; - return true; - } - break; - case 6541: - if ('u' == current) { - state = 6542; - return true; - } - break; - case 6542: - if ('s' == current) { - state = 6543; - return true; - } - break; - case 6543: - if ('t' == current) { - state = 6544; - return true; - } - break; - case 6544: - // rmoust; - if (';' == current) { - match = "\u23B1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('a' == current) { - state = 6545; - return true; - } - break; - case 6545: - if ('c' == current) { - state = 6546; - return true; - } - break; - case 6546: - if ('h' == current) { - state = 6547; - return true; - } - break; - case 6547: - if ('e' == current) { - state = 6548; - return true; - } - break; - case 6548: - // rmoustache; - if (';' == current) { - match = "\u23B1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6549: - if ('m' == current) { - state = 6550; - return true; - } - break; - case 6550: - if ('i' == current) { - state = 6551; - return true; - } - break; - case 6551: - if ('d' == current) { - state = 6552; - return true; - } - break; - case 6552: - // rnmid; - if (';' == current) { - match = "\u2AEE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6553: - switch (current) { - case 'a': - state = 6554; - return true; - case 'b': - state = 6559; - return true; - case 'p': - state = 6562; - return true; - case 't': - state = 6569; - return true; - } - break; - case 6554: - if ('n' == current) { - state = 6555; - return true; - } - else if ('r' == current) { - state = 6557; - return true; - } - break; - case 6555: - if ('g' == current) { - state = 6556; - return true; - } - break; - case 6556: - // roang; - if (';' == current) { - match = "\u27ED"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6557: - if ('r' == current) { - state = 6558; - return true; - } - break; - case 6558: - // roarr; - if (';' == current) { - match = "\u21FE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6559: - if ('r' == current) { - state = 6560; - return true; - } - break; - case 6560: - if ('k' == current) { - state = 6561; - return true; - } - break; - case 6561: - // robrk; - if (';' == current) { - match = "\u27E7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6562: - switch (current) { - case 'a': - state = 6563; - return true; - case 'f': - state = 6565; - return true; - case 'l': - state = 6566; - return true; - } - break; - case 6563: - if ('r' == current) { - state = 6564; - return true; - } - break; - case 6564: - // ropar; - if (';' == current) { - match = "\u2986"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6565: - // ropf; - if (';' == current) { - match = "\uD835\uDD63"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6566: - if ('u' == current) { - state = 6567; - return true; - } - break; - case 6567: - if ('s' == current) { - state = 6568; - return true; - } - break; - case 6568: - // roplus; - if (';' == current) { - match = "\u2A2E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6569: - if ('i' == current) { - state = 6570; - return true; - } - break; - case 6570: - if ('m' == current) { - state = 6571; - return true; - } - break; - case 6571: - if ('e' == current) { - state = 6572; - return true; - } - break; - case 6572: - if ('s' == current) { - state = 6573; - return true; - } - break; - case 6573: - // rotimes; - if (';' == current) { - match = "\u2A35"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6574: - if ('a' == current) { - state = 6575; - return true; - } - else if ('p' == current) { - state = 6579; - return true; - } - break; - case 6575: - if ('r' == current) { - state = 6576; - return true; - } - break; - case 6576: - // rpar; - if (';' == current) { - match = ")"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('g' == current) { - state = 6577; - return true; - } - break; - case 6577: - if ('t' == current) { - state = 6578; - return true; - } - break; - case 6578: - // rpargt; - if (';' == current) { - match = "\u2994"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6579: - if ('o' == current) { - state = 6580; - return true; - } - break; - case 6580: - if ('l' == current) { - state = 6581; - return true; - } - break; - case 6581: - if ('i' == current) { - state = 6582; - return true; - } - break; - case 6582: - if ('n' == current) { - state = 6583; - return true; - } - break; - case 6583: - if ('t' == current) { - state = 6584; - return true; - } - break; - case 6584: - // rppolint; - if (';' == current) { - match = "\u2A12"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6585: - if ('a' == current) { - state = 6586; - return true; - } - break; - case 6586: - if ('r' == current) { - state = 6587; - return true; - } - break; - case 6587: - if ('r' == current) { - state = 6588; - return true; - } - break; - case 6588: - // rrarr; - if (';' == current) { - match = "\u21C9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6589: - switch (current) { - case 'a': - state = 6590; - return true; - case 'c': - state = 6594; - return true; - case 'h': - state = 6596; - return true; - case 'q': - state = 6597; - return true; - } - break; - case 6590: - if ('q' == current) { - state = 6591; - return true; - } - break; - case 6591: - if ('u' == current) { - state = 6592; - return true; - } - break; - case 6592: - if ('o' == current) { - state = 6593; - return true; - } - break; - case 6593: - // rsaquo; - if (';' == current) { - match = "\u203A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6594: - if ('r' == current) { - state = 6595; - return true; - } - break; - case 6595: - // rscr; - if (';' == current) { - match = "\uD835\uDCC7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6596: - // rsh; - if (';' == current) { - match = "\u21B1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6597: - if ('b' == current) { - state = 6598; - return true; - } - else if ('u' == current) { - state = 6599; - return true; - } - break; - case 6598: - // rsqb; - if (';' == current) { - match = "]"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6599: - if ('o' == current) { - state = 6600; - return true; - } - break; - case 6600: - // rsquo; - if (';' == current) { - match = "\u2019"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('r' == current) { - state = 6601; - return true; - } - break; - case 6601: - // rsquor; - if (';' == current) { - match = "\u2019"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6602: - switch (current) { - case 'h': - state = 6603; - return true; - case 'i': - state = 6607; - return true; - case 'r': - state = 6611; - return true; - } - break; - case 6603: - if ('r' == current) { - state = 6604; - return true; - } - break; - case 6604: - if ('e' == current) { - state = 6605; - return true; - } - break; - case 6605: - if ('e' == current) { - state = 6606; - return true; - } - break; - case 6606: - // rthree; - if (';' == current) { - match = "\u22CC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6607: - if ('m' == current) { - state = 6608; - return true; - } - break; - case 6608: - if ('e' == current) { - state = 6609; - return true; - } - break; - case 6609: - if ('s' == current) { - state = 6610; - return true; - } - break; - case 6610: - // rtimes; - if (';' == current) { - match = "\u22CA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6611: - if ('i' == current) { - state = 6612; - return true; - } - break; - case 6612: - switch (current) { - case ';': // rtri; - match = "\u25B9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 6613; - return true; - case 'f': - state = 6614; - return true; - case 'l': - state = 6615; - return true; - } - break; - case 6613: - // rtrie; - if (';' == current) { - match = "\u22B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6614: - // rtrif; - if (';' == current) { - match = "\u25B8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6615: - if ('t' == current) { - state = 6616; - return true; - } - break; - case 6616: - if ('r' == current) { - state = 6617; - return true; - } - break; - case 6617: - if ('i' == current) { - state = 6618; - return true; - } - break; - case 6618: - // rtriltri; - if (';' == current) { - match = "\u29CE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6619: - if ('l' == current) { - state = 6620; - return true; - } - break; - case 6620: - if ('u' == current) { - state = 6621; - return true; - } - break; - case 6621: - if ('h' == current) { - state = 6622; - return true; - } - break; - case 6622: - if ('a' == current) { - state = 6623; - return true; - } - break; - case 6623: - if ('r' == current) { - state = 6624; - return true; - } - break; - case 6624: - // ruluhar; - if (';' == current) { - match = "\u2968"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6625: - // rx; - if (';' == current) { - match = "\u211E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6626: - switch (current) { - case 'a': - state = 6627; - return true; - case 'b': - state = 6632; - return true; - case 'c': - state = 6636; - return true; - case 'd': - state = 6670; - return true; - case 'e': - state = 6675; - return true; - case 'f': - state = 6703; - return true; - case 'h': - state = 6708; - return true; - case 'i': - state = 6732; - return true; - case 'l': - state = 6758; - return true; - case 'm': - state = 6762; - return true; - case 'o': - state = 6790; - return true; - case 'p': - state = 6801; - return true; - case 'q': - state = 6810; - return true; - case 'r': - state = 6840; - return true; - case 's': - state = 6844; - return true; - case 't': - state = 6859; - return true; - case 'u': - state = 6881; - return true; - case 'w': - state = 7008; - return true; - case 'z': - state = 7023; - return true; - } - break; - case 6627: - if ('c' == current) { - state = 6628; - return true; - } - break; - case 6628: - if ('u' == current) { - state = 6629; - return true; - } - break; - case 6629: - if ('t' == current) { - state = 6630; - return true; - } - break; - case 6630: - if ('e' == current) { - state = 6631; - return true; - } - break; - case 6631: - // sacute; - if (';' == current) { - match = "\u015B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6632: - if ('q' == current) { - state = 6633; - return true; - } - break; - case 6633: - if ('u' == current) { - state = 6634; - return true; - } - break; - case 6634: - if ('o' == current) { - state = 6635; - return true; - } - break; - case 6635: - // sbquo; - if (';' == current) { - match = "\u201A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6636: - switch (current) { - case ';': // sc; - match = "\u227B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 6637; - return true; - case 'a': - state = 6638; - return true; - case 'c': - state = 6643; - return true; - case 'e': - state = 6646; - return true; - case 'i': - state = 6650; - return true; - case 'n': - state = 6653; - return true; - case 'p': - state = 6660; - return true; - case 's': - state = 6666; - return true; - case 'y': - state = 6669; - return true; - } - break; - case 6637: - // scE; - if (';' == current) { - match = "\u2AB4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6638: - if ('p' == current) { - state = 6639; - return true; - } - else if ('r' == current) { - state = 6640; - return true; - } - break; - case 6639: - // scap; - if (';' == current) { - match = "\u2AB8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6640: - if ('o' == current) { - state = 6641; - return true; - } - break; - case 6641: - if ('n' == current) { - state = 6642; - return true; - } - break; - case 6642: - // scaron; - if (';' == current) { - match = "\u0161"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6643: - if ('u' == current) { - state = 6644; - return true; - } - break; - case 6644: - if ('e' == current) { - state = 6645; - return true; - } - break; - case 6645: - // sccue; - if (';' == current) { - match = "\u227D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6646: - // sce; - if (';' == current) { - match = "\u2AB0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 6647; - return true; - } - break; - case 6647: - if ('i' == current) { - state = 6648; - return true; - } - break; - case 6648: - if ('l' == current) { - state = 6649; - return true; - } - break; - case 6649: - // scedil; - if (';' == current) { - match = "\u015F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6650: - if ('r' == current) { - state = 6651; - return true; - } - break; - case 6651: - if ('c' == current) { - state = 6652; - return true; - } - break; - case 6652: - // scirc; - if (';' == current) { - match = "\u015D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6653: - switch (current) { - case 'E': - state = 6654; - return true; - case 'a': - state = 6655; - return true; - case 's': - state = 6657; - return true; - } - break; - case 6654: - // scnE; - if (';' == current) { - match = "\u2AB6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6655: - if ('p' == current) { - state = 6656; - return true; - } - break; - case 6656: - // scnap; - if (';' == current) { - match = "\u2ABA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6657: - if ('i' == current) { - state = 6658; - return true; - } - break; - case 6658: - if ('m' == current) { - state = 6659; - return true; - } - break; - case 6659: - // scnsim; - if (';' == current) { - match = "\u22E9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6660: - if ('o' == current) { - state = 6661; - return true; - } - break; - case 6661: - if ('l' == current) { - state = 6662; - return true; - } - break; - case 6662: - if ('i' == current) { - state = 6663; - return true; - } - break; - case 6663: - if ('n' == current) { - state = 6664; - return true; - } - break; - case 6664: - if ('t' == current) { - state = 6665; - return true; - } - break; - case 6665: - // scpolint; - if (';' == current) { - match = "\u2A13"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6666: - if ('i' == current) { - state = 6667; - return true; - } - break; - case 6667: - if ('m' == current) { - state = 6668; - return true; - } - break; - case 6668: - // scsim; - if (';' == current) { - match = "\u227F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6669: - // scy; - if (';' == current) { - match = "\u0441"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6670: - if ('o' == current) { - state = 6671; - return true; - } - break; - case 6671: - if ('t' == current) { - state = 6672; - return true; - } - break; - case 6672: - switch (current) { - case ';': // sdot; - match = "\u22C5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'b': - state = 6673; - return true; - case 'e': - state = 6674; - return true; - } - break; - case 6673: - // sdotb; - if (';' == current) { - match = "\u22A1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6674: - // sdote; - if (';' == current) { - match = "\u2A66"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6675: - switch (current) { - case 'A': - state = 6676; - return true; - case 'a': - state = 6679; - return true; - case 'c': - state = 6686; - return true; - case 'm': - state = 6688; - return true; - case 's': - state = 6690; - return true; - case 't': - state = 6694; - return true; - case 'x': - state = 6701; - return true; - } - break; - case 6676: - if ('r' == current) { - state = 6677; - return true; - } - break; - case 6677: - if ('r' == current) { - state = 6678; - return true; - } - break; - case 6678: - // seArr; - if (';' == current) { - match = "\u21D8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6679: - if ('r' == current) { - state = 6680; - return true; - } - break; - case 6680: - if ('h' == current) { - state = 6681; - return true; - } - else if ('r' == current) { - state = 6683; - return true; - } - break; - case 6681: - if ('k' == current) { - state = 6682; - return true; - } - break; - case 6682: - // searhk; - if (';' == current) { - match = "\u2925"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6683: - // searr; - if (';' == current) { - match = "\u2198"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 6684; - return true; - } - break; - case 6684: - if ('w' == current) { - state = 6685; - return true; - } - break; - case 6685: - // searrow; - if (';' == current) { - match = "\u2198"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6686: - // sect - if ('t' == current) { - match = "\u00A7"; - matchLength = consumedCount; - state = 6687; - return true; - } - break; - case 6687: - // sect; - if (';' == current) { - match = "\u00A7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6688: - if ('i' == current) { - state = 6689; - return true; - } - break; - case 6689: - // semi; - if (';' == current) { - match = ";"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6690: - if ('w' == current) { - state = 6691; - return true; - } - break; - case 6691: - if ('a' == current) { - state = 6692; - return true; - } - break; - case 6692: - if ('r' == current) { - state = 6693; - return true; - } - break; - case 6693: - // seswar; - if (';' == current) { - match = "\u2929"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6694: - if ('m' == current) { - state = 6695; - return true; - } - break; - case 6695: - if ('i' == current) { - state = 6696; - return true; - } - else if ('n' == current) { - state = 6700; - return true; - } - break; - case 6696: - if ('n' == current) { - state = 6697; - return true; - } - break; - case 6697: - if ('u' == current) { - state = 6698; - return true; - } - break; - case 6698: - if ('s' == current) { - state = 6699; - return true; - } - break; - case 6699: - // setminus; - if (';' == current) { - match = "\u2216"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6700: - // setmn; - if (';' == current) { - match = "\u2216"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6701: - if ('t' == current) { - state = 6702; - return true; - } - break; - case 6702: - // sext; - if (';' == current) { - match = "\u2736"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6703: - if ('r' == current) { - state = 6704; - return true; - } - break; - case 6704: - // sfr; - if (';' == current) { - match = "\uD835\uDD30"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 6705; - return true; - } - break; - case 6705: - if ('w' == current) { - state = 6706; - return true; - } - break; - case 6706: - if ('n' == current) { - state = 6707; - return true; - } - break; - case 6707: - // sfrown; - if (';' == current) { - match = "\u2322"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6708: - switch (current) { - case 'a': - state = 6709; - return true; - case 'c': - state = 6712; - return true; - case 'o': - state = 6717; - return true; - case 'y': // shy - match = "\u00AD"; - matchLength = consumedCount; - state = 6731; - return true; - } - break; - case 6709: - if ('r' == current) { - state = 6710; - return true; - } - break; - case 6710: - if ('p' == current) { - state = 6711; - return true; - } - break; - case 6711: - // sharp; - if (';' == current) { - match = "\u266F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6712: - if ('h' == current) { - state = 6713; - return true; - } - else if ('y' == current) { - state = 6716; - return true; - } - break; - case 6713: - if ('c' == current) { - state = 6714; - return true; - } - break; - case 6714: - if ('y' == current) { - state = 6715; - return true; - } - break; - case 6715: - // shchcy; - if (';' == current) { - match = "\u0449"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6716: - // shcy; - if (';' == current) { - match = "\u0448"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6717: - if ('r' == current) { - state = 6718; - return true; - } - break; - case 6718: - if ('t' == current) { - state = 6719; - return true; - } - break; - case 6719: - if ('m' == current) { - state = 6720; - return true; - } - else if ('p' == current) { - state = 6723; - return true; - } - break; - case 6720: - if ('i' == current) { - state = 6721; - return true; - } - break; - case 6721: - if ('d' == current) { - state = 6722; - return true; - } - break; - case 6722: - // shortmid; - if (';' == current) { - match = "\u2223"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6723: - if ('a' == current) { - state = 6724; - return true; - } - break; - case 6724: - if ('r' == current) { - state = 6725; - return true; - } - break; - case 6725: - if ('a' == current) { - state = 6726; - return true; - } - break; - case 6726: - if ('l' == current) { - state = 6727; - return true; - } - break; - case 6727: - if ('l' == current) { - state = 6728; - return true; - } - break; - case 6728: - if ('e' == current) { - state = 6729; - return true; - } - break; - case 6729: - if ('l' == current) { - state = 6730; - return true; - } - break; - case 6730: - // shortparallel; - if (';' == current) { - match = "\u2225"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6731: - // shy; - if (';' == current) { - match = "\u00AD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6732: - if ('g' == current) { - state = 6733; - return true; - } - else if ('m' == current) { - state = 6738; - return true; - } - break; - case 6733: - if ('m' == current) { - state = 6734; - return true; - } - break; - case 6734: - if ('a' == current) { - state = 6735; - return true; - } - break; - case 6735: - switch (current) { - case ';': // sigma; - match = "\u03C3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'f': - state = 6736; - return true; - case 'v': - state = 6737; - return true; - } - break; - case 6736: - // sigmaf; - if (';' == current) { - match = "\u03C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6737: - // sigmav; - if (';' == current) { - match = "\u03C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6738: - switch (current) { - case ';': // sim; - match = "\u223C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'd': - state = 6739; - return true; - case 'e': - state = 6742; - return true; - case 'g': - state = 6744; - return true; - case 'l': - state = 6746; - return true; - case 'n': - state = 6748; - return true; - case 'p': - state = 6750; - return true; - case 'r': - state = 6754; - return true; - } - break; - case 6739: - if ('o' == current) { - state = 6740; - return true; - } - break; - case 6740: - if ('t' == current) { - state = 6741; - return true; - } - break; - case 6741: - // simdot; - if (';' == current) { - match = "\u2A6A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6742: - // sime; - if (';' == current) { - match = "\u2243"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 6743; - return true; - } - break; - case 6743: - // simeq; - if (';' == current) { - match = "\u2243"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6744: - // simg; - if (';' == current) { - match = "\u2A9E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('E' == current) { - state = 6745; - return true; - } - break; - case 6745: - // simgE; - if (';' == current) { - match = "\u2AA0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6746: - // siml; - if (';' == current) { - match = "\u2A9D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('E' == current) { - state = 6747; - return true; - } - break; - case 6747: - // simlE; - if (';' == current) { - match = "\u2A9F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6748: - if ('e' == current) { - state = 6749; - return true; - } - break; - case 6749: - // simne; - if (';' == current) { - match = "\u2246"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6750: - if ('l' == current) { - state = 6751; - return true; - } - break; - case 6751: - if ('u' == current) { - state = 6752; - return true; - } - break; - case 6752: - if ('s' == current) { - state = 6753; - return true; - } - break; - case 6753: - // simplus; - if (';' == current) { - match = "\u2A24"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6754: - if ('a' == current) { - state = 6755; - return true; - } - break; - case 6755: - if ('r' == current) { - state = 6756; - return true; - } - break; - case 6756: - if ('r' == current) { - state = 6757; - return true; - } - break; - case 6757: - // simrarr; - if (';' == current) { - match = "\u2972"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6758: - if ('a' == current) { - state = 6759; - return true; - } - break; - case 6759: - if ('r' == current) { - state = 6760; - return true; - } - break; - case 6760: - if ('r' == current) { - state = 6761; - return true; - } - break; - case 6761: - // slarr; - if (';' == current) { - match = "\u2190"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6762: - switch (current) { - case 'a': - state = 6763; - return true; - case 'e': - state = 6777; - return true; - case 'i': - state = 6783; - return true; - case 't': - state = 6787; - return true; - } - break; - case 6763: - if ('l' == current) { - state = 6764; - return true; - } - else if ('s' == current) { - state = 6774; - return true; - } - break; - case 6764: - if ('l' == current) { - state = 6765; - return true; - } - break; - case 6765: - if ('s' == current) { - state = 6766; - return true; - } - break; - case 6766: - if ('e' == current) { - state = 6767; - return true; - } - break; - case 6767: - if ('t' == current) { - state = 6768; - return true; - } - break; - case 6768: - if ('m' == current) { - state = 6769; - return true; - } - break; - case 6769: - if ('i' == current) { - state = 6770; - return true; - } - break; - case 6770: - if ('n' == current) { - state = 6771; - return true; - } - break; - case 6771: - if ('u' == current) { - state = 6772; - return true; - } - break; - case 6772: - if ('s' == current) { - state = 6773; - return true; - } - break; - case 6773: - // smallsetminus; - if (';' == current) { - match = "\u2216"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6774: - if ('h' == current) { - state = 6775; - return true; - } - break; - case 6775: - if ('p' == current) { - state = 6776; - return true; - } - break; - case 6776: - // smashp; - if (';' == current) { - match = "\u2A33"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6777: - if ('p' == current) { - state = 6778; - return true; - } - break; - case 6778: - if ('a' == current) { - state = 6779; - return true; - } - break; - case 6779: - if ('r' == current) { - state = 6780; - return true; - } - break; - case 6780: - if ('s' == current) { - state = 6781; - return true; - } - break; - case 6781: - if ('l' == current) { - state = 6782; - return true; - } - break; - case 6782: - // smeparsl; - if (';' == current) { - match = "\u29E4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6783: - if ('d' == current) { - state = 6784; - return true; - } - else if ('l' == current) { - state = 6785; - return true; - } - break; - case 6784: - // smid; - if (';' == current) { - match = "\u2223"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6785: - if ('e' == current) { - state = 6786; - return true; - } - break; - case 6786: - // smile; - if (';' == current) { - match = "\u2323"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6787: - // smt; - if (';' == current) { - match = "\u2AAA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 6788; - return true; - } - break; - case 6788: - // smte; - if (';' == current) { - match = "\u2AAC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 6789; - return true; - } - break; - case 6789: - // smtes; - if (';' == current) { - match = "\u2AAC\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6790: - switch (current) { - case 'f': - state = 6791; - return true; - case 'l': - state = 6795; - return true; - case 'p': - state = 6799; - return true; - } - break; - case 6791: - if ('t' == current) { - state = 6792; - return true; - } - break; - case 6792: - if ('c' == current) { - state = 6793; - return true; - } - break; - case 6793: - if ('y' == current) { - state = 6794; - return true; - } - break; - case 6794: - // softcy; - if (';' == current) { - match = "\u044C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6795: - // sol; - if (';' == current) { - match = "/"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('b' == current) { - state = 6796; - return true; - } - break; - case 6796: - // solb; - if (';' == current) { - match = "\u29C4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('a' == current) { - state = 6797; - return true; - } - break; - case 6797: - if ('r' == current) { - state = 6798; - return true; - } - break; - case 6798: - // solbar; - if (';' == current) { - match = "\u233F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6799: - if ('f' == current) { - state = 6800; - return true; - } - break; - case 6800: - // sopf; - if (';' == current) { - match = "\uD835\uDD64"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6801: - if ('a' == current) { - state = 6802; - return true; - } - break; - case 6802: - if ('d' == current) { - state = 6803; - return true; - } - else if ('r' == current) { - state = 6809; - return true; - } - break; - case 6803: - if ('e' == current) { - state = 6804; - return true; - } - break; - case 6804: - if ('s' == current) { - state = 6805; - return true; - } - break; - case 6805: - // spades; - if (';' == current) { - match = "\u2660"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('u' == current) { - state = 6806; - return true; - } - break; - case 6806: - if ('i' == current) { - state = 6807; - return true; - } - break; - case 6807: - if ('t' == current) { - state = 6808; - return true; - } - break; - case 6808: - // spadesuit; - if (';' == current) { - match = "\u2660"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6809: - // spar; - if (';' == current) { - match = "\u2225"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6810: - switch (current) { - case 'c': - state = 6811; - return true; - case 's': - state = 6818; - return true; - case 'u': - state = 6834; - return true; - } - break; - case 6811: - if ('a' == current) { - state = 6812; - return true; - } - else if ('u' == current) { - state = 6815; - return true; - } - break; - case 6812: - if ('p' == current) { - state = 6813; - return true; - } - break; - case 6813: - // sqcap; - if (';' == current) { - match = "\u2293"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 6814; - return true; - } - break; - case 6814: - // sqcaps; - if (';' == current) { - match = "\u2293\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6815: - if ('p' == current) { - state = 6816; - return true; - } - break; - case 6816: - // sqcup; - if (';' == current) { - match = "\u2294"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('s' == current) { - state = 6817; - return true; - } - break; - case 6817: - // sqcups; - if (';' == current) { - match = "\u2294\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6818: - if ('u' == current) { - state = 6819; - return true; - } - break; - case 6819: - if ('b' == current) { - state = 6820; - return true; - } - else if ('p' == current) { - state = 6827; - return true; - } - break; - case 6820: - switch (current) { - case ';': // sqsub; - match = "\u228F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 6821; - return true; - case 's': - state = 6822; - return true; - } - break; - case 6821: - // sqsube; - if (';' == current) { - match = "\u2291"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6822: - if ('e' == current) { - state = 6823; - return true; - } - break; - case 6823: - if ('t' == current) { - state = 6824; - return true; - } - break; - case 6824: - // sqsubset; - if (';' == current) { - match = "\u228F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 6825; - return true; - } - break; - case 6825: - if ('q' == current) { - state = 6826; - return true; - } - break; - case 6826: - // sqsubseteq; - if (';' == current) { - match = "\u2291"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6827: - switch (current) { - case ';': // sqsup; - match = "\u2290"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 6828; - return true; - case 's': - state = 6829; - return true; - } - break; - case 6828: - // sqsupe; - if (';' == current) { - match = "\u2292"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6829: - if ('e' == current) { - state = 6830; - return true; - } - break; - case 6830: - if ('t' == current) { - state = 6831; - return true; - } - break; - case 6831: - // sqsupset; - if (';' == current) { - match = "\u2290"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 6832; - return true; - } - break; - case 6832: - if ('q' == current) { - state = 6833; - return true; - } - break; - case 6833: - // sqsupseteq; - if (';' == current) { - match = "\u2292"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6834: - switch (current) { - case ';': // squ; - match = "\u25A1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 6835; - return true; - case 'f': - state = 6839; - return true; - } - break; - case 6835: - if ('r' == current) { - state = 6836; - return true; - } - break; - case 6836: - if ('e' == current) { - state = 6837; - return true; - } - else if ('f' == current) { - state = 6838; - return true; - } - break; - case 6837: - // square; - if (';' == current) { - match = "\u25A1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6838: - // squarf; - if (';' == current) { - match = "\u25AA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6839: - // squf; - if (';' == current) { - match = "\u25AA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6840: - if ('a' == current) { - state = 6841; - return true; - } - break; - case 6841: - if ('r' == current) { - state = 6842; - return true; - } - break; - case 6842: - if ('r' == current) { - state = 6843; - return true; - } - break; - case 6843: - // srarr; - if (';' == current) { - match = "\u2192"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6844: - switch (current) { - case 'c': - state = 6845; - return true; - case 'e': - state = 6847; - return true; - case 'm': - state = 6851; - return true; - case 't': - state = 6855; - return true; - } - break; - case 6845: - if ('r' == current) { - state = 6846; - return true; - } - break; - case 6846: - // sscr; - if (';' == current) { - match = "\uD835\uDCC8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6847: - if ('t' == current) { - state = 6848; - return true; - } - break; - case 6848: - if ('m' == current) { - state = 6849; - return true; - } - break; - case 6849: - if ('n' == current) { - state = 6850; - return true; - } - break; - case 6850: - // ssetmn; - if (';' == current) { - match = "\u2216"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6851: - if ('i' == current) { - state = 6852; - return true; - } - break; - case 6852: - if ('l' == current) { - state = 6853; - return true; - } - break; - case 6853: - if ('e' == current) { - state = 6854; - return true; - } - break; - case 6854: - // ssmile; - if (';' == current) { - match = "\u2323"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6855: - if ('a' == current) { - state = 6856; - return true; - } - break; - case 6856: - if ('r' == current) { - state = 6857; - return true; - } - break; - case 6857: - if ('f' == current) { - state = 6858; - return true; - } - break; - case 6858: - // sstarf; - if (';' == current) { - match = "\u22C6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6859: - if ('a' == current) { - state = 6860; - return true; - } - else if ('r' == current) { - state = 6863; - return true; - } - break; - case 6860: - if ('r' == current) { - state = 6861; - return true; - } - break; - case 6861: - // star; - if (';' == current) { - match = "\u2606"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('f' == current) { - state = 6862; - return true; - } - break; - case 6862: - // starf; - if (';' == current) { - match = "\u2605"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6863: - if ('a' == current) { - state = 6864; - return true; - } - else if ('n' == current) { - state = 6879; - return true; - } - break; - case 6864: - if ('i' == current) { - state = 6865; - return true; - } - break; - case 6865: - if ('g' == current) { - state = 6866; - return true; - } - break; - case 6866: - if ('h' == current) { - state = 6867; - return true; - } - break; - case 6867: - if ('t' == current) { - state = 6868; - return true; - } - break; - case 6868: - if ('e' == current) { - state = 6869; - return true; - } - else if ('p' == current) { - state = 6876; - return true; - } - break; - case 6869: - if ('p' == current) { - state = 6870; - return true; - } - break; - case 6870: - if ('s' == current) { - state = 6871; - return true; - } - break; - case 6871: - if ('i' == current) { - state = 6872; - return true; - } - break; - case 6872: - if ('l' == current) { - state = 6873; - return true; - } - break; - case 6873: - if ('o' == current) { - state = 6874; - return true; - } - break; - case 6874: - if ('n' == current) { - state = 6875; - return true; - } - break; - case 6875: - // straightepsilon; - if (';' == current) { - match = "\u03F5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6876: - if ('h' == current) { - state = 6877; - return true; - } - break; - case 6877: - if ('i' == current) { - state = 6878; - return true; - } - break; - case 6878: - // straightphi; - if (';' == current) { - match = "\u03D5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6879: - if ('s' == current) { - state = 6880; - return true; - } - break; - case 6880: - // strns; - if (';' == current) { - match = "\u00AF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6881: - switch (current) { - case 'b': - state = 6882; - return true; - case 'c': - state = 6921; - return true; - case 'm': - state = 6954; - return true; - case 'n': - state = 6955; - return true; - case 'p': - state = 6957; - return true; - } - break; - case 6882: - switch (current) { - case ';': // sub; - match = "\u2282"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 6883; - return true; - case 'd': - state = 6884; - return true; - case 'e': - state = 6887; - return true; - case 'm': - state = 6891; - return true; - case 'n': - state = 6895; - return true; - case 'p': - state = 6898; - return true; - case 'r': - state = 6902; - return true; - case 's': - state = 6906; - return true; - } - break; - case 6883: - // subE; - if (';' == current) { - match = "\u2AC5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6884: - if ('o' == current) { - state = 6885; - return true; - } - break; - case 6885: - if ('t' == current) { - state = 6886; - return true; - } - break; - case 6886: - // subdot; - if (';' == current) { - match = "\u2ABD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6887: - // sube; - if (';' == current) { - match = "\u2286"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 6888; - return true; - } - break; - case 6888: - if ('o' == current) { - state = 6889; - return true; - } - break; - case 6889: - if ('t' == current) { - state = 6890; - return true; - } - break; - case 6890: - // subedot; - if (';' == current) { - match = "\u2AC3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6891: - if ('u' == current) { - state = 6892; - return true; - } - break; - case 6892: - if ('l' == current) { - state = 6893; - return true; - } - break; - case 6893: - if ('t' == current) { - state = 6894; - return true; - } - break; - case 6894: - // submult; - if (';' == current) { - match = "\u2AC1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6895: - if ('E' == current) { - state = 6896; - return true; - } - else if ('e' == current) { - state = 6897; - return true; - } - break; - case 6896: - // subnE; - if (';' == current) { - match = "\u2ACB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6897: - // subne; - if (';' == current) { - match = "\u228A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6898: - if ('l' == current) { - state = 6899; - return true; - } - break; - case 6899: - if ('u' == current) { - state = 6900; - return true; - } - break; - case 6900: - if ('s' == current) { - state = 6901; - return true; - } - break; - case 6901: - // subplus; - if (';' == current) { - match = "\u2ABF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6902: - if ('a' == current) { - state = 6903; - return true; - } - break; - case 6903: - if ('r' == current) { - state = 6904; - return true; - } - break; - case 6904: - if ('r' == current) { - state = 6905; - return true; - } - break; - case 6905: - // subrarr; - if (';' == current) { - match = "\u2979"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6906: - switch (current) { - case 'e': - state = 6907; - return true; - case 'i': - state = 6916; - return true; - case 'u': - state = 6918; - return true; - } - break; - case 6907: - if ('t' == current) { - state = 6908; - return true; - } - break; - case 6908: - switch (current) { - case ';': // subset; - match = "\u2282"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 6909; - return true; - case 'n': - state = 6912; - return true; - } - break; - case 6909: - if ('q' == current) { - state = 6910; - return true; - } - break; - case 6910: - // subseteq; - if (';' == current) { - match = "\u2286"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 6911; - return true; - } - break; - case 6911: - // subseteqq; - if (';' == current) { - match = "\u2AC5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6912: - if ('e' == current) { - state = 6913; - return true; - } - break; - case 6913: - if ('q' == current) { - state = 6914; - return true; - } - break; - case 6914: - // subsetneq; - if (';' == current) { - match = "\u228A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 6915; - return true; - } - break; - case 6915: - // subsetneqq; - if (';' == current) { - match = "\u2ACB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6916: - if ('m' == current) { - state = 6917; - return true; - } - break; - case 6917: - // subsim; - if (';' == current) { - match = "\u2AC7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6918: - if ('b' == current) { - state = 6919; - return true; - } - else if ('p' == current) { - state = 6920; - return true; - } - break; - case 6919: - // subsub; - if (';' == current) { - match = "\u2AD5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6920: - // subsup; - if (';' == current) { - match = "\u2AD3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6921: - if ('c' == current) { - state = 6922; - return true; - } - break; - case 6922: - switch (current) { - case ';': // succ; - match = "\u227B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'a': - state = 6923; - return true; - case 'c': - state = 6929; - return true; - case 'e': - state = 6936; - return true; - case 'n': - state = 6938; - return true; - case 's': - state = 6951; - return true; - } - break; - case 6923: - if ('p' == current) { - state = 6924; - return true; - } - break; - case 6924: - if ('p' == current) { - state = 6925; - return true; - } - break; - case 6925: - if ('r' == current) { - state = 6926; - return true; - } - break; - case 6926: - if ('o' == current) { - state = 6927; - return true; - } - break; - case 6927: - if ('x' == current) { - state = 6928; - return true; - } - break; - case 6928: - // succapprox; - if (';' == current) { - match = "\u2AB8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6929: - if ('u' == current) { - state = 6930; - return true; - } - break; - case 6930: - if ('r' == current) { - state = 6931; - return true; - } - break; - case 6931: - if ('l' == current) { - state = 6932; - return true; - } - break; - case 6932: - if ('y' == current) { - state = 6933; - return true; - } - break; - case 6933: - if ('e' == current) { - state = 6934; - return true; - } - break; - case 6934: - if ('q' == current) { - state = 6935; - return true; - } - break; - case 6935: - // succcurlyeq; - if (';' == current) { - match = "\u227D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6936: - if ('q' == current) { - state = 6937; - return true; - } - break; - case 6937: - // succeq; - if (';' == current) { - match = "\u2AB0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6938: - switch (current) { - case 'a': - state = 6939; - return true; - case 'e': - state = 6945; - return true; - case 's': - state = 6948; - return true; - } - break; - case 6939: - if ('p' == current) { - state = 6940; - return true; - } - break; - case 6940: - if ('p' == current) { - state = 6941; - return true; - } - break; - case 6941: - if ('r' == current) { - state = 6942; - return true; - } - break; - case 6942: - if ('o' == current) { - state = 6943; - return true; - } - break; - case 6943: - if ('x' == current) { - state = 6944; - return true; - } - break; - case 6944: - // succnapprox; - if (';' == current) { - match = "\u2ABA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6945: - if ('q' == current) { - state = 6946; - return true; - } - break; - case 6946: - if ('q' == current) { - state = 6947; - return true; - } - break; - case 6947: - // succneqq; - if (';' == current) { - match = "\u2AB6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6948: - if ('i' == current) { - state = 6949; - return true; - } - break; - case 6949: - if ('m' == current) { - state = 6950; - return true; - } - break; - case 6950: - // succnsim; - if (';' == current) { - match = "\u22E9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6951: - if ('i' == current) { - state = 6952; - return true; - } - break; - case 6952: - if ('m' == current) { - state = 6953; - return true; - } - break; - case 6953: - // succsim; - if (';' == current) { - match = "\u227F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6954: - // sum; - if (';' == current) { - match = "\u2211"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6955: - if ('g' == current) { - state = 6956; - return true; - } - break; - case 6956: - // sung; - if (';' == current) { - match = "\u266A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6957: - switch (current) { - case '1': // sup1 - match = "\u00B9"; - matchLength = consumedCount; - state = 6958; - return true; - case '2': // sup2 - match = "\u00B2"; - matchLength = consumedCount; - state = 6959; - return true; - case '3': // sup3 - match = "\u00B3"; - matchLength = consumedCount; - state = 6960; - return true; - case ';': // sup; - match = "\u2283"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'E': - state = 6961; - return true; - case 'd': - state = 6962; - return true; - case 'e': - state = 6968; - return true; - case 'h': - state = 6972; - return true; - case 'l': - state = 6978; - return true; - case 'm': - state = 6982; - return true; - case 'n': - state = 6986; - return true; - case 'p': - state = 6989; - return true; - case 's': - state = 6993; - return true; - } - break; - case 6958: - // sup1; - if (';' == current) { - match = "\u00B9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6959: - // sup2; - if (';' == current) { - match = "\u00B2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6960: - // sup3; - if (';' == current) { - match = "\u00B3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6961: - // supE; - if (';' == current) { - match = "\u2AC6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6962: - if ('o' == current) { - state = 6963; - return true; - } - else if ('s' == current) { - state = 6965; - return true; - } - break; - case 6963: - if ('t' == current) { - state = 6964; - return true; - } - break; - case 6964: - // supdot; - if (';' == current) { - match = "\u2ABE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6965: - if ('u' == current) { - state = 6966; - return true; - } - break; - case 6966: - if ('b' == current) { - state = 6967; - return true; - } - break; - case 6967: - // supdsub; - if (';' == current) { - match = "\u2AD8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6968: - // supe; - if (';' == current) { - match = "\u2287"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('d' == current) { - state = 6969; - return true; - } - break; - case 6969: - if ('o' == current) { - state = 6970; - return true; - } - break; - case 6970: - if ('t' == current) { - state = 6971; - return true; - } - break; - case 6971: - // supedot; - if (';' == current) { - match = "\u2AC4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6972: - if ('s' == current) { - state = 6973; - return true; - } - break; - case 6973: - if ('o' == current) { - state = 6974; - return true; - } - else if ('u' == current) { - state = 6976; - return true; - } - break; - case 6974: - if ('l' == current) { - state = 6975; - return true; - } - break; - case 6975: - // suphsol; - if (';' == current) { - match = "\u27C9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6976: - if ('b' == current) { - state = 6977; - return true; - } - break; - case 6977: - // suphsub; - if (';' == current) { - match = "\u2AD7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6978: - if ('a' == current) { - state = 6979; - return true; - } - break; - case 6979: - if ('r' == current) { - state = 6980; - return true; - } - break; - case 6980: - if ('r' == current) { - state = 6981; - return true; - } - break; - case 6981: - // suplarr; - if (';' == current) { - match = "\u297B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6982: - if ('u' == current) { - state = 6983; - return true; - } - break; - case 6983: - if ('l' == current) { - state = 6984; - return true; - } - break; - case 6984: - if ('t' == current) { - state = 6985; - return true; - } - break; - case 6985: - // supmult; - if (';' == current) { - match = "\u2AC2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6986: - if ('E' == current) { - state = 6987; - return true; - } - else if ('e' == current) { - state = 6988; - return true; - } - break; - case 6987: - // supnE; - if (';' == current) { - match = "\u2ACC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6988: - // supne; - if (';' == current) { - match = "\u228B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6989: - if ('l' == current) { - state = 6990; - return true; - } - break; - case 6990: - if ('u' == current) { - state = 6991; - return true; - } - break; - case 6991: - if ('s' == current) { - state = 6992; - return true; - } - break; - case 6992: - // supplus; - if (';' == current) { - match = "\u2AC0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6993: - switch (current) { - case 'e': - state = 6994; - return true; - case 'i': - state = 7003; - return true; - case 'u': - state = 7005; - return true; - } - break; - case 6994: - if ('t' == current) { - state = 6995; - return true; - } - break; - case 6995: - switch (current) { - case ';': // supset; - match = "\u2283"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'e': - state = 6996; - return true; - case 'n': - state = 6999; - return true; - } - break; - case 6996: - if ('q' == current) { - state = 6997; - return true; - } - break; - case 6997: - // supseteq; - if (';' == current) { - match = "\u2287"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 6998; - return true; - } - break; - case 6998: - // supseteqq; - if (';' == current) { - match = "\u2AC6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 6999: - if ('e' == current) { - state = 7000; - return true; - } - break; - } - return false; - } - - private boolean parse8(final int current) { - consumedCount++; - switch (state) { - case 7000: - if ('q' == current) { - state = 7001; - return true; - } - break; - case 7001: - // supsetneq; - if (';' == current) { - match = "\u228B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 7002; - return true; - } - break; - case 7002: - // supsetneqq; - if (';' == current) { - match = "\u2ACC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7003: - if ('m' == current) { - state = 7004; - return true; - } - break; - case 7004: - // supsim; - if (';' == current) { - match = "\u2AC8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7005: - if ('b' == current) { - state = 7006; - return true; - } - else if ('p' == current) { - state = 7007; - return true; - } - break; - case 7006: - // supsub; - if (';' == current) { - match = "\u2AD4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7007: - // supsup; - if (';' == current) { - match = "\u2AD6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7008: - switch (current) { - case 'A': - state = 7009; - return true; - case 'a': - state = 7012; - return true; - case 'n': - state = 7019; - return true; - } - break; - case 7009: - if ('r' == current) { - state = 7010; - return true; - } - break; - case 7010: - if ('r' == current) { - state = 7011; - return true; - } - break; - case 7011: - // swArr; - if (';' == current) { - match = "\u21D9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7012: - if ('r' == current) { - state = 7013; - return true; - } - break; - case 7013: - if ('h' == current) { - state = 7014; - return true; - } - else if ('r' == current) { - state = 7016; - return true; - } - break; - case 7014: - if ('k' == current) { - state = 7015; - return true; - } - break; - case 7015: - // swarhk; - if (';' == current) { - match = "\u2926"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7016: - // swarr; - if (';' == current) { - match = "\u2199"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 7017; - return true; - } - break; - case 7017: - if ('w' == current) { - state = 7018; - return true; - } - break; - case 7018: - // swarrow; - if (';' == current) { - match = "\u2199"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7019: - if ('w' == current) { - state = 7020; - return true; - } - break; - case 7020: - if ('a' == current) { - state = 7021; - return true; - } - break; - case 7021: - if ('r' == current) { - state = 7022; - return true; - } - break; - case 7022: - // swnwar; - if (';' == current) { - match = "\u292A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7023: - if ('l' == current) { - state = 7024; - return true; - } - break; - case 7024: - if ('i' == current) { - state = 7025; - return true; - } - break; - case 7025: - // szlig - if ('g' == current) { - match = "\u00DF"; - matchLength = consumedCount; - state = 7026; - return true; - } - break; - case 7026: - // szlig; - if (';' == current) { - match = "\u00DF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7027: - switch (current) { - case 'a': - state = 7028; - return true; - case 'b': - state = 7034; - return true; - case 'c': - state = 7037; - return true; - case 'd': - state = 7047; - return true; - case 'e': - state = 7050; - return true; - case 'f': - state = 7055; - return true; - case 'h': - state = 7057; - return true; - case 'i': - state = 7096; - return true; - case 'o': - state = 7109; - return true; - case 'p': - state = 7125; - return true; - case 'r': - state = 7130; - return true; - case 's': - state = 7183; - return true; - case 'w': - state = 7194; - return true; - } - break; - case 7028: - if ('r' == current) { - state = 7029; - return true; - } - else if ('u' == current) { - state = 7033; - return true; - } - break; - case 7029: - if ('g' == current) { - state = 7030; - return true; - } - break; - case 7030: - if ('e' == current) { - state = 7031; - return true; - } - break; - case 7031: - if ('t' == current) { - state = 7032; - return true; - } - break; - case 7032: - // target; - if (';' == current) { - match = "\u2316"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7033: - // tau; - if (';' == current) { - match = "\u03C4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7034: - if ('r' == current) { - state = 7035; - return true; - } - break; - case 7035: - if ('k' == current) { - state = 7036; - return true; - } - break; - case 7036: - // tbrk; - if (';' == current) { - match = "\u23B4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7037: - switch (current) { - case 'a': - state = 7038; - return true; - case 'e': - state = 7042; - return true; - case 'y': - state = 7046; - return true; - } - break; - case 7038: - if ('r' == current) { - state = 7039; - return true; - } - break; - case 7039: - if ('o' == current) { - state = 7040; - return true; - } - break; - case 7040: - if ('n' == current) { - state = 7041; - return true; - } - break; - case 7041: - // tcaron; - if (';' == current) { - match = "\u0165"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7042: - if ('d' == current) { - state = 7043; - return true; - } - break; - case 7043: - if ('i' == current) { - state = 7044; - return true; - } - break; - case 7044: - if ('l' == current) { - state = 7045; - return true; - } - break; - case 7045: - // tcedil; - if (';' == current) { - match = "\u0163"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7046: - // tcy; - if (';' == current) { - match = "\u0442"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7047: - if ('o' == current) { - state = 7048; - return true; - } - break; - case 7048: - if ('t' == current) { - state = 7049; - return true; - } - break; - case 7049: - // tdot; - if (';' == current) { - match = "\u20DB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7050: - if ('l' == current) { - state = 7051; - return true; - } - break; - case 7051: - if ('r' == current) { - state = 7052; - return true; - } - break; - case 7052: - if ('e' == current) { - state = 7053; - return true; - } - break; - case 7053: - if ('c' == current) { - state = 7054; - return true; - } - break; - case 7054: - // telrec; - if (';' == current) { - match = "\u2315"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7055: - if ('r' == current) { - state = 7056; - return true; - } - break; - case 7056: - // tfr; - if (';' == current) { - match = "\uD835\uDD31"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7057: - switch (current) { - case 'e': - state = 7058; - return true; - case 'i': - state = 7072; - return true; - case 'k': - state = 7087; - return true; - case 'o': - state = 7093; - return true; - } - break; - case 7058: - if ('r' == current) { - state = 7059; - return true; - } - else if ('t' == current) { - state = 7066; - return true; - } - break; - case 7059: - if ('e' == current) { - state = 7060; - return true; - } - break; - case 7060: - if ('4' == current) { - state = 7061; - return true; - } - else if ('f' == current) { - state = 7062; - return true; - } - break; - case 7061: - // there4; - if (';' == current) { - match = "\u2234"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7062: - if ('o' == current) { - state = 7063; - return true; - } - break; - case 7063: - if ('r' == current) { - state = 7064; - return true; - } - break; - case 7064: - if ('e' == current) { - state = 7065; - return true; - } - break; - case 7065: - // therefore; - if (';' == current) { - match = "\u2234"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7066: - if ('a' == current) { - state = 7067; - return true; - } - break; - case 7067: - switch (current) { - case ';': // theta; - match = "\u03B8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 's': - state = 7068; - return true; - case 'v': - state = 7071; - return true; - } - break; - case 7068: - if ('y' == current) { - state = 7069; - return true; - } - break; - case 7069: - if ('m' == current) { - state = 7070; - return true; - } - break; - case 7070: - // thetasym; - if (';' == current) { - match = "\u03D1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7071: - // thetav; - if (';' == current) { - match = "\u03D1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7072: - if ('c' == current) { - state = 7073; - return true; - } - else if ('n' == current) { - state = 7084; - return true; - } - break; - case 7073: - if ('k' == current) { - state = 7074; - return true; - } - break; - case 7074: - if ('a' == current) { - state = 7075; - return true; - } - else if ('s' == current) { - state = 7081; - return true; - } - break; - case 7075: - if ('p' == current) { - state = 7076; - return true; - } - break; - case 7076: - if ('p' == current) { - state = 7077; - return true; - } - break; - case 7077: - if ('r' == current) { - state = 7078; - return true; - } - break; - case 7078: - if ('o' == current) { - state = 7079; - return true; - } - break; - case 7079: - if ('x' == current) { - state = 7080; - return true; - } - break; - case 7080: - // thickapprox; - if (';' == current) { - match = "\u2248"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7081: - if ('i' == current) { - state = 7082; - return true; - } - break; - case 7082: - if ('m' == current) { - state = 7083; - return true; - } - break; - case 7083: - // thicksim; - if (';' == current) { - match = "\u223C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7084: - if ('s' == current) { - state = 7085; - return true; - } - break; - case 7085: - if ('p' == current) { - state = 7086; - return true; - } - break; - case 7086: - // thinsp; - if (';' == current) { - match = "\u2009"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7087: - if ('a' == current) { - state = 7088; - return true; - } - else if ('s' == current) { - state = 7090; - return true; - } - break; - case 7088: - if ('p' == current) { - state = 7089; - return true; - } - break; - case 7089: - // thkap; - if (';' == current) { - match = "\u2248"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7090: - if ('i' == current) { - state = 7091; - return true; - } - break; - case 7091: - if ('m' == current) { - state = 7092; - return true; - } - break; - case 7092: - // thksim; - if (';' == current) { - match = "\u223C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7093: - if ('r' == current) { - state = 7094; - return true; - } - break; - case 7094: - // thorn - if ('n' == current) { - match = "\u00FE"; - matchLength = consumedCount; - state = 7095; - return true; - } - break; - case 7095: - // thorn; - if (';' == current) { - match = "\u00FE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7096: - switch (current) { - case 'l': - state = 7097; - return true; - case 'm': - state = 7100; - return true; - case 'n': - state = 7107; - return true; - } - break; - case 7097: - if ('d' == current) { - state = 7098; - return true; - } - break; - case 7098: - if ('e' == current) { - state = 7099; - return true; - } - break; - case 7099: - // tilde; - if (';' == current) { - match = "\u02DC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7100: - if ('e' == current) { - state = 7101; - return true; - } - break; - case 7101: - // times - if ('s' == current) { - match = "\u00D7"; - matchLength = consumedCount; - state = 7102; - return true; - } - break; - case 7102: - switch (current) { - case ';': // times; - match = "\u00D7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'b': - state = 7103; - return true; - case 'd': - state = 7106; - return true; - } - break; - case 7103: - // timesb; - if (';' == current) { - match = "\u22A0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('a' == current) { - state = 7104; - return true; - } - break; - case 7104: - if ('r' == current) { - state = 7105; - return true; - } - break; - case 7105: - // timesbar; - if (';' == current) { - match = "\u2A31"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7106: - // timesd; - if (';' == current) { - match = "\u2A30"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7107: - if ('t' == current) { - state = 7108; - return true; - } - break; - case 7108: - // tint; - if (';' == current) { - match = "\u222D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7109: - switch (current) { - case 'e': - state = 7110; - return true; - case 'p': - state = 7112; - return true; - case 's': - state = 7123; - return true; - } - break; - case 7110: - if ('a' == current) { - state = 7111; - return true; - } - break; - case 7111: - // toea; - if (';' == current) { - match = "\u2928"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7112: - switch (current) { - case ';': // top; - match = "\u22A4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'b': - state = 7113; - return true; - case 'c': - state = 7116; - return true; - case 'f': - state = 7119; - return true; - } - break; - case 7113: - if ('o' == current) { - state = 7114; - return true; - } - break; - case 7114: - if ('t' == current) { - state = 7115; - return true; - } - break; - case 7115: - // topbot; - if (';' == current) { - match = "\u2336"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7116: - if ('i' == current) { - state = 7117; - return true; - } - break; - case 7117: - if ('r' == current) { - state = 7118; - return true; - } - break; - case 7118: - // topcir; - if (';' == current) { - match = "\u2AF1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7119: - // topf; - if (';' == current) { - match = "\uD835\uDD65"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('o' == current) { - state = 7120; - return true; - } - break; - case 7120: - if ('r' == current) { - state = 7121; - return true; - } - break; - case 7121: - if ('k' == current) { - state = 7122; - return true; - } - break; - case 7122: - // topfork; - if (';' == current) { - match = "\u2ADA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7123: - if ('a' == current) { - state = 7124; - return true; - } - break; - case 7124: - // tosa; - if (';' == current) { - match = "\u2929"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7125: - if ('r' == current) { - state = 7126; - return true; - } - break; - case 7126: - if ('i' == current) { - state = 7127; - return true; - } - break; - case 7127: - if ('m' == current) { - state = 7128; - return true; - } - break; - case 7128: - if ('e' == current) { - state = 7129; - return true; - } - break; - case 7129: - // tprime; - if (';' == current) { - match = "\u2034"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7130: - switch (current) { - case 'a': - state = 7131; - return true; - case 'i': - state = 7134; - return true; - case 'p': - state = 7177; - return true; - } - break; - case 7131: - if ('d' == current) { - state = 7132; - return true; - } - break; - case 7132: - if ('e' == current) { - state = 7133; - return true; - } - break; - case 7133: - // trade; - if (';' == current) { - match = "\u2122"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7134: - switch (current) { - case 'a': - state = 7135; - return true; - case 'd': - state = 7158; - return true; - case 'e': - state = 7161; - return true; - case 'm': - state = 7162; - return true; - case 'p': - state = 7167; - return true; - case 's': - state = 7171; - return true; - case 't': - state = 7173; - return true; - } - break; - case 7135: - if ('n' == current) { - state = 7136; - return true; - } - break; - case 7136: - if ('g' == current) { - state = 7137; - return true; - } - break; - case 7137: - if ('l' == current) { - state = 7138; - return true; - } - break; - case 7138: - if ('e' == current) { - state = 7139; - return true; - } - break; - case 7139: - switch (current) { - case ';': // triangle; - match = "\u25B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'd': - state = 7140; - return true; - case 'l': - state = 7144; - return true; - case 'q': - state = 7150; - return true; - case 'r': - state = 7151; - return true; - } - break; - case 7140: - if ('o' == current) { - state = 7141; - return true; - } - break; - case 7141: - if ('w' == current) { - state = 7142; - return true; - } - break; - case 7142: - if ('n' == current) { - state = 7143; - return true; - } - break; - case 7143: - // triangledown; - if (';' == current) { - match = "\u25BF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7144: - if ('e' == current) { - state = 7145; - return true; - } - break; - case 7145: - if ('f' == current) { - state = 7146; - return true; - } - break; - case 7146: - if ('t' == current) { - state = 7147; - return true; - } - break; - case 7147: - // triangleleft; - if (';' == current) { - match = "\u25C3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 7148; - return true; - } - break; - case 7148: - if ('q' == current) { - state = 7149; - return true; - } - break; - case 7149: - // trianglelefteq; - if (';' == current) { - match = "\u22B4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7150: - // triangleq; - if (';' == current) { - match = "\u225C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7151: - if ('i' == current) { - state = 7152; - return true; - } - break; - case 7152: - if ('g' == current) { - state = 7153; - return true; - } - break; - case 7153: - if ('h' == current) { - state = 7154; - return true; - } - break; - case 7154: - if ('t' == current) { - state = 7155; - return true; - } - break; - case 7155: - // triangleright; - if (';' == current) { - match = "\u25B9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 7156; - return true; - } - break; - case 7156: - if ('q' == current) { - state = 7157; - return true; - } - break; - case 7157: - // trianglerighteq; - if (';' == current) { - match = "\u22B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7158: - if ('o' == current) { - state = 7159; - return true; - } - break; - case 7159: - if ('t' == current) { - state = 7160; - return true; - } - break; - case 7160: - // tridot; - if (';' == current) { - match = "\u25EC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7161: - // trie; - if (';' == current) { - match = "\u225C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7162: - if ('i' == current) { - state = 7163; - return true; - } - break; - case 7163: - if ('n' == current) { - state = 7164; - return true; - } - break; - case 7164: - if ('u' == current) { - state = 7165; - return true; - } - break; - case 7165: - if ('s' == current) { - state = 7166; - return true; - } - break; - case 7166: - // triminus; - if (';' == current) { - match = "\u2A3A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7167: - if ('l' == current) { - state = 7168; - return true; - } - break; - case 7168: - if ('u' == current) { - state = 7169; - return true; - } - break; - case 7169: - if ('s' == current) { - state = 7170; - return true; - } - break; - case 7170: - // triplus; - if (';' == current) { - match = "\u2A39"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7171: - if ('b' == current) { - state = 7172; - return true; - } - break; - case 7172: - // trisb; - if (';' == current) { - match = "\u29CD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7173: - if ('i' == current) { - state = 7174; - return true; - } - break; - case 7174: - if ('m' == current) { - state = 7175; - return true; - } - break; - case 7175: - if ('e' == current) { - state = 7176; - return true; - } - break; - case 7176: - // tritime; - if (';' == current) { - match = "\u2A3B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7177: - if ('e' == current) { - state = 7178; - return true; - } - break; - case 7178: - if ('z' == current) { - state = 7179; - return true; - } - break; - case 7179: - if ('i' == current) { - state = 7180; - return true; - } - break; - case 7180: - if ('u' == current) { - state = 7181; - return true; - } - break; - case 7181: - if ('m' == current) { - state = 7182; - return true; - } - break; - case 7182: - // trpezium; - if (';' == current) { - match = "\u23E2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7183: - switch (current) { - case 'c': - state = 7184; - return true; - case 'h': - state = 7187; - return true; - case 't': - state = 7190; - return true; - } - break; - case 7184: - if ('r' == current) { - state = 7185; - return true; - } - else if ('y' == current) { - state = 7186; - return true; - } - break; - case 7185: - // tscr; - if (';' == current) { - match = "\uD835\uDCC9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7186: - // tscy; - if (';' == current) { - match = "\u0446"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7187: - if ('c' == current) { - state = 7188; - return true; - } - break; - case 7188: - if ('y' == current) { - state = 7189; - return true; - } - break; - case 7189: - // tshcy; - if (';' == current) { - match = "\u045B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7190: - if ('r' == current) { - state = 7191; - return true; - } - break; - case 7191: - if ('o' == current) { - state = 7192; - return true; - } - break; - case 7192: - if ('k' == current) { - state = 7193; - return true; - } - break; - case 7193: - // tstrok; - if (';' == current) { - match = "\u0167"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7194: - if ('i' == current) { - state = 7195; - return true; - } - else if ('o' == current) { - state = 7198; - return true; - } - break; - case 7195: - if ('x' == current) { - state = 7196; - return true; - } - break; - case 7196: - if ('t' == current) { - state = 7197; - return true; - } - break; - case 7197: - // twixt; - if (';' == current) { - match = "\u226C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7198: - if ('h' == current) { - state = 7199; - return true; - } - break; - case 7199: - if ('e' == current) { - state = 7200; - return true; - } - break; - case 7200: - if ('a' == current) { - state = 7201; - return true; - } - break; - case 7201: - if ('d' == current) { - state = 7202; - return true; - } - break; - case 7202: - if ('l' == current) { - state = 7203; - return true; - } - else if ('r' == current) { - state = 7212; - return true; - } - break; - case 7203: - if ('e' == current) { - state = 7204; - return true; - } - break; - case 7204: - if ('f' == current) { - state = 7205; - return true; - } - break; - case 7205: - if ('t' == current) { - state = 7206; - return true; - } - break; - case 7206: - if ('a' == current) { - state = 7207; - return true; - } - break; - case 7207: - if ('r' == current) { - state = 7208; - return true; - } - break; - case 7208: - if ('r' == current) { - state = 7209; - return true; - } - break; - case 7209: - if ('o' == current) { - state = 7210; - return true; - } - break; - case 7210: - if ('w' == current) { - state = 7211; - return true; - } - break; - case 7211: - // twoheadleftarrow; - if (';' == current) { - match = "\u219E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7212: - if ('i' == current) { - state = 7213; - return true; - } - break; - case 7213: - if ('g' == current) { - state = 7214; - return true; - } - break; - case 7214: - if ('h' == current) { - state = 7215; - return true; - } - break; - case 7215: - if ('t' == current) { - state = 7216; - return true; - } - break; - case 7216: - if ('a' == current) { - state = 7217; - return true; - } - break; - case 7217: - if ('r' == current) { - state = 7218; - return true; - } - break; - case 7218: - if ('r' == current) { - state = 7219; - return true; - } - break; - case 7219: - if ('o' == current) { - state = 7220; - return true; - } - break; - case 7220: - if ('w' == current) { - state = 7221; - return true; - } - break; - case 7221: - // twoheadrightarrow; - if (';' == current) { - match = "\u21A0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7222: - switch (current) { - case 'A': - state = 7223; - return true; - case 'H': - state = 7226; - return true; - case 'a': - state = 7229; - return true; - case 'b': - state = 7236; - return true; - case 'c': - state = 7243; - return true; - case 'd': - state = 7248; - return true; - case 'f': - state = 7259; - return true; - case 'g': - state = 7265; - return true; - case 'h': - state = 7270; - return true; - case 'l': - state = 7278; - return true; - case 'm': - state = 7291; - return true; - case 'o': - state = 7296; - return true; - case 'p': - state = 7302; - return true; - case 'r': - state = 7350; - return true; - case 's': - state = 7366; - return true; - case 't': - state = 7369; - return true; - case 'u': - state = 7380; - return true; - case 'w': - state = 7386; - return true; - } - break; - case 7223: - if ('r' == current) { - state = 7224; - return true; - } - break; - case 7224: - if ('r' == current) { - state = 7225; - return true; - } - break; - case 7225: - // uArr; - if (';' == current) { - match = "\u21D1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7226: - if ('a' == current) { - state = 7227; - return true; - } - break; - case 7227: - if ('r' == current) { - state = 7228; - return true; - } - break; - case 7228: - // uHar; - if (';' == current) { - match = "\u2963"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7229: - if ('c' == current) { - state = 7230; - return true; - } - else if ('r' == current) { - state = 7234; - return true; - } - break; - case 7230: - if ('u' == current) { - state = 7231; - return true; - } - break; - case 7231: - if ('t' == current) { - state = 7232; - return true; - } - break; - case 7232: - // uacute - if ('e' == current) { - match = "\u00FA"; - matchLength = consumedCount; - state = 7233; - return true; - } - break; - case 7233: - // uacute; - if (';' == current) { - match = "\u00FA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7234: - if ('r' == current) { - state = 7235; - return true; - } - break; - case 7235: - // uarr; - if (';' == current) { - match = "\u2191"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7236: - if ('r' == current) { - state = 7237; - return true; - } - break; - case 7237: - if ('c' == current) { - state = 7238; - return true; - } - else if ('e' == current) { - state = 7240; - return true; - } - break; - case 7238: - if ('y' == current) { - state = 7239; - return true; - } - break; - case 7239: - // ubrcy; - if (';' == current) { - match = "\u045E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7240: - if ('v' == current) { - state = 7241; - return true; - } - break; - case 7241: - if ('e' == current) { - state = 7242; - return true; - } - break; - case 7242: - // ubreve; - if (';' == current) { - match = "\u016D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7243: - if ('i' == current) { - state = 7244; - return true; - } - else if ('y' == current) { - state = 7247; - return true; - } - break; - case 7244: - if ('r' == current) { - state = 7245; - return true; - } - break; - case 7245: - // ucirc - if ('c' == current) { - match = "\u00FB"; - matchLength = consumedCount; - state = 7246; - return true; - } - break; - case 7246: - // ucirc; - if (';' == current) { - match = "\u00FB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7247: - // ucy; - if (';' == current) { - match = "\u0443"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7248: - switch (current) { - case 'a': - state = 7249; - return true; - case 'b': - state = 7252; - return true; - case 'h': - state = 7256; - return true; - } - break; - case 7249: - if ('r' == current) { - state = 7250; - return true; - } - break; - case 7250: - if ('r' == current) { - state = 7251; - return true; - } - break; - case 7251: - // udarr; - if (';' == current) { - match = "\u21C5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7252: - if ('l' == current) { - state = 7253; - return true; - } - break; - case 7253: - if ('a' == current) { - state = 7254; - return true; - } - break; - case 7254: - if ('c' == current) { - state = 7255; - return true; - } - break; - case 7255: - // udblac; - if (';' == current) { - match = "\u0171"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7256: - if ('a' == current) { - state = 7257; - return true; - } - break; - case 7257: - if ('r' == current) { - state = 7258; - return true; - } - break; - case 7258: - // udhar; - if (';' == current) { - match = "\u296E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7259: - if ('i' == current) { - state = 7260; - return true; - } - else if ('r' == current) { - state = 7264; - return true; - } - break; - case 7260: - if ('s' == current) { - state = 7261; - return true; - } - break; - case 7261: - if ('h' == current) { - state = 7262; - return true; - } - break; - case 7262: - if ('t' == current) { - state = 7263; - return true; - } - break; - case 7263: - // ufisht; - if (';' == current) { - match = "\u297E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7264: - // ufr; - if (';' == current) { - match = "\uD835\uDD32"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7265: - if ('r' == current) { - state = 7266; - return true; - } - break; - case 7266: - if ('a' == current) { - state = 7267; - return true; - } - break; - case 7267: - if ('v' == current) { - state = 7268; - return true; - } - break; - case 7268: - // ugrave - if ('e' == current) { - match = "\u00F9"; - matchLength = consumedCount; - state = 7269; - return true; - } - break; - case 7269: - // ugrave; - if (';' == current) { - match = "\u00F9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7270: - if ('a' == current) { - state = 7271; - return true; - } - else if ('b' == current) { - state = 7275; - return true; - } - break; - case 7271: - if ('r' == current) { - state = 7272; - return true; - } - break; - case 7272: - if ('l' == current) { - state = 7273; - return true; - } - else if ('r' == current) { - state = 7274; - return true; - } - break; - case 7273: - // uharl; - if (';' == current) { - match = "\u21BF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7274: - // uharr; - if (';' == current) { - match = "\u21BE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7275: - if ('l' == current) { - state = 7276; - return true; - } - break; - case 7276: - if ('k' == current) { - state = 7277; - return true; - } - break; - case 7277: - // uhblk; - if (';' == current) { - match = "\u2580"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7278: - if ('c' == current) { - state = 7279; - return true; - } - else if ('t' == current) { - state = 7288; - return true; - } - break; - case 7279: - if ('o' == current) { - state = 7280; - return true; - } - else if ('r' == current) { - state = 7285; - return true; - } - break; - case 7280: - if ('r' == current) { - state = 7281; - return true; - } - break; - case 7281: - if ('n' == current) { - state = 7282; - return true; - } - break; - case 7282: - // ulcorn; - if (';' == current) { - match = "\u231C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 7283; - return true; - } - break; - case 7283: - if ('r' == current) { - state = 7284; - return true; - } - break; - case 7284: - // ulcorner; - if (';' == current) { - match = "\u231C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7285: - if ('o' == current) { - state = 7286; - return true; - } - break; - case 7286: - if ('p' == current) { - state = 7287; - return true; - } - break; - case 7287: - // ulcrop; - if (';' == current) { - match = "\u230F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7288: - if ('r' == current) { - state = 7289; - return true; - } - break; - case 7289: - if ('i' == current) { - state = 7290; - return true; - } - break; - case 7290: - // ultri; - if (';' == current) { - match = "\u25F8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7291: - if ('a' == current) { - state = 7292; - return true; - } - // uml - else if ('l' == current) { - match = "\u00A8"; - matchLength = consumedCount; - state = 7295; - return true; - } - break; - case 7292: - if ('c' == current) { - state = 7293; - return true; - } - break; - case 7293: - if ('r' == current) { - state = 7294; - return true; - } - break; - case 7294: - // umacr; - if (';' == current) { - match = "\u016B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7295: - // uml; - if (';' == current) { - match = "\u00A8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7296: - if ('g' == current) { - state = 7297; - return true; - } - else if ('p' == current) { - state = 7300; - return true; - } - break; - case 7297: - if ('o' == current) { - state = 7298; - return true; - } - break; - case 7298: - if ('n' == current) { - state = 7299; - return true; - } - break; - case 7299: - // uogon; - if (';' == current) { - match = "\u0173"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7300: - if ('f' == current) { - state = 7301; - return true; - } - break; - case 7301: - // uopf; - if (';' == current) { - match = "\uD835\uDD66"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7302: - switch (current) { - case 'a': - state = 7303; - return true; - case 'd': - state = 7308; - return true; - case 'h': - state = 7317; - return true; - case 'l': - state = 7333; - return true; - case 's': - state = 7336; - return true; - case 'u': - state = 7342; - return true; - } - break; - case 7303: - if ('r' == current) { - state = 7304; - return true; - } - break; - case 7304: - if ('r' == current) { - state = 7305; - return true; - } - break; - case 7305: - if ('o' == current) { - state = 7306; - return true; - } - break; - case 7306: - if ('w' == current) { - state = 7307; - return true; - } - break; - case 7307: - // uparrow; - if (';' == current) { - match = "\u2191"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7308: - if ('o' == current) { - state = 7309; - return true; - } - break; - case 7309: - if ('w' == current) { - state = 7310; - return true; - } - break; - case 7310: - if ('n' == current) { - state = 7311; - return true; - } - break; - case 7311: - if ('a' == current) { - state = 7312; - return true; - } - break; - case 7312: - if ('r' == current) { - state = 7313; - return true; - } - break; - case 7313: - if ('r' == current) { - state = 7314; - return true; - } - break; - case 7314: - if ('o' == current) { - state = 7315; - return true; - } - break; - case 7315: - if ('w' == current) { - state = 7316; - return true; - } - break; - case 7316: - // updownarrow; - if (';' == current) { - match = "\u2195"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7317: - if ('a' == current) { - state = 7318; - return true; - } - break; - case 7318: - if ('r' == current) { - state = 7319; - return true; - } - break; - case 7319: - if ('p' == current) { - state = 7320; - return true; - } - break; - case 7320: - if ('o' == current) { - state = 7321; - return true; - } - break; - case 7321: - if ('o' == current) { - state = 7322; - return true; - } - break; - case 7322: - if ('n' == current) { - state = 7323; - return true; - } - break; - case 7323: - if ('l' == current) { - state = 7324; - return true; - } - else if ('r' == current) { - state = 7328; - return true; - } - break; - case 7324: - if ('e' == current) { - state = 7325; - return true; - } - break; - case 7325: - if ('f' == current) { - state = 7326; - return true; - } - break; - case 7326: - if ('t' == current) { - state = 7327; - return true; - } - break; - case 7327: - // upharpoonleft; - if (';' == current) { - match = "\u21BF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7328: - if ('i' == current) { - state = 7329; - return true; - } - break; - case 7329: - if ('g' == current) { - state = 7330; - return true; - } - break; - case 7330: - if ('h' == current) { - state = 7331; - return true; - } - break; - case 7331: - if ('t' == current) { - state = 7332; - return true; - } - break; - case 7332: - // upharpoonright; - if (';' == current) { - match = "\u21BE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7333: - if ('u' == current) { - state = 7334; - return true; - } - break; - case 7334: - if ('s' == current) { - state = 7335; - return true; - } - break; - case 7335: - // uplus; - if (';' == current) { - match = "\u228E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7336: - if ('i' == current) { - state = 7337; - return true; - } - break; - case 7337: - switch (current) { - case ';': // upsi; - match = "\u03C5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'h': - state = 7338; - return true; - case 'l': - state = 7339; - return true; - } - break; - case 7338: - // upsih; - if (';' == current) { - match = "\u03D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7339: - if ('o' == current) { - state = 7340; - return true; - } - break; - case 7340: - if ('n' == current) { - state = 7341; - return true; - } - break; - case 7341: - // upsilon; - if (';' == current) { - match = "\u03C5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7342: - if ('p' == current) { - state = 7343; - return true; - } - break; - case 7343: - if ('a' == current) { - state = 7344; - return true; - } - break; - case 7344: - if ('r' == current) { - state = 7345; - return true; - } - break; - case 7345: - if ('r' == current) { - state = 7346; - return true; - } - break; - case 7346: - if ('o' == current) { - state = 7347; - return true; - } - break; - case 7347: - if ('w' == current) { - state = 7348; - return true; - } - break; - case 7348: - if ('s' == current) { - state = 7349; - return true; - } - break; - case 7349: - // upuparrows; - if (';' == current) { - match = "\u21C8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7350: - switch (current) { - case 'c': - state = 7351; - return true; - case 'i': - state = 7360; - return true; - case 't': - state = 7363; - return true; - } - break; - case 7351: - if ('o' == current) { - state = 7352; - return true; - } - else if ('r' == current) { - state = 7357; - return true; - } - break; - case 7352: - if ('r' == current) { - state = 7353; - return true; - } - break; - case 7353: - if ('n' == current) { - state = 7354; - return true; - } - break; - case 7354: - // urcorn; - if (';' == current) { - match = "\u231D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 7355; - return true; - } - break; - case 7355: - if ('r' == current) { - state = 7356; - return true; - } - break; - case 7356: - // urcorner; - if (';' == current) { - match = "\u231D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7357: - if ('o' == current) { - state = 7358; - return true; - } - break; - case 7358: - if ('p' == current) { - state = 7359; - return true; - } - break; - case 7359: - // urcrop; - if (';' == current) { - match = "\u230E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7360: - if ('n' == current) { - state = 7361; - return true; - } - break; - case 7361: - if ('g' == current) { - state = 7362; - return true; - } - break; - case 7362: - // uring; - if (';' == current) { - match = "\u016F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7363: - if ('r' == current) { - state = 7364; - return true; - } - break; - case 7364: - if ('i' == current) { - state = 7365; - return true; - } - break; - case 7365: - // urtri; - if (';' == current) { - match = "\u25F9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7366: - if ('c' == current) { - state = 7367; - return true; - } - break; - case 7367: - if ('r' == current) { - state = 7368; - return true; - } - break; - case 7368: - // uscr; - if (';' == current) { - match = "\uD835\uDCCA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7369: - switch (current) { - case 'd': - state = 7370; - return true; - case 'i': - state = 7373; - return true; - case 'r': - state = 7377; - return true; - } - break; - case 7370: - if ('o' == current) { - state = 7371; - return true; - } - break; - case 7371: - if ('t' == current) { - state = 7372; - return true; - } - break; - case 7372: - // utdot; - if (';' == current) { - match = "\u22F0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7373: - if ('l' == current) { - state = 7374; - return true; - } - break; - case 7374: - if ('d' == current) { - state = 7375; - return true; - } - break; - case 7375: - if ('e' == current) { - state = 7376; - return true; - } - break; - case 7376: - // utilde; - if (';' == current) { - match = "\u0169"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7377: - if ('i' == current) { - state = 7378; - return true; - } - break; - case 7378: - // utri; - if (';' == current) { - match = "\u25B5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('f' == current) { - state = 7379; - return true; - } - break; - case 7379: - // utrif; - if (';' == current) { - match = "\u25B4"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7380: - if ('a' == current) { - state = 7381; - return true; - } - else if ('m' == current) { - state = 7384; - return true; - } - break; - case 7381: - if ('r' == current) { - state = 7382; - return true; - } - break; - case 7382: - if ('r' == current) { - state = 7383; - return true; - } - break; - case 7383: - // uuarr; - if (';' == current) { - match = "\u21C8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7384: - // uuml - if ('l' == current) { - match = "\u00FC"; - matchLength = consumedCount; - state = 7385; - return true; - } - break; - case 7385: - // uuml; - if (';' == current) { - match = "\u00FC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7386: - if ('a' == current) { - state = 7387; - return true; - } - break; - case 7387: - if ('n' == current) { - state = 7388; - return true; - } - break; - case 7388: - if ('g' == current) { - state = 7389; - return true; - } - break; - case 7389: - if ('l' == current) { - state = 7390; - return true; - } - break; - case 7390: - if ('e' == current) { - state = 7391; - return true; - } - break; - case 7391: - // uwangle; - if (';' == current) { - match = "\u29A7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7392: - switch (current) { - case 'A': - state = 7393; - return true; - case 'B': - state = 7396; - return true; - case 'D': - state = 7400; - return true; - case 'a': - state = 7404; - return true; - case 'c': - state = 7484; - return true; - case 'd': - state = 7486; - return true; - case 'e': - state = 7490; - return true; - case 'f': - state = 7506; - return true; - case 'l': - state = 7508; - return true; - case 'n': - state = 7512; - return true; - case 'o': - state = 7517; - return true; - case 'p': - state = 7520; - return true; - case 'r': - state = 7524; - return true; - case 's': - state = 7528; - return true; - case 'z': - state = 7540; - return true; - } - break; - case 7393: - if ('r' == current) { - state = 7394; - return true; - } - break; - case 7394: - if ('r' == current) { - state = 7395; - return true; - } - break; - case 7395: - // vArr; - if (';' == current) { - match = "\u21D5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7396: - if ('a' == current) { - state = 7397; - return true; - } - break; - case 7397: - if ('r' == current) { - state = 7398; - return true; - } - break; - case 7398: - // vBar; - if (';' == current) { - match = "\u2AE8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('v' == current) { - state = 7399; - return true; - } - break; - case 7399: - // vBarv; - if (';' == current) { - match = "\u2AE9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7400: - if ('a' == current) { - state = 7401; - return true; - } - break; - case 7401: - if ('s' == current) { - state = 7402; - return true; - } - break; - case 7402: - if ('h' == current) { - state = 7403; - return true; - } - break; - case 7403: - // vDash; - if (';' == current) { - match = "\u22A8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7404: - if ('n' == current) { - state = 7405; - return true; - } - else if ('r' == current) { - state = 7409; - return true; - } - break; - case 7405: - if ('g' == current) { - state = 7406; - return true; - } - break; - case 7406: - if ('r' == current) { - state = 7407; - return true; - } - break; - case 7407: - if ('t' == current) { - state = 7408; - return true; - } - break; - case 7408: - // vangrt; - if (';' == current) { - match = "\u299C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7409: - switch (current) { - case 'e': - state = 7410; - return true; - case 'k': - state = 7417; - return true; - case 'n': - state = 7422; - return true; - case 'p': - state = 7429; - return true; - case 'r': - state = 7438; - return true; - case 's': - state = 7441; - return true; - case 't': - state = 7463; - return true; - } - break; - case 7410: - if ('p' == current) { - state = 7411; - return true; - } - break; - case 7411: - if ('s' == current) { - state = 7412; - return true; - } - break; - case 7412: - if ('i' == current) { - state = 7413; - return true; - } - break; - case 7413: - if ('l' == current) { - state = 7414; - return true; - } - break; - case 7414: - if ('o' == current) { - state = 7415; - return true; - } - break; - case 7415: - if ('n' == current) { - state = 7416; - return true; - } - break; - case 7416: - // varepsilon; - if (';' == current) { - match = "\u03F5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7417: - if ('a' == current) { - state = 7418; - return true; - } - break; - case 7418: - if ('p' == current) { - state = 7419; - return true; - } - break; - case 7419: - if ('p' == current) { - state = 7420; - return true; - } - break; - case 7420: - if ('a' == current) { - state = 7421; - return true; - } - break; - case 7421: - // varkappa; - if (';' == current) { - match = "\u03F0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7422: - if ('o' == current) { - state = 7423; - return true; - } - break; - case 7423: - if ('t' == current) { - state = 7424; - return true; - } - break; - case 7424: - if ('h' == current) { - state = 7425; - return true; - } - break; - case 7425: - if ('i' == current) { - state = 7426; - return true; - } - break; - case 7426: - if ('n' == current) { - state = 7427; - return true; - } - break; - case 7427: - if ('g' == current) { - state = 7428; - return true; - } - break; - case 7428: - // varnothing; - if (';' == current) { - match = "\u2205"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7429: - switch (current) { - case 'h': - state = 7430; - return true; - case 'i': - state = 7432; - return true; - case 'r': - state = 7433; - return true; - } - break; - case 7430: - if ('i' == current) { - state = 7431; - return true; - } - break; - case 7431: - // varphi; - if (';' == current) { - match = "\u03D5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7432: - // varpi; - if (';' == current) { - match = "\u03D6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7433: - if ('o' == current) { - state = 7434; - return true; - } - break; - case 7434: - if ('p' == current) { - state = 7435; - return true; - } - break; - case 7435: - if ('t' == current) { - state = 7436; - return true; - } - break; - case 7436: - if ('o' == current) { - state = 7437; - return true; - } - break; - case 7437: - // varpropto; - if (';' == current) { - match = "\u221D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7438: - // varr; - if (';' == current) { - match = "\u2195"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('h' == current) { - state = 7439; - return true; - } - break; - case 7439: - if ('o' == current) { - state = 7440; - return true; - } - break; - case 7440: - // varrho; - if (';' == current) { - match = "\u03F1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7441: - if ('i' == current) { - state = 7442; - return true; - } - else if ('u' == current) { - state = 7446; - return true; - } - break; - case 7442: - if ('g' == current) { - state = 7443; - return true; - } - break; - case 7443: - if ('m' == current) { - state = 7444; - return true; - } - break; - case 7444: - if ('a' == current) { - state = 7445; - return true; - } - break; - case 7445: - // varsigma; - if (';' == current) { - match = "\u03C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7446: - if ('b' == current) { - state = 7447; - return true; - } - else if ('p' == current) { - state = 7455; - return true; - } - break; - case 7447: - if ('s' == current) { - state = 7448; - return true; - } - break; - case 7448: - if ('e' == current) { - state = 7449; - return true; - } - break; - case 7449: - if ('t' == current) { - state = 7450; - return true; - } - break; - case 7450: - if ('n' == current) { - state = 7451; - return true; - } - break; - case 7451: - if ('e' == current) { - state = 7452; - return true; - } - break; - case 7452: - if ('q' == current) { - state = 7453; - return true; - } - break; - case 7453: - // varsubsetneq; - if (';' == current) { - match = "\u228A\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 7454; - return true; - } - break; - case 7454: - // varsubsetneqq; - if (';' == current) { - match = "\u2ACB\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7455: - if ('s' == current) { - state = 7456; - return true; - } - break; - case 7456: - if ('e' == current) { - state = 7457; - return true; - } - break; - case 7457: - if ('t' == current) { - state = 7458; - return true; - } - break; - case 7458: - if ('n' == current) { - state = 7459; - return true; - } - break; - case 7459: - if ('e' == current) { - state = 7460; - return true; - } - break; - case 7460: - if ('q' == current) { - state = 7461; - return true; - } - break; - case 7461: - // varsupsetneq; - if (';' == current) { - match = "\u228B\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 7462; - return true; - } - break; - case 7462: - // varsupsetneqq; - if (';' == current) { - match = "\u2ACC\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7463: - if ('h' == current) { - state = 7464; - return true; - } - else if ('r' == current) { - state = 7468; - return true; - } - break; - case 7464: - if ('e' == current) { - state = 7465; - return true; - } - break; - case 7465: - if ('t' == current) { - state = 7466; - return true; - } - break; - case 7466: - if ('a' == current) { - state = 7467; - return true; - } - break; - case 7467: - // vartheta; - if (';' == current) { - match = "\u03D1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7468: - if ('i' == current) { - state = 7469; - return true; - } - break; - case 7469: - if ('a' == current) { - state = 7470; - return true; - } - break; - case 7470: - if ('n' == current) { - state = 7471; - return true; - } - break; - case 7471: - if ('g' == current) { - state = 7472; - return true; - } - break; - case 7472: - if ('l' == current) { - state = 7473; - return true; - } - break; - case 7473: - if ('e' == current) { - state = 7474; - return true; - } - break; - case 7474: - if ('l' == current) { - state = 7475; - return true; - } - else if ('r' == current) { - state = 7479; - return true; - } - break; - case 7475: - if ('e' == current) { - state = 7476; - return true; - } - break; - case 7476: - if ('f' == current) { - state = 7477; - return true; - } - break; - case 7477: - if ('t' == current) { - state = 7478; - return true; - } - break; - case 7478: - // vartriangleleft; - if (';' == current) { - match = "\u22B2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7479: - if ('i' == current) { - state = 7480; - return true; - } - break; - case 7480: - if ('g' == current) { - state = 7481; - return true; - } - break; - case 7481: - if ('h' == current) { - state = 7482; - return true; - } - break; - case 7482: - if ('t' == current) { - state = 7483; - return true; - } - break; - case 7483: - // vartriangleright; - if (';' == current) { - match = "\u22B3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7484: - if ('y' == current) { - state = 7485; - return true; - } - break; - case 7485: - // vcy; - if (';' == current) { - match = "\u0432"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7486: - if ('a' == current) { - state = 7487; - return true; - } - break; - case 7487: - if ('s' == current) { - state = 7488; - return true; - } - break; - case 7488: - if ('h' == current) { - state = 7489; - return true; - } - break; - case 7489: - // vdash; - if (';' == current) { - match = "\u22A2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7490: - switch (current) { - case 'e': - state = 7491; - return true; - case 'l': - state = 7497; - return true; - case 'r': - state = 7501; - return true; - } - break; - case 7491: - switch (current) { - case ';': // vee; - match = "\u2228"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - case 'b': - state = 7492; - return true; - case 'e': - state = 7495; - return true; - } - break; - case 7492: - if ('a' == current) { - state = 7493; - return true; - } - break; - case 7493: - if ('r' == current) { - state = 7494; - return true; - } - break; - case 7494: - // veebar; - if (';' == current) { - match = "\u22BB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7495: - if ('q' == current) { - state = 7496; - return true; - } - break; - case 7496: - // veeeq; - if (';' == current) { - match = "\u225A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7497: - if ('l' == current) { - state = 7498; - return true; - } - break; - case 7498: - if ('i' == current) { - state = 7499; - return true; - } - break; - case 7499: - if ('p' == current) { - state = 7500; - return true; - } - break; - case 7500: - // vellip; - if (';' == current) { - match = "\u22EE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7501: - if ('b' == current) { - state = 7502; - return true; - } - else if ('t' == current) { - state = 7505; - return true; - } - break; - case 7502: - if ('a' == current) { - state = 7503; - return true; - } - break; - case 7503: - if ('r' == current) { - state = 7504; - return true; - } - break; - case 7504: - // verbar; - if (';' == current) { - match = "|"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7505: - // vert; - if (';' == current) { - match = "|"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7506: - if ('r' == current) { - state = 7507; - return true; - } - break; - case 7507: - // vfr; - if (';' == current) { - match = "\uD835\uDD33"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7508: - if ('t' == current) { - state = 7509; - return true; - } - break; - case 7509: - if ('r' == current) { - state = 7510; - return true; - } - break; - case 7510: - if ('i' == current) { - state = 7511; - return true; - } - break; - case 7511: - // vltri; - if (';' == current) { - match = "\u22B2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7512: - if ('s' == current) { - state = 7513; - return true; - } - break; - case 7513: - if ('u' == current) { - state = 7514; - return true; - } - break; - case 7514: - if ('b' == current) { - state = 7515; - return true; - } - else if ('p' == current) { - state = 7516; - return true; - } - break; - case 7515: - // vnsub; - if (';' == current) { - match = "\u2282\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7516: - // vnsup; - if (';' == current) { - match = "\u2283\u20D2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7517: - if ('p' == current) { - state = 7518; - return true; - } - break; - case 7518: - if ('f' == current) { - state = 7519; - return true; - } - break; - case 7519: - // vopf; - if (';' == current) { - match = "\uD835\uDD67"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7520: - if ('r' == current) { - state = 7521; - return true; - } - break; - case 7521: - if ('o' == current) { - state = 7522; - return true; - } - break; - case 7522: - if ('p' == current) { - state = 7523; - return true; - } - break; - case 7523: - // vprop; - if (';' == current) { - match = "\u221D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7524: - if ('t' == current) { - state = 7525; - return true; - } - break; - case 7525: - if ('r' == current) { - state = 7526; - return true; - } - break; - case 7526: - if ('i' == current) { - state = 7527; - return true; - } - break; - case 7527: - // vrtri; - if (';' == current) { - match = "\u22B3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7528: - if ('c' == current) { - state = 7529; - return true; - } - else if ('u' == current) { - state = 7531; - return true; - } - break; - case 7529: - if ('r' == current) { - state = 7530; - return true; - } - break; - case 7530: - // vscr; - if (';' == current) { - match = "\uD835\uDCCB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7531: - if ('b' == current) { - state = 7532; - return true; - } - else if ('p' == current) { - state = 7536; - return true; - } - break; - case 7532: - if ('n' == current) { - state = 7533; - return true; - } - break; - case 7533: - if ('E' == current) { - state = 7534; - return true; - } - else if ('e' == current) { - state = 7535; - return true; - } - break; - case 7534: - // vsubnE; - if (';' == current) { - match = "\u2ACB\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7535: - // vsubne; - if (';' == current) { - match = "\u228A\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7536: - if ('n' == current) { - state = 7537; - return true; - } - break; - case 7537: - if ('E' == current) { - state = 7538; - return true; - } - else if ('e' == current) { - state = 7539; - return true; - } - break; - case 7538: - // vsupnE; - if (';' == current) { - match = "\u2ACC\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7539: - // vsupne; - if (';' == current) { - match = "\u228B\uFE00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7540: - if ('i' == current) { - state = 7541; - return true; - } - break; - case 7541: - if ('g' == current) { - state = 7542; - return true; - } - break; - case 7542: - if ('z' == current) { - state = 7543; - return true; - } - break; - case 7543: - if ('a' == current) { - state = 7544; - return true; - } - break; - case 7544: - if ('g' == current) { - state = 7545; - return true; - } - break; - case 7545: - // vzigzag; - if (';' == current) { - match = "\u299A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7546: - switch (current) { - case 'c': - state = 7547; - return true; - case 'e': - state = 7551; - return true; - case 'f': - state = 7563; - return true; - case 'o': - state = 7565; - return true; - case 'p': - state = 7568; - return true; - case 'r': - state = 7569; - return true; - case 's': - state = 7574; - return true; - } - break; - case 7547: - if ('i' == current) { - state = 7548; - return true; - } - break; - case 7548: - if ('r' == current) { - state = 7549; - return true; - } - break; - case 7549: - if ('c' == current) { - state = 7550; - return true; - } - break; - case 7550: - // wcirc; - if (';' == current) { - match = "\u0175"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7551: - if ('d' == current) { - state = 7552; - return true; - } - else if ('i' == current) { - state = 7559; - return true; - } - break; - case 7552: - if ('b' == current) { - state = 7553; - return true; - } - else if ('g' == current) { - state = 7556; - return true; - } - break; - case 7553: - if ('a' == current) { - state = 7554; - return true; - } - break; - case 7554: - if ('r' == current) { - state = 7555; - return true; - } - break; - case 7555: - // wedbar; - if (';' == current) { - match = "\u2A5F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7556: - if ('e' == current) { - state = 7557; - return true; - } - break; - case 7557: - // wedge; - if (';' == current) { - match = "\u2227"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('q' == current) { - state = 7558; - return true; - } - break; - case 7558: - // wedgeq; - if (';' == current) { - match = "\u2259"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7559: - if ('e' == current) { - state = 7560; - return true; - } - break; - case 7560: - if ('r' == current) { - state = 7561; - return true; - } - break; - case 7561: - if ('p' == current) { - state = 7562; - return true; - } - break; - case 7562: - // weierp; - if (';' == current) { - match = "\u2118"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7563: - if ('r' == current) { - state = 7564; - return true; - } - break; - case 7564: - // wfr; - if (';' == current) { - match = "\uD835\uDD34"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7565: - if ('p' == current) { - state = 7566; - return true; - } - break; - case 7566: - if ('f' == current) { - state = 7567; - return true; - } - break; - case 7567: - // wopf; - if (';' == current) { - match = "\uD835\uDD68"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7568: - // wp; - if (';' == current) { - match = "\u2118"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7569: - // wr; - if (';' == current) { - match = "\u2240"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - else if ('e' == current) { - state = 7570; - return true; - } - break; - case 7570: - if ('a' == current) { - state = 7571; - return true; - } - break; - case 7571: - if ('t' == current) { - state = 7572; - return true; - } - break; - case 7572: - if ('h' == current) { - state = 7573; - return true; - } - break; - case 7573: - // wreath; - if (';' == current) { - match = "\u2240"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7574: - if ('c' == current) { - state = 7575; - return true; - } - break; - case 7575: - if ('r' == current) { - state = 7576; - return true; - } - break; - case 7576: - // wscr; - if (';' == current) { - match = "\uD835\uDCCC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7577: - switch (current) { - case 'c': - state = 7578; - return true; - case 'd': - state = 7586; - return true; - case 'f': - state = 7590; - return true; - case 'h': - state = 7592; - return true; - case 'i': - state = 7599; - return true; - case 'l': - state = 7600; - return true; - case 'm': - state = 7607; - return true; - case 'n': - state = 7610; - return true; - case 'o': - state = 7613; - return true; - case 'r': - state = 7626; - return true; - case 's': - state = 7633; - return true; - case 'u': - state = 7640; - return true; - case 'v': - state = 7648; - return true; - case 'w': - state = 7651; - return true; - } - break; - case 7578: - switch (current) { - case 'a': - state = 7579; - return true; - case 'i': - state = 7581; - return true; - case 'u': - state = 7584; - return true; - } - break; - case 7579: - if ('p' == current) { - state = 7580; - return true; - } - break; - case 7580: - // xcap; - if (';' == current) { - match = "\u22C2"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7581: - if ('r' == current) { - state = 7582; - return true; - } - break; - case 7582: - if ('c' == current) { - state = 7583; - return true; - } - break; - case 7583: - // xcirc; - if (';' == current) { - match = "\u25EF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7584: - if ('p' == current) { - state = 7585; - return true; - } - break; - case 7585: - // xcup; - if (';' == current) { - match = "\u22C3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7586: - if ('t' == current) { - state = 7587; - return true; - } - break; - case 7587: - if ('r' == current) { - state = 7588; - return true; - } - break; - case 7588: - if ('i' == current) { - state = 7589; - return true; - } - break; - case 7589: - // xdtri; - if (';' == current) { - match = "\u25BD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7590: - if ('r' == current) { - state = 7591; - return true; - } - break; - case 7591: - // xfr; - if (';' == current) { - match = "\uD835\uDD35"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7592: - if ('A' == current) { - state = 7593; - return true; - } - else if ('a' == current) { - state = 7596; - return true; - } - break; - case 7593: - if ('r' == current) { - state = 7594; - return true; - } - break; - case 7594: - if ('r' == current) { - state = 7595; - return true; - } - break; - case 7595: - // xhArr; - if (';' == current) { - match = "\u27FA"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7596: - if ('r' == current) { - state = 7597; - return true; - } - break; - case 7597: - if ('r' == current) { - state = 7598; - return true; - } - break; - case 7598: - // xharr; - if (';' == current) { - match = "\u27F7"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7599: - // xi; - if (';' == current) { - match = "\u03BE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7600: - if ('A' == current) { - state = 7601; - return true; - } - else if ('a' == current) { - state = 7604; - return true; - } - break; - case 7601: - if ('r' == current) { - state = 7602; - return true; - } - break; - case 7602: - if ('r' == current) { - state = 7603; - return true; - } - break; - case 7603: - // xlArr; - if (';' == current) { - match = "\u27F8"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7604: - if ('r' == current) { - state = 7605; - return true; - } - break; - case 7605: - if ('r' == current) { - state = 7606; - return true; - } - break; - case 7606: - // xlarr; - if (';' == current) { - match = "\u27F5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7607: - if ('a' == current) { - state = 7608; - return true; - } - break; - case 7608: - if ('p' == current) { - state = 7609; - return true; - } - break; - case 7609: - // xmap; - if (';' == current) { - match = "\u27FC"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7610: - if ('i' == current) { - state = 7611; - return true; - } - break; - case 7611: - if ('s' == current) { - state = 7612; - return true; - } - break; - case 7612: - // xnis; - if (';' == current) { - match = "\u22FB"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7613: - switch (current) { - case 'd': - state = 7614; - return true; - case 'p': - state = 7617; - return true; - case 't': - state = 7622; - return true; - } - break; - case 7614: - if ('o' == current) { - state = 7615; - return true; - } - break; - case 7615: - if ('t' == current) { - state = 7616; - return true; - } - break; - case 7616: - // xodot; - if (';' == current) { - match = "\u2A00"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7617: - if ('f' == current) { - state = 7618; - return true; - } - else if ('l' == current) { - state = 7619; - return true; - } - break; - case 7618: - // xopf; - if (';' == current) { - match = "\uD835\uDD69"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7619: - if ('u' == current) { - state = 7620; - return true; - } - break; - case 7620: - if ('s' == current) { - state = 7621; - return true; - } - break; - case 7621: - // xoplus; - if (';' == current) { - match = "\u2A01"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7622: - if ('i' == current) { - state = 7623; - return true; - } - break; - case 7623: - if ('m' == current) { - state = 7624; - return true; - } - break; - case 7624: - if ('e' == current) { - state = 7625; - return true; - } - break; - case 7625: - // xotime; - if (';' == current) { - match = "\u2A02"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7626: - if ('A' == current) { - state = 7627; - return true; - } - else if ('a' == current) { - state = 7630; - return true; - } - break; - case 7627: - if ('r' == current) { - state = 7628; - return true; - } - break; - case 7628: - if ('r' == current) { - state = 7629; - return true; - } - break; - case 7629: - // xrArr; - if (';' == current) { - match = "\u27F9"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7630: - if ('r' == current) { - state = 7631; - return true; - } - break; - case 7631: - if ('r' == current) { - state = 7632; - return true; - } - break; - case 7632: - // xrarr; - if (';' == current) { - match = "\u27F6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7633: - if ('c' == current) { - state = 7634; - return true; - } - else if ('q' == current) { - state = 7636; - return true; - } - break; - case 7634: - if ('r' == current) { - state = 7635; - return true; - } - break; - case 7635: - // xscr; - if (';' == current) { - match = "\uD835\uDCCD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7636: - if ('c' == current) { - state = 7637; - return true; - } - break; - case 7637: - if ('u' == current) { - state = 7638; - return true; - } - break; - case 7638: - if ('p' == current) { - state = 7639; - return true; - } - break; - case 7639: - // xsqcup; - if (';' == current) { - match = "\u2A06"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7640: - if ('p' == current) { - state = 7641; - return true; - } - else if ('t' == current) { - state = 7645; - return true; - } - break; - case 7641: - if ('l' == current) { - state = 7642; - return true; - } - break; - case 7642: - if ('u' == current) { - state = 7643; - return true; - } - break; - case 7643: - if ('s' == current) { - state = 7644; - return true; - } - break; - case 7644: - // xuplus; - if (';' == current) { - match = "\u2A04"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7645: - if ('r' == current) { - state = 7646; - return true; - } - break; - case 7646: - if ('i' == current) { - state = 7647; - return true; - } - break; - case 7647: - // xutri; - if (';' == current) { - match = "\u25B3"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7648: - if ('e' == current) { - state = 7649; - return true; - } - break; - case 7649: - if ('e' == current) { - state = 7650; - return true; - } - break; - case 7650: - // xvee; - if (';' == current) { - match = "\u22C1"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7651: - if ('e' == current) { - state = 7652; - return true; - } - break; - case 7652: - if ('d' == current) { - state = 7653; - return true; - } - break; - case 7653: - if ('g' == current) { - state = 7654; - return true; - } - break; - case 7654: - if ('e' == current) { - state = 7655; - return true; - } - break; - case 7655: - // xwedge; - if (';' == current) { - match = "\u22C0"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7656: - switch (current) { - case 'a': - state = 7657; - return true; - case 'c': - state = 7663; - return true; - case 'e': - state = 7668; - return true; - case 'f': - state = 7670; - return true; - case 'i': - state = 7672; - return true; - case 'o': - state = 7675; - return true; - case 's': - state = 7678; - return true; - case 'u': - state = 7681; - return true; - } - break; - case 7657: - if ('c' == current) { - state = 7658; - return true; - } - break; - case 7658: - if ('u' == current) { - state = 7659; - return true; - } - else if ('y' == current) { - state = 7662; - return true; - } - break; - case 7659: - if ('t' == current) { - state = 7660; - return true; - } - break; - case 7660: - // yacute - if ('e' == current) { - match = "\u00FD"; - matchLength = consumedCount; - state = 7661; - return true; - } - break; - case 7661: - // yacute; - if (';' == current) { - match = "\u00FD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7662: - // yacy; - if (';' == current) { - match = "\u044F"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7663: - if ('i' == current) { - state = 7664; - return true; - } - else if ('y' == current) { - state = 7667; - return true; - } - break; - case 7664: - if ('r' == current) { - state = 7665; - return true; - } - break; - case 7665: - if ('c' == current) { - state = 7666; - return true; - } - break; - case 7666: - // ycirc; - if (';' == current) { - match = "\u0177"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7667: - // ycy; - if (';' == current) { - match = "\u044B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7668: - // yen - if ('n' == current) { - match = "\u00A5"; - matchLength = consumedCount; - state = 7669; - return true; - } - break; - case 7669: - // yen; - if (';' == current) { - match = "\u00A5"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7670: - if ('r' == current) { - state = 7671; - return true; - } - break; - case 7671: - // yfr; - if (';' == current) { - match = "\uD835\uDD36"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7672: - if ('c' == current) { - state = 7673; - return true; - } - break; - case 7673: - if ('y' == current) { - state = 7674; - return true; - } - break; - case 7674: - // yicy; - if (';' == current) { - match = "\u0457"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7675: - if ('p' == current) { - state = 7676; - return true; - } - break; - case 7676: - if ('f' == current) { - state = 7677; - return true; - } - break; - case 7677: - // yopf; - if (';' == current) { - match = "\uD835\uDD6A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7678: - if ('c' == current) { - state = 7679; - return true; - } - break; - case 7679: - if ('r' == current) { - state = 7680; - return true; - } - break; - case 7680: - // yscr; - if (';' == current) { - match = "\uD835\uDCCE"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7681: - if ('c' == current) { - state = 7682; - return true; - } - else if ('m' == current) { - state = 7684; - return true; - } - break; - case 7682: - if ('y' == current) { - state = 7683; - return true; - } - break; - case 7683: - // yucy; - if (';' == current) { - match = "\u044E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7684: - // yuml - if ('l' == current) { - match = "\u00FF"; - matchLength = consumedCount; - state = 7685; - return true; - } - break; - case 7685: - // yuml; - if (';' == current) { - match = "\u00FF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7686: - switch (current) { - case 'a': - state = 7687; - return true; - case 'c': - state = 7692; - return true; - case 'd': - state = 7698; - return true; - case 'e': - state = 7701; - return true; - case 'f': - state = 7708; - return true; - case 'h': - state = 7710; - return true; - case 'i': - state = 7713; - return true; - case 'o': - state = 7719; - return true; - case 's': - state = 7722; - return true; - case 'w': - state = 7725; - return true; - } - break; - case 7687: - if ('c' == current) { - state = 7688; - return true; - } - break; - case 7688: - if ('u' == current) { - state = 7689; - return true; - } - break; - case 7689: - if ('t' == current) { - state = 7690; - return true; - } - break; - case 7690: - if ('e' == current) { - state = 7691; - return true; - } - break; - case 7691: - // zacute; - if (';' == current) { - match = "\u017A"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7692: - if ('a' == current) { - state = 7693; - return true; - } - else if ('y' == current) { - state = 7697; - return true; - } - break; - case 7693: - if ('r' == current) { - state = 7694; - return true; - } - break; - case 7694: - if ('o' == current) { - state = 7695; - return true; - } - break; - case 7695: - if ('n' == current) { - state = 7696; - return true; - } - break; - case 7696: - // zcaron; - if (';' == current) { - match = "\u017E"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7697: - // zcy; - if (';' == current) { - match = "\u0437"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7698: - if ('o' == current) { - state = 7699; - return true; - } - break; - case 7699: - if ('t' == current) { - state = 7700; - return true; - } - break; - case 7700: - // zdot; - if (';' == current) { - match = "\u017C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7701: - if ('e' == current) { - state = 7702; - return true; - } - else if ('t' == current) { - state = 7706; - return true; - } - break; - case 7702: - if ('t' == current) { - state = 7703; - return true; - } - break; - case 7703: - if ('r' == current) { - state = 7704; - return true; - } - break; - case 7704: - if ('f' == current) { - state = 7705; - return true; - } - break; - case 7705: - // zeetrf; - if (';' == current) { - match = "\u2128"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7706: - if ('a' == current) { - state = 7707; - return true; - } - break; - case 7707: - // zeta; - if (';' == current) { - match = "\u03B6"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7708: - if ('r' == current) { - state = 7709; - return true; - } - break; - case 7709: - // zfr; - if (';' == current) { - match = "\uD835\uDD37"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7710: - if ('c' == current) { - state = 7711; - return true; - } - break; - case 7711: - if ('y' == current) { - state = 7712; - return true; - } - break; - case 7712: - // zhcy; - if (';' == current) { - match = "\u0436"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7713: - if ('g' == current) { - state = 7714; - return true; - } - break; - case 7714: - if ('r' == current) { - state = 7715; - return true; - } - break; - case 7715: - if ('a' == current) { - state = 7716; - return true; - } - break; - case 7716: - if ('r' == current) { - state = 7717; - return true; - } - break; - case 7717: - if ('r' == current) { - state = 7718; - return true; - } - break; - case 7718: - // zigrarr; - if (';' == current) { - match = "\u21DD"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7719: - if ('p' == current) { - state = 7720; - return true; - } - break; - case 7720: - if ('f' == current) { - state = 7721; - return true; - } - break; - case 7721: - // zopf; - if (';' == current) { - match = "\uD835\uDD6B"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7722: - if ('c' == current) { - state = 7723; - return true; - } - break; - case 7723: - if ('r' == current) { - state = 7724; - return true; - } - break; - case 7724: - // zscr; - if (';' == current) { - match = "\uD835\uDCCF"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7725: - if ('j' == current) { - state = 7726; - return true; - } - else if ('n' == current) { - state = 7727; - return true; - } - break; - case 7726: - // zwj; - if (';' == current) { - match = "\u200D"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - case 7727: - if ('j' == current) { - state = 7728; - return true; - } - break; - case 7728: - // zwnj; - if (';' == current) { - match = "\u200C"; - matchLength = consumedCount; - state = STATE_ENDS_WITH_SEMICOLON; - return false; - } - break; - } - return false; - } - - public boolean parse(final int current) { - if (state < 1000) { - return parse1(current); - } - if (state < 2000) { - return parse2(current); - } - if (state < 3000) { - return parse3(current); - } - if (state < 4000) { - return parse4(current); - } - if (state < 5000) { - return parse5(current); - } - if (state < 6000) { - return parse6(current); - } - if (state < 7000) { - return parse7(current); - } - if (state < 8000) { - return parse8(current); - } - return false; - } - -} diff --git a/benchmark/src/main/java/org/htmlunit/cyberneko/HtmlEntitiesParserBenchmark.java b/benchmark/src/main/java/org/htmlunit/cyberneko/HtmlEntitiesParserBenchmark.java deleted file mode 100644 index 6d4219c3..00000000 --- a/benchmark/src/main/java/org/htmlunit/cyberneko/HtmlEntitiesParserBenchmark.java +++ /dev/null @@ -1,282 +0,0 @@ -/* - * Copyright (c) 2014, Oracle America, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * * Redistributions of source code must retain the above copyright notice, - * this list of conditions and the following disclaimer. - * - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in the - * documentation and/or other materials provided with the distribution. - * - * * Neither the name of Oracle nor the names of its contributors may be used - * to endorse or promote products derived from this software without - * specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF - * THE POSSIBILITY OF SUCH DAMAGE. - */ - -package org.htmlunit.cyberneko; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Properties; -import java.util.Random; -import java.util.concurrent.TimeUnit; - -import org.htmlunit.benchmark.util.FastRandom; -import org.htmlunit.cyberneko.util.HtmlEntities1; -import org.htmlunit.cyberneko.util.HtmlEntities1.Resolver; -import org.htmlunit.cyberneko.util.HtmlEntities2; -import org.htmlunit.cyberneko.util.HtmlEntities3; -import org.htmlunit.cyberneko.util.HTMLEntitiesParser; -import org.openjdk.jmh.annotations.Benchmark; -import org.openjdk.jmh.annotations.BenchmarkMode; -import org.openjdk.jmh.annotations.Fork; -import org.openjdk.jmh.annotations.Measurement; -import org.openjdk.jmh.annotations.Mode; -import org.openjdk.jmh.annotations.OutputTimeUnit; -import org.openjdk.jmh.annotations.Param; -import org.openjdk.jmh.annotations.Scope; -import org.openjdk.jmh.annotations.Setup; -import org.openjdk.jmh.annotations.State; -import org.openjdk.jmh.annotations.Warmup; -import org.openjdk.jmh.infra.BenchmarkParams; -import org.openjdk.jmh.runner.Runner; -import org.openjdk.jmh.runner.RunnerException; -import org.openjdk.jmh.runner.options.Options; -import org.openjdk.jmh.runner.options.OptionsBuilder; - -@State(Scope.Thread) -@BenchmarkMode(Mode.AverageTime) -@OutputTimeUnit(TimeUnit.NANOSECONDS) -@Warmup(iterations = 3, time = 2 , timeUnit = TimeUnit.SECONDS) -@Measurement(iterations = 3, time = 2, timeUnit = TimeUnit.SECONDS) -@Fork(1) -public class HtmlEntitiesParserBenchmark { - - final List keys = new ArrayList<>(); - final List values = new ArrayList<>(); - - @Param({"true", "false"}) - boolean random; - - @Param({"true", "false"}) - boolean onlyCommon; - - final Random r = new Random(); - - @Setup - public void setup(BenchmarkParams params) throws IOException { - final Properties props = new Properties(); - try (InputStream stream = HtmlEntitiesParserBenchmark.class.getResourceAsStream(onlyCommon ? "html_entities_common.properties" : "html_entities.properties")) { - props.load(stream); - } - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - if (key.isEmpty()) { - return; - } - - // we need randomness to avoid that the setup data looks identical to the quueried data - if (random) - { - FastRandom r = new FastRandom(); - int pos = r.nextInt(keys.size() + 1); - - keys.add(pos, key.endsWith(";") ? key : key + " "); - values.add(pos, value); - } - else - { - keys.add(key.endsWith(";") ? key : key + " "); - values.add(value); - } - }); - } - - @Benchmark - public String oldParser() { - String lastHit = null; - - for (int i = 0; i < keys.size(); i++) { - HTMLEntitiesParser_Old parser = new HTMLEntitiesParser_Old(); - - // already got a space at the end - String parserInput = keys.get(i); - int x = 0; - while (parser.parse(parserInput.charAt(x))) { - x++; - } - - lastHit = parser.getMatch(); - if (!values.get(i).equals(lastHit)) - { - throw new RuntimeException("Darn"); - } - } - - return lastHit; - } - - @Benchmark - public String newParser1() { - String lastHit = null; - - final Resolver resolver = new HtmlEntities1.Resolver(); - - for (int i = 0; i < keys.size(); i++) { - // already got a space at the end - String parserInput = keys.get(i) + " "; - - resolver.reset(); - - int x = 0; - while (resolver.parse(parserInput.charAt(x))) { - x++; - } - - lastHit = resolver.getResolvedValue(); - if (!values.get(i).equals(lastHit)) - { - throw new RuntimeException("Darn"); - } - } - - return lastHit; - } - - @Benchmark - public String newParser2() { - String lastHit = null; - HtmlEntities2.get(); - - for (int i = 0; i < keys.size(); i++) { - // already got a space at the end - String parserInput = keys.get(i); - - HtmlEntities2.Level result = null; - - for (int x = 0; ; x++) { - HtmlEntities2.Level r = HtmlEntities2.get().lookup(parserInput.charAt(x), result); - if (r.endNode) { - result = r; - break; - } - else if (result == r) { - // no more stuff to match, last one was the last match - break; - } - result = r; - } - - lastHit = result.resolvedValue; - if (!values.get(i).equals(lastHit)) - { - throw new RuntimeException("Darn"); - } - } - - return lastHit; - } - - @Benchmark - public String newParser3() { - String lastHit = null; - HtmlEntities3.get(); - - for (int i = 0; i < keys.size(); i++) { - // already got a space at the end - String parserInput = keys.get(i); - - HtmlEntities3.Level result = null; - - for (int x = 0; ; x++) { - HtmlEntities3.Level r = HtmlEntities3.get().lookup(parserInput.charAt(x), result); - if (r.endNode) { - result = r; - break; - } - else if (result == r) { - // no more stuff to match, last one was the last match - break; - } - result = r; - } - - lastHit = result.resolvedValue; - if (!values.get(i).equals(lastHit)) - { - throw new RuntimeException("Darn"); - } - } - - return lastHit; - } - - @Benchmark - public String newParser4() { - String lastHit = null; - HTMLEntitiesParser.get(); - - for (int i = 0; i < keys.size(); i++) { - // already got a space at the end - String parserInput = keys.get(i); - - HTMLEntitiesParser.Level result = null; - - for (int x = 0; ; x++) { - HTMLEntitiesParser.Level r = HTMLEntitiesParser.get().lookup(parserInput.charAt(x), result); - if (r.endNode) { - result = r; - break; - } - else if (result == r) { - // no more stuff to match, last one was the last match - break; - } - result = r; - } - - lastHit = result.resolvedValue; - if (!values.get(i).equals(lastHit)) - { - throw new RuntimeException("Darn"); - } - } - - return lastHit; - } - - public static void main(String[] args) throws RunnerException - { - Options opt = new OptionsBuilder() - // important, otherwise we will run all tests! - .include(HtmlEntitiesParserBenchmark.class.getSimpleName() + ".newParser3") - // 0 is needed for debugging, not for running - .forks(0) - .build(); - - new Runner(opt).run(); - } -} - diff --git a/benchmark/src/main/java/org/htmlunit/cyberneko/html_entities.properties b/benchmark/src/main/java/org/htmlunit/cyberneko/html_entities.properties deleted file mode 100644 index 63fbee86..00000000 --- a/benchmark/src/main/java/org/htmlunit/cyberneko/html_entities.properties +++ /dev/null @@ -1,2231 +0,0 @@ -AElig=\u00C6 -AElig;=\u00C6 -AMP=\u0026 -AMP;=\u0026 -Aacute=\u00C1 -Aacute;=\u00C1 -Abreve;=\u0102 -Acirc=\u00C2 -Acirc;=\u00C2 -Acy;=\u0410 -Afr;=\uD835\uDD04 -Agrave=\u00C0 -Agrave;=\u00C0 -Alpha;=\u0391 -Amacr;=\u0100 -And;=\u2A53 -Aogon;=\u0104 -Aopf;=\uD835\uDD38 -ApplyFunction;=\u2061 -Aring=\u00C5 -Aring;=\u00C5 -Ascr;=\uD835\uDC9C -Assign;=\u2254 -Atilde=\u00C3 -Atilde;=\u00C3 -Auml=\u00C4 -Auml;=\u00C4 -Backslash;=\u2216 -Barv;=\u2AE7 -Barwed;=\u2306 -Bcy;=\u0411 -Because;=\u2235 -Bernoullis;=\u212C -Beta;=\u0392 -Bfr;=\uD835\uDD05 -Bopf;=\uD835\uDD39 -Breve;=\u02D8 -Bscr;=\u212C -Bumpeq;=\u224E -CHcy;=\u0427 -COPY=\u00A9 -COPY;=\u00A9 -Cacute;=\u0106 -Cap;=\u22D2 -CapitalDifferentialD;=\u2145 -Cayleys;=\u212D -Ccaron;=\u010C -Ccedil=\u00C7 -Ccedil;=\u00C7 -Ccirc;=\u0108 -Cconint;=\u2230 -Cdot;=\u010A -Cedilla;=\u00B8 -CenterDot;=\u00B7 -Cfr;=\u212D -Chi;=\u03A7 -CircleDot;=\u2299 -CircleMinus;=\u2296 -CirclePlus;=\u2295 -CircleTimes;=\u2297 -ClockwiseContourIntegral;=\u2232 -CloseCurlyDoubleQuote;=\u201D -CloseCurlyQuote;=\u2019 -Colon;=\u2237 -Colone;=\u2A74 -Congruent;=\u2261 -Conint;=\u222F -ContourIntegral;=\u222E -Copf;=\u2102 -Coproduct;=\u2210 -CounterClockwiseContourIntegral;=\u2233 -Cross;=\u2A2F -Cscr;=\uD835\uDC9E -Cup;=\u22D3 -CupCap;=\u224D -DD;=\u2145 -DDotrahd;=\u2911 -DJcy;=\u0402 -DScy;=\u0405 -DZcy;=\u040F -Dagger;=\u2021 -Darr;=\u21A1 -Dashv;=\u2AE4 -Dcaron;=\u010E -Dcy;=\u0414 -Del;=\u2207 -Delta;=\u0394 -Dfr;=\uD835\uDD07 -DiacriticalAcute;=\u00B4 -DiacriticalDot;=\u02D9 -DiacriticalDoubleAcute;=\u02DD -DiacriticalGrave;=\u0060 -DiacriticalTilde;=\u02DC -Diamond;=\u22C4 -DifferentialD;=\u2146 -Dopf;=\uD835\uDD3B -Dot;=\u00A8 -DotDot;=\u20DC -DotEqual;=\u2250 -DoubleContourIntegral;=\u222F -DoubleDot;=\u00A8 -DoubleDownArrow;=\u21D3 -DoubleLeftArrow;=\u21D0 -DoubleLeftRightArrow;=\u21D4 -DoubleLeftTee;=\u2AE4 -DoubleLongLeftArrow;=\u27F8 -DoubleLongLeftRightArrow;=\u27FA -DoubleLongRightArrow;=\u27F9 -DoubleRightArrow;=\u21D2 -DoubleRightTee;=\u22A8 -DoubleUpArrow;=\u21D1 -DoubleUpDownArrow;=\u21D5 -DoubleVerticalBar;=\u2225 -DownArrow;=\u2193 -DownArrowBar;=\u2913 -DownArrowUpArrow;=\u21F5 -DownBreve;=\u0311 -DownLeftRightVector;=\u2950 -DownLeftTeeVector;=\u295E -DownLeftVector;=\u21BD -DownLeftVectorBar;=\u2956 -DownRightTeeVector;=\u295F -DownRightVector;=\u21C1 -DownRightVectorBar;=\u2957 -DownTee;=\u22A4 -DownTeeArrow;=\u21A7 -Downarrow;=\u21D3 -Dscr;=\uD835\uDC9F -Dstrok;=\u0110 -ENG;=\u014A -ETH=\u00D0 -ETH;=\u00D0 -Eacute=\u00C9 -Eacute;=\u00C9 -Ecaron;=\u011A -Ecirc=\u00CA -Ecirc;=\u00CA -Ecy;=\u042D -Edot;=\u0116 -Efr;=\uD835\uDD08 -Egrave=\u00C8 -Egrave;=\u00C8 -Element;=\u2208 -Emacr;=\u0112 -EmptySmallSquare;=\u25FB -EmptyVerySmallSquare;=\u25AB -Eogon;=\u0118 -Eopf;=\uD835\uDD3C -Epsilon;=\u0395 -Equal;=\u2A75 -EqualTilde;=\u2242 -Equilibrium;=\u21CC -Escr;=\u2130 -Esim;=\u2A73 -Eta;=\u0397 -Euml=\u00CB -Euml;=\u00CB -Exists;=\u2203 -ExponentialE;=\u2147 -Fcy;=\u0424 -Ffr;=\uD835\uDD09 -FilledSmallSquare;=\u25FC -FilledVerySmallSquare;=\u25AA -Fopf;=\uD835\uDD3D -ForAll;=\u2200 -Fouriertrf;=\u2131 -Fscr;=\u2131 -GJcy;=\u0403 -GT=\u003E -GT;=\u003E -Gamma;=\u0393 -Gammad;=\u03DC -Gbreve;=\u011E -Gcedil;=\u0122 -Gcirc;=\u011C -Gcy;=\u0413 -Gdot;=\u0120 -Gfr;=\uD835\uDD0A -Gg;=\u22D9 -Gopf;=\uD835\uDD3E -GreaterEqual;=\u2265 -GreaterEqualLess;=\u22DB -GreaterFullEqual;=\u2267 -GreaterGreater;=\u2AA2 -GreaterLess;=\u2277 -GreaterSlantEqual;=\u2A7E -GreaterTilde;=\u2273 -Gscr;=\uD835\uDCA2 -Gt;=\u226B -HARDcy;=\u042A -Hacek;=\u02C7 -Hat;=\u005E -Hcirc;=\u0124 -Hfr;=\u210C -HilbertSpace;=\u210B -Hopf;=\u210D -HorizontalLine;=\u2500 -Hscr;=\u210B -Hstrok;=\u0126 -HumpDownHump;=\u224E -HumpEqual;=\u224F -IEcy;=\u0415 -IJlig;=\u0132 -IOcy;=\u0401 -Iacute=\u00CD -Iacute;=\u00CD -Icirc=\u00CE -Icirc;=\u00CE -Icy;=\u0418 -Idot;=\u0130 -Ifr;=\u2111 -Igrave=\u00CC -Igrave;=\u00CC -Im;=\u2111 -Imacr;=\u012A -ImaginaryI;=\u2148 -Implies;=\u21D2 -Int;=\u222C -Integral;=\u222B -Intersection;=\u22C2 -InvisibleComma;=\u2063 -InvisibleTimes;=\u2062 -Iogon;=\u012E -Iopf;=\uD835\uDD40 -Iota;=\u0399 -Iscr;=\u2110 -Itilde;=\u0128 -Iukcy;=\u0406 -Iuml=\u00CF -Iuml;=\u00CF -Jcirc;=\u0134 -Jcy;=\u0419 -Jfr;=\uD835\uDD0D -Jopf;=\uD835\uDD41 -Jscr;=\uD835\uDCA5 -Jsercy;=\u0408 -Jukcy;=\u0404 -KHcy;=\u0425 -KJcy;=\u040C -Kappa;=\u039A -Kcedil;=\u0136 -Kcy;=\u041A -Kfr;=\uD835\uDD0E -Kopf;=\uD835\uDD42 -Kscr;=\uD835\uDCA6 -LJcy;=\u0409 -LT=\u003C -LT;=\u003C -Lacute;=\u0139 -Lambda;=\u039B -Lang;=\u27EA -Laplacetrf;=\u2112 -Larr;=\u219E -Lcaron;=\u013D -Lcedil;=\u013B -Lcy;=\u041B -LeftAngleBracket;=\u27E8 -LeftArrow;=\u2190 -LeftArrowBar;=\u21E4 -LeftArrowRightArrow;=\u21C6 -LeftCeiling;=\u2308 -LeftDoubleBracket;=\u27E6 -LeftDownTeeVector;=\u2961 -LeftDownVector;=\u21C3 -LeftDownVectorBar;=\u2959 -LeftFloor;=\u230A -LeftRightArrow;=\u2194 -LeftRightVector;=\u294E -LeftTee;=\u22A3 -LeftTeeArrow;=\u21A4 -LeftTeeVector;=\u295A -LeftTriangle;=\u22B2 -LeftTriangleBar;=\u29CF -LeftTriangleEqual;=\u22B4 -LeftUpDownVector;=\u2951 -LeftUpTeeVector;=\u2960 -LeftUpVector;=\u21BF -LeftUpVectorBar;=\u2958 -LeftVector;=\u21BC -LeftVectorBar;=\u2952 -Leftarrow;=\u21D0 -Leftrightarrow;=\u21D4 -LessEqualGreater;=\u22DA -LessFullEqual;=\u2266 -LessGreater;=\u2276 -LessLess;=\u2AA1 -LessSlantEqual;=\u2A7D -LessTilde;=\u2272 -Lfr;=\uD835\uDD0F -Ll;=\u22D8 -Lleftarrow;=\u21DA -Lmidot;=\u013F -LongLeftArrow;=\u27F5 -LongLeftRightArrow;=\u27F7 -LongRightArrow;=\u27F6 -Longleftarrow;=\u27F8 -Longleftrightarrow;=\u27FA -Longrightarrow;=\u27F9 -Lopf;=\uD835\uDD43 -LowerLeftArrow;=\u2199 -LowerRightArrow;=\u2198 -Lscr;=\u2112 -Lsh;=\u21B0 -Lstrok;=\u0141 -Lt;=\u226A -Map;=\u2905 -Mcy;=\u041C -MediumSpace;=\u205F -Mellintrf;=\u2133 -Mfr;=\uD835\uDD10 -MinusPlus;=\u2213 -Mopf;=\uD835\uDD44 -Mscr;=\u2133 -Mu;=\u039C -NJcy;=\u040A -Nacute;=\u0143 -Ncaron;=\u0147 -Ncedil;=\u0145 -Ncy;=\u041D -NegativeMediumSpace;=\u200B -NegativeThickSpace;=\u200B -NegativeThinSpace;=\u200B -NegativeVeryThinSpace;=\u200B -NestedGreaterGreater;=\u226B -NestedLessLess;=\u226A -NewLine;=\u000A -Nfr;=\uD835\uDD11 -NoBreak;=\u2060 -NonBreakingSpace;=\u00A0 -Nopf;=\u2115 -Not;=\u2AEC -NotCongruent;=\u2262 -NotCupCap;=\u226D -NotDoubleVerticalBar;=\u2226 -NotElement;=\u2209 -NotEqual;=\u2260 -NotEqualTilde;=\u2242\u0338 -NotExists;=\u2204 -NotGreater;=\u226F -NotGreaterEqual;=\u2271 -NotGreaterFullEqual;=\u2267\u0338 -NotGreaterGreater;=\u226B\u0338 -NotGreaterLess;=\u2279 -NotGreaterSlantEqual;=\u2A7E\u0338 -NotGreaterTilde;=\u2275 -NotHumpDownHump;=\u224E\u0338 -NotHumpEqual;=\u224F\u0338 -NotLeftTriangle;=\u22EA -NotLeftTriangleBar;=\u29CF\u0338 -NotLeftTriangleEqual;=\u22EC -NotLess;=\u226E -NotLessEqual;=\u2270 -NotLessGreater;=\u2278 -NotLessLess;=\u226A\u0338 -NotLessSlantEqual;=\u2A7D\u0338 -NotLessTilde;=\u2274 -NotNestedGreaterGreater;=\u2AA2\u0338 -NotNestedLessLess;=\u2AA1\u0338 -NotPrecedes;=\u2280 -NotPrecedesEqual;=\u2AAF\u0338 -NotPrecedesSlantEqual;=\u22E0 -NotReverseElement;=\u220C -NotRightTriangle;=\u22EB -NotRightTriangleBar;=\u29D0\u0338 -NotRightTriangleEqual;=\u22ED -NotSquareSubset;=\u228F\u0338 -NotSquareSubsetEqual;=\u22E2 -NotSquareSuperset;=\u2290\u0338 -NotSquareSupersetEqual;=\u22E3 -NotSubset;=\u2282\u20D2 -NotSubsetEqual;=\u2288 -NotSucceeds;=\u2281 -NotSucceedsEqual;=\u2AB0\u0338 -NotSucceedsSlantEqual;=\u22E1 -NotSucceedsTilde;=\u227F\u0338 -NotSuperset;=\u2283\u20D2 -NotSupersetEqual;=\u2289 -NotTilde;=\u2241 -NotTildeEqual;=\u2244 -NotTildeFullEqual;=\u2247 -NotTildeTilde;=\u2249 -NotVerticalBar;=\u2224 -Nscr;=\uD835\uDCA9 -Ntilde=\u00D1 -Ntilde;=\u00D1 -Nu;=\u039D -OElig;=\u0152 -Oacute=\u00D3 -Oacute;=\u00D3 -Ocirc=\u00D4 -Ocirc;=\u00D4 -Ocy;=\u041E -Odblac;=\u0150 -Ofr;=\uD835\uDD12 -Ograve=\u00D2 -Ograve;=\u00D2 -Omacr;=\u014C -Omega;=\u03A9 -Omicron;=\u039F -Oopf;=\uD835\uDD46 -OpenCurlyDoubleQuote;=\u201C -OpenCurlyQuote;=\u2018 -Or;=\u2A54 -Oscr;=\uD835\uDCAA -Oslash=\u00D8 -Oslash;=\u00D8 -Otilde=\u00D5 -Otilde;=\u00D5 -Otimes;=\u2A37 -Ouml=\u00D6 -Ouml;=\u00D6 -OverBar;=\u203E -OverBrace;=\u23DE -OverBracket;=\u23B4 -OverParenthesis;=\u23DC -PartialD;=\u2202 -Pcy;=\u041F -Pfr;=\uD835\uDD13 -Phi;=\u03A6 -Pi;=\u03A0 -PlusMinus;=\u00B1 -Poincareplane;=\u210C -Popf;=\u2119 -Pr;=\u2ABB -Precedes;=\u227A -PrecedesEqual;=\u2AAF -PrecedesSlantEqual;=\u227C -PrecedesTilde;=\u227E -Prime;=\u2033 -Product;=\u220F -Proportion;=\u2237 -Proportional;=\u221D -Pscr;=\uD835\uDCAB -Psi;=\u03A8 -QUOT=\u0022 -QUOT;=\u0022 -Qfr;=\uD835\uDD14 -Qopf;=\u211A -Qscr;=\uD835\uDCAC -RBarr;=\u2910 -REG=\u00AE -REG;=\u00AE -Racute;=\u0154 -Rang;=\u27EB -Rarr;=\u21A0 -Rarrtl;=\u2916 -Rcaron;=\u0158 -Rcedil;=\u0156 -Rcy;=\u0420 -Re;=\u211C -ReverseElement;=\u220B -ReverseEquilibrium;=\u21CB -ReverseUpEquilibrium;=\u296F -Rfr;=\u211C -Rho;=\u03A1 -RightAngleBracket;=\u27E9 -RightArrow;=\u2192 -RightArrowBar;=\u21E5 -RightArrowLeftArrow;=\u21C4 -RightCeiling;=\u2309 -RightDoubleBracket;=\u27E7 -RightDownTeeVector;=\u295D -RightDownVector;=\u21C2 -RightDownVectorBar;=\u2955 -RightFloor;=\u230B -RightTee;=\u22A2 -RightTeeArrow;=\u21A6 -RightTeeVector;=\u295B -RightTriangle;=\u22B3 -RightTriangleBar;=\u29D0 -RightTriangleEqual;=\u22B5 -RightUpDownVector;=\u294F -RightUpTeeVector;=\u295C -RightUpVector;=\u21BE -RightUpVectorBar;=\u2954 -RightVector;=\u21C0 -RightVectorBar;=\u2953 -Rightarrow;=\u21D2 -Ropf;=\u211D -RoundImplies;=\u2970 -Rrightarrow;=\u21DB -Rscr;=\u211B -Rsh;=\u21B1 -RuleDelayed;=\u29F4 -SHCHcy;=\u0429 -SHcy;=\u0428 -SOFTcy;=\u042C -Sacute;=\u015A -Sc;=\u2ABC -Scaron;=\u0160 -Scedil;=\u015E -Scirc;=\u015C -Scy;=\u0421 -Sfr;=\uD835\uDD16 -ShortDownArrow;=\u2193 -ShortLeftArrow;=\u2190 -ShortRightArrow;=\u2192 -ShortUpArrow;=\u2191 -Sigma;=\u03A3 -SmallCircle;=\u2218 -Sopf;=\uD835\uDD4A -Sqrt;=\u221A -Square;=\u25A1 -SquareIntersection;=\u2293 -SquareSubset;=\u228F -SquareSubsetEqual;=\u2291 -SquareSuperset;=\u2290 -SquareSupersetEqual;=\u2292 -SquareUnion;=\u2294 -Sscr;=\uD835\uDCAE -Star;=\u22C6 -Sub;=\u22D0 -Subset;=\u22D0 -SubsetEqual;=\u2286 -Succeeds;=\u227B -SucceedsEqual;=\u2AB0 -SucceedsSlantEqual;=\u227D -SucceedsTilde;=\u227F -SuchThat;=\u220B -Sum;=\u2211 -Sup;=\u22D1 -Superset;=\u2283 -SupersetEqual;=\u2287 -Supset;=\u22D1 -THORN=\u00DE -THORN;=\u00DE -TRADE;=\u2122 -TSHcy;=\u040B -TScy;=\u0426 -Tab;=\u0009 -Tau;=\u03A4 -Tcaron;=\u0164 -Tcedil;=\u0162 -Tcy;=\u0422 -Tfr;=\uD835\uDD17 -Therefore;=\u2234 -Theta;=\u0398 -ThickSpace;=\u205F\u200A -ThinSpace;=\u2009 -Tilde;=\u223C -TildeEqual;=\u2243 -TildeFullEqual;=\u2245 -TildeTilde;=\u2248 -Topf;=\uD835\uDD4B -TripleDot;=\u20DB -Tscr;=\uD835\uDCAF -Tstrok;=\u0166 -Uacute=\u00DA -Uacute;=\u00DA -Uarr;=\u219F -Uarrocir;=\u2949 -Ubrcy;=\u040E -Ubreve;=\u016C -Ucirc=\u00DB -Ucirc;=\u00DB -Ucy;=\u0423 -Udblac;=\u0170 -Ufr;=\uD835\uDD18 -Ugrave=\u00D9 -Ugrave;=\u00D9 -Umacr;=\u016A -UnderBar;=\u005F -UnderBrace;=\u23DF -UnderBracket;=\u23B5 -UnderParenthesis;=\u23DD -Union;=\u22C3 -UnionPlus;=\u228E -Uogon;=\u0172 -Uopf;=\uD835\uDD4C -UpArrow;=\u2191 -UpArrowBar;=\u2912 -UpArrowDownArrow;=\u21C5 -UpDownArrow;=\u2195 -UpEquilibrium;=\u296E -UpTee;=\u22A5 -UpTeeArrow;=\u21A5 -Uparrow;=\u21D1 -Updownarrow;=\u21D5 -UpperLeftArrow;=\u2196 -UpperRightArrow;=\u2197 -Upsi;=\u03D2 -Upsilon;=\u03A5 -Uring;=\u016E -Uscr;=\uD835\uDCB0 -Utilde;=\u0168 -Uuml=\u00DC -Uuml;=\u00DC -VDash;=\u22AB -Vbar;=\u2AEB -Vcy;=\u0412 -Vdash;=\u22A9 -Vdashl;=\u2AE6 -Vee;=\u22C1 -Verbar;=\u2016 -Vert;=\u2016 -VerticalBar;=\u2223 -VerticalLine;=\u007C -VerticalSeparator;=\u2758 -VerticalTilde;=\u2240 -VeryThinSpace;=\u200A -Vfr;=\uD835\uDD19 -Vopf;=\uD835\uDD4D -Vscr;=\uD835\uDCB1 -Vvdash;=\u22AA -Wcirc;=\u0174 -Wedge;=\u22C0 -Wfr;=\uD835\uDD1A -Wopf;=\uD835\uDD4E -Wscr;=\uD835\uDCB2 -Xfr;=\uD835\uDD1B -Xi;=\u039E -Xopf;=\uD835\uDD4F -Xscr;=\uD835\uDCB3 -YAcy;=\u042F -YIcy;=\u0407 -YUcy;=\u042E -Yacute=\u00DD -Yacute;=\u00DD -Ycirc;=\u0176 -Ycy;=\u042B -Yfr;=\uD835\uDD1C -Yopf;=\uD835\uDD50 -Yscr;=\uD835\uDCB4 -Yuml;=\u0178 -ZHcy;=\u0416 -Zacute;=\u0179 -Zcaron;=\u017D -Zcy;=\u0417 -Zdot;=\u017B -ZeroWidthSpace;=\u200B -Zeta;=\u0396 -Zfr;=\u2128 -Zopf;=\u2124 -Zscr;=\uD835\uDCB5 -aacute=\u00E1 -aacute;=\u00E1 -abreve;=\u0103 -ac;=\u223E -acE;=\u223E\u0333 -acd;=\u223F -acirc=\u00E2 -acirc;=\u00E2 -acute=\u00B4 -acute;=\u00B4 -acy;=\u0430 -aelig=\u00E6 -aelig;=\u00E6 -af;=\u2061 -afr;=\uD835\uDD1E -agrave=\u00E0 -agrave;=\u00E0 -alefsym;=\u2135 -aleph;=\u2135 -alpha;=\u03B1 -amacr;=\u0101 -amalg;=\u2A3F -amp=\u0026 -amp;=\u0026 -and;=\u2227 -andand;=\u2A55 -andd;=\u2A5C -andslope;=\u2A58 -andv;=\u2A5A -ang;=\u2220 -ange;=\u29A4 -angle;=\u2220 -angmsd;=\u2221 -angmsdaa;=\u29A8 -angmsdab;=\u29A9 -angmsdac;=\u29AA -angmsdad;=\u29AB -angmsdae;=\u29AC -angmsdaf;=\u29AD -angmsdag;=\u29AE -angmsdah;=\u29AF -angrt;=\u221F -angrtvb;=\u22BE -angrtvbd;=\u299D -angsph;=\u2222 -angst;=\u00C5 -angzarr;=\u237C -aogon;=\u0105 -aopf;=\uD835\uDD52 -ap;=\u2248 -apE;=\u2A70 -apacir;=\u2A6F -ape;=\u224A -apid;=\u224B -apos;=\u0027 -approx;=\u2248 -approxeq;=\u224A -aring=\u00E5 -aring;=\u00E5 -ascr;=\uD835\uDCB6 -ast;=\u002A -asymp;=\u2248 -asympeq;=\u224D -atilde=\u00E3 -atilde;=\u00E3 -auml=\u00E4 -auml;=\u00E4 -awconint;=\u2233 -awint;=\u2A11 -bNot;=\u2AED -backcong;=\u224C -backepsilon;=\u03F6 -backprime;=\u2035 -backsim;=\u223D -backsimeq;=\u22CD -barvee;=\u22BD -barwed;=\u2305 -barwedge;=\u2305 -bbrk;=\u23B5 -bbrktbrk;=\u23B6 -bcong;=\u224C -bcy;=\u0431 -bdquo;=\u201E -becaus;=\u2235 -because;=\u2235 -bemptyv;=\u29B0 -bepsi;=\u03F6 -bernou;=\u212C -beta;=\u03B2 -beth;=\u2136 -between;=\u226C -bfr;=\uD835\uDD1F -bigcap;=\u22C2 -bigcirc;=\u25EF -bigcup;=\u22C3 -bigodot;=\u2A00 -bigoplus;=\u2A01 -bigotimes;=\u2A02 -bigsqcup;=\u2A06 -bigstar;=\u2605 -bigtriangledown;=\u25BD -bigtriangleup;=\u25B3 -biguplus;=\u2A04 -bigvee;=\u22C1 -bigwedge;=\u22C0 -bkarow;=\u290D -blacklozenge;=\u29EB -blacksquare;=\u25AA -blacktriangle;=\u25B4 -blacktriangledown;=\u25BE -blacktriangleleft;=\u25C2 -blacktriangleright;=\u25B8 -blank;=\u2423 -blk12;=\u2592 -blk14;=\u2591 -blk34;=\u2593 -block;=\u2588 -bne;=\u003D\u20E5 -bnequiv;=\u2261\u20E5 -bnot;=\u2310 -bopf;=\uD835\uDD53 -bot;=\u22A5 -bottom;=\u22A5 -bowtie;=\u22C8 -boxDL;=\u2557 -boxDR;=\u2554 -boxDl;=\u2556 -boxDr;=\u2553 -boxH;=\u2550 -boxHD;=\u2566 -boxHU;=\u2569 -boxHd;=\u2564 -boxHu;=\u2567 -boxUL;=\u255D -boxUR;=\u255A -boxUl;=\u255C -boxUr;=\u2559 -boxV;=\u2551 -boxVH;=\u256C -boxVL;=\u2563 -boxVR;=\u2560 -boxVh;=\u256B -boxVl;=\u2562 -boxVr;=\u255F -boxbox;=\u29C9 -boxdL;=\u2555 -boxdR;=\u2552 -boxdl;=\u2510 -boxdr;=\u250C -boxh;=\u2500 -boxhD;=\u2565 -boxhU;=\u2568 -boxhd;=\u252C -boxhu;=\u2534 -boxminus;=\u229F -boxplus;=\u229E -boxtimes;=\u22A0 -boxuL;=\u255B -boxuR;=\u2558 -boxul;=\u2518 -boxur;=\u2514 -boxv;=\u2502 -boxvH;=\u256A -boxvL;=\u2561 -boxvR;=\u255E -boxvh;=\u253C -boxvl;=\u2524 -boxvr;=\u251C -bprime;=\u2035 -breve;=\u02D8 -brvbar=\u00A6 -brvbar;=\u00A6 -bscr;=\uD835\uDCB7 -bsemi;=\u204F -bsim;=\u223D -bsime;=\u22CD -bsol;=\u005C -bsolb;=\u29C5 -bsolhsub;=\u27C8 -bull;=\u2022 -bullet;=\u2022 -bump;=\u224E -bumpE;=\u2AAE -bumpe;=\u224F -bumpeq;=\u224F -cacute;=\u0107 -cap;=\u2229 -capand;=\u2A44 -capbrcup;=\u2A49 -capcap;=\u2A4B -capcup;=\u2A47 -capdot;=\u2A40 -caps;=\u2229\uFE00 -caret;=\u2041 -caron;=\u02C7 -ccaps;=\u2A4D -ccaron;=\u010D -ccedil=\u00E7 -ccedil;=\u00E7 -ccirc;=\u0109 -ccups;=\u2A4C -ccupssm;=\u2A50 -cdot;=\u010B -cedil=\u00B8 -cedil;=\u00B8 -cemptyv;=\u29B2 -cent=\u00A2 -cent;=\u00A2 -centerdot;=\u00B7 -cfr;=\uD835\uDD20 -chcy;=\u0447 -check;=\u2713 -checkmark;=\u2713 -chi;=\u03C7 -cir;=\u25CB -cirE;=\u29C3 -circ;=\u02C6 -circeq;=\u2257 -circlearrowleft;=\u21BA -circlearrowright;=\u21BB -circledR;=\u00AE -circledS;=\u24C8 -circledast;=\u229B -circledcirc;=\u229A -circleddash;=\u229D -cire;=\u2257 -cirfnint;=\u2A10 -cirmid;=\u2AEF -cirscir;=\u29C2 -clubs;=\u2663 -clubsuit;=\u2663 -colon;=\u003A -colone;=\u2254 -coloneq;=\u2254 -comma;=\u002C -commat;=\u0040 -comp;=\u2201 -compfn;=\u2218 -complement;=\u2201 -complexes;=\u2102 -cong;=\u2245 -congdot;=\u2A6D -conint;=\u222E -copf;=\uD835\uDD54 -coprod;=\u2210 -copy=\u00A9 -copy;=\u00A9 -copysr;=\u2117 -crarr;=\u21B5 -cross;=\u2717 -cscr;=\uD835\uDCB8 -csub;=\u2ACF -csube;=\u2AD1 -csup;=\u2AD0 -csupe;=\u2AD2 -ctdot;=\u22EF -cudarrl;=\u2938 -cudarrr;=\u2935 -cuepr;=\u22DE -cuesc;=\u22DF -cularr;=\u21B6 -cularrp;=\u293D -cup;=\u222A -cupbrcap;=\u2A48 -cupcap;=\u2A46 -cupcup;=\u2A4A -cupdot;=\u228D -cupor;=\u2A45 -cups;=\u222A\uFE00 -curarr;=\u21B7 -curarrm;=\u293C -curlyeqprec;=\u22DE -curlyeqsucc;=\u22DF -curlyvee;=\u22CE -curlywedge;=\u22CF -curren=\u00A4 -curren;=\u00A4 -curvearrowleft;=\u21B6 -curvearrowright;=\u21B7 -cuvee;=\u22CE -cuwed;=\u22CF -cwconint;=\u2232 -cwint;=\u2231 -cylcty;=\u232D -dArr;=\u21D3 -dHar;=\u2965 -dagger;=\u2020 -daleth;=\u2138 -darr;=\u2193 -dash;=\u2010 -dashv;=\u22A3 -dbkarow;=\u290F -dblac;=\u02DD -dcaron;=\u010F -dcy;=\u0434 -dd;=\u2146 -ddagger;=\u2021 -ddarr;=\u21CA -ddotseq;=\u2A77 -deg=\u00B0 -deg;=\u00B0 -delta;=\u03B4 -demptyv;=\u29B1 -dfisht;=\u297F -dfr;=\uD835\uDD21 -dharl;=\u21C3 -dharr;=\u21C2 -diam;=\u22C4 -diamond;=\u22C4 -diamondsuit;=\u2666 -diams;=\u2666 -die;=\u00A8 -digamma;=\u03DD -disin;=\u22F2 -div;=\u00F7 -divide=\u00F7 -divide;=\u00F7 -divideontimes;=\u22C7 -divonx;=\u22C7 -djcy;=\u0452 -dlcorn;=\u231E -dlcrop;=\u230D -dollar;=\u0024 -dopf;=\uD835\uDD55 -dot;=\u02D9 -doteq;=\u2250 -doteqdot;=\u2251 -dotminus;=\u2238 -dotplus;=\u2214 -dotsquare;=\u22A1 -doublebarwedge;=\u2306 -downarrow;=\u2193 -downdownarrows;=\u21CA -downharpoonleft;=\u21C3 -downharpoonright;=\u21C2 -drbkarow;=\u2910 -drcorn;=\u231F -drcrop;=\u230C -dscr;=\uD835\uDCB9 -dscy;=\u0455 -dsol;=\u29F6 -dstrok;=\u0111 -dtdot;=\u22F1 -dtri;=\u25BF -dtrif;=\u25BE -duarr;=\u21F5 -duhar;=\u296F -dwangle;=\u29A6 -dzcy;=\u045F -dzigrarr;=\u27FF -eDDot;=\u2A77 -eDot;=\u2251 -eacute=\u00E9 -eacute;=\u00E9 -easter;=\u2A6E -ecaron;=\u011B -ecir;=\u2256 -ecirc=\u00EA -ecirc;=\u00EA -ecolon;=\u2255 -ecy;=\u044D -edot;=\u0117 -ee;=\u2147 -efDot;=\u2252 -efr;=\uD835\uDD22 -eg;=\u2A9A -egrave=\u00E8 -egrave;=\u00E8 -egs;=\u2A96 -egsdot;=\u2A98 -el;=\u2A99 -elinters;=\u23E7 -ell;=\u2113 -els;=\u2A95 -elsdot;=\u2A97 -emacr;=\u0113 -empty;=\u2205 -emptyset;=\u2205 -emptyv;=\u2205 -emsp13;=\u2004 -emsp14;=\u2005 -emsp;=\u2003 -eng;=\u014B -ensp;=\u2002 -eogon;=\u0119 -eopf;=\uD835\uDD56 -epar;=\u22D5 -eparsl;=\u29E3 -eplus;=\u2A71 -epsi;=\u03B5 -epsilon;=\u03B5 -epsiv;=\u03F5 -eqcirc;=\u2256 -eqcolon;=\u2255 -eqsim;=\u2242 -eqslantgtr;=\u2A96 -eqslantless;=\u2A95 -equals;=\u003D -equest;=\u225F -equiv;=\u2261 -equivDD;=\u2A78 -eqvparsl;=\u29E5 -erDot;=\u2253 -erarr;=\u2971 -escr;=\u212F -esdot;=\u2250 -esim;=\u2242 -eta;=\u03B7 -eth=\u00F0 -eth;=\u00F0 -euml=\u00EB -euml;=\u00EB -euro;=\u20AC -excl;=\u0021 -exist;=\u2203 -expectation;=\u2130 -exponentiale;=\u2147 -fallingdotseq;=\u2252 -fcy;=\u0444 -female;=\u2640 -ffilig;=\uFB03 -fflig;=\uFB00 -ffllig;=\uFB04 -ffr;=\uD835\uDD23 -filig;=\uFB01 -fjlig;=\u0066\u006A -flat;=\u266D -fllig;=\uFB02 -fltns;=\u25B1 -fnof;=\u0192 -fopf;=\uD835\uDD57 -forall;=\u2200 -fork;=\u22D4 -forkv;=\u2AD9 -fpartint;=\u2A0D -frac12=\u00BD -frac12;=\u00BD -frac13;=\u2153 -frac14=\u00BC -frac14;=\u00BC -frac15;=\u2155 -frac16;=\u2159 -frac18;=\u215B -frac23;=\u2154 -frac25;=\u2156 -frac34=\u00BE -frac34;=\u00BE -frac35;=\u2157 -frac38;=\u215C -frac45;=\u2158 -frac56;=\u215A -frac58;=\u215D -frac78;=\u215E -frasl;=\u2044 -frown;=\u2322 -fscr;=\uD835\uDCBB -gE;=\u2267 -gEl;=\u2A8C -gacute;=\u01F5 -gamma;=\u03B3 -gammad;=\u03DD -gap;=\u2A86 -gbreve;=\u011F -gcirc;=\u011D -gcy;=\u0433 -gdot;=\u0121 -ge;=\u2265 -gel;=\u22DB -geq;=\u2265 -geqq;=\u2267 -geqslant;=\u2A7E -ges;=\u2A7E -gescc;=\u2AA9 -gesdot;=\u2A80 -gesdoto;=\u2A82 -gesdotol;=\u2A84 -gesl;=\u22DB\uFE00 -gesles;=\u2A94 -gfr;=\uD835\uDD24 -gg;=\u226B -ggg;=\u22D9 -gimel;=\u2137 -gjcy;=\u0453 -gl;=\u2277 -glE;=\u2A92 -gla;=\u2AA5 -glj;=\u2AA4 -gnE;=\u2269 -gnap;=\u2A8A -gnapprox;=\u2A8A -gne;=\u2A88 -gneq;=\u2A88 -gneqq;=\u2269 -gnsim;=\u22E7 -gopf;=\uD835\uDD58 -grave;=\u0060 -gscr;=\u210A -gsim;=\u2273 -gsime;=\u2A8E -gsiml;=\u2A90 -gt=\u003E -gt;=\u003E -gtcc;=\u2AA7 -gtcir;=\u2A7A -gtdot;=\u22D7 -gtlPar;=\u2995 -gtquest;=\u2A7C -gtrapprox;=\u2A86 -gtrarr;=\u2978 -gtrdot;=\u22D7 -gtreqless;=\u22DB -gtreqqless;=\u2A8C -gtrless;=\u2277 -gtrsim;=\u2273 -gvertneqq;=\u2269\uFE00 -gvnE;=\u2269\uFE00 -hArr;=\u21D4 -hairsp;=\u200A -half;=\u00BD -hamilt;=\u210B -hardcy;=\u044A -harr;=\u2194 -harrcir;=\u2948 -harrw;=\u21AD -hbar;=\u210F -hcirc;=\u0125 -hearts;=\u2665 -heartsuit;=\u2665 -hellip;=\u2026 -hercon;=\u22B9 -hfr;=\uD835\uDD25 -hksearow;=\u2925 -hkswarow;=\u2926 -hoarr;=\u21FF -homtht;=\u223B -hookleftarrow;=\u21A9 -hookrightarrow;=\u21AA -hopf;=\uD835\uDD59 -horbar;=\u2015 -hscr;=\uD835\uDCBD -hslash;=\u210F -hstrok;=\u0127 -hybull;=\u2043 -hyphen;=\u2010 -iacute=\u00ED -iacute;=\u00ED -ic;=\u2063 -icirc=\u00EE -icirc;=\u00EE -icy;=\u0438 -iecy;=\u0435 -iexcl=\u00A1 -iexcl;=\u00A1 -iff;=\u21D4 -ifr;=\uD835\uDD26 -igrave=\u00EC -igrave;=\u00EC -ii;=\u2148 -iiiint;=\u2A0C -iiint;=\u222D -iinfin;=\u29DC -iiota;=\u2129 -ijlig;=\u0133 -imacr;=\u012B -image;=\u2111 -imagline;=\u2110 -imagpart;=\u2111 -imath;=\u0131 -imof;=\u22B7 -imped;=\u01B5 -in;=\u2208 -incare;=\u2105 -infin;=\u221E -infintie;=\u29DD -inodot;=\u0131 -int;=\u222B -intcal;=\u22BA -integers;=\u2124 -intercal;=\u22BA -intlarhk;=\u2A17 -intprod;=\u2A3C -iocy;=\u0451 -iogon;=\u012F -iopf;=\uD835\uDD5A -iota;=\u03B9 -iprod;=\u2A3C -iquest=\u00BF -iquest;=\u00BF -iscr;=\uD835\uDCBE -isin;=\u2208 -isinE;=\u22F9 -isindot;=\u22F5 -isins;=\u22F4 -isinsv;=\u22F3 -isinv;=\u2208 -it;=\u2062 -itilde;=\u0129 -iukcy;=\u0456 -iuml=\u00EF -iuml;=\u00EF -jcirc;=\u0135 -jcy;=\u0439 -jfr;=\uD835\uDD27 -jmath;=\u0237 -jopf;=\uD835\uDD5B -jscr;=\uD835\uDCBF -jsercy;=\u0458 -jukcy;=\u0454 -kappa;=\u03BA -kappav;=\u03F0 -kcedil;=\u0137 -kcy;=\u043A -kfr;=\uD835\uDD28 -kgreen;=\u0138 -khcy;=\u0445 -kjcy;=\u045C -kopf;=\uD835\uDD5C -kscr;=\uD835\uDCC0 -lAarr;=\u21DA -lArr;=\u21D0 -lAtail;=\u291B -lBarr;=\u290E -lE;=\u2266 -lEg;=\u2A8B -lHar;=\u2962 -lacute;=\u013A -laemptyv;=\u29B4 -lagran;=\u2112 -lambda;=\u03BB -lang;=\u27E8 -langd;=\u2991 -langle;=\u27E8 -lap;=\u2A85 -laquo=\u00AB -laquo;=\u00AB -larr;=\u2190 -larrb;=\u21E4 -larrbfs;=\u291F -larrfs;=\u291D -larrhk;=\u21A9 -larrlp;=\u21AB -larrpl;=\u2939 -larrsim;=\u2973 -larrtl;=\u21A2 -lat;=\u2AAB -latail;=\u2919 -late;=\u2AAD -lates;=\u2AAD\uFE00 -lbarr;=\u290C -lbbrk;=\u2772 -lbrace;=\u007B -lbrack;=\u005B -lbrke;=\u298B -lbrksld;=\u298F -lbrkslu;=\u298D -lcaron;=\u013E -lcedil;=\u013C -lceil;=\u2308 -lcub;=\u007B -lcy;=\u043B -ldca;=\u2936 -ldquo;=\u201C -ldquor;=\u201E -ldrdhar;=\u2967 -ldrushar;=\u294B -ldsh;=\u21B2 -le;=\u2264 -leftarrow;=\u2190 -leftarrowtail;=\u21A2 -leftharpoondown;=\u21BD -leftharpoonup;=\u21BC -leftleftarrows;=\u21C7 -leftrightarrow;=\u2194 -leftrightarrows;=\u21C6 -leftrightharpoons;=\u21CB -leftrightsquigarrow;=\u21AD -leftthreetimes;=\u22CB -leg;=\u22DA -leq;=\u2264 -leqq;=\u2266 -leqslant;=\u2A7D -les;=\u2A7D -lescc;=\u2AA8 -lesdot;=\u2A7F -lesdoto;=\u2A81 -lesdotor;=\u2A83 -lesg;=\u22DA\uFE00 -lesges;=\u2A93 -lessapprox;=\u2A85 -lessdot;=\u22D6 -lesseqgtr;=\u22DA -lesseqqgtr;=\u2A8B -lessgtr;=\u2276 -lesssim;=\u2272 -lfisht;=\u297C -lfloor;=\u230A -lfr;=\uD835\uDD29 -lg;=\u2276 -lgE;=\u2A91 -lhard;=\u21BD -lharu;=\u21BC -lharul;=\u296A -lhblk;=\u2584 -ljcy;=\u0459 -ll;=\u226A -llarr;=\u21C7 -llcorner;=\u231E -llhard;=\u296B -lltri;=\u25FA -lmidot;=\u0140 -lmoust;=\u23B0 -lmoustache;=\u23B0 -lnE;=\u2268 -lnap;=\u2A89 -lnapprox;=\u2A89 -lne;=\u2A87 -lneq;=\u2A87 -lneqq;=\u2268 -lnsim;=\u22E6 -loang;=\u27EC -loarr;=\u21FD -lobrk;=\u27E6 -longleftarrow;=\u27F5 -longleftrightarrow;=\u27F7 -longmapsto;=\u27FC -longrightarrow;=\u27F6 -looparrowleft;=\u21AB -looparrowright;=\u21AC -lopar;=\u2985 -lopf;=\uD835\uDD5D -loplus;=\u2A2D -lotimes;=\u2A34 -lowast;=\u2217 -lowbar;=\u005F -loz;=\u25CA -lozenge;=\u25CA -lozf;=\u29EB -lpar;=\u0028 -lparlt;=\u2993 -lrarr;=\u21C6 -lrcorner;=\u231F -lrhar;=\u21CB -lrhard;=\u296D -lrm;=\u200E -lrtri;=\u22BF -lsaquo;=\u2039 -lscr;=\uD835\uDCC1 -lsh;=\u21B0 -lsim;=\u2272 -lsime;=\u2A8D -lsimg;=\u2A8F -lsqb;=\u005B -lsquo;=\u2018 -lsquor;=\u201A -lstrok;=\u0142 -lt=\u003C -lt;=\u003C -ltcc;=\u2AA6 -ltcir;=\u2A79 -ltdot;=\u22D6 -lthree;=\u22CB -ltimes;=\u22C9 -ltlarr;=\u2976 -ltquest;=\u2A7B -ltrPar;=\u2996 -ltri;=\u25C3 -ltrie;=\u22B4 -ltrif;=\u25C2 -lurdshar;=\u294A -luruhar;=\u2966 -lvertneqq;=\u2268\uFE00 -lvnE;=\u2268\uFE00 -mDDot;=\u223A -macr=\u00AF -macr;=\u00AF -male;=\u2642 -malt;=\u2720 -maltese;=\u2720 -map;=\u21A6 -mapsto;=\u21A6 -mapstodown;=\u21A7 -mapstoleft;=\u21A4 -mapstoup;=\u21A5 -marker;=\u25AE -mcomma;=\u2A29 -mcy;=\u043C -mdash;=\u2014 -measuredangle;=\u2221 -mfr;=\uD835\uDD2A -mho;=\u2127 -micro=\u00B5 -micro;=\u00B5 -mid;=\u2223 -midast;=\u002A -midcir;=\u2AF0 -middot=\u00B7 -middot;=\u00B7 -minus;=\u2212 -minusb;=\u229F -minusd;=\u2238 -minusdu;=\u2A2A -mlcp;=\u2ADB -mldr;=\u2026 -mnplus;=\u2213 -models;=\u22A7 -mopf;=\uD835\uDD5E -mp;=\u2213 -mscr;=\uD835\uDCC2 -mstpos;=\u223E -mu;=\u03BC -multimap;=\u22B8 -mumap;=\u22B8 -nGg;=\u22D9\u0338 -nGt;=\u226B\u20D2 -nGtv;=\u226B\u0338 -nLeftarrow;=\u21CD -nLeftrightarrow;=\u21CE -nLl;=\u22D8\u0338 -nLt;=\u226A\u20D2 -nLtv;=\u226A\u0338 -nRightarrow;=\u21CF -nVDash;=\u22AF -nVdash;=\u22AE -nabla;=\u2207 -nacute;=\u0144 -nang;=\u2220\u20D2 -nap;=\u2249 -napE;=\u2A70\u0338 -napid;=\u224B\u0338 -napos;=\u0149 -napprox;=\u2249 -natur;=\u266E -natural;=\u266E -naturals;=\u2115 -nbsp=\u00A0 -nbsp;=\u00A0 -nbump;=\u224E\u0338 -nbumpe;=\u224F\u0338 -ncap;=\u2A43 -ncaron;=\u0148 -ncedil;=\u0146 -ncong;=\u2247 -ncongdot;=\u2A6D\u0338 -ncup;=\u2A42 -ncy;=\u043D -ndash;=\u2013 -ne;=\u2260 -neArr;=\u21D7 -nearhk;=\u2924 -nearr;=\u2197 -nearrow;=\u2197 -nedot;=\u2250\u0338 -nequiv;=\u2262 -nesear;=\u2928 -nesim;=\u2242\u0338 -nexist;=\u2204 -nexists;=\u2204 -nfr;=\uD835\uDD2B -ngE;=\u2267\u0338 -nge;=\u2271 -ngeq;=\u2271 -ngeqq;=\u2267\u0338 -ngeqslant;=\u2A7E\u0338 -nges;=\u2A7E\u0338 -ngsim;=\u2275 -ngt;=\u226F -ngtr;=\u226F -nhArr;=\u21CE -nharr;=\u21AE -nhpar;=\u2AF2 -ni;=\u220B -nis;=\u22FC -nisd;=\u22FA -niv;=\u220B -njcy;=\u045A -nlArr;=\u21CD -nlE;=\u2266\u0338 -nlarr;=\u219A -nldr;=\u2025 -nle;=\u2270 -nleftarrow;=\u219A -nleftrightarrow;=\u21AE -nleq;=\u2270 -nleqq;=\u2266\u0338 -nleqslant;=\u2A7D\u0338 -nles;=\u2A7D\u0338 -nless;=\u226E -nlsim;=\u2274 -nlt;=\u226E -nltri;=\u22EA -nltrie;=\u22EC -nmid;=\u2224 -nopf;=\uD835\uDD5F -not=\u00AC -not;=\u00AC -notin;=\u2209 -notinE;=\u22F9\u0338 -notindot;=\u22F5\u0338 -notinva;=\u2209 -notinvb;=\u22F7 -notinvc;=\u22F6 -notni;=\u220C -notniva;=\u220C -notnivb;=\u22FE -notnivc;=\u22FD -npar;=\u2226 -nparallel;=\u2226 -nparsl;=\u2AFD\u20E5 -npart;=\u2202\u0338 -npolint;=\u2A14 -npr;=\u2280 -nprcue;=\u22E0 -npre;=\u2AAF\u0338 -nprec;=\u2280 -npreceq;=\u2AAF\u0338 -nrArr;=\u21CF -nrarr;=\u219B -nrarrc;=\u2933\u0338 -nrarrw;=\u219D\u0338 -nrightarrow;=\u219B -nrtri;=\u22EB -nrtrie;=\u22ED -nsc;=\u2281 -nsccue;=\u22E1 -nsce;=\u2AB0\u0338 -nscr;=\uD835\uDCC3 -nshortmid;=\u2224 -nshortparallel;=\u2226 -nsim;=\u2241 -nsime;=\u2244 -nsimeq;=\u2244 -nsmid;=\u2224 -nspar;=\u2226 -nsqsube;=\u22E2 -nsqsupe;=\u22E3 -nsub;=\u2284 -nsubE;=\u2AC5\u0338 -nsube;=\u2288 -nsubset;=\u2282\u20D2 -nsubseteq;=\u2288 -nsubseteqq;=\u2AC5\u0338 -nsucc;=\u2281 -nsucceq;=\u2AB0\u0338 -nsup;=\u2285 -nsupE;=\u2AC6\u0338 -nsupe;=\u2289 -nsupset;=\u2283\u20D2 -nsupseteq;=\u2289 -nsupseteqq;=\u2AC6\u0338 -ntgl;=\u2279 -ntilde=\u00F1 -ntilde;=\u00F1 -ntlg;=\u2278 -ntriangleleft;=\u22EA -ntrianglelefteq;=\u22EC -ntriangleright;=\u22EB -ntrianglerighteq;=\u22ED -nu;=\u03BD -num;=\u0023 -numero;=\u2116 -numsp;=\u2007 -nvDash;=\u22AD -nvHarr;=\u2904 -nvap;=\u224D\u20D2 -nvdash;=\u22AC -nvge;=\u2265\u20D2 -nvgt;=\u003E\u20D2 -nvinfin;=\u29DE -nvlArr;=\u2902 -nvle;=\u2264\u20D2 -nvlt;=\u003C\u20D2 -nvltrie;=\u22B4\u20D2 -nvrArr;=\u2903 -nvrtrie;=\u22B5\u20D2 -nvsim;=\u223C\u20D2 -nwArr;=\u21D6 -nwarhk;=\u2923 -nwarr;=\u2196 -nwarrow;=\u2196 -nwnear;=\u2927 -oS;=\u24C8 -oacute=\u00F3 -oacute;=\u00F3 -oast;=\u229B -ocir;=\u229A -ocirc=\u00F4 -ocirc;=\u00F4 -ocy;=\u043E -odash;=\u229D -odblac;=\u0151 -odiv;=\u2A38 -odot;=\u2299 -odsold;=\u29BC -oelig;=\u0153 -ofcir;=\u29BF -ofr;=\uD835\uDD2C -ogon;=\u02DB -ograve=\u00F2 -ograve;=\u00F2 -ogt;=\u29C1 -ohbar;=\u29B5 -ohm;=\u03A9 -oint;=\u222E -olarr;=\u21BA -olcir;=\u29BE -olcross;=\u29BB -oline;=\u203E -olt;=\u29C0 -omacr;=\u014D -omega;=\u03C9 -omicron;=\u03BF -omid;=\u29B6 -ominus;=\u2296 -oopf;=\uD835\uDD60 -opar;=\u29B7 -operp;=\u29B9 -oplus;=\u2295 -or;=\u2228 -orarr;=\u21BB -ord;=\u2A5D -order;=\u2134 -orderof;=\u2134 -ordf=\u00AA -ordf;=\u00AA -ordm=\u00BA -ordm;=\u00BA -origof;=\u22B6 -oror;=\u2A56 -orslope;=\u2A57 -orv;=\u2A5B -oscr;=\u2134 -oslash=\u00F8 -oslash;=\u00F8 -osol;=\u2298 -otilde=\u00F5 -otilde;=\u00F5 -otimes;=\u2297 -otimesas;=\u2A36 -ouml=\u00F6 -ouml;=\u00F6 -ovbar;=\u233D -par;=\u2225 -para=\u00B6 -para;=\u00B6 -parallel;=\u2225 -parsim;=\u2AF3 -parsl;=\u2AFD -part;=\u2202 -pcy;=\u043F -percnt;=\u0025 -period;=\u002E -permil;=\u2030 -perp;=\u22A5 -pertenk;=\u2031 -pfr;=\uD835\uDD2D -phi;=\u03C6 -phiv;=\u03D5 -phmmat;=\u2133 -phone;=\u260E -pi;=\u03C0 -pitchfork;=\u22D4 -piv;=\u03D6 -planck;=\u210F -planckh;=\u210E -plankv;=\u210F -plus;=\u002B -plusacir;=\u2A23 -plusb;=\u229E -pluscir;=\u2A22 -plusdo;=\u2214 -plusdu;=\u2A25 -pluse;=\u2A72 -plusmn=\u00B1 -plusmn;=\u00B1 -plussim;=\u2A26 -plustwo;=\u2A27 -pm;=\u00B1 -pointint;=\u2A15 -popf;=\uD835\uDD61 -pound=\u00A3 -pound;=\u00A3 -pr;=\u227A -prE;=\u2AB3 -prap;=\u2AB7 -prcue;=\u227C -pre;=\u2AAF -prec;=\u227A -precapprox;=\u2AB7 -preccurlyeq;=\u227C -preceq;=\u2AAF -precnapprox;=\u2AB9 -precneqq;=\u2AB5 -precnsim;=\u22E8 -precsim;=\u227E -prime;=\u2032 -primes;=\u2119 -prnE;=\u2AB5 -prnap;=\u2AB9 -prnsim;=\u22E8 -prod;=\u220F -profalar;=\u232E -profline;=\u2312 -profsurf;=\u2313 -prop;=\u221D -propto;=\u221D -prsim;=\u227E -prurel;=\u22B0 -pscr;=\uD835\uDCC5 -psi;=\u03C8 -puncsp;=\u2008 -qfr;=\uD835\uDD2E -qint;=\u2A0C -qopf;=\uD835\uDD62 -qprime;=\u2057 -qscr;=\uD835\uDCC6 -quaternions;=\u210D -quatint;=\u2A16 -quest;=\u003F -questeq;=\u225F -quot=\u0022 -quot;=\u0022 -rAarr;=\u21DB -rArr;=\u21D2 -rAtail;=\u291C -rBarr;=\u290F -rHar;=\u2964 -race;=\u223D\u0331 -racute;=\u0155 -radic;=\u221A -raemptyv;=\u29B3 -rang;=\u27E9 -rangd;=\u2992 -range;=\u29A5 -rangle;=\u27E9 -raquo=\u00BB -raquo;=\u00BB -rarr;=\u2192 -rarrap;=\u2975 -rarrb;=\u21E5 -rarrbfs;=\u2920 -rarrc;=\u2933 -rarrfs;=\u291E -rarrhk;=\u21AA -rarrlp;=\u21AC -rarrpl;=\u2945 -rarrsim;=\u2974 -rarrtl;=\u21A3 -rarrw;=\u219D -ratail;=\u291A -ratio;=\u2236 -rationals;=\u211A -rbarr;=\u290D -rbbrk;=\u2773 -rbrace;=\u007D -rbrack;=\u005D -rbrke;=\u298C -rbrksld;=\u298E -rbrkslu;=\u2990 -rcaron;=\u0159 -rcedil;=\u0157 -rceil;=\u2309 -rcub;=\u007D -rcy;=\u0440 -rdca;=\u2937 -rdldhar;=\u2969 -rdquo;=\u201D -rdquor;=\u201D -rdsh;=\u21B3 -real;=\u211C -realine;=\u211B -realpart;=\u211C -reals;=\u211D -rect;=\u25AD -reg=\u00AE -reg;=\u00AE -rfisht;=\u297D -rfloor;=\u230B -rfr;=\uD835\uDD2F -rhard;=\u21C1 -rharu;=\u21C0 -rharul;=\u296C -rho;=\u03C1 -rhov;=\u03F1 -rightarrow;=\u2192 -rightarrowtail;=\u21A3 -rightharpoondown;=\u21C1 -rightharpoonup;=\u21C0 -rightleftarrows;=\u21C4 -rightleftharpoons;=\u21CC -rightrightarrows;=\u21C9 -rightsquigarrow;=\u219D -rightthreetimes;=\u22CC -ring;=\u02DA -risingdotseq;=\u2253 -rlarr;=\u21C4 -rlhar;=\u21CC -rlm;=\u200F -rmoust;=\u23B1 -rmoustache;=\u23B1 -rnmid;=\u2AEE -roang;=\u27ED -roarr;=\u21FE -robrk;=\u27E7 -ropar;=\u2986 -ropf;=\uD835\uDD63 -roplus;=\u2A2E -rotimes;=\u2A35 -rpar;=\u0029 -rpargt;=\u2994 -rppolint;=\u2A12 -rrarr;=\u21C9 -rsaquo;=\u203A -rscr;=\uD835\uDCC7 -rsh;=\u21B1 -rsqb;=\u005D -rsquo;=\u2019 -rsquor;=\u2019 -rthree;=\u22CC -rtimes;=\u22CA -rtri;=\u25B9 -rtrie;=\u22B5 -rtrif;=\u25B8 -rtriltri;=\u29CE -ruluhar;=\u2968 -rx;=\u211E -sacute;=\u015B -sbquo;=\u201A -sc;=\u227B -scE;=\u2AB4 -scap;=\u2AB8 -scaron;=\u0161 -sccue;=\u227D -sce;=\u2AB0 -scedil;=\u015F -scirc;=\u015D -scnE;=\u2AB6 -scnap;=\u2ABA -scnsim;=\u22E9 -scpolint;=\u2A13 -scsim;=\u227F -scy;=\u0441 -sdot;=\u22C5 -sdotb;=\u22A1 -sdote;=\u2A66 -seArr;=\u21D8 -searhk;=\u2925 -searr;=\u2198 -searrow;=\u2198 -sect=\u00A7 -sect;=\u00A7 -semi;=\u003B -seswar;=\u2929 -setminus;=\u2216 -setmn;=\u2216 -sext;=\u2736 -sfr;=\uD835\uDD30 -sfrown;=\u2322 -sharp;=\u266F -shchcy;=\u0449 -shcy;=\u0448 -shortmid;=\u2223 -shortparallel;=\u2225 -shy=\u00AD -shy;=\u00AD -sigma;=\u03C3 -sigmaf;=\u03C2 -sigmav;=\u03C2 -sim;=\u223C -simdot;=\u2A6A -sime;=\u2243 -simeq;=\u2243 -simg;=\u2A9E -simgE;=\u2AA0 -siml;=\u2A9D -simlE;=\u2A9F -simne;=\u2246 -simplus;=\u2A24 -simrarr;=\u2972 -slarr;=\u2190 -smallsetminus;=\u2216 -smashp;=\u2A33 -smeparsl;=\u29E4 -smid;=\u2223 -smile;=\u2323 -smt;=\u2AAA -smte;=\u2AAC -smtes;=\u2AAC\uFE00 -softcy;=\u044C -sol;=\u002F -solb;=\u29C4 -solbar;=\u233F -sopf;=\uD835\uDD64 -spades;=\u2660 -spadesuit;=\u2660 -spar;=\u2225 -sqcap;=\u2293 -sqcaps;=\u2293\uFE00 -sqcup;=\u2294 -sqcups;=\u2294\uFE00 -sqsub;=\u228F -sqsube;=\u2291 -sqsubset;=\u228F -sqsubseteq;=\u2291 -sqsup;=\u2290 -sqsupe;=\u2292 -sqsupset;=\u2290 -sqsupseteq;=\u2292 -squ;=\u25A1 -square;=\u25A1 -squarf;=\u25AA -squf;=\u25AA -srarr;=\u2192 -sscr;=\uD835\uDCC8 -ssetmn;=\u2216 -ssmile;=\u2323 -sstarf;=\u22C6 -star;=\u2606 -starf;=\u2605 -straightepsilon;=\u03F5 -straightphi;=\u03D5 -strns;=\u00AF -sub;=\u2282 -subE;=\u2AC5 -subdot;=\u2ABD -sube;=\u2286 -subedot;=\u2AC3 -submult;=\u2AC1 -subnE;=\u2ACB -subne;=\u228A -subplus;=\u2ABF -subrarr;=\u2979 -subset;=\u2282 -subseteq;=\u2286 -subseteqq;=\u2AC5 -subsetneq;=\u228A -subsetneqq;=\u2ACB -subsim;=\u2AC7 -subsub;=\u2AD5 -subsup;=\u2AD3 -succ;=\u227B -succapprox;=\u2AB8 -succcurlyeq;=\u227D -succeq;=\u2AB0 -succnapprox;=\u2ABA -succneqq;=\u2AB6 -succnsim;=\u22E9 -succsim;=\u227F -sum;=\u2211 -sung;=\u266A -sup1=\u00B9 -sup1;=\u00B9 -sup2=\u00B2 -sup2;=\u00B2 -sup3=\u00B3 -sup3;=\u00B3 -sup;=\u2283 -supE;=\u2AC6 -supdot;=\u2ABE -supdsub;=\u2AD8 -supe;=\u2287 -supedot;=\u2AC4 -suphsol;=\u27C9 -suphsub;=\u2AD7 -suplarr;=\u297B -supmult;=\u2AC2 -supnE;=\u2ACC -supne;=\u228B -supplus;=\u2AC0 -supset;=\u2283 -supseteq;=\u2287 -supseteqq;=\u2AC6 -supsetneq;=\u228B -supsetneqq;=\u2ACC -supsim;=\u2AC8 -supsub;=\u2AD4 -supsup;=\u2AD6 -swArr;=\u21D9 -swarhk;=\u2926 -swarr;=\u2199 -swarrow;=\u2199 -swnwar;=\u292A -szlig=\u00DF -szlig;=\u00DF -target;=\u2316 -tau;=\u03C4 -tbrk;=\u23B4 -tcaron;=\u0165 -tcedil;=\u0163 -tcy;=\u0442 -tdot;=\u20DB -telrec;=\u2315 -tfr;=\uD835\uDD31 -there4;=\u2234 -therefore;=\u2234 -theta;=\u03B8 -thetasym;=\u03D1 -thetav;=\u03D1 -thickapprox;=\u2248 -thicksim;=\u223C -thinsp;=\u2009 -thkap;=\u2248 -thksim;=\u223C -thorn=\u00FE -thorn;=\u00FE -tilde;=\u02DC -times=\u00D7 -times;=\u00D7 -timesb;=\u22A0 -timesbar;=\u2A31 -timesd;=\u2A30 -tint;=\u222D -toea;=\u2928 -top;=\u22A4 -topbot;=\u2336 -topcir;=\u2AF1 -topf;=\uD835\uDD65 -topfork;=\u2ADA -tosa;=\u2929 -tprime;=\u2034 -trade;=\u2122 -triangle;=\u25B5 -triangledown;=\u25BF -triangleleft;=\u25C3 -trianglelefteq;=\u22B4 -triangleq;=\u225C -triangleright;=\u25B9 -trianglerighteq;=\u22B5 -tridot;=\u25EC -trie;=\u225C -triminus;=\u2A3A -triplus;=\u2A39 -trisb;=\u29CD -tritime;=\u2A3B -trpezium;=\u23E2 -tscr;=\uD835\uDCC9 -tscy;=\u0446 -tshcy;=\u045B -tstrok;=\u0167 -twixt;=\u226C -twoheadleftarrow;=\u219E -twoheadrightarrow;=\u21A0 -uArr;=\u21D1 -uHar;=\u2963 -uacute=\u00FA -uacute;=\u00FA -uarr;=\u2191 -ubrcy;=\u045E -ubreve;=\u016D -ucirc=\u00FB -ucirc;=\u00FB -ucy;=\u0443 -udarr;=\u21C5 -udblac;=\u0171 -udhar;=\u296E -ufisht;=\u297E -ufr;=\uD835\uDD32 -ugrave=\u00F9 -ugrave;=\u00F9 -uharl;=\u21BF -uharr;=\u21BE -uhblk;=\u2580 -ulcorn;=\u231C -ulcorner;=\u231C -ulcrop;=\u230F -ultri;=\u25F8 -umacr;=\u016B -uml=\u00A8 -uml;=\u00A8 -uogon;=\u0173 -uopf;=\uD835\uDD66 -uparrow;=\u2191 -updownarrow;=\u2195 -upharpoonleft;=\u21BF -upharpoonright;=\u21BE -uplus;=\u228E -upsi;=\u03C5 -upsih;=\u03D2 -upsilon;=\u03C5 -upuparrows;=\u21C8 -urcorn;=\u231D -urcorner;=\u231D -urcrop;=\u230E -uring;=\u016F -urtri;=\u25F9 -uscr;=\uD835\uDCCA -utdot;=\u22F0 -utilde;=\u0169 -utri;=\u25B5 -utrif;=\u25B4 -uuarr;=\u21C8 -uuml=\u00FC -uuml;=\u00FC -uwangle;=\u29A7 -vArr;=\u21D5 -vBar;=\u2AE8 -vBarv;=\u2AE9 -vDash;=\u22A8 -vangrt;=\u299C -varepsilon;=\u03F5 -varkappa;=\u03F0 -varnothing;=\u2205 -varphi;=\u03D5 -varpi;=\u03D6 -varpropto;=\u221D -varr;=\u2195 -varrho;=\u03F1 -varsigma;=\u03C2 -varsubsetneq;=\u228A\uFE00 -varsubsetneqq;=\u2ACB\uFE00 -varsupsetneq;=\u228B\uFE00 -varsupsetneqq;=\u2ACC\uFE00 -vartheta;=\u03D1 -vartriangleleft;=\u22B2 -vartriangleright;=\u22B3 -vcy;=\u0432 -vdash;=\u22A2 -vee;=\u2228 -veebar;=\u22BB -veeeq;=\u225A -vellip;=\u22EE -verbar;=\u007C -vert;=\u007C -vfr;=\uD835\uDD33 -vltri;=\u22B2 -vnsub;=\u2282\u20D2 -vnsup;=\u2283\u20D2 -vopf;=\uD835\uDD67 -vprop;=\u221D -vrtri;=\u22B3 -vscr;=\uD835\uDCCB -vsubnE;=\u2ACB\uFE00 -vsubne;=\u228A\uFE00 -vsupnE;=\u2ACC\uFE00 -vsupne;=\u228B\uFE00 -vzigzag;=\u299A -wcirc;=\u0175 -wedbar;=\u2A5F -wedge;=\u2227 -wedgeq;=\u2259 -weierp;=\u2118 -wfr;=\uD835\uDD34 -wopf;=\uD835\uDD68 -wp;=\u2118 -wr;=\u2240 -wreath;=\u2240 -wscr;=\uD835\uDCCC -xcap;=\u22C2 -xcirc;=\u25EF -xcup;=\u22C3 -xdtri;=\u25BD -xfr;=\uD835\uDD35 -xhArr;=\u27FA -xharr;=\u27F7 -xi;=\u03BE -xlArr;=\u27F8 -xlarr;=\u27F5 -xmap;=\u27FC -xnis;=\u22FB -xodot;=\u2A00 -xopf;=\uD835\uDD69 -xoplus;=\u2A01 -xotime;=\u2A02 -xrArr;=\u27F9 -xrarr;=\u27F6 -xscr;=\uD835\uDCCD -xsqcup;=\u2A06 -xuplus;=\u2A04 -xutri;=\u25B3 -xvee;=\u22C1 -xwedge;=\u22C0 -yacute=\u00FD -yacute;=\u00FD -yacy;=\u044F -ycirc;=\u0177 -ycy;=\u044B -yen=\u00A5 -yen;=\u00A5 -yfr;=\uD835\uDD36 -yicy;=\u0457 -yopf;=\uD835\uDD6A -yscr;=\uD835\uDCCE -yucy;=\u044E -yuml=\u00FF -yuml;=\u00FF -zacute;=\u017A -zcaron;=\u017E -zcy;=\u0437 -zdot;=\u017C -zeetrf;=\u2128 -zeta;=\u03B6 -zfr;=\uD835\uDD37 -zhcy;=\u0436 -zigrarr;=\u21DD -zopf;=\uD835\uDD6B -zscr;=\uD835\uDCCF -zwj;=\u200D -zwnj;=\u200C \ No newline at end of file diff --git a/benchmark/src/main/java/org/htmlunit/cyberneko/html_entities_common.properties b/benchmark/src/main/java/org/htmlunit/cyberneko/html_entities_common.properties deleted file mode 100644 index 92167179..00000000 --- a/benchmark/src/main/java/org/htmlunit/cyberneko/html_entities_common.properties +++ /dev/null @@ -1,8 +0,0 @@ -amp;=\u0026 -nbsp;=\u00A0 -shy;=\u00AD -lt;=\u003C -gt;=\u003E -euro;=\u20AC -copy;=\u00A9 -reg;=\u00AE \ No newline at end of file diff --git a/benchmark/src/main/java/org/htmlunit/cyberneko/util/HTMLEntitiesParser.java b/benchmark/src/main/java/org/htmlunit/cyberneko/util/HTMLEntitiesParser.java deleted file mode 100644 index 761a56bb..00000000 --- a/benchmark/src/main/java/org/htmlunit/cyberneko/util/HTMLEntitiesParser.java +++ /dev/null @@ -1,342 +0,0 @@ -/* - * Copyright 2002-2009 Andy Clark, Marc Guillemot - * Copyright 2017-2023 Ronald Brill - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.htmlunit.cyberneko.util; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Properties; - -/** - * This is a very specialized class for storing HTML entities with the ability - * to look them up in stages. It is stateless and hence it use is memory friendly. - * Additionally, it is not generated code rather it sets itself up from a file at - * first use and stays fixed from now on. - * - * Because it is stateless, it delegates the state handling to the user in the - * sense of how many characters one saw and when to stop doing things. - * - * - * - * @author René Schwietzke - */ -public class HTMLEntitiesParser -{ - // These are some benchmark results of a comparison old vs. new parser. onlyCommon is a test with just 7 out of - // 2231 entities (most common such as lt gt and more). Random means, we are not feeding the parser the data - // the test data in the same order, but vary them. - // - // As you can see, the new parser is up to 20x faster for common entities and 8x faster when checking all. - // - // Benchmark (onlyCommon) (random) Mode Cnt Score Error Units - // HtmlEntitiesParserBenchmark.newParser4 true true avgt 3 135.647 ± 13.500 ns/op - // HtmlEntitiesParserBenchmark.newParser4 true false avgt 3 132.972 ± 4.807 ns/op - // HtmlEntitiesParserBenchmark.newParser4 false true avgt 3 240162.769 ± 3538.438 ns/op - // HtmlEntitiesParserBenchmark.newParser4 false false avgt 3 206904.535 ± 53584.038 ns/op - // HtmlEntitiesParserBenchmark.oldParser true true avgt 3 3320.223 ± 178.501 ns/op - // HtmlEntitiesParserBenchmark.oldParser true false avgt 3 3097.086 ± 48.238 ns/op - // HtmlEntitiesParserBenchmark.oldParser false true avgt 3 1584678.257 ± 65965.438 ns/op - // HtmlEntitiesParserBenchmark.oldParser false false avgt 3 1604853.180 ± 73638.435 ns/op - - /* - * Our single instance of the parser - */ - private final static HTMLEntitiesParser instance = new HTMLEntitiesParser(); - - /* - * Our starting point of the pseudo tree of entities. The root level is a little special, because of the size - * it employs a different lookup on the characters (calculation rather comparison). - */ - private RootLevel rootLevel = new RootLevel(); - - /** - * Constructor - */ - private HTMLEntitiesParser() - { - // read the entities defined in the data taken from - try (InputStream stream = HTMLEntitiesParser.class.getResourceAsStream("html_entities.properties")) - { - final Properties props = new Properties(); - props.load(stream); - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - if (key.isEmpty()) { - return; - } - - this.rootLevel.add(key, value); - }); - - // make the root more efficient, rest stays simple - this.rootLevel.optimize(); - } - catch (IOException e) - { - throw new RuntimeException("Unable to initilaize the HTML entities from file"); - } - } - - /** - * Returns the singleton. The singleton is stateless and can safely be used in a multi-threaded - * context. The - */ - public static HTMLEntitiesParser get() - { - return instance; - } - - public Level lookup(final String entityName) - { - Level lastResult = this.rootLevel; - Level lastMatchingResult = null; - - for (int i = 0; i < entityName.length(); i++) - { - Level result = lastResult.lookup(entityName.charAt(i)); - - if (result.endNode) - { - return result; - } - if (result == lastResult) - { - // nothing changed, more characters have not done anything - return lastMatchingResult == null ? lastResult : lastMatchingResult; - } - if (result.isMatch) - { - lastMatchingResult = result; - } - lastResult = result; - } - - return lastMatchingResult == null ? lastResult : lastMatchingResult; - } - - public Level lookup(final int character, final Level level) - { - return level != null ? level.lookup(character) : rootLevel.lookup(character); - } - - public static class RootLevel extends Level - { - private int offset = 0; - - @Override - public Level lookup(int character) - { - // fastpath, just calculate the pos - final int pos = character - offset; - if (pos >=0 && pos < this.nextLevel.length) - { - return this.nextLevel[pos]; - } - else - { - return this; - } - } - - /* - * Optimizes the layout after creation but not for every level - */ - protected void optimize() - { - // are we final already? - if (offset > 0) - { - return; - } - - // ok, smallest char is the start - this.offset = this.characters[0]; - - // get us new level array covering the smallest char in [0] and the largest in the last pos, - // we might have holes, but not too many, hence this is faster than iterating or a binary search - final Level[] newNextLevel = new Level[this.characters[this.characters.length - 1] - offset + 1]; - - // arrange entry according to charactercode - for (int i = 0; i < this.characters.length; i++) - { - final int c = this.characters[i]; - final Level level = this.nextLevel[i]; - - newNextLevel[c - offset] = level; - } - - // take it live - this.nextLevel = newNextLevel; - // free memory, because we not longer need that - this.characters = null; - } - - } - - public static class Level - { - private final int depth; - int[] characters = new int[0]; - Level[] nextLevel = new Level[0]; - - public final String entityOrFragment; - public String resolvedValue; - public final int length; - public final boolean endsWithSemicolon; - public boolean isMatch; - public boolean endNode; - - public Level() - { - this.entityOrFragment = ""; - this.length = 0; - this.depth = 0; - this.endsWithSemicolon = false; - this.isMatch = false; - this.resolvedValue = null; - this.endNode = false; - } - - public Level(final int depth, final String entityFragment, final String resolvedValue) - { - if (depth == entityFragment.length()) - { - // we are at the end - this.entityOrFragment = entityFragment; - this.length = entityFragment.length(); - this.depth = entityFragment.length(); - this.endsWithSemicolon = entityFragment.endsWith(";"); - this.isMatch = true; - this.resolvedValue = resolvedValue; - this.endNode = entityFragment.endsWith(";"); - } - else - { - // intermediate state - final String currentFragment = entityFragment.substring(0, depth); - - this.entityOrFragment = currentFragment; - this.length = currentFragment.length(); - this.depth = depth; - this.endsWithSemicolon = false; - this.isMatch = false; - this.resolvedValue = null; - this.endNode = false; - } - } - - - public void updateNonSemicolonEntity(final String entity, final String resolvedValue) - { - if (entity.endsWith(";")) - { - // nothing to do - return; - } - if (entity.length() == this.depth) - { - // safety check - if (!entity.equals(this.entityOrFragment)) - { - throw new RuntimeException("Illegal state reached"); - } - - this.isMatch = true; - this.resolvedValue = resolvedValue; - } - } - - public void add(final String entity, final String resolvedValue) - { - // ok, any characters left? - if (this.depth >= entity.length()) - { - // no reason to go any further - return; - } - - // get me my character - final char c = entity.charAt(this.depth); - - // do I already know it? - final int pos = Arrays.binarySearch(characters, c); - - if (pos < 0) - { - // we don't know it, make the size bigger and get us the new pos - this.nextLevel = Arrays.copyOf(this.nextLevel, this.nextLevel.length + 1); - this.characters = Arrays.copyOf(this.characters, this.characters.length + 1); - final int newPos = -(pos + 1); - - // move stuff first - if (newPos != this.characters.length - 1) - { - System.arraycopy(this.characters, newPos, this.characters, newPos + 1, this.characters.length - newPos - 1); - System.arraycopy(this.nextLevel, newPos, this.nextLevel, newPos + 1, this.nextLevel.length - newPos - 1); - } - else - { - // we insert at the end, so no move needed - } - final Level newLevel = new Level(this.depth + 1, entity, resolvedValue); - this.characters[newPos] = c; - this.nextLevel[newPos] = newLevel; - - // update next level - newLevel.add(entity, resolvedValue); - } - else - { - // ok, if this one is without a ; and we have the full entity, we - // have a mismatch between one with and one without ; - // change the level - this.nextLevel[pos].updateNonSemicolonEntity(entity, resolvedValue); - this.nextLevel[pos].add(entity, resolvedValue); - } - } - - public Level lookup(int character) - { - // because we have sorted arrays, we can be more efficient here - final int length = this.characters.length; - for (int i = 0; i < length; i++) - { - final int c = this.characters[i]; - if (c < character) - { - continue; - } - if (c == character) - { - // we are at position - return this.nextLevel[i]; - } - else - { - // ok, too far and have not found it, abort with current state - return this; - } - } - - return this; - } - } - -} diff --git a/benchmark/src/main/java/org/htmlunit/cyberneko/util/HTMLNumericEntitiesParser.java b/benchmark/src/main/java/org/htmlunit/cyberneko/util/HTMLNumericEntitiesParser.java deleted file mode 100644 index 9c16252c..00000000 --- a/benchmark/src/main/java/org/htmlunit/cyberneko/util/HTMLNumericEntitiesParser.java +++ /dev/null @@ -1,283 +0,0 @@ -/* - * Copyright 2002-2009 Andy Clark, Marc Guillemot - * Copyright 2017-2023 Ronald Brill - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.htmlunit.cyberneko.util; - -/** - * Parser for the Pre-defined named HTML entities. - * 12.2.5.72 Character reference state - *

- * From the spec:
- * Consume the maximum number of characters possible, with the consumed characters matching - * one of the identifiers in the first column of the named character references table - * (in a case-sensitive manner). - * Append each character to the temporary buffer when it's consumed. - * - * @author Ronald Brill - */ -public class HTMLNumericEntitiesParser { - public static final int STATE_START = 0; - private static final int STATE_ENDS_WITH_SEMICOLON = -2; - - private static final int STATE_HEXADECIMAL_CHAR = -102; - private static final int STATE_DECIMAL_CHAR = -104; - - private static final int STATE_NUMERIC_CHAR_END_SEMICOLON_MISSING = -105; - - private int state; - private int consumedCount; - private String match; - private int code; - private int matchLength; - - public String getMatch() { - return match; - } - - public int getMatchLength() { - return matchLength; - } - - public int getRewindCount() { - return consumedCount - matchLength; - } - - public boolean endsWithSemicolon() { - return STATE_ENDS_WITH_SEMICOLON == state; - } - - public HTMLNumericEntitiesParser() { - state = STATE_START; - } - - public void setMatchFromCode() { - // If the number is 0x00, then this is a null-character-reference parse error. Set the character reference code to 0xFFFD. - // If the number is greater than 0x10FFFF, then this is a character-reference-outside-unicode-range parse error. Set the character reference code to 0xFFFD. - if ((0x00 == code) || (code > 0x10FFFF)) { - match = "\uFFFD"; - matchLength = consumedCount; - return; - } - - // If the number is a surrogate, then this is a surrogate-character-reference parse error. Set the character reference code to 0xFFFD - if (Character.isSurrogate((char) code)) { - match = "\uFFFD"; - return; - } - - // If the number is a noncharacter, then this is a noncharacter-character-reference parse error. - - // If the number is 0x0D, or a control that's not ASCII whitespace, then this is a control-character-reference parse error. - - // If the number is one of the numbers in the first column of the following table, then find the row with that number in the first column, - // and set the character reference code to the number in the second column of that row. - switch (code) { - case 0x80: - match = "\u20AC"; - matchLength = consumedCount; - return; - - case 0x82: - match = "\u201A"; - matchLength = consumedCount; - return; - - case 0x83: - match = "\u0192"; - matchLength = consumedCount; - return; - - case 0x84: - match = "\u201E"; - matchLength = consumedCount; - return; - - case 0x85: - match = "\u2026"; - matchLength = consumedCount; - return; - - case 0x86: - match = "\u2020"; - matchLength = consumedCount; - return; - - case 0x87: - match = "\u2021"; - matchLength = consumedCount; - return; - - case 0x88: - match = "\u02C6"; - matchLength = consumedCount; - return; - - case 0x89: - match = "\u2030"; - matchLength = consumedCount; - return; - - case 0x8A: - match = "\u0160"; - matchLength = consumedCount; - return; - - case 0x8B: - match = "\u2039"; - matchLength = consumedCount; - return; - - case 0x8C: - match = "\u0152"; - matchLength = consumedCount; - return; - - case 0x8E: - match = "\u017D"; - matchLength = consumedCount; - return; - - case 0x91: - match = "\u2018"; - matchLength = consumedCount; - return; - - case 0x92: - match = "\u2019"; - matchLength = consumedCount; - return; - - case 0x93: - match = "\u201C"; - matchLength = consumedCount; - return; - - case 0x94: - match = "\u201D"; - matchLength = consumedCount; - return; - - case 0x95: - match = "\u2022"; - matchLength = consumedCount; - return; - - case 0x96: - match = "\u2013"; - matchLength = consumedCount; - return; - - case 0x97: - match = "\u2014"; - matchLength = consumedCount; - return; - - case 0x98: - match = "\u20DC"; - matchLength = consumedCount; - return; - - case 0x99: - match = "\u2122"; - matchLength = consumedCount; - return; - - case 0x9A: - match = "\u0161"; - matchLength = consumedCount; - return; - - case 0x9B: - match = "\u203A"; - matchLength = consumedCount; - return; - - case 0x9C: - match = "\u0153"; - matchLength = consumedCount; - return; - - case 0x9E: - match = "\u017E"; - matchLength = consumedCount; - return; - - case 0x9F: - match = "\u0178"; - matchLength = consumedCount; - return; - - default: - break; - } - match = new String(Character.toChars(code)); - matchLength = consumedCount; - } - - public boolean parseNumeric(final int current) { - consumedCount++; - switch (state) { - case STATE_START: - if ('X' == current || 'x' == current) { - state = STATE_HEXADECIMAL_CHAR; - return true; - } - if ('0' <= current && current <= '9') { - state = STATE_DECIMAL_CHAR; - code = (code * 10) + current - 0x30; - return true; - } - break; - case STATE_HEXADECIMAL_CHAR: - if ('0' <= current && current <= '9') { - code = (code * 16) + current - 0x30; - return true; - } - if ('A' <= current && current <= 'F') { - code = (code * 16) + current - 0x37; - return true; - } - if ('a' <= current && current <= 'f') { - code = (code * 16) + current - 0x57; - return true; - } - if (';' == current) { - setMatchFromCode(); - return false; - } - - state = STATE_NUMERIC_CHAR_END_SEMICOLON_MISSING; - setMatchFromCode(); - matchLength = consumedCount - 1; - break; - case STATE_DECIMAL_CHAR: - if ('0' <= current && current <= '9') { - code = (code * 10) + current - 0x30; - return true; - } - if (';' == current) { - setMatchFromCode(); - return false; - } - - state = STATE_NUMERIC_CHAR_END_SEMICOLON_MISSING; - setMatchFromCode(); - matchLength = consumedCount - 1; - break; - } - return false; - } - -} diff --git a/benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities1.java b/benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities1.java deleted file mode 100644 index 97a73972..00000000 --- a/benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities1.java +++ /dev/null @@ -1,297 +0,0 @@ -package org.htmlunit.cyberneko.util; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Optional; -import java.util.Properties; - -import org.htmlunit.cyberneko.HtmlEntitiesParserBenchmark; - -/** - * This is a very specialized tree class for storing HTML entities - * with the ability to look them up in stages. It is driven by an - * char (presented as int) and results in finding a String result at - * the end. We return the last tree node as result, so we can keep - * that as state for the next iterations. The tree itself does not - * keep an active state when being used. - */ -public class HtmlEntities1 -{ - private final static HtmlEntities1 instance = new HtmlEntities1(); - - private String[] entities = new String[0]; - private ValueNode[] values = new ValueNode[0]; - - /** - * Constructor - */ - private HtmlEntities1() - { - // read the entities defined in the data taken from - try (InputStream stream = HtmlEntitiesParserBenchmark.class.getResourceAsStream("html_entities.properties")) - { - final Properties props = new Properties(); - props.load(stream); - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - if (key.isEmpty()) { - return; - } - - this.add(key, value); - }); - - // enumerate all - this.enumerate(); - } - catch (IOException e) - { - throw new RuntimeException("Unable to initilaize the HTML entities from file"); - } - } - - /** - * Returns the singleton. The singleton is stateless and can safely be used in a multi-threaded - * context. The - */ - public static HtmlEntities1 get() - { - return instance; - } - - /** - * Returns the intermediate state as position in the data set - * Returns >= 0 if still matching, -1 if no match or no match - * anymore. You can use the last positive number to retrieve - * the last valid result. - * - * @param - * @param - * @return - */ - public ValueNode lookup(final String entityName, int previousStep) - { - if (entityName.length() <= 2) - { - int low = previousStep; - int high = this.entities.length - 1; - - while (low <= high) { - int mid = (low + high) >>> 1; - String midVal = this.entities[mid]; - int cmp = midVal.compareTo(entityName); - - if (cmp < 0) { - low = mid + 1; - } - else if (cmp > 0) { - high = mid - 1; - } - else { - return this.values[mid]; // key found - } - } - } - else - { - for (int i = previousStep + 1; i < this.entities.length; i++) - { - final int r = this.entities[i].compareTo(entityName); - if (r < 0) - { - continue; - } - - if (r == 0) - { - return this.values[i]; - } - else if (r > 0) - { - return null; - } - } - } - - return null; - } - - /** - * Allows to directly lookup an entity without going the incrementally. - * We go the Java 8 way and avoid null here. With Valhalla, this will become - * memory efficient, up to that point, we might use this for testing only - * I guess. - * - * @param entityName - * @return - */ - public Optional lookup(final String entityName) - { - final int pos = Arrays.binarySearch(this.entities, entityName); - if (pos >= 0) - { - return Optional.ofNullable(this.values[pos].resolvedValue); - } - else - { - return Optional.empty(); - } - } - - public ValueNode lookup(final int pos) - { - return this.values[pos]; - } - - private void add(ValueNode node) - { - // find position - final int pos = Arrays.binarySearch(this.entities, node.entity); - if (pos >= 0) - { - // when this is a non match but we need a mtch to store, overridde - // this covers things like a valid "gt" and a later valid "gt;" - if (node.isMatch() && !this.values[pos].isMatch()) - { - this.values[pos] = node; - } - return; - } - - // we assume clean data such as that we don't have things twice - // increase data size - this.entities = Arrays.copyOf(this.entities, this.entities.length + 1); - this.values = Arrays.copyOf(this.values, this.values.length + 1); - - // move all to the right - final int p = -(pos + 1); - if (p < this.entities.length - 1) - { - System.arraycopy(this.entities, p, this.entities, p + 1, this.entities.length - p - 1); - System.arraycopy(this.values, p, this.values, p + 1, this.values.length - p - 1); - } - - this.entities[p] = node.entity; - this.values[p] = node;; - } - - private void add(final String entityName, final String resolvedValue) - { - for (int i = 1; i < entityName.length(); i++) - { - String s = entityName.substring(0, i); - add(new ValueNode(s)); - } - add(new ValueNode(entityName, resolvedValue)); - } - - private void enumerate() - { - for (int i = 0; i < this.values.length; i++) - { - this.values[i].position = i; - } - } - - public static class Resolver - { - private int consumedCount; - private ValueNode state = ValueNode.EMPTY; - private StringBuilder data = new StringBuilder(8); - - public void reset() - { - this.consumedCount = 0; - this.state = ValueNode.EMPTY; - this.data.delete(0, this.data.length()); - } - - public String getResolvedValue() - { - return state.resolvedValue; - } - - public int getMatchLength() - { - return state.length; - } - - public int getRewindCount() - { - return consumedCount - getMatchLength(); - } - - public boolean endsWithSemicolon() - { - return state.endsWithSemicolon; - } - - public boolean parse(final int character) - { - this.consumedCount++; - this.data.append((char) character); - - ValueNode newState = HtmlEntities1.get().lookup(data.toString(), state.position); - - if (newState == null) - { - return false; - } - else - { - this.state = newState; - return true; - } - } - } - - public static class ValueNode - { - public static ValueNode EMPTY = new ValueNode(""); - - public int position; - public String entity; - public String resolvedValue; - public int length; - public boolean endsWithSemicolon; - public boolean isMatch; - - public ValueNode(final String entity) - { - this.entity = entity; - this.resolvedValue = null; - this.length = entity.length(); - this.endsWithSemicolon = false; - this.isMatch = false; - } - - public ValueNode(final String entity, final String resolvedValue) - { - this.entity = entity; - this.resolvedValue = resolvedValue; - this.length = entity.length(); - this.endsWithSemicolon = entity.endsWith(";"); - this.isMatch = true; - } - - public boolean isMatch() - { - return this.isMatch; - } - - public String matched() - { - return this.entity; - } - - public String resolvedTo() - { - return resolvedValue; - } - } -} diff --git a/benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities2.java b/benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities2.java deleted file mode 100644 index 24561ac0..00000000 --- a/benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities2.java +++ /dev/null @@ -1,227 +0,0 @@ -package org.htmlunit.cyberneko.util; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Optional; -import java.util.Properties; - -import javax.management.RuntimeErrorException; - -import org.htmlunit.cyberneko.HtmlEntitiesParserBenchmark; - -/** - * This is a very specialized tree class for storing HTML entities - * with the ability to look them up in stages. It is driven by an - * char (presented as int) and results in finding a String result at - * the end. We return the last tree node as result, so we can keep - * that as state for the next iterations. The tree itself does not - * keep an active state when being used. - */ -public class HtmlEntities2 -{ - private final static HtmlEntities2 instance = new HtmlEntities2(); - - private Level rootLevel = new Level(); - - /** - * Constructor - */ - private HtmlEntities2() - { - // read the entities defined in the data taken from - try (InputStream stream = HtmlEntitiesParserBenchmark.class.getResourceAsStream("html_entities.properties")) - { - final Properties props = new Properties(); - props.load(stream); - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - if (key.isEmpty()) { - return; - } - - this.rootLevel.add(key, value); - }); - } - catch (IOException e) - { - throw new RuntimeException("Unable to initilaize the HTML entities from file"); - } - } - - /** - * Returns the singleton. The singleton is stateless and can safely be used in a multi-threaded - * context. The - */ - public static HtmlEntities2 get() - { - return instance; - } - - public Optional lookup(final String entityName) - { - Level lastResult = this.rootLevel; - for (int i = 0; i < entityName.length(); i++) - { - Level result = lastResult.lookup(entityName.charAt(i)); - - if (result.endNode) - { - lastResult = result; - break; - } - if (result == lastResult) - { - // nothing changed, more characters have not done anything - break; - } - lastResult = result; - } - - return Optional.of(lastResult); - } - - public Level lookup(final int character, final Level level) - { - return level != null ? level.lookup(character) : rootLevel.lookup(character); - } - - public static class Level - { - private final int depth; - private int[] characters = new int[0]; - private Level[] nextLevel = new Level[0]; - - public final String entityOrFragment; - public String resolvedValue; - public final int length; - public final boolean endsWithSemicolon; - public boolean isMatch; - public boolean endNode; - - public Level() - { - this.entityOrFragment = ""; - this.length = 0; - this.depth = 0; - this.endsWithSemicolon = false; - this.isMatch = false; - this.resolvedValue = null; - this.endNode = false; - } - - public Level(final int depth, final String entityFragment, final String resolvedValue) - { - if (depth == entityFragment.length()) - { - // we are at the end - this.entityOrFragment = entityFragment; - this.length = entityFragment.length(); - this.depth = entityFragment.length(); - this.endsWithSemicolon = entityFragment.endsWith(";"); - this.isMatch = true; - this.resolvedValue = resolvedValue; - this.endNode = entityFragment.endsWith(";"); - } - else - { - // intermediate state - final String currentFragment = entityFragment.substring(0, depth); - - this.entityOrFragment = currentFragment; - this.length = currentFragment.length(); - this.depth = depth; - this.endsWithSemicolon = false; - this.isMatch = false; - this.resolvedValue = null; - this.endNode = false; - } - } - - public void updateNonSemicolonEntity(final String entity, final String resolvedValue) - { - if (entity.endsWith(";")) - { - // nothing to do - return; - } - if (entity.length() == this.depth) - { - // safety check - if (!entity.equals(this.entityOrFragment)) - { - throw new RuntimeException("Illegal state reached"); - } - - this.isMatch = true; - this.resolvedValue = resolvedValue; - } - } - - public void add(final String entity, final String resolvedValue) - { - // ok, any characters left? - if (this.depth >= entity.length()) - { - // no reason to go any further - return; - } - - // get me my character - final char c = entity.charAt(this.depth); - final boolean finalChar = entity.length() - 1 == this.depth; - - // do I already know it? - int pos = 0; - boolean found = false; - for (; pos < characters.length; pos++) - { - if (characters[pos] == c) - { - found = true; - break; - } - } - - if (!found) - { - // we don't know it, make the size bigger and get us the new pos - this.nextLevel = Arrays.copyOf(this.nextLevel, this.nextLevel.length + 1); - this.characters = Arrays.copyOf(this.characters, this.characters.length + 1); - pos = this.characters.length - 1; - - this.characters[pos] = c; - this.nextLevel[pos] = new Level(this.depth + 1, entity, resolvedValue); - - // update next level - this.nextLevel[pos].add(entity, resolvedValue); - } - else - { - // ok, if this one is without a ; and we have the full entity, we - // have a mismatch between one with and one without ; - // change the level - this.nextLevel[pos].updateNonSemicolonEntity(entity, resolvedValue); - this.nextLevel[pos].add(entity, resolvedValue); - } - } - - public Level lookup(int character) - { - for (int i = 0; i < this.characters.length; i++) - { - if (this.characters[i] == character) - { - return this.nextLevel[i]; - } - } - - return this; - } - } - -} diff --git a/benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities3.java b/benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities3.java deleted file mode 100644 index af1f9d63..00000000 --- a/benchmark/src/main/java/org/htmlunit/cyberneko/util/HtmlEntities3.java +++ /dev/null @@ -1,240 +0,0 @@ -package org.htmlunit.cyberneko.util; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Arrays; -import java.util.Optional; -import java.util.Properties; - -import javax.management.RuntimeErrorException; - -import org.htmlunit.cyberneko.HtmlEntitiesParserBenchmark; - -/** - * This is a very specialized tree class for storing HTML entities - * with the ability to look them up in stages. It is driven by an - * char (presented as int) and results in finding a String result at - * the end. We return the last tree node as result, so we can keep - * that as state for the next iterations. The tree itself does not - * keep an active state when being used. - */ -public class HtmlEntities3 -{ - private final static HtmlEntities3 instance = new HtmlEntities3(); - - private Level rootLevel = new Level(); - - /** - * Constructor - */ - private HtmlEntities3() - { - // read the entities defined in the data taken from - try (InputStream stream = HtmlEntitiesParserBenchmark.class.getResourceAsStream("html_entities.properties")) - { - final Properties props = new Properties(); - props.load(stream); - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - if (key.isEmpty()) { - return; - } - - this.rootLevel.add(key, value); - }); - } - catch (IOException e) - { - throw new RuntimeException("Unable to initilaize the HTML entities from file"); - } - } - - /** - * Returns the singleton. The singleton is stateless and can safely be used in a multi-threaded - * context. The - */ - public static HtmlEntities3 get() - { - return instance; - } - - public Optional lookup(final String entityName) - { - Level lastResult = this.rootLevel; - for (int i = 0; i < entityName.length(); i++) - { - Level result = lastResult.lookup(entityName.charAt(i)); - - if (result.endNode) - { - lastResult = result; - break; - } - if (result == lastResult) - { - // nothing changed, more characters have not done anything - break; - } - lastResult = result; - } - - return Optional.of(lastResult); - } - - public Level lookup(final int character, final Level level) - { - return level != null ? level.lookup(character) : rootLevel.lookup(character); - } - - public static class Level - { - private final int depth; - private int[] characters = new int[0]; - private Level[] nextLevel = new Level[0]; - - public final String entityOrFragment; - public String resolvedValue; - public final int length; - public final boolean endsWithSemicolon; - public boolean isMatch; - public boolean endNode; - - public Level() - { - this.entityOrFragment = ""; - this.length = 0; - this.depth = 0; - this.endsWithSemicolon = false; - this.isMatch = false; - this.resolvedValue = null; - this.endNode = false; - } - - public Level(final int depth, final String entityFragment, final String resolvedValue) - { - if (depth == entityFragment.length()) - { - // we are at the end - this.entityOrFragment = entityFragment; - this.length = entityFragment.length(); - this.depth = entityFragment.length(); - this.endsWithSemicolon = entityFragment.endsWith(";"); - this.isMatch = true; - this.resolvedValue = resolvedValue; - this.endNode = entityFragment.endsWith(";"); - } - else - { - // intermediate state - final String currentFragment = entityFragment.substring(0, depth); - - this.entityOrFragment = currentFragment; - this.length = currentFragment.length(); - this.depth = depth; - this.endsWithSemicolon = false; - this.isMatch = false; - this.resolvedValue = null; - this.endNode = false; - } - } - - public void updateNonSemicolonEntity(final String entity, final String resolvedValue) - { - if (entity.endsWith(";")) - { - // nothing to do - return; - } - if (entity.length() == this.depth) - { - // safety check - if (!entity.equals(this.entityOrFragment)) - { - throw new RuntimeException("Illegal state reached"); - } - - this.isMatch = true; - this.resolvedValue = resolvedValue; - } - } - - public void add(final String entity, final String resolvedValue) - { - // ok, any characters left? - if (this.depth >= entity.length()) - { - // no reason to go any further - return; - } - - // get me my character - final char c = entity.charAt(this.depth); - - // do I already know it? - final int pos = Arrays.binarySearch(characters, c); - - if (pos < 0) - { - // we don't know it, make the size bigger and get us the new pos - this.nextLevel = Arrays.copyOf(this.nextLevel, this.nextLevel.length + 1); - this.characters = Arrays.copyOf(this.characters, this.characters.length + 1); - final int newPos = -(pos + 1); - - // move stuff first - if (newPos != this.characters.length - 1) - { - System.arraycopy(this.characters, newPos, this.characters, newPos + 1, this.characters.length - newPos - 1); - System.arraycopy(this.nextLevel, newPos, this.nextLevel, newPos + 1, this.nextLevel.length - newPos - 1); - } - else - { - // we insert at the end, so no move needed - } - final Level newLevel = new Level(this.depth + 1, entity, resolvedValue); - this.characters[newPos] = c; - this.nextLevel[newPos] = newLevel; - - // update next level - newLevel.add(entity, resolvedValue); - } - else - { - // ok, if this one is without a ; and we have the full entity, we - // have a mismatch between one with and one without ; - // change the level - this.nextLevel[pos].updateNonSemicolonEntity(entity, resolvedValue); - this.nextLevel[pos].add(entity, resolvedValue); - } - } - - public Level lookup(int character) - { - // because we have sorted arrays, we can be more efficient here - final int length = this.characters.length; - for (int i = 0; i < length; i++) - { - final int c = this.characters[i]; - if (c < character) - { - continue; - } - if (c == character) - { - // we are over position - return this.nextLevel[i]; - } - else - { - return this; - } - } - - return this; - } - } - -} diff --git a/benchmark/src/main/java/org/htmlunit/cyberneko/util/html_entities.properties b/benchmark/src/main/java/org/htmlunit/cyberneko/util/html_entities.properties deleted file mode 100644 index 63fbee86..00000000 --- a/benchmark/src/main/java/org/htmlunit/cyberneko/util/html_entities.properties +++ /dev/null @@ -1,2231 +0,0 @@ -AElig=\u00C6 -AElig;=\u00C6 -AMP=\u0026 -AMP;=\u0026 -Aacute=\u00C1 -Aacute;=\u00C1 -Abreve;=\u0102 -Acirc=\u00C2 -Acirc;=\u00C2 -Acy;=\u0410 -Afr;=\uD835\uDD04 -Agrave=\u00C0 -Agrave;=\u00C0 -Alpha;=\u0391 -Amacr;=\u0100 -And;=\u2A53 -Aogon;=\u0104 -Aopf;=\uD835\uDD38 -ApplyFunction;=\u2061 -Aring=\u00C5 -Aring;=\u00C5 -Ascr;=\uD835\uDC9C -Assign;=\u2254 -Atilde=\u00C3 -Atilde;=\u00C3 -Auml=\u00C4 -Auml;=\u00C4 -Backslash;=\u2216 -Barv;=\u2AE7 -Barwed;=\u2306 -Bcy;=\u0411 -Because;=\u2235 -Bernoullis;=\u212C -Beta;=\u0392 -Bfr;=\uD835\uDD05 -Bopf;=\uD835\uDD39 -Breve;=\u02D8 -Bscr;=\u212C -Bumpeq;=\u224E -CHcy;=\u0427 -COPY=\u00A9 -COPY;=\u00A9 -Cacute;=\u0106 -Cap;=\u22D2 -CapitalDifferentialD;=\u2145 -Cayleys;=\u212D -Ccaron;=\u010C -Ccedil=\u00C7 -Ccedil;=\u00C7 -Ccirc;=\u0108 -Cconint;=\u2230 -Cdot;=\u010A -Cedilla;=\u00B8 -CenterDot;=\u00B7 -Cfr;=\u212D -Chi;=\u03A7 -CircleDot;=\u2299 -CircleMinus;=\u2296 -CirclePlus;=\u2295 -CircleTimes;=\u2297 -ClockwiseContourIntegral;=\u2232 -CloseCurlyDoubleQuote;=\u201D -CloseCurlyQuote;=\u2019 -Colon;=\u2237 -Colone;=\u2A74 -Congruent;=\u2261 -Conint;=\u222F -ContourIntegral;=\u222E -Copf;=\u2102 -Coproduct;=\u2210 -CounterClockwiseContourIntegral;=\u2233 -Cross;=\u2A2F -Cscr;=\uD835\uDC9E -Cup;=\u22D3 -CupCap;=\u224D -DD;=\u2145 -DDotrahd;=\u2911 -DJcy;=\u0402 -DScy;=\u0405 -DZcy;=\u040F -Dagger;=\u2021 -Darr;=\u21A1 -Dashv;=\u2AE4 -Dcaron;=\u010E -Dcy;=\u0414 -Del;=\u2207 -Delta;=\u0394 -Dfr;=\uD835\uDD07 -DiacriticalAcute;=\u00B4 -DiacriticalDot;=\u02D9 -DiacriticalDoubleAcute;=\u02DD -DiacriticalGrave;=\u0060 -DiacriticalTilde;=\u02DC -Diamond;=\u22C4 -DifferentialD;=\u2146 -Dopf;=\uD835\uDD3B -Dot;=\u00A8 -DotDot;=\u20DC -DotEqual;=\u2250 -DoubleContourIntegral;=\u222F -DoubleDot;=\u00A8 -DoubleDownArrow;=\u21D3 -DoubleLeftArrow;=\u21D0 -DoubleLeftRightArrow;=\u21D4 -DoubleLeftTee;=\u2AE4 -DoubleLongLeftArrow;=\u27F8 -DoubleLongLeftRightArrow;=\u27FA -DoubleLongRightArrow;=\u27F9 -DoubleRightArrow;=\u21D2 -DoubleRightTee;=\u22A8 -DoubleUpArrow;=\u21D1 -DoubleUpDownArrow;=\u21D5 -DoubleVerticalBar;=\u2225 -DownArrow;=\u2193 -DownArrowBar;=\u2913 -DownArrowUpArrow;=\u21F5 -DownBreve;=\u0311 -DownLeftRightVector;=\u2950 -DownLeftTeeVector;=\u295E -DownLeftVector;=\u21BD -DownLeftVectorBar;=\u2956 -DownRightTeeVector;=\u295F -DownRightVector;=\u21C1 -DownRightVectorBar;=\u2957 -DownTee;=\u22A4 -DownTeeArrow;=\u21A7 -Downarrow;=\u21D3 -Dscr;=\uD835\uDC9F -Dstrok;=\u0110 -ENG;=\u014A -ETH=\u00D0 -ETH;=\u00D0 -Eacute=\u00C9 -Eacute;=\u00C9 -Ecaron;=\u011A -Ecirc=\u00CA -Ecirc;=\u00CA -Ecy;=\u042D -Edot;=\u0116 -Efr;=\uD835\uDD08 -Egrave=\u00C8 -Egrave;=\u00C8 -Element;=\u2208 -Emacr;=\u0112 -EmptySmallSquare;=\u25FB -EmptyVerySmallSquare;=\u25AB -Eogon;=\u0118 -Eopf;=\uD835\uDD3C -Epsilon;=\u0395 -Equal;=\u2A75 -EqualTilde;=\u2242 -Equilibrium;=\u21CC -Escr;=\u2130 -Esim;=\u2A73 -Eta;=\u0397 -Euml=\u00CB -Euml;=\u00CB -Exists;=\u2203 -ExponentialE;=\u2147 -Fcy;=\u0424 -Ffr;=\uD835\uDD09 -FilledSmallSquare;=\u25FC -FilledVerySmallSquare;=\u25AA -Fopf;=\uD835\uDD3D -ForAll;=\u2200 -Fouriertrf;=\u2131 -Fscr;=\u2131 -GJcy;=\u0403 -GT=\u003E -GT;=\u003E -Gamma;=\u0393 -Gammad;=\u03DC -Gbreve;=\u011E -Gcedil;=\u0122 -Gcirc;=\u011C -Gcy;=\u0413 -Gdot;=\u0120 -Gfr;=\uD835\uDD0A -Gg;=\u22D9 -Gopf;=\uD835\uDD3E -GreaterEqual;=\u2265 -GreaterEqualLess;=\u22DB -GreaterFullEqual;=\u2267 -GreaterGreater;=\u2AA2 -GreaterLess;=\u2277 -GreaterSlantEqual;=\u2A7E -GreaterTilde;=\u2273 -Gscr;=\uD835\uDCA2 -Gt;=\u226B -HARDcy;=\u042A -Hacek;=\u02C7 -Hat;=\u005E -Hcirc;=\u0124 -Hfr;=\u210C -HilbertSpace;=\u210B -Hopf;=\u210D -HorizontalLine;=\u2500 -Hscr;=\u210B -Hstrok;=\u0126 -HumpDownHump;=\u224E -HumpEqual;=\u224F -IEcy;=\u0415 -IJlig;=\u0132 -IOcy;=\u0401 -Iacute=\u00CD -Iacute;=\u00CD -Icirc=\u00CE -Icirc;=\u00CE -Icy;=\u0418 -Idot;=\u0130 -Ifr;=\u2111 -Igrave=\u00CC -Igrave;=\u00CC -Im;=\u2111 -Imacr;=\u012A -ImaginaryI;=\u2148 -Implies;=\u21D2 -Int;=\u222C -Integral;=\u222B -Intersection;=\u22C2 -InvisibleComma;=\u2063 -InvisibleTimes;=\u2062 -Iogon;=\u012E -Iopf;=\uD835\uDD40 -Iota;=\u0399 -Iscr;=\u2110 -Itilde;=\u0128 -Iukcy;=\u0406 -Iuml=\u00CF -Iuml;=\u00CF -Jcirc;=\u0134 -Jcy;=\u0419 -Jfr;=\uD835\uDD0D -Jopf;=\uD835\uDD41 -Jscr;=\uD835\uDCA5 -Jsercy;=\u0408 -Jukcy;=\u0404 -KHcy;=\u0425 -KJcy;=\u040C -Kappa;=\u039A -Kcedil;=\u0136 -Kcy;=\u041A -Kfr;=\uD835\uDD0E -Kopf;=\uD835\uDD42 -Kscr;=\uD835\uDCA6 -LJcy;=\u0409 -LT=\u003C -LT;=\u003C -Lacute;=\u0139 -Lambda;=\u039B -Lang;=\u27EA -Laplacetrf;=\u2112 -Larr;=\u219E -Lcaron;=\u013D -Lcedil;=\u013B -Lcy;=\u041B -LeftAngleBracket;=\u27E8 -LeftArrow;=\u2190 -LeftArrowBar;=\u21E4 -LeftArrowRightArrow;=\u21C6 -LeftCeiling;=\u2308 -LeftDoubleBracket;=\u27E6 -LeftDownTeeVector;=\u2961 -LeftDownVector;=\u21C3 -LeftDownVectorBar;=\u2959 -LeftFloor;=\u230A -LeftRightArrow;=\u2194 -LeftRightVector;=\u294E -LeftTee;=\u22A3 -LeftTeeArrow;=\u21A4 -LeftTeeVector;=\u295A -LeftTriangle;=\u22B2 -LeftTriangleBar;=\u29CF -LeftTriangleEqual;=\u22B4 -LeftUpDownVector;=\u2951 -LeftUpTeeVector;=\u2960 -LeftUpVector;=\u21BF -LeftUpVectorBar;=\u2958 -LeftVector;=\u21BC -LeftVectorBar;=\u2952 -Leftarrow;=\u21D0 -Leftrightarrow;=\u21D4 -LessEqualGreater;=\u22DA -LessFullEqual;=\u2266 -LessGreater;=\u2276 -LessLess;=\u2AA1 -LessSlantEqual;=\u2A7D -LessTilde;=\u2272 -Lfr;=\uD835\uDD0F -Ll;=\u22D8 -Lleftarrow;=\u21DA -Lmidot;=\u013F -LongLeftArrow;=\u27F5 -LongLeftRightArrow;=\u27F7 -LongRightArrow;=\u27F6 -Longleftarrow;=\u27F8 -Longleftrightarrow;=\u27FA -Longrightarrow;=\u27F9 -Lopf;=\uD835\uDD43 -LowerLeftArrow;=\u2199 -LowerRightArrow;=\u2198 -Lscr;=\u2112 -Lsh;=\u21B0 -Lstrok;=\u0141 -Lt;=\u226A -Map;=\u2905 -Mcy;=\u041C -MediumSpace;=\u205F -Mellintrf;=\u2133 -Mfr;=\uD835\uDD10 -MinusPlus;=\u2213 -Mopf;=\uD835\uDD44 -Mscr;=\u2133 -Mu;=\u039C -NJcy;=\u040A -Nacute;=\u0143 -Ncaron;=\u0147 -Ncedil;=\u0145 -Ncy;=\u041D -NegativeMediumSpace;=\u200B -NegativeThickSpace;=\u200B -NegativeThinSpace;=\u200B -NegativeVeryThinSpace;=\u200B -NestedGreaterGreater;=\u226B -NestedLessLess;=\u226A -NewLine;=\u000A -Nfr;=\uD835\uDD11 -NoBreak;=\u2060 -NonBreakingSpace;=\u00A0 -Nopf;=\u2115 -Not;=\u2AEC -NotCongruent;=\u2262 -NotCupCap;=\u226D -NotDoubleVerticalBar;=\u2226 -NotElement;=\u2209 -NotEqual;=\u2260 -NotEqualTilde;=\u2242\u0338 -NotExists;=\u2204 -NotGreater;=\u226F -NotGreaterEqual;=\u2271 -NotGreaterFullEqual;=\u2267\u0338 -NotGreaterGreater;=\u226B\u0338 -NotGreaterLess;=\u2279 -NotGreaterSlantEqual;=\u2A7E\u0338 -NotGreaterTilde;=\u2275 -NotHumpDownHump;=\u224E\u0338 -NotHumpEqual;=\u224F\u0338 -NotLeftTriangle;=\u22EA -NotLeftTriangleBar;=\u29CF\u0338 -NotLeftTriangleEqual;=\u22EC -NotLess;=\u226E -NotLessEqual;=\u2270 -NotLessGreater;=\u2278 -NotLessLess;=\u226A\u0338 -NotLessSlantEqual;=\u2A7D\u0338 -NotLessTilde;=\u2274 -NotNestedGreaterGreater;=\u2AA2\u0338 -NotNestedLessLess;=\u2AA1\u0338 -NotPrecedes;=\u2280 -NotPrecedesEqual;=\u2AAF\u0338 -NotPrecedesSlantEqual;=\u22E0 -NotReverseElement;=\u220C -NotRightTriangle;=\u22EB -NotRightTriangleBar;=\u29D0\u0338 -NotRightTriangleEqual;=\u22ED -NotSquareSubset;=\u228F\u0338 -NotSquareSubsetEqual;=\u22E2 -NotSquareSuperset;=\u2290\u0338 -NotSquareSupersetEqual;=\u22E3 -NotSubset;=\u2282\u20D2 -NotSubsetEqual;=\u2288 -NotSucceeds;=\u2281 -NotSucceedsEqual;=\u2AB0\u0338 -NotSucceedsSlantEqual;=\u22E1 -NotSucceedsTilde;=\u227F\u0338 -NotSuperset;=\u2283\u20D2 -NotSupersetEqual;=\u2289 -NotTilde;=\u2241 -NotTildeEqual;=\u2244 -NotTildeFullEqual;=\u2247 -NotTildeTilde;=\u2249 -NotVerticalBar;=\u2224 -Nscr;=\uD835\uDCA9 -Ntilde=\u00D1 -Ntilde;=\u00D1 -Nu;=\u039D -OElig;=\u0152 -Oacute=\u00D3 -Oacute;=\u00D3 -Ocirc=\u00D4 -Ocirc;=\u00D4 -Ocy;=\u041E -Odblac;=\u0150 -Ofr;=\uD835\uDD12 -Ograve=\u00D2 -Ograve;=\u00D2 -Omacr;=\u014C -Omega;=\u03A9 -Omicron;=\u039F -Oopf;=\uD835\uDD46 -OpenCurlyDoubleQuote;=\u201C -OpenCurlyQuote;=\u2018 -Or;=\u2A54 -Oscr;=\uD835\uDCAA -Oslash=\u00D8 -Oslash;=\u00D8 -Otilde=\u00D5 -Otilde;=\u00D5 -Otimes;=\u2A37 -Ouml=\u00D6 -Ouml;=\u00D6 -OverBar;=\u203E -OverBrace;=\u23DE -OverBracket;=\u23B4 -OverParenthesis;=\u23DC -PartialD;=\u2202 -Pcy;=\u041F -Pfr;=\uD835\uDD13 -Phi;=\u03A6 -Pi;=\u03A0 -PlusMinus;=\u00B1 -Poincareplane;=\u210C -Popf;=\u2119 -Pr;=\u2ABB -Precedes;=\u227A -PrecedesEqual;=\u2AAF -PrecedesSlantEqual;=\u227C -PrecedesTilde;=\u227E -Prime;=\u2033 -Product;=\u220F -Proportion;=\u2237 -Proportional;=\u221D -Pscr;=\uD835\uDCAB -Psi;=\u03A8 -QUOT=\u0022 -QUOT;=\u0022 -Qfr;=\uD835\uDD14 -Qopf;=\u211A -Qscr;=\uD835\uDCAC -RBarr;=\u2910 -REG=\u00AE -REG;=\u00AE -Racute;=\u0154 -Rang;=\u27EB -Rarr;=\u21A0 -Rarrtl;=\u2916 -Rcaron;=\u0158 -Rcedil;=\u0156 -Rcy;=\u0420 -Re;=\u211C -ReverseElement;=\u220B -ReverseEquilibrium;=\u21CB -ReverseUpEquilibrium;=\u296F -Rfr;=\u211C -Rho;=\u03A1 -RightAngleBracket;=\u27E9 -RightArrow;=\u2192 -RightArrowBar;=\u21E5 -RightArrowLeftArrow;=\u21C4 -RightCeiling;=\u2309 -RightDoubleBracket;=\u27E7 -RightDownTeeVector;=\u295D -RightDownVector;=\u21C2 -RightDownVectorBar;=\u2955 -RightFloor;=\u230B -RightTee;=\u22A2 -RightTeeArrow;=\u21A6 -RightTeeVector;=\u295B -RightTriangle;=\u22B3 -RightTriangleBar;=\u29D0 -RightTriangleEqual;=\u22B5 -RightUpDownVector;=\u294F -RightUpTeeVector;=\u295C -RightUpVector;=\u21BE -RightUpVectorBar;=\u2954 -RightVector;=\u21C0 -RightVectorBar;=\u2953 -Rightarrow;=\u21D2 -Ropf;=\u211D -RoundImplies;=\u2970 -Rrightarrow;=\u21DB -Rscr;=\u211B -Rsh;=\u21B1 -RuleDelayed;=\u29F4 -SHCHcy;=\u0429 -SHcy;=\u0428 -SOFTcy;=\u042C -Sacute;=\u015A -Sc;=\u2ABC -Scaron;=\u0160 -Scedil;=\u015E -Scirc;=\u015C -Scy;=\u0421 -Sfr;=\uD835\uDD16 -ShortDownArrow;=\u2193 -ShortLeftArrow;=\u2190 -ShortRightArrow;=\u2192 -ShortUpArrow;=\u2191 -Sigma;=\u03A3 -SmallCircle;=\u2218 -Sopf;=\uD835\uDD4A -Sqrt;=\u221A -Square;=\u25A1 -SquareIntersection;=\u2293 -SquareSubset;=\u228F -SquareSubsetEqual;=\u2291 -SquareSuperset;=\u2290 -SquareSupersetEqual;=\u2292 -SquareUnion;=\u2294 -Sscr;=\uD835\uDCAE -Star;=\u22C6 -Sub;=\u22D0 -Subset;=\u22D0 -SubsetEqual;=\u2286 -Succeeds;=\u227B -SucceedsEqual;=\u2AB0 -SucceedsSlantEqual;=\u227D -SucceedsTilde;=\u227F -SuchThat;=\u220B -Sum;=\u2211 -Sup;=\u22D1 -Superset;=\u2283 -SupersetEqual;=\u2287 -Supset;=\u22D1 -THORN=\u00DE -THORN;=\u00DE -TRADE;=\u2122 -TSHcy;=\u040B -TScy;=\u0426 -Tab;=\u0009 -Tau;=\u03A4 -Tcaron;=\u0164 -Tcedil;=\u0162 -Tcy;=\u0422 -Tfr;=\uD835\uDD17 -Therefore;=\u2234 -Theta;=\u0398 -ThickSpace;=\u205F\u200A -ThinSpace;=\u2009 -Tilde;=\u223C -TildeEqual;=\u2243 -TildeFullEqual;=\u2245 -TildeTilde;=\u2248 -Topf;=\uD835\uDD4B -TripleDot;=\u20DB -Tscr;=\uD835\uDCAF -Tstrok;=\u0166 -Uacute=\u00DA -Uacute;=\u00DA -Uarr;=\u219F -Uarrocir;=\u2949 -Ubrcy;=\u040E -Ubreve;=\u016C -Ucirc=\u00DB -Ucirc;=\u00DB -Ucy;=\u0423 -Udblac;=\u0170 -Ufr;=\uD835\uDD18 -Ugrave=\u00D9 -Ugrave;=\u00D9 -Umacr;=\u016A -UnderBar;=\u005F -UnderBrace;=\u23DF -UnderBracket;=\u23B5 -UnderParenthesis;=\u23DD -Union;=\u22C3 -UnionPlus;=\u228E -Uogon;=\u0172 -Uopf;=\uD835\uDD4C -UpArrow;=\u2191 -UpArrowBar;=\u2912 -UpArrowDownArrow;=\u21C5 -UpDownArrow;=\u2195 -UpEquilibrium;=\u296E -UpTee;=\u22A5 -UpTeeArrow;=\u21A5 -Uparrow;=\u21D1 -Updownarrow;=\u21D5 -UpperLeftArrow;=\u2196 -UpperRightArrow;=\u2197 -Upsi;=\u03D2 -Upsilon;=\u03A5 -Uring;=\u016E -Uscr;=\uD835\uDCB0 -Utilde;=\u0168 -Uuml=\u00DC -Uuml;=\u00DC -VDash;=\u22AB -Vbar;=\u2AEB -Vcy;=\u0412 -Vdash;=\u22A9 -Vdashl;=\u2AE6 -Vee;=\u22C1 -Verbar;=\u2016 -Vert;=\u2016 -VerticalBar;=\u2223 -VerticalLine;=\u007C -VerticalSeparator;=\u2758 -VerticalTilde;=\u2240 -VeryThinSpace;=\u200A -Vfr;=\uD835\uDD19 -Vopf;=\uD835\uDD4D -Vscr;=\uD835\uDCB1 -Vvdash;=\u22AA -Wcirc;=\u0174 -Wedge;=\u22C0 -Wfr;=\uD835\uDD1A -Wopf;=\uD835\uDD4E -Wscr;=\uD835\uDCB2 -Xfr;=\uD835\uDD1B -Xi;=\u039E -Xopf;=\uD835\uDD4F -Xscr;=\uD835\uDCB3 -YAcy;=\u042F -YIcy;=\u0407 -YUcy;=\u042E -Yacute=\u00DD -Yacute;=\u00DD -Ycirc;=\u0176 -Ycy;=\u042B -Yfr;=\uD835\uDD1C -Yopf;=\uD835\uDD50 -Yscr;=\uD835\uDCB4 -Yuml;=\u0178 -ZHcy;=\u0416 -Zacute;=\u0179 -Zcaron;=\u017D -Zcy;=\u0417 -Zdot;=\u017B -ZeroWidthSpace;=\u200B -Zeta;=\u0396 -Zfr;=\u2128 -Zopf;=\u2124 -Zscr;=\uD835\uDCB5 -aacute=\u00E1 -aacute;=\u00E1 -abreve;=\u0103 -ac;=\u223E -acE;=\u223E\u0333 -acd;=\u223F -acirc=\u00E2 -acirc;=\u00E2 -acute=\u00B4 -acute;=\u00B4 -acy;=\u0430 -aelig=\u00E6 -aelig;=\u00E6 -af;=\u2061 -afr;=\uD835\uDD1E -agrave=\u00E0 -agrave;=\u00E0 -alefsym;=\u2135 -aleph;=\u2135 -alpha;=\u03B1 -amacr;=\u0101 -amalg;=\u2A3F -amp=\u0026 -amp;=\u0026 -and;=\u2227 -andand;=\u2A55 -andd;=\u2A5C -andslope;=\u2A58 -andv;=\u2A5A -ang;=\u2220 -ange;=\u29A4 -angle;=\u2220 -angmsd;=\u2221 -angmsdaa;=\u29A8 -angmsdab;=\u29A9 -angmsdac;=\u29AA -angmsdad;=\u29AB -angmsdae;=\u29AC -angmsdaf;=\u29AD -angmsdag;=\u29AE -angmsdah;=\u29AF -angrt;=\u221F -angrtvb;=\u22BE -angrtvbd;=\u299D -angsph;=\u2222 -angst;=\u00C5 -angzarr;=\u237C -aogon;=\u0105 -aopf;=\uD835\uDD52 -ap;=\u2248 -apE;=\u2A70 -apacir;=\u2A6F -ape;=\u224A -apid;=\u224B -apos;=\u0027 -approx;=\u2248 -approxeq;=\u224A -aring=\u00E5 -aring;=\u00E5 -ascr;=\uD835\uDCB6 -ast;=\u002A -asymp;=\u2248 -asympeq;=\u224D -atilde=\u00E3 -atilde;=\u00E3 -auml=\u00E4 -auml;=\u00E4 -awconint;=\u2233 -awint;=\u2A11 -bNot;=\u2AED -backcong;=\u224C -backepsilon;=\u03F6 -backprime;=\u2035 -backsim;=\u223D -backsimeq;=\u22CD -barvee;=\u22BD -barwed;=\u2305 -barwedge;=\u2305 -bbrk;=\u23B5 -bbrktbrk;=\u23B6 -bcong;=\u224C -bcy;=\u0431 -bdquo;=\u201E -becaus;=\u2235 -because;=\u2235 -bemptyv;=\u29B0 -bepsi;=\u03F6 -bernou;=\u212C -beta;=\u03B2 -beth;=\u2136 -between;=\u226C -bfr;=\uD835\uDD1F -bigcap;=\u22C2 -bigcirc;=\u25EF -bigcup;=\u22C3 -bigodot;=\u2A00 -bigoplus;=\u2A01 -bigotimes;=\u2A02 -bigsqcup;=\u2A06 -bigstar;=\u2605 -bigtriangledown;=\u25BD -bigtriangleup;=\u25B3 -biguplus;=\u2A04 -bigvee;=\u22C1 -bigwedge;=\u22C0 -bkarow;=\u290D -blacklozenge;=\u29EB -blacksquare;=\u25AA -blacktriangle;=\u25B4 -blacktriangledown;=\u25BE -blacktriangleleft;=\u25C2 -blacktriangleright;=\u25B8 -blank;=\u2423 -blk12;=\u2592 -blk14;=\u2591 -blk34;=\u2593 -block;=\u2588 -bne;=\u003D\u20E5 -bnequiv;=\u2261\u20E5 -bnot;=\u2310 -bopf;=\uD835\uDD53 -bot;=\u22A5 -bottom;=\u22A5 -bowtie;=\u22C8 -boxDL;=\u2557 -boxDR;=\u2554 -boxDl;=\u2556 -boxDr;=\u2553 -boxH;=\u2550 -boxHD;=\u2566 -boxHU;=\u2569 -boxHd;=\u2564 -boxHu;=\u2567 -boxUL;=\u255D -boxUR;=\u255A -boxUl;=\u255C -boxUr;=\u2559 -boxV;=\u2551 -boxVH;=\u256C -boxVL;=\u2563 -boxVR;=\u2560 -boxVh;=\u256B -boxVl;=\u2562 -boxVr;=\u255F -boxbox;=\u29C9 -boxdL;=\u2555 -boxdR;=\u2552 -boxdl;=\u2510 -boxdr;=\u250C -boxh;=\u2500 -boxhD;=\u2565 -boxhU;=\u2568 -boxhd;=\u252C -boxhu;=\u2534 -boxminus;=\u229F -boxplus;=\u229E -boxtimes;=\u22A0 -boxuL;=\u255B -boxuR;=\u2558 -boxul;=\u2518 -boxur;=\u2514 -boxv;=\u2502 -boxvH;=\u256A -boxvL;=\u2561 -boxvR;=\u255E -boxvh;=\u253C -boxvl;=\u2524 -boxvr;=\u251C -bprime;=\u2035 -breve;=\u02D8 -brvbar=\u00A6 -brvbar;=\u00A6 -bscr;=\uD835\uDCB7 -bsemi;=\u204F -bsim;=\u223D -bsime;=\u22CD -bsol;=\u005C -bsolb;=\u29C5 -bsolhsub;=\u27C8 -bull;=\u2022 -bullet;=\u2022 -bump;=\u224E -bumpE;=\u2AAE -bumpe;=\u224F -bumpeq;=\u224F -cacute;=\u0107 -cap;=\u2229 -capand;=\u2A44 -capbrcup;=\u2A49 -capcap;=\u2A4B -capcup;=\u2A47 -capdot;=\u2A40 -caps;=\u2229\uFE00 -caret;=\u2041 -caron;=\u02C7 -ccaps;=\u2A4D -ccaron;=\u010D -ccedil=\u00E7 -ccedil;=\u00E7 -ccirc;=\u0109 -ccups;=\u2A4C -ccupssm;=\u2A50 -cdot;=\u010B -cedil=\u00B8 -cedil;=\u00B8 -cemptyv;=\u29B2 -cent=\u00A2 -cent;=\u00A2 -centerdot;=\u00B7 -cfr;=\uD835\uDD20 -chcy;=\u0447 -check;=\u2713 -checkmark;=\u2713 -chi;=\u03C7 -cir;=\u25CB -cirE;=\u29C3 -circ;=\u02C6 -circeq;=\u2257 -circlearrowleft;=\u21BA -circlearrowright;=\u21BB -circledR;=\u00AE -circledS;=\u24C8 -circledast;=\u229B -circledcirc;=\u229A -circleddash;=\u229D -cire;=\u2257 -cirfnint;=\u2A10 -cirmid;=\u2AEF -cirscir;=\u29C2 -clubs;=\u2663 -clubsuit;=\u2663 -colon;=\u003A -colone;=\u2254 -coloneq;=\u2254 -comma;=\u002C -commat;=\u0040 -comp;=\u2201 -compfn;=\u2218 -complement;=\u2201 -complexes;=\u2102 -cong;=\u2245 -congdot;=\u2A6D -conint;=\u222E -copf;=\uD835\uDD54 -coprod;=\u2210 -copy=\u00A9 -copy;=\u00A9 -copysr;=\u2117 -crarr;=\u21B5 -cross;=\u2717 -cscr;=\uD835\uDCB8 -csub;=\u2ACF -csube;=\u2AD1 -csup;=\u2AD0 -csupe;=\u2AD2 -ctdot;=\u22EF -cudarrl;=\u2938 -cudarrr;=\u2935 -cuepr;=\u22DE -cuesc;=\u22DF -cularr;=\u21B6 -cularrp;=\u293D -cup;=\u222A -cupbrcap;=\u2A48 -cupcap;=\u2A46 -cupcup;=\u2A4A -cupdot;=\u228D -cupor;=\u2A45 -cups;=\u222A\uFE00 -curarr;=\u21B7 -curarrm;=\u293C -curlyeqprec;=\u22DE -curlyeqsucc;=\u22DF -curlyvee;=\u22CE -curlywedge;=\u22CF -curren=\u00A4 -curren;=\u00A4 -curvearrowleft;=\u21B6 -curvearrowright;=\u21B7 -cuvee;=\u22CE -cuwed;=\u22CF -cwconint;=\u2232 -cwint;=\u2231 -cylcty;=\u232D -dArr;=\u21D3 -dHar;=\u2965 -dagger;=\u2020 -daleth;=\u2138 -darr;=\u2193 -dash;=\u2010 -dashv;=\u22A3 -dbkarow;=\u290F -dblac;=\u02DD -dcaron;=\u010F -dcy;=\u0434 -dd;=\u2146 -ddagger;=\u2021 -ddarr;=\u21CA -ddotseq;=\u2A77 -deg=\u00B0 -deg;=\u00B0 -delta;=\u03B4 -demptyv;=\u29B1 -dfisht;=\u297F -dfr;=\uD835\uDD21 -dharl;=\u21C3 -dharr;=\u21C2 -diam;=\u22C4 -diamond;=\u22C4 -diamondsuit;=\u2666 -diams;=\u2666 -die;=\u00A8 -digamma;=\u03DD -disin;=\u22F2 -div;=\u00F7 -divide=\u00F7 -divide;=\u00F7 -divideontimes;=\u22C7 -divonx;=\u22C7 -djcy;=\u0452 -dlcorn;=\u231E -dlcrop;=\u230D -dollar;=\u0024 -dopf;=\uD835\uDD55 -dot;=\u02D9 -doteq;=\u2250 -doteqdot;=\u2251 -dotminus;=\u2238 -dotplus;=\u2214 -dotsquare;=\u22A1 -doublebarwedge;=\u2306 -downarrow;=\u2193 -downdownarrows;=\u21CA -downharpoonleft;=\u21C3 -downharpoonright;=\u21C2 -drbkarow;=\u2910 -drcorn;=\u231F -drcrop;=\u230C -dscr;=\uD835\uDCB9 -dscy;=\u0455 -dsol;=\u29F6 -dstrok;=\u0111 -dtdot;=\u22F1 -dtri;=\u25BF -dtrif;=\u25BE -duarr;=\u21F5 -duhar;=\u296F -dwangle;=\u29A6 -dzcy;=\u045F -dzigrarr;=\u27FF -eDDot;=\u2A77 -eDot;=\u2251 -eacute=\u00E9 -eacute;=\u00E9 -easter;=\u2A6E -ecaron;=\u011B -ecir;=\u2256 -ecirc=\u00EA -ecirc;=\u00EA -ecolon;=\u2255 -ecy;=\u044D -edot;=\u0117 -ee;=\u2147 -efDot;=\u2252 -efr;=\uD835\uDD22 -eg;=\u2A9A -egrave=\u00E8 -egrave;=\u00E8 -egs;=\u2A96 -egsdot;=\u2A98 -el;=\u2A99 -elinters;=\u23E7 -ell;=\u2113 -els;=\u2A95 -elsdot;=\u2A97 -emacr;=\u0113 -empty;=\u2205 -emptyset;=\u2205 -emptyv;=\u2205 -emsp13;=\u2004 -emsp14;=\u2005 -emsp;=\u2003 -eng;=\u014B -ensp;=\u2002 -eogon;=\u0119 -eopf;=\uD835\uDD56 -epar;=\u22D5 -eparsl;=\u29E3 -eplus;=\u2A71 -epsi;=\u03B5 -epsilon;=\u03B5 -epsiv;=\u03F5 -eqcirc;=\u2256 -eqcolon;=\u2255 -eqsim;=\u2242 -eqslantgtr;=\u2A96 -eqslantless;=\u2A95 -equals;=\u003D -equest;=\u225F -equiv;=\u2261 -equivDD;=\u2A78 -eqvparsl;=\u29E5 -erDot;=\u2253 -erarr;=\u2971 -escr;=\u212F -esdot;=\u2250 -esim;=\u2242 -eta;=\u03B7 -eth=\u00F0 -eth;=\u00F0 -euml=\u00EB -euml;=\u00EB -euro;=\u20AC -excl;=\u0021 -exist;=\u2203 -expectation;=\u2130 -exponentiale;=\u2147 -fallingdotseq;=\u2252 -fcy;=\u0444 -female;=\u2640 -ffilig;=\uFB03 -fflig;=\uFB00 -ffllig;=\uFB04 -ffr;=\uD835\uDD23 -filig;=\uFB01 -fjlig;=\u0066\u006A -flat;=\u266D -fllig;=\uFB02 -fltns;=\u25B1 -fnof;=\u0192 -fopf;=\uD835\uDD57 -forall;=\u2200 -fork;=\u22D4 -forkv;=\u2AD9 -fpartint;=\u2A0D -frac12=\u00BD -frac12;=\u00BD -frac13;=\u2153 -frac14=\u00BC -frac14;=\u00BC -frac15;=\u2155 -frac16;=\u2159 -frac18;=\u215B -frac23;=\u2154 -frac25;=\u2156 -frac34=\u00BE -frac34;=\u00BE -frac35;=\u2157 -frac38;=\u215C -frac45;=\u2158 -frac56;=\u215A -frac58;=\u215D -frac78;=\u215E -frasl;=\u2044 -frown;=\u2322 -fscr;=\uD835\uDCBB -gE;=\u2267 -gEl;=\u2A8C -gacute;=\u01F5 -gamma;=\u03B3 -gammad;=\u03DD -gap;=\u2A86 -gbreve;=\u011F -gcirc;=\u011D -gcy;=\u0433 -gdot;=\u0121 -ge;=\u2265 -gel;=\u22DB -geq;=\u2265 -geqq;=\u2267 -geqslant;=\u2A7E -ges;=\u2A7E -gescc;=\u2AA9 -gesdot;=\u2A80 -gesdoto;=\u2A82 -gesdotol;=\u2A84 -gesl;=\u22DB\uFE00 -gesles;=\u2A94 -gfr;=\uD835\uDD24 -gg;=\u226B -ggg;=\u22D9 -gimel;=\u2137 -gjcy;=\u0453 -gl;=\u2277 -glE;=\u2A92 -gla;=\u2AA5 -glj;=\u2AA4 -gnE;=\u2269 -gnap;=\u2A8A -gnapprox;=\u2A8A -gne;=\u2A88 -gneq;=\u2A88 -gneqq;=\u2269 -gnsim;=\u22E7 -gopf;=\uD835\uDD58 -grave;=\u0060 -gscr;=\u210A -gsim;=\u2273 -gsime;=\u2A8E -gsiml;=\u2A90 -gt=\u003E -gt;=\u003E -gtcc;=\u2AA7 -gtcir;=\u2A7A -gtdot;=\u22D7 -gtlPar;=\u2995 -gtquest;=\u2A7C -gtrapprox;=\u2A86 -gtrarr;=\u2978 -gtrdot;=\u22D7 -gtreqless;=\u22DB -gtreqqless;=\u2A8C -gtrless;=\u2277 -gtrsim;=\u2273 -gvertneqq;=\u2269\uFE00 -gvnE;=\u2269\uFE00 -hArr;=\u21D4 -hairsp;=\u200A -half;=\u00BD -hamilt;=\u210B -hardcy;=\u044A -harr;=\u2194 -harrcir;=\u2948 -harrw;=\u21AD -hbar;=\u210F -hcirc;=\u0125 -hearts;=\u2665 -heartsuit;=\u2665 -hellip;=\u2026 -hercon;=\u22B9 -hfr;=\uD835\uDD25 -hksearow;=\u2925 -hkswarow;=\u2926 -hoarr;=\u21FF -homtht;=\u223B -hookleftarrow;=\u21A9 -hookrightarrow;=\u21AA -hopf;=\uD835\uDD59 -horbar;=\u2015 -hscr;=\uD835\uDCBD -hslash;=\u210F -hstrok;=\u0127 -hybull;=\u2043 -hyphen;=\u2010 -iacute=\u00ED -iacute;=\u00ED -ic;=\u2063 -icirc=\u00EE -icirc;=\u00EE -icy;=\u0438 -iecy;=\u0435 -iexcl=\u00A1 -iexcl;=\u00A1 -iff;=\u21D4 -ifr;=\uD835\uDD26 -igrave=\u00EC -igrave;=\u00EC -ii;=\u2148 -iiiint;=\u2A0C -iiint;=\u222D -iinfin;=\u29DC -iiota;=\u2129 -ijlig;=\u0133 -imacr;=\u012B -image;=\u2111 -imagline;=\u2110 -imagpart;=\u2111 -imath;=\u0131 -imof;=\u22B7 -imped;=\u01B5 -in;=\u2208 -incare;=\u2105 -infin;=\u221E -infintie;=\u29DD -inodot;=\u0131 -int;=\u222B -intcal;=\u22BA -integers;=\u2124 -intercal;=\u22BA -intlarhk;=\u2A17 -intprod;=\u2A3C -iocy;=\u0451 -iogon;=\u012F -iopf;=\uD835\uDD5A -iota;=\u03B9 -iprod;=\u2A3C -iquest=\u00BF -iquest;=\u00BF -iscr;=\uD835\uDCBE -isin;=\u2208 -isinE;=\u22F9 -isindot;=\u22F5 -isins;=\u22F4 -isinsv;=\u22F3 -isinv;=\u2208 -it;=\u2062 -itilde;=\u0129 -iukcy;=\u0456 -iuml=\u00EF -iuml;=\u00EF -jcirc;=\u0135 -jcy;=\u0439 -jfr;=\uD835\uDD27 -jmath;=\u0237 -jopf;=\uD835\uDD5B -jscr;=\uD835\uDCBF -jsercy;=\u0458 -jukcy;=\u0454 -kappa;=\u03BA -kappav;=\u03F0 -kcedil;=\u0137 -kcy;=\u043A -kfr;=\uD835\uDD28 -kgreen;=\u0138 -khcy;=\u0445 -kjcy;=\u045C -kopf;=\uD835\uDD5C -kscr;=\uD835\uDCC0 -lAarr;=\u21DA -lArr;=\u21D0 -lAtail;=\u291B -lBarr;=\u290E -lE;=\u2266 -lEg;=\u2A8B -lHar;=\u2962 -lacute;=\u013A -laemptyv;=\u29B4 -lagran;=\u2112 -lambda;=\u03BB -lang;=\u27E8 -langd;=\u2991 -langle;=\u27E8 -lap;=\u2A85 -laquo=\u00AB -laquo;=\u00AB -larr;=\u2190 -larrb;=\u21E4 -larrbfs;=\u291F -larrfs;=\u291D -larrhk;=\u21A9 -larrlp;=\u21AB -larrpl;=\u2939 -larrsim;=\u2973 -larrtl;=\u21A2 -lat;=\u2AAB -latail;=\u2919 -late;=\u2AAD -lates;=\u2AAD\uFE00 -lbarr;=\u290C -lbbrk;=\u2772 -lbrace;=\u007B -lbrack;=\u005B -lbrke;=\u298B -lbrksld;=\u298F -lbrkslu;=\u298D -lcaron;=\u013E -lcedil;=\u013C -lceil;=\u2308 -lcub;=\u007B -lcy;=\u043B -ldca;=\u2936 -ldquo;=\u201C -ldquor;=\u201E -ldrdhar;=\u2967 -ldrushar;=\u294B -ldsh;=\u21B2 -le;=\u2264 -leftarrow;=\u2190 -leftarrowtail;=\u21A2 -leftharpoondown;=\u21BD -leftharpoonup;=\u21BC -leftleftarrows;=\u21C7 -leftrightarrow;=\u2194 -leftrightarrows;=\u21C6 -leftrightharpoons;=\u21CB -leftrightsquigarrow;=\u21AD -leftthreetimes;=\u22CB -leg;=\u22DA -leq;=\u2264 -leqq;=\u2266 -leqslant;=\u2A7D -les;=\u2A7D -lescc;=\u2AA8 -lesdot;=\u2A7F -lesdoto;=\u2A81 -lesdotor;=\u2A83 -lesg;=\u22DA\uFE00 -lesges;=\u2A93 -lessapprox;=\u2A85 -lessdot;=\u22D6 -lesseqgtr;=\u22DA -lesseqqgtr;=\u2A8B -lessgtr;=\u2276 -lesssim;=\u2272 -lfisht;=\u297C -lfloor;=\u230A -lfr;=\uD835\uDD29 -lg;=\u2276 -lgE;=\u2A91 -lhard;=\u21BD -lharu;=\u21BC -lharul;=\u296A -lhblk;=\u2584 -ljcy;=\u0459 -ll;=\u226A -llarr;=\u21C7 -llcorner;=\u231E -llhard;=\u296B -lltri;=\u25FA -lmidot;=\u0140 -lmoust;=\u23B0 -lmoustache;=\u23B0 -lnE;=\u2268 -lnap;=\u2A89 -lnapprox;=\u2A89 -lne;=\u2A87 -lneq;=\u2A87 -lneqq;=\u2268 -lnsim;=\u22E6 -loang;=\u27EC -loarr;=\u21FD -lobrk;=\u27E6 -longleftarrow;=\u27F5 -longleftrightarrow;=\u27F7 -longmapsto;=\u27FC -longrightarrow;=\u27F6 -looparrowleft;=\u21AB -looparrowright;=\u21AC -lopar;=\u2985 -lopf;=\uD835\uDD5D -loplus;=\u2A2D -lotimes;=\u2A34 -lowast;=\u2217 -lowbar;=\u005F -loz;=\u25CA -lozenge;=\u25CA -lozf;=\u29EB -lpar;=\u0028 -lparlt;=\u2993 -lrarr;=\u21C6 -lrcorner;=\u231F -lrhar;=\u21CB -lrhard;=\u296D -lrm;=\u200E -lrtri;=\u22BF -lsaquo;=\u2039 -lscr;=\uD835\uDCC1 -lsh;=\u21B0 -lsim;=\u2272 -lsime;=\u2A8D -lsimg;=\u2A8F -lsqb;=\u005B -lsquo;=\u2018 -lsquor;=\u201A -lstrok;=\u0142 -lt=\u003C -lt;=\u003C -ltcc;=\u2AA6 -ltcir;=\u2A79 -ltdot;=\u22D6 -lthree;=\u22CB -ltimes;=\u22C9 -ltlarr;=\u2976 -ltquest;=\u2A7B -ltrPar;=\u2996 -ltri;=\u25C3 -ltrie;=\u22B4 -ltrif;=\u25C2 -lurdshar;=\u294A -luruhar;=\u2966 -lvertneqq;=\u2268\uFE00 -lvnE;=\u2268\uFE00 -mDDot;=\u223A -macr=\u00AF -macr;=\u00AF -male;=\u2642 -malt;=\u2720 -maltese;=\u2720 -map;=\u21A6 -mapsto;=\u21A6 -mapstodown;=\u21A7 -mapstoleft;=\u21A4 -mapstoup;=\u21A5 -marker;=\u25AE -mcomma;=\u2A29 -mcy;=\u043C -mdash;=\u2014 -measuredangle;=\u2221 -mfr;=\uD835\uDD2A -mho;=\u2127 -micro=\u00B5 -micro;=\u00B5 -mid;=\u2223 -midast;=\u002A -midcir;=\u2AF0 -middot=\u00B7 -middot;=\u00B7 -minus;=\u2212 -minusb;=\u229F -minusd;=\u2238 -minusdu;=\u2A2A -mlcp;=\u2ADB -mldr;=\u2026 -mnplus;=\u2213 -models;=\u22A7 -mopf;=\uD835\uDD5E -mp;=\u2213 -mscr;=\uD835\uDCC2 -mstpos;=\u223E -mu;=\u03BC -multimap;=\u22B8 -mumap;=\u22B8 -nGg;=\u22D9\u0338 -nGt;=\u226B\u20D2 -nGtv;=\u226B\u0338 -nLeftarrow;=\u21CD -nLeftrightarrow;=\u21CE -nLl;=\u22D8\u0338 -nLt;=\u226A\u20D2 -nLtv;=\u226A\u0338 -nRightarrow;=\u21CF -nVDash;=\u22AF -nVdash;=\u22AE -nabla;=\u2207 -nacute;=\u0144 -nang;=\u2220\u20D2 -nap;=\u2249 -napE;=\u2A70\u0338 -napid;=\u224B\u0338 -napos;=\u0149 -napprox;=\u2249 -natur;=\u266E -natural;=\u266E -naturals;=\u2115 -nbsp=\u00A0 -nbsp;=\u00A0 -nbump;=\u224E\u0338 -nbumpe;=\u224F\u0338 -ncap;=\u2A43 -ncaron;=\u0148 -ncedil;=\u0146 -ncong;=\u2247 -ncongdot;=\u2A6D\u0338 -ncup;=\u2A42 -ncy;=\u043D -ndash;=\u2013 -ne;=\u2260 -neArr;=\u21D7 -nearhk;=\u2924 -nearr;=\u2197 -nearrow;=\u2197 -nedot;=\u2250\u0338 -nequiv;=\u2262 -nesear;=\u2928 -nesim;=\u2242\u0338 -nexist;=\u2204 -nexists;=\u2204 -nfr;=\uD835\uDD2B -ngE;=\u2267\u0338 -nge;=\u2271 -ngeq;=\u2271 -ngeqq;=\u2267\u0338 -ngeqslant;=\u2A7E\u0338 -nges;=\u2A7E\u0338 -ngsim;=\u2275 -ngt;=\u226F -ngtr;=\u226F -nhArr;=\u21CE -nharr;=\u21AE -nhpar;=\u2AF2 -ni;=\u220B -nis;=\u22FC -nisd;=\u22FA -niv;=\u220B -njcy;=\u045A -nlArr;=\u21CD -nlE;=\u2266\u0338 -nlarr;=\u219A -nldr;=\u2025 -nle;=\u2270 -nleftarrow;=\u219A -nleftrightarrow;=\u21AE -nleq;=\u2270 -nleqq;=\u2266\u0338 -nleqslant;=\u2A7D\u0338 -nles;=\u2A7D\u0338 -nless;=\u226E -nlsim;=\u2274 -nlt;=\u226E -nltri;=\u22EA -nltrie;=\u22EC -nmid;=\u2224 -nopf;=\uD835\uDD5F -not=\u00AC -not;=\u00AC -notin;=\u2209 -notinE;=\u22F9\u0338 -notindot;=\u22F5\u0338 -notinva;=\u2209 -notinvb;=\u22F7 -notinvc;=\u22F6 -notni;=\u220C -notniva;=\u220C -notnivb;=\u22FE -notnivc;=\u22FD -npar;=\u2226 -nparallel;=\u2226 -nparsl;=\u2AFD\u20E5 -npart;=\u2202\u0338 -npolint;=\u2A14 -npr;=\u2280 -nprcue;=\u22E0 -npre;=\u2AAF\u0338 -nprec;=\u2280 -npreceq;=\u2AAF\u0338 -nrArr;=\u21CF -nrarr;=\u219B -nrarrc;=\u2933\u0338 -nrarrw;=\u219D\u0338 -nrightarrow;=\u219B -nrtri;=\u22EB -nrtrie;=\u22ED -nsc;=\u2281 -nsccue;=\u22E1 -nsce;=\u2AB0\u0338 -nscr;=\uD835\uDCC3 -nshortmid;=\u2224 -nshortparallel;=\u2226 -nsim;=\u2241 -nsime;=\u2244 -nsimeq;=\u2244 -nsmid;=\u2224 -nspar;=\u2226 -nsqsube;=\u22E2 -nsqsupe;=\u22E3 -nsub;=\u2284 -nsubE;=\u2AC5\u0338 -nsube;=\u2288 -nsubset;=\u2282\u20D2 -nsubseteq;=\u2288 -nsubseteqq;=\u2AC5\u0338 -nsucc;=\u2281 -nsucceq;=\u2AB0\u0338 -nsup;=\u2285 -nsupE;=\u2AC6\u0338 -nsupe;=\u2289 -nsupset;=\u2283\u20D2 -nsupseteq;=\u2289 -nsupseteqq;=\u2AC6\u0338 -ntgl;=\u2279 -ntilde=\u00F1 -ntilde;=\u00F1 -ntlg;=\u2278 -ntriangleleft;=\u22EA -ntrianglelefteq;=\u22EC -ntriangleright;=\u22EB -ntrianglerighteq;=\u22ED -nu;=\u03BD -num;=\u0023 -numero;=\u2116 -numsp;=\u2007 -nvDash;=\u22AD -nvHarr;=\u2904 -nvap;=\u224D\u20D2 -nvdash;=\u22AC -nvge;=\u2265\u20D2 -nvgt;=\u003E\u20D2 -nvinfin;=\u29DE -nvlArr;=\u2902 -nvle;=\u2264\u20D2 -nvlt;=\u003C\u20D2 -nvltrie;=\u22B4\u20D2 -nvrArr;=\u2903 -nvrtrie;=\u22B5\u20D2 -nvsim;=\u223C\u20D2 -nwArr;=\u21D6 -nwarhk;=\u2923 -nwarr;=\u2196 -nwarrow;=\u2196 -nwnear;=\u2927 -oS;=\u24C8 -oacute=\u00F3 -oacute;=\u00F3 -oast;=\u229B -ocir;=\u229A -ocirc=\u00F4 -ocirc;=\u00F4 -ocy;=\u043E -odash;=\u229D -odblac;=\u0151 -odiv;=\u2A38 -odot;=\u2299 -odsold;=\u29BC -oelig;=\u0153 -ofcir;=\u29BF -ofr;=\uD835\uDD2C -ogon;=\u02DB -ograve=\u00F2 -ograve;=\u00F2 -ogt;=\u29C1 -ohbar;=\u29B5 -ohm;=\u03A9 -oint;=\u222E -olarr;=\u21BA -olcir;=\u29BE -olcross;=\u29BB -oline;=\u203E -olt;=\u29C0 -omacr;=\u014D -omega;=\u03C9 -omicron;=\u03BF -omid;=\u29B6 -ominus;=\u2296 -oopf;=\uD835\uDD60 -opar;=\u29B7 -operp;=\u29B9 -oplus;=\u2295 -or;=\u2228 -orarr;=\u21BB -ord;=\u2A5D -order;=\u2134 -orderof;=\u2134 -ordf=\u00AA -ordf;=\u00AA -ordm=\u00BA -ordm;=\u00BA -origof;=\u22B6 -oror;=\u2A56 -orslope;=\u2A57 -orv;=\u2A5B -oscr;=\u2134 -oslash=\u00F8 -oslash;=\u00F8 -osol;=\u2298 -otilde=\u00F5 -otilde;=\u00F5 -otimes;=\u2297 -otimesas;=\u2A36 -ouml=\u00F6 -ouml;=\u00F6 -ovbar;=\u233D -par;=\u2225 -para=\u00B6 -para;=\u00B6 -parallel;=\u2225 -parsim;=\u2AF3 -parsl;=\u2AFD -part;=\u2202 -pcy;=\u043F -percnt;=\u0025 -period;=\u002E -permil;=\u2030 -perp;=\u22A5 -pertenk;=\u2031 -pfr;=\uD835\uDD2D -phi;=\u03C6 -phiv;=\u03D5 -phmmat;=\u2133 -phone;=\u260E -pi;=\u03C0 -pitchfork;=\u22D4 -piv;=\u03D6 -planck;=\u210F -planckh;=\u210E -plankv;=\u210F -plus;=\u002B -plusacir;=\u2A23 -plusb;=\u229E -pluscir;=\u2A22 -plusdo;=\u2214 -plusdu;=\u2A25 -pluse;=\u2A72 -plusmn=\u00B1 -plusmn;=\u00B1 -plussim;=\u2A26 -plustwo;=\u2A27 -pm;=\u00B1 -pointint;=\u2A15 -popf;=\uD835\uDD61 -pound=\u00A3 -pound;=\u00A3 -pr;=\u227A -prE;=\u2AB3 -prap;=\u2AB7 -prcue;=\u227C -pre;=\u2AAF -prec;=\u227A -precapprox;=\u2AB7 -preccurlyeq;=\u227C -preceq;=\u2AAF -precnapprox;=\u2AB9 -precneqq;=\u2AB5 -precnsim;=\u22E8 -precsim;=\u227E -prime;=\u2032 -primes;=\u2119 -prnE;=\u2AB5 -prnap;=\u2AB9 -prnsim;=\u22E8 -prod;=\u220F -profalar;=\u232E -profline;=\u2312 -profsurf;=\u2313 -prop;=\u221D -propto;=\u221D -prsim;=\u227E -prurel;=\u22B0 -pscr;=\uD835\uDCC5 -psi;=\u03C8 -puncsp;=\u2008 -qfr;=\uD835\uDD2E -qint;=\u2A0C -qopf;=\uD835\uDD62 -qprime;=\u2057 -qscr;=\uD835\uDCC6 -quaternions;=\u210D -quatint;=\u2A16 -quest;=\u003F -questeq;=\u225F -quot=\u0022 -quot;=\u0022 -rAarr;=\u21DB -rArr;=\u21D2 -rAtail;=\u291C -rBarr;=\u290F -rHar;=\u2964 -race;=\u223D\u0331 -racute;=\u0155 -radic;=\u221A -raemptyv;=\u29B3 -rang;=\u27E9 -rangd;=\u2992 -range;=\u29A5 -rangle;=\u27E9 -raquo=\u00BB -raquo;=\u00BB -rarr;=\u2192 -rarrap;=\u2975 -rarrb;=\u21E5 -rarrbfs;=\u2920 -rarrc;=\u2933 -rarrfs;=\u291E -rarrhk;=\u21AA -rarrlp;=\u21AC -rarrpl;=\u2945 -rarrsim;=\u2974 -rarrtl;=\u21A3 -rarrw;=\u219D -ratail;=\u291A -ratio;=\u2236 -rationals;=\u211A -rbarr;=\u290D -rbbrk;=\u2773 -rbrace;=\u007D -rbrack;=\u005D -rbrke;=\u298C -rbrksld;=\u298E -rbrkslu;=\u2990 -rcaron;=\u0159 -rcedil;=\u0157 -rceil;=\u2309 -rcub;=\u007D -rcy;=\u0440 -rdca;=\u2937 -rdldhar;=\u2969 -rdquo;=\u201D -rdquor;=\u201D -rdsh;=\u21B3 -real;=\u211C -realine;=\u211B -realpart;=\u211C -reals;=\u211D -rect;=\u25AD -reg=\u00AE -reg;=\u00AE -rfisht;=\u297D -rfloor;=\u230B -rfr;=\uD835\uDD2F -rhard;=\u21C1 -rharu;=\u21C0 -rharul;=\u296C -rho;=\u03C1 -rhov;=\u03F1 -rightarrow;=\u2192 -rightarrowtail;=\u21A3 -rightharpoondown;=\u21C1 -rightharpoonup;=\u21C0 -rightleftarrows;=\u21C4 -rightleftharpoons;=\u21CC -rightrightarrows;=\u21C9 -rightsquigarrow;=\u219D -rightthreetimes;=\u22CC -ring;=\u02DA -risingdotseq;=\u2253 -rlarr;=\u21C4 -rlhar;=\u21CC -rlm;=\u200F -rmoust;=\u23B1 -rmoustache;=\u23B1 -rnmid;=\u2AEE -roang;=\u27ED -roarr;=\u21FE -robrk;=\u27E7 -ropar;=\u2986 -ropf;=\uD835\uDD63 -roplus;=\u2A2E -rotimes;=\u2A35 -rpar;=\u0029 -rpargt;=\u2994 -rppolint;=\u2A12 -rrarr;=\u21C9 -rsaquo;=\u203A -rscr;=\uD835\uDCC7 -rsh;=\u21B1 -rsqb;=\u005D -rsquo;=\u2019 -rsquor;=\u2019 -rthree;=\u22CC -rtimes;=\u22CA -rtri;=\u25B9 -rtrie;=\u22B5 -rtrif;=\u25B8 -rtriltri;=\u29CE -ruluhar;=\u2968 -rx;=\u211E -sacute;=\u015B -sbquo;=\u201A -sc;=\u227B -scE;=\u2AB4 -scap;=\u2AB8 -scaron;=\u0161 -sccue;=\u227D -sce;=\u2AB0 -scedil;=\u015F -scirc;=\u015D -scnE;=\u2AB6 -scnap;=\u2ABA -scnsim;=\u22E9 -scpolint;=\u2A13 -scsim;=\u227F -scy;=\u0441 -sdot;=\u22C5 -sdotb;=\u22A1 -sdote;=\u2A66 -seArr;=\u21D8 -searhk;=\u2925 -searr;=\u2198 -searrow;=\u2198 -sect=\u00A7 -sect;=\u00A7 -semi;=\u003B -seswar;=\u2929 -setminus;=\u2216 -setmn;=\u2216 -sext;=\u2736 -sfr;=\uD835\uDD30 -sfrown;=\u2322 -sharp;=\u266F -shchcy;=\u0449 -shcy;=\u0448 -shortmid;=\u2223 -shortparallel;=\u2225 -shy=\u00AD -shy;=\u00AD -sigma;=\u03C3 -sigmaf;=\u03C2 -sigmav;=\u03C2 -sim;=\u223C -simdot;=\u2A6A -sime;=\u2243 -simeq;=\u2243 -simg;=\u2A9E -simgE;=\u2AA0 -siml;=\u2A9D -simlE;=\u2A9F -simne;=\u2246 -simplus;=\u2A24 -simrarr;=\u2972 -slarr;=\u2190 -smallsetminus;=\u2216 -smashp;=\u2A33 -smeparsl;=\u29E4 -smid;=\u2223 -smile;=\u2323 -smt;=\u2AAA -smte;=\u2AAC -smtes;=\u2AAC\uFE00 -softcy;=\u044C -sol;=\u002F -solb;=\u29C4 -solbar;=\u233F -sopf;=\uD835\uDD64 -spades;=\u2660 -spadesuit;=\u2660 -spar;=\u2225 -sqcap;=\u2293 -sqcaps;=\u2293\uFE00 -sqcup;=\u2294 -sqcups;=\u2294\uFE00 -sqsub;=\u228F -sqsube;=\u2291 -sqsubset;=\u228F -sqsubseteq;=\u2291 -sqsup;=\u2290 -sqsupe;=\u2292 -sqsupset;=\u2290 -sqsupseteq;=\u2292 -squ;=\u25A1 -square;=\u25A1 -squarf;=\u25AA -squf;=\u25AA -srarr;=\u2192 -sscr;=\uD835\uDCC8 -ssetmn;=\u2216 -ssmile;=\u2323 -sstarf;=\u22C6 -star;=\u2606 -starf;=\u2605 -straightepsilon;=\u03F5 -straightphi;=\u03D5 -strns;=\u00AF -sub;=\u2282 -subE;=\u2AC5 -subdot;=\u2ABD -sube;=\u2286 -subedot;=\u2AC3 -submult;=\u2AC1 -subnE;=\u2ACB -subne;=\u228A -subplus;=\u2ABF -subrarr;=\u2979 -subset;=\u2282 -subseteq;=\u2286 -subseteqq;=\u2AC5 -subsetneq;=\u228A -subsetneqq;=\u2ACB -subsim;=\u2AC7 -subsub;=\u2AD5 -subsup;=\u2AD3 -succ;=\u227B -succapprox;=\u2AB8 -succcurlyeq;=\u227D -succeq;=\u2AB0 -succnapprox;=\u2ABA -succneqq;=\u2AB6 -succnsim;=\u22E9 -succsim;=\u227F -sum;=\u2211 -sung;=\u266A -sup1=\u00B9 -sup1;=\u00B9 -sup2=\u00B2 -sup2;=\u00B2 -sup3=\u00B3 -sup3;=\u00B3 -sup;=\u2283 -supE;=\u2AC6 -supdot;=\u2ABE -supdsub;=\u2AD8 -supe;=\u2287 -supedot;=\u2AC4 -suphsol;=\u27C9 -suphsub;=\u2AD7 -suplarr;=\u297B -supmult;=\u2AC2 -supnE;=\u2ACC -supne;=\u228B -supplus;=\u2AC0 -supset;=\u2283 -supseteq;=\u2287 -supseteqq;=\u2AC6 -supsetneq;=\u228B -supsetneqq;=\u2ACC -supsim;=\u2AC8 -supsub;=\u2AD4 -supsup;=\u2AD6 -swArr;=\u21D9 -swarhk;=\u2926 -swarr;=\u2199 -swarrow;=\u2199 -swnwar;=\u292A -szlig=\u00DF -szlig;=\u00DF -target;=\u2316 -tau;=\u03C4 -tbrk;=\u23B4 -tcaron;=\u0165 -tcedil;=\u0163 -tcy;=\u0442 -tdot;=\u20DB -telrec;=\u2315 -tfr;=\uD835\uDD31 -there4;=\u2234 -therefore;=\u2234 -theta;=\u03B8 -thetasym;=\u03D1 -thetav;=\u03D1 -thickapprox;=\u2248 -thicksim;=\u223C -thinsp;=\u2009 -thkap;=\u2248 -thksim;=\u223C -thorn=\u00FE -thorn;=\u00FE -tilde;=\u02DC -times=\u00D7 -times;=\u00D7 -timesb;=\u22A0 -timesbar;=\u2A31 -timesd;=\u2A30 -tint;=\u222D -toea;=\u2928 -top;=\u22A4 -topbot;=\u2336 -topcir;=\u2AF1 -topf;=\uD835\uDD65 -topfork;=\u2ADA -tosa;=\u2929 -tprime;=\u2034 -trade;=\u2122 -triangle;=\u25B5 -triangledown;=\u25BF -triangleleft;=\u25C3 -trianglelefteq;=\u22B4 -triangleq;=\u225C -triangleright;=\u25B9 -trianglerighteq;=\u22B5 -tridot;=\u25EC -trie;=\u225C -triminus;=\u2A3A -triplus;=\u2A39 -trisb;=\u29CD -tritime;=\u2A3B -trpezium;=\u23E2 -tscr;=\uD835\uDCC9 -tscy;=\u0446 -tshcy;=\u045B -tstrok;=\u0167 -twixt;=\u226C -twoheadleftarrow;=\u219E -twoheadrightarrow;=\u21A0 -uArr;=\u21D1 -uHar;=\u2963 -uacute=\u00FA -uacute;=\u00FA -uarr;=\u2191 -ubrcy;=\u045E -ubreve;=\u016D -ucirc=\u00FB -ucirc;=\u00FB -ucy;=\u0443 -udarr;=\u21C5 -udblac;=\u0171 -udhar;=\u296E -ufisht;=\u297E -ufr;=\uD835\uDD32 -ugrave=\u00F9 -ugrave;=\u00F9 -uharl;=\u21BF -uharr;=\u21BE -uhblk;=\u2580 -ulcorn;=\u231C -ulcorner;=\u231C -ulcrop;=\u230F -ultri;=\u25F8 -umacr;=\u016B -uml=\u00A8 -uml;=\u00A8 -uogon;=\u0173 -uopf;=\uD835\uDD66 -uparrow;=\u2191 -updownarrow;=\u2195 -upharpoonleft;=\u21BF -upharpoonright;=\u21BE -uplus;=\u228E -upsi;=\u03C5 -upsih;=\u03D2 -upsilon;=\u03C5 -upuparrows;=\u21C8 -urcorn;=\u231D -urcorner;=\u231D -urcrop;=\u230E -uring;=\u016F -urtri;=\u25F9 -uscr;=\uD835\uDCCA -utdot;=\u22F0 -utilde;=\u0169 -utri;=\u25B5 -utrif;=\u25B4 -uuarr;=\u21C8 -uuml=\u00FC -uuml;=\u00FC -uwangle;=\u29A7 -vArr;=\u21D5 -vBar;=\u2AE8 -vBarv;=\u2AE9 -vDash;=\u22A8 -vangrt;=\u299C -varepsilon;=\u03F5 -varkappa;=\u03F0 -varnothing;=\u2205 -varphi;=\u03D5 -varpi;=\u03D6 -varpropto;=\u221D -varr;=\u2195 -varrho;=\u03F1 -varsigma;=\u03C2 -varsubsetneq;=\u228A\uFE00 -varsubsetneqq;=\u2ACB\uFE00 -varsupsetneq;=\u228B\uFE00 -varsupsetneqq;=\u2ACC\uFE00 -vartheta;=\u03D1 -vartriangleleft;=\u22B2 -vartriangleright;=\u22B3 -vcy;=\u0432 -vdash;=\u22A2 -vee;=\u2228 -veebar;=\u22BB -veeeq;=\u225A -vellip;=\u22EE -verbar;=\u007C -vert;=\u007C -vfr;=\uD835\uDD33 -vltri;=\u22B2 -vnsub;=\u2282\u20D2 -vnsup;=\u2283\u20D2 -vopf;=\uD835\uDD67 -vprop;=\u221D -vrtri;=\u22B3 -vscr;=\uD835\uDCCB -vsubnE;=\u2ACB\uFE00 -vsubne;=\u228A\uFE00 -vsupnE;=\u2ACC\uFE00 -vsupne;=\u228B\uFE00 -vzigzag;=\u299A -wcirc;=\u0175 -wedbar;=\u2A5F -wedge;=\u2227 -wedgeq;=\u2259 -weierp;=\u2118 -wfr;=\uD835\uDD34 -wopf;=\uD835\uDD68 -wp;=\u2118 -wr;=\u2240 -wreath;=\u2240 -wscr;=\uD835\uDCCC -xcap;=\u22C2 -xcirc;=\u25EF -xcup;=\u22C3 -xdtri;=\u25BD -xfr;=\uD835\uDD35 -xhArr;=\u27FA -xharr;=\u27F7 -xi;=\u03BE -xlArr;=\u27F8 -xlarr;=\u27F5 -xmap;=\u27FC -xnis;=\u22FB -xodot;=\u2A00 -xopf;=\uD835\uDD69 -xoplus;=\u2A01 -xotime;=\u2A02 -xrArr;=\u27F9 -xrarr;=\u27F6 -xscr;=\uD835\uDCCD -xsqcup;=\u2A06 -xuplus;=\u2A04 -xutri;=\u25B3 -xvee;=\u22C1 -xwedge;=\u22C0 -yacute=\u00FD -yacute;=\u00FD -yacy;=\u044F -ycirc;=\u0177 -ycy;=\u044B -yen=\u00A5 -yen;=\u00A5 -yfr;=\uD835\uDD36 -yicy;=\u0457 -yopf;=\uD835\uDD6A -yscr;=\uD835\uDCCE -yucy;=\u044E -yuml=\u00FF -yuml;=\u00FF -zacute;=\u017A -zcaron;=\u017E -zcy;=\u0437 -zdot;=\u017C -zeetrf;=\u2128 -zeta;=\u03B6 -zfr;=\uD835\uDD37 -zhcy;=\u0436 -zigrarr;=\u21DD -zopf;=\uD835\uDD6B -zscr;=\uD835\uDCCF -zwj;=\u200D -zwnj;=\u200C \ No newline at end of file diff --git a/benchmark/src/test/java/org/htmlunit/cyberneko/HTMLEntitiesParserTest.java b/benchmark/src/test/java/org/htmlunit/cyberneko/HTMLEntitiesParserTest.java deleted file mode 100644 index bc2a0497..00000000 --- a/benchmark/src/test/java/org/htmlunit/cyberneko/HTMLEntitiesParserTest.java +++ /dev/null @@ -1,216 +0,0 @@ -package org.htmlunit.cyberneko; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -import org.htmlunit.cyberneko.util.HTMLEntitiesParser; -import org.htmlunit.cyberneko.util.HTMLEntitiesParser.Level; -import org.junit.jupiter.api.Test; - -public class HTMLEntitiesParserTest -{ - @Test - public void happyPath() - { - final Level r = HTMLEntitiesParser.get().lookup("Beta;"); - assertTrue(r.isMatch); - assertTrue(r.endNode); - assertTrue(r.endsWithSemicolon); - - assertEquals("\u0392", r.resolvedValue); - assertEquals("Beta;", r.entityOrFragment); - assertEquals(5, r.length); - } - - @Test - public void happyPathOneCharDiff() - { - { - final Level r = HTMLEntitiesParser.get().lookup("Colon;"); - assertTrue(r.isMatch); - assertTrue(r.endNode); - assertTrue(r.endsWithSemicolon); - - assertEquals("\u2237", r.resolvedValue); - assertEquals("Colon;", r.entityOrFragment); - assertEquals(6, r.length); - } - { - final Level r = HTMLEntitiesParser.get().lookup("Colone;"); - assertTrue(r.isMatch); - assertTrue(r.endNode); - assertTrue(r.endsWithSemicolon); - - assertEquals("\u2A74", r.resolvedValue); - assertEquals("Colone;", r.entityOrFragment); - assertEquals(7, r.length); - } - } - - @Test - public void happyPathTwoVersionEntity() - { - { - final Level r = HTMLEntitiesParser.get().lookup("gt"); - assertEquals("gt", r.entityOrFragment); - assertTrue(r.isMatch); - assertFalse(r.endNode); - assertFalse(r.endsWithSemicolon); - - assertEquals(">", r.resolvedValue); - assertEquals(2, r.length); - } - { - final Level r = HTMLEntitiesParser.get().lookup("gt;"); - assertEquals("gt;", r.entityOrFragment); - assertTrue(r.isMatch); - assertTrue(r.endNode); - assertTrue(r.endsWithSemicolon); - - assertEquals(">", r.resolvedValue); - assertEquals(3, r.length); - } - } - - @Test - public void happyPathTwoVersionEntity2() - { - { - final Level r = HTMLEntitiesParser.get().lookup("ccedil"); - assertEquals("ccedil", r.entityOrFragment); - assertTrue(r.isMatch); - assertFalse(r.endNode); - assertFalse(r.endsWithSemicolon); - - assertEquals("\u00E7", r.resolvedValue); - assertEquals(6, r.length); - } - { - final Level r = HTMLEntitiesParser.get().lookup("ccedil;"); - assertEquals("ccedil;", r.entityOrFragment); - assertTrue(r.isMatch); - assertTrue(r.endNode); - assertTrue(r.endsWithSemicolon); - - assertEquals("\u00E7", r.resolvedValue); - assertEquals(7, r.length); - } - } - - @Test - public void fullyUnknown() - { - { - final Level r = HTMLEntitiesParser.get().lookup("abc;"); - assertFalse(r.isMatch); - assertFalse(r.endNode); - assertFalse(r.endsWithSemicolon); - - assertEquals(null, r.resolvedValue); - assertEquals("ab", r.entityOrFragment); - assertEquals(2, r.length); - } - } - - /** - * This must resolve to ¬ !! - */ - @Test - public void notit() - { - { - final Level r = HTMLEntitiesParser.get().lookup("notit;"); - assertTrue(r.isMatch); - assertFalse(r.endNode); - assertFalse(r.endsWithSemicolon); - - assertEquals("\u00AC", r.resolvedValue); - assertEquals("not", r.entityOrFragment); - assertEquals(3, r.length); - } - } - - /** - * This resolve to ¬ - */ - @Test - public void notSemicolon() - { - { - final Level r = HTMLEntitiesParser.get().lookup("not;"); - assertTrue(r.isMatch); - assertTrue(r.endNode); - assertTrue(r.endsWithSemicolon); - - assertEquals("\u00AC", r.resolvedValue); - assertEquals("not;", r.entityOrFragment); - assertEquals(4, r.length); - } - } - - /** - * This resolve to ¬ - */ - @Test - public void nothash() - { - { - final Level r = HTMLEntitiesParser.get().lookup("not#"); - assertTrue(r.isMatch); - assertFalse(r.endNode); - assertFalse(r.endsWithSemicolon); - - assertEquals("\u00AC", r.resolvedValue); - assertEquals("not", r.entityOrFragment); - assertEquals(3, r.length); - } - } - - /** - * Test all entities - * @throws IOException - */ - @Test - public void allEntitiesWithSemicolonFull() throws IOException { - final Properties props = new Properties(); - try (InputStream stream = HTMLEntitiesParserTest.class.getResourceAsStream("html_entities.properties")) { - props.load(stream); - } - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - // we also don't want to test "old" entities at the moment aka no ; at the end - if (key.trim().isEmpty()) { - return; - } - - final Level r = HTMLEntitiesParser.get().lookup(key); - assertTrue(r.isMatch); - if (key.endsWith(";")) - { - assertTrue(r.endNode); - assertTrue(r.endsWithSemicolon); - } - else - { - // no ; means it is never and end node, because this - // is for legacy entities - assertFalse(r.endNode); - assertFalse(r.endsWithSemicolon); - } - - assertEquals(value, r.resolvedValue); - assertEquals(key, r.entityOrFragment); - assertEquals(key.length(), r.length); - }); - } - -} diff --git a/benchmark/src/test/java/org/htmlunit/cyberneko/HTMLEntitiesParser_OldTest.java b/benchmark/src/test/java/org/htmlunit/cyberneko/HTMLEntitiesParser_OldTest.java deleted file mode 100644 index 96c67f74..00000000 --- a/benchmark/src/test/java/org/htmlunit/cyberneko/HTMLEntitiesParser_OldTest.java +++ /dev/null @@ -1,173 +0,0 @@ -/* - * Copyright 2002-2009 Andy Clark, Marc Guillemot - * Copyright 2017-2023 Ronald Brill - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.htmlunit.cyberneko; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertNull; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Properties; - -import org.htmlunit.cyberneko.HTMLEntitiesParser_Old; -import org.junit.jupiter.api.Test; - -/** - * Unit tests for {@link HTMLEntitiesParser_OldGenerator}. - * @author Ronald Brill - */ -public class HTMLEntitiesParser_OldTest { - - @Test - public void parseEuml() { - final HTMLEntitiesParser_Old parser = new HTMLEntitiesParser_Old(); - - final String input = "Euml "; - int i = 0; - while (parser.parse(input.charAt(i))) { - i++; - } - assertEquals("\u00CB", parser.getMatch()); - assertEquals(1, parser.getRewindCount()); - assertFalse(parser.endsWithSemicolon()); - } - - @Test - public void parseEuml_() { - final HTMLEntitiesParser_Old parser = new HTMLEntitiesParser_Old(); - - final String input = "Euml; "; - int i = 0; - while (parser.parse(input.charAt(i))) { - i++; - } - assertEquals("\u00CB", parser.getMatch()); - assertEquals(0, parser.getRewindCount()); - assertTrue(parser.endsWithSemicolon()); - } - - @Test - public void parseEumlX() { - final HTMLEntitiesParser_Old parser = new HTMLEntitiesParser_Old(); - - final String input = "EumlX"; - int i = 0; - while (parser.parse(input.charAt(i))) { - i++; - } - - // valid without semicolon at end - assertEquals("\u00CB", parser.getMatch()); - assertEquals(1, parser.getRewindCount()); - assertFalse(parser.endsWithSemicolon()); - } - - @Test - public void parseEumX() { - final HTMLEntitiesParser_Old parser = new HTMLEntitiesParser_Old(); - - final String input = "EumX"; - int i = 0; - while (parser.parse(input.charAt(i))) { - i++; - } - assertNull(parser.getMatch()); - assertEquals(4, parser.getRewindCount()); - assertFalse(parser.endsWithSemicolon()); - } - - @Test - public void parseEuroLt() { - final HTMLEntitiesParser_Old parser = new HTMLEntitiesParser_Old(); - - final String input = "euro<"; - int i = 0; - while (parser.parse(input.charAt(i))) { - i++; - } - - // not valid without semicolon at end - assertNull(parser.getMatch()); - assertEquals(5, parser.getRewindCount()); - assertFalse(parser.endsWithSemicolon()); - } - - @Test - public void parseEuro() { - final HTMLEntitiesParser_Old parser = new HTMLEntitiesParser_Old(); - - final String input = "x80;"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("\u20ac", parser.getMatch()); - assertEquals(0, parser.getRewindCount()); - } - - @Test - public void parseEuroMissingSemicolon() { - final HTMLEntitiesParser_Old parser = new HTMLEntitiesParser_Old(); - - final String input = "x80<"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("\u20ac", parser.getMatch()); - assertEquals(1, parser.getRewindCount()); - } - - /** - * Test all entities - * @throws IOException - */ - @Test - public void allEntities() throws IOException { - final Properties props = new Properties(); - try (InputStream stream = HTMLEntitiesParser_OldTest.class.getResourceAsStream("html_entities.properties")) { - props.load(stream); - } - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - if (key.isEmpty()) { - return; - } - - final HTMLEntitiesParser_Old parser = new HTMLEntitiesParser_Old(); - - int i = 0; - String parserInput = key + " "; - while (parser.parse(parserInput.charAt(i))) { - i++; - } - - assertEquals(value, parser.getMatch()); - assertEquals(key.endsWith(";") ? 0 : 1, parser.getRewindCount()); - assertEquals(key.endsWith(";"), parser.endsWithSemicolon()); - }); - } -} - - diff --git a/benchmark/src/test/java/org/htmlunit/cyberneko/HTMLNumericEntitiesParserTest.java b/benchmark/src/test/java/org/htmlunit/cyberneko/HTMLNumericEntitiesParserTest.java deleted file mode 100644 index 5c273dde..00000000 --- a/benchmark/src/test/java/org/htmlunit/cyberneko/HTMLNumericEntitiesParserTest.java +++ /dev/null @@ -1,198 +0,0 @@ -/* - * Copyright 2002-2009 Andy Clark, Marc Guillemot - * Copyright 2017-2023 Ronald Brill - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.htmlunit.cyberneko; - -import static org.junit.jupiter.api.Assertions.assertEquals; - -import org.htmlunit.cyberneko.util.HTMLNumericEntitiesParser; -import org.junit.jupiter.api.Test; - -/** - * Unit tests for {@link HTMLNumericEntities}. - * @author René Schwietzke - */ -public class HTMLNumericEntitiesParserTest { - @Test - public void parseEuro() { - final HTMLNumericEntitiesParser parser = new HTMLNumericEntitiesParser(); - - final String input = "x80;"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("\u20ac", parser.getMatch()); - assertEquals(0, parser.getRewindCount()); - } - - @Test - public void parseEuroUppercase() { - final HTMLNumericEntitiesParser parser = new HTMLNumericEntitiesParser(); - - final String input = "X80;"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("\u20ac", parser.getMatch()); - assertEquals(0, parser.getRewindCount()); - } - - @Test - public void parseBroken() { - final HTMLNumericEntitiesParser parser = new HTMLNumericEntitiesParser(); - - final String input = "A80;"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals(null, parser.getMatch()); - assertEquals(1, parser.getRewindCount()); - } - - @Test - public void parseLTAsDecimal() { - final HTMLNumericEntitiesParser parser = new HTMLNumericEntitiesParser(); - - final String input = "60;"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("<", parser.getMatch()); - assertEquals(0, parser.getRewindCount()); - } - - @Test - public void parseLTAsDecimalBroken() { - final HTMLNumericEntitiesParser parser = new HTMLNumericEntitiesParser(); - - final String input = "60 "; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("<", parser.getMatch()); - assertEquals(1, parser.getRewindCount()); - } - - - @Test - public void parseEuroMissingSemicolon() { - final HTMLNumericEntitiesParser parser = new HTMLNumericEntitiesParser(); - - final String input = "x80<"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("\u20ac", parser.getMatch()); - assertEquals(1, parser.getRewindCount()); - } - - @Test - public void parseNullChar() { - final HTMLEntitiesParser_Old parser = new HTMLEntitiesParser_Old(); - - final String input = "x00;"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("\uFFFD", parser.getMatch()); - assertEquals(0, parser.getRewindCount()); - } - - @Test - public void parseOverflowRange() { - final HTMLNumericEntitiesParser parser = new HTMLNumericEntitiesParser(); - - final String input = "x11FFFF;"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("\uFFFD", parser.getMatch()); - assertEquals(0, parser.getRewindCount()); - } - - @Test - public void parseSurrogate() { - final HTMLNumericEntitiesParser parser = new HTMLNumericEntitiesParser(); - - final String input = "xD800;"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("\uFFFD", parser.getMatch()); - assertEquals(6, parser.getRewindCount()); - } - - @Test - public void parseNonCharacterLow() { - final HTMLNumericEntitiesParser parser = new HTMLNumericEntitiesParser(); - - final String input = "x80;"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("\u20AC", parser.getMatch()); - assertEquals(0, parser.getRewindCount()); - } - - @Test - public void parseNonCharacterHighLowercase() { - final HTMLNumericEntitiesParser parser = new HTMLNumericEntitiesParser(); - - final String input = "x9f;"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("\u0178", parser.getMatch()); - assertEquals(0, parser.getRewindCount()); - } - - @Test - public void parseNonCharacterHighUppercase() { - final HTMLNumericEntitiesParser parser = new HTMLNumericEntitiesParser(); - - final String input = "x9F;"; - int i = 0; - while (parser.parseNumeric(input.charAt(i))) { - i++; - } - - assertEquals("\u0178", parser.getMatch()); - assertEquals(0, parser.getRewindCount()); - } -} - - diff --git a/benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities1ParserTest.java b/benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities1ParserTest.java deleted file mode 100644 index 5d08f054..00000000 --- a/benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities1ParserTest.java +++ /dev/null @@ -1,149 +0,0 @@ -package org.htmlunit.cyberneko; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Properties; - -import org.htmlunit.benchmark.util.FastRandom; -import org.htmlunit.cyberneko.util.HtmlEntities1; -import org.htmlunit.cyberneko.util.HtmlEntities1.Resolver; -import org.htmlunit.cyberneko.util.HtmlEntities2.Level; -import org.junit.jupiter.api.Test; - -public class HtmlEntities1ParserTest -{ - @Test - public void happyPath() - { - final Optional r = HtmlEntities1.get().lookup("gt"); - assertEquals(">", r.get()); - } - - @Test - public void unknown() - { - final Optional r = HtmlEntities1.get().lookup("anything"); - assertFalse(r.isPresent()); - } - - @Test - public void unicodeFind() - { - final Optional r = HtmlEntities1.get().lookup("dot;"); - assertEquals("\u02D9", r.get()); - } - - @Test - public void existsButOnlyAsPiece() - { - final Optional r = HtmlEntities1.get().lookup("Agra"); - assertFalse(r.isPresent()); - } - - @Test - public void existsInTwoVersions() - { - final Optional r1 = HtmlEntities1.get().lookup("Agrave"); - assertEquals("\u00C0", r1.get()); - - final Optional r2 = HtmlEntities1.get().lookup("Agrave;"); - assertEquals("\u00C0", r2.get()); - } - - /** - * Test all entities - * @throws IOException - */ - @Test - public void allEntitiesFullRandom() throws IOException { - final Properties props = new Properties(); - try (InputStream stream = HtmlEntities1ParserTest.class.getResourceAsStream("html_entities.properties")) { - props.load(stream); - } - - final List keys = new ArrayList<>(); - final List values = new ArrayList<>(); - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - if (key.isEmpty()) { - return; - } - - // we need randomness to avoid that the setup data looks identical to the quueried data - FastRandom r = new FastRandom(); - int pos = r.nextInt(keys.size() + 1); - - keys.add(pos, key); - values.add(pos, value); - }); - - - for (int i = 0; i < keys.size(); i++) { - String key = keys.get(i); - String value = values.get(i); - - // we might have an empty line in it - // we also don't want to test "old" entities at the moment aka no ; at the end - if (key.trim().isEmpty()) { - return; - } - - final Optional r = HtmlEntities1.get().lookup(key); - assertEquals(value, r.get()); - } - } - - /** - * Test all entities - * @throws IOException - */ - @Test - public void allEntitiesByCharacter() throws IOException { - final Properties props = new Properties(); - try (InputStream stream = HtmlEntities1ParserTest.class.getResourceAsStream("html_entities.properties")) { - props.load(stream); - } - - // touch me for faster debug loading - HtmlEntities1.get(); - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - if (key.isEmpty()) { - return; - } - - final Resolver resolver = new HtmlEntities1.Resolver(); - for (int i = 0; i < key.length(); i++) - { - final int c = key.charAt(i); - boolean r = resolver.parse(c); - - // end when false and things should be complete - if (r == false) - { - break; - } - } - - assertEquals(value, resolver.getResolvedValue()); - assertEquals(key.length(), resolver.getMatchLength()); - assertEquals(0, resolver.getRewindCount()); - assertEquals(key.endsWith(";"), resolver.endsWithSemicolon()); - }); - } -} diff --git a/benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities2ParserTest.java b/benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities2ParserTest.java deleted file mode 100644 index 5be552fb..00000000 --- a/benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities2ParserTest.java +++ /dev/null @@ -1,230 +0,0 @@ -package org.htmlunit.cyberneko; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; -import java.io.InputStream; -import java.util.ArrayList; -import java.util.List; -import java.util.Optional; -import java.util.Properties; - -import org.htmlunit.benchmark.util.FastRandom; -import org.htmlunit.benchmark.util.RandomUtils; -import org.htmlunit.cyberneko.util.HtmlEntities2; -import org.htmlunit.cyberneko.util.HtmlEntities2.Level; -import org.junit.jupiter.api.Test; - -public class HtmlEntities2ParserTest -{ - @Test - public void happyPath() - { - final Optional r = HtmlEntities2.get().lookup("Beta;"); - assertTrue(r.get().isMatch); - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - - assertEquals("\u0392", r.get().resolvedValue); - assertEquals("Beta;", r.get().entityOrFragment); - assertEquals(5, r.get().length); - } - - @Test - public void happyPathOneCharDiff() - { - { - final Optional r = HtmlEntities2.get().lookup("Colon;"); - assertTrue(r.get().isMatch); - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - - assertEquals("\u2237", r.get().resolvedValue); - assertEquals("Colon;", r.get().entityOrFragment); - assertEquals(6, r.get().length); - } - { - final Optional r = HtmlEntities2.get().lookup("Colone;"); - assertTrue(r.get().isMatch); - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - - assertEquals("\u2A74", r.get().resolvedValue); - assertEquals("Colone;", r.get().entityOrFragment); - assertEquals(7, r.get().length); - } - } - - @Test - public void happyPathTwoVersionEntity() - { - { - final Optional r = HtmlEntities2.get().lookup("gt"); - assertEquals("gt", r.get().entityOrFragment); - assertTrue(r.get().isMatch); - assertFalse(r.get().endNode); - assertFalse(r.get().endsWithSemicolon); - - assertEquals(">", r.get().resolvedValue); - assertEquals(2, r.get().length); - } - { - final Optional r = HtmlEntities2.get().lookup("gt;"); - assertEquals("gt;", r.get().entityOrFragment); - assertTrue(r.get().isMatch); - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - - assertEquals(">", r.get().resolvedValue); - assertEquals(3, r.get().length); - } - } - - @Test - public void happyPathTwoVersionEntity2() - { - { - final Optional r = HtmlEntities2.get().lookup("ccedil"); - assertEquals("ccedil", r.get().entityOrFragment); - assertTrue(r.get().isMatch); - assertFalse(r.get().endNode); - assertFalse(r.get().endsWithSemicolon); - - assertEquals("\u00E7", r.get().resolvedValue); - assertEquals(6, r.get().length); - } - { - final Optional r = HtmlEntities2.get().lookup("ccedil;"); - assertEquals("ccedil;", r.get().entityOrFragment); - assertTrue(r.get().isMatch); - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - - assertEquals("\u00E7", r.get().resolvedValue); - assertEquals(7, r.get().length); - } - } - - @Test - public void fullyUnknown() - { - { - final Optional r = HtmlEntities2.get().lookup("abc;"); - assertFalse(r.get().isMatch); - assertFalse(r.get().endNode); - assertFalse(r.get().endsWithSemicolon); - - assertEquals(null, r.get().resolvedValue); - assertEquals("ab", r.get().entityOrFragment); - assertEquals(2, r.get().length); - } - } - - - /** - * Test all entities - * @throws IOException - */ - @Test - public void allEntitiesWithSemicolonFull() throws IOException { - final Properties props = new Properties(); - try (InputStream stream = HtmlEntities2ParserTest.class.getResourceAsStream("html_entities.properties")) { - props.load(stream); - } - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - // we also don't want to test "old" entities at the moment aka no ; at the end - if (key.trim().isEmpty()) { - return; - } - - final Optional r = HtmlEntities2.get().lookup(key); - assertTrue(r.get().isMatch); - if (key.endsWith(";")) - { - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - } - else - { - // no ; means it is never and end node, because this - // is for legacy entities - assertFalse(r.get().endNode); - assertFalse(r.get().endsWithSemicolon); - } - - assertEquals(value, r.get().resolvedValue); - assertEquals(key, r.get().entityOrFragment); - assertEquals(key.length(), r.get().length); - }); - } - - /** - * Test all entities - * @throws IOException - */ - @Test - public void allEntitiesFullRandom() throws IOException { - final Properties props = new Properties(); - try (InputStream stream = HtmlEntities2ParserTest.class.getResourceAsStream("html_entities.properties")) { - props.load(stream); - } - - final List keys = new ArrayList<>(); - final List values = new ArrayList<>(); - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - if (key.isEmpty()) { - return; - } - - // we need randomness to avoid that the setup data looks identical to the quueried data - FastRandom r = new FastRandom(); - int pos = r.nextInt(keys.size() + 1); - - keys.add(pos, key); - values.add(pos, value); - }); - - - for (int i = 0; i < keys.size(); i++) { - String key = keys.get(i); - String value = values.get(i); - - // we might have an empty line in it - // we also don't want to test "old" entities at the moment aka no ; at the end - if (key.trim().isEmpty()) { - return; - } - - final Optional r = HtmlEntities2.get().lookup(key); - assertTrue(r.get().isMatch); - if (key.endsWith(";")) - { - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - } - else - { - // no ; means it is never and end node, because this - // is for legacy entities - assertFalse(r.get().endNode); - assertFalse(r.get().endsWithSemicolon); - } - - assertEquals(value, r.get().resolvedValue); - assertEquals(key, r.get().entityOrFragment); - assertEquals(key.length(), r.get().length); - } - } -} diff --git a/benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities3ParserTest.java b/benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities3ParserTest.java deleted file mode 100644 index a8d2a310..00000000 --- a/benchmark/src/test/java/org/htmlunit/cyberneko/HtmlEntities3ParserTest.java +++ /dev/null @@ -1,166 +0,0 @@ -package org.htmlunit.cyberneko; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.io.IOException; -import java.io.InputStream; -import java.util.Optional; -import java.util.Properties; - -import org.htmlunit.cyberneko.util.HtmlEntities3; -import org.htmlunit.cyberneko.util.HtmlEntities3.Level; -import org.junit.jupiter.api.Test; - -public class HtmlEntities3ParserTest -{ - @Test - public void happyPath() - { - final Optional r = HtmlEntities3.get().lookup("Beta;"); - assertTrue(r.get().isMatch); - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - - assertEquals("\u0392", r.get().resolvedValue); - assertEquals("Beta;", r.get().entityOrFragment); - assertEquals(5, r.get().length); - } - - @Test - public void happyPathOneCharDiff() - { - { - final Optional r = HtmlEntities3.get().lookup("Colon;"); - assertTrue(r.get().isMatch); - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - - assertEquals("\u2237", r.get().resolvedValue); - assertEquals("Colon;", r.get().entityOrFragment); - assertEquals(6, r.get().length); - } - { - final Optional r = HtmlEntities3.get().lookup("Colone;"); - assertTrue(r.get().isMatch); - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - - assertEquals("\u2A74", r.get().resolvedValue); - assertEquals("Colone;", r.get().entityOrFragment); - assertEquals(7, r.get().length); - } - } - - @Test - public void happyPathTwoVersionEntity() - { - { - final Optional r = HtmlEntities3.get().lookup("gt"); - assertEquals("gt", r.get().entityOrFragment); - assertTrue(r.get().isMatch); - assertFalse(r.get().endNode); - assertFalse(r.get().endsWithSemicolon); - - assertEquals(">", r.get().resolvedValue); - assertEquals(2, r.get().length); - } - { - final Optional r = HtmlEntities3.get().lookup("gt;"); - assertEquals("gt;", r.get().entityOrFragment); - assertTrue(r.get().isMatch); - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - - assertEquals(">", r.get().resolvedValue); - assertEquals(3, r.get().length); - } - } - - @Test - public void happyPathTwoVersionEntity2() - { - { - final Optional r = HtmlEntities3.get().lookup("ccedil"); - assertEquals("ccedil", r.get().entityOrFragment); - assertTrue(r.get().isMatch); - assertFalse(r.get().endNode); - assertFalse(r.get().endsWithSemicolon); - - assertEquals("\u00E7", r.get().resolvedValue); - assertEquals(6, r.get().length); - } - { - final Optional r = HtmlEntities3.get().lookup("ccedil;"); - assertEquals("ccedil;", r.get().entityOrFragment); - assertTrue(r.get().isMatch); - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - - assertEquals("\u00E7", r.get().resolvedValue); - assertEquals(7, r.get().length); - } - } - - @Test - public void fullyUnknown() - { - { - final Optional r = HtmlEntities3.get().lookup("abc;"); - assertFalse(r.get().isMatch); - assertFalse(r.get().endNode); - assertFalse(r.get().endsWithSemicolon); - - assertEquals(null, r.get().resolvedValue); - assertEquals("ab", r.get().entityOrFragment); - assertEquals(2, r.get().length); - } - } - - - /** - * Test all entities - * @throws IOException - */ - @Test - public void allEntitiesWithSemicolonFull() throws IOException { - final Properties props = new Properties(); - try (InputStream stream = HtmlEntities3ParserTest.class.getResourceAsStream("html_entities.properties")) { - props.load(stream); - } - - props.forEach((k, v) -> { - String key = (String) k; - String value = (String) v; - - // we might have an empty line in it - // we also don't want to test "old" entities at the moment aka no ; at the end - if (key.trim().isEmpty()) { - return; - } - - System.out.println(key); - - final Optional r = HtmlEntities3.get().lookup(key); - assertTrue(r.get().isMatch); - if (key.endsWith(";")) - { - assertTrue(r.get().endNode); - assertTrue(r.get().endsWithSemicolon); - } - else - { - // no ; means it is never and end node, because this - // is for legacy entities - assertFalse(r.get().endNode); - assertFalse(r.get().endsWithSemicolon); - } - - assertEquals(value, r.get().resolvedValue); - assertEquals(key, r.get().entityOrFragment); - assertEquals(key.length(), r.get().length); - }); - } - -} From 066ad173bf1b7708150d7d50d7faaee5a27ec007 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Mon, 27 Nov 2023 09:20:56 +0100 Subject: [PATCH 02/18] First version of an alternate XMLString that does not have a reference to a builder but manages its own buffer. This removes an indirection and also permits more inlining --- .../cyberneko/xerces/xni/XMLCharBuffer.java | 605 ++++++++++ .../xerces/xni/XMLCharBufferTest.java | 1065 +++++++++++++++++ 2 files changed, 1670 insertions(+) create mode 100644 src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBuffer.java create mode 100644 src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBufferTest.java diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBuffer.java b/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBuffer.java new file mode 100644 index 00000000..851730e7 --- /dev/null +++ b/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBuffer.java @@ -0,0 +1,605 @@ +/* + * Copyright 2017-2023 Ronald Brill + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.htmlunit.cyberneko.xerces.xni; + +import java.util.Arrays; + +/** + *

This class is meant to replace the {@link XMLString} in many areas where + * performance and memory-efficency is key. The old XMLString remains in + * plays in case one has used that in their own code. + * + *

This buffer is volatile and when you use it, make sure you work with + * it responsibly. In many cases, we will reuse the buffer to avoid fresh + * memory allocations, hence you have to pay attention to its usage pattern. + * It is not meant to be a general String replacement. + * + *

This class avoid many of the standard runtime checks that will result + * in a runtime or array exception anyway. Why check twice and raise the + * same exception? + * + * @author René Schwietzke + */ +public class XMLCharBuffer implements CharSequence { + // our data, can grow + private char[] data_; + + // the current size of the string data + private int length_; + + // the current size of the string data + private final int growBy_; + + // how much do we grow if needed + public static final int CAPACITY_GROWTH = 10; + + // how much do we grow if needed + // a cache line is 64 byte mostly, the overhead is mostly 24 bytes + // a char is two bytes, let's use one cache lines and resize less + public static final int INITIAL_CAPACITY = (64 - 24) / 2; + + /** + * Constructs an XMLCharBuffer with a default size. + */ + public XMLCharBuffer() { + this.data_ = new char[INITIAL_CAPACITY]; + this.length_ = 0; + this.growBy_ = CAPACITY_GROWTH; + } + + /** + * Constructs an XMLCharBuffer with a desired size. + * + * @param startSize the size of the buffer to start with + */ + public XMLCharBuffer(final int startSize) { + this(startSize, CAPACITY_GROWTH); + } + + /** + * Constructs an XMLCharBuffer with a desired size. + * + * @param startSize the size of the buffer to start with + * @param growBy by how much do we want to grow when needed + */ + public XMLCharBuffer(final int startSize, final int growBy) { + // a cache line is 64 byte mostly, the overhead is mostly 24 bytes + // a char is two bytes, let's use one cache lines and resize less + this.data_ = new char[startSize]; + this.length_ = 0; + this.growBy_ = Math.max(1, growBy); + } + + /** + * Constructs an XMLCharBuffer from another buffer. Copies the data + * over. The new buffer capacity matches the length of the source but + * has a minimum capacity of INITIAL_CAPACITY. + * + * @param src the source buffer to copy from + */ + public XMLCharBuffer(final XMLCharBuffer src) { + this(src, 0); + } + + /** + * Constructs an XMLCharBuffer from another buffer. Copies the data + * over. You can add more capacity on top of the source length. If + * you specify 0, the capacity will match the length. + * + * @param src the source buffer to copy from + * @param addCapacity how much capacity to add to this buffer besides + * the already copied data + */ + public XMLCharBuffer(final XMLCharBuffer src, final int addCapacity) { + this.data_ = Arrays.copyOf(src.data_, src.length_ + Math.max(0, addCapacity)); + this.length_ = src.length(); + this.growBy_ = Math.max(1, CAPACITY_GROWTH); + } + + /** + * Constructs an XMLCharBuffer from a string. To avoid + * too much allocation, we just take the string array as our own. + * + * @param src the string to copy from + */ + public XMLCharBuffer(final String src) { + this.data_ = src.toCharArray(); + this.length_ = src.length(); + this.growBy_ = CAPACITY_GROWTH; + } + + /** + * Constructs an XMLString structure preset with the specified values. + * There will not be any room to grow, if you need that, construct an + * empty one and append. + * + *

There are not range checks performed. Make sure your data is legit. + * + * @param ch The character array, must not be null + * @param offset The offset into the character array. + * @param length The length of characters from the offset. + */ + public XMLCharBuffer(final char[] ch, final int offset, final int length) { + // just as big as we need it + this(length); + append(ch, offset, length); + } + + /** + * Check capacity and grow if needed automatically + * + * @param desiredCapacity how much space do we need in total + */ + private void ensureCapacity(final int desiredCapacity) { + if (this.data_.length < desiredCapacity) { + this.data_ = Arrays.copyOf(this.data_, desiredCapacity + this.growBy_); + } + } + + /** + * Returns the current max capacity without growth. Does not + * indicate how much capacity is already in use. Use {@link #length()} + * for that. + * + * @return the current capacity, not taken any usage into account + */ + public int capacity() { + return this.data_.length; + } + + /** + * Appends a single character to the buffer. + * + * @param c the character to append + * @return this instance + */ + public XMLCharBuffer append(final char c) { + ensureCapacity(this.length_ + 1); + + this.data_[this.length_] = c; + this.length_++; + + return this; + } + + /** + * Append a string to this buffer without copying the string first. + * + * @param src the string to copy + * @return this instance + */ + public XMLCharBuffer append(final String src) { + final int start = this.length_; + this.length_ = this.length_ + src.length(); + ensureCapacity(this.length_); + + // copy char by char because we don't get a copy for free + // from a string yet, this might change when immutable arrays + // make it into Java + for (int i = 0; i < src.length(); i++) { + this.data_[start + i] = src.charAt(i); + } + + return this; + } + + /** + * Add another buffer to this one. + * + * @param src the buffer to copy from + * @return this instance + */ + public XMLCharBuffer append(final XMLCharBuffer src) { + final int start = this.length_; + this.length_ = this.length_ + src.length(); + ensureCapacity(this.length_); + + System.arraycopy(src.data_, 0, this.data_, start, src.length_); + + return this; + } + + /** + * Add data from a char array to this buffer wit the ability to specify + * a range to copy from + * + * @param src the source char array + * @param offset the pos to start to copy from + * @param length the length of the data to copy + * + * @return this instance + */ + public XMLCharBuffer append(final char[] src, final int offset, final int length) { + final int start = this.length_; + this.length_ = start + length; + + ensureCapacity(this.length_); + + System.arraycopy(src, offset, this.data_, start, length); + + return this; + } + + /** + * Returns the current length + * @return the length of the buffer data + */ + public int length() { + return length_; + } + + /** + * Tell us how much the capacity grows if needed + * + * @return the value that determines how much we grow the backing + * array in case we have to + */ + public int getGrowBy() { + return this.growBy_; + } + + /** + * Resets the buffer to 0 length. It won't resize it to avoid memory + * churn. + * + * @return this instance for fluid programming + */ + public XMLCharBuffer clear() { + this.length_ = 0; + + return this; + } + + /** + * Resets the buffer to 0 length and sets the new data. This + * is a little cheaper than clear().append(c) depending on + * the where we are and the inlining. + * + * @param c the char to set + * @return this instance for fluid programming + */ + public XMLCharBuffer clearAndAppend(final char c) { + this.length_ = 0; + + if (this.data_.length >= 1) { + this.data_[this.length_] = c; + this.length_++; + } + else { + append(c); + } + + return this; + } + + /** + * Does this buffer end with this string? If we check for + * the empty string, we get true. + * + * @param s the string to check the end against + * @return true of the end matches the buffer, false otherwise + */ + public boolean endsWith(final String s) { + // length does not match, cannot be the end + if (this.length_ < s.length()) { + return false; + } + + // check the string by char, avoids a copy of the string + final int start = this.length_ - s.length(); + for (int i = 0; i < s.length(); i++) { + if (this.data_[i + start] != s.charAt(i)) { + return false; + } + } + + return true; + } + + /** + * Reduces the buffer to the content between start and end marker when + * only whitespaces are found before the startMarker as well as after the end marker. + * If both strings overlap due to indentical characters such as "foo" and "oof" + * and the buffer is " foof ", we don't do anything. + * + *

If a marker is empty, it behaves like {@link String.trim} on that side. + * + * @param startMarker the start string to find, must not be null + * @param endMarker the end string to find, must not be null + * @return this instance + */ + public XMLCharBuffer trimToContent(final String startMarker, final String endMarker) { + // if both are longer or same length than content, don't do anything + final int markerLength = startMarker.length() + endMarker.length(); + if (markerLength >= this.length_) { + return this; + } + + // run over starting whitespaces + int sPos = 0; + for (; sPos < this.length_ - markerLength; sPos++) { + if (!Character.isWhitespace(this.data_[sPos])) { + break; + } + } + + // run over ending whitespaces + int ePos = this.length_ - 1 ; + for (; ePos > sPos - markerLength; ePos--) { + if (!Character.isWhitespace(this.data_[ePos])) { + break; + } + } + + // if we have less content than marker length, give up + // this also helps when markers overlap such as + // and the string is " " + if (ePos - sPos + 1 < markerLength) { + return this; + } + + // check the start + for (int i = 0; i < startMarker.length(); i++) { + if (startMarker.charAt(i) != this.data_[i + sPos]) { + // no start match, stop and don't do anything + return this; + } + } + + // check the end, ePos is when the first good char + // occurred + final int endStartCheckPos = ePos - endMarker.length() + 1; + for (int i = 0; i < endMarker.length(); i++) { + if (endMarker.charAt(i) != this.data_[endStartCheckPos + i]) { + // no start match, stop and don't do anything + return this; + } + } + + // shift left and cut length + final int newLength = ePos - sPos + 1 - markerLength; + System.arraycopy(this.data_, + sPos + startMarker.length(), + this.data_, + 0, newLength); + this.length_ = newLength; + + return this; + } + + /** + * Check if we have only whitespace + * + * @return true if we have only whitespace, false otherwise + */ + public boolean isWhitespace() { + for (int i = 0; i < this.length_; i++) { + if (!Character.isWhitespace(this.data_[i])) { + return false; + } + } + return true; + } + + /** + * Trims the string similar to {@link String.trim} + * @return + */ + public XMLCharBuffer trim() { + // clean the end first, because it is cheap + return trimTrailing().trimLeading(); + } + + /** + * Removes all whitespace before the first non-whitespace char. + * If all are whitespace, we get an empty buffer + * + * @return this instance + */ + public XMLCharBuffer trimLeading() { + // run over starting whitespace + int sPos = 0; + for (; sPos < this.length_; sPos++) { + if (!Character.isWhitespace(this.data_[sPos])) { + break; + } + } + + if (sPos == 0) { + // nothing to do + return this; + } + else if (sPos == this.length_) { + // only whitespace + this.length_ = 0; + return this; + } + + // shift left + final int newLength = this.length_ - sPos; + System.arraycopy(this.data_, + sPos, + this.data_, + 0, newLength); + this.length_ = newLength; + + return this; + } + + /** + * Removes all whitespace at the end. + * If all are whitespace, we get an empty buffer + * + * @return this instance + */ + public XMLCharBuffer trimTrailing() { + // run over ending whitespaces + int ePos = this.length_ - 1; + for (; ePos >= 0; ePos--) { + if (!Character.isWhitespace(this.data_[ePos])) { + break; + } + } + + this.length_ = ePos + 1; + + return this; + } + + /** + * Shortens the buffer by that many positions. If the count is + * larger than the length, we get just an empty buffer. If you pass in negative + * values, we are failing, likely often silently. It is all about performance and + * not a general all-purpose API. + * + * @param count a positive number, no runtime checks, if count is larger than + * length, we get length = 0 + * @return this instance + */ + public XMLCharBuffer shortenBy(final int count) { + final int newLength = this.length_ - count; + this.length_ = newLength < 0 ? 0 : newLength; + + return this; + } + + /** + * Returns a string representation of this buffer. This will be a copy + * operation. + * + * @return a string of the content of this buffer + */ + @Override + public String toString() { + return new String(this.data_, 0, this.length_); + } + + /** + * Returns the char a the given position. Will complain if + * we try to read outside the range + * + * @param index the position to read from + * @return the char at the position + * @throws IndexOutOfBoundsException + * in case one tries to read outside of valid buffer range + */ + @Override + public char charAt(final int index) + { + if (index > this.length_ - 1 || index < 0) { + throw new IndexOutOfBoundsException( + "Tried to read outside of the valid buffer data"); + } + + return this.data_[index]; + } + + /** + * Returns the char a the given position. No checks are + * performed. It is up to the caller to make sure we + * read correctly. Reading outside of the array will + * cause an {@link IndexOutOfBoundsException} but using an + * incorrect position in the array (such as beyond length) + * might stay unnoticed! + * + * @param index the position to read from + * @return the char at the position + */ + public char unsafeCharAt(final int index) + { + return this.data_[index]; + } + + /** + * Returns a content copy of this buffer + * + * @return a copy of this buffer, the capacity might differ + */ + @Override + public XMLCharBuffer clone() { + return new XMLCharBuffer(this); + } + + /** + * Returns a CharSequence that is a subsequence of this sequence. + * The subsequence starts with the char value at the specified index and + * ends with the char value at index end - 1. The length + * (in chars) of the + * returned sequence is end - start, so if start == end + * then an empty sequence is returned. + * + * @param start the start index, inclusive + * @param end the end index, exclusive + * + * @return the specified subsequence + * + * @throws IndexOutOfBoundsException + * if start or end are negative, + * if end is greater than length(), + * or if start is greater than end + * + * @return a charsequence of this buffer + */ + @Override + public CharSequence subSequence(final int start, final int end) + { + if (start < 0) { + throw new StringIndexOutOfBoundsException(start); + } + if (end > this.length_) { + throw new StringIndexOutOfBoundsException(end); + } + + final int l = end - start; + if (l < 0) { + throw new StringIndexOutOfBoundsException(l); + } + + return new String(this.data_, start, l); + } + + /** + * Two buffers are identical when the length and + * the content of the backing array (only for the + * data in view) are identical. + * + * @param o the object to compare with + * @return true if length and array content match, false otherwise + */ + @Override + public boolean equals(final Object o) + { + if (o instanceof XMLCharBuffer) { + final XMLCharBuffer ob = (XMLCharBuffer) o; + if (ob.length_ != this.length_ ) { + return false; + } + + // ok, in JDK 11 or up, we could use an + // Arrays.mismatch, but we cannot due to + // JDK 8 compatibility + for (int i = 0; i < this.length_; i++) { + if (ob.data_[i] != this.data_[i]) { + return false; + } + } + + // length and content match, be happy + return true; + } + + return false; + } +} diff --git a/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBufferTest.java b/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBufferTest.java new file mode 100644 index 00000000..581fc60e --- /dev/null +++ b/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBufferTest.java @@ -0,0 +1,1065 @@ +/* + * Copyright 2017-2023 Ronald Brill + * Copyright 2023 René Schwietzke + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.htmlunit.cyberneko.xerces.xni; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Random; + +import org.junit.jupiter.api.Test; + +/** + * Unit tests for {@link XMLCharBuffer}. + * @author Ronald Brill + * @author René Schwietzke + */ +public class XMLCharBufferTest { + public static final String CHAR5 = "ABCDE"; + public static final String CHAR10 = "ABCDEFGHIJ"; + public static final String CHAR15 = "ABCDEFGHIJKLMNO"; + public static final String CHAR20 = "ABCDEFGHIJKLMNOPQRST"; + public static final String CHAR25 = "ABCDEFGHIJKLMNOPQRSTUVWXY"; + + @Test + public void ctrEmpty() { + final XMLCharBuffer b = new XMLCharBuffer(); + assertEquals(0, b.length()); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + assertEquals("", b.toString()); + } + + @Test + public void ctr_int() { + // standard + { + final XMLCharBuffer b = new XMLCharBuffer(42); + assertEquals(0, b.length()); + assertEquals(42, b.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, b.getGrowBy()); + assertEquals("", b.toString()); + } + // 0 + { + final XMLCharBuffer b = new XMLCharBuffer(0); + assertEquals(0, b.length()); + assertEquals(0, b.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, b.getGrowBy()); + assertEquals("", b.toString()); + } + } + + @Test + public void ctr_int_int() { + // standard + { + final XMLCharBuffer b = new XMLCharBuffer(42, 11); + assertEquals(0, b.length()); + assertEquals(42, b.capacity()); + assertEquals(11, b.getGrowBy()); + assertEquals("", b.toString()); + } + // zero is silently ignored + { + final XMLCharBuffer b = new XMLCharBuffer(42, 0); + assertEquals(0, b.length()); + assertEquals(42, b.capacity()); + assertEquals(1, b.getGrowBy()); + assertEquals("", b.toString()); + } + // 0 size is possible + { + final XMLCharBuffer b = new XMLCharBuffer(0, 3); + assertEquals(0, b.length()); + assertEquals(0, b.capacity()); + assertEquals(3, b.getGrowBy()); + assertEquals("", b.toString()); + } + } + + @Test + public void ctr_Buffer() { + // standard + { + final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer(CHAR25)); + assertEquals(CHAR25, a.toString()); + assertEquals(25, a.length()); + assertEquals(25, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer()); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + assertEquals(0, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + } + + @Test + public void ctr_xmlcharuffer_int() { + // standard + { + final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer("foo"), 11); + assertEquals("foo", a.toString()); + assertEquals(3, a.length()); + assertEquals(14, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer(), 5); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + assertEquals(5, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + } + + @Test + public void ctr_string() { + // empty + { + final XMLCharBuffer a = new XMLCharBuffer("".toString()); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + assertEquals(0, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer("1234".toString()); + assertEquals("1234", a.toString()); + assertEquals(4, a.length()); + assertEquals(4, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + } + + + @Test + public void ctr_char_int_int() { + // empty + { + final XMLCharBuffer a = new XMLCharBuffer("".toCharArray(), 0, 0); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + assertEquals(0, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer("foo".toCharArray(), 0, 3); + assertEquals("foo", a.toString()); + assertEquals(3, a.length()); + assertEquals(3, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer("foobar2".toCharArray(), 3, 3); + assertEquals("bar", a.toString()); + assertEquals(3, a.length()); + assertEquals(3, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + } + + /* + * toString() + */ + @Test + public void toStringTest() { + assertEquals("", new XMLCharBuffer().toString()); + assertEquals("", new XMLCharBuffer(10).toString()); + assertEquals("foo", new XMLCharBuffer("foobar".toCharArray(), 0, 3).toString()); + assertEquals("foobar", new XMLCharBuffer("foobar".toCharArray(), 0, 6).toString()); + + final XMLCharBuffer b1 = new XMLCharBuffer(); + b1.append("foo"); + assertEquals("foo", b1.toString()); + b1.clear().append("bar"); + assertEquals("bar", b1.toString()); + b1.append("more than anything today in the world 0123456"); + assertEquals("barmore than anything today in the world 0123456", b1.toString()); + } + + /* + * Just the base length checks, the rest comes with append and such + * tests. + */ + @Test + public void length() { + assertEquals(0, new XMLCharBuffer().length()); + assertEquals(0, new XMLCharBuffer(10).length()); + + assertEquals(1, new XMLCharBuffer().append('f').length()); + } + + @Test + public void capacity() { + assertEquals(20, new XMLCharBuffer().capacity()); + assertEquals(20, new XMLCharBuffer().append('f').capacity()); + + // let's grow and see + assertEquals(20, new XMLCharBuffer().append("01234567890123456789").capacity()); + } + + @Test + public void append_char_new() { + final XMLCharBuffer b = new XMLCharBuffer(); + assertEquals(0, b.length()); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + + b.append('a'); + assertEquals(1, b.length()); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + assertEquals("a", b.toString()); + + b.append('b'); + b.append('c'); + b.append('d'); + b.append('e'); + assertEquals(5, b.length()); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + assertEquals("abcde", b.toString()); + + // our source of correctness + final StringBuilder sb = new StringBuilder(b.toString()); + final Random r = new Random(); + + for (int i = 0; i < 100; i++) { + final char c = CHAR25.charAt(r.nextInt(CHAR25.length())); + sb.append(c); + b.append(c); + + assertEquals(sb.toString(), b.toString()); + } + } + + @Test + public void append_charbuffer_new() { + final XMLCharBuffer c0 = new XMLCharBuffer(); + final XMLCharBuffer c5 = new XMLCharBuffer("01234"); + final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); + + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(c0); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // self empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(a); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(c5); + assertEquals(c5.toString(), a.toString()); + assertEquals(5, a.length()); + } + // self standard + { + final XMLCharBuffer a = new XMLCharBuffer("ABCDE"); + a.append(a); + assertEquals("ABCDEABCDE", a.toString()); + assertEquals(10, a.length()); + } + + } + + @Test + public void append_charbuffer_noResize() { + final XMLCharBuffer c0 = new XMLCharBuffer(); + final XMLCharBuffer c5 = new XMLCharBuffer("01234"); + final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); + + { + final XMLCharBuffer a = new XMLCharBuffer("012"); + a.append(c0); + assertEquals(3, a.capacity()); + assertEquals("012", a.toString()); + a.append(c5); + assertEquals("01201234", a.toString()); + assertEquals(18, a.capacity()); + assertEquals(8, a.length()); + } + } + + @Test + public void append_charbuffer_resize() { + final XMLCharBuffer c0 = new XMLCharBuffer(); + final XMLCharBuffer c5 = new XMLCharBuffer("a-b-c"); + final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); + + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(c5); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("a-b-c", a.toString()); + assertEquals(5, a.length()); + a.append(c25); + assertEquals("a-b-c" + CHAR25, a.toString()); + assertEquals(40, a.capacity()); + assertEquals(30, a.length()); + } + } + + @Test + public void append_string() { + // new, no resize + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(CHAR5, a.toString()); + assertEquals(5, a.length()); + } + // new, resize at once + { + final XMLCharBuffer a = new XMLCharBuffer(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + a.append(CHAR5 + CHAR25); + assertEquals(40, a.capacity()); + assertEquals(CHAR5 + CHAR25, a.toString()); + assertEquals(30, a.length()); + } + // resize later + { + final XMLCharBuffer a = new XMLCharBuffer(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + a.append(CHAR5); + a.append(CHAR25); + assertEquals(40, a.capacity()); + assertEquals(CHAR5 + CHAR25, a.toString()); + assertEquals(30, a.length()); + } + // empty string + { + final XMLCharBuffer a = new XMLCharBuffer(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + a.append(""); + a.append(""); + a.append(CHAR25); + a.append(""); + assertEquals(35, a.capacity()); + assertEquals(CHAR25, a.toString()); + assertEquals(25, a.length()); + } + } + + @Test + public void append_char_int_int_new() { + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append("ABC-DEF-GHU".toCharArray(), 0, 0); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append("ABC-DEF-GHU".toCharArray(), 0, 11); + assertEquals("ABC-DEF-GHU", a.toString()); + assertEquals(11, a.length()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append("ABC-DEF-GHU".toCharArray(), 1, 10); + assertEquals("BC-DEF-GHU", a.toString()); + assertEquals(10, a.length()); + } + // requires growth + { + final XMLCharBuffer a = new XMLCharBuffer(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + a.append(CHAR25.toCharArray(), 0, 25); + assertEquals(35, a.capacity()); + assertEquals(CHAR25, a.toString()); + assertEquals(25, a.length()); + } + // append several times + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append("abc".toCharArray(), 0, 3); + a.append("1234".toCharArray(), 0, 4); + a.append("".toCharArray(), 0, 0); + a.append("0987654321".toCharArray(), 0, 10); + a.append("FOO--OO".toCharArray(), 3, 2); + assertEquals("abc12340987654321--", a.toString()); + assertEquals(10 + 0 + 4 + 3 + 2, a.length()); + } + } + + @Test + public void charAt() { + { + final XMLCharBuffer a = new XMLCharBuffer("a"); + assertEquals('a', a.charAt(0)); + } + { + final XMLCharBuffer a = new XMLCharBuffer("abc"); + assertEquals('a', a.charAt(0)); + assertEquals('b', a.charAt(1)); + assertEquals('c', a.charAt(2)); + } + } + + @Test + public void charAt_Errors() { + // empty + final XMLCharBuffer a1 = new XMLCharBuffer(); + assertThrows(IndexOutOfBoundsException.class, () -> { + a1.charAt(0); + }); + + final XMLCharBuffer a2 = new XMLCharBuffer(""); + assertThrows(IndexOutOfBoundsException.class, () -> { + a2.charAt(0); + }); + + final XMLCharBuffer b = new XMLCharBuffer("foo"); + assertThrows(IndexOutOfBoundsException.class, () -> { + b.charAt(-1); + }); + + final XMLCharBuffer c = new XMLCharBuffer("foo"); + assertThrows(IndexOutOfBoundsException.class, () -> { + b.charAt(3); + }); + assertThrows(IndexOutOfBoundsException.class, () -> { + b.charAt(4); + }); + } + + @Test + public void unsafeCharAt() { + { + final XMLCharBuffer a = new XMLCharBuffer("a"); + assertEquals('a', a.unsafeCharAt(0)); + } + { + final XMLCharBuffer a = new XMLCharBuffer("abc"); + assertEquals('a', a.unsafeCharAt(0)); + assertEquals('b', a.unsafeCharAt(1)); + assertEquals('c', a.unsafeCharAt(2)); + } + } + + @Test + public void unsafeCharAt_Errors() { + // empty + final XMLCharBuffer a1 = new XMLCharBuffer(); + // can read any garbage + a1.unsafeCharAt(0); + + // cannot read outside the array of course + assertThrows(IndexOutOfBoundsException.class, () -> { + a1.unsafeCharAt(XMLCharBuffer.INITIAL_CAPACITY); + }); + } + + @Test + public void endsWidth() { + // no size match, string to large + assertFalse(new XMLCharBuffer("foo").endsWith("foobar")); + + // empty string + assertTrue(new XMLCharBuffer("foobar").endsWith("")); + + // both empty + assertTrue(new XMLCharBuffer("").endsWith("")); + + // both are the same size and don't match + assertFalse(new XMLCharBuffer("foo").endsWith("bar")); + + // both are the same size and match + assertTrue(new XMLCharBuffer("foo").endsWith("foo")); + + // first char mismatch + assertFalse(new XMLCharBuffer("foobar").endsWith("car")); + + // last char mismatch + assertFalse(new XMLCharBuffer("foobar").endsWith("baa")); + + // full match + assertTrue(new XMLCharBuffer("foobar").endsWith("bar")); + } + + @Test + public void clear() { + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.clear(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // some stuff in it + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clear(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // repeated clear + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clear(); + a.clear(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // clear append + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clear(); + a.append(CHAR5); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(CHAR5, a.toString()); + assertEquals(5, a.length()); + } + } + + @Test + public void clearAndAppend() { + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.clearAndAppend('a'); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("a", a.toString()); + assertEquals(1, a.length()); + } + // some stuff in it + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clearAndAppend('a'); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("a", a.toString()); + assertEquals(1, a.length()); + } + // repeated clear + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clearAndAppend('a'); + a.clearAndAppend('a'); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("a", a.toString()); + assertEquals(1, a.length()); + } + // clear append + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clearAndAppend('a'); + a.append(CHAR5); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("a" + CHAR5, a.toString()); + assertEquals(6, a.length()); + } + // clear append on total empty + { + final XMLCharBuffer a = new XMLCharBuffer(""); + a.clearAndAppend('a'); + assertEquals(11, a.capacity()); + assertEquals("a", a.toString()); + assertEquals(1, a.length()); + } + } + + @Test + public void reduceToContent() { + final XMLCharBuffer x = new XMLCharBuffer(); + + // buffer shorter than markers + x.clear().append("foo"); + x.trimToContent(""); + assertEquals(3, x.length()); + assertEquals("foo", x.toString()); + + // only start + x.clear().append("Sfoo"); + x.trimToContent("S", "-->"); + assertEquals(4, x.length()); + assertEquals("Sfoo", x.toString()); + + // only end + x.clear().append("fooE"); + x.trimToContent("S", "E"); + assertEquals(4, x.length()); + assertEquals("fooE", x.toString()); + + // start and end, no whitespace + x.clear().append("SfooE"); + x.trimToContent("S", "E"); + assertEquals(3, x.length()); + assertEquals("foo", x.toString()); + + // start and end, only start with whitespace + x.clear().append(" SfooE"); + x.trimToContent("S", "E"); + assertEquals(3, x.length()); + assertEquals("foo", x.toString()); + + // start and end, only end with whitespace + x.clear().append("SfooE \n"); + x.trimToContent("S", "E"); + assertEquals(3, x.length()); + assertEquals("foo", x.toString()); + + // start and end, both with whitespace + x.clear().append(" \tSfooE \n"); + x.trimToContent("S", "E"); + assertEquals(3, x.length()); + assertEquals("foo", x.toString()); + + // start and end, only one whitespace each + x.clear().append(" SfooE "); + x.trimToContent("S", "E"); + assertEquals(3, x.length()); + assertEquals("foo", x.toString()); + + // start and end, both with whitespace + // no content but markers + x.clear().append(" \tSE \n"); + x.trimToContent("S", "E"); + assertEquals(0, x.length()); + assertEquals("", x.toString()); + + x.clear().append(" 1234 "); + x.trimToContent("12", "34"); + assertEquals(0, x.length()); + assertEquals("", x.toString()); + + // start and end, both with whitespace + // one char content + x.clear().append(" 1234 "); + x.trimToContent("12", "4"); + assertEquals(1, x.length()); + assertEquals("3", x.toString()); + + // start and end, both with whitespace + // content, just whitespace + x.clear().append(" 12 4 "); + x.trimToContent("12", "4"); + assertEquals(1, x.length()); + assertEquals(" ", x.toString()); + + // start and end, both with whitespace + // content, just chars + + // start and end, both with whitespace + // content, content with whitespaces + + // one char start and end + + // two chars start and end + + // empty end marker + + // empty start marker + + // empty start and end, behaves like trim, with whitespace + + // empty start and end, behaves like trim, without + + // some non ASCII stuff + + // markers are doubled + + // gives us some fancy whitespaces + + // original tests from XmlString + x.clear().append(""); + x.trimToContent(""); + assertEquals(" hello", x.toString()); + + x.clear().append(" \n \n"); + x.trimToContent(""); + assertEquals(" hello", x.toString()); + + x.clear().append("hello"); + x.trimToContent(""); + assertEquals("hello", x.toString()); + + x.clear().append(""); + assertEquals(""); + x.trimToContent(""); + assertEquals("", x.toString()); + + x.clear().append(" \n"); + x.trimToContent(""); + assertEquals(" \n", x.toString()); + } + + @Test + public void trimLeading() { + final XMLCharBuffer xmlString = new XMLCharBuffer(); + + xmlString.clear().append(""); + xmlString.trimLeading(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append("a"); + xmlString.trimLeading(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append("a "); + xmlString.trimLeading(); + assertEquals("a ", xmlString.toString()); + + xmlString.clear().append("a b"); + xmlString.trimLeading(); + assertEquals("a b", xmlString.toString()); + + xmlString.clear().append(" a"); + xmlString.trimLeading(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" abckasd"); + xmlString.trimLeading(); + assertEquals("abckasd", xmlString.toString()); + + xmlString.clear().append(" \t a"); + xmlString.trimLeading(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trimLeading(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trimLeading(); + assertEquals("", xmlString.toString()); + } + + @Test + public void trimTrailing() { + final XMLCharBuffer xmlString = new XMLCharBuffer(); + + xmlString.clear().append(""); + xmlString.trimTrailing(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append("a"); + xmlString.trimTrailing(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" a"); + xmlString.trimTrailing(); + assertEquals(" a", xmlString.toString()); + + xmlString.clear().append("a b"); + xmlString.trimTrailing(); + assertEquals("a b", xmlString.toString()); + + xmlString.clear().append("a "); + xmlString.trimTrailing(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append("a "); + xmlString.trimTrailing(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trimTrailing(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trimTrailing(); + assertEquals("", xmlString.toString()); + } + + @Test + public void trim() { + final XMLCharBuffer xmlString = new XMLCharBuffer(); + + xmlString.clear().append(""); + xmlString.trim(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append("a"); + xmlString.trim(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" a"); + xmlString.trim(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append("a b"); + xmlString.trim(); + assertEquals("a b", xmlString.toString()); + + xmlString.clear().append("a "); + xmlString.trim(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append("a "); + xmlString.trim(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" a "); + xmlString.trim(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trim(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trim(); + assertEquals("", xmlString.toString()); + } + + @Test + public void shortenBy() { + // shorten empty + { + final XMLCharBuffer a = new XMLCharBuffer(""); + a.shortenBy(12); + assertEquals(0, a.length()); + assertEquals("", a.toString()); + } + // shorten by 0 + { + final XMLCharBuffer a = new XMLCharBuffer("ab"); + a.shortenBy(0); + assertEquals(2, a.length()); + assertEquals("ab", a.toString()); + } + // shorten by larger + { + final XMLCharBuffer a = new XMLCharBuffer("ab"); + a.shortenBy(4); + assertEquals(0, a.length()); + assertEquals("", a.toString()); + } + // shorten standard + { + final XMLCharBuffer a = new XMLCharBuffer("abcd"); + a.shortenBy(1); + assertEquals(3, a.length()); + assertEquals("abc", a.toString()); + } + // shorten standard + { + final XMLCharBuffer a = new XMLCharBuffer("abcd123"); + a.shortenBy(3); + assertEquals(4, a.length()); + assertEquals("abcd", a.toString()); + } + } + + @Test + public void cloneTest() { + { + final XMLCharBuffer o = new XMLCharBuffer(""); + final XMLCharBuffer a = o.clone(); + assertEquals(0, a.length()); + assertEquals("", a.toString()); + assertTrue(o != a); + } + { + final XMLCharBuffer o = new XMLCharBuffer("abc"); + final XMLCharBuffer a = o.clone(); + assertEquals(3, a.length()); + assertEquals("abc", a.toString()); + assertTrue(o != a); + } + { + final XMLCharBuffer o = new XMLCharBuffer(" 817 "); + final XMLCharBuffer a = o.clone(); + final XMLCharBuffer b = a.clone(); + final XMLCharBuffer c = b.clone(); + assertEquals(5, c.length()); + assertEquals(" 817 ", c.toString()); + assertTrue(o != c); + } + } + + @Test + public void subSequence() { + { + final CharSequence o = new XMLCharBuffer("").subSequence(0, 0); + assertEquals(0, o.length()); + assertEquals("", o.toString()); + } + { + final CharSequence o = new XMLCharBuffer("a").subSequence(0, 1); + assertEquals(1, o.length()); + assertEquals("a", o.toString()); + } + { + final CharSequence o = new XMLCharBuffer("abc").subSequence(0, 3); + assertEquals(3, o.length()); + assertEquals("abc", o.toString()); + } + { + final CharSequence o = new XMLCharBuffer("abc").subSequence(1, 3); + assertEquals(2, o.length()); + assertEquals("bc", o.toString()); + } + { + final CharSequence o = new XMLCharBuffer("abc").subSequence(0, 2); + assertEquals(2, o.length()); + assertEquals("ab", o.toString()); + } + { + final CharSequence o = new XMLCharBuffer("abc").subSequence(1, 2); + assertEquals(1, o.length()); + assertEquals("b", o.toString()); + } + } + + @Test + public void subSequenceErrors() { + { + final CharSequence o = new XMLCharBuffer(""); + assertThrows(IndexOutOfBoundsException.class, () -> { + o.subSequence(-1, 2); + }); + assertThrows(IndexOutOfBoundsException.class, () -> { + o.subSequence(0, 1); + }); + } + { + final CharSequence o = new XMLCharBuffer("12345"); + assertThrows(IndexOutOfBoundsException.class, () -> { + o.subSequence(-2, 3); + }); + assertThrows(IndexOutOfBoundsException.class, () -> { + o.subSequence(0, 6); + }); + assertThrows(IndexOutOfBoundsException.class, () -> { + o.subSequence(1, 0); + }); + } + } + + @Test + public void equalsTest() { + // different types + { + final String a = new String(); + final XMLCharBuffer b = new XMLCharBuffer(); + assertFalse(a.equals(b)); + assertFalse(b.equals(a)); + } + // both empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + final XMLCharBuffer b = new XMLCharBuffer(); + assertTrue(a.equals(b)); + assertTrue(b.equals(a)); + } + // self + { + final XMLCharBuffer a = new XMLCharBuffer(); + final XMLCharBuffer b = new XMLCharBuffer("abc"); + assertTrue(a.equals(a)); + assertTrue(b.equals(b)); + } + // different length + { + final XMLCharBuffer a = new XMLCharBuffer("a"); + final XMLCharBuffer b = new XMLCharBuffer("ab"); + assertFalse(a.equals(b)); + assertFalse(b.equals(a)); + } + // different content, same length + { + final XMLCharBuffer a = new XMLCharBuffer("ac"); + final XMLCharBuffer b = new XMLCharBuffer("ab"); + assertFalse(a.equals(b)); + assertFalse(b.equals(a)); + } + // length 1, identical + { + final XMLCharBuffer a = new XMLCharBuffer("a"); + final XMLCharBuffer b = new XMLCharBuffer("a"); + assertTrue(a.equals(b)); + assertTrue(b.equals(a)); + } + // length 1, different + { + final XMLCharBuffer a = new XMLCharBuffer("b"); + final XMLCharBuffer b = new XMLCharBuffer("b"); + assertTrue(a.equals(b)); + assertTrue(b.equals(a)); + } + // length > 1, same + { + final XMLCharBuffer a = new XMLCharBuffer("81hal/&%$"); + final XMLCharBuffer b = new XMLCharBuffer("81hal/&%$"); + assertTrue(a.equals(b)); + assertTrue(b.equals(a)); + } + // length > 1, different + { + final XMLCharBuffer a = new XMLCharBuffer("b091872983"); + final XMLCharBuffer b = new XMLCharBuffer("b09187298_"); + assertFalse(a.equals(b)); + assertFalse(b.equals(a)); + } + } + + @Test + public void isWhitespace() { + { + final XMLCharBuffer a = new XMLCharBuffer(""); + assertTrue(a.isWhitespace()); + } + { + final XMLCharBuffer a = new XMLCharBuffer(" "); + assertTrue(a.isWhitespace()); + } + { + final XMLCharBuffer a = new XMLCharBuffer("a"); + assertFalse(a.isWhitespace()); + } + { + final XMLCharBuffer a = new XMLCharBuffer(" a\t \n"); + assertFalse(a.isWhitespace()); + } + { + final XMLCharBuffer a = new XMLCharBuffer(" \t \n"); + assertTrue(a.isWhitespace()); + } + } +} From d5654f1090ccded353b712fef97e2c00d06a3e6e Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Mon, 27 Nov 2023 11:35:48 +0100 Subject: [PATCH 03/18] Replaces stack with a lightweight ministack for better inlining --- .../org/htmlunit/cyberneko/HTMLScanner.java | 10 +- .../htmlunit/cyberneko/util/MiniStack.java | 76 ++++++++ .../cyberneko/util/MiniStackTest.java | 180 ++++++++++++++++++ 3 files changed, 261 insertions(+), 5 deletions(-) create mode 100644 src/main/java/org/htmlunit/cyberneko/util/MiniStack.java create mode 100644 src/test/java/org/htmlunit/cyberneko/util/MiniStackTest.java diff --git a/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java b/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java index bf035a8e..ea6a8cb4 100644 --- a/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java +++ b/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java @@ -24,8 +24,8 @@ import java.io.UnsupportedEncodingException; import java.net.URL; import java.util.Locale; -import java.util.Stack; +import org.htmlunit.cyberneko.util.MiniStack; import org.htmlunit.cyberneko.xerces.util.EncodingMap; import org.htmlunit.cyberneko.xerces.util.NamespaceSupport; import org.htmlunit.cyberneko.xerces.util.URI; @@ -402,7 +402,7 @@ public class HTMLScanner implements XMLDocumentScanner, XMLLocator, HTMLComponen protected CurrentEntity fCurrentEntity; /** The current entity stack. */ - protected final Stack fCurrentEntityStack = new Stack<>(); + protected final MiniStack fCurrentEntityStack = new MiniStack<>(); /** The current scanner. */ protected Scanner fScanner; @@ -732,7 +732,7 @@ public void setInputSource(final XMLInputSource source) throws IOException { fElementCount = 0; fElementDepth = -1; fByteStream = null; - fCurrentEntityStack.removeAllElements(); + fCurrentEntityStack.clear(); fBeginLineNumber = 1; fBeginColumnNumber = 1; @@ -2035,7 +2035,7 @@ else if (ename != null && htmlConfiguration_.getHtmlElements().getElement(enameL } } catch (final EOFException e) { - if (fCurrentEntityStack.empty()) { + if (fCurrentEntityStack.isEmpty()) { setScannerState(STATE_END_DOCUMENT); } else { @@ -3185,7 +3185,7 @@ public boolean scan(final boolean complete) throws IOException { } catch (final EOFException e) { setScanner(fContentScanner); - if (fCurrentEntityStack.empty()) { + if (fCurrentEntityStack.isEmpty()) { setScannerState(STATE_END_DOCUMENT); } else { diff --git a/src/main/java/org/htmlunit/cyberneko/util/MiniStack.java b/src/main/java/org/htmlunit/cyberneko/util/MiniStack.java new file mode 100644 index 00000000..7636ace0 --- /dev/null +++ b/src/main/java/org/htmlunit/cyberneko/util/MiniStack.java @@ -0,0 +1,76 @@ +package org.htmlunit.cyberneko.util; + +import java.util.Arrays; + +/** + * Extremely light stack implementation. Perfect for inlining. + * + */ +public class MiniStack { + + private Object[] elements_; + private int pos_ = -1; + + public MiniStack() { + elements_ = new Object[8]; + } + + public void clear() { + pos_ = -1; + + // drop all references to ensure GC + // this is not most efficient + Arrays.fill(this.elements_, null); + } + + /** + * Resets the stack to zero but does not + * clean it + */ + public void reset() { + pos_ = -1; + } + + @SuppressWarnings("unchecked") + public E pop() { + if ( pos_ >= 0) { + final E e = (E) this.elements_[pos_]; + // ensure ref is clean + this.elements_[pos_] = null; + pos_--; + + return e; + } + else { + return null; + } + } + + @SuppressWarnings("unchecked") + public E peek() { + if ( pos_ >= 0) { + return (E) this.elements_[pos_]; + } + else { + return null; + } + } + + public void push(E element) { + pos_++; + + if (pos_ == this.elements_.length) { + this.elements_ = Arrays.copyOf(this.elements_, this.elements_.length + 8); + } + + this.elements_[pos_] = element; + } + + public boolean isEmpty() { + return pos_ < 0; + } + + public int size() { + return pos_ + 1; + } +} diff --git a/src/test/java/org/htmlunit/cyberneko/util/MiniStackTest.java b/src/test/java/org/htmlunit/cyberneko/util/MiniStackTest.java new file mode 100644 index 00000000..4f95be2f --- /dev/null +++ b/src/test/java/org/htmlunit/cyberneko/util/MiniStackTest.java @@ -0,0 +1,180 @@ +package org.htmlunit.cyberneko.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import org.junit.jupiter.api.Test; + +public class MiniStackTest { + @Test + public void ctr() { + final MiniStack m = new MiniStack<>(); + assertEquals(0, m.size()); + assertNull(m.pop()); + } + + @Test + public void pop() { + // empty + { + final MiniStack m = new MiniStack<>(); + assertNull(m.pop()); + } + // full + { + final MiniStack m = new MiniStack<>(); + m.push("foo"); + assertEquals("foo", m.pop()); + assertNull(m.pop()); + assertEquals(0, m.size()); + } + // two elements + { + final MiniStack m = new MiniStack<>(); + m.push("1"); + m.push("2"); + assertEquals("2", m.pop()); + assertEquals(1, m.size()); + + assertEquals("1", m.pop()); + assertEquals(0, m.size()); + assertNull(m.pop()); + } + } + + @Test + public void push() { + final String a = new String("a"); + + // empty + { + final MiniStack m = new MiniStack<>(); + m.push("a"); + assertEquals(1, m.size()); + } + // two + { + final MiniStack m = new MiniStack<>(); + m.push("foo"); + m.push(a); + m.push(a); + assertEquals(3, m.size()); + } + // grow + { + final MiniStack m = new MiniStack<>(); + for (int i = 0; i < 20; i++) { + m.push(i); + assertEquals(i + 1, m.size()); + } + assertEquals(20, m.size()); + } + } + + @Test + public void peek() { + // empty + { + final MiniStack m = new MiniStack<>(); + assertNull(m.peek()); + } + // more + { + final MiniStack m = new MiniStack<>(); + m.push("foo"); + assertEquals("foo", m.peek()); + m.push("2"); + assertEquals("2", m.peek()); + m.push("1"); + assertEquals("1", m.peek()); + } + } + + @Test + public void isEmpty() { + // empty + { + final MiniStack m = new MiniStack<>(); + assertTrue(m.isEmpty()); + } + // more + { + final MiniStack m = new MiniStack<>(); + m.push("foo"); + assertFalse(m.isEmpty()); + } + } + + + @Test + public void size() { + // empty + { + final MiniStack m = new MiniStack<>(); + assertEquals(0, m.size()); + } + // one + { + final MiniStack m = new MiniStack<>(); + m.push("foo"); + assertEquals(1, m.size()); + } + // more + { + final MiniStack m = new MiniStack<>(); + m.push("foo"); + m.push("foo"); + m.push("foo"); + m.push("foo"); + m.push("foo"); + assertEquals(5, m.size()); + } + } + + @Test + public void clear() { + // empty + { + final MiniStack m = new MiniStack<>(); + m.clear(); + assertEquals(0, m.size()); + } + // one + { + final MiniStack m = new MiniStack<>(); + m.push("foo"); + assertEquals(1, m.size()); + m.clear(); + assertEquals(0, m.size()); + assertTrue(m.isEmpty()); + assertNull(m.peek()); + assertNull(m.pop()); + } + + // we might have to open the object for a check of the backing array + } + + @Test + public void reset() { + // empty + { + final MiniStack m = new MiniStack<>(); + m.clear(); + assertEquals(0, m.size()); + } + // one + { + final MiniStack m = new MiniStack<>(); + m.push("foo"); + assertEquals(1, m.size()); + m.clear(); + assertEquals(0, m.size()); + assertTrue(m.isEmpty()); + assertNull(m.peek()); + assertNull(m.pop()); + } + } + +} From fb69d792d7d47bd402c23f671df614f5e5c3c341 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Fri, 29 Dec 2023 19:58:28 +0100 Subject: [PATCH 04/18] Added a constructor that allows to set a desired initial size --- .../org/htmlunit/cyberneko/xerces/xni/XMLString.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java b/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java index 99ae5d57..4d15e258 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java @@ -40,6 +40,7 @@ * @author Eric Ye, IBM * @author Andy Clark, IBM * @author Ronald Brill + * @author René Schwietzke */ public class XMLString { @@ -52,6 +53,15 @@ public XMLString() { builder_ = new StringBuilder(); } + /** + * Constructs an XMLString. + * + * @param initialCapacity desired initial capacity + */ + public XMLString(final int initialCapacity) { + builder_ = new StringBuilder(initialCapacity); + } + /** * Constructs an XMLString structure preset with the specified values. * From ac005a609319cc41c19d442d1f6db755a15b7cb6 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 12:53:30 +0100 Subject: [PATCH 05/18] Adding a new XMLString implementation that is more memory efficient and offers more ways to deal with the content including more efficient trim operations. It tries to be as compatible as possible with the old XMLString. --- .../cyberneko/xerces/xni/XMLCharBuffer.java | 605 ---------- .../cyberneko/xerces/xni/XMLString.java | 633 ++++++++-- .../xerces/xni/XMLCharBufferTest.java | 1065 ----------------- .../xerces/xni/XMLStringLegacyTest.java | 88 ++ .../cyberneko/xerces/xni/XMLStringTest.java | 1033 +++++++++++++++- 5 files changed, 1599 insertions(+), 1825 deletions(-) delete mode 100644 src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBuffer.java delete mode 100644 src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBufferTest.java create mode 100644 src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringLegacyTest.java diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBuffer.java b/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBuffer.java deleted file mode 100644 index 851730e7..00000000 --- a/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBuffer.java +++ /dev/null @@ -1,605 +0,0 @@ -/* - * Copyright 2017-2023 Ronald Brill - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.htmlunit.cyberneko.xerces.xni; - -import java.util.Arrays; - -/** - *

This class is meant to replace the {@link XMLString} in many areas where - * performance and memory-efficency is key. The old XMLString remains in - * plays in case one has used that in their own code. - * - *

This buffer is volatile and when you use it, make sure you work with - * it responsibly. In many cases, we will reuse the buffer to avoid fresh - * memory allocations, hence you have to pay attention to its usage pattern. - * It is not meant to be a general String replacement. - * - *

This class avoid many of the standard runtime checks that will result - * in a runtime or array exception anyway. Why check twice and raise the - * same exception? - * - * @author René Schwietzke - */ -public class XMLCharBuffer implements CharSequence { - // our data, can grow - private char[] data_; - - // the current size of the string data - private int length_; - - // the current size of the string data - private final int growBy_; - - // how much do we grow if needed - public static final int CAPACITY_GROWTH = 10; - - // how much do we grow if needed - // a cache line is 64 byte mostly, the overhead is mostly 24 bytes - // a char is two bytes, let's use one cache lines and resize less - public static final int INITIAL_CAPACITY = (64 - 24) / 2; - - /** - * Constructs an XMLCharBuffer with a default size. - */ - public XMLCharBuffer() { - this.data_ = new char[INITIAL_CAPACITY]; - this.length_ = 0; - this.growBy_ = CAPACITY_GROWTH; - } - - /** - * Constructs an XMLCharBuffer with a desired size. - * - * @param startSize the size of the buffer to start with - */ - public XMLCharBuffer(final int startSize) { - this(startSize, CAPACITY_GROWTH); - } - - /** - * Constructs an XMLCharBuffer with a desired size. - * - * @param startSize the size of the buffer to start with - * @param growBy by how much do we want to grow when needed - */ - public XMLCharBuffer(final int startSize, final int growBy) { - // a cache line is 64 byte mostly, the overhead is mostly 24 bytes - // a char is two bytes, let's use one cache lines and resize less - this.data_ = new char[startSize]; - this.length_ = 0; - this.growBy_ = Math.max(1, growBy); - } - - /** - * Constructs an XMLCharBuffer from another buffer. Copies the data - * over. The new buffer capacity matches the length of the source but - * has a minimum capacity of INITIAL_CAPACITY. - * - * @param src the source buffer to copy from - */ - public XMLCharBuffer(final XMLCharBuffer src) { - this(src, 0); - } - - /** - * Constructs an XMLCharBuffer from another buffer. Copies the data - * over. You can add more capacity on top of the source length. If - * you specify 0, the capacity will match the length. - * - * @param src the source buffer to copy from - * @param addCapacity how much capacity to add to this buffer besides - * the already copied data - */ - public XMLCharBuffer(final XMLCharBuffer src, final int addCapacity) { - this.data_ = Arrays.copyOf(src.data_, src.length_ + Math.max(0, addCapacity)); - this.length_ = src.length(); - this.growBy_ = Math.max(1, CAPACITY_GROWTH); - } - - /** - * Constructs an XMLCharBuffer from a string. To avoid - * too much allocation, we just take the string array as our own. - * - * @param src the string to copy from - */ - public XMLCharBuffer(final String src) { - this.data_ = src.toCharArray(); - this.length_ = src.length(); - this.growBy_ = CAPACITY_GROWTH; - } - - /** - * Constructs an XMLString structure preset with the specified values. - * There will not be any room to grow, if you need that, construct an - * empty one and append. - * - *

There are not range checks performed. Make sure your data is legit. - * - * @param ch The character array, must not be null - * @param offset The offset into the character array. - * @param length The length of characters from the offset. - */ - public XMLCharBuffer(final char[] ch, final int offset, final int length) { - // just as big as we need it - this(length); - append(ch, offset, length); - } - - /** - * Check capacity and grow if needed automatically - * - * @param desiredCapacity how much space do we need in total - */ - private void ensureCapacity(final int desiredCapacity) { - if (this.data_.length < desiredCapacity) { - this.data_ = Arrays.copyOf(this.data_, desiredCapacity + this.growBy_); - } - } - - /** - * Returns the current max capacity without growth. Does not - * indicate how much capacity is already in use. Use {@link #length()} - * for that. - * - * @return the current capacity, not taken any usage into account - */ - public int capacity() { - return this.data_.length; - } - - /** - * Appends a single character to the buffer. - * - * @param c the character to append - * @return this instance - */ - public XMLCharBuffer append(final char c) { - ensureCapacity(this.length_ + 1); - - this.data_[this.length_] = c; - this.length_++; - - return this; - } - - /** - * Append a string to this buffer without copying the string first. - * - * @param src the string to copy - * @return this instance - */ - public XMLCharBuffer append(final String src) { - final int start = this.length_; - this.length_ = this.length_ + src.length(); - ensureCapacity(this.length_); - - // copy char by char because we don't get a copy for free - // from a string yet, this might change when immutable arrays - // make it into Java - for (int i = 0; i < src.length(); i++) { - this.data_[start + i] = src.charAt(i); - } - - return this; - } - - /** - * Add another buffer to this one. - * - * @param src the buffer to copy from - * @return this instance - */ - public XMLCharBuffer append(final XMLCharBuffer src) { - final int start = this.length_; - this.length_ = this.length_ + src.length(); - ensureCapacity(this.length_); - - System.arraycopy(src.data_, 0, this.data_, start, src.length_); - - return this; - } - - /** - * Add data from a char array to this buffer wit the ability to specify - * a range to copy from - * - * @param src the source char array - * @param offset the pos to start to copy from - * @param length the length of the data to copy - * - * @return this instance - */ - public XMLCharBuffer append(final char[] src, final int offset, final int length) { - final int start = this.length_; - this.length_ = start + length; - - ensureCapacity(this.length_); - - System.arraycopy(src, offset, this.data_, start, length); - - return this; - } - - /** - * Returns the current length - * @return the length of the buffer data - */ - public int length() { - return length_; - } - - /** - * Tell us how much the capacity grows if needed - * - * @return the value that determines how much we grow the backing - * array in case we have to - */ - public int getGrowBy() { - return this.growBy_; - } - - /** - * Resets the buffer to 0 length. It won't resize it to avoid memory - * churn. - * - * @return this instance for fluid programming - */ - public XMLCharBuffer clear() { - this.length_ = 0; - - return this; - } - - /** - * Resets the buffer to 0 length and sets the new data. This - * is a little cheaper than clear().append(c) depending on - * the where we are and the inlining. - * - * @param c the char to set - * @return this instance for fluid programming - */ - public XMLCharBuffer clearAndAppend(final char c) { - this.length_ = 0; - - if (this.data_.length >= 1) { - this.data_[this.length_] = c; - this.length_++; - } - else { - append(c); - } - - return this; - } - - /** - * Does this buffer end with this string? If we check for - * the empty string, we get true. - * - * @param s the string to check the end against - * @return true of the end matches the buffer, false otherwise - */ - public boolean endsWith(final String s) { - // length does not match, cannot be the end - if (this.length_ < s.length()) { - return false; - } - - // check the string by char, avoids a copy of the string - final int start = this.length_ - s.length(); - for (int i = 0; i < s.length(); i++) { - if (this.data_[i + start] != s.charAt(i)) { - return false; - } - } - - return true; - } - - /** - * Reduces the buffer to the content between start and end marker when - * only whitespaces are found before the startMarker as well as after the end marker. - * If both strings overlap due to indentical characters such as "foo" and "oof" - * and the buffer is " foof ", we don't do anything. - * - *

If a marker is empty, it behaves like {@link String.trim} on that side. - * - * @param startMarker the start string to find, must not be null - * @param endMarker the end string to find, must not be null - * @return this instance - */ - public XMLCharBuffer trimToContent(final String startMarker, final String endMarker) { - // if both are longer or same length than content, don't do anything - final int markerLength = startMarker.length() + endMarker.length(); - if (markerLength >= this.length_) { - return this; - } - - // run over starting whitespaces - int sPos = 0; - for (; sPos < this.length_ - markerLength; sPos++) { - if (!Character.isWhitespace(this.data_[sPos])) { - break; - } - } - - // run over ending whitespaces - int ePos = this.length_ - 1 ; - for (; ePos > sPos - markerLength; ePos--) { - if (!Character.isWhitespace(this.data_[ePos])) { - break; - } - } - - // if we have less content than marker length, give up - // this also helps when markers overlap such as - // and the string is " " - if (ePos - sPos + 1 < markerLength) { - return this; - } - - // check the start - for (int i = 0; i < startMarker.length(); i++) { - if (startMarker.charAt(i) != this.data_[i + sPos]) { - // no start match, stop and don't do anything - return this; - } - } - - // check the end, ePos is when the first good char - // occurred - final int endStartCheckPos = ePos - endMarker.length() + 1; - for (int i = 0; i < endMarker.length(); i++) { - if (endMarker.charAt(i) != this.data_[endStartCheckPos + i]) { - // no start match, stop and don't do anything - return this; - } - } - - // shift left and cut length - final int newLength = ePos - sPos + 1 - markerLength; - System.arraycopy(this.data_, - sPos + startMarker.length(), - this.data_, - 0, newLength); - this.length_ = newLength; - - return this; - } - - /** - * Check if we have only whitespace - * - * @return true if we have only whitespace, false otherwise - */ - public boolean isWhitespace() { - for (int i = 0; i < this.length_; i++) { - if (!Character.isWhitespace(this.data_[i])) { - return false; - } - } - return true; - } - - /** - * Trims the string similar to {@link String.trim} - * @return - */ - public XMLCharBuffer trim() { - // clean the end first, because it is cheap - return trimTrailing().trimLeading(); - } - - /** - * Removes all whitespace before the first non-whitespace char. - * If all are whitespace, we get an empty buffer - * - * @return this instance - */ - public XMLCharBuffer trimLeading() { - // run over starting whitespace - int sPos = 0; - for (; sPos < this.length_; sPos++) { - if (!Character.isWhitespace(this.data_[sPos])) { - break; - } - } - - if (sPos == 0) { - // nothing to do - return this; - } - else if (sPos == this.length_) { - // only whitespace - this.length_ = 0; - return this; - } - - // shift left - final int newLength = this.length_ - sPos; - System.arraycopy(this.data_, - sPos, - this.data_, - 0, newLength); - this.length_ = newLength; - - return this; - } - - /** - * Removes all whitespace at the end. - * If all are whitespace, we get an empty buffer - * - * @return this instance - */ - public XMLCharBuffer trimTrailing() { - // run over ending whitespaces - int ePos = this.length_ - 1; - for (; ePos >= 0; ePos--) { - if (!Character.isWhitespace(this.data_[ePos])) { - break; - } - } - - this.length_ = ePos + 1; - - return this; - } - - /** - * Shortens the buffer by that many positions. If the count is - * larger than the length, we get just an empty buffer. If you pass in negative - * values, we are failing, likely often silently. It is all about performance and - * not a general all-purpose API. - * - * @param count a positive number, no runtime checks, if count is larger than - * length, we get length = 0 - * @return this instance - */ - public XMLCharBuffer shortenBy(final int count) { - final int newLength = this.length_ - count; - this.length_ = newLength < 0 ? 0 : newLength; - - return this; - } - - /** - * Returns a string representation of this buffer. This will be a copy - * operation. - * - * @return a string of the content of this buffer - */ - @Override - public String toString() { - return new String(this.data_, 0, this.length_); - } - - /** - * Returns the char a the given position. Will complain if - * we try to read outside the range - * - * @param index the position to read from - * @return the char at the position - * @throws IndexOutOfBoundsException - * in case one tries to read outside of valid buffer range - */ - @Override - public char charAt(final int index) - { - if (index > this.length_ - 1 || index < 0) { - throw new IndexOutOfBoundsException( - "Tried to read outside of the valid buffer data"); - } - - return this.data_[index]; - } - - /** - * Returns the char a the given position. No checks are - * performed. It is up to the caller to make sure we - * read correctly. Reading outside of the array will - * cause an {@link IndexOutOfBoundsException} but using an - * incorrect position in the array (such as beyond length) - * might stay unnoticed! - * - * @param index the position to read from - * @return the char at the position - */ - public char unsafeCharAt(final int index) - { - return this.data_[index]; - } - - /** - * Returns a content copy of this buffer - * - * @return a copy of this buffer, the capacity might differ - */ - @Override - public XMLCharBuffer clone() { - return new XMLCharBuffer(this); - } - - /** - * Returns a CharSequence that is a subsequence of this sequence. - * The subsequence starts with the char value at the specified index and - * ends with the char value at index end - 1. The length - * (in chars) of the - * returned sequence is end - start, so if start == end - * then an empty sequence is returned. - * - * @param start the start index, inclusive - * @param end the end index, exclusive - * - * @return the specified subsequence - * - * @throws IndexOutOfBoundsException - * if start or end are negative, - * if end is greater than length(), - * or if start is greater than end - * - * @return a charsequence of this buffer - */ - @Override - public CharSequence subSequence(final int start, final int end) - { - if (start < 0) { - throw new StringIndexOutOfBoundsException(start); - } - if (end > this.length_) { - throw new StringIndexOutOfBoundsException(end); - } - - final int l = end - start; - if (l < 0) { - throw new StringIndexOutOfBoundsException(l); - } - - return new String(this.data_, start, l); - } - - /** - * Two buffers are identical when the length and - * the content of the backing array (only for the - * data in view) are identical. - * - * @param o the object to compare with - * @return true if length and array content match, false otherwise - */ - @Override - public boolean equals(final Object o) - { - if (o instanceof XMLCharBuffer) { - final XMLCharBuffer ob = (XMLCharBuffer) o; - if (ob.length_ != this.length_ ) { - return false; - } - - // ok, in JDK 11 or up, we could use an - // Arrays.mismatch, but we cannot due to - // JDK 8 compatibility - for (int i = 0; i < this.length_; i++) { - if (ob.data_[i] != this.data_[i]) { - return false; - } - } - - // length and content match, be happy - return true; - } - - return false; - } -} diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java b/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java index 4d15e258..851730e7 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java @@ -14,213 +14,592 @@ */ package org.htmlunit.cyberneko.xerces.xni; -import org.xml.sax.ContentHandler; -import org.xml.sax.SAXException; -import org.xml.sax.ext.LexicalHandler; +import java.util.Arrays; /** - * This class is used as a structure to pass text contained in the underlying - * character buffer of the scanner. The offset and length fields allow the - * buffer to be re-used without creating new character arrays. - *

- * Note: Methods that are passed an XMLString structure should - * consider the contents read-only and not make any modifications to the - * contents of the buffer. The method receiving this structure should also not - * modify the offset and length if this structure (or the values of this - * structure) are passed to another method. - *

- * Note: Methods that are passed an XMLString structure are - * required to copy the information out of the buffer if it is to be saved for - * use beyond the scope of the method. The contents of the structure are - * volatile and the contents of the character buffer cannot be assured once the - * method that is passed this structure returns. Therefore, methods passed this - * structure should not save any reference to the structure or the character - * array contained in the structure. + *

This class is meant to replace the {@link XMLString} in many areas where + * performance and memory-efficency is key. The old XMLString remains in + * plays in case one has used that in their own code. * - * @author Eric Ye, IBM - * @author Andy Clark, IBM - * @author Ronald Brill - * @author René Schwietzke + *

This buffer is volatile and when you use it, make sure you work with + * it responsibly. In many cases, we will reuse the buffer to avoid fresh + * memory allocations, hence you have to pay attention to its usage pattern. + * It is not meant to be a general String replacement. + * + *

This class avoid many of the standard runtime checks that will result + * in a runtime or array exception anyway. Why check twice and raise the + * same exception? + * + * @author René Schwietzke */ -public class XMLString { +public class XMLCharBuffer implements CharSequence { + // our data, can grow + private char[] data_; + + // the current size of the string data + private int length_; + + // the current size of the string data + private final int growBy_; + + // how much do we grow if needed + public static final int CAPACITY_GROWTH = 10; + + // how much do we grow if needed + // a cache line is 64 byte mostly, the overhead is mostly 24 bytes + // a char is two bytes, let's use one cache lines and resize less + public static final int INITIAL_CAPACITY = (64 - 24) / 2; + + /** + * Constructs an XMLCharBuffer with a default size. + */ + public XMLCharBuffer() { + this.data_ = new char[INITIAL_CAPACITY]; + this.length_ = 0; + this.growBy_ = CAPACITY_GROWTH; + } + + /** + * Constructs an XMLCharBuffer with a desired size. + * + * @param startSize the size of the buffer to start with + */ + public XMLCharBuffer(final int startSize) { + this(startSize, CAPACITY_GROWTH); + } - private final StringBuilder builder_; + /** + * Constructs an XMLCharBuffer with a desired size. + * + * @param startSize the size of the buffer to start with + * @param growBy by how much do we want to grow when needed + */ + public XMLCharBuffer(final int startSize, final int growBy) { + // a cache line is 64 byte mostly, the overhead is mostly 24 bytes + // a char is two bytes, let's use one cache lines and resize less + this.data_ = new char[startSize]; + this.length_ = 0; + this.growBy_ = Math.max(1, growBy); + } /** - * Constructs an XMLString. + * Constructs an XMLCharBuffer from another buffer. Copies the data + * over. The new buffer capacity matches the length of the source but + * has a minimum capacity of INITIAL_CAPACITY. + * + * @param src the source buffer to copy from */ - public XMLString() { - builder_ = new StringBuilder(); + public XMLCharBuffer(final XMLCharBuffer src) { + this(src, 0); } /** - * Constructs an XMLString. + * Constructs an XMLCharBuffer from another buffer. Copies the data + * over. You can add more capacity on top of the source length. If + * you specify 0, the capacity will match the length. * - * @param initialCapacity desired initial capacity + * @param src the source buffer to copy from + * @param addCapacity how much capacity to add to this buffer besides + * the already copied data */ - public XMLString(final int initialCapacity) { - builder_ = new StringBuilder(initialCapacity); + public XMLCharBuffer(final XMLCharBuffer src, final int addCapacity) { + this.data_ = Arrays.copyOf(src.data_, src.length_ + Math.max(0, addCapacity)); + this.length_ = src.length(); + this.growBy_ = Math.max(1, CAPACITY_GROWTH); + } + + /** + * Constructs an XMLCharBuffer from a string. To avoid + * too much allocation, we just take the string array as our own. + * + * @param src the string to copy from + */ + public XMLCharBuffer(final String src) { + this.data_ = src.toCharArray(); + this.length_ = src.length(); + this.growBy_ = CAPACITY_GROWTH; } /** * Constructs an XMLString structure preset with the specified values. + * There will not be any room to grow, if you need that, construct an + * empty one and append. + * + *

There are not range checks performed. Make sure your data is legit. * - * @param ch The character array. + * @param ch The character array, must not be null * @param offset The offset into the character array. * @param length The length of characters from the offset. */ - public XMLString(final char[] ch, final int offset, final int length) { - this(); - builder_.append(ch, offset, length); + public XMLCharBuffer(final char[] ch, final int offset, final int length) { + // just as big as we need it + this(length); + append(ch, offset, length); } - public void append(final char c) { - builder_.append(c); + /** + * Check capacity and grow if needed automatically + * + * @param desiredCapacity how much space do we need in total + */ + private void ensureCapacity(final int desiredCapacity) { + if (this.data_.length < desiredCapacity) { + this.data_ = Arrays.copyOf(this.data_, desiredCapacity + this.growBy_); + } } - public void append(final String str) { - builder_.append(str); + /** + * Returns the current max capacity without growth. Does not + * indicate how much capacity is already in use. Use {@link #length()} + * for that. + * + * @return the current capacity, not taken any usage into account + */ + public int capacity() { + return this.data_.length; } - public void append(final XMLString xmlStr) { - builder_.append(xmlStr.builder_); + /** + * Appends a single character to the buffer. + * + * @param c the character to append + * @return this instance + */ + public XMLCharBuffer append(final char c) { + ensureCapacity(this.length_ + 1); + + this.data_[this.length_] = c; + this.length_++; + + return this; + } + + /** + * Append a string to this buffer without copying the string first. + * + * @param src the string to copy + * @return this instance + */ + public XMLCharBuffer append(final String src) { + final int start = this.length_; + this.length_ = this.length_ + src.length(); + ensureCapacity(this.length_); + + // copy char by char because we don't get a copy for free + // from a string yet, this might change when immutable arrays + // make it into Java + for (int i = 0; i < src.length(); i++) { + this.data_[start + i] = src.charAt(i); + } + + return this; } - public void append(final char[] str, final int offset, final int len) { - builder_.append(str, offset, len); + /** + * Add another buffer to this one. + * + * @param src the buffer to copy from + * @return this instance + */ + public XMLCharBuffer append(final XMLCharBuffer src) { + final int start = this.length_; + this.length_ = this.length_ + src.length(); + ensureCapacity(this.length_); + + System.arraycopy(src.data_, 0, this.data_, start, src.length_); + + return this; } - public char charAt(final int index) { - return builder_.charAt(index); + /** + * Add data from a char array to this buffer wit the ability to specify + * a range to copy from + * + * @param src the source char array + * @param offset the pos to start to copy from + * @param length the length of the data to copy + * + * @return this instance + */ + public XMLCharBuffer append(final char[] src, final int offset, final int length) { + final int start = this.length_; + this.length_ = start + length; + + ensureCapacity(this.length_); + + System.arraycopy(src, offset, this.data_, start, length); + + return this; } + /** + * Returns the current length + * @return the length of the buffer data + */ public int length() { - return builder_.length(); + return length_; } - public boolean endsWith(final String string) { - final int l = string.length(); - if (builder_.length() < l) { - return false; - } + /** + * Tell us how much the capacity grows if needed + * + * @return the value that determines how much we grow the backing + * array in case we have to + */ + public int getGrowBy() { + return this.growBy_; + } - return string.equals(builder_.substring(length() - l)); + /** + * Resets the buffer to 0 length. It won't resize it to avoid memory + * churn. + * + * @return this instance for fluid programming + */ + public XMLCharBuffer clear() { + this.length_ = 0; + + return this; } - // Reduces the buffer to the content between start and end marker when - // only whitespaces are found before the startMarker as well as after the end - // marker - public void reduceToContent(final String startMarker, final String endMarker) { - int i = 0; - int startContent = -1; + /** + * Resets the buffer to 0 length and sets the new data. This + * is a little cheaper than clear().append(c) depending on + * the where we are and the inlining. + * + * @param c the char to set + * @return this instance for fluid programming + */ + public XMLCharBuffer clearAndAppend(final char c) { + this.length_ = 0; + + if (this.data_.length >= 1) { + this.data_[this.length_] = c; + this.length_++; + } + else { + append(c); + } - final int startMarkerLength = startMarker.length(); - final int endMarkerLength = endMarker.length(); + return this; + } - while (i < builder_.length() - startMarkerLength - endMarkerLength) { - final char c = builder_.charAt(i); - if (Character.isWhitespace(c)) { - ++i; + /** + * Does this buffer end with this string? If we check for + * the empty string, we get true. + * + * @param s the string to check the end against + * @return true of the end matches the buffer, false otherwise + */ + public boolean endsWith(final String s) { + // length does not match, cannot be the end + if (this.length_ < s.length()) { + return false; + } + + // check the string by char, avoids a copy of the string + final int start = this.length_ - s.length(); + for (int i = 0; i < s.length(); i++) { + if (this.data_[i + start] != s.charAt(i)) { + return false; } - else if (c == startMarker.charAt(0) && startMarker.equals(builder_.substring(i, i + startMarkerLength))) { - startContent = i + startMarkerLength; + } + + return true; + } + + /** + * Reduces the buffer to the content between start and end marker when + * only whitespaces are found before the startMarker as well as after the end marker. + * If both strings overlap due to indentical characters such as "foo" and "oof" + * and the buffer is " foof ", we don't do anything. + * + *

If a marker is empty, it behaves like {@link String.trim} on that side. + * + * @param startMarker the start string to find, must not be null + * @param endMarker the end string to find, must not be null + * @return this instance + */ + public XMLCharBuffer trimToContent(final String startMarker, final String endMarker) { + // if both are longer or same length than content, don't do anything + final int markerLength = startMarker.length() + endMarker.length(); + if (markerLength >= this.length_) { + return this; + } + + // run over starting whitespaces + int sPos = 0; + for (; sPos < this.length_ - markerLength; sPos++) { + if (!Character.isWhitespace(this.data_[sPos])) { break; } - else { - return; // start marker not found + } + + // run over ending whitespaces + int ePos = this.length_ - 1 ; + for (; ePos > sPos - markerLength; ePos--) { + if (!Character.isWhitespace(this.data_[ePos])) { + break; } } - if (startContent == -1) { // start marker not found - return; + + // if we have less content than marker length, give up + // this also helps when markers overlap such as + // and the string is " " + if (ePos - sPos + 1 < markerLength) { + return this; } - i = builder_.length() - 1; - while (i > startContent + endMarkerLength) { - final char c = builder_.charAt(i); - if (Character.isWhitespace(c)) { - --i; + // check the start + for (int i = 0; i < startMarker.length(); i++) { + if (startMarker.charAt(i) != this.data_[i + sPos]) { + // no start match, stop and don't do anything + return this; } - else if (c == endMarker.charAt(endMarkerLength - 1) - && endMarker.equals(builder_.substring(i - endMarkerLength + 1, i + 1))) { + } - builder_.delete(i - endMarkerLength + 1, builder_.length()); - if (startContent > 0) { - builder_.delete(0, startContent); - } - return; - } - else { - return; // end marker not found + // check the end, ePos is when the first good char + // occurred + final int endStartCheckPos = ePos - endMarker.length() + 1; + for (int i = 0; i < endMarker.length(); i++) { + if (endMarker.charAt(i) != this.data_[endStartCheckPos + i]) { + // no start match, stop and don't do anything + return this; } } - } - @Deprecated - public char[] getChars() { - final char[] chars = new char[builder_.length()]; - builder_.getChars(0, builder_.length(), chars, 0); - return chars; - } - - @Override - public XMLString clone() { - final XMLString clone = new XMLString(); - clone.builder_.append(builder_); - return clone; - } + // shift left and cut length + final int newLength = ePos - sPos + 1 - markerLength; + System.arraycopy(this.data_, + sPos + startMarker.length(), + this.data_, + 0, newLength); + this.length_ = newLength; - /** - * Resets. - * */ - public XMLString clear() { - builder_.setLength(0); return this; } + /** + * Check if we have only whitespace + * + * @return true if we have only whitespace, false otherwise + */ public boolean isWhitespace() { - for (int i = 0; i < builder_.length(); i++) { - if (!Character.isWhitespace(builder_.charAt(i))) { + for (int i = 0; i < this.length_; i++) { + if (!Character.isWhitespace(this.data_[i])) { return false; } } return true; } - public void trimWhitespaceAtEnd() { - int i = builder_.length() - 1; + /** + * Trims the string similar to {@link String.trim} + * @return + */ + public XMLCharBuffer trim() { + // clean the end first, because it is cheap + return trimTrailing().trimLeading(); + } - while (i > -1) { - if (!Character.isWhitespace(builder_.charAt(i))) { - builder_.delete(i + 1, builder_.length()); - return; + /** + * Removes all whitespace before the first non-whitespace char. + * If all are whitespace, we get an empty buffer + * + * @return this instance + */ + public XMLCharBuffer trimLeading() { + // run over starting whitespace + int sPos = 0; + for (; sPos < this.length_; sPos++) { + if (!Character.isWhitespace(this.data_[sPos])) { + break; } - i--; } - clear(); + + if (sPos == 0) { + // nothing to do + return this; + } + else if (sPos == this.length_) { + // only whitespace + this.length_ = 0; + return this; + } + + // shift left + final int newLength = this.length_ - sPos; + System.arraycopy(this.data_, + sPos, + this.data_, + 0, newLength); + this.length_ = newLength; + + return this; } - public void delete(final int start, final int end) { - builder_.delete(start, end); + /** + * Removes all whitespace at the end. + * If all are whitespace, we get an empty buffer + * + * @return this instance + */ + public XMLCharBuffer trimTrailing() { + // run over ending whitespaces + int ePos = this.length_ - 1; + for (; ePos >= 0; ePos--) { + if (!Character.isWhitespace(this.data_[ePos])) { + break; + } + } + + this.length_ = ePos + 1; + + return this; } - public void appendTo(final StringBuilder stringBuilder) { - stringBuilder.append(builder_); + /** + * Shortens the buffer by that many positions. If the count is + * larger than the length, we get just an empty buffer. If you pass in negative + * values, we are failing, likely often silently. It is all about performance and + * not a general all-purpose API. + * + * @param count a positive number, no runtime checks, if count is larger than + * length, we get length = 0 + * @return this instance + */ + public XMLCharBuffer shortenBy(final int count) { + final int newLength = this.length_ - count; + this.length_ = newLength < 0 ? 0 : newLength; + + return this; } + /** + * Returns a string representation of this buffer. This will be a copy + * operation. + * + * @return a string of the content of this buffer + */ @Override public String toString() { - return builder_.toString(); + return new String(this.data_, 0, this.length_); + } + + /** + * Returns the char a the given position. Will complain if + * we try to read outside the range + * + * @param index the position to read from + * @return the char at the position + * @throws IndexOutOfBoundsException + * in case one tries to read outside of valid buffer range + */ + @Override + public char charAt(final int index) + { + if (index > this.length_ - 1 || index < 0) { + throw new IndexOutOfBoundsException( + "Tried to read outside of the valid buffer data"); + } + + return this.data_[index]; } - public void characters(final ContentHandler contentHandler) throws SAXException { - contentHandler.characters(getChars(), 0, length()); + /** + * Returns the char a the given position. No checks are + * performed. It is up to the caller to make sure we + * read correctly. Reading outside of the array will + * cause an {@link IndexOutOfBoundsException} but using an + * incorrect position in the array (such as beyond length) + * might stay unnoticed! + * + * @param index the position to read from + * @return the char at the position + */ + public char unsafeCharAt(final int index) + { + return this.data_[index]; } - public void ignorableWhitespace(final ContentHandler contentHandler) throws SAXException { - contentHandler.ignorableWhitespace(getChars(), 0, length()); + /** + * Returns a content copy of this buffer + * + * @return a copy of this buffer, the capacity might differ + */ + @Override + public XMLCharBuffer clone() { + return new XMLCharBuffer(this); } - public void comment(final LexicalHandler lexicalHandler) throws SAXException { - lexicalHandler.comment(getChars(), 0, length()); + /** + * Returns a CharSequence that is a subsequence of this sequence. + * The subsequence starts with the char value at the specified index and + * ends with the char value at index end - 1. The length + * (in chars) of the + * returned sequence is end - start, so if start == end + * then an empty sequence is returned. + * + * @param start the start index, inclusive + * @param end the end index, exclusive + * + * @return the specified subsequence + * + * @throws IndexOutOfBoundsException + * if start or end are negative, + * if end is greater than length(), + * or if start is greater than end + * + * @return a charsequence of this buffer + */ + @Override + public CharSequence subSequence(final int start, final int end) + { + if (start < 0) { + throw new StringIndexOutOfBoundsException(start); + } + if (end > this.length_) { + throw new StringIndexOutOfBoundsException(end); + } + + final int l = end - start; + if (l < 0) { + throw new StringIndexOutOfBoundsException(l); + } + + return new String(this.data_, start, l); + } + + /** + * Two buffers are identical when the length and + * the content of the backing array (only for the + * data in view) are identical. + * + * @param o the object to compare with + * @return true if length and array content match, false otherwise + */ + @Override + public boolean equals(final Object o) + { + if (o instanceof XMLCharBuffer) { + final XMLCharBuffer ob = (XMLCharBuffer) o; + if (ob.length_ != this.length_ ) { + return false; + } + + // ok, in JDK 11 or up, we could use an + // Arrays.mismatch, but we cannot due to + // JDK 8 compatibility + for (int i = 0; i < this.length_; i++) { + if (ob.data_[i] != this.data_[i]) { + return false; + } + } + + // length and content match, be happy + return true; + } + + return false; } } diff --git a/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBufferTest.java b/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBufferTest.java deleted file mode 100644 index 581fc60e..00000000 --- a/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLCharBufferTest.java +++ /dev/null @@ -1,1065 +0,0 @@ -/* - * Copyright 2017-2023 Ronald Brill - * Copyright 2023 René Schwietzke - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * https://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ -package org.htmlunit.cyberneko.xerces.xni; - -import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.junit.jupiter.api.Assertions.assertFalse; -import static org.junit.jupiter.api.Assertions.assertThrows; -import static org.junit.jupiter.api.Assertions.assertTrue; - -import java.util.Random; - -import org.junit.jupiter.api.Test; - -/** - * Unit tests for {@link XMLCharBuffer}. - * @author Ronald Brill - * @author René Schwietzke - */ -public class XMLCharBufferTest { - public static final String CHAR5 = "ABCDE"; - public static final String CHAR10 = "ABCDEFGHIJ"; - public static final String CHAR15 = "ABCDEFGHIJKLMNO"; - public static final String CHAR20 = "ABCDEFGHIJKLMNOPQRST"; - public static final String CHAR25 = "ABCDEFGHIJKLMNOPQRSTUVWXY"; - - @Test - public void ctrEmpty() { - final XMLCharBuffer b = new XMLCharBuffer(); - assertEquals(0, b.length()); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); - assertEquals("", b.toString()); - } - - @Test - public void ctr_int() { - // standard - { - final XMLCharBuffer b = new XMLCharBuffer(42); - assertEquals(0, b.length()); - assertEquals(42, b.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, b.getGrowBy()); - assertEquals("", b.toString()); - } - // 0 - { - final XMLCharBuffer b = new XMLCharBuffer(0); - assertEquals(0, b.length()); - assertEquals(0, b.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, b.getGrowBy()); - assertEquals("", b.toString()); - } - } - - @Test - public void ctr_int_int() { - // standard - { - final XMLCharBuffer b = new XMLCharBuffer(42, 11); - assertEquals(0, b.length()); - assertEquals(42, b.capacity()); - assertEquals(11, b.getGrowBy()); - assertEquals("", b.toString()); - } - // zero is silently ignored - { - final XMLCharBuffer b = new XMLCharBuffer(42, 0); - assertEquals(0, b.length()); - assertEquals(42, b.capacity()); - assertEquals(1, b.getGrowBy()); - assertEquals("", b.toString()); - } - // 0 size is possible - { - final XMLCharBuffer b = new XMLCharBuffer(0, 3); - assertEquals(0, b.length()); - assertEquals(0, b.capacity()); - assertEquals(3, b.getGrowBy()); - assertEquals("", b.toString()); - } - } - - @Test - public void ctr_Buffer() { - // standard - { - final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer(CHAR25)); - assertEquals(CHAR25, a.toString()); - assertEquals(25, a.length()); - assertEquals(25, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); - } - // empty - { - final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer()); - assertEquals("", a.toString()); - assertEquals(0, a.length()); - assertEquals(0, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); - } - } - - @Test - public void ctr_xmlcharuffer_int() { - // standard - { - final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer("foo"), 11); - assertEquals("foo", a.toString()); - assertEquals(3, a.length()); - assertEquals(14, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); - } - // empty - { - final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer(), 5); - assertEquals("", a.toString()); - assertEquals(0, a.length()); - assertEquals(5, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); - } - } - - @Test - public void ctr_string() { - // empty - { - final XMLCharBuffer a = new XMLCharBuffer("".toString()); - assertEquals("", a.toString()); - assertEquals(0, a.length()); - assertEquals(0, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); - } - // standard - { - final XMLCharBuffer a = new XMLCharBuffer("1234".toString()); - assertEquals("1234", a.toString()); - assertEquals(4, a.length()); - assertEquals(4, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); - } - } - - - @Test - public void ctr_char_int_int() { - // empty - { - final XMLCharBuffer a = new XMLCharBuffer("".toCharArray(), 0, 0); - assertEquals("", a.toString()); - assertEquals(0, a.length()); - assertEquals(0, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); - } - // standard - { - final XMLCharBuffer a = new XMLCharBuffer("foo".toCharArray(), 0, 3); - assertEquals("foo", a.toString()); - assertEquals(3, a.length()); - assertEquals(3, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); - } - // standard - { - final XMLCharBuffer a = new XMLCharBuffer("foobar2".toCharArray(), 3, 3); - assertEquals("bar", a.toString()); - assertEquals(3, a.length()); - assertEquals(3, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); - } - } - - /* - * toString() - */ - @Test - public void toStringTest() { - assertEquals("", new XMLCharBuffer().toString()); - assertEquals("", new XMLCharBuffer(10).toString()); - assertEquals("foo", new XMLCharBuffer("foobar".toCharArray(), 0, 3).toString()); - assertEquals("foobar", new XMLCharBuffer("foobar".toCharArray(), 0, 6).toString()); - - final XMLCharBuffer b1 = new XMLCharBuffer(); - b1.append("foo"); - assertEquals("foo", b1.toString()); - b1.clear().append("bar"); - assertEquals("bar", b1.toString()); - b1.append("more than anything today in the world 0123456"); - assertEquals("barmore than anything today in the world 0123456", b1.toString()); - } - - /* - * Just the base length checks, the rest comes with append and such - * tests. - */ - @Test - public void length() { - assertEquals(0, new XMLCharBuffer().length()); - assertEquals(0, new XMLCharBuffer(10).length()); - - assertEquals(1, new XMLCharBuffer().append('f').length()); - } - - @Test - public void capacity() { - assertEquals(20, new XMLCharBuffer().capacity()); - assertEquals(20, new XMLCharBuffer().append('f').capacity()); - - // let's grow and see - assertEquals(20, new XMLCharBuffer().append("01234567890123456789").capacity()); - } - - @Test - public void append_char_new() { - final XMLCharBuffer b = new XMLCharBuffer(); - assertEquals(0, b.length()); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); - - b.append('a'); - assertEquals(1, b.length()); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); - assertEquals("a", b.toString()); - - b.append('b'); - b.append('c'); - b.append('d'); - b.append('e'); - assertEquals(5, b.length()); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); - assertEquals("abcde", b.toString()); - - // our source of correctness - final StringBuilder sb = new StringBuilder(b.toString()); - final Random r = new Random(); - - for (int i = 0; i < 100; i++) { - final char c = CHAR25.charAt(r.nextInt(CHAR25.length())); - sb.append(c); - b.append(c); - - assertEquals(sb.toString(), b.toString()); - } - } - - @Test - public void append_charbuffer_new() { - final XMLCharBuffer c0 = new XMLCharBuffer(); - final XMLCharBuffer c5 = new XMLCharBuffer("01234"); - final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); - - // empty - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append(c0); - assertEquals("", a.toString()); - assertEquals(0, a.length()); - } - // self empty - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append(a); - assertEquals("", a.toString()); - assertEquals(0, a.length()); - } - // standard - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append(c5); - assertEquals(c5.toString(), a.toString()); - assertEquals(5, a.length()); - } - // self standard - { - final XMLCharBuffer a = new XMLCharBuffer("ABCDE"); - a.append(a); - assertEquals("ABCDEABCDE", a.toString()); - assertEquals(10, a.length()); - } - - } - - @Test - public void append_charbuffer_noResize() { - final XMLCharBuffer c0 = new XMLCharBuffer(); - final XMLCharBuffer c5 = new XMLCharBuffer("01234"); - final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); - - { - final XMLCharBuffer a = new XMLCharBuffer("012"); - a.append(c0); - assertEquals(3, a.capacity()); - assertEquals("012", a.toString()); - a.append(c5); - assertEquals("01201234", a.toString()); - assertEquals(18, a.capacity()); - assertEquals(8, a.length()); - } - } - - @Test - public void append_charbuffer_resize() { - final XMLCharBuffer c0 = new XMLCharBuffer(); - final XMLCharBuffer c5 = new XMLCharBuffer("a-b-c"); - final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); - - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append(c5); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - assertEquals("a-b-c", a.toString()); - assertEquals(5, a.length()); - a.append(c25); - assertEquals("a-b-c" + CHAR25, a.toString()); - assertEquals(40, a.capacity()); - assertEquals(30, a.length()); - } - } - - @Test - public void append_string() { - // new, no resize - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append(CHAR5); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - assertEquals(CHAR5, a.toString()); - assertEquals(5, a.length()); - } - // new, resize at once - { - final XMLCharBuffer a = new XMLCharBuffer(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - a.append(CHAR5 + CHAR25); - assertEquals(40, a.capacity()); - assertEquals(CHAR5 + CHAR25, a.toString()); - assertEquals(30, a.length()); - } - // resize later - { - final XMLCharBuffer a = new XMLCharBuffer(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - a.append(CHAR5); - a.append(CHAR25); - assertEquals(40, a.capacity()); - assertEquals(CHAR5 + CHAR25, a.toString()); - assertEquals(30, a.length()); - } - // empty string - { - final XMLCharBuffer a = new XMLCharBuffer(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - a.append(""); - a.append(""); - a.append(CHAR25); - a.append(""); - assertEquals(35, a.capacity()); - assertEquals(CHAR25, a.toString()); - assertEquals(25, a.length()); - } - } - - @Test - public void append_char_int_int_new() { - // empty - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append("ABC-DEF-GHU".toCharArray(), 0, 0); - assertEquals("", a.toString()); - assertEquals(0, a.length()); - } - // standard - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append("ABC-DEF-GHU".toCharArray(), 0, 11); - assertEquals("ABC-DEF-GHU", a.toString()); - assertEquals(11, a.length()); - } - // standard - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append("ABC-DEF-GHU".toCharArray(), 1, 10); - assertEquals("BC-DEF-GHU", a.toString()); - assertEquals(10, a.length()); - } - // requires growth - { - final XMLCharBuffer a = new XMLCharBuffer(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - a.append(CHAR25.toCharArray(), 0, 25); - assertEquals(35, a.capacity()); - assertEquals(CHAR25, a.toString()); - assertEquals(25, a.length()); - } - // append several times - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append("abc".toCharArray(), 0, 3); - a.append("1234".toCharArray(), 0, 4); - a.append("".toCharArray(), 0, 0); - a.append("0987654321".toCharArray(), 0, 10); - a.append("FOO--OO".toCharArray(), 3, 2); - assertEquals("abc12340987654321--", a.toString()); - assertEquals(10 + 0 + 4 + 3 + 2, a.length()); - } - } - - @Test - public void charAt() { - { - final XMLCharBuffer a = new XMLCharBuffer("a"); - assertEquals('a', a.charAt(0)); - } - { - final XMLCharBuffer a = new XMLCharBuffer("abc"); - assertEquals('a', a.charAt(0)); - assertEquals('b', a.charAt(1)); - assertEquals('c', a.charAt(2)); - } - } - - @Test - public void charAt_Errors() { - // empty - final XMLCharBuffer a1 = new XMLCharBuffer(); - assertThrows(IndexOutOfBoundsException.class, () -> { - a1.charAt(0); - }); - - final XMLCharBuffer a2 = new XMLCharBuffer(""); - assertThrows(IndexOutOfBoundsException.class, () -> { - a2.charAt(0); - }); - - final XMLCharBuffer b = new XMLCharBuffer("foo"); - assertThrows(IndexOutOfBoundsException.class, () -> { - b.charAt(-1); - }); - - final XMLCharBuffer c = new XMLCharBuffer("foo"); - assertThrows(IndexOutOfBoundsException.class, () -> { - b.charAt(3); - }); - assertThrows(IndexOutOfBoundsException.class, () -> { - b.charAt(4); - }); - } - - @Test - public void unsafeCharAt() { - { - final XMLCharBuffer a = new XMLCharBuffer("a"); - assertEquals('a', a.unsafeCharAt(0)); - } - { - final XMLCharBuffer a = new XMLCharBuffer("abc"); - assertEquals('a', a.unsafeCharAt(0)); - assertEquals('b', a.unsafeCharAt(1)); - assertEquals('c', a.unsafeCharAt(2)); - } - } - - @Test - public void unsafeCharAt_Errors() { - // empty - final XMLCharBuffer a1 = new XMLCharBuffer(); - // can read any garbage - a1.unsafeCharAt(0); - - // cannot read outside the array of course - assertThrows(IndexOutOfBoundsException.class, () -> { - a1.unsafeCharAt(XMLCharBuffer.INITIAL_CAPACITY); - }); - } - - @Test - public void endsWidth() { - // no size match, string to large - assertFalse(new XMLCharBuffer("foo").endsWith("foobar")); - - // empty string - assertTrue(new XMLCharBuffer("foobar").endsWith("")); - - // both empty - assertTrue(new XMLCharBuffer("").endsWith("")); - - // both are the same size and don't match - assertFalse(new XMLCharBuffer("foo").endsWith("bar")); - - // both are the same size and match - assertTrue(new XMLCharBuffer("foo").endsWith("foo")); - - // first char mismatch - assertFalse(new XMLCharBuffer("foobar").endsWith("car")); - - // last char mismatch - assertFalse(new XMLCharBuffer("foobar").endsWith("baa")); - - // full match - assertTrue(new XMLCharBuffer("foobar").endsWith("bar")); - } - - @Test - public void clear() { - // empty - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.clear(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - assertEquals("", a.toString()); - assertEquals(0, a.length()); - } - // some stuff in it - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append(CHAR5); - a.clear(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - assertEquals("", a.toString()); - assertEquals(0, a.length()); - } - // repeated clear - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append(CHAR5); - a.clear(); - a.clear(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - assertEquals("", a.toString()); - assertEquals(0, a.length()); - } - // clear append - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append(CHAR5); - a.clear(); - a.append(CHAR5); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - assertEquals(CHAR5, a.toString()); - assertEquals(5, a.length()); - } - } - - @Test - public void clearAndAppend() { - // empty - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.clearAndAppend('a'); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - assertEquals("a", a.toString()); - assertEquals(1, a.length()); - } - // some stuff in it - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append(CHAR5); - a.clearAndAppend('a'); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - assertEquals("a", a.toString()); - assertEquals(1, a.length()); - } - // repeated clear - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append(CHAR5); - a.clearAndAppend('a'); - a.clearAndAppend('a'); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - assertEquals("a", a.toString()); - assertEquals(1, a.length()); - } - // clear append - { - final XMLCharBuffer a = new XMLCharBuffer(); - a.append(CHAR5); - a.clearAndAppend('a'); - a.append(CHAR5); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); - assertEquals("a" + CHAR5, a.toString()); - assertEquals(6, a.length()); - } - // clear append on total empty - { - final XMLCharBuffer a = new XMLCharBuffer(""); - a.clearAndAppend('a'); - assertEquals(11, a.capacity()); - assertEquals("a", a.toString()); - assertEquals(1, a.length()); - } - } - - @Test - public void reduceToContent() { - final XMLCharBuffer x = new XMLCharBuffer(); - - // buffer shorter than markers - x.clear().append("foo"); - x.trimToContent(""); - assertEquals(3, x.length()); - assertEquals("foo", x.toString()); - - // only start - x.clear().append("Sfoo"); - x.trimToContent("S", "-->"); - assertEquals(4, x.length()); - assertEquals("Sfoo", x.toString()); - - // only end - x.clear().append("fooE"); - x.trimToContent("S", "E"); - assertEquals(4, x.length()); - assertEquals("fooE", x.toString()); - - // start and end, no whitespace - x.clear().append("SfooE"); - x.trimToContent("S", "E"); - assertEquals(3, x.length()); - assertEquals("foo", x.toString()); - - // start and end, only start with whitespace - x.clear().append(" SfooE"); - x.trimToContent("S", "E"); - assertEquals(3, x.length()); - assertEquals("foo", x.toString()); - - // start and end, only end with whitespace - x.clear().append("SfooE \n"); - x.trimToContent("S", "E"); - assertEquals(3, x.length()); - assertEquals("foo", x.toString()); - - // start and end, both with whitespace - x.clear().append(" \tSfooE \n"); - x.trimToContent("S", "E"); - assertEquals(3, x.length()); - assertEquals("foo", x.toString()); - - // start and end, only one whitespace each - x.clear().append(" SfooE "); - x.trimToContent("S", "E"); - assertEquals(3, x.length()); - assertEquals("foo", x.toString()); - - // start and end, both with whitespace - // no content but markers - x.clear().append(" \tSE \n"); - x.trimToContent("S", "E"); - assertEquals(0, x.length()); - assertEquals("", x.toString()); - - x.clear().append(" 1234 "); - x.trimToContent("12", "34"); - assertEquals(0, x.length()); - assertEquals("", x.toString()); - - // start and end, both with whitespace - // one char content - x.clear().append(" 1234 "); - x.trimToContent("12", "4"); - assertEquals(1, x.length()); - assertEquals("3", x.toString()); - - // start and end, both with whitespace - // content, just whitespace - x.clear().append(" 12 4 "); - x.trimToContent("12", "4"); - assertEquals(1, x.length()); - assertEquals(" ", x.toString()); - - // start and end, both with whitespace - // content, just chars - - // start and end, both with whitespace - // content, content with whitespaces - - // one char start and end - - // two chars start and end - - // empty end marker - - // empty start marker - - // empty start and end, behaves like trim, with whitespace - - // empty start and end, behaves like trim, without - - // some non ASCII stuff - - // markers are doubled - - // gives us some fancy whitespaces - - // original tests from XmlString - x.clear().append(""); - x.trimToContent(""); - assertEquals(" hello", x.toString()); - - x.clear().append(" \n \n"); - x.trimToContent(""); - assertEquals(" hello", x.toString()); - - x.clear().append("hello"); - x.trimToContent(""); - assertEquals("hello", x.toString()); - - x.clear().append(""); - assertEquals(""); - x.trimToContent(""); - assertEquals("", x.toString()); - - x.clear().append(" \n"); - x.trimToContent(""); - assertEquals(" \n", x.toString()); - } - - @Test - public void trimLeading() { - final XMLCharBuffer xmlString = new XMLCharBuffer(); - - xmlString.clear().append(""); - xmlString.trimLeading(); - assertEquals("", xmlString.toString()); - - xmlString.clear().append("a"); - xmlString.trimLeading(); - assertEquals("a", xmlString.toString()); - - xmlString.clear().append("a "); - xmlString.trimLeading(); - assertEquals("a ", xmlString.toString()); - - xmlString.clear().append("a b"); - xmlString.trimLeading(); - assertEquals("a b", xmlString.toString()); - - xmlString.clear().append(" a"); - xmlString.trimLeading(); - assertEquals("a", xmlString.toString()); - - xmlString.clear().append(" abckasd"); - xmlString.trimLeading(); - assertEquals("abckasd", xmlString.toString()); - - xmlString.clear().append(" \t a"); - xmlString.trimLeading(); - assertEquals("a", xmlString.toString()); - - xmlString.clear().append(" "); - xmlString.trimLeading(); - assertEquals("", xmlString.toString()); - - xmlString.clear().append(" "); - xmlString.trimLeading(); - assertEquals("", xmlString.toString()); - } - - @Test - public void trimTrailing() { - final XMLCharBuffer xmlString = new XMLCharBuffer(); - - xmlString.clear().append(""); - xmlString.trimTrailing(); - assertEquals("", xmlString.toString()); - - xmlString.clear().append("a"); - xmlString.trimTrailing(); - assertEquals("a", xmlString.toString()); - - xmlString.clear().append(" a"); - xmlString.trimTrailing(); - assertEquals(" a", xmlString.toString()); - - xmlString.clear().append("a b"); - xmlString.trimTrailing(); - assertEquals("a b", xmlString.toString()); - - xmlString.clear().append("a "); - xmlString.trimTrailing(); - assertEquals("a", xmlString.toString()); - - xmlString.clear().append("a "); - xmlString.trimTrailing(); - assertEquals("a", xmlString.toString()); - - xmlString.clear().append(" "); - xmlString.trimTrailing(); - assertEquals("", xmlString.toString()); - - xmlString.clear().append(" "); - xmlString.trimTrailing(); - assertEquals("", xmlString.toString()); - } - - @Test - public void trim() { - final XMLCharBuffer xmlString = new XMLCharBuffer(); - - xmlString.clear().append(""); - xmlString.trim(); - assertEquals("", xmlString.toString()); - - xmlString.clear().append("a"); - xmlString.trim(); - assertEquals("a", xmlString.toString()); - - xmlString.clear().append(" a"); - xmlString.trim(); - assertEquals("a", xmlString.toString()); - - xmlString.clear().append("a b"); - xmlString.trim(); - assertEquals("a b", xmlString.toString()); - - xmlString.clear().append("a "); - xmlString.trim(); - assertEquals("a", xmlString.toString()); - - xmlString.clear().append("a "); - xmlString.trim(); - assertEquals("a", xmlString.toString()); - - xmlString.clear().append(" a "); - xmlString.trim(); - assertEquals("a", xmlString.toString()); - - xmlString.clear().append(" "); - xmlString.trim(); - assertEquals("", xmlString.toString()); - - xmlString.clear().append(" "); - xmlString.trim(); - assertEquals("", xmlString.toString()); - } - - @Test - public void shortenBy() { - // shorten empty - { - final XMLCharBuffer a = new XMLCharBuffer(""); - a.shortenBy(12); - assertEquals(0, a.length()); - assertEquals("", a.toString()); - } - // shorten by 0 - { - final XMLCharBuffer a = new XMLCharBuffer("ab"); - a.shortenBy(0); - assertEquals(2, a.length()); - assertEquals("ab", a.toString()); - } - // shorten by larger - { - final XMLCharBuffer a = new XMLCharBuffer("ab"); - a.shortenBy(4); - assertEquals(0, a.length()); - assertEquals("", a.toString()); - } - // shorten standard - { - final XMLCharBuffer a = new XMLCharBuffer("abcd"); - a.shortenBy(1); - assertEquals(3, a.length()); - assertEquals("abc", a.toString()); - } - // shorten standard - { - final XMLCharBuffer a = new XMLCharBuffer("abcd123"); - a.shortenBy(3); - assertEquals(4, a.length()); - assertEquals("abcd", a.toString()); - } - } - - @Test - public void cloneTest() { - { - final XMLCharBuffer o = new XMLCharBuffer(""); - final XMLCharBuffer a = o.clone(); - assertEquals(0, a.length()); - assertEquals("", a.toString()); - assertTrue(o != a); - } - { - final XMLCharBuffer o = new XMLCharBuffer("abc"); - final XMLCharBuffer a = o.clone(); - assertEquals(3, a.length()); - assertEquals("abc", a.toString()); - assertTrue(o != a); - } - { - final XMLCharBuffer o = new XMLCharBuffer(" 817 "); - final XMLCharBuffer a = o.clone(); - final XMLCharBuffer b = a.clone(); - final XMLCharBuffer c = b.clone(); - assertEquals(5, c.length()); - assertEquals(" 817 ", c.toString()); - assertTrue(o != c); - } - } - - @Test - public void subSequence() { - { - final CharSequence o = new XMLCharBuffer("").subSequence(0, 0); - assertEquals(0, o.length()); - assertEquals("", o.toString()); - } - { - final CharSequence o = new XMLCharBuffer("a").subSequence(0, 1); - assertEquals(1, o.length()); - assertEquals("a", o.toString()); - } - { - final CharSequence o = new XMLCharBuffer("abc").subSequence(0, 3); - assertEquals(3, o.length()); - assertEquals("abc", o.toString()); - } - { - final CharSequence o = new XMLCharBuffer("abc").subSequence(1, 3); - assertEquals(2, o.length()); - assertEquals("bc", o.toString()); - } - { - final CharSequence o = new XMLCharBuffer("abc").subSequence(0, 2); - assertEquals(2, o.length()); - assertEquals("ab", o.toString()); - } - { - final CharSequence o = new XMLCharBuffer("abc").subSequence(1, 2); - assertEquals(1, o.length()); - assertEquals("b", o.toString()); - } - } - - @Test - public void subSequenceErrors() { - { - final CharSequence o = new XMLCharBuffer(""); - assertThrows(IndexOutOfBoundsException.class, () -> { - o.subSequence(-1, 2); - }); - assertThrows(IndexOutOfBoundsException.class, () -> { - o.subSequence(0, 1); - }); - } - { - final CharSequence o = new XMLCharBuffer("12345"); - assertThrows(IndexOutOfBoundsException.class, () -> { - o.subSequence(-2, 3); - }); - assertThrows(IndexOutOfBoundsException.class, () -> { - o.subSequence(0, 6); - }); - assertThrows(IndexOutOfBoundsException.class, () -> { - o.subSequence(1, 0); - }); - } - } - - @Test - public void equalsTest() { - // different types - { - final String a = new String(); - final XMLCharBuffer b = new XMLCharBuffer(); - assertFalse(a.equals(b)); - assertFalse(b.equals(a)); - } - // both empty - { - final XMLCharBuffer a = new XMLCharBuffer(); - final XMLCharBuffer b = new XMLCharBuffer(); - assertTrue(a.equals(b)); - assertTrue(b.equals(a)); - } - // self - { - final XMLCharBuffer a = new XMLCharBuffer(); - final XMLCharBuffer b = new XMLCharBuffer("abc"); - assertTrue(a.equals(a)); - assertTrue(b.equals(b)); - } - // different length - { - final XMLCharBuffer a = new XMLCharBuffer("a"); - final XMLCharBuffer b = new XMLCharBuffer("ab"); - assertFalse(a.equals(b)); - assertFalse(b.equals(a)); - } - // different content, same length - { - final XMLCharBuffer a = new XMLCharBuffer("ac"); - final XMLCharBuffer b = new XMLCharBuffer("ab"); - assertFalse(a.equals(b)); - assertFalse(b.equals(a)); - } - // length 1, identical - { - final XMLCharBuffer a = new XMLCharBuffer("a"); - final XMLCharBuffer b = new XMLCharBuffer("a"); - assertTrue(a.equals(b)); - assertTrue(b.equals(a)); - } - // length 1, different - { - final XMLCharBuffer a = new XMLCharBuffer("b"); - final XMLCharBuffer b = new XMLCharBuffer("b"); - assertTrue(a.equals(b)); - assertTrue(b.equals(a)); - } - // length > 1, same - { - final XMLCharBuffer a = new XMLCharBuffer("81hal/&%$"); - final XMLCharBuffer b = new XMLCharBuffer("81hal/&%$"); - assertTrue(a.equals(b)); - assertTrue(b.equals(a)); - } - // length > 1, different - { - final XMLCharBuffer a = new XMLCharBuffer("b091872983"); - final XMLCharBuffer b = new XMLCharBuffer("b09187298_"); - assertFalse(a.equals(b)); - assertFalse(b.equals(a)); - } - } - - @Test - public void isWhitespace() { - { - final XMLCharBuffer a = new XMLCharBuffer(""); - assertTrue(a.isWhitespace()); - } - { - final XMLCharBuffer a = new XMLCharBuffer(" "); - assertTrue(a.isWhitespace()); - } - { - final XMLCharBuffer a = new XMLCharBuffer("a"); - assertFalse(a.isWhitespace()); - } - { - final XMLCharBuffer a = new XMLCharBuffer(" a\t \n"); - assertFalse(a.isWhitespace()); - } - { - final XMLCharBuffer a = new XMLCharBuffer(" \t \n"); - assertTrue(a.isWhitespace()); - } - } -} diff --git a/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringLegacyTest.java b/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringLegacyTest.java new file mode 100644 index 00000000..6354a5fb --- /dev/null +++ b/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringLegacyTest.java @@ -0,0 +1,88 @@ +/* + * Copyright 2017-2023 Ronald Brill + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.htmlunit.cyberneko.xerces.xni; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +import org.junit.jupiter.api.Test; + +/** + * Unit tests for {@link XMLString}. + * @author Ronald Brill + */ +public class XMLStringTest { + + @Test + public void reduceToContent() { + final XMLString xmlString = new XMLString(); + + xmlString.clear().append(""); + xmlString.reduceToContent(""); + assertEquals(" hello", xmlString.toString()); + + xmlString.clear().append(" \n \n"); + xmlString.reduceToContent(""); + assertEquals(" hello", xmlString.toString()); + + xmlString.clear().append("hello"); + xmlString.reduceToContent(""); + assertEquals("hello", xmlString.toString()); + + xmlString.clear().append(""); + assertEquals(""); + xmlString.reduceToContent(""); + assertEquals("", xmlString.toString()); + } + + @Test + public void trimWhitespaceAtEnd() { + final XMLString xmlString = new XMLString(); + + xmlString.clear().append(""); + xmlString.trimWhitespaceAtEnd(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append("a"); + xmlString.trimWhitespaceAtEnd(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" a"); + xmlString.trimWhitespaceAtEnd(); + assertEquals(" a", xmlString.toString()); + + xmlString.clear().append("a b"); + xmlString.trimWhitespaceAtEnd(); + assertEquals("a b", xmlString.toString()); + + xmlString.clear().append("a "); + xmlString.trimWhitespaceAtEnd(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append("a "); + xmlString.trimWhitespaceAtEnd(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trimWhitespaceAtEnd(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trimWhitespaceAtEnd(); + assertEquals("", xmlString.toString()); + } +} diff --git a/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringTest.java b/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringTest.java index 6354a5fb..581fc60e 100644 --- a/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringTest.java +++ b/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringTest.java @@ -1,5 +1,6 @@ /* * Copyright 2017-2023 Ronald Brill + * Copyright 2023 René Schwietzke * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -15,74 +16,1050 @@ package org.htmlunit.cyberneko.xerces.xni; import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Random; import org.junit.jupiter.api.Test; /** - * Unit tests for {@link XMLString}. + * Unit tests for {@link XMLCharBuffer}. * @author Ronald Brill + * @author René Schwietzke */ -public class XMLStringTest { +public class XMLCharBufferTest { + public static final String CHAR5 = "ABCDE"; + public static final String CHAR10 = "ABCDEFGHIJ"; + public static final String CHAR15 = "ABCDEFGHIJKLMNO"; + public static final String CHAR20 = "ABCDEFGHIJKLMNOPQRST"; + public static final String CHAR25 = "ABCDEFGHIJKLMNOPQRSTUVWXY"; + + @Test + public void ctrEmpty() { + final XMLCharBuffer b = new XMLCharBuffer(); + assertEquals(0, b.length()); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + assertEquals("", b.toString()); + } + + @Test + public void ctr_int() { + // standard + { + final XMLCharBuffer b = new XMLCharBuffer(42); + assertEquals(0, b.length()); + assertEquals(42, b.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, b.getGrowBy()); + assertEquals("", b.toString()); + } + // 0 + { + final XMLCharBuffer b = new XMLCharBuffer(0); + assertEquals(0, b.length()); + assertEquals(0, b.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, b.getGrowBy()); + assertEquals("", b.toString()); + } + } + + @Test + public void ctr_int_int() { + // standard + { + final XMLCharBuffer b = new XMLCharBuffer(42, 11); + assertEquals(0, b.length()); + assertEquals(42, b.capacity()); + assertEquals(11, b.getGrowBy()); + assertEquals("", b.toString()); + } + // zero is silently ignored + { + final XMLCharBuffer b = new XMLCharBuffer(42, 0); + assertEquals(0, b.length()); + assertEquals(42, b.capacity()); + assertEquals(1, b.getGrowBy()); + assertEquals("", b.toString()); + } + // 0 size is possible + { + final XMLCharBuffer b = new XMLCharBuffer(0, 3); + assertEquals(0, b.length()); + assertEquals(0, b.capacity()); + assertEquals(3, b.getGrowBy()); + assertEquals("", b.toString()); + } + } + + @Test + public void ctr_Buffer() { + // standard + { + final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer(CHAR25)); + assertEquals(CHAR25, a.toString()); + assertEquals(25, a.length()); + assertEquals(25, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer()); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + assertEquals(0, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + } + + @Test + public void ctr_xmlcharuffer_int() { + // standard + { + final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer("foo"), 11); + assertEquals("foo", a.toString()); + assertEquals(3, a.length()); + assertEquals(14, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer(), 5); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + assertEquals(5, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + } + + @Test + public void ctr_string() { + // empty + { + final XMLCharBuffer a = new XMLCharBuffer("".toString()); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + assertEquals(0, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer("1234".toString()); + assertEquals("1234", a.toString()); + assertEquals(4, a.length()); + assertEquals(4, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + } + + + @Test + public void ctr_char_int_int() { + // empty + { + final XMLCharBuffer a = new XMLCharBuffer("".toCharArray(), 0, 0); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + assertEquals(0, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer("foo".toCharArray(), 0, 3); + assertEquals("foo", a.toString()); + assertEquals(3, a.length()); + assertEquals(3, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer("foobar2".toCharArray(), 3, 3); + assertEquals("bar", a.toString()); + assertEquals(3, a.length()); + assertEquals(3, a.capacity()); + assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + } + } + + /* + * toString() + */ + @Test + public void toStringTest() { + assertEquals("", new XMLCharBuffer().toString()); + assertEquals("", new XMLCharBuffer(10).toString()); + assertEquals("foo", new XMLCharBuffer("foobar".toCharArray(), 0, 3).toString()); + assertEquals("foobar", new XMLCharBuffer("foobar".toCharArray(), 0, 6).toString()); + + final XMLCharBuffer b1 = new XMLCharBuffer(); + b1.append("foo"); + assertEquals("foo", b1.toString()); + b1.clear().append("bar"); + assertEquals("bar", b1.toString()); + b1.append("more than anything today in the world 0123456"); + assertEquals("barmore than anything today in the world 0123456", b1.toString()); + } + + /* + * Just the base length checks, the rest comes with append and such + * tests. + */ + @Test + public void length() { + assertEquals(0, new XMLCharBuffer().length()); + assertEquals(0, new XMLCharBuffer(10).length()); + + assertEquals(1, new XMLCharBuffer().append('f').length()); + } + + @Test + public void capacity() { + assertEquals(20, new XMLCharBuffer().capacity()); + assertEquals(20, new XMLCharBuffer().append('f').capacity()); + + // let's grow and see + assertEquals(20, new XMLCharBuffer().append("01234567890123456789").capacity()); + } + + @Test + public void append_char_new() { + final XMLCharBuffer b = new XMLCharBuffer(); + assertEquals(0, b.length()); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + + b.append('a'); + assertEquals(1, b.length()); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + assertEquals("a", b.toString()); + + b.append('b'); + b.append('c'); + b.append('d'); + b.append('e'); + assertEquals(5, b.length()); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + assertEquals("abcde", b.toString()); + + // our source of correctness + final StringBuilder sb = new StringBuilder(b.toString()); + final Random r = new Random(); + + for (int i = 0; i < 100; i++) { + final char c = CHAR25.charAt(r.nextInt(CHAR25.length())); + sb.append(c); + b.append(c); + + assertEquals(sb.toString(), b.toString()); + } + } + + @Test + public void append_charbuffer_new() { + final XMLCharBuffer c0 = new XMLCharBuffer(); + final XMLCharBuffer c5 = new XMLCharBuffer("01234"); + final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); + + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(c0); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // self empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(a); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(c5); + assertEquals(c5.toString(), a.toString()); + assertEquals(5, a.length()); + } + // self standard + { + final XMLCharBuffer a = new XMLCharBuffer("ABCDE"); + a.append(a); + assertEquals("ABCDEABCDE", a.toString()); + assertEquals(10, a.length()); + } + + } + + @Test + public void append_charbuffer_noResize() { + final XMLCharBuffer c0 = new XMLCharBuffer(); + final XMLCharBuffer c5 = new XMLCharBuffer("01234"); + final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); + + { + final XMLCharBuffer a = new XMLCharBuffer("012"); + a.append(c0); + assertEquals(3, a.capacity()); + assertEquals("012", a.toString()); + a.append(c5); + assertEquals("01201234", a.toString()); + assertEquals(18, a.capacity()); + assertEquals(8, a.length()); + } + } + + @Test + public void append_charbuffer_resize() { + final XMLCharBuffer c0 = new XMLCharBuffer(); + final XMLCharBuffer c5 = new XMLCharBuffer("a-b-c"); + final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); + + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(c5); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("a-b-c", a.toString()); + assertEquals(5, a.length()); + a.append(c25); + assertEquals("a-b-c" + CHAR25, a.toString()); + assertEquals(40, a.capacity()); + assertEquals(30, a.length()); + } + } + + @Test + public void append_string() { + // new, no resize + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(CHAR5, a.toString()); + assertEquals(5, a.length()); + } + // new, resize at once + { + final XMLCharBuffer a = new XMLCharBuffer(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + a.append(CHAR5 + CHAR25); + assertEquals(40, a.capacity()); + assertEquals(CHAR5 + CHAR25, a.toString()); + assertEquals(30, a.length()); + } + // resize later + { + final XMLCharBuffer a = new XMLCharBuffer(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + a.append(CHAR5); + a.append(CHAR25); + assertEquals(40, a.capacity()); + assertEquals(CHAR5 + CHAR25, a.toString()); + assertEquals(30, a.length()); + } + // empty string + { + final XMLCharBuffer a = new XMLCharBuffer(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + a.append(""); + a.append(""); + a.append(CHAR25); + a.append(""); + assertEquals(35, a.capacity()); + assertEquals(CHAR25, a.toString()); + assertEquals(25, a.length()); + } + } + + @Test + public void append_char_int_int_new() { + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append("ABC-DEF-GHU".toCharArray(), 0, 0); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append("ABC-DEF-GHU".toCharArray(), 0, 11); + assertEquals("ABC-DEF-GHU", a.toString()); + assertEquals(11, a.length()); + } + // standard + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append("ABC-DEF-GHU".toCharArray(), 1, 10); + assertEquals("BC-DEF-GHU", a.toString()); + assertEquals(10, a.length()); + } + // requires growth + { + final XMLCharBuffer a = new XMLCharBuffer(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + a.append(CHAR25.toCharArray(), 0, 25); + assertEquals(35, a.capacity()); + assertEquals(CHAR25, a.toString()); + assertEquals(25, a.length()); + } + // append several times + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append("abc".toCharArray(), 0, 3); + a.append("1234".toCharArray(), 0, 4); + a.append("".toCharArray(), 0, 0); + a.append("0987654321".toCharArray(), 0, 10); + a.append("FOO--OO".toCharArray(), 3, 2); + assertEquals("abc12340987654321--", a.toString()); + assertEquals(10 + 0 + 4 + 3 + 2, a.length()); + } + } + + @Test + public void charAt() { + { + final XMLCharBuffer a = new XMLCharBuffer("a"); + assertEquals('a', a.charAt(0)); + } + { + final XMLCharBuffer a = new XMLCharBuffer("abc"); + assertEquals('a', a.charAt(0)); + assertEquals('b', a.charAt(1)); + assertEquals('c', a.charAt(2)); + } + } + + @Test + public void charAt_Errors() { + // empty + final XMLCharBuffer a1 = new XMLCharBuffer(); + assertThrows(IndexOutOfBoundsException.class, () -> { + a1.charAt(0); + }); + + final XMLCharBuffer a2 = new XMLCharBuffer(""); + assertThrows(IndexOutOfBoundsException.class, () -> { + a2.charAt(0); + }); + + final XMLCharBuffer b = new XMLCharBuffer("foo"); + assertThrows(IndexOutOfBoundsException.class, () -> { + b.charAt(-1); + }); + + final XMLCharBuffer c = new XMLCharBuffer("foo"); + assertThrows(IndexOutOfBoundsException.class, () -> { + b.charAt(3); + }); + assertThrows(IndexOutOfBoundsException.class, () -> { + b.charAt(4); + }); + } + + @Test + public void unsafeCharAt() { + { + final XMLCharBuffer a = new XMLCharBuffer("a"); + assertEquals('a', a.unsafeCharAt(0)); + } + { + final XMLCharBuffer a = new XMLCharBuffer("abc"); + assertEquals('a', a.unsafeCharAt(0)); + assertEquals('b', a.unsafeCharAt(1)); + assertEquals('c', a.unsafeCharAt(2)); + } + } + + @Test + public void unsafeCharAt_Errors() { + // empty + final XMLCharBuffer a1 = new XMLCharBuffer(); + // can read any garbage + a1.unsafeCharAt(0); + + // cannot read outside the array of course + assertThrows(IndexOutOfBoundsException.class, () -> { + a1.unsafeCharAt(XMLCharBuffer.INITIAL_CAPACITY); + }); + } + + @Test + public void endsWidth() { + // no size match, string to large + assertFalse(new XMLCharBuffer("foo").endsWith("foobar")); + + // empty string + assertTrue(new XMLCharBuffer("foobar").endsWith("")); + + // both empty + assertTrue(new XMLCharBuffer("").endsWith("")); + + // both are the same size and don't match + assertFalse(new XMLCharBuffer("foo").endsWith("bar")); + + // both are the same size and match + assertTrue(new XMLCharBuffer("foo").endsWith("foo")); + + // first char mismatch + assertFalse(new XMLCharBuffer("foobar").endsWith("car")); + + // last char mismatch + assertFalse(new XMLCharBuffer("foobar").endsWith("baa")); + + // full match + assertTrue(new XMLCharBuffer("foobar").endsWith("bar")); + } + + @Test + public void clear() { + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.clear(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // some stuff in it + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clear(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // repeated clear + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clear(); + a.clear(); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("", a.toString()); + assertEquals(0, a.length()); + } + // clear append + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clear(); + a.append(CHAR5); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(CHAR5, a.toString()); + assertEquals(5, a.length()); + } + } + + @Test + public void clearAndAppend() { + // empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.clearAndAppend('a'); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("a", a.toString()); + assertEquals(1, a.length()); + } + // some stuff in it + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clearAndAppend('a'); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("a", a.toString()); + assertEquals(1, a.length()); + } + // repeated clear + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clearAndAppend('a'); + a.clearAndAppend('a'); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("a", a.toString()); + assertEquals(1, a.length()); + } + // clear append + { + final XMLCharBuffer a = new XMLCharBuffer(); + a.append(CHAR5); + a.clearAndAppend('a'); + a.append(CHAR5); + assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals("a" + CHAR5, a.toString()); + assertEquals(6, a.length()); + } + // clear append on total empty + { + final XMLCharBuffer a = new XMLCharBuffer(""); + a.clearAndAppend('a'); + assertEquals(11, a.capacity()); + assertEquals("a", a.toString()); + assertEquals(1, a.length()); + } + } @Test public void reduceToContent() { - final XMLString xmlString = new XMLString(); + final XMLCharBuffer x = new XMLCharBuffer(); + + // buffer shorter than markers + x.clear().append("foo"); + x.trimToContent(""); + assertEquals(3, x.length()); + assertEquals("foo", x.toString()); + + // only start + x.clear().append("Sfoo"); + x.trimToContent("S", "-->"); + assertEquals(4, x.length()); + assertEquals("Sfoo", x.toString()); - xmlString.clear().append(""); - xmlString.reduceToContent(""); - assertEquals(" hello", xmlString.toString()); + // only end + x.clear().append("fooE"); + x.trimToContent("S", "E"); + assertEquals(4, x.length()); + assertEquals("fooE", x.toString()); - xmlString.clear().append(" \n \n"); - xmlString.reduceToContent(""); - assertEquals(" hello", xmlString.toString()); + // start and end, no whitespace + x.clear().append("SfooE"); + x.trimToContent("S", "E"); + assertEquals(3, x.length()); + assertEquals("foo", x.toString()); - xmlString.clear().append("hello"); - xmlString.reduceToContent(""); - assertEquals("hello", xmlString.toString()); + // start and end, only start with whitespace + x.clear().append(" SfooE"); + x.trimToContent("S", "E"); + assertEquals(3, x.length()); + assertEquals("foo", x.toString()); - xmlString.clear().append(""); - assertEquals(""); - xmlString.reduceToContent(""); - assertEquals("", xmlString.toString()); + // start and end, both with whitespace + x.clear().append(" \tSfooE \n"); + x.trimToContent("S", "E"); + assertEquals(3, x.length()); + assertEquals("foo", x.toString()); + + // start and end, only one whitespace each + x.clear().append(" SfooE "); + x.trimToContent("S", "E"); + assertEquals(3, x.length()); + assertEquals("foo", x.toString()); + + // start and end, both with whitespace + // no content but markers + x.clear().append(" \tSE \n"); + x.trimToContent("S", "E"); + assertEquals(0, x.length()); + assertEquals("", x.toString()); + + x.clear().append(" 1234 "); + x.trimToContent("12", "34"); + assertEquals(0, x.length()); + assertEquals("", x.toString()); + + // start and end, both with whitespace + // one char content + x.clear().append(" 1234 "); + x.trimToContent("12", "4"); + assertEquals(1, x.length()); + assertEquals("3", x.toString()); + + // start and end, both with whitespace + // content, just whitespace + x.clear().append(" 12 4 "); + x.trimToContent("12", "4"); + assertEquals(1, x.length()); + assertEquals(" ", x.toString()); + + // start and end, both with whitespace + // content, just chars + + // start and end, both with whitespace + // content, content with whitespaces + + // one char start and end + + // two chars start and end + + // empty end marker + + // empty start marker + + // empty start and end, behaves like trim, with whitespace + + // empty start and end, behaves like trim, without + + // some non ASCII stuff + + // markers are doubled + + // gives us some fancy whitespaces + + // original tests from XmlString + x.clear().append(""); + x.trimToContent(""); + assertEquals(" hello", x.toString()); + + x.clear().append(" \n \n"); + x.trimToContent(""); + assertEquals(" hello", x.toString()); + + x.clear().append("hello"); + x.trimToContent(""); + assertEquals("hello", x.toString()); + + x.clear().append(""); + assertEquals(""); + x.trimToContent(""); + assertEquals("", x.toString()); + + x.clear().append(" \n"); + x.trimToContent(""); + assertEquals(" \n", x.toString()); + } + + @Test + public void trimLeading() { + final XMLCharBuffer xmlString = new XMLCharBuffer(); + + xmlString.clear().append(""); + xmlString.trimLeading(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append("a"); + xmlString.trimLeading(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append("a "); + xmlString.trimLeading(); + assertEquals("a ", xmlString.toString()); + + xmlString.clear().append("a b"); + xmlString.trimLeading(); + assertEquals("a b", xmlString.toString()); + + xmlString.clear().append(" a"); + xmlString.trimLeading(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" abckasd"); + xmlString.trimLeading(); + assertEquals("abckasd", xmlString.toString()); + + xmlString.clear().append(" \t a"); + xmlString.trimLeading(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trimLeading(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trimLeading(); + assertEquals("", xmlString.toString()); } @Test - public void trimWhitespaceAtEnd() { - final XMLString xmlString = new XMLString(); + public void trimTrailing() { + final XMLCharBuffer xmlString = new XMLCharBuffer(); xmlString.clear().append(""); - xmlString.trimWhitespaceAtEnd(); + xmlString.trimTrailing(); assertEquals("", xmlString.toString()); xmlString.clear().append("a"); - xmlString.trimWhitespaceAtEnd(); + xmlString.trimTrailing(); assertEquals("a", xmlString.toString()); xmlString.clear().append(" a"); - xmlString.trimWhitespaceAtEnd(); + xmlString.trimTrailing(); assertEquals(" a", xmlString.toString()); xmlString.clear().append("a b"); - xmlString.trimWhitespaceAtEnd(); + xmlString.trimTrailing(); assertEquals("a b", xmlString.toString()); xmlString.clear().append("a "); - xmlString.trimWhitespaceAtEnd(); + xmlString.trimTrailing(); assertEquals("a", xmlString.toString()); xmlString.clear().append("a "); - xmlString.trimWhitespaceAtEnd(); + xmlString.trimTrailing(); assertEquals("a", xmlString.toString()); xmlString.clear().append(" "); - xmlString.trimWhitespaceAtEnd(); + xmlString.trimTrailing(); assertEquals("", xmlString.toString()); xmlString.clear().append(" "); - xmlString.trimWhitespaceAtEnd(); + xmlString.trimTrailing(); assertEquals("", xmlString.toString()); } + + @Test + public void trim() { + final XMLCharBuffer xmlString = new XMLCharBuffer(); + + xmlString.clear().append(""); + xmlString.trim(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append("a"); + xmlString.trim(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" a"); + xmlString.trim(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append("a b"); + xmlString.trim(); + assertEquals("a b", xmlString.toString()); + + xmlString.clear().append("a "); + xmlString.trim(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append("a "); + xmlString.trim(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" a "); + xmlString.trim(); + assertEquals("a", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trim(); + assertEquals("", xmlString.toString()); + + xmlString.clear().append(" "); + xmlString.trim(); + assertEquals("", xmlString.toString()); + } + + @Test + public void shortenBy() { + // shorten empty + { + final XMLCharBuffer a = new XMLCharBuffer(""); + a.shortenBy(12); + assertEquals(0, a.length()); + assertEquals("", a.toString()); + } + // shorten by 0 + { + final XMLCharBuffer a = new XMLCharBuffer("ab"); + a.shortenBy(0); + assertEquals(2, a.length()); + assertEquals("ab", a.toString()); + } + // shorten by larger + { + final XMLCharBuffer a = new XMLCharBuffer("ab"); + a.shortenBy(4); + assertEquals(0, a.length()); + assertEquals("", a.toString()); + } + // shorten standard + { + final XMLCharBuffer a = new XMLCharBuffer("abcd"); + a.shortenBy(1); + assertEquals(3, a.length()); + assertEquals("abc", a.toString()); + } + // shorten standard + { + final XMLCharBuffer a = new XMLCharBuffer("abcd123"); + a.shortenBy(3); + assertEquals(4, a.length()); + assertEquals("abcd", a.toString()); + } + } + + @Test + public void cloneTest() { + { + final XMLCharBuffer o = new XMLCharBuffer(""); + final XMLCharBuffer a = o.clone(); + assertEquals(0, a.length()); + assertEquals("", a.toString()); + assertTrue(o != a); + } + { + final XMLCharBuffer o = new XMLCharBuffer("abc"); + final XMLCharBuffer a = o.clone(); + assertEquals(3, a.length()); + assertEquals("abc", a.toString()); + assertTrue(o != a); + } + { + final XMLCharBuffer o = new XMLCharBuffer(" 817 "); + final XMLCharBuffer a = o.clone(); + final XMLCharBuffer b = a.clone(); + final XMLCharBuffer c = b.clone(); + assertEquals(5, c.length()); + assertEquals(" 817 ", c.toString()); + assertTrue(o != c); + } + } + + @Test + public void subSequence() { + { + final CharSequence o = new XMLCharBuffer("").subSequence(0, 0); + assertEquals(0, o.length()); + assertEquals("", o.toString()); + } + { + final CharSequence o = new XMLCharBuffer("a").subSequence(0, 1); + assertEquals(1, o.length()); + assertEquals("a", o.toString()); + } + { + final CharSequence o = new XMLCharBuffer("abc").subSequence(0, 3); + assertEquals(3, o.length()); + assertEquals("abc", o.toString()); + } + { + final CharSequence o = new XMLCharBuffer("abc").subSequence(1, 3); + assertEquals(2, o.length()); + assertEquals("bc", o.toString()); + } + { + final CharSequence o = new XMLCharBuffer("abc").subSequence(0, 2); + assertEquals(2, o.length()); + assertEquals("ab", o.toString()); + } + { + final CharSequence o = new XMLCharBuffer("abc").subSequence(1, 2); + assertEquals(1, o.length()); + assertEquals("b", o.toString()); + } + } + + @Test + public void subSequenceErrors() { + { + final CharSequence o = new XMLCharBuffer(""); + assertThrows(IndexOutOfBoundsException.class, () -> { + o.subSequence(-1, 2); + }); + assertThrows(IndexOutOfBoundsException.class, () -> { + o.subSequence(0, 1); + }); + } + { + final CharSequence o = new XMLCharBuffer("12345"); + assertThrows(IndexOutOfBoundsException.class, () -> { + o.subSequence(-2, 3); + }); + assertThrows(IndexOutOfBoundsException.class, () -> { + o.subSequence(0, 6); + }); + assertThrows(IndexOutOfBoundsException.class, () -> { + o.subSequence(1, 0); + }); + } + } + + @Test + public void equalsTest() { + // different types + { + final String a = new String(); + final XMLCharBuffer b = new XMLCharBuffer(); + assertFalse(a.equals(b)); + assertFalse(b.equals(a)); + } + // both empty + { + final XMLCharBuffer a = new XMLCharBuffer(); + final XMLCharBuffer b = new XMLCharBuffer(); + assertTrue(a.equals(b)); + assertTrue(b.equals(a)); + } + // self + { + final XMLCharBuffer a = new XMLCharBuffer(); + final XMLCharBuffer b = new XMLCharBuffer("abc"); + assertTrue(a.equals(a)); + assertTrue(b.equals(b)); + } + // different length + { + final XMLCharBuffer a = new XMLCharBuffer("a"); + final XMLCharBuffer b = new XMLCharBuffer("ab"); + assertFalse(a.equals(b)); + assertFalse(b.equals(a)); + } + // different content, same length + { + final XMLCharBuffer a = new XMLCharBuffer("ac"); + final XMLCharBuffer b = new XMLCharBuffer("ab"); + assertFalse(a.equals(b)); + assertFalse(b.equals(a)); + } + // length 1, identical + { + final XMLCharBuffer a = new XMLCharBuffer("a"); + final XMLCharBuffer b = new XMLCharBuffer("a"); + assertTrue(a.equals(b)); + assertTrue(b.equals(a)); + } + // length 1, different + { + final XMLCharBuffer a = new XMLCharBuffer("b"); + final XMLCharBuffer b = new XMLCharBuffer("b"); + assertTrue(a.equals(b)); + assertTrue(b.equals(a)); + } + // length > 1, same + { + final XMLCharBuffer a = new XMLCharBuffer("81hal/&%$"); + final XMLCharBuffer b = new XMLCharBuffer("81hal/&%$"); + assertTrue(a.equals(b)); + assertTrue(b.equals(a)); + } + // length > 1, different + { + final XMLCharBuffer a = new XMLCharBuffer("b091872983"); + final XMLCharBuffer b = new XMLCharBuffer("b09187298_"); + assertFalse(a.equals(b)); + assertFalse(b.equals(a)); + } + } + + @Test + public void isWhitespace() { + { + final XMLCharBuffer a = new XMLCharBuffer(""); + assertTrue(a.isWhitespace()); + } + { + final XMLCharBuffer a = new XMLCharBuffer(" "); + assertTrue(a.isWhitespace()); + } + { + final XMLCharBuffer a = new XMLCharBuffer("a"); + assertFalse(a.isWhitespace()); + } + { + final XMLCharBuffer a = new XMLCharBuffer(" a\t \n"); + assertFalse(a.isWhitespace()); + } + { + final XMLCharBuffer a = new XMLCharBuffer(" \t \n"); + assertTrue(a.isWhitespace()); + } + } } From 5107dca9ac1db1762ec9e09fd9374c8af17051b3 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:08:41 +0100 Subject: [PATCH 06/18] Introducing a new XMLString implementation and more usage of it to avoid as much memory overhead as possible. It also provides some more methods for easier handling of data. --- .../org/htmlunit/cyberneko/HTMLScanner.java | 417 +++++++++------- .../htmlunit/cyberneko/HTMLTagBalancer.java | 2 +- .../java/org/htmlunit/cyberneko/LostText.java | 2 +- .../cyberneko/filters/DefaultFilter.java | 2 +- .../cyberneko/parsers/DOMFragmentParser.java | 2 +- .../xerces/parsers/AbstractDOMParser.java | 10 +- .../xerces/parsers/AbstractSAXParser.java | 2 +- .../parsers/AbstractXMLDocumentParser.java | 1 + .../cyberneko/xerces/xni/XMLString.java | 285 ++++++++--- .../java/org/htmlunit/cyberneko/Writer.java | 2 +- .../xerces/xni/XMLStringLegacyTest.java | 7 +- .../cyberneko/xerces/xni/XMLStringTest.java | 448 +++++++++++------- 12 files changed, 734 insertions(+), 446 deletions(-) diff --git a/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java b/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java index ea6a8cb4..1c3fd035 100644 --- a/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java +++ b/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java @@ -34,9 +34,9 @@ import org.htmlunit.cyberneko.xerces.xni.NamespaceContext; import org.htmlunit.cyberneko.xerces.xni.QName; import org.htmlunit.cyberneko.xerces.xni.XMLAttributes; +import org.htmlunit.cyberneko.xerces.xni.XMLString; import org.htmlunit.cyberneko.xerces.xni.XMLDocumentHandler; import org.htmlunit.cyberneko.xerces.xni.XMLLocator; -import org.htmlunit.cyberneko.xerces.xni.XMLString; import org.htmlunit.cyberneko.xerces.xni.XNIException; import org.htmlunit.cyberneko.xerces.xni.parser.XMLComponentManager; import org.htmlunit.cyberneko.xerces.xni.parser.XMLConfigurationException; @@ -83,6 +83,7 @@ * @author Marc Guillemot * @author Ahmed Ashour * @author Ronald Brill + * @author René Schwietzke */ public class HTMLScanner implements XMLDocumentScanner, XMLLocator, HTMLComponent { @@ -284,8 +285,11 @@ public class HTMLScanner implements XMLDocumentScanner, XMLLocator, HTMLComponen // defaults - /** Default buffer size. */ - protected static final int DEFAULT_BUFFER_SIZE = 2048; + /* Default buffer size, 10 cache lines minus overhead + * A smaller buffer creates less cache misses compared + * to 2048 bytes or more. + */ + protected static final int DEFAULT_BUFFER_SIZE = (10 * 64) - 24; // debugging @@ -445,15 +449,30 @@ public class HTMLScanner implements XMLDocumentScanner, XMLLocator, HTMLComponen /** String buffer. */ private final XMLString fStringBuffer2 = new XMLString(); + /** String buffer, larger because scripts areas are larger */ + private final XMLString fScanScriptContent = new XMLString(128); + + private final XMLString fScanUntilEndTag = new XMLString(); + + private final XMLString fScanComment = new XMLString(); + + private final XMLString fScanLiteral = new XMLString(); + /** Single boolean array. */ private final boolean[] fSingleBoolean = {false}; private final HTMLConfiguration htmlConfiguration_; + /** + * Creates a new HTMLScanner with the given configuration + * + * @param htmlConfiguration the configuration to use + */ HTMLScanner(final HTMLConfiguration htmlConfiguration) { - htmlConfiguration_ = htmlConfiguration; + this.htmlConfiguration_ = htmlConfiguration; } + /** * Pushes an input source onto the current entity stack. This enables the * scanner to transparently scan new content (e.g. the output written by an @@ -1085,14 +1104,15 @@ else if (skip("SYSTEM", false)) { // Scans a quoted literal. protected String scanLiteral() throws IOException { final int quote = fCurrentEntity.read(); - if (quote == '\'' || quote == '"') { - final StringBuilder str = new StringBuilder(); + + if (quote == '"' || quote == '\'') { + final XMLString str = fScanLiteral.clear(); int c; while ((c = fCurrentEntity.read()) != -1) { if (c == quote) { break; } - if (c == '\r' || c == '\n') { + if (c == '\n' || c == '\r') { fCurrentEntity.rewind(); // NOTE: This collapses newlines to a single space. // [Q] Is this the right thing to do here? -Ac @@ -1104,7 +1124,14 @@ else if (c == '<') { break; } else { - appendChar(str, c, null); + try { + str.appendCodePoint(c); + } + catch (IllegalArgumentException e) { + if (fReportErrors_) { + fErrorReporter.reportError("HTML1005", new Object[] {"&#" + c + ';'}); + } + } } } if (c == -1) { @@ -1115,8 +1142,10 @@ else if (c == '<') { } return str.toString(); } - fCurrentEntity.rewind(); - return null; + else { + fCurrentEntity.rewind(); + return null; + } } // Scans a name. @@ -1165,8 +1194,7 @@ protected String scanName(final boolean strict) throws IOException { // Scans an entity reference. protected int scanEntityRef(final XMLString str, final boolean content) throws IOException { - str.clear(); - str.append('&'); + str.clearAndAppend('&'); // use readPreservingBufferContent inside this method to be sure we can rewind @@ -1195,13 +1223,11 @@ protected int scanEntityRef(final XMLString str, final boolean content) throws I if (match == null) { final String consumed = str.toString(); fCurrentEntity.rewind(consumed.length() - 1); - str.clear(); - str.append('&'); + str.clearAndAppend('&'); } else { fCurrentEntity.rewind(parser.getRewindCount()); - str.clear(); - str.append(match); + str.clear().append(match); } return returnEntityRefString(str, content); } @@ -1254,8 +1280,7 @@ protected int scanEntityRef(final XMLString str, final boolean content) throws I // if we have a correct character that is terminate by ; // we can keep things simple if (result.endsWithSemicolon) { - str.clear(); - str.append(result.resolvedValue); + str.clear().append(result.resolvedValue); } else { if (fReportErrors_) { @@ -1280,8 +1305,7 @@ protected int scanEntityRef(final XMLString str, final boolean content) throws I // Flush code points consumed as a character reference. Switch to the ambiguous ampersand state. // } if (content) { - str.clear(); - str.append(result.resolvedValue); + str.clear().append(result.resolvedValue); } else { // look ahead @@ -1292,16 +1316,14 @@ protected int scanEntityRef(final XMLString str, final boolean content) throws I if ('=' == nextChar || '0' <= nextChar && nextChar <= '9' || 'A' <= nextChar && nextChar <= 'Z' || 'a' <= nextChar && nextChar <= 'z') { // we just shorten our temp str instead of copying stuff around - str.delete(result.length + 1, str.length() + 1); + str.shortenBy(str.length() - result.length - 1); } else { - str.clear(); - str.append(result.resolvedValue); + str.clear().append(result.resolvedValue); } } else { - str.clear(); - str.append(result.resolvedValue); + str.clear().append(result.resolvedValue); } } } @@ -1310,8 +1332,7 @@ protected int scanEntityRef(final XMLString str, final boolean content) throws I // Entity not found, rewind and continue // broken from here, aka keeping everything fCurrentEntity.rewind(readCount); - str.clear(); - str.append('&'); + str.clearAndAppend('&'); } return returnEntityRefString(str, content); @@ -1419,15 +1440,19 @@ protected boolean skipSpaces() throws IOException { } } final char c = fCurrentEntity.getNextChar(); - if (!Character.isWhitespace(c)) { - fCurrentEntity.rewind(); - break; + // compare against the usual suspects first before going + // the expensive route + if (c == ' ' || c == '\n' || Character.isWhitespace(c)) { + spaces = true; + // unix \n might dominate + if (c == '\n' || c == '\r') { + fCurrentEntity.rewind(); + skipNewlines(); + } } - spaces = true; - if (c == '\r' || c == '\n') { + else { fCurrentEntity.rewind(); - skipNewlines(); - continue; + break; } } if (DEBUG_BUFFER) { @@ -1442,7 +1467,7 @@ protected int skipNewlines() throws IOException { fCurrentEntity.debugBufferIfNeeded("(skipNewlines: "); } - if (!fCurrentEntity.hasNext()) { + if (fCurrentEntity.offset_ == fCurrentEntity.length_) { if (fCurrentEntity.load(0) == -1) { if (DEBUG_BUFFER) { fCurrentEntity.debugBufferIfNeeded(")skipNewlines: "); @@ -1455,7 +1480,7 @@ protected int skipNewlines() throws IOException { if (c == '\n' || c == '\r') { do { c = fCurrentEntity.getNextChar(); - if (c == '\r') { + if (c == '\n') { newlines++; if (fCurrentEntity.offset_ == fCurrentEntity.length_) { fCurrentEntity.offset_ = newlines; @@ -1463,12 +1488,8 @@ protected int skipNewlines() throws IOException { break; } } - if (fCurrentEntity.getCurrentChar() == '\n') { - fCurrentEntity.offset_++; - fCurrentEntity.characterOffset_++; - } } - else if (c == '\n') { + else if (c == '\r') { newlines++; if (fCurrentEntity.offset_ == fCurrentEntity.length_) { fCurrentEntity.offset_ = newlines; @@ -1476,6 +1497,10 @@ else if (c == '\n') { break; } } + if (fCurrentEntity.getCurrentChar() == '\n') { + fCurrentEntity.offset_++; + fCurrentEntity.characterOffset_++; + } } else { fCurrentEntity.rewind(); @@ -1516,66 +1541,6 @@ protected static boolean builtinXmlRef(final String name) { || "apos".equals(name); } - /** - * Append a character to an XMLStringBuffer. The character is an int value, and - * can either be a single UTF-16 character or a supplementary character - * represented by two UTF-16 code points. - * - * @param str The XMLStringBuffer to append to. - * @param value The character value. - * @param name to be used for error reporting - */ - private void appendChar(final XMLString str, final int value, String name) { - if (value > Character.MAX_VALUE) { - try { - final char[] chars = Character.toChars(value); - str.append(chars, 0, chars.length); - } - catch (final IllegalArgumentException e) { // when value is not valid as UTF-16 - if (fReportErrors_) { - if (name == null) { - name = "&#" + value + ';'; - } - fErrorReporter.reportError("HTML1005", new Object[] {name}); - } - str.append(REPLACEMENT_CHARACTER); - } - } - else { - str.append((char) value); - } - } - - /** - * Append a character to a StringBuilder. The character is an int value, and can - * either be a single UTF-16 character or a supplementary character represented - * by two UTF-16 code points. - * - * @param str The StringBuilder to append to. - * @param value The character value. - * @param name to be used for error reporting - */ - private void appendChar(final StringBuilder str, final int value, String name) { - if (value > Character.MAX_VALUE) { - try { - final char[] chars = Character.toChars(value); - str.append(chars, 0, chars.length); - } - catch (final IllegalArgumentException e) { // when value is not valid as UTF-16 - if (fReportErrors_) { - if (name == null) { - name = "&#" + value + ';'; - } - fErrorReporter.reportError("HTML1005", new Object[] {name}); - } - str.append(REPLACEMENT_CHARACTER); - } - } - else { - str.append((char) value); - } - } - /** * Basic scanner interface. * @@ -1602,7 +1567,7 @@ public interface Scanner { * * @author Andy Clark */ - public static final class CurrentEntity { + public final class CurrentEntity { /** Character stream. */ private Reader stream_; @@ -1699,18 +1664,20 @@ protected int load(final int loadOffset) throws IOException { debugBufferIfNeeded("(load: "); } // resize buffer, if needed - if (loadOffset == buffer_.length) { - final int adjust = buffer_.length / 4; + if (loadOffset == this.buffer_.length) { + final int adjust = this.buffer_.length / 4; final char[] array = new char[buffer_.length + adjust]; - System.arraycopy(buffer_, 0, array, 0, length_); - buffer_ = array; + System.arraycopy(this.buffer_, 0, array, 0, this.length_); + this.buffer_ = array; } // read a block of characters final int count = stream_.read(buffer_, loadOffset, buffer_.length - loadOffset); if (count == -1) { - endReached_ = true; + this.length_ = loadOffset; + this.endReached_ = true; + } else { + this.length_ = count + loadOffset; } - length_ = count != -1 ? count + loadOffset : loadOffset; this.offset_ = loadOffset; if (DEBUG_BUFFER) { debugBufferIfNeeded(")load: ", " -> " + count); @@ -1907,8 +1874,7 @@ else if (c == '&') { fErrorReporter.reportError("HTML1003", null); } if (fDocumentHandler != null && fElementCount >= fElementDepth) { - fStringBuffer.clear(); - fStringBuffer.append('<'); + fStringBuffer.clearAndAppend('<'); fDocumentHandler.characters(fStringBuffer, null); } throw new EOFException(); @@ -1922,7 +1888,10 @@ else if (c == '&') { fEndLineNumber = fCurrentEntity.getLineNumber(); fEndColumnNumber = fCurrentEntity.getColumnNumber(); fEndCharacterOffset = fCurrentEntity.getCharacterOffset(); - fDocumentHandler.comment(new XMLString(), locationAugs()); + // using EMPTY here is slightly dangerous but a review showed + // that all implementations of comment() only read the data + // never do anything else with it, so safe for now + fDocumentHandler.comment(XMLString.EMPTY, locationAugs()); } else if (skip("-!>", false)) { fEndLineNumber = fCurrentEntity.getLineNumber(); @@ -2058,7 +2027,8 @@ else if (ename != null && htmlConfiguration_.getHtmlElements().getElement(enameL * @throws IOException on error */ private void scanUntilEndTag(final String tagName) throws IOException { - final XMLString xmlString = new XMLString(); + fScanUntilEndTag.clear(); + final String end = "/" + tagName; final int lengthToScan = tagName.length() + 2; @@ -2080,31 +2050,40 @@ private void scanUntilEndTag(final String tagName) throws IOException { fCurrentEntity.rewind(); final int newlines = skipNewlines(); for (int i = 0; i < newlines; i++) { - xmlString.append('\n'); + fScanUntilEndTag.append('\n'); } } else { - appendChar(xmlString, c, null); + try { + fScanUntilEndTag.appendCodePoint(c); + } + catch (IllegalArgumentException e) { + if (fReportErrors_) { + fErrorReporter.reportError("HTML1005", new Object[] {"&#" + c + ';'}); + } + } } } - if (xmlString.length() > 0 && fDocumentHandler != null) { + if (fScanUntilEndTag.length() > 0 && fDocumentHandler != null) { fEndLineNumber = fCurrentEntity.getLineNumber(); fEndColumnNumber = fCurrentEntity.getColumnNumber(); fEndCharacterOffset = fCurrentEntity.getCharacterOffset(); - fDocumentHandler.characters(xmlString, locationAugs()); + fDocumentHandler.characters(fScanUntilEndTag, locationAugs()); } } private void scanScriptContent() throws IOException { - final XMLString xmlString = new XMLString(); + fScanScriptContent.clear(); + boolean waitForEndComment = false; boolean invalidComment = false; + while (true) { final int c = fCurrentEntity.read(); if (c == -1) { break; } - else if (c == '-' && xmlString.endsWith("') { - if (xmlString.endsWith("--")) { + if (fScanScriptContent.endsWith("--")) { waitForEndComment = false; } - if (xmlString.endsWith("--!")) { + if (fScanScriptContent.endsWith("--!")) { invalidComment = true; waitForEndComment = false; } @@ -2129,34 +2108,41 @@ else if (c == '>') { fCurrentEntity.rewind(); final int newlines = skipNewlines(); for (int i = 0; i < newlines; i++) { - xmlString.append('\n'); + fScanScriptContent.append('\n'); } } else { - appendChar(xmlString, c, null); + try { + fScanScriptContent.appendCodePoint(c); + } + catch (IllegalArgumentException e) { + if (fReportErrors_) { + fErrorReporter.reportError("HTML1005", new Object[] {"&#" + c + ';'}); + } + } } } if (fScriptStripCommentDelims_) { if (invalidComment) { - xmlString.reduceToContent(""); + fScanScriptContent.trimToContent(""); } else { - xmlString.reduceToContent(""); + fScanScriptContent.trimToContent(""); } } if (fScriptStripCDATADelims_) { - xmlString.reduceToContent(""); + fScanScriptContent.trimToContent(""); } - if (xmlString.length() > 0 && fDocumentHandler != null && fElementCount >= fElementDepth) { + if (fScanScriptContent.length() > 0 && fDocumentHandler != null && fElementCount >= fElementDepth) { if (DEBUG_CALLBACKS) { - System.out.println("characters(" + xmlString + ")"); + System.out.println("characters(" + fScanScriptContent + ")"); } fEndLineNumber = fCurrentEntity.getLineNumber(); fEndColumnNumber = fCurrentEntity.getColumnNumber(); fEndCharacterOffset = fCurrentEntity.getCharacterOffset(); - fDocumentHandler.characters(xmlString, locationAugs()); + fDocumentHandler.characters(fScanScriptContent, locationAugs()); } } @@ -2210,13 +2196,12 @@ protected void scanCharacters() throws IOException { } break; } - char c; final int offset = fCurrentEntity.offset_ - newlines; for (int i = offset; i < fCurrentEntity.offset_; i++) { fCurrentEntity.buffer_[i] = '\n'; } while (fCurrentEntity.hasNext()) { - c = fCurrentEntity.getNextChar(); + final char c = fCurrentEntity.getNextChar(); if (c == '<' || c == '&' || c == '\n' || c == '\r') { fCurrentEntity.rewind(); break; @@ -2309,12 +2294,12 @@ protected void scanComment() throws IOException { fEndLineNumber = fCurrentEntity.getLineNumber(); fEndColumnNumber = fCurrentEntity.getColumnNumber(); fEndCharacterOffset = fCurrentEntity.getCharacterOffset(); - XMLString xmlString = new XMLString(); - boolean eof = scanCommentContent(xmlString); + fScanComment.clear(); + boolean eof = scanCommentContent(fScanComment); // no --> found, comment with end only with > if (eof) { - fCurrentEntity.resetBuffer(xmlString, fEndLineNumber, fEndColumnNumber, fEndCharacterOffset); - xmlString = new XMLString(); // take a new one to avoid interactions + fCurrentEntity.resetBuffer(fScanComment, fEndLineNumber, fEndColumnNumber, fEndCharacterOffset); + fScanComment.clear(); // take a new one to avoid interactions while (true) { final int c = fCurrentEntity.read(); if (c == -1) { @@ -2328,12 +2313,19 @@ else if (c == '\n' || c == '\r') { fCurrentEntity.rewind(); final int newlines = skipNewlines(); for (int i = 0; i < newlines; i++) { - xmlString.append('\n'); + fScanComment.append('\n'); } continue; } else if (c != '>') { - appendChar(xmlString, c, null); + try { + fScanComment.appendCodePoint(c); + } + catch (IllegalArgumentException e) { + if (fReportErrors_) { + fErrorReporter.reportError("HTML1005", new Object[] {"&#" + c + ';'}); + } + } continue; } eof = false; @@ -2342,12 +2334,12 @@ else if (c != '>') { } if (fDocumentHandler != null && fElementCount >= fElementDepth) { if (DEBUG_CALLBACKS) { - System.out.println("comment(" + xmlString + ")"); + System.out.println("comment(" + fScanComment + ")"); } fEndLineNumber = fCurrentEntity.getLineNumber(); fEndColumnNumber = fCurrentEntity.getColumnNumber(); fEndCharacterOffset = fCurrentEntity.getCharacterOffset(); - fDocumentHandler.comment(xmlString, locationAugs()); + fDocumentHandler.comment(fScanComment, locationAugs()); } if (DEBUG_BUFFER) { fCurrentEntity.debugBufferIfNeeded(")scanComment: "); @@ -2357,8 +2349,8 @@ else if (c != '>') { } } - // Scans comment content. - protected boolean scanCommentContent(final XMLString xmlString) throws IOException { + // Scans markup content. + protected boolean scanMarkupContent(final XMLString buffer, final char cend) throws IOException { int c; OUTER: while (true) { c = fCurrentEntity.read(); @@ -2471,19 +2463,20 @@ protected boolean scanCDataContent(final XMLString xmlString) throws IOException break OUTER; } if (count < 2) { - xmlString.append(']'); + buffer.append(cend); + // if (c != -1) { fCurrentEntity.rewind(); continue; } if (c != '>') { for (int i = 0; i < count; i++) { - xmlString.append(']'); + buffer.append(cend); } fCurrentEntity.rewind(); continue; } for (int i = 0; i < count - 2; i++) { - xmlString.append(']'); + buffer.append(cend); } break; } @@ -2495,11 +2488,18 @@ else if (c == '\n' || c == '\r') { fCurrentEntity.rewind(); final int newlines = skipNewlines(); for (int i = 0; i < newlines; i++) { - xmlString.append('\n'); + buffer.append('\n'); } continue; } - appendChar(xmlString, c, null); + try { + buffer.appendCodePoint(c); + } + catch (IllegalArgumentException e) { + if (fReportErrors_) { + fErrorReporter.reportError("HTML1005", new Object[] {"&#" + c + ';'}); + } + } } if (!fCDATASections_) { @@ -2587,7 +2587,14 @@ else if (c == '>') { return; } else { - appendChar(fStringBuffer, c, null); + try { + fStringBuffer.appendCodePoint(c); + } + catch (IllegalArgumentException e) { + if (fReportErrors_) { + fErrorReporter.reportError("HTML1005", new Object[] {"&#" + c + ';'}); + } + } } } if (fDocumentHandler != null) { @@ -2661,8 +2668,7 @@ protected String scanStartElement(final boolean[] empty) throws IOException { fErrorReporter.reportError("HTML1009", null); } if (fDocumentHandler != null && fElementCount >= fElementDepth) { - fStringBuffer.clear(); - fStringBuffer.append('<'); + fStringBuffer.clearAndAppend('<'); if (length > 0) { fStringBuffer.append(ename); } @@ -2947,7 +2953,14 @@ else if (c == '<') { fStringBuffer.append(fStringBuffer2); } else { - appendChar(fStringBuffer, c, null); + try { + fStringBuffer.appendCodePoint(c); + } + catch (IllegalArgumentException e) { + if (fReportErrors_) { + fErrorReporter.reportError("HTML1005", new Object[] {"&#" + c + ';'}); + } + } } } qName_.setValues(null, aname, aname, null); @@ -2970,22 +2983,13 @@ else if (c == '<') { } throw new EOFException(); } - if (c == '&') { - isStart = false; - final int ce = scanEntityRef(fStringBuffer2, false); - if (ce != -1) { - appendChar(fStringBuffer, ce, null); - } - else { - fStringBuffer.append(fStringBuffer2); - } - } - else if (c == ' ' || c == '\t') { + if (c == ' ' || c == '\t') { if (acceptSpace) { fStringBuffer.append(fNormalizeAttributes_ ? ' ' : (char) c); } + prevSpace = true; } - else if (c == '\r' || c == '\n') { + else if (c == '\n' || c == '\r') { if (c == '\r') { final int c2 = fCurrentEntity.read(); if (c2 == '\n') { @@ -2999,19 +3003,47 @@ else if (c2 != -1) { fStringBuffer.append(fNormalizeAttributes_ ? ' ' : '\n'); } fCurrentEntity.incLine(); + prevSpace = true; + } + else if (c == '&') { + isStart = false; + final int ce = scanEntityRef(fStringBuffer2, false); + if (ce != -1) { + try { + fStringBuffer.appendCodePoint(ce); + } + catch (IllegalArgumentException e) { + if (fReportErrors_) { + fErrorReporter.reportError("HTML1005", new Object[] {"&#" + ce + ';'}); + } + } + } + else { + fStringBuffer.append(fStringBuffer2); + } + prevSpace = false; } else if (c != quote) { isStart = false; - appendChar(fStringBuffer, c, null); + try { + fStringBuffer.appendCodePoint(c); + } + catch (IllegalArgumentException e) { + if (fReportErrors_) { + fErrorReporter.reportError("HTML1005", new Object[] {"&#" + c + ';'}); + } + } + prevSpace = false; } - prevSpace = c == ' ' || c == '\t' || c == '\r' || c == '\n'; + // moved into IFs to safe on conditions + // prevSpace = c == ' ' || c == '\t' || c == '\r' || c == '\n'; isStart = isStart && prevSpace; } while (c != quote); if (fNormalizeAttributes_ && fStringBuffer.length() > 0) { // trailing whitespace already normalized to single space - fStringBuffer.trimWhitespaceAtEnd(); + fStringBuffer.trimTrailing(); } qName_.setValues(null, aname, aname, null); @@ -3089,7 +3121,7 @@ public class SpecialScanner implements Scanner { private final QName fQName_ = new QName(); /** A string buffer. */ - private final XMLString xmlString_ = new XMLString(); + private final XMLString charBuffer_ = new XMLString(); // Sets the element name. public Scanner setElementName(final String ename) { @@ -3125,17 +3157,16 @@ public boolean scan(final boolean complete) throws IOException { } if (c == '&') { if (fTextarea || fTitle) { - scanEntityRef(xmlString_, true); + scanEntityRef(charBuffer_, true); continue; } - xmlString_.clear(); - xmlString_.append('&'); + charBuffer_.clearAndAppend('&'); } else { fCurrentEntity.rewind(); - xmlString_.clear(); + charBuffer_.clear(); } - scanCharacters(xmlString_, -1); + scanCharacters(charBuffer_, -1); break; } case STATE_MARKUP_BRACKET: { @@ -3163,21 +3194,25 @@ public boolean scan(final boolean complete) throws IOException { } fCurrentEntity.rewind(); } - xmlString_.clear(); - xmlString_.append(""); + buffer.trimToContent(""); } if (fStyleStripCDATADelims_) { - buffer.reduceToContent(""); + buffer.trimToContent(""); } } @@ -3272,7 +3314,16 @@ protected void scanCharacters(final XMLString buffer) throws IOException { if (c == -1) { break; } - appendChar(buffer, c, null); + + try { + buffer.appendCodePoint(c); + } + catch (IllegalArgumentException e) { + if (fReportErrors_) { + fErrorReporter.reportError("HTML1005", new Object[] {"&#" + c + ';'}); + } + } + if (c == '\n') { fCurrentEntity.incLine(); } diff --git a/src/main/java/org/htmlunit/cyberneko/HTMLTagBalancer.java b/src/main/java/org/htmlunit/cyberneko/HTMLTagBalancer.java index c09f7967..39bc3e8f 100644 --- a/src/main/java/org/htmlunit/cyberneko/HTMLTagBalancer.java +++ b/src/main/java/org/htmlunit/cyberneko/HTMLTagBalancer.java @@ -27,9 +27,9 @@ import org.htmlunit.cyberneko.xerces.xni.NamespaceContext; import org.htmlunit.cyberneko.xerces.xni.QName; import org.htmlunit.cyberneko.xerces.xni.XMLAttributes; +import org.htmlunit.cyberneko.xerces.xni.XMLString; import org.htmlunit.cyberneko.xerces.xni.XMLDocumentHandler; import org.htmlunit.cyberneko.xerces.xni.XMLLocator; -import org.htmlunit.cyberneko.xerces.xni.XMLString; import org.htmlunit.cyberneko.xerces.xni.XNIException; import org.htmlunit.cyberneko.xerces.xni.parser.XMLComponentManager; import org.htmlunit.cyberneko.xerces.xni.parser.XMLConfigurationException; diff --git a/src/main/java/org/htmlunit/cyberneko/LostText.java b/src/main/java/org/htmlunit/cyberneko/LostText.java index 0bde1bb6..119b85f3 100644 --- a/src/main/java/org/htmlunit/cyberneko/LostText.java +++ b/src/main/java/org/htmlunit/cyberneko/LostText.java @@ -19,8 +19,8 @@ import java.util.List; import org.htmlunit.cyberneko.xerces.xni.Augmentations; -import org.htmlunit.cyberneko.xerces.xni.XMLDocumentHandler; import org.htmlunit.cyberneko.xerces.xni.XMLString; +import org.htmlunit.cyberneko.xerces.xni.XMLDocumentHandler; /** * Container for text that should be hold and re-feed later like text before <html> that will be re-feed diff --git a/src/main/java/org/htmlunit/cyberneko/filters/DefaultFilter.java b/src/main/java/org/htmlunit/cyberneko/filters/DefaultFilter.java index a133308f..49ff5406 100644 --- a/src/main/java/org/htmlunit/cyberneko/filters/DefaultFilter.java +++ b/src/main/java/org/htmlunit/cyberneko/filters/DefaultFilter.java @@ -20,9 +20,9 @@ import org.htmlunit.cyberneko.xerces.xni.NamespaceContext; import org.htmlunit.cyberneko.xerces.xni.QName; import org.htmlunit.cyberneko.xerces.xni.XMLAttributes; +import org.htmlunit.cyberneko.xerces.xni.XMLString; import org.htmlunit.cyberneko.xerces.xni.XMLDocumentHandler; import org.htmlunit.cyberneko.xerces.xni.XMLLocator; -import org.htmlunit.cyberneko.xerces.xni.XMLString; import org.htmlunit.cyberneko.xerces.xni.XNIException; import org.htmlunit.cyberneko.xerces.xni.parser.XMLComponentManager; import org.htmlunit.cyberneko.xerces.xni.parser.XMLConfigurationException; diff --git a/src/main/java/org/htmlunit/cyberneko/parsers/DOMFragmentParser.java b/src/main/java/org/htmlunit/cyberneko/parsers/DOMFragmentParser.java index b80ed4e1..da5e1156 100644 --- a/src/main/java/org/htmlunit/cyberneko/parsers/DOMFragmentParser.java +++ b/src/main/java/org/htmlunit/cyberneko/parsers/DOMFragmentParser.java @@ -27,9 +27,9 @@ import org.htmlunit.cyberneko.xerces.xni.NamespaceContext; import org.htmlunit.cyberneko.xerces.xni.QName; import org.htmlunit.cyberneko.xerces.xni.XMLAttributes; +import org.htmlunit.cyberneko.xerces.xni.XMLString; import org.htmlunit.cyberneko.xerces.xni.XMLDocumentHandler; import org.htmlunit.cyberneko.xerces.xni.XMLLocator; -import org.htmlunit.cyberneko.xerces.xni.XMLString; import org.htmlunit.cyberneko.xerces.xni.XNIException; import org.htmlunit.cyberneko.xerces.xni.parser.XMLConfigurationException; import org.htmlunit.cyberneko.xerces.xni.parser.XMLDocumentSource; diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractDOMParser.java b/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractDOMParser.java index e982e38f..2a1f07ff 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractDOMParser.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractDOMParser.java @@ -31,8 +31,8 @@ import org.htmlunit.cyberneko.xerces.xni.NamespaceContext; import org.htmlunit.cyberneko.xerces.xni.QName; import org.htmlunit.cyberneko.xerces.xni.XMLAttributes; -import org.htmlunit.cyberneko.xerces.xni.XMLLocator; import org.htmlunit.cyberneko.xerces.xni.XMLString; +import org.htmlunit.cyberneko.xerces.xni.XMLLocator; import org.htmlunit.cyberneko.xerces.xni.XNIException; import org.htmlunit.cyberneko.xerces.xni.parser.XMLConfigurationException; import org.htmlunit.cyberneko.xerces.xni.parser.XMLErrorHandler; @@ -133,7 +133,7 @@ public class AbstractDOMParser extends AbstractXMLDocumentParser { protected EntityImpl fCurrentEntityDecl; /** Character buffer */ - protected final StringBuilder fStringBuffer = new StringBuilder(); + protected final XMLString fStringBuffer = new XMLString(); protected boolean fNamespaceAware; @@ -218,7 +218,7 @@ public void reset() throws XNIException { fCurrentNode = null; // reset string buffer - fStringBuffer.setLength(0); + fStringBuffer.clear(); // reset state information fInCDATASection = false; @@ -583,7 +583,7 @@ public void characters(final XMLString text, final Augmentations augs) throws XN fFirstChunk = false; } if (text.length() > 0) { - text.appendTo(fStringBuffer); + text.append(fStringBuffer); } } else { @@ -888,7 +888,7 @@ protected void setCharacterData(final boolean sawChars) { } } // reset string buffer - fStringBuffer.setLength(0); + fStringBuffer.clear(); } } } diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractSAXParser.java b/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractSAXParser.java index 1dc5fdc9..c38c3b4a 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractSAXParser.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractSAXParser.java @@ -23,8 +23,8 @@ import org.htmlunit.cyberneko.xerces.xni.NamespaceContext; import org.htmlunit.cyberneko.xerces.xni.QName; import org.htmlunit.cyberneko.xerces.xni.XMLAttributes; -import org.htmlunit.cyberneko.xerces.xni.XMLLocator; import org.htmlunit.cyberneko.xerces.xni.XMLString; +import org.htmlunit.cyberneko.xerces.xni.XMLLocator; import org.htmlunit.cyberneko.xerces.xni.XNIException; import org.htmlunit.cyberneko.xerces.xni.parser.XMLConfigurationException; import org.htmlunit.cyberneko.xerces.xni.parser.XMLErrorHandler; diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractXMLDocumentParser.java b/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractXMLDocumentParser.java index 35a05c31..9bafb944 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractXMLDocumentParser.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/parsers/AbstractXMLDocumentParser.java @@ -18,6 +18,7 @@ import org.htmlunit.cyberneko.xerces.xni.NamespaceContext; import org.htmlunit.cyberneko.xerces.xni.QName; import org.htmlunit.cyberneko.xerces.xni.XMLAttributes; +import org.htmlunit.cyberneko.xerces.xni.XMLString; import org.htmlunit.cyberneko.xerces.xni.XMLDocumentHandler; import org.htmlunit.cyberneko.xerces.xni.XMLLocator; import org.htmlunit.cyberneko.xerces.xni.XMLString; diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java b/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java index 851730e7..c71d7fb2 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLString.java @@ -16,23 +16,28 @@ import java.util.Arrays; +import org.xml.sax.ContentHandler; +import org.xml.sax.SAXException; +import org.xml.sax.ext.LexicalHandler; + /** - *

This class is meant to replace the {@link XMLString} in many areas where - * performance and memory-efficency is key. The old XMLString remains in - * plays in case one has used that in their own code. + *

This class is meant to replaces the old {@link XMLString} in all areas + * where performance and memory-efficency is key. XMLString compatibility + * remains in place in case one has used that in their own code. * - *

This buffer is volatile and when you use it, make sure you work with + *

This buffer is mutable and when you use it, make sure you work with * it responsibly. In many cases, we will reuse the buffer to avoid fresh * memory allocations, hence you have to pay attention to its usage pattern. * It is not meant to be a general String replacement. * - *

This class avoid many of the standard runtime checks that will result + *

This class avoids many of the standard runtime checks that will result * in a runtime or array exception anyway. Why check twice and raise the * same exception? * * @author René Schwietzke + * @since 3.10.0 */ -public class XMLCharBuffer implements CharSequence { +public class XMLString implements CharSequence { // our data, can grow private char[] data_; @@ -42,18 +47,24 @@ public class XMLCharBuffer implements CharSequence { // the current size of the string data private final int growBy_; - // how much do we grow if needed - public static final int CAPACITY_GROWTH = 10; + // how much do we grow if needed, half a cache line + public static final int CAPACITY_GROWTH = 64 / 2; - // how much do we grow if needed + // what is our start size? // a cache line is 64 byte mostly, the overhead is mostly 24 bytes - // a char is two bytes, let's use one cache lines and resize less + // a char is two bytes, let's use one cache lines public static final int INITIAL_CAPACITY = (64 - 24) / 2; + // static empty version; DON'T MODIFY IT + public static final XMLString EMPTY = new XMLString(0); + + // the � character + private static final char REPLACEMENT_CHARACTER = '\uFFFD'; + /** * Constructs an XMLCharBuffer with a default size. */ - public XMLCharBuffer() { + public XMLString() { this.data_ = new char[INITIAL_CAPACITY]; this.length_ = 0; this.growBy_ = CAPACITY_GROWTH; @@ -64,7 +75,7 @@ public XMLCharBuffer() { * * @param startSize the size of the buffer to start with */ - public XMLCharBuffer(final int startSize) { + public XMLString(final int startSize) { this(startSize, CAPACITY_GROWTH); } @@ -74,9 +85,7 @@ public XMLCharBuffer(final int startSize) { * @param startSize the size of the buffer to start with * @param growBy by how much do we want to grow when needed */ - public XMLCharBuffer(final int startSize, final int growBy) { - // a cache line is 64 byte mostly, the overhead is mostly 24 bytes - // a char is two bytes, let's use one cache lines and resize less + public XMLString(final int startSize, final int growBy) { this.data_ = new char[startSize]; this.length_ = 0; this.growBy_ = Math.max(1, growBy); @@ -84,25 +93,23 @@ public XMLCharBuffer(final int startSize, final int growBy) { /** * Constructs an XMLCharBuffer from another buffer. Copies the data - * over. The new buffer capacity matches the length of the source but - * has a minimum capacity of INITIAL_CAPACITY. + * over. The new buffer capacity matches the length of the source. * * @param src the source buffer to copy from */ - public XMLCharBuffer(final XMLCharBuffer src) { + public XMLString(final XMLString src) { this(src, 0); } /** * Constructs an XMLCharBuffer from another buffer. Copies the data * over. You can add more capacity on top of the source length. If - * you specify 0, the capacity will match the length. + * you specify 0, the capacity will match the src length. * * @param src the source buffer to copy from - * @param addCapacity how much capacity to add to this buffer besides - * the already copied data + * @param addCapacity how much capacity to add to origin length */ - public XMLCharBuffer(final XMLCharBuffer src, final int addCapacity) { + public XMLString(final XMLString src, final int addCapacity) { this.data_ = Arrays.copyOf(src.data_, src.length_ + Math.max(0, addCapacity)); this.length_ = src.length(); this.growBy_ = Math.max(1, CAPACITY_GROWTH); @@ -110,11 +117,12 @@ public XMLCharBuffer(final XMLCharBuffer src, final int addCapacity) { /** * Constructs an XMLCharBuffer from a string. To avoid - * too much allocation, we just take the string array as our own. + * too much allocation, we just take the string array as is and + * don't allocate extra space in the first place. * * @param src the string to copy from */ - public XMLCharBuffer(final String src) { + public XMLString(final String src) { this.data_ = src.toCharArray(); this.length_ = src.length(); this.growBy_ = CAPACITY_GROWTH; @@ -125,13 +133,13 @@ public XMLCharBuffer(final String src) { * There will not be any room to grow, if you need that, construct an * empty one and append. * - *

There are not range checks performed. Make sure your data is legit. + *

There are not range checks performed. Make sure your data is correct. * * @param ch The character array, must not be null * @param offset The offset into the character array. * @param length The length of characters from the offset. */ - public XMLCharBuffer(final char[] ch, final int offset, final int length) { + public XMLString(final char[] ch, final int offset, final int length) { // just as big as we need it this(length); append(ch, offset, length); @@ -140,11 +148,12 @@ public XMLCharBuffer(final char[] ch, final int offset, final int length) { /** * Check capacity and grow if needed automatically * - * @param desiredCapacity how much space do we need in total + * @param minimumCapacity how much space do we need at least */ - private void ensureCapacity(final int desiredCapacity) { - if (this.data_.length < desiredCapacity) { - this.data_ = Arrays.copyOf(this.data_, desiredCapacity + this.growBy_); + private void ensureCapacity(final int minimumCapacity) { + if (minimumCapacity > this.data_.length) { + final int newSize = Math.max(minimumCapacity + this.growBy_, (this.data_.length << 1) + 2); + this.data_ = Arrays.copyOf(this.data_, newSize); } } @@ -165,11 +174,17 @@ public int capacity() { * @param c the character to append * @return this instance */ - public XMLCharBuffer append(final char c) { - ensureCapacity(this.length_ + 1); + public XMLString append(final char c) { + final int oldLength = this.length_++; + + // ensureCapacity is not inlined by the compiler, so put that here for the most + // called method of all appends. Duplicate code, but for a reason. + if (oldLength == this.data_.length) { + final int newSize = Math.max(oldLength + this.growBy_, (this.data_.length << 1) + 2); + this.data_ = Arrays.copyOf(this.data_, newSize); + } - this.data_[this.length_] = c; - this.length_++; + this.data_[oldLength] = c; return this; } @@ -177,17 +192,17 @@ public XMLCharBuffer append(final char c) { /** * Append a string to this buffer without copying the string first. * - * @param src the string to copy + * @param src the string to append * @return this instance */ - public XMLCharBuffer append(final String src) { + public XMLString append(final String src) { final int start = this.length_; this.length_ = this.length_ + src.length(); ensureCapacity(this.length_); // copy char by char because we don't get a copy for free // from a string yet, this might change when immutable arrays - // make it into Java + // make it into Java, but that will not be very soon for (int i = 0; i < src.length(); i++) { this.data_[start + i] = src.charAt(i); } @@ -198,10 +213,10 @@ public XMLCharBuffer append(final String src) { /** * Add another buffer to this one. * - * @param src the buffer to copy from + * @param src the buffer to append * @return this instance */ - public XMLCharBuffer append(final XMLCharBuffer src) { + public XMLString append(final XMLString src) { final int start = this.length_; this.length_ = this.length_ + src.length(); ensureCapacity(this.length_); @@ -212,7 +227,7 @@ public XMLCharBuffer append(final XMLCharBuffer src) { } /** - * Add data from a char array to this buffer wit the ability to specify + * Add data from a char array to this buffer with the ability to specify * a range to copy from * * @param src the source char array @@ -221,7 +236,7 @@ public XMLCharBuffer append(final XMLCharBuffer src) { * * @return this instance */ - public XMLCharBuffer append(final char[] src, final int offset, final int length) { + public XMLString append(final char[] src, final int offset, final int length) { final int start = this.length_; this.length_ = start + length; @@ -234,7 +249,8 @@ public XMLCharBuffer append(final char[] src, final int offset, final int length /** * Returns the current length - * @return the length of the buffer data + * + * @return the length of the charbuffer data */ public int length() { return length_; @@ -256,7 +272,7 @@ public int getGrowBy() { * * @return this instance for fluid programming */ - public XMLCharBuffer clear() { + public XMLString clear() { this.length_ = 0; return this; @@ -265,19 +281,20 @@ public XMLCharBuffer clear() { /** * Resets the buffer to 0 length and sets the new data. This * is a little cheaper than clear().append(c) depending on - * the where we are and the inlining. + * the where and the inlining decisions. * * @param c the char to set * @return this instance for fluid programming */ - public XMLCharBuffer clearAndAppend(final char c) { + public XMLString clearAndAppend(final char c) { this.length_ = 0; - if (this.data_.length >= 1) { + if (this.data_.length > 0) { this.data_[this.length_] = c; this.length_++; } else { + // the rare case when we don't have any buffer at hand append(c); } @@ -286,7 +303,8 @@ public XMLCharBuffer clearAndAppend(final char c) { /** * Does this buffer end with this string? If we check for - * the empty string, we get true. + * the empty string, we get true. If we would support JDK 11, we could + * use Arrays.mismatch and be way faster. * * @param s the string to check the end against * @return true of the end matches the buffer, false otherwise @@ -297,8 +315,10 @@ public boolean endsWith(final String s) { return false; } - // check the string by char, avoids a copy of the string + // check the string by each char, avoids a copy of the string final int start = this.length_ - s.length(); + + // change this to Arrays.mismatch when going JDK 11 or higher for (int i = 0; i < s.length(); i++) { if (this.data_[i + start] != s.charAt(i)) { return false; @@ -311,16 +331,34 @@ public boolean endsWith(final String s) { /** * Reduces the buffer to the content between start and end marker when * only whitespaces are found before the startMarker as well as after the end marker. - * If both strings overlap due to indentical characters such as "foo" and "oof" + * If both strings overlap due to identical characters such as "foo" and "oof" + * and the buffer is " foof ", we don't do anything. + * + *

If a marker is empty, it behaves like {@link java.lang.String#trim()} on that side. + * + * @param startMarker the start string to find, must not be null + * @param endMarker the end string to find, must not be null + * @return this instance + * + * @deprecated Use the new method {@link #trimToContent(String, String)} instead. + */ + public XMLString reduceToContent(final String startMarker, final String endMarker) { + return trimToContent(startMarker, endMarker); + } + + /** + * Reduces the buffer to the content between start and end marker when + * only whitespaces are found before the startMarker as well as after the end marker. + * If both strings overlap due to identical characters such as "foo" and "oof" * and the buffer is " foof ", we don't do anything. * - *

If a marker is empty, it behaves like {@link String.trim} on that side. + *

If a marker is empty, it behaves like {@link java.lang.String#trim()} on that side. * * @param startMarker the start string to find, must not be null * @param endMarker the end string to find, must not be null * @return this instance */ - public XMLCharBuffer trimToContent(final String startMarker, final String endMarker) { + public XMLString trimToContent(final String startMarker, final String endMarker) { // if both are longer or same length than content, don't do anything final int markerLength = startMarker.length() + endMarker.length(); if (markerLength >= this.length_) { @@ -380,7 +418,7 @@ public XMLCharBuffer trimToContent(final String startMarker, final String endMar } /** - * Check if we have only whitespace + * Check if we have only whitespaces * * @return true if we have only whitespace, false otherwise */ @@ -394,21 +432,22 @@ public boolean isWhitespace() { } /** - * Trims the string similar to {@link String.trim} - * @return + * Trims the string similar to {@link java.lang.String#trim()} + * + * @return a string with removed whitespace at the beginning and the end */ - public XMLCharBuffer trim() { + public XMLString trim() { // clean the end first, because it is cheap return trimTrailing().trimLeading(); } /** * Removes all whitespace before the first non-whitespace char. - * If all are whitespace, we get an empty buffer + * If all are whitespaces, we get an empty buffer * * @return this instance */ - public XMLCharBuffer trimLeading() { + public XMLString trimLeading() { // run over starting whitespace int sPos = 0; for (; sPos < this.length_; sPos++) { @@ -438,13 +477,26 @@ else if (sPos == this.length_) { return this; } + /** * Removes all whitespace at the end. * If all are whitespace, we get an empty buffer * * @return this instance + * + * @deprecated Use {@link #trimTrailing()} instead. */ - public XMLCharBuffer trimTrailing() { + public XMLString trimWhitespaceAtEnd() { + return trimTrailing(); + } + + /** + * Removes all whitespace at the end. + * If all are whitespace, we get an empty buffer + * + * @return this instance + */ + public XMLString trimTrailing() { // run over ending whitespaces int ePos = this.length_ - 1; for (; ePos >= 0; ePos--) { @@ -468,27 +520,44 @@ public XMLCharBuffer trimTrailing() { * length, we get length = 0 * @return this instance */ - public XMLCharBuffer shortenBy(final int count) { + public XMLString shortenBy(final int count) { final int newLength = this.length_ - count; this.length_ = newLength < 0 ? 0 : newLength; return this; } + /** + * Get the characters as char array, this will be a copy! + * + * @return a copy of the underlying char darta + */ + public char[] getChars() { + return Arrays.copyOf(this.data_, this.length_); + } + /** * Returns a string representation of this buffer. This will be a copy - * operation. + * operation. If the buffer is emoty, we get a constant empty String back + * to avoid any overhead. * * @return a string of the content of this buffer */ @Override public String toString() { - return new String(this.data_, 0, this.length_); + if (this.length_ > 0) { + return new String(this.data_, 0, this.length_); + } + else { + return ""; + } } /** * Returns the char a the given position. Will complain if - * we try to read outside the range + * we try to read outside the range. We do a range check here + * because we might not notice when we are within the buffer + * but outside the current length. * * @param index the position to read from * @return the char at the position @@ -507,18 +576,18 @@ public char charAt(final int index) } /** - * Returns the char a the given position. No checks are + * Returns the char at the given position. No checks are * performed. It is up to the caller to make sure we * read correctly. Reading outside of the array will * cause an {@link IndexOutOfBoundsException} but using an * incorrect position in the array (such as beyond length) - * might stay unnoticed! + * might stay unnoticed! This is a performance method, + * use at your own risk. * * @param index the position to read from * @return the char at the position */ - public char unsafeCharAt(final int index) - { + public char unsafeCharAt(final int index) { return this.data_[index]; } @@ -528,8 +597,8 @@ public char unsafeCharAt(final int index) * @return a copy of this buffer, the capacity might differ */ @Override - public XMLCharBuffer clone() { - return new XMLCharBuffer(this); + public XMLString clone() { + return new XMLString(this); } /** @@ -553,8 +622,7 @@ public XMLCharBuffer clone() { * @return a charsequence of this buffer */ @Override - public CharSequence subSequence(final int start, final int end) - { + public CharSequence subSequence(final int start, final int end) { if (start < 0) { throw new StringIndexOutOfBoundsException(start); } @@ -579,19 +647,19 @@ public CharSequence subSequence(final int start, final int end) * @return true if length and array content match, false otherwise */ @Override - public boolean equals(final Object o) - { - if (o instanceof XMLCharBuffer) { - final XMLCharBuffer ob = (XMLCharBuffer) o; - if (ob.length_ != this.length_ ) { + public boolean equals(final Object o) { + if (o instanceof CharSequence) { + final CharSequence ob = (CharSequence) o; + + if (ob.length() != this.length_ ) { return false; } // ok, in JDK 11 or up, we could use an - // Arrays.mismatch, but we cannot due to - // JDK 8 compatibility + // Arrays.mismatch, but we cannot do that + // due to JDK 8 compatibility for (int i = 0; i < this.length_; i++) { - if (ob.data_[i] != this.data_[i]) { + if (ob.charAt(i) != this.data_[i]) { return false; } } @@ -602,4 +670,65 @@ public boolean equals(final Object o) return false; } + + /** + * We don't cache the hashcode because we mutate often. Don't use this in + * hashmaps as key. But you can use that to look up in a hashmap against + * a string using the CharSequence interface. + * + * @return the hashcode, similar to what a normal string would deliver + */ + @Override + public int hashCode() { + int h = 0; + + for (int i = 0; i < this.length_; i++) { + h = ((h << 5) - h) + this.data_[i]; + } + + return h; + } + + /** + * Append a character to an XMLCharBuffer. The character is an int value, and + * can either be a single UTF-16 character or a supplementary character + * represented by two UTF-16 code points. + * + * @param value The character value. + * @return this instance for fluid programming + * + * @throws IllegalArgumentException if the specified + * {@code codePoint} is not a valid Unicode code point. + */ + public XMLString appendCodePoint(final int value) { + if (value <= Character.MAX_VALUE) { + return this.append((char) value); + } + else { + try { + final char[] chars = Character.toChars(value); + return this.append(chars, 0, chars.length); + } + catch (final IllegalArgumentException e) { + // when value is not valid as UTF-16 + this.append(REPLACEMENT_CHARACTER); + throw e; + } + } + } + + // this stuff is here for performance reasons to avoid a copy + // it has been taken from the old XMLString and because there was no JavaDoc + // we still don't have any, legacy code + public void characters(final ContentHandler contentHandler) throws SAXException { + contentHandler.characters(this.data_, 0, length_); + } + + public void ignorableWhitespace(final ContentHandler contentHandler) throws SAXException { + contentHandler.ignorableWhitespace(this.data_, 0, length_); + } + + public void comment(final LexicalHandler lexicalHandler) throws SAXException { + lexicalHandler.comment(this.data_, 0, length_); + } } diff --git a/src/test/java/org/htmlunit/cyberneko/Writer.java b/src/test/java/org/htmlunit/cyberneko/Writer.java index a6317640..e411263b 100644 --- a/src/test/java/org/htmlunit/cyberneko/Writer.java +++ b/src/test/java/org/htmlunit/cyberneko/Writer.java @@ -25,8 +25,8 @@ import org.htmlunit.cyberneko.xerces.xni.NamespaceContext; import org.htmlunit.cyberneko.xerces.xni.QName; import org.htmlunit.cyberneko.xerces.xni.XMLAttributes; -import org.htmlunit.cyberneko.xerces.xni.XMLLocator; import org.htmlunit.cyberneko.xerces.xni.XMLString; +import org.htmlunit.cyberneko.xerces.xni.XMLLocator; import org.htmlunit.cyberneko.xerces.xni.XNIException; /** diff --git a/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringLegacyTest.java b/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringLegacyTest.java index 6354a5fb..15245961 100644 --- a/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringLegacyTest.java +++ b/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringLegacyTest.java @@ -19,10 +19,13 @@ import org.junit.jupiter.api.Test; /** - * Unit tests for {@link XMLString}. + * Unit tests for {@link XMLString}. These tests are here to ensure + * compatibility with the old XMLString implementation before version + * 3.10.0 + * * @author Ronald Brill */ -public class XMLStringTest { +public class XMLStringLegacyTest { @Test public void reduceToContent() { diff --git a/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringTest.java b/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringTest.java index 581fc60e..2b3c991d 100644 --- a/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringTest.java +++ b/src/test/java/org/htmlunit/cyberneko/xerces/xni/XMLStringTest.java @@ -15,6 +15,7 @@ */ package org.htmlunit.cyberneko.xerces.xni; +import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertThrows; @@ -25,11 +26,13 @@ import org.junit.jupiter.api.Test; /** - * Unit tests for {@link XMLCharBuffer}. + * Unit tests for the new {@link XMLString} which is technically a + * CharBuffer. + * * @author Ronald Brill - * @author René Schwietzke + * @author René Schwietzke */ -public class XMLCharBufferTest { +public class XMLStringTest { public static final String CHAR5 = "ABCDE"; public static final String CHAR10 = "ABCDEFGHIJ"; public static final String CHAR15 = "ABCDEFGHIJKLMNO"; @@ -38,9 +41,9 @@ public class XMLCharBufferTest { @Test public void ctrEmpty() { - final XMLCharBuffer b = new XMLCharBuffer(); + final XMLString b = new XMLString(); assertEquals(0, b.length()); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, b.capacity()); assertEquals("", b.toString()); } @@ -48,18 +51,18 @@ public void ctrEmpty() { public void ctr_int() { // standard { - final XMLCharBuffer b = new XMLCharBuffer(42); + final XMLString b = new XMLString(42); assertEquals(0, b.length()); assertEquals(42, b.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, b.getGrowBy()); + assertEquals(XMLString.CAPACITY_GROWTH, b.getGrowBy()); assertEquals("", b.toString()); } // 0 { - final XMLCharBuffer b = new XMLCharBuffer(0); + final XMLString b = new XMLString(0); assertEquals(0, b.length()); assertEquals(0, b.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, b.getGrowBy()); + assertEquals(XMLString.CAPACITY_GROWTH, b.getGrowBy()); assertEquals("", b.toString()); } } @@ -68,7 +71,7 @@ public void ctr_int() { public void ctr_int_int() { // standard { - final XMLCharBuffer b = new XMLCharBuffer(42, 11); + final XMLString b = new XMLString(42, 11); assertEquals(0, b.length()); assertEquals(42, b.capacity()); assertEquals(11, b.getGrowBy()); @@ -76,7 +79,7 @@ public void ctr_int_int() { } // zero is silently ignored { - final XMLCharBuffer b = new XMLCharBuffer(42, 0); + final XMLString b = new XMLString(42, 0); assertEquals(0, b.length()); assertEquals(42, b.capacity()); assertEquals(1, b.getGrowBy()); @@ -84,7 +87,7 @@ public void ctr_int_int() { } // 0 size is possible { - final XMLCharBuffer b = new XMLCharBuffer(0, 3); + final XMLString b = new XMLString(0, 3); assertEquals(0, b.length()); assertEquals(0, b.capacity()); assertEquals(3, b.getGrowBy()); @@ -96,19 +99,19 @@ public void ctr_int_int() { public void ctr_Buffer() { // standard { - final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer(CHAR25)); + final XMLString a = new XMLString(new XMLString(CHAR25)); assertEquals(CHAR25, a.toString()); assertEquals(25, a.length()); assertEquals(25, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + assertEquals(XMLString.CAPACITY_GROWTH, a.getGrowBy()); } // empty { - final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer()); + final XMLString a = new XMLString(new XMLString()); assertEquals("", a.toString()); assertEquals(0, a.length()); assertEquals(0, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + assertEquals(XMLString.CAPACITY_GROWTH, a.getGrowBy()); } } @@ -116,19 +119,19 @@ public void ctr_Buffer() { public void ctr_xmlcharuffer_int() { // standard { - final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer("foo"), 11); + final XMLString a = new XMLString(new XMLString("foo"), 11); assertEquals("foo", a.toString()); assertEquals(3, a.length()); assertEquals(14, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + assertEquals(XMLString.CAPACITY_GROWTH, a.getGrowBy()); } // empty { - final XMLCharBuffer a = new XMLCharBuffer(new XMLCharBuffer(), 5); + final XMLString a = new XMLString(new XMLString(), 5); assertEquals("", a.toString()); assertEquals(0, a.length()); assertEquals(5, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + assertEquals(XMLString.CAPACITY_GROWTH, a.getGrowBy()); } } @@ -136,19 +139,19 @@ public void ctr_xmlcharuffer_int() { public void ctr_string() { // empty { - final XMLCharBuffer a = new XMLCharBuffer("".toString()); + final XMLString a = new XMLString("".toString()); assertEquals("", a.toString()); assertEquals(0, a.length()); assertEquals(0, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + assertEquals(XMLString.CAPACITY_GROWTH, a.getGrowBy()); } // standard { - final XMLCharBuffer a = new XMLCharBuffer("1234".toString()); + final XMLString a = new XMLString("1234".toString()); assertEquals("1234", a.toString()); assertEquals(4, a.length()); assertEquals(4, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + assertEquals(XMLString.CAPACITY_GROWTH, a.getGrowBy()); } } @@ -157,27 +160,27 @@ public void ctr_string() { public void ctr_char_int_int() { // empty { - final XMLCharBuffer a = new XMLCharBuffer("".toCharArray(), 0, 0); + final XMLString a = new XMLString("".toCharArray(), 0, 0); assertEquals("", a.toString()); assertEquals(0, a.length()); assertEquals(0, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + assertEquals(XMLString.CAPACITY_GROWTH, a.getGrowBy()); } // standard { - final XMLCharBuffer a = new XMLCharBuffer("foo".toCharArray(), 0, 3); + final XMLString a = new XMLString("foo".toCharArray(), 0, 3); assertEquals("foo", a.toString()); assertEquals(3, a.length()); assertEquals(3, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + assertEquals(XMLString.CAPACITY_GROWTH, a.getGrowBy()); } // standard { - final XMLCharBuffer a = new XMLCharBuffer("foobar2".toCharArray(), 3, 3); + final XMLString a = new XMLString("foobar2".toCharArray(), 3, 3); assertEquals("bar", a.toString()); assertEquals(3, a.length()); assertEquals(3, a.capacity()); - assertEquals(XMLCharBuffer.CAPACITY_GROWTH, a.getGrowBy()); + assertEquals(XMLString.CAPACITY_GROWTH, a.getGrowBy()); } } @@ -186,12 +189,12 @@ public void ctr_char_int_int() { */ @Test public void toStringTest() { - assertEquals("", new XMLCharBuffer().toString()); - assertEquals("", new XMLCharBuffer(10).toString()); - assertEquals("foo", new XMLCharBuffer("foobar".toCharArray(), 0, 3).toString()); - assertEquals("foobar", new XMLCharBuffer("foobar".toCharArray(), 0, 6).toString()); + assertEquals("", new XMLString().toString()); + assertEquals("", new XMLString(10).toString()); + assertEquals("foo", new XMLString("foobar".toCharArray(), 0, 3).toString()); + assertEquals("foobar", new XMLString("foobar".toCharArray(), 0, 6).toString()); - final XMLCharBuffer b1 = new XMLCharBuffer(); + final XMLString b1 = new XMLString(); b1.append("foo"); assertEquals("foo", b1.toString()); b1.clear().append("bar"); @@ -206,38 +209,48 @@ public void toStringTest() { */ @Test public void length() { - assertEquals(0, new XMLCharBuffer().length()); - assertEquals(0, new XMLCharBuffer(10).length()); + assertEquals(0, new XMLString().length()); + assertEquals(0, new XMLString(10).length()); - assertEquals(1, new XMLCharBuffer().append('f').length()); + assertEquals(1, new XMLString().append('f').length()); } @Test public void capacity() { - assertEquals(20, new XMLCharBuffer().capacity()); - assertEquals(20, new XMLCharBuffer().append('f').capacity()); + assertEquals(20, new XMLString().capacity()); + assertEquals(20, new XMLString().append('f').capacity()); // let's grow and see - assertEquals(20, new XMLCharBuffer().append("01234567890123456789").capacity()); + assertEquals(20, new XMLString().append("01234567890123456789").capacity()); } @Test public void append_char_new() { - final XMLCharBuffer b = new XMLCharBuffer(); + final XMLString b = new XMLString(5); assertEquals(0, b.length()); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + assertEquals(5, b.capacity()); b.append('a'); assertEquals(1, b.length()); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + assertEquals(5, b.capacity()); assertEquals("a", b.toString()); b.append('b'); + assertEquals(2, b.length()); + assertEquals(5, b.capacity()); + b.append('c'); + assertEquals(3, b.length()); + assertEquals(5, b.capacity()); + b.append('d'); + assertEquals(4, b.length()); + assertEquals(5, b.capacity()); + b.append('e'); assertEquals(5, b.length()); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, b.capacity()); + assertEquals(5, b.capacity()); + assertEquals("abcde", b.toString()); // our source of correctness @@ -255,34 +268,33 @@ public void append_char_new() { @Test public void append_charbuffer_new() { - final XMLCharBuffer c0 = new XMLCharBuffer(); - final XMLCharBuffer c5 = new XMLCharBuffer("01234"); - final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); + final XMLString c0 = new XMLString(); + final XMLString c5 = new XMLString("01234"); // empty { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append(c0); assertEquals("", a.toString()); assertEquals(0, a.length()); } // self empty { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append(a); assertEquals("", a.toString()); assertEquals(0, a.length()); } // standard { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append(c5); assertEquals(c5.toString(), a.toString()); assertEquals(5, a.length()); } // self standard { - final XMLCharBuffer a = new XMLCharBuffer("ABCDE"); + final XMLString a = new XMLString("ABCDE"); a.append(a); assertEquals("ABCDEABCDE", a.toString()); assertEquals(10, a.length()); @@ -292,37 +304,45 @@ public void append_charbuffer_new() { @Test public void append_charbuffer_noResize() { - final XMLCharBuffer c0 = new XMLCharBuffer(); - final XMLCharBuffer c5 = new XMLCharBuffer("01234"); - final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); + final XMLString c0 = new XMLString(); + final XMLString c5 = new XMLString("01234"); { - final XMLCharBuffer a = new XMLCharBuffer("012"); + // we start sized for the data we got + final XMLString a = new XMLString(); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); + a.append("ABC"); + assertEquals("ABC", a.toString()); + + // no data, no change a.append(c0); - assertEquals(3, a.capacity()); - assertEquals("012", a.toString()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); + assertEquals("ABC", a.toString()); + + // we add 5 chars, should grow once for the current + // growth a.append(c5); - assertEquals("01201234", a.toString()); - assertEquals(18, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); + assertEquals("ABC01234", a.toString()); assertEquals(8, a.length()); } } @Test public void append_charbuffer_resize() { - final XMLCharBuffer c0 = new XMLCharBuffer(); - final XMLCharBuffer c5 = new XMLCharBuffer("a-b-c"); - final XMLCharBuffer c25 = new XMLCharBuffer(CHAR25); + final XMLString c5 = new XMLString("a-b-c"); + final XMLString c25 = new XMLString(CHAR25); { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append(c5); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); assertEquals("a-b-c", a.toString()); assertEquals(5, a.length()); + assertEquals(20, a.capacity()); a.append(c25); assertEquals("a-b-c" + CHAR25, a.toString()); - assertEquals(40, a.capacity()); +// assertEquals(52, a.capacity()); assertEquals(30, a.length()); } } @@ -331,40 +351,40 @@ public void append_charbuffer_resize() { public void append_string() { // new, no resize { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append(CHAR5); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); assertEquals(CHAR5, a.toString()); assertEquals(5, a.length()); } // new, resize at once { - final XMLCharBuffer a = new XMLCharBuffer(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + final XMLString a = new XMLString(); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); a.append(CHAR5 + CHAR25); - assertEquals(40, a.capacity()); +// assertEquals(52, a.capacity()); assertEquals(CHAR5 + CHAR25, a.toString()); assertEquals(30, a.length()); } // resize later { - final XMLCharBuffer a = new XMLCharBuffer(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + final XMLString a = new XMLString(); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); a.append(CHAR5); a.append(CHAR25); - assertEquals(40, a.capacity()); +// assertEquals(52, a.capacity()); assertEquals(CHAR5 + CHAR25, a.toString()); assertEquals(30, a.length()); } // empty string { - final XMLCharBuffer a = new XMLCharBuffer(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + final XMLString a = new XMLString(); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); a.append(""); a.append(""); a.append(CHAR25); a.append(""); - assertEquals(35, a.capacity()); +// assertEquals(52, a.capacity()); assertEquals(CHAR25, a.toString()); assertEquals(25, a.length()); } @@ -374,37 +394,45 @@ public void append_string() { public void append_char_int_int_new() { // empty { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append("ABC-DEF-GHU".toCharArray(), 0, 0); assertEquals("", a.toString()); assertEquals(0, a.length()); } // standard { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append("ABC-DEF-GHU".toCharArray(), 0, 11); assertEquals("ABC-DEF-GHU", a.toString()); assertEquals(11, a.length()); } // standard { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append("ABC-DEF-GHU".toCharArray(), 1, 10); assertEquals("BC-DEF-GHU", a.toString()); assertEquals(10, a.length()); } // requires growth { - final XMLCharBuffer a = new XMLCharBuffer(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + final XMLString a = new XMLString(); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); a.append(CHAR25.toCharArray(), 0, 25); - assertEquals(35, a.capacity()); - assertEquals(CHAR25, a.toString()); - assertEquals(25, a.length()); +// assertEquals(52, a.capacity()); + + a.append(CHAR25.toCharArray(), 0, 25); +// assertEquals(52, a.capacity()); // still fits + assertEquals(CHAR25 + CHAR25, a.toString()); + assertEquals(50, a.length()); + + a.append(CHAR25.toCharArray(), 0, 5); +// assertEquals(84, a.capacity()); // still fits + assertEquals(CHAR25 + CHAR25 + CHAR5, a.toString()); + assertEquals(55, a.length()); } // append several times { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append("abc".toCharArray(), 0, 3); a.append("1234".toCharArray(), 0, 4); a.append("".toCharArray(), 0, 0); @@ -418,11 +446,11 @@ public void append_char_int_int_new() { @Test public void charAt() { { - final XMLCharBuffer a = new XMLCharBuffer("a"); + final XMLString a = new XMLString("a"); assertEquals('a', a.charAt(0)); } { - final XMLCharBuffer a = new XMLCharBuffer("abc"); + final XMLString a = new XMLString("abc"); assertEquals('a', a.charAt(0)); assertEquals('b', a.charAt(1)); assertEquals('c', a.charAt(2)); @@ -432,22 +460,20 @@ public void charAt() { @Test public void charAt_Errors() { // empty - final XMLCharBuffer a1 = new XMLCharBuffer(); + final XMLString a1 = new XMLString(); assertThrows(IndexOutOfBoundsException.class, () -> { a1.charAt(0); }); - final XMLCharBuffer a2 = new XMLCharBuffer(""); + final XMLString a2 = new XMLString(""); assertThrows(IndexOutOfBoundsException.class, () -> { a2.charAt(0); }); - final XMLCharBuffer b = new XMLCharBuffer("foo"); + final XMLString b = new XMLString("foo"); assertThrows(IndexOutOfBoundsException.class, () -> { b.charAt(-1); }); - - final XMLCharBuffer c = new XMLCharBuffer("foo"); assertThrows(IndexOutOfBoundsException.class, () -> { b.charAt(3); }); @@ -459,11 +485,11 @@ public void charAt_Errors() { @Test public void unsafeCharAt() { { - final XMLCharBuffer a = new XMLCharBuffer("a"); + final XMLString a = new XMLString("a"); assertEquals('a', a.unsafeCharAt(0)); } { - final XMLCharBuffer a = new XMLCharBuffer("abc"); + final XMLString a = new XMLString("abc"); assertEquals('a', a.unsafeCharAt(0)); assertEquals('b', a.unsafeCharAt(1)); assertEquals('c', a.unsafeCharAt(2)); @@ -473,79 +499,79 @@ public void unsafeCharAt() { @Test public void unsafeCharAt_Errors() { // empty - final XMLCharBuffer a1 = new XMLCharBuffer(); + final XMLString a1 = new XMLString(); // can read any garbage a1.unsafeCharAt(0); // cannot read outside the array of course assertThrows(IndexOutOfBoundsException.class, () -> { - a1.unsafeCharAt(XMLCharBuffer.INITIAL_CAPACITY); + a1.unsafeCharAt(XMLString.INITIAL_CAPACITY); }); } @Test public void endsWidth() { // no size match, string to large - assertFalse(new XMLCharBuffer("foo").endsWith("foobar")); + assertFalse(new XMLString("foo").endsWith("foobar")); // empty string - assertTrue(new XMLCharBuffer("foobar").endsWith("")); + assertTrue(new XMLString("foobar").endsWith("")); // both empty - assertTrue(new XMLCharBuffer("").endsWith("")); + assertTrue(new XMLString("").endsWith("")); // both are the same size and don't match - assertFalse(new XMLCharBuffer("foo").endsWith("bar")); + assertFalse(new XMLString("foo").endsWith("bar")); // both are the same size and match - assertTrue(new XMLCharBuffer("foo").endsWith("foo")); + assertTrue(new XMLString("foo").endsWith("foo")); // first char mismatch - assertFalse(new XMLCharBuffer("foobar").endsWith("car")); + assertFalse(new XMLString("foobar").endsWith("car")); // last char mismatch - assertFalse(new XMLCharBuffer("foobar").endsWith("baa")); + assertFalse(new XMLString("foobar").endsWith("baa")); // full match - assertTrue(new XMLCharBuffer("foobar").endsWith("bar")); + assertTrue(new XMLString("foobar").endsWith("bar")); } @Test public void clear() { // empty { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.clear(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); assertEquals("", a.toString()); assertEquals(0, a.length()); } // some stuff in it { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append(CHAR5); a.clear(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); assertEquals("", a.toString()); assertEquals(0, a.length()); } // repeated clear { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append(CHAR5); a.clear(); a.clear(); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); assertEquals("", a.toString()); assertEquals(0, a.length()); } // clear append { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append(CHAR5); a.clear(); a.append(CHAR5); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); assertEquals(CHAR5, a.toString()); assertEquals(5, a.length()); } @@ -555,46 +581,46 @@ public void clear() { public void clearAndAppend() { // empty { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.clearAndAppend('a'); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); assertEquals("a", a.toString()); assertEquals(1, a.length()); } // some stuff in it { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append(CHAR5); a.clearAndAppend('a'); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); assertEquals("a", a.toString()); assertEquals(1, a.length()); } // repeated clear { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append(CHAR5); a.clearAndAppend('a'); a.clearAndAppend('a'); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); assertEquals("a", a.toString()); assertEquals(1, a.length()); } // clear append { - final XMLCharBuffer a = new XMLCharBuffer(); + final XMLString a = new XMLString(); a.append(CHAR5); a.clearAndAppend('a'); a.append(CHAR5); - assertEquals(XMLCharBuffer.INITIAL_CAPACITY, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); assertEquals("a" + CHAR5, a.toString()); assertEquals(6, a.length()); } // clear append on total empty { - final XMLCharBuffer a = new XMLCharBuffer(""); + final XMLString a = new XMLString(); a.clearAndAppend('a'); - assertEquals(11, a.capacity()); + assertEquals(XMLString.INITIAL_CAPACITY, a.capacity()); assertEquals("a", a.toString()); assertEquals(1, a.length()); } @@ -602,7 +628,7 @@ public void clearAndAppend() { @Test public void reduceToContent() { - final XMLCharBuffer x = new XMLCharBuffer(); + final XMLString x = new XMLString(); // buffer shorter than markers x.clear().append("foo"); @@ -730,7 +756,7 @@ public void reduceToContent() { @Test public void trimLeading() { - final XMLCharBuffer xmlString = new XMLCharBuffer(); + final XMLString xmlString = new XMLString(); xmlString.clear().append(""); xmlString.trimLeading(); @@ -771,7 +797,7 @@ public void trimLeading() { @Test public void trimTrailing() { - final XMLCharBuffer xmlString = new XMLCharBuffer(); + final XMLString xmlString = new XMLString(); xmlString.clear().append(""); xmlString.trimTrailing(); @@ -808,7 +834,7 @@ public void trimTrailing() { @Test public void trim() { - final XMLCharBuffer xmlString = new XMLCharBuffer(); + final XMLString xmlString = new XMLString(); xmlString.clear().append(""); xmlString.trim(); @@ -851,35 +877,35 @@ public void trim() { public void shortenBy() { // shorten empty { - final XMLCharBuffer a = new XMLCharBuffer(""); + final XMLString a = new XMLString(""); a.shortenBy(12); assertEquals(0, a.length()); assertEquals("", a.toString()); } // shorten by 0 { - final XMLCharBuffer a = new XMLCharBuffer("ab"); + final XMLString a = new XMLString("ab"); a.shortenBy(0); assertEquals(2, a.length()); assertEquals("ab", a.toString()); } // shorten by larger { - final XMLCharBuffer a = new XMLCharBuffer("ab"); + final XMLString a = new XMLString("ab"); a.shortenBy(4); assertEquals(0, a.length()); assertEquals("", a.toString()); } // shorten standard { - final XMLCharBuffer a = new XMLCharBuffer("abcd"); + final XMLString a = new XMLString("abcd"); a.shortenBy(1); assertEquals(3, a.length()); assertEquals("abc", a.toString()); } // shorten standard { - final XMLCharBuffer a = new XMLCharBuffer("abcd123"); + final XMLString a = new XMLString("abcd123"); a.shortenBy(3); assertEquals(4, a.length()); assertEquals("abcd", a.toString()); @@ -889,24 +915,24 @@ public void shortenBy() { @Test public void cloneTest() { { - final XMLCharBuffer o = new XMLCharBuffer(""); - final XMLCharBuffer a = o.clone(); + final XMLString o = new XMLString(""); + final XMLString a = o.clone(); assertEquals(0, a.length()); assertEquals("", a.toString()); assertTrue(o != a); } { - final XMLCharBuffer o = new XMLCharBuffer("abc"); - final XMLCharBuffer a = o.clone(); + final XMLString o = new XMLString("abc"); + final XMLString a = o.clone(); assertEquals(3, a.length()); assertEquals("abc", a.toString()); assertTrue(o != a); } { - final XMLCharBuffer o = new XMLCharBuffer(" 817 "); - final XMLCharBuffer a = o.clone(); - final XMLCharBuffer b = a.clone(); - final XMLCharBuffer c = b.clone(); + final XMLString o = new XMLString(" 817 "); + final XMLString a = o.clone(); + final XMLString b = a.clone(); + final XMLString c = b.clone(); assertEquals(5, c.length()); assertEquals(" 817 ", c.toString()); assertTrue(o != c); @@ -916,32 +942,32 @@ public void cloneTest() { @Test public void subSequence() { { - final CharSequence o = new XMLCharBuffer("").subSequence(0, 0); + final CharSequence o = new XMLString("").subSequence(0, 0); assertEquals(0, o.length()); assertEquals("", o.toString()); } { - final CharSequence o = new XMLCharBuffer("a").subSequence(0, 1); + final CharSequence o = new XMLString("a").subSequence(0, 1); assertEquals(1, o.length()); assertEquals("a", o.toString()); } { - final CharSequence o = new XMLCharBuffer("abc").subSequence(0, 3); + final CharSequence o = new XMLString("abc").subSequence(0, 3); assertEquals(3, o.length()); assertEquals("abc", o.toString()); } { - final CharSequence o = new XMLCharBuffer("abc").subSequence(1, 3); + final CharSequence o = new XMLString("abc").subSequence(1, 3); assertEquals(2, o.length()); assertEquals("bc", o.toString()); } { - final CharSequence o = new XMLCharBuffer("abc").subSequence(0, 2); + final CharSequence o = new XMLString("abc").subSequence(0, 2); assertEquals(2, o.length()); assertEquals("ab", o.toString()); } { - final CharSequence o = new XMLCharBuffer("abc").subSequence(1, 2); + final CharSequence o = new XMLString("abc").subSequence(1, 2); assertEquals(1, o.length()); assertEquals("b", o.toString()); } @@ -950,7 +976,7 @@ public void subSequence() { @Test public void subSequenceErrors() { { - final CharSequence o = new XMLCharBuffer(""); + final CharSequence o = new XMLString(""); assertThrows(IndexOutOfBoundsException.class, () -> { o.subSequence(-1, 2); }); @@ -959,7 +985,7 @@ public void subSequenceErrors() { }); } { - final CharSequence o = new XMLCharBuffer("12345"); + final CharSequence o = new XMLString("12345"); assertThrows(IndexOutOfBoundsException.class, () -> { o.subSequence(-2, 3); }); @@ -976,64 +1002,79 @@ public void subSequenceErrors() { public void equalsTest() { // different types { - final String a = new String(); - final XMLCharBuffer b = new XMLCharBuffer(); + final Integer a = Integer.valueOf(192); + final XMLString b = new XMLString(); assertFalse(a.equals(b)); assertFalse(b.equals(a)); } // both empty { - final XMLCharBuffer a = new XMLCharBuffer(); - final XMLCharBuffer b = new XMLCharBuffer(); + final XMLString a = new XMLString(); + final XMLString b = new XMLString(); assertTrue(a.equals(b)); assertTrue(b.equals(a)); } // self { - final XMLCharBuffer a = new XMLCharBuffer(); - final XMLCharBuffer b = new XMLCharBuffer("abc"); + final XMLString a = new XMLString(); + final XMLString b = new XMLString("abc"); assertTrue(a.equals(a)); assertTrue(b.equals(b)); } // different length { - final XMLCharBuffer a = new XMLCharBuffer("a"); - final XMLCharBuffer b = new XMLCharBuffer("ab"); + final XMLString a = new XMLString("a"); + final XMLString b = new XMLString("ab"); assertFalse(a.equals(b)); assertFalse(b.equals(a)); } // different content, same length { - final XMLCharBuffer a = new XMLCharBuffer("ac"); - final XMLCharBuffer b = new XMLCharBuffer("ab"); + final XMLString a = new XMLString("ac"); + final XMLString b = new XMLString("ab"); assertFalse(a.equals(b)); assertFalse(b.equals(a)); } // length 1, identical { - final XMLCharBuffer a = new XMLCharBuffer("a"); - final XMLCharBuffer b = new XMLCharBuffer("a"); + final XMLString a = new XMLString("a"); + final XMLString b = new XMLString("a"); assertTrue(a.equals(b)); assertTrue(b.equals(a)); } // length 1, different { - final XMLCharBuffer a = new XMLCharBuffer("b"); - final XMLCharBuffer b = new XMLCharBuffer("b"); + final XMLString a = new XMLString("b"); + final XMLString b = new XMLString("b"); assertTrue(a.equals(b)); assertTrue(b.equals(a)); } // length > 1, same { - final XMLCharBuffer a = new XMLCharBuffer("81hal/&%$"); - final XMLCharBuffer b = new XMLCharBuffer("81hal/&%$"); + final XMLString a = new XMLString("81hal/&%$"); + final XMLString b = new XMLString("81hal/&%$"); assertTrue(a.equals(b)); assertTrue(b.equals(a)); } // length > 1, different { - final XMLCharBuffer a = new XMLCharBuffer("b091872983"); - final XMLCharBuffer b = new XMLCharBuffer("b09187298_"); + final XMLString a = new XMLString("b091872983"); + final XMLString b = new XMLString("b09187298_"); + assertFalse(a.equals(b)); + assertFalse(b.equals(a)); + } + + // CharSequence works too + { + final String a = new String("b091872983"); + final XMLString b = new XMLString("b091872983"); + assertFalse(a.equals(b)); // a string is not so open :) + assertTrue(b.equals(a)); + } + // CharSequence works too + { + final String a = new String("983"); + final XMLString b = new XMLString("b09187298_"); assertFalse(a.equals(b)); assertFalse(b.equals(a)); } @@ -1042,24 +1083,87 @@ public void equalsTest() { @Test public void isWhitespace() { { - final XMLCharBuffer a = new XMLCharBuffer(""); + final XMLString a = new XMLString(""); assertTrue(a.isWhitespace()); } { - final XMLCharBuffer a = new XMLCharBuffer(" "); + final XMLString a = new XMLString(" "); assertTrue(a.isWhitespace()); } { - final XMLCharBuffer a = new XMLCharBuffer("a"); + final XMLString a = new XMLString("a"); assertFalse(a.isWhitespace()); } { - final XMLCharBuffer a = new XMLCharBuffer(" a\t \n"); + final XMLString a = new XMLString(" a\t \n"); assertFalse(a.isWhitespace()); } { - final XMLCharBuffer a = new XMLCharBuffer(" \t \n"); + final XMLString a = new XMLString(" \t \n"); assertTrue(a.isWhitespace()); } } -} + + @Test + public void getChars() { + // empty + { + final XMLString a = new XMLString(""); + assertArrayEquals(new char[0], a.getChars()); + } + // normal + { + final XMLString a = new XMLString("abc"); + assertArrayEquals("abc".toCharArray(), a.getChars()); + } + // grown + { + final XMLString a = new XMLString("abc"); + a.append(CHAR25); + assertArrayEquals(("abc" + CHAR25).toCharArray(), a.getChars()); + } + } + + @Test + public void hashCodeTest() { + // empty + { + final XMLString a = new XMLString(); + assertEquals("".hashCode(), a.hashCode()); + } + // mutate + { + final XMLString a = new XMLString(); + assertEquals("".hashCode(), a.hashCode()); + a.append('a'); + assertEquals("a".hashCode(), a.hashCode()); + a.append("bc"); + assertEquals("abc".hashCode(), a.hashCode()); + } + } + + @Test + public void appendCodePoint() { + // regular code point + { + final XMLString a = new XMLString(); + a.appendCodePoint('a'); + assertEquals(1, a.length()); + assertEquals("a", a.toString()); + } + // two char code point + { + final XMLString a = new XMLString(); + a.appendCodePoint(0x30CA); + assertEquals(1, a.length()); + assertEquals("ナ", a.toString()); + } + // invalid code point + { + assertThrows(IllegalArgumentException.class, () -> { + final XMLString a = new XMLString(); + a.appendCodePoint(0x10FFFF + 42); + }); + } + } + } From d3b5b8d9c2af66ba4ce7f9862240ae0e2a1cf94c Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:09:13 +0100 Subject: [PATCH 07/18] Added proper header --- .../htmlunit/cyberneko/util/MiniStackTest.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/test/java/org/htmlunit/cyberneko/util/MiniStackTest.java b/src/test/java/org/htmlunit/cyberneko/util/MiniStackTest.java index 4f95be2f..657a606c 100644 --- a/src/test/java/org/htmlunit/cyberneko/util/MiniStackTest.java +++ b/src/test/java/org/htmlunit/cyberneko/util/MiniStackTest.java @@ -1,3 +1,18 @@ +/* + * Copyright 2017-2023 Ronald Brill + * Copyright 2023 René Schwietzke + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.htmlunit.cyberneko.util; import static org.junit.jupiter.api.Assertions.assertEquals; From 73db9045daabe279d5c5262e637be16e03039436 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:10:22 +0100 Subject: [PATCH 08/18] Simpler map implementation with less memory indirection and overhead, better for inlining. --- .../htmlunit/cyberneko/util/FastHashMap.java | 311 +++++++++++++++ .../cyberneko/util/FastHashMapTest.java | 357 ++++++++++++++++++ 2 files changed, 668 insertions(+) create mode 100644 src/main/java/org/htmlunit/cyberneko/util/FastHashMap.java create mode 100644 src/test/java/org/htmlunit/cyberneko/util/FastHashMapTest.java diff --git a/src/main/java/org/htmlunit/cyberneko/util/FastHashMap.java b/src/main/java/org/htmlunit/cyberneko/util/FastHashMap.java new file mode 100644 index 00000000..71ef885e --- /dev/null +++ b/src/main/java/org/htmlunit/cyberneko/util/FastHashMap.java @@ -0,0 +1,311 @@ +/* + * Copyright (c) 2005-2023 Xceptance Software Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.htmlunit.cyberneko.util; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +/** + * Simple hash map implementation taken from here + * https://github.com/mikvor/hashmapTest/blob/master/src/main/java/map/objobj/ObjObjMap.java + * No concrete license specified at the source. The project is public domain. + * + * Not thread-safe! + * + * Null support was removed. + * + * @since 3.10.0 + */ +public class FastHashMap +{ + private static final Object FREE_KEY = new Object(); + private static final Object REMOVED_KEY = new Object(); + + /** Keys and values */ + private Object[] m_data; + + /** Fill factor, must be between (0 and 1) */ + private final float m_fillFactor; + /** We will resize a map once it reaches this size */ + private int m_threshold; + /** Current map size */ + private int m_size; + /** Mask to calculate the original position */ + private int m_mask; + /** Mask to wrap the actual array pointer */ + private int m_mask2; + + public FastHashMap() + { + this(13, 0.5f); + } + + public FastHashMap( final int size, final float fillFactor ) + { + if ( fillFactor <= 0 || fillFactor >= 1 ) + throw new IllegalArgumentException( "FillFactor must be in (0, 1)" ); + if ( size <= 0 ) + throw new IllegalArgumentException( "Size must be positive!" ); + final int capacity = arraySize(size, fillFactor); + m_mask = capacity - 1; + m_mask2 = capacity * 2 - 1; + m_fillFactor = fillFactor; + + m_data = new Object[capacity * 2]; + Arrays.fill( m_data, FREE_KEY ); + + m_threshold = (int) (capacity * fillFactor); + } + + public V get( final K key ) + { + int ptr = (key.hashCode() & m_mask) << 1; + Object k = m_data[ ptr ]; + + if ( k == FREE_KEY ) + return null; //end of chain already + + if ( k.hashCode() == key.hashCode() && k.equals( key ) ) //we check FREE and REMOVED prior to this call + { + return (V) m_data[ ptr + 1 ]; + } + + while ( true ) + { + ptr = (ptr + 2) & m_mask2; //that's next index + k = m_data[ ptr ]; + if ( k == FREE_KEY ) + { + return null; + } + if ( k.hashCode() == key.hashCode() && k.equals( key ) ) + { + return (V) m_data[ ptr + 1 ]; + } + } + } + + public V put( final K key, final V value ) + { + int ptr = getStartIndex(key) << 1; + Object k = m_data[ptr]; + + if ( k == FREE_KEY ) //end of chain already + { + m_data[ ptr ] = key; + m_data[ ptr + 1 ] = value; + if ( m_size >= m_threshold ) + rehash( m_data.length * 2 ); //size is set inside + else + ++m_size; + return null; + } + else if ( k.equals( key ) ) //we check FREE and REMOVED prior to this call + { + final Object ret = m_data[ ptr + 1 ]; + m_data[ ptr + 1 ] = value; + return (V) ret; + } + + int firstRemoved = -1; + if ( k == REMOVED_KEY ) + firstRemoved = ptr; //we may find a key later + + while ( true ) + { + ptr = ( ptr + 2 ) & m_mask2; //that's next index calculation + k = m_data[ ptr ]; + if ( k == FREE_KEY ) + { + if ( firstRemoved != -1 ) + ptr = firstRemoved; + m_data[ ptr ] = key; + m_data[ ptr + 1 ] = value; + if ( m_size >= m_threshold ) + rehash( m_data.length * 2 ); //size is set inside + else + ++m_size; + return null; + } + else if ( k.equals( key ) ) + { + final Object ret = m_data[ ptr + 1 ]; + m_data[ ptr + 1 ] = value; + return (V) ret; + } + else if ( k == REMOVED_KEY ) + { + if ( firstRemoved == -1 ) + firstRemoved = ptr; + } + } + } + + public V remove( final K key ) + { + int ptr = getStartIndex(key) << 1; + Object k = m_data[ ptr ]; + if ( k == FREE_KEY ) + return null; //end of chain already + else if ( k.equals( key ) ) //we check FREE and REMOVED prior to this call + { + --m_size; + if ( m_data[ ( ptr + 2 ) & m_mask2 ] == FREE_KEY ) + m_data[ ptr ] = FREE_KEY; + else + m_data[ ptr ] = REMOVED_KEY; + final V ret = (V) m_data[ ptr + 1 ]; + m_data[ ptr + 1 ] = null; + return ret; + } + while ( true ) + { + ptr = ( ptr + 2 ) & m_mask2; //that's next index calculation + k = m_data[ ptr ]; + if ( k == FREE_KEY ) + return null; + else if ( k.equals( key ) ) + { + --m_size; + if ( m_data[ ( ptr + 2 ) & m_mask2 ] == FREE_KEY ) + m_data[ ptr ] = FREE_KEY; + else + m_data[ ptr ] = REMOVED_KEY; + final V ret = (V) m_data[ ptr + 1 ]; + m_data[ ptr + 1 ] = null; + return ret; + } + } + } + + public int size() + { + return m_size; + } + + private void rehash( final int newCapacity ) + { + m_threshold = (int) (newCapacity/2 * m_fillFactor); + m_mask = newCapacity/2 - 1; + m_mask2 = newCapacity - 1; + + final int oldCapacity = m_data.length; + final Object[] oldData = m_data; + + m_data = new Object[ newCapacity ]; + Arrays.fill( m_data, FREE_KEY ); + + m_size = 0; + + for ( int i = 0; i < oldCapacity; i += 2 ) { + final Object oldKey = oldData[ i ]; + if( oldKey != FREE_KEY && oldKey != REMOVED_KEY ) + put( (K)oldKey, (V)oldData[ i + 1 ]); + } + } + + /** + * Returns a list of all values + * + * @return + */ + public List keys() + { + final List result = new ArrayList<>(); + + final int length = m_data.length; + for (int i = 0; i < length; i += 2) + { + final Object o = m_data[i]; + if (o != FREE_KEY && o != REMOVED_KEY) + { + result.add((K) o); + } + } + + return result; + } + + /** + * Returns a list of all values + * + * @return + */ + public List values() + { + final List result = new ArrayList<>(); + + final int length = m_data.length; + for (int i = 0; i < length; i += 2) + { + final Object o = m_data[i]; + if (o != FREE_KEY && o != REMOVED_KEY) + { + result.add((V) m_data[i + 1]); + } + } + + return result; + } + + /** + * Clears the map, reuses the data structure by clearing it out. + * It won't shrink the underlying array! + */ + public void clear() + { + this.m_size = 0; + Arrays.fill(m_data, FREE_KEY); + } + + public int getStartIndex( final Object key ) + { + //key is not null here + return key.hashCode() & m_mask; + } + + /** Return the least power of two greater than or equal to the specified value. + * + *

Note that this function will return 1 when the argument is 0. + * + * @param x a long integer smaller than or equal to 262. + * @return the least power of two greater than or equal to the specified value. + */ + public static long nextPowerOfTwo( long x ) { + if ( x == 0 ) return 1; + x--; + x |= x >> 1; + x |= x >> 2; + x |= x >> 4; + x |= x >> 8; + x |= x >> 16; + return ( x | x >> 32 ) + 1; + } + + /** Returns the least power of two smaller than or equal to 230 and larger than or equal to Math.ceil( expected / f ). + * + * @param expected the expected number of elements in a hash table. + * @param f the load factor. + * @return the minimum possible size for a backing array. + * @throws IllegalArgumentException if the necessary size is larger than 230. + */ + public static int arraySize( final int expected, final float f ) { + final long s = Math.max( 2, nextPowerOfTwo( (long)Math.ceil( expected / f ) ) ); + if ( s > (1 << 30) ) throw new IllegalArgumentException( "Too large (" + expected + " expected elements with load factor " + f + ")" ); + return (int)s; + } +} \ No newline at end of file diff --git a/src/test/java/org/htmlunit/cyberneko/util/FastHashMapTest.java b/src/test/java/org/htmlunit/cyberneko/util/FastHashMapTest.java new file mode 100644 index 00000000..ba427173 --- /dev/null +++ b/src/test/java/org/htmlunit/cyberneko/util/FastHashMapTest.java @@ -0,0 +1,357 @@ +/* + * Copyright (c) 2005-2023 Xceptance Software Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.htmlunit.cyberneko.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertNull; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.util.Collections; +import java.util.List; +import java.util.Map; +import java.util.stream.Collectors; +import java.util.stream.IntStream; + +import org.junit.jupiter.api.Test; + +public class FastHashMapTest +{ + @Test + public void happyPath() + { + final FastHashMap f = new FastHashMap<>(3, 0.5f); + f.put("a", 1); + f.put("b", 2); + f.put("c", 3); + f.put("d", 4); + f.put("e", 5); + + assertEquals(5, f.size()); + assertEquals(Integer.valueOf(1), f.get("a")); + assertEquals(Integer.valueOf(4), f.get("d")); + assertEquals(Integer.valueOf(3), f.get("c")); + assertEquals(Integer.valueOf(5), f.get("e")); + assertEquals(Integer.valueOf(2), f.get("b")); + + f.put("b", 20); + assertEquals(5, f.size()); + assertEquals(Integer.valueOf(1), f.get("a")); + assertEquals(Integer.valueOf(4), f.get("d")); + assertEquals(Integer.valueOf(20), f.get("b")); + assertEquals(Integer.valueOf(3), f.get("c")); + assertEquals(Integer.valueOf(5), f.get("e")); + } + + @Test + public void keys() + { + final FastHashMap f = new FastHashMap<>(3, 0.5f); + f.put("aa", 1); + f.put("bb", 2); + f.put("cc", 3); + f.put("dd", 4); + f.put("ee", 5); + + { + final List k = f.keys(); + assertEquals(5, k.size()); + assertTrue(k.contains("aa")); + assertTrue(k.contains("bb")); + assertTrue(k.contains("cc")); + assertTrue(k.contains("dd")); + assertTrue(k.contains("ee")); + } + + assertEquals(Integer.valueOf(3), f.remove("cc")); + f.remove("c"); + { + final List k = f.keys(); + assertEquals(4, k.size()); + assertTrue(k.contains("aa")); + assertTrue(k.contains("bb")); + assertTrue(k.contains("dd")); + assertTrue(k.contains("ee")); + } + + f.put("zz", 10); + f.remove("c"); + { + final List k = f.keys(); + assertEquals(5, k.size()); + assertTrue(k.contains("aa")); + assertTrue(k.contains("bb")); + assertTrue(k.contains("dd")); + assertTrue(k.contains("ee")); + assertTrue(k.contains("zz")); + } + + // ask for something unknown + assertNull(f.get("unknown")); + } + + @Test + public void values() + { + final FastHashMap f = new FastHashMap<>(3, 0.5f); + f.put("aa", 1); + f.put("bb", 2); + f.put("cc", 3); + f.put("dd", 4); + f.put("ee", 5); + + { + final List values = f.values(); + assertEquals(5, values.size()); + assertTrue(values.contains(1)); + assertTrue(values.contains(2)); + assertTrue(values.contains(3)); + assertTrue(values.contains(4)); + assertTrue(values.contains(5)); + } + + assertEquals(Integer.valueOf(3), f.remove("cc")); + f.remove("c"); + { + final List values = f.values(); + assertEquals(4, values.size()); + assertTrue(values.contains(1)); + assertTrue(values.contains(2)); + assertTrue(values.contains(4)); + assertTrue(values.contains(5)); + } + } + + @Test + public void remove() + { + final FastHashMap f = new FastHashMap<>(3, 0.5f); + f.put("a", 1); + f.put("b", 2); + f.put("c", 3); + f.put("d", 4); + f.put("e", 5); + + f.remove("b"); + f.remove("d"); + + assertEquals(3, f.size()); + assertEquals(Integer.valueOf(1), f.get("a")); + assertEquals(Integer.valueOf(3), f.get("c")); + assertEquals(Integer.valueOf(5), f.get("e")); + assertNull(f.get("d")); + assertNull(f.get("b")); + + // remove again + assertNull(f.remove("b")); + assertNull(f.remove("d")); + + f.put("d", 6); + f.put("b", 7); + assertEquals(Integer.valueOf(7), f.get("b")); + assertEquals(Integer.valueOf(6), f.get("d")); + } + + @Test + public void clear() + { + final FastHashMap m = new FastHashMap(); + m.put("a", 1); + assertEquals(1, m.size()); + + m.clear(); + assertEquals(0, m.size()); + assertEquals(0, m.keys().size()); + assertEquals(0, m.values().size()); + assertNull(m.get("a")); + + m.put("b", 2); + assertEquals(1, m.size()); + m.put("a", 3); + assertEquals(2, m.size()); + + m.clear(); + assertEquals(0, m.size()); + assertEquals(0, m.keys().size()); + assertEquals(0, m.values().size()); + + m.put("a", 1); + m.put("b", 2); + m.put("c", 3); + m.put("c", 3); + assertEquals(3, m.size()); + assertEquals(3, m.keys().size()); + assertEquals(3, m.values().size()); + + assertEquals(Integer.valueOf(1), m.get("a")); + assertEquals(Integer.valueOf(2), m.get("b")); + assertEquals(Integer.valueOf(3), m.get("c")); + } + + @Test + public void collision() + { + FastHashMap, String> f = new FastHashMap, String>(13, 0.5f); + IntStream.range(0, 15).forEach(i -> { + f.put(new MockKey(12, "k" + i), "v" + i); + }); + + assertEquals(15, f.size()); + + IntStream.range(0, 15).forEach(i -> { + assertEquals("v" + i, f.get(new MockKey(12, "k" + i))); + }); + + // round 2 + IntStream.range(0, 20).forEach(i -> { + f.put(new MockKey(12, "k" + i), "v" + i); + }); + + assertEquals(20, f.size()); + + IntStream.range(0, 20).forEach(i -> { + assertEquals("v" + i, f.get(new MockKey(12, "k" + i))); + }); + + // round 3 + IntStream.range(0, 10).forEach(i -> { + assertEquals("v" + i, f.remove(new MockKey(12, "k" + i))); + }); + IntStream.range(10, 20).forEach(i -> { + assertEquals("v" + i, f.get(new MockKey(12, "k" + i))); + }); + } + + /** + * Overflow initial size with collision keys. Some hash code for all keys. + */ + @Test + public void overflow() + { + final FastHashMap, Integer> m = new FastHashMap<>(5, 0.5f); + final Map, Integer> data = IntStream.range(0, 152) + .mapToObj(Integer::valueOf) + .collect( + Collectors.toMap(i -> new MockKey(1, "k" + i), + i -> i)); + + // add all + data.forEach((k, v) -> m.put(k, v)); + + // verify + data.forEach((k, v) -> assertEquals(v, m.get(k))); + assertEquals(152, m.size()); + assertEquals(152, m.keys().size()); + assertEquals(152, m.values().size()); + } + + /** + * Try to hit all slots with bad hashcodes + */ + @Test + public void hitEachSlot() + { + final FastHashMap, Integer> m = new FastHashMap<>(15, 0.9f); + + final Map, Integer> data = IntStream.range(0, 150) + .mapToObj(Integer::valueOf) + .collect( + Collectors.toMap(i -> new MockKey(i, "k1" + i), + i -> i)); + + // add the same hash codes again but other keys + data.putAll(IntStream.range(0, 150) + .mapToObj(Integer::valueOf) + .collect( + Collectors.toMap(i -> new MockKey(i, "k2" + i), + i -> i))); + // add all + data.forEach((k, v) -> m.put(k, v)); + // verify + data.forEach((k, v) -> assertEquals(v, m.get(k))); + assertEquals(300, m.size()); + assertEquals(300, m.keys().size()); + assertEquals(300, m.values().size()); + + // remove all + data.forEach((k, v) -> m.remove(k)); + // verify + assertEquals(0, m.size()); + assertEquals(0, m.keys().size()); + assertEquals(0, m.values().size()); + + // add all + final List> keys = data.keySet().stream().collect(Collectors.toList()); + keys.stream().sorted().forEach(k -> m.put(k, data.get(k))); + // put in different order + Collections.shuffle(keys); + keys.forEach(k -> m.put(k, data.get(k) + 42)); + + // verify + data.forEach((k, v) -> assertEquals(Integer.valueOf(v + 42), m.get(k))); + assertEquals(300, m.size()); + assertEquals(300, m.keys().size()); + assertEquals(300, m.values().size()); + + // remove in different order + Collections.shuffle(keys); + keys.forEach(k -> m.remove(k)); + + // verify + data.forEach((k, v) -> assertNull(m.get(k))); + assertEquals(0, m.size()); + assertEquals(0, m.keys().size()); + assertEquals(0, m.values().size()); + } + + static class MockKey> implements Comparable> + { + public final T key; + public final int hash; + + public MockKey(int hash, T key) + { + this.hash = hash; + this.key = key; + } + + @Override + public int hashCode() + { + return hash; + } + + @Override + public boolean equals(Object o) + { + MockKey t = (MockKey) o; + return hash == o.hashCode() && key.equals(t.key); + } + + @Override + public String toString() + { + return "MockKey [key=" + key + ", hash=" + hash + "]"; + } + + @Override + public int compareTo(MockKey o) + { + return o.key.compareTo(this.key); + } + + } +} + From b73cd706d16e0a7612dfa59df4baf1caa31ffb3a Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:11:41 +0100 Subject: [PATCH 09/18] Ministack for less overhead --- .../htmlunit/cyberneko/util/MiniStack.java | 78 ++++++++++++++++--- 1 file changed, 67 insertions(+), 11 deletions(-) diff --git a/src/main/java/org/htmlunit/cyberneko/util/MiniStack.java b/src/main/java/org/htmlunit/cyberneko/util/MiniStack.java index 7636ace0..45072b7a 100644 --- a/src/main/java/org/htmlunit/cyberneko/util/MiniStack.java +++ b/src/main/java/org/htmlunit/cyberneko/util/MiniStack.java @@ -1,3 +1,17 @@ +/* + * Copyright 2023 René Schwietzke + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package org.htmlunit.cyberneko.util; import java.util.Arrays; @@ -5,39 +19,62 @@ /** * Extremely light stack implementation. Perfect for inlining. * + * @author René Schwietzke + * @since 3.10.0 */ public class MiniStack { - + // our data private Object[] elements_; + + // our current position in the stack private int pos_ = -1; + /** + * Create a new empty stack with 8 elements capacity. + * + *

A reference are typically (less than 32 GB memory) + * 4 bytes. The overhead of any object is about 24 bytes, + * give or take, hence 8*4 + 24 fits a cache line of 64 bytes.

+ */ public MiniStack() { elements_ = new Object[8]; } + /** + * Empties the stack. It will not only reset the pointer but + * empty out the backing array to ensure we are not holding + * old references. + */ public void clear() { pos_ = -1; // drop all references to ensure GC - // this is not most efficient + // keeping would be more efficient but + // also has sideeffects. Arrays.fill(this.elements_, null); } /** * Resets the stack to zero but does not - * clean it + * clean it. Use with caution to avoid holding + * old objects and preventing them from GC. */ public void reset() { pos_ = -1; } + /** + * Removes and returns the last element + * + * @return the last element or null of none + */ @SuppressWarnings("unchecked") public E pop() { if ( pos_ >= 0) { final E e = (E) this.elements_[pos_]; - // ensure ref is clean + // ensure ref is clean to allow GC this.elements_[pos_] = null; - pos_--; + this.pos_--; return e; } @@ -46,19 +83,28 @@ public E pop() { } } + /** + * Returns the top/last element without removing + * it. Will return null if we don't have a last + * element. + * + * @return the top/last element if any, null otherwise + */ @SuppressWarnings("unchecked") public E peek() { - if ( pos_ >= 0) { - return (E) this.elements_[pos_]; - } - else { - return null; - } + return pos_ >= 0 ? (E) this.elements_[pos_] : null; } + /** + * Add a new element on top of the stack. You can add null + * but the return value of pop and peek will become ambiguous. + * + * @param element the element to add + */ public void push(E element) { pos_++; + // check if we need room, grow by about a cache line if (pos_ == this.elements_.length) { this.elements_ = Arrays.copyOf(this.elements_, this.elements_.length + 8); } @@ -66,10 +112,20 @@ public void push(E element) { this.elements_[pos_] = element; } + /** + * Checks if we have any element at all on the stack. + * + * @return true if the stack holds elements, false otherwise + */ public boolean isEmpty() { return pos_ < 0; } + /** + * Returns the current size of the stack. + * + * @return the size of the stack, always >= 0 + */ public int size() { return pos_ + 1; } From edd132d4f75d1447cd5ef1240e6436203f9e6186 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:11:59 +0100 Subject: [PATCH 10/18] Simpler array list, less code, more inlining. --- .../cyberneko/util/SimpleArrayList.java | 346 +++++++++++++++ .../cyberneko/util/SimpleArrayListTest.java | 411 ++++++++++++++++++ 2 files changed, 757 insertions(+) create mode 100644 src/main/java/org/htmlunit/cyberneko/util/SimpleArrayList.java create mode 100644 src/test/java/org/htmlunit/cyberneko/util/SimpleArrayListTest.java diff --git a/src/main/java/org/htmlunit/cyberneko/util/SimpleArrayList.java b/src/main/java/org/htmlunit/cyberneko/util/SimpleArrayList.java new file mode 100644 index 00000000..30840676 --- /dev/null +++ b/src/main/java/org/htmlunit/cyberneko/util/SimpleArrayList.java @@ -0,0 +1,346 @@ +/* + * Copyright (c) 2005-2023 Xceptance Software Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.htmlunit.cyberneko.util; + +import java.util.Arrays; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +/** + * Inexpensive (partial) list implementation. Not fully implemented, just what is needed. As soon as iterators and other + * things are involved, the memory savings we wanted are gone. + *

+ * Minimal checks for data correctness!! This is tuned for speed not elegance or safety. + * + * @author Rene Schwietzke + * @since 7.0.0 + */ +public class SimpleArrayList implements List +{ + private T[] data; + + private int size; + + /** + * Creates a new list wrapper from an existing one. This is not copying anything rather referencing it. Make sure + * that you understand that! + * + * @param list + */ + SimpleArrayList(final SimpleArrayList list) + { + data = list.data; + size = list.size; + } + + /** + * Create a new list with a default capacity. + * + * @param capacity + * the capacity + */ + @SuppressWarnings("unchecked") + public SimpleArrayList(final int capacity) + { + data = (T[]) new Object[capacity]; + } + + /** + * Create a new list with a default capacity. + */ + @SuppressWarnings("unchecked") + public SimpleArrayList() + { + data = (T[]) new Object[10]; + } + + /** + * Add an element to the end of the list + * + * @param element + * the element to add + * @return true if added and for this impl it is always true + */ + @SuppressWarnings("unchecked") + public boolean add(T element) + { + final int length = this.data.length; + if (this.size == length) + { + final T[] newData = (T[]) new Object[(length << 1) + 2]; + System.arraycopy(this.data, 0, newData, 0, length); + this.data = newData; + } + + this.data[this.size] = element; + this.size++; + + return true; + } + + @Override + public void add(int index, T element) + { + final int length = this.data.length; + if (this.size == length) + { + final T[] newData = (T[]) new Object[(length << 1) + 2]; + System.arraycopy(data, 0, newData, 0, length); + data = newData; + } + + // shift all to the right, if needed + System.arraycopy(this.data, index, this.data, index + 1, this.size - index); + + this.data[index] = element; + this.size++; + } + + /** + * Return an element at index. No range checks at all. + * + * @param index + * the position + * @return the element at this position + */ + public T get(int index) + { + return (T) data[index]; + } + + /** + * Returns the size of this list + */ + public int size() + { + return size; + } + + /** + * Creates an array of the elements. This is a copy operation! + * + * @return an array of the elements + */ + @Override + public Object[] toArray() + { + return Arrays.copyOf(this.data, this.size); + } + + /** + * Creates an array of the elements. This is a copy operation! + * + * @return an array of the elements + */ + @SuppressWarnings("unchecked") + @Override + public T[] toArray(T[] array) + { + return (T[]) Arrays.copyOf(this.data, this.size, array.getClass()); + } + + /** + * Clears the list by setting the size to zero. It does not release any elements for performance purposes. + */ + @Override + public void clear() + { + // are are not releasing any references, this is because of speed aka less memory + // access needed + this.size = 0; + } + + /** + * Returns view partitions on the underlying list. If the count is larger than size you get back the maximum + * possible list number with one element each. If count is 0 or smaller, we correct it to 1. + * + * @param count + * how many list do we want + * @return a list of lists + */ + public List> partition(int count) + { + final int _count; + if (count > size) + { + _count = size; + } + else + { + _count = count <= 0 ? 1 : count; + } + + final SimpleArrayList> result = new SimpleArrayList<>(count); + + final int newSize = (int) Math.ceil((double) size / (double) _count); + for (int i = 0; i < _count; i++) + { + int from = i * newSize; + int to = from + newSize - 1; + if (to >= size) + { + to = size - 1; + } + result.add(new Partition<>(this, from, to)); + } + + return result; + } + + class Partition extends SimpleArrayList + { + private final int from; + + private final int size; + + public Partition(final SimpleArrayList list, final int from, final int to) + { + super(list); + + this.from = from; + this.size = to - from + 1; + } + + public boolean add(K o) + { + throw new UnsupportedOperationException("Cannot modify the partition"); + } + + public K get(int index) + { + return (K) super.get(index + from); + } + + public int size() + { + return size; + } + + public K[] toArray() + { + throw new UnsupportedOperationException("unimplemented"); + } + + } + + @Override + public boolean isEmpty() + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public boolean contains(Object o) + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public Iterator iterator() + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public boolean remove(Object o) + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public boolean containsAll(Collection c) + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public boolean addAll(Collection c) + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public boolean addAll(int index, Collection c) + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public boolean removeAll(Collection c) + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public boolean retainAll(Collection c) + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public T set(int index, T element) + { + throw new UnsupportedOperationException("unimplemented"); + } + + /** + * Removes the data at index and shifts all data right of it + * + * @param index the position to clear + * @return the previous value at position index + */ + @Override + public T remove(int index) + { + final T t = this.data[index]; + System.arraycopy(this.data, index + 1, this.data, index, this.size - index - 1); + this.size--; + + return t; + } + + @Override + public int indexOf(Object o) + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public int lastIndexOf(Object o) + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public ListIterator listIterator() + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public ListIterator listIterator(int index) + { + throw new UnsupportedOperationException("unimplemented"); + } + + @Override + public List subList(int fromIndex, int toIndex) + { + throw new UnsupportedOperationException("unimplemented"); + } +} diff --git a/src/test/java/org/htmlunit/cyberneko/util/SimpleArrayListTest.java b/src/test/java/org/htmlunit/cyberneko/util/SimpleArrayListTest.java new file mode 100644 index 00000000..bfb15018 --- /dev/null +++ b/src/test/java/org/htmlunit/cyberneko/util/SimpleArrayListTest.java @@ -0,0 +1,411 @@ +/* + * Copyright (c) 2005-2023 Xceptance Software Technologies GmbH + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.htmlunit.cyberneko.util; + +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.fail; + +import java.util.List; + +import org.junit.jupiter.api.Test; + +public class SimpleArrayListTest +{ + @Test + public void create() + { + { + final SimpleArrayList l = new SimpleArrayList<>(); + assertEquals(0, l.size()); + } + } + + @Test + public void createSized() + { + { + final SimpleArrayList l = new SimpleArrayList<>(5); + assertEquals(0, l.size()); + } + // empty start size is permitted + { + final SimpleArrayList l = new SimpleArrayList<>(0); + assertEquals(0, l.size()); + } + } + + @Test + public void fillZeroSize() + { + final SimpleArrayList l = new SimpleArrayList<>(0); + l.add("a"); + l.add("b"); + l.add("c"); + assertEquals(3, l.size()); + assertEquals("a", l.get(0)); + assertEquals("b", l.get(1)); + assertEquals("c", l.get(2)); + } + + @Test + public void fill() + { + final SimpleArrayList l = new SimpleArrayList<>(5); + l.add("a"); + l.add("b"); + l.add("c"); + l.add("d"); + l.add("e"); + assertEquals(5, l.size()); + + assertEquals("a", l.get(0)); + assertEquals("b", l.get(1)); + assertEquals("c", l.get(2)); + assertEquals("d", l.get(3)); + assertEquals("e", l.get(4)); + + // no growth + try + { + l.get(5); + fail(); + } + catch(IndexOutOfBoundsException e) + { + // yeah... expected + } + } + + @Test + public void fillAndGrow() + { + final SimpleArrayList l = new SimpleArrayList<>(2); + l.add("a"); + l.add("b"); + assertEquals(2, l.size()); + l.add("d"); // became 2 << 1 + 2 + l.add("e"); + assertEquals("d", l.get(2)); + assertEquals("e", l.get(3)); + assertEquals(4, l.size()); + + // limited growth + try + { + l.get(6); + fail("Position exists"); + } + catch(IndexOutOfBoundsException e) + { + // yeah... expected + } + } + + @Test + public void partitionHappy() + { + final SimpleArrayList list = new SimpleArrayList<>(1); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(6); + + List> result = list.partition(3); + assertEquals(3, result.size()); + + assertEquals(2, result.get(0).size()); + assertEquals(Integer.valueOf(1), result.get(0).get(0)); + assertEquals(Integer.valueOf(2), result.get(0).get(1)); + + assertEquals(2, result.get(1).size()); + assertEquals(Integer.valueOf(3), result.get(1).get(0)); + assertEquals(Integer.valueOf(4), result.get(1).get(1)); + + assertEquals(2, result.get(2).size()); + assertEquals(Integer.valueOf(5), result.get(2).get(0)); + assertEquals(Integer.valueOf(6), result.get(2).get(1)); + } + + @Test + public void partitionSize1() + { + final SimpleArrayList list = new SimpleArrayList<>(1); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + list.add(6); + + List> result = list.partition(6); + assertEquals(6, result.size()); + + assertEquals(1, result.get(0).size()); + assertEquals(Integer.valueOf(1), result.get(0).get(0)); + + assertEquals(1, result.get(1).size()); + assertEquals(Integer.valueOf(2), result.get(1).get(0)); + + assertEquals(1, result.get(2).size()); + assertEquals(Integer.valueOf(3), result.get(2).get(0)); + + assertEquals(1, result.get(3).size()); + assertEquals(Integer.valueOf(4), result.get(3).get(0)); + + assertEquals(1, result.get(4).size()); + assertEquals(Integer.valueOf(5), result.get(4).get(0)); + + assertEquals(1, result.get(5).size()); + assertEquals(Integer.valueOf(6), result.get(5).get(0)); + } + + @Test + public void partitionEndBucketNotEven() + { + + final SimpleArrayList list = new SimpleArrayList<>(1); + list.add(1); + list.add(2); + list.add(3); + list.add(4); + list.add(5); + + List> result = list.partition(3); + assertEquals(3, result.size()); + + assertEquals(2, result.get(0).size()); + assertEquals(Integer.valueOf(1), result.get(0).get(0)); + assertEquals(Integer.valueOf(2), result.get(0).get(1)); + + assertEquals(2, result.get(1).size()); + assertEquals(Integer.valueOf(3), result.get(1).get(0)); + assertEquals(Integer.valueOf(4), result.get(1).get(1)); + + assertEquals(1, result.get(2).size()); + assertEquals(Integer.valueOf(5), result.get(2).get(0)); + } + + @Test + public void partitionCountTooLarge() + { + final SimpleArrayList list = new SimpleArrayList<>(1); + list.add(1); + list.add(2); + list.add(3); + + List> result = list.partition(4); + assertEquals(3, result.size()); + + assertEquals(1, result.get(0).size()); + assertEquals(Integer.valueOf(1), result.get(0).get(0)); + + assertEquals(1, result.get(1).size()); + assertEquals(Integer.valueOf(2), result.get(1).get(0)); + + assertEquals(1, result.get(2).size()); + assertEquals(Integer.valueOf(3), result.get(2).get(0)); + + } + + @Test + public void clear() + { + final SimpleArrayList l = new SimpleArrayList<>(5); + l.add("a"); + l.add("b"); + l.add("c"); + l.add("d"); + l.add("e"); + assertEquals(5, l.size()); + + assertEquals("a", l.get(0)); + assertEquals("b", l.get(1)); + assertEquals("c", l.get(2)); + assertEquals("d", l.get(3)); + assertEquals("e", l.get(4)); + + l.clear(); + + assertEquals(0, l.size()); + + // we are not checking ranges or such... hence this now works!!! + assertEquals("a", l.get(0)); + + l.clear(); + assertEquals(0, l.size()); + l.add("e1"); + assertEquals(1, l.size()); + assertEquals("e1", l.get(0)); + + } + + @Test + public void toArray() + { + final SimpleArrayList l = new SimpleArrayList<>(4); + l.add("a"); + l.add("b"); + l.add("c"); + l.add("d"); + l.add("e"); + assertEquals(5, l.size()); + + // we will get + { + final Object[] a = l.toArray(); + assertEquals(5, a.length); + assertEquals("a", a[0]); + assertEquals("b", a[1]); + assertEquals("c", a[2]); + assertEquals("d", a[3]); + assertEquals("e", a[4]); + } + // we will get + { + final String[] a = l.toArray(new String[0]); + assertEquals(5, a.length); + assertEquals("a", a[0]); + assertEquals("b", a[1]); + assertEquals("c", a[2]); + assertEquals("d", a[3]); + assertEquals("e", a[4]); + } + } + + @Test + public void remove() + { + // remove first + { + final SimpleArrayList l = new SimpleArrayList<>(10); + l.add("a"); + l.add("b"); + l.add("c"); + assertEquals(3, l.size()); + l.remove(0); + assertEquals(2, l.size()); + assertEquals("b", l.get(0)); + assertEquals("c", l.get(1)); + } + // remove middle + { + final SimpleArrayList l = new SimpleArrayList<>(10); + l.add("a"); + l.add("b"); + l.add("c"); + assertEquals(3, l.size()); + l.remove(1); + assertEquals(2, l.size()); + assertEquals("a", l.get(0)); + assertEquals("c", l.get(1)); + } + // remove end + { + final SimpleArrayList l = new SimpleArrayList<>(10); + l.add("a"); + l.add("b"); + l.add("c"); + assertEquals(3, l.size()); + l.remove(2); + assertEquals(2, l.size()); + assertEquals("a", l.get(0)); + assertEquals("b", l.get(1)); + } + // remove last element + { + final SimpleArrayList l = new SimpleArrayList<>(10); + l.add("a"); + l.add("b"); + l.add("c"); + assertEquals(3, l.size()); + l.remove(0); + l.remove(0); + l.remove(0); + assertEquals(0, l.size()); + } + } + + @Test + public void addAt() + { + // add to empty and no size + { + final SimpleArrayList l = new SimpleArrayList<>(0); + l.add(0, "a"); + assertEquals(1, l.size()); + assertEquals("a", l.get(0)); + } + // add to empty + { + final SimpleArrayList l = new SimpleArrayList<>(); + l.add(0, "a"); + assertEquals(1, l.size()); + assertEquals("a", l.get(0)); + } + // add to end + { + final SimpleArrayList l = new SimpleArrayList<>(); + l.add("a"); + l.add(1, "b"); + assertEquals(2, l.size()); + assertEquals("a", l.get(0)); + assertEquals("b", l.get(1)); + l.add(2, "c"); + assertEquals(3, l.size()); + assertEquals("a", l.get(0)); + assertEquals("b", l.get(1)); + assertEquals("c", l.get(2)); + } + // add to start + { + final SimpleArrayList l = new SimpleArrayList<>(); + l.add("a"); + l.add(0, "b"); + assertEquals(2, l.size()); + assertEquals("b", l.get(0)); + assertEquals("a", l.get(1)); + l.add(0, "c"); + assertEquals(3, l.size()); + assertEquals("a", l.get(2)); + assertEquals("b", l.get(1)); + assertEquals("c", l.get(0)); + } + // add middle + { + final SimpleArrayList l = new SimpleArrayList<>(); + l.add("a"); + l.add("c"); + l.add(1, "b"); + assertEquals(3, l.size()); + assertEquals("a", l.get(0)); + assertEquals("b", l.get(1)); + assertEquals("c", l.get(2)); + } + // add and requires growth + { + final SimpleArrayList l = new SimpleArrayList<>(2); + l.add("a"); + l.add("c"); + l.add(1, "b"); + assertEquals(3, l.size()); + assertEquals("a", l.get(0)); + assertEquals("b", l.get(1)); + assertEquals("c", l.get(2)); + } + } +} From 2951e5c4af1a715f2c5cf4eba5341be85b4b3e88 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:14:26 +0100 Subject: [PATCH 11/18] Improved QName handling for less overhead --- .../cyberneko/filters/NamespaceBinder.java | 58 +++++++++---------- .../xerces/util/XMLAttributesImpl.java | 9 ++- .../htmlunit/cyberneko/xerces/xni/QName.java | 10 ++++ .../cyberneko/xerces/xni/XMLAttributes.java | 11 +++- 4 files changed, 55 insertions(+), 33 deletions(-) diff --git a/src/main/java/org/htmlunit/cyberneko/filters/NamespaceBinder.java b/src/main/java/org/htmlunit/cyberneko/filters/NamespaceBinder.java index 1a738e53..c0ebdea4 100644 --- a/src/main/java/org/htmlunit/cyberneko/filters/NamespaceBinder.java +++ b/src/main/java/org/htmlunit/cyberneko/filters/NamespaceBinder.java @@ -273,19 +273,6 @@ public void endElement(final QName element, final Augmentations augs) } } - // - // Protected static methods - // - - // Splits a qualified name. - protected static void splitQName(final QName qname) { - final int index = qname.rawname.indexOf(':'); - if (index != -1) { - qname.prefix = qname.rawname.substring(0, index); - qname.localpart = qname.rawname.substring(index + 1); - } - } - // // Converts HTML names string value to constant value. // @@ -317,18 +304,22 @@ protected static String modifyName(final String name, final short mode) { // Binds namespaces. protected void bindNamespaces(final QName element, final XMLAttributes attrs) { - // split element qname - splitQName(element); + element.splitQName(); // declare namespace prefixes if (attrs != null) { final int attrCount = attrs.getLength(); + for (int i = attrCount - 1; i >= 0; i--) { attrs.getName(i, fQName_); String rawname = fQName_.rawname; - final String rawnameUC = rawname.toUpperCase(Locale.ROOT); - if (rawnameUC.startsWith("XMLNS:") || "XMLNS".equals(rawnameUC)) { + // we don't uppercase anymore, instead we lowercase, because most + // of the time, we are lowercase already and save on memory because + // we don't convert it + final String rawnameUC = rawname.toLowerCase(Locale.ROOT); + + if ("xmlns".equals(rawnameUC) || rawnameUC.startsWith("xmlns:")) { final int anamelen = rawname.length(); // get parts @@ -337,20 +328,24 @@ protected void bindNamespaces(final QName element, final XMLAttributes attrs) { final String avalue = attrs.getValue(i); // re-case parts and set them back into attributes + final String prefix; if (anamelen > 5) { aprefix = modifyName(aprefix, NAMES_LOWERCASE); alocal = modifyName(alocal, fNamesElems_); rawname = aprefix + ':' + alocal; + prefix = alocal; } else { alocal = modifyName(alocal, NAMES_LOWERCASE); rawname = alocal; + prefix = ""; } fQName_.setValues(aprefix, alocal, rawname, null); attrs.setName(i, fQName_); - // declare prefix - final String prefix = alocal != rawname ? alocal : ""; + // declare prefix, this is moved up to avoid + // another if + // final String prefix = alocal != rawname ? alocal : ""; String uri = avalue.length() > 0 ? avalue : null; if (fOverrideNamespaces_ && prefix.equals(element.prefix) && htmlConfiguration_.getHtmlElements().getElement(element.localpart, null) != null) { @@ -362,8 +357,7 @@ protected void bindNamespaces(final QName element, final XMLAttributes attrs) { } // bind element - String prefix = element.prefix != null ? element.prefix : ""; - element.uri = fNamespaceContext_.getURI(prefix); + element.uri = fNamespaceContext_.getURI(element.prefix != null ? element.prefix : ""); // REVISIT: The prefix of a qualified element name that is // bound to a namespace is passed (as recent as // Xerces 2.4.0) as "" for start elements and null @@ -390,20 +384,22 @@ protected void bindNamespaces(final QName element, final XMLAttributes attrs) { if (attrs != null) { final int attrCount = attrs.getLength(); for (int i = 0; i < attrCount; i++) { - attrs.getName(i, fQName_); - splitQName(fQName_); - prefix = !"xmlns".equals(fQName_.rawname) - ? (fQName_.prefix != null ? fQName_.prefix : "") : "xmlns"; - // PATCH: Joseph Walton - if (!"".equals(prefix)) { - fQName_.uri = "xml".equals(prefix) ? XML_URI : fNamespaceContext_.getURI(prefix); + final QName qName = attrs.getName(i).splitQName(); + + final String prefix = !"xmlns".equals(qName.rawname) + ? (qName.prefix != null ? qName.prefix : "") : "xmlns"; + // PATCH: Joseph Walton, if we have a non-empty prefix + if (prefix.length() > 0) { + qName.uri = "xml".equals(prefix) ? XML_URI : fNamespaceContext_.getURI(prefix); } // NOTE: You would think the xmlns namespace would be handled // by NamespaceSupport but it's not. -Ac - if ("xmlns".equals(prefix) && fQName_.uri == null) { - fQName_.uri = XMLNS_URI; + if (qName.uri == null && "xmlns".equals(prefix)) { + qName.uri = XMLNS_URI; } - attrs.setName(i, fQName_); + // no need to set it, we already worked on the reference, + // less copying of things make it more efficient + // attrs.setName(i, fQName_); } } } diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/util/XMLAttributesImpl.java b/src/main/java/org/htmlunit/cyberneko/xerces/util/XMLAttributesImpl.java index 04b5eed9..6d9beb4b 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/util/XMLAttributesImpl.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/util/XMLAttributesImpl.java @@ -307,13 +307,20 @@ public String getValue(final String qname) { * range. * @see #getLength */ - public String getName(final int index) { + public String getNameRawName(final int index) { if (index < 0 || index >= getLength()) { return null; } return attributes_.get(index).name_.rawname; } + /** + * Returns the full QName of the name of this attribute. + */ + public QName getName(final int index) { + return attributes_.get(index).name_; + } + // // Attributes methods // diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/xni/QName.java b/src/main/java/org/htmlunit/cyberneko/xerces/xni/QName.java index c31df49d..4e064f66 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/xni/QName.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/xni/QName.java @@ -91,6 +91,16 @@ public void setValues(final String prefix, final String localpart, final String this.uri = uri; } + // Splits a qualified name. + public QName splitQName() { + final int index = this.rawname.indexOf(':'); + if (index != -1) { + this.prefix = this.rawname.substring(0, index); + this.localpart = this.rawname.substring(index + 1); + } + return this; + } + @Override public Object clone() { return new QName(this); diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLAttributes.java b/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLAttributes.java index e205f53c..ee864bea 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLAttributes.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/xni/XMLAttributes.java @@ -114,7 +114,7 @@ public interface XMLAttributes { void setName(int attrIndex, QName attrName); /** - * Sets the fields in the given QName structure with the values of the attribute + * Gets the fields in the given QName structure with the values of the attribute * name at the specified index. * * @param attrIndex The attribute index. @@ -122,6 +122,15 @@ public interface XMLAttributes { */ void getName(int attrIndex, QName attrName); + /** + * Returns the QName structure of the name. Because QName is a modifiable + * data structure, make sure you know what you do when you take this + * shortcut route. + * + * @param attrIndex The attribute index. + */ + QName getName(int attrIndex); + /** * Look up an attribute's Namespace URI by index. * From cbccd705eea19138e2d640f02d31f95f6ab3fa19 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:17:19 +0100 Subject: [PATCH 12/18] Changed element lookup, also assuming as default that elements are lowercase, so we are not forcing uppercasing anymore, rather lowercasing, which is rare --- .../org/htmlunit/cyberneko/HTMLElements.java | 80 +++++-- .../cyberneko/html/dom/HTMLDocumentImpl.java | 219 ++++++++++++------ .../cyberneko/html/dom/HTMLElementImpl.java | 2 +- 3 files changed, 205 insertions(+), 96 deletions(-) diff --git a/src/main/java/org/htmlunit/cyberneko/HTMLElements.java b/src/main/java/org/htmlunit/cyberneko/HTMLElements.java index b5ea6de5..0b660d37 100644 --- a/src/main/java/org/htmlunit/cyberneko/HTMLElements.java +++ b/src/main/java/org/htmlunit/cyberneko/HTMLElements.java @@ -17,8 +17,8 @@ import java.util.HashMap; import java.util.Locale; -import java.util.Map; -import java.util.TreeMap; + +import org.htmlunit.cyberneko.util.FastHashMap; /** * Collection of HTML element information. @@ -189,9 +189,14 @@ public class HTMLElements { /** No such element. */ public final Element NO_SUCH_ELEMENT = new Element(UNKNOWN, "", Element.CONTAINER, new short[]{BODY}, null); - public final Map elementsByCode = new HashMap<>(256); + // these fields became private to avoid exposing them for indirect modification + // this cannot be final because HtmlUnit might add to that + private Element[] elementsByCode; - public final Map elementsByName = new TreeMap<>(String.CASE_INSENSITIVE_ORDER); + // keep the list here for later modification + private final HashMap elementsByNameForReference = new HashMap<>(); + // this is a optimized version which will be later queried + private final FastHashMap elementsByNameOptimized = new FastHashMap<>(311, 0.50f); public HTMLElements() { final Element[][] elementsArray = new Element[26][]; @@ -542,31 +547,54 @@ public HTMLElements() { for (final Element[] elements : elementsArray) { if (elements != null) { for (final Element element : elements) { - elementsByCode.put(element.code, element); - elementsByName.put(element.name, element); + this.elementsByNameForReference.put(element.name, element); } } } - elementsByCode.put(NO_SUCH_ELEMENT.code, NO_SUCH_ELEMENT); - - // initialize cross references to parent elements - for (final Element element : elementsByCode.values()) { - defineParents(element); - } + // setup optimized versions + setupOptimizedVersions(); } public void setElement(final Element element) { - elementsByCode.put(element.code, element); - elementsByName.put(element.name, element); - defineParents(element); + this.elementsByNameForReference.put(element.name, element); + + // rebuild the information "trees" + setupOptimizedVersions(); + } + + private void setupOptimizedVersions() { + // we got x amount of elements + 1 unknown + // put that into an array instead of a map, that + // is a faster look up and avoids equals + // ATTENTION: Due to some HtmlUnit custom tag handling that overwrites our + // list here, we might get a list with holes, so check the range first + final int size = elementsByNameForReference.values().stream().mapToInt(v -> v.code).max().getAsInt(); + elementsByCode = new Element[Math.max(size, NO_SUCH_ELEMENT.code) + 1]; + elementsByNameForReference.values().forEach(v -> elementsByCode[v.code] = v); + elementsByCode[NO_SUCH_ELEMENT.code] = NO_SUCH_ELEMENT; + + // initialize cross references to parent elements + for (final Element element : elementsByCode) { + if (element != null) { + defineParents(element); + } + } + // get us a second version that is lowercase stringified to + // reduce lookup overhead + for (final Element element : elementsByCode) { + // we might have holes due to HtmlUnitNekoHtmlParser + if (element != null) { + elementsByNameOptimized.put(element.name.toLowerCase(Locale.ROOT), element); + } + } } private void defineParents(final Element element) { if (element.parentCodes != null) { element.parent = new Element[element.parentCodes.length]; for (int j = 0; j < element.parentCodes.length; j++) { - element.parent[j] = elementsByCode.get(element.parentCodes[j]); + element.parent[j] = elementsByCode[element.parentCodes[j]]; } element.parentCodes = null; } @@ -582,7 +610,7 @@ private void defineParents(final Element element) { * @param code The element code. */ public final Element getElement(final short code) { - return elementsByCode.get(code); + return elementsByCode[code]; } /** @@ -608,7 +636,16 @@ public final Element getElement(final String ename) { * @param element The default element to return if not found. */ public final Element getElement(final String ename, final Element element) { - return elementsByName.getOrDefault(ename, element); + // check the current form casing first, which is mostly lowercase only + Element r = elementsByNameOptimized.get(ename); + if (r == null) { + // we have found it in its current form, which + // is hopefully mainly lowercase or uppercase, so try + // all lowercase + r = elementsByNameOptimized.get(ename.toLowerCase(Locale.ROOT)); + } + // return fallback element if needed + return r != null ? r : element; } // @@ -643,6 +680,9 @@ public static class Element { /** The element name. */ public final String name; + /** The element name. */ + public final String lowercaseName; + /** Informational flags. */ public final int flags; @@ -715,6 +755,7 @@ public Element(final short code, final String name, final int flags, final short[] parents, final short bounds, final short[] closes) { this.code = code; this.name = name; + this.lowercaseName = name.toLowerCase(Locale.ROOT); this.flags = flags; this.parentCodes = parents; this.parent = null; @@ -792,7 +833,8 @@ public int hashCode() { @Override public boolean equals(final Object o) { if (o instanceof Element) { - return name.equals(((Element) o).name); + Element e = (Element) o; + return lowercaseName.equals(e.name) || name.equals(e.name); } return false; } diff --git a/src/main/java/org/htmlunit/cyberneko/html/dom/HTMLDocumentImpl.java b/src/main/java/org/htmlunit/cyberneko/html/dom/HTMLDocumentImpl.java index e5e28d01..0e572276 100644 --- a/src/main/java/org/htmlunit/cyberneko/html/dom/HTMLDocumentImpl.java +++ b/src/main/java/org/htmlunit/cyberneko/html/dom/HTMLDocumentImpl.java @@ -17,9 +17,12 @@ import java.io.StringWriter; import java.lang.reflect.Constructor; +import java.util.Arrays; import java.util.HashMap; import java.util.Locale; +import java.util.Map; +import org.htmlunit.cyberneko.util.FastHashMap; import org.htmlunit.cyberneko.xerces.dom.DocumentImpl; import org.htmlunit.cyberneko.xerces.dom.ElementImpl; import org.w3c.dom.Attr; @@ -56,6 +59,28 @@ */ public class HTMLDocumentImpl extends DocumentImpl implements HTMLDocument { + /** + * All valid HTML5 tags without deprecated elements + * https://www.tutorialrepublic.com/html-reference/html5-tags.php + */ + private static final String[] HTML5ELEMENTS = { + "A", "ABBR", "ADDRESS", "AREA", "ARTICLE", "ASIDE", "AUDIO", + "B", "BASE", "BDI", "BDO", "BLOCKQUOTE", "BODY", "BR", "BUTTON", + "CANVAS", "CAPTION", "CITE", "CODE", "COL", "COLGROUP", "DATA", + "DATALIST", "DD", "DEL", "DETAILS", "DFN", "DIALOG", "DIV", + "DL", "DT", "EM", "EMBED", "FIELDSET", "FIGCAPTION", "FIGURE", + "FOOTER", "FORM", "HEAD", "HEADER", "HGROUP", "H1", "HR", "HTML", + "I", "IFRAME", "IMG", "INPUT", "INS", "KBD", "KEYGEN", "LABEL", + "LEGEND", "LI", "LINK", "MAIN", "MAP", "MARK", "MENU", "MENUITEM", + "META", "METER", "NAV", "NOSCRIPT", "OBJECT", "OL", "OPTGROUP", + "OPTION", "OUTPUT", "P", "PARAM", "PICTURE", "PRE", "PROGRESS", + "Q", "RP", "RT", "RUBY", "S", "SAMP", "SCRIPT", "SECTION", + "SELECT", "SMALL", "SOURCE", "SPAN", "STRONG", "STYLE", "SUB", + "SUMMARY", "SUP", "SVG", "TABLE", "TBODY", "TD", "TEMPLATE", + "TEXTAREA", "TFOOT", "TH", "THEAD", "TIME", "TITLE", "TR", + "TRACK", "U", "UL", "VAR", "VIDEO", "WBR" + }; + /** * Holds HTMLCollectionImpl object with live collection of all * anchors in document. This reference is on demand only once. @@ -102,7 +127,8 @@ public class HTMLDocumentImpl extends DocumentImpl implements HTMLDocument { * * @see #createElement */ - private static final HashMap> elementTypesHTML_ = new HashMap<>(); + private static final FastHashMap elementTypesHTMLLower_ = new FastHashMap<>(11, 0.5f); + private static final FastHashMap elementTypesHTMLUpper_ = new FastHashMap<>(11, 0.5f); /** * Signature used to locate constructor of HTML element classes. This @@ -113,69 +139,108 @@ public class HTMLDocumentImpl extends DocumentImpl implements HTMLDocument { private static final Class[] elemClassSigHTML_ = new Class[] {HTMLDocumentImpl.class, String.class}; static { - elementTypesHTML_.put("A", HTMLAnchorElementImpl.class); - elementTypesHTML_.put("APPLET", HTMLAppletElementImpl.class); - elementTypesHTML_.put("AREA", HTMLAreaElementImpl.class); - elementTypesHTML_.put("BASE", HTMLBaseElementImpl.class); - elementTypesHTML_.put("BASEFONT", HTMLBaseFontElementImpl.class); - elementTypesHTML_.put("BLOCKQUOTE", HTMLQuoteElementImpl.class); - elementTypesHTML_.put("BODY", HTMLBodyElementImpl.class); - elementTypesHTML_.put("BR", HTMLBRElementImpl.class); - elementTypesHTML_.put("BUTTON", HTMLButtonElementImpl.class); - elementTypesHTML_.put("DEL", HTMLModElementImpl.class); - elementTypesHTML_.put("DIR", HTMLDirectoryElementImpl.class); - elementTypesHTML_.put("DIV", HTMLDivElementImpl.class); - elementTypesHTML_.put("DL", HTMLDListElementImpl.class); - elementTypesHTML_.put("FIELDSET", HTMLFieldSetElementImpl.class); - elementTypesHTML_.put("FONT", HTMLFontElementImpl.class); - elementTypesHTML_.put("FORM", HTMLFormElementImpl.class); - elementTypesHTML_.put("FRAME", HTMLFrameElementImpl.class); - elementTypesHTML_.put("FRAMESET", HTMLFrameSetElementImpl.class); - elementTypesHTML_.put("HEAD", HTMLHeadElementImpl.class); - elementTypesHTML_.put("H1", HTMLHeadingElementImpl.class); - elementTypesHTML_.put("H2", HTMLHeadingElementImpl.class); - elementTypesHTML_.put("H3", HTMLHeadingElementImpl.class); - elementTypesHTML_.put("H4", HTMLHeadingElementImpl.class); - elementTypesHTML_.put("H5", HTMLHeadingElementImpl.class); - elementTypesHTML_.put("H6", HTMLHeadingElementImpl.class); - elementTypesHTML_.put("HR", HTMLHRElementImpl.class); - elementTypesHTML_.put("HTML", HTMLHtmlElementImpl.class); - elementTypesHTML_.put("IFRAME", HTMLIFrameElementImpl.class); - elementTypesHTML_.put("IMG", HTMLImageElementImpl.class); - elementTypesHTML_.put("INPUT", HTMLInputElementImpl.class); - elementTypesHTML_.put("INS", HTMLModElementImpl.class); - elementTypesHTML_.put("ISINDEX", HTMLIsIndexElementImpl.class); - elementTypesHTML_.put("LABEL", HTMLLabelElementImpl.class); - elementTypesHTML_.put("LEGEND", HTMLLegendElementImpl.class); - elementTypesHTML_.put("LI", HTMLLIElementImpl.class); - elementTypesHTML_.put("LINK", HTMLLinkElementImpl.class); - elementTypesHTML_.put("MAP", HTMLMapElementImpl.class); - elementTypesHTML_.put("MENU", HTMLMenuElementImpl.class); - elementTypesHTML_.put("META", HTMLMetaElementImpl.class); - elementTypesHTML_.put("OBJECT", HTMLObjectElementImpl.class); - elementTypesHTML_.put("OL", HTMLOListElementImpl.class); - elementTypesHTML_.put("OPTGROUP", HTMLOptGroupElementImpl.class); - elementTypesHTML_.put("OPTION", HTMLOptionElementImpl.class); - elementTypesHTML_.put("P", HTMLParagraphElementImpl.class); - elementTypesHTML_.put("PARAM", HTMLParamElementImpl.class); - elementTypesHTML_.put("PRE", HTMLPreElementImpl.class); - elementTypesHTML_.put("Q", HTMLQuoteElementImpl.class); - elementTypesHTML_.put("SCRIPT", HTMLScriptElementImpl.class); - elementTypesHTML_.put("SELECT", HTMLSelectElementImpl.class); - elementTypesHTML_.put("STYLE", HTMLStyleElementImpl.class); - elementTypesHTML_.put("TABLE", HTMLTableElementImpl.class); - elementTypesHTML_.put("CAPTION", HTMLTableCaptionElementImpl.class); - elementTypesHTML_.put("TD", HTMLTableCellElementImpl.class); - elementTypesHTML_.put("TH", HTMLTableCellElementImpl.class); - elementTypesHTML_.put("COL", HTMLTableColElementImpl.class); - elementTypesHTML_.put("COLGROUP", HTMLTableColElementImpl.class); - elementTypesHTML_.put("TR", HTMLTableRowElementImpl.class); - elementTypesHTML_.put("TBODY", HTMLTableSectionElementImpl.class); - elementTypesHTML_.put("THEAD", HTMLTableSectionElementImpl.class); - elementTypesHTML_.put("TFOOT", HTMLTableSectionElementImpl.class); - elementTypesHTML_.put("TEXTAREA", HTMLTextAreaElementImpl.class); - elementTypesHTML_.put("TITLE", HTMLTitleElementImpl.class); - elementTypesHTML_.put("UL", HTMLUListElementImpl.class); + final Map> tMap = new HashMap<>(); + + // register all HTML5 elements that are not deprecated as simple + // HTMLElementImpl first and overwrite them later + // https://developer.mozilla.org/en-US/docs/Web/HTML/Element + Arrays.stream(HTML5ELEMENTS).forEach(t -> tMap.put(t, HTMLElementImpl.class)); + + tMap.put("A", HTMLAnchorElementImpl.class); + tMap.put("APPLET", HTMLAppletElementImpl.class); + tMap.put("AREA", HTMLAreaElementImpl.class); + tMap.put("BASE", HTMLBaseElementImpl.class); + tMap.put("BASEFONT", HTMLBaseFontElementImpl.class); + tMap.put("BLOCKQUOTE", HTMLQuoteElementImpl.class); + tMap.put("BODY", HTMLBodyElementImpl.class); + tMap.put("BR", HTMLBRElementImpl.class); + tMap.put("BUTTON", HTMLButtonElementImpl.class); + tMap.put("DEL", HTMLModElementImpl.class); + tMap.put("DIR", HTMLDirectoryElementImpl.class); + tMap.put("DIV", HTMLDivElementImpl.class); + tMap.put("DL", HTMLDListElementImpl.class); + tMap.put("FIELDSET", HTMLFieldSetElementImpl.class); + tMap.put("FONT", HTMLFontElementImpl.class); + tMap.put("FORM", HTMLFormElementImpl.class); + tMap.put("FRAME", HTMLFrameElementImpl.class); + tMap.put("FRAMESET", HTMLFrameSetElementImpl.class); + tMap.put("HEAD", HTMLHeadElementImpl.class); + tMap.put("H1", HTMLHeadingElementImpl.class); + tMap.put("H2", HTMLHeadingElementImpl.class); + tMap.put("H3", HTMLHeadingElementImpl.class); + tMap.put("H4", HTMLHeadingElementImpl.class); + tMap.put("H5", HTMLHeadingElementImpl.class); + tMap.put("H6", HTMLHeadingElementImpl.class); + tMap.put("HR", HTMLHRElementImpl.class); + tMap.put("HTML", HTMLHtmlElementImpl.class); + tMap.put("IFRAME", HTMLIFrameElementImpl.class); + tMap.put("IMG", HTMLImageElementImpl.class); + tMap.put("INPUT", HTMLInputElementImpl.class); + tMap.put("INS", HTMLModElementImpl.class); + tMap.put("ISINDEX", HTMLIsIndexElementImpl.class); + tMap.put("LABEL", HTMLLabelElementImpl.class); + tMap.put("LEGEND", HTMLLegendElementImpl.class); + tMap.put("LI", HTMLLIElementImpl.class); + tMap.put("LINK", HTMLLinkElementImpl.class); + tMap.put("MAP", HTMLMapElementImpl.class); + tMap.put("MENU", HTMLMenuElementImpl.class); + tMap.put("META", HTMLMetaElementImpl.class); + tMap.put("OBJECT", HTMLObjectElementImpl.class); + tMap.put("OL", HTMLOListElementImpl.class); + tMap.put("OPTGROUP", HTMLOptGroupElementImpl.class); + tMap.put("OPTION", HTMLOptionElementImpl.class); + tMap.put("P", HTMLParagraphElementImpl.class); + tMap.put("PARAM", HTMLParamElementImpl.class); + tMap.put("PRE", HTMLPreElementImpl.class); + tMap.put("Q", HTMLQuoteElementImpl.class); + tMap.put("SCRIPT", HTMLScriptElementImpl.class); + tMap.put("SELECT", HTMLSelectElementImpl.class); + tMap.put("STYLE", HTMLStyleElementImpl.class); + tMap.put("TABLE", HTMLTableElementImpl.class); + tMap.put("CAPTION", HTMLTableCaptionElementImpl.class); + tMap.put("TD", HTMLTableCellElementImpl.class); + tMap.put("TH", HTMLTableCellElementImpl.class); + tMap.put("COL", HTMLTableColElementImpl.class); + tMap.put("COLGROUP", HTMLTableColElementImpl.class); + tMap.put("TR", HTMLTableRowElementImpl.class); + tMap.put("TBODY", HTMLTableSectionElementImpl.class); + tMap.put("THEAD", HTMLTableSectionElementImpl.class); + tMap.put("TFOOT", HTMLTableSectionElementImpl.class); + tMap.put("TEXTAREA", HTMLTextAreaElementImpl.class); + tMap.put("TITLE", HTMLTitleElementImpl.class); + tMap.put("UL", HTMLUListElementImpl.class); + + // also put all lowercase versions here to safe on lookup + tMap.entrySet().forEach(e -> { + final String key = e.getKey(); + final Class value = e.getValue(); + + final String uKey = key.toUpperCase(Locale.ENGLISH); + final String lKey = key.toLowerCase(Locale.ENGLISH); + + try + { + final Constructor ctr = value.getConstructor(elemClassSigHTML_); + + final ElementTypesHTMLHolder holder = new ElementTypesHTMLHolder(uKey, ctr); + elementTypesHTMLUpper_.put(uKey, holder); + elementTypesHTMLLower_.put(lKey, holder); + } + catch (NoSuchMethodException | SecurityException ex) + { + throw new IllegalStateException("HTM15 Tag '" + key + "' associated with an Element class that failed to construct.\n" + key, ex); + } + }); + } + + static class ElementTypesHTMLHolder { + public final String tagName; + public final Constructor ctr; + + public ElementTypesHTMLHolder(final String tagName, final Constructor ctr) { + this.tagName = tagName; + this.ctr = ctr; + } } /** @@ -456,27 +521,29 @@ public Element createElementNS(final String namespaceURI, final String qualified @Override public Element createElement(String tagName) throws DOMException { - final Class elemClass; - final Constructor cnst; - // First, make sure tag name is all upper case, next get the associated // element class. If no class is found, generate a generic HTML element. // Do so also if an unexpected exception occurs. - tagName = tagName.toUpperCase(Locale.ENGLISH); - elemClass = elementTypesHTML_.get(tagName); - if (elemClass != null) { + ElementTypesHTMLHolder htmlHolder = elementTypesHTMLLower_.get(tagName); + if (htmlHolder == null) { + // try uppercase but only if needed and don't use this string to create + // the element but the stored one to keep the memory usage low when the + // tree is kept in memory longer + htmlHolder = elementTypesHTMLUpper_.get(tagName.toUpperCase(Locale.ENGLISH)); + } + + if (htmlHolder != null) { // Get the constructor for the element. The signature specifies an // owner document and a tag name. Use the constructor to instantiate // a new object and return it. try { - cnst = elemClass.getConstructor(elemClassSigHTML_); - return (Element) cnst.newInstance(new Object[] {this, tagName}); + return (Element) htmlHolder.ctr.newInstance(new Object[] {this, htmlHolder.tagName}); } catch (final Exception e) { throw new IllegalStateException("HTM15 Tag '" + tagName + "' associated with an Element class that failed to construct.\n" + tagName, e); } } - return new HTMLElementImpl(this, tagName); + return new HTMLElementImpl(this, tagName.toUpperCase(Locale.ENGLISH)); } /** @@ -620,9 +687,9 @@ protected boolean canRenameElements(final String newNamespaceURI, final String n } // check whether a class change is required - final Class newClass = elementTypesHTML_.get(newNodeName.toUpperCase(Locale.ENGLISH)); - final Class oldClass = elementTypesHTML_.get(el.getTagName()); - return newClass == oldClass; + final Constructor newCtr = elementTypesHTMLUpper_.get(newNodeName.toUpperCase(Locale.ENGLISH)).ctr; + final Constructor oldCtr = elementTypesHTMLUpper_.get(el.getTagName()).ctr; + return newCtr == oldCtr; } /** diff --git a/src/main/java/org/htmlunit/cyberneko/html/dom/HTMLElementImpl.java b/src/main/java/org/htmlunit/cyberneko/html/dom/HTMLElementImpl.java index 4e8898c5..dcd99b4d 100644 --- a/src/main/java/org/htmlunit/cyberneko/html/dom/HTMLElementImpl.java +++ b/src/main/java/org/htmlunit/cyberneko/html/dom/HTMLElementImpl.java @@ -48,7 +48,7 @@ public class HTMLElementImpl extends ElementImpl implements HTMLElement { * @param tagName The element's tag name */ public HTMLElementImpl(final HTMLDocumentImpl owner, final String tagName) { - super(owner, tagName.toUpperCase(Locale.ENGLISH)); + super(owner, tagName); } @Override From 62c32931640ccdb62bf1daea29a5b3d40a5e03dc Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:17:32 +0100 Subject: [PATCH 13/18] Using simpler array list --- .../xerces/dom/NamedNodeMapImpl.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/dom/NamedNodeMapImpl.java b/src/main/java/org/htmlunit/cyberneko/xerces/dom/NamedNodeMapImpl.java index 225ee047..56ada1b0 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/dom/NamedNodeMapImpl.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/dom/NamedNodeMapImpl.java @@ -14,9 +14,9 @@ */ package org.htmlunit.cyberneko.xerces.dom; -import java.util.ArrayList; import java.util.List; +import org.htmlunit.cyberneko.util.SimpleArrayList; import org.w3c.dom.DOMException; import org.w3c.dom.NamedNodeMap; import org.w3c.dom.Node; @@ -171,9 +171,12 @@ public Node setNamedItem(final Node arg) throws DOMException { else { i = -1 - i; // Insert point (may be end of list) if (null == nodes) { - nodes = new ArrayList<>(5); + nodes = new SimpleArrayList<>(1); + nodes.add(arg); + } + else { + nodes.add(i, arg); } - nodes.add(i, arg); } return previous; } @@ -209,9 +212,12 @@ public Node setNamedItemNS(final Node arg) throws DOMException { else { i = -1 - i; // Insert point (may be end of list) if (null == nodes) { - nodes = new ArrayList<>(5); + nodes = new SimpleArrayList<>(1); + nodes.add(arg); + } + else { + nodes.add(i, arg); } - nodes.add(i, arg); } } return previous; @@ -278,7 +284,7 @@ protected void cloneContent(final NamedNodeMapImpl srcmap) { final int size = srcnodes.size(); if (size != 0) { if (nodes == null) { - nodes = new ArrayList<>(size); + nodes = new SimpleArrayList<>(size); } else { nodes.clear(); @@ -448,9 +454,12 @@ protected int addItem(final Node arg) { else { i = -1 - i; // Insert point (may be end of list) if (null == nodes) { - nodes = new ArrayList<>(5); + nodes = new SimpleArrayList<>(1); + nodes.add(arg); + } + else { + nodes.add(i, arg); } - nodes.add(i, arg); } } return i; From 83c89c209bc1ec0a81ba0b424d3c7cec9b835a00 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:17:54 +0100 Subject: [PATCH 14/18] Unnecessary initialization --- src/main/java/org/htmlunit/cyberneko/xerces/dom/AttrImpl.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/dom/AttrImpl.java b/src/main/java/org/htmlunit/cyberneko/xerces/dom/AttrImpl.java index c3f8cffa..2a69ea0d 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/dom/AttrImpl.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/dom/AttrImpl.java @@ -103,7 +103,7 @@ public class AttrImpl extends NodeImpl implements Attr, TypeInfo { protected static final String DTD_URI = "http://www.w3.org/TR/REC-xml"; /** This can either be a String or the first child node. */ - private Object value_ = null; + private Object value_; /** Attribute name. */ protected String name; From 3676800519c9c783bf9a2484cb27acf3bcdf9ab2 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:18:11 +0100 Subject: [PATCH 15/18] Use of simpler array list --- .../cyberneko/xerces/dom/AttributeMap.java | 25 +++++++++++++------ 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/htmlunit/cyberneko/xerces/dom/AttributeMap.java b/src/main/java/org/htmlunit/cyberneko/xerces/dom/AttributeMap.java index 57a7b105..e64046a4 100644 --- a/src/main/java/org/htmlunit/cyberneko/xerces/dom/AttributeMap.java +++ b/src/main/java/org/htmlunit/cyberneko/xerces/dom/AttributeMap.java @@ -14,9 +14,9 @@ */ package org.htmlunit.cyberneko.xerces.dom; -import java.util.ArrayList; import java.util.List; +import org.htmlunit.cyberneko.util.SimpleArrayList; import org.w3c.dom.DOMException; import org.w3c.dom.Node; @@ -95,9 +95,12 @@ public Node setNamedItem(final Node arg) throws DOMException { else { i = -1 - i; // Insert point (may be end of list) if (null == nodes) { - nodes = new ArrayList<>(5); + nodes = new SimpleArrayList<>(1); + nodes.add(arg); + } + else { + nodes.add(i, arg); } - nodes.add(i, arg); } // notify document @@ -170,9 +173,12 @@ public Node setNamedItemNS(final Node arg) throws DOMException { else { i = -1 - i; // Insert point (may be end of list) if (null == nodes) { - nodes = new ArrayList<>(5); + nodes = new SimpleArrayList<>(1); + nodes.add(arg); + } + else { + nodes.add(i, arg); } - nodes.add(i, arg); } } // changed(true); @@ -374,7 +380,7 @@ protected void cloneContent(final NamedNodeMapImpl srcmap) { final int size = srcnodes.size(); if (size != 0) { if (nodes == null) { - nodes = new ArrayList<>(size); + nodes = new SimpleArrayList<>(size); } else { nodes.clear(); @@ -438,9 +444,12 @@ protected final int addItem(final Node arg) { else { i = -1 - i; // Insert point (may be end of list) if (null == nodes) { - nodes = new ArrayList<>(5); + nodes = new SimpleArrayList<>(1); + nodes.add(arg); + } + else { + nodes.add(i, arg); } - nodes.add(i, arg); } } From 503749680e514e06c52cfcd9845c8a76a3b5ed79 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:20:35 +0100 Subject: [PATCH 16/18] Changed order of comparison Space is more typical, hence check for that earlier, some for line end instead of line feed, Linux and Mac use that and all server render that as default --- .../java/org/htmlunit/cyberneko/HTMLScanner.java | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java b/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java index 1c3fd035..63b08ab0 100644 --- a/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java +++ b/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java @@ -1165,8 +1165,14 @@ protected String scanName(final boolean strict) throws IOException { while (true) { while (fCurrentEntity.hasNext()) { final char c = fCurrentEntity.getNextChar(); - if ((strict && (!Character.isLetterOrDigit(c) && c != '-' && c != '.' && c != ':' && c != '_')) - || (!strict && (Character.isWhitespace(c) || c == '=' || c == '/' || c == '>'))) { + // this has been split up to cater to the needs of branch prediction + if (strict && (!Character.isLetterOrDigit(c) && c != '-' && c != '.' && c != ':' && c != '_')) { + fCurrentEntity.rewind(); + break; + } + // we check for the regular space first because isWhitespace is no inlineable and hence expensive + // regular space should be the norm as well as newlines + else if (!strict && (c == ' ' || c == '\n' || c == '=' || c == '/' || c == '>' || Character.isWhitespace(c))) { fCurrentEntity.rewind(); break; } @@ -2046,7 +2052,7 @@ private void scanUntilEndTag(final String tagName) throws IOException { break; } } - if (c == '\r' || c == '\n') { + if (c == '\n' || c == '\r') { fCurrentEntity.rewind(); final int newlines = skipNewlines(); for (int i = 0; i < newlines; i++) { From df4e3e397c037b8f7679c3bb76ca56db9e456990 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sat, 30 Dec 2023 14:23:10 +0100 Subject: [PATCH 17/18] Externalized input stream to be able to reuse, rewrite, and more easily test that It was planned to rewrite that, not done yet --- .../org/htmlunit/cyberneko/HTMLScanner.java | 212 +--------------- .../cyberneko/io/PlaybackInputStream.java | 238 ++++++++++++++++++ 2 files changed, 239 insertions(+), 211 deletions(-) create mode 100644 src/main/java/org/htmlunit/cyberneko/io/PlaybackInputStream.java diff --git a/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java b/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java index 63b08ab0..cb2a2747 100644 --- a/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java +++ b/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java @@ -16,7 +16,6 @@ package org.htmlunit.cyberneko; import java.io.EOFException; -import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -25,6 +24,7 @@ import java.net.URL; import java.util.Locale; +import org.htmlunit.cyberneko.io.PlaybackInputStream; import org.htmlunit.cyberneko.util.MiniStack; import org.htmlunit.cyberneko.xerces.util.EncodingMap; import org.htmlunit.cyberneko.xerces.util.NamespaceSupport; @@ -3351,216 +3351,6 @@ protected void scanCharacters(final XMLString buffer) throws IOException { } } - /** - * A playback input stream. This class has the ability to save the bytes read - * from the underlying input stream and play the bytes back later. This class is - * used by the HTML scanner to switch encodings when a <meta> tag is - * detected that specifies a different encoding. - *

- * If the encoding is changed, then the scanner calls the playback - * method and re-scans the beginning of the HTML document again. This should not - * be too much of a performance problem because the <meta> tag appears at - * the beginning of the document. - *

- * If the <body> tag is reached without playing back the bytes, then the - * buffer can be cleared by calling the clear method. This stops - * the buffering of bytes and allows the memory used by the buffer to be - * reclaimed. - *

- * Note: If the buffer is never played back or cleared, this - * input stream will continue to buffer the entire stream. Therefore, it is very - * important to use this stream correctly. - * - * @author Andy Clark - */ - private static final class PlaybackInputStream extends FilterInputStream { - - /** Set to true to debug playback. */ - private static final boolean DEBUG_PLAYBACK = false; - - /** Playback mode. */ - private boolean playback_; - - /** Buffer cleared. */ - private boolean cleared_; - - /** Encoding detected. */ - private boolean detected_; - - // buffer info - - /** Byte buffer. */ - private byte[] byteBuffer_ = new byte[1024]; - - /** Offset into byte buffer during playback. */ - private int byteOffset_; - - /** Length of bytes read into byte buffer. */ - private int byteLength_; - - /** Pushback offset. */ - private int pushbackOffset_; - - /** Pushback length. */ - private int pushbackLength_; - - // Constructor. - PlaybackInputStream(final InputStream in) { - super(in); - } - - // Detect encoding. - public void detectEncoding(final String[] encodings) throws IOException { - if (detected_) { - throw new IOException("Should not detect encoding twice."); - } - detected_ = true; - final int b1 = read(); - if (b1 == -1) { - return; - } - final int b2 = read(); - if (b2 == -1) { - pushbackLength_ = 1; - return; - } - // UTF-8 BOM: 0xEFBBBF - if (b1 == 0xEF && b2 == 0xBB) { - final int b3 = read(); - if (b3 == 0xBF) { - pushbackOffset_ = 3; - encodings[0] = "UTF-8"; - encodings[1] = "UTF8"; - return; - } - pushbackLength_ = 3; - } - // UTF-16 LE BOM: 0xFFFE - if (b1 == 0xFF && b2 == 0xFE) { - encodings[0] = "UTF-16"; - encodings[1] = "UnicodeLittleUnmarked"; - return; - } - // UTF-16 BE BOM: 0xFEFF - else if (b1 == 0xFE && b2 == 0xFF) { - encodings[0] = "UTF-16"; - encodings[1] = "UnicodeBigUnmarked"; - return; - } - // unknown - pushbackLength_ = 2; - } - - /** Playback buffer contents. */ - public void playback() { - playback_ = true; - } - - /** - * Clears the buffer. - *

- * Note: The buffer cannot be cleared during playback. - * Therefore, calling this method during playback will not do anything. However, - * the buffer will be cleared automatically at the end of playback. - */ - public void clear() { - if (!playback_) { - cleared_ = true; - byteBuffer_ = null; - } - } - - /** Read a byte. */ - @Override - public int read() throws IOException { - if (DEBUG_PLAYBACK) { - System.out.println("(read"); - } - if (pushbackOffset_ < pushbackLength_) { - return byteBuffer_[pushbackOffset_++]; - } - if (cleared_) { - return in.read(); - } - if (playback_) { - final int c = byteBuffer_[byteOffset_++]; - if (byteOffset_ == byteLength_) { - cleared_ = true; - byteBuffer_ = null; - } - if (DEBUG_PLAYBACK) { - System.out.println(")read -> " + (char) c); - } - return c; - } - final int c = in.read(); - if (c != -1) { - if (byteLength_ == byteBuffer_.length) { - final byte[] newarray = new byte[byteLength_ + 1024]; - System.arraycopy(byteBuffer_, 0, newarray, 0, byteLength_); - byteBuffer_ = newarray; - } - byteBuffer_[byteLength_++] = (byte) c; - } - if (DEBUG_PLAYBACK) { - System.out.println(")read -> " + (char) c); - } - return c; - } - - /** Read an array of bytes. */ - @Override - public int read(final byte[] array) throws IOException { - return read(array, 0, array.length); - } - - /** Read an array of bytes. */ - @Override - public int read(final byte[] array, final int offset, int length) throws IOException { - if (DEBUG_PLAYBACK) { - System.out.println(")read(" + offset + ',' + length + ')'); - } - if (pushbackOffset_ < pushbackLength_) { - int count = pushbackLength_ - pushbackOffset_; - if (count > length) { - count = length; - } - System.arraycopy(byteBuffer_, pushbackOffset_, array, offset, count); - pushbackOffset_ += count; - return count; - } - if (cleared_) { - return in.read(array, offset, length); - } - if (playback_) { - if (byteOffset_ + length > byteLength_) { - length = byteLength_ - byteOffset_; - } - System.arraycopy(byteBuffer_, byteOffset_, array, offset, length); - byteOffset_ += length; - if (byteOffset_ == byteLength_) { - cleared_ = true; - byteBuffer_ = null; - } - return length; - } - final int count = in.read(array, offset, length); - if (count != -1) { - if (byteLength_ + count > byteBuffer_.length) { - final byte[] newarray = new byte[byteLength_ + count + 512]; - System.arraycopy(byteBuffer_, 0, newarray, 0, byteLength_); - byteBuffer_ = newarray; - } - System.arraycopy(array, offset, byteBuffer_, byteLength_, count); - byteLength_ += count; - } - if (DEBUG_PLAYBACK) { - System.out.println(")read(" + offset + ',' + length + ") -> " + count); - } - return count; - } - } - /** * Location infoset item. * diff --git a/src/main/java/org/htmlunit/cyberneko/io/PlaybackInputStream.java b/src/main/java/org/htmlunit/cyberneko/io/PlaybackInputStream.java new file mode 100644 index 00000000..11709b05 --- /dev/null +++ b/src/main/java/org/htmlunit/cyberneko/io/PlaybackInputStream.java @@ -0,0 +1,238 @@ +/* + * Copyright 2017-2023 Ronald Brill + * Copyright 2023 René Schwietzke + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * https://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.htmlunit.cyberneko.io; + +import java.io.IOException; +import java.io.InputStream; + +/** + * A playback input stream. This class has the ability to save the bytes read + * from the underlying input stream and play the bytes back later. This class is + * used by the HTML scanner to switch encodings when a <meta> tag is + * detected that specifies a different encoding. + *

+ * If the encoding is changed, then the scanner calls the playback + * method and re-scans the beginning of the HTML document again. This should not + * be too much of a performance problem because the <meta> tag appears at + * the beginning of the document. + *

+ * If the <body> tag is reached without playing back the bytes, then the + * buffer can be cleared by calling the clear method. This stops + * the buffering of bytes and allows the memory used by the buffer to be + * reclaimed. + *

+ * Note: If the buffer is never played back or cleared, this + * input stream will continue to buffer the entire stream. Therefore, it is very + * important to use this stream correctly. + * + * @author Andy Clark + */ +public final class PlaybackInputStream extends InputStream { + + /** Set to true to debug playback. */ + private static final boolean DEBUG_PLAYBACK = false; + + /** Playback mode. */ + private boolean playback_ = false; + + /** Buffer cleared. */ + private boolean cleared_ = false; + + /** Encoding detected. */ + private boolean detected_ = false; + + // buffer info + + /** Byte buffer. */ + private byte[] byteBuffer_ = new byte[1024]; + + /** Offset into byte buffer during playback. */ + private int byteOffset_ = 0; + + /** Length of bytes read into byte buffer. */ + private int byteLength_ = 0; + + /** Pushback offset. */ + private int pushbackOffset_ = 0; + + /** Pushback length. */ + private int pushbackLength_ = 0; + + /** Our inputstream */ + private final InputStream in; + + // Constructor. + public PlaybackInputStream(final InputStream in) { + this.in = in; + } + + // Detect encoding. + public void detectEncoding(final String[] encodings) throws IOException { + if (detected_) { + throw new IOException("Should not detect encoding twice."); + } + detected_ = true; + final int b1 = read(); + if (b1 == -1) { + return; + } + final int b2 = read(); + if (b2 == -1) { + pushbackLength_ = 1; + return; + } + // UTF-8 BOM: 0xEFBBBF + if (b1 == 0xEF && b2 == 0xBB) { + final int b3 = read(); + if (b3 == 0xBF) { + pushbackOffset_ = 3; + encodings[0] = "UTF-8"; + encodings[1] = "UTF8"; + return; + } + pushbackLength_ = 3; + } + // UTF-16 LE BOM: 0xFFFE + if (b1 == 0xFF && b2 == 0xFE) { + encodings[0] = "UTF-16"; + encodings[1] = "UnicodeLittleUnmarked"; + return; + } + // UTF-16 BE BOM: 0xFEFF + else if (b1 == 0xFE && b2 == 0xFF) { + encodings[0] = "UTF-16"; + encodings[1] = "UnicodeBigUnmarked"; + return; + } + // unknown + pushbackLength_ = 2; + } + + /** Playback buffer contents. */ + public void playback() { + playback_ = true; + } + + /** + * Clears the buffer. + *

+ * Note: The buffer cannot be cleared during playback. + * Therefore, calling this method during playback will not do anything. However, + * the buffer will be cleared automatically at the end of playback. + */ + public void clear() { + if (!playback_) { + cleared_ = true; + byteBuffer_ = null; + } + } + + // + // InputStream methods + // + + /** Read a byte. */ + @Override + public int read() throws IOException { + if (DEBUG_PLAYBACK) { + System.out.println("(read"); + } + // this should be the normal state, hence we do that first + if (cleared_) { + return in.read(); + } + if (pushbackOffset_ < pushbackLength_) { + return byteBuffer_[pushbackOffset_++]; + } + if (playback_) { + final int c = byteBuffer_[byteOffset_++]; + if (byteOffset_ == byteLength_) { + cleared_ = true; + byteBuffer_ = null; + } + if (DEBUG_PLAYBACK) { + System.out.println(")read -> " + (char) c); + } + return c; + } + final int c = in.read(); + if (c != -1) { + if (byteLength_ == byteBuffer_.length) { + final byte[] newarray = new byte[byteLength_ + 1024]; + System.arraycopy(byteBuffer_, 0, newarray, 0, byteLength_); + byteBuffer_ = newarray; + } + byteBuffer_[byteLength_++] = (byte) c; + } + if (DEBUG_PLAYBACK) { + System.out.println(")read -> " + (char) c); + } + return c; + } + + /** Read an array of bytes. */ + @Override + public int read(final byte[] array) throws IOException { + return read(array, 0, array.length); + } + + /** Read an array of bytes. */ + @Override + public int read(final byte[] array, final int offset, int length) throws IOException { + if (DEBUG_PLAYBACK) { + System.out.println(")read(" + offset + ',' + length + ')'); + } + // this should be the normal state, hence we do that first + if (cleared_) { + return in.read(array, offset, length); + } + if (pushbackOffset_ < pushbackLength_) { + int count = pushbackLength_ - pushbackOffset_; + if (count > length) { + count = length; + } + System.arraycopy(byteBuffer_, pushbackOffset_, array, offset, count); + pushbackOffset_ += count; + return count; + } + if (playback_) { + if (byteOffset_ + length > byteLength_) { + length = byteLength_ - byteOffset_; + } + System.arraycopy(byteBuffer_, byteOffset_, array, offset, length); + byteOffset_ += length; + if (byteOffset_ == byteLength_) { + cleared_ = true; + byteBuffer_ = null; + } + return length; + } + final int count = in.read(array, offset, length); + if (count != -1) { + if (byteLength_ + count > byteBuffer_.length) { + final byte[] newarray = new byte[byteLength_ + count + 512]; + System.arraycopy(byteBuffer_, 0, newarray, 0, byteLength_); + byteBuffer_ = newarray; + } + System.arraycopy(array, offset, byteBuffer_, byteLength_, count); + byteLength_ += count; + } + if (DEBUG_PLAYBACK) { + System.out.println(")read(" + offset + ',' + length + ") -> " + count); + } + return count; + } +} From 56eb2008fada115ebf2966e6a7ba8dd6b8aa0e68 Mon Sep 17 00:00:00 2001 From: Rene Schwietzke Date: Sun, 31 Dec 2023 12:03:57 +0100 Subject: [PATCH 18/18] Fixed remaining merge errors --- .../org/htmlunit/cyberneko/HTMLScanner.java | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java b/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java index cb2a2747..534907a4 100644 --- a/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java +++ b/src/main/java/org/htmlunit/cyberneko/HTMLScanner.java @@ -34,9 +34,9 @@ import org.htmlunit.cyberneko.xerces.xni.NamespaceContext; import org.htmlunit.cyberneko.xerces.xni.QName; import org.htmlunit.cyberneko.xerces.xni.XMLAttributes; -import org.htmlunit.cyberneko.xerces.xni.XMLString; import org.htmlunit.cyberneko.xerces.xni.XMLDocumentHandler; import org.htmlunit.cyberneko.xerces.xni.XMLLocator; +import org.htmlunit.cyberneko.xerces.xni.XMLString; import org.htmlunit.cyberneko.xerces.xni.XNIException; import org.htmlunit.cyberneko.xerces.xni.parser.XMLComponentManager; import org.htmlunit.cyberneko.xerces.xni.parser.XMLConfigurationException; @@ -2356,7 +2356,7 @@ else if (c != '>') { } // Scans markup content. - protected boolean scanMarkupContent(final XMLString buffer, final char cend) throws IOException { + protected boolean scanCommentContent(final XMLString buffer) throws IOException { int c; OUTER: while (true) { c = fCurrentEntity.read(); @@ -2384,7 +2384,7 @@ protected boolean scanMarkupContent(final XMLString buffer, final char cend) thr break OUTER; } if (count < 2) { - xmlString.append('-'); + buffer.append('-'); fCurrentEntity.rewind(); continue; } @@ -2400,28 +2400,28 @@ protected boolean scanMarkupContent(final XMLString buffer, final char cend) thr if (c == '>') { for (int i = 0; i < count - 2; i++) { - xmlString.append('-'); + buffer.append('-'); } break; } for (int i = 0; i < count; i++) { - xmlString.append('-'); + buffer.append('-'); } - xmlString.append('!'); + buffer.append('!'); fCurrentEntity.rewind(); continue; } if (c == '>') { for (int i = 0; i < count - 2; i++) { - xmlString.append('-'); + buffer.append('-'); } break; } for (int i = 0; i < count; i++) { - xmlString.append('-'); + buffer.append('-'); } fCurrentEntity.rewind(); continue; @@ -2430,11 +2430,18 @@ else if (c == '\n' || c == '\r') { fCurrentEntity.rewind(); final int newlines = skipNewlines(); for (int i = 0; i < newlines; i++) { - xmlString.append('\n'); + buffer.append('\n'); } continue; } - appendChar(xmlString, c, null); + try { + buffer.appendCodePoint(c); + } + catch (IllegalArgumentException e) { + if (fReportErrors_) { + fErrorReporter.reportError("HTML1005", new Object[] {"&#" + c + ';'}); + } + } } return c == -1; @@ -2469,20 +2476,19 @@ protected boolean scanCDataContent(final XMLString xmlString) throws IOException break OUTER; } if (count < 2) { - buffer.append(cend); - // if (c != -1) { + xmlString.append(']'); fCurrentEntity.rewind(); continue; } if (c != '>') { for (int i = 0; i < count; i++) { - buffer.append(cend); + xmlString.append(']'); } fCurrentEntity.rewind(); continue; } for (int i = 0; i < count - 2; i++) { - buffer.append(cend); + xmlString.append(']'); } break; } @@ -2494,12 +2500,12 @@ else if (c == '\n' || c == '\r') { fCurrentEntity.rewind(); final int newlines = skipNewlines(); for (int i = 0; i < newlines; i++) { - buffer.append('\n'); + xmlString.append('\n'); } continue; } try { - buffer.appendCodePoint(c); + xmlString.appendCodePoint(c); } catch (IllegalArgumentException e) { if (fReportErrors_) {